From 73f552aec63842a6d9a6b9653529196c7d6de3b9 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 24 Jan 2024 15:34:23 -0300 Subject: [PATCH 001/113] add refactored LPS code --- .gitignore | 1 + cmd/application/lps/application.go | 154 + cmd/application/main.go | 45 + go.mod | 12 +- go.sum | 13 + internal/adapters/alerting/ses.go | 40 + .../adapters/dataproviders/bitcoin/common.go | 137 + .../adapters/dataproviders/bitcoin/rpc.go | 172 + .../adapters/dataproviders/bitcoin/wallet.go | 184 + .../adapters/dataproviders/configuration.go | 42 + .../dataproviders/database/mongo/common.go | 76 + .../dataproviders/database/mongo/mongo.go | 43 + .../dataproviders/database/mongo/pegin.go | 154 + .../dataproviders/database/mongo/pegout.go | 220 + internal/adapters/dataproviders/event.go | 54 + .../dataproviders/liquidity_provider.go | 255 + .../dataproviders/rootstock/account.go | 53 + .../rootstock/bindings/bridge.go | 1831 +++++++ .../dataproviders/rootstock/bindings/lbc.go | 4638 +++++++++++++++++ .../dataproviders/rootstock/bridge.go | 179 + .../dataproviders/rootstock/common.go | 100 + .../dataproviders/rootstock/federation.go | 237 + .../dataproviders/rootstock/fee_collector.go | 27 + .../adapters/dataproviders/rootstock/lbc.go | 637 +++ .../adapters/dataproviders/rootstock/rpc.go | 166 + .../dataproviders/rootstock/wallet.go | 77 + internal/adapters/entrypoints/rest/common.go | 90 + .../rest/handlers/accept_pegin_quote.go | 44 + .../rest/handlers/accept_pegout_quote.go | 44 + .../rest/handlers/add_pegin_collateral.go | 36 + .../rest/handlers/add_pegout_collateral.go | 36 + .../rest/handlers/change_status.go | 28 + .../rest/handlers/get_pegin_collateral.go | 20 + .../rest/handlers/get_pegin_quote.go | 60 + .../rest/handlers/get_pegout_collateral.go | 20 + .../rest/handlers/get_pegout_quote.go | 55 + .../rest/handlers/get_providers.go | 34 + .../rest/handlers/get_user_deposits.go | 40 + .../entrypoints/rest/handlers/health.go | 23 + .../entrypoints/rest/handlers/options.go | 9 + .../rest/handlers/provider_details.go | 35 + .../entrypoints/rest/handlers/resignation.go | 19 + .../handlers/withdraw_pegin_collateral.go | 24 + .../handlers/withdraw_pegout_collateral.go | 24 + .../entrypoints/rest/middlewares/captcha.go | 80 + .../entrypoints/rest/middlewares/cors.go | 18 + .../entrypoints/rest/registry/registry.go | 27 + .../entrypoints/rest/routes/routes.go | 53 + .../entrypoints/rest/server/server.go | 71 + .../adapters/entrypoints/watcher/common.go | 23 + .../entrypoints/watcher/liquidity_check.go | 49 + .../watcher/pegin_bridge_watcher.go | 138 + .../watcher/pegin_btc_deposit_watcher.go | 169 + .../entrypoints/watcher/pegout_btc_watcher.go | 138 + .../entrypoints/watcher/pegout_rsk_watcher.go | 216 + .../entrypoints/watcher/penalization_alert.go | 65 + .../entrypoints/watcher/quote_cleaner.go | 60 + internal/configuration/bootstrap/bitcoin.go | 73 + internal/configuration/bootstrap/database.go | 18 + internal/configuration/bootstrap/rootstock.go | 63 + .../environment/configuration.go | 34 + .../configuration/environment/environment.go | 101 + .../environment/environment_reader.go | 124 + internal/configuration/environment/mutex.go | 42 + internal/configuration/environment/secrets.go | 46 + .../configuration/registry/alert_sender.go | 20 + internal/configuration/registry/bitcoin.go | 25 + internal/configuration/registry/database.go | 20 + internal/configuration/registry/event_bus.go | 10 + .../registry/liquidity_provider.go | 20 + internal/configuration/registry/rootstock.go | 58 + internal/configuration/registry/usecase.go | 241 + internal/configuration/registry/watcher.go | 71 + internal/entities/alerts.go | 7 + internal/entities/blockchain/bitcoin.go | 73 + internal/entities/blockchain/lbc.go | 100 + internal/entities/blockchain/rootstock.go | 94 + internal/entities/common.go | 22 + internal/entities/event.go | 45 + internal/entities/liquidity_provider.go | 96 + internal/entities/quote/common.go | 6 + internal/entities/quote/pegin_quote.go | 105 + internal/entities/quote/pegout_quote.go | 127 + internal/entities/wei.go | 133 + internal/entities/wei_test.go | 429 ++ internal/usecases/common.go | 115 + internal/usecases/health.go | 64 + .../liquidity_provider/change_status.go | 27 + .../liquidity_provider/check_liquidity.go | 60 + .../usecases/liquidity_provider/common.go | 33 + .../liquidity_provider/get_providers.go | 24 + .../liquidity_provider/penalization_alert.go | 34 + .../liquidity_provider/provider_detail.go | 61 + .../liquidity_provider/registration.go | 126 + .../usecases/liquidity_provider/resign.go | 30 + internal/usecases/pegin/accept_pegin_quote.go | 171 + internal/usecases/pegin/add_collateral.go | 38 + internal/usecases/pegin/call_for_user.go | 147 + internal/usecases/pegin/common.go | 5 + internal/usecases/pegin/expire_quote.go | 24 + internal/usecases/pegin/get_collateral.go | 26 + internal/usecases/pegin/get_pegin_quote.go | 180 + internal/usecases/pegin/register_pegin.go | 139 + .../usecases/pegin/withdraw_collateral.go | 26 + .../usecases/pegout/accept_pegout_quote.go | 118 + internal/usecases/pegout/add_collateral.go | 38 + internal/usecases/pegout/expire_quote.go | 24 + internal/usecases/pegout/get_collateral.go | 26 + internal/usecases/pegout/get_pegout_quote.go | 185 + internal/usecases/pegout/get_user_deposits.go | 24 + .../usecases/pegout/init_deposit_cache.go | 36 + internal/usecases/pegout/refund_pegout.go | 176 + internal/usecases/pegout/send_pegout.go | 141 + .../usecases/pegout/withdraw_collateral.go | 26 + internal/usecases/watcher/clean_expired.go | 48 + .../watcher/get_watched_pegin_quote.go | 55 + .../watcher/get_watched_pegout_quote.go | 63 + .../usecases/watcher/update_pegout_deposit.go | 34 + pkg/common.go | 28 + pkg/liquidity_provider.go | 27 + pkg/pegin.go | 71 + pkg/pegout.go | 79 + sample-config.env | 61 +- 123 files changed, 16055 insertions(+), 33 deletions(-) create mode 100644 cmd/application/lps/application.go create mode 100644 cmd/application/main.go create mode 100644 internal/adapters/alerting/ses.go create mode 100644 internal/adapters/dataproviders/bitcoin/common.go create mode 100644 internal/adapters/dataproviders/bitcoin/rpc.go create mode 100644 internal/adapters/dataproviders/bitcoin/wallet.go create mode 100644 internal/adapters/dataproviders/configuration.go create mode 100644 internal/adapters/dataproviders/database/mongo/common.go create mode 100644 internal/adapters/dataproviders/database/mongo/mongo.go create mode 100644 internal/adapters/dataproviders/database/mongo/pegin.go create mode 100644 internal/adapters/dataproviders/database/mongo/pegout.go create mode 100644 internal/adapters/dataproviders/event.go create mode 100644 internal/adapters/dataproviders/liquidity_provider.go create mode 100644 internal/adapters/dataproviders/rootstock/account.go create mode 100644 internal/adapters/dataproviders/rootstock/bindings/bridge.go create mode 100644 internal/adapters/dataproviders/rootstock/bindings/lbc.go create mode 100644 internal/adapters/dataproviders/rootstock/bridge.go create mode 100644 internal/adapters/dataproviders/rootstock/common.go create mode 100644 internal/adapters/dataproviders/rootstock/federation.go create mode 100644 internal/adapters/dataproviders/rootstock/fee_collector.go create mode 100644 internal/adapters/dataproviders/rootstock/lbc.go create mode 100644 internal/adapters/dataproviders/rootstock/rpc.go create mode 100644 internal/adapters/dataproviders/rootstock/wallet.go create mode 100644 internal/adapters/entrypoints/rest/common.go create mode 100644 internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go create mode 100644 internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go create mode 100644 internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go create mode 100644 internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go create mode 100644 internal/adapters/entrypoints/rest/handlers/change_status.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_providers.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_user_deposits.go create mode 100644 internal/adapters/entrypoints/rest/handlers/health.go create mode 100644 internal/adapters/entrypoints/rest/handlers/options.go create mode 100644 internal/adapters/entrypoints/rest/handlers/provider_details.go create mode 100644 internal/adapters/entrypoints/rest/handlers/resignation.go create mode 100644 internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go create mode 100644 internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go create mode 100644 internal/adapters/entrypoints/rest/middlewares/captcha.go create mode 100644 internal/adapters/entrypoints/rest/middlewares/cors.go create mode 100644 internal/adapters/entrypoints/rest/registry/registry.go create mode 100644 internal/adapters/entrypoints/rest/routes/routes.go create mode 100644 internal/adapters/entrypoints/rest/server/server.go create mode 100644 internal/adapters/entrypoints/watcher/common.go create mode 100644 internal/adapters/entrypoints/watcher/liquidity_check.go create mode 100644 internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go create mode 100644 internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go create mode 100644 internal/adapters/entrypoints/watcher/pegout_btc_watcher.go create mode 100644 internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go create mode 100644 internal/adapters/entrypoints/watcher/penalization_alert.go create mode 100644 internal/adapters/entrypoints/watcher/quote_cleaner.go create mode 100644 internal/configuration/bootstrap/bitcoin.go create mode 100644 internal/configuration/bootstrap/database.go create mode 100644 internal/configuration/bootstrap/rootstock.go create mode 100644 internal/configuration/environment/configuration.go create mode 100644 internal/configuration/environment/environment.go create mode 100644 internal/configuration/environment/environment_reader.go create mode 100644 internal/configuration/environment/mutex.go create mode 100644 internal/configuration/environment/secrets.go create mode 100644 internal/configuration/registry/alert_sender.go create mode 100644 internal/configuration/registry/bitcoin.go create mode 100644 internal/configuration/registry/database.go create mode 100644 internal/configuration/registry/event_bus.go create mode 100644 internal/configuration/registry/liquidity_provider.go create mode 100644 internal/configuration/registry/rootstock.go create mode 100644 internal/configuration/registry/usecase.go create mode 100644 internal/configuration/registry/watcher.go create mode 100644 internal/entities/alerts.go create mode 100644 internal/entities/blockchain/bitcoin.go create mode 100644 internal/entities/blockchain/lbc.go create mode 100644 internal/entities/blockchain/rootstock.go create mode 100644 internal/entities/common.go create mode 100644 internal/entities/event.go create mode 100644 internal/entities/liquidity_provider.go create mode 100644 internal/entities/quote/common.go create mode 100644 internal/entities/quote/pegin_quote.go create mode 100644 internal/entities/quote/pegout_quote.go create mode 100644 internal/entities/wei.go create mode 100644 internal/entities/wei_test.go create mode 100644 internal/usecases/common.go create mode 100644 internal/usecases/health.go create mode 100644 internal/usecases/liquidity_provider/change_status.go create mode 100644 internal/usecases/liquidity_provider/check_liquidity.go create mode 100644 internal/usecases/liquidity_provider/common.go create mode 100644 internal/usecases/liquidity_provider/get_providers.go create mode 100644 internal/usecases/liquidity_provider/penalization_alert.go create mode 100644 internal/usecases/liquidity_provider/provider_detail.go create mode 100644 internal/usecases/liquidity_provider/registration.go create mode 100644 internal/usecases/liquidity_provider/resign.go create mode 100644 internal/usecases/pegin/accept_pegin_quote.go create mode 100644 internal/usecases/pegin/add_collateral.go create mode 100644 internal/usecases/pegin/call_for_user.go create mode 100644 internal/usecases/pegin/common.go create mode 100644 internal/usecases/pegin/expire_quote.go create mode 100644 internal/usecases/pegin/get_collateral.go create mode 100644 internal/usecases/pegin/get_pegin_quote.go create mode 100644 internal/usecases/pegin/register_pegin.go create mode 100644 internal/usecases/pegin/withdraw_collateral.go create mode 100644 internal/usecases/pegout/accept_pegout_quote.go create mode 100644 internal/usecases/pegout/add_collateral.go create mode 100644 internal/usecases/pegout/expire_quote.go create mode 100644 internal/usecases/pegout/get_collateral.go create mode 100644 internal/usecases/pegout/get_pegout_quote.go create mode 100644 internal/usecases/pegout/get_user_deposits.go create mode 100644 internal/usecases/pegout/init_deposit_cache.go create mode 100644 internal/usecases/pegout/refund_pegout.go create mode 100644 internal/usecases/pegout/send_pegout.go create mode 100644 internal/usecases/pegout/withdraw_collateral.go create mode 100644 internal/usecases/watcher/clean_expired.go create mode 100644 internal/usecases/watcher/get_watched_pegin_quote.go create mode 100644 internal/usecases/watcher/get_watched_pegout_quote.go create mode 100644 internal/usecases/watcher/update_pegout_deposit.go create mode 100644 pkg/common.go create mode 100644 pkg/liquidity_provider.go create mode 100644 pkg/pegin.go create mode 100644 pkg/pegout.go diff --git a/.gitignore b/.gitignore index f3d581f8..2666b887 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ integration/integration-test.config.json integration/geth_keystore /docker-compose/lbc-deployer/liquidity-bridge-contract/ +keystore/ diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go new file mode 100644 index 00000000..54201a16 --- /dev/null +++ b/cmd/application/lps/application.go @@ -0,0 +1,154 @@ +package lps + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/watcher" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/bootstrap" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/registry" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + log "github.com/sirupsen/logrus" + "time" +) + +const watcherPreparationTimeout = 3 * time.Second + +type Application struct { + env environment.Environment + secrets environment.ApplicationSecrets + liquidityProvider *dataproviders.LocalLiquidityProvider + useCaseRegistry *registry.UseCaseRegistry + watcherRegistry *registry.WatcherRegistry + rskRegistry *registry.Rootstock + btcRegistry *registry.Bitcoin + dbRegistry *registry.Database + eventBus entities.EventBus + runningServices []entities.Closeable +} + +func NewApplication(initCtx context.Context, env environment.Environment, secrets environment.ApplicationSecrets) *Application { + btcConnection, err := bootstrap.Bitcoin(env.Btc) + if err != nil { + log.Fatal("Error connecting to BTC node:", err) + } + btcRegistry, err := registry.NewBitcoinRegistry(env.Btc, secrets, btcConnection) + if err != nil { + log.Fatal("Error creating BTC registry:", err) + } + + connection, err := bootstrap.Mongo(initCtx, env.Mongo) + if err != nil { + log.Fatal("Error connecting to MongoDB:", err) + } + dbRegistry := registry.NewDatabaseRegistry(connection) + + account, err := bootstrap.RootstockAccount(env.Rsk, secrets) + if err != nil { + log.Fatal("Error connecting to RSK account:", err) + } + rskClient, err := bootstrap.Rootstock(initCtx, env.Rsk) + if err != nil { + log.Fatal("Error connecting to RSK node:", err) + } + rootstockRegistry, err := registry.NewRootstockRegistry(env.Rsk, rskClient, account, btcConnection) + if err != nil { + log.Fatal("Error creating Rootstock registry:", err) + } + + config := environment.ConfigurationFromEnv(env) + liquidityProvider := registry.NewLiquidityProvider(config, dbRegistry, rootstockRegistry, btcRegistry) + alertSender := registry.NewAlertSender(env) + eventBus := registry.NewEventBus() + mutexes := environment.NewApplicationMutexes() + + useCaseRegistry := registry.NewUseCaseRegistry(env, rootstockRegistry, btcRegistry, dbRegistry, liquidityProvider, eventBus, alertSender, mutexes) + watcherRegistry := registry.NewWatcherRegistry(env, useCaseRegistry, rootstockRegistry, btcRegistry, liquidityProvider, eventBus) + + return &Application{ + env: env, + secrets: secrets, + liquidityProvider: liquidityProvider, + useCaseRegistry: useCaseRegistry, + rskRegistry: rootstockRegistry, + btcRegistry: btcRegistry, + dbRegistry: dbRegistry, + eventBus: eventBus, + watcherRegistry: watcherRegistry, + runningServices: make([]entities.Closeable, 0), + } +} + +func (app *Application) Run(env environment.Environment, logLevel log.Level) { + app.addRunningService(app.dbRegistry.Connection) + app.addRunningService(app.rskRegistry.Client) + app.addRunningService(app.btcRegistry.Connection) + app.addRunningService(app.eventBus) + + registerParams := blockchain.NewProviderRegistrationParams(app.env.Provider.Name, app.env.Provider.ApiBaseUrl, true, app.env.Provider.ProviderType) + id, err := app.useCaseRegistry.GetRegistrationUseCase().Run(registerParams) + if errors.Is(err, usecases.AlreadyRegisteredError) { + log.Info("Provider already registered") + } else if err != nil { + log.Fatal("Error registering provider: ", err) + } else { + log.Info("Provider registered with ID ", id) + } + + watchers, err := app.prepareWatchers() + if err != nil { + log.Fatal("Error initializing watchers: ", err) + } + for _, w := range watchers { + go w.Start() + } + + applicationServer, done := server.NewServer(env, app.useCaseRegistry, logLevel) + app.addRunningService(applicationServer) + go applicationServer.Start() + <-done +} + +func (app *Application) addRunningService(service entities.Closeable) { + app.runningServices = append(app.runningServices, service) +} + +func (app *Application) prepareWatchers() ([]watcher.Watcher, error) { + var err error + watchers := []watcher.Watcher{ + app.watcherRegistry.PeginDepositAddressWatcher, + app.watcherRegistry.PeginBridgeWatcher, + app.watcherRegistry.QuoteCleanerWatcher, + app.watcherRegistry.PegoutRskDepositWatcher, + app.watcherRegistry.PegoutBtcTransferWatcher, + app.watcherRegistry.LiquidityCheckWatcher, + app.watcherRegistry.PenalizationAlertWatcher, + } + + ctx, cancel := context.WithTimeout(context.Background(), watcherPreparationTimeout) + defer cancel() + for _, w := range watchers { + if err = w.Prepare(ctx); err != nil { + return nil, err + } + app.addRunningService(w) + } + return watchers, nil +} + +func (app *Application) Shutdown() { + log.Info("Starting graceful shutdown...") + numberOfServices := len(app.runningServices) + closeChannel := make(chan bool, numberOfServices) + for _, service := range app.runningServices { + service.Shutdown(closeChannel) + } + for i := 0; i < numberOfServices; i++ { + <-closeChannel + } + log.Info("Shutdown completed") +} diff --git a/cmd/application/main.go b/cmd/application/main.go new file mode 100644 index 00000000..b7a23a3f --- /dev/null +++ b/cmd/application/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/cmd/application/lps" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" + "os" + "path" + "time" +) + +const bootstrapTimeout = 10 * time.Second + +func main() { + var err error + var file *os.File + initCtx, cancel := context.WithTimeout(context.Background(), bootstrapTimeout) + + env := environment.LoadEnv() + secrets := environment.LoadSecrets(initCtx, *env) + + logLevel, err := log.ParseLevel(env.LogLevel) + if err != nil { + log.Fatal("Error parsing log level:", err) + } + log.SetLevel(logLevel) + + if env.LogFile != "" { + if err = os.MkdirAll(path.Dir(env.LogFile), 0700); err != nil { + log.Fatal(fmt.Sprintf("cannot create log file path (%v): ", env.LogFile), err) + } + if file, err = os.OpenFile(env.LogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600); err != nil { + log.Fatal(fmt.Sprintf("cannot open log file %v: ", env.LogFile), err) + } else { + log.SetOutput(file) + } + } + + app := lps.NewApplication(initCtx, *env, *secrets) + cancel() + app.Run(*env, logLevel) + app.Shutdown() +} diff --git a/go.mod b/go.mod index 5638b8bc..549f6c34 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/rsksmart/liquidity-provider-server -go 1.19 +go 1.21.6 require ( github.com/aws/aws-sdk-go-v2 v1.20.2 @@ -12,14 +12,14 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 github.com/btcsuite/btcutil v1.0.2 github.com/ethereum/go-ethereum v1.11.6 - github.com/go-playground/validator/v10 v10.13.0 - github.com/gorilla/handlers v1.5.1 - github.com/gorilla/mux v1.8.0 + github.com/go-playground/validator/v10 v10.17.0 + github.com/gorilla/handlers v1.5.2 + github.com/gorilla/mux v1.8.1 github.com/jmoiron/sqlx v1.3.5 github.com/rsksmart/liquidity-provider v0.0.0-20231002161316-675248a10604 github.com/sirupsen/logrus v1.9.1 github.com/stretchr/testify v1.8.3 - go.mongodb.org/mongo-driver v1.11.6 + go.mongodb.org/mongo-driver v1.13.1 golang.org/x/term v0.8.0 modernc.org/sqlite v1.22.1 ) @@ -46,6 +46,7 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect @@ -75,6 +76,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.9.0 // indirect golang.org/x/mod v0.10.0 // indirect + golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.2.0 // indirect golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect diff --git a/go.sum b/go.sum index 729dc4e1..27df21ba 100644 --- a/go.sum +++ b/go.sum @@ -189,6 +189,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -215,6 +217,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= +github.com/go-playground/validator/v10 v10.17.0 h1:SmVVlfAOtlZncTxRuinDPomC2DkXJ4E5T9gDA0AIH74= +github.com/go-playground/validator/v10 v10.17.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= @@ -284,8 +288,12 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -539,6 +547,8 @@ github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPR github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.mongodb.org/mongo-driver v1.11.6 h1:XM7G6PjiGAO5betLF13BIa5TlLUUE3uJ/2Ox3Lz1K+o= go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY= +go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -620,6 +630,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -699,6 +711,7 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/internal/adapters/alerting/ses.go b/internal/adapters/alerting/ses.go new file mode 100644 index 00000000..740e8eaf --- /dev/null +++ b/internal/adapters/alerting/ses.go @@ -0,0 +1,40 @@ +package alerting + +import ( + "context" + "github.com/aws/aws-sdk-go-v2/service/ses" + sesTypes "github.com/aws/aws-sdk-go-v2/service/ses/types" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + log "github.com/sirupsen/logrus" +) + +type SesAlertSender struct { + sesClient *ses.Client + from string +} + +func NewSesAlertSender(sesClient *ses.Client, from string) entities.AlertSender { + return &SesAlertSender{sesClient: sesClient, from: from} +} + +func (sender *SesAlertSender) SendAlert(ctx context.Context, subject, body, recipient string) error { + log.Info("Sending alert to liquidity provider") + result, err := sender.sesClient.SendEmail(ctx, &ses.SendEmailInput{ + Destination: &sesTypes.Destination{ + ToAddresses: []string{recipient}, + }, + Message: &sesTypes.Message{ + Body: &sesTypes.Body{ + Text: &sesTypes.Content{Data: &body}, + }, + Subject: &sesTypes.Content{Data: &subject}, + }, + Source: &sender.from, + }) + if err != nil { + return err + } + log.Info("Alert sent") + log.Debugf("Alert sent with ID: %s\n", *result.MessageId) + return nil +} diff --git a/internal/adapters/dataproviders/bitcoin/common.go b/internal/adapters/dataproviders/bitcoin/common.go new file mode 100644 index 00000000..cedb128a --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/common.go @@ -0,0 +1,137 @@ +package bitcoin + +import ( + "bytes" + "context" + "encoding/binary" + "fmt" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/base58" + "github.com/btcsuite/btcd/btcutil/bloom" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" + "math/big" +) + +const ( + BtcToSatoshi = 100000000 +) + +type Connection struct { + NetworkParams *chaincfg.Params + client *rpcclient.Client +} + +func NewConnection(networkParams *chaincfg.Params, client *rpcclient.Client) *Connection { + return &Connection{NetworkParams: networkParams, client: client} +} + +func (c *Connection) Shutdown(endChannel chan<- bool) { + c.client.Disconnect() + endChannel <- true + log.Debug("Disconnected from BTC node") +} + +func (c *Connection) CheckConnection(ctx context.Context) bool { + err := c.client.Ping() + if err != nil { + log.Error("Error checking BTC node connection: ", err) + } + return err == nil +} + +func DecodeAddressBase58(address string, keepVersion bool) ([]byte, error) { + var buff bytes.Buffer + addressBytes, version, err := base58.CheckDecode(address) + if err != nil { + return nil, err + } else if len(addressBytes) != 20 { + return nil, fmt.Errorf("decoded address exceeds 20 bytes (%s)", address) + } + if keepVersion { + buff.WriteByte(version) + } + buff.Write(addressBytes) + return buff.Bytes(), nil +} + +func DecodeAddressBase58OnlyLegacy(address string, keepVersion bool) ([]byte, error) { + if !blockchain.IsLegacyBtcAddress(address) { + return nil, fmt.Errorf("only legacy address allowed (%s)", address) + } + return DecodeAddressBase58(address, keepVersion) +} + +func toSwappedBytes32(hash *chainhash.Hash) [32]byte { + var result [32]byte + for i := 0; i < chainhash.HashSize/2; i++ { + result[i], result[chainhash.HashSize-1-i] = hash[chainhash.HashSize-1-i], hash[i] + } + return result +} + +func buildMerkleBranch(merkleTree []*chainhash.Hash, txCount uint32, txIndex uint32) blockchain.MerkleBranch { + hashes := make([][32]byte, 0) + path := 0 + pathIndex := 0 + var levelOffset uint32 = 0 + currentNodeOffset := txIndex + + for levelSize := txCount; levelSize > 1; levelSize = (levelSize + 1) / 2 { + var targetOffset uint32 + if currentNodeOffset%2 == 0 { + // Target is left hand side, use right hand side + targetOffset = min(currentNodeOffset+1, levelSize-1) + } else { + // Target is right hand side, use left hand side + targetOffset = currentNodeOffset - 1 + path = path + (1 << pathIndex) + } + hashes = append(hashes, toSwappedBytes32(merkleTree[levelOffset+targetOffset])) + + levelOffset += levelSize + currentNodeOffset = currentNodeOffset / 2 + pathIndex++ + } + + return blockchain.MerkleBranch{ + Hashes: hashes, + Path: big.NewInt(int64(path)), + } +} + +func serializePartialMerkleTree(txHash *chainhash.Hash, block *btcutil.Block) ([]byte, error) { + var err error + filter := bloom.NewFilter(1, 0, 0, wire.BloomUpdateAll) + filter.AddHash(txHash) + + msg, indices := bloom.NewMerkleBlock(block, filter) + if len(indices) > 1 { + return nil, fmt.Errorf("block matches more than one transaction (%v)", len(indices)) + } + + var buf bytes.Buffer + b := make([]byte, 4) + binary.LittleEndian.PutUint32(b, uint32(len(block.Transactions()))) + buf.Write(b) + + err = wire.WriteVarInt(&buf, wire.ProtocolVersion, uint64(len(msg.Hashes))) + if err != nil { + return nil, err + } + + for _, h := range msg.Hashes { + buf.Write(h[:]) + } + err = wire.WriteVarInt(&buf, wire.ProtocolVersion, uint64(len(msg.Flags))) + if err != nil { + return nil, err + } + + buf.Write(msg.Flags) + return buf.Bytes(), nil +} diff --git a/internal/adapters/dataproviders/bitcoin/rpc.go b/internal/adapters/dataproviders/bitcoin/rpc.go new file mode 100644 index 00000000..85a2759e --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/rpc.go @@ -0,0 +1,172 @@ +package bitcoin + +import ( + "bytes" + "fmt" + merkle "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "math/big" + "slices" +) + +type bitcoindRpc struct { + conn *Connection +} + +func NewBitcoindRpc(conn *Connection) blockchain.BitcoinNetwork { + return &bitcoindRpc{conn: conn} +} + +func (rpc *bitcoindRpc) DecodeAddress(address string, keepVersion bool) ([]byte, error) { + return DecodeAddressBase58(address, keepVersion) +} + +func (rpc *bitcoindRpc) GetTransactionInfo(hash string) (blockchain.BitcoinTransactionInformation, error) { + var amounts []*entities.Wei + var ok bool + + parsedHash, err := chainhash.NewHashFromStr(hash) + if err != nil { + return blockchain.BitcoinTransactionInformation{}, err + } + + tx, err := rpc.conn.client.GetTransaction(parsedHash) + if err != nil { + return blockchain.BitcoinTransactionInformation{}, err + } + + outputs := make(map[string][]*entities.Wei) + for _, output := range tx.Details { + amounts, ok = outputs[output.Address] + if !ok { + amounts = make([]*entities.Wei, 0) + } + if output.Category == "send" { // send category has a negative value + amounts = append(amounts, entities.SatoshiToWei(uint64(output.Amount*BtcToSatoshi*-1))) + } else { + amounts = append(amounts, entities.SatoshiToWei(uint64(output.Amount*BtcToSatoshi))) + } + outputs[output.Address] = amounts + } + return blockchain.BitcoinTransactionInformation{ + Hash: tx.TxID, + Confirmations: uint64(tx.Confirmations), + Outputs: outputs, + }, nil +} + +func (rpc *bitcoindRpc) GetRawTransaction(hash string) ([]byte, error) { + parsedHash, err := chainhash.NewHashFromStr(hash) + if err != nil { + return nil, err + } + + rawTx, err := rpc.conn.client.GetRawTransaction(parsedHash) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + if err = rawTx.MsgTx().SerializeNoWitness(&buf); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (rpc *bitcoindRpc) GetPartialMerkleTree(hash string) ([]byte, error) { + rawBlock, parsedTxHash, err := rpc.getTxBlock(hash) + if err != nil { + return nil, err + } + + block := btcutil.NewBlock(rawBlock) + return serializePartialMerkleTree(parsedTxHash, block) +} + +func (rpc *bitcoindRpc) GetHeight() (*big.Int, error) { + info, err := rpc.conn.client.GetBlockChainInfo() + if err != nil { + return nil, err + } + return big.NewInt(int64(info.Blocks)), nil +} + +func (rpc *bitcoindRpc) BuildMerkleBranch(txHash string) (blockchain.MerkleBranch, error) { + rawBlock, parsedTxHash, err := rpc.getTxBlock(txHash) + if err != nil { + return blockchain.MerkleBranch{}, err + } + + block := btcutil.NewBlock(rawBlock) + txs := make([]*btcutil.Tx, 0) + for _, t := range block.MsgBlock().Transactions { + txs = append(txs, btcutil.NewTx(t)) + } + + var cleanStore []*chainhash.Hash + store := merkle.BuildMerkleTreeStore(txs, false) + for _, node := range store { + if node != nil { + cleanStore = append(cleanStore, node) + } + } + + index := slices.IndexFunc(cleanStore, func(h *chainhash.Hash) bool { + return h != nil && h.IsEqual(parsedTxHash) + }) + if index == -1 { + return blockchain.MerkleBranch{}, fmt.Errorf("transaction %s not found in merkle tree", txHash) + } + + branch := buildMerkleBranch(cleanStore, uint32(len(block.Transactions())), uint32(index)) + return branch, nil +} + +func (rpc *bitcoindRpc) GetTransactionBlockInfo(transactionHash string) (blockchain.BitcoinBlockInformation, error) { + parsedTxHash, err := chainhash.NewHashFromStr(transactionHash) + if err != nil { + return blockchain.BitcoinBlockInformation{}, err + } + tx, err := rpc.conn.client.GetTransaction(parsedTxHash) + if err != nil { + return blockchain.BitcoinBlockInformation{}, err + } + + parsedBlockHash, err := chainhash.NewHashFromStr(tx.BlockHash) + if err != nil { + return blockchain.BitcoinBlockInformation{}, err + } + + block, err := rpc.conn.client.GetBlockVerbose(parsedBlockHash) + if err != nil { + return blockchain.BitcoinBlockInformation{}, err + } + + blockHashBytes := toSwappedBytes32(parsedBlockHash) + return blockchain.BitcoinBlockInformation{ + Hash: blockHashBytes, + Height: big.NewInt(block.Height), + }, nil +} + +func (rpc *bitcoindRpc) getTxBlock(txHash string) (*wire.MsgBlock, *chainhash.Hash, error) { + parsedTxHash, err := chainhash.NewHashFromStr(txHash) + if err != nil { + return nil, nil, err + } + tx, err := rpc.conn.client.GetTransaction(parsedTxHash) + if err != nil { + return nil, nil, err + } + parsedBlockHash, err := chainhash.NewHashFromStr(tx.BlockHash) + if err != nil { + return nil, nil, err + } + block, err := rpc.conn.client.GetBlock(parsedBlockHash) + return block, parsedTxHash, err +} diff --git a/internal/adapters/dataproviders/bitcoin/wallet.go b/internal/adapters/dataproviders/bitcoin/wallet.go new file mode 100644 index 00000000..e560197a --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/wallet.go @@ -0,0 +1,184 @@ +package bitcoin + +import ( + "encoding/hex" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" + "time" +) + +const ( + WalletUnlockSeconds = 10 +) + +type bitcoindWallet struct { + conn *Connection + fixedTxFeeRate float64 + isEncrypted bool + password string +} + +func NewBitcoindWallet( + conn *Connection, + fixedTxFeeRate float64, + isEncrypted bool, + password string, +) blockchain.BitcoinWallet { + return &bitcoindWallet{ + conn: conn, + fixedTxFeeRate: fixedTxFeeRate, + isEncrypted: isEncrypted, + password: password, + } +} + +func (wallet *bitcoindWallet) EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) { + _, err := btcutil.DecodeAddress(toAddress, wallet.conn.NetworkParams) + if err != nil { + return nil, err + } + + amountInSatoshi, _ := value.ToSatoshi().Float64() + output := []btcjson.PsbtOutput{ + {toAddress: float64(amountInSatoshi) / BtcToSatoshi}, + {"data": hex.EncodeToString(make([]byte, 32))}, // quote hash output + } + + var changePosition int64 = 2 + feeRate := wallet.fixedTxFeeRate + opts := btcjson.WalletCreateFundedPsbtOpts{ + ChangePosition: &changePosition, + FeeRate: &feeRate, + } + + simulatedTx, err := wallet.conn.client.WalletCreateFundedPsbt(nil, output, nil, &opts, nil) + if err != nil { + return nil, err + } + return entities.SatoshiToWei(uint64(simulatedTx.Fee * BtcToSatoshi)), nil +} + +func (wallet *bitcoindWallet) GetBalance() (*entities.Wei, error) { + balance := new(entities.Wei) + utxos, err := wallet.conn.client.ListUnspent() + if err != nil { + return nil, err + } + + for _, utxo := range utxos { + if utxo.Spendable { + balance.Add(balance, entities.SatoshiToWei(uint64(utxo.Amount*BtcToSatoshi))) + } + } + return balance, nil +} + +func (wallet *bitcoindWallet) SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (string, error) { + decodedAddress, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) + if err != nil { + return "", err + } + + satoshis, _ := value.ToSatoshi().Float64() + output := map[btcutil.Address]btcutil.Amount{ + decodedAddress: btcutil.Amount(satoshis), + } + rawTx, err := wallet.conn.client.CreateRawTransaction(nil, output, nil) + + opReturnScript, err := txscript.NullDataScript(opReturnContent) + if err != nil { + return "", err + } + rawTx.AddTxOut(wire.NewTxOut(0, opReturnScript)) + + changePosition := 2 + feeRate := wallet.fixedTxFeeRate + opts := btcjson.FundRawTransactionOpts{ + ChangePosition: &changePosition, + FeeRate: &feeRate, + } + + if wallet.isEncrypted { + if err = wallet.unlock(); err != nil { + return "", err + } + } + + log.Infof("Sending %v BTC to %s\n", value.ToRbtc(), address) + fundedTx, err := wallet.conn.client.FundRawTransaction(rawTx, opts, nil) + if err != nil { + return "", err + } + signedTx, _, err := wallet.conn.client.SignRawTransactionWithWallet(fundedTx.Transaction) + if err != nil { + return "", err + } + txHash, err := wallet.conn.client.SendRawTransaction(signedTx, false) + if err != nil { + return "", err + } + return txHash.String(), nil +} + +func (wallet *bitcoindWallet) unlock() error { + info, err := wallet.conn.client.GetWalletInfo() + if err != nil { + return err + } + if info.UnlockedUntil != nil && time.Until(time.Unix(int64(*info.UnlockedUntil), 0)) > 0 { + log.Debug("Wallet already unlocked") + return nil + } + return wallet.conn.client.WalletPassphrase(wallet.password, WalletUnlockSeconds) +} + +func (wallet *bitcoindWallet) ImportAddress(address string) error { + _, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) + if err != nil { + return err + } + return wallet.conn.client.ImportAddressRescan(address, "", false) +} + +func (wallet *bitcoindWallet) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { + var result []blockchain.BitcoinTransactionInformation + var ok bool + var tx blockchain.BitcoinTransactionInformation + parsedAddress, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) + if err != nil { + return nil, err + } + utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses(0, 9999, []btcutil.Address{parsedAddress}) + + txs := make(map[string]blockchain.BitcoinTransactionInformation) + for _, utxo := range utxos { + tx, ok = txs[utxo.TxID] + if !ok { + tx = blockchain.BitcoinTransactionInformation{ + Hash: utxo.TxID, + Confirmations: uint64(utxo.Confirmations), + Outputs: make(map[string][]*entities.Wei), + } + txs[utxo.TxID] = tx + } + if _, ok = tx.Outputs[address]; !ok { + tx.Outputs[address] = make([]*entities.Wei, 0) + } + tx.Outputs[utxo.Address] = append(tx.Outputs[utxo.Address], entities.SatoshiToWei(uint64(utxo.Amount*BtcToSatoshi))) + } + + for key, value := range txs { + result = append(result, value) + delete(txs, key) + } + return result, nil +} + +func (wallet *bitcoindWallet) Unlock() error { + return wallet.unlock() +} diff --git a/internal/adapters/dataproviders/configuration.go b/internal/adapters/dataproviders/configuration.go new file mode 100644 index 00000000..2725c12a --- /dev/null +++ b/internal/adapters/dataproviders/configuration.go @@ -0,0 +1,42 @@ +package dataproviders + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" +) + +type Configuration struct { + RskConfig RskConfig + BtcConfig BitcoinConfig + PeginConfig PeginConfig + PegoutConfig PegoutConfig +} + +type RskConfig struct { + ChainId uint64 + Account uint64 + Confirmations map[int]uint16 +} + +type BitcoinConfig struct { + BtcAddress string + Confirmations map[int]uint16 +} + +type PeginConfig struct { + TimeForDeposit uint32 + CallTime uint32 + PenaltyFee *entities.Wei + CallFee *entities.Wei + MinTransactionValue *entities.Wei + MaxTransactionValue *entities.Wei +} + +type PegoutConfig struct { + TimeForDeposit uint32 + CallTime uint32 + PenaltyFee *entities.Wei + CallFee *entities.Wei + MinTransactionValue *entities.Wei + MaxTransactionValue *entities.Wei + ExpireBlocks uint32 +} diff --git a/internal/adapters/dataproviders/database/mongo/common.go b/internal/adapters/dataproviders/database/mongo/common.go new file mode 100644 index 00000000..e6cf96b9 --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/common.go @@ -0,0 +1,76 @@ +package mongo + +import ( + "context" + log "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/mongo" + "time" +) + +const ( + dbTimeout = 3 * time.Second + dbName = "flyover" +) + +type dbInteraction string + +const ( + read dbInteraction = "READ" + insert dbInteraction = "INSERT" + update dbInteraction = "UPDATE" + upsert dbInteraction = "UPSERT" + delete dbInteraction = "DELETE" +) + +func logDbInteraction(interaction dbInteraction, value any) { + switch interaction { + case insert, update, upsert: + log.Infof("%s interaction with db: %#v\n", interaction, value) + case read: + log.Debugf("%s interaction with db: %#v\n", interaction, value) + case delete: + log.Debugf("%s interaction with db: %v\n", interaction, value) + default: + log.Debug("Unknown DB interaction") + } +} + +type Connection struct { + client *mongo.Client + db *mongo.Database +} + +func NewConnection(client *mongo.Client) *Connection { + db := client.Database(dbName) + return &Connection{client: client, db: db} +} + +func (c *Connection) GetDb() *mongo.Database { + return c.db +} + +func (c *Connection) Collection(collection string) *mongo.Collection { + return c.db.Collection(collection) +} + +func (c *Connection) Shutdown(closeChannel chan<- bool) { + ctx, cancel := context.WithTimeout(context.Background(), dbTimeout) + err := c.client.Disconnect(ctx) + + cancel() + closeChannel <- true + + if err != nil { + log.Error("Error disconnecting from MongoDB: ", err) + } else { + log.Debug("Disconnected from MongoDB") + } +} + +func (c *Connection) CheckConnection(ctx context.Context) bool { + err := c.client.Ping(ctx, nil) + if err != nil { + log.Error("Error checking database connection: ", err) + } + return err == nil +} diff --git a/internal/adapters/dataproviders/database/mongo/mongo.go b/internal/adapters/dataproviders/database/mongo/mongo.go new file mode 100644 index 00000000..3390604b --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/mongo.go @@ -0,0 +1,43 @@ +package mongo + +import ( + "context" + log "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "time" +) + +const connectTimeout = 10 * time.Second + +func Connect(ctx context.Context, username, password, host string) (*mongo.Client, error) { + var err error + var client *mongo.Client + log.Info("Connecting to MongoDB") + clientOptions := options.Client().ApplyURI("mongodb://" + username + ":" + password + "@" + host + ":27017/admin") + + ctx, cancel := context.WithTimeout(ctx, connectTimeout) + defer cancel() + + if client, err = mongo.Connect(ctx, clientOptions); err != nil { + return nil, err + } + db := client.Database(dbName) + if err = createIndexes(ctx, db); err == nil { + return client, nil + } else { + return nil, err + } +} + +func createIndexes(ctx context.Context, db *mongo.Database) error { + _, err := db.Collection(depositEventsCollection).Indexes().CreateOne( + ctx, + mongo.IndexModel{ + Keys: bson.D{{Key: "tx_hash", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + ) + return err +} diff --git a/internal/adapters/dataproviders/database/mongo/pegin.go b/internal/adapters/dataproviders/database/mongo/pegin.go new file mode 100644 index 00000000..ce28791b --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/pegin.go @@ -0,0 +1,154 @@ +package mongo + +import ( + "context" + "errors" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" +) + +const ( + peginQuoteCollection = "peginQuote" + retainedPeginQuoteCollection = "retainedPeginQuote" +) + +type peginMongoRepository struct { + conn *Connection +} + +func NewPeginMongoRepository(conn *Connection) quote.PeginQuoteRepository { + return &peginMongoRepository{conn: conn} +} + +type storedPeginQuote struct { + quote.PeginQuote `bson:",inline"` + Hash string `json:"hash" bson:"hash"` +} + +func (repo *peginMongoRepository) InsertQuote(ctx context.Context, hash string, peginQuote quote.PeginQuote) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + collection := repo.conn.Collection(peginQuoteCollection) + storedQuote := storedPeginQuote{ + PeginQuote: peginQuote, + Hash: hash, + } + _, err := collection.InsertOne(dbCtx, storedQuote) + if err != nil { + return err + } else { + logDbInteraction(insert, storedQuote) + return nil + } +} + +func (repo *peginMongoRepository) GetQuote(ctx context.Context, hash string) (*quote.PeginQuote, error) { + var result storedPeginQuote + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(peginQuoteCollection) + filter := bson.D{primitive.E{Key: "hash", Value: hash}} + + err := collection.FindOne(dbCtx, filter).Decode(&result) + if errors.Is(err, mongo.ErrNoDocuments) { + return nil, nil + } else if err != nil { + return nil, err + } + logDbInteraction(read, result.PeginQuote) + return &result.PeginQuote, nil +} + +func (repo *peginMongoRepository) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPeginQuote, error) { + var result quote.RetainedPeginQuote + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(retainedPeginQuoteCollection) + filter := bson.D{primitive.E{Key: "quote_hash", Value: hash}} + + err := collection.FindOne(dbCtx, filter).Decode(&result) + if errors.Is(err, mongo.ErrNoDocuments) { + return nil, nil + } else if err != nil { + return nil, err + } + logDbInteraction(read, result) + return &result, nil +} + +func (repo *peginMongoRepository) InsertRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + collection := repo.conn.Collection(retainedPeginQuoteCollection) + _, err := collection.InsertOne(dbCtx, retainedQuote) + if err != nil { + return err + } else { + logDbInteraction(insert, retainedQuote) + return nil + } +} + +func (repo *peginMongoRepository) UpdateRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(retainedPeginQuoteCollection) + filter := bson.D{primitive.E{Key: "quote_hash", Value: retainedQuote.QuoteHash}} + updateStatement := bson.D{primitive.E{Key: "$set", Value: retainedQuote}} + + result, err := collection.UpdateOne(dbCtx, filter, updateStatement) + if err != nil { + return err + } else if result.ModifiedCount == 0 { + return usecases.QuoteNotFoundError + } else if result.ModifiedCount > 1 { + return errors.New("multiple documents updated") + } + logDbInteraction(update, retainedQuote) + return nil +} + +func (repo *peginMongoRepository) GetRetainedQuoteByState(ctx context.Context, states ...quote.PeginState) ([]quote.RetainedPeginQuote, error) { + result := make([]quote.RetainedPeginQuote, 0) + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(retainedPeginQuoteCollection) + query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: states}}}} + rows, err := collection.Find(dbCtx, query) + if err != nil { + return nil, err + } + if err = rows.All(ctx, &result); err != nil { + return nil, err + } + logDbInteraction(read, result) + return result, nil +} + +func (repo *peginMongoRepository) DeleteQuotes(ctx context.Context, quotes []string) (uint, error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout*2) + defer cancel() + + filter := bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: quotes}}}} + peginResult, err := repo.conn.Collection(peginQuoteCollection).DeleteMany(dbCtx, filter) + if err != nil { + return 0, err + } + retainedResult, err := repo.conn.Collection(retainedPeginQuoteCollection).DeleteMany(dbCtx, filter) + if err != nil { + return 0, err + } else if peginResult.DeletedCount != retainedResult.DeletedCount { + return 0, errors.New("pegin quote collections didn't match") + } + logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", peginResult.DeletedCount, pegoutQuoteCollection)) + logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", retainedResult.DeletedCount, retainedPegoutQuoteCollection)) + return uint(peginResult.DeletedCount + retainedResult.DeletedCount), nil +} diff --git a/internal/adapters/dataproviders/database/mongo/pegout.go b/internal/adapters/dataproviders/database/mongo/pegout.go new file mode 100644 index 00000000..99f6dc11 --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/pegout.go @@ -0,0 +1,220 @@ +package mongo + +import ( + "context" + "errors" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +const ( + pegoutQuoteCollection = "pegoutQuote" + retainedPegoutQuoteCollection = "retainedPegoutQuote" + depositEventsCollection = "depositEvents" +) + +type storedPegoutQuote struct { + quote.PegoutQuote `bson:",inline"` + Hash string `json:"hash" bson:"hash"` +} + +type pegoutMongoRepository struct { + conn *Connection +} + +func NewPegoutMongoRepository(conn *Connection) quote.PegoutQuoteRepository { + return &pegoutMongoRepository{conn: conn} +} + +func (repo *pegoutMongoRepository) InsertQuote(ctx context.Context, hash string, pegoutQuote quote.PegoutQuote) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + collection := repo.conn.Collection(pegoutQuoteCollection) + storedQuote := storedPegoutQuote{ + PegoutQuote: pegoutQuote, + Hash: hash, + } + _, err := collection.InsertOne(dbCtx, storedQuote) + if err != nil { + return err + } else { + logDbInteraction(insert, storedQuote) + return nil + } +} + +func (repo *pegoutMongoRepository) GetQuote(ctx context.Context, hash string) (*quote.PegoutQuote, error) { + var result storedPegoutQuote + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(pegoutQuoteCollection) + filter := bson.D{primitive.E{Key: "hash", Value: hash}} + + err := collection.FindOne(dbCtx, filter).Decode(&result) + if errors.Is(err, mongo.ErrNoDocuments) { + return nil, nil + } else if err != nil { + return nil, err + } + logDbInteraction(read, result.PegoutQuote) + return &result.PegoutQuote, nil +} + +func (repo *pegoutMongoRepository) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPegoutQuote, error) { + var result quote.RetainedPegoutQuote + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(retainedPegoutQuoteCollection) + filter := bson.D{primitive.E{Key: "quote_hash", Value: hash}} + + err := collection.FindOne(dbCtx, filter).Decode(&result) + if errors.Is(err, mongo.ErrNoDocuments) { + return nil, nil + } else if err != nil { + return nil, err + } + logDbInteraction(read, result) + return &result, nil +} + +func (repo *pegoutMongoRepository) InsertRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + collection := repo.conn.Collection(retainedPegoutQuoteCollection) + _, err := collection.InsertOne(dbCtx, retainedQuote) + if err != nil { + return err + } else { + logDbInteraction(insert, retainedQuote) + return nil + } +} + +func (repo *pegoutMongoRepository) ListPegoutDepositsByAddress(ctx context.Context, address string) ([]quote.PegoutDeposit, error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + filter := bson.M{"from": address} + sort := options.Find().SetSort(bson.M{"timestamp": -1}) + cursor, err := repo.conn.Collection(depositEventsCollection).Find(dbCtx, filter, sort) + if err != nil { + return make([]quote.PegoutDeposit, 0), err + } + + var documents []quote.PegoutDeposit + if err = cursor.All(ctx, &documents); err != nil { + return make([]quote.PegoutDeposit, 0), err + } + logDbInteraction(read, fmt.Sprintf("%d pegout deposits", len(documents))) + return documents, nil +} + +func (repo *pegoutMongoRepository) UpdateRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(retainedPegoutQuoteCollection) + filter := bson.D{primitive.E{Key: "quote_hash", Value: retainedQuote.QuoteHash}} + updateStatement := bson.D{primitive.E{Key: "$set", Value: retainedQuote}} + + result, err := collection.UpdateOne(dbCtx, filter, updateStatement) + if err != nil { + return err + } else if result.ModifiedCount == 0 { + return usecases.QuoteNotFoundError + } else if result.ModifiedCount > 1 { + return errors.New("multiple documents updated") + } + logDbInteraction(update, retainedQuote) + return nil +} + +func (repo *pegoutMongoRepository) GetRetainedQuoteByState(ctx context.Context, states ...quote.PegoutState) ([]quote.RetainedPegoutQuote, error) { + result := make([]quote.RetainedPegoutQuote, 0) + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + + collection := repo.conn.Collection(retainedPegoutQuoteCollection) + query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: states}}}} + rows, err := collection.Find(dbCtx, query) + if err != nil { + return nil, err + } + if err = rows.All(ctx, &result); err != nil { + return nil, err + } + logDbInteraction(read, result) + return result, nil +} + +func (repo *pegoutMongoRepository) DeleteQuotes(ctx context.Context, quotes []string) (uint, error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout*2) + defer cancel() + + filter := bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: quotes}}}} + pegoutResult, err := repo.conn.Collection(pegoutQuoteCollection).DeleteMany(dbCtx, filter) + if err != nil { + return 0, err + } + retainedResult, err := repo.conn.Collection(retainedPegoutQuoteCollection).DeleteMany(dbCtx, filter) + if err != nil { + return 0, err + } else if pegoutResult.DeletedCount != retainedResult.DeletedCount { + return 0, errors.New("pegout quote collections didn't match") + } + logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", pegoutResult.DeletedCount, pegoutQuoteCollection)) + logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", retainedResult.DeletedCount, retainedPegoutQuoteCollection)) + return uint(pegoutResult.DeletedCount + retainedResult.DeletedCount), nil +} + +func (repo *pegoutMongoRepository) UpsertPegoutDeposit(ctx context.Context, deposit quote.PegoutDeposit) error { + ctx, cancel := context.WithTimeout(context.Background(), dbTimeout) + defer cancel() + + _, err := repo.conn.Collection(depositEventsCollection).ReplaceOne( + ctx, + bson.M{"tx_hash": deposit.TxHash}, + deposit, + options.Replace().SetUpsert(true), + ) + if err == nil { + logDbInteraction(upsert, deposit) + } + return err +} + +func (repo *pegoutMongoRepository) UpsertPegoutDeposits(ctx context.Context, deposits []quote.PegoutDeposit) error { + ctx, cancel := context.WithTimeout(context.Background(), dbTimeout) + defer cancel() + + if len(deposits) == 0 { + return nil + } + + var documents []mongo.WriteModel + for _, deposit := range deposits { + filter := bson.M{"tx_hash": deposit.TxHash} + replaceModel := mongo.NewReplaceOneModel() + replaceModel.SetFilter(filter) + replaceModel.SetReplacement(deposit) + replaceModel.SetUpsert(true) + + documents = append(documents, replaceModel) + } + + _, err := repo.conn.Collection(depositEventsCollection).BulkWrite( + ctx, + documents, + ) + if err == nil { + logDbInteraction(upsert, deposits) + } + return err +} diff --git a/internal/adapters/dataproviders/event.go b/internal/adapters/dataproviders/event.go new file mode 100644 index 00000000..e7a662e1 --- /dev/null +++ b/internal/adapters/dataproviders/event.go @@ -0,0 +1,54 @@ +package dataproviders + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + log "github.com/sirupsen/logrus" + "sync" +) + +type localEventBus struct { + topics map[entities.EventId][]chan<- entities.Event + subscribeMutex sync.Mutex + publishMutex sync.Mutex +} + +func NewLocalEventBus() entities.EventBus { + topics := make(map[entities.EventId][]chan<- entities.Event) + return &localEventBus{topics: topics} +} + +func (bus *localEventBus) Subscribe(id entities.EventId) <-chan entities.Event { + var topics []chan<- entities.Event + var ok bool + bus.subscribeMutex.Lock() + defer bus.subscribeMutex.Unlock() + if topics, ok = bus.topics[id]; !ok { + topics = make([]chan<- entities.Event, 0) + bus.topics[id] = topics + } + subscription := make(chan entities.Event, 0) + bus.topics[id] = append(topics, subscription) + return subscription +} + +func (bus *localEventBus) Shutdown(closeChannel chan<- bool) { + for _, topic := range bus.topics { + for _, subscription := range topic { + close(subscription) + } + } + closeChannel <- true + log.Debug("Event bus shut down") +} + +func (bus *localEventBus) Publish(event entities.Event) { + bus.publishMutex.Lock() + defer bus.publishMutex.Unlock() + topic, ok := bus.topics[event.Id()] + if !ok { + return + } + for _, subscription := range topic { + subscription <- event + } +} diff --git a/internal/adapters/dataproviders/liquidity_provider.go b/internal/adapters/dataproviders/liquidity_provider.go new file mode 100644 index 00000000..3751b80e --- /dev/null +++ b/internal/adapters/dataproviders/liquidity_provider.go @@ -0,0 +1,255 @@ +package dataproviders + +import ( + "bytes" + "context" + "encoding/hex" + "fmt" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + log "github.com/sirupsen/logrus" + "slices" +) + +type LocalLiquidityProvider struct { + env *Configuration + peginRepository quote.PeginQuoteRepository + pegoutRepository quote.PegoutQuoteRepository + rsk blockchain.RootstockRpcServer + signer rootstock.TransactionSigner + btc blockchain.BitcoinWallet + lbc blockchain.LiquidityBridgeContract +} + +func NewLocalLiquidityProvider( + env *Configuration, + peginRepository quote.PeginQuoteRepository, + pegoutRepository quote.PegoutQuoteRepository, + rsk blockchain.RootstockRpcServer, + signer rootstock.TransactionSigner, + btc blockchain.BitcoinWallet, + lbc blockchain.LiquidityBridgeContract, +) *LocalLiquidityProvider { + return &LocalLiquidityProvider{ + env: env, + peginRepository: peginRepository, + pegoutRepository: pegoutRepository, + rsk: rsk, + signer: signer, + btc: btc, + lbc: lbc, + } +} + +func (lp *LocalLiquidityProvider) RskAddress() string { + return lp.signer.Address().String() +} + +func (lp *LocalLiquidityProvider) BtcAddress() string { + return lp.env.BtcConfig.BtcAddress +} + +func (lp *LocalLiquidityProvider) SignQuote(quoteHash string) (string, error) { + var buf bytes.Buffer + + hash, err := hex.DecodeString(quoteHash) + if err != nil { + return "", err + } + + buf.WriteString("\x19Ethereum Signed Message:\n32") + buf.Write(hash) + signatureBytes, err := lp.signer.SignBytes(crypto.Keccak256(buf.Bytes())) + if err != nil { + return "", err + } + signatureBytes[len(signatureBytes)-1] += 27 // v must be 27 or 28 + return hex.EncodeToString(signatureBytes), nil +} + +func (lp *LocalLiquidityProvider) ValidateAmountForPegout(amount *entities.Wei) error { + if amount.Cmp(lp.MaxPegout()) <= 0 && amount.Cmp(lp.MinPegout()) >= 0 { + return nil + } else { + return fmt.Errorf("%w [%v, %v]", usecases.AmountOutOfRangeError, lp.MinPegout(), lp.MaxPegout()) + } +} + +func (lp *LocalLiquidityProvider) GetRootstockConfirmationsForValue(value *entities.Wei) uint16 { + var values []int + for key, _ := range lp.env.RskConfig.Confirmations { + values = append(values, key) + } + slices.Sort(values) + index := slices.IndexFunc(values, func(item int) bool { + return int(value.AsBigInt().Int64()) < item + }) + if index == -1 { + return lp.env.RskConfig.Confirmations[values[len(values)-1]] + } else { + return lp.env.RskConfig.Confirmations[values[index]] + } +} + +func (lp *LocalLiquidityProvider) HasPegoutLiquidity(ctx context.Context, requiredLiquidity *entities.Wei) error { + lockedLiquidity := new(entities.Wei) + log.Debug("Verifying if has liquidity") + liquidity, err := lp.btc.GetBalance() + if err != nil { + return err + } + log.Debugf("Liquidity: %s satoshi\n", liquidity.ToSatoshi().String()) + quotes, err := lp.pegoutRepository.GetRetainedQuoteByState(ctx, + quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations, quote.PegoutStateSendPegoutFailed, + ) + if err != nil { + return err + } + for _, retainedQuote := range quotes { + lockedLiquidity.Add(lockedLiquidity, retainedQuote.RequiredLiquidity) + } + log.Debugf("Locked Liquidity: %s satoshi\n", lockedLiquidity.ToSatoshi().String()) + availableLiquidity := new(entities.Wei).Sub(liquidity, lockedLiquidity) + if availableLiquidity.Cmp(requiredLiquidity) >= 0 { + return nil + } else { + return fmt.Errorf( + "not enough liquidity, missing %s satoshi\n", + requiredLiquidity.Sub(requiredLiquidity, availableLiquidity).ToSatoshi().String(), + ) + } +} + +func (lp *LocalLiquidityProvider) CallFeePegout() *entities.Wei { + return lp.env.PegoutConfig.CallFee +} + +func (lp *LocalLiquidityProvider) PenaltyFeePegout() *entities.Wei { + return lp.env.PegoutConfig.PenaltyFee +} + +func (lp *LocalLiquidityProvider) TimeForDepositPegout() uint32 { + return lp.env.PegoutConfig.TimeForDeposit +} + +func (lp *LocalLiquidityProvider) ExpireBlocksPegout() uint64 { + return uint64(lp.env.PegoutConfig.ExpireBlocks) +} + +func (lp *LocalLiquidityProvider) MaxPegout() *entities.Wei { + return lp.env.PegoutConfig.MaxTransactionValue +} + +func (lp *LocalLiquidityProvider) MinPegout() *entities.Wei { + return lp.env.PegoutConfig.MinTransactionValue +} + +func (lp *LocalLiquidityProvider) MaxPegoutConfirmations() uint16 { + // TODO replace in go 1.22 with + // return slices.Max(maps.Values(lp.env.RskConfig.Confirmations)) + var maxValue uint16 + for _, value := range lp.env.RskConfig.Confirmations { + if maxValue < value { + maxValue = value + } + } + return maxValue +} + +func (lp *LocalLiquidityProvider) ValidateAmountForPegin(amount *entities.Wei) error { + if amount.Cmp(lp.MaxPegin()) <= 0 && amount.Cmp(lp.MinPegin()) >= 0 { + return nil + } else { + return fmt.Errorf("%w [%v, %v]", usecases.AmountOutOfRangeError, lp.MinPegin(), lp.MaxPegin()) + } +} + +func (lp *LocalLiquidityProvider) GetBitcoinConfirmationsForValue(value *entities.Wei) uint16 { + var values []int + for key, _ := range lp.env.BtcConfig.Confirmations { + values = append(values, key) + } + slices.Sort(values) + index := slices.IndexFunc(values, func(item int) bool { + return int(value.AsBigInt().Int64()) < item + }) + if index == -1 { + return lp.env.BtcConfig.Confirmations[values[len(values)-1]] + } else { + return lp.env.BtcConfig.Confirmations[values[index]] + } +} + +func (lp *LocalLiquidityProvider) HasPeginLiquidity(ctx context.Context, requiredLiquidity *entities.Wei) error { + liquidity := new(entities.Wei) + lockedLiquidity := new(entities.Wei) + log.Debug("Verifying if has liquidity") + lpRskBalance, err := lp.rsk.GetBalance(ctx, lp.RskAddress()) + if err != nil { + return err + } + lpLbcBalance, err := lp.lbc.GetBalance(lp.RskAddress()) + if err != nil { + return err + } + liquidity.Add(lpRskBalance, lpLbcBalance) + log.Debugf("Liquidity: %s wei\n", liquidity.String()) + quotes, err := lp.peginRepository.GetRetainedQuoteByState(ctx, quote.PeginStateWaitingForDeposit, quote.PeginStateCallForUserFailed) + if err != nil { + return err + } + for _, retainedQuote := range quotes { + lockedLiquidity.Add(lockedLiquidity, retainedQuote.RequiredLiquidity) + } + log.Debugf("Locked Liquidity: %s wei\n", lockedLiquidity.String()) + availableLiquidity := new(entities.Wei).Sub(liquidity, lockedLiquidity) + if availableLiquidity.Cmp(requiredLiquidity) >= 0 { + return nil + } else { + return fmt.Errorf( + "%w missing %s wei\n", + usecases.NoLiquidityError, + requiredLiquidity.Sub(requiredLiquidity, availableLiquidity).String(), + ) + } +} + +func (lp *LocalLiquidityProvider) CallTime() uint32 { + return lp.env.PeginConfig.CallTime +} + +func (lp *LocalLiquidityProvider) CallFeePegin() *entities.Wei { + return lp.env.PeginConfig.CallFee +} + +func (lp *LocalLiquidityProvider) PenaltyFeePegin() *entities.Wei { + return lp.env.PeginConfig.PenaltyFee +} + +func (lp *LocalLiquidityProvider) TimeForDepositPegin() uint32 { + return lp.env.PeginConfig.TimeForDeposit +} + +func (lp *LocalLiquidityProvider) MaxPegin() *entities.Wei { + return lp.env.PeginConfig.MaxTransactionValue +} + +func (lp *LocalLiquidityProvider) MinPegin() *entities.Wei { + return lp.env.PeginConfig.MinTransactionValue +} + +func (lp *LocalLiquidityProvider) MaxPeginConfirmations() uint16 { + // TODO replace in go 1.22 with + // return slices.Max(maps.Values(lp.env.BtcConfig.Confirmations)) + var maxValue uint16 + for _, value := range lp.env.BtcConfig.Confirmations { + if maxValue < value { + maxValue = value + } + } + return maxValue +} diff --git a/internal/adapters/dataproviders/rootstock/account.go b/internal/adapters/dataproviders/rootstock/account.go new file mode 100644 index 00000000..d0be4001 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/account.go @@ -0,0 +1,53 @@ +package rootstock + +import ( + "fmt" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + log "github.com/sirupsen/logrus" + "os" +) + +func GetAccount(keyDir string, accountNum int, encryptedJson, password string) (*RskAccount, error) { + if err := os.MkdirAll(keyDir, 0700); err != nil { + return nil, err + } + + ks := keystore.NewKeyStore(keyDir, keystore.StandardScryptN, keystore.StandardScryptP) + if account, err := retrieveOrCreateAccount(ks, accountNum, encryptedJson, password); err != nil { + return nil, err + } else { + return &RskAccount{ + Account: account, + Keystore: ks, + }, nil + } +} + +func createAccount(ks *keystore.KeyStore, encryptedJson, password string) (*accounts.Account, error) { + account, err := ks.Import([]byte(encryptedJson), password, password) + if err != nil { + return nil, err + } + + err = ks.Unlock(account, password) + if err != nil { + return nil, err + } + return &account, nil +} + +func retrieveOrCreateAccount(ks *keystore.KeyStore, accountNum int, encryptedJson, password string) (*accounts.Account, error) { + if cap(ks.Accounts()) == 0 { + log.Debug("No RSK account found") + acc, err := createAccount(ks, encryptedJson, password) + return acc, err + } else { + if cap(ks.Accounts()) <= accountNum { + return nil, fmt.Errorf("account number %v not found", accountNum) + } + acc := ks.Accounts()[accountNum] + err := ks.Unlock(acc, password) + return &acc, err + } +} diff --git a/internal/adapters/dataproviders/rootstock/bindings/bridge.go b/internal/adapters/dataproviders/rootstock/bindings/bridge.go new file mode 100644 index 00000000..2c17de0c --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/bindings/bridge.go @@ -0,0 +1,1831 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// RskBridgeMetaData contains all meta data concerning the RskBridge contract. +var RskBridgeMetaData = &bind.MetaData{ + ABI: "[{\"stateMutability\":\"payable\",\"type\":\"receive\"},{\"inputs\":[],\"name\":\"getActiveRedeemScript\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActivePowpegRedeemScript\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBtcBlockchainBestChainHeight\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateForBtcReleaseClient\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateForDebugging\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBtcBlockchainInitialBlockHeight\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"depth\",\"type\":\"int256\"}],\"name\":\"getBtcBlockchainBlockHashAtDepth\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"hash\",\"type\":\"string\"}],\"name\":\"getBtcTxHashProcessedHeight\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"\",\"type\":\"int64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"hash\",\"type\":\"string\"}],\"name\":\"isBtcTxHashAlreadyProcessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"atx\",\"type\":\"bytes\"},{\"internalType\":\"int256\",\"name\":\"height\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"pmt\",\"type\":\"bytes\"}],\"name\":\"registerBtcTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"txhash\",\"type\":\"bytes\"}],\"name\":\"addSignature\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"blocks\",\"type\":\"bytes[]\"}],\"name\":\"receiveHeaders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ablock\",\"type\":\"bytes\"}],\"name\":\"receiveHeader\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationThreshold\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getFederatorPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"},{\"internalType\":\"string\",\"name\":\"atype\",\"type\":\"string\"}],\"name\":\"getFederatorPublicKeyOfType\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationCreationTime\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationCreationBlockNumber\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationThreshold\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getRetiringFederatorPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"},{\"internalType\":\"string\",\"name\":\"atype\",\"type\":\"string\"}],\"name\":\"getRetiringFederatorPublicKeyOfType\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationCreationTime\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationCreationBlockNumber\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createFederation\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"addFederatorPublicKey\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"btcKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rskKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"mstKey\",\"type\":\"bytes\"}],\"name\":\"addFederatorPublicKeyMultikey\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"hash\",\"type\":\"bytes\"}],\"name\":\"commitFederation\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollbackFederation\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingFederationHash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingFederationSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getPendingFederatorPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"},{\"internalType\":\"string\",\"name\":\"atype\",\"type\":\"string\"}],\"name\":\"getPendingFederatorPublicKeyOfType\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockWhitelistSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"}],\"name\":\"getLockWhitelistEntryByAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"},{\"internalType\":\"int256\",\"name\":\"maxTransferValue\",\"type\":\"int256\"}],\"name\":\"addLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"},{\"internalType\":\"int256\",\"name\":\"maxTransferValue\",\"type\":\"int256\"}],\"name\":\"addOneOffLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"}],\"name\":\"addUnlimitedLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"}],\"name\":\"removeLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"disableDelay\",\"type\":\"int256\"}],\"name\":\"setLockWhitelistDisableBlockDelay\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeePerKb\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"feePerKb\",\"type\":\"int256\"}],\"name\":\"voteFeePerKbChange\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateCollections\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinimumLockTxValue\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"merkleBranchPath\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleBranchHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getBtcTransactionConfirmations\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockingCap\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"newLockingCap\",\"type\":\"int256\"}],\"name\":\"increaseLockingCap\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"btcTxSerialized\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"pmtSerialized\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"witnessMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"witnessReservedValue\",\"type\":\"bytes32\"}],\"name\":\"registerBtcCoinbaseTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"hasBtcBlockCoinbaseTransactionInformation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"btcTxSerialized\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"pmtSerialized\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"derivationArgumentsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"userRefundBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"liquidityBridgeContractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"shouldTransferToContract\",\"type\":\"bool\"}],\"name\":\"registerFastBridgeBtcTransaction\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveFederationCreationBlockHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBtcBlockchainBestBlockHeader\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"btcBlockHash\",\"type\":\"bytes32\"}],\"name\":\"getBtcBlockchainBlockHeaderByHash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"btcBlockHeight\",\"type\":\"uint256\"}],\"name\":\"getBtcBlockchainBlockHeaderByHeight\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"btcBlockHash\",\"type\":\"bytes32\"}],\"name\":\"getBtcBlockchainParentBlockHeaderByHash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// RskBridgeABI is the input ABI used to generate the binding from. +// Deprecated: Use RskBridgeMetaData.ABI instead. +var RskBridgeABI = RskBridgeMetaData.ABI + +// RskBridge is an auto generated Go binding around an Ethereum contract. +type RskBridge struct { + RskBridgeCaller // Read-only binding to the contract + RskBridgeTransactor // Write-only binding to the contract + RskBridgeFilterer // Log filterer for contract events +} + +// RskBridgeCaller is an auto generated read-only Go binding around an Ethereum contract. +type RskBridgeCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RskBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract. +type RskBridgeTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RskBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type RskBridgeFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RskBridgeSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type RskBridgeSession struct { + Contract *RskBridge // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RskBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type RskBridgeCallerSession struct { + Contract *RskBridgeCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// RskBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type RskBridgeTransactorSession struct { + Contract *RskBridgeTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RskBridgeRaw is an auto generated low-level Go binding around an Ethereum contract. +type RskBridgeRaw struct { + Contract *RskBridge // Generic contract binding to access the raw methods on +} + +// RskBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type RskBridgeCallerRaw struct { + Contract *RskBridgeCaller // Generic read-only contract binding to access the raw methods on +} + +// RskBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type RskBridgeTransactorRaw struct { + Contract *RskBridgeTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewRskBridge creates a new instance of RskBridge, bound to a specific deployed contract. +func NewRskBridge(address common.Address, backend bind.ContractBackend) (*RskBridge, error) { + contract, err := bindRskBridge(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RskBridge{RskBridgeCaller: RskBridgeCaller{contract: contract}, RskBridgeTransactor: RskBridgeTransactor{contract: contract}, RskBridgeFilterer: RskBridgeFilterer{contract: contract}}, nil +} + +// NewRskBridgeCaller creates a new read-only instance of RskBridge, bound to a specific deployed contract. +func NewRskBridgeCaller(address common.Address, caller bind.ContractCaller) (*RskBridgeCaller, error) { + contract, err := bindRskBridge(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RskBridgeCaller{contract: contract}, nil +} + +// NewRskBridgeTransactor creates a new write-only instance of RskBridge, bound to a specific deployed contract. +func NewRskBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*RskBridgeTransactor, error) { + contract, err := bindRskBridge(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RskBridgeTransactor{contract: contract}, nil +} + +// NewRskBridgeFilterer creates a new log filterer instance of RskBridge, bound to a specific deployed contract. +func NewRskBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*RskBridgeFilterer, error) { + contract, err := bindRskBridge(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RskBridgeFilterer{contract: contract}, nil +} + +// bindRskBridge binds a generic wrapper to an already deployed contract. +func bindRskBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RskBridgeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_RskBridge *RskBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RskBridge.Contract.RskBridgeCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_RskBridge *RskBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RskBridge.Contract.RskBridgeTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RskBridge *RskBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RskBridge.Contract.RskBridgeTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_RskBridge *RskBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RskBridge.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_RskBridge *RskBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RskBridge.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RskBridge *RskBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RskBridge.Contract.contract.Transact(opts, method, params...) +} + +// GetActiveFederationCreationBlockHeight is a free data retrieval call binding the contract method 0x177d6e18. +// +// Solidity: function getActiveFederationCreationBlockHeight() view returns(uint256) +func (_RskBridge *RskBridgeCaller) GetActiveFederationCreationBlockHeight(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getActiveFederationCreationBlockHeight") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetActiveFederationCreationBlockHeight is a free data retrieval call binding the contract method 0x177d6e18. +// +// Solidity: function getActiveFederationCreationBlockHeight() view returns(uint256) +func (_RskBridge *RskBridgeSession) GetActiveFederationCreationBlockHeight() (*big.Int, error) { + return _RskBridge.Contract.GetActiveFederationCreationBlockHeight(&_RskBridge.CallOpts) +} + +// GetActiveFederationCreationBlockHeight is a free data retrieval call binding the contract method 0x177d6e18. +// +// Solidity: function getActiveFederationCreationBlockHeight() view returns(uint256) +func (_RskBridge *RskBridgeCallerSession) GetActiveFederationCreationBlockHeight() (*big.Int, error) { + return _RskBridge.Contract.GetActiveFederationCreationBlockHeight(&_RskBridge.CallOpts) +} + +// GetActivePowpegRedeemScript is a free data retrieval call binding the contract method 0x1d73d5dd. +// +// Solidity: function getActivePowpegRedeemScript() view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetActivePowpegRedeemScript(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getActivePowpegRedeemScript") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetActivePowpegRedeemScript is a free data retrieval call binding the contract method 0x1d73d5dd. +// +// Solidity: function getActivePowpegRedeemScript() view returns(bytes) +func (_RskBridge *RskBridgeSession) GetActivePowpegRedeemScript() ([]byte, error) { + return _RskBridge.Contract.GetActivePowpegRedeemScript(&_RskBridge.CallOpts) +} + +// GetActivePowpegRedeemScript is a free data retrieval call binding the contract method 0x1d73d5dd. +// +// Solidity: function getActivePowpegRedeemScript() view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetActivePowpegRedeemScript() ([]byte, error) { + return _RskBridge.Contract.GetActivePowpegRedeemScript(&_RskBridge.CallOpts) +} + +// GetActiveRedeemScript is a free data retrieval call binding the contract method 0x53a455ac. +// +// Solidity: function getActiveRedeemScript() view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetActiveRedeemScript(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getActiveRedeemScript") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetActiveRedeemScript is a free data retrieval call binding the contract method 0x53a455ac. +// +// Solidity: function getActiveRedeemScript() view returns(bytes) +func (_RskBridge *RskBridgeSession) GetActiveRedeemScript() ([]byte, error) { + return _RskBridge.Contract.GetActiveRedeemScript(&_RskBridge.CallOpts) +} + +// GetActiveRedeemScript is a free data retrieval call binding the contract method 0x53a455ac. +// +// Solidity: function getActiveRedeemScript() view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetActiveRedeemScript() ([]byte, error) { + return _RskBridge.Contract.GetActiveRedeemScript(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainBestBlockHeader is a free data retrieval call binding the contract method 0xf0b2424b. +// +// Solidity: function getBtcBlockchainBestBlockHeader() view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBestBlockHeader(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBestBlockHeader") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetBtcBlockchainBestBlockHeader is a free data retrieval call binding the contract method 0xf0b2424b. +// +// Solidity: function getBtcBlockchainBestBlockHeader() view returns(bytes) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainBestBlockHeader() ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBestBlockHeader(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainBestBlockHeader is a free data retrieval call binding the contract method 0xf0b2424b. +// +// Solidity: function getBtcBlockchainBestBlockHeader() view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBestBlockHeader() ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBestBlockHeader(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainBestChainHeight is a free data retrieval call binding the contract method 0x14c89c01. +// +// Solidity: function getBtcBlockchainBestChainHeight() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBestChainHeight(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBestChainHeight") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBtcBlockchainBestChainHeight is a free data retrieval call binding the contract method 0x14c89c01. +// +// Solidity: function getBtcBlockchainBestChainHeight() view returns(int256) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainBestChainHeight() (*big.Int, error) { + return _RskBridge.Contract.GetBtcBlockchainBestChainHeight(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainBestChainHeight is a free data retrieval call binding the contract method 0x14c89c01. +// +// Solidity: function getBtcBlockchainBestChainHeight() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBestChainHeight() (*big.Int, error) { + return _RskBridge.Contract.GetBtcBlockchainBestChainHeight(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainBlockHashAtDepth is a free data retrieval call binding the contract method 0xefd44418. +// +// Solidity: function getBtcBlockchainBlockHashAtDepth(int256 depth) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBlockHashAtDepth(opts *bind.CallOpts, depth *big.Int) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBlockHashAtDepth", depth) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetBtcBlockchainBlockHashAtDepth is a free data retrieval call binding the contract method 0xefd44418. +// +// Solidity: function getBtcBlockchainBlockHashAtDepth(int256 depth) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainBlockHashAtDepth(depth *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBlockHashAtDepth(&_RskBridge.CallOpts, depth) +} + +// GetBtcBlockchainBlockHashAtDepth is a free data retrieval call binding the contract method 0xefd44418. +// +// Solidity: function getBtcBlockchainBlockHashAtDepth(int256 depth) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBlockHashAtDepth(depth *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBlockHashAtDepth(&_RskBridge.CallOpts, depth) +} + +// GetBtcBlockchainBlockHeaderByHash is a free data retrieval call binding the contract method 0x739e364a. +// +// Solidity: function getBtcBlockchainBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBlockHeaderByHash(opts *bind.CallOpts, btcBlockHash [32]byte) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBlockHeaderByHash", btcBlockHash) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetBtcBlockchainBlockHeaderByHash is a free data retrieval call binding the contract method 0x739e364a. +// +// Solidity: function getBtcBlockchainBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) +} + +// GetBtcBlockchainBlockHeaderByHash is a free data retrieval call binding the contract method 0x739e364a. +// +// Solidity: function getBtcBlockchainBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) +} + +// GetBtcBlockchainBlockHeaderByHeight is a free data retrieval call binding the contract method 0xbd0c1fff. +// +// Solidity: function getBtcBlockchainBlockHeaderByHeight(uint256 btcBlockHeight) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBlockHeaderByHeight(opts *bind.CallOpts, btcBlockHeight *big.Int) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBlockHeaderByHeight", btcBlockHeight) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetBtcBlockchainBlockHeaderByHeight is a free data retrieval call binding the contract method 0xbd0c1fff. +// +// Solidity: function getBtcBlockchainBlockHeaderByHeight(uint256 btcBlockHeight) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainBlockHeaderByHeight(btcBlockHeight *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHeight(&_RskBridge.CallOpts, btcBlockHeight) +} + +// GetBtcBlockchainBlockHeaderByHeight is a free data retrieval call binding the contract method 0xbd0c1fff. +// +// Solidity: function getBtcBlockchainBlockHeaderByHeight(uint256 btcBlockHeight) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBlockHeaderByHeight(btcBlockHeight *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHeight(&_RskBridge.CallOpts, btcBlockHeight) +} + +// GetBtcBlockchainInitialBlockHeight is a free data retrieval call binding the contract method 0x4897193f. +// +// Solidity: function getBtcBlockchainInitialBlockHeight() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainInitialBlockHeight(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainInitialBlockHeight") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBtcBlockchainInitialBlockHeight is a free data retrieval call binding the contract method 0x4897193f. +// +// Solidity: function getBtcBlockchainInitialBlockHeight() view returns(int256) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainInitialBlockHeight() (*big.Int, error) { + return _RskBridge.Contract.GetBtcBlockchainInitialBlockHeight(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainInitialBlockHeight is a free data retrieval call binding the contract method 0x4897193f. +// +// Solidity: function getBtcBlockchainInitialBlockHeight() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainInitialBlockHeight() (*big.Int, error) { + return _RskBridge.Contract.GetBtcBlockchainInitialBlockHeight(&_RskBridge.CallOpts) +} + +// GetBtcBlockchainParentBlockHeaderByHash is a free data retrieval call binding the contract method 0xe0236724. +// +// Solidity: function getBtcBlockchainParentBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetBtcBlockchainParentBlockHeaderByHash(opts *bind.CallOpts, btcBlockHash [32]byte) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainParentBlockHeaderByHash", btcBlockHash) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetBtcBlockchainParentBlockHeaderByHash is a free data retrieval call binding the contract method 0xe0236724. +// +// Solidity: function getBtcBlockchainParentBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetBtcBlockchainParentBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainParentBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) +} + +// GetBtcBlockchainParentBlockHeaderByHash is a free data retrieval call binding the contract method 0xe0236724. +// +// Solidity: function getBtcBlockchainParentBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainParentBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { + return _RskBridge.Contract.GetBtcBlockchainParentBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) +} + +// GetBtcTransactionConfirmations is a free data retrieval call binding the contract method 0x5b644587. +// +// Solidity: function getBtcTransactionConfirmations(bytes32 txHash, bytes32 blockHash, uint256 merkleBranchPath, bytes32[] merkleBranchHashes) view returns(int256) +func (_RskBridge *RskBridgeCaller) GetBtcTransactionConfirmations(opts *bind.CallOpts, txHash [32]byte, blockHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcTransactionConfirmations", txHash, blockHash, merkleBranchPath, merkleBranchHashes) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBtcTransactionConfirmations is a free data retrieval call binding the contract method 0x5b644587. +// +// Solidity: function getBtcTransactionConfirmations(bytes32 txHash, bytes32 blockHash, uint256 merkleBranchPath, bytes32[] merkleBranchHashes) view returns(int256) +func (_RskBridge *RskBridgeSession) GetBtcTransactionConfirmations(txHash [32]byte, blockHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) (*big.Int, error) { + return _RskBridge.Contract.GetBtcTransactionConfirmations(&_RskBridge.CallOpts, txHash, blockHash, merkleBranchPath, merkleBranchHashes) +} + +// GetBtcTransactionConfirmations is a free data retrieval call binding the contract method 0x5b644587. +// +// Solidity: function getBtcTransactionConfirmations(bytes32 txHash, bytes32 blockHash, uint256 merkleBranchPath, bytes32[] merkleBranchHashes) view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetBtcTransactionConfirmations(txHash [32]byte, blockHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) (*big.Int, error) { + return _RskBridge.Contract.GetBtcTransactionConfirmations(&_RskBridge.CallOpts, txHash, blockHash, merkleBranchPath, merkleBranchHashes) +} + +// GetBtcTxHashProcessedHeight is a free data retrieval call binding the contract method 0x97fcca7d. +// +// Solidity: function getBtcTxHashProcessedHeight(string hash) view returns(int64) +func (_RskBridge *RskBridgeCaller) GetBtcTxHashProcessedHeight(opts *bind.CallOpts, hash string) (int64, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getBtcTxHashProcessedHeight", hash) + + if err != nil { + return *new(int64), err + } + + out0 := *abi.ConvertType(out[0], new(int64)).(*int64) + + return out0, err + +} + +// GetBtcTxHashProcessedHeight is a free data retrieval call binding the contract method 0x97fcca7d. +// +// Solidity: function getBtcTxHashProcessedHeight(string hash) view returns(int64) +func (_RskBridge *RskBridgeSession) GetBtcTxHashProcessedHeight(hash string) (int64, error) { + return _RskBridge.Contract.GetBtcTxHashProcessedHeight(&_RskBridge.CallOpts, hash) +} + +// GetBtcTxHashProcessedHeight is a free data retrieval call binding the contract method 0x97fcca7d. +// +// Solidity: function getBtcTxHashProcessedHeight(string hash) view returns(int64) +func (_RskBridge *RskBridgeCallerSession) GetBtcTxHashProcessedHeight(hash string) (int64, error) { + return _RskBridge.Contract.GetBtcTxHashProcessedHeight(&_RskBridge.CallOpts, hash) +} + +// GetFederationAddress is a free data retrieval call binding the contract method 0x6923fa85. +// +// Solidity: function getFederationAddress() view returns(string) +func (_RskBridge *RskBridgeCaller) GetFederationAddress(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederationAddress") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// GetFederationAddress is a free data retrieval call binding the contract method 0x6923fa85. +// +// Solidity: function getFederationAddress() view returns(string) +func (_RskBridge *RskBridgeSession) GetFederationAddress() (string, error) { + return _RskBridge.Contract.GetFederationAddress(&_RskBridge.CallOpts) +} + +// GetFederationAddress is a free data retrieval call binding the contract method 0x6923fa85. +// +// Solidity: function getFederationAddress() view returns(string) +func (_RskBridge *RskBridgeCallerSession) GetFederationAddress() (string, error) { + return _RskBridge.Contract.GetFederationAddress(&_RskBridge.CallOpts) +} + +// GetFederationCreationBlockNumber is a free data retrieval call binding the contract method 0x1b2045ee. +// +// Solidity: function getFederationCreationBlockNumber() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetFederationCreationBlockNumber(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederationCreationBlockNumber") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFederationCreationBlockNumber is a free data retrieval call binding the contract method 0x1b2045ee. +// +// Solidity: function getFederationCreationBlockNumber() view returns(int256) +func (_RskBridge *RskBridgeSession) GetFederationCreationBlockNumber() (*big.Int, error) { + return _RskBridge.Contract.GetFederationCreationBlockNumber(&_RskBridge.CallOpts) +} + +// GetFederationCreationBlockNumber is a free data retrieval call binding the contract method 0x1b2045ee. +// +// Solidity: function getFederationCreationBlockNumber() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetFederationCreationBlockNumber() (*big.Int, error) { + return _RskBridge.Contract.GetFederationCreationBlockNumber(&_RskBridge.CallOpts) +} + +// GetFederationCreationTime is a free data retrieval call binding the contract method 0x5e2db9d4. +// +// Solidity: function getFederationCreationTime() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetFederationCreationTime(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederationCreationTime") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFederationCreationTime is a free data retrieval call binding the contract method 0x5e2db9d4. +// +// Solidity: function getFederationCreationTime() view returns(int256) +func (_RskBridge *RskBridgeSession) GetFederationCreationTime() (*big.Int, error) { + return _RskBridge.Contract.GetFederationCreationTime(&_RskBridge.CallOpts) +} + +// GetFederationCreationTime is a free data retrieval call binding the contract method 0x5e2db9d4. +// +// Solidity: function getFederationCreationTime() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetFederationCreationTime() (*big.Int, error) { + return _RskBridge.Contract.GetFederationCreationTime(&_RskBridge.CallOpts) +} + +// GetFederationSize is a free data retrieval call binding the contract method 0x802ad4b6. +// +// Solidity: function getFederationSize() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetFederationSize(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederationSize") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFederationSize is a free data retrieval call binding the contract method 0x802ad4b6. +// +// Solidity: function getFederationSize() view returns(int256) +func (_RskBridge *RskBridgeSession) GetFederationSize() (*big.Int, error) { + return _RskBridge.Contract.GetFederationSize(&_RskBridge.CallOpts) +} + +// GetFederationSize is a free data retrieval call binding the contract method 0x802ad4b6. +// +// Solidity: function getFederationSize() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetFederationSize() (*big.Int, error) { + return _RskBridge.Contract.GetFederationSize(&_RskBridge.CallOpts) +} + +// GetFederationThreshold is a free data retrieval call binding the contract method 0x0fd47456. +// +// Solidity: function getFederationThreshold() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetFederationThreshold(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederationThreshold") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFederationThreshold is a free data retrieval call binding the contract method 0x0fd47456. +// +// Solidity: function getFederationThreshold() view returns(int256) +func (_RskBridge *RskBridgeSession) GetFederationThreshold() (*big.Int, error) { + return _RskBridge.Contract.GetFederationThreshold(&_RskBridge.CallOpts) +} + +// GetFederationThreshold is a free data retrieval call binding the contract method 0x0fd47456. +// +// Solidity: function getFederationThreshold() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetFederationThreshold() (*big.Int, error) { + return _RskBridge.Contract.GetFederationThreshold(&_RskBridge.CallOpts) +} + +// GetFederatorPublicKey is a free data retrieval call binding the contract method 0x6b89a1af. +// +// Solidity: function getFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetFederatorPublicKey(opts *bind.CallOpts, index *big.Int) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederatorPublicKey", index) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetFederatorPublicKey is a free data retrieval call binding the contract method 0x6b89a1af. +// +// Solidity: function getFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetFederatorPublicKey(index *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetFederatorPublicKey(&_RskBridge.CallOpts, index) +} + +// GetFederatorPublicKey is a free data retrieval call binding the contract method 0x6b89a1af. +// +// Solidity: function getFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetFederatorPublicKey(index *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetFederatorPublicKey(&_RskBridge.CallOpts, index) +} + +// GetFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x549cfd1c. +// +// Solidity: function getFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFederatorPublicKeyOfType", index, atype) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x549cfd1c. +// +// Solidity: function getFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { + return _RskBridge.Contract.GetFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) +} + +// GetFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x549cfd1c. +// +// Solidity: function getFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { + return _RskBridge.Contract.GetFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) +} + +// GetFeePerKb is a free data retrieval call binding the contract method 0x724ec886. +// +// Solidity: function getFeePerKb() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetFeePerKb(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getFeePerKb") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFeePerKb is a free data retrieval call binding the contract method 0x724ec886. +// +// Solidity: function getFeePerKb() view returns(int256) +func (_RskBridge *RskBridgeSession) GetFeePerKb() (*big.Int, error) { + return _RskBridge.Contract.GetFeePerKb(&_RskBridge.CallOpts) +} + +// GetFeePerKb is a free data retrieval call binding the contract method 0x724ec886. +// +// Solidity: function getFeePerKb() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetFeePerKb() (*big.Int, error) { + return _RskBridge.Contract.GetFeePerKb(&_RskBridge.CallOpts) +} + +// GetLockWhitelistAddress is a free data retrieval call binding the contract method 0x93988b76. +// +// Solidity: function getLockWhitelistAddress(int256 index) view returns(string) +func (_RskBridge *RskBridgeCaller) GetLockWhitelistAddress(opts *bind.CallOpts, index *big.Int) (string, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getLockWhitelistAddress", index) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// GetLockWhitelistAddress is a free data retrieval call binding the contract method 0x93988b76. +// +// Solidity: function getLockWhitelistAddress(int256 index) view returns(string) +func (_RskBridge *RskBridgeSession) GetLockWhitelistAddress(index *big.Int) (string, error) { + return _RskBridge.Contract.GetLockWhitelistAddress(&_RskBridge.CallOpts, index) +} + +// GetLockWhitelistAddress is a free data retrieval call binding the contract method 0x93988b76. +// +// Solidity: function getLockWhitelistAddress(int256 index) view returns(string) +func (_RskBridge *RskBridgeCallerSession) GetLockWhitelistAddress(index *big.Int) (string, error) { + return _RskBridge.Contract.GetLockWhitelistAddress(&_RskBridge.CallOpts, index) +} + +// GetLockWhitelistEntryByAddress is a free data retrieval call binding the contract method 0x251c5f7b. +// +// Solidity: function getLockWhitelistEntryByAddress(string aaddress) view returns(int256) +func (_RskBridge *RskBridgeCaller) GetLockWhitelistEntryByAddress(opts *bind.CallOpts, aaddress string) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getLockWhitelistEntryByAddress", aaddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLockWhitelistEntryByAddress is a free data retrieval call binding the contract method 0x251c5f7b. +// +// Solidity: function getLockWhitelistEntryByAddress(string aaddress) view returns(int256) +func (_RskBridge *RskBridgeSession) GetLockWhitelistEntryByAddress(aaddress string) (*big.Int, error) { + return _RskBridge.Contract.GetLockWhitelistEntryByAddress(&_RskBridge.CallOpts, aaddress) +} + +// GetLockWhitelistEntryByAddress is a free data retrieval call binding the contract method 0x251c5f7b. +// +// Solidity: function getLockWhitelistEntryByAddress(string aaddress) view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetLockWhitelistEntryByAddress(aaddress string) (*big.Int, error) { + return _RskBridge.Contract.GetLockWhitelistEntryByAddress(&_RskBridge.CallOpts, aaddress) +} + +// GetLockWhitelistSize is a free data retrieval call binding the contract method 0xe9e658dc. +// +// Solidity: function getLockWhitelistSize() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetLockWhitelistSize(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getLockWhitelistSize") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLockWhitelistSize is a free data retrieval call binding the contract method 0xe9e658dc. +// +// Solidity: function getLockWhitelistSize() view returns(int256) +func (_RskBridge *RskBridgeSession) GetLockWhitelistSize() (*big.Int, error) { + return _RskBridge.Contract.GetLockWhitelistSize(&_RskBridge.CallOpts) +} + +// GetLockWhitelistSize is a free data retrieval call binding the contract method 0xe9e658dc. +// +// Solidity: function getLockWhitelistSize() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetLockWhitelistSize() (*big.Int, error) { + return _RskBridge.Contract.GetLockWhitelistSize(&_RskBridge.CallOpts) +} + +// GetLockingCap is a free data retrieval call binding the contract method 0x3f9db977. +// +// Solidity: function getLockingCap() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetLockingCap(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getLockingCap") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLockingCap is a free data retrieval call binding the contract method 0x3f9db977. +// +// Solidity: function getLockingCap() view returns(int256) +func (_RskBridge *RskBridgeSession) GetLockingCap() (*big.Int, error) { + return _RskBridge.Contract.GetLockingCap(&_RskBridge.CallOpts) +} + +// GetLockingCap is a free data retrieval call binding the contract method 0x3f9db977. +// +// Solidity: function getLockingCap() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetLockingCap() (*big.Int, error) { + return _RskBridge.Contract.GetLockingCap(&_RskBridge.CallOpts) +} + +// GetMinimumLockTxValue is a free data retrieval call binding the contract method 0x2f8d158f. +// +// Solidity: function getMinimumLockTxValue() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetMinimumLockTxValue(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getMinimumLockTxValue") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetMinimumLockTxValue is a free data retrieval call binding the contract method 0x2f8d158f. +// +// Solidity: function getMinimumLockTxValue() view returns(int256) +func (_RskBridge *RskBridgeSession) GetMinimumLockTxValue() (*big.Int, error) { + return _RskBridge.Contract.GetMinimumLockTxValue(&_RskBridge.CallOpts) +} + +// GetMinimumLockTxValue is a free data retrieval call binding the contract method 0x2f8d158f. +// +// Solidity: function getMinimumLockTxValue() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetMinimumLockTxValue() (*big.Int, error) { + return _RskBridge.Contract.GetMinimumLockTxValue(&_RskBridge.CallOpts) +} + +// GetPendingFederationHash is a free data retrieval call binding the contract method 0x6ce0ed5a. +// +// Solidity: function getPendingFederationHash() view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetPendingFederationHash(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getPendingFederationHash") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetPendingFederationHash is a free data retrieval call binding the contract method 0x6ce0ed5a. +// +// Solidity: function getPendingFederationHash() view returns(bytes) +func (_RskBridge *RskBridgeSession) GetPendingFederationHash() ([]byte, error) { + return _RskBridge.Contract.GetPendingFederationHash(&_RskBridge.CallOpts) +} + +// GetPendingFederationHash is a free data retrieval call binding the contract method 0x6ce0ed5a. +// +// Solidity: function getPendingFederationHash() view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetPendingFederationHash() ([]byte, error) { + return _RskBridge.Contract.GetPendingFederationHash(&_RskBridge.CallOpts) +} + +// GetPendingFederationSize is a free data retrieval call binding the contract method 0x3ac72b38. +// +// Solidity: function getPendingFederationSize() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetPendingFederationSize(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getPendingFederationSize") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetPendingFederationSize is a free data retrieval call binding the contract method 0x3ac72b38. +// +// Solidity: function getPendingFederationSize() view returns(int256) +func (_RskBridge *RskBridgeSession) GetPendingFederationSize() (*big.Int, error) { + return _RskBridge.Contract.GetPendingFederationSize(&_RskBridge.CallOpts) +} + +// GetPendingFederationSize is a free data retrieval call binding the contract method 0x3ac72b38. +// +// Solidity: function getPendingFederationSize() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetPendingFederationSize() (*big.Int, error) { + return _RskBridge.Contract.GetPendingFederationSize(&_RskBridge.CallOpts) +} + +// GetPendingFederatorPublicKey is a free data retrieval call binding the contract method 0x492f7c44. +// +// Solidity: function getPendingFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetPendingFederatorPublicKey(opts *bind.CallOpts, index *big.Int) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getPendingFederatorPublicKey", index) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetPendingFederatorPublicKey is a free data retrieval call binding the contract method 0x492f7c44. +// +// Solidity: function getPendingFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetPendingFederatorPublicKey(index *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetPendingFederatorPublicKey(&_RskBridge.CallOpts, index) +} + +// GetPendingFederatorPublicKey is a free data retrieval call binding the contract method 0x492f7c44. +// +// Solidity: function getPendingFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetPendingFederatorPublicKey(index *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetPendingFederatorPublicKey(&_RskBridge.CallOpts, index) +} + +// GetPendingFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0xc61295d9. +// +// Solidity: function getPendingFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetPendingFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getPendingFederatorPublicKeyOfType", index, atype) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetPendingFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0xc61295d9. +// +// Solidity: function getPendingFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetPendingFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { + return _RskBridge.Contract.GetPendingFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) +} + +// GetPendingFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0xc61295d9. +// +// Solidity: function getPendingFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetPendingFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { + return _RskBridge.Contract.GetPendingFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) +} + +// GetRetiringFederationAddress is a free data retrieval call binding the contract method 0x47227286. +// +// Solidity: function getRetiringFederationAddress() view returns(string) +func (_RskBridge *RskBridgeCaller) GetRetiringFederationAddress(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationAddress") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// GetRetiringFederationAddress is a free data retrieval call binding the contract method 0x47227286. +// +// Solidity: function getRetiringFederationAddress() view returns(string) +func (_RskBridge *RskBridgeSession) GetRetiringFederationAddress() (string, error) { + return _RskBridge.Contract.GetRetiringFederationAddress(&_RskBridge.CallOpts) +} + +// GetRetiringFederationAddress is a free data retrieval call binding the contract method 0x47227286. +// +// Solidity: function getRetiringFederationAddress() view returns(string) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationAddress() (string, error) { + return _RskBridge.Contract.GetRetiringFederationAddress(&_RskBridge.CallOpts) +} + +// GetRetiringFederationCreationBlockNumber is a free data retrieval call binding the contract method 0xd905153f. +// +// Solidity: function getRetiringFederationCreationBlockNumber() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetRetiringFederationCreationBlockNumber(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationCreationBlockNumber") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetRetiringFederationCreationBlockNumber is a free data retrieval call binding the contract method 0xd905153f. +// +// Solidity: function getRetiringFederationCreationBlockNumber() view returns(int256) +func (_RskBridge *RskBridgeSession) GetRetiringFederationCreationBlockNumber() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationCreationBlockNumber(&_RskBridge.CallOpts) +} + +// GetRetiringFederationCreationBlockNumber is a free data retrieval call binding the contract method 0xd905153f. +// +// Solidity: function getRetiringFederationCreationBlockNumber() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationCreationBlockNumber() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationCreationBlockNumber(&_RskBridge.CallOpts) +} + +// GetRetiringFederationCreationTime is a free data retrieval call binding the contract method 0x3f0ce9b1. +// +// Solidity: function getRetiringFederationCreationTime() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetRetiringFederationCreationTime(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationCreationTime") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetRetiringFederationCreationTime is a free data retrieval call binding the contract method 0x3f0ce9b1. +// +// Solidity: function getRetiringFederationCreationTime() view returns(int256) +func (_RskBridge *RskBridgeSession) GetRetiringFederationCreationTime() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationCreationTime(&_RskBridge.CallOpts) +} + +// GetRetiringFederationCreationTime is a free data retrieval call binding the contract method 0x3f0ce9b1. +// +// Solidity: function getRetiringFederationCreationTime() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationCreationTime() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationCreationTime(&_RskBridge.CallOpts) +} + +// GetRetiringFederationSize is a free data retrieval call binding the contract method 0xd970b0fd. +// +// Solidity: function getRetiringFederationSize() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetRetiringFederationSize(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationSize") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetRetiringFederationSize is a free data retrieval call binding the contract method 0xd970b0fd. +// +// Solidity: function getRetiringFederationSize() view returns(int256) +func (_RskBridge *RskBridgeSession) GetRetiringFederationSize() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationSize(&_RskBridge.CallOpts) +} + +// GetRetiringFederationSize is a free data retrieval call binding the contract method 0xd970b0fd. +// +// Solidity: function getRetiringFederationSize() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationSize() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationSize(&_RskBridge.CallOpts) +} + +// GetRetiringFederationThreshold is a free data retrieval call binding the contract method 0x07bbdfc4. +// +// Solidity: function getRetiringFederationThreshold() view returns(int256) +func (_RskBridge *RskBridgeCaller) GetRetiringFederationThreshold(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationThreshold") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetRetiringFederationThreshold is a free data retrieval call binding the contract method 0x07bbdfc4. +// +// Solidity: function getRetiringFederationThreshold() view returns(int256) +func (_RskBridge *RskBridgeSession) GetRetiringFederationThreshold() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationThreshold(&_RskBridge.CallOpts) +} + +// GetRetiringFederationThreshold is a free data retrieval call binding the contract method 0x07bbdfc4. +// +// Solidity: function getRetiringFederationThreshold() view returns(int256) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationThreshold() (*big.Int, error) { + return _RskBridge.Contract.GetRetiringFederationThreshold(&_RskBridge.CallOpts) +} + +// GetRetiringFederatorPublicKey is a free data retrieval call binding the contract method 0x4675d6de. +// +// Solidity: function getRetiringFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetRetiringFederatorPublicKey(opts *bind.CallOpts, index *big.Int) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederatorPublicKey", index) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetRetiringFederatorPublicKey is a free data retrieval call binding the contract method 0x4675d6de. +// +// Solidity: function getRetiringFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetRetiringFederatorPublicKey(index *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetRetiringFederatorPublicKey(&_RskBridge.CallOpts, index) +} + +// GetRetiringFederatorPublicKey is a free data retrieval call binding the contract method 0x4675d6de. +// +// Solidity: function getRetiringFederatorPublicKey(int256 index) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederatorPublicKey(index *big.Int) ([]byte, error) { + return _RskBridge.Contract.GetRetiringFederatorPublicKey(&_RskBridge.CallOpts, index) +} + +// GetRetiringFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x68bc2b2b. +// +// Solidity: function getRetiringFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetRetiringFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getRetiringFederatorPublicKeyOfType", index, atype) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetRetiringFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x68bc2b2b. +// +// Solidity: function getRetiringFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeSession) GetRetiringFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { + return _RskBridge.Contract.GetRetiringFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) +} + +// GetRetiringFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x68bc2b2b. +// +// Solidity: function getRetiringFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetRetiringFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { + return _RskBridge.Contract.GetRetiringFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) +} + +// GetStateForBtcReleaseClient is a free data retrieval call binding the contract method 0xc4fbca20. +// +// Solidity: function getStateForBtcReleaseClient() view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetStateForBtcReleaseClient(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getStateForBtcReleaseClient") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetStateForBtcReleaseClient is a free data retrieval call binding the contract method 0xc4fbca20. +// +// Solidity: function getStateForBtcReleaseClient() view returns(bytes) +func (_RskBridge *RskBridgeSession) GetStateForBtcReleaseClient() ([]byte, error) { + return _RskBridge.Contract.GetStateForBtcReleaseClient(&_RskBridge.CallOpts) +} + +// GetStateForBtcReleaseClient is a free data retrieval call binding the contract method 0xc4fbca20. +// +// Solidity: function getStateForBtcReleaseClient() view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetStateForBtcReleaseClient() ([]byte, error) { + return _RskBridge.Contract.GetStateForBtcReleaseClient(&_RskBridge.CallOpts) +} + +// GetStateForDebugging is a free data retrieval call binding the contract method 0x0d0cee93. +// +// Solidity: function getStateForDebugging() view returns(bytes) +func (_RskBridge *RskBridgeCaller) GetStateForDebugging(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "getStateForDebugging") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetStateForDebugging is a free data retrieval call binding the contract method 0x0d0cee93. +// +// Solidity: function getStateForDebugging() view returns(bytes) +func (_RskBridge *RskBridgeSession) GetStateForDebugging() ([]byte, error) { + return _RskBridge.Contract.GetStateForDebugging(&_RskBridge.CallOpts) +} + +// GetStateForDebugging is a free data retrieval call binding the contract method 0x0d0cee93. +// +// Solidity: function getStateForDebugging() view returns(bytes) +func (_RskBridge *RskBridgeCallerSession) GetStateForDebugging() ([]byte, error) { + return _RskBridge.Contract.GetStateForDebugging(&_RskBridge.CallOpts) +} + +// IsBtcTxHashAlreadyProcessed is a free data retrieval call binding the contract method 0x248a982d. +// +// Solidity: function isBtcTxHashAlreadyProcessed(string hash) view returns(bool) +func (_RskBridge *RskBridgeCaller) IsBtcTxHashAlreadyProcessed(opts *bind.CallOpts, hash string) (bool, error) { + var out []interface{} + err := _RskBridge.contract.Call(opts, &out, "isBtcTxHashAlreadyProcessed", hash) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsBtcTxHashAlreadyProcessed is a free data retrieval call binding the contract method 0x248a982d. +// +// Solidity: function isBtcTxHashAlreadyProcessed(string hash) view returns(bool) +func (_RskBridge *RskBridgeSession) IsBtcTxHashAlreadyProcessed(hash string) (bool, error) { + return _RskBridge.Contract.IsBtcTxHashAlreadyProcessed(&_RskBridge.CallOpts, hash) +} + +// IsBtcTxHashAlreadyProcessed is a free data retrieval call binding the contract method 0x248a982d. +// +// Solidity: function isBtcTxHashAlreadyProcessed(string hash) view returns(bool) +func (_RskBridge *RskBridgeCallerSession) IsBtcTxHashAlreadyProcessed(hash string) (bool, error) { + return _RskBridge.Contract.IsBtcTxHashAlreadyProcessed(&_RskBridge.CallOpts, hash) +} + +// AddFederatorPublicKey is a paid mutator transaction binding the contract method 0xecefd339. +// +// Solidity: function addFederatorPublicKey(bytes key) returns(int256) +func (_RskBridge *RskBridgeTransactor) AddFederatorPublicKey(opts *bind.TransactOpts, key []byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "addFederatorPublicKey", key) +} + +// AddFederatorPublicKey is a paid mutator transaction binding the contract method 0xecefd339. +// +// Solidity: function addFederatorPublicKey(bytes key) returns(int256) +func (_RskBridge *RskBridgeSession) AddFederatorPublicKey(key []byte) (*types.Transaction, error) { + return _RskBridge.Contract.AddFederatorPublicKey(&_RskBridge.TransactOpts, key) +} + +// AddFederatorPublicKey is a paid mutator transaction binding the contract method 0xecefd339. +// +// Solidity: function addFederatorPublicKey(bytes key) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) AddFederatorPublicKey(key []byte) (*types.Transaction, error) { + return _RskBridge.Contract.AddFederatorPublicKey(&_RskBridge.TransactOpts, key) +} + +// AddFederatorPublicKeyMultikey is a paid mutator transaction binding the contract method 0x444ff9da. +// +// Solidity: function addFederatorPublicKeyMultikey(bytes btcKey, bytes rskKey, bytes mstKey) returns(int256) +func (_RskBridge *RskBridgeTransactor) AddFederatorPublicKeyMultikey(opts *bind.TransactOpts, btcKey []byte, rskKey []byte, mstKey []byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "addFederatorPublicKeyMultikey", btcKey, rskKey, mstKey) +} + +// AddFederatorPublicKeyMultikey is a paid mutator transaction binding the contract method 0x444ff9da. +// +// Solidity: function addFederatorPublicKeyMultikey(bytes btcKey, bytes rskKey, bytes mstKey) returns(int256) +func (_RskBridge *RskBridgeSession) AddFederatorPublicKeyMultikey(btcKey []byte, rskKey []byte, mstKey []byte) (*types.Transaction, error) { + return _RskBridge.Contract.AddFederatorPublicKeyMultikey(&_RskBridge.TransactOpts, btcKey, rskKey, mstKey) +} + +// AddFederatorPublicKeyMultikey is a paid mutator transaction binding the contract method 0x444ff9da. +// +// Solidity: function addFederatorPublicKeyMultikey(bytes btcKey, bytes rskKey, bytes mstKey) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) AddFederatorPublicKeyMultikey(btcKey []byte, rskKey []byte, mstKey []byte) (*types.Transaction, error) { + return _RskBridge.Contract.AddFederatorPublicKeyMultikey(&_RskBridge.TransactOpts, btcKey, rskKey, mstKey) +} + +// AddLockWhitelistAddress is a paid mutator transaction binding the contract method 0x502bbbce. +// +// Solidity: function addLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) +func (_RskBridge *RskBridgeTransactor) AddLockWhitelistAddress(opts *bind.TransactOpts, aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "addLockWhitelistAddress", aaddress, maxTransferValue) +} + +// AddLockWhitelistAddress is a paid mutator transaction binding the contract method 0x502bbbce. +// +// Solidity: function addLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) +func (_RskBridge *RskBridgeSession) AddLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.AddLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) +} + +// AddLockWhitelistAddress is a paid mutator transaction binding the contract method 0x502bbbce. +// +// Solidity: function addLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) AddLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.AddLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) +} + +// AddOneOffLockWhitelistAddress is a paid mutator transaction binding the contract method 0x848206d9. +// +// Solidity: function addOneOffLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) +func (_RskBridge *RskBridgeTransactor) AddOneOffLockWhitelistAddress(opts *bind.TransactOpts, aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "addOneOffLockWhitelistAddress", aaddress, maxTransferValue) +} + +// AddOneOffLockWhitelistAddress is a paid mutator transaction binding the contract method 0x848206d9. +// +// Solidity: function addOneOffLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) +func (_RskBridge *RskBridgeSession) AddOneOffLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.AddOneOffLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) +} + +// AddOneOffLockWhitelistAddress is a paid mutator transaction binding the contract method 0x848206d9. +// +// Solidity: function addOneOffLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) AddOneOffLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.AddOneOffLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) +} + +// AddSignature is a paid mutator transaction binding the contract method 0xf10b9c59. +// +// Solidity: function addSignature(bytes pubkey, bytes[] signatures, bytes txhash) returns() +func (_RskBridge *RskBridgeTransactor) AddSignature(opts *bind.TransactOpts, pubkey []byte, signatures [][]byte, txhash []byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "addSignature", pubkey, signatures, txhash) +} + +// AddSignature is a paid mutator transaction binding the contract method 0xf10b9c59. +// +// Solidity: function addSignature(bytes pubkey, bytes[] signatures, bytes txhash) returns() +func (_RskBridge *RskBridgeSession) AddSignature(pubkey []byte, signatures [][]byte, txhash []byte) (*types.Transaction, error) { + return _RskBridge.Contract.AddSignature(&_RskBridge.TransactOpts, pubkey, signatures, txhash) +} + +// AddSignature is a paid mutator transaction binding the contract method 0xf10b9c59. +// +// Solidity: function addSignature(bytes pubkey, bytes[] signatures, bytes txhash) returns() +func (_RskBridge *RskBridgeTransactorSession) AddSignature(pubkey []byte, signatures [][]byte, txhash []byte) (*types.Transaction, error) { + return _RskBridge.Contract.AddSignature(&_RskBridge.TransactOpts, pubkey, signatures, txhash) +} + +// AddUnlimitedLockWhitelistAddress is a paid mutator transaction binding the contract method 0xb906c938. +// +// Solidity: function addUnlimitedLockWhitelistAddress(string aaddress) returns(int256) +func (_RskBridge *RskBridgeTransactor) AddUnlimitedLockWhitelistAddress(opts *bind.TransactOpts, aaddress string) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "addUnlimitedLockWhitelistAddress", aaddress) +} + +// AddUnlimitedLockWhitelistAddress is a paid mutator transaction binding the contract method 0xb906c938. +// +// Solidity: function addUnlimitedLockWhitelistAddress(string aaddress) returns(int256) +func (_RskBridge *RskBridgeSession) AddUnlimitedLockWhitelistAddress(aaddress string) (*types.Transaction, error) { + return _RskBridge.Contract.AddUnlimitedLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) +} + +// AddUnlimitedLockWhitelistAddress is a paid mutator transaction binding the contract method 0xb906c938. +// +// Solidity: function addUnlimitedLockWhitelistAddress(string aaddress) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) AddUnlimitedLockWhitelistAddress(aaddress string) (*types.Transaction, error) { + return _RskBridge.Contract.AddUnlimitedLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) +} + +// CommitFederation is a paid mutator transaction binding the contract method 0x1533330f. +// +// Solidity: function commitFederation(bytes hash) returns(int256) +func (_RskBridge *RskBridgeTransactor) CommitFederation(opts *bind.TransactOpts, hash []byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "commitFederation", hash) +} + +// CommitFederation is a paid mutator transaction binding the contract method 0x1533330f. +// +// Solidity: function commitFederation(bytes hash) returns(int256) +func (_RskBridge *RskBridgeSession) CommitFederation(hash []byte) (*types.Transaction, error) { + return _RskBridge.Contract.CommitFederation(&_RskBridge.TransactOpts, hash) +} + +// CommitFederation is a paid mutator transaction binding the contract method 0x1533330f. +// +// Solidity: function commitFederation(bytes hash) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) CommitFederation(hash []byte) (*types.Transaction, error) { + return _RskBridge.Contract.CommitFederation(&_RskBridge.TransactOpts, hash) +} + +// CreateFederation is a paid mutator transaction binding the contract method 0x1183d5d1. +// +// Solidity: function createFederation() returns(int256) +func (_RskBridge *RskBridgeTransactor) CreateFederation(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "createFederation") +} + +// CreateFederation is a paid mutator transaction binding the contract method 0x1183d5d1. +// +// Solidity: function createFederation() returns(int256) +func (_RskBridge *RskBridgeSession) CreateFederation() (*types.Transaction, error) { + return _RskBridge.Contract.CreateFederation(&_RskBridge.TransactOpts) +} + +// CreateFederation is a paid mutator transaction binding the contract method 0x1183d5d1. +// +// Solidity: function createFederation() returns(int256) +func (_RskBridge *RskBridgeTransactorSession) CreateFederation() (*types.Transaction, error) { + return _RskBridge.Contract.CreateFederation(&_RskBridge.TransactOpts) +} + +// HasBtcBlockCoinbaseTransactionInformation is a paid mutator transaction binding the contract method 0x253b944b. +// +// Solidity: function hasBtcBlockCoinbaseTransactionInformation(bytes32 blockHash) returns(bool) +func (_RskBridge *RskBridgeTransactor) HasBtcBlockCoinbaseTransactionInformation(opts *bind.TransactOpts, blockHash [32]byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "hasBtcBlockCoinbaseTransactionInformation", blockHash) +} + +// HasBtcBlockCoinbaseTransactionInformation is a paid mutator transaction binding the contract method 0x253b944b. +// +// Solidity: function hasBtcBlockCoinbaseTransactionInformation(bytes32 blockHash) returns(bool) +func (_RskBridge *RskBridgeSession) HasBtcBlockCoinbaseTransactionInformation(blockHash [32]byte) (*types.Transaction, error) { + return _RskBridge.Contract.HasBtcBlockCoinbaseTransactionInformation(&_RskBridge.TransactOpts, blockHash) +} + +// HasBtcBlockCoinbaseTransactionInformation is a paid mutator transaction binding the contract method 0x253b944b. +// +// Solidity: function hasBtcBlockCoinbaseTransactionInformation(bytes32 blockHash) returns(bool) +func (_RskBridge *RskBridgeTransactorSession) HasBtcBlockCoinbaseTransactionInformation(blockHash [32]byte) (*types.Transaction, error) { + return _RskBridge.Contract.HasBtcBlockCoinbaseTransactionInformation(&_RskBridge.TransactOpts, blockHash) +} + +// IncreaseLockingCap is a paid mutator transaction binding the contract method 0x2910aeb2. +// +// Solidity: function increaseLockingCap(int256 newLockingCap) returns(bool) +func (_RskBridge *RskBridgeTransactor) IncreaseLockingCap(opts *bind.TransactOpts, newLockingCap *big.Int) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "increaseLockingCap", newLockingCap) +} + +// IncreaseLockingCap is a paid mutator transaction binding the contract method 0x2910aeb2. +// +// Solidity: function increaseLockingCap(int256 newLockingCap) returns(bool) +func (_RskBridge *RskBridgeSession) IncreaseLockingCap(newLockingCap *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.IncreaseLockingCap(&_RskBridge.TransactOpts, newLockingCap) +} + +// IncreaseLockingCap is a paid mutator transaction binding the contract method 0x2910aeb2. +// +// Solidity: function increaseLockingCap(int256 newLockingCap) returns(bool) +func (_RskBridge *RskBridgeTransactorSession) IncreaseLockingCap(newLockingCap *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.IncreaseLockingCap(&_RskBridge.TransactOpts, newLockingCap) +} + +// ReceiveHeader is a paid mutator transaction binding the contract method 0x884bdd86. +// +// Solidity: function receiveHeader(bytes ablock) returns(int256) +func (_RskBridge *RskBridgeTransactor) ReceiveHeader(opts *bind.TransactOpts, ablock []byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "receiveHeader", ablock) +} + +// ReceiveHeader is a paid mutator transaction binding the contract method 0x884bdd86. +// +// Solidity: function receiveHeader(bytes ablock) returns(int256) +func (_RskBridge *RskBridgeSession) ReceiveHeader(ablock []byte) (*types.Transaction, error) { + return _RskBridge.Contract.ReceiveHeader(&_RskBridge.TransactOpts, ablock) +} + +// ReceiveHeader is a paid mutator transaction binding the contract method 0x884bdd86. +// +// Solidity: function receiveHeader(bytes ablock) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) ReceiveHeader(ablock []byte) (*types.Transaction, error) { + return _RskBridge.Contract.ReceiveHeader(&_RskBridge.TransactOpts, ablock) +} + +// ReceiveHeaders is a paid mutator transaction binding the contract method 0xe5400e7b. +// +// Solidity: function receiveHeaders(bytes[] blocks) returns() +func (_RskBridge *RskBridgeTransactor) ReceiveHeaders(opts *bind.TransactOpts, blocks [][]byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "receiveHeaders", blocks) +} + +// ReceiveHeaders is a paid mutator transaction binding the contract method 0xe5400e7b. +// +// Solidity: function receiveHeaders(bytes[] blocks) returns() +func (_RskBridge *RskBridgeSession) ReceiveHeaders(blocks [][]byte) (*types.Transaction, error) { + return _RskBridge.Contract.ReceiveHeaders(&_RskBridge.TransactOpts, blocks) +} + +// ReceiveHeaders is a paid mutator transaction binding the contract method 0xe5400e7b. +// +// Solidity: function receiveHeaders(bytes[] blocks) returns() +func (_RskBridge *RskBridgeTransactorSession) ReceiveHeaders(blocks [][]byte) (*types.Transaction, error) { + return _RskBridge.Contract.ReceiveHeaders(&_RskBridge.TransactOpts, blocks) +} + +// RegisterBtcCoinbaseTransaction is a paid mutator transaction binding the contract method 0xccf417ae. +// +// Solidity: function registerBtcCoinbaseTransaction(bytes btcTxSerialized, bytes32 blockHash, bytes pmtSerialized, bytes32 witnessMerkleRoot, bytes32 witnessReservedValue) returns() +func (_RskBridge *RskBridgeTransactor) RegisterBtcCoinbaseTransaction(opts *bind.TransactOpts, btcTxSerialized []byte, blockHash [32]byte, pmtSerialized []byte, witnessMerkleRoot [32]byte, witnessReservedValue [32]byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "registerBtcCoinbaseTransaction", btcTxSerialized, blockHash, pmtSerialized, witnessMerkleRoot, witnessReservedValue) +} + +// RegisterBtcCoinbaseTransaction is a paid mutator transaction binding the contract method 0xccf417ae. +// +// Solidity: function registerBtcCoinbaseTransaction(bytes btcTxSerialized, bytes32 blockHash, bytes pmtSerialized, bytes32 witnessMerkleRoot, bytes32 witnessReservedValue) returns() +func (_RskBridge *RskBridgeSession) RegisterBtcCoinbaseTransaction(btcTxSerialized []byte, blockHash [32]byte, pmtSerialized []byte, witnessMerkleRoot [32]byte, witnessReservedValue [32]byte) (*types.Transaction, error) { + return _RskBridge.Contract.RegisterBtcCoinbaseTransaction(&_RskBridge.TransactOpts, btcTxSerialized, blockHash, pmtSerialized, witnessMerkleRoot, witnessReservedValue) +} + +// RegisterBtcCoinbaseTransaction is a paid mutator transaction binding the contract method 0xccf417ae. +// +// Solidity: function registerBtcCoinbaseTransaction(bytes btcTxSerialized, bytes32 blockHash, bytes pmtSerialized, bytes32 witnessMerkleRoot, bytes32 witnessReservedValue) returns() +func (_RskBridge *RskBridgeTransactorSession) RegisterBtcCoinbaseTransaction(btcTxSerialized []byte, blockHash [32]byte, pmtSerialized []byte, witnessMerkleRoot [32]byte, witnessReservedValue [32]byte) (*types.Transaction, error) { + return _RskBridge.Contract.RegisterBtcCoinbaseTransaction(&_RskBridge.TransactOpts, btcTxSerialized, blockHash, pmtSerialized, witnessMerkleRoot, witnessReservedValue) +} + +// RegisterBtcTransaction is a paid mutator transaction binding the contract method 0x43dc0656. +// +// Solidity: function registerBtcTransaction(bytes atx, int256 height, bytes pmt) returns() +func (_RskBridge *RskBridgeTransactor) RegisterBtcTransaction(opts *bind.TransactOpts, atx []byte, height *big.Int, pmt []byte) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "registerBtcTransaction", atx, height, pmt) +} + +// RegisterBtcTransaction is a paid mutator transaction binding the contract method 0x43dc0656. +// +// Solidity: function registerBtcTransaction(bytes atx, int256 height, bytes pmt) returns() +func (_RskBridge *RskBridgeSession) RegisterBtcTransaction(atx []byte, height *big.Int, pmt []byte) (*types.Transaction, error) { + return _RskBridge.Contract.RegisterBtcTransaction(&_RskBridge.TransactOpts, atx, height, pmt) +} + +// RegisterBtcTransaction is a paid mutator transaction binding the contract method 0x43dc0656. +// +// Solidity: function registerBtcTransaction(bytes atx, int256 height, bytes pmt) returns() +func (_RskBridge *RskBridgeTransactorSession) RegisterBtcTransaction(atx []byte, height *big.Int, pmt []byte) (*types.Transaction, error) { + return _RskBridge.Contract.RegisterBtcTransaction(&_RskBridge.TransactOpts, atx, height, pmt) +} + +// RegisterFastBridgeBtcTransaction is a paid mutator transaction binding the contract method 0x6adc0133. +// +// Solidity: function registerFastBridgeBtcTransaction(bytes btcTxSerialized, uint256 height, bytes pmtSerialized, bytes32 derivationArgumentsHash, bytes userRefundBtcAddress, address liquidityBridgeContractAddress, bytes liquidityProviderBtcAddress, bool shouldTransferToContract) returns(int256) +func (_RskBridge *RskBridgeTransactor) RegisterFastBridgeBtcTransaction(opts *bind.TransactOpts, btcTxSerialized []byte, height *big.Int, pmtSerialized []byte, derivationArgumentsHash [32]byte, userRefundBtcAddress []byte, liquidityBridgeContractAddress common.Address, liquidityProviderBtcAddress []byte, shouldTransferToContract bool) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "registerFastBridgeBtcTransaction", btcTxSerialized, height, pmtSerialized, derivationArgumentsHash, userRefundBtcAddress, liquidityBridgeContractAddress, liquidityProviderBtcAddress, shouldTransferToContract) +} + +// RegisterFastBridgeBtcTransaction is a paid mutator transaction binding the contract method 0x6adc0133. +// +// Solidity: function registerFastBridgeBtcTransaction(bytes btcTxSerialized, uint256 height, bytes pmtSerialized, bytes32 derivationArgumentsHash, bytes userRefundBtcAddress, address liquidityBridgeContractAddress, bytes liquidityProviderBtcAddress, bool shouldTransferToContract) returns(int256) +func (_RskBridge *RskBridgeSession) RegisterFastBridgeBtcTransaction(btcTxSerialized []byte, height *big.Int, pmtSerialized []byte, derivationArgumentsHash [32]byte, userRefundBtcAddress []byte, liquidityBridgeContractAddress common.Address, liquidityProviderBtcAddress []byte, shouldTransferToContract bool) (*types.Transaction, error) { + return _RskBridge.Contract.RegisterFastBridgeBtcTransaction(&_RskBridge.TransactOpts, btcTxSerialized, height, pmtSerialized, derivationArgumentsHash, userRefundBtcAddress, liquidityBridgeContractAddress, liquidityProviderBtcAddress, shouldTransferToContract) +} + +// RegisterFastBridgeBtcTransaction is a paid mutator transaction binding the contract method 0x6adc0133. +// +// Solidity: function registerFastBridgeBtcTransaction(bytes btcTxSerialized, uint256 height, bytes pmtSerialized, bytes32 derivationArgumentsHash, bytes userRefundBtcAddress, address liquidityBridgeContractAddress, bytes liquidityProviderBtcAddress, bool shouldTransferToContract) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) RegisterFastBridgeBtcTransaction(btcTxSerialized []byte, height *big.Int, pmtSerialized []byte, derivationArgumentsHash [32]byte, userRefundBtcAddress []byte, liquidityBridgeContractAddress common.Address, liquidityProviderBtcAddress []byte, shouldTransferToContract bool) (*types.Transaction, error) { + return _RskBridge.Contract.RegisterFastBridgeBtcTransaction(&_RskBridge.TransactOpts, btcTxSerialized, height, pmtSerialized, derivationArgumentsHash, userRefundBtcAddress, liquidityBridgeContractAddress, liquidityProviderBtcAddress, shouldTransferToContract) +} + +// RemoveLockWhitelistAddress is a paid mutator transaction binding the contract method 0xfcdeb46f. +// +// Solidity: function removeLockWhitelistAddress(string aaddress) returns(int256) +func (_RskBridge *RskBridgeTransactor) RemoveLockWhitelistAddress(opts *bind.TransactOpts, aaddress string) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "removeLockWhitelistAddress", aaddress) +} + +// RemoveLockWhitelistAddress is a paid mutator transaction binding the contract method 0xfcdeb46f. +// +// Solidity: function removeLockWhitelistAddress(string aaddress) returns(int256) +func (_RskBridge *RskBridgeSession) RemoveLockWhitelistAddress(aaddress string) (*types.Transaction, error) { + return _RskBridge.Contract.RemoveLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) +} + +// RemoveLockWhitelistAddress is a paid mutator transaction binding the contract method 0xfcdeb46f. +// +// Solidity: function removeLockWhitelistAddress(string aaddress) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) RemoveLockWhitelistAddress(aaddress string) (*types.Transaction, error) { + return _RskBridge.Contract.RemoveLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) +} + +// RollbackFederation is a paid mutator transaction binding the contract method 0x8dec3d32. +// +// Solidity: function rollbackFederation() returns(int256) +func (_RskBridge *RskBridgeTransactor) RollbackFederation(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "rollbackFederation") +} + +// RollbackFederation is a paid mutator transaction binding the contract method 0x8dec3d32. +// +// Solidity: function rollbackFederation() returns(int256) +func (_RskBridge *RskBridgeSession) RollbackFederation() (*types.Transaction, error) { + return _RskBridge.Contract.RollbackFederation(&_RskBridge.TransactOpts) +} + +// RollbackFederation is a paid mutator transaction binding the contract method 0x8dec3d32. +// +// Solidity: function rollbackFederation() returns(int256) +func (_RskBridge *RskBridgeTransactorSession) RollbackFederation() (*types.Transaction, error) { + return _RskBridge.Contract.RollbackFederation(&_RskBridge.TransactOpts) +} + +// SetLockWhitelistDisableBlockDelay is a paid mutator transaction binding the contract method 0xc1cc54f5. +// +// Solidity: function setLockWhitelistDisableBlockDelay(int256 disableDelay) returns(int256) +func (_RskBridge *RskBridgeTransactor) SetLockWhitelistDisableBlockDelay(opts *bind.TransactOpts, disableDelay *big.Int) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "setLockWhitelistDisableBlockDelay", disableDelay) +} + +// SetLockWhitelistDisableBlockDelay is a paid mutator transaction binding the contract method 0xc1cc54f5. +// +// Solidity: function setLockWhitelistDisableBlockDelay(int256 disableDelay) returns(int256) +func (_RskBridge *RskBridgeSession) SetLockWhitelistDisableBlockDelay(disableDelay *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.SetLockWhitelistDisableBlockDelay(&_RskBridge.TransactOpts, disableDelay) +} + +// SetLockWhitelistDisableBlockDelay is a paid mutator transaction binding the contract method 0xc1cc54f5. +// +// Solidity: function setLockWhitelistDisableBlockDelay(int256 disableDelay) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) SetLockWhitelistDisableBlockDelay(disableDelay *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.SetLockWhitelistDisableBlockDelay(&_RskBridge.TransactOpts, disableDelay) +} + +// UpdateCollections is a paid mutator transaction binding the contract method 0x0c5a9990. +// +// Solidity: function updateCollections() returns() +func (_RskBridge *RskBridgeTransactor) UpdateCollections(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "updateCollections") +} + +// UpdateCollections is a paid mutator transaction binding the contract method 0x0c5a9990. +// +// Solidity: function updateCollections() returns() +func (_RskBridge *RskBridgeSession) UpdateCollections() (*types.Transaction, error) { + return _RskBridge.Contract.UpdateCollections(&_RskBridge.TransactOpts) +} + +// UpdateCollections is a paid mutator transaction binding the contract method 0x0c5a9990. +// +// Solidity: function updateCollections() returns() +func (_RskBridge *RskBridgeTransactorSession) UpdateCollections() (*types.Transaction, error) { + return _RskBridge.Contract.UpdateCollections(&_RskBridge.TransactOpts) +} + +// VoteFeePerKbChange is a paid mutator transaction binding the contract method 0x0461313e. +// +// Solidity: function voteFeePerKbChange(int256 feePerKb) returns(int256) +func (_RskBridge *RskBridgeTransactor) VoteFeePerKbChange(opts *bind.TransactOpts, feePerKb *big.Int) (*types.Transaction, error) { + return _RskBridge.contract.Transact(opts, "voteFeePerKbChange", feePerKb) +} + +// VoteFeePerKbChange is a paid mutator transaction binding the contract method 0x0461313e. +// +// Solidity: function voteFeePerKbChange(int256 feePerKb) returns(int256) +func (_RskBridge *RskBridgeSession) VoteFeePerKbChange(feePerKb *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.VoteFeePerKbChange(&_RskBridge.TransactOpts, feePerKb) +} + +// VoteFeePerKbChange is a paid mutator transaction binding the contract method 0x0461313e. +// +// Solidity: function voteFeePerKbChange(int256 feePerKb) returns(int256) +func (_RskBridge *RskBridgeTransactorSession) VoteFeePerKbChange(feePerKb *big.Int) (*types.Transaction, error) { + return _RskBridge.Contract.VoteFeePerKbChange(&_RskBridge.TransactOpts, feePerKb) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_RskBridge *RskBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RskBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_RskBridge *RskBridgeSession) Receive() (*types.Transaction, error) { + return _RskBridge.Contract.Receive(&_RskBridge.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_RskBridge *RskBridgeTransactorSession) Receive() (*types.Transaction, error) { + return _RskBridge.Contract.Receive(&_RskBridge.TransactOpts) +} diff --git a/internal/adapters/dataproviders/rootstock/bindings/lbc.go b/internal/adapters/dataproviders/rootstock/bindings/lbc.go new file mode 100644 index 00000000..e6e643b5 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/bindings/lbc.go @@ -0,0 +1,4638 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// LiquidityBridgeContractLiquidityProvider is an auto generated low-level Go binding around an user-defined struct. +type LiquidityBridgeContractLiquidityProvider struct { + Id *big.Int + Provider common.Address + Name string + ApiBaseUrl string + Status bool + ProviderType string +} + +// QuotesPegOutQuote is an auto generated low-level Go binding around an user-defined struct. +type QuotesPegOutQuote struct { + LbcAddress common.Address + LpRskAddress common.Address + BtcRefundAddress []byte + RskRefundAddress common.Address + LpBtcAddress []byte + CallFee *big.Int + PenaltyFee *big.Int + Nonce int64 + DeposityAddress []byte + Value *big.Int + AgreementTimestamp uint32 + DepositDateLimit uint32 + DepositConfirmations uint16 + TransferConfirmations uint16 + TransferTime uint32 + ExpireDate uint32 + ExpireBlock uint32 + ProductFeeAmount *big.Int + GasFee *big.Int +} + +// QuotesPeginQuote is an auto generated low-level Go binding around an user-defined struct. +type QuotesPeginQuote struct { + FedBtcAddress [20]byte + LbcAddress common.Address + LiquidityProviderRskAddress common.Address + BtcRefundAddress []byte + RskRefundAddress common.Address + LiquidityProviderBtcAddress []byte + CallFee *big.Int + PenaltyFee *big.Int + ContractAddress common.Address + Data []byte + GasLimit uint32 + Nonce int64 + Value *big.Int + AgreementTimestamp uint32 + TimeForDeposit uint32 + CallTime uint32 + DepositConfirmations uint16 + CallOnRegister bool + ProductFeeAmount *big.Int + GasFee *big.Int +} + +// LiquidityBridgeContractMetaData contains all meta data concerning the LiquidityBridgeContract contract. +var LiquidityBridgeContractMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BalanceDecrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BalanceIncrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"errorCode\",\"type\":\"int256\"}],\"name\":\"BridgeCapExceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"CallForUser\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CollateralIncrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DaoFeeSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"transferredAmount\",\"type\":\"int256\"}],\"name\":\"PegInRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"PegOutDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"PegOutRefunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"}],\"name\":\"PegOutUserRefunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"PegoutCollateralIncrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"PegoutWithdrawCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"liquidityProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"penalty\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"Penalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"Refund\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Register\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"Resigned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE_GENERIC_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_REFUNDED_LP_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_REFUNDED_USER_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CALL_DONE_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CALL_GAS_COST\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REFUND_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAY_TO_ADDRESS_OUTPUT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROCESSED_QUOTE_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QUOTE_HASH_OUTPUT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNPROCESSED_QUOTE_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"contractBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoFeeCollectorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"productFeePercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"providerId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_productFeePercentage\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_daoFeeCollectorAddress\",\"type\":\"address\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_providerId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"setProviderStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderIds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinPegIn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRewardPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getResignDelayBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDustThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"getRegisteredPegOutQuote\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"lpBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"bytes\",\"name\":\"deposityAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"depositDateLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"transferConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"transferTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireDate\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PegOutQuote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"isPegOutQuoteCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isOperational\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isOperationalForPegout\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_apiBaseUrl\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"_providerType\",\"type\":\"string\"}],\"name\":\"register\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"providerIds\",\"type\":\"uint256[]\"}],\"name\":\"getProviders\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"apiBaseUrl\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"providerType\",\"type\":\"string\"}],\"internalType\":\"structLiquidityBridgeContract.LiquidityProvider[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addPegoutCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawPegoutCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getPegoutCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"}],\"name\":\"callForUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"btcRawTransaction\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"partialMerkleTree\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"}],\"name\":\"registerPegIn\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"lpBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"bytes\",\"name\":\"deposityAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"depositDateLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"transferConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"transferTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireDate\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PegOutQuote\",\"name\":\"quote\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"depositPegout\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"refundUserPegOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"btcTx\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"btcBlockHeaderHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"partialMerkleTree\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleBranchHashes\",\"type\":\"bytes32[]\"}],\"name\":\"refundPegOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"depositAddress\",\"type\":\"bytes\"}],\"name\":\"validatePeginDepositAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"}],\"name\":\"hashQuote\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"lpBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"bytes\",\"name\":\"deposityAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"depositDateLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"transferConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"transferTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireDate\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PegOutQuote\",\"name\":\"quote\",\"type\":\"tuple\"}],\"name\":\"hashPegoutQuote\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// LiquidityBridgeContractABI is the input ABI used to generate the binding from. +// Deprecated: Use LiquidityBridgeContractMetaData.ABI instead. +var LiquidityBridgeContractABI = LiquidityBridgeContractMetaData.ABI + +// LiquidityBridgeContract is an auto generated Go binding around an Ethereum contract. +type LiquidityBridgeContract struct { + LiquidityBridgeContractCaller // Read-only binding to the contract + LiquidityBridgeContractTransactor // Write-only binding to the contract + LiquidityBridgeContractFilterer // Log filterer for contract events +} + +// LiquidityBridgeContractCaller is an auto generated read-only Go binding around an Ethereum contract. +type LiquidityBridgeContractCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// LiquidityBridgeContractTransactor is an auto generated write-only Go binding around an Ethereum contract. +type LiquidityBridgeContractTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// LiquidityBridgeContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type LiquidityBridgeContractFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// LiquidityBridgeContractSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type LiquidityBridgeContractSession struct { + Contract *LiquidityBridgeContract // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// LiquidityBridgeContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type LiquidityBridgeContractCallerSession struct { + Contract *LiquidityBridgeContractCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// LiquidityBridgeContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type LiquidityBridgeContractTransactorSession struct { + Contract *LiquidityBridgeContractTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// LiquidityBridgeContractRaw is an auto generated low-level Go binding around an Ethereum contract. +type LiquidityBridgeContractRaw struct { + Contract *LiquidityBridgeContract // Generic contract binding to access the raw methods on +} + +// LiquidityBridgeContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type LiquidityBridgeContractCallerRaw struct { + Contract *LiquidityBridgeContractCaller // Generic read-only contract binding to access the raw methods on +} + +// LiquidityBridgeContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type LiquidityBridgeContractTransactorRaw struct { + Contract *LiquidityBridgeContractTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewLiquidityBridgeContract creates a new instance of LiquidityBridgeContract, bound to a specific deployed contract. +func NewLiquidityBridgeContract(address common.Address, backend bind.ContractBackend) (*LiquidityBridgeContract, error) { + contract, err := bindLiquidityBridgeContract(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &LiquidityBridgeContract{LiquidityBridgeContractCaller: LiquidityBridgeContractCaller{contract: contract}, LiquidityBridgeContractTransactor: LiquidityBridgeContractTransactor{contract: contract}, LiquidityBridgeContractFilterer: LiquidityBridgeContractFilterer{contract: contract}}, nil +} + +// NewLiquidityBridgeContractCaller creates a new read-only instance of LiquidityBridgeContract, bound to a specific deployed contract. +func NewLiquidityBridgeContractCaller(address common.Address, caller bind.ContractCaller) (*LiquidityBridgeContractCaller, error) { + contract, err := bindLiquidityBridgeContract(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractCaller{contract: contract}, nil +} + +// NewLiquidityBridgeContractTransactor creates a new write-only instance of LiquidityBridgeContract, bound to a specific deployed contract. +func NewLiquidityBridgeContractTransactor(address common.Address, transactor bind.ContractTransactor) (*LiquidityBridgeContractTransactor, error) { + contract, err := bindLiquidityBridgeContract(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractTransactor{contract: contract}, nil +} + +// NewLiquidityBridgeContractFilterer creates a new log filterer instance of LiquidityBridgeContract, bound to a specific deployed contract. +func NewLiquidityBridgeContractFilterer(address common.Address, filterer bind.ContractFilterer) (*LiquidityBridgeContractFilterer, error) { + contract, err := bindLiquidityBridgeContract(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractFilterer{contract: contract}, nil +} + +// bindLiquidityBridgeContract binds a generic wrapper to an already deployed contract. +func bindLiquidityBridgeContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := LiquidityBridgeContractMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_LiquidityBridgeContract *LiquidityBridgeContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _LiquidityBridgeContract.Contract.LiquidityBridgeContractCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_LiquidityBridgeContract *LiquidityBridgeContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.LiquidityBridgeContractTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_LiquidityBridgeContract *LiquidityBridgeContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.LiquidityBridgeContractTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _LiquidityBridgeContract.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.contract.Transact(opts, method, params...) +} + +// BRIDGEGENERICERROR is a free data retrieval call binding the contract method 0xae93b67b. +// +// Solidity: function BRIDGE_GENERIC_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEGENERICERROR(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_GENERIC_ERROR") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEGENERICERROR is a free data retrieval call binding the contract method 0xae93b67b. +// +// Solidity: function BRIDGE_GENERIC_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEGENERICERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEGENERICERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEGENERICERROR is a free data retrieval call binding the contract method 0xae93b67b. +// +// Solidity: function BRIDGE_GENERIC_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEGENERICERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEGENERICERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEREFUNDEDLPERRORCODE is a free data retrieval call binding the contract method 0xe30e6ea3. +// +// Solidity: function BRIDGE_REFUNDED_LP_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEREFUNDEDLPERRORCODE(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_REFUNDED_LP_ERROR_CODE") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEREFUNDEDLPERRORCODE is a free data retrieval call binding the contract method 0xe30e6ea3. +// +// Solidity: function BRIDGE_REFUNDED_LP_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEREFUNDEDLPERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDLPERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEREFUNDEDLPERRORCODE is a free data retrieval call binding the contract method 0xe30e6ea3. +// +// Solidity: function BRIDGE_REFUNDED_LP_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEREFUNDEDLPERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDLPERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEREFUNDEDUSERERRORCODE is a free data retrieval call binding the contract method 0xe8fcce71. +// +// Solidity: function BRIDGE_REFUNDED_USER_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEREFUNDEDUSERERRORCODE(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_REFUNDED_USER_ERROR_CODE") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEREFUNDEDUSERERRORCODE is a free data retrieval call binding the contract method 0xe8fcce71. +// +// Solidity: function BRIDGE_REFUNDED_USER_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEREFUNDEDUSERERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDUSERERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEREFUNDEDUSERERRORCODE is a free data retrieval call binding the contract method 0xe8fcce71. +// +// Solidity: function BRIDGE_REFUNDED_USER_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEREFUNDEDUSERERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDUSERERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE is a free data retrieval call binding the contract method 0xa93bb247. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE is a free data retrieval call binding the contract method 0xa93bb247. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE is a free data retrieval call binding the contract method 0xa93bb247. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE is a free data retrieval call binding the contract method 0x8d597939. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE is a free data retrieval call binding the contract method 0x8d597939. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE is a free data retrieval call binding the contract method 0x8d597939. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE is a free data retrieval call binding the contract method 0xae76ce86. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE is a free data retrieval call binding the contract method 0xae76ce86. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE is a free data retrieval call binding the contract method 0xae76ce86. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR is a free data retrieval call binding the contract method 0x418663a2. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR is a free data retrieval call binding the contract method 0x418663a2. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR is a free data retrieval call binding the contract method 0x418663a2. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXVALIDATIONSERROR is a free data retrieval call binding the contract method 0xc525cdd8. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXVALIDATIONSERROR(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEUNPROCESSABLETXVALIDATIONSERROR is a free data retrieval call binding the contract method 0xc525cdd8. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXVALIDATIONSERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALIDATIONSERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXVALIDATIONSERROR is a free data retrieval call binding the contract method 0xc525cdd8. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXVALIDATIONSERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALIDATIONSERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXVALUEZEROERROR is a free data retrieval call binding the contract method 0xcfb92f0a. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXVALUEZEROERROR(opts *bind.CallOpts) (int16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR") + + if err != nil { + return *new(int16), err + } + + out0 := *abi.ConvertType(out[0], new(int16)).(*int16) + + return out0, err + +} + +// BRIDGEUNPROCESSABLETXVALUEZEROERROR is a free data retrieval call binding the contract method 0xcfb92f0a. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXVALUEZEROERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALUEZEROERROR(&_LiquidityBridgeContract.CallOpts) +} + +// BRIDGEUNPROCESSABLETXVALUEZEROERROR is a free data retrieval call binding the contract method 0xcfb92f0a. +// +// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR() view returns(int16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXVALUEZEROERROR() (int16, error) { + return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALUEZEROERROR(&_LiquidityBridgeContract.CallOpts) +} + +// CALLDONECODE is a free data retrieval call binding the contract method 0x04ade855. +// +// Solidity: function CALL_DONE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) CALLDONECODE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "CALL_DONE_CODE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// CALLDONECODE is a free data retrieval call binding the contract method 0x04ade855. +// +// Solidity: function CALL_DONE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) CALLDONECODE() (uint8, error) { + return _LiquidityBridgeContract.Contract.CALLDONECODE(&_LiquidityBridgeContract.CallOpts) +} + +// CALLDONECODE is a free data retrieval call binding the contract method 0x04ade855. +// +// Solidity: function CALL_DONE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) CALLDONECODE() (uint8, error) { + return _LiquidityBridgeContract.Contract.CALLDONECODE(&_LiquidityBridgeContract.CallOpts) +} + +// MAXCALLGASCOST is a free data retrieval call binding the contract method 0x9d79b59b. +// +// Solidity: function MAX_CALL_GAS_COST() view returns(uint16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) MAXCALLGASCOST(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "MAX_CALL_GAS_COST") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MAXCALLGASCOST is a free data retrieval call binding the contract method 0x9d79b59b. +// +// Solidity: function MAX_CALL_GAS_COST() view returns(uint16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) MAXCALLGASCOST() (uint16, error) { + return _LiquidityBridgeContract.Contract.MAXCALLGASCOST(&_LiquidityBridgeContract.CallOpts) +} + +// MAXCALLGASCOST is a free data retrieval call binding the contract method 0x9d79b59b. +// +// Solidity: function MAX_CALL_GAS_COST() view returns(uint16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) MAXCALLGASCOST() (uint16, error) { + return _LiquidityBridgeContract.Contract.MAXCALLGASCOST(&_LiquidityBridgeContract.CallOpts) +} + +// MAXREFUNDGASLIMIT is a free data retrieval call binding the contract method 0xe1de16c6. +// +// Solidity: function MAX_REFUND_GAS_LIMIT() view returns(uint16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) MAXREFUNDGASLIMIT(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "MAX_REFUND_GAS_LIMIT") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MAXREFUNDGASLIMIT is a free data retrieval call binding the contract method 0xe1de16c6. +// +// Solidity: function MAX_REFUND_GAS_LIMIT() view returns(uint16) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) MAXREFUNDGASLIMIT() (uint16, error) { + return _LiquidityBridgeContract.Contract.MAXREFUNDGASLIMIT(&_LiquidityBridgeContract.CallOpts) +} + +// MAXREFUNDGASLIMIT is a free data retrieval call binding the contract method 0xe1de16c6. +// +// Solidity: function MAX_REFUND_GAS_LIMIT() view returns(uint16) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) MAXREFUNDGASLIMIT() (uint16, error) { + return _LiquidityBridgeContract.Contract.MAXREFUNDGASLIMIT(&_LiquidityBridgeContract.CallOpts) +} + +// PAYTOADDRESSOUTPUT is a free data retrieval call binding the contract method 0xbe6de4eb. +// +// Solidity: function PAY_TO_ADDRESS_OUTPUT() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) PAYTOADDRESSOUTPUT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "PAY_TO_ADDRESS_OUTPUT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PAYTOADDRESSOUTPUT is a free data retrieval call binding the contract method 0xbe6de4eb. +// +// Solidity: function PAY_TO_ADDRESS_OUTPUT() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) PAYTOADDRESSOUTPUT() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.PAYTOADDRESSOUTPUT(&_LiquidityBridgeContract.CallOpts) +} + +// PAYTOADDRESSOUTPUT is a free data retrieval call binding the contract method 0xbe6de4eb. +// +// Solidity: function PAY_TO_ADDRESS_OUTPUT() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) PAYTOADDRESSOUTPUT() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.PAYTOADDRESSOUTPUT(&_LiquidityBridgeContract.CallOpts) +} + +// PROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x0a7bf57a. +// +// Solidity: function PROCESSED_QUOTE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) PROCESSEDQUOTECODE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "PROCESSED_QUOTE_CODE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// PROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x0a7bf57a. +// +// Solidity: function PROCESSED_QUOTE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) PROCESSEDQUOTECODE() (uint8, error) { + return _LiquidityBridgeContract.Contract.PROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) +} + +// PROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x0a7bf57a. +// +// Solidity: function PROCESSED_QUOTE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) PROCESSEDQUOTECODE() (uint8, error) { + return _LiquidityBridgeContract.Contract.PROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) +} + +// QUOTEHASHOUTPUT is a free data retrieval call binding the contract method 0xa4a5ba50. +// +// Solidity: function QUOTE_HASH_OUTPUT() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) QUOTEHASHOUTPUT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "QUOTE_HASH_OUTPUT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// QUOTEHASHOUTPUT is a free data retrieval call binding the contract method 0xa4a5ba50. +// +// Solidity: function QUOTE_HASH_OUTPUT() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) QUOTEHASHOUTPUT() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.QUOTEHASHOUTPUT(&_LiquidityBridgeContract.CallOpts) +} + +// QUOTEHASHOUTPUT is a free data retrieval call binding the contract method 0xa4a5ba50. +// +// Solidity: function QUOTE_HASH_OUTPUT() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) QUOTEHASHOUTPUT() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.QUOTEHASHOUTPUT(&_LiquidityBridgeContract.CallOpts) +} + +// UNPROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x9cd6557f. +// +// Solidity: function UNPROCESSED_QUOTE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) UNPROCESSEDQUOTECODE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "UNPROCESSED_QUOTE_CODE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UNPROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x9cd6557f. +// +// Solidity: function UNPROCESSED_QUOTE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) UNPROCESSEDQUOTECODE() (uint8, error) { + return _LiquidityBridgeContract.Contract.UNPROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) +} + +// UNPROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x9cd6557f. +// +// Solidity: function UNPROCESSED_QUOTE_CODE() view returns(uint8) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) UNPROCESSEDQUOTECODE() (uint8, error) { + return _LiquidityBridgeContract.Contract.UNPROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) +} + +// Bridge is a free data retrieval call binding the contract method 0xe78cea92. +// +// Solidity: function bridge() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) Bridge(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "bridge") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Bridge is a free data retrieval call binding the contract method 0xe78cea92. +// +// Solidity: function bridge() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Bridge() (common.Address, error) { + return _LiquidityBridgeContract.Contract.Bridge(&_LiquidityBridgeContract.CallOpts) +} + +// Bridge is a free data retrieval call binding the contract method 0xe78cea92. +// +// Solidity: function bridge() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) Bridge() (common.Address, error) { + return _LiquidityBridgeContract.Contract.Bridge(&_LiquidityBridgeContract.CallOpts) +} + +// DaoFeeCollectorAddress is a free data retrieval call binding the contract method 0x710738b1. +// +// Solidity: function daoFeeCollectorAddress() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) DaoFeeCollectorAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "daoFeeCollectorAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DaoFeeCollectorAddress is a free data retrieval call binding the contract method 0x710738b1. +// +// Solidity: function daoFeeCollectorAddress() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) DaoFeeCollectorAddress() (common.Address, error) { + return _LiquidityBridgeContract.Contract.DaoFeeCollectorAddress(&_LiquidityBridgeContract.CallOpts) +} + +// DaoFeeCollectorAddress is a free data retrieval call binding the contract method 0x710738b1. +// +// Solidity: function daoFeeCollectorAddress() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) DaoFeeCollectorAddress() (common.Address, error) { + return _LiquidityBridgeContract.Contract.DaoFeeCollectorAddress(&_LiquidityBridgeContract.CallOpts) +} + +// GetBalance is a free data retrieval call binding the contract method 0xf8b2cb4f. +// +// Solidity: function getBalance(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getBalance", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBalance is a free data retrieval call binding the contract method 0xf8b2cb4f. +// +// Solidity: function getBalance(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetBalance(addr common.Address) (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetBalance(&_LiquidityBridgeContract.CallOpts, addr) +} + +// GetBalance is a free data retrieval call binding the contract method 0xf8b2cb4f. +// +// Solidity: function getBalance(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetBalance(addr common.Address) (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetBalance(&_LiquidityBridgeContract.CallOpts, addr) +} + +// GetBridgeAddress is a free data retrieval call binding the contract method 0xfb32c508. +// +// Solidity: function getBridgeAddress() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetBridgeAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getBridgeAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetBridgeAddress is a free data retrieval call binding the contract method 0xfb32c508. +// +// Solidity: function getBridgeAddress() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetBridgeAddress() (common.Address, error) { + return _LiquidityBridgeContract.Contract.GetBridgeAddress(&_LiquidityBridgeContract.CallOpts) +} + +// GetBridgeAddress is a free data retrieval call binding the contract method 0xfb32c508. +// +// Solidity: function getBridgeAddress() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetBridgeAddress() (common.Address, error) { + return _LiquidityBridgeContract.Contract.GetBridgeAddress(&_LiquidityBridgeContract.CallOpts) +} + +// GetCollateral is a free data retrieval call binding the contract method 0x9b56d6c9. +// +// Solidity: function getCollateral(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getCollateral", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetCollateral is a free data retrieval call binding the contract method 0x9b56d6c9. +// +// Solidity: function getCollateral(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetCollateral(addr common.Address) (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetCollateral(&_LiquidityBridgeContract.CallOpts, addr) +} + +// GetCollateral is a free data retrieval call binding the contract method 0x9b56d6c9. +// +// Solidity: function getCollateral(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetCollateral(addr common.Address) (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetCollateral(&_LiquidityBridgeContract.CallOpts, addr) +} + +// GetDustThreshold is a free data retrieval call binding the contract method 0x33f07ad3. +// +// Solidity: function getDustThreshold() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetDustThreshold(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getDustThreshold") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetDustThreshold is a free data retrieval call binding the contract method 0x33f07ad3. +// +// Solidity: function getDustThreshold() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetDustThreshold() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetDustThreshold(&_LiquidityBridgeContract.CallOpts) +} + +// GetDustThreshold is a free data retrieval call binding the contract method 0x33f07ad3. +// +// Solidity: function getDustThreshold() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetDustThreshold() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetDustThreshold(&_LiquidityBridgeContract.CallOpts) +} + +// GetMinCollateral is a free data retrieval call binding the contract method 0xe830b690. +// +// Solidity: function getMinCollateral() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetMinCollateral(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getMinCollateral") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetMinCollateral is a free data retrieval call binding the contract method 0xe830b690. +// +// Solidity: function getMinCollateral() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetMinCollateral() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetMinCollateral(&_LiquidityBridgeContract.CallOpts) +} + +// GetMinCollateral is a free data retrieval call binding the contract method 0xe830b690. +// +// Solidity: function getMinCollateral() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetMinCollateral() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetMinCollateral(&_LiquidityBridgeContract.CallOpts) +} + +// GetMinPegIn is a free data retrieval call binding the contract method 0xfa88dcde. +// +// Solidity: function getMinPegIn() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetMinPegIn(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getMinPegIn") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetMinPegIn is a free data retrieval call binding the contract method 0xfa88dcde. +// +// Solidity: function getMinPegIn() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetMinPegIn() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetMinPegIn(&_LiquidityBridgeContract.CallOpts) +} + +// GetMinPegIn is a free data retrieval call binding the contract method 0xfa88dcde. +// +// Solidity: function getMinPegIn() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetMinPegIn() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetMinPegIn(&_LiquidityBridgeContract.CallOpts) +} + +// GetPegoutCollateral is a free data retrieval call binding the contract method 0xbd519eff. +// +// Solidity: function getPegoutCollateral(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetPegoutCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getPegoutCollateral", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetPegoutCollateral is a free data retrieval call binding the contract method 0xbd519eff. +// +// Solidity: function getPegoutCollateral(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetPegoutCollateral(addr common.Address) (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetPegoutCollateral(&_LiquidityBridgeContract.CallOpts, addr) +} + +// GetPegoutCollateral is a free data retrieval call binding the contract method 0xbd519eff. +// +// Solidity: function getPegoutCollateral(address addr) view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetPegoutCollateral(addr common.Address) (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetPegoutCollateral(&_LiquidityBridgeContract.CallOpts, addr) +} + +// GetProviderIds is a free data retrieval call binding the contract method 0x0a9cb4a7. +// +// Solidity: function getProviderIds() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetProviderIds(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getProviderIds") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetProviderIds is a free data retrieval call binding the contract method 0x0a9cb4a7. +// +// Solidity: function getProviderIds() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetProviderIds() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetProviderIds(&_LiquidityBridgeContract.CallOpts) +} + +// GetProviderIds is a free data retrieval call binding the contract method 0x0a9cb4a7. +// +// Solidity: function getProviderIds() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetProviderIds() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetProviderIds(&_LiquidityBridgeContract.CallOpts) +} + +// GetProviders is a free data retrieval call binding the contract method 0x668dbd83. +// +// Solidity: function getProviders(uint256[] providerIds) view returns((uint256,address,string,string,bool,string)[]) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetProviders(opts *bind.CallOpts, providerIds []*big.Int) ([]LiquidityBridgeContractLiquidityProvider, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getProviders", providerIds) + + if err != nil { + return *new([]LiquidityBridgeContractLiquidityProvider), err + } + + out0 := *abi.ConvertType(out[0], new([]LiquidityBridgeContractLiquidityProvider)).(*[]LiquidityBridgeContractLiquidityProvider) + + return out0, err + +} + +// GetProviders is a free data retrieval call binding the contract method 0x668dbd83. +// +// Solidity: function getProviders(uint256[] providerIds) view returns((uint256,address,string,string,bool,string)[]) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetProviders(providerIds []*big.Int) ([]LiquidityBridgeContractLiquidityProvider, error) { + return _LiquidityBridgeContract.Contract.GetProviders(&_LiquidityBridgeContract.CallOpts, providerIds) +} + +// GetProviders is a free data retrieval call binding the contract method 0x668dbd83. +// +// Solidity: function getProviders(uint256[] providerIds) view returns((uint256,address,string,string,bool,string)[]) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetProviders(providerIds []*big.Int) ([]LiquidityBridgeContractLiquidityProvider, error) { + return _LiquidityBridgeContract.Contract.GetProviders(&_LiquidityBridgeContract.CallOpts, providerIds) +} + +// GetRegisteredPegOutQuote is a free data retrieval call binding the contract method 0xe90d2ddb. +// +// Solidity: function getRegisteredPegOutQuote(bytes32 quoteHash) view returns((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256)) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetRegisteredPegOutQuote(opts *bind.CallOpts, quoteHash [32]byte) (QuotesPegOutQuote, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getRegisteredPegOutQuote", quoteHash) + + if err != nil { + return *new(QuotesPegOutQuote), err + } + + out0 := *abi.ConvertType(out[0], new(QuotesPegOutQuote)).(*QuotesPegOutQuote) + + return out0, err + +} + +// GetRegisteredPegOutQuote is a free data retrieval call binding the contract method 0xe90d2ddb. +// +// Solidity: function getRegisteredPegOutQuote(bytes32 quoteHash) view returns((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256)) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetRegisteredPegOutQuote(quoteHash [32]byte) (QuotesPegOutQuote, error) { + return _LiquidityBridgeContract.Contract.GetRegisteredPegOutQuote(&_LiquidityBridgeContract.CallOpts, quoteHash) +} + +// GetRegisteredPegOutQuote is a free data retrieval call binding the contract method 0xe90d2ddb. +// +// Solidity: function getRegisteredPegOutQuote(bytes32 quoteHash) view returns((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256)) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetRegisteredPegOutQuote(quoteHash [32]byte) (QuotesPegOutQuote, error) { + return _LiquidityBridgeContract.Contract.GetRegisteredPegOutQuote(&_LiquidityBridgeContract.CallOpts, quoteHash) +} + +// GetResignDelayBlocks is a free data retrieval call binding the contract method 0xbd5798c3. +// +// Solidity: function getResignDelayBlocks() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetResignDelayBlocks(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getResignDelayBlocks") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetResignDelayBlocks is a free data retrieval call binding the contract method 0xbd5798c3. +// +// Solidity: function getResignDelayBlocks() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetResignDelayBlocks() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetResignDelayBlocks(&_LiquidityBridgeContract.CallOpts) +} + +// GetResignDelayBlocks is a free data retrieval call binding the contract method 0xbd5798c3. +// +// Solidity: function getResignDelayBlocks() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetResignDelayBlocks() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetResignDelayBlocks(&_LiquidityBridgeContract.CallOpts) +} + +// GetRewardPercentage is a free data retrieval call binding the contract method 0xc7213163. +// +// Solidity: function getRewardPercentage() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetRewardPercentage(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "getRewardPercentage") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetRewardPercentage is a free data retrieval call binding the contract method 0xc7213163. +// +// Solidity: function getRewardPercentage() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetRewardPercentage() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetRewardPercentage(&_LiquidityBridgeContract.CallOpts) +} + +// GetRewardPercentage is a free data retrieval call binding the contract method 0xc7213163. +// +// Solidity: function getRewardPercentage() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetRewardPercentage() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.GetRewardPercentage(&_LiquidityBridgeContract.CallOpts) +} + +// HashPegoutQuote is a free data retrieval call binding the contract method 0x22140009. +// +// Solidity: function hashPegoutQuote((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote) view returns(bytes32) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) HashPegoutQuote(opts *bind.CallOpts, quote QuotesPegOutQuote) ([32]byte, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "hashPegoutQuote", quote) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// HashPegoutQuote is a free data retrieval call binding the contract method 0x22140009. +// +// Solidity: function hashPegoutQuote((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote) view returns(bytes32) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) HashPegoutQuote(quote QuotesPegOutQuote) ([32]byte, error) { + return _LiquidityBridgeContract.Contract.HashPegoutQuote(&_LiquidityBridgeContract.CallOpts, quote) +} + +// HashPegoutQuote is a free data retrieval call binding the contract method 0x22140009. +// +// Solidity: function hashPegoutQuote((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote) view returns(bytes32) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) HashPegoutQuote(quote QuotesPegOutQuote) ([32]byte, error) { + return _LiquidityBridgeContract.Contract.HashPegoutQuote(&_LiquidityBridgeContract.CallOpts, quote) +} + +// HashQuote is a free data retrieval call binding the contract method 0xb3a849aa. +// +// Solidity: function hashQuote((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) view returns(bytes32) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) HashQuote(opts *bind.CallOpts, quote QuotesPeginQuote) ([32]byte, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "hashQuote", quote) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// HashQuote is a free data retrieval call binding the contract method 0xb3a849aa. +// +// Solidity: function hashQuote((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) view returns(bytes32) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) HashQuote(quote QuotesPeginQuote) ([32]byte, error) { + return _LiquidityBridgeContract.Contract.HashQuote(&_LiquidityBridgeContract.CallOpts, quote) +} + +// HashQuote is a free data retrieval call binding the contract method 0xb3a849aa. +// +// Solidity: function hashQuote((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) view returns(bytes32) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) HashQuote(quote QuotesPeginQuote) ([32]byte, error) { + return _LiquidityBridgeContract.Contract.HashQuote(&_LiquidityBridgeContract.CallOpts, quote) +} + +// IsOperational is a free data retrieval call binding the contract method 0x457385f2. +// +// Solidity: function isOperational(address addr) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) IsOperational(opts *bind.CallOpts, addr common.Address) (bool, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "isOperational", addr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperational is a free data retrieval call binding the contract method 0x457385f2. +// +// Solidity: function isOperational(address addr) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) IsOperational(addr common.Address) (bool, error) { + return _LiquidityBridgeContract.Contract.IsOperational(&_LiquidityBridgeContract.CallOpts, addr) +} + +// IsOperational is a free data retrieval call binding the contract method 0x457385f2. +// +// Solidity: function isOperational(address addr) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) IsOperational(addr common.Address) (bool, error) { + return _LiquidityBridgeContract.Contract.IsOperational(&_LiquidityBridgeContract.CallOpts, addr) +} + +// IsOperationalForPegout is a free data retrieval call binding the contract method 0x4d0ec971. +// +// Solidity: function isOperationalForPegout(address addr) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) IsOperationalForPegout(opts *bind.CallOpts, addr common.Address) (bool, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "isOperationalForPegout", addr) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperationalForPegout is a free data retrieval call binding the contract method 0x4d0ec971. +// +// Solidity: function isOperationalForPegout(address addr) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) IsOperationalForPegout(addr common.Address) (bool, error) { + return _LiquidityBridgeContract.Contract.IsOperationalForPegout(&_LiquidityBridgeContract.CallOpts, addr) +} + +// IsOperationalForPegout is a free data retrieval call binding the contract method 0x4d0ec971. +// +// Solidity: function isOperationalForPegout(address addr) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) IsOperationalForPegout(addr common.Address) (bool, error) { + return _LiquidityBridgeContract.Contract.IsOperationalForPegout(&_LiquidityBridgeContract.CallOpts, addr) +} + +// IsPegOutQuoteCompleted is a free data retrieval call binding the contract method 0x54015ee0. +// +// Solidity: function isPegOutQuoteCompleted(bytes32 quoteHash) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) IsPegOutQuoteCompleted(opts *bind.CallOpts, quoteHash [32]byte) (bool, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "isPegOutQuoteCompleted", quoteHash) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsPegOutQuoteCompleted is a free data retrieval call binding the contract method 0x54015ee0. +// +// Solidity: function isPegOutQuoteCompleted(bytes32 quoteHash) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) IsPegOutQuoteCompleted(quoteHash [32]byte) (bool, error) { + return _LiquidityBridgeContract.Contract.IsPegOutQuoteCompleted(&_LiquidityBridgeContract.CallOpts, quoteHash) +} + +// IsPegOutQuoteCompleted is a free data retrieval call binding the contract method 0x54015ee0. +// +// Solidity: function isPegOutQuoteCompleted(bytes32 quoteHash) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) IsPegOutQuoteCompleted(quoteHash [32]byte) (bool, error) { + return _LiquidityBridgeContract.Contract.IsPegOutQuoteCompleted(&_LiquidityBridgeContract.CallOpts, quoteHash) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Owner() (common.Address, error) { + return _LiquidityBridgeContract.Contract.Owner(&_LiquidityBridgeContract.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) Owner() (common.Address, error) { + return _LiquidityBridgeContract.Contract.Owner(&_LiquidityBridgeContract.CallOpts) +} + +// ProductFeePercentage is a free data retrieval call binding the contract method 0x63c67135. +// +// Solidity: function productFeePercentage() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) ProductFeePercentage(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "productFeePercentage") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ProductFeePercentage is a free data retrieval call binding the contract method 0x63c67135. +// +// Solidity: function productFeePercentage() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) ProductFeePercentage() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.ProductFeePercentage(&_LiquidityBridgeContract.CallOpts) +} + +// ProductFeePercentage is a free data retrieval call binding the contract method 0x63c67135. +// +// Solidity: function productFeePercentage() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) ProductFeePercentage() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.ProductFeePercentage(&_LiquidityBridgeContract.CallOpts) +} + +// ProviderId is a free data retrieval call binding the contract method 0x8490a8df. +// +// Solidity: function providerId() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) ProviderId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "providerId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ProviderId is a free data retrieval call binding the contract method 0x8490a8df. +// +// Solidity: function providerId() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) ProviderId() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.ProviderId(&_LiquidityBridgeContract.CallOpts) +} + +// ProviderId is a free data retrieval call binding the contract method 0x8490a8df. +// +// Solidity: function providerId() view returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) ProviderId() (*big.Int, error) { + return _LiquidityBridgeContract.Contract.ProviderId(&_LiquidityBridgeContract.CallOpts) +} + +// ValidatePeginDepositAddress is a free data retrieval call binding the contract method 0x79b9550b. +// +// Solidity: function validatePeginDepositAddress((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes depositAddress) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) ValidatePeginDepositAddress(opts *bind.CallOpts, quote QuotesPeginQuote, depositAddress []byte) (bool, error) { + var out []interface{} + err := _LiquidityBridgeContract.contract.Call(opts, &out, "validatePeginDepositAddress", quote, depositAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ValidatePeginDepositAddress is a free data retrieval call binding the contract method 0x79b9550b. +// +// Solidity: function validatePeginDepositAddress((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes depositAddress) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) ValidatePeginDepositAddress(quote QuotesPeginQuote, depositAddress []byte) (bool, error) { + return _LiquidityBridgeContract.Contract.ValidatePeginDepositAddress(&_LiquidityBridgeContract.CallOpts, quote, depositAddress) +} + +// ValidatePeginDepositAddress is a free data retrieval call binding the contract method 0x79b9550b. +// +// Solidity: function validatePeginDepositAddress((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes depositAddress) view returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) ValidatePeginDepositAddress(quote QuotesPeginQuote, depositAddress []byte) (bool, error) { + return _LiquidityBridgeContract.Contract.ValidatePeginDepositAddress(&_LiquidityBridgeContract.CallOpts, quote, depositAddress) +} + +// AddCollateral is a paid mutator transaction binding the contract method 0x9e816999. +// +// Solidity: function addCollateral() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) AddCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "addCollateral") +} + +// AddCollateral is a paid mutator transaction binding the contract method 0x9e816999. +// +// Solidity: function addCollateral() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) AddCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.AddCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// AddCollateral is a paid mutator transaction binding the contract method 0x9e816999. +// +// Solidity: function addCollateral() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) AddCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.AddCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// AddPegoutCollateral is a paid mutator transaction binding the contract method 0x4198687e. +// +// Solidity: function addPegoutCollateral() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) AddPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "addPegoutCollateral") +} + +// AddPegoutCollateral is a paid mutator transaction binding the contract method 0x4198687e. +// +// Solidity: function addPegoutCollateral() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) AddPegoutCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.AddPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// AddPegoutCollateral is a paid mutator transaction binding the contract method 0x4198687e. +// +// Solidity: function addPegoutCollateral() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) AddPegoutCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.AddPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// CallForUser is a paid mutator transaction binding the contract method 0x7aefa8c2. +// +// Solidity: function callForUser((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) payable returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) CallForUser(opts *bind.TransactOpts, quote QuotesPeginQuote) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "callForUser", quote) +} + +// CallForUser is a paid mutator transaction binding the contract method 0x7aefa8c2. +// +// Solidity: function callForUser((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) payable returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) CallForUser(quote QuotesPeginQuote) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.CallForUser(&_LiquidityBridgeContract.TransactOpts, quote) +} + +// CallForUser is a paid mutator transaction binding the contract method 0x7aefa8c2. +// +// Solidity: function callForUser((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) payable returns(bool) +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) CallForUser(quote QuotesPeginQuote) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.CallForUser(&_LiquidityBridgeContract.TransactOpts, quote) +} + +// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0. +// +// Solidity: function deposit() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Deposit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "deposit") +} + +// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0. +// +// Solidity: function deposit() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Deposit() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Deposit(&_LiquidityBridgeContract.TransactOpts) +} + +// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0. +// +// Solidity: function deposit() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Deposit() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Deposit(&_LiquidityBridgeContract.TransactOpts) +} + +// DepositPegout is a paid mutator transaction binding the contract method 0x8beb537a. +// +// Solidity: function depositPegout((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote, bytes signature) payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) DepositPegout(opts *bind.TransactOpts, quote QuotesPegOutQuote, signature []byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "depositPegout", quote, signature) +} + +// DepositPegout is a paid mutator transaction binding the contract method 0x8beb537a. +// +// Solidity: function depositPegout((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote, bytes signature) payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) DepositPegout(quote QuotesPegOutQuote, signature []byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.DepositPegout(&_LiquidityBridgeContract.TransactOpts, quote, signature) +} + +// DepositPegout is a paid mutator transaction binding the contract method 0x8beb537a. +// +// Solidity: function depositPegout((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote, bytes signature) payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) DepositPegout(quote QuotesPegOutQuote, signature []byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.DepositPegout(&_LiquidityBridgeContract.TransactOpts, quote, signature) +} + +// InitializeV2 is a paid mutator transaction binding the contract method 0x2490fe36. +// +// Solidity: function initializeV2(uint256 _productFeePercentage, address _daoFeeCollectorAddress) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) InitializeV2(opts *bind.TransactOpts, _productFeePercentage *big.Int, _daoFeeCollectorAddress common.Address) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "initializeV2", _productFeePercentage, _daoFeeCollectorAddress) +} + +// InitializeV2 is a paid mutator transaction binding the contract method 0x2490fe36. +// +// Solidity: function initializeV2(uint256 _productFeePercentage, address _daoFeeCollectorAddress) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) InitializeV2(_productFeePercentage *big.Int, _daoFeeCollectorAddress common.Address) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.InitializeV2(&_LiquidityBridgeContract.TransactOpts, _productFeePercentage, _daoFeeCollectorAddress) +} + +// InitializeV2 is a paid mutator transaction binding the contract method 0x2490fe36. +// +// Solidity: function initializeV2(uint256 _productFeePercentage, address _daoFeeCollectorAddress) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) InitializeV2(_productFeePercentage *big.Int, _daoFeeCollectorAddress common.Address) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.InitializeV2(&_LiquidityBridgeContract.TransactOpts, _productFeePercentage, _daoFeeCollectorAddress) +} + +// RefundPegOut is a paid mutator transaction binding the contract method 0xd6c70de8. +// +// Solidity: function refundPegOut(bytes32 quoteHash, bytes btcTx, bytes32 btcBlockHeaderHash, uint256 partialMerkleTree, bytes32[] merkleBranchHashes) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "refundPegOut", quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) +} + +// RefundPegOut is a paid mutator transaction binding the contract method 0xd6c70de8. +// +// Solidity: function refundPegOut(bytes32 quoteHash, bytes btcTx, bytes32 btcBlockHeaderHash, uint256 partialMerkleTree, bytes32[] merkleBranchHashes) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RefundPegOut(quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RefundPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) +} + +// RefundPegOut is a paid mutator transaction binding the contract method 0xd6c70de8. +// +// Solidity: function refundPegOut(bytes32 quoteHash, bytes btcTx, bytes32 btcBlockHeaderHash, uint256 partialMerkleTree, bytes32[] merkleBranchHashes) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RefundPegOut(quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RefundPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) +} + +// RefundUserPegOut is a paid mutator transaction binding the contract method 0x8f91797d. +// +// Solidity: function refundUserPegOut(bytes32 quoteHash) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RefundUserPegOut(opts *bind.TransactOpts, quoteHash [32]byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "refundUserPegOut", quoteHash) +} + +// RefundUserPegOut is a paid mutator transaction binding the contract method 0x8f91797d. +// +// Solidity: function refundUserPegOut(bytes32 quoteHash) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RefundUserPegOut(quoteHash [32]byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RefundUserPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash) +} + +// RefundUserPegOut is a paid mutator transaction binding the contract method 0x8f91797d. +// +// Solidity: function refundUserPegOut(bytes32 quoteHash) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RefundUserPegOut(quoteHash [32]byte) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RefundUserPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash) +} + +// Register is a paid mutator transaction binding the contract method 0x41705518. +// +// Solidity: function register(string _name, string _apiBaseUrl, bool _status, string _providerType) payable returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Register(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "register", _name, _apiBaseUrl, _status, _providerType) +} + +// Register is a paid mutator transaction binding the contract method 0x41705518. +// +// Solidity: function register(string _name, string _apiBaseUrl, bool _status, string _providerType) payable returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Register(_name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Register(&_LiquidityBridgeContract.TransactOpts, _name, _apiBaseUrl, _status, _providerType) +} + +// Register is a paid mutator transaction binding the contract method 0x41705518. +// +// Solidity: function register(string _name, string _apiBaseUrl, bool _status, string _providerType) payable returns(uint256) +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Register(_name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Register(&_LiquidityBridgeContract.TransactOpts, _name, _apiBaseUrl, _status, _providerType) +} + +// RegisterPegIn is a paid mutator transaction binding the contract method 0x2d67952c. +// +// Solidity: function registerPegIn((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes signature, bytes btcRawTransaction, bytes partialMerkleTree, uint256 height) returns(int256) +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RegisterPegIn(opts *bind.TransactOpts, quote QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "registerPegIn", quote, signature, btcRawTransaction, partialMerkleTree, height) +} + +// RegisterPegIn is a paid mutator transaction binding the contract method 0x2d67952c. +// +// Solidity: function registerPegIn((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes signature, bytes btcRawTransaction, bytes partialMerkleTree, uint256 height) returns(int256) +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RegisterPegIn(quote QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RegisterPegIn(&_LiquidityBridgeContract.TransactOpts, quote, signature, btcRawTransaction, partialMerkleTree, height) +} + +// RegisterPegIn is a paid mutator transaction binding the contract method 0x2d67952c. +// +// Solidity: function registerPegIn((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes signature, bytes btcRawTransaction, bytes partialMerkleTree, uint256 height) returns(int256) +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RegisterPegIn(quote QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RegisterPegIn(&_LiquidityBridgeContract.TransactOpts, quote, signature, btcRawTransaction, partialMerkleTree, height) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RenounceOwnership() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RenounceOwnership(&_LiquidityBridgeContract.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.RenounceOwnership(&_LiquidityBridgeContract.TransactOpts) +} + +// Resign is a paid mutator transaction binding the contract method 0x69652fcf. +// +// Solidity: function resign() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Resign(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "resign") +} + +// Resign is a paid mutator transaction binding the contract method 0x69652fcf. +// +// Solidity: function resign() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Resign() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Resign(&_LiquidityBridgeContract.TransactOpts) +} + +// Resign is a paid mutator transaction binding the contract method 0x69652fcf. +// +// Solidity: function resign() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Resign() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Resign(&_LiquidityBridgeContract.TransactOpts) +} + +// SetProviderStatus is a paid mutator transaction binding the contract method 0x72cbf4e8. +// +// Solidity: function setProviderStatus(uint256 _providerId, bool status) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) SetProviderStatus(opts *bind.TransactOpts, _providerId *big.Int, status bool) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "setProviderStatus", _providerId, status) +} + +// SetProviderStatus is a paid mutator transaction binding the contract method 0x72cbf4e8. +// +// Solidity: function setProviderStatus(uint256 _providerId, bool status) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) SetProviderStatus(_providerId *big.Int, status bool) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.SetProviderStatus(&_LiquidityBridgeContract.TransactOpts, _providerId, status) +} + +// SetProviderStatus is a paid mutator transaction binding the contract method 0x72cbf4e8. +// +// Solidity: function setProviderStatus(uint256 _providerId, bool status) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) SetProviderStatus(_providerId *big.Int, status bool) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.SetProviderStatus(&_LiquidityBridgeContract.TransactOpts, _providerId, status) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.TransferOwnership(&_LiquidityBridgeContract.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.TransferOwnership(&_LiquidityBridgeContract.TransactOpts, newOwner) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d. +// +// Solidity: function withdraw(uint256 amount) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Withdraw(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "withdraw", amount) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d. +// +// Solidity: function withdraw(uint256 amount) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Withdraw(amount *big.Int) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Withdraw(&_LiquidityBridgeContract.TransactOpts, amount) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d. +// +// Solidity: function withdraw(uint256 amount) returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Withdraw(amount *big.Int) (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Withdraw(&_LiquidityBridgeContract.TransactOpts, amount) +} + +// WithdrawCollateral is a paid mutator transaction binding the contract method 0x59c153be. +// +// Solidity: function withdrawCollateral() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) WithdrawCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "withdrawCollateral") +} + +// WithdrawCollateral is a paid mutator transaction binding the contract method 0x59c153be. +// +// Solidity: function withdrawCollateral() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) WithdrawCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.WithdrawCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// WithdrawCollateral is a paid mutator transaction binding the contract method 0x59c153be. +// +// Solidity: function withdrawCollateral() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) WithdrawCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.WithdrawCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// WithdrawPegoutCollateral is a paid mutator transaction binding the contract method 0x35510a7d. +// +// Solidity: function withdrawPegoutCollateral() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) WithdrawPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.Transact(opts, "withdrawPegoutCollateral") +} + +// WithdrawPegoutCollateral is a paid mutator transaction binding the contract method 0x35510a7d. +// +// Solidity: function withdrawPegoutCollateral() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) WithdrawPegoutCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.WithdrawPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// WithdrawPegoutCollateral is a paid mutator transaction binding the contract method 0x35510a7d. +// +// Solidity: function withdrawPegoutCollateral() returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) WithdrawPegoutCollateral() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.WithdrawPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LiquidityBridgeContract.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Receive() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Receive(&_LiquidityBridgeContract.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Receive() (*types.Transaction, error) { + return _LiquidityBridgeContract.Contract.Receive(&_LiquidityBridgeContract.TransactOpts) +} + +// LiquidityBridgeContractBalanceDecreaseIterator is returned from FilterBalanceDecrease and is used to iterate over the raw logs and unpacked data for BalanceDecrease events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractBalanceDecreaseIterator struct { + Event *LiquidityBridgeContractBalanceDecrease // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractBalanceDecreaseIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractBalanceDecrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractBalanceDecrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractBalanceDecreaseIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractBalanceDecreaseIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractBalanceDecrease represents a BalanceDecrease event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractBalanceDecrease struct { + Dest common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBalanceDecrease is a free log retrieval operation binding the contract event 0x8e51a4493a6f66c76e13fd9e3b754eafbfe21343c04508deb61be8ccc0064587. +// +// Solidity: event BalanceDecrease(address dest, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterBalanceDecrease(opts *bind.FilterOpts) (*LiquidityBridgeContractBalanceDecreaseIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "BalanceDecrease") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractBalanceDecreaseIterator{contract: _LiquidityBridgeContract.contract, event: "BalanceDecrease", logs: logs, sub: sub}, nil +} + +// WatchBalanceDecrease is a free log subscription operation binding the contract event 0x8e51a4493a6f66c76e13fd9e3b754eafbfe21343c04508deb61be8ccc0064587. +// +// Solidity: event BalanceDecrease(address dest, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchBalanceDecrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractBalanceDecrease) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "BalanceDecrease") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractBalanceDecrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceDecrease", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBalanceDecrease is a log parse operation binding the contract event 0x8e51a4493a6f66c76e13fd9e3b754eafbfe21343c04508deb61be8ccc0064587. +// +// Solidity: event BalanceDecrease(address dest, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseBalanceDecrease(log types.Log) (*LiquidityBridgeContractBalanceDecrease, error) { + event := new(LiquidityBridgeContractBalanceDecrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceDecrease", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractBalanceIncreaseIterator is returned from FilterBalanceIncrease and is used to iterate over the raw logs and unpacked data for BalanceIncrease events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractBalanceIncreaseIterator struct { + Event *LiquidityBridgeContractBalanceIncrease // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractBalanceIncreaseIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractBalanceIncrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractBalanceIncrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractBalanceIncreaseIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractBalanceIncreaseIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractBalanceIncrease represents a BalanceIncrease event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractBalanceIncrease struct { + Dest common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBalanceIncrease is a free log retrieval operation binding the contract event 0x42cfb81a915ac5a674852db250bf722637bee705a267633b68cab3a2dde06f53. +// +// Solidity: event BalanceIncrease(address dest, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterBalanceIncrease(opts *bind.FilterOpts) (*LiquidityBridgeContractBalanceIncreaseIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "BalanceIncrease") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractBalanceIncreaseIterator{contract: _LiquidityBridgeContract.contract, event: "BalanceIncrease", logs: logs, sub: sub}, nil +} + +// WatchBalanceIncrease is a free log subscription operation binding the contract event 0x42cfb81a915ac5a674852db250bf722637bee705a267633b68cab3a2dde06f53. +// +// Solidity: event BalanceIncrease(address dest, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchBalanceIncrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractBalanceIncrease) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "BalanceIncrease") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractBalanceIncrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceIncrease", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBalanceIncrease is a log parse operation binding the contract event 0x42cfb81a915ac5a674852db250bf722637bee705a267633b68cab3a2dde06f53. +// +// Solidity: event BalanceIncrease(address dest, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseBalanceIncrease(log types.Log) (*LiquidityBridgeContractBalanceIncrease, error) { + event := new(LiquidityBridgeContractBalanceIncrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceIncrease", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractBridgeCapExceededIterator is returned from FilterBridgeCapExceeded and is used to iterate over the raw logs and unpacked data for BridgeCapExceeded events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractBridgeCapExceededIterator struct { + Event *LiquidityBridgeContractBridgeCapExceeded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractBridgeCapExceededIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractBridgeCapExceeded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractBridgeCapExceeded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractBridgeCapExceededIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractBridgeCapExceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractBridgeCapExceeded represents a BridgeCapExceeded event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractBridgeCapExceeded struct { + QuoteHash [32]byte + ErrorCode *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBridgeCapExceeded is a free log retrieval operation binding the contract event 0xfb209329d5ab5b7bcb2e92f45f4534814b6e68fa5ad1f171dabc1d17d26f0ebe. +// +// Solidity: event BridgeCapExceeded(bytes32 quoteHash, int256 errorCode) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterBridgeCapExceeded(opts *bind.FilterOpts) (*LiquidityBridgeContractBridgeCapExceededIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "BridgeCapExceeded") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractBridgeCapExceededIterator{contract: _LiquidityBridgeContract.contract, event: "BridgeCapExceeded", logs: logs, sub: sub}, nil +} + +// WatchBridgeCapExceeded is a free log subscription operation binding the contract event 0xfb209329d5ab5b7bcb2e92f45f4534814b6e68fa5ad1f171dabc1d17d26f0ebe. +// +// Solidity: event BridgeCapExceeded(bytes32 quoteHash, int256 errorCode) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchBridgeCapExceeded(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractBridgeCapExceeded) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "BridgeCapExceeded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractBridgeCapExceeded) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BridgeCapExceeded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBridgeCapExceeded is a log parse operation binding the contract event 0xfb209329d5ab5b7bcb2e92f45f4534814b6e68fa5ad1f171dabc1d17d26f0ebe. +// +// Solidity: event BridgeCapExceeded(bytes32 quoteHash, int256 errorCode) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseBridgeCapExceeded(log types.Log) (*LiquidityBridgeContractBridgeCapExceeded, error) { + event := new(LiquidityBridgeContractBridgeCapExceeded) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BridgeCapExceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractCallForUserIterator is returned from FilterCallForUser and is used to iterate over the raw logs and unpacked data for CallForUser events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractCallForUserIterator struct { + Event *LiquidityBridgeContractCallForUser // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractCallForUserIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractCallForUser) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractCallForUser) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractCallForUserIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractCallForUserIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractCallForUser represents a CallForUser event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractCallForUser struct { + From common.Address + Dest common.Address + GasLimit *big.Int + Value *big.Int + Data []byte + Success bool + QuoteHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCallForUser is a free log retrieval operation binding the contract event 0xbfc7404e6fe464f0646fe2c6ab942b92d56be722bb39f8c6bc4830d2d32fb80d. +// +// Solidity: event CallForUser(address indexed from, address indexed dest, uint256 gasLimit, uint256 value, bytes data, bool success, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterCallForUser(opts *bind.FilterOpts, from []common.Address, dest []common.Address) (*LiquidityBridgeContractCallForUserIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var destRule []interface{} + for _, destItem := range dest { + destRule = append(destRule, destItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "CallForUser", fromRule, destRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractCallForUserIterator{contract: _LiquidityBridgeContract.contract, event: "CallForUser", logs: logs, sub: sub}, nil +} + +// WatchCallForUser is a free log subscription operation binding the contract event 0xbfc7404e6fe464f0646fe2c6ab942b92d56be722bb39f8c6bc4830d2d32fb80d. +// +// Solidity: event CallForUser(address indexed from, address indexed dest, uint256 gasLimit, uint256 value, bytes data, bool success, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchCallForUser(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractCallForUser, from []common.Address, dest []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var destRule []interface{} + for _, destItem := range dest { + destRule = append(destRule, destItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "CallForUser", fromRule, destRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractCallForUser) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CallForUser", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCallForUser is a log parse operation binding the contract event 0xbfc7404e6fe464f0646fe2c6ab942b92d56be722bb39f8c6bc4830d2d32fb80d. +// +// Solidity: event CallForUser(address indexed from, address indexed dest, uint256 gasLimit, uint256 value, bytes data, bool success, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseCallForUser(log types.Log) (*LiquidityBridgeContractCallForUser, error) { + event := new(LiquidityBridgeContractCallForUser) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CallForUser", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractCollateralIncreaseIterator is returned from FilterCollateralIncrease and is used to iterate over the raw logs and unpacked data for CollateralIncrease events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractCollateralIncreaseIterator struct { + Event *LiquidityBridgeContractCollateralIncrease // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractCollateralIncreaseIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractCollateralIncrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractCollateralIncrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractCollateralIncreaseIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractCollateralIncreaseIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractCollateralIncrease represents a CollateralIncrease event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractCollateralIncrease struct { + From common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCollateralIncrease is a free log retrieval operation binding the contract event 0x456e0f4ea86ac283092c750200e8c877f6ad8901ae575f90e02081acd455af84. +// +// Solidity: event CollateralIncrease(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterCollateralIncrease(opts *bind.FilterOpts) (*LiquidityBridgeContractCollateralIncreaseIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "CollateralIncrease") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractCollateralIncreaseIterator{contract: _LiquidityBridgeContract.contract, event: "CollateralIncrease", logs: logs, sub: sub}, nil +} + +// WatchCollateralIncrease is a free log subscription operation binding the contract event 0x456e0f4ea86ac283092c750200e8c877f6ad8901ae575f90e02081acd455af84. +// +// Solidity: event CollateralIncrease(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchCollateralIncrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractCollateralIncrease) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "CollateralIncrease") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractCollateralIncrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CollateralIncrease", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCollateralIncrease is a log parse operation binding the contract event 0x456e0f4ea86ac283092c750200e8c877f6ad8901ae575f90e02081acd455af84. +// +// Solidity: event CollateralIncrease(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseCollateralIncrease(log types.Log) (*LiquidityBridgeContractCollateralIncrease, error) { + event := new(LiquidityBridgeContractCollateralIncrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CollateralIncrease", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractDaoFeeSentIterator is returned from FilterDaoFeeSent and is used to iterate over the raw logs and unpacked data for DaoFeeSent events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractDaoFeeSentIterator struct { + Event *LiquidityBridgeContractDaoFeeSent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractDaoFeeSentIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractDaoFeeSent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractDaoFeeSent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractDaoFeeSentIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractDaoFeeSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractDaoFeeSent represents a DaoFeeSent event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractDaoFeeSent struct { + QuoteHash [32]byte + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDaoFeeSent is a free log retrieval operation binding the contract event 0x58e13ac0d5c8d27d14009841e72ac8b1858e2709c2c99af2075d9bb5f340ecfc. +// +// Solidity: event DaoFeeSent(bytes32 indexed quoteHash, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterDaoFeeSent(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractDaoFeeSentIterator, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "DaoFeeSent", quoteHashRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractDaoFeeSentIterator{contract: _LiquidityBridgeContract.contract, event: "DaoFeeSent", logs: logs, sub: sub}, nil +} + +// WatchDaoFeeSent is a free log subscription operation binding the contract event 0x58e13ac0d5c8d27d14009841e72ac8b1858e2709c2c99af2075d9bb5f340ecfc. +// +// Solidity: event DaoFeeSent(bytes32 indexed quoteHash, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchDaoFeeSent(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractDaoFeeSent, quoteHash [][32]byte) (event.Subscription, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "DaoFeeSent", quoteHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractDaoFeeSent) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "DaoFeeSent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDaoFeeSent is a log parse operation binding the contract event 0x58e13ac0d5c8d27d14009841e72ac8b1858e2709c2c99af2075d9bb5f340ecfc. +// +// Solidity: event DaoFeeSent(bytes32 indexed quoteHash, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseDaoFeeSent(log types.Log) (*LiquidityBridgeContractDaoFeeSent, error) { + event := new(LiquidityBridgeContractDaoFeeSent) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "DaoFeeSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractInitializedIterator struct { + Event *LiquidityBridgeContractInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractInitialized represents a Initialized event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterInitialized(opts *bind.FilterOpts) (*LiquidityBridgeContractInitializedIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractInitializedIterator{contract: _LiquidityBridgeContract.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractInitialized) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractInitialized) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseInitialized(log types.Log) (*LiquidityBridgeContractInitialized, error) { + event := new(LiquidityBridgeContractInitialized) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractOwnershipTransferredIterator struct { + Event *LiquidityBridgeContractOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractOwnershipTransferred represents a OwnershipTransferred event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*LiquidityBridgeContractOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractOwnershipTransferredIterator{contract: _LiquidityBridgeContract.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractOwnershipTransferred) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseOwnershipTransferred(log types.Log) (*LiquidityBridgeContractOwnershipTransferred, error) { + event := new(LiquidityBridgeContractOwnershipTransferred) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPegInRegisteredIterator is returned from FilterPegInRegistered and is used to iterate over the raw logs and unpacked data for PegInRegistered events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegInRegisteredIterator struct { + Event *LiquidityBridgeContractPegInRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPegInRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegInRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegInRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPegInRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPegInRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPegInRegistered represents a PegInRegistered event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegInRegistered struct { + QuoteHash [32]byte + TransferredAmount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPegInRegistered is a free log retrieval operation binding the contract event 0x0629ae9d1dc61501b0ca90670a9a9b88daaf7504b54537b53e1219de794c63d2. +// +// Solidity: event PegInRegistered(bytes32 indexed quoteHash, int256 transferredAmount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegInRegistered(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractPegInRegisteredIterator, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegInRegistered", quoteHashRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPegInRegisteredIterator{contract: _LiquidityBridgeContract.contract, event: "PegInRegistered", logs: logs, sub: sub}, nil +} + +// WatchPegInRegistered is a free log subscription operation binding the contract event 0x0629ae9d1dc61501b0ca90670a9a9b88daaf7504b54537b53e1219de794c63d2. +// +// Solidity: event PegInRegistered(bytes32 indexed quoteHash, int256 transferredAmount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegInRegistered(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegInRegistered, quoteHash [][32]byte) (event.Subscription, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegInRegistered", quoteHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPegInRegistered) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegInRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePegInRegistered is a log parse operation binding the contract event 0x0629ae9d1dc61501b0ca90670a9a9b88daaf7504b54537b53e1219de794c63d2. +// +// Solidity: event PegInRegistered(bytes32 indexed quoteHash, int256 transferredAmount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegInRegistered(log types.Log) (*LiquidityBridgeContractPegInRegistered, error) { + event := new(LiquidityBridgeContractPegInRegistered) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegInRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPegOutDepositIterator is returned from FilterPegOutDeposit and is used to iterate over the raw logs and unpacked data for PegOutDeposit events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegOutDepositIterator struct { + Event *LiquidityBridgeContractPegOutDeposit // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPegOutDepositIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegOutDeposit) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegOutDeposit) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPegOutDepositIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPegOutDepositIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPegOutDeposit represents a PegOutDeposit event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegOutDeposit struct { + QuoteHash [32]byte + Sender common.Address + Amount *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPegOutDeposit is a free log retrieval operation binding the contract event 0xb1bc7bfc0dab19777eb03aa0a5643378fc9f186c8fc5a36620d21136fbea570f. +// +// Solidity: event PegOutDeposit(bytes32 indexed quoteHash, address indexed sender, uint256 amount, uint256 timestamp) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegOutDeposit(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address) (*LiquidityBridgeContractPegOutDepositIterator, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegOutDeposit", quoteHashRule, senderRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPegOutDepositIterator{contract: _LiquidityBridgeContract.contract, event: "PegOutDeposit", logs: logs, sub: sub}, nil +} + +// WatchPegOutDeposit is a free log subscription operation binding the contract event 0xb1bc7bfc0dab19777eb03aa0a5643378fc9f186c8fc5a36620d21136fbea570f. +// +// Solidity: event PegOutDeposit(bytes32 indexed quoteHash, address indexed sender, uint256 amount, uint256 timestamp) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegOutDeposit(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegOutDeposit, quoteHash [][32]byte, sender []common.Address) (event.Subscription, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegOutDeposit", quoteHashRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPegOutDeposit) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutDeposit", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePegOutDeposit is a log parse operation binding the contract event 0xb1bc7bfc0dab19777eb03aa0a5643378fc9f186c8fc5a36620d21136fbea570f. +// +// Solidity: event PegOutDeposit(bytes32 indexed quoteHash, address indexed sender, uint256 amount, uint256 timestamp) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegOutDeposit(log types.Log) (*LiquidityBridgeContractPegOutDeposit, error) { + event := new(LiquidityBridgeContractPegOutDeposit) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutDeposit", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPegOutRefundedIterator is returned from FilterPegOutRefunded and is used to iterate over the raw logs and unpacked data for PegOutRefunded events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegOutRefundedIterator struct { + Event *LiquidityBridgeContractPegOutRefunded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPegOutRefundedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegOutRefunded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegOutRefunded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPegOutRefundedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPegOutRefundedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPegOutRefunded represents a PegOutRefunded event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegOutRefunded struct { + QuoteHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPegOutRefunded is a free log retrieval operation binding the contract event 0xb781856ec73fd0dc39351043d1634ea22cd3277b0866ab93e7ec1801766bb384. +// +// Solidity: event PegOutRefunded(bytes32 indexed quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegOutRefunded(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractPegOutRefundedIterator, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegOutRefunded", quoteHashRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPegOutRefundedIterator{contract: _LiquidityBridgeContract.contract, event: "PegOutRefunded", logs: logs, sub: sub}, nil +} + +// WatchPegOutRefunded is a free log subscription operation binding the contract event 0xb781856ec73fd0dc39351043d1634ea22cd3277b0866ab93e7ec1801766bb384. +// +// Solidity: event PegOutRefunded(bytes32 indexed quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegOutRefunded(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegOutRefunded, quoteHash [][32]byte) (event.Subscription, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegOutRefunded", quoteHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPegOutRefunded) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutRefunded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePegOutRefunded is a log parse operation binding the contract event 0xb781856ec73fd0dc39351043d1634ea22cd3277b0866ab93e7ec1801766bb384. +// +// Solidity: event PegOutRefunded(bytes32 indexed quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegOutRefunded(log types.Log) (*LiquidityBridgeContractPegOutRefunded, error) { + event := new(LiquidityBridgeContractPegOutRefunded) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutRefunded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPegOutUserRefundedIterator is returned from FilterPegOutUserRefunded and is used to iterate over the raw logs and unpacked data for PegOutUserRefunded events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegOutUserRefundedIterator struct { + Event *LiquidityBridgeContractPegOutUserRefunded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPegOutUserRefundedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegOutUserRefunded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegOutUserRefunded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPegOutUserRefundedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPegOutUserRefundedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPegOutUserRefunded represents a PegOutUserRefunded event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegOutUserRefunded struct { + QuoteHash [32]byte + Value *big.Int + UserAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPegOutUserRefunded is a free log retrieval operation binding the contract event 0x9ccbeffc442024e2a6ade18ff0978af9a4c4d6562ae38adb51ccf8256cf42b41. +// +// Solidity: event PegOutUserRefunded(bytes32 indexed quoteHash, uint256 value, address userAddress) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegOutUserRefunded(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractPegOutUserRefundedIterator, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegOutUserRefunded", quoteHashRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPegOutUserRefundedIterator{contract: _LiquidityBridgeContract.contract, event: "PegOutUserRefunded", logs: logs, sub: sub}, nil +} + +// WatchPegOutUserRefunded is a free log subscription operation binding the contract event 0x9ccbeffc442024e2a6ade18ff0978af9a4c4d6562ae38adb51ccf8256cf42b41. +// +// Solidity: event PegOutUserRefunded(bytes32 indexed quoteHash, uint256 value, address userAddress) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegOutUserRefunded(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegOutUserRefunded, quoteHash [][32]byte) (event.Subscription, error) { + + var quoteHashRule []interface{} + for _, quoteHashItem := range quoteHash { + quoteHashRule = append(quoteHashRule, quoteHashItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegOutUserRefunded", quoteHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPegOutUserRefunded) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutUserRefunded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePegOutUserRefunded is a log parse operation binding the contract event 0x9ccbeffc442024e2a6ade18ff0978af9a4c4d6562ae38adb51ccf8256cf42b41. +// +// Solidity: event PegOutUserRefunded(bytes32 indexed quoteHash, uint256 value, address userAddress) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegOutUserRefunded(log types.Log) (*LiquidityBridgeContractPegOutUserRefunded, error) { + event := new(LiquidityBridgeContractPegOutUserRefunded) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutUserRefunded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPegoutCollateralIncreaseIterator is returned from FilterPegoutCollateralIncrease and is used to iterate over the raw logs and unpacked data for PegoutCollateralIncrease events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegoutCollateralIncreaseIterator struct { + Event *LiquidityBridgeContractPegoutCollateralIncrease // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPegoutCollateralIncreaseIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegoutCollateralIncrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegoutCollateralIncrease) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPegoutCollateralIncreaseIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPegoutCollateralIncreaseIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPegoutCollateralIncrease represents a PegoutCollateralIncrease event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegoutCollateralIncrease struct { + From common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPegoutCollateralIncrease is a free log retrieval operation binding the contract event 0x873d5a2949567203ad4f0cceef41c2813c87b9a397ee777d87a8acdaec2c6fa9. +// +// Solidity: event PegoutCollateralIncrease(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegoutCollateralIncrease(opts *bind.FilterOpts) (*LiquidityBridgeContractPegoutCollateralIncreaseIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegoutCollateralIncrease") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPegoutCollateralIncreaseIterator{contract: _LiquidityBridgeContract.contract, event: "PegoutCollateralIncrease", logs: logs, sub: sub}, nil +} + +// WatchPegoutCollateralIncrease is a free log subscription operation binding the contract event 0x873d5a2949567203ad4f0cceef41c2813c87b9a397ee777d87a8acdaec2c6fa9. +// +// Solidity: event PegoutCollateralIncrease(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegoutCollateralIncrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegoutCollateralIncrease) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegoutCollateralIncrease") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPegoutCollateralIncrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutCollateralIncrease", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePegoutCollateralIncrease is a log parse operation binding the contract event 0x873d5a2949567203ad4f0cceef41c2813c87b9a397ee777d87a8acdaec2c6fa9. +// +// Solidity: event PegoutCollateralIncrease(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegoutCollateralIncrease(log types.Log) (*LiquidityBridgeContractPegoutCollateralIncrease, error) { + event := new(LiquidityBridgeContractPegoutCollateralIncrease) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutCollateralIncrease", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPegoutWithdrawCollateralIterator is returned from FilterPegoutWithdrawCollateral and is used to iterate over the raw logs and unpacked data for PegoutWithdrawCollateral events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegoutWithdrawCollateralIterator struct { + Event *LiquidityBridgeContractPegoutWithdrawCollateral // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPegoutWithdrawCollateralIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegoutWithdrawCollateral) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPegoutWithdrawCollateral) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPegoutWithdrawCollateralIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPegoutWithdrawCollateralIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPegoutWithdrawCollateral represents a PegoutWithdrawCollateral event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPegoutWithdrawCollateral struct { + From common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPegoutWithdrawCollateral is a free log retrieval operation binding the contract event 0xfc72299650b405e7b0480ca8fb0fb3948fb10a77ac02f797cc9de1f4aaa55db7. +// +// Solidity: event PegoutWithdrawCollateral(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegoutWithdrawCollateral(opts *bind.FilterOpts) (*LiquidityBridgeContractPegoutWithdrawCollateralIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegoutWithdrawCollateral") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPegoutWithdrawCollateralIterator{contract: _LiquidityBridgeContract.contract, event: "PegoutWithdrawCollateral", logs: logs, sub: sub}, nil +} + +// WatchPegoutWithdrawCollateral is a free log subscription operation binding the contract event 0xfc72299650b405e7b0480ca8fb0fb3948fb10a77ac02f797cc9de1f4aaa55db7. +// +// Solidity: event PegoutWithdrawCollateral(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegoutWithdrawCollateral(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegoutWithdrawCollateral) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegoutWithdrawCollateral") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPegoutWithdrawCollateral) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutWithdrawCollateral", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePegoutWithdrawCollateral is a log parse operation binding the contract event 0xfc72299650b405e7b0480ca8fb0fb3948fb10a77ac02f797cc9de1f4aaa55db7. +// +// Solidity: event PegoutWithdrawCollateral(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegoutWithdrawCollateral(log types.Log) (*LiquidityBridgeContractPegoutWithdrawCollateral, error) { + event := new(LiquidityBridgeContractPegoutWithdrawCollateral) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutWithdrawCollateral", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractPenalizedIterator is returned from FilterPenalized and is used to iterate over the raw logs and unpacked data for Penalized events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPenalizedIterator struct { + Event *LiquidityBridgeContractPenalized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractPenalizedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPenalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractPenalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractPenalizedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractPenalizedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractPenalized represents a Penalized event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractPenalized struct { + LiquidityProvider common.Address + Penalty *big.Int + QuoteHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPenalized is a free log retrieval operation binding the contract event 0x9685484093cc596fdaeab51abf645b1753dbb7d869bfd2eb21e2c646e47a36f4. +// +// Solidity: event Penalized(address liquidityProvider, uint256 penalty, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPenalized(opts *bind.FilterOpts) (*LiquidityBridgeContractPenalizedIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Penalized") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractPenalizedIterator{contract: _LiquidityBridgeContract.contract, event: "Penalized", logs: logs, sub: sub}, nil +} + +// WatchPenalized is a free log subscription operation binding the contract event 0x9685484093cc596fdaeab51abf645b1753dbb7d869bfd2eb21e2c646e47a36f4. +// +// Solidity: event Penalized(address liquidityProvider, uint256 penalty, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPenalized(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPenalized) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Penalized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractPenalized) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Penalized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePenalized is a log parse operation binding the contract event 0x9685484093cc596fdaeab51abf645b1753dbb7d869bfd2eb21e2c646e47a36f4. +// +// Solidity: event Penalized(address liquidityProvider, uint256 penalty, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePenalized(log types.Log) (*LiquidityBridgeContractPenalized, error) { + event := new(LiquidityBridgeContractPenalized) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Penalized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractRefundIterator is returned from FilterRefund and is used to iterate over the raw logs and unpacked data for Refund events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractRefundIterator struct { + Event *LiquidityBridgeContractRefund // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractRefundIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractRefund) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractRefund) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractRefundIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractRefundIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractRefund represents a Refund event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractRefund struct { + Dest common.Address + Amount *big.Int + Success bool + QuoteHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRefund is a free log retrieval operation binding the contract event 0x3052ea2f7e0d74fdc1c1e1f858ff1ae3d91ab1609717c3efedb95db603b255f6. +// +// Solidity: event Refund(address dest, uint256 amount, bool success, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterRefund(opts *bind.FilterOpts) (*LiquidityBridgeContractRefundIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Refund") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractRefundIterator{contract: _LiquidityBridgeContract.contract, event: "Refund", logs: logs, sub: sub}, nil +} + +// WatchRefund is a free log subscription operation binding the contract event 0x3052ea2f7e0d74fdc1c1e1f858ff1ae3d91ab1609717c3efedb95db603b255f6. +// +// Solidity: event Refund(address dest, uint256 amount, bool success, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchRefund(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractRefund) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Refund") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractRefund) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Refund", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRefund is a log parse operation binding the contract event 0x3052ea2f7e0d74fdc1c1e1f858ff1ae3d91ab1609717c3efedb95db603b255f6. +// +// Solidity: event Refund(address dest, uint256 amount, bool success, bytes32 quoteHash) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseRefund(log types.Log) (*LiquidityBridgeContractRefund, error) { + event := new(LiquidityBridgeContractRefund) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Refund", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractRegisterIterator is returned from FilterRegister and is used to iterate over the raw logs and unpacked data for Register events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractRegisterIterator struct { + Event *LiquidityBridgeContractRegister // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractRegisterIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractRegister) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractRegister) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractRegisterIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractRegisterIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractRegister represents a Register event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractRegister struct { + Id *big.Int + From common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRegister is a free log retrieval operation binding the contract event 0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e. +// +// Solidity: event Register(uint256 id, address indexed from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterRegister(opts *bind.FilterOpts, from []common.Address) (*LiquidityBridgeContractRegisterIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Register", fromRule) + if err != nil { + return nil, err + } + return &LiquidityBridgeContractRegisterIterator{contract: _LiquidityBridgeContract.contract, event: "Register", logs: logs, sub: sub}, nil +} + +// WatchRegister is a free log subscription operation binding the contract event 0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e. +// +// Solidity: event Register(uint256 id, address indexed from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchRegister(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractRegister, from []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Register", fromRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractRegister) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Register", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRegister is a log parse operation binding the contract event 0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e. +// +// Solidity: event Register(uint256 id, address indexed from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseRegister(log types.Log) (*LiquidityBridgeContractRegister, error) { + event := new(LiquidityBridgeContractRegister) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Register", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractResignedIterator is returned from FilterResigned and is used to iterate over the raw logs and unpacked data for Resigned events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractResignedIterator struct { + Event *LiquidityBridgeContractResigned // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractResignedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractResigned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractResigned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractResignedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractResignedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractResigned represents a Resigned event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractResigned struct { + From common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterResigned is a free log retrieval operation binding the contract event 0xa6674aa33cd1b7435474751667707bf05fde99e537d67043ec5f907782577d86. +// +// Solidity: event Resigned(address from) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterResigned(opts *bind.FilterOpts) (*LiquidityBridgeContractResignedIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Resigned") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractResignedIterator{contract: _LiquidityBridgeContract.contract, event: "Resigned", logs: logs, sub: sub}, nil +} + +// WatchResigned is a free log subscription operation binding the contract event 0xa6674aa33cd1b7435474751667707bf05fde99e537d67043ec5f907782577d86. +// +// Solidity: event Resigned(address from) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchResigned(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractResigned) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Resigned") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractResigned) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Resigned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseResigned is a log parse operation binding the contract event 0xa6674aa33cd1b7435474751667707bf05fde99e537d67043ec5f907782577d86. +// +// Solidity: event Resigned(address from) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseResigned(log types.Log) (*LiquidityBridgeContractResigned, error) { + event := new(LiquidityBridgeContractResigned) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Resigned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractWithdrawCollateralIterator is returned from FilterWithdrawCollateral and is used to iterate over the raw logs and unpacked data for WithdrawCollateral events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractWithdrawCollateralIterator struct { + Event *LiquidityBridgeContractWithdrawCollateral // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractWithdrawCollateralIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractWithdrawCollateral) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractWithdrawCollateral) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractWithdrawCollateralIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractWithdrawCollateralIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractWithdrawCollateral represents a WithdrawCollateral event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractWithdrawCollateral struct { + From common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawCollateral is a free log retrieval operation binding the contract event 0xa8e76b822fc682be77f3b1c822ea81f6bda5aed92ba82e6873bfd889f328d1d2. +// +// Solidity: event WithdrawCollateral(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterWithdrawCollateral(opts *bind.FilterOpts) (*LiquidityBridgeContractWithdrawCollateralIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "WithdrawCollateral") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractWithdrawCollateralIterator{contract: _LiquidityBridgeContract.contract, event: "WithdrawCollateral", logs: logs, sub: sub}, nil +} + +// WatchWithdrawCollateral is a free log subscription operation binding the contract event 0xa8e76b822fc682be77f3b1c822ea81f6bda5aed92ba82e6873bfd889f328d1d2. +// +// Solidity: event WithdrawCollateral(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchWithdrawCollateral(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractWithdrawCollateral) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "WithdrawCollateral") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractWithdrawCollateral) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "WithdrawCollateral", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWithdrawCollateral is a log parse operation binding the contract event 0xa8e76b822fc682be77f3b1c822ea81f6bda5aed92ba82e6873bfd889f328d1d2. +// +// Solidity: event WithdrawCollateral(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseWithdrawCollateral(log types.Log) (*LiquidityBridgeContractWithdrawCollateral, error) { + event := new(LiquidityBridgeContractWithdrawCollateral) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "WithdrawCollateral", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LiquidityBridgeContractWithdrawalIterator is returned from FilterWithdrawal and is used to iterate over the raw logs and unpacked data for Withdrawal events raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractWithdrawalIterator struct { + Event *LiquidityBridgeContractWithdrawal // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LiquidityBridgeContractWithdrawalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractWithdrawal) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LiquidityBridgeContractWithdrawal) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LiquidityBridgeContractWithdrawalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LiquidityBridgeContractWithdrawalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LiquidityBridgeContractWithdrawal represents a Withdrawal event raised by the LiquidityBridgeContract contract. +type LiquidityBridgeContractWithdrawal struct { + From common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawal is a free log retrieval operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65. +// +// Solidity: event Withdrawal(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterWithdrawal(opts *bind.FilterOpts) (*LiquidityBridgeContractWithdrawalIterator, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Withdrawal") + if err != nil { + return nil, err + } + return &LiquidityBridgeContractWithdrawalIterator{contract: _LiquidityBridgeContract.contract, event: "Withdrawal", logs: logs, sub: sub}, nil +} + +// WatchWithdrawal is a free log subscription operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65. +// +// Solidity: event Withdrawal(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchWithdrawal(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractWithdrawal) (event.Subscription, error) { + + logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Withdrawal") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LiquidityBridgeContractWithdrawal) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Withdrawal", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWithdrawal is a log parse operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65. +// +// Solidity: event Withdrawal(address from, uint256 amount) +func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseWithdrawal(log types.Log) (*LiquidityBridgeContractWithdrawal, error) { + event := new(LiquidityBridgeContractWithdrawal) + if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Withdrawal", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go new file mode 100644 index 00000000..81a6a7f0 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -0,0 +1,179 @@ +package rootstock + +import ( + "bytes" + "encoding/hex" + "fmt" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "math/big" +) + +type rskBridgeImpl struct { + address string + requiredConfirmations uint64 + irisActivationHeight int64 + erpKeys []string + contract *bindings.RskBridge + client *ethclient.Client + btcParams *chaincfg.Params +} + +func NewRskBridgeImpl( + address string, + requiredConfirmations uint64, + irisActivationHeight int64, + erpKeys []string, + contract *bindings.RskBridge, + client *RskClient, + btcParams *chaincfg.Params, +) blockchain.RootstockBridge { + return &rskBridgeImpl{ + address: address, + requiredConfirmations: requiredConfirmations, + irisActivationHeight: irisActivationHeight, + erpKeys: erpKeys, + contract: contract, + client: client.client, + btcParams: btcParams, + } +} + +func (bridge *rskBridgeImpl) GetAddress() string { + return bridge.address +} + +func (bridge *rskBridgeImpl) GetFedAddress() (string, error) { + opts := &bind.CallOpts{} + return rskRetry(func() (string, error) { + return bridge.contract.GetFederationAddress(opts) + }) +} + +func (bridge *rskBridgeImpl) GetMinimumLockTxValue() (*entities.Wei, error) { + opts := &bind.CallOpts{} + result, err := rskRetry(func() (*big.Int, error) { + return bridge.contract.GetMinimumLockTxValue(opts) + }) + if err != nil { + return nil, err + } + return entities.NewBigWei(result), nil +} + +func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.FlyoverDerivationArgs) (blockchain.FlyoverDerivation, error) { + var err error + var fedRedeemScript, derivationValue, flyoverScript []byte + var addressScriptHash *btcutil.AddressScriptHash + + if derivationValue, err = bridge.getDerivationValueHash(args); err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error computing derivation value: %w", err) + } + opts := &bind.CallOpts{} + fedRedeemScript, err = rskRetry(func() ([]byte, error) { + return bridge.contract.GetActivePowpegRedeemScript(opts) + }) + if err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error retreiving fed redeem script from bridge: %w", err) + } + + if len(fedRedeemScript) == 0 { + if fedRedeemScript, err = getFedRedeemScript(args.FedInfo, *bridge.btcParams); err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error generating fed redeem script: %w", err) + } + } else { + if err = validateRedeemScript(args.FedInfo, *bridge.btcParams, fedRedeemScript); err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error validating fed redeem script: %w", err) + } + } + + if flyoverScript, err = getFlyoverRedeemScript(derivationValue, fedRedeemScript); err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error generating flyover redeem script: %w", err) + } + if addressScriptHash, err = btcutil.NewAddressScriptHash(flyoverScript, bridge.btcParams); err != nil { + return blockchain.FlyoverDerivation{}, err + } + return blockchain.FlyoverDerivation{ + Address: addressScriptHash.EncodeAddress(), + RedeemScript: hex.EncodeToString(flyoverScript), + }, nil +} + +func (bridge *rskBridgeImpl) GetRequiredTxConfirmations() uint64 { + return bridge.requiredConfirmations +} + +func (bridge *rskBridgeImpl) FetchFederationInfo() (blockchain.FederationInfo, error) { + var err error + var pubKey []byte + var pubKeys []string + var i, federationSize int64 + + opts := &bind.CallOpts{} + fedSize, err := rskRetry(func() (*big.Int, error) { + return bridge.contract.GetFederationSize(opts) + }) + if err != nil { + return blockchain.FederationInfo{}, err + } + federationSize = fedSize.Int64() + + for i = 0; i < federationSize; i++ { + pubKey, err = rskRetry(func() ([]byte, error) { + return bridge.contract.GetFederatorPublicKeyOfType(opts, big.NewInt(i), "btc") + }) + if err != nil { + return blockchain.FederationInfo{}, fmt.Errorf("error fetching fed public key: %w", err) + } + pubKeys = append(pubKeys, hex.EncodeToString(pubKey)) + } + + fedThreshold, err := rskRetry(func() (*big.Int, error) { + return bridge.contract.GetFederationThreshold(opts) + }) + if err != nil { + return blockchain.FederationInfo{}, fmt.Errorf("error fetching federation size: %w", err) + } + + fedAddress, err := rskRetry(func() (string, error) { + return bridge.contract.GetFederationAddress(opts) + }) + if err != nil { + return blockchain.FederationInfo{}, fmt.Errorf("error fetching federation address: %w", err) + } + + activeFedBlockHeight, err := rskRetry(func() (*big.Int, error) { + return bridge.contract.GetActiveFederationCreationBlockHeight(opts) + }) + if err != nil { + return blockchain.FederationInfo{}, fmt.Errorf("error fetching federation height: %w", err) + } + + return blockchain.FederationInfo{ + FedThreshold: fedThreshold.Int64(), + FedSize: fedSize.Int64(), + PubKeys: pubKeys, + FedAddress: fedAddress, + ActiveFedBlockHeight: activeFedBlockHeight.Int64(), + IrisActivationHeight: bridge.irisActivationHeight, + ErpKeys: bridge.erpKeys, + }, nil +} + +func (bridge *rskBridgeImpl) getDerivationValueHash(args blockchain.FlyoverDerivationArgs) ([]byte, error) { + var buf bytes.Buffer + buf.Write(args.QuoteHash) + buf.Write(args.UserBtcRefundAddress) + buf.Write(args.LbcAdress) + buf.Write(args.LpBtcAddress) + + derivationValueHash := crypto.Keccak256(buf.Bytes()) + + return derivationValueHash, nil +} diff --git a/internal/adapters/dataproviders/rootstock/common.go b/internal/adapters/dataproviders/rootstock/common.go new file mode 100644 index 00000000..7a208e54 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/common.go @@ -0,0 +1,100 @@ +package rootstock + +import ( + "context" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + geth "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" + "time" +) + +const ( + rpcCallRetryMax = 3 + rpcCallRetrySleep = 2 * time.Minute + txMiningWaitTimeout = 3 * time.Minute +) + +type RskAccount struct { + Account *accounts.Account + Keystore *keystore.KeyStore +} + +type RskClient struct { + client *ethclient.Client +} + +func NewRskClient(client *ethclient.Client) *RskClient { + return &RskClient{client: client} +} + +func (c *RskClient) Rpc() *ethclient.Client { + return c.client +} + +func (c *RskClient) Shutdown(endChannel chan<- bool) { + c.client.Close() + endChannel <- true + log.Debug("Disconnected from RSK node") +} + +func (c *RskClient) CheckConnection(ctx context.Context) bool { + _, err := c.client.ChainID(ctx) + if err != nil { + log.Error("Error checking RSK node connection: ", err) + } + return err == nil +} + +type TransactionSigner interface { + Address() common.Address + Sign(common.Address, *types.Transaction) (*types.Transaction, error) + SignBytes(msg []byte) ([]byte, error) +} + +func ParseAddress(address *common.Address, textAddress string) error { + if !common.IsHexAddress(textAddress) { + return blockchain.InvalidAddressError + } + *address = common.HexToAddress(textAddress) + return nil +} + +func rskRetry[R any](call func() (R, error)) (R, error) { + var result R + var err error + for i := 0; i < rpcCallRetryMax; i++ { + result, err = call() + if err == nil { + return result, nil + } + time.Sleep(rpcCallRetrySleep) + } + return result, err +} + +func awaitTx(client *ethclient.Client, logName string, txCall func() (*geth.Transaction, error)) (r *geth.Receipt, e error) { + var tx *geth.Transaction + var err error + + log.Infof("Executing %s transaction...\n", logName) + tx, err = txCall() + if err != nil { + return nil, err + } + ctx, cancel := context.WithTimeout(context.Background(), txMiningWaitTimeout) + defer func() { + cancel() + if r.Status == 1 { + log.Infof("Transaction %s (%s) executed successfully\n", logName, tx.Hash().String()) + } else { + log.Infof("Transaction %s (%s) failed\n", logName, tx.Hash().String()) + } + }() + return bind.WaitMined(ctx, client, tx) +} diff --git a/internal/adapters/dataproviders/rootstock/federation.go b/internal/adapters/dataproviders/rootstock/federation.go new file mode 100644 index 00000000..d2fa10af --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/federation.go @@ -0,0 +1,237 @@ +package rootstock + +import ( + "bytes" + "encoding/hex" + "errors" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/txscript" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" +) + +func getFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) ([]byte, error) { + var buf *bytes.Buffer + var err error + + // All Federations activated AFTER Iris will be ERP, therefore we build redeem script. + if fedInfo.ActiveFedBlockHeight > fedInfo.IrisActivationHeight { + buf, err = getRedeemScriptBuf(fedInfo, true) + if err != nil { + return nil, err + } + + err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + if err != nil { + return nil, err + } + } else { + buf, err = getErpRedeemScriptBuf(fedInfo, btcParams) + if err != nil { + return nil, err + } + + err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + if err != nil { // ok, it could be that ERP is not yet activated, falling back to redeem Script + buf, err = getRedeemScriptBuf(fedInfo, true) + if err != nil { + return nil, err + } + + err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + if err != nil { + return nil, err + } + } + } + + return buf.Bytes(), nil +} + +func getRedeemScriptBuf(fedInfo blockchain.FederationInfo, addMultiSig bool) (*bytes.Buffer, error) { + var buf bytes.Buffer + sb := txscript.NewScriptBuilder() + err := addStdNToMScriptPart(fedInfo, sb) + if err != nil { + return nil, err + } + if addMultiSig { + sb.AddOp(txscript.OP_CHECKMULTISIG) + } + + sbuf, err := sb.Script() + if err != nil { + return nil, err + } + + buf.Write(sbuf) + return &buf, nil +} + +func addStdNToMScriptPart(fedInfo blockchain.FederationInfo, builder *txscript.ScriptBuilder) error { + builder.AddOp(getOpCodeFromInt(int(fedInfo.FedThreshold))) + + for _, pubKey := range fedInfo.PubKeys { + pkBuffer, err := hex.DecodeString(pubKey) + if err != nil { + return err + } + builder.AddData(pkBuffer) + } + + builder.AddOp(getOpCodeFromInt(int(fedInfo.FedSize))) + return nil +} + +func validateRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params, script []byte) error { + addr, err := btcutil.NewAddressScriptHash(script, &btcParams) + if err != nil { + return err + } + + fedAddress, err := btcutil.DecodeAddress(fedInfo.FedAddress, &btcParams) + if err != nil { + return err + } + if !bytes.Equal(addr.ScriptAddress(), fedAddress.ScriptAddress()) { + return errors.New("the generated redeem script does not match with the federation redeem script") + } + + return nil +} + +func getErpRedeemScriptBuf(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { + erpRedeemScriptBuf, err := p2ms(fedInfo, false) + if err != nil { + return nil, err + } + + redeemScriptBuf, err := getRedeemScriptBuf(fedInfo, false) + if err != nil { + return nil, err + } + scriptsA := txscript.NewScriptBuilder() + scriptsA.AddOp(txscript.OP_NOTIF) + var erpRedeemScriptBuffer bytes.Buffer + scrA, err := scriptsA.Script() + if err != nil { + return nil, err + } + erpRedeemScriptBuffer.Write(scrA) + erpRedeemScriptBuffer.Write(redeemScriptBuf.Bytes()) + erpRedeemScriptBuffer.WriteByte(txscript.OP_ELSE) + byteArr, err := hex.DecodeString("02") + if err != nil { + return nil, err + } + erpRedeemScriptBuffer.Write(byteArr) + + csv, err := hex.DecodeString(getCsvValueFromNetwork(btcParams)) + if err != nil { + return nil, err + } + erpRedeemScriptBuffer.Write(csv) + erpRedeemScriptBuffer.WriteByte(txscript.OP_CHECKSEQUENCEVERIFY) + erpRedeemScriptBuffer.WriteByte(txscript.OP_DROP) + erpRedeemScriptBuffer.Write(erpRedeemScriptBuf.Bytes()) + erpRedeemScriptBuffer.WriteByte(txscript.OP_ENDIF) + erpRedeemScriptBuffer.WriteByte(txscript.OP_CHECKMULTISIG) + + return &erpRedeemScriptBuffer, nil +} + +func p2ms(fedInfo blockchain.FederationInfo, addMultiSig bool) (*bytes.Buffer, error) { + var buf bytes.Buffer + sb := txscript.NewScriptBuilder() + err := addErpNToMScriptPart(fedInfo, sb) + if err != nil { + return nil, err + } + + if addMultiSig { + sb.AddOp(txscript.OP_CHECKMULTISIG) + } + + sbuf, err := sb.Script() + if err != nil { + return nil, err + } + + buf.Write(sbuf) + return &buf, nil +} + +func addErpNToMScriptPart(fedInfo blockchain.FederationInfo, builder *txscript.ScriptBuilder) error { + size := len(fedInfo.ErpKeys) + minimum := size/2 + 1 + builder.AddOp(getOpCodeFromInt(minimum)) + + for _, pubKey := range fedInfo.ErpKeys { + pkBuffer, err := hex.DecodeString(pubKey) + if err != nil { + return err + } + builder.AddData(pkBuffer) + } + + builder.AddOp(getOpCodeFromInt(len(fedInfo.ErpKeys))) + return nil +} + +func getFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) ([]byte, error) { + var buf bytes.Buffer + hashPrefix, _ := hex.DecodeString("20") + buf.Write(hashPrefix) + buf.Write(derivationValue) + buf.WriteByte(txscript.OP_DROP) + buf.Write(fedRedeemScript) + return buf.Bytes(), nil +} + +func getOpCodeFromInt(val int) byte { + switch val { + case 1: + return txscript.OP_1 + case 2: + return txscript.OP_2 + case 3: + return txscript.OP_3 + case 4: + return txscript.OP_4 + case 5: + return txscript.OP_5 + case 6: + return txscript.OP_6 + case 7: + return txscript.OP_7 + case 8: + return txscript.OP_8 + case 9: + return txscript.OP_9 + case 10: + return txscript.OP_10 + case 11: + return txscript.OP_11 + case 12: + return txscript.OP_12 + case 13: + return txscript.OP_13 + case 14: + return txscript.OP_14 + case 15: + return txscript.OP_15 + default: + return txscript.OP_16 + } +} + +func getCsvValueFromNetwork(btcParams chaincfg.Params) string { + switch btcParams.Name { + case chaincfg.MainNetParams.Name: + return "CD50" + case chaincfg.TestNet3Params.Name: + return "CD50" + default: + return "01F4" + } +} diff --git a/internal/adapters/dataproviders/rootstock/fee_collector.go b/internal/adapters/dataproviders/rootstock/fee_collector.go new file mode 100644 index 00000000..9c4094c7 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/fee_collector.go @@ -0,0 +1,27 @@ +package rootstock + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "math/big" +) + +type feeCollectorImpl struct { + contract *bindings.LiquidityBridgeContract +} + +func NewFeeCollectorImpl(contract *bindings.LiquidityBridgeContract) blockchain.FeeCollector { + return &feeCollectorImpl{contract: contract} +} + +func (fc *feeCollectorImpl) DaoFeePercentage() (uint64, error) { + opts := bind.CallOpts{} + amount, err := rskRetry(func() (*big.Int, error) { + return fc.contract.ProductFeePercentage(&opts) + }) + if err != nil { + return 0, err + } + return amount.Uint64(), nil +} diff --git a/internal/adapters/dataproviders/rootstock/lbc.go b/internal/adapters/dataproviders/rootstock/lbc.go new file mode 100644 index 00000000..3fd7aa05 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/lbc.go @@ -0,0 +1,637 @@ +package rootstock + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + geth "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + log "github.com/sirupsen/logrus" + "math/big" + "strings" + "time" +) + +const registerPeginGasLimit = 2500000 + +type liquidityBridgeContractImpl struct { + client *ethclient.Client + address string + contract *bindings.LiquidityBridgeContract + signer TransactionSigner +} + +func NewLiquidityBridgeContractImpl( + client *RskClient, + address string, + contract *bindings.LiquidityBridgeContract, + signer TransactionSigner, +) blockchain.LiquidityBridgeContract { + return &liquidityBridgeContractImpl{ + client: client.client, + address: address, + contract: contract, + signer: signer, + } +} + +func (lbc *liquidityBridgeContractImpl) GetAddress() string { + return lbc.address +} + +func (lbc *liquidityBridgeContractImpl) HashPeginQuote(peginQuote quote.PeginQuote) (string, error) { + opts := bind.CallOpts{} + var results [32]byte + + parsedQuote, err := parsePeginQuote(peginQuote) + if err != nil { + return "", err + } + + results, err = rskRetry(func() ([32]byte, error) { + return lbc.contract.HashQuote(&opts, parsedQuote) + }) + if err != nil { + return "", err + } + return hex.EncodeToString(results[:]), nil +} + +func (lbc *liquidityBridgeContractImpl) HashPegoutQuote(pegoutQuote quote.PegoutQuote) (string, error) { + opts := bind.CallOpts{} + var results [32]byte + + parsedQuote, err := parsePegoutQuote(pegoutQuote) + if err != nil { + return "", err + } + + results, err = rskRetry(func() ([32]byte, error) { + return lbc.contract.HashPegoutQuote(&opts, parsedQuote) + }) + if err != nil { + return "", err + } + return hex.EncodeToString(results[:]), nil +} + +func (lbc *liquidityBridgeContractImpl) GetProviders() ([]entities.RegisteredLiquidityProvider, error) { + var i, maxProviderId int64 + var providerType entities.ProviderType + var providers []bindings.LiquidityBridgeContractLiquidityProvider + var provider bindings.LiquidityBridgeContractLiquidityProvider + + opts := &bind.CallOpts{} + maxId, err := rskRetry(func() (*big.Int, error) { + return lbc.contract.GetProviderIds(opts) + }) + if err != nil { + return nil, err + } + + maxProviderId = maxId.Int64() + providerIds := make([]*big.Int, maxProviderId) + + for i = 1; i <= maxProviderId; i++ { + providerIds = append(providerIds, big.NewInt(i)) + } + + providers, err = rskRetry(func() ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { + return lbc.contract.GetProviders(opts, providerIds) + }) + if err != nil { + return nil, err + } + parsedProviders := make([]entities.RegisteredLiquidityProvider, maxProviderId) + for i = 0; i < maxProviderId+1; i++ { + provider = providers[i] + providerType = entities.ProviderType(provider.ProviderType) + if !providerType.IsValid() { + return nil, entities.InvalidProviderTypeError + } + parsedProviders = append(parsedProviders, entities.RegisteredLiquidityProvider{ + Id: provider.Id.Uint64(), + Address: provider.Provider.String(), + Name: provider.Name, + ApiBaseUrl: provider.ApiBaseUrl, + Status: provider.Status, + ProviderType: providerType, + }) + } + return parsedProviders, nil +} + +func (lbc *liquidityBridgeContractImpl) ProviderResign() error { + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + } + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "Resign", func() (*geth.Transaction, error) { + return lbc.contract.Resign(opts) + }) + }) + + if err != nil { + return err + } else if receipt == nil || receipt.Status == 0 { + return errors.New("resign transaction failed") + } + return nil +} + +func (lbc *liquidityBridgeContractImpl) SetProviderStatus(id uint64, newStatus bool) error { + var parsedId *big.Int + parsedId.SetUint64(id) + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "SetProviderStatus", func() (*geth.Transaction, error) { + return lbc.contract.SetProviderStatus(opts, parsedId, newStatus) + }) + }) + + if err != nil { + return err + } else if receipt == nil || receipt.Status == 0 { + return errors.New("resign transaction failed") + } + return nil +} + +func (lbc *liquidityBridgeContractImpl) GetCollateral(address string) (*entities.Wei, error) { + var parsedAddress common.Address + var err error + opts := &bind.CallOpts{} + if err = ParseAddress(&parsedAddress, address); err != nil { + return nil, err + } + collateral, err := rskRetry(func() (*big.Int, error) { + return lbc.contract.GetCollateral(opts, parsedAddress) + }) + if err != nil { + return nil, err + } + return entities.NewBigWei(collateral), nil +} + +func (lbc *liquidityBridgeContractImpl) GetPegoutCollateral(address string) (*entities.Wei, error) { + var parsedAddress common.Address + var err error + opts := &bind.CallOpts{} + if err = ParseAddress(&parsedAddress, address); err != nil { + return nil, err + } + collateral, err := rskRetry(func() (*big.Int, error) { + return lbc.contract.GetPegoutCollateral(opts, parsedAddress) + }) + if err != nil { + return nil, err + } + return entities.NewBigWei(collateral), nil +} + +func (lbc *liquidityBridgeContractImpl) GetMinimumCollateral() (*entities.Wei, error) { + var err error + opts := &bind.CallOpts{} + collateral, err := rskRetry(func() (*big.Int, error) { + return lbc.contract.GetMinCollateral(opts) + }) + if err != nil { + return nil, err + } + return entities.NewBigWei(collateral), nil +} + +func (lbc *liquidityBridgeContractImpl) AddCollateral(amount *entities.Wei) error { + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + Value: amount.AsBigInt(), + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "AddCollateral", func() (*geth.Transaction, error) { + return lbc.contract.AddCollateral(opts) + }) + }) + + if err != nil { + return fmt.Errorf("error adding collateral: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return fmt.Errorf("error adding pegin collateral") + } + return nil +} + +func (lbc *liquidityBridgeContractImpl) AddPegoutCollateral(amount *entities.Wei) error { + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + Value: amount.AsBigInt(), + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "AddPegoutCollateral", func() (*geth.Transaction, error) { + return lbc.contract.AddPegoutCollateral(opts) + }) + }) + + if err != nil { + return fmt.Errorf("error adding collateral: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return fmt.Errorf("error adding pegout collateral") + } + return nil +} + +func (lbc *liquidityBridgeContractImpl) WithdrawCollateral() error { + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "WithdrawCollateral", func() (*geth.Transaction, error) { + return lbc.contract.WithdrawCollateral(opts) + }) + }) + + if err != nil { + return fmt.Errorf("withdraw pegin collateral error: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return fmt.Errorf("withdraw pegin collateral error") + } + return nil +} + +func (lbc *liquidityBridgeContractImpl) WithdrawPegoutCollateral() error { + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "WithdrawPegoutCollateral", func() (*geth.Transaction, error) { + return lbc.contract.WithdrawPegoutCollateral(opts) + }) + }) + + if err != nil { + return fmt.Errorf("withdraw pegout collateral error: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return fmt.Errorf("withdraw pegout collateral error") + } + return nil +} + +func (lbc *liquidityBridgeContractImpl) GetBalance(address string) (*entities.Wei, error) { + var parsedAddress common.Address + var err error + opts := &bind.CallOpts{} + if err = ParseAddress(&parsedAddress, address); err != nil { + return nil, err + } + balance, err := rskRetry(func() (*big.Int, error) { + return lbc.contract.GetBalance(opts, parsedAddress) + }) + if err != nil { + return nil, err + } + return entities.NewBigWei(balance), nil +} + +func (lbc *liquidityBridgeContractImpl) CallForUser(txConfig blockchain.TransactionConfig, peginQuote quote.PeginQuote) (string, error) { + opts := &bind.TransactOpts{ + GasLimit: *txConfig.GasLimit, + Value: txConfig.Value.AsBigInt(), + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + } + + parsedQuote, err := parsePeginQuote(peginQuote) + if err != nil { + return "", err + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "CallForUser", func() (*geth.Transaction, error) { + return lbc.contract.CallForUser(opts, parsedQuote) + }) + }) + + if err != nil { + return "", fmt.Errorf("call for user error: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return "", errors.New("callfor user error: incomplete receipt") + } + return receipt.TxHash.String(), nil +} + +func (lbc *liquidityBridgeContractImpl) RegisterPegin(params blockchain.RegisterPeginParams) (string, error) { + var res []any + var err error + var parsedQuote bindings.QuotesPeginQuote + lbcCaller := &bindings.LiquidityBridgeContractCallerRaw{Contract: &lbc.contract.LiquidityBridgeContractCaller} + if parsedQuote, err = parsePeginQuote(params.Quote); err != nil { + return "", err + } + log.Infof("Executing RegisterPegIn with params: %s\n", params.String()) + err = lbcCaller.Call( + &bind.CallOpts{}, &res, "registerPegIn", + parsedQuote, + params.QuoteSignature, + params.BitcoinRawTransaction, + params.PartialMerkleTree, + params.BlockHeight, + ) + if err != nil && strings.Contains(err.Error(), "LBC031") { + log.Debugln("bridge failed to validate BTC transaction. retrying on next confirmation.") + // allow retrying in case the bridge didn't acknowledge all required confirmations have occurred + return "", blockchain.WaitingForBridgeError + } else if err != nil { + return "", err + } + + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + GasLimit: registerPeginGasLimit, + } + + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "RegisterPegIn", func() (*geth.Transaction, error) { + return lbc.contract.RegisterPegIn(opts, parsedQuote, params.QuoteSignature, + params.BitcoinRawTransaction, params.PartialMerkleTree, params.BlockHeight) + }) + }) + + if err != nil { + return "", fmt.Errorf("register pegin error: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return "", errors.New("register pegin error: incomplete receipt") + } + return receipt.TxHash.String(), nil +} + +func (lbc *liquidityBridgeContractImpl) RefundPegout(txConfig blockchain.TransactionConfig, params blockchain.RefundPegoutParams) (string, error) { + opts := &bind.TransactOpts{ + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + GasLimit: *txConfig.GasLimit, + } + + log.Infof("Executing RefundPegOut with params: %s\n", params.String()) + receipt, err := awaitTx(lbc.client, "RefundPegOut", func() (*geth.Transaction, error) { + return lbc.contract.RefundPegOut(opts, params.QuoteHash, params.BtcRawTx, + params.BtcBlockHeaderHash, params.MerkleBranchPath, params.MerkleBranchHashes) + }) + + if err != nil && strings.Contains(err.Error(), "LBC049") { + return "", blockchain.WaitingForBridgeError + } else if err != nil { + return "", fmt.Errorf("refund pegout error: %w", err) + } else if receipt == nil || receipt.Status == 0 { + return "", errors.New("refund pegout error: incomplete receipt") + } + return receipt.TxHash.String(), nil +} + +func (lbc *liquidityBridgeContractImpl) IsOperationalPegin(address string) (bool, error) { + var parsedAddress common.Address + var err error + opts := &bind.CallOpts{} + + if err = ParseAddress(&parsedAddress, address); err != nil { + return false, err + } + + return rskRetry(func() (bool, error) { + return lbc.contract.IsOperational(opts, parsedAddress) + }) +} + +func (lbc *liquidityBridgeContractImpl) IsOperationalPegout(address string) (bool, error) { + var parsedAddress common.Address + var err error + opts := &bind.CallOpts{} + + if err = ParseAddress(&parsedAddress, address); err != nil { + return false, err + } + + return rskRetry(func() (bool, error) { + return lbc.contract.IsOperationalForPegout(opts, parsedAddress) + }) +} + +func (lbc *liquidityBridgeContractImpl) GetDepositEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]quote.PegoutDeposit, error) { + var lbcEvent *bindings.LiquidityBridgeContractPegOutDeposit + result := make([]quote.PegoutDeposit, 0) + + iterator, err := lbc.contract.FilterPegOutDeposit(&bind.FilterOpts{ + Start: fromBlock, + End: toBlock, + Context: ctx, + }, nil, nil) + defer func() { + if iterator != nil { + if iteratorError := iterator.Close(); iteratorError != nil { + log.Error("Error closing PegOutDeposit event iterator: ", err) + } + } + }() + if err != nil || iterator == nil { + return result, err + } + + for iterator.Next() { + lbcEvent = iterator.Event + result = append(result, quote.PegoutDeposit{ + TxHash: lbcEvent.Raw.TxHash.String(), + QuoteHash: hex.EncodeToString(lbcEvent.QuoteHash[:]), + Amount: entities.NewBigWei(lbcEvent.Amount), + Timestamp: time.Unix(lbcEvent.Timestamp.Int64(), 0), + BlockNumber: lbcEvent.Raw.BlockNumber, + From: lbcEvent.Sender.String(), + }) + } + if iterator.Error() != nil { + return nil, err + } + + return result, nil +} + +func (lbc *liquidityBridgeContractImpl) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]entities.PunishmentEvent, error) { + var lbcEvent *bindings.LiquidityBridgeContractPenalized + result := make([]entities.PunishmentEvent, 0) + + iterator, err := lbc.contract.FilterPenalized(&bind.FilterOpts{ + Start: fromBlock, + End: toBlock, + Context: ctx, + }) + defer func() { + if iterator != nil { + if iteratorError := iterator.Close(); iteratorError != nil { + log.Error("Error closing Penalized event iterator: ", err) + } + } + }() + if err != nil || iterator == nil { + return result, err + } + + for iterator.Next() { + lbcEvent = iterator.Event + result = append(result, entities.PunishmentEvent{ + LiquidityProvider: lbcEvent.LiquidityProvider.String(), + Penalty: entities.NewBigWei(lbcEvent.Penalty), + QuoteHash: hex.EncodeToString(lbcEvent.QuoteHash[:]), + }) + } + if iterator.Error() != nil { + return nil, err + } + return result, nil +} + +func (lbc *liquidityBridgeContractImpl) RegisterProvider(txConfig blockchain.TransactionConfig, params blockchain.ProviderRegistrationParams) (int64, error) { + var err error + + opts := &bind.TransactOpts{ + Value: txConfig.Value.AsBigInt(), + From: lbc.signer.Address(), + Signer: lbc.signer.Sign, + } + receipt, err := rskRetry(func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "Register", func() (*geth.Transaction, error) { + return lbc.contract.Register(opts, params.Name, params.ApiBaseUrl, params.Status, string(params.Type)) + }) + }) + + if err != nil { + return 0, fmt.Errorf("error registering provider: %w", err) + } else if receipt == nil || receipt.Status == 0 || len(receipt.Logs) == 0 { + return 0, errors.New("error registering provider: incomplete receipt") + } + + registerEvent, err := lbc.contract.ParseRegister(*receipt.Logs[0]) + if err != nil { + return 0, fmt.Errorf("error registering provider: %w", err) + } + return registerEvent.Id.Int64(), nil +} + +// TODO currently we only support P2PKH addresses (P2SH is allowed for federation address) +func parsePeginQuote(peginQuote quote.PeginQuote) (bindings.QuotesPeginQuote, error) { + var decodedFederationAddress []byte + var parsedQuote bindings.QuotesPeginQuote + var err error + + if err = entities.ValidateStruct(peginQuote); err != nil { + return bindings.QuotesPeginQuote{}, err + } + + if decodedFederationAddress, err = bitcoin.DecodeAddressBase58(peginQuote.FedBtcAddress, false); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing federation address: %w", err) + } else { + copy(parsedQuote.FedBtcAddress[:], decodedFederationAddress) + } + if parsedQuote.BtcRefundAddress, err = bitcoin.DecodeAddressBase58OnlyLegacy(peginQuote.BtcRefundAddress, true); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing user btc refund address: %w", err) + } + if parsedQuote.LiquidityProviderBtcAddress, err = bitcoin.DecodeAddressBase58OnlyLegacy(peginQuote.LpBtcAddress, true); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing btc liquidity provider address: %w", err) + } + + if err = ParseAddress(&parsedQuote.LbcAddress, peginQuote.LbcAddress); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing lbc address: %w", err) + } + if err = ParseAddress(&parsedQuote.LiquidityProviderRskAddress, peginQuote.LpRskAddress); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing liquidity provider rsk address: %w", err) + } + if err = ParseAddress(&parsedQuote.RskRefundAddress, peginQuote.RskRefundAddress); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing user rsk refund address: %w", err) + } + if err = ParseAddress(&parsedQuote.ContractAddress, peginQuote.ContractAddress); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing destination contract address: %w", err) + } + + if parsedQuote.Data, err = blockchain.DecodeStringTrimPrefix(peginQuote.Data); err != nil { + return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing data: %w", err) + } + + parsedQuote.CallFee = peginQuote.CallFee.AsBigInt() + parsedQuote.PenaltyFee = peginQuote.PenaltyFee.AsBigInt() + parsedQuote.GasLimit = peginQuote.GasLimit + parsedQuote.Nonce = peginQuote.Nonce + parsedQuote.Value = peginQuote.Value.AsBigInt() + parsedQuote.AgreementTimestamp = peginQuote.AgreementTimestamp + parsedQuote.CallTime = peginQuote.LpCallTime + parsedQuote.DepositConfirmations = peginQuote.Confirmations + parsedQuote.TimeForDeposit = peginQuote.TimeForDeposit + parsedQuote.ProductFeeAmount = new(big.Int) + parsedQuote.ProductFeeAmount.SetUint64(peginQuote.ProductFeeAmount) + parsedQuote.GasFee = peginQuote.GasFee.AsBigInt() + return parsedQuote, nil +} + +// TODO currently we only support P2PKH addresses +func parsePegoutQuote(pegoutQuote quote.PegoutQuote) (bindings.QuotesPegOutQuote, error) { + var parsedQuote bindings.QuotesPegOutQuote + var err error + + if err = entities.ValidateStruct(pegoutQuote); err != nil { + return bindings.QuotesPegOutQuote{}, err + } + + if err = ParseAddress(&parsedQuote.LbcAddress, pegoutQuote.LbcAddress); err != nil { + return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing lbc address: %w", err) + } + if err = ParseAddress(&parsedQuote.LpRskAddress, pegoutQuote.LpRskAddress); err != nil { + return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing liquidity provider rsk address: %w", err) + } + if err = ParseAddress(&parsedQuote.RskRefundAddress, pegoutQuote.RskRefundAddress); err != nil { + return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing user rsk refund address: %w", err) + } + + if parsedQuote.BtcRefundAddress, err = bitcoin.DecodeAddressBase58OnlyLegacy(pegoutQuote.BtcRefundAddress, true); err != nil { + return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing user btc refund address: %w", err) + } + if parsedQuote.LpBtcAddress, err = bitcoin.DecodeAddressBase58OnlyLegacy(pegoutQuote.LpBtcAddress, true); err != nil { + return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing liquidity provider btc address: %w", err) + } + if parsedQuote.DeposityAddress, err = bitcoin.DecodeAddressBase58OnlyLegacy(pegoutQuote.DepositAddress, true); err != nil { + return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing pegout deposit address: %w", err) + } + + parsedQuote.CallFee = pegoutQuote.CallFee.AsBigInt() + parsedQuote.PenaltyFee = new(big.Int) + parsedQuote.PenaltyFee.SetUint64(pegoutQuote.PenaltyFee) + parsedQuote.Nonce = pegoutQuote.Nonce + parsedQuote.Value = pegoutQuote.Value.AsBigInt() + parsedQuote.AgreementTimestamp = pegoutQuote.AgreementTimestamp + parsedQuote.DepositDateLimit = pegoutQuote.DepositDateLimit + parsedQuote.DepositConfirmations = pegoutQuote.DepositConfirmations + parsedQuote.TransferConfirmations = pegoutQuote.TransferConfirmations + parsedQuote.TransferTime = pegoutQuote.TransferTime + parsedQuote.ExpireDate = pegoutQuote.ExpireDate + parsedQuote.ExpireBlock = pegoutQuote.ExpireBlock + parsedQuote.ProductFeeAmount = new(big.Int) + parsedQuote.ProductFeeAmount.SetUint64(pegoutQuote.ProductFeeAmount) + parsedQuote.GasFee = pegoutQuote.GasFee.AsBigInt() + return parsedQuote, nil +} diff --git a/internal/adapters/dataproviders/rootstock/rpc.go b/internal/adapters/dataproviders/rootstock/rpc.go new file mode 100644 index 00000000..06dd6df5 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/rpc.go @@ -0,0 +1,166 @@ +package rootstock + +import ( + "context" + "encoding/hex" + "errors" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "math/big" + "strings" +) + +const newAccountGasCost = 25000 + +type rskjRpcServer struct { + client *ethclient.Client +} + +func NewRskjRpcServer(client *RskClient) blockchain.RootstockRpcServer { + return &rskjRpcServer{client: client.client} +} + +func (rpc *rskjRpcServer) GetBalance(ctx context.Context, address string) (*entities.Wei, error) { + var destination common.Address + var err error + + if err = ParseAddress(&destination, address); err != nil { + return nil, err + } + + result, err := rskRetry(func() (*big.Int, error) { + return rpc.client.BalanceAt(ctx, destination, nil) + }) + + if err != nil { + return nil, err + } else { + return entities.NewBigWei(result), nil + } +} + +func (rpc *rskjRpcServer) EstimateGas(ctx context.Context, address string, value *entities.Wei, data []byte) (*entities.Wei, error) { + var destination common.Address + var additionalGas uint64 + var newAccount bool + var err error + + if err = ParseAddress(&destination, address); err != nil { + return nil, err + } + + if newAccount, err = rpc.isNewAccount(ctx, destination); err != nil { + return nil, err + } else if newAccount { + additionalGas = newAccountGasCost + } + + tx := ethereum.CallMsg{ + To: &destination, + Data: data, + Value: value.AsBigInt(), + } + result, err := rskRetry(func() (uint64, error) { + return rpc.client.EstimateGas(ctx, tx) + }) + if err != nil { + return nil, err + } else { + return entities.NewUWei(result + additionalGas), nil + } +} + +func (rpc *rskjRpcServer) GasPrice(ctx context.Context) (*entities.Wei, error) { + result, err := rskRetry(func() (*big.Int, error) { + return rpc.client.SuggestGasPrice(ctx) + }) + if err != nil { + return nil, err + } else { + return entities.NewBigWei(result), err + } +} + +func (rpc *rskjRpcServer) GetHeight(ctx context.Context) (uint64, error) { + return rskRetry(func() (uint64, error) { + return rpc.client.BlockNumber(ctx) + }) +} + +func (rpc *rskjRpcServer) GetTransactionReceipt(ctx context.Context, hash string) (blockchain.TransactionReceipt, error) { + var from common.Address + + _, err := hex.DecodeString(strings.TrimPrefix(hash, "0x")) + if err != nil { + return blockchain.TransactionReceipt{}, errors.New("invalid transaction hash") + } + + receipt, err := rskRetry(func() (*types.Receipt, error) { + return rpc.client.TransactionReceipt(ctx, common.HexToHash(hash)) + }) + if err != nil { + return blockchain.TransactionReceipt{}, err + } + + tx, err := rskRetry(func() (*types.Transaction, error) { + transaction, _, rpcError := rpc.client.TransactionByHash(ctx, common.HexToHash(hash)) + return transaction, rpcError + }) + if err != nil { + return blockchain.TransactionReceipt{}, err + } + + gasUsed := new(big.Int) + gasUsed.SetUint64(receipt.GasUsed) + cumulativeGasUsed := new(big.Int) + cumulativeGasUsed.SetUint64(receipt.CumulativeGasUsed) + from, err = types.Sender(types.NewEIP155Signer(tx.ChainId()), tx) + if err != nil { + from, err = types.Sender(types.HomesteadSigner{}, tx) + } + return blockchain.TransactionReceipt{ + TransactionHash: receipt.TxHash.String(), + BlockHash: receipt.BlockHash.String(), + BlockNumber: receipt.BlockNumber.Uint64(), + From: from.String(), + To: tx.To().String(), + CumulativeGasUsed: cumulativeGasUsed, + GasUsed: gasUsed, + Value: entities.NewBigWei(tx.Value()), + }, nil +} + +func (rpc *rskjRpcServer) isNewAccount(ctx context.Context, address common.Address) (bool, error) { + var ( + err error + code []byte + balance *big.Int + nonce uint64 + ) + code, err = rskRetry(func() ([]byte, error) { + return rpc.client.CodeAt(ctx, address, nil) + }) + if err != nil { + return false, err + } + + balance, err = rskRetry(func() (*big.Int, error) { + return rpc.client.BalanceAt(ctx, address, nil) + }) + if err != nil { + return false, err + } + + nonce, err = rskRetry(func() (uint64, error) { + return rpc.client.NonceAt(ctx, address, nil) + }) + if err != nil { + return false, err + } + + return len(code) == 0 && balance.Cmp(common.Big0) == 0 && nonce == 0, nil +} diff --git a/internal/adapters/dataproviders/rootstock/wallet.go b/internal/adapters/dataproviders/rootstock/wallet.go new file mode 100644 index 00000000..f141ff66 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/wallet.go @@ -0,0 +1,77 @@ +package rootstock + +import ( + "bytes" + "context" + "errors" + "fmt" + "github.com/ethereum/go-ethereum/common" + geth "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" + "math/big" +) + +type RskWalletImpl struct { + client *ethclient.Client + account *RskAccount + chainId uint64 +} + +func NewRskWalletImpl(client *RskClient, account *RskAccount, chainId uint64) *RskWalletImpl { + return &RskWalletImpl{client: client.client, account: account, chainId: chainId} +} + +func (wallet *RskWalletImpl) Address() common.Address { + return wallet.account.Account.Address +} + +func (wallet *RskWalletImpl) Sign(address common.Address, transaction *geth.Transaction) (*geth.Transaction, error) { + var chainId big.Int + if !bytes.Equal(address[:], wallet.account.Account.Address[:]) { + return nil, fmt.Errorf("provider address %v is incorrect", address.Hash()) + } + chainId.SetUint64(wallet.chainId) + return wallet.account.Keystore.SignTx(*wallet.account.Account, transaction, &chainId) +} + +func (wallet *RskWalletImpl) SignBytes(msg []byte) ([]byte, error) { + return wallet.account.Keystore.SignHash(*wallet.account.Account, msg) +} + +func (wallet *RskWalletImpl) SendRbtc(ctx context.Context, config blockchain.TransactionConfig, toAddress string) (string, error) { + var to common.Address + var signedTx *geth.Transaction + var nonce uint64 + var err error + + if err = ParseAddress(&to, toAddress); err != nil { + return "", err + } + + newCtx, cancel := context.WithTimeout(ctx, txMiningWaitTimeout) + defer cancel() + + if config.GasPrice == nil || config.Value == nil || config.GasLimit == nil { + return "", errors.New("incomplete transaction arguments") + } + + if nonce, err = wallet.client.PendingNonceAt(newCtx, wallet.Address()); err != nil { + return "", err + } + + tx := geth.NewTx(&geth.LegacyTx{ + To: &to, + Nonce: nonce, + GasPrice: config.GasPrice.AsBigInt(), + Gas: *config.GasLimit, + Value: config.Value.AsBigInt(), + }) + log.Infof("Sending %v RBTC to %s\n", config.Value.ToRbtc(), toAddress) + if signedTx, err = wallet.Sign(wallet.Address(), tx); err != nil { + return "", err + } + err = wallet.client.SendTransaction(newCtx, signedTx) + return tx.Hash().String(), err +} diff --git a/internal/adapters/entrypoints/rest/common.go b/internal/adapters/entrypoints/rest/common.go new file mode 100644 index 00000000..1bdaad69 --- /dev/null +++ b/internal/adapters/entrypoints/rest/common.go @@ -0,0 +1,90 @@ +package rest + +import ( + "encoding/json" + "fmt" + "github.com/go-playground/validator/v10" + log "github.com/sirupsen/logrus" + "net/http" + "time" +) + +var RequestValidator = validator.New(validator.WithRequiredStructEnabled()) + +type ErrorDetails = map[string]any + +type ErrorResponse struct { + Message string `json:"message"` + Details ErrorDetails `json:"details"` + Timestamp int64 `json:"timestamp"` + Recoverable bool `json:"recoverable"` +} + +func NewErrorResponseWithDetails(message string, details ErrorDetails, recoverable bool) *ErrorResponse { + return &ErrorResponse{Message: message, Details: details, Timestamp: time.Now().Unix(), Recoverable: recoverable} +} + +func NewErrorResponse(message string, recoverable bool) *ErrorResponse { + return NewErrorResponseWithDetails(message, make(ErrorDetails), recoverable) +} + +func DetailsFromError(err error) ErrorDetails { + details := make(ErrorDetails) + details["error"] = err.Error() + return details +} + +func JsonResponse(w http.ResponseWriter, statusCode int) { + JsonResponseWithBody[any](w, statusCode, nil) +} + +func JsonErrorResponse(w http.ResponseWriter, code int, response *ErrorResponse) { + JsonResponseWithBody(w, code, response) +} + +func JsonResponseWithBody[T any](w http.ResponseWriter, statusCode int, body *T) { + var err error + w.Header().Set("Content-Type", "lps/json") + w.WriteHeader(statusCode) + if body == nil { + return + } else if err = json.NewEncoder(w).Encode(body); err != nil { + responseError := NewErrorResponse("Unable to build response", true) + if err = json.NewEncoder(w).Encode(responseError); err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + } + } +} + +func DecodeRequestError(w http.ResponseWriter, err error) { + log.Error("Error decoding request: ", err.Error()) + jsonErr := NewErrorResponse(fmt.Sprintf("Error decoding request: %v", err), true) + JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return +} + +func DecodeRequest[T any](w http.ResponseWriter, req *http.Request, body *T) error { + var err error + dec := json.NewDecoder(req.Body) + dec.DisallowUnknownFields() + if err = dec.Decode(body); err != nil { + DecodeRequestError(w, err) + return err + } + return nil +} + +func ValidateRequest[T any](w http.ResponseWriter, body *T) error { + err := RequestValidator.Struct(body) + if err == nil { + return nil + } + validationErrors := err.(validator.ValidationErrors) + details := make(ErrorDetails) + for _, field := range validationErrors { + details[field.Field()] = fmt.Sprintf("validation failed: %s", field.Tag()) + } + jsonErr := NewErrorResponseWithDetails("validation error", details, true) + JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return err +} diff --git a/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go b/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go new file mode 100644 index 00000000..09a8519c --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go @@ -0,0 +1,44 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewAcceptPeginQuoteHandler(useCase *pegin.AcceptQuoteUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + acceptRequest := pkg.AcceptQuoteRequest{} + if err = rest.DecodeRequest(w, req, &acceptRequest); err != nil { + return + } else if err = rest.ValidateRequest(w, &acceptRequest); err != nil { + return + } + + acceptedQuote, err := useCase.Run(req.Context(), acceptRequest.QuoteHash) + if errors.Is(err, usecases.QuoteNotFoundError) || + errors.Is(err, usecases.ExpiredQuoteError) { + jsonErr := rest.NewErrorResponseWithDetails("invalid request", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } else if errors.Is(err, usecases.NoLiquidityError) { + jsonErr := rest.NewErrorResponseWithDetails("not enough liquidity", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + response := pkg.AcceptPeginRespose{ + Signature: acceptedQuote.Signature, + BitcoinDepositAddressHash: acceptedQuote.DepositAddress, + } + rest.JsonResponseWithBody(w, http.StatusOK, &response) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go b/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go new file mode 100644 index 00000000..7059d7ce --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go @@ -0,0 +1,44 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewAcceptPegoutQuoteHandler(useCase *pegout.AcceptQuoteUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + acceptRequest := pkg.AcceptQuoteRequest{} + if err = rest.DecodeRequest(w, req, &acceptRequest); err != nil { + return + } else if err = rest.ValidateRequest(w, &acceptRequest); err != nil { + return + } + + acceptedQuote, err := useCase.Run(req.Context(), acceptRequest.QuoteHash) + if errors.Is(err, usecases.QuoteNotFoundError) || + errors.Is(err, usecases.ExpiredQuoteError) { + jsonErr := rest.NewErrorResponseWithDetails("invalid request", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } else if errors.Is(err, usecases.NoLiquidityError) { + jsonErr := rest.NewErrorResponseWithDetails("not enough liquidity", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + response := pkg.AcceptPegoutResponse{ + Signature: acceptedQuote.Signature, + LbcAddress: acceptedQuote.DepositAddress, + } + rest.JsonResponseWithBody(w, http.StatusOK, &response) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go b/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go new file mode 100644 index 00000000..70608fb2 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go @@ -0,0 +1,36 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewAddPeginCollateralHandler(useCase *pegin.AddCollateralUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := pkg.AddCollateralRequest{} + if err = rest.DecodeRequest(w, req, &request); err != nil { + return + } else if err = rest.ValidateRequest(w, &request); err != nil { + return + } + + result, err := useCase.Run(entities.NewUWei(request.Amount)) + if errors.Is(err, usecases.InsufficientAmountError) { + jsonErr := rest.NewErrorResponseWithDetails("not enough for minimum collateral", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + response := pkg.AddCollateralResponse{NewCollateralBalance: result.Uint64()} + rest.JsonResponseWithBody(w, http.StatusOK, &response) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go b/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go new file mode 100644 index 00000000..3c5c634e --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go @@ -0,0 +1,36 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewAddPegoutCollateralHandler(useCase *pegout.AddCollateralUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := pkg.AddCollateralRequest{} + if err = rest.DecodeRequest(w, req, &request); err != nil { + return + } else if err = rest.ValidateRequest(w, &request); err != nil { + return + } + + result, err := useCase.Run(entities.NewUWei(request.Amount)) + if errors.Is(err, usecases.InsufficientAmountError) { + jsonErr := rest.NewErrorResponseWithDetails("not enough for minimum collateral", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + response := pkg.AddCollateralResponse{NewCollateralBalance: result.Uint64()} + rest.JsonResponseWithBody(w, http.StatusOK, &response) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/change_status.go b/internal/adapters/entrypoints/rest/handlers/change_status.go new file mode 100644 index 00000000..92a7a873 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/change_status.go @@ -0,0 +1,28 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewChangeStatusHandler(useCase *liquidity_provider.ChangeStatusUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := pkg.ChangeStatusRequest{} + if err = rest.DecodeRequest(w, req, &request); err != nil { + return + } else if err = rest.ValidateRequest(w, &request); err != nil { + return + } + + err = useCase.Run(*request.Status) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + rest.JsonResponse(w, http.StatusNoContent) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go b/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go new file mode 100644 index 00000000..60754261 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go @@ -0,0 +1,20 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewGetPeginCollateralHandler(useCase *pegin.GetCollateralUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + collateral, err := useCase.Run() + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + rest.JsonResponseWithBody(w, http.StatusOK, &pkg.GetCollateralResponse{Collateral: collateral.Uint64()}) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go new file mode 100644 index 00000000..be8b925c --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go @@ -0,0 +1,60 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewGetPeginQuoteHandler(useCase *pegin.GetQuoteUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + var result pegin.GetPeginQuoteResult + var callArgument []byte + quoteRequest := pkg.PeginQuoteRequest{} + if err = rest.DecodeRequest(w, req, "eRequest); err != nil { + return + } else if err = rest.ValidateRequest(w, "eRequest); err != nil { + return + } + + if callArgument, err = blockchain.DecodeStringTrimPrefix(quoteRequest.CallContractArguments); err != nil { + jsonErr := rest.NewErrorResponse(err.Error(), true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } + + peginRequest := pegin.NewQuoteRequest( + quoteRequest.CallEoaOrContractAddress, + callArgument, + entities.NewUWei(quoteRequest.ValueToTransfer), + quoteRequest.RskRefundAddress, + quoteRequest.BitcoinRefundAddress, + ) + + result, err = useCase.Run(req.Context(), peginRequest) + if errors.Is(err, usecases.BtcAddressNotSupportedError) || + errors.Is(err, usecases.RskAddressNotSupportedError) || + errors.Is(err, usecases.TxBelowMinimumError) || + errors.Is(err, usecases.AmountOutOfRangeError) { + jsonErr := rest.NewErrorResponseWithDetails("invalid request", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + quoteDto := pkg.ToPeginQuoteDTO(result.PeginQuote) + responseBody := []pkg.GetPeginQuoteResponse{{ + Quote: quoteDto, + QuoteHash: result.Hash, + }} // to keep compatibility with legacy API + rest.JsonResponseWithBody(w, http.StatusOK, &responseBody) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go b/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go new file mode 100644 index 00000000..ec547d60 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go @@ -0,0 +1,20 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewGetPegoutCollateralHandler(useCase *pegout.GetCollateralUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + collateral, err := useCase.Run() + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + rest.JsonResponseWithBody(w, http.StatusOK, &pkg.GetCollateralResponse{Collateral: collateral.Uint64()}) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go new file mode 100644 index 00000000..88fe708c --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go @@ -0,0 +1,55 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewGetPegoutQuoteHandler(useCase *pegout.GetQuoteUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + var result pegout.GetPegoutQuoteResult + quoteRequest := pkg.PegoutQuoteRequest{} + if err = rest.DecodeRequest(w, req, "eRequest); err != nil { + return + } else if err = rest.ValidateRequest(w, "eRequest); err != nil { + return + } + + pegoutRequest := pegout.NewQuoteRequest( + quoteRequest.To, + entities.NewUWei(quoteRequest.ValueToTransfer), + quoteRequest.RskRefundAddress, + quoteRequest.BitcoinRefundAddress, + ) + + result, err = useCase.Run(req.Context(), pegoutRequest) + if errors.Is(err, usecases.BtcAddressNotSupportedError) || + errors.Is(err, usecases.RskAddressNotSupportedError) || + errors.Is(err, usecases.TxBelowMinimumError) || + errors.Is(err, usecases.AmountOutOfRangeError) { + jsonErr := rest.NewErrorResponseWithDetails("invalid request", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } else if errors.Is(err, usecases.NoLiquidityError) { + jsonErr := rest.NewErrorResponseWithDetails("no enough liquidity", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + quoteDto := pkg.ToPegoutQuoteDTO(result.PegoutQuote) + responseBody := []pkg.GetPegoutQuoteResponse{{ + Quote: quoteDto, + QuoteHash: result.Hash, + }} // to keep compatibility with legacy API + rest.JsonResponseWithBody(w, http.StatusOK, &responseBody) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_providers.go b/internal/adapters/entrypoints/rest/handlers/get_providers.go new file mode 100644 index 00000000..fcc5bd55 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_providers.go @@ -0,0 +1,34 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewGetProvidersHandler(useCase *liquidity_provider.GetProvidersUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + providers, err := useCase.Run() + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + result := make([]pkg.LiquidityProvider, 0) + for _, provider := range providers { + result = append(result, + pkg.LiquidityProvider{ + Id: provider.Id, + Provider: provider.Address, + Name: provider.Name, + ApiBaseUrl: provider.ApiBaseUrl, + Status: provider.Status, + ProviderType: string(provider.ProviderType), + }, + ) + } + rest.JsonResponseWithBody(w, http.StatusOK, &result) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go b/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go new file mode 100644 index 00000000..dc46ef28 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go @@ -0,0 +1,40 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewGetUserQuotesHandler(useCase *pegout.GetUserDepositsUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + address := req.URL.Query().Get("address") + if address == "" { + http.Error(w, "address parameter is required", http.StatusBadRequest) + return + } + + deposits, err := useCase.Run(req.Context(), address) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + depositDtos := make([]pkg.DepositEventDTO, 0) + + for _, deposit := range deposits { + depositDtos = append(depositDtos, pkg.DepositEventDTO{ + TxHash: deposit.TxHash, + QuoteHash: deposit.QuoteHash, + Amount: deposit.Amount.AsBigInt(), + Timestamp: deposit.Timestamp, + BlockNumber: deposit.BlockNumber, + From: deposit.From, + }) + } + + rest.JsonResponseWithBody(w, http.StatusOK, &depositDtos) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/health.go b/internal/adapters/entrypoints/rest/handlers/health.go new file mode 100644 index 00000000..dc35dcc4 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/health.go @@ -0,0 +1,23 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewHealthCheckHandler(useCase *usecases.HealthUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + result := useCase.Run(req.Context()) + response := pkg.HealthResponse{ + Status: result.Status, + Services: pkg.Services{ + Db: result.Services.Db, + Rsk: result.Services.Rsk, + Btc: result.Services.Btc, + }, + } + rest.JsonResponseWithBody(w, http.StatusOK, &response) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/options.go b/internal/adapters/entrypoints/rest/handlers/options.go new file mode 100644 index 00000000..99f60c75 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/options.go @@ -0,0 +1,9 @@ +package handlers + +import "net/http" + +func NewOptionsHandler() http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + w.WriteHeader(http.StatusOK) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/provider_details.go b/internal/adapters/entrypoints/rest/handlers/provider_details.go new file mode 100644 index 00000000..65ca885c --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/provider_details.go @@ -0,0 +1,35 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +func NewProviderDetailsHandler(useCase *liquidity_provider.GetDetailUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + result, err := useCase.Run() + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + response := pkg.ProviderDetailResponse{ + SiteKey: result.SiteKey, + Pegin: pkg.ProviderDetail{ + Fee: result.Pegin.Fee.Uint64(), + MinTransactionValue: result.Pegin.MinTransactionValue.Uint64(), + MaxTransactionValue: result.Pegin.MaxTransactionValue.Uint64(), + RequiredConfirmations: result.Pegin.RequiredConfirmations, + }, + Pegout: pkg.ProviderDetail{ + Fee: result.Pegout.Fee.Uint64(), + MinTransactionValue: result.Pegout.MinTransactionValue.Uint64(), + MaxTransactionValue: result.Pegout.MaxTransactionValue.Uint64(), + RequiredConfirmations: result.Pegout.RequiredConfirmations, + }, + } + rest.JsonResponseWithBody(w, http.StatusOK, &response) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/resignation.go b/internal/adapters/entrypoints/rest/handlers/resignation.go new file mode 100644 index 00000000..1f42c89b --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/resignation.go @@ -0,0 +1,19 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "net/http" +) + +func NewResignationHandler(useCase *liquidity_provider.ResignUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + err := useCase.Run() + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + rest.JsonResponse(w, http.StatusNoContent) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go b/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go new file mode 100644 index 00000000..0b01e648 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go @@ -0,0 +1,24 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "net/http" +) + +func NewWithdrawPeginCollateralHandler(useCase *pegin.WithdrawCollateralUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + err := useCase.Run() + if errors.Is(err, usecases.ProviderNotResignedError) { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + } else { + rest.JsonResponse(w, http.StatusNoContent) + } + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go b/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go new file mode 100644 index 00000000..4783cfba --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go @@ -0,0 +1,24 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "net/http" +) + +func NewWithdrawPegoutCollateralHandler(useCase *pegout.WithdrawCollateralUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + err := useCase.Run() + if errors.Is(err, usecases.ProviderNotResignedError) { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), true) + rest.JsonErrorResponse(w, http.StatusConflict, jsonErr) + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + } else { + rest.JsonResponse(w, http.StatusNoContent) + } + } +} diff --git a/internal/adapters/entrypoints/rest/middlewares/captcha.go b/internal/adapters/entrypoints/rest/middlewares/captcha.go new file mode 100644 index 00000000..f49efe9f --- /dev/null +++ b/internal/adapters/entrypoints/rest/middlewares/captcha.go @@ -0,0 +1,80 @@ +package middlewares + +import ( + "encoding/json" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + log "github.com/sirupsen/logrus" + "net/http" + "net/url" + "time" +) + +type captchaValidationResponse struct { + Success bool `json:"success"` + Score *float32 `json:"score"` + Action *string `json:"action"` + ChallengeTs time.Time `json:"challenge_ts"` + Hostname string `json:"hostname"` + ErrorCodes []string `json:"error-codes"` +} + +func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecretKey string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + if captchaThreshold < 0.5 { + log.Warn("Too low captcha threshold value!") + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("X-Captcha-Token") + if disabled { + log.Warn("IMPORTANT! Handling request with captcha validation disabled") + next.ServeHTTP(w, r) + return + } else if token == "" { + jsonErr := rest.NewErrorResponse("missing X-Captcha-Token header", true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } + + form := make(url.Values) + form.Set("secret", captchaSecretKey) + form.Set("response", token) + res, err := http.DefaultClient.PostForm("https://www.google.com/recaptcha/api/siteverify", form) + if err != nil { + details := make(rest.ErrorDetails) + details["error"] = err.Error() + jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + defer func() { + if err = res.Body.Close(); err != nil { + log.Error("Error closing response body: ", err) + } + }() + + var validation captchaValidationResponse + err = json.NewDecoder(res.Body).Decode(&validation) + if err != nil { + jsonErr := rest.NewErrorResponse("error validating captcha", false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + validCaptcha := validation.Success + if validation.Score != nil { // if is v3 we also use the score + validCaptcha = validCaptcha && *validation.Score >= captchaThreshold + } + + if validCaptcha { + log.Debugf("Valid captcha solved on %s\n", validation.Hostname) + next.ServeHTTP(w, r) + } else { + details := make(rest.ErrorDetails) + details["errors"] = validation.ErrorCodes + jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + } + }) + } +} diff --git a/internal/adapters/entrypoints/rest/middlewares/cors.go b/internal/adapters/entrypoints/rest/middlewares/cors.go new file mode 100644 index 00000000..68fcfd25 --- /dev/null +++ b/internal/adapters/entrypoints/rest/middlewares/cors.go @@ -0,0 +1,18 @@ +package middlewares + +import "net/http" + +func NewCorsMiddleware() func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + headers := w.Header() + headers.Add("Access-Control-Allow-Origin", "*") + headers.Add("Vary", "Origin") + headers.Add("Vary", "Access-Control-Request-Method") + headers.Add("Vary", "Access-Control-Request-Headers") + headers.Add("Access-Control-Allow-Headers", "Content-Type, Origin, Accept, token, X-Captcha-Token") + headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS") + next.ServeHTTP(w, r) + }) + } +} diff --git a/internal/adapters/entrypoints/rest/registry/registry.go b/internal/adapters/entrypoints/rest/registry/registry.go new file mode 100644 index 00000000..74340a38 --- /dev/null +++ b/internal/adapters/entrypoints/rest/registry/registry.go @@ -0,0 +1,27 @@ +package registry + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" +) + +type UseCaseRegistry interface { + GetPeginQuoteUseCase() *pegin.GetQuoteUseCase + GetAcceptPeginQuoteUseCase() *pegin.AcceptQuoteUseCase + GetProviderDetailUseCase() *liquidity_provider.GetDetailUseCase + GetPegoutQuoteUseCase() *pegout.GetQuoteUseCase + GetAcceptPegoutQuoteUseCase() *pegout.AcceptQuoteUseCase + GetUserDepositsUseCase() *pegout.GetUserDepositsUseCase + GetProvidersUseCase() *liquidity_provider.GetProvidersUseCase + GetPeginCollateralUseCase() *pegin.GetCollateralUseCase + GetPegoutCollateralUseCase() *pegout.GetCollateralUseCase + WithdrawPeginCollateralUseCase() *pegin.WithdrawCollateralUseCase + WithdrawPegoutCollateralUseCase() *pegout.WithdrawCollateralUseCase + HealthUseCase() *usecases.HealthUseCase + ResignationUseCase() *liquidity_provider.ResignUseCase + ChangeStatusUseCase() *liquidity_provider.ChangeStatusUseCase + AddPeginCollateralUseCase() *pegin.AddCollateralUseCase + AddPegoutCollateralUseCase() *pegout.AddCollateralUseCase +} diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go new file mode 100644 index 00000000..c0b6e29c --- /dev/null +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -0,0 +1,53 @@ +package routes + +import ( + "github.com/gorilla/mux" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/middlewares" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "net/http" +) + +func ConfigureRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { + router.Use(middlewares.NewCorsMiddleware()) + captchaMiddleware := middlewares.NewCaptchaMiddleware(env.Captcha.Threshold, env.Captcha.Disabled, env.Captcha.SecretKey) + + router.Path("/health").Methods(http.MethodGet).HandlerFunc(handlers.NewHealthCheckHandler(useCaseRegistry.HealthUseCase())) + router.Path("/getProviders").Methods(http.MethodGet).HandlerFunc(handlers.NewGetProvidersHandler(useCaseRegistry.GetProvidersUseCase())) + router.Path("/pegin/getQuote").Methods(http.MethodPost).HandlerFunc(handlers.NewGetPeginQuoteHandler(useCaseRegistry.GetPeginQuoteUseCase())) + router.Path("/pegin/acceptQuote").Methods(http.MethodPost).Handler( + captchaMiddleware( + handlers.NewAcceptPeginQuoteHandler(useCaseRegistry.GetAcceptPeginQuoteUseCase()), + ), + ) + router.Path("/pegout/getQuotes").Methods(http.MethodPost).HandlerFunc(handlers.NewGetPegoutQuoteHandler(useCaseRegistry.GetPegoutQuoteUseCase())) + router.Path("/pegout/acceptQuote").Methods(http.MethodPost).Handler( + captchaMiddleware( + handlers.NewAcceptPegoutQuoteHandler(useCaseRegistry.GetAcceptPegoutQuoteUseCase()), + ), + ) + router.Path("/userQuotes").Methods(http.MethodGet).HandlerFunc(handlers.NewGetUserQuotesHandler(useCaseRegistry.GetUserDepositsUseCase())) + router.Path("/providers/details").Methods(http.MethodGet).HandlerFunc(handlers.NewProviderDetailsHandler(useCaseRegistry.GetProviderDetailUseCase())) + + if env.EnableManagementApi { + router.Path("/pegin/collateral").Methods(http.MethodGet). + HandlerFunc(handlers.NewGetPeginCollateralHandler(useCaseRegistry.GetPeginCollateralUseCase())) + router.Path("/pegin/addCollateral").Methods(http.MethodPost). + HandlerFunc(handlers.NewAddPeginCollateralHandler(useCaseRegistry.AddPeginCollateralUseCase())) + router.Path("/pegin/withdrawCollateral").Methods(http.MethodPost). + HandlerFunc(handlers.NewWithdrawPeginCollateralHandler(useCaseRegistry.WithdrawPeginCollateralUseCase())) + router.Path("/pegout/collateral").Methods(http.MethodGet). + HandlerFunc(handlers.NewGetPegoutCollateralHandler(useCaseRegistry.GetPegoutCollateralUseCase())) + router.Path("/pegout/addCollateral").Methods(http.MethodPost). + HandlerFunc(handlers.NewAddPegoutCollateralHandler(useCaseRegistry.AddPegoutCollateralUseCase())) + router.Path("/pegout/withdrawCollateral").Methods(http.MethodPost). + HandlerFunc(handlers.NewWithdrawPegoutCollateralHandler(useCaseRegistry.WithdrawPegoutCollateralUseCase())) + router.Path("/providers/changeStatus").Methods(http.MethodPost). + HandlerFunc(handlers.NewChangeStatusHandler(useCaseRegistry.ChangeStatusUseCase())) + router.Path("/providers/resignation").Methods(http.MethodPost). + HandlerFunc(handlers.NewResignationHandler(useCaseRegistry.ResignationUseCase())) + } + + router.Methods(http.MethodOptions).HandlerFunc(handlers.NewOptionsHandler()) +} diff --git a/internal/adapters/entrypoints/rest/server/server.go b/internal/adapters/entrypoints/rest/server/server.go new file mode 100644 index 00000000..45a2696f --- /dev/null +++ b/internal/adapters/entrypoints/rest/server/server.go @@ -0,0 +1,71 @@ +package server + +import ( + "context" + "errors" + "fmt" + "github.com/gorilla/handlers" + "github.com/gorilla/mux" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/routes" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" + "io" + "net/http" + "os" + "os/signal" + "syscall" +) + +type Server struct { + http http.Server + logLevel log.Level + router *mux.Router + doneChannel chan os.Signal + env environment.Environment + useCaseRegistry registry.UseCaseRegistry +} + +func NewServer(env environment.Environment, useCaseRegistry registry.UseCaseRegistry, logLevel log.Level) (*Server, <-chan os.Signal) { + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + return &Server{ + env: env, + doneChannel: done, + logLevel: logLevel, + router: mux.NewRouter(), + useCaseRegistry: useCaseRegistry, + }, done +} + +func (s *Server) start() error { + routes.ConfigureRoutes(s.router, s.env, s.useCaseRegistry) + w := log.StandardLogger().WriterLevel(s.logLevel) + h := handlers.LoggingHandler(w, s.router) + defer func(w *io.PipeWriter) { + _ = w.Close() + }(w) + s.http = http.Server{ + Addr: ":" + fmt.Sprint(s.env.Port), + Handler: h, + } + log.Info("Server started at localhost:", s.http.Addr) + return s.http.ListenAndServe() +} + +// Start to be called inside goroutine +func (s *Server) Start() { + if err := s.start(); err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Error("Error running server: ", err) + s.doneChannel <- syscall.SIGTERM + } +} + +func (s *Server) Shutdown(closeChannel chan<- bool) { + err := s.http.Shutdown(context.Background()) + if err != nil { + log.Error("Error shutting down server", err) + } + closeChannel <- true + log.Debug("Server shutdown completed") +} diff --git a/internal/adapters/entrypoints/watcher/common.go b/internal/adapters/entrypoints/watcher/common.go new file mode 100644 index 00000000..f7cbf85c --- /dev/null +++ b/internal/adapters/entrypoints/watcher/common.go @@ -0,0 +1,23 @@ +package watcher + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "time" +) + +const ( + quoteCleanInterval = 10 * time.Minute + peginDepositWatcherInterval = 1 * time.Minute + peginBridgeWatcherInterval = 3 * time.Minute + pegoutDepositWatcherInterval = 1 * time.Minute + pegoutBtcTransferWatcherInterval = 3 * time.Minute + liquidityCheckInterval = 10 * time.Minute + penalizationCheckInterval = 10 * time.Minute +) + +type Watcher interface { + entities.Closeable + Prepare(ctx context.Context) error + Start() +} diff --git a/internal/adapters/entrypoints/watcher/liquidity_check.go b/internal/adapters/entrypoints/watcher/liquidity_check.go new file mode 100644 index 00000000..3b1d5378 --- /dev/null +++ b/internal/adapters/entrypoints/watcher/liquidity_check.go @@ -0,0 +1,49 @@ +package watcher + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + log "github.com/sirupsen/logrus" + "time" +) + +type LiquidityCheckWatcher struct { + checkLiquidityUseCase *liquidity_provider.CheckLiquidityUseCase + watcherStopChannel chan bool + ticker *time.Ticker +} + +func NewLiquidityCheckWatcher(checkLiquidityUseCase *liquidity_provider.CheckLiquidityUseCase) *LiquidityCheckWatcher { + watcherStopChannel := make(chan bool, 1) + return &LiquidityCheckWatcher{checkLiquidityUseCase: checkLiquidityUseCase, watcherStopChannel: watcherStopChannel} +} + +func (watcher *LiquidityCheckWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("PeginBridgeWatcher shut down") +} + +func (watcher *LiquidityCheckWatcher) Prepare(ctx context.Context) error { return nil } + +func (watcher *LiquidityCheckWatcher) Start() { + var ctx context.Context + var cancel context.CancelFunc + watcher.ticker = time.NewTicker(liquidityCheckInterval) + +watcherLoop: + for { + select { + case <-watcher.ticker.C: + ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) + if err := watcher.checkLiquidityUseCase.Run(ctx); err != nil { + log.Error("Error checking liquidity inside watcher: ", err) + } + cancel() + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} diff --git a/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go b/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go new file mode 100644 index 00000000..5426925d --- /dev/null +++ b/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go @@ -0,0 +1,138 @@ +package watcher + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + w "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + log "github.com/sirupsen/logrus" + "math/big" + "time" +) + +type PeginBridgeWatcher struct { + quotes map[string]w.WatchedPeginQuote + registerPeginUseCase *pegin.RegisterPeginUseCase + getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase + bridge blockchain.RootstockBridge + btcRpc blockchain.BitcoinNetwork + ticker *time.Ticker + eventBus entities.EventBus + watcherStopChannel chan bool + currentBlock *big.Int +} + +func NewPeginBridgeWatcher( + registerPeginUseCase *pegin.RegisterPeginUseCase, + getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase, + bridge blockchain.RootstockBridge, + btcRpc blockchain.BitcoinNetwork, + eventBus entities.EventBus, +) *PeginBridgeWatcher { + quotes := make(map[string]w.WatchedPeginQuote) + watcherStopChannel := make(chan bool, 1) + return &PeginBridgeWatcher{ + quotes: quotes, + registerPeginUseCase: registerPeginUseCase, + getWatchedPeginQuoteUseCase: getWatchedPeginQuoteUseCase, + bridge: bridge, + btcRpc: btcRpc, + eventBus: eventBus, + watcherStopChannel: watcherStopChannel, + } +} + +func (watcher *PeginBridgeWatcher) Prepare(ctx context.Context) error { + watcher.currentBlock = big.NewInt(0) + watchedQuotes, err := watcher.getWatchedPeginQuoteUseCase.Run(ctx, quote.PeginStateCallForUserSucceeded) + if err != nil { + return err + } + for _, watchedQuote := range watchedQuotes { + watcher.quotes[watchedQuote.RetainedQuote.QuoteHash] = watchedQuote + } + return nil +} + +func (watcher *PeginBridgeWatcher) Start() { + eventChannel := watcher.eventBus.Subscribe(quote.CallForUserCompletedEventId) + watcher.ticker = time.NewTicker(peginBridgeWatcherInterval) +watcherLoop: + for { + select { + case <-watcher.ticker.C: + if height, err := watcher.btcRpc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { + watcher.checkQuotes() + watcher.currentBlock = height + } else if err != nil { + log.Error("PeginBridgeWatcher: error getting Bitcoin chain height: ", err) + } + case event := <-eventChannel: + if event != nil { + watcher.handleCallForUserCompleted(event) + } + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} + +func (watcher *PeginBridgeWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("PeginBridgeWatcher shut down") +} + +func (watcher *PeginBridgeWatcher) handleCallForUserCompleted(event entities.Event) { + parsedEvent, ok := event.(quote.CallForUserCompletedEvent) + quoteHash := parsedEvent.RetainedQuote.QuoteHash + if !ok { + log.Error("Trying to parse wrong event in Pegin Bridge watcher") + return + } + + if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { + log.Infof("Quote %s is already watched\n", quoteHash) + return + } + if parsedEvent.RetainedQuote.State == quote.PeginStateCallForUserSucceeded { + watcher.quotes[quoteHash] = w.NewWatchedPeginQuote(parsedEvent.PeginQuote, parsedEvent.RetainedQuote) + } +} + +func (watcher *PeginBridgeWatcher) checkQuotes() { + var err error + var tx blockchain.BitcoinTransactionInformation + for _, watchedQuote := range watcher.quotes { + if tx, err = watcher.btcRpc.GetTransactionInfo(watchedQuote.RetainedQuote.UserBtcTxHash); err != nil { + log.Errorf("Error getting Bitcoin transaction information %s: %v\n", watchedQuote.RetainedQuote.UserBtcTxHash, err) + return + } + if watcher.validateQuote(watchedQuote, tx) { + watcher.registerPegin(watchedQuote) + } + } +} + +func (watcher *PeginBridgeWatcher) registerPegin(watchedQuote w.WatchedPeginQuote) { + var err error + if err = watcher.registerPeginUseCase.Run(context.Background(), watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + } else if err != nil { + log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + } else { + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + } +} + +func (watcher *PeginBridgeWatcher) validateQuote(watchedQuote w.WatchedPeginQuote, tx blockchain.BitcoinTransactionInformation) bool { + return watchedQuote.RetainedQuote.State == quote.PeginStateCallForUserSucceeded && + tx.Confirmations >= watcher.bridge.GetRequiredTxConfirmations() +} diff --git a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go new file mode 100644 index 00000000..8385a09a --- /dev/null +++ b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go @@ -0,0 +1,169 @@ +package watcher + +import ( + "context" + "errors" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + w "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + log "github.com/sirupsen/logrus" + "math/big" + "time" +) + +type PeginDepositAddressWatcher struct { + quotes map[string]w.WatchedPeginQuote + getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase + callForUserUseCase *pegin.CallForUserUseCase + expiredUseCase *pegin.ExpiredPeginQuoteUseCase + btcWallet blockchain.BitcoinWallet + btcRpc blockchain.BitcoinNetwork + ticker *time.Ticker + eventBus entities.EventBus + watcherStopChannel chan bool + currentBlock *big.Int +} + +func NewPeginDepositAddressWatcher( + callForUserUseCase *pegin.CallForUserUseCase, + getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase, + expiredUseCase *pegin.ExpiredPeginQuoteUseCase, + btcWallet blockchain.BitcoinWallet, + btcRpc blockchain.BitcoinNetwork, + eventBus entities.EventBus, +) *PeginDepositAddressWatcher { + quotes := make(map[string]w.WatchedPeginQuote) + watcherStopChannel := make(chan bool, 1) + return &PeginDepositAddressWatcher{ + quotes: quotes, + callForUserUseCase: callForUserUseCase, + getWatchedPeginQuoteUseCase: getWatchedPeginQuoteUseCase, + expiredUseCase: expiredUseCase, + btcWallet: btcWallet, + eventBus: eventBus, + watcherStopChannel: watcherStopChannel, + btcRpc: btcRpc, + } +} + +func (watcher *PeginDepositAddressWatcher) Prepare(ctx context.Context) error { + var err error + var depositAddress string + var watchedQuotes []w.WatchedPeginQuote + watcher.currentBlock = big.NewInt(0) + watchedQuotes, err = watcher.getWatchedPeginQuoteUseCase.Run(ctx, quote.PeginStateWaitingForDeposit) + if err != nil { + return err + } + for _, watchedQuote := range watchedQuotes { + depositAddress = watchedQuote.RetainedQuote.DepositAddress + if err = watcher.btcWallet.ImportAddress(depositAddress); err != nil { + return fmt.Errorf("error while importing deposit address (%s): %v\n", depositAddress, err) + } + watcher.quotes[watchedQuote.RetainedQuote.QuoteHash] = watchedQuote + } + return nil +} + +func (watcher *PeginDepositAddressWatcher) Start() { + eventChannel := watcher.eventBus.Subscribe(quote.AcceptedPeginQuoteEventId) + watcher.ticker = time.NewTicker(peginDepositWatcherInterval) +watcherLoop: + for { + select { + case <-watcher.ticker.C: + if height, err := watcher.btcRpc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { + watcher.checkQuotes() + watcher.currentBlock = height + } else if err != nil { + log.Error("PeginDepositAddressWatcher: error getting Bitcoin chain height: ", err) + } + case event := <-eventChannel: + if event != nil { + watcher.handleAcceptedPeginQuote(event) + } + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} + +func (watcher *PeginDepositAddressWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("PeginDepositAddressWatcher shut down") +} + +func (watcher *PeginDepositAddressWatcher) handleAcceptedPeginQuote(event entities.Event) { + parsedEvent, ok := event.(quote.AcceptedPeginQuoteEvent) + quoteHash := parsedEvent.RetainedQuote.QuoteHash + if !ok { + log.Error("Trying to parse wrong event in Pegin Btc deposit watcher") + return + } + + if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { + log.Infof("Quote %s is already watched\n", quoteHash) + return + } + + err := watcher.btcWallet.ImportAddress(parsedEvent.RetainedQuote.DepositAddress) + if err != nil { + log.Errorf("error while importing deposit address (%s): %v\n", parsedEvent.RetainedQuote.DepositAddress, err) + return + } + watcher.quotes[quoteHash] = w.NewWatchedPeginQuote(parsedEvent.Quote, parsedEvent.RetainedQuote) +} + +func (watcher *PeginDepositAddressWatcher) checkQuotes() { + for _, watchedQuote := range watcher.quotes { + watcher.handleQuote(watchedQuote) + } +} + +func (watcher *PeginDepositAddressWatcher) handleQuote(watchedQuote w.WatchedPeginQuote) { + quoteHash := watchedQuote.RetainedQuote.QuoteHash + depositAddress := watchedQuote.RetainedQuote.DepositAddress + txs, err := watcher.btcWallet.GetTransactions(depositAddress) + if err != nil { + log.Errorf("Error executing call for user on quote %s: %v\n", quoteHash, err) + return + } + for _, tx := range txs { + if validatePeginQuote(watchedQuote, tx) { + watcher.callForUser(watchedQuote, tx) + return + } + } + if watchedQuote.RetainedQuote.State == quote.PeginStateWaitingForDeposit && watchedQuote.PeginQuote.IsExpired() { + if err = watcher.expiredUseCase.Run(context.Background(), watchedQuote.RetainedQuote); err != nil { + log.Errorf("Error updating expired quote (%s): %v\n", quoteHash, err) + } + } +} + +func (watcher *PeginDepositAddressWatcher) callForUser(watchedQuote w.WatchedPeginQuote, tx blockchain.BitcoinTransactionInformation) { + var err error + quoteHash := watchedQuote.RetainedQuote.QuoteHash + if err = watcher.callForUserUseCase.Run(context.Background(), tx.Hash, watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { + delete(watcher.quotes, quoteHash) + log.Errorf("Error executing call for user on quote %s: %v\n", quoteHash, err) + } else if err != nil { + log.Errorf("Error executing call for user on quote %s: %v\n", quoteHash, err) + } else { + delete(watcher.quotes, quoteHash) + } +} + +func validatePeginQuote(watchedQuote w.WatchedPeginQuote, tx blockchain.BitcoinTransactionInformation) bool { + return tx.Confirmations >= uint64(watchedQuote.PeginQuote.Confirmations) && + watchedQuote.RetainedQuote.State == quote.PeginStateWaitingForDeposit && + !watchedQuote.PeginQuote.IsExpired() && + tx.AmountToAddress(watchedQuote.RetainedQuote.DepositAddress).Cmp(watchedQuote.PeginQuote.Total()) >= 0 +} diff --git a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go new file mode 100644 index 00000000..20dc2d8b --- /dev/null +++ b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go @@ -0,0 +1,138 @@ +package watcher + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + w "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + log "github.com/sirupsen/logrus" + "math/big" + "time" +) + +type PegoutBtcTransferWatcher struct { + quotes map[string]w.WatchedPegoutQuote + getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase + refundPegoutUseCase *pegout.RefundPegoutUseCase + btcRpc blockchain.BitcoinNetwork + ticker *time.Ticker + eventBus entities.EventBus + watcherStopChannel chan bool + currentBlock *big.Int +} + +func NewPegoutBtcTransferWatcher( + getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase, + refundPegoutUseCase *pegout.RefundPegoutUseCase, + btcRpc blockchain.BitcoinNetwork, + eventBus entities.EventBus, +) *PegoutBtcTransferWatcher { + quotes := make(map[string]w.WatchedPegoutQuote) + watcherStopChannel := make(chan bool, 1) + currentBlock := big.NewInt(0) + return &PegoutBtcTransferWatcher{ + quotes: quotes, + getWatchedPegoutQuoteUseCase: getWatchedPegoutQuoteUseCase, + refundPegoutUseCase: refundPegoutUseCase, + btcRpc: btcRpc, + eventBus: eventBus, + watcherStopChannel: watcherStopChannel, + currentBlock: currentBlock, + } +} + +func (watcher *PegoutBtcTransferWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("PegoutBtcTransferWatcher shut down") +} + +func (watcher *PegoutBtcTransferWatcher) Prepare(ctx context.Context) error { + watchedQuotes, err := watcher.getWatchedPegoutQuoteUseCase.Run(ctx, quote.PegoutStateSendPegoutSucceeded) + if err != nil { + return err + } + for _, watchedQuote := range watchedQuotes { + watcher.quotes[watchedQuote.RetainedQuote.QuoteHash] = watchedQuote + } + return nil +} + +func (watcher *PegoutBtcTransferWatcher) Start() { + eventChannel := watcher.eventBus.Subscribe(quote.PegoutBtcSentEventId) + watcher.ticker = time.NewTicker(pegoutBtcTransferWatcherInterval) +watcherLoop: + for { + select { + case <-watcher.ticker.C: + if height, err := watcher.btcRpc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { + watcher.checkQuotes() + watcher.currentBlock = height + } else if err != nil { + log.Error("PegoutBtcTransferWatcher: error getting Bitcoin chain height: ", err) + } + case event := <-eventChannel: + if event != nil { + watcher.handleBtcSentToUserCompleted(event) + } + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} + +func (watcher *PegoutBtcTransferWatcher) checkQuotes() { + var err error + var tx blockchain.BitcoinTransactionInformation + for _, watchedQuote := range watcher.quotes { + if tx, err = watcher.btcRpc.GetTransactionInfo(watchedQuote.RetainedQuote.LpBtcTxHash); err != nil { + log.Errorf("Error getting Bitcoin transaction information %s: %v\n", watchedQuote.RetainedQuote.LpBtcTxHash, err) + return + } + if watcher.validateQuote(watchedQuote, tx) { + watcher.refundPegout(watchedQuote) + } + } +} + +func (watcher *PegoutBtcTransferWatcher) refundPegout(watchedQuote w.WatchedPegoutQuote) { + var err error + if err = watcher.refundPegoutUseCase.Run(context.Background(), watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + } else if err != nil { + log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + } else { + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + } +} + +func (watcher *PegoutBtcTransferWatcher) handleBtcSentToUserCompleted(event entities.Event) { + parsedEvent, ok := event.(quote.PegoutBtcSentToUserEvent) + quoteHash := parsedEvent.RetainedQuote.QuoteHash + if !ok { + log.Error("Trying to parse wrong event in Pegin Bridge watcher") + return + } + + if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { + log.Infof("Quote %s is already watched\n", quoteHash) + return + } + if parsedEvent.RetainedQuote.State != quote.PegoutStateSendPegoutSucceeded || parsedEvent.RetainedQuote.LpBtcTxHash == "" { + log.Infof("Quote %s doesn't have btc tx hash to watch\n", quoteHash) + return + } + watcher.quotes[quoteHash] = w.NewWatchedPegoutQuote(parsedEvent.PegoutQuote, parsedEvent.RetainedQuote) +} + +func (watcher *PegoutBtcTransferWatcher) validateQuote(watchedQuote w.WatchedPegoutQuote, tx blockchain.BitcoinTransactionInformation) bool { + return watchedQuote.RetainedQuote.State == quote.PegoutStateSendPegoutSucceeded && + tx.Confirmations >= uint64(watchedQuote.PegoutQuote.TransferConfirmations) +} diff --git a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go new file mode 100644 index 00000000..9aad0cee --- /dev/null +++ b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go @@ -0,0 +1,216 @@ +package watcher + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + w "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + log "github.com/sirupsen/logrus" + "time" +) + +type PegoutRskDepositWatcher struct { + quotes map[string]w.WatchedPegoutQuote + getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase + expiredUseCase *pegout.ExpiredPegoutQuoteUseCase + sendPegoutUseCase *pegout.SendPegoutUseCase + updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase + initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase + pegoutLp entities.PegoutLiquidityProvider + rskRpc blockchain.RootstockRpcServer + lbc blockchain.LiquidityBridgeContract + ticker *time.Ticker + eventBus entities.EventBus + watcherStopChannel chan bool + currentBlock uint64 + cacheStartBlock uint64 +} + +func NewPegoutRskDepositWatcher( + getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase, + expiredUseCase *pegout.ExpiredPegoutQuoteUseCase, + sendPegoutUseCase *pegout.SendPegoutUseCase, + updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase, + initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase, + pegoutLp entities.PegoutLiquidityProvider, + rskRpc blockchain.RootstockRpcServer, + lbc blockchain.LiquidityBridgeContract, + eventBus entities.EventBus, + cacheStartBlock uint64, +) *PegoutRskDepositWatcher { + quotes := make(map[string]w.WatchedPegoutQuote) + watcherStopChannel := make(chan bool, 1) + currentBlock := cacheStartBlock + return &PegoutRskDepositWatcher{ + quotes: quotes, + getWatchedPegoutQuoteUseCase: getWatchedPegoutQuoteUseCase, + expiredUseCase: expiredUseCase, + sendPegoutUseCase: sendPegoutUseCase, + updatePegoutDepositUseCase: updatePegoutDepositUseCase, + initDepositCacheUseCase: initDepositCacheUseCase, + pegoutLp: pegoutLp, + rskRpc: rskRpc, + lbc: lbc, + eventBus: eventBus, + watcherStopChannel: watcherStopChannel, + currentBlock: currentBlock, + cacheStartBlock: cacheStartBlock, + } +} + +func (watcher *PegoutRskDepositWatcher) Prepare(ctx context.Context) error { + var quoteCreationBlock uint64 + var err error + + if watcher.cacheStartBlock != 0 { + if err = watcher.initDepositCacheUseCase.Run(ctx, watcher.cacheStartBlock); err != nil { + return err + } + } + + watchedQuotes, err := watcher.getWatchedPegoutQuoteUseCase.Run(ctx, quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations) + if err != nil { + return err + } + for _, watchedQuote := range watchedQuotes { + quoteCreationBlock = quote.GetCreationBlock(watcher.pegoutLp, watchedQuote.PegoutQuote) + if watcher.currentBlock == 0 || watcher.currentBlock > quoteCreationBlock { + watcher.currentBlock = quoteCreationBlock + } + watcher.quotes[watchedQuote.RetainedQuote.QuoteHash] = watchedQuote + } + + log.Info("Starting to watch pegout deposits from block ", watcher.currentBlock) + return nil +} + +func (watcher *PegoutRskDepositWatcher) Start() { + var checkContext context.Context + var checkCancel context.CancelFunc + eventChannel := watcher.eventBus.Subscribe(quote.AcceptedPegoutQuoteEventId) + watcher.ticker = time.NewTicker(pegoutDepositWatcherInterval) + +watcherLoop: + for { + select { + case <-watcher.ticker.C: + checkContext, checkCancel = context.WithTimeout(context.Background(), 1*time.Minute) + if height, err := watcher.rskRpc.GetHeight(checkContext); err == nil && height > watcher.currentBlock { + watcher.checkDeposits(checkContext, watcher.currentBlock, height) + watcher.checkQuotes(checkContext, height) + watcher.currentBlock = height + } else if err != nil { + log.Error("PegoutRskDepositWatcher: error getting RSK chain height: ", err) + } + checkCancel() + case event := <-eventChannel: + if event != nil { + watcher.handleAcceptedPegoutQuote(event) + } + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} + +func (watcher *PegoutRskDepositWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("PegoutRskDepositWatcher shut down") +} + +func (watcher *PegoutRskDepositWatcher) handleAcceptedPegoutQuote(event entities.Event) { + parsedEvent, ok := event.(quote.AcceptedPegoutQuoteEvent) + quoteHash := parsedEvent.RetainedQuote.QuoteHash + if !ok { + log.Error("Trying to parse wrong event in Pegout Rsk deposit watcher") + return + } + + if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { + log.Infof("Quote %s is already watched\n", quoteHash) + return + } + watcher.quotes[quoteHash] = w.NewWatchedPegoutQuote(parsedEvent.Quote, parsedEvent.RetainedQuote) +} + +func (watcher *PegoutRskDepositWatcher) checkDeposits(ctx context.Context, fromBlock, toBlock uint64) { + var err error + var deposits []quote.PegoutDeposit + + deposits, err = watcher.lbc.GetDepositEvents(ctx, fromBlock, &toBlock) + if err != nil { + log.Errorf("Error executing getting deposits in range [%d, %d] in PegoutRskDepositWatcher\n", fromBlock, toBlock) + return + } + for _, deposit := range deposits { + watcher.checkDeposit(ctx, deposit) + } +} + +func (watcher *PegoutRskDepositWatcher) checkDeposit(ctx context.Context, deposit quote.PegoutDeposit) { + var newWatchedQuote w.WatchedPegoutQuote + var err error + watchedQuote, ok := watcher.quotes[deposit.QuoteHash] + if ok && deposit.IsValidForQuote(watchedQuote.PegoutQuote) && watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDeposit { + if newWatchedQuote, err = watcher.updatePegoutDepositUseCase.Run(ctx, watchedQuote, deposit); err == nil { + watcher.quotes[deposit.QuoteHash] = newWatchedQuote + } else { + log.Errorf("Error updating pegout deposit quote (%s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + } + } +} + +func (watcher *PegoutRskDepositWatcher) checkQuotes(ctx context.Context, height uint64) { + for _, watchedQuote := range watcher.quotes { + watcher.checkQuote(ctx, height, watchedQuote) + } +} + +func (watcher *PegoutRskDepositWatcher) checkQuote(ctx context.Context, height uint64, watchedQuote w.WatchedPegoutQuote) { + var err error + var receipt blockchain.TransactionReceipt + if watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDeposit && watchedQuote.PegoutQuote.IsExpired() { + if err = watcher.expiredUseCase.Run(ctx, watchedQuote.RetainedQuote); err != nil { + log.Errorf("Error updating expired quote (%s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + return + } else { + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + } + } + + if watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDepositConfirmations { + if receipt, err = watcher.rskRpc.GetTransactionReceipt(ctx, watchedQuote.RetainedQuote.UserRskTxHash); err != nil { + log.Errorf("Error getting pegout deposit receipt of quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + return + } + if validateDepositedPegoutQuote(watchedQuote, receipt, height) { + watcher.sendPegout(ctx, watchedQuote) + } + } +} + +func (watcher *PegoutRskDepositWatcher) sendPegout(ctx context.Context, watchedQuote w.WatchedPegoutQuote) { + var err error + if err = watcher.sendPegoutUseCase.Run(ctx, watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { + log.Errorf("Error sending pegout to the user (quote %s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + } else if err != nil { + log.Errorf("Error sending pegout to the user (quote %s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + } else { + delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) + } +} + +func validateDepositedPegoutQuote(watchedQuote w.WatchedPegoutQuote, receipt blockchain.TransactionReceipt, height uint64) bool { + return receipt.BlockNumber+uint64(watchedQuote.PegoutQuote.DepositConfirmations) < height && + watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDepositConfirmations && + !watchedQuote.PegoutQuote.IsExpired() && + receipt.Value.Cmp(watchedQuote.PegoutQuote.Total()) >= 0 +} diff --git a/internal/adapters/entrypoints/watcher/penalization_alert.go b/internal/adapters/entrypoints/watcher/penalization_alert.go new file mode 100644 index 00000000..efd25b7a --- /dev/null +++ b/internal/adapters/entrypoints/watcher/penalization_alert.go @@ -0,0 +1,65 @@ +package watcher + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + log "github.com/sirupsen/logrus" + "time" +) + +type PenalizationAlertWatcher struct { + rskRpc blockchain.RootstockRpcServer + penalizationAlertUseCase *liquidity_provider.PenalizationAlertUseCase + currentBlock uint64 + ticker *time.Ticker + watcherStopChannel chan bool +} + +func NewPenalizationAlertWatcher(rskRpc blockchain.RootstockRpcServer, penalizationAlertUseCase *liquidity_provider.PenalizationAlertUseCase) *PenalizationAlertWatcher { + watcherStopChannel := make(chan bool, 1) + return &PenalizationAlertWatcher{rskRpc: rskRpc, penalizationAlertUseCase: penalizationAlertUseCase, watcherStopChannel: watcherStopChannel} +} + +func (watcher *PenalizationAlertWatcher) Prepare(ctx context.Context) error { + var err error + var height uint64 + if height, err = watcher.rskRpc.GetHeight(ctx); err != nil { + return err + } + watcher.currentBlock = height + return nil +} + +func (watcher *PenalizationAlertWatcher) Start() { + var cancel context.CancelFunc + var ctx context.Context + var err error + var height uint64 + watcher.ticker = time.NewTicker(penalizationCheckInterval) +watcherLoop: + for { + select { + case <-watcher.ticker.C: + ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) + if height, err = watcher.rskRpc.GetHeight(ctx); err != nil { + log.Error("Error checking penalization events inside watcher: ", err) + } else { + if err = watcher.penalizationAlertUseCase.Run(ctx, watcher.currentBlock, height); err == nil { + watcher.currentBlock = height - 1 + } + } + cancel() + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} + +func (watcher *PenalizationAlertWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("PenalizationAlertWatcher shut down") +} diff --git a/internal/adapters/entrypoints/watcher/quote_cleaner.go b/internal/adapters/entrypoints/watcher/quote_cleaner.go new file mode 100644 index 00000000..f4d58b55 --- /dev/null +++ b/internal/adapters/entrypoints/watcher/quote_cleaner.go @@ -0,0 +1,60 @@ +package watcher + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + log "github.com/sirupsen/logrus" + "time" +) + +type QuoteCleanerWatcher struct { + cleanUseCase *watcher.CleanExpiredQuotesUseCase + ticker *time.Ticker + watcherStopChannel chan bool +} + +func NewQuoteCleanerWatcher( + cleanUseCase *watcher.CleanExpiredQuotesUseCase, +) *QuoteCleanerWatcher { + watcherStopChannel := make(chan bool, 1) + return &QuoteCleanerWatcher{ + cleanUseCase: cleanUseCase, + watcherStopChannel: watcherStopChannel, + } +} + +func (watcher *QuoteCleanerWatcher) Prepare(ctx context.Context) error { + return nil +} + +func (watcher *QuoteCleanerWatcher) Start() { + watcher.ticker = time.NewTicker(quoteCleanInterval) +watcherLoop: + for { + select { + case <-watcher.ticker.C: + watcher.clean() + case <-watcher.watcherStopChannel: + watcher.ticker.Stop() + close(watcher.watcherStopChannel) + break watcherLoop + } + } +} + +func (watcher *QuoteCleanerWatcher) Shutdown(closeChannel chan<- bool) { + watcher.watcherStopChannel <- true + closeChannel <- true + log.Debug("QuoteCleanerWatcher shut down") +} + +func (watcher *QuoteCleanerWatcher) clean() { + txIds, err := watcher.cleanUseCase.Run(context.Background()) + if err != nil { + log.Error("Error cleaning quotes: ", err) + } + log.Infof("Cleaned %d quotes:\n", len(txIds)) + for _, id := range txIds { + log.Infof("Quote %s cleaned\n", id) + } +} diff --git a/internal/configuration/bootstrap/bitcoin.go b/internal/configuration/bootstrap/bitcoin.go new file mode 100644 index 00000000..ba925d1c --- /dev/null +++ b/internal/configuration/bootstrap/bitcoin.go @@ -0,0 +1,73 @@ +package bootstrap + +import ( + "fmt" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/rpcclient" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" +) + +const ( + unknownBtcdVersion = -1 +) + +func Bitcoin(env environment.BtcEnv) (*bitcoin.Connection, error) { + var params chaincfg.Params + log.Info("Connecting to BTC node") + + switch env.Network { + case "mainnet": + params = chaincfg.MainNetParams + case "testnet": + params = chaincfg.TestNet3Params + case "regtest": + params = chaincfg.RegressionNetParams + default: + return nil, fmt.Errorf("invalid network name: %v", env.Network) + } + + config := rpcclient.ConnConfig{ + Host: env.Endpoint, + User: env.Username, + Pass: env.Password, + Params: params.Name, + DisableTLS: true, + HTTPPostMode: true, + } + + client, err := rpcclient.New(&config, nil) + if err != nil { + return nil, fmt.Errorf("RPC client error: %v", err) + } + + version, err := checkBtcdVersion(client) + if err != nil { + return nil, err + } + + if version == unknownBtcdVersion { + log.Warn("unable to detect btcd version, but it is up and running") + } else { + log.Debugf("detected btcd version: %v\n", version) + } + conn := bitcoin.NewConnection(¶ms, client) + return conn, nil +} + +func checkBtcdVersion(c *rpcclient.Client) (int32, error) { + info, err := c.GetNetworkInfo() + switch networkErr := err.(type) { + case nil: + return info.Version, nil + case *btcjson.RPCError: + if networkErr.Code != btcjson.ErrRPCMethodNotFound.Code { + return 0, fmt.Errorf("unable to detect btcd version: %v", networkErr) + } + return unknownBtcdVersion, nil + default: + return 0, fmt.Errorf("unable to detect btcd version: %v", networkErr) + } +} diff --git a/internal/configuration/bootstrap/database.go b/internal/configuration/bootstrap/database.go new file mode 100644 index 00000000..0ff8dc36 --- /dev/null +++ b/internal/configuration/bootstrap/database.go @@ -0,0 +1,18 @@ +package bootstrap + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" +) + +func Mongo(ctx context.Context, env environment.MongoEnv) (*mongo.Connection, error) { + client, err := mongo.Connect(ctx, env.Username, env.Password, env.Host) + if err == nil { + return mongo.NewConnection(client), nil + } else { + log.Error("Error connecting to MongoDB: ", err) + return nil, err + } +} diff --git a/internal/configuration/bootstrap/rootstock.go b/internal/configuration/bootstrap/rootstock.go new file mode 100644 index 00000000..7125449b --- /dev/null +++ b/internal/configuration/bootstrap/rootstock.go @@ -0,0 +1,63 @@ +package bootstrap + +import ( + "context" + "errors" + "fmt" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + environment2 "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" + "net/http" + "net/url" +) + +func Rootstock(ctx context.Context, env environment2.RskEnv) (*rootstock.RskClient, error) { + var err error + var parsedUrl *url.URL + var client *ethclient.Client + var rpcClient *rpc.Client + + log.Info("Connecting to RSK node on ", env.Endpoint) + if parsedUrl, err = url.Parse(env.Endpoint); err != nil { + return nil, err + } + + switch parsedUrl.Scheme { + case "http", "https": + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.DisableKeepAlives = true + + httpClient := new(http.Client) + httpClient.Transport = transport + + if rpcClient, err = rpc.DialOptions(ctx, env.Endpoint, rpc.WithHTTPClient(httpClient)); err != nil { + return nil, err + } + + client = ethclient.NewClient(rpcClient) + default: + return nil, errors.New("unknown scheme for rsk connection string") + } + + log.Debug("Verifying connection to RSK node") + id, err := client.ChainID(ctx) + if err != nil { + return nil, err + } + log.Debug("Connection verified") + if env.ChainId != id.Uint64() { + return nil, fmt.Errorf("chain id mismatch; expected chain id: %v, rsk node chain id: %v", env.ChainId, id) + } + return rootstock.NewRskClient(client), nil +} + +func RootstockAccount(env environment2.RskEnv, secrets environment2.ApplicationSecrets) (*rootstock.RskAccount, error) { + return rootstock.GetAccount( + "keystore", + env.AccountNumber, + secrets.EncryptedJson, + secrets.EncryptedJsonPassword, + ) +} diff --git a/internal/configuration/environment/configuration.go b/internal/configuration/environment/configuration.go new file mode 100644 index 00000000..467652d5 --- /dev/null +++ b/internal/configuration/environment/configuration.go @@ -0,0 +1,34 @@ +package environment + +import "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + +func ConfigurationFromEnv(env Environment) *dataproviders.Configuration { + return &dataproviders.Configuration{ + RskConfig: dataproviders.RskConfig{ + ChainId: env.Rsk.ChainId, + Account: uint64(env.Rsk.AccountNumber), + Confirmations: env.Rsk.Confirmations, + }, + BtcConfig: dataproviders.BitcoinConfig{ + BtcAddress: env.Provider.BtcAddress, + Confirmations: env.Btc.Confirmations, + }, + PeginConfig: dataproviders.PeginConfig{ + TimeForDeposit: env.Pegin.TimeForDeposit, + CallTime: env.Pegin.CallTime, + PenaltyFee: env.Pegin.PenaltyFee, + CallFee: env.Pegin.CallFee, + MinTransactionValue: env.Pegin.MinTransactionValue, + MaxTransactionValue: env.Pegin.MaxTransactionValue, + }, + PegoutConfig: dataproviders.PegoutConfig{ + TimeForDeposit: env.Pegout.TimeForDeposit, + CallTime: env.Pegout.CallTime, + PenaltyFee: env.Pegout.PenaltyFee, + CallFee: env.Pegout.CallFee, + MinTransactionValue: env.Pegout.MinTransactionValue, + MaxTransactionValue: env.Pegout.MaxTransactionValue, + ExpireBlocks: env.Pegout.ExpireBlocks, + }, + } +} diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go new file mode 100644 index 00000000..ba9d9f57 --- /dev/null +++ b/internal/configuration/environment/environment.go @@ -0,0 +1,101 @@ +package environment + +import ( + "github.com/go-playground/validator/v10" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + log "github.com/sirupsen/logrus" +) + +type Environment struct { + Port uint `env:"SERVER_PORT" validate:"required"` + LogLevel string `env:"LOG_LEVEL" validate:"required"` + LogFile string `env:"LOG_FILE"` + EnableManagementApi bool `env:"ENABLE_MANAGEMENT_API" validate:"required"` + Mongo MongoEnv + Rsk RskEnv + Btc BtcEnv + Provider ProviderEnv + Pegin PeginEnv + Pegout PegoutEnv + Captcha CaptchaEnv +} + +type MongoEnv struct { + Username string `env:"MONGODB_USER" validate:"required"` + Password string `env:"MONGODB_PASSWORD" validate:"required"` + Host string `env:"MONGODB_HOST" validate:"required"` +} + +type RskEnv struct { + Endpoint string `env:"RSK_ENDPOINT" validate:"required"` + ChainId uint64 `env:"CHAIN_ID" validate:"required"` + LbcAddress string `env:"LBC_ADDR" validate:"required"` + BridgeAddress string `env:"RSK_BRIDGE_ADDR" validate:"required"` + BridgeRequiredConfirmations uint64 `env:"RSK_REQUIRED_BRIDGE_CONFIRMATIONS" validate:"required"` + IrisActivationHeight int64 `env:"IRIS_ACTIVATION_HEIGHT" validate:"required"` + ErpKeys []string `env:"ERP_KEYS" validate:"required"` + AccountNumber int `env:"ACCOUNT_NUM"` // no validation because 0 works fine + FeeCollectorAddress string `env:"DAO_FEE_COLLECTOR_ADDRESS" validate:"required"` + EncryptedJsonSecret string `env:"KEY_SECRET" validate:"required"` + EncryptedJsonPasswordSecret string `env:"PASSWORD_SECRET" validate:"required"` + Confirmations map[int]uint16 `env:"RSK_CONFIRMATIONS" validate:"required"` +} + +type BtcEnv struct { + Network string `env:"BTC_NETWORK" validate:"required"` + Username string `env:"BTC_USERNAME" validate:"required"` + Password string `env:"BTC_PASSWORD" validate:"required"` + Endpoint string `env:"BTC_ENDPOINT" validate:"required"` + FixedTxFeeRate float64 `env:"BTC_TX_FEE_RATE" validate:"required"` + WalletEncrypted bool `env:"BTC_ENCRYPTED_WALLET" validate:"required"` + WalletPasswordSecret string `env:"BTC_WALLET_PASSWORD"` + Confirmations map[int]uint16 `env:"BTC_CONFIRMATIONS" validate:"required"` +} + +type ProviderEnv struct { + AlertSenderEmail string `env:"ALERT_SENDER_EMAIL" validate:"required"` + AlertRecipientEmail string `env:"ALERT_RECIPIENT_EMAIL" validate:"required"` + BtcAddress string `env:"BTC_ADDR" validate:"required"` + Name string `env:"PROVIDER_NAME" validate:"required"` + ApiBaseUrl string `env:"BASE_URL" validate:"required"` + ProviderType entities.ProviderType `env:"PROVIDER_TYPE" validate:"required,oneof=pegin pegout both"` +} + +type PeginEnv struct { + TimeForDeposit uint32 `env:"PEGIN_TIME_FOR_DEPOSIT" validate:"required"` + CallTime uint32 `env:"PEGIN_CALL_TIME" validate:"required"` + PenaltyFee *entities.Wei `env:"PEGIN_PENALTY_FEE" validate:"required"` + CallFee *entities.Wei `env:"PEGIN_FEE" validate:"required"` + MinTransactionValue *entities.Wei `env:"PEGIN_MIN_TRANSACTION_VALUE" validate:"required"` + MaxTransactionValue *entities.Wei `env:"PEGIN_MAX_TRANSACTION_VALUE" validate:"required"` +} + +type PegoutEnv struct { + TimeForDeposit uint32 `env:"PEGOUT_TIME_FOR_DEPOSIT" validate:"required"` + CallTime uint32 `env:"PEGOUT_CALL_TIME" validate:"required"` + PenaltyFee *entities.Wei `env:"PEGOUT_PENALTY_FEE" validate:"required"` + CallFee *entities.Wei `env:"PEGOUT_FEE" validate:"required"` + MinTransactionValue *entities.Wei `env:"PEGOUT_MIN_TRANSACTION_VALUE" validate:"required"` + MaxTransactionValue *entities.Wei `env:"PEGOUT_MAX_TRANSACTION_VALUE" validate:"required"` + ExpireBlocks uint32 `env:"PEGOUT_EXPIRE_BLOCKS" validate:"required"` + DepositCacheStartBlock uint64 `env:"PEGOUT_DEPOSIT_CACHE_START_BLOCK"` +} + +type CaptchaEnv struct { + SecretKey string `env:"CAPTCHA_SECRET_KEY"` + SiteKey string `env:"CAPTCHA_SITE_KEY"` + Threshold float32 `env:"CAPTCHA_THRESHOLD"` + Disabled bool `env:"DISABLE_CAPTCHA"` +} + +func LoadEnv() *Environment { + validate := validator.New(validator.WithRequiredStructEnabled()) + env := &Environment{} + if err := Load(env); err != nil { + log.Fatal("Error reading environment: ", err) + } else if err = validate.Struct(env); err != nil { + log.Fatal("Environment incomplete: ", err) + } + + return env +} diff --git a/internal/configuration/environment/environment_reader.go b/internal/configuration/environment/environment_reader.go new file mode 100644 index 00000000..3354ff74 --- /dev/null +++ b/internal/configuration/environment/environment_reader.go @@ -0,0 +1,124 @@ +package environment + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "reflect" + "strconv" + "strings" +) + +func Load(arg *Environment) error { + return parseEnv(reflect.ValueOf(arg)) +} + +func parseEnv(arg reflect.Value) error { + if arg.Kind() == reflect.Ptr && arg.IsNil() { + arg.Set(reflect.New(arg.Elem().Type())) + } + + if arg.Kind() == reflect.Ptr { + arg = arg.Elem() + } + + argType := arg.Type() + var envVarName string + var fieldType reflect.Kind + + for i := 0; i < arg.NumField(); i++ { + envVarName = argType.Field(i).Tag.Get("env") + fieldType = argType.Field(i).Type.Kind() + if envVarName == "" && fieldType != reflect.Struct { + return fmt.Errorf("field %s doesn't have envVarName tag", argType.Field(i).Name) + } + + if argType.Field(i).Type.Kind() == reflect.Struct { + if err := parseEnv(arg.Field(i)); err != nil { + return err + } + } else if envVarName != "" { + if err := setEnvValue(arg.Field(i), os.Getenv(envVarName)); err != nil { + return fmt.Errorf("error reading %s environment variable: %w", envVarName, err) + } + } + } + return nil +} + +func setEnvValue(field reflect.Value, envVar string) error { + switch field.Kind() { + case reflect.String: + field.SetString(envVar) + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + if envVar == "" { + field.SetUint(0) + } else if uint64Value, err := strconv.ParseUint(envVar, 10, 64); err != nil { + return err + } else { + field.SetUint(uint64Value) + } + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + if envVar == "" { + field.SetInt(0) + } else if int64Value, err := strconv.ParseInt(envVar, 10, 64); err != nil { + return err + } else { + field.SetInt(int64Value) + } + case reflect.Float32, reflect.Float64: + if envVar == "" { + field.SetFloat(0) + } else if float64Value, err := strconv.ParseFloat(envVar, 64); err != nil { + return err + } else { + field.SetFloat(float64Value) + } + case reflect.Bool: + if boolValue, err := strconv.ParseBool(envVar); err != nil { + return err + } else { + field.SetBool(boolValue) + } + case reflect.Slice: + if field.Type().Elem().Kind() != reflect.String { + return errors.New("unsupported env array") + } + for _, value := range strings.Split(envVar, ",") { + element := reflect.New(field.Type().Elem()).Elem() + element.SetString(value) + field.Set(reflect.Append(field, element)) + } + case reflect.Map: + mapValue := reflect.New(field.Type()) + mapContent := mapValue.Interface() + if err := json.Unmarshal([]byte(envVar), &mapContent); err != nil { + return err + } else { + field.Set(mapValue.Elem()) + } + default: + return jsonUnmarshalEnvValue(field, envVar) + } + return nil +} + +func jsonUnmarshalEnvValue(field reflect.Value, envVar string) error { + var fieldType reflect.Type + if field.Kind() == reflect.Ptr { + fieldType = field.Type().Elem() + } else { + fieldType = field.Type() + } + + if field.Kind() == reflect.Ptr && field.IsNil() { + field.Set(reflect.New(fieldType)) + } + + unmarshaler, ok := field.Interface().(json.Unmarshaler) + if !ok { + return fmt.Errorf("cant unmarshal field %s", field.Type().Name()) + } + return unmarshaler.UnmarshalJSON([]byte(envVar)) +} diff --git a/internal/configuration/environment/mutex.go b/internal/configuration/environment/mutex.go new file mode 100644 index 00000000..e5709ab1 --- /dev/null +++ b/internal/configuration/environment/mutex.go @@ -0,0 +1,42 @@ +package environment + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "sync" +) + +type applicationMutexesImpl struct { + rskWalletMutex *sync.Mutex + btcWalletMutex *sync.Mutex + peginLiquidityMutex *sync.Mutex + pegoutLiquidityMutex *sync.Mutex +} + +func NewApplicationMutexes() entities.ApplicationMutexes { + rskWalletMutex := sync.Mutex{} + btcWalletMutex := sync.Mutex{} + peginLiquidityMutex := sync.Mutex{} + pegoutLiquidityMutex := sync.Mutex{} + return &applicationMutexesImpl{ + rskWalletMutex: &rskWalletMutex, + btcWalletMutex: &btcWalletMutex, + peginLiquidityMutex: &peginLiquidityMutex, + pegoutLiquidityMutex: &pegoutLiquidityMutex, + } +} + +func (a *applicationMutexesImpl) RskWalletMutex() *sync.Mutex { + return a.rskWalletMutex +} + +func (a *applicationMutexesImpl) PeginLiquidityMutex() *sync.Mutex { + return a.peginLiquidityMutex +} + +func (a *applicationMutexesImpl) PegoutLiquidityMutex() *sync.Mutex { + return a.pegoutLiquidityMutex +} + +func (a *applicationMutexesImpl) BtcWalletMutex() *sync.Mutex { + return a.btcWalletMutex +} diff --git a/internal/configuration/environment/secrets.go b/internal/configuration/environment/secrets.go new file mode 100644 index 00000000..7eac87ce --- /dev/null +++ b/internal/configuration/environment/secrets.go @@ -0,0 +1,46 @@ +package environment + +import ( + "context" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/secretsmanager" + log "github.com/sirupsen/logrus" +) + +type ApplicationSecrets struct { + BtcWalletPassword string + EncryptedJson string + EncryptedJsonPassword string +} + +func LoadSecrets(ctx context.Context, environment Environment) *ApplicationSecrets { + return loadFromSecretsManager(ctx, environment) +} + +func loadFromSecretsManager(ctx context.Context, env Environment) *ApplicationSecrets { + awsConfiguration, err := awsConfig.LoadDefaultConfig(ctx) + if err != nil { + log.Fatal("error loading secrets: ", err) + } + sm := secretsmanager.NewFromConfig(awsConfiguration) + encryptedJson, err := sm.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: &env.Rsk.EncryptedJsonSecret}) + if err != nil { + log.Fatal("error loading encrypted json: ", err) + } + + jsonPassword, err := sm.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: &env.Rsk.EncryptedJsonPasswordSecret}) + if err != nil { + log.Fatal("error loading encrypted json password: ", err) + } + + btcWalletPassword, err := sm.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: &env.Btc.WalletPasswordSecret}) + if err != nil { + log.Fatal("error loading btc wallet password: ", err) + } + + return &ApplicationSecrets{ + BtcWalletPassword: *btcWalletPassword.SecretString, + EncryptedJson: *encryptedJson.SecretString, + EncryptedJsonPassword: *jsonPassword.SecretString, + } +} diff --git a/internal/configuration/registry/alert_sender.go b/internal/configuration/registry/alert_sender.go new file mode 100644 index 00000000..95bcf1d3 --- /dev/null +++ b/internal/configuration/registry/alert_sender.go @@ -0,0 +1,20 @@ +package registry + +import ( + "context" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/ses" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + log "github.com/sirupsen/logrus" +) + +func NewAlertSender(env environment.Environment) entities.AlertSender { + awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) + if err != nil { + log.Fatal("error loading alert sender: ", err) + } + sesClient := ses.NewFromConfig(awsConfiguration) + return alerting.NewSesAlertSender(sesClient, env.Provider.AlertSenderEmail) +} diff --git a/internal/configuration/registry/bitcoin.go b/internal/configuration/registry/bitcoin.go new file mode 100644 index 00000000..157fe648 --- /dev/null +++ b/internal/configuration/registry/bitcoin.go @@ -0,0 +1,25 @@ +package registry + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + environment2 "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" +) + +type Bitcoin struct { + RpcServer blockchain.BitcoinNetwork + Wallet blockchain.BitcoinWallet + Connection *bitcoin.Connection +} + +func NewBitcoinRegistry(env environment2.BtcEnv, secrets environment2.ApplicationSecrets, connection *bitcoin.Connection) (*Bitcoin, error) { + wallet := bitcoin.NewBitcoindWallet(connection, env.FixedTxFeeRate, env.WalletEncrypted, secrets.BtcWalletPassword) + if err := wallet.Unlock(); err != nil { + return nil, err + } + return &Bitcoin{ + RpcServer: bitcoin.NewBitcoindRpc(connection), + Wallet: wallet, + Connection: connection, + }, nil +} diff --git a/internal/configuration/registry/database.go b/internal/configuration/registry/database.go new file mode 100644 index 00000000..db5eb009 --- /dev/null +++ b/internal/configuration/registry/database.go @@ -0,0 +1,20 @@ +package registry + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" +) + +type Database struct { + PeginRepository quote.PeginQuoteRepository + PegoutRepository quote.PegoutQuoteRepository + Connection *mongo.Connection +} + +func NewDatabaseRegistry(connection *mongo.Connection) *Database { + return &Database{ + PeginRepository: mongo.NewPeginMongoRepository(connection), + PegoutRepository: mongo.NewPegoutMongoRepository(connection), + Connection: connection, + } +} diff --git a/internal/configuration/registry/event_bus.go b/internal/configuration/registry/event_bus.go new file mode 100644 index 00000000..95b5b18a --- /dev/null +++ b/internal/configuration/registry/event_bus.go @@ -0,0 +1,10 @@ +package registry + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/entities" +) + +func NewEventBus() entities.EventBus { + return dataproviders.NewLocalEventBus() +} diff --git a/internal/configuration/registry/liquidity_provider.go b/internal/configuration/registry/liquidity_provider.go new file mode 100644 index 00000000..b0bedf85 --- /dev/null +++ b/internal/configuration/registry/liquidity_provider.go @@ -0,0 +1,20 @@ +package registry + +import "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + +func NewLiquidityProvider( + config *dataproviders.Configuration, + databaseRegistry *Database, + rskRegistry *Rootstock, + btcRegistry *Bitcoin, +) *dataproviders.LocalLiquidityProvider { + return dataproviders.NewLocalLiquidityProvider( + config, + databaseRegistry.PeginRepository, + databaseRegistry.PegoutRepository, + rskRegistry.RpcServer, + rskRegistry.Wallet, + btcRegistry.Wallet, + rskRegistry.Lbc, + ) +} diff --git a/internal/configuration/registry/rootstock.go b/internal/configuration/registry/rootstock.go new file mode 100644 index 00000000..d0cd5194 --- /dev/null +++ b/internal/configuration/registry/rootstock.go @@ -0,0 +1,58 @@ +package registry + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" +) + +type Rootstock struct { + RpcServer blockchain.RootstockRpcServer + FeeCollector blockchain.FeeCollector + Bridge blockchain.RootstockBridge + Lbc blockchain.LiquidityBridgeContract + Wallet *rootstock.RskWalletImpl + Client *rootstock.RskClient +} + +func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, account *rootstock.RskAccount, bitcoinConn *bitcoin.Connection) (*Rootstock, error) { + var bridgeAddress, lbcAddress common.Address + var err error + + if err = rootstock.ParseAddress(&lbcAddress, env.LbcAddress); err != nil { + return nil, err + } else if err = rootstock.ParseAddress(&bridgeAddress, env.BridgeAddress); err != nil { + return nil, err + } + + bridge, err := bindings.NewRskBridge(bridgeAddress, client.Rpc()) + if err != nil { + return nil, err + } + + lbc, err := bindings.NewLiquidityBridgeContract(lbcAddress, client.Rpc()) + if err != nil { + return nil, err + } + wallet := rootstock.NewRskWalletImpl(client, account, env.ChainId) + + return &Rootstock{ + RpcServer: rootstock.NewRskjRpcServer(client), + FeeCollector: rootstock.NewFeeCollectorImpl(lbc), + Wallet: wallet, + Bridge: rootstock.NewRskBridgeImpl( + env.BridgeAddress, + env.BridgeRequiredConfirmations, + env.IrisActivationHeight, + env.ErpKeys, + bridge, + client, + bitcoinConn.NetworkParams, + ), + Lbc: rootstock.NewLiquidityBridgeContractImpl(client, env.LbcAddress, lbc, wallet), + Client: client, + }, nil +} diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go new file mode 100644 index 00000000..d5af40eb --- /dev/null +++ b/internal/configuration/registry/usecase.go @@ -0,0 +1,241 @@ +package registry + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" +) + +type UseCaseRegistry struct { + getPeginQuoteUseCase *pegin.GetQuoteUseCase + registerProviderUseCase *liquidity_provider.RegistrationUseCase + callForUserUseCase *pegin.CallForUserUseCase + registerPeginUseCase *pegin.RegisterPeginUseCase + acceptPeginQuoteUseCase *pegin.AcceptQuoteUseCase + getWatchedPeginQuoteUseCase *watcher.GetWatchedPeginQuoteUseCase + expiredPeginQuoteUseCase *pegin.ExpiredPeginQuoteUseCase + cleanExpiredQuotesUseCase *watcher.CleanExpiredQuotesUseCase + getProviderDetailUseCase *liquidity_provider.GetDetailUseCase + getWatchedPegoutQuoteUseCase *watcher.GetWatchedPegoutQuoteUseCase + expiredPegoutUseCase *pegout.ExpiredPegoutQuoteUseCase + sendPegoutUseCase *pegout.SendPegoutUseCase + updatePegoutDepositUseCase *watcher.UpdatePegoutQuoteDepositUseCase + initPegoutDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase + refundPegoutUseCase *pegout.RefundPegoutUseCase + getPegoutQuoteUseCase *pegout.GetQuoteUseCase + acceptPegoutQuoteUseCase *pegout.AcceptQuoteUseCase + getUserDepositsUseCase *pegout.GetUserDepositsUseCase + liquidityCheckUseCase *liquidity_provider.CheckLiquidityUseCase + penalizationAlertUseCase *liquidity_provider.PenalizationAlertUseCase + getProvidersUseCase *liquidity_provider.GetProvidersUseCase + getPeginCollateralUseCase *pegin.GetCollateralUseCase + getPegoutCollateralUseCase *pegout.GetCollateralUseCase + withdrawPeginCollateralUseCase *pegin.WithdrawCollateralUseCase + withdrawPegoutCollateralUseCase *pegout.WithdrawCollateralUseCase + healthUseCase *usecases.HealthUseCase + resignUseCase *liquidity_provider.ResignUseCase + changeStatusUseCase *liquidity_provider.ChangeStatusUseCase + addPeginCollateralUseCase *pegin.AddCollateralUseCase + addPegoutCollateralUseCase *pegout.AddCollateralUseCase +} + +func NewUseCaseRegistry( + env environment.Environment, + rskRegistry *Rootstock, + btcRegistry *Bitcoin, + databaseRegistry *Database, + liquidityProvider *dataproviders.LocalLiquidityProvider, + eventBus entities.EventBus, + alertSender entities.AlertSender, + mutexes entities.ApplicationMutexes, +) *UseCaseRegistry { + return &UseCaseRegistry{ + getPeginQuoteUseCase: pegin.NewGetQuoteUseCase( + rskRegistry.RpcServer, + rskRegistry.FeeCollector, + rskRegistry.Bridge, + rskRegistry.Lbc, + databaseRegistry.PeginRepository, + liquidityProvider, + liquidityProvider, + env.Rsk.FeeCollectorAddress, + ), + registerProviderUseCase: liquidity_provider.NewRegistrationUseCase( + rskRegistry.Lbc, + liquidityProvider, + ), + callForUserUseCase: pegin.NewCallForUserUseCase( + rskRegistry.Lbc, + databaseRegistry.PeginRepository, + btcRegistry.RpcServer, + liquidityProvider, + eventBus, + mutexes.RskWalletMutex(), + ), + registerPeginUseCase: pegin.NewRegisterPeginUseCase( + rskRegistry.Lbc, + databaseRegistry.PeginRepository, + eventBus, + rskRegistry.Bridge, + btcRegistry.RpcServer, + ), + acceptPeginQuoteUseCase: pegin.NewAcceptQuoteUseCase( + databaseRegistry.PeginRepository, + rskRegistry.Bridge, + btcRegistry.RpcServer, + rskRegistry.RpcServer, + liquidityProvider, + liquidityProvider, + eventBus, + mutexes.PeginLiquidityMutex(), + ), + getWatchedPeginQuoteUseCase: watcher.NewGetWatchedPeginQuoteUseCase(databaseRegistry.PeginRepository), + expiredPeginQuoteUseCase: pegin.NewExpiredPeginQuoteUseCase(databaseRegistry.PeginRepository), + cleanExpiredQuotesUseCase: watcher.NewCleanExpiredQuotesUseCase( + databaseRegistry.PeginRepository, + databaseRegistry.PegoutRepository, + ), + getProviderDetailUseCase: liquidity_provider.NewGetDetailUseCase( + env.Captcha.SiteKey, + liquidityProvider, + liquidityProvider, + ), + getWatchedPegoutQuoteUseCase: watcher.NewGetWatchedPegoutQuoteUseCase( + databaseRegistry.PegoutRepository, + ), + expiredPegoutUseCase: pegout.NewExpiredPegoutQuoteUseCase(databaseRegistry.PegoutRepository), + updatePegoutDepositUseCase: watcher.NewUpdatePegoutQuoteDepositUseCase(databaseRegistry.PegoutRepository), + initPegoutDepositCacheUseCase: pegout.NewInitPegoutDepositCacheUseCase( + databaseRegistry.PegoutRepository, + rskRegistry.Lbc, + rskRegistry.RpcServer, + ), + refundPegoutUseCase: pegout.NewRefundPegoutUseCase( + databaseRegistry.PegoutRepository, + rskRegistry.Lbc, + eventBus, + btcRegistry.RpcServer, + rskRegistry.Wallet, + rskRegistry.Bridge, + mutexes.RskWalletMutex(), + ), + getPegoutQuoteUseCase: pegout.NewGetQuoteUseCase( + rskRegistry.RpcServer, + rskRegistry.FeeCollector, + rskRegistry.Bridge, + rskRegistry.Lbc, + databaseRegistry.PegoutRepository, + liquidityProvider, + liquidityProvider, + btcRegistry.Wallet, + env.Rsk.FeeCollectorAddress, + ), + acceptPegoutQuoteUseCase: pegout.NewAcceptQuoteUseCase( + databaseRegistry.PegoutRepository, + rskRegistry.Lbc, + liquidityProvider, + liquidityProvider, + eventBus, + mutexes.PegoutLiquidityMutex(), + ), + sendPegoutUseCase: pegout.NewSendPegoutUseCase( + btcRegistry.Wallet, + btcRegistry.RpcServer, + databaseRegistry.PegoutRepository, + rskRegistry.RpcServer, + eventBus, + mutexes.BtcWalletMutex(), + ), + getUserDepositsUseCase: pegout.NewGetUserDepositsUseCase(databaseRegistry.PegoutRepository), + liquidityCheckUseCase: liquidity_provider.NewCheckLiquidityUseCase( + liquidityProvider, + liquidityProvider, + rskRegistry.Bridge, + alertSender, + ), + penalizationAlertUseCase: liquidity_provider.NewPenalizationAlertUseCase( + rskRegistry.Lbc, + alertSender, + env.Provider.AlertRecipientEmail, + ), + getProvidersUseCase: liquidity_provider.NewGetProvidersUseCase(rskRegistry.Lbc), + getPeginCollateralUseCase: pegin.NewGetCollateralUseCase(rskRegistry.Lbc, liquidityProvider), + getPegoutCollateralUseCase: pegout.NewGetCollateralUseCase(rskRegistry.Lbc, liquidityProvider), + withdrawPeginCollateralUseCase: pegin.NewWithdrawCollateralUseCase(rskRegistry.Lbc), + withdrawPegoutCollateralUseCase: pegout.NewWithdrawCollateralUseCase(rskRegistry.Lbc), + healthUseCase: usecases.NewHealthUseCase(rskRegistry.Client, btcRegistry.Connection, databaseRegistry.Connection), + } +} + +func (registry *UseCaseRegistry) GetPeginQuoteUseCase() *pegin.GetQuoteUseCase { + return registry.getPeginQuoteUseCase +} + +func (registry *UseCaseRegistry) GetRegistrationUseCase() *liquidity_provider.RegistrationUseCase { + return registry.registerProviderUseCase +} + +func (registry *UseCaseRegistry) GetAcceptPeginQuoteUseCase() *pegin.AcceptQuoteUseCase { + return registry.acceptPeginQuoteUseCase +} + +func (registry *UseCaseRegistry) GetProviderDetailUseCase() *liquidity_provider.GetDetailUseCase { + return registry.getProviderDetailUseCase +} + +func (registry *UseCaseRegistry) GetPegoutQuoteUseCase() *pegout.GetQuoteUseCase { + return registry.getPegoutQuoteUseCase +} + +func (registry *UseCaseRegistry) GetAcceptPegoutQuoteUseCase() *pegout.AcceptQuoteUseCase { + return registry.acceptPegoutQuoteUseCase +} + +func (registry *UseCaseRegistry) GetUserDepositsUseCase() *pegout.GetUserDepositsUseCase { + return registry.getUserDepositsUseCase +} + +func (registry *UseCaseRegistry) GetProvidersUseCase() *liquidity_provider.GetProvidersUseCase { + return registry.getProvidersUseCase +} + +func (registry *UseCaseRegistry) GetPeginCollateralUseCase() *pegin.GetCollateralUseCase { + return registry.getPeginCollateralUseCase +} + +func (registry *UseCaseRegistry) GetPegoutCollateralUseCase() *pegout.GetCollateralUseCase { + return registry.getPegoutCollateralUseCase +} + +func (registry *UseCaseRegistry) WithdrawPeginCollateralUseCase() *pegin.WithdrawCollateralUseCase { + return registry.withdrawPeginCollateralUseCase +} + +func (registry *UseCaseRegistry) WithdrawPegoutCollateralUseCase() *pegout.WithdrawCollateralUseCase { + return registry.withdrawPegoutCollateralUseCase +} + +func (registry *UseCaseRegistry) HealthUseCase() *usecases.HealthUseCase { + return registry.healthUseCase +} + +func (registry *UseCaseRegistry) ResignationUseCase() *liquidity_provider.ResignUseCase { + return registry.resignUseCase +} + +func (registry *UseCaseRegistry) ChangeStatusUseCase() *liquidity_provider.ChangeStatusUseCase { + return registry.changeStatusUseCase +} + +func (registry *UseCaseRegistry) AddPeginCollateralUseCase() *pegin.AddCollateralUseCase { + return registry.addPeginCollateralUseCase +} + +func (registry *UseCaseRegistry) AddPegoutCollateralUseCase() *pegout.AddCollateralUseCase { + return registry.addPegoutCollateralUseCase +} diff --git a/internal/configuration/registry/watcher.go b/internal/configuration/registry/watcher.go new file mode 100644 index 00000000..5091547d --- /dev/null +++ b/internal/configuration/registry/watcher.go @@ -0,0 +1,71 @@ +package registry + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/watcher" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities" +) + +type WatcherRegistry struct { + PeginDepositAddressWatcher *watcher.PeginDepositAddressWatcher + PeginBridgeWatcher *watcher.PeginBridgeWatcher + QuoteCleanerWatcher *watcher.QuoteCleanerWatcher + PegoutRskDepositWatcher *watcher.PegoutRskDepositWatcher + PegoutBtcTransferWatcher *watcher.PegoutBtcTransferWatcher + LiquidityCheckWatcher *watcher.LiquidityCheckWatcher + PenalizationAlertWatcher *watcher.PenalizationAlertWatcher +} + +func NewWatcherRegistry( + env environment.Environment, + useCaseRegistry *UseCaseRegistry, + rskRegistry *Rootstock, + btcRegistry *Bitcoin, + liquidityProvider *dataproviders.LocalLiquidityProvider, + eventBus entities.EventBus, +) *WatcherRegistry { + return &WatcherRegistry{ + PeginDepositAddressWatcher: watcher.NewPeginDepositAddressWatcher( + useCaseRegistry.callForUserUseCase, + useCaseRegistry.getWatchedPeginQuoteUseCase, + useCaseRegistry.expiredPeginQuoteUseCase, + btcRegistry.Wallet, + btcRegistry.RpcServer, + eventBus, + ), + PeginBridgeWatcher: watcher.NewPeginBridgeWatcher( + useCaseRegistry.registerPeginUseCase, + useCaseRegistry.getWatchedPeginQuoteUseCase, + rskRegistry.Bridge, + btcRegistry.RpcServer, + eventBus, + ), + QuoteCleanerWatcher: watcher.NewQuoteCleanerWatcher( + useCaseRegistry.cleanExpiredQuotesUseCase, + ), + PegoutRskDepositWatcher: watcher.NewPegoutRskDepositWatcher( + useCaseRegistry.getWatchedPegoutQuoteUseCase, + useCaseRegistry.expiredPegoutUseCase, + useCaseRegistry.sendPegoutUseCase, + useCaseRegistry.updatePegoutDepositUseCase, + useCaseRegistry.initPegoutDepositCacheUseCase, + liquidityProvider, + rskRegistry.RpcServer, + rskRegistry.Lbc, + eventBus, + env.Pegout.DepositCacheStartBlock, + ), + PegoutBtcTransferWatcher: watcher.NewPegoutBtcTransferWatcher( + useCaseRegistry.getWatchedPegoutQuoteUseCase, + useCaseRegistry.refundPegoutUseCase, + btcRegistry.RpcServer, + eventBus, + ), + LiquidityCheckWatcher: watcher.NewLiquidityCheckWatcher(useCaseRegistry.liquidityCheckUseCase), + PenalizationAlertWatcher: watcher.NewPenalizationAlertWatcher( + rskRegistry.RpcServer, + useCaseRegistry.penalizationAlertUseCase, + ), + } +} diff --git a/internal/entities/alerts.go b/internal/entities/alerts.go new file mode 100644 index 00000000..291bd345 --- /dev/null +++ b/internal/entities/alerts.go @@ -0,0 +1,7 @@ +package entities + +import "context" + +type AlertSender interface { + SendAlert(ctx context.Context, subject, body, recipient string) error +} diff --git a/internal/entities/blockchain/bitcoin.go b/internal/entities/blockchain/bitcoin.go new file mode 100644 index 00000000..8e8d23fa --- /dev/null +++ b/internal/entities/blockchain/bitcoin.go @@ -0,0 +1,73 @@ +package blockchain + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "math/big" + "regexp" +) + +var ( + btcTestnetP2PKHRegex = regexp.MustCompile("^[mn]([a-km-zA-HJ-NP-Z1-9]{25,34})$") + btcMainnetP2PKHRegex = regexp.MustCompile("^[1]([a-km-zA-HJ-NP-Z1-9]{25,34})$") + btcMainnetP2SHRegex = regexp.MustCompile("^[3]([a-km-zA-HJ-NP-Z1-9]{33,34})$") + btcTestnetP2SHRegex = regexp.MustCompile("^[2]([a-km-zA-HJ-NP-Z1-9]{33,34})$") +) + +func IsLegacyBtcAddress(address string) bool { + return isP2PKH(address) || isP2SH(address) +} + +func isP2PKH(address string) bool { + return btcTestnetP2PKHRegex.MatchString(address) || btcMainnetP2PKHRegex.MatchString(address) +} + +func isP2SH(address string) bool { + return btcTestnetP2SHRegex.MatchString(address) || btcMainnetP2SHRegex.MatchString(address) +} + +type BitcoinWallet interface { + EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) + GetBalance() (*entities.Wei, error) + SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (string, error) + ImportAddress(address string) error + GetTransactions(address string) ([]BitcoinTransactionInformation, error) + Unlock() error +} + +type BitcoinNetwork interface { + DecodeAddress(address string, keepVersion bool) ([]byte, error) + GetTransactionInfo(hash string) (BitcoinTransactionInformation, error) + GetRawTransaction(hash string) ([]byte, error) + GetPartialMerkleTree(hash string) ([]byte, error) + GetHeight() (*big.Int, error) + BuildMerkleBranch(txHash string) (MerkleBranch, error) + GetTransactionBlockInfo(txHash string) (BitcoinBlockInformation, error) +} + +type BitcoinTransactionInformation struct { + Hash string + Confirmations uint64 + Outputs map[string][]*entities.Wei +} + +func (tx *BitcoinTransactionInformation) AmountToAddress(address string) *entities.Wei { + total := new(entities.Wei) + utxos, ok := tx.Outputs[address] + if !ok { + return entities.NewWei(0) + } + for _, utxo := range utxos { + total.Add(total, utxo) + } + return total +} + +type BitcoinBlockInformation struct { + Hash [32]byte + Height *big.Int +} + +type MerkleBranch struct { + Hashes [][32]byte + Path *big.Int +} diff --git a/internal/entities/blockchain/lbc.go b/internal/entities/blockchain/lbc.go new file mode 100644 index 00000000..58b86661 --- /dev/null +++ b/internal/entities/blockchain/lbc.go @@ -0,0 +1,100 @@ +package blockchain + +import ( + "context" + "encoding/hex" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "math/big" +) + +type RegisterPeginParams struct { + QuoteSignature []byte + BitcoinRawTransaction []byte + PartialMerkleTree []byte + BlockHeight *big.Int + Quote quote.PeginQuote +} + +func (params RegisterPeginParams) String() string { + return fmt.Sprintf( + "RegisterPeginParams { QuoteSignature: %s, BitcoinRawTransaction: %s, "+ + "PartialMerkleTree: %s, BlockHeight: %v, Quote: %#v }", + hex.EncodeToString(params.QuoteSignature), + hex.EncodeToString(params.BitcoinRawTransaction), + hex.EncodeToString(params.PartialMerkleTree), + params.BlockHeight, + params.Quote, + ) +} + +type RefundPegoutParams struct { + QuoteHash [32]byte + BtcRawTx []byte + BtcBlockHeaderHash [32]byte + MerkleBranchPath *big.Int + MerkleBranchHashes [][32]byte +} + +func (params RefundPegoutParams) String() string { + return fmt.Sprintf( + "RefundPegoutParams { QuoteHash: %s, BtcRawTx: %s, "+ + "BtcBlockHeaderHash: %s, MerkleBranchPath: %v, MerkleBranchHashes: %#v }", + hex.EncodeToString(params.QuoteHash[:]), + hex.EncodeToString(params.BtcRawTx), + hex.EncodeToString(params.BtcBlockHeaderHash[:]), + params.MerkleBranchPath, + params.MerkleBranchHashes, + ) +} + +type ProviderRegistrationParams struct { + Name string `validate:"required"` + ApiBaseUrl string `validate:"required"` + Status bool `validate:"required"` + Type entities.ProviderType `validate:"required"` +} + +func NewProviderRegistrationParams( + name string, + apiBaseUrl string, + status bool, + providerType entities.ProviderType, +) ProviderRegistrationParams { + return ProviderRegistrationParams{ + Name: name, + ApiBaseUrl: apiBaseUrl, + Status: status, + Type: providerType, + } +} + +type LiquidityBridgeContract interface { + GetAddress() string + HashPeginQuote(peginQuote quote.PeginQuote) (string, error) + HashPegoutQuote(pegoutQuote quote.PegoutQuote) (string, error) + GetProviders() ([]entities.RegisteredLiquidityProvider, error) + ProviderResign() error + SetProviderStatus(id uint64, newStatus bool) error + GetCollateral(address string) (*entities.Wei, error) + GetPegoutCollateral(address string) (*entities.Wei, error) + GetMinimumCollateral() (*entities.Wei, error) + AddCollateral(amount *entities.Wei) error + AddPegoutCollateral(amount *entities.Wei) error + WithdrawCollateral() error + WithdrawPegoutCollateral() error + GetBalance(address string) (*entities.Wei, error) + CallForUser(txConfig TransactionConfig, peginQuote quote.PeginQuote) (string, error) + RegisterPegin(params RegisterPeginParams) (string, error) + RefundPegout(txConfig TransactionConfig, params RefundPegoutParams) (string, error) + IsOperationalPegin(address string) (bool, error) + IsOperationalPegout(address string) (bool, error) + RegisterProvider(txConfig TransactionConfig, params ProviderRegistrationParams) (int64, error) + GetDepositEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]quote.PegoutDeposit, error) + GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]entities.PunishmentEvent, error) +} + +type FeeCollector interface { + DaoFeePercentage() (uint64, error) +} diff --git a/internal/entities/blockchain/rootstock.go b/internal/entities/blockchain/rootstock.go new file mode 100644 index 00000000..afacfb66 --- /dev/null +++ b/internal/entities/blockchain/rootstock.go @@ -0,0 +1,94 @@ +package blockchain + +import ( + "context" + "encoding/hex" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "math/big" + "regexp" + "strings" +) + +var ( + rskAddressRegex = regexp.MustCompile("^0x[a-fA-F0-9]{40}$") + WaitingForBridgeError = errors.New("waiting for rootstock bridge") + InvalidAddressError = errors.New("invalid rootstock address") +) + +func DecodeStringTrimPrefix(hexString string) ([]byte, error) { + return hex.DecodeString(strings.TrimPrefix(hexString, "0x")) +} +func IsRskAddress(address string) bool { + return rskAddressRegex.MatchString(address) +} + +type TransactionConfig struct { + Value *entities.Wei + GasLimit *uint64 + GasPrice *entities.Wei +} + +type TransactionReceipt struct { + TransactionHash string + transactionIndex uint32 + BlockHash string + BlockNumber uint64 + From string + To string + CumulativeGasUsed *big.Int + GasUsed *big.Int + Value *entities.Wei +} + +func NewTransactionConfig(value *entities.Wei, gasLimit uint64, gasPrice *entities.Wei) TransactionConfig { + var gas *uint64 + if gasLimit != 0 { + gas = &gasLimit + } + return TransactionConfig{Value: value, GasLimit: gas, GasPrice: gasPrice} +} + +type RootstockRpcServer interface { + EstimateGas(ctx context.Context, addr string, value *entities.Wei, data []byte) (*entities.Wei, error) + GasPrice(ctx context.Context) (*entities.Wei, error) + GetHeight(ctx context.Context) (uint64, error) + GetTransactionReceipt(ctx context.Context, hash string) (TransactionReceipt, error) + GetBalance(ctx context.Context, address string) (*entities.Wei, error) +} + +type RootstockWallet interface { + SendRbtc(ctx context.Context, config TransactionConfig, toAddress string) (string, error) +} + +type FlyoverDerivationArgs struct { + FedInfo FederationInfo + LbcAdress []byte + UserBtcRefundAddress []byte + LpBtcAddress []byte + QuoteHash []byte +} + +type FlyoverDerivation struct { + Address string + RedeemScript string +} + +type RootstockBridge interface { + GetAddress() string + GetFedAddress() (string, error) + GetMinimumLockTxValue() (*entities.Wei, error) + GetFlyoverDerivationAddress(args FlyoverDerivationArgs) (FlyoverDerivation, error) + GetRequiredTxConfirmations() uint64 + FetchFederationInfo() (FederationInfo, error) +} + +type FederationInfo struct { + FedSize int64 + FedThreshold int64 + PubKeys []string + FedAddress string + ActiveFedBlockHeight int64 + IrisActivationHeight int64 + ErpKeys []string +} diff --git a/internal/entities/common.go b/internal/entities/common.go new file mode 100644 index 00000000..7e4ee100 --- /dev/null +++ b/internal/entities/common.go @@ -0,0 +1,22 @@ +package entities + +import ( + "context" + "github.com/go-playground/validator/v10" +) + +var ( + validate = validator.New(validator.WithRequiredStructEnabled()) +) + +func ValidateStruct(s any) error { + return validate.Struct(s) +} + +type Closeable interface { + Shutdown(closeChannel chan<- bool) +} + +type Service interface { + CheckConnection(ctx context.Context) bool +} diff --git a/internal/entities/event.go b/internal/entities/event.go new file mode 100644 index 00000000..221f4df8 --- /dev/null +++ b/internal/entities/event.go @@ -0,0 +1,45 @@ +package entities + +import ( + "sync" + "time" +) + +type EventId string + +type Event interface { + Id() EventId + CreationTimestamp() time.Time +} + +type BaseEvent struct { + EventId EventId + Timestamp time.Time +} + +func NewBaseEvent(id EventId) BaseEvent { + return BaseEvent{EventId: id, Timestamp: time.Now()} +} + +func (e BaseEvent) Id() EventId { + return e.EventId +} + +func (e BaseEvent) CreationTimestamp() time.Time { + return e.Timestamp +} + +type EventBus interface { + Closeable + Publish(events Event) + Subscribe(id EventId) <-chan Event + // Shutdown since subscriptions return event channel, shutdown should close all the subscription channels + Shutdown(chan<- bool) +} + +type ApplicationMutexes interface { + RskWalletMutex() *sync.Mutex + BtcWalletMutex() *sync.Mutex + PeginLiquidityMutex() *sync.Mutex + PegoutLiquidityMutex() *sync.Mutex +} diff --git a/internal/entities/liquidity_provider.go b/internal/entities/liquidity_provider.go new file mode 100644 index 00000000..d908f918 --- /dev/null +++ b/internal/entities/liquidity_provider.go @@ -0,0 +1,96 @@ +package entities + +import ( + "context" + "errors" +) + +type ProviderType string + +const ( + PeginProvider ProviderType = "pegin" + PegoutProvider ProviderType = "pegout" + FullProvider ProviderType = "both" +) + +var InvalidProviderTypeError = errors.New("invalid liquidity provider type") + +func (p ProviderType) IsValid() bool { + switch p { + case PegoutProvider, PeginProvider, FullProvider: + return true + default: + return false + } +} + +func (p ProviderType) AcceptsPegin() bool { + return p == PeginProvider || p == FullProvider +} + +func (p ProviderType) AcceptsPegout() bool { + return p == PegoutProvider || p == FullProvider +} + +func ToProviderType(value string) (ProviderType, error) { + providerType := ProviderType(value) + if providerType.IsValid() { + return providerType, nil + } else { + return "", InvalidProviderTypeError + } +} + +type LiquidityProvider interface { + RskAddress() string + BtcAddress() string + SignQuote(quoteHash string) (string, error) + GetBitcoinConfirmationsForValue(value *Wei) uint16 + GetRootstockConfirmationsForValue(value *Wei) uint16 +} + +type PeginLiquidityProvider interface { + ValidateAmountForPegin(amount *Wei) error + HasPeginLiquidity(ctx context.Context, requiredLiquidity *Wei) error + CallTime() uint32 + CallFeePegin() *Wei + PenaltyFeePegin() *Wei + TimeForDepositPegin() uint32 + MaxPegin() *Wei + MinPegin() *Wei + MaxPeginConfirmations() uint16 +} + +type PegoutLiquidityProvider interface { + ValidateAmountForPegout(amount *Wei) error + HasPegoutLiquidity(ctx context.Context, requiredLiquidity *Wei) error + CallFeePegout() *Wei + PenaltyFeePegout() *Wei + TimeForDepositPegout() uint32 + ExpireBlocksPegout() uint64 + MaxPegout() *Wei + MinPegout() *Wei + MaxPegoutConfirmations() uint16 +} + +type RegisteredLiquidityProvider struct { + Id uint64 `json:"id" validate:"required"` + Address string `json:"address" validate:"required"` + Name string `json:"name" validate:"required"` + ApiBaseUrl string `json:"apiBaseUrl" validate:"required"` + Status bool `json:"status" validate:"required"` + ProviderType ProviderType `json:"providerType" validate:"required"` +} + +type LiquidityProviderDetail struct { + Fee *Wei `json:"fee" validate:"required"` + MinTransactionValue *Wei `json:"minTransactionValue" validate:"required"` + MaxTransactionValue *Wei `json:"maxTransactionValue" validate:"required"` + RequiredConfirmations uint16 `json:"requiredConfirmations" validate:"required"` +} + +type PunishmentEvent struct { + LiquidityProvider string + Penalty *Wei + QuoteHash string +} diff --git a/internal/entities/quote/common.go b/internal/entities/quote/common.go new file mode 100644 index 00000000..0fa1ba98 --- /dev/null +++ b/internal/entities/quote/common.go @@ -0,0 +1,6 @@ +package quote + +type AcceptedQuote struct { + Signature string `json:"signature"` + DepositAddress string `json:"depositAddress"` +} diff --git a/internal/entities/quote/pegin_quote.go b/internal/entities/quote/pegin_quote.go new file mode 100644 index 00000000..45cf617e --- /dev/null +++ b/internal/entities/quote/pegin_quote.go @@ -0,0 +1,105 @@ +package quote + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "time" +) + +const ( + AcceptedPeginQuoteEventId entities.EventId = "AcceptedPeginQuote" + CallForUserCompletedEventId entities.EventId = "CallForUserCompleted" + RegisterPeginCompletedEventId entities.EventId = "RegisterPeginCompleted" +) + +type PeginState string + +const ( + PeginStateWaitingForDeposit PeginState = "WaitingForDeposit" + PeginStateTimeForDepositElapsed PeginState = "TimeForDepositElapsed" + PeginStateCallForUserSucceeded PeginState = "CallForUserSucceeded" + PeginStateCallForUserFailed PeginState = "CallForUserFailed" + PeginStateRegisterPegInSucceeded PeginState = "RegisterPegInSucceeded" + PeginStateRegisterPegInFailed PeginState = "RegisterPegInFailed" +) + +type PeginQuoteRepository interface { + InsertQuote(ctx context.Context, hash string, quote PeginQuote) error + GetQuote(ctx context.Context, hash string) (*PeginQuote, error) + GetRetainedQuote(ctx context.Context, hash string) (*RetainedPeginQuote, error) + InsertRetainedQuote(ctx context.Context, quote RetainedPeginQuote) error + UpdateRetainedQuote(ctx context.Context, quote RetainedPeginQuote) error + GetRetainedQuoteByState(ctx context.Context, states ...PeginState) ([]RetainedPeginQuote, error) + // DeleteQuotes deletes both regular and retained quotes + DeleteQuotes(ctx context.Context, quotes []string) (uint, error) +} + +type PeginQuote struct { + FedBtcAddress string `json:"fedBTCAddress" bson:"fed_address" validate:"required"` + LbcAddress string `json:"lbcAddress" bson:"lbc_address" validate:"required"` + LpRskAddress string `json:"lpRskAddress" bson:"lp_rsk_address" validate:"required"` + BtcRefundAddress string `json:"btcRefundAddress" bson:"btc_refund_address" validate:"required"` + RskRefundAddress string `json:"rskRefundAddress" bson:"rsk_refund_address" validate:"required"` + LpBtcAddress string `json:"lpBtcAddress" bson:"lp_btc_address" validate:"required"` + CallFee *entities.Wei `json:"callFee" bson:"call_fee" validate:"required"` + PenaltyFee *entities.Wei `json:"penaltyFee" bson:"penalty_fee" validate:"required"` + ContractAddress string `json:"contractAddress" bson:"contract_address" validate:"required"` + Data string `json:"data" bson:"data" validate:""` + GasLimit uint32 `json:"gasLimit,omitempty" bson:"gas_limit" validate:"required"` + Nonce int64 `json:"nonce" bson:"nonce" validate:"required"` + Value *entities.Wei `json:"value" bson:"value" validate:"required"` + AgreementTimestamp uint32 `json:"agreementTimestamp" bson:"agreement_timestamp" validate:"required"` + TimeForDeposit uint32 `json:"timeForDeposit" bson:"time_for_deposit" validate:"required"` + LpCallTime uint32 `json:"lpCallTime" bson:"lp_call_time" validate:"required"` + Confirmations uint16 `json:"confirmations" bson:"confirmations" validate:"required"` + CallOnRegister bool `json:"callOnRegister" bson:"call_on_register"` + GasFee *entities.Wei `json:"gasFee" bson:"gas_fee" validate:"required"` + ProductFeeAmount uint64 `json:"productFeeAmount" bson:"product_fee_amount" validate:"required"` +} + +func (quote *PeginQuote) ExpireTime() time.Time { + return time.Unix(int64(quote.AgreementTimestamp+quote.TimeForDeposit), 0) +} + +func (quote *PeginQuote) IsExpired() bool { + return time.Now().After(quote.ExpireTime()) +} + +func (quote *PeginQuote) Total() *entities.Wei { + total := new(entities.Wei) + total.Add(total, quote.Value) + total.Add(total, quote.CallFee) + total.Add(total, entities.NewUWei(quote.ProductFeeAmount)) + total.Add(total, quote.GasFee) + return total +} + +type RetainedPeginQuote struct { + QuoteHash string `json:"quoteHash" bson:"quote_hash" validate:"required"` + DepositAddress string `json:"depositAddress" bson:"deposit_address" validate:"required"` + Signature string `json:"signature" bson:"signature" validate:"required"` + RequiredLiquidity *entities.Wei `json:"requiredLiquidity" bson:"required_liquidity" validate:"required"` + State PeginState `json:"state" bson:"state" validate:"required"` + UserBtcTxHash string `json:"userBtcTxHash" bson:"user_btc_tx_hash"` + CallForUserTxHash string `json:"callForUserTxHash" bson:"call_for_user_tx_hash"` + RegisterPeginTxHash string `json:"registerPeginTxHash" bson:"register_pegin_tx_hash"` +} + +type AcceptedPeginQuoteEvent struct { + entities.Event + Quote PeginQuote + RetainedQuote RetainedPeginQuote +} + +type CallForUserCompletedEvent struct { + entities.Event + PeginQuote PeginQuote + RetainedQuote RetainedPeginQuote + Error error +} + +type RegisterPeginCompletedEvent struct { + entities.Event + RetainedQuote RetainedPeginQuote + Error error +} diff --git a/internal/entities/quote/pegout_quote.go b/internal/entities/quote/pegout_quote.go new file mode 100644 index 00000000..bdca390e --- /dev/null +++ b/internal/entities/quote/pegout_quote.go @@ -0,0 +1,127 @@ +package quote + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "time" +) + +const ( + AcceptedPegoutQuoteEventId entities.EventId = "AcceptedPegoutQuote" + PegoutBtcSentEventId entities.EventId = "PegoutBtcSent" + PegoutQuoteCompletedEventId entities.EventId = "PegoutQuoteCompleted" +) + +type PegoutState string + +const ( + PegoutStateWaitingForDeposit PegoutState = "WaitingForDeposit" + PegoutStateTimeForDepositElapsed PegoutState = "TimeForDepositElapsed" + PegoutStateSendPegoutSucceeded PegoutState = "SendPegoutSucceeded" + PegoutStateSendPegoutFailed PegoutState = "SendPegoutFailed" + PegoutStateRefundPegOutSucceeded PegoutState = "RefundPegOutSucceeded" + PegoutStateRefundPegOutFailed PegoutState = "RefundPegOutFailed" + PegoutStateWaitingForDepositConfirmations PegoutState = "WaitingForDepositConfirmations" +) + +type PegoutQuoteRepository interface { + InsertQuote(ctx context.Context, hash string, quote PegoutQuote) error + GetQuote(ctx context.Context, hash string) (*PegoutQuote, error) + GetRetainedQuote(ctx context.Context, hash string) (*RetainedPegoutQuote, error) + InsertRetainedQuote(ctx context.Context, quote RetainedPegoutQuote) error + ListPegoutDepositsByAddress(ctx context.Context, address string) ([]PegoutDeposit, error) + UpdateRetainedQuote(ctx context.Context, quote RetainedPegoutQuote) error + GetRetainedQuoteByState(ctx context.Context, states ...PegoutState) ([]RetainedPegoutQuote, error) + // DeleteQuotes deletes both regular and retained quotes + DeleteQuotes(ctx context.Context, quotes []string) (uint, error) + UpsertPegoutDeposit(ctx context.Context, deposit PegoutDeposit) error + UpsertPegoutDeposits(ctx context.Context, deposits []PegoutDeposit) error +} + +type PegoutQuote struct { + LbcAddress string `json:"lbcAddress" bson:"lbc_address" validate:"required"` + LpRskAddress string `json:"lpRskAddress" bson:"lp_rsk_address" validate:"required"` + BtcRefundAddress string `json:"btcRefundAddress" bson:"btc_refund_address" validate:"required"` + RskRefundAddress string `json:"rskRefundAddress" bson:"rsk_refund_address" validate:"required"` + LpBtcAddress string `json:"lpBtcAddress" bson:"lp_btc_address" validate:"required"` + CallFee *entities.Wei `json:"callFee" bson:"call_fee" validate:"required"` + PenaltyFee uint64 `json:"penaltyFee" bson:"penalty_fee" validate:"required"` + Nonce int64 `json:"nonce" bson:"nonce" validate:"required"` + DepositAddress string `json:"depositAddress" bson:"deposit_address" validate:"required"` + Value *entities.Wei `json:"value" bson:"value" validate:"required"` + AgreementTimestamp uint32 `json:"agreementTimestamp" bson:"agreement_timestamp" validate:"required"` + DepositDateLimit uint32 `json:"depositDateLimit" bson:"deposit_date_limit" validate:"required"` + DepositConfirmations uint16 `json:"depositConfirmations" bson:"deposit_confirmations" validate:"required"` + TransferConfirmations uint16 `json:"transferConfirmations" bson:"transfer_confirmations" validate:"required"` + TransferTime uint32 `json:"transferTime" bson:"transfer_time" validate:"required"` + ExpireDate uint32 `json:"expireDate" bson:"expire_date" validate:"required"` + ExpireBlock uint32 `json:"expireBlocks" bson:"expire_blocks" validate:"required"` + GasFee *entities.Wei `json:"gasFee" bson:"gas_fee" validate:"required"` + ProductFeeAmount uint64 `json:"productFeeAmount" bson:"product_fee_amount" validate:"required"` +} + +func (quote *PegoutQuote) ExpireTime() time.Time { + return time.Unix(int64(quote.ExpireDate), 0) +} + +func (quote *PegoutQuote) IsExpired() bool { + return time.Now().After(quote.ExpireTime()) +} + +func GetCreationBlock(lp entities.PegoutLiquidityProvider, pegoutQuote PegoutQuote) uint64 { + return uint64(pegoutQuote.ExpireBlock) - lp.ExpireBlocksPegout() +} + +func (quote *PegoutQuote) Total() *entities.Wei { + total := new(entities.Wei) + total.Add(total, quote.Value) + total.Add(total, quote.CallFee) + total.Add(total, entities.NewUWei(quote.ProductFeeAmount)) + total.Add(total, quote.GasFee) + return total +} + +type RetainedPegoutQuote struct { + QuoteHash string `json:"quoteHash" bson:"quote_hash" validate:"required"` + DepositAddress string `json:"depositAddress" bson:"deposit_address" validate:"required"` + Signature string `json:"signature" bson:"signature" validate:"required"` + RequiredLiquidity *entities.Wei `json:"requiredLiquidity" bson:"required_liquidity" validate:"required"` + State PegoutState `json:"state" bson:"state" validate:"required"` + UserRskTxHash string `json:"userRskTxHash" bson:"user_rsk_tx_hash"` + LpBtcTxHash string `json:"lpBtcTxHash" bson:"lp_btc_tx_hash"` + RefundPegoutTxHash string `json:"refundPegoutTxHash" bson:"refund_pegout_tx_hash"` +} + +type AcceptedPegoutQuoteEvent struct { + entities.Event + Quote PegoutQuote + RetainedQuote RetainedPegoutQuote +} + +type PegoutDeposit struct { + TxHash string `json:"txHash" bson:"tx_hash"` + QuoteHash string `json:"quoteHash" bson:"quote_hash"` + Amount *entities.Wei `json:"amount" bson:"amount"` + Timestamp time.Time `json:"timestamp" bson:"timestamp"` + BlockNumber uint64 `json:"blockNumber" bson:"block_number"` + From string `json:"from" bson:"from"` +} + +func (deposit *PegoutDeposit) IsValidForQuote(quote PegoutQuote) bool { + enoughAmount := deposit.Amount.Cmp(quote.Total()) >= 0 + nonExpired := deposit.Timestamp.Before(quote.ExpireTime()) + return enoughAmount && nonExpired +} + +type PegoutQuoteCompletedEvent struct { + entities.Event + RetainedQuote RetainedPegoutQuote + Error error +} + +type PegoutBtcSentToUserEvent struct { + entities.Event + PegoutQuote PegoutQuote + RetainedQuote RetainedPegoutQuote + Error error +} diff --git a/internal/entities/wei.go b/internal/entities/wei.go new file mode 100644 index 00000000..1931017d --- /dev/null +++ b/internal/entities/wei.go @@ -0,0 +1,133 @@ +package entities + +import ( + "database/sql/driver" + "encoding/binary" + "errors" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsontype" + "math/big" + "slices" +) + +type Wei big.Int + +type BigIntPtr = *big.Int + +var bTen = big.NewInt(10) +var bEighteen = big.NewInt(18) +var bTenPowTen = new(big.Int).Exp(bTen, bTen, nil) // 10**10 +var bTenPowEighteen = new(big.Int).Exp(bTen, bEighteen, nil) // 10**18 + +func NewWei(x int64) *Wei { + w := new(Wei) + w.AsBigInt().SetInt64(x) + return w +} + +func NewUWei(x uint64) *Wei { + w := new(Wei) + w.AsBigInt().SetUint64(x) + return w +} + +func NewBigWei(x *big.Int) *Wei { + w := new(Wei) + w.AsBigInt().Set(x) + return w +} + +func SatoshiToWei(x uint64) *Wei { + sat := new(big.Int).SetUint64(x) + w := new(Wei) + w.AsBigInt().Mul(sat, bTenPowTen) + return w +} + +func (w *Wei) Copy() *Wei { + return NewBigWei(w.AsBigInt()) +} + +func (w *Wei) Cmp(y *Wei) int { + return w.AsBigInt().Cmp(y.AsBigInt()) +} + +func (w *Wei) AsBigInt() BigIntPtr { + return BigIntPtr(w) +} + +func (w *Wei) Uint64() uint64 { + return w.AsBigInt().Uint64() +} + +func (w *Wei) ToRbtc() *big.Float { + return new(big.Float).Quo(new(big.Float).SetInt(w.AsBigInt()), new(big.Float).SetInt(bTenPowEighteen)) +} + +func (w *Wei) ToSatoshi() *big.Float { + return new(big.Float).Quo(new(big.Float).SetInt(w.AsBigInt()), new(big.Float).SetInt(bTenPowTen)) +} + +func (w *Wei) String() string { + return w.AsBigInt().String() +} + +func (w *Wei) Value() (driver.Value, error) { + if w == nil { + return "", errors.New("cannot retrieve value from ") + } + return w.AsBigInt().String(), nil +} + +func (w *Wei) Scan(src interface{}) error { + switch src.(type) { + case string: + _, ok := w.AsBigInt().SetString(src.(string), 10) + if !ok { + return errors.New("cannot scan invalid value") + } + return nil + case nil: + return errors.New("cannot scan value") + default: + return errors.New("cannot scan invalid type of value") + } +} + +func (w *Wei) MarshalJSON() ([]byte, error) { + return w.AsBigInt().MarshalJSON() +} + +func (w *Wei) UnmarshalJSON(bytes []byte) error { + return w.AsBigInt().UnmarshalJSON(bytes) +} + +func (w *Wei) MarshalBSONValue() (bsontype.Type, []byte, error) { + value := make([]byte, 8) + binary.LittleEndian.PutUint64(value, w.Uint64()) + return bson.TypeInt64, value, nil +} + +func (w *Wei) UnmarshalBSONValue(bsonType bsontype.Type, bytes []byte) error { + if bsonType != bson.TypeInt64 { + return errors.New("trying to unmarshal something that is not int64 into Wei") + } + slices.Reverse(bytes) + w.AsBigInt().SetBytes(bytes) + return nil +} + +func (w *Wei) Add(x, y *Wei) *Wei { + w.AsBigInt().Add(x.AsBigInt(), y.AsBigInt()) + return w +} + +func (w *Wei) Sub(x, y *Wei) *Wei { + w.AsBigInt().Sub(x.AsBigInt(), y.AsBigInt()) + return w +} + +func (w *Wei) Mul(x, y *Wei) *Wei { + w.AsBigInt().Mul(x.AsBigInt(), y.AsBigInt()) + return w +} diff --git a/internal/entities/wei_test.go b/internal/entities/wei_test.go new file mode 100644 index 00000000..15dd3767 --- /dev/null +++ b/internal/entities/wei_test.go @@ -0,0 +1,429 @@ +package entities_test + +import ( + "database/sql/driver" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "math" + "math/big" + "reflect" + "testing" +) + +func TestSatoshiToWei(t *testing.T) { + type args struct { + x uint64 + } + tests := []struct { + name string + args args + want *entities.Wei + }{ + { + name: "zero sat to wei", + args: args{x: 0}, + want: entities.NewWei(0), + }, + { + name: "one sat to wei", + args: args{x: 1}, + want: entities.NewWei(int64(math.Pow(10, 10))), + }, + { + name: "10**8 sat (1 btc) to wei", + args: args{x: uint64(math.Pow(10, 8))}, + want: entities.NewWei(int64(math.Pow(10, 18))), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := entities.SatoshiToWei(tt.args.x); !reflect.DeepEqual(got, tt.want) { + t.Errorf("SatoshiToWei() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewBigWei(t *testing.T) { + type args struct { + x *big.Int + } + tests := []struct { + name string + args args + want *entities.Wei + }{ + { + name: "new big wei", + args: args{x: big.NewInt(1)}, + want: entities.NewWei(1), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := entities.NewBigWei(tt.args.x); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewBigWei() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewWei(t *testing.T) { + type args struct { + x int64 + } + tests := []struct { + name string + args args + want *entities.Wei + }{ + { + name: "new zero wei", + args: args{x: 0}, + want: new(entities.Wei), + }, + { + name: "new one wei", + args: args{x: 1}, + want: (*entities.Wei)(big.NewInt(1)), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := entities.NewWei(tt.args.x); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewWei() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_AsBigInt(t *testing.T) { + tests := []struct { + name string + w *entities.Wei + want entities.BigIntPtr + }{ + { + name: "as big.int", + w: entities.NewWei(1), + want: big.NewInt(1), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.w.AsBigInt(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("AsBigInt() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_ToRbtc(t *testing.T) { + tests := []struct { + name string + w *entities.Wei + want *big.Float + }{ + { + name: "1 wei to rbtc", + w: entities.NewWei(1), + want: new(big.Float).Quo(new(big.Float).SetInt64(1), new(big.Float).SetInt(new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil))), + }, + { + name: "2*(10**10) wei to rbtc", + w: entities.NewWei(int64(2 * math.Pow(10, 18))), + want: big.NewFloat(2), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.w.ToRbtc(); got.Cmp(tt.want) != 0 { + t.Errorf("ToRbtc() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_ToSatoshi(t *testing.T) { + tests := []struct { + name string + w *entities.Wei + want *big.Float + }{ + { + name: "zero wei to sat", + w: entities.NewWei(0), + want: big.NewFloat(0), + }, + { + name: "1 wei to sat", + w: entities.NewWei(1), + want: new(big.Float).Quo(new(big.Float).SetInt64(1), new(big.Float).SetInt(new(big.Int).Exp(big.NewInt(10), big.NewInt(10), nil))), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.w.ToSatoshi(); got.Cmp(tt.want) != 0 { + t.Errorf("ToSatoshi() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_Uint64(t *testing.T) { + tests := []struct { + name string + w *entities.Wei + want uint64 + }{ + { + name: "wei to uint64", + w: entities.NewWei(1), + want: 1, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.w.Uint64(); got != tt.want { + t.Errorf("Uint64() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_Value(t *testing.T) { + tests := []struct { + name string + w *entities.Wei + want driver.Value + wantErr bool + }{ + { + name: "wei value", + w: entities.NewWei(1), + want: "1", + wantErr: false, + }, + { + name: " wei value", + w: nil, + want: "", + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.w.Value() + if (err != nil) != tt.wantErr { + t.Errorf("Value() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Value() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_Scan(t *testing.T) { + type args struct { + src interface{} + } + tests := []struct { + name string + w *entities.Wei + args args + wantErr bool + }{ + { + name: "valid value", + w: new(entities.Wei), + args: args{src: "100"}, + wantErr: false, + }, + { + name: "valid big value", + w: new(entities.Wei), + args: args{src: new(big.Int).Mul(new(big.Int).SetUint64(math.MaxUint64), big.NewInt(10)).String()}, // 10 * math.MaxUint64 + wantErr: false, + }, + { + name: " value", + w: new(entities.Wei), + args: args{src: nil}, + wantErr: true, + }, + { + name: "invalid value", + w: new(entities.Wei), + args: args{src: "abc"}, + wantErr: true, + }, + { + name: "invalid type", + w: new(entities.Wei), + args: args{src: true}, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := tt.w.Scan(tt.args.src); (err != nil) != tt.wantErr { + t.Errorf("Scan() error = %v, wantErr %v", err, tt.wantErr) + } else if !tt.wantErr { + val, ok := new(big.Int).SetString(tt.args.src.(string), 10) + if !ok { + t.Fatal("invalid arg") + } + if val.Cmp(tt.w.AsBigInt()) != 0 { + t.Errorf("Scan() = %v, want %v", tt.w, val) + } + } + }) + } +} + +func TestWei_String(t *testing.T) { + tests := []struct { + name string + w *entities.Wei + want string + }{ + { + name: "wei to string", + w: entities.NewWei(100), + want: "100", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.w.String(); got != tt.want { + t.Errorf("String() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_Copy(t *testing.T) { + w := entities.NewWei(100) + tests := []struct { + name string + w *entities.Wei + want *entities.Wei + }{ + { + name: "copy wei", + w: w, + want: w, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.w.Copy(); tt.w == got || got.AsBigInt().Cmp(tt.want.AsBigInt()) != 0 { + t.Errorf("Copy() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_Cmp(t *testing.T) { + type args struct { + y *entities.Wei + } + tests := []struct { + name string + x *entities.Wei + args args + wantR int + }{ + { + name: "eq wei", + x: entities.NewWei(2), + args: args{y: entities.NewWei(2)}, + wantR: 0, + }, + { + name: "gt wei", + x: entities.NewWei(2), + args: args{y: entities.NewWei(1)}, + wantR: 1, + }, + { + name: "lt wei", + x: entities.NewWei(1), + args: args{y: entities.NewWei(2)}, + wantR: -1, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if gotR := tt.x.Cmp(tt.args.y); gotR != tt.wantR { + t.Errorf("Cmp() = %v, want %v", gotR, tt.wantR) + } + }) + } +} + +func TestWei_MarshalJSON(t *testing.T) { + bigIntToBytes := func(i *big.Int) []byte { + bytes, _ := i.MarshalJSON() + return bytes + } + tests := []struct { + name string + w *entities.Wei + want []byte + wantErr bool + }{ + { + name: "marshal wei", + w: entities.NewWei(100), + want: bigIntToBytes(big.NewInt(100)), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.w.MarshalJSON() + if (err != nil) != tt.wantErr { + t.Errorf("MarshalJSON() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("MarshalJSON() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWei_UnmarshalJSON(t *testing.T) { + bigIntToBytes := func(i *big.Int) []byte { + bytes, _ := i.MarshalJSON() + return bytes + } + type args struct { + val *big.Int + bytes []byte + } + tests := []struct { + name string + w *entities.Wei + args args + wantErr bool + }{ + { + name: "unmarshal wei", + w: new(entities.Wei), + args: args{val: big.NewInt(100), bytes: bigIntToBytes(big.NewInt(100))}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := tt.w.UnmarshalJSON(tt.args.bytes); (err != nil) != tt.wantErr { + t.Errorf("UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr) + } else if tt.w.AsBigInt().Cmp(tt.args.val) != 0 { + t.Errorf("tt.w = %v, want %v", tt.w, tt.args.val) + } + }) + } +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go new file mode 100644 index 00000000..74d1d649 --- /dev/null +++ b/internal/usecases/common.go @@ -0,0 +1,115 @@ +package usecases + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "math/big" +) + +// used for error logging + +type UseCaseId string + +const ( + GetPeginQuoteId UseCaseId = "GetPeginQuote" + GetPegoutQuoteId UseCaseId = "GetPegoutQuote" + AcceptPeginQuoteId UseCaseId = "AcceptPeginQuote" + AcceptPegoutQuoteId UseCaseId = "AcceptPegoutQuote" + ProviderDetailId UseCaseId = "ProviderDetail" + GetProvidersId UseCaseId = "GetProviders" + GetUserQuotesId UseCaseId = "GetUserQuotes" + ProviderResignId UseCaseId = "ProviderResign" + ChangeProviderStatusId UseCaseId = "ChangeProviderStatus" + GetCollateralId UseCaseId = "GetCollateral" + GetPegoutCollateralId UseCaseId = "GetPegoutCollateral" + AddCollateralId UseCaseId = "AddCollateral" + AddPegoutCollateralId UseCaseId = "AddPegoutCollateral" + WithdrawCollateralId UseCaseId = "WithdrawCollateral" + WithdrawPegoutCollateralId UseCaseId = "WithdrawPegoutCollateral" + CallForUserId UseCaseId = "CallForUser" + RegisterPeginId UseCaseId = "RegisterPegin" + SendPegoutId UseCaseId = "SendPegout" + RefundPegoutId UseCaseId = "RefundPegout" + ProviderRegistrationId UseCaseId = "ProviderRegistration" + GetWatchedPeginQuoteId UseCaseId = "GetWatchedPeginQuote" + GetWatchedPegoutQuoteId UseCaseId = "GetWatchedPegoutQuote" + ExpiredPeginQuoteId UseCaseId = "ExpiredPeginQuote" + ExpiredPegoutQuoteId UseCaseId = "ExpiredPegoutQuote" + UpdatePegoutDepositId UseCaseId = "UpdatePegoutDeposit" + InitPegoutDepositCacheId UseCaseId = "InitPegoutDepositCache" + CheckLiquidityId UseCaseId = "CheckLiquidity" +) + +var ( + NonRecoverableError = errors.New("non recoverable") + TxBelowMinimumError = errors.New("requested amount below bridge's min pegin transaction value") + BtcAddressNotSupportedError = errors.New("btc address not supported") + RskAddressNotSupportedError = errors.New("rsk address not supported") + QuoteNotFoundError = errors.New("quote not found") + ExpiredQuoteError = errors.New("expired quote") + NoLiquidityError = errors.New("not enough liquidity") + ProviderConfigurationError = errors.New("pegin and pegout providers are not using the same account") + ProviderNotFoundError = errors.New("liquidity provider not found") + WrongStateError = errors.New("quote with wrong state") + NoEnoughConfirmationsError = errors.New("not enough confirmations for transaction") + InsufficientAmountError = errors.New("insufficient amount") + AlreadyRegisteredError = errors.New("liquidity provider already registered") + AmountOutOfRangeError = errors.New("amount out of range") + ProviderNotResignedError = errors.New("provided hasn't completed resignation process") +) + +type ErrorArgs map[string]string + +func NewErrorArgs() ErrorArgs { + return make(ErrorArgs) +} + +func ErrorArg(key, value string) ErrorArgs { + return ErrorArgs{key: value} +} + +func (args ErrorArgs) String() string { + jsonString, _ := json.Marshal(args) + return string(jsonString) +} + +func WrapUseCaseError(useCase UseCaseId, err error) error { + return WrapUseCaseErrorArgs(useCase, err, make(ErrorArgs, 0)) +} + +func WrapUseCaseErrorArgs(useCase UseCaseId, err error, args ErrorArgs) error { + if len(args) == 0 { + return fmt.Errorf("%s: %w", useCase, err) + } else { + return fmt.Errorf("%s: %w. Args: %v", useCase, err, args) + } +} + +type DaoAmounts struct { + DaoGasAmount *entities.Wei + DaoFeeAmount *entities.Wei +} + +func CalculateDaoAmounts(ctx context.Context, rsk blockchain.RootstockRpcServer, value *entities.Wei, daoFeePercentage uint64, feeCollectorAddress string) (DaoAmounts, error) { + daoFeeAmount := new(entities.Wei) + daoGasAmount := new(entities.Wei) + var err error + if daoFeePercentage == 0 { + return DaoAmounts{}, nil + } + + daoFeeAmount.Mul(value, entities.NewUWei(daoFeePercentage)) + daoFeeAmount.AsBigInt().Div(daoFeeAmount.AsBigInt(), big.NewInt(100)) + daoGasAmount, err = rsk.EstimateGas(ctx, feeCollectorAddress, daoFeeAmount, make([]byte, 0)) + if err != nil { + return DaoAmounts{}, err + } + return DaoAmounts{ + DaoFeeAmount: daoFeeAmount, + DaoGasAmount: daoGasAmount, + }, nil +} diff --git a/internal/usecases/health.go b/internal/usecases/health.go new file mode 100644 index 00000000..1a53a8db --- /dev/null +++ b/internal/usecases/health.go @@ -0,0 +1,64 @@ +package usecases + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" +) + +const ( + svcStatusOk = "ok" + svcStatusDegraded = "degraded" + svcStatusUnreachable = "unreachable" +) + +type HealthUseCase struct { + rsk entities.Service + btc entities.Service + db entities.Service +} + +func NewHealthUseCase(rsk entities.Service, btc entities.Service, db entities.Service) *HealthUseCase { + return &HealthUseCase{rsk: rsk, btc: btc, db: db} +} + +type HealthStatus struct { + Status string + Services struct { + Db string + Rsk string + Btc string + } +} + +func (useCase *HealthUseCase) Run(ctx context.Context) HealthStatus { + lpsSvcStatus := svcStatusOk + dbSvcStatus := svcStatusOk + rskSvcStatus := svcStatusOk + btcSvcStatus := svcStatusOk + + if !useCase.db.CheckConnection(ctx) { + dbSvcStatus = svcStatusUnreachable + lpsSvcStatus = svcStatusDegraded + } + if !useCase.btc.CheckConnection(ctx) { + btcSvcStatus = svcStatusUnreachable + lpsSvcStatus = svcStatusDegraded + } + if !useCase.rsk.CheckConnection(ctx) { + rskSvcStatus = svcStatusUnreachable + lpsSvcStatus = svcStatusDegraded + } + + return HealthStatus{ + Status: lpsSvcStatus, + Services: struct { + Db string + Rsk string + Btc string + }{ + Rsk: rskSvcStatus, + Btc: btcSvcStatus, + Db: dbSvcStatus, + }, + } +} diff --git a/internal/usecases/liquidity_provider/change_status.go b/internal/usecases/liquidity_provider/change_status.go new file mode 100644 index 00000000..076ce284 --- /dev/null +++ b/internal/usecases/liquidity_provider/change_status.go @@ -0,0 +1,27 @@ +package liquidity_provider + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type ChangeStatusUseCase struct { + lbc blockchain.LiquidityBridgeContract + provider entities.LiquidityProvider +} + +func (useCase *ChangeStatusUseCase) Run(newStatus bool) error { + var err error + var id uint64 + + id, err = ValidateConfiguredProvider(useCase.provider, useCase.lbc) + if err != nil { + return usecases.WrapUseCaseError(usecases.ChangeProviderStatusId, err) + } + + if err = useCase.lbc.SetProviderStatus(id, newStatus); err != nil { + return usecases.WrapUseCaseError(usecases.ChangeProviderStatusId, err) + } + return nil +} diff --git a/internal/usecases/liquidity_provider/check_liquidity.go b/internal/usecases/liquidity_provider/check_liquidity.go new file mode 100644 index 00000000..ec7bfde8 --- /dev/null +++ b/internal/usecases/liquidity_provider/check_liquidity.go @@ -0,0 +1,60 @@ +package liquidity_provider + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + log "github.com/sirupsen/logrus" +) + +type CheckLiquidityUseCase struct { + peginProvider entities.PeginLiquidityProvider + pegoutProvider entities.PegoutLiquidityProvider + bridge blockchain.RootstockBridge + alertSender entities.AlertSender + recipient string +} + +func NewCheckLiquidityUseCase(peginProvider entities.PeginLiquidityProvider, pegoutProvider entities.PegoutLiquidityProvider, bridge blockchain.RootstockBridge, alertSender entities.AlertSender) *CheckLiquidityUseCase { + return &CheckLiquidityUseCase{peginProvider: peginProvider, pegoutProvider: pegoutProvider, bridge: bridge, alertSender: alertSender} +} + +func (useCase *CheckLiquidityUseCase) Run(ctx context.Context) error { + minLockTxValueInSatoshi, err := useCase.bridge.GetMinimumLockTxValue() + if err != nil { + return usecases.WrapUseCaseError(usecases.CheckLiquidityId, err) + } + minLockTxValueInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) + + err = useCase.peginProvider.HasPeginLiquidity(ctx, minLockTxValueInWei) + if errors.Is(err, usecases.NoLiquidityError) { + if err = useCase.alertSender.SendAlert( + ctx, + "Pegin: Out of liquidity", + "You are out of liquidity to perform a pegin. Please, do a deposit", + useCase.recipient, + ); err != nil { + log.Error("Error sending notification to liquidity provider: ", err) + } + } else if err != nil { + return usecases.WrapUseCaseError(usecases.CheckLiquidityId, err) + } + + err = useCase.pegoutProvider.HasPegoutLiquidity(ctx, minLockTxValueInWei) + if errors.Is(err, usecases.NoLiquidityError) { + if err = useCase.alertSender.SendAlert( + ctx, + "Pegout: Out of liquidity", + "You are out of liquidity to perform a pegout. Please, do a deposit", + useCase.recipient, + ); err != nil { + log.Error("Error sending notification to liquidity provider: ", err) + } + } else if err != nil { + return usecases.WrapUseCaseError(usecases.CheckLiquidityId, err) + } + + return nil +} diff --git a/internal/usecases/liquidity_provider/common.go b/internal/usecases/liquidity_provider/common.go new file mode 100644 index 00000000..6ae30792 --- /dev/null +++ b/internal/usecases/liquidity_provider/common.go @@ -0,0 +1,33 @@ +package liquidity_provider + +import ( + "cmp" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "slices" +) + +func ValidateConfiguredProvider( + provider entities.LiquidityProvider, + lbc blockchain.LiquidityBridgeContract, +) (uint64, error) { + var err error + var providers []entities.RegisteredLiquidityProvider + + if providers, err = lbc.GetProviders(); err != nil { + return 0, err + } + + index, found := slices.BinarySearchFunc( + providers, + entities.RegisteredLiquidityProvider{Address: provider.RskAddress()}, + func(a, b entities.RegisteredLiquidityProvider) int { + return cmp.Compare(a.Address, b.Address) + }, + ) + if !found { + return 0, usecases.ProviderConfigurationError + } + return providers[index].Id, nil +} diff --git a/internal/usecases/liquidity_provider/get_providers.go b/internal/usecases/liquidity_provider/get_providers.go new file mode 100644 index 00000000..cd5092b9 --- /dev/null +++ b/internal/usecases/liquidity_provider/get_providers.go @@ -0,0 +1,24 @@ +package liquidity_provider + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type GetProvidersUseCase struct { + lbc blockchain.LiquidityBridgeContract +} + +func NewGetProvidersUseCase(lbc blockchain.LiquidityBridgeContract) *GetProvidersUseCase { + return &GetProvidersUseCase{lbc: lbc} +} + +func (useCase *GetProvidersUseCase) Run() ([]entities.RegisteredLiquidityProvider, error) { + var err error + var providers []entities.RegisteredLiquidityProvider + if providers, err = useCase.lbc.GetProviders(); err != nil { + return providers, usecases.WrapUseCaseError(usecases.GetProvidersId, err) + } + return providers, nil +} diff --git a/internal/usecases/liquidity_provider/penalization_alert.go b/internal/usecases/liquidity_provider/penalization_alert.go new file mode 100644 index 00000000..3ac21bf1 --- /dev/null +++ b/internal/usecases/liquidity_provider/penalization_alert.go @@ -0,0 +1,34 @@ +package liquidity_provider + +import ( + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" +) + +type PenalizationAlertUseCase struct { + lbc blockchain.LiquidityBridgeContract + sender entities.AlertSender + recipient string +} + +func NewPenalizationAlertUseCase(lbc blockchain.LiquidityBridgeContract, sender entities.AlertSender, recipient string) *PenalizationAlertUseCase { + return &PenalizationAlertUseCase{lbc: lbc, sender: sender, recipient: recipient} +} + +func (useCase *PenalizationAlertUseCase) Run(ctx context.Context, fromBlock, toBlock uint64) error { + var body string + events, err := useCase.lbc.GetPeginPunishmentEvents(ctx, fromBlock, &toBlock) + if err != nil { + return err + } + for _, event := range events { + body = fmt.Sprintf("You were punished in %v rBTC for the quoteHash %s", event.Penalty.ToRbtc(), event.QuoteHash) + if err = useCase.sender.SendAlert(ctx, "Pegin Punishment", body, useCase.recipient); err != nil { + log.Error("Error sending punishment alert: ", err) + } + } + return nil +} diff --git a/internal/usecases/liquidity_provider/provider_detail.go b/internal/usecases/liquidity_provider/provider_detail.go new file mode 100644 index 00000000..0d4accf4 --- /dev/null +++ b/internal/usecases/liquidity_provider/provider_detail.go @@ -0,0 +1,61 @@ +package liquidity_provider + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type GetDetailUseCase struct { + captchaSiteKey string + peginProvider entities.PeginLiquidityProvider + pegoutProvider entities.PegoutLiquidityProvider +} + +func NewGetDetailUseCase( + captchaSiteKey string, + peginProvider entities.PeginLiquidityProvider, + pegoutProvider entities.PegoutLiquidityProvider, +) *GetDetailUseCase { + return &GetDetailUseCase{ + captchaSiteKey: captchaSiteKey, + peginProvider: peginProvider, + pegoutProvider: pegoutProvider, + } +} + +type FullLiquidityProvider struct { + SiteKey string `json:"siteKey"` + Pegin entities.LiquidityProviderDetail `json:"pegin"` + Pegout entities.LiquidityProviderDetail `json:"pegout"` +} + +func (useCase *GetDetailUseCase) Run() (FullLiquidityProvider, error) { + var err error + + detail := FullLiquidityProvider{ + SiteKey: useCase.captchaSiteKey, + Pegin: entities.LiquidityProviderDetail{ + Fee: useCase.peginProvider.CallFeePegin(), + MinTransactionValue: useCase.peginProvider.MinPegin(), + MaxTransactionValue: useCase.peginProvider.MaxPegin(), + RequiredConfirmations: useCase.peginProvider.MaxPeginConfirmations(), + }, + Pegout: entities.LiquidityProviderDetail{ + Fee: useCase.pegoutProvider.CallFeePegout(), + MinTransactionValue: useCase.pegoutProvider.MinPegout(), + MaxTransactionValue: useCase.pegoutProvider.MaxPegout(), + RequiredConfirmations: useCase.pegoutProvider.MaxPegoutConfirmations(), + }, + } + + if detail.SiteKey == "" { + return FullLiquidityProvider{}, usecases.WrapUseCaseError(usecases.ProviderDetailId, errors.New("missing captcha key")) + } else if err = entities.ValidateStruct(detail.Pegin); err != nil { + return FullLiquidityProvider{}, usecases.WrapUseCaseError(usecases.ProviderDetailId, err) + } else if err = entities.ValidateStruct(detail.Pegout); err != nil { + return FullLiquidityProvider{}, usecases.WrapUseCaseError(usecases.ProviderDetailId, err) + } + + return detail, nil +} diff --git a/internal/usecases/liquidity_provider/registration.go b/internal/usecases/liquidity_provider/registration.go new file mode 100644 index 00000000..2f4344f5 --- /dev/null +++ b/internal/usecases/liquidity_provider/registration.go @@ -0,0 +1,126 @@ +package liquidity_provider + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + log "github.com/sirupsen/logrus" +) + +type RegistrationUseCase struct { + lbc blockchain.LiquidityBridgeContract + provider entities.LiquidityProvider +} + +func NewRegistrationUseCase(lbc blockchain.LiquidityBridgeContract, provider entities.LiquidityProvider) *RegistrationUseCase { + return &RegistrationUseCase{lbc: lbc, provider: provider} +} + +type collateralInfo struct { + peginCollateral *entities.Wei + pegoutCollateral *entities.Wei + minimumCollateral *entities.Wei +} + +type operationalInfo struct { + operationalForPegin bool + operationalForPegout bool +} + +func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationParams) (int64, error) { + var collateral collateralInfo + var operational operationalInfo + collateralToAdd := new(entities.Wei) + var id int64 + var err error + + if err = entities.ValidateStruct(params); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else if !params.Type.IsValid() { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, entities.InvalidProviderTypeError) + } + + if collateral, err = useCase.getCollateralInfo(); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } + if operational, err = useCase.getOperationalInfo(); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } + + if useCase.isProviderRegistered(params.Type, operational) { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, usecases.AlreadyRegisteredError) + } + + if params.Type.AcceptsPegin() && !operational.operationalForPegin && collateral.peginCollateral.Cmp(entities.NewWei(0)) != 0 { + if err = useCase.lbc.AddCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.peginCollateral)); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else { + return 0, nil + } + } + + if params.Type.AcceptsPegout() && !operational.operationalForPegout && collateral.pegoutCollateral.Cmp(entities.NewWei(0)) != 0 { + if err = useCase.lbc.AddPegoutCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.pegoutCollateral)); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else { + return 0, nil + } + } + + log.Debug("Registering new provider...") + if id, err = useCase.registerProvider(params, collateral); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } + return id, nil +} + +func (useCase *RegistrationUseCase) getCollateralInfo() (collateralInfo, error) { + var err error + minimumCollateral := new(entities.Wei) + peginCollateral := new(entities.Wei) + pegoutCollateral := new(entities.Wei) + + if minimumCollateral, err = useCase.lbc.GetMinimumCollateral(); err != nil { + return collateralInfo{}, err + } + if peginCollateral, err = useCase.lbc.GetCollateral(useCase.provider.RskAddress()); err != nil { + return collateralInfo{}, err + } + if pegoutCollateral, err = useCase.lbc.GetPegoutCollateral(useCase.provider.RskAddress()); err != nil { + return collateralInfo{}, err + } + return collateralInfo{ + peginCollateral: peginCollateral, + pegoutCollateral: pegoutCollateral, + minimumCollateral: minimumCollateral, + }, nil +} + +func (useCase *RegistrationUseCase) getOperationalInfo() (operationalInfo, error) { + var operationalForPegin, operationalForPegout bool + var err error + if operationalForPegin, err = useCase.lbc.IsOperationalPegin(useCase.provider.RskAddress()); err != nil { + return operationalInfo{}, err + } + + if operationalForPegout, err = useCase.lbc.IsOperationalPegout(useCase.provider.RskAddress()); err != nil { + return operationalInfo{}, err + } + + return operationalInfo{ + operationalForPegin: operationalForPegin, + operationalForPegout: operationalForPegout, + }, nil +} + +func (useCase *RegistrationUseCase) isProviderRegistered(providerType entities.ProviderType, operational operationalInfo) bool { + return (providerType == entities.FullProvider && operational.operationalForPegin && operational.operationalForPegout) || + (providerType == entities.PeginProvider && operational.operationalForPegin) || + (providerType == entities.PegoutProvider && operational.operationalForPegout) +} + +func (useCase *RegistrationUseCase) registerProvider(params blockchain.ProviderRegistrationParams, collateral collateralInfo) (int64, error) { + value := new(entities.Wei) + txConfig := blockchain.NewTransactionConfig(value.Mul(collateral.minimumCollateral, entities.NewUWei(2)), 0, nil) + return useCase.lbc.RegisterProvider(txConfig, params) +} diff --git a/internal/usecases/liquidity_provider/resign.go b/internal/usecases/liquidity_provider/resign.go new file mode 100644 index 00000000..3ec9010a --- /dev/null +++ b/internal/usecases/liquidity_provider/resign.go @@ -0,0 +1,30 @@ +package liquidity_provider + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type ResignUseCase struct { + lbc blockchain.LiquidityBridgeContract + provider entities.LiquidityProvider +} + +func NewResignUseCase(lbc blockchain.LiquidityBridgeContract, provider entities.LiquidityProvider) *ResignUseCase { + return &ResignUseCase{lbc: lbc, provider: provider} +} + +func (useCase *ResignUseCase) Run() error { + var err error + + _, err = ValidateConfiguredProvider(useCase.provider, useCase.lbc) + if err != nil { + return usecases.WrapUseCaseError(usecases.ProviderResignId, err) + } + + if err = useCase.lbc.ProviderResign(); err != nil { + return usecases.WrapUseCaseError(usecases.ProviderResignId, err) + } + return nil +} diff --git a/internal/usecases/pegin/accept_pegin_quote.go b/internal/usecases/pegin/accept_pegin_quote.go new file mode 100644 index 00000000..117d38d2 --- /dev/null +++ b/internal/usecases/pegin/accept_pegin_quote.go @@ -0,0 +1,171 @@ +package pegin + +import ( + "context" + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "sync" +) + +type AcceptQuoteUseCase struct { + quoteRepository quote.PeginQuoteRepository + bridge blockchain.RootstockBridge + btc blockchain.BitcoinNetwork + rsk blockchain.RootstockRpcServer + lp entities.LiquidityProvider + peginLp entities.PeginLiquidityProvider + eventBus entities.EventBus + peginLiquidityMutex *sync.Mutex +} + +func NewAcceptQuoteUseCase( + quoteRepository quote.PeginQuoteRepository, + bridge blockchain.RootstockBridge, + btc blockchain.BitcoinNetwork, + rsk blockchain.RootstockRpcServer, + lp entities.LiquidityProvider, + peginLp entities.PeginLiquidityProvider, + eventBus entities.EventBus, + peginLiquidityMutex *sync.Mutex, +) *AcceptQuoteUseCase { + return &AcceptQuoteUseCase{ + quoteRepository: quoteRepository, + bridge: bridge, + btc: btc, + rsk: rsk, + lp: lp, + peginLp: peginLp, + eventBus: eventBus, + peginLiquidityMutex: peginLiquidityMutex, + } +} + +func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (quote.AcceptedQuote, error) { + var err error + errorArgs := usecases.NewErrorArgs() + var quoteHashBytes []byte + var peginQuote *quote.PeginQuote + var retainedQuote *quote.RetainedPeginQuote + var derivation blockchain.FlyoverDerivation + var quoteSignature string + + requiredLiquidity := new(entities.Wei) + + if quoteHashBytes, err = hex.DecodeString(quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + + if peginQuote, err = useCase.quoteRepository.GetQuote(ctx, quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } else if peginQuote == nil { + errorArgs["quoteHash"] = quoteHash + return quote.AcceptedQuote{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, usecases.QuoteNotFoundError, errorArgs) + } + + if peginQuote.IsExpired() { + errorArgs["quoteHash"] = quoteHash + return quote.AcceptedQuote{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, usecases.ExpiredQuoteError, errorArgs) + } + + useCase.peginLiquidityMutex.Lock() + defer useCase.peginLiquidityMutex.Unlock() + + if retainedQuote, err = useCase.quoteRepository.GetRetainedQuote(ctx, quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } else if retainedQuote != nil { + return quote.AcceptedQuote{ + Signature: retainedQuote.Signature, + DepositAddress: retainedQuote.DepositAddress, + }, nil + } + + if derivation, err = useCase.calculateDerivationAddress(quoteHashBytes, *peginQuote); err != nil { + return quote.AcceptedQuote{}, err + } + if requiredLiquidity, err = useCase.calculateAndCheckLiquidity(ctx, *peginQuote); err != nil { + return quote.AcceptedQuote{}, err + } + if quoteSignature, err = useCase.lp.SignQuote(quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + + retainedQuote = "e.RetainedPeginQuote{ + QuoteHash: quoteHash, + DepositAddress: derivation.Address, + Signature: quoteSignature, + RequiredLiquidity: requiredLiquidity, + State: quote.PeginStateWaitingForDeposit, + } + + if err = entities.ValidateStruct(retainedQuote); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + if err = useCase.quoteRepository.InsertRetainedQuote(ctx, *retainedQuote); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + + useCase.eventBus.Publish(quote.AcceptedPeginQuoteEvent{ + Event: entities.NewBaseEvent(quote.AcceptedPeginQuoteEventId), + Quote: *peginQuote, + RetainedQuote: *retainedQuote, + }) + + return quote.AcceptedQuote{ + Signature: retainedQuote.Signature, + DepositAddress: retainedQuote.DepositAddress, + }, nil +} + +func (useCase *AcceptQuoteUseCase) calculateDerivationAddress(quoteHashBytes []byte, peginQuote quote.PeginQuote) (blockchain.FlyoverDerivation, error) { + var err error + errorArgs := usecases.NewErrorArgs() + var fedInfo blockchain.FederationInfo + var userBtcAddress, lpBtcAddress, lbcAddress []byte + + if userBtcAddress, err = useCase.btc.DecodeAddress(peginQuote.BtcRefundAddress, true); err != nil { + errorArgs["btcAddress"] = peginQuote.BtcRefundAddress + return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, err, errorArgs) + } else if lpBtcAddress, err = useCase.btc.DecodeAddress(peginQuote.LpBtcAddress, true); err != nil { + errorArgs["btcAddress"] = peginQuote.LpBtcAddress + return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, err, errorArgs) + } else if lbcAddress, err = blockchain.DecodeStringTrimPrefix(peginQuote.LbcAddress); err != nil { + errorArgs["rskAddress"] = peginQuote.LbcAddress + return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, err, errorArgs) + } + + if fedInfo, err = useCase.bridge.FetchFederationInfo(); err != nil { + return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + return useCase.bridge.GetFlyoverDerivationAddress(blockchain.FlyoverDerivationArgs{ + FedInfo: fedInfo, + LbcAdress: lbcAddress, + UserBtcRefundAddress: userBtcAddress, + LpBtcAddress: lpBtcAddress, + QuoteHash: quoteHashBytes, + }) +} + +func (useCase *AcceptQuoteUseCase) calculateAndCheckLiquidity(ctx context.Context, peginQuote quote.PeginQuote) (*entities.Wei, error) { + var err error + gasPrice := new(entities.Wei) + errorArgs := usecases.NewErrorArgs() + + gasLimit := new(entities.Wei).Add( + entities.NewUWei(uint64(peginQuote.GasLimit)), + entities.NewUWei(CallForUserExtraGas), + ) + if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { + return nil, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + gasCost := new(entities.Wei).Mul(gasLimit, gasPrice) + requiredLiquidity := new(entities.Wei).Add(gasCost, peginQuote.Value) + + if err = useCase.peginLp.HasPeginLiquidity(ctx, requiredLiquidity); err != nil { + errorArgs["amount"] = requiredLiquidity.String() + return nil, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, usecases.NoLiquidityError, errorArgs) + } + return requiredLiquidity, nil +} diff --git a/internal/usecases/pegin/add_collateral.go b/internal/usecases/pegin/add_collateral.go new file mode 100644 index 00000000..4645aabc --- /dev/null +++ b/internal/usecases/pegin/add_collateral.go @@ -0,0 +1,38 @@ +package pegin + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type AddCollateralUseCase struct { + lbc blockchain.LiquidityBridgeContract + lp entities.LiquidityProvider +} + +func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp entities.LiquidityProvider) *AddCollateralUseCase { + return &AddCollateralUseCase{lbc: lbc, lp: lp} +} + +func (useCase *AddCollateralUseCase) Run(amount *entities.Wei) (*entities.Wei, error) { + var err error + minCollateral, err := useCase.lbc.GetMinimumCollateral() + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) + } + collateral, err := useCase.lbc.GetCollateral(useCase.lp.RskAddress()) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) + } + result := new(entities.Wei) + result.Add(collateral, amount) + if minCollateral.Cmp(result) > 0 { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, usecases.InsufficientAmountError) + } + err = useCase.lbc.AddCollateral(amount) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) + } + return result, nil +} diff --git a/internal/usecases/pegin/call_for_user.go b/internal/usecases/pegin/call_for_user.go new file mode 100644 index 00000000..494e9f1f --- /dev/null +++ b/internal/usecases/pegin/call_for_user.go @@ -0,0 +1,147 @@ +package pegin + +import ( + "context" + "errors" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "math/big" + "sync" +) + +type CallForUserUseCase struct { + lbc blockchain.LiquidityBridgeContract + quoteRepository quote.PeginQuoteRepository + btc blockchain.BitcoinNetwork + peginProvider entities.LiquidityProvider + eventBus entities.EventBus + rskWalletMutex *sync.Mutex +} + +func NewCallForUserUseCase( + lbc blockchain.LiquidityBridgeContract, + quoteRepository quote.PeginQuoteRepository, + btc blockchain.BitcoinNetwork, + peginProvider entities.LiquidityProvider, + eventBus entities.EventBus, + rskWalletMutex *sync.Mutex, +) *CallForUserUseCase { + return &CallForUserUseCase{ + lbc: lbc, + quoteRepository: quoteRepository, + btc: btc, + peginProvider: peginProvider, + eventBus: eventBus, + rskWalletMutex: rskWalletMutex, + } +} + +func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, retainedQuote quote.RetainedPeginQuote) error { + balance := new(entities.Wei) + valueToSend := new(entities.Wei) + var txInfo blockchain.BitcoinTransactionInformation + var peginQuote *quote.PeginQuote + var quoteState quote.PeginState + var callForUserTx string + var txConfirmations big.Int + var err error + + if retainedQuote.State != quote.PeginStateWaitingForDeposit { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PeginQuote{}, err, true) + } + + if peginQuote, err = useCase.quoteRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PeginQuote{}, err, true) + } else if peginQuote == nil { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PeginQuote{}, usecases.QuoteNotFoundError, false) + } + + if peginQuote.IsExpired() { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.ExpiredQuoteError, false) + } + + if txInfo, err = useCase.btc.GetTransactionInfo(bitcoinTx); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) + } + txConfirmations.SetUint64(txInfo.Confirmations) + if txConfirmations.Cmp(big.NewInt(int64(peginQuote.Confirmations))) < 0 { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.NoEnoughConfirmationsError, true) + } + + sentAmount := txInfo.AmountToAddress(retainedQuote.DepositAddress) + if sentAmount.Cmp(peginQuote.Total()) < 0 { + retainedQuote.UserBtcTxHash = bitcoinTx + return useCase.publishErrorEvent( + ctx, + retainedQuote, + *peginQuote, + fmt.Errorf("insufficient amount %v < %v", sentAmount, peginQuote.Total()), + false, + ) + } + + useCase.rskWalletMutex.Lock() + defer useCase.rskWalletMutex.Unlock() + + if balance, err = useCase.lbc.GetBalance(useCase.peginProvider.RskAddress()); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) + } + + if balance.Cmp(peginQuote.Value) < 0 { // lbc balance is not sufficient, calc delta to transfer + valueToSend.Sub(peginQuote.Value, balance) + } + + config := blockchain.NewTransactionConfig(valueToSend, uint64(peginQuote.GasLimit+CallForUserExtraGas), nil) + if callForUserTx, err = useCase.lbc.CallForUser(config, *peginQuote); err != nil { + quoteState = quote.PeginStateCallForUserFailed + } else { + quoteState = quote.PeginStateCallForUserSucceeded + } + + retainedQuote.CallForUserTxHash = callForUserTx + retainedQuote.UserBtcTxHash = bitcoinTx + retainedQuote.State = quoteState + useCase.eventBus.Publish(quote.CallForUserCompletedEvent{ + Event: entities.NewBaseEvent(quote.CallForUserCompletedEventId), + PeginQuote: *peginQuote, + RetainedQuote: retainedQuote, + Error: err, + }) + + if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { + err = errors.Join(err, updateError) + } + if err != nil { + err = errors.Join(err, usecases.NonRecoverableError) + return usecases.WrapUseCaseErrorArgs(usecases.CallForUserId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + } else { + return nil + } +} + +func (useCase *CallForUserUseCase) publishErrorEvent( + ctx context.Context, + retainedQuote quote.RetainedPeginQuote, + peginQuote quote.PeginQuote, + err error, + recoverable bool, +) error { + wrappedError := usecases.WrapUseCaseErrorArgs(usecases.CallForUserId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + if !recoverable { + retainedQuote.State = quote.PeginStateCallForUserFailed + if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + wrappedError = errors.Join(wrappedError, err, usecases.NonRecoverableError) + } + useCase.eventBus.Publish(quote.CallForUserCompletedEvent{ + Event: entities.NewBaseEvent(quote.CallForUserCompletedEventId), + RetainedQuote: retainedQuote, + PeginQuote: peginQuote, + Error: wrappedError, + }) + + } + return wrappedError +} diff --git a/internal/usecases/pegin/common.go b/internal/usecases/pegin/common.go new file mode 100644 index 00000000..9d87a25b --- /dev/null +++ b/internal/usecases/pegin/common.go @@ -0,0 +1,5 @@ +package pegin + +const ( + CallForUserExtraGas = 180000 +) diff --git a/internal/usecases/pegin/expire_quote.go b/internal/usecases/pegin/expire_quote.go new file mode 100644 index 00000000..3d46a1ae --- /dev/null +++ b/internal/usecases/pegin/expire_quote.go @@ -0,0 +1,24 @@ +package pegin + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type ExpiredPeginQuoteUseCase struct { + peginRepository quote.PeginQuoteRepository +} + +func NewExpiredPeginQuoteUseCase(peginRepository quote.PeginQuoteRepository) *ExpiredPeginQuoteUseCase { + return &ExpiredPeginQuoteUseCase{peginRepository: peginRepository} +} + +func (useCase *ExpiredPeginQuoteUseCase) Run(ctx context.Context, peginQuote quote.RetainedPeginQuote) error { + peginQuote.State = quote.PeginStateTimeForDepositElapsed + err := useCase.peginRepository.UpdateRetainedQuote(ctx, peginQuote) + if err != nil { + return usecases.WrapUseCaseError(usecases.ExpiredPeginQuoteId, err) + } + return nil +} diff --git a/internal/usecases/pegin/get_collateral.go b/internal/usecases/pegin/get_collateral.go new file mode 100644 index 00000000..479982c1 --- /dev/null +++ b/internal/usecases/pegin/get_collateral.go @@ -0,0 +1,26 @@ +package pegin + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type GetCollateralUseCase struct { + lbc blockchain.LiquidityBridgeContract + peginProvider entities.LiquidityProvider +} + +func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, peginProvider entities.LiquidityProvider) *GetCollateralUseCase { + return &GetCollateralUseCase{lbc: lbc, peginProvider: peginProvider} +} + +func (useCase *GetCollateralUseCase) Run() (*entities.Wei, error) { + var err error + collateral := new(entities.Wei) + collateral, err = useCase.lbc.GetCollateral(useCase.peginProvider.RskAddress()) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetCollateralId, err) + } + return collateral, nil +} diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go new file mode 100644 index 00000000..8f75450d --- /dev/null +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -0,0 +1,180 @@ +package pegin + +import ( + "context" + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "math/rand" + "time" +) + +type GetQuoteUseCase struct { + rsk blockchain.RootstockRpcServer + feeCollector blockchain.FeeCollector + bridge blockchain.RootstockBridge + lbc blockchain.LiquidityBridgeContract + peginQuoteRepository quote.PeginQuoteRepository + lp entities.LiquidityProvider + peginLp entities.PeginLiquidityProvider + feeCollectorAddress string +} + +func NewGetQuoteUseCase( + rsk blockchain.RootstockRpcServer, + feeCollector blockchain.FeeCollector, + bridge blockchain.RootstockBridge, + lbc blockchain.LiquidityBridgeContract, + peginQuoteRepository quote.PeginQuoteRepository, + lp entities.LiquidityProvider, + peginLp entities.PeginLiquidityProvider, + feeCollectorAddress string, +) *GetQuoteUseCase { + return &GetQuoteUseCase{ + rsk: rsk, + feeCollector: feeCollector, + bridge: bridge, + lbc: lbc, + peginQuoteRepository: peginQuoteRepository, + lp: lp, + peginLp: peginLp, + feeCollectorAddress: feeCollectorAddress, + } +} + +type QuoteRequest struct { + callEoaOrContractAddress string + callContractArguments []byte + valueToTransfer *entities.Wei + rskRefundAddress string + bitcoinRefundAddress string +} + +func NewQuoteRequest( + callEoaOrContractAddress string, + callContractArguments []byte, + valueToTransfer *entities.Wei, + rskRefundAddress string, + bitcoinRefundAddress string, +) QuoteRequest { + return QuoteRequest{ + callEoaOrContractAddress: callEoaOrContractAddress, + callContractArguments: callContractArguments, + valueToTransfer: valueToTransfer, + rskRefundAddress: rskRefundAddress, + bitcoinRefundAddress: bitcoinRefundAddress, + } +} + +type GetPeginQuoteResult struct { + PeginQuote quote.PeginQuote + Hash string +} + +func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) (GetPeginQuoteResult, error) { + var daoTxAmounts usecases.DaoAmounts + var fedAddress, hash string + var daoFeePercentage uint64 + estimatedCallGas := new(entities.Wei) + gasPrice := new(entities.Wei) + minLockTxValueInSatoshi := new(entities.Wei) + errorArgs := usecases.NewErrorArgs() + var err error + + if errorArgs, err = useCase.validateRequest(request); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, err, errorArgs) + } + + estimatedCallGas, err = useCase.rsk.EstimateGas(ctx, request.callEoaOrContractAddress, request.valueToTransfer, request.callContractArguments) + if err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + if fedAddress, err = useCase.bridge.GetFedAddress(); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + totalGas := new(entities.Wei).Add(estimatedCallGas, daoTxAmounts.DaoGasAmount) + gasFee := new(entities.Wei).Mul(totalGas, gasPrice) + peginQuote := quote.PeginQuote{ + FedBtcAddress: fedAddress, + LbcAddress: useCase.lbc.GetAddress(), + LpRskAddress: useCase.lp.RskAddress(), + BtcRefundAddress: request.bitcoinRefundAddress, + RskRefundAddress: request.rskRefundAddress, + LpBtcAddress: useCase.lp.BtcAddress(), + CallFee: useCase.peginLp.CallFeePegin(), + PenaltyFee: useCase.peginLp.PenaltyFeePegin(), + ContractAddress: request.callEoaOrContractAddress, + Data: hex.EncodeToString(request.callContractArguments), + GasLimit: uint32(totalGas.Uint64()), + Nonce: int64(rand.Int()), + Value: request.valueToTransfer, + AgreementTimestamp: uint32(time.Now().Unix()), + TimeForDeposit: useCase.peginLp.TimeForDepositPegin(), + LpCallTime: useCase.peginLp.CallTime(), + Confirmations: useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer), + CallOnRegister: false, + GasFee: gasFee, + ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), + } + + if err = entities.ValidateStruct(peginQuote); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + if minLockTxValueInSatoshi, err = useCase.bridge.GetMinimumLockTxValue(); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + minimumInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) + if peginQuote.Total().Cmp(minimumInWei) <= 0 { + errorArgs["minimum"] = minimumInWei.String() + errorArgs["value"] = peginQuote.Total().String() + return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, usecases.TxBelowMinimumError, errorArgs) + } + + if hash, err = useCase.lbc.HashPeginQuote(peginQuote); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + if err = useCase.peginQuoteRepository.InsertQuote(ctx, hash, peginQuote); err != nil { + return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + return GetPeginQuoteResult{ + PeginQuote: peginQuote, + Hash: hash, + }, nil +} + +func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { + var err error + args := usecases.NewErrorArgs() + if !blockchain.IsLegacyBtcAddress(request.bitcoinRefundAddress) { + args["btcAddress"] = request.bitcoinRefundAddress + return args, usecases.BtcAddressNotSupportedError + } else if !blockchain.IsRskAddress(request.rskRefundAddress) { + args["rskAddress"] = request.rskRefundAddress + return args, usecases.RskAddressNotSupportedError + } else if !blockchain.IsRskAddress(request.callEoaOrContractAddress) { + args["rskAddress"] = request.callEoaOrContractAddress + return args, usecases.RskAddressNotSupportedError + } else if err = useCase.peginLp.ValidateAmountForPegin(request.valueToTransfer); err != nil { + return args, err + } else { + return nil, nil + } +} diff --git a/internal/usecases/pegin/register_pegin.go b/internal/usecases/pegin/register_pegin.go new file mode 100644 index 00000000..dd234f2d --- /dev/null +++ b/internal/usecases/pegin/register_pegin.go @@ -0,0 +1,139 @@ +package pegin + +import ( + "context" + "encoding/hex" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type RegisterPeginUseCase struct { + lbc blockchain.LiquidityBridgeContract + quoteRepository quote.PeginQuoteRepository + eventBus entities.EventBus + bridge blockchain.RootstockBridge + btc blockchain.BitcoinNetwork +} + +func NewRegisterPeginUseCase( + lbc blockchain.LiquidityBridgeContract, + quoteRepository quote.PeginQuoteRepository, + eventBus entities.EventBus, + bridge blockchain.RootstockBridge, + btc blockchain.BitcoinNetwork, +) *RegisterPeginUseCase { + return &RegisterPeginUseCase{ + lbc: lbc, + quoteRepository: quoteRepository, + eventBus: eventBus, + bridge: bridge, + btc: btc, + } +} + +func (useCase *RegisterPeginUseCase) Run(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { + var err error + var peginQuote *quote.PeginQuote + var txInfo blockchain.BitcoinTransactionInformation + var params blockchain.RegisterPeginParams + var newState quote.PeginState + var registerPeginTxHash string + + if retainedQuote.State != quote.PeginStateCallForUserSucceeded { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.WrongStateError, true) + } + + if peginQuote, err = useCase.quoteRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if peginQuote == nil { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.QuoteNotFoundError, false) + } + + if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.UserBtcTxHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if txInfo.Confirmations < useCase.bridge.GetRequiredTxConfirmations() { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) + } + + if params, err = useCase.buildRegisterPeginParams(*peginQuote, retainedQuote); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } + + if registerPeginTxHash, err = useCase.lbc.RegisterPegin(params); errors.Is(err, blockchain.WaitingForBridgeError) { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if err != nil { + newState = quote.PeginStateRegisterPegInFailed + } else { + newState = quote.PeginStateRegisterPegInSucceeded + } + + retainedQuote.State = newState + retainedQuote.RegisterPeginTxHash = registerPeginTxHash + useCase.eventBus.Publish(quote.RegisterPeginCompletedEvent{ + Event: entities.NewBaseEvent(quote.RegisterPeginCompletedEventId), + RetainedQuote: retainedQuote, + Error: err, + }) + + if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { + err = errors.Join(err, updateError) + } + if err != nil { + err = errors.Join(err, usecases.NonRecoverableError) + return usecases.WrapUseCaseErrorArgs(usecases.RegisterPeginId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + } else { + return nil + } +} + +func (useCase *RegisterPeginUseCase) publishErrorEvent(ctx context.Context, retainedQuote quote.RetainedPeginQuote, err error, recoverable bool) error { + errorArgs := usecases.NewErrorArgs() + errorArgs["quoteHash"] = retainedQuote.QuoteHash + errorArgs["btcTx"] = retainedQuote.UserBtcTxHash + wrappedError := usecases.WrapUseCaseErrorArgs(usecases.RegisterPeginId, err, errorArgs) + if !recoverable { + retainedQuote.State = quote.PeginStateRegisterPegInFailed + if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + wrappedError = errors.Join(wrappedError, err, usecases.NonRecoverableError) + } + useCase.eventBus.Publish(quote.RegisterPeginCompletedEvent{ + Event: entities.NewBaseEvent(quote.RegisterPeginCompletedEventId), + RetainedQuote: retainedQuote, + Error: wrappedError, + }) + } + return wrappedError +} + +func (useCase *RegisterPeginUseCase) buildRegisterPeginParams(peginQuote quote.PeginQuote, retainedQuote quote.RetainedPeginQuote) (blockchain.RegisterPeginParams, error) { + var quoteSignature, rawBtcTx, pmt []byte + var block blockchain.BitcoinBlockInformation + var err error + + if quoteSignature, err = hex.DecodeString(retainedQuote.Signature); err != nil { + return blockchain.RegisterPeginParams{}, err + } + + if rawBtcTx, err = useCase.btc.GetRawTransaction(retainedQuote.UserBtcTxHash); err != nil { + return blockchain.RegisterPeginParams{}, err + } + + if pmt, err = useCase.btc.GetPartialMerkleTree(retainedQuote.UserBtcTxHash); err != nil { + return blockchain.RegisterPeginParams{}, err + } + + if block, err = useCase.btc.GetTransactionBlockInfo(retainedQuote.UserBtcTxHash); err != nil { + return blockchain.RegisterPeginParams{}, err + } + + return blockchain.RegisterPeginParams{ + QuoteSignature: quoteSignature, + BitcoinRawTransaction: rawBtcTx, + PartialMerkleTree: pmt, + BlockHeight: block.Height, + Quote: peginQuote, + }, nil +} diff --git a/internal/usecases/pegin/withdraw_collateral.go b/internal/usecases/pegin/withdraw_collateral.go new file mode 100644 index 00000000..d89a5818 --- /dev/null +++ b/internal/usecases/pegin/withdraw_collateral.go @@ -0,0 +1,26 @@ +package pegin + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "strings" +) + +type WithdrawCollateralUseCase struct { + lbc blockchain.LiquidityBridgeContract +} + +func NewWithdrawCollateralUseCase(lbc blockchain.LiquidityBridgeContract) *WithdrawCollateralUseCase { + return &WithdrawCollateralUseCase{lbc: lbc} +} + +func (useCase *WithdrawCollateralUseCase) Run() error { + var err error + err = useCase.lbc.WithdrawCollateral() + if err != nil && (strings.Contains(err.Error(), "LBC021") || strings.Contains(err.Error(), "LBC022")) { + return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, usecases.ProviderNotResignedError) + } else if err != nil { + return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, err) + } + return nil +} diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go new file mode 100644 index 00000000..37093127 --- /dev/null +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -0,0 +1,118 @@ +package pegout + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "sync" +) + +type AcceptQuoteUseCase struct { + quoteRepository quote.PegoutQuoteRepository + lbc blockchain.LiquidityBridgeContract + lp entities.LiquidityProvider + pegoutLp entities.PegoutLiquidityProvider + eventBus entities.EventBus + pegoutLiquidityMutex *sync.Mutex +} + +func NewAcceptQuoteUseCase( + quoteRepository quote.PegoutQuoteRepository, + lbc blockchain.LiquidityBridgeContract, + lp entities.LiquidityProvider, + pegoutLp entities.PegoutLiquidityProvider, + eventBus entities.EventBus, + pegoutLiquidityMutex *sync.Mutex, +) *AcceptQuoteUseCase { + return &AcceptQuoteUseCase{ + quoteRepository: quoteRepository, + lbc: lbc, + lp: lp, + pegoutLp: pegoutLp, + eventBus: eventBus, + pegoutLiquidityMutex: pegoutLiquidityMutex, + } +} + +func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (quote.AcceptedQuote, error) { + var err error + errorArgs := usecases.NewErrorArgs() + var pegoutQuote *quote.PegoutQuote + var retainedQuote *quote.RetainedPegoutQuote + var quoteSignature string + + requiredLiquidity := new(entities.Wei) + + if pegoutQuote, err = useCase.quoteRepository.GetQuote(ctx, quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } else if pegoutQuote == nil { + errorArgs["quoteHash"] = quoteHash + return quote.AcceptedQuote{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPegoutQuoteId, usecases.QuoteNotFoundError, errorArgs) + } + + if pegoutQuote.IsExpired() { + errorArgs["quoteHash"] = quoteHash + return quote.AcceptedQuote{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPegoutQuoteId, usecases.ExpiredQuoteError, errorArgs) + } + + useCase.pegoutLiquidityMutex.Lock() + defer useCase.pegoutLiquidityMutex.Unlock() + + if retainedQuote, err = useCase.quoteRepository.GetRetainedQuote(ctx, quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } else if retainedQuote != nil { + return quote.AcceptedQuote{ + Signature: retainedQuote.Signature, + DepositAddress: retainedQuote.DepositAddress, + }, nil + } + + if requiredLiquidity, err = useCase.calculateAndCheckLiquidity(ctx, *pegoutQuote); err != nil { + return quote.AcceptedQuote{}, err + } + + if quoteSignature, err = useCase.lp.SignQuote(quoteHash); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } + + retainedQuote = "e.RetainedPegoutQuote{ + QuoteHash: quoteHash, + DepositAddress: useCase.lbc.GetAddress(), + Signature: quoteSignature, + RequiredLiquidity: requiredLiquidity, + State: quote.PegoutStateWaitingForDeposit, + } + + if err = entities.ValidateStruct(retainedQuote); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } + if err = useCase.quoteRepository.InsertRetainedQuote(ctx, *retainedQuote); err != nil { + return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } + + useCase.eventBus.Publish(quote.AcceptedPegoutQuoteEvent{ + Event: entities.NewBaseEvent(quote.AcceptedPegoutQuoteEventId), + Quote: *pegoutQuote, + RetainedQuote: *retainedQuote, + }) + + return quote.AcceptedQuote{ + Signature: retainedQuote.Signature, + DepositAddress: retainedQuote.DepositAddress, + }, nil +} + +func (useCase *AcceptQuoteUseCase) calculateAndCheckLiquidity(ctx context.Context, pegoutQuote quote.PegoutQuote) (*entities.Wei, error) { + var err error + requiredLiquidity := new(entities.Wei) + errorArgs := usecases.NewErrorArgs() + + requiredLiquidity.Add(pegoutQuote.Value, pegoutQuote.GasFee) + if err = useCase.pegoutLp.HasPegoutLiquidity(ctx, requiredLiquidity); err != nil { + errorArgs["amount"] = requiredLiquidity.String() + return nil, usecases.WrapUseCaseErrorArgs(usecases.AcceptPegoutQuoteId, usecases.NoLiquidityError, errorArgs) + } + return requiredLiquidity, nil +} diff --git a/internal/usecases/pegout/add_collateral.go b/internal/usecases/pegout/add_collateral.go new file mode 100644 index 00000000..1c486e39 --- /dev/null +++ b/internal/usecases/pegout/add_collateral.go @@ -0,0 +1,38 @@ +package pegout + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type AddCollateralUseCase struct { + lbc blockchain.LiquidityBridgeContract + lp entities.LiquidityProvider +} + +func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp entities.LiquidityProvider) *AddCollateralUseCase { + return &AddCollateralUseCase{lbc: lbc, lp: lp} +} + +func (useCase *AddCollateralUseCase) Run(amount *entities.Wei) (*entities.Wei, error) { + var err error + minCollateral, err := useCase.lbc.GetMinimumCollateral() + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) + } + collateral, err := useCase.lbc.GetPegoutCollateral(useCase.lp.RskAddress()) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) + } + result := new(entities.Wei) + result.Add(collateral, amount) + if minCollateral.Cmp(result) > 0 { + return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, usecases.InsufficientAmountError) + } + err = useCase.lbc.AddPegoutCollateral(amount) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.AddPegoutCollateralId, err) + } + return result, nil +} diff --git a/internal/usecases/pegout/expire_quote.go b/internal/usecases/pegout/expire_quote.go new file mode 100644 index 00000000..6b17f9c2 --- /dev/null +++ b/internal/usecases/pegout/expire_quote.go @@ -0,0 +1,24 @@ +package pegout + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type ExpiredPegoutQuoteUseCase struct { + pegoutRepository quote.PegoutQuoteRepository +} + +func NewExpiredPegoutQuoteUseCase(pegoutRepository quote.PegoutQuoteRepository) *ExpiredPegoutQuoteUseCase { + return &ExpiredPegoutQuoteUseCase{pegoutRepository: pegoutRepository} +} + +func (useCase *ExpiredPegoutQuoteUseCase) Run(ctx context.Context, pegoutQuote quote.RetainedPegoutQuote) error { + pegoutQuote.State = quote.PegoutStateTimeForDepositElapsed + err := useCase.pegoutRepository.UpdateRetainedQuote(ctx, pegoutQuote) + if err != nil { + return usecases.WrapUseCaseError(usecases.ExpiredPegoutQuoteId, err) + } + return nil +} diff --git a/internal/usecases/pegout/get_collateral.go b/internal/usecases/pegout/get_collateral.go new file mode 100644 index 00000000..76866989 --- /dev/null +++ b/internal/usecases/pegout/get_collateral.go @@ -0,0 +1,26 @@ +package pegout + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type GetCollateralUseCase struct { + lbc blockchain.LiquidityBridgeContract + pegoutProvider entities.LiquidityProvider +} + +func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, pegoutProvider entities.LiquidityProvider) *GetCollateralUseCase { + return &GetCollateralUseCase{lbc: lbc, pegoutProvider: pegoutProvider} +} + +func (useCase *GetCollateralUseCase) Run() (*entities.Wei, error) { + var err error + collateral := new(entities.Wei) + collateral, err = useCase.lbc.GetPegoutCollateral(useCase.pegoutProvider.RskAddress()) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetPegoutCollateralId, err) + } + return collateral, nil +} diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go new file mode 100644 index 00000000..5e8be5ba --- /dev/null +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -0,0 +1,185 @@ +package pegout + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "math/rand" + "strings" + "time" +) + +type GetQuoteUseCase struct { + rsk blockchain.RootstockRpcServer + feeCollector blockchain.FeeCollector + bridge blockchain.RootstockBridge + lbc blockchain.LiquidityBridgeContract + pegoutQuoteRepository quote.PegoutQuoteRepository + lp entities.LiquidityProvider + pegoutLp entities.PegoutLiquidityProvider + btcWallet blockchain.BitcoinWallet + feeCollectorAddress string +} + +func NewGetQuoteUseCase( + rsk blockchain.RootstockRpcServer, + feeCollector blockchain.FeeCollector, + bridge blockchain.RootstockBridge, + lbc blockchain.LiquidityBridgeContract, + pegoutQuoteRepository quote.PegoutQuoteRepository, + lp entities.LiquidityProvider, + pegoutLp entities.PegoutLiquidityProvider, + btcWallet blockchain.BitcoinWallet, + feeCollectorAddress string, +) *GetQuoteUseCase { + return &GetQuoteUseCase{ + rsk: rsk, + feeCollector: feeCollector, + bridge: bridge, + lbc: lbc, + pegoutQuoteRepository: pegoutQuoteRepository, + lp: lp, + pegoutLp: pegoutLp, + btcWallet: btcWallet, + feeCollectorAddress: feeCollectorAddress, + } +} + +type QuoteRequest struct { + to string + valueToTransfer *entities.Wei + rskRefundAddress string + bitcoinRefundAddress string +} + +func NewQuoteRequest( + to string, + valueToTransfer *entities.Wei, + rskRefundAddress string, + bitcoinRefundAddress string, +) QuoteRequest { + return QuoteRequest{ + to: to, + valueToTransfer: valueToTransfer, + rskRefundAddress: rskRefundAddress, + bitcoinRefundAddress: bitcoinRefundAddress, + } +} + +type GetPegoutQuoteResult struct { + PegoutQuote quote.PegoutQuote + Hash string +} + +func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) (GetPegoutQuoteResult, error) { + var daoFeePercentage, blockNumber uint64 + var daoTxAmounts usecases.DaoAmounts + var hash string + + feeInWei := new(entities.Wei) + gasPrice := new(entities.Wei) + gasFeeDao := new(entities.Wei) + minLockTxValueInSatoshi := new(entities.Wei) + errorArgs := usecases.NewErrorArgs() + var err error + + if errorArgs, err = useCase.validateRequest(request); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, err, errorArgs) + } + + if feeInWei, err = useCase.btcWallet.EstimateTxFees(request.to, request.valueToTransfer); err != nil && strings.Contains(err.Error(), "Insufficient Funds") { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, usecases.NoLiquidityError) + } else if err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if blockNumber, err = useCase.rsk.GetHeight(ctx); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + gasFeeDao.Mul(daoTxAmounts.DaoGasAmount, gasPrice) + totalGasFee := new(entities.Wei).Add(feeInWei, gasFeeDao) + now := uint32(time.Now().Unix()) + confirmationsForUserTx := useCase.lp.GetRootstockConfirmationsForValue(request.valueToTransfer) + confirmationsForLpTx := useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer) + pegoutQuote := quote.PegoutQuote{ + LbcAddress: useCase.lbc.GetAddress(), + LpRskAddress: useCase.lp.RskAddress(), + BtcRefundAddress: request.bitcoinRefundAddress, + RskRefundAddress: request.rskRefundAddress, + LpBtcAddress: useCase.lp.BtcAddress(), + CallFee: useCase.pegoutLp.CallFeePegout(), + PenaltyFee: useCase.pegoutLp.PenaltyFeePegout().Uint64(), + Nonce: int64(rand.Int()), + DepositAddress: request.to, + Value: request.valueToTransfer, + AgreementTimestamp: now, + DepositDateLimit: now + useCase.pegoutLp.TimeForDepositPegout(), + DepositConfirmations: confirmationsForUserTx, + TransferConfirmations: confirmationsForLpTx, + TransferTime: useCase.pegoutLp.TimeForDepositPegout(), + ExpireDate: now + useCase.pegoutLp.TimeForDepositPegout(), + ExpireBlock: uint32(blockNumber + useCase.pegoutLp.ExpireBlocksPegout()), + GasFee: totalGasFee, + ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), + } + + if err = entities.ValidateStruct(pegoutQuote); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if minLockTxValueInSatoshi, err = useCase.bridge.GetMinimumLockTxValue(); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + minimumInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) + if pegoutQuote.Total().Cmp(minimumInWei) <= 0 { + errorArgs["minimum"] = minimumInWei.String() + errorArgs["value"] = pegoutQuote.Total().String() + return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, usecases.TxBelowMinimumError, errorArgs) + } + + if hash, err = useCase.lbc.HashPegoutQuote(pegoutQuote); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if err = useCase.pegoutQuoteRepository.InsertQuote(ctx, hash, pegoutQuote); err != nil { + return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + return GetPegoutQuoteResult{ + PegoutQuote: pegoutQuote, + Hash: hash, + }, nil +} + +func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { + var err error + errorArgs := usecases.NewErrorArgs() + if !blockchain.IsLegacyBtcAddress(request.to) { + errorArgs["btcAddress"] = request.to + return errorArgs, usecases.BtcAddressNotSupportedError + } else if !blockchain.IsLegacyBtcAddress(request.bitcoinRefundAddress) { + errorArgs["btcAddress"] = request.bitcoinRefundAddress + return errorArgs, usecases.BtcAddressNotSupportedError + } else if !blockchain.IsRskAddress(request.rskRefundAddress) { + errorArgs["rskAddress"] = request.rskRefundAddress + return errorArgs, usecases.RskAddressNotSupportedError + } else if err = useCase.pegoutLp.ValidateAmountForPegout(request.valueToTransfer); err != nil { + return errorArgs, err + } else { + return nil, nil + } +} diff --git a/internal/usecases/pegout/get_user_deposits.go b/internal/usecases/pegout/get_user_deposits.go new file mode 100644 index 00000000..f60faaac --- /dev/null +++ b/internal/usecases/pegout/get_user_deposits.go @@ -0,0 +1,24 @@ +package pegout + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type GetUserDepositsUseCase struct { + quoteRepository quote.PegoutQuoteRepository +} + +func NewGetUserDepositsUseCase(quoteRepository quote.PegoutQuoteRepository) *GetUserDepositsUseCase { + return &GetUserDepositsUseCase{quoteRepository: quoteRepository} +} + +func (useCase *GetUserDepositsUseCase) Run(ctx context.Context, address string) ([]quote.PegoutDeposit, error) { + var err error + var deposits []quote.PegoutDeposit + if deposits, err = useCase.quoteRepository.ListPegoutDepositsByAddress(ctx, address); err != nil { + return deposits, usecases.WrapUseCaseError(usecases.GetUserQuotesId, err) + } + return deposits, nil +} diff --git a/internal/usecases/pegout/init_deposit_cache.go b/internal/usecases/pegout/init_deposit_cache.go new file mode 100644 index 00000000..f27410c7 --- /dev/null +++ b/internal/usecases/pegout/init_deposit_cache.go @@ -0,0 +1,36 @@ +package pegout + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type InitPegoutDepositCacheUseCase struct { + pegoutRepository quote.PegoutQuoteRepository + lbc blockchain.LiquidityBridgeContract + rskRpc blockchain.RootstockRpcServer +} + +func NewInitPegoutDepositCacheUseCase(pegoutRepository quote.PegoutQuoteRepository, lbc blockchain.LiquidityBridgeContract, rskRpc blockchain.RootstockRpcServer) *InitPegoutDepositCacheUseCase { + return &InitPegoutDepositCacheUseCase{pegoutRepository: pegoutRepository, lbc: lbc, rskRpc: rskRpc} +} + +func (useCase *InitPegoutDepositCacheUseCase) Run(ctx context.Context, cacheStartBlock uint64) error { + var deposits []quote.PegoutDeposit + var err error + var height uint64 + if height, err = useCase.rskRpc.GetHeight(ctx); err != nil { + return usecases.WrapUseCaseError(usecases.InitPegoutDepositCacheId, err) + } + + if deposits, err = useCase.lbc.GetDepositEvents(ctx, cacheStartBlock, &height); err != nil { + return usecases.WrapUseCaseError(usecases.InitPegoutDepositCacheId, err) + } + + if err = useCase.pegoutRepository.UpsertPegoutDeposits(ctx, deposits); err != nil { + return usecases.WrapUseCaseError(usecases.InitPegoutDepositCacheId, err) + } + return nil +} diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go new file mode 100644 index 00000000..2b1112a9 --- /dev/null +++ b/internal/usecases/pegout/refund_pegout.go @@ -0,0 +1,176 @@ +package pegout + +import ( + "context" + "encoding/hex" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + log "github.com/sirupsen/logrus" + "sync" +) + +const ( + refundPegoutGasLimit = 2500000 + // BridgeConversionGasLimit see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ + bridgeConversionGasLimit = 100000 + // BridgeConversionGasPrice see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ + bridgeConversionGasPrice = 60000000 +) + +type RefundPegoutUseCase struct { + quoteRepository quote.PegoutQuoteRepository + lbc blockchain.LiquidityBridgeContract + eventBus entities.EventBus + btc blockchain.BitcoinNetwork + rskWallet blockchain.RootstockWallet + bridge blockchain.RootstockBridge + rskWalletMutex *sync.Mutex +} + +func NewRefundPegoutUseCase( + quoteRepository quote.PegoutQuoteRepository, + lbc blockchain.LiquidityBridgeContract, + eventBus entities.EventBus, + btc blockchain.BitcoinNetwork, + rskWallet blockchain.RootstockWallet, + bridge blockchain.RootstockBridge, + rskWalletMutex *sync.Mutex, +) *RefundPegoutUseCase { + return &RefundPegoutUseCase{ + quoteRepository: quoteRepository, + lbc: lbc, + eventBus: eventBus, + btc: btc, + rskWallet: rskWallet, + bridge: bridge, + rskWalletMutex: rskWalletMutex, + } +} + +func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { + var txInfo blockchain.BitcoinTransactionInformation + var params blockchain.RefundPegoutParams + var pegoutQuote *quote.PegoutQuote + var newState quote.PegoutState + var refundPegoutTxHash string + var err error + + if retainedQuote.State != quote.PegoutStateSendPegoutSucceeded { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.WrongStateError, true) + } + + if pegoutQuote, err = useCase.quoteRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if pegoutQuote == nil { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.QuoteNotFoundError, false) + } + + if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.LpBtcTxHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if txInfo.Confirmations < uint64(pegoutQuote.TransferConfirmations) { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) + } + + if params, err = useCase.buildRefundPegoutParams(retainedQuote); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } + txConfig := blockchain.NewTransactionConfig(nil, refundPegoutGasLimit, nil) + + useCase.rskWalletMutex.Lock() + defer useCase.rskWalletMutex.Unlock() + + if refundPegoutTxHash, err = useCase.lbc.RefundPegout(txConfig, params); errors.Is(err, blockchain.WaitingForBridgeError) { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if err != nil { + newState = quote.PegoutStateRefundPegOutFailed + } else { + newState = quote.PegoutStateRefundPegOutSucceeded + } + + retainedQuote.State = newState + retainedQuote.RefundPegoutTxHash = refundPegoutTxHash + useCase.eventBus.Publish(quote.PegoutQuoteCompletedEvent{ + Event: entities.NewBaseEvent(quote.PegoutQuoteCompletedEventId), + RetainedQuote: retainedQuote, + Error: err, + }) + + if _, sendRbtcError := useCase.sendRbtcToBridge(ctx, *pegoutQuote); err != nil { + err = errors.Join(err, sendRbtcError) + } else if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { + err = errors.Join(err, updateError) + } + + if err != nil { + return usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + } else { + return nil + } +} + +func (useCase *RefundPegoutUseCase) publishErrorEvent(ctx context.Context, retainedQuote quote.RetainedPegoutQuote, err error, recoverable bool) error { + wrappedError := usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + if !recoverable { + if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + wrappedError = errors.Join(wrappedError, err) + } + retainedQuote.State = quote.PegoutStateRefundPegOutFailed + useCase.eventBus.Publish(quote.PegoutQuoteCompletedEvent{ + Event: entities.NewBaseEvent(quote.PegoutQuoteCompletedEventId), + RetainedQuote: retainedQuote, + Error: wrappedError, + }) + } + return wrappedError +} + +func (useCase *RefundPegoutUseCase) buildRefundPegoutParams(retainedQuote quote.RetainedPegoutQuote) (blockchain.RefundPegoutParams, error) { + var merkleBranch blockchain.MerkleBranch + var block blockchain.BitcoinBlockInformation + var err error + var rawTx, quoteHashBytes []byte + var quoteHashFixedBytes [32]byte + + if merkleBranch, err = useCase.btc.BuildMerkleBranch(retainedQuote.LpBtcTxHash); err != nil { + return blockchain.RefundPegoutParams{}, err + } + + if block, err = useCase.btc.GetTransactionBlockInfo(retainedQuote.LpBtcTxHash); err != nil { + return blockchain.RefundPegoutParams{}, err + } + + if rawTx, err = useCase.btc.GetRawTransaction(retainedQuote.LpBtcTxHash); err != nil { + return blockchain.RefundPegoutParams{}, err + } + + if quoteHashBytes, err = hex.DecodeString(retainedQuote.QuoteHash); err != nil { + return blockchain.RefundPegoutParams{}, err + } + copy(quoteHashFixedBytes[:], quoteHashBytes) + + return blockchain.RefundPegoutParams{ + QuoteHash: quoteHashFixedBytes, + BtcRawTx: rawTx, + BtcBlockHeaderHash: block.Hash, + MerkleBranchPath: merkleBranch.Path, + MerkleBranchHashes: merkleBranch.Hashes, + }, nil +} + +func (useCase *RefundPegoutUseCase) sendRbtcToBridge(ctx context.Context, pegoutQuote quote.PegoutQuote) (string, error) { + var err error + var txHash string + value := new(entities.Wei) + + value.Add(pegoutQuote.Value, pegoutQuote.CallFee) + value.Add(value, pegoutQuote.GasFee) + config := blockchain.NewTransactionConfig(value, bridgeConversionGasLimit, entities.NewWei(bridgeConversionGasPrice)) + if txHash, err = useCase.rskWallet.SendRbtc(ctx, config, useCase.bridge.GetAddress()); err != nil { + return "", err + } + log.Debugf("%s: transaction sent to the bridge successfully (%s)\n", usecases.RefundPegoutId, txHash) + return txHash, nil +} diff --git a/internal/usecases/pegout/send_pegout.go b/internal/usecases/pegout/send_pegout.go new file mode 100644 index 00000000..248ca6d0 --- /dev/null +++ b/internal/usecases/pegout/send_pegout.go @@ -0,0 +1,141 @@ +package pegout + +import ( + "context" + "encoding/hex" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "sync" +) + +type SendPegoutUseCase struct { + btcWallet blockchain.BitcoinWallet + btc blockchain.BitcoinNetwork + quoteRepository quote.PegoutQuoteRepository + rsk blockchain.RootstockRpcServer + eventBus entities.EventBus + btcWalletMutex *sync.Mutex +} + +func NewSendPegoutUseCase( + btcWallet blockchain.BitcoinWallet, + btc blockchain.BitcoinNetwork, + quoteRepository quote.PegoutQuoteRepository, + rsk blockchain.RootstockRpcServer, + eventBus entities.EventBus, + btcWalletMutex *sync.Mutex, +) *SendPegoutUseCase { + return &SendPegoutUseCase{ + btcWallet: btcWallet, + btc: btc, + quoteRepository: quoteRepository, + rsk: rsk, + eventBus: eventBus, + btcWalletMutex: btcWalletMutex, + } +} + +func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { + var err error + var pegoutQuote *quote.PegoutQuote + var chainHeight uint64 + var receipt blockchain.TransactionReceipt + var txHash string + var newState quote.PegoutState + + balance := new(entities.Wei) + + if retainedQuote.State != quote.PegoutStateWaitingForDepositConfirmations { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.WrongStateError, true) + } else if retainedQuote.UserRskTxHash == "" { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, errors.New("user rsk tx hash not provided"), true) + } + + if pegoutQuote, err = useCase.quoteRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, err, true) + } else if pegoutQuote == nil { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.QuoteNotFoundError, false) + } + + if pegoutQuote.IsExpired() { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) + } + + if chainHeight, err = useCase.rsk.GetHeight(ctx); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + } + + if receipt, err = useCase.rsk.GetTransactionReceipt(ctx, retainedQuote.UserRskTxHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + } else if chainHeight-receipt.BlockNumber < uint64(pegoutQuote.DepositConfirmations) { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoEnoughConfirmationsError, true) + } else if receipt.Value.Cmp(pegoutQuote.Total()) < 0 { + retainedQuote.UserRskTxHash = receipt.TransactionHash + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.InsufficientAmountError, false) + } + + useCase.btcWalletMutex.Lock() + defer useCase.btcWalletMutex.Unlock() + + if balance, err = useCase.btcWallet.GetBalance(); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + } else if balance.Cmp(pegoutQuote.Value) < 0 { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoLiquidityError, true) + } + + quoteHashBytes, err := hex.DecodeString(retainedQuote.QuoteHash) + if err != nil { + retainedQuote.UserRskTxHash = receipt.TransactionHash + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, false) + } + + if txHash, err = useCase.btcWallet.SendWithOpReturn(pegoutQuote.DepositAddress, pegoutQuote.Value, quoteHashBytes); err != nil { + newState = quote.PegoutStateSendPegoutFailed + } else { + newState = quote.PegoutStateSendPegoutSucceeded + } + + retainedQuote.LpBtcTxHash = txHash + retainedQuote.State = newState + useCase.eventBus.Publish(quote.PegoutBtcSentToUserEvent{ + Event: entities.NewBaseEvent(quote.PegoutBtcSentEventId), + PegoutQuote: *pegoutQuote, + RetainedQuote: retainedQuote, + Error: err, + }) + + if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { + err = errors.Join(err, updateError) + } + if err != nil { + return usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + } else { + return nil + } +} + +func (useCase *SendPegoutUseCase) publishErrorEvent( + ctx context.Context, + retainedQuote quote.RetainedPegoutQuote, + pegoutQuote quote.PegoutQuote, + err error, + recoverable bool, +) error { + wrappedError := usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + if !recoverable { + if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + wrappedError = errors.Join(wrappedError, err) + } + retainedQuote.State = quote.PegoutStateSendPegoutFailed + useCase.eventBus.Publish(quote.PegoutBtcSentToUserEvent{ + Event: entities.NewBaseEvent(quote.PegoutBtcSentEventId), + PegoutQuote: pegoutQuote, + RetainedQuote: retainedQuote, + Error: wrappedError, + }) + } + return wrappedError +} diff --git a/internal/usecases/pegout/withdraw_collateral.go b/internal/usecases/pegout/withdraw_collateral.go new file mode 100644 index 00000000..8b08123e --- /dev/null +++ b/internal/usecases/pegout/withdraw_collateral.go @@ -0,0 +1,26 @@ +package pegout + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "strings" +) + +type WithdrawCollateralUseCase struct { + lbc blockchain.LiquidityBridgeContract +} + +func NewWithdrawCollateralUseCase(lbc blockchain.LiquidityBridgeContract) *WithdrawCollateralUseCase { + return &WithdrawCollateralUseCase{lbc: lbc} +} + +func (useCase *WithdrawCollateralUseCase) Run() error { + var err error + err = useCase.lbc.WithdrawPegoutCollateral() + if err != nil && (strings.Contains(err.Error(), "LBC021") || strings.Contains(err.Error(), "LBC022")) { + return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, usecases.ProviderNotResignedError) + } else if err != nil { + return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, err) + } + return nil +} diff --git a/internal/usecases/watcher/clean_expired.go b/internal/usecases/watcher/clean_expired.go new file mode 100644 index 00000000..ba69cf86 --- /dev/null +++ b/internal/usecases/watcher/clean_expired.go @@ -0,0 +1,48 @@ +package watcher + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" +) + +type CleanExpiredQuotesUseCase struct { + peginRepository quote.PeginQuoteRepository + pegoutRepository quote.PegoutQuoteRepository +} + +func NewCleanExpiredQuotesUseCase(peginRepository quote.PeginQuoteRepository, pegoutRepository quote.PegoutQuoteRepository) *CleanExpiredQuotesUseCase { + return &CleanExpiredQuotesUseCase{peginRepository: peginRepository, pegoutRepository: pegoutRepository} +} + +func (useCase *CleanExpiredQuotesUseCase) Run(ctx context.Context) ([]string, error) { + var peginQuotes []quote.RetainedPeginQuote + var pegoutQuotes []quote.RetainedPegoutQuote + var err error + + peginHashes := make([]string, 0) + pegoutHashes := make([]string, 0) + + if peginQuotes, err = useCase.peginRepository.GetRetainedQuoteByState(ctx, quote.PeginStateTimeForDepositElapsed); err != nil { + return nil, err + } + for _, peginQuote := range peginQuotes { + peginHashes = append(peginHashes, peginQuote.QuoteHash) + } + + if pegoutQuotes, err = useCase.pegoutRepository.GetRetainedQuoteByState(ctx, quote.PegoutStateTimeForDepositElapsed); err != nil { + return nil, err + } + for _, pegoutQuote := range pegoutQuotes { + pegoutHashes = append(peginHashes, pegoutQuote.QuoteHash) + } + + if _, err = useCase.peginRepository.DeleteQuotes(ctx, peginHashes); err != nil { + return nil, err + } + if _, err = useCase.pegoutRepository.DeleteQuotes(ctx, pegoutHashes); err != nil { + return nil, err + } + + peginHashes = append(peginHashes, pegoutHashes...) + return peginHashes, nil +} diff --git a/internal/usecases/watcher/get_watched_pegin_quote.go b/internal/usecases/watcher/get_watched_pegin_quote.go new file mode 100644 index 00000000..3fe3cae7 --- /dev/null +++ b/internal/usecases/watcher/get_watched_pegin_quote.go @@ -0,0 +1,55 @@ +package watcher + +import ( + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type WatchedPeginQuote struct { + PeginQuote quote.PeginQuote + RetainedQuote quote.RetainedPeginQuote +} + +func NewWatchedPeginQuote(peginQuote quote.PeginQuote, retainedQuote quote.RetainedPeginQuote) WatchedPeginQuote { + return WatchedPeginQuote{PeginQuote: peginQuote, RetainedQuote: retainedQuote} +} + +type GetWatchedPeginQuoteUseCase struct { + peginRepository quote.PeginQuoteRepository +} + +func NewGetWatchedPeginQuoteUseCase(peginRepository quote.PeginQuoteRepository) *GetWatchedPeginQuoteUseCase { + return &GetWatchedPeginQuoteUseCase{peginRepository: peginRepository} +} + +func (useCase *GetWatchedPeginQuoteUseCase) Run(ctx context.Context, state quote.PeginState) ([]WatchedPeginQuote, error) { + switch state { + case quote.PeginStateWaitingForDeposit, quote.PeginStateCallForUserSucceeded: + return useCase.getWatchedQuotes(ctx, state) + default: + return nil, fmt.Errorf("GetWatchedPeginQuoteUseCase: illegal state %s", state) + } +} + +func (useCase *GetWatchedPeginQuoteUseCase) getWatchedQuotes(ctx context.Context, state quote.PeginState) ([]WatchedPeginQuote, error) { + var retainedQuotes []quote.RetainedPeginQuote + var watchedQuote []WatchedPeginQuote + var peginQuote *quote.PeginQuote + var err error + if retainedQuotes, err = useCase.peginRepository.GetRetainedQuoteByState(ctx, state); err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetWatchedPeginQuoteId, err) + } + + for _, retainedQuote := range retainedQuotes { + if peginQuote, err = useCase.peginRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetWatchedPeginQuoteId, err) + } + watchedQuote = append(watchedQuote, WatchedPeginQuote{ + PeginQuote: *peginQuote, + RetainedQuote: retainedQuote, + }) + } + return watchedQuote, nil +} diff --git a/internal/usecases/watcher/get_watched_pegout_quote.go b/internal/usecases/watcher/get_watched_pegout_quote.go new file mode 100644 index 00000000..0417816e --- /dev/null +++ b/internal/usecases/watcher/get_watched_pegout_quote.go @@ -0,0 +1,63 @@ +package watcher + +import ( + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type WatchedPegoutQuote struct { + PegoutQuote quote.PegoutQuote + RetainedQuote quote.RetainedPegoutQuote +} + +func NewWatchedPegoutQuote(pegoutQuote quote.PegoutQuote, retainedQuote quote.RetainedPegoutQuote) WatchedPegoutQuote { + return WatchedPegoutQuote{PegoutQuote: pegoutQuote, RetainedQuote: retainedQuote} +} + +type GetWatchedPegoutQuoteUseCase struct { + pegoutRepository quote.PegoutQuoteRepository +} + +func NewGetWatchedPegoutQuoteUseCase(pegoutRepository quote.PegoutQuoteRepository) *GetWatchedPegoutQuoteUseCase { + return &GetWatchedPegoutQuoteUseCase{pegoutRepository: pegoutRepository} +} + +func (useCase *GetWatchedPegoutQuoteUseCase) Run(ctx context.Context, states ...quote.PegoutState) ([]WatchedPegoutQuote, error) { + result := make([]WatchedPegoutQuote, 0) + for _, state := range states { + switch state { + case quote.PegoutStateWaitingForDepositConfirmations, quote.PegoutStateWaitingForDeposit, quote.PegoutStateSendPegoutSucceeded: + if watchedQuotes, err := useCase.getWatchedQuotes(ctx, state); err == nil { + result = append(result, watchedQuotes...) + } else { + return nil, usecases.WrapUseCaseError(usecases.GetWatchedPegoutQuoteId, err) + } + default: + return nil, usecases.WrapUseCaseError(usecases.GetWatchedPegoutQuoteId, fmt.Errorf("illegal state %s", state)) + } + } + return result, nil +} + +func (useCase *GetWatchedPegoutQuoteUseCase) getWatchedQuotes(ctx context.Context, state quote.PegoutState) ([]WatchedPegoutQuote, error) { + var retainedQuotes []quote.RetainedPegoutQuote + var watchedQuote []WatchedPegoutQuote + var pegoutQuote *quote.PegoutQuote + var err error + if retainedQuotes, err = useCase.pegoutRepository.GetRetainedQuoteByState(ctx, state); err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetWatchedPegoutQuoteId, err) + } + + for _, retainedQuote := range retainedQuotes { + if pegoutQuote, err = useCase.pegoutRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetWatchedPegoutQuoteId, err) + } + watchedQuote = append(watchedQuote, WatchedPegoutQuote{ + PegoutQuote: *pegoutQuote, + RetainedQuote: retainedQuote, + }) + } + return watchedQuote, nil +} diff --git a/internal/usecases/watcher/update_pegout_deposit.go b/internal/usecases/watcher/update_pegout_deposit.go new file mode 100644 index 00000000..8f0dcf4c --- /dev/null +++ b/internal/usecases/watcher/update_pegout_deposit.go @@ -0,0 +1,34 @@ +package watcher + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type UpdatePegoutQuoteDepositUseCase struct { + pegoutRepository quote.PegoutQuoteRepository +} + +func NewUpdatePegoutQuoteDepositUseCase(pegoutRepository quote.PegoutQuoteRepository) *UpdatePegoutQuoteDepositUseCase { + return &UpdatePegoutQuoteDepositUseCase{pegoutRepository: pegoutRepository} +} + +func (useCase *UpdatePegoutQuoteDepositUseCase) Run(ctx context.Context, watchedQuote WatchedPegoutQuote, deposit quote.PegoutDeposit) (WatchedPegoutQuote, error) { + var err error + if !deposit.IsValidForQuote(watchedQuote.PegoutQuote) { + return WatchedPegoutQuote{}, usecases.WrapUseCaseError(usecases.UpdatePegoutDepositId, errors.New("deposit not valid for quote")) + } else if watchedQuote.RetainedQuote.State != quote.PegoutStateWaitingForDeposit { + return WatchedPegoutQuote{}, usecases.WrapUseCaseError(usecases.UpdatePegoutDepositId, errors.New("illegal quote state")) + } + watchedQuote.RetainedQuote.State = quote.PegoutStateWaitingForDepositConfirmations + watchedQuote.RetainedQuote.UserRskTxHash = deposit.TxHash + if err = useCase.pegoutRepository.UpdateRetainedQuote(ctx, watchedQuote.RetainedQuote); err != nil { + return WatchedPegoutQuote{}, usecases.WrapUseCaseError(usecases.UpdatePegoutDepositId, err) + } + if err = useCase.pegoutRepository.UpsertPegoutDeposit(ctx, deposit); err != nil { + return WatchedPegoutQuote{}, usecases.WrapUseCaseError(usecases.UpdatePegoutDepositId, err) + } + return watchedQuote, nil +} diff --git a/pkg/common.go b/pkg/common.go new file mode 100644 index 00000000..7c44d52c --- /dev/null +++ b/pkg/common.go @@ -0,0 +1,28 @@ +package pkg + +type AcceptQuoteRequest struct { + QuoteHash string `json:"quoteHash" required:"" validate:"required" example:"0x0" description:"QuoteHash"` +} + +type GetCollateralResponse struct { + Collateral uint64 `json:"collateral" required:""` +} + +type AddCollateralRequest struct { + Amount uint64 `json:"amount" required:"" validate:"required" example:"100000000000" description:"Amount to add to the collateral"` +} + +type AddCollateralResponse struct { + NewCollateralBalance uint64 `json:"newCollateralBalance" example:"100000000000" description:"New Collateral Balance"` +} + +type HealthResponse struct { + Status string `json:"status" example:"ok" description:"Overall LPS Health Status" required:""` + Services Services `json:"services" example:"{\"db\":\"ok\",\"rsk\":\"ok\",\"btc\":\"ok\"}" description:"LPS Services Status" required:""` +} + +type Services struct { + Db string `json:"db"` + Rsk string `json:"rsk"` + Btc string `json:"btc"` +} diff --git a/pkg/liquidity_provider.go b/pkg/liquidity_provider.go new file mode 100644 index 00000000..848cf296 --- /dev/null +++ b/pkg/liquidity_provider.go @@ -0,0 +1,27 @@ +package pkg + +type ProviderDetail struct { + Fee uint64 `json:"fee" required:""` + MinTransactionValue uint64 `json:"minTransactionValue" required:""` + MaxTransactionValue uint64 `json:"maxTransactionValue" required:""` + RequiredConfirmations uint16 `json:"requiredConfirmations" required:""` +} + +type ProviderDetailResponse struct { + SiteKey string `json:"siteKey" required:""` + Pegin ProviderDetail `json:"pegin" required:""` + Pegout ProviderDetail `json:"pegout" required:""` +} + +type LiquidityProvider struct { + Id uint64 `json:"id" example:"1" description:"Provider Id" required:""` + Provider string `json:"provider" example:"0x0" description:"Provider Address" required:""` + Name string `json:"name" example:"New Provider" description:"Provider Name" required:""` + ApiBaseUrl string `json:"apiBaseUrl" example:"https://api.example.com" description:"API base URL" required:""` + Status bool `json:"status" example:"true" description:"Provider status" required:""` + ProviderType string `json:"providerType" example:"pegin" description:"Provider type" required:""` +} + +type ChangeStatusRequest struct { + Status *bool `json:"status"` +} diff --git a/pkg/pegin.go b/pkg/pegin.go new file mode 100644 index 00000000..7302868e --- /dev/null +++ b/pkg/pegin.go @@ -0,0 +1,71 @@ +package pkg + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" +) + +type PeginQuoteRequest struct { + CallEoaOrContractAddress string `json:"callEoaOrContractAddress" required:"" validate:"required,eth_addr" example:"0x0" description:"Contract address or EOA address"` + CallContractArguments string `json:"callContractArguments" required:"" validate:"" example:"0x0" description:"Contract data"` + ValueToTransfer uint64 `json:"valueToTransfer" required:"" validate:"required" example:"0x0" description:"Value to send in the call"` + RskRefundAddress string `json:"rskRefundAddress" required:"" validate:"required,eth_addr" example:"0x0" description:"User RSK refund address"` + BitcoinRefundAddress string `json:"bitcoinRefundAddress" required:"" validate:"required" example:"0x0" description:"User Bitcoin refund address. Note: Must be a legacy address, segwit addresses are not accepted"` +} + +type PeginQuoteDTO struct { + FedBTCAddr string `json:"fedBTCAddr" required:"" description:"The BTC address of the PowPeg"` + LBCAddr string `json:"lbcAddr" required:"" description:"The address of the LBC"` + LPRSKAddr string `json:"lpRSKAddr" required:"" description:"The RSK address of the LP"` + BTCRefundAddr string `json:"btcRefundAddr" required:"" description:"A User BTC refund address"` + RSKRefundAddr string `json:"rskRefundAddr" required:"" description:"A User RSK refund address"` + LPBTCAddr string `json:"lpBTCAddr" required:"" description:"The BTC address of the LP"` + CallFee uint64 `json:"callFee" required:"" description:"The fee charged by the LP"` + PenaltyFee uint64 `json:"penaltyFee" required:"" description:"The penalty fee that the LP pays if it fails to deliver the service"` + ContractAddr string `json:"contractAddr" required:"" description:"The destination address of the peg-in"` + Data string `json:"data" required:"" description:"The arguments to send in the call"` + GasLimit uint32 `json:"gasLimit,omitempty" required:"" description:"The gas limit"` + Nonce int64 `json:"nonce" required:"" description:"A nonce that uniquely identifies this quote"` + Value uint64 `json:"value" required:"" description:"The value to transfer in the call"` + AgreementTimestamp uint32 `json:"agreementTimestamp" required:"" description:"The timestamp of the agreement"` + TimeForDeposit uint32 `json:"timeForDeposit" required:"" description:"The time (in seconds) that the user has to achieve one confirmation on the BTC deposit"` + LpCallTime uint32 `json:"lpCallTime" required:"" description:"The time (in seconds) that the LP has to perform the call on behalf of the user after the deposit achieves the number of confirmations"` + Confirmations uint16 `json:"confirmations" required:"" description:"The number of confirmations that the LP requires before making the call"` + CallOnRegister bool `json:"callOnRegister" required:"" description:"A boolean value indicating whether the callForUser can be called on registerPegIn"` + GasFee uint64 `json:"gasFee" required:"" description:"Fee to pay for the gas of every call done during the pegin (call on behalf of the user and call to the dao fee collector)"` + ProductFeeAmount uint64 `json:"productFeeAmount" required:"" description:"The DAO Fee amount"` +} + +type GetPeginQuoteResponse struct { + Quote PeginQuoteDTO `json:"quote" required:"" description:"Detail of the quote"` + QuoteHash string `json:"quoteHash" required:"" description:"This is a 64 digit number that derives from a quote object"` +} + +type AcceptPeginRespose struct { + Signature string `json:"signature" required:"" example:"0x0" description:"Signature of the quote"` + BitcoinDepositAddressHash string `json:"bitcoinDepositAddressHash" required:"" example:"0x0" description:"Hash of the deposit BTC address"` +} + +func ToPeginQuoteDTO(entity quote.PeginQuote) PeginQuoteDTO { + return PeginQuoteDTO{ + FedBTCAddr: entity.FedBtcAddress, + LBCAddr: entity.LbcAddress, + LPRSKAddr: entity.LpRskAddress, + BTCRefundAddr: entity.BtcRefundAddress, + RSKRefundAddr: entity.RskRefundAddress, + LPBTCAddr: entity.LpBtcAddress, + CallFee: entity.CallFee.Uint64(), + PenaltyFee: entity.PenaltyFee.Uint64(), + ContractAddr: entity.ContractAddress, + Data: entity.Data, + GasLimit: entity.GasLimit, + Nonce: entity.Nonce, + Value: entity.Value.Uint64(), + AgreementTimestamp: entity.AgreementTimestamp, + TimeForDeposit: entity.TimeForDeposit, + LpCallTime: entity.LpCallTime, + Confirmations: entity.Confirmations, + CallOnRegister: entity.CallOnRegister, + GasFee: entity.GasFee.Uint64(), + ProductFeeAmount: entity.ProductFeeAmount, + } +} diff --git a/pkg/pegout.go b/pkg/pegout.go new file mode 100644 index 00000000..ce5383b6 --- /dev/null +++ b/pkg/pegout.go @@ -0,0 +1,79 @@ +package pkg + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "math/big" + "time" +) + +type PegoutQuoteRequest struct { + To string `json:"to" required:"" validate:"required" description:"Bitcoin address that will receive the BTC amount"` + ValueToTransfer uint64 `json:"valueToTransfer" required:"" validate:"required" example:"10000000000000" description:"ValueToTransfer"` + RskRefundAddress string `json:"rskRefundAddress" required:"" validate:"required,eth_addr" example:"0x0" description:"RskRefundAddress"` + BitcoinRefundAddress string `json:"bitcoinRefundAddress" required:"" validate:"required" example:"0x0" description:"BitcoinRefundAddress"` +} + +type PegoutQuoteDTO struct { + LBCAddr string `json:"lbcAddress" required:"" validate:"required"` + LPRSKAddr string `json:"liquidityProviderRskAddress" required:"" validate:"required"` + BtcRefundAddr string `json:"btcRefundAddress" required:"" validate:"required"` + RSKRefundAddr string `json:"rskRefundAddress" required:"" validate:"required"` + LpBTCAddr string `json:"lpBtcAddr" required:"" validate:"required"` + CallFee uint64 `json:"callFee" required:"" validate:"required"` + PenaltyFee uint64 `json:"penaltyFee" required:"" validate:"required"` + Nonce int64 `json:"nonce" required:"" validate:"required"` + DepositAddr string `json:"depositAddr" required:"" validate:"required"` + Value uint64 `json:"value" required:"" validate:"required"` + AgreementTimestamp uint32 `json:"agreementTimestamp" required:"" validate:"required"` + DepositDateLimit uint32 `json:"depositDateLimit" required:"" validate:"required"` + DepositConfirmations uint16 `json:"depositConfirmations" required:"" validate:"required"` + TransferConfirmations uint16 `json:"transferConfirmations" required:"" validate:"required"` + TransferTime uint32 `json:"transferTime" required:"" validate:"required"` + ExpireDate uint32 `json:"expireDate" required:"" validate:"required"` + ExpireBlock uint32 `json:"expireBlocks" required:"" validate:"required"` + GasFee uint64 `json:"gasFee" required:"" description:"Fee to pay for the gas of every call done during the pegout (call on behalf of the user in Bitcoin network and call to the dao fee collector in Rootstock)"` + ProductFeeAmount uint64 `json:"productFeeAmount" required:"" description:"The DAO fee amount"` +} + +func ToPegoutQuoteDTO(entity quote.PegoutQuote) PegoutQuoteDTO { + return PegoutQuoteDTO{ + LBCAddr: entity.LbcAddress, + LPRSKAddr: entity.LpRskAddress, + BtcRefundAddr: entity.BtcRefundAddress, + RSKRefundAddr: entity.RskRefundAddress, + LpBTCAddr: entity.LpBtcAddress, + CallFee: entity.CallFee.Uint64(), + PenaltyFee: entity.PenaltyFee, + Nonce: entity.Nonce, + DepositAddr: entity.DepositAddress, + Value: entity.Value.Uint64(), + AgreementTimestamp: entity.AgreementTimestamp, + DepositDateLimit: entity.DepositDateLimit, + DepositConfirmations: entity.DepositConfirmations, + TransferConfirmations: entity.TransferConfirmations, + TransferTime: entity.TransferTime, + ExpireDate: entity.ExpireDate, + ExpireBlock: entity.ExpireBlock, + GasFee: entity.GasFee.Uint64(), + ProductFeeAmount: entity.ProductFeeAmount, + } +} + +type GetPegoutQuoteResponse struct { + Quote PegoutQuoteDTO `json:"quote" required:"" description:"Detail of the quote"` + QuoteHash string `json:"quoteHash" required:"" description:"This is a 64 digit number that derives from a quote object"` +} + +type AcceptPegoutResponse struct { + Signature string `json:"signature" required:"" example:"0x0" description:"Signature of the quote"` + LbcAddress string `json:"lbcAddress" required:"" example:"0x0" description:"LBC address to execute depositPegout function"` +} + +type DepositEventDTO struct { + TxHash string `json:"-"` + QuoteHash string `json:"quoteHash" example:"0x0" description:"QuoteHash"` + Amount *big.Int `json:"amount" example:"10000" description:"Event Value"` + Timestamp time.Time `json:"timestamp" example:"10000" description:"Event Timestamp"` + BlockNumber uint64 `json:"-"` + From string `json:"from" example:"0x0" description:"From Address"` +} diff --git a/sample-config.env b/sample-config.env index 7f3c8ce0..089d929c 100755 --- a/sample-config.env +++ b/sample-config.env @@ -1,13 +1,14 @@ LOG_FILE=./logs/lps.log +LOG_LEVEL=debug DEBUG=TRUE IRIS_ACTIVATION_HEIGHT=10 ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3, 0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14, 034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f SERVER_PORT=8080 DB_PATH=./db/server.db -RSK_ENDPOINT=ws://localhost:4445/websocket +RSK_ENDPOINT=http://localhost:4444 RSK_BRIDGE_ADDR=0x0000000000000000000000000000000001000006 -RSK_REQUIRED_BRIDGE_CONFIRMATONS=10 +RSK_REQUIRED_BRIDGE_CONFIRMATIONS=10 BTC_ENDPOINT=127.0.0.1:5555 BTC_USERNAME=test @@ -15,25 +16,25 @@ BTC_PASSWORD=test BTC_NETWORK=regtest BTC_TX_FEE_RATE=0.00025 -PEGIN_PROVIDER_BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 -PEGIN_PROVIDER_MAX_CONF=60 -PEGIN_PROVIDER_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGIN_PROVIDER_TIME_FOR_DEPOSIT=3600 -PEGIN_PROVIDER_CALL_TIME=7200 -PEGIN_PROVIDER_PENALTY_FEE=1000000 - -PEGOUT_PROVIDER_BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 -PEGOUT_PROVIDER_MAX_CONF=60 -PEGOUT_PROVIDER_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGOUT_PROVIDER_TIME_FOR_DEPOSIT=3600 -PEGOUT_PROVIDER_CALL_TIME=7200 -PEGOUT_PROVIDER_PENALTY_FEE=1000000 -PEGOUT_PROVIDER_DEPOSIT_DATE_LIMIT=3600 -PEGOUT_PROVIDER_EXPIRE_DATE=3600 -PEGOUT_PROVIDER_EXPIRE_BLOCKS=5000 -PEGOUT_PROVIDER_TRANSFER_CONFIRMATIONS=1 -PEGOUT_PROVIDER_DEPOSIT_CONFIRMATIONS=2 -PEGOUT_PROVIDER_TRANSFER_TIME=3600 +BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 + +PEGIN_MAX_CONF=60 +BTC_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' +PEGIN_TIME_FOR_DEPOSIT=3600 +PEGIN_CALL_TIME=7200 +PEGIN_PENALTY_FEE=1000000 + +PEGOUT_MAX_CONF=60 +RSK_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' +PEGOUT_TIME_FOR_DEPOSIT=3600 +PEGOUT_CALL_TIME=7200 +PEGOUT_PENALTY_FEE=1000000 +PEGOUT_DEPOSIT_DATE_LIMIT=3600 +PEGOUT_EXPIRE_DATE=3600 +PEGOUT_EXPIRE_BLOCKS=5000 +PEGOUT_TRANSFER_CONFIRMATIONS=1 +PEGOUT_DEPOSIT_CONFIRMATIONS=2 +PEGOUT_TRANSFER_TIME=3600 KEY_DIR=geth_keystore ACCOUNT_NUM=0 @@ -60,13 +61,13 @@ AWS_REGION= PROVIDER_NAME="Default Provider" -PEGIN_PROVIDER_FEE=10000000000000000 -PEGIN_PROVIDER_MIN_TRANSACTION_VALUE=600000000000000000 -PEGIN_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 +PEGIN_FEE=10000000000000000 +PEGIN_MIN_TRANSACTION_VALUE=600000000000000000 +PEGIN_MAX_TRANSACTION_VALUE=1000000000000000000 -PEGOUT_PROVIDER_FEE=10000000000000000 -PEGOUT_PROVIDER_MIN_TRANSACTION_VALUE=600000000000000000 -PEGOUT_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 +PEGOUT_FEE=10000000000000000 +PEGOUT_MIN_TRANSACTION_VALUE=600000000000000000 +PEGOUT_MAX_TRANSACTION_VALUE=1000000000000000000 BASE_URL="http://localhost:8080" @@ -76,4 +77,8 @@ CAPTCHA_SITE_KEY= CAPTCHA_THRESHOLD=0.8 DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 DISABLE_CAPTCHA=true -PROVIDER_TYPE=both \ No newline at end of file +PROVIDER_TYPE=both + +ALERT_SENDER_EMAIL=no-reply@mail.flyover.rifcomputing.net +ALERT_RECIPIENT_EMAIL=test@iovlabs.org +ENABLE_MANAGEMENT_API=TRUE \ No newline at end of file From 6fba89e4ed10ddff50ce7d2e057f4f87c559bd31 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 26 Jan 2024 17:16:22 -0300 Subject: [PATCH 002/113] remove legacy files --- account/account.go | 15 - account/local.go | 158 - account/remote.go | 91 - config/config.go | 192 - connectors/bindings/bridge.go | 1831 -------- connectors/bindings/lbc.go | 4638 ------------------- connectors/bitcoin.go | 1148 ----- connectors/bitcoin_test.go | 845 ---- connectors/fedinfo.go | 213 - connectors/rsk.go | 1297 ------ connectors/rsk_test.go | 185 - connectors/testdata/test_block | 1 - connectors/testmocks/addresswatcher_mock.go | 23 - connectors/testmocks/btcclient_mock.go | 98 - connectors/testmocks/rskclient_mock.go | 68 - http/dto.go | 132 - http/response.go | 77 - http/server.go | 2061 -------- http/server_test.go | 972 ---- http/testmocks/btc_mock.go | 114 - http/testmocks/db_mock.go | 144 - http/testmocks/rsk_mock.go | 250 - http/validator.go | 27 - http/watcher.go | 729 --- main.go | 212 - mongo/db.go | 864 ---- pegin/liquidity.go | 196 - pegin/quote.go | 36 - pegout/liquidity_provider.go | 189 - pegout/pegout_quote.go | 54 - pegout/pegout_retained_quote.go | 13 - secrets/aws.go | 69 - secrets/secrets.go | 18 - storage/db.go | 343 -- storage/lprepo.go | 78 - storage/queries.go | 227 - storage/tables.go | 82 - 37 files changed, 17690 deletions(-) delete mode 100644 account/account.go delete mode 100644 account/local.go delete mode 100644 account/remote.go delete mode 100644 config/config.go delete mode 100644 connectors/bindings/bridge.go delete mode 100644 connectors/bindings/lbc.go delete mode 100644 connectors/bitcoin.go delete mode 100644 connectors/bitcoin_test.go delete mode 100644 connectors/fedinfo.go delete mode 100644 connectors/rsk.go delete mode 100644 connectors/rsk_test.go delete mode 100644 connectors/testdata/test_block delete mode 100644 connectors/testmocks/addresswatcher_mock.go delete mode 100644 connectors/testmocks/btcclient_mock.go delete mode 100644 connectors/testmocks/rskclient_mock.go delete mode 100644 http/dto.go delete mode 100644 http/response.go delete mode 100644 http/server.go delete mode 100644 http/server_test.go delete mode 100644 http/testmocks/btc_mock.go delete mode 100644 http/testmocks/db_mock.go delete mode 100644 http/testmocks/rsk_mock.go delete mode 100644 http/validator.go delete mode 100644 http/watcher.go delete mode 100644 main.go delete mode 100644 mongo/db.go delete mode 100644 pegin/liquidity.go delete mode 100644 pegin/quote.go delete mode 100644 pegout/liquidity_provider.go delete mode 100644 pegout/pegout_quote.go delete mode 100644 pegout/pegout_retained_quote.go delete mode 100644 secrets/aws.go delete mode 100644 secrets/secrets.go delete mode 100644 storage/db.go delete mode 100644 storage/lprepo.go delete mode 100644 storage/queries.go delete mode 100644 storage/tables.go diff --git a/account/account.go b/account/account.go deleted file mode 100644 index 2f32b8ae..00000000 --- a/account/account.go +++ /dev/null @@ -1,15 +0,0 @@ -package account - -import ( - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" -) - -type RSKAccount struct { - Account *accounts.Account - Keystore *keystore.KeyStore -} - -type AccountProvider interface { - GetAccount() (*RSKAccount, error) -} diff --git a/account/local.go b/account/local.go deleted file mode 100644 index a8309632..00000000 --- a/account/local.go +++ /dev/null @@ -1,158 +0,0 @@ -package account - -import ( - "bufio" - "errors" - "fmt" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" - log "github.com/sirupsen/logrus" - "golang.org/x/term" - "os" - "strings" - "syscall" -) - -type localAccountProvider struct { - keyDir string - passwordFile string - accountNum int -} - -func NewLocalAccountProvider(keyDir string, passwordFile string, accountNum int) AccountProvider { - return &localAccountProvider{keyDir: keyDir, passwordFile: passwordFile, accountNum: accountNum} -} - -func (provider *localAccountProvider) GetAccount() (*RSKAccount, error) { - if provider.keyDir == "" { - provider.keyDir = "keystore" - } - if err := os.MkdirAll(provider.keyDir, 0700); err != nil { - return nil, err - } - var f *os.File - if provider.passwordFile != "" { - var err error - f, err = os.Open(provider.passwordFile) - if err != nil { - return nil, fmt.Errorf("error opening file: %v", provider.passwordFile) - } - defer func(f *os.File) { - _ = f.Close() - }(f) - } - - ks := keystore.NewKeyStore(provider.keyDir, keystore.StandardScryptN, keystore.StandardScryptP) - if account, err := provider.retrieveOrCreateAccount(ks, provider.accountNum, f); err != nil { - return nil, err - } else { - return &RSKAccount{ - Account: account, - Keystore: ks, - }, nil - } -} - -func (provider *localAccountProvider) retrieveOrCreateAccount(ks *keystore.KeyStore, accountNum int, in *os.File) (*accounts.Account, error) { - if cap(ks.Accounts()) == 0 { - log.Info("no RSK account found") - acc, err := provider.createAccount(ks, in) - return acc, err - } else { - if cap(ks.Accounts()) <= accountNum { - return nil, fmt.Errorf("account number %v not found", accountNum) - } - acc := ks.Accounts()[accountNum] - passwd, err := provider.enterPasswd(in) - - if err != nil { - return nil, err - } - err = ks.Unlock(acc, passwd) - return &acc, err - } -} - -func (provider *localAccountProvider) createAccount(ks *keystore.KeyStore, in *os.File) (*accounts.Account, error) { - passwd, err := provider.createPasswd(in) - - if err != nil { - return nil, err - } - acc, err := ks.NewAccount(passwd) - - if err != nil { - return &acc, err - } - err = ks.Unlock(acc, passwd) - - if err != nil { - return &acc, err - } - log.Info("new account created: ", acc.Address) - return &acc, err -} - -func (provider *localAccountProvider) enterPasswd(in *os.File) (string, error) { - fmt.Println("enter password for RSK account") - fmt.Print("password: ") - var pwd string - var err error - if in == nil { - pwd, err = provider.readPasswdCons(nil) - } else { - pwd, err = provider.readPasswdReader(bufio.NewReader(in)) - } - fmt.Println() - return pwd, err -} - -func (provider *localAccountProvider) createPasswd(in *os.File) (string, error) { - fmt.Println("creating password for new RSK account") - fmt.Println("WARNING: the account will be lost forever if you forget this password!!! Do you understand? (yes/[no])") - - var r *bufio.Reader - var readPasswd func(*bufio.Reader) (string, error) - if in == nil { - r = bufio.NewReader(os.Stdin) - readPasswd = provider.readPasswdCons - } else { - r = bufio.NewReader(in) - readPasswd = provider.readPasswdReader - } - - str, _ := r.ReadString('\n') - if str != "yes\n" { - return "", errors.New("must say yes") - } - fmt.Print("password: ") - pwd1, err := readPasswd(r) - fmt.Println() - if err != nil { - return "", err - } - - fmt.Print("repeat password: ") - pwd2, err := readPasswd(r) - fmt.Println() - if err != nil { - return "", err - } - if pwd1 != pwd2 { - return "", errors.New("passwords do not match") - } - return pwd1, nil -} - -func (provider *localAccountProvider) readPasswdCons(_ *bufio.Reader) (string, error) { - pass, err := term.ReadPassword(syscall.Stdin) - return string(pass), err -} - -func (provider *localAccountProvider) readPasswdReader(r *bufio.Reader) (string, error) { - str, err := r.ReadString('\n') - if err != nil { - return "", err - } - return strings.Trim(str, "\n"), nil -} diff --git a/account/remote.go b/account/remote.go deleted file mode 100644 index af5966b9..00000000 --- a/account/remote.go +++ /dev/null @@ -1,91 +0,0 @@ -package account - -import ( - "fmt" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/rsksmart/liquidity-provider-server/secrets" - log "github.com/sirupsen/logrus" - "os" -) - -type AccountSecretNames struct { - KeySecretName string - PasswordSecretName string -} - -type remoteAccountProvider struct { - keyDir string - accountNum int - keyStorage secrets.SecretStorage[any] - secretNames *AccountSecretNames -} - -func NewRemoteAccountProvider(keyDir string, accountNum int, secretNames *AccountSecretNames, keyStorage secrets.SecretStorage[any]) AccountProvider { - return &remoteAccountProvider{keyDir: keyDir, accountNum: accountNum, secretNames: secretNames, keyStorage: keyStorage} -} - -func (provider *remoteAccountProvider) GetAccount() (*RSKAccount, error) { - if provider.keyDir == "" { - provider.keyDir = "keystore" - } - if err := os.MkdirAll(provider.keyDir, 0700); err != nil { - return nil, err - } - - ks := keystore.NewKeyStore(provider.keyDir, keystore.StandardScryptN, keystore.StandardScryptP) - - account, err := provider.retrieveOrCreateAccount(ks, provider.accountNum) - if err != nil { - return nil, err - } - - return &RSKAccount{ - Account: account, - Keystore: ks, - }, nil -} - -func (provider *remoteAccountProvider) retrieveOrCreateAccount(ks *keystore.KeyStore, accountNum int) (*accounts.Account, error) { - if cap(ks.Accounts()) == 0 { - log.Info("no RSK account found") - acc, err := provider.createAccount(ks) - return acc, err - } else { - if cap(ks.Accounts()) <= accountNum { - return nil, fmt.Errorf("account number %v not found", accountNum) - } - acc := ks.Accounts()[accountNum] - password, err := provider.keyStorage.GetTextSecret(provider.secretNames.PasswordSecretName) - if err != nil { - return nil, err - } - - err = ks.Unlock(acc, password) - return &acc, err - } -} - -func (provider *remoteAccountProvider) createAccount(ks *keystore.KeyStore) (*accounts.Account, error) { - key, err := provider.keyStorage.GetTextSecret(provider.secretNames.KeySecretName) - if err != nil { - return nil, err - } - - password, err := provider.keyStorage.GetTextSecret(provider.secretNames.PasswordSecretName) - if err != nil { - return nil, err - } - - account, err := ks.Import([]byte(key), password, password) - if err != nil { - return nil, err - } - - err = ks.Unlock(account, password) - if err != nil { - return nil, err - } - - return &account, nil -} diff --git a/config/config.go b/config/config.go deleted file mode 100644 index 9c40ceb0..00000000 --- a/config/config.go +++ /dev/null @@ -1,192 +0,0 @@ -package config - -import ( - "encoding/json" - "errors" - "fmt" - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider-server/http" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "os" - "reflect" - "strconv" - "strings" -) - -type Config struct { - LogFile string `env:"LOG_FILE"` - Debug bool `env:"DEBUG"` - IrisActivationHeight int `env:"IRIS_ACTIVATION_HEIGHT"` - ErpKeys []string `env:"ERP_KEYS"` - ProviderName string `env:"PROVIDER_NAME"` - ProviderType string `env:"PROVIDER_TYPE"` - BaseURL string `env:"BASE_URL"` - QuoteCacheStartBlock uint64 `env:"QUOTE_CACHE_START_BLOCK"` - CaptchaSecretKey string `env:"CAPTCHA_SECRET_KEY"` - CaptchaSiteKey string `env:"CAPTCHA_SITE_KEY"` - CaptchaThreshold float32 `env:"CAPTCHA_THRESHOLD"` - BtcWalletPassword string `env:"BTC_WALLET_PASSWORD"` - IsBtcEncryptedWallet bool `env:"BTC_ENCRYPTED_WALLET"` - - Server struct { - Port uint `env:"SERVER_PORT"` - } - DB struct { - Regtest struct { - Host string `env:"DB_REGTEST_HOST"` - Database string `env:"DB_REGTEST_DATABASE"` - User string `env:"DB_REGTEST_USER"` - Password string `env:"DB_REGTEST_PASSWORD"` - Port uint `env:"DB_REGTEST_PORT"` - } - Path string `env:"DB_PATH"` - } - RSK http.LiquidityProviderList - BTC connectors.BtcConfig - ProviderCredentials struct { - Keydir string `env:"KEY_DIR"` - AccountNum int `env:"ACCOUNT_NUM"` - PwdFile string `env:"PWD_FILE"` - KeySecret string `env:"KEY_SECRET"` - PasswordSecret string `env:"PASSWORD_SECRET"` - } - Provider pegin.ProviderConfig `env:",prefix=PEGIN_PROVIDER_"` - PegoutProvier pegout.ProviderConfig `env:",prefix=PEGOUT_PROVIDER_"` -} - -func LoadEnv(arg any) error { - return loadEnvWithPrefix(reflect.ValueOf(arg), "") -} - -func loadEnvWithPrefix(arg reflect.Value, prefix string) error { - if arg.Kind() == reflect.Ptr && arg.IsNil() { - arg.Set(reflect.New(arg.Elem().Type())) - } - - if arg.Kind() == reflect.Ptr { - arg = arg.Elem() - } - - argType := arg.Type() - var env envTag - var fieldType reflect.Kind - - for i := 0; i < arg.NumField(); i++ { - env = parseEnvTag(argType.Field(i).Tag) - fieldType = argType.Field(i).Type.Kind() - if env.value == "" && fieldType != reflect.Struct { - return fmt.Errorf("Field %s doesn't have env tag", argType.Field(i).Name) - } - - if argType.Field(i).Type.Kind() == reflect.Struct { - if env.squash { - env.prefix = prefix - } - if err := loadEnvWithPrefix(arg.Field(i), env.prefix); err != nil { - return err - } - } else if env.value != "" { - if err := setEnvValue(arg.Field(i), os.Getenv(prefix+env.value)); err != nil { - return err - } - } - } - return nil -} - -func setEnvValue(field reflect.Value, envVar string) error { - switch field.Kind() { - case reflect.String: - field.SetString(envVar) - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - if envVar == "" { - field.SetUint(0) - } else if uint64Value, err := strconv.ParseUint(envVar, 10, 64); err != nil { - return err - } else { - field.SetUint(uint64Value) - } - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - if envVar == "" { - field.SetInt(0) - } else if int64Value, err := strconv.ParseInt(envVar, 10, 64); err != nil { - return err - } else { - field.SetInt(int64Value) - } - case reflect.Float32, reflect.Float64: - if envVar == "" { - field.SetFloat(0) - } else if float64Value, err := strconv.ParseFloat(envVar, 64); err != nil { - return err - } else { - field.SetFloat(float64Value) - } - case reflect.Bool: - if boolValue, err := strconv.ParseBool(envVar); err != nil { - return err - } else { - field.SetBool(boolValue) - } - case reflect.Slice: - if field.Type().Elem().Kind() != reflect.String { - return errors.New("unsupported env array") - } - for _, value := range strings.Split(envVar, ",") { - element := reflect.New(field.Type().Elem()).Elem() - element.SetString(value) - field.Set(reflect.Append(field, element)) - } - case reflect.Map: - mapValue := reflect.New(field.Type()) - mapContent := mapValue.Interface() - if err := json.Unmarshal([]byte(envVar), &mapContent); err != nil { - return err - } else { - field.Set(mapValue.Elem()) - } - default: - return jsonUnmarshalEnvValue(field, envVar) - } - return nil -} - -func jsonUnmarshalEnvValue(field reflect.Value, envVar string) error { - var fieldType reflect.Type - if field.Kind() == reflect.Ptr { - fieldType = field.Type().Elem() - } else { - fieldType = field.Type() - } - - if field.Kind() == reflect.Ptr && field.IsNil() { - field.Set(reflect.New(fieldType)) - } - - unmarshaler, ok := field.Interface().(json.Unmarshaler) - if !ok { - return fmt.Errorf("cant unmarshal field %s", field.Type().Name()) - } - return unmarshaler.UnmarshalJSON([]byte(envVar)) -} - -type envTag struct { - value string - prefix string - squash bool -} - -func parseEnvTag(tag reflect.StructTag) envTag { - envTagParts := strings.Split(tag.Get("env"), ",") - var result envTag - result.value = envTagParts[0] - for _, element := range envTagParts { - if element == "squash" { - result.squash = true - } else if strings.Contains(element, "prefix=") { - result.prefix = strings.TrimPrefix(element, "prefix=") - } - } - return result -} diff --git a/connectors/bindings/bridge.go b/connectors/bindings/bridge.go deleted file mode 100644 index 2c17de0c..00000000 --- a/connectors/bindings/bridge.go +++ /dev/null @@ -1,1831 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package bindings - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// RskBridgeMetaData contains all meta data concerning the RskBridge contract. -var RskBridgeMetaData = &bind.MetaData{ - ABI: "[{\"stateMutability\":\"payable\",\"type\":\"receive\"},{\"inputs\":[],\"name\":\"getActiveRedeemScript\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActivePowpegRedeemScript\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBtcBlockchainBestChainHeight\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateForBtcReleaseClient\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateForDebugging\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBtcBlockchainInitialBlockHeight\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"depth\",\"type\":\"int256\"}],\"name\":\"getBtcBlockchainBlockHashAtDepth\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"hash\",\"type\":\"string\"}],\"name\":\"getBtcTxHashProcessedHeight\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"\",\"type\":\"int64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"hash\",\"type\":\"string\"}],\"name\":\"isBtcTxHashAlreadyProcessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"atx\",\"type\":\"bytes\"},{\"internalType\":\"int256\",\"name\":\"height\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"pmt\",\"type\":\"bytes\"}],\"name\":\"registerBtcTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"txhash\",\"type\":\"bytes\"}],\"name\":\"addSignature\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"blocks\",\"type\":\"bytes[]\"}],\"name\":\"receiveHeaders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ablock\",\"type\":\"bytes\"}],\"name\":\"receiveHeader\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationThreshold\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getFederatorPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"},{\"internalType\":\"string\",\"name\":\"atype\",\"type\":\"string\"}],\"name\":\"getFederatorPublicKeyOfType\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationCreationTime\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFederationCreationBlockNumber\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationThreshold\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getRetiringFederatorPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"},{\"internalType\":\"string\",\"name\":\"atype\",\"type\":\"string\"}],\"name\":\"getRetiringFederatorPublicKeyOfType\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationCreationTime\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRetiringFederationCreationBlockNumber\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createFederation\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"addFederatorPublicKey\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"btcKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rskKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"mstKey\",\"type\":\"bytes\"}],\"name\":\"addFederatorPublicKeyMultikey\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"hash\",\"type\":\"bytes\"}],\"name\":\"commitFederation\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollbackFederation\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingFederationHash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingFederationSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getPendingFederatorPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"},{\"internalType\":\"string\",\"name\":\"atype\",\"type\":\"string\"}],\"name\":\"getPendingFederatorPublicKeyOfType\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockWhitelistSize\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"index\",\"type\":\"int256\"}],\"name\":\"getLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"}],\"name\":\"getLockWhitelistEntryByAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"},{\"internalType\":\"int256\",\"name\":\"maxTransferValue\",\"type\":\"int256\"}],\"name\":\"addLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"},{\"internalType\":\"int256\",\"name\":\"maxTransferValue\",\"type\":\"int256\"}],\"name\":\"addOneOffLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"}],\"name\":\"addUnlimitedLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"aaddress\",\"type\":\"string\"}],\"name\":\"removeLockWhitelistAddress\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"disableDelay\",\"type\":\"int256\"}],\"name\":\"setLockWhitelistDisableBlockDelay\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeePerKb\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"feePerKb\",\"type\":\"int256\"}],\"name\":\"voteFeePerKbChange\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateCollections\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinimumLockTxValue\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"merkleBranchPath\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleBranchHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getBtcTransactionConfirmations\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockingCap\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"newLockingCap\",\"type\":\"int256\"}],\"name\":\"increaseLockingCap\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"btcTxSerialized\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"pmtSerialized\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"witnessMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"witnessReservedValue\",\"type\":\"bytes32\"}],\"name\":\"registerBtcCoinbaseTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"hasBtcBlockCoinbaseTransactionInformation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"btcTxSerialized\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"pmtSerialized\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"derivationArgumentsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"userRefundBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"liquidityBridgeContractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"shouldTransferToContract\",\"type\":\"bool\"}],\"name\":\"registerFastBridgeBtcTransaction\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveFederationCreationBlockHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBtcBlockchainBestBlockHeader\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"btcBlockHash\",\"type\":\"bytes32\"}],\"name\":\"getBtcBlockchainBlockHeaderByHash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"btcBlockHeight\",\"type\":\"uint256\"}],\"name\":\"getBtcBlockchainBlockHeaderByHeight\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"btcBlockHash\",\"type\":\"bytes32\"}],\"name\":\"getBtcBlockchainParentBlockHeaderByHash\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", -} - -// RskBridgeABI is the input ABI used to generate the binding from. -// Deprecated: Use RskBridgeMetaData.ABI instead. -var RskBridgeABI = RskBridgeMetaData.ABI - -// RskBridge is an auto generated Go binding around an Ethereum contract. -type RskBridge struct { - RskBridgeCaller // Read-only binding to the contract - RskBridgeTransactor // Write-only binding to the contract - RskBridgeFilterer // Log filterer for contract events -} - -// RskBridgeCaller is an auto generated read-only Go binding around an Ethereum contract. -type RskBridgeCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// RskBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract. -type RskBridgeTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// RskBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type RskBridgeFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// RskBridgeSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type RskBridgeSession struct { - Contract *RskBridge // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// RskBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type RskBridgeCallerSession struct { - Contract *RskBridgeCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// RskBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type RskBridgeTransactorSession struct { - Contract *RskBridgeTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// RskBridgeRaw is an auto generated low-level Go binding around an Ethereum contract. -type RskBridgeRaw struct { - Contract *RskBridge // Generic contract binding to access the raw methods on -} - -// RskBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type RskBridgeCallerRaw struct { - Contract *RskBridgeCaller // Generic read-only contract binding to access the raw methods on -} - -// RskBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type RskBridgeTransactorRaw struct { - Contract *RskBridgeTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewRskBridge creates a new instance of RskBridge, bound to a specific deployed contract. -func NewRskBridge(address common.Address, backend bind.ContractBackend) (*RskBridge, error) { - contract, err := bindRskBridge(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &RskBridge{RskBridgeCaller: RskBridgeCaller{contract: contract}, RskBridgeTransactor: RskBridgeTransactor{contract: contract}, RskBridgeFilterer: RskBridgeFilterer{contract: contract}}, nil -} - -// NewRskBridgeCaller creates a new read-only instance of RskBridge, bound to a specific deployed contract. -func NewRskBridgeCaller(address common.Address, caller bind.ContractCaller) (*RskBridgeCaller, error) { - contract, err := bindRskBridge(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &RskBridgeCaller{contract: contract}, nil -} - -// NewRskBridgeTransactor creates a new write-only instance of RskBridge, bound to a specific deployed contract. -func NewRskBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*RskBridgeTransactor, error) { - contract, err := bindRskBridge(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &RskBridgeTransactor{contract: contract}, nil -} - -// NewRskBridgeFilterer creates a new log filterer instance of RskBridge, bound to a specific deployed contract. -func NewRskBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*RskBridgeFilterer, error) { - contract, err := bindRskBridge(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &RskBridgeFilterer{contract: contract}, nil -} - -// bindRskBridge binds a generic wrapper to an already deployed contract. -func bindRskBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := RskBridgeMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_RskBridge *RskBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _RskBridge.Contract.RskBridgeCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_RskBridge *RskBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RskBridge.Contract.RskBridgeTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_RskBridge *RskBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _RskBridge.Contract.RskBridgeTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_RskBridge *RskBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _RskBridge.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_RskBridge *RskBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RskBridge.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_RskBridge *RskBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _RskBridge.Contract.contract.Transact(opts, method, params...) -} - -// GetActiveFederationCreationBlockHeight is a free data retrieval call binding the contract method 0x177d6e18. -// -// Solidity: function getActiveFederationCreationBlockHeight() view returns(uint256) -func (_RskBridge *RskBridgeCaller) GetActiveFederationCreationBlockHeight(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getActiveFederationCreationBlockHeight") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetActiveFederationCreationBlockHeight is a free data retrieval call binding the contract method 0x177d6e18. -// -// Solidity: function getActiveFederationCreationBlockHeight() view returns(uint256) -func (_RskBridge *RskBridgeSession) GetActiveFederationCreationBlockHeight() (*big.Int, error) { - return _RskBridge.Contract.GetActiveFederationCreationBlockHeight(&_RskBridge.CallOpts) -} - -// GetActiveFederationCreationBlockHeight is a free data retrieval call binding the contract method 0x177d6e18. -// -// Solidity: function getActiveFederationCreationBlockHeight() view returns(uint256) -func (_RskBridge *RskBridgeCallerSession) GetActiveFederationCreationBlockHeight() (*big.Int, error) { - return _RskBridge.Contract.GetActiveFederationCreationBlockHeight(&_RskBridge.CallOpts) -} - -// GetActivePowpegRedeemScript is a free data retrieval call binding the contract method 0x1d73d5dd. -// -// Solidity: function getActivePowpegRedeemScript() view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetActivePowpegRedeemScript(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getActivePowpegRedeemScript") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetActivePowpegRedeemScript is a free data retrieval call binding the contract method 0x1d73d5dd. -// -// Solidity: function getActivePowpegRedeemScript() view returns(bytes) -func (_RskBridge *RskBridgeSession) GetActivePowpegRedeemScript() ([]byte, error) { - return _RskBridge.Contract.GetActivePowpegRedeemScript(&_RskBridge.CallOpts) -} - -// GetActivePowpegRedeemScript is a free data retrieval call binding the contract method 0x1d73d5dd. -// -// Solidity: function getActivePowpegRedeemScript() view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetActivePowpegRedeemScript() ([]byte, error) { - return _RskBridge.Contract.GetActivePowpegRedeemScript(&_RskBridge.CallOpts) -} - -// GetActiveRedeemScript is a free data retrieval call binding the contract method 0x53a455ac. -// -// Solidity: function getActiveRedeemScript() view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetActiveRedeemScript(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getActiveRedeemScript") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetActiveRedeemScript is a free data retrieval call binding the contract method 0x53a455ac. -// -// Solidity: function getActiveRedeemScript() view returns(bytes) -func (_RskBridge *RskBridgeSession) GetActiveRedeemScript() ([]byte, error) { - return _RskBridge.Contract.GetActiveRedeemScript(&_RskBridge.CallOpts) -} - -// GetActiveRedeemScript is a free data retrieval call binding the contract method 0x53a455ac. -// -// Solidity: function getActiveRedeemScript() view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetActiveRedeemScript() ([]byte, error) { - return _RskBridge.Contract.GetActiveRedeemScript(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainBestBlockHeader is a free data retrieval call binding the contract method 0xf0b2424b. -// -// Solidity: function getBtcBlockchainBestBlockHeader() view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBestBlockHeader(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBestBlockHeader") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetBtcBlockchainBestBlockHeader is a free data retrieval call binding the contract method 0xf0b2424b. -// -// Solidity: function getBtcBlockchainBestBlockHeader() view returns(bytes) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainBestBlockHeader() ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBestBlockHeader(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainBestBlockHeader is a free data retrieval call binding the contract method 0xf0b2424b. -// -// Solidity: function getBtcBlockchainBestBlockHeader() view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBestBlockHeader() ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBestBlockHeader(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainBestChainHeight is a free data retrieval call binding the contract method 0x14c89c01. -// -// Solidity: function getBtcBlockchainBestChainHeight() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBestChainHeight(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBestChainHeight") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetBtcBlockchainBestChainHeight is a free data retrieval call binding the contract method 0x14c89c01. -// -// Solidity: function getBtcBlockchainBestChainHeight() view returns(int256) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainBestChainHeight() (*big.Int, error) { - return _RskBridge.Contract.GetBtcBlockchainBestChainHeight(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainBestChainHeight is a free data retrieval call binding the contract method 0x14c89c01. -// -// Solidity: function getBtcBlockchainBestChainHeight() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBestChainHeight() (*big.Int, error) { - return _RskBridge.Contract.GetBtcBlockchainBestChainHeight(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainBlockHashAtDepth is a free data retrieval call binding the contract method 0xefd44418. -// -// Solidity: function getBtcBlockchainBlockHashAtDepth(int256 depth) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBlockHashAtDepth(opts *bind.CallOpts, depth *big.Int) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBlockHashAtDepth", depth) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetBtcBlockchainBlockHashAtDepth is a free data retrieval call binding the contract method 0xefd44418. -// -// Solidity: function getBtcBlockchainBlockHashAtDepth(int256 depth) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainBlockHashAtDepth(depth *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBlockHashAtDepth(&_RskBridge.CallOpts, depth) -} - -// GetBtcBlockchainBlockHashAtDepth is a free data retrieval call binding the contract method 0xefd44418. -// -// Solidity: function getBtcBlockchainBlockHashAtDepth(int256 depth) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBlockHashAtDepth(depth *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBlockHashAtDepth(&_RskBridge.CallOpts, depth) -} - -// GetBtcBlockchainBlockHeaderByHash is a free data retrieval call binding the contract method 0x739e364a. -// -// Solidity: function getBtcBlockchainBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBlockHeaderByHash(opts *bind.CallOpts, btcBlockHash [32]byte) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBlockHeaderByHash", btcBlockHash) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetBtcBlockchainBlockHeaderByHash is a free data retrieval call binding the contract method 0x739e364a. -// -// Solidity: function getBtcBlockchainBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) -} - -// GetBtcBlockchainBlockHeaderByHash is a free data retrieval call binding the contract method 0x739e364a. -// -// Solidity: function getBtcBlockchainBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) -} - -// GetBtcBlockchainBlockHeaderByHeight is a free data retrieval call binding the contract method 0xbd0c1fff. -// -// Solidity: function getBtcBlockchainBlockHeaderByHeight(uint256 btcBlockHeight) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainBlockHeaderByHeight(opts *bind.CallOpts, btcBlockHeight *big.Int) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainBlockHeaderByHeight", btcBlockHeight) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetBtcBlockchainBlockHeaderByHeight is a free data retrieval call binding the contract method 0xbd0c1fff. -// -// Solidity: function getBtcBlockchainBlockHeaderByHeight(uint256 btcBlockHeight) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainBlockHeaderByHeight(btcBlockHeight *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHeight(&_RskBridge.CallOpts, btcBlockHeight) -} - -// GetBtcBlockchainBlockHeaderByHeight is a free data retrieval call binding the contract method 0xbd0c1fff. -// -// Solidity: function getBtcBlockchainBlockHeaderByHeight(uint256 btcBlockHeight) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainBlockHeaderByHeight(btcBlockHeight *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainBlockHeaderByHeight(&_RskBridge.CallOpts, btcBlockHeight) -} - -// GetBtcBlockchainInitialBlockHeight is a free data retrieval call binding the contract method 0x4897193f. -// -// Solidity: function getBtcBlockchainInitialBlockHeight() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainInitialBlockHeight(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainInitialBlockHeight") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetBtcBlockchainInitialBlockHeight is a free data retrieval call binding the contract method 0x4897193f. -// -// Solidity: function getBtcBlockchainInitialBlockHeight() view returns(int256) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainInitialBlockHeight() (*big.Int, error) { - return _RskBridge.Contract.GetBtcBlockchainInitialBlockHeight(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainInitialBlockHeight is a free data retrieval call binding the contract method 0x4897193f. -// -// Solidity: function getBtcBlockchainInitialBlockHeight() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainInitialBlockHeight() (*big.Int, error) { - return _RskBridge.Contract.GetBtcBlockchainInitialBlockHeight(&_RskBridge.CallOpts) -} - -// GetBtcBlockchainParentBlockHeaderByHash is a free data retrieval call binding the contract method 0xe0236724. -// -// Solidity: function getBtcBlockchainParentBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetBtcBlockchainParentBlockHeaderByHash(opts *bind.CallOpts, btcBlockHash [32]byte) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcBlockchainParentBlockHeaderByHash", btcBlockHash) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetBtcBlockchainParentBlockHeaderByHash is a free data retrieval call binding the contract method 0xe0236724. -// -// Solidity: function getBtcBlockchainParentBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetBtcBlockchainParentBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainParentBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) -} - -// GetBtcBlockchainParentBlockHeaderByHash is a free data retrieval call binding the contract method 0xe0236724. -// -// Solidity: function getBtcBlockchainParentBlockHeaderByHash(bytes32 btcBlockHash) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetBtcBlockchainParentBlockHeaderByHash(btcBlockHash [32]byte) ([]byte, error) { - return _RskBridge.Contract.GetBtcBlockchainParentBlockHeaderByHash(&_RskBridge.CallOpts, btcBlockHash) -} - -// GetBtcTransactionConfirmations is a free data retrieval call binding the contract method 0x5b644587. -// -// Solidity: function getBtcTransactionConfirmations(bytes32 txHash, bytes32 blockHash, uint256 merkleBranchPath, bytes32[] merkleBranchHashes) view returns(int256) -func (_RskBridge *RskBridgeCaller) GetBtcTransactionConfirmations(opts *bind.CallOpts, txHash [32]byte, blockHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcTransactionConfirmations", txHash, blockHash, merkleBranchPath, merkleBranchHashes) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetBtcTransactionConfirmations is a free data retrieval call binding the contract method 0x5b644587. -// -// Solidity: function getBtcTransactionConfirmations(bytes32 txHash, bytes32 blockHash, uint256 merkleBranchPath, bytes32[] merkleBranchHashes) view returns(int256) -func (_RskBridge *RskBridgeSession) GetBtcTransactionConfirmations(txHash [32]byte, blockHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) (*big.Int, error) { - return _RskBridge.Contract.GetBtcTransactionConfirmations(&_RskBridge.CallOpts, txHash, blockHash, merkleBranchPath, merkleBranchHashes) -} - -// GetBtcTransactionConfirmations is a free data retrieval call binding the contract method 0x5b644587. -// -// Solidity: function getBtcTransactionConfirmations(bytes32 txHash, bytes32 blockHash, uint256 merkleBranchPath, bytes32[] merkleBranchHashes) view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetBtcTransactionConfirmations(txHash [32]byte, blockHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) (*big.Int, error) { - return _RskBridge.Contract.GetBtcTransactionConfirmations(&_RskBridge.CallOpts, txHash, blockHash, merkleBranchPath, merkleBranchHashes) -} - -// GetBtcTxHashProcessedHeight is a free data retrieval call binding the contract method 0x97fcca7d. -// -// Solidity: function getBtcTxHashProcessedHeight(string hash) view returns(int64) -func (_RskBridge *RskBridgeCaller) GetBtcTxHashProcessedHeight(opts *bind.CallOpts, hash string) (int64, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getBtcTxHashProcessedHeight", hash) - - if err != nil { - return *new(int64), err - } - - out0 := *abi.ConvertType(out[0], new(int64)).(*int64) - - return out0, err - -} - -// GetBtcTxHashProcessedHeight is a free data retrieval call binding the contract method 0x97fcca7d. -// -// Solidity: function getBtcTxHashProcessedHeight(string hash) view returns(int64) -func (_RskBridge *RskBridgeSession) GetBtcTxHashProcessedHeight(hash string) (int64, error) { - return _RskBridge.Contract.GetBtcTxHashProcessedHeight(&_RskBridge.CallOpts, hash) -} - -// GetBtcTxHashProcessedHeight is a free data retrieval call binding the contract method 0x97fcca7d. -// -// Solidity: function getBtcTxHashProcessedHeight(string hash) view returns(int64) -func (_RskBridge *RskBridgeCallerSession) GetBtcTxHashProcessedHeight(hash string) (int64, error) { - return _RskBridge.Contract.GetBtcTxHashProcessedHeight(&_RskBridge.CallOpts, hash) -} - -// GetFederationAddress is a free data retrieval call binding the contract method 0x6923fa85. -// -// Solidity: function getFederationAddress() view returns(string) -func (_RskBridge *RskBridgeCaller) GetFederationAddress(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederationAddress") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -// GetFederationAddress is a free data retrieval call binding the contract method 0x6923fa85. -// -// Solidity: function getFederationAddress() view returns(string) -func (_RskBridge *RskBridgeSession) GetFederationAddress() (string, error) { - return _RskBridge.Contract.GetFederationAddress(&_RskBridge.CallOpts) -} - -// GetFederationAddress is a free data retrieval call binding the contract method 0x6923fa85. -// -// Solidity: function getFederationAddress() view returns(string) -func (_RskBridge *RskBridgeCallerSession) GetFederationAddress() (string, error) { - return _RskBridge.Contract.GetFederationAddress(&_RskBridge.CallOpts) -} - -// GetFederationCreationBlockNumber is a free data retrieval call binding the contract method 0x1b2045ee. -// -// Solidity: function getFederationCreationBlockNumber() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetFederationCreationBlockNumber(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederationCreationBlockNumber") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetFederationCreationBlockNumber is a free data retrieval call binding the contract method 0x1b2045ee. -// -// Solidity: function getFederationCreationBlockNumber() view returns(int256) -func (_RskBridge *RskBridgeSession) GetFederationCreationBlockNumber() (*big.Int, error) { - return _RskBridge.Contract.GetFederationCreationBlockNumber(&_RskBridge.CallOpts) -} - -// GetFederationCreationBlockNumber is a free data retrieval call binding the contract method 0x1b2045ee. -// -// Solidity: function getFederationCreationBlockNumber() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetFederationCreationBlockNumber() (*big.Int, error) { - return _RskBridge.Contract.GetFederationCreationBlockNumber(&_RskBridge.CallOpts) -} - -// GetFederationCreationTime is a free data retrieval call binding the contract method 0x5e2db9d4. -// -// Solidity: function getFederationCreationTime() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetFederationCreationTime(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederationCreationTime") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetFederationCreationTime is a free data retrieval call binding the contract method 0x5e2db9d4. -// -// Solidity: function getFederationCreationTime() view returns(int256) -func (_RskBridge *RskBridgeSession) GetFederationCreationTime() (*big.Int, error) { - return _RskBridge.Contract.GetFederationCreationTime(&_RskBridge.CallOpts) -} - -// GetFederationCreationTime is a free data retrieval call binding the contract method 0x5e2db9d4. -// -// Solidity: function getFederationCreationTime() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetFederationCreationTime() (*big.Int, error) { - return _RskBridge.Contract.GetFederationCreationTime(&_RskBridge.CallOpts) -} - -// GetFederationSize is a free data retrieval call binding the contract method 0x802ad4b6. -// -// Solidity: function getFederationSize() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetFederationSize(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederationSize") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetFederationSize is a free data retrieval call binding the contract method 0x802ad4b6. -// -// Solidity: function getFederationSize() view returns(int256) -func (_RskBridge *RskBridgeSession) GetFederationSize() (*big.Int, error) { - return _RskBridge.Contract.GetFederationSize(&_RskBridge.CallOpts) -} - -// GetFederationSize is a free data retrieval call binding the contract method 0x802ad4b6. -// -// Solidity: function getFederationSize() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetFederationSize() (*big.Int, error) { - return _RskBridge.Contract.GetFederationSize(&_RskBridge.CallOpts) -} - -// GetFederationThreshold is a free data retrieval call binding the contract method 0x0fd47456. -// -// Solidity: function getFederationThreshold() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetFederationThreshold(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederationThreshold") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetFederationThreshold is a free data retrieval call binding the contract method 0x0fd47456. -// -// Solidity: function getFederationThreshold() view returns(int256) -func (_RskBridge *RskBridgeSession) GetFederationThreshold() (*big.Int, error) { - return _RskBridge.Contract.GetFederationThreshold(&_RskBridge.CallOpts) -} - -// GetFederationThreshold is a free data retrieval call binding the contract method 0x0fd47456. -// -// Solidity: function getFederationThreshold() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetFederationThreshold() (*big.Int, error) { - return _RskBridge.Contract.GetFederationThreshold(&_RskBridge.CallOpts) -} - -// GetFederatorPublicKey is a free data retrieval call binding the contract method 0x6b89a1af. -// -// Solidity: function getFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetFederatorPublicKey(opts *bind.CallOpts, index *big.Int) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederatorPublicKey", index) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetFederatorPublicKey is a free data retrieval call binding the contract method 0x6b89a1af. -// -// Solidity: function getFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetFederatorPublicKey(index *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetFederatorPublicKey(&_RskBridge.CallOpts, index) -} - -// GetFederatorPublicKey is a free data retrieval call binding the contract method 0x6b89a1af. -// -// Solidity: function getFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetFederatorPublicKey(index *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetFederatorPublicKey(&_RskBridge.CallOpts, index) -} - -// GetFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x549cfd1c. -// -// Solidity: function getFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFederatorPublicKeyOfType", index, atype) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x549cfd1c. -// -// Solidity: function getFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { - return _RskBridge.Contract.GetFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) -} - -// GetFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x549cfd1c. -// -// Solidity: function getFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { - return _RskBridge.Contract.GetFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) -} - -// GetFeePerKb is a free data retrieval call binding the contract method 0x724ec886. -// -// Solidity: function getFeePerKb() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetFeePerKb(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getFeePerKb") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetFeePerKb is a free data retrieval call binding the contract method 0x724ec886. -// -// Solidity: function getFeePerKb() view returns(int256) -func (_RskBridge *RskBridgeSession) GetFeePerKb() (*big.Int, error) { - return _RskBridge.Contract.GetFeePerKb(&_RskBridge.CallOpts) -} - -// GetFeePerKb is a free data retrieval call binding the contract method 0x724ec886. -// -// Solidity: function getFeePerKb() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetFeePerKb() (*big.Int, error) { - return _RskBridge.Contract.GetFeePerKb(&_RskBridge.CallOpts) -} - -// GetLockWhitelistAddress is a free data retrieval call binding the contract method 0x93988b76. -// -// Solidity: function getLockWhitelistAddress(int256 index) view returns(string) -func (_RskBridge *RskBridgeCaller) GetLockWhitelistAddress(opts *bind.CallOpts, index *big.Int) (string, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getLockWhitelistAddress", index) - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -// GetLockWhitelistAddress is a free data retrieval call binding the contract method 0x93988b76. -// -// Solidity: function getLockWhitelistAddress(int256 index) view returns(string) -func (_RskBridge *RskBridgeSession) GetLockWhitelistAddress(index *big.Int) (string, error) { - return _RskBridge.Contract.GetLockWhitelistAddress(&_RskBridge.CallOpts, index) -} - -// GetLockWhitelistAddress is a free data retrieval call binding the contract method 0x93988b76. -// -// Solidity: function getLockWhitelistAddress(int256 index) view returns(string) -func (_RskBridge *RskBridgeCallerSession) GetLockWhitelistAddress(index *big.Int) (string, error) { - return _RskBridge.Contract.GetLockWhitelistAddress(&_RskBridge.CallOpts, index) -} - -// GetLockWhitelistEntryByAddress is a free data retrieval call binding the contract method 0x251c5f7b. -// -// Solidity: function getLockWhitelistEntryByAddress(string aaddress) view returns(int256) -func (_RskBridge *RskBridgeCaller) GetLockWhitelistEntryByAddress(opts *bind.CallOpts, aaddress string) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getLockWhitelistEntryByAddress", aaddress) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetLockWhitelistEntryByAddress is a free data retrieval call binding the contract method 0x251c5f7b. -// -// Solidity: function getLockWhitelistEntryByAddress(string aaddress) view returns(int256) -func (_RskBridge *RskBridgeSession) GetLockWhitelistEntryByAddress(aaddress string) (*big.Int, error) { - return _RskBridge.Contract.GetLockWhitelistEntryByAddress(&_RskBridge.CallOpts, aaddress) -} - -// GetLockWhitelistEntryByAddress is a free data retrieval call binding the contract method 0x251c5f7b. -// -// Solidity: function getLockWhitelistEntryByAddress(string aaddress) view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetLockWhitelistEntryByAddress(aaddress string) (*big.Int, error) { - return _RskBridge.Contract.GetLockWhitelistEntryByAddress(&_RskBridge.CallOpts, aaddress) -} - -// GetLockWhitelistSize is a free data retrieval call binding the contract method 0xe9e658dc. -// -// Solidity: function getLockWhitelistSize() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetLockWhitelistSize(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getLockWhitelistSize") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetLockWhitelistSize is a free data retrieval call binding the contract method 0xe9e658dc. -// -// Solidity: function getLockWhitelistSize() view returns(int256) -func (_RskBridge *RskBridgeSession) GetLockWhitelistSize() (*big.Int, error) { - return _RskBridge.Contract.GetLockWhitelistSize(&_RskBridge.CallOpts) -} - -// GetLockWhitelistSize is a free data retrieval call binding the contract method 0xe9e658dc. -// -// Solidity: function getLockWhitelistSize() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetLockWhitelistSize() (*big.Int, error) { - return _RskBridge.Contract.GetLockWhitelistSize(&_RskBridge.CallOpts) -} - -// GetLockingCap is a free data retrieval call binding the contract method 0x3f9db977. -// -// Solidity: function getLockingCap() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetLockingCap(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getLockingCap") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetLockingCap is a free data retrieval call binding the contract method 0x3f9db977. -// -// Solidity: function getLockingCap() view returns(int256) -func (_RskBridge *RskBridgeSession) GetLockingCap() (*big.Int, error) { - return _RskBridge.Contract.GetLockingCap(&_RskBridge.CallOpts) -} - -// GetLockingCap is a free data retrieval call binding the contract method 0x3f9db977. -// -// Solidity: function getLockingCap() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetLockingCap() (*big.Int, error) { - return _RskBridge.Contract.GetLockingCap(&_RskBridge.CallOpts) -} - -// GetMinimumLockTxValue is a free data retrieval call binding the contract method 0x2f8d158f. -// -// Solidity: function getMinimumLockTxValue() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetMinimumLockTxValue(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getMinimumLockTxValue") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetMinimumLockTxValue is a free data retrieval call binding the contract method 0x2f8d158f. -// -// Solidity: function getMinimumLockTxValue() view returns(int256) -func (_RskBridge *RskBridgeSession) GetMinimumLockTxValue() (*big.Int, error) { - return _RskBridge.Contract.GetMinimumLockTxValue(&_RskBridge.CallOpts) -} - -// GetMinimumLockTxValue is a free data retrieval call binding the contract method 0x2f8d158f. -// -// Solidity: function getMinimumLockTxValue() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetMinimumLockTxValue() (*big.Int, error) { - return _RskBridge.Contract.GetMinimumLockTxValue(&_RskBridge.CallOpts) -} - -// GetPendingFederationHash is a free data retrieval call binding the contract method 0x6ce0ed5a. -// -// Solidity: function getPendingFederationHash() view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetPendingFederationHash(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getPendingFederationHash") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetPendingFederationHash is a free data retrieval call binding the contract method 0x6ce0ed5a. -// -// Solidity: function getPendingFederationHash() view returns(bytes) -func (_RskBridge *RskBridgeSession) GetPendingFederationHash() ([]byte, error) { - return _RskBridge.Contract.GetPendingFederationHash(&_RskBridge.CallOpts) -} - -// GetPendingFederationHash is a free data retrieval call binding the contract method 0x6ce0ed5a. -// -// Solidity: function getPendingFederationHash() view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetPendingFederationHash() ([]byte, error) { - return _RskBridge.Contract.GetPendingFederationHash(&_RskBridge.CallOpts) -} - -// GetPendingFederationSize is a free data retrieval call binding the contract method 0x3ac72b38. -// -// Solidity: function getPendingFederationSize() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetPendingFederationSize(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getPendingFederationSize") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetPendingFederationSize is a free data retrieval call binding the contract method 0x3ac72b38. -// -// Solidity: function getPendingFederationSize() view returns(int256) -func (_RskBridge *RskBridgeSession) GetPendingFederationSize() (*big.Int, error) { - return _RskBridge.Contract.GetPendingFederationSize(&_RskBridge.CallOpts) -} - -// GetPendingFederationSize is a free data retrieval call binding the contract method 0x3ac72b38. -// -// Solidity: function getPendingFederationSize() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetPendingFederationSize() (*big.Int, error) { - return _RskBridge.Contract.GetPendingFederationSize(&_RskBridge.CallOpts) -} - -// GetPendingFederatorPublicKey is a free data retrieval call binding the contract method 0x492f7c44. -// -// Solidity: function getPendingFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetPendingFederatorPublicKey(opts *bind.CallOpts, index *big.Int) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getPendingFederatorPublicKey", index) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetPendingFederatorPublicKey is a free data retrieval call binding the contract method 0x492f7c44. -// -// Solidity: function getPendingFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetPendingFederatorPublicKey(index *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetPendingFederatorPublicKey(&_RskBridge.CallOpts, index) -} - -// GetPendingFederatorPublicKey is a free data retrieval call binding the contract method 0x492f7c44. -// -// Solidity: function getPendingFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetPendingFederatorPublicKey(index *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetPendingFederatorPublicKey(&_RskBridge.CallOpts, index) -} - -// GetPendingFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0xc61295d9. -// -// Solidity: function getPendingFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetPendingFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getPendingFederatorPublicKeyOfType", index, atype) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetPendingFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0xc61295d9. -// -// Solidity: function getPendingFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetPendingFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { - return _RskBridge.Contract.GetPendingFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) -} - -// GetPendingFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0xc61295d9. -// -// Solidity: function getPendingFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetPendingFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { - return _RskBridge.Contract.GetPendingFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) -} - -// GetRetiringFederationAddress is a free data retrieval call binding the contract method 0x47227286. -// -// Solidity: function getRetiringFederationAddress() view returns(string) -func (_RskBridge *RskBridgeCaller) GetRetiringFederationAddress(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationAddress") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -// GetRetiringFederationAddress is a free data retrieval call binding the contract method 0x47227286. -// -// Solidity: function getRetiringFederationAddress() view returns(string) -func (_RskBridge *RskBridgeSession) GetRetiringFederationAddress() (string, error) { - return _RskBridge.Contract.GetRetiringFederationAddress(&_RskBridge.CallOpts) -} - -// GetRetiringFederationAddress is a free data retrieval call binding the contract method 0x47227286. -// -// Solidity: function getRetiringFederationAddress() view returns(string) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationAddress() (string, error) { - return _RskBridge.Contract.GetRetiringFederationAddress(&_RskBridge.CallOpts) -} - -// GetRetiringFederationCreationBlockNumber is a free data retrieval call binding the contract method 0xd905153f. -// -// Solidity: function getRetiringFederationCreationBlockNumber() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetRetiringFederationCreationBlockNumber(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationCreationBlockNumber") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetRetiringFederationCreationBlockNumber is a free data retrieval call binding the contract method 0xd905153f. -// -// Solidity: function getRetiringFederationCreationBlockNumber() view returns(int256) -func (_RskBridge *RskBridgeSession) GetRetiringFederationCreationBlockNumber() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationCreationBlockNumber(&_RskBridge.CallOpts) -} - -// GetRetiringFederationCreationBlockNumber is a free data retrieval call binding the contract method 0xd905153f. -// -// Solidity: function getRetiringFederationCreationBlockNumber() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationCreationBlockNumber() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationCreationBlockNumber(&_RskBridge.CallOpts) -} - -// GetRetiringFederationCreationTime is a free data retrieval call binding the contract method 0x3f0ce9b1. -// -// Solidity: function getRetiringFederationCreationTime() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetRetiringFederationCreationTime(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationCreationTime") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetRetiringFederationCreationTime is a free data retrieval call binding the contract method 0x3f0ce9b1. -// -// Solidity: function getRetiringFederationCreationTime() view returns(int256) -func (_RskBridge *RskBridgeSession) GetRetiringFederationCreationTime() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationCreationTime(&_RskBridge.CallOpts) -} - -// GetRetiringFederationCreationTime is a free data retrieval call binding the contract method 0x3f0ce9b1. -// -// Solidity: function getRetiringFederationCreationTime() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationCreationTime() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationCreationTime(&_RskBridge.CallOpts) -} - -// GetRetiringFederationSize is a free data retrieval call binding the contract method 0xd970b0fd. -// -// Solidity: function getRetiringFederationSize() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetRetiringFederationSize(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationSize") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetRetiringFederationSize is a free data retrieval call binding the contract method 0xd970b0fd. -// -// Solidity: function getRetiringFederationSize() view returns(int256) -func (_RskBridge *RskBridgeSession) GetRetiringFederationSize() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationSize(&_RskBridge.CallOpts) -} - -// GetRetiringFederationSize is a free data retrieval call binding the contract method 0xd970b0fd. -// -// Solidity: function getRetiringFederationSize() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationSize() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationSize(&_RskBridge.CallOpts) -} - -// GetRetiringFederationThreshold is a free data retrieval call binding the contract method 0x07bbdfc4. -// -// Solidity: function getRetiringFederationThreshold() view returns(int256) -func (_RskBridge *RskBridgeCaller) GetRetiringFederationThreshold(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederationThreshold") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetRetiringFederationThreshold is a free data retrieval call binding the contract method 0x07bbdfc4. -// -// Solidity: function getRetiringFederationThreshold() view returns(int256) -func (_RskBridge *RskBridgeSession) GetRetiringFederationThreshold() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationThreshold(&_RskBridge.CallOpts) -} - -// GetRetiringFederationThreshold is a free data retrieval call binding the contract method 0x07bbdfc4. -// -// Solidity: function getRetiringFederationThreshold() view returns(int256) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederationThreshold() (*big.Int, error) { - return _RskBridge.Contract.GetRetiringFederationThreshold(&_RskBridge.CallOpts) -} - -// GetRetiringFederatorPublicKey is a free data retrieval call binding the contract method 0x4675d6de. -// -// Solidity: function getRetiringFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetRetiringFederatorPublicKey(opts *bind.CallOpts, index *big.Int) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederatorPublicKey", index) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetRetiringFederatorPublicKey is a free data retrieval call binding the contract method 0x4675d6de. -// -// Solidity: function getRetiringFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetRetiringFederatorPublicKey(index *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetRetiringFederatorPublicKey(&_RskBridge.CallOpts, index) -} - -// GetRetiringFederatorPublicKey is a free data retrieval call binding the contract method 0x4675d6de. -// -// Solidity: function getRetiringFederatorPublicKey(int256 index) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederatorPublicKey(index *big.Int) ([]byte, error) { - return _RskBridge.Contract.GetRetiringFederatorPublicKey(&_RskBridge.CallOpts, index) -} - -// GetRetiringFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x68bc2b2b. -// -// Solidity: function getRetiringFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetRetiringFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getRetiringFederatorPublicKeyOfType", index, atype) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetRetiringFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x68bc2b2b. -// -// Solidity: function getRetiringFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeSession) GetRetiringFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { - return _RskBridge.Contract.GetRetiringFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) -} - -// GetRetiringFederatorPublicKeyOfType is a free data retrieval call binding the contract method 0x68bc2b2b. -// -// Solidity: function getRetiringFederatorPublicKeyOfType(int256 index, string atype) view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetRetiringFederatorPublicKeyOfType(index *big.Int, atype string) ([]byte, error) { - return _RskBridge.Contract.GetRetiringFederatorPublicKeyOfType(&_RskBridge.CallOpts, index, atype) -} - -// GetStateForBtcReleaseClient is a free data retrieval call binding the contract method 0xc4fbca20. -// -// Solidity: function getStateForBtcReleaseClient() view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetStateForBtcReleaseClient(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getStateForBtcReleaseClient") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetStateForBtcReleaseClient is a free data retrieval call binding the contract method 0xc4fbca20. -// -// Solidity: function getStateForBtcReleaseClient() view returns(bytes) -func (_RskBridge *RskBridgeSession) GetStateForBtcReleaseClient() ([]byte, error) { - return _RskBridge.Contract.GetStateForBtcReleaseClient(&_RskBridge.CallOpts) -} - -// GetStateForBtcReleaseClient is a free data retrieval call binding the contract method 0xc4fbca20. -// -// Solidity: function getStateForBtcReleaseClient() view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetStateForBtcReleaseClient() ([]byte, error) { - return _RskBridge.Contract.GetStateForBtcReleaseClient(&_RskBridge.CallOpts) -} - -// GetStateForDebugging is a free data retrieval call binding the contract method 0x0d0cee93. -// -// Solidity: function getStateForDebugging() view returns(bytes) -func (_RskBridge *RskBridgeCaller) GetStateForDebugging(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "getStateForDebugging") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetStateForDebugging is a free data retrieval call binding the contract method 0x0d0cee93. -// -// Solidity: function getStateForDebugging() view returns(bytes) -func (_RskBridge *RskBridgeSession) GetStateForDebugging() ([]byte, error) { - return _RskBridge.Contract.GetStateForDebugging(&_RskBridge.CallOpts) -} - -// GetStateForDebugging is a free data retrieval call binding the contract method 0x0d0cee93. -// -// Solidity: function getStateForDebugging() view returns(bytes) -func (_RskBridge *RskBridgeCallerSession) GetStateForDebugging() ([]byte, error) { - return _RskBridge.Contract.GetStateForDebugging(&_RskBridge.CallOpts) -} - -// IsBtcTxHashAlreadyProcessed is a free data retrieval call binding the contract method 0x248a982d. -// -// Solidity: function isBtcTxHashAlreadyProcessed(string hash) view returns(bool) -func (_RskBridge *RskBridgeCaller) IsBtcTxHashAlreadyProcessed(opts *bind.CallOpts, hash string) (bool, error) { - var out []interface{} - err := _RskBridge.contract.Call(opts, &out, "isBtcTxHashAlreadyProcessed", hash) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsBtcTxHashAlreadyProcessed is a free data retrieval call binding the contract method 0x248a982d. -// -// Solidity: function isBtcTxHashAlreadyProcessed(string hash) view returns(bool) -func (_RskBridge *RskBridgeSession) IsBtcTxHashAlreadyProcessed(hash string) (bool, error) { - return _RskBridge.Contract.IsBtcTxHashAlreadyProcessed(&_RskBridge.CallOpts, hash) -} - -// IsBtcTxHashAlreadyProcessed is a free data retrieval call binding the contract method 0x248a982d. -// -// Solidity: function isBtcTxHashAlreadyProcessed(string hash) view returns(bool) -func (_RskBridge *RskBridgeCallerSession) IsBtcTxHashAlreadyProcessed(hash string) (bool, error) { - return _RskBridge.Contract.IsBtcTxHashAlreadyProcessed(&_RskBridge.CallOpts, hash) -} - -// AddFederatorPublicKey is a paid mutator transaction binding the contract method 0xecefd339. -// -// Solidity: function addFederatorPublicKey(bytes key) returns(int256) -func (_RskBridge *RskBridgeTransactor) AddFederatorPublicKey(opts *bind.TransactOpts, key []byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "addFederatorPublicKey", key) -} - -// AddFederatorPublicKey is a paid mutator transaction binding the contract method 0xecefd339. -// -// Solidity: function addFederatorPublicKey(bytes key) returns(int256) -func (_RskBridge *RskBridgeSession) AddFederatorPublicKey(key []byte) (*types.Transaction, error) { - return _RskBridge.Contract.AddFederatorPublicKey(&_RskBridge.TransactOpts, key) -} - -// AddFederatorPublicKey is a paid mutator transaction binding the contract method 0xecefd339. -// -// Solidity: function addFederatorPublicKey(bytes key) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) AddFederatorPublicKey(key []byte) (*types.Transaction, error) { - return _RskBridge.Contract.AddFederatorPublicKey(&_RskBridge.TransactOpts, key) -} - -// AddFederatorPublicKeyMultikey is a paid mutator transaction binding the contract method 0x444ff9da. -// -// Solidity: function addFederatorPublicKeyMultikey(bytes btcKey, bytes rskKey, bytes mstKey) returns(int256) -func (_RskBridge *RskBridgeTransactor) AddFederatorPublicKeyMultikey(opts *bind.TransactOpts, btcKey []byte, rskKey []byte, mstKey []byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "addFederatorPublicKeyMultikey", btcKey, rskKey, mstKey) -} - -// AddFederatorPublicKeyMultikey is a paid mutator transaction binding the contract method 0x444ff9da. -// -// Solidity: function addFederatorPublicKeyMultikey(bytes btcKey, bytes rskKey, bytes mstKey) returns(int256) -func (_RskBridge *RskBridgeSession) AddFederatorPublicKeyMultikey(btcKey []byte, rskKey []byte, mstKey []byte) (*types.Transaction, error) { - return _RskBridge.Contract.AddFederatorPublicKeyMultikey(&_RskBridge.TransactOpts, btcKey, rskKey, mstKey) -} - -// AddFederatorPublicKeyMultikey is a paid mutator transaction binding the contract method 0x444ff9da. -// -// Solidity: function addFederatorPublicKeyMultikey(bytes btcKey, bytes rskKey, bytes mstKey) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) AddFederatorPublicKeyMultikey(btcKey []byte, rskKey []byte, mstKey []byte) (*types.Transaction, error) { - return _RskBridge.Contract.AddFederatorPublicKeyMultikey(&_RskBridge.TransactOpts, btcKey, rskKey, mstKey) -} - -// AddLockWhitelistAddress is a paid mutator transaction binding the contract method 0x502bbbce. -// -// Solidity: function addLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) -func (_RskBridge *RskBridgeTransactor) AddLockWhitelistAddress(opts *bind.TransactOpts, aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "addLockWhitelistAddress", aaddress, maxTransferValue) -} - -// AddLockWhitelistAddress is a paid mutator transaction binding the contract method 0x502bbbce. -// -// Solidity: function addLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) -func (_RskBridge *RskBridgeSession) AddLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.AddLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) -} - -// AddLockWhitelistAddress is a paid mutator transaction binding the contract method 0x502bbbce. -// -// Solidity: function addLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) AddLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.AddLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) -} - -// AddOneOffLockWhitelistAddress is a paid mutator transaction binding the contract method 0x848206d9. -// -// Solidity: function addOneOffLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) -func (_RskBridge *RskBridgeTransactor) AddOneOffLockWhitelistAddress(opts *bind.TransactOpts, aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "addOneOffLockWhitelistAddress", aaddress, maxTransferValue) -} - -// AddOneOffLockWhitelistAddress is a paid mutator transaction binding the contract method 0x848206d9. -// -// Solidity: function addOneOffLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) -func (_RskBridge *RskBridgeSession) AddOneOffLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.AddOneOffLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) -} - -// AddOneOffLockWhitelistAddress is a paid mutator transaction binding the contract method 0x848206d9. -// -// Solidity: function addOneOffLockWhitelistAddress(string aaddress, int256 maxTransferValue) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) AddOneOffLockWhitelistAddress(aaddress string, maxTransferValue *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.AddOneOffLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress, maxTransferValue) -} - -// AddSignature is a paid mutator transaction binding the contract method 0xf10b9c59. -// -// Solidity: function addSignature(bytes pubkey, bytes[] signatures, bytes txhash) returns() -func (_RskBridge *RskBridgeTransactor) AddSignature(opts *bind.TransactOpts, pubkey []byte, signatures [][]byte, txhash []byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "addSignature", pubkey, signatures, txhash) -} - -// AddSignature is a paid mutator transaction binding the contract method 0xf10b9c59. -// -// Solidity: function addSignature(bytes pubkey, bytes[] signatures, bytes txhash) returns() -func (_RskBridge *RskBridgeSession) AddSignature(pubkey []byte, signatures [][]byte, txhash []byte) (*types.Transaction, error) { - return _RskBridge.Contract.AddSignature(&_RskBridge.TransactOpts, pubkey, signatures, txhash) -} - -// AddSignature is a paid mutator transaction binding the contract method 0xf10b9c59. -// -// Solidity: function addSignature(bytes pubkey, bytes[] signatures, bytes txhash) returns() -func (_RskBridge *RskBridgeTransactorSession) AddSignature(pubkey []byte, signatures [][]byte, txhash []byte) (*types.Transaction, error) { - return _RskBridge.Contract.AddSignature(&_RskBridge.TransactOpts, pubkey, signatures, txhash) -} - -// AddUnlimitedLockWhitelistAddress is a paid mutator transaction binding the contract method 0xb906c938. -// -// Solidity: function addUnlimitedLockWhitelistAddress(string aaddress) returns(int256) -func (_RskBridge *RskBridgeTransactor) AddUnlimitedLockWhitelistAddress(opts *bind.TransactOpts, aaddress string) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "addUnlimitedLockWhitelistAddress", aaddress) -} - -// AddUnlimitedLockWhitelistAddress is a paid mutator transaction binding the contract method 0xb906c938. -// -// Solidity: function addUnlimitedLockWhitelistAddress(string aaddress) returns(int256) -func (_RskBridge *RskBridgeSession) AddUnlimitedLockWhitelistAddress(aaddress string) (*types.Transaction, error) { - return _RskBridge.Contract.AddUnlimitedLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) -} - -// AddUnlimitedLockWhitelistAddress is a paid mutator transaction binding the contract method 0xb906c938. -// -// Solidity: function addUnlimitedLockWhitelistAddress(string aaddress) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) AddUnlimitedLockWhitelistAddress(aaddress string) (*types.Transaction, error) { - return _RskBridge.Contract.AddUnlimitedLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) -} - -// CommitFederation is a paid mutator transaction binding the contract method 0x1533330f. -// -// Solidity: function commitFederation(bytes hash) returns(int256) -func (_RskBridge *RskBridgeTransactor) CommitFederation(opts *bind.TransactOpts, hash []byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "commitFederation", hash) -} - -// CommitFederation is a paid mutator transaction binding the contract method 0x1533330f. -// -// Solidity: function commitFederation(bytes hash) returns(int256) -func (_RskBridge *RskBridgeSession) CommitFederation(hash []byte) (*types.Transaction, error) { - return _RskBridge.Contract.CommitFederation(&_RskBridge.TransactOpts, hash) -} - -// CommitFederation is a paid mutator transaction binding the contract method 0x1533330f. -// -// Solidity: function commitFederation(bytes hash) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) CommitFederation(hash []byte) (*types.Transaction, error) { - return _RskBridge.Contract.CommitFederation(&_RskBridge.TransactOpts, hash) -} - -// CreateFederation is a paid mutator transaction binding the contract method 0x1183d5d1. -// -// Solidity: function createFederation() returns(int256) -func (_RskBridge *RskBridgeTransactor) CreateFederation(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "createFederation") -} - -// CreateFederation is a paid mutator transaction binding the contract method 0x1183d5d1. -// -// Solidity: function createFederation() returns(int256) -func (_RskBridge *RskBridgeSession) CreateFederation() (*types.Transaction, error) { - return _RskBridge.Contract.CreateFederation(&_RskBridge.TransactOpts) -} - -// CreateFederation is a paid mutator transaction binding the contract method 0x1183d5d1. -// -// Solidity: function createFederation() returns(int256) -func (_RskBridge *RskBridgeTransactorSession) CreateFederation() (*types.Transaction, error) { - return _RskBridge.Contract.CreateFederation(&_RskBridge.TransactOpts) -} - -// HasBtcBlockCoinbaseTransactionInformation is a paid mutator transaction binding the contract method 0x253b944b. -// -// Solidity: function hasBtcBlockCoinbaseTransactionInformation(bytes32 blockHash) returns(bool) -func (_RskBridge *RskBridgeTransactor) HasBtcBlockCoinbaseTransactionInformation(opts *bind.TransactOpts, blockHash [32]byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "hasBtcBlockCoinbaseTransactionInformation", blockHash) -} - -// HasBtcBlockCoinbaseTransactionInformation is a paid mutator transaction binding the contract method 0x253b944b. -// -// Solidity: function hasBtcBlockCoinbaseTransactionInformation(bytes32 blockHash) returns(bool) -func (_RskBridge *RskBridgeSession) HasBtcBlockCoinbaseTransactionInformation(blockHash [32]byte) (*types.Transaction, error) { - return _RskBridge.Contract.HasBtcBlockCoinbaseTransactionInformation(&_RskBridge.TransactOpts, blockHash) -} - -// HasBtcBlockCoinbaseTransactionInformation is a paid mutator transaction binding the contract method 0x253b944b. -// -// Solidity: function hasBtcBlockCoinbaseTransactionInformation(bytes32 blockHash) returns(bool) -func (_RskBridge *RskBridgeTransactorSession) HasBtcBlockCoinbaseTransactionInformation(blockHash [32]byte) (*types.Transaction, error) { - return _RskBridge.Contract.HasBtcBlockCoinbaseTransactionInformation(&_RskBridge.TransactOpts, blockHash) -} - -// IncreaseLockingCap is a paid mutator transaction binding the contract method 0x2910aeb2. -// -// Solidity: function increaseLockingCap(int256 newLockingCap) returns(bool) -func (_RskBridge *RskBridgeTransactor) IncreaseLockingCap(opts *bind.TransactOpts, newLockingCap *big.Int) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "increaseLockingCap", newLockingCap) -} - -// IncreaseLockingCap is a paid mutator transaction binding the contract method 0x2910aeb2. -// -// Solidity: function increaseLockingCap(int256 newLockingCap) returns(bool) -func (_RskBridge *RskBridgeSession) IncreaseLockingCap(newLockingCap *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.IncreaseLockingCap(&_RskBridge.TransactOpts, newLockingCap) -} - -// IncreaseLockingCap is a paid mutator transaction binding the contract method 0x2910aeb2. -// -// Solidity: function increaseLockingCap(int256 newLockingCap) returns(bool) -func (_RskBridge *RskBridgeTransactorSession) IncreaseLockingCap(newLockingCap *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.IncreaseLockingCap(&_RskBridge.TransactOpts, newLockingCap) -} - -// ReceiveHeader is a paid mutator transaction binding the contract method 0x884bdd86. -// -// Solidity: function receiveHeader(bytes ablock) returns(int256) -func (_RskBridge *RskBridgeTransactor) ReceiveHeader(opts *bind.TransactOpts, ablock []byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "receiveHeader", ablock) -} - -// ReceiveHeader is a paid mutator transaction binding the contract method 0x884bdd86. -// -// Solidity: function receiveHeader(bytes ablock) returns(int256) -func (_RskBridge *RskBridgeSession) ReceiveHeader(ablock []byte) (*types.Transaction, error) { - return _RskBridge.Contract.ReceiveHeader(&_RskBridge.TransactOpts, ablock) -} - -// ReceiveHeader is a paid mutator transaction binding the contract method 0x884bdd86. -// -// Solidity: function receiveHeader(bytes ablock) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) ReceiveHeader(ablock []byte) (*types.Transaction, error) { - return _RskBridge.Contract.ReceiveHeader(&_RskBridge.TransactOpts, ablock) -} - -// ReceiveHeaders is a paid mutator transaction binding the contract method 0xe5400e7b. -// -// Solidity: function receiveHeaders(bytes[] blocks) returns() -func (_RskBridge *RskBridgeTransactor) ReceiveHeaders(opts *bind.TransactOpts, blocks [][]byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "receiveHeaders", blocks) -} - -// ReceiveHeaders is a paid mutator transaction binding the contract method 0xe5400e7b. -// -// Solidity: function receiveHeaders(bytes[] blocks) returns() -func (_RskBridge *RskBridgeSession) ReceiveHeaders(blocks [][]byte) (*types.Transaction, error) { - return _RskBridge.Contract.ReceiveHeaders(&_RskBridge.TransactOpts, blocks) -} - -// ReceiveHeaders is a paid mutator transaction binding the contract method 0xe5400e7b. -// -// Solidity: function receiveHeaders(bytes[] blocks) returns() -func (_RskBridge *RskBridgeTransactorSession) ReceiveHeaders(blocks [][]byte) (*types.Transaction, error) { - return _RskBridge.Contract.ReceiveHeaders(&_RskBridge.TransactOpts, blocks) -} - -// RegisterBtcCoinbaseTransaction is a paid mutator transaction binding the contract method 0xccf417ae. -// -// Solidity: function registerBtcCoinbaseTransaction(bytes btcTxSerialized, bytes32 blockHash, bytes pmtSerialized, bytes32 witnessMerkleRoot, bytes32 witnessReservedValue) returns() -func (_RskBridge *RskBridgeTransactor) RegisterBtcCoinbaseTransaction(opts *bind.TransactOpts, btcTxSerialized []byte, blockHash [32]byte, pmtSerialized []byte, witnessMerkleRoot [32]byte, witnessReservedValue [32]byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "registerBtcCoinbaseTransaction", btcTxSerialized, blockHash, pmtSerialized, witnessMerkleRoot, witnessReservedValue) -} - -// RegisterBtcCoinbaseTransaction is a paid mutator transaction binding the contract method 0xccf417ae. -// -// Solidity: function registerBtcCoinbaseTransaction(bytes btcTxSerialized, bytes32 blockHash, bytes pmtSerialized, bytes32 witnessMerkleRoot, bytes32 witnessReservedValue) returns() -func (_RskBridge *RskBridgeSession) RegisterBtcCoinbaseTransaction(btcTxSerialized []byte, blockHash [32]byte, pmtSerialized []byte, witnessMerkleRoot [32]byte, witnessReservedValue [32]byte) (*types.Transaction, error) { - return _RskBridge.Contract.RegisterBtcCoinbaseTransaction(&_RskBridge.TransactOpts, btcTxSerialized, blockHash, pmtSerialized, witnessMerkleRoot, witnessReservedValue) -} - -// RegisterBtcCoinbaseTransaction is a paid mutator transaction binding the contract method 0xccf417ae. -// -// Solidity: function registerBtcCoinbaseTransaction(bytes btcTxSerialized, bytes32 blockHash, bytes pmtSerialized, bytes32 witnessMerkleRoot, bytes32 witnessReservedValue) returns() -func (_RskBridge *RskBridgeTransactorSession) RegisterBtcCoinbaseTransaction(btcTxSerialized []byte, blockHash [32]byte, pmtSerialized []byte, witnessMerkleRoot [32]byte, witnessReservedValue [32]byte) (*types.Transaction, error) { - return _RskBridge.Contract.RegisterBtcCoinbaseTransaction(&_RskBridge.TransactOpts, btcTxSerialized, blockHash, pmtSerialized, witnessMerkleRoot, witnessReservedValue) -} - -// RegisterBtcTransaction is a paid mutator transaction binding the contract method 0x43dc0656. -// -// Solidity: function registerBtcTransaction(bytes atx, int256 height, bytes pmt) returns() -func (_RskBridge *RskBridgeTransactor) RegisterBtcTransaction(opts *bind.TransactOpts, atx []byte, height *big.Int, pmt []byte) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "registerBtcTransaction", atx, height, pmt) -} - -// RegisterBtcTransaction is a paid mutator transaction binding the contract method 0x43dc0656. -// -// Solidity: function registerBtcTransaction(bytes atx, int256 height, bytes pmt) returns() -func (_RskBridge *RskBridgeSession) RegisterBtcTransaction(atx []byte, height *big.Int, pmt []byte) (*types.Transaction, error) { - return _RskBridge.Contract.RegisterBtcTransaction(&_RskBridge.TransactOpts, atx, height, pmt) -} - -// RegisterBtcTransaction is a paid mutator transaction binding the contract method 0x43dc0656. -// -// Solidity: function registerBtcTransaction(bytes atx, int256 height, bytes pmt) returns() -func (_RskBridge *RskBridgeTransactorSession) RegisterBtcTransaction(atx []byte, height *big.Int, pmt []byte) (*types.Transaction, error) { - return _RskBridge.Contract.RegisterBtcTransaction(&_RskBridge.TransactOpts, atx, height, pmt) -} - -// RegisterFastBridgeBtcTransaction is a paid mutator transaction binding the contract method 0x6adc0133. -// -// Solidity: function registerFastBridgeBtcTransaction(bytes btcTxSerialized, uint256 height, bytes pmtSerialized, bytes32 derivationArgumentsHash, bytes userRefundBtcAddress, address liquidityBridgeContractAddress, bytes liquidityProviderBtcAddress, bool shouldTransferToContract) returns(int256) -func (_RskBridge *RskBridgeTransactor) RegisterFastBridgeBtcTransaction(opts *bind.TransactOpts, btcTxSerialized []byte, height *big.Int, pmtSerialized []byte, derivationArgumentsHash [32]byte, userRefundBtcAddress []byte, liquidityBridgeContractAddress common.Address, liquidityProviderBtcAddress []byte, shouldTransferToContract bool) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "registerFastBridgeBtcTransaction", btcTxSerialized, height, pmtSerialized, derivationArgumentsHash, userRefundBtcAddress, liquidityBridgeContractAddress, liquidityProviderBtcAddress, shouldTransferToContract) -} - -// RegisterFastBridgeBtcTransaction is a paid mutator transaction binding the contract method 0x6adc0133. -// -// Solidity: function registerFastBridgeBtcTransaction(bytes btcTxSerialized, uint256 height, bytes pmtSerialized, bytes32 derivationArgumentsHash, bytes userRefundBtcAddress, address liquidityBridgeContractAddress, bytes liquidityProviderBtcAddress, bool shouldTransferToContract) returns(int256) -func (_RskBridge *RskBridgeSession) RegisterFastBridgeBtcTransaction(btcTxSerialized []byte, height *big.Int, pmtSerialized []byte, derivationArgumentsHash [32]byte, userRefundBtcAddress []byte, liquidityBridgeContractAddress common.Address, liquidityProviderBtcAddress []byte, shouldTransferToContract bool) (*types.Transaction, error) { - return _RskBridge.Contract.RegisterFastBridgeBtcTransaction(&_RskBridge.TransactOpts, btcTxSerialized, height, pmtSerialized, derivationArgumentsHash, userRefundBtcAddress, liquidityBridgeContractAddress, liquidityProviderBtcAddress, shouldTransferToContract) -} - -// RegisterFastBridgeBtcTransaction is a paid mutator transaction binding the contract method 0x6adc0133. -// -// Solidity: function registerFastBridgeBtcTransaction(bytes btcTxSerialized, uint256 height, bytes pmtSerialized, bytes32 derivationArgumentsHash, bytes userRefundBtcAddress, address liquidityBridgeContractAddress, bytes liquidityProviderBtcAddress, bool shouldTransferToContract) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) RegisterFastBridgeBtcTransaction(btcTxSerialized []byte, height *big.Int, pmtSerialized []byte, derivationArgumentsHash [32]byte, userRefundBtcAddress []byte, liquidityBridgeContractAddress common.Address, liquidityProviderBtcAddress []byte, shouldTransferToContract bool) (*types.Transaction, error) { - return _RskBridge.Contract.RegisterFastBridgeBtcTransaction(&_RskBridge.TransactOpts, btcTxSerialized, height, pmtSerialized, derivationArgumentsHash, userRefundBtcAddress, liquidityBridgeContractAddress, liquidityProviderBtcAddress, shouldTransferToContract) -} - -// RemoveLockWhitelistAddress is a paid mutator transaction binding the contract method 0xfcdeb46f. -// -// Solidity: function removeLockWhitelistAddress(string aaddress) returns(int256) -func (_RskBridge *RskBridgeTransactor) RemoveLockWhitelistAddress(opts *bind.TransactOpts, aaddress string) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "removeLockWhitelistAddress", aaddress) -} - -// RemoveLockWhitelistAddress is a paid mutator transaction binding the contract method 0xfcdeb46f. -// -// Solidity: function removeLockWhitelistAddress(string aaddress) returns(int256) -func (_RskBridge *RskBridgeSession) RemoveLockWhitelistAddress(aaddress string) (*types.Transaction, error) { - return _RskBridge.Contract.RemoveLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) -} - -// RemoveLockWhitelistAddress is a paid mutator transaction binding the contract method 0xfcdeb46f. -// -// Solidity: function removeLockWhitelistAddress(string aaddress) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) RemoveLockWhitelistAddress(aaddress string) (*types.Transaction, error) { - return _RskBridge.Contract.RemoveLockWhitelistAddress(&_RskBridge.TransactOpts, aaddress) -} - -// RollbackFederation is a paid mutator transaction binding the contract method 0x8dec3d32. -// -// Solidity: function rollbackFederation() returns(int256) -func (_RskBridge *RskBridgeTransactor) RollbackFederation(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "rollbackFederation") -} - -// RollbackFederation is a paid mutator transaction binding the contract method 0x8dec3d32. -// -// Solidity: function rollbackFederation() returns(int256) -func (_RskBridge *RskBridgeSession) RollbackFederation() (*types.Transaction, error) { - return _RskBridge.Contract.RollbackFederation(&_RskBridge.TransactOpts) -} - -// RollbackFederation is a paid mutator transaction binding the contract method 0x8dec3d32. -// -// Solidity: function rollbackFederation() returns(int256) -func (_RskBridge *RskBridgeTransactorSession) RollbackFederation() (*types.Transaction, error) { - return _RskBridge.Contract.RollbackFederation(&_RskBridge.TransactOpts) -} - -// SetLockWhitelistDisableBlockDelay is a paid mutator transaction binding the contract method 0xc1cc54f5. -// -// Solidity: function setLockWhitelistDisableBlockDelay(int256 disableDelay) returns(int256) -func (_RskBridge *RskBridgeTransactor) SetLockWhitelistDisableBlockDelay(opts *bind.TransactOpts, disableDelay *big.Int) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "setLockWhitelistDisableBlockDelay", disableDelay) -} - -// SetLockWhitelistDisableBlockDelay is a paid mutator transaction binding the contract method 0xc1cc54f5. -// -// Solidity: function setLockWhitelistDisableBlockDelay(int256 disableDelay) returns(int256) -func (_RskBridge *RskBridgeSession) SetLockWhitelistDisableBlockDelay(disableDelay *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.SetLockWhitelistDisableBlockDelay(&_RskBridge.TransactOpts, disableDelay) -} - -// SetLockWhitelistDisableBlockDelay is a paid mutator transaction binding the contract method 0xc1cc54f5. -// -// Solidity: function setLockWhitelistDisableBlockDelay(int256 disableDelay) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) SetLockWhitelistDisableBlockDelay(disableDelay *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.SetLockWhitelistDisableBlockDelay(&_RskBridge.TransactOpts, disableDelay) -} - -// UpdateCollections is a paid mutator transaction binding the contract method 0x0c5a9990. -// -// Solidity: function updateCollections() returns() -func (_RskBridge *RskBridgeTransactor) UpdateCollections(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "updateCollections") -} - -// UpdateCollections is a paid mutator transaction binding the contract method 0x0c5a9990. -// -// Solidity: function updateCollections() returns() -func (_RskBridge *RskBridgeSession) UpdateCollections() (*types.Transaction, error) { - return _RskBridge.Contract.UpdateCollections(&_RskBridge.TransactOpts) -} - -// UpdateCollections is a paid mutator transaction binding the contract method 0x0c5a9990. -// -// Solidity: function updateCollections() returns() -func (_RskBridge *RskBridgeTransactorSession) UpdateCollections() (*types.Transaction, error) { - return _RskBridge.Contract.UpdateCollections(&_RskBridge.TransactOpts) -} - -// VoteFeePerKbChange is a paid mutator transaction binding the contract method 0x0461313e. -// -// Solidity: function voteFeePerKbChange(int256 feePerKb) returns(int256) -func (_RskBridge *RskBridgeTransactor) VoteFeePerKbChange(opts *bind.TransactOpts, feePerKb *big.Int) (*types.Transaction, error) { - return _RskBridge.contract.Transact(opts, "voteFeePerKbChange", feePerKb) -} - -// VoteFeePerKbChange is a paid mutator transaction binding the contract method 0x0461313e. -// -// Solidity: function voteFeePerKbChange(int256 feePerKb) returns(int256) -func (_RskBridge *RskBridgeSession) VoteFeePerKbChange(feePerKb *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.VoteFeePerKbChange(&_RskBridge.TransactOpts, feePerKb) -} - -// VoteFeePerKbChange is a paid mutator transaction binding the contract method 0x0461313e. -// -// Solidity: function voteFeePerKbChange(int256 feePerKb) returns(int256) -func (_RskBridge *RskBridgeTransactorSession) VoteFeePerKbChange(feePerKb *big.Int) (*types.Transaction, error) { - return _RskBridge.Contract.VoteFeePerKbChange(&_RskBridge.TransactOpts, feePerKb) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_RskBridge *RskBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RskBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_RskBridge *RskBridgeSession) Receive() (*types.Transaction, error) { - return _RskBridge.Contract.Receive(&_RskBridge.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_RskBridge *RskBridgeTransactorSession) Receive() (*types.Transaction, error) { - return _RskBridge.Contract.Receive(&_RskBridge.TransactOpts) -} diff --git a/connectors/bindings/lbc.go b/connectors/bindings/lbc.go deleted file mode 100644 index e6e643b5..00000000 --- a/connectors/bindings/lbc.go +++ /dev/null @@ -1,4638 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package bindings - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// LiquidityBridgeContractLiquidityProvider is an auto generated low-level Go binding around an user-defined struct. -type LiquidityBridgeContractLiquidityProvider struct { - Id *big.Int - Provider common.Address - Name string - ApiBaseUrl string - Status bool - ProviderType string -} - -// QuotesPegOutQuote is an auto generated low-level Go binding around an user-defined struct. -type QuotesPegOutQuote struct { - LbcAddress common.Address - LpRskAddress common.Address - BtcRefundAddress []byte - RskRefundAddress common.Address - LpBtcAddress []byte - CallFee *big.Int - PenaltyFee *big.Int - Nonce int64 - DeposityAddress []byte - Value *big.Int - AgreementTimestamp uint32 - DepositDateLimit uint32 - DepositConfirmations uint16 - TransferConfirmations uint16 - TransferTime uint32 - ExpireDate uint32 - ExpireBlock uint32 - ProductFeeAmount *big.Int - GasFee *big.Int -} - -// QuotesPeginQuote is an auto generated low-level Go binding around an user-defined struct. -type QuotesPeginQuote struct { - FedBtcAddress [20]byte - LbcAddress common.Address - LiquidityProviderRskAddress common.Address - BtcRefundAddress []byte - RskRefundAddress common.Address - LiquidityProviderBtcAddress []byte - CallFee *big.Int - PenaltyFee *big.Int - ContractAddress common.Address - Data []byte - GasLimit uint32 - Nonce int64 - Value *big.Int - AgreementTimestamp uint32 - TimeForDeposit uint32 - CallTime uint32 - DepositConfirmations uint16 - CallOnRegister bool - ProductFeeAmount *big.Int - GasFee *big.Int -} - -// LiquidityBridgeContractMetaData contains all meta data concerning the LiquidityBridgeContract contract. -var LiquidityBridgeContractMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BalanceDecrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BalanceIncrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"errorCode\",\"type\":\"int256\"}],\"name\":\"BridgeCapExceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"CallForUser\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CollateralIncrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DaoFeeSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"transferredAmount\",\"type\":\"int256\"}],\"name\":\"PegInRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"PegOutDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"PegOutRefunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"}],\"name\":\"PegOutUserRefunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"PegoutCollateralIncrease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"PegoutWithdrawCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"liquidityProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"penalty\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"Penalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"Refund\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Register\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"Resigned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE_GENERIC_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_REFUNDED_LP_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_REFUNDED_USER_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR\",\"outputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CALL_DONE_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CALL_GAS_COST\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REFUND_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAY_TO_ADDRESS_OUTPUT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROCESSED_QUOTE_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QUOTE_HASH_OUTPUT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNPROCESSED_QUOTE_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"contractBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoFeeCollectorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"productFeePercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"providerId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_productFeePercentage\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_daoFeeCollectorAddress\",\"type\":\"address\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_providerId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"setProviderStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderIds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinPegIn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRewardPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getResignDelayBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDustThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"getRegisteredPegOutQuote\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"lpBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"bytes\",\"name\":\"deposityAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"depositDateLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"transferConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"transferTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireDate\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PegOutQuote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"isPegOutQuoteCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isOperational\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isOperationalForPegout\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_apiBaseUrl\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"_providerType\",\"type\":\"string\"}],\"name\":\"register\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"providerIds\",\"type\":\"uint256[]\"}],\"name\":\"getProviders\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"apiBaseUrl\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"providerType\",\"type\":\"string\"}],\"internalType\":\"structLiquidityBridgeContract.LiquidityProvider[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addPegoutCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawPegoutCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getPegoutCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"}],\"name\":\"callForUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"btcRawTransaction\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"partialMerkleTree\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"}],\"name\":\"registerPegIn\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"lpBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"bytes\",\"name\":\"deposityAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"depositDateLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"transferConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"transferTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireDate\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PegOutQuote\",\"name\":\"quote\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"depositPegout\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"}],\"name\":\"refundUserPegOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"quoteHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"btcTx\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"btcBlockHeaderHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"partialMerkleTree\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleBranchHashes\",\"type\":\"bytes32[]\"}],\"name\":\"refundPegOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"depositAddress\",\"type\":\"bytes\"}],\"name\":\"validatePeginDepositAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes20\",\"name\":\"fedBtcAddress\",\"type\":\"bytes20\"},{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidityProviderRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"addresspayable\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"liquidityProviderBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"timeForDeposit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"callTime\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"callOnRegister\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PeginQuote\",\"name\":\"quote\",\"type\":\"tuple\"}],\"name\":\"hashQuote\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"lbcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpRskAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"btcRefundAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"rskRefundAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"lpBtcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"penaltyFee\",\"type\":\"uint256\"},{\"internalType\":\"int64\",\"name\":\"nonce\",\"type\":\"int64\"},{\"internalType\":\"bytes\",\"name\":\"deposityAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"agreementTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"depositDateLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"depositConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"transferConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"transferTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireDate\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expireBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"productFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasFee\",\"type\":\"uint256\"}],\"internalType\":\"structQuotes.PegOutQuote\",\"name\":\"quote\",\"type\":\"tuple\"}],\"name\":\"hashPegoutQuote\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", -} - -// LiquidityBridgeContractABI is the input ABI used to generate the binding from. -// Deprecated: Use LiquidityBridgeContractMetaData.ABI instead. -var LiquidityBridgeContractABI = LiquidityBridgeContractMetaData.ABI - -// LiquidityBridgeContract is an auto generated Go binding around an Ethereum contract. -type LiquidityBridgeContract struct { - LiquidityBridgeContractCaller // Read-only binding to the contract - LiquidityBridgeContractTransactor // Write-only binding to the contract - LiquidityBridgeContractFilterer // Log filterer for contract events -} - -// LiquidityBridgeContractCaller is an auto generated read-only Go binding around an Ethereum contract. -type LiquidityBridgeContractCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LiquidityBridgeContractTransactor is an auto generated write-only Go binding around an Ethereum contract. -type LiquidityBridgeContractTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LiquidityBridgeContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type LiquidityBridgeContractFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LiquidityBridgeContractSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type LiquidityBridgeContractSession struct { - Contract *LiquidityBridgeContract // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LiquidityBridgeContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type LiquidityBridgeContractCallerSession struct { - Contract *LiquidityBridgeContractCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// LiquidityBridgeContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type LiquidityBridgeContractTransactorSession struct { - Contract *LiquidityBridgeContractTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LiquidityBridgeContractRaw is an auto generated low-level Go binding around an Ethereum contract. -type LiquidityBridgeContractRaw struct { - Contract *LiquidityBridgeContract // Generic contract binding to access the raw methods on -} - -// LiquidityBridgeContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type LiquidityBridgeContractCallerRaw struct { - Contract *LiquidityBridgeContractCaller // Generic read-only contract binding to access the raw methods on -} - -// LiquidityBridgeContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type LiquidityBridgeContractTransactorRaw struct { - Contract *LiquidityBridgeContractTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewLiquidityBridgeContract creates a new instance of LiquidityBridgeContract, bound to a specific deployed contract. -func NewLiquidityBridgeContract(address common.Address, backend bind.ContractBackend) (*LiquidityBridgeContract, error) { - contract, err := bindLiquidityBridgeContract(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &LiquidityBridgeContract{LiquidityBridgeContractCaller: LiquidityBridgeContractCaller{contract: contract}, LiquidityBridgeContractTransactor: LiquidityBridgeContractTransactor{contract: contract}, LiquidityBridgeContractFilterer: LiquidityBridgeContractFilterer{contract: contract}}, nil -} - -// NewLiquidityBridgeContractCaller creates a new read-only instance of LiquidityBridgeContract, bound to a specific deployed contract. -func NewLiquidityBridgeContractCaller(address common.Address, caller bind.ContractCaller) (*LiquidityBridgeContractCaller, error) { - contract, err := bindLiquidityBridgeContract(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractCaller{contract: contract}, nil -} - -// NewLiquidityBridgeContractTransactor creates a new write-only instance of LiquidityBridgeContract, bound to a specific deployed contract. -func NewLiquidityBridgeContractTransactor(address common.Address, transactor bind.ContractTransactor) (*LiquidityBridgeContractTransactor, error) { - contract, err := bindLiquidityBridgeContract(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractTransactor{contract: contract}, nil -} - -// NewLiquidityBridgeContractFilterer creates a new log filterer instance of LiquidityBridgeContract, bound to a specific deployed contract. -func NewLiquidityBridgeContractFilterer(address common.Address, filterer bind.ContractFilterer) (*LiquidityBridgeContractFilterer, error) { - contract, err := bindLiquidityBridgeContract(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractFilterer{contract: contract}, nil -} - -// bindLiquidityBridgeContract binds a generic wrapper to an already deployed contract. -func bindLiquidityBridgeContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := LiquidityBridgeContractMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LiquidityBridgeContract *LiquidityBridgeContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LiquidityBridgeContract.Contract.LiquidityBridgeContractCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LiquidityBridgeContract *LiquidityBridgeContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.LiquidityBridgeContractTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LiquidityBridgeContract *LiquidityBridgeContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.LiquidityBridgeContractTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LiquidityBridgeContract.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.contract.Transact(opts, method, params...) -} - -// BRIDGEGENERICERROR is a free data retrieval call binding the contract method 0xae93b67b. -// -// Solidity: function BRIDGE_GENERIC_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEGENERICERROR(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_GENERIC_ERROR") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEGENERICERROR is a free data retrieval call binding the contract method 0xae93b67b. -// -// Solidity: function BRIDGE_GENERIC_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEGENERICERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEGENERICERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEGENERICERROR is a free data retrieval call binding the contract method 0xae93b67b. -// -// Solidity: function BRIDGE_GENERIC_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEGENERICERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEGENERICERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEREFUNDEDLPERRORCODE is a free data retrieval call binding the contract method 0xe30e6ea3. -// -// Solidity: function BRIDGE_REFUNDED_LP_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEREFUNDEDLPERRORCODE(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_REFUNDED_LP_ERROR_CODE") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEREFUNDEDLPERRORCODE is a free data retrieval call binding the contract method 0xe30e6ea3. -// -// Solidity: function BRIDGE_REFUNDED_LP_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEREFUNDEDLPERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDLPERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEREFUNDEDLPERRORCODE is a free data retrieval call binding the contract method 0xe30e6ea3. -// -// Solidity: function BRIDGE_REFUNDED_LP_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEREFUNDEDLPERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDLPERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEREFUNDEDUSERERRORCODE is a free data retrieval call binding the contract method 0xe8fcce71. -// -// Solidity: function BRIDGE_REFUNDED_USER_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEREFUNDEDUSERERRORCODE(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_REFUNDED_USER_ERROR_CODE") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEREFUNDEDUSERERRORCODE is a free data retrieval call binding the contract method 0xe8fcce71. -// -// Solidity: function BRIDGE_REFUNDED_USER_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEREFUNDEDUSERERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDUSERERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEREFUNDEDUSERERRORCODE is a free data retrieval call binding the contract method 0xe8fcce71. -// -// Solidity: function BRIDGE_REFUNDED_USER_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEREFUNDEDUSERERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEREFUNDEDUSERERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE is a free data retrieval call binding the contract method 0xa93bb247. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE is a free data retrieval call binding the contract method 0xa93bb247. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE is a free data retrieval call binding the contract method 0xa93bb247. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_ALREADY_PROCESSED_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXALREADYPROCESSEDERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE is a free data retrieval call binding the contract method 0x8d597939. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE is a free data retrieval call binding the contract method 0x8d597939. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE is a free data retrieval call binding the contract method 0x8d597939. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_INVALID_SENDER_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXINVALIDSENDERERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE is a free data retrieval call binding the contract method 0xae76ce86. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE is a free data retrieval call binding the contract method 0xae76ce86. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE is a free data retrieval call binding the contract method 0xae76ce86. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_NOT_CONTRACT_ERROR_CODE() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXNOTCONTRACTERRORCODE(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR is a free data retrieval call binding the contract method 0x418663a2. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR is a free data retrieval call binding the contract method 0x418663a2. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR is a free data retrieval call binding the contract method 0x418663a2. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_UTXO_AMOUNT_SENT_BELOW_MINIMUM_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXUTXOAMOUNTSENTBELOWMINIMUMERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXVALIDATIONSERROR is a free data retrieval call binding the contract method 0xc525cdd8. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXVALIDATIONSERROR(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEUNPROCESSABLETXVALIDATIONSERROR is a free data retrieval call binding the contract method 0xc525cdd8. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXVALIDATIONSERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALIDATIONSERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXVALIDATIONSERROR is a free data retrieval call binding the contract method 0xc525cdd8. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALIDATIONS_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXVALIDATIONSERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALIDATIONSERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXVALUEZEROERROR is a free data retrieval call binding the contract method 0xcfb92f0a. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) BRIDGEUNPROCESSABLETXVALUEZEROERROR(opts *bind.CallOpts) (int16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR") - - if err != nil { - return *new(int16), err - } - - out0 := *abi.ConvertType(out[0], new(int16)).(*int16) - - return out0, err - -} - -// BRIDGEUNPROCESSABLETXVALUEZEROERROR is a free data retrieval call binding the contract method 0xcfb92f0a. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) BRIDGEUNPROCESSABLETXVALUEZEROERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALUEZEROERROR(&_LiquidityBridgeContract.CallOpts) -} - -// BRIDGEUNPROCESSABLETXVALUEZEROERROR is a free data retrieval call binding the contract method 0xcfb92f0a. -// -// Solidity: function BRIDGE_UNPROCESSABLE_TX_VALUE_ZERO_ERROR() view returns(int16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) BRIDGEUNPROCESSABLETXVALUEZEROERROR() (int16, error) { - return _LiquidityBridgeContract.Contract.BRIDGEUNPROCESSABLETXVALUEZEROERROR(&_LiquidityBridgeContract.CallOpts) -} - -// CALLDONECODE is a free data retrieval call binding the contract method 0x04ade855. -// -// Solidity: function CALL_DONE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) CALLDONECODE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "CALL_DONE_CODE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// CALLDONECODE is a free data retrieval call binding the contract method 0x04ade855. -// -// Solidity: function CALL_DONE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) CALLDONECODE() (uint8, error) { - return _LiquidityBridgeContract.Contract.CALLDONECODE(&_LiquidityBridgeContract.CallOpts) -} - -// CALLDONECODE is a free data retrieval call binding the contract method 0x04ade855. -// -// Solidity: function CALL_DONE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) CALLDONECODE() (uint8, error) { - return _LiquidityBridgeContract.Contract.CALLDONECODE(&_LiquidityBridgeContract.CallOpts) -} - -// MAXCALLGASCOST is a free data retrieval call binding the contract method 0x9d79b59b. -// -// Solidity: function MAX_CALL_GAS_COST() view returns(uint16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) MAXCALLGASCOST(opts *bind.CallOpts) (uint16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "MAX_CALL_GAS_COST") - - if err != nil { - return *new(uint16), err - } - - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) - - return out0, err - -} - -// MAXCALLGASCOST is a free data retrieval call binding the contract method 0x9d79b59b. -// -// Solidity: function MAX_CALL_GAS_COST() view returns(uint16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) MAXCALLGASCOST() (uint16, error) { - return _LiquidityBridgeContract.Contract.MAXCALLGASCOST(&_LiquidityBridgeContract.CallOpts) -} - -// MAXCALLGASCOST is a free data retrieval call binding the contract method 0x9d79b59b. -// -// Solidity: function MAX_CALL_GAS_COST() view returns(uint16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) MAXCALLGASCOST() (uint16, error) { - return _LiquidityBridgeContract.Contract.MAXCALLGASCOST(&_LiquidityBridgeContract.CallOpts) -} - -// MAXREFUNDGASLIMIT is a free data retrieval call binding the contract method 0xe1de16c6. -// -// Solidity: function MAX_REFUND_GAS_LIMIT() view returns(uint16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) MAXREFUNDGASLIMIT(opts *bind.CallOpts) (uint16, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "MAX_REFUND_GAS_LIMIT") - - if err != nil { - return *new(uint16), err - } - - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) - - return out0, err - -} - -// MAXREFUNDGASLIMIT is a free data retrieval call binding the contract method 0xe1de16c6. -// -// Solidity: function MAX_REFUND_GAS_LIMIT() view returns(uint16) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) MAXREFUNDGASLIMIT() (uint16, error) { - return _LiquidityBridgeContract.Contract.MAXREFUNDGASLIMIT(&_LiquidityBridgeContract.CallOpts) -} - -// MAXREFUNDGASLIMIT is a free data retrieval call binding the contract method 0xe1de16c6. -// -// Solidity: function MAX_REFUND_GAS_LIMIT() view returns(uint16) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) MAXREFUNDGASLIMIT() (uint16, error) { - return _LiquidityBridgeContract.Contract.MAXREFUNDGASLIMIT(&_LiquidityBridgeContract.CallOpts) -} - -// PAYTOADDRESSOUTPUT is a free data retrieval call binding the contract method 0xbe6de4eb. -// -// Solidity: function PAY_TO_ADDRESS_OUTPUT() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) PAYTOADDRESSOUTPUT(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "PAY_TO_ADDRESS_OUTPUT") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// PAYTOADDRESSOUTPUT is a free data retrieval call binding the contract method 0xbe6de4eb. -// -// Solidity: function PAY_TO_ADDRESS_OUTPUT() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) PAYTOADDRESSOUTPUT() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.PAYTOADDRESSOUTPUT(&_LiquidityBridgeContract.CallOpts) -} - -// PAYTOADDRESSOUTPUT is a free data retrieval call binding the contract method 0xbe6de4eb. -// -// Solidity: function PAY_TO_ADDRESS_OUTPUT() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) PAYTOADDRESSOUTPUT() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.PAYTOADDRESSOUTPUT(&_LiquidityBridgeContract.CallOpts) -} - -// PROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x0a7bf57a. -// -// Solidity: function PROCESSED_QUOTE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) PROCESSEDQUOTECODE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "PROCESSED_QUOTE_CODE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// PROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x0a7bf57a. -// -// Solidity: function PROCESSED_QUOTE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) PROCESSEDQUOTECODE() (uint8, error) { - return _LiquidityBridgeContract.Contract.PROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) -} - -// PROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x0a7bf57a. -// -// Solidity: function PROCESSED_QUOTE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) PROCESSEDQUOTECODE() (uint8, error) { - return _LiquidityBridgeContract.Contract.PROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) -} - -// QUOTEHASHOUTPUT is a free data retrieval call binding the contract method 0xa4a5ba50. -// -// Solidity: function QUOTE_HASH_OUTPUT() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) QUOTEHASHOUTPUT(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "QUOTE_HASH_OUTPUT") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// QUOTEHASHOUTPUT is a free data retrieval call binding the contract method 0xa4a5ba50. -// -// Solidity: function QUOTE_HASH_OUTPUT() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) QUOTEHASHOUTPUT() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.QUOTEHASHOUTPUT(&_LiquidityBridgeContract.CallOpts) -} - -// QUOTEHASHOUTPUT is a free data retrieval call binding the contract method 0xa4a5ba50. -// -// Solidity: function QUOTE_HASH_OUTPUT() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) QUOTEHASHOUTPUT() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.QUOTEHASHOUTPUT(&_LiquidityBridgeContract.CallOpts) -} - -// UNPROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x9cd6557f. -// -// Solidity: function UNPROCESSED_QUOTE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) UNPROCESSEDQUOTECODE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "UNPROCESSED_QUOTE_CODE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UNPROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x9cd6557f. -// -// Solidity: function UNPROCESSED_QUOTE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) UNPROCESSEDQUOTECODE() (uint8, error) { - return _LiquidityBridgeContract.Contract.UNPROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) -} - -// UNPROCESSEDQUOTECODE is a free data retrieval call binding the contract method 0x9cd6557f. -// -// Solidity: function UNPROCESSED_QUOTE_CODE() view returns(uint8) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) UNPROCESSEDQUOTECODE() (uint8, error) { - return _LiquidityBridgeContract.Contract.UNPROCESSEDQUOTECODE(&_LiquidityBridgeContract.CallOpts) -} - -// Bridge is a free data retrieval call binding the contract method 0xe78cea92. -// -// Solidity: function bridge() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) Bridge(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "bridge") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Bridge is a free data retrieval call binding the contract method 0xe78cea92. -// -// Solidity: function bridge() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Bridge() (common.Address, error) { - return _LiquidityBridgeContract.Contract.Bridge(&_LiquidityBridgeContract.CallOpts) -} - -// Bridge is a free data retrieval call binding the contract method 0xe78cea92. -// -// Solidity: function bridge() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) Bridge() (common.Address, error) { - return _LiquidityBridgeContract.Contract.Bridge(&_LiquidityBridgeContract.CallOpts) -} - -// DaoFeeCollectorAddress is a free data retrieval call binding the contract method 0x710738b1. -// -// Solidity: function daoFeeCollectorAddress() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) DaoFeeCollectorAddress(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "daoFeeCollectorAddress") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// DaoFeeCollectorAddress is a free data retrieval call binding the contract method 0x710738b1. -// -// Solidity: function daoFeeCollectorAddress() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) DaoFeeCollectorAddress() (common.Address, error) { - return _LiquidityBridgeContract.Contract.DaoFeeCollectorAddress(&_LiquidityBridgeContract.CallOpts) -} - -// DaoFeeCollectorAddress is a free data retrieval call binding the contract method 0x710738b1. -// -// Solidity: function daoFeeCollectorAddress() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) DaoFeeCollectorAddress() (common.Address, error) { - return _LiquidityBridgeContract.Contract.DaoFeeCollectorAddress(&_LiquidityBridgeContract.CallOpts) -} - -// GetBalance is a free data retrieval call binding the contract method 0xf8b2cb4f. -// -// Solidity: function getBalance(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getBalance", addr) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetBalance is a free data retrieval call binding the contract method 0xf8b2cb4f. -// -// Solidity: function getBalance(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetBalance(addr common.Address) (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetBalance(&_LiquidityBridgeContract.CallOpts, addr) -} - -// GetBalance is a free data retrieval call binding the contract method 0xf8b2cb4f. -// -// Solidity: function getBalance(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetBalance(addr common.Address) (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetBalance(&_LiquidityBridgeContract.CallOpts, addr) -} - -// GetBridgeAddress is a free data retrieval call binding the contract method 0xfb32c508. -// -// Solidity: function getBridgeAddress() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetBridgeAddress(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getBridgeAddress") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// GetBridgeAddress is a free data retrieval call binding the contract method 0xfb32c508. -// -// Solidity: function getBridgeAddress() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetBridgeAddress() (common.Address, error) { - return _LiquidityBridgeContract.Contract.GetBridgeAddress(&_LiquidityBridgeContract.CallOpts) -} - -// GetBridgeAddress is a free data retrieval call binding the contract method 0xfb32c508. -// -// Solidity: function getBridgeAddress() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetBridgeAddress() (common.Address, error) { - return _LiquidityBridgeContract.Contract.GetBridgeAddress(&_LiquidityBridgeContract.CallOpts) -} - -// GetCollateral is a free data retrieval call binding the contract method 0x9b56d6c9. -// -// Solidity: function getCollateral(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getCollateral", addr) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetCollateral is a free data retrieval call binding the contract method 0x9b56d6c9. -// -// Solidity: function getCollateral(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetCollateral(addr common.Address) (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetCollateral(&_LiquidityBridgeContract.CallOpts, addr) -} - -// GetCollateral is a free data retrieval call binding the contract method 0x9b56d6c9. -// -// Solidity: function getCollateral(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetCollateral(addr common.Address) (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetCollateral(&_LiquidityBridgeContract.CallOpts, addr) -} - -// GetDustThreshold is a free data retrieval call binding the contract method 0x33f07ad3. -// -// Solidity: function getDustThreshold() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetDustThreshold(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getDustThreshold") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetDustThreshold is a free data retrieval call binding the contract method 0x33f07ad3. -// -// Solidity: function getDustThreshold() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetDustThreshold() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetDustThreshold(&_LiquidityBridgeContract.CallOpts) -} - -// GetDustThreshold is a free data retrieval call binding the contract method 0x33f07ad3. -// -// Solidity: function getDustThreshold() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetDustThreshold() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetDustThreshold(&_LiquidityBridgeContract.CallOpts) -} - -// GetMinCollateral is a free data retrieval call binding the contract method 0xe830b690. -// -// Solidity: function getMinCollateral() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetMinCollateral(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getMinCollateral") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetMinCollateral is a free data retrieval call binding the contract method 0xe830b690. -// -// Solidity: function getMinCollateral() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetMinCollateral() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetMinCollateral(&_LiquidityBridgeContract.CallOpts) -} - -// GetMinCollateral is a free data retrieval call binding the contract method 0xe830b690. -// -// Solidity: function getMinCollateral() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetMinCollateral() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetMinCollateral(&_LiquidityBridgeContract.CallOpts) -} - -// GetMinPegIn is a free data retrieval call binding the contract method 0xfa88dcde. -// -// Solidity: function getMinPegIn() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetMinPegIn(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getMinPegIn") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetMinPegIn is a free data retrieval call binding the contract method 0xfa88dcde. -// -// Solidity: function getMinPegIn() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetMinPegIn() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetMinPegIn(&_LiquidityBridgeContract.CallOpts) -} - -// GetMinPegIn is a free data retrieval call binding the contract method 0xfa88dcde. -// -// Solidity: function getMinPegIn() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetMinPegIn() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetMinPegIn(&_LiquidityBridgeContract.CallOpts) -} - -// GetPegoutCollateral is a free data retrieval call binding the contract method 0xbd519eff. -// -// Solidity: function getPegoutCollateral(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetPegoutCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getPegoutCollateral", addr) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetPegoutCollateral is a free data retrieval call binding the contract method 0xbd519eff. -// -// Solidity: function getPegoutCollateral(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetPegoutCollateral(addr common.Address) (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetPegoutCollateral(&_LiquidityBridgeContract.CallOpts, addr) -} - -// GetPegoutCollateral is a free data retrieval call binding the contract method 0xbd519eff. -// -// Solidity: function getPegoutCollateral(address addr) view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetPegoutCollateral(addr common.Address) (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetPegoutCollateral(&_LiquidityBridgeContract.CallOpts, addr) -} - -// GetProviderIds is a free data retrieval call binding the contract method 0x0a9cb4a7. -// -// Solidity: function getProviderIds() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetProviderIds(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getProviderIds") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetProviderIds is a free data retrieval call binding the contract method 0x0a9cb4a7. -// -// Solidity: function getProviderIds() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetProviderIds() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetProviderIds(&_LiquidityBridgeContract.CallOpts) -} - -// GetProviderIds is a free data retrieval call binding the contract method 0x0a9cb4a7. -// -// Solidity: function getProviderIds() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetProviderIds() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetProviderIds(&_LiquidityBridgeContract.CallOpts) -} - -// GetProviders is a free data retrieval call binding the contract method 0x668dbd83. -// -// Solidity: function getProviders(uint256[] providerIds) view returns((uint256,address,string,string,bool,string)[]) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetProviders(opts *bind.CallOpts, providerIds []*big.Int) ([]LiquidityBridgeContractLiquidityProvider, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getProviders", providerIds) - - if err != nil { - return *new([]LiquidityBridgeContractLiquidityProvider), err - } - - out0 := *abi.ConvertType(out[0], new([]LiquidityBridgeContractLiquidityProvider)).(*[]LiquidityBridgeContractLiquidityProvider) - - return out0, err - -} - -// GetProviders is a free data retrieval call binding the contract method 0x668dbd83. -// -// Solidity: function getProviders(uint256[] providerIds) view returns((uint256,address,string,string,bool,string)[]) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetProviders(providerIds []*big.Int) ([]LiquidityBridgeContractLiquidityProvider, error) { - return _LiquidityBridgeContract.Contract.GetProviders(&_LiquidityBridgeContract.CallOpts, providerIds) -} - -// GetProviders is a free data retrieval call binding the contract method 0x668dbd83. -// -// Solidity: function getProviders(uint256[] providerIds) view returns((uint256,address,string,string,bool,string)[]) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetProviders(providerIds []*big.Int) ([]LiquidityBridgeContractLiquidityProvider, error) { - return _LiquidityBridgeContract.Contract.GetProviders(&_LiquidityBridgeContract.CallOpts, providerIds) -} - -// GetRegisteredPegOutQuote is a free data retrieval call binding the contract method 0xe90d2ddb. -// -// Solidity: function getRegisteredPegOutQuote(bytes32 quoteHash) view returns((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256)) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetRegisteredPegOutQuote(opts *bind.CallOpts, quoteHash [32]byte) (QuotesPegOutQuote, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getRegisteredPegOutQuote", quoteHash) - - if err != nil { - return *new(QuotesPegOutQuote), err - } - - out0 := *abi.ConvertType(out[0], new(QuotesPegOutQuote)).(*QuotesPegOutQuote) - - return out0, err - -} - -// GetRegisteredPegOutQuote is a free data retrieval call binding the contract method 0xe90d2ddb. -// -// Solidity: function getRegisteredPegOutQuote(bytes32 quoteHash) view returns((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256)) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetRegisteredPegOutQuote(quoteHash [32]byte) (QuotesPegOutQuote, error) { - return _LiquidityBridgeContract.Contract.GetRegisteredPegOutQuote(&_LiquidityBridgeContract.CallOpts, quoteHash) -} - -// GetRegisteredPegOutQuote is a free data retrieval call binding the contract method 0xe90d2ddb. -// -// Solidity: function getRegisteredPegOutQuote(bytes32 quoteHash) view returns((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256)) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetRegisteredPegOutQuote(quoteHash [32]byte) (QuotesPegOutQuote, error) { - return _LiquidityBridgeContract.Contract.GetRegisteredPegOutQuote(&_LiquidityBridgeContract.CallOpts, quoteHash) -} - -// GetResignDelayBlocks is a free data retrieval call binding the contract method 0xbd5798c3. -// -// Solidity: function getResignDelayBlocks() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetResignDelayBlocks(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getResignDelayBlocks") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetResignDelayBlocks is a free data retrieval call binding the contract method 0xbd5798c3. -// -// Solidity: function getResignDelayBlocks() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetResignDelayBlocks() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetResignDelayBlocks(&_LiquidityBridgeContract.CallOpts) -} - -// GetResignDelayBlocks is a free data retrieval call binding the contract method 0xbd5798c3. -// -// Solidity: function getResignDelayBlocks() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetResignDelayBlocks() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetResignDelayBlocks(&_LiquidityBridgeContract.CallOpts) -} - -// GetRewardPercentage is a free data retrieval call binding the contract method 0xc7213163. -// -// Solidity: function getRewardPercentage() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) GetRewardPercentage(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "getRewardPercentage") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetRewardPercentage is a free data retrieval call binding the contract method 0xc7213163. -// -// Solidity: function getRewardPercentage() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) GetRewardPercentage() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetRewardPercentage(&_LiquidityBridgeContract.CallOpts) -} - -// GetRewardPercentage is a free data retrieval call binding the contract method 0xc7213163. -// -// Solidity: function getRewardPercentage() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) GetRewardPercentage() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.GetRewardPercentage(&_LiquidityBridgeContract.CallOpts) -} - -// HashPegoutQuote is a free data retrieval call binding the contract method 0x22140009. -// -// Solidity: function hashPegoutQuote((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote) view returns(bytes32) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) HashPegoutQuote(opts *bind.CallOpts, quote QuotesPegOutQuote) ([32]byte, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "hashPegoutQuote", quote) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// HashPegoutQuote is a free data retrieval call binding the contract method 0x22140009. -// -// Solidity: function hashPegoutQuote((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote) view returns(bytes32) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) HashPegoutQuote(quote QuotesPegOutQuote) ([32]byte, error) { - return _LiquidityBridgeContract.Contract.HashPegoutQuote(&_LiquidityBridgeContract.CallOpts, quote) -} - -// HashPegoutQuote is a free data retrieval call binding the contract method 0x22140009. -// -// Solidity: function hashPegoutQuote((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote) view returns(bytes32) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) HashPegoutQuote(quote QuotesPegOutQuote) ([32]byte, error) { - return _LiquidityBridgeContract.Contract.HashPegoutQuote(&_LiquidityBridgeContract.CallOpts, quote) -} - -// HashQuote is a free data retrieval call binding the contract method 0xb3a849aa. -// -// Solidity: function hashQuote((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) view returns(bytes32) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) HashQuote(opts *bind.CallOpts, quote QuotesPeginQuote) ([32]byte, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "hashQuote", quote) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// HashQuote is a free data retrieval call binding the contract method 0xb3a849aa. -// -// Solidity: function hashQuote((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) view returns(bytes32) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) HashQuote(quote QuotesPeginQuote) ([32]byte, error) { - return _LiquidityBridgeContract.Contract.HashQuote(&_LiquidityBridgeContract.CallOpts, quote) -} - -// HashQuote is a free data retrieval call binding the contract method 0xb3a849aa. -// -// Solidity: function hashQuote((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) view returns(bytes32) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) HashQuote(quote QuotesPeginQuote) ([32]byte, error) { - return _LiquidityBridgeContract.Contract.HashQuote(&_LiquidityBridgeContract.CallOpts, quote) -} - -// IsOperational is a free data retrieval call binding the contract method 0x457385f2. -// -// Solidity: function isOperational(address addr) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) IsOperational(opts *bind.CallOpts, addr common.Address) (bool, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "isOperational", addr) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsOperational is a free data retrieval call binding the contract method 0x457385f2. -// -// Solidity: function isOperational(address addr) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) IsOperational(addr common.Address) (bool, error) { - return _LiquidityBridgeContract.Contract.IsOperational(&_LiquidityBridgeContract.CallOpts, addr) -} - -// IsOperational is a free data retrieval call binding the contract method 0x457385f2. -// -// Solidity: function isOperational(address addr) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) IsOperational(addr common.Address) (bool, error) { - return _LiquidityBridgeContract.Contract.IsOperational(&_LiquidityBridgeContract.CallOpts, addr) -} - -// IsOperationalForPegout is a free data retrieval call binding the contract method 0x4d0ec971. -// -// Solidity: function isOperationalForPegout(address addr) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) IsOperationalForPegout(opts *bind.CallOpts, addr common.Address) (bool, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "isOperationalForPegout", addr) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsOperationalForPegout is a free data retrieval call binding the contract method 0x4d0ec971. -// -// Solidity: function isOperationalForPegout(address addr) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) IsOperationalForPegout(addr common.Address) (bool, error) { - return _LiquidityBridgeContract.Contract.IsOperationalForPegout(&_LiquidityBridgeContract.CallOpts, addr) -} - -// IsOperationalForPegout is a free data retrieval call binding the contract method 0x4d0ec971. -// -// Solidity: function isOperationalForPegout(address addr) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) IsOperationalForPegout(addr common.Address) (bool, error) { - return _LiquidityBridgeContract.Contract.IsOperationalForPegout(&_LiquidityBridgeContract.CallOpts, addr) -} - -// IsPegOutQuoteCompleted is a free data retrieval call binding the contract method 0x54015ee0. -// -// Solidity: function isPegOutQuoteCompleted(bytes32 quoteHash) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) IsPegOutQuoteCompleted(opts *bind.CallOpts, quoteHash [32]byte) (bool, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "isPegOutQuoteCompleted", quoteHash) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsPegOutQuoteCompleted is a free data retrieval call binding the contract method 0x54015ee0. -// -// Solidity: function isPegOutQuoteCompleted(bytes32 quoteHash) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) IsPegOutQuoteCompleted(quoteHash [32]byte) (bool, error) { - return _LiquidityBridgeContract.Contract.IsPegOutQuoteCompleted(&_LiquidityBridgeContract.CallOpts, quoteHash) -} - -// IsPegOutQuoteCompleted is a free data retrieval call binding the contract method 0x54015ee0. -// -// Solidity: function isPegOutQuoteCompleted(bytes32 quoteHash) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) IsPegOutQuoteCompleted(quoteHash [32]byte) (bool, error) { - return _LiquidityBridgeContract.Contract.IsPegOutQuoteCompleted(&_LiquidityBridgeContract.CallOpts, quoteHash) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Owner() (common.Address, error) { - return _LiquidityBridgeContract.Contract.Owner(&_LiquidityBridgeContract.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) Owner() (common.Address, error) { - return _LiquidityBridgeContract.Contract.Owner(&_LiquidityBridgeContract.CallOpts) -} - -// ProductFeePercentage is a free data retrieval call binding the contract method 0x63c67135. -// -// Solidity: function productFeePercentage() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) ProductFeePercentage(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "productFeePercentage") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// ProductFeePercentage is a free data retrieval call binding the contract method 0x63c67135. -// -// Solidity: function productFeePercentage() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) ProductFeePercentage() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.ProductFeePercentage(&_LiquidityBridgeContract.CallOpts) -} - -// ProductFeePercentage is a free data retrieval call binding the contract method 0x63c67135. -// -// Solidity: function productFeePercentage() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) ProductFeePercentage() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.ProductFeePercentage(&_LiquidityBridgeContract.CallOpts) -} - -// ProviderId is a free data retrieval call binding the contract method 0x8490a8df. -// -// Solidity: function providerId() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) ProviderId(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "providerId") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// ProviderId is a free data retrieval call binding the contract method 0x8490a8df. -// -// Solidity: function providerId() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) ProviderId() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.ProviderId(&_LiquidityBridgeContract.CallOpts) -} - -// ProviderId is a free data retrieval call binding the contract method 0x8490a8df. -// -// Solidity: function providerId() view returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) ProviderId() (*big.Int, error) { - return _LiquidityBridgeContract.Contract.ProviderId(&_LiquidityBridgeContract.CallOpts) -} - -// ValidatePeginDepositAddress is a free data retrieval call binding the contract method 0x79b9550b. -// -// Solidity: function validatePeginDepositAddress((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes depositAddress) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCaller) ValidatePeginDepositAddress(opts *bind.CallOpts, quote QuotesPeginQuote, depositAddress []byte) (bool, error) { - var out []interface{} - err := _LiquidityBridgeContract.contract.Call(opts, &out, "validatePeginDepositAddress", quote, depositAddress) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// ValidatePeginDepositAddress is a free data retrieval call binding the contract method 0x79b9550b. -// -// Solidity: function validatePeginDepositAddress((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes depositAddress) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) ValidatePeginDepositAddress(quote QuotesPeginQuote, depositAddress []byte) (bool, error) { - return _LiquidityBridgeContract.Contract.ValidatePeginDepositAddress(&_LiquidityBridgeContract.CallOpts, quote, depositAddress) -} - -// ValidatePeginDepositAddress is a free data retrieval call binding the contract method 0x79b9550b. -// -// Solidity: function validatePeginDepositAddress((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes depositAddress) view returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractCallerSession) ValidatePeginDepositAddress(quote QuotesPeginQuote, depositAddress []byte) (bool, error) { - return _LiquidityBridgeContract.Contract.ValidatePeginDepositAddress(&_LiquidityBridgeContract.CallOpts, quote, depositAddress) -} - -// AddCollateral is a paid mutator transaction binding the contract method 0x9e816999. -// -// Solidity: function addCollateral() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) AddCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "addCollateral") -} - -// AddCollateral is a paid mutator transaction binding the contract method 0x9e816999. -// -// Solidity: function addCollateral() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) AddCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.AddCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// AddCollateral is a paid mutator transaction binding the contract method 0x9e816999. -// -// Solidity: function addCollateral() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) AddCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.AddCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// AddPegoutCollateral is a paid mutator transaction binding the contract method 0x4198687e. -// -// Solidity: function addPegoutCollateral() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) AddPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "addPegoutCollateral") -} - -// AddPegoutCollateral is a paid mutator transaction binding the contract method 0x4198687e. -// -// Solidity: function addPegoutCollateral() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) AddPegoutCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.AddPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// AddPegoutCollateral is a paid mutator transaction binding the contract method 0x4198687e. -// -// Solidity: function addPegoutCollateral() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) AddPegoutCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.AddPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// CallForUser is a paid mutator transaction binding the contract method 0x7aefa8c2. -// -// Solidity: function callForUser((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) payable returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) CallForUser(opts *bind.TransactOpts, quote QuotesPeginQuote) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "callForUser", quote) -} - -// CallForUser is a paid mutator transaction binding the contract method 0x7aefa8c2. -// -// Solidity: function callForUser((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) payable returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) CallForUser(quote QuotesPeginQuote) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.CallForUser(&_LiquidityBridgeContract.TransactOpts, quote) -} - -// CallForUser is a paid mutator transaction binding the contract method 0x7aefa8c2. -// -// Solidity: function callForUser((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote) payable returns(bool) -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) CallForUser(quote QuotesPeginQuote) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.CallForUser(&_LiquidityBridgeContract.TransactOpts, quote) -} - -// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0. -// -// Solidity: function deposit() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Deposit(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "deposit") -} - -// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0. -// -// Solidity: function deposit() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Deposit() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Deposit(&_LiquidityBridgeContract.TransactOpts) -} - -// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0. -// -// Solidity: function deposit() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Deposit() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Deposit(&_LiquidityBridgeContract.TransactOpts) -} - -// DepositPegout is a paid mutator transaction binding the contract method 0x8beb537a. -// -// Solidity: function depositPegout((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote, bytes signature) payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) DepositPegout(opts *bind.TransactOpts, quote QuotesPegOutQuote, signature []byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "depositPegout", quote, signature) -} - -// DepositPegout is a paid mutator transaction binding the contract method 0x8beb537a. -// -// Solidity: function depositPegout((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote, bytes signature) payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) DepositPegout(quote QuotesPegOutQuote, signature []byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.DepositPegout(&_LiquidityBridgeContract.TransactOpts, quote, signature) -} - -// DepositPegout is a paid mutator transaction binding the contract method 0x8beb537a. -// -// Solidity: function depositPegout((address,address,bytes,address,bytes,uint256,uint256,int64,bytes,uint256,uint32,uint32,uint16,uint16,uint32,uint32,uint32,uint256,uint256) quote, bytes signature) payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) DepositPegout(quote QuotesPegOutQuote, signature []byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.DepositPegout(&_LiquidityBridgeContract.TransactOpts, quote, signature) -} - -// InitializeV2 is a paid mutator transaction binding the contract method 0x2490fe36. -// -// Solidity: function initializeV2(uint256 _productFeePercentage, address _daoFeeCollectorAddress) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) InitializeV2(opts *bind.TransactOpts, _productFeePercentage *big.Int, _daoFeeCollectorAddress common.Address) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "initializeV2", _productFeePercentage, _daoFeeCollectorAddress) -} - -// InitializeV2 is a paid mutator transaction binding the contract method 0x2490fe36. -// -// Solidity: function initializeV2(uint256 _productFeePercentage, address _daoFeeCollectorAddress) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) InitializeV2(_productFeePercentage *big.Int, _daoFeeCollectorAddress common.Address) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.InitializeV2(&_LiquidityBridgeContract.TransactOpts, _productFeePercentage, _daoFeeCollectorAddress) -} - -// InitializeV2 is a paid mutator transaction binding the contract method 0x2490fe36. -// -// Solidity: function initializeV2(uint256 _productFeePercentage, address _daoFeeCollectorAddress) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) InitializeV2(_productFeePercentage *big.Int, _daoFeeCollectorAddress common.Address) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.InitializeV2(&_LiquidityBridgeContract.TransactOpts, _productFeePercentage, _daoFeeCollectorAddress) -} - -// RefundPegOut is a paid mutator transaction binding the contract method 0xd6c70de8. -// -// Solidity: function refundPegOut(bytes32 quoteHash, bytes btcTx, bytes32 btcBlockHeaderHash, uint256 partialMerkleTree, bytes32[] merkleBranchHashes) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "refundPegOut", quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) -} - -// RefundPegOut is a paid mutator transaction binding the contract method 0xd6c70de8. -// -// Solidity: function refundPegOut(bytes32 quoteHash, bytes btcTx, bytes32 btcBlockHeaderHash, uint256 partialMerkleTree, bytes32[] merkleBranchHashes) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RefundPegOut(quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RefundPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) -} - -// RefundPegOut is a paid mutator transaction binding the contract method 0xd6c70de8. -// -// Solidity: function refundPegOut(bytes32 quoteHash, bytes btcTx, bytes32 btcBlockHeaderHash, uint256 partialMerkleTree, bytes32[] merkleBranchHashes) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RefundPegOut(quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RefundPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) -} - -// RefundUserPegOut is a paid mutator transaction binding the contract method 0x8f91797d. -// -// Solidity: function refundUserPegOut(bytes32 quoteHash) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RefundUserPegOut(opts *bind.TransactOpts, quoteHash [32]byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "refundUserPegOut", quoteHash) -} - -// RefundUserPegOut is a paid mutator transaction binding the contract method 0x8f91797d. -// -// Solidity: function refundUserPegOut(bytes32 quoteHash) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RefundUserPegOut(quoteHash [32]byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RefundUserPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash) -} - -// RefundUserPegOut is a paid mutator transaction binding the contract method 0x8f91797d. -// -// Solidity: function refundUserPegOut(bytes32 quoteHash) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RefundUserPegOut(quoteHash [32]byte) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RefundUserPegOut(&_LiquidityBridgeContract.TransactOpts, quoteHash) -} - -// Register is a paid mutator transaction binding the contract method 0x41705518. -// -// Solidity: function register(string _name, string _apiBaseUrl, bool _status, string _providerType) payable returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Register(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "register", _name, _apiBaseUrl, _status, _providerType) -} - -// Register is a paid mutator transaction binding the contract method 0x41705518. -// -// Solidity: function register(string _name, string _apiBaseUrl, bool _status, string _providerType) payable returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Register(_name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Register(&_LiquidityBridgeContract.TransactOpts, _name, _apiBaseUrl, _status, _providerType) -} - -// Register is a paid mutator transaction binding the contract method 0x41705518. -// -// Solidity: function register(string _name, string _apiBaseUrl, bool _status, string _providerType) payable returns(uint256) -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Register(_name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Register(&_LiquidityBridgeContract.TransactOpts, _name, _apiBaseUrl, _status, _providerType) -} - -// RegisterPegIn is a paid mutator transaction binding the contract method 0x2d67952c. -// -// Solidity: function registerPegIn((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes signature, bytes btcRawTransaction, bytes partialMerkleTree, uint256 height) returns(int256) -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RegisterPegIn(opts *bind.TransactOpts, quote QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "registerPegIn", quote, signature, btcRawTransaction, partialMerkleTree, height) -} - -// RegisterPegIn is a paid mutator transaction binding the contract method 0x2d67952c. -// -// Solidity: function registerPegIn((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes signature, bytes btcRawTransaction, bytes partialMerkleTree, uint256 height) returns(int256) -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RegisterPegIn(quote QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RegisterPegIn(&_LiquidityBridgeContract.TransactOpts, quote, signature, btcRawTransaction, partialMerkleTree, height) -} - -// RegisterPegIn is a paid mutator transaction binding the contract method 0x2d67952c. -// -// Solidity: function registerPegIn((bytes20,address,address,bytes,address,bytes,uint256,uint256,address,bytes,uint32,int64,uint256,uint32,uint32,uint32,uint16,bool,uint256,uint256) quote, bytes signature, bytes btcRawTransaction, bytes partialMerkleTree, uint256 height) returns(int256) -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RegisterPegIn(quote QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RegisterPegIn(&_LiquidityBridgeContract.TransactOpts, quote, signature, btcRawTransaction, partialMerkleTree, height) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) RenounceOwnership() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RenounceOwnership(&_LiquidityBridgeContract.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.RenounceOwnership(&_LiquidityBridgeContract.TransactOpts) -} - -// Resign is a paid mutator transaction binding the contract method 0x69652fcf. -// -// Solidity: function resign() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Resign(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "resign") -} - -// Resign is a paid mutator transaction binding the contract method 0x69652fcf. -// -// Solidity: function resign() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Resign() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Resign(&_LiquidityBridgeContract.TransactOpts) -} - -// Resign is a paid mutator transaction binding the contract method 0x69652fcf. -// -// Solidity: function resign() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Resign() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Resign(&_LiquidityBridgeContract.TransactOpts) -} - -// SetProviderStatus is a paid mutator transaction binding the contract method 0x72cbf4e8. -// -// Solidity: function setProviderStatus(uint256 _providerId, bool status) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) SetProviderStatus(opts *bind.TransactOpts, _providerId *big.Int, status bool) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "setProviderStatus", _providerId, status) -} - -// SetProviderStatus is a paid mutator transaction binding the contract method 0x72cbf4e8. -// -// Solidity: function setProviderStatus(uint256 _providerId, bool status) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) SetProviderStatus(_providerId *big.Int, status bool) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.SetProviderStatus(&_LiquidityBridgeContract.TransactOpts, _providerId, status) -} - -// SetProviderStatus is a paid mutator transaction binding the contract method 0x72cbf4e8. -// -// Solidity: function setProviderStatus(uint256 _providerId, bool status) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) SetProviderStatus(_providerId *big.Int, status bool) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.SetProviderStatus(&_LiquidityBridgeContract.TransactOpts, _providerId, status) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.TransferOwnership(&_LiquidityBridgeContract.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.TransferOwnership(&_LiquidityBridgeContract.TransactOpts, newOwner) -} - -// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d. -// -// Solidity: function withdraw(uint256 amount) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Withdraw(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "withdraw", amount) -} - -// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d. -// -// Solidity: function withdraw(uint256 amount) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Withdraw(amount *big.Int) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Withdraw(&_LiquidityBridgeContract.TransactOpts, amount) -} - -// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d. -// -// Solidity: function withdraw(uint256 amount) returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Withdraw(amount *big.Int) (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Withdraw(&_LiquidityBridgeContract.TransactOpts, amount) -} - -// WithdrawCollateral is a paid mutator transaction binding the contract method 0x59c153be. -// -// Solidity: function withdrawCollateral() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) WithdrawCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "withdrawCollateral") -} - -// WithdrawCollateral is a paid mutator transaction binding the contract method 0x59c153be. -// -// Solidity: function withdrawCollateral() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) WithdrawCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.WithdrawCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// WithdrawCollateral is a paid mutator transaction binding the contract method 0x59c153be. -// -// Solidity: function withdrawCollateral() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) WithdrawCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.WithdrawCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// WithdrawPegoutCollateral is a paid mutator transaction binding the contract method 0x35510a7d. -// -// Solidity: function withdrawPegoutCollateral() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) WithdrawPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.Transact(opts, "withdrawPegoutCollateral") -} - -// WithdrawPegoutCollateral is a paid mutator transaction binding the contract method 0x35510a7d. -// -// Solidity: function withdrawPegoutCollateral() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) WithdrawPegoutCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.WithdrawPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// WithdrawPegoutCollateral is a paid mutator transaction binding the contract method 0x35510a7d. -// -// Solidity: function withdrawPegoutCollateral() returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) WithdrawPegoutCollateral() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.WithdrawPegoutCollateral(&_LiquidityBridgeContract.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LiquidityBridgeContract.contract.RawTransact(opts, nil) // calldata is disallowed for receive function -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractSession) Receive() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Receive(&_LiquidityBridgeContract.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_LiquidityBridgeContract *LiquidityBridgeContractTransactorSession) Receive() (*types.Transaction, error) { - return _LiquidityBridgeContract.Contract.Receive(&_LiquidityBridgeContract.TransactOpts) -} - -// LiquidityBridgeContractBalanceDecreaseIterator is returned from FilterBalanceDecrease and is used to iterate over the raw logs and unpacked data for BalanceDecrease events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractBalanceDecreaseIterator struct { - Event *LiquidityBridgeContractBalanceDecrease // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractBalanceDecreaseIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractBalanceDecrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractBalanceDecrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractBalanceDecreaseIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractBalanceDecreaseIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractBalanceDecrease represents a BalanceDecrease event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractBalanceDecrease struct { - Dest common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBalanceDecrease is a free log retrieval operation binding the contract event 0x8e51a4493a6f66c76e13fd9e3b754eafbfe21343c04508deb61be8ccc0064587. -// -// Solidity: event BalanceDecrease(address dest, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterBalanceDecrease(opts *bind.FilterOpts) (*LiquidityBridgeContractBalanceDecreaseIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "BalanceDecrease") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractBalanceDecreaseIterator{contract: _LiquidityBridgeContract.contract, event: "BalanceDecrease", logs: logs, sub: sub}, nil -} - -// WatchBalanceDecrease is a free log subscription operation binding the contract event 0x8e51a4493a6f66c76e13fd9e3b754eafbfe21343c04508deb61be8ccc0064587. -// -// Solidity: event BalanceDecrease(address dest, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchBalanceDecrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractBalanceDecrease) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "BalanceDecrease") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractBalanceDecrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceDecrease", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBalanceDecrease is a log parse operation binding the contract event 0x8e51a4493a6f66c76e13fd9e3b754eafbfe21343c04508deb61be8ccc0064587. -// -// Solidity: event BalanceDecrease(address dest, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseBalanceDecrease(log types.Log) (*LiquidityBridgeContractBalanceDecrease, error) { - event := new(LiquidityBridgeContractBalanceDecrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceDecrease", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractBalanceIncreaseIterator is returned from FilterBalanceIncrease and is used to iterate over the raw logs and unpacked data for BalanceIncrease events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractBalanceIncreaseIterator struct { - Event *LiquidityBridgeContractBalanceIncrease // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractBalanceIncreaseIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractBalanceIncrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractBalanceIncrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractBalanceIncreaseIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractBalanceIncreaseIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractBalanceIncrease represents a BalanceIncrease event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractBalanceIncrease struct { - Dest common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBalanceIncrease is a free log retrieval operation binding the contract event 0x42cfb81a915ac5a674852db250bf722637bee705a267633b68cab3a2dde06f53. -// -// Solidity: event BalanceIncrease(address dest, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterBalanceIncrease(opts *bind.FilterOpts) (*LiquidityBridgeContractBalanceIncreaseIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "BalanceIncrease") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractBalanceIncreaseIterator{contract: _LiquidityBridgeContract.contract, event: "BalanceIncrease", logs: logs, sub: sub}, nil -} - -// WatchBalanceIncrease is a free log subscription operation binding the contract event 0x42cfb81a915ac5a674852db250bf722637bee705a267633b68cab3a2dde06f53. -// -// Solidity: event BalanceIncrease(address dest, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchBalanceIncrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractBalanceIncrease) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "BalanceIncrease") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractBalanceIncrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceIncrease", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBalanceIncrease is a log parse operation binding the contract event 0x42cfb81a915ac5a674852db250bf722637bee705a267633b68cab3a2dde06f53. -// -// Solidity: event BalanceIncrease(address dest, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseBalanceIncrease(log types.Log) (*LiquidityBridgeContractBalanceIncrease, error) { - event := new(LiquidityBridgeContractBalanceIncrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BalanceIncrease", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractBridgeCapExceededIterator is returned from FilterBridgeCapExceeded and is used to iterate over the raw logs and unpacked data for BridgeCapExceeded events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractBridgeCapExceededIterator struct { - Event *LiquidityBridgeContractBridgeCapExceeded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractBridgeCapExceededIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractBridgeCapExceeded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractBridgeCapExceeded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractBridgeCapExceededIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractBridgeCapExceededIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractBridgeCapExceeded represents a BridgeCapExceeded event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractBridgeCapExceeded struct { - QuoteHash [32]byte - ErrorCode *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBridgeCapExceeded is a free log retrieval operation binding the contract event 0xfb209329d5ab5b7bcb2e92f45f4534814b6e68fa5ad1f171dabc1d17d26f0ebe. -// -// Solidity: event BridgeCapExceeded(bytes32 quoteHash, int256 errorCode) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterBridgeCapExceeded(opts *bind.FilterOpts) (*LiquidityBridgeContractBridgeCapExceededIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "BridgeCapExceeded") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractBridgeCapExceededIterator{contract: _LiquidityBridgeContract.contract, event: "BridgeCapExceeded", logs: logs, sub: sub}, nil -} - -// WatchBridgeCapExceeded is a free log subscription operation binding the contract event 0xfb209329d5ab5b7bcb2e92f45f4534814b6e68fa5ad1f171dabc1d17d26f0ebe. -// -// Solidity: event BridgeCapExceeded(bytes32 quoteHash, int256 errorCode) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchBridgeCapExceeded(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractBridgeCapExceeded) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "BridgeCapExceeded") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractBridgeCapExceeded) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BridgeCapExceeded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBridgeCapExceeded is a log parse operation binding the contract event 0xfb209329d5ab5b7bcb2e92f45f4534814b6e68fa5ad1f171dabc1d17d26f0ebe. -// -// Solidity: event BridgeCapExceeded(bytes32 quoteHash, int256 errorCode) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseBridgeCapExceeded(log types.Log) (*LiquidityBridgeContractBridgeCapExceeded, error) { - event := new(LiquidityBridgeContractBridgeCapExceeded) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "BridgeCapExceeded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractCallForUserIterator is returned from FilterCallForUser and is used to iterate over the raw logs and unpacked data for CallForUser events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractCallForUserIterator struct { - Event *LiquidityBridgeContractCallForUser // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractCallForUserIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractCallForUser) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractCallForUser) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractCallForUserIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractCallForUserIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractCallForUser represents a CallForUser event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractCallForUser struct { - From common.Address - Dest common.Address - GasLimit *big.Int - Value *big.Int - Data []byte - Success bool - QuoteHash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterCallForUser is a free log retrieval operation binding the contract event 0xbfc7404e6fe464f0646fe2c6ab942b92d56be722bb39f8c6bc4830d2d32fb80d. -// -// Solidity: event CallForUser(address indexed from, address indexed dest, uint256 gasLimit, uint256 value, bytes data, bool success, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterCallForUser(opts *bind.FilterOpts, from []common.Address, dest []common.Address) (*LiquidityBridgeContractCallForUserIterator, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var destRule []interface{} - for _, destItem := range dest { - destRule = append(destRule, destItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "CallForUser", fromRule, destRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractCallForUserIterator{contract: _LiquidityBridgeContract.contract, event: "CallForUser", logs: logs, sub: sub}, nil -} - -// WatchCallForUser is a free log subscription operation binding the contract event 0xbfc7404e6fe464f0646fe2c6ab942b92d56be722bb39f8c6bc4830d2d32fb80d. -// -// Solidity: event CallForUser(address indexed from, address indexed dest, uint256 gasLimit, uint256 value, bytes data, bool success, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchCallForUser(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractCallForUser, from []common.Address, dest []common.Address) (event.Subscription, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var destRule []interface{} - for _, destItem := range dest { - destRule = append(destRule, destItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "CallForUser", fromRule, destRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractCallForUser) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CallForUser", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseCallForUser is a log parse operation binding the contract event 0xbfc7404e6fe464f0646fe2c6ab942b92d56be722bb39f8c6bc4830d2d32fb80d. -// -// Solidity: event CallForUser(address indexed from, address indexed dest, uint256 gasLimit, uint256 value, bytes data, bool success, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseCallForUser(log types.Log) (*LiquidityBridgeContractCallForUser, error) { - event := new(LiquidityBridgeContractCallForUser) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CallForUser", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractCollateralIncreaseIterator is returned from FilterCollateralIncrease and is used to iterate over the raw logs and unpacked data for CollateralIncrease events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractCollateralIncreaseIterator struct { - Event *LiquidityBridgeContractCollateralIncrease // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractCollateralIncreaseIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractCollateralIncrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractCollateralIncrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractCollateralIncreaseIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractCollateralIncreaseIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractCollateralIncrease represents a CollateralIncrease event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractCollateralIncrease struct { - From common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterCollateralIncrease is a free log retrieval operation binding the contract event 0x456e0f4ea86ac283092c750200e8c877f6ad8901ae575f90e02081acd455af84. -// -// Solidity: event CollateralIncrease(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterCollateralIncrease(opts *bind.FilterOpts) (*LiquidityBridgeContractCollateralIncreaseIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "CollateralIncrease") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractCollateralIncreaseIterator{contract: _LiquidityBridgeContract.contract, event: "CollateralIncrease", logs: logs, sub: sub}, nil -} - -// WatchCollateralIncrease is a free log subscription operation binding the contract event 0x456e0f4ea86ac283092c750200e8c877f6ad8901ae575f90e02081acd455af84. -// -// Solidity: event CollateralIncrease(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchCollateralIncrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractCollateralIncrease) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "CollateralIncrease") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractCollateralIncrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CollateralIncrease", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseCollateralIncrease is a log parse operation binding the contract event 0x456e0f4ea86ac283092c750200e8c877f6ad8901ae575f90e02081acd455af84. -// -// Solidity: event CollateralIncrease(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseCollateralIncrease(log types.Log) (*LiquidityBridgeContractCollateralIncrease, error) { - event := new(LiquidityBridgeContractCollateralIncrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "CollateralIncrease", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractDaoFeeSentIterator is returned from FilterDaoFeeSent and is used to iterate over the raw logs and unpacked data for DaoFeeSent events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractDaoFeeSentIterator struct { - Event *LiquidityBridgeContractDaoFeeSent // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractDaoFeeSentIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractDaoFeeSent) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractDaoFeeSent) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractDaoFeeSentIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractDaoFeeSentIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractDaoFeeSent represents a DaoFeeSent event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractDaoFeeSent struct { - QuoteHash [32]byte - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDaoFeeSent is a free log retrieval operation binding the contract event 0x58e13ac0d5c8d27d14009841e72ac8b1858e2709c2c99af2075d9bb5f340ecfc. -// -// Solidity: event DaoFeeSent(bytes32 indexed quoteHash, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterDaoFeeSent(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractDaoFeeSentIterator, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "DaoFeeSent", quoteHashRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractDaoFeeSentIterator{contract: _LiquidityBridgeContract.contract, event: "DaoFeeSent", logs: logs, sub: sub}, nil -} - -// WatchDaoFeeSent is a free log subscription operation binding the contract event 0x58e13ac0d5c8d27d14009841e72ac8b1858e2709c2c99af2075d9bb5f340ecfc. -// -// Solidity: event DaoFeeSent(bytes32 indexed quoteHash, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchDaoFeeSent(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractDaoFeeSent, quoteHash [][32]byte) (event.Subscription, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "DaoFeeSent", quoteHashRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractDaoFeeSent) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "DaoFeeSent", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDaoFeeSent is a log parse operation binding the contract event 0x58e13ac0d5c8d27d14009841e72ac8b1858e2709c2c99af2075d9bb5f340ecfc. -// -// Solidity: event DaoFeeSent(bytes32 indexed quoteHash, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseDaoFeeSent(log types.Log) (*LiquidityBridgeContractDaoFeeSent, error) { - event := new(LiquidityBridgeContractDaoFeeSent) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "DaoFeeSent", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractInitializedIterator struct { - Event *LiquidityBridgeContractInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractInitialized represents a Initialized event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterInitialized(opts *bind.FilterOpts) (*LiquidityBridgeContractInitializedIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractInitializedIterator{contract: _LiquidityBridgeContract.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractInitialized) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractInitialized) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseInitialized(log types.Log) (*LiquidityBridgeContractInitialized, error) { - event := new(LiquidityBridgeContractInitialized) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractOwnershipTransferredIterator struct { - Event *LiquidityBridgeContractOwnershipTransferred // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractOwnershipTransferredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractOwnershipTransferred represents a OwnershipTransferred event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*LiquidityBridgeContractOwnershipTransferredIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractOwnershipTransferredIterator{contract: _LiquidityBridgeContract.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractOwnershipTransferred) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseOwnershipTransferred(log types.Log) (*LiquidityBridgeContractOwnershipTransferred, error) { - event := new(LiquidityBridgeContractOwnershipTransferred) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPegInRegisteredIterator is returned from FilterPegInRegistered and is used to iterate over the raw logs and unpacked data for PegInRegistered events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegInRegisteredIterator struct { - Event *LiquidityBridgeContractPegInRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPegInRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegInRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegInRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPegInRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPegInRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPegInRegistered represents a PegInRegistered event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegInRegistered struct { - QuoteHash [32]byte - TransferredAmount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPegInRegistered is a free log retrieval operation binding the contract event 0x0629ae9d1dc61501b0ca90670a9a9b88daaf7504b54537b53e1219de794c63d2. -// -// Solidity: event PegInRegistered(bytes32 indexed quoteHash, int256 transferredAmount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegInRegistered(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractPegInRegisteredIterator, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegInRegistered", quoteHashRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPegInRegisteredIterator{contract: _LiquidityBridgeContract.contract, event: "PegInRegistered", logs: logs, sub: sub}, nil -} - -// WatchPegInRegistered is a free log subscription operation binding the contract event 0x0629ae9d1dc61501b0ca90670a9a9b88daaf7504b54537b53e1219de794c63d2. -// -// Solidity: event PegInRegistered(bytes32 indexed quoteHash, int256 transferredAmount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegInRegistered(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegInRegistered, quoteHash [][32]byte) (event.Subscription, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegInRegistered", quoteHashRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPegInRegistered) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegInRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePegInRegistered is a log parse operation binding the contract event 0x0629ae9d1dc61501b0ca90670a9a9b88daaf7504b54537b53e1219de794c63d2. -// -// Solidity: event PegInRegistered(bytes32 indexed quoteHash, int256 transferredAmount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegInRegistered(log types.Log) (*LiquidityBridgeContractPegInRegistered, error) { - event := new(LiquidityBridgeContractPegInRegistered) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegInRegistered", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPegOutDepositIterator is returned from FilterPegOutDeposit and is used to iterate over the raw logs and unpacked data for PegOutDeposit events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegOutDepositIterator struct { - Event *LiquidityBridgeContractPegOutDeposit // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPegOutDepositIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegOutDeposit) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegOutDeposit) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPegOutDepositIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPegOutDepositIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPegOutDeposit represents a PegOutDeposit event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegOutDeposit struct { - QuoteHash [32]byte - Sender common.Address - Amount *big.Int - Timestamp *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPegOutDeposit is a free log retrieval operation binding the contract event 0xb1bc7bfc0dab19777eb03aa0a5643378fc9f186c8fc5a36620d21136fbea570f. -// -// Solidity: event PegOutDeposit(bytes32 indexed quoteHash, address indexed sender, uint256 amount, uint256 timestamp) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegOutDeposit(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address) (*LiquidityBridgeContractPegOutDepositIterator, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - var senderRule []interface{} - for _, senderItem := range sender { - senderRule = append(senderRule, senderItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegOutDeposit", quoteHashRule, senderRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPegOutDepositIterator{contract: _LiquidityBridgeContract.contract, event: "PegOutDeposit", logs: logs, sub: sub}, nil -} - -// WatchPegOutDeposit is a free log subscription operation binding the contract event 0xb1bc7bfc0dab19777eb03aa0a5643378fc9f186c8fc5a36620d21136fbea570f. -// -// Solidity: event PegOutDeposit(bytes32 indexed quoteHash, address indexed sender, uint256 amount, uint256 timestamp) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegOutDeposit(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegOutDeposit, quoteHash [][32]byte, sender []common.Address) (event.Subscription, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - var senderRule []interface{} - for _, senderItem := range sender { - senderRule = append(senderRule, senderItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegOutDeposit", quoteHashRule, senderRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPegOutDeposit) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutDeposit", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePegOutDeposit is a log parse operation binding the contract event 0xb1bc7bfc0dab19777eb03aa0a5643378fc9f186c8fc5a36620d21136fbea570f. -// -// Solidity: event PegOutDeposit(bytes32 indexed quoteHash, address indexed sender, uint256 amount, uint256 timestamp) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegOutDeposit(log types.Log) (*LiquidityBridgeContractPegOutDeposit, error) { - event := new(LiquidityBridgeContractPegOutDeposit) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutDeposit", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPegOutRefundedIterator is returned from FilterPegOutRefunded and is used to iterate over the raw logs and unpacked data for PegOutRefunded events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegOutRefundedIterator struct { - Event *LiquidityBridgeContractPegOutRefunded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPegOutRefundedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegOutRefunded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegOutRefunded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPegOutRefundedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPegOutRefundedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPegOutRefunded represents a PegOutRefunded event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegOutRefunded struct { - QuoteHash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPegOutRefunded is a free log retrieval operation binding the contract event 0xb781856ec73fd0dc39351043d1634ea22cd3277b0866ab93e7ec1801766bb384. -// -// Solidity: event PegOutRefunded(bytes32 indexed quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegOutRefunded(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractPegOutRefundedIterator, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegOutRefunded", quoteHashRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPegOutRefundedIterator{contract: _LiquidityBridgeContract.contract, event: "PegOutRefunded", logs: logs, sub: sub}, nil -} - -// WatchPegOutRefunded is a free log subscription operation binding the contract event 0xb781856ec73fd0dc39351043d1634ea22cd3277b0866ab93e7ec1801766bb384. -// -// Solidity: event PegOutRefunded(bytes32 indexed quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegOutRefunded(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegOutRefunded, quoteHash [][32]byte) (event.Subscription, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegOutRefunded", quoteHashRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPegOutRefunded) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutRefunded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePegOutRefunded is a log parse operation binding the contract event 0xb781856ec73fd0dc39351043d1634ea22cd3277b0866ab93e7ec1801766bb384. -// -// Solidity: event PegOutRefunded(bytes32 indexed quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegOutRefunded(log types.Log) (*LiquidityBridgeContractPegOutRefunded, error) { - event := new(LiquidityBridgeContractPegOutRefunded) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutRefunded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPegOutUserRefundedIterator is returned from FilterPegOutUserRefunded and is used to iterate over the raw logs and unpacked data for PegOutUserRefunded events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegOutUserRefundedIterator struct { - Event *LiquidityBridgeContractPegOutUserRefunded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPegOutUserRefundedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegOutUserRefunded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegOutUserRefunded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPegOutUserRefundedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPegOutUserRefundedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPegOutUserRefunded represents a PegOutUserRefunded event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegOutUserRefunded struct { - QuoteHash [32]byte - Value *big.Int - UserAddress common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPegOutUserRefunded is a free log retrieval operation binding the contract event 0x9ccbeffc442024e2a6ade18ff0978af9a4c4d6562ae38adb51ccf8256cf42b41. -// -// Solidity: event PegOutUserRefunded(bytes32 indexed quoteHash, uint256 value, address userAddress) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegOutUserRefunded(opts *bind.FilterOpts, quoteHash [][32]byte) (*LiquidityBridgeContractPegOutUserRefundedIterator, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegOutUserRefunded", quoteHashRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPegOutUserRefundedIterator{contract: _LiquidityBridgeContract.contract, event: "PegOutUserRefunded", logs: logs, sub: sub}, nil -} - -// WatchPegOutUserRefunded is a free log subscription operation binding the contract event 0x9ccbeffc442024e2a6ade18ff0978af9a4c4d6562ae38adb51ccf8256cf42b41. -// -// Solidity: event PegOutUserRefunded(bytes32 indexed quoteHash, uint256 value, address userAddress) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegOutUserRefunded(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegOutUserRefunded, quoteHash [][32]byte) (event.Subscription, error) { - - var quoteHashRule []interface{} - for _, quoteHashItem := range quoteHash { - quoteHashRule = append(quoteHashRule, quoteHashItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegOutUserRefunded", quoteHashRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPegOutUserRefunded) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutUserRefunded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePegOutUserRefunded is a log parse operation binding the contract event 0x9ccbeffc442024e2a6ade18ff0978af9a4c4d6562ae38adb51ccf8256cf42b41. -// -// Solidity: event PegOutUserRefunded(bytes32 indexed quoteHash, uint256 value, address userAddress) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegOutUserRefunded(log types.Log) (*LiquidityBridgeContractPegOutUserRefunded, error) { - event := new(LiquidityBridgeContractPegOutUserRefunded) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegOutUserRefunded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPegoutCollateralIncreaseIterator is returned from FilterPegoutCollateralIncrease and is used to iterate over the raw logs and unpacked data for PegoutCollateralIncrease events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegoutCollateralIncreaseIterator struct { - Event *LiquidityBridgeContractPegoutCollateralIncrease // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPegoutCollateralIncreaseIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegoutCollateralIncrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegoutCollateralIncrease) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPegoutCollateralIncreaseIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPegoutCollateralIncreaseIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPegoutCollateralIncrease represents a PegoutCollateralIncrease event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegoutCollateralIncrease struct { - From common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPegoutCollateralIncrease is a free log retrieval operation binding the contract event 0x873d5a2949567203ad4f0cceef41c2813c87b9a397ee777d87a8acdaec2c6fa9. -// -// Solidity: event PegoutCollateralIncrease(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegoutCollateralIncrease(opts *bind.FilterOpts) (*LiquidityBridgeContractPegoutCollateralIncreaseIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegoutCollateralIncrease") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPegoutCollateralIncreaseIterator{contract: _LiquidityBridgeContract.contract, event: "PegoutCollateralIncrease", logs: logs, sub: sub}, nil -} - -// WatchPegoutCollateralIncrease is a free log subscription operation binding the contract event 0x873d5a2949567203ad4f0cceef41c2813c87b9a397ee777d87a8acdaec2c6fa9. -// -// Solidity: event PegoutCollateralIncrease(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegoutCollateralIncrease(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegoutCollateralIncrease) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegoutCollateralIncrease") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPegoutCollateralIncrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutCollateralIncrease", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePegoutCollateralIncrease is a log parse operation binding the contract event 0x873d5a2949567203ad4f0cceef41c2813c87b9a397ee777d87a8acdaec2c6fa9. -// -// Solidity: event PegoutCollateralIncrease(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegoutCollateralIncrease(log types.Log) (*LiquidityBridgeContractPegoutCollateralIncrease, error) { - event := new(LiquidityBridgeContractPegoutCollateralIncrease) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutCollateralIncrease", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPegoutWithdrawCollateralIterator is returned from FilterPegoutWithdrawCollateral and is used to iterate over the raw logs and unpacked data for PegoutWithdrawCollateral events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegoutWithdrawCollateralIterator struct { - Event *LiquidityBridgeContractPegoutWithdrawCollateral // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPegoutWithdrawCollateralIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegoutWithdrawCollateral) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPegoutWithdrawCollateral) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPegoutWithdrawCollateralIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPegoutWithdrawCollateralIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPegoutWithdrawCollateral represents a PegoutWithdrawCollateral event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPegoutWithdrawCollateral struct { - From common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPegoutWithdrawCollateral is a free log retrieval operation binding the contract event 0xfc72299650b405e7b0480ca8fb0fb3948fb10a77ac02f797cc9de1f4aaa55db7. -// -// Solidity: event PegoutWithdrawCollateral(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPegoutWithdrawCollateral(opts *bind.FilterOpts) (*LiquidityBridgeContractPegoutWithdrawCollateralIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "PegoutWithdrawCollateral") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPegoutWithdrawCollateralIterator{contract: _LiquidityBridgeContract.contract, event: "PegoutWithdrawCollateral", logs: logs, sub: sub}, nil -} - -// WatchPegoutWithdrawCollateral is a free log subscription operation binding the contract event 0xfc72299650b405e7b0480ca8fb0fb3948fb10a77ac02f797cc9de1f4aaa55db7. -// -// Solidity: event PegoutWithdrawCollateral(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPegoutWithdrawCollateral(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPegoutWithdrawCollateral) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "PegoutWithdrawCollateral") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPegoutWithdrawCollateral) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutWithdrawCollateral", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePegoutWithdrawCollateral is a log parse operation binding the contract event 0xfc72299650b405e7b0480ca8fb0fb3948fb10a77ac02f797cc9de1f4aaa55db7. -// -// Solidity: event PegoutWithdrawCollateral(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePegoutWithdrawCollateral(log types.Log) (*LiquidityBridgeContractPegoutWithdrawCollateral, error) { - event := new(LiquidityBridgeContractPegoutWithdrawCollateral) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "PegoutWithdrawCollateral", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractPenalizedIterator is returned from FilterPenalized and is used to iterate over the raw logs and unpacked data for Penalized events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPenalizedIterator struct { - Event *LiquidityBridgeContractPenalized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractPenalizedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPenalized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractPenalized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractPenalizedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractPenalizedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractPenalized represents a Penalized event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractPenalized struct { - LiquidityProvider common.Address - Penalty *big.Int - QuoteHash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPenalized is a free log retrieval operation binding the contract event 0x9685484093cc596fdaeab51abf645b1753dbb7d869bfd2eb21e2c646e47a36f4. -// -// Solidity: event Penalized(address liquidityProvider, uint256 penalty, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterPenalized(opts *bind.FilterOpts) (*LiquidityBridgeContractPenalizedIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Penalized") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractPenalizedIterator{contract: _LiquidityBridgeContract.contract, event: "Penalized", logs: logs, sub: sub}, nil -} - -// WatchPenalized is a free log subscription operation binding the contract event 0x9685484093cc596fdaeab51abf645b1753dbb7d869bfd2eb21e2c646e47a36f4. -// -// Solidity: event Penalized(address liquidityProvider, uint256 penalty, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchPenalized(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractPenalized) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Penalized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractPenalized) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Penalized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePenalized is a log parse operation binding the contract event 0x9685484093cc596fdaeab51abf645b1753dbb7d869bfd2eb21e2c646e47a36f4. -// -// Solidity: event Penalized(address liquidityProvider, uint256 penalty, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParsePenalized(log types.Log) (*LiquidityBridgeContractPenalized, error) { - event := new(LiquidityBridgeContractPenalized) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Penalized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractRefundIterator is returned from FilterRefund and is used to iterate over the raw logs and unpacked data for Refund events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractRefundIterator struct { - Event *LiquidityBridgeContractRefund // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractRefundIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractRefund) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractRefund) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractRefundIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractRefundIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractRefund represents a Refund event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractRefund struct { - Dest common.Address - Amount *big.Int - Success bool - QuoteHash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterRefund is a free log retrieval operation binding the contract event 0x3052ea2f7e0d74fdc1c1e1f858ff1ae3d91ab1609717c3efedb95db603b255f6. -// -// Solidity: event Refund(address dest, uint256 amount, bool success, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterRefund(opts *bind.FilterOpts) (*LiquidityBridgeContractRefundIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Refund") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractRefundIterator{contract: _LiquidityBridgeContract.contract, event: "Refund", logs: logs, sub: sub}, nil -} - -// WatchRefund is a free log subscription operation binding the contract event 0x3052ea2f7e0d74fdc1c1e1f858ff1ae3d91ab1609717c3efedb95db603b255f6. -// -// Solidity: event Refund(address dest, uint256 amount, bool success, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchRefund(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractRefund) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Refund") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractRefund) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Refund", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseRefund is a log parse operation binding the contract event 0x3052ea2f7e0d74fdc1c1e1f858ff1ae3d91ab1609717c3efedb95db603b255f6. -// -// Solidity: event Refund(address dest, uint256 amount, bool success, bytes32 quoteHash) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseRefund(log types.Log) (*LiquidityBridgeContractRefund, error) { - event := new(LiquidityBridgeContractRefund) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Refund", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractRegisterIterator is returned from FilterRegister and is used to iterate over the raw logs and unpacked data for Register events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractRegisterIterator struct { - Event *LiquidityBridgeContractRegister // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractRegisterIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractRegister) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractRegister) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractRegisterIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractRegisterIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractRegister represents a Register event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractRegister struct { - Id *big.Int - From common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterRegister is a free log retrieval operation binding the contract event 0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e. -// -// Solidity: event Register(uint256 id, address indexed from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterRegister(opts *bind.FilterOpts, from []common.Address) (*LiquidityBridgeContractRegisterIterator, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Register", fromRule) - if err != nil { - return nil, err - } - return &LiquidityBridgeContractRegisterIterator{contract: _LiquidityBridgeContract.contract, event: "Register", logs: logs, sub: sub}, nil -} - -// WatchRegister is a free log subscription operation binding the contract event 0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e. -// -// Solidity: event Register(uint256 id, address indexed from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchRegister(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractRegister, from []common.Address) (event.Subscription, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Register", fromRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractRegister) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Register", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseRegister is a log parse operation binding the contract event 0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e. -// -// Solidity: event Register(uint256 id, address indexed from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseRegister(log types.Log) (*LiquidityBridgeContractRegister, error) { - event := new(LiquidityBridgeContractRegister) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Register", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractResignedIterator is returned from FilterResigned and is used to iterate over the raw logs and unpacked data for Resigned events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractResignedIterator struct { - Event *LiquidityBridgeContractResigned // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractResignedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractResigned) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractResigned) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractResignedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractResignedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractResigned represents a Resigned event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractResigned struct { - From common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterResigned is a free log retrieval operation binding the contract event 0xa6674aa33cd1b7435474751667707bf05fde99e537d67043ec5f907782577d86. -// -// Solidity: event Resigned(address from) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterResigned(opts *bind.FilterOpts) (*LiquidityBridgeContractResignedIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Resigned") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractResignedIterator{contract: _LiquidityBridgeContract.contract, event: "Resigned", logs: logs, sub: sub}, nil -} - -// WatchResigned is a free log subscription operation binding the contract event 0xa6674aa33cd1b7435474751667707bf05fde99e537d67043ec5f907782577d86. -// -// Solidity: event Resigned(address from) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchResigned(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractResigned) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Resigned") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractResigned) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Resigned", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseResigned is a log parse operation binding the contract event 0xa6674aa33cd1b7435474751667707bf05fde99e537d67043ec5f907782577d86. -// -// Solidity: event Resigned(address from) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseResigned(log types.Log) (*LiquidityBridgeContractResigned, error) { - event := new(LiquidityBridgeContractResigned) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Resigned", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractWithdrawCollateralIterator is returned from FilterWithdrawCollateral and is used to iterate over the raw logs and unpacked data for WithdrawCollateral events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractWithdrawCollateralIterator struct { - Event *LiquidityBridgeContractWithdrawCollateral // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractWithdrawCollateralIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractWithdrawCollateral) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractWithdrawCollateral) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractWithdrawCollateralIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractWithdrawCollateralIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractWithdrawCollateral represents a WithdrawCollateral event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractWithdrawCollateral struct { - From common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterWithdrawCollateral is a free log retrieval operation binding the contract event 0xa8e76b822fc682be77f3b1c822ea81f6bda5aed92ba82e6873bfd889f328d1d2. -// -// Solidity: event WithdrawCollateral(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterWithdrawCollateral(opts *bind.FilterOpts) (*LiquidityBridgeContractWithdrawCollateralIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "WithdrawCollateral") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractWithdrawCollateralIterator{contract: _LiquidityBridgeContract.contract, event: "WithdrawCollateral", logs: logs, sub: sub}, nil -} - -// WatchWithdrawCollateral is a free log subscription operation binding the contract event 0xa8e76b822fc682be77f3b1c822ea81f6bda5aed92ba82e6873bfd889f328d1d2. -// -// Solidity: event WithdrawCollateral(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchWithdrawCollateral(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractWithdrawCollateral) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "WithdrawCollateral") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractWithdrawCollateral) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "WithdrawCollateral", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseWithdrawCollateral is a log parse operation binding the contract event 0xa8e76b822fc682be77f3b1c822ea81f6bda5aed92ba82e6873bfd889f328d1d2. -// -// Solidity: event WithdrawCollateral(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseWithdrawCollateral(log types.Log) (*LiquidityBridgeContractWithdrawCollateral, error) { - event := new(LiquidityBridgeContractWithdrawCollateral) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "WithdrawCollateral", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LiquidityBridgeContractWithdrawalIterator is returned from FilterWithdrawal and is used to iterate over the raw logs and unpacked data for Withdrawal events raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractWithdrawalIterator struct { - Event *LiquidityBridgeContractWithdrawal // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LiquidityBridgeContractWithdrawalIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractWithdrawal) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LiquidityBridgeContractWithdrawal) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LiquidityBridgeContractWithdrawalIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LiquidityBridgeContractWithdrawalIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LiquidityBridgeContractWithdrawal represents a Withdrawal event raised by the LiquidityBridgeContract contract. -type LiquidityBridgeContractWithdrawal struct { - From common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterWithdrawal is a free log retrieval operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65. -// -// Solidity: event Withdrawal(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) FilterWithdrawal(opts *bind.FilterOpts) (*LiquidityBridgeContractWithdrawalIterator, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.FilterLogs(opts, "Withdrawal") - if err != nil { - return nil, err - } - return &LiquidityBridgeContractWithdrawalIterator{contract: _LiquidityBridgeContract.contract, event: "Withdrawal", logs: logs, sub: sub}, nil -} - -// WatchWithdrawal is a free log subscription operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65. -// -// Solidity: event Withdrawal(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) WatchWithdrawal(opts *bind.WatchOpts, sink chan<- *LiquidityBridgeContractWithdrawal) (event.Subscription, error) { - - logs, sub, err := _LiquidityBridgeContract.contract.WatchLogs(opts, "Withdrawal") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LiquidityBridgeContractWithdrawal) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Withdrawal", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseWithdrawal is a log parse operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65. -// -// Solidity: event Withdrawal(address from, uint256 amount) -func (_LiquidityBridgeContract *LiquidityBridgeContractFilterer) ParseWithdrawal(log types.Log) (*LiquidityBridgeContractWithdrawal, error) { - event := new(LiquidityBridgeContractWithdrawal) - if err := _LiquidityBridgeContract.contract.UnpackLog(event, "Withdrawal", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/connectors/bitcoin.go b/connectors/bitcoin.go deleted file mode 100644 index 1b51492e..00000000 --- a/connectors/bitcoin.go +++ /dev/null @@ -1,1148 +0,0 @@ -package connectors - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "github.com/rsksmart/liquidity-provider-server/pegout" - "math/big" - "regexp" - "time" - - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/btcutil/bloom" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/rpcclient" - "github.com/btcsuite/btcd/wire" - log "github.com/sirupsen/logrus" - - "encoding/hex" - - "github.com/btcsuite/btcd/blockchain" - "github.com/btcsuite/btcd/btcutil/base58" - "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcutil/bech32" - "github.com/ethereum/go-ethereum/crypto" -) - -const ( - unknownBtcdVersion = -1 - BTC_TO_SATOSHI = 100000000 - WalletUnlockSeconds = 30 -) - -type BtcConfig struct { - Endpoint string `env:"BTC_ENDPOINT"` - Username string `env:"BTC_USERNAME"` - Password string `env:"BTC_PASSWORD"` - Network string `env:"BTC_NETWORK"` - TxFeeRate float64 `env:"BTC_TX_FEE_RATE"` -} - -type AddressWatcherCompleteCallback = func(w AddressWatcher) - -type AddressWatcher interface { - OnNewConfirmation(txHash string, confirmations int64, amount btcutil.Amount) - OnExpire() - Done() <-chan struct{} -} - -type BTCConnector interface { - Connect(config BtcConfig) error - CheckConnection() error - AddAddressWatcher(address string, minBtcAmount btcutil.Amount, interval time.Duration, exp time.Time, w AddressWatcher, cb AddressWatcherCompleteCallback) error - AddAddressPegOutWatcher(txHash string, quote *pegout.Quote, interval time.Duration, exp time.Time, w AddressWatcher, cb AddressWatcherCompleteCallback) error - GetParams() chaincfg.Params - Close() - SerializePMT(txHash string) ([]byte, error) - SerializeTx(txHash string) ([]byte, error) - GetBlockNumberByTx(txHash string) (int64, error) - GetDerivedBitcoinAddress(fedInfo *FedInfo, userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) (string, error) - ComputeDerivationAddresss(userBtcRefundAddr []byte, quoteHash []byte) (string, error) - BuildMerkleBranch(txHash string) (*MerkleBranch, error) - SendBtc(address string, amount uint64) (string, error) - SendBtcWithOpReturn(address string, amount uint64, opReturnContent []byte) (string, error) - GetAvailableLiquidity() (*big.Int, error) - LockBtc(amount float64) error - UnlockBtc(amount float64) error - GetBlockHeaderHashByTx(txHash string) ([32]byte, error) - EstimateFees(address string, amountInSatoshi uint64) (uint64, error) -} - -type BTCClient interface { - ImportAddressRescan(address string, account string, rescan bool) error - GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) - GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) - ListUnspentMinMaxAddresses(minConf, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) - GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) - GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) - GetNetworkInfo() (*btcjson.GetNetworkInfoResult, error) - Disconnect() - SendToAddress(address btcutil.Address, amount btcutil.Amount) (*chainhash.Hash, error) - GetBalance(address string) (btcutil.Amount, error) - LockUnspent(shouldUnlock bool, txToUnlock []*wire.OutPoint) error - ListUnspent() ([]btcjson.ListUnspentResult, error) - ListLockUnspent() ([]*wire.OutPoint, error) - GetTxOut(txHash *chainhash.Hash, index uint32, mempool bool) (*btcjson.GetTxOutResult, error) - CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) - SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) - SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) - SetTxFee(fee btcutil.Amount) error - FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) - WalletCreateFundedPsbt( - inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, - options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool, - ) (*btcjson.WalletCreateFundedPsbtResult, error) - GetWalletInfo() (*btcjson.GetWalletInfoResult, error) - WalletPassphrase(passphrase string, timeoutSecs int64) error -} - -type BTC struct { - c BTCClient - params chaincfg.Params - TxDefaultFee int64 - TxFeeRate float64 - walletPassword string - encryptedWallet bool -} - -func NewBTC(network, walletPassword string, encryptedWallet bool) (*BTC, error) { - log.Debug("initializing BTC connector") - btc := BTC{} - switch network { - case "mainnet": - btc.params = chaincfg.MainNetParams - case "testnet": - btc.params = chaincfg.TestNet3Params - case "regtest": - btc.params = chaincfg.RegressionNetParams - default: - return nil, fmt.Errorf("invalid network name: %v", network) - } - btc.walletPassword = walletPassword - btc.encryptedWallet = encryptedWallet - return &btc, nil -} - -func (btc *BTC) Connect(btcConfig BtcConfig) error { - log.Debug("connecting to BTC node") - config := rpcclient.ConnConfig{ - Host: btcConfig.Endpoint, - User: btcConfig.Username, - Pass: btcConfig.Password, - Params: btc.params.Name, - DisableTLS: true, - HTTPPostMode: true, - } - c, err := rpcclient.New(&config, nil) - if err != nil { - return fmt.Errorf("RPC client error: %v", err) - } - - ver, err := checkBtcdVersion(c) - if err != nil { - return err - } - if ver == unknownBtcdVersion { - log.Warn("unable to detect btcd version, but it is up and running") - } else { - log.Debugf("detected btcd version: %v", ver) - } - - btc.c = c - btc.TxFeeRate = btcConfig.TxFeeRate - if btc.encryptedWallet { - if err = btc.unlockWallet(); err != nil { - return err - } - } - - return nil -} - -func (btc *BTC) CheckConnection() error { - _, err := checkBtcdVersion(btc.c) - return err -} - -func (btc *BTC) AddAddressWatcher(address string, minBtcAmount btcutil.Amount, interval time.Duration, exp time.Time, w AddressWatcher, cb AddressWatcherCompleteCallback) error { - btcAddr, err := btcutil.DecodeAddress(address, &btc.params) - if err != nil { - return err - } - - err = btc.c.ImportAddressRescan(address, "", false) - if err != nil { - return err - } - - go func(w AddressWatcher) { - ticker := time.NewTicker(interval) - var confirmations int64 - for { - select { - case <-ticker.C: - _ = btc.checkBtcAddr(w, btcAddr, minBtcAmount, exp, &confirmations, time.Now) - case <-w.Done(): - ticker.Stop() - cb(w) - return - } - } - }(w) - return nil -} - -func (btc *BTC) AddAddressPegOutWatcher(txHash string, quote *pegout.Quote, interval time.Duration, exp time.Time, w AddressWatcher, cb AddressWatcherCompleteCallback) error { - hash, err := chainhash.NewHashFromStr(txHash) - if err != nil { - return err - } - - go func(w AddressWatcher) { - ticker := time.NewTicker(interval) - for { - select { - case <-ticker.C: - _ = btc.checkBtcTransaction(w, hash, exp, quote.DepositConfirmations, time.Now) - case <-w.Done(): - ticker.Stop() - cb(w) - return - } - } - }(w) - return nil -} - -func (btc *BTC) checkBtcAddr(w AddressWatcher, btcAddr btcutil.Address, minBtcAmount btcutil.Amount, expTime time.Time, confirmations *int64, now func() time.Time) error { - log.Debugf("Derivation Address:: %v", btcAddr) - log.Debugf("minBtcAmount:: %v", minBtcAmount) - log.Debugf("confirmations:: %v", confirmations) - conf, amount, txHash, err := btc.getConfirmations(btcAddr, minBtcAmount) - if err != nil { - log.Error(err) - return err - } - - log.Debugf("amount:: %v", amount) - log.Debugf("txHash:: %v", txHash) - log.Debugf("expTime:: %v", expTime) - log.Debugf("now:: %v", now()) - - if amount < minBtcAmount && now().After(expTime) { - w.OnExpire() - return fmt.Errorf("time for depositing %v has elapsed; addr: %v", minBtcAmount, btcAddr) - } - - if conf > *confirmations { - *confirmations = conf - w.OnNewConfirmation(txHash, conf, amount) - branch, err := btc.BuildMerkleBranch(txHash) - if err != nil { - return err - } - - log.Debugf("Merkle Branch info :::: path:%v hashes:%v ", branch.Path, branch.Hashes) - - return nil - } - - return fmt.Errorf("num of confirmations has not advanced; conf: %v", conf) -} - -func (btc *BTC) checkBtcTransaction(w AddressWatcher, hash *chainhash.Hash, expTime time.Time, confirmations uint16, now func() time.Time) error { - tx, err := btc.c.GetTransaction(hash) - log.Debugf("Tx %v confirmations:: %v of %v", hash.String(), tx.Confirmations, confirmations) - if err != nil { - log.Error(err) - return err - } - log.Debugf("expTime:: %v", expTime) - log.Debugf("now:: %v", now()) - - if tx.Confirmations < int64(confirmations) && now().After(expTime) { - w.OnExpire() - return fmt.Errorf("time for deposit has elapsed; tx: %v", tx) - } - - var amount btcutil.Amount - var branch *MerkleBranch - if tx.Confirmations > int64(confirmations) { - amount, err = btcutil.NewAmount(tx.Amount) - w.OnNewConfirmation(hash.String(), tx.Confirmations, amount) - branch, err = btc.BuildMerkleBranch(hash.String()) - if err != nil { - return err - } - - log.Debugf("Merkle Branch info :::: path:%v hashes:%v ", branch.Path, branch.Hashes) - return nil - } - - return fmt.Errorf("num of confirmations has not advanced; conf: %v", tx.Confirmations) -} - -func (btc *BTC) GetParams() chaincfg.Params { - return btc.params -} - -func (btc *BTC) Close() { - btc.c.Disconnect() -} - -// SerializePMT computes the serialized partial merkle tree of a transaction in a block. -// The format of the serialized PMT is: -// -// - uint32 total_transactions (4 bytes) -// - varint number of hashes (1-3 bytes) -// - uint256[] hashes in depth-first order (<= 32*N bytes) -// - varint number of bytes of flag bits (1-3 bytes) -// - byte[] flag bits, packed per 8 in a byte, least significant bit first (<= 2*N-1 bits) -func (btc *BTC) SerializePMT(txHash string) ([]byte, error) { - blockHash, err := btc.getBlockHash(txHash) - if err != nil { - return nil, err - } - msgBlock, err := btc.c.GetBlock(blockHash) - if err != nil { - return nil, buildErrorRetrievingBlock(blockHash, err) - } - block := btcutil.NewBlock(msgBlock) - return serializePMT(txHash, block) -} - -func buildErrorRetrievingBlock(blockHash *chainhash.Hash, err error) error { - return fmt.Errorf("error retrieving block %v: %v", blockHash.String(), err) -} - -func (btc *BTC) GetBlockNumberByTx(txHash string) (int64, error) { - blockHash, err := btc.getBlockHash(txHash) - if err != nil { - return 0, err - } - msgBlock, err := btc.c.GetBlockVerbose(blockHash) - if err != nil { - return 0, buildErrorRetrievingBlock(blockHash, err) - } - return msgBlock.Height, nil -} - -func (btc *BTC) SerializeTx(txHash string) ([]byte, error) { - h, err := chainhash.NewHashFromStr(txHash) - if err != nil { - return nil, fmt.Errorf("invalid tx hash %v: %v", txHash, err) - } - rawTx, err := btc.c.GetRawTransaction(h) - if err != nil { - return nil, fmt.Errorf("error retrieving tx %v: %v", txHash, err) - } - return serializeTx(rawTx) -} - -func (btc *BTC) GetDerivedBitcoinAddress(fedInfo *FedInfo, userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) (string, error) { - derivationValue, err := getDerivationValueHash(userBtcRefundAddr, lbcAddress, lpBtcAddress, derivationArgumentsHash) - if err != nil { - return "", fmt.Errorf("error computing derivation value: %v", err) - } - flyoverScript, err := btc.getRedeemScript(fedInfo, derivationValue) - if err != nil { - return "", fmt.Errorf("error generating redeem script: %v", err) - } - addressScriptHash, err := btcutil.NewAddressScriptHash(flyoverScript, &btc.params) - if err != nil { - return "", err - } - return addressScriptHash.EncodeAddress(), nil -} - -func (btc *BTC) ComputeDerivationAddresss(userPublicKey []byte, quoteHash []byte) (string, error) { - - rootScriptBuilder := txscript.NewScriptBuilder() - - rootScriptBuilder.AddData(quoteHash) - - rootScriptBuilder.AddOp(txscript.OP_DROP) - - rootScriptBuilder.AddOp(txscript.OP_1) - - rootScriptBuilder.AddData(userPublicKey) - - rootScriptBuilder.AddOp(txscript.OP_1) - - rootScriptBuilder.AddOp(txscript.OP_CHECKMULTISIG) - - rootScript, err := rootScriptBuilder.Script() - - if err != nil { - return "", fmt.Errorf("error generating root script: %v", err) - } - - redeemScript, err := btcutil.NewAddressScriptHash(rootScript[:], &btc.params) - - if err != nil { - return "", err - } - - return redeemScript.EncodeAddress(), nil -} - -func DecodeBTCAddressWithVersion(address string) ([]byte, error) { - addressBts, ver, err := base58.CheckDecode(address) - var bts bytes.Buffer - if err != nil { - hrp, data, err := bech32.Decode(address) - if err != nil { - return nil, fmt.Errorf("the provider address is not a valid Bech32 or base58 encoded address. address: %v", address) - } - if hrp != "tb" && hrp != "bc" { - return nil, fmt.Errorf("the provider address is not a valid Bitcoin address. address: %v", address) - } - log.Debug("decoded btc address data", addressBts) - log.Debug("decoded version address data", data) - bts.Write(data) - return bts.Bytes(), nil - } - log.Debug("decoded btc address data", addressBts) - log.Debug("decoded version address data", ver) - bts.WriteByte(ver) - bts.Write(addressBts) - return bts.Bytes(), nil -} - -func DecodeBech32BTCAddress(address string) ([]byte, error) { - _, dec, err := bech32.Decode(address) // omit first argument because its always "bc" - if err != nil { - log.Error() - return nil, fmt.Errorf("provided BTC address is not valid and couldn't be decoded: %v", address) - } - - return dec, err -} - -func serializeTx(tx *btcutil.Tx) ([]byte, error) { - var buf bytes.Buffer - err := tx.MsgTx().SerializeNoWitness(&buf) - if err != nil { - return nil, fmt.Errorf("error serializing tx: %v", err) - } - return buf.Bytes(), nil -} - -func (btc *BTC) BuildMerkleBranch(txHash string) (*MerkleBranch, error) { - blockHash, err := btc.getBlockHash(txHash) - if err != nil { - return nil, err - } - msgBlock, err := btc.c.GetBlock(blockHash) - if err != nil { - return nil, buildErrorRetrievingBlock(blockHash, err) - } - block := btcutil.NewBlock(msgBlock) - - txs := make([]*btcutil.Tx, len(block.MsgBlock().Transactions)) - for i, t := range block.MsgBlock().Transactions { - tx := btcutil.NewTx(t) - txs[i] = tx - } - - hash, err := chainhash.NewHashFromStr(txHash) - - if err != nil { - return nil, fmt.Errorf("error parsing hash: %v", err) - } - - var cleanStore []*chainhash.Hash - store := blockchain.BuildMerkleTreeStore(txs, false) - for _, node := range store { - if node != nil { - cleanStore = append(cleanStore, node) - } - } - - idx := FindInMerkleTreeStore(cleanStore, hash) - if idx == -1 { - return nil, fmt.Errorf("tx not found in merkle tree: %v", err) - } - - branch := buildMerkleBranch(cleanStore, uint32(len(block.Transactions())), uint32(idx)) - - return branch, nil -} - -func serializePMT(txHash string, block *btcutil.Block) ([]byte, error) { - filter := bloom.NewFilter(1, 0, 0, wire.BloomUpdateAll) - hash, err := chainhash.NewHashFromStr(txHash) - if err != nil { - return nil, fmt.Errorf("error parsing hash: %v", err) - } - filter.AddHash(hash) - - msg, indices := bloom.NewMerkleBlock(block, filter) - if len(indices) > 1 { - return nil, fmt.Errorf("block matches more than one transaction (%v)", len(indices)) - } - - var buf bytes.Buffer - - b := make([]byte, 4) - binary.LittleEndian.PutUint32(b, uint32(len(block.Transactions()))) - buf.Write(b) - - err = wire.WriteVarInt(&buf, wire.ProtocolVersion, uint64(len(msg.Hashes))) - if err != nil { - return nil, err - } - - for _, h := range msg.Hashes { - buf.Write(h[:]) - } - err = wire.WriteVarInt(&buf, wire.ProtocolVersion, uint64(len(msg.Flags))) - if err != nil { - return nil, err - } - - buf.Write(msg.Flags) - - return buf.Bytes(), nil -} - -func FindInMerkleTreeStore(store []*chainhash.Hash, hash *chainhash.Hash) int { - for i, h := range store { - if h != nil && h.IsEqual(hash) { - return i - } - } - return -1 -} - -func (btc *BTC) SendBtc(address string, amount uint64) (string, error) { - - btcAdd, err := btcutil.DecodeAddress(address, &btc.params) - if err != nil { - return "", err - } - - err = btc.c.ImportAddressRescan(btcAdd.String(), "", false) - if err != nil { - return "", err - } - - err = btc.c.SetTxFee(btcutil.Amount(btc.TxDefaultFee)) // could be part of the pegout quote instead of env var - if err != nil { - return "", fmt.Errorf("RPC client error: %v", err) - } - - if btc.encryptedWallet { - if err = btc.unlockWallet(); err != nil { - return "", err - } - } - hash, err := btc.c.SendToAddress(btcAdd, btcutil.Amount(amount)) - - if err != nil { - return "", err - } - - return hash.String(), nil -} - -func (btc *BTC) GetAvailableLiquidity() (*big.Int, error) { - utxos, err := btc.c.ListUnspent() - if err != nil { - return nil, err - } - balance := big.NewInt(0) - for _, utxo := range utxos { - if utxo.Spendable { - balance.Add(balance, big.NewInt(int64(utxo.Amount*BTC_TO_SATOSHI))) - } - } - return balance, nil -} - -type MerkleBranch struct { - Hashes [][32]byte - Path int -} - -func buildMerkleBranch(merkleTree []*chainhash.Hash, txCount uint32, txIndex uint32) *MerkleBranch { - hashes := make([][32]byte, 0) - path := 0 - pathIndex := 0 - var levelOffset uint32 = 0 - currentNodeOffset := txIndex - - for levelSize := txCount; levelSize > 1; levelSize = (levelSize + 1) / 2 { - var targetOffset uint32 - if currentNodeOffset%2 == 0 { - // Target is left hand side, use right hand side - targetOffset = min(currentNodeOffset+1, levelSize-1) - } else { - // Target is right hand side, use left hand side - targetOffset = currentNodeOffset - 1 - path = path + (1 << pathIndex) - } - hashes = append(hashes, toBytes32(merkleTree[levelOffset+targetOffset])) - - levelOffset += levelSize - currentNodeOffset = currentNodeOffset / 2 - pathIndex++ - } - - return &MerkleBranch{hashes, path} -} - -func min(a, b uint32) uint32 { - if a < b { - return a - } - return b -} - -func (btc *BTC) getConfirmations(address btcutil.Address, minAmount btcutil.Amount) (int64, btcutil.Amount, string, error) { - unspent, err := btc.c.ListUnspentMinMaxAddresses(0, 9999, []btcutil.Address{address}) - if err != nil { - return 0, 0, "", fmt.Errorf("error retrieving unspent outputs for address %v: %v", address.EncodeAddress(), err) - } - if len(unspent) > 0 { - type CumulativeResult struct { - TxID string - Amount btcutil.Amount - Confirmations int64 - } - var cumResults []*CumulativeResult - - outer: - for _, u := range unspent { - ua, err := btcutil.NewAmount(u.Amount) - if err != nil { - return 0, 0, "", fmt.Errorf("error retrieving unspent outputs for address %v: %v", address.EncodeAddress(), err) - } - - for _, cr := range cumResults { - if u.TxID == cr.TxID { - cr.Amount += ua - continue outer - } - } - - cumResults = append(cumResults, &CumulativeResult{ - TxID: u.TxID, - Amount: ua, - Confirmations: u.Confirmations, - }) - } - - for _, cr := range cumResults { - if cr.Amount >= minAmount { - return cr.Confirmations, cr.Amount, cr.TxID, nil - } - } - } - - return 0, 0, "", nil -} - -func (btc *BTC) getBlockHash(txHash string) (*chainhash.Hash, error) { - h, err := chainhash.NewHashFromStr(txHash) - if err != nil { - return nil, fmt.Errorf("invalid transaction hash %v: %v", txHash, err) - } - tx, err := btc.c.GetTransaction(h) - if err != nil { - return nil, fmt.Errorf("error getting transaction %v: %v", txHash, err) - } - blockHash, err := chainhash.NewHashFromStr(tx.BlockHash) - if err != nil { - return nil, fmt.Errorf("error parsing block hash %v: %v", tx.BlockHash, err) - } - return blockHash, nil -} - -func getDerivationValueHash(userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) ([]byte, error) { - var buf bytes.Buffer - buf.Write(derivationArgumentsHash) - buf.Write(userBtcRefundAddr) - buf.Write(lbcAddress) - buf.Write(lpBtcAddress) - - derivationValueHash := crypto.Keccak256(buf.Bytes()) - - return derivationValueHash, nil -} - -func (btc *BTC) validateRedeemScript(fedInfo *FedInfo, script []byte) error { - addr, err := btcutil.NewAddressScriptHash(script, &btc.params) - if err != nil { - return err - } - - fedAddress, err := btcutil.DecodeAddress(fedInfo.FedAddress, &btc.params) - if err != nil { - return err - } - - if !bytes.Equal(addr.ScriptAddress(), fedAddress.ScriptAddress()) { - return fmt.Errorf("the generated redeem script does not match with the federation redeem script") - } - return nil -} - -func (btc *BTC) getRedeemScript(fedInfo *FedInfo, derivationValue []byte) ([]byte, error) { - var hashBuf *bytes.Buffer - - buf, err := getFlyoverPrefix(derivationValue) - if err != nil { - return nil, err - } - - // All federations activated AFTER Iris will be ERP, therefore we build erp redeem script. - if fedInfo.ActiveFedBlockHeight < fedInfo.IrisActivationHeight { - err := btc.buildRedeemScriptBuf(fedInfo, hashBuf, err) - if err != nil { - return nil, err - } - } else { - hashBuf, err = btc.getErpRedeemScriptBuf(fedInfo) - if err != nil { - return nil, err - } - - err = btc.validateRedeemScript(fedInfo, hashBuf.Bytes()) - if err != nil { // ok, it could be that ERP is not yet activated, falling back to Redeem Script - err := btc.buildRedeemScriptBuf(fedInfo, hashBuf, err) - if err != nil { - return nil, err - } - } - } - - buf.Write(hashBuf.Bytes()) - return buf.Bytes(), nil -} - -func (btc *BTC) buildRedeemScriptBuf(fedInfo *FedInfo, hashBuf *bytes.Buffer, err error) error { - hashBuf, err = btc.getRedeemScriptBuf(fedInfo, true) - if err != nil { - return err - } - - err = btc.validateRedeemScript(fedInfo, hashBuf.Bytes()) - if err != nil { - return err - } - - return nil -} - -func getFlyoverPrefix(hash []byte) (*bytes.Buffer, error) { - var buf bytes.Buffer - hashPrefix, err := hex.DecodeString("20") - if err != nil { - return nil, err - } - buf.Write(hashPrefix) - buf.Write(hash) - buf.WriteByte(txscript.OP_DROP) - - return &buf, nil -} - -func (btc *BTC) getRedeemScriptBuf(fedInfo *FedInfo, addMultiSig bool) (*bytes.Buffer, error) { - var buf bytes.Buffer - sb := txscript.NewScriptBuilder() - err := btc.addStdNToMScriptPart(fedInfo, sb) - if err != nil { - return nil, err - } - if addMultiSig { - sb.AddOp(txscript.OP_CHECKMULTISIG) - } - - sbuf, err := sb.Script() - if err != nil { - return nil, err - } - buf.Write(sbuf) - return &buf, nil -} - -func (btc *BTC) getErpRedeemScriptBuf(fedInfo *FedInfo) (*bytes.Buffer, error) { - erpRedeemScriptBuf, err := btc.p2ms(fedInfo, false) - if err != nil { - return nil, err - } - redeemScriptBuf, err := btc.getRedeemScriptBuf(fedInfo, false) - if err != nil { - return nil, err - } - scriptsA := txscript.NewScriptBuilder() - scriptsA.AddOp(txscript.OP_NOTIF) - var erpRedeemScriptBuffer bytes.Buffer - scrA, err := scriptsA.Script() - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(scrA) - erpRedeemScriptBuffer.Write(redeemScriptBuf.Bytes()) - erpRedeemScriptBuffer.WriteByte(txscript.OP_ELSE) - byteArr, err := hex.DecodeString("02") - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(byteArr) - - csv, err := hex.DecodeString(btc.getCsvValueFromNetwork()) - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(csv) - erpRedeemScriptBuffer.WriteByte(txscript.OP_CHECKSEQUENCEVERIFY) - erpRedeemScriptBuffer.WriteByte(txscript.OP_DROP) - erpRedeemScriptBuffer.Write(erpRedeemScriptBuf.Bytes()) - erpRedeemScriptBuffer.WriteByte(txscript.OP_ENDIF) - erpRedeemScriptBuffer.WriteByte(txscript.OP_CHECKMULTISIG) - - return &erpRedeemScriptBuffer, nil -} - -func (btc *BTC) p2ms(fedInfo *FedInfo, addMultiSig bool) (*bytes.Buffer, error) { - var buf bytes.Buffer - sb := txscript.NewScriptBuilder() - err := btc.addErpNToMScriptPart(fedInfo, sb) - if err != nil { - return nil, err - } - if addMultiSig { - sb.AddOp(txscript.OP_CHECKMULTISIG) - } - sbuf, err := sb.Script() - if err != nil { - return nil, err - } - buf.Write(sbuf) - return &buf, nil -} - -func (btc *BTC) getCsvValueFromNetwork() string { - switch btc.params.Name { - case chaincfg.MainNetParams.Name: - return "CD50" - case chaincfg.TestNet3Params.Name: - return "CD50" - default: // RegTest - return "01F4" - } -} - -func (btc *BTC) addStdNToMScriptPart(fedInfo *FedInfo, builder *txscript.ScriptBuilder) error { - builder.AddOp(getOpCodeFromInt(fedInfo.FedThreshold)) - - for _, pubKey := range fedInfo.PubKeys { - pkBuffer, err := hex.DecodeString(pubKey) - if err != nil { - return err - } - builder.AddData(pkBuffer) - } - - builder.AddOp(getOpCodeFromInt(fedInfo.FedSize)) - - return nil -} - -func (btc *BTC) addErpNToMScriptPart(fedInfo *FedInfo, builder *txscript.ScriptBuilder) error { - size := len(fedInfo.ErpKeys) - min := size/2 + 1 - builder.AddOp(getOpCodeFromInt(min)) - - for _, pubKey := range fedInfo.ErpKeys { - pkBuffer, err := hex.DecodeString(pubKey) - if err != nil { - return err - } - builder.AddData(pkBuffer) - } - - builder.AddOp(getOpCodeFromInt(len(fedInfo.ErpKeys))) - - return nil -} - -func checkBtcdVersion(c BTCClient) (int32, error) { - info, err := c.GetNetworkInfo() - - switch err := err.(type) { - case nil: - return info.Version, nil - case *btcjson.RPCError: - if err.Code != btcjson.ErrRPCMethodNotFound.Code { - return 0, fmt.Errorf("unable to detect btcd version: %v", err) - } - return unknownBtcdVersion, nil - default: - return 0, fmt.Errorf("unable to detect btcd version: %v", err) - } -} - -func getOpCodeFromInt(val int) byte { - switch val { - case 1: - return txscript.OP_1 - case 2: - return txscript.OP_2 - case 3: - return txscript.OP_3 - case 4: - return txscript.OP_4 - case 5: - return txscript.OP_5 - case 6: - return txscript.OP_6 - case 7: - return txscript.OP_7 - case 8: - return txscript.OP_8 - case 9: - return txscript.OP_9 - case 10: - return txscript.OP_10 - case 11: - return txscript.OP_11 - case 12: - return txscript.OP_12 - case 13: - return txscript.OP_13 - case 14: - return txscript.OP_14 - case 15: - return txscript.OP_15 - default: - return txscript.OP_16 - } -} - -func isP2PKH(address string) bool { - pattern := regexp.MustCompile(`^[13][a-km-zA-HJ-NP-Z0-9]{25,34}$`) - return pattern.MatchString(address) -} - -func isP2SH(address string) bool { - pattern := regexp.MustCompile(`^[32][a-km-zA-HJ-NP-Z0-9]{25,34}$`) - return pattern.MatchString(address) -} - -func isBech32(address string) bool { - pattern := regexp.MustCompile(`^(bc1|tb1)[a-zA-HJ-NP-Z0-9]{8,87}$`) - return pattern.MatchString(address) -} - -func btcAddressType(address string) string { - if isBech32(address) { - return "BECH32" - } - if isP2SH(address) { - return "P2SH" - } - if isP2PKH(address) { - return "P2PKH" - } - return "unknown" -} - -func (btc *BTC) LockBtc(amount float64) error { - utxos, err := btc.c.ListUnspent() - if err != nil { - return err - } - - var txInputs []*wire.OutPoint - var totalAmount float64 - for _, utxo := range utxos { - if totalAmount >= amount { - break - } - txIdHash, err := chainhash.NewHashFromStr(utxo.TxID) - if err != nil { - return err - } - txInputs = append(txInputs, wire.NewOutPoint(txIdHash, utxo.Vout)) - totalAmount += utxo.Amount * BTC_TO_SATOSHI - } - if totalAmount < amount { - return errors.New("not enough balance") - } - return btc.c.LockUnspent(false, txInputs) -} - -func (btc *BTC) UnlockBtc(amount float64) error { - utxos, err := btc.c.ListLockUnspent() - if err != nil { - return err - } - - var transactionsToUnlock []*wire.OutPoint - var totalAmount float64 - var txOut *btcjson.GetTxOutResult - for _, utxo := range utxos { - txOut, err = btc.c.GetTxOut(&utxo.Hash, utxo.Index, true) - if totalAmount >= amount { - break - } - transactionsToUnlock = append(transactionsToUnlock, utxo) - totalAmount += txOut.Value * BTC_TO_SATOSHI - } - return btc.c.LockUnspent(true, transactionsToUnlock) -} - -func (btc *BTC) GetBlockHeaderHashByTx(txHash string) ([32]byte, error) { - blockHash, err := btc.getBlockHash(txHash) - if err != nil { - return [32]byte{}, err - } - result := toBytes32(blockHash) - return result, nil -} - -func toBytes32(hash *chainhash.Hash) [32]byte { - var result [32]byte - for i := 0; i < chainhash.HashSize/2; i++ { - result[i], result[chainhash.HashSize-1-i] = hash[chainhash.HashSize-1-i], hash[i] - } - return result -} - -func DecodeBTCAddress(address string) ([]byte, error) { - var decoded []byte - var err error - if isBech32(address) { - decoded, err = DecodeBech32BTCAddress(address) - } else { - decoded, err = DecodeBTCAddressWithVersion(address) - } - if err != nil { - err = fmt.Errorf("error decoding BTC address: %v", err) - } - return decoded, err -} - -func (btc *BTC) getTxInputs(amount uint64) ([]*wire.TxIn, error) { - utxos, err := btc.c.ListUnspent() - if err != nil { - return nil, err - } - - var txInputs []*wire.TxIn - var totalAmount float64 - for _, utxo := range utxos { - if totalAmount >= float64(amount) { - break - } else if !utxo.Spendable { - continue - } - - txIdHash, err := chainhash.NewHashFromStr(utxo.TxID) - if err != nil { - return nil, err - } - networkOutpoint, err := btc.c.GetTxOut(txIdHash, utxo.Vout, true) - scriptPk, err := hex.DecodeString(networkOutpoint.ScriptPubKey.Hex) - if err != nil { - return nil, err - } - outpoint := wire.NewOutPoint(txIdHash, utxo.Vout) - txInputs = append(txInputs, wire.NewTxIn(outpoint, scriptPk, nil)) - - totalAmount += utxo.Amount * BTC_TO_SATOSHI - } - if totalAmount < float64(amount) { - return nil, errors.New("not enough balance") - } - return txInputs, nil -} - -func (btc *BTC) SendBtcWithOpReturn(address string, amountInSatoshi uint64, opReturnContent []byte) (string, error) { - btcAddress, err := btcutil.DecodeAddress(address, &btc.params) - if err != nil { - return "", err - } - - output := map[btcutil.Address]btcutil.Amount{ - btcAddress: btcutil.Amount(amountInSatoshi), - } - rawTx, err := btc.c.CreateRawTransaction(nil, output, nil) - - opReturnScript, err := txscript.NullDataScript(opReturnContent) - if err != nil { - return "", err - } - rawTx.AddTxOut(wire.NewTxOut(0, opReturnScript)) - - changePosition := 2 - feeRate := btc.TxFeeRate - opts := btcjson.FundRawTransactionOpts{ - ChangePosition: &changePosition, - FeeRate: &feeRate, - } - - if btc.encryptedWallet { - if err = btc.unlockWallet(); err != nil { - return "", err - } - } - - fundedTx, err := btc.c.FundRawTransaction(rawTx, opts, nil) - if err != nil { - return "", err - } - signedTx, _, err := btc.c.SignRawTransactionWithWallet(fundedTx.Transaction) - if err != nil { - return "", err - } - - txHash, err := btc.c.SendRawTransaction(signedTx, false) - if err != nil { - return "", err - } - return txHash.String(), nil -} - -func (btc *BTC) EstimateFees(address string, amountInSatoshi uint64) (uint64, error) { - _, err := btcutil.DecodeAddress(address, &btc.params) - if err != nil { - return 0, err - } - - output := []btcjson.PsbtOutput{ - {address: float64(amountInSatoshi) / BTC_TO_SATOSHI}, - {"data": hex.EncodeToString(make([]byte, 32))}, // quote hash output - } - var changePosition int64 = 2 - feeRate := btc.TxFeeRate - opts := btcjson.WalletCreateFundedPsbtOpts{ - ChangePosition: &changePosition, - FeeRate: &feeRate, - } - - simulatedTx, err := btc.c.WalletCreateFundedPsbt(nil, output, nil, &opts, nil) - if err != nil { - return 0, err - } - return uint64(simulatedTx.Fee * BTC_TO_SATOSHI), nil -} - -func (btc *BTC) unlockWallet() error { - info, err := btc.c.GetWalletInfo() - if err != nil { - return err - } - if info.UnlockedUntil != nil && time.Until(time.Unix(int64(*info.UnlockedUntil), 0)) > 0 { - log.Debug("Wallet already unlocked") - return nil - } - return btc.c.WalletPassphrase(btc.walletPassword, WalletUnlockSeconds) -} diff --git a/connectors/bitcoin_test.go b/connectors/bitcoin_test.go deleted file mode 100644 index c42f0665..00000000 --- a/connectors/bitcoin_test.go +++ /dev/null @@ -1,845 +0,0 @@ -package connectors - -import ( - "encoding/hex" - "errors" - log "github.com/sirupsen/logrus" - "io" - "math/big" - "os" - "testing" - "time" - - "github.com/btcsuite/btcd/btcjson" - "github.com/rsksmart/liquidity-provider-server/connectors/testmocks" - "github.com/stretchr/testify/mock" - - "github.com/btcsuite/btcd/btcutil" - - "fmt" - - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/txscript" - - "sort" - "strings" - - "github.com/stretchr/testify/assert" - - "github.com/ethereum/go-ethereum/common" -) - -type testPmt struct { - h string - pmt string -} - -var ( - expectedPmts = [2]testPmt{ - { - h: "07f8b22fa9a3b32e20b59bb90727de05fb634749519ebcb6a887aeaf2c7eb041", - pmt: "f3080000" + "0d" + - "41b07e2cafae87a8b6bc9e51494763fb05de2707b99bb5202eb3a3a92fb2f807" + - "731c671fafb5d234834c726657f29c9af030ccf7068f1ef732af4efd8e146da0" + - "a9d6075f4758821ceeef2c230cfd2497df2d1d1d02dd19e653d22b3dc271b393" + - "94c2d2e51eae99af800c39575a11f3b4eb0fdf5d5deff0b9f5ff592566f4f173" + - "2b3f6d41bded4344899a348d3053ccd68e922626e589da71d9a583ccfe9e3be6" + - "393a24e14d18006b54a967963c56da58b18ce770cdb3b32e56d88c138c473a1a" + - "37acc29a7788a88404fb9a05c416c2ad8f340a61c1ea331528a91ae6210db4f0" + - "e22d21c55b3f6806387ca34aba54522a7fe15e593ab0d0ff89c6d826cf4e7455" + - "99bdfed66a4ef1a366f056363158b2907388a5bd4013643d83a016469d392aab" + - "2319910a0ac801d2c9793c661f1bb02863f672288ce3b4c5e365cff81932fbe4" + - "3d1eba4b027f80b1240ab5b8c677167602ee63c5a6dad213777b6fbbd3dd9778" + - "71f30b975d1a8f6cd62535985ea4d11f5c7f80549eab1b18a5cc011872b5403d" + - "ee666302831a3c64d1604c5c0bec9c796d8dcace974ae97e5837ff0d446d060c" + - "04ff1f0000", - }, - { - h: "ddf5061f9707f0c959bf24278d557b264716672c1b601ec50112d6dfe160d9d3", - pmt: "f3080000" + "0d" + - "c0746a357444e9948a18a612e02df5a99240e77f1ff75dd949d5b4038dcf3667" + - "3a03c716cf722cff7d264c763088ceeb1665f26c6fdd5835d841eeee2f3ece4a" + - "203a24db8b7a51e4ab0e35a6b4151f6d7f1eef96f32e4fceaac6127521911618" + - "6efb7fdb763e821f99bd6af8d044cc6feadd7b4716e6938335a3e08548f5a077" + - "5dd364971faab5cd089cd1fa713e8be658a67a704d39952218f6518e5045d269" + - "d3d960e1dfd61201c51e601b2c671647267b558d2724bf59c9f007971f06f5dd" + - "0eab2677f52c996a3f941bef3ec57ebdf22429c37dee5ae68892df30f8acfc22" + - "5c6fed56bdff34686135e68fda4b716713e60258b6971c03091f25115c008eec" + - "48a828c75ad7340fadbc368636b4014f6e8386c3990a35620cbddca933a72b02" + - "d990fb8a602fcda9e1e41120c25f4981362a9dfc7f7ed1f5188482b8ee3f532f" + - "0ee6234e44af99351ee430f4ac0fa7b71fe9c601c78480b9a97fea305d3abca2" + - "35a6668846093803e07c48dc9a75be90ed6edd4debb0b7b49bc057e093ad395e" + - "ee666302831a3c64d1604c5c0bec9c796d8dcace974ae97e5837ff0d446d060c" + - "04dbd50300", - }, - } -) - -func testSerializeTx(t *testing.T) { - expected := "01000000010000000000000000000000000000000000000000000000000000000000000000" + - "ffffffff5f034aa00a1c2f5669614254432f4d696e656420627920797a33313936303538372f2cfabe" + - "6d6dc0a3751203a336deb817199448996ebcb2a0e537b1ce9254fa3e9c3295ca196b10000000000000" + - "0010c56e6700d262d24bd851bb829f9f0000ffffffff0401b3cc25000000001976a914536ffa992491" + - "508dca0354e52f32a3a7a679a53a88ac00000000000000002b6a2952534b424c4f434b3a040c866ad2" + - "fdb8b59b32dd17059edaeef11d295e279a74ab97125d2500371ce90000000000000000266a24b9e11b" + - "6dab3e2ca50c1a6b01cf80eccb9d291aab8b095d653e348aa9d94a73964ff5cf1b0000000000000000" + - "266a24aa21a9ed04f0bac0104f4fa47bec8058f2ebddd292dd85027ab0d6d95288d31f12c5a4b800000000" - - // this is block 0000000000000000000aca0460feaf0661f173b75d4cc824b57233aa7c6b7bc3 - f, err := os.Open("./testdata/test_block") - if err != nil { - t.Fatalf("error opening test block file: %v", err) - } - b, err := io.ReadAll(f) - if err != nil { - t.Fatalf("error reading test file: %v", err) - } - s := string(b) - h, err := hex.DecodeString(s) - if err != nil { - t.Fatalf("error decoding test file: %v", err) - } - - block, err := btcutil.NewBlockFromBytes(h) - if err != nil { - t.Fatalf("error parsing test block: %v", err) - } - tx, err := block.Tx(0) - if err != nil { - t.Fatalf("error reading transaction from test block: %v", err) - } - result, err := serializeTx(tx) - if err != nil { - t.Fatal(err) - } - if hex.EncodeToString(result) != expected { - t.Errorf("serialized tx does not match expected: %x \n----\n %v", result, expected) - } -} - -func testPMTSerialization(t *testing.T) { - // this is block 0000000000000000000aca0460feaf0661f173b75d4cc824b57233aa7c6b7bc3 - f, err := os.Open("./testdata/test_block") - if err != nil { - t.Fatalf("error opening test block file: %v", err) - } - b, err := io.ReadAll(f) - if err != nil { - t.Fatalf("error reading test file: %v", err) - } - s := string(b) - h, err := hex.DecodeString(s) - if err != nil { - t.Fatalf("error decoding test file: %v", err) - } - - block, err := btcutil.NewBlockFromBytes(h) - if err != nil { - t.Fatalf("error parsing test block: %v", err) - } - - for _, p := range expectedPmts { - serializedPMT, err := serializePMT(p.h, block) - if err != nil { - t.Errorf("error serializing PMT:\n %v", p.h) - continue - } - result := hex.EncodeToString(serializedPMT) - if result != p.pmt { - t.Errorf("expected PMT:\n%v\n is different from serialized PMT:\n%v\n", p.pmt, result) - } - } -} - -var testPegOutQuotes = []struct { - BTCRefundAddr string - LBCAddr string - LPBTCAddr string - QuoteHash string - UserPubKey string - ExpectedDerivationValueHash string - ExpectedAddressHash string - NetworkParams string - DerivationAddress string -}{ - { - LPBTCAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - BTCRefundAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", - UserPubKey: "029448e68904c4ebd63a65a0e6b8a887fbd51bacd45092d3279902aba37fb7f994", - ExpectedAddressHash: "2Mx7jaPHtsgJTbqGnjU5UqBpkekHgfigXay", - ExpectedDerivationValueHash: "ff883edd54f8cb22464a8181ed62652fcdb0028e0ada18f9828afd76e0df2c72", - NetworkParams: "testnet", - DerivationAddress: "2NE1twHkPzqvaJvuQWEUuAG2pUU337H7ots", - }, - { - LPBTCAddr: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", - BTCRefundAddr: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", - UserPubKey: "029448e68904c4ebd63a65a0e6b8a887fbd51bacd45092d3279902aba37fb7f994", - ExpectedAddressHash: "2N6LxcNDYkKzeyXh7xjZUNZnS9G4Sq3mysi", - ExpectedDerivationValueHash: "4cd8a9037f5342217092a9ccc027ab0af1be60bf015e4228afc87214f86f2e51", - NetworkParams: "testnet", - DerivationAddress: "2NE1twHkPzqvaJvuQWEUuAG2pUU337H7ots", - }, -} - -type TestQuote struct { - BTCRefundAddr string - LBCAddr string - LPBTCAddr string - QuoteHash string - ExpectedDerivationValueHash string - ExpectedAddressHash string - NetworkParams string - FedInfo *FedInfo -} - -var testQuotes = []TestQuote{ - { - LPBTCAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - BTCRefundAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", - ExpectedAddressHash: "2Mx7jaPHtsgJTbqGnjU5UqBpkekHgfigXay", - ExpectedDerivationValueHash: "ff883edd54f8cb22464a8181ed62652fcdb0028e0ada18f9828afd76e0df2c72", - NetworkParams: "testnet", - FedInfo: getFakeFedInfo(), - }, - { - LPBTCAddr: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", - BTCRefundAddr: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", - ExpectedAddressHash: "2N6LxcNDYkKzeyXh7xjZUNZnS9G4Sq3mysi", - ExpectedDerivationValueHash: "4cd8a9037f5342217092a9ccc027ab0af1be60bf015e4228afc87214f86f2e51", - NetworkParams: "testnet", - FedInfo: getFakeFedInfo(), - }, - { - LPBTCAddr: "17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem", - BTCRefundAddr: "17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", - ExpectedAddressHash: "38r8PQdgw5vdebE9h12Eum6saVnWEXxbve", - ExpectedDerivationValueHash: "f07f644aa9123cd339f232be7f02ec536d40247f6f0c89a93d625ee57918c544", - NetworkParams: "mainnet", - FedInfo: getFakeFedInfo(), - }, - { - LPBTCAddr: "3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX", - BTCRefundAddr: "3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", - ExpectedAddressHash: "33P85aACtqezxcGjhrferYkpg6djBtvstk", - ExpectedDerivationValueHash: "edb9cfe28705fa1619fe1c1bc70e55d5eee4965aea0de631bcf56434a7c454cc", - NetworkParams: "mainnet", - FedInfo: getFakeFedInfo(), - }, -} - -func getFakeFedInfo() *FedInfo { - var keys []string - keys = append(keys, "02cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1") - keys = append(keys, "0362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a124") - keys = append(keys, "03c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db") - - var erpPubKeys []string - erpPubKeys = append(erpPubKeys, "0257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d4") - erpPubKeys = append(erpPubKeys, "03c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f9") - erpPubKeys = append(erpPubKeys, "03cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b3") - erpPubKeys = append(erpPubKeys, "02370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80") - - return &FedInfo{ - ActiveFedBlockHeight: 0, - ErpKeys: erpPubKeys, - FedSize: len(keys), - FedThreshold: len(keys)/2 + 1, - PubKeys: keys, - IrisActivationHeight: 0, - } -} - -const ( - PowPegScriptString = "522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53ae" - ErpScriptString = "64522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db536702cd50b27553210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b32102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec805468ae" - FlyoverScriptString = "20ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c975522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53ae" - FlyoverErpScriptString = "20ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c97564522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db536702cd50b27553210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b32102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec805468ae" -) - -func buildDerivationValueHash(tt TestQuote, t *testing.T) ([]byte, bool) { - lbcAddr := common.FromHex(tt.LBCAddr) - hashBytes, err := hex.DecodeString(tt.QuoteHash) - if err != nil || len(hashBytes) == 0 { - t.Errorf("Cannot parse QuoteHash correctly. value: %v, error: %v", tt.QuoteHash, err) - return nil, false - } - userBtcRefundAddr, err := DecodeBTCAddressWithVersion(tt.BTCRefundAddr) - if err != nil { - t.Errorf("Unexpected error in getBytesFromBtcAddress. error: %v", err) - return nil, false - } - lpBtcAddress, err := DecodeBTCAddressWithVersion(tt.LPBTCAddr) - if err != nil { - t.Errorf("Unexpected error in getBytesFromBtcAddress. error: %v", err) - return nil, false - } - value, err := getDerivationValueHash(userBtcRefundAddr, lbcAddr, lpBtcAddress, hashBytes) - if err != nil { - t.Errorf("Unexpected error in GetDerivationValueHash. value: %v, expected: %v, error: %v", value, tt.ExpectedDerivationValueHash, err) - return nil, false - } - return value, true -} - -func testDerivationComplete(t *testing.T) { - for _, tt := range testQuotes { - tt.FedInfo.IrisActivationHeight = 1 - - if !common.IsHexAddress(tt.LBCAddr) { - t.Errorf("invalid address: %v", tt.LBCAddr) - continue - } - - value, ok := buildDerivationValueHash(tt, t) - - if !ok { - continue - } - - result := hex.EncodeToString(value) - assert.EqualValues(t, tt.ExpectedDerivationValueHash, result) - buf, err := getFlyoverPrefix(value) - if err != nil { - t.Errorf("Unexpected error in getFlyoverPrefix. error: %v", err) - continue - } - btc, err := NewBTC(tt.NetworkParams) - if err != nil { - t.Errorf("error initializing BTC: %v", err) - continue - } - fedInfo := getFakeFedInfo() - if btc.params.Name == chaincfg.TestNet3Params.Name { - fedInfo.FedAddress = "2N5muMepJizJE1gR7FbHJU6CD18V3BpNF9p" - } else { - fedInfo.FedAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - } - scriptBuf, err := btc.getRedeemScriptBuf(fedInfo, true) - if err != nil { - t.Errorf("Unexpected error in getPowPegRedeemScriptBuf. error: %v", err) - continue - } - buf.Write(scriptBuf.Bytes()) - addr, err := btcutil.NewAddressScriptHash(buf.Bytes(), &btc.params) - if err != nil { - t.Errorf("Unexpected error in NewAddressScriptHash. error: %v", err) - continue - } - assert.EqualValues(t, tt.ExpectedAddressHash, addr.EncodeAddress()) - err = btc.validateRedeemScript(fedInfo, scriptBuf.Bytes()) - if err != nil { - t.Errorf("error in validateRedeemScript: %v", err) - } - } -} - -func testBuildPowPegRedeemScript(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - - fedInfo := getFakeFedInfo() - buf, err := btc.getRedeemScriptBuf(fedInfo, true) - if err != nil { - t.Fatalf("error in getPowPegRedeemScriptBuf: %v", err) - } - - str := hex.EncodeToString(buf.Bytes()) - assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) - - op2 := fmt.Sprintf("%02x", txscript.OP_2) - assert.EqualValues(t, str[0:2], op2) - - op3 := fmt.Sprintf("%02x", txscript.OP_3) - assert.EqualValues(t, str[len(str)-4:len(str)-2], op3) - - sort.Slice(fedInfo.PubKeys, func(i, j int) bool { - return fedInfo.PubKeys[i] < fedInfo.PubKeys[j] - }) - - buf2, err := btc.getRedeemScriptBuf(fedInfo, true) - if err != nil { - t.Errorf("error in getPowPegRedeemScriptBuf: %v", err) - } - str2 := hex.EncodeToString(buf2.Bytes()) - assert.EqualValues(t, str2, str) -} - -func testBuildErpRedeemScript(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - - fedInfo := getFakeFedInfo() - buf, err := btc.getErpRedeemScriptBuf(fedInfo) - if err != nil { - t.Fatalf("error in getErpRedeemScriptBuf: %v", err) - } - - str := hex.EncodeToString(buf.Bytes()) - assert.True(t, checkSubstrings(str, fedInfo.ErpKeys...)) - assert.EqualValues(t, str, ErpScriptString) -} - -func testBuildFlyoverRedeemScript(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.FedAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - fedInfo.IrisActivationHeight = 1 - - hash, err := getFlyoverDerivationHash() - if err != nil { - t.Fatalf("error in getFlyoverDerivationHash: %v", err) - } - - bts, err := btc.getRedeemScript(fedInfo, hash) - if err != nil { - t.Fatalf("error in getRedeemScript: %v", err) - } - - str := hex.EncodeToString(bts) - assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) - assert.EqualValues(t, FlyoverScriptString, str) -} - -func testBuildFlyoverErpRedeemScript(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.FedAddress = "3C8e41MpbE2MB8XDqaYnQ2FbtRwPYLJtto" - fedInfo.IrisActivationHeight = -1 - - hash, err := getFlyoverDerivationHash() - if err != nil { - t.Fatalf("error in getFlyoverDerivationHash: %v", err) - } - - bts, err := btc.getRedeemScript(fedInfo, hash) - if err != nil { - t.Fatalf("error in getRedeemScript: %v", err) - } - - str := hex.EncodeToString(bts) - assert.True(t, checkSubstrings(str, fedInfo.ErpKeys...)) - assert.EqualValues(t, FlyoverErpScriptString, str) -} - -func testBuildFlyoverErpRedeemScriptFallback(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.FedAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - fedInfo.IrisActivationHeight = -1 - - hash, err := getFlyoverDerivationHash() - if err != nil { - t.Fatalf("error in getFlyoverDerivationHash: %v", err) - } - - bts, err := btc.getRedeemScript(fedInfo, hash) - if err != nil { - t.Fatalf("error in getRedeemScript: %v", err) - } - - str := hex.EncodeToString(bts) - assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) - assert.EqualValues(t, FlyoverScriptString, str) -} - -func testBuildPowPegAddressHash(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.IrisActivationHeight = 1 - - buf, err := btc.getRedeemScriptBuf(fedInfo, true) - if err != nil { - t.Fatalf("error in getPowPegRedeemScriptBuf: %v", err) - } - - str := hex.EncodeToString(buf.Bytes()) - assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) - assert.EqualValues(t, str, PowPegScriptString) - - address, err := btcutil.NewAddressScriptHash(buf.Bytes(), &chaincfg.MainNetParams) - if err != nil { - t.Fatalf("error in NewAddressScriptHash: %v", err) - } - - expectedAddr := "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - - assert.EqualValues(t, expectedAddr, address.EncodeAddress()) -} - -func testBuildFlyoverPowPegAddressHash(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.FedAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - fedInfo.IrisActivationHeight = 1 - - hash, err := getFlyoverDerivationHash() - if err != nil { - t.Fatalf("error in getFlyoverDerivationHash: %v", err) - } - bts, err := btc.getRedeemScript(fedInfo, hash) - if err != nil { - t.Fatalf("error in getRedeemScript: %v", err) - } - - str := hex.EncodeToString(bts) - assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) - assert.EqualValues(t, FlyoverScriptString, str) - - address, err := btcutil.NewAddressScriptHash(bts, &chaincfg.MainNetParams) - if err != nil { - t.Fatalf("error in NewAddressScriptHash: %v", err) - } - expectedAddr := "34TNebhLLHsE6FHQVMmeHAhTFpaAWhfweR" - - assert.EqualValues(t, expectedAddr, address.EncodeAddress()) -} - -func testBuildFlyoverErpAddressHash(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.FedAddress = "3C8e41MpbE2MB8XDqaYnQ2FbtRwPYLJtto" - fedInfo.IrisActivationHeight = -1 - - hash, err := getFlyoverDerivationHash() - if err != nil { - t.Fatalf("error in getFlyoverDerivationHash: %v", err) - } - - bts, err := btc.getRedeemScript(fedInfo, hash) - if err != nil { - t.Fatalf("error in getRedeemScript: %v", err) - } - - str := hex.EncodeToString(bts) - assert.True(t, checkSubstrings(str, fedInfo.ErpKeys...)) - assert.EqualValues(t, FlyoverErpScriptString, str) - - address, err := btcutil.NewAddressScriptHash(bts, &chaincfg.MainNetParams) - if err != nil { - t.Fatalf("error in NewAddressScriptHash: %v", err) - } - expectedAddr := "3PS2FEphLJMbJURMdYYFNAZR6zLasX51RC" - - assert.EqualValues(t, expectedAddr, address.EncodeAddress()) -} - -func testBuildFlyoverErpAddressHashFallback(t *testing.T) { - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - fedInfo := getFakeFedInfo() - fedInfo.FedAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - fedInfo.IrisActivationHeight = -1 - - hash, err := getFlyoverDerivationHash() - if err != nil { - t.Fatalf("error in getFlyoverDerivationHash: %v", err) - } - - bts, err := btc.getRedeemScript(fedInfo, hash) - if err != nil { - t.Fatalf("error in getRedeemScript: %v", err) - } - - str := hex.EncodeToString(bts) - assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) - assert.EqualValues(t, FlyoverScriptString, str) - - address, err := btcutil.NewAddressScriptHash(bts, &chaincfg.MainNetParams) - if err != nil { - t.Fatalf("error in NewAddressScriptHash: %v", err) - } - expectedAddr := "34TNebhLLHsE6FHQVMmeHAhTFpaAWhfweR" - - assert.EqualValues(t, expectedAddr, address.EncodeAddress()) -} - -func getFlyoverDerivationHash() ([]byte, error) { - sHash := "ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c9" - return hex.DecodeString(sHash) -} - -func checkSubstrings(str string, subs ...string) bool { - isCompleteMatch := true - for _, sub := range subs { - if !strings.Contains(str, sub) { - isCompleteMatch = false - } - } - - return isCompleteMatch -} - -func testGetDerivedBitcoinAddress(t *testing.T) { - for _, tt := range testQuotes { - btc, err := NewBTC(tt.NetworkParams) - if err != nil { - t.Errorf("error initializing BTC: %v", err) - continue - } - fedInfo := getFakeFedInfo() - fedInfo.IrisActivationHeight = 1 - if btc.params.Name == chaincfg.TestNet3Params.Name { - fedInfo.FedAddress = "2N5muMepJizJE1gR7FbHJU6CD18V3BpNF9p" - } else { - fedInfo.FedAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" - } - lbcAddr, err := DecodeRSKAddress(tt.LBCAddr) - if err != nil { - t.Errorf("Unexpected error in DecodeRSKAddress. error: %v", err) - continue - } - hashBytes, err := hex.DecodeString(tt.QuoteHash) - if err != nil || len(hashBytes) == 0 { - t.Errorf("Cannot parse QuoteHash correctly. value: %v, error: %v", tt.QuoteHash, err) - continue - } - userBtcRefundAddr, err := DecodeBTCAddressWithVersion(tt.BTCRefundAddr) - if err != nil { - t.Errorf("Unexpected error in DecodeBTCAddressWithVersion. error: %v", err) - continue - } - lpBtcAddress, err := DecodeBTCAddressWithVersion(tt.LPBTCAddr) - if err != nil { - t.Errorf("Unexpected error in DecodeBTCAddressWithVersion. error: %v", err) - continue - } - addr, err := btc.GetDerivedBitcoinAddress(fedInfo, userBtcRefundAddr, lbcAddr, lpBtcAddress, hashBytes) - if err != nil { - t.Errorf("Unexpected error in GetDerivedBitcoinAddress. error: %v", err) - continue - } - assert.EqualValues(t, tt.ExpectedAddressHash, addr) - } -} - -func testCheckBtcAddr(t *testing.T) { - btcClientMock := new(testmocks.BTCClientMock) - addrWatcherMock := new(testmocks.AddressWatcherMock) - amountInBtc := float64(1) - amount, err := btcutil.NewAmount(amountInBtc) - assert.Nil(t, err) - var confirmations int64 - - btc, err := NewBTC("mainnet") - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - btc.c = btcClientMock - - btcAddr, err := btcutil.DecodeAddress("38r8PQdgw5vdebE9h12Eum6saVnWEXxbve", &btc.params) - if err != nil { - t.Fatalf("error initializing BTC: %v", err) - } - - // check error when retrieving unspent outputs for address - btcClientMock.On("ListUnspentMinMaxAddresses", 0, 9999, mock.AnythingOfType("[]btcutil.Address")).Return([]btcjson.ListUnspentResult{}, errors.New("ListUnspentMinMaxAddresses failed")).Once() - err = btc.checkBtcAddr(addrWatcherMock, btcAddr, btcutil.Amount(0), time.Unix(0, 0), &confirmations, func() time.Time { return time.Unix(0, 0) }) - assert.NotNil(t, err) - assert.EqualValues(t, "error retrieving unspent outputs for address 38r8PQdgw5vdebE9h12Eum6saVnWEXxbve: ListUnspentMinMaxAddresses failed", err.Error()) - btcClientMock.AssertExpectations(t) - addrWatcherMock.AssertExpectations(t) - - // check happy flow - confirmations = 0 - btcClientMock.On("ListUnspentMinMaxAddresses", 0, 9999, mock.AnythingOfType("[]btcutil.Address")).Return([]btcjson.ListUnspentResult{{TxID: "0xabc", Confirmations: 1, Amount: amountInBtc}}, nil).Once() - addrWatcherMock.On("OnNewConfirmation", "0xabc", int64(1), amount).Once() - err = btc.checkBtcAddr(addrWatcherMock, btcAddr, amount, time.Unix(0, 0), &confirmations, func() time.Time { return time.Unix(0, 0) }) - assert.Nil(t, err) - assert.EqualValues(t, 1, confirmations) - btcClientMock.AssertExpectations(t) - addrWatcherMock.AssertExpectations(t) - - // check happy flow #2: case when agreed amount has been deposited in the second tx (with two UTXOs) - confirmations = 0 - btcClientMock.On("ListUnspentMinMaxAddresses", 0, 9999, mock.AnythingOfType("[]btcutil.Address")).Return([]btcjson.ListUnspentResult{ - {TxID: "0xabc", Confirmations: 1, Amount: float64(0.98)}, - {TxID: "0xdef", Confirmations: 1, Amount: float64(0.4)}, // \ - {TxID: "0xdef", Confirmations: 1, Amount: float64(0.6)}, // -- these two txs with hash 0xdef are going to be selected - {TxID: "0xghi", Confirmations: 1, Amount: float64(0.99)}, - {TxID: "0xjkl", Confirmations: 1, Amount: float64(1.1)}, - }, nil).Once() - addrWatcherMock.On("OnNewConfirmation", "0xdef", int64(1), amount).Once() - err = btc.checkBtcAddr(addrWatcherMock, btcAddr, amount, time.Unix(0, 0), &confirmations, func() time.Time { return time.Unix(0, 0) }) - assert.Nil(t, err) - assert.EqualValues(t, 1, confirmations) - btcClientMock.AssertExpectations(t) - addrWatcherMock.AssertExpectations(t) - - // check case when time for depositing has elapsed - confirmations = 0 - btcClientMock.On("ListUnspentMinMaxAddresses", 0, 9999, mock.AnythingOfType("[]btcutil.Address")).Return([]btcjson.ListUnspentResult{{TxID: "0xabc", Confirmations: 1, Amount: float64(0.98)}}, nil).Once() - addrWatcherMock.On("OnExpire").Once() - err = btc.checkBtcAddr(addrWatcherMock, btcAddr, amount, time.Unix(0, 0), &confirmations, func() time.Time { return time.Unix(1, 0) }) - assert.NotNil(t, err) - assert.EqualValues(t, "time for depositing 1 BTC has elapsed; addr: 38r8PQdgw5vdebE9h12Eum6saVnWEXxbve", err.Error()) - assert.EqualValues(t, 0, confirmations) - btcClientMock.AssertExpectations(t) - addrWatcherMock.AssertExpectations(t) - - // check case when time for depositing has elapsed, but agreed amount has been deposited - confirmations = 0 - btcClientMock.On("ListUnspentMinMaxAddresses", 0, 9999, mock.AnythingOfType("[]btcutil.Address")).Return([]btcjson.ListUnspentResult{{TxID: "0xabc", Confirmations: 1, Amount: amountInBtc}}, nil).Times(1) - addrWatcherMock.On("OnNewConfirmation", "0xabc", int64(1), amount).Times(0) - err = btc.checkBtcAddr(addrWatcherMock, btcAddr, amount, time.Unix(0, 0), &confirmations, func() time.Time { return time.Unix(1, 0) }) - assert.Nil(t, err) - assert.EqualValues(t, 1, confirmations) - btcClientMock.AssertExpectations(t) - addrWatcherMock.AssertExpectations(t) - - // check case when number of confirmations has not advanced after the previous check - confirmations = 1 - btcClientMock.On("ListUnspentMinMaxAddresses", 0, 9999, mock.AnythingOfType("[]btcutil.Address")).Return([]btcjson.ListUnspentResult{{TxID: "0xabc", Confirmations: 1, Amount: amountInBtc}}, nil).Times(1) - addrWatcherMock.On("OnNewConfirmation", "0xabc", int64(1), amount).Times(0) - err = btc.checkBtcAddr(addrWatcherMock, btcAddr, amount, time.Unix(0, 0), &confirmations, func() time.Time { return time.Unix(0, 0) }) - assert.NotNil(t, err) - assert.EqualValues(t, "num of confirmations has not advanced; conf: 1", err.Error()) - assert.EqualValues(t, 1, confirmations) - btcClientMock.AssertExpectations(t) - addrWatcherMock.AssertExpectations(t) -} - -func testComputeDerivationAddress(t *testing.T) { - for _, tt := range testPegOutQuotes { - btc, err := NewBTC(tt.NetworkParams) - assert.Nil(t, err) - derivationAddress, err := btc.ComputeDerivationAddresss([]byte(tt.UserPubKey), []byte(tt.QuoteHash)) - assert.Nil(t, err) - assert.Equal(t, tt.DerivationAddress, derivationAddress) - } -} - -func testAvailableLiquidity(t *testing.T) { - btcClientMock := new(testmocks.BTCClientMock) - btc, err := NewBTC("regtest") - if err != nil { - log.Fatal("Error during test initialization: ", err.Error()) - } - - btc.c = btcClientMock - - testCases := []*struct { - caseName string - assertions func(result *big.Int, err error) - preparation func() - }{ - { - caseName: "Has liquidity", - preparation: func() { - btcClientMock.On("GetBalance", "*").Return(btcutil.Amount(5), nil) - }, - assertions: func(result *big.Int, err error) { - btcClientMock.AssertExpectations(t) - assert.EqualValues(t, big.NewInt(5), result) - assert.Nil(t, err) - }, - }, - { - caseName: "Doesn't have liquidity", - preparation: func() { - btcClientMock.On("GetBalance", "*").Return(btcutil.Amount(0), nil) - }, - assertions: func(result *big.Int, err error) { - btcClientMock.AssertExpectations(t) - assert.EqualValues(t, big.NewInt(0), result) - assert.Nil(t, err) - }, - }, - { - caseName: "Error getting balance", - preparation: func() { - btcClientMock.On("GetBalance", "*").Return(btcutil.Amount(0), errors.New("some error")) - }, - assertions: func(result *big.Int, err error) { - btcClientMock.AssertExpectations(t) - assert.Nil(t, nil, result) - assert.Error(t, err) - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - test.preparation() - result, errorResult := btc.GetAvailableLiquidity() - test.assertions(result, errorResult) - }) - btcClientMock.Calls = []mock.Call{} - btcClientMock.ExpectedCalls = []*mock.Call{} - } -} - -func testBtcAddressTypeFunc(t *testing.T) { - bech32 := "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4" - test_p2sh := "2NCsrCdLtVuWSShAvFbmZwoYymQkYuPTHy1" - p2sh := "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy" - p2pkh := "1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2" - whatever := "15689207gsjhb" - - TBECH32 := btcAddressType(bech32) - assert.Equal(t, TBECH32, "BECH32") - TtestP2SH := btcAddressType(test_p2sh) - assert.Equal(t, TtestP2SH, "P2SH") - TP2SH := btcAddressType(p2sh) - assert.Equal(t, TP2SH, "P2SH") - TP2PKH := btcAddressType(p2pkh) - assert.Equal(t, TP2PKH, "P2PKH") - Twhatever := btcAddressType(whatever) - assert.Equal(t, Twhatever, "unknown") -} - -func TestBitcoinConnector(t *testing.T) { - t.Run("test Get Available Liquidity", testAvailableLiquidity) - t.Run("test derivation complete", testDerivationComplete) - t.Run("test get powpeg redeem script", testBuildPowPegRedeemScript) - t.Run("test get erp redeem script", testBuildErpRedeemScript) - t.Run("test get flyover redeem script", testBuildFlyoverRedeemScript) - t.Run("test get flyover erp redeem script", testBuildFlyoverErpRedeemScript) - t.Run("test get flyover erp redeem script fallback", testBuildFlyoverErpRedeemScriptFallback) - t.Run("test get powpeg address hash", testBuildPowPegAddressHash) - t.Run("test get flyover powpeg address hash", testBuildFlyoverPowPegAddressHash) - t.Run("test get flyover erp address hash", testBuildFlyoverErpAddressHash) - t.Run("test get flyover erp address hash fallback", testBuildFlyoverErpAddressHashFallback) - t.Run("test pmt serialization", testPMTSerialization) - t.Run("test tx serialization", testSerializeTx) - t.Run("test get derived bitcoin address", testGetDerivedBitcoinAddress) - t.Run("test check btc addr", testCheckBtcAddr) - t.Run("test compute derivation address", testComputeDerivationAddress) - t.Run("determine BTC Address type", testBtcAddressTypeFunc) -} diff --git a/connectors/fedinfo.go b/connectors/fedinfo.go deleted file mode 100644 index 23eeb6a9..00000000 --- a/connectors/fedinfo.go +++ /dev/null @@ -1,213 +0,0 @@ -package connectors - -import ( - "bytes" - "encoding/hex" - "fmt" - - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/txscript" -) - -type FedInfo struct { - FedSize int - FedThreshold int - PubKeys []string - FedAddress string - ActiveFedBlockHeight int - IrisActivationHeight int - ErpKeys []string -} - -func (fedInfo *FedInfo) getFedRedeemScript(btcParams chaincfg.Params) ([]byte, error) { - var buf *bytes.Buffer - var err error - - // All Federations activated AFTER Iris will be ERP, therefore we build redeem script. - if fedInfo.ActiveFedBlockHeight > fedInfo.IrisActivationHeight { - buf, err = fedInfo.getRedeemScriptBuf(true) - if err != nil { - return nil, err - } - - err = fedInfo.validateRedeemScript(btcParams, buf.Bytes()) - if err != nil { - return nil, err - } - } else { - buf, err = fedInfo.getErpRedeemScriptBuf(btcParams) - if err != nil { - return nil, err - } - - err = fedInfo.validateRedeemScript(btcParams, buf.Bytes()) - if err != nil { // ok, it could be that ERP is not yet activated, falling back to redeem Script - buf, err = fedInfo.getRedeemScriptBuf(true) - if err != nil { - return nil, err - } - - err = fedInfo.validateRedeemScript(btcParams, buf.Bytes()) - if err != nil { - return nil, err - } - } - } - - return buf.Bytes(), nil -} - -func (fedInfo *FedInfo) getFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) ([]byte, error) { - buf, err := getFlyoverPrefix(derivationValue) - if err != nil { - return nil, err - } - - buf.Write(fedRedeemScript) - return buf.Bytes(), nil -} - -func (fedInfo *FedInfo) validateRedeemScript(btcParams chaincfg.Params, script []byte) error { - addr, err := btcutil.NewAddressScriptHash(script, &btcParams) - if err != nil { - return err - } - - fedAddress, err := btcutil.DecodeAddress(fedInfo.FedAddress, &btcParams) - if err != nil { - return err - } - - if !bytes.Equal(addr.ScriptAddress(), fedAddress.ScriptAddress()) { - return fmt.Errorf("The generated redeem script does not match with the federation redeem script") - } - - return nil -} - -func (fedInfo *FedInfo) getRedeemScriptBuf(addMultiSig bool) (*bytes.Buffer, error) { - var buf bytes.Buffer - sb := txscript.NewScriptBuilder() - err := fedInfo.addStdNToMScriptPart(sb) - if err != nil { - return nil, err - } - if addMultiSig { - sb.AddOp(txscript.OP_CHECKMULTISIG) - } - - sbuf, err := sb.Script() - if err != nil { - return nil, err - } - - buf.Write(sbuf) - return &buf, nil -} - -func (fedInfo *FedInfo) getErpRedeemScriptBuf(btcParams chaincfg.Params) (*bytes.Buffer, error) { - erpRedeemScriptBuf, err := fedInfo.p2ms(false) - if err != nil { - return nil, err - } - - redeemScriptBuf, err := fedInfo.getRedeemScriptBuf(false) - if err != nil { - return nil, err - } - scriptsA := txscript.NewScriptBuilder() - scriptsA.AddOp(txscript.OP_NOTIF) - var erpRedeemScriptBuffer bytes.Buffer - scrA, err := scriptsA.Script() - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(scrA) - erpRedeemScriptBuffer.Write(redeemScriptBuf.Bytes()) - erpRedeemScriptBuffer.WriteByte(txscript.OP_ELSE) - byteArr, err := hex.DecodeString("02") - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(byteArr) - - csv, err := hex.DecodeString(getCsvValueFromNetwork(btcParams)) - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(csv) - erpRedeemScriptBuffer.WriteByte(txscript.OP_CHECKSEQUENCEVERIFY) - erpRedeemScriptBuffer.WriteByte(txscript.OP_DROP) - erpRedeemScriptBuffer.Write(erpRedeemScriptBuf.Bytes()) - erpRedeemScriptBuffer.WriteByte(txscript.OP_ENDIF) - erpRedeemScriptBuffer.WriteByte(txscript.OP_CHECKMULTISIG) - - return &erpRedeemScriptBuffer, nil -} - -func (fedInfo *FedInfo) p2ms(addMultiSig bool) (*bytes.Buffer, error) { - var buf bytes.Buffer - sb := txscript.NewScriptBuilder() - err := fedInfo.addErpNToMScriptPart(sb) - if err != nil { - return nil, err - } - - if addMultiSig { - sb.AddOp(txscript.OP_CHECKMULTISIG) - } - - sbuf, err := sb.Script() - if err != nil { - return nil, err - } - - buf.Write(sbuf) - return &buf, nil -} - -func (fedInfo *FedInfo) addStdNToMScriptPart(builder *txscript.ScriptBuilder) error { - builder.AddOp(getOpCodeFromInt(fedInfo.FedThreshold)) - - for _, pubKey := range fedInfo.PubKeys { - pkBuffer, err := hex.DecodeString(pubKey) - if err != nil { - return err - } - builder.AddData(pkBuffer) - } - - builder.AddOp(getOpCodeFromInt(fedInfo.FedSize)) - - return nil -} - -func (fedInfo *FedInfo) addErpNToMScriptPart(builder *txscript.ScriptBuilder) error { - size := len(fedInfo.ErpKeys) - min := size/2 + 1 - builder.AddOp(getOpCodeFromInt(min)) - - for _, pubKey := range fedInfo.ErpKeys { - pkBuffer, err := hex.DecodeString(pubKey) - if err != nil { - return err - } - builder.AddData(pkBuffer) - } - - builder.AddOp(getOpCodeFromInt(len(fedInfo.ErpKeys))) - - return nil -} - -func getCsvValueFromNetwork(btcParams chaincfg.Params) string { - switch btcParams.Name { - case chaincfg.MainNetParams.Name: - return "CD50" - case chaincfg.TestNet3Params.Name: - return "CD50" - default: - return "01F4" - } -} diff --git a/connectors/rsk.go b/connectors/rsk.go deleted file mode 100644 index e6221927..00000000 --- a/connectors/rsk.go +++ /dev/null @@ -1,1297 +0,0 @@ -package connectors - -import ( - "context" - "encoding/hex" - "errors" - "fmt" - "net/http" - "net/url" - - "github.com/ethereum/go-ethereum/rpc" - - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - - gethTypes "github.com/ethereum/go-ethereum/core/types" - - "math/big" - "strconv" - "strings" - "time" - - "github.com/btcsuite/btcd/btcutil/base58" - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/rsksmart/liquidity-provider/types" - - log "github.com/sirupsen/logrus" -) - -const ( - retries int = 3 - rpcSleep = 5 * time.Second - rpcTimeout = 300 * time.Second - ethTimeout = 300 * time.Minute - - // BridgeConversionGasLimit see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ - BridgeConversionGasLimit = 100000 - // BridgeConversionGasPrice see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ - BridgeConversionGasPrice = 60000000 - - newAccountGasCost = uint64(25000) -) - -var ( - WithdrawCollateralError = errors.New("withdraw collateral error") - ProviderResignError = errors.New("provider has already resigned") -) - -type AddressError struct { - address string -} - -func (e *AddressError) Error() string { - return fmt.Sprintf("invalid address: %s", e.address) -} - -func NewInvalidAddressError(address string) error { - return &AddressError{address: address} -} - -type QuotePegOutWatcher interface { - GetQuote() *pegout.Quote - GetState() types.RQState - GetWatchedAddress() common.Address - OnDepositConfirmationsReached() bool - OnExpire() - Done() <-chan struct{} -} - -type RSKConnector interface { - Connect(endpoint string, chainId *big.Int) error - CheckConnection() error - Close() - GetChainId() (*big.Int, error) - EstimateGas(addr string, value *big.Int, data []byte) (uint64, error) - GasPrice() (*big.Int, error) - HashQuote(q *pegin.Quote) (string, error) - HashPegOutQuote(q *pegout.Quote) (string, error) - ParseQuote(q *pegin.Quote) (bindings.QuotesPeginQuote, error) - ParsePegOutQuote(q *pegout.Quote) (bindings.QuotesPegOutQuote, error) - RegisterPegIn(opt *bind.TransactOpts, q bindings.QuotesPeginQuote, signature []byte, tx []byte, pmt []byte, height *big.Int) (*gethTypes.Receipt, error) - GetBridgeAddress() common.Address - GetFedSize() (int, error) - GetFedThreshold() (int, error) - GetFedPublicKey(index int) (string, error) - GetFedAddress() (string, error) - GetActiveFederationCreationBlockHeight() (int, error) - GetLBCAddress() string - GetRequiredBridgeConfirmations() int64 - CallForUser(opt *bind.TransactOpts, q bindings.QuotesPeginQuote) (*gethTypes.Receipt, error) - RegisterPegInWithoutTx(q bindings.QuotesPeginQuote, signature []byte, tx []byte, pmt []byte, newInt *big.Int) error - GetCollateral(addr string) (*big.Int, *big.Int, error) - RegisterProvider(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string) (int64, error) - AddCollateral(opts *bind.TransactOpts) error - GetLbcBalance(addr string) (*big.Int, error) - GetAvailableLiquidity(addr string) (*big.Int, error) - GetMinimumLockTxValue() (*big.Int, error) - FetchFederationInfo() (*FedInfo, error) - AddQuoteToWatch(hash string, interval time.Duration, exp time.Time, w QuotePegOutWatcher, cb RegisterPegOutQuoteWatcherCompleteCallback) error - GetRskHeight() (uint64, error) - GetProviders(providerList []int64) ([]bindings.LiquidityBridgeContractLiquidityProvider, error) - GetDerivedBitcoinAddress(fedInfo *FedInfo, btcParams chaincfg.Params, userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) (string, string, error) - GetActiveRedeemScript() ([]byte, error) - IsEOA(address string) (bool, error) - ChangeStatus(opts *bind.TransactOpts, _providerId *big.Int, _status bool) error - WithdrawCollateral(opts *bind.TransactOpts) error - WithdrawPegoutCollateral(opts *bind.TransactOpts) error - Resign(opts *bind.TransactOpts) error - SendRbtc(opts *bind.TransactOpts, to common.Address) error - RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcRawTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) error - GetDepositEvents(fromBlock, toBlock uint64) ([]*pegout.DepositEvent, error) - GetPeginPunishmentEvents(fromBlock, toBlock uint64) ([]*pegin.PunishmentEvent, error) - GetProviderIds() (providerList *big.Int, err error) - GetUserQuotes(types.UserQuoteRequest) (events []types.UserEvents, err error) - IsOperational(opts *bind.CallOpts, address common.Address) (status bool, err error) - IsOperationalForPegout(opts *bind.CallOpts, address common.Address) (status bool, err error) - GetPegoutCollateral(addr string) (*big.Int, *big.Int, error) - AddPegoutCollateral(opts *bind.TransactOpts) error - GetTransactionReceipt(txHash string) (*gethTypes.Receipt, error) - GetDaoFeePercentage() (uint64, error) -} - -type RSKClient interface { - ChainID(ctx context.Context) (*big.Int, error) - EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) - SuggestGasPrice(ctx context.Context) (*big.Int, error) - BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) - NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) - CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) - TransactionReceipt(ctx context.Context, txHash common.Hash) (*gethTypes.Receipt, error) - BlockNumber(ctx context.Context) (uint64, error) - PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) - SendTransaction(ctx context.Context, tx *gethTypes.Transaction) error - Close() -} - -type RSKBridge interface { - GetActiveFederationCreationBlockHeight(opts *bind.CallOpts) (*big.Int, error) - GetFederationSize(opts *bind.CallOpts) (*big.Int, error) - GetFederationThreshold(opts *bind.CallOpts) (*big.Int, error) - GetFederationAddress(opts *bind.CallOpts) (string, error) - GetFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, arg1 string) ([]byte, error) - GetMinimumLockTxValue(opts *bind.CallOpts) (*big.Int, error) - GetActiveRedeemScript(opts *bind.CallOpts) ([]byte, error) -} - -type RSK struct { - c RSKClient - lbc *bindings.LiquidityBridgeContract - lbcAddress common.Address - bridge *bindings.RskBridge - bridgeAddress common.Address - requiredBridgeConfirmations int64 - irisActivationHeight int - erpKeys []string - twoWayConnection bool -} - -func (rsk *RSK) GetDepositEvents(fromBlock, toBlock uint64) ([]*pegout.DepositEvent, error) { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - iterator, err := rsk.lbc.FilterPegOutDeposit(&bind.FilterOpts{ - Start: fromBlock, - End: &toBlock, - Context: ctx, - }, nil, nil) - - defer func() { - if iterator != nil { - iterator.Close() - } - }() - - if err != nil || iterator == nil { - return nil, err - } - - var deposits []*pegout.DepositEvent - var deposit *pegout.DepositEvent - var lbcEvent *bindings.LiquidityBridgeContractPegOutDeposit - for iterator.Next() { - lbcEvent = iterator.Event - deposit = &pegout.DepositEvent{ - TxHash: lbcEvent.Raw.TxHash, - QuoteHash: hex.EncodeToString(iterator.Event.QuoteHash[:]), - Amount: lbcEvent.Amount, - Timestamp: time.Unix(lbcEvent.Timestamp.Int64(), 0), - BlockNumber: iterator.Event.Raw.BlockNumber, - From: lbcEvent.Sender, - } - deposits = append(deposits, deposit) - } - if iterator.Error() != nil { - return nil, err - } - - return deposits, err -} - -func (rsk *RSK) GetPeginPunishmentEvents(fromBlock, toBlock uint64) ([]*pegin.PunishmentEvent, error) { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - iterator, err := rsk.lbc.FilterPenalized(&bind.FilterOpts{ - Start: fromBlock, - End: &toBlock, - Context: ctx, - }) - defer func() { - if iterator != nil { - iterator.Close() - } - }() - - if err != nil || iterator == nil { - return nil, err - } - - var punishments []*pegin.PunishmentEvent - var punishment *pegin.PunishmentEvent - var lbcEvent *bindings.LiquidityBridgeContractPenalized - for iterator.Next() { - lbcEvent = iterator.Event - punishment = &pegin.PunishmentEvent{ - QuoteHash: hex.EncodeToString(iterator.Event.QuoteHash[:]), - LiquidityProvider: lbcEvent.LiquidityProvider, - Penalty: lbcEvent.Penalty, - } - punishments = append(punishments, punishment) - } - if iterator.Error() != nil { - return nil, err - } - - return punishments, err -} - -type RegisterPegOutQuoteWatcherCompleteCallback = func(w QuotePegOutWatcher) - -func NewRSK(lbcAddress string, bridgeAddress string, requiredBridgeConfirmations int64, irisActivationHeight int, erpKeys []string) (*RSK, error) { - if !common.IsHexAddress(lbcAddress) { - return nil, errors.New("invalid LBC contract address") - } - if !common.IsHexAddress(bridgeAddress) { - return nil, errors.New("invalid Bridge contract address") - } - - return &RSK{ - lbcAddress: common.HexToAddress(lbcAddress), - bridgeAddress: common.HexToAddress(bridgeAddress), - requiredBridgeConfirmations: requiredBridgeConfirmations, - irisActivationHeight: irisActivationHeight, - erpKeys: erpKeys, - }, nil -} - -func (rsk *RSK) Connect(endpoint string, chainId *big.Int) error { - log.Debug("connecting to RSK node on ", endpoint) - - u, err := url.Parse(endpoint) - if err != nil { - return err - } - - var ethC *ethclient.Client - switch u.Scheme { - case "http", "https": - transport := http.DefaultTransport.(*http.Transport).Clone() - transport.DisableKeepAlives = true - - httpC := new(http.Client) - httpC.Transport = transport - - c, err := rpc.DialHTTPWithClient(endpoint, httpC) - if err != nil { - return err - } - - ethC = ethclient.NewClient(c) - rsk.twoWayConnection = false - case "ws": - ethC, err = ethclient.Dial(endpoint) - rsk.twoWayConnection = true - if err != nil { - return err - } - default: - return errors.New("unknown scheme for rsk connection string") - } - - rsk.c = ethC - - log.Debug("verifying connection to RSK node") - // test connection - rskChainId, err := rsk.GetChainId() - if err != nil { - return err - } - //check chain id - if chainId.Cmp(rskChainId) != 0 { - return fmt.Errorf("chain id mismatch; expected chain id: %v, rsk node chain id: %v", chainId, rskChainId) - } - - log.Debug("initializing RSK contracts") - rsk.bridge, err = bindings.NewRskBridge(rsk.bridgeAddress, ethC) - if err != nil { - return err - } - rsk.lbc, err = bindings.NewLiquidityBridgeContract(rsk.lbcAddress, ethC) - if err != nil { - return err - } - return nil -} - -func (rsk *RSK) CheckConnection() error { - _, err := rsk.GetChainId() - return err -} - -func (rsk *RSK) Close() { - log.Debug("closing RSK connection") - rsk.c.Close() -} - -func (rsk *RSK) GetLbcBalance(addr string) (*big.Int, error) { - if !common.IsHexAddress(addr) { - return nil, fmt.Errorf("invalid address: %v", addr) - } - a := common.HexToAddress(addr) - var err error - for i := 0; i < retries; i++ { - var bal *big.Int - bal, err = rsk.lbc.GetBalance(&bind.CallOpts{}, a) - if err == nil { - return bal, nil - } - time.Sleep(rpcSleep) - } - return nil, fmt.Errorf("error getting %v balance: %v", addr, err) -} - -func (rsk *RSK) IsOperational(opts *bind.CallOpts, address common.Address) (status bool, err error) { - stat, err := rsk.lbc.IsOperational(opts, address) - if err != nil { - return false, err - } - return stat, nil -} - -func (rsk *RSK) IsOperationalForPegout(opts *bind.CallOpts, address common.Address) (status bool, err error) { - stat, err := rsk.lbc.IsOperationalForPegout(opts, address) - if err != nil { - return false, err - } - return stat, nil -} - -func (rsk *RSK) GetAvailableLiquidity(addr string) (*big.Int, error) { - if !common.IsHexAddress(addr) { - return nil, fmt.Errorf("invalid address: %v", addr) - } - a := common.HexToAddress(addr) - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - var err error - var liq *big.Int - for i := 0; i < retries; i++ { - liq, err = rsk.c.BalanceAt(ctx, a, nil) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - return nil, fmt.Errorf("error getting balance of %v: %v", addr, err) - } - for i := 0; i < retries; i++ { - var bal *big.Int - bal, err = rsk.lbc.GetBalance(&bind.CallOpts{}, a) - if err == nil { - return liq.Add(liq, bal), nil - } - time.Sleep(rpcSleep) - } - return nil, fmt.Errorf("error getting %v balance: %v", addr, err) -} - -func (rsk *RSK) GetCollateral(addr string) (*big.Int, *big.Int, error) { - if !common.IsHexAddress(addr) { - return nil, nil, NewInvalidAddressError(addr) - } - a := common.HexToAddress(addr) - var ( - min *big.Int - col *big.Int - err error - ) - for i := 0; i < retries; i++ { - min, err = rsk.lbc.GetMinCollateral(&bind.CallOpts{}) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - return nil, nil, fmt.Errorf("error getting minimum collateral: %v", err) - } - for i := 0; i < retries; i++ { - col, err = rsk.lbc.GetCollateral(&bind.CallOpts{}, a) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - return nil, nil, fmt.Errorf("error getting collateral: %v", err) - } - return col, min, nil -} - -func (rsk *RSK) GetPegoutCollateral(addr string) (*big.Int, *big.Int, error) { - if !common.IsHexAddress(addr) { - return nil, nil, NewInvalidAddressError(addr) - } - hexAddress := common.HexToAddress(addr) - opts := &bind.CallOpts{} - - var minimumCollateral, collateral *big.Int - var err error - minimumCollateral, err = rsk.lbc.GetMinCollateral(opts) - if err != nil { - return nil, nil, err - } - collateral, err = rsk.lbc.GetPegoutCollateral(opts, hexAddress) - if err != nil { - return nil, nil, err - } - return collateral, minimumCollateral, nil -} - -func (rsk *RSK) ChangeStatus(opts *bind.TransactOpts, _providerId *big.Int, _status bool) error { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.SetProviderStatus(opts, _providerId, _status) - }) - - if receipt == nil || err != nil { - return fmt.Errorf("error changing provider status: %v", err) - } - return err -} - -func (rsk *RSK) RegisterProvider(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, providerType string) (int64, error) { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.Register(opts, _name, _apiBaseUrl, _status, providerType) - }) - - if receipt == nil || err != nil { - return 0, fmt.Errorf("error registering provider: %v", err) - } - registerEvent, err := rsk.lbc.ParseRegister(*receipt.Logs[0]) - if err != nil { - return 0, err - } - return registerEvent.Id.Int64(), nil -} - -func (rsk *RSK) AddCollateral(opts *bind.TransactOpts) error { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.AddCollateral(opts) - }) - - if receipt == nil || err != nil { - return fmt.Errorf("error adding collateral: %v", err) - } - return nil -} - -func (rsk *RSK) AddPegoutCollateral(opts *bind.TransactOpts) error { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.AddPegoutCollateral(opts) - }) - - if receipt == nil || err != nil { - return fmt.Errorf("error adding pegout collateral: %v", err) - } - return nil -} - -func (rsk *RSK) GetChainId() (*big.Int, error) { - var err error - for i := 0; i < retries; i++ { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - var chainId *big.Int - chainId, err = rsk.c.ChainID(ctx) - if err == nil { - return chainId, nil - } - time.Sleep(rpcSleep) - } - return nil, fmt.Errorf("error retrieving chain id: %v", err) -} - -func (rsk *RSK) EstimateGas(addr string, value *big.Int, data []byte) (uint64, error) { - if !common.IsHexAddress(addr) { - return 0, fmt.Errorf("invalid address: %v", addr) - } - - dst := common.HexToAddress(addr) - - var additionalGas uint64 - if rsk.isNewAccount(dst) { - additionalGas = newAccountGasCost - } - - msg := ethereum.CallMsg{ - To: &dst, - Data: data, - Value: new(big.Int).Set(value), - } - - var err error - for i := 0; i < retries; i++ { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - var gas uint64 - gas, err = rsk.c.EstimateGas(ctx, msg) - if gas > 0 { - return gas + additionalGas, nil - } - time.Sleep(rpcSleep) - } - return 0, fmt.Errorf("error estimating gas: %v", err) -} - -func (rsk *RSK) GasPrice() (*big.Int, error) { - var err error - for i := 0; i < retries; i++ { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - var price *big.Int - price, err = rsk.c.SuggestGasPrice(ctx) - if price != nil && price.Cmp(big.NewInt(0)) >= 0 { - return price, nil - } - time.Sleep(rpcSleep) - } - return nil, fmt.Errorf("error estimating gas: %v", err) -} - -func (rsk *RSK) HashPegOutQuote(q *pegout.Quote) (string, error) { - opts := bind.CallOpts{} - var results [32]byte - - pq, err := rsk.ParsePegOutQuote(q) - if err != nil { - return "", err - } - - for i := 0; i < retries; i++ { - results, err = rsk.lbc.HashPegoutQuote(&opts, pq) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - return "", fmt.Errorf("error calling HashQuote: %v", err) - } - return hex.EncodeToString(results[:]), nil -} - -func (rsk *RSK) HashQuote(q *pegin.Quote) (string, error) { - opts := bind.CallOpts{} - var results [32]byte - - pq, err := rsk.ParseQuote(q) - if err != nil { - return "", err - } - - for i := 0; i < retries; i++ { - results, err = rsk.lbc.HashQuote(&opts, pq) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - log.Error("error calling HashQuote: ", err) - return "", err - } - return hex.EncodeToString(results[:]), nil -} - -func (rsk *RSK) GetFedSize() (int, error) { - var err error - opts := bind.CallOpts{} - var results *big.Int - - for i := 0; i < retries; i++ { - results, err = rsk.bridge.GetFederationSize(&opts) - if results != nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - return 0, fmt.Errorf("error calling GetFederationSize: %v", err) - } - - sizeInt, err := strconv.Atoi(results.String()) - if err != nil { - return 0, fmt.Errorf("error converting federation size to int. error: %v", err) - } - return sizeInt, nil -} - -func (rsk *RSK) GetFedThreshold() (int, error) { - var err error - opts := bind.CallOpts{} - var results *big.Int - - for i := 0; i < retries; i++ { - results, err = rsk.bridge.GetFederationThreshold(&opts) - if results != nil { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - return 0, fmt.Errorf("error calling GetFederationThreshold: %v", err) - } - - sizeInt, err := strconv.Atoi(results.String()) - if err != nil { - return 0, fmt.Errorf("error converting federation size to int. error: %v", err) - } - - return sizeInt, nil -} - -func (rsk *RSK) GetFedPublicKey(index int) (string, error) { - var err error - var results []byte - opts := bind.CallOpts{} - - for i := 0; i < retries; i++ { - results, err = rsk.bridge.GetFederatorPublicKeyOfType(&opts, big.NewInt(int64(index)), "btc") - if len(results) > 0 { - break - } - time.Sleep(rpcSleep) - } - if len(results) == 0 { - return "", fmt.Errorf("error calling GetFederatorPublicKeyOfType: %v", err) - } - - return hex.EncodeToString(results), nil -} - -func (rsk *RSK) GetFedAddress() (string, error) { - var err error - var results string - opts := bind.CallOpts{} - - for i := 0; i < retries; i++ { - results, err = rsk.bridge.GetFederationAddress(&opts) - if results != "" { - break - } - time.Sleep(rpcSleep) - } - if results == "" { - return "", fmt.Errorf("error calling GetFederationAddress: %v", err) - } - return results, nil -} - -func (rsk *RSK) GetBridgeAddress() common.Address { - return rsk.bridgeAddress -} - -func (rsk *RSK) GetActiveFederationCreationBlockHeight() (int, error) { - var err error - opts := bind.CallOpts{} - var results *big.Int - for i := 0; i < retries; i++ { - results, err = rsk.bridge.GetActiveFederationCreationBlockHeight(&opts) - if results != nil { - break - } - time.Sleep(rpcSleep) - } - if results == nil { - return 0, fmt.Errorf("error calling getActiveFederationCreationBlockHeight: %v", err) - } - height, err := strconv.Atoi(results.String()) - if err != nil { - return 0, err - } - return height, nil -} - -func (rsk *RSK) GetRequiredBridgeConfirmations() int64 { - return rsk.requiredBridgeConfirmations -} - -func (rsk *RSK) GetLBCAddress() string { - return rsk.lbcAddress.String() -} - -func (rsk *RSK) CallForUser(opt *bind.TransactOpts, q bindings.QuotesPeginQuote) (*gethTypes.Receipt, error) { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.CallForUser(opt, q) - }) - - if receipt == nil && err != nil { - return receipt, fmt.Errorf("error calling callForUser: %v", err) - } - return receipt, nil -} - -func (rsk *RSK) RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcRawTx []byte, btcBlockHeaderHash [32]byte, merkleBranchPath *big.Int, merkleBranchHashes [][32]byte) error { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.RefundPegOut(opts, quoteHash, btcRawTx, btcBlockHeaderHash, merkleBranchPath, merkleBranchHashes) - }) - - if receipt == nil && err != nil { - return fmt.Errorf("error calling RefundPegOut: %v", err) - } - return nil -} - -func (rsk *RSK) RegisterPegIn(opt *bind.TransactOpts, q bindings.QuotesPeginQuote, signature []byte, tx []byte, pmt []byte, height *big.Int) (*gethTypes.Receipt, error) { - receipt, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.RegisterPegIn(opt, q, signature, tx, pmt, height) - }) - if err != nil { - return receipt, fmt.Errorf("error calling registerPegIn: %v", err) - } - return receipt, nil -} - -func (rsk *RSK) RegisterPegInWithoutTx(q bindings.QuotesPeginQuote, signature []byte, tx []byte, pmt []byte, height *big.Int) error { - var res []interface{} - lbcCaller := &bindings.LiquidityBridgeContractCallerRaw{Contract: &rsk.lbc.LiquidityBridgeContractCaller} - err := lbcCaller.Call(&bind.CallOpts{}, &res, "registerPegIn", q, signature, tx, pmt, height) - if err != nil { - return err - } - return nil -} - -func (rsk *RSK) GetDerivedBitcoinAddress(fedInfo *FedInfo, btcParams chaincfg.Params, userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) (string, string, error) { - derivationValue, err := getDerivationValueHash(userBtcRefundAddr, lbcAddress, lpBtcAddress, derivationArgumentsHash) - if err != nil { - return "", "", fmt.Errorf("error computing derivation value: %v", err) - } - var fedRedeemScript []byte - fedRedeemScript, err = rsk.GetActiveRedeemScript() - if err != nil { - return "", "", fmt.Errorf("error retreiving fed redeem script from bridge: %v", err) - } - if len(fedRedeemScript) == 0 { - fedRedeemScript, err = fedInfo.getFedRedeemScript(btcParams) - if err != nil { - return "", "", fmt.Errorf("error generating fed redeem script: %v", err) - } - } else { - err = fedInfo.validateRedeemScript(btcParams, fedRedeemScript) - if err != nil { - return "", "", fmt.Errorf("error validating fed redeem script: %v", err) - } - } - flyoverScript, err := fedInfo.getFlyoverRedeemScript(derivationValue, fedRedeemScript) - if err != nil { - return "", "", fmt.Errorf("error generating flyover redeem script: %v", err) - } - addressScriptHash, err := btcutil.NewAddressScriptHash(flyoverScript, &btcParams) - if err != nil { - return "", "", err - } - return addressScriptHash.EncodeAddress(), hex.EncodeToString(flyoverScript), nil -} - -// GetActiveRedeemScript returns a redeem script fetched from the RSK bridge. -// It returns a redeem script, if the method is activated on the bridge. Otherwise - empty result. -// It returns an error, if encountered a communication issue with the bridge. -func (rsk *RSK) GetActiveRedeemScript() ([]byte, error) { - var err error - opts := bind.CallOpts{} - var value []byte - for i := 0; i < retries; i++ { - value, err = rsk.bridge.GetActivePowpegRedeemScript(&opts) - if err == nil || isNoContractError(err) { - break - } - time.Sleep(rpcSleep) - } - if err != nil { - if isNoContractError(err) { - return []byte{}, nil - } - return nil, fmt.Errorf("error calling GetActivePowpegRedeemScript: %v", err) - } - return value, nil -} - -func (rsk *RSK) IsEOA(address string) (bool, error) { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - if !common.IsHexAddress(address) { - return false, errors.New("invalid address") - } - - bytecode, err := rsk.c.CodeAt(ctx, common.HexToAddress(address), nil) - if err != nil { - return false, err - } - - return bytecode == nil || len(bytecode) == 0, nil -} - -func (rsk *RSK) isNewAccount(addr common.Address) bool { - var ( - err error - code []byte - bal *big.Int - n uint64 - ) - for i := 0; i < retries; i++ { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - code, err = rsk.c.CodeAt(ctx, addr, nil) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - for i := 0; i < retries; i++ { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - bal, err = rsk.c.BalanceAt(ctx, addr, nil) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - for i := 0; i < retries; i++ { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - n, err = rsk.c.NonceAt(ctx, addr, nil) - if err == nil { - break - } - time.Sleep(rpcSleep) - } - return len(code) == 0 && bal.Cmp(common.Big0) == 0 && n == 0 -} - -func (rsk *RSK) GetMinimumLockTxValue() (*big.Int, error) { - var err error - opts := bind.CallOpts{} - var value *big.Int - for i := 0; i < retries; i++ { - value, err = rsk.bridge.GetMinimumLockTxValue(&opts) - if value != nil { - break - } - time.Sleep(rpcSleep) - } - if value == nil { - return nil, fmt.Errorf("error calling GetMinimumLockTxValue: %v", err) - } - return value, nil -} - -func DecodeRSKAddress(address string) ([]byte, error) { - trim := strings.TrimPrefix(address, "0x") - if !common.IsHexAddress(trim) { - return nil, fmt.Errorf("invalid address: %v", address) - } - return common.HexToAddress(trim).Bytes(), nil -} - -func (rsk *RSK) ParseQuote(q *pegin.Quote) (bindings.QuotesPeginQuote, error) { - pq := bindings.QuotesPeginQuote{} - var err error - - if err := copyBtcAddr(q.FedBTCAddr, pq.FedBtcAddress[:]); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing federation address: %v", err) - } - - decodedRefundAddress, err := DecodeBTCAddress(q.BTCRefundAddr) - if err != nil { - return bindings.QuotesPeginQuote{}, err - } - pq.BtcRefundAddress = decodedRefundAddress - - // TODO: later do the same validation for allowing LiquidityProviderBtcAddress to be BECH32 - if pq.LiquidityProviderBtcAddress, err = DecodeBTCAddressWithVersion(q.LPBTCAddr); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing bitcoin liquidity provider address: %v", err) - } - if err := copyHex(q.LBCAddr, pq.LbcAddress[:]); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing LBC address: %v", err) - } - if err := copyHex(q.LPRSKAddr, pq.LiquidityProviderRskAddress[:]); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing provider RSK address: %v", err) - } - if err := copyHex(q.RSKRefundAddr, pq.RskRefundAddress[:]); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing RSK refund address: %v", err) - } - if err := copyHex(q.ContractAddr, pq.ContractAddress[:]); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing contract address: %v", err) - } - if pq.Data, err = parseHex(q.Data); err != nil { - return bindings.QuotesPeginQuote{}, fmt.Errorf("error parsing data: %v", err) - } - pq.CallFee = q.CallFee.Copy().AsBigInt() - pq.PenaltyFee = q.PenaltyFee.Copy().AsBigInt() - pq.GasLimit = q.GasLimit - pq.Nonce = q.Nonce - pq.Value = q.Value.Copy().AsBigInt() - pq.AgreementTimestamp = q.AgreementTimestamp - pq.CallTime = q.LpCallTime - pq.DepositConfirmations = q.Confirmations - pq.TimeForDeposit = q.TimeForDeposit - pq.ProductFeeAmount = big.NewInt(int64(q.ProductFeeAmount)) - pq.GasFee = q.GasFee.AsBigInt() - return pq, nil -} - -func (rsk *RSK) ParsePegOutQuote(q *pegout.Quote) (bindings.QuotesPegOutQuote, error) { - pq := bindings.QuotesPegOutQuote{} - var err error - - if err := copyHex(q.LBCAddr, pq.LbcAddress[:]); err != nil { - return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing LBC address: %v", err) - } - if err := copyHex(q.LPRSKAddr, pq.LpRskAddress[:]); err != nil { - return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing provider RSK address: %v", err) - } - if err := copyHex(q.RSKRefundAddr, pq.RskRefundAddress[:]); err != nil { - return bindings.QuotesPegOutQuote{}, fmt.Errorf("error parsing RSK refund address: %v", err) - } - decodedBTCRefundAddress, err := DecodeBTCAddress(q.BtcRefundAddr) - if err != nil { - return bindings.QuotesPegOutQuote{}, err - } - pq.BtcRefundAddress = decodedBTCRefundAddress - - decodedLpBTCAddress, err := DecodeBTCAddress(q.LpBTCAddr) - if err != nil { - return bindings.QuotesPegOutQuote{}, err - } - pq.LpBtcAddress = decodedLpBTCAddress - - decodedDepositAddress, err := DecodeBTCAddress(q.DepositAddr) - if err != nil { - return bindings.QuotesPegOutQuote{}, err - } - pq.DeposityAddress = decodedDepositAddress - - pq.CallFee = q.CallFee.AsBigInt() - pq.PenaltyFee = types.NewWei(int64(q.PenaltyFee)).AsBigInt() - pq.Nonce = q.Nonce - pq.Value = q.Value.AsBigInt() - pq.AgreementTimestamp = q.AgreementTimestamp - pq.DepositDateLimit = q.DepositDateLimit - pq.DepositConfirmations = q.DepositConfirmations - pq.TransferConfirmations = q.TransferConfirmations - pq.TransferTime = q.TransferTime - pq.ExpireDate = q.ExpireDate - pq.ExpireBlock = q.ExpireBlock - pq.ProductFeeAmount = big.NewInt(int64(q.ProductFeeAmount)) - pq.GasFee = q.GasFee.AsBigInt() - - return pq, nil -} - -func (rsk *RSK) FetchFederationInfo() (*FedInfo, error) { - log.Debug("getting federation info") - fedSize, err := rsk.GetFedSize() - if err != nil { - return nil, err - } - - var pubKeys []string - for i := 0; i < fedSize; i++ { - pubKey, err := rsk.GetFedPublicKey(i) - if err != nil { - log.Error("error fetching fed public key: ", err.Error()) - return nil, err - } - pubKeys = append(pubKeys, pubKey) - } - - fedThreshold, err := rsk.GetFedThreshold() - if err != nil { - log.Error("error fetching federation size: ", err.Error()) - return nil, err - } - - fedAddress, err := rsk.GetFedAddress() - if err != nil { - return nil, err - } - - activeFedBlockHeight, err := rsk.GetActiveFederationCreationBlockHeight() - if err != nil { - log.Error("error fetching federation address: ", err.Error()) - return nil, err - } - - return &FedInfo{ - FedThreshold: fedThreshold, - FedSize: fedSize, - PubKeys: pubKeys, - FedAddress: fedAddress, - ActiveFedBlockHeight: activeFedBlockHeight, - IrisActivationHeight: rsk.irisActivationHeight, - ErpKeys: rsk.erpKeys, - }, nil -} - -func (rsk *RSK) AddQuoteToWatch(hash string, interval time.Duration, exp time.Time, w QuotePegOutWatcher, cb RegisterPegOutQuoteWatcherCompleteCallback) error { - go func(w QuotePegOutWatcher) { - ticker := time.NewTicker(interval) - for { - select { - case <-ticker.C: - rsk.checkRskAddress(hash, w, exp, time.Now) - case <-w.Done(): - ticker.Stop() - cb(w) - return - } - } - }(w) - return nil -} - -func (rsk *RSK) GetRskHeight() (uint64, error) { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - number, err := rsk.c.BlockNumber(ctx) - if err != nil { - return 0, err - } - - return number, nil -} - -func (rsk *RSK) checkRskAddress(quoteHash string, w QuotePegOutWatcher, expTime time.Time, now func() time.Time) { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - log.Debugf("checkRskAddress was started %v", quoteHash) - - log.Debugf("Exp:: time %v\n", expTime) - log.Debugf("Exp:: now %v\n", now()) - log.Debugf("Exp:: quoteHash %s\n", quoteHash) - - if now().After(expTime) { - log.Errorf("time for registerPegout expired %s", quoteHash) - w.OnExpire() - return - } - - currentBalance, err := rsk.c.BalanceAt(ctx, w.GetWatchedAddress(), nil) - minimumBalance := new(types.Wei).Add(w.GetQuote().Value, w.GetQuote().CallFee) - if err != nil { - log.Debugf("Error getting balance from watched address %s: %s", w.GetWatchedAddress(), err) - } else if currentBalance.Cmp(minimumBalance.AsBigInt()) < 0 { - return - } - - // if account had enough balance N confirmations ago means that confirmations have passed - height, err := rsk.GetRskHeight() - if err != nil { - log.Debug("Error getting RSK height: ", err) - } - checkHeight := new(big.Int).Sub(new(big.Int).SetUint64(height), new(big.Int).SetUint64(uint64(w.GetQuote().DepositConfirmations))) - checkBalance, err := rsk.c.BalanceAt(ctx, w.GetWatchedAddress(), checkHeight) - if checkBalance.Cmp(minimumBalance.AsBigInt()) < 0 { - return - } - - madePegout := w.OnDepositConfirmationsReached() - if madePegout { - log.Debug("Successful pegout done for quote ", quoteHash) - } -} - -func copyBtcAddr(addr string, dst []byte) error { - addressBts, _, err := base58.CheckDecode(addr) - if err != nil { - return err - } - copy(dst, addressBts) - return nil -} - -func copyHex(str string, dst []byte) error { - bts, err := parseHex(str) - if err != nil { - return err - } - copy(dst, bts[:]) - return nil -} - -func parseHex(str string) ([]byte, error) { - bts, err := hex.DecodeString(strings.TrimPrefix(str, "0x")) - if err != nil { - return nil, err - } - return bts, nil -} - -func isNoContractError(err error) bool { - return "no contract code at given address" == err.Error() -} - -func (rsk *RSK) GetUserQuotes(request types.UserQuoteRequest) ([]types.UserEvents, error) { - filterOpts := bind.FilterOpts{} - - if request.FromBlock != nil { - filterOpts.Start = *request.FromBlock - } - - if request.ToBlock != nil { - filterOpts.End = request.ToBlock - } - - events, err := rsk.lbc.FilterPegOutDeposit(&filterOpts, nil, []common.Address{common.HexToAddress(request.Address)}) - if err != nil { - return nil, err - } - - var eventInfos []types.UserEvents - for events.Next() { - event := events.Event - eventInfos = append(eventInfos, types.UserEvents{ - From: event.Sender, - Amount: event.Amount, - Timestamp: event.Timestamp, - QuoteHash: hex.EncodeToString(event.QuoteHash[:]), - }) - } - - return eventInfos, nil -} - -func (rsk *RSK) GetProviderIds() (providerList *big.Int, err error) { - opts := bind.CallOpts{} - providers, err := rsk.lbc.GetProviderIds(&opts) - if err != nil { - log.Debug("Error RSK.go", err) - } - - return providers, err -} - -func (rsk *RSK) GetProviders(providerList []int64) ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { - opts := bind.CallOpts{} - providerIds := make([]*big.Int, len(providerList)) - for i, p := range providerList { - providerIds[i] = big.NewInt(p) - } - providers, err := rsk.lbc.GetProviders(&opts, providerIds) - if err != nil { - log.Debug("Error RSK.go", err) - } - - return providers, err -} - -func (rsk *RSK) WithdrawCollateral(opts *bind.TransactOpts) error { - _, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.WithdrawCollateral(opts) - }) - - if err != nil { - return WithdrawCollateralError - } else { - return nil - } -} - -func (rsk *RSK) WithdrawPegoutCollateral(opts *bind.TransactOpts) error { - _, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.WithdrawPegoutCollateral(opts) - }) - - if err != nil { - return WithdrawCollateralError - } else { - return nil - } -} - -func (rsk *RSK) Resign(opts *bind.TransactOpts) error { - _, err := rsk.awaitTx(func() (*gethTypes.Transaction, error) { - return rsk.lbc.Resign(opts) - }) - - if err != nil { - return ProviderResignError - } else { - return nil - } -} - -func (rsk *RSK) SendRbtc(opts *bind.TransactOpts, to common.Address) error { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - if opts.Signer == nil || opts.From == [20]byte{} || opts.GasPrice == nil || opts.Value == nil || opts.GasLimit == 0 { - return errors.New("incomplete transaction arguments") - } - - nonce, err := rsk.c.PendingNonceAt(ctx, opts.From) - if err != nil { - return err - } - - tx := gethTypes.NewTx(&gethTypes.LegacyTx{ - To: &to, - Nonce: nonce, - GasPrice: opts.GasPrice, - Gas: opts.GasLimit, - Value: opts.Value, - }) - - signedTx, err := opts.Signer(opts.From, tx) - if err != nil { - return err - } - return rsk.c.SendTransaction(ctx, signedTx) -} - -func (rsk *RSK) GetTransactionReceipt(hashString string) (*gethTypes.Receipt, error) { - ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout) - defer cancel() - - hash := common.HexToHash(hashString) - receipt, err := rsk.c.TransactionReceipt(ctx, hash) - if err != nil { - return nil, err - } - - return receipt, nil -} - -func (rsk *RSK) awaitTx(function func() (*gethTypes.Transaction, error)) (*gethTypes.Receipt, error) { - var tx *gethTypes.Transaction - var receipt *gethTypes.Receipt - var err error - for remaining := retries; remaining > 0; remaining-- { - tx, err = function() - if err != nil { - continue - } - ctx, cancel := context.WithTimeout(context.Background(), ethTimeout) - receipt, err = bind.WaitMined(ctx, rsk.c, tx) - cancel() - if err == nil { - return receipt, nil - } - time.Sleep(rpcSleep) - } - return nil, err -} - -func (rsk *RSK) GetDaoFeePercentage() (uint64, error) { - opts := bind.CallOpts{} - amount, err := rsk.lbc.ProductFeePercentage(&opts) - - if err != nil { - return 0, err - } - - return amount.Uint64(), nil -} diff --git a/connectors/rsk_test.go b/connectors/rsk_test.go deleted file mode 100644 index 135cbc50..00000000 --- a/connectors/rsk_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package connectors - -import ( - "context" - crand "crypto/rand" - "github.com/ethereum/go-ethereum/common" - "github.com/rsksmart/liquidity-provider-server/connectors/testmocks" - "github.com/stretchr/testify/mock" - "math/rand" - "testing" - - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider/types" - "github.com/stretchr/testify/assert" -) - -var contextMatcher = mock.MatchedBy(func(ctx context.Context) bool { return true }) - -var validTests = []struct { - input string -}{ - {"0xD2244D24FDE5353e4b3ba3b6e05821b456e04d95"}, -} - -var invalidAddresses = []struct { - input string - expected string -}{ - {"123", "invalid contract address"}, - {"b3ba3b6e05821b456e04d95", "invalid contract address"}, -} - -var quotes = []*pegin.Quote{ - { - FedBTCAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - LPRSKAddr: "0x00d80aA033fb51F191563B08Dc035fA128e942C5", - BTCRefundAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - RSKRefundAddr: "0x5F3b836CA64DA03e613887B46f71D168FC8B5Bdf", - LPBTCAddr: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", - CallFee: types.NewWei(250), - PenaltyFee: types.NewWei(5000), - ContractAddr: "0x87136cf829edaF7c46Eb943063369a1C8D4f9085", - Data: "", - GasLimit: 6000000, - Nonce: int64(rand.Int()), - Value: types.NewWei(250), - AgreementTimestamp: 0, - TimeForDeposit: 3600, - LpCallTime: 3600, - Confirmations: 10, - }, -} - -func testNewRSKWithInvalidAddresses(t *testing.T) { - - for _, tt := range invalidAddresses { - res, err := NewRSK(tt.input, tt.input, 10, 0, nil) - - if res != nil { - t.Errorf("Unexpected value for input %v: %v", tt.input, res) - } - if err == nil { - t.Errorf("Unexpected success for input %v: %v", tt.input, err) - } - if err.Error() != "invalid contract address" && err.Error() != "invalid LBC contract address" { - t.Errorf("Unexpected error for input %v: %v", tt.input, err) - } - } -} - -func testNewRSKWithValidAddresses(t *testing.T) { - for _, tt := range validTests { - res, err := NewRSK(tt.input, tt.input, 10, 0, nil) - if err != nil { - t.Errorf("Unexpected error for input %v: %v", tt.input, err) - } - if res == nil { - t.Errorf("Unexpected error for input %v: %v", tt.input, err) - } - } -} - -func testParseQuote(t *testing.T) { - for _, tt := range validTests { - rsk, err := NewRSK(tt.input, tt.input, 10, 0, nil) - if err != nil { - t.Errorf("Unexpected error for input %v: %v", tt.input, err) - } - for _, quote := range quotes { - result, err := rsk.ParseQuote(quote) - if err != nil { - t.Errorf("Unexpected error parsing quote %v: %v", quote, err) - } - - assert.EqualValues(t, len(result.BtcRefundAddress), 21, "BtcRefundAddress should not be empty") - assert.EqualValues(t, len(result.LiquidityProviderBtcAddress), 21, "LiquidityProviderBtcAddress should not be empty") - assert.NotEmpty(t, len(result.FedBtcAddress), 20, "FedBtcAddress should not be empty") - } - } -} - -func testCopyBtcAddress(t *testing.T) { - err := copyBtcAddr("1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK", []byte{}) - assert.Empty(t, err) -} - -func testCopyBtcAddressWithAnInvalidAddress(t *testing.T) { - err := copyBtcAddr("0x895E7D15510C3f77726422669B0Ef768d26F7FEb", []byte{}) - assert.Equal(t, "invalid format: version and/or checksum bytes missing", err.Error()) -} - -func testIsEOA(t *testing.T) { - validAddress := "0xD2244D24FDE5353e4b3ba3b6e05821b456e04d95" - - eOAAddress := "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4" - sCAddress := "0xd9145CCE52D386f254917e481eB44e9943F39138" - invalidAddress := "sfdasfasfaf" - - fakeBytecode := make([]byte, 4) - crand.Read(fakeBytecode) - - rskClientMock := new(testmocks.RSKClientMock) - rsk, err := NewRSK(validAddress, validAddress, 10, 0, nil) - rsk.c = rskClientMock - - if err != nil { - t.Errorf("Unexpected error creating RSK Client: %v", err) - } - - rskClientMock.On("CodeAt", contextMatcher, common.HexToAddress(eOAAddress), mock.AnythingOfType("*big.Int")).Return([]byte{}, nil) - rskClientMock.On("CodeAt", contextMatcher, common.HexToAddress(sCAddress), mock.AnythingOfType("*big.Int")).Return(fakeBytecode, nil) - - testCases := []*struct { - caseName string - address string - assertions func(result bool, errorResult error) - }{ - { - caseName: "Validates that address is EOA", - address: eOAAddress, - assertions: func(result bool, errorResult error) { - rskClientMock.AssertNumberOfCalls(t, "CodeAt", 1) - assert.Nil(t, errorResult) - assert.True(t, result) - }, - }, - { - caseName: "Validates that address is SC", - address: sCAddress, - assertions: func(result bool, errorResult error) { - rskClientMock.AssertNumberOfCalls(t, "CodeAt", 1) - assert.Nil(t, errorResult) - assert.False(t, result) - }, - }, - { - caseName: "Returns error on invalid address", - address: invalidAddress, - assertions: func(result bool, errorResult error) { - rskClientMock.AssertNumberOfCalls(t, "CodeAt", 0) - assert.Error(t, errorResult, "invalid address") - assert.False(t, result) - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - result, errorResult := rsk.IsEOA(test.address) - test.assertions(result, errorResult) - rskClientMock.Calls = []mock.Call{} - }) - } - -} - -func TestRSKCreate(t *testing.T) { - t.Run("new invalid", testNewRSKWithInvalidAddresses) - t.Run("new valid", testNewRSKWithValidAddresses) - t.Run("parse quote", testParseQuote) - t.Run("test copy btc address", testCopyBtcAddress) - t.Run("test copy btc address with an invalid address", testCopyBtcAddressWithAnInvalidAddress) - t.Run("test EOA address validation", testIsEOA) -} diff --git a/connectors/testdata/test_block b/connectors/testdata/test_block deleted file mode 100644 index d7b532fc..00000000 --- a/connectors/testdata/test_block +++ /dev/null @@ -1 +0,0 @@ -040000204377031a167a880d496cdba116a48dc4e00302471c010c000000000000000000c281054148a5f6ae2dbd5ffbe47bacd01b4963d7b21721a098de432c685c86906c251d610b1812174112b421fdf308010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff5f034aa00a1c2f5669614254432f4d696e656420627920797a33313936303538372f2cfabe6d6dc0a3751203a336deb817199448996ebcb2a0e537b1ce9254fa3e9c3295ca196b100000000000000010c56e6700d262d24bd851bb829f9f0000ffffffff0401b3cc25000000001976a914536ffa992491508dca0354e52f32a3a7a679a53a88ac00000000000000002b6a2952534b424c4f434b3a040c866ad2fdb8b59b32dd17059edaeef11d295e279a74ab97125d2500371ce90000000000000000266a24b9e11b6dab3e2ca50c1a6b01cf80eccb9d291aab8b095d653e348aa9d94a73964ff5cf1b0000000000000000266a24aa21a9ed04f0bac0104f4fa47bec8058f2ebddd292dd85027ab0d6d95288d31f12c5a4b801200000000000000000000000000000000000000000000000000000000000000000000000000200000001c48719db38d7286213202ef512b180e389ed8f863bd5116b658b7b1913dd9fd7080000006a4730440220753eed9c595e55d95bbdeb3dd7ed1fe2f3a6838f68c840304db5e7b8d99616b902204a3143b47ee93f1f75b79dea9919eea9d211b08fd53578fd676bad73971d2f23012102380b75bccbe06860dd573c1a6278690b6efb4ec7c14795d1ee4858bf8c718dd6ffffffff055b552e000000000017a9142e62d87b097cee76ede80d01671036795898a392878d320200000000001600143932ea911f6f00b168a2c094c07cdb120ae5f31bf2cf27000000000017a91484910e6a662c1c114b45af3bef8bdb5c3cb7e302876e043300000000001976a914f1ebdd044ba61d8c8575cc52556cba834dde727388ace3d54208000000001976a9142287780623e361a71cfaaece32e34e29c43b09f388ac00000000020000000144231bd11a49b738a40a9d61797cae2e0a7bf5fed17cac4a17c6f5d5901cd6ee040000006a47304402207355b1200170b1ad5686a8e69f1c90dd0a79a20995d32636205ac5c5d5f10cab02206f7d52f9506763e88efaff1912e6c8e7b2143b4f7e973f3c0891dac75f6bfe03012103ef1c91b0b16de91c9e329ec6e3978306f6f1be0fe17c268142c464e9d5c5e086ffffffff05b42002000000000017a9146429d4937585cd797e3487c2ec1e1b1a4b5643c38730852700000000001976a914a2d02198fb8a8864e46b288978bc0bd06281a8a588acacf6040000000000160014039030cb16169370df8ff6efb61510f31117f110415d03000000000016001417ded7f0cc4b8d7c78a02077a95c0f5e359006e51f93b302000000001976a9143fce6c0d0a796108473972a6aafed1f862d59cdf88ac000000000200000001ee3e9e1e39829cdc480a34f2cd1bf84020dd59a1089a476bb9ef4acd03cc6d1c010000006a473044022005a43ef8adfda21e62c8f7e9b53b34881cdfb244df83f00076124a22eaef1f00022078660b79dbd81e9ef758c67852837f5d7fc88a7e484c1c911791cbe1fe0a273b012103ed257a5abeb7c227b6f93452ceb69a740b95bec7347af0089e9828eb3099c553ffffffff041423020000000000160014567c0c20d77d2555cb1c575cd77ae4beffe6ebfe40420f000000000017a91446d0923d870ccfb78a517eab7d29ee04cdf946008726f90c000000000017a914b424501f9884de1a64c51716f5ab6fbd3778bcfd8706179e12000000001976a91425d5e52ffe76d7731939f90860e24ac0580b0e6d88ac0000000002000000015515f4b8eb0f0940262681ce22e28781485c8ddf72b7d497e09b2b5d9c91f7da040000006a473044022075ffdcb605e5f6ca1ffae66e8be441baa365e35529c0e78e4aa14ca9f5d1d60302205e08cd99b61d28d98d3b7870420bbc61153b31f92c3c65ccdde33aa0659dcb2e012102b179b59f68f39f2b565ce9fcbd20a31a540f3e666aede58aeeaee0dd3afaa50cffffffff041a550300000000001976a914838d383a8599bbb92be892d66f9d89b20bef891488acb0ad01000000000017a9145d91b7e2b7d131ffe9d58186968f2b1b77e5327987ee6c040000000000160014679d3278c89996cb03a6d5846d123fab30692c6d9ee80136000000001976a91485707c088ee68b434d07fb27297d988c106e0e6488ac000000000200000001b10b77e9ca96107c9c914e9da63b7311b32906e47d50208de2d86a06cf583c42030000006a473044022048b97c56659f17000080dee87e71d8403cb8ac1f107aa4fd22826ac7e2d3af7902200fa074caea0a6b3beea7cf6a26bc019dff3f2edd94bf5e7b5e68f9d947026cf00121029ae2ea972c2772f64b39dc35d4fbe51fda2873ff61fa6749a01d95c89adfbb98ffffffff031cf1010000000000160014a2657e98bbecb510a77764d13dd560765f7ea96bfea02000000000001976a9148f90a05af9cf4c556428fdbd7a7dda15cc4329e588ac41f49c14000000001976a914e4d78524f78f7c125b5f7cfeb35ef784dd89a97288ac000000000200000001e1dc5596cbdf67cb858d46c241aaf88100b42d1fc38d09ff8055f550ffc04222000000006a473044022050d1625b1667a3720f12b78d4e8f51b1c3bcacd00e6990beae7ed4f3a5befc03022024fcf01ad035d2501be68609ebfb90a0421646cde00d9cc4f17f6e280ccfd5150121033a02b1359eb4f0707aac1b3959a6f3a603d9a08b5523a8efd170b953da905499ffffffff036ac00a000000000016001475558910bc0e253a3af80ea2f401f540bf60dabc68d401000000000017a91475cc0cea90123e5b6e4dfed46718f471f7fff76f8754a3e83d000000001976a91424bb97a4b1753bc83fdfc33e9c1cbdf01febd33888ac00000000020000000001015cc3af292dd2e81c21582b0666879869112ebc97ebb4a3a6bd2cfe8a30f92b940100000000fdffffff02a0cd8700000000001976a91409e6abdfa8852101e9b9ba77efa6f4a9617cb5ec88ac1cf8df0d000000001600144b6cf6cf48ec8aa8dfa1e10395f829c8a504dcb80247304402207acaf018536ce71f69b3e964a19337779eff9e8921b7c99a1cb26e0001329c3e02201cfd03cdf29fa3625c7b77d82d0950f3f3b6ba1d5a6fcae0633899741a14cafd012103414dfd31acabbbe2135534bd359a6b120d02ddfac80847da0946d1f58850311c47a00a0001000000000101467d68009e32e59ce4d1922e2eda72db0f8fd81063e86c368dd86d1f20544bcfa60f000000fdffffff0230630300000000001976a914465fc9aefbae49573a92647478ffb04aa1b2aca788ac744a040000000000160014c0eddf5ac90463b323390dc432f60f2e11f0ff670247304402201a4b51d8b0bcb124eb85a84c0137d206f2c6135ab6abeda8bab6359d4522c0d5022054a00169d0b1295fb1bdda4b4f02b8f9045b19bfa381daf956e6f296bbf1f79e0121021f578eeff40a062a8af418c375cc75c115842b3a50c1a124794e3290b3c4be6a0000000001000000000101318c7a4a66f8e8095761f0102179cc68d199de397ac929b8e8101e5a0496b568cf01000017160014e3b458d319ffe728af37308041e2d27d1b8cf63afdffffff02b0ad0100000000001976a914d28a787ee9fe430a506943c5d430fe1bd29aea9488ac0b4f07000000000017a9140d29074709794b7581582f5c50650e1cf99dedee8702483045022100bbf75d7ba3a9461dbd80a3dc2eae0ca082143c84953b8c884ed09f36ce7aa8bb02204cf7d39af03016912e0df09e090e3668efe8d8778e9c1a690579ace5625e94780121023ece002dd29da8b8ad778bd7eabb66cbb089e35702320c245ec7aa31375bbfec000000000100000000010941f81db4753d862d074accc2e48db7ae4b009cdb593300d78d9bec928657c4c4180b0000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffffc23eef8c4020da4e8d14d672910d0cbceeeccb58ccc20751654253e27f9ab0348e010000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffff2b8c3570c73853100543603964f2520bcf74eba018ec98508ea481684d250f0c8e010000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffff2b8bbf3a64b575fc7fd41f8c375358ee5ad8f2eaad0e41405066b67a316340e80a0f0000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffffc23eef8c4020da4e8d14d672910d0cbceeeccb58ccc20751654253e27f9ab0344000000000ffffffff6017293709631f38f270f44901255056f554e66586ef01e5625d4d5af4906ace0000000000ffffffffc23eef8c4020da4e8d14d672910d0cbceeeccb58ccc20751654253e27f9ab0345001000000ffffffff2b8c3570c73853100543603964f2520bcf74eba018ec98508ea481684d250f0c4000000000ffffffff2b8c3570c73853100543603964f2520bcf74eba018ec98508ea481684d250f0c5001000000ffffffff018c601200000000001976a9147917d1a60100b1644eed7470416846b3d47e6ca188ac0247304402200c3bf77fdcdf6812e87842aecd29330ef0f92df21855218a753d35a6bd46835e0220012abb12401a9553d6a277c430ac291f48c982272618d0001c7ab2982104d2bf012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f802483045022100ffc33ce99acb1ad30e86e68e3064de14cbf812603e146f25e122939b1c7d55b602206a4af41eac36ec11f287750db8f8968bcb2441bb544d184795cb2d7d7d45d177012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f80247304402200c1a6de620d53fa7f903601290d4e3f5dd99140dabddcbc0cf5897dd2a50e8a6022000f74a90aed9f29caa55cd295a60b0616f37d7500cb8cf3a47fa5f4c3dab01f4012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f802473044022022157e5de4b4aa1f27558e4a84d4b6405685ac88c77d6b80c8b59a59f4c242e402201c80f0245cf80bfa65aeae463ebeccd4f703177d58f00182c622bdbb62e5c4d7012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f802483045022100c9743358125ad077458539ab9dd8645523f8895dc3a7e318391d8ff254cb1a1b02206fe5f365b19012b2ae544a28b725c3bbdf4efd4480aca0b0134091639a561f40012103539cb2e3deaad8081837a0eb3f712f783c037a644ad2c48a7b13a705a51ce9920247304402205fe2414680dd3568c0e90fa9887e1e8769f797ceea5d60dc8eeb1d282053e748022077b2b98f21e4864f4650cb0bf94b36b41b6545bb78720940aa2b1df42cb28517012103539cb2e3deaad8081837a0eb3f712f783c037a644ad2c48a7b13a705a51ce9920247304402207551784a84c900e4de9ecee8392667dddfc9cd520760fb1eef9a9d116d06b91302207518fc5752f350417b6e33b384a9d73a1e6fa3f639b186acc0a6c101b1ff5f51012102b3840bc0926d368e800f3a74cd55116fe2bf0b5a8a034026b637a8ccf714bb2102473044022029de33d48afcf2bd7628d6f5d9c59475225b325e9f4b9fda998170ca47eabc97022020a996c2a9cfd5413dbfee004d7f7d6f789ccfa09f6d9a4a3c70a28647bc17b4012103539cb2e3deaad8081837a0eb3f712f783c037a644ad2c48a7b13a705a51ce9920247304402202903511a054dbe7d7159bd355e8aa38e8584eb6db5f11d5303f01e058dfdcccb022042bc1d520d938d1b1b5d9f4555f1bc50de4ae7cd03ca9ce3ff9aba8505f39ca0012102b3840bc0926d368e800f3a74cd55116fe2bf0b5a8a034026b637a8ccf714bb21000000000200000001a91f2f32e9cffc2d4165f1780b8e45cec44663bcd61ebf8e1242bc25d7df6de6010000006a47304402202ce40308f2e5534b37911e1185249e728233451240df45f34e6eb895f2b844570220623cdca1c6ec25982dabc72c0fe9b6dc4ceded99d6316a29beaebb82dd4cb49201210219eef11a43b8ca76241b958626afcf114ce0a291e6bdc2ec42de93fdeb4590adffffffff04eecc110000000000160014cf6b227568706787baa3d39518dd2a187d836bf5e1a1cd04000000001976a9142a5bdc3b25f9513d11b72ecd37bcde3d60718cac88ac4e4101000000000017a914a1ac7830689664abb600b8c05078a8a812f20a378700dd6d00000000001976a914835f7dbec77a6a584be6bd3053ab336fff9f818588ac000000000100000000010192cd5ab7a567c570e863dd605de72a4c0d38815b541f6ad3c7d110a58cf897e61500000000ffffffff3af607030000000000160014878e773f8fb136a1e0eb1b407f3360e28658eaa3d8d600000000000017a9140b40d034963495770b77977dca13a76a308ab22187632e0100000000001976a9143e2a505f252f1b516a6c25d7becc83a7ea7b2b2c88ac519b01000000000017a9145070698ad66778f5c069d372789abdbc49d9f58a8767af0100000000001976a914e5faf29258d2656ebd036a75ecb1e4387ce4e9fb88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76709400000000000017a914bc010b2c67f9d04277a0dfa6647b7ab72a2a333b8755af0100000000001600144aab55ed56edf45f161ff1e84537254b3c3050ab671608000000000017a91448c93e1b5c12b68b6f51f0ca5cd9f3010b49146a87bf626b0600000000160014a1fdc4483881c7fd28ff02cad38e4656afb28930c5ed10000000000017a9149bc3ed660657359a980d6c144f470eed7035e97887f2950600000000001976a914d0eca241ed8f550aaabd628900abb67550e9f0e188ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76637a0300000000001976a914732cf229d3dc3b9b8a0803ffc07d4e364e54aba388ac946b0000000000001976a91417c3aa0fb2437db9348b60e85c22f3744a91438488ac141803000000000016001491748ba80fe88709c9a3eb16beaee2d628243dd557c10100000000001976a914d0afd5e72ede8f8b0f701336bc2f88499f8ffe2288ac4c5e010000000000160014de92737bed2e8cb490010eb83e46c88fcdc565e29aa86d01000000001976a914e141c50832e6bfa8384d3049d47ec6ca405ad3d788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a0ef0000000000001976a91433c9ddef2c79adf7532ed0dbacd79c9267eb63c988ace47000000000000017a914b267081381a2ba5e7441249ccafeb12c1ae98c41879dbd01000000000017a9140b43f90ed0bd3cfab4c78467b4ccc393617eb02e87ac0f150000000000160014faf48b24e1ee588c35d157c7fa98f90934a3fad7712e0100000000001976a914ca9f2dcd78449441204cf460bfe3f30beb9fc25b88ac1e60030000000000160014c2a71757ccd13ec9e3a66c165139819bb3ef8011a00821000000000017a9143be02bba28dcd0ef37959d50182374752087e5e587343900000000000017a914cb0c56a8ec46e2d33052d610ca7c593d20effca987ead07201000000001600147fb80fc252f990bbd9676baba5f8a4c4230e34b6393c20000000000017a914c1f9bd54fe774fb21450825264c2c8d670f3549987f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d72a00000000000017a9148d0f5432e7ef17c1b35d98fe9b828ef9054b0d54875aa60d00000000001976a9140f31c380dae5318610cb8599250915087cbb916288ac281001000000000017a9142a014b8d49f25a11a3639ea1dd4dfb83df03895887d0e60200000000001976a9146b61da254add7ea82140f4c56ae53756c7e0d6fe88acbf720d000000000017a914332b614a9e2f8a97a9ee8d39cde3da1e50fdf8bc87712e010000000000160014401a97f069b722dc7736c0618a5d2a31bb7464a708e50300000000001976a9143f668107024590e569cc12beef3ba49df001deb488ac973101000000000016001453719bf12736321104dc0558407eeaa87bba0aa04456000000000000160014d927e4af6169b360f3eb05b05edd587c850d33dfe09304000000000017a914d2db333f750bd098423622791653b2785b174b218789c503000000000017a914936ccf5362527f43b0a62e3bbfedb33212e4e19087e5510300000000001976a9147dd40ce086cc9e4b02c9c92f9a2ddf62deaf60b188ac1eb503000000000017a914cb46bd4de1f1d89a21c19bc65e7d1792491cde0e87ab5e0300000000001976a914fd5c539d4f8d04d37046c4c89df1a30bd62bd13588acece800000000000017a9149656a497ada4d3ae313f35555584e80f3a5d85d78790d003000000000017a914b7d7b8a1c1d75ddb97467b3a5594918967284846878bda01000000000017a91432a1cd03157ac09bd9955077066dd1b3caee4843878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b0ad01000000000017a9142a58ba1d306252d5dc28b27f41313089eff122a1878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d70201000000000017a914df1367dfd411aa9a3e44b9f187445b60ac3ff56f87a7d101000000000017a9140d02f72b2d9837ad41b5d6413e888cb8f34d31f58711590100000000001976a9142efa71d2debe7b8bf5e39270e801b3032b91a37c88ac093803000000000017a914682d7b9eca107a06034d47a5aa33e265881a7270878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a00e0100000000001976a914d39abcda422721fda1a5ad1ef420d464cbb18a1988ac8c3e02000000000017a914d18e46a2f17a74dd1adff54d7691248a2a9c17e78702483045022100aec961fe7c3b4b014d3f4ebfb38582bb8baf8d728c6c25a81158d684c4b051df022049c5517a2e06729cb469b72d6829185f750c6ab4c03ac66ee3a32f2ba17a20be0121034ef89c73c80b4b5bb4ff63f793a260667aaf55e1aaf1e249d8a7350ec0dd74120000000002000000000101b775f79af732ffb6bcb399dc2d5bab2bb32acb6f2d47c6b9b2dbe878eea8dbef0100000000fdfffffffd7406200500000000000017a91440551ec071a676a5242176afea59234f8c5dffbd8794050000000000001976a91461de983303bb4b29135f2afb2554088bfb80088488ace90500000000000017a914c70ccd678373090c4fb510e187c42b4956198b5387770600000000000017a914f218cb8a8b492a18ba40c90f2a9f39b90b9e4f1d87be06000000000000160014d68a39e77647763b336c5697d9ef8239497abb66ec060000000000001976a914192d10e7356180448e09f6e7e8aaa5858fe6bb6a88ac8a070000000000001976a914519fc403c0a482c43e8cce60f24b933b652d99ab88acbf070000000000001976a914d1bfedb5e0f0df5cf444de99fc257c1a69a6d99e88ac6a080000000000001976a914ddbdb79bfebd6a82e888d8738aaf51bc491c03e088ac6f0800000000000017a914d314a06215fe69c6aba3ec8accf87fbac973c894879e08000000000000160014c691dac92a2380241f00a7c7aef9690985053ba305090000000000001976a914bf1516ebc58c006e2b192cf79c3f4e1b2b4c52e588ac68090000000000001600145eca9847302f39ce4568b57c475b8efcaf1adaefad0a00000000000017a914151bed39843f0a6e0a288c85f404f294a893fbba876c0b0000000000001976a914591232005edb6aa356617f454efcc5118dda189b88acfe0b0000000000001976a914622c83d787c9969cf562443acc2a8af83c64d43a88ac540c00000000000017a914af286cf699e720244c53d41c61dbf792407e06ba87610c0000000000001976a9140033b172e1a2332976c76752bb172a522d5ac76788ace10c00000000000017a9146ad9601fc89fdfffd9cc20a6bc027bce5093e132873f0d0000000000001600147d59317ac4286cde136f30eccea6a0bc50146fbca60d00000000000017a914fbccadbc1f7ce548b94ea79e571ae314a484740387fd0d000000000000160014c8d1cb2c630c5ff65439940a67d0a59fa344ffab0a0e0000000000001600144ce0503ec85d684b4e9784b5e180d16104cb81564d0e0000000000001976a914b851fe4771e8b2ceb93eeb6fb6f7ccce343a4d0d88ac890e0000000000001976a9144fe34f687dd6f25edf33d5b44974a10abbfd09ed88acaa0e000000000000160014e3309892f00508b4a311c92b9a706a575bb03429a10f0000000000001976a914d981072c8d8732297e6c51924246fd881f8e59e288aca90f000000000000220020fb2bfbc06103c16ea3cf4540311ed70a5a81c6d18cd216c1be726e046010023862100000000000001976a91493481ac6df0d9faeca6e629af3d57a4a8c879aef88ac621000000000000017a9146dfb8c767571806aabb2702ae377bac1b62069c08782100000000000001976a9149a9ba913761c9340d73f7acac36f3fb89706c33888ac28110000000000001600148726af7688ae5b92f3c221b77774a7f9bff695f3e2120000000000001600148abba4cd3cdaae9773061055c3e0afa629b2446b4f130000000000001600144bdcea84d19ff94bf70f0cbcbf75b5c060897ed1c4130000000000001600140f72ae1ce0d3ed1edd39360dbcaf94cf1561b8cf2d140000000000001976a914a25632cfe4425d215bb1d0f9ed23854d0e027ea288ac44140000000000001976a9144b0f12ca0971445cacb95e0df04204e6b6ac041d88ac82140000000000001976a9147092bfe23092820add6b9865823b6a12f2f9756b88ace71400000000000017a914e6896517457166dc7183124153a0658639084f9c8762150000000000001976a91485bb8926255b0fe1df5d6d09286892f0a834a42e88ac6f1500000000000017a914a07bbdd5f847e8e289b0106acf970d0ac0a56e8f87b9150000000000001976a91449634d2366f59b2b8073cc3f2d2c5d2a7e80330188acd6150000000000001976a9145224fcc88a2c75b6dfa76a3e16edecfd27b949df88aca8160000000000001976a91452ec2d97305f51a6a6b48fc43464389e8c8f6e8588ace1160000000000001976a914b81b3d627c3fbcbf86533e2cfc7e3e74817a79e288acf5160000000000001976a914055e5d96285cca45bfc5b166f42f74cb6c8c41b488ac941700000000000017a91479c4ad38a190741abb01c72aa5c38e97fc5756b387b7170000000000001976a91402bd2adb41f359d3a82fc5f40661c458db2dd76d88ac3218000000000000160014ecb35017d2b5acde1cbdb76c59b35cb3c02565c964180000000000001976a914244cbb98c291300947574955b8323d0eb861ae8888aca6180000000000001976a91452b1f178e0cab70be38d1d72c7bf07dff3278a8d88ace218000000000000160014377171a216b6e23f6838cde49b94a9c7aefe717deb1800000000000017a9143a6a57f387205c75878426be1358833fb493d1f18748190000000000001976a914b78d32f66b1e2f77574202e8223847e6dd59b3e488aca31900000000000017a914bba428cd80c02b07a338db61fb82acc988b8ffd987c719000000000000160014e650553734548c910dd4d017f33114ac718bc3a6e619000000000000160014d1fb69338896608be965c5131c4d3af1583640541b1a0000000000001976a91441b50113f17858d4cd870ba17107312d4f7200cf88ac541a0000000000001976a914697f330bfae67976366df6d37d50671a4f2080b388ac571a0000000000001600140e6606c7087f64a7f68141ef296e435b0019fcadcd1a00000000000017a914e4916ac4e52202063cef3507cbc4a24b83783a1187021b0000000000001976a914f2ba6f2e347269673d9840a5b5a30a3bb48c88d488ac211b0000000000001976a914768ea5af09891d8558c229e4e75878d3c4715f8d88ac341b000000000000160014e1a4d4d5b5ade088a902d204113bb3e43f228811ec1b00000000000017a91428db0e155fc2545722271a3aea0d6607049fac13873b1c0000000000001976a914a98b32b984b23f9e52be187824458c49e5eaf5fa88ac6d1c00000000000017a9141d1e3ce398b36898385004e6b53cb47f3cd45ce787761c0000000000001976a9143569a911c0879accb94768fb962fe4339e54245a88ac7e1c0000000000001976a9142df173bf416ea90cfb33df2a97637c2df819802788ac8e1c0000000000001976a9148cd4b786ab8a15cc93474a1fa8000675b9857cd288ac8e1c00000000000017a9145fb650a2020f37568e5596e70bf03a09342c336b87951c0000000000001976a9141bb1f576082370608e5aaf329d71f065dee655e388accf1c0000000000001976a914842a08907d68b4ab9a86b24de6284fb060efe5d688acf11c0000000000001976a914d792f586d0cefb4b63d858731b3620b9535b5edc88ac211d0000000000001600149dd6b22630adf23e14d44338a6262a63eab1d39a341d000000000000160014f89eb83e0d871715d1f7acca94485fa5d552e75daa1d000000000000160014c6b23a13f7feb83f4404faf7292f8373ad7b203bae1d00000000000017a91434425cb8949df0671723cb99d70c6a661927252d87e21d00000000000017a9146c1e467ff40f1a12e444f97860763415f9adb651870e1e0000000000001976a9143b6829a77f9b09deb44368e8b17fb1f0c1ff503e88ac181e000000000000160014bf75522f08e6ca0eeee4f73d26fe88ee02941253201e0000000000001976a914698d5ae6a447f10856fb7bf6a1fed3bfdf50a7b888ac2f1e0000000000001976a914af15d1e40dba6babe81f3cf20c43ec8092b195ef88ac531e0000000000001976a914225b1366a72a1dc31d0dca0b0193fb25c9ccba4088ac6c1e00000000000017a91439911d1964774ad3438263eec3e2c816a772b52187e51e0000000000001976a914881f652f84157302a5b090c3c04e627dc7561c8588ac0c1f00000000000017a914b23cfe34782b074c6f1e007292f2d069e9bbddd887a81f0000000000001976a914e7f4ca8e8692e1ff04d8c63b99966f0429d1647f88acaa1f0000000000001976a914e060272377047034d6820d4673145524b93ef94288acb71f0000000000001976a9145ecf5903c50f8d32688353fe98319d86c941247c88acc51f0000000000001976a914a37a31bf153f2ed7d4d3b7fd418c50f8ea66986588acd71f0000000000001976a9142c1bd8855631568825dcf46a75b81d7a9f9cd41c88ac232000000000000017a9140c27f89be8687938fb1a4fdb22d3a9fc8ac34b2d872e2000000000000017a914f7adfd2196ecdd43a12aac1ec3c05713453854618744200000000000001976a9141119d9a4df57eebb32ba00c70f70f82a711c5f0288ac47200000000000001976a914ac7b96bf5c6a73647124540675e15dee56ee56bc88ac4b200000000000001600141c10dd765e7e561f4b46e399b22706a5983deac97d2000000000000017a914bae59ccd91f8d0efb0063f557bb9a5a0ae72ce9b877e200000000000001976a914ad0a611649b4d623cf41c677c4c1eb6305df84c188ac91200000000000001976a9147bf76e94058d051a899923b55ba358960ee0f10a88aca32000000000000017a91448231b172dbaeceec72aee93dc6d0ffec9badb1a87b12000000000000017a9144e89d9ac0a89acae97da42bfac485e6b0952f0d787ba20000000000000160014f737244aab147ff6da1c919107b0c341cadfd20bf1200000000000001976a914e4e6a2413dd9f544b228ad8e8a81e705f95473bf88acbb210000000000001976a914c7cc8eda7e1af7b52f1c785c50374c2ef813559688ac08220000000000001976a914c3887492af9ef4bb092481f541519902effdc37788aca92200000000000016001454c6caf119422e95ccd7af15a55e4bd37c94ae6ddc220000000000001976a914579bde0c55cf0c7c5fdaa67ac1c2dac8d0043fe388acf1220000000000001976a9145a09935be0fe2b60ef6fb891aca23877e110dec188ac6c230000000000001976a914b91d204c5a056e5dd7a3d05a65718dcf923008d688ac71230000000000001976a914418b8fcfc4f9b354aca12e4c2a72916f9950ac2388ac742300000000000016001432de979d6ac0cd493ce164f851828e13ca2b96e382230000000000001976a914dea9761c78478d6877c5f2e6c6b484a3614d38b988ac872300000000000017a91437dea00bcea743e335642694b9e64470c00ccc0a87b823000000000000160014600e0512c721d6dab0deecba65acaa32f2849f82dd230000000000001976a9144a81b7df24248c37cb2402713370b5de11613aa388ace2230000000000001976a91438f9e3554aa08ab56a127a5a29a63be89e2a417c88acf92300000000000017a914c97734b7c2c808865a8044aed8764c6ecf4762ef87062400000000000017a914d46a0c62cc5ee71fc0649222da2b44d26a75c89a871f240000000000001976a9147381bdd76d2951687b42862133a5907b1a0bbb1988ac2e240000000000001976a914305a6d276e99aa164aa0d5f600b7ee718529ac8a88ac382400000000000017a914a1d9baa43a8ce1a18202719354aea81d16adbac88739240000000000001976a91433d6d341b1b31ae4479d601ab682b86fc9dbc7e288ac41240000000000001976a914dec9a75e8942f734fe3ce13e045dd460a636c2b488ac422400000000000017a914688ea6b4390d759f88d5820ec023cb12fa4dc3458747240000000000001976a9145fd6d9eb9bfc5a09f347cd949f77a14076701c8488ac6b24000000000000160014c5173de4501500e77b2cf8e2fbb4e44021d195757c240000000000001976a91499c5cfc64cc08c17cf70ff58e4337005af2981aa88aca12400000000000017a914d4e0a9ef6f5448dbdd572e94aabe48688a1c6ada87dd240000000000001976a914fcd6020e94ed832f218580988e9554317eedd61e88aced240000000000001976a9142f7914fa5f736f61f7b9aae3a0859b888aec400e88acf42400000000000017a91422bf803226155f84cef2266170db76a87f1b58e2874b250000000000001976a914d4839e4f12860f78f48cf30e5c320701559aafa888ac5a250000000000001976a9146ccd7cd0690fb101dc557041d7c4329757afd93188ac782500000000000017a91438b78fe59f1897d58d6b488b26aaec0d9d814a6087962500000000000017a914c7e54d154e5c20ca4cb10c55b5f60ee72091910f87c32500000000000017a914a4c6b8ba1dc702aa926ecac4c639d253b7ca0c0887d9250000000000001976a914b13039c35001f4240f35939b1fbdcf21f25e1b3088ace4250000000000001976a9146aabc132373f4b7c69acce89e0690d3084af105a88ac0b2600000000000016001444f45d6af4f619ffc562fb8a5fe663512914c5c41f2600000000000017a91480735ed6bf4eea1944550da32db131473ef47a238739260000000000001976a914e074fb1b867e7ec04d40b0c96a6d011281155eec88ac412600000000000017a914b05052be661336fc407e47d6e171db9a3ca537ad8743260000000000001976a914c9c53a687eb44aea184277304161c95d9134abdf88ac452600000000000016001483d83ba0116cd25f0dce8979c6260f54610af2da462600000000000017a9143b6a8e24e529b95500af6da0555ee79a72cef61d8749260000000000001976a91420f74d640903ceb72da3103f74d8cd682ceaf3b088ac5526000000000000160014a0bf3125164c1534345419e544b7d3f9e33d65745d26000000000000160014e771ba842572fa785485bcf32ba17a1526626ea479260000000000001976a9147d1e1f5249020a7e8e45f19aedb9a92622409e4988ac832600000000000017a914d78f98ab422579718c58dccd54a13747009baec887a9260000000000001976a914a876a6bb52fc1ef0c48e0eaa22fe3fb6244c961388acd9260000000000001976a914ebd0904afc4c1354982c7609b20b18708c10240488acdc260000000000001976a914a30d04aa86ddd93c9a8a0f6971ea9b9cb8bf6bf788ac0c2700000000000017a914c127dd1178b08e6508e21c27dc7cc8553c8f45ce87302700000000000017a914d1f54f6a40f19e72b670f7c9b7d17e3fd6140a9d873a2700000000000017a914fcd46093ccd7196d643644a063d6fc6d00ff17bd87512700000000000017a91438913709b0220caabc1c0dcf65085154f16030ac8754270000000000001976a914b2d1be8c18c810840a3fba0af64b705c58f8feec88ac5a270000000000001976a914dfede222d2f77efcb638c133b5b3cbf01a13a41288acb0270000000000001976a9141e578dfebd183eae49cb5407ca1c6f45c0edf72388acb2270000000000001976a914e132c9a367ffb52e9e1eef2daded7ee6a3a0001388acc4270000000000001976a9148aea8154cdc405933564a31e402412d026b1c09f88acd6270000000000001976a91445e6232c4a847d932618856aca13ed4021425eed88ace7270000000000001976a914633a8dd8607a0d6622c32f39118248abf64547f588ac1e280000000000001976a9148fba5a7497e65a25f7ca9f3c6e276e81a66e7af888ac2a280000000000001976a914589e8348330d326e7a644f1aadf5ad9397eb261d88ac2a280000000000001976a914cb73716d8d599154d7c6951f1ef44424452b212788ac50280000000000001976a9148f8a2c53578a85cb5daf3881403aef854e2d8c3288ac89280000000000001976a914ebad3d5c0f0609e3d8e2659b1b7fba72217065df88ac95280000000000001976a914308c5118772bb93fadc2e7670a1fc540c691b1ca88aca0280000000000001600140d1bb5e6411be0a125daae7c2432c1aff663fc53a1280000000000001976a9147240d887ae505097ae8b5ff5ba4d9ab0fe43b54d88aca7280000000000001976a9145fdcc2220cf8f12db3fcbd8129a150dede9f4e2088acb1280000000000001976a9148c57a5685b8989dfeff1db38c585dea34edf35ec88acdb280000000000001976a914c461ff51a13df932e2c81aebeca06c5845513ee288ace2280000000000001976a91438c4614f67cb2fc67624e48c7ffe6d03361ec80d88ac4a290000000000001600144dd2c9a69863fbff991cef321efe02a3ad9527046b290000000000001600143e38a8a7c97f882540578e3c64caacbf1ebced2a71290000000000001976a914469f9b4c7066107eaa70d84a94a0247b8fc7129888ac95290000000000001976a91436fb5fbc26335df935bde172fbb84bba7df59b3688acb229000000000000160014905d86742702bc990c0c907c17417833e536243eba2900000000000017a9140ebd997861dc70365029ef011c5be55b6ac2643987cf2900000000000016001446019701f5b7af18276bb9477df182041fee024cf8290000000000001976a914fac6797c1d8b5cd38ca6fa6de9291b24c5c62eb588ac0b2a00000000000017a9148e5061bedf2826e3c4068d52b4960122ce6ebc58870c2a000000000000160014cb9b9dc898387701902e4dcbac5bf4a06e481c23192a0000000000001976a9142c37b8d98a1fd7b140eeecf36d4856435f223a4e88ac3a2a00000000000016001407df706abdd7eec89b80b5ee1818d8b993812c4c462a0000000000001976a9149337d8caa7d5e8ffe0e2556e508e47e4e913c68888ac4b2a0000000000001976a91454b8902a913de04b6d5d3fcf35d8e7249745291088ac712a00000000000017a914e33c30daa00e762533827573a4ac2638af8daf1b878b2a0000000000001976a914809c392c93e54e49f08b4f8e77f7588929987e4688ac912a00000000000017a91404df4435f3e63436107669af13602b990765daa987952a0000000000001976a9140b7e7ca02d967bab417edc4d4dab3093a476ff7e88ac982a0000000000001976a914baa60c4f2bb0d5f5857ce8077bfc009789a07c2788aca22a0000000000001976a91425289513296a7e72b9b393ce4f8b3fad0e3b855288acc22a0000000000001976a9140e7e90397bb087128ada6c72fc11ee8222287b5088acd92a0000000000001976a9143228dd84e4097bae87072b6ce05f34a1c087ef0c88acf92a00000000000016001473c68bd973fa464b3b0e3a486e0845555db9cf0c0b2b0000000000001976a914ca80554156d29e5d18acfdd4e39d3985e42ef92388ac102b0000000000001976a914d7215c322e188ee3f20da1513aab2398a982e0e888ac242b0000000000001976a914549f95ab3bbc5420f69c0046c21ffb1bdeef729c88ac5e2b0000000000001976a9142242dba4653ef07f068de783c6c31a31f4d4487588ac7a2b0000000000001976a91440ed65e3d72241cbb294d81b03cf8c4ed22cbeeb88aca92b00000000000017a914a359774d4caab3b0877afdf0520bc1681570362d87b02b00000000000017a91474e0441ed7a0e45a23481581c4e6e635d6b34f0a87b32b00000000000017a914eaa365a0fe6d86665d9e01b1b4b983e09c1abbdb87cc2b000000000000160014320448dc6f95c1ca8e7e5793502cda9a815c9f08fc2b00000000000017a914642b8f19652d547d80e36636f80346c9c20f82f3870c2c0000000000001976a91403feed381b0fda1c1193841e37e6c19b08b4727d88ac392c0000000000001976a914dd8b0e9f8a17f006d29f120afe959d2abf8e61c588ac682c0000000000001976a914c6b8de59bc37777159b3e282ddb23f66933b75b788ac752c0000000000001976a91491f80ccee8b2da2f476c15a1078cfa8f28f37abe88ac772c0000000000001976a91467f0af24e538da8ff9564dd77fcf7026a4a3dbe588ac872c0000000000001976a914ebbcd7be0b7e366277d1d24f0229eb662d31aaf988ac8a2c0000000000001976a9147ec2925c5c82e1eb3839d138cb4400977fa0917188ac9c2c0000000000001976a914f5317f4547a243cb23ecf5656380c9462251ccc488acb72c00000000000017a914d28af71d098d0fde82ce22e80ce593f3b3466d2187ba2c0000000000001976a914793b28ce47a6c46484b59e6da9c1aad3c373ec5988acbf2c0000000000001976a9142461750d440aaf27e6b682908094ba7eaa153fde88ac022d000000000000160014736632060bcf1d27a28d938a25bdfc76e68fd6be152d0000000000001976a91494d051e6ee9701cd24ea7502a412f80a8a94e61e88ac1d2d0000000000001976a9141cef2cabbdb99e7e58be83410dfea85d8ac3d3dc88ac242d0000000000001600149124f4c3843baa14394a05a5259aa87afa009da72c2d000000000000160014dbd1df33e4f143889c4f186ebcfa2dea6000e6954c2d0000000000001976a91451617b114d7d19eb73b6cecb614248cb3858d35f88ac912d00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87942d0000000000001976a914e6e98a21f2781ca9c454eabe4e11df42869ab64488ac9c2d000000000000160014e2a32571ae1e5e92f2fa5cd6517fb91f01e621c29d2d00000000000017a914da468e04da3e2bb4aa316bcb4803b75af00f3b8a87a72d0000000000001976a9146845853278db9559d68bb7b791114d676a9d995d88acc12d00000000000017a914c98b94084551bf1a94614158e93800bc0962e52f87ca2d00000000000017a9146a14d1711d0533db176ec08790e77e33765f180287d72d0000000000001976a914f458c59ef1407e91790dcad3ac0fbc21927a644c88ace22d0000000000001976a914388ef178afb9382a334375180f54df325c0abc6988ac1b2e0000000000001976a9146c3a0530ff2f104d093ff0f52dbce60114759ab788ac622e0000000000001976a914513c6b8ce104b83755d6bf9f8226f4ea0f163f7788ac802e0000000000001976a9140227337458356af8a24ce51dd887eebd703e80ae88ac912e00000000000017a914d2b54edcca71ab9242c316ffe85741ba9fe6d85087962e00000000000017a91484e3a393a214b12ea4703ed4016bc8772b46905e87bf2e0000000000001976a9145c72b4d592f10b5bb1e360305b48c464feec9a4c88acc22e00000000000017a914ad7c402f93172d8e997d62b585f1d671c3d48a1187cf2e0000000000001976a914fa71485bae3d640b27edd4dbf9f628ba774fc8a288ac012f0000000000001976a914afb6bc8e1736706be10889972d73b3289ce0efb588ac122f0000000000001976a9146244a4b1bf8bd836a4c0b7797df9ba9920c777b088ac602f00000000000017a914c584bb0903e1beaf3f83b45c270b6bd6567f73c4879b2f000000000000160014b07c42c9edd158c73545d31459f08983ca6afba0af2f0000000000001976a9142d5838ac9014cea2e0d5a39caa740491b978c45388accc2f0000000000001976a914c140e9067aa9ef74ac3d57b585f5b591dd3e293688acee2f00000000000017a9148c6bd3b65b87bfab541c761194cb9cd3926714fc872b3000000000000017a914cfbab77fe19cee24ca06cb0fa3f5896cb26da4b387373000000000000017a9147654ec61c9a0615b6243e0db5e66cc1f7d0c6753873e300000000000001976a91407f36e5cee6dfe94578dc83c578ec992286bc00188ac3e300000000000001976a914b02ebc90187ddaa813152d4555b731f21a60fe9388acaf3000000000000017a914f45bbfc1c133219884b07ee03a73dfdc6196936987143100000000000017a914967b524b66934c01d4ec81d6c44dd52c0d4ad9e8871b31000000000000160014a800e1a8e2d4279a01324886e0c8123ff10784c762310000000000001600142c58b09fabfced799479f48d97642eb0bdcd69607c31000000000000160014019242aa351e0b0e9c9f409bdb3962693861dc2885310000000000001976a91460b6536db197bd6961277d620f83a7c1b407319988accf3100000000000017a9148c9ad4b09bffdad60c28a90a85c1a2dd8d47966c87b932000000000000160014366e1a229337f492254d60368ecfc3cd26d7b2bacf320000000000001976a914e06a3b9f3c07e31d82b359c2d2e4d59609da924588ace8320000000000001976a91427fee6ceb429898bb26a553646039924712a3cc288acee320000000000001976a91467de5c8472f7cf79650ad41e3c8729c9ba4543a488acf33200000000000017a914bcf3a0213099ad2cf25b7896def319583cd3299387683300000000000017a914d79e9732770ece573bea76b515c793265d5db86e877e330000000000001976a9148d4dae3c798e2d7887476fbeab06f8787cbbe22988ac933300000000000017a914288fe1aee811ed1c113ac0af051d5286f6997dd087a3330000000000001600149ca647cfc92e5b6e8e3afa6799b34c5a09a62cfbaf330000000000001976a914ccb3fb1e376af0ecb8f8ca97fd073b6fbc8c585088acbf330000000000001976a914539bacca5728d8a93d67283e5ec63a87f4f59fa488accc330000000000001976a914f2c5a4d4de5ca58491e317142a8ea581abf076b988acd1330000000000001976a914a1219aad2ddbdcaf6cb610c940cd9f936efead8188acfd330000000000001976a914ebba8abac2c79217adf6eea0b60a46752f8341bb88ac6334000000000000160014a641972d98c6501c385fafe7918344a42b6451156e340000000000001976a91414a4b5beb9716d130dd20dfc772348eaea87045e88ac8a340000000000001976a914f48920129754fb0151e956286754a201b9c50fab88ac9b340000000000001976a914ea8a954113129b48c594f3c226a6ed3f18689bf388acd4340000000000001976a9142129bbc934eae13c7f1ef3c9a46f3e649ee6b38288ac4b350000000000001976a9149d92e246d72d64ceb02fce286dff00c6c4e18bed88ac4c350000000000001976a914c82bd9c996072f7c53c298c8dc22a7d19513bd4d88ac5b350000000000001976a914dae6a4342773b56ed56a526b574a1295e1a2687488ac643500000000000017a914b06cbf5059fc199bea8d2a43e30290ea6d3e54af87653500000000000016001467fcd1f9bc00cad291fc39f5b88cd2f01a3ee10c70350000000000001600149dd6b22630adf23e14d44338a6262a63eab1d39a85350000000000001976a91431222b3848adc7975c0a7b43667ff7afb1f0c92c88acab3500000000000017a914f048c6858ee91dc90e8590a95fe3b98872a3ceb887d535000000000000160014fca7b20d066479444afdf0c9e7a00868c5fb5046e0350000000000001976a914cb4ffae6adcfab1eff242364bf1d0ab30c73f92c88ace4350000000000001976a914aee9530da7b015bf0d5030098404d4237f820de888acee350000000000001976a914073fa22788e45dc7d7deb96b32e8e6a78e85f59b88ac34360000000000001976a914141b1dfcc107972829efb9c44009ddbd6c38b02c88ac363600000000000017a914150f79af92be2fafe225c4a6845520e7fb16c46887403600000000000017a91440c6492c670cf503fd4498b9642bb3e67ecf74128780360000000000001976a914b9ef8f05c425394dae8d730e03a77160d3cab38288acf3360000000000001976a914dcf956888463f4c6238a2207dc00fa278216122f88acf6360000000000001976a9146837e1e4f9a22c971d8d483aaefe9711749beab188ac0c370000000000001600148e9178734894ecb0e6077518650aeb5f1f8c8ccc0e370000000000001976a914f73fc4a64cbe9a2448e2ffaa4b7c4ce9cc1f82cd88ac27370000000000001976a914efb3223aa0d22267903e5e2633fde65c85706de988ac553700000000000017a9143d8703bc627cb701f0425e9542f047930a32f68f87b1370000000000001976a914cf46389744b04a4d2d77ba8d47a06cd189fb4e6588acd9370000000000001600144f2874731d8119ce84e01a077b8f764a71a11b99e8370000000000001976a9143e92964bba687cbb545b1313646c11560758bf8488ac4b380000000000001976a914c01e78bbafe72f3e09d09b52af8ddd785d58b80788ac4c3800000000000017a914abdab7355ef92e674337458f4973e3ad953f9d6887893800000000000017a914f97acfd93ea64f2d4f623864afe8d82278d2eb5687fa380000000000001976a914db9224988d3e3b10d61d2811a86a85e5e292be5a88ac073900000000000017a9149dff18a208c788f94b94240b17e799811ad6a330871e390000000000001976a914a61a6c44b656939802a449006ffcc80af33f180188ac243900000000000017a9140d3d04d974c67b2fd7dc6d80a6f57ad6ef71ba5987333900000000000016001485aed4e91d195c395ffc49d425c80f4c16255c44643900000000000017a91417471e82384af7f31d87a699d31dbb0d627c5df1877e3900000000000017a914edb7aa8447e073351c0d90bedee9ef4df5f0bfd5878f3900000000000017a9144e45b01b901dd57b94a6bed260ad18adb0cd6e8987a039000000000000160014d571f5d0bd3b7844a39f635409be5c9096bbb8542a3a00000000000017a91482f54dffa73e242c1b3117ea132e73177665f37b872e3a0000000000001976a914349b5bd273c46ebeeec16cc416e53de8ce286cbd88ac853a00000000000017a914ccf515f7da53fa22d194f003b396983361c6560d87c33a00000000000017a914ca8899d81ac14ef4f15f48a716ff041426ac2c0d87093b00000000000017a9143327fbcee1e867a262dc7de0ff3870386705bb04870a3b0000000000001976a9140c39cfa51eb0fc5c059b025edd8fc98a9e330b1288ac1b3b00000000000017a9142dbb5aab2dc35eec1ca1eab699c8dd3472f58a16873f3b0000000000001976a914c51db1ad2c1c126cddc8f4afdf34d0195e54b4da88ac4e3b0000000000001976a9147fa0c00b6373a87557602e5df1d06bdce3dc1c5b88ac743b0000000000001976a914c4b9a0445a47004e1d2519af3c4893f1d24ec33988aca33b0000000000001976a9140109554282fbfe0f1650fd70bac1c5e470bc823a88acb73b0000000000001976a914072a93d1445e342110cfc467ea6e5b184b58d13f88acdd3b000000000000160014af45dca3dc41fb1bda242c716456b8107bf0a85f193c0000000000001976a91460c89fd86a6512f6fd68f8c67a31ad4e132e580c88ac493c0000000000001976a9143bb74933344dfed667ab9be3c8ffa7ea5c548f0388ac4e3c0000000000001976a914d83bc49c09884fe312ecd72dad4b6849ceb355fa88acd63c00000000000017a9142c4dcacb8baa9d136865caf418b89878cec55a6687df3c0000000000001976a9141ba87689679142d2194eb4dca0e3ba82c21024c188acf33c000000000000160014950395d507feaa5256f707c6e90d873b3c9d41baff3c0000000000001600142bbff2693914040101db22c82f997a4c4e014da8ff3c0000000000001976a914478d2a65e59af497dd02cb5f886aaeae60cde70488ac133d0000000000001600144ffd2b9d917a0ee0e9fc205378814944eb61ea8f393d0000000000001976a9141119d9a4df57eebb32ba00c70f70f82a711c5f0288ac4c3d0000000000001976a9141937c7bdcc7b347ad36235ed20a50ef5b8efbcba88ac583d0000000000001976a91458df19b5ecbbb611475366b5d6e917f2b8bfda1d88ac5e3d0000000000001976a91407706e5ccb0f178e20d3791093daec41bdaeb89088ac6c3d000000000000160014815be32da397ea7b7a20de05444d9907605f932fc53d00000000000017a91459bf9e8de31319181b65788a042eabb4e03eb1c287da3d0000000000001976a91416f378c939244e6969726cdca75f1baa3e29aee388ac0b3e0000000000001976a914d748cdbff86b3bd23e5309eb8601beb53593e76688ac403e00000000000017a9142677e305e74b306a5a6efd162be1dc8801dd3c7587593e0000000000001976a914946fa3c6dd635cd142d1bf2e1fce440a25bbd20688ac953e000000000000160014050dba114a792124eb70069f1f10aacd16edffb1b03e00000000000017a914da6b553bbc2ed2d34b1755f684293a1d31e0904d87ea3e00000000000016001455bdc1d2fec01cb74b3f8f6bfb2ccf99bc18259d063f0000000000001976a91493d55ec0e69a43e30d9027bc5c06f7c5e6bfd5c488ac3d3f00000000000016001472603c99c47d2b7d974555911ce06d784ca8009bd23f0000000000001976a914558ea1795999f72cf6afe106269616bcc39d2aa688acea3f00000000000017a91453c83aa98857624af619cc5ed92d2ab8dfcd71af8712400000000000001976a9140fe30d27db7bd35b1232cce9f26cc55d037d3cb288ac35400000000000001976a9145f4b7a1a7a87157950a0292a0f145f09a093805488ac354000000000000017a914ca6bb6c6d5d7d4277b8e1682a423cbf7d3bcdc7c8738400000000000001976a9147198961e150a9224421f6ab06917440590af3e6088ac7f400000000000001976a914ac3279c7f64953ca7a62e44ec7d75910fb330fb688ac89400000000000001976a91450955fbda0f08c176458a4dc63b872c383694a0688acb2400000000000001976a914cc8b048675f5f3e4811237fa7dcd1db646a2939688acb44000000000000017a91417471e82384af7f31d87a699d31dbb0d627c5df187bb40000000000000160014d71fab9ede81c10f6d0535f7207655632039750fd2400000000000001976a91451ddb2dae3eef61c811548e09f35d1f54e11181888ac144100000000000017a9143edd418beefe51ed38bddbe4f53fe2a7b61403c6873041000000000000160014eeb24a10661a6e451e37a76a9ba34dfed2dfd88e3c410000000000001976a914cd57f7d934387f1ad3a299e43e8548a61349e40088ac47410000000000001976a9141f1f9a5923dfe499fd5f70d06a3970663ce5059d88ac5e41000000000000160014c3c7c3bece6c329343f167b0de25396d785595c06e410000000000001976a91482d61e58e8cee360e39fcec5ad658a9cd5467f1988ac8b410000000000001976a914285250bb3453e43839186aa32a1a7caa5cc4d75088aca241000000000000160014faabd05bbf73cbba0ca95e43c83c823d3a419262cf4100000000000017a914919b88c99537c05fc26b5fdf434aa25f535b8ca487fe410000000000001976a91421c2c94365e0581f4c28ba02428fb39b6ee25c2688ac08420000000000001976a9149d11041d9d8011bc7cbbc46471626fccde061fa988ac30420000000000001976a91473243a43beca32a976fa813c1811484a424711d188ac4f4200000000000017a91466af56d7af0fad1c91426dfbcd7e19fc2a3cfc42877d420000000000001976a914855debcbd8b7c126120d9b5252b15cb846872c2888acaf420000000000001976a914d0a0821084ab16f3e1e6b7e6aca355931404873188acdb420000000000001976a914eb0f93264b20f1ebd7e9f3da15c2921e1ea1cada88ac05430000000000001976a914e0638658dc7f6e231b987361c792249d245bb3aa88ac214300000000000016001418aa061bca749065bae6a984cb76f17518ac7c704043000000000000160014983a9871a4e94fb6a05f51afb9ce00a19034e7f2424300000000000016001452100d53ccb3baca913a6112f6cd641402d772cf614300000000000017a914da0bf7c778a6f4e2006abcc65d1b219d0aa7584b8795430000000000001976a91472a64fa653695b7983edd9925c8f9233aed1619288acb7430000000000001976a914475a9f35f53070752403653a1f8d9f2e20e315ab88acc24300000000000017a914360b9d3d4418f44dc0352959380f774e6e21461087de430000000000001976a914958a89d3e99a9afff91fbe1854ebfaacaf437f2988ac02440000000000001976a914b80b2246ddb5fd524234b941b695ab148b0a3c1c88ac07440000000000001976a914be5c3b05ae52db9bb14e78d11b148a466f02e2f888ac124400000000000017a914bd918a9ffb168a771ed5edd8341987dc3da09c6d8728440000000000001976a914c20c3465353cf2bedab5b3af582c8ef937f606e288ac3e440000000000001976a9145212516b5a534310805154107358d9b579d8526188ac654400000000000017a91490e72eb3e6a543b63178542510bb0bd7fd8a5d8e8776440000000000001600149eebfd7a07bc5c1da092d2d7af611f6a825e24f587440000000000001976a9148e8b72b6917589b820b9c78fe457d8c009d2704988ac9c440000000000001976a91463b0af7e2ffe9a0c1f7685b702bcc61e0befd98488ac9d4400000000000017a91422f169cfff6a0727caacd7fc84eaf98d8b6e782287c1440000000000001600146bb4e6315f633415082be2ca469c54691a7de3a0e44400000000000017a914622e938a839561c35928305ec416880d18da1f4a87f94400000000000016001445b5ff6af4e613255648286da4386043776ea18c2445000000000000160014e130807b2871a9e20f0ebe5cfd1586783274c10840450000000000001976a9146916bf1f4cd9396285e29d38dcf0a9cf68e76df088ac6a4500000000000017a9145eea54e7affb2833ed3d3f3046d9652b4995c7308775450000000000001976a91406b02b783cb390f72056f51ec8ab7e9776f72e0588ac874500000000000017a91477b55aa5f340e1a1bfe4495e88eb77754a0f571487c04500000000000017a9141bb822a30cae0148544728cf811c467198a4138087d345000000000000160014755ba7bf91acd29f546e6e0266592d542e47515bd74500000000000016001418aa061bca749065bae6a984cb76f17518ac7c70da450000000000001600144d88d157f0491e01dd316839f8486270e2009508f94500000000000017a9144af2a5b1e7d5b32ba10721bb07fbab33c32c8f6f87124600000000000017a9142dc425db8a163568f1375b35c105b4fe49c9f4338716460000000000001976a914fdb1be9f5ded0ab726aaa2c2760ddd66501f968a88ac3d460000000000001976a914c19ae70f501c9118229f990963e91f67b7b1d9d888ac5a460000000000001976a914d8709bfa6f242fa265bdfc75cefe916bcf00132688ac7d460000000000001976a914f3d75001b4f3bc5335677c4f690340474cd049ef88ace3460000000000001976a914ed670fecc4ff6c940aff5ef0a787386321f7b4bd88acf0460000000000001976a91454334730df0be6f91943ae6747c3fa701410caf688acf4460000000000001976a914001487d31c8423fc61b1830835e605f8ac3af62588acfb4600000000000017a9147831848a8f877c4467ea4b0f22177efae2a2322c87014700000000000017a914684f3622f35ac44a45bf38a806b70cf8623985cb87024700000000000016001445a44f5e0900df7f2e205449908b9ef51dcf3adf23470000000000001976a91476200b3603109ec9717b53cfee7bc86c07c1d7d188ac334700000000000017a914b713bb4a2380d237476fea88805636c8635e78f787b9470000000000001976a914081eb4fea44af169887a73fcd9ed4ed21e8f886888accb470000000000001976a9142e81717b0f9bcbb16ddba83abe6a67d76a0b75e788accb470000000000001976a9143e60d581e58d8a5474897ab1e4d0b6fb2a62074288accf4700000000000017a914002b0cd4925e45f2f6a3630a9a6ba64f15c5fd4a87d94700000000000017a914a46b82101083b6260a9842ea06169c56368bd7b787eb4700000000000017a914457ba50ac7cb221f51811d91be6377261bbe7c1287ed470000000000001976a914c30e8c83bf2502642f4e557a02e9ede2b809757288ac024800000000000017a914336f8ea716213f63a597029632191e88eb8ac60587254800000000000017a9149246aa5b2bdd7c37678a45ce74b504dda0f9815c872b480000000000001976a914eb1921e6ed17d4661b2eec7bb8f24c7ff21e9fd988ac5a4800000000000017a9147bfba6505cb1c5f730bfa81914dbb5397c7ea12b8767480000000000001976a91468cf533adaace4aaaa5362604daa4dbc9528379d88ac69480000000000001976a9141a68a5fecc15144f3572c3a00615eec6d3b2c79688ac6f480000000000001976a9144774dd18e125febc01b90c6bc926a3a46cebb8fc88ac7e4800000000000017a9148afcc4d84d1c7d67c5ab209445c7343b7471b564878b480000000000001976a9143f6ed8a80c70e70ffb1b8e5603b23c9e4444b5a188ac92480000000000001976a9147cfbefed3e173652699f9685bafa8d77e43085c888acc1480000000000001976a914449494649aa14d362fc91b159739890b6a1dbb9188acda4800000000000017a91402e59d406377e2c83d975d604b3f3871b98e970a87f0480000000000001976a9146761b197015810304892f8de7120969043a53ab888acfc480000000000001976a914a82dff405441011bea0f4c972032ffd8eae1d16188acff480000000000001976a9142b08282aec3fcdadcf558c321122f87b708e47d288ac0b490000000000001976a914bc32bf5ec4f5315686b670f6aa7df48b8005853588ac14490000000000001976a914d72c77eb404bc8cc5312e61903db093ad45abca388ac32490000000000001976a9148df29d0c9e304e8879058fc43389b1862862ff4288ac65490000000000001976a914683c36685893ab4e69df45a40fdc1be6a06e663988ac6a4900000000000017a91418095dc2a23ae31dabf2958e69566c83712f9421876e490000000000001976a914d698b04a4c9e606b35e31b66abc2d1e1f7ad348a88ac7c490000000000001976a91486846cccfa68776b05855f62f53b48485a3cbd4788ac7c490000000000001976a914b0dd46cde6a2e04033e09e2526fd8557fabcaa5888acb1490000000000001976a91432b1ed68c836d96a385b320b3186df5763cd8ecc88acb44900000000000017a91426361f5e3e009664ea79fc924e97c778cb2a49cb87d7490000000000001976a914de49f35edab32fbb8e25b5b2cb85ac8ddb45490388ac154a0000000000001600145aa2f474ee211ef65608602073be0ce02e68ad09174a000000000000160014297c144bd65322e13590be02e41efce5d185c5b5374a0000000000001976a914472e83121646886c594e3ad6d864d81d9bee30f388ac3b4a00000000000017a91468a14fc7e4172822086fd194b3af6affaba9946d87a34a0000000000001976a91401c2e7c283e0893a51a67d56680cfd1a5284ca2288acb54a0000000000001976a91418cc4a827c8f34b60ceb258e0f09c1120785639088acbc4a0000000000001976a91450754787820ea1c030943a5e364fd5d4f78e1acb88accb4a0000000000001976a914996cd1bea57842797f1e23ef69ee9a63fcc72c3488ac0f4b00000000000016001499d5ae75179034557de9c832753517bdd1cd170b334b00000000000017a914bf2fdc11bac40d8bd2c2182ab399f5e08bd3edc9879b4b000000000000160014927ee1489b3a31f6909ba965326afc966430c16ce84b0000000000001976a9144f87be1e078cd12b01a5d07a368522958ffed8c888acf04b0000000000001976a914b57620d6c554dc02e7f105bda90b2d09bb17ade588ac004c0000000000001976a9149e08da73577624b5b2df298d18dd2d55d23e038388ac244c0000000000001976a91481f6eda72c8b5495eadf093f21e2ae233a8f09ee88ac2f4c0000000000001976a914acaeff5fae378baaa3f661c46eb0121a0c2f6c9888ac794c0000000000001976a914a021bd69997f2d002c3bd88a17254cd27fdcf7cf88aca84c0000000000001976a9140109554282fbfe0f1650fd70bac1c5e470bc823a88aca84c0000000000001976a914435012f46d1638ea89e44fdb1e2e2b19241ae44c88acdb4c0000000000001976a914784d560194d3f855eade0b221ed6dbb1c1faec7488acf34c00000000000016001491eeca820af45acd97ee96da3cc58906fdea455ffd4c000000000000160014035e11339cb1c20fa1c662812f4ac8bf66b698a3394d0000000000001976a914eef316be2c1cd528dfbd053290322a7f8f7021e088ac624d00000000000017a914c9f9b47b0722e87c5ac8f27050953437b24186a287794d00000000000017a914f73af1527e0ada0d02f28403ee431bbeba35c41787834d0000000000001976a9148bd86861f7898051ff68edc03dd2ee3c80ac9c8488acab4d0000000000001976a914253eb1af8643b61d440f89f07eadc9191184f80988acc54d0000000000001976a914aec2ab787221bf634deb30398b4f69dcd6bd258d88acd74d00000000000017a91450af52415ca45b0afa22b5eda00de4418a47f5f187da4d0000000000001976a9140a737b0235567a7ccfb66898fcc50066cc9b34c788ac194e00000000000017a9148e991a47aa4353164949e5c7028681c79ab9801e87264e0000000000001976a9141e2229f4e70b23b5ea5aa628290dbf9941cc881b88ac284e00000000000017a9149f3d3295b50d1722c84bd0197c0b506e058c7edf872d4e00000000000017a914b68de39d9e5e67cc063e82fb9a5b83b076c84bf987494e0000000000001976a91422522ae9b3e3140c9be86257a74d101c95a5e59e88ac4c4e000000000000160014ff11e76efc547b4db23cd8de6394918c0e6bc119634e0000000000001976a914f5fa9e54bed9d5f030e3559c548fb6dfbb2d93e488ac654e00000000000017a914b52e82e8f668cc109784fb1029ffffdad1b91e4987784e00000000000017a91401760ef3c8fd1013559fdf4356c98ac6aeb0b510877d4e00000000000017a9140a49cbe3c793137bfa5564ab49a5f3c46997870787824e00000000000017a914a1d104e1d6beedd1cda6c09c430633a4fa77cb1e87994e0000000000001976a914ed5ff75ac8c1e4c94ff878a25bbaf77e63000c1288ac9a4e0000000000001976a91461c89d8aa6a8ea41f27795b7ae98266cc6c78eca88aca94e0000000000001976a914b7af56725de92d33f79f42c2c5b2faa8297aee1588acfc4e0000000000001976a91458dd90941df5b2bc1c1083348784ed09cf1a5ca788ac3a4f0000000000001976a914ced1152fb6e3ae79c2f6002b68813a9292e9d94188ac3d4f00000000000017a914d3ec89a8ef94b6310d6701992cffa8b663a8956f87404f0000000000001976a9142bfdcd181b706aa767327df33749898c8bbd52a888ac464f0000000000001976a9149bcdc3fc1e6fed48b19a385f103307b2b6a5926488ac604f0000000000001976a9147a6976bf3bce30977d6d5fd320108b04a89256da88ac634f00000000000017a9149dfdc9cfae649494b6eb8178f534766d31cca88987964f00000000000017a9144e0a24de61e7f5d642ba4cb406badd6ef4406d7087b34f0000000000001976a914ee74dc92af31c372aa2bfd31d9d910c1ecc2212b88acc04f0000000000001976a9144efacdfb05a860ba8bdc14cc0e9747acdfd9708e88acec4f0000000000001976a914d0e13f56c61370e3838aef8fd3e115bdf933d15288ac0c500000000000001976a9144ae784bd215af591b9d231a414f69184a3f28d3a88ac105000000000000017a9147a40f3d9034288cab3606f8d2db0214ee1e199b6872a5000000000000017a9145269f5db69330145389df4bff0a5d8621d4eecfb87305000000000000016001414632caf3711d4cf2b8e33e52e06b7e4153ad4d142500000000000001976a914047ed7f121c101a7beba870ef6ecd9c221617c7188ac96500000000000001976a914a41c4e39f9b800b7a2bcdd96061af7af56bd06df88acf6500000000000001976a9142e66cc842b0ff434e026f803331ce5286a78814488ac16510000000000001976a91462b963f8be88db652cb405148e3af4299e35d01d88ac3d510000000000001600142e28323435b741a7b613d347d7f4aa5e36e68c1644510000000000001976a91441c1eb0674e624e107f198395ee9717b0c0281c388ac8c510000000000001976a9146af9ca24938bfc13d109dc687a88862d0d9e620488aca4510000000000001976a914f332bb09ace36b4d98ce1acf5373abe16a933cb988aca65100000000000016001483bf902878145796fd0623dae9ebb40e7539cd6f07520000000000001976a9147ed9b20f910443bce0dceb19015d22df95802c7a88ac1c5200000000000017a914780951dadf309ac53521d6b9b213b7145764f59c8726520000000000001976a914766e3082e881527e01bf93fca8f5e89ab3ff8fd988ac4e520000000000001976a9146c54e5924a12cbe4fc1f8f06d916706888d4a4b288ac59520000000000001976a914baee7f830c53d4143059bc6fecc769e35190ba2888ac78520000000000001976a91433b4519644d203591fabe1bddb03a6762f874b8b88ac7a5200000000000017a91414b7dd996cac7659038bf24c50abf5d24f5b11548789520000000000001976a91449398ce57d1e4382e09605954e37b6eba77af72488aca2520000000000001976a91471312113e2b585b4b17280c8da2538f81d0ddb2a88acb652000000000000160014da9cf16f6ddded60897de0fd3d895d22b87ae100c35200000000000017a914cdeeef29d2f67fa736f62762895cc0de626d0a3a87d45200000000000017a914fcbbca6ccb4cca3e94ae1875abd53c5f919e94dc87de520000000000001976a914e63c568332a6884ff1d8a4a1e649809628ad907688ace8520000000000001976a91407aec6492cac4654053b8e4fe2db95a2277540cc88acf35200000000000016001433148fa05cf624eeb2572af13273bd06127eb7ff22530000000000001976a91464b4341a05dc418613e787766450d227cd7fd4f888ac40530000000000001976a914db9efc428c5c576d3d2751bc972cf9815dbf321388ac5e5300000000000017a9144ed6911a31b86c89c6ae142d2810dc5966b845d487d2530000000000001976a914b0a2400251dc9ebbf4b5e92b0a9dbe79c232645688acfb530000000000001976a91484a30d870db78f39bda13d377759ffc69341603b88ac095400000000000017a914b1176f3a5a8a2a830cb876cbba1a90bb9f31e7168715540000000000001976a9147320de6fc5990866aa46b9c0e1eb9b01621523ae88ac6f5400000000000017a9146e4ad46e255955abacfde3aa20e0c85fc08963198798540000000000001976a9146d0710619297b326b8607bdfd482582032b144a288ac9f54000000000000160014617bf38ae56dd98ef9ca4a8f07862e3f296a24e1aa540000000000001976a914c6474536cd2b13ea64d9558ceb7566345835d8a288acb6540000000000001976a9147985a202c9135f2b23f4cd60c4770db3219aee3588acc25400000000000017a91443276d0b69d135f59ed1dc1d6f7feedf8936a33487ef540000000000001976a914fe8d5bcd9e996210109bd5698ab7e4984d1947a888ac375500000000000017a914c86c07f49bf803b5808d26194bd2b644f136368f8762550000000000001976a914eaabe1288f9a00df425465f87cc8edb845662b7288ac75550000000000001600140c3433c5a2e59bca86cdfed6b69b8add95f9f30c0b560000000000001976a9140dc8d54296a613ef83926075e9a3dbffe792596888ac0e56000000000000160014aad3adbd1bd19eb2a4366b906627bf4083519a3c10560000000000001976a9147b19d0f1318332466d39e714c7e78f956b1401d288ac6b560000000000001976a914ab743b88566aacbcbb28d1968355f9b40bc76b9588ac90560000000000001976a9145f99a547736ee0742dcbeb8671e2026f5a88ea3388aca4560000000000001976a914a67f176a1d45790d336d9f8239cc7a28e0aa08f888aca9560000000000001976a914d3dead57f182e19fdf26ed9cb104278ad8ca9bea88acd75600000000000017a9144420a73c42a11f553db1bf4b9777afae3a444eb387e2560000000000001976a9142e529835c6d9be750771eb5d76c2365c70b79e5788ace75600000000000017a914672612aacdd6393f39807eea5f203acded00e1f587f156000000000000160014ed421e3a8b5fe0f90191143379fb2a6914c7d8c012570000000000001976a9141a12ad5d2cd9e4e0d89d54554d7862ae95989e8e88ac13570000000000001976a91432a2c0a23769269813f1233a074450d64090a9b188ac19570000000000001976a9147c91794469d61f81acfe43d4a4bb7b25772e2fe888ac2357000000000000160014f1d88a1055de3423e416df2f57ce6947f34d441729570000000000001976a914d10a62a622b13f08a190b197c29cc4c8f13370de88ac3d5700000000000017a91423da5835bf2767130a32220e9759881b6d2a5d13875b570000000000001976a9147cf9137a8e5dc4388e91e78045b720e5dd42b0f788ac63570000000000001976a914d0837af5d140815c15a83554f85315d366fbc52988ac715700000000000017a914322b6ae831614e9619db5e0f066e4fd29b712ef287ab570000000000001976a91465b3d4540bb1264128852a47c23d22e3ac12c4b588acb2570000000000001600149b068d62276d383c202844b896bad8bf995c318fb8570000000000001976a91424d91edc080fceed79cd5c5aaa5013228906aa2288acc757000000000000160014e89bf17fd266f259f0a2eac06bb2878b3595ec9ace5700000000000017a91400b6be70991d6a1cf148c60b06ec6b1a0bffccf587ef570000000000001976a914551a11b07add15dd2d17b6fa45bc2c51a442203b88ac8f580000000000001976a91410b5bd6f355d6aeb7b609ffd754899f0c792ee3088acc65800000000000017a914d5e46d94ed669feb8625b5014a1ac25cf9080f7287e8580000000000001976a914f19e046931008ec5a041ebfc3ffab043ede8dc6788ac1d590000000000001976a914755940dabf32104ba7ff3aa11006a02716a8a96e88ac3e590000000000001976a91496dd6081eead9fec140be8bb9199202d2294d17088ac405900000000000016001413d4d4fa5ea18a6159aeaa9c4b9a985a3fb61dad51590000000000001600144f5a439d8c1263272c93acd86bd97a767ad164fb645900000000000017a9140c4a13f5c0d2da1797ea9a91592022ca39b050e687b6590000000000001976a914c5acb4e9b98c30606dc67571c1b79e7e0e7349b288acb75900000000000017a914dd095bbc59bbf4d7cb942cf8c0466a7d22469eb187fa590000000000001976a914d818699225620fd8cd641da1cf278b22ffc0784a88ac0c5a0000000000001976a91441bf1348f594c85243f1afa18a603e5f8641bf5088ac375a0000000000001976a91488a60b05715a6487cc67a954bd5e2abe1860217d88ac4a5a0000000000001600140c02f96be13093547f3ed534f4afd02051a926b9695a0000000000001976a914e608217de3990ae2929d74e41522cfa27f1e16ce88ac715a0000000000001976a91461559230751c37785c1b884b32fc0ddf6759bce988ac7c5a0000000000001976a914b46960034a3dbd089aa676b792dcefe9bd9289b988ac915a00000000000017a914998a4a230c3a9e56f5168179599611a10f5802fa879d5a0000000000001976a91451cba11d567744b9b2616f4fb8cb03dfb43dd26788aca25a0000000000001976a914ea6aa48e1baf5a8116d5233efaa95dc755b4724b88acf15a00000000000017a914167c505c7e06ec0e86eaf63a565daf8483d590df872e5b00000000000017a91485f248403a9f4b2b06c89902b6b2729aca0d813087345b00000000000017a9145e7fc3a2c525440741307a013c566d013631d53b87555b0000000000001976a914b2f8af026f47a1fc5592cd56fad40f6d4c9054ff88ac605b00000000000017a914ab1de3f59d465ae010b10ee92e61a11f78b274e9876b5b0000000000001976a914047ed7f121c101a7beba870ef6ecd9c221617c7188aca15b0000000000001976a9140345d5ea342615447486cf5f4b57e4c1aa73928488acc35b0000000000001976a9147f05a63c0b3aa3b6a1647a82e3ca8d1e6d76aa4e88ac345c0000000000001976a914a5f9faae5a746eb921277dba23765c93e31ebcba88ac3c5c0000000000001600142ec4a3f85ca90bc42f38e1cd639bcb943854dde64c5c0000000000001976a91444bfe8863074d3a95ea3dd727a17f6df372d61c488ac705c0000000000001976a914ae60e975ceedf7732fe23ad636503f9aa2564b0a88acc55c0000000000001976a914701d4f71dbeef7f6bc421fbb04fb03307d5d17d588acc65c00000000000017a91410182260c56b4419d61c76df6c6bc17284d917ca87d85c0000000000001976a91404b69431a5ee8473844e81ef492ea6443e476f3c88acf55c0000000000001976a914f120d847f1ed18129f1ec9bb20cc510813af541a88ac5b5d000000000000160014f7ee45f42ad3196eb743f25691fd15e4306a09605c5e00000000000017a914a9d0ac1777fedcc17de7805dd685781283ed2ff087615e0000000000001976a914104c06f6d39e28035c5fa9729c3a93885fba4a0888ac635e0000000000001600144ef542f8d5c1967932c67e8529a6b4c87aa6bc22685e0000000000001976a91485e4691dd45bd9ac85be0c156a600426eb683c8b88ac6c5e00000000000017a9142ddcd2640d8e1c1f3eae667cb9d814600eec9d24877f5e0000000000001976a91438a33bb0be8de95f9d70c8cfd79c704a3443e46288ace15e0000000000001976a914b308fa7ec14425c953809f7764e1fceaaeb42e7288ac185f0000000000001976a914cf280299568191313e64821186de4514e430074d88ac1e5f0000000000001976a914051658769e9687c4f823b6a127b1ad128c43670988ac255f000000000000160014481efc2978532f855e2a81484482340c3e139f503b5f0000000000001976a914b01873999bb7b09c18ce182166fa5179dc184c8b88ac435f00000000000016001438f6f02c80e73f3de8ee8b5a9c16b0b6a151c34e445f0000000000001976a91455a0d2af63c1f4bea47e7f9cf6d5736177e64d5388ac4d5f0000000000001976a914001eea1267afe9bcf00c294ee9793a824b8bd36688ac835f00000000000017a91490944353d0ace2e853740dddd8629d630a7530a787a95f00000000000017a914b25c7d98de8c4175447681fdcde8b7bf030e34cf87aa5f00000000000017a91487808264366d25aedddc84f077e0e040a635c4c387ad5f00000000000016001431e8ede27a97cd0b936774300be4fdc82619afffc25f0000000000001976a9144a75ace445f4971fb4046ace48add8430dcde30388acd25f0000000000001600140e574fa425ddbd45b8f5fb41e4f9f02113a7abf1d55f00000000000016001407ee83201b50ab12879a2d4be6d1955080e618282c600000000000001976a91476a3a16865cbefe0324611f4092ff7da9352f6eb88ac576000000000000017a9145e7f028349f0a5821271347cd030373cf4c4502d8774600000000000001976a914d32c03b4c402a3f53726a10ce82daa1d524f3acc88ac7f600000000000001976a914166576f3c870704cc3b01f86026b996b5717f55488ac966000000000000017a91492327dac81c1b44e363c422c14b626f963e19f9187c2600000000000001976a91414719d098c00bd1c41ddf0da5798b15f67e8818b88acdf6000000000000017a914589c2458b1ea09830b21983e0232ceecb03e9dd28705610000000000001976a9145ebaec5cb899c02b81728c89db0a0c3ef08befd488ac376100000000000017a914ddbca878ed25b8ccfcca4150d3a14fb7d9b843ba873d6100000000000017a914de2446925a4b745f9cdb90fa499934f708095bf1878f610000000000001976a914e40957eb73de9eaf88612f6c63d9c0ac4b0ee1bf88ace46100000000000016001476552e191e14120f56f9a13a222cba1ff8c5dee646620000000000001976a91414d93c042229ad418b489f138e9e06e644f465cc88ac52620000000000001976a914e0ad66f04fb15e5c362ebb82b87fa9e5ac8a428588ac95620000000000001976a9143d4eef65a30ddbeca0d8238387294edc78a09bcb88ace56300000000000017a9145762c7be5f5e300a9bdca759d6225231d8b69dd387166400000000000017a914f9f8f02dc369bd5e2e3f3bbd25fde67f0ef541748722640000000000001976a9148d692b98dd5aa14cb9e3e7f457dc61447925e7fc88acc66400000000000017a914aa11d0e222cd42e047abc9e9d276f54e43031b5187c7640000000000001600145ecf723b29e01aab91d1ce977e9f1886a98ae379d064000000000000160014d7cc61aa52a3211f9ed7189cef3f56404f022060dc640000000000001976a914caed8c8675140cff8a2fad15ef19a37e5b1d8a0c88acf16400000000000017a91486e622d8238c73a979b07c9ede2f6d93c5d22b0e874a650000000000001976a9144baeb18998016a2f298f2bece0d9b28874b17a6588ac63650000000000001976a914bffdeb01a1ef20ed1f45bacb1cb39f83866f023288ac74650000000000001976a914d2fb38a1774a8f4f2fcc4cae434e32e0a06b053588accb65000000000000160014a5114b51efa4d1ce55741c582f3b856d54458da9d5650000000000001976a914a63ff76ad89496770d98b9e28d0a8c82d5eb283b88acf6650000000000001976a914c66ea8c54d1a21a4920a7fab4392b06ee44e8e4588ac65660000000000001976a914f2e6bb3a08530cacc3c42611654763ca81aaf4b688ac7a6600000000000017a91480e13a0361f2800567b38627ebcb5e780a82b90487ba660000000000001976a914a5028aa2b4278e4cf1c7f487b387ee79c68114ed88accc6600000000000017a9141844ded9db029c1a7333f2f7f2119e0062403dd287326700000000000017a914fce3ad6a362426064ae2be24bf1f893023c9c3a5873a670000000000001976a91429924694298bbf4c53b77626673e3049c2be134788ac5f6700000000000017a91491ad629f4d8546bc8368ede3f391e392cf740621879c670000000000001976a914fa965fcaaf24fd7ef951525ba71702a610ef309a88acc86700000000000017a91434b68357a83d65cc1c74c108b2e81fb4f1517fcc87e0670000000000001976a914e0e48d413bdeb32b72d6ed7c6513340f0310733788ac076800000000000017a9147776d6eef5fe33ee34bd70d6448a8485724784048738680000000000001976a91425e25529bdeacb17b531e9afc9f7b4d85947249688ac446800000000000017a914489bc96330a8166ee8f04fa1f83948286880e664874d6800000000000017a9143be3288851ff4b278f75cb6e718fa3e3e83038bf87846800000000000017a914e6b886a190e387a2eba2ead60dd2c856594f7d12870c6900000000000017a914b7a69ac97c9f2837d78b0ea51c679c357877d1c9876a6900000000000017a9141aef6fa880d0c776cc53b6f43c0848f5afe0dd2d8778690000000000001976a9140cfadac61a6e837c09ae7442586badf3c8bd4e1e88acbd690000000000001976a914f12072fc0e90272716a947fdf06a8668168f48e588acc4690000000000001976a91487ade0ee099e12bcf125b4ae88351518adcdb67c88ac006a0000000000001976a914cf6029d35a87b6dee6c868059fc3ae2cb25fe14a88ac0f6a0000000000001976a9144175c6564640b48f79cf0183e508833c9f578e6088ac496a0000000000001976a9141c7ff58a080bf6b4ac19835bdebdf106bd9dc80c88ac506a00000000000017a914f5b7b6ab494d788d158ea69f85e096a88f4ab68d87686b0000000000001600145e8ae6ce95ba3afec6b954e0a4814f0bbafdadb0a36b00000000000017a914d0e8b8f2d87f58c2bd19bc678cc3c897c0d6462c87ac6b0000000000001976a914f3f594aef6aac9349fb84d32e5f11764841bf93088acc76b00000000000016001475124368faa6be133dd0613c7ec97905cde300c3c86b00000000000017a914e9f6dfef4951b9112a8cc87580f578bfb2fd384787d06b000000000000160014f05cc2e214be9807cfa103a1ce86607a82052fa30f6c0000000000001976a914b63b7008c83968def17dc7cd48e84076ff8c174c88ac8a6c00000000000017a914f9b134ee8b76b94c6d43f9387c00a15aed4f4d9587b26c0000000000001976a914504028f7ef08c182c4a0386c04764f38b661804488acd26c000000000000160014a3c7b482bdacd86b4d878b2bdfa2f3da348feea5e06c0000000000001976a9146e1df0b29e463d74265c8f1e28103a4c67d6050d88ac1a6d0000000000001976a91428dd908696ab2946281eadf7b33c5fbb321f91e188ac316d0000000000001976a91462a9e75496aa8c5d259e79522bf7102b22ce6deb88ac406d0000000000001976a9143cd909b98ffb8e22a67e409a961b49c921f1f31f88ac836d0000000000001976a91471a96c6cf897e528ad50c1843fb64866af53fde688ac906d00000000000017a914b79f2b722f19f521a25e581751b8f155d5a0e35887bc6d0000000000001976a914ed97b09edfa31b34d9c6aed954daa24bfcbd34b488ac096e0000000000001600143f9eb05273bef10d9a581c5b59190b866fa7f202d66e0000000000001976a91425d18979d34e80dca0864326ffea68a1967760a088ac086f0000000000001600149cb18216aeaf3a12ab6ced7f22f6a41d06097fd7256f00000000000017a914814250abe45175e0a84cef36201995dff9418fa487286f0000000000001976a9145ba22ec957268267530c752716965518580fe0bf88ac556f0000000000001976a914545bcdc816b3db86f2a660fed7bd5e345ed3788588ac866f0000000000001976a914fc0ffa042c35a095c618d378e65c35ad057e8ef088ac936f00000000000017a914fc4e2ebe244c524ab4f588b9ab830679c41f7d7987457000000000000017a9141d5fabc5ddabc6d299cd1f343b85227340534f4a874d7000000000000017a9142d1b28f201e1a31f2674fc421fcba3a54c76b95a87cf700000000000001976a9149524c189fe55812fd6f6131db4ff96c3f668cf0c88acd5700000000000001600149be0621d136053e1b71e15a7ed332f56dce000da8f710000000000001976a914ef94f39f43fbc6241a9ff31bb36e8085eebf2efc88ac90710000000000001976a914c018c580b9faaf0ee6fcf5ecd2b3a9530e83f24788ace9710000000000001976a91437a210d9613755a0946d44407a1dd172ca526f3188ac7d72000000000000160014f8d59c998e39c1841766880597f6880b73325cb07f720000000000001976a914c9434dc06bfb7738fdd98ecdde306c6c19f1596c88ac3d7300000000000017a914b6c3d5efbb8951d50b4fe982f67be4ea73f4ae23875f7300000000000017a9141441df6dacfeddda175c545575148fc72577af41878d7300000000000017a91449b8f1dbaea9065f30c17adc8a3dffb7fb882d0287a17300000000000017a9145247183ffd068d0b80d5b5b0e07a70f65ff2277287cb730000000000001976a914b3379da8d4072fc96635f6724903c3350c28571288ac26740000000000001976a9147d56657f89e2957caadf946657a37b8588eb8b9088ac51740000000000001976a91469ec02ab6531c0b82af4ece574e9b68e3fa7b9de88ac55740000000000001600148794413107080cb92c509300986b1d4a232e114960740000000000001976a91413b7093632a38ba4b6a3d995ef6cdc82296d3d9c88ac777400000000000017a914d18b8e6f8d96327df3fa0a23351b135c5711f09b879e7400000000000017a9143be5c3e5d34b37590384795bb0fd0ac885e8c8a087ce7400000000000017a91429530cb585faa63e1ced20f8672f2f58022ff42a870b750000000000001976a9148b0515accd7eb3b8087c55ae4e56898cc2d9040588ac17750000000000001976a914979b5643b1b77d6f1122411fcd0d62a66922cd2988ac62750000000000001976a914139a70e52006bfe969ac0d6780820645b1bc02cb88acaa750000000000001976a914fd960c76817245bb882ca901bebc5636473ac4b388acfd7500000000000016001438c9f996a15cae4f89f51be984d8b640fd84d55434760000000000001976a914a9e18e00291c8fda8e81fc988bdcdfe46304c6e988ac46760000000000001976a9149fce549a7d890f91428c95f128d39befa017d8ba88ac63760000000000001976a914ddf333d5dc07d226209c21cacd43d83ab01cec1c88aca67600000000000017a9144f2be55bc3680a600aa38bbd5a9e1848443890eb87e27600000000000017a91427e1c438a15755e8c9ee84ed51b3503a4397b6b5871f7700000000000017a9146f55be8a7796e7a1d998043010b2a7ef416c824c874c770000000000001976a9145515f81ff77fa195d7deb57d078d19fba72894a688ac7a770000000000001976a91480e064bc732ce188297a7821bd7ae3ce65612d3f88ac8c770000000000001976a9148e04aaf1f52be1201acb88021536a0d9a8c595a488ac927700000000000017a9143ae8e90ac4e499b93a05e989f0d333c407cff91687e9770000000000001600141f51a250fd3e7cbeb27427cd079b4d66c79fbb9419780000000000001600145b8a5b1860278b0f1cdb5f4719995ddca474aa0e55780000000000001976a914d408afe0cd3708fe65111737e7612e009077040c88ac6a780000000000001976a914a9d4fb048a2db70465624c24a273fa1cdee1f2c388ac7f780000000000001976a914f400590f47d98c9bdeeb6764985a02414e1e7a5f88ac7f7800000000000017a914d67ee3602ea9b539ca7db46add7467464640771f8795780000000000001976a91422f8ff98ed0123065528fb28f332f4f3e9888bf788acba7800000000000017a914e7a54e888c881d153d886c01e9af03cb1d06ae4d8724790000000000001976a9148f603d9cdc23b4a56be1f9ffc4c6169f3854cde988ac86790000000000001976a914356be08014ffc7bf2ce9b880a27dcf5ef948edab88ac91790000000000001976a914770259dbae711940009fb1c292c9e00d59f324f988acd57900000000000017a914e7ecbf024d65a9746012013b8ae5c7fd7a384100873e7a00000000000017a91492299a32c179f884b85e35e1f4aea27084b831b487417a00000000000017a914502ba6b8318358c7458c417e56987d95ef98ca6e87457a0000000000001976a914f681733874fe1dce651ff2cfcfd505fac1bd3a7488ac517a0000000000001976a914c708f3e8b385ecc8e4e61266287c2592d76cbdb688ac5b7a000000000000160014fad6c0189af135c7b5b0bdb7e3b29a762b54a2f06b7a00000000000017a91425e8996ed63f518476d53453477745cfd0c9853087bb7a0000000000001976a9143d1b8bcc9e4cb6a9e0c959074748f48ae4c05c8f88ace77a0000000000001976a9144e0638ed113bdc3fdc62a485897d5367bef8c57488acea7a0000000000001976a914dfd5afc7824bbd23036640abd32df9819b5d906b88acfc7a0000000000001976a9142b2da7ca31c07e3927d234f1a3444a876b4321d288ac177b00000000000017a9144541aa33c9e1cdf64518b67c1cedafa5732d0c7687307b0000000000001976a914ad604fe90ae05f5b1f1e961c6338afb6f4329cfb88ac5f7b0000000000001976a91485b5fc37bf281ff53f5ebcce8ebf18f684ba320288ac647c00000000000017a9140c3d6f2283ca2c2686f10b3c1316241cfacc12af87997c000000000000160014b01e7d56f56c331737531a6f8ab3c1ab9c247a06dd7c00000000000017a914a401544345a8e05a4b34f794f5148b9856d1cc63870c7d00000000000017a914ec523090da09d63b23515012ee100f9fb1a3059987857d0000000000001976a9141d044fe1e5ef9961788d84ae4f0a2707139e516288ac9a7d00000000000017a91482a01cd60faa18f8b6fd09e5f9104748958f34d787cb7d0000000000001976a91432dd95dd00b93777c0c3166902b3e34177899ff788acf37d0000000000001976a914ffcf7d8ad00d077eeaa786da1ba1b504588c643088acaf7e0000000000001976a914a3cef1506f769fc1bf42fe1b17a239719a2bd2d288acf97e0000000000001976a914ad3621168b5815d041deee590cbfabdba4c2460e88ac017f0000000000001976a914b8cf8ec255195b4b0eecc9994564b6414d1c88b188ac857f000000000000160014adc1d8685182eba8377099d5fc32fbad52511686967f0000000000001976a914554d305937328fa6439021eda8db1a3ad922707088acb67f00000000000017a914493ef01e509752412254e0ba7eaa25b2e4e37f9a87de7f00000000000017a9143f12e2ba46100950def95eed9439630b34e80a5d87e87f0000000000001976a9142b1882a2575c3616c36c940728e08ecefa7f588688acee7f0000000000001976a914af8a247a665859f83bb001aa68c31e75454582cb88acf47f0000000000001976a914ab285a478de7db5929abf5564042361c258345fa88ac2f800000000000001976a91495ee6bd1cf7b4a76f07856b5357aa300ea9048e788ac6e800000000000001976a9146e1e30b77f08c4dc2bdd4a014f19c2f4740a190588ac89800000000000001976a9141a8a5c50d109579366ef3df34108cc5a5287934388ac9c800000000000001976a9144b767b62e676ea44121e096aeb9a58f42683020688acab800000000000001976a9140abcff28e3c0eea51b01e046e50cd3f09fdd695e88acca8000000000000017a914c7a7c74cfb14cee419eb98280a808ef4abc619f987cf8000000000000017a914d053577cc5360264dc473998d09d63c29c4b98df87d08000000000000017a914dc8e2e6652fc2f0bfdb8595ba57015d6d3120ac2871a810000000000001976a914c0fd7216a9ebd0b98fd8e72f18000e7bb45a2eab88ac28810000000000001976a91486f5b96ad241cc45ae3c43115ac8cfe65c84925388ac9b810000000000001976a91418f94f3f346b4fa2c9741ae0d8080013a8915ca588ac9f810000000000001976a91494576f8b2a0b035ee493c6b467ab5d5bd9390be388accb8100000000000017a914e35b712f7910d245c55f334fc664e4b505c3c40487ef81000000000000160014f43e6b528b44078e882f2eb4e430f6e9d0a262fef9810000000000001976a9141c95ca234c404b0cf467f861aeda287a5313134c88ace18200000000000017a9143edd418beefe51ed38bddbe4f53fe2a7b61403c6875b8300000000000017a9144a6087a43306ffc8d02ebd42f3df07eebb716eae876a830000000000001976a914b87b7db9af4bd8623141889649f2154f43660f1988ac74830000000000001976a914bfa1550c02c5feb7da44245b9dfa104cabe50e9a88ac758300000000000017a9145d0cb2f4c2bd9d618d34439ba3c124aec9c74c46879c8300000000000017a9144b343852b65dfe5adeafded0f4239796ebd8916287e9830000000000001976a91429182f9e7770565955d739233375423453a1dfc188ac26840000000000001976a91423bbf3598b48d1ba76443fbf99ecfce805469e2688ac3d8400000000000017a9144ff6ea40cfdc98a8c181c3d40f2dcc2d665a93928772840000000000001976a914aa7c77afc2fdb7322bfab50f193d95e6ae79d92988acd9840000000000001976a91430a36156c5eded5f10a78dcd61ccd8167f1a007788ac13850000000000001976a914d9b74c3fd6dfe6611ceb1adc38d083f0c81e3b0188ac3d850000000000001976a9146fcee968d0ba9b67916d82287a1aabaf4088601188ac49850000000000001976a914a0516b25b0c07d7a31c069e76fd630e51bd2678588ac5e850000000000001976a9140186dd75b0d867278258742f474b875f3590742b88ac86850000000000001976a914bd6c6244f3d4754b0f4eccb5ac510241f902cd0788ac8d850000000000001976a914b41fdff7a0adfc8167e7a8f88f4b829a0d4386d088ac2d860000000000001600142bbb2b20efca03d46f736496a84d128536a1d9896a8600000000000017a914c544063589f21583d501b4e307dc361053caca4d87ac860000000000001976a9147c23e04c2fe7d5125757933691965adc6c5cb1dd88ac33870000000000001976a914cecc015d47f86b6b4863c9f9dbd75a4b77562af888ac608700000000000016001455e33c8e9adba640aea712cf4f0aecd5064c0684b3870000000000001976a914b0c80b85da7236b580e7728f4e55ccd54d956d3388acc0870000000000001600146d774c5cbd9359ccd424b849bd27c3ac0d0449f7e08700000000000017a9140656f64d0bb3b153613dc2fd57f31b62506e77c987f88700000000000017a914c7051bc265ea6f3b3a07e3bdaa5974be2f2aa56c873f8800000000000017a914217efb23d8971d42768f735c4ff0fa7e73904b76875d8800000000000017a914ce8c9228f85d133212a2c857ac25a2cd19f309d28783880000000000001976a914f2a9ea6e52765c62a1797bca15831d297a0e10d288ac98880000000000001976a91408051db571377d5fe3362e2b60523635512f80e988acc888000000000000160014aa9bfdacede0fc6fd770b89f94288cf28692fa65d2880000000000001976a91480e3844036e2351276da4949cdcf13458eda65a088ac52890000000000001976a9149fd79e414f271bdc065a4675837feb60b28d343f88ac84890000000000001600141b07deb51687d44fcdfcb2029344245a5b5f576a9e890000000000001976a9148aede7cd460699faec5629a18654bbb2355c616588ace5890000000000001976a914208237c8176735755976a2a92d31d026abbffbed88acf28900000000000017a9146e0cc2bb07befd8fd3adf98c339871c6fbd51179874c8a00000000000017a9141e32536c1db54052afdde4e6d78081450247508f87c88a00000000000017a914ccc6fa0dbf74edc8ad6d368eb9281282905c4e6d87d78a0000000000001976a914d15061d7b8d23aa5309d1f923a522ad7cc2aa8d288ace08a0000000000001600146b24a38827b81be4a0432a1abf2495f4f11039093e8b00000000000016001452100d53ccb3baca913a6112f6cd641402d772cfd38b00000000000017a914c8242e7076f0c7d49c55c20d2da75d44d23aa9d087e08b0000000000001976a9142f917b1bcd5c0236e088f1c1750d843104ea45cf88acfe8b00000000000017a914e2cbfa089645963a9be32ddeb155572034056ac3870e8c0000000000001976a9143c645f52fab1f3865e6c70d9bbad8c79c17c3eae88ac5f8c0000000000001976a91470a45c2d40a298d6b81349448203924e674bc9af88ac688c000000000000160014990e7b3c62e1f843c94e2888437e8bbf48e543bc708c0000000000001600146ac03818d0004dd16db9f4c4b643a2b939ef09b5038d0000000000001976a914f02ac7df1d6678f1f2830ca1b10957ff9c14fa1388ac3d8d0000000000001600140177603cc352eb95a4f3cfdc7e4bb99ad04f5dff648d0000000000001976a914bdbbba1d605b6c2292fd43312977b01a8c062b4f88ac848d0000000000001600145a05f86d483f3e88dad8eec74020a0b0130ef43a128e0000000000001976a914db5b32f8e1de6f5e1f80e0bf248bc3c5c1fa251f88ac688e0000000000001976a9146c29ab128eb6afa514bd4abbf9ecfa5eef25832188acbe8e00000000000017a9149028fff12a7fd15202fb0dc930071376d8e4448787018f00000000000017a914ce27bdbfa1b6d8299d5dadcb547c7f8307a913f8876a8f0000000000001976a9147d64c6cfef12180ca3d606b02d9d9ac927f47a6b88aca18f00000000000017a9142580b1e182083f967e6be1bb1c594ad7025c11da87e28f00000000000017a9148c718e272f123a18089830fd22a5991d27352a688747900000000000001976a9141edb4025ae2dc89798ce51c32bf8ddd432d6512888ac8d900000000000001976a9148faea69bec7e1c3ba59e0c906c52827228fdfb6988acfa900000000000001976a914741b6fa42b775e0b71fc7e216d22c5a92d7f42d188acbe9100000000000017a914bd245a4162c5e0ac81171be7637448fe40cff80687e0910000000000001976a9143b454d7dc85ea6a520cb5c4cb99c29db1a1d815d88ac0c920000000000001976a9146c2f8f9f734d53034ab9f13201d262377e009d8188ac699200000000000017a91467d00861e07723b7781d72f7b84b4819ddca8b8e87ca9200000000000017a914c7756f7dd2b4c719bdf62e059fa506ab89b446c587d2920000000000001976a9144c28feb67a684a339d65d15bb99a8ff4b939f1fa88ac599300000000000016001408b08ad4549639df594b6fa98845de4f5ab5bd6f61930000000000001976a9149976d9cec2a9fc37b69a757ee1d3bdc5e6277fb088ac069400000000000017a914da2b79b67632417a1376cd2e236c5f5dd0e70683872e940000000000001600143fbbc86b268dafafe369b3f31cf2cee8b2a0c356ae940000000000001600149a6cc388c41e71aa48faff5d26cfbde3f07ae127ef9400000000000017a914de86bdfc3ce8c09c2048b76947e590a8c839b0e287b0950000000000001976a914464b0a979511db0c7b9db32e000521cffc9d961688ace0950000000000001976a914267be7a1d62a83330216115b273cb88ad16073f688ac26960000000000001976a9145ceb10d36de5ac329d3e59628caa4216b0b70a3788ac41960000000000001976a914946ac82f32fa6388f733d4aa4b100a14105c669988ac919600000000000017a9147a077cdeeb01cd6f863a7a81fe65f7104cecfe718797960000000000001976a9148b3dee488acc752da8a65d30afb972bbee3e1cbf88ac409700000000000017a914d7b835fb65394734b538a2485c9c4fca71b965e987699700000000000017a91481cc4d8cfe5dac407c0ec00b0b1a766244d9f74a878b9700000000000017a91434b4895acf198d1d0ad6756f5abcc1f950855e5f87bf970000000000001976a9144264326a36d05f991feda5dc62834f82fcb484a288ac03980000000000001976a914c54a65cc6eb50b46b152b42639db63aeebfdb4c288ac21980000000000001600141eb5a3ae26e27d7a28121d5ca15515be1bb0b0ab2e9800000000000017a914e89a9e2b62e718071f2371230576571aef2f983087379800000000000017a914e1864574d5171635550f79f90f0d577c0616454587c99800000000000017a914a9a2440e3a1aacf12e24e8bf2c429a6c7dcfa73a87329900000000000017a91436b9ef672a5816200e84dbfb157776a32030614a879d9900000000000017a914cde7c01e7c0e6feac58e1c82fa59dd1daed7276e87eb9900000000000017a914de192df58fbe150b16a5291dde4d3fbb47726a6c872f9a0000000000001976a9149e16eff05417021b7ff04012ee5611182f24748388ac7e9a0000000000001976a914ee2a40a2e992ae7a4fbd416b25ff26417a8e13b588ac849a00000000000017a9148b96a51776b3d718d3289a114de53de4ef32abb787889a00000000000017a914b281dcc6d6dec099b1f78f068bcececb4738622287e09a0000000000001976a9146bba25c4794742c8c39785cad79010e0119814c588ac3c9b0000000000001976a91474e4c9e5d7808eef4e77c08fedd2bdef36ed62d288ac639b00000000000017a91425a256efbe3503d17a8f8ae86146d2c727eb5e6c87919c0000000000001976a914f24234bee1092ae186712f2aac14f7f99699ef0c88acd29c0000000000001976a9141c860dc22f5114147c6a463678155bfe6061251f88acf29c0000000000001976a914f6f658d98154338de4751b80829c89415c77e3ec88acff9c0000000000001976a91456c8db8530565118db62e08903654a4fb518d43688ac129d00000000000017a9142c33d31c74fc0508d1286126cd29865b7aaa031e87a79d000000000000160014cf487d6712c368904cec32ad4c4b108385e71813cd9d0000000000001976a914e924a9588ef64be7be466c66daf46e4f7f07886888acd79d0000000000001976a91447d5c10a0206063c2d2b06cfe91cf6d8846e65a688ac079e0000000000001976a914a9bd9cc35e463f42f8713843a6affe9b836c06bf88ac979f00000000000017a914caebf266126fb533934ac9c79d33a7543310504387f69f0000000000001976a9146ac2b2bd640804b462119b7bac24c4a212c76b1288ac16a00000000000001976a914835fc556c765abfb191a522062bab9c8c9e0a0a688ac1ea00000000000001976a914579b79a5f22d517774628fc3024fb523418e25ac88ac25a00000000000001976a9148caedb6b16939b0d00f3c7083724716e2dbf633288ac41a00000000000001976a9147f0b5493be71e95e892f670242d011f2ce92ec1c88ac75a00000000000001976a914d903812dfa5bd7ea21f48540bd51e9749cf6297088ac3aa10000000000001600144eeb6734766403844bc678bb463dfe60dfe6fa9a74a10000000000001976a914075dba2f352aeec52aba89111c93923efa01691588acb0a100000000000017a914db84db54a4bdaf3abba4aa7e7fe6ceab26c4a0b187eaa1000000000000160014997c59dc4a116b6d2050baf9dfd04bc0c3d3631f14a20000000000001976a914bfcbdaeee6a8e422ba2bf82ddc61f86d1232b70188ac19a200000000000017a9141b395adef857c3c705ce5686090b12aed93f07ad872ba20000000000001976a91483e0c40f4b6739893adad96cb0559a173c6fbb9188ac6fa20000000000001600147b4ca3dcc573d52e4e92d37e1f114cd2c1c08c768ea200000000000016001438e4a42abe5f6f3a77b7503a79c92eecb4ee1b0742a30000000000001976a9145975788b2da23f942fd42dd0be70048413463f9f88aca8a30000000000001976a9142d4c422edfbf4d67f42591e7ef1cf2533dde223988ace4a30000000000001976a91484d508cffc566da42a4b21cecbad1288bd7a6a4e88ac13a40000000000001976a9147881f35dc9a4a6a9c0e6758f68796fa58040179688ac35a40000000000001976a914532f5c4ed8970ee1c7f7148c960aeffb3d27af5688ac56a40000000000001976a914afd066ba4c2c63b97cc05dafcb7f5a6d5f0ef1f288ac86a40000000000001976a914e1a7a1110e68db454e7ed874cd02c60cbf31d1df88acc4a40000000000001976a914d3d8d0de31cbe5274680d07c2df4a6be5c432d1788accca40000000000001976a9148e968a044478d0f600b9382c886eaeee45c6c0f888ac44a50000000000001976a914b831f6c03ea03678e8da74fdd1c1581b04bd6e7b88ac65a500000000000017a914ad8f92e62616b325a21e46ed2caccd1083511a87877ba500000000000017a91421d382ad19ab8909ce479659cdeb4d66cf0eb547879da50000000000001976a914eebaddc4db3ebddfeefd3d4235a19df79c52aa2a88ac3aa6000000000000160014303a9b63e9ea5ca52035b913ac176cbdedf6ab27b0a600000000000017a914941416216fe6bec921b88f194d4382d4e46f1d0787cfa600000000000017a914ecef07c7b46ed1c4283824a764c14159f356406d87d2a60000000000001976a9149e107c1e8d02b2e79bd5a8d37dccd796b31ab30488ac26a70000000000001976a9142691ad3413cf9cbca3103a265a5cf9aa1271eeea88ac34a7000000000000160014755baf865f89e3104c31552de1fbf3bff3a3ac2298a70000000000001976a91485a26841088cd7df1e9819af6c39c52ba2294d4988ace5a70000000000001976a914a31141ac31ec6619d8ae71dc539767fb4400d2a088acf3a70000000000001976a91470c3d6f41e1ac40e40056d517e966a5847b74dc188ac1ca80000000000001976a914e145c8628a543bf449b5538983daa4497199e2c988ac2ca80000000000001976a914b966fd1e6126ecb24dfae422ed80fd777301686c88ac43a80000000000001976a91468d7f1e2cc3e3bfaf75b90c8d3809106584d671b88ac4aa800000000000017a914c3908ce91b151cdec5604a2b930f4087add4eb218765a800000000000017a9141c1c103aa1e0cd5b23cd5bad6e0a1c0c57c2243087dba90000000000001600147d2908a3a897c7f4f91b6be1b6d040825b9808b5f8a90000000000001976a9141d457c2d5229d7521b08685b60bf4000f2145e7588ac05aa00000000000017a9145ec26a6930953bef33eea8722459d5af739d392b870aaa00000000000017a914d03418e4b60f444bde7e2aae4d34e964c79d1300874baa0000000000001976a914bcebf952db239a2d927a42c910c1b58ec4b1422688ac6dab0000000000001976a914f7701a462cb150c971ebffd5ea3386bf927efa6b88aca4ab00000000000017a9146ff135eeb71ecdb0089afc4015fd3dc5881257a487b2ab0000000000001976a91431ed73fdb4a4469b0270df67342f72a7b2c90f8b88acbbab00000000000017a91460e1bd9cf83f739cecbd32888f8df328f99d565887d7ab0000000000001600144476e4a319d1541dfcaf5d20ec155111f9d5f20d09ac000000000000160014dde2c5fbacf0c0843cf9e9ae442a08c03e98a56bb3ac00000000000017a91491c903f0f53f5490544bcea7afff52bd2b23c3b687d5ac0000000000001976a9145dfc3b7409002b402e2b1934f0f6a01135b3cc8588ace1ac0000000000001976a914977263fd2e142abf02b2fc47bf21709ceb11012188ac0fad0000000000001600149d6353fe7b727fb7aa7637775805150dba47fa5d2cad0000000000001976a914805ddd284714e435e14d81d11211c75e720dc52688ac3aad0000000000001976a91412f1315394e0d94d325810c9f59103c4777a283a88ac79ad0000000000001976a91475b6bcd1cb5530c8e0005230a7de6152837c203c88acc9ad00000000000017a9149ffe819ae1b9170fa519f2c8a8eba1c40e9599a787dcae00000000000017a914eb201603fac302faee0a5340c02cf6483f876f1487e8ae0000000000001976a9147881f35dc9a4a6a9c0e6758f68796fa58040179688acf2ae0000000000001976a9147dd77555cf8b3fdf575efc07622a36b3221b3ce888ac55af0000000000001976a914c6a43c1124b111cbeb83f6f711747db884d69bca88ac86af00000000000017a914e738399cbcb365ff5f4a05d41a9c584bbeb92a42878daf0000000000001976a91487106557cba3b8ef8072bf2ca8d34d18bb400e8088acaaaf0000000000001976a914271f6f1c16fa6a7a782707b41729f503031c1df488ac82b000000000000016001483de3f9c0994b81acbdd64fedb477cdd3f6e4d1455b100000000000017a914b45da0a9f35966e05a05dcff779a443f81c717498796b10000000000001976a914382c918ce74eb1ad0aa61f9d3248ed7037a884ac88ace7b10000000000001976a91414f25e5864abd42d8e2b07c4f37c6f0628c60dbe88ac76b200000000000017a9148a1f6ed340bdeceb56bb1d6d2e6cab76af6b03c8878eb20000000000001976a9143142bfacb1ce64ecf2f67fcf28bc3c6ecb1aa7b688ac5cb30000000000001976a91453ac18d14b93f0b3bd45049e0ff14d41ffcfebfd88ac6ab30000000000001976a91458d8e6349285a92038d73f9013d78aedd00ff2e388ac8eb30000000000001600144c91073030256bf73e4c574aa9694e0e6c5f142000b40000000000001976a914cfce69627214958e90c536783202d2dfd296e68688ac4cb4000000000000160014f5d8463b189eae24760d39006a56c299bb0b9fdb5fb400000000000017a9148b6083071808e0c933faa074638794f551679c2687abb40000000000001976a9146e0e5666892487545f3d1d72d6bb5a05f78804fe88ac6db500000000000017a9145c3d46c1edca5ecea49f60fcba8994022779fd528777b500000000000017a91451c7db701035480457579cd7747959a744e7b41287bab50000000000001976a9140cb021dda514ba65d47d18a97bb95e31ba4cf11888ace6b500000000000017a914b76fc8b56da376a5a77deeb36aa3441a98db0931873fb60000000000001600148c1821389f02b31bbc68adc4916576c112c52c37eab60000000000001976a91436f1a610f37540e02b723e02d28c1035bc33698888acfbb600000000000017a9141ffffae6e7675cf7e3f57bc856759e9a0345383b8712b70000000000001976a9140e731a088dfbf1a7e746278cc130bfe02ff3f2ee88ac27b700000000000017a9141e810f1806d79f95d80f896eb327fe0c332b9e2f8796b70000000000001976a914d93efab8264bb57c21ef5a088edc722e26fceee388acb9b700000000000016001414178e1a6d6445d7445ac8412d2b44e28b5f5d2fbfb70000000000001976a914097855b627cdfee4abafe31bb326285e6a79d07188ac41b800000000000017a9143fd59ff35eed9586011b8a5b77305e749274ac798734b900000000000017a914d8f5229b5da850144ac4d44ae43b6111d1fbebc387aeba0000000000001976a91428ea56941cd4f2d6459f8436555ee6726db5934788acbeba00000000000017a9143c12aa9986b7dd3aadd465b690287ce9364438398720bb00000000000017a91456c39fcbdafd9d8f5a952ba85ada664618341f7087a7bb00000000000017a914dc520447068c716691663c796b9faec940b9606b87d1bb0000000000001976a9142e7609773df205391e2791398036d1386aba32cd88ac68bc00000000000017a9146168d5b973d955c8486cd0a32d12d3de0f5ce7ba87e3bc0000000000001976a9143be3135bcbdb26a75b77adffd345d0b1391c357e88ace5bd0000000000001976a91412221ec66ca099eb0962449f15ec9f2ad32fd72d88ac6abe0000000000001976a91457f883ffbc0d0e1dfaf7c9ca73e5a3045edd6cb588ac6fbe0000000000001976a914eb4bfad180fafcdf20e4f2967bbb9c06e8c20d8488ac2fbf0000000000001976a914b19ec91bee33585ff9a112d3bd3a7c0479a738e488ac68bf000000000000160014653063642a3d2ac4c0f3c66222be98680a56449169c00000000000001976a9141f1076970c8679ac65b912f4f7644d145cecf77688aca6c00000000000001976a91453776e0807b0caf6b4c836dfa09ada9ca081ae5888ac61c100000000000017a9145ec5b9eb887ecce4c4c5d66cbff5ad9155b6741087b7c10000000000001976a914f4adbef27bd1cda22b00cacb50662c2405231d1888ac35c200000000000017a914ba1d75b1e93f9f9847815ffd3ca49befdd9aecf08777c200000000000016001457f0834bb47e0c981cee5ea5120cd4233aa12185b6c20000000000001976a91413a111370db75586e8b3b46280e166373d822fdb88ac1fc300000000000017a914d83f8289f4bac0bf12e156af36e07a7dc4f5d2e5876ec30000000000001976a9146d7e71d52279e8392a87ad8821ebdeb44cef221c88acc9c30000000000001976a91416cccbac5da08c768bf5c0d2ecf9704abcc9b8a088acd5c40000000000001976a9149789b52ab9d33d07a0401af714d7d57ea203607f88ac9ac50000000000001976a9143b6923ad0b6fb0495c2e06e1099c0d81e5f54ff188acaac50000000000001600145ee5b18e304bef1166d7d7d9041880fe57edc955cdc5000000000000160014405bf306d6b1114cf5a9a8cb25cd76bd2efe7a23d8c600000000000017a91416605fe17f278551a373bc612e99496c9ef91fb88724c80000000000001976a914027a11c72d432f6f840240bbfb7c823f6ca7037188ac35c800000000000017a9148199211cfcfdb2d0af46f97251ce4b419db1343887ffc90000000000001976a914cd2e316c4cd3c3570cf624bf1fb26a7ebee886e088ac02ca00000000000017a91422a44734df5307562902de2936ee5c7d4d3235228782ca00000000000017a9141e3e3654aff5f8a85efac46156aa90fcb567349987d8ca0000000000001976a9146680ba8c703252f193974e85ea6ecea33c22a2fb88ac1ccb00000000000017a91424b551513569eb814e0c834ca00ced42f3918b1d8750cb00000000000017a914431c3479da8d2ed9dcf74f7868a0100f89754998875fcb00000000000017a914f3f0faac1ff08ef3142311160fcf43d652dc98f8878acb00000000000016001427fd798dafe83e7dd3cf2bb8e5013b7a99da00daf1cb00000000000017a91424d0f10f7d46f061e3e45865719d6bf9e9cd43d48711cc0000000000001976a914475c494754e58befe5766e2a285015b5bd297e6488ac1ccc0000000000001976a914e8252c4c761b7c542c01c272d5e01dcfd8699f5488ac8ecc00000000000017a914a210a769050be473c471b43eef34406113228bd187d5cc00000000000017a914b5b6e4f9250fe2a7cb4c2c1edc7185f97822d06c87dbcc0000000000001600143220613ca0a2f0dc728a76b38a1f3bbacd5ce15a16cd000000000000160014059976ee2ce1e6de2c77323b6903d28a6c560e8b2dcd00000000000017a9147b5f8eecd4af2cc8b1732bd929e5a3c69d0c1aa7872ecd0000000000001976a9147307a9926203e36c6f104bba6f9c3fa797a5305c88ac30cd00000000000016001479c0ddd631e8f2a7dc9ed1f26eca25c8a5c298ee3ace0000000000001976a91475205d026a83382ac999422882f348439ce19b9688ac7bcf0000000000001976a9145b25fa4bc7db202b755c33a3d49d74da57afc9ba88aca5cf0000000000001976a914110ba351d196f46f3814e718505a44ea72009ca588ac15d0000000000000160014fc2b2eeaab1821ac42beaeaf26dd779c2b76f18e40d00000000000001976a914f6c6f58f0bd2365766d544bc50148f6d7779a1dc88ac74d00000000000001976a914962338be73ad790d932bde720a260dad4a64585988acf7d00000000000001976a91426bf0e12c7e1483c34218b1d7d393489fa95f51988ac17d10000000000001976a91445819f80703a7496658bca6154869ca3109d358288ac6ed1000000000000160014527411e9460903a5ca532121620a1886696f5e7b84d10000000000001976a9149e6693d3d511150630bc7f0ce802810e89043d9488acd2d10000000000001976a9143a6e39e3b989e1ea84e174a65343c55502addfe488acedd100000000000017a914ba7516769d5a2f9cde19d7053c2a6904c18a2788876bd20000000000001976a914285afd5f5d3a957a997777d2afbf3229152b0a4288ac6fd20000000000001976a914501f01422f9b1d6b07c56449943e14945c538a5188ac67d30000000000001976a914ac0b83e4efb6e2786b41c5953c84465c46c78c6d88aca4d3000000000000160014c0993f10e9a575d022f047f17d4f522e0f1c7f5b3dd4000000000000220020909fee89f90c020bcc725bf46f731ce9eb81d7cf3a959c5ddfe2309c820dc069fad40000000000001976a9141d2610961a1be5cd3fb4e94a83f4e04403d47dab88ac59d50000000000001976a914f60fe91ee57ba73d0c52a1e1d24db46cda6d866e88acc7d50000000000001976a91496f7c327ab163a1d12838b3b8c1956ef16a8dd8b88acd4d50000000000001976a91413529327b42f9232da06717b581c3590de17a05a88ace1d50000000000001976a914c8f129c3ee1836a52d2ec8ca846a5a383f6b5b6688acf9d50000000000001976a914acf557e32cd25f1abf6bd580a8aed4627aeeba5888acb8d600000000000017a914bc61774bfaa7789c5151a1a29beffe804066aa4787ecd60000000000001976a91438387702c8daf67192db3c4eb3562f15f7152a1f88ac33d70000000000001976a9146b22913351a6990c7c1bcfeeee0f557daf2e580188ac9dd70000000000001976a914e9519e29cc1f7165ba43be7f7e380164bf4cdc9188acd9d80000000000001976a9149a3a167fbaae45b5127cd89ab9976375c0e3003b88acecd800000000000017a9144eba3456a3580300ca318a909cc5a5a9c89f06ac87f3d8000000000000160014aca4dd4d7aa85f0042ceb5dc6adc0b29dd4ee3d315d900000000000017a9143c2940cedf6e5adaa14f663244a13f44d946454d875ed90000000000001976a91496dafe837c5ec4faee7e30fa10296af2d824602d88ac68d900000000000017a914edad7061fddfa5702e877af1c0178b1e946a49c6879fd90000000000001976a914aae3d3b38f446c7053707a4476dbc14f714d173588ac3bda0000000000001976a9143cda198b62bc3127bafc679586ad78cea36f5cc288acc9da00000000000017a9144d2ff3968e3a6e324a3d857846270a6dc097eb1087cddb0000000000001976a91404d872ca9c426629e6c8e353e4be8f15ddcec02f88ac1bdc0000000000001976a914bb28711339a6b5c1ba570ccf3679f8c32cfb54c888ac46dc00000000000017a9146bece365e62018a5c123e037cfd6bba6cfb75f9e8750dc0000000000001976a91439d8541c8cc1acd814e668b16a6bff7ee9e34c4788ac4cdd00000000000017a91485ebb3949b1f5c8f0a63434f370af66bf2799cc08739de0000000000001976a9140ee5b727ac5afa6c4510abb3d1d61d0a10055dd688ac84de0000000000001976a914e12d6ac4f3a22d4f72b4e1ddd7ab479792b9a96a88ac72df0000000000001976a9146c7508936358dfef9bd1bba6dbfcaa9fd14d9c8788ac7edf0000000000001976a914d6e35034f5a6c8f73617f4c4682c6c0c9ff7ed0588ac76e000000000000016001440ea2a91cc8593bb3f573c5f8e2a6794d56b2a3171e20000000000001976a914b38f30729d0bdb7148107c767546b9671110211e88ace4e30000000000001976a9148bb18e7e2994b5ca268e81295fc9260c6fd1444288acf3e30000000000001976a91409a4f7b75090301841f8cc98309f08e5f55885b988acfde30000000000001976a914193c83e6e18cbc5913531e7fa968f70aba06064488ace9e40000000000001976a914a1ed17bf31fd6832028e04caffcd04af403c1d9a88acf2e500000000000017a914e77b05d55fb3d1e6c3da7b8aa9e370e75d4ca7ad8706e600000000000017a91449c90e390823a7439dbed2405fe23a5760e748b687f3e600000000000017a91450ffc46b29f5be5709cebef9090b0499d407396687dbe700000000000016001433a8eefa562f2ed498038c7c5012f149618cee71ebe800000000000017a914b53f553e94451f6ed1b99a7cfb635ed74924e2b68704e90000000000001976a9147620a87e3eaf9c796ea08fc9ce7a44ce4ea13e8288ac4fe90000000000001976a914aab512fdaf66b3bf2c96cf958507d348d0eb3aa988acd0e900000000000017a914a212545a8d53d03975b8f5c1192dd9c8a4190e15875feb0000000000001976a914eb8b4ed36bdf9fed34219c68c20281fe4f3ee33988acdeec00000000000017a914c12779a87cb51c389127618d08c0f64d1e274600871eed0000000000001976a9149fe51b23386e1a952bd5e40a7552d2653712642388ac74ee0000000000001976a9148d092f3bc4adeb0d307511ea442d1ba8bd26c1db88ac16f00000000000001976a914d89e9ad9dac23864a67375cacdc5e953d0f42b5a88acc2f00000000000001976a9142477827d5032999a08d29bd44a1057388591bd4288acc0f10000000000001976a914c6f7961884e6eb78f1342167e72684587bb2592288acc9f100000000000017a91440b72d5662457657466532ecb12deaa0681c0f98872cf20000000000001976a914f1cf954062f2009a8913d38fe2b498752432218688ac98f20000000000001976a9149da00a038f16c269615bdc3aa2dc8289ada48bc588acbaf200000000000017a914ea539da0169bd08e6ec4c72d511ffb21a0e8fb198782f30000000000001976a914e652d1296478a730eb98cd6cd8d786491aec808f88ac98f30000000000001976a914c503a3771c2973a4cc30fc735326ff34566b909088acc9f300000000000017a914da3700bdcd6a6e2a65a878a1a8682053527f9ecf8729f40000000000001976a914ed983ca14ddb72a1bbaf95201502920ce80b260688ac5cf500000000000017a914028fada267a4467076748d2594b7dd705ffe2eb887fcf60000000000001976a9140478317e487a6537f0301dade267c20a2bc2e39388ac26f70000000000001976a91462c3d97233b7607f628e94c095369a2ac998f60888ac2af70000000000001976a914afb71af6ac29280b22030624ad43783d406d46b588accbf70000000000001976a914361afc16234f0e335bb7a4f652a422da19686dbc88acedf80000000000001976a91434f1696db96cc64f60c918e107b3feaf832a0ea988ac44f90000000000001976a914438261b94f18dcf4aa196b445c0e0d39d66d3c4f88ac43fa0000000000001976a914ceada64a0405ac52797916280ecd4b84ef6d694688ac54fa00000000000016001466280c3302ed40b47be568bcaf9dcc94f44d818ab7fa000000000000160014f3fe69cd10be6182f3f339a17de62917c6bceddfd3fa0000000000001976a9144e3ccca53eb6e634c36e2ae6dc1fd02d140f356688acdbfa00000000000017a91447facaa512073cc2b86cc5f26a0bb0b1fb26e2b987f7fa0000000000001976a914a4832c93d5420d9786e0a53a66934c00c2a01df488ac2efb0000000000001976a914509328fb40d39d5f7378694edbcb85b60bf017a988ac4ffb0000000000001976a914ced5a0b696b0d3c3681e4f8238b09994d55bc9e588acf6fb0000000000001976a9144d36991aa4b7304f41b5fe932067b1f73d72d56788ac43fc00000000000017a914c473a30355d64bc984699f534dfd9c25b2d07d2487affc0000000000001976a9142dfc5190c86c217d88d31e0dd6b3da9d409fb58388acc2fc00000000000017a9140a5d42b522c036ed365f99ad672e7a0dc6ff5b7487e4fc0000000000001976a9148df84122b17decfb332a280bf302e0b006c0926788acd9fe00000000000017a914c28bdf0913db1a89dea2f67d0c415bccc738e6638701ff0000000000001976a9142d2b4de94345323b7fba12e21e5ac38c1a024f4188ac9700010000000000160014c79a22957716d4cd48f98d5d5dfc8c75dd468f6d2d01010000000000160014094622ed16b815904097c1df28f9f8c03b70d7434c0201000000000017a9140c9ade4654497de3110def8043baab6e959ede6f87820201000000000017a9140b882f4752555fa595b62c017ff87f641150c34587a20201000000000017a914f7e7814852ad957001a04915bc5a3086c510d762875b0301000000000017a914ebd3d5789e19cf861fc9b14f08520227261df12487dc030100000000001976a914343d3b653e4c284369e923279ac1928b3c679bc288ace80301000000000016001495c39c3fd9acbacbc5d1781b26ca56daaa1ee9d825040100000000001976a91403bb9f160b045bc30b3140a3c0f7088035e4facd88ac4804010000000000220020f8ca6408bca4d72aa1f9d0bb64db208bc826f72e872e63953c07e157d31ea3d4ae040100000000001976a91451ac1b086b8546e3660104c697a88412e0d8594f88ac0a0501000000000017a9145afee9926a85926164b096ed14694ea50aaf041b87c80501000000000017a9144533dc262ad83f5192733f784153b942bcd77226870b070100000000001976a91489bc28d319db3ae3e888cd75336c54f04ba5b0ad88ac740801000000000017a9148401ced724c0cf3705763d71302632b89147b1b7878e080100000000001976a9147ce38391cb81f081f5616b6c752d2a14f55f1c5d88ac91080100000000001976a91410c7f6d564152702bd67d4cb38290f92a392fea688acf90801000000000017a9141ec24ed1a94c575703cf0bd068f74811e697d4798713090100000000001976a9145bc1accfdb6fa14b1e4b2c5062f141c055c5f4c188ac5b090100000000001600146cba22d5c096872d43b711ea465f6810205ab9b0e80a0100000000001976a914d0454c13256d046a715b59b7f816d113749f122588acf60a01000000000017a9143bc8eda252d6b7ce0a41ddbc4cb166f42a0fb14f877a0c0100000000001976a91404606feb711e8bb81403279db68b112e16050d9188ac840d01000000000017a9147fcae71c6681c69c6517868be210a2e525b0d660878a0d010000000000160014bf79a4654f20645ab3791b14aeb3f6f1072e111afa1001000000000017a914e97d42ccbbaf32374096bccb8bf71d865858222e8737110100000000001976a91467b2daf0e25312fbec4e30f67e06164a805ab4c888acf71101000000000017a914089145c4a523b2a7e41e2d90adb26c12e529945b87cf1201000000000017a9145cf0bbc107cf84959ae9c887ae24a866bfd276f687f01201000000000017a914be3faf1b4c9945c9b6855c6b049dc55452d94263879d130100000000001976a91484f4b772976659c9df91c8ce6f16696858e6999188aceb130100000000001976a9147e406e6e3ac215cbe334026b5c14931e6552c03888acac140100000000001976a9140f475d3e8d96ca88382e6a3147a26a5010e9b18688acc0150100000000001976a91449c7e5cb6b7270e0ef6f14f1a1ff984fb470a45d88ac2c1601000000000017a91428544df95dac588281afc00c18e0a94b7528fdfe8747170100000000001976a914a33c5ef31d479f2cd8e2617be76560e1f7497f4e88ac4d170100000000001976a9148739a24e801dfecf45b6d7ef67069792acb9c6b588ace918010000000000160014e2fd61d8678b3de2989a00b1262332bddd9cb01fb01a0100000000001976a914c874b611ba889f851fba747d87ab8b2c7c7dbbb388ac471e0100000000001976a91413e2a33a569ab517643e1ba35ca1289abaa2842c88ace11e0100000000001976a914c998e7ff04a2c054b397a7fab3c8ec5bafdc4df888ace71e0100000000001976a914710af1ce2e9685dafe6365e74ff79f5ff7e6327588ac9c1f01000000000017a91459b62d778769a35fdb52a3ccef1071edee86a8e9870f2001000000000017a9142c5eb08ea369931ae55efaec149476527f7e252b8715200100000000001976a9149784fc2586842eb46fc935932b6507768172da3c88ac87240100000000001600144ac6974592ce2e0f45bb5c4cf6118d4deadcbdd2d72401000000000017a914d79a3c96b74051286adb9000f9deb8f7e65fc977871f2501000000000017a914b238c7d021bea9310d006e885319ad82de603ede87a7270100000000001976a9147a50c5c0b06d136dd4b02c78488799f8c12cfe4988acfd27010000000000160014ef536b959bb4cf2f619c09f00c98eadc86f542d4a52801000000000017a914eda52fe8517efe6e7303d28af9fb0d37d10267998743290100000000001976a914c7d865b11ca00eb842d472d42470e114e76f094988acf3290100000000001976a91464ffbb42d7eb3f355a427a010a4c1c335bfe14b588ac102a01000000000017a9142dc64590541522b070d03e5e9c81d4b9326a484a87412a0100000000001976a9146b7de9aa6785f3ecbfa6b6cc51b4c99b719d5dda88ac432a01000000000017a914dc3d933a45b1185136d0dd944420484c1cb57d76877d2a01000000000017a9144ac908b4690d72d79704d6a051b8b1e4ce33d0b7877c2b0100000000001976a9143d09552977f682999a70c127d7118010e8699fcb88aca32b01000000000017a9147fcae71c6681c69c6517868be210a2e525b0d66087d52b0100000000001976a914837b4621d20a610fc9827a273c2fde6ad71c970688ac592d0100000000001976a914d15fa275c0ae6dd9391eaf802c426b831c7d2aa088ac682e01000000000017a914f3961c4a1d5b19a9018aff67271d51c4e392e3b587872e0100000000001976a9142be22ceb4382faef46a3a7e5b84526c81cc8c2e588acf32e0100000000001976a91411f3ad7243d31a2888faa79c7434698df2107bd588acde2f0100000000001976a914308fa701ceb8de82e638377722107780b37c5bfe88ac9e300100000000001976a914fb248d991ed504a79f6771f0f8bb8c711aa10cfa88ac24310100000000001976a9147c11bd7052759631398aa25365d6514fb14d9e5b88aca53101000000000017a914cd18ac10e6adecdfcdabb9f46836417a74bb4a568773320100000000001976a914c00811d9952bb8f4e0ca3604904990bc6bc9b20d88acee320100000000001976a91459346ba91ff328581571904482c7ae2653a7e8f188ac98330100000000001976a9140050225c06636c3ef9d0b43102bce46542f25a0888ac0f3401000000000017a914626940e1c97607c2dd2adace8137c06a39592b4a87f53701000000000017a914a9305724726db15a9d5141471a4dd385ec69baf6874d3a0100000000001976a914fdcb73a48683c7b38aaa6dcbd0e3b038dd188bf788accd3c0100000000001976a914c8d69ce1112d5753de16bebd559f806aa95fc8ed88ac2d3d010000000000160014c5065d248adec5bcbf91f8224b0f95b1f90f05cba53d01000000000017a914a6ab01b3684c6503e0b25bc3a811ecd9b36c0a8d87423e01000000000017a914aa9838f4b856b689501f383dc3d21449b263154587d33e01000000000017a914f5dd9d69c5fd71d9b419e365e8be564f42d2233087963f01000000000017a91478448c2eee280f8470cb6ded458c7b7da461480e87b73f010000000000160014a9130a896352af3c4a2583bfb547811c07af3ef26d420100000000001976a914067f514e39fd8d57dc4fb272c1b2d48166e5a89d88acea4201000000000017a914a8c318e0cd533d6f406d7986a997da11d93c2e9087a4430100000000001976a91455209b14b751789e3d3a37a5a500a41e5a1096ab88acf84301000000000017a914dee604a395751ced7df57aeec9d24ad6444cfb4587a2450100000000001976a9147442d125da4400c242e1d68ff3c75719b184def488acc5450100000000001976a9144535c7c2dc1fb473c39c5b7387e04577272d757088acf94501000000000017a914d92ce2490f3e5d4194e236ea96749da8af74946187054601000000000017a91464bfb3254fdde7550b780b77fb6ab419c0a9286387f9460100000000001976a9141244a6aa33f69d0afbe7b0862d72f0632d15686388ac924a0100000000001976a914aaf5aff7222cdbd99b43cc74185bc8ab910f564d88acba4b010000000000160014eaad60f405348074c52135ef3b28045d5fcfefc02d4c0100000000001976a91477ef004db3b7e7494cdb7b62d8bbd0ed9e29c6ad88ac394c0100000000001976a9145853a3afb7490993308f86969cb0332c144d1a4888ac814c0100000000001600145fcbc769660a5a647122c338207c4a150dfca40d4e4d0100000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac484f0100000000001976a91485d1ca3e8d663ec0cc55009622e60526c5ea559b88acac510100000000001976a914bbf5fb7628d5cb34aa54dc8cb336d2352299e7ee88acc65101000000000017a914c937b4d3a6bd2df8879be06d820c18f13d275c19873d5301000000000017a9140d11282e14369b00eac8297ea2b85bf9fdaae4e687d7530100000000001976a9149945a25fc1024adcb54eb6e60477e1ec68225fab88ac79540100000000001976a9146c011e04e62d64c77b4c647d5ed7bfb49be95d0d88ac64560100000000001976a914962cb207fe3b6188babc93da44539d3b17d71a0e88ac93560100000000001976a914f5888a257e78abaa5c142034f22f86eb698f372388acd457010000000000160014a6f2e0afa2087abd8c126458849e4db4445c957ed75901000000000017a9143436b167504bbacf1db9aef602e1848bc64bfee387285a0100000000001976a914d517dedc7f4237e7d1b57cba6fa708be79909eca88acaf5b01000000000017a914f04c87f0d99d01ca33e0ca0f5b907346346570fd87cc5b01000000000017a914cdeb95851d02649f6576f589d4c67b5a1ffcf969878d5e01000000000016001412ee817b96c9525641b00150860d22511a573a6b095f01000000000017a914d85891317afc09e8b1a515dfd88d64f3b81caa3087e55f01000000000017a91421c6a7f2b82e8a13bfe3c6f1cdc9db9db067fc6387ac600100000000001976a914d536f123197cf5732eda370a2fab1f719e0c461c88ac2e6101000000000017a9149d2342b5c1258fe0fdb0456e5e6455d50366580287ff620100000000001976a91401b3845fc255f4b9b4cdca076b0e2fceb1e4b6fd88ac2b63010000000000160014da54b9d61b1ec9703fc2c1b3fa14aa2614cbebde46630100000000001976a914ae65a5c74080fd69f15367617c1ef61ad7dac2b588acd96401000000000017a91456428528ac48208a565b31a468d1b81f353f58b687f8640100000000001976a914c8e8d39ced4af0100c94137b8d863b412b4fd44a88ace4650100000000001600149c35d810dd0469d30ee8288cd962d6a8f08ad4b4f2660100000000001976a9148b2f3597d0f5b463afc086355bf6c92ab602e3fe88ac816801000000000017a9145cff5671a5efc148ae1b6bd29a8bb712aea08a17875b690100000000001976a91496c764ca3d2993daadb5762b86a13fb6a1fc104a88aca4690100000000001976a914b0b0d43845941b4087acc072335affdc0403b70988acbc6901000000000017a914fd8c8728db8d34c2dc90f107f5eca935d724be0287236a010000000000160014e19114140beb00f30627532536659160968d7eec9d6a01000000000017a914cc01666116148f2f2be08b774bea9a525a164075874a710100000000001976a914a28fbb5d8562e8c0d9348a861c3f52fa18696b0a88acdd710100000000001976a914f3013b592619a355315aba1b1dfa1c2b33414d6d88acbd720100000000001976a91493eb87cd7590caf21f0dd86886fb3867d98940b688acfd7201000000000016001451be1c0a5d29add07a6b984bfc3f73ede5a33dc213730100000000001976a91419028a636934d8de5b61f71da8f46a721c02575588ac1c7301000000000017a914d92ce2490f3e5d4194e236ea96749da8af749461870d7501000000000017a91459973c9e1c6c94e1019bfd91c9eb22e88838eb958778750100000000001976a9140e6a4746c47cc440798839c27ea15187f3ad21ba88ac59770100000000001976a914e4498c9802c38fe0f2d39d9d3320b9de195b648d88ac8578010000000000160014c2e7bc4b68922cea46165d11f10a5c146e906f2a657901000000000017a914df5a31d89d9c58e48478ede33dcc55ea28b8006287437a01000000000017a9144f459ea4ff5f8815ebc66556fe215199127654be87fd7a01000000000017a9144e8a7405d35ecc4626a1e5739992e9c9d19ab51387407b0100000000001976a9149263f93fe930966bf068856834d9163fed8c3af488ac387c01000000000017a91482ea82c9f2bf1931c90397621e74bed4483127d1873c7d01000000000016001433b7e656e7b462cc62fe14dd0a9ceddf8c88864a267e0100000000001976a91480a0f06c8686666f84fa79567926cbbc40e8623a88acb5800100000000001976a914b1696c0c5f8094ce1ec2f4cc92657d21ea0cf94288acfc8101000000000017a914f612d0321fe41ee855eacf66e1001a27e21356b8872d840100000000001976a91498e76458a7e7840c95d291fc5c93ed256fdda94288ac8b8501000000000017a9149519046f2fd11fd22674ce62d52670fc194fd38587b285010000000000160014e8525ceddb2f5ed329c0693f9cb38e614eecab9c5d860100000000001976a914ae248d3c8908082e3a2ea3c14753681cf300479488ac74860100000000001976a91470a6ff7c6fc549b1f537ff400be982b4d21b41dc88ac60880100000000001976a914cbb90c539161a674670a6d517b8dc81a450c560b88ac7e890100000000001976a914e7636df0743368603592ee7cbb8056f2aca1481888ac2d8b0100000000001976a91494689d9c675d129da09b0ca50b7b5cfee7442b7188ac378d0100000000001976a9144e229bdc13c46727960313059a353242a1d4750c88ac6d8f01000000000017a9142dd415c44a32418739d91f5932298072b122a43f8727910100000000001976a914c0b3c980eec4075a12148335243076c29a43941088ac3d9101000000000017a9143c576bea1faab049959e2c588586c3276d7c9dbf8707920100000000001976a914a06a971f762f7702dba17717c1f18cfd0268cebb88ac7a920100000000001976a91475855a3fd02b4a757d92a24776c100dce2441bc388ac67940100000000001976a9143b6e03328b2e7e35a6ce096a9aaea008116f600388ac21950100000000001976a914699fe9728762e0296ea5c8f91ee32fdbf72d7fd788aced950100000000001976a9142bb99dc1faa2fdb65a4d21901b9d8a2e9dd4588188ac28960100000000001976a914b10e6e84856056c72bb42b86b14e92815d162d2a88acb8960100000000001976a9140b4cf557284b5d043bd23c7fc26be21a189e871488acd5960100000000001976a9147bce38bc9cb4493b04a5c84c36af98d530d67ec388acb897010000000000160014c9e5c0243c9baf01cf6c1ff1de2cdc5bc69e711cde970100000000001976a914f0a426b3180fb5492325c48f8f953be7632a695e88acfa9801000000000016001427fd51e0a302a9dc7ae2dcf163f6af192fad6888ef9b01000000000017a9145b4da45046385f682de0459bae663e6c98008a2e87919e0100000000001976a9140ab34693016479eefd0e8bfaaf8562b2d8a04eba88ac5fa00100000000001976a914c026518cbcc5c9ae703ccaef47804b41037985b488ac68a0010000000000160014a63c1df6d8b48314f2ea4b6e70734970d58942613da10100000000001976a9142e7780d735fd0c705a5cd840f4a6c94a4235b16288ac6ba20100000000001976a914cae6067c8d06beafd605d8275f0f68ee81bd6f3588ac72a201000000000017a91422aaaa36467a4eed46a0d1edb4842bdb5f9d76bc874ea301000000000017a91493cdd4e58cc2d0f2dbbc1d553b25a00d1d7fd430875fa301000000000017a914dd0251b1717a400aad2ca0f43bf09759c02de16a87a2a30100000000001976a914aafc8a3f9af70a85e2d100b5f908d939fa2920e288acf9a30100000000001600143623a290e4138915da472c371381e230cd5d39e72ea40100000000001976a91484eee8e1a660fc8aaf9da17cd1222a03b36c9d9b88ac79a40100000000001976a9143c438de8cd957dee818c680cae86299a4483b35788acd7a50100000000001976a914779a183318b9116c413e87f33cd47c056698af6588acf3a50100000000001976a914e8059382fd90142f63554891bea187877f23dd2e88ac74a60100000000001976a914b8b05947b2e88d9dbf06e2592fc91215d1afdd9c88ac8da60100000000001976a914872dbb366e1bc5bda8f2a0bc81ebd470ee615b5c88acc3a70100000000001976a91478869a4017735d72431a7a785da2e988453fe43188ac7dac0100000000001976a9140de726fe243eba0c96969487ccc3aac46c6a64b988aca5ac010000000000160014d6a2e6a9d625477f39041520e67980555661faf5eead0100000000001976a91438b5a97c3b6b357627d568ddb9492d822d8ce93988ac35af01000000000016001406191b195b944f2abebf5a5b45b04ab5a29158dcf9b00100000000001976a914791755213b60ae77c28be28d2a3e509d7063f9e788acc6b101000000000017a91438b445671ae12e3af828dca9862626afa87284cb8700b30100000000001976a914d3ceb67325533369717de445ad262394f261cd9688ac94b401000000000017a914b4e1af873091d8b7692458b1201de65f13a0c09e8744b5010000000000160014d0f4abf36ef879cf99147803cab4ff3109f29a3e8eb601000000000017a914bc8fcf44a22ee4fb141fff6aba36a2ac95bfc09587d7b70100000000001976a91469932e4311579a73656bc97ba136ec12aefb939988ac49bb0100000000001976a9146d30cd28179937237a8937db485c38a2bd79d17388ac02bc0100000000001976a914617cbe7b7024f266ec819d28f4919676b963604b88ac9fbc0100000000001976a914270f079d32726c6412b1c8e04699644f0d5f3ac488acc1bc0100000000001976a9142769d723fe53046e2c9ae6cfc9cc361e61808d4e88ace6bd0100000000001976a91486c72905a544c7948185ee58b3f6ee257972e25e88ac1bbe0100000000001976a9149e420429fe79f09226dd6f69bd8ca7a0fa04796a88acf1be0100000000001976a9143b1f50d54c729c6089ee413f5916538e51fa98a288acadbf010000000000160014db249e7b0e6d20c9536c7bd6a170e27b63aea386b1bf0100000000001976a914e7e6986fd955e6d52b5a42e1aeaea529ad099e5888ac4bc00100000000001976a9143d2a8bcd3bdf95965776883b18f9b81a8c3c52eb88ac3fc10100000000001976a914985693ba84f172de410d0588fa2b4fced1699e1388ac81c401000000000017a914b744cb881c414a91f5cc2cae9c6510437e9bbfa787cfc701000000000017a91455cc10a97138b0f29b5016664fe638d30e9d51ac875dc901000000000017a914fc12d6ea0f111d1275fce0dad78e848c6814f4a58778ca0100000000001976a914f932a38402f30257e462ed19d6cea7c600c3052488aca6cb0100000000001976a914084239d2c7ca99fc14fa6e05f851f6ad9beacd4a88ac28cd01000000000017a91448d4532a1227da586e9e0f824b9ba5e8568178e187b1d00100000000001976a91441244485adf00778bba098e70c313e97f01cfe4488acd9d00100000000001976a9146dce91060c47fb617b65b8c67eac67d75832ea9a88ac58d10100000000001976a914d41545c679917d268c398a53689d9cbfc78c3b0488ac61d1010000000000160014a2166e58d056cdd3313e1df94bfa4527f466135c16d301000000000017a914901d2b045eddfbbcd932a8dc58121b1f238181aa8736d301000000000017a91426f9b253d5838e7c11174e402fded3ee07bd537d8783d30100000000001976a914001587869cfd94d1ec52b01d4abc8587fe09469d88acacd30100000000001976a91412dfb0150938921642594349aabe0dc30bc26f6388acd5d30100000000001976a914cd581efd38b4143901a89fc7ce3be6ced3ca429588ac0fd40100000000001976a914260d719fef7d7d6c053ede5d55595a91ace8960288ac71d701000000000017a91482633dc487efb5bad97b98aa186e9578c24066428736d80100000000001976a91455352d7f6efd7eaab9e593d4fb806abf45a539ce88acfed80100000000001976a91484c34ef6a3adaae1d21105c176d82736c577fa6188acc2da0100000000001976a914018d4ffbd343ff731a2f8fcf601210d8af4cf86988acc1db0100000000001976a9143df3b4b299ff0be93b7bd6083251b8642546781288ace8db0100000000001976a91437b687d773cdac3b7c3398c15344a28f0eff717788ace7dd0100000000001976a914ae387e5a751864d80bf1c45545b56d24c8972e4088ace8dd0100000000001976a914fcfe920a5707be7a11ca9c4ca576b8431115a77088ac75e00100000000001976a914704bd07dfcc8c037e2c805b2b97e5fc902f04e8c88ac20e10100000000001976a914f81e809f20e4defbfaaf2290891162788358793c88ac6be30100000000001976a914dc87e9192adf09a0fe1161a6bbab521fcb69c52788ac85e401000000000017a914e8eaf4f2fce01a3e60b7bf28d80976d174fc5cc887c3e501000000000017a9146ba8db90cb32bf9de2801d1f5e7ed451059dfe328758e60100000000001976a914bb93327dcfd7f340bb4010b70c114300447a004688acc0e70100000000001976a91452ea228b711d28e820773df6dc14cd2a57e96ce288ac4ee80100000000001976a9143396219def845125938940d0e7dc4ca42b3b0dd888ac00ea0100000000001976a914a9f8c95693aaa01b9e7253938cc8d4756da8be0b88ac5dea010000000000160014a8f0d62a7854786a78c7e84ed58ee0851ddd3e8067ec010000000000160014e20d5335061a5338ddbf8f9170b7134b38775a64d7ec0100000000001976a91452f4d309e171520ff0bbc11a4a0fd0d3eb50cb5888ac58ee01000000000017a914138bcd84e3b1ff2a4021c19218a15374081740a087b3f00100000000001976a9141a6e5fadededa830edd193ec87fb902e3a05bb5688ace2f001000000000017a9146dc574cd728c945efaae76d832378bd2233fa3d487d7f101000000000017a914a1e66c16dcede12e6550439d3eb5e535a1975eaf87a2f30100000000001976a9148bf4937738adc66be4ebdba5c8adfc1d811e103688aca3f30100000000001976a91409077b362d0c69566ccb2c3e2327b60e19d5f5eb88acd4f30100000000001976a9147c11bd7052759631398aa25365d6514fb14d9e5b88ac06f70100000000001976a914838f577f79eb0b9798f2174f40659344c30e37e688aceaf9010000000000160014564f48cd3bb5b9ab24e0a771e915dc4903e4949f3dfe01000000000017a914667392ca7ee35cf6475ed24ef31012f5e0993543879bfe01000000000017a91420762a35251e627d9ec9ef57471004821e1e5d6287dafe0100000000001976a914fedb18a9f8dd815c3b9a197184679bec81f529cc88ac02000200000000001600141db52430177978398aa1118ef4aec9537a3505cdf70002000000000017a9146712036b228fb3691432ed2696704ba52eda12a98784030200000000001976a9146dea4f06ab7388170eff8bbfe13527072f67ddc588ac91040200000000001976a9144ea68ce01bd8a7f40000b07242c620803cc9089d88aca70a0200000000001976a914438c1ee2e331d38a34d94fde0c97c9143f2db4e888acdf0b02000000000017a914af4b5fd4ef40a887f4e2c7b579b64a58ed8062b687140c0200000000001976a91489b35427e712d36ffba15c9d548178e6b20b728488ac450e02000000000017a914f057c91c7be465a492556a982b2944adc280e54b878f0f0200000000001976a914bff5847ba715545b12a3d3ef0b2169f51998ac7c88acf7100200000000001976a914f6bff1b488b03f89f4dab68fcd1dadd81d5550b988acc9150200000000001976a914d465b643a1c1b54542e628c19cc73cbadd65a16688ac421602000000000017a91412a34004e28b32d0afd5805af9fde867ba3e59f987e2160200000000001976a914c42e1179997a76f900e8bc36cdb3c47658e53b8b88ac651702000000000016001436785830191992f4deae2991a30acd0c70e458dfd0170200000000001600148acfdcb0d77d272d7958594876150e0883d0c1591b1f0200000000001976a914f187808d0edeabea8434251f0e48a765271e2a4588acb31f020000000000160014c80f05b1eeba4458a0be5587ebd2539af5f9cd040c2502000000000016001406cce39ef8760199c54bc0f31be3233a330dd86601260200000000001976a91434c53968e7656c73ec1ba799a1177415f8f0acd188ac11270200000000001976a9147d89b8ea953195daee58454bbaf2c585794b1c3088ac84270200000000001976a914e9f1e6d83710e956d08a1b6f0ab59509b3c7342f88acba2c0200000000001976a9142ef0e04b9f745d6eb986921be30adf8e80027c2b88acea2e02000000000017a91479aa325dc36e1875359bf28a2b9f5d3c6606bda68701300200000000001976a91442b9cc85e1b107d96d759189ce2d06238c52ee7388ac42310200000000001976a914ce05aeccd99bce516d3e174048930f916c42ec5d88ac5a310200000000001976a914fef975a9284c15a93da559fcf81d8c9c60ae981988ac223702000000000017a914e9086345a7570f786cedf3a796232d80a47787b5875b3b02000000000016001452985b91795208cff39db9ca760ee2ec03be2ccc8e3b0200000000001976a9140668c62d294aa165b8865d1c2c591045237943f788ac174102000000000017a91405ea22751aabc05737db828e24198bd61c3c1bb58749410200000000001976a91456b4d69be3a3acaf4ba265d7021b6a9c26cd8d1688ac084202000000000017a914b8ef2edd2e61420fc38bc3fba59787160e3c1b5a8777430200000000001976a914243ee20f16993995cc7c0a972471cdd267006b5b88acf0470200000000001976a91493e57ab912891208d76c81668d2744f1ecba53b388acd648020000000000160014dfffb08185daf476282140c0715c974c3800d1b1f0490200000000001976a9140d98c3f1629f9c891d500cca778b4a5c3dca866c88ac784a02000000000017a914bffa143056604c2e9dafdd7cf5ac153a8af1ec8b87734d0200000000001976a9146cfa9c3ebad13ec79df3d7cc87b277dd253e9eee88ac42500200000000001976a914de4379c160c99ddd8911ef3d0e99f3806257595588ac7b500200000000001976a914a07c8918c38cd44c22a33c882937d2b521eb23b688acaa5102000000000017a914382d8d966a2a61460199bee71a4962e5f79a954c87ec5a0200000000001976a9149d7312a54e4d344c13881d6860e8b4976f6e049c88ac665d02000000000017a914a58883af9df675f965e3bd547827f405fe894c40872e640200000000001976a9149012a6473bfc3945fb42926756d2b3478e39c42788ac6a6702000000000017a9146998acc0869628712b9c64857664fa4f30c57efd8758690200000000001976a914dbf9931f1ab912985b38df81b39957f0560945be88acd06e02000000000017a914d7fd348cedf9bec32901f5379f5c8ffcdf26b26f87fd6e0200000000001976a914c0578d91c7efcaf46fb2c2612369f3d734b17ed888ac956f0200000000001976a9141ab260390cb5372524cf7e3c8fde88cfe857d12888ac027102000000000017a914ff203c6f46138a0352595d1ebb645bfaa6e19e5887f57302000000000017a914272f49b41e5642c742c2ea71bc6358284e14bd5b87d8750200000000001976a91488e74ded7b672280b0f6992463d98945b188516a88ac86770200000000001976a9144dda4539dabd5daa0752ce31e2f204e235b2dfc888ac037d02000000000017a914b33385b722aedc85f44336f08f761ff3fac8fcc887e88202000000000017a9141ea2ba2e97d14b59d1ef2417060254b3432927ff877a8802000000000017a91405914f53c76942b43d46edb4af669d63c32bd0cb87458d02000000000017a9147c6b685b5297fd37536ae9fa9bb55ffb1a00710e87db8d0200000000001976a9142828cb6a8967f2ef7c9e14241350d33a91c5f18c88acd4910200000000001976a9149405ad4f09c53a3da0c0b9bc1159973d042df88f88ac8d930200000000001976a9144866f62d536bbe98aeb74fbe1238ee5cec1d535a88acf9980200000000001976a9146cf97973ef1ea6e6b261fdaf05eff7c3719589ed88ac199902000000000017a9142bc900b8a875ceb54714c8a97c1161599a7724bc87ae9a0200000000001976a9148c794bae4f5ab23f2aee6969b4bbecbddd5ac93388acbb9a0200000000001976a9144f1d2afa4a189cd82e5a46d02ce2b2ca4725b14e88ac179b0200000000001976a914d5b740b074d159a6c7c0d6ab24dcb45ec7ef780388acde9c0200000000001976a91489f8cbb9ff445260e15e725626ea0741aeac872488acf5a102000000000017a914898f046c35fcb1b92454e9cef2b3a7ee07b609fe8703a30200000000001976a9148efbe9eb106f23f5328cd59105aee80a37748eea88ac34a50200000000001976a914dd30ca1ce1d83a93313efcc2a23e82bd016a3c4088ac7fac0200000000001976a9149b99af58161a1900928a64e3879a28f3919a408788ac57ad0200000000001976a91459d6f556c54d1c7d1f4da2babd4512c8db22c72488ac3bae02000000000016001406b1dd7a7d9dde59e273e2378a226ac956f5777378af0200000000001976a9147a2e8ef7dc2b85b526c7302f386963d7e7a0023988acd3b202000000000017a9142bb6b5facad96e1c568a3d801ad86811d581485487aab70200000000001976a9145124a34970aea3cd3f46bbff8f4441337c7a71f988ace6b9020000000000160014b1cdc26e3ef28b68d513035522692ac33f67857da2ba0200000000001976a914e19f9f48819149d723356736b07632492685d44e88acacc002000000000017a91428a0f73c96d7ab69b9f5b7dab8cf34381123fba68729c502000000000017a914ae7fd4c2e740a18f2523edcf316803335a2c6e148771cf0200000000001976a914c082e15a0497180fdde6439c600d96104e7634f188ac82d30200000000001976a914328bec1a12afbf7abc366fc16c4af759850b74bf88ac9ed50200000000001976a914b38bc4fd6a59b6386af710e8d8dab474be11731a88acacd60200000000001976a91448efa96c7df554b9738aac223f5758a09a4e159988ac15db02000000000017a9140c6183b17dcb3ebe2a681f24ab483f899b60d0d087a8fc02000000000017a9145468f64445fe06a080d1a7d86e82c607db00659d87fbfc0200000000001976a914277eb27c684a5977f52f05bdcdabe4ca26e4ef8088aca8fe02000000000017a9149ffc9f5536a696ed0acee169387ad216bf4c81d68771ff0200000000001976a91450a064a5cd46059b808d9ff0e68447705d5709ee88ac3d050300000000001976a914fa0607163d5400e9fd9d2d10987ceab83148ee3388ac56090300000000001976a91496061728fb0ec771271418dba4f3740f53cb2d7088acdf0a03000000000017a9142437b244deee9a80a58f262b6ea42040e4c6c90e87bd0b0300000000001976a914548c63de8352d0fb7a46962313da04eca2163b6c88ac000e0300000000001976a914156c3ab19b39cdc4ad69836165cf083020aebe0088acac180300000000001976a91426241a90cc96451051f94590c082a877f985997f88acab2103000000000017a914f5989a46bfbd0049dbfb3ecc3afe551d11e331a8871c280300000000001976a9143feaaf79dd28ea3849c5ad0659aedf59f3769ea288ac462903000000000017a914728339b9457b0f2a4f61f9dfebd3444c6343f6bf8714320300000000001976a91483d3ae24cd3c534402258058770262d5a8203ead88acb73803000000000017a9146eec68c61e1fbd7effcf44432c8ee81f11337f5b87733a030000000000160014eeab1b3fc632ccc740d8756c2692b99d3a5e543f2d3b030000000000160014f997400f085b491afae4d77caf8ff0503ed4bd81133d0300000000001976a91414d305837d8934e3596aa9efc95631af7dee203188acd6420300000000001976a914c65be3de0a050b9ee5d80b4b8eac077da6bcb3b388acb2490300000000001976a914f714b1a08ca5cf614ba7ddcb3ec29b4b0b084cba88ac6e4f0300000000001976a914b10ad4285e690408f43a9fc9148a5af765e7be0788ac84540300000000001976a9145f0025c6c0586d695ce1338061dd5d0240f7d0ca88ac30590300000000001976a914dfd68f261df491ce0297f7f7d3a88dbd17dac1ff88acb65a0300000000001976a914179f6e5342612e23244b69666c4e05fe6ce19d1488acdc5a030000000000160014737b77f9997682f291fc617069d650e883ce7ccbfe5a03000000000017a9142bc0bbabdd7c90014d19c5f7c8989fea9cb2bc8087946203000000000017a914c04525433f5549bff9595a739e3ed42a8be9dbc8873c780300000000001976a914c3e08423cf9897be91251a7c62307df2b061037f88ac497b0300000000001976a91415748d52335f9a2b89ec5f3937cbd764ae1c284e88acec800300000000001976a914da78bf7eff5d2283376301812f9c3f1d12bebf0f88ac948a0300000000001976a914c3ebceff0f98c53df4ddf4aef0eda321e8b88e5188ac7d8f0300000000001976a914dc1f0eccfb483c4726e1127dba5f4b500db4056688ac7da70300000000001976a91421ff61718888c185919fb858418bdb6997b5eca988ac8ca90300000000001976a9141f921d3d08d7f654f6ee5d04be0affd3ec5e2f2088acc3b8030000000000160014830a99b0282564df9ef493a4887394531babe6659cbc030000000000160014c5976d831a621cf2db20fbe633be53e7ccbf788fd5c30300000000001976a9143fbc44ec3fbd073a9ae5d8faa2f40073250b1fd688acddca0300000000001976a914bec9c9d451130f85d40a5f79cf2bc021019c726388ac25d003000000000017a914bbd6d90436f808c0fe2183c7ddfb8df23752f0a88730e00300000000001976a914f866cffc52128fa993e992d968fa30cbb9fd5d3388ac52ea03000000000017a914b91c0ba947d8523efcd058363192017acd90965e87dbea03000000000017a9143b79fa65a7ef02faecaabdc5cd91b99b847cf4e287b6ee030000000000160014852f523fdf109d11c3628154380d7e8711113b48abff030000000000160014d5a535fe825a2955c959ecc708766e7d6f8d7089e2ff0300000000001976a914011a631bf291b5beaf9042a8337db034962e9fac88ac540004000000000017a9143d60f61126c4b16b29cb31478c622bc971bc976787f00a0400000000001976a91409939320cd7b7b43be65d4fac1316045ea930da388acd41604000000000017a914a6f0e7bf1c645b89b1f7d6513fc7a07930a6aa7e8791240400000000001976a9147fc574760575fac10dc2a8e42718792ec42cb59888ace12504000000000017a914bbc3ab2001aff61c418572e21aa41060a6ef324f87744c0400000000001976a9148016e9d35309e360de653e4fa346d1e9bc2e102788acb56604000000000017a91404f6d1eebc7d55fe02a4793c597a8986ab767bb5879c720400000000001976a914f94ba3c14070fbffa9b810172679329dcdb7580188ac1c7804000000000017a91435a7d442d0d786720c304f5d447417e44ed3a50f872c810400000000001976a9145f2bdefe678aee8ce8b1d7a57044853d5d6f3a7088ac29820400000000001976a914014dd31a761d93e0396b2bd32251c7436161962488acea840400000000001976a914b6b17e83657087281c4cc05b669c655ca765b76c88ac3d8504000000000017a91412a67eb2239b150cbf1fc8debd945fdd40e5e034879b8a040000000000160014243c0fa3c4154226756f65ef1aa05184ae99834e4d8f0400000000001600141b4eacf8985bef5808c105c8e33a4873befc2019dd9a0400000000001976a914be71ae6e512849ffd3159620696cc20148e179d488ace5cd0400000000001976a914035db681a595ee1b6c833e461bf258670a6262c388ac5ace0400000000001976a9147530c2b33a2c9abaf1ef5784a6c2e65698f902e288acfbd304000000000017a914d6ea34bec9cde86508f9ee8dacc09d6329153b5887f8e20400000000001600145d8104aec70f5e0f768cacba97fffdd2e79c8b4368f10400000000001976a914ab4912ada425abb3c8ed086515a89226bd58456288ace8f80400000000001976a914d6b5b1bf0c474e95339fdebeec015353dde6db3a88ace0fd0400000000001976a91436b2c5da46ecd1a6bacc0dad3cd90a754a5e71f788ac52130500000000001976a914dd3598d4ebc0e18a9a43045e12668be449025c7188ac472105000000000017a9146d418cf29ce8b8b231e4305ff4cbbd1d549046f587548005000000000016001458f876020d1d90a930ff4003a64c7c2f511a08066c990500000000001976a9142de37486ffcbba21b15677c54d2ffa0d736252ff88ace49e0500000000001976a9140d98c3f1629f9c891d500cca778b4a5c3dca866c88ac07a105000000000016001449677a59dcef4a0d20ff1799f9b4c170b9dcaf8b1da90500000000001976a9146b266346063f959338baf10c7216cee90b66506b88ac73f005000000000017a9143800a54dc4cb97feee583b9dda70aef77338100287c7020600000000001976a914db9ea2c5745e0f49f8f0b82894c35156267cb45588acee4f0600000000001976a9140f77d7e30cc13338d33a6d374dfbc60d7cf6f0b388acb8660600000000001976a9141943e339ce1ccd50ea7a78305622358343a2c20e88ac9c770600000000001600143225a8c235458cab6eb42546965fb71820d05638ba790600000000001976a9145568fcc163b5589fde89b6772a96d2105a5ef37188ace37b06000000000017a914fafcb55bc93a6dd4da7f2b69fa068bbbfd11bb948703ab060000000000160014f9366cdaea59ae4567123fbeb1d527fcc78e0fae7bbe0600000000001976a914fa0607163d5400e9fd9d2d10987ceab83148ee3388ac48c30600000000001976a914b94d02b5850686d5759e799c78c83f1db7c66bfb88ac69c30600000000001976a914b0474a12b0ae84340df4b3751a321622f8259e8388ac24e70600000000001976a9143b9f9e64bad394b6ddc05db770c35803a8b30fd688ac82f50600000000001976a91475e5cb19fcf4ddc61e50c3c294cd8939ed2f4cf588acc3f50600000000001976a91481b4dec1075c0177ad08599eddcca14e4bbb342688ac63350700000000001976a9143366bd5404973b9956f0f365e670bf043c58333588ac7f650700000000001976a914311e1846f5916505d33171723518ee6916d0b77488ac9e8f0700000000001976a914d45dd71dc63a43c111697e58b4251b18022cc58b88ac84ab07000000000017a9140f6e754b2f64f7a5e2db55d0bc42f668d855aac287f1ce07000000000017a9142580b1e182083f967e6be1bb1c594ad7025c11da8769e70700000000001976a914293c4d5d94423829d7497e8de133fda3806997db88ac7bed0700000000001976a914af8e532ac98dc93fe702f98230d5694f2b3da05488ac310d08000000000016001438efa0a1ce785c54c2f8e13d58e2d5d4e7a56a1868cd0800000000001976a91461dbe287b0a7f41ac38e80b1d11e0afffabdb6ba88ac62ec08000000000017a9144f51fe6a9fee90159130dc61ffa7c3f68b88bcb487b7120900000000001976a914ac871813a78e678361b74b9a5810a0992f93532888ac283109000000000017a914e71f5b38fc147d85ddf3c76c19b5999c9f03650b8775320900000000001976a914c47b3351bc43d33315c693d099b7d1ed69122db688ac286a0900000000001976a914b962ad80b57c8863fec10811291f88f9a056698f88ac277709000000000016001465f9c103569f40c721146c02a24cbd07f2db8efe80a20900000000001976a914eab766de137f0029e5c9a0165cd08963ec6a601e88ac47de0900000000001976a9145204166dc560334e4b3b57a22c7f44cd774f7ee388ac26df0900000000001976a9145a20dd9b08f9a49de6c0dba6a404e6a7bb266d2d88acc9040b00000000001976a914f5262ec36f2ee03f1216010e628cd4b4565d6cba88ac860f0b000000000017a91421d651a4df9abe8052e90508b330f3dedc340e338733750b000000000017a9149de48dab22c4430e184dd6b8374531c2e573c7f2879bc10b00000000001976a9146ebdded8e46e439be4a1c9d7a15c048e1e3dff7788ac68d00b000000000017a914ed136601455da489436b41d36b0afad7d87c70598739f50b000000000017a9141b555a787f7d7cb0c6681ba110242fdbb0f7e48f8798250c000000000017a914271b071f89f6710e3f21f75e30e1e518b2d3c198879fdb0c00000000002200201e34b17de522228be75066e3a49f972e76fd8dd97403a5575121401f516f08d55f250e00000000001976a91459754c30f906fc7ef084ffac78284c544181caa688ac813c0e000000000017a91440cd0b1a65c9ec8fed2b5753545171ca06083ecd87117a0e00000000001976a91449c4663ae62ba546fde0ea44b11154b33c27acc988ac1f0e0f000000000017a91463d02fe1195a37a461206f16d5e9c760f66d569987b41c0f000000000017a9146d61c1b21ed5b332fe4edf7985530adc1bbfe47a87b4630f0000000000160014490cb71ab2ce1353d04c5b7c94280e38e353b8763f650f00000000001976a9147f085ab32de6d9903520142a01d31cb80a90ebf088aca1311100000000002200209b691f0cf11777a090f63456076a73e652eeb26e9fc5c378d31c168d58e7d894e95d1100000000001976a9142da366510fa4e9adbfe15b24a48975d1b4c7472d88ac0ff712000000000017a914aa2ad2efd97be2fc4e6230e19e43ca24c049ad60878a0313000000000017a914df099fa2b3e26d47b06922371f6140b4cc642db2872a081500000000001976a91416d2f21a5bd2f9c5a1c3fb2fb976b9b163935ab988ac45dc1600000000001976a914764c41a29b8603c471119a7825a2bcbc7adf8fab88ac964918000000000017a9141588eebfb3c312126df0e82c07ffeae851949b768705d91900000000001976a914a633b7d27d14e22c53317773c179d55af342b70488acba821a0000000000160014ee5712553d01a2093957f16f670368bd6ad1e98db37b1e0000000000160014d1506c62142bceaf86cb7628c779d8998430f8c396d42400000000001600145a28a4dba3bc533bf01ad3cabf9f943e0edc46d6f3152900000000001976a91486ac1e79d3dff0ec87a9399f83fe324a30bf1c6288ac95ed2900000000001976a9141fc2e16ce0c1ce9de1275e0e533e6287e8d3a9ec88ac23953000000000001976a9145f43fbd265b19f127228926e864e24212a6b2b1b88ac657f310000000000160014bea4bdd2a6d9705652da0f1e66d27b76308955a7e11d3900000000001976a914f9db67527b49c2fc68fba751cca640ca92e0369f88ac45663a000000000017a914a243088489dc49bd7aa227804dbd9d9f05112766871bb13b00000000001976a91402a76cbac539b9e441a4140a60f54e1992eeb49e88ac68ff4900000000001600142cc0c162a6168db904a22efd423b6e67631df6dd6dfa61000000000017a914a92eafffc9a4c180156daaf475dcfef0c946556c8721219600000000001976a914cb65e578f14d6112cdf436ba1fe2925111d4119a88ac05c2ae000000000017a914f31f493f534510b1a7298dd4d13c309faa37a0258727d0ba000000000017a914087fd5432684e7d41a7c3ed0b23e2441a376f8a3874e421001000000001600149f3d5527dcb06c8edc85a02df0a0dcadf6934020024730440220133ef36f21cd86d1d48a53f4e376fcb77babe9575e13930c93df8d8452f1de8002204f0e253a33e3f80b997abe70aaa4c64de5a3956225c9317cfcd076b924951d42012103c7f8938c7434eac38932a3829a08291474bdc6b98469beb27c60f9af503de3ee43a00a0002000000000102ac084a2db8ad32f6c7bc18bcfe59f743059a15a74fcd80b42e73c9d0747561b5880b000000fdffffffb775f79af732ffb6bcb399dc2d5bab2bb32acb6f2d47c6b9b2dbe878eea8dbef0300000000fdfffffffd640bf1030000000000001976a914ff5addecd2dcdc7a33b6ea0926a6d555947376e288ac0504000000000000160014d54f15e2c6d03cfb2be8febc27e779edda1ad85208040000000000001976a914611240795819ee7b5f18f650aea2d484347b6afa88ac2a0400000000000017a91407c04e7f48892b468e694a0bc1533bc5938f1232878d040000000000001976a9140022c3e274c9d57b9536f1164b7ee48408d0eac488acb9040000000000001600140de4b2227c33815f22d36786549f15532ebc3b61f6040000000000001976a9148ee231ebb1ce581d5a8cf52df47c5e93869ca0c988ac14050000000000001976a91486b79b7b041c28e4b85c18c680ec5c0790e8e59f88ac20050000000000001976a914551e15ae9efa4c4b89d46c18877303b08d10da4388ac3a05000000000000160014414b2c49c29d7fc3ae2d86ead5c54b22c8eae05a4e050000000000001976a9144471418f08d6056d6f66d3d043b6bc252a436a9d88acfa0500000000000017a9147a0c18eb0c4682664f74a50ee6caee5de5e8f1e387060600000000000017a91443eb7dac51ad53e3174e38b46a704f310f5ec390876b060000000000001976a9143b95997d8e08c9e015b79f32bf315e36d992552e88acbd06000000000000160014eb738395db31726ea9b82a4a0a2f7b19fee1fb0202070000000000001976a91454308a0c33ccf01a93a6ef49c1b069392e172c1988ac04070000000000001976a914fe6330003120f90c9b7fe03ca1d043b4d7f2330f88ac530700000000000017a914fc8241c2e9596a711972b03d4b1106a66091face87bf0700000000000017a914f537729c9eca254d2e3d474bb3ca4ae8d98a08b387cd070000000000001976a91451fb9a8b012e5499bbc25dac51344378e031cb7788acdc070000000000001976a9141182185dee4ed42e1cbfc937f796497071ef10cd88ac330800000000000016001486de3f6a32b45a96ccbd17ea8673e1ecd92e661a59080000000000001976a91449db76113889daa24fc8041f0b0dc329f9ceacda88acd00800000000000017a9149b856aca435b8abf478dfbaf6aea31f66fec29ad87950a00000000000017a9142103653a155aa38141501616732d7b33a35a3169879c0a00000000000016001495f1341194d25068cc6e5db84f4b59e7642ff4a52f0b00000000000017a91464c3ceb127f9057e0f03b912eabcc5c876ca757e878d0b00000000000016001430171732b3beaa10793fc09e9e96438f45cb1b5a960b0000000000001976a9148626e0011571052cf1221fd596f1f587a37330d088aca30b0000000000001976a91493922495fc36bdd646af62b7819aeea5ae6a9df288aca70b00000000000017a91405bf2cad8a08447e337b4718a8106525b0fce9e487ce0b00000000000017a9146d9d85aefcb74c6e65b06e7e7b88b922e657f088870b0c0000000000001976a914848933097ef676ec47a53d625c24e3d4b0a1a0c188ac790c00000000000017a914bb1c174192e9bfa62111ea69ef3273b8d5ac7ead878d0c0000000000001976a9145af87dba10a94f9e170c9e0916554293be8e2a3888acec0c0000000000001976a9140072ade014500bdb2c5340eb1395e46a234361c788ac060d0000000000001976a914fd8a7b9548da0fd6e8e9c3742fb8433e0f54814588ac470d0000000000001976a91467e20bc87c6a0f0e01536c2e71fca918ce44273e88acbd0d0000000000001976a9143da2de9bf82762d60be65d6b4817829efd40717e88ac400e0000000000001976a9146cf97973ef1ea6e6b261fdaf05eff7c3719589ed88ac750e0000000000001976a9144498121ea3b3aaa4b5d5d478816e919d040b9c9f88ac760e0000000000001976a91458101249648c1ddd114e809e98276ab2ab57072b88ac780e0000000000001976a914a502eeb18f9938e53d2d6be8f17290f3be7020c188ac810e0000000000001976a91423c39c0de553a1097a44009ee071b957ff938b6888acd10e0000000000001976a91451f56ec3cb6c499900f9711e3c087089a4e60bb588ac070f0000000000001976a9147ebcad1de54baa4ceb2ac048858e5323baba844e88ac13100000000000001976a91479097ab1a373c117f04e7a871133f6d025281f1a88ac4d100000000000001976a914d34868f2574b39788ee2cf4e3721adef717cf9e388acb6100000000000001976a9148c3203bf42c3b1cbe6c87afe25339e2daf48cc3888acb41100000000000017a9148af67aa14d2dc84a0c7949a272ebfc71f1bb443287cb1100000000000017a91461212bede2ce70e78cb7c4ab2501f48981e2bdd88722120000000000001976a9149f30543da32293c6b90fdb377491fbb6b1af37b088ac6c120000000000001976a91493157288cd0a1e0491ff6c072d9b3a28507f535c88acfe120000000000001976a914e602e88c81bf57ce35e98739d408791ebb58d4e688ac561300000000000016001400e098ab5a4e2e8cbbb9d8fdcf5580143e911678a81300000000000017a9147ba75825ae540ef9246f02f9b4c6940c917e035287dd130000000000001976a91416a13bd5145ef4b233f27ca8c595ce96b12f2a1a88ac6c140000000000001976a9140b46556e9991ed61f87185ca2996094bdae5c24688acc1140000000000001976a914615554745c2813f2d781b4224428e88a671e2f5888ac31150000000000001976a914d36dd7c32836de74f67c9849f51be513b70b348a88ac6c1500000000000016001449515efd5903b1e547804936d0c322cd8a6fe575ff1500000000000017a9141b2af35842395cb74d5fe6f0ee8ff8d3abe6e51a87731600000000000017a914bc4bb6fea0a619ec3e3c1217a298c142538d049e87e81600000000000017a914f6afaf37b0a4aa7c7da783cf5dff48e1ed10c0418710170000000000001976a9149dd06dd37b7db83e052935d3b548d6733094231c88ac421700000000000017a9147c471669d2de0acc878592133e2504ed7d2ca0188752170000000000001976a9145ef6998ed318b939ef8f6c79a55911243eafb4cb88ac12180000000000001976a9142f6a570a8253162b05fd3046e38de08e29a5604888ac2e180000000000001976a9149fdac9e45d51d62963f79e212589d12b8e26036088ace9180000000000001976a914f13ce3a1e3e29fa5e302a097c14a827755ef255288ac5f190000000000001976a9148493a390460f3eb3ca68788d2d8636c9de2c1b8988aca2190000000000001976a914ee48ffc05827a2d01c7d20e094f23e48db90137d88acfd190000000000001976a91473831afed5f047f89e7939461a89014944b4e02c88ac231a0000000000001976a91457c2cd67fc876b246efb4122bc0f593a6ceff2f288ac3b1a0000000000001976a914a36470b065aa42e066eb84fa35b58017ced5daee88ac711a0000000000001976a91498742ba51a99a8f7146a87e02a7c4e97c628c29a88ac751a0000000000001600141c8e89107e850e8fb129e98494d52a78d3b041f3e71a0000000000001976a914442f13fd0f9d97e894cafa384351f128f12188d588ac031b0000000000001976a914bf3f58bf7e7c7e2f0c66fe518cfd3ec913306fda88ac0d1b0000000000001976a91413d2b3974a11bfa0d916baab24f37b4aa95d0c1588ac0e1b0000000000001976a914d89bf9913b6e391d843b24c5b3ea62ceee3279d888ac291b0000000000001976a9142f84492976eb571a74c4a37451236a09976dd83f88ac441b0000000000001976a9148ca449f2ec396b9c7c4473b5fca9badcb3aaf12e88ac661b0000000000001976a914f24acf9e3d12a9a560272d21cb046c6a4d321b7288ac781b0000000000001976a9144b5c9c63270070a9fd945fdd4140f235abfa2fcb88acd51b00000000000016001403a751dddb89cdfd5ddfa64462c01dc0cc760cc1ec1b00000000000017a91433bd261ba6780c136154db06bfbbe22bdf5579ac87481c0000000000001976a914f4e6aea32957ba902a86183109aa19797cbebd2f88ac521c0000000000001976a914e339d301964b02bc5fcc9ed0dcea51b1bba3fbb488ac881c0000000000001976a914735f87e29f59af0f63dc813e59e29f8e4a5f10e088ac271d0000000000001976a914ea8de5df038ab6031bdf191193d9cf92c969008288ac4f1d0000000000001976a914652e2c43cebbd6389e02b1ce001842d03c32411d88ac501d00000000000017a9140832a8d1cd050a367b4639b6910f82bc82f825b287631d00000000000017a9148ba149dbd9c4698919e690964c9736b78413a54587b31d0000000000001976a914a1088423ac6c1e0f07bf2a92cb4839649dc38e3c88ac101e00000000000017a9142f316bbdc56d8ad225f5cab53db5dbf965a7d08b871c1e0000000000001976a9146f6ad84b9064f4ea8447bf91323cff9c3030bc8588ac301e00000000000017a9144a48c3bea72a656f2586e6479482c51cb42ad29887321e00000000000017a914a0ce8433e60e3fd90be75b31ce91d9ce0cb3f258874b1e0000000000001976a91402bd2adb41f359d3a82fc5f40661c458db2dd76d88acdf1e0000000000001976a914cfc02753507f45da244b3fdccb13f098ff3c8d6688acf21e00000000000017a914cd7d558f6248fa8cc273d8fc8a4bde1603ba12aa87091f00000000000017a914cce4f70078826083265f3f8afa0730c637c6e1fe87201f0000000000001976a9145f5e3068e5f9c3f3dbe58977c1edfee83bdcf67e88ac811f00000000000017a9140bce0626b374e59bf92c70824e19a9976443d827879a1f0000000000001976a914af9d8de3d6cce9968ff017540312ddea93a2e62288ac9c1f00000000000017a914f7d99bc2eeb5ec6adaa2415f6fb44756d31e955187de1f0000000000001976a9144efedddf0662bbd99a21b89c28b881630b79338b88acec1f0000000000001976a91456c492e9a67f225c7416faf5b8fe47e621ae20fb88ac10200000000000001976a914a1377d4414f280c1f4bd8791f8173feeaa0bda2888ac15200000000000001976a91417834bc83cc237420fc23fddc46703b8753e18c988ac2c200000000000001976a914436e97ce6b7abd39079327370632e525310ae8ac88ac44200000000000001976a914f7b30d35ff62ce08a3701219e46ace704732bf2188ac4d2000000000000017a914036e5cfe9101427be5ed0024d4b1b98b730e0e7487552000000000000017a9148be5dd073bd9860c427752911186edb0376d3c568771200000000000001976a914d93d44ce9186f892fff1dbac74fe93036642d6f888ac95200000000000001976a91455a34face86c4e989462ae4465794efa1252cef388acb2200000000000001976a914c45c9a69d0fadfb1a329c4fdbd25db1735f5372288acb52000000000000017a91430083d92aca5b18e8592d99e483d6e7c6e73ba5687da20000000000000160014ea24a16a3054ab4bab6aff8c45f90f120bf2e59021210000000000001976a914b24e2ba59af9d85e2d81b1b32bc3dfc127083dbd88ac26210000000000001976a91493123b940cf3c86b00ce45514f4bde5f0920c45c88ac6a210000000000001976a914db6f6e5950e34a04e5726f2d20ad930c0223fdf288ac2f220000000000001976a914933fb6fdde163b254fd2c147727f7e05aaec594c88ac622200000000000017a9144699947879044f95b04a934c99ea4a73320455ab87af220000000000001976a91489b1da2f9d0de819cadf2c60cbb53ec15192063288acd9220000000000001976a914ecbf4cfd087d30f6b104f1b3f408e5b3d6d218ec88ac06230000000000001976a914b8b7f3d85355c2e99eccc05d7416c15cd00b4c0c88ac6b230000000000001976a914f17dcfe4a6198c233363f6f0192cbccfd3b19f5f88acac230000000000001976a9144b2a8b410faf41884d50ca4bae87defdb55f0ece88acd2230000000000001976a914f4c8ad650d95e4b5be40aeb022b677b4a1c90e8688ac14240000000000001976a9148131904a3412c721d70a5b0c231afa833be7a46b88ac1c2400000000000017a914ab5de341e2fafffa023bfc025b51ec8055362f3c876f2400000000000017a914484b6b714be6209a1f578f5e20d6b3c5f26d3cad8770240000000000001976a91452cf04ab90cfe3ad540e8ffd85c0dcb57c1cb72f88acc1240000000000001976a91461c04525b548532efff6544cc799ba18b97c127f88acc22400000000000016001469b210f005e3c6097bf36b4e2429b21b4b79751dc9240000000000001976a914f59b73b36a78cd082df2fbf740fff9fbbd87a2e588ac03250000000000001976a914105701830682ba242023cbb63b88730b5494da4688ac7a250000000000001976a914c8f9d44f42af971b3cd184e84b15a8bc26cc6c4988ace7250000000000001976a914d2d92b27f521cd3569d4f90d445da572b7cb3d2e88ac0a2600000000000017a914eb5766f80ef5fd9e4209b1db9d24e9ce85398651870d26000000000000160014df0085520d05e336f5d6bac8c4236e8b12729e6013260000000000001976a914173d9c4b58a15f52541dc6fa2bb93ea5b4bff1ff88ac15260000000000001976a9147c868d44940749cf6adb5f3620c0d5e85a108d3588ac77260000000000001976a9144c635e0997727725d1056ab724b7ed82cd50798a88ac772600000000000017a91481c7984a58f671b218b065610b5dcb5d6cec359e877a260000000000001976a914c76891968d6496fbb12325baa55e47e6950739a588acb1260000000000001976a91451dced991f6beb1e2e9da707f3e729a902f8a36188ace92600000000000017a91465180a6bb860935d8a97c506c28ace9b34e6d3f087062700000000000017a914cdcb2d3cf9389dace1fbf35258ac395a95ca86048755270000000000001976a91485e437c40022f76791d6500a47fd38bcc07ea4a988ac71270000000000001976a9149055930e92ea4dba485850583abfad970ae6cb7588ac732700000000000017a9147e5a3aba141e863a39075ff559e4c2e799d0fafd8785280000000000001976a914ccd8c3a3b88264a4525e07bf4b21d78287f27f3588ac952800000000000017a914aaadb4ceb0eb739d7cc30174f2bcd7c670a7595187a12800000000000017a91467a16e9c2b5a68e81de9ee1534cefde613e866b687c7280000000000001976a91453556d82344cfa1363eb837c882ce4cada61c07588accf280000000000001976a914e34b4534e68389b471c0b58f422dec9fe01b1b9788acd1280000000000001976a91489b06d4a8aa7fe728f58d26e224d0292096f16f488ac78290000000000001976a914b81fcdbf72321b7a9c2ff5253defbcde2bfab81a88ac84290000000000001976a914fde0ca36260b41b717788d4956de56d91310c51a88ac9f290000000000001976a914beebfbcc97dd855c6e0c7f6adc3e5bf9a61ac61f88acb8290000000000001976a914e4f3e28591d7422b13d5c5e3ebc417670f76175e88acbb2900000000000017a91442563fe5a61450db6c1ff9b19ba4820823b2baba87cf290000000000001976a9146d0b7017ee6db5401097a080a58f9fd71825398188acd42900000000000016001474900160c1fefceac16c09930dbc9d0d1b04d9c7dd290000000000001976a9140884a3504f523bde6d27cf14372cd83accd4e5cb88ace729000000000000160014857f4f23ed9097065cb4b81a68e9eac1b54f0f92f82900000000000017a91425cf1fff3a9b88d824dcefb873390419fbed839087002a000000000000160014a6b4fb4f9d9f6822a12d6eebdbf8bd0c0409701f032a0000000000001976a91416a13bd5145ef4b233f27ca8c595ce96b12f2a1a88ac0b2a000000000000160014f9e9fc66c843d8165175c037cb819a6a15196f051d2a00000000000017a914c0db114d77fea5cf0efed8020a535ea610939775872d2a0000000000001976a91498ff1759ff3de9072dc9580021620f89318c6fbe88ac6d2a0000000000001976a914c9c5ba908ee7e533532382a5cfcda4ec678679ee88ac7b2a0000000000001976a9146105ae8c545a6ad2ae0d1895379eba1566ca909188ac872a0000000000001976a914fa8b279cdbad6c4c4164e56b07e306ec15f6e13988aca62a00000000000017a91463f415883f61129f5045b2b36f2d7d22f425a6bf87bd2a0000000000001976a91426b3e9a5b535e7a65b1aec50b205a237a80af2f488acc82a0000000000001976a9141570bf4a66be558f6f229153810060528248d89e88acd02a00000000000017a9140eb7043b071ac455990a2df438c76684b97852b787e12a0000000000001600141983afd7150249438a00e88f6f99a720bcfd20a0e42a0000000000001976a914d1502c24da60c2909e31dd30a896a8cb0ace06a388ac102b0000000000001976a91403d46b937c9362f43b6454fa02783b93c55c50c888aca62b0000000000001600143684e048230cfad681c766ff13a8533d46aafa88d22b0000000000001976a91464f9710ed9cc8d80ec1d6ab517b7b30f54ba2dca88ace32b0000000000001976a9149657fb15f83f22440d7f31673a85ec6076062c9888ac0d2c00000000000017a9149e6eb3e34b26619c4aa1518204df726c12b6f0e9870f2c0000000000001976a914388bd491ff8b6fbf6353f3046cbb0322c190de7c88ac652c0000000000001976a914d93efab8264bb57c21ef5a088edc722e26fceee388ac6f2c0000000000001976a91400e3a857b88698779a2c5f8b358eedefe9a447eb88ac7d2c0000000000001976a91439ff542c3a5ea885c5ca49d11080fc66d354bac188ac992c0000000000001976a91442d84d1b3cf5556a082fee1b2b49574f4765f51988ac9c2c00000000000017a9144a022517efdfa1b5e817b66efc3e09180209930d87a72c0000000000001976a91455ddcec6bea8909e39f414f52b7f21fc632c20f088ac112d0000000000001976a9141e8f81d57ca50968787e06dd2d3cb15f519b0b2a88ac272d0000000000001976a914cbd256f0606e5619805cd5660d25ead675145f7c88ac3d2d0000000000001976a9148ff8719cf47d13dd833acb3ae469f0ad95062ab088ac482d0000000000001976a91482fcbad80961d335b544414601665894b2a76c7c88ac522d0000000000001976a9140df6390ecfea5f8b0bc2f795ec37a6d0de410c0488ac5e2d000000000000160014f2aea5838484ae552ea69fbad7a8b4c4547bb3ce792d00000000000017a914de5a64855104c7d13c68b51f2b8ac86acf94678787a32d00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87a92d0000000000001976a914e92acf40ab239bbe9cf563bc7dc1475f0f231da888acaa2d00000000000017a914c36bac2059ca96ac1b5fbe3e1b3e3a7693b67bf587b32d0000000000001976a91410fcfb737ef76959aea93ee9a5f6905a86d7bbf788acfa2d0000000000001976a9147cc7ce483385821a86445d4befa2487c947f429088ac122e00000000000017a9140e76ab4edb9958d9d57808536b9406dc3935652687142e00000000000017a914aba1f31340c6911b86073ac904d35bceef55d9af871a2e0000000000001976a9144cfe5db1055a9e9c202de4fe6a25a8b71b0ebb9b88ac1f2e0000000000001976a914a5d9e801ff53661ea3497bc18691442143df864c88ac202e0000000000001976a9142ad4a5ee681010a6042dd36fd388806a3e14bb3588ac202e0000000000001976a9149d7b4f320e2e964af476f806fd426ad0ca1d636a88ac472e00000000000017a9140c3ff053f88ef412fcb4e1707063515a33a56965875b2e0000000000001976a9145a81cc59ac2439fcd5ca75b72358452be3fbf6eb88ac5f2e00000000000017a914f6e1bfcc264a4e3369473d5ff9a7a858cb6899a187742e00000000000017a9147a86fe2234ee9623804783f0dd0bb9ce09e7189987892e00000000000017a9147778de20e942f257317ab216b7455ddf4adb2da3879a2e0000000000001976a914d09bec2f3da99580fa36b49eb61934b600530af888acc02e00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d870a2f0000000000001976a91468ab3a8092ebc62bc7955f357cfc195bdc1836eb88ac2b2f00000000000016001481ef07f388948693682e70f3d9c6a8a417d4ee292b2f0000000000001976a91432203e6b169afd81dbe37cbf2713ada7e674b35488ac2b2f0000000000001976a9144725f45b88a37d069e805773552a955e247f454e88ac2b2f0000000000001976a914ce11bc6353e6752f2eff068f541996cd1e841dbf88ac2b2f00000000000017a9140d828e9b555b3f958c064e6e3e12fdb5cff05845872b2f00000000000017a9140d828e9b555b3f958c064e6e3e12fdb5cff05845872b2f00000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63872b2f00000000000017a9143525f1b8b4476a4fd51b764687afd4942ed1d62e872b2f00000000000017a91450acbe488410164b8602335ed8ffbbdb92c8c717872b2f00000000000017a91464137b86c173e3cf43965d6b14fa2c448e17d739872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9149500925faad39c792031811609ef90fdc7ecb19587312f000000000000160014f394109e6131d1e94844aff5a1208330984c20e1392f0000000000001976a914a5255bbe37362a7d6cc6687b8a4fadba1e6e538688ac712f0000000000001976a914f9810ea97675dfd6f4ff215110caa776f706f63c88acc02f000000000000160014a6b0a6fdca452e72f6c9de7c1aa0380ff7e5a822f22f0000000000001976a914a046e31b5198030b52e75126d2491204046a186f88ac3a300000000000001976a914245d554c5ca8653dd04a687f98dda5f8ba517e2188ac463000000000000017a914941de6b4a7698af3e62c2e895459e985673073f38747300000000000001976a9141065004bffa3a85549fa0cb65e2e2286f0d34da288ac483000000000000017a9141d7003a7f8fa53215cfa3232ae03f873994d79bb8782300000000000001976a9143a3a498d3379bcdaec13ddf79ed0d01bf65f458a88acb530000000000000160014a754d186fe20a9e09c3da49376328e3976114144d1300000000000001976a914d7efb11de745be0ae84e35b6f2e39e63f664a10388acd1300000000000001976a914fbce2cecd4a2688124fac650255be9e59af2b81f88acf03000000000000017a9144463b0eaa399885edcb95e519b70fad0123b2c2087373100000000000017a9145ca9ee62ba287a7e17ca73bbe06f326feadaa1038758310000000000001976a914f0ea942d86453475aa155fa88daafced373158f488ac7e310000000000001976a914b0454fec336c521f6bf1c7d059d316aa1bcfdeea88acd2310000000000001976a914991d9e52b0f54d0c5676105d762d5721fe8e9adc88ac52320000000000001976a9144b4a07ee9019a5d33328c87850a9194b6eef710588ac6a320000000000001976a91475d683fa3b728aeeebc86dd0ef31b9756b379fc988ac6d320000000000001976a914d422a63a660457ae6f3f219b642d4ba16709b4ef88ac793200000000000017a914394cb09d7c1db9b753698a02d64175495ef9845e87a53200000000000016001479157a1511b90a6d9d8979fd5c69ed76a40887a5f83200000000000017a91414760f04aaad127cfe9e6eecc14c37dfa8e32c0c8722330000000000001976a914bad60c5f60b22e67cc96b7f0808db8b2e12574c788ac263300000000000017a914a7439e5405b885d5f6308ab720411901719f7bd8873c330000000000001976a9142b62f45fea89e7811db1b46027913d57070c2b7988ac50330000000000001976a914616cdc1bc3398cc50ff3371f9b80dc7d6ee66e2788ac77330000000000001976a91432d55192facfdd59770886239d554abede21bc7388ac893300000000000017a91417f9a77c4f30e584c00e66e6af41ff2564af11688795330000000000001976a914b4e192efe57f0f46decc8af3202c896dd670eff188aced3300000000000017a914cd1969d8da08c1f6af01f47b693cee8ca6bf53d7873c340000000000001976a914e9f2cfff24315dd68997fba64288db8f9ad6104488ac68340000000000001976a914d404156fe24c8ac84b6976a0719533e35af4d70088ac7a340000000000001976a914d201b2988c6011dce5ed874dce334ad3ec1cdece88acd8340000000000001976a914fa92ef18e9567f8715e8c74ef0c1f4c48857c67888ac403500000000000017a9144773b1cda72b1df5af90e8d88a37bfc2dab57161874b350000000000001976a9149adffd6979690486fc206660f32a5ebd047cf23488ac543500000000000017a914d35ae78bd1f4bb8fc9a47264e106f8af2156150e8768350000000000001976a914f26ee18eb519d0d5daa977aa9f433819510017e988ac7e350000000000001976a9148ca73aba60341fbf6d437fa19a2137b76105742f88acec350000000000001976a91405fe39d6adc21c77a8cfbedd33244fc3072412ac88acfa3500000000000017a9141a33b9b3359a6398fa87e37c2b86fe5bec0e8caa87003600000000000017a914cd35dbb543d1bcf1acd3eb81d2407a4691fb0e06877a360000000000001976a914e6bb3ae380df63cc947034d9be05747099de9b7d88ac8d3600000000000017a914e23f796551e1de1dfbe5e39bca0aa1e716509977879d36000000000000160014763421cc18ef451fcf126927cb639cdfeea7438cd23600000000000017a91443c32a5387bd3a04e072fbc8ff70698a6ef2552387db3600000000000017a914a166b19df1ee8985c61d38eabcdd53dee54ecd2d870b370000000000001976a9143e83d26f4922b520a5197899d8429649ab22284188ac3d3700000000000017a9143bfa5978914deedeac02078140a21694cc7d99d88741370000000000001976a914220129011185c7650e82f588296c951bf212f3b988ac7d3700000000000017a91414d654e131f35c4062f0c18dc0a9d0b3b8a5e38687e2370000000000001976a914be0632e4b596bea35cc8b96b1ac314d4ba56f9e588ac3e380000000000001976a91489d6554c5dd1e98ca5b6d214b9e23ff262c661ba88ac733800000000000017a914a686ed77c558c67437cc6babb32b2cd594219cbc8789380000000000001976a914612fb63de7f9bd6b6da3a9b760ab700b7c1ea16588acaa3800000000000017a914e95d373e2822b28bdf5fe7effcccd2e1d8d0048787c738000000000000160014f7eb5dc81d1de4ffd9588f83cc16845b02d759ccd2380000000000001976a914bb7405a375e78c3bc349f56c23f240ba3d885fa088acdf380000000000001976a9148cc50035e333aad22159b70729694b73719c2a8388ac123900000000000017a91472ad31e66d2f94d36140e02bb6ab7ce2cef579018734390000000000001976a914de67f761b0e03a7c6fcdf5475abbe78e4f817c0188ac42390000000000001976a914f499691d68314a95fa6597f1366748ed149afbea88ac953900000000000017a9149a42baac5ef52feb3457b44ed493da5b672f455087ee390000000000001976a914f2b7d66ebcf19d9e67b672f530d2a45fa66db42d88ac063a0000000000001976a914cdfa5e35b6ad8a8a6a46b7d3eb5056383236192988ac183a0000000000001976a9141862985ce4fb68bcdc24cc125620bbedc096bffe88ac243a0000000000001976a9146c604c3174105f26c6243e5f925355afe146a9db88ac8b3a0000000000001976a91401d6691ee52cb40ff70090b303955bda5c353f2888ac0d3b00000000000017a9141cf28498044064edec3a6ebd60a9d79307f5fc71872e3b0000000000001976a914923a0313070fbaf89cb350cab5eba6fe56e56ce288ac3f3b0000000000001976a9149ba9b6f8623cd19a845a686207185dbfa02c914b88ac4b3b0000000000001976a9142a2668d50fb16cced5d7e1d83d1eb5ff8eb764f288ac6f3b0000000000001976a914a378a438c67a57c67d2d7ae0cae2433057c4cfcc88ac723b0000000000001976a914f914325052601e6e0c7889bf69bbe5e902917fac88ac793b0000000000001600143b342fafa887d28173f713485840f6fbd4831156e33b0000000000001976a914397d406491465f0fdf9322e4d593e666a65fce6788acf33b00000000000017a914583df007e677749deee3657148901ac8b5fda7e487313c00000000000017a91435292dcf923a135cbc5d72f4a01c6a9f7faff6fc877d3c0000000000001976a91434b57d65a303bbe7a96f1d7a3ebd041c3de3284188ac9b3c0000000000001600147e2ac498ac3589b82161c22b5bb72e09cc899117c83c0000000000001976a91462d8c7910c70d511d042380a3a141b4f9bd1176288acda3c00000000000017a9145233b54eaa558cce434e9133689a3e3e71ec907787f93c00000000000016001447aa499d3d6b2ac1141ab290d8fe0ba3b6080f491c3d000000000000160014a89da59ab36834ca760cbaf88727b6c9acb5471b453d0000000000001976a914409dedf9aaaf57ecf66968e2738eebf94587621f88ac5f3d0000000000001976a914aadbcb0ef8b3cd8d40a24fce7d331b136d98559888ac603d0000000000001976a914d250acf0f61e8db213ae4469a993c01f972062dd88ac753d00000000000017a914803b1b270e595be74b91b951f593e03f0682ba1787763d00000000000017a914891c487ee00e65809a3816f4e34a67f83781ae7687813d00000000000017a914c83e08519ca9c9a31c455c32f215fafe907d4f9687c13d0000000000001976a9149541595740ddb3691ee7d2d46794f67d2870d7ac88acdd3d00000000000016001443f070e38a519fab053b30556ac09283ff4c1221df3d0000000000001976a9149d996e43e36ca6cf6f87a071c9bbd0fc4fa0a11888aced3d0000000000001976a9145fb80ea6f940f822b150c0d8ef58cf0aeecede3a88acff3d0000000000001976a91464221e485c9cb480735c5eb4491310630538a79288ac1d3e0000000000001976a914c771b9920c47612e44caa7234f4ac47da621caa388ac3a3e00000000000017a91445a2b3fd0477aa882b4caed9ba93d986680d0cd887553e0000000000001976a914e36561c9363ef03777672cfbdb2258e27f37bf6888ac683e00000000000017a914cdf07b4f1a7f48942b70ad490d6e2ca91053660287823e0000000000001976a91472cac3f4050534829862d77e760a74eca76cdfc388ace53e0000000000001976a9149b6438995fe15c925eb45f3c534e4979ae7d4eb588ace53e0000000000001976a914bc801b53ab73f1630fc1806b4e7cbd6865e8944e88ace53e0000000000001976a914bc801b53ab73f1630fc1806b4e7cbd6865e8944e88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e00000000000017a9140aaa81f9456191ce5f381257938bab98d1c6ef8f87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a9146a27cb640902159237797df66c01de82227a94b887e53e00000000000017a914a2b8605b9ba4f79cac8b9a139a531b5d359129d287e83e0000000000001976a9140f95f4a9c95cc4915450bfe7d37a1072909a2e5888ac173f0000000000001976a9141c3f418b19b547776ea6a4ed47c95416038ef48988ac1d3f0000000000001600141fa22cc0aef5907245992a80a2fd9611b559d4e64a3f0000000000001976a914fe5ba3581c22a2b566e429d580c1ff5c62cacae088ac883f00000000000017a9146bf46f151cc4351ba4be378ef4212a002098add487e23f0000000000001976a9147d1c07df253272ed0435e466276a6e8a93ebf5ee88ac1c400000000000001976a914bc8e6fdcbb0ee4a195e84f4979abb5c7f54a85d788ac2440000000000000160014f29c779c6a1cb8a7a652513b151666cdd739266d37400000000000001976a9141fc65fdc66e536c51fabdb3a61f5efe41b0984f888ac3e400000000000001976a91461c58844f0c8fc7daa563ddc82035f1a54a6f9ea88ac4c4000000000000017a9149a3dcf9d9bc1e6f303c5eaa19da82370ef0a61518751400000000000001976a9147776e798aade9ab083beb436ed9dcda59fe6fd6688ac6a4000000000000017a914d1979aeec8b40e674c34dea3b5f7e52dd28f31c0876e4000000000000017a914876f0097fbd309dd5ccbf9ffa80fa40780a3d3d9878f4000000000000017a9143b1db5dde963fbe001c2eb5222f4cd5c22fd20e58799400000000000001976a914703733043743dcf3759ed43f2822d52b26dcacff88acbc400000000000001976a914d4a0ea27c04a41f77fd280b7cbf9eefce7413e7588ace84000000000000017a9147c2ba9e7e42f3773b0198718349ec3558b58f45d8715410000000000001600148ed300a8c251f79293a86f78a1b6fba8da20820d4b410000000000001976a914d1ee579d270e19c6791ce654b2cb593d659039d388ac73410000000000001976a9140077f5aefb760d77893c6e3ee78360c4044587e288ac77410000000000001976a9140e94e6a52aa0eb915ab712234b3345342257556188acae41000000000000160014a011fc62a76016bf6c69910460066f12b62af3ceb541000000000000160014de3146a7b64f430145d310b9abeb92316d6b3dbf03420000000000001976a914464934c830dcabf4e0e0dec09a387ff99ffa71a988ac06420000000000001976a9143268dab7e762a3f04bf40edb6bdacd8b9a6c3ec188ac0e420000000000001600147ea617355b31d8241496f10815db951b9ef172da204200000000000017a9143c506432fe3c3c5c78a3e33fe796b0e80406a49c874c4200000000000017a91419d32b0ef79aefb593f7878fd2f20139b43116ac87504200000000000017a91411e7dc07b06901f1135e6ff22d7245210fb847ad8757420000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688ac68420000000000001976a914b85aac1ddc710869891e035579181ed9506b8b1a88ac734200000000000017a914f8e14f7be07d91b02561d3b856c62a1c90242e06877f420000000000001976a91422f3a6ca004785cc6a356afaa508f4241dd027c888ac85420000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688ac9e4200000000000017a9141d38ada4c6c7b6f22eb37b32ee1275576471df7887b04200000000000017a914cfa529e5cd00c69589c9db73e7764f64695c76e287d5420000000000001976a91490e9a296d910d8ce31048bf6205bd4aacc59c98488acec4200000000000017a9143dd71e8b4ed322824a9df35b769e8d26547b7e00870f430000000000001976a9144105b139c2f1806dad2b5f521c6c0e3a95de7fb488ac1c43000000000000160014a4aedbf4ebb157f2fd31e6625ec89710e9e6e9a63d430000000000001976a9146c6ce4d60610e29991c4d5cf1a9c6b2027fa420788ac3f4300000000000017a9147b096001307f55ca0301ec3fbd67017312a52c59874c430000000000001976a914420e75f58c6d5e73aeb82026f20822a58776d1d188ac51430000000000001976a9143480408870114fcec51461cffa23346ccae70f4088ac6c430000000000001976a914060cf9b0868c290a075b4818d3cc19e825bbeb5b88ac6e430000000000001976a91425a2bfb12502c1859a314c32976cf9c0a777ee3a88acb0430000000000001976a9148c570947aa7ea50723c1f7847f6f9acd0aaa348188acb6430000000000001976a91444a7b7f671095433b412e4b1dd4d5b68a58b6e1788acce430000000000001976a914daf97bb64fa400040303ccfd01907070b04c98ac88acfb430000000000001976a914de22a2567b38d468eabd30d1fe6cbad85bad859b88acff43000000000000160014d978ee9271cc3a6b814d32f5c81d2834448c3a64594400000000000017a91466e931d9c3ca0ffdd21fdbdacdd8607eff81a1998764440000000000001976a91486b79b7b041c28e4b85c18c680ec5c0790e8e59f88ac98440000000000001976a914f9211038993d4d48db96e628030cacb53859293288acd2440000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688acd3440000000000001976a9144eaa55e15451b1ca5cde84faa72eb0ec34447c1288ac83450000000000001976a9147f647e1a2f621a05e8fec6645f2cc564c366170888ac19460000000000001976a914ed17c78f214f275ac307982243308eee48e329c888ac43460000000000001976a91422692a07fb98e32b568d4271361b6cf60edb32d588ac43460000000000001976a914e42e078f0a1ed246e26f3f49dbdc038272f5100a88ac48460000000000001976a9141532152d7566d5f57fc45d6ccfc3855a1e45ace988ac804600000000000017a914e7067fb544e78d827920dedc501f255ccd248ddc8783460000000000001976a9149176fbf003d4b7a7c9f643f659af9781d871acfd88ac864600000000000017a9147d1fa1b1a948191861418fa9f5c828443c47f5fd87a3460000000000001976a914202950b826e22035e1b02e265cb082e40b0ee12688acd34600000000000017a9148cc2259d4e2ab9e4034e60dc68af630506ac0e2087d6460000000000001976a914b376377f5c5a810e001c3d1f4ab8dd3eb262028188acef460000000000001976a91442f5d3eed615ae4de3fa7274ac3d997e5caecff388ac07470000000000001976a914334e32dcd3ba2387c383bbdadf90edf0d75895e088ac154700000000000017a914f7d9c1a6ec244bca8f20ffdcf8a119916e0ee9cf87df470000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688ace24700000000000017a914bedcec95f0658c5669cd6bbba16d853136a1cbbc87f4470000000000001976a9141275ddd7d23f1286dfa635470a40a7166ea744aa88ac184800000000000017a914cf7b1b4aaf6c56c809df110f28b35ef8326aa767873b480000000000001976a914f5a14e7731829d8c11991c987f9ca4b2eb8c9c1e88ac6c480000000000001976a9142d9840ea9e1707ccc9bac8bf33f10f7de38c102b88ac75480000000000001976a914384254137068aea8dc5c62bdd2f7baffa57a64df88acb34800000000000017a91459f2f6ad86704d3207be72995e9b8e1f7e2e22ce87e34800000000000017a9142bc6864de8a41294b2c712fe78dd7659ac2735e8870549000000000000160014a92fb26f7ba598f4a6c5d1420837297b6b3d66422a490000000000001976a914b627c8e4defe2a7e574728e514300e90cd3eb16688ac474900000000000017a914b36cd93815f439f06e9cc86d1d14565b35c53744874c490000000000001976a9149c48226acdef348cebd96d9d90a799c551d1c3e288ac56490000000000001976a914e74721a600ad5dadf53a6e6e50398658f5a7dbc088ac824900000000000017a91436ffcf0e51ee999f57a19ce90a4436a48089c50b8793490000000000001976a91488c1f5da66e33fefdd2d3c07a83f5394acc9526788ac94490000000000001976a9142c2429af6d12e16b52c9176258ca3ccb2960102388ace14900000000000017a9144863f6362c4b38d9e158a49fff5dba86749ea27387f64900000000000017a9148f314d43a2471ad931c7e2abf555a2cd0018e6c887fb49000000000000160014c6bdbcc06cfe76970cbd3ad43521939152379c45494a000000000000160014ff880109735d3c6fab746bcc76a4523f92ee60a14b4a00000000000017a914dfe6ebb944f9565d2094c841ece54d8dc5ec548487584a0000000000001976a914895cf0ec9321bca9c992bd493359e9be6a7d473e88ac804a0000000000001976a914ee93e44ad4e9ffe498adb3ad2775175064331a5c88aca44a0000000000001976a91438f5d3f22a1c80c115a69c112284d2c9e2280bba88acbc4a00000000000017a91431c52165f4648895f53e4b5914dd4ccf386a689f87d84a000000000000160014b0e213099e71f8ca3ec45ee9069b723eb5f97bd1e24a000000000000160014baae22aa4e76e7794a494a6f6ea2da40f19e54cce74a0000000000001976a914c60bcf7263145f4751b4487a069f0f2d0c28f4bd88acf04a0000000000001976a914ee939a4e0065c4d6563084f4f5b33ac3cd27e85c88ac0e4b00000000000017a9148143d96908373e3f6959b4ccdde7c522dbfe648e87474b000000000000160014fef6f1551a2d21f7caba47409f95caae4228d881c64b0000000000001976a9141647b0b317c0dd47c173572d5a37ee7c46f6212e88acc74b00000000000017a9143473d2b29f01d6fd1b6c5d6b6dd9f2517a5c6e0b87f84b0000000000001976a9144b73fadbb8e2f96f688d268285b0073f759630df88ac784c0000000000001976a91432e0529aa444572b062916634bf42f19c382191a88ac7c4c00000000000017a9143ced6d98cfc43f580ea5a0b93b4a19cc66d11625877c4d0000000000001976a914e2e9855c4db6482a44c98a33ccf2731e734c4e0e88ac894d00000000000017a914fa5de3aef34947447d1b99c6b3b1dca520bd3a4987b24d0000000000001976a914e51c7fc57017ce6b98f14e7eba3a2205b5ccfb0888accd4d0000000000001976a9143d1d59d3a04ee92735077cb674e42beda34083f988ac0b4e0000000000001976a9149c18ed3a0a03ffd3b99c24e8d695e4422dd82b5a88ac674e00000000000017a9142e60d5da365e0d5970a5f5ef20625391fc39b3dd87964e0000000000001976a9149932ef36def2a8ec6757cc8abac0a6d18c38fdf188aca14e00000000000016001447efbe835d74df518b38efcd894a38e1bddaebcba54e0000000000001976a914b50c6dcee9edebadf9d299a43b7d2d56f948154588acb44e000000000000160014d276ad2dc4b5b270bc8a1db2398b093fe3f180e0bc4e0000000000001976a914b4587a24ff8738771731f4a9aa7be575d12f0abd88acd94e0000000000001976a914d73c6eccf6f7fb44138f877942ee05c28f35b25c88ace04e00000000000017a9143245ca02c8e048850b064c0ed293b283c128a38787724f0000000000001600148e71a511adca2b026011d1a2934ef2b64b7ba632b44f0000000000001976a914526955723c980e0a2c29fa90724ee4b98afcebd288acdd4f0000000000001976a914f90d78fddd2f2e93d96b8f9b79de4c7e532c01a788acff4f0000000000001976a914dcf0af8d00f50f43a2e5c4f9a66982dd628575e888ac1c500000000000001976a9147eddf87ff7b5b0cce7e2dcda0d7097348307730c88acdb500000000000001976a91452687ab0080b2987f17d463e8c6c68575aec462f88ac095100000000000017a9142082d6f6d225379f12e7e32947329516323e74f18737510000000000001976a914a728d5b38405bdea0213bfb10d1d27d2068c3dfa88ac8d510000000000001976a91444f579230b67eb0de1aec86bccd0d8453f5af1ab88acb8510000000000001976a914832141d07bae4995ef910d7f4a4699bce21ccb6788acd35100000000000017a914c2ffef21f93900532efb5e20fa766b3f840b5c7687e3510000000000001976a914a385b824a39094e1658cfaeaac81b9ac5c8eac2c88ac06520000000000001976a914ed3d528dcdeade6f206780ac731882ca44a91c8588ac17520000000000001976a9149d5965e826c672535ab6374caf3772fe3c03217088ac34520000000000001976a9141003a8da4e50d20e8441527cb13a212023bb393a88ac6a520000000000001976a914dbcb9688869a84c07caecf1f3cf103f90fdb4b4688ac70520000000000001976a9146fbd497aa6d89188b97339f3ad0d7c40bae2a3c288ac73520000000000001976a914cbffd0d61b4638b9b650711c261a3bf2a299dcd688acdd520000000000001976a914dd891bc13e56b8d9ff6f10df04414f6698763baa88acf5520000000000001976a914082dc8f96ab0821bd407ab9a0db93b8d1d0e730d88ac1b5300000000000017a9144ed413360d7b2bfa1351341c5c13e99c3638f5c28729530000000000001976a914dc8ad11e159fed326a2e3aa51274970d1a2e6c7a88ac405300000000000017a9146617c5dff0cd9527ca2f781f423df13a103fdfc3874a530000000000001976a914b26ccc1f310e90e4e6d12a49e4fa9cc497bb13d288ac4c530000000000001976a91479bdbf2629782d03da84c293935b32981338465388ac6e530000000000001976a914968554f356609a8b80c47ea6cac829639e02523888ac7b530000000000001976a914cd3b03ebbf1193fb4ef0377f60f0de1fe34aa25c88ac84530000000000001976a9141e9adedc9d472b9c73de8555762d5e0df92357cb88ac865300000000000017a914bd59ba2daff5c46ee1ecf965b2c626191b87c6b7878c530000000000001976a91468cc147434ed78222151394fd7757f749eb41f9088acfd530000000000001976a9145e4df062854dd068d5d1b77dcbfcf8e44654d20c88ac375400000000000017a9148efe7b00f16421a5e547a1432b623bd51653a32c87415400000000000017a91486f644297a2e36371c33c359ab649385d05362a087a654000000000000160014ba4c136c7389924a1a46890d95ada425089fa10bd85400000000000017a9142c4887dd0dd0b089b8148863d632c3fe65810e4387f3540000000000001976a914855598d392a758ef51d6e1576f07597b568fa98c88ac0f5500000000000017a9147e41c9fe85bbfef2bfcf2bed10523d131a0d6cf8872c550000000000001976a9142094390ad709ac28928a4637a76984df5828047988ac4d550000000000001976a91412eb03c0bfb24f8d4def63c6f7043e827e024f8688ac51550000000000001976a914e54b74239be0e7b97d1a462c06fcdcbf23f88fcc88ac5e550000000000001976a914d1afe4d690a635302a26979c610bfe5bb84a8b7f88ac81550000000000001976a914e1ecd1a738ba90d178fbb7910d5bbd48bc47aa6288acb4550000000000001976a9146b829067b73c46623be9884d0f3896d9bee5adec88ace3550000000000001976a914f27406230e4f9ede480429eac41a8994b772108088acfa5500000000000017a914f1662b44ed2ac36643104f757c97ff022db68e5287085600000000000017a91424a3a12134918241c13e4b75624ec99fadcd3695870d560000000000001976a9142050a1fa0cf334d046f410b953fffe5a1106c3d088ac12560000000000001976a914e979bc5a2edf1f62b9946c2676b53c770cff392088ac415600000000000017a9141e493a0c29d84f733e1eeccb312b67b06aa7474f87425600000000000017a91446b2ea92771e97ca979a83ed290eef616aeae58a8745560000000000001976a91452982f020a0eb613eb6f57eea00952e253a14e5788ac895600000000000017a914dbcf7b82c724fbdac5b405d78e16378231f29d1487be560000000000001976a914d9b467d813ead2618ffaa131b83f8a31f3f5430288acd35600000000000017a91454cad422d3ae7ce9dd5431ad8caf997ee28b6aa887e456000000000000160014ae76ed30813f21ed76dbf906a3a3acff67666968ef560000000000001976a91485fd6e15fc9bb0bee844cf10afc498137ffffb1188ac335700000000000017a9140a8e1ab94af59eec0bb976719a2aa7af34aeaa378741570000000000001976a9144ff24e56ce7f9af93ca75bc3084f8853298d869e88ac655700000000000017a914b85563a51be96b3c4baaf7b7a4af83c416ba3fc38787570000000000001976a91484ee7ae2621f487496e1b3b232953bafb0aa057c88aca0570000000000001976a91494fbd153370451b983b5aff1a0a2c8477477742c88aca4570000000000001976a914d9be3faf90877ee47a4e72a1119053530d674d9f88acb95700000000000017a9143f332c043efce0e24ca0f919b5b4003a620c221f87c95700000000000017a914feaae20d170e9291c876d1ae3147dbaee74fc6d987dd570000000000001976a91486c06640cbe72b397255a1a84c70815fc67258c288acf15700000000000017a9146f1efb45c7b784262defc3e4320fca16141a1dbd8724580000000000001976a914d6d58d7544fbd975b04b3f854b7c1852fada090a88ac385800000000000017a914f36df06705a4795a6d286de05d46f2c1a496bc25873f5800000000000017a914db4d3b6258a5c98d350c2aa8c6bafda0764e9e19875d5800000000000017a914b233989f2d156c602870a05c924743a9c132f1e787745800000000000017a9148c523b49580911919c17b3ed97717f329a5a1f6b877d5800000000000017a914d8e03b84d4126d70d44560db4eef8a7ace1731f98789580000000000001976a9144be64c006580ae32cca718b76e4428980e7fa9ea88aca258000000000000160014f9776da08419b47fe964c945e56f983e07d4e4187a590000000000001976a914ecb77c3233fd0a37852f77c8ea4efa745118ddd488ac7f590000000000001976a9147f1a34956a418ab45b09bd33ea4643131738167588ac86590000000000001976a9144e83e249870d166c4178019daf7cf76a0e3e207888ac905900000000000017a91466db14c8eed50648f180be5610c31444dd5790b98793590000000000001976a9143c82b37f788f10fa34d331177242eba11f64379288ac9b590000000000001976a91474fa228fec2f7d54a4efd8ebb597ef3185b071b188aca85900000000000017a914ce68d707eefec94ff905c0938cca47cc1ae09b5b87c25900000000000017a91421a385ca4adf7d780c129ac906c80cd0d9f15f8287c75900000000000017a914466f20fd0f1492885aa3be5ae30acb8dd5a263c087df5900000000000016001496d6c686cbba9817aa33abb861a03bdff4db78d5e0590000000000001976a9146359f4c250f7f894f4cbb683df3c441adb83805c88ac295a0000000000001976a914400f975a02b3bc43f2bee9a9edeb58b06ede5aec88ac425a0000000000001976a914392acc6846142699a4674ab5c048ebc4d3c92b0e88ac495a0000000000001976a9149fc23d1eb2bc405a1d46e434ce2fcbda8f1f747688ac615a00000000000017a91462995348d9cb854b65f0f5c64b69ea4a30046e3e87625a0000000000001976a91409f6b90cc790481a25e25bf000ccc00033a3fec288ac8a5a0000000000001976a9141f548772ed34d83ad083aef6348ab0b4a4470e9b88acc55a0000000000001976a914e639b0093c3d6a051d201b82b698a3c19489d12988ac095b0000000000001976a91404ce825a9890487dcea8d045f94e393f3a64675388ac235b0000000000001976a9146b57dc9593f5513929cc6bc16a53cd04be1a799688ac285b0000000000001976a91462bbc84d9a54ca133700367a3ca171115e86d27f88ac485b00000000000017a914f9de056be09adf9ca581e5cd8f454c5a4651d5d787645b00000000000017a914cfcb1e45c0786e9fcd59c3e5d6f46a2322ffccb2879a5b0000000000001976a914a0727a3e9c517d846c260c1127863e075c8fe80988accb5b0000000000001976a914eaf4d459bfb210de76a7d438916782e94e7e834388acf55b0000000000001976a914c4fc27cb1e12203be8517a4a3061a81c6db086be88ac215c00000000000017a9140ae3e8f69fc12a517f148d6508d946aa26467b39875b5c0000000000001976a9145b07c429e4083d949cac66634f9729ec29a4273488ac8a5c00000000000017a9143f969da61ead77ad1d6ac0b1a99e9c12f2579c9c87aa5c00000000000016001463ae5ac131b007e6363063e8cc7b6c6c92fabaafc85c0000000000001976a914870106dfe3f4db00c7120607b1bc30ef43ae314388acee5c00000000000017a9145394badfe876219de8549c1a9f7ac2ea0271a15e87215d0000000000001976a91413e34036c6a48568f7217c3dc311815bdbae11b288ac965d0000000000001976a914fcc58643a712ef293a39246a9111c84a53be64c388acc75d0000000000001976a9149f5c3e3110d675e7109ebec7b723acae247ff2f388acc95d0000000000001976a9145ae827ecc3180f08db7571e89ad9aed6bbce441188ac4c5e0000000000001976a914ea1f90a83f923a055c26508cda0e838a15f06f1288acb95e0000000000001976a914a2b82599fa1720d4349de8464a32a5a9c5e891ac88acc35e0000000000001976a9145b37fa4d10a5322b8bf2fe3d75cde22f9265867a88acc85e0000000000001600147fea5560d37df232abb701b5882412f15ff1d4b3315f00000000000017a9141e885c375fb48e1ffb94dd19b652678d35d9391487355f0000000000001976a91438d9a72ba2bc63f7c6dfff84f09dfd384986a81488ac445f0000000000001976a914ef675d345e4be97c975f8ca5a5e1457ce1ba826e88ac665f0000000000001976a914ee397dff6e964b5cfc5c47c80e1f01ebdb7b2b9888ac995f0000000000001976a914c7ea5c89ddebcfd4cb568400d23587f9dbb5b0bf88acbf5f0000000000001600147e2ac498ac3589b82161c22b5bb72e09cc899117df5f0000000000001976a9149514ed8699aa289650691bc99bcb33b011298ccd88acfa5f0000000000001976a9149c8329ca7517381cd883c7b6f798ccc0c712753288ac09600000000000001976a9140fa603fc02c87bd4811f2cecd2b2b73045ab429788ac58600000000000001976a91407eebce2aa41a1b79e2f759660f39d8033629e9f88ac67600000000000001976a91460bdc741deef69e1678173731947587f06d8542488ac9d6000000000000017a9145867b2080fc275e6ea133ad7dd5ba4d89fd461eb87ec600000000000001976a9145035254c855d1ee1f0cf18e3c4f07b7fcefa60e488ac05610000000000001976a914740cbc037a90c64622bcfbe5d758e165af79c4d788ac08610000000000001976a914f0f611e336142d2af5ffa724e5087ff0d0e0f20d88ac77610000000000001976a914df3393b54f3360083780d99197e9df6d3005b99288ac7a610000000000001976a914bf53510ae14080acaf203f3138c9d5dbbc20bd6488acd26100000000000017a914f582f68cd263a7685eb02af08bbd710fd8e2c3c987e06100000000000017a9141f4f8c6015307debfef7c2d3cf5adf1f92b50c0a8701620000000000001976a914bfbb7c1e8078ce366eba58dec7c9b33e6701d93388ac0d6200000000000017a914cbea53be21e1176eb44104ecd60ba05eaa5f19a387346200000000000017a914883f55a6f9421ea246200718c54872af57af4671878f620000000000001976a9145e3d51dcbeb599e31d3a004cdf3e571d8797b23a88ac9f620000000000001976a91434277b991ac13e4480eedcbf5abcdd730304066e88ac02630000000000001976a91471b39eeaf377ed5c1ab4db760512a36a78df933a88ac5e630000000000001976a9145d70f2ab1526ed80213b8fdaa309f6343358b9e588ac65630000000000001600147ab38496d808c3cc7b0442d5dc006f50c0876fc4a76300000000000017a914d93961738df923fa12e66e5eec4a0764ee0f16ef87b66300000000000017a914aea9a02309eca4940131008f4105be9fb2b866bc87f86300000000000017a914ac5060de751aa658b3145ed30287a86844d7864c87fc630000000000001976a9140733ccda5d67e7855def597e6fa8b5c089250e5e88ac76640000000000001976a914201cc5c854770d6de2fdfb3b2c15317cad99bad288ac986400000000000017a9149d2e44692715a4c696e30f8e9ecc158dc5d65248879f640000000000001976a914065efdad84a546c89ca226d125d2b209c48f046988aceb640000000000001976a9144559ca764557be659024cc9fea8df130b5b6bde688ac0f650000000000001976a914bb6c6affb9e10576ea35a07bfa99c5cfcc50293488ac5765000000000000160014b8d51150aadf79dd7f70280064e33431ea6a768581650000000000001976a914ef6c4d05ba7dd1252f34d4507053122e0bbb9b8c88ac92650000000000001976a914207be215c47c9bab0cd838a21dad0f185e74dc1188acb2650000000000001976a914b380cafb448974656b912c33b7c18ced0914946188acba650000000000001976a914e0709b1797d28f1d5d786cba704390e22b9e302b88acc1650000000000001976a9146804c65bedfad65cb4a3280ed6fe5b5713e5bb4088acfc650000000000001976a9148cad34e21991c3154012d74abe9a7a8db342fbfc88ac0c660000000000001976a91438ffbd0c42a252ad3dd9389254c987f537c8583388ac156600000000000016001464831a8f32882cef5ce6f3471017dda8ce76c62484660000000000001976a91401dc48681149dd416be9d44c38820c0d25c2eb9888aca0660000000000001976a914ddd9609e01d3ace6053ae47d02ba00fb481f062488acaf660000000000001976a9147eebf5924495937e27238c964c2e64d0dc1434ae88acb666000000000000160014f55c86a1d16345c3dc72a3992e32ef19bf661830f5660000000000001976a9147aff37b929c2b4cc8d36064570504b716a57ac0d88ac1b670000000000001976a91477cfde8971f6be00d7cf16c09eaf159326a7360088ac596700000000000017a914d558c41eb5fe7626bf174a74884d61209cf101e0876267000000000000160014f7398f40f0ffac904fa02b2fbfe277b6018b976a75670000000000001976a914c5a85b20feb42a58a7c620722e80cd4018db25e388ac776700000000000017a914e4242797605a21693c2ad5ca0b8aa135fae9296287c36700000000000017a914e897c146cb6455abd2335193a8698a64765a0e3487d16700000000000017a9140a86c7a2e232cdfb4163bbfda3dec17453644903874c68000000000000160014857ed15c4d8df21f573942b9515797ae48fee0105c680000000000001976a9144e4924178dd1ca1c0f0be37979172925bcadfc1e88acb7680000000000001976a9141a4e5b3b4158c6618b74a9022c401f408c6f080d88acb8680000000000001976a9148ea63dd9419581c06f963368a59b5b167539940988acfc680000000000001976a91446240d4aceaac971cd67d03d59b554610d22218988ac196900000000000017a914ba3111b9dee11cc5258b295b0a14c75f80767bfb8735690000000000001976a914dc7e68b9cb60cd20ddeb21dc4d637723c2a995a988acb6690000000000001976a914d822518ca79c913c87688c7e4ceed32775347e0088acbe6900000000000017a914312e772c097caa1fef54309430e42ad0bdd8980987c0690000000000001976a914dea9761c78478d6877c5f2e6c6b484a3614d38b988acd3690000000000001976a9149bcbcc2e66c84b04d577d51c6a14497683ae871188ac046a00000000000017a914a9bd42a20ec269b6341517da0b712f0de9b00b9e87066a0000000000001976a914ffa7c6a764f85e7328d5da689c2c84142db8fd3088ac556a0000000000001976a914b637f8da95a44fee6325e00cbdd25c4eb5f04aba88ac636a00000000000017a914d67619919be51f841fe6678f9f655c3a0742dd8d87846a00000000000017a9148c4699f81abc52daa34a24890bf622b798649ade878b6a0000000000001976a91407868a644a42951ff06d8a7a9d2b55b951d3805e88acd86a00000000000017a914f5c0e1f8d42f8416c7bb46dd4a1ba82d4c149a6c87316b0000000000001976a914d9e40f7cb18b5fbe34a1546f9ef5d2c6e45df4d488ac696b00000000000017a914e1d480cce19a4bd46e252de294633e9577f229a887986b0000000000001976a9140cc011474916a0ec7d33fe943e8b91334a54272188acb46b000000000000160014c522f6d47f15bef379f0d6e6ac3bbbfd4d139a0bba6b0000000000001976a914a41f281fa4b05a22613542063828acf81752110c88ac3f6c0000000000001976a9143e9920c2ebfa821be1f34b3a2f5a6714b2c4615588ac516c0000000000001976a914e99495a76e4b572281603f074bbd7ee6ba7e759888ac9d6c00000000000017a91492ce31b6d9eb9f5a9171759550da462a60106b2687096d000000000000160014a0a0e623e5425fd5dc59bc562dab9d403dd0a46d296d0000000000001976a91421a272f3ddcb0c41c89d2805e38a71c090404a7388ac2b6d00000000000017a9148f6af68894a09965f5c6fd205b14de4599fb943d87356d0000000000001976a9143b5d57df00154baaeaaa0259ec8b7e7c96c45f3288ac666d0000000000001976a914ac5ade92e151860244ae25e0477d32d50ed2bf0788acdb6d00000000000017a914e3c438d4eb2563346659ee5aa7abc0c9b6fd347687dd6d00000000000017a914cdf40c37113ee0dee4460c05fb115daee09b5e0a871d6e0000000000001976a9144844a5ccbd27c1c95397cfbbe9196832a20a0d2c88ac216e00000000000017a9144c0dd64ac1a9b2a711ff2da4715d978f3c26c6f687696e00000000000017a9143336d540a800acd9fb13f941aec6c9bb86f8a8ea87f86e0000000000001976a914f6a29740390c84fbce6b006c77d8a3e29e586bef88acfd6e0000000000001976a914568f42373c593c1021157474cd1fc96effbfe9ee88ac0c6f00000000000017a914948232170913af2675869eeeec15f438701d29df87356f00000000000017a914ddba3dfc4b35ec8705fa05b756424923098e4a8187ef6f0000000000001976a9144ba050839717e47edf9c4f60b00f91e71cd376b288ac12700000000000001976a914c9aa72ff52fd355636b3b291a6dc52f866ada5fa88ac29700000000000001976a914733588f08e19dbeddf9701181bf5619977ba81b088ac56700000000000001976a914e31fa758c34fc5cb8b1d6d19ec6c417627a93f1888ac74700000000000001976a91496187c31a47720c290cb5a13dcca8da533d4ed4588ac8e700000000000001976a9146178377cbf01ae926a357edce31bbf70e8fb807588aca670000000000000160014b18910404ba8f35db3d0abfc306d04a9eb6ea5abae700000000000001976a91461d42bcaaf832d3f62e6472659c684e2d001569388acbd700000000000001976a9148ff9e34d378e10c09a708b74ab4af26acadf344288acdc7000000000000017a914ab4a99566207594c734d60043c36537fac39168c87e7700000000000001976a9149ce290307ae0df444dbf049b223ff51d703f476588ac0b7100000000000017a9141e6a88517e8e73b3af3ed1eb2d367c32537381f38766710000000000001976a914250d04919fc6bae56569ae0e018d09058608ce2888ac6e7100000000000017a914cba99ab1fa77cf4e1c2740a2c0ab6988cc2914f9878b710000000000001976a914066de2171da24384a3f22a66be9bfee7a9617bd488ac977100000000000016001450c7909006c1088103ab00c2eadc8454958f25dad0710000000000001976a91465376e6dee13a6a51a24f65ce2ce97dbd263222d88ac35720000000000001976a9143a89c380420b2181f19f2a4ce017d344db4bdda588ac7d7200000000000017a914c1195fb567d88d28daf1d1be864d6e83aae76e2a878c72000000000000160014b9c5845a45d45c05081a81849d068f9a8e9bd413a0720000000000001976a91496213e7552737ad3e007c2459145b0fbe7addfd388acee720000000000001976a914fd89f4bdf8620740f7f025d88919520f07d5b08b88ac05730000000000001976a9141a1dcd6df8e663f2636b0ba43b1ac0f2f522682688ac537300000000000017a9149db3d63ded8a6c11ae407b43248ddc6b9b487c398770730000000000001976a914f9490be92356aeecd4ab5f9d33aa3fa75d20e23388acbc730000000000001976a91466b1589741333152376041011626973ce5a1a67488accc7300000000000017a914337567d728c458431ce1d3cb86ed4896dd9787308730740000000000001976a914a25866ce07884a0e38e5dfdc00b81b1111d4559888ac46740000000000001976a91472d3236548673d183a88e97b30d679e39e63bd8b88ac60740000000000001976a9146d94cb3446fae9a86a62e4b000b1b07ad2838c1888ac89740000000000001976a914e34175a5f40ce84677f67f2a76d80add580317bf88aca9740000000000001976a91441a035964cdf58bdadf811558b412feaf4464beb88acbb740000000000001976a9148bcf428ca9f98d6333d1662d79a17380427a686988acc47400000000000017a914da546d8ee35f285596a6bdc7b508461960189a9887ce740000000000001976a91454b08e551bfdd06123219850fd45e890132c13d388ac46750000000000001976a9145099286acdbb193bdffb697228f6cdefdac7617588aca9750000000000001976a914dc2b08573be930aaa03d9ed494976ecf935c043488aceb7500000000000017a914d61d5775d8ddeb4731848152af7462a9b4e8d47887f17500000000000017a91489b25216045e8770f5a72cb3be85253b47b2f6c28720760000000000001976a91408a95366b4ed1fbecd60f33227b44ea887fc8c6088ac3e760000000000001976a914f0c1859c53b3b2b5cfa8b520826c5c250bf29dd188ac8e7600000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987fb760000000000001976a9149a62289a61a004a86f534774c076e8c69bbfc83a88ac4d770000000000001976a914eb269ffa6b7ba805faea41c38c46afec2a5c0d5488ac4e7700000000000017a914dcc0d64c28a8122718ea955c2d45eeb209f550e887557700000000000017a9149c1085ea88bd7342dd3759ee106dd50850d7e82987e9770000000000001976a914ef562d9b853c6236a93536d4fa0d4f1a398866b088ac2c7800000000000017a9149cf2922838f03d1f1864667aec9fa976eca5b6bd878a780000000000001976a91409c755adf2a65a304ab5f3cc32b01de8c587845088acdb780000000000001976a914ae78e1c7febee7d4f5844975b7970e8d8c7a253188acdf780000000000001976a914decf5ed84abc8cab3baa9e49cc88e37f8f8946d688ac1a7900000000000017a914d2ecdbcabc6a2e8b9984b8e99bcadc25ffdbe0ba8727790000000000001976a914a46b719935de9acc728a6600622720d061ee47af88acb67900000000000017a9147f70277918e01ca315a9c2a7f10421756247885e87de790000000000001976a91429405cf02f6f7b722a251f13220a26a85212f44188acee7900000000000017a9149846208e48729f2161b43564b3ec3e42f8fbf06387487a0000000000001976a914cffcac675902a01166a7eab0243ca4c8828f0ff888acba7a00000000000017a9146974e061f2a56115bc12ee728e689662afee529987197b0000000000001976a9142c44be13bd8f6d66449ed396e0678814729e20cc88ac247b0000000000001976a9143f59a17e6ade8052bac174e247eb00e559b43c9c88ac267b0000000000001976a91406d66f9dfb52282d9511d133db667f3876789a6888ac3a7b00000000000017a914db76a1ebe42a3f8a0194522bdaf2a51be2329efe874b7b00000000000016001477d26881cf61e494c56ced53947836be651251ee6e7b0000000000001976a914ba679039360ac2a1868007b332a039eed8a5a99588ac797b00000000000017a914fb855b07392b315b581c3625571d87841530b2bd87bc7b0000000000001976a914d27f1b28336d4634b02f1b926ea14f0b8ef98b6e88acf67b0000000000001976a914fd2ed26079773b9baf306cfbc63cc342313a686e88acf87b0000000000001976a914686578501243fae4680042963811488e2a35b4a888ac577c0000000000001976a914a5e069f8447f33f17d59e63c198bf8c08852672088ac8b7c0000000000001976a914bcbd032fa7822a2fc96162fa8bd830c6568b1b2788ac9c7c0000000000001976a914b8f81d1e1fb0d11a66f28743850fa896bce7855688aca17c0000000000001976a9144a13fe8c75c092327c4717b96ad8d03b7e96133e88acb67c0000000000001976a914d4cb9a683aa7e62a7eaea7d639bf12f2977d9bcc88acfd7c0000000000001976a9144aa6719c2f902d58114e498d8d95b4bcd83041ef88ac117d00000000000017a9144476f06425735bb8ef0e083808e146ac90eb35db87307d0000000000001976a914d518f80dc461b1e3a5aca2ebe434766e27dfb1da88ac737d000000000000160014e6a5e63371e8ac663996ec80b4e4d1ea5f619f80937d00000000000017a9146ef14a389893a6e3e7c9979a8772576c1304c43387b07d00000000000017a914841b77bd5283866d537e39d829559b300a8d1f0c87c17d0000000000001976a914993078654865431ba70b236ae7289726fa8a7f0e88acc27d0000000000001976a91490a7989e8016ff8350ee3c6bf37bf2d1ca9c9d1c88acd37d00000000000017a914a356a410ea0781abe70e62486aec8ce3617e5cb687e47d0000000000001976a914fce228060aa565d02f3a1c570b1f353c31be42c488acf37d00000000000017a9145eb09c606b55eaa46a19ec4eb0b45a532e3844c287f57d0000000000001976a9140dcc3f48352e7a55da7e9816be25e83026847f8788acfc7d000000000000160014ff97d78ec0c5b45992a0508efe7780bcf730fea2497e0000000000001976a9140d93654641e6fc537208ea458761d9d4fc3b294088ac4a7e0000000000001976a91415eb9d6e215d492ded418e7fb2d081bc96235fd588ac627e0000000000001976a91407d6109752ed6db9d376bfd27331ac45544f4f7288ac6a7e00000000000017a9144e53d2d89411b903ad83323e82efc2cfc908f1f087747e0000000000001976a9143ce518e50062258a427f2d2fc5833ccd8ca5e5f588ac987e0000000000001976a914ebca207536d108fd02c09e702e2d811f2cd6dd7488ac947f0000000000001976a914c6d003980125ab4dc68dd333af375c257c709fd788acb37f00000000000017a91412f48751917a8b0bfccd8efde2509144b433d4fd87d07f0000000000001976a9141fa7ac872f6d48713b240014d1033362f0d0edeb88ac12800000000000001976a914d71b8a627f2c05272ebf665309447977faef637b88ac148000000000000017a9143b1b0070686d3abb636dfbe6da9759d06a696dd8872e800000000000001976a91448d0d435272177bda749772c00d50e7a44e5355a88ac4f8000000000000017a9144e9c1d89abc1f0b63cbf1c5a0c7e1829230baafb8753800000000000001976a9147e542a6579131c4b11498446fc2797fc7a1b05b788ac568000000000000017a9149031d6eecebfab065063f93c977aa7b24accb13b8758800000000000001976a9142de1d8b4154df925fa4990fcc2f9d63f816d873f88ac64800000000000001976a914a2f5560188de5fef7b3e45f210e93b3a7fac853b88ac7e800000000000001976a914ea7a9bff1e98b98d055c5f8baa6f331f7a842d9f88ac9b8000000000000017a91424c61e2d9294d91bc80c8fdf733abf6934fb34b487ff8000000000000017a9147e392193026017920075d9d037c70e988ded0712870d8100000000000017a914d1470471dc92ee9431d1cfed7f72dec880bf29838754810000000000001976a9144f5695721051410c6c2f0dda37ae141a3dc1c61a88ac72810000000000001976a91477ccaaf0a6e96a6ba9173323eab62c8214beede888ac7f810000000000001976a914723408d8d6e23a03d7121d74b0c13cec00d5bb0188acb781000000000000160014f44e24c031c1ef09715f81fec45c0de18720bd7bcd8100000000000017a914e68549845d7ef5fbb21c3d0a335e1844a1ff45fb87fb810000000000001976a91456716c5f4f0acec607297f777a4bb8d0bdda947288ac02820000000000001976a9147bba526f670298c464a030a763ee2e09cf56845d88ac33820000000000001976a914a16dfdcc9d0a63e4f4e9edfee6833f60035abfde88ac8282000000000000160014a91f798a2a37e0b2d2a50b22450c93cf6cdb14aa8c820000000000001976a914def9ec61fed512cb255ed09781f7206cd841924f88acae820000000000001976a9140982879ccb4a08b0d5a6d6e50a021948f4352f3e88acc4820000000000001976a914233e1acb1f8f8e53a04e6307dba30f6380e2517588ace6820000000000001976a914c922971e981fda0b2981f727e67c8b5714e7b12588acfd820000000000001976a9142fd3a38822af991a84743b2b8352beab336bc18c88ac47830000000000001976a914f950a1847394e330a28792460b1ea25f9c5f65c688ac6a830000000000001976a91402ad90a084d6a6759b4c26ae161133dec6b04d1588ac868300000000000017a9149795225ccefb773a4e2737c3fef36387280a4b9f87c0830000000000001976a914eb8d77b87d2ac04c3a4071f4808606ea8487ef6788acca830000000000001976a9143cd7e464d48e7965b5534682e25106e32dbf773688ac218400000000000017a914064ca1f04230f3d81f1916bc995465b7ea76d2b68742840000000000001976a914fa16bf5d1536fdd0fc4747131cd4bb5ed0ce5c2488ac4e8400000000000017a91408baa93abfef7ef28b7c10fa3a0aad32184c791b878b84000000000000160014863d02d231aaad2ec34ac7c0fbdf6c76d2eb4fe594840000000000001600142763b18c534e8aa6f112a759f535010886a596bdd9840000000000001976a914ee4d0570c7726e4de21c5c17d741248469c535b688ace58400000000000017a9146dcecae1d12915d241143953c6dbd00c33015bd1870c850000000000001976a914a4a03545561b32f2bc2d903fb13ec082cba230c188ac7d85000000000000160014e9d0413261b3023f78a29fdc86e1bcc158fe1eb2e58500000000000017a9142cc6eebaf13ad30d423d88af29e97616cd03e6738703860000000000001976a9145761b1da84255e87f8885f8023fe7219820d860e88ac6a86000000000000160014d8e098c4271a4ea9a9bdcfdbba888e53b59a6c329b860000000000001976a914ec27d47c4758dec759f46969f4ddbcdf2904467488accf860000000000001976a914c38caf0f80b17ca3e345d055777c11a6ae57b43988ace4860000000000001976a9142bde2f0a9b6f02e234e5c0e6af4d504ebeb6153b88acf78600000000000017a9149a7f89f0d56cc35a3bc38f9282698c45b37e897c8701870000000000001976a914647dc482657d85be40899ba5c1dc5f10a231081088ac7e870000000000001976a914b3a4c6522f31afd55921a9ab6c3818d81a5ceed088acb087000000000000160014b7f577ac2dcd71dceb58d8bc82b2c9b1708e5ed4ba8700000000000017a914563f42799c452740a92cf308f9c33e7d09f6254987d7870000000000001976a9141c372601886f62e4131c47f7f6b6d98c82e6e6c988ac018800000000000017a9140d0f8bf8950e2403bace410a21340c868b7a0a9d8705880000000000001976a914bdf60038fc18e63645cf94ea657bb947ee3ac2c088ac478800000000000017a9146f45cca6176d2378f289f2a4cf621d655d8c62d3876d880000000000001976a914b169b7d2820de46ba0fdcfa7a6a2048143a9675a88acec880000000000001600144be61994a8035e6a7a97d383451bc749675738b1ff880000000000001976a914f2a33079cfee4f4cde6eb74331b0f551c82a20ae88ac39890000000000001976a91470b44a190502db3ef96a1b6a6b8f8f85abba522988ac458900000000000017a9144e53778af8980c6428e8c5644d258b8e8e94eb348754890000000000001976a91478ee25f5b3accaa64b6184fa43a5788d909c813e88ac6b8900000000000017a914e2bb12e39444775e8dbfc52516d398a289c51be58772890000000000001976a9141d85c742e0b94326bd07d461d961e76f8df3cfb988ac8f890000000000001976a914b94055b030b029f50b5ce5973faf0d94970242b188acf2890000000000001976a914f20c0e0bdbca1354c51c8ba30fdbcd7f28fad59688acfc8900000000000017a9142021847f09daba132b315722ad23794cc05e9a2a873f8a0000000000001976a914341e4663a7fe27abe0f921e51a5d44746254feed88ac778a0000000000001976a914daedc120b9ea56a00170ee749a9267e97e91d71288ac9b8a0000000000001976a914bfad2a872613be3c7e1693c74ad5b964b88c12ef88aca48a0000000000001976a914c87f49a34b815a8962d751dcd49c882786e7af7d88acf98a0000000000001976a914fc9ad69294de511cd0fdb311c51dcf5d78717b0d88ac478b0000000000001976a914d68c2eb65a33b97beed91bd47417c03db8c84ed188ac248c00000000000017a9143025b21e856b2d47b20d8115f5c2ea580264dfed87278c0000000000001976a91450e76122a6202bdf3d2ecc48e002b86d19558cca88ac308c0000000000001976a9149514ece017062496a2a13b45d9a144ac67be5be488ac988c000000000000160014eafe747916af7651de299b0035cf5b08b4946d3bb78c0000000000001976a914e8c213fa8fd05cd2c890c61b75e2d9cf02cd01f188ac018d0000000000001976a91457a02406e6ed7cfb72341e91f19d08efc8e4698488ac098d0000000000001976a914e05f7848566feb43ebbcd323ce231c29be24514088ac3f8d0000000000001976a91423dd903344c5bd12c533826f1367b46eb9865e0788ac828d0000000000001976a91411f8727b571a1f577bdf2a2cba80a3db16ea299088acbc8d000000000000160014cf8d23c9782f7f923cb3f18736d63fb7f1e44b73d58d0000000000001976a9140c11a9275223c956cd77d0c4f548a4c591f8164a88acd68d0000000000001976a9141d4e5ddc088e653fc9a1f0415d45b9a348ac9bd188acd98d0000000000001976a914a13d18532e2b4db52cf69166d46a59a085148f9788ace48d00000000000017a914005f46fa96d930b89b7f3eb4d40e70722e7515b087ff8d0000000000001976a914a467fd0353c58ecca816034c061849025a0ab3f588ac3d8e000000000000160014cf8d23c9782f7f923cb3f18736d63fb7f1e44b73478e00000000000017a914e14e5494d4bd03a24fccc64716f5a94488cdfae3875d8e0000000000001976a9145b02303ad2a8b2b87e449aaab3f983ff0568fa4888acd98e0000000000001976a91466b3796035ad1d5d1782d238863e581a173a104788acda8e00000000000017a91445c9602a9b1083cbdf3abf9c979a878187b4622887398f0000000000001976a9145ce2290c3816d205fbe5a64b3a37b400115b41c188ac448f00000000000017a91411118838f598f7bf9f909c14e44c65341872cae587648f0000000000001976a914fe4d323d98f9006ad42f2fdb245d4ed462ed6f1088ac658f0000000000001976a91474cda2a782a49b95dbf9ec089db45d2d05984fcf88ac688f00000000000017a9148c98f4b6f57ecb289d96f67d17c7b5a0a21b31a987958f00000000000017a914aa6a82d1f686e801facde73127fae4f2c5cf19e287b58f00000000000017a9145e383e13ce9f797ffd4de660e9b5a36a8390b9ad87c48f00000000000017a914de7e4e027da98d238aa223df9dcca164d53047ab87ee8f0000000000001976a91414eecf2a474e7d5e13cd478c6fe4a6ee1dc18af588ac23900000000000001976a9147df4496940492c00454e63a2e3429f7237ef368c88acd2900000000000001976a914a0b8839c23367b2b2835a7563676361c7f5f2d1388acfe9000000000000017a914c38b7c1ee3d8d7f147c1ca43f47373a50327360c87b0920000000000001976a914cb0cb0a72a5ec610929e84b93d4701281bed0a1288acf0920000000000001976a914bbafdbc79624038c2f2f883feee594f1fe27ee8388ac10930000000000001976a914aaf444f0386f0a12ae4fe310bbcacd8453389b8288ac1c930000000000001976a9149207f53896f49fda3415738e63d0b2588ce5a09688acd89300000000000017a91406a8acb9e64f7282232549d3badbb246b723985d87fb9300000000000017a914c9c8b9a9e6aac4e093f1a9010a0d212faf9f88f28743940000000000001976a9143966048c71599ac5822f894c7be668b2a154268288ac65940000000000001976a914cac7a8876cd6fe3091e803243fa277416b6ce67388acac9400000000000017a914d8d67aa0eb72949c784f562c84bd5aef919178b887b6940000000000001976a914afc95ccaf32935194b6796746240aeb1eddf9ab488acd39400000000000017a9147dc8e53d46524422849fc0055d2c77b5bd5693aa879a950000000000001976a914c5812b02b3fa87777b04b88d9ec397b66de72ff188ac07960000000000001976a9145b2f26132af1e3698120636967945165ab5375c988ac1b960000000000001976a9149ddaa04c5657956a079ae9f8173a32e7468f3c9288ac5b9600000000000017a91407b785c47a03fb347ccdfd7a822af397362aff2287609600000000000017a9146690d039916bc5f93ad21d272bc258ccade0beef87659600000000000017a914c38a722c242902564ffd0967785aa66c58f6f99b87e8960000000000001976a9149410c52da94a2de571e7487517854ca59bd5390e88ac749700000000000017a914463b9ff221eea410938361e30d158b89b6b731fa8792970000000000001976a91426fc1c5d2f9992551db72337ae14826e464301a588acf49700000000000017a914c7ad70b0370c3562d6f84c5e1a7844421cebf3ac8702980000000000001976a914b8443320d054dfd540244bf098ef14ba1ec47c6b88ac0a980000000000001976a914a855ca14192e27f500710d493ccac26192828f2288ac11980000000000001976a914985c51248e13d26bfc0517d714a617c3e11e3e8288ac1d980000000000001976a9144c92fca7631ad4c870239228e091ad85bccf445e88ac42980000000000001976a914ce3cd649f1fd91c63d8c56af28d824eb8c356f7288ac499800000000000017a9140f19ef9a7339c1bea335ee103d630698846555ed87589800000000000017a914130e8cdd353e98080072a6294fe0b5e0a5ef894d8771980000000000001600144f4e9d597e6dd47552c6cdebb0ddfe23c48b1d2e72980000000000001976a9148a84efdda90dc9cd1f547f39a30ee9a0bbfef3f988ac88980000000000001976a914143c103a8006b0755bf967f1bb065b3600837b0988aca9980000000000001976a914da58ba5bdcf7b470da8af49a15c049b9c902417488acf0980000000000001976a914c547bb42f12196336469a4ff2fb2d59c8dbe2fa988ac2c990000000000001976a9145dabd63d6ae392a9df2071329bc666b9a3d07fa088ac3f990000000000001976a914be1fb4f9c2ff8e618453fad75934253ac335008988ac61990000000000001976a914cc84bb01dbb049a466b747f285c0f09b7873e07488ac8f990000000000001976a9147c20a7d931f9878e02287ea386236884f7526a4788ac979900000000000017a9145049708a1aa34eaf09c195bf04ac9f51b96bb0fa87b79900000000000017a91451822c32c2f2c635a0bd6e8eea884f9d9995b22b87de9900000000000017a914962ba3adea398628f038d63e0d9a79b7258ad4c087e59900000000000017a9149e51273e737e110a8f0863e6b5e5df331b7d20eb876d9a0000000000001976a9147c5e00c964423fd229aa771f398708362de8dfa288acea9a00000000000017a9140981ca9a80dd46d8b86d16d68aabc7ec1f1e587687ec9a0000000000001976a91469b161d87a9a40acb5fa02e574d2c981c737dbc388acee9a0000000000001976a91475754a1343b69b8df11aee3ade8cd4be3b2db93f88acfc9a00000000000017a914fd323bbaaf29b2a0ae2e2aac8ce7a572fc417c2487db9b0000000000001976a914cfe94ee14805a9a594496aa770ac057064b8c1d888acdb9b00000000000017a914f7a00f9d19912f642830db9a674318f104bead27870e9c00000000000017a914ccf683d63de3dc722030db3c6fac2d2bcd227cbb87319c00000000000017a9143c8873325e0386b37b9e9a1c0f540a0067411fd1878c9c00000000000017a9148cbea851b27efe2958e284463bba8fcca0b7cb7187a19c00000000000017a914916726ff27093a6f1d3b755e68dbde24809220fb87b59c0000000000001976a91447e610cefc2c34a1a075a18b4c857a68605d31db88acce9c00000000000017a9146503b07b5c7a22ba2daac1f2c7a5dc02530100a987e39c0000000000001976a9141e474d3ec52f961a306be991ee1fb32ad2c372c188aced9c0000000000001976a914117fc29b0ef54ecc505d884b72f731aba5941dab88ac3b9d0000000000001976a91455aa76e4a291dca5cf3f810b2fabf69703b7133688ac3b9d0000000000001976a914cca45693b5f5fdd64ca4f349994a60a37eb0732c88ac3b9d00000000000017a9141855b9a508e61b94d71af6d4c34e17a4c1f8e032873b9d00000000000017a91463203a3d0a2c0c3b16888f04e7c5435de92017f887839d00000000000017a91445d2743b5b0c11c9255aadbead7843b0cc0cd16a87f09d0000000000001976a91400e508cf9722119fe98bc93e63390307b8e16c2b88acf59d00000000000017a9145c98460fd08f453d3452d81a73f8ba72cc4ac49787069e0000000000001976a914dff99b0c831a5e60f6b6ced14279e4c7d735648d88ac5e9e00000000000017a914f91c86140067786f8210c6381650df4fb762edd5876e9e0000000000001976a914ffb4fbe651c4b7e2c2a4a7594383a6de0009f2fa88ac749e00000000000017a9140a9f25c06f4886eab86691efa1ae48e42d76015187819e00000000000017a91407ba5a1afdf85b78249235bd5b321400c47677b387e19e0000000000001976a914b7aad8d13c2d25a9f093fe4b192e5e68422d2d2c88ac179f00000000000017a91405a5b4a3d3ee7ff5d75efd5580cc6c103b5d0754874c9f0000000000001976a9149420d45738153a83cbfac5a686c84863f2b36d3788ac5f9f0000000000001976a914a1286909f6a5a080751776e546b6aa8043a8b4ff88ac789f00000000000017a91497130f90cfc5bb350e1cf773731f257a4f793b1d87a69f0000000000001976a9141622a44bd374b0683e5e59f8ed66f0b66ebba9cc88acbb9f0000000000001976a914485cd8a37b0cc0b12bca7dffd8fa4a7f0d15e34488accd9f0000000000001600144fca61956e1aea60cfb77e3d0aa70410bfebd8473aa00000000000001976a91489c96b99b2d450cac420770776ceaed56dbc519588ac42a00000000000001976a914c967ec912ecb634c53d5e5d8eec9c80c0f00e41088ac59a00000000000001976a91404def86f05babb86f6b219cd56da9c0eda70a08a88ac74a000000000000017a914fbbeaa79ae5119d6d32bcf6998b5d72e2a4d11668796a000000000000017a91499957d4ed3ceb9e5753d3c3febd3fc9afca8fe05879ea00000000000001976a914629fc124891e059dccfd9c9db4832cf3c52fd8c688acc4a00000000000001976a91408210f16224272089dd4948dfa8bad32f009bff288acf8a000000000000017a9149e136ae7f59b13f892b06981d8b826b07dd3d2218704a10000000000001976a914b5ae3559229ff5100229216ffb3f803ad40e025888ac85a10000000000001976a914cb30e1f4fdc47ea8d2a29880fc26343804b28a0f88ac92a10000000000001976a914b64dc8d08f63091ea9cd14d6a3896290dd0d531988acbfa10000000000001976a9145e354525e87cd5dfc9cd1c56647d1c31ad04ecab88acc6a10000000000001976a91462544242f4abca17be73cea2e0a8ba3b6dcaccfe88acf1a100000000000017a9149fa1e9074dc0c61186de4eafa5034cbbd8a5459087f5a10000000000001976a91428aac85168deb26fef11a89a290bc596e598c91e88acfda10000000000001976a914f9cbbf2d8bf215020bbb0807f24d465d364dd22888ac27a200000000000017a914831f74c2fbbabef7e5941867840d8fb9a0ec7e398751a20000000000001600146c411ebbf3388e0d1dca1a90d81f43f5fa2f4a677ea20000000000001976a9141d000a0046043f86caf707b3764133d3f8712ca088aceba20000000000001976a91434c4cce829008fe87f6d67e956ca59cdd989f25588acfaa200000000000017a914270281c65cd6a563b55c693cd6ea42be1c74d71f8710a300000000000017a91469197bd94fb5783e5f35f11d4489ae2b4eb538ed871ba3000000000000160014021ac898d99af36ad47be0c458251b2c0b184b1221a30000000000001976a914e7eed98bf37449e52027946e4234d98708fb142088ac64a300000000000017a914a4460c5e5413c09142f8fe64de6eb6c79911d23b876da30000000000001976a914cc68c969adc72ef45cdcdcf3674d547375fec0af88ac92a30000000000001976a9145da53bccf0a5b595a5cb9fe505f3370b1bfbba9a88ac17a40000000000001976a914ff3823955ea84e415ad6e944e900df962c73cd3e88ac60a400000000000017a914822d9286f8cc90fc08e68d74649c3bd6b4fd912c8761a40000000000001600142ecc3367494fb90ca24dfeab5b906ef1bfe470876ca40000000000001976a91492d11b6c3969a738cf90365a9e0596658891a6d588ac8fa400000000000017a914334fa045200b820e0fd8eb1a1d0be6ddfc0b3c17879ca40000000000001976a914a50b71c4b68d8eb7857a7e7f7566eaaaa6d9102388acc9a40000000000001976a9145ce15c08b711bd9fbcb07f6f4bfe4c94f8486aff88acfea40000000000001976a9142a0213e8b2c467037b14f697add62a31e6bc9e6688ac18a50000000000001976a9145b253754b6e0f791cdcecac7aa2a2e0eb26e003288acbda500000000000016001479f8f055eb7e9c0db9483bbeeab4d4ff056ba63cc4a50000000000001976a9149eddd6d1c6b41366f4419b3714f52b922c06b5a288ac1aa600000000000017a91428e922a26f6193c139a5a452e6b7f949dba4d876874aa60000000000001976a91469c6b8564e2d013676076a949cc81fc0787a73e288ac62a60000000000001600143485e7ff4a4b7d666ec5f0f85ce57987ab6a25566fa600000000000017a9149458a0dd00ddb9b7cebe64ad12eac6ed4d316e838787a60000000000001976a9142d99d49b87475659d9cf5e05a4d796fc9b923a3788ace6a60000000000001976a9141a4e5b3b4158c6618b74a9022c401f408c6f080d88aceea60000000000001976a914c6d1a89322fef6f4d3aa6c775f6990633901246f88ac02a700000000000017a914a6fe38f07c986d7b926a5686565e8240bebe0a89878aa70000000000001976a914c122e1005590dea2a0a31d004c47c3d420c0b9a588acbba700000000000017a9142e425b6072b10d72893a54673ac117579f05f71887c9a70000000000001600149957e51be8ec248f9a41345dfcc8b8a868e069c9dba7000000000000160014dd1bbc37d394ad6579427fdc9d45a6bd2868a534e8a70000000000001976a914ab0cc0052bdfe0eb3b307653c835e85caaab369d88ac5ba8000000000000160014d07c021c910fec83f5a42df47d9c3ed598dc3f10b7a80000000000001976a914f23d36ef509ba6133ede6afa5c508c3bb6ec604288acc2a80000000000001976a9149a3066829253d067b4ba2c7b0f9335c882347a0b88ac0da900000000000017a9143d89b6aac11694a9d371ebd6b04bd4017f30bcbf877fa900000000000017a91473d1fc375bc5c2e89f818ae6c51e3efa4b6ecde3878ea90000000000001976a9149246391280bebce430a6896245ff926298e6675d88acf8a90000000000001976a9141d73abf68255c8316233f4a9d93b396533e17e9088acfea90000000000001976a914bd2ab191c3927dce7d4384253bb0360dc521fc7188ac38aa0000000000001976a914a6f21d445757d057e37fbf5bfab960f46d93b4a088ac4baa00000000000017a91490b01afe654af48efc8bbe0f7f1e864ce18a69788783aa0000000000001976a914d497eb8c6ce81061527f76eec89be5d37f8f470588ac89aa0000000000001976a914d5f360c61698fb47d226f6782457176805dcc08888ac9daa00000000000017a91439d48d7c4ac4b233851d0ff0f47b10ccac9b150587e3aa0000000000001976a91472d67aae9a6791aa421b3cee0ed9a33a814b898988ac4aab0000000000001976a914bb32d3524adde7349f7001c4195155270f53312688ac71ab0000000000001976a914e3b7f74c7c895a42f5b992108fdf531ab177db1188aca4ab0000000000001976a91407bc214a8107cec4fc75ac4849ef985e4bb2586188ace9ab00000000000017a914709fe6aa179cf90eb56b1e49d26cd6909aaa3fb98727ac000000000000160014b4d9e7f9a27c6ec72825a300b0bcb80783f40e5ca6ac00000000000017a914f52446cb2b93c06f457fec8acb723285f54fd57787b4ac000000000000160014c9854502bf2e07dd3f86a602ec06d57df30c93c512ad0000000000001976a914289bb01b0f92c38faaa51768c485aff73de4573c88ac1dad0000000000001976a9148f153a1bef9c039a44975ed7608781692e47af2088ac1ead0000000000001976a914b79bb108a8567e3685e268bc90f037dfddbd4bf188ac6dad00000000000017a9143bf3d5f095f0862d8269d950851058508b5616ce87c2ad0000000000001976a914b87f1b53a09cdba436f2bdc955a365f86f92d69288acdead0000000000001976a914bc1ffdd44d6e0e06a63e015a9af93d8c541f96c988ac21ae00000000000017a9144a4cba25b68299f7baf13efc2d10f0680a762dd18733ae00000000000017a914f2777f2abfec8acef32e9a75d871607c111553468744ae000000000000160014f7664aa6b1279bc7f05a20156a890fb33bfee91748ae00000000000017a914b68f6e0fabf2c4d5af14a20cff19e5bebd27f82e8760ae0000000000001976a914183d4b299f8eac843346373d3e651148c8ef2a8a88acbdae000000000000160014be594c33eb93d581f986a836ab7532777ceee60ce3ae0000000000001976a9148a76901acef0922c04aa86d9b0fbbbebc98840ff88acf6ae000000000000160014106ac8111da0e5aa11aee6cc42c1532e1ac8265f13af0000000000001976a914365bb7ee05dd12165955f178d95953d89e37010688ac3aaf0000000000001976a914471884de589d110bb11433a08d84b9fb740303d888ac59af0000000000001976a91416fbc1d3e5de7df1bf8b6d0c437be75f4b19fb4c88ac7eaf0000000000001976a914ca0bdcb339cd0154f29b4f3a14a207ada557599588ac9eaf0000000000001976a9142c0dbd232588bda1b49c1e738620f0abebe47f3c88acb3af00000000000017a914acb3ae882e326b940bf7f6847826cf20f16bffd587b7af00000000000017a914d1e04e9cbe9221674e8b3cdca117358e32fa5f0787e2af0000000000001600142007140af5fce511d9df56d00188e25f7e3190ea01b000000000000016001412980f42d6950a55c1306b46c75c1b9d1561f2f758b00000000000001976a91421704405246f7d14d7677139ad1f03c4d9ca45c888ac5cb00000000000001976a914a2aa28152ba12509c0e278fa14e0d2adfae21dca88ac5db00000000000001976a91448ebfb181ff3ed4ce51a87e9191c8e0f4937543888ac7fb00000000000001976a91442803a19aa86adf7943d8986f14409cd48f180be88ac81b00000000000001976a9149ddd8dca2998a27ad9ca44230290cf5fd5b8973f88acc2b00000000000001976a9142167abaa9219dc4d9344d645e1f662992d341eeb88acefb00000000000001976a9146813951813dc5bbce24c4055046b97af4b3b853288ac15b10000000000001976a91431e8d17bec46a41b31a6608ef05b0b6e98627daa88ac6eb100000000000017a9149d0aa3eda1fe42ecb7c64902854b44aedc87bd078797b100000000000017a9141635a83874887ffd1e5372251c2b7a4f151d4c0887a0b10000000000001976a9147de7bd1592f17724222d04937d218a2f0728558e88acddb10000000000001976a91426a7021b6e08601ba03d1396334c48f25341b46a88ace8b10000000000001976a914fde8ed48d3046e799028a372606d67bc6ebc671988ac21b20000000000001976a91412c5fb02fd1288c06167d8c77dc52eb1558acc7f88ac22b200000000000017a9143fd17278bbac9e62c4c69f403bb50c9fa979e447874fb20000000000001976a914db3e372c0a4aa4ec118c01c044e44c3bfb9429f788ac53b20000000000001976a91419d96564856b428093c94117a461cfbd44879df088acd7b200000000000017a914ee6050c6be5414b7c2755c7bf650a3f4bfdff07087d9b200000000000017a91490ee7d6c425362cc9411e37c4d347e982156a88d873ab300000000000017a914a3d9f78d9b71db677803e74e2edc676f5359101a878cb30000000000001976a914859fe0fb2f0f1861f5f32a9539797be62058d1dc88ac9ab3000000000000160014b647578fab1eb4fba85e9796444db7b7a708dbd0b3b30000000000001976a914a0562a2326372591a25a9c021328063d0e662dee88acccb30000000000001976a9141be913b01b54762efd3ca34ed28dabc8ec67840a88acd1b30000000000001976a914610d7bf4f8550f54ed83fbd37c92ff88e550d85488acc1b400000000000017a91455dd1585e01cf8399f6773441c2ea6943e6ef05587d3b400000000000017a914ff7dde956b7b2ba021d8f8ea4dc18e8f6a37558087f8b40000000000001976a9144fc35f066ebcdefeeebef2f1522bfcf98707113188ac43b50000000000001976a914e7399f3f8b47707e087c4c6faa53184db2d2586888ac90b50000000000001976a91483bb2c0c28da600c6f1ecd308faa7c70552945f588ac93b500000000000017a91419887aa06cbf87e4d51e6d88e31bb3803342715687bdb500000000000017a914a38b26f492427abb28f6ca21a1239bb0c457b203873cb600000000000017a914a9120411ba0a7d380555a1286ae26034bddc2107875eb600000000000017a91453a3402218b5f94123aff33cc3c17f30e34b1ecd8769b600000000000017a914dc5c3f142bbebba6503ea25ee97ee9abffeb208f876bb6000000000000160014d17f5753c3983a752644ae8358e63114e7a602836cb60000000000001976a9147cac4cbac4e4c5714724a40ea3a546f0c57c076d88ac71b600000000000017a914c29e66227d66fde0c2439daba999627eb009646087a3b60000000000001976a914c7fb57d4a8ddab83fbb108d8c9fd99fd310b6b8688acb2b600000000000017a914ac50037dc202e57fa0440242722b74a8654c589f87d5b600000000000017a9145ccd0c29536f568c6ccf8637ce78742267f64e2f87d8b600000000000017a9149d80941af8ab283537f3201f13e86355485e6a048727b70000000000001976a914747a164b2401ee87357ef5d0e03b3e6f5bb0d47588ac39b70000000000001976a91446dd388788073261cffdce773dbf619b9ca5861288ac3eb70000000000001976a9142087a9ffcd3b0ea577d4b1663dd02488e4d12f2c88acdbb700000000000017a914a3957dd075badb971b24530bdfea8ffa0db58a648724b800000000000017a914b63effaed249a8e331dd25664db2e0ff0d1ebd3f8772b800000000000017a9148c8be314d2299c19c24a54a15c8b6f66522eed2187c7b800000000000017a9140d6caef832b37cf7cebb410af13bfe9fc2d4deb287ccb80000000000001976a914c38e000c340b6f045e8898c43b6d73f13862db8788acf7b80000000000001976a9140b62ebaec2ec5c5367954ff1c35dde0d4e3cc29988ac16b90000000000001976a91440c29c00bc94aeeb89c54ba40efb698ac20ff57388ac6cb90000000000001976a91400ddec7cac21f95fbc46cbac58d0b86f94e0098288ac8cb90000000000001976a9143ebd487aee2bc67cff3afec931f64183c878b20288ac40ba00000000000017a914c46037fa979b77d2e571ca3f7fe60ceb8c5cb4be878cba0000000000001976a9141c7356e0dfdb3b79956ed84387910789fd207e8588aceaba00000000000017a91441d7f361d55392e745fe55fc33a10cc098d9e7db8708bb00000000000017a914da6303f0d12aeaca47b9d3e01b07f6a262543b3a871ebb0000000000001976a914f6afde03295799a31297f564eb1ab9479a516b0888acc0bb0000000000001976a914a826b36b42ccdb9aeb5ba131c939dc7774eeb5d988ac3abc000000000000160014bb47587fa1f226d48710d255621880bb7b73ea585cbd00000000000017a91437068e2f3ec246883edfe24f774064d3aa75aea287ccbd0000000000001976a914d1a434080e89ae70e7fa696d4dc598cb21354bfe88acf6bd0000000000001976a9145d0ce4d750989fd99e68e5c57101909002f8ff4888ac30be00000000000016001496974b4d3326f7d22c3bca069133fc539a3d2ac290be0000000000001600144b98779687f2dbdaed2c576ef5fa86344e64df4f9bbe00000000000017a914e738fec014727866200f3bf899f1d68ee214356d87ccbe0000000000001976a914e8615220e65b1b4442c1862d5e91eb066608a0f288acfebe00000000000017a914ae5179a1df8e2790d584c2bc68ba7efbe8f400068720bf0000000000001976a91471dfed591c13bf92903533c03fe9543355357aea88ac75bf0000000000001976a91458887e6b015fbc757407a049676eedd3d470527788ac2bc000000000000017a914758f5d680ce46e69fb201bd1a9c9881bc966c5d18799c00000000000001600148918ad3df5e7125b71a4f4a759994910e422d801d0c000000000000016001454a905a9ed904fed57ddf5df1ccaf53683b70a9834c10000000000001976a914fc5d902f3841f6af17038ba2e7f38c39b964cddc88acc0c100000000000017a9149973a4767b4332d75b1cc510301d45c447735e6f87cfc10000000000001976a914171552c6738b5168b33b3253a9fde280e4345e2088ac92c20000000000001976a9148517b991d2cc5671dd9140805b743a93c8df670688ac41c300000000000017a914a1f67c628a1774dbd9df34834f8b9d9043fe2ead87e6c300000000000017a91407ffea31f6c94ab878fdf08d289826103c31ee418720c40000000000001976a91472f8a39ba0f6b96d37d9a6c8068e38250acec0ff88ac4bc400000000000017a9145bd3ecb82ebc2916f7159efa62590618574850848750c400000000000017a91482c019dee3f3cb56e3568e046ccccd2563ee0101875dc40000000000001976a9146fae0d8aee286c967d71b7d0a4056d0256e3487b88ac63c400000000000017a9147ecdadeb4c286b8b0661b720b9783b1303f8498387bbc400000000000017a914d013f9e185b37db1b0de15e137d5c620843b8042874bc50000000000001976a91404e6dfa88f1ce7fa29b71205d26803796df1cdc188ac6bc50000000000001976a9141c687ca5fec90d0779ddc42699dbf62ec8552e5388acb2c50000000000001976a91435b804628f5f1f62b66b9dcd0118bc41ebeb686e88acddc50000000000001976a914c565a9073348408370166a5267f14504914d25fc88ace3c5000000000000160014cdece310f25da665ba0b669fa472e9fed68ff61f31c60000000000001976a914ce8fa8c2d373a2411581745d861946a5600d27ac88ac9fc60000000000001976a91414544202ccfac092101301d3635882f01e3916ec88accdc60000000000001600141d087fcb4eedc4272a73e6e5e1e79b324652618dd3c60000000000001600149b7324e9c1f8fc5ad4ddb049a53d10657c14b3e8dec60000000000001976a9147b83ad050b924ccebd68b0fa69aa5730fabeb6eb88ace4c60000000000001976a91482b8a3ac14539823497d521e4ef59616954e058d88ac3ac700000000000017a91498c96dec4d5cc490d1ca350d0121169fefc1a4938768c70000000000001976a914388db35f5bea9e62966960ca61b22a033bf1896e88acd8c70000000000001976a914dc042fab8a1cc109899783b6d2dd6c87bba9b9b888ac2ec8000000000000160014f34e567cb128fa2a004d45f8b7aca0e58d7ed91c55c80000000000001976a9145dad3f10763c91c4b6557fed00125f9d085bb55e88acd5c80000000000001976a9148f85a065084921a964a878a5e544d8506c9b66a688ac13c900000000000017a914f0e4faee8ad010988cffe7e8fb5622778e40f35c8789c90000000000001976a9140d5eaaadc3fd65604a8d8cc8b1b4be233274a2f088ac8ec90000000000001976a9145f93138d3fb6a2614990e23b3e6c9035a085eb3288acabc900000000000017a914e0dce71c45229224b139ead83fe78d560c40e172872dca0000000000001976a914bc6d604ecbc13b8c8f2998dbf601ff7c11b7ffc988acc1ca0000000000001976a9143da73a40b836bacc53f6a78220ebfee4e1d0900988acc6ca00000000000017a914d41086325ee31a70a8930c43c3af1de24c76d0e987ccca00000000000017a914da7fa8c073d3c29778c54710572bc9b3136f66c387d6ca0000000000001976a914631e78f0b6851e1414670636fdac682980bbe1c688ac8dcb0000000000001976a914fe1b1bc242781df65304c2ba2e76b6c909d4e37688acfccb0000000000001976a914f616858ed237bebe26be5a2d833a18050fa9b36688ac04cc0000000000001976a91474c515b0e105b37b8dd79bf136a33f04439ee9b988ac59cc0000000000001976a91447e2145406b0e90a16e65bbe1561d68661511a1488ace0cc0000000000001976a914db11a0c284501965898b062bc91f55a25e9310ce88ac07ce00000000000017a914b7da455cd6538d2c665cccc90faf5a0cd70b42b78733ce00000000000017a914d0c57ae7c004cc7d144e17f0ee37142358caaf388760ce0000000000001976a91407fb2be760b7cf9c47860052d07c36813c52b64188ac92ce0000000000001976a914ad497f9334d67d4100c9ab765f2a8d6a4ff9bd3e88ac99ce0000000000001976a914da9d71a18de023eb993a84de0150c1d3f35248c088acdcce00000000000017a9140fe728efc5a4c1a6a50e8966dae7a8c139e35b288740cf00000000000017a914a292461a920cd2e01ba45bc3bc0372b7b70ed2478758cf0000000000001976a91455b24d73872346d9c801ba4e9dd26de4f54bcda688ac6ecf0000000000001600147487508c159daaea09e69df39e268c7856ea1de68bcf00000000000016001444b6e5521d497952f4ec0cae510dc77ae6009bc39fcf0000000000001976a914f7f1fac8e54abe21373d6c63ef77236b3435cb3688acc1cf0000000000001976a9146d9e91f8983bb0a312328341ca45d96ae071d9f288acedcf0000000000001976a914cb227479612e030ba287eb479c9d44aa2ead9b0188acf1cf00000000000017a914ca31386e2cc980f7f1c3ac856a3bf6028f9918278701d00000000000001976a91493883ae8724ee9abe62de14a6c1e4b9e6d76d96788ac18d00000000000001976a9141e396705b73ae4d2c7fed3855a1390e5b83224c388ac31d00000000000001976a914230e1c36fe4d326baf0cb94853636243dd955b4788ac4cd10000000000001976a91477474705c5e46d4e985e0386d5d0b58d90a6f81088ac8cd10000000000001976a91487f09654ddf59bb832a258deb199a4fc6fe3c78288aceed10000000000001976a914a5034a4f5f7573371e83d51fe2acc087d6cd565f88ac32d200000000000017a914897f46e949dbee0d7d373588edbd898876e4115f8763d20000000000001976a91474eff999a0bcc132cf256a589a66b32af861f3c788ac86d200000000000016001487f748762c5997a3de72fbade73b7aeeb706f8c3d1d20000000000001600142a9d119799bfc39e19cf1d7f0c422eba2dbaacaefcd20000000000001976a914583ce93c4cead8699f1c0084c639a8bdadda205888ac35d30000000000001976a914830376af8a44f6c10b8a80cbf256a6ee8554ff8b88ac3ed30000000000001976a91485570038e11aaf2191c1ec46b12bdf056cf3efdb88ac4cd300000000000017a91406fc0cee86b3e2e7ce1f10902a4f6c358096608e8754d30000000000001976a914fc5aaa94688fa6dc212459ae3f2e84c331c4140488ac69d300000000000017a9146fe7f9e289807b942a4dc3781e5a6e9d04d10832877ed30000000000001976a914ad679ff72093405bcbc43f592a718eca12dc64a188acd8d300000000000017a914818477c06c70c8c845abbdd75ba58c9da062102787e3d30000000000001976a914ff2d5c593425385116c152996a7dc44640cc473588ac5fd40000000000001976a91403f084d9d57e3053f07112e54f2e8e9f8380977788acadd400000000000017a9144b6408059669000416c0db79fb3b1e08f932dc8b87ded40000000000001976a9144b2634b069d2e0a381a0667f1c22c39d186d253388acfdd400000000000017a914fc0306b79cda9a085f808477675e49d026dc473b8745d50000000000001976a914bb84254772e05db2eb0dca8d316604bb7361784488ac46d50000000000001976a9148be526f5bef73f9ba94acc1dfc7dc94baaa83bf088ac6ed50000000000001976a914a722a385a39fa60914019ac287a34885d90c3d2588acb7d50000000000001976a9146d9edcb2f828bc882fd23a5fc66c95d725946b6388acd4d50000000000001976a91438b63386cbf36e813499f30c9d1a3b18d34d026888acedd50000000000001976a9143ea88b6c56c54aab646c6a1f6571ab34dc4e438388ac05d600000000000017a914684c79ac5ed6876b724b8943d12067c0a886a1e78710d600000000000017a914c8855e62cdb67b59150a3b0d4156d164c854b067873dd600000000000017a9141e0af32f5915731127b6960bf4df5a1f293ae8be8767d60000000000001976a91447234769748b281f91c6905a4e69c2a62771db9588accad600000000000017a914644a1b0d0d09535076d18ee9ad06d1a7db7900cf87e2d60000000000001600143297b525a31018a84a37a329d40b4e6db71e367bf0d6000000000000160014f34e567cb128fa2a004d45f8b7aca0e58d7ed91c1fd70000000000001976a9147c3bd8a4199f45bd2566ac38d18b04c8a3c6983288ac45d7000000000000160014686de65592a5599558b44600127cf58a4adbf37873d70000000000001976a9140b3551555f35dd576cd55d0531eaf41df1d4a01288aca6d700000000000017a914171f9f67345a69a52ee216182ec943f8adbddc408702d800000000000017a91403d6cb2e54fdbe8b84f2444ce68f131680b93843873cd80000000000001976a91417f5b527c725a9e3b2043b550fa393798619719488ac41d800000000000017a9147422d519d0357479d221b9a2ba5e83d65aa39e3c87a0d80000000000001976a91446600a61d4b3470545ff1f069b37ab23b6adef3c88aca2d800000000000017a914f8b12313be3ac7dcfefbb8538192e95e0e9b993887f4d80000000000001976a9146a62fd1c5cb4a16ed844d99d11cb2632b8ca90a288acf9d80000000000001976a914f0f42ebba924a0eb8a89b77f0addeef407be54d488ac4dd90000000000001600143723f3ce5b160c190ce9db48a7846c453d2bd28351d90000000000001976a91424ac50b39e2c6cec4beed4aa6d6bb7953d46b9a088acbdd90000000000001976a9145160187aaec8a9ecd89826c4f675e82b3780544c88accfd90000000000001976a91406ab0e41176b2c0b810dbc33424c8345c777aa6188acf4d900000000000017a914bdbe12ba1474dfc6fb12cc800e923c04edbd15c687f5d900000000000017a91400fa3e6519ce910e724ca466b9854f71717f8adc874eda0000000000001976a914a672274da17faa452be7abfa46a7fb77f0b0b54588aca7da0000000000001976a91425f69038a4d523348d253b5b861f09067fa3139f88acddda0000000000001976a914f6c6f58f0bd2365766d544bc50148f6d7779a1dc88ace3da0000000000001976a914db4ce0da9ca7cdd75a5714cb7d113b79ed549f4188acf9da0000000000001976a914b5fb381b5b3583bff99c54d6a7d743ee766120bd88ac84db0000000000001976a9140a7c55cdd24cc31968103b9e05b47f564f7df32488ace6db0000000000001600145ea0e425721cb3e3b31ae4a5409bbcc3c7ef4ab4ecdb000000000000160014a28822e4bf1e7106b078a8ce52a88bb0e37bb8e841dc0000000000001976a914a2a4c5f53d88b520535ed2e7dba31e51ca86a0e488ac93dc00000000000017a9147b75036a3722345d45fc89458c18c8be450afb818747dd0000000000001976a914e1a06bfe5f97a6f24da2f11a12c58c54f4268d5088ac7ddd0000000000001976a91446098ed9729739f45fce939be74f366f283d841c88ac9ddd0000000000001976a914d72d141fee4f901fea6c4f8c5728db258e19241888aca1dd0000000000001976a91446e3401b88716ba52c32763aae4fec09f41e18f388acb3dd0000000000001976a914e7c8795fd43948709c49c0676737652a622a41ce88acdcdd0000000000001976a9145b57ed0b272b2d81a71f744a689690ff5bfda34c88ac82de000000000000160014ce9f1bf3fde6444745c1242a4c659d92200f3599dede0000000000001976a9146f24120a7d91afe4112581dd3b9a2675a0c4e05888acfcde000000000000160014d4bd4350796dcb3f48ebccbcd580b1b65f642b8a18df00000000000017a9142edf326229443ff44114fa3c1f3c2178c5d90bfa8752df0000000000001976a9145e22dd246cdbc9b926f5426a09c54fe3f60be06288ac53df0000000000001976a914fc314e1d4368b54d4a843b40a915536ea3fa91fe88ac57df00000000000017a914aa42fa0f7c99955e99b57d67248fff19cb7f7f9687fddf00000000000017a914c81c605110912c0e58826b17841ac8d0763de1ea879ee00000000000001600148dd270366bc3278ee0fe95729948a5c11a2a39b2bbe00000000000001976a914b345e8e4764d3601515171da5f5c3bdb9e96ca7188ac36e10000000000001976a914a797a754231eef25d99a61b0172965c4140db7d088ac47e100000000000016001437fd2bf5fc41146fa53dc5c623f8d530466a9a8c70e10000000000001976a9141f3216cbe77896be6684cc06a7ce4e7fc2d95b8488acb9e10000000000001976a91469eb11f63aadb544c7829b83736a23dd9d0cc41188ac50e20000000000001976a91447b0137098369507949019397c2621cfb840e74488ac6ae200000000000016001406660164942bc3b9c63b7ddc82c034a7115ebddf6ae200000000000016001406c23c0320fa35fbc9009db251b588c1883683916ae20000000000001600146e6029ab605386f92d935a80153c4f95bf2397256ae20000000000001976a9140ee08cdccb11409c904fe654e70b62a5c0d7491588ac6ae20000000000001976a91432203e6b169afd81dbe37cbf2713ada7e674b35488ac6ae20000000000001976a9144725f45b88a37d069e805773552a955e247f454e88ac6ae20000000000001976a9144725f45b88a37d069e805773552a955e247f454e88ac6ae20000000000001976a91456429d1fd35b619cc4981c48e18c17a8bc9f55fb88ac6ae20000000000001976a914566f2fc9cef162313e09ea4fea278994286ea83088ac6ae20000000000001976a9149ea42c58bdfc4310dedd1866622b513b0210ee0e88ac6ae20000000000001976a914bc801b53ab73f1630fc1806b4e7cbd6865e8944e88ac6ae20000000000001976a914e5ee9cc939c9a84d5b9c2436dd0849bb5ad31de388ac6ae200000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63876ae200000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63876ae200000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63876ae200000000000017a914243bd59bec7bef27121a11572469d898568557c0876ae200000000000017a914328e85a257baf4b1a653c52136cfc7757e2e35f5876ae200000000000017a9143a4ef6f3a4f568136da34dc3c081de09a16ed122876ae200000000000017a9143a4ef6f3a4f568136da34dc3c081de09a16ed122876ae200000000000017a9145194d87ba7fccdf97322430661a9edffcd02f7c9876ae200000000000017a9147a97082e95674f2774c7fdd27208591bb84f7b31876ae200000000000017a91489181e84e1944fbf9ce43b8355bfa27b358b6c47876ae200000000000017a914a587cd0522b7c6460e2fa508783410f59decae7f876ae200000000000017a914cbcc0d5616690cc98df8e8b139d38c8e0ab11aa9876ae200000000000017a914d5a1d9d6ddba094bffdce7b04fd718ef631a56aa876ae200000000000017a914e35abcf470a513000a1e345d7bb8ae65dda0eb5a876ae200000000000017a914ea285af8a3658a44194af741bd51448674d9799d87e5e20000000000001976a91457d8f29b0c65fc6e07bda8b4306f37e23ac2324a88ac45e30000000000001976a914e4fab4148dbeec70cc4a2c94b7543c7e8a21c74a88ac8de30000000000001976a914828211b81294c0d814610f99f56aab1442c9e63688ac95e30000000000001976a9146bca339ba52defda45ad728535831a8f57426bf288ac3ae400000000000017a9147f393812ef1189d7eeb932f03ab878e1ff7bddd48779e400000000000017a914ac1b8d8c5625d1d3c8607643f278522d9344f790877ce400000000000017a9145060e685bfb584d1f1c75d22d84cfe05a11ad61c879be50000000000001976a914d49c28f43cc2b57eac37a1a7895611c00317146988aca0e50000000000001976a914c7bfefee748ae91f3ab02ef37920e45a1f177cd288aca6e50000000000001976a914d3f9e58515350df8baca09b86ea57cbca83ba34b88ac2ce60000000000001976a914d305ea80ad6405b95fe354f480552906f48f493788ac63e600000000000017a91487e7c6254eaaef5800700c175726be01f7be7d9e87afe600000000000017a914ba6d13b0400a087ddad0dc326d44a4baed12413987fae60000000000001976a9141ee75eec610aac5b54934723d0ec75ea189ffd1488ac0de70000000000001976a9143bc2924602951b815f5b04ae1910061d8db0574288ac60e700000000000017a9149bfe6ca19089ea8c0f38128464e7132b8df09e3d8766e70000000000001976a9146695ff00e49bf621ec48f4e773f987ec8f5c609d88ac75e70000000000001976a9149d615bd3c3d3dc2206504a7ccc909f1689b09a2788ac8fe70000000000001976a9145eb50b8b1b927242870e972ed7e37cbf150664c588acc4e70000000000001976a9149a804abae95fe74c21018e0c7d6a53944f7d20b388ace9e70000000000001976a91414a90f98bfa6f31d4049343f4f9a7f344ff6466788ac11e80000000000001976a914a9db7ad28fad84bae3b700c8a6b5fb4baf2e448988ac6fe80000000000001976a914e3d3167b970bc22eec8e4d18da0cb8205086161988aca3e80000000000001976a9148856bada18b7f08af2cc03d58fa7339d918f5f5b88ace2e80000000000001976a9140348dab9911094bddd4cbefa4e9c3485ac2de3a888ac2ae900000000000017a91447429beec9ec2c84f9cfe9a536c003f3f37d13f28731ea0000000000001976a914e13d10856b7a1b718df197172118aecee52528da88ac39ea0000000000001976a9142ee5b9f2181a3c0654520591af061e3afa92fe0a88ac57ea0000000000001976a914b55a32baf5d7be01dca0855692adb6745c18d7e188ac65ea00000000000017a914aa1c56c6cb42f275e7ee4e5299aab51642d902878786ea000000000000160014dfb59beda80bfc2e2a6022ddf36e88457c8ea501e7ea0000000000001976a914a712e4657b68725db0801623b59076bc652a878988ac1deb0000000000001976a914f81b573a5ecb0b8fa2e4b2e4cac376105b1cd10f88ac21eb0000000000001976a91406070ba99e2ea8515c67660df3d1237951fa84ec88ac51eb0000000000001600147a7d9b899e3ad6e43acf78f681952aae9cd0157ca9eb0000000000001976a9149af8dab43914f2a56d141d1fd8760632373a756188acdeeb0000000000001976a91407cc2e291eb3e86f4db4de09f03a6d966e6b435a88ac0aec0000000000001976a914ba674a5265ad849562a0a2fb1576c7e83428da9d88ac37ec0000000000001976a914a5bf10cb70e2be350f69ca097e65cd6eed49157d88acaeec000000000000160014c684d55387e1b7810ff06aa01511a7062c4ab988c1ec0000000000001976a9141fc797499c7a549d7c945ad77232cd4d4f9f62d488ac0aed0000000000001976a914e1b9d781f17a3b32a14906a08ecb23bfd9f2d85488ac92ed0000000000001976a9146f79b3c4128fe58792866a07abbeda3e6ba715da88ac97ed0000000000001976a914b7db9a517c1650ef31a26d8c2b4603c26bee33ec88accded0000000000001976a9148857add0c985576fdc6c3da5589f791928b9977d88ac5aee0000000000001976a914650517c99af7da3f0f2b31668e23bae676fa027488ac8aee0000000000001976a914dbbf80be35623fe2ea41bdc94eab1ce32ad22c6988acc1ee0000000000001976a914c56d6fc65846165bd2a6115d1c4dca250d8f5d3188ac37ef00000000000017a914611e5c12a409b2127ef6e27beb127a6455b8f8568792ef00000000000017a914c27d71b2de45760070bcf7dd875e83778ed309c58716f000000000000017a91478d62c978c169fea2521a3c5451fe27d40a1712b876ff00000000000001976a914fcce2e45311e0dc1cfede4a8d0c57444a5a3be1088ac1bf100000000000017a914964fb1221659a7aa19c62fd30f1d8a0d3e5f435a87adf100000000000017a91481b319b670859f6a5c7738b55a6420852aa3b0ef87c7f10000000000001976a914e515a9e94f2723e3d9c839a92b9744e20899f60c88acddf10000000000001976a914bf15cf1ebe5a74b991fcecfd38e877009ef0d4b688aceef10000000000001976a9145fa84ccdcbabccc6742482a184dac1e117116a5588ac5cf200000000000017a9144e193c72c886529df60cf6a0c60eb555169fb9aa87f9f20000000000001976a914987c7418683d1c9ce23cbea338672b60a5a75b8e88ac09f30000000000001976a9149d498ec6de18ada30aee12d37f5b0df4e6ba830f88ac2df300000000000017a914e89b53555e402cc570cbe5b70045f18261439d32878ff30000000000001976a9142d9626051e190dd93baf9e3615a6305417b2807388ac22f40000000000001976a914215f601f6e0ab22d413d9a94545caf7de26409d088ac12f500000000000017a914346a11128b94c2c7b60fa02d82999da7fde7a6af873af500000000000017a91439f49f20a6f6140b5fd879093b5b9a9957f570088752f50000000000001976a914f3c9caea193580aca51e4492d6a83a67a923bbe188ac5df500000000000017a91482fd163a322ee193324b8f64c6a5589a0b2f81e387c4f50000000000001976a91407a9d1edc30858741875c04562c7f50e3c26d06c88ace9f50000000000001976a91466643c17709a5ef5238a36d688f8b7bb1f7bc4c888ac2af600000000000017a91463482652c5b678251c2aae80ff6eb6b24f8760e0876ff60000000000001976a914d8064d7210c11936aa0124e49b87bc5e5b357bc188accdf60000000000001976a914a3fd093e967bc5b17c0201a35b40b701d0e78a8488acd2f600000000000017a9140b0776e37416d93081447b1307aaa9af0ebdb2448769f70000000000001976a914ec130703682f2bd6e1c124486d4fe8131cdd092788acaaf70000000000001976a9142e47c3a261296ecbf99b43a5d37754ba03ba3c1c88acbbf70000000000001976a914ab403db2537dfd2b533d0c28b2697c2c721dfbae88accaf70000000000001976a914a26810facce1f266dfa107b5c7646a7db23f204e88ac1ff90000000000001976a9146d977b3537fb5093a3b323c6b1fce7777a4025e788ac69f900000000000016001457a956b6cf6a8a1abb4e04bd7ab5c326b831d64770f900000000000017a9146d7c5b7b9b10a399263f0c0f1669e6e5f711c48f878ef90000000000001976a914e6e1dcf150b0516020af001b287e2b6b3ab25e7e88ac9df900000000000017a914eb66ae360fbb2092c43c79acb94e96e2520d6d5687c5f90000000000001976a91411695414504aee8e4bc7b966d27652784ffd7a5a88acc6f90000000000001976a914e109c120c7dcaa7d98fd5e90cd6cb57b29bd624988ac46fa0000000000001976a9143e8669a69f422a6941479bef0e80efa3c6c1cc1688ac77fa00000000000017a9140a1f890051786b58abff7aa2298a82218ca47c2d878efa0000000000001976a914fe773cacbc4faa956bf58c0405a2213631bb272588ac96fa0000000000001976a914662b3d14fe0ae1c3d21a34eb519fa78914c9db2388acabfa0000000000001976a9143b9f604a4584e71767aec88356e28f54e302bf5988ac13fb0000000000001976a91488ddb1fecb0023821a2abc8bf2c2fb16066ac52088ac58fb00000000000017a9148f6a50fdac13d12992cfac0d25dcdca9356d1ce38769fb00000000000017a914c3ab9623078a8d4e856dade6e4f836b832e01ebc87a1fb00000000000017a9148702a51346a38d0a8fb9c15e85c998d77b38ec7e8715fc0000000000001976a9141e4813bb311dac379153f228de93d75642c1ae3d88ac54fc0000000000001976a9143d38001c6a3c5805ebfb0bbde1cebfdad9b09b3088ac57fc0000000000001976a914ad1ad5e30d15914028492eab71541c6032ded27a88acd7fc00000000000017a914bf41e1323c2370876f7f80e6461126769f7dd62d87dbfc0000000000001976a9147f3796bb22c8fa6ca75a11746dcd50171d9115bc88ac2efd00000000000017a91424404da4d94710568ab8700dfa8e5bc4a01e59d18793fd00000000000017a914a20b8d9d4256fa9e551503106c33577cff8d539387d2fd0000000000001976a9148d726c6aeb23fdf1bbffe3cfddd3ae050121e48f88ac6afe00000000000017a9144d0c6d8f49a83fed1d66dfa61849cee4e837a6b5879efe0000000000001976a914ceed76e4ac75a49b78d148521c96d4a155b9efa488ac37000100000000001976a91407bf9b2ee4f4e476273c7a2d447e823987bb76ab88aca90001000000000017a91442dfe81b5d2b8a95e11918d8b68a7909dd092d5387f50001000000000017a914f3955ce91ac37eaceba5792a15b0dcb9746171a687fc000100000000001976a9141c1d49f089bc1c96ff1c578fede10932c34f433688acb201010000000000160014a2d0f20ba8633252aba5427621e1f58584f9eaa8e501010000000000160014cc5d7c3ae826d80f15af54c7208124813ed34cbefe0101000000000017a9141b9dc49710352fd51033138ee21dc28162f07b0f87170201000000000017a914e4304fcbcd52792cef363ec6f57d80f5e2f1bf6e8769020100000000001976a9146834a6cc0fc76a6fc1f82be1a3edfb42fe238a9188ace60201000000000017a91473f2ab94f1ce73896e20d40b9b99e1d47de2b3f8872d0301000000000016001461c2e19791230b9e605cf06665b9d3d9f9902b2e92030100000000001976a914a830ec034301e449451a5e929d4d83593c7e5b6d88acc2040100000000001976a914f21f76fd69e9b5b0799cd5bcb0c29f32da277cfb88aca1050100000000001976a914c940ce9950133f63bd8ea514083199d3c5760e1b88ace9050100000000001976a9147d04066d2abbd9c9576811b7973434141c5f7c5e88ac0a060100000000001976a91477a5e99cc6381a7e00275b9e302bc0278a71581288ac19060100000000001976a914fa671b0750962906f2dea9f0596291b233baf77888ac6b060100000000001600147ba9ad1f7f116a5be276bc70dcb25f2244dca240eb060100000000001976a9148fca6dd2d207f9f81bfa131afc1b781f2c5b297388ac7b0701000000000017a9149ffdfe50d3e9f29b701d8b71e0cb360859fda5cc87e6070100000000001976a9149574aabf72f591ff927fc43b145f58c01e6b6d4688ac01080100000000001976a9140f52b4159dddbf1f84c6106907784bda7a323dde88ac190801000000000017a9143421fe674cf4495cf7fc8794a0c3a2b0fdb0626c8766080100000000001976a914e1cbc42ed4679ae137ba0e0300407905550394f688aca40801000000000017a914f2bf3b42f27b17af5863f132a1a24b0f97daa780874d090100000000001976a9140262bd68d1484c464a0c7830144bc39e1ce5bf0788ac8d090100000000001976a914e1a9da7e4b6f9251353d4c5a39683f962755121188acb1090100000000001976a914524d5b40d757d9dbdeffa713520b70dd4fa17aa188ac2b0a01000000000017a9140221f1137629177de4ed420dc4f0dba2bad64c6c87320a0100000000001976a914cd9ad99ab0b822468fa43af6bc0ef2b13a3bce5588ac740a0100000000001976a914d3bb0b3ed5c7abfadf52649161591fcacb3980e388ac850a0100000000001976a914495646fc999573400872354860b77e51abde992188ac9b0b01000000000017a9141f36db8ec5c0c72d7b4f143d63d1de06a8405a6987ae0b0100000000001976a91417c33c5303e4fce3c3614b1f99f597e4821a4b8688acef0b0100000000001976a9142e132fcaebf54553c39254b98e46e2f7a5c28ef788ac070c0100000000001976a9144eacb5ffb01fd5680271360d9a11ffc9b750ccf188ac1a0c0100000000001976a914eba559822a304d05e77cb24723e0a54e6c3e20de88ac480d0100000000001976a914d7d3207c196454c6705e3fd68bc7a463435da7d988ac510d0100000000001976a9140edec3b151f5a1cbcad3facde19255741a1623cb88ac8a0d01000000000017a914596910a2d1768505187b1865610da688ec42acc687c30d01000000000017a9140d491c9f4d07fe35dc5835186ad3673fb6f8644587080e01000000000017a914cdd96ad3dcba2496ab6f64f1d0e8ce0752f1ed9987290e0100000000001976a9144ac2960451d68cc3795ead36d7f2f6f10d77234988ac400e01000000000017a91462de2629c451686ee92a0a08b81094e650e9052287b80e01000000000016001439b8b045ec16e7cd558c270276767ab79cb28ee4bb0e0100000000001976a914ed6c908be2afa6c5068ee140dd6f84cc8114a15d88acf50e0100000000001976a91414426a37e07cc8a5f9fd4303510fcabe384c6fea88ac3e100100000000001976a9141d50e452af21b4309a72c8132eb36d28e4039b3488acc41001000000000017a914c245b07cd0bf753d25b9982e771cd4694b8f789c875d110100000000001976a9141045acebd98e10140922512f2847572b5a54f28088acda110100000000001976a9144ef4e843e5a614f277c2411e50cddf63e2848ce488acf111010000000000160014600a089c3ea55c4e53cf0dafb1113eee1180c1a137120100000000001976a914199a575b4a6e279395302687d0e7c2381ff22fb288acea120100000000001976a914dd145b0a7ecfa756ba6f9f19d2ff487a5ee8805d88ac491301000000000017a914320e493854a6ce6256c59dcbf85f9ae3b6d1f34687731301000000000017a914e861738f4b042613fc9f400d303e3010065892108764140100000000001976a9147d198f1d68b9fb0f36f1723d53ac6ea01281923a88acb5140100000000001976a9145b3ce57d7eaaf32d0caefcb3ed2c71bd8055343988ac55150100000000001976a9145c289c4718d171931e78fe8de5ae72ecccbacd8a88ac96150100000000001976a91472073b2c105be2bfc87fa4f198950f735fcdb09788acd2150100000000001976a9142011a3eaad4b3863a97818239e3d28526550255688ac98160100000000001976a9148c22c33dd80811894234cdc61a532f9ab73c273088acb4160100000000001976a9149ee1482d5cdacc849dd588560388fd09aa4e674a88ac231701000000000017a9147c5d680b3311167b8d63932d82c263f7e83695d98743170100000000001976a914e82ea9e1b0b9b13e1e509fc88f5d9a0b2440423388ac7f170100000000001976a91479281afe2c8faebbc5c219ab3ed8defae3cd48b688ac8417010000000000160014f934f024448d99b8674edbcb63fc84af89ac414616180100000000001976a9140a5231a4a8f09b19366631b1362bae97082bde7588acd1180100000000001976a914d9b68f104de666e4ce8e8b7fb6771e209b3728d388acdf190100000000001976a914e4e8091a7a8d6e4665ca369d937aca718b3afa6788acfb1901000000000017a914fd2e537cfaada5cd8670a047c838f32258d8a09d87c41a01000000000017a91475563ff0a972729a6d25fea0c171a0270bf6a95487e11a0100000000001976a9149113da9cb2d7b86de0d3221ec7d41076cca65e7988acc01b01000000000017a914b7ffafc12b57a88a17c81bf833eceeb43e30a61787371c0100000000001976a9145726f5a5c4ee8e900d1f3264bd5ea64ca26e222f88aca21c01000000000017a914976e612eed6b45587b6dc7a8034ec13c310ed9c187091d0100000000001600145956ebe07a307ca03de6d2dc9cb829e9a2c143f3851d0100000000001976a9148a0f6cf0abb9da362aa6c0b304eb0c46b7dbf49988acff1d01000000000017a91430a0f5ea8b7385b97938f42b7f1036d15b40bef387191f01000000000017a9143856acef16baba6cabfd8869726e0f8a5f5b8f0987591f0100000000001976a914f8c9c2714a912ce0dfb2a547ab1cb835bee6aa5d88ac691f01000000000017a914e4c662dec4756fdf4b3dfc292224a28d6e4bf1e8870d200100000000001976a914adf3855372d4cadcb3e91b764dad90bd16af73b188ac17200100000000001976a914da7f51784f55453c99340076d2b5ce788c6d216888ac62200100000000001976a914536568c58e5592bea431635b1e135c2d4384fb1d88acae200100000000001976a91450edb242d12eeea114971cc532d1b4332684980f88acf3200100000000001976a91443565fe252eb4c01af8b1a92e6cc67c95bf6ca5788ac2f210100000000001976a914dfdff3c5d8cc0cb178274f356a2e6ca78ba8a56e88ac81210100000000001976a91445b398da1ff63db103444891d8fca20ce547fc8b88acb7210100000000001976a91462544242f4abca17be73cea2e0a8ba3b6dcaccfe88acde210100000000001976a914546cae817892fb2d05a1814b7199421455671bef88acfc210100000000001976a91441f7d706d9a0e1e57abd74b6e3203488b6296f3888acaa2201000000000017a91439740e6eb9f6d231543267d1e61804f8ff7822e187e92201000000000017a9143b3d9a0752b94d3c7821fb3af91279dfcfc0bdc3873c2301000000000017a914d9565baeb55c73c2a5b9b6a2ad67627505f3349d8792230100000000001976a914dee381757a6f0e9e9373ac9a338b9c0636d5919488acbd230100000000001976a9149b0717351f16074b54e332bac49237c170d5c8f788ac282401000000000017a914afcb4134e4328bdb81d5c6cde1a1c494bd2ca2f88734240100000000001976a914bc49a9bba0525487c457713d24cac64c0741a4b588ac412401000000000017a9146297e37f123591595d48d9f9568ae7a088abd63c8782240100000000001976a91471073c62186d46b5f823ca79ee7ae3e5494b336188acb424010000000000160014e64d7936f1285604506cef227553d0bdacc0b4120e250100000000001976a9149c76216c2ec5132beeb899ed9c2d4147d53dafac88ac13250100000000001976a914dd23f0a206458cb9e0a40c33351995163b7b9b5f88ac9a250100000000001976a914536cbade16c128c9d7160418608140340f84d0ca88ace62501000000000017a914ebd6dad1f1a6c95ec87e1d33736aa01c44eddbaa87f5250100000000001976a914b95c69a65e5afa0b868459b487b85eb0175c68ba88ac3e260100000000001976a91470112627832336814b4b09f2d0770f517087369688ac54260100000000001976a9144a6d76037fc5cb40e93975173b80159980d7c3d988ac5a260100000000001976a914be915eb1c23e7faf1396801a7a2cf437d649294a88ac9a260100000000001976a9143127c92249ef7ac25447d9631626af703e316bc388acb9260100000000001976a9142a3992decee30a668de4eaef5171a8426bec97e188ac1127010000000000160014460bb46f7892502e7f12b288950a5f383e09c900842801000000000017a9146a0d88790d995ee56b801f8773851847ec9917ea8789280100000000001976a914c9600e92d977dce398b53c18289595c590f6e8dc88ac41290100000000001976a91402245fd3f00c288b46e2a92a27ff760717659fe188ac502901000000000017a9143af166ca7b7fe407656cee7be1c6635f69a7c62d87142a01000000000017a9146600fe0bc582c46c447499aeaba7db97f1c6c03e874f2b0100000000001976a91427c334e7a407c8f7919e4b2decd1176a8e36a52a88ac722b01000000000017a914c419e561119d0f724ffa55c81fb8e9e0ab46b77287812b01000000000017a91407b588de0ff28d12d057a57b767ec6c08ed2f765879f2b0100000000001976a91490af824152381e776c64a0f00fc9dce5a25e155788aca82b0100000000001976a9140838835b53da43345d7c97f0c636d340ac46004d88acc42b01000000000017a914bdf8ff17371432e325f93cf97c402fe53bea1a5687012c0100000000001976a914c59a0e65b9aeda8f290f498597eafb055772787d88ac982c0100000000001600147a58bd53d7af5381c816e0fe7d9e6f0e8a313639c52c01000000000017a91430059e593c77525b7fc8663be495481264385bfc87162d0100000000001976a91489a70e86ce7226e3c57ea9b3870d4325e5fc67e888acd82d0100000000001976a9141696340a26cf3c75f921d998db024d8b70c0d64b88ac072e01000000000017a914b3000286349644af79417e3175c4f5f1f6c399cd87cc2e0100000000001976a91462a9e75496aa8c5d259e79522bf7102b22ce6deb88acb4300100000000001976a914910e9f86511a391d661bf6ccf078bebd57ab004a88acc93001000000000017a91444a494dbac89177a18c0782266d4d6077df05b37877a3101000000000017a9147f0695edaa2f92c4b685c94155ef5a30cc3b19d48702320100000000001976a9142717e0efaf219dd4340c670aaf80b525c2c6842788acc4320100000000001976a914a22cd25dbd630d3bed02afc8d205ba889033423e88ac253301000000000017a914e1e056fcfe1825ea24b42db873c1167bfaecaed4876d330100000000001976a914e8e5aa35a1c4e62a5024c940fa6a397f894c4ce088acd3330100000000001976a914acad1540381c6ac21cfc8b56c5d576f69bd9c05988acd7330100000000001976a914442f13fd0f9d97e894cafa384351f128f12188d588ac9c340100000000001976a9149783e2fdd4fa48a0887eeafa3a27675e415b90b188acb8340100000000001976a9141e8700d3792f8130ea25ecad3ac5f6c246e7fabd88accc3501000000000017a914e0938acf3716c470bbab5c945e6906a3b0ed79668729360100000000001976a914c815a18e3ed39a52fa01e6112822a2d69f8020fc88acf8360100000000001600146267fe8951a7c7d48c0e25e6128d590f93b0a51e5837010000000000160014bd5eefb872a61b0166de086158c8125d213a8bc9a9370100000000001976a914ce872f6ef75d49d0a19049509a23a92664a0a9f188ace7370100000000001976a9143e86071947170607c25a7f8a890ecd7e973bbbdf88ac5f380100000000001976a9144dba7ba213dd44952da3c1c5556f50a87f8dee9f88acbb380100000000001976a914778eef971218f992fe20203187fb0879f3572f9d88ac6a390100000000001976a9147d0a84c8940e3fb9c8340b557ff178b90f928f7288acaf3901000000000017a9146500c632449759e9c31874fdfdcbdc14a89c393c87773a0100000000001976a9142fa38129db3e92054dd2e7a5a57e1c9deaa14c7988ac773a0100000000001976a9149d4e8a54dfb531c18395693ac923c8530077af9688ac773a0100000000001976a914a76c26d13ec658cc70ffe97b05c630e640dceb9288ac773a0100000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac773a0100000000001976a914f3685d0b5764ec36b36b4225dc8ce4823cbb5a1e88ac773a01000000000017a9141855b9a508e61b94d71af6d4c34e17a4c1f8e03287773a01000000000017a91426fd76ffb144eb6ba89703cac57aa1f8a6102d0f87773a01000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87773a01000000000017a9149a3037ed694a228703308f3c1e87f1c07c6b9b0b87773a01000000000017a914f542c479d6e99a7424c6509a14f216fe6e7b43f187cb3a01000000000017a9142a832e914d875ffddad7c50f25b71bec0b9b358d87523b0100000000001976a91458887e6b015fbc757407a049676eedd3d470527788accf3b0100000000001976a914367dcbf3992e22bfc326a16e9f1e880b5b67561288acdf3b0100000000001976a914339b5ab0452c58877e860a83d807727c7dd1199588ace13b0100000000001976a91490869e24918a390b870f38afa8b8db3135334bef88ac693c0100000000001976a9146d33d353e82ba5cf151acc43e4ea3977a47cf09f88ac7d3c0100000000001976a9148d51c6ca50d037325cb4edae35e125370498e36688ac053d0100000000001976a9144ab4b59bc5a9a8cadbfcc6992a27345779040ace88ac0d3d010000000000160014edcb5985298f84c36feefc81b77c53948428969b533d0100000000001976a914041a262c5c4cd314d0c85198387c3b3a6498887b88ac8e3d0100000000001976a9141c1b44b8ded2ec37e8be8b8a00a2ba2fa0db266088aca93d0100000000001976a91426c4dae9b2fe094c509aa9ad2f86fdcf469ec70688acf33d01000000000017a91493e4065b58463d89758ffbe235633de2b87798d9871c3e0100000000001976a9146dd0c79a695e460a354c7e9513af751dcafaadf788ac3b3e01000000000016001480af194532d205c82adc9474e4904ef832588b1d7d3e01000000000017a9147489ec9c23e55be7029d32713d380f0ed541e40987953e0100000000001976a914e28aadd90d087bc2ec351b3a551b99aa2a1fd25988ac9d3e0100000000001976a91409602a4de16f8e0c462fd87348c9587b4eee750788acd73f0100000000001976a91493958d04e5b356dc2e84add3552b434d8a573a6e88ac894001000000000017a914ce59e37e87fb7c2626370c756b6e9047d4a0dc6387c9400100000000001976a9142f5085ac793b487a5cda7ce75eddc4a7b8582cf288ac804101000000000017a9143ef2c8f4296d6d628dd6f9be466e36a8663ea19f87ac4101000000000017a91472703d17357ca12794847081b3715af9ac5ef00487d8410100000000001976a91435555f0424374bfd94b59f1c5a3e472d33c51a8488ac144201000000000017a914bf97f2370b8fe62564f4220b83d646d1d91db7188765430100000000001976a9143271302e05c689c318bb88a039a63df6a3e598fe88ac1b440100000000001976a9142295defa5cf44ed64ce533fe42f1cf9b932b0f7f88ac7a440100000000001976a91401bd8e329b63fe851bfac390d11f76589addc14c88ac9c440100000000001976a914538f71d04d90553974b8729b3d6dff95d762c43588aceb440100000000001976a9142ee1ab117f8b8e808d7047296552579087971a7388ac1b450100000000001976a9146c23c20bdb2d7befc672f13cbacaa1ae61541bb188ac354501000000000017a91483951b5a13668adbd2a27d7fedc819d29f6b67658738450100000000001976a914578650c561b61ee540e7da604b2404ebd587fd2288acad450100000000001976a9144f9f7d68e8dbec80f34f62d22929ea9d55403c8988ac2d4601000000000017a914bc79946a90e66e1aad5ab85aed84591f3db730bc877b460100000000001976a914efb6eb55fa5e5376c6754c370826139a3798e54f88acee460100000000001976a914f87eac12b546790b71590ff8128e33e25cbccc6988ac614701000000000017a9145cf8a8864b26aa81332823bdbc5bfe91753e111c8795470100000000001976a91473b136ca8df1d1e51d189235d4e8e28172026bf888ac5b4801000000000017a9143e5a7bc6b061123c4e81dcbee7e445c3e21857d687604801000000000017a914e1a4169afe968edd3d54081cdd14e5870858922e87a8480100000000001976a91487eb800d10b4f521a47c577a6bb024343aa371ca88ac284b0100000000001976a914db6d9fdf2a4308a65b2cbda2705b8dc6240e3e6b88ac2e4b010000000000160014739114c84429c8da020afc8a695caae46c4877fdff4b01000000000017a914b7af3ac1d44c86f74985eda2a0aed0fc27328cab874a4c0100000000001976a914b9cbf6bc8415c1a0f8a2dd4157ad00389d602bd588ac604c0100000000001976a914485577dd6a037b8e839444ab98ddcef149656d6e88ac834c01000000000017a91462989ecaeea4a124ed2908bcc6c98bebef09641387e44c0100000000001976a9148caefdec6e35e97c96294c9071f49845ecbb1bb088acf74c0100000000001976a9141e7915c6f15f7b785b1e887dea2a3a3d236cd3a388ac4b4d0100000000001976a914326aeb7728e2c0beb560cc36c16441b6a4b5420288ac4f4d0100000000001600144d661445f64496eb92e79f0ffd3e152cb887c80b024e01000000000017a914e133a0cc524b75da88b3b2222b280581fcb471d2870a4e01000000000017a914327ca050127458cb86421536361cf8127aa5335f87694e0100000000001976a9140e84a87b0236af22fadf6a76d794dd8dfedcd19088ac914e01000000000017a91438667f1f5bbfb3282c3b58347659155d9c456a8287b74e0100000000001976a914e4e21870c1af1e55bd6ba7a90af717b0219fc1aa88ac644f01000000000017a914409559b240c4703ba90ffaafc6daa94633b63ca387934f01000000000017a914fadbc0023c623d593e224600be0295236c10fde987c44f0100000000001976a91419a7ca92ace15885bf51e16719a6478bc96e5afd88acf54f0100000000001600140bf076a228c4d4992830b074434480099baf0ba96f500100000000001600142f474218cb3920473ae4e224b9324bff613493308a500100000000001976a914b8f54bab327a67aaa3f84faf44a703433cbecb3388ac9e500100000000001976a914f00ea67ded054d93953d902c46515094cbfdad0088ac615101000000000017a914334fbee3f2e72ddeb02e0bdca1bdb114db1d8eba8794510100000000001976a91483791cfd613173c023e2efdeabd82ec3235d819988acd65101000000000017a914cb9a582d13e07602da55838cd61304465db2504687f4510100000000001976a914c4d8bfa87eeb7ca1dc38685b2a1a7b234e991e2188ac475201000000000017a91447afeeb5a52dfbeeacccfb954c8b84ea436a4a738783530100000000001976a91464be29e2662d67b775f3e53fbb946ffaddc9c5e388acdd530100000000001976a9142d2e303f8a758e75799d5c7cdb97686efaf7527588acea540100000000001976a914511c23ee68b35ba2008fab9fd517f1fb44a7a7fd88ac06550100000000001976a91478b66398842e013f5a06a49d6880021d742b3cc088ac155501000000000017a914f8970f40f13cc34983d344feb6c5331de471e7ae879e550100000000001976a91403c6af42ba2040da1b1cfc7fc21005488c0e542088ac50560100000000001976a914c61a891288fd5e980efbbfccd99baf1c51b5d63888acf6560100000000001976a914bed730889eddebd5bff437ad4ae897e3cccb896188ac295701000000000017a9149f60b3f8af7f54d207800b10db3f4ee21a1a514987a4570100000000001976a914c2defb0bfa7ea98e1e5ee200d2c87c0762219dfe88ac005801000000000017a914a0d98940d6b3199b93205c48016c0c1de5834d4f871a5801000000000017a91473ccda57740a74b7ebe52900529311c77f5b52728710590100000000001976a914413cbda5e10a02f8c481f96b292c7fcd486dde1188ac905901000000000017a9145369504291bf0ea0b66cfdc1526374a69944fe1c879d590100000000001976a9146c4e92676578f44489a6e287d9bedeae713e651988acbb590100000000001976a9144d1799cdf7cd8237f4ee421cc2cf4aa7284d3f7888acbf5a0100000000001976a914a7f3183b8af7098b2c66a8ff2540a10b198ee61d88acc95a01000000000017a9149bbff2a58516d0a1e82d5e0edb443418bf7ff9ff87355b0100000000001976a91490c67aa694a7ea5381a93062b9387e6380cdf19288ac3c5b0100000000001976a9141c3249aa03b9ae955e065fc58a72072ab3c1949588acd55c0100000000001976a91414abd6ada0bf272c1c9f7b1bfca0ec0261affdb688ace85c0100000000001976a914f252d057d0b0912b1c77c8ea21f135aae7b6560388acfa5c0100000000001976a914108629240cbb8ed66dbea678913f9f8d27ced3c388ac225d0100000000001600149b121fde6cd6f213e63eac55d5742d4e05ff05f9745d01000000000017a914c3aa4c46a3d4397d3b9c5f8de4bbd04e7d46515487e85d0100000000001976a9148fb12cd2a5e9514c47257508faa138f40bf67cff88ac205e01000000000017a914d7356fd9d3172cd7335e5e7517fdcc1de1f587be875e5f0100000000001976a9146984709c145a4a6d03fd4c1ad5c91e675522c88e88acb35f0100000000001976a9143d7030a7ad3c06ff3304c647860f5b6f20582fce88acf65f010000000000160014f1f92906f96fc689c1a62f500458ec0fed3411ec67600100000000001976a9140c35c710112ec549b5e7fda0d069f7938ff43d4688ac1561010000000000160014b0f3e4a36a82007c9c18870a1b123540f4773e82586101000000000017a9145b091b7fd825492bae55edfd828e27ea3c5d3af28759610100000000001976a91440b2cdf654b1a714c8caf3b5106ce67e0149bbef88ac606101000000000017a914f39e45dfcb9ba301878eed6f4bd04c69ac92dd858734620100000000001976a9143b556b98fda377ec0fdcebd2ee394986f5ac2dc388ac366201000000000016001474768eae5d492980f09282695fdbbe5873d88d7377620100000000001976a9143b9243c94beb7cbb93d7ce7573f58cee5d23a17c88ac8c620100000000001976a914766bafc6e059cd02608f8f7b957d4db3827a168d88aca3620100000000001976a914b15b1219ad2f659f685c281ef8442cc790e2398588acec620100000000001976a914e718a43d0df3499dcd2d209fd9fc08bba23509f388ac5d630100000000001976a914a240f845586816f028e09d4c2f25c96b76ec491088acbc630100000000001976a9149525c05246ad4826a840a72902ed6b090901378588accc630100000000001976a9148948413f51076678c2f2f5f513aa6acaa2687ea988ac2c6401000000000017a91452c46452d0dec14e90d4bfe48f54e8fef76d26908721650100000000001976a91494a186bd293d499237201268c868db35962a630c88ac9f650100000000001976a914442c78d4ad1fe166274653b5fd7f80494add80c288ac49670100000000001976a914509a67b58034ca3a5bc1369caa1b19748c9e817688ac49670100000000001976a914d62fc88be1af9c35791a48de1fa3c9a51262822188aca7670100000000001976a9148b207e19d5e4c8c7cc39160757d018d94324ff6788ac17690100000000001976a9143cca8a377df977a2fc329c17d9a05d9b0536413888ac9b6901000000000017a9149380d3d596132ac1becd356db7e0511801fcaf9987d7690100000000001976a914dc021cc5588dda3d792a45fadb103597ae9ae20788ac1b6a0100000000001976a914fd30434db4d38f1955f3cbae5a4048e3d8649bd488ac3d6b01000000000017a9147757af62e635cdd0a9850c334da44ed1df6f2e6087496b0100000000001976a914cbff1749b1701f1da89b5aaf9ab50d813116d60788acf46c0100000000001976a914eda2b420c5298ad27471cd331416cc118d75aba088ac306d0100000000001976a914a8f0afcb0aa52b70c9439952b414a5cbd371028088ac7b6d0100000000001976a9147bd696c7b781e750d0a292d79650811c5b21bf7c88ac136e01000000000017a914a61a985d933f37ad37e791ef4598d5849e82b29987d36e01000000000017a914ff42ff62dc3424e46f811148b48ba9bff4bf1e5187d66e0100000000001976a914d1f70f4995e22bda3e6e342eccc7053acd73e43e88aca16f010000000000160014d97ef8222a2ec5660195575968f2e30da6568426bd6f0100000000001976a914a922253382bb364f3f9319262124272dcf019bc288acc96f01000000000016001455a31e77199412036b2fc7d187caa0ed27f72bad09700100000000001976a91402b004fac6ce2018954ca1f4c3cd7f312296226788ac7970010000000000160014f91142dba0d31cb70ae441063116fc52d72df8d9bd700100000000001976a9142e49bedfc5411facb4819ecacbfedeae1cf2e18e88ac5f710100000000001976a914ba6c5f2be8744e09777755a5ac7cc815ed150ab588acd7710100000000001976a914d143d9b14ea2fba62d02822c427ac57510850c3388acaf7201000000000017a9143b9978d07ced8f248146afb4b0689c45137b2eee87f47201000000000017a914971cd4b4047b7efe42418a58bf9b3570014adacd87247301000000000017a914194ac2ffce8c1d6896dbe8dc143fa9d4c4b525d8877d730100000000001976a914368e0aa8b65310603856e349983c71cb28a2d7c988acd3730100000000001976a914d486a5bda95ad2f3db3056d5f854b5ac337c1da188ac09740100000000001976a9149f68a2f438152067fd7bb1bdcd8910ff5671081d88ac17740100000000001976a914318477c11b76bac36a41911f7d673483c134c28888ac6b740100000000001976a914f161efbc847f84f5b2a623705c6772facfad0cce88ac057501000000000017a914904798cd2c73f6d7d7fafca985d57dbdf2485180870f750100000000001976a914ecf52a4e0067d51636646d52d13cae6bd81c0fb588ac5f7501000000000017a91405c51d9d3f105bc584b1e37d47a033cd9146f4f78777750100000000001976a91407d9855a17d5bbdb88018fb3714a4063cb97a24088ac9b7601000000000017a9146c0a3437d8928a0ebd8e4e80117f656ebef74a3487c9760100000000001976a91497b4201b22c98d87cca4eb30982d53c31efcb2c888ac20770100000000001976a914efa137a1327995e760d30a384bbada75f09bcb1788ac3e770100000000001976a914add137d1c9531288bbf9e781f43870b48a78fb0588acd0770100000000001976a914a14db24fa724a9b698ef10fd4b12575b835a8b7688ac90780100000000001976a914a91a4b522a1e90bc387ad81f88f441a8411dbcb088ac9a780100000000001976a9141f0182b1b8c4c763c6164ca54f473c0c9d4e0bb588acc3780100000000001976a914a6c026100e08519165cd10d11fa3b92464d85f6588ac78790100000000001976a9144d0c3a48c7a1e6a06eb0871d39adc0d9f269dbcc88acb7790100000000001600142fd9e6388a587716e6b49b1c6d6c904e63d058452e7c010000000000160014c532fdc00843108fec897880fff326a1681f80536a7c0100000000001976a914f4fd989e8dd6e37273cec152b938c72f054eba7988aca07c0100000000001976a914956d4651c3e2b080c8cb330ec32e119cba6131ba88acdb7c0100000000001976a914db14eac334fb6f078c92bc6309f775a58650cfbc88ac637e0100000000001976a91475309f097756fd42023281307def0aff09b3c35388ac797e0100000000001976a91415ed0860119770e2de8c41be79a84bd3ab986e2188acd07e0100000000001976a9146af7f8774194cfba27b5283f87f4b8f1b67b8ede88ac867f01000000000017a914725f64fd09df9547d093e9f6452c896a53cadd5287be7f0100000000001976a9145f67028f0f0b58be1c00d33aa81eeb150c5e44e088ace37f0100000000001976a9145d53ec56119fdc5c25a8fde59684529756e2336388acf47f0100000000001976a9142b6d18fbb82e0b8d1bfcdf135a4b06314f23255288ac998001000000000017a914aa2d12073dc248d193e75bdd0c9de98fc569df5987c7810100000000001976a914149309aaf9701da5208ccf8876c3b2a3887473a488acfa810100000000001976a914f68daf3aa6dc393f96ea9607ad17b982e1e67ae688ac57830100000000001600142ba4128be0a6bb03d4ebc29d378ce87de2c4046d458401000000000016001484ffbbdb16475e5b4c25a4178823d7736de2a3766285010000000000160014674c5f9624a91766c62b0d71917a7c636d10da6e83850100000000001976a914a44fd097a146357e016049ae16481328118e634e88ac1a860100000000001600143b508d8c72ea7ac81322b6776bcf4ded766fa2346e86010000000000160014eea800b8575eb7f8a7e4ae91f0a9a358a6d3a387c086010000000000160014997e5190d9b347d18e79d34a58ae2de7cf34c87f8e870100000000001976a91464f674ead230243c09d82fca20ba31f94efc311288ac72880100000000001976a9144904e1cf86f2a0c5b2fc712b611c6b134126962d88acb8880100000000001976a9143da65e0204e045148c092e7bd5688c8f55a333f188ac42890100000000001976a914e71c5e0f23ffd1b39c439a8d2847d395e1d7830288acee890100000000001976a9148bb2f88f4c870808b653825f98f2b887d48f2a1e88ac028a0100000000001976a914be8d26f30ae9d7ab03cc3d1e77b1f7b52e77459c88acaf8a0100000000001976a914d6bc8b07d0cdaf53f9754d708b416e5d15c89a8988ac528b01000000000017a9146445e5e4508da43c709190d085706dee68b48fbc87e58b01000000000017a914ab9c63aa1d3ad51cf6b35f35b9891a59daf4337287f68b01000000000017a914a133a3f6d4052a3253164c0a8cc8720484267ff5872b8c01000000000017a9145d16d90eefc7395a06dc94ee570aef2225a78491875a8c0100000000001976a914204f62f220fe623bcdc7148ca1952c1b03e89ca088acd68c01000000000017a91449feda050996d1f04018daf93217c927fd14c7c487de8c0100000000001976a91426b0fd73c24b0bdc195b97218f270b5b9ef7c27b88ace88c0100000000001976a914ee0a3041bee4ed4497f60f30c1ccba63c8cba0fa88ac6b8d01000000000017a914d8f00f93f825b5cdcecbc91ee25e0f61ded03ed587f18d0100000000001976a914b2219eee6a39a5fea6afc5f571a224a775e8eb0f88ac008e0100000000001976a9143e36119eb89c180d7f702969c231c8977a63c31b88ac1b8e01000000000017a914bc439a9f5845f69e0805261a0f24911dc2e8a8dd871c8e0100000000001976a9142c3f39b55475d0272d40d73dc77808f410dc700b88ac428e010000000000160014faed4d65e9ce5e2c70f7297f32dfb4e580a8d6a34a8e0100000000001976a914477860dfde8dd227a9a22011b147c6fb5e31d5d488ac508e010000000000160014b0b9eb7d3cec19d5af71941169a5f0b48709a2ad658e0100000000001976a914c65a3883a3172a761e2f33468e7f1af5e9031f1e88acdd8e01000000000017a9144de3d676f299057929d06c5cef807994b5ae70cc879d8f0100000000001976a9144eb93709429b62e741dc4b662ddfb25f20f44d2888acb68f0100000000001976a9141d13ad7d238766e1447eca4e35a124ee68bca0e288ace78f0100000000001976a91422e0094354a077753c892d07197e2748ec36e7fe88ac0f900100000000001976a914bbd1b687647522d473aff7fbf4b2a32aacbfe8b888ac119001000000000017a914260154ac71eba81f80ba07ec010a288e8eb5ff4b8737900100000000001976a914620fb1c1cd0a0deb9a500ca13ba09d8936c4d35788ac8591010000000000160014e79f09b102101ca987f0b6a2e05f8d1a247583eca7910100000000001600149f7c358a9141e367d1432f61e6d5e55c963c29bead91010000000000160014b2129b6d3bcb3b83d9172e5ef549cfd3c8ce69071a92010000000000160014faed4d65e9ce5e2c70f7297f32dfb4e580a8d6a3549201000000000017a914957f72f55f1673b10ce5100e1a01c5ea9f3ab3b2872c93010000000000160014a80d2900b9c8c10f558ea586742068365811a5fded930100000000001976a914015e1c8b7e77c9b588186d814ed9a6791abf963b88ac1c940100000000001976a9146405556b5b6400436ca2d08617dd09a6f37afd1988ac2d9401000000000017a91486e033ba0713af9324834fb0013a3985289f558c873a940100000000001600148c1821389f02b31bbc68adc4916576c112c52c3765940100000000001976a914bc9e4a6e134917cbd1c85ca41b5a7a96a7a4e95f88ac979401000000000017a914c64ca5ad50953c5028b30ef3981ea17aeb79343687889501000000000017a914ac9461d8e9832dfb8023dc93d66c86b79cbf70cc87989501000000000017a914dc4d019678c00c157cb809a24fa2a7c977a261b8878e9601000000000017a91429b0958826da0f93925eb6a77eff7b7ae6ff330e87ea960100000000001976a914bee145bdcd52584f3266ff0b512b3e1114086ed088acef9601000000000017a91488554e5adafec4c541786e7d2c20ee7d72be8681876f970100000000001600145c17807712d7c6ca61151a7a2d72294fffcfb3d9889701000000000017a9143137c984a2b783673aea51e9c46ac68706388bbe87c0970100000000001976a914c70f33f2f5503e7f9587c4c44a57847f7fdbe6da88acf1970100000000001976a914169415e444b3db39674e75166e51dece5e747b7a88ac639801000000000017a91453c49a7c2fe661497b1dae5ba9b5d907a15d446c879a9801000000000017a9143be7126a107f641d56395446778ee6a4bd8625f487fe980100000000001976a914583f767b89cde68911136a4f6d83e3aa2785f20788ac0c990100000000001976a91470af200180c62e6927ae149b45da4d3ba548572088ac14990100000000001976a9148516940c2d3b2ae3f0b5ed862575cb5cb072ce6088ac39990100000000001976a914fd683a9738a31564780ad7316db36793d876fe6288ac47990100000000001976a9140e3c3b8431ff591d16df565c33828018788e3f8c88ac9d990100000000001976a9148bf96b039bbd08705e74811a0fbfdb872b99af2a88ac009a0100000000001976a914d27832eb5b01d64c61f94ab61ca9c247ea3dbdda88ac689a01000000000017a914afca55ebf040511ae2a65645581c9f06a03d321787979a0100000000001976a9140ec5bfc8009359ec97360c0666d885fab2a65e9a88ac0d9b01000000000017a914c0745c4b98b0dd42743604e953266cbb96c1af7587149b0100000000001976a914c615e1bd95bf7ab8b27bbd8fa6075b74f9b0eab088ac939b0100000000001976a9141f68172d0d314f477a8f78655dc53981861cb4a788acab9b01000000000017a914d3ef4b23f7b9f40b516dac2f446e8b9c2daebbf287629c0100000000001600144e08337ce7f923ccf0413d9e1c4c0b73e80454fe739c0100000000001976a914823407e04a9d77149aa737c8cbdb60d366a290f688ac049d01000000000017a91465b92036eb6d2523b0dc0e8695cd3c1c5cfb99b987149d01000000000017a914e2113727bb720fdeeffc86dfeeb7c2c61c469c30872b9d0100000000001976a914be64d0e126686b5df21c5a3126567c891e11bef788ac659d01000000000017a914803520a29969442d3ea27df45dfcffd6cb8af38c87689d0100000000001976a9144fecceb3da66dae61cbc3eb1275e6cb1de13a64e88ac6c9d0100000000001976a914645314b3b2a1a935da42de623748957b824563a488ac329e01000000000017a91453709e9bf4cd5a384631b9375841246f3870561a87b49e01000000000017a9148ee14681c32fe84fddad616eb01873c94f88bca487859f0100000000001976a9143bc99db42875ef6e706a4cff0adfed561e10e40b88ac899f01000000000017a9142008cf03a28a544c142b3ffb40bd067ffe3dd8bf87b79f0100000000001976a914c6034d53d1171afebfa6bebf76117f175081f5de88ac70a00100000000001976a91403ebd819eb3887942f4b9c3f13f348963ec672ea88acbea001000000000017a914a13ee7ea14da3f1222d84d764c1981dbc67acbac87bfa00100000000001976a914bb6f74d7c12275732040ee4a1c38f52a4d7ad87288ace7a00100000000001976a914c5d9dd56551762d67372c594b244b262b90f419588ac0aa101000000000017a914256ee72af13cbb984e71858f7a42519cf4b90b79873ea101000000000016001451107b56ba9e9f6fe6b892b719c193bc086cc7c55ba10100000000001976a914a27b0187fa03a8f3d5a5ca2c79fa42d0bd5c101088acefa10100000000001976a91415ec35c4a80d97ad6006907c92a152f161733f6088acf4a10100000000001976a9146a5bafb11e55038f460025c319ec32e9670ec96488ac04a20100000000001976a9148c9fdb0d302006f20c3222ed8c652f41f9ae86a488ac04a20100000000001976a914fd0de3061dc7d5e4f20cd5e3cf265c700fc1178c88ac11a20100000000001976a914a981c925c40251d4cf15cd9a127f48e71d51628d88acc2a301000000000017a9146ea5701f41b1b572eaa80ffbd7c46b25a59c4be187dea301000000000017a914e3fe76563c1a9a2bef96e330e702f2275f9e123887f3a301000000000017a91473f85d344a2bf4493ee7d6f5f007f2321d7313778709a401000000000017a914e5b44e8bbe60b9972980d820d8adc7fb5806467d87bba40100000000001976a914c3923e328f0e5635face96f67948b336d4f4ddef88ac21a501000000000017a914657dc6a2fa976ab1ce67617eb2e5bcb421574f598774a60100000000001976a914cae78a06e8754cce98728367c9e82cda53387e7e88ac19a801000000000017a91452a40a82292c6865604fa668438ad7ab2e3426c4871da80100000000001976a9141330ccd5751781c18d1fa6c9c01a219b48725d8288ac2ca901000000000017a914b07018e2b156c00fc77ea705251e4b327ce523ef875fa901000000000017a914242cce8972e60c7bcfc6515d1165d854747d4fb687f6a90100000000001976a914e05625449a18cfe026eea65d247f15cbdb4c5a6588ac26aa0100000000001976a914bee145bdcd52584f3266ff0b512b3e1114086ed088acb9aa0100000000001976a9141babd268a8ff5ed8e659c53f73477b326949401b88acd0aa0100000000001976a914defaf9c3df3b9bc3c623a8d00814a6767d2d77c088ac85ab0100000000001976a914c725b50c022e2e0ee704822a450fa453d249d64d88ace1ab0100000000001976a914ef59eb784d0f8998adbbf09265f7d868fe5f307e88ace9ac0100000000001976a9140956b779d1c9faa654a244866fff58eb9eed1d0d88ac2fad01000000000016001437832298f2dfe0c7b0290ec0c3c732b24f2b480d37ad0100000000001976a914d0eefa24bba7dfd0bd0347eedd8b648e512ea34688ac92ad01000000000017a9145f76ddc811dfbb3e8fdee580cd3954693c0bcec0879aad010000000000160014901f1cd8f6c83e35e97684551f068ca4265cc315a2ad01000000000017a914bc8f63dec5323f6936c1cb19b3c94a9cf8e686be87b1ad0100000000001976a9146cbaee475ab32e6f1637c93745a2e0a4c48cb70688ac8fae0100000000001976a914c6f6fdd0499a9aaec3e82696f12d1ef2c81a55c388acd1ae0100000000001976a914c23fcd25777f42c52363d8dfc3c2a53d7265bde888ac29af01000000000017a914125e3cc59d8e4460c8464029958e4e2fb317acb2874baf01000000000017a914345822a2685c991d91e3b8a24b6c2bb1904b421f8766b00100000000001976a9142b06486cf85dd031307b7a64d9c158ccadfd87a088acc9b00100000000001976a9142c27ed7d3ca4c3041cdabded18c0c4985178224088acfab00100000000001976a91405f028f0a938a4211f169e19d8a91625cb6e789188aca2b10100000000001976a914078dde1ab944f133bb509ab52f1ef2b58569f7d088ac35b20100000000001976a91447f04e2aef5423f8744a9b75fc00f43f86fad3b388ac3bb20100000000001600147dca2d60d87413f7c5de037ac93bb8ba2896936459b201000000000017a9145038883ebc5d2dceb5e27e42ad9b3a62b34b995187d1b20100000000001976a914f3dda34b4c1cc8a04a077daa083e843e4b66a7a888ace5b20100000000001976a914f4c62903ef96d24be2694920f744fd76e056cfb288ac0eb40100000000001976a914b7f25751f7d2cf656d77063a9e94516af41e673288ac6eb40100000000001976a914fd49ed57a8ea72dd91c88b24a40ea54799580b3388ac00b501000000000017a9143f63f93ea5df0b884e191350803e858750b027a9871cb50100000000001976a914ff65f3f9ed15482be3a87fc3a4bb0ffeac9c512a88ac37b80100000000001976a9142e352d3af35b60ccc187fa120bf11213845f338e88ac4ab80100000000001976a914b7cb9bd2de80b777840f79b08935108114d6891688ac99b80100000000001976a914adfb6e0db92548f45ebfa74d96e4ef9a8a83d6e788acd2b801000000000017a914c874dcfa87a44b5404e75b2b7545f232ab50dcca87f7b8010000000000160014f5249787b9bb02e736a49fecc83d34857ec20a5808b90100000000001976a91402b004fac6ce2018954ca1f4c3cd7f312296226788acc6ba0100000000001976a9145f7c5924d1502bbe6ac8f3e21c1ae27a2aabe1c488ac20bb01000000000016001443679eba686f7113b47bb767cc70d7be66673ae4c4bb0100000000001976a914a2f2e18bc2a918b1a0610c9001335dfd2fcdbf5b88ac16bc01000000000017a91404ce8df1b68ab4cf8fdeed0acf44c8301e517c698725bc0100000000001976a9149f76793e87d5abb602c31005607b18d1dbc578f188ac38bc01000000000017a9149c0e2e380a0165e58771a9b22ccce6bba68cf249875cbc0100000000001976a91490277bfe105a1ce8348f88a025408e7d584c74a488ac7ebc01000000000017a9141bda27fdb1b61ff80111b3c381d925dbe21300c287f1bc0100000000001976a9141e3c2605f502299117d9786bc9e90b9da21098ef88acf7bc0100000000001976a9146a8747b93d5f2503adc6a42692c71f5f9bec56a988ac34bd0100000000001976a9143061f34390da9866ef8c5dcbde76cc0d055f251588acb8bd01000000000017a9142098f8e0698b382fc02380868013093f29fccc028763be01000000000017a91461abedb53003e39b04968b02d93e85f5a8d942d28770be0100000000001976a914e23047686806be677f11339c73c1cd78e263720388ac66bf0100000000001600144092c2e9a4d856b87545bc715e58521cc46c15807bbf0100000000001976a9146a159e93bb0cbc5dda78775da8aa2f3c6688ef3a88ac2ac001000000000017a914de2b2a371086392a78383f6753962f0c507e395b87bcc00100000000001976a91416a9d45ab28b83b1732b03a126971c9b79f7cc3f88ace1c00100000000001976a91454c96e0abde2d154a7ecf856116d996608513bdf88ac61c10100000000001976a91446332e3bd5101230b426e6048e5aab0c39fe511a88ac76c10100000000001976a9146fa6151482db08ce5993524a1090388a07ed962888ac9dc101000000000017a9147b60f148ab2a96c25030d3dbefadf66f26346d0c877fc201000000000017a9143e621a19985e963d009ec3decdcf9f8722f0cea88700c50100000000001976a914c6ccfc4909566da68506c101bfebc8dfc4577ddc88ac7fc501000000000017a914ea11f72fe1c740e26e5b25e767d2297e14c714c787adc60100000000001976a914e5b9f88d081113ab8362f05737c074b662147d8188ac23c90100000000001976a914fc2d762e178f12bb3dbb55e9cca2a0d4ea32a6a788ac9dc90100000000001976a914d92e65e172598122bbcc88c729ff954085d4eeac88acc0c90100000000001976a914ff344150cc4e9b2df7430f4ab3aad7fb75529f5088acd3c901000000000017a914e828d6c770f685bbefe49c3e662fc919296d4b4587a7ca01000000000017a9142a04240a0507889c64cd66694b73d9fdd039319987adca01000000000017a91417141e7855644e7519919d48e9f27005a62070128785cb01000000000017a914216db5fda624219f8e079e124d2f93c27f69f44087facb0100000000001976a9148486b38b0f518f3dfb0188922d1bb9843ef8cb6d88ac0acc0100000000001976a914b5f476998ea86f44e9f31382da042a7bd98d91d888ac86cc0100000000001976a91447979e19a8c1e5e6acfc809ce2ce42ee397f046188accccc0100000000001976a914a0674360b1e6922a92f7ca1839b5a3bd122f4bb788ac95cd0100000000001976a914e8f4dfc93016145f9e21eaeaf665abbc4eb33c5688acddcd0100000000001976a914c478c07dbd6fc9fe6778c334c110d116b84a97ef88ac03ce01000000000017a9144f74d72c1e548d03d0501a14c2d201a5b9929fd18708ce0100000000001976a91451c9014ddcc83553f03d91c961c2214ac005721f88ac47ce0100000000001976a914641bbf6b014fe7d510cc7f50b5d409fa04cfc3ee88ac57ce0100000000001976a914b503c7daaa28fb254c8ab185ae16337ba65f412688ac97ce0100000000001976a914f5140c591d4e86820df782c2b2788503f563ef3a88acd8ce01000000000017a9145038883ebc5d2dceb5e27e42ad9b3a62b34b99518718d001000000000017a9145038883ebc5d2dceb5e27e42ad9b3a62b34b995187b1d001000000000017a9148165df417c74e26ff8d33286085be2b07a51eedc87cdd001000000000017a9140f929642f06284e5c4b9b8a3f5a236d4e35de34e87dad00100000000001976a91402436056aa88a1fbe68a56662308e989a345eb9088acf0d001000000000017a91477f8f80b94f4b8124e7c36f6e7c6aada9a273052870bd101000000000017a914d2418504175d8ab5844cdb5b00e929130b0edbf08742d10100000000001976a914035cb231cf8ea084f4c1b3542557c71fb552ee9788ac52d101000000000017a91463845c534f85cdf774e83175101aaa93f30f14078754d20100000000001976a9148fc682bb2a846f1f8e1888b6b5a47800f244451b88ac8ed20100000000001976a91486c07faaf3c076712a95e063d6e368c05677567888acb8d20100000000001976a9146453fd96282a895cf36dc2f0cbf6a8345fd3314688accfd30100000000001976a9146d1995c16202b88435d41a48fcdef72113c79b7e88acd3d30100000000001976a914900a7f7853d241a3a391e5c7d3be1f1b6e1a0eef88ac04d501000000000017a914d41a33357e1e070ec73e03acb75871be0a9546b38742d501000000000017a91487f78eb684504d8d3b658e93bf9e914c7054954a876bd50100000000001976a9146f934ec9784c873d0f11d81bb669ff11bac044b988acd0d701000000000017a9149f86e939f1096b885b2356d1e63178c95574002387f4d70100000000001976a9142bb71038917d0c163aa2a54f6e6aaf71055b588f88ac1dd80100000000001976a91489c78bd8962cd9085fe0af07e42226d565c84f8f88ac3fda01000000000017a91405a7a25f86445a6a3aa3de719bfa154bb1b7aea787dcda01000000000017a914f22c842808465a54b2f47f3741dc905db7b6fbbe8711dc0100000000001976a9142651ad7c5c248fed6b8e5393539222dce71c08b188ac23dc0100000000001976a914c11aed4b37bbfdfe6bdbd753f3e631d134f98b1d88ac5edc01000000000017a9143777ffd91f7e186c52d2bb32a40cc3f9ec5dcbb88760dc0100000000001976a914a10931e4cb4e25816d7778ba42a45c325f4baaa888acb6dd0100000000001976a91413cb4c3caf8fb3e7ca513138cc5f610053136aff88ac77de0100000000001976a9141e7ffd35e4af721b5dd638e55168061610dd629c88ace0de01000000000017a914c6b47414d3b465d077eb24b9b387b48784aad0b987e2de0100000000001976a9147728cb2633e0456ae3eb0c5b81dbb3cfbd1cd25888ac2adf01000000000017a9143fd783e07f9cb42e2ed51f14d6b095ef0cf6c884874bdf01000000000017a9141df97c7c4beacd0855e3eccb966f12cbc842857987e4df0100000000001976a9144d96937236284d98e63f972e2db187cdd9d81aca88acf4df01000000000017a914d1ce3dfaa68aa8b1dc64861dc1d518be6973ea4a8718e00100000000001976a914f1cfdf79c09b905ff6ed1f8102bb893302a393fd88acb6e00100000000001976a914b9468364c9db366df1e6c6cc023af8a5a73a8f7e88ac26e101000000000017a914da14a2dabec5d67bbd0f107dba3414e11ec978f887d7e10100000000001976a9142ebe2c6e40976b9b489debffeb1258886c1efc1688ac0ce201000000000017a914555138aa619676a3ba072c41fa7b4960e128e4f8870fe201000000000017a914716cbd35ca3315df8da9a93d444171239de3106a872be201000000000017a914b5add8aaba82ab034c70f79e5348dca597dc9aee87d2e20100000000001976a9141f0ef4b1db821069d26f47b99e28032009a819e788acdae201000000000017a914113a23784c64fb7bbc58f06796b47096d10b6d0987ebe301000000000017a91432969448eb80938a6afea404365d40a36f6ca99887d5e50100000000001976a91445f5a010997f5b38230555176009185645b35aa488ace9e501000000000017a914472bafcd6835eaf02c5f018da82c223f0f2e208e8713e60100000000001976a91462816c08cc83f9311c7b298a8c3ffd38a4de34ae88acb7e601000000000017a914262d8ced455c40ecb517bca7701a0469f4f253a8871de701000000000017a914e8b37120061131d1954e9e3428aacb349e1348328756e701000000000017a9141fca865503716db11b8b8cb3f5e4b80e14321def877ee701000000000017a9146ec06d7e608ebc8643efaddc4542bd4fc08f1f6287bfe70100000000001976a9146c9d259ee80163a6f0af25eeeba33f1b727b00d588acf7e7010000000000160014a16d8943e86ea6e17d659b19675ca85d6bdb1b5913e901000000000017a91438cfa2b4ee1fd9993d95cf6ab2ee8e5d5f4c1b47871ce901000000000017a9148d3768a0637a31046e9d1a8e00992f89ffb53c8f87b9e901000000000017a914a72e9631443a24133ad54516ca268688d170355c87f0e90100000000001976a9146130330e383452f2384daf97c0c9a175842dcbbc88aca1eb0100000000001976a9143f45f60286b4d5c2a16229bcf923d34f4eac34f088acbfeb0100000000001976a914b3c46aa513dcc038d2be52ea88fe1f036475ed9788ac22ec0100000000001976a914a336f5484c70565a68c660f2a9de07fc4a60054288ac60ec0100000000001976a9148b0bb3baf6ebcd2a131d18b076014e10b90f1a9e88ac65ec0100000000001976a91467147720315780d581192a6c5dce6a9cf443f86988accdec0100000000001976a9149302376ac1401e8a09a4e83a54afc61aae8d98c688ac20ed01000000000017a91440a54fbcc5a72507f6f3a616a26d20e7f9af9ecd87cded0100000000001976a914b10ec17b24385c15b26f9132beb682e5ca679d7a88ac5eee01000000000017a914fdca1e178fd56b78292bf979a08f1e691516168e8769ee0100000000001976a914a2f8913866eaee66166c5639e8f7a5a6157ca5d788acebee0100000000001976a91431e358e58138d0f8653fe8118c7ddf0c00293ac288ac24ef0100000000001976a91490670e7083c827777cbd74718b6b2508a8c1cb9488ac61ef0100000000001600141d3af16d7b974bd52a68efa75ad4a3f333fd7b651cf00100000000001976a914b49027dff1679325862079c2a35700095a8dd2cf88acd0f001000000000017a914920b3727ecbcbd2be72ee21e0ebf9b2828eb333f87f2f00100000000001976a9149ac25a229d0e6b29c5eacf44c53cf5cc2755afa488ac0bf10100000000001976a914d8b1a750e7aaf17bd88e6eb658c30c6104383fb388acbbf20100000000001976a9147d85b2b272db43a0515cad22ce23e8057c8a3dd188ac81f301000000000017a9148ce704bac789811c1bf70091ce79da6f22bb7d608716f40100000000001976a91479372c61ef4603f08511424ba50ee4eaecd0342288ac45f50100000000001976a9149dc277e2c8d9569689cfe6d914ca2c7938ee457288acaff50100000000001976a914d119c839711d43a420b93608c29c013712f6267188ac7cf601000000000017a91469a3700022967b80b31c07f1b15d0188bed3e51c8780f601000000000017a9140b6838e8085bfbe338ba7c0ff0fd190bde4695f787d3f60100000000001976a914c3038ef48fe2767081f472dab20a3d05434429c088ac99f701000000000017a9145355ed4e650b8d771dd5e469276b312ac5e4e6be8728f80100000000001976a9146b910272639d33637c77444c26016eb1b027ff1f88ac9ff80100000000001976a9142e529835c6d9be750771eb5d76c2365c70b79e5788ac51fa0100000000001976a9143c61c1115f21682b46ad3e317d7f72bd8329625188ac8ffb01000000000017a9146ebf343ef1b76523ee4d029ec9dcd866ecd4b938879cfb01000000000017a914d62f3309773e48878c867764e48d5842cfa5ddb187b2fb01000000000017a91419b77d35d96415ea9d2f1318f6ff68a9320300548768fc01000000000017a914611bb1fea9d243717bcd52e439d81e4246caf47187a3fc0100000000001976a914185ff543be2ad44426017f7e02b4095415ecc04b88acb6fc0100000000001976a9143b00d45e4b6432ccc1e8307058a7521cca62949788ac3afd0100000000001976a9141b3487b70651974d160a59dc28b59dbb4534123e88ac60fd0100000000001976a91442a5370d62ea8d66773878fbd16124704741b52588ac27fe0100000000001976a914c7a53579f6129defe719ecea071e3afebdc3ada688ac84fe0100000000001976a9148b3b50047f550afe2d04d821b5514a37817ed6df88ac1a0102000000000017a91417932a4d06ce1488761e411fb7f424f1ed9ff0ce878b010200000000001976a9144c8ee1018f6510868c27b2583d8594e0629e9d6788ac4a020200000000001976a91427fb6e79455bac871549af918c72e3f0150dc20388aceb020200000000001976a914c19c92ffede1086729c56482d2afd34e6c19ea9988ac28030200000000001976a9147e62272e59014c026d35fa517974158f1735b59e88ac3b030200000000001976a914fcc9fc2a8aa80c984fc8c92c52cb00e8938044e288ac88060200000000001976a914ff03985a3ec0100c25006819a626be97f382de7f88acd9070200000000001976a91434e56a791dc742a40a994596d580b4efd2bd6fb888acf50702000000000017a914c722de8c8d702d281f13c68cd33e324bff07bef787530a0200000000001976a9141e79d5834be4a7f7c837c224c862dae8f9da49a488ac340c0200000000001976a9149056c9715de80a2de2560f8630a8db121113a6f088ac110d0200000000001976a914bb81c4d7025e20017379746c5a335df67912641e88ac4e0d02000000000017a91439c01d036ace4094139387e97047de8f6e9f152887270e0200000000001976a914f643419c3e1ba3ea7141263dd38f2ca4788d5ea388acb00f02000000000017a91482f5ebce1d81ab88d66369f9c51f3367a9abf27787cb0f0200000000001976a9144fe29d72165fcccbf1898087a1b163c7a950f06188ac56100200000000001976a91430d6247ddafb929f32021d5252ec8ae9115f28f188ac0b11020000000000160014e0f1c7d833eac753b42d50b23c4a8fd3de67c753b2110200000000001976a9144a32dd8337e1f5f5c6430530166cc0a269e588d888ac1b120200000000001976a9140c96c6d19de990449b79cc8281899555e3a82d8088ac54120200000000001976a914993eaa90345b38828acd4e489cda23e83b94534488aca1130200000000001976a91400e0fbcd554616f94da489f894491878653884f088acdf140200000000001976a914c5d67ae236d95bafb2a2bdb843c94f5815a40d1c88ac9d150200000000001976a91429c26cc2d77928910939ae5043a49602da4113ed88ac2d160200000000001976a9142aeb6aef213df9591f0a7c0b82935b820f44273688ac661802000000000017a914e6253fda120f1aa75c3aad1088c6766e6849747987721802000000000017a9148ef47aa15aad01d6e13471eb64cc199ff1b14ee2874f1902000000000017a914860f1abb2b7193df28c837177f5c0e5f967a2553874d1a0200000000001976a914baf444434c9d7e13ff600a7291ed1c7cd728f69a88acad1a0200000000001976a914fbc429be603a1eee5bdea4d77f039ee8759de99388ac831b0200000000001976a91436e1187d3731b3dfa73502eaecff251108ce167388ac6a1c0200000000001976a91416d3feeeb76958396df2ab5e09face42e6d9612488acc41c0200000000001976a914dfd096a6ecd485931e8c61f5f7259018f0dc433e88acda1d0200000000001976a914d5a3dd6aff130e4e48c64860ca1ea677899c9fe788acdd1e02000000000017a9141a0ec4548d47458a4a898760aa51c9f2b634c18087331f02000000000017a914b12576832c3180280866848e20320fd06a4cd6e68723200200000000001976a9143c61c1115f21682b46ad3e317d7f72bd8329625188ac692102000000000017a91461b345bb5696638ff966b169489c132b9e3a76de87de2202000000000017a914dbc4a3a20358b993f7bbafafdbd9d2911bfb1afd8736230200000000001976a914182c22fa50c2602ecf4a0a109dccd87f14d5f3f388ac902502000000000017a914e58eff45b7521f8e3a7697cab3007532f12324dd879b250200000000001976a9142a6aed53f0e78dc3ebf4800b04673fe4db229d5c88ac072602000000000017a914a78f1172d317e93fd9e44ece21bb1e37674ec84b871a2802000000000017a9143ef4a480223e03dd26827bdec36430bf49367b5f879e280200000000001976a914092e56ecdf7cdabdd7fd10e8487e92d6f7afd11588ac0f2a02000000000017a914b4e3ad4561fd91efe2b33dc9805dc6a674d7512987af2c02000000000017a914ed4495716c378bc9d0b5cd2de2dba5bb38cca88187ed2c02000000000017a914412eb0a5ce1de4f70ddf71f9790c8622008cbcfc87132d0200000000001976a914afb0d9584fef27c674a40e1a385e536dbe9180b988ac4d2d02000000000017a914a3e62429a5443f4cf14d8fe0aaad2c7f183ea4ee87562e0200000000001976a91452332c0ede338e04bd4a0d52afdf2c64d2c2a0e788ac752e0200000000001976a91478f6252f0c5913271a8789e18a0d3f31abff755b88acf02e02000000000017a9146d5c1fa7965e442efdc503052a6e1c9bf46d4e3c879f300200000000001976a914aa69c4cdaa7a8ab9202488e5a7407d39cf82885f88ac39310200000000001976a914f759030d1ff2de0a56f454c33444b1c213b8f7c688ac6d310200000000001976a914c4fbe509c4d73d752ba4ad52a4738cdeeebd14c088ac5932020000000000160014295c00ba4a250fdfb5f1e9ec3f3a4b47ac29b738bf3302000000000017a914156b5385772cde2b1eb7071fa5f463d620a2bca1874c3402000000000017a91443be386a5354ed3ff6286a1c8798b40a2e434029875b340200000000001976a9146d3c7c0e9b468c64f4418122d3b5899934d5960688aca93402000000000017a914e77ded1439355555470616ea2cdc679a5aee96a18779360200000000001976a914bdf8ea2f9ed07a9f51475e478f8ad668a032d6bc88ac7c370200000000001600143f619b74f74e4a172700e3faddd23ec1a732af28c7370200000000001976a91416535d2b0f025d6bc155278597447cf10440348b88acd7370200000000001976a914c070340f7b024ae6f6a71838e2c119ff0400c87588ac1e3a0200000000001976a9140c893ced849c7300d89c2a67a19ee6ff3d53d6c088ac533a0200000000001976a914512c836670c0512852061b482da107ef74471e3888ac9c3a0200000000001976a91499d0caabfadec4dfdcb9fbbc9e207abc7a6caadc88ac653b02000000000017a91460fc0f2a8c86fe2c75ef8c64b6681a2bf0ffc157875f3c02000000000017a914e36ba8cd7d89f21c6f2d40605fecb2285590a361876a3c0200000000001976a914cc2b4e87c0a8640974d33dab2113b4dbde33ae0a88ac853c02000000000017a914e8ab1bf3460d44585c21cb356ce6255b73ce804787733d020000000000160014a47eb7484afb6453a7ee4102c2866d5bb677d471f33e02000000000017a91475196dd686eadef16f3b12fe49ec5891aa1a211b874b3f0200000000001976a91499daf4bb16f23d88cc705a319e48c5c15be371c688acc04102000000000017a914d502bf823b04e99f5d66419af819e85c9384729d87f2410200000000001976a914d4b807dd9ccd3faa1d288b66ff6742cbae7c377788ac0c4302000000000017a914c372b75aabf7680e254c4f418e6fc6f189ac3a7287304302000000000017a9140a971cf99ece58c22394875e76d7b8847f2dcfea87eb4402000000000017a9145c1b672d78ad002e7b415019a8552b0025ed4ac087d9450200000000001976a914a1536e9b868953d7f8491818076fd66ba743a19088acdf450200000000001976a9149b627e44bea442dfbdb07d375e5996e2c37783f288ac55460200000000001976a9146cdb29b1d454d1dd690f8b9a4b18b04cf8685a8188acdb490200000000001976a9142920ebca65b5f25b0b91a9dcaad155bb28e27bba88ac5f4a0200000000001976a914e68b9b138b59b8afdf29d481048b7878c70eeb5f88ac734a02000000000017a9145a7faaa205f656788413bcbbd520835c9ee1a3fc87d44a02000000000017a914681cee548af9fd9d6fd67f0d506dc84e2dd209e887a14c0200000000001976a914dde1c12bf2dad790e7b21e8ff8772d089c5f7d2388acba4d0200000000001976a9143aaa9ae8e3689668fea9a353967d7fe7af14c3a188acd14d0200000000001976a91482f07eff36a270a537848dc4ad77546b07e6998088ac66500200000000001976a914a27b0187fa03a8f3d5a5ca2c79fa42d0bd5c101088aca2500200000000001976a9145c71c95bb2ea9c5a12ec05491df94071a05c70fa88aca2500200000000001976a914a44dc63cc20487d5fd9a95e1f17917fb4a43648f88aca4520200000000001976a914706cbca84a57b26de52b7a92a191419e7b31d05588acc6520200000000001976a914a840f942915c92ea9b71be4bcb40b31d8bf5d9b288ac04530200000000001976a9146b0ea25ca2cecaecee5967c97352b2197ac6f43688ac31530200000000001976a914b60b7a011b2b56854dcaf75817465234dffbf4d088ac895302000000000017a9148b244f02820e03e3e2b066b7bde82784889aa7f287d15302000000000017a914451f9284cee648fc65310ea838c4697fe0cafe07871c5502000000000017a9140a91cb3e64b78d646a340ac670d9408bf528e4fc8773550200000000001976a914777afc5da6313dcfbbd39d91c31cbe880b98245888ac75550200000000001976a9145a7a2e2e8334e8e2b6a1715b18bb4dd8cd3e76fd88acf0550200000000001976a9148ec8046c87b6dce5b9ad26eac190a9e79aa1078088ac26560200000000001976a914b8372f536019bd0735703253ff75cfd915ef4bbe88ac3f5602000000000017a9149e43ebc0b8a03c06d44d700a0aadc0f9cc40f10a87cb560200000000001976a9145633074481383b62829c555b778394853c162ee788ac715702000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd83487de570200000000001976a91448e4bf5f2890500c08e661cc6e6539c4f3df88d888ac4d580200000000001976a914b53a0ba8de47728ca788c5ddb5f445c46eafd3e588acbb5802000000000017a9149c0ae0ba4a49a2008dc5077305e2e95896add842876b5a02000000000017a914dbf7cff6a004f87c618cbd70a44bb86e0afb509f87615b02000000000017a9149b82870ef71897d7d6fe9d96eb1c39a7b9837a9487155c0200000000001976a914b353e60653c32980989624e979672dd6cf49997688ac575e02000000000016001483ccb80b62017d875cbd0e8c809c993de5e756916d5e02000000000017a914f0bacd605b5086a6014cfe84a95ecb1452f111ee874661020000000000160014e2fadda3953776808cf2895b6c6980ac12c86fa85f610200000000001976a91473585e113b94c5696a209c028ea45663a90ffe5388acfc620200000000001600144b6bbdeac50278f086e5088dae12e3350ebd39b6f1630200000000001976a9148ce263e926abb336b8b1285ce244fc20c39f654188ac44640200000000001976a9141eac4ed9b04b647af87b538831d46e62e519aa5788ac656402000000000017a91446dd4a9dea5c0d66a3f31aba97a55365fb44e3ea8705650200000000001976a914fd5e773fe1ea142ac9059a757d52fdb2a635dec688ac42650200000000001976a9142efbfa10f71b7204c052e21edd128526aa86c67488ac9b670200000000001976a914754a023782878342ca910111a403b89396f5428a88acf8670200000000001976a9141fb9404f9f3c321ffc13d1f01ba0228774d3098d88ac736a02000000000017a9144ed2d2ce24efdfadc8384ea8c6e8940509cbdb9b87ef6a020000000000160014b5775a4863432a6a8807ab39a9775717b53cc089cc6b0200000000001976a9144fdef61433408359aa275ccd77f1f5f0841b2d7388acee6b02000000000017a914172a5758d2ed30c6af11e555695ccf11f26aa11a873e6c0200000000001976a9142faba7790b91a73ebb8698ca695d5dc8391a730a88acc06c0200000000001976a91433724e968784a47bed4079fdf58cd980336a8b4888ac246e0200000000001976a9146987f48726e23758e6d55c264efb519f263ae66988ac326e0200000000001976a9143ab96b0900709571d786e2cb4596b7f7fe7e539d88aca96f0200000000001976a91487e3cc2565765d2e17bc483fffbfedc3084cd33088ac367202000000000017a914efda5f0bf1497169807569404818945992e282de87967302000000000017a91443266f056d1167f52668205996eac0b3dcf6376a87a57302000000000017a914d6df9019c541aedcc4348d9091687580ae24c50c878d740200000000001976a914e680edbad5461c420215cb2dbe66afcb925d26bd88ac5b7602000000000017a914b875348cb45dc15c5ffb34730a592342723ec94587627602000000000017a9145f1f45e8572921f731f89fe3bb84bcb8318dc4ce872b770200000000001976a91451ffbfbd1f8fb9116b7085b77c5edc08aca5294f88ac10780200000000001976a914f87f3429292ea8dfb05d1e8f5c26e6416b88803d88ac48780200000000001976a9146ef14aa6f4c610dce2c3636a13f04e132ce1251188acff7802000000000017a914b51c44e64f733f46955aae8df613c93a4aac439e87287a0200000000001976a914d7b86d199710da0154913a15095da5851e436d2888acc27a0200000000001976a914b565035b4a78cf04ed6ace6a59bc6b06ae4e724688acc37a0200000000001976a914fa99a3845b06882d9f3a0802786f17e70e17416688ac877b02000000000017a91421e7d3d21e781ca68fafc0ebd7b42ce1222459aa87c97b0200000000001976a914d54b282f20610856bd4b47de4e6d6d4f6ecbc7db88ac117c02000000000017a9144a1df36ebefdd3f44d8b2d93a645469eba71071f87917d0200000000001976a9143d7193c7f632c67fa89a4c5ec0bdfc09cc9b23fc88acde7d0200000000001976a914ff79f9aeab6cf25adc61e1af9bf06d7f9170ac5888acea7e02000000000017a914f9ebaf6eb2d53d6546818f5949e0e06cec4129d2876f800200000000001976a91478b66398842e013f5a06a49d6880021d742b3cc088ac8a8202000000000016001430f485ae56d7aa33f685a42029b4feeb3520893e658302000000000017a914198ab089c68b00a4c97b35fbf14648c198a9da43879c860200000000001976a914e3de7069b6c7a88a365930704a433a707a07d10288acf5860200000000001976a9143eacd8bc403b606876d94a65584a085de521c6ba88ace1870200000000001976a914ee108cc0529e3394662fe2c39313fc9e72ade7de88ac14880200000000001976a914186b205bb8c0d67167d5687c9d8ce3d7da3851ba88acc78e0200000000001976a914c73493736e7b03dc382335764bbc7126914f0bca88ac7a9002000000000017a9142fd1d4793e3ef9d851ca4958fd7f3e477402b32e8745910200000000001976a9149f91e01b3336bcdfa42eee5962c9f85e542d8e7488ac6892020000000000160014790aa7427f34cb3c3ec38ca3bc0106d8305594b309940200000000001976a91479e343f63005528118afe3f0354b0277c701e55588ac17940200000000001600147eb2d21ad606daed81d21631408ad7767ffd8d71189502000000000017a9148c34003717aeec0a2211bc099797a83354d7552a876e960200000000001976a914d0d741d6ddba76bc69b7753dbaffe71e8af48b7988acd59602000000000017a91491129eb1191f059ec068ea3991755291333cfa82877f9a02000000000017a914edf0a57ab7fe362734924ad3532da09994e3987187929b0200000000001976a91480789fb82245d69ab0fc27d6c2702a00517b32fa88acbb9b0200000000001976a9145ecd0618f830028532fc796c09cade0050a3b65488ac4e9c02000000000017a914c324094454ce42c3f8f294840a54591bbc75e34f87de9c0200000000001976a914b413fc60bc456f92dbd03a0e2bfe77be1d7e37ee88ac149d0200000000001976a914d64c240461e19a7e41ed9e240270649aa0d6f73088ac4a9d02000000000017a914c8cf288556adc4dd72b8fb5822335cd44c0a13bc87179e0200000000001976a9147a80088d7b79c21c53a89b8372a563c859299b3288ac359e0200000000001976a914f84e7cceb211075c0b246ebfda1740376878ff3688aceaa002000000000017a914ab8c836a8708028e076f80bffc83ffd39a2d748f8710a102000000000017a914664b193337513f6cd96cb0aa478b9bad9f487aaf8707a202000000000017a914121e91b267dc2d1c03d2ba0ecbbd165a93dfc3ce87bba202000000000017a9145982195a8f7125814476a7b3908ca93a8f946479871fa60200000000001976a9144e5a52c974c95adb38e05827ba3475888fc0016488acaea6020000000000160014974d1b3667f16421ede4b01610ca5a6a035e45b43ea70200000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac3ea70200000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac3ea70200000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac3ea702000000000017a9140c451b32fca4dd278cddceee7b10f05e17a223e5873ea702000000000017a914243bd59bec7bef27121a11572469d898568557c0873ea702000000000017a91426fd76ffb144eb6ba89703cac57aa1f8a6102d0f876fa80200000000001976a9147f1a28672342a16ad8bfe489915b702eada46b3d88acf2a802000000000017a914028189e37e2f7b7f7d75b70ff757dd5e36c788a08722a90200000000001976a9144fbfde9dd3da76676a6941e44c1f00cb7ae845e188ac25aa0200000000001976a914b70ab9d40c6e6cd525320d29adf30acab3d1e80388ac6aaa0200000000001976a914c03bd5554225e3572a8be9a8ac0b3ec14b5b097788ac78aa0200000000001976a9143c936cf5b51499204d4224f7c96d3ef9025958b388ac96aa0200000000001976a914365aef8c3fc89314f3a31c132b24f882adc02d9288ac4eab0200000000001976a914306f9880942d760dd4ac9b89cc69fc98afd3d76488aca8ab0200000000001976a9149d458393d9b20ed9dbf72763b6f74da608ee37d288accbab020000000000160014362c0ec1b3bfbf2e5add08aa93d6d4b23799239d3eac0200000000001976a914d01ac5f6558e4b4831762c54b9ec900ceeadf42e88ac39ad02000000000017a9141a4c299056ebbf0b1041b9d4553c1ac9db4645b587cab00200000000001976a91446085e29fcb95737c4cf0d765a0cb2ff78756f5888ac45b30200000000001976a9143fc03525e1af51696124df0ea2226bee04cf7b2c88aca4b302000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387e8b30200000000001976a91439b7e597adc1f0e80d06879ff2947227e98dce4588ac86b402000000000017a9145c67e048518cf61af97bd3c7ab59ebefad080c898738b702000000000017a9146691189e3896d57240f514db91b68d11c510a7208739b70200000000001976a91401bf227c56dfd7b2585cefbdcbc5d578bd3aadd088aceaba02000000000017a914d82d14994bfd9415f6915edb0b9054d7285c55e58781bb0200000000001976a914ef04cd9b107f4f8b347e5e5ebf99a4c4db98e08488ac82bc02000000000017a914f48ba37f2a95acfbcd438ce5e411cc963407d69387a0bf0200000000001976a91402066d3f01f6064ea5834de91b8cdfccc0c86a2088acb7c10200000000001976a914af849f7d04c203861a1a875044a2aa38030bbe2988acc0c10200000000001976a914caaa88ebb383d0926880ba89b2eedf175e5662c688acc2c10200000000001976a9149166d3db82194cd388be7e8754bdda19be1a274588ac74c30200000000001976a914cf6047555d1f762dae33c8d6e559fb9f15fe6f4a88ac32c40200000000001976a914f06747739e2a3689ad1cda7e9c285f52e1d4172888acaec40200000000001976a914f6fcf00976bf98e838cc3b92389fc58470049a1988ac46c50200000000001976a914abb61c3d6fa31c2f01fe79d9ec292b92b369bcd488ac1ac802000000000017a91478fa886ab4f8685f43e494dfad1467cafdedaef28764c80200000000001976a9140aee6019307ef0371a13807af26a6f757c09269888ace7ca02000000000017a9144195539492338f7f5aa4e30ed4ce2a8e214d01788748cb0200000000001976a9141d37297d77484a1e21024bcf8f11c48a5c3532e688acb9cb0200000000001976a9145abfd8fc6d0a19ed2bcc12bf21d28399a260b23388ac62cd0200000000001600140c19cf67cb822c85b4ed19c0ec02de671523b9b491ce020000000000160014012138daeede73ce858360acefbddb4a586cf33c6bd1020000000000160014e4b2153a37906672d31809843f7c0328b3d5a229aed10200000000001976a91422865d02c00ef46e72e22953cf63a45cd14d38c688ac0bd20200000000001976a914ca08e8ef1a51355670e0bb8c2bde3363220b2c4588ac3ad202000000000017a9141cb716143458f81b42ae955af651386810db8c348708d402000000000017a914e3a0463974b3b021077a2040f9a05363ee4e036087f7d40200000000001976a9149c69e0782a9c0be54f09b417152eb8873cc88d2d88ac55d502000000000017a914e6fb411105a71f00f9250d2dfc065b51e85515be8763d50200000000001976a914d6a88a042743b1776a807a2ad9f5302311330bac88ac96d602000000000017a9148210a000fe45c83e35fa7250e41853858abad2db87fbd602000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd8348739d70200000000001976a9140d83d6013285d05e843fba7e1a4128a258d8d3a188ac78d802000000000017a91473646ef0883f133032cf7fce8471a9b3910dd7b48725d902000000000017a91435f225985653cb16968ff82b99840f2af8bbf6df8746d90200000000001976a9146ff4cf515a6f0af46b7e443774cb1a2d21736e0a88ac52d90200000000001976a914a046e31b5198030b52e75126d2491204046a186f88acb5d90200000000001976a914ac533dc00c09b146c1f8b60e5428548dd8b075b188acc7d902000000000017a914149cd6e46f01edb2ba7941b6e196af551727f4bf878cda02000000000017a914f92cc7642e73596f6ffa735620ce933aaeea639b87d3db0200000000001976a914d151d133e4d8555c37d21b391eda3a3b80077ca988accadc0200000000001976a9144cb1e804cca9bc6708b036a5ced6b7e26a6fb00e88ac01dd0200000000001976a9144f74ee3e75a0553d8d0dc3c5f3ae451563f1536088ac3bdd0200000000001976a914ede9d0b46db942de0be23b388ccb0615a68bf57388acd2de02000000000017a9149e0e77ff67483849d29bb16da867aacc696c1b118757df02000000000017a9143e49447b029dea5191ec27778b14ca8828d6adc08727e10200000000001976a91466d3cfe67a8bd78c6e687acaa296da3ba2ee3d0b88ac57e10200000000001976a914d1975c087080021d6fea22910f2c5496fc560f6188ac73e30200000000001976a914e0d747d377eb4d3b93eaee05630215f34d938d4788aca2e70200000000001976a914941f4b11b3167aef498ab20c020207ea609fef7288ac2ce80200000000001976a914e7eed98bf37449e52027946e4234d98708fb142088ac24ea02000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd8348737eb02000000000017a914ce6c15b703564d3d0a9e83ba1eab06636fd085fc879ceb0200000000001976a91424c85d5767c3633910a974d908c21ebdd58dbd0488ac08ec0200000000001976a9145933fbed9ff9845217adbed5b0771c805f41297588ac76ec0200000000001976a9140bbe780551f54b3c63015e30479aa2da089c79cf88acefed0200000000001976a91449c4663ae62ba546fde0ea44b11154b33c27acc988ac77ee0200000000001976a9141c59b9049af1acc48a18acc89924888a9651d91788acdcef02000000000017a9144024885124f481cc6984d3cfcf0215a6ed416c9a8785f00200000000001976a9148e6272748e8cef96a52ff6644a14cdd6ee306d3b88acd1f60200000000001976a914a1932f10b219cd00811f56978a988b0bfe078e6588acfcf60200000000001976a9140a5714f957e44ffc534e200dd1ae3affd052d08288acf6f70200000000001976a91408e483249deecaa0b783fa3a1cfcb2e48b2b1cab88ac2df802000000000017a91489387068e89a28ef2f6b21efe4343ffbde7bb781878efa02000000000017a914e74993b48488a864756081f73978c2ff0828eb8787f1fd0200000000001976a914624a823127a1e93a47078ba653154ededa54f50088acf8fd0200000000001976a9145fceac40a6fb11cdd5019dbeb5b61dadf4ed251788aca0fe0200000000001976a9140b46028aceccced413ff53127ab44634aa40c29b88acc6fe02000000000017a91455beec78935355f438546d81ac7b7812bcf3478a8794ff0200000000001976a914cd0d1aa1841718744f473052a30e4f6d3548f66888aca6ff02000000000017a914a646436123f14d194fcaf689b44211e0a4c54f6487ab000300000000001976a9141e878148877502e50d4c735c27c057aba5b8e26188ac59010300000000001976a9140df91bdf25504de4cb426717f45afd7a1b6673c188acc8010300000000001976a91418c2789793be3d6e04bf16e4b9a781dc02b0ed2788ac030403000000000017a914e8838cf2c7cc087db58fbb2e2886400cc801e0f187380603000000000017a9142aa3584f8300dc419cdd5e363d50627734210ae087f90603000000000017a914ce3fe61a92bf2ad6fd3aaad155d2f5432690bc0e87bb0703000000000017a91438b86fc614c8bc821eaa1053e0ce0e578eb79d0487f50703000000000017a914770040c8c8622f85c53c4bbad2028cef153268528751080300000000001976a914f9d084b79158b9d1c5a91a911650a42500852eb188ac8d080300000000001976a91424b562a42c7eeeee19377b5f6c77fa3670add10d88acf4080300000000001600146c1afacefba3f86e4b10a820ba08d660bf1c2d1fbb090300000000001976a91420e5b67c9ff6c62d9b5c2e2246acfeb067836f0488acbb0903000000000017a9143b1f21d252cb973151176e782cbf36a8f938ec1587390c0300000000001976a91412e1fa9b83282b2059a291a2b0e2a3abeda8728788acff0d03000000000017a914c0910bf1e3ed817989966127f48a3677813547cd87ec100300000000001976a914d14a682aadf61ab3e180ed7857cbe74a5b60ff7d88acf11503000000000017a91448340435b8f33f6141b55758062203441d12893e87bc1703000000000017a9146d9d384158fe343bb62b777c26a5b4489b60dc1487d61c0300000000001976a914f01dad6074fabb261ed7e7a1726ef4d6c380687b88ac711d0300000000001976a914d504641a239127340eb8ab85b861d73d8926b61088acd61d0300000000001976a914aab1480c09c391632aff9b92248f4e4001cfd53f88ac951f03000000000017a914f6b5c2b862f154380106db0f17ec176be8f5b66787cc1f03000000000017a91482abb009e348bdd5093db7e2015c937300ee8dd487ed1f0300000000001600147595999958288b1e487a0ac2a16d1f81770bd3be11200300000000001976a9141c85ff46b923de7a57723a2798894fd752b8115c88acd52003000000000017a914a8c245a0b582a4aadbf5806c2923c6b866b7c7f2870c2203000000000017a914c110674de7d59737494974e75aa526915bc6a4bb87c1220300000000001976a914c391c3df03c1fdebf80966cbf9a6525163da94a288ac41250300000000001976a914b2ec90d87f3577175d4647a9adea6683b6d7edff88aca7250300000000001976a914599aa352458cb3f5ba8da40e452342cd538182cb88acf8250300000000001976a914975c42eb120708acfadc7e1f219322cf07a66aab88ac83260300000000001976a914dcb2a320acd1d43cfbe01bb24cde1769260ffdfd88ac9a2603000000000016001407de1a32ce1c7fbde8352a666629eaacf007e647062803000000000017a914937c926f49f50bcdd5238f23781938cb8a18df3787662e0300000000001976a9149433e430ee391de9af78b0a42ffff32d507cfc1288ace12f0300000000001600148736f7db130e3dba234abf1102901a96daa9b32b293003000000000017a91497c1bdc7522534598449069fab807ce0649275f38789310300000000001976a9148c4f986908988021a48cc78283b6ab604d55fd8c88acd63103000000000017a914cf7f99449f4c7c7d1dcbff5df3167228234c8fb98782330300000000001976a91416eb5315a0374b7c6be488546d084482970715e088ac22360300000000001976a9143c164f4f916e89ef3b8978c2e72b90f49ca624c088ac5b3a0300000000001976a914806fc82aa76a38582df2c8c5967aadc9c5a30d8f88ac033b0300000000001976a9140b2fbfb3228223befe64ae17def5b924ab571a2788ace33b03000000000017a9149a4e70aa2ca2df5911cdfa402b826afcfdf064c887c43c0300000000001976a914232681c2787bc446b5a8a5d7e872cef5ee9e4eac88acf93f0300000000001976a914918663f42cee9933d75b2c01649276faa802197e88ac19410300000000001976a914441ba570081749fbaeb5b90585953853cba2063788aca94103000000000017a91454e8019bd9e275152f4d317abd0cb66e77e5ea058751430300000000001976a9146b92df763d79f09d30c8c2f752a584aceea1d26988ac524303000000000017a914c54683811ff7b7b2286004a7ef80107e6e6d32d087a54403000000000017a9146ce551baa7bf58e02402b868d956c1a09bc340058702470300000000001976a9145bf9368bc56ff48a7acc9823fd018f84f44d53f688ac92470300000000001976a914173d9c4b58a15f52541dc6fa2bb93ea5b4bff1ff88accd470300000000001976a9143fd4b8d5bd2b2f32ff5ee4d363a8b1f795752e4a88ac394a0300000000001976a9147549dcad043b1d49713c27604dbf0b233f0eaa9c88ac954d0300000000001976a91455c05338bc8ce58c7b3fd9cb098577490724475e88ac594f0300000000001976a9146fde64649c6beca4755bfc721737165ccf59720688ac614f03000000000017a9146cf098f27c59a08f54fb2b908987a0d39e3a531c87dd510300000000001976a914e2af15273f8e835cb6b5b782c7b3105049c3653088ac695303000000000017a914224f16b259d8b9a0ff47ec35ecd8e3dfd1a92666878856030000000000160014273c0ddc8ab394b862fd2492c2382b43559c6bab13570300000000001600144e0f0e0950f2b96eac093bc98a580d4eb92f32d35f580300000000001976a914639bfd8fa86f896c557c618c350af592502f703088ac80580300000000001976a9145a38ad4d471e9e62c1248d808ac11d8d8388187988ac01590300000000001976a914224aef56853094df3cdab47b3120f210939d880b88ac305b0300000000001976a914d07f0ef4523f7d832838ade95349580c2eab78e888ac886003000000000017a91459e569dcce8df11f5b97877c904b61ff6c2779e987fe640300000000001976a914bc9785979c4adb2c82cdd53bfccde862afae2d8788ac8e670300000000001976a914bc2be1af83f53315dc199a05f5962c6d8e24dcfc88ac536a030000000000160014e22fc57de9745083f0e9ce91f183ecf923f97946366d030000000000160014d0e9c0a7df5aee8b3758ec6a54e839a888293afc2e6e03000000000017a914f9f736ea75624e2fbc3d62836a2ce0c952e09ed187716e0300000000001976a9145ff25838c58508f26cc2e3fd299add9f4cbbbd5388ace66e03000000000017a914ffb386c07629c0791e69572dcf133175d03b391687426f030000000000160014d8c22c38edb1393ef7e81ae1e3ffc4e66ef56d5e9a7003000000000017a9145f7b0ac856fecc31429ad55990ea0b93a64154cf8770720300000000001976a914a0f09f6a64c4ec63233e8b2d17c1d33d7e8a9b9688ac5073030000000000160014a7f1ccd3f3f0a74ab36afab8c4bc347ad61add1b8f7403000000000017a914cbe40c512cbfc2e5fad6eaee2493134ff6f889f987167503000000000017a914ead5398a27d812b49458e0eda8601ec8b1c18ccb874e750300000000001976a914bc331943675378ac99b346a70ffb4ac41c6d5ca788acdc7503000000000017a914d45f5052e10f8998833b5bf515c0d705cea0b04787007603000000000017a9142f03768b2c22b16c94d815c807c4281f47cd9ddc87e3760300000000001976a914cbdca275f5ff3b621a88d88261a9a5b754011fbc88acc57703000000000017a914a7d4cae8191b7fbfffc884e52b866980c03e538c87587803000000000017a9145f8becbcede0f4e87652de2834904b0e50ad3fe087597a0300000000001976a914883fcac2d946db5b4b5230317013dc9b19962d4188acef7d0300000000001976a914610d7bf4f8550f54ed83fbd37c92ff88e550d85488ac04800300000000001976a91425c09987738c250d73b859239674dc5e7f2aa2f388ac2a810300000000001976a9140c5f92b68645197837cdd48919eb14d3932c3ecb88ac7e8103000000000017a9142db486d20d91f3485310dd004e1eaadd7a3fea8b87f2810300000000001976a91480dc6ea5ef7d4f430f800a1860558df8bbafbb2d88acc08203000000000017a914516383e897817005e9af8f6298c583cc5c5d832e875d8303000000000017a9141b22bfdfb0aa6b4c9cdf922214d8a81c2e8ef179878e830300000000001976a914cf93893fc4dd2b80bece2e2bfe7be5903e1af96b88ac41840300000000001976a914f60b7f79f9fa392aac68f948470c66a0e0f822a588aca5870300000000001976a91411fe279c2bf87e8163354a95ef2f31558a82dcdf88acc28a0300000000001976a9147f35392170c04cbe7e84d25f89628165e2cb388f88ac658c0300000000001976a914739f4e1c289ba0678b31adc26b77d60e4ea03c5a88ac228d03000000000017a914379eea157ebdaffa88f8abb878c7b9a50f63aba287998d03000000000017a9149ff3e1d7f7235f5745a7d1b926dc530f547bffc6879e8d0300000000001976a9146fe250f952c83f9f512c9945af69d8490c5fd15a88ac3a8e0300000000001976a9144dd8523539fe6aa5538896bce477eefcf721b2e788ac84930300000000001976a91468783821b30766f37538cc2189e510a1a81c023d88ac76960300000000001976a914797679eb388798f976bfee22d01af1170607a7b888ac45970300000000001976a914efb367fe1bdf5976055137e4776304f9949f29ad88ac6c9903000000000016001447c9726d6452469465f053f83b181d3ec4ccdab5329d0300000000001976a914444dbcec63a65d7675891ab0b43ed43e4709286188ac6f9d0300000000001600144446bb89c87d72377df4740452229482d7c232f8a29d03000000000017a9148cd4fcf224f13deafcaf7d9411d1f238032fa67e87c4a103000000000016001495cfbc56835067caacd14b66f3a3e2a25eac59738aa603000000000017a91475ffae2f5ddb3ce45d289a6f8d7e370a5a113b2887cba60300000000001976a914972db7bee6009812c46f4a0ef7be6230ea83f93088ac3ba903000000000017a914a84472197e007abc01c912357d5d6a32c673cc5f8700ab0300000000001976a9143e8492991173931ba76e0f79a3c9cb439e9360cc88ac51ac0300000000001976a914e7a7375d3700ef7ad0304e7eece6033dc661c97788acf4af030000000000160014b04d78aeb2dd61e3d54474fd430450bd6890f7e094b00300000000001976a914c30b5732d30b861f91ddf751cba284826844552588ac6bb20300000000001976a914ec38714b205b79432e4ea1de0b3b6975348724fd88ac5bb303000000000017a914fba63dfd0ac6f893bb58839af7214e7c4c5c83f2878bb40300000000001976a9148f7524db0220ea411a745b42fbbd4af8dd66686f88ac84b50300000000001600145cec117de9245c4c191f2f36f61fd686dd43a0c904b60300000000001976a9142b33329b1d89e12640f4cefc76a2217baef0e95388ac5cb70300000000001976a9145fafa2766766b69e3d449c9dd05c4a7f81950b9f88acabb70300000000001976a9142ee1ab117f8b8e808d7047296552579087971a7388acf9b703000000000017a914c7de9a49334809b7f29bcafe55d7be84d7cbb5e88760b90300000000001976a914215c4c34ebdb752d6760df84efd2593a1c8e2fc188ac50ba03000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987d5ba0300000000001976a91484fa5ae2f9eaa1200dde8204b3a36a30b777797488acabc00300000000001976a9143bd7358f83692ddf97d5b6aa4af8d7e1a79af3c388acaec00300000000001976a914b9458406b119a3e55e4c6107f4cdcde3f7f67f4b88acb0c10300000000001976a914d575ff15229a78f1fcf863e7ba0336aa400f5feb88acc5c10300000000001976a9141e0099a9937804c3dfe1e25b1667d342ceb1baad88ac12cb0300000000001976a9142bcc649d566cc70e7affd42d0e3b85ca34b9489388ac54cf0300000000001976a9145e6fc90183bf24834b239dabe14b76fedaeb34fc88ac75d20300000000001976a91447c4c2aa07d92772d432455c680a693ad0c7107688ac3eda0300000000001976a914cfe2dc1e71d8dd20a4266bc6659df4e4ac616cdd88ac9fda0300000000001976a914146d9f6b5e7ba4fd67dc805b85d4d5d4bc85abd188ac61dd0300000000001976a9144eb52a53309e7c4bf0e2585defbdeede6169d28588ace6e00300000000001976a9145cd79ff5cda0c239fb68eed43ea7e812aad5c77f88ac68e80300000000001976a914c2938769aefc9bff1b98717fd3c663c160ea2ea388ac33ec030000000000160014b1eb1c9d3706e4006c2cdc6abfb900cf6ae11f688ced03000000000017a914bdb365a57d5e518feca2c5f76f67c8cee75fb10887edee0300000000001976a914de29e936b72b9a09412d3c993439a64cc962b2a688aca8f00300000000001976a9148dc1d53e8db1989c94549e4d74d36915f4ec3eed88ac8df10300000000001976a91404db713e23b89c8874d16eff94c1fc6847045e2788ace4f10300000000001976a914c641e7ab95ff6226a5d20b85a141e731866bc5cb88ac3af20300000000001976a914dec5d254e70811e61f4400d1884cda78b6e739af88ac3efb0300000000001600147f44842111dfe472fc079360f437bd30cb39de40b2fc03000000000017a914375dc64be148215b86ad6eafca6b7d93b6d522b18705fe0300000000001976a9140f25dc693d2aea1ccc2725524426627480bea6ed88ac2a000400000000001976a91480025d289f67844720f5d67c16cac011c20ffcf588ac39020400000000001976a914d1ce0c78463d129b02335a67da7b9c0b8e1305ea88ac780204000000000017a914c7937173ee9048b7eaec5158a57f47610bf4c14587be030400000000001976a914f372469df8f12d8a883ffc192b6636a26b585e3f88acd70304000000000017a914687951f3422bb29381006d6225bdf32dbd6f848d87ca050400000000001976a914e5b31e89dd38f6b5d7b0ceb24769722acbfd4c9288ac380604000000000017a914a3de77081b8e1d42f25e3da74bb6f51b4c8286da875c070400000000001600147da92159ddb5837644b91d188872033d32f62b76f20e0400000000001976a9148361b45e4d9e913464a19e54c9064edd243b982c88ac951304000000000017a9143438acf7e4c191791623f41ed5fbf283fcc7239a87b31904000000000017a914dcc0eb399dd3703cb48e94396eab11c20e7142d2871d1c0400000000001976a914c06d5402f944f45109795fc3dc187566b9d0135588ac661c0400000000001976a914ca02ef5fd0bfb64280c8e385195dbf01ad6f91a188ac23200400000000001976a914dc41b212503fff312bbcecdb6137fe38419fce7b88accc2004000000000017a9147ecd20897e8edc19f5b13eb45025269501f3aef887cc2304000000000017a914760373228539c58d6de489c98dc6a3cc3e011a6a87ba2404000000000017a914c5878e176cbfde571ade3ce5e25f5e7c5d10e031879827040000000000160014a79d50a52022e5195e9f7c0ffd4033bf631c4503292804000000000016001424e85c80a1759dcc4a18ab93ddd41d9d9da96839c5280400000000001976a91491675fc341026194c1127276030d97784958907c88ac362a04000000000017a914d27ef66c8f8bceeafa4f3d373f4d1203b6fe6abb87c02c0400000000001976a9141d4a5ee32ac0f8d459363fdab0bbd6a429e9d1b988ace12c040000000000160014ba0e6e0a08f2b4f39666c508cf724468e4154cea032f0400000000001976a914f2badb82dbf057521419ccca6dde72369493319a88ac27310400000000001976a9148bc7dcde732f3910b52e5196bd0c39a13dee2e7788ac403104000000000016001487c4133f5cd69aef3722924104f08c3e308a391e5932040000000000160014948ad43f7a30a0305a581a6c3d06879386cf172bdb380400000000001976a914ee88e273fa0394ee251aafc6a3fe55df75d73c8888acb93a0400000000001976a91461130cc2024a6dfea95eff65280181d17b5e757f88ac613d04000000000017a914e0f95bcf34fa30506d6ee484a9446901197c0f0e87143f040000000000160014873cd95549b892dd9daa051888120d6d383758f9983f0400000000001976a914f65015f4433b6448c2f7fdbfb890ab9700f2767488aced4304000000000016001469e36acccc6447a1a85b30f9ab7cb3f0728bec38c7440400000000001976a914cb75c4ce6a23d4912e9913bc7228944232e058be88ac02480400000000001976a9140a3630608029920e3490a29ce077f06c108d43b488ac16510400000000001976a914387cfea2a54da3da33d4c011c8ff335f45c9eb6588ac45510400000000001976a91461fc8e6950d30cdb6ed2168b5a98e8d70356e6cc88ac97530400000000001976a9149012a6473bfc3945fb42926756d2b3478e39c42788aca5590400000000001976a91484a30e4dc4e9249b5ccde2e69ef9b3917bdd01c188ac2b5c0400000000001976a914f84bde8a5934c4e5484f2309c620de2be8801b6b88aca5680400000000002200205c395c1d4def7dd18abb60e118a52ad4d65a6334c61b9f6bf9d6b5b677458eb9cb690400000000001976a9140229b478650a08788609e87c348cb6347de4864188ac576c0400000000001976a914d502db009af64de7a08babf9a1807fafe1664ad188ac9e740400000000001976a914e6a03fa12af37326212a7eea54066d0d08ed91c188acd07a0400000000001976a914883278a74a78711ef18802dd3c72d032d56a113788acd47c04000000000017a914b2c2a28980f37cc5bd7dca7e1a5f8ee328ffe53387ea7d0400000000001976a914e0f60c73730f31f98710acb08307eb25efde041188ac7b8004000000000017a914686603fe3f26507b36df961d7686103f9de1baec8703840400000000001976a914e20a65967efcd4b655e2d7de9f9338c954752f8d88ac73850400000000001976a9148a3314eb096bdf71c7b9043d3dc3c24f7d3ab27088ac9e870400000000001976a9141501a0f7700bdda29518dee0490c98b786fd66b188aca7880400000000001976a914934a87425fcba6a16aaa75617c6ee01064406bdd88ac008a0400000000001976a9148d3ba35ec390ef48b5d861838e3be21d34578a1488ac138b0400000000001976a91465fa56882652d479452cace8e57a9571a213a06288ac188e04000000000017a914b7e6e176c9c0cef2a638139fb36d05ab56430112871f8e0400000000001976a914ffbc4dc5cff5fc3df445c4224595273378572e1b88ac7e8f0400000000001976a914d86ce5c0157185487c2cf2c78d16051b1727bea288ac4793040000000000160014dc45875a3b5d0fcf36a4bf29f95f88e664fb48f30f940400000000001976a914d39498fbae4e8208d682f5911472567d937d484c88ac13980400000000001976a914f4b47762bdaef56c87c3da9d188de3a3f02856a888ac84980400000000001976a91439092f1c9175992cf024ccf3d1b03496aa98c34788ac899b04000000000017a9145fca01dbaeda3089181bb64e38fec115f0d8e7a58752af0400000000001976a91475186ac29d05294a623cda2c0daf5f747828362988ac31b30400000000001976a914cd8be0466b90857e56487407590d9f075910a80788ac44c00400000000001976a914d00b319a3e8b20010216fd38551c90d7ab65555488acaac00400000000001976a9143f16369c5dbb00df8269705eb7e8773724b4dfda88accec20400000000001976a914e3672814e3fea226ef1a2a342f0024cfb6300f1988ac10c60400000000001976a9140def774cad304b9119f5f9ccf1c4ab713e0524e488acf9c70400000000001976a914764b90a9e38b7b42b301922972c919bb49ff350788acb5cb0400000000001976a914a8a75b8c7cee618a26fb954fa32ad182146fd7b288ac89cc04000000000017a9144f24759f91e5d18af82df98909028725a5f102c7878dd30400000000001976a914353b1fb9c2e82e4ab881f4c9c486af28f03bcb7d88ac06d70400000000001976a9148ab8c74d8a27af778d3f76bc906e064f454bbe9e88ac6adb040000000000160014ed6467af4a999b8fff3d45491c78bf4afbb005b48fdd040000000000160014b8d2d9127f1be94d9975e4ccb4a5f57c0efaf34e97dd04000000000017a9149a8b67dd936da102046953e8af8b2dd44b10a0f28736df0400000000001976a914cdb5abdad645289e0956694cbcab43f5fc4728ed88ac59e10400000000001976a9143612b2a5da213afb187d2b33159cbba81c1fcb6f88ac3ae404000000000016001463452db1c003366f4f39a09e676ab478a6e0667b5be40400000000001976a914770625185098f65d9546c13aff01a84da814e50f88ac60e60400000000001600142f10a8f898ce5433eed8a2a9cdd7d8c8c5522a4acbe60400000000001976a914a005e2379f94c1d12f34cf5c5607d62b6ffac0b988ac4af104000000000017a91473ecc30a6b7a595c100b730ca56ca9c6b57fab628743f304000000000017a9142b0b0f69c39a4ffee43083d9433e9412f24de95087bef60400000000001976a91495d7eef0151f50146fd61356ea9f459001a3e91588ac1bfb04000000000017a914a179eddbc9e6368194d031aa2e88d5d11a4816fb87a902050000000000160014d5603869182befecaf6234384dba7d38d31b36320b080500000000001976a91408b977203f18b3b9805244cbe95687793ed6294588ac680c0500000000001976a914a2db73b7906464f0974043268933b8386405f94c88acfe0c0500000000001976a914f060a13d2073af3cfa399ba2b5a2779a75937b0b88ac151905000000000017a914f63b874c4fe1d4b863099790e62b1bed1caf3a9b87881f05000000000017a914507af974050376f72eb8d4ad9b3818b13c7a1271879f1f0500000000001976a914fd1add4193983ac5a34d707019e68106186e814e88ac02200500000000001976a9148b7c63a4e8804390f31ef3afd48575f9683cb2c188aca1200500000000001976a914f1a1a4da66a975c7719fecaf5296929a40f86bb188ac9a260500000000001976a914748d8aa2f3e8d6fd1004e3989b8b672a3c75859c88acd22f050000000000160014c7c7b2e27d250ffb4c74d3f838c37379bc598a6613300500000000001976a9148172e4e4ea3b371c73f6bf244a20d89bb0c6920988acfe370500000000001976a914b1018763a12d1e1688b7d3445fe6dafc9bc92f0988ac153a05000000000017a914763468c4ccb8d5a1ce4e892fb9cc3064ce56d23f879d3c0500000000001976a9147be63c55ea18b14def1c1398b8b0a2c780c3850788ac7c3d05000000000017a91414a107ec76e29e6867d2dc9f95911632d3f3979887e33d05000000000016001475721fbb099797d287cdd2b408c5974df868bc3bcc3e05000000000017a914a1612d993ce3a9b2ebda6dae582a11dbbbd95e9687b93f0500000000001976a91482521b2239cf093f98266554727843e7a19138a288acbe3f050000000000160014c9b76d54ffe3e15a73aa483ddb3875121ca885b70f400500000000001976a91416451c0184fd9825a7cf8d3b7794583a879e4c4288ac11410500000000001976a91458c6e510ce6f57517ed2f0eaa2780b88112d69b188acb04705000000000017a9144cd7b8e4aac81bb39593f122df3b9788b6e7aa7c87cd590500000000001976a9146c688a2234570128975e713e1d57751c0b7f33b288acae5a0500000000001976a9145090fab5b160bc2c8b255a6fe056039f4f5a534a88acf65d05000000000017a914036e5cfe9101427be5ed0024d4b1b98b730e0e7487ce640500000000001976a9144268e9a5c6f62232e51c64a1acfc3048e669546b88ac5b6605000000000017a9145b6f66eaf9acf68437e282882cd7b144b5e3ae1a87b3660500000000001976a9148c35defc5ca40e985d9c008e482375884a4eea3988ac8d690500000000001600149823fc422f661e9d16b783dbd65efbb34205df23446b0500000000001976a9149eceea714203840ed8b39749d46eb7db94793c9f88acf96b050000000000160014f322bfa5f4175a68f7cd058703a05bedf432f27a607705000000000017a9145f3e870f0f8f4bbca3a61fccf826c0a32c97a12687827a05000000000017a914b85f9b781724c1fd2d74328e1bb53fe43cd9242c87d97c0500000000001976a9149d1ebc6cc397e284f67f34a4ea9cbb9003ed598e88ac08860500000000001976a914183a066a415c7eb58f47b75eb1e007d9f56597a088aced860500000000001976a91471df6e214968ae4aff588bbb760c360a4ebe6aa688ac80870500000000001976a914ffe2b93ba0e698af28b8d11f5ba10be916327e3c88ac49890500000000001976a9147f91d9e9c32623a5f559378fd923323d1c4e6cc288ac66890500000000001976a91421ff61718888c185919fb858418bdb6997b5eca988ac74890500000000001976a914d720ec0e756463d46b5c1ea70635e23e6edd032488ac848b0500000000001976a914f4d1790847e20b6fafe4de90363f377ff270524f88ac778d0500000000001976a914a0cae7746399bd94dd856e5b847c7f70acc608e688ace48d0500000000001976a9142e68e0e06befcf1bb9ab274bfdccaa64882bba2188ac159205000000000017a914cccd8215f55e2fc3315da5548650cb50e6011cb98743920500000000001976a9148fe0b3a37d6a29bd367436d00f8383af4d6daa2888ace6a50500000000001976a9140d4ed3258489b39232c68204ea7b2279db7d1bdc88aceca60500000000001976a91446a95819446dab77176819e1b9b2cfebbec91cd988ac0ba705000000000017a914b1874525c94ba7f570128d83fc9aa678ea071742876fa80500000000001976a914ff6feaeb6c8dbaaa5ea86ce2ea37283dc246ff8288ac9cab0500000000001976a914a5242a12ec1457cfc919552b132014271709bb5488ac3dad0500000000001976a91411d66cf9fe2196cc951f48b029cbb2b10df0f29d88ac9ab00500000000001976a9140cacc2cf43eae3d3b84b9072fb7ba7c8e0dee42988acffb505000000000017a91447d2f723056ad6338b23280b3411ab9d49c6b57b879bc00500000000001976a914af7e37c7ce92e17c61b02db5c176ff08c8c9a0ed88ac72c2050000000000160014aeb844de22cbc3cc8adef99c661ad16276a4dffad0c50500000000001976a914e765d722963df4b4b4307b0cf4be8166ab72d3ad88acacc705000000000017a914a066e4f692dda3e3bd31cb33a14af9592c324cf487edcc0500000000001976a9149ffdcb982e50af2022f2e13080e96667025dc4bc88acebcf0500000000001976a9146486b00cb6712a755e77d133a64ff081ed23f14d88ac95d90500000000001976a9145b1d18ce375bed852492a91a9c02688b981a159388ac92db0500000000001976a914cb1038515d2705b051e5dc0f051c3972b99814e188acdbdd05000000000017a914a6c728388c3afca7b9e26aced0f92ddea585ed798753df05000000000017a914cc8379615b2bdf736920145b9dec7ae055f86f788752ea05000000000017a9140a91cb3e64b78d646a340ac670d9408bf528e4fc87d3ef0500000000001976a9142afffa95a87d5a8d7fccaa2ce4949681ea9b048388ac80f40500000000001976a9147ffb8104b1dc2100231be97daf0aff9a544394d388acd0f90500000000001976a91413ec2b4156c5fe9bdf83a2c33b84f812f75105fb88acccfa05000000000017a914aadf7d45375e843c7c92c7d651d0f9b200b79932877b0e0600000000001976a91487ce46124a73e8dfc69089ed6b9379539a57272488ac7c0e0600000000001976a9149e23e1b0923e9354f266081d1cb655b13a7d3f1388ac900e0600000000001976a914d3a138c15b46ea7682eea2d2617632318cc91a5788ac02180600000000001976a914bbbd97721c3f809f36cf0260977b45b048e553c088acd4180600000000001976a9149e05b3bced46e316648a51e01db621a8dcf4fc5188ac9b20060000000000160014403b54cdef4969a04606f7641b4d9a6143077aca70210600000000001976a91493e35953a9ca019f36beffb5ea2e8589c3cd6bc488acf4280600000000001976a914dfd78b79bf1fcf62e55d8c5af297db9b464b2d3e88ac142a0600000000001976a9149a7d5506f9b466788f44c1c520f51145249c39fe88ac572b0600000000001976a91427067a7adf3832d390f7c6cd52f5624406029f9f88aca62c0600000000001976a91483527642d8b9cb9edb4a3e4b3c68c322c4f070d488ace4300600000000001976a914dbaa35c0860ce00fd537ebb965b575b00883ee7688ace730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de7300600000000001976a9143d008acd87f0de3c22b7d6b46749e4ca45c6ce2588ace73006000000000017a9143a4ef6f3a4f568136da34dc3c081de09a16ed122871b3306000000000017a914077ee7f370ef05fc180702673074a1ea7e9dabe787873f0600000000001976a914f541f3c3aba659968f319a898aa1ffcea3eebb9a88ac3a430600000000001976a9149543406f8ae3f3e5858284c7aece098fb6ced3ad88ac46440600000000001976a9148875f12d58f7bf38359c673daeda6c5d48d11b2388ac84520600000000001976a914db60bc77a4e1315b949867b75672a9bb93d68d0388ac47650600000000001976a91477eadf63eba5a84e82b25832df9716ac19e2da4c88acf7690600000000001976a9147994cb2d3879a66fadda67754eafc115cb91ed8b88ace46c06000000000017a9144cf6e6834864a100e77b6e2a39832cd489bcc5c187176f06000000000017a91430d484ef2679faa9e8daa806c4a06576795c400f87f07b06000000000017a9149fd59375cdee3073441c0fbae8e7ebdc36e6be82879b7e06000000000017a9143e4ed1874fcffa88f961604a7037fbbc4c434a4787838006000000000017a914b42067c0a7005f8468345a965addc3164f8f66de876e810600000000001976a91469ebdfaa024cc264dcea8bfbe61dffec5a73345188acb6880600000000001976a914f20c0e0bdbca1354c51c8ba30fdbcd7f28fad59688ac15900600000000001976a9145ab856fc3c5d17e8ed1693fdf90a77f2069fb4f588ace9ad0600000000001976a9144167a996ea1bf54bb50c8c6246be755068052ec288ac7db00600000000001976a914ffef1f614acf1f6a5a857f7e463da6c6582a603788acd8b20600000000001976a914faf162f46a39e297bb9bf4119d5bd5b950eae8a888ac52b70600000000001976a914c6ade0db0eb2a05feca258338bc557328f655af088ac58b70600000000001976a9146e74981815565695cbcb84fc2f3d977d206241ea88accbb70600000000001976a914b73000310e5de0189255d2df20272b9f3a91347288ac05b90600000000001976a91455fb594e1e0dd5fea1d5add8c1569cb735eef7a888ac82c5060000000000160014b21e561c3126a540684f6bc08ea3138560fb95e4b6df06000000000022002001e22eedad6deb7f4bfe6dae800b8e67afc80da07d00411ff2ea10afc90f72c1f1e10600000000001976a9146ba3c4af0ed60971e88f54a082e10ac48a8a4a1d88ac44f30600000000001976a914d2a2ea72d8081d4eea128cc065e20c8034a2315188ac8bf60600000000001976a91432d8c1ffc1ae1838ad65de0ffe0a481032e4039b88acd4000700000000001976a91479c2155e7f891a320647869bd8bf61973880ce9988ac470807000000000017a914d17107f2734c9091d5fdb9d07992c75706568f8b87ae0c07000000000017a91414a107ec76e29e6867d2dc9f95911632d3f3979887962107000000000017a914619b3d03207cf6a510968cb6b1ca414cc81576e38782230700000000001976a914502d37702813288ef5428d0ccb5879eba679b5e788ac7f2e0700000000001976a9141b0864ef484b68ab249fac3f457ba0b2df63ce6288ac1c30070000000000220020882aa82ce9cd9ca4c5fe13b0dcdec4000fb44baef34d4547bd6c2c1730ff7e0b8a380700000000001976a91455aaea3170a4e7686d2185aa627d18fd53ebe34288ac5c490700000000001976a914412f245d9e7700e9fa369fe3d37e6a4b040aad2688ac2f4f07000000000017a91447f082b06c925fe64bf62344f8afe87a9ef3cd99872d540700000000001976a914e0afc3e3d36168a8f6e527cb2bc2ebae6c6342c488ac1b610700000000001976a914ccea08e4b90cbf78e41c80f16adf199ad7b011ac88ac2c630700000000001976a914a1bd1ed342418732dc10f29527b4d275bf76321088ac4f7007000000000017a91488c1f0eb15cc37656b326f8fc0e442dcd71789c387778007000000000017a9147b5a4a967c37125ee6fd897553a260ca0f9724ef87188407000000000017a914fcd9e764ed44ca0cd5586552277324168d9349ff87f687070000000000160014f574157ed1fe87515a1d1477570bd86da75b5d4ca38d07000000000017a91494b3bac023038f1892028287a7c5ce262f30f6be878f970700000000001600140603bbe3cd7ecb720198b018bf2e281a9ff4fd7f909d0700000000001976a914ca02560de383418f89c5b4425fb8f976529d68f188ac149f0700000000001976a914298048c59ac5c75f05df4e69a2deaa9197d47a6788ac70ad070000000000160014942e3bb4838c57300025181fe861a6f3e3bbb3c404b107000000000017a91421405bd201e777a0bdbdbf42389805e6919c93888727b7070000000000160014822c53fdf1b96ef1eb09d248483c4d751d1ae85dd4b70700000000001976a914ea2851744905d959f782952ba94aeabeee2ecf9688acd7ba07000000000017a914872d013a4f3d532806e65807573872517799c74b8752be0700000000001976a914b1cad0df7704dad6ec4d334eb2ff4c2fd0239c4c88acacd807000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f7789873cd90700000000001976a9141ff4a6e7ef0e33054d27acf135a74f4f2a381d3388ac28db070000000000160014a4fa671f8a7a3b297e4a02582e105d75752793b6bce007000000000017a9144cb728c00c5870252f6175096e450a892694eb31877fe207000000000017a914dbc42ff142ec04585187b05999b637c2254229a287fce50700000000001976a91424da56687487fa47add619e9be7884ab6bee9c7d88acabe70700000000001976a9140da3d949c84948b3b134c104c7caaa00244346eb88ac70f907000000000017a914df56b30dffe1c47a2b74e1b6eb4f714c7b39da8b87d51d0800000000001976a9145cbd47bc062ea04e7c857b9bca615a1b8ca9988988ac24260800000000001976a914244978cb0a49b184c68031b6314f1263e826293188ac6b280800000000001976a914e2abbe93e0592766bf0ffa03ecda78f91be34fb388ac14290800000000001976a914a85d670024e6c60ce1d4b98b75a6bd0274ac018a88ac062b08000000000017a9144cc5e22fac905c88f03a3f05bad8ddb910922b2e87a95508000000000017a9142ff1a08b815f854699e13e6c981ea96c1853a8a887c15808000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987205c08000000000017a914de337ea35a312b00f5a3337b51b8a322948c8e5e87ed6208000000000017a91449783f25011f5e059983f4c900a1bbc9d7e76a5b873a69080000000000160014d11f5d85916f423e05eb61a223989872655094d0546d0800000000001976a9149c2cd4f8857c960fdd8352dac8f6ad013451016188ac797008000000000017a9146a1ccc04118400e669648aa1ce758d04e2fb3a0f87b87608000000000017a91499c17eb9284ccc73341684e09ecaeb8a80d58e218780880800000000001976a914597439ef2a57781a278baf24000117af9a1c7d2a88ace8900800000000001976a914c131793bb7858746e00bd4cc09a6fba39928b94788acaa95080000000000160014a347362baa8ab8995176481905bdc2f30d08dad0fca008000000000017a914bfa73128aa66aecb5f4b49585779adfbb26a3e118704a80800000000001976a91449bb7003d53d6c113bc6c17b2e358cd4dbdead1488ac31c40800000000001976a9149a1f70cdbec92a729d24f2c4c88035e40bbd8cbd88acf7cb08000000000017a91463da45492320d23f8e6818e3fe4bf60e46bbb0d687d1d108000000000017a914ab21d54ffe573f70eb8519e8025c9a3dd81821f78724e308000000000017a914228b43d8067fa5f4eb28becba804a0065a0b5c0587b71909000000000017a914eb2a804bb8759cee0aa519f4667873cb5009b3fb87ca3e0900000000001600144d992efd8f580b6f9ade39af7c04c5bf687b2f3e5d420900000000001976a9144f635ed445fb0075a22dc4576497b5b90c51bc5e88acfa450900000000001976a914d27832eb5b01d64c61f94ab61ca9c247ea3dbdda88acee5a0900000000001976a914cb1b228610eadbf6efe4388342d37fb4534b00da88aca85c0900000000001976a914827a37a09fcf44d2d37461c0d4b883f5707502a488acd06c0900000000001976a9144e1552c1176115eb25c877489032c575b973702088acbe740900000000001976a914c3e21f75f46c4158a3903b5c95b5627dca4c48f488ac51980900000000001976a914b5bdc69df2fc104b74760fae882e88559c9b1f7e88acf39809000000000017a914dc1ecfb127fcf82d2e8c599e8e1aed69a8993365870da809000000000017a9141bc719f40b9211a5e468da9696b363146492eea5878fc609000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987bccf0900000000001976a9146f6e640a17f716589adb51bde3a6ac303022b82688ac2ed90900000000001976a9142e22942c10986f54486fd8a61c12b12e30884d0e88ac23e209000000000017a9143c5d7702d77d448af890a7d99e660b90bf20f1c387abe90900000000001976a9145f6a99db3f4f8d380f654fdc4b8ab09b97f744c088ac60fa09000000000017a9141b7a472d4ecdc3b1acbcfe80a712439a766328f6875a060a000000000017a9142d13cd8e110f7483c0b87e31c37e0ae317ead18487b0280a00000000001976a9145fbfd247d357ad2b3d0cdb3dbbb138e4285f8c1688ac1b320a000000000017a9147f106e41f647fa01e9d036687950a0672582dfba87973b0a00000000001976a9144ff94cdbfa8fcb2fdf421dbd2c6e2f4f213b71c288ac9c480a000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987a09a0a00000000001976a914e289798dfe356590962d01c25f92901486f2d02288ac68a40a00000000001976a9146e495417f8a07e20d8257e69d35b10dcab1023d488acf8b10a000000000017a9148d5f829361fe1bf91f1241c212eee743801285d4873fee0a00000000001976a9145dbec4207354ef4d62b8dfebde2bdb969cfefc5088ac70ee0a00000000001976a914992ebc8602a6a0d65fb5c10b36c68b034a78595688ac33f80a000000000017a914b2a1e87efccf3f5075bea72a0e16db90417735a787c5000b000000000017a914bfafbbf103548e233b18c3ceee5fbb6f8953560d87267a0b00000000001976a914103f69aef3cdc33161c9c447abd8ca4134ff24d988ac04890b00000000001976a9144a8833693e13b47cb924ccfd7ba44e128d354f6b88ac12be0b000000000017a914dc6bbab0306ed60b9d9b912aa717b265e5e0697b87a2d00b00000000001976a9142e3f99e1740478e483661382c9642b477024829688ac4dda0b00000000001976a9146c5e9138f23be719ff7d8fddca9a99a9433845aa88ac59f40b0000000000160014ec733585eebb5b7af3ddb9ccb8994e561aff3792cd010c00000000001976a9146d0ec8ecf8a1afdfc4e9fda8508754f470838a6f88ace0080c00000000001976a914d3c330cebe42af23530b1c523d4182643fc9c84188acb8190c00000000001976a914bd522d6a87fa37b4dde0f14464289ccca79c91a888ac962c0c00000000001976a914080546deba1c49c46697356309e1dd9245566ed588ac13300c000000000017a9147f25767b761924b1b8c5e2e66d6566157c5b73ff875b550c00000000001976a914a0c502606e56e3cc9a367e1775cad2fd2819e86f88ac6d670c00000000001976a91444fe9b6fd3f59f9b3478f6a2de1aff7d357b0aaa88acb76c0c0000000000160014ddef362010854c6d3420e0083769c085220c1808cc800c0000000000160014969c39ef71a3c4f38ae25bf2372563d25a4f2e1ea7a60c00000000001976a914c81cc1d34c8da4b3a4de9031bf1919bb0142ddff88ac85ce0c00000000001976a9142ac679e0780db05c8fef623818a113dce902a2ca88acb7df0c00000000001976a91418570668343995210d3e126818d43ce8d5b3826e88acb8e50c000000000017a914f2cadce92502bc6e3ce821dfc5e6a7df1d10415c8700f70c000000000017a914bd4525cb5b6dd0daf7043cf86abf13494037339c87ef1e0d00000000001976a914a29c4a96967127527f99338064c17f85ab8e9b7888ac41560d00000000001976a91408d3e20d0b91147377b8d76bf44647dbeafb450588acbf7c0d000000000017a9145251779cef7b0607ea12203dbec724259ea41a7087b2ae0d00000000001600141e409f4960027c6a1406c5bc47a1c838cde03799d9cc0d00000000001976a91414dcf0db71b67a869094c3bd19c66a26d30261ac88acf0d70d00000000001976a91426d789290943d9c153b847e374ab7042d2e9ee0088ac3cdb0d000000000017a914391fabc3e7c9bfe3af20dda3fc2c3155f391dcce8733e10d00000000001976a91481faa0b73554856d40a18ad5f11215223b1494a288ac15f10d00000000001976a914689d791198020cd45ddd0fa4213b5a449427b97a88ac49040e00000000001976a9142d964680c33ee9a2796520c5d218f2f37d32f80088ace6060e00000000001976a91497f49dd3b411593153e9b2c8eaa585cec1f1c9ec88ace30c0e0000000000160014e82d20ebc4776244fc9d54a28c976dee5d13a713aa220e00000000001976a9142309ab0833360f7ed7e1d0612ac1cf69c502de8388ac88490e0000000000160014293e90b17ac01552471f40a79b4817bb7ca9a906eb490e000000000017a914927a3dc2367db89fe2b2a21a397551ecc528355e8779760e00000000001976a91402a76cbac539b9e441a4140a60f54e1992eeb49e88acf5f70e00000000001976a914042df0ab60458930bc949b76418cbafc75658c0488ac95fa0e000000000017a914bb66f43f1b70c4848e45a4fc95e4f4426a81518f87bd260f00000000001976a91453ade31d24445df97da9861a73462a9ef03fd7ef88acda3e0f000000000017a914c840c9102f1e57198a3791b3ab6649c80e9bdc7e8791480f00000000001976a91493883ae8724ee9abe62de14a6c1e4b9e6d76d96788acfc4d0f00000000001600149a22d440513becd2eb7c0b45b000c1c1bc59e0aacf530f000000000016001430f8b104595e01f91999cb46802c2b9a565352f2125a0f0000000000160014fc10932421bc43fe253aa29b8f5e3aad369ca798a5670f00000000001976a914016c509531de44657c9688616318adae6a628a4a88ac26780f00000000001976a914ce201d566cb1d7bcd5d111bdecb41f853ff9957188ac107e0f00000000001976a914ebc67c51afddbcbe9deab2952136153aab0abdad88accd980f000000000017a9142d874da3aac67a69c80181ecf75ce90994357429877faa0f00000000001976a914831f213dba5239dc9985dcf76b9b94da10494ab388ac93b30f000000000017a91435c0d756ae0e7224a30b8c336e5b0b50a6e05d8e87e4be0f00000000001976a914664d9758a1f6d4763d3d5e45bb340bb576be27a788ac5fce0f00000000001976a914f86d1fa243fa7323ebc65f27ead0a519216fda5d88ac76d60f000000000017a914d02771771ec0462acc8156057c805c99954d88d187efee0f00000000001976a9148e0317b4571f54ece294ca8ffbae480a7278783b88ac5f271000000000001600142dc93b39fafbfaf36f4f52a693eaf8665a98263c1e3c1000000000001976a914e4227d1fad1ac5c17b70b18c8b5b6e5cc5fee09588ac5d811000000000001976a91480ec466d6904aa8c67cb5534cec1c11ccc0cad1f88ac6c831000000000001976a914a6e2a3c37b82576ae223efabcc5bad0e20e1e7d688ac168a1000000000001976a914c6864c257c2c919ec694c354f2f991d21661ff3e88accd8d1000000000001976a914ae64c130b749df465f1be247f9108cd1bbdc621488ac05d3100000000000160014a7e7f980e32db28a315eb45dbcc22f3999c817458ae310000000000016001496587328b28180dd09fe85d73db2719e808af3c25216110000000000160014ab659cc84ca27803b995115daaffdbecad0186b2f0191100000000001976a9148262cbe02b868130a7fe6da537ec0443d3f0db5a88ac174611000000000017a914706fb9e2744d979dff0f6bf1d213e4fb7e20a98f87524611000000000017a91426d4210bf180e02cd3ecf9b6a6d788dfde9b3ec187a18e1100000000001600140290b6fcfe76a63a9e1771ec99849b03a32f1f954e981100000000001976a91467b42f4443d02da9298fb9436e37ef8f07e8ec2888ac25e41100000000001976a91445ba6da2a0d8b8ff6170ec9399725765886839a788acea5b1200000000001976a91422e89231594e0169acb6e71144b0bc946ac4ffce88acfc8c1200000000001976a914f8887f55ec10011a7bea0eb45a24949d208ff7f688ac10a01200000000001976a91408809ddd185ae76298a5b7339b3a4556412073eb88aca6af12000000000017a914cbde969b65f6ff5f2ee7ae6a5be67d1fc71bff5187691613000000000017a914b117a5a71d89da227f1852d573fba8e614041e8b87c6e31300000000001976a91416f1b607788a0c5ee757d977ea3abfe49cfe4baa88accbeb1300000000001976a91454c96e0abde2d154a7ecf856116d996608513bdf88ac66f81300000000001976a9146caeb68bb288ce7e76831610daecf1ed18db61b788ac862c140000000000160014d097902bc396e8232e44d2672707bf945443c41222341400000000001600145c4c729a639f13c669236805fa07df94560435e18d691500000000001976a9142ef5b1b566cff21c636e6c23dddca8bdeec6741b88ac259f1500000000001976a9146a13b433b2e406c59cc2ec5041e782b84d5a7d0288ac1acc1500000000001976a914dfa316e51d264f7de4033777338caa9e024b356d88acca0116000000000017a914380a2239a213c02376550a40277e31831f6710f5871c3b1600000000001976a9143c61c1115f21682b46ad3e317d7f72bd8329625188ac645e160000000000160014acb03e006eedfc40b02a044c0fe02237828a7b829b951600000000001976a9147af6900f61ac9a5d35791ddd14d2b8dec1ad651588acfda71600000000001976a9143c113c33e8b95db26331c99f60e7d0e11f3c5d0b88accf281700000000001976a914a61b8a1eb1e5e7b822833990b383f8e977896e8a88acf22b17000000000017a91432a21838feb16ab48cedcab5995caea3bbc2cbcf8715911700000000001976a9147aa5b35b5718de6bfbf1b5df0004c412e9f428b788ac899318000000000017a914a847d071350b0bd5e22d779014b7b6bb281736138703291900000000001976a914e8b657d5bd8d53fa0f806cb7a4d97139e9c1e95e88ac324e1900000000001976a91435c879b9f2a349d157cce03341b1802a3e5f684388ac48ad1900000000001976a91428202178c32d041ff6486ff6a2bffd2b3a87b8b088ac9cb81900000000001976a914032751b42d1f1ca3519af033a0ef6f434573da6988ac92ce1900000000001976a9149c36cf23c9f6fb14638e082a5ac3a26c1888bd8588ac21061a000000000017a914f7c6ab5fc76f5cdf9388dc1a9bc3cde1d3b7a136873d291a00000000001976a9148ec04c7862b3f0c588373456472e5c6b8e2d9f4188ace0801a000000000017a914406c86165d9957638695f31f83c709c9461270158727b31a000000000017a914a3a4b08d094ee4527d40da5bf89d8970428faf3f87a9bd1a00000000001600146f9cf0f340b5eded2e21767a8e40ff4e162f8918ccf21a000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687262d1b00000000001976a914e6334d07c1d1e525d1106b4ade0c5ed68e78869088ac1a561b000000000016001466786a64b4ab69c526b271c8f4fd64ed4aada6c922821b000000000016001413cef2fcd733a5d264aeccde6228e9cc690e400556b91b000000000017a9146cf8194d0a25c1d0c2e1253494d26e41aad1c1c28727e81d000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987a98c1e000000000016001437fd2739e5c1799fecffaa4a6f2c0eb837572824a44b1f000000000017a914a82a34d3182a923af48305d9fe18696708de89ca8716681f000000000016001413cef2fcd733a5d264aeccde6228e9cc690e4005f12d2000000000001976a9142070d1c4ca941693222d12b7da8c9d3eabf5217488ac506b2000000000001976a914a633b7d27d14e22c53317773c179d55af342b70488acb06d2000000000001976a914aa222d43f129ffd59c5aa50876f49863139fae6988ac48a92000000000001600140171eb1a3541cfda29c673629b5ef57c89f1d38547c221000000000017a914c161560a3945c3aa8a9aaaaf017251bdae6bff6f879dd32100000000001976a914007ff262e4925d844a46e347fc53036b3ae8d13288ac414d22000000000017a9140b66732c90e61a64b810dbaa262acc65cef6630787661a2300000000001600143aaa9499b184fc72d126ab86acdea7c5d5509bdd7df423000000000017a914cae36ed15c068a3428c9d6e0b493b3efdabca6dc878ec32600000000001976a914d22b37281de6bd30bdbed64b9f46ebfb35b34d3188ace0b72700000000001976a914de0b8a81f11f186e7a307a7f20444d90de02b82c88ac74d327000000000017a914eeb5aa4e77f745ab6a697297acf293e0180934498739e82800000000001976a914769a54345e0664855e06a73355e82b1b86c1049488ac25ef2800000000001976a9147fee44c9746c37dac8d176f505270fce94f5747488ac55022900000000001976a91449c4663ae62ba546fde0ea44b11154b33c27acc988ace03729000000000017a9142c8e929bd1d81d9424973c5f378d16038b19b41c871f8f2e00000000001976a914fdd38b0a3eefb6fab97bad3448a8ad1b160a610d88ac73093100000000001976a914474dff9bad94c42e348cd20a229cf6c6fe3849fb88acb6063200000000001976a9143b1669b9d992ac2c3f3a252f64fbc8e6632f0c2688ace04d32000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687e5203400000000001976a91443f06deca7dffbec30dfa261b360d7e95713bb1c88acc12d3600000000001976a9144640436725b226d471beb95f02f93b9ad7310ca388ac40a43b0000000000160014aabdec5ce60f14496acf95339b90b9deeaaccdd724143e00000000001976a91401b9544341a27f437bd6f3cb52d0e2342d27f33c88acce1a3f00000000001600148c285e464df7ee48bf84384e64ec5fae75a4cd3052d44600000000001976a9146eac1f5ff74c026524501e43269206d4997141e188ac87a84800000000001976a91411c4a02e4a843fb2efeb4dd7d288dd5b101cd5db88ac005a4e00000000001976a914d07e98f1181c7867de37645b5421589a9ef0d97a88ac093c5000000000001976a914f9db67527b49c2fc68fba751cca640ca92e0369f88ac796f5800000000001976a91491715d11e269cb628713fb0c0ad75ab6c0ef402688ac72ea59000000000017a914c6fdb1b6a14e52339fcf6d6727bf956da3a4f8d787140c5a000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687e19564000000000017a91451da3796757bf1af21e873a6c4127bed0af8ee1a8779cf660000000000160014c7c96e291640dbfe7fca2465426fa79d07a9bc0a6b5f670000000000220020cf042a83cff7ff40df6165438cbe9dcd265da3ad522a4bfb2c764740265ad223ac946b000000000017a9143393b9515bd173270b3635bdcd43275263fd16d7878c547900000000001976a914b9a58d6c94daa50c9b7882563a3d4d5ce4bd8e7488aceb8679000000000017a914f6b7b147b321805384dfbf9677476e92ce366cfe87ee108700000000001976a914eb6ab75bec48c411e819db460fe09a2fc63f3f2388ac6aab9d00000000001976a914a1fb1086c25d30128220eb39f68ad1ae8b66bfd388ac7c6ea30000000000160014ee302f90b2f3b64e84a8996de0a96e724a2e1da0ab29a6000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687b1f5a7000000000017a914c8bbd80af9f09f0a9a62bd14780658afe614517287f95c86010000000017a9141588eebfb3c312126df0e82c07ffeae851949b76876bb7ef01000000001600149da1c3281a3b471d8bd3aea248bf4ccb0518c04d50327d02000000001976a914d4ddaa6ee4397874c9b080e28fdec849df43ff7588ac02473044022079225d137cb4a9fb1f96c8668a5ba7b664ed3fcb2e509a06073d8fc4d21343a702203cb0e5ec38f945a7051f3e614cdc41f6d4f7dd93b6a9a493915acd0ceb756a4901210240362258aea90f1287ea3404b96310d5ac45a218e1f408fd840123906b41134e024730440220569e66cba3a98c99e1bdad85c05b87bbccce34cd4b78349d3a8438dd4d40e502022037065805c5aeb734498a53babe2b241802cccf413889a18464967856233438a60121038da4c845a0ec467f39a6c3950467654b9d844854c8be3bbe95173555819734f643a00a0002000000000102377ea3bd3b8789ac86968831a58f2fe212e5569ab29ea424ec74859fea1d13625809000000fdffffffb775f79af732ffb6bcb399dc2d5bab2bb32acb6f2d47c6b9b2dbe878eea8dbef0200000000fdfffffffdf7080a040000000000001976a914f4f34ac12cc4ee947108dcdbe627812f23d217da88ac3d0400000000000017a9145e475155a3a3e46a4e5a38a24f8d145fde117e94875d0400000000000017a914bc1009ff81c998337fa476fefff28605d711ae8a877904000000000000160014455c08ca3246eb506eb4caa720768fd1ba138506de040000000000001976a9140f829cc525d0d07c60579b9bd0b4414435a495da88ac220500000000000017a914dec396dba71b0398d13a8ed401f320150ef40e758799050000000000001976a914baa4a2abd2771611d150b96bce199fc95fdccbea88ac12060000000000001976a9142bb769b5d0035a1a7ab04379b9b4d86f251ed95488ac51060000000000001976a9142f76c2eec6fbcf0ae5013df7525360f7fbb4421088ac87060000000000001976a9146bc2c101c27aa80c1b643274e417b3f0609a0a1688acfc060000000000001976a914e9edd2a8a9fd555f60a06948678bd3a45971669888ac040700000000000017a91496fa6df1285420c7ee9080a5b02ab592d74df5fc874d0700000000000017a9141533d3a10c354cdf356e364fa46f285f79aea56e87630700000000000017a914452e5c26b2599e3ea76636710621404255fefde2876b070000000000001976a914289467455ccc56f3a23e1003b83b708277b0c4fd88ac530800000000000017a914fa4afc597b543e750354a651bc57044a93abae1887150900000000000017a9147dc479bc7862cdea6d5e11e44f955f554e2f4761871f090000000000001976a914e30c55227c04f4effe17d81a7c1a12a3734ae47588acf10900000000000017a9147dc479bc7862cdea6d5e11e44f955f554e2f476187f50900000000000017a914dc6ceb4e180d20896ffa173c2ee84a263b87a8bf87560a0000000000001976a9146d688bf7d82e42e3e6bdb8d5a4c20c7b9b0586ed88ac840a00000000000017a914be6a8890422069e79db5bd020a576eb9269369bc878b0a0000000000001976a91415bc97100fcc59d3d1bd5d749614f468ff2c095788ace60a0000000000001976a914d36a8dbf6eddbdf913db3783662f163a945b5b4388ac400b0000000000001976a9147b2960900eee9cbf30d66cf945bd40a6872acc4d88ac470b0000000000001976a9147189082114d3c3e1e1c0327e6796169a180e697988ac5e0b0000000000001976a914028365ea29fcbb316a4d40c95e047ce891b5c2d488acc00b0000000000001976a914f39e67431c29faeed7b9135dd0ca72e7a87238df88ac060c00000000000017a9143099190a449aa3e11f488db76889e2dc9f165dd287130c00000000000017a914ff8e38a0d0d74d00a893935a5657e5271b32034f871d0c0000000000001976a914cf4464c202ddb1cdbd8fb939a4f6ee04528f36b488ac000d00000000000017a9144781ab0077cfb3e62e5bb57048ed929280b823ed873b0d00000000000017a914f8764ca72cc7a2018967b99f802b5363448f60cc873f0d00000000000016001402735f6643d5f1ebecea0be8517abc837d1ee57e5f0d0000000000001976a914a698ea6edeabc8c245ceeb6ba1116ddad4b4216a88ac620d0000000000001976a914cad40e80e6e0ec763310f8424ad9526d8aa19dc788ac8a0d0000000000001600143223e14a4f0280ec28b81bff15f06cd026642a0ff40d00000000000017a9142ddd3d54001f713dd3f786d08091bdf3d3dd88bc87770e0000000000001976a914015b5f3056af756e4d9b5389a3762d5dc160170488ac820f0000000000001976a9148cf23cc765b84719bf0dbe6b9a81651322dea66d88ac8c0f0000000000001976a914d1b10cbda276f431b4636126d4261785163b81cf88acf90f00000000000017a9149eb7507a678916308b0b164d3366d440997193328797100000000000001976a9149db00341cb81d796db0d969a9ff5fc29db2c349888ac9e100000000000001976a9144afd13dfa80f4f3fc03a2f6abe64327bfa64f59688acb91100000000000017a914591ebd26fc8ab950ebebc6a58ab24ca9f5cea51787df1100000000000017a914a5a3d1cbbe84c9a97d58b374f884607dc6e595fc87061300000000000017a914d86b439c7acc01e63f7e4ca5f18c18023e936d6e870c1300000000000017a9147999101a6ecf2c2a34fe9161c15e1ca50e10d1438742130000000000001976a9145d7f21709874209475ef97e9e636e57848beb05388ac7e130000000000001976a914a65508aa2861cf396383f648e271f7a98344066e88acc2130000000000001976a9142baa31a20503dbf2b28996925d00e6f07a2b208388ac14140000000000001976a914ab90a20f9134c42fe50815fbfa4b22c32c330c3d88ac651400000000000017a914c945e94ebd884b0c7b0b21c72cd1e6c76e72fd85878e1400000000000017a914ede74c3acaf3799722a1fd2ea6948426907815c787b11400000000000017a914a3b11828080c68cce8d9e49b773c444583b27e0d87cc1400000000000017a914919a33a74c234c1dc0ff056215fdb47858c166b187ce1400000000000017a914aa3e066c297811a2662f86d068bea62f8815b15087cf1400000000000017a91455d8e10c0978072105170203ebe39082b8669af387ea140000000000001976a9147672a49949afda6b5723a0127fba85a5f2c762d988ac0d150000000000001976a914e9ea45e137279829f204cd6dc5a5103b65c3dcce88ac31150000000000001976a914d5cefa24b8e683ab3fc4921dc69a74c2ba58c60c88ac8f150000000000001600144cfcb5eb1c51fe8dd687a136cb0458ee77b1b584ba150000000000001976a914c8a4ba489c0b1d0272563f8facac43089ecf26bb88ac1a160000000000001976a914dc7e68b9cb60cd20ddeb21dc4d637723c2a995a988ac3c160000000000001976a914826709846d91e5fbde2a2e04c0434e6fc765cba188acb61600000000000017a9144d4c3e95cab77ff9159fd18763ad8e47df8514a187c9160000000000001976a9145026728f7d6a1b450d687eb4765f3d7365c56f3488acf2160000000000001600146094001efafb35aebdef39f3b5e35646d4068317f2160000000000001976a914e4d3e1dd2c8260837cadd12a095e28ff0dbccbc288ac4e170000000000001976a914bf514f552f43f6caa70c2d2c03ec64559f26b7af88ac64170000000000001976a914bb4981e7d29df45ee88e8ed6a4bb6c24de841c9d88ac9c170000000000001976a9149fb69f5a0d9758e5aa5d4b6a8426b3fd6daeef3d88aca3170000000000001976a9146d3c5718a855eaa8c8dbe8ef06518934a5c54a8788acad1700000000000017a91476269905cbc7cf05933a263f1d893b5ec0a80a1787c7170000000000001976a91483d059f5acdeb0c11c32171c839342af87bc948388acca170000000000001976a9140368ae7abd1332a52a3a7d20e151b66723047eb788ac241800000000000017a9146843b38290d1160d64b64adf2bd707b16c0c1c8c875e180000000000001976a9146983e0ebfcf1dadb4b81641c5657b9fd316b412d88ac6c180000000000001976a914a9bb9cdcffad9af7ec9f02ecdf9f14844be0683588acbd180000000000001976a914ea4a375ebff3245fbfea114b8b7eb8e9184a605888ac341900000000000017a9144340fa4a4caeb942e4f62650d8640840f223aae18776190000000000001976a914d7668591de1505557d5f6257a30b6f1d743c0d1188aca4190000000000001976a91455e724b6c4289f80a26a8d35b80e39dfb1e34c1088acc11900000000000017a914900ba0ee66a12bdc6cea113419670a3e36c753ca87c9190000000000001600144a80bba86041e8be6c0e46a778227d726cb6067be3190000000000001976a9143d52754f883b3e09c55c9d3ee07084b05a43722588ac341a0000000000001976a9145a64380d5313657f26ad52bb086f1d4b0adc5fc188ac4c1a00000000000017a91463641e74e3294ae507593277907437b106883f8b87601a0000000000001976a914291194a6d3a874d7194f245225ef497738fce26588ac811a00000000000016001406be7370910b52f31c3f5adf18d975136a94bd4fa31a0000000000001976a914aba5d3e53b1e24dd1bbb07decb99c222211df82588ac0a1b00000000000017a914755939ce5de97480d3e5dd75971545528e9eae3a871a1b00000000000017a914b829b0cecdc981d00babcf7ddb23de4f401bb26887451b00000000000017a914f37fcb344e74b825a7d1abd5a1bf3be4c976ac9b877d1b0000000000001976a914a315015838ab8d9eecd1a4d864a7e44632880c5088ac831b00000000000017a9144e2187dd932000da777aae9e709ca5967c109d7287861b00000000000017a91485fd49ea3e914009933ca5e3b00efd0d81796ad787a51b000000000000160014864a4b4f1bc4ce7256b4f847e3a812b58d0c53f8041c0000000000001976a91498991a91fc4d152103d0a96d758ab4d83dfada0088ac371c00000000000017a914ec4e9c5ea1edc168bedad2142546c7b6b3dc9f7e875e1c00000000000017a91408b540f88424396f678ad0577d11843a2fa26cf4876d1c0000000000001976a91429196bd1c9e7d863f5adae957668f97c0be1ef4788ac701c0000000000001976a9149ee838c3958079781c97350810a681a9ad75095688ac7f1c0000000000001976a914e98e8e772a76d74a8026a139a1c8df3e52bc27de88acbd1c0000000000001976a91439b15623fe66db39103944670eaf233feb9ac3d888acbd1c00000000000017a91465b0085c67b59ef6e2ce25bf9a9269a0f7a7333287c61c0000000000001976a914ed341d5c87294f235c0ff30fb006b5ff4b869d2b88acd61c0000000000001976a9141cf45ff071b17b6a03c30e4300ec289ee5254a3288acdb1c000000000000160014647e14743604a262ca7f40fbb3f62a40cca077d5fe1c00000000000017a91477ee808ea932a9f0bcc24e2c60c4da8073521e7187141d00000000000017a914149f5c9347ee6e73a57e6eab6db0e7d59bc4963e871a1d0000000000001976a914f927326b5819f4c8c607a05651e62566ceedebad88ac251d0000000000001976a91488dcfe6753a44280ad05e806c2628db58978f93288ac921d0000000000001600144737e9fe412e1d1e93f36d7f2c7a4cb4d6389476951d00000000000017a914c71b9e89da1a7d46b2107481e31aebb2d309c5c287981d0000000000001976a914a8c252e03d07219314be5408b20c53fa5baa8eb088ac9d1d0000000000001976a914982c0ea37ac34b431bf7a2eb2bd806eafea6d30688aca11d0000000000001976a914606dd733e9950554a89382dcfe1fb7d979f6f47188aca21d000000000000160014e5db9294c540741b11edad93141af638ed5c306fd61d0000000000001600142151cde7b3c3334d84b3e43ee8402e587d92c115f01d00000000000017a914dd28acc413a97126f4bc9533b5820432d35dc86787fb1d0000000000001976a9143926eb427cf76f5bd2650b905e2ed54d9300d5d988ac171e000000000000160014f0849e139bebf3afdb56a737222f9ad724ef4198271e00000000000017a914a04cba20915b907ba67d997e79ae8668782515e987341e0000000000001976a9145656bc26f7766c41434faef75522b28cec94e89088ac501e00000000000017a914dc4db56801203f92ca83ba32a53775e317c07d6a876f1e0000000000001976a914c68af71242d2ea94025d078dbf71d932e4c2a29188ac8c1e000000000000160014e82f3b91f339550b52d17bb924da519a3e927f50c61e00000000000017a914710585359d956da31a9ab4fa0c91e55d06494db587eb1e0000000000001600143595554ddaea95815fa0e851a2b88f34909fb8460f1f0000000000001600141b06dde710494eef1cea749f935a046b5b37615b311f0000000000001976a914f3a2f91d667159bbbd08d2b274071306eba03b3388ac431f0000000000001976a91400f3516629dbffdebc8db8aab44ebf71d2bd7c2888ac471f0000000000001976a914fa126c82122dec1972561d35615cf7eac054e0d188ac621f0000000000001976a914bc9d488a37086a7aff55026f0397b2e64299a87d88ac751f0000000000001976a914c7bbde3cba36ab9224e57c83349ef24a5920a33c88ac911f0000000000001976a914d8d8303d1d3f2dcfcc9e2ae8fac9118aaebaea3188ac9f1f0000000000001600146dc1c99970c7c8d8f795ca5f96ac0425bd536e419f1f00000000000017a9148047f51f1f5d61620a5c60f100695912826bb3c087f31f0000000000001976a91426577c9ee264c3cba4a206370fc5774779b38bc488ac0c200000000000001976a914b927f115471f295d362ea0cbfcd7302a9aeac49488ac252000000000000017a9148bba40848d789fb42aada47e449c9b4d04a0417b874c200000000000001976a914615eab02881bcd2d58a2fa060680bd7f87573b4f88ac63200000000000001976a91415810e03890e95287c73f912366a956948b5689888ac6c2000000000000017a914135de527fec42b5469777091aa8f1fa928799f5487732000000000000017a91457feae19f0fde7375258bda742ea85d5df90a44387bc200000000000001976a914c51152e05d486e0b9079457d54a6ee446110395788acbc200000000000001976a914e3d18bbd6acfaeefef9b46aa087e209784b005a788acfc200000000000001976a914190bd80b07f48b9689e0f32b89c0f2a4da1ace1788ac3d210000000000001976a914e43c773e06639b3e8e72aabf103f92e18fab8e2288ac472100000000000017a914261d0afa3399f806e54fb6a10cb069f0d8fb280187812100000000000017a91480a972a9e834d6477bbcfcb7d970d1b21adae3e88791210000000000001976a914d2736c3088a9bf81f21994f2b3b34d7009aca99788acb5210000000000001976a9144fbb9313447c046c0ca63662c3df66b5780f8fb388acb6210000000000001976a914dd0f6f1eef0f68d66766c27553ec68763e64152c88accc210000000000001976a9145c5273199ef0352c42d2d9bc50c0b9bc92d1560f88acf9210000000000001976a914e04d0565c948013b4f8f6072ac99d8d7b0aeefa688ac00220000000000001976a91486fdaf75966bd920cfab34942e63bcf52df2bb2488ac18220000000000001976a914e34ecc4cff88e1aede59091c476c3e7be02153ff88ac43220000000000001976a91448da971f8dbf44e64d66641fb2c34eaf15ae453e88ac77220000000000001976a9140ffafa7ec57eaea0e08376840a33ce61f8a4925d88ac9222000000000000160014ed9c596fd728197fbf3da4f9f445b3b61bbd4c08ab220000000000001976a914130b94cddf20f4f2c4860a99bfa6d973bf3e756888acb62200000000000017a914277989c6c95673bd21b5a459bf5a316602f7789d87c12200000000000017a91447a591e4651444090372056986f8632edfb28d9987ca2200000000000017a9149b6d91924c93fa7a710dfe507d729be9766aa4af87d522000000000000160014da1e1f3bd431911eb98e341ff9a550d5969c108382230000000000001976a914dda5da8da49dc2cafac1dc55d0a626b77355e84788ac84230000000000001976a9141cd3d24b2dca0277277c71c60ed2b0e49cf69bae88aca023000000000000160014d51356087096c6b885f444fcb19f21e54937e629a0230000000000001976a914030947612e1e8f5267e9a715cf69c614004fcb4f88acb0230000000000001976a91428639efe11d2680c33945af5b581434657d466fc88acb42300000000000017a914f093a02413fe239e990a95a7104a7b766c474f4d87b9230000000000001976a9142c291261c9ef34a973731c1a3b521df7fbe2e05788ac25240000000000001976a914840e35c16b9543155890dab3e93bd75025cb0daf88ac7f2400000000000017a914f9876aff5ed4fca1224929018165b49d7d17ed09879a240000000000001976a9149445f8781ef011750970ce2a61ded5686d265aeb88acdb24000000000000160014f103e49f13cae558eb37f9904f214d41c3d8d2d7152500000000000017a91498ff39c230e71c5592339a7d270a8ed48cd36aff87162500000000000017a914ebb44189b022c8d40e1fbabc66a8fb540058b1cd87442500000000000017a91418c76348cfa5a7bdea2eb3357af4d484f837dca5875c2500000000000017a914e39c8b155d65d1a97926762040f096274454a4ab8773250000000000001976a91405b222aaaf2fe3c02c1d6ee10d59ffcad6614d0088ac792500000000000016001457f055ce9b84017571370aff914a6c617099d93cab2500000000000017a914cd5c7ca97fdd86599eb0b8b61b43f74089f2bc3d87b5250000000000001976a914671001fca36f10b8f765d72237618947e128571288acbd250000000000001976a9146b2e0f300c3d6be15c12ace892d873eb75e32ae788ac09260000000000001976a9141fd3fe6ce98b35f0aade9393eea13f52bd3d10c888ac0c2600000000000017a91426ab5002e552d963e8d51a3221dcbd142f48f44d873c2600000000000017a91401f53588f63784be6a1ce4456e98e043531c16ca8750260000000000001976a914ca68ee260f831a9e60a7cf72973354cb3965ebfd88ac90260000000000001976a91468bafaf844468734f75451115078d5e8c507a64d88ac962600000000000017a914d267bc07b28b98d999a8eb0d2fa27372d816bf03879c2600000000000017a914418bbde5a7586aae409770b34288f3e573e358fd87a1260000000000001976a9144fcd6065efbd27dc8f1f710690dd5e01a393918e88acc8260000000000001976a914c99c5e9020ad7f47af6b2100fded36e5ca1b3daa88ac0e2700000000000017a9146fe2007cdf52de7e3ceb8b8d9bd59f3cac278ffe874d270000000000001976a914559fcc7e34e10b3fa0c2e05094fb56d350b0511d88ac61270000000000001976a914d15d53d6e6b194d6a4b2ee5db90bc0b9f058694e88ac6827000000000000160014462ca4ed9e4566ebd9509ddfa5bbdb5a5584906596270000000000001976a91449f75439130b12ac2afb6a6012e6cebff48b812a88acb027000000000000220020bef894ee62832ade0757e2a36713903dcb450a2fc0a28dadc071c67571125c76b9270000000000001976a914fcac7e0e0f055e3a5873c91a24fab0f2630531f188acc92700000000000017a914645f5d2d05bfedbb5acecde8500a0baadf04767987db270000000000001976a914243a8263f59a5c4f8709c833c942906c47dbeea188acf52700000000000017a9143e404ac7a52593ccef2367b5568f120ec9e9774887f6270000000000001976a914e9dfbd3c2f8f2565b3c0f6e62b7c0d556fc8867888acf7270000000000001976a9142f88dc7f901e817e7275f43191da709cfd1fcb4188acff270000000000001976a914614720c5517acf57594ceb0ab3b08ab4d2d31def88ac5d280000000000001976a914b3251259f5bbe1425b2fb3f2ee9c84003962adb888ac69280000000000001976a914dba81acd054bd2415bd9b506ed38bbd87a33d10188ac7d280000000000001976a9142e15084514d9f256871f33d070f4ff5515e162e088aca3280000000000001976a914283f752db00017b0eea9297ce86a5ffa4c5704b388acb1280000000000001976a91497159d94490b688420968e38488ec097ba86277a88acdb280000000000001976a914b155e9ee25e043a19318c0456b89a7c2a0b31e1988acf22800000000000017a914c914afd350e1a7a105d5a20493500b8b0d638bf087fc2800000000000017a914e0b58babe2390c8b2429c882b07d150119ab22928704290000000000001600149847a1c8d6b6c411c46f8ba90cc4ff222001312c66290000000000001976a91437354687127ab9e93a471746eb34f64f500c88cc88ac8a2900000000000017a9141732e90b9e79f9107aef2cd06bcb42141c522b93878d290000000000001976a9141102f1b595b939c6f497e8d070b80b7db0520ae088ac94290000000000001976a9145f4e92de3160208d6bf59e8bd43c6c916160891e88acbe290000000000001976a914d7336248eaf8153cccb74d5a7e3b547af443e85688acc9290000000000001976a914b449aca213195475b3d77ec7d79dcf001fb3b4af88acdd2900000000000017a914571ee56e762de59774e5fc30d4ed34170af0d2b787ee290000000000001976a914e98e025600afceba6b25744073be1ccdaedaa30b88acf12900000000000017a91457e264ecb11f8d3ad7d7509a65b4860f45aefa1a87142a0000000000001976a91474462645d4a4c7bfc6d617d41dfa900447cad22a88ac292a0000000000001600143c674a8d74e09c418bffd2377626a718fa3e7d4d2f2a0000000000001600142151cde7b3c3334d84b3e43ee8402e587d92c115352a0000000000001976a914969cf9c1438797ab5d2f728144931b83290b722988ac3c2a00000000000017a91414c41838387fb77f1f5351976c3bee85b6da839a87492a0000000000001976a9145501facef697410c1671810ff1aa04fd76b07e3388ac4c2a0000000000001976a914003253904b38aff857fb561800421f84ebc563eb88ac652a0000000000001976a914b3251259f5bbe1425b2fb3f2ee9c84003962adb888ac772a00000000000017a914f3ace4aebb979bb443476ada026417934fcd3d7d87832a0000000000001976a9144fdb2acfb0dad67d7197abe066483fdebefcd4cb88ac932a0000000000001976a9144d5963bf938ddfaa19458af186fd91d7dad7bd0988ac992a00000000000017a9143039c877dc0446154989e2471de5e6a69eae697587a22a00000000000017a91421977fabaedf20a1b3dd25c58020b9007fabe17487ac2a0000000000001976a91418306a2b9fe6eb1e0add165761000ad2989e9b7688acb32a0000000000001976a914b5ccd3a7a1ad067d862e8f7eac9e4d685be4dc3688acbd2a0000000000001976a9148cc6bcd2b24e1ccc2294f1a4f2e75467abb5610688acd22a0000000000001976a914422b9744891d233d6a140ddbae9fff8a7bf3935388acd22a0000000000001976a91476f2a3347f5711b8f7d9a5dffd8b68088da2d32788acd62a000000000000160014fcd6a72cd9f2710fc97bcaf330d1ab183062ab2dd62a0000000000001976a91475d0df1f826ad3166c305e02a0fe144c34144f3988ace22a0000000000001976a9145b0e419d7dc105a81a5a14b867c7a10d2590544d88ac0d2b0000000000001976a914d7b5187109d2c76ed10a7b837a697bb736da3df388ac172b0000000000001976a914d55ba22a808c82c5159bee8ff06816f40876cbbc88ac222b0000000000001976a9149337d8caa7d5e8ffe0e2556e508e47e4e913c68888ac2e2b0000000000001976a9140f8d7bbef363da484dfd480ca61b23608059d79588ac3f2b0000000000001976a914b3ac2d4bdaff437b06098c053e4cd56fb47bf5c688ac442b00000000000017a9143857ceb7702de45881c2cd98c27ad0392d01afe587452b0000000000001976a9147fb0c167195685b2b5ea7d37fa0089ddf606c7c188ac4b2b00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d875d2b0000000000001976a914adcab620b9c7a9b46c14d2a77280e55cd23d04d188ac862b00000000000017a914951d79a23f8246a830f5ad6de4d5c94e422f6268878f2b0000000000001976a91438cf2aa0a1f4ba03221892feb51bcb2998a0256088acae2b00000000000017a9141fabda88adadf504c1ae73727aaabdc79750dd6d87be2b0000000000001976a9143e49351bbd8646c9253a85ff238c4478c954653588acc32b0000000000001976a9148672727f11d5fd0e16882f124e00cda8fdba9d0888acd92b0000000000001976a9142541200cf1665894665c91c595ce58a2c919522988acdb2b0000000000001976a91402aa8cebcdb0df5afb525af7170b781f56cbdf2c88acdd2b0000000000001976a91486045c918faecb350b16d3743366e69420366eb488ace62b00000000000017a914b5ff1fdae53e26eeb438c4c76d439073dba3a3ef87e72b00000000000017a91442717e4a961f25c3a5e3304bd3e0335df22987c787f22b00000000000016001479e951dcbe43520116841cd39c6faab85d206297f22b00000000000017a914af46967eb53ff2a73d3885820879cab226af4a8587f62b0000000000001976a9141a1a9b24823eab0293d9308b6bc72aafadf26d4c88acf62b0000000000001976a914ce4656584fa4ec4f73babecec721ecb1620d6eeb88ac002c0000000000001976a914873c99e82f6a3620ad7cd8e26d45175d4ce9ecd488ac122c00000000000017a9140a60741c1db01d5e4e940b5139d39fe0cf7857cd87202c00000000000017a914c845114b8fd87d264fccc537434496d35325d9c187232c000000000000160014aa1e9ccb3ff461b868cff656f14bcbf95da46710382c0000000000001976a9140d17de3c008453b3b529a6cf4389c84c6829ecd788ac562c0000000000001976a91486a2e045cad1f432dddf215954f7414b738d6cbf88ac572c0000000000001976a914b29d54b0626922947e622f8271f30317c2a4734288ac5a2c0000000000001976a91460e700ee89ba49d8000788194a974ce6de63848588ac732c0000000000001976a9145fbd589586fd378f14c5bae593e0bf325f3a907788ac7c2c0000000000001976a914f42bc78d5de5271dd82beea301c322e14bcb407788ac832c0000000000001976a9145e8c906d95fa56b65b3d6d1946c857fd5b33a66f88ace32c00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87e32c00000000000017a9143fbc14a2e4ee9ab5e9979657a27a6c3c0e6a853b87ec2c0000000000001976a914a877fb7bb2160b3d65fc7855ba9a1e33d857860a88ac132d0000000000001976a914984620e93b1cbd684c6cd1070da33f28d2e0515188ac3e2d0000000000001976a914058938c96e867fbfab78bc1988ecb87040a6158188ac432d0000000000001976a9145185d91f310bded57d52a26679de0d756b906ccb88ac432d0000000000001976a914d49baa180502f3c7cb6836d8c3dd4618e754ec4a88ac4c2d00000000000016001423776d4d421feed024fcd332f7c8dbddaaf9f07a4d2d0000000000001976a914c6fd82b4591d667050a1f02d21dfb4142ffaf4e888ac712d0000000000001976a914bc886f74c805618c5e7e65d6ed5051e43d5bb16f88ac992d0000000000001976a914143822b0bfdfb1252631c790d72b8d13435c813188acae2d00000000000017a9149907e146f01130a349c0f1af30ba0916427c762c87c42d0000000000001976a914a2d62932d13765051e38bc771a130e95897c08fb88acd92d00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87e12d0000000000001976a914c8e7c09f49e8a8d88c1254fc3f37fbbdcce0784888acfa2d0000000000001976a914de69b3e18f15c57352c69ef0f64c37bbdd75767c88ac1b2e0000000000001976a914397a64ef3ad3aab765b266ad45c7540a9003ee9488ac2c2e00000000000017a914c0ae84faeddcc4540b84b97cb9107ae25e84af7487312e0000000000001976a914c66d3ca4f366dbb4c533a0f39c91b655c6d95f5688ac7e2e00000000000017a914517085e13d17c3d9a8c20e95dea35a7c74be57d6878b2e0000000000001976a914105f9b091bb0adce0575e1412b5a97e0249bc3fd88acdf2e0000000000001600148d1a5cc8f0138df8d65eb4104a9503556b276619e32e00000000000017a91428f9b9a29378451c041415addd13df199bbfef4487fa2e0000000000001976a91401111c3107b6d41b48bf0f10ae5f5f2ccf3e7c8a88ac072f0000000000001976a91408f5e476a4b3ab8172e1111ef559d2b0f03b938188ac162f0000000000001976a91431b1af10aaec5556a6f501f771df2a6ad51efcbb88ac2f2f0000000000001976a914e593361a7141cd61c45879b89563239b2b4cb44888ac552f0000000000001976a914143822b0bfdfb1252631c790d72b8d13435c813188ac6f2f00000000000017a91432027d944ab604819dcc88f094256b846273a8d387722f0000000000001976a91426bdfb6c38e54f31bf3f34f22c686b6166c26ad288ac742f0000000000001976a9149d34530050ec7796b8d53016bb53ada818f7b05488ac8f2f0000000000001976a914d55995f20ad44d4a8b9f68eba2761e7974f17ba288ac9f2f0000000000001976a9145d8f79818c7062efb41ce26bd69efe492a4a3e5988aca62f0000000000001976a914f0522e3432c32d879437b88b5509d3a81b24324988acb02f0000000000001976a91427c10f459c9dac1e04e9b9e5e2c092df96e82bfa88ace62f00000000000017a914c0539f2acc3c9923a4acfbd776a82bfa6759d50187f52f0000000000001976a914aed8c6c93809d0426a63fe17c62d560b486191be88ac01300000000000001976a9147322a61f9705f2133b0962ad05fe073d1bdd7bc488ac053000000000000017a9144833854a7b7018045795afa13bdf8e343f725ab58740300000000000001976a914c0f66568e8c6ba003c5ce27c27ade8aa1a9b504588ac5f300000000000001976a91493ad361b992e2d6e61aab7e10eadc1b1433fa58588ac613000000000000017a9149c83bb299e411d8de7de4dc719fb97cf397e658a876f3000000000000017a9145e75dc1fd8bdfc20505353a1d67d880fe67ff1a78789300000000000001976a914f3ab2051d16ff72aff966b64337ea3560f10c28488ac973000000000000017a9141cb482ca459824d1dcb8e24fa0f49b530c3f937d87a4300000000000001976a914ebfa7a2109115dbea23b1aa791f07888d191ae6388acc33000000000000017a914813f5a9e46c4f544e2c292b3f98d203533fbf7d887e530000000000000160014d2fc508573511466f5897c5ebfc0a07aeb744f41f43000000000000017a9141942b040ee150dc030d03291559b70954913d51887033100000000000017a91467b13ba2fb87ec9497dfd34c2fdbbc78fd1144c8871a3100000000000017a9146f258cdff519e5b3e43795fe322755dd171826e287443100000000000017a91416771086da143ae5532d456be23ce2948ecf4cf58785310000000000001976a9147eea180ccffc7f9e7bdc81c3223f31c9cd80ee3888ac9c310000000000001976a914731676fd57454726b2b2ce4a80c2032abf1dda1e88aca1310000000000001976a9142feff3e8f1446bf11e3de41b97c541c30f843a6b88acb6310000000000001976a9148340513bb1dbb03419dd9b2e2f9b266963c0672d88acb7310000000000001976a914025e14ab45eab24d15518298e4ea0bf7aa39aca388acbd310000000000001976a9148a2d4ea063716c2cc64b166dc3f584c1afb1bee288acd13100000000000017a9143aa5043ef97c7f4169e6bb6435872fa401cec69f87d6310000000000001976a914e6952a35b7025d23759b6f4d04807b699a0147b188acf6310000000000001976a9148e3b6ce10fa46d95d3aeb5f7bb5f2acf047e978988acf7310000000000001600142ae47d399166b723485a14d706a6beb21af0c84b06320000000000001976a914110b082e1b18927edf17fb7cabf05f10c11867ba88ac07320000000000001976a914395be6b670ba38e5a01ecebd24bcb35833a4c12888ac12320000000000001976a914eed051c0d501943e346564a84b1f8ab644b503fb88ac5c320000000000001976a914fe9b52237b43f219858eb57b8e764e29363cd57688ac6d3200000000000017a9145e01b93325cf352c777a2d73faf5689fc1294bb08780320000000000001976a914c52198ddc029255db8b8e4728b700071b7b6d04f88ac81320000000000001976a914eeb7c8e1afcb31c8b655fa9edfc05c9c8d07dea388ac8a320000000000001976a91473ad8bbe8495f16f52657df96002f399e899ba4888ac8b3200000000000017a9144fd14e53f87a1f1d63b4f64d484eed5e20e6a54b878e3200000000000017a9140fc4c9e70ad2d135f442300aa9de30e7a0ed43aa87993200000000000017a914157023e8ea6905da2e7397a82a4c74a678fdb94c87a4320000000000001976a9146336a525a77680abc764ae4994e8fa7f77bb592f88acec320000000000001976a9143f55f0856f7c90cc16d399a4e5d6014b790346e988ac3b33000000000000160014a369262738a87970ede73552ddb2507a670c5e645d330000000000001976a914b5a5c004e05874d3834c067b00b638132c200a3288ac6a3300000000000017a914b2cef6d81664a366384481633b8ac2c5205ddaab8777330000000000001976a9146c799cdbdf10b66cc09652aa00d824b4beded69d88acba330000000000001600145cb319766defea349202944260091b8dbade2e8dfe33000000000000160014e517d000d1bbbe67661034e67406a79b4664c0ea983400000000000017a914b9e1d3763ebcf48657f738dff0c1083956f63e5787c5340000000000001976a914922461fa6728d3654d6ceacb7de51db8952eae7588aceb340000000000001976a91458dd90941df5b2bc1c1083348784ed09cf1a5ca788ac0f3500000000000017a914a5b741231c818d912a08235bc2f9e14f828f6f8787123500000000000016001429b75c49886ce5a480d45617a6e5e2de621fe5f9173500000000000017a9144345ebe2012abddf3ed05d2eacc1dd47a9ef59658756350000000000001976a9148b34f7d774eec99ed282f948ffb6d8518628bd1288ac63350000000000001976a9144d28e28f4e8c500d70296be93fd299a607c4f38c88acb3350000000000001976a914b7a50ea48a1822b8ec4c9af55efe7b115037483188ac623600000000000017a9147dc271a0c993b28d4767cbaaca41522da7b7b180876f360000000000001976a914133d8f908dcf3bd59371d8119d7296012d4627a388acc0360000000000001976a914f42abf34d6af7d434f3533f8b8679806fcf28fa688acc83600000000000017a9140b9aac64d32d77eb00d42f2d7291a09c33c3857d87d0360000000000001976a914913cb8abc1ccd82abf4ee26d971dc8d67bcbea0788acd5360000000000001976a9147c3ba934d56f6da7b3fd8e53dfd66d8f474d823a88acfb3600000000000017a9145ad4339c0186df2fbdec4fb23108669574fc440c8722370000000000001976a91435f0cf35c73f2e724b5d018b52f64453fe9e964888ac253700000000000017a914a7383eac61c6ccee74935834f19525f180e85d9e872d370000000000001976a914e38211c666b7b6e728af5b37860339596cd4723588ac3c370000000000001976a91427230ee8f662fa28f1416a17f45a5bf3a40d814988ac403700000000000017a9142bd54df3938d9a2631c9f163431d1020434377ef8771370000000000001976a9149184b4e558768d53f8c3c75fda34e87ed3f1c67288ac753700000000000017a914eaa8d57d48834248ebb920e3ae92edddd7c00f3087943700000000000017a9141ddaa1208d3367f13129ce64ef82553e76b2359a879b37000000000000160014c6ecf0999cefceec8437205baebc80dfcbc1faf5ee370000000000001976a9141e55fa16f3c3d58386316058ab6a3281a9b87c3d88ac233800000000000016001458024ec64c48a459ad61aef5b0d02c7ded3b14a32a380000000000001976a914261fbdb3a9a99d5ef822cb0df479c9cf3775930c88ac38380000000000001600148ab3e84b056c37b0e08257bc98fb2dbaa5dfa496553800000000000017a9149436765a72a87efb7d40a9bcdc7f31a327ecdac387a23800000000000017a914b49886c23578bd7531c7afbefc57b113680f3b7087b93800000000000017a914ebdfcbd912940ca4f42c18b391408262c1ca35ab87dc380000000000001976a914b7c5be4a103ab17fbc8502217a52b9df04ef650288acf6380000000000001976a9141e10e1509c09225acc5f5f59a9d133d273f0fc9288ac12390000000000001976a914303510f3c145ee9900c5fe2ea83d9e39f26c4b4088ac57390000000000001976a91403623e89bf9174b6efbfb866c34180ae8dc695a588ac793900000000000017a914135c9139ce710148b3b90b4c396678728dbb77a4878e3900000000000017a914d31bf38b1235bcc53798435207d075aecedb73df87cd390000000000001976a9147e9ac5d55d814c313f9845d085ff9bd942c9cf2688acfd390000000000001976a9141e24bb6375a872f584478a0c64503370ffece7aa88ac023a0000000000001976a91441e3657abde75a3b90851952fdd51b7465169fc788ac033a0000000000001976a914695a2ad31368be09c7b95c69cd92da70c0c7d98288ac103a0000000000001976a91464d6d23afcb156cff96bb26a91752857d866518288ac1e3a00000000000017a914c5b4ccb576850844c851bc135098a957dc97fc7a871f3a0000000000001976a9143d098057f565f23596b671041a0f337611e32e3c88aca83a00000000000017a914ad10fa01e5fc5208dfa7e5f37f908f1a7a0bc18c87ac3a0000000000001976a914cf6e9439e9a51a36ccb95f8093b04114f441b9c088acc23a00000000000017a9147992ed335ad5150cb9edf3cf5c0a42916024447c87cd3a0000000000001976a9141ed372f5c48e12cdc764ed3cb746acbdef9ee92988ace43a0000000000001976a914aebb2cc7b385df1bed1ba0f9eda603ca3164783388aceb3a00000000000017a9141df7576a949af6fc9346fe8313c0c5a5e542840487eb3a00000000000017a914d11b00cfe8dc4f7a9dbf5770af0d6ac35dece23d87f93a0000000000001976a914da6ce9bc431f5a2b2b9214b9c418c64abdf8d4ec88ac343b0000000000001976a91468f66fb20fefc612247d4029462e7c0aad0b4a9f88ac3d3b0000000000001976a914b27f345487bc691fb6cf52b09500e0a5abb22dec88ac783b0000000000001976a91442e4ad276319531d32c2f656e5a387f8bb34086e88ac7f3b00000000000017a914caa3df490590784ef39fe632269b617310586a3287923b00000000000017a91459cc6bf779935eb0f33dda6d237f1c95f1197e7f87993b00000000000017a914af173ba04fa1d7a0084d5070d287402b03273c34879e3b0000000000001976a91477433c6356cb9f2ace67501565e831af8979cb9088aca63b0000000000001976a91490419ae82d4b8ccb2eb5480a5578cbc8a8f6921d88acb43b00000000000017a9145d1dd32695de8c1ce43b115dfdb0befef0d174da87d03b0000000000001976a91406782adb311bc0122b48c39ef6376f309585bf4c88acd73b0000000000001976a91458dd90941df5b2bc1c1083348784ed09cf1a5ca788ac293c00000000000017a914e7b564ecf5aff1564c4005f4d4d87daad3b62818876b3c0000000000001976a91485cbfb3ede76a1dc4a37b55531300fc4596691aa88ac773c0000000000001976a914f3d75001b4f3bc5335677c4f690340474cd049ef88ac863c00000000000017a914adb85343e31cba7a3e9aac9b77ec962d580596ea879f3c00000000000017a9143667346182e7a5794162cb4f348a32eac71cd00f87ac3c0000000000001976a914f049a9e97404dec533123d2fd5b2d4a41cb7918388acaf3c0000000000001976a91439a2ccadc436f4952f3c7ecd7303c330e5b10c5688acb43c0000000000001976a91466e14cae4ce275ce8e8b0a03e9cf062ce915f17588acc33c00000000000017a914fcc426071f0a30cd2802aec97af05519c2a94e8a87fb3c00000000000017a914c0177950f067227cd6dc37a750214bc8ffbb9f35871a3d0000000000001976a914be8d26f30ae9d7ab03cc3d1e77b1f7b52e77459c88ac433d00000000000017a914a538d5c1df07427b06800b39276ffb265b604b1987533d0000000000001976a914b027041ddf2a869d4e34a2a3c678b921b667083088ac833d0000000000001976a9146c0df0b86009226d0b609cc7c2771f646a75fb9e88aca63d0000000000001976a9146e8268bb36c8154660c95dbdcfc116997f906ed088aca93d0000000000001976a9140df2d2b5315ba2c52b4e1470fd43ecf8149dc04188acc33d00000000000017a914093d741ce030c8600375fd002c20362e051dda3a87d33d0000000000001976a914ff1f9967923316876ce5002dedcb698b8a4b876f88ac063e0000000000001976a9142fa2011841db9e2d64eaa72cfafcbd9fcff8de7888ac293e0000000000001976a91488f26a9126d5decd6305b630737f2b61ec12271188ac2a3e0000000000001600141f7d542629744a93d4a639fd0a45b5249d57d182603e00000000000017a914da50f309365ee2330fd137ed8915e45c8054ff9887893e0000000000001976a91483587909be3c07eddfee26370951bb955112755388ac993e00000000000017a914ac62a7bac5c85af52968dc16bb48cfded168755487c33e00000000000017a9142d8615b1d107876fc0a84025813b3e8e7a179e8487c53e0000000000001976a9142173d73e3c12d5b1938283bc5386c23ac7cd6e1988ace33e0000000000001976a9146281665f4412899febd2ace863f4bf20b05b0a5e88ac233f0000000000001976a9140a0c16c83e2c5d97de3fc86ef7ebc3e6d0d3cb7e88ac503f0000000000001976a91443faab85a5cda89d0ce9e91c251e0245f14d69f988ac523f0000000000001976a914e1f55e865cba5c0163e4240fedc95b5744414e8788ac5e3f00000000000017a914010d693c1c552c830efea1a0a9a094321f96d79687673f00000000000017a9144f5cf3aa57a958184b75ddbf53f773f51ce9d88487823f0000000000001976a914d15c80f10d6c1e73f9d296ae5898c2e29f73e3b188acb03f00000000000017a91477024053ebb5a274ab60390fafdad5b2903d93e78716400000000000001976a9148ac36abc15ecf70585cf77c48e0212c15e29d4f688ac2d400000000000001976a9141b9d1d0285af9df2330f394133ebff45e900475488ac57400000000000001976a91482c2a1ce65387e56c2484a0ad3c5b9a15cee575e88ac764000000000000017a914f6252c95fe40fccc4a20a19a8ba42a9e125fccc2879b400000000000001976a914cf33c16330d54ed65674c447f18689f3dada033b88acee4000000000000017a9140f7a88c124bd844e298e0b2905886c4a78390c0a873d4100000000000017a914e0bf080cb2b4a153a367bb33c632b42442027eaf877d4100000000000017a914a28f61f5a96a42b8e18808134dcb47f89c6048a2878d410000000000001976a914740ca8d177ee47f464613d0e35706eb5966c72ec88ac904100000000000017a91402df95f230c9150b64e68ebac46ceec2383d9416879d4100000000000017a914fdd1dee976d4b8b39fe65480f006229a86a0801587b54100000000000017a914db47fee92a242751c36c4dd31b8c96801cd0e07887c64100000000000017a9149d519134d01d71bb16642fc62e11926d827dfafc87c7410000000000001976a9148fb4798a1c2513e1ec676a0df10a52fad73d17a088acd54100000000000017a914caf8fc0aee6bc6063a9f90b0faf6e764894450468701420000000000001976a9142b746d6d6dc428cf38640ed7f2c52706a3cc70a288ac0c420000000000001976a9141500f8c2b588dcce79d052e0a37b4760e900ea0788ac264200000000000017a9149e63c032746c69b3f8a87ddb326ff1dca65179c48759420000000000001976a914cde86aa5dd1c13fe2472bf11ac6eb807c84c24c288ac66420000000000001976a914a5033332699f6569a6ba04077a81a921c032267288ac70420000000000001976a9140ffafa7ec57eaea0e08376840a33ce61f8a4925d88ac74420000000000001976a914d0364d4ee80cbc38e4ec4c81a5b4e1ca47483cda88ac91420000000000001976a91444e007c0f69182acd711e29564232f5ea918abc988ac944200000000000016001407a1ec578372d4b7b82eec8cd9b1a48c7b8e7547b1420000000000001976a914987b125862badf2be4cd639c93208e9ee1ea309d88acd44200000000000017a914a6c723073425f71f2adf1e180298ba6477956e83870d430000000000001976a914f9595ca2bae8e9fa964563e00475ea18968bdbea88ac1e4300000000000017a914c022047a9044a2b213cdd39e711bb50340327e328729430000000000001600145902c25cfff5beed8af911bc98a69a6481acc02f31430000000000001976a9142ace547f598a63a7baf974a4bdd03f564c7b619788ac5243000000000000160014a5dacabe4b7e584216e73d257f28d497cb550769624300000000000017a914676037116ff8a3e03377098a4f8e287e50f1259d8768430000000000001976a914c5b69c481d333ce83d40929b9f7e6e5e408faae488ac834300000000000017a914f8ea091b3de683404b802b825736a8d1e7234726878d430000000000001976a914b5d4e4fa85dbd36918d2b3a5b47c4bd70cefc75088ac96430000000000001976a914c37c551540a4d8628e208aef36f5301c1b2250b888ac9b4300000000000016001421a4fa7fbc49086176ee200579e55b8f340347a79c430000000000001976a9143b9a7696e6439baa1b65ca89b278bce1a7b690bf88ac9d430000000000001976a914de571652d9978e30962ef4d562cdf70490c00ccb88aca0430000000000001976a914828194ef44c349337e15e312c48015382fb2bab688acb24300000000000017a9144b1a17243237affdda52c19332f6ab0956a4cb7487f64300000000000017a91408f9f2f0c6d809bc4594f2354e21c02a736c18ae87fc43000000000000160014171f3e3257ece82b49c53ea2b7faa22f8bd02c0dfc4300000000000016001482056de04dd84dd0f9504d212364202414008e8c06440000000000001976a91455dc8e9e6165100619f288bb9c056231361a696b88ac50440000000000001976a914ba2050381ed14349113460204401051f5f40e61688ac5c440000000000001600142b773dba9cb0f60525b428cd63428cf06d08388a5e4400000000000017a914a2fd752a05f0d60938996cfc1c33fb09b0dd539487b94400000000000017a914d015f312fcea55e440b5b052304d2538de26b1628704450000000000001976a9147421b48a61e7a0af770f5f9ee3e39dae2f0828d388ac09450000000000001600149ee2ba20f18a87c61ee8ea33ecce4eda83cb44f00a450000000000001976a914152e6dd42064541d70eab5687cb5fc8b84f5c01e88ac214500000000000017a9149a311ede97a79f86b80acfaee106d9e545bf9af68736450000000000001976a91472158d1b9c2241b10e71c629802fb9b2681c1c5e88ac3e450000000000001976a9142695aabb711d2c110b64fa56a20a3226be669f3988ac6e450000000000001976a914e266aac644073c5d085343eac82f60c23ee1604788ac6f4500000000000017a9147a3397bd684abcb79e6b407b6c77deef697d3b94879c4500000000000017a914ed41f4adb9522b2edc98332b6d1b829d0235106b87c2450000000000001976a914f180be6e8ff3a7101c0168eaa9769e24d68e542b88accd450000000000001976a9142edaf466f4e25ca8eb241256aa4507bfb9acda5e88acd54500000000000017a91480643c3efcdeb6934cf9857b78cde325b7b4078387e2450000000000001976a914170a2d9bb7dfbff50a11ed0fc7847e0fcd3d2f4588acf34500000000000016001489bfc8f5b6f804f6b05719a06e8e7fe1cc811b76034600000000000017a91455e324b03d88894fb7b18e30d3b894dff2c33dca871b460000000000001976a9148c94f62bb6e270cf2d5e4d36ba944698194c770f88ac3a460000000000001976a91458f482148aaf5a22b467052efa1225e4fc1ab30c88ac42460000000000001976a9145f8f5ec735126e09b6d7ec0806d66806de7b506188ac58460000000000001976a91482f38ff0ddd3fbe7ae83bd5ac112fc851d218b6588ac5c4600000000000017a914321904b77d1a22a667920174087fd8178d4062ee8760460000000000001976a914ddaa9415d8da0771d1fbb8762b7950e8a1afca7288ac67460000000000001976a9148ef30238fe72221bf1a1c062926827ec10d5ff8588ac72460000000000001600142342e1dda3f1fe99e22741e644d28bfaa6bf9f757f460000000000001976a914b4963640a0685b7bfdf229b4b8aeeb2eddb53aa388ac84460000000000001976a9144bbc91a6f8ea12a59c7c629aa6b72a9737cdc18a88acc74600000000000017a914da577e470e2ccf9971481a8f83846d036740c15d87c94600000000000017a914cb19930a3591d3b521ea3d8f031cf7b80106462a87d9460000000000001976a914bc3043dcae5a2411c7fbd25b854b642ac9ddddbe88acdb4600000000000017a914549c7a3f02a755101a7d153f48588cfcd5bfc29f87054700000000000017a91458ae26cce59a0786ce5b0df4328f9cd83846ff0b87104700000000000017a91475437df2bcbd84ceda1067e708c2d15cda86e124871a4700000000000017a9143aa96bb4b6b666316ad7edf00d193894e4a66cc8871b470000000000001976a9147e8ec39cf3b7ee256a0546a23295bf08d161466888ac2a470000000000001976a914539b3703be31f28f4eb278142a9c60c0bb120f3788ac2b4700000000000017a91472062ae0b2076713d284aaa9b951f1a13eb59534872d470000000000001976a9140837563ab5ab789cbdf5fa0b82dde2151af150a988ac41470000000000001976a914b5b08e6ee4906bcc1543fb83ffa0a8b804c49f4388ac554700000000000017a9141952ec5ca9018c2611e9d01e7acafa8fe758ba0987554700000000000017a914df9f7a6bb9bbe1bf396108c75390ace3f583abb78756470000000000001976a91436e726307f733a9e73f9ab0edac11fcb3fef745f88ac564700000000000017a914b9ff6d89f08d5389b3d377632110644a02de734e8783470000000000001976a91444a0d86be3633f9840ed44ebc9aeee3ab294f3ce88ac8b470000000000001976a914d54203d7ad9ef151cf392b3a3fbacb81bdc1a31388ac92470000000000001976a9149d418e03834db3bc87bbe24a3dbd1b0de509e91288ac95470000000000001976a9144d43ce7e63864817bd9ce34b367882890806b93388aca2470000000000001976a91449ddf5c6b223d87de47be5e4421f3c4853042e6f88acd44700000000000017a91472083e06a2d3c67b121cf4923b078f1f64f23a4b87de470000000000001976a9148d1480733e0ea46e8a9ff381240faea4a0f48a9588acf84700000000000017a9141a68ae0698c22104e47bce245412594ffd1336498726480000000000001976a91452b32d875f2233298b28002d3c3fc685422fb9f588ac28480000000000001976a914cc038ca22f9fe0fc36d46cd7251fd14eec0f570088ac2d480000000000001976a914777fe8a4e4200b524ea5cde98e61c8809fbefea488ac36480000000000001976a914069d19be14a73901f2dda76c6f6062c2f929368888ac4f480000000000001976a914465faad2b9ea5066fc13cc65de929a17e7f03d1388ac4f4800000000000017a914e8ad1a1898704cf889115419fec64dcd15cfc5a8876e480000000000001976a914428e13459b77d675f940adbb26d0174455b64d3d88ac76480000000000001600141fcd3656713f38395a27b596c82911c5a158bc94c2480000000000001976a914d26d482f2d3c457826f326b4f7e83705928dd9f088acf6480000000000001976a91435f8e96e86438b7c2c022c43a7569f24e8ebebae88ac254900000000000017a914334e0808f8f5dac67a1eca03862d0febf8aa1bde873b490000000000001976a914a0d4097e95d4933fa4fe0a603f7c2f8053ca25ad88ac53490000000000001976a914b3f7af4ffbf9aa72327a9e1d8d358c63d5f252f388ac754900000000000017a9149395967c1f8d006496674354bf45c77bc58de1b2877d490000000000001976a9142064e456f5df02980c85c6d895eceedec27c6d0a88ac82490000000000001976a914e8a031f450599e6e57f7072b4541329b53b7a77a88ac8a490000000000001976a914a953cac8d1e5d77c446ed58bce14c31c50cda6fe88aca7490000000000001976a91447e507cbdc295eeae957c3a119eadeca00f5c03d88aca9490000000000001976a9145921f7e4f9064cebc8d233dd6bbb0f1a4e6cd3d188acae490000000000001976a914c44166dc6f070ae3ae8fcd9fe7d5bb46a1c4dae388acdc490000000000001976a91492bc97ff39c43e28058fc97386a468f7bf7d2b6988ace2490000000000001976a9147c11bd7052759631398aa25365d6514fb14d9e5b88acf34900000000000017a914e1012695d3049fab7db5002f5332552066669f5187224a00000000000017a914dd6fd54b4a7b29a5e133a7c915eef47b8bae067d872d4a0000000000001976a91412c07719da343c1c0b196fa1dc739da730216cc588ac534a0000000000001976a9147bb9b791ac40051ac18333478c923dd922ef539588ac884a00000000000017a9144fe751bfa9633cdf37a4bc2bc01791944bca2a7487904a00000000000017a914a4167394b518c98a9a46d33bbd2d1baabe45292687a24a0000000000001976a9146658e25c0a70b5c61748fc26d5ed7e95e8be510988aca94a00000000000016001436a5063d8e6c4db4409bfbd6e90df5bc4024bd85aa4a000000000000160014d3c4eb6ab8bd640ee129b9b63b28ca15a24806a5df4a00000000000017a91486c8378d0f3e877e7aa134beb3469d526d12106687ea4a0000000000001976a914f84cb6906d74cff9ec567a0f640e4e5635e3b53388acf24a0000000000001976a914b547d0983bed7bc048def659cb1b5a6de8f885dd88acf84a0000000000001976a91446deb628ec6a67dc3305bd5b7083d796a5bdd76e88ac0b4b0000000000001600142b0242cc3ecd9f9f4ae0d69881e602c4b72a852f1d4b00000000000017a914291e1ea8eb66d2585769b82c12a47d36f84c350b87204b00000000000017a914e6aacecf7e6475d2fe2360aa60d66a405f8f58c4875c4b0000000000001976a914465c59eb14bc663549afb3af17b0dd2538c4136a88ac644b0000000000001600141b19a6111e0135731df9fcb31c1aecfd64f74ec8894b0000000000001976a91463d009c6ac9499d8d82ca51a48567e62d53f4cd088ac9d4b00000000000017a914489ebcda7e73c91c302ff8650324cc17dc084b5f87b34b0000000000001976a9142ba493b5466d95ab7d282a7b90d0522f957747f288acb84b0000000000001976a9144631dcd2482e4b9bb1f9ed8bead45ab632fb9ae588acfe4b0000000000001976a914b118de307d1257d904272e3aa78d4fcd91a99dfc88acff4b00000000000017a914c210018ace1a1d79201c9a4575accfba09e10a3687224c00000000000017a91491ebb2e6debe5a99df615694ecf8e7269363226287294c0000000000001600145ab6801b1d063b40592b9cdcece0c4061f2d85ac2e4c00000000000017a9143dc010d281b81a447ee9fb9ffcf9a60a0db8bcc187764c0000000000001976a9141b13fee059aef456c8adacc9131a1475e24b2e5688aca84c00000000000017a914075a27de4c391f49a5472bd14e590921d4b5a1e687eb4c00000000000017a914befbcfe7c724b55ae6106ac783ac71740d2061d587044d00000000000017a9142ab1827226a7a3221caf00a4814f342c99f86d2f87104d0000000000001976a914f75febd0b806637a00cdbfa5124f7e4c8318d1bc88ac194d0000000000001976a9145a37724acb4a97c02f113de3e02fa15d3bb1020388ac1e4d0000000000001976a91474ac3870458be669fe4682b9ff28cb749261018688ac3f4d0000000000001976a914e986a8dfc8be1280d14a64ffbb23b0b89f4023e888ac454d0000000000001976a914674ba976c749f54bd5d23eb076da4fe391a54f8788ac584d0000000000001976a914337dba1c4548428b172e9ce164f218bd070bf1b088ac5c4d0000000000001976a9149130d6f0506b2d7b558b9861c38fa59558f108af88ac704d0000000000001976a914f2f1c2f3eb27834f890e2453daf91caa35d94a4688ac914d0000000000001976a914e656cdd5e1935b47927253fb0911108c3a7557ef88ac9b4d0000000000001976a914b2d20db236b7e06ebdee16e87e0931708e8eca5a88ac9f4d0000000000001976a9149f4c38a7b2d0cf55853a12fe35376e67d0141eed88acb24d0000000000001976a9140f9106310ef31800dbd4a8ae842e53bdd967454588acfd4d0000000000001976a9142f8890dc4e93a02a91e534541b65a0c5e3f04fbe88ac2e4e0000000000001976a91454f12634bd95987046de0c25ec6690cff5257cce88ac414e000000000000160014d8e3d42bf0784f8b68a74a225c4d1abc43873c4d4c4e0000000000001976a914c4c97a3c04af03fac941b81d7e4445e86f76557788ac4f4e00000000000017a9142aa4adfc81f456ee2e41400032e757369b5786d287564e0000000000001976a9148568ef5e2094b5a63b67a2230252307ec2d7301c88ac644e0000000000001976a9148fe9d2ec36746a5a1cce4fee7e6de5b71849612988ac834e0000000000001976a9142214118f2cdaae81adff16a6e1df5d9a2e013cc888ac9a4e0000000000001976a914c2557b10e93f821406bc7905049a4926b185410f88ac9f4e0000000000001976a9144ddea6deb63ea95645efef282f1aae83d4b272f888acda4e0000000000001976a914794acf5ba9399195d871b58b9a4e9d014b54382588ace74e0000000000001976a91458ecb818689bc66f915f73d682074e123759a5d988ace84e000000000000160014726b4fd234fbeab52be12571db09a54dc1d0bb722c4f0000000000001976a91472b1cfcd40b305308cfb5e781b25358ed410a40d88ac394f0000000000001976a91464f81fb9aeab7d58c64f3ba3ed95e0455def4c4888ac5d4f00000000000017a914c9233e29cd6da9e47cdcb18d07f1ba778c5c6bc0875e4f0000000000001976a914363d2d542ccf8fc2c64e24a5a6a030a769fa5d6588ac774f0000000000001976a9147072970c43eb5fde390c230ac41280db3610f09c88ac7d4f00000000000016001477ff313f9d8711573fae5ce9169e9c696543fac2804f00000000000017a914cfbd363009f9a5710226e830c81d169dee41987787964f00000000000017a91486cf2ed904738f30673ebbff81aab34fcb92441c87974f0000000000001976a9146ca8dd12d34d4e1f11004225b0e2b1274a9821b688aca74f00000000000017a914a07095c0af12db515009d113618a5087fb69ba3587b44f00000000000017a91493717c1a13864f5df78e122e816926126ea205f187ba4f0000000000001976a914cf07196d75a57e328b3b3c4b86b00ac6cbbd8f5d88acc74f0000000000001976a914a5a21f33022d5fbcc81fbb6e731d2c9e6abd6b5388ace34f0000000000001976a914452b1c61aeaba7a3cec1daee0c1bf6ef1a362da288ac0d500000000000001976a914049e598c90be67d3194902f51e58fd91169a76fa88ac0e500000000000001976a91430311e0c3a5f73beef70d479584da32f3584844388ac2250000000000000160014a3e3ba5ff475b760f934dc0ccca0f2179eddd9483e500000000000001976a914f96fe0b4cec6fce4c2c9ad25dbdbd2a9277c862a88ac41500000000000001976a9142fd0c9339e97ea83ed7b0dd3d691e8d9608ea2ac88ac4c500000000000001976a91467dd5c91c5486b655439af4094cfa77dfe3e8c6d88ac87500000000000001976a9140ae5751cee8ec98138782f46e1eb0f797003719288ac965000000000000017a914a6d5bc955e77cd0c45da4567d53244c1acd0fa2187d25000000000000017a914c24b2c62eb426e2b4f49c4e6300f6c64b0b7e30787e8500000000000001976a914411047497b7dfff43613e4efe2bf355c6c95b6e188aced500000000000001976a914a120483cf6261b1e3bc5c2e9b8f31214bfbc36db88acfd500000000000001976a914505f10b4a85bcdd1669c5b0e5c57b8a32528178688ac10510000000000001976a9144213f87d07f76b3d25a27d991f7c27f3b5ec5c3e88ac2c510000000000001976a914bf4b7f809e8f2ec0406e0623b35f717cded163a388ac46510000000000001976a914d77d9b7446d4aa6239679130b3bf1f43a5ac64fb88ac4a5100000000000017a914a64dce9dfcffc52c49d59e9b8e01a90b3792727f876d51000000000000160014fece17f0e0c11554d19e98761e201097790c068971510000000000001976a914b93324503d6d378f6b42bce19f670a0f8faf6c2288ac7c510000000000001976a914849d479d6e3d607b1e757c9469c80a448562a8be88ac7e5100000000000017a9142246e90856040e4f8dc06e6dbcdd20e28348bdd087c15100000000000017a914254adca98363dae6df17f38315b3e4a92ee4dba187115200000000000017a914e7e541c5c556855cfbb63524a57e736e436edc87872f520000000000001976a914f80e9530e81b0920178064d3ce41700236148ef888ac33520000000000001976a9142438f4b5776e514d49ba7f2d34edaacea56772e188ac4c520000000000001976a914274a6975159392746069c52264f9bee036f404b088acb1520000000000001976a914b24fa3b09785596bb0023c24c170632f672f787588acc0520000000000001976a914f225d530f88802df1f9bfbce96699c9e2606161788acdc520000000000001976a91473bb106718b3a35dd821ef821529e5886e19d06488ac0d530000000000001976a914f057b8fcd16858de2f7ee2ad83735cd9154ec78488ac0f53000000000000160014567efe0013a91b03a21a50ef8fd33fd2f94d95c315530000000000001976a9143d767f26ecd9e8eda26453df0f95d704e97aa8da88ac4e530000000000001976a914b1cf081499ad19ade5f48ef4908a8e4da69d545988ac95530000000000001976a9148aca49429d38d1b9f03d89401cb87648d566998688acc1530000000000001976a9148a60d966a8ab5805b46c78021f2da09ef61905d388acca530000000000001976a914adb14404460a81f22d350626d41cf00373f7f13c88acdb5300000000000017a9145acf24dc0970f4380b8d01abfb1d716ae6b3d9be87e35300000000000017a914e73b3f1fd5a5f92296d57dfcf0d3e19e45eda52a8728540000000000001976a914c77e81403a51ff250a888d42e56945ca87f02b6788ac60540000000000001976a9145b0c9428d7f7dce63f48f9f94cdaab19605382b688ac65540000000000001976a9147a9f0a34cd1b1fa9f72c093352f97a83f6eefe4688ac715400000000000017a914e66ead1c09960542473df9f7c7900b0a98079cf487895400000000000017a91473e4612e99d1eececa22b60928e80e5650606bbc879f540000000000001976a91452c56885d6814d59d999b113ba9fb7905b8f8e1588acb55400000000000017a914378110a4a889b8d420dfddf8f2f3cfeba8dafc4087c5540000000000001976a914a6f3a80a91ec37fddc7cb1d427c2970c56ff9e2d88accb540000000000001976a9143263aaa3edb93d92fcb6f5f2b538a4f4e3f53f7b88acd5540000000000001976a914f5d9845a7eaef040e5f887f59e2a6264d31dbf5b88acd65400000000000017a914b10c3fab39e29838afce1b13dadf32bd92b09dc287df540000000000001976a9146069c9bc559736be49d037e6d6454c31f3c96e2688ac22550000000000001976a9144a1da0210c4a0d9e43f1096699a633acdeeed86488ac33550000000000001976a9146bed3d245afad49e707923a8528aa113f3cab07e88ac37550000000000001976a914eec129adf5ee18933a5013cf31c4e0c9dcace8a488ac39550000000000001976a9148d8ae0c6bf3901d814815066b4d5f6406466bff388ac48550000000000001976a9145a42c8a0c544d9efe8efe10cc0e5459729577ec588ac74550000000000001976a914b13e521c1586d98c884716f3c066ce97c4ac19eb88ac76550000000000001976a9144053dcf5589d3bf7f54600d27392b1e7e8dedf7b88ac78550000000000001976a914d6dfeb336f3f6263f1fa355940f9c88435ab651b88ac855500000000000017a9144805f403f962b620f21a71ab1a4219005a605c10879d55000000000000160014df8c5e8a6d30bcaafa0079fb0c536097974f25b7a15500000000000017a9143d46dc20954f76b0044248b0ffd5e8601311482f87a655000000000000160014d53622308400621a0fa2b02b612604651acc6c3fbe550000000000001976a914b4b9ee92d11dc273f2a9074820ce46f865ab77e788acbf550000000000001976a91467cff2fa20bb996294b8470996afc39626ebfdba88acc85500000000000017a91451f7cadaea9c542b99f6d7af44f7126ffdd72afc87d4550000000000001976a9143738e77cd18273300317c39ca2c852d8a93e666088acff5500000000000017a91435856235ff6f839397d60f4dd17dfce7ca401df6871c560000000000001976a9140938f3dfd1b3980ee009cbae08af148a65a0aed088ac2a560000000000001976a914ba263931740043e99cabc8d385410275810e01a388ac665600000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d8768560000000000001976a9140a50538995f7bb124e7c8173c848615e188beacb88ac69560000000000001976a91469d394ba176ce7743d4784d4b96766eded5bb16a88ac9e5600000000000017a91428f678d83c14f3e220ef55bef6b5aa0996c680ee879f560000000000001976a914b690f996900a8d8a29d71c03ddada7652c51cc7e88aca4560000000000001976a91480a73f16f35caabdf6d7a2d71bedc0daf337e49e88accd560000000000001976a914b89e0240265517b031636116a22df0704c4b10d188acd25600000000000017a914332a6691c5bde4a2d7c810beb534ba2ea0eae51f87d5560000000000001976a914d0d9d216dfe5f26af5d366030c08faa15632ce5788ace2560000000000001976a914be6e20a7348800f3641e6341aa6604cb5f6438f788ac10570000000000001976a914300c65a5450d85dfe9a931dafcc24b8c509e236288ac25570000000000001976a9147c881140186a22f3519936f32a6d4a3ad9c4d6f488ac265700000000000017a91435385230c37e8c8cb3976e20607e06ee82113dad87435700000000000017a914e4e953e9ad8a0b27c0f251cd3d94f881576c868d874f570000000000001976a9141e0fffb603c22a5845ded584c4c82c4f47a3090c88ac5b570000000000001976a9146f602813c66f3d50ff8ac73e7b7d8503a299872388ac7d570000000000001976a9149e3a7d0995f8ce3b63d9476faa1fd267ecebffc788aca2570000000000001976a91497f8ff0889dd9e544e748913c95319b68f92ae1b88acb5570000000000001976a9142e6da04c5ee51ab84db1594a48f6a66481554edd88acea570000000000001976a914176eab980659caa43958d4bd183134d28679d9ca88aced570000000000001976a9141f661cb2f6d20a34fed80d5ad58dc486c19a135c88acf1570000000000001976a914407a416e4a2414a63c6af6cf9ba2891e11b5115988ac32580000000000001976a914bb5e72a2429a0428c94947f08d6d1481d6cb085788ac68580000000000001976a914e9891965b2b05521cd0007153cec594e7d8db16c88acab580000000000001976a914fa85367941c1894b4079712d2a4652544c15d5a088acc1580000000000001976a914c796b4bbbdd47799944213e4d7ee56191f992b8088accd580000000000001976a9148d2b4f3d440ceb4911123fa65afc7c3906eadfae88acdf580000000000001976a9148422a438deb9ff8a7576b66b84b78115d2bdec2488ace0580000000000001976a914f8feb6e8ff1b3c9a23f10379737bc68c5080345788aced580000000000001976a9141c9a5c32356bcbaedae6afe6e9920cdd83fb290388acf85800000000000017a91419f93003e5933639b7094f0c656999f1f21841308711590000000000001976a914dfa0f8b93a222d91c0e0ffcaf902b6fcee4dab6d88ac25590000000000001976a914b76c716efe05ce150ee5d3f1318a15b42597393c88ac265900000000000017a9143b1ac46daeca9947a2cff221149515a961f309a48728590000000000001976a91444bfd50507a0d7af1d19589f8403fb569c098dc488ac2e590000000000001976a9144a37a88412105101d093f62e70e5d981706f624c88ac365900000000000017a9147fd99b0f3268990371a008963859952c4be77858876c5900000000000017a914168e80c33b1fba74134ab974e8ee6ebb7b3141fe877e590000000000001976a91476843c5a98617da76ae13ba7a25434ec35a7e45b88acbe590000000000001976a9142ecb2b8b104b2a84ae3868105aa7a8aabf0d984b88acc25900000000000017a914d2d5d34ab67b6aa36b3937af393020437daebbcd87cb590000000000001976a914bac67de247d4dd659443cab503336bbad252d9d388acd7590000000000001976a9140dbd52dabdbd9e8c4fd03968ba04e53560f6280488ace3590000000000001976a914a876a6bb52fc1ef0c48e0eaa22fe3fb6244c961388acf5590000000000001976a9142d7f21b2647dbd1a5787d501f99c32fb2b2671a788ac075a0000000000001976a9147e026de6450beecaa00bdcf8db1f9481fb36e78688ac085a0000000000001976a914fa4fb27ca9c3d9544f15bba3db026dd4085c6bba88ac1a5a0000000000001976a914155cb8935224283781e0062f0a9890406a018fd888ac1e5a0000000000001976a914ddc11c1a98cd8d3071084beca21e482d1481efe188ac205a0000000000001976a914bd99fd68ade9249e0b14076d2cc174ddf941ffca88ac3f5a0000000000001976a914338126ba9403956278ccf7515320bca679e7860c88ac4a5a0000000000001976a914e982c6b399c458cad97529c4a6a2626c7578c0aa88ac515a0000000000001976a9148124ada3e217b08d67a0cdf1e94ce4ebdd4030ee88ac8b5a0000000000001976a914efd82eca10f077f2a517fea017193024c49acfe488ac975a0000000000001976a9149d6f40373f86977e6f47234a5d0986b5fc4abb7c88aca45a00000000000017a9144fb05981da14df86331c4cc9b1b76d5e4efa49db87ac5a0000000000001976a914d4fbe8aa2a6d0927d69a77a88c095c6fa719a27088acb25a00000000000017a91416ebcff70c9104501f014b6e839b6de2378091b887d05a00000000000017a914663a2c72d3502db4e8a4975ee7f6cf3bf2097bca87f75a000000000000160014f6686bf10d2b6146d59e6ec1bc495b373c477382075b000000000000160014ffe71bc714f17154654c9c57e8f9eeb87b507a7b0c5b0000000000001976a914457b2a80bad158e7520de35af54ade79994a623c88ac0c5b00000000000017a9140c8e54f3d65f739ccc6601963c9bb84cc757b54a872d5b00000000000017a9140a6559ed20c56f09f3ba5ceb863f10215491c7b687365b0000000000001976a914731bf7fddbf5c2bd2a82cd592a77b298af37b92888ac3f5b00000000000017a91462a54be1acec4ec5531514eb692f10357b9ba20987685b0000000000001976a9148422a438deb9ff8a7576b66b84b78115d2bdec2488ac865b0000000000001976a914d92e0c699c4d06e8f62f0f5252f1305ff7be3ef088ac895b0000000000001976a9149e64e0767d521aa3a82e1a52b7df15ca9fe269c888acbe5b00000000000017a914fd043adb7605a964a17bc6f4eb15e60ebd9f93c487c75b0000000000001976a914fe36f47717d7f907adb9526ea70b6cd41c9bc9e988accb5b0000000000001976a914884c412c7e6fb7d91d4fdde072f27ef31da3f1da88ac045c00000000000017a9149e06efd49052a7f456c1062b066cbd27ad0f9e98871e5c0000000000001976a9142e9d8b1890d1ca04d070002e0bf2fde97888af4388ac395c0000000000001976a914d639756f59564a17400cc0a92ace1c7040d9813e88ac4e5c0000000000001976a91494796e5e4ab52ce307327a49f57825a5a7e448cd88acb05c0000000000001976a91475c24ca3f1d53d199f7b0242b6ed5ba5eef4678b88acfb5c0000000000001976a91416e89036e1da9e1dde9227e4c013e8c88586bf0d88ac085d0000000000001976a9144d13c6acc48ceea08c04e174ac59091e923bee2488ac6e5d0000000000001976a914aaedee80f7b4a4af9931d6dbc27fb876ed2e30d688acc25d0000000000001976a9148879739b149bb59b5448fd9204be4ab47021094d88acda5d0000000000001976a91454db872ae80438d1c8e50a7353e387333e062fcb88ac045e00000000000017a9140747fb508db23eb410ef8aee89989f0ff8c5257687805e0000000000001976a914660c726f1e7d67876980923d8edaa45473aa775a88ac015f0000000000001976a91449d176bad932d8452e94de01e598776449d9055f88ac135f0000000000001976a91462d09a8867480063c7acbaaf78fb6de7bd3c375688ac1a5f00000000000017a9145793742d544752de1a3c03707a7e0dd5d4f3c6cc871f5f00000000000017a914e5af0fbe695fc9efa7aa7ea9a5be3b261334af3787225f00000000000017a914954bd6c8d7daf90d791d9bc2511adfbaec45679b872f5f00000000000017a914d25a86ba1f6b1cc4ca7c827dd5662a932f133eb9873d5f00000000000017a914305a91c4b40b27b5e7823e8cdaef1e04a575c1f3874e5f00000000000017a914fce1e2d9efd40abff4b1614b0162993f8036a730875e5f0000000000001976a9149265c2134572ae3d68fac36909fccebce5dc397188ac6a5f00000000000017a9141695366a2cb00f0132d91a3277676891c1f7d08387cd5f0000000000001976a91456e21434bc99b26dfb0dc217786b78758de8479688ac38600000000000001976a914b252d5e0f3c0b1f38a636a81a4b297db85cfedd788ac6a600000000000001976a914c9f4bf66c98e5401c1727b720b838036956fba7988ac7c600000000000001976a914f61e304ffa6ac0c8f234cad45e06a53cc7ac8e5a88ac98600000000000001976a9141499604a291c89b12a44f5623c9f807e1b33bede88acb5600000000000001976a9145b4d2def816a96c7ddb66826bef4e02a8ed745a988acb76000000000000017a914d91da9688e79a539b17b9876f385b3e28ac0d40587bb600000000000001976a914d48b850b751ad5ed50fc4e5be114b3916451f02688acd6600000000000001976a9149f234a23f7e194798b6a5c2ab97cf5e669a6499488acd9600000000000001976a9140c9d123b244f2ba2ed75c6d57a7be7749593359c88ace1600000000000001976a9148fcc4f9f9c6986f837cea11a72ff55289e58abe588ac036100000000000017a9148774d0848a52f9e40a69cc2f52e4aa8f73db06c0870f610000000000001976a914e4050146c0b594c118af1c9367dd3266e6ac87ec88ac3c610000000000001976a914f714aac8be259f075b16927d651197f114285bcb88ac5d6100000000000017a914aa01743b9cf7d6504393d069724dec511b90598f8779610000000000001976a9145e8b8fa0c53a966931bd36368d65b10a879a9cbe88acb0610000000000001976a9146631a3e99c14a9d739f079c6c9458e233e70d78f88acb36100000000000017a9148dcdc406243b98c905915132f2d95f501a68b7d587d56100000000000017a9141cbadc4a0cea3043723694009bf421b53af0468d87e3610000000000001976a9144b96a7fd2b87dfd67c7145f4753930b93d0c343b88acf0610000000000001976a914818830ff70b7620af1ce2c7c27c07e677364356988acfc610000000000001600143c0bf944598a0e1a86c37c228b948130819237588c620000000000001976a914ea3ce55c30cbeda89405f301c0b0667c852ce4ba88aca26200000000000017a91488b124e77f6d1055c3a0eed4158dd130df8d859e871f630000000000001976a914f116f9c055a05a32a67a55dbc361b8a42d465a8988ac2a6300000000000017a9147cf96c85334d17d0a3bcc8b7a9b93d42c42a5ec8874d6300000000000017a914775475a7eb7c1c6a1db892dec051e795db1c17a987526300000000000017a9149c6a352c865a3c394a460b1a8faae216f22547b5873d6400000000000017a91449c9d975bea1ad78ca79734cce4d3f2fc45455bd8741640000000000001976a9142ccbce9946a707a67afa43fc4a1202d68e95921b88ac57640000000000001976a91486dbacc63a8eca08ce7178830494fb2972c2b96b88ac90640000000000001976a9140cef8b671a409a188041a29d0fc60e07f51b8da288acaa640000000000001976a9149215d219e522f4951d5d2c8f78714ada462d19c288ac0a6500000000000017a914e4583362263b7abd573bf94a56d093a6ed0a116187476500000000000017a914596762bf089d50218d64124d6697f946094d66e88755650000000000001976a914cc7f8510ea7973508c31566c63bcd596a92c953588ac5f6500000000000017a914bb24c17c8d312823b0d4af7edfb423f6126460c8876f650000000000001976a914193c940d3d546ba5113dafbb1db3326a88cdb9b088ac7065000000000000160014528bc58f0e788f3940a2eec381c3274bbc5dba478c650000000000001600145dd11a03f6e1db56f023c722287eaf2bf927dcd0936500000000000017a91474f0aad68afb91527c7e892b57427ae55af456aa87b3650000000000001976a914684f3f12b10ab3af58f8bb9936c351f5400e752b88acb5650000000000001976a9145e0185696267d13c2eed17585bca0cfbc21743bf88acd4650000000000001976a91432dfff98e176d88ef1f86f46dac8a7519a252d4188ac58660000000000001976a914b74ffcce914f18aa5e961318b3863109ae190b7388ac8b6600000000000017a914022744edcf8d067d896a6b0f912373ff0b769e79870a670000000000001976a9142f50413f745a5f9ad308b158ab356c9f3849631288ac27670000000000001976a9143ada6d76a9acefac48a9c9f4fba3fbfed53b0cfa88ac3b670000000000001976a9143af18071748830e198fce9eba7e226e0bb9428c188ac90670000000000001976a9141b1e84de7b330d4a12ab8cc1c9d111c26998e5d888ac07680000000000001976a91431d63d1f237329e8f8b6dba235c82d78f9c9e39588ac11680000000000001976a914300442dba5e8012c648905c9316bb2b2d8391a7b88ac26680000000000001976a914b4e6929ea5ba270cfc0d4076d1289b1dbf7af19788ac43680000000000001976a914b0db446368fac8ce5bc7eb9256735cd2161bd16d88ac5a680000000000001976a914ab8c97c51eb443b719914265cbfae8b97de893bb88ac8a680000000000001976a914a1809dfce00d22ee9a1b30f78d1139a64350aac388acc7680000000000001976a914f36467330a2f2bb8a8d1dd54646563e79dcbeed588acd06800000000000017a91470316120e7b74578cb4d1193fabb683be26945178706690000000000001976a914040f4beb150cf05164e787c9b0af9e7aa082a83888acb6690000000000001976a91412a59ee0df1c58f037eb667550236fa92932d51088acc9690000000000001976a914bba73844c328b973f0da040ab964dc171d6a038488ac076a00000000000017a914dddb55809ca698a00bc91e9a122e768c0ea9e974873f6a0000000000001976a914b94cdd38cc7f8410cd9f7d47525fc49d3ab6d65988ac5e6a00000000000017a91483480c7c147809799d5d424bd37598fc1d7d990587806a0000000000001976a914fb77bba6458af22b4f20a277df3e901121f62ff488aca66a0000000000001976a914f015123737a240aeb7b01b4580b1da5a4ff3ba2988acb66a0000000000001976a914f94015356cb1c08f1cb30233da8db7d9293fcd7588acce6a0000000000001976a914b644877e5d4afe180c904801e10ff6375fff5dde88acd06a0000000000001976a914c100b9037fe131d2b2049fc9d4bdc46f120bd88988acef6a00000000000017a914a26c7f017f3e3202852a0485d1f3b097ea68dd35872a6b0000000000001976a914679bdd7e3332e54d72349d28d557d2ccca5f13d788ac356b0000000000001976a9148fde30e5c3b83e032a3bc57d25e6ca4c51b7423888ac3d6b0000000000001976a914bd94e0ad845ac1800616789a18ce6a794877982488ac456b0000000000001976a914a77d78d54beccf83b1ab2b8b916e812ebe06680088ac6e6b0000000000001976a9140319ca1e833e4990d373df7bc57ef0c8d85a89c988ac7a6b0000000000001976a914a5e6ea57013b432f19272726b1c131858536c10a88ac8c6b00000000000017a9145ee7c978d4ce5e280ac7e043ad6abb21fa4788d587966b0000000000001976a914f500064a5d3b07bd4249e694f02a782951582fb188acfc6b0000000000001976a914946f1bae66f9a84a39196ee6de9f6758c337c24a88acfd6b0000000000001976a914816e2247fc6ef9d152dbb25099a27fc47d18b0ed88ac326c0000000000001600148635c4c33d92d9fbf62fbadcbf9653750cb5bb1d4a6c00000000000017a9149e5e655ee8e3d6ce2bdae2536b5bfb443596f744875e6c0000000000001976a914bdca4c82a863a94bcfe4b49e1513d038a019571688ac646c0000000000001600144b5e0541a60916cf8c359b4d9cfbdb482467fc69d96c0000000000001976a914ad22641bdc7e3a3b35946b35dd5d4edfdaf99e8688acf76c0000000000001976a9148dff650cc614bec07880d8ab8f7634a041df8ba888acbc6d0000000000001976a9143c29c5c9f00d0e0831916d1563ab2d9e3b53ac8888acbf6d00000000000017a91424169546860f14d3ed4d508a2e4fccc9381e388b87ef6d0000000000001600143dd5fc17d58380c098525ed3b735c84860b5ada3ef6d00000000000017a91419eb8144de266587d2962e0e135a27fa495df46e87fb6d00000000000017a91484aca025a03fe237d362956f2e95fbee7226137487036e0000000000001976a9143fe3173d7537588bcc6c967d866fe351d813c71a88ac166e0000000000001976a914acab3a11775c5a48c303c81e6d61e7d590f3f6e688ac9d6e0000000000001976a914a20993837562f3d8e9f7085cec5fb231f4008d3788acad6e0000000000001976a914dbd8a01a863912a0d1d7c6389b8df62c392059fc88acd16e0000000000001976a914c4b425e95acfc2f81fb435cb138dd7c036d5346a88acfc6e0000000000001976a91402f6bd7b6c217bc3b8cd2d6ce9df11161e4dddca88ac066f0000000000001976a914a67f1e34c8998846abdb63a4efa63b2f87e7e6b188ac096f0000000000001976a9149f8786760e8d0fea93bf273fbaa984999145fe4b88ac446f0000000000001976a9146291756ee1c9ecfa3765442ccb65767feac18b6688ac566f00000000000017a914851c7542873d4852d5ea27cbf8f670d45364cce987746f0000000000001976a914dd93251998140b52a278191b75fc17c3c0fbdf2488ac856f0000000000001976a9146d8b3c46c00fbe8143ace8ed3448e68246d2204588aca56f0000000000001976a914427a45a26594e08607dac9c3365b9ed49051f5d988aca66f00000000000017a914edc8a1b906e62a543e38eefd2a7318d422f3348287a76f00000000000017a9147934558c834e54a1fe5471873dffbb6de8b83a6887b46f0000000000001976a91495503c2d025f04eed9ebfe4182249450ee7035ab88acb96f0000000000001976a914da1cb430fe4780a05aa27c8be75fbf47fcf2d61288ace56f0000000000001976a914bc68da3c7dc5c09b5ad13d83a4ca203543e0bd7a88ac03700000000000001600140131d8d351e0cab00b7fd4e0f1e0dfbbd87bae6d1d700000000000001976a914a4b03dcb8afd7a51052df7b50d9f1da5ba06434c88ac287000000000000017a914520e28d32d67414978dfceb4ad81e4ac2b060f678731700000000000001976a91444a3b55d471ad50f1e4d4b99d14a6cadbbae5c9488ac367000000000000017a914833ade8292fc94aaa28984692a01c23fa6bfefd3876c7000000000000017a914b82d3247d3291f30aff8631a85ddbc4b0e21f3e787987000000000000017a914523b567aa8faa3cd8075fcda622f861e5c996a0087e0700000000000001976a914087552f7a463264f56d783013c084aa62a6e13f488acf3700000000000001976a914c83c25cc39a778146a77bccc98414a731748181388ac1c710000000000001976a9145529e1217ed9b97492b6081fb35fd0ff8cb52e3588ac3b710000000000001976a91405a41f46cec94ce8009dc42ce5cd5b42cd237cf688ac49710000000000001976a91434c42a8562502309dca025559c3f509dfef2522f88ac4b710000000000001600144401ba2b7e17b753c493d9ebadac212bef82cd7b4f7100000000000017a9149ffa0d2cb04f4e4f50cc65c893455bb5ab207ac68774710000000000001976a91475fcf7fa040321398cade96c67b15f9063eeefcb88ac1a720000000000001976a914b0440dd3675eef5b8d11d030bb227955a98d192788ac27720000000000001976a9148b70af9b672af9fd3b12d11b444f005cb1a4d1d988ac39720000000000001976a914af44c80527f8877e9cf9a7cceab5a96d46a17f1d88ac65720000000000001976a914501a968a09e7bdc51bcc30ec6f7bdfe75611617f88acc1720000000000001976a9148a402232225b2639f7bc9d6a6eea4e28dc302b7488acc27200000000000017a91486cd98dcac80d0de37b128992b113d3fb79ac6cd87ff720000000000001976a914466e8c8728b621569b5fe3842083ec189014a4db88ac547300000000000017a91420b2db3c3edd8d1098ca30c9a6910e1af828758f8770730000000000001976a914340c276e0383156d69e80c51863537ae239de37988ac757300000000000017a9146409c70a52c79a63fd60acaa296f5c459ec8be8287a57300000000000017a9143299ffb35027dc1d4d3916c4d095288b47e6a5f187a7730000000000001976a914110c3beb4547e1bb8b99bdf446308f8255b6450a88accc7300000000000017a914eeaf28184de74361ca9771cc0764549f95fbae8887e8730000000000001976a91415156896b39f6d15256a636cda4051bea30e775a88ac2a7400000000000017a914e39017c3982bc323cb4261c45cffe0a218299e8d8731740000000000001976a914d51279d88c327edddbb1cf50d16ecc73d6e6bb6c88acc9740000000000001976a914defa9daf1f42e17c16c5c57a5095cdf6bb7a9da288ac1575000000000000160014552219e4078a8700b703b9cbfe9a281b981b8be2227500000000000017a914a46b29607ea9da021c893e2260129684d87667828728750000000000001976a91466f53e5a04e138e57935fdc8eea035e93fa20e7c88acd97500000000000017a914496feebf48a2515c53aa0b50498f9d2d25eafe5a87e5750000000000001976a914452776521dafbfdff0969ca2123d4ccc8892299788ac15760000000000001976a91492b7cf318e9f6d6950cb49628fa84562b4f3571888ac4a760000000000001976a9149e4e0e91a7376bbe663f5e501c9187ee4284d11488ac4e760000000000001976a914e7420a5a2a73c0b1233eae81482a082860eeeeee88ac877600000000000017a914e62524dee9b194d44907d5a3e822a8c0249733c8879c760000000000001976a914da4b2a4190df5f8391545b32ca2c90a435a42fe188acc7760000000000001976a914e19f9f48819149d723356736b07632492685d44e88accd7600000000000017a914edb836ec11d60f3dcdc0625301dab66b6be97e3e87027700000000000016001459ddd9cdf3d430a0c8e747e31d0880b21bf110f34e7700000000000017a914a0ff0e9ee6cfe9d6ac5e3571b24c7243d2288a5387677700000000000017a914105fb6e9e654fcc8806a45981cefd72abb33d4668769770000000000001976a91458085dde977466c94bbbde5dbb5fe0dc8825569888acb27700000000000017a914f27cdd1763b9c760f0516d59af2ced7dafe55e0787c0770000000000001976a914958be4361c37ca946050fc4f0bb658b314b4a74388acc97700000000000017a9140782d0309298d392d2ebb34bcdb479ae506cae4787037800000000000017a91444366c180febae6aa0e7225bf8025b778bf5808c8747780000000000001976a91439bb1880d19084dc5def33ccd429841a171b8b0688ac547800000000000017a9141a4533f7245d44c19e79fcdd11bafae42c48491a87807800000000000017a9146cfa1bbe6c88f53c715f2c3df3de38a34f6cd7d687d1780000000000001976a9144bff8ae926323adb5fdfe0130cd66cb636488b5d88acfc780000000000001976a91453fb114dc1a0795ce79ea26c169b59625e75fbd988ac0a7900000000000017a914d3523edf9fae4a6433e2facc9402c06c0aa33fc58726790000000000001976a9147d9ca3ac0a29cf5e60b8991ab1eab8534204782f88ac1d7a0000000000001976a914c893b06b95509782fabad33b79289abd1a3d4e7488ace77a0000000000001976a914aaf5631a99032b548ce32f307a7b2ad7852dae4488ac387b0000000000001976a9140bb5385a3e8783be37ff9f018e2f95b1da61bcdf88ac3e7b0000000000001976a9145cf3c03a7ffc6e4884df28e41469a277a75be42688ac437b00000000000017a914a4e673b07194246217a530f6f495283a64d9407c87497b0000000000001976a914d337a775728b2e423586cf70accae3b00b5d449c88ac967b0000000000001976a91494341fc1bd45a0a469bbb1132115deb1b1fceec188acdf7b0000000000001976a914520d8359a95ec54ba03ca26da411019f8be5bd7b88ac4a7c00000000000017a9148172621b62f3bd3faf28c6bdc43845c9f4a1860187587c0000000000001976a91464e3c6943d5bb8cf336c9c7bdbd1544340c58ec788ac6b7c00000000000017a9145e94367b592c0688551c29e2e29bb116a85355ac877f7c0000000000001976a914d3233c2436b60611809d462619ef73b3f751265788acbe7c0000000000001976a91470e65f1a571874decc85262a831e4c0ff79ed41288acc97c00000000000017a91445193a35747b4f5fc0759401557a257e09ad75a287e67c0000000000001976a914cb9682428471378c9f5a4dd64d4d1100a63862b588acea7c00000000000017a9142351e688ca28c4e008e579aec07e0d19fc9c7ca987357d00000000000017a914a8648c5925cf16ff64b7791fd2b340184e67238d874f7d0000000000001976a9145e03d1c86c30e739199aaf6dff3dcf83c288fef488ac6a7d0000000000001976a91488f6ed6b3e799cff7e1292ca4f73dbeca9c0a65588ac707d00000000000017a914f14c0fe47db1dcaa8e26f2f97ab963f7ec9b1f0587cb7d000000000000160014cd8b51c8468eeec94b4a578d663a116ef600a8cad67d000000000000160014186f7bed2ae7ef39e30111775a80b97c31e088cffe7d0000000000001600146a0be7d9366bcd73ddf6a13f068bbc10c391430b237e0000000000001976a9140625d713231a2b5989c000d78a70dcb181f4f0d088ac377e0000000000001976a914a241559e762617f189ff9b4cbebe1ea718637a2888ac4c7e0000000000001976a914ecbf600bf8392d7953286805423d638b3a342de788ac697e00000000000017a9145b5bd83c2b73520770d4209763709548c98b1dc9878c7e000000000000160014bd7bb404d751f09cacecc9c6c16b19c30dd605bc927e00000000000017a9147d5cd2819903c9c5a6f5484a83e0e74df408914187947e00000000000017a914f0f9ae76a973a781b4859d3995be0d8d555ab46887cb7e0000000000001976a9143767f6b6321e660aa9cf81e69d88c1a4d2ef126088ace67e00000000000017a9145efa474c603787fb74310e422c67a82f0403b36b87417f0000000000001976a91445a1d672564234cc376c425307d016b94a07637e88ac497f0000000000001976a914826a0bceaaa7559c028035f1ac1aead3ec982ae188ac4d7f00000000000017a9148403549f9724653e8ab608b75f50ebae63ff878f87817f0000000000001976a91415311066470b63632c2dafb05fff11da56da11b288ac8d7f00000000000017a9148d8e17ca36e41bff07dc9caba5f7d1a9174494bb87cb7f0000000000001976a914ad9b286589e35a280d491e89550bf83a9acbe99388ac36800000000000001976a914829faa545dca645714de1261417f94d34acfd2c288ac6a8000000000000017a91461898b35cee678584c05114e3685e69ed4708e88876b800000000000001976a914c57daef11712dfd40e20a38d39ba7984301e4df188ac21810000000000001976a9149eb2869058247987ee3bf889be3537cf28d6ced388ac5d810000000000001976a91473b9e0ae02f1ccfefa79811fc96c0ec07148a5eb88ac69810000000000001976a9143202facc12c24e26371768ebd5f25771c8aa3a9188ac82810000000000001976a91421420c8e057334046e3fbc3a5133002ec56c734f88ac858100000000000017a914de6165b820897f59d19a51dd4fa3f501272e2c7e87c2810000000000001976a914a5629164243b568498bf14de497020696527d61f88ac05820000000000001600144fb84877443f90483b2511a5efa6a4cf77afad7420820000000000001976a9143142053f9da52d77e174e5e9fa359bc231e65fa488ac4d820000000000001976a914adc69a7c2d260bcb3da8f06557011ea08166ec8e88ac68820000000000001976a914721b0ff382b9635a747248da6261b091280572c188ac798200000000000017a91434fb4fd8f50a73cc102774dfdf08c37461d11e92877b820000000000001976a914c175e41ff4af12491b91a3e1078cdfdd721c320a88acaa820000000000001976a914a5890aea8b0855dd65aa410c2fd2da3af4ae973b88acb78200000000000017a91444e9474d83a8e66b70a71bc8674c76a17c0a7ce887c3820000000000001600144e7bd891995b0558c7841f133fc57596477dfa7405830000000000001976a9147f435dd6684e0c1eca39af354b1b3183d27e709c88ac15830000000000001976a9144cc2d396c7367374fbd0f0c0a5a08b425b830d8d88ac2a8300000000000017a9142f1a8247bd6ad0f16f818f7d723aaf0ad00d0bd48743830000000000001976a914cb3a25a0bcb216f72b5c639ad4c5011fa29ddc4888ac508300000000000017a914447439e888a0f9ccc65de82779130929af0953db87c68300000000000017a914080622299d014843a44ce5282f30c3999509158687d0830000000000001976a91441e844d53a379a5295e4f1171a0bacfccf61b21488acfa8300000000000016001412857fd39ed3f1a55bc00bf2ccc4c9ce705a1c4302840000000000001976a914a76464d4862dccd34c8659c9ae5a38f9953f943e88ac07840000000000001976a914c1e3a1e10c1ba097b3266a83ce8c78b2215f8bfd88ac398400000000000017a9149160d3d2a8200830550dd9622384db4e317cb85a873f840000000000001976a9144a84e877dc8d92d03e90e6b47e913a9c93c556b188ac4b840000000000001976a914531f5eb64f3f94e42d6993a3273d18aa5c25bed888ac84840000000000001976a914df921d92af400fa00e3ef8dee54207b33550b6cd88aca9840000000000001976a914b20822524187a204febda4668d5a47d82270431888acbe840000000000001976a914871de426959c3f68167842bbc09aaff5300274e388ac58850000000000001976a91477e91bcf608486c0b41bd24d07d91acced29c84688ac6f850000000000001976a914dac02a5ef54d9e2fed5f36885f307ec1162949b188ac97850000000000001976a914ce61cc68a93937d0681193f2b86b583cb75f271b88ac9c8500000000000017a91498170af86b353414bda4f9602e18372836476e8187dc850000000000001976a914e21cea9b77ba0aa7c95aa014af58fc38a3a2dbaa88ace78500000000000017a9147f947131f85914844acdd9bd522454187e01b0f8873c8600000000000017a914ae85bd35a1566b802012097688547f00885fabb287588600000000000017a91495dabe7912b1194ee645698b8daf25de441eb16487a98600000000000017a914e29be1e4e8d140e7885606970d875226258545c487c3860000000000001976a914375968426a4fd43e3e427244407102619e052a0088ac138700000000000017a9149c1085ea88bd7342dd3759ee106dd50850d7e8298749870000000000001976a914dcb982a6c7782b92b9c68fdab81141de6ab3487e88ac4c8700000000000017a9149d63b91d5eb99e9e1b6f4d0cfa36148bb07f317f87938700000000000017a9144d7bc00de916bb10e60ea16c83d341c1466b1c7487988700000000000017a9144cbce642f703e1344c3704d642a862fb998e3d7b87d2870000000000001976a9141adbce7ede9c97e391d6efd04499329763ecfff688ac05880000000000001976a914f8bd39e7f96c588364d09e9c7db46331d3d9109888ac628800000000000017a9147fcd6c5ce282220eda05f41d0b999360a608ae3d8780880000000000001976a9141f5bf844ddbe9e2550a05bb3d3d5c4e8ca23888988acca880000000000001976a914aba46dc56fd69ea1f3fe2dab4f094096ae202caf88acff880000000000001976a914cd47b7ea37dfde003d016656b3073c737edce12488ac2f890000000000001600141d057e18232c8897651d952d979d0a668e2ee8bb668900000000000017a914b18a1df6cc61512794cc03e36550776b5dc09fcb876e8900000000000017a91437e7cf4786799751cc5fae8caa5c3a1622d27c19870d8a0000000000001976a9142ac1ea3528bce9188f22f0fc137db2fa057757ad88ac148a0000000000001976a914557610d36de2ef54b4d9a56391fe43825a0ee78388ac2c8a00000000000017a914fe722e10c57dad9f747a1d9ea688ca070685da6887618a0000000000001600142c3839dac061a8e61a0f60e341daaab0cb3d866b6c8a00000000000017a914e8975dc466f39302ded05252236d8e0fff544615876f8a00000000000017a9148d5af1e25159b6246f98206de882ebd98bf2831387eb8a0000000000001976a9148d7eeb4bc1e6870ecd68f43bd738288cf9461ed788ac7e8b0000000000001976a914eb4df583ce002f0612764527f0ee8b5d894e4b0f88ac968b00000000000017a91406baa34e009fa5e7ed7221a02451c952352ae8fa87cc8b0000000000001976a914c84648388b225b63da873e2331f1a5cd3ec9ec9288ace48b00000000000017a91431702a3087238524704b5561227912081bab6306871d8c0000000000001976a9146ac22387e402305ba3b486bf35a9e2c4aabb30b888ac1e8c000000000000160014dc6f9c99c1a604baa28f20278dd2cb91faf750d6298c00000000000017a9141499be162afbbc40e2ebb6be88f05822e2f8dfdc87328c00000000000017a91468c1c3dfeb6b94d35d55c99c7cdfda1add6220a8875d8c0000000000001976a91471c2c90eaa7b4f970ff7b0e436d28ffb36d80d7188ac718c0000000000001976a914897e799f6d25932f74f7e050178cedbd1680916f88ac728c0000000000001976a91422f6050c5f0a53aada0caab255e884dc0d38237c88ac808c00000000000016001435b402fb911e82c9540d15013c8aa5809c83215c9d8c0000000000001976a91470b7c3aee0a5173ebfaf5dd8bb982414c0ce2cae88ac198d00000000000017a9144262e996aeaf884b6e9a2b39498f825d813ddf2f876d8d00000000000017a9141d5405d007d6cf560a3ac93573ddb5ca4413e92487768d0000000000001976a9147c6f1f3d56b1b030b8b9bc96f5c749f0bca653df88ac798d0000000000001976a9145212f95d5ab728ee14ecd3967518c5b569876c8188ace58d00000000000017a914900d592a0af1f623152cf16715160f88d1699252873c8e00000000000017a9149f5fe8d62cdad608fe9bd961b56cfcb51f24ad8c87758e0000000000001976a9140f114c95e059343449d92ea1ced23a9d908281c988acd78e0000000000001976a914b8ceff7cb24f787c815c975f0576162e2360744688acf78e0000000000001976a914249b1b9bcc5a1cf7a987980edf66efed2e1a179388ac2e8f00000000000017a9144af1fdb9a9c12ea4bffa84d31faa3ac8c0cb0d2c875a8f0000000000001976a914b4ed5ccc4b1982fff7a7559381c0d0724303626988ac6a8f00000000000017a914d3888094523b20152fbf818c70bde834ba55e25087898f00000000000017a914c3ab464f863b891157b3c61b364a518e87b9e76d87b28f00000000000017a914c3b35dc3007de74fcfee711e0b63d2ba295e82c787c48f00000000000016001405b60f7190c802acab4fc07535c60cd68d06228ad38f0000000000001976a9144673ded2e5e990e0fbf65b8ad9b93427cb41103788acfb8f00000000000017a91402583b990eb3fda55e5a6c1903aa6ffca87f659b87279000000000000017a914774b8a82377ea157ba832fd39d4dd592cd6a82a88757900000000000001600149a476f5e7bf644105e342191e4020e907851737f5f9000000000000017a914b567bfa4a14988ecb708d22edad74e5c023bcc2a8767900000000000001976a914112b20ea852522511df8df7a963926dd6711911688ace4900000000000001976a914fe8fd22b82cb7c57b93e0586221f29fe3cb1933988ac199100000000000017a914f7cfb97e86fca0c03165b1499d05cc5bcd18574287229100000000000017a91430e02ca40c322f2847506ac71a351a05dc0b747e87a59100000000000016001406f4bfcd2bd26c56b856baa51cfa268a1b7596bfcb9100000000000017a914ab11927f5c11de4b20781e63171c6bfe46687d0f87d69100000000000017a91402f25f30cd33a305e3c7333e3341a0c3ef29751487fb910000000000001976a914fea066c1742ea68b5f107d726d455cf2273c856688ac3b920000000000001976a914c9ae0a39d2d6ee8955c8f9d7988b8f1127e7e14788acfa9200000000000017a9148510a3e9ccf5bc2388ae9314741acf5c973ed91587fb920000000000001976a9148aab2114d51ac98e03de63d9cf01375d15f439c288ac30930000000000001976a91472281c739b5646c7f2e69b2cc473f7078aa59d4b88ac3d930000000000001976a914cabca9c879bee19af78c20e985fa9095cd708bb988ac9c930000000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac9d93000000000000160014c241f8f01ef168272948fcaf18ff296707055c14d893000000000000160014ddf4d692d43e462b7deff82bb9c3a62fe21c6e032d940000000000001976a914e25b70007e143b7ca886bf8b0a7cdaae94de90a388ac5294000000000000160014e1345de3f9e96d537e0e4850b083c7212eee37bfaf9400000000000017a914e1750fe67ad040293375c03c39d90fd0dd92eea787fd940000000000001976a91410512e00fffec5ed16a2234cf77466ea906e325a88ac19950000000000001976a914c61a891288fd5e980efbbfccd99baf1c51b5d63888ac2f950000000000001976a9142178aec7090f4abc5c5b6f8756389799e27fb0f188ac539500000000000017a914c3ce2c0ee5aac89bb84eadc70cfe0cbaa464736d879e9500000000000017a914c7d90981cb4504cdf1626a308003527e03f722d087a09500000000000017a9140c6fc940fc34af5d853295c5ba8645234e8fb7c087bd950000000000001976a914565b55aca767fbfa9011ab724d9675b16b96263c88acc3950000000000001976a914dc51ab3a518c5afc39078945dd9557b5d64db03188accf950000000000001976a9147b9793d260c3099e2ce32f77caa769d6cccb55d488acf095000000000000160014575fac6530f51d2226cf3fbe5f9d796f324a2f30f2950000000000001976a91475ee273e2ebb13fb05146b0705fb4f7bd70c1b5688ac10960000000000001976a9144320593c93ebbb4d8b28092ece19e686aee77b9088ac12960000000000001976a91466a8b2d9fc4c931741925f78906dc956c277caaf88ac309600000000000017a9148dbfa265dfc5a2ae3fdb403fb5a02167d4c968438734960000000000001976a914b12cc51271381e2e62f60c0e7ffd1f0117da132988acbc970000000000001976a914a918625207324b20c7567ce88b865ae71a8dade388acd3970000000000001976a9140d36fdace8450f054b08d96b88984f151542db4388acdc970000000000001976a9140def6058abd49073cdcce66dea40132fb621294b88ac21980000000000001976a914454f7599325fad9c38bac1a065d27e90157b22ed88ac37980000000000001976a9143d5f058911d6016d7f7003d2d7db5d5d0275452288ac439800000000000017a91475ac2254754883a9179d4fb6eb4f56eaf4426186874c9800000000000017a914a683e52816e422ff6816f3eea0e9601b332205898769980000000000001976a914e384911eec9d966933a2723eee159fef83c85bf788ac89980000000000001976a914a5dc5ecb7061e66f27b8eab91590c9b4c0cb072f88ac999800000000000017a914163a426459e9378cbeb95d2b3fccab3d9156bd8087a698000000000000160014fe3453e318f4cad4b308282d10408cb1ee882849f0980000000000001976a914ebd494fefa639881c310fd4e60b5012891f77e0f88ac149900000000000017a9147d254bc5053dc871a3068c702aa1941e3f81379b8718990000000000001976a914c37f3149aaa58f3a80dcbc18f993cbbe24592f5c88ac4999000000000000160014c7f5c8ed0bc91bffaf7b8b279c78f20ece73747a52990000000000001976a9141ccba85b29a95c187fba66c84242978d7943b66688acfe990000000000001976a914adbae214398cfa2f7dc6bdbc7cd02da6258acf8d88ac319a0000000000001976a9146e297579b15ab6d0edae189f749082d30b07dfba88acaf9a0000000000001976a914085c502294fc1dad587928b4e01d566426fe2ceb88acbb9a00000000000017a914ac0788e88c0720d1d297e0a65137321b9a3d94a387c59a0000000000001976a9146c17ba87914c0af6384abc6f06bf59ea7160a2ac88acf39a0000000000001600149f8ddffdfb4d5618052183a1c1eabfb449288f57169b00000000000017a9142bea9652a81c82f3442eade3c1dee11f5d247eb8873c9b00000000000017a914b12c1a38d9f0162fe869ea62c3b83d57e3379cbc87979c0000000000001976a9143ebb919fa87930ac9ddf8f48dd15fbc0ba17461d88ac9c9c0000000000001976a91430c5508f00700acc271a2de7cd1c0244d70b5e4c88acdd9c00000000000017a9140c069c7cf4f3530e1e23d3fdf18cd015678a898e87059d0000000000001976a91437cf35cbbbce3d6bb9c02ab9e458230c9664014c88ac2e9d0000000000001976a914bba9b3cc9a8b1a82291c530c302c4c5c56ad4cfc88ac459d00000000000017a914aee5503544173c8cef84f74219d1404751e4ca28875d9d0000000000001976a914102b7f38cadcfcda444ba0d89a6c47e647450a0888ac769d00000000000017a91432d7472f7cad8419d557af4389f27a118e8bf24387829d0000000000001976a914bf8099c3902695829a45116e381903b048cf355388ac8e9d0000000000001976a914eb12354a58fdb77a2bfb712816766ca55cf9801988accc9d0000000000001976a9142521f7e239533a43c8b6c1c64ee06cf75221c0ce88ace29d0000000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88aced9d0000000000001976a91495f9f0dd099a40c5eeee18f2d9ec79dda5e1871388acf49d0000000000001976a9147e16a1a2ef1511e22cbe42ef723e9d81ff4d9e1c88ac879e0000000000001976a91420b4745fc4c573a175b682196c6b6c1942a63a2288ac949e000000000000160014188e505a378408ef9fe5b3d64cea4878cd217854949e0000000000001976a9147dd0916f5ae58d4d5bc8822c1481efa5836b9a1e88acf19e0000000000001976a91480b75193dfb4604d86e9b6b920b547075e78e3c888ac0b9f00000000000017a91463b1fcd2b767814abbb79c92412c788de00dded987209f0000000000001976a914e650b417cc3eb0cd262f1737e4c60a76ede7407688ac3b9f0000000000001976a91465b62b8b714ff252772d2a464c3cc82a0f6bf28488ac8c9f0000000000001976a914c3cfc65be5a8c79ec1a37da7ceac361cdbe2f3cd88ac919f00000000000017a914fd5fe80b68c7a6cea143471fe07435a442b0f21d87a69f0000000000001976a9140f05f7bce59d40c4320df50ffd2d8aac7fdd069e88acc59f00000000000016001459a1944d9a52a71621f4b3a03bcebc1972b91ccade9f000000000000160014b12a2944821e4351fe93dcd6556b3e7d5cd346ebf29f00000000000017a914806d57b6814d6cb18c6864b204881944e796d01b8739a00000000000001976a9147264936c5659c9d7e4e733e79366ae4bfe9683bf88ac5ca00000000000001976a9149f98f3276650f22c2ff443c2df17ae0d5c8a38dc88ac71a00000000000001976a9142ea7a98a6c6407f652a16bc734fa7ed6e668093888ac77a10000000000001976a9146cc614be0b5cc1e23df4aa39dd975b4aac5f2b0e88ac82a10000000000001976a914928acd59e92715456f775106e2406b11c807110088ac87a100000000000017a91411351ec55ecc4acddb25a50bf968405cd4b72dd787a3a100000000000017a914f4aaf1e26cde36b31ca3580dd080e684c851d6f287b2a10000000000001976a91457e09f4799a255cffda3d7f304ce647b1622e8f588acc5a10000000000001976a9145e2c6132410e7e86c6dcc1a937122ad45390e7b888ac1ea200000000000017a91485b78985ce4025e4ce7b471e2d152063e2d7741a8757a20000000000001976a914ac3cffe422c9f9258713f32a511ae908b7d18d4788ac7aa20000000000001976a914f847ea37af90b6a56f6d8b0af8f7f51681fecba988acafa20000000000001976a914c634cb2c6409d07b38237666865f58a7e2d5df5088acc0a2000000000000160014267f4372478f360d514f747435671288422a7c4de6a20000000000001976a914a706da4bf875501c4e9a2061d0761b3abeb9d83e88ac51a30000000000001976a9140deae404089bee547c29588fe5746eaf0dd7fba888ac59a300000000000017a9149b351aeca91e84a300dfcb04e83f42450076589f8781a30000000000001976a9145d58c830be6dcf9e3f0d19a5e2798aa5f199541e88acf2a300000000000017a914353a96e5a950191dc99137bf388b65ff28b256f387f7a30000000000001976a9140b2dbbc1a7e657d3986f2f389d988707871e230b88ac3ca40000000000001976a914adff2bb54d43af28c924758b87b1b5156798f5b388ac3da40000000000001976a91442384a5878c1325f1b90e709085feb3dee4f159f88ac44a40000000000001976a91478790f6367534b3aad1ae06e331c9c4189b5223c88ac45a40000000000001976a9146a190cd955b19ad850c5144db8b63c21b5883b9588ac48a400000000000017a9145af56ada1659d75f36f3387ffe89edeb0e5d39c5870da500000000000017a91474a96ab775c3abc9f52e06b74e04252e8889b375871ba50000000000001976a91494c262c9181c33ecbade34873978d98f2af90b8588ac93a50000000000001976a914c902a91803cfe2758ea582391c222e6b58a1934488acc7a50000000000001976a91422ef7d7779a1afc9d6b681d875d10c4f882f6e7288ac62a600000000000017a91467c3cc3a9bdceb912f419515a3b8183d5fc03eeb878ea60000000000001976a91410cf67390cc9a6968bee88f88c3dba2373ee30e088ac61a70000000000001976a91436b879fd4436df8d97c0fd5bce0d05f18737f60988aca7a70000000000001976a914b10e3be6e2f63fddba546ca1b8be36804384431c88ac4fa80000000000001976a914fb7dd9fbf4317aeb308af097a1bd839160cb155088ace1a80000000000001976a914caf136e171073362b4f1b1df644a126debf9d03088aceca80000000000001976a91414c03a358b685001526ac34644abb28cc68d424c88ac29a900000000000017a914bc081ec93222e339aa0568f9f9208501054370ae873da90000000000001976a9143e9e7503085206eebe6ab2461865e5c27065685288ac61a90000000000001976a91486a854ac2ce9cffa73be3079a6627751c74c31cb88ac31aa0000000000001976a914668cbaa16d5e44ceb8790c7c0c3c75302307b14488ac39aa00000000000017a914c3da49d9c7e55ad7ac709b0edd25d9fa19812ff78751aa0000000000001976a9143ff4ae6c7fbfca62b1f19c6aa73e7d505c05d28a88ace3aa0000000000001976a914fde3f440dd86cc33cdbffdc8420ba1d7ea96cf9a88ace5aa00000000000017a9141aba48706a4459cca9ab1643bc0bd540257c649487fbaa0000000000001976a9141c2dbc5d4e0b5d49e30fcd4e3cb83c7349b5ab8b88ac6cab0000000000001976a9146e154b7fdfb12ccb022ee64c80a8b7a060e6a2c288acc4ab0000000000001976a914543cf9fc1176359fdb84944ee26d19f7fefe472188acd6ab0000000000001976a914f40e4d2767500d9bf017e22a939d95dd7633150888acf4ab0000000000001976a914962513fb32cb738ccdbdcd332c07931a8e8d2fc488ac16ac0000000000001976a914486ea03cf175b90a0f73e872b87750374105a32b88ac60ac00000000000017a9146cde1edd1a5a69c0b315e93d260fdae18cb740d6877cac00000000000017a914b610b3e210f8811356f3461d840b99aaed79f25787c8ac0000000000001976a9147606939f1838e21f760edabbbf19580a4ff83de088ac76ad0000000000001976a914ba1d9db2b8c803a62169b7b4b5e764c6a4207ea388ac77ad0000000000001976a914dc98be6be835cb52dbfc19dcd5f0f774638517e988ac7aad0000000000001976a9145326bf0eeea6a4db9c1e1db0c0b9cf2521f5afea88ac83ad0000000000001600143a74b574a4171226b1c760dfbdc622a5ab9c34eec6ad0000000000001976a914f82d2de0dc50fd21ca0cb310ed38ec1b5d86a10688acffad0000000000001976a9144085c8d32aa8af6d67291869481ff8d2dbf7de1a88ac53ae0000000000001976a914cd0fcd62fc029580c23e9e36bc70bce02471ef3a88ac59ae0000000000001976a914b15a2741fbb367460511a8a921010d1cbb3a757988ac9fae0000000000001976a9144401ed59bd3dba016ef1cf4c7a934de42ae42e7f88ac02af00000000000017a914d7b588777fed0205c1f895a3d667304ad70cfce88723af0000000000001976a9147928a3c9956143dbdee895a8573173808960b7a588ac33af0000000000001600146c9d2cf4abde78d1ad6def0a0eecb4d35d7fd7865aaf0000000000001976a914091b0a1341a6c9df136fcbafb7c47a97b4a9518688ac60af0000000000001976a91461b17acfb6eb4539ee99e50550736791541b3be288ac67af0000000000001976a9143d72bf0cc2e2306c2d2deb9ca60d8221411dc9c488acfeaf0000000000001976a914ae3c2934ca5fea152a549e3cd1cfa06249baa55888ac05b00000000000001976a914ad4c4eac76afdf117c78d63ad2e0183fd97559dd88ac0db000000000000017a914f3cf5992d577de6481a7177e5519a8425d489b178715b000000000000017a914c4ac46dcae2bcbc9d64e60692d5da348e89c26d3873eb00000000000001976a91412ef0416607d6e0efd82fe2e39c87118eefedb3a88ac4db00000000000001976a9148247078173e47c584c88b8073cfedc8a6af2533188ac00b100000000000017a914959aee78ac6470a6e9a505c6843ec15ac58e0c938764b100000000000016001455d05dfba4c4dbd0ee15bd49f0efed8c47028685ecb10000000000001976a9148553b7cd7d3d8b58ffb3720ae4d074297f57e2e888acf4b100000000000017a91411c15e4396d7aa28085eb8c628329d4e154bf5ed87f5b100000000000017a91403e58b06bf34395ab313316f18c6f8f5afb8ee0b871db200000000000017a914c6a35053115c68871d628813c27663315279f7d68765b200000000000017a914882de28c241eaff3b21bb94740f7223de780cb3d8766b20000000000001976a91485201d66459534c7bea52a49f8169a3fbb417f3088ac7cb20000000000001976a91406cf2b3625e07d01ff1b4e14b643360d9db9369d88aca5b20000000000001976a91465e732aa0e59a6c0ec5c15319aa92c319878128488acf4b200000000000017a914d9416000dd4a5a2ce535a1bf09cfffe2e80a82548740b300000000000017a914cd6b7f624c10bd5bceef4e1fe537062ae5545371875eb30000000000001976a9148e044fd42f49695a1f722358c5609d4da15a0f3988ac6db300000000000017a914e859699895c7b97f1cde143e4149f899d7d8a9968705b40000000000001976a9140c59b74ff02c22233070f017fb2ed010954bfe7888ac06b40000000000001976a914694101ecd996ae94bd8479dadcd7160ff3db3cbc88ac18b40000000000001976a91469b82c13ed52b036d233fa0c3717067a0ede02f788ac54b40000000000001976a91427a881cb41bcd96eedd1c402a10e10b65f188e8688aca3b40000000000001976a9144dccbc4b32b762decee1fb111fc3cf445b86cd6288acd2b4000000000000160014cd016a2d61523c75f790e0350fed8eed279c34c520b500000000000017a9142555c46ade2d16d6169c5ed0d7d8ee3974d4bdb18731b50000000000001976a91462063fdf2cb0cc9391e91176b6185702524f56e388ac38b500000000000017a91448b12fc3a0235af48a33ef9a5940ec0452d10f708769b50000000000001976a91499271e8103d2eeca7bb2d6726d74a550a51fa0fe88ac7db500000000000017a9149f4c505f4147ac216edc97ca88229742d9af950b873ab60000000000001976a914259aec9816f5117fb4ddaa12f4df5c885a6fd96988ac64b6000000000000160014f65a31ff0f094175126ffed2262e0b41d07104efabb60000000000001976a914d7a920fe227f7443bad47a6aede45269c7c9192488acd1b60000000000001976a9145833daa862e1be4797a95fa25af460d1ac64fbaf88ace3b60000000000001976a9148feb756c4dc975eee282e66e367028f0fa8e6ac688acfeb60000000000001976a91408d7d1cc0bcbf651a73aa0ad5baa9f76bf7bceb188ac81b700000000000017a914f9d98a0d194485152a45c9f5a2b2f6757c03a5788795b70000000000001976a914bfc5f8525871c3c240d360539f9051651078a26688aca0b700000000000017a914b9a11a2ebd9eb2665fecf216a0ea277cdba959c587d0b700000000000017a91435d2eed9afd85deeaecab5d7e861da0e111f27588704b80000000000001976a9140be0472e8d04c071f74341f0fc00bf5a2968b09d88ac29b80000000000001976a914c9d2732c4191e2b77238a82ac9945af0a546ce2588ac44b80000000000001976a91462d552218b354cf2d6b445919e67a524638fd2bb88acaeb80000000000001976a914b954101a0e856dae7ea1a16e742b660120ddb99088accdb800000000000017a914a184ce93120b888061a008b6345bf99304eb77108712b900000000000017a9148a62f88104c9a83b9d45d2bc96cbcbfc75b698718717b90000000000001976a914cc1ec4ecb05913af12bad65ec577adc5edbee9c488ac39b90000000000001976a914aa600aaf67616a4ad6e36d23dd89dc21bae55f6c88ac4eb90000000000001976a91462ba8111b98dfb8e9826517280510e39fa07cac088ac53b9000000000000160014446b77af8d10e11d0fcdc8d99637884615bef7cc8fb90000000000001976a91489dfd8622c85aa6aa8e6b03e4ab4e31c5f8233fb88aceab900000000000016001416c5d4652bb5cfc59fbb6d5cf7efe17c7acdb4200aba00000000000017a914e54bb9324c77469261afbfd0b157030a27fba1c58721ba00000000000017a914d3b051fbdbe512a6225dc094a0b16d7d6ecccfee8769ba00000000000017a9149b7d11299efa258edae4b8b12e70bd35404956c5878eba0000000000001976a914ef55bf4dd68adad75354e05dd17a12b2b6fa6a8d88ac82bb0000000000001600140bc92d0c3ed2cbf925a025110189d0f19d430955dcbb0000000000001976a914df05878d653e0674db18962c9b3940afa646f37688ac03bc0000000000001976a91423ba9cf7779ca1c49d7448b8bd5ee472dd2f8e8a88ac3abc00000000000017a9140f255e9f8949a5d7814443007081c93fcd9fdb88874bbc0000000000001976a9144bf213424f53ff16f709e1d8e1a2be97414a542e88ac53bc00000000000017a9143f438fc47a2177d5eaa1b46924cb207bdc380db587c4bc0000000000001976a91408a0c49c10e88f16f5a66409e7e5e3f35992e5aa88acc4bc00000000000017a9145b3e4ec3ae5a87743fe7774f3fc4e4ca07e2d0ae8738bd0000000000001976a91436a574e42c4a3833a350e6bc3930474b9a65b86988ac55bd00000000000017a9143317a73d7c529fda28e3620b171635589c00506687dbbd000000000000160014ee6c3b3568e424d00ad02ea3e169330bd6fa7e9203be00000000000017a914c7aeb2f976dd180d5940a670bed434fe23696ae28715be0000000000001976a914fcea55508d267c403e4d06280711fca5f83276a488ac68be00000000000017a9144e406e799f85f4d42f524446a22a6fdca8f410048788be0000000000001976a914221d51069f66e6f81d3101e7f2a08651842a340c88ac18bf0000000000001976a914d3efa76b9ec059e7d41ee0403ea214c12952a59688ac2bbf0000000000001976a9144afe291baa4df9de6461c450d984e469a6e6064288ac3abf00000000000017a914a7011fc75e2a9a48dc339b3e4d3d4853360b2b42874bbf0000000000001976a91406c0e02e9163cf3d3712b6341af71ff3b156e16088ac4ebf00000000000017a91441333bcc5b9ee098cfef39b6249ca8b64e074498877fbf00000000000017a91473ae90c6625c82dff484a606b1527c49f52c70bb87fabf0000000000001600149534b6be68993b8a2a65ac114a1e2f6850c7adf209c00000000000001976a914efe951739e0e1cd3ac411472c5ad53455e6954ac88ac79c00000000000001976a9149603e3afaeabb96db8817bd8b5363ff7a9ba84e088ac7ac00000000000001976a914befb507ea2ed1a98dfab732d2f4d5bc150812e4588ac9ec000000000000017a9149c1833113cbe592fb20b80d86c4963f6562876ad87bec00000000000001976a9142d2a260570d42c62abf4debe23fca425a044e22388ac08c10000000000001976a9141acd60063537b9a939027386068e5933a143a82088ac38c10000000000001976a914fac570b50458e8b43aff8821d1e610494ef56f1a88ac59c100000000000017a914452149cdc1a8d98b84d8579408fff9c5de2917478776c100000000000017a9143e9ef76d9d88b7cef6a2746e005ca82bd6456d9187a7c10000000000001976a9142d0067f11e01e48e01a09b3982efd988b755a3d988ac32c200000000000017a9147f130aeec67a451a4016f781ff8b7fe46fa135108756c20000000000001976a914ca65840dfcff617cbbaa6c8fa437ac02bc9b457388ac68c20000000000001976a914e57c40a746dcafc9c971ab53685ba1e4b6f422c788acaac20000000000001976a9147ae3c78e19a087f1b277091b7a09e8003de9e33788acfcc2000000000000160014da2c1d52507de16adf6f82d38dd9b8abbb32192a59c30000000000001976a91485b66e76d59d4293cc8dfaf59c83de31f1d0d29a88ac61c30000000000001976a91493c742d387cf1c73da3ca6d4cdb4b103b35a9f7288ac94c300000000000017a914808341d66b2ea7532997d84d7a3e56d4a977f77e87a4c30000000000001976a9144fa442097a8aa560032ef776ef56d53eda396bec88acc1c300000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd8348704c40000000000001976a9143edd8de3546c5bdde1816ce4dbe2a70a7112977988ac2ac400000000000017a9148624bd76e5866d8c00e42a3d58c65e982240c88787f8c400000000000017a914135d2bc8077f5492a06ca7d0eea8d563494367cd8713c50000000000001600141e26fc8a26b4bf3a613f9d483eec53a6437660233bc500000000000017a91435ff959648387223a39d5c0666b3b2baba9023a78750c500000000000017a914b1edf4997becb9215e6e1fa3a73a60a47c3858138760c50000000000001976a9146f4570e8e26be4ecbc21a12851c170164d051b2988acb1c50000000000001976a914fcd6351bf3efbf6d5ea206d88074ab50756d801388acc5c50000000000001976a9144d1ad68b8e52b7389a3228044ca7792dd386790c88aceec500000000000017a91468b68d08f47c98d99f429106493ba94922b9b8c8876dc60000000000001976a914c39ab309648cc007132cbd49981e301b311f936088ac03c700000000000017a9149ea710ee3998b8072167f05138b1ed1bd33bb6d08714c70000000000001976a9147fc6f865fc6f2f369abb22bfb528c1ec4532cc8288ac60c7000000000000160014f3403d11ce45ba90e319960216029ef3a76e27596ac70000000000001976a9149bd10f588655680266852f2f54e46c6a5e46243f88ac7bc700000000000017a9140ca8aa8ceeb3756c73251bcacf1bcd052f2d15d2879ac700000000000017a914fce552145f64b56cfe7afeb140b9d5d3cdf1791f87a0c70000000000001976a9147889deeb98b9fccc018b75f6910e03cad29f521b88acaec70000000000001976a91443093e7ff7f365de25bba55b35be80d939650b3a88acbbc80000000000001976a91439c35adeabe25a8499682ea550c266e2d2384c7388ac58c90000000000001600148fedae7378bfda037cfa2d470053f4035bc69faef4c900000000000017a914a4a8a17815e93a3bfdb291faaff4efb509ad0666871dca0000000000001976a914e1ff84c9bfb7cd3fa7a64414ced6a8d058baf23488acf5ca00000000000017a914774e04706e71552b83ee5c069dff52ae38e803c08704cb0000000000001976a9144a4403bfd29e214c58994a896cfe894b31654ec688ac77cb0000000000001976a914e2e29a188c9985332d3b84d9d0af7af265fe2a4388acc8cb0000000000001976a9149dd3a26ff043bcc94e94498a8c7992e016a8e77188ac06cc000000000000160014e48ded954551dce1dd5fcc1def3214be20beb57071cc0000000000001976a9143c19e3f28b42cf7bef5cc7681d4b20e3b20a849f88ac80cc0000000000001976a9140a6e4bf1680c550490d0800f5970e4e2c3f374fa88ac95cc00000000000017a914b3c22f50c37ada142dd757dcccf355a57a29137187f7cc0000000000001976a914c88cd8402387967139d5c045058c028e5d2ac1f988ac06cd0000000000001976a9147dfdc7a2f988ee9bbe510e5a99410aeb8cc97bed88ac17cd0000000000001976a9148eda8f0c38524c6730e411719bd6cc4a55e65d5c88ace1cd0000000000001976a914ccb8cb8dfb0478debb4e5a75fa3775e851a5607188aca4ce0000000000001976a9141d6abfe539a25522110e44c72c5fcdccf95809da88acabce0000000000001976a914cf4d20cdf9f2b0deb6fe45f9389472193a1b6efc88acb5ce00000000000017a914660787006a89f7574037ebde3543ee00833435e987f0ce0000000000001976a914e1762313437092dc9a36680e8a5630a73306989188ac32cf00000000000017a91440e0023a08de4b1604cb4cb6ff5fe07cf0a4933a87e2cf0000000000001976a914ab94ac34819863c85eb8fb30bdfd8c79ef31034888acf4cf00000000000017a914831acdf55caf44d25aa69fac8a16b2101923fe8a8700d000000000000017a9142519ab30ad0ca5fb5b51b25f1e01ecf7b8756f098722d00000000000001976a914f810c313b24211906dbece309abc1e08f32ae7e788ac29d000000000000017a9141b38d0bad1f02aa554f86928b3344018e43b42988742d000000000000017a914adf95d376058faceaf7ad2cfe904c43b097811b78753d000000000000017a914c7ee0a185a0870720ccbf7310031d300361dfe04877ed00000000000001976a914831c57e6b8d3220dccca6245803d1a433f5ac78288aca0d00000000000001600143c0f75fd643731ce11d583ba278a44b67db23dadb3d000000000000017a914b9e8852f96fb4bf47ceb471c3ed01ea7c989f10c87e0d00000000000001976a914bac6704ab7d47fc8cfc06f8dabc273bbad33053e88ac10d100000000000017a91471737783d7da90f384d59a2ccb6116a2d9df08248729d10000000000001976a9148aa63a943cdb81e2a47205a4244473685786ac4f88ac4bd10000000000001976a91486d03205bfd68c545d64cd241af85f967916a16388ac8dd10000000000001976a91436edc3e1972897ddf07d6ab23e555e62410b25e488acc4d10000000000001976a9141e8f81d57ca50968787e06dd2d3cb15f519b0b2a88ac05d200000000000017a91406f271ac3fc0b073c21f99e7e60a5f5227a5c05b8717d2000000000000160014ed993ee07e94a5d7540f476b4ee819bef4ca32e649d20000000000001976a9146ad1906bcc374ed99a6343f619f046ab7875f4d988ac67d200000000000017a9141359883ee5c18e44c9c0784915a6fccdddca3cda870cd3000000000000160014567c90fea1692da047d829ade26c3c0f4a58a40b4bd30000000000001976a914b2470667950e46774324382d25ef03be3c0f6e9c88acaed300000000000017a914ece99c81fee759e465bf823c660d6f834d4f613d870bd500000000000017a914994e73789f3caca8640ec430114ef21848c786838729d50000000000001976a91460ffa67b7f3b706c4a558037078a7ddfed65f8f988ac48d500000000000017a914a9a43c96caa9baa370093ed3f9c30aad3629afae876dd50000000000001976a9145b20fa502cf954af3b1e694f2cc46848814d2e2688ac8fd50000000000001976a914ad86dc64628c314c614f46826c15d7d9354934b088acb0d50000000000001976a9149e9d3889369eafbf999d68c3241bcdf933679f4388acc6d500000000000017a914ed4b21c9801a641202b8d22effb5118de82b0384870fd60000000000001976a91473c38c93f4f59e6d8baa6b99977108fca6178a8188ac15d60000000000001976a914966c5e31eb36c1046370224126d257cdda32db2488ac7ed60000000000001976a914b8dcb8b16d012ad370d6c64293c8d137c6e085fb88ac8dd60000000000001976a914a0d69f4194b0e89c770331dff31e83b8a62523e488ace2d6000000000000160014e274c650d831800cafb67238df76d912fcf3120e63d7000000000000160014ba90588e273c08580446dcbb7559fc887d0fd0ea99d70000000000001976a9144057000ab2c5be72f72b979658841ce79bfbfee888acf3d70000000000001976a9145db9870e4c23961f55e32d788fa55fd50a0181e688ac03d800000000000017a914455e7366d341fb0e38dcab989aeae982b5b9f690874fd800000000000017a914dc7b606dd2f3de66000960ab58c71c09c2154d9b8758d80000000000001976a914fff4055c3229c0343c8eb50e6e1f5870cb72d2dc88acb3d80000000000001976a914aea9309af40766fb41c5e2f2252a141614502a7c88acccd80000000000001976a9148a6ea0f94d7b56768094971ed36be0e0427762e088ac28d90000000000001976a914d712d829362cd90ceaaa0bc1b59d3c80f1c94e8188ac43d90000000000001976a91432a9670be0b1fbb5ac0147ac4a0bd67211dbeb9888ac5cd90000000000001976a914428988e809729d278e302a8e684bac6198190c0988ac97d900000000000017a914c84e5b2debb4e9ecbf9987346af9b840741211b187edd900000000000017a914bde4edade74940805c643325e6a5a35f82ed98778712da000000000000160014ff6416765984d0cdf874911828130938a2797e8119da0000000000001976a9142bf0b8f3b1192790c6a2877395511d54c98fc9c388ac1bda00000000000017a91496dbcbbac83eb4c53cf621ae72f61182e770dd4f872fda00000000000017a914e62a79397767f62ebd1ed431b7a8cab47772fce18769da0000000000001976a9141012d405303432a64adeda3f9787fca5b26e4ea988ac85da00000000000017a91490374d86496db1e8fceb9125a70314fc1ff38dc98790da00000000000017a914eb5a2234a06e5177608791d58754a45212bac4b687aada0000000000001976a9144c93f5495ab6952474ef55e5dfdb03e2318b42b588acfdda0000000000001976a91440438654fd0bb4e9b248f9d14cbae8eedb33ff8988ac11db0000000000001976a9140df9738ca16afb169ea1cc003a9403dc8df99a1388ac67db0000000000001976a914c4ba4ab6649f70bd219b6c0ebb51e6b4e4f131d588ac6cdb00000000000017a914a8dd90f62e175600581688cb9c5e4443961a5bf787d2db00000000000017a914dff5d82b01f56af8c5ddabbbc60497cfb46b12e28718dc00000000000017a914c10a1365bafe2e207154fb58ff28f21ab163f120877edd00000000000017a9149c77d10558d6c3614e5c59af49acb0fdc18b82588701de0000000000001976a91445de6a58ad629f1acb70b53e605b3e94f01431f388ac04de00000000000017a914df0a44139d2850b8034e9d4e81c9382f9f3b146d8720de0000000000001976a91483bc6aec5bdab0db0ce78f93d686dde24467127988ac6dde00000000000017a9145ae2a67dce7e4fcbbbc8f4d25d297f6b9209e96c878bde00000000000017a9145f3dca4c3338bc4fcae51d37d0b21a4f545797e7874bdf0000000000001976a914bb0a49a2ff1d92bbda55d3d5790a70f05567157188acaedf0000000000001976a914adf67e488c284ee4b8dfd41d0bc52acbbb1c48f588ac01e00000000000001976a9143c60d3dfb0a896eb5e973f4030ca85b059e3825e88ac68e00000000000001976a914ba895ae5e3fa948398f4e64dd15284b22bc6f57788ac7ae000000000000017a9148c53fa7ee323d7d7100a4ac28313d5376948a4ec87cbe000000000000017a914a4be0ed0b774609492e27ff1ceb168b1bbc7bece870ae100000000000017a914b56a6955ecdb8aaebdb31a8bda26b188d3cc937f8768e10000000000001976a9146aaaa9208be5d39f16a5f58e2ee03ef6486cfa5488ac8ce200000000000017a914dc334d944a6c8e02674c1d838b2e44c8e2ca316287f3e20000000000001976a91497354fb85f00b13911add500d2a77422e6abcf9988ac29e30000000000001976a914a75ac45dd37c0138e15ef97d1486e510c9f45b3f88ac30e3000000000000160014e4b00350b453601ec745683d95f5adfd5605d5ac99e300000000000017a91447d8c9ee3f201905d26905b17693d9e39adecc668705e400000000000017a914da5873db25b8cd5b3def780de512760b7d1f7956874fe40000000000001976a914fe38a433c931f22cf3fca8d4a874b42c64f1407788ac9ee40000000000001976a91451960ebde871de24e3547ba01184146329fa925488acd5e40000000000001976a9142a855870f402e950951e585415fe1ac498c33d2688acf8e40000000000001976a9149d5113c938bf5bdc0a55e528aeb53b8155cd72bb88ac0ee50000000000001976a914ec02bcbf80b99dc5b86ccdce4335bfcddb22352a88ac62e500000000000017a91446fa91d07b62bf4ba001c695981bc506e21545b58772e50000000000001976a914d633cdc29b9999d54652f9e303e94b67bed6017988acabe50000000000001976a91496f82661b02d8a58eb6a1aff238a74d82acdedb588acafe50000000000001976a91485348a972abb4ec32d25406dd96d49bfd7f7162988ac76e60000000000001976a91478542bd99269aa5e8ff6943c6e1809951fa007f688ac7be60000000000001976a914ea2c1d0e003ab89e9e6686e0ec7f2f0f1ef42ee488ac86e60000000000001976a9143a49aa90e368df7a77dc1f352ccf2e5ef31ee62588accde6000000000000160014384533eaa4cd65ed72a15a08af89be2da0947f453de70000000000001976a91426e27cdcb7c631a937deaa8c2c3fdfca1de84b0588aca0e70000000000001976a91431288040427f7cef128adf460ebc6b06343daa6288ac53e800000000000017a9140d63f3ae7a66d5104bf9b79330a8ed9094ad37c987f2e800000000000017a914f5bad72c4ce2b21237043d0a55fd0867ebdc296387f7e80000000000001976a91461043c0f13c1b16043da8f55ecdb0895a40c1b2688ac38e90000000000001976a91423f34acb8599e82074c1c55f0a4c719577ee181288ac3fe90000000000001976a914b108a5322f715e7c0310fd10086d2812ed342b1588accae900000000000017a91495e3ebdb3db8564661fb51b37338f149f5e9ed658703ea0000000000001976a914361839692e1fe3684afc9a81353650b055b00d1188ac05ea0000000000001976a914207a3e316892b07ecc7739585ef765972b4d2d4488ac33ea0000000000001976a9141c3072e9c25c13c328eac9639df0bf74d943d0d588acb7ea0000000000001976a91420a4cc3800e520972d0f83423b67b4969a3a327488aceeea0000000000001976a91436ff9c5a9d100a734058951c0c2aa3fe67f08bca88ac1feb0000000000001976a91487fe2644cbf533297af4fb52f7587dabca1cfe0588acf3eb000000000000160014d8f06cff550ee1b846f26d3e7ab6c66165f620112cec00000000000017a9144eb4d10baf1c2a7b430b9bf6a0c11a419587d5148740ec0000000000001976a91402f5faaeeb0146fe872761e6847fe81e648f8ca988acadec0000000000001976a914ec0da55575473dbae219dffbcc4f6c36a06efaa788acaeec0000000000001976a9144b97a8fa96c8628946260fb0c4b41387152835bb88acbdec00000000000017a914add9403070b820c75dafedb01f84b07642f955cc8767ed00000000000017a9149b86eb2c38781d0632df3e32d636a82464c9dda28799ed00000000000017a9143c674dea91151f9c3bb4043b9308992edd5b644187b0ed000000000000160014685cc85eb46288391a43e817780cfc7e6f57c27cffed0000000000001976a91497d4b2af2b8df110a48b48435876f245526b262f88ac5cee00000000000017a91463de9c35cc9a3ddf84875fcc1669494f0509bbb38771ee0000000000001976a914614cf0d65a7cdf8dcabf5eb6cd93052fa405455b88acbfee0000000000001976a914776baba6f81ff2ad9385c89ca5be691a5bb52e6f88acd2ee0000000000001976a914bf43cb28c4639f9291ec1e1f677ec08d7d94e75c88ac1aef0000000000001976a914609d233e94d6c05bb2fdd056ec45c51699bbc45288ac1fef0000000000001976a9149aa3e150d256bee1885bb8ed502846a8023b6d0888ac98ef0000000000001976a914c3c29ce939e009b9b12c15f2dd29e82ed0f9c57a88acc0ef00000000000017a91422ae03a1c4ddc0a6f95b9f9c0e7792bf80e948868783f00000000000001976a914da249a4c5bea016e1d9fb48ddcf018a00648f4d988acf9f00000000000001976a914f0020e190f59f399c31f47fb78c8a60208f2d2d188ac50f100000000000017a914069c3dbd28fb279da0273e1346c5308852e87bea8766f10000000000001976a914fcce2e45311e0dc1cfede4a8d0c57444a5a3be1088aca9f10000000000001976a9144b994784f0cf8173291fcf3c64ef8c6051e0a26488acc4f10000000000001976a914135cae6f0261a358659d7d58416e346814f7bc5c88accbf10000000000001976a9144fa7e9d3542034edf35bab992f303efe254902b588ac06f200000000000017a9140fd835708eddfe36855aa95e7536e24df8ac08488731f20000000000001976a914daf93a0353d1679b8e0861f021732a36c9d7501488ac39f20000000000001976a91405d5f5c54e7f2d601eda5ad7a5582c1bc7c35f3188ac8ff20000000000001976a9141b8259b9b1a7511b1ba3fa9c10902383996802c588acf5f20000000000001976a914883db1ebbd5ed574c71cf4ea1f14474a5c476d1188ac29f30000000000001976a914c3ad0dad3325fe0156ccf89d03d17c26fd5fefe588ac56f30000000000001976a914fc936292eabf9b25b29311b58eba22804e9cd2d488acc1f30000000000001976a914ec7dd8533220aa557cf88480dd8f3024dbfebeb088acddf30000000000001976a914acec62f91a6a98185bfa2648c518df1fc0cacff888ace4f3000000000000160014248622b1fc05f78cf52980bdb63bf5f6dc7c0f7f27f40000000000001976a9148ae95e5a4d38eb68c2a47277b35d395d6b2c2aff88ac3af40000000000001976a914c9567af44a5c0c0751b320080253b0690c2bf60188ac96f40000000000001976a91466f3e8680046f34721e288fe88037424806416ed88ac15f50000000000001976a914ddac780c9f32f230bd8a273d10244eeea70c0f1988ac20f50000000000001976a91495608ab4b8920b035e6f044784548d603d80d60488ac65f500000000000017a914dc889d1633a6b16035c5330c5b0fa7b550d863788769f50000000000001976a914ac36deff2f8c961a18580f563f42ce53a20fd13a88acd4f50000000000001976a91433367082df328b5894b84f945bece23b2691fabd88acf2f60000000000001976a9140faca7f71b09632394b9291d40bc224097b7fd9288ac31f70000000000001976a914b40b1e6a6a0d3b65eb4d749902e3f01239276d4488ac25f8000000000000160014543dbd6130cdb419064d5f09d25093299100bf136bf80000000000001976a914e22e18e366237775da913315c7a73960685e789a88acf4f8000000000000160014268aa7cb58541d69e460e42de76bf6ad8a5d9de633f90000000000001976a914e293bf0e413152bd729105b4d9ee6521f963a92a88ac3ef900000000000017a914744d1317aa781952d4ddd022ae982f9eed6b2d648790f90000000000001976a914177ff77bb98f692350575119ece3319186fd624d88acdcfa00000000000017a914b4541e25ff786332986b0a5b5a9da3d82666371a87fefa0000000000001976a91401cff6452b4db7a3edb5d020a862dd9c6467ea9888acbbfb0000000000001976a914cb09ab647cdc929f5477050f91ff5940af4af23588acc5fb0000000000001976a9143ec2e74a5b495206e2fd54b31c11a41054e96ca488accffb0000000000001600143dbe1198f9a8bbe944a3a462e25057e16f6a26f8bcfe0000000000001976a91431457e94e37b43a8f064e5a7ecafcc479c43b6d988ac2cff0000000000001976a914a225663cbb4ffe3d1430f59e9bc77ecc15eb011988ac3cff0000000000001976a9148aed858d4cd9fc3a7301f029de7a9b7c9d23adca88ace2ff0000000000001976a9143d7bb26662bfbebb8a0465949747511f7134baed88ac21000100000000001976a9148c5a3a8d9b5cd36b751c37c691c04960f4f5ddc788ac960001000000000017a914103aa6d6e4eafb96478439f4452cb10395eea6b187ae000100000000001976a91448564565f44a0daf54c5e30bb0fcb978bc8b5ed388ac07010100000000001976a91475e519b137f9af283b6c47aaed0ccecce061e4e788ac41020100000000001976a914ef47f1d53a2c3d61fe0135ae0362d4034b51fd8688ac94020100000000001976a914f5b1ed4972998931d2d97c08bb14d5dfac7b604888ac58030100000000001976a914c0d2f9a1a3adb45aef5578fd50cfba45e49dcd1288acb9030100000000001976a91415dbdfa53c421205c2dd6f7d71683a0ef804b5fd88ac34040100000000001976a9141540db7fbf4f46f3140b2d6437ebc7ed020ca45388ac86040100000000001976a914f39e66dd988a3cbfc4a0664862f77f75d233d20088ac0a050100000000001976a914be96d9a7d8145527d086a1fa8680249b43ce454f88acb50501000000000017a91429a835fb57e1906ceaee82bcae764f162270b09687dc060100000000001976a91438bbdfc372cdc3876d2653d5d8dbf4bf5fdf4a9188acde060100000000001976a91404ce809cce277a148f12aa04459dc5c1cdf9b43d88ac58070100000000001976a91492a8e76d6ad41e961068416d100626d425da63f388acc5070100000000001976a914fa0607163d5400e9fd9d2d10987ceab83148ee3388aca4080100000000001976a9147a4ca8350fbdd72c2ee98af5edd531f2ed9a09a588ac05090100000000001976a9142acabc8664571e5c9533477f97b48e65b56d3b1b88ac780901000000000017a91482ce1bd27179c0a193573caf1e1e14e7576253ad87de09010000000000160014e268c85b8035fff2ba6d4ac2cb822204f603ad47fb0901000000000017a914a564aa42463b36687ef04422fdd1e8021cab4c4d871b0a01000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387210b01000000000017a91420fca17794dad10ea8ba05846e685ed3bdd8314a87c20b0100000000001976a9144d7162e769e6d9acb5c5c7863e5871d8143a8eaf88acd70b01000000000017a91423fd200bf3a0540447cdb18bbb3cbe11e9a5e49187ec0b0100000000001976a91473852daee28eb65c70e44e515617725baf98c2c488ace90c01000000000017a9147ad9c4fbd141df794f39982a492df5ef4d05788687fb0d0100000000001976a91451d3433e1518f0f79612166f5bc9b1f6180193be88ac400e01000000000017a914632f2347fbf48b1b5d43e3c4cc714ddcb111755a87ab0e01000000000017a9145b465865cfaffc9643e8d82c350d5fed6a50ba39875d0f01000000000017a9147a86cf654ec4cf3dd0bef3ba440701a1a5f0023287710f0100000000001976a91455ff19240e6441ef1e17b6c78e5830e588467f2188acda0f01000000000017a91449991334a71d145e47e60c1f104ad04278984cdb872f100100000000001976a914d3e29cfbc4eea42a004e632abde1d672a336804788ac46100100000000001976a914081941f1872c2dc1dfaa18d90af704a656bd503f88ac9e1001000000000017a914fe7122452d6761a5dc8293d4aa6d4849c02c5d7e87e1100100000000001976a914aaf4e982bf317456b79515e973f563426338a7f388acd2110100000000001600149e30ac0f044631c9195984bb2f67eecb2647a044e3120100000000001976a914f3cd73c7322bca138e3a36798d1737b2dbf35f2b88ac1f130100000000001976a914c5a7b2c97e5a07fabcb6cd9bacf0eb59d2ceb43b88ac621301000000000017a914d49bce032a5a163faca71bd04708faddbb9ee4f98763130100000000001976a914d6af6e96574c3c97a53b6437781d9ec5d92746ee88ac8b130100000000001976a9148cf23cc765b84719bf0dbe6b9a81651322dea66d88ac971301000000000017a91445d5a22f48ee804a949d58981a89114427509fa887b91301000000000017a914c7259985453f45c12d2c07046733a5e825cfd39e87131401000000000017a9140d8628c77ff1e31059b4f852deaba82cd65badda873215010000000000160014c09e1d38a6e3d0f0063c8f90721a40270c14cf2db7150100000000001600143150dd91dd364e892822f3a3e2b6aca47d9af9bbe7150100000000001976a914baa692c3e58349488f86b53d3f513133e6a7a9db88ac9b160100000000001976a914c478fdf798472a7d2e77797214501223e60e62fc88ace0160100000000001976a91443d243c1cc475313796262e763e56fad11d6315288ac17180100000000001976a914d19e7a2490b3477cd7248b8980237349ccbc13bb88ac24180100000000001976a9145f775cc002ca775c91f46f803cc7dd093e64201088acfa180100000000001976a914bfc8eef362a954cdf77aafe14c3c95ede52e471d88ac2c190100000000001976a914d84572dab6113c63ad91b0c9da9b577ba4d19fe388ac60190100000000001976a914dd3f36c4a920eb24f76231efa0fdbd66f99db8c088ac6d1901000000000017a914ea8536150946f98769d96a81be1e5aa9681a4bdc87d0190100000000001976a914f73f60ba4b3ab870931d86efa14e90e6beb2097e88acfd1a0100000000001976a91496291b4838120fa4f991750966b577b1ed6e6d8f88ac3b1c0100000000001976a9142ff9aef3aace17569668eb9834fe83c1fb8c474388ac321d01000000000017a9140c4e06a551a21703f8e2e7c59efce86d1f1e078d87361d010000000000160014f75c80af2652ef8b43332e41ee3e5316b8edacd7811d0100000000001976a914243bcb3c83914f94a2bf893428f8f67b5d96aac788acd21d0100000000001976a914aa8e3bdd37f4462962f41fc10a8eef1023aaabbd88ac1c1e0100000000001976a9147f64d0051cc960c179f67b6ae2252c540cfe798688ac761e0100000000001976a9142e529835c6d9be750771eb5d76c2365c70b79e5788ac9b1e0100000000001976a914f3cf396f2964b9dff572cf40036b0cfeab1667fb88acad1e01000000000016001455ec384021fec84ac7e0503c4626be6a1c191f5cc21e0100000000001976a914423818b1f19efbdff3deea59bbe593015888b24488acde1e0100000000001976a914eda7c5bc3f7bf3931da0b6c16d9ad58fa5cf37fc88ac0b1f01000000000017a9148264d7b0dd87be936fe763ccf1e914317b63da6e873e1f0100000000001976a914e67d05cee0b003c4c4beb0aad28dba8aabd3118588ac951f0100000000001976a914eabd785b94a88a765609def80e794d31dede9d5f88ace51f0100000000001976a9142bbb9c27dac0a32a9fb3ff34e6907da5124f37a588acf5210100000000001976a9142c4ee600cff5a433a788b9ae9226c5407d35012888ac54220100000000001976a91456e627a591824f9c48ac649d0d60aa3b23c4101a88ac66220100000000001976a914d88f523f852e6fde382d9f0ee5114376080b422388ac7a220100000000001976a9147fc00b9b68b2ddf6c3e3bd7447f7e02a5bb5135888ac722301000000000017a9140ce1edafb1bc3fb9b78b8ff5c7327ee3a84b8e17876f2501000000000017a914749f57c81b25a7d0336127d6b64b906002badbcb87722701000000000017a91446b0afcd8fd8f726c9a0412cf382e97e81ad4fe387dd270100000000001976a914b83309c40ef28ae109a388a97de443502c4f486888ac762801000000000017a9146af8a8efafe9b5d1d6a9603b5123cc7057cbdde7875f2901000000000016001449a2f4db931e7a927edd89683fcfa31f8f77e009a0290100000000001976a914da85596336f321732f4b634ebc39ead075cb948d88aca1290100000000001976a9146429778ecb18acdc83d5adcd5bb4917a7a3a6a4188aca5290100000000001976a91429c372be87a14301e222a1c219ae45e639f9055788acb42901000000000017a914df0b3d062a4aea1071bd0c228fb0dc3ff0eeff9187d62901000000000017a9144717c201dfd12c317481883ceeb13d7b1b9fa31b87662a0100000000001976a914e79208f590417d6c060cb319b70169f3f1dcb62e88ac822a01000000000017a914b38944b2ec0ce5192d124051d470fd543c54389087892a01000000000017a91498ffd7119b2ff1e4ed0f8e99ec41005af8bd2ab487a62a01000000000017a91491351abc141638bf974c78905b8b3594cbdf445787812c01000000000017a9148f532e660b5ff68bab98ed5f0a70eaacdb45a072873c2d0100000000001976a91451fa95e4a5efd05c9f2ca2c75f802dc435a43cdf88ac9f2d0100000000001976a9149175fec72155876f64a74e130051b20b3ae5eee788acb42f010000000000160014d98ee375e903d8102c05bc37052fa6dff7f49bcaec2f01000000000017a914b32dfe775da9d29874b0aee1a9f1d6aa3b29c6168798300100000000001976a914e38ac088bea0619739906fad0936b068375b780488ac9b3001000000000017a91481605bc105c6583cb26a626187f4413bdb9756218705310100000000001976a914449432eab349bb12a8bd11578446718d129bf49f88acc8320100000000001976a914741cf93d375381d5dc67114bc93d6f99666ad94388acef320100000000001976a9148064510dc2447ab56c534b27c9219bc97aaa50bf88ace83301000000000017a91452f83fbd333e09c98fd22687be3cb0eea50268388724340100000000001976a914f3c018ce0fbf27f9bcb65fe151c1cb5d4261ea3e88aca1340100000000001976a914bf4e85d5c5c54cb8e8f523d758cd8eaaa24ecd6d88ac20360100000000001976a914b7605458f2dd26ed947bf1ddd9a0af8c06dd853d88ac54370100000000001976a91491cbe19d00083f5baccd45bc658bb7b856b433fd88ac8f370100000000001976a914c317d71da5e9e9d10f4c597b434ec101efa2ddf688ac123901000000000017a9149905823decba1ff164f009eaa8cd64918fcbbe12876a3a01000000000017a914923a9f206d37b45da8789f2707d44eab5e93526d875c3b0100000000001976a914cab08fb4c7c7ce131a3e74b1ea0b8c2ff41c564188ac7a3b0100000000001976a914b87452b6885f5ddc6ff47d6d0eda1c9df61da6c488acfc3b0100000000001976a914e32c529a3e492bd42e5adcf8094890aac0978b0c88ac683c0100000000001976a914f87290f3007d38176c8562610b51d4f63c782e1588ac643d0100000000001976a9142e07a0905fc78850d5a1ef7bcb62fcb17e962a0688ac8d3d0100000000001976a914e46a4f47ebb4c099cedc6630213e51ecdfabbaed88ac433e01000000000017a914706ead5303a17bff8050493be043fc1d1c85ac8c874a3e0100000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac973e0100000000001976a91470e59c1a79a7d657f66dbc79630416500ee0be9588ac803f01000000000017a9148c44d75eefbff178c22f537e17d081ca6b070e538795400100000000001976a9143ad98ddccc086bd52c34a33f74212829f9e7106b88acac410100000000001976a91441229faf9b59d4be56b3d9387b6fbe7e1df9a15588ac144201000000000017a91484d858f2802efdc98c6207c3638697f7de8c463187d4440100000000001976a914c6d14dbcb5428ae58f529e5cace7f8e30e6f10fe88acd94501000000000017a914c52268b520b36cd96c9933b8d327978a8d5ecade8756460100000000001976a914bce15e43d25222e6d3112db9771209c3e8d62f6d88ac14470100000000001976a9143ca6005539c6a96f439212b344ca593e7e97323e88ac61480100000000001976a914cde8d5df834bd4e3dfdc60215c9acd03503634bb88aca34a01000000000017a91477cc516722923cde62d203728b0e6ff59c3cc41387df4a0100000000001976a914c52dcb6e8b1e0d42104598eeb46940976b093d7088acdf4a01000000000017a914fd89c350380aa412e791e973f2738e666ff16034871a4b0100000000001976a914caf683898275c30a78841282238ebf7f63beb00b88ac534b01000000000017a91450493804cb07d13fa48571107029d6a1362b6116877e4b0100000000001976a9144208b0a40d92225de7b47074c2fa9d8eba2638a788ac8c4b0100000000001976a914ecee8cbf819ea866553b7246af13f38293112d1288acec4b0100000000001976a9140232d99a92c85121fab208ed324e71fed2ebd7e388ace34c0100000000001976a91403354ce4bab4115b85d04bcabfa85d308cb8684d88acfc4c0100000000001976a914e1127df5fa9aacb9eb56c5dace07585d0667d13988ac004d01000000000017a91493b0280407f7e08a2356d474ff09acae9c3cecf387714d01000000000017a91492e9366702239a7d63263bbb55fe3b5649c88ce187ce4d01000000000017a91494736747946e629933eebd0c53787049b73de6bb871c4e01000000000017a91406af2f177a52874b257926ca6098ffacb15f2ab9874e4e0100000000001976a9140dc2d5c0f183bf20a376d29fd7554473bf1dd82188ac854f0100000000001976a9141ea5b03c5e43bcb9244db1ab1b0a1b65879e961288aca74f0100000000001976a9149528f1fb56b814bc5063fc6a8e15c5127d62d53f88acb54f0100000000001976a914e228197d540cfe8b98e95f21120515cbe449466788acc25001000000000017a91490af3fb5f25b58ad0f886dfab846456734c0dc5c8745510100000000001976a914d2f2856cd367bfaa3ac34f35b299cc7c65975ba688ac82510100000000001976a91408034c20e55a83057be6c7cc4be8c8112959c40488acb2510100000000001976a914efa762dfdb11775a2b8c18b2ac15512f3985370488acea510100000000001976a9140f5adef39af9a5fcaf375b192ff0851f4824ae6d88ace25201000000000017a914eae5a43c82cee04fcc95f1295244e7c3709fcd688704540100000000001976a9145770d1eb57527c503183a1fead7b272806c06b7088acdf560100000000001976a9144d979893bb8e497bce634cfc59322dd3b5d728fd88ac84570100000000001976a9146d6d827b314fb61e1445bd1edbbb7fdba1d27ba488acfa570100000000001976a91410b296f6bc799a666da204f3df026e9266826fd288ac8b580100000000001976a914a1f3322643512e1396f0dce154588e00574911c288ac72590100000000001976a914ddac014d0af485db9d6ea9f7344d0fd09384d14f88ac97590100000000001976a91478e363da44984b2c05cbe1be5efda67c15da40ae88ac1b5b0100000000001976a91427ef6866d11f2ae9d92a85207cfeee4adb87a86f88ac925b0100000000001976a914af7e37c7ce92e17c61b02db5c176ff08c8c9a0ed88accd5b0100000000001976a914f7ddaecaaa8a13e9ba4e0ceeb5f3e9f6f87155a788ac635c01000000000017a9143e7dd27fce29b04346d4e00490f0f03df25bf2a587135e0100000000001976a91421cab93c4f4026d950354d3c9401ae6bee4b4b3f88ac105f010000000000160014b82415b559eb2a92e5dbae01f0f70a4910b8d044805f0100000000001976a914443a4e4910d25b249c607ad68e5121ff736415cc88ac1d6001000000000017a914399d1acd83317ede95351e696f7c18c3bf2eb9fc8763600100000000001976a9148c2d7f5d9ccee2ed0cbc50a18f066f7d793d402288ac65610100000000001976a9148729a496373265e0b355339c74f770b7b409090088ac79610100000000001976a914a33f7274a1b6d83769cad9d54c4d50bb06fb541288acf6610100000000001976a9146f801d9a36c4d82ba7fc1c6c4fdba61bc971e5c788ac57630100000000001976a914008fc9c0c3910b264a4ced3a1790f8d51003e29388acd9630100000000001976a914771ff1edb32233619c66fc8bbf126f63b26a6c0c88ac6b640100000000001976a914ac6086abb29989897bf67d808620851c11818a7488ac3d660100000000001976a914b89a8c2705a8385f462f25cd26e9a8a3d8b5693a88ac4e670100000000001600149e9440eca1567fed8b30cc503b84471d13f71f06646701000000000016001481d6b41f2ae82767e6c17647b4c3fb03dcea263881670100000000001600149a9197d3b6c10f1be8e7ecf64f9b4167053edda82d680100000000001976a91476d2377718b7e844ffc6551375bc49a08a10124b88ac69690100000000001976a914b556e10afd7965f0386a15ac115636286f2c9f2888acc26a0100000000001976a9142d08ddeaae0b026d7406b0240ab5950e486c3fe988ac936b01000000000016001446ab2821c22099e89c5b5c06840b91d2bcdcb8a9d16d01000000000017a9144f537f82b0e580c1b49ea5e9e063c4506a34905487d06e01000000000017a914d471ee61406f5fd14e4f9eb464da96f484bf125587856f0100000000001976a914dbb347a250592582207645878dfcb3446f38749e88ac457001000000000017a914e508ca331d2ec94e3b95c72fec2f271c2f51c5da87607001000000000017a914473d1db4cb69d27d5a58641139d967c92649844f87d7700100000000001976a914a8128a2dec5f150aaa2db555dc4ae4ececd62b4e88ac65710100000000001976a9148d7b571c91bd3a3e90b9c21bdeae121c8e12f94e88ac0f7201000000000017a914dc938eec048aad520e06dfd1c5a67f193c430acb8744730100000000001976a914368f5888601dd96ada7f14d4e08d7c9ca0941bc988ac54730100000000001976a914a3289c7d84823b6d2011268e72b932828422cd2288aca37301000000000017a914d059ac4f5f31a880e0c869adcd112d088d28cebd87d2770100000000001976a9142f73809498bbc0b23edce756ecadd0f73cfa8ed588ac3678010000000000160014f639614ef9b2ed7396cb3ab13407aa5789b6a259de7801000000000017a91451c4802e594fc2e2a270b6ef656b2319ea0bef7f87047901000000000017a91487f202fce3255b46b76f689e24a2df646a7a796f8780790100000000001976a914e72bc5fb44781cd6821b0e9573edb0e901b176a988ac987901000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387fe7901000000000017a91424b5a2b785834494a5c3263da34d21a3052bfd8c876f7e0100000000001976a914f3bceeaceca1a6a937d4e86b076dbbd72916bf3588ac837e01000000000017a914c8861226f3032cd91194ba4d539634b3bf27c1eb87287f01000000000017a9145fb77860fa6fff0def5e2c1ca5b011a940e948028767810100000000001600145b78fb1a7f2bb28e80c5ebfac75e2384ba5261bfa5810100000000001976a9143cce26416c9b0388a05baad7c8cac2042d1c177c88ac34830100000000001976a9147e53b720bac17defe7d675e76c55400ee4e13a9b88ac67830100000000001976a914f5a9e655e2f35191aed53b3ac6db24e24eac2dd488ac61840100000000001976a914243fd71d72c576ee9a8124489646fa0b7cbe0e8688ac6b8501000000000017a9148991a703f963de1ff9894e14dc1cce008763b1948732860100000000001976a914f39d1f1ffbbc79b46fa668d3bcab9bd51319262e88acba860100000000001976a914076b20c2ae886080d4cf7efad6a7f003e807886d88ac5e870100000000001976a9140fc57c3c51e1fbfa049d8dca2d93ae37644e417a88accb870100000000001976a914b992aabaffaa5fdd0aa51d8852e71d831ca5529f88ac138801000000000017a914f38aa7499a147d620a84552c85b83c797883fd6d87158801000000000017a91491507792ab99b89c5a9492dcfc18b43d23511b4c8743890100000000001600147426dfb88a63f38e5957b8129777c41336e4a63c4f8901000000000017a9148a7883fdbe7c68e6d2703123126692a7ac2757be87758c01000000000017a9140179a830c7f23db90f54761830b218ed775a6c1287a28c0100000000001976a9149d1c4f81a089cf75b5198470838f6da6b66d5e5088acb78c0100000000001976a9140d410b6d9636aacf656b30242f689040f87129fc88ac1f8d0100000000001976a9149e562d99467af694c11c66ea9fd93de646ca923788ac238d0100000000001976a914c5fff20aca099745abb8dba107d58e477e15c19088ac6f8d0100000000001976a914943dbc710cef4cee012d0918b226e04165d15a1588ac878d0100000000001976a9143b2dd084de358dc2fb7238933f116db71e795a7f88ac048e01000000000017a9144b3b51187c8652cac2615d40e15f868ed885056487078e0100000000001976a9142a12949ebe58fad142159b28593cf9f285f746bb88ac268e010000000000160014d8212b0f197c4a70f90a1a01026a46d5f74a20f03b8e0100000000001976a914ae09b505c4dbba89fe22b033bc2d201004eb340088acaa8e0100000000001976a914e624df70e3898c8fc28826950b9fe4041827dbb388ac868f0100000000001976a914e9b377f5c6aa306609deba080b42f9058574fe9588acae8f01000000000017a914fbeaa7bc273735669ef0d1ced515a66b38e3f7f8876a910100000000001600146c0ffadd2bc161970c9b53576acc93b1d14bf72b73910100000000001976a914f1172e6d34e8455711aeae69b1fce8b630b82e9388ace5910100000000001976a91455e12a49d7967524950bfb268dbd23a544d64bed88ac709201000000000017a91408d970e6491195e5f196d185b0eb1362903118d287bc920100000000001976a9142a11d47b1c061bdedf72f184ebc93f9db12a54af88ac69940100000000001976a914796d34f496a45b7d3b7424abc6a2fa1f4f243e8e88acc9940100000000001976a914ce1b4c3aeea60cefc1461f3171b00f44e454c56088ac3a950100000000001600148fa6f8385998382a6173e1a3e631fc7f206f24f1509501000000000017a914b793c4c36d248838d955d6bbf3660e950ad42c2b878a9501000000000017a9149aa681c56006b298efbb119ef39624c5cc0b663e8730970100000000001976a914422b9744891d233d6a140ddbae9fff8a7bf3935388ac5e970100000000001976a914bdff899f1d64aa8e0fa135f2a541fcde1507ee4988ac7d970100000000001976a914c7049607d1569c4acc80386dad4a4749a66f751b88ac949701000000000017a91400fa027c3dda90bc49542bbb5a75308c0c01450087919801000000000017a91412b96448989f2d516cde6d43328ae8d15d32022987cb980100000000001976a9146d86d0bd93376cbc47d0e5fe6fd1f4e09b3c2d0788ac3d9901000000000017a9143447a5b75271e5fb94874660cc5d532ead356160874b990100000000001976a914ac5bd96ad4170bd4676b72bf4cc04bb3a42efaee88ac189a01000000000017a914d3b5e4d54ab1ac8419a8869d7f9ff5ab30f8e6fc872e9a01000000000017a914a6c71dc397edc3df649abba17cd8410cd47c4e29875d9a0100000000001976a9140c61b370c105e538c8ce9205f5870971e36a09cc88acc59a01000000000017a9140f40d2a90b9f48a39b2f55b0dcb504c0b5a629b087159d0100000000001976a91461f5741cd846b0604ba0b4e767fc3d4db292629e88acb89d0100000000001976a91407b4d4eeb8ccdf756acd91548643507765078eb688ac2f9e01000000000017a9146a2ae4beb9adf106291994aa5a4e43cb5fddb8d987919f01000000000017a914071d329e003015b755eb2ead4250367c5b0e7887870ba00100000000001976a9141e485676edbaed5de4987e8d9d057dbfbb9a6d7188ac9ea00100000000001976a9141a6179454f0e1f0ba4421bdb225295658c5d247388acc5a001000000000017a914ae226956afb90b643b251c26b4e9a48574c9ce2b8778a10100000000001976a914ad65a425e3f46ae7ceb70b52bf1f864013b1007488ac1ca20100000000001976a9140331631d81e6e894b2065a542a4ffdcb4a05d39588acc5a20100000000001976a914b4fc82286b3f63e95146c3ae6b39e78ac1c2c14188accda20100000000001976a9146e499fb2cd67b6037eb01e3c7acf25cf5c25db4f88ac5fa30100000000001976a914c6eb63f91896fd164c8a514553dcaea677a43acf88ac6ea30100000000001976a914cc63e82d9e701bc6139ffe1451d480d25dc5108e88acb3a301000000000017a9141f8e8f52bf7f061dd89481c94e8aba0c5b96ee8687b7a30100000000001976a91417b66af445b1a4f660c569dbe8bdc74789fcd8f388ac0fa501000000000017a914d992e23082ab9b3d7284a06705a85eb878d0e39a8763a50100000000001976a9147ba4421bcc88475aa4708ca1eef5739172c5df9d88acb6a50100000000001976a914546cef1a8094be50a5bbf77e588d2d5aa822b0c788ac4aa70100000000001976a914f540c1eef0f339e32932d3eff48f17ce77de4f1088ac6ea70100000000001976a914c47f92eceab7be0cc26af9d6d8228691e6fe17b388accaa801000000000016001416f0f29223ccc8965b5e80540ae2eb6481992fde01a90100000000001976a914d05f14099b90e75da40ca808d3015edb7c4d571f88ace0aa0100000000001976a914ddc5f20f73c057c64e0d9d3c233b1524b6ca381088ac20ab0100000000001976a914d21070f8639a529905d32249d678941a5109e0b588ac3aab0100000000001976a914980978dd4df1b0d7500f9433bc34616ebf408a5c88ac67ad01000000000017a9148da18dc092c04d22dfa67301b5f7920aa8aa269687d9ad01000000000017a9141e74699defa3046d5cae1f9ca93f36796bb7e460871bae0100000000001976a914d91f034bc05ed39c1921563ce2d6f0da23e2732388ac94ae0100000000001976a914521fba79b675e875aefcd334009bdf865d32b87c88ac31af01000000000017a914d17d8ab42c515f7b5a635c3c7d261731701185a58794af0100000000001976a9140ffafa7ec57eaea0e08376840a33ce61f8a4925d88ac90b001000000000017a914ef1bcc19de4bee850b2b76c3ef889557fdd6bffa8765b10100000000001976a9148f42f2621136f1a1a7a472d19a35bc1a99ad009488ac60b20100000000001976a914ba9813ed20968e160080ef00f97e750b2e49da3088ac66b20100000000001976a914e0366e5b3becb389ef3168efc1852cc04faa8ce888ac2db30100000000001976a9146a8ec340ea3b03eecf2558427af55726cc316bd188acbeb301000000000017a9142051a285ee783a681fd28708591e4c70fe4e6a5487efb30100000000001976a914513652bf14ecba92471d45c42575e30df32174e588ac5eb501000000000017a914095d3f7a9c405a89db9466ea890f40932a8112b587ddb50100000000001976a9146d567a36e98df1dd82cfd4523e43ba40043c4d6b88ace4b601000000000017a914edac349bc115d2d2c7d8b722cc38452ab78b550e87cbb70100000000001976a9146d3fb825baa3a4b9c6e61a928dc6d6f494f7c95c88ac40b80100000000001976a914e281f1ea6c0425fd874af7ff5699e9a86578be6388ace3b801000000000017a914d43c5ea3e7f2c30335cd80a3b2ee8e43a85f3d24879ab901000000000017a914d2cb37aaa805ea95ccc48ea1b0e6c481fa9eeaad8719ba01000000000017a91481ce9c2aba496e56a9e3e0176294ed45db844b8d87bfbb0100000000001976a9144e999c4148fe29f5f4c1d35fcc48a464b2e9b53a88ac1bbd0100000000001976a9146756e97bc9588d66a8f94164301ec3b55e2869dd88ac1dbd010000000000160014e15e4e6c349be63e508e51d35044ab6d69a6a15647bd0100000000001600144240b5d5e2ac208029b3623d1535effef7db5f34b3bd01000000000017a914f629324c026de353e660aa060f93dc7c20dc3bf58717be0100000000001976a91490a76898c6facb910a6e42078607e3708ec80f6a88ac3dbe0100000000001976a91454c96e0abde2d154a7ecf856116d996608513bdf88acaec10100000000001976a9148a06f1cd84ce6ccf0f541e8e3b7729d5cb0f90a388acc1c301000000000017a914dd284ab4a1914e84d2f6212636f9c42a28724f0787d0c40100000000001976a9145a35d53702fc3cae296112efad89eac0f068a46488ac40c50100000000001976a91471bed327fdeb983d68194c63d45fbd8f62e0fc4f88ac83c50100000000001976a914bc98d4922c175f2da41f018ffe4c0d38294fb3d488acbdc501000000000017a91418de4765b9a462dacb3cadf4c6af269bce603d55871bc70100000000001976a914e6f83588b65d1da51e744f3b3baf23362c7ed1f888ac2ac701000000000017a914ef58aadccd4425ceae9af02ff9ea3399fe462e9f8736c7010000000000160014944b6ad39d52f466a85cc6119936a6987a5c8c60a7c701000000000017a914252809c8fb3254053e45f9ab65f02f74ac8bd9a687d7c70100000000001976a914b61d0a20135c74c9dca493cc48f000e5900f899488ac16c80100000000001976a914334af37bbb75ce05ae4bbaeec35959893893908088ac2dc90100000000001976a914f111426ac4dd8e60a21b320f9519aa58121c8ed188ac5cc901000000000017a9149bf0a6671704603d5259fc8efb6c21095ff74f3f878fc901000000000017a9142d31bae82e75136b858191e705fb67e2d9265191875eca01000000000017a9141b1e0f25c117d5f6bae1cccce0e906f0b7fb962a87deca01000000000017a914bac066b6fd55cd2b58abc1dc7300b0f9cb0c308087e4ca0100000000001976a914b2e54459e3f834ee57724d1bf8a2b018a9e994fe88ac38cd010000000000160014d5a9c9444434b0fb8b3522a89ef9ba155dca4a0d3ccd01000000000017a9143e1ae418e3b8997c8a829f2fa23a452118d10ba787c5cf01000000000017a9147e9ecf9356730215aee0184ecb7ed5ee3829b75687c9cf010000000000160014828ef3731c81d823130c03c3c55ae8810ed5d5ad96d001000000000017a914c110674de7d59737494974e75aa526915bc6a4bb8709d101000000000017a9149804da1e264990bef1a09e17f4109cdd2940d86e8740d10100000000001976a91476c756da352a52d310847a5cdd6c1c68c779a0f788acb9d30100000000001976a914f791f9555802f4540c32b0dee7888fbb540248ab88acd1d30100000000001976a9141b134efd15f2ed73ca3134dd9f2fe942f61b001a88ac06d40100000000001976a914c77b4186aa04b0b06c7d29647be6998ee472f33688ac18d401000000000017a9149e21f0e1d247ade41160f31c98856bebe0f4a762879fd50100000000001976a914a459d5fcdd19ad57c3999d93a7ec3804b90f32d188ac94d80100000000001976a91409390434b1c475d5e9f5bddccbeb84f18aac1db188ac73da01000000000017a914f7d9de1198cd061f84cc380ef1233d3f1180c70987b1da0100000000001976a914301df0e2476dbee2a21a09ae6867c00e0f9096b788ac84db0100000000001976a914a7f4d359fd0d35be6bc986fa0772ada0d99745f988ac96dc01000000000017a91419a331b0e535fd159e7e5a4ab9e64aea4b69a51e8748df01000000000017a9141696ad20a3bb59a4e7402c65787fe69441fbca1e874bdf01000000000017a9144322741dc3f8751f057e013529c7dc148ab645d387e8df0100000000001976a91456ce2fc8c7c81fc0c1beb316d8c5b3abf6068f0d88ac62e101000000000017a9141c4122bb3050a3d68f73f6904b6f4d4dbc3ca2d1876ae20100000000001976a91409883015c549dcbbcc9e46320d9394d12b8e8adf88ac7ee20100000000001976a9148a20fd87e518822193ab6cbe992f4ab2e1c3c04a88acbbe201000000000017a9145fb8af3d322da6140ad8ec16e38f65db0a933e7087c4e301000000000017a914be045d853b7b64ba5521404faa6376635d88ed7e876fe40100000000001976a914aeb2ea437fcefd7fd348831d5874a7223c1fb2f988ac71e60100000000001976a9140cd6c8d617c71399410b4b82f904d0b33bfeb15c88ac91e60100000000001976a914fe21c8175cea48da212f8a56c7821a484ed0d4a088ac85e90100000000001976a91496061728fb0ec771271418dba4f3740f53cb2d7088ac3cea01000000000017a9148e15eee5ed778857f99a3949477677946be993968723eb0100000000001976a914347728504b6c012dd6a30c26a7360ad2494540a288ac5dec01000000000017a914e821e1847711c7d9c0b4c06ded6a64415a93afe98737ed0100000000001976a914944203f463b792d7f166f42a317e4abc614df5ad88acd5f00100000000001976a914c2ba56a62fe08b146d553760d29bbd199647eb0c88acc1f10100000000001976a914af884c6ec67cc9dbf69465a416e8251ace53c34f88ac0bf20100000000001976a91487fa02456c3cace499924575883694ae3f9d210688ac0cf20100000000001976a9141fd4facc8cf5e9e4aeb427661c0846625363864a88ac00f30100000000001976a91421ad6ca46c249afc8048a07674852479e8aeeec088ac1cf301000000000017a9143539f53638dcffad1e15a76be00fe249e7e385a08747f401000000000017a914e84358421ce4c751b7a98b391c279e2ca979d4828756f40100000000001976a914d129c45ea703d91954813ec15e67d94a9c1789c288ac7bf401000000000017a9147d6af54e43cab2c5f48998ec8cf5e442926b063a87aff40100000000001976a9141fd4facc8cf5e9e4aeb427661c0846625363864a88ac34f50100000000001976a91474bfd126eda206696e6d77f2b161f593c97d2e9788ac50f80100000000001976a914a90ad58a38b35bbf425af2cd5668a3067130d8de88ac79f80100000000001976a914345a9acd48d29d8bd9052ad631578b6312933d7488ac8df80100000000001976a914bd5a60c7f8bca5452c363040c974ce23c93b519688ac81f90100000000001976a914b9026e9e0fb042c4636ef87c953efa6ee468dfd288ac86fb01000000000017a91460bdf826853f85436490ef168580ea132a0a550487d2000200000000001976a914fe8accecb2d24fd5094e70cf3132d5e7af19f53988ac83010200000000001976a9142bb99dc1faa2fdb65a4d21901b9d8a2e9dd4588188ac9901020000000000160014cb00417f3ae21bdf5ffef1fb3976fb1454648ea47a0202000000000017a914885f1c81400f6d7a669536ce6867730c2f0ebd42873f040200000000001976a914b3f90695a27b7c80d995a1b4d02be8c94753f74988ac0f060200000000001976a9145382840bbfd0247d9f5dd6ec7d9de18fd96448ac88ac8207020000000000160014446b77af8d10e11d0fcdc8d99637884615bef7cc430802000000000017a914eace730e5a6e558d2bc99c875446cf9e185c610d8770080200000000001976a9148ccef230bd331e2e9a8f876c87331e9d254f013988acac08020000000000160014ed453ae3232e68cae6b634a1bc8b95f81380aac2e5080200000000001976a9149ff0733bcd42f4d8f3414e48cda4f40589ce90f488ac6c0a0200000000001976a914ad4eddd2e898280d237b7df87fcd298a87a968f588acd10a02000000000017a9143332f4064e5ec953d6c8bf06a180607e493526b687540c0200000000001976a914df0e156e1790ef2da6bb40cf0d2b8595045f816f88ac550d0200000000001976a9141bc7a03e0ee6a1a2f0e65a302e6952b2713c60c788ac061302000000000017a9140aac27043931ae77d0f7ddfe0da321531fe642ac87d2130200000000001976a91469bf37730871c274ab5c7ffb71e933fd1a9a81da88ac7b150200000000001976a914042bce5f590a331b6e5827b7d6cf40f3e691095988acf2160200000000001976a914d956033c6f828c2b574941b7d1d3039546b90fed88ac2c1702000000000017a914ed1648c522cd3d818ccbc64d3a29bf1369772d9e87f0170200000000001976a91469c02554f29eee0eb4b12b9083bc5d5b382fcb7688ac56180200000000001976a914d9de68df8b24248469b9d073dd6e25cfcf391eb788ace1190200000000001976a914c17ae39e26dfab4936a1915daf243d94b2117c7d88ac9a1c0200000000001976a91475fee18258a39cde0bcfba71e5dfa6be5d91e79088acab200200000000001976a914a027ff48ec484ae59d7df94cdd8ea6b7c96256f988acb2220200000000001976a914ecb64e075d6cb82da47c14f7168652ce37e779b388accd220200000000001976a9149e325053581d0d158e764bf91ba1cdb631b990af88ac11250200000000001976a914df45c8a9782258c36487f20fc2239cca38dbcb7c88ac1b2502000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987c2270200000000001976a9142a034fd85b5836c584cce6e6ac8855b2dd83dadd88acab290200000000001976a9140d56372ff5aaad5d129ffea4561fd9e5a8c8d38b88acd62902000000000017a914cea55674caf0b6c4f4b52820b9487b28f6d0bac487132c0200000000001976a914a2ea28507fa79112b95490bda9e5f5a115ecfff188ac812c0200000000001976a91462b5de0a4c777865156dc3338f39eae3f35b6cd488acc0300200000000001976a9141623a370c9ca157be684450afc9740711e4e744788ac1b3702000000000017a9142f4725a1e1a1ed7a15d3e5f52c19ea7bb920b498870f3d0200000000001976a9147a8d89446521ff5d7e19e60ca9859098a72a902488ac3e3f0200000000001976a9145361d7a294fbc7d2e076fa763422ef079f92aa6788ac563f0200000000001976a91469deebbb1e4b594f91f01e65278b85c67616b91788acbb400200000000001976a914ccd48f6b9a43d638fdda9c3aee442b6e60c8811288ac0c430200000000001600145c6c27f2332c4c5921ef801729acaed3ff69524593430200000000001976a91427b786cf4d211faf8d830923f5204ec3cb41d70588acff460200000000001976a9142f9cf8ea4170e87a5c83ecbcff550b62908626ab88ac034802000000000017a9146e5280b8988b683b71a14c8e3480661de3dd9add87054802000000000017a9141483433051a8d1044a7a1bd9215d5d505b782d0e879a4b02000000000017a91433192aeddeda151809cf975d083845ed6e5ceee087d74c0200000000001976a914450908c49112b1494b356bdfbb4ad31e1302f54188acf74e0200000000001976a914b03e25c4a542084b3ede62e37ffd92c43d1618fa88ac3a4f0200000000001976a91447cb62569e8cad086a7ac5e56a871bdc42a5014588ac1355020000000000160014df6d00def95407997d7fa2adb37cb81bf8382d3f185a0200000000001976a914391ac1ce8b041d2d8431b6c0c2c766f0dbf870fe88ac915a0200000000001976a914a4272a1f6e34dfe0967b43bd41162c753f33e62488ace65a02000000000017a9146b9170c2a4590d4eebc2ee85dfa6b16c18e00a79870b600200000000001976a9142b7e4438d90c2db1824f5481f76060a8ec0f5fa788acc0610200000000001976a9143b1af21171373576596abec606bb4260af3ab19088acd9610200000000001976a914633d3ee5a01335511d76456bb9c087083090b10888ac7d670200000000001976a9141e516cbd21f0fa210994224830248256a326932c88ac316c0200000000001976a914e93986a8817f2d65da7c210ea44c60724868101688ac8d6c0200000000001976a9140931f4b726166358700ed1908a4aa41baa9c70cc88acb16c0200000000001976a9149c46060ba2760015173ba1020a51ff434d2140a788ac036d0200000000001976a9141f37a4a1b56a33294d646ad2dfda60441652aee388ac9e6f02000000000017a914ec4f7bca23ca5337a5dbe13189169380a878fcf98759710200000000001976a91432834f0e47e1c93a51a4989c6f4b2bec0ebcb6e888ac8d730200000000001976a91463a616dbc2cb69f0932d811630279a85ac1fe28c88ac057402000000000017a914ebaadf407a63d91ae7be219896ebedfc5d214f75878b770200000000001976a9148704e3a1a87aec06ac37fc4ce4a12219d1b2677f88acf8770200000000001976a914a297cda49216d49bc541fd71e3aa4cdd65e9603388ac817802000000000017a914f981c719149b44935f8b6b9a4625611905cc13ff879e7e0200000000001600142ed0ed37021ad84d43bc04afbbe2ff0693730f493b8002000000000017a914b955a4bd1dd5054b8a613c4ee4702e9e53547541878e820200000000001976a914f754aac4e5c791922de5f69a450a459243af3bbd88ac98820200000000001976a91463195ed8ebab6a24faee0dbf1b42b053c0b5c74d88ac8a8402000000000017a9145042a0c9741e58a034f85730750f09e1ebc41bc687ae860200000000001976a914edc5f28afabcf79196f71c4f4dd8b11138098e2188acd7880200000000001976a91457d54be58fb924a5534b3ed9ba28de4f85b9427488ac208a0200000000001976a91422554911ded86b80d4a72db244887f5d0483e38d88ac6a8c0200000000001976a91452f1ee4f00d764d40ccba93b01b44717ac8a81da88ac9e8c02000000000017a9140b2e3b65edce77b0b9be309f5a77cb79472aac7a87588d02000000000017a914533e46c28871062e3b3d6872bf2064a93736fa6687d98e0200000000001976a914fd9da1c83fa8f344669ae86a1c8af47ec300de9288ac7c8f0200000000001976a914719e93aec6fcb0f81d942100c8f976359a4dab5188ac28910200000000001976a91455c05338bc8ce58c7b3fd9cb098577490724475e88acc79302000000000017a91454ac9a8bde5c4a6e252e6b00b34286811d771cf58701940200000000001976a9149315a5a8437b7fe6cae4a694f5a0f4746bab625088ac8c9402000000000017a914c94f98c88216393d475237f5b8118ad10c18d54887f19702000000000017a9142432eba0ccf5b89bd795f6412516560a1397a5e9872f980200000000001976a91460b1c09ff20a1822971de40c02e67a87bcbae2dd88ac3f9a02000000000017a9143294f4611de1ec2287ea373f3d9abc41ce0e091a87a29a020000000000160014b94d1c7ae3b66e5167b9ee3404fd507b2db14eedc59e0200000000001976a9143eb2db735b1a766a28de7b534a5e60dc34bff72288ac68a00200000000001976a914a865cf25df1c6375160f1736490c03aa99ceb29688ac8aa002000000000017a914b91c0ba947d8523efcd058363192017acd90965e878da00200000000001976a914ae5ba3e1796af95112c4a18ac5c82834078174f988ac52a402000000000017a9149d57699a140d02346ead14dc50103b7b74e035d18784a60200000000001976a9148e6ae62977236ee49dd5d9f4332bb8ff60f2f88d88ace5a60200000000001976a9144da3059db3b631133921fc65bfe5177d93b7baae88ac4da70200000000001976a91412732210aeb88fb834b7c45dc0d05f33b1ce827488acb2a70200000000001976a914c1ec181a99f5bd919aeb8a15855e27977e199a6788ac64ab02000000000017a914f264699303661cc7bf4b38bf07856e696ac626ae87fbb00200000000001600140d0520c73fd170fc251c2017590ec7baa48866ea6ab10200000000001976a914d98255bf6835f65577fbda477575bfc083e492fe88ac38b3020000000000160014bcb7eb897cf95c49dd766253500cbeda8d2f9cdd65b30200000000001976a9146bd4c7565e2ceffe140f6e277b4a4073a441541888ac19b40200000000001976a914ffe80b3cb3e4cfb6d16841f8b76b43b86ab06cab88ac8cb40200000000001976a9148f0a8882e1dba3d4485dd5da0d7abb41cb94cda588ac98b50200000000001600148060e5b5e1fb65d9d30d2a1e1d98ab29bdc0771dc0b5020000000000160014e403b5232706a7d37ed6847d01eb5c4a3d52793d37b60200000000001976a914758fb7d5f0015275c19550726f18b95f2f105e9788ac7fb80200000000001976a9140d131050381c9d218b25db6701fde44541da15e888ac24bb0200000000001976a914c3727efd8810a7c42ee62f3dbd9a0266a62907e788ac53bb02000000000017a9147e2cd924375d7ea5764a7da3d5827512e8a0493e87a6c00200000000001976a9148d523b4aeb8588b3fd0cb2d70bd905546a6683c388ace8c00200000000001976a91437a2cce4264de8106ed6bf56d2e3804b0e4493ff88acb9c50200000000001976a9148c400a1e1db1ada6deea0645056aa090ffdd670588acd2c502000000000017a914e9f5e8f4f40c964950a7f49e60a7bc846b86b55a8715c60200000000001976a9144b14162ccc67b11ccfcd9726ca18d6f9be2c2ee388ac19c60200000000001976a914a59bafbca6ffb492fd225a45b5a8ee817cc6894188acf2cd0200000000001976a914d470b5e5d42499e007c830c30da9c55a6d5e928c88ac74d802000000000017a914ec1263fb3cf746f7fd8a6945ef8663b68c908c168791d802000000000017a9142e647b003ba14bf35f1f883d88517e0aaed45f2987aedb0200000000001976a9148077f24f5d910976dc2c94835bf5675710a859d888ac98de0200000000001976a914070f365f9fdd81df695d6acdd5674f9210e3b0e088acd0de0200000000001976a914f639b3e11f6dc0967489b8d1d6223a8afb4f631288ac67e40200000000001976a914ed4b985f709d84ef0b36dc43baf5a50d219088d388ac23e70200000000001976a91462f84d81169073e7fd299eacd582d24b61268c7388ac56e90200000000001976a914da87c0efdb4c4edb0d7011ef11ce8a9f8b86d34a88ac60eb020000000000160014d575ebbf32d728390b393102b18691f8c72e2ee14cec0200000000001976a914e8c213fa8fd05cd2c890c61b75e2d9cf02cd01f188ac34ef02000000000017a914242a66253d2bfe305963862f2c93de1100e13dde873af10200000000001976a914f83ee9d9c4dfb3b36e344f90a4883db3253257f688ac14f40200000000001976a914cf9fc0094b1849a5749fe266f7501401fa92daee88ac46f50200000000001976a91472497d601a17704e81e4361960ab568853b4495288acbcfa0200000000001976a9146b652e785f3eaeebbdbb3daaa4ddfef09bbe9a3f88ac49ff0200000000001976a91483a94b34970c40f80f43f3806ded3da9c3170d0088acd5070300000000001976a914522fcde76245e90b7b8dae21053cc8a7693863ac88ac83090300000000001976a914885419ee2cec945cfd28dc629e1d46dd0022bfc388ac990b0300000000001976a9148792cd64f5ae3c4149bd538a524e7c5907c8067588ac540c030000000000160014bd7bb404d751f09cacecc9c6c16b19c30dd605bc3d110300000000001976a914c9c887ff7a2e98eca9392a012c32765b0febb15188ac7a110300000000001976a9142a05fff92f00d08db09ce7de73d026528c65572a88ac38150300000000001976a914a3b601bcca4658ac338bef977d9319bee59e803888acd51903000000000017a914a1aa8a7bd780df88dc0480d0a205d847fb71179687bf1a03000000000017a9144ed0faad7de3a0a2825e555c1db5ef3cca7906928720200300000000001976a91467a8226b132a5617339ba45340ee13f856ad29a188aca7220300000000001976a914dcc652ebbc12d73b2e800ac6d267bd6359d50f3d88ac2d2603000000000017a9142f81994c03ece74f52403b5456dc0fd037aa0495876e2e0300000000001976a914d61b6c662034796e56f20b57e1494e03936ede6188ac812f0300000000001976a914ac56e456a558379e732e79d9d22b3e0c2dd99ee588acba2f0300000000001976a914775ff3da016924e625ba54878d3656649724e48188acc8300300000000001976a914f5fc87ee5340bb6577e0b8aaa5b4df9dcb48bf0f88acb4320300000000001976a914cb2619ef7fc85974224147d7776ccc1b83cb5c0f88acc4330300000000001976a914d8630bfdc1da51853fdcb5914beadf4cc872158e88acc73803000000000017a9148158493326c8260759702e26f61049ba9dbd1929875f3c03000000000017a914f3101542d45fa7593f7ec3c26919d3da7ebd4e728754440300000000001976a914cfe2dc1e71d8dd20a4266bc6659df4e4ac616cdd88acda4a030000000000160014b8a6be7fa70626a1238736b34be245d90cc71b8bef4a0300000000001976a9140766c11266a290a46a12bca6ea5bc5cc9e42ad7d88ac9d4e0300000000001976a914160e6632de19a46b193b1fa54a9533e6c1a9f8fc88aced640300000000001976a91415736c665282bfebb899a4896d272989b43a17b088ac2f660300000000001976a914438216a00290fbc1a428d2758d870c8b4e7caf8e88ac8f670300000000001976a91407758be64daf0149e091593d71eb5da4dc80769a88ac636b0300000000001976a9140d5e4d1a0aee07d8bbca7f68751762a8d29bd5ad88ac716d0300000000001976a91448d3a336c129a9e94038aeb52181c20eb957e0c788ac187c0300000000001976a91477192350f195524974741f403c8ca4cb96f7e9b388aca97c030000000000160014f15acbe078d77589de18b6a48401c838a7d2e4046c7f0300000000001976a91422d140c8d047092ed83938d7a0c6c0f15b3b9d7588ac69800300000000001976a914b5fa622b392d44594e217d13b0bdc7465047c28488ac41940300000000001976a9144a1fb3b043225a478eee6eb1e57d7973d65353fb88acd5940300000000001976a914304a33b2c43c2f6c61cc4be3bb86ab9f601d72fb88ac24960300000000001976a914347c3e9b595d2f04f75d03ae5bd2930182e9cdd588ac02970300000000001976a91486d9d5d445dee1a3a6605b40dbe0a014eabbb61c88acef990300000000001976a91490c8282063ebd78e2ffc5b3604ea46be5a327d5588ace1a00300000000001976a9149ca63e14af1899e089d4b08cfad961e7a89cbf0d88aceba10300000000001976a9146eba5973ad9ba60c5b16079dccc811f7734952a088ac5da703000000000017a914287e8f2631882b282f0a08c5ca9883693b11fdec87a5ad0300000000001976a91499e8d77d3dfd8479dba104bd019686b329468f8088ac18ae0300000000001976a9140f330aad8a17fc04ebf4a605def339089187e4d788acb5ae0300000000001976a914843a1a8a24fee092723d4c274f9e6b7268fd62de88acf7ae03000000000017a91413f7cbb3797b3e57176f3662940af8f8c72f24fb87cbbb03000000000017a914d6275d476ef342891987d6403f32df44a5a9818c8756cf03000000000017a914e11956a7bd3bfe9e44221f0aa6fbbb21c5e2e8e68760cf0300000000001976a9149b3f1c7f33baf52a66c4adc9f62e0beb7c896da088ac75cf0300000000001976a914f72479df6bfd0fabb86f90024b4ec3662e660f3e88ac01d10300000000001976a91430d6247ddafb929f32021d5252ec8ae9115f28f188ac54de0300000000001976a9142c706329cda979d79086c1262495babb8042c1c088ac5bdf0300000000001976a914fb1b9c83aaeeb8943b667c64b35e94e357998e8f88acf2e90300000000001976a914e5af0b4dc5968802eef8bf4f6af25e3fe955b3c088ac19ea0300000000001976a9145703474f1c31f327aafe1d8cec829af7f5468e4988ac3ff203000000000017a914855590cf09fa4e2bef92c86948b20405125ed2538766f3030000000000160014ed7f1287353dc523864e20ee8349420fb3fc6d0a91fe0300000000001976a91482146b50880c04c7f6ab6d52170345f4a2bc6c2688ac96fe03000000000017a9146da82990d06d27a337666b5787ad09737d32421087ca0c0400000000001976a914550298d2acb844a336aa72ba559b8d04a6df099788ace70e0400000000001976a914d6f35d7c21fcc36339182f55903d058c9bf7258e88ac58280400000000001976a914bb74352a96e5a5b4a5be17078056504ae358a13188ac03300400000000001976a9141e3460cbc485a3bafe9dc014b36a9ea86eb2398588ac28380400000000001976a914a93a73808485e63a73705c64997f07b828d867a388ac913b0400000000001976a914384d7ab4a6094a08ff4e8b6ebc8abbc3ac3f9f1688ac9e4904000000000017a9143286d556229112051fcc04d80a0f618ba9a67c5387334b0400000000001976a914b96e3ecff27f685fde2e9e2a4b124c73aec20d7188ac9b5304000000000017a914bee9ecf418ab3438d18c46686e5a056ec298f3b887e1550400000000001976a914933bf65f347bfa0067434800984889f5d564c1ba88acee5504000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387eb5c040000000000160014927195c120ff94bdd0548e58bad3d55b3b17428def8c0400000000001976a914b2c8a3f1492b231c89a16c44be784950ef261b4e88ac499004000000000017a914084146a7cc767aa5411b458a3043e857099450a7871d9b0400000000001600142684f8270751469a456567a008f93d6d317ceffb4fa60400000000001976a914e2407a73e0aa0150d7c115bfcf0263a629d3843e88ace5aa0400000000001600149e103352e0930accab881fab09c70a2f6c033d6bf5aa0400000000001976a9140d86ae712ce39049b4413c1f1a743b9280aca11c88aca3ad04000000000017a914ffd869a9622354e14063acca6c620dcd4480a5f1874cb404000000000017a914f4c9d1bd61200a83a28ffaddc3df2e98421b477a879fbb0400000000001976a914c31731ce018ddd59a9acf8ce7137ad0d9e38a6d588ac00c50400000000001976a91480e324969281013f25046041028de5e27e1bfb1e88ac23c90400000000001976a91409ac7d2e5e351a7bb9f1e6f533483d1ac5eca21388acdcca0400000000001976a914e84942c04ef278dc29bd7ce3ea350c60fb696b8488ace5d30400000000001976a914fccf60a317c612c607818b1be3b07d250c7af49b88acb9d80400000000001976a9149c8afae145054e20d89befeac45065e98a709a7088acbfdb0400000000001976a914573014db8d76afd65ccd43e710cf96c64ee861e288ac42dc0400000000001976a914188e0c73d7a5ebea83b38d5dc2857c238b8a745588ac62e20400000000001976a91405cce8a0a13d8bcbdd405d7a36fb6fa28eeb6fd588acd1f50400000000001976a914f10e258487af3448c26c07641b08ab53cbc1887e88ac12fd0400000000001976a9143e9ba32aa0688ea476f8d6e62fdea6fafd0c68db88ac5d0b0500000000001976a91421a42fd58d4c789411f75203d997e1575365d3c588ac560d0500000000001600143569727b8de40b245413fb66c41028f50c8bb4b6ef1805000000000017a914ec60ca994dea35f0138a0747b135b9679755e550876c1c0500000000001976a9147302b052e46e02a0bfa5c1956971b8b65cefe28988ac2a210500000000001976a914e2df08fab5867b25e34a8c9162ca5548d334fe4588ac3e250500000000001976a914168477b97b3f80f53afd668ba450c42c00bb979488ac442f05000000000017a914f80b21e5c3b245002ade430e55898c043201d5d587843b050000000000160014ed65f3b0fd08eeeba208d9ff4c4b5b56326251d5c64505000000000017a9147623d4e7c45588731da2a94c48ecc012f3aa4f5987a54705000000000017a9143287c565427890baf73e1a65113b8f4648a7d252874c4c0500000000001976a91424922347111cc21b8fd3d4254ff612735ede17bb88ac176005000000000017a91437cadf6147122703b7778b867be438fcd3cc0b8687e7630500000000001976a9141742f01848d8265a6765a4bf36bda01fe52f620588ac4a6505000000000017a914d8f32d50c18e6c5ef8ddc3761c22f3c817d8d64487e56705000000000017a91472a9603124bd54b43e882bcf897bb55655a166d7877d6c05000000000017a914a955d8d50ced025827f31c38d0ab93484f3de91a8737730500000000001976a9144688d5217dd2f0bfe626d48248e7875e2402684c88aca29a0500000000001976a914eb9f95583401d3ac5eeef6e25edd9701fa71cad288ac15a40500000000001976a914ba5f0ebcc553e7ac6fcec0b8c11bcdb3940e428b88ac5ec70500000000001976a914b695c33d427716ba065b65189b91e69153cf744288ac7dd50500000000001976a914982ce5da3544933500611b961f4f403162782ccd88ac8aec0500000000001976a914f7a6e8db78fa608ff63ef41a58e55e6f86dee3bf88ace1f705000000000017a9142db486d20d91f3485310dd004e1eaadd7a3fea8b874bff0500000000001976a914ac5f9c581c64f5230b58c0d466363481d322a48488ac0b010600000000001976a914033783d3f3c67e9db805be4c3b3ce2f8c4df4c5988ac2f0406000000000017a9142cff67e152c3c082406162d694b5902d6be80052875e0806000000000017a914378dab1343ed01e949461ea4a6575b88381f4d3087150b0600000000001976a914bd3fab32c88888339fc2aa0c80d82d1a9f40332288ace1300600000000001976a914a0dfd840e9411e574d7576c8e8928d78812903d488ac175c0600000000001976a9143fdc86a707ce04e92d426469ee3fb62646b1845f88ac0d6806000000000017a914c05eea8d916e7bf87657f2277e6e108c495439ad87686b0600000000001976a91400dd4878f29f1cd4c9511a664b60bff209d40e2c88ac37700600000000001976a914bf815f1ae72fee15a6d03fa7dd8e2feeaade22a788ac0b7806000000000017a914f0c7db27b4b4e787fcf6ae41d127b63846019d9e87a78106000000000017a9144f7a14d676ed75a520704440225c11109bceab6787f8b50600000000001976a914e22c5a7f3f3b1f3244f56ab113842cf0ec54b2d088ac22c00600000000001976a914352d5ec31fc5bc97c4c4fe49cffbdf9e03d1bff488ac1fc906000000000017a914440781b5e968ee881a32d0e6b09382e9918752a78749cd0600000000001976a91409a5b67f3eb507bd0d9f7c235710c24feafbe11088acb5d806000000000017a9143a0980621f69d101869a9433707598cf393da20e874a2607000000000017a914fcfaabd3eaaf20863fe93bec2efc6d72375feb1387e13307000000000017a914c156879c50eab1a6f651c50eca3708a56a57b86d87c16d0700000000001976a9141392a00f28cf60c96fdcd90a6a85388a952f901d88acac720700000000001976a91459754c30f906fc7ef084ffac78284c544181caa688ac3cb60700000000001976a9142c0190e32e3e62f05bdabc0e24847e22468f76ab88aca1b807000000000017a9145b0dde6b478304b224f6279b1e30b157e966c1df87ccbf0700000000001976a914588ca945856004ba04ee03d53c6f07c8c5286c1388ac4fd107000000000016001494163da16d468eebbf970a0334e44307c3bcc030afd107000000000017a914a9d0ac1777fedcc17de7805dd685781283ed2ff0875bd80700000000001976a914d4ba62d61b3bfc9b4f694722c0ee2f62d5ed2caa88ac9e3c0800000000001976a914ba769d9656e8065e7c6e8e520c8b8bbd2045882f88ac5e4108000000000017a91435ef0d5761f8384ddf7730d7c13f90799ee8e0e28734440800000000001976a9141a2251821ef48b758035838d03f40031fbfdd83d88acaa610800000000001976a9149788e6445b419637e14537df891ef237d2e6d74988ac088b0800000000001976a91428e9b642c43ed1a44cd13b86d6e1bc3eea5dd37e88ac189a0800000000001976a914f05aebef28c410f9c61fe24c9598ac6f89c0781288ac83b908000000000017a91451cea55be2d84d64c9e80ef0be4340aac5fdecac87c5c70800000000001976a9142edda198075a20e676b6685b047cd6c566a75c6288acc3de08000000000017a914ca8ab7cff91a46d27e80aa9a2c6d26bfd540901787ef120900000000001976a91429172597da212243d1207e75cb71262d2c8583a788ac0428090000000000220020de1a575cfdcc1df6845a7f8cc9d05f3d1394d276debeef67f6e6375dfbf8da4b6a460900000000001976a914af81afc4e49aa17b2ee7b9249edb243adcfc374988acde9209000000000017a9144b3adff7d75f348f0a582c88751e0784fe8f7ff28779ab09000000000017a914062615af41b8be3a34f83d00f30252c3a392c8b18702f60900000000001976a91429777c9539ccd996dd2e2d0cad09da79d21be89488acd91e0a00000000001976a91404111690d82ede20d5a67340be4e91e43569f61188ac8a2b0a00000000001976a91457cafe2e06de1cf598f67ede6d979c003bb29d7688ac61440a000000000017a91462767af7dd80c549dc07589b905956dc1018596687905f0a00000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac2d680a00000000001976a9143c84dd0881e380e300220bebda83e4ed31e3c6cc88ac9dbd0a00000000001976a914fa25c8a1914445919864bf7f95685d0caeb2a5d288aca22d0b00000000001976a9149995dce4861988e2495f473601ad08c07498b05288ac37760b00000000001976a914c878d2b1b13cc2f3fcea363eb6dc3ff3bc75c4e488acd4940b00000000001976a914f084726ee42fd7b4422a5916e1b0795b2799ba2688aca1c60b000000000017a91409335363e0e7a699b7f379ac75473869bc270497870ee60b000000000017a91420b7cae94a681fa31df3e45e67e4ea25377261e987ec3c0c00000000001976a914ac5f9c581c64f5230b58c0d466363481d322a48488ac91530c00000000001976a914bbd61d329a30e7fd9043a5dbfa27531070ecd3a988ac42b20c00000000001976a9142a6589fc2d18a192be7c61b55a9c1dca0211827888ac2dc70c00000000001976a9140d8c661f5d5b84e7693ecb78065afb2ee283806f88ac90cf0c00000000001976a91408adfd83244f21046b0c0e9c15a2489839722ac288acaaf00c00000000001976a91410ac814160df89b0c8a54258c3711eae24ad159288ac1b110d00000000001976a914d72d4045b75964fa36520ea51483ff048c3af78e88ac4ccf0d0000000000160014a1297780871f8aa0c6fd9f5103c3f8e53901796a9edb0d000000000017a914c0142fe1cc79201654a7f3cc83c0cae52336be4e87271c0e000000000017a914514d267a5e66f9f4fe31e169a9d49e4d1484d7bd876a630e00000000001976a914b1cad0df7704dad6ec4d334eb2ff4c2fd0239c4c88ac0ad60e00000000001976a914ab9108624e8afad19e40b0e27d7615bb02c6dca888aca3da0e00000000001976a9147b9f51af1936a5bd87b4b9240e3db7ed7ebdab3388accb710f00000000001600147030f1d25372deec353b883307b87f7b387ff05d7e800f0000000000160014dda2ea0d53345ca0c653002f8b6ab5e020f6f556698a0f00000000001976a914833b0d36ba81b4160d39b78ed65f94b2923cf85488ac21d20f000000000017a914661ecdb980a1ee5b291ef40f4fbe971fe1e602f487c9f110000000000017a9141b6213d953fc753c6718b4a567dc10e5e444180d87284511000000000016001413d351099d471ab1397ef0f52e5146e11584bd9a0048130000000000160014492bc129c96d02138271e00467501bf19adcaf5266b4140000000000160014eb0fa223124bfcd58f743260c798e94113d8c370ad08160000000000160014e24e6273a9e1eefc213bf6159fa1b3a30b0213d5dd2f16000000000017a9143f56432b5cc18a22616013a424cff5ad8726273b870030170000000000160014998130ac4d11fa427c6e4e340b729ae27aab22a946411800000000001976a914975a98cae731ba48b0293b688842cab33b9f3a2e88ac11241900000000001976a9148305ac7e7346e8b518267f9f8a35d2472a09ec6088aca9df1a000000000016001484e8191ae9cfd13045043ff3640c33727cf3819011251c000000000017a91499f56161002842e2b838fdd80fcf03039208d6828794b42000000000001600142e0863d3f876f90d021aea2dcd3f2e8f7c4f861caee5200000000000160014742208935ecddbee5f11fc422bdb805a9b94735707152400000000001976a914a2f8913866eaee66166c5639e8f7a5a6157ca5d788ac13432800000000001976a91492581d67054e8c201d47924e2597040c505657ad88acdb732c00000000001976a91411ee1ffc63af4153235905ebbcf5edabc11fecf888acab272e00000000001976a914eb9605c3a31acbf2a434ac2b259d1f6d2f0f6e7b88ac1d213000000000001976a914fadb60a91c15f64ba46f4db3e98ee17b003e60d488ac34783600000000001976a914ba1cb96786e14da3d0664df4d962771fbfa8925188aca9c43e00000000001600145e8fd79376f2ecfd9b8eca788356fc2c35dd1294d6a04d0000000000160014d0352b5774529578b32ad5c6e60496c0f9ba0f67b4b06900000000001976a9143a1ab9a4bf7db8fc34fac76d6983a846be7230a888ac87c39a00000000001600147e6f8b2cbf01f820eda5091836df5d00d4c604273994ae000000000016001479530dd98be990592b4c57fda9cbf81c3f909b5688aeaf00000000001976a914ddf446d96561df32c98c5c3db80394f283cf982388ac2c03b300000000001976a9143ca04c1f1316d83f7be59af6dcad815ff4c4608f88ac28de0c0100000000160014ddad130bc46a31da741e208985de5a92ab3b60ef02473044022063049ec2c175acfa0fa302e84f11eda715d30de89b06e3cc8f504e2b65ee73680220052d77d9a58637c52f27314bafcc10f5c0dcd254b5054033703b94f4964ba9ca012103f2282e87c0f8ef233dd3db5c49d1561e0706f693b3d0fcce209ad632720d024f02473044022019b0a378d9aaea7cfc1758ca261c5e7ea32a24db07acf405ad17443491d542bf02202181349194911de20abeb43243be422f725549473e2851b6dacf848f41661fd40121038b3ca1b153c88971329374e3617ebaec458548832e666e4d563655557c9638f543a00a000200000000010436578f27848739a57f9e2b3ca8cc51c672789da34934dc9983728ad138a149fe010000006a4730440220441eb3b67a076ab7974a51cefe2ceb6232a945d585271904eaa3b7cc6b3633ab02201d76c8ffb43b819f6cf0bdfb2b9e6c6c7c4554f14f81e8264f9078b4d239f40c012102679a681d9b5bf5c672e0413997762664a17009038674b806bf27dd6b368d9b67feffffff3fb3a4bb1c04cde3f5a8ef6c86e37f97ba49a73991cbcdd2d5cace2216f62fe8010000006a47304402204c54c1e7ddd79477a3d079b6f250a17dbb6f23b6b665fcd635d28847584e617c02203eb0904b473d926b8a7b0561131aa1772822073465ebcfab7210e5bfd501fe30012102679a681d9b5bf5c672e0413997762664a17009038674b806bf27dd6b368d9b67feffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d14300000000feffffffd78042a0463e1a3026b7ab40df0b253b2c8d5b42ecb308753fc7b56795156252000000006b4830450221008e52dd18e2c2767be042e9ae198cc6924a4d65ac1c73987f847e7f5365ddda9c02200e1a03a99f43bd5ae9f5d261f1b888c578041b63ece4051248f144506154e2fe012102679a681d9b5bf5c672e0413997762664a17009038674b806bf27dd6b368d9b67feffffff5052930c00000000001600147aee2735150fc358e7c33307c4935dc604f92d16e1cf00000000000017a914a2a3b79d52b7b8863382017e964ab4c5e6fd45d88708cf00000000000017a914fe3632ed07b200a3674ef5b0674182e63dbcb4ff87b0100200000000001976a914ced0682e5730224787380cf98db7760a88be6af488acd8b797000000000017a914caf0df881198d0585a95aa2a5d382c7659b62b2687979c0a000000000017a91417bb1339a77f9c538f4322ebb1934c1791d01c458798d41000000000001976a914d54370ef64d956155fddf1786861b9e06b329d1d88acd8b797000000000017a914e20c3ee193484d1fd2c8a0dfe1f1dc4d671c696a87d0a108000000000017a91467b33eb974d52c0b4afbe55443801e16fd960cdd87c36f0200000000001976a9141e2c5f7608da8fc3e3703bd201a35b9eb87dc92488ac9edc050000000000160014e199cdc887c0c511e7998aa94ea8d86e4162d21f64d00000000000001976a914be52995e33b6e500fa7a73b9410899b7fea3b1d988ac00e40700000000001976a9141d0f309fb10d1842f83e3cabc2bf732d87257cee88ac0eb20200000000001976a914da636a757c5c12e12c54ef85699c253d4fb352af88ac608222000000000017a9141707c480137a1533b15e14ec0048be953c25dd618784990200000000001976a9141ffc54c47588f1663f2e9112969f2ad5c0c7954688ac8863bd01000000001976a914c7080a2bf93f9f2b98c8aa02856876aee2d0503488acf59218000000000016001444a86f735769e7fa2279c5c18307627736af6ba75a2b0c000000000017a9142612c4bc7af333984a557e52bb843dedb098643487f79c0c00000000001976a914011ed96d6418f83952e1c2598e3d708d770f8a3688ac4adf54000000000016001450fe741e664a8d70f74bf3abada197d16628606ee8fd00000000000017a9141324d21325ed67d9a4f0ce46bdc29ce56024c0948770e90a0000000000160014748bc44fcadf5720941ee6ce5c03a7935a1fdd90443e0a00000000001600142eb465132747f420b8912618aa21d7c0901ba90e02726200000000001600148190856e47d9760e9e766784510a2026b0fcf076bd6d42000000000017a914c992e22be4e24770d0fd7fe023993a5159ec86c28787b9fe020000000017a9146fe721a30d7ca19932a82190914f634982225c5887551508000000000017a9147aebb87fadb1ec83139780844ce30b1b267a114e87e7e61f00000000001600149ba5aca6c4820e57eb07191ebc9c2b13a4bed1ff48ebaa000000000017a914d55f6794216ff1946b55979cbf60b5c270a5c94187288e03000000000016001470f53374f86e8cd4b05b2fb3ac96dd80549fb59a44b49500000000001600147a064fb2f9c35d74f356b731b72c260dff79a5e4402414000000000017a914963e54afc9d373f8770100765efcd937d300212e876a781200000000001600148912549bfa001309efbe4303c58d80ae5e507e26ab200c00000000001976a9141007d860b88bb0709f32987a1786cddad1fbd35188ac33ab09000000000017a914d910283423a68c19d8f49c2a0c9129f1f84aa947876dae030000000000160014854e516735b7b0b80a6f53d1f23267643ff5cd8f86e1bf000000000017a914ffbe424a5f4310ae1ac8bf3a051642c617673a80878a6707000000000017a914aa7c744fadcd76ac9a0d2d54161769d38a7a07a8872998580000000000160014d876986da098d531894072e0115f68efb7eca14afef118000000000017a91427b2e4fb0cace2d3a1b39da3d6ce7c71622d23fe87e6ea2400000000001976a9143e4bd4e4f686c3b41b6dbd27dbc509b1cfd0097a88ac6b475300000000001976a914388fb0634f8f56d4f6602b40fac1494d5a9ac32d88ac8edb06000000000016001434447058bbe0369b5ac43374d10eaba6499095aa98e405000000000017a914656b83f60c62dfebb3da783360975ef93ba4ec5987c5240300000000001600143505890ed97dfc6db5cfd3865ce8cdcee75e10e51d56460000000000160014d24ce9bc709783453c34114b57cc76e53b2eca94acdb0500000000001976a914a0935d65f0e04467be242371441dc23770419c2c88ac989f040000000000160014597d1a8ac8c2f9fa78822a351fc08b39e85e39d17944020000000000160014397aa673aa15e1a05b3c727247151574b7874e8a7837c6110000000017a914a8a628ceccb5286b6cd746e7a71e95f3ad4fb5d8875a29030000000000160014a2354e6060b0ee9f52ff32a2eff702dbe3c009d333d00000000000001976a914843c557d1b5bb3f0b5e37bb1d56d0b59d75167c888ac0e640600000000001600144b26ddafd5c98532a2ca20c70f41130ef5b9fe33b6d00000000000001976a914b3aa4a8d87d4a1ec7ce4fefecdf88150b5663a3a88acc3c91300000000001600142c810c4be90e7ad02875ebe7ae94f3c7e21901b3e0f411000000000017a914754b953ba7300d92c7340edadaac5451ee35f66787a4c72400000000001976a91497e406ab683dbcc7d35cf1569ce36946a8fc4f5d88ac9cedd702000000001976a91452523a7a5c408ec5ee8c1599463a0c40900feac688ac402306000000000017a914993a2b812b913a0033b8f909f70d4de86b06881c87091f3a000000000017a91490be4aaee21030bdd63336f9527446da32f6188487fed504000000000017a914cc431a0e78988213432443945654aa4d89a2201887982e0200000000001600140eeb18875dfba340a1355718b4f215180ee33158664a08000000000017a914c8f767feb7ba630ce54da94740c4319d143aad9a8710be04000000000017a914f8c4eedeb635bdeea2d9c46a8c8893947f723db287dc4d0e000000000017a91434511bdc680b1500238fc2a453ba65be77265a618771581100000000001976a914d439c22e12f8c89f99916d4c75c7365f146e4b4188ac3072ae00000000001976a914ff392751dece9a3d0f51c02d38a492afd912e8b488ac158a0700000000001976a914fbf971d7a4b151d5501af508d611fd62f16d4b9e88acd8187f000000000017a914e647d8cf5fd32c6b3965641c29d309c2c0b1172c871b8305000000000017a9141dfd48b808174de759d0a02a4bdc7ac974b1acb98798630e0000000000160014273556fd519eddb24e405802ad963aedbd47b97f58050b540200000017a9140b70dd85f1cf00691113ee0de7a891da5fd6302587d4d1210000000000160014190ead80682d51021a6fa33f1993013394ea533509601a00000000001976a9148d76d6e58e8efbaa2f2c2164df33f867ca3c8c8e88ac9dd2ff000000000017a914149a1f4a58da75ade497ef33f2d97cab4f7273e48777b43d000000000017a9142a916f580a3992f7c5973c2ac2f9adb2e9505eae87f9ce35000000000016001422a286f55b66fa9af4195efdd972e4aace19cd4698630e00000000001600145714819d85c7d3f7064e2a5aefb3615aac35369d20d910000000000017a914a13e2ffdd028eb81e4e77bdc6b4d47136ec3f3d787000002483045022100a6ae5f1533d1c85c08a0c4c11244468be6a986e0cb42818b52420e5944fc00f3022074f7416c0606fe81dd659ef65642e5cdc173311f925170470f9c3c9cf5b42985012103900be0ceb28a6cf773a6a4f3e82251278738dcb19c67897fd804ea868527473d0049a00a0001000000000101bf9f7c57f599367be30cf3fa614a8cbe7f6455c7ecb86b987515704e7eaba8010100000000ffffffff02c0d8a70000000000160014e36c9ce406d8e91f49e4549c7f39a591a8bbc1700c06080000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220389b9a07d85daf1170572a9a479690d3fa215086d9e4d6a7b3b701b6ed325be002201a5d45277c7530872cacce773f11c6f92b1ec453c02772843710f8df358e303a014730440220335025cd4fe8268a33530d5561893dca632f5e4d343c156416835ea809489bc10220378834f16e6384fadef5c47b254fe8992e587338228ae46bbcd2ecd6f0fba36b016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae000000000100000000010180ecada3c77c63ae434576250692d12524a45cfb0389d03844641673da0bd179010000002322002037205ff40fd9d18e22f545a39dacef8513bebfac0a3e3039165c28f9d4d12496ffffffff027129080000000000160014ae8cde8eb0da5b67dbb63b833be4b8425c12448b0f0a27090000000017a9145382e9cfff425e046ad5c70427f1b152b63c621e870400483045022100874e7a27febfb52169f9d34bb02fd6d09a54e9be7e97455b6dfde8ea73cf9397022010ed7c143b98f40d8fec9f66322105e0d71dd8f5c87b1b67d63f0b29712047e9014730440220370cd6c3e583183bd1cf115987ebd6e144fa401fd4fa384abd6c15cdf5dc83b20220538989cbcd3d95641ff6f0e6f279129fef2c83ec749d52ed677f9d001e9172b701695221038e143e5cdfe85dfa2201eb0a38f09aa700024a8a9711808ead07fc779103d3bf210320d0ef8ab1c32b1fa8170a71185621495c9cb72d461191b05cd3afb46515f8c32102c434d73bfc1e1c027ddde70ef22ed46d3e1d1ce3e8582ba786d27409f0aacc9853ae49a00a0002000000000101b2354b2c6bbe721d035a167fc0f853bf7a67ebe36e32143f964063e1ca8ff5c70000000000ffffffff01d1a20600000000001976a9141e2b8b4a148085251494456a8c4e9dcc8f6c0fbd88ac0247304402206d028579fb306bcee05a44a7c5bb6caea1d7e7b2195771d0a37f7465659701d402205c30877d86426cf5694127009ea5198718c6e04e058794a855816a405beb1c3a012103fa97076a04428b96f746da3a124af796ddad747726d3d8471c4010615f32e8a3000000000100000000010153107d1e3a7efcbb3c04da98a8fed511a28fd7637d9d57fd28c403b1519ed54a0f00000023220020a9b3e204932baded1d27edb2ad78d504f3b6572d22056564f89c135ef1ea298effffffff0118610400000000001976a9147dd3ba90f69799efd83e20a33ee3fd64005bd08b88ac0400483045022100f5ea944c97c7fe05bd0e4acda0fb7d6620909214fcd00222210a01a2a975ebad0220117e2ed8bd5c459366526441887920a1ce592d1af566e0e21ce974d1874f40520147304402201be379ada68c34e5c058882cfeabf9b8134fe949edc6cccf9c2485ee1c09337b022028b18653e5531310b6f12ead6e7e0231e3faa8c82ef7557c7b9cbc16aa4aab700169522102fb8ddda90946cb071f6a4bc6a2747bbb206a7367bd305153baf5f78e87f6b5e02102656d2c55f4e93367619663f3a3583aa93fc96f748419f61ad4eb8793d9db3c342103e4d88ea6d24a595f0e8bed60a0b8464f560ef2c352078ad4f1d448c31ae1b73153ae49a00a000200000000010166af80a61e2a8b5921c7ac1735e58aef025588742b327050dde5b43934c1f65c0100000017160014f2276c0c90849a0194ad8e7aca1ffd93cbf59276ffffffff02c4a40f000000000017a91404d712ec9d063d487540c66a4c7c8f80f482a99287f478fa040000000017a914e13c7ce6c3abac39a15eb96dd18eada1e9ea713b8702473044022017db9a51932b578530ff509fc0d5575db560e951c7cc4d4b4f7efb32600cdb6802205569cd2281f0163f7e6868127914335243a73132d63ba6ba3169ff672bff152f012102f7a3f8538447a3d72275e483e832c112dd89642a2e801bb6d8bcd1e67d7c35800000000001000000000101ec4d035b67ffcd934f53798f6f6ba10f7663ff73189231481011409bcf0c2f3b0100000000ffffffff02de5f02000000000017a91448aae9a0efe8c626a0e129874ccbafbb8c67535887e6d6030000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d040047304402201c4113f15e83f98495f42dad29258e53582295fad29a5f3528db58115ca0efd302202aabb520a892a7ab61a8beee181b7abf80c64088644121c25e4be663aee409090147304402201cc6899edd3527f2f98dcfd1ff4dc51273772d76ac3aa9f0d54549ed6268fdab02205e0004effbc3346bb28a6a736a74e9f64921c8c41bbccd44d9aca0f9d14d37f3016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000010000000001011dac062bd305d19d98d3a25753aea7339e5c27ef0d81204969b8ff7b7451576b0100000000ffffffff0218ad21000000000017a914ee71a6e7acd610232dc08b1d5fab31a0819cb172874915090000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d040047304402206678d8b10c12c17adfb373a8552f1c5b85a6cd8284ab90dc376482ec933b9a9c022040a428a76d45e6708f669c5dda0616254c778da929660ddec13ed1057a8680f60147304402202153c9e48f7c40c7042989a711b4ca4f48b0442c2a4c86f66e03d314f0da6c65022002406ed09e33c28aa1e08472a7e3971b50783f4c025043ec679065a66c53813e016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae0000000002000000000101cd5d3f255252bd379ddee9a09e4f0fc1986f983c7b3db19a1c2f3760bd88b7960100000000ffffffff02ec0e0500000000001976a914e7dbbcc7935c5973f0a9fde4140f92a71843068c88acd2bb2900000000001600143bae0dcbf64a70df21dc733120a770f8bc2ac3a6024730440220175ad894c98bbb5fafb537554536b1a375aa4188472f0be36f64c84b2bd2a4b7022038fb530de50b1fa04937df574c2f1d021caf86ce75dd0970187e0f6570a508b9012103f952d6d96898fca520170a850e921bb9d7b65a7c8ed65749dbc2453513c1904a00000000010000000001016e8f122d4fae4be30fb63806836274f4cd8396cb051457e3d85dea88fc737bc90100000000ffffffff0230570500000000001976a91441cf11cf47063228c4b3b381ec4f021d2f6c1b2288acd11f0e0000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d0400473044022063ee072e7073ad7c3a56000135ea0d43154fc80138e5bb1153c22b9d5e3cbdd902207a1406de083c2d21b8b1c7f6c936567167417b66bf0c739b4270db158ff7c0670147304402206997bda9457181d3c18e634b3cd4c0c9a10dc4b5018dab977c025290dd22a4f902201542c3093a54e11b2573fad5d86dfd0ccfd81912d8e0e00d38ba446a6bcf85d4016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae0000000002000000000104bcedbf2c663f1a8bb27bd47acc1da0b92c2e958f0c0cf3143c9c2aa3717d399d010000006a4730440220380d89e87d84ab1a4b6f991dc76ccd0680f0c651f2087dc41ec6f67cc05cbbae02206a481566a705e700d34f91f06a406829a1c184fe54792b4309efde76dbf069e401210354a717387ef727da545b75b9b8c68706275d0fd52f4465ce8b98533b10a94652ffffffffcd5758c17002025bf2513831e734b17645504881bc94f54f59b6a7b7b87937e9020000006a4730440220122c32557d8c43f6bd2bc488d43f53afc4f0c43bca9c72fcd3ca176cc29fc07f02204d19b40c834a55f2d9ea6dbf7da9f435843d1961630f30aab990fd70226f7cf7012103786af4b32017ec640dba2d2a7e1fd5aa4a231a658e4cbc114d51c031576e19bcffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be412c000000171600144d5d47964bc0e2f9c5528541346ecb93ff371b9affffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be4128000000171600148c329b7b32e5daeea901515703a977b43140057effffffff0256443d0000000000160014eaaf77394221a5f22e733cc7017a2d9200ebe975dbd3bbaa000000001976a914cebb2851a9c7cfe2582c12ecaf7f3ff4383d1dc088ac00000247304402202a0e6afd246e00704257d7bd18ffffa45dd06ea5fcd60274471a858079b1672a02201b342393ace6403eeaf937b66fffb514c11182758480589176fabb84c92257af01210330d84ba8d5edadeee4c6034874de1eeae0a15f28d2d32755e78b8a548aa10fd50247304402203dfac08358b218ab6c7b91a0ff1b5ef04e13e9f542237cb7b840d4bc90a286aa02206666f486fb8086c087db1d552068555564df99ab691397528a30811f174f3fbd012102864954fc14ec43ab44b5fe483170bc3227e2d5eb668f3fe8e128952a0d6a07b400000000020000000001051d7d4e00009cd166963457c0740cdcb9ef70fa3f74a15cfd0e4f1e37065af7940100000017160014caa2f7ea37330035bb15809178342a933278a9e7feffffff6f3344e334640447ced6f09110e438ee24235dc91fe71797427d102eb2977e950100000017160014afcf6b05a16ed251417313263e15286a2d740b8dfeffffff53bb5d5629cda95ede300e6552b8a078eb0b63a242ed98812cbea48b32ff31020000000017160014417c3c266cc1e383221106e5623e777799463872fefffffffe52ae9be2158c922bb9f969488ebde62f809c36a7bd75725d7d41f6705ecfc31600000017160014734eefb20e1992f4e22ebac1e3864104d579054afeffffff7707dc07b6f1268b3889234066e8dc25e1cdb47b9ed5c4a523cafb1b6a3baee00000000000feffffff0190b0ea0b00000000160014704989c7095ffdf66886f4d42c0507461a7121a80247304402203a2e8c725ba0fd90b41d9a9b3c1ec64906d80d24468140a799817dd8b1e9aa50022025d9762ca723da13eb20ad687321df72dc503822ff3b4c30f3d5f68bd3ec1cef0121031c0523297d8d7f5d4584b50c2b0ea38f2b3fb68e496c31b25a215c781561bbf502473044022004e2503469ba1d14c36a9fcb3205de52bbab98ff527247f240d07dcf5682a1250220237ca27e19148fd16c6e3a48b85c1f85e97f5829c12925a554b23cba6b202438012102fd1d41eabf4603be13c28bbeaab6263b162e84c24540c89251c2ebb385d498190247304402204fb221ecef10755b0da1de32614596b49da1d5479392b125ec0615da3978816a022021e5d268ea305d81757974cebd0866667df7e13a3ca559667384ebd008c6d425012102014446cb9817e0d17399490e22192bb50f42aea4de65cffcb35f2fb2fd23e01b0247304402204ef18dfc55f321367ba3ad33c80798bb8dc5a1a7fc64e6dce07ff7e9ee0249300220653738ec6e28a6191bb9e2b65f62caad842b82f8170ac1d127a34241edc7fc8e0121028ba43a00095018151765a6a71b19d1bc63bcde905c7a3a8b037916eaaadb1c3b0247304402201f9fc093d8658c104f3c1918439ec2827d30441dfdf4008382ba2e7fd7471b9c022065a68b37e0c5c636d8d3072dce5b9d8a0511108ac9312114ad8504a3d2724b8901210394d6effc2802d0d0f37b0cc5fcaf5191318c386a90d36ee15c4303aacc5f96b433a00a0002000000000101bdbde8ab5b3bdd52961749999f1990825824e0da02391334f34a7d67b7608de2040000001716001484e8faadbe077334141913e58e0f958620c2cd37ffffffff02b69e2100000000001600142298c629632a36ed177fce910179b419f2e2cde23b570d00000000001600143bae0dcbf64a70df21dc733120a770f8bc2ac3a602473044022005817f92051c757e2a1fcdec738d3c6917cae75fbbed32f8fe3d34fd13b4d98002205fef57722b266b5036d8e82984f123180b1d11ba95bbd561f0b466be7fc876bf012103cf444cec43c6d0a025825ac2875aabccb14acde4af658fc249549a14f03112b6000000000200000000010142430ea75922e3bf46d072ddad883b1d840dbcb71cb3056634194ed3065f5b910300000017160014a2ccc4b8e58c2134bc199ddd31e9df9cb7a7c485ffffffff02586808000000000017a9149c2da6da05cc08f95e5cc232a8fc17cfe311da9f87998d2600000000001600143bae0dcbf64a70df21dc733120a770f8bc2ac3a602473044022062cc3cafeede967cfcab231b06b839b778b14f1048f77ec9ff34be6ab41d33d502207bea1cdf85d343bd3f083077a16c6cdfd52bedf18a81f76931ae9c6f2a39db1d012102db44d6c264582e8d85717bc70db34cecb17703c596a2c43e8a0646f18edc02a900000000010000000001012af8a917584cd42407fe8fb2d335402f0632e8d196145d7ca18af20902a57f7b0100000000ffffffff03089d320000000000160014c934d9ea8a2c7bfae2483ff8f36bb5b3edc7c43a4e0def0b000000001976a914c7b82ffeea2f53231133e358a82d6fe4e46de41788ac32b4b00300000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d0400473044022023cdda12deeb5c80a33d4df1a21069ef94923714c48e6df58564a874f05e399e0220437da16d791189bb3c1364a70a37f5999890672aa1337a2dcf09e68ff31ac21101473044022056652a673de1cdfb7768df16a55fe6586ba374cd8bb135798545d2903545112502204d3d355fdf3b9885bb521ae5f7f1dce06d5e89a6206a3a7ac0ddc713869c0ea6016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae0000000002000000000101d8aaf85d723870fcc2f76c2b73c08508cdb3facf29974e4e652ec7995e86c70c0500000000fdffffff04900f0600000000001976a914fe336f7979270e99b7ddc4ec457ce9c18376ca7988ac003e0d00000000001976a914de24b2f53f78cd5f0bfd90c61a801b4e5ecbc8e588ac09d520000000000017a9148f6ac613d5d2b899c8da3ec4e8fd01a115902f6787272b6c1f00000000160014f60834ef165253c571b11ce9fa74e46692fc5ec102483045022100e0359a557e57e31d3316435959b52b6683079f5a175f59c02fbc7db07a0f238702207897ad4d66e20b17199a6599a1bfe9aafdca1498ea58491726182fcf75542e820121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea28600000000020000000001015d755b0ee0a8d0d108e1f4bf349dc929d56e21390197736683b94615e46252ed0400000000fdffffff0520e63a0000000000160014a16fa4063ef239f55e8ace54a38542ebe697b518b01e0400000000001976a914bb7bbde09fab28ca44859444f2ee20942c86ed0c88acba5c1300000000001976a914d302c6beac9f5930bf1c7a0549d0e8ffcd47c88088ac80f52000000000001976a914c6f57031b8bd6d36c00f1dc45065db73ee623c5a88ac68b7882800000000160014f60834ef165253c571b11ce9fa74e46692fc5ec102483045022100c7556a49dad20b3ce46ce192efcc842771497731b4da035db798f50940fe00c902204dc9857d207d80192c54be5ca343c5cbe53dad3e9c08f06dfc30c37cc8e78b280121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea28600000000020000000001016e7c0b3093af46d3b149c0d829f57d2efc1a5d8ecc0f5443983a5da44c983a160400000000fdffffff0640f15a00000000001976a9140832ce694ca91765bb6624fdfe42507f024461c288ac98bd2c00000000001976a91475e44ead420603ee8eb2fb3129837bc1529f968188ace88a2800000000001976a914d2a1e068a2a5acb9a2b4e1d23f9b6642c9958cbd88acb0c412000000000017a9148e52d561db36bd51ee2434f02d1d16b8ce42c06487808b0800000000001976a91487a6de414400cc444dd3ab08a5d4c998ea59145888ac49a2a30100000000160014f60834ef165253c571b11ce9fa74e46692fc5ec1024830450221008e46816b571d95391756a52cb7cf0ecee79b75943448ebaad4ccb85f30baad740220648e91ccc7549800dd4d3c32a77fdf6eedca34d3949a4af2828351c0e872396c0121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea2860000000002000000000101d3184ed3998de34567e10f62706e792be3cab457b9e510462a401aa0884010110300000000fdffffff09a2c70400000000001976a914304a7363f95a740acd8b38f35388f238c5cdf04f88ac81cf26000000000017a914760bc9dcd34eec2a4e03eb67119f6f33fb3115b68793110800000000001976a914568db02e9c77c63c599d5dcd6600f31a56c3504a88ac900204000000000017a9147658974ccd812cbc09ed9f970dd214c1e89c61e987b01e0400000000001976a91495e71d625dc9510eca1f7a966ebf5195202da2c488acd06c0400000000001976a914ed79233c393abb845b2ff3b13b333fa7f19e946d88ace1ff0e000000000017a9145ce377bf850a5e4e00b38f1a834d127d6762705e8740d10c00000000001976a914be1d05cca46461a7e16986245797584bee0857b088ac433d4f3500000000160014f60834ef165253c571b11ce9fa74e46692fc5ec10248304502210095d448d56e703933bf7f6dc74675210f9c843561a47ebb15e60661dc07e7e4cc022054c7ddc4c40c2ae2f46a96fb9d51209fa8f7c47396c13023f3b3d9c6e03305990121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea286000000000100000001922cbbdaa76e21edb496639686e49918f17493fea03de85c1808ca414330bc2e010000008a473044022060d8c134818d1da83a299ada1bd4658905eca2cc7c095571f12f08551374d82602203fd3fa1b7861ae6eac07e1bc777d6a64153d00ebe581690a9db9bf8db79677a601410471a501557ead06cdf048f80dc80e0516bf1bdd7b91d5d5e04b857a62d32a330d575d9fd0bfd7a8458ee4e9e00490077f2b7d4c4fe061dd4c17c4e4ad982ba91fffffffff02538326000000000017a91451e23c289b0254c8e0b33944307b48c096df91a787b1c49f0e000000001976a914746729443d0a2f44baa00d7332e864f9a57cff3688ac000000000100000001867d8c4288eb21b506b8467705fc9b3a0e90bbfc5287082bd5e4e98aa566f63d010000008b483045022100c5686858676387ac5e6fa971ecc16657749820152300237537b5a043a8e4838a0220066d93513f8d75442d13bf75fd9ea8e023e050c7afeea318bc68c45b2ac3ff3c0141049ed7987c82d4d685165b19d546e11bec20a503278deac4947a7c9bf77aa53e6b83572170d8fe901b90ffd3c58a1cf70db09f450f6c95d9c5dfb1c4f460feb252ffffffff029253a603000000001600142e4696cb4efd9af304eaa76d0ec04ae6268c8e35e356d21a010000001976a914e73caa467bfbec57ea9d32d21fd2fc73e5b144db88ac0000000002000000018aae0104e5e67f65f3f0475903d157b9aa2e96f8ecaa58db59c9a5ca1e5598cb000000006b483045022100d254d4f58ef5b790551ded1bdfe466b3e27187b2cd9c8449dc29c846ce4471da0220397f29e666f44c9338b036530ef4db4c48d8f981b76be34d36ba187869f6413f01210399e27865c2d146e8d91aa21bde2ad7e35f7efb9a5ae479552bd6c6382e60ce69fdffffff013d925501000000001976a9146945a4368f2c24025ae9a23534e0f4aa4a6dda4088ac0000000001000000000102ad59ca550eefd52178783d29b327f64b455cd684eaf65fd400b86096f398a6cf010000002322002096fcf6f954ca062a60390d53cc000f301592c8c3298686d679d9ba6df0b97113ffffffff3b29a6cdd8cca3c89716612d6a8e5d460994382b834e0cef0f3b420a9c51b27b0100000023220020af51c28dd0564e18c2a41e8d61c33d213398e5ec8dac1a7392d6424d8e040184ffffffff028d150c010000000017a9140553485d8abc3c7801e5304c4974b6d85934412a872087b200000000001976a91434bfea8eecc14529c9b2ebaebd9e18d54e9ac96088ac04004730440220776e4a5476fbf14c2f74bf8dbad1c9795c3195aba9448a2eb7d3c373e5db7ab40220046b31188f6460726daca647f1dbd1d14cf1fc82eb7278257ecbdeb503502e220147304402200ab0ee3b57838c6a80aa278335d4a31f3bdcc8fa8c26fb71caa038e10ed8ae6702200c2c77da3c06af6fc81ed39065cc08ae4383a9ca2c722d06b9de025cf7cd18540169522103a7d5a04da4c3edc97d82a6f7807477f9eca741b3891c4fdf48b60590d58fb81b210234f27d9db08db9e7d795482fd62a9721e18db8eccb3a86103f2f904afc18fdbc21026391ea987f2d9df99cb950568957430ef2c5d7c214c2f97828e08390f42c2af253ae0400473044022053c4ccff1fa30b3ddcc6bc4227e8f16c7851bc481c57024f0fef841ee4c4a3200220741724e89cee0e38736b77a529d5cb5efe37dd4ccd95c601c16f3cf8e6183b0a014730440220269b15db3913dd2d492e12bcef77405f9acb56fc39f98effbeffe690a2f3b9c802200dfd87d64a8dfd7a3be2723e263ce5669ad0c73ed91259539ece6edf2ede79e4016952210323956004a1a066f5d82ee6bd9529afb8a8e665788d12d4983884e159806ed4b12102875506ac7145e4f478b6b49a798b8de21b9ad9ae864fcefc897343f0932b72b821038d05931d4b0d4686a9f9dd6c3d1f72e6764d4fc9d0332a90ce3e9fd36eee0be553ae000000000200000000010144f62bc350ec06328f2d9cc495d504b2c30909002c0f2a007353f6fa1c27762f0000000000fdffffff02e8a2060000000000160014c2da901a7482e87d1a1bc680822a60449e9aaae7eb6400000000000017a9146fec08d6a8187e8b6e11d2dd7950392b0917f8f88702473044022005ef3bcd5a49788d5fdce3c59f0cdf9204cda4b20fb765e46a93872011b09bf3022028670dbb3593604e6735eea9fd57cb6b6e286d2e775188277b4327d9e497be6901210356b5fb8f3981c180ef83f4427e99156b52580daf7ebd3a86189738075ed1e8180000000001000000000102e303de16a21875091a01c0a2a27f4274db52f87b00e59b5ec4ffeb961ef4b3280000000000ffffffffcdf534788eeae0f52d8460fcd8c22c8a006e73c26ad8798a600265940e99d7b80000000000ffffffff0187a5010d0000000016001408162a8ea44f38cc706229bcbdab22504a28c9fa02483045022100a859a42b8944abb7b87f7fd8081cefbd517dc72578bc12edc5e6a488d0c0823002207677b04725d57506fb0a60197f3801983a388d48149d8340f86006897c7846c50121028e52958648ee79f16a181be180ddbe92433e218cb1953db67f217021b56a46120248304502210089ade5be538d126cddc2b7033b711cd5250cff17591cbbcf4240989d1e99c83a02207f40aed0db2186b6b4c28d49706f21ba8ac3228ea289f5314ab3465e2825f2f40121028e52958648ee79f16a181be180ddbe92433e218cb1953db67f217021b56a4612000000000200000001e2e07959f32c6df94bc3440f790c31d5961816132c3e897930eb639e54f229df000000006b4830450221009e8956a94960accee69aa8448973d95c29f869f41665dd43f58d889c4b74ffc2022001c56184fb7b4ac2906a736b48e822ea80714aa84c81aef2d70f2261213ba191012102b5898dfd2f24c7516ad2db78f116a93e1c278f06f683cb84a51da2a532efbe65ffffffff02801a0600000000001976a914678649609ce22070769ef28bea4979d2c03a8b7d88acead80000000000001976a914e3c82ac4f166bd5078cb89e8f9c61c6297cf5d9288ac000000000100000001864dfa44a2e12eb6b97800fd7a1f73d55104eda6323cc73d1f4978064798fce7030000006b483045022100d9f4e57cc658cd0dd3edbaa290c912d86341f572feafa89be4d801b52dce8b1a02200d5701bb1d9ae728a24ababeeb01dfe3dc03f1091906563915a7b3ff8918a50101210229701969946ca7ac28d36dc19df6995e0921005a85afb9683b8e0a19857bc2c9fdffffff040000000000000000536a4c5058325bb74a32f7722cbd9208d8f52faf216e2fcd3414758a67ff88faa902612495275292bff891b294d6004d49ba49402ba98549a565beadb0df28bbb901782214d83f000aa04900dc000a89f3005803400d03000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87400d03000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d870ab4280e000000001976a914e93c2d0a87c2fd559255b8e08da7c114d431add688ac0000000001000000013c19a4c875c4bab3ac4eed79f9a9431ddfbe12943ca8da783ad036c3adbd7726000000006a473044022005d2b49ac5446bdef62401c45270ed2283699a9ee5c0d19bfcd4c30c9e23eb4f0220152bbe382662995e2ca5c98683e90aac51e4d0c33066b480104b2aa48e0284c601210292e041b7e52685bf5bf8ac33b3dbfdd8a398bda81a3d0361559e5e8b83faf58ff0ffffff02a5e3700100000000160014e3d2de18214c300d91367fd4eb3cacbc386fabf41e300c000000000017a9147623a6508a8f6008e6bb818d27f49d0430932b1087000000000100000002228b6c478784a2f4dbe586bf9d9aeb1d4aba4a9ebe4fa84f07d0de866c4abe94070000006a473044022017e256695e47cca574c337e340415e50ee09c319ef86ed3bf607a631daa3adda02202bf38d6894a663de72866dedff0d8c5859b59ac7557eb24194b258e3a93be120012102000f662a978242d43afd72cb31b0397d34103909fcb3c53559cfd231336ddb30f0ffffff254af9bdf9b30abbd1a447f304ff372b87daa582a8ac5eb3bc12b2b23dbfbafa040000006a47304402200dadb611072504488190132eb3c3951125fe679df765765ce0a3d32f7d5cadf202204a4f4f8ac02fa45c10534501b5dd2ae72c9703a898ccef9d5c5eb55952bea6c6012102f3e3f09effeab69ed4e3ffab8889933adfa93c76bfa8304f02b91f8e19091a11f0ffffff0264a6790100000000160014e3d2de18214c300d91367fd4eb3cacbc386fabf46cd415010000000017a9147623a6508a8f6008e6bb818d27f49d0430932b1087000000000100000001202c247df5053b4e91b618e940b4b61a809547b01f8279577003d528f64a7b3f010000008a47304402207e39ed649bab16490ed0e8256af7e3951f3735dd9030c29554aec281c8e2ab7302206f6b9884eef21165b3331a1a701c7f8de17b0b6ca1efd98db0586f163dd3e195014104872b3e9bb3bb84b2e3dc96393f7ba7cb4f58e6ade33ca46e043b8790e914485a5981c41f9209cf02567bec8539eea5423d8d608d88d2afa9e7361ecc545a0e2fffffffff075fc6010000000000160014e6652f92a2292c2b0061d89ab6f49fdd7cf56372196a22000000000017a9149b14dc90412178d626084ddc1a62a6a8333ad20f87734d01000000000017a914e9f82639ade638c1d89f74f0200ad3fab2cedfd887fd281d00000000001976a914cdf56fc93e0bccb763c7a09606e8b8a1d136d38e88ac48ac0000000000001976a9140c86c7de59ccb4262a32f89550c224eb24b723dc88acb5700900000000001976a9144e9c294e8007c197c376e4c33bf2286c6c9ed95e88aca241921c000000001976a9147e82a3aab30a85909b7eac3277a59f9dcc87bafa88ac000000000100000000010145a2911f44264cffbdfc5888a6d084d2f9bbe3065115039ffd106799e01935c70100000000ffffffff0248ee00000000000017a9140020763448eb6ae7d5c414bb832caf0d73e062728746db020000000000160014c7e8f8d7709b1fe8a288a9ff990a1f6a9e6e5b960247304402200b3247d61de1e71fc8c2c8522e7b3fe8f03782db30fc1c6d401a6c98cfdb45cc02202ef8f4bd820f1895435da8bde71648d204774a8c17f734b7de236a293e2a0242012103436a7574f3fd3a497717483dc8e672cdd38b4d9964f5b9989043173859767f1600000000010000000001010b5645e32fe6af894537405e0361e48f73527999b3b5208d1eadf0d828c73f470700000000ffffffff0280fc0a000000000017a9141e9e40508f813cde964a0eed9dbe1407a036374d87ac980c000000000016001491bc1921f90ee35749672454a87c6e9cd1599b8202483045022100c9cc16d844f2f1d8853f630062fe0d7e415b72f2d2a5b7f4b38aec97afda2aa8022007a27198bfbd40598126d9f85ed1345d5769a73fa181eeed10636606708f272301210236275d73c8fb27f3b2e78f25b4399c2a3fb483fd37d464db5587857787371971000000000200000001105fff9587b91d20eeea71c2857bc7bc49a34002ccebae17f40c3070e3db3ba1010000006b483045022100a54f0e753da1fe738d543ed18c291310f117ee42b6127c623404a5986f297e94022043b174bcacde62f5c479a17aef95467504e007099d0d885ca812a55243c53d4b01210325e4e07ca7ba1c8a7b0279277d81675bb07d9c62c69fa019ed0f57781a179e8cffffffff01a7a77802000000001976a91426f2477dcced3a202dffddf23ffac6a3d31d472988ac000000000100000000010b5bb15d52da481b2cf5e5bbca59549d0df79debabbb8e1a3fb1200c74841898a00b00000000ffffffffcad31a3edb37b3a27e0dfef5792be38292ad7f5fe2a4d11be6b9c6c34b7813030000000000ffffffff098a6ba0dc6293c048a657a290d6c04f616ade41c7fa48cfa365de7294fbf3610200000000ffffffffd4e28be769347473714b24c48bced7048a1b75c055831fabe528d185886acef40100000000ffffffff0b871cf6c272bff09313570731789285206ae67f6e43bbcac319817b3e5bbad00300000000ffffffff0fcc569d324d26e6ef02cfbc07c77470a70d6db578402d3ed5aa0c2a6e0532460000000000ffffffff7d65f370af4045bcc37f20a964b42a906f0c6bf9ef85d5e88af49563f6c499ae0100000000ffffffff5ebbf62171116eafcdf284adac75ed560b97f8859216b8e7271fd9351be40dd82d00000000ffffffff59e85bcadefb1afda1a1461e21e694f71c77b7afe5a3632cc504ad4c4523c512340000008b483045022100e5b9b7ef3e361c6e85fae333ada3756b068b55b1e2ea68a123fe382513f666e602203557bff37082511054cd28a8f9f42253191f65c9fcaebd9dfc30e992320cae1e0141040152b1c8752e261ec48fb288f26f41ba1f1c043fbba1ffba5debff1ad86f7734633b9c1c5c480d657b386298f524ba57576770fc170ef9b1824c0baea63a38b9ffffffff4c93bdb3ffc519769a8d93edca0bf2133796a0916daec91f361d64163b0011a40200000000ffffffff457ea8014ae8619eacfec5d540cd48646da162513bea7e451bd10be3cbb051f53f0000008b483045022100e55e0aaef69f75d0009bc0c0b09bbc9fc9ce6b677692ce1e345e8679909f835902202d10f7445a4dd232735e060f65dc9b7527e5f44fc64e5655bcc42b55fba53716014104d1daeb9e4d6d1c8ce70a98ecbce50107bf883dbc70728432de13d4a19171ae139b92af40c2a66f8635f6b7ba3f558e03d3db372b9d5066ddcb59394a043af455ffffffff0b5b0d3800000000002200209a69dea6032c8fbfbabc07d25d735a0ab689dabadf01db20ceed1b952d8b55fcc5bd05000000000022002021af57980932ae0a701265f35210af8114e227269c76fef2d22519197b506773017b430200000000220020416677e0ddcd8d45589207a9d4aa72d3f536380ca546d7faefd7db9ea22b5ce2d8d600000000000017a914e52653056dc45f261b0cc9812afb6fcb2f0810238739480200000000002200206ad0218e54a75526b34f820894b701211bf200914c0adf75d2937dbaf802175d74b44a02000000001600145066af51e71bb49962df50d3c612ac8b2bada998aed2390000000000220020846e369f4f2a4f5f0163fedda69ba0d0a5c6de073845c25989f2cbe60f4a7b0bcc8f600000000000220020a3857b6eb8e5ff500844dd56b497b1ef4f59cfd04f932bddc57991629d5c585b49c7b2000000000017a914cf91fdc57a28cbf9d8c072ca674284ca6cd42a5587f6dc020000000000220020b3a90dc2869ed5a3fdf89f9eb5240070ad285d874289efa3c56017d9bb30b1c27c942649000000001600141e893ddb34dc33de3dca09252fa33f93b0b9e7c902483045022100e0ed663b27e8368ca16fd0b2810b1c85d27f2e6807dc4d2f48a44c2d2724b894022073f097ccb72bfa54679b64d8d443d463be4708b32cff45b5334bfe6186ef9043012102c14161a23c67f14f00a59f5906c7bf084bfa634abf744f76c876986257b9729f02483045022100a2f424b17c7bbf4675be2f8da1deced2a018d2a027063023bd090f5c1d3c41e6022005223d7a6c9c35565604285d800070d49856dec1bb7bc5b2c63dfb94bbd391f4012102c2e772281e6d40f4f8d9b7ce787123b8a0be77223c7f84b2eed0d5ec1ab4421302473044022019c7dda34a6c5357292fef3c90adc4ecf7a9ee177e0a48241f42b933b9b2247b02207bfefb229cd32bea028e4e5d7dd2b4f780f0e5e85fa8e1b435612b93a13de153012103c09f17b1836e14207310f51f85580a587ab136703be6ff51fcf47e20390322e80247304402201cabab50290ff7e88f7338c740e9b56bc56643cbfc8a77bbbb8d90adcf75e87202206b1b05bdd66b2f99f3689da105e552e6c3309411a3f48d71c180d4eb910df1bf012102987a0b137b532d060b5ac564dbd4cb31fb20d3eff43cfb1040962dd80b88ca9702473044022041483c59abf10e69c9b993b8b1cfafdef772463eb65b1aa913628889d6c8506802203364866107b5fd0aed225cca141e0d90019961aec992184151293358744287750121036625c2dfbaa93390bf9edebf7fc261c643c2e5091ef068980e0f8c290b02ad3002473044022032bb505e11066e0e8d479d0879958319b46afab6a37f347f8278d29d7ec7923a022003e0e07063e058fadd51ee3ab5269d9ce87bb77d25bb6bf0c5fb2c6218d081cb0121033953191c66ccde7caaafcdad8ee7f5802f8b9bc64e1ff939d0445c484a14646202483045022100d78964ab0ebc06986671a1d7f731a997f39d9663c86c369934ef93444521410e022037bba4adaa31a9f429a93fd2d6a3f7d899007a26e4465a2a9ac28f0d186834c70121028eb31cad74116ec99d0bd6909919cdd2152a12c658e46e92a90189efdc8433e1024730440220674420eed2c239617072d2fb254d5cc9892b375b6bc60433d01b30494360afa90220035e4262177ef4d19a4b602c6e39c69afa92ac5fac6489ae00527d96215332c5012103c5f22d4e6f787456992bd77ce1572dd65834f75543ef97d4b0d720aafe5e156d00024730440220345ced683a23aded7c12215666355df2769a7aa5988fbabefab96250b73f6f6b0220694e43eeeac7642e9865c59cdfc3a63186c7e57b04f2ccd80809e61852f5aa2d012102e5a978bdb61750f4687776f55238fc9002b294255d3db2ea4fa4cbc32c0e9e00000000000002000000000106429298991ef14a84c0f16687d62dc07a374ca4a021144643cd63ca7b4d85ab840000000017160014ecb7103f6e364b2c376a15d458d60aa22825009bfeffffff993522974f209f4e5c1594a9041e5066e9ef4790d7bdf03892ad8a5766a3a7280000000017160014f25649b67bde932bf3bd27635c506ded6d1bd7c0feffffffbc698551f5c01f1dab329a1a822809a78e74dcf2c91f7dbecd552ef273f7e50d0100000017160014e77ff4b24a2673b8788fe9e2f01013ceb82df04dfeffffffbfbb4612165d4169d4174129587256c3d52782b9c5e635e52b4e720e29dacab2000000001716001412d323467484a46bcfc4555e80ceda8322915aaafeffffffd3113749e9d76dcbea04d373c1feb4184fe4a5c29790fcdcf3ba1324e574da2236000000171600141a10470c7c58d15e434ed37329031a172dfa269efeffffffd996259874f91878866f6afe9fa36f516ebeca7dc90d5e7764beb50f2ca8d0ea1f00000017160014dd4f0ce688d77454ab26266113e8f8e83161145cfeffffff0390ee0e000000000017a9145473b28c52dbfee78d204f19b76925238f6a5cd28780f0fa02000000001976a91452e12577ad1efdc13e6fbdfbd69651b2530805a588ace082c031000000001976a9140126b8777b1f86a5fc4fea98e0a10f31a13cc2fd88ac024730440220214818bfc67e8c02b5fbd5e1c6fbc5837a8f0f3cb493e11f2a102fc011588bec0220561ba4445bae2c27490c25994b97a93a32711270185ab4317c6150a67aaf63d00121032ad42c1c7ab38e02703a3b1f2ede8aa528ea3a58b0f44bb8849797c4e47889b202473044022019eef1e180c127c4f8747368f765d5cddc248e13d189f73d376d370a1ade2adf0220797fa47ecb5bd42c7a7e14a003b79caaef699e89846160d155af48e01e05dd10012103f049c2b8341aff64e32f21a90670315e1db3687adb729973d8e8ec8046d2a09302483045022100ed2a44cc433bed664532d78994680358b5aa7133970a9458bb7fac6ce5e19c1c0220058cdb4185fe72f097059b7893f04dc3402436ba8ccc64a88a3d8bbcf6f4492801210328390e127cbb9668ec01b3820ea4bd66a3848dedf67ef1835acc6a0106af59140247304402206433264188f44ec56f501b0044191fd7936b9f70b5f17aa57fc4cf41b408c91d02203cccdce383a91d6c8e52d7fcb92f8ccf8df906267872dc0ab3df5f17c23059500121025a017ab2eb3d342ba4676b319b2a241b5689685638fcdae7dc0d2cdc0a61b30902483045022100c55769e3f2f1d7c238848a42e92795ef2af58b3256244606f206277e4341e73e02204eb4684086c5ed13a68304e4c16a3b2c78ef06b40c6bb7f38acbba922e62f772012102dbf391aed76c47eac244a9c1e17c4d8cfa1117d0146aff288b31c9ff051b30cc0247304402201fc932d52000053e1fd57420f479df915994e4e8af02f64febc40445577aaa7602206c562cbb4814ce02be7724ce924682f4cf0af2a232d2db7101ca702973f0efdb01210212954b36d059ac9dbb453113fdb1ad4e11bb79c2deb0aa7e34db5cc556466f6749a00a0002000000000101144340b1d1e050b753de59158b9872ae98d078d19b9a0f82f12019e6eed74faf00000000171600140e3860a1013576a9614c1e194e4a997d15e1ca12feffffff025708d3020000000017a914dc5eb206ea09c96491b62a0091ef03138b28fd7787138b74010000000017a91471043a1c9aa1e328a95c656cec8fd73216cc738c870247304402200ed8985f49b5d0d825d4e110d8632f3bfc120389d68173f13881c8f1b76f67cc02205c75b2b7832cd36bdfb6b3fc8eab394969fc032c296b072cdf3417559976dccf012103d3f2ba36a0973465c30155bf06d87d4d3ff974438e4349b7d186055a1e66189449a00a000200000000010148dfc9770a7f2aba20dbbb20f29613a1a3cfb7b42da507d721a755e75ef6b3280100000000feffffff026960fc50000000001600143700539bdb3fc5e9d3d09cb443de6dffda7ae57c50bd010000000000160014b6430a008961d1b530f094aebea91e89fc142f520247304402202e842aaa34dc0160e938440d2f043f2f2ac1fa5b30fa18e6ee3ac3699d83684402200eec2c3f2fea05f97e7d69e830965ffe6d7834e9f266f5cfb4d23eae8fe6c5ae012102cd10e987133cb0847fb126f9e4c83bcf78869e9149f44e5c615ea32ee0d3df7649a00a0001000000000102cb59dc6ec9599a709f624abb018e0c8c9d35ba02ccab2eebbfa62d31b18ad7fd0100000000ffffffff4774805915e6ca27fb897927fff7c65b4afe1b239fbcbbd1850a76d1638d94e0030000006b483045022100db304fa0a4ab7d84e18fade72f3139077bc2b20dafa14732dfd216c7684aef690220320469edd1ddba1dad73d84582621609cb218f9c3ae7f0b93215d200c344eedd012103b48a59afd5f770972514dc1b646acb0ee0d53d9d0b38882c3751d19f96991902ffffffff0108310a000000000017a914ffdfa3423864fc36a62e5d1058919dcc4aad1fe3870247304402202713ead9fc95c52776110c08be856ff0126089c9cfd26582a85608a00c4d4904022054bc71da5ac15968b5fb86325d6b8cfb653ec97f6809135ccaf6d134b60037b0012103db733315b01df8320164142b33d5507335af2cfd95abafd26007c3d435087e84000000000001000000011e1776a5d288c68830d888df9a2e59e8ef8f792aa33147589f2902b4df52a306000000008a47304402207a337db50604f81f5f97b66eb41706c366141e46e2b6fa923077ba582c12f51b02200150302413ebc340e79da2b96289b560f733a3ab16319653e4f8396ddbe23d29014104e0ff1a13cbe450814cbe07ca0eb17161d7622c7548e28fe722d91bd75d1a3c743891eb60a6c4cf80fc29fc39e5352d83d528ca11a6d73e0a94d80674af15a503ffffffff02ae3e0100000000001976a91453dce6052e05d0296ebc4c83bd24d0b108affc7988aca2180000000000001976a914f5604765461a2d4710f29ef162dee0b94703dff788ac0000000001000000016da536663ac07e1c221d0b8b4610c18aca776ee7f3fc9887688c13d15f3dc0ff030000006b483045022100871c172d59ba1b0de5ba4715f66abe502dac3e3da252340d381431f64c5df25a02206efad9424469ee8421b4e3127f0c1dc0206e6ea0c49eff16830fe1b4694ff4ab0121022a0160b2ed13b803ddca6f6f04606f56dfadee571d683725c7a58d0ed199de79fdffffff040000000000000000536a4c5058325bf7bc38b0a8c2585d9bb11d419e528b37f175128252f8fd2dd7a070b3b322ef48b94f539b0855bde4c3e2bcb8dd96f5f59b29b0347884e213e0db3bc5d0f28c9b000aa04900dc000a9a73003d03ac7803000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87ac7803000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d876ebc3904000000001976a91470774e661a57865243c066c0e287a018f074992a88ac000000000100000001de11caad92b2dedcc4cccd5afe5932ce30615d1e8aa0d85f7aa62de93ab838c0030000006b483045022100ce3face6704fbba9345da4964d47cbe487291cb957a447189707e5ddfb24cb7e02201960dbffc89b876d3061dd95ad047ba767fc16930911700586f0b88f0f620c0101210215414ea5886d7be87d14e70efd29f5ce91664535e859c715bb07542c3476a345ffffffff02e599790a000000001976a914a43631cc13ad0af2426b3d78c8de20770e58160488ac78720c35000000001976a914ca53b087008b4bcd75e2a7b7fc3d0bd810d777cb88ac000000000100000001e4260e645b19ab296693891814f095d418e89291a080fd917c2082139f409e2a010000006b483045022100cee187bc4c789d575fefcf6eeeb31c3b5a2dd58cc77dda52f0a29c8e91d0481602207436c93e9de2dd09b56869a11bc92d5e276b01345c65827422fea6f4345fe93001210247d208883b268795c11439fa52738404a368d90be27233152115d9808e865650ffffffff02965e0300000000001976a91440d6d7cd7b7471602f71e92cbd5a6624895e4d6188ac11d50300000000001976a914d5c352551e80fdae0e2a7cd29b5063839e32688488ac000000000100000001be36e9737b44f09797f53be23fa2a121659d32981be89b68a83782a19f5c0ced030000006a473044022072762221c4e7dbae12a32df0ff6064c413adbdfa53cb3187d265b6c0528c07920220025dc043761f4e4e3a2408dd74fe128808ebfa5a56852969af8221e798202d32012103e356007964fc225a44c38352899c41e6293a97f8d8115998ae7e97184704c092fdffffff040000000000000000536a4c5058325be2823ba3ea668e45e8ec47b03f855df9d0678fcbf0e5d3e77a9285a3ef272ee664298447bf523b6b9984569446305c47c0fdc9745fb06ac2b4e413e3b858632d000aa04900dc000a99d400cf0344b303000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e8744b303000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d8752092b05000000001976a914b00de0cc7b5e518f7d1e43d6e5ecbd52e0cd0c2f88ac0000000001000000000101e5dc046e2d96bb11d5efafac8b560952355456f2cdf6570a2110b067f3d270440000000000ffffffff03d9c90b00000000001600147c6085316a8bbe19056513e28638f6f4a7b85693d7f2010000000000160014b4ad7476fa61500454e5a877b54dcc77a2c00473ea32130000000000160014208cde5426ac88743af891d420b3c015d987a59c0247304402201216316863430268cda894ce1ade7e8eeb8a46ad767dc8fbaa70d15daf407ce802202f477ec56c54293af824098bc2b80ba682508668b883d0513f21ffe20bd9b48e0121020083b438ba636d30c3da6bbd73e6279438d4f987b6ebac9b32893f8e550f78db0000000001000000000101bb3bd1fa722e16d79b5fbd5351cd0341a15a49b6fc092bba065043c0666975070200000023220020108e3f3fffcaad61d587a4c42ab1463d75d98b644d1cd7d4611cd38f647fbfedffffffff02895d1c00000000001976a91420321b5afb0614a370eb2c008443bc4d449f20b988ac7021980e0000000017a9144debbb48393beb2510923d3b7513a2a78416d68587040047304402204ad74d67f53738cf68507ec222d00a84f1b0f85bf1337daf7c080c09634a976f02202d47d4cc2ba13e280660cf372a837bd21c5d8258f31a04d69cf78df611917f2d0147304402201a64d2089ed2c77bf638684ca74b05fa0bf203e3542981a429c4a59388e0cd3e022035471e8d07bff4eb1b2c606a7004c328e7177f1fb27315563faca3a833d66f4901475221039bf2f9fbc41885880d451d8eacdad290e003285ec2a8977c16fb7c7bbc9335552103591a8174c64eafe308f89ef561420e6433ebc5865cd258047b26d930ac15baea52ae000000000100000000010186d717312c7e818ecd1ee094c8368001996921c1eddcbadd225d4e9b979e72520200000023220020108e3f3fffcaad61d587a4c42ab1463d75d98b644d1cd7d4611cd38f647fbfedffffffff0299a27800000000001976a91487b3baa9cd4bb3108383dbeac990c961a1af2df888acb25b11050000000017a9144debbb48393beb2510923d3b7513a2a78416d6858704004730440220738d6fee06ff81561cb8fc909c4b5735583fee9ae901b1de4f641686c4159f4e022013e92bfc2148ebfe5ded21a8e1a603aaf3a91fdc6cf07ea89e44b836a980642801483045022100e1a5da0e315b538ea9fd42f1d3a855f83efdca80f0f0508ac27251a73606b88e022051221030edbb5efff0a3948296bbead166c4dc6e90e876eea30f93f59c441e3b01475221039bf2f9fbc41885880d451d8eacdad290e003285ec2a8977c16fb7c7bbc9335552103591a8174c64eafe308f89ef561420e6433ebc5865cd258047b26d930ac15baea52ae000000000100000000010129deca7984b32b3f2cd0968b0790491c87ce50790a5cf8fd7e1c1bf04e819fea0100000000ffffffff02503403000000000017a9147f855afdd9d204f498c8538e19a84ff924fc356d870234350d000000001600143fc7891da6b56c02a994e493a2d59b6200e68d9e02473044022022b065cf7135e8458a9437ce9f1d0fde504608c9ef94da0375074e6c937558f00220183e86e0f42980c4fce151df4da71d382e9c37e4a7ced4fd3d82046d71df94dc012102604ec25f33232cdd026f693142b745b327dc60fd62278587da001b00caeed06e00000000010000000001012f0ffd94e3738bc4f167d96f57e964da0fdd378d3b5ca5891198aabd1b27c7d10100000000ffffffff0210cecf00000000001600142e5adbc1a0697dacf261ce1d060cb506cef02366e23e650c000000001600143fc7891da6b56c02a994e493a2d59b6200e68d9e02483045022100dbdcababe30b37415a775d29f8e58a86b1b4b23bba4981907cf71b9b84ea8ad8022003d5d95f26523c1a3ffa08b6a2fe8aeb8bd683d7acae99887cc9ad237baf2c72012102604ec25f33232cdd026f693142b745b327dc60fd62278587da001b00caeed06e0000000001000000000101e16d46d7242b7b2b5ccbe7679e9ca6bc80d86ad69e27b9d7d0a21c817dd122a00100000000ffffffff027bdf0c000000000017a914d3af391b4ef828e96ed43d5644a47ae1addaed1b875738580c000000001600143fc7891da6b56c02a994e493a2d59b6200e68d9e02483045022100fba2f00c9bb8a17a1440053ee8ae0941ef5ae6a4e121bbb2d96d9a5dcc475c9b0220138e36d0423c7f8ec15d49dc29086971d8fdfd23516efae8d4ec28249c741ef5012102604ec25f33232cdd026f693142b745b327dc60fd62278587da001b00caeed06e00000000010000000107290c5bb689b961597d794eead29950824fc75f36d0b9c8befe3197591ebb8f030000006b483045022100b3ce3bd0d10220ff70f0fabd83aa25ed5917f25d337ca6e6259ec6e984d0fd1b02205435dee9043496ed70f67356c0b88f6980b3f82891bf374d9b771cdb5af601c601210382014c3eae02b96c6550bf7d39e96b632a14aa19677b6ccab346862ebeb35a16fdffffff040000000000000000536a4c5058325b58a1402e4b0742caa919b45b1f3713f42cbf688461fa2e3481f2f3e237299a22943618088c4a68a721973b7113462ad4e2b1725fda3459f5323a49b2b5433d44000aa04900dc000a9a8e002703d84703000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87d84703000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d8702ee2304000000001976a914017ecc206ade573154183bb70dd2521b5fbc7b7088ac0000000001000000000102058e365f131a15d7967daf6244a07bcf7e9d08b71574168b34462fd5078e3fb20100000000ffffffff3166a5232d61462627a86bd73e6e74f1b302c3874a5138d4733602745a621ae9010000006b483045022100f4fc589932ba924f8017398029cb4c542018e7940aa2a92520a4dab9bb02848f02203f6ee6b4a30c42ca04a4b7c41d2c3218cf8b5407ec6bee888e238326b7adf8bc012103c6304a6440e5d0dcc8b5d40bb8337b85de3f7ca935e9f5d5cb20d4413b2418cbffffffff02a1b050010000000017a9147f36fd406882bc1b6b0f0093bce323719ea4f20c87aa0700000000000016001472783e4be129d2dd0c13dde2a98670391b81fd2802483045022100ddae54b700b30148b55378023e64a881a75c3f1fa0d1b379b1db828659499059022052f320a11cdd8307ca4c4b4ee6f1c5275ea77985d9cb8c509349656eeef3aa7401210397f94dd42d27a025dfd8c0cbb5efbc771556b0220c73980f54cdaa56f7465b980000000000010000000001018f3900f866e9277b51eff56c4ae3f5fa6e0c5c76a30d7cbccdf47b3321cc465901000000000000000002d31207000000000017a914af3470d629eaf466e32341a62b8d2a43c72941db87deb9040000000000160014141b7f89898760463f34aec12538cf440354e63f0247304402207a1fd4c6f43177ec9d599da15c169a84208b87ac06094e08b673445c2492cf0f02207fa4f4d9c52139ce65b8a7eaea4678df48f2e231e205effbbc1fca5f90a875b1012103458e230728cbc8e1f30be734d72327632adcf00076a61f4f09baa317dbfdd32400000000020000000001017bf95daa75a427324f9f96e5ee966e3ce502ecc7c27b2e2e08a1badae6d03ca30100000017160014a7020bd48de60d443c2a39b4cfb6541d98b9b9e0ffffffff026d4e13000000000017a9140a7c50aff41eadc303328001eef22d82715052b087ec172f410000000017a914e53342806c9ab022499f131b727e57b070c813eb870247304402203644af560a7633da791197d6d299e7548749e751068932faa31d5fdc41896aeb022039bfde67597769ac13dc03628e917377f21a0d1e566d9a0772c9b86e02fec86a01210303bcb5ac76066c50212d6b657cd1fddc5a088a711b96e1292571ac731dd94af0000000000200000001030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee1020000006b483045022100b63f0375eb19e024920ed8c44b4865549e591247e574f55be403f5ceceb4a50202202e3c7fffbf9cc457b4528b6ec43d82ea633303139966aeaf58e815a7ffb37d5b01210278953a08a144fca8942eb907f9f22159b209c4175869a5dee6b0b503cdfaf9cbffffffff01600b02000000000017a9144a0700f66486a13c3821c38903c3af0d7bbb82898700000000020000000132d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223f0000006a47304402200b2b5cea3a847f3d29a3e34ea93a00365971ce535cfbdcd669298d42816647eb022021a9697817fdbe620bb25f94142ed456617aeb5b7192fcc798d415216c974e87012102255e014e041c089aa7b4554bcd230db86b8b63a089c2d9c2fe8829303bbb0b7affffffff0190c90000000000001976a914e389e904f0e68838479ebfed594eac60c486b76488ac00000000020000000001028aeacfbf3132f956d022f765c7b8020a0af81e45c8cb7dd58b4ba67e50e2fc4e0100000017160014be81b1080b9ccfedb1be0582d9d84c695851388cfefffffff1ff27510d5f43fb51b933ecd68cc92cf3925a73b0aca4a48e71a037ca3b431f01000000171600146bd2b0134aaaabce2dbe798972e4a2530388639afeffffff017e9210000000000017a914d8c4d222ce7127babd94efaf521971754bff6ebc8702473044022051ed7d8332fac1f499f6263d3bae37b880b576380405813f430be87d52797fdc02206a2c73c765381ae17092617e7e1481324cb7d47ce9e40452b5e220527aa4bcda012103e58a37e6664c7ffe497dbf0eb1b475a2bed45c76b2f9e2a04a6f0959f509aff0024730440220015c159bf0bea366f55974771097dc292801f4e74f20d1904f81f6fc25d8daec0220481a89afe1abd1739407e4b72f3c7e8cda3fd6cee547cb525d2f2c9787534d93012103ebaf7f65434003ddee4a4a0f7b33ef5320b8b78285524dcc8f83d168b92160ac48a00a0001000000000101d0e9c4fa359a49a6b6ca71ba6c131fda0a49a8c107bd3660ab7ce59e673c25ca010000002322002061f85fbbb807e177ba7d899465242bd1652e6ea04f2cba1ff7df565e975a94caffffffff02c9556400000000001976a91493f0a07d1bb90a33dcc9a7623a7cd12964972ffb88ac456335000000000017a914f9bba19d98bf753d61c5d5a12783541787dd1d92870400473044022024951d0daf1f869692214ed41314510e146095528f06cf4e2db4fa77a762331102206db867794df78711c9bfc5656fbca85d112917ce38c39fbcdc93acc6fe73903c014730440220020e7ac7264df57f1295c09c401cb5fc7659271bd85daa9130725825acd8aef5022046e674218a529aa6e9f6c720560f402025c92490f55212ea5646091e84dfe63a01475221032199236c3efb9bb36b73f3bb1a141068f35d0ae8dad8ee0257e88caac0f3943a2103a3af0f49a21d29106ebeef9b3c3d69fc375c856a7153d97156a5b7a161ca6c2552ae000000000200000000010676fb923eae5b157547c66422bb3e15f400aa48d19f8080c501e5138e0c30aab800000000171600149b3d427e3d6a1b55a55b5f79b91197affe6219b9feffffff7adcb6c842ea4eac2c0c0aac1848d897398a815581c912f98d2860b4132411c40700000017160014a0f1909f73a9f92b433cd4be7e00538acde389bdfeffffffe6b7ba7c0118818908256e0ab0ee67b3826fbe60af614813dec43c84f66152f00100000017160014f19ec93ececd8fe8c80983d8b44f78d631fe4930feffffff2b22bf14b00b402b8f6a6336ff813b6a56c865ec07e4494c689e26f666aeeb630100000017160014421e8c5e748d3809482804cd2944c9de78a6eb25feffffff6bb1d6eb9dcae8a431cc90bed2458163edd67ff06d33744607beb585ffe3d00000000000171600142d321217de798aef2622a4ad378380af9d1646b7feffffff7fcca7236bc17c80c14811074b16ebfc00737908ae3a9e0272734bd59987ded30100000017160014dfc85ab48c5765c5d78cac39643cc1e0a24f627dfeffffff01429c6800000000001976a914293b2cc361e765b3f61baf901ddb4335d3eff49188ac02473044022066b11a74247c54cf75a97a9714a2e0c669af8ab5f20a88e8361c80f31c0116da02202d51c94dee065dacade23b3b150807c587b0223b87508c978caf0f94deb364a301210267ef389806d0e4342d5544b2fb2c6280544956c7af88bb30f346bf0ef70fb26d02473044022067348305f48b763e8400360edda4f72b5f74cf764af2ea3f37dc8bc6d7215c76022037f9d6c8680832db908cd557fc7c3ce4816e507f17e121d2d1935a956df19de301210289c863cd5c496283b925ccbbdc5f2053aadfa040906d313433c24dddf2a96fac024730440220194a7691108ce72b527abb1de2a390dc3a4fc30decf9f7568dfd3288c75912c502204c947288002f74082de1bc779b04b5c7ffcfe34f02a641f14fbaccdfcd3e1fdf012102927f89ead713437dcd31d8d48e0f611e7e4cb68a9b6e0a94d680dc44aa2a58f602473044022002f8c70e3933abd2574fa00d54598becac4bdbb9add4ce6895ca972cad01988102206a1fe767b8e1ffed6d37199b5e89cc9a390df6814deb86f700b19058f1d0b6ee012102649e35b84a45e23456b5629601ea0a63733fa4b4f6f58d9fd2df6f67174bee2e0247304402202beadfced2aafb52bbb939ea51297d620b0de2c45eb1c67c91cb193ba1362787022054ce4248839ce705274d9bc26f2b61b39019d04fb3835c3b86d96b1f948a866e01210392b28de51d20879cfa092818471be85367369310ae2daecd41027df6e8cb52ac0247304402202a79c4abd7d40f9ee360e42c03fdeee04a2972c483c323ca672e16477eb85d8602203175a653cf1ba35b1490b0be2b8b15041fb3c878828245675e137e2710a76f3e01210399a277d253a2651490fcb3b7bfca44831a397955593db413dd6e3d0c76ffe2f648a00a0001000000011aebc9c39dd69f3ffce2deb56ea198da7a5c24995fa501fa4820a283d77702ef000000006b483045022100d7a643f5c4b1692bd48fc471c53c326a6e8138475a0b86537c1219172c66b068022067a8deb705c0529b75de132af828f1c55a354ecec612f71c254499bb4d6a7770812103a0a3366223098257fe99718a5ca6fc96558eedc3e99b8fcfd81ead4ace25421dffffffff01c9d80700000000001976a91443eedc666a629137d7ab93f4978806ff4359aba188ac000000000100000000010167969eff9d6fdf0eba187b6639173b9436cf6fdcd0ccd3adb76a27039b789fa30000000000ffffffff01eb39050000000000160014208cde5426ac88743af891d420b3c015d987a59c0247304402204589d310c3aee04920f336d9d712b00489388720049ebb61dbf8785aa542b8fb022069f3d9ed8146c427a17920df18d2ad4e663a9c964a0d667201694a2e17a28144012102914cf318535f2300ded3f82a090e77ae825c31b8739069e3ee20cfd89dafd007000000000100000000010168e325c9c7d299ef4a74c1a8ef3b42a247927df72132f5838d11958b54d4e330010000002322002069ca16a8a73c9519b3009f6d79cf24c40babfcf1119b78f7df2a4791a3b0b57fffffffff01c2fb02000000000017a91419e8f3ab2e4f11526b08f170b381924a327248988704004730440220011ad8cbd188089ca4c916468cd6e8a006339dbeb850c65638afb55a30308e740220476378e8f6647a0241016b672d74243f36084f91f8c4081abbe6d0d9361d68c40147304402204bf58744150c6c14d24bb28696cba8c5a80ae8d4df50a9764ed2928830bd998602206dee8100f7ed23a8c1f83bca95eb030f5b023c4bac2308c3a8d2ab1d14141b530147522103fc6bdda539afef6677b641783ab40fc7bac3e8d6a9529e76ba82413fb17ccb9321022ce1aad322a2a6012996ff109aabdc16ec611b3d454426d3799bca6cb6af4ea052ae000000000200000001f287f2a497a0a4cef21f6fe7e1fa90360c75cd73fbbfa93b61690d561fd21472070000006b4830450221009182548138287f61da4ac2efc5c7beb36fd3fed9f1041e0fc2871600143a9f2d022077670f70d5ec67a5410f01d2f74c4cff6e24ecae81863cf287b2836ca01032b5012102e80f2944482f1677336a91bed2cdd9ee2a6280e6a6feeedd095a2b151d325f5dffffffff07346d04000000000017a914d6a8c209d6b0b9bbed25bb62ce40faf6da72277787d40607000000000017a9143f0cee58c9627195a0e0f09a02fdf82cfe3542cb87d0df0e00000000001976a91477b88cb85d0d6c24f7f055a5d9ae31cb2c3f559188acaced4700000000001600146cf74949f436347b5a4a420d2fe2c6b6199b431400409c00000000001976a9148819912eed2801afbca0526b1d399521445c5c7c88ac642c01000000000017a91435205f123fbec8ce4d72e517c093b8c41c22d37387ac903555010000001976a914638d5db6dc2fec5d6d2c160c5439c08c952ba1c688ac000000000100000000010850b7580fae7eb4902a21be12b9ec44e14f5b905ae8bc8dff60dcbf4940c2fac74c00000000ffffffff3fdc5cca72b7b95c9ef5192f9427512628fdb9bed88b3b22a4939351c4833a1d4300000000ffffffffa4ef9d9d2d5f41b5a3d9ce09796a619b89042282f2440f1f462ea5c8d00f4f7a2f00000000ffffffff2b08b620735a15726b902afe00ca4513f89cc80a03c342578e31dc4a886626961000000000fffffffffacdbd7756d391c267c23a39ca090bb9cc774548a911972b123b838df5cfb5950400000000fffffffff3ec04534e3917cb5c96b6f68e7daf63c7d7f077305659af49f4f77f6285bcb01a00000000ffffffff3c76a169672d596fe968ec44bce1e8386fe7d1c921e8dcd4e2b5e43603c0b82d0400000000ffffffff2f15543b68e0dc9935594c8eb7b5cba0d90d0e3b81d19fcda1c0ed3bbef5ffad0200000000ffffffff017aa35401000000001976a914803853e8950b611979ed4512fa83678c428e1fda88ac02483045022100f5e09d277dcb680c3d6d70242731046b5fa12a1d20d04280a527fcf701d6fa8002203bdb75df33faf9c11441f91ee2e59de5bd58c31c4f89d575de1b76f3d5431e4d012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a5024830450221008031b293cbefb2edd93a67c3bffdf72a9826d15c091083502284e74c096b46be02203021a3a52b002aa0ed0dafd9dfca1ab23374466570d892b5f4d3cf800d3c3f88012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502483045022100e3e06383936e9f67c4e2d5054c1d178e40d23c4a7e2e501bbdbe42abc23e93e40220744cc4c2aa34d369f36c860d03ab9da379142bec6f6d681221398c1d89dc233a012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502473044022041ad828de5347717f6a03c1593ede454a4f2bbf0ee0479448a0477ba66014c2802205cdc652f3d3e1a8ded515aec0ad0dc5b2347219283bb38bfa079a9c864a075d7012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502483045022100a2cf57d14de6fb454554ab799c0a2619e946de95c1b4a9f8573ebc1303229d6702207ab04459b6432d6e9462888e7b30e77e802b4df9be62063996920986cf2b2b50012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502473044022060de3e63f03391ab6ded3cd77252a15b99446934be66f2fb91230ee820952d0402203417e323ff8b3f2fdacbf1d5d6aaef06313ed0cd777a5ad3b5ce652d214e627f012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a50247304402204faf1fa008cb21f6fa9fdc6a5d32ec6e1e5d106cbf894ece4a0f117afc6a1ebf02207140bbc6f67f4171c1364c9077f01e0362b21491b297a5359101736e03b5b6b5012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a50247304402207b36faf0e2609244039d586b429215befdfec46e58584a215ee8a874a3cdc29e0220159b64cde21eb1af2693e315635e1783d03bc502ef8de2278ccc5dd162a56734012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a500000000020000000001019fb118ad396b0cbf024e810d5809d43d6c56b9ef3ca2ebc0f8e63153f46f534c0000000017160014ae6d1d284bda51f47c416d521da24ee647c889b3ffffffff03f8a101000000000017a914b032afa5e57aaa74cd4e8c4dd1a68f3363d1e160871c8900000000000017a9141ffab88fb2486e22cabcd5b3ee4396e60a289d8c873c190000000000001976a9145589ea1339e5b5eb5c991d20a1b65fc2ae29690988ac024830450221009919279c1b3a67257177e905927af14cd7f0b409b58c2f91152ef7c64ec1e8170220076eabb338f67db1708b6b8e1fdb4c44e560139bfbc836890dbec6f81453f32b01210351e703da110a5f83fb5ebb3ba2d9025c69f26ea5e4a7b58ec878ff8771a070ba0000000002000000000102eacf617b758a56d94287d96df5097c9432330501fa338a4ffd20ef8af46b21130100000000fdffffffe674b0e6461ceb64d18b150099fc121bb9ccf2b1e77d49e6e2a55543affb39880000000000fdffffff02abfa1000000000001976a91465b1fad6c794317fdf4a9fe416d0ae2b9cbecbdb88ac0cda010000000000160014beef5f4cabea388349f41033321128497c461022024730440220436a0f3ffea925b42cb5bc4359bcecc46446cd2575fbfb73a6a8d7b6dcc062ca022063519377b0c85868168ac620b410f1f0ea86d96c2bf04ca9ed988a4c63fa2945012103ee3f9f7e39762c203faf0de38ec3b5ae0ccfa75c8120c2a80bb3473ff5bce8e002473044022050dae63c287abdb4e92cf72db33ce13af8b7b900892320a3a89e11fb01f81a39022035d4713c723b089bacf0ce67bd4c5fdaaee55d2b475c9657172004fffb0c05e9012103562577266744de124734ece230037b0bc30355a5f64c922bf360fab1f998658f0000000002000000000101e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1564400000000fdffffff01191bf20300000000160014e604f9078b3845171f43f3e9613315c33d884dc90247304402204fe2e3ad3317eeed5e0358c9ffaa1a0a72a293dad0b18cd524f88ae7134f19ac02201fbde9949ca4d2df60c4ef1588a00ccaa575e6a7f3e3c08b83837285e5ea1233012102c1bbe9c1f74553fc67eb36a52556db96ff2a98b1ebe29edb8732c12578c3e53200000000020000000001018ab60725d32971d6e0053e481ac7ca61e8fe931768194a6356e4080f51969c600000000000ffffffff01107a07000000000017a914e5cc89959f1601fcb6f05874580bdc0241a7041d8702483045022100be7a85306eb9eb8f847a4286a7c9415219d4c0ab79cfd5d5a3aaffd6063af9fa0220264ba2d0a844d4dc84ce8de37c1d4a4efb967bdeaa31e1e2819dc8f3f709c010012103f6fef207814855ff1f21490075dee22d7ea24286109ba7900f3a585c23360b18000000000200000001aeb2c3edda73556e0bccdb2d73163dc2ae72bc3e66806c2ad30e5a6494e2d8c4000000006a4730440220464671b762943344852d7c0370c1fb04e98b712ada0efbe4bba2695a8364ad75022075cf0d22a08c7ac34606d4a9d353a200f183b457819d5a1d3a9bb230a52d144a0121022852ed258fb5b9004b13851b4d09bfe499ea49b6b81f0b82268a1fd1d13ea1b7e6ffffff01067b5001000000001976a914d098ab47385c466879796a915635e38ffebe822088ac0000000002000000019a6594649010087ef8151f68c4fb5d245491f38aa857820c102602fc90a9e6fb020000006a4730440220703b903060bf81dd27519df6c15bde6b3cfffc5762a7924bca9ef88da3f4a1be0220042eaed4a729b010e126f1939e9a94859423a086442c7616d52f896d5fa4eb0e012102b7323adbe7d3d30537c3c9cebbbf6c6629011c0c0ad57a9559281191f0cd0b03e6ffffff01b0de0700000000001976a914d098ab47385c466879796a915635e38ffebe822088ac000000000200000001b24f781a1c3b72a75f935e098d0d4701391da40fc760bfaa8782df7b51e9cacc000000006a47304402206d525ee04df93a2b267c712ec16080fc58a39b936d08d6f5c0c9fab33dabb95902204a6f85ac547b351bfe2a001e862a2140d437260de46c7763b35d197c2154ba7d0121021dc193c6aba2814b24a66bb4c11cd013aa5bb65cc62085e21a7866eee1b58f8de6ffffff01245a3420000000001976a914d098ab47385c466879796a915635e38ffebe822088ac000000000100000000010165468ff90c4c2e241f4935bce7f76da350ceed5b95a1f1c6ff67c1d39ff8915b0100000023220020108e3f3fffcaad61d587a4c42ab1463d75d98b644d1cd7d4611cd38f647fbfedffffffff0333070300000000001976a914dd202d30af6591552b5b330bf1557686b336833988ac67145f0000000000160014aa782aa48e87f86f8048d5cdfef567f86b2fcd3e37273f050000000017a9144debbb48393beb2510923d3b7513a2a78416d685870400473044022074e77272a7eb9627b9a7282878e31405491ffe85bcb77c9a3a316b7786b7e74b022042e32ccc876d0d8359b9044ed11cff3a293167ae1fcf531d77b43845145879320147304402205a1a5dd32606d43fb698e7e56d3048ae716232cf6e483f4295cc22262950edae022035127706449917b5743ec9288316c6f84dc13b7321d4b12c83fcb4743af4938d01475221039bf2f9fbc41885880d451d8eacdad290e003285ec2a8977c16fb7c7bbc9335552103591a8174c64eafe308f89ef561420e6433ebc5865cd258047b26d930ac15baea52ae0000000002000000000101fb9164ee667a37a7dc62ca901b261d48f8ddd0d730b7e3d9dc97ea82564a1ab8000000001716001402e15f376ae0e51e30fad3b8295c90f7d83758cdfdffffff028e5a0200000000001976a9149e31622a8443c7627ff4cb62ff78ef8ecae39cdb88acc105af000000000017a91431b91da350514ac3380082f62d7ca2550fbe4625870247304402204b31f5f3cccf3cb83aedcfde224c82ed9716dbaadb9c0433381abc56e1ea51d102203e7403d5d536e9eadad5f37dd40312246c841eefd149399bc773ec2eb840a59a012102888424dd5dd27d8644a54471f04823131328b18ca566a5dc4d2ec9b4daff2a4c49a00a00010000000161ec1a37490c662882620e29127e1b6f736b8c7f5d2b5afe4dfb044436550d32000000006a4730440220122b939fdb2cd2e612d6204e9ba261352d1d44a272b4e0ea20758758a6b76b60022013784ad0bb07557b84905cebbf44e41dde91e1d2e0cee76f6cd6535a4b44bf140121038cabec01653d134ba3f5f01bab0ddeb4e2451802dd5bcdacbec4c36a78c45659ffffffff02c0ce0200000000001976a9147d2041e665bb4e4e5afcec1d65fffdd3cc45eb2088acc2790100000000001976a914532f646590e181a4241e91194bd0a60c532e119588ac0000000002000000013efa35e0084780a9bcb4fca45d58a446856510129caf22be1b267b1e3be9341d010000006a4730440220335eba455b3e518326e47e6ba26d8860901bfbaed31964fdf6095beee0d39f50022077a6175d59a39eda0fead62f1f4141d0f130a7fb88c75f703e6389af4b44b49901210381c16409b20b5760b73285005244ec9d9b59016680a6dfcd65984ba8cda4feabfdffffff01dce803000000000017a91418da6fdcd2c981f90032c079bd6210bec4398aaa8700000000020000000001013cbdd31c549db408388650977bca3ea5d4499747b26a7c9f8550fe5550af90b50100000017160014c7adc8699e78beec8f164370456de9e3adea1097feffffff0220a107000000000017a9149562e7dd1a5090dee27960815ccfe52e43ca9785873eb41d000000000017a91433008bd89526a279077329ad28acb72546623a6f8702483045022100c9ee8718428d130568e9a3f0ce3b7cdf96917c7991951fe5993522acdf4815c602205413865e76e780f6cbaa8fc839691adc879b233e0968115626a9f345c33f8b7f012102616b898f6f1357b95f2378b579a411696e7a0c5a97d22fafef6e5e24a029b1010000000002000000000101938edea624d22d168b823d3fbf245aec70d792f4081896d78913c7ad171a26f60100000000feffffff04c0c62d000000000017a914e260c59a74bd682723072eb03071c8c36646e0ed87207d0d000000000017a91470210822feda540b59f70bf729fc290a46b9eedf8753352b000000000017a9145af0d4abec672fbcb8d2d1300e69cba142e2023787c675f00000000000160014bb78ee1b9a15d58e8904bed91f4395e7fee0207d024730440220043b685f6af0d1cb8318a03ac5bb23a707aaba3d00942a09621c76a2d5769e5d0220747b43483f09d47f58b51ae89cdf6c000c9532244a8941662493db4ace364c33012103344c7f099fd478dac4e62eaa6b839c8591fdbd010d542f96b2d572baf1f2d95c49a00a0002000000000102daa2970046686c02560109ac01dd0f3ffb3d952cb7ccc251fcbcbc1e74c857310100000000fdffffffb30d0bb9eea0d3dfff4207b7c25b4382c145dee59c99b00482510e936e46d33b000000006a473044022010259016a86f782bb135d349e07fb639bbecb5b6230e81a7448e7f3ae2ed171f02202b34c1e7506e69d706fa348455ada95d64444f2786d1eec879aa7fa41f0d94eb0121039bc08e28db5de24e9af8884e8317ca461f9c881cb293c04ef47e6d3edb9dcb2dfdffffff026281bd01000000001600140657dfa84726a480596abb44c9dfc6d0847e18550f7e32000000000017a91417ca19043f4072c563f2a5b293f377bd4eb4a8788702473044022059461ca44da830397a2303b2a5d6ce8ff768e397c41a62e3d4891bec35ae5a0e0220169a22b1a84a064ef6fd800ad39a9d948340174d02c8922adf4647be194f03bb0121032fa46369edbdba428321cae44aa77d82d495a3a92ae9227a8919f0cee85a91790000000000020000000001065bb395aaf787beb20cdd615bfe59572f0b65074135b469e2441a3d4dae4371450100000000fdffffff8f8baea0608bfed31e6503a854de63252a893785e001557944571c87ddddd65e0b00000000fdffffff862e9061d7ed5dc82e2bc110cce59ab54942eeb3c4b01223e8239ba74b0dc0bd1300000000fdffffff2f40a103c97c6c9ab0f472d4d344921d3246e9957d919b5d2cb5bffbe2dbc1d40600000000fdffffff6a0e3117598cbb547491115c57c5ea3a1eed50784672b95a3f72709a7d26fed60d00000000fdffffff84b8c5167cdaa599bb92864dab811da7ae1f161fc5c3c6ea6402f452d32092ef1100000000fdffffff01971236070000000017a914ff72090e4720f79c443aeddd3d2b4bdf0ef4268287024730440220779e85b37560aa6d6c74c8bf0e399f581c91c92b1b640f74f63adcf7fdb6f0ae0220090f3d79ab5e1288f6c119fd063ef0598cf5e3c9a734ea7d7ec1d6caea58f8ef012103a0ba4ed22d7b445c7b3e2c474038d5664f02bc559d74f1a6a32f05ad5367187e0247304402201a8568f5ecff642a809b599815b3a348e932489205774e1f28d9f351fe4e09d40220131863d2d1e0eed3b9f0ba937d6592b2ca2430e38e783a5065e13301409abfec012102bbc32c7c2777ff54e584094795bfdffed061491012b69545c665c3f050ffadb40247304402204cab620ba1bf48e773f95f8c3a1ee0fbd19c709d8c78f01f6069de56b9f814120220110777dc5d38f437f1f610a99687d465d6a31c5e65795510aa0dc99bda80574e012103e8f17a9940652f29e512097485abbf32a74affb623f83c68a89fdebf584e17fd0247304402206356c4b0843497d523d6bbec1e731ab0738d6e260da0f41ce77d2a6ff39b0109022039bb7d0c274d74ccc59615404ae5b3b29ff74ffc9f529dbc108ca8be990d3bf50121037f5ca33ac43dbe5cf686663133bef2d4a78cec57a056f24719145efb3fe6aec602473044022016f46a834048ef7cd0ae2e815566f0a290f9fa19e76de9a037b4a431ead9686b02204af7088ccd75f8b010782cac071514833627435a77097ce6c72d4827ac3e255f012103e7f31db3e7d95e6e12a0710b568efd0ec6342ea46edca56adb45bf48ab2b61b40247304402205db113974039077ff5920718893daecb7d011b53afc8c537e466589c72f83e2d0220065991418d37637781210f460e16ada817565018e3a949ef1414bcee69cec83b012102ba95604019a3d3c2f24177bd4e6c695000241c78df13f27874186473d79cad3549a00a00010000000279749b90552eca9da984a8de587faa05c4f0083b9f336b636ff9ae2967016c68010000006b483045022100e1428de84663f1e318e296c2ce2c63666fb07b497f72bc672753c73ddaca90ce02202a61661c581ad28620a237d98ae90f7972e97fa88f00e14820bda59477a9d6db0121038386c5c32fd81d955ed3fdba7cfcb17ee39e3a8c0e2c7aed5fb4f454189953cfffffffffaf5f9eb4fe1d27698da4ddc5a3272af893caceb06e0d412e64ac59462375b9b0010000006a47304402204459fc6a96df6f505931794c22684f3c95cadb70c2a6ffc9c726710d04c9085202200c2145585525443bf1184d5b32607340ce9341f8f3e395a6da09ce7fdda50095012102dc5e3c541a4d3e92c0bfa7e51cfccea9054f76109c4e6a66c7b07369ce59c520ffffffff02fc2803000000000017a9143e83e781f440c253dde63930e0af407d8447a52b87a11a0100000000001976a9140249d914d28899ffedf0709d61873d48adb053f988ac0000000002000000012adf4d2f0fa989a3442c08632c8b29188a32a31edb7951b251f7cd8c58e43e0d010000006a47304402201489d42b427362db36289c5d1e6f7f6f4bda34157dbf5440d83ee92fee9c116302202f40af3b96913105459f53836e80112889533d1312102020695b54d64b34d7c0012102707609cb67157d949d9628f020fa2f01aa98e771291fc64d05110225ae51364afdffffff02974c13000000000017a9142033a95b014f33a2dfc782af875a868b054d86b787268b3f00000000001976a9140b331c7623caa7f127064c264489c6e5585e274888ac49a00a000100000000010138f00ad55adc851ec4c6172bdb1483fdc4196e1d4c09c46a7ca930464d1d63030100000000ffffffff0240771b000000000017a914d7195394bf56c403b2cfb140544476ae9c3c658d877d610000000000001600142b33a5dae5f527751d7dbf05158eaafd20cdb09e0247304402200501bbca9993fce41bff318d0697479a0c6f051f7ed9128fe9f52cef2fba060002205821018e2a741fba528f3fa065d5bd8937ce6f367c06f7e08720865b1acb8b6901210230f9ac7e119f3d16d6420f325f7240a91ef95dff1ee78beb320495a0cdda96ba0000000002000000000101e08a83c3883c5aede5ffc5e6a2f9036b0dc99b981770400126bc9c9d44758c820100000017160014211fa9d76c0917aa65a2dd3317d53ace712a11a3fdffffff02be7e0d000000000017a9142139d3322decb3fea092c8848823fa1916573acb87dedd00000000000017a914ec9ec5268a4863adad02f79cff204a746fcd2930870247304402205670ef47b98422f38751a4eae973737d7d844fd2708101a1cf08d1e58021e528022038a5949af9d9e977363142c3605abe3d9f633b39f38b08301591a8f8cb9a5d47012103056eeea31698e5d72469c359b9356d02f5d94a44af240f6b36ce6998efbfbf6649a00a00010000000001012dd8d0389f719c1506f74dc27b186d1c85fd272b0eb2e40bea56408f271c6ed40100000000ffffffff02e8030000000000001976a91414f501136dafae0508f49d1d29613bc122a7f93388acef5a870200000000160014382d2b655721d7b076d901ddc601c1bfb147eee002473044022035bd1ce6d71901d663a12d283222575b6ef87b449c6cfb2c84f1cd2c691b32c202202f6908c8dfa8eef85af62400e622a1ccfefa2bdbc5e3be1de5dfa6da1b314633012103c09d34fc49bd281425d1dd66c6e8f07533e1be82304031d96c6e8721b15a5aca00000000010000000001019df7a38d5630e19e2d524c7e9be34deb97b70105b1ce6a8e3c12249783de9a3d0100000000ffffffff0170120500000000001976a914725d2ffa309d9b0f71c32313c8976fcf5770cb2088ac02483045022100af78251c316e6bfed85d674945a4baad367f5b8fbf267dcb7b22c9578475436a022002e5a790a369116e04613d40892558ec61451eec1e14c19cc0727e1df5586e3f0121025fd5be5697d29a890937b00545787137231fa3ee7fa9e49226285628d0022bd10000000002000000013193118d43b9e0d87ec23696792d323f18077eb15fad3459e4dcb9b6160b8898000000006a47304402207186f3959a6db85e677071c658b697a6ee4d02dd151840db20d4875c1d7dbb7602204b0aba49cfe7c626cb133c90fd4f67319570013245b400eb7c763840b7dadc51012103bd51a553d863e03c404fde56dc3cc6b780bd51b9fbc69888be44074e55175436ffffffff01f2b41e000000000017a91403d929117720d408505efb77d34f2f46857dc0e5870000000001000000015a3e029373ed18ce152339a6984c4fdc656028bf4f9293229d6d783c789f1c8e030000006b4830450221009b79a6154edc478e0e9c2ba54d2884d636a66b4ba0c9b95ed163b3b40b0e313e02206f9321be7a288773f405abf08c8f465a176e36c37f733de1794fa0de0aabafc301210233d1029f521017882ed8d52497bcd463a2f2122dddfd888877927959d3ff6477fdffffff040000000000000000536a4c5058325b094965b629dfaab2cba5bd428cc4031736563b96dd9f72937211c5d6ba8d5ec7e697cf22ddbc751acb4545fb99d92c0319a9d7c6d9b84872e3a3c59f5208b94d000aa04900dc000a982b0041031df103000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e871df103000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d87da8c2602000000001976a91446820196a34b0bb6a79ad209838c02a09a1af9d488ac00000000010000000174637d798018e7a358ca5e8cf471739f1157243c5b988714fd3e62fbd6a30ae2010000006a47304402201f095582120d8b3cb984a022871f4b3aaf25730987abab075e8fbf3cec1b755402205011ec17c4b687c1e7be07fca2c122184ad3f92f4a8ebfd03def5c1b73cd7180012102be663c1fea475efed16ae0d53f47fd8302098c9235ee2fd0e0fbc6347c945f16ffffffff0202590100000000001976a91444c2a6c50eb9044e6d90c06f3927f252527299d788ace3180000000000001976a914b477b858171a06c79b1e25e3ca9574d492fbfb2388ac0000000001000000016f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9220000006b483045022100a17c72c10d720bdabc07f04f36de1cde4f34e40e1258eaac76230006c872e3f9022026d3e54e2f3d06b63b984d5054457226749d5f8d8707d70c847d36788467cf9d012103a1663c254bf2aa597baaf7f2a193d586f5c99aca5adff38601d6dde3b17deba7ffffffff0140e60500000000001976a9144b6c7ce64635900dbed30671a1dc4d22bac4095288ac00000000010000000001023c65c722c71a48e9bb9d55807d67cf4bedea57369baf20f6fe1ebe5ec99ad7230200000017160014e46a6229af480d94dcb2c444650b6ea2e87bd85afdffffff3c65c722c71a48e9bb9d55807d67cf4bedea57369baf20f6fe1ebe5ec99ad723030000001716001445173b8abaa7589f70e1d3b1b32f110ab39f59e4fdffffff02eb113f0c0000000016001492c2b5533ba1d51155af64e4ff02ceb08c9057405f755c010000000017a9149460a68a0c6d581ed6d12f2293172322efb9da8387024730440220275e1b4e0fa167b41c98340dffb24faefe67349ba3c6aebadc68d04646748e44022073b7e55ffeddfca2c10aca608b5b5fab1a77b1c3a066f5e070fd5240e5fe07ee012102219f8a49fc39e59628ad54bb6858b08f014ad2269830fa2f78747d6902026c080247304402207fa7733c4abb67fab217a000e222fdf2425f50ef9bf190e0d749248b0073ffd202203037f29555f6f7941c05427690895b1891a8126df0e59f16f28725766c1fbbc6012103ab95394463367dc9ee3ce20ca9b1fd22c5466e5774afaed247d10d7b2710c81800000000010000000001022f17879a3bf926a6cdad43da4743fbf4024db32c4dce205a12550e37542978870300000017160014cb8be98441a20f23c9c5ab768f3e2a03057209fcfdffffff2f17879a3bf926a6cdad43da4743fbf4024db32c4dce205a12550e37542978870400000017160014792b062aa47f5c246faecbc4d88e30554d2056acfdffffff02cee5da0900000000160014c14a9537e4e5434abd6a3860b6e4ff170a1476bb5d1100000000000017a9149ccaa5304b6a51d91f4005a42d84dd6d51d78f88870247304402201044a77764afb91981fbcada6cfc65f42550473f4bcce47bdeb642e94dfe02bd022036b7fca5e640c8e6e10cfd9afef7144939a321468c931ee7bedaef9378b11f2b012102141c4786c1dd01ab38f432decc28c6146c6c8d872fe9a6be411f3e2b7392b6020248304502210087791c3355db1745caef21b44ee15e546e4a2f7b9135f7e955169d137e096eba022032906a644d9481b4e16811d8420c4668b4789e3cac119ba1ecea62752528a71d0121024ee95fc8c43672da9a776c72f361a48f002e7916fd2a6630682cfb583cbadd28000000000200000001d63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b39370000006a47304402204be937e6863710e32681b1ed44c16234192b16262a92a78f9043f3993c25e9fa022064450abed054a7de2832242ca4954e6c782bd4c03611c201a269b264bd207c9e012103dd819e4303b276f947410fd49b81311ef295fdfbd36dc5138ef1d554d007f2b4ffffffff0164592b000000000017a914fd2ebfdeccdb993e26a26284045d4ae69e63bdf9870000000002000000016590e18935ea0b3b2db191a0a70b18afbce24c7bd3e7610a423951a4f9367765010000006a473044022056b447fae46cddafc7193bf37aa1cb9c79b588bd0ebce20891e69c8630aaa4e502207e3c165f381e8091ffe858a58d815684cd106be899bb9a2c0311a3a3e03c5b2b0121037b4e13a2577c409076106815545039c7cc26aa4fa138676abd6a6c1f69ae25b2ffffffff0279580100000000001976a914a8283c6c438ccfb6e143df06a66fffc7d03bb5f388ac39220000000000001976a9140d426a33b0b144369e984afe48178dab281fc64088ac000000000200000001dc66b97f1a84984b9042f2864095f2de6a5cf4add87290dfabea39f5d1e1c253230000006a47304402202940f61ca0ed3c2cf0193ec4ab08ca4226ce4904d52a0e3a482a3f8edd3ca8fe02204b8ab7869026d3c787ecf2ba01b1f4aee30923c72b5242b09e877293f9b4a45401210389955d6e4bffd977f88fd99605b8d19e4d3b0ae312ba6337e71b2d9aba4cd6daffffffff0208971c00000000001976a91448b0d1e7e281166678824613ed192ba8e92179fc88acc8470000000000001976a914ce3861ccded2f76a1cd26f173139d44916e897a288ac00000000020000000346f1c48597553060c4370d0fb903859bb4b8cf1e72b513c6cacdff6fa9bd6ed2070000006b483045022100e25af5df9454a3c95a519ce0b2ab0dcc13272bd9e98cb746bc330d64c6d90767022069e3037d80c1edcbdd48750fd3438f14599011ef0108de234836c90300c106190121031b8e3ea70009100238798bcb3f968513818dac7a3f759fc5d889f72f035db88cffffffff8fecad6fab642c59f46e05e73b65f1886afdc1286b7f37c4af2ca48da64d3c80010000006a4730440220712700cc0ecabf0c485267745df686eb16d0a5e81149588ba7a6c882c8c4861702205370d05c2809cf719fca6f5451a3511bffd0691b1fdd090fa93b834f3d41eccf012103d109df3d0fc35cc56ece49f2a0d79da7173ae746d394990c2c8593adb8db6dcaffffffff39241356bc5d802450d89536dbd9d4c0aff24e0e3fb9ce6f2cd0bcadf2d1f63d040000006a47304402205b19b5ee8627b86f71e041ea6d00d94b4edcf9255e7041eb0669de27cab9bf9b0220513fe8f3fb12fbf788a1c0576b4022209131269b0f5bf32a977a1a475074401a0121031b8e3ea70009100238798bcb3f968513818dac7a3f759fc5d889f72f035db88cffffffff02fb5f6800000000001976a914db851fe8ec4006dfe13f94fad7325b6d086b709888ac6f1f1a00000000001976a9147495a775b079a744ab266b78d7c03f50f84ff4f588ac000000000200000001ec5a6f45154bc307606adadc20166b9bcfd776b390632b7aff3b932eda2e24b8000000006a473044022027b391a0715f6c29d9028b84224ef43cd05b28c9a1af25033fa4a99793cf26dd0220091c5045c492f9f2cb4e469789fda1472bd0fcba589f989fbc80376a49d09499012103a2c493a8812448a59448a69784cf756c1663ef8c4a1126a5fa95facc10f83425fdffffff0164db0500000000001976a91464fa9a26dd87df139b508356524ba4f34441034f88ac0000000002000000038624c7692508a7390164122ee1958929322e419e46b3ee1f6de87fdb3b60726b1a0000006b483045022100c7302832036fc51a272cfa990030e04bb4daeedff7289e3a1a0adc57218b5abe0220141ffdc06796529ff4c06811abbf9cc675a8af2c0acf98755dbdbb47cb42db4b0121026a11b94c1ed2068a62e154ebbe8714788beb6be40234137112a1d6907dfb90b2ffffffff1c24fbdb6e5a37592b2600ba8f5e72d56a1bddcaf5e6b7208c97b934e21b36d2010000006b483045022100e401fbac76b8104044545cc870de64e146962842d787ff89ecb1ef4ff0e81fd2022050baf3a983c6bf2cfb9e4f9e7993cbb8b864697191b370200396f8f7612047ac012103c0299f6b00bd653777908203942c49ecd1979cfeb67a83768d402dcc4d9084c9ffffffff1794c293e8cf2b67c94897c28d9ca1f49a755a01a43569d2117505944334b2d90c0000006b483045022100888fccc8fc072e46ded89c40bcfe16c27c8a4fe5f508712b0b39a9a45fa74b4f022002b7fcd89dbe5f1c5339309a15b1f41aac499b516d1468458804a86d186d76e40121026a11b94c1ed2068a62e154ebbe8714788beb6be40234137112a1d6907dfb90b2ffffffff02c1c52b00000000001976a914e083d3af5cf13b001b9c43ff732b70acb90f058088ac2bc60600000000001976a914f46cac7f0660d6302a6692e2fe0f8377c15f4d3c88ac0000000001000000014f62c058f3545b82eb8fac9584321fa0eda68c26924ff1c475324ee33e383507010000006a47304402205bc56c08f404d8d277940e2c1944883f3a0acfd073f7f2927e8052611cc88eb002202359bdc501567daae1e8a8e81a7beb2f83db610fdffa41eeeba4b290b855287e0121031101685a453a70f76d964c9272ea2929482b1d8fc89ffe47e7f8c1dd4ee266e4ffffffff0131cb1a00000000001976a914b46751ca594d064da6ab6c0651a32816f5e287da88ac0000000001000000012562c8cfbcb50d4ab9fe44032edc22554b4fa78fffbec9a9cfeb0679b42fc485000000008a4730440220130d845c08e186b5e50b89919a342a3f8c74e51b522440786cd3ac6e3b60eb93022013244eeaba6d8480b0fbe02783d3da86543e0539f16f1222d2f8fcee0fcf1f4f014104d66cec1b1558b367dde4501204306c7da71ae48e0acb132ac531e830e54c2cdaaf4ffa5aca3390fab824c1e0b0173740a864ed51b1b4ed155e7579f651dba78affffffff01a1cc0600000000001976a914d21b5199a5351ffa3a0637ef499d4ac639a1141288ac0000000001000000023db938d6d4e869e0e36a1a8d41f064d8f580613327ccaaa4f78aa21e842a2f17010000006b483045022100f38445f8b5d0702e2d3a6a7bd61cb3af00bbdf341de0be47792f3940db0d691f02206056fd91be5e73e154370360a6fdbd77c630681dedfb271d7f7ef435902918440121024b5ec919b84e45cc255f54ebbbdb35b3d5a68305a47127294f6cba59e4ae025affffffff8fd310452b8bb16f03ca4d20b1963bcdff863b37df4367d18ae78e5d61b61a35010000006b483045022100c469a6654231d5fcc929827389ce900ffb7db0620b7b6a4c2279cd85d017e25402200f093af090e52e0043b056f26411b14a45e2a3f188a24f821a4a38906164fedd01210332e7a67d31b31f68000fe8f0065cbc7d0d15f3cc84daeb75bafd1a119d695a0fffffffff0258ed1a00000000001976a914083198f86ceb900d73d894855e61af4889ea17f488acc20c0300000000001976a91466c47fe6ab7dba6722bdae7bb5176bcf0d9247b888ac0000000001000000011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d4180000006b483045022100a820b9f5bec918a24d6c2d541671d247c4587f8a2a3c142ef8c8b6e58f39acbc02200e6c7d87553eddd881e30d9a56edbc9218ef3efecd20f0b8a486b7e3baa9560101210361690799519988f50fe5b98ee58d8511fa7922b4bd2656dd8e2bf8a73f72937cffffffff0114b905000000000017a9148f5a19948e95635c222154d8ad2fb4afa2a342b9870000000001000000000101c3ff07f76d5b05404b80f86e0abf35c1a82d99a2300180468d69cd30019897fe03000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff05d1a40d00000000001976a91401e1d8141b66a50e9153bad9602b62548b75346988ac7d753801000000001600146734dac0b3fb153e3b02887ec930d5358344768a77a25600000000001600145bb86ba87d5eadec26b60ef43f90f41b538ab2ad318d000000000000160014822daf0504c44ad437d62844763e72d7f25bea9acc20aa000000000017a914c9003dd968df7175c44163ea9b933e785a39dc8e8702483045022100ed78cd808259075eb90938180c43af4bebd9b7690b1b5b0c67010e6b582c8547022009247c22019c6a2cb0696ef63491ef586e4cc87bdf80156552cb36b5448f0b0c01210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b7926000000000100000001649a335d378d2cdcfc54e3b2517c00ec02e36447825dc52d9bf88c747a346482010000006a473044022014a4565e70cae10a94c2b216b42d75d8df93c655260be9728691a172962f2de602200cb344aa4091530993489ce831df870b11c779e5f8b3267b42c89d1cc32ddd4e012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02e0391300000000001600145384b29c9549509e031b5c900e08dfc38c525111b6c1cc0f000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac0000000001000000017b17293cbcd822c4098a2e4e812198deceaa3c0d810bfaa56742607a58396b4d010000006a473044022024cb778c5a80a536ca5577adbeed3e6593af5da6f460e294ae9d96935574cebc02202530cad4acb8effc46709ea240a5d2b45c6f6fe8a6ecf193d973faae6d7b24b4012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02a7a721000000000017a9145b3f686108f5004aa0b0e8d2124b697d250d1237879a07ab0f000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac000000000100000001ecec567afc263ae173a14937d0238da2bc57c930bb1e87c0dbaa2607e25ec2e9010000006a47304402204e58bf596c5a4ad8fb0bd2a4296cbafc9baa2ac312f499d3b2cdcde92f5337290220152ab8505eb8644a90dbab4b6814526afdf8b855e08e42af8c35f5a74d38c542012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02d3c55000000000001600146671ed76fb5d6baaa18165afaa57ee4527d8ca8ac7255a0f000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac0000000001000000017de359114fbd0c2b20c54d34aedc17ffb4c3688a88f88ff70008e7c8c2bd28c9000000006b483045022100a169e796ae6495596512bbdc4b6904ee09ce4e1e0a3b6b8c3c06dafef6eae47e02206fa27d80b6a3f6bb0b307916bb49065cca164934049dbe9a55e59b84dda4cc0b0121034f4df99498481a0b668864089518ffec0690be98a12f3aefd6852419101a6e34ffffffff011e4c02000000000017a914fe782093a8ef2e66db953ee436a41f931911d74987000000000200000001eea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41550000006a4730440220250464f4d1511feb0b19fd6043991d70a5a72be601588cc32e67339c6b90ebe202202af2ca35d246423f9ad70fef55162ad3cf092dc032b66a2f79c2d8202c1243c7012102ab3636ede5667b74d1d3680338d47859d5e8072960f9e47eac1e7263e1fe8525ffffffff01305705000000000017a9145f7f7e058181bee55c062cc84f411290b1a9050e87000000000100000000010110b743a977313a4f7e7b41e4c86408db0fb4455bcfb5acf8331233598ff0706f00000000171600144b6d880516982598308a8d73014e67d28cb38f1cffffffff02d53950000000000017a914398b8121e1c8a476109d273757e7fadc1a01752287b4b94c040000000017a914b60b23924dd720be48f619c2f539b5fb0d2be4468702473044022026611d928108fa46da184597a6ffb0a3ca72bc1c854e88245faad853fbe93d8802202e51862730178bdf181557a29c9719feea95b107754d2851377f62d664a42c76012102519a39af5722330eb1a61e4eed4dede261fb6ea9bb170a0ebd9e6ffccc6550ef000000000100000000010112548b01aea1ae1d3e7774474cc59d19f9ea1d81fa61a4b1eff59b17f4db263f0200000000ffffffff044fdd1b00000000001976a914a0699f44f36fef79fc72334628b17ba560510f8488ac508ce806000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe348701000000000017a9141a9a2c2dbbbae4339ef6fc990e69d11192683bab87a8a40b000000000017a914665e43caf2d7d353604c99806b887fd858f2f962870400483045022100a07ebda7b5dbdc8096cb16b830a806f6e5fd2e7a7277b4e00968861bbe6165d70220148997b45cd365cf0edc3b864c10eab2b9641e6c1a4ca79d388329b5ba4c60fd0147304402206c38f9f324ae59d7f87902157871cdf0a5e34d18bb5f0ecddcc457d8ea1c0d0a02207574200cc8cc616fd86912ce78e0fc39abd95ac21b4348bf0e02816d8871e3c201695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae000000000200000001959f47048b99cff7f34909cd400ee441c1b77d05f5afeb617e56257d7f537c18000000006b483045022100d91cf95eda47d853fa638604b07ab466e18d60fd53a6da7a16a356c894bb00b102204be04e20fd4a88e37fc5ca928b0bb4519d6af69d1ea9767629c43cae3d1fa113012102b6ce7532851e710c65d0ec5a6df71c58e44798cd22cff642e3cae93fe6458f2cfdffffff0206591100000000001976a9142d7a334c9a924dc3407255b6ab4ed423e33b3dee88ac1c5c0a000000000016001407520778482a23624b248f5cc416dc84f90feb52000000000200000000010232d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223800000017160014f6edfb677413c79be9866ba83c50aa2590138496fefffffff87c36472c2318e93dc3f0b85d71cf3df46da97f0ef36881271cce04aa5a357604000000171600142339e07828b13ac6863f248ea250cf38220bc49cfeffffff012a0d0500000000001976a914aa1cead14fc772cf9c7984faedfa2a85315523f588ac0247304402204ef6ae6abbaa8ca16e4461bcce9e51bd7b6ea4f616bb52cc1d77869398b0369e022028387704702e527dd663dd7fce10e55999b0bb1ad9bec10770e943d90017c0b1012102d12251e71c8dd55ed81d78be61754c35bc5b85254bcb01296f299e71a588cca202473044022044ad15564ba66bc79e9211432a02793f559cde2af5c20141c746f26358355117022058aab33475b0868183ecb82830008e6e649b9bf33c1f553367616eb0a6ac1a53012102b23aa86c96383716f3532c4e81578c02be9df888443fb229113d4769851dd0a149a00a00020000000001029921342199caa50bac9b2e57ea9cd66ad4f35dfbe19be48ccecb7c290c76bac30000000000ffffffff8d2b5e409b220eca10312077cc2c05105fa69a876d07cd826b925d86acdcf6a60000000000ffffffff015caf0000000000001976a914d9d2b3f9a9f18bb644c13baad5c744da1aed70dd88ac024830450221009cb141a04da976af751f9002949ca4e0164a7063ff5e778b9049d3a164de308e02206723d1fa7b9759e707d7e05663857bf20e7e30cd1aeaa530fd6d13277d12611a0121034bb9e5fa8c20c933df8f4b3c04ecbe41a7a11fdd19e6bc6eedc7fe29c38c9513024730440220659360ef8640d352d2a61a2b6cbded4ff43b51d2fe789c71c5fc314cf5ceff95022045dfeb9bd5ea888491a236f395115d58b9ce4b01fde01a85e38e6be3a81f17b50121034bb9e5fa8c20c933df8f4b3c04ecbe41a7a11fdd19e6bc6eedc7fe29c38c95130000000002000000000102c7f06254eb119196963785262fe28dc796b8810de68ffd779f13184d1c79455f0100000000ffffffff3a4217dc5802d61df2ab0a47c81cf3f5e20ea64528831f1cbbb548a148b9c462000000006b483045022100e373307149b292f6362a79c9804261f21c9496c46e958339716d18cf4bc8194802200bb1db0a0ee62125099e592d26fccf7c7a7da254b205f68d113dffe606971c0b0121024353f1a82f8a1810892b731c895671ab9729b909465ed8bbfadbf1d8fb864ddcffffffff0126d20d00000000001600140c92b4b9c5a3108888a546502fa53be01cbc9236024730440220074e9eac985da6c183b1e1919f67f13013a557f244d262b77943d63f1e86293b02207e264940b2b3ad637dfacb0edf28cfa532f0af42261374a148c3adffcc515f0e012103b9460c4f5c104d7c6fa3f16b2d6dd2a1deba7452feef2dc65b92f9cf14c205320000000000010000000154bbb7a4167b426407a76bdf1996892ad92cbce74e9ef9b10820ef4048d1958a000000006a473044022042eee271333434ed8f2b19590198a839afeb5f9e13f1ad3f5e3746d0b6b925610220196a8ade41cbee4181e335d9fc0a8489de02b00bfe453b427f607dd5c91aa1a40121034d84596543b6b78ace73c07f8c51b7a7a995d9d8f8b3d403a3a0b4b4ec27d2b7ffffffff012c335600000000001976a914eb05a7b152b608411f7f39bf9aa635bc0b665d1988ac0000000002000000028fd77ba9639847e00f0cf952cee27817f9bdff9ab3e04963ea07cc4b2cc9c437000000006a473044022013df768c8ca58c346cbb5af0245cc4d40c4ca486480fa1446de1b9f4cb240c3002200cce7151a9b95240e782b97a8871831f14f0fd306d0d09d05192b83aa191f09d012102deb8953a4ba580b66113bbfb32d109c5c07599ef942f59b17dbfa41eda65f713fdffffffc20eae03f12891f44cc4a541abf6303c3e40f137df686ecbad8917c7465bbe30010000006b4830450221008e81fefb95d76e19ac643371fa4aa2325c2036aa5341ab6781cf02ebfeb80f1b022038bc741f4971e263433bb8c0c9608228de23fff8f18bf81a4b3ca21b0aa03c7e012103f617f3a55018eec833fbd276070f6f1148a2a56bb33eedd8599231173b9b01f2fdffffff0181d90300000000001976a9141d9caf00af4a42d1d0aebbd628170f9dfe4f27a688ac000000000200000001d6dba4979ad80b8cb40058e2140bcd4d6ef208c5f36731f0b65347400915b945010000006a47304402204f39a5106b2964ba8e45c7994a83c3eb6dfe3f562c32157f837d58c40bb2638102202835cc4b26cff9fd80d5a46d6f06f66dc10dcf022987aa83cbd424287b24c1fc0121037fea7b6dc9801ff86b2adc2e079631de3adcb938673eb19d5f8700e07e6fa448ffffffff02d0660500000000001976a914c67b091f86ba5b097c91a0f7c76476472eb3aa9288ac7b190100000000001600141b0db7dbd78cc096d7666d7986fd62662e85336d0000000002000000058b501be8f9657fe902f6a6bde0a717fc8ea23e9329d7cb65026da47569c6ce54cf0000006a473044022061002accb5944892d6e4e66a10d158f55857821de37e988a9a01bf67ebd02191022040ef28d6836ed75f39287fbe9ea3cb52fe466fbff05fa2943562c39ad67b495c0121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffffeabd6ae05487b878b879dd831cc42a88f071113d60ce5069b39003644501dd24000000006b48304502210092b38d8bf6089574336309663888d8ef67ea550cbc19284564df36af90894d9502201abc989addd1724be7e8579f94462952dcd7f6817fe99eda9b48a8522790d39a0121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff0844682f3e05b7c7077680c88cae79b6e7191a70289adacb02d9e77001fb801a8c0000006b483045022100fc6de717a90903e9a7c2528f2ad97bb1d2279478b5198ddeae5510267fcd92b202207f66e70852f1582b5cc9ce802cdff0ad10e71ea72f441ed8fc1227ef1fa55e270121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff8f8054ca8fe98b531c6b8fb014f28d1fbe9756a323e4c3d3cc338cf5a74ff7c8000000006b483045022100ebf5cfb7444cb68175b759b9590be2c422ba25a8b4b11379f9d5ea216f8d860f02204ea5ca52c0cf7b4fa9ede1cf1d1f2de86d0b10601676d48bd57c5c50ef36cbb20121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff1339afc8b62c8e4718a797d19b6d480debd90d8ecd8cf6461f0f9d48be6b44d10d0000006a473044022003de714e6ce322a7f11702bd5e9d0eef35c0e94c2d437378847f122e29ab276c0220503768ee9878d95a275f4f8cb5ac8c1ef6570653d0a565db9628cc667216bc190121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff01b4c61000000000001976a914132ae44bf69e071b9262aa444c9f943b65573ec288ac00000000010000000001011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40500000000ffffffff0220120000000000001600142af5ec8f6c9d197d5920bb19133994178d8284f5c82c0100000000001976a914d3bb8a9cb47bf482416ddf4439c86e46cfa692ea88ac02483045022100ae007d65036fb98dff74159ac742637c81ec7fbda536db3ab0b81c4f596289c2022069db7f01cd7198c9c187a24bd620c43af1dc4efbb6653f93cb515750c565ca1b012102ebb043a8dbe108f42cf7768d73962db7c7dd901220345c2e19856389bfdc42b7000000000200000001484b2dbc08fc84cf4019b5a6ad8df6ef2c05576d166406a70c593723da1dfd07000000006a4730440220526e0138a2fd5180680245fefc8ed5ff87427d3ee8f4d2617b0a9838326f965902201b1b22dc56aedb1fab18ffa2fe4a7ce0892ee2e5e269a703f7b34167e5c0ccda0121028b3c568e6201ddc0f78de7f87277282853fbbb32f2d0735d66e7251f63909cb6ffffffff02a0300200000000001976a914adf892ec454a9732d7806c9a71f25bebf7c4a44788ac0922010000000000160014e7e53ea078e79777e138a38df68ec9b9952df10a0000000002000000000101d3f6f9271b60c1cd6a5f70c09bbd09508db058a0fa67026547f39b0fd56f9d740100000000ffffffff0228fc44000000000017a9149ed93115e87d23692f1b8bf0a43d6b82e2d830f687ffff2a0200000000160014b2adcf0eddcf8555d8d1624b9d9a727c94c0aa9b02483045022100a04b4c785eeeaef1ce1e84c889bc41fc18172f633b49f7b3f59757bda9a9cac902207f385565659e9a211d2f9cb93154c8a7b2955e2b061d7095cf4ddf89cb2a66bf012102524a123fb6e9b93ee68373189dd72c215fdf90d2ea905e2aa19ea939527af1e7000000000200000000010153756dd54fd59b6da4b903b674c6441a6acfa934d992214ff67bb7fabab4816e1b00000000fdffffff0b400d0300000000001976a9143ce7dd291a14f80a16dafce5f40d6c24bc1289c688ac18ae01000000000017a9140bf816e2b39243305f8e854accd0a779151f30e887497a4300000000001976a9144ddbecd5e07cd071cadd0142790cd25c5e62f32188ac5ff50700000000001976a914bdfcc8484e6d478282fa0841a1f9c8b8d43c2bc088ac4f3302000000000017a9146d666813fd7b9a886a31d95534fcde6488702777876e2f0a00000000001976a914f4458b6d6aa2060ebc1884f659fb47dfc6314fd088ac5c49010000000000160014f760eb72a1f440a9f7e8dec94cf26832cbf2af148e459b000000000016001467d06a0bd17a3436c7e0ea3377c5e4c90f0334c8f69a01000000000017a9144657b503169e3e2ecfed73eed1b0a6074f90bd7a876ada06000000000017a9141cab2ce846908fdbbc8a0e8beef92d83e24ff6bf87eb96d30300000000160014e9c5b9b8f14984869ee3cb0ab346bded395b060902473044022039a8443df7ad09085ac2a4f428ea1ffd53877a4a7d34c4ed3d978252599627bb022078061974ca4bb6020f07d7ec70aeda2c2df53187695f6e460947dcca5b6da2390121021fcae3c61916b9650a534dd85b5be77144187c50aa78806671511bf7a2efd6720000000002000000000101d074cef3d5eb44fbba1d3911ae701bb21ff1dc35f083fc4a2a5d48ff9bdbcfc90100000000ffffffff026563010000000000160014572903b65688fa34ac995982126f8a655da4909049bc06000000000017a91436045bb1952e78c45385b70b3f12fb5852888d418702483045022100fb624ac40694081b2a546204b327e226071ba492992bb182664a2e84b656607c022035caee6fd0c7a217ecb4ed348b9ef1ece17efea42f8e8342a3794ec5ebab3322012103b9c5a8636157e43fca970d9a4b29927fed895349e41d3a8028533a7630298df80000000002000000000101222146404365abceb27dd1593f43ff7f3050efbbf1e533b48cc983bb386524690100000000ffffffff0225cc0c000000000017a914db193f249c4e8411fb5f9dde53944a9410321f1387097707000000000016001412301daaf8f852910be8eb5db4f9a4a9f909a39a024830450221009998bfbaacbaf9ee2925582e69c2d8b812808e4afef526e2b6ab121aab047f7a0220097b73540b7ea4e8817f25e389d43d50e757df601b7c6b8623695310c1f348e901210267ac84e7f5ae232650f2e76828a8c59ed37251c566979ba88452529e951d0a880000000002000000000101ee287514ff03bab6114212e932fc57f35db8285554d042377786acae937a49170000000000ffffffff0272de0900000000001976a91462d512e5057bb07db57b6ed5bbfcec01f0bc50e188acddab8b00000000001600141f5245ebe7f5ff415112e2fd0dc16875d490313002473044022029d6ac8ee13680409a4a76c31fdce445400fa9cfe820bba37701037947356b97022049fb8f7a74442a9fa5e4b5b0c9365a4db1c308092e761a9c27a99e2dc9640a500121023591038122ab5e401f2aba080c021862971f516cc98f8f1bf4de098b473afb8e0000000001000000000101a95b21f9827f36a3ba8f0b8d276bde10ed1b0de048087378ea2de1a1e0083c540100000017160014ce814f3ee635dd92bf7a06237f307a2740ab9c71ffffffff3dacc001000000000017a91448ecdb8812750deeaada86c1527081e98ee5162d8750c30000000000001976a914bfd81bd260cc4e87825de60920cf9cf201708fa188ac79bc040000000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f95cda00000000000017a9148548f00f87880256a176ddf44705c5c14f65c0648775c60000000000001976a9146f33b0c01d2fa1c7ded7eb37cfe3acacc857160188acc4bd06000000000017a9149dcf651aa19e78fadbcae7549b6f4ac10fcb1bce87261a2600000000001976a91485f75ad424b51ba1d882329e1ddb47d83f8549db88ac028d0000000000001976a9144a2a3d0f2e927ad42a389b630dd5235c9627ab3788ac35b50000000000001976a914963fb7974abff2160d1b181fadba7c6b23683d2488ac3c3400000000000017a91451d40aeb690c8b685a86cfaa778f570adf84612d87530e05000000000017a9147c12c698cc559c97409fab14ff516fff3ea14af38779c70200000000001600147350e3745b34f6ed46ddc8b1a2ffba3ef970ca123f0201000000000017a914aaca1eaa69e2bc133d96ec8bae918fd70f700ce987a0d700000000000017a9147e08d7f46b5c4d2d85c32d8d70e921968b21c94787fe1701000000000017a9143146ba983a7a93ede8e72f245cb5358cfaa25018879c422000000000001976a9142091ec52d6c6aebf6a65c1b08fb7ef041052f24588acef422b000000000017a914cc997f710467f7d091f9629779018c473b9f1da787b7c800000000000017a914d81ee6704407ea2dd471f845952781b04a5d618287463300000000000017a914c44a2621fd88d6352dad6123133e435dadde9419871c590100000000001976a91466ff4df61e7cdaedcc97401ed8e74e934cec6c8488acfc9a01000000000017a9147b8fde8a190f188d413db80e2fbc2bfdff0fe82e87d0bc0600000000001976a914279412184b0706b9897e50d1573f025fc0cdfa4b88acc0190300000000001976a9144d3b3ecd6e58e22b1196125384770a893679589e88ac5a3900000000000017a914fec87a6903a65ec0637aee6773110d2a7f62307f8759e106000000000017a91454a2fa3178440310fc4f174f450b90f2e2f9ffee87539b01000000000017a9145623153c0d1ffa5c3f0822433eaa4eb8d832e0c88729af0100000000001600141e5f94426e057c93ae9270accb33ca484488d6cd519b00000000000017a91440f08e20c84970936ac4ee32fcd78752580e532087f82001000000000017a91497cb91a081707a216ae6a47b2c1599462fe4aaa587a9590b00000000001976a91487fc1857031d614ba670c80317bafc0b1e87967988ac864f03000000000017a91485ecf9353d217ebc795edaf7e287f68813e4bf8687bc0d0800000000001600144c92aee9c2bf5022b6db531e78c9c55b81ece2ff1027000000000000160014f4e89aa342454af268efb0965111e1f524707e6f06450000000000001976a914e3820757292ca3c2c778d7da76fe270fef0bd7aa88acbc7b814a000000001976a9142008ec6b939ab8cdf40eb03dfe0196b7fe531d2a88ac6e0b0c00000000001600140bd4c27f29337dbb205c382c8f9789d6ee3b6f5eda380300000000001976a914444516eb3a7b0cf58008e6e4185dc003201e001288acbe8c0400000000001976a91493b9505f8d6887644890f7ae0abcf821e986a27b88ac35380300000000001976a914cb77b4ee3461b68035e67e99d828886a40a1f4ee88acf05500000000000017a914322dc9190de3e240cc752c16928aea5745c39883873bc600000000000017a914fb0424513c3d27bdcbfc1d0ffe6321778d7c588287540802000000000017a9142bcfa4a1e187a61d4ba1f306ba6e11e8758eca4687c1a82100000000001976a91471eb0f4697641308f6dd33f87b747595457de53d88acde66c1000000000016001438e20c11c921216d5f9e57d14f38db3b232541467d580100000000001976a91489e451720f0475e8e00071a47b9880d45409911b88ac50c3000000000000160014cbb60e7903b275b3157e686f10c28639c8450f5afca301000000000017a9148d8eac7d7e211c88f7bb5401bb374f04f237feca87102700000000000017a914e9d30d95d6d205183d1fca3925d54bdcade78fc58763af0100000000001976a9144d3b3ecd6e58e22b1196125384770a893679589e88acd8d600000000000017a91423c7fcd3c6161e2476d5483acf961c16e14af63587a14b0800000000001976a91449b1a4cc09546f436a5e353b3841f3b836c934cd88ac72ad46000000000017a9146281531776ed5df30ce6a36f95617bc9bb1cc16187bb610400000000001976a914a1fb6332761a2d47a3aca8951d3d623cf5b6a81a88ac3c838e12000000001600148c5ebb5cecd111731c2203c7df5cdfacad62166d54bc01000000000017a91481d45001027f7734b2743de5c8e811f671c1c52e87a56e09000000000017a914738bdd9a800ee89ab41875fc640f104c12e5600487c01c01000000000017a9149cc2a1e68b362ded8d4900807225adfa79c01bd2875a411b00000000001976a91434a75b61bace13879385a04f41e7be8a83f14f6e88ac6bf902000000000017a914f81880a23d01cf0d3a652fba5c7b669d592dd322872cb50300000000001976a914943a07b53822026cee4fa96456d5b153ca03644588ac381b0a000000000017a914250ce92c02a9fda26891b3d8375347a6f7188b8487024730440220577b4f6996f33d61129d49a24472b46fe27371ca2f639ec827ca7d0e4136db870220398e788b47796c0b9cb2b95243d8d1f483f566ab0c329dd3f65da171cf798ce0012102cc2ad3ee2972ef682d1b7ed3e2bd54c2b1fae6eb2af865bc8b76610789458192000000000200000000010240e155f5032797e4e77c1bf5d6d0c78660fcd18b83529e895644edce4c23be960000000000ffffffff155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d2b00000000ffffffff02ef23c1000000000017a914f72cb2365ae93c9891cd0d6de913ac3fe403d403872d4f01000000000016001423bdda07e816e040d675dc36e21a434f8de620250248304502210080f8b9bdb87c62001d2410b7eac228d065d2d98a0ceaff2b86a563c68c66fa8702204837d20e4100def94d2fcd5fb1da4ca1c3eb6a75ad52b22be66c853b7409c37c01210278793d925b560f68f96cae543c5077d3c28db37a22e7456893246dfdbf51dad202483045022100958312b577cbe7f17d26a2e761ca4a01bde33a1c6be9be433d1835ff6efebdd802200463adf7d281f34975f56d4e8022aae00a2a5bbd3ef322cf8a7febb186fcdd2601210223d8ec50e69c063b6e94ff0ed5aaa50f41304db654fc08d5a7dad82c64a4770c000000000200000001155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d2a0000006a4730440220548a6b0bb8d0514c1f4891affa8e351d7474f142f75a66a162ccd31b63c6af9902200ad31d39d77f72067f8faf21dc941fe327ceb455c7e6bbc548f3fcfb2b27aac70121024088421cd0760dd1b4034aafeeeb0bd2443623c85d781f521a14fb9c658b6959ffffffff01e58d21000000000017a91409610e4bb3137fb30308c05c7f3f2c5aa666ead5870000000002000000000101aa14a5bb654552acda512a757de99cdc516b7cb4b0f80c7e3ff3233123139fc10100000000ffffffff012d68020000000000160014529bf39e59969c998b60dd445fa5edb924512be00248304502210088c70b694cfb099ce7cf2298e9de3ab1ddfd2b183140d7a8815b5a48a739a6dd02202699fc5908644714e5eaa44b53698c941dd7247586167ae34baf1d1f83a8db71012102a69359404c142b3de26aae978dc410a0dda87234623832581f007b9e8b40521c00000000020000000001022e1d88779ac3fa00429e1b8a53f935d063ff597f85c79f11dec06d513765682a0000000000ffffffffa10cf5fe456edf97b5e7c5c91d31ba7bc1a8e139697a67a9809a6e9cd42ece8e0200000000ffffffff026ae107000000000017a91432f2d1dfbb4791630a093e53fe3dc27a6e43d714879c240500000000001600142fb5a2063d24b71190176d708414f324e71b64ac02473044022007723385d7a9736b7345979e66870afb03946c6094f773092422a0a91b31fb3902201a6c863014fead8100843488406c5c46a17573ad2fed2a1cd81e926fb6048e3e012102bbdc125ce01ca3f8ed8a488367ea67e425bb6490f4c99a57e65d7dcb52333b2a02483045022100afef8cfcc432da2d89ebd2233a35b7a88e6eb0b4d7cc40b643e1fb2df90bece60220447bd3b1858bdc3db04d7876772fedd473e261f928454de4adb864ab6caa3d3e012103ec12b60a80b2c510e8df713d7fc7c7ba17e90242f83c02751bc74ca44f3c5edc0000000001000000000101a95db62bff506a01d509b47bfa337546993cd27e0bf85ffe6622b9c815b0b3970b00000000ffffffff02ff430500000000001976a9145b84e64e52473fc5b7873de48f71dbf643ed813088ac0041f40700000000220020956609b12032a75cf5c65ef8f3fab5986e7fa233a769750a935fcb5c5953165a040047304402201780e67b7630463a00bfe16a539f6aa1efb64c7019b050d12170e49d035778a002205f9b65dd2dac05dcecd801fd5b73c7d37ab86eead4d4eafc0b6a3beef0dc74c80147304402203d47c8863106886693054d02e0a902e3a6bb244097be23dc95fc78c987e5747702206687332d54065b1e798f7799238c7d3182b0a528b64306a5e91e3e82d7ae36a70169522102363efacd7222151f035a393dda68811d38e2669564aae5a2d81cba433c4a12e221020c1191bc07ccf7f2380acdb40cf6aa036304ec36054fc1447e7311ffe9f7abcd2103e7a98752d9e0670629091a5a37d2d3d63bbf0bbd64a3e17e286f5c5a8a83545c53ae48a00a000100000000010130e21e722652262dcff03d556c457991a88da23588fedc97b4e285a93a225c3d0c00000000ffffffff0e92470000000000001600148df00a846369d5b6acce4b1d744df96da7ed30c508cf0000000000001976a9146c4fb8f1c00639a94ef0a46a4681d41f74aae36988ac204801000000000017a9148f3d4351abd4faba36df0ec845d4d6b73fb59da387a85b0100000000001976a9149c98ef927890cf7ba691c97f3297272c4eee2f3488ace0930400000000001976a9149a75009e644c48df3d15a8d9bbc0eeb4e09e07e588ac901005000000000017a9140cc63fd87d5cb154ef2ad5fc432b85c52066b6bb87c9b107000000000017a9141e762f5ec6a613e3af527d0c0f31e02ac591e3c1871f0408000000000017a9149a9f3b926f810eccc2ac05e408f247a7e240716c872d380b00000000001976a9149c2b0683df51a724948eba2341fbf82b907d8e6788ac9c0a1000000000001976a914726b3cb79bb953f74af4590977dfeac6df27fe0388acd58c4200000000001976a914c748c3dd96ec1cdbf8d1993d3e7c6b31f5d7d80d88acf1064f000000000017a914a5ce70788294c38a88bcfd5be04f8c2448e46ed087ecf469000000000017a91417ea6ecf5ea9ea10ab69f2cdc22a6967ff4a3a1f878d66290200000000220020b4eda6de0189e99554ed63de11654759e9f2bd81b7407b5f54253770b6a026bb040047304402206d6127efe662739879182d9d7b2e5fb9f45a4a589c22aa9a5536ff797ee1028b02204914a2023ef5745bf9abacf02f1ebe1b43b9ce61ae00efe4c8df747dd8da85400147304402205d32406bccec2d3e385dbb3805df27f6e6d24c3928fbc5be8e37dc04661bd4ba02203c5ff106fa49bce60b25807d2002f77133aa884c5c71c566b2c57c5a7f345ce6016952210225dcc70b0332784d7de31dd664c2cb53b0623b3bbfbe551747e3cf63cdbfe45f2103e7b85752a99087d34da45027561bc78724565b62f37dafa84c31394ff36b6b6421029b5f0640870e6c9e47234932ad542302e12b844a317a4238cbf87db9bb6a0cdf53ae48a00a000200000000010116a809c3e50cc5d26f0865d92eca0876860f3324151c70d46743694ba888bb4c0100000000000000800162a800000000000017a91414faa50dafca7c1fb6a20ecae14a1a554f5d7bbd8702483045022100cee457bfd0ab9a127e1a193b2994fc4af20b57f40186efceae406d6c456dcf3a02204ce1db0539bc8544faac7a76b013237f4b12b5bf85e3c0ce321a1e0be8ead6000121037b7b82ebcced822eee2571cbfde6916b2583f0aa9f203ad06e219048249aab9f00000000020000000001012462ba04c8798c60897de129c1e2701646486bb9561be866af59104aac6a39b00300000000ffffffff0179580400000000001976a91433e9e74b137797d3836e9766da3341fe83dfb44788ac0247304402203fef16fd0cc02c033a8249599b7f532df17b7fe9a29b40031bb6a644d907c5a002206e328863f4da81b54056878ac7d0279da8dbecb406ad05c2a01af03de1a96a3a01210272faa6611354e69f2399978766ea593dff9afe4244b0ed9f84a8b12a5a9b7af50000000001000000014652f161cd5f0ea838804316b0d5a8be484421995714574a5b62975e9599ddc8010000006b483045022100c249b7c1f2dc49a4222626185c65269b9737732c2d48d87bc7fe62a9a6e3409d02200434793810a56e142b0bb6694bec489e3732085583be39facf2e645303375b21012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02f37c67000000000017a914361337806ef662cafd5db21a772967c6164cf44a877e95f20e000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac00000000020000000001014dc50ae5361c8fec3662b22d22c51ad2561db27b0be28a1672125d42b0f005fe0000000000ffffffff02e4a31400000000001600146fca1a4f94cac11028fd054da6af7c93850a76ec6dac00000000000017a9148f174a60aebfde07c17f27549c21c7208fc95699870247304402202a0124b7360c732abd44c957e75e590318155ba2d8035395faa6cbd2a9a53b2b02200f4871e609f48916f8a5703424f459ed6ada3170cf657bfdb174fa9702be6f8c0121024e9ba508389219443215945719ca2a091a2641e34c127ee37c17479eff56af42000000000200000000010891469531c7dfd0fc9aa2cb3b1833e1f289f80aaadedee8f248dc62f96fcfce5a00000000171600147a21299f175487c88318984f51549240d6a89d8efeffffff590e3894d07f44d99296b0e9d893a1e5bc2f19dac92c14a6a8cc1a51eff95117000000001716001414557d1e0ddaa25cca47b4c7efeedc0c036e276efeffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c70000000000171600148dd462dfc8c72418176f66a2a488bed1412e167cfeffffffced968625ed8e16dba54cf14599828fedb7fa869b0808ce9a8a4d298102eb1cf0400000017160014e834dda6cc7ff98129abb5fa04abc13b46225dd0feffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9160000001716001471207bdf722c315ed7ad6242f7b39516ab14c36afeffffff29e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec1180000001716001425f0168e1f258494c288e4dca66c6ab20360af9ffeffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da1400000017160014d0c1317c00d78d9f3b70847ad8e2afb4484103dffeffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e26000000171600149eda1213e1b06992500fd4b9910eaa098e6c7ab8feffffff0148a521000000000017a9141eee4c999d4cc0025dd86b7176c75f94b554cfda870247304402200dbf62b0bad49007c9d164908974cd3fa71cd187dba2fd380de10e172367830702206839caf806cf6e8f010bbb7017f513a45dcc3314d0ffbb4681c09a2d5812ce6e01210212ab446226ce7ca8a43ffc80e0d5dc8c7dcf9813c57a5a73f45c6cb46f555120024730440220522a25d0c213a41ff0aeac15fb86002609feace221db95bb06cfe0215f6bd847022040275bffbb4eeb77d1d7b5713c74543eb94bb973e7d3996e43b462315c193c660121022e3153a6d2e6fe3cf98206ad9ec6917c03e035db3bf654e6b2d89a5a76d88a7a0247304402203605f30d7975a1f9a46ae6ace1bd34fb74afa629cd0fee311f93707382f739d102207340b213920056ed8f3e6a90b729630865971cc79585caa76b6ecdab1d39857d0121030a01ded7803612b89f2b952260671107d79b1c9d49924419acad024a5f2a4c5f024730440220211bf94034f26823f8024fb10dbab563f0370a6551bc999437519a8a6d59e77b022028a2daf34edefdfc85c47ce278fcff46c4d84935586b3ec810b92f6538c8bd25012102b1ed209c3da41cdcb1412c45b63d74a524b071c7b59f7aa4139b56718e3aeaeb0247304402201d3b77c9a21d4fdc0dbcc647679c4f296b811f166c2cf1f6e4eb565c8f72f3f0022055e5be28ba4b9d15493657e2f35539265fb50c18b6bb9f356eafdf711b84591801210355e2d6eec221e41fcb66a608f99870bcf3496042be9f198f9e804cc346f02fa80247304402201d3fcf9da83931ff6005dc486e5d89013dc7c40238988ecc60c88154d941cba102206839dd8f68bf6f4ff28e1b619b80f3b8069bf7e85f897cd0d7afa53a934c627e012102d27da139b52511246685576f4cc9518c2f74a11b334682419e9344996ba47af60247304402207c093aad9e505e4a7c80f8c5de7f5c37a5690c75b63dcf6051e1f845d4a072440220289edc906774d5670966b89a5ce338e2baff456e52e0e212162c0ef9964ff2570121037bdf97324104e7eafde484b9b634644d29f257a78c8abc0868c37bd5311e94e902473044022026678c6a631a604662908daffcdd1ffd4aa1c1543f279d570e71065367a25e94022020f896d3ab9229291040490ceb4dfb63a5245d0bec318a62c2defc1109ae8dc00121029e7728e98fb2f5db14cb75a659477d50592aee2405c50afce465e7d3ccf8551349a00a00020000000001020075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c97837000000171600140cfb0df39023f50e3b562ce988eed61b2cce8d3bfeffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac0d000000171600146db26475c6b90555a4075d03c77d60c62a2cf0dffeffffff01ec960200000000001976a914b64301dc970ea425b7745b1f43a543e6b6e497a388ac02473044022049e36fb2b9fab898f775af548e0483a39aa04e0f20854f17525e97b39f66567c02206c25a142f01840130944876b09ebb58ccea29677500586b5a889e6659d9de7990121031e24114acb4547a55edacba61f2f78864ecbb2a9cd97d5b7eca8984202f9ee29024730440220091d9c438f0bb2ea1f1afb18ce7ddbff9db584b07a66c9c9d158c778dad1988e022057e87de950fa0ebc973ee67d123bbe6c6352c5a1576a5f499a570b98a0cd54f4012102715b32f2bb02fc763214f1ecbe8e655935c6bbd431c1ee843f2692061dc30c5049a00a0001000000000101d09eaa4794eaace392188eeb5290323afca8a5cc4b716ef1742ac2fb7e10b2880100000000ffffffff0240e000000000000017a9140f76b2e0ca0b1048bc6e8287b3047a50f88515ee8730921b0000000000160014d654de25c1982a56fc9b4d6f613db44894fa304b0247304402206a958cc2f80dd7602741d1c6f081790f4e87af4c5c8cf80ec08eb1b67d06fd1902200e7e09247c7f5233c94ed6fb666e0a30d5ac0cf043ad524b4e051577caa2c5430121033fccd63cee44cfed16068ae0b73b00a82991c409ad2c9541fe4e260980be9aab0000000001000000000101ff7b8c179571988418b547e6d4c6d3bce9ed8aceaa68d4f3d7eae4762fa36a500100000000ffffffff0240e000000000000017a914cca1aeee6ab32cae8060a44f446e8424659f486987e8a51a00000000001600141f0044c700daa71b45eb410b36c9c95393c61da40247304402207b71115bf3a8f164df1b9a603b7bd2e5c0700c9236e69502c8f8610c9ecdd12602202b21d8de1be2d8eac7b6db337dd173b01845ca21fea9d61988af4e224077f30c01210373ce3552446e42aae497ab850a1c185f453b4c9ad05bfe9a845f0cc5fb1ad6f000000000020000000001041eeb43af781c5904759d58fa0bcbe19ec077b444058fb252fafe957481afb7661800000017160014a6303aba81c456ba145564ca6be56f2044d907e6feffffffdd616f0b57fe66e8e519c5f320fb519c058f2034e971e2b9add94302cb0248781f000000171600144b6edd35800d762620faca1dfb8a23d8276bbf19feffffffbf23221e1a7540397fd9ab48ace68a6d766f6012f9ef95f931c57b4dc0834a9c170000001716001446ef6fef12789d6cfdefc929f9bb0dc32c932f67feffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb3f000000171600147929a749b4a0d6555e55454599f617ccc2c04dbffeffffff01a0d700000000000017a914f7e3dc4d8bd2e86e287f0bf563efcd97a8dddd22870247304402205b4f4d897d6f4dd22c6c46845138417212c9600fe37cc104ba973f46e06818e702207a4212e1998ff79ba42a30c0d2237ca938561228061c71671db517dae9feca20012103e46b2e47f98257339331f7f39bedfd062e258440bc42bf472c5453a54aa525ab024730440220256109ad64e0dd8cb9297a9758168c5fa808baaa8b2d2ca04f1626759c694a2e02206ef724752778affac467b4b1cbd134e23404dade9a01e668be4bdacd4d98f016012103a9bbdc37a6ce2d196eac75096cb564971685432ced96a14cb28e87bc0d643a950247304402201a220d664cc86df21c186f5bcd9a1e1db2502c48ebb03f521193c34e9bd1f656022073748ce331fa22055c96c1f35d5229267244c0339dc847d0ae26da247c5e663001210269959753a9faa965b85514b144a1071bd7c02be67f382d130d41b67fab53700402473044022027ad618b59c03ea982265af04db088348adbaa9b80adfdc737a72be98217d80f02201f370e21c4c5ca2ccb3ccaf18542ba824d842cac54c82f3036978bb0786d777701210261a00dfb40352de361b8fc5cc07f1e4059db1523af1eb28881fea7861c8e7d2749a00a000200000000010187f80ffd343196908903ac2dc877f8c699230df7190f0a67440fc02172c11f890100000000fdffffff0295d40500000000001976a914a305a24094f4c664df079c0824949adb473aee2888ac884e0200000000002200207bb8f5802ae446be4e5f7dde387ca1624faee09a8643a8c16ff87df4235e2584040047304402204d89b4ada9376c65fe3cc740747313b6271b60d0d5eed91a85193f8c492d838702207ca23fbaf1e76a91df0c13c46c8994c2bc064cee64dd0a80bfa3a48f4f29bc1b01473044022042a1a2005f9dd99162246bcef532573d5818e2602d38415d354c270f3648edca02206735e1f5369abddaffcb74e2111603ff5c83a816cabcece86672d5fe71a20d6d01695221026f1787876e7c4be3414fe4c5455a3aa4dd20e2bfb21acd0d7fbf24f15770d07f2102827d1757c652484f9ee5f14dd8fd4cea674a4bffbef8a19d24bff6f7c0e63955210374f3e239bf6a0b988d6bbd1798fa32829ceec30f4d345b4be172190d9e805ece53ae0000000002000000000101ca59b4d30b5f9a0af5681ffd877542cf86c551deda55db0c8e125c2b8a2141240300000000ffffffff01c5a802000000000017a9147fd61c0c34d29dc236a28e4bbfebdbe036cf965c8702483045022100a7251a956273e3bf36a54aeddc62b66ec941c70bd592b2f165e14e251b93e28902206c4c2c5f4c58837fa10d326509781ce67a4858f3318569043f98b75bf5be4db6012103028a40a4bbe799eecd1f10f4aa149143d31e3c1056f5c4d05216cd36413c12530000000002000000000117d63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b390800000017160014b4ed6484f3a860e8bb069f354d0e220b25f9d109feffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b390600000017160014ce48cd22632fb31c6bfc63fc010e5036abd1dd03feffffff73ac59473b478a7476aa99f12ccf7c5e8906bbe9d2c53b34d96c70a7ef39b683000000001716001478577154d02643fb2d3438a90ccec7e3e6abed41feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40b00000017160014e6e4e24387c4305530f6c9731f5817e4e492b243feffffff5f8b572adff521bfa0cc35b0d4d8ef613978d302344373ed96d0c75e96fe665b0800000017160014a23d39c734d65824307914922c945aa53112a325feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40c0000001716001441343f59ac45c3dc2c455ccd9dc24c65e6a76e06feffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b3904000000171600143b74d1e91cc9c79b507b9972dad558edd667e243feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40100000017160014a68dd4b33256ada059aa224f5e2e0d3afcfc25e2feffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53220b000000171600148f479c9ff83c30f893ab078bb635ae835da8db4dfeffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1565700000017160014aa486e64426b212b8c33b83134e061707b46b7c6feffffff92289cf4892dd407fa20413ead67de7390f080f0148791d80d98b02e699bd5740000000017160014cbdbee87445f5d380e8454a9794c622acfe2c18bfeffffffeab3ce080eccb5ab8dbb2d8322fff5f9ba220f9d2c6d58e351ef12db602c95570300000017160014277199ed373d517c20ad77b044cec8ee954592c0fefffffffd86aaf41a8dbbc61827fece848d539d296602bdbb1dcad85e95679351985a5b0000000017160014706fccfd9db231e216704b8b6444cdb30544b06bfeffffffd83daf03521784f2e7788ce457b0236a92952d9aee8a2cd9a0307031eea816f00100000017160014f5b098ef0a2d7efc4df25858d7dd9a29408cd063feffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d10c00000017160014b0128a2ba61e910aa629178dbfa6958ca69bc052feffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b90600000017160014e50f25c7489022d6d157d06dc83c9271333a151ffeffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e24b000000171600144cb0ed09f12c4c3a2710d87ccf5577742f7b1c38feffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b90d000000171600144a215a093a8e4f0e7045dd4f8c61d99c6391dc55feffffffceaea910df2354c7f203fb93fb3226fc05020d6170a7e019511c4d425b76bfe12e000000171600149deb11a97d414899d2b66f8fde985b818cbbeea7feffffff764bd0d090190ac77fe746f712ec428c01d56ff530503323da78c1dc430ca35d0000000017160014814517fe1639fb7b8fca1058495fb846463ecfaafeffffffec135c14537181c8c014b726ec3a59ac12b8eb5308dcb8e53b3e18280e0a6ff20000000017160014dcc1413be42ad960b39065eaf7e01ce8fdb19d6efeffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40200000017160014893ca92b2bed65ed2c98d7815e83d3f38b830d99feffffff5f8b572adff521bfa0cc35b0d4d8ef613978d302344373ed96d0c75e96fe665b0c000000171600143ba5cbe98233bf8e6bc54b4f93a5789779974711feffffff0100b12100000000001976a91423be41fd1936e60d1da0d81a0f5ec0ca86508f3e88ac0247304402205a10b90fd2fd3a64bcea34e8262041885c36f9b17b4ca4139e8f85aac8fecf9102207c51dbe3d3023ebba2edaa02ce7482e4a0cbcc092bc0e58b0f88a51d209fa0b30121023a0a3e5b2eadb74eb7f984b068d0ce78e43ac8cf01d47058e602eea0e4e1e2d30247304402207a5f1516acf9e0cf6794b137ca0ca2ff114b71ad57887e1177142aedc3c7e1b202202ece0f8af36eb5b91173227e63b9e8e71bc54c48df6e621eab5e9134cd4a6ca0012103c7841fc35556964320fba2bb0cfd3395fa41c66790a50e3b82fabef3ab5342650247304402204f366985f3788876d9f867ec05ec57d3fe406ed241b39d274658022021f44fed022070db07957d285f400ffa97476adc8f9459901ba3fc59c1dc7bf3ac36c876c4030121037318759ded45e1f850b1e4bf5fda3846797ae931333f34be80fc82ea41176a400247304402207f029d39a9fcde5f623d0fa263d120f4260045efdd701301124b0ebbb355838502203c87fb237e7af73e1d2b7d8ec1681274b634c1cf33b5dd928585825920410c9b012102e3d974d152e39c401b7719c2ccf43c445b8d74747cdd69a48856d1d771c9f4480247304402202887c211ac7726f8d20753c187115509e61532644b1ba62f5d7ccf7a5f9e70ae022020683ba4312b309de2becc4f6fe91894282885477823706f0bf02e7e664c78a1012102286fd5fb9f3359809bc4d9b73e178c6191767d0c8aae87767b90a64222f68c3102473044022059f7def4b4f3d7005ad8f4d76c280d92f25a8243a5c904735cd96bbfdf999089022065675ba052cf9ca8274d985f8df1567c44680a3dce018faf3e66a8ee8a3216f90121023fc25120c6c799b1a9f3f45e23a2e7819640ac2640eb127712174898583a96f6024730440220179b71949d5abab22fee1193b660c661f99e67ab8f8561eb46088f27ad46e61102201bbad5f51343c49227b9e6319f368b48556fb7648db88b833c2d728d463024b1012103c37d336ca9099a60696f9fe78c97799358eaa7d1584e56fc3b25b081eac3990a0247304402205c74d13b41ff770d13487df739646fcb18fac5c5140cd2b7e076f3b5585d24c30220783d25ee09df11566932a058caaf692bd48969e8fdbe87f33d71e2037b39696a01210276416971d3fec560b8e803c06d5e898971775d3a366d632794c6f46acf0fe1cf024730440220094f6907eaa5269333cc0f57048622eee8d161e0d51039d0ad8083ebcd04698a0220267256002877f598a6a476c8c1c237b37b4cadae41c1a9b28e5ff090a4e7ffd101210318834251efa6c3a61b200c9fcea8dc8e1fde605d4b0d3b0de15852325fbb5be702473044022002544670ae0b87456debcc6adc60887201bd6857c890d1b9ce244d155cdbbd3e02206cf55f90be78852421e1512fb122ddd293e00999931bb8b73c63276a859e2862012102479c47f4bf13d24a083a5b9095ad233b3373bc9e4ffcaf2e439dc6e73511fc8402473044022051c33f406ac4bbc4046393fe56c03da58fd8aff5ef6b8418ecc55a3297a4c76402204bb7a57483baab516eb96aaa259aab8dca6c0bda1abce59d2b444a72a5a41573012102bb6da26b9cc7c99c745d1cadb81a32abc50065c744500f196f626d2b32ec127702473044022008477bca418c899fa9eb03be408d370df2c84d77844c1a7c5be72b951c4c6442022079034464a9f40624d0db254b22d83ee54d843fd75bc5ae1e9f5a8ee7689590eb0121023e99537471a8168e91f36b5c174116b4b317b0aa7ace7085ff951e46f85cd13702473044022073fe73d5dcbbcf9bd04ae4c18e50bb4f8a36be5e40bf228d779a27428cded5b802202bedbbbb0b297913ca820289c7f02aa77f5e0afd4fbe99c050af54fc1933c4e9012102a2b8b45672f81b51d98145d8c630ed855b1e9dba6c998a8355a430d57573132b02473044022037cc3d270a3d16e295ba4762d73edd3a7332a828acb235b891ededa0fe21784302206737fbd5e901338e60d3555e6ff846c600a277e447a1eb37b729e2308ec6f412012103107ce0f80df699a56603ce145bd5f8cd24274c7367116afe80b4ad5fa83586e9024730440220034b10332d41480fafd1fe7a6daa5238a82ec5136999129af1de6a58730cf416022016ca6cf9866e400345b0de6c3f2195c02c91b773abd616907be6c90fd839755b012103eeefbb7f2995cc12e1b1be8328fedf2252b6ab61a184847d687c3b90fb992517024730440220190a24ce5f271cafbd9e7f1aca2a958915607af8fcb6604e9c203ea38122fcae0220021e3be583ddb8a9246d770cfd2d337f8cc71b5ed376b46e5ab70dff9f111644012103599f4ba4166684a5e884b82a7a2849e895f3d8968b93ecb1eaf7b168e5f13e6d02473044022042733b91bd0c5d61d6f0f92115b40f4c5f769b073001bd36a1b378ca3ed1d7a602204859c7dcbce086cb65b7f057ab1509c2d8a4640371fa4fb3bd7439b43bd647740121025753601947d701de7a6c5dccc5685a08c1c3f744626902781ab7f1fee426d1240247304402203c050e6b42dafe47841a0d210bf85b0321854d450203ab5f9542702c71c48f8d022014e82ede4f653ad153e1db5e52d2e2feadd4152b01983350d64981abe7192ac50121027535db8717932b6924992efb84d7edeed37be7d302d8b9e9e177355e5fbe2d6a0247304402200799d8c1cfc0d6a5012c5eb6f4a4d49501a4916c8565c6a64cdad7988ea73b38022015b7f435dfe5be37edd3da3377139ccba29df80ce49a88464c37957c8c62c820012103a965b3dae07189171018f3f15dd70de0f59fae4acb34830a96a99f4e86bbfed3024730440220139463e8dc03a4c3a19f6ab357037baedb0bcf7cf0965de3a6a0cd408f1c37b502203b7a67f6b35761ec501ae4c42060e861d5b1064664c93779ac02809a22273bb30121036236bbb27f0700648db439bf7f7534a8f8d0a81b4bb735e1724f1d703378bc20024730440220734ded1992e0251d0150d16debc0747f5d3f3674524f245e0501b7bbfda18b9d022009e34620d3eaa6b2ab0e8abd32758d6d0a4c1620059813f6b3fb7451693a3f7f0121027644a5a67ba0776b9a5cd8ad958cf192c4e904466d4d94411c57ec7ee619cdab0247304402206853c186b98df3c7738a89bdea80061fdac3aa1ea14d2ec4f63062189274208b02202f7a9de0c6a0dd5912a17a914d8e653342329f452a18041044c267a3bf2ea96a012102c3e49745dfeb7e6a639937ffd4b72a63b60f0c518b6b1542f796157ccb48145c0247304402203b70556a008fa2bff724b01f3606b43b4ca625674a8e7f82fb68278a1f3f2df002207d897b05c430ac600657d8ff67f7f9d3a049081fb9d4968bbf376ae1a5d89621012103818bd5d4e2c8d4353deb1ceda2281cae9ce1449297a92be26ac6b998fbc9d1b949a00a00020000000001024e9cea8f165fe996e98d082ac92d94bbbd5edeec5ce286c3cce76e7474c015950000000000fdffffff0d956e9e073676e8606a55d1d8377cbc5f3efe19d2642b1cf3555906ba8c477801000000171600148be2fad4c8cf292f2230a49db0991727001a3accfdffffff02305502000000000017a914360fef116dc533ab94aadd99e330bff663f51c5c879f2ed5000000000017a9147c3b60fe16c16f5d7647b49b591fc41e486d6855870247304402205ab3e999bea2511cb2451439ae1f53e1d4f9acb1afe5377f7e6c244d846fe60d02207618fb89a7ee6950e98889b98cfdde83abb2d8ff59cf45df0d7296858a83177a0121023b7361cfbdb28aa9e307750c6f1413b07d1606c421eb54e7a927dc14930de9900247304402207df57e4ea68b9cba0c3f9d4922eec4d3eabadd3d98100ae118aa6e16f79785d4022038158ac6fd371f18f44193d6212cefe25298dd5282eb082224b9ce09256663fc012103b42e4a715fe71a84e132e3b0eddef924695879f3e3ca71728db00c3ce60a5e9c0000000002000000000104ce33e03547dd00a379d9c6205c07835d5c50618c2f209fad56ada22b08db2b410000000017160014e055f7256ffc92e2598aa7eac3a81a5b3de94b75feffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac45000000171600141cd2b5f7cba27f08cc09ec54b464f7e37450cbb7feffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7000b000000171600145d9c3d8393ec7d1cadbbd7c15be534ce1de671cffeffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a5419000000171600149fa1901c34c96799183ffb6340c5f1cd2f698c97feffffff0114fc3f000000000017a9144271ab6bd1a8e66881cd55d264eec5ff5f6f9f01870247304402205bcfb3c885344dda2ef2114d80d9f095210f7dab30f0512962e1b65928be566c02206598be4e6ee60acf0afd5ac41087d780a393a407409987f80ce38b792d30a76f0121023714913ce34ed8f7170ea46cf4bf61e0319f359ca8f7bc2daacbd0bc299d026e0247304402206234cde261b84fc5836a7729845fe14c80eb2952961aa24bfe8d1f2f2a22e68902204863bed7d40ab1e23cfe2a52df697b3e23db368e2fabec54b0e5f0bdb932bc5e012103bafd64fffe543001817030447d4495e77e10c1fe7ecd8bb03a055846b1f68d30024730440220250e695ba8c4330026d7f6e389697463ad77332f71dbee85725c4fdb5dde314d02200a514e3864e3088f619bc3d9c607f9425e4f4b43ffaef26ec7d4984ac686af2301210388ed7da5ce685dc707c80326fabc0aa2e7725b6b1eda4f1db15b05a0fe373810024730440220543b2a38db3c30c6c45f1983dbaeaddf2e0ba36a55726779ee8b7256fb617df402201ca9c6fd396c06eb214134a1269c7de59a664bb70eb46e298881550a582fb5a80121029828f30558f5d76ab9542ab94d0ff8b242def153b2298f022ab8b007ba8161ea49a00a0001000000000101f54ee0e6be79a9f9c5ddbae0511d7b5c88ef59c6342672330f6ae14d142582ce01000000171600146af2deebc3cf4f7b086c844370e6bc725007a08dfdffffff021e9217000000000017a9149454449622df7f9695840c71c433b1f90836d99e8750f6dc010000000017a914fdf1365089f8ff4b521326a1101d6fba9abd832a870247304402207f3264283e3a4a9c110920f51dc0ab98e3473f421149b132bc2801fe07d5ba200220331ea8457e8bcea2eeb15ec553fef830ff051fae57f42ca47d5c9b5bc046c13801210318f67c9456816a455778195e05198977b2d37b3dbeb0aba5ad6b408994b609bc0000000001000000000101756e8def43f8257d3c00a51fb043f74aeb68c1d5f4a236b594aa246d532f9d2d0100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff020d9305000000000016001446c0ccd82012b4886712ecdabd0d9e27707b687fee8170000000000017a9145290348d19c3565b98672e436b4a04434f3ccd95870400473044022071e25b94e117f9cfb32f14a5cf98fb5cdfb5c08ab6196b2bdb32d3635370aa610220510d78a2653feb80af8538a47ca3f6ae13d174634c34daba3b0ddaf88a19bb80014730440220088f83c7345904de642708b501ee398bee9c0fd2996967d1f8c7c27030bc0d080220474c36b560c51e45d8ea1879eb7c5f620d0eba6f02bfc9bd45b817a395770bd10147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001013e50cc673303b9a7943b0c675701731dc5d6217acbd65497262055b652356dac010000002322002051a5833a12af0f568af8ee9bd0f1c31eecce69ab7eb840e8a6780efa32b714c1ffffffff02677dcf0000000000160014e332051861be6cf18f30106b2fd6001e9b387b1abb3012010000000017a914c63333c7f132ea991576161fbc436537ddad1dae870400473044022015a072d7db0a3dab8258010a167ad0eb7e5b54c4547d4a676d9a42595b3be6d002204b1b55d9f43058d98c7cd2a58606b66ec7f9b148662016873643dd3512562db401473044022065eda96840a618ff261902e2f2d9e2441aa7ec2fd230e3bb8d8e694d79a8437502200e4957ee9fd3dbd64af564f9fa1a6e53913baeea0f2d727781819becb1dc314501475221022ecc72e0ace9fa82c2577732083f188e83cf7fdd4c1831bff86c57401abf321f2102c503fd7d247c39bc2aab204111491e5c214e6f9a0fb782d77bc4ee265296f0cd52ae000000000100000000010103095eeb708820b0011e545a2d6d92a92f73c99106133627700435ee6bc1b6990100000023220020111e0d8063cb4329123938187726b93c0cc087659640d3a580b99c8f8577651affffffff02ddf803000000000017a9145f54a9016d4c90e14a018f79963543e52f677a6387f3db34030000000017a914977ca6f69e1b4ccdecfc9691402e7e46ddd6c2dd870400473044022000ffc37c0f5ba52eac3cbbd4536bbf48c46efe0bc56a8e647d964c0e4f54d96502204fbc3505415322f3b8409149c7091365c2c4465e29c69108ba16ebac6ef2803301473044022074e25c534f6c844b922e027c208b8a2b7033db30d969fbb70ce143b28436df6d02207b98148151660baae79839ef98a4f24126bb905a59a88439f964dc4b14131b97014752210298bcaf731d4449a434add3a19b71232149d35dbe3a27718b2bf3140ef272755921039ab11fd9be1ef1d2daf6f63d779e9c6d438c2cb4a51d464fd6d3b4f26a9a429e52ae000000000100000000010140760e709fde4011e008a2b7cc404d02af965f268331883cf518b0ec3ec8f693010000002322002080e7a30f49972bb0e3318d99b7d517cbb53c309d7579d90a1ee562e37ebec24dffffffff02400d03000000000017a9145f64c7064400430d8faccd4babfb4c3197d2f59a87963b63000000000017a914c947496f86cba7f3ecba5631f1abf12d9064b3e1870400473044022013ade7c93c8b6c2bc2eb53849a6930079804fe49bdf2fa3ad8b853fb4915c4a702205be843c09b9e766694ec5095c88876a46604a4503c7414c2e34f0a2f2e1f43d50147304402206fb48c5e7aaf3480cd550577fc0ea0ad50a5f7443103547fe4621947a9cd60cc02207261ee8f0f72186d6749fba1e7a27bd5385591cece4d8158ed4761cea9463b0f0147522102a41b0a5ae68a51f19ee66b1204f455800b0384cec6d77e2f60d079e0ecbd24712103f2f74933455dfcaa18d4c73fab3d443cb52bc203a219c7c2863c3f9b7c7154f352ae0000000001000000000101573a726c532fd4898ee77fc79e4ee3974173a38d184b0fe76af73e69ab2c4507010000002322002006544193f6c89c7fbab1b34c7c2ac3358487c7845ae2f4d78d4490e371ef6ebeffffffff027ede03000000000017a91437adcd2ce0bafaa51d4890b209c902a2c640615d87d45262040000000017a9147e2786ec081635e568a73f33f3a85f404915059b870400473044022054b628a3e7722d17b217279ceb07dc55a4096c7eaf38c8a93d32349a08055344022033fc324945f20da2d72a47d9642eaa0a8dff07abbb6cd72bb568a907c4bf16270147304402206d882bdd78654b55425f3946426ab918ce46db11a0f281668088b9b0b5fbd5b6022075cccebc37fe4af6414f578c7edac24f3847a33ae9cea73f572d810f40c70a50014752210329d8b7f6ee14041ab00b0ef66db8bdf79c7c0392c68bf7eb0ba94d77cca8ddc021036f7c395d03558d385dadbf739697ec8cc2dad4e266ff9b7bc78d641eb13ee31c52ae00000000010000000001014db4e14df64bf9ca1243ad25f21a3ee22826e1f9e86d22ff198aee89f4ed79500100000023220020d468a22a2f9d645a40bb4ab227b2dc4f3918d60507b7ffe7538604828f530ddfffffffff02abf700000000000017a9140e9988d7cff75b7ba8f342c09ac2ca2e23524ede877b5c02000000000017a9149bf37c5c9b05786cdf78127a9eaf21874b3cd79487040047304402206d274ebfd505f907ca045c6f6dcd9943940aeade6cd2dd0cbf6cb6af8ec1532c02201bb648bae5f54132babb3392b7c5665ca4f0050b5a81dde033c08985c3c7232401473044022016983f5fd68403e4ecdaab92c606ded663cf2de35c336ccf979fe7921a0b14cc02204398186682e955de5dd709a71bb0ce0c45494ef76f5dcacd5283a39722b613ec0147522102c1440f31e72577cd4742e189a1d8d41b1714ebf6dac5cd35df72e8abdcb5ac1d21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae00000000010000000001016dc00c1074b83d0686e3a532fee0c9dcfcc6b07cf8734be533cb6eb5a3ed90630100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff023bfc1800000000001976a914523fb7206a765b023813213707c99c9f30737a7a88aca37457000000000017a9145290348d19c3565b98672e436b4a04434f3ccd9587040047304402202d67ae0dde57eb26945739c2243d40dd0844643cf5047f1df191861bea4cc16102206cc12d1083db20ea04dc98ccc1e4cdb3205921dccca7a5e99b8c01618ab839f301473044022062fef4fbe96eb190f135ba76de15a8b8caf177976ef912a19e4fc802a4e9d09c022035852edead4dd18352be0d6df47f9963144f83d95da2a4193ec378805d7aea1d0147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001016d9cf01c756aee420994d8c47a65145ae56fd45164499bc2917060a06be6ec2b0100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff026f9608000000000017a914e9734ba1ccbd26bc42a537c6df6bebd299453235874ecd4e000000000017a9145290348d19c3565b98672e436b4a04434f3ccd958704004730440220619de13dd8b5087f480af8330fb62a0c297a4a5272fc78a900797a39c6e7a11b02203860e719a1db8f52525fc974fd5003d1b33a12b75cea1963c5a653f5bb064d9301473044022012344e76ca817801f76fbf8aaa0924725869081a0b70db756f06bf32d10ea0ae022054f7742c8090605ec2c1199c47ac95796549cf958a08783ba2c073cffdbbc4390147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101736c49e5c9dcbdbc6647635b262fd89622d17a09822810f21eabdc7f487218d00100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff02f5870200000000001976a9145d4f1d35b6409ea87bbacd7b0a589f6f87ae437188ac49344c000000000017a9145290348d19c3565b98672e436b4a04434f3ccd9587040047304402207cca9c1e0ce1e56fb5ba74c5d38e76656639f8cae46ab62bde83b0ba7b00b076022009ef34c3e1b560215cb46d589c4562dc121bd91a9481ef47b8da48089435fb9601473044022006865ed4963a5f349a5e7346402df476f6443ac55d475aa4a5cbb945d5b0493702201ee8b043d03bf5677709eb2bdde14f93f291c3459a256ff52deb53837044fb050147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101ef464a92557c4e20d5868301e4ec80aab165b13b2ab1eac1120bbad4eaaec0100100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff021e910100000000001976a9143678a2eb62e5c17696806d803038379f639f22a988ac1b924a000000000017a9145290348d19c3565b98672e436b4a04434f3ccd95870400473044022006dee0aecb12e8a4bb2fa7dc5de6dbb98272d2c1e52b8f11775a2bec45636e63022010cc4158b4500475e1b48b9aa94902929028d0274148a3960d75e223d4ef75ba014730440220454303a5f707554d91fcf3a579bfe1a4c494fc5d879553ee453810fc3e78533902206d13c297e8f78782cea6f1f5281395165236795b997e3b8487fc5660a65f84f20147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001010ee74bd1eb2f6907792ea7aaabe0f73aa70ddfbe42c8a4c1019d2844968b56fd01000000232200203ebfdc401bc2c56fdd940f3ebba984920116af8534c6da480c30f4280d44e757ffffffff02d14e0900000000001976a91465ad331c43390444a7fec5de979bc713f298ee9288ac49e86a000000000017a914488cfd3e7b4152b6cad1d0095be895330b3a199d87040047304402201c084b35255fd9e2cbb12152b5cd6623542d2e182197cd450ba6289c0894445402200bde154816a12040c6925551a1c4793d703d017eb5810b0f2ab8be2b4a8d36410147304402202bbde5616500855497f78068286cb5441617dc714527780120a55cafe80ad389022016e265236e101cb5b836debf8af567aab4211de8fe2b420cb9a480fede20beb90147522103a14c1c17d9d622b28906c4b532d4ce14df0444a52731bde612ee3cff7058ca2f2103982481ffd6c2aa1ba6b45c0874cb14e2ebcbfe494f93697c3d40857517fc280b52ae00000000010000000001012aa0682db14c1d2f970cf6c42ebc6e89e902bacef44c6045bd1451db488c8aa60100000023220020203ccbff45620fcdff9803b88545e1ff704e297f706168f6f057566c65cfb358ffffffff0296830100000000001976a914612fc24f0c3cec06406093fc7dc5623ad868a85588ac29aa03000000000017a9142fc2efb2161e09c3c913488394460c44de690b15870400473044022067ad1d3b92afb990975830f016777fe42401e6c2e597b64815ec58bf34b991720220506e44806da85bd53565c0185dcecc04dd13c7b94a7563d83cc1240e320b5ee301473044022058f8dd4987d7ec431ca378f57400b41ba44715e63fff3461477b0cf562408197022035d3603c88e5bdd3d9e8bfe2592f6c5fa4c3c477f6012669bc80350ec8d29f5401475221028c99e05ad0d42a287a52d281aae2d2c348b7061cbd596095fbf98f15aa2d408421030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000000107a021f886ccbb1fad818f0af128eef725c8259fc02550dc5b299d95049a298ff901000000232200208a24cd44516e9cf8380b046d94c13b07496a36d28d88490b6d923125e497f27dffffffff3cd8ad7b7be6a67b21d212bb8d4e75107c756da757795af06b07c9ec214f6c0401000000232200206e4583d94630d39106261e1a5c5d91ae93e4935f01173c3968278d23ae3b07dcffffffffae21ab5ee21fd2c332eb8bde91b57ac84d0b66d5e424498cec2e917db9be6e070100000023220020cb162dd884e20b6f8728b3126403abd8c28f3b41a1fd39ef3a77db1a34bd9e8fffffffff7d8f86963672f7c96bb131b2487155fa71540cdc8bddb096dc32eac105fddb730100000023220020e3bf6eb9ee51639312e7bb4833a629833f97b13323a9144b41eeb42d1cb2f0c5ffffffff35414545c368a8aee0716bbe503f3b487e3bfb38467913afcac3e909d12a28700100000023220020e7b1a3fe81323cc579622cf5c09e726f5ae9e4bc63143dd9945c17104a302f6bffffffff49a87aa946fb66ae12f26be82fb6d0a847fe72ce54d8e562916fc7cdcd924de5010000002322002074a39b44113b8db0fb2f7ad498bd23324b54a7ed53ed6d8eff2411c957729ad1ffffffffddbda4dca625106cfd8e8aa139e7b20c23565334a38ec06b365f0a846a0e304c0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02867b83000000000017a914b2378048bc0f5816aa5bb1aac48a6d0382073bb187fd6b6f000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402202a41f320044d43919a65bd20e3f7d427a58ba1d678655c4757a485d00d10d4bf02201400639b2234d53063d00048576fd04fea9c77a9f65e33d2855bde65ecb82f8501473044022073fc288e99840ca72b8f619597fa197d0d5e2fcb8203e1221cd38f5f68d062f602207f389578bb668a6b08fa316c148652c98e6378529167bdf1cdc6179acfe1d5e20147522103d9f95fcfc776af75364a94c795071838f44d7f7186c49c636917b43911d406bb21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0400473044022012b48088574314debf44806f6ac64a2ff37c797425e8343a5c98d1b1dc5b6c9602203252b84c822c629b01eaa8bdf60c5e12fb388288d43b9cc25cc0947eb4bac7650147304402200f4672e797e0c42d8bed1b27feadd536427605a527aa32e04396d4acea7a06f6022015df97875a7b534c7495d887793731662e0aad1701b8ff4bb9c69a78603ed31f014752210345bdf432071106c243274f6d3c73782427d2d69e53916b5445121c7efd4bfeee21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402205c06380804fd37af05ecc5ce6c8367c004039d2b71203b3182991cb2b21e735c022014734b848f62c9c08b4668ab940d94d99cccae319c3a632549979d795fb321770147304402204fd64d5f3dc421af6b725ee904db621e01b9911987454182cd9bd159756838b0022058e56345a173ede938a5a988257e54e44575a9cb025a7f241d5670f8152718310147522103378253394417af8f6e2882243ccab1db7e6d9aac3d4f3f3489e7ecc30a5c8a7621031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402206d1bbaacd9cc3fe5a2e607722a1192c5b49e7cf12f6f729cd82ff64e5a75bd7602204685973b923a29880376f08f0ef7900d6faeae3399b994d7176eea5cada861430147304402204bf95a280ae184bbbf60c28c23e1b81e0fe78cce1e2c5ef714f9184a04af3c6d02206383bb59b0f62b471dfae283f90b61f84c38c70e68f2638f5e3e73cf72791f040147522103c11d7ba7e66c4bb4746dd10f7f4bc0f9b915106c8a7142959cae4259f9fee18f21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae04004730440220025863960d68169adf1df08a7c32753fa514fb33a29165484de98f4cfa2541ce022078114457c857631e499dec00d4a2f77926e1f4e361e84bd9c4b57a955f85313d014730440220210e9feab2e375d36b785e5b9a21962065a7c2191f0c7a5b6b8b8885160150510220162e6b38ac003099f3f4cae43231fe9b5032f2c98deb829a40a7e7b13544194f0147522103eb8b04a3158a3a894adabab8eef9bcaaccd9ac8bcef8810cc1a2bd8ff4cf006e21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402200493963025e4c0c898716730c68d8e01fb595a54e35a5e36b47d3614db058d020220626e7ef91022eee6a96d81ba0cd1e22aabd45c4169502c54b5f69c6a7fc70b7b0147304402206e3efe69c030b99b75a700157d0be75131886f8c7824042fb4ed0c27b1b4c05502203be7f0935cd56e41f224680135d2a4c52685d150d90962d6500b0bd97693f1660147522102b03d72535edf5c748d83f8c6694edc66913a167889671969478b82a54f49fc9c21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402206aaf13bedbb4547e98e77720634c7aff9f342b77126c31813fb8abcb0fa22495022005f73a1a97c7369a9829eea7cc3aedcd78e95dcc83df7637687dbdd8fbceddba0147304402200bbed8271aa1fe957de0bd324f3379d73a5bca2a628e3700fa9598679739f555022013ada5b5090be5fae6af01f2f6f6217df3131bdcf61190643850311b3f5caa9d014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001015e4b98aec4cdfe29db243e0a12a411afb346fa465a479ea5b7a7bc95e588cc540100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02a53f0400000000001600144cf2575e1208ca97d2e696361a1f138b3bb4b678871b6b000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402204808c2baf00d2b4147a34d4d0d5fdd9a068359500cb7377bef51c538697cf16b022023a81ae204f26f2769a53ef4da83a2c2b6ee12afe2e3900cb3f4eb8e5b0c3a1201473044022051ba1df657e66bb06f6aeb0d85c332f2fa2708166567d735247d6caaf2003103022009979fd1a21e6e4ea9e4c6ce7ab0940096d5a8159afc8af4aff42d62b976ee48014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001010019daa662dfaf9341256fe7d654e208db608f4dd1edc9afc9c76f1c7185a4140100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02ec640300000000001600146ba2069bc655063a9fe8b72004caae8f1f692632caa567000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee8704004730440220577cf2ab777dc899a367f8b391c23babbaeeed17c056eda05aafcbf7584f5263022079afa7f96cf62477c8a4625177f51eb925ebc69be73b8ddf2e4891fcaaeab585014730440220733d0c24ab22e35e7ed120bdae1ee51be78b74a0ea6a84fbf17b885145b9f3b30220264d2639433726abd398155b6d459b241e3ac2f3048865cb964479ec6834598d014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101b9173c7bf0246994f620400ba37782a33b184aea33d451fc8139fbb09bf9a7670100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff028dc20100000000001976a914a19494d0df3a768183e32286969087613f58fd7088ac2dd265000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402207785e5f508be8ec5645aa31c97225fbf9a874b55d6e7d1c202f91428b96f69f4022024da56ad3aea1d7b6f55de0d55f36ef1f5182716fe164c99a5b00cb17197face014730440220403a4a6c52f80bb9fcabd8683e6e99c4db47908ec2ffeb9faa56650298d4f83402200327308ff4c76a264f32cb86ed7c5e19dbedff0ef2035ededd07d9c008d2a648014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101d3a7091668fd16922073662f1244659ca9cc8dd9fd75aeea340098300d8d6fdb0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02f1420e000000000017a914234a97f65e59d623996a401ec7792d2e2fd2730c87567e57000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402204bc551b143f7a48856b9dd0b0177440df80bbec836554b302a9efe03ec65b4f50220590c57babba0fcaaab8b993838c51c5c226193fe81e498becd62157cd6eb5c5801473044022021cefbc99881d260272c7ad53e07a45f4e3bcda8237812910ec79f1772d2deb002205ea036c8627e59c4b1225633de79f3b7964f447c16eca9ed47921093b04b1826014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101f5de985de0c0a1256dfaa128efb32003dc87ed7787daa9dcd77593794ae0e79f0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff028bd601000000000017a9141f6a8a43ad3b892509a4263190cc10c5a1641edf87e59655000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022027607e9e53388177525963a0e24c4b829367c34b5b64b62d271dd047f1d161e4022044b8eb01c1c185eab763ec73d698c9f65bd370a39b8eb060f0f45ed54945cb1301473044022073f73db030b9ecf6c88e38dbd1aa0e10f644e4aa3ecee7833ee59244749ab0e002206c9cac990bcb41ef5d320e1bbd52936d8258ff79c55dd54f7814aa5d69ef6a15014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101e69bfc8ae53ca3ac5806917bbda1c537f9f1e2adb93f62bef9c0c008cd4a42410100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff025c470400000000001976a9145157f5ed4a3a8bbe400051bdc872300245f14b3b88ac793e51000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402201252911c7994e24efea838717cbb65b32351d7928f0a69cfaa9ed9526737469e0220409bb6e66c0ff1f75b2e08becd3acec5b51e3afb009165cf62bbf2c227b6273d01473044022046bfca52218009903883bd0311a8105a2ee1c67c81671fd605df376b9d84cfa702206c7de2dadff41f58203cc92f61def2dfdc0fe0689bbb51185ced84ce3e9a34fb014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001013dea5f7c21489e843a3f36fa9008bed462cb545c8b09d729a63d2c8be1628c470100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02048102000000000017a9146bbecd5a68ff2e16f5c512b235f3fb249924bd53878fac4e000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402205d3af63ef098909dd2629ad04258c3feb0f4e464ff5a19b3ca7f7bb9ff7d87c0022046ec3b0b29eba6e7b5a60b9d99d407b41c5229fb0c63226b14f2fd4513671b0a01473044022005ff0391ab65fbf6beb8a54e0c244876529bbc1db8ad7966691601e9e5c31b310220111fe79338f4d28e9b51fbe83460d80044ddb63181a5ae6bc2212f013bde0810014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101651a46da3be8ec04e15ab486b800d6f53cf3d228e091c6d099d582584944578e0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02f0110200000000001976a9143b77deeba17967597e2511d5da74f134ad600b1b88ac8f894c000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402202772b9d0fb49f7dd22492288ca80c34f63ce9411d776f11df20c6ef8823f9b2c022003fbbed7971429ce5ed1bdc8d9167e47e168cb65381b363cf4ee2114fada02100147304402207fe27170bb849fd97ae47b3446992c7b1279a960553e35033e107f2e36d171db022035ecdba6ae462f7158d2d5d0764e2d078f27069e51195fb43d99433952326987014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000001e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1565f0000006a47304402202e78cef322e24d80d7b711659e86a15e443666d7159ddf281ab4788f55be9e5c022020f3ce2e499a6a83c11d778ec2155c992df15ee771d431519c65cbdae526778f012102b8a41040371bcadd1ec7efc609a07a1c3893c34a7d23f6d749c30fe752273e41ffffffff020e8300000000000017a914104da039bf3a639597005c9e4a9a6d421613f2388754650000000000001976a914237b3cb44cba77afcd04e849924642f17d3e5fe288ac00000000010000000001075d27832fc87c12a67b48f2da2c9030a99af3b8f46cec911e9e43ff37e5bac9140100000023220020a41748400be80692392defd675e3f896c08f81f4047dd4846d4f20a911875d80ffffffff64cc3d24a1599e78cc1d5bfe684d47d9a3bebec425ff7e9f897591bbf0c1897d0100000023220020317985d627feb14b6fb71ac5b5eea27801d683cbf7f8b3f4324b086b20d52702ffffffff73b400f87ec9c488cbbeba288d4a37be9351db399e5fa47ced92e778f5086cff0100000023220020a98f2883944bdbd5d6971d5d082002dbdd3a152fd224272e53fcd50433eec073ffffffff6280fe3a8189cdc61d1c9c2d1b1112769efc9567f78247db674bcfa08c7cf7940100000023220020c731bad9b467efcd2fb47d7776502d5ef0e52f9178686cab8d8d471c9ad544feffffffffdf06439088fe1336bc17e3fb87a9485b9b775e17350b0b4f8166109fd66fe14a010000002322002030741d0ac44e459b8f99a5d1500fb730a45669b017fd2e901e6fcef27b4737a2ffffffff9cfac58a6feb7aa75092bc43c99e65336e40d49961bbac86b91d5cee579908160100000023220020980329b7a70341857b9f89da815b6e8215a379bfca50564f4826d3556ee29c38ffffffff7a316184912f2201b1cd73b66fca6217e4f46dff415d95de2f9ab782b1d10226010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff027c7a5e000000000017a914d38d0f61c70b1ebaf29c1c723e180f4ee118b0a58726be25000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402206e8557f9ebe547f72a01aae2c038d3d056a8bd27a504b043239c964e9092ac48022064477b85584ed62ffdea6524282aecc89716148fffa072b6c2ba8fa93b3db61a01473044022068d8f93bff84c74670e917e79f1dfa2362c14045bb3013e9cceaaab5d6d72129022027b77d35fcbb845a2c52133a78e02ba686b8d98de68c1b1ac9e6edfee74ff71d0147522102930b12048526a220502395258f1506a82759a36b2d185fc811feb0cb539e57de21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae04004730440220058e6f9321665c76a34c14d1c6bd5bb83686db9e743488b48716b603be9a2f2e022078042a5aad89c5a5212fe7cab92a644516c13f51ae280d004d2b8e74636c8226014730440220219a159fb05db8fd246976d916f104e92f50034242c287c3a0fd97ea2077e436022063746fae573f631e4af68cc6f9b9097ba5d2af126f7a22c2379bec826e98de400147522102705685d6a2c23dd260c056b43e4476559d20fafcbfb8534a7e8689aa140d92a921031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402203ad02232701580f4644733a50a12f7a78e0376f062aa47020758bae20657a54c02204e6f1824518ab719e9c847601fec6831df873772c171f50160f28636b4f0b3c0014730440220197ce6e6b51fea1e9a93d2d6f6d4a3e63dad78784b224cf73442fbeba72951a002202054e34d111761726ba064f39dcf2f342897b336e2606e82e94de47cb42db17701475221028af5218108a8d499a225a5c3c462958793b260ee0fe77781d7e4e35cccdf978021031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0400473044022064b6ea3f8aab9006f62d65bdd884ab2a4c7cc42eedee351e75624a0d0dded4af02201abc2f5a677adc9d72ea241d6c97d1fd7d3fefd7d3cb248ef2398b0ebc1e42620147304402205f24cae0b9b637b3ff3607ec01e1cf571bad08d1e0ece7cef9e445bbdb81812c0220035be21e8d978218542c23aa572f364651225dc91719e6e8f89ba4ae965fb0d5014752210217989ac1624f7ce3a63a1d4c8f74743246e65e1330194e1fa5675d236366df6821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402201ff6d959aa0779c451e8cd4e03a468f7023c0189bc5036eaf9bf8d7749c540930220766f0388ce1f17a1281c41488230ef5c457c1670df4b2229c592add2bd30edaf014730440220626a1c6461c8ec24aa63e1be3d67a59837976d1200aa4746a7523f8815e8cd5502207c7158ad37fc27c22a5b56bea10b3f257c9d1769b39e76ffcb580087feeeb9b60147522102f64499da192bfc5bc9194221f199f41247cde97bc00d874260d63901e9556a5821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402206609b577280431d98a0d4c36fc25125044d15a28fa1af88cd00e5a6fd3158f12022056f46bf7ad7192f974e66875c282af0dda4b2d57a1d05c4c9b2e750a58fc5dbd01473044022061a4a703c71d361be0a11b175012656d54a20d60e3c65f6497885b42bcd9f04002202f34c1864351ca2f262fc1a70979bd5d8f6f9b3fd5cc431836fdede766ecef70014752210379ebbddc0048cc60a64266da7068573864058b97f457d96ffc3b40f2e4a97f3621031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402200799da34e85c1b219d8c34403c6a01b5b77613fed365465c0a68a903168f25dd022022e01684e353644a2cd7b03907518dd8f8fa26b87db7e666d7cf69c8b6a324c0014730440220715dc70d3a3a3f07659b6fcbdcea24c9d3c1b7472bbec0c6ead8e1b38a58acbb02202636df5045e20e9fdb7e5bd8fe3bc537968a1c7eb4666f9a2d04f4310a5840fc01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010150c9e588a93fa22c8012587a7ede08f4f95d1d8738e54e21e5400f8b197f493e010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff0281440400000000001600144930a49fecbc28d03c7fa77c1ff1df2c0ff85830d46821000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402201d521f004a63edf989add4d67dda14a690f273a3944f8a61961e586225fa2343022002977b50c82ea92254bd6fb9521a6e90db2c1fc46695ef69594b1c983972e8f801473044022043ce22666beb7e6f74729c74583833608491a140d41cbc5f631076b629ea0fa0022001d296fc7dd4bc9cd12c16ee10ca964d82050423652ecf152f4fdc0eca0f5ae601475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000102ad981e1313a5bddc4f4a29fea06ff6a9fddcd1fd33ba01feaa3622c928275bb90100000023220020163a89df2ba6a67f86a7bc502613bef4d5174892cc5303201e3c652246ae46ebffffffffbfd22fa2df7bbdfe01f32e2e0968ece0a29b277987056f551b93d3004e58c39f010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff02303b0d000000000017a9147d2e8decbed3facdfe5b14f0445f50aa11afee0087cea220000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c3888576870400473044022045ad30ba7f9bbb9bd33e8afbdaba789993cbf1b61f3cd83a623da98363225f2a02204e7b6a9629e285ffd6913c0d9a30ef2fb934cd81a291567ff34dff1c10d8caab014730440220261cc124197946e2e07c97b557d83e4e48d23bc57adf3b21a5c63d32d0faba0602203ca8acc7170cf7365ba1995850ec3d8ce34e9963dafe2b023a903d7976063fcc0147522102decec262b5c893e14a881849053148691ab4bbc0e137d9f2020745d12a00fc1121031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae04004730440220254fdebe31509260e2abf77d5d8cb8788a369cf2fe579336f735876e4689ee9802202876599ca63944d20f44943c9f2bb45fda629fb41d9906e61f183737e46f6e1701473044022058756a4467368c8cfaaca912b56f478e68b3fad5ea8fc990c5973e5f48088a33022045f302b6c062d0cbf08e8abac99747305c08669332b0e8cae346f3855ee0985901475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101160fb2a0f9f77ae1b98b1e5e67b102868b87e2ebb63b135a2fbfffd40d62aa9a010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff028ca00100000000001600141f8cfb2b0367480240453d737484dd739fd30df371f11e000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402204d7a440824d40ce84af28a6d45b02c278975a450a3eeb230eb8f69da0b0761ee0220189283151bb48a50716bd54f5d627220d49fea073b809032a954eb1610a91a92014730440220270d4b6ff8d9f8be7a562159b082b7f20f84edda394940ab159838eaa8b960fa022025ff256efb3d38f18916e86b4cc49269fd92dc3619485269a77fceb4e5a157c401475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101797404b188b968d894f67d248bc26200f43c8e57e081906902e5758bd6a3dcb9010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff023f0906000000000017a914b2378048bc0f5816aa5bb1aac48a6d0382073bb1874cd718000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c3888576870400473044022060d23235641883022f372dcd294ddf1d3e633551655819bf6f4c2ac20199a07302200c4f9b8bb8bcaadd07df3c9d95a6bf9a1d0712d5a043d331146837ec7cad5a540147304402201cd251e37c5ec3764f1a9c48eb17d4b5f38d30e379937b977a42c3d4350e6474022003ce28597d834283a11bb5837517368268097168f5b76b1fe7847f8484a7198001475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001013fc336e4c0f92996eca8a6d91fe16be7d8e667b23eea99b037acff4b16719962010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff02404a02000000000017a914f8a15730e1135cc997cb290469785e1c963cade687267c16000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402200b085bbc05d753285a35c931e834dae7fc671dec3d4f5c17c086a1eecd50c802022046de7f0cab05958e4ed1360794c50c50397d4b511b15c9623396f00158de8981014730440220497a9072f29b533899f585104dec48fdfc0277564adc423afc69068fab0c491402200de575260dc08cedb657b40d225e72a63860f298ececb0400784b986e5df7d2501475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010188dbcebea4b3542f2f53837d67d810381ef2f5d22a5d31742136150a1502f75f010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff023f090600000000001600146df9ed8feb7f2402c44660fbd7297177364c39df166210000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402201aec39c8a53b1a7ff71a98f234f5824071b1183ab77545bd1d184d80238bd95a022052c3363d90b25908b91f63e3e6630420474fd97315ae31346e9b1612cb79e4990147304402203384d93c2007de91db3bf4764212f72a1db6146199cbaa233eb85c4c8cf2a3af022036de05c00f590cff6e58b8150d9b449ecefb7530a3e9ad8deb9a749af6d4aa2f01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101615f201f047302b3037fec97cefe1baa5b7ed11fdcd05140e544e761adcd1b5d010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff02f1b406000000000017a914216005484ee2dceb05bbe11fd4bc58a2cecf1e17873f9c09000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c3888576870400473044022055999d24de5b083feb6961c430b45673a59dd3305e843d7fb5a8c35edfa47e2a02203076a71895529b8ded98b2ce8e8bc5ab9658d0026817c33d7813f039b43911ef014730440220569c002b91a111ca8ebfdaa274150ff8278af7196489ddcbe2bf1a9cb31838a502206982e8ec1ad3ddc4a14857feb89a72c33477b45975ad1123deb9ae8002db18aa01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101bd4895f8d44d129119754cf1ab35b0a68cad5426978d685c788bba8d35dc56e1010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff0241140200000000001976a91491700783b24670142085015edd97cbb946e3ca6c88acee7607000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c38885768704004730440220696343a14b30d262def8579e8eb2b278aaafae6417381a62e29d5ca8c0c25ef602202dff84e03ba9d70aaa8f8701d802e824eb87c6ad5222a78aa1df9cc5e24c2ff40147304402207d891f04da0d928282e5153f6cf9b737a5cdbb05c2fec35cb3b3971e65c934fe022017fc7f7f7c12b2a91bb624e578f53dc9c3ac58b6e16e3bbcd192cce477bb20e701475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000103623c65af62afa51103cfb510d23a312df507c772a5ce6f5d68bbb8b22315f4b701000000232200204172a91d73f29bb52410deace5fa73bd6f7a5686eea896b86642c8a298649c12ffffffffd27bd7f20278213caaecb622b280d649ea46f2fe6ddca093fffd449b9bc45e40010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff719751e86fab1bdb32dc1ed79d939e8e870ae23cd5f1d89f60c983fe32f0b71e0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02fac05000000000001976a914523fb7206a765b023813213707c99c9f30737a7a88ac934d39000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402203c23a84fac84b92c9b6ceeccd0ffa82c2badc5351da3097472a9b51c5f9afdaa02204e030f9d224fb588935d57bcb40d606efe596d9774e871979be5966085b2b2c0014730440220595d30bb12218aebfb04644ca1ef3dcaa4c5e4841cccde18fb216e01ea2e5ad402202587a143bcccc7c7f0696dd0fca9ce109e4105a1853b794c7ae09c66f1f05db10147522102f8a59c760a88b11ea058eb76ecd196724465ea899ff79c87351227d922bc65ee21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402207e21fd62a7cf2a5ef0fd9663bca2f7df63ab566b90fb6e7a073469f13aa0b4e602207f9c236bfdd04b9adbb0bab913ab14a882123a96841636f254a0de7de8c58e5d0147304402204072edc05330c33d6bdaeba3abc589cda9e23938609e515301a190122a6e774102200c287ac1d2728912bc78686170ca9163524cac03215acccbf9cd97ef7b6c9f9c01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0400473044022030ec54df8b2d683f2992e44bce7d65d35aaf634782a9777adbd7deed63295c510220530c0c47fee60af79819242536b57bd4f854afd0ec7b4c4ea983d98129daad090147304402207d88311f189c847c7445641a2ac76db3538125854612c7be3a4131064f88abf0022073098a431a27e4c1a7adc94660907cda8227158fd6024387a62a148a49f0fb66014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001014cd65ca311b4f60a44520d23fc91a95f9caa3eec4938303808e3d39a50ec3e4c0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02c2dd01000000000017a914216005484ee2dceb05bbe11fd4bc58a2cecf1e1787eb5e37000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022070c72c5137c8bcc4362023c82a4fbf982d4450c5cdc3afdc00a50a5ff261672e02206b8e26048df425fe6906af581efab713cd04afc2cd083b18b5169ce8cf11efeb0147304402204522723ac66bfe9fe581675b500e27d71e02c100d1dfe80dcfb2c7492e9ed4ed02201c2992fdb6b67dd5076e48736b77cc6dd42977fedb588e0aba8455f5d2b81331014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101bee76bca9cc8ceb6f7cea0f8a0a8c83c551c2a2a811536136c9f2ad209511ae30100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff0247920100000000001976a91457a2e92eebf2303075b3b2d7bf6e09cca8812fe288ac94bb35000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022025e5bc80d43abae38afefa55c80f21d06fa19baaf5a8a57550c81d582753e36702207b4ebc182e7ba1ca930b6a7ff77ddb05843a4a8100c644d4b416f89e5345205e01473044022025f1401cd0ef9d76d78755016ba75f4e39bd12870f4842e96005a350862afa3102207148b22d994475c5125258aa0f053ec1776117f6c59da29c7bea160db08ce4e2014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101fd1d7ca372f6b54acad56838cc87dbdc402820076a801ade34d4c0f1b1c2f26a0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff0270ca0500000000001976a9140f8d515f067b16253a5481a61524419aa4ef345688ac14e02f000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402202285e3ca5c02c4001200aeb2b70d9c06234712d1b8b638ed2f9459c89c28919802204123545d8fcdfbfa237e78a1986ad6e1ad78481f08d12c0fd23e626f6e3cc4e80147304402202256210eeabdd9ad135424a836b15d9aa7343520b6602bd1aef68660573ca89202204b6e22c9935feea52fc270c487cb6ee5789d21709d4d1fdfa3f42e7a72b00db5014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010129e5d7181794f06f00d6af584722b452d9a2088e8793833691bfd52953075b9b0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02afed01000000000017a914d09ec6c91bf98f97b5e60bbb1c1037c89c306bc2877fe12d000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022049b10e018e683d4828a6e1ef0e3b2f5113500cff4128f124a3f6e4d89023f23402201be77893bab66a267cf28eee773a78dd7aa916d613b52d4e4c7ead42b236262e01473044022030ecb4a31c8f012cf0c121f062b6c6a1a3adaf5cff946be78592a904dfd9e7fd022021a4ec0a98f6dbf50683a2e157b61c0577fcef9dae7fd677312fb19a84f460ed014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010113f1bc16f9bb45992e66f8229d31adc6e356f2933f46ca0851e7d03e060eb32e0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff027c000a000000000017a914d166883bd522ac40d639347a325d6e71cf678c24871dd023000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022066062eb310f6c2ecf533dc6ecf72a49ce38dc40463e70ac904dd25c9a9f154430220644c3bc9c23d21e1350ed3fdea802954147f5abcad7f96554e37987168c0a47a01473044022030596b535a76c2f99037d258c113498fa531e75e5cfa37e84086e70621e0c77802207c596b24a374a3c2fd5311b17afd02dc8ea70a152b0bd5453a1330657e484195014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010165484c2e993efdeb6e965f6e56c1c4b916cfa8408bcc334f94985e850e48cfca0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02f63306000000000017a91469168e7ecedc34bb1cdc950156c20891ed8cf39287418b1d000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402206eae9936a9161906b50abb238f3b78121de966e269e68577d19a765acf8bf9af02200e01427effc8c42b9fd6912d98f894cca341f4c629f5b1dababa383768a7ca5c0147304402204389c281f3a59b44ab9b3c18b10f53e62cc4970f6851c6b86592f17b8c3fbf1702201d163ed9062ba36ee7329faf975bf7be7b0ccfc8db8380665b8effcd85a406ec014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001023fb823e0d355b2a172bbc3e0a781f81dae51398b06d9f3c13cd95bf034a505930100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff4b855c4ff56435876d55e85a27a04711aff3bc2de889984468320627d71b4d900100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff0278ce4c00000000001976a914eadc694ed43eba75e02d9633ae7fe01a6d0fe60388ac3da680490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402201aa1567ae2712e35170ce8fe810fd10aad3810c82956bdf585d93f37caf0fe94022006e6c0164003d4584363b07f755e58cd77f09ec6284c47281007e803a36a783901473044022021b62611318209f5857f5ff67483ec0aa85fd6e0a53c1ab52b53339c9b5b491702204ddce8871bf64fbc2c3568d5fa9648f33124efa988bf738112a7c08687adc0ab0147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402201bbc003291d0d0f9b5b90bdee011b3cc203bbf92dfcebb701f01efb15354876702200415a2e0013662564c1c60efd41c734a72985ef278832954c5bf6d8083ee9c79014730440220644de04c1950d9971a98f646a8461895dee1e4536045b8dbedaaba57ee105b690220177633a82feac2009a074a663fbe103c68aadcaf61dedef81aa901ed0f66aec101475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001014ce736d309b74c4a4ef5bb334f6265194a8c2d52ebe3c1a10ebba577a4a25e480100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff02851a0300000000001976a9145e91db82e090731988bc81b40df0da65efb5c44688aca87a7d490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402203f4b9e195fe0a8c0c7d42755cfadb39cf52c4f24ffe59137996a54454ba45d15022001a04f9b805d3035a4cabf46cd0debe02ff57ee6606aac9bb25ec3546829be6801473044022078dc695a26cf4b723a21f24a9a5f93c8a7862498c0d4ce0102171f3d61422f9002207783dfa55f7c69f68b15248a6d6071d50a220e201265433a40f11f9cf047fbce01475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101289c76edf7ca1c2a0cbeba7f40ea596d80847eaf311d38751dd0b70608aaac810100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff02b1810100000000001976a914d3b3372789a363571eeea8ab9257d4ec8ebd462388ace7e77b490000000017a9149ded08be3ed45651f4a568824ae553c72180d763870400473044022020542e060f00b29fbe3b2446d4ccbab178bca9f7e23d62b12c60ca3f46f9f60002203323dbfdf6e79323e2831be1ff1da8241c43c570cbf751275fd31b781a766a5801473044022048d3e01c9dd1b250b1240e1e8e8ccd88ecacace487ee1914b9be68b3be2dd12602204568fd5cc4303f48b357ac5f3fc8dda05874926c9c86b9a76528351468c5ada001475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010118af66401be7f7033c10fd5a7438c023991682a8985e3d7a184d17d8073c4f8c0100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff028bd601000000000017a9145b974bafab8d92a170eb7ef79f0dd6b48f390a6b8776007a490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402200127f14a890ce82ddcd2a8edf4672968d0bf3bc752e4d9c73ac6bab6155a6ec102204879c713f35a3470d3aabb9009859d7f60fae58346481302426fa55eaae5a7da0147304402204b8d561acddcbf586d54e8a1eeab8d43ddf63d5f0705a6d171ea1e9f535651dd022012439baa985a8870e0efe49ea2a42468dcef30f27dccd855a6eebd70f4f5831001475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001015910f90e69bbcdaa2be42760b226ae45aa1e257afd27133b3126b3ef7426bf7d0100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff0231330200000000001976a9141566c079c6c2bff50b26d30540ebd25253df564988ac35bc77490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402203a02d950ad20b000aa26960adf48a8de649b740bb23bfec1a177ece4b7e7da5802200ff1620570fb05bd63f6267009be0b589f218a473e2622c7f1ad9906a74b759a0147304402204aded3a343b1aafa2a41a5d4cde461ee94960bdd94a6eb7a64b3507d4f02629d022064ba9490844202b8b46aaeedee3ba21713e493c12d32326d8efc22b9645739f801475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101d418a10586d3bca72b29ec8fd4ff84e3c4bd7698c5adc1c30c86b60b4855b4040300000023220020b2d5449aaad66e228f656dac84d4710e437761fba1a079383e1ba7d32f856a41ffffffff03de30290000000000160014eb25457fb78c0ae4294a73dca37bf881066b707febbb0400000000001976a914d84c25ca5cd50815b7cc77e7b0902f558119a73788ac2dbcff030000000017a9143dd037a2e8f90568a21f7ee633d93a66e970cd2c8704004730440220043a8f80494be712b45e3b844570db3f409c00cd5b9eb1231553d7f316296c28022066bacc8f0f15ac041396b2c7956d5fc7d48258cb07ea6120928320efb777c02b01473044022028179000e829f81f9b5154c6674ef7b75d5e36de2c0a38394d1c936a4bfaafc80220593a94e9d66207736eff954fda3960eeb908d737905e3a539434842e7bf9f81f014752210240df048fd9e78aaba1acf33fb7bfe0d6d641d892fc9e48bf01d1d488947f9c6121038a7ce7d9e2dc91a89a97abae71946b28083a75edea864618f997391c35351fb452ae0000000002000000000103b9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e201000000171600140311fc83c9d8c185e8b7f8d8bc8d46c1fb53b5e7feffffff5c1aa5337584c46586ccc0ef61e54a435ca9d2c4eecddab00acc32d13c014ed1160000001716001464bb7a4c489d31afb8b2ff55371b30fb49f74b25feffffff2d7be6d797768e90c650be12cd8188b1b8c0e3c0149365ef659dde2e81e5a68b0100000017160014da6ffa108a7a27563420462a80831341cc23639ffeffffff014110e70000000000160014c603e42e5645aa5c4eafd39dd3989f1384b210380247304402200735de7b1661eaaaaf251d141ab4d53c13fb904f460a74261c3571a313b4529202200b2512de5c97be006e1a496cf51d7e166d20ea4e8748241526fadf25797867360121031eac17c65d8c03c6a827a94f71472d4a2da5e83a558df4d56301745b75bf6b1d0247304402206840816a3209ebc8d26e90932e53cd56e39afe284afc44c78f4156d77db7beb602201355943342e4e57d0f0442445128f0fdaddf85d3a6566320ce6b6bf5ad786351012102d6b54555dd8d4655da9a01caff4e6a3ade6265f49f920ac8198e533a56d8b1a402473044022052e81eca80e7b39b119e1cbe7523346b4699faeeacc04f3fd6107d7f701532bb02206a694c081795d340fd19959a2039129b58a717c49d51bbce788141aa684b695f0121038b46f34f2ce025cf800e25359793df27fe193f37f73f77c7ff4b4761fbe284a749a00a0001000000000105e3fdc98875ece788a210099dae1eb05e54e1c36aa7ab0206db9dfa7916d6e40d010000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffffc15eb6908822e48a6509baf5719ec6bf3f79b4bb9a1dbfa4261d283dac1a69f4000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffff2ddb79166a07798803540f3ec8a3b6997c53b82c4fdeb08913dee140d34fe00a000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffff6a534212d54f08af89b267211356a6a865162968684395b3628902d50cea25ca000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffffe26e79d528ab4192ab4907b6d10387a8464ee806e74b73edfe824b1049cfe686000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffff03601823000000000017a9144be03cbc2025fdd094092172951fd4d528ad078087d859000000000000220020ca74f0118ed61fbcf2d78186026f522b3041e9aa802e8cb857f1cdc669396cb6410b00000000000017a91463ce934158796f1e97b728b8bfb33075f94e270287040047304402203204c2f850b849589c49003351f24e10aaa7d4cc2057d64d2e282a7f6bbda1fb02205b768d0792077e2dee004f92ff62eb7f33d11170875611b8e853d68a0e42baaf0147304402203300c761fd17ed826469f0902f8834014f73106f800fee047bd725c9df7a33d902205a654c74eea467803361f9fa1af895350e727d8a2f748b765eb415989fc10af8014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae040047304402207282d1afae486b61e27c6615468e81e160ee8a5229b0c111cb575ffe7d401ac702203c8b71eb6b22ad2a396631a13e680561ee95d15a1abaf45265dac7c5ccd21137014730440220043d698393f25ae91e00875c64f466b64f66166478c8ca04bb840881c73bd805022002b981b1a190cefbdd1b839318ebfc37551ec43c1ddb6825efddcb73a75c588d014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae040047304402206a4e95d566b8945e2ed9cd2c8a6414bdbd660cd690dbb6fb75c6905dafaac55c022008b370205682cae5cef2333af75743fc84a1c0c4317f2e96802d6a79f825b3da01473044022036d43292e30eacf61e432eb006710097536b68fa58c41d05286c02813fb20608022027cf7c2005fc5ecf6af6d2e1629f0b77acc2b3e745f1c2a0b093e0d1bf22b7c2014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae0400473044022037edcbecc90cf3a0f7476debc36ea8a4d03c9473cddd82cda2d331479f02aef802201193689046a0192f16c666fc71e997e6ecd2809bba2a75accb0fd657e3128bc80147304402201d84ef38de3577948ce902eb11bb780253837a67247aa8c5ed9c9c12b91500ca022065eb17a6d9420dfe38ff441765eb91de46a0c03b4142d11e5396157a229540d2014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae0400473044022068185b7bda9223110240c8e8d0a8b9237bda239c9dc034137ef8f808394b50da0220338b924c29e667f397eb384555b17c34367e112cf81a5135beb6f403c54fcf8101473044022006e29459e76b81649cb6330177dbfade0008a64c8b2c4443c5629d9ff6db7f110220583fd3d2ffd7cfc2c6d18262d4b5c84024c6b2b90cae6001b7c7cca908b4d9e1014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae00000000010000000001044a8b56e1962a0b2c94c3800fe71ec04c329635e43bbcb17839634d642f032fbc0100000023220020a59b84aca1f4d9a51d4595388da7d22e121d7bb7ffcb67da98cb40fa91f4d243fffffffff692f2426c2f584162a0136c67773c373354e2ba13f4ffe119a2666f155cfeb9010000002322002063fa000bec1d11f89377390e994772356c37fd559aa49d886d763703515933e0fffffffff1fe961180d2ec7bf4e2414a095ef41c78d06897aa5e6f51878613f320a113632d000000232200200f32685b92100028eb8f4ce8c77f7d7ea9508a9ba710684d2f4e33ea1f3fbe89ffffffff1779e5074c3f65729ab4a79cb3d5fec1562bfb0b9ba7724b049f4589a5f1c9b00100000023220020de087b3b14ef11e58571e096594d53a4bde8a7e20ee08473ffc53cb253cd3e0dffffffff028c2d05000000000016001491c4a6dab43ce68c4f89abe65faf4d9e95f3241dc19600000000000017a914ef0f351aab590671e6f5a09e8482fd0e298eb9f387040047304402200acd2d2013d84cb6b7d40ca908714c116fde1bb1c74f2f8a6ffe0aecee3ad68602204f738d98f5c66d8a72853a1670c09d60a9321ab92f8b983eedc0a12044ff5f600147304402206c286cedb25644f0d487bfbd237ee4dfb2b2828e5d30da9317b5e7a1170ac34702203f300944989271aefd0764cf822ebedfa44f72eeb7199b934fb09e55f82af3d101475221036e15878f73ee6ba6e52ca9127b5ce680aee620637d4c081fe1bdaba85cf434fb21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae040047304402204215d55844067f8f91c79bfe725139d77799eeb75845a42982ba77acd4ceecd20220063f3752539b89a677ed3cf0c0b2adba9a62089e0f58a82a3364a59035392fc001473044022050b86215e2a3a8d44e29526eae4d22fd580477ec9b38d8b8139d29c450b8765f022053b4b58383a5bf6729fffc30c49d3003c32264b109195d723594edec108b41930147522102f1ac4d154be5e2bce2433bdacf2a8af4f6f63a3e1c181ba633e6df3f6eaa823421030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae04004730440220725469242e22e57824f492aa146232e38a912e1c690e45c5b399ce6b7382b16402205e4ba850ceff50fb45f4a023d1da01a9842d519dcce1f95dc310fd8600f61d1d0147304402207d7fc299303a905fecf1b5f50fdab84604aec8f5a4cbf433e5a5da2ea281bba2022062510bcf49055cae783348d6396de273e1bda0eb73bd3326126d898ac1a550b501475221037372b30e368ec833e7e4b6bd921ff8749b6550ef151582e72df7e04f80d73f3d21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0400473044022075da9e6f9bea42ebe09040cdae396fce8559c0f48622273cdf8fd00d6feba71e02203b1aff237787b7b6d015e9ce5d671b8cf8c7643d27e588fb13f883e2c661a2640147304402205a95bf6ac91584a2f91ea0056cdb298c39cd1a861772aa15fa3affd0094c7e43022036517032a729962846a767abebc9606bb97b6d041aee9e19cb97424ea8ed18c70147522102d37a2950c3b40b1a8524b652e98c07ecf11c0e534443fe1c9530af7cea47416f21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000000101a93fd58bdd92f729f35681568f309bc085dc58729131252295fbec4feda9b94c0a0000002322002028cdcdad4c4a07bb6ec5925f2196c4e293898127650b3044fbdb6bab317a7099ffffffff05e47b14000000000017a914f18c71b4c05d47f9d0937c523f868b1609788df48705231c0000000000160014c54b937eb1c23acd2871c9483db135618e6230addfe00500000000001976a91465ff8034faf804a96168dfc8b0a278c4cac1b20188acf4ad2a00000000001976a914dd8cee99729f48d8654ad3cf9d3c03a27f58d32288ac48da474d0000000017a914ba695f1c0d90e1b0fbcc0f1f4623b815848a51f2870400473044022076d0322cbef9e3d8507be6c4fa57111fa7282b5bd7398b7e859d7363ff213ad7022014f899b590ee65228d8a4ebd697783646450dde95e22cad6a0d5a341def1d0ca01473044022072f4baddd2f6b0137849de112306e9611e0b132376f6f9567e63aaf9959cae000220532c9bd7b1ef34e4c301ce4ff8fa661ec45a02b0373e59ae097acb49dfe6a3910147522102ce06807bdaf64c3f40d3e4fe990910c82e8b8c3ac8df0c3cf373fa72823f958321039332e240be260cc87f6b1bae52aac5e37fcd61dd89849a8113f14d977e5f39dd52ae0000000001000000000102ccd56efad6aa114233becee4e04144a59facfe17354561796546242479dcaba80100000023220020bea1f056faf72a9113141e719b4c3a6b1d81b85ea96d60ae9c7349575a32392bffffffff1820028816f44c87b40c923ba2e48c8f5bff4c034f0a80a8b2c6b6a6b753cb4f0400000023220020935a5e103cb999a96341619d65bf0c9a9bfe21fc3635af8921d558acdd386236ffffffff0290ba0200000000001976a914c2fb9f54d651dbf0d47dbddb59297ad13bb71ba988ac7c7f02000000000017a9146f8c0a0e1f5241f4f489b5a79227b211dc71f9cc870400473044022022675cc6a29324fee056d2f96bcd4ca9b0e1afd067496571ddd21963d4dc7aaa0220787dd099ddbd2eb75089b0a7f71cff678ec14a14893f58b428a08bb583080011014730440220051cdea99331a41fc92144060e7ef518bc9d3f33926da22347cae9f1e8b9236e022054e25df218205e5fe2db4eb5e2c8ffb852e87b12a5d03fdec3986c56394cac0a0147522103434c38cba705717e6d7a816a5fed21e968ea518f7d17fd7335597584d57b70a321030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae040047304402206ffb69ef3f87706e66aeb750f43ff17dbd9ffd8ac8dedc21ebec08985890380d0220097da5d541c03fa68d05ada9d13329462a4b74cc305fe0f21c255ccb07151ac20147304402206c4dd521fd9415e60e297fb480c022c4d30353b385a043e258cadb8ea1a7e084022019251e377f292630e45b5ba48564a037886d5e314dcbc8bdbac9cad94efdcbe80147522102a020ff50287b268998ea713405b8fd01b0095f7d2029c79f4cdedfe442d4377521030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000000102c2eb5bf3574c9b573ce06d49316bf8d6b24195082744cfd54ea4f640414384010100000023220020644dadb488bd7ce9bb6b648b71fb66a5116c05a27d4d6064228833852067d34effffffff3d3859feefd3a36cef5271750b317acf756ee3c853a2af83307841328100a4f2000000002322002063fa000bec1d11f89377390e994772356c37fd559aa49d886d763703515933e0ffffffff02a8b90200000000001976a914c2fb9f54d651dbf0d47dbddb59297ad13bb71ba988acd5bfc1000000000017a914aaae0681f36d79489bef41e5da5978a3a8c9607e870400473044022020cf8647ac61f9012ebd3a924efa4f14e0877c1534b4bba4a3118d5fa8ecbc890220341ec29f0c700366a2ecb14c5e9253573e42a6350b5d69270ff89fa915b1fd910147304402207e37c87bf76d6f6edd3174ea4145f8d621e20ea5f48baf35ad6254dd842bb87402203bb92600c254714708a91643220d44b79e211230bb916c80e61ad162b50f8dea0147522103a2658911a3e1cb0f28e3a277f069ff76821bb16b518fe8bf181eb5f38b91898b21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae040047304402205747334cd99152b0cab90b6e8e3f5640c84f6ac4888ed9a343d8588db6f8d12202204c303883ce52acd00fe2c00f17a148f8a70cc216d6633e05c665a5d8bf1397d70147304402202bf4e42c057aae193e990906cfb190fb976e13415b130187e9b0a1afd6bf11e70220450d7cab0f4dc187f144193674e3061e1f06aa0f83b2623e11652b025997337e0147522102f1ac4d154be5e2bce2433bdacf2a8af4f6f63a3e1c181ba633e6df3f6eaa823421030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000021f9fbf49e4f0e991b1930ca85ee9ca25a89418002aa574bf22a8cb8f05ecd64d010000006a47304402207c6d3ecf87ad81a32a208c2986c0968a61f15ec53d939efd6023b86b410dd51c02207db841a6db26bb66ee9eccb8aa2e2483e50a0eb890b779386149b9d7652733540121027b01dbc8c1809501aabc042b1784cc0ed89be050e5add704276f2ade0cf252dcffffffff1e11d45502179bf4dc321d7a22fbbd9ab6e5a08dac8d70d020d07ff8180ca06d010000006b483045022100b4c84de2862eb781699f23e9eab69e60a1b3f6298bd06853e054547f6899a7d302206b384381631f06dc7dbad145b0467d5872f0bbbd0043f02da3c2bbe0340cac47012103bd58e86768a83193f704d8afc962003e1b96b855eb11e618be917fdaad7beedaffffffff01122b0000000000001600146656b8588518b4567960fd1bc01a759d1408ce5a00000000010000000001013a0909aee850cbfdaf62f2ff02a9d6aa53abbbea8bd7c7da56cd30dcedfecce90100000023220020290542e6827510f19c75e46b0d9b4129ce39b5df5d83fd320d66fb811dc84f3cffffffff024a9b00000000000017a9147c7ba11a9fd28e72eaf877a2b4ac126062523b8c87248fd8030000000017a914919174b02fe93c89e7cea6728719da9a021a59b787040047304402204909886e91fae2b84a60b3183cb83399e7b8359f50470d902a628c0471aa568702202b0d02570f77f255ee89c539876ea774d97ae0640aa77cc4c289bf9c46ceaa9701483045022100af31ea01d6f109938b8ef98f7e626b9b341e6268b85c9194b25843038d81956102200edfe4f31b1974fc094295cafe4b96b59165daecb858978a82d718d92513272201475221027b09d6ba4498bb3240fc0231755311df0b00452f0907634d4a205054504e994e2102259dd307b62bb668d004dfa23363ffe17c0ee48e8c13993f0b25d38f0567c16c52ae00000000010000000001013b8e6412a39df1734828a924d1025281447a07b153afbcc5b556d9ffed89f9940100000000ffffffff020bbc07000000000017a9146805907146ef47c18dc3c2218219f67f81493b3d872400de0c00000000220020bbe2c54242f02d7e9b8716ad86f1bcabeab7861e0b280f7422d051f2f0539f0a0400483045022100e1e47736ac0c9597a11a62d7e3677b3e73866075cc6b0917fc94571af72edc9a02201e9bc17f6628beb57b3a93bd93776d33462db3623a95ddc83acdaa99e54e91850147304402205663e9a1a2a1e85a7e3b5e112d8d8c826caa78a4d035ba72e8a13e069116b6a402206b22657c2671645156fd3f6b0b2432f9258b92f933480f7fe3dda772683ed6a00147522102fa6dbba257ad59e4311b4004e99450c46a21e9f60a37870d0b9dfc585df74b122103016519f248fd1c7330d522a50e4cbb642c607e1270112ac9d5c9307652dbe38052ae00000000010000000001011ca1b80ba6f907e1b62fdbacf53b544d87f43a8e903603466c1b094cd3bbc10601000000232200203162adba37249d06ccafd769dcd1a0101fd8f4aed06aa46b6e6c488d98c3503effffffff02928e0000000000001976a914a917ad38e81ba81bf29127574d240b4ec61753d588ac26a0d2020000000017a914855ce15fa5152ab3e4dfd1989cf63a5abe8edaf48704004730440220294665f398f0c6974efce5421814d9342458cb87a041dee4aad100dcdaced230022052dd4e3252668b47024666ab456b4dc1656e4f9bf33a08048e789366571ddea1014830450221009bfa36ad0f8a55b6c0b0680dce44f2fd1e05a409688900df9fb964d358e4fe5a02207e929a074f80cda19122986d71b5b6ecf235d8c92230528417d3a63993d30fd0014752210343030c6b53ff495baab4b3cb65e974e5ba4d025a053fcf9888fc411eb175c4f62103efa70e806c0f9951d8e4b55d6ff3f189c9225342db12d2112cd473539a9e853852ae000000000200000000010118b801e4a7fb04eec7a9b81e685ed2305157dd2613dec44ec378755b2444ce430100000000ffffffff026fc34f0000000000160014d878934ce2df135f11b04c492c372f01dbc94355765c060500000000160014a5eac350090592f112ffb58c17cb29623c6ea3af0247304402205b4895b31ad5be75895934d711a9f9e7ba51cb5a83af5872bd3a3ef21730f79b02203a074b91a56a8ec550711bb9793b43777d3465c7579b86080e0f35dc522b733901210305ff687062ec3b7dc7852a3761c53a3a342d5917f03c0bb5688b4c5e8b10eaea000000000200000002d2a9dd3294f4250432506cbefe061cb930bb10e3f05d20733c48f25f52fda2966a0000006b483045022100cb0279910976e73095f15e07e0189d8b7b8e86552baa6857a1b014c746f8344b02204db43405c7d345b409f092536d8d049766d8c87e82270edf052b94033362465f012102bb01180dad4649e010ce72677d7272148004197eeeef39864a901e04843af9d4ffffffff49ffb3daca4ff92868d61e0f5e706284c9956944bc42cb54fbb80b3506c55a54010000006a47304402205325f4288462a59c14e9de290f39e80e758d0bc2201037a917b756187e683ba102205e03a9c2e70fd35bdeee05e3362073372276d3ed1c1ec452c6bda3048ee3973a012102bb01180dad4649e010ce72677d7272148004197eeeef39864a901e04843af9d4ffffffff0200bd06000000000017a9147b0bbf2e7c07eceae5628f78bfd54e59f5c16d9887f5583301000000001976a914e1da2d02b2feaef5329cce5d92e1a5abb793a51788ac00000000020000000001060691bc8c20941dc0773a04e214bc44fce922158ec44a31f904c25e8edc16038801000000171600142339e07828b13ac6863f248ea250cf38220bc49cfeffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41080000001716001494abe8e499b3391d50d1e897ae47623b7464d13cfeffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d424000000171600149fa1901c34c96799183ffb6340c5f1cd2f698c97feffffff3644628c48663f29ae873979eda02ed935050bcb1443e750b5f68a2bc0f732980000000017160014251b8d91f0644ceaa3e9a1c4b609e4b3b244bb08feffffff9cd3eec1b35bb776401dbd4a5c393e387d012cd65eed539b8728e8adf1fffbee0b000000171600141a89ae5888ff2edb949a4ee1054b25bdce9f7270feffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4872a00000017160014fd39b29b7725b6d698f35dcc7934d1819ae02517feffffff01728b41000000000017a914bd9cde0d5659dc0b9194133659e510c6790df9c58702473044022008ebb6d61b01cd6ab43713d5ea2e050ecb18af7cd26f7a94f9345500e573c4690220500d0b1e47da61dbbbfb72f38f82a765fad4d325741ecdccc3bf92a5e11ea29e012102b23aa86c96383716f3532c4e81578c02be9df888443fb229113d4769851dd0a102473044022042fd4a005c3f657d55e684ea789d15de78079e6dc7bf581f09169b12c6ecdf7c0220397aa7b6bab5ff012a13d013ffd31c6f28712340fee47b5922d1a5e916b551cc012102b69f73ca4fef5998fa3798ee6963fde13fd2aad99159b13acf1de6616cfc37760247304402201920985a054d57e11ddc47560de2f91e378c98653fa57c9ce6f18023cd98b8c302205a75aed77fcfca883242e435963a8aca8f05002ee0a0253fefb8ffe425e4e6a20121029828f30558f5d76ab9542ab94d0ff8b242def153b2298f022ab8b007ba8161ea0247304402207310349d1f51c0a6657accddda73d4b0b3992837daff576c8275ecb575b16cbc02205b9132cbad520a529b5351a9565793c7ee02776bd19a58296303a144d44221d901210323ab817414c45df19154487d60b2a52bb1a75a90a452744026b84d79debbffab0247304402204a619abbfb172b63a9986558a39925d1b9a6bd5e50282e51c1bd2b79b48133d402200d9e629409c2303ae333e11e19a9d1c618568c5bb67291063614b849a330a02d0121036a9853fff7b65a9d38ab927d53da4b6a750b88a49b275a61c0c0098a122e66f40247304402201188c41f979df55fdf86689287d9cd1bd92184038410b9e0ccfd28ef84d5f071022070d28c3f747848e9a97d59bd1be967cc4404c2204d4b2eb736db1de40c42f5f3012102194904e5dc2ef647dba30d6561fc0249b4370d3bb2cbce53039b388719a3133349a00a0002000000000101b4d3d24e95ed788fdc94154e0017d55932a228103d134b8d538e43382145cb1601000000171600149dea825c31ed948dcef91e084b64cd480f05146bffffffff02c0450400000000001976a9142f0b8a4adec1a54363b221e42d7eb38307e1cc0a88ac67ecb1230000000017a91406f19824aff9b90bb52b859f64f27c9837ee3fa98702483045022100ed02934f1e0251d9efc411a8757a68e00f5a5a6368d898cf891331367291cdf502201dcb36610a008886130135f4e2034465f59230df1a011bf0cfe81be7be39fb0c012102bb67812146516b1bdeef5d54adabe66bb87a86fb29a410650ed898c060b87a390000000002000000000101e42b8728bee10262f0e98d3ad6bdffedc6cbf2d83997cef401a1243e83b9f26b0100000017160014a275e7990a2a2d7ffda637613b29e680b2cc7048ffffffff02b0ad0100000000001976a9142116f8bdd248da90f2320996bff1856903ab650588acb730b0230000000017a9145dd6c0c595c2ca99628919476cdba074c61e5e1d8702483045022100f361dafcec3f6327f554962c85bab9bb510367f436b86c7751527986996d15f402207a5fb822c921e670f392575e1893925fc154a57192fd41fe6720ac7a3365235a012103cf303d741b4abfcc977a868961e5f3c790c8830bf4a018fd480cbe2077d0d4ec00000000020000000001015d0dda4f37bff1acc602a39064ba95a84383b30c397289510f2f36ff7762db170800000000feffffff13193d01000000000017a914929173ba8ac45441e7b624084a05fd18adcd47598753690300000000001976a914caedf1a3b394c3580f7dd7373b090dee657effad88ac876100000000000017a914c077e94bb730827a1f2ecd9d43baa8a46859ce95872db400000000000017a91437fe3bbf05305553b2f1dad3658356886ad7e93987a44e800300000000160014a99b23b28260e667be568e2ae681dd1db11a0d83167301000000000017a914dbf8883cd3d12d8bfccc77ff66f8ca89a087eb9a873352030000000000160014d59b4e18e119bcbb5b160060508f094432fd37e12bed1a00000000001976a91426b24df497d1ff443f0fdee0a616bc38f7cee15e88ac8ea815000000000017a9144be03cbc2025fdd094092172951fd4d528ad078087f1890100000000001976a914b286743ca3722bcc3d1ddfb62833c0825273012088ac24db000000000000160014f26f160c38cdfaaf3a99122d035b33773bff0f6488c30000000000001600149c154adc7296e985c1496df950ad559b41f94259b8880000000000001976a9147280d4626ce4c47349e8fe3b3f64cf5fe3f9536388ac2c9101000000000017a914148e5339904209167ca11e79fa0ad6770e3d2384870dc9010000000000160014bed5609781ad77744359f57e0751596b2ffa5594886d1300000000001976a914e7ffcee6842409de251fbd2c6cc3c4628153258188ac907800000000000017a91428d30648bf12155a60e07ccaeebb08ef293f7f90878dc567000000000017a9149f5c6827825feb1c3f9288b1d166681c7af58439876cae0100000000001976a914b0321b47f25c1b7a7e188ae12099929b7443176588ac0247304402207304f3a7bb95e0bfa3977b35fba0037bd2c8ac3d2c2c110f27ed301e48537e3a02200937eb3ad40e9c98c9cce3bc4062fc9379809e90db9f2b4b7510fa89dc4715000121025c054f01164557d7ddfadd12112069f8b74144738aff79b07992f70cd3daf93949a00a0002000000000101f2590ac7b6ef49a0788238d53b162c7d9c94d8b64a8a6b4ba94d83106c46954b0700000000feffffff10c9af00000000000017a914c077e94bb730827a1f2ecd9d43baa8a46859ce958764c30000000000001600149c154adc7296e985c1496df950ad559b41f94259c1110500000000001600142cc830a0ed745fb99e0fc2dde0689e953fc954ab3fea00000000000017a914929173ba8ac45441e7b624084a05fd18adcd47598773a75a000000000017a91460fbcf4ce834c2d868941c23d9e2e9ad27788c748789420300000000001976a914b31ba4f0d1b98e83d36b01ce105dd526d70e018388ac1ea80200000000001600148bb2dc0c0e85003d37da850e95aa87de0464bb05db7eaa14000000001600145731ea6d9db98def692a66c9af12b4f1f7b9627990b805000000000017a91498f51cb03c0f296250ed3ca10a1f2694b2a671b68760f801000000000017a9145e9054278e373813d69f7ffa0216a076b1ccda8e87a487010000000000160014b2d290761d47f426f7871ff6889bc2b4d38f6dfdbaae30000000000017a914d8772c11461650580f255793bbe17c82b175c2e787125d03000000000017a91466c0f605bd803756de73beccb864269a9c5609058777e601000000000017a914acec067607dccddab1a2d61a875df8a8195cf059873b4603000000000017a9142edf2081100a4f740752ad988d69b2f0b646cf4d87daa101000000000017a914f7c1452550ddb2c4cdfeb15e0b7855b8d1a5d8e1870247304402202fb5e45e4b10afe706a90f60cf58884d9b7a39324ba102765bc468d194082f620220640056e74acdb9791f374802d740122ee1d5e2fe6bc12b1accf304a06431efe9012102d3765c5d7c90a4fa00f2cbe36c7ab535336f9d5412e65e947560197349bb0ba349a00a0002000000000101f5e9e7d2b3c26138fa334fa7cf72ccec2c9c291db5865dfd56953f7ed182c4b20700000000feffffff0cbbaf00000000000017a914c077e94bb730827a1f2ecd9d43baa8a46859ce9587aac30000000000001600149c154adc7296e985c1496df950ad559b41f94259b198020000000000160014e4e0517d3e681b9012f266a2f16a20392d906fe246350800000000001976a914e3107e925d111cb5aebba2917283a180dc0499d188ac03f9b10700000000160014d5936a055fcf42d46c1e4b6c00d5e91f99feff1de8ca1b000000000017a9140c13f185002fb10626a9dc9180772318c41e703787861b1600000000001976a9145c01907f3db32036450ca97b9d14ac70ffe05da888ac0f3406000000000017a914c0293c44cd61080841f9889a12e5ea26ceb06060871ae405000000000017a91438266e6a2c14fdc3a5e5d5234ae32778263d72478733e60700000000001976a9142bb13f48cad31138bf275e57e4f82939e1a7e75288acb85e00000000000017a914009a7e141f8588a73542655e5d90570ca1e8b474870e6e03000000000017a9141543f600a7eb5cffaa624670afe6fc3e109ca13d8702483045022100bc6ad853a772ceb9017f679dace1e57ed43718f0495b6fc386b888eea3eeeb1a0220158315735a648e703305fbbbe22dc61d0a50612db18de638d1d48c949ce0b00d0121034e6f4dc0cd5169b63544abb8aa5818051af481dca82eb64616f6f0cf3f4d6d7649a00a00010000000001021474f6397708e3ec58f72fa8d4aa52543fe64f99cb4b33ae37f532b5f9f7c291000000000000000000442b8ccd60549e7456130b3747dd5e9fb0aa462457d78527ab6dfdd2d64f60ae000000000000000000013e870e00000000001600143e06e2a98c4aae3b6fb45115a5853e0940b881cb02473044022064ff2227276295bf86acb2e7880de6e3678b4db87e51d57d7fecddc62831941702202934c9a534b929d641479a28551d77bfc79c5f27e3b3408be9ab10313d43d27f0121037ec5a6d31ef8ea174dbdd272e41e987530c0b9715f84bcfe9acff5aa25c535e002473044022032dcc2ea4c0035c1d493cdbe25b109f1cc54d384cd494c3527e487ce0e250b6002204b5353e4e3f86e6a4eab6d378d3479a5531e7e1023a244ac3de1e5a60428a0ff0121037ec5a6d31ef8ea174dbdd272e41e987530c0b9715f84bcfe9acff5aa25c535e000000000010000000177f31613188f1b214380720fa8686ad9780370a339a18659032380f56d38e9f5010000006b483045022100b12a51472ebe3723a804c68eb60de3bd5395c8e689d9a1aa3d72ba90412f6006022071d385e521fba48a080ed5a45393df3aded86c13775b48b118d32af1bd32a3090121035dc75274decb82edaa89947daef2fb8e7a0a816ca7cd0c14ae375a7eeddd1383ffffffff02f79e4a0000000000160014a43cc0a92468f124cf728ab364f06bf38629e20f47608015000000001976a914a984ce7add2748095fbede0663ab6a67424e4fa588ac00000000010000000001027d0482728fec9c787db7aa0ccc67059d5f423d392d589a99bed1d1ff60b5a68d000000000000000000dda1593f49b509a327cd8e394190497039811156f8c5a05532bb2948bfe2de0a00000000000000000001419ea20000000000160014a251a7fdf8f1ba01df9cf19509f3c63ec116262502483045022100edca2a35b7b7be640461e88492cc02436d254d8a9fcb856b1c02de8b8f88275f022042d13eadef97c1af454cb653e73b562a48cb5eb2b8747c41cc288f80c786441a0121034ed9dc941e405d5c9ce4dae9265ac097fd719f42cc4920a9581e6867f83ca9c50247304402207551f7e3c6a11fce403be74c18195c05a70301f19352d973e0e73f48d9258cc5022060225fd04b29fb1f0025d95ad401552b51d434a2d4dd35dccb9b9c18c907d4c20121034ed9dc941e405d5c9ce4dae9265ac097fd719f42cc4920a9581e6867f83ca9c50000000001000000000101a8e7b17e58f51e14d3a99443ade3a772d4dfdf648af3497e71aac46b821833c00100000000ffffffff029f080000000000001600146ff94b8c1bdf6bd7c7480f821570194d5a9d7143ded40000000000001600142ae8b679ec94f791d4cd9248e2872f8dbdaa8d730247304402200a5f13bf56aa3fd61b59d775355c6f7803835692b6c64efdf7b41940248682fa02204bc24f4fd5f2d589f83e3266dc440cf9e73856889da53ad9e82d4ebee3c0dc2f0121038b2464b025fe21e4b8bde084f14c5f409b340ff9cf03dd003735ae4d5f844e4a0000000002000000000101f041731931c5f7e97e93722cf55eb52e583c55e22dcbed0cfc5634c68fa7f25c0100000000fdffffff02882c0000000000001600145fa83cf9eefd577ef973af94a23f605ff0a4ef50f7af02000000000016001498788ca1080194d8ec0b21d5f97a4c29c03ddf7802473044022026a0db3fc91687089ba1dedf25cb19a9d2a2d7b7801b01f3d42877c759704b190220516b5ab9fd32936908a5c361dd37d68236ffe0d19a1d3cf7950a285a8dd6c2bc012102a372c509a4d4c1d35aa6a7f8e3554ea2e2bcd63a13d13953582a8f9cc18ed0b349a00a0002000000000101195c342f8cd7949ad6251c9ae38d0f29b11179773a4ac6117cee487a21dc75670000000000fdffffff026e7a30000000000016001400b3cc74b5dac1f777b33cf23dd895d519472f7cc3bc060000000000160014c6aef90524fe024486ec91715a53b078a6e9c0b6024730440220691fd5fc04d6df50bcc009c0e1a0918a7a50141f74b2c20477faeb2bf017ba4002207cc25fdcf163693464b1293a3357c19e7d7882ff5a6fac4c3b1d5381e52be57f0121038e15edba9f43b137c4e280d31c4992e1788d56db91ab677a94d00409c85fd55734a00a0002000000000101dce1f4448712a768f062b572077bd41243d564351f90802a4e5aa5bf70cd35f00000000000fdffffff027a5d0300000000001600141123dee69fc61d8484bd88f82badaab367ab8820f0112d00000000001600144c2381129dd6cb3dbc2a223ca70bd2b11b28789d02473044022002d24c404f060678897f0395e79f55e997eb5b21a961670e137512eaf9a0d9df022052c6a742ba2c3d1c7814f0427152eaf1a96b85640b65262a24b412ee825598ab01210251ece4c77ee9ca71c066edb91c7ff4c951442bb9e4fca899fa9aea9b9b48868f0aa00a0002000000000101d220e5a51e55ae0636d3553a2b1518aa6c5899110bb1de9461db50480c723e4f0100000000fdffffff020148000000000000160014af821ae14eb76654cdd8dbb81dce3574d7f0c375ebbe2c0000000000160014c9c85f95799f8b6b3219490bb6c286f4d58edd980247304402205ea777a79707d6454ca294834f4d0ea31b231928707f7dde84ee3872752c28c6022063358880358ed6cf76d2769ed0778443755806bdefce66c465cd7fc94e18ba09012103dbfee97cddb97e1bb55e6aa90f103bfd64580ce6d388caff1c8d28e978d56b4e49a00a000200000001d7a248aaaa0e8a441304b4b2f89a29f25cc6ab15ae607bfe4b0f6b58a176b13d010000006b483045022100b64be779fe1507a7e1b03f80048292e5bdebd290766ba0e46850141e83667ede02200f750b564fc2417aba3fb40581726909c60203a05b506982a372c8524a220528012103c0f7462d00d7d07f9d48d6bfab8934fc9c837a56afa1e99085b526ce5bb7b582ffffffff0240a5ae020000000017a914c49cb1d2b4c6081394e61eeceb360fde838c541f87db7a4908000000001976a9144e55697b8516cac8f3f561ec98f22c744cc5c88e88ac00000000010000000172754e26340d1fe63f450db9067ebfc451c7c575b4ce4c32d1c522e35681b6bc020000006b483045022100c11e0e3f4341f14c21d0c14b8ed4272f5361e98ec4baa93e282912b256c4fbf902204b7f9ea9be4b09c791e1df96759c49502deaa65d64b69e8579f672021558afc8012102cb3f8f961d2396fd2cb356d836a75e957a9441ac7e4cba6ad0b8c7542a2f1867fdffffff04808248000000000016001496eed2f7fbadf4a3295754ff5ec477456c5f4671dcd539000000000016001448000b552d165330354dbd2ff9fb17c42eb8fdd88e371c000000000017a9141011934ac43bd30bdb0614957b073750cc4ff16c87e0271600000000001976a9140142f2fb020d627214760de1246b0903a4767c1388ac0000000002000000000101e45be6eab735533a9d28f5e12222ab311db3532334a53fa89d1f56f77dc21ea4000000000000000080026eae01000000000017a91413a5c96224c611011fc5b2e0b3a8ccf56227015f87ed0700000000000017a91413a5c96224c611011fc5b2e0b3a8ccf56227015f870248304502210093d105ee8ae70cb78179606c9cd4551a6c0de8fcf7e87ebb4fe86d3e25c6d86b0220672ace9725098e67dd2076b62cc0fd8341d7971ecc6ded5a0fc661ea02cbc97e0121034b04846768ba02bfecfb8dbcd63f121d8e8ad803e318476af78493614f8b12dc00000000020000000251e295ab252a955e3d029008cf51799cff23540a6294d1e6ce7ec3224c631524010000006b483045022100d6ed81cca5018efc684d7fea58f9b0f497454a89b8e81e555b2b5fb7b2e689150220095d92a212eca9b8195a82658b1f8b523561aa293c6af761efff2831a500de4e012102a8fcf3085cb44296da60ec68a1d7f6ba1b25f2b4bee4c1e6bc44d2b8a069c4f0ffffffffd73aad8a1a25e2b5cdee971c5c95775a87bc6ed5f448bf0584c95b58776c9356000000006b483045022100e24eda142e119587624a62e4c09373e17d32b6ae0ec58152a5720cb74b836cea02205eafead85e3941706da7e30950322ac26abc58df2a66a8b77d62019d55c6cae4012102a8fcf3085cb44296da60ec68a1d7f6ba1b25f2b4bee4c1e6bc44d2b8a069c4f0ffffffff02f7d400000000000016001464349fbb1915d74f866cee7409c8fbe83eb3ac4005112501000000001976a9140670c5b419a15afff19f9ee0e9a5a09ccdf6c86d88ac0000000002000000000101ee691c2447c64d45491ce57c811dc0bd5d30af3a6c0c7b605cf4f9eae2ef09d70400000017160014e6f3a8b2c0b01309369a5ab5a13f41716fd42676fdffffff02c7b9b600000000001600147cf63be4ccdb55e5668036bd7f56082b822113bf3240dd030000000017a9148b8bd57ce7f174cb7030404de296911361e63c6187024730440220034d1f898847ff02321891a4a9ff16f7546a708ec2b33a02bb7840adecabfc51022072e8ea8cd72911adb557f6cd7cc8b612fa44e0e56b44032b548db473d937b6230121026661eb48d54cf8178090296b163b8229b4e70f7fd2cd153b6b19d31511e0d06500000000020000000116e9816d02760be17bf701a9a4065bfcd3df28aa7ebda1b046ca2fb9222e3ab6030000006b4830450221009b8064207d9b5d48fc383da41d4f4be7af04ee5117179878b223462d7d1770a0022048fb03e6f40a6b55ccfe37e283dc72e3669567602ba1057afc833f0d9b909c76012103aed81e425fbf93f16cd22e5e46fbb0e2ae130dcba8dac2dd3099c551c9ca8709ffffffff01dadd00000000000017a9146efcf1e3955e87e9c652da193e326f7a7f7983958700000000010000000163062e07e593e904d59302668d1efcbfd5c5c2427f9f8fb5703b391c7c0b6336010000006a47304402202e647afce18efa6c6e2e45977b501930b44d1cd48613671e24085d358813937a02207012078e14ee4f5281a4ecd71cb718be4e65492748918a4779d52c8dcc7df007012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff028ecf0a000000000017a914150c8c4e101a48cd4ab7560171da28515b930e9f871eb6e70e000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac000000000200000001f398265bedda8be40a5912eaf955d5d37ef15e5738f54c0cc1aef8146fff5dd8010000006a47304402202c3a1afa0234c7d5d77f2a1a4280f3afe0d5e3164e593be1cae96018fbef39c0022046e9c2cffede513e6a0781e336a0bbabe851f406e4adb290a00ec465fb74cf1d012102152dfc698d1a08e6b8bbe5bdf88e975b6a5471828e4616aac9c819445f7ac2c0ffffffff02b07502000000000016001437e0766f3bdc2cc3b5df15f85e19750bd4418a8e95d80000000000001976a9147a6ca9bbd4eb2aefd89524b825c5ac8be875e66c88ac0000000001000000000101d4b8a28171e733b7ef2edab6c2910060d6347d3b9fe97416604a725a1453ef0b01000000171600141332b886f25f7c8ebbd926e19ef4fa299e40b448fdffffff039c3f030000000000160014a869d63d730d99523f545331c3d0da0361c112f3d17d3a0000000000160014384c498de77437c85c0f758a185aa49a4ea9d2fb2403d4010000000017a914c6a841c78a314570f602e626e10f0ea479209a5987024730440220415428656ea714a5c8916a7277f52486b62a3db4e3faafa8f4499dc1567f342c02201322b3566a06cfa4571c17b152b815b0b50cfed1169658e46e906f750e3213d6012103eca9a586df1a21b287be746a8f558b135140f52144d002fc09931d2230238c8f00000000010000000001012f17879a3bf926a6cdad43da4743fbf4024db32c4dce205a12550e375429788702000000171600141a31c9c5134fe23953c69db8cf201b925b075e74fdffffff03c3b90800000000001976a914e6395a990af0c4552a86115bebb04e9a0e12f6a988ac935d72020000000017a91440517cb091f33b3230d200f97aafccf7adb174c987d56372020000000017a914e04510fd2609053e3f6748791d3dc0ec7f1f9f6c8702483045022100a453083078d1966960d8a878e0f6a94327f9e47eb065d401bacbabe37b42c4b002202e062b2aed8cbe4595fae17a39f0519b869adfbeeace4cedab701d108f3a4b520121037bc8a9ed421be9a6f6a465736d6d3991d3838425ad876a474e1a1a3235c87e9200000000010000000001015555e97d48c868f48b47c68b7992b23899a3c2f339ddd304a3f489b224aced6d01000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff048cd61000000000001976a914f13f9a5cddfd31a7fbbc75c061fc7da4394fe41488ac894a050000000000160014f842ee8f775faeb380e5e4e96c39a2fa3f19fb77d2ce02000000000017a91423d562f47240ca6fbbd1b2b24ad8df674413098387ab332d020000000017a914e39f3e8aac37cf712bd65ae854c3888a924246888702473044022050ee5348aa275c782f2a7236ac0ae368e1042e6b819841805d2fce5eee96bc26022018ce557d2ba28513c3809e93fa58c2e59d61f6e36127c58393e35acf6628f14e01210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b79260000000001000000000101e7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4877c00000000ffffffff01e4a01000000000001976a914ee15c895464295e91510121b2e564ab3a34276bd88ac0247304402203e9880e1131f40bc17df96279a0a24c742f70c7d64499145b79cd671039455f6022038d2445650fb871c1f6264663d51b0417b0ae4f4fb384d95fa6e22f7611d2a450121027a740fa4defe3632a51b979c81dc99b6601c71e49754e4cf9f933425a9c0be320000000001000000015ac976af33cce46f99113a28f447043de42745245c8cf8f1d980ee5307ed1179000000006a47304402203e344ae03e4b39c5bc594ca7e226c362971fa2631b4d4d9b011b715260f7a6ab022054e627bfeff2475e33b49a1000d03a655134bed91e73bed50633e27f41fd3cb1012103befc5acf25db377f01dbc12e8aba79d8573f8af8db6e7879b999cae2f1c60fb8ffffffff02a086010000000000160014fc836e762b54e0128bbd6927438389bf1bff15265c3da51c00000000160014019253b464dd814eb9cb5e8f4feaba8af6be6fe3000000000100000000010161436401c94b02b1d56bfec48d40520d55b5f33692f8a23a75b3214a810c649e0100000000ffffffff0200c2eb0b000000001976a914dbd4ab8065b68c61e24d713d92cbb4d27191979388ac453a8201000000001600141ce75726e812b2fcaf36d6a178ccbfd58a5efcd60247304402201abdb8aaff75bcd6280cf6451ee1378d02dc74070d0c2429c9cfc9c045fffc340220737a81c55d978c79035421ecdf3e1dfb7ea2111e235d98b9d800e76a4128a0460121021b7f2cb05643404c57d0587b48c8d882a454f1040c47cbd31c73d29b599d04010000000001000000000101b78c1eb9633bd99402877a5260d85df1d658f9df976ea2efd2ea647e83c405650100000000ffffffff0278ee03000000000016001442bac77ebf2ac7978a03feed5db756659614b1736001741b00000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100dbb3ff55e1396c05ae23464fb79fcd8ba1ea9fbc84840f65ecaeb43e835fc28002204a7b4d9373db367bdb9a5f4e2c58c0f84cdee42baf9090b356142bf25cdb41a9012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000002000000015a4996d93b7f582258dbb614392ad7bfff7a531172437e38a09750d39ab13cf4000000006a473044022007a6096159ba3601158853e733d8d4d9383293863f765b026d1bd8ae2c0ef81102200d90e8ff52c6c992c0161c10e2b53b879d7ea1302464112abaa62544eec4f6d401210387bd5bcb4f6f37c5e8dd53632c48e723003dd17db9db8b962c03c0ba48f994a3ffffffff01ebb4030000000000220020de4de48e88ec3e4edc45f73c9ee6e360ced9849aa3e8f93dac490ca4ad6719f0000000000100000002047846f4f6b09ee8507d0d48dd250e10c61723f27f665839f126e5cced809f8e000000006a47304402204e734c6fdfda49dacaa1cde09e302cd538247f5d0f7ca0dc3af6b9bc3387a08502200823d19fd7864dd7aa15e62ba16ea0a969dde2494787d0e9e681ddfb1c23c926012102a8da5712777b95931cdf5e4b5d4f33decca72057f2ace056bb6ebea634d446c0ffffffff65c82b3c38e4fe3bdf66cb6fa37b6c37043bd4eb76e204c8bd1617fa22ec6acb000000006a47304402201b0330286d22aa11976150835ec65a829a238a4729478385225c043b51f1345b022020c71ed43ac60f961947b4281619197eb886127a636f1b08d329b70e753a4e90012102a8da5712777b95931cdf5e4b5d4f33decca72057f2ace056bb6ebea634d446c0ffffffff02c23c43000000000017a9144e08aebf1f6ad7f446b1059f7f97ae88c8fa2bf187f9030d00000000001976a91438dc21e5c4d7653c55adfd05b8f5355759812de988ac0000000001000000000101037c073f801a8140242b02f31f6480298b9b0fc44510e3ea9f44f128fa37d56804000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff03c93f02000000000017a914b1b731d734be5f772d8bfc84e525de7dff2c4d6687e2d20a00000000001600141b39bc297e9c70169d83c31cfd181731175f6a28c9d422020000000017a914e39f3e8aac37cf712bd65ae854c3888a924246888702483045022100a2b82c1a8fa1974aa06ceca1ad687393e6b79b1a7e05166357dc82022cf910db0220299ae3d792c6dfa9431553b8cc591db2d00ec63cccf4ebfb177733b80df8e4f401210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b79260000000002000000000101915ed34ff9fe7c45b9572754caf983cceadcbe21a2f6774621ca3be897083dd40000000000feffffff02f9b672080000000017a91490e0eb80221c480829eed9b07be1f2ed22363b7e87b4910100000000001976a9143c81848438a91829c299dca4941b01ce19b7ddc788ac02473044022041bcfa2433b95b684d722210003e55ec85bf96e86263842bec9ee64c55719eb0022047c4db12a860991e1b3b984d6d61820857f5f9f03aa90825a89b7babfa9c2a1e0121023840cb70b3e47c01284ac1313196adc6efb61642640cd86fa6f5cb5fb298119f48a00a0002000000025b5ad806cb4d36b7cd9f8a172c6f88fcdba76c2702694df7e0a8090ec2320b1b010000006b483045022100aa1a0009b229ffc0d20c0ce843eccc2f44055a82d9591d3b55226a3c6a245b1e02207ef1631dcfa315c859d54ccb7924115c92c227d4985b52827ed8aac9822bd9b6012102081c18480c29057e3f7bf28b7e6cc9350732c56a1ff88c19b922d3a1948ad5ccffffffff45f66bcfffe7719b920fd0d124cacd7e8c53a0f1b517871bb67472cbc419e421010000006b483045022100edfdf42455fb164ea8acd1128a9d42fd0500240b368df5481d5020774496fc9e022054ab10e9cd4212a84512104ba9f779ba9596472956ff6a52b953060bb81488bd012102c90f04f03089d10b54420469758b8136fdf9d26b3d87ed9ca15f5ae1d9fc99ccffffffff018c790100000000001976a91480524a76b63708d869de91bddc83f76be4cf1cf988ac00000000020000000001021e372fd580d060de08fd5e605c940288c467ae1581df54de811b205c592e9bd74000000000ffffffff8f8c9744cc23a66acee3886bb50ee60cb33ff5557c77b5dc4f968a01a8d5db770100000000ffffffff0128f41400000000001976a914ea14625dbdcedeed0a0473d42e06db4828bdaa0988ac0247304402205b080822e912d8c8ad42e851c0e4400ed6d1dd451fd3ca3c2601e90239b4446802201d14005e242c68ce82b917ae5a5997b4338efaf0b94730935f83fdd0be0fccf5012102825f8db705621d260e13faead617f0c8b2e0c3d483d6baff419b8cffcc5a3e4902473044022018dfa204c082fb324498e7ec08293bf66d1e8bd562d669984f9a0b1a409f296102201f05feb288b074154ec90421a10ef645ed6e61893183e91fe092ef2d7aa302200121022da00ff5170cf16b83ccc98c8b860a4b4f476ecd9729a0d0f44ce01949b572c00000000001000000000101afeb4cba4bbf22defa352977e213f433511ae6997a8a80183392a18b28dd432802000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff02e1570100000000001976a914a07f160fad115a487c594613cb4f0d6fb88c2caf88ac713548020000000017a914e39f3e8aac37cf712bd65ae854c3888a9242468887024730440220229272c3cc1863c61a8e0a893d0017a7ad2dde77aae53f76d738479ab3a7b5b00220553394eda965833e775f4daaf64c3b6b619a73e1afb96e19f2495a97c0a2e72a01210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b7926000000000100000001bf30f279a30413f8f54c550d674cb25389cc9fd18c7d61660df32a2d7a5454b8000000006b483045022100df311e332f648a9ef0bb5ec4648899051653cb7be8f683f47ae369645730518902204aba884a8dd95689894648ac5161b5a3b0c33ebf4db571c195bfd4bc63b549ac0121026db866c3238fabee81f790e8dc4663548c6b1f7ba53c185de8e769ee92c34d6affffffff02a0860100000000001600144f0260731c2facab6ad96dc3329a41f375cae32b44e8ef5801000000160014acb17c0fd3ff55ef4394f86425acc18991491dcd00000000010000000001012d90abd1ad3caa6b576e8e476242c70bc9180c52971914217428bc5db9098c590100000000ffffffff02b33001000000000017a91424793ab33d4a0681f14bf6d7340f06f41dc3760187ec9cb94102000000160014601f9c9ea2c2b3bcb32b87e3b314df292720e7f7024830450221009108280a20979f652ab264b7ee09ba2c551a2a5942ecfb0b0788eb9f26b9d31202201db8b85b97d5ce8769f3aa475064bcdecc871eac25c6d733f78f2affaa6066f10121034085134fa091ae6b6c0c6eda885e2a0328b4abe70f7129050793f2b32a1e10d800000000010000000001014e557990ef2af925731cf14434a70b1e698d6247ec55882deb1ed2c1279377b50100000000ffffffff02002d3101000000001976a914249cebb30b8ee496a90caea414265754fd2bf52d88ac23ed8a07000000001600142677655702ef75d54c672cc62f7a997302b323c402483045022100cdd30f94d61afd464251eeafdbf78688bd96f153381b72c57072ba9ac0ad8f5e02205d16139ace6b5dbea9c593b956fdbea48b524d3f7da12bf6b373020ad93475cb012103262587212166a8069cf3a5f154fdc5e4b1cdf0beddb85ead226403c1a878c3d90000000001000000000101de309113b414e6d025540f56862116ee1b76e58b51b46742f114a418051ad12f0100000000ffffffff0222d710000000000016001403f67d592263bd4efc9fd6b55d6388881673299630d3ed9d02000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100a825fc62c5e87dfff993b9574fdb2f58787640a181521df323b2edb0797b40c302202332ecf4b39ad8bc2c55ae7d178335fdcdeac0604a6de27c1aaf154b32c769bd012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e71000000000010000000001016c74ba84ddb8784748106aa4ccc04b28e7b9b7cedfce6be351ebf3f1f97ba1be0100000000ffffffff02c58d020000000000160014b79cb39ab49a60f277b0364baf47b12bda494ce1d4b3ff4000000000160014015768f2f8350e4a019b1428f9de152ede16db6302483045022100ab63a32dbdfec6f6543913c51218358e613484693fb34c1c6c40b8e9e6e2e0a3022056d14661770fa30cde09de1c1269cc87fc3649a7170485bc01355654ea6a20aa012102f6f5749dfa3e9b448f2c0ad8e89535b55f21217128563e315d2c9e34f999125b000000000100000000010154c0f24ec859b8913757473f2077b46f328ea5ffc267ec18d20b25c8877753160100000000ffffffff04003a390000000000160014814f9c1cc47a2e5d1367e095ba013ae300d2bc5c404808010000000017a91430d6ec5803cbb4269c358f935ce7f9900dababd987b85d030000000000160014814f9c1cc47a2e5d1367e095ba013ae300d2bc5c350896400000000016001409506e2fcc953d1722cf513c34116a1f4d3bbd1e02483045022100a50cbb146ab1e80fd806233457c9914db65a6df7f25419fef2e66b04ebe1fead02201102d94295bc23867f9be2ffa74658326543777b39bb57cefd1452313ca75c12012103bf4563f9e7baa3fd5d2c0497ea156d617b1533a5d6194dfafd54e4d2699400d40000000001000000087019aaeab9025f08f9d18cde36e3e664e23d5256bdce9f384c04122c0d34d68f000000006b4830450221009948a676873ddd484fcd547c127e53c4e1897b64ca0c5119ee4d66e6e33e83ac022044af3d1e21c5b35158987ee30d970586eaabb603c60f4bca93c01dbc4924ccfa8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffc80e149793278d94725315f4eeec96f4f501f2ffacd91844c975e84c78439fc1000000006b483045022100f1c8d9e78e10e22da3147af2f5af22fd36afff7643ab27633acf243744e450e4022022518e80d4b584bebc9e7a98b8f6aabd3ea22127dae3fa9eb5e2bd633ed2e8ef8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffde9360f735bb50186eaf241758524bc22b702e4ec82c1932f008534397ea24a7000000006b483045022100cacf859b56228f212f888a55b39a1214b7a2f7eb5d43f8a621fdeac0f09f948c02201fde9656b9c87f85fbde8e608914fe8a09a24077a26f14ce866b6d66e0c5999d8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffd63a6b983fd34d985ad2c9629b735c7cd51d625f4b2aa5477743a5ef335e872e000000006b4830450221008c3c9aaaf91451168287036ef70470b903efcda9e5c3e017a6306dc5736713e202203d26806f0dde7793a2543daedec83cd6852f1a4008378d4ab737b89323eb2ac98121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffff3c67498bf58f14527caf53f411b7dafce2934f360bdcb0d44336c03af1d2ef7c000000006b483045022100ceb27975232b652ecf94343ca0e13d47a62a2f2be5afe456efcfc236e5d540fe0220111ce3f547e149862f40683c83c325966ca832075bad4cd4b9fa90eb03ab90f48121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffbe4ba7c1dd1d4ab659f745e5237b74f9d610ae309e6d7747dee040e17bb96df7000000006b483045022100c31c5d9c9d8e200b5fe35b7b072a995b772c3ae382dafa0c38e17bdcff83744b022011d9cf6e24887197191ba91f2ba8809fa13be7eba4b7f09e63914310e2a14bb68121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffff9faf8b124f8d07704b2e3ba65ee5ba71ed070904eac14c12a32ffa4b86b46d95010000006a47304402204ee7a65e2fd38d04748b8ce3ee5035aeb6d48f58ab0c73084b6debe3d5b80dd9022002596f97f2205dedb8a5d45030e235b3c73f2604e5f87b7e1830083a821868888121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffd74b96d8c1c09effb1bd6bce445fa3ad95e24ca333f8c0c35e8540da08a9af63000000006b483045022100939a8538d6ae6b1088a23bd2b5b996df7b5268b6997ae46a70373627347f1e2c02205c79315f83be0733594c738b070d1dc2519872eabb4d4acf4a4fe3293df7febd8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffff0254c11c00000000001976a914f0b2c1e09b9519bac1e85ad83047f90e201d3b5488ac5fd90900000000001976a91464c94fdcb368dfff2525e34e1a7b3d9f2cdfd90388ac0000000002000000000101997a31ad04024684145add79d72e4aa05691ab7b0d7353df6e855abb6649242d00000000171600148c51c18db081f25bfa3d131bd4e1e9e04251a302fdffffff01cbb0eb000000000017a91470cf5c70484513d6045fb76a1db7f07695823f0c8702473044022057fb54bc21ccb28ee92166d19d849e99065350a07bd40de578333a91596f4f1b0220337ae8c096a375c5b35766def80cc5d51d9c74052f979804919bd1a2b3102a6f012103d48299d2e28e6318045fedc5ce1befb0157e5b22847a81f929ff6005a9a48aa149a00a0002000000000101c8bfc066b79b128f4237d05c2d45fcf757e578f9257a642fbe04ba650e8aa23e0100000000feffffff0a3f530200000000001976a914fff710b2a455b46b48a43fd9b05b89790992a05088accd873111000000001600149fc8672a85044717778639d484f1d0a257f62af7c0201f000000000017a914df325a61199b99e7a6eedc37956187018638a63e87777b02000000000017a914ee792e8b10b551ecf6689bf9f59ffa941d625f5587b0ad01000000000017a9143c4d6fd927e642977b95bbeee872290f785d90f887803801000000000017a9142aa4d747a80db0b85b56188c74adde028ddeda0e87b0ad01000000000017a9144c2f27044a63eb2a5c2b9509c96a309ca92c082987c23f06000000000017a91435ce1546297c676d7c8257a561bfec8f5aa10d2a877c373e000000000017a914c5c0c96d947fff135df395071515dbe1f373a6898780a903000000000017a914ab702f429fc4d6bd15b81bfd46d99c9789d40558870247304402201093a4397bd9009aa47dec1f962868d488daeefa31d6c305fcc32409b5f5e638022054ed5cf7c783a797927682c9828ab822a368a73db2d45b0b24c4b6372cd91e93012102cf4fb6b759f41d5487f0cb14ce72618ae6ef0cdadda673f23e99e5e9ac5a51ee49a00a000200000000010163484044d9fef3226c7c01fff4348add1ae4171c0c582b9a59aa476029a583460100000017160014d33229610cf5e86b4c34206fc4d0c8512d953e13ffffffff0260ea00000000000016001421f1ca34d806bb998b82ab62bbc92403c6314338d73baf230000000017a91406f19824aff9b90bb52b859f64f27c9837ee3fa987024730440220757faa7ecc6a2d9ad673e24080fab158d29a514a0857ffcaa1a0851db60442a302200181afff7bbc2b386b9bdf46a6313a4219ce7cec7ad0e66d6775b5d214c3aa3a0121025ad6d3c68b8851074530106547e8cdc7f440c33037e8dc7ac8d7c87e9936bfb40000000002000000000101e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1561300000000ffffffff01da7301000000000017a914ca770b1caeb2412024ddd5984946f953ed13eb398702483045022100b89e62d5a38f061d2feac15dbb453d5ae44ce58ef4fd1fd6193676a7f1d625410220300001b128fabba69f7090f77ad9f16cfdbcc6c2694f44d8a2117d2fbb04b33d012103fe3029b4914e5ac5d845f373123d2f59831e3b32ef832c066e3f68143b0528d500000000020000000001018c5cb8f7cc326b20ff2b96aef0ffdac459dfaf0f3c514475602146406a9e12790100000000ffffffff02115600000000000017a914d46ccca5b194876969829c211d6ab939fe186e3f876ab3000000000000160014f5f6cedc8fbc72a03c68ba02f0cd583f5b595adf0247304402206b510b3d7c2f9e5c1c57622d004dde5e690980b1275736c8389b77c305e208c2022013481c7bb7469e78ec5132c93c904533f1053ef5fb9d341caa87aff6236a11e0012103ae1bdb8ae7ccdfd686d5011f0bf12020b7347331ad3b06e0ddc78f1167dbeff20000000001000000047f0b22740f51d27104c8eaff91a05f78a21e532948083d0c2d5dd85cbad03830010000006b483045022100d8c599aebbf4ef3d20e86d7bdd54101aec74a53d8a28b767ee9798815b88ca9d02200cc1ab093b7abcb46eeac6e5a5954cff6ca1d5584104633df7f10bc5f25660e10121031e607a300321f8d82deee739223a2bf1bc0fa57be2241415adc36ddc3b7c7e72ffffffff5902a97fd2341cb1008591115cc486ffb0948dd0a330b55f7ee01c1820de453a000000006a47304402203bbcb37c7c4a86980994682433d910bb5c030b51973e8938abd2a31a37cbded702203b920be0f927ee2d7580f689d43a04b6c1196d388d4803db6c73fa8d546148e90121036f3ad99e53bd6970aee5423cc340009176e80d332628f23bcae6065e585cbfb9ffffffff5488309da8fe1c2dcddc14eb03d8c930ad8fe741535e8672d00785b0e02d59ae000000006b483045022100c344add9552558765629099998c5c9b70a694b054643816918d14b92611c614f022028252758765391080a8beb39019bbfe4efa623eebf337ccd775b20b3a0bd6a2e0121036f3ad99e53bd6970aee5423cc340009176e80d332628f23bcae6065e585cbfb9ffffffffdc9ddc676fb14eb213ddc56ff4a742902e892220bf79b2d5151d60be00a615df000000006b483045022100d971e199bf1e4938710950a539aace3aafb16221accf7485f2d147b142c3e5b002205db3fb500b5bc36a81b4b14ad7e479735e59e4adf85f3bc77d2fe7bc5e49e5920121036f3ad99e53bd6970aee5423cc340009176e80d332628f23bcae6065e585cbfb9ffffffff01532503000000000017a9140639ab28515ab076d9f115a27da99824fb249dfd870000000002000000021dfafa537bd883ffa5c67bf374955d9a44eec9ac459e0aae2b5681ea35d0a935090000006b483045022100bae895077fa959b815a72ef780322bfbdad7528e782f98f16854ad34e4e4c96b02200571ca0899000ee984c95ad7f78416535e40c1029ec464d883c53663242ca303012102b43b1c4a42e396869da23c6e464c42ad67a90061d11598f3d42f077d21bf7010ffffffff5d563411692f1e2a0f93b018123a0d384d245d8af0935601a1a5871ceec477c2630000006a4730440220304350f4cf8dc45831e0792b395db7ff39f28764bb8d3a81d1d1a789e9808a8a02203d312889b9efca44d82773b11eebe9861e9751fff89cebf3eb899cf532bfc945012102b43b1c4a42e396869da23c6e464c42ad67a90061d11598f3d42f077d21bf7010ffffffff019d2d2a000000000017a9149edcafffac79ec129f6ec7d233359e2f2df283ea87000000000100000001056e8bf5a2ca579a12da99e5540a544ef241bba8debadd19e2989431cdef976a250000006a47304402206e3be6ce875ea8184a427e2a37c8d7f3b683671fb706a97ad02c7f4116d56b1802202e45139fabe8086befb3ce77a5a8d0224050548a6208b7557a8ef53f4889535601210367a13b9cb091d9e86e2def758ca9bfa4bf65da3633e90541b961cbd973123952ffffffff02406b2700000000001976a9140e5302a9f548459e8f28bc152b414f6c38bdb54b88ac0cfb3300000000001976a9148710d7396ed7afbba359bb5558d764d09bac2e9988ac00000000010000000174eee0f0dc3d5e47648e11d8071043ae7a6e48f5307e073afda4cd7767f2dc70030000006a47304402204437575069b93fa4a0a4d1e1e1e57ef915169829a919cf9a95c89b13f2d86f4102203e97d8a0c80f7337ab282f914b043027d0d84fae94dc4fcbdaf33ffea78e6dc601210234e3640192b624be947cf4e100aa47ec3b8e368f10e6abbd8048c3d6aa4b28aefdffffff040000000000000000536a4c5058325b76fe79649373f38e2676c4a6d9636578f2f19abe8aa6c502171b3156bc56e2aed9f4d1b727c622272d121a2b86c4b73739f8f3cc190c15444ba453c1e6fbd8b9000aa04900dc000a9f78017903649001000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87649001000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d876a047408000000001976a91415d7be40e810f702ad45027991a17eb6eb30f20288ac000000000100000002879f3cffb913dec1b5ec4e003221ce847e57160e2604f937a90f824ef22d715f000000006b483045022100de23c6d6d79ac0a8797bab927bf55fd2e633098de33f718bf29f63523f41d76002200f2a0979d16ef486a83e1f973b95576bed2632f1c2752a594e32398580bb64e001210295812b415d3e34db04f9b9254de6e6ad90a0a3b2aca78e1eadacd936d68bb7afffffffff84686fcedffcbc8a67da372c44c215cc8c81925418df7d6d7193199741427f62000000006a47304402204aa3bd71d4974fd5c01d4f7b65df8e9ad97cb285a3b535c05cd85aa43067312c0220205b4fdfa49930f7be84768f5738ae0a6215553c3f49710588af3644810a9b3c012102d915f1d3df0790d596e6d65ad80275f00108acf52a62a75eb22e392d8c774de4ffffffff0274770000000000001976a91494394df910880592dd3bd2cad86b91db7a0faf8788ac90d00300000000001976a914637d5548846945e965d41458d0c7c4e57ad7d51988ac000000000100000001bfbc8b4ca56dabf86cbf7e44de3dbbee0db46683af5463b71dce93bdef84cef2020000006a4730440220245ae3241f810bae5548090ff7fcada4e31da11a94b721bcb60d26fa8b7f3ae202204848196bb075bb697c31801b6b14049bf830247a644a58788822bf00c7332e42012102936c15394948d03a7ba3d4a7e7c7523e14194b3ab808cfe5baed526e15bc0651ffffffff06b18c05000000000017a91442b7ce7b1b13222c59794192b0e522dd51134971874138030000000000160014dd34a0d2d172c5bb4114ae2f84b746d111caafd1b50a0400000000001600147a6c76197aeb886e7dca2478969d9c71cbd06c9eecbc060000000000160014b427f9f0a869bf64ccb904cefcb01c69e8eb42636e1006000000000016001490dce4c962f185bb27a3a9db23b58799a566e35e88d1ad20000000001976a914c8a6bc95dfec3fa60785b300278d5378c6d453a088ac0000000001000000000101d8e3ec8a7222b0dc43a1c1ec31d3f40d6c753df8f1d58b9053878f1b037d826503000000232200200e63d6b3d1dfd699a0a531ba0131f91b41d6b05cb9bfcb7d6fb90c0f8b2e48230000000006be0a0700000000001976a9148cad749d206f9c317a3a18f01b93e56ad88d5c7088ac04670300000000001976a9142f17b215d440995480edd350ed3f290ba98356db88ac90d003000000000017a914a76c419cbb5c2c3b42e6867f04fda51ec240519a877bf30500000000001976a91491fb7aa514a042409ad4d9030883c39ebada3fb988ac6ee96500000000001976a914742936c50e25de05a51b6582cb1994400fabb76788ac62e043010000000017a91411c77a756d4a2a8870fa28e3338f493b5acc5369870400483045022100dec298f8f56c31f27ec4bc66085fdef9eb609a758ea06af070507f5284643857022041db20d24f077e17a7ce80b318e19666bb01ce621414f8a10a35a1cb4adbf6960147304402204e3d414f321ff9d4fb15e5af400f3a97e05095622b7590e754307236bf73ac000220417ab0c678d754fe38c4e81ca5839cff3ab06bd0fc36d0421f5194511f67835301475221022bf4cc830cc8c00bbfc682720a42793153c7e3834efa902dc89b0200152262a221039e8efc18dfb52f314411ea607ab5736b7e7cb1bb2b2dc451db454b615bc466cd52ae00000000010000000001025c7ef872b3b0c526be7d4e05e6e70f952aed8843f879d587cf85852edf779b930100000000ffffffffd6b7deae1da87bf1d494e446fff3614881b284989eb77c6711de8833bccfb9a20100000000ffffffff02a90d090000000000160014d30e34fd5c2d64bd6c30f92a6feb44c1492a1336a8341400000000001600140d255571dd0091f2b7ebede582f328d784df260e02473044022014cc9e47e0c016afc50cf935c60dc7b12be758963c4db87f3a07f0eba1e1a373022068d43d6a978e7bfd7e79e9e79e2c4f43d8cb9509d2e0b86d43056580399e6740012103b44820663183f6553327447c66c63a0ea14ad46ce672b33b3035fa4ef1fd46fe0247304402205b8bfeedbff148c0233cecca13fc44a356f35c56b0625db211526730efb4dca902203f671affd8b08a42d74d68658ecdfabb998bb7c44287f29a8f386215bc4a2a6001210249760d81021b66fa244dd52a92813081f0b26536bc866558f0cb496c4c763a160000000002000000000101347c22b6f845b36a385a3c8463716827d8c20ef89402618f7d116f7d296cd8c70000000000f0ffffff044983090300000000160014015f524f21a6d8e0c8cdf9338467814294dd9fbb8abd03000000000016001482ffa1a13343543edf1e0cb5c81fbcda09c38f96f42d0100000000001976a914fc51be0c6b8d4b2a975e73b046e50ba36d50889a88ac62880600000000001976a914c329aa71cb801cc809681f0f0466a31af49266d688ac02483045022100db315f1a3754ddee15daf89c0103de42270f9cea5ee9feec6607d3c69a0c615e02202dd251cb2946a4733a56e3ef32d1f2de2922d8010fbf5943cc2c5ab81390e802012103e0ebb9dd2a9314f16c76a0c68ea4dd2355033f95a3294b01eaf1f6aa1aaaa3fd0000000001000000021cd3881a42438c3a65f979f16456a1a6e68f48d1a485570246e4d94ff7ca82c3010000006b483045022100bfacdf4a4757075ce4927868096762a932718dca9dc1c1e3bbb924498a4efa8402201abade090b48c722de262e1f76ddbc215524e6c17caea17f08c95f4a66e1e07601210394e2ce14a618a1347d227997fbccb67ae199c82cad0eae7e61432e224f8f1a7affffffffe63d56f353ceea7beb9802b327e86b2414c713dae78edb7ff1f92d7c581cb6f5010000006b48304502210096c20730914e6c3f90bd810cf9835179456f008cb1846011b16c8fc1d75e0ee902203c0d0b42a857a056f7e7ca912df02e654497b696c63688569ca81a1bd3c9a1c90121033545ad566adea3387321e760acf03f6055c0efe25ece048846c17c0473d52afcffffffff027e700a00000000001976a914484cb9318941726d583454ed26e38a750eafc39988ac341d5400000000001976a914daf463eb051f4656d34da6803765625f3ff5eb4888ac0000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb247604230300000023220020861e8a82b55bae5913f290b240d5790e94eae00e2574d470bcc5641171342d7affffffff03045b00000000000017a9141fe6dc4a764c3464eb3891636d8373bc3d58705f87ee03b0010000000017a914e3c0b5fa515071b775b957d56e49330433db88cf871cf50700000000001976a91465c2487c3d8afd59a5eea9ec9a2241dec8208d6288ac0400473044022046b7cc2930d49e56ae0249b4af389e301b962eab85f8dbb5cd69a196525ba9720220070a29e606a08953efc72880df47ada88e3b92ca286c4fd2202ef607acc70b860147304402202ec96abe5ce2cd3df49f5f9b8a6551afe34f05f57cbf3ac424b41c3ce2594f2e02207f5d74b9227c4f9a927b7e952fc3fbbeeb58dd5cb491a7075aaaf4fa8b7944f701695221024b8f84c0cd915304652937bad645c60be3ae1d0ada216119a94de380fe609f6121030caf41a5a439bbd0bbbbec589105454ed48c9ee3736eec69f0e03b83ae0a89bd2103fb7d93a3b9af7cd176d189bdb460790afc1311d64173c01d7774eb92c530de9153ae000000000200000001df53ec004f22c48ace3df84686dc65797bd107fd2c244e46ddd0b749120163e1020000006a4730440220099d76036ade9462a96ddfe0aafd56995d1aafe273432d0adebebd476704948302205dfceeafd198ccab1985a3360c0cb285a5476f323628e8b7071f83bf0d4503970121031ef73063e764ff4e811d61616a27bbe9f4e4c31e333de9a1e5c39581930443c6ffffffff027ad607000000000017a914274f0e4f9c63053ee8e560c23486b103fa018eb98762070000000000001976a914d771bed5d76227886bcecab7fa6dc6e76900b0fb88ac000000000200000000010171c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd342000000000ffffffff0160330a00000000001976a91456898d2fd43d77986218914d796ab87bebe0b2b588ac02483045022100efce91abcb08af4c34924132a0ae5a82719f1dc8b6ace14e820afe7ae104cb7a022003733389c2cf63452971fc4220dc6030c3084b6fe8675549e8db8532369293b8012103d0ced0de2ee6f415b4cc67938a278c7ed7c4d2da6927e77ced202c8086c9b258000000000200000000010190dbb26eefcf427135c8a5f9f111543cbdcff46c16927fadd4c146f12edfb9b80000000000ffffffff0132540100000000001976a914c5146a6641bee3098437fa818ea1d50347f79b1688ac02473044022031071b5c9f4ec6e29deab8ffff85b2e403fc94ecabe279ff2152df41ddd0baa702205a8c9a3dce48799fe466bd8ea6548c14a1db3bc43584d4ab23894becdfa82ff3012102eb97539b5f828b19329a78387a83b8be8cf8c8c10dcd90103f3ef3106bd55e660000000001000000000101e8f361e556d8db1de80aacae003438789a1d90f0b58d405abca5c31e27c41de10100000000ffffffff026602010000000000160014df2234de88d760b0cb2e2e342b62dd52da63e3c398e1490000000000160014cf70f967a78e2f89daa0d604f1a7ade539ab482c02483045022100c683eeb4a03e7e8fdd7926be6a34e57c47645d9001a0d4b60b77a550e6d61bb30220769caf7f4cba0b6b98e6ddfba2ae993d764d4ddca73dffb1f29279cce59e3323012103778dd193fe9a70019cc02406f1d36bd221249b8b601d24c375dcd8988f5aaca20000000001000000000101b49137e62bf29ff429279712ca1b8dce0d5b2e6976d4f003cc789d60fb11b9ad0100000000ffffffff0230800300000000001600147541fbdd322e6e957c8e3e56194d4d58d6aefc9b34fd160000000000160014d6d52f1ec74ab98be12bfcb29b1df1f64729e9380248304502210085b917448f9a286c352169abb358447499e22c6a7da792d0b0a15b7d19a6b836022019a10ae8d891f2579dc8c828d399a2b2741aeebbd408441998a864d065f5864a012102fa9d90b7d3b8781fccba936a02f0f6bdd32eafd3f3830ff1c502cadd6666824300000000010000000001010201a14f6c8402c78f64bf6966b356bda6fcf9d49b367387e9183d9794d84c7c0000000000ffffffff0165560300000000001976a91493ff551b496dba8477f6c872d76c5b08334b9a5488ac0247304402200738885731c7b8f1dd8fefb3dc14d2b5779c8b56bef842b264c93bf11634f863022012bb2ee5751aed42c4b4644e078b2491aa011280b2554d08d494cc0a7ea477b1012103c0cadfaac03e2ec2b5b01d4336cd90542677bab708ed812f8aa8895a6d402d5700000000010000000001011d9257e02acf8160a4ffa5fbce48c695d4d7f602a1936acc773d1fb193b2b4f80100000000ffffffff01f54b03000000000017a914ead79244a4a6eacf45927b47240627264083288f8702483045022100ee74443063e11ff1dd26e21555ab3eabf1161633e3d01f17376e96be047dc93902203b7f31f0e4306bf2e24de55eef25bf5c040712ad4bc431c4c586d9ed8069336801210235166d1ef859e0340f05b4bc420a1dec7b3e2824fb2c757535791c602749a17a0000000001000000000101a1e3410f4dd773d55a4d22f413d94f5b2b2da7423a551c5ac8237a6ba21295830000000000ffffffff021b5600000000000017a914ac4077e036a9848dd1ca7882c7eaa9b8354cad2e8715e5020000000000160014a17616eeafec6d32794326111f29670325fc767402483045022100dc6c2df7eae29db4882fb30264f63d0f7eea5fd17a789e11816de9f4fa2d1fdc02201d0c1a5e378ba5c8c1a03ea16a9c3ef7d38ef2f5a572188cc0d683689ec93d5b012103b2953b1ea1a8afe8ad54c1710baabb8e86e1210cfc8d2226e25bb63d77b473b00000000001000000000102bd05bc13ee0bea3a168c1fd3351ffcf12730a2054dcde6fb85b6d56c5621a36f6800000000ffffffff5d198858afa9401244d03c2f23e72b5b9fd195e904c8bd663331ca7b1ddfc9fa0000000000ffffffff027283040000000000160014940913b1e7380b2280c15be059b296307e4170ea70bb0600000000001976a9145a65c40731ffcd3edfb78fff5ec1908436bf166188ac02483045022100b2f6089a22147217548d139689320b78b9c70f4b0ebae4b2e60d304eb6ac088e022060625332748aad98f263792cf4e3230a22e207c60c5bd791739eb56f9334122e0121037479c53c46d9c5d3597bfed5a37acd25ad3987253c3f6fc12288c229f7219fbb02483045022100f679b926b0768aa4445c2251b27d8609e0ccaf306667a31ebd5cc67c9d95adb302204f0fdb583faa901107c7e5e7e099706103f66dfefb4509b3de374bbad7d7940b0121038ddb5ad93c37b187c1cb5541d82409f6b16d9d131038a137de042cefe2b719ea00000000010000000001029de84463597b1bba9adb65cb15b981597c2679183891e3dc027c576ec3413d3f0000000000ffffffff7b386be3ce9c79e739231df917ab3af857063f5a689453822ae1b075856dfcb40000000000ffffffff029073000000000000160014636b31be1639c38a30277478a6cd5de8b73a1d2d50750d00000000001976a914b0ddb73dc9331daff180e250c9ce5846792170fd88ac024830450221009dab76659ff124ac2162b0fe7681ac4dd58a601ed4ecd00ff4ba002c28dd9f2202203fd6f1684535d5974b870fecf24aadc06d72441ec8553ed8fec5302bda38e2c30121025b017fa5220b1c355a1a1424092713461275d9b84bfe4d6cc0db512aa8cf71090247304402202f4f91d4403fb9502270816442a62a702335a943b22aa067b033f3783096c56702202512b45a9c570a00bba1e91230365a9a1b40f597332d4996d99b0b53402e40ba0121038ddb5ad93c37b187c1cb5541d82409f6b16d9d131038a137de042cefe2b719ea0000000001000000000101d07c864d1b2fa39d3508b41e5a7b1b7f2c4e6d7b273f989c4b757fe2eb14220d0000000000ffffffff02c0012000000000001976a914ccf9bb8ca72efc2ef9946c61fb5c8ba3deb36ce288ac8f5c230000000000160014c6f8318a34b50e75c0eab7637001464b954cb48c02483045022100d9e679d8b5b76c44d130ca38488dcaf66078c707e3dbbe30c23a351bd38e28e6022046c011fbcaab47467ef2d9237fb48616c6e91641a8b658adbf85c01c86f3f846012102bfb9cdf7d042a4f2847d7e994a25dddfcb4e0cd86667e2a100e2c5ca772dc7d300000000010000000001013354f2524d6f829c0fad9d7ca766cbcdd4f164b61ad3547ca487d2a7b91ce4160100000000ffffffff0230450b00000000001600142fa82300aca3b9a1281539624ffe3921d6a169be90e11500000000001976a914c2d1c9eea2c10dfee0bc409db730d26cd069ccef88ac02483045022100d2a5c6915d1a8d420bac9b96339d0d6916a27582b2cd4937d59d283528c91652022005943707ffa3eece3297d6e79920ac66fb721ca7cb2d1fbc57bf13137ce91f08012103169ab9c066d91c8cf5788a65b7e2048ac9064fb4ac0a123618880676a0c3e2da000000000200000001cc8f9fda8e4c68b30bd7a31dafc9c72073596478322217c10b27498c7f859ec2000000006a473044022050aca8e90c2ce0b2e7a83bfb78ca47bb994ea0ac7812084ab75ccf21bce6572502203a44dbda2fc19b05336ff77ecbc9ad72981c22a00f910d59016b4c88b3f6d8ef0121039473130ab06a058dab1900f66defe8ffa0951d99433b0ce48b8845c2f3d45faaffffffff02980c05000000000017a914bf353c88fa9c0068991b87b89078209b401aa5a087aa350d00000000001976a914822ab8c1487be51f39724496ddcd0a1f33ce8f4b88ac000000000200000001a6a1d87340a22c67dbf306b41387c50cbb66f74ddd27dd288baaf1d26574609d010000006b483045022100fef411e7b4d9c4b6d000e29e8f79ebb6b0442a304130b41cff9f51692b49424d02206a422ea1e7a78d2719bb1fd9ab06fafc3e1e8cb792c93261706176db6037603a012103c7793b0532447e48a0b9cd20d06f6bb3bc19e47d8214ee8bf3c11c5b3175cd7affffffff020f2b00000000000017a914a318ec285d4e4c27823173e3559ab148511c65068755692500000000001976a914e646e4ae4f12877cf94cae40d3603262730c6a8c88ac00000000020000000189c17ae45d43a30a3af958456ee8d46831675cd293aa65cfeea34dfa063b1ce1010000006a47304402206c158536693dc145f2033f461320f7ed5899899a39b716123cafb2eeae9ab728022029e1ba8f85bc76a78bdf9a9d804900991360365e96f8d93c3c60290b13430fb9012103c7793b0532447e48a0b9cd20d06f6bb3bc19e47d8214ee8bf3c11c5b3175cd7affffffff02f44e00000000000017a914a318ec285d4e4c27823173e3559ab148511c650687200d2500000000001976a914e646e4ae4f12877cf94cae40d3603262730c6a8c88ac0000000001000000023f364eaa9a1a2bc5bc9da2cb3f0907f37815ca53cfea85a6964acf82b293df2e010000006a47304402205446208f5fcf9300192f1a67a260a4555bd40b2bc9b3dc232c21f6179c26238c0220500c5b268e02fe8c60718f7f9a5107bec3aa4ad499f26e101f339c1327cad50b012103edf1a0a9f80fb8a91d132fa601ce48f37fb40a57c708175e36547680b3bc884dfffffffffe4a85d2eeef21d44a8e7309f0f5435ef583bb3394fc3deb717f0a6318b2925d020000006a473044022070c3c776129a3bfcbfbcdc6f8801c6893d9e4c4a9f292630235dc85dece4a20d02201ed958b2791db64f7b0ff8d01666b0adc11253d565bbf5e7d571b3484b1f37870121025b5de92ebb2253f245eaa9018f5e80bbba632e7e0217757a5640c60631dbadb3ffffffff02860e0100000000001976a914b39b967719c9121c3309610e7d95f65613a2442188ac6c5e03000000000017a9148d26cc44380e3612b1cd921f4db8af48a72f701087000000000200000001e6c18c9ea2438f03f146c8ffed4c3864e6cf61f7be67af4abcc4844417c8af05000000006b483045022100c9d9f48ad31a1e2d904d1488cc3dbd9c59c0e9ca7d64f973c4ad58d48d6a61d502206418a5cb2f643cf84743adeae0a2de3692ae27a6df4fed30a720723bd01eb8370121020cab6a4c18f848f131de10c557e7eed5c8c8a38948063f2fd5c4eb6f381ea73affffffff012f930d000000000017a914c84cfb92f26051bf893c55ca97d23b108e3ce3f087000000000100000001521e9e99b654bdd6226a0dc8cf51046354c941cc3a0e6a9f686a77037fb039a9030000006a473044022004867b01837ef44af3904b69770c45ed7364759c73da64dcad324c4dc99225480220034aace5fd1a0149e69a57dc36f98786eb3e65b49b5d37d988283d2188e3d9e4012102936c15394948d03a7ba3d4a7e7c7523e14194b3ab808cfe5baed526e15bc0651ffffffff03313f3d39000000001976a914c8a6bc95dfec3fa60785b300278d5378c6d453a088ac2baf010000000000160014f1fac971a1b293b2fb966542685c5793667c42fccaae010000000000160014d40803acb397e89ac6c6bfd41beb83b0cbcb493c000000000200000002f478448cf14398e6ee63c2afc0e9281ccf8245d191a9943a81c2ab5632be79d4060000006a47304402201bf0ba38c4378eae4451af933c0b9691de2c521cba821e44542803c79758c341022037cb409a01013174437a955da6e13ebeffb396464388e8a918794b492232c8e90121027b779ff80cff917bbd288cd2f382818530fadaf8bddba9f8d42c7d0b7f96ae9efffffffff9cb45073c2b1b94493949137f889e0971c7759eee0c96c2eb9f27362e3334ee0e0000006a47304402202dcd7f4607c4c7113202831c6fc7f312f09bb891339f25457c09750637434b9902203fa559d46a550b54221663e0a1ea8ff0efed4a89ebb4dce850755a236cd880990121027b779ff80cff917bbd288cd2f382818530fadaf8bddba9f8d42c7d0b7f96ae9effffffff02d0aa4d00000000001976a914e4522656c35d1a51612890fa1dfe89a0400f657288ac2b462900000000001976a9147bbe29e02c1b3ffa0c04b16ec42dffa275f0637388ac00000000010000000160da8f6d71b7afbbd06f802667269b96a3479822499fdb1ded600040bc8f655c2e0000006b483045022100a9b9749acc5a9db065383ce464a485c3581c2d6fe2d2314c4343457cf5a8689c022000a51e1940c35347add2c057affe26d169eacb14323a138868d4a1c606eafe16012103cbe0c26ff9177fa6a49344ce5ae7b4e4cc319e5ca915544f32d96255a9af2e70ffffffff012b60000000000000160014e4771f54dc503442da8a43c91efb59edb659541d00000000010000000001017e367041ad6024cc3fffef3f9ce4325b15b2c00854e6ba415fcd2d23ef8a55d40100000023220020856d9ddd19b6e6ff9f9420256a3110ee428660a8ec30eb861b0f1a9c8aaf0b25ffffffff026c610500000000001600143f72eca48a4f6ec12516243f86337d16db341fe34ff276000000000017a914cb3e0242dd20765c116fe74196455f7616f185e387040047304402206f13f9b685a89b74c7d6b1191e4646f55e75c1f182f96b2e93d7f044a50f788d02200321adb5456be97ca06ff1e4c8b7a7e6f70d6b588090d69ad7f9a6f968806202014730440220737782f890cc1519113522f3bda570497af7843088f2a01dd7003f2b0dfce8ed0220786861eb0d6ed6df9a229dd4982eaa52d5f2488177298e6451f0560e42edb5220147522102ed37d621cf85f2b432a2e50c9a55b7d29399a2e7a16c3671d6b1669998f7ddde210305b5e457422ee22500a7df3e2884c4215bd9d9ead1eb7013b206722be7f3b67252ae0000000001000000000101d43085e255d45ed53b6f802dcb53350c3ac91c95c5e87159b7882f4f60703db8010000002322002090c286b6da50a952f3f379e9e28411ba86c791552e9eb4a5d2adc114d0275c31ffffffff02589608000000000016001481421bf6cdf75963723d04f39d0920bb471f647dfe32f1000000000017a914b27d8ba7bb57028b354affec3234a5fe2d6ff60c870400473044022003918c26c04132c336db956cdcdfd8cdfc67c8da73ecfa6aa14466feeb9cc4a602200e8314267e5d57808e7daebfbae50544ee3f9cc7761064086fe8bfb7bf84cad7014730440220393c960f9c210af820bc3a9fe07150459d1e53c5bb02315648b5641b796bb51e0220063c771c00902af38fae9b5e746a64b53e774fb959ae83385c4eec96176b87d1014752210355bddf45e00fd5cfad059be0ff5ad810cf30aec92ad677177ebc708d1bd289f52103fe4543da591a5f64de44f489b597a467b21030ce9f264e878191aeed176a273552ae000000000100000000010178b7a216353b71f01a0becd0d6eabdd7f893c91548435b5bff4b32d7e1866be00100000023220020ccabd61fd45d5182c1fa3fcb3c3a301a30976b10120e31ffa315f17ba6c94b5bffffffff0260860000000000001976a9147280d4626ce4c47349e8fe3b3f64cf5fe3f9536388ac020401000000000017a914bf610e4c98d45cfd92a5e4d1f4cfaf0edac8f00087040047304402200e1e2147f015c1a1a4558500de4df99511801a7590caef824dd1c921d1390270022006a3f2f01336273513998bc629d815ca6b495d3bdde34b23b0787d8d2e14c63001473044022026052161a0693cc52556213762e166fac873395785c98723d26ca275bf7b2bbc0220520ae29e8363f7bd98384db4e2dded3be1eaa75e022ef6fd58299802937ba1810147522103f995145fe1015ba2df382d2545f5f27d1991cf16c44c7f4456d01b9e588968592102d9deebf4e94f9e01f4eecd6f2c6d29201d2e98d7cb19a27df060a200a4243f9f52ae0000000001000000012c1141bbe9b17f564fda66089fac4ad511036b4a9e8d3698e8368103f9a23f031d0000006a4730440220464ffdf1405442ba40b05fccdf7cdf9a119fd5ac8ea0a2246ca9e65f5c94a5680220669f1c7649deb228d612992c66eef23bf727d12ad67bd9be5b879e0b5833eb9f0121036ab047686608b3410b273d22e507a5281c1d89fd94d51825f245cb1330d3d02bffffffff02c5310500000000001976a91494b66a8c635630e08ee56aa1e64081b5a985661588ac83710a00000000001976a9148250c8664e269b881191864fe412dae7b116923088ac000000000100000001b17430e09ca68694ff6c29906a3bdba66956a8ace4e3579bb1881088990773002b0000006b483045022100d975dfa9448f1786aba722d9de75071c9dd91c4053a028de5b2ae2d056047e0f02207f4118b0ae85f7ef0d042a61607340aa06fe0b4259aee5d107db12aa31555f8001210275b71622c5b5bbb46203dec1b56f48a3c9a26ae0c9d395786b673296f485baf5ffffffff02804f1200000000001976a914996ed2d08a89a480a3c9b7fd04cb00c2c6dbe43d88ac3b423900000000001976a914dd4dfbdd81abb7c4b68af989c7a6b7dcaf5ff61c88ac000000000200000009094b74a06877f3d26350bbf555183b9be5bcec360e165629b280895f40751bcf090000006a4730440220081e9e2b85b50895acc38c4dc0b34f6967a74415f67f67e87008147281a3770902205610ca1d34348fbc71ac3481e24db5e5c094d4413a7618be86fcc7a228f6d6c70121037b60e20671415378dabc56fa2308e8a02afcd00083a5ef5b26bb25b5611cae22ffffffff820a59521b9756831acd29dc932108c3d6b4216952bf90e1d2c30f58591afd570e0000006b4830450221009f9afbd83e0630739b8e141f5936a4fbe32f51bdbf169c6f79f402fa209c6132022047824e6b033197c2a865c671ccbaaf273a64b8dd2634c2ba86ba7c476f08fc62012102717851dfbab1a03a508946b88983eea57402e32512d3d80d255f592c01e4c652ffffffff4eddebdfc6995cd174c7e117334cf644a754c1157cb76ea078f740b33ce4230a000000006a473044022007f32ba13ac3663123f269c0aee703a75324502e94137b84a848fb6e83fdfe68022003a8ba444c4a68abbf8c2bf16801ef26098e81293011fa55e43015ba1f241a34012102717851dfbab1a03a508946b88983eea57402e32512d3d80d255f592c01e4c652ffffffff85e14478714846bceeec01ffee4500f50aadda7d4aa3fbe5c9614610aea5bcc2250000006b483045022100956cc01dea97a51d42b0d433d95d156bc2e628eac32de35a912558b8746adf7d022051f357838d0b9f2ee309e4908c6999a454f789d4f52e0fdbb22c12d240233fe70121037b60e20671415378dabc56fa2308e8a02afcd00083a5ef5b26bb25b5611cae22fffffffff4e1235b74acb7b8cf5b1926fd6e3ad3896fb6799bda21311d1c0818a4c3c9191e0000006b483045022100f35bcaaf2e5f0fce7f55731e68e085da6ac4dab429d3d45602d6bba9e7416a7202203f610a9f1c22d5b500e8807626ac4e45ca343e46b82c8cb19ba896dea3c374ea012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffffd29542b0709554150c368767d2373d3d7050c08610d8ccf7c3e1a960ad7b00727b0000006a47304402207af313e115bc66c3487c992ca70c16443b10f2e7b7ac680ede6ff522b69f3f6b02205984389fdeaa3706ae6caa24918a4b51682624884c6991fcb8cacfd089c38362012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff37163ff264751672a12b35dd29948063aacd88ade3f285d43a4fbc7e6270c4b3000000006b483045022100ec225af190c465cad10b82ffca2ae80e74a06ce224680ef36ec4408774e683fe0220755cf4d3a47856472c8c4bd970a2bb435c32c86a34ff12c9f3edf26665ce3945012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff7d121702511bb336a6fe44b286e99cf9ac84debfe9eb422b0d596d562bc99f9a000000006a473044022061edc0d9fb4283edc955706415f28e7f660a60ea9f43782f1f0a6d6892c2166b02205e4c7c3ab829c9fb0c11c919736bd55441027de9ca870861b83bd4587601a344012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff682fd6c4a1917af2df62c9081e65f2e6a8b2106470b928499e7ec7c63a3e4895040000006a47304402207e07a5cc16815af98f2ce68e3f2faae03ea86328cfe6b1db06f868a023c713fd02206e350baabbd7ffbb40392487093a4f821702691f3e2f6c0822780783847c7fc7012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff01d7c44900000000001976a9144037758b99566f3b65fb2746b88f8bdcd593496888ac000000000200000002684a62c539f245b90382a034671e924a8d9470707f5e86789146d11740cbd755010000006b483045022100ea1920258eaa8842c714b96614c061e6a88d5f3312519c0c1313f8f6511a7a2e02207b8f292c6eca8b87dda782c7ceec436126de31d273344c2b58c63cfbf5baa2ca012103e7301d8514cd03686f0702488732e4e4082fe27ee24c9a220f8446abe47d51d8ffffffff4e1d50d8287ab7fe777385245acb714619b6916c4731973f6d291e3285379e8c010000006a473044022066226321184227ec53af3e5a062126aac5403917be03eb897d1fbb7be6ebe7bd02206664d791c1d22f4baf4d3d9e3c918f50255dc785922f1e03fd4fcfacc65647c1012103e7301d8514cd03686f0702488732e4e4082fe27ee24c9a220f8446abe47d51d8ffffffff01f2d4a200000000001976a9149eb7e6a1ed07f1c8daa9ddacd64a0fdb60c288f388ac0000000001000000000102c50d2e618a04ac0e735ca4d9755c39476ca410156522e29325281f3f02a5413e0200000023220020abc1eadc96e27d63e2c1efb67e9c95feed77a50302bedefa0c505c9c8a700836ffffffffd481abf1f890b7b9abb781a3c79ecbea09f4b693e945a04d88c0062b426f18940300000023220020abc1eadc96e27d63e2c1efb67e9c95feed77a50302bedefa0c505c9c8a700836ffffffff0495ac0c000000000017a914bb09f7691edec40edec73af26de7fa76db15bcaf8728533f0000000000160014ab6d37a170f31517b7f85397a9e30eebddc18f7a31e14f00000000001976a9148dbaa245915eaff25209467d7cc4ae97211d1fdc88acdaa87e030000000017a914bb0e8bbcc750f45da9732d1e98910959e138b50c870400473044022049768bc0b30edd916aa5e583b559912816dc631318a68ff809669cbaf25b8f150220728f23e16600d26dcb11011a566bfa4eca723d557afeec299cf92b8cd48f6f6d01483045022100dddc724cee2e8b54ca17c9fa5a50a723d43fda3cb8273ea77902efeccc5488dd0220431cea5a3da6d33028d787bfb37eafa92538430626d41351e4a308fb84d8acce0147522102103025dff91c69110bf6bbc3ce68eac1f7d4ae12f17e191eac210674f1ea9261210340a52d7230a51a0d75e8ef5d6f0261346a4bf4c4cf56dc3523512c1ca0c30b0052ae040047304402206c9e9c2b9a5a61e5f470eeae9d3cc0c85c0f83d4b5c3a29e0d3635280f7b125202205ea12a42387819a65ab50c8c5458346fa5f1c451d88e04460428725aa7ae1cf5014830450221008d8e95cdd6f31f6bcc6da5a6a752681ae2315ded61a191d86e011ba90c6f529602200ea0e028ede0d65685cce85fdedf5ba0c8318ef437e816465e921f037a971fa80147522102103025dff91c69110bf6bbc3ce68eac1f7d4ae12f17e191eac210674f1ea9261210340a52d7230a51a0d75e8ef5d6f0261346a4bf4c4cf56dc3523512c1ca0c30b0052ae000000000100000004a2eab2d52f9adb14f059a1f5c147bc1dab10f05a81d688687b1880d7df7cba67000000006a473044022044d9854f52fb1cf499d94c07b7c9a8455e7e46bf09c9261b4f2a6d2db9689161022004d4c114fbb212b5de790a096b63cc50332e97b1ddcf38eb8d7fc77ddaa2abf6012103051ad4e3cdc4af3d7ee7233eda313e82c32d98e1cf8bfa860f5f983dea374ccfffffffff2a2f7aeb44c740252e3795fbdbe50fedf2fca35bac0c222276bfe369be975172000000006b483045022100b9a354f5c98da112ac136737cdb77e13edf40e01d2ff9f05b39971aa43d2eea2022060cc43891d22c8e5dde72a17e1aa597b699d8aa3bcf29a0333d69914641b48aa01210206a73684622fe47a8d518b3ca2654a1248921b2a43245c755f5ba7bd5d0f4d8cffffffff9fa93963521a523fae045e5a73c0e2c3c29cbd0bc11038221ba2cb30e21e4fd5120000006b483045022100a6b7ebf1cf28bb7bed43ac618ec48bf3b5d9c99cb5b992c83225f54706a8299b0220357fc271a534d4660108e74bddaa70c050031abb6e6e97f68459d91d99df9220012102990ac27588517096985445a51e5a06c444d5e38782065755e40e474ec180639affffffff3be6de992d2c5accb4c56cb9a92f6c312e63da6a6ef6e328c188cb27bd6a2bfa010000006b483045022100fd0dadc922f86d6f06206573a362e33a14bc140943d34a0b6e1faad573c4446002206171d870d2e64aa80b6f7397870a14a908b8aef25f2d1df8b59919284ebed6b2012103e617f6a8605fb75381dd73ca444c6d5df364ea2fc909c36bc9c100c9254d2928ffffffff022b160200000000001976a914dd76fe01d8efcbc67ad2c7d56dd29cbd75c4dcb988ac8cd61000000000001976a91408e611377d56aacc204d79efbeae391e19a9df1588ac00000000020000000139241356bc5d802450d89536dbd9d4c0aff24e0e3fb9ce6f2cd0bcadf2d1f63d060000006b4830450221009d08c6114eb0eaeb0fd382f5b2bd17788dc68b3360135e85ae20cc894f4aa51202200105e8e791c649de076e2ca86199cf7608cf813f7e9ca82708e329c0154ff77901210339dc876e426f9fc3923ba77c5de81b9f1e92d76cb6768cf2f38c2693cecdb8a8ffffffff017ff53600000000001976a914d5cd7893de0da0adf7eb84386d07196d9523500688ac0000000001000000000101ffb4230b998cd99fbb2729c8efc3f79aea1a3707bec4be510b03901e838f6fc3010000002322002090c286b6da50a952f3f379e9e28411ba86c791552e9eb4a5d2adc114d0275c31ffffffff02da0d05000000000017a914dad6c8cb5f2633fed0291cdd83a2f527d36f8c4a871219ec000000000017a914b27d8ba7bb57028b354affec3234a5fe2d6ff60c87040047304402204f5404fa5068f1944abfe890064a5de56bdd3d697f91153b5bb96336f409ae29022024b4c11e03e7ebcc854bbe7cc666f750de2ebfecd27efa2d821ae6cf9b0b59a301483045022100e6d8e0fcac72e297fbc0b3be13193ecf4b901de54ce374f35b19d77f36d3dffd02205360bc2020063c90dd30a0c586f453c90a747efeeb38c72c4497bca67b78a15e014752210355bddf45e00fd5cfad059be0ff5ad810cf30aec92ad677177ebc708d1bd289f52103fe4543da591a5f64de44f489b597a467b21030ce9f264e878191aeed176a273552ae000000000200000000010105cc037e2b51ffc638bc449fbf5b11dc2084d7abdc6afda1a33365598fe108c40000000000feffffff025cc1000000000000160014a18726a4278615115cb48e4cbb83efe8cb54417c5ae3140000000000160014d2a851cca22f65301bcca6775768865b697bce96024730440220011e0ef1c63c939bee206720e91bf2fe1c593c6dddf4c4262ed3fad58580beb802204ab9e776b82e59ca6a912ab5cb64ed64fda683bb0866fdc271fd9768d8b8ec9c012102fc7eeadc4611e354e717b9bb68eb0bd755710f4a39c40b3f0dca951fb230722e49a00a00010000000001010f0c1f20f9edd0e33ced7357b6358b25d4450deb903ab1c8629067bb222e0107010000002322002041c7b4148b46e77efeb92fadf9dff9f02ca737aff0514ca97c10fdd2c8ca07d6ffffffff024d9300000000000017a91487cc505f750e72ab64d5576839a649c0834dfb1d8799417c000000000017a9144d1d7f277dc7f745a99aade1476ecbe8769e475f8704004730440220020118b5cdfd6e0de3514035755b0dd412afb5b503dd9d3459d61fe85199b3f70220447dcebc90e3961c1e81997a3432cee69e6aea9b162b7c8ad21ecf0b2030796201483045022100fee6f91e81794a140186318ba23b0f42445699016d11d4cad8eb402c8a9d12b302203f8d8791a7b55bebf9f87e6be279b3d035b9031d8c482b78e6ea72d83a449ab2014752210238dd979b27ceb3865c6060af917f97a0b256f788528e79884f9bbb0020ee9ea5210362a27fbf7fd64c870159ce8961085107b034a7a1b088449699f98a10c104116652ae0000000001000000026f08a38a2131b1612e51e803eb673c7267200bc52c9ad8fefc6253a146d7ef1e000000006b4830450221008f25d669dace22e86b97dc55a053b62ce59cad59ac517e4792cdc6e948d1ebe402203a0894f9ea25506b00f8be0c3ba35f956fe6b67a86564f683bd15ac9aeebe9be012102d5a75b7d77c8d933b29cf9337d18acb4512e3c9af290e6bc98307ea4545ec805ffffffff198546b2af77372ecd75983d5076ab9c1522bebd1e4f4cf5f6cc978e82f109f4070000006b483045022100a1012502e8fae6e34b576eff2b5c411be1c1fd4a01f4dd045347b370dda1be810220046c414e3a31b3c487471debea70d629535f1154f6666db2c56ae104ec24a7eb012103fa1d336f2a714294152ebf5d405edd881b85bf1b6253f91f58fcf79643235c8bffffffff025d8700000000000016001470b43e4a3a601238073707b2f7ab9d31b10a262a80100600000000001976a914b5c0c07df4a32ba5fc58c9a494aa6db13bd99a1e88ac000000000100000000010148b804d36bfad74fdb27e05eedf34c8a00fb3fb61dbe06e0b85f8b266ea8cad00100000000ffffffff01d88d2200000000001976a9148f2905815205f2e2e57461231645e9163e7ddf7c88ac02473044022076e5d78f395cca9f583788b80fd651c7e9a2716f7366e99bc3cce60d4f9e750c022072e5b4cf8a2331dcc6cf22a950debe5a956e032be9a2849593e85098f9ded679012103a61c1b5c668b325dcd10b53ebbb36d5147ae11287e8481d0efc993bb2327503c0000000001000000000101c86a0834ac8351f8e8b34820f4ce560cee1593a1044eac616502a9f2d45f412a0000000000ffffffff0187a2000000000000160014e4771f54dc503442da8a43c91efb59edb659541d02483045022100aa68801b2e277e03d4d51443d4ff1502d4f598d9add7739ae60a120e2ec292330220086cc0c20dab9cde1f7f07e6cc2ff873f86b5df3455beb5b67c4024ea680732101210384d21d3094a4144495db6a104e23676a13ae39c361f99da47fb51cf4ea48d0ed0000000001000000000101636659eace17f713642442b8f2ab17a4dfb115cf5b93c4b84f63d494e3aad5470000000000ffffffff02322200000000000016001469613763890500ea3433f9044f24b0c3a414c432225600000000000017a9149558ee169d636b0e2fefd35d7f2299179fc807b18702483045022100aa10a6e44f4e714ef465cfb0e20cfdba1c5b339d7d5796245e2425804a7336b902205d6f42a8d475af63fb3315df369827e87beb08bdcec09f0ba59d1616990f1483012102083dc7068558fecface3a64cd52024606232d554c9b2d3f7c1f94820b1b5cd9800000000010000000001019721b67b99e6073786219e002362fe7312b9135a4c1936e3f4afbf3d39fe33f00000000000ffffffff02f697000000000000160014a976a951bf282ab8b914c109f13275cd267758cbc0ad00000000000017a91410fb446d632a3811169a6286fdae42cf5061d2e787024730440220746886f272f56bdacf3cab83b3ba29d2caaa0d191847391c59c4ad31968fb70d02204f0bee943bfa92ad66c31a681b941860c178dd0ee31445f6c1a7c3d0c6c173490121028b5cd322c86cdaf279b61726b19919c9d53187750c27e2836f601562d362f0130000000001000000000101d7fd4664c21fff331f74a39882b2fd554b75c9193bbb0b9f03931517770f61820100000000ffffffff02805e0300000000001976a914f77dd1226a187d85206851397baa4cd44c1a1bc788ac44d6530000000000160014da45e1c44b21b9169170b0c6ec71dc2e0fbe917d0247304402207cab23d4517c65c120c7bf8c0de2fc5f168269b32118e5ce7dae58905c6c29a3022021f56f1a598178cb8faffbebfc4b8d7cbbf5e45a23fa51d736e4bd3baa8a6047012102979812f0a01a33d25597e721950e3999143a88d1bc03ae74f62583e458c31d2c000000000200000000010bf94b64392f64c68649582bd4c070d3b83a5b3f7a52e9ef1c2599633d4ca021ea0f00000000ffffffff2ad15a7d1d69b218f8862f1c7f238fe02053bba234cee1322778d30c5ac325c40100000000ffffffff3edff33d6badf36749e16ef9933bf9429efcc5ce47ba81885768589f0aca581d0100000000ffffffffe18ac0a28402599359b97073035ad10bf431d544019c2d79c390c3b851056bf91600000000ffffffff8d9330ace746acb452749e191caa96642fb364d5948cbf1219b25786fdcfc9d30000000000ffffffff0b655c60115609cd3b70e3ccd5042390ad988900857be2a5eaae87a5b9e2a38e0100000000ffffffff88c1902e10a24feef7bb81e5f3b7251ab67fd5e29a1cb50169115492507c809a0100000000ffffffff26593ce84226cc13cfc7ab2e457431d9d25ce0cba256060445099e33f93c2f690100000000ffffffffad8ae51332d0271ba29f82f339412d628c9be967c153c9148909f6c2719078a70000000000ffffffffb97b1bde112cd36c45f24e0fdecf61155a2b394c0651d2a5221e25fe3d12c5ba0100000000ffffffff25ced35e0871c13b4d53760766a61f8c28193fa5e4b714599597dfacf451db8b0100000000ffffffff021e948600000000001976a914d6f51ec2e795699280e6ee78b6ab5f2d7c221a7388ac46e2020000000000160014cb1dcac9580d8da1434353ef77f7632ce1d687a80247304402205504ccacca99639196bb5901935d4a968c972a9a3ca56719cb5aa32758e5a82e022057eb5ca2d23936e7db7ac6979cd7cd71a433263a02a70278071ce9b320b156fa012102f3c9e0ce1eb9d65f38851dd49eedb75fae0986ce993133b592f3ceaf3d59286202483045022100bd09975700174a91403ba24a8ef6c4f92b073f226199460934ae0853cf79e7eb02201aaabf778a2178b89ab43d0fa6afb32eb372d40eeb30a1cb394d9baec2729909012103800ea6900ba27b0ad680d7d21071ec21947875338863da111142492b34d3ed1102483045022100a87d949c2761632989bca7ac603c6188de8126a2f82eacf7b907eefa6e74bea802203a6edadf619dda81bf950dc8fa91b6f85f83b55d57007d6cecbf19477efd6588012103e4cf6715b91508b9ab44138288014972f9c4ba0b5ef0931899e9c532de9b030502473044022047fd55b49180e1175ce8a628a8672a1dc0932562964da4c9ab83ce6b3ca5c1cd02200db37e91d1eda1dcab65f7e971a0dcda91b44940c9d09ff0bc2bfc129f07f932012102c8f308bfff66a871416c01d972cde160e09e4e058bafc8081c246903d8fcf5be02483045022100d3356b18c2f091f6af5f7245b6db25c3f418b073fcfc6b0dc49a5bdde429c8b602200da564c0c79d84a8b147e39909456ee0fa572b37095a9d4a5011f59c56d759a3012102e1eec5188e687dab1f8e467863d2c830aa62df523e7622b355bb5648da1478e902483045022100eeb8886971bb358275028d7624e6bba40aa00ed15af33941e261a34f615e05d8022041fa171ecbcf85c596a407761c9bb9346b021938fb74c520f523c93969f9f8520121039dc3ce865a2ebb9bcac2cd884165ec6e57d59759bca235167a84df106d493325024830450221009b6234b7f22926e4447f98bc9150a9f445eb42824347dbf38689705f52dbe6cc022029473c2fc2ddc11dd2d6abf9fe1fac30e88e45be8d42dcfdd6b981d1b5ae31c4012102788e8092de72c51c88595a778bdb452f9555d292f202184d2ccbab95e68f5e1802483045022100cc80698e2607f97e713058f3ac4febceaf0138fb33b862c138a58ca525630b48022001245c62d03ea6b659b327740f43cf0c206032d0aaa35e3b74a64a069214d5770121026468801e63917635bae252a2c7a78897807f9cc4c7acf76430ae88d8f1ab1e9602473044022018e6f711bd62fd461cf48015d845964efa3da8d49de1fc2bf23f24c33de9b0fa02205bd55ea71c564eab22c1aa586a84206a80e803bff33f2c8509e98dd6901d8d5d012103463a167d5fda60d0e9eba244520c91b74450c1246bc23456bf2708cb68d0733002483045022100b9b5d2b5ce6cc552c6c772c1ce485b77cee7970b1a739d3c19cb112273d1ddc302204b4ed4e84fbabe075538e5caa51f4777f09d53e30192afe8b5755f1ee51303780121038de32af3e77feccef3588cab0c065bcfe9dfb038dc72d4739128d6f6a3cdc4d302473044022042c8cbac19f99310e39678fb6aaa4ca3c9fd12cb26403710b0c8f79cdab6191a022033b9f9fb5ee4f7c5ad70633e7cb670825a3f0e5fabb0d5d4a1d985cd519f39d60121037f70449636de438c21f67091b50665f5fec905278c143b81406caf1b9c045aaf0000000002000000000102d623feef1ca4725f8eed0bdef0fc2754296fd0964d8bb6f12497e4f0a4530dab0100000000fffffffff1714f88786286759d58e7ace7c4856e11b42af16abee1125c127d0e3b36e2c31d0000006b483045022100b2dc62311c55ed2a2650d8ba5cc783374ae3d2825ac1a3856709c50474fc095402202628203ef1102f82e2ae3375d9e915aa74b686e03a70766bfe3a660425a64e3801210206766d6aca5241b64682a14c326940e47d81148e8c100c61b8d007580d3e5aaeffffffff027fd0020000000000160014e23f1b8cc8d33a905e1bc49929487df68a3d6592aa500f0000000000160014e031056718bd0b73e1a2ed12b099ae3bf9d632c50247304402203816b78a8c6c7903db35e8eba89915cf08aad8f7f7898033bd653be568618adf0220560e0d565fa4bc2063d181192f1bd52081c8e7d30911fb8f4501db471813a0f30121037897711ad08aa8fbf07e4cfddcb6d7a8b666b7a948924f79db3d53ffa40d641b00000000000200000000010323e57c2746b24137604cdc5729d445825cc315781687a2e0c775ab7ed7430d972600000000ffffffff0e99e2b1be8970dbd4ee53c288579bce85f992255b8c43bdf5d12e93c72de7580200000000ffffffff2b83df0cd3a8e063460c0404ecdfcaddaf85deae199cc6b5483a8c22318af9f60100000000ffffffff02eb6e0300000000001976a914bbb098d1d2deac4f9660d6ee28688c658920075288ac1a1d0000000000001600149e322944dc3724c6390178db69c82fba1c8c36b802483045022100b27ead8a33d151b0f9f4130a6f2b734b20fd91ca0adac213927f192fbb620b61022048f5099cf75f0f2cf3a60fee814d2e7debf17547d2d84e01f39a55375f2f1099012103e957b6b370dbb2e8215ed36af1cd1a0be3400f798cb73d475f847ab82be5f9c502473044022055f9825192f4ba1a93a5f0e0198401ba8e658c7e62b445b46b96e8671ceda9c3022060f9ac56d0eb62a0fbab6e341effac8a1b44ea2145cff2ad7becb9f927974dfd0121025ce6ec1f0557ee88e7f000c6ee9d8a545c9966c9bbd9b2f5c79800c6bd79173002483045022100e0d2e82406eb7c1b3c76a677395258f434a9b9d184f2e5c5e3f46b03f86ef061022068a6ae5f071a9a61924354b137c9b30f56a0cad54d6e50c0a84588b4b92b638d0121031518e49871e53c61d7c6b6881ea59fe3ad9a1015a28834ba49b56a806ec4f7dd000000000100000001b835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d841270000006b4830450221009fd4052fa3ad1384dbfa3b737f76ba60569f8fa0b1e4a6f69b3fe907fde55877022046c802d8f93f846bd3d9f47cc3b6c809ffb00d2972e647a619b82a2348c94e78012102841555d79438a81c38ca9f97453000b20e0ff084b7452820b093cb9ccb0b2598ffffffff01572c3900000000001976a9144ee170eb8066272cc93e66418192f8b96af5348b88ac000000000100000001cd53e9f536e813f375e93a604689db69a75d1ff1d5d6eb18c139ca8838b26f58030000006b483045022100a625357e8d94a1db01751dd4cdcbe7596d80f2ac6557177426d59009159146ee0220280f03ee39fec8dfbd300af3af18cf179248c7ed9b92da10cdd7c1c4f0b02b7101210338ada40820379cb5641466a7060693dcef040b29603a91bc0069012265747c1cfdffffff040000000000000000536a4c5058325b036ff10720671985809253635170dfa7f703a81c224981c8e32da395de882ed77fd9f5b0d43b64bc0adebea9635e4def9b298bddeb4c44ef812451c0509a39dd000aa04900dc000aa043047c03c3ad02000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87c3ad02000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d87e9b5361d000000001976a9142073870d87637302a3cabe39bc9682ddda83630288ac0000000002000000000101b4aa41d0a2610bf001cd9f47f2f4ca975bfd9513bbed1049df1a30df3a85bef10100000000ffffffff01b8800000000000001976a9148f8e9a49c04a36227887bac9740e713fb964efad88ac02483045022100ed8a1773293b1512951859ccb00639aee8320a787f52e1a740ed7e2ae20b47c1022046cdfc259b79896dedebf93b4d9ebb93366b5d6f0a9fd09d1a0fd2a2c63626ac012102d5ba0ad031a75db7738e7aad28ff6f200ac4a7236aa02bb2b733105ee47a9f8800000000020000000119ef984574fc34b4bad989c3624aa30ee6648b0573b1e8cb75aa50a1e461c658000000006a473044022063aa1db39e7096ec4fb4dd9089f64cd571aa897bd0e9899d8277faf5b21285c00220309a481d9200644b8057674c7e150f35f9d45f6265e257377a29c3e0e5f5951201210304267774a4994ac3d1a9180a57f63ec8ea3d75953ab9542052dddd9bd141eed9ffffffff02e69203000000000017a914555927cace12074de99e918855c24aca15277d0787d9120100000000001600144c3121db082a75d77e56c9b4ce486a9dd3c964860000000001000000000101dee94c6c62d2826a88fe488b60794e4c6e8b4ed9aa3543475074daf838366a240100000000ffffffff02541b0a00000000001976a91406160e50497f270994e9e9142cf51d3d908eb06a88ac4c3101000000000016001445f99528a5f5e97fea160985ff9f53ce946a150f02483045022100d127c5716be05653578ee392de663059521132711d4f7e77ead6145397f4664f02202c80c2f7e27c32f13ca4c6ae4877dc362aa6febd185d22e7c9c83bc64c1056460121029eba79261b61b2c9f17a8a8e981c94f7d2e9f89ca6c3b3b73b475a0ee6abf69b0000000001000000000101358cd506b92eee5fd31b3989658a7e7eb99fa9ae863a1f0e02d6a43d5fa392300000000000ffffffff021ad420000000000016001499fc48f96fd0adc2b34e4ccca91f8292f8029cf6baf0090000000000160014736c4caaaddca64cc9093b96307b2d7da327754f040048304502210083b179b1d72583ed19a46e9ac032a2a4db11f4c7f182f9d58e9ce2d3a345757002201597a1485a4b8b38920341e8c7e0100a3da203fc6fe5536cc036cb642d40e97e01483045022100ddb48100a1b852afd00cf5431a6890c84212aadfa89a7562a1267a129ebdf54402203efa30177e629609a2571727c3c134ab224318c321124c5c1f4ac58411e1cd9e01475221032effac01569b8b738896f9806d323687ad0605bbf217ea76866784b06933741b2103a223fa24067db5a7a13c7e90a33269fec8e143d54e9ee78c2499ad7e3068164152ae00000000010000000001043a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa01000000232200201bdee3fb5f265d49c42c1cc1497c513b50b202b55e6e9944467eaba2af81ba97ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc6160000002322002043bab7740211f76c6c8a927c2a601ff7f6b3581113659816384279b8df486aeaffffffff90750c9740bfac58a8966fed22e702b6572dacd729ee123d4abb6db8951858cf0000000023220020ff7cdda48254139c2a64d117a2d394104d39c6263279fc95e3e5f7b58850b463ffffffff654bb8e73abff9d858007c5dae6e6b494b3fba2f245f9570b7c4b3a84ce95ba40000000023220020ae44406b161dafd728421e8ccd4919a89618a78f57b56450cbb658b8e3db201fffffffff0e00ca9a3b0000000017a914572290324c72e6842e8a77c2cbb9882a3b9c2a9f877bc59d350000000017a914572290324c72e6842e8a77c2cbb9882a3b9c2a9f87f0490200000000001976a914c57f5c9729fd0a916572c991d4583783c397b39f88acbb4e02000000000017a914777d3126444db01c218d6bced5448d601048f70987f5a703000000000017a914102105c5ea8a202bd0bd0fdb8072572223d04e0687a0af0300000000001976a91441f7f98da08c22404e6c7cf662d5ee12ebf7a84d88ac1a180400000000001600144892b6dcc105209bdd0a24986ef413584191047fc43e0500000000001976a91457814a0069befd94459f9ffb25d6278b3443cd8588ac62ee0500000000001976a9143af8c95c021c2df056c25819913db088ba7ffc3288acdea70700000000001976a9140702cec18ffadeab309a90e09d671c3b7571777188ac54be0a00000000001600147204c997e9efbe9a194425b4a39881c22825b97724440b00000000001976a914b6e59b407c5f86af9e429078254dd86e1af74e2488ac74d50b000000000016001437f08565ed0c1dee378a3a4c3f15b6003b155925c45171000000000017a9145b8aba0431b5df580b1c1e2316405ac2b22592d38703473044022015340ba15e54e88ce1d37e67e0bd3afba841b6a77e020c019ffc5ca63d6d1a79022071064719593bb2ecdf618037c5f53b9d09ebc1b6c43a61bdff847f3e16d622fd012103bd812d923b5f05f122750fe166227419716b27e786584226d96514bcbf4485811976a914350292c7ce9f9a7b86ff5b16605a2713e19327fa88ac034730440220314a45f6b2cabf89997f4eb0616457061237b5fc8740a6bfa505df77ae52a459022002ae378e71012c06c7b238372f562a773d2da1a83d0c7156033934dbf45a830d012102ec92a6d470cd5a71a534d18d9d60bba697111170e8fe4e2f0b6d980c7c643a971976a914807343b87e5ce32931ca75be4f80a6c7a5becf8088ac03483045022100e81562a6a4bb4becf633a30492d162eee55a79b23d97f9f47b12c9f1bde2ff7602201ce4ffb21aac6bf1965db1f74f3640942bc87d8b2f5e167c9cf5c529d558c94e012103d0b5a094daaf45df03583826c6c25eb5e78379dbf4990f7771a331da0d1c62d71976a914352cb8fb32449f4cfa048e508f37f6bf400f269988ac03473044022013d3248a883ca7316ae4dc1dc0f671014913ff7d00d9653020e9b1eba7dc4196022003a3d4b2f2ca94f5810fe0d75e28854bd84ab11c9b378dcfbfbc43713a82b69b012102e6b58c92f4fe62e5b9ea22814f3b08123637e15e8024178edd9ddd1b42503ea91976a914a50ace239597b420648231cd7417859e535de58088ac0000000002000000018b535fffbb0392e8896f686c18e6258252f0cf018a6e8c0089f5c6f6ffe1f2cf010000006b483045022100e7476aa390acbf8c24492cfd0768ed899e87afa2bd871285940c1f0929612ccf02203cc016abf05337484d132b2b0c328d5e333cb740e748f8a870bd12230207c28c012102748549cb8d7883c93bb4dbe6d57df15915915f213d5dd82fab2903b71a3dba33ffffffff02d8ae01000000000017a9142c3039b374edd1a56c3d1ceadd6899c4e737b7cd87f5920500000000001976a914c7cedbb41282a97a27c9f9fc2f425c3a47d5a5f488ac0000000002000000000102d72f322dcacf5c753ea80a943435ac62f07415c46e647c72f098ca19343163a20100000000ffffffff96d6f7d61ab2a2b2c6ff2f84fd7e33d387515596c09c721fcdcbcf04c2e90ee90100000000ffffffff02485c0400000000001600147e60a7ae8554c29de5d6fe5b5c746a54091be0b0509e1b000000000017a914aa8189e9461772ba854535b4ec2afb14b507ef2187024730440220108868e70e5796ba63219f366c20b9d5b1c191fbb888d4bc3e975f93395214fc02204dd74f7c78567694f5473e1a8477ddcaa42221517062a744f448dfd1dd75a4130121027682930dfeb614171d237c0a2c72396221ea8458fded8d566fb805261de9aaad0248304502210089a3341e513fb697d53554d3e2e18e70facd14b235487ea3b3b8be3515941c38022051db4966ccf9b23174987c3b1b2bea69fbd869749192d2893e3e34a3030aa86a01210319280aa1a2cd835bedb668ae9435c16b8732d8e5cfc051f2e34224e3d401bcca000000000200000000010211f8592524ee3dcc7e759a8199955019c7c2357ed23d6ad05437ef59cf0dae3b0100000000ffffffff155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d2300000000ffffffff029c380900000000001600141b4899681683587c74ada6e852c0dd8e1a3fe54093050c000000000017a9141dc25560a7a1fe1d15aa3b1420272c0c098a29698702483045022100c07e6254be9eddcbae4fd05326f2e539be52c0bfec423c314a30350e5b5705be0220640e95ef4f808c533bad4329b6f398bf70b28f61dcf9cabedf277ddbef9b7ad801210220b7b6f1cbf01b01fbffed767dc47538d98b88cbfc5f6fd9119a7621dc2501ff0247304402207661377dc7a79f484daf343f638cca493f2212caf393948e0cb15b7438006f59022013efefb3fcad6ef3158de53f91d646df5256d21212b96024cdcebc737d1deba701210310cdbd5ac8ff86156c02e36e806652691253068da277a94b4b70c4ef25f2d167000000000200000001155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d060000006a473044022003ade4a80a6c9cb61e3122b271bad86ffb86d705181601f9a34ffe09e67d80bd0220550ce3527190eb64944863802e68a02808af5aba6812517bc5cac28d9f1e36a7012103182b29de2bc55ceb65cfd2f9441e31873879115066346a3f72e5c5b24b16a6cfffffffff0126172600000000001600144e29300b3a09d79257bbd73c1819896f7e61f0e100000000020000000001014eae5fbcf7e73acc7a80cbf065559f3234adf0e761502ba02e817da0641464410000000000ffffffff0164152600000000001976a914db063005cb7327d04f7854c35ef990426bce9c7188ac0247304402201421487b70272064c53cf86a90f87902d60cc458ab5d5eed4cf00e01b0814c0c022079651f4b2b87cce87e70d8ffb502124c7a09505ed72fa128986f83b1b74111d70121030331ccdd9cfaa223f6902dac8b89714b98e63307e11d0265508a4d38bd4315ca000000000200000002756c7c1b245ab20ccaec0e8283ac849e61be297b7b7cb70d6a1d1a7ba1dc9282000000006a4730440220434c3487ab80ecd4c6d9ca7342dc5bbd3f269cc10c1594c38ac1c65100aa61560220558b747514e728a86b2ff744e22f7e52da05ac944eb31d300846f61efbdf0052012102151e89bf2540b64ec3e6cd8fff674366b50bd9864cbf4bfa9de173e9feabe2edffffffffc5f9cd8880765d510c92159e999d3bbc2f2348adfc702e1eb91513ac208df350010000006a47304402206444f607be06153f63a3d1f25900c9e9679c2b2ff658a5c3f4cd81ad987b6c1e022071470e02a50f7e5aa913d85cafffc7b81a0731eef6b4ffb799b92585d49f8392012102151e89bf2540b64ec3e6cd8fff674366b50bd9864cbf4bfa9de173e9feabe2edffffffff0206f725000000000017a9141045c97a2823f382c3722239a217dbf91483cd0c87a0860100000000001976a914db063005cb7327d04f7854c35ef990426bce9c7188ac000000000100000001baed6377c7831260ff5048087169e08eac0f8ebae0233154f6669f5a55269cdf01000000fdfd0000483045022100ff542a67f57aa20e3abd1f62d6522f812087e3361f332fb663191a6a8df3c5430220668f0bafa1b92799e16176e1d0e6ef21b2536762aee9e54c3865290d9f5d37800147304402207bd46a8fdf673e0be16fb914f4229c2814207d1c44ec2a3e6c683940a06c21dd02206ba724fda6abba0dc50f5270de592c0ff52a3f8acf6940aba79b62a87bc3794e014c695221035d007f65d53d82a36eab4ef99fea9eedd1cbc92e16dd827dba39052bcc4ca4ae2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222103007341b487d8222f00e3bc87117a99c1af4a27d3135afcbb97a74b98017addc353aeffffffff01c83d13000000000017a914ae8245f4fea8a9fdd87924a6add3618fad8b106d8700000000010000000140641603ba95a7e9ceaa65c1e5084af2995b3bb51cc6039515a0210df7208958010000006b483045022100e6e505d08c0fd890ba366728dcd5ebb9bbdd4517be0b1bf8b86532bec6647e35022047b3cf199bbe0ee8842e06c6f8c86e322c43c98b4217dda85d6b28a82f1e4b87012103f61c3451308c0ba80d90695115dd0155cbd79c0e602022d50267139ff558e903fdffffff02b6ea3b02000000001976a91435d33bfc720613a359679b0ad2b85ec9509463fb88ac53b9a903000000001976a914d490843a54df6d1889d44a66b97faea2c96c043388ac000000000100000002c18b014f02625d6214cd41a75b52b7e102aec102716d994181cbe6c11864103e010000006b483045022100c683374bcbe6620fc69ae035fa48be8e61af34079e799ee3dcf1e22cf2ba4c1002202630b90b4a5fc247239014e61ac8ab89555fb605612dbecdbd6721d1cbad71ef01210395a470d6f57a71d47d7b65392e9b7884542188d3828f54d185a3ed69711046a8ffffffff331e6d8c8bcf7fdd2ca8e7b41c7ca28a631e2a8dca7d5a19e2b5e563f32a33ee000000006a473044022001adfdf44697f87ff91f163dd0b712d81bd11a1093b26e4b69a4577c1c1e90c002201ab8a622d137bd2cae61563d7f8fe467c6c2fa14f539299b5617d9567d70b2170121026b011c8c8c894de669e40ad35c58292f042b4fe6a873db3198f4c79c4983e1a6ffffffff01a23600000000000017a91463af3523308eb382cf8517aa2d950427a1e0387e870000000002000000000105ce0c2671d3e6bf0ee0b73fb3d48400616813848dc80f986b072158de1ecc5728330000006b483045022100ef4ff85143a68b9fc05839df6182f115c45c27cfdb97f46046a30d3e1d3c057402201ce0f1197ea6ee99cdf94ab5c9b721157d706338ce7490bcd5794720b4ad0f110121039682fb980695d0a79d635abcfd35e9e38b036470f5a0e1c2bc4b998738a355a6ffffffff74d9171942d5b25f0daaadb5d49153646fcb0f33c2c4c11e7a48cf17b0d067910100000000ffffffff505a423fffe3eae253401344ec551303466a135f5dd694eed59365ca96c721f00100000000ffffffff05d35dc9f212ae813bddb1ed85bbb1a6b8830f972396910661c00e78b1c490bc0100000000ffffffff9dc04eade0821b0fb9a316868ffa2cd598fe3c5719a1c872cf77182e096a01e10100000000ffffffff02ba244400000000001976a914b26e1d89b7cc2dac9f60c00327065cd77080dcee88ac3a080000000000001600140f38436ff452033781e61dd672576e6d814312680002483045022100940a1f56130906d035603fa1fe6bbe69a7bda22bbd7e653888376dfbc759c56202200e858d068d11110dd70bd72ada463e9cb3b975ce6e89d4f77416daf73745874b012102c7103261b052e9a4084aa29f56aa9d2ec363090b8ada7dd607b9e4dd1fb9bb9602483045022100d41dc2c3ff4352646717ed19b6ec5eb8a295400ff4441ff67c07af07d523b8280220386c58bbb169b8d2cd49f53911e792da54e7d970a215c6a8df479397fbf47bb001210360efe445b2d14a35b78e52a630058109a62e2fc8515bd584a7f15921e29fcd7f0247304402202654e4f67a68b2bab1cd54588d9fdd5fe1c27a8461bce425501039f843c8647d02201b975cde576549dfddf0b26b129853645caac02ba2400965350e4f147eb9aca401210356bccd6eead3384d9d638618cdb9d8ffb0ad9f49c012dac068df003cd0ad8e6402483045022100e52810faa985091882529b780e918bf17c65c509e2f7f605096bfe0312f651f602201d4f516a864f10f55851cc00b21f9ea3e8730e3b8238bb1aaa3109f9eedf94660121032898ed073ce4cf272a700586e81553704acb9198e3b7846d9d0569688008d26e0000000002000000014058d69ca7d1d89ed251018fbd1eaff1e427920214e3f6bcfce23406fbe4e691000000006a47304402203f8ec9a3387c74a400736e4531b69cb2522f9f796af6fb033c6d09bdf2dbd71c022030edc2703308863c63da06d61dbb45b4e5e73b8a738f8f57869f4edb5b283f56012103bec75ff4aea0aac76017e387f4a1d123a362936fedf5abd822bf4aca10a9e656ffffffff027bf100000000000017a914de8fd64a7610a11fba8b03043cb0a0ce4b723f29875c0a070000000000160014ea225d985d726fa779b126c3cb72dc121a94aadb0000000002000000000102f32593afd6685e83ebfca2fb2e19ece8f4d7d082e95e55419fcb217ccdf2bf8c0000000000ffffffff5afadc602777a219b8cac7f6c137f29f9624e2cad50f97293a7665a6895c8481000000006a47304402206f71f6e286ea11a73e04e4edf0ce3daca925c82f61af806228b01a10a250524402206abe4f56e3145164ddcfa0c17934becb255af0bcb11ec461f697f6805428ce360121033c1aa38a767d7e0500baa89cf3f4d9ded59c972d0c531961818b0acc17b34c2affffffff01d8d600000000000017a9143e77cb835a25a7e57531f552163b0ea00e31916e870247304402201aebb5e0046edd2ab62d71118c1b911b2e0c2f93457b63dc3d5bbb045f35a52c022006a151bb71743e898ea300333e4370c6548d585eb46c859cdd5394063a892c5d0121022475d42106ae7426f0604e4bcfb806cec313e67a0b19a67787f359e9426346fe000000000002000000000102b3e870caec09860780887da3db8382c1d6f9eb99c2d3b3e602d6cd8ab7c300f70100000000ffffffff33c83b537fed914fc93e323fb97c289426c7c794cc25eb6de991721f14f454f20100000000ffffffff02c2380500000000001976a914e913d96213e775c224a6ee6dc850d3a25b8981a988ac88b6010000000000160014ebe1e87a008cf034d48f840ca25bff3e98749acf02483045022100864c1cae9cb07e6dca957467a6f86284cfa3f085cdb7c0393d704b07b1e4f79402202e18e41e83cb6d8485759a1a45623f1f2949dba9a768aec2b6df72668ef39b890121028df2598b0f4eddf36ee92adb06f96e7fbb89db2bdfa8d617dcc488a92a59504b0247304402204e78af57e941c3ba1b32932f171c03cbd5d9d44d14b8e16b28d968d73449b81502206e0636456e8ecca68ee6bf6e1ad24fb7819ee4023ca0fc43a9e2ca600f9206040121021ca2f58f3f49bd6d0f250b23be4b22d327f223d083bc4f98ac4763299b97d3b800000000020000000001025c0d20496d4bb1767c46ef14e8ec8ced1e1d72de3b24bad1dfb11e4307343f3a0100000000ffffffff22a84b19f45d05c40be86bd9b63b7de02a5cac80ad81ee32a82bd24ab26a9ffc0100000000ffffffff025b5e0300000000001976a9141805b2ab5c596109a4db20212669b84cb57f114888ace98d020000000000160014d056b41dbbecb4dc872fc37c5e764d431348a2a10247304402202feb798e357ca897a9f37f46d0ca07fef5ccce4b10e3484383343e81880240e5022010ab4e7da9a516331cdf69457262b3c83b477a232b799feeee615f2d866ac7110121027f8310d4177376c6e292a5636e6749b5444f9c0b80321d5d798260ab3e06dff302483045022100f1e8c3d71874b0f63422ceecfd966aa5c1fb2393250de5551e6e7b9c370484650220619e8be9a7524b1b1102db9aea5aabd8b335dc529d47f7e862e0b315c9aeed09012103654f0ee39cdf7c53741d3906a50ab8bf72dabdb6fe40445c44e4dca9135fe1cf00000000010000000001016cb9aa6026e0560859e5a21b311a2d8d759e8e28f7c8f82b1c88ba2ad9fdd4040000000000ffffffff01305601000000000017a914c21cd05f2fbcb8cd2aa4299071fd84f3195ad28f8702483045022100b9ea99e7e531d8c0c099bb1cbf6d9897554d5b42da18ec8ca12d7677b70de6eb0220358e3da357dfd81f29190bfa90a3a0f8acdd6c038b992f608e0191c005d337f4012102fee108530c0dd39ade2582601b6903a115d88faeffa790e6281f79db7945f1f30000000002000000000101cba6c5f0facdbca861f48e6b9a68c6faf58979fc06a3ab5da679b11ccafc76b60000000000ffffffff02b29c660400000000160014e3e7b6a5f41509658d70044b2c4a9829b810acff97e40200000000001976a9141ad663ff8cbd111dd4d4b43a9305159ceea0607c88ac02473044022078279124b385ab45561c2bb3589589094d9197ae9bc296fec0fe16f063ee4d4f022032f7d937e0c813bc7734e489407ff2d97a5f960dc1d2788624c68d615f142be6012103e5aefe77082d1876def036b2c2570bbd12b9a4c95288bec61496d7253b06f553000000000100000001c019b7d40e4b0e8a0faacabad4c7d07a580308fddbfecd1275901ac04cb168be1b0000006b483045022100c0e8c7e2a89f90034191a70322b6d3062aa31f0594a8df561c5789fd03c7c17302207ebe4267180cce45c3358f25e871d5ab12b80542da8215c4be327ad2da117adb0121034a6593321ea44db3a8ea908f7dd5c5d3921cd816b059329fb3f26850c8cc3671ffffffff02809698000000000017a9148ddd0bb20f9eddc797105a46d88f0ffe8fdf1329878b6c8104000000001976a9140ae8e97489b9412f3f2ca6a63882f762174b368788ac000000000200000000010112bc978096f6bf73a797a9cc88eb2afbc3a6fd2d594c27922b02491605f452ad3400000000ffffffff02d9a82100000000001976a914305433d2d7e526e70150c695cca26d6364cdc0ed88ac829b1c0000000000160014e551cb5be4e0d32ae10380f0572587b3428c6a590247304402206ff9acf5920a88956d3dfb0a9f44a717797253cf4871380dc9748cb061101cdf02200ff66f4c9d1091103c272f0c17c540a1eb187078a2e3a58dcd45e245fc3abba60121038820457a3b1542ec4eb1577e32b34d314e4b5708d828995c60f3178cbea381b2000000000200000000010188c5e54faea52af2dda7698abe953063f961d5cdb4978f6b901b35d7f07b41a30100000000ffffffff0222bc0600000000001976a91495956f9826e7ab645b2bcca28ec2a74341c591d988ac925f0e01000000001600148c9dfafdb0c00b81b2612b98f8970f13644de3360247304402202c8c60fb781fbb9969755609939e8a85ac871e05b69252ae90f010d460187bb502201ce66a0f1794e04c8994a55ec8d261163f471af65294cf25a7fc2bf1226a509c012103b723f619455c313b833144f52401c7fd3e8d42a4f66cc939ed2b0a3744eb9142000000000200000000010189941f8e0e50d376108fa41648ec9082c55b2800b1451fd98d1647b65cc8a0e70100000000ffffffff027d920000000000001976a914d44c1afdd18ee0b038b292d4fb95383e096429aa88ac2c420400000000001600148300a21ce46c10d1ba40e0dc60bd657e4eb106aa024730440220366bb100f49a8d70696762f80d6a04f796101b3094514285a46c0fb8d1f0cd2c02201396b5f43e50f77ce6d01b04b1a3202c2799bf94f1123f7e096ce74cb7a3c7a1012102a6b71d263e259edff700d4f03ffbf073f30bc060b538c49c8ed9d4f6ac1de6a300000000020000000001012c088954137b3eb58afffb455fd23beaa185d2dab938d9c66b1acdd53cc9be390100000000ffffffff0204f40c00000000001976a914f5546a67bc2bdb60cd072829f6a7371172676bac88ac98070a0000000000160014284ca649bca6edb800acb9c0ee4728d61b9a5944024730440220068d0d1432f1ae5ee356004fa0283768782387d51a3d278239db63c7c25ac0f70220328339f4441d833215b09935065746b1ee64dc12b9cb5f16df152667568cfe08012102322cba245a40791cd559f4f76175149b97efb5988321b41d1800797de2b4d93200000000020000000001012221c5637ae9121bc97080817e4ab28614a180ecb0f2f02fdbf999ac3df395df0100000000ffffffff02b8170000000000001976a914e279994c19493261ba172e01a1bf64ccfb0e495388accd2a0300000000001600145ff97718458272cf15cd25342103260d7a42a3e6024730440220195dfb34ffda9ded344051cae51358386243156ad6c9bcc41a8aa938102acca4022079cea5d8b84f08e135696e5eeac8376d6dac4b90134425ae9d15fc3be1442395012102cd98e3dd4a94b4b246b3b527fc5ed0468380116c5d2687ee916112e2d057d8c900000000020000000001011f3b69a01684a769888386d4554976ad984f1175ad783a154e76e7b49bdca9a10100000000ffffffff0256ac0000000000001976a914cdaddf362eee1f3a9895be71c080e53b08021c7f88acde1d1100000000001600146442ffc03219b8dfd83a04dd971901c7e28defd3024730440220367fcf03ca7fcfa3b45a33a15df34b3cbb2ce5156b6c3ff54c91742d42c1c7f8022075ba0bc82d00ff97e5071540e4b63417fcd99f97edb33af1cb61657e225f0346012102b0d2a5abfd733a9cf7146ebfd5e07201312318793ffb17f7eb9969e1657c923d0000000002000000000101e0506284890b60424ba4696181a1c7a7325e7c95d31b6b25a6c6ce5078b2ee230100000000ffffffff02371b0a00000000001976a914c88ac84534a9e4629f2d01f20364bedd3e2e90e688aca223c8070000000016001401ce1386304dd5e46e613e959a950b073012f8cb0247304402205ab6d912c32072583a82ae3fb0714370ec92f4fce961203ba707cfdf4de07c1202203bb251818f171b7aae9e7b3193799966530f3346a24fd434137f1a0cfda362d60121034acf662fdfd6981703c308052bf0e20cfceaa684a0bcc57166b7011eafde929d0000000002000000000101fb14921b5f6993c8f79d2bd3a0b9849b25da7d6d106ef27c73755497ef89b67e0000000000ffffffff022f060000000000001600148a57bca10003c31ee895ee5a6acc4e83177d753bd92f0200000000001976a914df36701440f9876108ea4b2bd3ca9198f705c4c388ac02483045022100d8ff46b2f97fd1156fc1410557144f30fae1f97691aecccd23f3d30a0dd8272d02202a49e57fe044070583efd404116c4aeb962d9b4010e1e5a27ce89a7d4ec4c3b2012102f419815035c880383dc06a881685c515e886705d781b55a5096f2ffdebc301ef0000000002000000000101b51ccb4d2319b2f63aeff73846be6c09f15df415c200c93848a406d10a0d93c60100000000ffffffff0205f306000000000017a914da19d517336dfb32b3dc8a214e70924072402ca287b9fd0f0000000000160014ee249703941ccb1c3dbf00bf3eb049d8a228ca9a02473044022076cf00a614643f8b3bfea0fa7a69c3d2cedc9b6d2dda50b9244d07e27cab2bab022051db37bef45fad7d4eef4a0a6a006c55fc95cd0c507816947b71e30a6857f1b40121025d54568476425dd9431545c89f3dda76b664ee57387dca7ac090c57ba75a24b700000000020000000001018c06263eabf137ac724bf1a9fea452f56fbbd560fe09967db605fd1c4e3330180100000000ffffffff02285600000000000017a9147291aca1859694dc1de38f56d394794bf96afa06872663000000000000160014616c082e7d2b6cdeffaa76178cbef0d0a5ffe48102483045022100a56fb5f7294651be9ba2dd31d766224ce5e9b3badf0f48de9619367446b67b3802204c857a3094cbb3e1b9581489472c72aa406e20b24f6f4705df5ceb8be879cc700121035932baa3d79ad73d332527771630d414f4c98ae1872a220dd72e66e7ad152a3400000000020000000001011833f7e0e84fe6ac8e2b31385c4df01aca91f9e7bb9d2917aa793ed2a1b864a80100000000ffffffff0213f802000000000017a914f981c4f2fccfa69b231f97c252ce7b99e6677eda874235080000000000160014b4abec4cb3ff6a1defbc6b159d6231913d7df858024830450221008d8c81a0a54cb7fe20bfc7430672c80855c2c37a7754083ed1da16e99265d19b0220208610e1026d23bf31886a0c3c21cdcb17a503baa1e00b75bae1232d909f386f012102432bb5d0d965970825ddc64abef7a445f0553e9905a7f9ae72ecf6287ecb3660000000000200000000010177daca0656b4e393917895130e9295773ba069cb6519ff746b0326cade1cf39d0000000000ffffffff02166205000000000017a914bac62bcd67f80ccc8b76c35e03fe5573852c75a487d465290200000000160014c0f65f7c1d1bedc293c0f96913ce0ba3c067a9b40247304402207785f3b2ee378fe9ade40c9b53f6d2d45c54f0ff288384d60a79b54bf38b9d8b02202c4a697428e0e3dbe3d6b75e62c81947379b5b93d932a026ace7dec0d0f6c9de012102b1d236a75036dd107ccd709c2f7f2fd53014d684025f47c46534ff866a3f81310000000002000000000101d4a8ba2b5a0f3edcb18030755163318d685c09daf5c3f64c7f21e800c185c4820100000000ffffffff02db9c0600000000001600141d9c1e12327f7d0f3b40fef3020bde759d634e73ce0d08000000000017a9143d628e3f3dda945971516a6c818f149a168467d38702473044022010a6d7bad332928018115e73c5b8c56af0e755e572b48461e1e14aa81915ab760220792b3145e8515fa32cd72e93650a2bbec7778dac7d6cbc42cac43e53dcdbbb0c0121033c6474c73564c6ccc8080ddf9be78b59eddbf197d06069e7d1d16338bb6c7a9a0000000002000000000101d11e9e269a70b02be596dc8dba4f68ecb111f5e0f61245e7623a6b9c5e6d2bfc0100000000ffffffff0234af01000000000017a914907438c207548b97051141243b3269d850611bb887009c800100000000160014bb836113e36ad1390dc316698d80fc850cff918b02483045022100a7c97a744f11d1f5c05cdd98334a4fd8bbe1ac2bc8c5ab88efcbf3fbc5b788d9022010c0349292016eea66bf13e8b89e9f0096018d30f059f3da1322ac2036b912830121029840a61d6e95c6c83e669e0842b3d902d4819bf2fbba2649e676e322bad56c1e000000000200000000010136a03d913c57f210083a14edce46ef1b14440dda57fa3c517e03e499bd1e502c0100000000ffffffff02eeba01000000000017a914e37d9ea91357f9d905750608e1790db0bf4498f087b26bf200000000001600140bb46d5536557c0c9971b2ac86500d0a70c5a2310247304402205666a7ae841c7916e0440e1550d7c2078787a72c5f0b33ba7c3de80047929798022003123c26124e9c6b4679fa43345368f67acbcf5a09940907222f716256ef28ed012102a78dd9ace3ac99e0b87e03af1cffacebc9742ea2b7a85405975afda71c61d0ed000000000200000000010194721cc1485e1b56385c873856fdf04379d362c27e9373b37ea80e7068a58dcc0100000000ffffffff028cc804000000000017a91417d43217a83f374870fc89bc7997b6b503d25a64878b15060000000000160014e8926295bc1e31e429e96e572b13e4e27d002f7a02483045022100b4913f6d66b86e1c469f04925da6338433061546694d8f23f699e3519afce6c102207d07597ba0a68f0c88245d9427b6c3f57769fcd756672a346fbc5772234aa926012102ac887e2b547690738dc363ffe309429a4bac8b2b8cb074ed575fdcac16f55d840000000002000000000101f0b8a9331dbab9dbfd770fe9ed3456f7ea4521a3c49dc9e2adf5f68338de70e20100000000ffffffff02115e03000000000017a914956848f3b8f13d266b8f0e73ab0f316e8a3d1429872efc09000000000016001482acd9e4fc12abbeeaa14e277fdb28a0ed03eb7602483045022100f92a38b60cf6e2880e27f7d92cbb117102c9303c613fc04461fd29e40d4edb950220729dc88c4b70e36b2beb603e58d56224630c61e31251a5c23ca00db7385783f1012103c4de3a794d6fc2114e02434e6de817553e69cc2ba2e53b9a656b9c0a380ee9020000000002000000000101b5dc3a79f2591a5fffdb1fe6808af30481451899f1ae1c405965f892b62bc8ad0100000000ffffffff02df8900000000000017a914b186e397769330d8c37d921acc416ba5206072e287b12c000000000000160014b1560c777a2ddcdbb62461fe036b1da102af28a302483045022100acbb0c2ba05730d28d9be34da10d295cc79ae79ca3c9961d47bd10879215c88702202ba0e592c1c61c753e02aa54c156566227d96b9d1c21011e358d0c082b106d15012102f2c1bd218f1d5734046917ba7c3aebd3e9441496d764870e85469ed9beabaca400000000020000000001011607cacf27a9f3e9d81d1c09b320b61d33126bd98ac2b3a51345ebbdb0e2db7f0100000000ffffffff0236af01000000000017a914e5d4489629efbb2fed91b850ac769a5e5ab271d587345d0e00000000001600146dafca9644cc8e3f1c82582ad1c8d0df31c2dcdf024730440220730053e366a3ca610cc787930f9bf6b1286187dcff577d6805cd9c0c32f995aa02207bb6d3d5aaa63ce99dc14d7780b1bae4fc326acc2b4c212d45546f37aa9df3110121033e68fbaa55a03d040e29712c10592f163876a4a13718b6594b598c9dea36922f000000000200000000010196ff4d089a530d4eda282569eab168dfc4aa3e94bec1589eab51430af33d3ae00100000000ffffffff021811010000000000160014e741bd461352ab5420b2a2ee8b5f5bf702f33af56634140000000000160014a2c23827763aa52a9584fa5c60c2b4782a0e242902483045022100e1d6aed7f51d0ec2226fa854466d350ba338c27e5b04566d0dff3ad70dad7261022071c3a42ec5b766df8c8279b0d4be0ab917569ae74a63e56cc6b52c36cd9a82a4012102c3e3b23c46b6f40c8434d489340c19f47f93b9e5095f8f2e34855b9b0a39b7760000000002000000000101225884190061cb3bd9c50055c0085ed23b705e70be759eef02e88771f9a3c8db0000000000ffffffff02ab4d1f00000000001600146ae0379e8d42921d15d4bfd21c6f2a3cf7ded2b81951000000000000160014f53f15df44eece89cb70c56a2fffef8595716d1802483045022100bfa283c6e13133c4f65184270930b3e153c298e996030573f311cc867eec712f022006106a1913b501f316671dd6322f185a4e7fde454c2fab428d9e7912504496000121037621ea2c88192a3ebd490b0ed033b1be7135169425f28b24ce59f5f45ff738200000000002000000000101fd619b5b54872962d18cbb7371d85ad9aa8cf65a44b20b1324e19bcd818a73620100000000ffffffff0289a70100000000001600142a9ed3e92ea390cbe1fde903738520e87589a576fe0f06000000000016001436bfc220977311ed9768cfe1de2f82580a6284bc02483045022100ad64b38174c5ff7adfd6a458fe9c0f03aaa99745cd72e538a689fb20e16a01540220354c3ecbfb6cc08f8917588d0803c96a6016e41a033104c664c45637114f01040121029b08941bd084a71055a15b5ceb205eb486e189fdc7386f3dfe27ed79609133f80000000002000000000101911258724b3414c4647b6293a5e72bdf6fecc9afb00dc0a40ff86f0706d6cc9f0100000000ffffffff02fbf20b0000000000160014c2a0b47cf5600aa3f0ca9225c68b96c10fb5bf5574a64e00000000001600147e3696f7f0c55e50d2ff6442e74e8197a000fd3102483045022100dd911e3b8d4a782e161a24720dbc065f387885727a14d6c9566ba44cb2135d150220101eb8f702617c3fe34b9f5dedb73e338cc3169d4cede77ed75fd53e31bdb400012103e99341d4c07f40bc25d99bd95a08e024f22259f4b131e4ec287e942f073bc87f00000000020000000001017d393b3d17c5f54e47e93e2512702e513f90be299b2f723aad62f10cd52570640000000000ffffffff014e1600000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f7212402473044022005f5cd6a78e0577826a97370eae75766092413943b4aa4482ec732dd53179a5f02205b8a9b162a8722902c4819234cd312d4136e937992dd63c433b43fcbe7ea485d0121031104528af8f9b6016010c45c0c078c08bac5b9db056758ac7759c71f99e15cdf000000000200000000010121ef501abca13332a71dfacba0913c9d02efb96636e4e7a9e539f223238954370000000000ffffffff01ce1d00000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f7212402483045022100a247f7a89193fd6810ca3b8798db2f3dd7bb011641361e9d05fee570819b539a02203d0e8d2c5bc1de4e6d4dfd09ffe0d32a487c92391027f7ee85798a8eb394603601210248c63d9dd2b2000831fed83cbf360f1810dc490a402e39810b23c7192d437e0f0000000002000000000101fd637b86d6b87297312a83a13b1afe47354c740b86a567cbc1a656ad233801f20000000000ffffffff01c2f70c000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f721240247304402206db3cb7b98e2ac36906069e3751c4631aa0c66df40ef86cdbe5524c8fbd5dd84022002dbb2a532104faa714ba6770f2278b24189abf8123ef0b18c5ce9f589ea43b401210359bc088237d5cf2fb0acb1294b96c897eac1268579f0228aad3f3a62b311fa1500000000020000000001016cffa571b27e6a69028bb0b9b760ca4ddc16e6bf1a300bac8cb77a537046dc730300000000ffffffff0137426b000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f721240248304502210085cd879edca9475175577fb4437b7227edd08d3ca4cb27cb5d0a67aab661260202206b0dc9aa30ffe97d3054994d934e5ba4a6039f5f4e6039a64630caa7179ce6d00121023b93548f5abcaed8ef06159a98562bf4869810fa6e6b6f4fb0950787c702d47300000000020000000001018f55cb572194bd4d0bec4a4a2ca5ae69f05cbf03b764546266e6f945f913348e0400000000ffffffff0162c401000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f72124024730440220605662d4e03541be3c437e600148637d8dd7df659c4a6720ac58632990dca74c02200f7e0aef15fb0d3552814c4e8a97cab694f2bb64ccdfb69b60976f90ae294e8501210368923744e2aa1dab16860c7ad811f1ceca1d0122a34b4bf71e9775febead5803000000000200000000010131b3fb97cf8fc4b5359e7092212b0b15c2a43522f1344ca5c20d08ffeb23c8410000000000ffffffff01819602000000000017a9140a9e242bf46066cdc1a1b090c3530be08201f83b870247304402204abc7e791db579f8211cc384a1a7d876f798da31580ba92f9ff5f12c44c99fb002201554d295e8ef86ce8ea5c02075d7f32dd3382d70d3e669a3e4323a6fcb58b57e01210292ee29d2ddb4a70a91034d264afbc6246549f3e16555326ee487e91f5e55e223000000000100000001b453ef603b8ebda79db1b5c0a4342c1ab44fbb918807a382fa5cf31a51a18c8d010000006b483045022100a35bccacbe3c7df713814ab96aca46f689479364b8f66f4e0699778c9ea46615022030da3d19dbbd8e67941a4cef731bc59f0366c09c63cbefd464ba2bba440fa0490121034982e44c67170ed8cf43f6703c8bcfaf42d1d3c5b62d78dc78def210cd70f5e1ffffffff022e5b0200000000001976a9146abd71adf9cff54b0ef103e83eee1863821857f488ac4c790e00000000001976a914ca726939cb567abcfa3d5c11422d93f6fa4731e088ac0000000001000000016728a47247fa4a22fa579529afdf0641024238b86712123e2d52f47d799fbd58010000006b483045022100a328f9268b137239e77689a48bf71a9eca044d8583db69c17b1137d01c699b5d022057240eff5853653e5e89ec0070e7b5d8a5176c951489ece5e07cc15208e5489e0121034982e44c67170ed8cf43f6703c8bcfaf42d1d3c5b62d78dc78def210cd70f5e1ffffffff025ebb06000000000017a9147ef70abfc575ea3cce0fa9e77d92137010f08d228754b30700000000001976a914ca726939cb567abcfa3d5c11422d93f6fa4731e088ac000000000200000000010100b3058c013e6dcc3b5455fb61da6c1bc1c0b1f9eaedee2684d6be3ec2006c350100000000ffffffff0252ac0000000000001976a914c109805dd0643881983cddc3c9e89bbbe4a8b28a88ac4de68c00000000001600143b0a7363129c5c1d995fa5dedd1f6adea56066570247304402203727c566d5ed02409d9fc699466cf935693e48ebf66193e10b9902475c1dc683022026ab9d2d84077eb60406d202c4f35abb8bfaeed8be6c63384bafc4ad1415166401210333b7cdfed64ab3dee70de724af2960e1b3fbe62d586c09b54143bcd84fa3714e00000000020000000232d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace5322430000006a47304402200239aa76f5f48c6c32f670f888e9997cb2fdd4c5d2b86ef059bd37336e288b86022067198f6fffdd4a3be1568f6f97d682c68190520a008ebfaf315f4136ed444488012102496c8a56e15137f6ae3c296d801a714614f49608d3cc6bb35dec73a9cbf7fe0affffffffa75fb3f071789122a62370b2759ccc6cd82b0b7f9e4bd9b79680bbb363c442f8000000006a473044022006b31054205ca972d5dfda654fba1e98b405a2d59748a8dcfdfd181e5569a76f02207d4e6f028168a3bac8bbbebf1295d6dafaeb7c06f4bd600408a55234dd5a10d4012102496c8a56e15137f6ae3c296d801a714614f49608d3cc6bb35dec73a9cbf7fe0affffffff01a08e02000000000017a914f424752da1c11bcbf2a1b3fac9796c99357b62158700000000010000000001019c5b3310f5c0774c3dec452984a0c2c9c569a978709a2c652deea3644919673f1d00000000ffffffff413bbe07000000000017a914e0361271a717e55eceee2167f6added5d677c7128782a121000000000017a914b36e2683ef7acb1ab928dfc442d01b5acf2bf97087f55c0300000000001976a914f2a0259177cbda10a8a6bb591bbd4dd277b27d3888aca4da08000000000017a914736386f0d9b241931854a85d227c5237e14ed9db874caa21000000000017a91404c5da7b7e97b7f94d25a25c2122a43ff238a23387a52c01000000000017a9148d0180479a2949108016e129d573c10b13b4d1168740eb0100000000001976a914e297e8f3d7573038f78ea64f6927c7e43dc5a33c88acf2bf01000000000017a9145419aee11b400a868e2289eb3b2a1b858297713687a46529000000000016001414542edabd794d956ec90dc670db2c6d64d12ff996130100000000001600146f4e18b825af9c9bd5f943e8c1147faabb7a5a769d6400000000000017a9144aa5d792e802e09a9b83df8be22241c7a259f66787d75d03000000000017a9142193f8ab458cca9e664e72a23026c2b82bbbe63e87b16400000000000017a9142098db88f811115f3ae3eda71543f4de76af9e4b87802e0000000000001976a914446139605352ba690b05a55ff5a8afe25a4a1e4888acc0c62d000000000017a9145a7c01c87ebf591273909eb59939581a2c377b3287f3c80000000000001976a91481759c3c48fee6dbd60cf06866181cebce085e2f88ac34bc07000000000017a91487c492cfd49183aa9d5e38ea1e81efb235daf1e887c8b800000000000017a9140278380196bcf55a6893382d7c6d076d46a4a8db87e8de0100000000001600149e32ef240578a15aad3ffa89efbb7d9a81d8d70482e91500000000001976a914f3091e02d4ba82afdf318d37261784070515840788acb4680000000000001976a91475b64b4a625f646242b6070e70e5d91e1b35e73488acdcec3100000000001976a9140773543509a475d5feb62c28fa7b525b5fc2e7fb88ac52f5000000000000160014c25101a5b7eae39f625f725106c4bd77498e5ef4e30001000000000017a914aec7fb8dbc0c85846c542c2f5d448769ff4e392f8768600000000000001976a91456bb95fcfa6f179aef5015bdcf987568c31a20e488ac21dc0200000000001976a914c84fc035d8a782db13ff83901a1cae745bbcd83b88aca09d120000000000160014163ba4806244c2c519163af1232fb700d04644c6eccb0e00000000001976a9143a5cae677eb32db44a2c636f27cfcbff8ae039a688ac81670000000000001976a91447a5c62d6a5f98a7cdf8594bd8bb68b459c663f488ac11f100000000000017a914517b3048bdd0a9ddcaa2a5d9481f5bce27a60d7f879e970200000000001976a914e8327b728fa40c9e2a2a388e28bb7309569353cf88accda325000000000017a914139dc74b55a1cd0051b50ee85e394b413d87b1f1871c7900000000000017a914f38455e5764a8734944bf6218621c8916ab9715c87400d03000000000017a91447c8f901aba5bf2a550072cd75521c50a03856b0871bc40000000000001976a914b97ef0d88a6ced58e2045ddca15429bac4ca878888ac0af20000000000001976a9140f9c598a0bff1368de0b62dfb2b764dec743589588acaa0201000000000017a914c2e94ee396b9e52fb3e109cacca90e058e70d8aa87982770000000000017a914f434758ba328c9b2480fcd9e6913ccde1e356b8d87904d040000000000160014e60be502432410cacb8327e89343f22d82a22260b6c0020000000000160014ac112f6cd444ddbc5f024bbe135ecf80e3a407068ab701000000000017a9142eb7584d12010d710ec2706967dae1d179d4556f870cdf3000000000001976a914966f496ac6573719764a21e9c3de680e30e49e3788ac452d00000000000017a9145efbaa44eaa6cc67b39cac480dd7c562e76492b2877269c72d000000001600148984fd54c026c0bcd3d935e86309e0be3b6e1138b4fe0000000000001976a9145c29024a616a2d5b96a552e2f8e1e71a78b12c2588acddb01f000000000017a9141698a2761785eafc0912586c27976cca3b59096f87a9e404000000000017a914d3c4f63c2cad79589a65a9c28a322f6b9e616fe3874f226300000000001976a9141053d5a3b655e84f146454ba1a4bd0cbe8d4a80788ac732101000000000017a914092c3cfdb4013f3c6f7de51bca3d548326cd2d09877635000000000000160014ddba60cc23c483b5da357a571f7550b0620d75179f8b02000000000017a91457a47609d18aa6326cbf8ff681918a7f795c2e5e87485f03000000000017a914cc8298de2c6121df4a05d2e021548457d59d671087648101000000000017a91495840b38fb9593cd0f3ada6e372bf0c3ea665c078722b021000000000017a914c00055e7ce98e782a27da16805ed9135ec38cd8787904c1e000000000017a914b7c4f819077423399e295e682d3f3be1e5cc39c087d5730d00000000001976a914fd7b91411e253cc7dca20076c26fc5c86804b15788ac1dfd08000000000017a9144528ce3aa386bf3dd21a63733b31e3e89183896187551502000000000017a91467d629f433f7ba3852aadb2c6eb82d366be4cd16875c672800000000001976a9146ba578f88070aa65a64f301b98c619e27a38ac7288acdad60000000000001976a91471413094a2ee2c6067b56a004adc5ca778f5478088ac44bb00000000000017a914914afac8e0c7180bcc9a64220c8e54316eaa83308714e000000000000017a914b5710bdfe0fda8d458035cb6298681244043e824878dc10200000000001976a9140a496638b65b8b754791d826f26b1c1099e8906d88ac48521000000000001976a914447810b1819f6fc1a9d40ede42ff1847594bc1e388ac10072f000000000017a9149cd0cd01476b05c32e1a5c487a792dc6c67aa9b0870247304402205a9d00531e83f87e6cbe0eea7bc0f5df5cbef33c0b69b31669fab2952256708502202ff5c709e303c36afcbd24872d67acbf39a37bad8ecdcd8b51081e9bd4e827820121021daa684cb643b2f8749c5694da711e2f8198f57374358aa43c481223aace378f0000000001000000000102aadcbf0e0b1419a8fd8435b3389d2ea1c9baed8bfbe8d68dbdd47936ae989b39320000001716001404a6df47bd8920ad8782ec4b93eefef0c9a6258affffffffe920d2a3f8072e4cab2437a954b5167cd1aaef7edab985d8a588bfea3968f5020400000017160014844dd07350beda7572c1dcd02a3a3ba208ef3184ffffffff016c0d29000000000017a91484b16753072b37c53b52cf1e8ed7134f29a57de0870247304402203adf0ec139c394e1104be3ffc46519fe218d5727c4cfc6662faa729af7c35d9d02207ddce9314e9d3918136f0e5ad004e4d902a8b0cc117f869331f95e20312522b2012103b937a753785266060d3a63a981096d15bbb7864a652fdd8668dc83934e105ce002483045022100e3d63f5417b4626f8a6f6cea3b0bc52c50ecbdca3c035703365441ab5c0a228e02201c2b7e1a72c8c9af25009395ad495244c92580390e0f603b4b06f41a847106e9012103c3344ee2d08c051b463253c115c94b285c4c99ffdeb546c441b24d20d2c84512000000000200000000017182539f860cb6fd515f60de4fdbf78880192ecc1aa2846772f289a009c244bc00000000006a4730440220704ce85b8d2c11e8b89b3fd491d65d43571254975ba01a93e7c90a23ab27166b02200502b4deaf8f45b6125189b13f55b36c8a2dabaa82c5aece41765c9a4f4fd26201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff520bdf64bd4de0b0740f5e5d7d2777be762762891f6464b276ad376b897d9c01000000006b483045022100d564067783f958d950e3d88261146bd3953fd99476134f42e8d2015c35eb34c202202ac6c7ae66099b770d9adf1893bc931826a592fc0504b329f1dae7f3c98f05f80121023a967779edcaac746d5c19d8727a49e4236bf69b467a4e671d25374f1b493accffffffffaca232a509c59aa5cd1a193c23292e123adb274e6a4d375806880de5dba3ca01000000006a473044022061e0c33f7200ffc2ec404b61786cd9c3b9e8d67e451b06a01902b0b8aa8d0ef6022076960fa998c3a2bd2d9b539f2fcc9d9f6be938c4d04a5ea66f01c5e881c3523e01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0a26be1c4a256ea8c1c46ba8ee0cc718c79a4124f970efe4245fc80ef3954d044c0000006b483045022100d9053e0d360e2d53c11b1e1ae110480e5024754bc5e5e71cbc1f213a9f083aba0220298d648fa484520e7f352a5648dea6f0d621f6f7f27e1d976efacdc8387c649d012102d48b341ae74d2194c7444345256fabc47d248b518737102ca6d87b08df2a4bcbffffffffcd291a0a06678b913db3db9f9a05eaa672a48b99f2911b28e717bdaadfa7710a000000006a47304402201d6ccfee1d7eb030bf37fe735a4ee037a02501dcb043f9ae723046290e16d21702204eaf759bde5cac19f75cafc4adb539caeae4562051eff805595570a0c9a6344801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff543de96120d0b3dbc22be516b460b327e80054712665301290f22043641b2c0b000000006a47304402205e91e77f1a009b7f861ce4ff542d449e2c4e1517ae86daefda2c669131330b3302201b7bd10e988f8cbd52d6d6f8ed9f040bd7f3495c9024c18c2981ebef562d34db01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff410200cb0513f8859e443b35b689deb57d67cfb969e507c084b09c32abaa2d0b000000006a47304402200f0c1c56ee372b53929c6888db3fb066ddb7fba3da6582c4c03116c8693a73d902203c352584cc30af4f5a80bf17a1072a73851492fbe584acb2a9b96885bbb9838101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff14c36ad6b17ffc42e68c8306fb8bf5de0533e7d9d2afa2465d4ade92356baf0c000000006b483045022100f91b7f88b92eabe4543302f64a6d8dbb6281bf17fc6341d6961007ac162149120220282fe2ec03536f76415348e22c3c54f978b3e0020807820ffb5f3136c69eac3301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff259695630740f586a525809d8ffdc29411f4869912d3ea6a693016344cb57c0f000000006b483045022100b494a509d3c543ec826d487e8f4678e812490bc10c6d23fe791a6a9d20be17be022067751c074074954eab5b4ae11f6f858bdbd8013d5a3041203eafec5d60a7db4a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffcddd9cc9b1994b401d075f4ebd1d345d36574aa68fe5c457b5ba87f2eafe4f19000000006a4730440220465e0c79fbb84c632998c897018463856fb5e516ae7c10d2b60d12cb07008f8002201513982e74e94071d2a0d5617acaa8dbe72f5249a38b6ef63e92524e1bb701a401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff58d0f9091fb7ac63d2ee67b6fe1118d5aa1806147cf1233870c5eed1868f5d1a000000006a473044022021ed6d0ff35ad7a03587a0012da8102d268eccfeadb6347041019a9a17c91a1802201886770811716dae26f6aa65debe7123ea4dbd6ed6d2175025920d4016c9991001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffe84791c52ca7cb7018b5f029863dafe5e5518b89ca8cd63d749879ca01ea9d1b000000006b483045022100d88839188d6d82344a86c2fd4a78ebc992a463a1c04cffa5c5071238f246a9fd02203bd4b822c41293381610b2f0b695087a8b71e24adcce21bfde096ce3969e4daf01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff52a49b76a9affd4702d638182f4c1b271b9e878259fdfde257caf5f1f8d4381d000000006a47304402200a4c649de32b8848dc971e00e51f31aa6040bf298da1bca870e9fc6cf4c041a3022032ded63cc5d91ffededff542eebd86934200f0c0f27ffcab79975c73cfade8bc01210378de09686857338c89b675b324067f4b6d777cdec2b8c4cf538b950a94b315efffffffffdec4abeaa53bdf8645fc489078ffdb090ee0d4287322ca922768b2f374b9851e000000006a4730440220233f76c4d8ed53936a7847f391f11cbdf70a90c9b15ce137fbfc41ef96fab57402201dcbfb95bf3e3388edfadb60604efff78fd52b4b03b5f0e9a903a07de527ece101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffb7cb8d4f2a6460eb9ab5beaa96045c1e0b194dcbc51fc4e67385e7d9e8fbe71f000000006b483045022100f246ce2dd900f75ed116bd43da1078659277edb06c0f69308c5fc7e3350b96e302206080dca0d705af7c07a36186be7ded3b2d26c4d21f88230966782a58357967e401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa1a02ddf650ea0b22f68e429bfdd282bc142c0920be1b32c1c8927003ec57022000000006b483045022100998d5b6ac1478ee2a4f061f24a05a1ed87d0e5fb20210880c24306b3cb44f5d302202f9969e4ac896f65ec24e619e864aa784749e5f5892208d6d5569e8c75b561b001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff68fe66a6aadd5c0aac544883a9e5c4bcb077ee3eb8a475153a5b2c78d6396823000000006a47304402207211e87ff71ec3d94e7fd3830b72e15c914427c782b94a43785da5bc19b65ef402202c996f99b32e92a079ef39f1b9947348655bb80f61c0a8b7abe9e90fe195f23b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffdc67a26338c5e45815dc57092e263ea5ddb3f4af1c9061b683fb7cdabf9db324000000006a47304402206abc806085c0a04b0c990df0086ac10cfdd030cc446f41fc1d8224e779010a6c02200a47bca041f85c0ae52b0a1efdf1f6e57f3959c155f9c7732a6db05f658b537c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff41ac5ee0ba61d9b4f3c9702fc1370eaa946509607ae324c6b9dcb41f78d93427000000006a4730440220717aa85d823c76f4b424f6a9c1cdb76de6997138586ffa1075729a40ab2f684e022059748b7010d13732f9393fac38eb5e4b272bc877b16b1921328a29d73e254c0c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff9bd6e3b8fdb76a6ab5896d85a70821e6b404023023ed932d944eb4d2ac01cb28000000006a47304402206789bd76dafcd25d726ab27a1a6336bde9cf79c5c7b0919414bb357757346f77022059f9342c9bd05e08148d7d10b0f528644f0799c971b997d9e28dc404e338805401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff131b7907c081e399ff3b3364008e42a9c49af5adb570d982c4429e486457242e000000006a473044022008509cbed7632eae793a7d1f0359e2180e1f9f5861b85322a310e8b29326249002206f7d0f7a7d0a2d4daee0fc1bf92d11e55e1a410975b54d55300f6b11147fc79601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa679648eea3d29620c9a16e08784763be9bb6b8984f128df62510fb39b805f33010000006b483045022100970cdca4a78549f530bbe9fe0b4681e1e6edda77c868789925224ee88d81494f02200c7a913d7381ee52f3a9f61bc0eab5b9421d013bbf268f2944db5afa66d7ee6201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff7126055b74d4757ac18d1e169349585a4e506be3d30050cca008ed5d3bb7d933000000006b483045022100a0bc259ce7d5d2694cb6c3f5348191ee321240bc57a583738e9f9b9b72d200d4022017d5dfe1ecec0b492e4afb8d33afac0d2600c4e388c00e6d423a58673e17e3bf01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0e6c4aaa91fbda84766d758a9057893de256b0b8a2c17316783918afccceaa35000000006a47304402201a7830ead94c6b66f978af047e3a473dc0f139045ac954e979477eb219abfc9102203ee1786dd6fa97bc59dfdc657c3a62560baf305eb3904ad8ca9d1a701b1b8ae901210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffbbf71bacffd7611f012c697f6bd07038c687012b63e3cf8e195a7c04a77cdb35000000006b483045022100fcad393b5e8183fd934ee7ef9f1c1106cc1b1dc5184845980bd7d79d8356e09102201b40e0ba2ed41f09231422ecd64617662e6ec74a4f57d5ddfb3c6004d9b6f24f01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffc0171034ad5c15c591bfa1c74116ddb3ef19dfba6d3123749d3c8d05c1c39b3b000000006a473044022072c7fe5e9390147a1eddecbefb8ace200cfb7b873f19190681eed921b06bab7102207cda8e9ea5d887696127a0a281d5543fa65dc9ecbebdc4240eb2d63ab93f3c6601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff06ef4c8d41defd4f8467fa84dd552beb769962a30c695c6cb9ea5f0cd064133c000000006a47304402200fbd2baa18d0912b54bbf8a5b239a7c32544401a62b7fd0304afb07ccb09c9da02207ed1da3b52e562cec3689cc33ad7e41629a61fc2c9bdc25116f233c5d653d0e601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffc7d23c9cbce58f037ef1898b78cf6e51742d7aa83f01189af0da8540a743453e000000006b483045022100bd47abbc461e58c1acbe0580a2a9460e8f4d559efc22e1e7fabf85751e7c203202203b6934e677564db00ff8bb6c82c562728380e5a66c5959db0f4d60e3e9b85f0b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff81f91a1ef43a3b37822018bfc5bf4892995dd9e3db432153405781d6b6c87a41000000006b483045022100b2e38a028e7302d1f25fe3efa3d51611799e5f9286d22ce605dea6dd3629ba57022036c34e460ac9e453cb3c3d81b02826041b6d7b490a924c16039e27522a938b1801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffffedf991cd3e803dd5e379e4135400658817718c8dd2521e558f815e11c5f9141000000006b483045022100e87c64a848716dcf08a68bc803cb0cdcde55aa4025217cd55f211881524bda0e022047dd9960be95b81ef979fee7d73a42cfdb0887203d56a4c986c72d2ffd2da5c001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff9be5a0802a2c0e8a6c6e58719429639af280541949ba389898ec609ab97fa243010000006b483045022100bbe7b1a0eb326d35f47405bb21f2303cd0a03a671a32c1851f941c99f097ca61022004bd947f5dc844e19b86f056f2f4de4d746a0da80c944fa3c8f4b87d4b372b2901210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff2d681867c37b2060157958b06befce5c1ce06ffbe08c9d66063d990b974cd343000000006a47304402201c7fcbaffa654d8dcad577d1de9ba8a5ff73d814e69243f0f2f7713155b2280b0220266c5632b6915677b222ed0eb1c6fb4f88c36f9aeb6debaee0b66172edccde0201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0c815af16a685dc63ec8de68db59cb303178e533afb9bf8572aa30fc7252ce47000000006a473044022033e8c420ef3f25ed1086a2aadb9267c077ae14553b42c6e7adb96d5c46303020022019cac6e636e19e7939c781e53b690ad1e1db816be466e353d290479d3fcc5a3301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa95738ff70a4f325b5b72098c400830ccaa2211aa341400bae676e9f6ae10f49000000006b483045022100a9decab07830e0d97493130cb54f3f94a491bf0da540c09233bf8d1c26803e5402205a8eb13f8109a5a1aa06a54ea550694ba14eb63998a027872c0daf9f4c264c3601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1aa62b39197bbcbe2b0166eb105ea0d7c9b0ca7a6a6fba45a829632326b2dc4b000000006a47304402203db1425bbc1a0dd537d130b3b32e9b0ec5a63f53a62689bf4001bd63082c72150220122f1cde6f16e9b9cdaf1064d007a546778a27e7eaffa986846761b21c3d9f8501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0016e5f5c795d17ebfd957160bd7dbb4955839f780349564f1a6ffed0fe0c74d000000006b483045022100b1aa00a03b62a13597f0d8934adb011e5ee3904478479bdcddfe9f06508fed7502204407298bb5bad15aa4a809aade02c556b735e9bf6df4fdd217547bb5b94074f501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa3838d08b52328783978047095afb4c47a82cb1e03b93756b056eaa93f17d34d000000006b483045022100c239322f6d88b0f4fee95c2b1da9150afd067d0c561b1d4cc84fe5719d4f531802202a7cf669cd2bf17cec9176e36e51dcd66b7784ee9ae74ea3f043f85456633bbb01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff455f310d623b5a2f6cd86672634276afc7938376baf371f90734005b2963eb54000000006b483045022100a96d92f0f8855237f2735b0864139edba0545038cddd921d3c0241a34d28759402205497c1df315ded9605c404f4c21970f57b6dd113b9a33f8c84fa38d5411456e1012103e528538cb5e18c0bae17fd99d50f5b0f0dd593c26717ac8eb0436e3e221e0f9affffffff3650a4f27fd7dbf2ea97871af7c5dcc336b354b0642628ed05f062ff1e00e758000000006a4730440220216888352c9b3f3bd91218b3f47e1760f9910b73c82a18070f6e96ad548200b6022038bb9f474a861897e9cf448f5d4901ffe47c797c2df8b8e8b222fb8bdec3d70201210380666b6117c5da1c179a9d273c6b96f22987629c790885ebc8f2ab91faa38a28ffffffff3beaf75bc56c351e6a05ef70074394716f42bfb2e8a9d2c26dcab053d3128b5c000000006a473044022042b4ce88710368d18b9a89ce471799ab6000343ef45277d757dae3853a1c48f60220400660d2f5aee7c2843b8b26f9de676406db39e26291d8d6e6dc23279b6164f601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa8926027bf93564fccbe679629ce1230f2c0474d4bfb34bd96fdef4814a9135d000000006b483045022100bc35f4898d44d22401048fb290f86ef5e3262068eafb8e808ccb9842930c9323022028906bf2c2d6c8d20b8cbc0a11d84d270f365ae4a843e4e59707c4c70952916601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff59f284a7f3d001ebe86d8b9fa50be16af8754afbadfaaa3dbcb0d3d504e4875d000000006b483045022100a78c618698f5e2493155ea741e9dac4af4e5a2c56e9acbf41612baa6795717780220109620014e36398cb5adc43e93b1f68b63839a4bb4fe3cba9864ab9aea3b618d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff2991199f022e1c82aff66016fa8099780d7aa70c426a3eb2f21b6c5a7d8a305e000000006a47304402207fca332d8c1f91bf2378ebd7f867e0a8f25e490c9f6701e94f2be2decb2cad9a022045e8f1f9bb05e8c3d5b7671cba9a75eefa0802db0b749a62a61ccc0f3de4fcf1012103fdb18923efeaac48df5f2a51ef50e64d0f08b82367a9e7cc341390544cbd49e4ffffffff10b321e986fa61221dce648ba3484ed1581cd14a440819c659f506ecbac15060000000006b483045022100bf3afb49ed11b0be9f0322837dd9c7b997b608d058f88d77e38246622fecbcda022069acf56809c18dd0321e232e69a10ca7189e5338a1105a451c812329a2b4c40b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff8840bef5564bce62a40e731c7e24db8a82249d76b8571abcd2ace28b61556262000000006a4730440220233c5ac0c9f647af9e9527478473614da17dfcd61a211f47c5a162178f57506c02203913d39aa86d742fd08fe70603526598adcda1969b6d96e5fac855a97d5f5dcc01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff59764a05bd1c9254d5cf4fb128686e57ed84b4b5ee9672800442fbcda42ac364000000006a473044022037fa03b9a7154f255ed4445dac7ad62a8623852b27d4898254b458f35c27c15602204b8335d1b8d1f1494c15dad5783cd0f03da6e951404334629ca060cee3154d0b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff31a7bbdf4bb766b3037112c13a24089292dc143a0c67c4a36d722909c56d9665000000006a473044022062d236e5e5b35c08a522652716d09585f8ba9a97d93453d287aa809b3c987115022049d361eb54fbd88b7fc1feabf4bfb6dc8e957d3a29c323cdbfda51c067d9050301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff60d75742e3f4a9b4607d9c8ff85ce0f5825d057396e28f345a076591496d8e69000000006a47304402206ad52aa315cb7a7e97ab0a95868adef4629de9f98e09e24f6bf8cb5f3813c9a0022038224e68bafbad0d11ce5c3bd525b26d3f897cb8e6698985518508c07571d95a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0ed9df0a49aeeba1e5b31bf74f5350df7938ee4fdee933fd3f483e97b80db369000000006a473044022047bc1ef5041e394b93859b2cd776c0ae56557bdfb42a4ce5de8067d76afefaa5022011b1a938b5c618a551c68046f7a732b8130f99f9e3f0b0b2d154a4817814c1b001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff63f3dcd11fd905bb05c4eebf7a341e990c9d0036ff711c0e8ceba37db031c472000000006b483045022100d0d7046efe78f3342adafb28f132a8a9f4ef88576aa32855d09e27c497b68eff02206915d541344421dbee67615035c76be1db9669d90e4e1c725d314335ac41487b012102b0670286efca3117798f23dbf885dc014da4926e9c7878d4832cd775ad5e4620ffffffffa632fc9e262fd2bbb9f07142bcd982fb219deb0397aa494f3101a01648118274000000006a473044022052fa048088ddd9d136655944b3ede46570c08c454b585769a223c0b56942588702203ce2b6a49c8ea4d8091dd814f1041d4df8045a4face99ee3319a46592c1ed3a801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1a92af32a59091b898569b1d48e56d3ca690b018a127d95175b3b331784a0c75000000006b483045022100f6abcc74dc5590bd2030272a8df54576e14a5c5a4796746bd2a2a79b7aa6635602205b5e99fd73b85f6baf586b26e723b5252b2e6f72d2f1a1d82f703bf4e8d9032701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa4e8afc70fcab3cd1fcbea58572cc92dfc47ad85ed1de8334da1779b86857576000000006b4830450221009f6ddf8157046a3ddef28825977094b8a3b5eb773d0d8d6de4e7bac5f2f36e1c022016e067615300f3d62551ef28502e5cc869462c47e9331f683bb4f9dceaff4e3e01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff5f08a08583b7cd83a5f40894b1aebdc5a37626549a05a26e90999faa217c0e79000000006a4730440220165e9d5234e0edbb1a208bd4a4548bcf728632b8d8524bb575091deb4142c30c022049355d13e58b4f6d2d6f8930021af185b482053fa808a7b9926a0faf0c0d54bc01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff065707d228ce1b0aac5bacc171f4d38e3bbaeeb2b2f0196e6945681decb33579000000006b483045022100a0420ab81c484ddf761858be6d29f09030e94295791c0ff8f70cb0d960568c75022009121b42727108fb92a96d7111928d6100e0308b4a412f7a08a746aa55dd012a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffd550ec910edf0c8dc210b3257bb43b76b39b7b83cda2037c93a7892cce0a8c7b000000006b48304502210098575b511f3a3c3c25e593bd507d17ca2b8d6d28d73b19e886bfd47355f04a62022077a8b49ecaf3dd374e9a6fceadaa6f29a9756c914a65b5cc2dfa0bfee9001d6e01210263ec05b5caf22c5703463cddc7a4d0a692c333da7c38390fd71239f0ff7800befffffffffe1fbee16d2fa25921af783555d1f1798391fbad01d0b72c6c8f60332e6c697c000000006a47304402201576868908aedaf63e61dd55a64ec3257b6b0547ab6b0db15513a401f669800a0220314134af9162e4919f4a69977f89bccafe8462354edc60fc2acf090558c8d8bb01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff781edab895b1db6a04a6fed30809920a868e72989c375b4d23ad17bd41aee982000000006b4830450221009a3ad09b36508f8a2e5e31cf09ebcc0a8ce9acdd7b586c19ebeef95bb707b8e002204b2886a8ecf14fc6732d9cdd52da49aa4b24ec8aa6314379119790ce6174b8bc01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1bd854a7b4b2955e67d649a02679c7e107d45d47658853970bab415b4f37aa83000000006a47304402202eb780d08a5aec0ee970cbe5a7975281044971a19e10cfa30685fa7e4b6e383102203a3a505c68f87ccfb3f2b79bc6c5334aa6203ca83c8b33b75cadb28a976f6cdc0121034ac31b9d1d4930f21e47713c20d4a522755732eaf548282d9f6f2a8450e42055ffffffffb40dd1132987aee9444b8c51987a86bb7fc8a1f4775e0262fa0f0112d415fa84000000006b483045022100b47be5f7c89c4062f298e64f13b8202ed88375f25733afd6b7dd195aeb6c217b022079a17fcaa83f046d5990391224b3ae0f08d82ac1bbfd3044a92272d054749b810121035b8c331efc536630420650cb9f8bbd62248c1f0ac386b96a99c30f168d3ca391ffffffffe52669676baf82a9c59d3d1761faff803da49ce1218e9fea157767ac3883ce85000000006b483045022100bf60d50d659db2b2c8d5b80b881f5ff3c762047123531091e8b13e841312dc770220794e8c17448e2dcdb986f7bfa9341803e414da3fce34f211865f2ed1a430211e01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffb6c71c419dc7cf6ae7379b146e6c1bb84992ebfca3af3986f8d6ea1bbe280c87000000006a47304402201d4576cde9cc1760d5234a2db77c5cebcf4492be084e160dd1e4a3841bc0b0bc022006271da50c473acc9b6455309510fc2b7b1d867a57a15b0923533b7c56c0c69a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1cea181c81b8e785852ad3d35fd8ce15a495e9ae76585434f71d25f79d462e88000000006a473044022070c332c548a8b0da9a1fcf3a5893c3b80d2c5b29f8b84a72b5bfc48ee9ff324e02205c61a4acbcc1a11c59400110459ba5948803fb4670bac1ffb737ae5f091ad28201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff61f816b23dca0f92f25a1dda06184086d841804f90906dbbd2e389b12b604989000000006a47304402207c11de4e53803accc8d153047524b1c40ae26403dc25734410da02e7b492f649022051aa3df6f84513d84cb989eded66bdeaada50e29139cae0d4a415b08a956258001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff21875830e514184602f0477d723a2c079b4dff981e8075d07fd6224cc663508d000000006b483045022100a8a5db8225d42ab85255d4e03f8d28ecc4e2acb93875ab9fc38481c23a746f9c02200fa79f0c161730819917032fe1185b36a4b0872d23e5c7f8c0d6e32336246c0501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffffba9d017764b28f953eb226b27f522d9a03cecc0d472decb604022b4332cc88f000000006a47304402204bb2c4e816805b337e084386f4e8e7dc26fab847616e53d1985ffa2648b5db0c02207e91d54a14eced1d61c4be49eced2758b5dc142c930f96f5d5bd5ccc9068815101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff12602939fab9f94bef6b88c8928c89f8cedd6354e72ada218da124e509f0f192000000006a473044022048e6afeff97d08b02e3fb209237ceb86776c64c2df2c8973a515bdc0fc1a6eee0220575e00cc5e736775b16fee10a785249a2e123791dea85d46d3745a107f232dfe01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff644274f866d4d7acc89d75e1c5319fb1ac9ecdb630b28e460bd0c8a8aeed439f000000006a4730440220325630cdb431cbfefc223c556de0a3abfe89cc857da051c2e2cf477e2793dc0f02201a6d44bfc896509423b39610652b099aa92e9f1655727f798b379c06b33ee93201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0355469f4da7e19b1f124ad4a1138fb4502e99150fc335cf1fd50b214486efa0000000006b483045022100eb37e4664528cc936f854acbdef66993bbd0b2858c7fc55ed7eb3624ab223d9c02205f83fb9d6282714f71f5f2ec1e020e0f4a246e0251d8d61462f42e3f9322ca7501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff3840812abda31316ecc97539e74deab55e972b97936c8296812811741adf22a2000000006a473044022034f2b2c0ea016dc8710d6fabd567dcf8b32a737059c55dd495dec82b737a7e1202206033e5b7c8ca614fe500069cb865e0ea40ac6115c977f8e4c12efcc13687a64501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffeb977dbc4c75d338e5c5dbd6404c6a1607618543e0725c95070b489708ef26a3010000006b483045022100b990423adce06fb0de42f4b4cf1dca93526a5b801c324392b14b36cd7cfefb4302200e0d83d418a9e962d0d257bda7ecd222c2ec822d10810564611622ed0089de1601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffe534e6efb7dd8008698a7b01954f8f654e55d9edd95c26a6929e6df0533689a3000000006b4830450221009c93ca668953c0afa38a8095c23f45fb384518724a72f90b5699e42d73ef042e0220183781596e37c7aa4e7960152ce8f3ce0b333123baa289d9746c60443ae6c14701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffaf8d7386404103599060031c1b06110a7be6b76c1c90341e8bc746393bfc45a4000000006a47304402202fb4ede8551958b96d8225e9db3f85d453e2864792d32d3fbe70e84d7d563935022004d89de1ce533397ea04a519e3f5f2e60594784eb0b09eee9b7d3eb4bcca6ba001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff507006b74b35dc04b1ac3f078b7f22e5202e1890a2997e5964b747e33e800ba5000000006b483045022100c3c1515921194a90348bfac4016a8c0967b41780c5851e801bf84f298ccdbc590220024733efdbcda6f54505b8c2ff143979536fb8311905ef9db96a20fa42f545c601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffd4d2a484c4a629d3c45ca43475a5bfc0c94b8ddcbace6c571eb979cad3d035a5000000006a47304402201a2d8843082a65d2723693bb87f564d916fe778e7e216f153f6673a47eb1fed702201100d550f635b31e680622c71aa109853beaa5abac1b17b5538c282f5b9a812101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffff09792bb2db0331c2a617f6ea6fe5cc0846b2fa1164d4526f61207d9c27ec4a5000000006a4730440220757fd44e02908714b749317a49747bfeb3344b9a1719c5f922669e46513a2630022066b36635bc2ab6da3beb69f4140cb21427915ff0621ab80894b0d40f4fc7726601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffc0433548b5086dd0ceb7635d806413ad14f9bb2f3f96bfbe739bc9573fdf3aa8000000006a4730440220617500ec0ba287275205cc1ab68c5ae9e3848f69a498e0f8e5f8a003e31ba6de0220746cb6debd13a3e2bb171e20461b33fea564756ae54a299e59bc78ca930e9ff601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff76ab576644e11b1417526e9ca213d7d40f5ed18d90ec102e9a077b3c40904baa000000006b483045022100f02e8582ffa157ccf6e32dd239048d19584f31bc1b1df8f6e57d6dcd006890a4022017bbaf928f044c5baf55c54384c285865647b0be81d12b615ae8f2cb0f59ef6801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffcb1362d5ae3c329efcfc9f5e50c4261f8ec6e5f9107d7458da7e66d4887a14ac000000006a473044022065f5f84c1812b29d5bbf9111bfc6154e0c149e3c71363f4248efccf2e4f40c2202202e8d5e8297604d8f9be57aca1b162f2623e89bc0d48c390cfb887fe37692a66401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff510003d50e57bfa14b277c5307c955284dd3408e66cd8aee77bbeb7081f0adad000000006b483045022100a789d621aa7e6150d71735030398e67d4e48940cee0c76d68713d25836c7d63a02203fbbb8777bdf7df1c8991ea55dddeee298237ed26314abd8fc53ee52b01e5782012102a8895037621c3c650eb04cf243c21f2e49b82ffe0a452c8aa1526ffc3833f544ffffffff545619b29436fbbb4746b8e6897db253d8f9b1f58f79c3221b56a89ff8ab01ae000000006a473044022058c8ad8a294c3ebaa45dfe102137f9a00416e3745821deed48fa6495f00d202902206172f1f75718bf7e0dc030f60d1353ff5cc3ae2193452d5210d50f2b9ae361c801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1aae9e09c877831549eb0ee23b05ac944ab51764473b8f65060a0de6a796d6ae000000006a4730440220510766f8c1143d8239f9b7c31b0e4a8de1903e285247fb541b62cc6a6c07ce4702207c9419f3386a8bbab6f5c1062976659b525b4ae61735f86f39d65998e16953f301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff097a8d37e701e7f2ce47c3734b5b3b4b556c602a77235274b1df53a26613adb2000000006a47304402207a6fc81f726c5c47418654fb763cd43f8d848ceef53ab513904380cc17b9b19902202b50cf4cee4d576dc3a0efe497591baa81bf54426ede361a358a8a644a7b16ea01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff820de27fc552ef885bf57586111c490fcbeb7cb7fc98f9f5f8b7e8ac841687b5000000006a473044022007d501d9120f6405de100d6edf9fe07e67ab3c131ec9532108a71bc6e4e45a9b02200228c553164541f54c709e9c1526dc9547a4e691940bd2b79a8ba862ed9fccd401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1c6bb2a5938c14c388f52457951e5c52a87e34a56e4e9df23a2fa11e3df1abb6000000006a47304402203f5a3e966a08f408db28d3402539e6de78c0c9aa409ab866f3c98f0bf708f7a602206f8d1460482577055113ba06fa3b1ae2d95a0ad9a37a45a25a745f88cc59408201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffbe6f41c76b26e0a987d7475e8c5e3f168285abc3acccaf0d6ded0be8837fc6b9000000006b483045022100e3b8e1db6ed6ef5418dbe0630b42b62d99614c8b53908161f5f3f957f0270ae802203c4ed6ef4c5261398fae969302d39a8484ec356c07feb730c3246d648cc5ae7c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffff7dcdba1175fe208ae736bbb18902c636f20cff591aafd78e689a71ef1f6c3bb000000006a47304402204175d4d004bf9607643de8817638437df1d4c034b2cf4b47a4a989006a4689a2022068325154d2cb6c40944b1867969dc97da43758690188045e97af1a3d054f9ec401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff37585c1b2c0cae1f072de11b5ded87a358afc45e6fb015a93e19c0565f98fcc3000000006a473044022037baaa553a33a4e6e879bb369ce6ab1cbbd43825845dd4a83ff4a0af0a431ee602200c7202bd2d1aec6bf6d1982d91794ba3730fd1b36047165e9b3354a16a7a478c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff329b7ae3d23240d1f54999caf8980d8aa1a3523b0aa53e2799dfc324b50687c9000000006b483045022100f59635ee8dc6bc07e0b4f8be4b5d6c613455d827b241dbb0100bbcd272229adf0220253c8cacb00f6e6cbfe1ccac3607d38f8f535de575196e6162a8913f5d556dc201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff55ccd61b17b52b6eb916a22076787dbd8365a506854a3cf524f78be0381d2ad0000000006b483045022100d2ef7210169a09cbced2a044c81749ca0f6079b50e738e583d8a96f2e311ca4b0220714a55c4fc2c117334b068806588e6e9b4056b8e573e4dfdfe3d700941f6e60f01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff57e2a9f4c1069ec9103064b6c1b446e93030fc8e8c0b3a22c5f78340ad9087d1000000006a4730440220384eb0084caded008c2f61b970a7652e2830384607587f0e419581e30168aaa202200610d775a38ba3ac12db2e8b366e1bddb03a0bad38200f7a0568d5b9ca2d4b0c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff922d42946183388c0cd5b5e4893357e7fa8529113267cf1da02a0173cf1233d2000000006a47304402202752c505bb7463f499c22abc5d386445f66f667275a18e31485b833d9e807ae002202bb3260d1f837a66631a0d00de9e1b36c7825615595aba893e41205e69cc73e801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffb195d889c4b75d33e67f849e6fdeaa2e38e13e97f3bf75be8ea01e388d1c43d3000000006a4730440220642163315ca0fde9367b81972b23152cda73ee612ebe32ab8f38b385a558d68f022001b0a7d6b808602870ecf491ec753d1e9fdf004d1b0456b61765afc4ff46f6f401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff94f39292fdcb74e2e9a663120be92d89f0fe8caa0d0b16ff5e76074b3e3118d4000000006b483045022100a2f5365b07d1cfa23cb27a5c53d833d871734c9ac6ceea7bec30e6c5627b796702207730a0d5c539131fe18d56e1901eb54928382656b91487d166adbf431fd5a6f001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1ba167d7aec118c8d2ccf01ad9af8b5c6fc6fbe58b1e6ac52326c44e58f459d6000000006a4730440220534f419a9981b23287a46330a77cfb076e02181d5b47d4050b817dd2ba01fab5022002c5729796af8965b8b74a2ca4727bf3a43c2736b36621282756ff3b63b081bf01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa4c2cc4ec008a0d945dc5b570aa0c670a55e0b2986d4360f82cd5711e16879d9000000006b4830450221009a36bcf427bf73137a3f3b14d0252100f9f9239db5287ac17a601d564c7520a1022005bcf393b1ea8e28ab77e9c875397ffe97d5371522d176aac35a6d265aa2e8c501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff06557a0d24b783f1339d9dc88a560cdb28da19da899a7a6f3738e2271005a3da000000006b483045022100d40ab284ba38f3c1c7bc963b553b159f3cd48e4bd55bfd66bd6b9f006d6738020220167bb085496e7ded07fd684bc34c231ed7c1e09cb82e8fb9ce55976911e9198d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff9c4f69ff49d99c8f5837152bdc6587c5ea520109c902b4ecea3f0a5ff28563db000000006b483045022100991177b62334389985d59361e47405ccd16098e5270369baffd8832d4c99f0db022057317fe00c5248fdc99729eac3ae098b6cd313475a4771c27acd655cfbd57c9701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1e2efea137517876ade6439ece6f5a45d26f59ace30e49123c9b5c750c9c96db000000006b48304502210090ad3f046db47643f3c4a258b3cd2059b2d420c587c09b6ed04b5a78d88260d102202d0c4b7a9df00f463cae3181f03ee33e6f8628af44694e4119538bb2eec66a7401210295cb7399eb91e8dae0f5a909e73d13194df7ffaeafa39336c68d231d7ae6751bffffffff8bcdbf345613514b518aa256727fd0953be93d58a695bd59f6a7ca485ae25ddd000000006b483045022100a49a9759596ff2e1b925bbc27ea9493fcee0a7348cfa4d61bb80542fc9a7508002202af20bc1a6cacc16bbdb60c06e06de7d2102ca9125484c62134e9f6ef34e201d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffca0dafe496b61dccf057eced43e82c25bf304e6c653400a319508ad039bdaedd000000006a4730440220296e87c3b926b544ceaf3ae701e96129d6b4c040ff2100d4444e0ad6c5729a5902203060583dfd984c729eeab99c93b06cddddea84c8684125bd555bda9336e9a98601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffe1104a84a1d1cf46507024291997e5f4e35717716c5b8e28abc3b034a0c1b9de000000006b483045022100f63356fff15e1736e19c9cb2defa347a6568734696a109facbcdeda1ea81e0fc0220365196fd2345fd57f3b7633203368721818c22f9fd65d8d387990b76806b391d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1b2380af9e561eacf8466a019bf627a04b89fc4c0d772486666ade936f501be5000000006b483045022100911b62b496973a44f37c21dfadf92c1b510d830046391edef7c3eb48d22ad2c602205e80b2ddaa1e9ffec0c9f30c9b0b437b5e707d6bf7222422661290a9b1897a1c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffaffaa9da654a14116c0e928be7cbbff6ce6630f36065e5feecc7c5c333d93ee5000000006a473044022044557db07b1c65fbdae930e800ee7e7fdd1544c86f449e96b1b8d6a4f8904b110220242174aa9770887e1025056ef0000fe9e6c62a63b36dab7574e3243a4f2bdfc8012102d6092f49f6bbfc6ba69794e0f1fd34ac10c5a6659d12e329bfc1627481078ce0ffffffff38a31f1c8303335016c0c37db8ba93c9ea0c139bb67ec81677d2e8c571851de6000000006b483045022100fcc101737730f4cd3694761bceb88e3bd019328bc5ee2b0d8da56b8c513e5014022019c933e858b085f43ac329495cae35ba6d3accae33c342e86986945b130ce5e401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff886d46d982cf16ff79ab1ce1bbfee5fc842dffff312cb76c09af692ae371d6ee0000000000ffffffffb828ea08d2f6d96e971ae0fe862d3638e275337d79addc9463f17091137745ef0000000069463043021f3593bef12b52a72715f8e22788073800eada65dd253203d2ed1084d3da8b4c022044a1ba25d8f5d66af9cdea6b65adace6f62807ad9a2f41b56cb87fdfe11c0a9401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0b728004dc3b46580122087b5021c4395a4113bd4694a7fa73ada2001d774ff4000000006a47304402200863cbc5f58a1fb0f9c605afa5022c8842281d0fb5d3fd6515bb4f8bffaca93702203586760c048afe192071c21f46782888a207e0ea0e4ef913e36a7468fea4c87201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff3a3c00d237dc0435f40972bc9deeeafae550d8d7a123c2dbb864794ba873caf5000000006b483045022100e7b769e61a639bdc37aa837e5868e6ed58d0c9a7db54f82ba89ef74554ae473302202524623511d2f1a81155ed9245e8b2509063d595167d53adf40e5fddae27322701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff7927c3f35c3e2986da13baa3cbc7ecefce51de82fd94ced60d1916dc2e3593f9000000006b483045022100c36a2c9b9f070d00005bf0b4b8acc2f5b746360d11fed1d64bbe877cbe95024d022054dae7b2a270c700f4912456ef2be1801b960bd8612df9a98949d7cde759243d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff774dee1c8673c4f9d911191953108f81b1a6767b71805dff83814ba6a0f857fb000000006a47304402207607890f619082f39911f81c7673993a3cc52d11a935c863174581b002d899870220261ae73a555475cdebc8f106f31ad0e388405e4e26787726931419fcbe6068e801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff972ef40f0a5950bbf60d176f6ea48f34bc278b138cf597533904ca990a8da7fe000000006a473044022073df6795be8c9d829f717ffceb884cb778b5fddc2588db12d469194c681eaa90022016a1cdf054c25061b96259d63adc1322109920b8dda53299c0eb175f9ab80ff401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa930447c4462861bcbeb47968d3ea282e402fe34e164b2fd5987a86399db08ff000000006b483045022100bf91ce0fef26e42f6c2e50c17e509f7a81d6e1142fc1044fcba3db92c96bb36f02203613961a91fddfb1b9b7358f89f2b8d4edbb388d5e02836ce587fa807e6bf92b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff02e3040100000000001600145427ba84b7b1392e85757adad586ab3a1954e09ad615fe020000000017a9149383c43595f05137d3ba3d9e6fb95b71bc5dfce48700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002483045022100bc84882a9f1786474943cdfc75e027bcd7909e8d4b45f53c06d1e9e9a04d9a4d02200459c2c9ed4a00c9016a5a158e95d956694e857bee8e36abc4be6e37fde6ebd3012102cf65e48c35f87c354dac7e7141b3e432e42c66a2bd981c6867de67c8bc6bc9a8000000000000000000000002000000000101994432019ca011fbccb2db1e3e9e7f8653dd1bb986b7bd3274b804c992c030100100000000feffffff02c1b659000000000017a914fc24fefb7b3744c71fa4c9b2de2fd36021f10b75871b2f7800000000001600143c1732b48bdae8ec1f0a7d396cc56251d3b1c620024730440220286e13020d2b692798faa4b6d0aa9ac85d015d9d56f5059b530bfe815091582102207fd8037bf29af34306b2a2d14a96f20797e2b9fb469096c6d615d63f4f5084ae0121033430a65b169f0d9288fc4cc743413dac81c723f38ca9530532942a6a93f8154849a00a0002000000000101f5bd878dccc7ec5dc6877df1b1672fcbdc59419e0815e963f763108cdaf681bf0100000000ffffffff02a1322f0000000000160014d0dd86e4c6eb602e171b09fe18aa814b5817c30d2c8d3a0100000000160014861ea6d71609f458a64640b5cdff7bdc95ecc7e20247304402200bc44bd1418898308b97465802e372c1b70ed423e5c8c31dc8457aefc61641ec02203a162f987996a966469be4a843a60cfaaea5e43fa5dd2701b7e8e65a8c6eea9f01210317b2f403dc84f2627303b59e57d1b119ab9f0696f041c6138d41088c82a95df800000000020000000001019b2e5771b4ea958795af820f2852899addfe09c4b6e329a24f5c5279d593c1d30100000000ffffffff02e03f040000000000160014b7087ca8b8fa219a2d708be83c4e95e5cb2dc0268046360100000000160014d8ebc286e7d0c07e2fe9e841125e463c51b3389f02473044022042a862cc4d14bffc350e261a720a929f7e1160ae6ca45f4683684aadd60660e30220488b35cb6c3e0bb982e14f3f54fc83f26cb4856278e02bc3c7c04fbe2fb7fa72012102f255b2d1aeb3916462b3a636212cfa5401bc2252e8978d34afeff3ecd919f4680000000002000000000101b290c5d0e7c1256e5aeed001ae848b441b9d8f8bb122175bdb187afd87a0dead5600000000ffffffff0135420700000000001976a914d2af8d07f05d189706aedd7203339873010aaf3688ac02473044022039ca3d2d21e582c80b7667fb1e63fab5cc614391f4d3315b7d2d541b45833d740220675ec6830a9e373008ab2706e17a6509ba6c239b903a3aff25b28164b05e7198012103d76e03fbaff5761dbe9679531723e19cd7ced1e78e2c028d192e17aaf43075f200000000020000000001016141cc0920308f556ab0f9579692bcb120f939116ecea7cb4322e8e2a1fbd80f0100000000ffffffff021ed81000000000001976a9140b78b9d905c7bd9efdabb2d5944f4d83760e211088acae4029000000000016001442fbfe2307904e1a28ef9717a6d6e7e3d1612e570247304402204e27fbd33c17e34815f64684d679fc571582e19038a5cd95095de5d9cba866a7022047c794f526ffeb85a62a061bc7b3ee272745aa57e8fd5b11577d37a65ff6cdf90121022fc9806bb56d4c65ee88f27537f211de518206b3dd40f50d8af616a71778c8bc000000000200000000010170be73a1cbc4d9ad8cb158462f09fd4b4f4e2cc462584727c35a0ce2459145ba0500000000ffffffff0280b14f01000000001976a914e7395794248f65091e6d6a7eba55a958de6f192288ac80c90803000000001600149ab97e62f62baf06cdc39a451f6aa1020726280e02473044022048012c4e978f6a3d4a4ef8fb4b3a444c8ce19682956588858b277db7c20c1a80022016d5685372c095afff105e08363d47b2989b58924c1aba03faffaaeef178ac3e0121032bc32e814a2a8ce4613e62e65c00b3a76f476558fb8e3e5f6b102054129160af00000000020000000001012d43b488dd16d4309574d40eef8ecdb5a0f19d10d6a06564d4bde4f602aa6fbf0100000000ffffffff02a6331200000000001976a914fd7b78f8304d19730e65118edb065a8c6fe979b388ac904200000000000016001432cc4472d5a85279edfb85085a2a4359d4246930024730440220785ddd4ac6884830bd10511d11e973f9d6b71405eb455df1d00c02634e835ea202200e39b1d80afd97a1ec473e8a3e3b8bf023f78b7103c167961d0588a3c63ffac301210392411c4ed8df7d1436ef383e483fc5c82513edae957b6b209de70ecbdbb77da5000000000200000000010191467c516c4e8a15943119b03f41bbe27e5cf70d18f01c616d471edcb4ca0e0e5300000000ffffffff022b811200000000001976a91419619223c986629e518def4f6de93d9a38df50bd88ac2aec0d000000000016001478113e34288d131ee0ed0eacb0761d8fd42c116a0247304402201966d54c6b4ddb82b7bc605e26925a321742b5e3bdee1cb7b174dd0e637716ef022000c170d408dc6888303c01312af351aa0208a76225c1b009ebc1354285c575250121027e0038b769cdada1c1605124155859397ce3cad0f8a3e7c538c2777d59e92a41000000000200000000010138c190a543a43ed2f0fd08e6ec67be34a1dac0e8436a9f833d8790191dcc8a390100000000ffffffff02de5e0000000000001976a9144f58a9976fa84a00e788519c0eb05499863d2e7f88ac9674000000000000160014f28f5191d6debd58f67bd906fd41a4835721957e0247304402207f6dfea4954a17c848ccd8ac761470f8eeda21d6548ef15b7e917ecbb6a81edd02207dec1a4face7ed7090409381353389641170f3a843a10386c47de546e73ad6d80121035fbeef718692e2739a3b60414cbecde4bd7a5ed6f66431f0eb29c69d327b28860000000002000000000101e920d2a3f8072e4cab2437a954b5167cd1aaef7edab985d8a588bfea3968f5021200000000ffffffff02a606000000000000160014f2f03ee186e68eb53becfcc1a74337a1854557a5b5d10100000000001976a9149b7705d827fdf6affca51e0c42eb0b71aa2ee41a88ac02483045022100f5b568092222c8b63f4f5a26c866607061280641ffc65c41ead802218af2f429022026d30baddbd55fbf3a0c827186e8e40ab75eda6a3d01c33b397af0e47e43a9620121029db9d1b196f1919910270a1e2ae13821d25d74058758d87162fe9b86830d41450000000002000000000101af340131a08464942404ecb7f03839539552977c9ec1ef972d5a5b97b3ec13e30100000000ffffffff02752d0100000000001976a914974b3073f1b811fd7a202f15e1a42ffdbfc3174d88ac7755000000000000160014e3efa8b286e5dabba94594b403cae4ad5133bc16024830450221008848165e872e86bdfec5ad205e6c6546674d30f88b0cde01ab836f73b1562a4a0220262da2d5423a7aebe2def90bd9a8265fc70024fd38d4e06e3a12c948389481b7012102f194eedebd42c0c8b555200528ee677e980c39f3b30fd051d1bc4ed5b10bade7000000000200000000010123b63570d65a0f3b2eb454594d50a9308d30e9ef64acea9a12fb3093bf9353b40100000000ffffffff02745fdc00000000001976a914de17eb7012a83cb3b3852a89fdc7c4825a1ddd2688ac38e02e01000000001600143277bdccb6a5fcd1e2b591ab56391bf0166a1b8502483045022100e3f7bc7a50adfdfc949844401324bb4f1dd98d5d24997c57223e423729d25922022048ce17599c2d14d8356d5fc412ec9e41b5acebda4fec46121604f78c5e9b6ef30121025977649f84574c6e8a83ae08ff7838c2b73a2605e391d02440897dd45c478351000000000200000000010163bac4aba5104ef319eaee31e75ef9b5beb67750854a88b53a302a48910f3ce10100000000ffffffff021f2b000000000000160014d6fa6802a486e48f42014599916b2a88a5f6923184f33e0000000000160014e0f92bd0ab11dbb0394d28fe66aaf10a62d762b602483045022100d7426abddddd3cfc827852b26bf234cea7d098303c585f76abadd2d99fff87cb0220645c9af6bf5a9f4a4f5b78deef225a33481193d7ebf584bb4435822e739c0293012103253cd0e53d9107ab875828cd949176fcfae46c4c3422cf1a19753e85cb104d0000000000020000000001012f83a107d3d97827cf7c734c7a7d0df92df49a2377fc7d9b9cfab4948201befc0100000000ffffffff0233453900000000001976a9144bc94aaa0d73e46c994bb49fd4bd2899eb92119288acc4a7050000000000160014e0f92bd0ab11dbb0394d28fe66aaf10a62d762b602473044022076e30d8ea0b5b5924ca1e126c683a2e5a427bc64990c4ed4bbe977a33e0caf160220703604b3581e5e07937d9608206488794926ff3284dd5a2295e40669619b7d2c01210373fb22a984642f73c0cbd8cc3ab3f2354e75e93bb7f5493cb6d794ca6c17be36000000000200000000010139266951cfaf52dcff93057fc15df99d8c53a104df3a9f48800492b41e5c37f40700000000ffffffff02b8c600000000000017a9140b1378816daedb0d461c56d575584074082cafab8752300a0000000000160014ab838fbda24bb560a98a5f33570243100b3ad0f002483045022100b46ad7089f2ea6fd71ad3da7a2f9608791e0d60e71648f13a61b77539932241502201d803fa583b268ecee3c776878637f380ef3aa73a1e50cb0bf8a5e3ba155352b012103c650223e39eb8f20ba1ab6ebf531112c79724cade7abb364b6126d77af499f3c0000000002000000000101e1a834ec36eea6e1c63ee259d960a787735626dbe2f93c60983dd2f4cac3d4ce0100000000ffffffff027d6300000000000017a914aad6102c5c961cb6a2a3ac509d9cccb0077c4cdf87da9c00000000000016001467400c3f55bcbaaeec2222537000427025b8e9fb02483045022100c1449c61601f21c799ca9bba84006c29318659c00259c15fbe50c1a856a8d5ea02204704a07c1916e9fc8c606a656987e3019564a04b032a82f1b8a94d5238a7d9d6012103a0ef06909b7aef3cab1feb941437996513b269ac8fc6795cec554d06508fad3700000000010000000001020d1d28093b97029426e9be136dd20a6c8c2ced830f85509b4fa705020bf8eb5f0000000000fffffffffb0830c16edf4614931f815d0328856da7202d9b838e429eb56870cc3574c26e0000000000ffffffff0480f0fa020000000016001420b077c84c52844d52b2c507a211045bbc20295b80f0fa020000000016001424cae736acada632ec8e9b9d2cd902e6330c887b566c3806000000001600145417c573accd9653753ec67237b4e1f58203fe2f4847120700000000160014a4a7fa5c45d8640f9a22c78f5eb656dc1c8017a00247304402201c30d9b9b41a8230823c458fbcffc3720268e54e7c24bda7935e403aa1ea35d20220158da28f7758f0c7036fea9e9fe57bf7dd1efded2123e8ccde89324e040d7eb0012102fa463f5ee2f31801a92a1afdde5221cd1af6ee194eb72dd01306b57b9347f40702483045022100bcb421e4e0a51a01987fbb036cc41de61b1d1e65f737756e18b0993a21da2a1b02207f6fe250f8bb0c020bd47cd97cc44ae22263e47edb81f8e90597ac179240138e012102125cdfcbd1657796e3d6bd25c222980e1b9996fb12a4eddea1e2a5338b6e43700000000002000000000101ef47227285ed59a97bfe762a541f9f3137f0d692c5eedef8a5fe53c7fd0342bd0100000000ffffffff025bc6000000000000160014d72a4405d9c9e03de05b225c619afd61bf41b32cb64c0d0000000000160014a812572dc895126c1bb5a69f9042e31b19cbe09402473044022055c59bf497c91898added999446fe134d22c06bdd487d50a7d9164ffcfd24af4022045c0892267a7acc3505f58e2ddb1d7a911d052852ed89fd4041b3ac3d93c7472012103ebd31611696db5e1e3ce08002211e7351600e4fa2537cb493f70ce11370159fa000000000200000001268631a21df66ec9c8d55b6e14c295894a189dde2525195db7611216fd05a0c6000000008b483045022100d202240279302cc1263ac09a4ea42481e8a3a6c9c85dc6358c75a9d13cde66930220407d966a5d5d4d9ad968c80cfdd4d5b1a49edef458ac4fe91ebdde096ab71c27014104828bc2a8cca438b0a33ad2d0b2fea3aa3fef76f05ac84dc3e84542ecd23082803acf97f4c290422e5cbe8189f4ac2f722265e3819e842a087aaf23acb041b968ffffffff013dd302000000000017a914c1cfb303bd42b695ce3da538fdaea0aedd3f739687000000000100000000010161123d8cdd0fba745398c379f2e59406a13fad3e6adfb1c84721b983406d46f800000000171600144b82cd1a923cc0968557f5b6127ffb47687827ffffffffff01bbea00000000000017a9149bb7a7f46bd350519ce2f5a1f808fb6f6f82355c870247304402207408cb50311a94b9e80d59e14addecc0832a25b8bf97c879faffd737b5464424022010ca1e9ec8e2836df4383115e0d7919cdc1b7229f76ad8b1b05a0ff48ffe6ec0012102dfcacea9de2e61871f7a76625df28f819599de080bc255cc43bbeb2536326af60000000001000000000107cf2d2ca1f50624e619138dc83ba09489ed025409dd8c671cbc1a7c6cfbbcbe1b0100000000ffffffff1398dee890173357ce89e318b836ed3ab5914812fd66735fe83ad228fa6c98350400000000ffffffff52f470ee46ff863453b46463eca08a036d386366460217fb15edd57879ecc8420100000000ffffffffcc247b21c78965b094880c8e327ece5fe63e1ce3556028ce3051dcd7f54c95d20400000000ffffffff3291a38769c8ec310a130e1440ed4e134b7a7a7154ad5d9de4564d18217127dd0300000000ffffffff672c617fab601b261104210fc0d98c6e4ccb03f0899659b7bc04c96d56732cef0200000000ffffffff581dd4e29e8b7aa430404dca6731c4b06b4cfb159cec1694aab4fcecb5a9b6fa0200000000ffffffff02fdf400000000000016001455c5be228607e8930e10825cc12604ab568ca4970d904000000000001976a914ad7eed4114e43ed9302014dd1d9329b3c41c682588ac02473044022051224aa13ed5f76532520098dbb4dd19796fde41a1a5e37130c4dce0fac73696022076133420c1f46c6204567ab0cf1ab2f9b05d8f5e42e920560f1fdee6bb0a920b0121035afd758749c9cda6a28bf3f9ac8e2af09a626855d2b1b00a38a8bfbd14a5d94302473044022058a1f326d665f115655cdaeb17b69c3831accc73fa8a62f047011b76f92d228c022030824d26f184f3f88fdf320c0bf1e6ebd2ba5a3eee470e4a98c067a4f2c96b5c0121020d742f2f4dff7dc66285f7d41a94b6ac846eebd6798a2a2154257e1a845c0e1c0247304402200aba4f5abb652b7c471c8aa97a9be4b6525c5613c66c392aca18ee4fa42af7a9022067e8d8b14cd305e82debe5461b0b1370a46432c419d97fec292b0b05a3d927030121036b610d3b016c29627404003921392eec77542969a652bcda5a7f4258a403974b02483045022100a13c0abaab303588cf19dc310ace8c1d67af5c489b50c47eedb8fd7813c86096022068862791a24cec770361da4463aaeb6cec2ab39ae26c2eb67317f8ab396a56b101210355362b2091eea9df4258cd2099d9348ceecdb7c9c424949211baac3f5b62c86402483045022100c4bd76450d91ed5bf782e12ef0bb22c5cd5d3c765697b386963712e4174f99e2022033d236485bcd237c25202104a47a68626389656636f494151d9b8a5a11ca75f90121031be0534d850b99355f3603675bd4b2e1135a442fa21db174277eeb81fa4a6a2602483045022100b75681545096f80fde79a14f8d805ba18a8abc80bd265d449641d093f9ea89ad0220204a0af6519678d4b8d651266af28d092baba30905bfa6bdde5c072209965423012102edb68e6af02015029e4a6e28d3a9ee7a292ddb0912cb9204b5104fa948e1a36e02483045022100cf8e890d71fc0d1c9125ec93fb24ac69ddca97093ca1332a317df4755a03315102205f0592ef15f09124a2041d1714d6812b310951f40bca73e9f28d7c4a95daf8320121020c3cf32df8a6b1a8715afaf2a57b104425b8317361bf6e41fe5cc815da52229f0000000001000000000101671b8f8582a40172a22ad58b092f24229435271f8a9d1a3b068a6a65086287c4000000001716001479a961c8cb3930c7c23535c09c1580672a17112fffffffff024c1d0000000000001600143c9472e75c9bd670fa336e4aa16fc46a6326d25c01b802000000000017a9145726c7991e0a55bf46ab38e3c56b88083524cf168702473044022054466acd14da6d4ee8c20166cad179fb5fca7fe7b4fe0f67f99dfb6871bb0c6f022019169378f4a2d92c4279a6e099ce750918a2aa021d7858105cab87a3c7c6dfec012102d24467510484d20afb4c4ad60b95919dc0b9243d05d11a56ca9d8adfe039f58b00000000020000000001048689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd010000001716001416933edb785079d43d60fedaecb6e7fe4d8d3c38fdffffff158adf41f0de35368e5270eedd29d91f3dff5fdf50f1e639e5c99bed8c0e597c00000000171600140948b0e3f3f9f2936836b0eefe35c2d153b714e4fdffffffa6032a7e01f6c17f4949668474ea298b71c521a4dc351ee58b711065acae7821010000001716001452c4c12fbc7a6b3a22997cfff83964349d56b93ffdffffffcc704585a43ce16b4551db1505b8acf176119ecabe04f03b3afca54bc90758ed1200000017160014e8db5a99b6f5d0c99c3bcd0f6729801958ac8623fdffffff0180f0fa0200000000220020de4d50417fe2d1cbb4e056261ae4decc7856aa8cbe5458b00bb272da7d157db502473044022028bd2141f8044455a81ca54855d8015ea901bdc07cdd3041207ae71c9e28f7e2022009c4d8a40d9251e02c7413631104042bbf5ad0703d46c0d1eb1701b6c8b6d90b01210338e4ddb2a24c77fa239db348fbd9f70479dd9e131fef704d82ae725d87928f9302473044022041d2254a5a3c8a734c03e1dc3fdb74fe641bc021e83076d1648bd8d74a65bf2002203ccf7bf4e72b28ce10593500cfb153b42178cfa1ee418f766682ba639cad59eb0121033329f28e491dfa2537b49b88cad4ba5cf70a6e3e42e4c0d801af3d2615c7775d02473044022038ee6bff631fe9689814f6a7e9e15b29755b86cd45f0bf4c65d08e4d5e87f3990220743883309f50f7a717f722c508a72eda95d26a0ef0f09801b457acb848fd3723012102c7d3c1a80059828d3c284258948d0c7fd9966205dc2ba33ed5941ff4da52a005024730440220646986bb07a96e6afac72e22a4419799a6a33dbc9e5847f89273b5c4aa3b2a7e02207906c182945823778e61a977abc5ab9641a3ef2137386c4dfc679c31f9e4057201210243d127313b8a9b0df6a29227770b7448537acf6e0b84f86649a9ea7e02d32d7749a00a000100000002e1a38166829b7c470b534fcbed3367585a332dfcbe94f860263efc1c7734c4cb2c0000006b483045022100f086baaa02c54469dcb5c76000f4c205e08b8178e19bfa31be23a8a5f33553a80220516be43f22a688d0602bd605efe3f5a292144e1a9ff2b522cb9a214e641108dc012103af283a771b9cfeb00bdf078e6810563ec0f685357018c7c8f9fde299b3dffd28ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa487190000006b4830450221009f3e4df373cb7825b25385b63e2cdc339db91c33a35dd3764a29a312899b46cd0220090aa7ec7bf49c9baa47237912e6aae6ace735f3e27701abb46c890bb15e52d0012103af283a771b9cfeb00bdf078e6810563ec0f685357018c7c8f9fde299b3dffd28ffffffff025de42b00000000001976a914e62779048d048edff5310bddf5446a440c4bdb9788ac21090000000000001976a914962fa4233d8b6b3ab89f52c684b1e9ba35ab0db288ac000000000100000000010153ec4fe24b36f94ddf7d6f6793c408d67a0a1c326606cdfe5f8b7028c665661001000000171600143e030a6ac7b5097e794f55b7a38f1981478b62faffffffff02ce44000000000000160014d06a137b57044d0a77c8f1f6df8bd3400b28ea0c346c0600000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac02483045022100b112a8a3b38fb3503ac26ed11ba76f96bf0e495871df90d544c9fb199f163c7d0220692f471afe12d1bb4a9d70d6b480c0cfc54ba13e25db1d53d3050f78e19c007a01210372fdee2d4da660a9c1912ea5b0e072a391f8e6ad9902caf6f6c63ce5832954c30000000001000000000101eb59ec1d3426c514ddd27dbdb2cf6ef56ad77713cffcdb13b85915193a9a82611c00000017160014ca15d508616a1edf0ecb8b2f46a41e6725fa457bffffffff02b52600000000000016001453ef254c3ea3248f114d828e5732df4a1a79432ec1990300000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac0247304402206420247dab79250e2c4a30b82eb735f0ba48abb0dfda471ebe9b91abccfab9ce02201e6e25b48cd6d006207fb8c3a6a0f14737ca7a414320a24e038b320a4528ef1001210379dd4c17af8fccd6b2bf4dcd6ee3d9a923e9ab7e0033559f7635c457dd48b85b0000000001000000000101df67b836f81087b6e85a16c40346f2cb17252d10f2b103937886b7daf8db23fb0000000017160014bdb1ca8fcf4285668021523d6f9ae73783d43ec1ffffffff02d15f000000000000160014ce8ae4364e24d06b5df667b97066b64acf5a3f2b82f40800000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac02483045022100a6ceb98f5cef206f9e0c068e46b4b8afdb5aabee49ee187f1004d674f240e5740220206235c2bdf97c509257b7797c2576ac8941f7441468d4d11052932bd3c7dd1f01210367ef2dcede2c65cdb3b5fc1bdc8b2932878ef4e5ae95f6667d25c5ea1e2e9e540000000001000000000101909c0e1fff1fed4f200e22ac002ed67a3c3ed2d3b5632a11a2ed7469770155140100000017160014615e6e4d4eaa2bea9f60a276f48c50a84a2d0fe4ffffffff026b32000000000000160014ba591b7a1f48304a0970d85703a283db1d98d27fdeb20400000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac0247304402202249efb70788c18e6eb7c198f15b413fe4bb4f8fffca760e220c52c41194f43702202e86e16989c972e982ac92bc3c1f94966884be9759c69696795ce0448bb2364001210333a18a7fc86e8642d9a17bff3eedd249b4c561edc78b51808aa3caa3581859c10000000001000000000101573399ba3f5bba40b374fea9194d0820cbf5ec6e61f9bbc4fbde5b0686c8361f010000001716001485d0a8c4800d630c4ed55e081e542e6da8b841e3ffffffff02fc3700000000000016001453ef254c3ea3248f114d828e5732df4a1a79432e85380500000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac02483045022100fe206ec993a396a3641a1721b81bfe36cbb7d71e31774e05478349d28fc64ff202202a68e01a5cca96671ee882bc1b43b69bdef80963fbbe3065e531f715d41825ba012102f02c6c2640e9dbbd885a6a9b1ba6045488183608b56fe543c04dff2e221d1330000000000200000000010180d8e651a4ac23f0c58ebbcb507d6ed0cf61e95d48515c1215f705973c51268a0000000017160014fc78bcffa8c8d6d7dcf389b4360455af1994033500000000045897150000000000160014b1e2860092208fb75a1ef2972696405b40c5ab01d4b301000000000017a914050591e5f058fd983e2a7be51bf354011872c96e87a0b70400000000001600143a30c3e564893aaab5b5120fab170abfff951a5a80362b0000000000160014e646a2919fccf8cad8e7ebc10152902ee4a76c770247304402200f57ad457fab7a299a11d02a867673576ce3dfe7e720db66cb351bc66055ba8a02202108b2d0080054ada3fff2e6eceae276eff6624df3c53d301a9c27e11c40a463012102f772a41a8ef56c0ca996276084b222a6ce5601e89c7554dea9d101dbb38a366500000000020000000001034bf092cfaed46303056e2988b1afd1c9d8eb2094703974693a263538bade6c500000000000ffffffffcaf46603bfd02b095f8e929533d2be32db3e44110aee36f656c4c4f55aba6f800300000000ffffffff52ca24eed31ebd2541f95ef32b5aa39117b9d2d6e26be17fefb461b27ee72c810000000000ffffffff024e49000000000000160014d52039c29277a5afe3b41b0a58e9cf06b330bc05c84f10000000000017a9142cc3bedf1263b1b6b9fe0df986d1b1d493610fff8702473044022011edb4ea6a028823abe612ae89e88f76d82cd063ae80991278ee76bdc3b4c88b0220799d041f9608d98c278317d79d45251d40f28eff27629ea6bc07fa5b1def5853012103ee901a98d0bb7bcdd3688205ac4c947d08055c95ec257adbeae0ca5c62c3fe1f024830450221009b50965b17ff208febfc1cdaae4f8021adc343d538e42b2c49ff1ec2b7f4cbbd0220602aa6105a66354837ac59c3a429e1a8d7059b4d887f248b017eb9151b678e65012103a12b363919f85186aecebc2f85a48fa8c1bb94207e27e9659c4954069bf8dfe00247304402207db7ca9f918e7a2a60a65c63c703be5c979820aaadf53a62cbddcb98cef6606302205b617a4e0c07271a0fb7fe61f196ad54065aa1030a24a2a022b86b0951e4874e0121027567f010049687a24958ad71d61ba84346014db7664cbde43e1f82fec0d940120000000001000000000101e01b4000fe93973f9efed30def9a5828280b8458d4bc0979237832385f8325a20100000000ffffffff0170062000000000001976a914dc0b71f6f8c088c2d20e5a8a6d3a2a2cef14d30188ac02483045022100c1300e4630092f519ca5a85dfd2a15a14a6da41c55a0da9cfb2de24e741873c602207899a5b3c0bdf869e2accd63a45c1f1c0de6cccd1d45e56bfcf12b1f9e3366f501210343915cb3bb4db2078858c809acec7b1a385a636e137cf9f57d1d14bd361712ea00000000020000000001011cdac71b7e336ec7c0eb738436f9d4b1783a1b08966b5d7cce096fcbbf3a0da90100000000ffffffff029af40200000000001976a91475cfb149f6e3a70b9b3d5d971efaa700aaffa4d488acfd9f3300000000001600148de8bdad32b64325ec9043f6a6444d2fe375075a0248304502210086a3d1a2e90c88b879b5d30eba96b74cae5465d7c1ed4d195dd8e5039572e7b302200a7a1018f58333aec8b907725ef9edc1ca6d073efdffab7ce7298ff728dd815a01210245697f3344228845c3dc337c2bb3fdb1cc9f304847ab8f431c832cd4e172cb540000000002000000000101da4798184f4d00c5809afee454d9febf4cdf30f2b965f07cc44b6d3c7ed4feaa0100000000ffffffff02af3e01000000000017a91466562404652e1f30ef106ef589d41c38fe137a4487725a320000000000160014998f617f532e1912b89846eee0e95bd62518feec0247304402206ae4d311325a17fec669b83857ab927bbcd5628b075c3039dd121f0e012a7fdf02202d41aa6fe5162646e3c5c2f7dea863b18ea4c339c96db3ad9f15661a92ce8856012102f52721bcb64843cbdb8d5b516ea562e964c5a4f720ab0e1cc7fc8d47699902f800000000020000000001010ad6f6a5a764bd2e18db743171a5ebec4b32c0a0b70af5405b2d4f9a3c97ac1e0100000000ffffffff02beec0a0000000000160014dc275c0524887a62376d512545733de4ce259c46b8662700000000001976a91431737df01ada2cd63008797d0c83da6cb2ee80be88ac024730440220032fcfd0713ee536971ee12d0eab3ce8bf709e276720381054bbabe8678b2a2102201b5c86ac7ef6713a82b7ceb6cc8f25e8611d45ed20c8ab8f5b314c0c79e1bc7e012103bb8314f0b0efedef4ba68edf2f521f6b6b00a69d1da26d7efa32e8dfdd9ef1ca00000000020000000001017fed2ff1d6cc7bfd60f9538ae2f64a22f41d9a01a943e4f89cc66502424d35ae0100000000fdffffff0268f100000000000016001488503f0a189fd559073f1c07041e957477457d12940b01000000000017a9142003ca9d370b2110e946bb7dba74197b03bca04987024730440220686e459003a8a93a601a7f970cc383a36f88370a36423a2660b6cb11b368e1b102203e7a9f2e3e0709284152b3702d2d9c735ff79bc37ed567bdc6e71a61d79c15fd0121023c2de31bad9e21cf08d436bf1a97f72e161ea4c89f37e04c1703d7cfea38da3214a00a00010000000001c8badc6d4c53606b8d01c7535a363e477157c9015db6bf3f8626322589cad16e030000000023220020d628ad784793aa090098dcff3875063432f768964efb2ac892c0b1a395fd4a96ffffffff626cba9be6abe8e9972329cf29cacf3a238a3a2d50a72883adf7e08891b79903040000002322002074b69b42a0047641f6239011e0d5fa9e2822985eede39e8681412264dcf7fb16ffffffff85af445edc69ef91f64a7ed82638ccf00da502480f3367bf4f7aa910d10706040300000023220020dce107e68b5f05be07cf0d40c848a2a5d99247ee1614de472d820afa1f9a3958ffffffff85af445edc69ef91f64a7ed82638ccf00da502480f3367bf4f7aa910d10706040400000023220020b267c534e0ddd5ff0bc13c772691f39ede4e689eea661cb5c3e654380bffdd0fffffffff85af445edc69ef91f64a7ed82638ccf00da502480f3367bf4f7aa910d10706041a000000232200204e48672036e8e16c7a158262c47ae048a9468b8fbdb6905013d3f35a2aeea2e6ffffffff5ff02b367384db28a0df8a584f6af70a051bb3048a10e3652417e02dee3b83040000000023220020bb2e5e205b2e2112e21344bbe35d170366a1ddd017de279787b41115702cf915ffffffff0e8a247b8461b91a34e43cc610bcdcbb9a3225edbf5219ee8c1bf61cd80a22050800000023220020b2c4bcb542e98a3173429c2d709c5f8375d968c25366dfe56770940fb796a40cffffffff062e5484680d97801a1e75a92f18ca6dc8c90d1bb136f079100d0576190e4c062a000000232200200e6b475ca600636fa2160f90aafac87f1f1a95f7d8629c73768f89d24921e30affffffffc6eb1e86fb1bfe9ad4297acefe0482f28072aea477b1af12313eed5abe75b90613000000232200203288c69012db393d2824b1ff095e8de17566e5d155cdaf45cf9eb7380c48258fffffffff03b768279190108eed15a782494c15c3bf49f815f6e75bf7027f9a62a9eaa10704000000232200203dd809e9d792d923d78190f5faf0b7655f990a630789c1ae1f6f281acefcd3adffffffff7bf5df84dafd4253f2484071ab954e1e72be67bbf912ad5cdad92936a589ca0800000000232200207a35711ce874191097d276c8759eb1355d9a266e3b656e953c2290b337c2c46bffffffffec90e882ed3981cfeb3ed31919df02ccda1c7f319de70b6f053283467ed4160b000000002322002010ddca58e2d186f90c705ebcd038c9c20125bff69e6309634f4aef57e98c7362ffffffff6838f4a5dd017c09cad320e63dcf6515a6f26271af09607736acf548e720670b0100000023220020e488e22e7639627c991a813d8dd7d3f983cee81f7c04ff00f741de9dd5e63e35ffffffff0a1c0a93e3e219e8aed4beb5387523f320a31e0535d01415f69600c61220190f19000000232200208ffb7e645baf1c2156574cefe06ba432fdfe6609409ce78581adbce2e11b2f11ffffffff57d186fa9ed52033dae7d10b1b114a4680f9e74bf4fe7dc4e7d3562ee5f47d0f05000000232200204da612874fb933d62370810f816cfb04cc61820845626916ab876a9d8c200146ffffffff57d186fa9ed52033dae7d10b1b114a4680f9e74bf4fe7dc4e7d3562ee5f47d0f0f0000002322002086ad61c4e918328b86d4b47ecb6c818c5b6bd263e25e15fa7293e1d790d47bb0ffffffff57d186fa9ed52033dae7d10b1b114a4680f9e74bf4fe7dc4e7d3562ee5f47d0f1a00000023220020b9c7749e6112f240413dca949f74ebf1c930085778b2b182e1ddb5ece2423f12ffffffff6a45af731f93a8731a40fae5a1dfcbeab692ba7756d9b73191091e6e291b53100800000023220020c85cd5d30da53c6c3c7a5a6faf0767bfc7a57654941cf7d9ad912d1dd42acd92ffffffff9d3cb06bf46aef51509bfcd1b636a569b5c611cd0794dce553c5c4f12b6f3d112400000023220020618e7bc8a1c8554a64004ac26ebcec6fa00ce539060a7a694c28ab129f1cea2dffffffff1c09e2bafefbeb6d2861247aa34d8879da1bfd37326121a6be78a953df427611000000002322002095cbb0fb8a600cddfbb0afd696dbe0bd8c2ce47cf8a05e95701b684d9666c2bdffffffffd471eda88f2b3e465f14ceab0bec7c4dbeea1b0808f7f8aff6f29cd81390bb110000000023220020078b8712dbaf7819efba70cf8dbb39d734a06bacbb9085154b381ed950efbaf7ffffffffba88bfe0516fbcaaf69f3e97e2c873dd23e1dfd0700fd1c05c5dda8aed0ee2133d00000023220020744495bbb3209631a7d50230d335957b51b4518d134b500d1e76da36dfd8d099fffffffff3218490c77219440a89d4ad03c89bfc0d6795d215ebe70c6cb0fae9261b33140100000023220020032cb031a1a2c8301ea1f0ccafaf20a6a0da05d7155e8091f901d9609098cbc4fffffffff3218490c77219440a89d4ad03c89bfc0d6795d215ebe70c6cb0fae9261b33140b000000232200206d80e9c0630800825ffd996eaa60ebecb2a2e8539cb29d6995959d3b30126683fffffffff4abab1ea257c7e70482c17b98975b4c9a1ce80560980994acc5c52549abc11600000000232200206732d532be4f9d356063ffb0340b0f4244d765de7ed1200beab4182fd44c9e53ffffffff65da57531dc24b013ced39ab427b491b8435642b1a3f6270b8ca7be9584ed1180000000023220020de6de07732715195eb126e0dbc0d7f45e5eb0967f851f7e60537b44f55ff9738ffffffff109354616086c9fe36e8cc325ee07b14c912b5f9bae13467590405740425da182800000023220020663b8769500a40cd47543efba4d4fb9d2b326d9ebaa09fd2de24e0470703a41fffffffff22e843555dc3018e9cfa561481f3784c7407053706ce8a104730a23cbe1e38190300000023220020c396fedebf038aeb222c582ed2e8d2a6811a8d3d0965e50c37a701c9706be24fffffffffaefa95eaab634fc33e528adc72a4db7cf01667c0f2a15be768b252a3528256190000000023220020b42f9ac3cab96ce5b778508c384c906ae01e4e358c5450116f196afd0a901993ffffffff33a4817a69b43cbfad672b87ed60719122397ffc773cd72774bf9a9db166aa1900000000232200203a8e161f1fc7979778fd451599069699ba4f7a912270d35e8a7ce9cd06516fadffffffffa039759ec904921c5da37ba339519cc2d80434e3552fd57f413d825f6d2a6e1a0000000023220020dbeb70e3342c7e00d9b41a3495cf5e00cda4122464e0397d56294971beabcd5fffffffff65a2ac48a44fd49f287d5e6ac2f7682f5e38013a8ff30d505d0d7611e59b0e1c000000002322002086b0945975746cdfc4997ca3536627c8e7454d44963d3e9431516a2e8f296c0cffffffff52f06d3f603378d81fc69bb59f1f6cb9a9c620c75b8feda545c8adcab205131c00000000232200201afa59b993dbc61b0bf45eaf8158080c9b83cbb9916143d93e57e2241fb4fb6fffffffff7a9eb31f95e78d942a4663411af93b020ff79359b9bd6c768327881862c7f11d0000000023220020e5532acb2d8a48f619ee11e710c9146757542959a2c2391a225c7ea8a1b38635ffffffff66d718d9c615bf1cd94bc15e3fb8d01582c1f5da0d2192c0bd05e781d55a761e00000000232200201790bcdca0713cfef5e0bb132fe45fe25194c744c99a5e1137172bec51b15ac0ffffffffbcc6f463a0244fac7ac53cc24b86f6dfb053f31aa52a3611f8b4e46a5f880d1f05000000232200206b3990192d9f374b0b83e0fe1b1455d12cfc411947109b07d64b25e145e3ab74ffffffff3344007f817278f2ec6217de7f9af871325109e01e67d6c09a549e3b8b44521f0900000023220020767a8adbebc056d53a29619aee4eab8516829081aba56892afd6aa884b7001b6ffffffff26911986e62eeb5346c8178207e166f82e2ae4b5159fe6d0d079551bdd12542001000000232200208a972441f5c5a8d1832dc7f171965bb3f9d760417d5d7f40266a69324be01839ffffffff350e125768d1a193e6c53d7292ec2740027bbfffae694b0d2861d0ccc1cf172124000000232200203ab99a1e160626bc7726f0db7e4c64e6e22228243275b53624bf574ad3243209ffffffffa1828941692eddc8d44374da8dd8c22af56c0b7cf3fac61810a23417ac664821210000002322002005f4c5973b66d1a831a3cc6ef01c32c5f5121065941d52a75859238d283ab631ffffffff77767790afe7a60113ee7e4d32f2d6288ad75e10d4fb7a76c2705d458d4060210000000023220020d0f05ee9e40dcf06b6398491403dd607a1b52f0e32e31f613dc2bd2135873e4dffffffff3612f8023c74d0b54b831ac63fc6991a97f3e2ae5e4202181b3fecd0afdd5b221700000023220020d5c8bc24bd207c59fb2071820e07b8491f5a9ecbe1b481c77cdb2940ed3aff24ffffffff8079ef2923eda9dc1b92ba52467999e5b170223087f70a47c20ee83fdc7774232f0000002322002090aedbdaa66ecf7a52da5d9949f284c233533e9203e2b83efd35705ef64db00dffffffff71ea5078616219d12243e2818115d9945557b4329bdd359df939843201c67c234400000023220020a9117ee5d0bbcd50ed78f09f89ef057e7da9bfe9f9bb1bcf73397b5ff292ee82ffffffffe17be4927a761fb34f2ba4fae0a90d6c3ad47a2356fcbd2d3d1a3423b622e225000000002322002050e7d98bafa646598096b3e7349d2831a2d805d4ede0893031267b38a48ceb5dffffffff04e7b01cbb640c3881129c0ac302bf2a5aa22a4e3a019291b06c44bcb3ad922b0000000023220020be33e422b95616b18bf5f3615f8d3dda348cbfaddce04a4876fe1314ccda3159ffffffff45c22ea7dd82dc0a984508ff816121b68b413fab7441c649919716f98ec633302f000000232200202ff8841a2560a516908b2fb3c319ff75b7aacaee59e5bfa826de38d0c867f20dffffffffb4539839f5b15758a2f5b977b1b9076a1f1d9a63ffbe6e8e0de723476802083410000000232200206b8e0bc3786ff963930fe11291c5c323fe500d533d1885dad19139f126f6ad12ffffffffb4539839f5b15758a2f5b977b1b9076a1f1d9a63ffbe6e8e0de72347680208343b00000023220020219dce7dac95a5aea068a57c461f0b1c02ce020c5225ba9c482d6ef32ae5d71dffffffff863ffd25a7ceb385f9159f3614d9c9e94b7637e70e7d80860a7f49acf2d273340100000023220020c091c5beb272f1f79ef407eb4f724da3dcab860c5041f89fe96fe683284770fdffffffff37a7e5960ef5c044d428a4f8878e6c0c4f6f66eeb4ce1b935991fc3272243f3800000000232200208f0ccd884bed255162f5a36d68d7d317a119ab4a5af6744a62dca01600e898b5ffffffffa824e74875bca953ebb58b16e0117f337b9f3b8db8ca899c6dc040c08f66ed380000000023220020b295e51decad866408f798986e7530a077a43d5e0f25d0c83d2e1ee9246eb7a1ffffffff8bed2faf6d465db110f46ed2f3dfe7a69387a386812ed1f73d5ec52e02c965390200000023220020beb02113f6aa00cb9815ac861120af3ce6b81a0abb836c38a23da924ece9a948ffffffffb3f3eb007ad34d8bd0aec5e5c4b9f5214b22a3ab9a93208542f8bf6a7384bf3a0000000023220020137ad30162f55c3dd617dd1c344076f6e6b3b72edd748f4eec9e26dfc344852efffffffff2e3c8ff6b48d2ef22f327afb99c3f7c7284a88d6d3d49a3f5e877069c54b63b00000000232200209e1fb2389a7d24722f6a760681e15c9fffa49535d68e86e788b495afe8c17c00ffffffff5c9d6a1e0b792a8ec729c4eababf3c8462e22fce369e356a39d058d30399903c020000002322002026d90c48ec7c5dbf208e52d74f26783c8f9819f3fd4eb3656c6b5c966427b576ffffffff8ac37edc7bfd6d46b74cadefb760bc9ecca427b28aad4f81a5e629869e4cab3c17000000232200203f8c36cb54649c185dabb994339a6adcbbd9a02d5bb8669cafcf62f7f37c2279ffffffff8a515d64ad11e24a85c9418a93cf4682e54c078a54e37845e4c66ecf4d45a43f0000000023220020875f6b20394993a9a79dc0189c6f9effc9fb52d31c931fdfdf21716549572b32ffffffffa47f2d38b1216256ef180aa7be3b326fbdfa0551912d02542ba5f86704870d413000000023220020f8c2c727160bb7fc9376110622bb030b9e5f0b25cbe653ee354b67c829c6b5d2ffffffffed7d84e00fdaf4d473dbaf3a76bccf983aeba2c4ba327903e6f9aaa6e531bd41040000002322002069b444aa3c9e44a4f0f5e1f9a8d4fc24fa3022cb43074d1913fd559016c065cfffffffffa4fbade6d61fc3146767ce360a24ff496277ea47b0d49175fa51d3431bc533420000000023220020ce1f57c683f4736991e023276a8be509d266d3ece8b8aad90098d8c577f3fcd6ffffffffeb5e0a3e824b0ffc6333054de1ec620173e723e49e667053eada19028951ae45000000002322002012e69cc5985e9cf023f9dc457c974a21fbd90c0f95b370a8f331c83a3251ba48ffffffffd50dd9060683092f1591c90d6d0d8f519ebe5c335006c3ed9bd732380d89bc452900000023220020c45ebdf04c5fed3d990a956b190d447ee9de1a6ae7e3c6609650d8c828eb86f1ffffffff2c5ffc53d51aa39d5fb7b607e3a7a4b119db4f2b448bf90a250d5bdfa0aa6b460d00000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff9a126de006d6219883f926f0d24dc8b541b07b6028a604ab105f107b65c9f2481c00000023220020c3cc7c008a9bfc67afe6658164c9306565decc99c0b848303770005f39d0dcf4ffffffff6516d5114eec43f51fb16f7a70a485755aa47424b14cf2a5a9a74dafc80cfb480700000023220020e056f5b4b24e191dbec97f6109db3f182706c9382b4ba3fdc3326fafcee966b1ffffffff6c9dfcb0d02ded0c17437072ca90d6c231f7b572b84643308b4d74b48621e24902000000232200204fb172ee7803fdd4fc5759c2ea2ec0212ecbb398e26cdad72787dac61b05e3d7ffffffffb9b1e9c758733b5859c0ae6c0de5d4bad8781a6b7ab52065efe9d3bbce76504a00000000232200205562f3e8ba1a197b50f7bc8e7a646e874bda13975d659ac186d212ab54068db6ffffffffccf6430480cef0fb22e173a5a1ec5e06844c284f4ec634155089b840b389614c00000000232200200828afe8f940847e3563b32be613501378c20e6f08454fc44e977693151e7e5bffffffff4648296a8f851f22f90678cb7f0d2d85faf33beb04a5bc2f44c555977c79654d2d000000232200202c11a496cce0cc8d42c87cb0b4801b9b49b882d2fc0b1b0bd8b1320de0d72954ffffffff7185491e9d027f5db6cafd0ceae7ecc57fa340e2bd7b284d4a94f7d585fe294e0a000000232200203c1fb720b319af1eb3a09497ae1adf784a7b9598076a31c16ff100cd52a28884ffffffff91786450cd15ad6d4adfb68476d943d62d96b1bad0297066b86d2bfa59d9a24e3700000023220020a0e080b1fc23264dd506bdd7fb50fdae3ee509624a965c59b880c675621dd166ffffffffb3954d647dca4c085417aed7cee18d7ec2f170f64954175b0c85a6834bfe6d4f000000002322002027c024c8b09e1436029fa7bd267118cc8bda3a97f90ead3d6630fa304719a7b7ffffffff59009d791265fe937e00105dbdab894028d42f8a84c779ac1075cc8e16c30550070000002322002098b05509d93514d4ebb48290a696d7def41151f803bd53f3f700b669bfd4eaeaffffffff59009d791265fe937e00105dbdab894028d42f8a84c779ac1075cc8e16c3055009000000232200201af75b385e867e4dcb0ea9dfb97c65b1bc5c0cd1c81b2c0cf430b46e04480188ffffffffb2c186c4f0b53ef328175b3a1038dc39c223e938f90a0faa0da924144ca624530000000023220020f771fd090b2fb8afdb5d3f878095edbe6a7afefe862471857e5b605a5557bb4fffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b56000000002322002002aaf3c1226637057f4fb7d8d5dbd3fc9a2ecd19add24fc73cd3d7ebd820ca1effffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560400000023220020c2d6ef16354ef8953dcbb2718777bdfd8fdbe591e20d655f77732a075e186233ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560500000023220020f786dbb10c3e6372d25414b4c090bcddd560d5d6084b04fbe1e9ba9e33df42afffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b56060000002322002007167e0f7e3909ec823497a91020b31d22123e96330a4a972c777eae64f1a063ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b5609000000232200207b26a9227eaf80687a6c5db863c0e7686904583ddb5c73ff593525181fa313b3ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560a00000023220020fe0a0ea65897e336bc51609bff9f25cf2d3960b2e59d0e7ea7cb95591bfc30f1ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560b00000023220020820eb7bed254a4ab33bd64e7b4c2b831a46a36f671cadfb00a1033b82ef29805ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560c00000023220020596bc609087bca8753113f7b88337dbc02e37c7a9c8e1ab3004268a5fabb33c3ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560d000000232200206bf953e90a746c69f2de940db61c101fa0bcdf257820f337a116e2ab6616c150ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b561000000023220020759aef15b3038b42197e9e0486a8e89d451e8713dd4a31ecdffbf529b90ab7f9ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b561300000023220020e43d468a083a9bf18a20c3693c84b43f33904a6653650def64e0537fd7b51e57ffffffff45de4a5d18ea817d582a71c8c16c3878af4a65bdb742d5e079a99e51001e54580000000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff69413e7331c3c3122ae5a17d9deb55020e3b4a39289f6be5f75c029a2b4ff2593e0000002322002078e7d6c0e33949a01e43aeaa45c7c3f6ab1b9e79c4c1278e6f5da55f89495c38ffffffffb1cc635e9dd973261cb775c9192b72b5a4dd75f286ec90722e648857b9cb8a5c05000000232200208f780238b882b6a0cf160b075d3b9db99a7838eb624a5a52cb0110b25eddea9fffffffff523d2726865cda2051adcd0c61c3e1ffc88fe874586501a901fbcefc39a05d5d000000002322002029b4da3cdd1f439cca05da1054a1b75111c074e258133fe17676fcf87b2da64effffffffb147359d33772ec45562c1ef28e31450521f3c44cf04cde1f29f87bfc18b945d0000000023220020ac771e0007ca7a779e801cc28e3770c8d12131a8279b64136d3152f9897d540affffffff70faad6b7511a34c6f6fb8109930b5d9718006631b7029cffb8d53c076ea095f00000000232200201a9f6577e875ae9100c17a732be3dd1f6e2fb6355cdbdbf62f1ab3a454649bd0ffffffff3417a16f77466834da284873b5922207079dc2b1c3f3ec06947b131399377a632900000023220020a000bd9b83516d2dcc2a8fcdd983390f9ab5cf3c4f1235dae5e89c1bf014169afffffffffe2b90761d0c70aba37e3f1a78725aed6754b95d1e3c25f4b7662a45e23a91640f00000023220020f1796b2a7af7edd7d7ee5e1cfa106711c0590e77178d7381cbe6893dbf8af112ffffffff018f389f2277caefe800b72d8c9de3f93e7164423b70f75aa3245fcdd9a2c46704000000232200200db277031c790de5960776e1b3d5514fc31679dfef4b8d14c2b653604a853429ffffffffbfefd0b97ab3991d11c52458446eed869adadd45dcc2bca229c4b2739b4f91680000000023220020d49e14040af0a63b98d9c581f3a327a03a3cc8ee10db207d7ae5b50df69b0d7affffffff5fd4b7b2d0d177917690dfae35a87b76c7791c2d26a6a8766f8b8dd02047a468de010000232200209a12ac132567b407cb745ad03a82b71c29fa01d74041363b368afbd705509f6ffffffffff174c6b3ded71345513dbcf3b91099cefed08457b095a153a763982eb6cb3a6c0000000023220020f771fd090b2fb8afdb5d3f878095edbe6a7afefe862471857e5b605a5557bb4fffffffff70111a7e4e63852ddabbebaad85455e7d81e08b2b94b588c0455b9f53c2baf6c1b00000023220020aa38e81d269e4e38f7e4a2f202be78e23aea339ee994a0723e2981cccb18c9edffffffffd06c7bacaa38577eac3e940f2ef7675208c049ae02cb4e52c9eab27470bb6b700000000023220020bc4e852fa0c32969b33e90cd5e2e80f11bcd99639db9e23aa1e0f5bb5d911229ffffffffc213ae606c0e655144d5e4163ec5213adf47f8ee3f079f90d519e98304cdd1733a00000023220020200340e604598bddd2715ba4ec7b13ebe99bc641b75c40bebc27f21b7c3e44b9ffffffffc213ae606c0e655144d5e4163ec5213adf47f8ee3f079f90d519e98304cdd1733e00000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff090e1b8192ea3bedb78efd325e073a723c8ce5ef9bf094393b6f98387b659c740000000023220020c1f0758132cc253c004a0d1419676ab16098e8ec1b07ac7df4339a0417d17e58ffffffffd990f9a1be9d9f8aa98bd54c32f46657649294f137c0d2566e1e91941a48437600000000232200203feec4f9629f4a7361f8035f1532ea7db186adbbb009d383f6218ddb67bf1a47ffffffff15d51af755e2f8f7de1a9ee20f9b2cc7486e0d3787c0a3a8112c7c7e90224c762300000023220020419788f9e80e8aca2aa987c17e4a32eb0c107930e6db018cbce316c5d70d15d0ffffffffd51d7877964a78f6aa9940471be8292b274b7fb13a44a5768c03f60491d3cf763900000023220020d9492b681f11b840dc917e848d75f5a8fb2affd0029dfd9ea27a951e222eb7fdfffffffffde1776932eeb3288a0aee572f24a353020752f2448f59e173304f85602ec7782100000023220020df7637cc147e9f0e746fb321482714e3aed19ff8e86c17982560bd219aa437adffffffffa776744b01bc2584f49f3bff1928c9da84b1fe64eb8ee77f00588ae0a03fdd7800000000232200208a947a874fbe1145fdec0b302836ea9df30d923056f893e77a22706391a56e85ffffffff0a9420da71f874acc8d2c27e8ab6ec21f5d6025fbe1b8bbb6ae2bfd703303b7905000000232200202494fa91463fb81b800645b0f2757804a8e9a6034d6e17509cb9f68d6a709882ffffffffe9745809715c64f17a5d1655bad8bc0c86ed350eefbff3ac3f3f4808c428967d03000000232200207519f25b857ecf1d63f4f77e752a40e75e49b38974767de58d32a88dc9721b93ffffffff326145e577d03a223464543d6bcaeea796fd645f4100f1f06f7db0e8c6f6527f2200000023220020ff0488f912d75f710992bed8da7a98aae239ca96b88e233b523b37fe5732bb79ffffffff507f643ab57059cbf7d9ac0233bea30afa2d867803855ff3ec6fbaeaf8e13c860000000023220020f170510596ab3c39aa0363554ca803eab5f9327d81ad6491d8c74014e5e6c61affffffff64e63af4819c616c2ad561149f9420fba2edfd227f9a90b0f28db36ae0fd058c01000000232200201abf48c5ebee3e0a848a9a576fb4d37be6ae114bb1663582b727aedeca215855ffffffff64e63af4819c616c2ad561149f9420fba2edfd227f9a90b0f28db36ae0fd058c0a00000023220020f804a10be5d7b2573630902ff235cac77960ffa7415862d2cff471e1d75580c3ffffffff64e63af4819c616c2ad561149f9420fba2edfd227f9a90b0f28db36ae0fd058c0e000000232200203b930b06bf355eecc6e12309169de020c60158efd2db11d4d86d7763ce5822fbffffffffe59a0c783989a77c0f24fdf7934a8fc537c701a7f276fa75b056902571b6388f0000000023220020ee3546de9b1999b97d31bfcda2148e4b24fb6cf7d01235222779d2f9803b2d42ffffffff8983a9172a07d1cca476016f898ffc3b123b85a80cc0a3dbc74e3693cee0c290350000002322002040819a542df9ba76fbcb44223ad4cd104bc4a61e4ba0610c4eca4d3bed5d6f7cffffffffb0fa7fddcc3a9c9402e123ae99341caa10084d3c8ddc2b24321affa47a74a7920a00000023220020ef5819d62634d4f9aa041568f14720897c46c6f4284310fb150e9c7bf55abb52ffffffff3497dd4d034cc2de266ea4b9506703cce75a22e482c48c445f9da90b0b2c10930100000023220020b894335767d1fced9351feaa265c532be4d2b94d29c22039c81f366f7aad7783ffffffffe3de70a5fe1944b6cc9b3ef326e19a2c6931deeabe6499cdac66607b8146a39300000000232200203b6e800162625df09503d3f19903b57d01e180ad37362b095a23db88a2bce01dffffffff1e3823e566b82b8c4039c0dd100ec7caba5d29950c1a6502651145f668607c94250000002322002024095af5c95236fa5e0103e2195158132a7099a638a77b8eb9e3925026855796ffffffffd872badb581e8651619eb2eea00e32f735e571719b223378d82d3268cf84969423000000232200206f84123e2f162c76db0b25957966ce05833951786db85369ecfaf44da40248faffffffffc87794acfbbdeb8c1ccf94216b2a5f587d576ff3ba5b61cf8a5d52efd3e878950000000023220020d9152d803d2ceba2050640fe3ab2e9d319001f5ab16779d23e1f4cd836ee717affffffff9b36570af704fca04443bcf14d6cf6d0e968bc887bbd23a56b4b6d9742839c970000000023220020d7619de7a64e8c86de0e0aac743de636e5f1244fd19e3feb551ea1073c9ee508fffffffffbfb6e7776e89102c21b5e4a520bfdeeeb50f85e148e7c0eb524ce5e5bec1b980000000023220020ce72a752997d1b81d13ef5cf89cea6939466728bc5802f33cde29f32338da813ffffffff9344dddb65074a8f5d003cff9bda2c23c0073c9b3b2c95c64f555ee45d7ae69801000000232200205fe00c605fd2b447dc9e4770fd97edfa6b8da994c3ce105b18825bf33cf5ee73ffffffff7902dda3f92c6b31a913773292c42c1e5a1b16db27b86f909155e17bd741f0980000000023220020f771fd090b2fb8afdb5d3f878095edbe6a7afefe862471857e5b605a5557bb4fffffffffe0e56ec197aa294726df2adebdfee7eb607f7e744d502fbc00581dfe6d26709b010000002322002043693032be5c60e360b62f39b4ef9a8273989a1f432626d49ab18bfd1a3404adffffffff423ccced08ab4eb0dcd974ee66d8ccfa03c74843035d719bed379860dc3b819b01000000232200205a010bf1f716565d371c604fea6006eb8f62a6c40925485a81f80f0359342af4ffffffff8e81fb2b2017434a1e55640d484a77926252caada726396d09af5ad1a598369c00000000232200203f5770a498d5fc83850954995a1ff10a992a1af6a2f0bd456b9fb2ca259d1c88ffffffffc08cbf300cecc91d3abe19a4441e9662882b0a4ec226f240ac8e51618130c69d010000002322002003744a3c83789aa639ee17f7c9e1cf495a7a53d9e81393b7459134cb375258f7ffffffffc08cbf300cecc91d3abe19a4441e9662882b0a4ec226f240ac8e51618130c69d03000000232200201af75b385e867e4dcb0ea9dfb97c65b1bc5c0cd1c81b2c0cf430b46e04480188ffffffffc08cbf300cecc91d3abe19a4441e9662882b0a4ec226f240ac8e51618130c69d05000000232200200d946b24e0bf4b61a22963a34aad7f693d4d333f8b233b9cac6b70d2aa77f505ffffffff01f1cd064576f2b1cbcaf0ee4dda18732b7a9125f0b944dd984fe76d56625b9e000000002322002030e75274c3dadfac5bc7fcc6d65585fd0f09daf78deb4de2eb68d4958df99a47ffffffff8b066d97d63604c1e90cb6555d8c2070829b2f2766f004353195d09d3ddd53a00200000023220020b3378bfdc6a1c374f8d7b2d9de8721aeeb8de8e2fd0c8e6378c41c0f0fdd0d7effffffff8ca9b76d89929ce581fe4537731c4cfcd9525f1598dd07751690fa31ca603ca10000000023220020f72bd1ff9294820417ab66820634a0fc7b1190b834edfb0b9becc609898474fcffffffffc7e431842852f68bf10fc5fa73650d49de1ada6674f169fd4fe71222e16bb3a32000000023220020f739e10818bf99469cef467acd72c65cb7bbe2b26d6bef8157f2f2a5550e4c02ffffffffb0d1b7ec6b09389996a55c62d79ddfa1ed5b8372c91a4543b7cc5408bc41f2a30000000023220020d1b4272e2ea1709757dcb72cf1429e4353545640228501191de6883df50208b4ffffffff8fb209a7f5f9aa2e327ed8e2996ea4cf531abe68ad25dc49f9ba63d2531c30aa010000002322002040cbb8c82ac6ca1cb0bb71441568a001ae040575e3d8a832060a4f378a265dd6ffffffff81c42436feba56881a4bffa3a9a549605f45f821cf4806546e69a373e46d96ae01000000232200204fbfdd0a05678f8b82523f9961b6879a5977e7de880d2cfbd5c91a546a361d1dffffffff68521f4a6f58e1e8a8b1373a970a7a9ee51ec512b208e03ee05192533ffddeae0000000023220020e2a9e3e8b120ec9ebf8b6d4d35b00a65141ef14eaa00a1ff206cc47358962516ffffffff9e00eeb24f9746027fb7c08d4e55d713fdfe987ebf7e52a253c99242a971e7ae0000000023220020099da42d2da7d3b795b08f68a2f2400b20b365d703fb8e442edc25bf088574d7ffffffffba4d589224288887e398dfa5dedc8a1c305a37ca5b9b042c9bd3b4f1f89bcab04e00000023220020dd850f9a6601270c1ccd682a15b86012b025f58ee1c28b2e3eb7e90c0cdf356dffffffffd833370402171bc8951c2adecc44d863a86235f803437338c996e53d3a2961b20400000023220020a9aa4f565f6605b631e33fba5511821ca6f35887633b917b8f8261500602cdd1ffffffffb9a220d95ab560796a46ecde18292f848b778d9be8e1d5526d51d509405284b201000000232200209b76314115ab3395187357f1b7ed726f6a2f7902451a52c722c16660078e69e0ffffffffa2ddac9ba30dc9e1ffb8994e994efab26728fd4b798c9dbca915e11ca972d8b54600000023220020f19c650652422a57dd0e017f848f62ca973528dd3a3cc91817a79ce730120e55ffffffff3b51244b01a7301413e2d8cccfa87cd7224c9109faee6bd9d043f77cc4f0f4b5360000002322002079e790eb4325fd5a60fb5c2e38e662a51b0b7266ca5cabde7d71582a42d36076ffffffff5aa069eedf311e8b3a1fb334055b04d32beb32a1646a064ec60af0f83a0f2bb70000000023220020064088b144dd77434eb50a4f21cf39a2fd44b7319981a871b53bc41c84549212ffffffff1bc2326911b6e188b8a7b4a44d0c13dd7312d469184595b8a6c92ac4aa62e9b70000000023220020f0555eee4e11ae46b1f0687d55d210c7e782006f6de2d3dde644ed7f521897ceffffffff1776283239237ab3c344468e31e0712f32b1911a8ee00992f16c16bf9dccc0b8010000002322002045485640e2f1a035cb3f95867e4a2af5b95b978db4c1f0870e60b83261622af6ffffffff06671bb3a99a82b62a07860876c9602007b2d6bb3b3c7025a95ad65da7bd77bf00000000232200208b7770305cf1abc8954d29e045c1d6d7625aa8b02aa9ecd239de32d72a07d8f6ffffffff47b0d3f2c375aab9e5acd6a2043d0808a80b66b92f5c598b79a955b472c29cc2010000002322002093313eabc68e60176f1ef6f57bdccf93db3c0db6ae26be8e77130f6b97b07e57ffffffff0f72843323ae7108fe86d3dc2dc9cd8f51fd4119c38db50bdf5738c1bde244c30000000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff10f24097ec60174a806c1574c60b923652610a1d6e5cefd3514a5c85467fe8c327000000232200206f84123e2f162c76db0b25957966ce05833951786db85369ecfaf44da40248faffffffff26902f0a533ce6318192495ed1ec068180f97b0c91af92f27ce82a95e3c13dc70200000023220020ef895e91f9d4935124459c0e188e99a1d8a84a2addf32bf004eabb4f0f8e7da7ffffffffcca2e4a236b6441916db75878510606df10840f34555b48c88e9e6734cac6cca0000000023220020d9152d803d2ceba2050640fe3ab2e9d319001f5ab16779d23e1f4cd836ee717affffffffbb9452caf645ed8488aa2038901c6dec0ff280f8f494539df09ffaee9901dfcd01000000232200201140830dc3cab4c143d928a3cf3ecd6497b490fb69963cebe75ac4ba0ffe2639ffffffff090e9d66fff086634d3b41f032119589cc0891955b826f20d0299739927ddfce2d00000023220020554764b0d0ebbca8316913a88d558b32f748bd9cb1f61a8ae43872b6c7e81aedffffffff47e2c6c8c7d500645a4bce2dd97ba9d93ad1a0adead26ada80cc26cbad36ddd204000000232200203bd31369eabf23d51604c3ecf33bec208805253fb84d3eb881c2303e95dcc99cffffffff47e2c6c8c7d500645a4bce2dd97ba9d93ad1a0adead26ada80cc26cbad36ddd20f0000002322002097a26736628b9c99de627c2dc1f6c629b8ad0eb638e9abe25771de5dd8c8d64affffffff26ebfb63d0e62833a9d095faa2cd40e8229b78f4cca95f91513e926b093bdfd50000000023220020493d6e1f70fa0a0867426eaf453910bdaa4ea5cf9706d64f95ebce74a548e1dbffffffff022714f9006da53bac6d0e7f1e18ddbb4a36a723a690e08288c1847ff0c010d6040000002322002057c86aecee895df71ed1615317d79b914c86113f8d89795f02fb4cf73483844affffffff74dbc8441d80ad0cc53e09ead1717f1ff9a57bf3e3b2337c4fd6365e343c7bdc1400000023220020aaf150cb8b7c19737cede482584cd6066097a845208996d29bb8937ecb90c921fffffffffe1141bb012881f873c533e326ee5399f54ac499e97435460e3f9fc33a6eabdc0000000023220020ae58ea15550732b459577e8334a5e23a2ca62c193f4d4a59ef7f8e8696df972cffffffffc8980bd0cf35b499fb3c3b796ae9a1edb84a47f81f98938dd4d19076f41ba5dd2a000000232200201a767639c668b5605a030093f0feb15d209603e146713109a48c0cfe766465f5ffffffffb046945dd9db707dd75cf6b6cdc08f00271cc600ccc0c802a4c31944fdd650df0b0000002322002009c832b728d9a69dea82fb91c0ac08da0a8ff4ab5199d3ca4cdee667a043f8ccffffffff0437258c44981ea60b0a4ee2e246de97661101588e144f9494277826a2a1d2df0100000023220020690090b601c665c976fa5f88ab4204f3c42209a0868ca72c179a9305910a0122ffffffffcfb946ee65251267ae52ad79f9bdfee6c71accd1bf98699b258bc745039e33e005000000232200204cf30b5e0b68625dfe5fc35c03f76a4c2e63d07568915222425b721aee93589affffffffcfb946ee65251267ae52ad79f9bdfee6c71accd1bf98699b258bc745039e33e017000000232200202d05779d8cad23d86c0b67818766ee19b9c760f0c79d6b18d4b2db7d9ca70271ffffffff56a515a5b38d2133a95d81a69078af27fd048771af21da1f63ebcfcfd848d7e22300000023220020b494764b1b48ea5fd0d41148f87e25fa92056b179a1e8f2419f40693533ac616ffffffffe2e04c984929ac5df4d22fcc376331d7dc7b3bdd941da294add7121351c805e3000000002322002080f8b99b309e27747884500f6a974924d4cbd9b3bcb62759401793924a527986ffffffff0ea2ec6b4e2e0b82c66c9c8dbfc1fdae457ccd2b0db8607956a926a41d0913e30000000023220020479bffa01b2ac01e338ae99f4bd7837b675ca3a27f7cbcbc6fb3f1db63f3ac85ffffffff6125061c08519a710805d147a4078b3a6ea76fc2712d66842a74da86a5340ce40000000023220020e625cb050814f62502c69dbc6c3f684cb62f28ed0c309067c61530b81747ff9cffffffff7d987476076d692e58a6a0a7c9c8d1d8e9c6460de21e48b117cf3b84b4664ce50000000023220020b7f88d682cc467ab6032bd721bcfe6c3233f98b260991e8a314c78c803b4dca2ffffffff808977606e3c3355d01f596cd4a89962ca370d6b38c989c7fdf2c73635141ce60c00000023220020be17e268a77505111733b2d39d554392364b3a43443f808bf03807daffbc16f3ffffffff37bd19da2769fa22c50c93a8f62a96958a10650a4577240543116f55e92ed7e61f00000023220020b2b0630a2b594c2b28e4013b9eb37204fcadedb3a19c87d66c158800b67b1022ffffffff89f75c88feb08e5a86cf4a7ffdec412cb880b1c85942e87a947894501a7f46e70500000023220020ec4c5ab9f6a083c3aaaf94bdb182ffd7d001fbd53cb2d7a122ff887477f72354ffffffff5ba22708b3d89600b10c0b11376c7dafbf09ece132ef71a9cf6d5923afef1de93d00000023220020b7e9a4aa2667b1f9dce40294b046cdfe39d226b67e7d53442369b568b9e81ea6ffffffff02f30cb8521d1c816b8713555d9fee9ad0f7e34233603bd8c2ef311b0e8421e90000000023220020a3accc393084e6223ceda938b1ba54bb2877208eb1758ff3a55beee54d9b9521ffffffff7b4f4e7c0a6c73e63034a5bfeacf754721ce64b519c6eec0067c68cf36f218ea0000000023220020d7619de7a64e8c86de0e0aac743de636e5f1244fd19e3feb551ea1073c9ee508ffffffff4065d010080713c28908c926ec3ab6d33eefe40ca7ea65c27c225363647930eb0700000023220020eae4c9b87f2a7ab96a708d3c718b25ac18a527cd4c7727a72073ea0862ff7c52ffffffff4a1a3f490d6ae12ab9ee23cfd7af6361574421add45e0a097925f19ba941d2ed0000000023220020cf526c62bbb1e5b09e0a4f6ce46bf931ef35f784780e0f160ea3a8955a417c71ffffffff63de083d3dc1724ee0e9d9fb711473368c07248f87a3ed290dfc1e14c40895f03700000023220020bc3554056300c536839176556929c2afc836d3d0ee6b10402935f19169b406eefffffffffc700e5449e0acb64a086c61385cd4fd3afbc5d7b753c58aacd028681d5aa6f12100000023220020ad57d8023accd137d6c1e7691dcd128a287a3de3b3f410cebac8039ef7e0e767ffffffff567ae93a677f98cd876eb6bb568d6c47137364152ca377b8b8fccc73ea6adff100000000232200208efa02fef04683bdbacdacee647588186fc7279003b2e820a47c9675325ade01ffffffffe87a7a9a3f3c484a600b7dd11e425d89adddf57a4dc8be90b10d0a84b13356f20000000023220020e31fcff68af0fa694101f23ddc040e8cf0c369673ba626e7b0750a0b52cd87a9ffffffff7d082f234006b630826dbf1e751c0faa517525319f1f4a761b070105fa1e26f83e00000023220020987feabaff992d164ad6a711c31a29170ef84a5edcf8c0ad3bd7fbff40d96478ffffffffa101d4ce6638c9f0244dc38a0e275026cc0a65f899eb1b14d60030091e8d86f82a00000023220020c9c386b0b6dbd404c3ca686e796a38680d1795b004b8b5f79d6ef4acb5e6b89bffffffffdc83a1c514f811f43c7123b52dff7793e278a95fc00dd5404252ad9bb373dff9000000002322002022ebee624888b10e46cfe3d029170c72872ca9548301c898c1d539046717acfdffffffff2ab1d8f95d87ec58caca07c02cfa8c079e74f3e423bd964180e58f5db58bb6fa0000000023220020f7adedc7390e493b21be15643e0132204bb1e04af9961dee4f892ca10b559ff4fffffffff91712878e88b7b484c5100adb880645c355605f194b8505c40db18d011f90fb3c00000023220020960d20c7cd9be31de5cb210997d01ac3ba7a0797c3b88f3b5b02a1f7b0ba82c5ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0300000023220020fb5d415da3886a0996e5b983c870018a032b8a03515860d5f2ff63314230b1b2ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0600000023220020a457ea383886b25c2a94b0ab641de1f28485e41de03c361038ba007545ab0605ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0700000023220020a31c304de6b25a84664022eb98564b6835e0a96c8064936629053e79abb4b9beffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0e000000232200200ba5a244e6c924dd2d5a87f1d244c01c9a28fd855bd1af7afade1890aa92f5b4ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc1c00000023220020df9cf81a117c80ade7fca8a9e4a6940170f77a366da6810aea4a8ea057dbacebffffffffe25b3403a5e9a2fd2fbd9b0dd0b69f11cbf7f09dd4ca82c0ebdbf12c56190afd00000000232200207c7dcd7bb38296dcb99d5b74a4b6984e46def7af0351bc62416675cc50f9d6f7ffffffff5e011a21ea38b9ab26a95b469c886642855f398ec351a6a6e2deb39e9445c0fd000000002322002005a55204b9585ad53d921c0a21335a3b07e3b78175b49f7e6b2bd9c5c2eef4b5ffffffff0ae0ff3ea628b0f47f3937844447768ee5c0e8d4261c19f8ce4912e515fe71ff1300000023220020ea58a31a60e5cdc88b090f920ebd8c8814c81091b61f90a7f235e57cbf446377ffffffff0154e9271f0000000017a9147469df2f13bc2a355a025efd1d3cf5f77703324687040048304502210093c7b115610dee102b87c9779519a48b752dba13e8a9ddb44a58edd2bb9bef310220588a2228dce1de127de9b56b61ed6be13de9ee13f8f4c04042292504cd6e38d50147304402204e38b50649af258930d44f55a86dd1ad89aaa082c75f987ede1ef7c17fe629a00220238647caadc66f45a301c3efd9ee54f70520d9f4a73062ec5ee2102d9688fc9b0169522102d6889a12526de731a896f255bcc5a01bf5efdd2a21622355be9266bf8d1ac3eb2103f38af409b76777c26b2b5e0ae2bf6aedef0b183d4da1e2345593f5358303b33d21024a45784606525d60062d7888ef34cf3e069d75f4e3b01d0568cba8918b63db1853ae04004830450221009b32764c8980410b5566a3ed0a1919c562922377b6d023d74baaf2ef448ed2840220623008340e0451499c24a8109c6325b440b798691f254dd9cc312ce910c77590014730440220305c594347b408ab91f743b6ee18ea1ffbcfa3ecab434243d70c40dc6ad5ac54022036b90e98cc4021a597e1d6421be28a8e9f9f17a47742b256a85a46c1b3a5058f01695221028917ce240c97a81035e51e244cf9c6430d8b39036c3cc1f5d021d88329fb346621038f425f00fd1efa45523f5d52e6597466ed26996032fb071128c997e2adc69e812103986d2e8347751d88f460366db3bda460ba1e1edae427e2d75657eb21da9062d153ae0400483045022100f9bec123094868d67fd1d00d9f9fe06115de92be8346a8f0d6bd6144098b0d83022027c982cebff658c7ba0cb79a33699d7a800f45382fd3359912b9721599452fd50147304402205576aa84507d95552be855f43ae63191e6060e03ecc1647399b610fcee7737de02207aa3f85f6d42153d49d78a16b131e044c5cf97bbc26601ba1f0eb08e099549ec01695221028b2f8fde37f5cb932351ab8cad916f1667041a6f9f5074f78e3b33e1f83e318e2103ad729bb2e0fb3a71a83d6448ac03dc5e1ca62c5ae168b54251197dc3af3c25ff2102e37e6a2d0182b3b879d4136646b47cab6005be24f61592647a08d988bb4d5c6c53ae0400483045022100f742671e3b85e55de015e8c7e66176abbc3f5c3c701b91c35b5249cd7f9690f60220662f02ea50f90743a7c9f4b5aa3c052ce2e7aa354949ff2daeb40317918e579a0147304402207ef1b3bc6f210353dd286938307bb9a7e6283d8eb592ec327aa15e328ab5922a022077b776252ad6fd24c821a25eff994a05febc6762748435e4af14292fccf29f910169522102d31c22f0dae6ee9063a8c57f4424a178f3c0098589cbc013ee532e176f6f602721035e5b5ae84d21d3d23b37e2fb90f8dd4cc6aec11583991ed41cd510f9f7c9024e21033e5b857f162c6aa7d4c43316fb04fcf7ff4f6518c8cf45ccac5edd38c03170ee53ae040047304402201bc6e596cea44cb3c78529832a092beedf89ef8f0696457f739f821a80325d7b02204cfd54af065b21ba20cf32971699ce08f1d95648b34a4d9f06ff42a77dbb47f20147304402200a93cacfd102f0dfc3d564105de089e2e808473972e29c0637edef4a43b2eacf02205223c7d7beb591852aa38f7309139804137df2b8bd3a75fda931664e1d9eb8c20169522102c6efd1bd12c298c6f59b6d05694ce13511a6d32e87c6f662b84090da6187dd832103772e58212d30a1951d71af13494d226914cf270853029dc60b36fbee8f095b4121027e1a39a2962aadc45f9b33ea54af8c1c1752bebcb0cb2ab0b15ba4d0b4400c7b53ae0400473044022066f0a55f52409ac7a419e9e5c2714056d328186b658b2f3c3792f1ee7630e88f02202e85da1280290a30f1aae2474aaef6c5b1e4fe10822f47f18c47d87c354c5e7a0147304402206c0bd5b96880255bbaae3708826601ff1f7ae88a4d85448b9fcb547ceefecfb602201172e2c67d63bb80ebb94c5e1852a7bbec8d9bb38d29700e0af73639f3f5cdd10169522103d8ef22208a80ec1d2d31c0c700c022ab8b2ec595ff417dd8b1d76085000cb6fa2103a65bfa31571954b93c3aa91986dbae31aa7f63d060f39b3fb9a4d6c0ffe27aec2102eda0042f4dd6635a0525fd3723525a1026ca91e9f67c1be488bcef822f234beb53ae040047304402206de562b270a3ef8abbcfc38445dce0869b8d2a41560fdc71d06a457ed2672dae02207746c109d4a7457830f0c573dc0a8d70a6ffb5cb1705ff8d3b2a1a690ddce5910147304402207b668807ca33e17fc8a818ec478e07b9881df2c36183c9bf8cee8d103623f1cd0220166006193e151a27224befac3cad619dc889b87eb3160072e39737f1467f3b6c0169522102d66b34d291ec4d83bc7557d4db9561b4802605f910ca3b3318d990d11271c6cd210204e7fc8731323239646bcd13aafa853cc56140e6dd769f90d9d3e77555079aa22103df61f7026c774bc482559d7738203800a55ce4a5a2176542b9c6f4782bb815ea53ae0400483045022100f5032707906668ca8da6f84b1ef4bbaf998a0c27640c408e72a6b4656f5fb9b6022045c783507a565b39eb2df90b6c7b51c7a731afa9067213eafa774a2c4afc7240014730440220659d377dee3d3a5062367dbb92551dc9d2a466985088de9c58408ea488463b2a022056a6ef52734128a7ca2482fec58a21604fd2139e0a7686a01968ac200b28de540169522102d3e8fb48c4b873540cf202c4ca249a2832515ea0cd9c1e4c6aeabd98a0582e8c2103e0bbe49a0fa84d1cb908b7c58797903c248fc642cb517c6e9c5cb5eaae28239a21020ba03fe96d937729bd7da7af6031b06879f072c4bcb9b4c5276199407e200c0453ae0400483045022100fa2f91988961db2bd0179e56894ec99a16d2531ce4229cfc486da8e6248ee6de022053a6b2a322fcc5b957f9d9868bf580d1327af07b64012cce43da0c9dc36862ef01473044022034d58798d6ead6d035f451178caa63f1de7e56fc9308732023388a545f93575a022056957531bc8a1a57cb3216b421215796b0978eded266b7fac53e41477d31c6bb01695221037325c7ab5e93dccc8a5a851771d275c2d1e666209f7caab4eead453b7e88aa3f210259391976b5218e69f19f99938c72c161877a32828c8a7ebdc972c67fb6030c6b21024c758a401fc680fd585a2e5768edd19c1b6c9af9401fa4667bdb2e675e96db8b53ae0400473044022047d5edfd9de293d2e221987cd6102def1d6f4bfc22b9abada0066d702b63ffbf0220798d2615198a7abf498b32f8436d8f5f89c405308e238539030b5d7b37bdd01c01473044022023cd9869c725f00f27fa369827fcfc713835e04fb3cc93ad3437ba893469fd4602204809152cd398f994fed62eff1ab6459d2be2821fffeb316492f6df60a0e697c50169522103b18e39acaf107e63607ac0f09ee96e1657a93f52a2015e4a13c08d42201995b921023ccdd627fa57bd1a34659063bf6dbb9c3d731782d0f4bf985ba56106edbb51812102b34cca66bd5c6da1e9d9ed0b961d639447fa7d0cf42cf6f64bafce4cc1ea822753ae04004730440220160bab0816980a795e7bff5f8f54667a7e98767bae9e36d78f488ede00502a0c02201d485ad8f6dbb69bc0daf101929d6d125f130afb9e2e04b25613eb2f98031bde01473044022075632abb9ada03841c9942ab4749f31abdc5f6775c185499f2d887f479a8763702203190042e24a7a11fa8bda9dbf7d90d024353b5426517703f3bc9cf29b455410e016952210280be7b58c0f872d49a67f4a54ddfa2d21156393a3d2cbdba99305631509f585d21037df16b91196aeba4e08bae79910bc64335aed1cde29bd6fcade4336fb7cff6162103ae27bf3bc4175fada0808a79c38c6a0f650d29ad57476b6c34ba0b216ab1e35253ae0400483045022100e71bb10d94dc96122bc562982aa28a308bb583babe7e00cf83ce32002ccdc7a802202ac38caa212db5c0c8ce20b75bbabe9ada1664aa5c334be19010dcef9cfa1061014730440220260c77a95138fe1609f608810638912a22354187c6e996f257b290e9035fd9d402203564ff63d5d4ac53200536f9a7341d4b0694f6adccd99c7062ad815496cfa82001695221035d170caa40820ce27e2bb1200862117ee2828d01fa3740ad80cb7d1daf511b692103271c4ff689e18d92c23ed0be95148e2760ba843743e1caea1040cead3bdb3f04210304a79aacbf282fd6b73ab4245253ebf347a07165885b38ae8833dcbca8244b5f53ae0400473044022025a5568281ca3a9059a22ead7d48f57d7643f20811ce8aca057dee51f72d1fe402202b7c01c412566266b9a2f5084619ad74b5cf54c6a1fa2104ecff1a358f4c8bf9014730440220786ee5a5b77fe77f91c648e1ca8a6a5a5414268f0eaa741fd0b37f258fe4c8b302205d86a5821aa269f92848d9c0ec7f9261cdf2d8e5cb979350e7ea718d3408c6a5016952210333cbe8af83bf4a7e5ddc38e0896f7cfb4ba83b1298847a5e98c990d01071a33521027f82501198617429d891b200040b0a2eda1753755585769e0034f81d1fce082e2102e88c0a7dcd1b6bb380bf6dc1a6d64512ee1b1cfeb1d698d2edbc60928fbf7b4253ae0400483045022100e0b771b07a1e19e022c9fac718dd247358b91e1763868502a9060579b7099fb202207d821fee7845deffa3e098afb6d0814f37cb59a0fa1362cbd38922ca4ade345b014730440220436d26291a57077f3205539a36310122cb97aa0a7e22fcf9bd166db01118524b022075f003d0cc024edd57afc919d4187f878bd6f0a92fb7e6515877a55470bfbea6016952210297c0af9bae32a55c41ad225092cc50745f63f38500d3fbf9368336ff3815d5592102a80c83b31a8a1c5aeb1c55da5f14a1836e3f79e44e87cd2dee331fe77766f8e7210275b758834b8be06aed58e67a22a4ad4b6c39747f0a0dcefbcbb587e045925f1653ae040047304402201426f0e47a92b1c967152689ce3afac5ed274f2088274a7452d09a29201e78d902205cedaa0c8598b87c28f18a3a02fdd5f937e413392425eb713b93b51fdc2101e9014730440220260853bcda7f89394493c542445fc1cedf3191da430c20e708e63de2f30ae34602200513fe426b5dce38597a5004863e1be96cebb8aed48ff7a9e5f1fcd560dcd6b201695221034ad8a18840f2db9d741c11d0bbb6ab0a44397e81642a9f5522c0a64f07a5be0621022f1ea81f851fdbeae58a9f3cd8bb95f93c34fb08498d6aecd91456cbe29b57c32103821b1777e91ae18f8262c5a9928cc204c98f04abb47cc124ce1825ec02f543d253ae0400483045022100dff652bf7c6fdd343cdab02942aae8895a8aae77374b9ff8a66076bda229d1f40220602dd54ca60508c4fe1f30a5016d05628272857a30f72432bf39f51d5b593469014730440220669412e5b53275a2fb93deac735cd6950152238956d878f10c0a4dc9ec905918022057d7a2ad909e18f3985183e29010e1c9f868abd334a88b1790ab99580c0145ac016952210333a56b171f266a57d25f4cabf8c75d762a70f2e70c43bf848eafd61be12259702102c6ed0e7cea12d9c0a569b99ec7971b359bb20b9f787eb5c8efc0f9c1c51b87092102311d2c8f4e136db32ffd291dec2561c47223ff9186aa24ce5b65db70329b51fa53ae0400473044022071e7e2943c5229160460314f032762d04d33bb8f810238c3da369b2a0a7173d4022018ea90dd7904e6ff8788e5e160798e62e267e6686f9b735e763fccf628e0c6a60147304402203d84d604f9b1a1243119b9dc0417b2e591b8f4db8a6cfd3d2d8106b2f34d3d6902201d1464ac8379a0b4ae8960eee647c8ae8dea7170b5778c545b8e9a068f60f555016952210320a65d5abdc7748fdb643d10f003818995e77602bb31734fd0c554e6d959c80c21032724cabb3379cdef15a6af883d1eeb2c6db7502b3dbad48dd8b33f56a6e2c5b121030aedd834e928a69d5fe2256af43187ac13dfbc307ac1d928c11dc7d8adb3787953ae0400483045022100db0be04abc2f9d41779a7117a514d4c6923328e22606db16360240793e8b501d02204fdeeb4c6505bcfb5d313fa7e99e3aea5cf1cd13de2cf7201636a37976b8d9060147304402201c32da8ff5a116a0db53348795900ab26a5a88ad2773e77ac63581b13b37994102207848d8c42e8abe4305b5a713028e2175359f4e0b53071232cb49a4a0b443557f016952210279b4dc85803c98e9adfb1ac5b6a6a7f71c837459256921f1e3b9d2dd6a27bcf421027ab68a7b5c062753532f6e24312a24b8ebff785c5520649885b077b54f34c8fd2103f4a8b483e62b9f06057d4236defbe4b3ebcdd999b6310fbc21ff57adcc0acb0253ae0400483045022100aba882d6e703336e209a769c9ac5abd5a5e689677a63e61f4d378db2bcc4d023022057a235c2184d5d7faffdfdcdf3a4b85335baa20a14b741b842481659b672e3820147304402206aea3ad808a2932505a9a2ef1e8474e8abdc49ea800b6e74aba99f8eb2b9f06b0220008e4f359031f184dec6b54e31c8b5f48e9895eb999f2e11223e86420b00511d0169522103917544da8fb60f788096d8c228fe695dab82f6bbef3d6b0d31e4fe57f03b29a221029333562f2293b0c351c88debf80e3b054bfa400f0383aa0fc23b57d8629440932102e1d92e5520f44ca37fa3fac1fa3ca4aed6a1634cdc8db32f51fc12c207b4faf653ae040048304502210080a0ec3b28ba3b91b59bff24413b4fc3291a13cf0a23e51740f007aaa4b77ea0022060e51a453ea320de15b1bbd0f61c9708d5a88711f3959217977bcb2cf6dfb32001473044022065781a367b792877fa94b6e92fe41771a0d3c0531d43820540e19549a6dbd6150220034b86489d9ebc0dfcb84e5bb709ed224cbc507d7020baf8a1571ae88e9cd8c10169522102705f5cb523e4b49c2cfa8bb05b06676055e0490ba46a8a0887c7b4f8ca9d7746210381d22776c556485798a766f98a2133cdd6b52ad7069e91a9a868beeab5e06f132102c2fe7e342fe7120f49eb5b036b25bc3ff7ad8f88b2762df796b4e2d4184f6efb53ae040047304402202fb03b4c71abcf774a71e396a4f5dfa144a878c04ca2336613504b604ee04b01022013e08ae9b9d8a750581bc681c8c157f2238c2913dce28d29b952bc8affaecfd6014730440220648aff956a4e1d926e7b4e04cdf4e124d8516259086f25c36a9875648c7e2975022036df258f6ae844fcdc808df822f9a48c0b80b068f6f89f9e84f5950663a026f60169522103cb7b408d8d8ba7ffa27508a8084b17e0e0059ddf6ce7e953c8ba45a07567ed5621021f44e5209087e37f774c0721dfac267b59576a7d6c92fe2da311f32469e5cb82210364d2ca8ca6e3e9be08f1eb0683d953f37c672a7352369fc45e1727f98b7a3a9853ae0400483045022100b7ba3fc85b2e34033079cdbbe3df2d79294439cbb3d9e9b8fdff2caa42f515a9022015b3b54343a489ac4bcff16d0a3c5cba7113c22e9b7a1c425ef7404c437fe9f101473044022050396dc21c05cd10860a1b60d9dc71d10a4c41f53191e8b5b3d3f3aaba3f91e8022070812db7a9b9fb54e6ce2e7abaa4a3ba40cc2ae5fb81129db9214e18de0f05410169522102e4ad11c5ffb2b47f43ee9cb0358489ceb33a5617dcb660e9a3ce1d79184805ab21020e60e34d13734138f1649225564e010cf181c2e16b8ffe759482ffd7d33602992102c6b593fb1c891f934f694f9ddaa32189bf58c09272c47db03c2470b15957d7ce53ae040047304402202dc18ea1622e0a47e2a145ea5e77566050d8af7c5a49fcd3d672a5796933f3b402207d9981345289b41c0968cc27bc80192c94892327541e15915d84be4d1b9b2a3d0147304402200ef4571c0af86990630ffe9b1d8e1ce37e9acc275eb7f0ced9574186048f3ee40220723f566718ddd9b90b5220aa36212efc3be2ee8985bcaca985ba460328a33649016952210284c04e6c863e25ec02242732d8a1550625ff0f19b235742e7cbe9a551ee8af3c210285a4d29c6006418693c76247cbc6a1e8aa055bd44abc57a2396b5aaf5259d8cd2103f8795067f093d5f39aad44d6aafa1fb71efd7ae3cea562978fff130c138c8f2453ae04004730440220476d6a99909fd6c37b59a749c6b1b1c46d8115c2b6bd566215e60bfa8aa776ed02203beb0cc7ed8068c0fb24bae0c69f01efac4b31c532ca0cbe00ef9aad8fd04e4c01473044022003532973958f90a97a37071ff442175187c4b6d973e8bb1bbdadb0414f6e65fa022015649dadd893a9ccce1c5615f8f27cccdba63ace4ba61d8039805afe6823fe74016952210218f4f527db128c5a10b2467f02dd0c11531a159fa26cc8e3f4c405b8dd1f68ed2102409b46c590ee93f68316723e96a25e0265bdf222d50858acb866c85c5dd28078210302f6bf94b6d803f6d14814d8d9235142c2e19fe42f165784a322f7e6ebca060053ae0400483045022100a836c67344d62ca10c7aa77c3851d7625bab6da31288d58d47ab7416c1f399ae02205ed092fc58b3c1a79b7220fa051b847088eb6ea10b8b664a65f29f0580e094d401473044022015b4d04b9174f2724a241e57c190c0b6f8dc9d1cd0efdb8fc8a4b4d2de035a2c02201fc3085aa376cd4d434b8cfe443bb99624f926d15d2c1b3b5533400b962d70940169522102d69fd5517509aaec54a384c0ee12cc2049c0612acd5cfb4ae5d2a5c6bef44a83210286bd4e76c98ba33445a16217f2f5206d63fe112d18814e19646dec72ba6eadba2102642ae9509f87b8af4dba23a9a10026bc74b0348e64dab46ae782591a3b612c8253ae040047304402207d64ac5a3ddbb9c50fe40cfdc2cb6f4d3126492f1d88bae63cae55be78b2e953022005fe9ceed090bcc87040d686ffd97b49bf49b0a6992baa24c51c924da09335ad01473044022034e9748c3ac7a639c8a79603155a6921a1be48df916cefc32cc43018195f41e802202ce473229e3e9166603b10390bac030f08cd2f55d318a57aa167b871ddbe2dfd0169522102df8a875805f8c21ddaca3760a3d3e1059d22f6e744a1bbaca56fe02a900181a92102a7b4b1e9f3ba520a8bdcea7f2420a45b4289441daef0022f92dcd79c205cb1a021020c73c87fd45eb6a3244767700b8302c815014705f09596015854f2026efbf99053ae0400483045022100b495319ce3a55c1eb4c3ada0e3668773c3dd5b56c23d87a2a844238ed9508d70022051b9415128f1c64a00ab80a364d605782eb198f4bd1dbd4c71eadcafe69ab516014730440220248a7aa947de43134c6e6e4af036467594685771941ca3df038a3086446568a30220247156225a2a9acfd2265f2d0a1369d67a8fb28003b8503d10fc67a9353221ad016952210339c3542fe9cfc2e75b1ea0dc3f5581fdbcfe6f12cb8c23bfce721bc60c8269cd2102c0b19d86c6618d942d14cbb90cbda83ca427449b8a2cea7a64a343cb6cb2a74821020f988b6ac4a3fbc37c341cf23e89da08cc04e031eaee0626c4d8332e3004996053ae0400473044022048b7edae9670f5dcfd15f633dd1fa7378cc0c82a1cf7f4e35340b9460278eaf8022014a966f53537dfd069764868ab0a70b39bfc591f1020e28dbf809cc568447f690147304402200e4a4186e3c4ff65dd9a89696996a6b33634d9f2133cd42d67e5423a16900ce902200ca9d4a3d2de16d5b4705fb394841b167895c08d04964d6a2fb8a46e4b5b0d39016952210221d15c0705b3642819184e1553c936ae47155b1900f96981f8857ffb79eaa7922102bc27c87580949e0a4c312826df20727c71c28b61725f167fae877e87cabaeae62103e8fe24f54b55117ff86b6c0951fdadcdcc5df5703e742dde6cb2610c214741a353ae0400483045022100842f10932876703fd6e0b05b5b389771bf0d4e4d47d1732daa872722a0c80fae02207b276b9cef3ea87472466121d23ee4e9f62fd9375e808ff8c6b67030523dfffe014730440220315d42b2102c31dd51640b03e2ae30e01a66e8631e42d743fd4b0cf4aae467eb02200ce683dc03439ecfeed3338b84a6da235b20dbda224006aa32a017f00d5aebcd0169522102437f25d7d929bb00391a82b9e696d811e6d57a9c4410274db29f98c575060cd12103151ea3f1fdccf535ce3b91e002c5d8316520ec2f6d02a091ff8f9c8370bd3571210391cb580a7b49590683b99aed101a585d575fbd37ed0aab4a30362959fd4f3d3153ae04004730440220402dc4fa9487f99e47faa0793aea8d0849de43b52948095cbbf9d8dd3b263af6022066e7119ba6db5d078fa2fd9f1e87937d6cc024d1a08e165c1d9a7c6fb8a633c10147304402205aaeb6f823045cdcf26f43ea27c468a9781e46ccbd2ed60437e54dcf0949b5b902202f713be95f9b51bc9dc2ffe70fc37453429ae7fab2f96364686fcca0b4fcae6a0169522103ccaf415728a12dc0ed3aa41e2b22d41d4a8cb3ff7748c00fda2d0a5777bddf862103226c606f4d0b9ac30cd2bed64dc9bda557eae0670a0e1980923b44a02256c04221022b75f9e140b4a87090e83cce620db11bc2ed1cfb3175e3ba93e05b40d8f48fc753ae040047304402202f6cb0088a0943a3c2724bb14b431bb8f854fa304c16b995394eb83a8abaec90022047b6f575a31b5329c40b1e95d19f1d212d2a5f99d2727d3bb2fde09a3f1300290147304402207ea2e32163172eeb60b4390ebe2fd7045f8cd5538e5d02e60c42ba1c8d6e01380220236622156d152cf085231c0d938daa4d8ec04647e9a7451610185829b99bb60b0169522103cd6d4b880564509b572370b09233d73616ef75dbf77e6258478c318775ec5bdb2103dadb083536d6423ef6de50e728368de8343e931871e85cfdf91174a516aaca1e21026c74b19e3e2627b4241de83a80536ad62aed0b44484058b89ae3d2607cca6f2a53ae0400473044022076db24c8d6847093e7b6940d428fc6e0711e4b171f6fc4c37d4e339fab23a1ff02206943e452b99af396b4f656ccf4fe8f3d04149253f68021954bea03ce29d6db05014730440220708eff970928efcab957bca4f0c5274f406d8c078a4f1951cd76eec3773ba06702205d78e115c5e0bbb111319a630c393437d57a33149fcb9db2c154c5c375fc0a3901695221026b75d44ec5f606c54141118055d6be7fcefad271099e49839a432f5b99b2ad832103b53f56b0fe35f04bbb0a8c83c0d3bd7deb414a43bcb9c3b96a8690f629cb0385210223df74006263ca460a77a225d91bc539688c13a55473a89972a0bd57fe76e19053ae0400483045022100e2cfabc6341ca623fb130f477d63b229ce9f17ddc2eb480052938b474c62bd91022055c8a75f922a9ffc0bc4c93a41688db08309edb61a81308db3ff28fd6687c457014730440220653053c1edd1fa576df82b8c202e7026393fe80a757ed0e9ff90f38e64b3872602203535ba71046afb75c7ba8898e9a4efcd1a55d86649aa9c4d08faedcdd40f975a01695221032039ae4ea660ee78c2b9a6c2e3fa4d4ad19960ae1d377a8f6cc4092ebe39a2a321033626164a4ad593c9fd1f1f30ed2186b3391a7dde4fc488e8a70db02437dac8162102944d6dd69f574b42d3f795b01328f5a53f90accb93b0f07cde29ba69b1edf4f053ae040047304402204fc3174730d28a4f23252d4005e82db1a28676cdd4551aeb73332fec57c19f530220559136bcacd5c2a455878adc1896c45070a935c9347a7fcfcfe126f5e6d519df01473044022064010c6219c262bfe9c1cf972b14ea3fac0dbb64f136af8f6a24a6895e74c64d022044ae6eba48915a0f443f08946cef42e6782d0f146ab3921986cb515db6f426340169522102b730feb053380f812ed14258a14c829568b5132b7fe04209f127e86a53b7021b2103db3cd845d0933ab3bcdb1a003875202e98fe2154164d74a37ad18d06420b471b21021273a5de09c6b4b0930f1b9de387e926de0627bca7b5cde5bd806af7d7a089d053ae040047304402202124a092d84402719755152e4c38241f249ff95173d33748f43829f40354b298022065898e3044f36daaeda186bde91baea9912db565f01fd7e4f0ba2ace7e70804c0147304402202bd2fb57b5f008a94955d6b3b1166055d8a10746942eaec856d83c5c1ada264902201fec0930208ca6ae72c293e6e707ec074559b7fd1c51dba9f9739b12cd1a6e4b0169522102e3466eaf7ff31b4bea33e1072923f267ef5bf8a95d72b6f858a72d91f235cf3d210288b09c49a8f1dd9d302e639be10872e40d75f75f022932655951f23d25518f8a210231e4c16a097069948403f0c49c28b14d872da96155cab52a5a5250a1d890063153ae040047304402201924ad107179beff2a478537bc3accb0f89e1b4305a411eec159687e5452c98102201ccc3218a6b0ceca43cb8fb83080cf8b86234ba897da8bc656f365e24692796d01473044022060b3c294a6c6c44de379ed87f9fefe26a6137bf28b4d0c4f092d405d150ab58402206749fa0d21330e48e6bf4a1ec65516f9c3fbd9d63d9790bff223919f4695581e01695221025343c8ec6cb5a5d0a988037e789e162ed539514c0550af37d7fe9b80b0dd5a4c2103c205bf5cf7c07e656de7d350cdd9f7ef205a8cb083074dcd387bc6dd7daf907b2103065fd56e970a9b187c475711d587283fb54053e6b6a17197a883fdc709db03de53ae04004730440220416fd76df3a101ef4424be4b70a2bd0f1a10f260bd862613e0d50f620bee91a002207c57cf8e9caef69022de6fad375f9ee1e0f13dd0b553aaba47f60e47a1e61ace01473044022021d516c6b9356c6dafd0688d122119383c792fd8a81d50ad83a47c409d7ab0ab022057f57f6ea23bb638c16218807369ebd84ee53fb95e067d8918ce88acd3de3ca60169522102d78451624e59866be19ab57401089bc1fc548e91b7f4fd8854b7836cf4a6251c210382ef500974b8cf9309bacb50aa9d93807c10a3efbb0feb5d91681955ba3d903121022e743a2e0903b51abaab2438a6b62378c52e1b71d24711e9d0d1225db7ce7c5853ae04004730440220481e28fdff4c34d50da3c7c41922d07f2daba341b28ac5257c3a8da43977d9a9022035c1766417f70e62e922ea63c687fe111da818fe497d8ea9976fe608da32479a0147304402203641ff5df7ad9e78e4de2f1e52a8ad8d89c587d9b5cdd1667d13263761648fa802201617b248de65db9ffdf4f62818df3e2b7194a3ace3d60375df4e6974735abd66016952210305afb29920ae6ea8ce5f6f9d1d3672e74a98d428b2a5580039167b8d78ce5ec321023cf23191b8fe6a58b683ce2d3339196ef8ac80e6b0d3c49809c3589345389b8821027d8befdc6066d39de831b1f437190f5333191bc00345acd30c122bcf61d2445853ae0400483045022100b0d93d88dca3c219aba6bbe046b4aa2c6bfcacad556923445a68ed90b6f8c15c022009b650f194e2e73ee7c97ef06e1a1d03190d48669c35ad0fbcf2accace2b2d0a014730440220262faa46bdf0f26ab24a4d7b7fd1f652646ee711785948af3db1e221b2661baf0220306bb56e01dcb8a1123a4dd8be98d69feab42bc5ba731ff2099539d12922136d01695221038f99c55e18df4668751495d4e920fd81c82c2ab3a6acba35833b93f9ed4000fe2102c7545d5368a1a623ab465e1bc4eaa486671fd56150434cad1b97bef5a344ec612103aaf0a0da0d5753f3f9228b47b2b5c6e0025300ef8f5cb0433d8129f51728d73c53ae0400483045022100811f8dd0852d6f46349a0d466f2adf7d76e1d75f78c0c787505a46f73f59f09402206b766abdded18b112d0f8b01bee4af28dcdea76fb379e7fb83a0d9f0beabf4a20147304402200fab669c90f3e5fd9d36393da2eeb1c0f807d1ce7089702f369423548756e5ce022019928010b3ba87cce7398b18f7e4baeb235582e4a1825148039dc0da73bd50d7016952210246dd225c66b7d804186e231ac7e211a0d2147cfe0b28e61f7c15d4b4391c61e421037a6803e7f0e1cc802ec5fa49927bea60b4a3a0840be058ceea46e3375370516521028e7bcfbfada263098f5a9d7078734ef7d9dc65f74908f503f381153a9de0387553ae0400473044022076a11290fa8f85074d64616f7a737a18a60a5d5276aeedfa11adb92832d11312022014515d9d5eb04bbbbd3c51842d689198783ff9b4510a8f365f83aabfe01029020147304402206a40d9aeab4abfe4687b8e8ef62a1dea58bc9fc71a4f240428081c343def15500220631b08416e22ab62ec0be5fb43c804d1c4d4f1051036c7837717169c3abe9a8101695221038b7d1a4f548b00fe414e5462fe30cb7ca09f4042ef12aae1fad9312023ad8db6210292f5cadafc1f3a535cc334fd409ae0a8d552bee1207838de08a23175c738e4bd2103abed38527c905a81dea2d1d27253e546db531ab8c75a0301adce5517c869d76e53ae040048304502210085be288412879c6c099ca07f6a705a9c5d2ce89e3fcb2afe2298687e9122da1e022034ecc6bc5baf9888840cb779c0c8d21ade85965d1615a3013bb1dc55315a3a3501473044022001ba9b768607811f9d7747c46825e505ed99dba0ed17d53dd4bfbc4ea43fc8d0022065db603ce92bcb6b5c3e795ed9a112d5b56e722aa8762ac19af990c5226ad33301695221033711edeff7885f99c03f5efcdec35256c9804e9c6a3270904925848d7c9094e521021b34488093faec0d2ccf059dee98c1c7e07ff83ef3453c4da6862c7819609fa32102a3ed6433088a7a107006cb4f81c3063481c1eaa839e571e8721ac9d38eed226253ae04004730440220483ace0b70db2702148f9b269f2e879cfa5757bc7f22d828eb24d357cb55755402200e8145ee2e479d8b6e47a68ca69293e4ecf7acbbc9a304f0a86bec84da8e0ec901473044022043553013642fe9467001f630d92eb586f6161568939a26ad1c770033efc5822002205ffd363c7d19cf0e3ded2a1d24b149965ddc6589a1438a7230251b4998c77be301695221028c3bf81f7f852114f4c7dc9e30ec4a20dc980ac2094af304f3f22a0ae971fa6e21030c1a0ed34bf82dfe774118af4ee8a93e2c6c44b1f90a69494cb1c2b90cb5c9ce2103aa4900cbaeeca06e5ee59e73e668eb898e16b97e3e2b65beeed7d6d7f7d9503853ae040047304402207fbc67c4fe70eff11449aad4a19b527ec75518d7e38b45279a0fd185e3e3ac6f02201c345d197c136faa4d2a6cbe68fbda523138e9396aa1eabbd7c6918e80d55c900147304402204320de0762618ff69c90955f22266ca2b77af6803a3a8bb6e9b4d5ae44a7d6b6022054b31849194b75cf91d0119bb1570bc3c8dd44adf4dbb67617b10daee4c2d1b0016952210376a75758879754d7776a4ac273ba851bd613995d1bbf673a19873a95a8b10c2221023fd2e2c77dfd6b668ed9f667078f1e0f8fe9375b1cde093aec1ef23b1f032a342102adeed9fc5ab1194c131fcd658545e6d284ee99607201fa68189ad5fe7b361d1453ae0400483045022100cc3435b936a3362e4c25b08bd96c9c18546b0e022f3010b39fde3d8ed66f54ab0220605512caea92d87a47fee7aaff28a112e62844f188d103edd1e3ab265361fa91014730440220336c9e20a501b494e4c7589492a1d84dcec7c051cd7b0c3043a8adff617f6ee90220427f0802c404f65f889d32eaf153742ad538b19f7dbe41def9c06470339e97e101695221025b554ee6a7bebddf9c8c33df86abd6bde2a3ed09962ab61301ad44cf7ad6bad621031bb9ce1f3948bc60c3cb17f94f5397bc811162772cd709ed7757d6f87770763b21030fc4aa5a56940f8615913580856319896ead22b3385dc2b609066b1926df58f753ae040047304402207a79ea69c90459e9d872b7a358421e350ca18d04e443b9fde6a37cffdacedeb8022024cfff3d398948d500801c4cfba683cbf7a06b9d8218dccc6aeabb377621471c0147304402204310734fdfd0c4a6689e87a53fbc6ec3f350871eecfebf05f1f3b001d4b094eb022064061ee83c67303b6367cdf75577a1a2882d67c42d320592422baf8433c4cebf0169522103794a5efad74408eca6e21227f809cf5c6591ae85162ed02e55a7d262cce0379b210313a1e65db629c230bb0bdd62179517c08d05e843b1163f02df0acb3adfc3521e2102e1a4c0b8828e8cf7b91be5c054d899f6c5caea250ace1107fb27f145ec3d46ec53ae040047304402206b1fbbc3c739e203366fc62bb71bf474df81f7c9ea0fe945eb967ac0cbf12230022036a7591d86bba551315c2995ef0fea270f7d31add9ca6105a9d28ef9cf7a257d014730440220330aa6e2f14b664d690c8f38e96a9eb48b1f88d68ed272c044a5f34ba7a17f82022048695605a7ac8cb4e4165e956f8eadd44016c090f9a873c2244e41a4b8983c3a0169522102f3c323ede7ac3590716b9e0a31db6242abdee2682454500321137fdfc3ac41cc210296df5367d694671221b91a176802fdc1a2f5f7961d13f18e1f89a7a0536cc09e2103fc3762fb3c6aeec3673b261bac0c2465ce358adf80aaa6157d4bf44071f62e7653ae040047304402203b8e07b60f256fd2781dd8d855ac03287b1c48fec45c6717f6d6c4efeffe4607022075098778e902f07a158e10f9d500013bde7027043f67afca5c44d14aeabcccc10147304402203d53c6987a0a432a49ae6a80d8c03b958b8332915c290d56d868fe2ca08dfd2a022024813020479fc9ef5c583fd6fafe417096d2b59fc47d56f29f4e59eb8dcd850f0169522102f98f89d04d44a7e2f41ced4762ce6fa85ab2fc0672658b0ba56590679c49629d2102c25e20e4ebbcc97fbb817dafae30ef161e9cff70d296e7acda1b4e917772fab0210388f36cfb483227b8001fc94710f5850e9754aac2b079f01b55f1578245cf5ce053ae04004730440220622c536774d5dffd98dbdc4419c9a65346e83d15b04dd9fbd19ceb81c583448d0220400dc95951c9ae9f8ffc9b7907ad84131cd35f680e5bcefebe8e93160acd9d540147304402205de830d048f50df6eb5e4e9d3a7b8e5310df7c62b5f0fe54a22e7cc251b23dd602204f0adc8ea26f89f850e04954a3ec686cf93803a3d02ccce95adee37fc9d8563101695221028d1970590d94f9703dc2dec246bebf66b8dd3f01bdf1d4902ee641913d7d479421024e9f1ade19c632885683862c31cac4b886b2df2c3d9f41f678b44b876ed20f1621036ca34bc834b78c65798e5639be88d4edd164e7b3adef0b0b37ff4a44b6ba2b9153ae040047304402207fea228b62a10ecd2a767bf1f5623657b99eb086ba4f6aea8b2691b6c08207400220755050dd23f7d9eb9f7a94a0986eb14d1666f213a530c1a7c1af3f761a37a6400147304402201bc5165179303f9c4aece1f393c040758954659c9fdac64d905db751f9b4f77102205e08172c787edb67d844c943bb23b5d3dbbaf63338c575f7cadbcfef2c87d86901695221021acc675534a946a71dee712db4c858831af257502b9c229d9cbf287df623db912102b53b4eacfcf3e2559f17f4d25151b05f42877475c35a1cb6b47a10a739ec958d21023e44d69aac2ae055d32ba1e2d10476787916870d0c1b710cad1008be4d717b4653ae04004730440220447f468daa08dee75e4eafa50c6e5c530d5ec7acf0b6e47cef37176280d9b1c402204431db6612f56cbb2ab82143bb327e2823f9dc76b1d3ee3c85139b243c279d4401473044022076b46f1a90ce09f5d02ad8fc2a9250a49ab90eac617d2b7cb73e9505d76a4c460220577afcbf2e82e5b106fb625e308c2d6aecb2b1561d1e44f751e05192d3132a5e01695221037e1503cf8131136d3a91b16b8eb608aeed804a3c2262a3529b8126653ad66ea4210397ea401633daec4745b822e889ac004f585f7fab2ffaa8962930b015363a65c9210231444bfd7256c7a30c1fd9f534eecd3fa3b417677cc482ce45a7cdd256db5f7553ae0400483045022100febbeb9b046d95b58b454e031ba6b5723dac768a5f5b07a4e182ce406581517b02200b6155fea0a041a915aff90c1aa9a2244e58d30bcfd4b4cf715cf4c51f8c60020147304402207bb15cd08ffd9836219285851ab791dc3d2db6c18f674a9953086ecbb66fd49d022062876fe00da56de7ce089dac6a118daa521bec29bd7137e61d5a93bea774baf3016952210203dd5f39cb3820f039a1050094f6e3c243bdbf6187c01b9f3911c1096d2e47882103d7c0642e00298e6b73feb7830bb1efd811deed7d7f7809edb80126d1b786ad4c2102faea4b881f978a5b7b6f41177bdac658df710951bedaf7ac9ea36816e54cb68153ae040047304402202626a9fff9c58653696e3d764f4386fc426d49a9a07e97310244d4b78d43cf8a022060e44bbf31b7b423444be180474182bfcc5d6c856060daa48e8bd20baf308c5f0147304402207652c104b27324b65597061d2fcb2f8f890084a9129cf0a68803f36607ef543c0220532b48f80ef10e1ca0c787ca9a35fdeff78c4748dc35ac66ca2064965954d043016952210297af2acca67971319210ac0b99bafbd43510491244a98fecce91777f6c34dec221035114518e33b7e47d736443001838face1ad7bc899249dd25848aed0dbb460b092102c69e871ce0f9fe67474a710cd7504c5b3e88af17644720bee6138eb5e609282553ae0400473044022039b499a173b7fb3a8ed80eafa84a0c4e1c2b34bece05e548cafd23675709721202203adb8e8c42ad6295c089c6c48e9e41ae05d23ebabac220831a8e66f4bc714afc0147304402202dabcbf7437081d447595b45b8aacb9bfd3b85a5741cb1358a936d758c10eee602203328e397166de6f0293ed45582b6bd74dbb73b10ee99117d9bcfa513effeb5070169522103efe6acae6017e4431e7ba22e047e0e2203759b764d79205041852e04910287f0210324ab84bdd343f36ad6581e975631f8a8b187855a6b041a645844765cbf0e80b821031b4f932ca596c21d84781243a1a56fb6984beb3f562ce6932df50d6b61a9b8e053ae0400473044022077cdb438431d07657eb830ed1c475b688db7f7d1a1ca5ca4d69ff30bdfa0e36202202b220a0bb5e7878cf9df37b9540ab938856d247ea3d81874687e8b15e2b15fce0147304402203eb6ac64f3b9bf9351830bff01d14a2f650594b310c56998ba20e4b3778adcc902207adc94846b21784f1d9232340ca84889602cd08c4ad204ebaf2ff0cf4e26975901695221028323a35f6b87a6470ac489e945afa6d94a17cc18304a647218277c533bb6f2fe21025df4fc228a488391fce26a9c740494911f4aa2ed50475e390e806b824a5f358c2103807a375478fd596dbe2d86cc5e5ea760dc43cbc1f3d85c3494f0d1a782420ddf53ae0400483045022100e3b1ca66c049edc1da182651c7288c0a8c3ff3ca152928673cb24e4dfe42516002203a5d666f57df43c0d4341d0694e83ba2f33bf92eccda9681b4aa409c5d6939d20147304402200ff710990179dad1fe4350dc9b480ae7e9bbfd4986b84f872996013c0791fcab02202721426af82b8a1d7358e5775f8b39e792fa8561861c0d331831b82091da3bed0169522102eae3e13722c2f7f092ace68ad57756ebbebba4a05b3eea96af7b8489c46fc7852102795516f9983ac3acf1d86ac499f7d08b6b823839c779bf1775ea53782a4ab57a2103011707c08830ceae04b68e45bcc17954b87850f072072c6cf98ebbd54c98888f53ae040047304402200f99fad27685c013e1a8589ac199b932ff99a1cf99dd8931f5f808d8e23751ca022074474a95b7245abc60f2b843d732f622da6c29864821b56f13ddc11f74987a780147304402205645451968c311a646b2f6770aec83bd449b5ed97b5f543fb9ac7464adb0452402204a0c7b37db5717f7001b464fee6c143eb210775b8bbf8e878f8603ed503929ee01695221028fb2e5e474ecc7451351adbd9dc4491c9bacae89a8a7845c0f6fc7d75846312c21033811453873d19b5743f74b7443c60064cd17664ceca00abae3287521da831b20210253bdbaef3b6debcce805e49aef1352ecde74aebe6b9d57518bf7526d12d3082a53ae0400483045022100f5d1c9dee6a8176961dc812d9082729b96304587db5cec9eb463fff67fea1e39022066c1291c1c53334f771ac9108f4fa5673a0d3a779369766f0ec8de1f1850e96a0147304402202450139006590303e759eee32f5443d7807f6bf7da0f356b0125cffb72b6698d0220696bc3214957d518195eaef7c658538060901ebf9ee34247517058a7961728af01695221020e17c2a116053668df267bff5dcbc121f8dc57cdc567836631470edc884a427421031c280fc5a303e2a0ebf7919a60ac67876c38b17e0167753e4ede4bbb895a812421030caf1ef66a7d4477ae62bfb9b550f53ad1f47e60303cfa10f00fc391d476724f53ae04004830450221008b9b34c9032ded0bee9935e37f7538bdee7464faaed148314f1f21ddd1fef661022038b4c876f70bac6799b9b34028d84ab70d336a79eb789d0b872b250781c9eb1301473044022052c02d9d7facf0c54261d7d9d7083afda86a0f78691d71c266f1c382a947af030220072f192ab3c14cf2f377a6608dda319adf24916f2dd4170e99eae3a49a84cb2b0169522103df717180f8ebd21ab7474ccb91520c6773dd78844933d6fa90b2cf0caa2456b121027cdce28df15c53c7d756859f10c9cdc32eb2c409839a967bad161c70f920649a2102daa995a7188c345e381ae1c27fe974140f89a2e4fbcf13fc2a2db69f1733c90053ae040047304402202c06ea7019d906756cb0ff65b646db4fc23aaadb8233375cb72a0da7da8c4a9c02207f14c65e1ed6348ca5ef28431d9c0991b1273690d9b079d019b23809805e35d40147304402201a48e7440bec2ec1bca5bf59304fedf1b45ad002ad6fd1f58adaa50cc2641fac02202b1002e4b1e5c4d6989c4bc9163aa9783160d2526c8576220a47deb09d031b91016952210365ee224b803b0d341e5ed036d1d2bc98b388b821ed33fc663bab999004a4a78a2102fddd50fb1fc9b3ccc71fbe234d79e73cd3fdb0b02328685e6c2376535b08280f210330bb978293c2befb7969e3d8d66e59a6d9e875d9e5d85d30eafba77de806822f53ae0400473044022029d2b90523e9f327a0b7271a1bf9268a0d08f81300e2908fde2eac67cd5037d9022067adbdc63d5b97305fb23001cd01880001363a39aeb85b61b3ec6c32fa06df7c01473044022001a8aea9fd816c013e7bb6eb9d9f0b0aa5c753767081162bf336fdbc76996cc802200386d95295c36dbb4c51b0eaaff9cf0f0058cdc0f2eb2d2214ac26afb03f09bf01695221036396dd3b40f73a9cab1e5b8707dccb939ca8ef9504378bb06ade18dc1176986121029066a3cae62850e470baf913dbbbde498832d3aa07be519e53fd4fa588d8224c2103f5b12a1f3edeccd719ca5a9eff407f398847c046daa4e120353a1cfa00fa526a53ae040047304402200d7ac69249a0c95669f004a921512efc5f8f7eb6bd3e2a93c3ef7bdc34e3c58e022071cff2f1c2943803dece29a4145812eb1dc07eb3f8df67193006a8e3ad31f59e0147304402206076f5eab955a519801b22267554f6ac8eb1fd3cca0dc9abb466c924dab4b460022036aac9f9a6bdcfbe9cad283f5db38a449d9081ec298ed0d8b91810e9c2baeea80169522102279f1fe5136b72ed1c21633b1649f47dc5c787017950650d18bb8dde434ffd1b210366fe3446a8ff229c9f73194e462c85d8a2ab76704d6d7f72e0cc614c4c27b7a12102d738894f74eb41ac4eb2ccc796c342399b1a02c0707b0618522f1238b4dce34d53ae0400473044022042bb0917b2897d615bfe7d268aa936a31c0c569379b869f8a9ebd64372b4684b022001fbcfacecba944f27319a9e71cce49cba6a96dbcf5d08dc84ab73fe46c9fbc40147304402206d09ee5c7bf35de8af7fb600bbb95399d5f8654bfae4085e0d0a798a78206803022064c089dbfa72ba93e541a0de08af8442d88163c90dbf45f3c5fc27529578eae00169522102d1d00be6a9b0e1f94ffbb3debad54d614945e6e2aacd8af202481ebdf19cce502103b0e8d917f4d09adc269ed79073aec650e2e858115b75fbee110cc6afb5202b5b21032cbaf739552dba4faf9dc908be347f510e22313c093ea957c878e8af46be45b053ae04004730440220363cff07a2854651fcbe1104d3411ad682bf6aad707bad54c926a2eaeba09717022002952fde60c7402135922064201fd690b9957ff9addc1c46d29280b84081fd8401473044022045ae680eaa868eb40942a4cdebaf5ebd7001751ad446e232373134ce1fc5963402202fe64d8f4c69572af7a28732eab81f8123a4257b6a6a082b2cf72f86e65d32f001695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae04004830450221008aff1975bb9cbfd0c539821d1bcd522a2d70181d3ff9a5801b884f22aa6882dc022025bdc5e9af83bd0ef14d3fd6fe6c88e6beb50877a092e2e0a60e95b0b4cc1f1501473044022005026f8671110125c3e0cd6b4e749df4ce1906842bf1a553af8bf66fd31f89a202202bb2765247a1a249309742fe40945aa1ca05e2ff99eb62caafe092b662ee26590169522103aac85b6af412fd58f3cc79e2b2de013eb930f0d020a14298d4b709744754f6cf2103fca5ccf94cd065135cc1c322dbcd607898c53261ece3c42bb96d7a13ffd92f2b2102857311e5e35037789a81c430d45b7464b3f9b409715057b111bea7ef7861b1c653ae0400473044022019d94f8c083deedf20998d0c03ed7840389153c0981a706f63554f23b96dc65002206aecb7ccb07bcb71fc709621ed8c23328dc4af67b0db42ff5dbb11357cea604f0147304402200a0da3552dd5d456bccf32c79ba65d4c2280a0013c9ccc50845b8ce141cbc258022036fb4793523d256095111071bd3f10ca64ee6ed5b7da2250d9ce0b8788cdac66016952210271771d612fc5145465c7539ad75332319ee9effb7fafecc5a60663eb5c3e7adf21032a1ceeebd6939eff8a8d9b2f12a1c030d4d0f0dc5c080993035ef17a9c291d332102741d1ec72ddbb71749b549bbe28530e12ebcbfe45b7be4bae1f70aad9e4219e153ae0400473044022055f10ddbeb7ef99cd72503971094c49ba92c54dd4677f07d0797ddb4187767ad022013dd03a682cabb0949cb821c190dab2ccb9bda26bee40501fbb61b96a71a85ca0147304402200498bbdc4c09fc0a8e3a62ec77765e652cdef2d94808f0a9a442146f63ab973e022048ec06492b34b2600f43e1c9160a2f75d7937df1eca2b2a6b33dc3973937895c01695221037b77e14c39474dd141dec6d4de0b1cf492945cfebf24e23a9516c4c3214e58012102c3729c679af5559f285e7cc90862ff730c1271c3b317f51d754107827b06b79b2102cd4439bc73b4e06c32744d4f43a84ec48295f4cf857c232b9908d4718ccc2ba953ae040047304402203a495645269d37af7d46091e200cf6c00ea77dbbe17a258ae114048f10d89d1802201e633cc5d4bbadbff7cfba0fdc0daec22c7d2b05b9ed5e5bab09e06372fa55400147304402206567f73a60ecfd1fa0290d665f37caa475c5935e5c9af8901e8cd6d417c5a54002203320b55cd05f16d5b2f2dbd9510ec50e02c66d330dd1a116091f7678f5e0fcc70169522103454b8c7f939393d8e791a43c06b37f86804b4a4c3fe17082889ab9d36cb376282103970b0e90454bf659f920bf123c162ff080275c67200a9ce25519a2331b3566fc2102eb1b43c12fdc124810ecb2ab32b5534b1f431d00f5460cfc36bd5b0cec2795fc53ae0400483045022100cd72b3b0d0a161a3683686778a895af63c57b4b1d206a60049bef069f90bc31b022046f0c2007aaa7fb89d13d517fd4a0fae55e986f8b147dbfb394e6a7c78ee56ce0147304402206691d988ea0e8f27611f97c7cc31d306ba1dc5e18cc72df7c41e227b4ab1f4c70220778d84cbf75a28bf1e8a3f2c96bf4b879c44f14ab7a82a638ab630eab49903fa01695221020f8574d60901add5174536fd22dbfa275cac85c54f893c6ff1f4cb402191af8e21038ac3c3afbb2063fb7bb52ee02feff063d1b19411478021d49797aa303db46cd42103b900345224f7ca5ff9d11a408c1ed26a3a576ae8a4bfc4681bd51b495a6ce59953ae04004730440220502d4ec37cd4ef23c80618c4dc0ecf756de000113de6ecc20b69a1031262784f02207e434fde5c901f3f2d016d9cf88ab75039f5d665737482d3f4190af6144b9466014730440220701b4df72f0854d9fcca8af18ca8d15da7a0615bc9674bf01e7aa59a7aad75f80220438c2999e175fd416ff5088b1e7e93a0a08485e8949a9867abbc15694f50d4820169522102e7d6086f3ab71899720dce21980be627b5f8f9a1c67ed4f6b9e95e28206f8d1e2102528a0a3ad310019ea52f0eff0b536b78bb1e649ada65fbb8bfaf0b3f634ef02f210237c539c07947c79e25ca57b5bf291857881a8395e327802c7449b7a61adc637253ae040047304402200221cef474530c78d65caee4b6fd49ff14dd3c8316e022005f79a3c5bf01198302203f65137a65ae1cae2b6719005e8ce487147c521cfae1fd33b9f9b39935f377c20147304402206528ce9471a9bf253731965b2dcf0ef5b42c00c479d924110ad98d8ccc649da4022007b00a6d2645013a75b5a7234c9104d587da1e6024a0696b2cbd383ed0cdf9860169522102c08dc9d8885c7fdce341efb5ab8f7b915b013e440bc12b0dda769b7bab22eace2103696beba63bc34d5f0323dc28514dc6f4960c7b4eee11d191451f81d5166ec732210296bd7ee411e552f84902af75d3f356514343f3ce4959759f23db7cbb053a535453ae0400483045022100de8571149944650c4968f897883ee1a666ac111a55f70be2cd15a3fa33e2917d022076d0fd0bb91bba5930ac7c495c936e66fcbe466c6891e06a2b86acefebd1c31001473044022072f68a4809967c6b4c0df76634774991fea7ca714490c5b1796dab1e95a642ee02202a6ee3e93f4e45b2bacd307a0f669b7aadc839af50c1cff14b29f0d3ce7c319c0169522102c4934bbaf533e980d8e0f2be546fa5a87b66bc9248b2420306e5f0ac5fc6d5db21039032971d9773722bad112a3a3a8be5ee73c2140cbc03b0711f1863d5cf7db4ec2102a06aab8dcd04fa73afca9e26dd0484c12a19077fe6a0eb377f9cd058b2d4ff2653ae040047304402200622cb8c293c07df66f1ec5feb8055f71c94756f8d47018ab469bb22f16d87ce022005cb95ba278a281372924c42fdc621fff38a31898bf9cd5f9afd0f32ff2afc580147304402205c7b7501b3f1740bf2cbe9c973528acc05970a9039a9eb0128619528ca649c80022043b1278b3ea3c8e414901714b8e24a7025b4c49e74735ac69e419fff52770d8e0169522103714efc3597d0e5911d24a1f9f9e018dc4bec00b0c3df18d34ced574d27bb0b982103308414725c41575a0a9328183988f66a3c13b57122019a446a189da3a6a004dc210376101c20e72bb97f5c5d80d9f5819bc93a64f8373a82ad4b022314aabb35c87153ae0400483045022100a122531ddd36c6393d67d99bfea9544d0b91eeef193d1c8788c26f5e45fd6b1702203bfe54801b15fa35af6b5495e5a7415475d090a72afadbd5b06fdf58311bd483014730440220781c3e2da2df71f8fd2dfa908cebdb412e637c881edc120285aaffb54fadf22402204a8eecb1d66159855af3a48404c45bf240520ed55b101567f939ffcdeccef4b10169522103b88dc31f8542e0710e1727c94c3248680641daecd3a79ecd19d903f1e53db749210288b15c79cbf654cc2f39de82c848985935696ec2512776721fa591e72e003b902103692233ea8bed9540ad03c0d85d9d03e60822245f3f8ce819f95b71969212cdb053ae04004830450221009cad990a083575932f56bd74a7bd11e36744c43f047af24dc63c54681c03e37a022033cd5d13b3e4a58eac32ac577f9fb1a7c0d5c5fafed38910cff3e21fbdd6b803014730440220787359c37c21c17681424f03c66ac471fbe6ee265edb1eb7849e0d21cbb9849902207e10ac5936487eba0b3ecab37fa636e2a5f64bb310b119230f16d4a3ea14b7720169522102bff6fde634bfa7231166121b52bce5f7f61abf507dee04915fdbdd32cc7269442103a0fabd07de2a7f9fcebd2d68e285a3b98d75c2b56287525762a0d4bfc910d55621021d6d0f765aa7a70003a7cf217136cd4240aac443dcc8038f1e1b810b4f36043e53ae0400473044022005bf50d98a6ecb156d65493456c671f5caeea515bc9ba64ff9e5cfba25e6054b02203707446fc528b9d130e0941e8ad42fc6203317ec1de7a24b53161fd7c29279040147304402203b1241572ca600144315830f1ac141835462d0f9b01199126bb5445e33f615c102202dda6f5794e8c0f24c3e04e8cccef036e74bffe153a16c229f8528180972c1770169522103abdc68f6f0fe50facb429b8ee50bcfc254d54e680fc72da7b0f025ea5342672e2102b909bae1db1fa57951ef5c66f0e13710c0085af47c333a9215ba88f5cd965e142103e88ff18953758207a6a1a9cdfcbb3d18e8794b6b61fdd2658ab027a8ad29c9f753ae04004730440220141ad28bee35c45391f0558db47bfcd1583d3dd4ee225243c2099c98ec89a06802207dd8274e503665f5ebaae76e56294347c67764b9ceb04083fcd5d7459880ac68014730440220490e8a45a24b556c7cad0de32108d0b16f914426accca1524c12e4f93ccecd9a0220301521c8c27d0da64b0c246a19ea09f0d5f624e781eae913add23494eddce901016952210385c567013f2289a518112785aea33045c0d0cd9e94bb537142025b64cfadc6232103d4e0c2e5e363a637689a3f92d3d0d707595bb06d3b2762122faa77397ec8941c21030d2bb4a7b2a34f55d15d3351db50680fa28c519de18259ef8cc2b9dc9ab3578053ae040047304402203cb3da61049d3857841be4fd4712b4b834501b8a8c2161acbd2bff3782167c0a022042601ad8872771d25913e9844082f50e676065363845bbc1fc1b7ce2b47d362301473044022019afd3e4f2984c36ce5c9698a550e6d929b26fc55c2fda2a2c94ca74b4d55fc802207e3a5089e488afbab230f3a451dfe33e2878c6358fdb5a7d4a8bd02a2feecd8601695221036ad27816611bf9dc23a4e8080df48062d283a09060aa1c8315fcad5305cff7f22102a9456ebc52ef96558d8b5269ec8262ad04fd7726745dd72af7955f76453e1aa621023589bd6ea336c41c62c9ef4bd3fca675b4aaa23273e25f72ce205adbf6a9b96253ae0400483045022100e1c1519958977a3bba4528e18120a0477d7055a7255d55b5b6467063c8fc2ef002201e4e0608ef62694e844cdb4a2ef35112c690693e316d9ed2bef041f20115195a0147304402207c4ec71b462af87f878ec7e1d37de6d6bb17381ddb8bb30387cd96cb4d029cf002204eda10a04ec6c72e50196c83cb9dcf10e4cf724e9d141ddbf5846e7f1cfd13e501695221026dc790593423924abf2cd0f9606305243f8fed63ba9d5d3b2eebf0f49473058d2103ebafed99092590de2ff038177bd4b47def1429f6bdac27fede3c16faabc4ba7c21037a6d203a7582825f515f47b58ae33431b37ef83ceb7d2a0479ffbef05a8d999c53ae0400473044022043b7446dcfe1374508ce49acdb9372ad4586db4447770fd81c6632fa81d7bfd602206fe28bbc01f22341345bbbe4c38f3f429782991de8f71039f58ed1f6750ff8ca01473044022037a420b17b8114477413ed041295c95a2808e00decad4da07ed745e0c3fb9e2702203b046b775533dbefc9b1a6a08f97edb85aa18678ba0f21c8cc1a22d2b41b27be0169522102af88efb5f832999ea1aac21be0654c47c516b84ce4261d2b756de48b3919bf7521039f1b494a7648139591a1324de000591b3a0803e2b244e249dad9dbe044e43fb5210322fb34fc161ffbde14d41008e588eaa7da29104acfd2140571ffba1da1ddd15553ae0400483045022100ce3a00669732ad2c8f888e562ed05f6ce1a9f9576c4ea8e25f938e58a16fe62602207bf5cb0d94525168039f33ec0998cb9b3668e58ceac7a75516f1e539baaa284b01473044022005cd9dad1b2ddb1c26dc2ea150a10923c553908581d476b5b3c8dbc5a0105e0c02206528d51dbfad5c5f85c37583dd8423e1f76b2ca69f30386a16f0078df6c54ad30169522103e410b8d2f6eab7287591b86d9d6db1738c230816cea3021c2cccc1828fc887ba2102fb058b56050b9e94053d8a027a93060fa106a8e802a9de8dd3ee9e5c05b59f3f2103df8d3d319cb66e06cf4867cd99df203e460f1985a6ba0a3ab256142c7b363b3353ae0400483045022100ad3b36514f9109af87c5bf184fb8bfc26a970de000f6b23fd9355005aad9230c02204a4891ad3e7db1267bbecc191f136325df2c5156b985e3a58580fb1fdde923b9014730440220426348ee600376157ff79073d366b8f14229f3d7104a3ca22389938aad72e65502207961361dc881832c8455d048cdd20b1bccec045a179325e92eb6e7d7355b26a90169522103222aa751338e4f9c1285ba0f8d45e437ee99672fbe97595d37c48e8e54b369ab2102f8bf223b6b413cb286410783200b4c384424142560c1d602a91987109af7e72f2103e8a0e221003726fa8238c8d52935b6e14f0d0cb57f936d83a0be649ffed8ca5653ae0400483045022100f64d124ea2b3549a62359a66a6adbc0f979e4469ce0bdc6be99f60081195ad7e022071150f6d0fbf54a35be554a14bc0c79134e86d647f350ed52a099505e8fe893701473044022014f63ac62be2f507c294d436aac79f506b240a635d56d757841e68e5ea2ffccf02206bae9788bf5a3af92112da4cb258a4dd6df76cf29e91f43e8daa2f1aee3b5f3501695221023b3aad0eb1268ece2f7886f21fd3f28e675bb3e9a945f9ba1fd98f891b1a4636210285709660963a7367d0e9571e43f5d2edfcda4807520e826b04008ad6cee5eb6c2103f679d161610dc9a1ea685935453d3ec7e1c22aad8a4a7d6229cdb194b739798553ae0400473044022049f033bbcad1b808d685f933993d2e60ac6aa8099ce5e803c405048f517803f502207068a3691fbfcac232c03ca5bf3b5154bf2fd48c71d4eb22b5598745a1d593fd01473044022061e986c5e3c1a07c7743dafffceacee460d35853ba03b5249e036556e71f2f4b02202eb71f5f4018e3e0e40a971823f996494385b0d86222c6028fe311c94a21f360016952210247cd0c10df4fd30b662ac7d83b4cba2c7a4d0fd630eb32d945bc3a4bfdf2182f2103f5674ff3315464cd58228e933f1464bfc27948b4c598c692ccf8b02496f3d27b21031bebd1835e5494ac1211877049bb2cecf06d98bc8e75d5c6cd28e73feb08ff3853ae040047304402202c8a2a65432fad1947959375c0effc8b8963e2d03c52b4a6d0a89d7f39d1890a0220628363b2500603dad65f312fbc0e82e429efc7b46dae771b4c7b8d03a048653e0147304402202a63152f662d50a2d19b6d10f2368001fdcb74d3e6a9da39c737c2e3290293f80220552dbc0ae4134403adcf67e3931a679557b6c517f139b9abedc71eb48b2ef3040169522102f14e610317166977418f49f9dc391af31fa484a61ddccaae651ed99ba5af558621038dcb4fb56f11bf28f9b8c3baba2655468574c7312ec72aa444cad738bc5e42c02102a6c1e6d3b92163b6ed2083d0ff4ad28744edc4fe015458c0342ba5624b1b2c4653ae04004730440220014681ff443644d1fd876dc826be2a1c93b7c023d2080a7830e77a8adb87f64d0220322c077e9c37e3dc38a2a68265702b0a4b360e83b5ac6cb9c30bf12d7da69ed3014730440220330d3b491519a70e3ad359a68bcf6cab6ad0be13da8136c571cc4a8208011fcb022006f3b8845879004b3a9e5c1bc260a9b3547f9dc08ae2e15f745f889c97a97cb7016952210345a9a0a119b82b4e862d7e141ad403e588574a544f8ab16787d1ed092c7406f92103222fcc37ecaab1c92d01e81eb2aec7ea38167ffcd488cbcd5f19df1678ac759521036897c0442cc03ffa1eafb0be7351edfe657e42298dfcc4925aa09feb107d4b3453ae0400473044022005dcc87d93258499de3f058e090455c117d9cd9500576f4b42ff44c4f0e808af02200a6777f7e7af6d5a2742dd84b8cc58e3eb1733c174c1d22adc2510c0d4b99be501473044022047cb173fa13d2ab87e2db65f6e08df7be1f57da5278aed7c04ea07abf6e7d09502207fcdf6036e48354e38f32bd3f6716eaea23a8cf6cb8f1b52e4156818f6a981fe0169522103a09a8862fb89b27d3c960434b073c3a119fa2f1dfc6b17a6ab6c6932d12ffca62102f8d179f1f2213bb315843024ffc6bb61870a63fa7a536ca332fc5442826534dc210351abf58c12d40cb9fa13b6b22da9c1c9302e416ad50dac1e6b09589b4adc05da53ae040047304402201b158a243715cb4df4c53731ac641f0070b75f028fe8bada06f4ac1ab275815002204e6c8e3af3b766801f417637646bde5622ed4535c102c236232096f8c35e0c480147304402205830799ab65b4cd4166ee42a40a7b7db33f6990d91b75af7a2b7229ea425a6e1022015d1868a0f0ac80098eb48074574a14fe3e03e268c910b90c82ec3fba80d7a4301695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae04004830450221008de72de88e4158e999bc7646f6d5ab80e27bb487d57f520d225d4ea4a1b04e4a022017bc4b73b5159b6330a6f8b2944fe2e75a8d64afa344beba81353e5bbcc1e57c01473044022060acebc56129f66efbedc1b1c95d4046ecf79b7875c0cff22556aeb118418ae1022017e7df9245096fc97f90492c622743f70cdbad5151e000cb0471cdbe71e953bd01695221028f76b714bb5278e6746e30d5da22df54a870aabb75f098556648cbe80b7e06cf21036a92f8e47478432bdc9146b5430f9fe6e7ba8bf479ee24d377a1ab74e8884a1321028b387829e0cfee457f782d2d35059a97d9d33382e6ac9d39f957bf04045e128253ae04004830450221008a25d2858547c8166a2c907fa0692fa84a81ea447afcdebd5f326f7966f50f630220337d958e0738d932bef7ece4b9259ee9398c7feab4641724ddd482bca175e0c10147304402203872a35b1e192d081ee20a59609ed8ba8e05c18643857c5097a675855cdf97ef0220171cef9d6981082fe2be193841fcf2d0eff0cc1865de309c873d061ba4b8b6550169522102244b577a7644c88779312fb924d68b56351af479d823d7107be7c1d1f937204221039d0cd349673ad8a6eb3661062d1f4f1b4f0abdfda6d6b8f43582aebb914b35802103de71cdf8ed5f7ab92c62273146717fc4b7374ca4281d8afb701440f4087fb1aa53ae0400473044022016455adca8dcb3b65dec5bbdb82defbc8c57f280745e7c28fb3625983dcd0a5102201461dd00004c1cc5209dd4afdeb41cbf5981923b9c792162487c8c6d2fd2df900147304402204304227f8cebd2f808a910d70a7ba435353d1011a34ea1a4640f022afb6497ef02203f44af1079bded8d8fec90c3408f5c2a9dd75f3efd5cb71950aff37aef4b7f97016952210326213837bf592af2e632453085fc2e4a787c9de1ddb9fd984467e185511d02f5210393ecf1b4f741919eaa3260e6df9cf5422e901f17d8c3d324b324824a1990ecbc21026ce29b75ed2df11eb708482a489e33b4a618400685bd476f1468d55d60a0d9af53ae0400473044022077de746b55496abd2e7526fae40166325e9018db6d63c5a232466eb388d1be1b022021ed4271724f94cb92964d7f48acaea0d80b6f41dbe6c16deb8a333d6f088fd201473044022046ee2bc1f30b6abeb75b4b664dd3b434d35634eb2ec1bfc28de21b2f8f8c817a022016cdf68e02c4923c41523130cd19a4b965656b4bafa7e2ca06c94d06268769250169522103508711e59fb2f053ff82560f2e98f9aa64e8fd2c572c9b73b7fa06d98dcfb02b2103957c95702b22f1f9562ab0501348729c5f4563436c3473ffd0b46ef255a5ca0121030f0de3f979c0c632009a747e0f89de2d33400f5e130a8f3c235c6c27ff83757353ae0400473044022031c0e3f1bb5b696f7e78d607ae93837a5455e875c7d8af9aaba60d6831533b0502200db1a6255804a6cc5a165f69c0818b04cd25734cf01d4d1ac0afa51b31f1ff0401473044022050205f646e7a5da96572299a5b9bf839fff5d2d72f0172acb812cc5ab5940587022071447c2667e945fce8d0af85eeb607e15b29927ab8fb89eb5a009069301365b10169522102326838964a51aacd1130811888447a904b5d1dda841e2957d79e91bf1b465cc421033349aa628697687d6c7b6927a388da29a2fec433c4bef33d95a3c7956eca74292103bd87cfdd7bf79b3475322a5704c307f2e1aeda65335547b756be26815863d31653ae040048304502210096c4c8466be910e154358fcb8f54cb3ff02016072c39915b2e8b2749c9d7839702202479fcd91f1b99add1dd0913fdd273eb5b234c42cdc4bb90258df3894a6a5be5014730440220063ead2e6dc5ee4b72f8a45b631e6decb165e8beefb7469ff128013734036bfa02202dc9ff3f8e588a96d9ccf90407e953906499e48f605c521851a3890086674f5a0169522103c9651ca10c762783d3bbb5a7268b2b0800854e0cef355e42ebbcd9b8b9416f9b21032e38cbe9500483ad31b9be806b3d5f7cbbb6439bb438cdfe37c3581f2c84cef121034cbd60b098dc7d7aff70e3f0df1d971396060f5848ff2ef6636e1045789e97ef53ae0400483045022100bcebe4bd2125093f848bcc15ebfb403cbbfbdce60a3577496336e5f7962b17dc022067a7cb13fae4d2c8cb7bbb095157bb016ef8f3cec9cab67102f07bb0f7dcbb220147304402203449917a81079a65c17d81a05ec54ffcccde445d052ae1eb8d985093e4e5496202205b537618190363e89ed83837a9d63d6fdb303e809f4a7d60c303b65a1851121e0169522102533d7a856c7312672ae929d5dd521b1966ca1f8df9efbd78fbd10e12a7a567152102a14c27248b39d60f5f024b87e55bd49e05efa86d37fae0ac46f3c3acdc4d4e65210212da932ab9859522753a7da28971d423adb4877399586f3e9d6aadb139d1a2ee53ae040047304402206dada4b9a4290c7667d24407184a0b018127b7624e0945e6a1709014b3f76c6b022038142d82931572899da76a24311c213a356e8c6070d50a8afcfd65b58f0286650147304402202005db4f9b4ece15b46e0667dfcf5d0462921cf9bd2a3637f5ca4e052b21b08d02206b66047891fd61c4dfa5161baf3c417dbd27c68c3acd59c54acf989e987eb3ba01695221027f36e3546d8500a55b9025ec855ccc7e490173efa98a0b429ec018a2c073104d2103006a0fd2f41aea627ce305758ae7e0bae2eee8b26df8b31620b9923a2cceb01b2103888c3a81840527c0d1f964b29aa29b45455a031e20c5b1cd17d114f82c417de853ae0400483045022100db3a6c73c8bbcbb7e38ecd5594bc774ea136a8966a778fd0577191628528eb6102202c8e15a34f0967c9cba3d9173ca2966d26eecb9959404fff00da39870eb0fb190147304402204f65a0f455bf8cf2f3ca1c4098177e0ac4e7f419edbfa57c57716596b7a0953702207031622e20c08c8856723e2da955491123b7a06e0f67efd55d0381d2ff05abbb0169522103830bb8fb8c14a4613bc456c4e166f72f447c2777b073056a701fa9f58b1917e7210252e036eb4a8b8b481e8858f0dfb127cfe118d9f0c61b4987808de03c448137542103387fff38187f57695fea6b28278a365b70a5c637cec9c26d714bab22fe52bfda53ae0400483045022100b9bc6dedd41365b6324a58159e1fae46684ae1a61fdeac1e7fef7d9521bb7b4b0220104a27faf82de55082ceea1aefa6e6047246cf5ba90320d20405d6c6fdce63d20147304402200a16507fcf83f03c5ac0e513d44c854ea1c4c8b64df3679f2554c40644cda1510220037654dac557f090fe31f6b405e688ad160c54a2a6844c83104e849d5e77570a0169522102aad62fce231ecfaf8e626a438913a88933db87987d38c1665e31fefb9fa26b32210360bca986bf025d238ea58e58fd8ae02d29ba6241601e30e7daf112477e6a8f6421029edd42b56702f27bf6e00b1cf94598263753ff4a73812f5528e9bfdbc393867d53ae04004830450221009c47db5a89671e3fe17a6681d2d3237d74a3cee7322709e9f7518a22fda7f8b2022072be6460b475244f0561dd36bd226622510b9b7522ea3d3683ad293b40bfc9be01473044022067f99ab1d69ad57d57e7b5f8232bf80d6099ad1ca2eec68e6cc6737408e78c2c022039d1b34fed4720c6859640ac6ac18333a47b8c789463d24171831158525e793a0169522103abdc68f6f0fe50facb429b8ee50bcfc254d54e680fc72da7b0f025ea5342672e2102b909bae1db1fa57951ef5c66f0e13710c0085af47c333a9215ba88f5cd965e142103e88ff18953758207a6a1a9cdfcbb3d18e8794b6b61fdd2658ab027a8ad29c9f753ae040047304402205417bdcc15bdb268bc53ecffa07b4210b62416b462707b726096fd03c052d8f802200cf5959ae87f9f35e45ebeaf24478723b5e4c954b9703de5ae26c376e99d841e0147304402201854873c95d0e56c07e6e5b12623c84bbcd2784c81c8a2e46463ef293edb9db4022010a2a5259683f966834bbe834df02141903d83636e2660222408c669537b9ca00169522103d636cf4588739e35025111ef92a450d8a4c43c04a559c7f9ed7c6d73afecf3d0210296d6b5438965f9447da8e0c1f2a94c3ae3114115aa0651c2f4490da7cc98aeff210308675b54cce6f574fce5dad5fefac2ce52b5a9fe4e24a8644516c352083b77bf53ae040047304402205210eaa723379725f21c0bb6c22af59d684c165e50e6924253931d6d30355c7f02201dcccf84be44f9b57f9864019beafb03e7430557345e6b59fa565459a489f11c0147304402201f933134faee13e2a869f2fa6c8a8953670d59c1cd0ee4dd86b63665de6e8071022048a5d1f7c9c7faffb97d98936ea2004cb35f2d503986a0c28b384b4c7ceb132f0169522102b6d8013e7735dad1c2b55a914ca3526df522eaf06b8ccd028a9379a42e30c98a21023fdc3202867cfd79b5b37c44993f58a023af220d6af133d9ab580936fa1b91d52103a1ba0dca09922d87d1365b000f030e7889a7182e9698871ec3802b8d34bb24f153ae04004730440220427f55e52849abbfd1787aae442aaa646f9f141f7e9d74b5101ede957463845f02207ffa914e71ad14cf406a348a809a7c0cfe4319bd4e5562015f4ce83d96b55de60147304402204986f1ef4af0971dd1383e81384d6a5007bf5a6626a2f6d507b5d2962c6b5dea02207fead98680a8199fcc1f22d93468183c4019969e10bc46c1704086a8f9cf1b710169522102acb13bfe70ae73039f050a42ef5d3d03f1f0057ad113ae6b697986898e1de37421033cac3b700e2f810dd1b54e64a1b0076a2a0db986778d0fdc5e2a4baaa40e22fd2103ca250ecd0c11ae0cf956296578832819e4c9a2d9a150923287acb5ca68efad1853ae0400483045022100d0c2336ca80118905a1160ea9aafd704036664067ec969ffea3f22011c15dd4002205c0672e2c28e6b7eeb6279a3595ce670c5c5309c489bb3b8594cd940fadb352d0147304402206f80f2ebc621ec8d142f6f0e2f2e9f079e58cbc452c48ef4e9f70998c49e56ec02200127dba7f9df8319620d6eb8bba31fb860dbe1f48bb84d3662355cdb0a989f1b01695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae040047304402203e04cb4d13008ed70ff0371fe0d9cd08c65f78beec4d156b74e772f3ddcbe2d2022008345ac125df2dcf2fba99f737ab9ec9ecd5afb8d4f56783026e407dab9032af014730440220732a926f50ea7d266daf85017b93809eb0f79274321c77b48475977783c57f65022011fd43e6b031b16717521cfa4c4ab473b528cc7c59a1e8f6015f1443f1c2a411016952210215d0178118d70a8402b4853f54ed0fe6d51cd01dafcded04f035d7d79632e2ce2102511b465671042fca446d938dbc6b64ff6462d9970dd50260268a376f0eab64682102c3e3b72f47af04ed9a1e128b0859f214bfc56f052a1ab65806fff203252bfc2053ae04004830450221009ea4fad89797f7497d63b8afe3e4f70c5fbfe40331a62876098b45772d6c119702201dbacebd7a724c3e54cc4035fbfe286ed5e9f23dd073097e42676a94f1b1aa340147304402203982e97cda15f46ecbb9cf71bc5d8caf46e90f31349f8253d5934622331cf2ae0220513c51dd0b9ab82a0407db3c552f097c5e2281ecae3fc631e3cfffb008ef6b2e01695221020d277f2e85f87fe4d11a9edc3fbb3323f14c017ab01d5a0ae72db7acfbc7594a210272fad5fbf4d82ae0dbcafc6919c4544b878cdc6319ccbc7bc0fd5fdf1a213bfe2102e352e2c429ca35162c201a0c6a560bd09d2af041935aea7e842b4c50394efa4b53ae04004730440220487b7e3109bad44b6c4877ce15d779723b0900ae00a7239a2c1f1fca377d1de802206a58818a5da77d0150783e52aaf9b83abe2d8fc2b41a24b2fa413c541bd28c4a01473044022036e757c99b4f5630df1d41360de5c8a4f8afc63a12a44e3423e71f62fe0da1fd02205fe14f30a3238b98ea8e042200003b513b170f15d2d009db1985af3cc2a9d0ca0169522102dab3b1b1276b36f7d80c2f11160908fe213d6201ca455924f1a9f671873e766b2102be040b27e21112c21acfec304a8040c9f46343e1715ac657966e3738872c129e210364ef76174182349a1bc984c9632f42e4a3b2f46c49b28609dc962e948e41960653ae0400483045022100b6ab54ddc36b3372f3e922359cc2bcf857ef66a8829475a197521e7d1054c4a3022019f2d8e88cd1cc3f43e09702b578a80b4cbfd867c90c24234f35e99b4f146f87014730440220563818070af2e5a2363d7228d51deaafa52bbae2fd6ffae16cd315615ab0c41602206112aa957b308cc2f3538148be9a422bf30c33682acac05c63205bc8d472480001695221020f206ac0cae25a33e4ab48e6cb1d7c5a8e75ad0ca6f8b0e6c182d90e118b929c21031d783169bd4f1b44c04adcc93f5d8263f4a67ceba8cf0c976d0ae4046e8bc7ce2102e4e86afda179a775c8111e300bf40368363e1253c94fba87a25b8f6dcd7533f253ae0400473044022042b3ab22c857518c7f179dcf43ddb1eea0e20dd81d9e22f86a24f706d0808fc602207c258665c220ec62d7505f125b6423b1d0fb74403f471f351b16d2070849e81901473044022079043e5ee32e3429fcddc2ccf25e953261f84fa9ae75473bf7f4650a1657e77c02207c6cd35b41ab4041642cddd8d474a67f1b5a1a1b91a71d3d9341615fc2a0dd790169522102dd9e18e53d67df4a81e5ccfeb9aa0b5881db9e352174b1150d7fac2b6b7ef4d62102a632c57d4c99a467376e335668661850ffd97149358478fc834ae80367b0ef8521031d63622ff527e20a0c7b96bf9519f403b1abc7bb3dc94c1d00c7d930ae94b04253ae0400483045022100f7a8ed941c253a5a118719605f34c65c8f69e0ef42f57a7a6462cc58a74fbc0702204f6318450448e4e45a0611ac1c1dc600728a2060c0992305f749646d3bec6fba01473044022025b9651877137cc51b1afec819933c8b9563f743c20886153e124721d20fb139022048847bbee8a4ab015e8242dce162616817594d5ba57b123bd50a39c2858f9fd10169522102d34dccc79ae54c87c2c48fe997494347daee8d353abc82d61d695ab2999bd69621029747adf732fe3f6584d2b813e94aed536039a4f8a266ce85ec604ff08d38b56e210352009f4eaabc7d1b236db05c1f0b488d0d0ebf32e14c753727ea98fe6122aee353ae0400483045022100d7e0ef266744c811102d664b45078483a56206a8bd42da3e6bd868c0f74d8af90220787a53eed5d66ef9d54d57962cee22260e163a6c792262b3ca9000566c7b6be70147304402206f49f3ddf0bc708a7ff26639b6286e9d8c4314e84cdceef2cd73f14841e0d3ac0220045f3da1764b44b87343647612469702269d8284af57e22c631349e677289d2501695221026ed71554a666f3b35c0d5ad75ba83794a03a45f515dfafac6f85eded71cb70e221024ea1c7d94faae3c0d2ac683ec64ce0818440fdc4a7152305a2daad0064096dbc21024bd01c924eb0dc4dbd6359723a0ba7da2f5f6e522ad964e0840842ffbe66c5ea53ae0400483045022100ec7fa30f8bc7c0489ff74587dc62e7bc59847c4648b87cc210c04ac5b122d8be02204a73d502e56165a4a5a30fd15c45a348de8e249102d4a5e05f896c0d623c32cb0147304402202e075ab625065af0e68ba8a1c6681dc3bfcce2cc5bf487e8c150a420e9d4920b02205593402f2a0486c2c23c91a75668c627465311e9e180563ef0720db46ab737a20169522102192bb1572f7c789bdb0493d5b3ca2c769332fc4b1830a01e892b396957f3ab722102dbc077d2d36dfc743cf53cd27613a20863398a91b62330ea4ac28fc5af75160d21038897480a26a72b7f567af8570aa375d28d00426c078734105a7a5e5371d5930c53ae040047304402200ba139557bbaded6b9121fd728a9c4ba3f8677e4ab5e395fa998a175216cbd6402206a5ae56e29b509019ac0d9cad50210ac35c7ce92d8d956e0275329e1d1156b19014730440220358e379a4e40379af9fd213059af163ecaf5e9d070d60301d2cd2f87f4d32a1a022012bbf4766e1ec4232b95c3f503e0296293d7e16d21869746b757fcb08db6aba90169522102b0a43d951e9add5e17e19fad7cbd671363c8e2522203d335020886939760f6f6210293111d9525568d7637fa48a6f9adc0c29f253c516139c5691f975a93f422d25c21025230121a72d9b2814d2db4a5e5b3b2650d4024e354bdffc1105ff6011cb44d9953ae0400483045022100c2092963cd44618fb6f4f7d34cb05dfea19f5d9fbc7c05c685bf68d705f4ffc4022054df1c7101bb3bd977eecb748b91ed05cf036dcdb6335cc788d07f8f69e1a8ae0147304402203f54fcbb31e9a2a6c60197302d02b393228bb2367ee5617ced7dccad0445281c0220601f900d05be2de6f77e8c90b3358251a0b34732ce618a77d5aad773841da7680169522103a798a43b543a4bd7af003c8023467858a8e5f9de7d6ba252403b83fcd4a81e3e2102ec67bfcc73b6b27d1013e91d0185841d2ca980857d5e5cb78d63256f6047afcb21032cd465f82ecab46746e0e66f1d36f9f6779c7656160e6fa8e2305a4603a5991953ae040048304502210086cc962a62972e79184cf0ad22814db360b34ca787ccf4defdc8945e55c0388c0220580cbe9cd767268585786d85f2a21c2d34ae2c3fa438f9dbf8445cc39b744614014730440220524bdffd3ccbf8245f9f4c3a36fe95b1fc495662e7932a47cc944811386416a7022026e865f22a5e2821c904e230f4353aa4f93b086c07d779a8db063e41523c2a470169522103ff866d25cfcd771b34b58d2d3bc5f807d4e51a6557312e3d9a4ba5dcfeb1d5502103a72fc3f14f3a80be572d3e6cfb5a7cd14f269f88fc22bd55fb36ed3d0de93840210203b5d29c9ffff4b035ad76b24e0f311366234016dd075dab09825e3e6899a9b453ae040047304402200f15d9a1b114319c0b640eb53a24df6c2ac98a5a23ef38f8194249733e7c1ded0220763b8234d10fe0e168a9f173c18ec79319ce4d2aaf981c466caa0a2d9d95484e01473044022044087de16a16d75129de52f45cf745ec8fe1c4d9a0f03e3ea1badf580d18a6e102203f6866b587b317009679e891fbd96688d31e2e20ad302f19ec48a371441aeeef0169522103ae89a6fca6d0f0b39e774cdf78d42613bcd3d9c6123ffd5cbdcb93424b86861f21037ad9e2ce63409555d90e06c2062c544a37fe862de647708a26c22972b8cf2bd121026a2394c2c988c7249b59643c8864cd26e40c849333053cc0e13f29df908ab6f053ae0400473044022030ccaf54745d1e743ae9344d190ae298374872af6b6c6d413ba0727b2f21422f022075ea0f156652055fac7074cc1ce7e5d220073cf9d09d11e8af0aa7fffec326780147304402205676f55469d42b7fcf5d391cfc137bc7319453cbfc1c7f01f08f5fe164186bf302200da41338af09b93813ba2e7a61250c4c22a3fa39055ac2c9bec6a81d94907ca50169522103a6a7e13c5ac6538ce70acfa61d12d534c1b2b8d97e9f3167869679bf554b3142210252ca7e573d47602a0d78b861d5f9be8ba7715f3cc432f6b9b48e8b8f7d07b0ad21032a42894a10635bd537fcbce112b9ac20819c9b5af04b679340a6e20b045b799c53ae0400483045022100893079748a4f607e9467b2df3d92eb89833484e8aab2df2b9311c00f9773b2bf022071b7ed0c2e6b27ea170272925d3166725b24178c0200bbf1836347330b7133950147304402202a85613cb65eae9f6d53ad3989b170fd86ac7e0cfc6a9bdeeecfa68e863615550220141ec8971d6af27144a3305fb093a75a5a973fcb204aa5cd1315771342cca9ad0169522103d456a46afaca3c9779166775d96ddae37a829a52952d22e642d280489ceb6cf3210265b1e166257f9ce8fafdef0a81424f62244782f780ff376e3f04f1e4fa2a57ba21022fece0a26ffe055142666caf2cc3b948abba0c2ed6639ce08d8c70f4e31bfa2853ae040047304402204ac9537412c895746bbc12a0b488f4bb4a413febe617ad081ca765d3bfca6d5f0220420275534856b9ee95de160d3b163b9c9ae3da70845057cebbcc354f75a84b4101473044022066391bc87176afe1e3476215c31132ff67847c62321fdcc49fa8aafd681d6b93022033d4bfbc078fa4f314f62f3ea8e76a40065f49f7c8c14092ea4ecf929f6ffd6b01695221034bcc20c1500bb5f1fbfc415e6c9a597c9dab746787d1a99bd9bdc6fd082676122102452fb4cd49a4577a7f2124293e88fd9296c892937e2a415b2bbc0e58c217a69b21039c47d21fca376655cb47a5b7d89391d131e408a2c4da8aa01faa3a47f85ab2cc53ae0400483045022100be708268c4154722089e4e4c90e64f4847d2f3f35c24fd1920b3029e19c8c92002207393951f59beeab6ddc36fc0e3ba7cb13a6ade07ee05c4721f9344df2eb0f6a1014730440220044f605c79d25850ae56389cc9f12dc87342ff11aeaa394f68506f1dbfe706cf02200b5727fb365a81e62e0e6693aa86c2d79a7414ddcc8979e2d4ab366d19fea4ee0169522103724115c03ca72f73078b6ef266f2a510c50e50cf4cf64fdf855d00fa23e384de210369e53abf51b90e1bf5e9c103541a4f3e5f69a9eeb632eabc3819165be9d2e7ea2103eafa762534ff1f73182427481daa158396bf31180451ef50688476e3c45073f553ae04004730440220762220b970e78a761ffe52756adeee6998379d22903f2941302ca2fca28a531f0220701ed73a7e1c3c6758e56fdbfe850c68224caa64c6d3d3ee551045c1c8199f440147304402207f7ca4cdfc04a6db84e048a4b43e73d4fefb36c03b9ff80f64651a6e9095992c022053aea63202257c7719680be6429825d2072e76dcca12da0a3ef5fabad5b2237f01695221030e87d2359af3c49240195c313040ffbc579b2f706437925f54fb77e717d3e9112103454d05e0126ab8588c5d3bb3da13d9b50269136f65b07afd0a0768764885297821029014f5d89c21d2ca630fb83da0051472aafc7c7317da4194deb8754f8fde0ba053ae04004730440220783ba10474f48b1354d32378e5702058573e66912cd0c518c1f7b785e64c3e7702205b700e79b4f6260a637a254eeaa15079a57be2c3e9b9988bde4f326e0c88fb690147304402205e7c00f317949bd6339cd5acc3544fda3e36953d2cff99f11e24dc541683e7ad022013cc4c8c906e26ab59e81fc02ce04f042e9ca765410e30fad8133bd0b10688b60169522103bea93bec8fb4c48215438414c7c7e87700170c8a965b889eaf20497b8ae408f021030186d8ceb070a3e44b6422e6dc9f2bf9cd663765caca62ed7cf8554302bac26f21024dfc7211db6fa20950e318d24e13c7032eea3617eba533d55208d18b7d07322853ae0400483045022100849a5ddd587871ca730447a55a4b467c4d64513c5fdc28eefdb9851d4369dd0e02203c88044486091fa65a18b4d5de22f421603a3770ce3b79f33fe05cc1192ce7350147304402206ab7bf9cb47d3b3db856e3f5c2946ea2a5015728a4e3b04cf3d8983466252412022044b24903bdd1562fd3e9e525639d0df6d91dbd908d0354e37d7c9a79383d62850169522103ee4fa05d8ed0708014fa87ef7f45e83249baf1f7786e8fc89e818480d88d198d2103e26c0a19567b55f33fb5422edbb551130503ac7906f69c73563f91c6069e0c0a210237795da057f46403f4a9f64ded18f7a421731e88126d52363209a6e954cbd17b53ae040047304402202b4183d40700b6c7fb5d27e1445e2b3ba1771818c480f147f7005c041284ac1e0220111aeae0631fc8cd58b679b6509da4b50fd0f581e56a159b204b1531059ca82e0147304402202597cc8130fc36c67665f18925f91d7384c42bbd6ecc991cf2ea6fe7b15e9ae50220595e2500bb444165c673788e90c23e670f84e1856748c898f6e99814c09f5eec0169522102b1c678a91ab267c2342ef8a4ace0b713458ed0391fc54e057e90a51da68700fc210214a7aa7f59acc75fb88f350b655e472c58218ee404e01a72f1e8c3ff9c139a492103eb79fd02d6ec177de8c9c5f130c55b6aafbc548f145e849e6bdee8b838fe800653ae0400483045022100ac2a4a46cefcc214559abc20c8f8760e4f1e1626be5dfe058bafc17a2d085e4d0220571fc102681da6a93a39611d9e7f5283f4438bffe1db15761b4225b6e7576e600147304402201acef69b80e094a831e6b8327d90a7840e2fe33839f0add30e93439f9f51a99e022074070880abfdda9023782da3f4201216831ad3e9884dacf94017b63e1674ba620169522103a0fd1fc36b4b1f8d9fca7ef23e8e5331b6bd6d5776ee8e63e64e0750158e510b21020379111f4edfaccbc34beea4a0c7b7a51bb1756f5359e836acfd04217b7933c02102f5587360a5b969a04f59be3790dc6becf80d7e4ca826f8e1585ba54e630e6d8153ae0400483045022100f92fa38a4d18666bc2d78bdeb28c100ae70b07f668c01a1774060bfb527ab3630220149019224d00cd17dad75a3ed586e6b91c17207097335e6352841bc13bc5eb2b01473044022071327aada9aaeea54dd0ca26cd174e87abf968e6911a3d854d741959ef65584002200b26dece989d60a348802ba4969d7bed00611bcfd23b63fe53f6e5fd1673a3a9016952210349e368203c5b0b0f2eadac444e0baedfa8205bb241324d076a93fe1e5fc0f0ef2102632a630811e9e436c79ea3820d8cada9a17183ea52fe701881a0d234ca1fe12521021ef4dc98122c4976769560680e55aafea9db27209a4959bed0bbd3bfe2b5b74353ae040047304402203f2b83cf2e664729d54f9e49e2575505114fcb4fbcc84468c029aed40b1f08e20220040572dab369c33c698deb63c442097b91a103cb82e1a00cc33284b86f1fac5a01473044022021dbfff1bddbbb8078aa0204e850dc9296c04b76f287d1183a4215593620732b02204eabd52560ed25b2e0cd3fa5b953d38e1f8bda7936413e036270b114bb7ab32d0169522103f1e86296be6879b3d800459ec5c0e3ad8ba4cd4ee2ed24c5a84110c741e7061021024b1779921c61de07d5ec11c245220dfed31acc3761aef2d5421678bcb1ff63e621033e0147e80d07783caff5fdb743d9d8b270a1e8e870439a9707a2ae6a4c400c0e53ae04004830450221008e00e37e078405a821c66b32b6593279192f766466ef40e8f8eee5ad60ce5bb80220046b6825d798ef3e6d0a794d387e79753b33489ad9d72251e1796203495c10310147304402206c0ebea7cc5ad30748dfada71671f38946e893ff274ef2490d3e6bc92d9a32aa0220589cdf2ec017d9090ebc846103e4810a77761d07c668ec44f8da81ce87ea1d2d0169522103201744c8bb2882fa87f919f08188daf8515b3e298c547c3cdb824c96350a42e321021fa3eaa9e0dc3dcd054181d9e090bf2b61d9cdacf027cf5d4b89270fac63e55e21032e315fdb40d3388a8936cf8224bc147abac3f89d092034963d515a6c2f7e745f53ae0400483045022100fcb0def4d2a268a2a6d11c03864587d6813d2217bf71c5ce0909ef9f395c4cb3022014404656d37374ae3faabe20d83ee51402908d8e2dfebdf502312b0cc6e4a66201473044022030e7ab0b29eea8fa03abbd20a8be0466255f7e0e606f6f0d14ea3ff293f56c450220601a085e25fd80d6191550644f06a25347ccf2562b87a0e27c577e75e9d47f7d0169522103abdc68f6f0fe50facb429b8ee50bcfc254d54e680fc72da7b0f025ea5342672e2102b909bae1db1fa57951ef5c66f0e13710c0085af47c333a9215ba88f5cd965e142103e88ff18953758207a6a1a9cdfcbb3d18e8794b6b61fdd2658ab027a8ad29c9f753ae0400473044022060897db67b11130cec21a9e8a3bdba52197b0598064fa9e8a9bb369d47e88ddc02207ec2af0920c925faf2b3466c7fd1ad77892086e93b594cf7d8b585d80130729a01473044022028ef134497e07c31e968ebcd786952fed8ec99f4baf6bb363d1e863521b470ff022001fe0c79172abc6ae2fd6d0cb7bdccc1d4c32cc2baba38785175704d11b8efe20169522102c58d186f46b1c642d9125088811e7e6abc5563dbd3b1de2f4958293f00364d2e21036036a2a753182443935c65a1b2c713f77eddc1cbf4b64f4341a4a3a30e31eef62102282269edabab609d4b9a8cf2d0d99f09e9d667a7d4eae0ea0d4061255e59570453ae0400473044022073b5cee7fa6f25dc00611272e42b366583131a7b832313d1c033f0b8f3c7f0ab02207f798630370992b6e751d0ce0daa200a13844d127a9bb97970b344fcf409540b0147304402201ce2839e242c9a18f5ec48a7812a8bc49d6b109aee2598fdf70608c595367deb02206b51586bd3dbc6b22b8f8286bc26c9490f542dac230bd3f160b9ab4506fb4fec01695221031bd88149a7af7270592b85a393ab336e6c533417446accecf68b071298d4571521031177ba3f4168134f907a5ed9b6c8e9d6eec68b1aee540d92f4ef12a48ef5b44f210376714263f2bd0d4faec91e409cb446f8fa3f5ad663632ad82e4fe32519ae1d2f53ae0400473044022057ff2b7474ba2244f1717a60aa053b508c7cb0acf871c629344681099f6d1a070220213b60042bc837f45bca07a77b8b88f24182288edbb096b8e33d8d692a374b010147304402206625efa2f549396e2826a5d6ae7dd13ab67198356f81870233632b224249b8870220365652927594ad7da40e1ffdeb7cd0ce7e7e1f561030890365d7c5a9864dec4f0169522103faf6f02b15c118a2ea803262dd9b62fa2911b4533146aff47066be9f449bb5192102191cf547ff33142550f9dbfaa381d89147f354315bb2c15979777d4278bd6b012103def2542549c48af7b0973b21a12db15b429687c4e0bd93dc57e05050f6d9dfe853ae0400483045022100d2da087f18c7314cfe6c8f1319b3c3684c4b63aef72b4fa5e460ed49d0f50e5002207d9c791f5edc1d9991b719ebe3485a485b03fbf2cf2ff455188473540d37fc8b0147304402204e2c4e78cf60199c21914bf55bf4d6649e08e5d7834d5b41f060c33e6e423efa02202a8ab41a5f7d96badab99dc7b610fc9442da661b29f69453bc71d614625c2e800169522102b51b37759d8d99b650987e0a4bfa4563d53562f7e271c987af775a3c7f1cd1ca2103beae8b1f27d19002899d92a46ee6b65c48f76c99819178cf167b40530c95a98c2102d0a2210d6cce2c4f4f73330f63691078f9b4044be55842526034664f0fed901f53ae04004730440220245c5b1519498a0598808dcafbc6b195a42aa09ccda0bd6b7154d6cf0ff9ec26022057c2d90fd64a5479fd806ed9bb1938bd3fbedf701ce570cce2b5e413e3aa810a01473044022063f63dec881f7db0e7af80b9a3817152095472ba899ebf3f924bf4f04097ce52022014e44852b4d28815684207e8777b672a41ce1ed9018cced6b21092937902b1e00169522102bff6fde634bfa7231166121b52bce5f7f61abf507dee04915fdbdd32cc7269442103a0fabd07de2a7f9fcebd2d68e285a3b98d75c2b56287525762a0d4bfc910d55621021d6d0f765aa7a70003a7cf217136cd4240aac443dcc8038f1e1b810b4f36043e53ae0400483045022100dc51749b37b74478ec7b2c1dd01a2e1d12a2a95f01b8192781a3d383d3b613930220414c4c498a00bc9a7f4c1e7f57660bb5dc8fa6caac783639115995f8664ac8a4014730440220134f511f9cd3eb067de0511ff738f80dd04b5f2593d073484f21775a1027163602202a421def3f81ae80fb09d04c10055b8dba546659184c40e9c041b1b1872a2a6a0169522102ba6ea340ff68d97599e007eb531371377ea58d866abca9826231337c34208d5321029ec75137559a980204be1572b46da30e9af87951e571b7dd501fe2a54c301d572102b750943726f34270a16f2fdc94fcff850c8dff61aff267b7e00cc373f9eacc2f53ae0400473044022000f91c58ca889b0233e409e38c0968aac4dfc2c2fc85f9d4e5a69eca38bbc2e90220607a353b8648fb1af732026e87ad8d021dc79940aaf8a20498f46ffd4af4b4ab014730440220173cf1a67b884b6278637675069f3fc92711cb45ffdc0a24706344f7117166f8022018311ec23efae56c6e4924c9ecbc5dd2b23d1e783cd8763a64de6507451703740169522102b230a44765963f4b306245826ca4a7c8dc43e2fcaf3f09654370135dd2f874092103ba85d70f0e7a60559d9b405ed556f9816d08336afb7fee73458888b992be6e4e210214cd1cae323b4f3c72c4eb371a7ab470da141780cacd00a36daa2ec616d0af7c53ae0400483045022100ad8e9d4a46b086fb74621b6628eda9a7ae1f5349741488d76c8036307803d86a0220653df7f24259273407989d68a7f4eb6e4cf8b8a8d5d5a170d2ad7361010bf0780147304402205506c668d924a949bc779401e3ebfd5535f98838c8a6b756e7dc30ddd88373ff02207280d9876bacd1d00c4841cbda651ff1a0927d0d1f8a6a5c71e90568c1a16c060169522102f5670ea84f805f12d3b74bfe4f6cdce1fd4a2a0f7f371c5316d998bef8c1043121025d1581128cb1a1f49540e12800ae66391b8073f2d707f4831691e88245c1649d21020321123c8f7b50b21be42e07524b4e04853d151b8f6fa9ec21ba321df08e609d53ae04004730440220254a4fb3be1073385ee2b3bff8debabb13917303dcfe13a0e533a3ad6e0a6ef302205f43b07831c641c83aaccc30f09b823b2b7bf0283590b60cea26e80b7ed4ae6a0147304402205a758fce842dff543542a514df3466a4ff6e5d08b92364e2da4d4a67ab91fe6c022015e7b3c9531747452f3b42bfcd185846c0b0db9cc7c9e1f2f68a50b6e3f340e101695221028f3f362214d2a2a3942b0fe5e35a8121ce49ebbbf76a9c79eb46e60de6f6eb3321035d9ae37d0e7a50a6e38d5407d4f3bccd32c10ce6d9e6f85f84df1b376c33775f2103a7fa2e9f056327a72d5ef65ff234639fd273a1430230b52900fc71e0afb54ce553ae0400483045022100f9e74ddfb137f0dccdccc565282408fcb25341cbebcf7e5740d4b163bf263c2c0220534b6e0333253447eef275c0950f204f343c55e40bae1f6b072ca0dd38e76de30147304402206df2d9195d3a4bc52ff0750d1030fd7f03cfbdf949b5925627bf89d9b07bd01e022042beebce9bfca60974cdfc68a1a705eede66033510d4650937e2a0668a11a1d10169522102ea46e2903c87a3c432aee303c0a721b460c579d3a62a7628eefae789a1ad24be21027cc688dc9d6bf1277de990ed48875d6c8157414d8321fc53f1cbaf385993b444210369ab4b8bb0e3eb283bc1283ffa6aca762c8a7cc2ddb3452420b37637d42b197453ae0400483045022100da46331b6dd3dcac5ac03281c722b94c77edd12dfebaa44e641d4fd02afb61b402201b39c144c8f2e992483ccce88fd3027f028033121d00b7e06fc69d853326358a0147304402202a38c12f29908a6d6aee7a42e07c0370e76fdcac7efb369a3f4d7e5bf7d3ab9602201fba420a6908320df047301b811dfa0756ce8cbe3122375e6ef0e9520936993e0169522103c1dd95299eef7e95bf5cc11799832d2a88078f3be0f0a2d5340afaef57c48e452102b278156cb8e7d3c753c22fd1ffb0747397b07055980e438df6564ec655a5e6f42103887941faa582262d1ab00ab7fc55151070ef94e82d171bf92d0134c40ffad69853ae0400483045022100ef9a94a9129cc4766371e9e2c65a95894f867b51ecc22c9c388053fdbcf9673f022005f7036834a6bd74591eb540bdcb5fbf56c0b97d1b7c17d61f6f3c30842829860147304402205608e4e420a2e8a18bff8b08612d512e29ffad1c77166586b3dd645bc063262102204702bbf29c879ceb243dcb4b4d7909b28f5971394b8d2bb7cb25c9a0a91cf1af0169522103751fa9ea840e1d3c34844d75cf68844058f66f4ec4b0cd7b1b39c9d381539e5d210379d73b3d7b379c4923aedce86865353a58f4f2abb2d3573e1d3b63a59808e0022102001d88bd373ee495a94e6914cd074d93a6defafa76623092c3fa99f23285443353ae0400483045022100f43d441340ff71953e610008b3b3465d05c15ee4f5cc4236a81b574951aceddb02202187d56f5439aecfe29e21027b98ea08ff61ca592b6adb26b4350630fabbb7840147304402203871c6d98bbc81862ffe52e2a7b1dfb4b44327808454225af09169925518779c022061327a408514cdb14424296dc104e19e9e965db865636da7e102202e42d4bd7e0169522102a5d2e99ed495acb1203a8fd32178e090b2c692c60092ba4f169c9a9ebe2eda9a2102a3fd231a0343ca593f662b69e0c4557223ada866d1388c691aba90bc3a5959732103feeceb5dec826703d43bb37b9a425f3f795bb587cae15f0e8682ad8f57ea40c753ae040047304402205f2c44bb85e7445d55e01e6d918649905ccd76f2ac19788dce4a32012afba6d902203999747ca81283810c42b2594f86fd5416847f9df41476cea9aeec2a455ca5490147304402200e498b2abe84109d905e0b22f0273e4600332b475f979de985ecb48a9893234002200fe7da968bdc8dfbd2acd242368f40235868cb6899397db66c06c7f6eca802da0169522102464e8bdb854ea2f47e5906ce43c438419eaa97158232f230c66301a3a16049152103f89d07eab4059a265c94835b321488c728c45f68f76fb3d97b51758ef5f966c82103985999bb3d6d45cfff9b3f78f63a06f762e960a81c5abb01ec8fe700045b319653ae0400473044022016950e38c4cbe3a1f67fe762b8ddb0df06605c4240ac9f1dd17d5bb19d1d1e330220409df3f55683bcba022eaa9ad51dd323bc6cae76f9e2b49222d2ab1d115b244e01473044022040a6f854cb09b6ba7138831054b13f10dc780c4de39a8ce6a9d2ffca0cd46f02022030a958961a5e64324e149632898445b5cb5703bf6c6fc1a2230760f98732cadd0169522102b4322fdf86c54f9b46a5b2d0eb128ae87269daff4932c2b70be6f5513266b59221035dac0c56c3f002635c319b3fa70fecb08407758a606bc9c2ce4c35b7666257782102bbd7b52fc9db70923f48d5470a6cbfabdcb1fbd028ac15eb543e891808df7b9b53ae04004830450221008723f159e96e71fad79ca9b01dacce2c8e2a4098eabcf36e3e740d7ca5da8c4602205daa8cc7861e98da911f0313225e67d8f625c19ef4972fee9f5322a31ebe7c4701473044022035df05864d20006a55d0dae5bb62ffd81b819a79c4278b19f0fa9dc9a4857ba902202a0eb5ff87bc41d921277da244bfb19ce75abc62dbf578a1848a229fa691929d01695221020b8bbb2cf5ef5fcba7ba9266063f9b2044df9fd629d942ecd3c559b7a6ba0ea2210368f182b33cc65983f750e4938fbc29ec54375c9f87dc37cd090fbc0e68b83649210300412fdd6f99bf55211c752b9c834c3f16755be842a63908c1e78b94d0c53f4153ae0400483045022100c176ae26dffdf902644afc6e0193d5dbc313c81d26d0c2764178db63844842c7022014b36ba709698a54790feeba4ef45b08c2541c741f488fe6c5f6139c8c4080d501473044022071717362e291c6b9147686b7ee88c5b7f12bb1ddba29ed801017804ed6999dea02207cfad234c129c022a1b6004e441880ffb23ea0f6469cd468878f6e55e9dde0f4016952210286ece0003eca5150080bca580ccaa4d3e0d6a8cec60cba7b3bf2a3084abc492a2103876aa5936eb991929019c0ba6e0a9e559dd34dba8796227bed61d47e872a652c2103295f2829cbe58de3a47dc3a4f00c0b5282bc6880101d21ef75dbed956a5a316553ae04004830450221008c86ca1bca9667c37ecee8a8a44c9e3f9c665ed1233a8286df8adb69cb51fa33022001eb3d1fc62564c9bd81f60ac3ae551dedb6aca361c0f96011e5a81da49c95c301473044022002236e290d5dc59bd52b03cda35088699dd9cef518746cfb64917061ed2b9985022008c18032a789501f0e033477b4a913738813ff9ae7a872fcb1c2a7a0e504ed6a0169522102bce3cdc7d6d6c0c458b31a870bf9e1ca3adbd24f28530549e31fd689bb541cad2103be2c3ae62d2a26d69552b0394ea700100e561208d3e90f8e6398b5a4286ffc24210213cbae8df929029d9d6e573e24edec57ed97d9c39551d9e45fd5a0cbb257e2e253ae0400483045022100b4ccece28f0419094deeaab0e8a1a897e033540d18e5884ddf4e837543b009ce022064eb1ce4ff863b426358e9df76f002d607e58e9a2233971440a639c8b4ee112a01473044022037d05548da2673c7b7509de6033026407f7d1b9f1b3dd00d594a150d38cbdce502207c2618f7a26ae182ec45735efa24ee6a4a369d9fb8b21218233b69a57584198601695221037304c062fbc8186f439b9af7b1b78c9c180a122a1d727035e6980b58d6c675b7210366e967c1c1cc590722f86d346e9c0417a948e76e66cffce5e8948f8f5be32b8b2102771ba9c96af79995579b2cd9ef0ec848224c62e6346061b691a9bf0bc2cfc9eb53ae040047304402206d3d814901a19ab5c152a4edd884fa2da0de0852d452819f7c0fd3ca29a1711e02207f4c12176149dc07ee8018fe63ef7b0d0d644914f7146a83d72151806ee729f701473044022071d04af38e71fadbda7dc5c805bfbbc7e16b2cb5456161ac5e2cab1fae7c928502202abeac31bfe0ab5cc50a0e9cac2ced424a6ca7234e94bd992cb090481aa85c9f016952210259cf4752041d516ab6209e567ae3f8597a723824b38f4565ba61a94b3a4de5ff2103154c8d3ba0a28cae7c40f612ba1ed4f51c64ac4747650e18120a2882ac096a95210364df28e592fbe3815a1013dccb767fd14800fd78fa1ca97643d4823d23432d9953ae0400483045022100b5c83c88e0c04096d9c4610bac15879b11d045ed9ca2f90be11d58b9a0dadb92022022ec21ad6258585eae45a29206c0f1ab4867c61c56e9e82d3fe7d2ba372a1930014730440220119f071c3cfe8eee023e5028e79a42e8b53caead560024605456c19b4359079a0220631b89617af852dd30e7133f2b8ec09adcbead757779d4cbe226b9e2de7fd5b8016952210297678ac1028610213ea21db21a249a619b1ad9726e32904c78f28fdd8f46ca3b2103dfb2f5ee2fd064e01694afb93b949915be01f48897e6a3506f05fb28a226fc1c210256bb348f25f0944de8dfc2d82ab377fae96f93867c94ba20dc2fa9a5b1e9e6d353ae040047304402201d91129642d4d19c3100ff3c6b60b7ee2f6ac5e7a6236a693f8735ae5df3d141022014969eb6b8ae56b30dff2acf9409ecbc87e1cf29dd3071f0bf63711e6a5ff64e0147304402205d5d899f379cea1b49b40b4a343808af584665a633f200ddaf942c5321cae34402201f2a4fe0a00a1f5835bfe7d85f203fc671dcf9e4b21ce1e21618e30e5383f3a50169522103c1186f6a76f12ccfa561b8a6a2eabbe6f80dab02e2d1f5c749375c9956fc3e702102dd1f5ad48a190cf271df0f9f5900282eb15724a47fc973fae530d963c29bab222102f42f4f44faffbe8fd2f96e548d666c16db1fb6b656260defac978573364736b453ae0400483045022100985e1cbeb522b457f3251758a187e576be1acd9d5eb61ab00bd0360573b9f9120220035df46cc19df92da94d6461a7dfc2f18607e161f02a555f457592c864e97e1e014730440220168caa6bae6ca237ca885e77f3e81dacbc7185116cb45aa428070242199018ac022039077f5b5b49dded395cd93a8591dc75c6a412b2dd3233caa8a12f72d37302c7016952210267207a0dedfc8cd23ea13c7e007d143cc82b8bfc4d26a8f15050efa1f694043f21039a2f787f843e43a6b464d8ea76f82dc14590d1636f108cb9ca1a036819ee2e1a21028bcb0f43a4cedc1f99f63bf659fff4bee32e95471b8bf4eb86cefc6c6945410653ae0400473044022020f85f966f79873704f42b00053ef7d54c6733ed1d736303b8929ccb25abe39c02200f8c9d94021be3102490b6d8939eb0ed6caf3b41cbdf60ff1e9a7d48612a486501473044022013ba1a90ae495eea23a5b2c9f6e097c3d439d48f18b45ed873e598974dadcb9a022024f5f178bc234c1dcfcdd469ec1f77c0cedfdb7669e88f894977e35f40f99cff0169522102184cd04de886013d1c8165366ec588085048f6a723f568e1a5b8f4f87ea221322102d71c306258c1c2064be8c3e797d6a0554bfbe4fd6572db8bf870f7bcd882021c2102e6037c9e21945dfdd13d927ac09069172425f3c76ad8ad838d0f044b823f5e7653ae0400483045022100dea5eba25d5de6ea49514ec99d28fe7d46d48d8e4c99013598c5cf2424cb92a8022074c39cc705fa28ad23140aabe1376f9bb54e238d149e50d1b8647e0344462e070147304402200178076f9856570be2f60ddf26acce9ca43bb7cbc7c6d5c3a191dbe66bb294a00220707b96ec2723943dd25c506699e12d74caaa66ef7132130fb430d7ae81e1b05c0169522103cb0787ccab1a09422f8f22bd9afd2e2054e9b14d602f0c995879455b366315282102fd191136922dca9ed883790db6dbd120257ddf2f0828f600bc938250d3b426e021024f7d213829f49ac32862ab322f4eb4b3cfb66915ebf970310a5076834789a87253ae0400483045022100e744e213a8bbc66f349833db074cde5ed84a23575b9fa4ebf028026a2403418c0220070e45a3c216d2d760df3245ec5dff3e48e0d1aa6fdd52f2ad027b6390c948e30147304402204aa7048503ee71a7383c4fe249c248df1901a152181b90271fe5a3850d5b97dd022042d3ec6f857bae4f536dcbaa0078aa39d173dda87d6d38f4e7b1cb49d19030f001695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae0400483045022100c12a59f77edcc5837670926d61e1ba7a7ce910ad11d562f7560551e8cd13cf05022015e9d7438373f901e2aa2cf409221e6c0fafd4798187ff331de3fed93418b17a01473044022071525075bfe85ca568e862a9cc04c738dbea2535e9149a8d5db6619902cee66602201743b7f3f1c756029fa3ae035b3f3c413456971509cbf69eef54e7f4adec85740169522102b1c678a91ab267c2342ef8a4ace0b713458ed0391fc54e057e90a51da68700fc210214a7aa7f59acc75fb88f350b655e472c58218ee404e01a72f1e8c3ff9c139a492103eb79fd02d6ec177de8c9c5f130c55b6aafbc548f145e849e6bdee8b838fe800653ae0400473044022008598d7a533e10ab3d2fc5ea5fbab3eeaa0cc69335d4f3d6f45d0ad3b840c5f6022060e3929bc386e9d01c0de054f871db141a9e7661c25738fb6b85dca0219fdcb101473044022035bc0a00723a336f4e90cfb8a24592788d29069e1a7d2c4faee7ce831f6cd86a0220743342c402df54e82781d26dbd40f4ec93194c695df68beb29dffde8cfab7b050169522103b4c74bf8fff6d6ef8bcd9e220c99b2dd0b5045b12630e11cc0e96d19d9a0b99c21022ceb47d0d62dacc340f5bb6fc6ec485b3d19ea07a193dbaff8bfa27ea6895d0c2103e2c0f1c13982b034521a5d3fe9239f5d326a043eefe806cd03f9037853cfd8df53ae040047304402200298a345c2062309a4127e62209768376e95e6afbd3bddc2de928c0ec3f555b802206ceeb74fc147072b2952ef70f586e9b9a756d3ed85e754d6465ff98468b1b20201473044022068459b56dcfaeff2c83e7057e59e35212dbabfb16d1801ba2a43730fe9ca44a90220564f0a568334428f10fe24cc92347c12bf3c0f465bd81828078fd556da1b32880169522103a0fd1fc36b4b1f8d9fca7ef23e8e5331b6bd6d5776ee8e63e64e0750158e510b21020379111f4edfaccbc34beea4a0c7b7a51bb1756f5359e836acfd04217b7933c02102f5587360a5b969a04f59be3790dc6becf80d7e4ca826f8e1585ba54e630e6d8153ae0400483045022100f79509a2575492599ee08a6a721e7faaf2706d0e407cca41fe9811d4f737278202203702bac9940dc3f878cd76dac8d8461d820e0ac7c19bcfb2ebba3021b2696bc9014730440220036950dfe5f93d93e0b9af0487ac7ba0c1f5008129bc4a318dbb49b1d5f2db9402207067231d071ae9f47e3d79b8e20f58cff5117d0d873be60b7372e526df8d6b2f01695221029ce8a38d20e1b5dfcb1e4c6438c53fbf75fcc3b1328cf294b403583040b3e7d721021d577ce4789bbfa1c01997551bea5d9ac11b0d85791a103e911de0e72799fd642103ec1614d346b951d3193ca4a35ca7fd0a8980f58299c8ebca6d431cde5091293653ae0400483045022100fc713e60be2484ca544162b11c4ed9398f37d586a8082695432fc4d472848efe02206ffc9f81477338762ced204d2a9a714b73722e0729f33744a3570c20a537a7070147304402206ecb3fe153aded3a29855512a42ab6fb3d733e1a4fc27c5d4482903c64fcd9a1022006d82a3602ac2d15f321c2caea818907f5fcd71aaac1323a521ee15af8cc058e0169522103468eae3246b481258c410ae63ad13b9feaf20ab58a426955a8034f13abf3c1fa2103c02854fe8f14b9e4c6bdb9c1a0dc5b71541d2e8eaa87d047928ab4b273e323ff2103678fd828cb572c32892d581a801b50f8ee2964d3c25f1669b3151bed20f0ec5f53ae040047304402202911fc3aeab2213fdfdff4a837460783d19562421c49599e964f355e3a306be202202d510506236413028b09af2012941beedadc01b123ad6ab8e2ce445c3f1f053c01473044022007178624bc7aa04cba5956dfc9d17ddfcb7a10ef956736d019f88139bea327e0022069bec2572c72ab4dde9b16407b37ba7e31eadb008b083e433991a7013492ed000169522103b62c9e4af5651e475dd92618fbdf8019c9e2ca349f400f656c07d3c94fcbc1fb2103a08f59eeeb7affdc2bac11fe3588f052c6ad3e7852bda7be596b84d37f3b9d622103e02857348f96256080b97889d5c125cb79e1886ae72e453e9c9afd2e4c13264053ae04004830450221009c4f43d552be4a6dc910aeee16eb00006e2eb8e858f290aa1094201ccd2c82b202203540204d55de1ca4a495a36e6c052ed87297dbbaf5160834e9997139f02fd1c80147304402202b8ca7f727fe1f32c8ef7fadda3bec400c953f3305663da0da7507a04264cd0902205f3eb020f5bee25573a937c547916636de4e31e33b0f892ff0c956cb28716c970169522102ba85633db3e81c9b19541e80d81af7862c6f76f716d8f9c48497b40922423f5c21038197f6230b897b7555a0f07637c2c95719895a9b6f4fa47061c26a2c842178a821021e273fd5525d9dacfb98c2f35101ff6767ea41591f4e156e1d6d01e651ca5f9253ae040047304402206f124b8f3672f600396bbe3f99b44367147c15bdfdcc9e942aa84e52d226eb8202205ff0cc4c6b9fde648319362dda50e151ef4bfa586e8f59fa86974ea36f1766700147304402203be485cdaf420ab46669edf378d288db7e56477d20c6c0e7dbd170fcbf42bc1302201e9ebe87b352cc7e9e39fbb8db3381e471da8a0e748ff4c21eae51217bc365c40169522102bc86763b364a3d22df0ee1b5ba4c63d74981d19c5f6737442f2ae1388265a23a210235dea43389b5a87c2d68dd33d8499b66d4c1dabffe5c5117505f9b71ef55677b210232ace45738604a41c6c524d5bfe01292049454616198ce376e37fc1ac550b74753ae0400483045022100c27ab619c64f41341f67707c5b6b587f792907a704304d6c8f8549206a8cc09f022020efb4a898e971b5a34329709bd24465bbf415ee8bc9b96b3e4e2da5f35e513401473044022023672762826f9bb77ab022add5508c2326d22a248e819b6a2be47d01fbafc3f2022074551a16c99bb09a5206cd3aebf85d8cbd773e26aabc7c41e4a789a6b761bc8501695221032c77e1b2c0d8b8f6c9245250b6fac33fc91a8268649a4cbcab7ad31ab4344c052103cd6e66d2fa364b53ca0394d05bf2cdb0e53888e4a0ced8dbf65d300fdc06f8842102a9ca9baf787512dc2ac3fa16471199b9d7645ca8a256a51ae6d88b7aebba3a0b53ae0400473044022063b897bb2523352a56241ac7cbd463f331b9d7956f6a80c3db6f5a9b110f67c6022013b60cbdc5e41eb6230f6732c4685d6f0806a3d17431c650454b93411fb1f60301473044022048669f25b7578e974714e7f07cfd766ba6e385e8aadabde33cef699130316132022004b3b67c2c328d12b975bd43df109410ae62fcba9f8866afdeb83870c22de4e00169522102ed056b0f99a94f4dbf03cd4c0b907eab3c86f869ccb46e315cea3e8c9cf6b5db21027b64e38885a4fe68d4ac117598d3805c9e58405f311175ce83191decdbbe9e1321035eae00617333bd9d603520974be30b9f70abcd03da7e76beb697f66dcfb173be53ae0400483045022100dc4dd2b771b2717ad99302b6002af36a0d05ad3ca56eb94a3554e7fc8898baf502206129481a26e46af7d0c74a8553af06891e1af1060564db2561b903da37e8952901473044022006d27e131125091a5579de27c85590a02475883595718b7149c604c9d6f7c2fe02200f32f0f26e979cd6524178058e9fe201510f19082e744ef7c7955e5571ca7c160169522102bd1287d2af60dba826d506884fa316cd7f73717eaefc4307f699f9a633d6053b210397eb545237ae653b1d37434ccd26af654c6692a53789ec532f9cb73b338f63c52102de2dce5f367f13453f04eac494384177ef9078d425ab2e4a8d135d7365566cab53ae040047304402200116beaba4debbc58148bf19a4a4b5fbcd178689062d355bcf57309d781cbbb602202c41e743d0b6fb3c3dcbf3e3af58958bab257832f1322ca9c9a998f2c0b04bd8014730440220230787993bf8112a1ae6b05df78c7f59378439724ba15428234ac28d7eb4cfc602201b396afee84de3f6c27010e38950802de002dbcad275454855410c77e432bd4b016952210370887f4eb55a4346b499b1728268e5e18ef7c05c9fa94a4d5b534afc3aad668d2102c5336c81410d2c3ca76a7a902ff7c06accc00d5f2963d6463300457e3ce6c213210330cab45af06226bd2dd5dd198d65958fc256792315fdf96951925d0a8d264b6653ae0400483045022100dc286766bdee71804886e35f678ea8724d926701e25b1a87b1f5a86de2b2361d02205b8ebf0c07642fc42ade043af4bf0f7c5110086b8763927b0f91bae1755d30760147304402200dbf6d39d0d7c13a9e10d747ee090eeb3a8acad6da22b8fc09c131e32f2cbe020220494e76f9490e2cc32d5388c50daa71b3ccc541ec2e22a0c730b4b1355ecd83370169522102a3500c3db2ac8ec3a7a68c0a4020d629c5b2d8c07e3524ddc4755cfe58d95d882103b2ce87553423a40003c84d835fccf6f7131de2ffb3d9bf7ff774db8e49efe2d9210248aa03396f1b77aee459f0d91e8037fe355ce08751580cba03b290a3fdb0d89853ae040047304402207ec0571e64a2f9848e66a5446d5c4b3d05e2632143fce61518fc1d40e31e2e5702204c5ce14fa3b5052f388e57159f8b5e3512d51ba9ab56409baa93cd7c8e4ebaf901473044022000e3d128cedc98248594b63cbcce701236d4a27c708a5c99f833cbdbe1689a5302202e39e36e57fa5582b845290b60678cea5321ab4f198c0b2c5641c84921cd453301695221028f4e17578c025b8c990e546c410c1d8042870a91bc3abb726d612718611e22fa21035a4fd9feb2dcac789bc8e1e2f5e467395923582bb0ec571758b56efec99570eb2102ff353706f8c67df8cf662a286021b5fb0676529616ac70175f7f34e25373e9a653ae0400473044022077cd2e8969f25342418d7ef9860af53db2074f284dbab27bebbe21a3e9a758270220666fe3acdedcb27a422f1bec0f1a41230501e7a0f47896d81064472c6599e8ca0147304402205e8b34923ea29db95def51fcc11a48fe73b37cca00718516a75926f37c898d4d022018e5fbb0809dea18c00e9bccea8b53fb74c8e75010636a63a60d04c02c5ee36a01695221028d2f32857b6dea71fb838e54d0a75a612bff002a96310b884f291e01eb0531922103afd912b91038f4861f86250b636255ba269a1acc5286f51aa06f50d0b7eee03121038ab4174e6fe5dfe66857d074ff09c659d4a5d8004f3fd3779a4630e48ff0ee3b53ae040047304402205397fb81142ec01655cfe0e29f1f558047cb57df4f825df37850019da1c6560f02202a6eba155cdff7b49ceadb4c9f0b508286103ad37bfac483cc63420b69b49c4f014730440220146c52ca1c2202daf07039de657838dd769657af795dd9a041cc5f6b5002c262022068f8531012a94ed964ff3de7d741d1eff293e0faec11855dfc0da62597261b0d0169522103d26ecdd5c52b44228eb6199d179446be8ffaa790dee13a5815477491252504ba21033a42dd622177c37da10848ad8551b7880e4b086ff72bb3be1025b2190e1fe5f82103a4d2c806c5be31d13ca1d0070b91a6020e680e644233972ac202868e8833640b53ae040047304402203ecff2091aeea0c8fcf8db845226b685f39caf683aa057b37e69a07cda87b7fd022060b2a71037b1b0afc02359c06a2342c259e0ae7f7a9de1edf1bb58bfe389d40701473044022074935ba7745078b2fc2e8ab9723dbac3cdb86b1d4665f77386f213efd9d3f622022040da865bb90e4b965a0ef07f59a844a709a755ecb3aebe9302d76fa4e95407d901695221031a076d03996ee8677e980d2d6000f57e43a8ea9cbcbbc4ed9e5196551e865dd82102b3f7974188e6e4ed5a0e50d97a46b29f3d64fdfa035bcc3ec9c7c0eefda0e00f2103d6db0ced100dc5816f5c4d90fd43006b536bb8c19c984093c858e95c5cee4d0a53ae0400473044022023e51c0f2ec02c8db6807b6521d4369bd6cba71efbac7082ddfb90b7642978c1022061485fa601a5363e48808e88bc641c9624fc875008b088b489ee2da9e3354ebf01473044022053a4c33bb09c73e9c2e9b62bbaa244ee6daf53e27e1678b51bb83268e873631a02202232318ea88c0bfbc3aab04216a522161ad43ea9ae075ac7068ab9986c587f1e016952210277d33ffc3aaddf83bde58db2d6eb62bd9fe5a856b509681a63bbf08e8791b7da21023c1bbf7acfa2f691b032e744f668d989ac346e8410227872cc66631737aa94aa21037db8f3f3e05e87ceba7ea3c8d395f0b9c3f233d23a26e21e2b10e3c61ffe419953ae0400463043021f575b2ab498aa7698940079daa956782d3db43b37af96172f6491a2b9f844b602204e1dc0bf672628641adabd81de5031bc87f66844e41548f101cd8914341ea78101473044022067e59a735eaa13585976f088adeb7e9ee015820db6988ee4d8dbf6221b754581022040f124db1389fcbe64c7c183c1130ee48e92a3340e7772f38df066d7dd2b2f7b016952210216f751548db0bba253fbe421948cf73cb3fb58f176d91903b0822ff152f4751e2103c99c9e339067941acbe6f4f657f948fd371a553a5d07ea06bafd3d03ec454ed42102dc211d876046561be2f35176430ef1fa3088703cc26aadf74956b3db34c024b353ae0400473044022031774392fe7dc2690d1503810d16acf568c0607b015eb3e03a13162bb7ade201022047adc8bd932fa89fd2e0bca2f271a93cd55c4fbc660575d533be2b9084b7f03c0147304402200bf515ee203df5161dfb31acd766511b15b2f48b7d9a22af53a486a314c93c03022006e14b891a16f96e5c562ca53c5befbfe9523d97c2a512703796f178e3d19a7f01695221033533a5c7e3788f522812bc9a48f4617f986107d1c031f40b6771929475a41a7a21025c1b6afeddf09a1b11e2f386a6bb0d0fd9bae1081a44505ec743409e40d092a0210253eea30c79822ed3657b538d9bbae6d56a7fff8c7e27bb2272c0cf08775e17ab53ae04004730440220690a82b90d14f064aed68472d432d6f25ceb6caedcdb96093d13055d34bd1c8a02204d8caefd69068c4be3c95f0888a731183d90e816d83e404d9ca3b7c2a29be3180147304402203f680c94d9c6eeaa33d74851d2da246cfba90b3bd3c88ef789cfb2f7aaf95f6602207cd6b24dc512920ef64d35ca73a578f095deba0db8d868dffa39b4cb13d6912001695221020effde9ff83d48bdc6417e3e3947176b3f37155cc147bed4828022b1880acb702103b20fa2ff274515b4a1683a1081a76de0abbb574c4c391660196b4e4bf496217b210318288c018903677e32fb43d7a689deb3b5925ed2f2102c3ff0d6708787867b3b53ae04004830450221009842a81b5c94eeb8b4f69b96d5d74e4c92bea1fdad5f8ff8e1453da674c2a4d40220771e5349c9d41f578403ea837c9f94a7cd6f374e4da3c9dfecfb2d2e8e7d35e10147304402207a9b292d89c25a2d2a9a1cb3c29c2cc4a913ffff53d1850dcc80dc7e180c403602206dea2e36b56f43aa5e4299a7a18fefd3fd03ceef7588cd9bad1ff4ca3954c04201695221029b845a9cf0506ff0612f1a026e3312b723aa1e3e4fc8ec7646bb5671f5cbb75521039966f4001bbe1000f39258cd588eb05db4b0153b2aed3f10384b159c88d7a9282102778b9bfd748858f8d68a8374c900d57d0935ad88211db7fc9a6e1dd51eae89e853ae040047304402207f9e628f6be2d3191f2dc4cfa647730784fd394b0fc8b8625fd05e9e39d52f0202201bd01a3bfb32f2186476bada4c7fd9d91309a55f2350c946a7fc4329de69282001473044022046feff56d7b99e75baf86c20852f4eed2c5bb7f5d54beee87457ca06d7982bc602207a43a34e373069dad7d17682d6f85087bd999f0e9b1d45caee7f18975e47248401695221023ab4032c8fb9aed39a1d63083705f19d02745284c472d1daea13d9751d29bb1f2103d3ebb8b7eaa509fbdd34dedcc4474f0cb96dc33a05e695742e90cd32deae18ce2102c1f8a6394fd68f2714dd0cc5d69cbf6a120759d6da0ff1d878f82f1203c570bd53ae040047304402200da7e2d0edfca7a0ead5b1f15945d8b59773589d42e0e1e06398aeeebf09c950022014bcb1a8381791afdc507db9559d4d23d61f935c1db00c11b5b7bbc4c9537ad1014730440220460833e33201e017f81cefb0f5cba1e83051413e96a2fbdfac243725d3ef461e02203c07e50175bf358a882a50b2370196a58934441a04e45e2060e41c8f665c5fac0169522103832cb3acfcebda3627fcb3b920b0e9cc8d99c2a0a259de593ff48f811564a7f72103aad6b2929ee0d5ad8628227a140797b01efb387e9c2bec5c3c7b0dd8564643372102eb85405bf21ba7eb7b8d357352fc15a8daeaf2522035c91f8524d9810668b63953ae0400473044022054fd292df6c71b6d7c45b0584fcd26ad286f23117c82bf25fe44dc5dd3afd11902203c51ccd71a335b8995303a0600dbb5ba3cd0fe6a50abe8cde3b8eeb4087f160401473044022078ed5beb0d31c71cf41c6a5e04751db9d2b2010556ba558780db9387145184b9022028f8dec2eb58ac1e34bf0c9cbccb1d9739dad21368a33d8dc0156efbdec231340169522102ab253c077bd2d552bab9b5149a4bde7b6ecf885c09b7889ecc1009e3db42aaf4210355ed01eefa558011e0c72767eb9563d189620754d0fb9c0d501b6b3623c6635b210279bb57e847a2d7287cac644843b3c1d6dc6f0e1979f7cdff2215bfb1f88a030353ae0400483045022100aa3e8185dc144a536de48550673da0375c45a39a17445d7fc8f52cfd8574a15002203af4e65b97b2c8b398ac28a7d42b172fac00e75d9efa7c8ab429c5a53b82b47f01473044022066346363a979f251ddc61962e71194d7736906589f89821655509c26378b3a8c02201d7698e0ef796d7c24bf1474ea63ca149e5549de30e201d3fe51144d3581ab2b0169522103c0c4a1c67e7b661290ac0b2a1179c7d7a01641e93c677a3fc3e79c9f64a2dea321034710b8f727c9ee01c6e7f1114ff0139bc91fb728395d319b17050ff0a6b3a21b2102e28e62d5a650dfc69aca4ee3d172947c36faed6e592fc236cdf8a352cdc00a2753ae040047304402206a18638cd5ee16ea98d73035b8ce01be39b047120fd8db96fc1624c2a6eedb7e02200e4365b9f9f95f28566f8271bbe00032bf96ca3befbe9098e1534e0b8110cb210147304402202d0c5c02738370349df89f22aa5e75ff39336d7ca977ac5ed85a4592501a357502204c2df84c0a1c3bbd2e5c2d4066e2174b7991d54f749be44f3bf62f6cc79ef7e0016952210349e368203c5b0b0f2eadac444e0baedfa8205bb241324d076a93fe1e5fc0f0ef2102632a630811e9e436c79ea3820d8cada9a17183ea52fe701881a0d234ca1fe12521021ef4dc98122c4976769560680e55aafea9db27209a4959bed0bbd3bfe2b5b74353ae0400483045022100f57a63079f06254d169875dbe03916b8225f4579a2bf40f526290d85346879af022072e594c3afba0e90ccf91e6e3fafb8429796d4ed0b8ffc1fa1b42a929885d30b01473044022043148440af28a3aacbfd579fc5c75c1c6bd071c71f53ce508de9ccad0c3fad970220017ffcb10eb66a52f600eb6b0a4483232eccf1da7e6fc50dd4c30890b79b5d84016952210226d384f062730422fe683db3827de205d4d9e632209df4d4caf0435741a5439721026a5a00ec7fc6b31069d99c693820d5ca55a7d0bb16d35beec1b021eb35b12dbb21021136733ed1b7ea2f8635fb1cfb2b1c29a098be7bd3849b7289c4eb907af4031953ae040047304402202b37e9ef02792ae727a8d23a5ba5ac3beb65db4d8fc9c648c2b5bb8d211156d202202ca765db4e19504d697fe6f71953470dc852e69adf427ff96a28f78e8289ac5901473044022050b3c6cdbad8a7598cf81f87c763c0c2f3b0a7378d5e5859b54981b3c8e65b360220167f1ae514d5bec96ef09b9bb76a8341653464656115c94c273c227bd39b58d801695221033f11db8ec1a20de1d1aa05c417226db86d6ee92b0e7a7b980924b19f2d69d5b72102bb880c200369b2414df2981b88b5cdeed9da9b755825f27bab05f37f46936067210355cc997cf68bb43810a5061a7066957240188f0cea083c6bf01eac1e9313b9ba53ae0400473044022032a35c59bf8da262941f12477a35d422ee18bcb337a34c4b4a6cc725fabe988e02204449eb0c7dacdd27d77659263612ab5b0100caaef104ba73de697cca488940ed01473044022031e120c845f668357eeee9f5dd4a3f2d1a82c85583a70b5b66149bb354937f8d02205b888a17e085ea217f94292a17e8d6451366d03651bb9865df14f5c70e28e63301695221036aba920b391af9a7a4dca937fd3528ef49cbbdc6976f36009d43298e152d05e6210382ecc2862d801b17050c299a642e0bb1b2806ea494712c7751f0f5a5f3a3a4562103f3c0d902cedef44bd221f4f3f262738a4b488d4a12dbd4ed7dd2b64c3e0fdbe353ae0400483045022100ab7578c0f25b9743fdae88ba24aaaaa74307c3bc96438af95cd47d323488d0420220085af6c8551d66ca047147428074210429c7f9d8d4eb12f2a7131957cf833e0b01473044022068c83d812c834f13d1d59a1e1ba06d582ff596ea76fa55d0ad1822394c4d8ec6022063ad12069d043b1bb7268ceb19e050477e4a69a39ce961675ab3d763a4cecb710169522102c54435f15f33ecfc94dbcbf4bf86e6c442119ffec9a571474bd589460af999822103dc5cfcef84899669e8b0a25ed8eea115e170b64281d379c66fe7479dbec2108f21020de7bbcaf1ed3e9f1dd65e7009816f20e5a583e99c6db567ee8fdf23c1a49c5d53ae04004730440220167e669bcd1664f6e36f85a25ed922bc3417fefc9b8d41f5ada9bfb64292da91022006a148bbdc844af9abe1c122ea8cbef3a27a11420962d85967fe432f1ac2f85b014730440220335a462b8c00b262f915f5e4621b851cf87438aaf5a30b9fb0152244ef568e79022013e3e248c9e11462ae0cb0b02e5a09387f1240a688e3214abe90eb8ca2756c7d01695221025bffc0cf1ac94fc393f75864e7b646b386d53260853d225c06c9f63a51ebba1f2103a8dbd1d388ee044547473d009b94a0cfc2ef1814b0a4dbf54c90c8506bec540d2102d9eaeed3bb17d355843bae4ab7d5336b680841c071087cbccd0e39ecfb65643c53ae0400483045022100e4a38011b0b116bf03728a83740d9658a0a8befc3d5f48c175e44a78db9e93b602202adb707ef0dc3527145c80c038792104134f24bd4730e0afa9a275570c3f1c9b0147304402207baf4a07d9fbdf98aa51e6185e300cc0bda73b9c8a8372f6fe06d8fe90bacec202202c65f19018257b035b0a1b184b6ff020d998621d6baa8123b8372b8bbcb0dc35016952210261b821b5d63253f6637da706b32df04243c71eeaa162a241a36c0acc9eda726e2103bce64b8f9037cc0ffcc614fe02073e3c01262f0123d7cc143e7439979fff9bcb21032ace8984fce735b3ff0535dfb23f82a359737ec7cc3d52df5f9960f2fc5896c453ae0400483045022100ea400f3e88f65df77d4134615e3f908dfb1b6ca99d334c9fa190876659366a1b02204b278f2eca814692954ca1ac3708e608372b11dccd4f2e046c2d423679bf504701473044022038f5542b97734abf2b350f6055ec3373ab58e35fc56a6f2a0392f7deec5272ce022027f1f1aa668be7f9e6c5f32511ee7ef07912cc07eb4369a8477a3d8a0f5cef340169522102f423d12d4de47ac34cb5cb11de67951b3bd2aef1b337d293ab2eb875cff8b5fe2103ad78bbc57351651d3c173c4a67b5ff57bb1bbf3c4a8c8e5d0506ec31457a14ba21036fd7c4456339e12665b5c73033dd6faa2fd9d17867e3ec6d2eed36d937682b8053ae040047304402206feee8a4f95e0f49deb4e804cd6ff795c84eb2264487073aa86c52c00251e21002207bdaba3d4b95a2d5e229b90d5cf7dca920460ce561f2a4ae1c696e5b70c9a4db01473044022036fdfab5c08d7998c4547b11161c3b8ca98d53b80a047dbc605c53d0332117c7022006b547abb381c3bb45ddec1c3cf5d029d2c6dc918d82e9be31f5df2be42e7abd01695221036f4be579b777c4f4a09ae568b278a790db1bde43a16ca1a7ec3c6bec5ed22e1f2102b4ad9c46b311fc70528a54a657209e458aad2a938a8a22967e962fe80c4d4fc22103ef92443f992bc9bb98c821c55d109c95732a67fde21ad1c838151d7f197126b853ae040047304402206657fe38a7c2f91d132dfe1a099c3fe58f668b0219f0426eb09fd1fce2525c42022022c46d4c4fc4f284da43b572ba905e7e68881a5861b317201cc51d514bb903c20147304402206453e3ce6691b5e9bc5d49950a216f19c068a833ba9e27df5e6df69299fb8ee002207350f42d869d6c2e958e0a90ca040e81193ba6fa5ac871e5bebde0a0f0b2101f016952210375caa9866e0c3c033b6308321b3d9caad2c385f46de53d0d10ba6891f37ea8a12103bff9d4e7e34c8b5fb3f7147bd1cc4712175be31f07d95ee9c3046120e739759121027eba3493344db226e27e2d6dc2d54c58b936763deb25f92ee44760561963ce4d53ae0400483045022100a5d38f7858e0c3b0be91f710b3821967cfa75130837a92795ce0e4fff39488e202206e675ef20b6325109bd6bb0121fad2b8c613c74d2631095893255bd4f34e38a30147304402205100efebbfd5bf35a87379768f05dafd0d904aac8af97c42076575fb7f6b5b6e02201f4b8d564d7399538c387f2c92a9618652cf38b44f96da66ac34a4a6d8a94b7a01695221025a3333000b029dfaaf9aa9ffe6f3c8ad0feed7ed188af4cd9e5c63caa2694f2721026aa8f5475e56bd86ee650489bb3110211380a6075dfd81ec1d6e286a6ade5db32102cc54e60e8006d71ae9fb0901b6c5f6694d85d81c6a994214a523386f92bfff0c53ae04004730440220150b7fd9ccccf8fcff9c3aa382071e29c252db79eb954b972a1a1566a39ada750220534e0a0937a4f2bfcb5af7b020a12a8ebf5ae0e9d29ca3db9e2aafc21cce63e00147304402203c9de27ede01f15ef6f8e47a25cb51326013afe90f48497981c960042187dde602201906b88c363e48313b824f7a29d5d22adc5f4e53eb5a7ca13ddcf6e6ce3b790201695221028b73fa3876ce68a40a73c8dc0c0050408a51539b7a52e1c2b9f416bb4b19a8652102940b12737023269f6f5b2310f342b31e843b131c25190ef4b91c0b4b08bc26492103bff9ee2d054d6572e60e564a3eb1c9787be9946e94e726b2a3c4d246cabe6d1153ae0400483045022100a0de76b3d4098a36d5b5bf66428bfcc2dd97e2db7c06ab2531ac3da861310a9702207c36daf62b46341ff32b140621c68af028a9ea72463e0a293225047a3d8bde050147304402206626ba172890d28144d48f74a73cde6cdaa54385b995f6cbb702c17173c0b082022048544fbd2b80ded12d63e024ba2922b73ea4ad249462d2fa012ea0f6a471c9790169522102b941b3ca1b5a2ae0610bec75eb050690b8606dd17098487d684c0336c3b814b321030d4ff726e2fac05c27b9452e7f3dd80d75655f54f07e0fc70f698293acf34c2a2103cc03c6d4fc678dbd3159bfe82e7be3a0591af8dd38e6e793d1f60cc71faa647453ae040047304402205de5bc7c391fc40dca895e1ec3d2b6ca015553cae72672f3a214b9ad0d23643002200f05919628113f9fe02a25f4047739bc981f47cd15c83046696853439187ae920147304402202ec1404189851117acc599f4c00459ace7847905dd5de9e59b4fa2159a3ea38702201722c231b820841e992861692dfbec778183aeac172ec519f15894a49051d9d7016952210204da0ec64803dfa6f8944461d1af4611d60ddbccb72903f1ad51cdac4ffce4f72102286668c22227ddd30621bdc598acef02c889286b905426ad0d674fff2cf6642521035e14c35635da66fd3769f92474e8b0e9d175672dc95d7064a3040140af19454253ae040047304402206292fa5c7dd03771813a50b4563c7535f0be91e518c8bea95f6ecd3a780e93d002206f212fd491b91dc3901dda564d656377c5c543f066e50f93022f60df27d85cb6014730440220096e752a9e7469af96d98d4983df977bc922fe3e675b285bd1392e28a591fd9f022021abc0ef8bdf0dffd40acd5cc979e908033b6dc5b7b95f124594a0b16a1f5d950169522102b79dbbc10b708292afa14fb0f6cb7c73c1d13a3f5ac0d9790785e08338745b9221032760162b98bf35b555c3ef814a5ef483fd462b3a20d6eb1600fff9de88928ec321030c5761835982c86d525fa1513323879a4a680c54e1d72214582eefe71133e33753ae0400473044022024f81749d5034fda245c45efe2b50440df7a346a70d1a32cb2ffcc6f91a2dcbd022015b34cce03a7b1f30dc2b8a0ca716343e87ebb7f4a6ef6e902d2da237b8e5eb70147304402200a7c88803ccc65f63dc609dbec94cc194836f754f4abea213034b386e83bdd140220612024cdd330b7f5d1cb6827b90e207abe3950d385daa7a4177b1506eee6efd1016952210234317d2c6059e989b7586196cafc61b2f3dc7a86fe67804ab667b3505e2782932103bea043fe7e626ffa8cdab9188b798b6049480ea5ae8966ddfc6918d11f00591c21020b8a724269f78cc3e61a94a6d22bac0bb4233fab77c343db8e996f984d1af60153ae0400483045022100c95f41ad628e2c5dc26fdf5e9235550df49b73805e5f851c673575a07f7e0f4902200d75b8c7b84241bd56cb46f119e42cc9bd059d0edc8b519bf3bdb97abb34e47501473044022020fbb69e66ee74144c4f4c1c0bd059c901c03ade53d3d521ec40784c1bb5cb54022064c57bd7b1caf720d71f6a276b7064d3903bb9d57f381b34aa91fe399ccc817301695221020fe0fe7db60246c9959086c7d8393cf24238baf482b3b70616ef79743c5a5381210340568a342600d70c2ee23c77f9cc80180ada76ffad5447090e9be2eb468d2d8e210268a44045344f83c16266a2e9df21ec65a888df8be85a6c6dc53d65f2e39cf02753ae0400473044022053992b68b09377a165ad119e39ca76d028b96a49b10fe77ca421bfbd07f5f672022032808b3e94b7ba7bdf5089d47c8687216580f3b510e87d96aba0b2083a37d5020147304402202daceaab6a9651918807f04f03748825efb1ee3c1d5931fc36511ee66383a29d02200c50f6932c8309b6661e34d1feadca8a06359ceecc40b3299ee237de289347690169522102f49250b98a7ecdf1d171eaf2233d0ae683b55b7c384d861f10b2f65b1e329d3a21025e34922b5d80d43d681ce0b1c1903a748b1b2851e2e6e591ff8fb2cf0396883f210232c2a73623d83e7538a57b3e8a6c4f6a8616d2441331ed0251981b8169ee50a353ae040047304402204abd17e1efeed479b5caa3d3ba6a4c87d1bd7d4e0bc68911045c915871eff936022023d42e3315efbaebe5cb24672d10de6ebc3c78c604a146b5e571c6127328abb90147304402207673b5a78c4ba9146c7432e9fb9759bbbe20770af9c5cdd0dcd1f9f4c27a55f3022063292a12701d9c2f74322bd7c3774305d5faedbd192bba70181ca4e11a7803b9016952210319157a73aa7524c6d7f8842924a12b6602c922a2244741f89c99994dfc6638df2103b3896fe581797e620511660b9d0245941a04a4f94086da840a742f806ac2bc1921023a4795a8eabbde307883a07013bcbbea9c5d9ec79eda13abf70606a8b680e5c753ae04004830450221008be54ccad2bf5b0b44d502bb27e969203fbecdb0ec4caa4d92b1e64f6929817802203a80d93a3f08763ea9435b0f515a6beeb76f4d516daa0781579df1ad775e5b2a01473044022001f4f09382b3aa0cc9d669a92cdceca7c5ef87157fc04a6d319d3e5fbf5d20fc022006b795081380a70ec494b734796e6a6c9d1d9782028f8b28274dd94dba6b558601695221038df9d2becf480b13e9a507de65b62821fa9e3b3a294a265791f926cb14acf9e421038d10a7a4875cbec1648290ca1ee9320d7f7aafac0c198cd9fe52fe990f02e5822103b2b8ae21b24531d0ec0935313da9ae34e668f6d65af14dbb1e1886c73cae0e9c53ae0000000001000000000101b257670af4e59231999e96800ee55c4f97587803b2612e698bbec753dd7ff849030000001716001421873dcf62879b4a3c07e6df97aafab5ba818d970000000002ab2933000000000017a914609873cc3838b61105743238bc1a399195a3e5e7870fa802000000000016001478122e233e60e9051ad810e56c6366cefe424cfb024730440220176ee814048c05c69055029adc79ce9d7011cf2d7b8809dc5a4f159f95e522e00220280031d17636625604918558eb017f2c2e390b8ae032d896c67de9cf6672397001210347530bb3675e8c6e9f6ba02dc63431aa6d6d7c43f4179a2c916fbb941e37e845000000000100000001cd371df2d9f4bea4e6e47d210d24da77a03e35236a49e76c9bb90ab16423798c000000006a473044022060eb5715d18cd50a8f4851d9ae320ca415768ecb10d2500f2f7cd3bec8eb5e2802207210e9a9170614f45a8d88ffe4c9dffc4d259e0d80e348ce6ec0b68d74ca6b1a0121036fde4757e269974a7db0e40b15136df3ec940052f79673eaf4f8d0012f6ca86b0000000002b0feea0b0000000017a9142edc61192823b5f4fcd837797f510721c390163287a604010e0000000016001478122e233e60e9051ad810e56c6366cefe424cfb000000000200000001e7adf13cd6da38f2a3cc9280a53d679527b60e7726d62cc4c8ddb6fcd3a7f140000000006a47304402202388a00bfdcb257c51db5cf3ba1d48a851523aa40d0c33bad9482f3d4a1e7e7202205a0d2ac82453f5b408535b5c9b06c8917939a96783533259aab444dec5ab1cfc012102d612ec2530da7914373f268f2f62a8af1fd2a202a4ffd827d214d9b944a41423fdffffff0234020100000000001976a91464ac8db1364703e91ed48cd1dfad8e347965f18288acc0f35e01000000001976a9146af7db97de9d17ab83e5f943a2d4c1fd8c2c774488ac49a00a00010000000001105dca896c073665383b4d3be91d511055376af5deca0a9881de9b3d03bd9c320b0600000023220020f1533faec8c45e3c22dbb4ced7055d5e365b3057ca12585b0ddcd5deefe34d44ffffffffebcc7ef6e09a91b03fea9a48c03665a70bb835363ec01108035bcb1e8e5aae242000000023220020a4f01567f7bb3a4c7a546fd46ddbabf6176d51283f6b6e8950ab39f7ff76d9c6ffffffffebcc7ef6e09a91b03fea9a48c03665a70bb835363ec01108035bcb1e8e5aae2429000000232200204c3068cc6110f3640cf48c18d17913d0f2bb6a5fa9241b45c9edfa4de1c43600ffffffffebcc7ef6e09a91b03fea9a48c03665a70bb835363ec01108035bcb1e8e5aae243f000000232200208620275f63d2f03fb6b7ace33304a5640e919b007525a942eaa18c5ac5975556ffffffff2916374511da9d85d4e328c66bb372460e03fff19295a2fdb857b5b3f69ad23a02000000232200202fd46bae27e37799ec40cd6f59d33f0a5dbe8b131b6a717c0702014b7fce7e6fffffffff2916374511da9d85d4e328c66bb372460e03fff19295a2fdb857b5b3f69ad23a4600000023220020fbaf5e50b3b66a4040eb037ac671a0b933498dfd8033cddcb805d46c202df97effffffff0676dd546585b2aebf4510c2c8d75f34fdddd7fca97625737f9f580a8eaab34717000000232200203214122a4db049d2f7100c1840c5195362c3f6e482a8f6142255c7115508197effffffff0676dd546585b2aebf4510c2c8d75f34fdddd7fca97625737f9f580a8eaab347270000002322002083e749f5200ca54a507a64cab1a559de996c09b20898fb2356afcdf972b72256ffffffff0676dd546585b2aebf4510c2c8d75f34fdddd7fca97625737f9f580a8eaab3474300000023220020aeca474c5974c045f209269db6c16335b0f056d8eb31ff38bb2807aa33959ecaffffffff942730f96bb2b6e054f41e0c4069be7ee04ebdb68df4b8ac4a04fdba42108a5300000000232200200a339ce1a570e0c0cd90544002ff5abd29a14af1284be5a322f90d35c1c96e7cffffffff5e9a277ea7278b4d58083974346d3b1c9df11b429a5c175ef3528c67cc53bb974f00000023220020cf6dbf5533da1499a06dbdbc7f2bdd95f1b9ebe383eb86faf15023e4f6e56831ffffffff2c46d5d49d1c021524727ea9d438e1be9e41877f15796ae7d795922dc113339c0200000023220020ea2986d6651cd41337b5ee8037f2c39b847b5ded6b2037dc7e17619b01816bc0ffffffff08082ea62cfef57345e5273f390ebc25125736a53191f287ff2cd5886d4f22ad0800000023220020997e55bd4b1d7d7b2ea80201d891deea10a355c93458ab43f3fc0dbc1ff7511effffffff14d2560a8d952ab11ddc40a92fd3635669d1ef584405e3a5a513eb39619447d22e000000232200205d0db7f8c6e9d52e7a59c31e569cb9aa08c8143f0ed8162c625921d866b87399ffffffff14d2560a8d952ab11ddc40a92fd3635669d1ef584405e3a5a513eb39619447d2400000002322002097bcc73df62cfe2f395a167e4f5f105032a87baaa83aee2c754ea1229de630ddffffffff880db1d407a2280b9186eb3f367c5ce312150562f81fe6b4cfcb49b3d2732ef04e000000232200202615e09bffd7dc8b9b4d43bcdf2260302ecacb8baa4ae5d31dfa0672b811118fffffffff05f877020000000000220020b2f7ae47046ad17aae85542377271a14b880f058565e6aefe5e0a3e01c6668a0d3a10300000000001976a914c714cd0e05d1ae55c40b5652e19b515dbc336c7688acc00d05000000000017a91411da7ffb0547c72bf0a2e7d89788c3ac2367754a87821005000000000017a9149a7401bfa8d91f1be1e6ea0f7d6e56e16a664a328739cb18000000000017a91480df7ca995406e6665cf54f711d2778e289a287e870300473044022005e2358a6e969b6aad03cb29d89e293b791ffccbc7fdfe73243e655112ef8d4e0220647854820ed0207668e56302892367d049966c00087914e75d8993d62dfc40ae0125512102a69d9b742c7c63485eb730f7e0b48200d64d9d839ff783ce12a70e4cb0efe86a51ae030047304402203a4c9b317967ca85e3d3b45563de9ec0e6397d9dcb36a8c22bc6e96a4be91c3802207012ccf367392a896b4df1fe1d273b3c56394941f38747c751e674f013126f3a0125512102a664f8e0451fc00df65b70512bc13ca72df07cb2d643357e49c0b330ddddfacc51ae030047304402202dad53fa062623999fcf86bb43539c11883ee09387d24f73fcac6db27777043b02200e0547ad90c4ab8f035a0bfbb0a4b92ecd2a655a62187f68d53cc665cbd51fc401255121037df4f5c8585a6dae65968677ad70fb23e525cdf515fb805316315f0d233896f451ae0300483045022100e5066e8ac61c7f10d063542280746fe337a5b8e65410d59e81424a45cd94c78e022064363c3ee2c8f02a37722691011c3b634836c1fff3f2e4b2334d06cb2bc2427c012551210242362589089b2f899de24b327f5863d35c010b2b7b860c00011d9327e203417151ae0300483045022100f4ae880968cb6003852927b99f1cf1e21ac0a168a48ea6538c1b2c0dc00ded7002207af71f01c3f7c15bd31218496c15cb2f1530b3c6137aee18f33755904f4c59df01255121030e071390600b37e1fc33f20ef67ab41cae0a9fa3ea19380db81c452d4263667251ae0300483045022100e07d2017c3bd83799fbed5320d169c033b2ad0318e4c9dccbe05f579e90840fb02204f2b1e4f1ff02cbd68b1ba44f97e86ea4677ca53f0006cd3168686b28ab308a00125512102506db637ea3031027fb491d1468ac579c5b86d38ab6a3b9c7f8e58784fb1dc3651ae030047304402206a6db582966dd74f9ba483f63686b3fb15ef7d38d29e808650ef02e50ae0577502206fec7efa85ae1e831fa9bc38de9bfea7db5f7935125bffc5d9303d4a3e87902f0125512102939406bed41caabd46e8fbb29671907dbe4da16f63408cf7f770780f488b8ddc51ae030047304402206f64ccfd0bb0d1948b0fcfc68c39b2ddf12e9b487a00346b673b989e8dbe32f00220354ecbe70b22461dd841be6c748dba16b15af75cdd7e9686001b1a39f33f5dbc012551210307c1743624613f1f9a6f2f0da33d2fb06c398356f5d8acff479ea2a11657f25451ae0300483045022100bc66aba4e111d4d1f86a5c5fd648dbcc4a42040cb5903a53451bb59fc0477b1802202319c85be2c5bb3fad3a1e4add95fba9c99a97e68a7ff0a60739ce649cd1090b01255121025d145c896cb29f1e4d2e32768cd7530280cb54ea2abcef62274a88cecc1430d251ae0300483045022100a530a189940249e8fb1b25948b47a35595b1f438800a5471b97ea0bb323353bd02203243ceb25d79d58c0b081eea2bbe47001126e635f0a68ecc6c2905c95cb6e9ec0125512103ae55f44c0e2b4ac0bd805f096979b61cf0c57fea7b95a37fc49141ab6c79c02051ae03004730440220393673bc185b6075e2381c0657c12ec6ebcc7889729867eec0d3bda3b0aeb34402202f1ad43fde14e7815c1a6303dc624e092028eddda5bfd1277528b467435ded5601255121032d01cbaccfa46beec00133690e3edcbd1c1928084d33d04697138ae91352676351ae0300473044022071df424984b34e9c1b1e68af55a7adbb91e4c3ef943a71f6dcfbf797cd04ae2a02207a179b5fbca6e7b1a1b4e5755c2ca52396ea82bb2130262346d289f7bf9a19b501255121023db4cccff04cd8086a7cf9353ba26cb63d333619533408e71ee1e11272cbd93a51ae0300483045022100cfacaf5fe6090ba8bf79349736327a5a79f607080af20b6935292eecd3591b600220408dc175da8f5eaf27fd6e0d01ff85c9faf92d5c014e07ea4a44b81c1d0913bc012551210398b5ca22c32cd5baf2cb4cbf1c3f1413eddfe8d3b84d30714b7c736371468a2951ae0300483045022100bc92df470fec7dfe3a2b1612120b5ec599f4a7ed9368cf5497632baf4723774d02202605b59ad10d2722476982ec0c7ac81a9babbba2e771b656f59da6fecf6fbc01012551210203de340cd7d1f8ff5eb8d455be58eed69f43664c9f30106783704a8eb9128c6551ae0300483045022100c31b3b9e555acbcc37d7837529c1be9639a115bfbd3fb80648de4fa0068efffc022038808d3451f702ba6dd92469784249560c2fe17d437606daeb77a109407150050125512103354b4474aeb8649d926f847a82da729def6268153081abe2a6b613bde2c72ff951ae03004830450221008c776337444085a04bd6fc70598863c2f7f180c019caa7856e9c5ce8d69d51140220110dfb807b957f374d824353c4ba4adae4c6ba3781f1498be0c53063a9fd0da901255121026d91c6bfc70e182a502c72fb1ad9ea6a96dc076466a3b8c1c754f50545ee998b51ae000000000100000001a4f28be08eab1633e436f438279ca8b7ab3ae56238eb9b7e3fc999032f1d3047000000006b483045022100c7a0501199a0463c09f9eed3485a3bde3dbd3508afc03a1b8a32b4ac157043d20220026b3ef9e58e57f9bf717e622ebbdad021ede6a5ebd76314c077bd01b1efd93d01210337713483d2e93468a6866a58015ff6d1fe23e14e09f2824688ae0990839d6cf3f0ffffff0280dbcb00000000001976a914c1f3c75034caf16906e670c6d5a9ab664ff16f0688acb4aadd07000000001976a9145c36c962ab9b062c192de3aad188b05c56cab25788ac000000000100000000010181591966b7f23da0b9cb28ac2a8f478ec0e923def52c3040c971200325b41b730100000017160014344aacc4fa9257b246a97b2f40e3368b3b4aaea4ffffffff021028cc010000000017a9141a01c0bb6bb5ee8bbd652f32cfdc86c469dd799287ef32ca000000000017a9147e55ccd34768c836b74c3481d927f50a23b5d5708702483045022100ddb6ec8a39121efc925d8d48fc67a3b0ec9b30cffd5acb72c8f0c86f8db86e5c022042cfbc301630f3bfc34e3b1f2bcfe87995fb3f0edf13b73ca8c19bca8183f4b8012102037158ef10f8cb517be58057de06da20bb1d3223b87920baaa0ed711d415f895000000000100000000010132679e0348f16df132a786bc69946e2cd8b1d2a30ed0f1b8631529b048b406f500000000232200201e4cac041885c494009c8b7ba680cd7107f696bc834c5d8f442bc7302c20ccc0ffffffff02f70b12000000000017a91416be7bd4e459865ad5a52e96b9a56698d34c9b6d8720d613000000000017a91464f91e45c702ed5242d9c6eaed0e3419b4825ee587040047304402207a0fbf8404155b26aab629341a66e69a43a1a37404b3bc76e6709414f043c80f022050bc0f12a8fed0a87bdc3492f952523d8a306ce65361b2af82ee06794e88f25401483045022100e5096b43d556cae2e82bc7d91536807a36b4008fe218efccac047733206fe3f902203699cb363979293029662f1485c6ba9ce8196cb2338138644b8ba6237e31222a01695221037f74e7a6af9139c60605b5caa081bd887236a9d7e578d3b94a4fa4439c33d4f72103a328cc60362f3a330aae9533914a2da7576e5bd3fbe18744b55e4956d7a982a22103a7c8c06a12459519c237d73c6ff4da8c134733a5756472bab15ba42ccd36978353ae000000000100000001c1b7500fa134334500cd854d4f4b1a7f7199b6631bf79ab96067cc2cab1e47d7580000006b48304502210095842f3934becb7c94dc77bc003fec57e668c877b2dfd897c9fe324f0764646f02205aaf672ceb080fff786fa90e4237a11e5e739837bf45e00da2ca839d3239d018012103fce9eace21f16f46e698d25647c338a336a4dea851146c9a11a7befda628b5cbffffffff012abf00000000000017a91496f64f204a5c2b8297b1bb889cb704b24f2630be870000000002000000000101e15390d16496c591ce1f354347e8d31a3fbd63842902446c9fce3df6f6f62cc10100000000ffffffff02490f070000000000160014c7a86faa4e1cbae5536c30c64b27261420bafee2b1312f01000000001600148fe0d42411cc6e56f5f814eb7d9469e5351ae17e02473044022069bc6c29a8a51d9c166f5fe54734bd2fc9e34c278e374e31c887e0919275495b022027283cec44a98348b2e6c6139b9b68061dab2b7b31b7c23fc42d2c33ddf22f1b01210323f892301099db4c30125e555f3ea3caf39bfe4f1c1762ba82713b34bfff35020000000002000000000102b8aa1f8a18a821ef9a1d4f51c2d36d26df8eb74ca8803e217ff01b50ce2fe4190400000000fdffffffeef4b5d81b45d74406fa6d3c828c7cb736a11aa95cb7f7d65c541940363830f6010000006b483045022100beda89987031a782e52788b7afc2e8d62cd0da4d72ded4f0aba61d75548ff61a02202f5dd239e19c14dbc1695d4b005f717af3520f0a9fb2e32cde7923b3f0ee788101210259c149b239ead9e2dda574cbf99173a0169564b96da01e6f5fbc6f79d921cd43fdffffff04136808000000000017a91457151fb0c95b7e734d20472cc6469be87f740e7c87ed3801000000000017a914e020160234181da69c50b4a5646108c634835ce287442801000000000017a914fed8c65b138790a1a12ec1d28732c5e4aa7fdc0687bfbe24000000000016001424668e29c520f2e202209547ec36184b4a8d1c9f02483045022100f1720509bab849fced1dd292c4d49d7b532c678127937475c042b6af785ac83d0220225d0712e612cf52d0f35220c299700954d4684d86de424010b23ed1a40c6a4e0121025ab609aeacd955658ced27f57ea72e2af8d773e2f3c5d53acfda6428ed40aa1c000000000002000000000104aa0218716f6a1b26e11cc51380b053b14dbc83103413610bb4569608b0906d981a0000006b483045022100b7d20c6936a910712e797c50abddfe476a04dc99ba430680a5415d00161b32fc0220708d8ab2bb9f078f6f78faced0b3435a3c676f50d50298b8d0b191830e826c31012102d9917e41fa4eb7b2db61571d813065bb5760fbea5b274070fb6331df8d890ca8ffffffff8acaec9341775294d97c0072546afe83020add01d78cf3f83a1b97d41f90b4450300000000ffffffff4eed5334f8e420ae54cd55081334d9b33c69713fc4779d37a9aec96841cd6324000000006a473044022004c6443f16c67b15dc77b63373ded298af732eafc84b247860ace9e3d040656502201d8886614fc3e55e07de29039906800414254dfeadd1ed1566137d61c4bdc6cf0121023e5c7883d5b55344d9787ef1c0181d5ec3fe3b2d2d08effeef9977a53ca65f5effffffff8d1659b060e334359a14ee129dc84af3211986c4967a1c2cf83786db12adefd50300000000ffffffff034b5a2b00000000001600149f8566e274f3406bf86bb2d3202593e7516d9be959970300000000001976a9140904b12756eeeebfe2d971e66e280ac9156f853688ac3b8b0f0000000000160014e0145df166b20db925a3f7492889a5eb5ff6d363000247304402205d5e3f2e1509d490a411a422dbfc357a3fae5c4ee1e48079fe1bbfb485b3258b0220688cf8d4243472af897285b62021bec2a5abf026821d5cf7bf4b9eb4c468e759012102938f5d20b1dc260a1855b5b99bf2e041aa4efd9114595b1dba40904b06e991210002483045022100dc680a7028a4fbadd687d33d175412425d0b8ea2ed92385eb1d66ec401c7cfad022002485b17f7d106427d88e551548b406222c152a36f83705b3f12e589e86c35fa0121026c938b55c043e01cd54d406352d3781c1752b53d1daad233e08ddffa479c6121000000000200000000010188c754c6b2ccdc8d3d1bbe77b1466454f3a1150faaedcd4234dcdd262cdca051000000001716001470920ec1bc03520e79f7f7ba2e10c79c60dd397ffdffffff02605b0300000000001976a9141534515379bc0e27aa16d6fcab7c6b2e01513bf288ac903495000000000017a914683ecc0b3a0495fa4f7ca8755032fb7f2c55a4e6870247304402206374efd02f1857516913ede96d217afd027bb56b36e84ae5ee21e415f4ea24df022068cb5a9a0233ea6dc9093da98afdf157f07c9d39e83ce4c997dc77a3cb44c8380121028e98df38181d46e97eafcec3283566ea920506d2c9eb0ea5e159cf5c32ea502149a00a00010000000001015e81b967449e930d9f74b7c9d7a4f3ff0bf5924488e5a661a850f89da940325501000000000000000002772e0100000000001976a914a1766486549d7ba8a624a5f38ac6aed14139f6a988ace1b401000000000016001475a2026469773282a37ac5a7ed06aedce69e21fb02473044022053593ea5420bf57e098a686dde70418f4405e4770fe650761bef30c2428f18c4022072e117235bb18f2935c5e18ce8ec7be5c25db026f284b2b740780581350d545b0121025eecbf4412b640b1cadaa872c539ad96a3efb1de99a5b28fef552bfb763c1e410000000002000000000101abd9a4faf7810e6bd30a1c7b53629ef58554bbccb9257734df7118fa66ee4b0301000000171600146cbc6ae243907a01fff296036022f635542de1c2fdffffff0276474c000000000017a914e58c54e21ff99e5f12a9583e62ca3eb3e5a790ac87934e37050000000017a9145cc6612fb29c682c48e8d0e2f7953e23e4ace6a3870247304402207546c35edf0f70b6cf2f0a4331c2a8d5852727ea9f13251e9baab9126685cfce02206d727d41061b607eaa0f84df89bb7a1cc9e91d973f42e10bc3b51ed8280ef2d901210365b7b60f772e6f660ba1b62df8a615b68e00687dafb1c92ac84f657aa814dec849a00a0002000000000101025c66e2de352ba81e05cf3e19c70e7c9ed840276b79743db40d81a356947a0b0100000017160014796b7cba2a0fb7208384c6ba9bd0d8423c2a551cfdffffff026d11c3070000000016001409edfbc314b0d27d3c8a1756b98ee67d702fc3443d7d00000000000016001402fd8fffa6f77a13862ccca90c05eac961c0bb3c02473044022079eabbb03dbfaa02eaeaaf7378d2d99c74c99af72d8044ab77f8370c858e8635022049305fd6a341eead07c8a04a00e8b0c31a176c61a4826b78ce7b8e3c8e19207b012103a1a4c8c0482785f802c0d509771bfb9fab0436774e750d8c65f35611594b0c7c49a00a00010000000001018c42d9c261ea95acbafa8ac58efdf10ffa39cb213f46be9e299870f2efe5ab8b0000000000ffffffff01cecf200000000000160014cb6a6f7a4705432320c8864d38cb763fb9627a0302483045022100b1109ae91f065be5c4d6fe1d7e3855eb49b589ded677fe5ff1f18a33f39407c60220755c116298b4cfac46d7abae8ee9d79bc237ea300b4f3c3eafd8e6a34c2871c2012103f62af5968d6ead81cb127375a48e52be29fd17f7d555d118ce5409d556f9097100000000020000000001011eda41d5b14f56e09dbf7a246eeafcddff47566013023722451d3ce27a4d34b501000000171600144688006e7fd162b95f2123d0e235a76e60340f32fdffffff02446a0d000000000017a9147dbab164b5aae71c0f64eda376451b4fa111bbdb871a43b72b0000000017a914eb36e9242bdf1eeb296b8c8727e7a15e8f3e55468702473044022021102020a7b5650e495387b158161b8f9548d5a59b86a2eb402cf82b5e0e678b0220617f4e9d5547872aad79840eda3c4f335b55f9148214ce5250655136cbd777d8012103d2e0496ad5fc58911838e125c41d4413b5b7e4d93bd182fa17f01973ba4a3df248a00a00020000000001016b593e5b9de2d4e54bc0af17a8b375e5c89afb924f538914c912387e9baef3fc0000000017160014fe78154e123049a649063a444d5f7e06d186fdb5fdffffff02d16dc9060000000017a9146132ae2078ab55bdae0698443ce047384dbf3a8787222d0a000000000017a9147c5389a109d74ec67cf129b8ff0a72499c6542db8702473044022068ee4fb12b8e4cb854d4986fadf6d66eb8251ba751bd49a0a947d873db465da60220326a6a8dce93fc83fc3af53c6db3c07ef39a03a98076d6e583dd6d1de8efcddb012103b6a4cf4f9970ddf7a1e77c9b8a7497c045771c36e41bab0ecb2b72401bdc976549a00a0002000000000101a929309be90d21668525141c2077a9c874b7881a428c06b69f95c3308c7ba4450000000000fdffffff01811c640000000000160014f7625d18150b90d3c6dd9449a5612ff28773238c024730440220745283e920ce7f144db7c227315fd0f60b6a8ba54826906d65061809bc8631fe022005f63060d5287684d913a5da520736d12532d5e77db0add6f4f6adf6988257440121025ecd7de9ab5a98a8d0384180e527721240f2800c4900dad769612671c9b2450349a00a00020000000001014cde09df46839908b524d1ed4cdbee1b5b34cd7123740ddacad7f1d8743804e30700000000feffffff03553103000000000016001499821e4ca938a7ad099da731458dff4c7ce467d3196d060000000000220020c2d1f8acee03e740686591ba8c2f36b16c479b62b236b4e6b8091037939f9e62a5f9c80700000000160014101da51a612447d97cd7abd3f06f87570d388e040247304402200255286638d95c3f3b41fb780cffdc177f2bd33ad63fc6a2bb11c50c752257d302200ac001a62853079031a4096932b5e43bdaf5b1689610ae0e169557736cb2c1dc0121023993bd7e0e94e32a3a9881c4651cfe5b84757001fa4b8cf389e39d7d08fb6bc3000000000200000000010197636c186231b5935ecbd8ae90df70caba4261e9565bc68fe2b64fe0995707ad010000001716001421e32f42018ed5e54a087471dfc9f9c32d3e7e7afdffffff0220120a00000000001976a9147999538d77bdfe3fa0f418ab31ac6c003dddeaa788ac594615000000000017a9140f1991b67d4462f1440708824e606ae4a81b15828702473044022055b79861c02d07f34296d2d5a5f4fd5ecff64ad8384551c27ca4a237de6557b2022074a0e9c34b575f4fbdf0effd73657f0240bb884f9da1eff8fecfa1abfc38a3ec0121030d484cd69f7f05130c0394cbe994b8aea4546958f9ec373b9ddb9822a4e063de49a00a0002000000000101f2c9cde223c5c38dfeef3c8f027a003d0f2ac466bc3c2e6169885173bde2f93f0400000000ffffffff05c78aa90000000000160014a2554a44e729274c988ccff6f1cfe00a75f13134532800000000000017a9148667d1e36c4456928af075a5a0552418f58953948798511100000000001976a91417f761e91ced0de6503c26d3b4ffd32a334eec1588ac63410800000000001976a914f566d8c7e2f92941a053278eb7c84ac29345899e88ac9943260100000000160014e0145df166b20db925a3f7492889a5eb5ff6d36302473044022042948eaf67b12557c44acfc84db020c40e18a1b8a06e6ca6f37074acf45bcb54022045be10cf41e20c76a08fd9d815302d9a432c15ce8774815a8d22186ee9ae492b0121029c73c9de8db31bd1e6c27b8e0f83f7caf385f4d83b37912b8aa8ab23e047d9cb0000000002000000000101867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd1d00000017160014a44b82b5692b3a4ebb434c586a45ee15a170b3cefdffffff029d3ed6020000000017a914784e0683a8041349ab369d61302641d8ea8f5b1187f5b505000000000017a914d1e90865edbb7ba3f737c72f63fa8e2b390dbfd587024730440220721006fe5fda636db868b472012666dccd4e46f49ea6cf18b65a1adc58d00dfc02201379ea61cf4109ea0303277447d6e9b03438db0c27d48030477dbb4b03ab63190121028e3c8dc494dc8c2aa46a8dc16c44481972fa6b56cf79e20265807848749ebe8e49a00a00020000000001039a1bd6f86eadf40c313dab87ae3b188e5da65189b24a64cf29bfa20bf566fff70000000017160014a1cf93ea5616601cc239e19dfad5ab4b21b9d068feffffff73e5e2da91487a8cf62a82c3361cdec412f0d90fc25fd2abf5013f4516fc325d00000000171600147278d0fe5502fae372c04c442250e98ae8f27ef1feffffff5f306bcd6a6cdcd40c162828c7b70c1f32ecd9dc6fdd54ec7ac2a999be24c42b0000000017160014320c7aefdabcfbfc2e97046a0b8dd7195c6c3b66feffffff028e250300000000001976a91482e32ea289b018c7abd37425c94d2835e1e6014888ac4b420f000000000017a9141d19297d146a4aa187a5e994082c75045d4542c08702473044022017dcc32aac412b25abdd239e181f4f1757ec00fc9e6cbcdf6a846a4ffc06e87c022058a76b76992e134a3cb516c896806fa0321f1a808ecd646e2b25d2b1a7b050ad012103b6429129317df3039982aa32e6a08e2dc87141335736fa16960a4d0d1c5dc43102473044022030119e9bc2c600a32f4ed0bc0ef88be09f5714712f2b7aab706d3e570814d88402200d3ef7472834ef46cafebde95ace03582c74dc6620f15edb09d7ceafbf0a5e0401210205d3cc450c1ba282b22b48836d1bc2b85428411a05510d2da3c48c4fa988fa960247304402205914df5d1970a40ca7c4b813ef65bc5684de6035bb1e4b935f271ede036c8e06022012ea93018819389df5a8f9287856e297ea4cac438724ae41c6a6f4e8441d3df30121024765e40ea3666ccc8331ac9568f8d6d15ec53e408e55ab01c3d972b1d18f34e449a00a00010000000001013f9b44d37449fd071fe4d42a531bcd9653a78ea186669e80198783058cb0616b010000000000000000028e55020000000000160014fdde699c4451a3cff194f9f94495fa303ae48b88dd390100000000001600143b4e17cb3bbad44f73c79e3c3c32f9b8893db6f902483045022100d07baf1fb697be9f63e64eec288876627b33fe689e663e473d553ede7d5e9856022048fbe6981b8dca2c9ae1577b8992a54ee0f953031a35fa206d6b7740f8469a5501210226794f7cec79943d06c0c88043e9f185e5938fe2b43f33194776e394c22a924e00000000010000000001fd570131a4f6a84f67cd7466bf87ed29e72dd75e851a54a7aa6906e0dd7fa625aac9ad10000000171600143eabaa215ab085891ddfc729809f44a030dd92bbffffffff67d3595f01bba0f3517792d5052b12b3fb4a1915daf5cdf663bfdd966b90e16600000000171600142bd00e29a02ec9022e7ff68c20f31a97fffa3fbfffffffff71e8d24542c646cdb61b0a16a80a0713252ba836dfb3a7815df8e3424ff013a10000000017160014c9de5d5422d53e3b9daceddbee1cf9d22c1174c7ffffffffe470cdc48a1bb0d5ad8045eae1bfecc5bc8eaec9e63f82ea3dc41485d95bb44f0000000017160014d18e5d3ee81bcf8f716ac023b0c2bd0ac134e1b5ffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1562b000000171600145e2e19835463503881f3ad1d3a56b072b59c9604ffffffffe1d828a96eb6625de20afff75fdad47ea75ba1c16e6f6d39759fc474e0a53fc5000000001716001403683ad7368715d874f4048d44d53814d58dbc9dffffffff132c716a4967f8b13a63c8bbdbfbb11122e48913e7f89eb8ffe28cf971b9ca1900000000171600144c878d6d5bf4af4a3875c9913beb0d53735eef58ffffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9782000000017160014abe65fe37cc40f5cd9187ee15b4b7a84baafffd9ffffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7003100000017160014884d287acb15c94cd62b11ec5586148696fbe48affffffff60ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e102f000000171600148ec2de41942770e1bc0cdc7139f96d16e799e598ffffffff17a366830dc3ce9d6fbaf92ed01798ef9d871cd889e2e949042fa26895d41d220100000017160014bb7f811b057de7704a1b98ad0a04412d6d340314ffffffffe1736c269de4c044245e83c79616b7f6db54ca50e029503545aa07ce13eece0f0000000017160014290757adda34289dfa45aa1e4d8ecfcc6fd8f92bffffffff3acc6db8b273f6a1c0db96981c401de727dd850359b8a29e4a44c50d96d53e400100000017160014116b04bff9f2dfdbcb0189d34f882caf60155fbdffffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9390000001716001410da9a9a940ed76a2f15d195477fa7460b6a740fffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f3200000017160014f525ae15d042b68afa7e0ebe01125d3403d2913bffffffff70c5ab72052ce8c35c5eec7b2743ac2812c2e934be9295f3ad78fc927e07c71e00000000171600146c1dd2c54b39ddb84237ba6f983d2fd9ed85aafcffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc60900000017160014a5f943fae225cbd9fba8a2c926bb515e2f6527e6ffffffff4325d2bacd5845b725848fe7240f5186909c471bb03d3fcd727b76b700f879f400000000171600149685432b4ce23bf6ee62bbfbc98787a94dadc702ffffffff9311fc700aa095fb5c0d97d1b12f1e657136556ee062822d59ff539ed30f9fb10000000017160014aaf74fbfd6bbfcefa2f037b1e6fea187da47abb8ffffffffbd683cb56033f207c6707a298c90fe1cbf24cd0507754e87eabdf97e27055aa000000000171600142fa55334c15804c583b79767e7f6e0804f54cee1ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d06703207700000017160014fe8c855985b7297dee8eedbbf4d68d6a6c1f8798ffffffff5651b4dcef299d513bc684a1bf97ab5f178c4ba114df1e04a7a9e2a914cebf19000000001716001439ff1c52da483f6e431ddca29240cfb34f88165cffffffff9d569bb29cc583e9aaea8456f3386281929ebe2d58276d05836f4938aa74381900000000171600140938990f52c432f57698152351fa2ede4a84f360ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4874c00000017160014b2562b2639d4b615ff9a394bf6822dfcebac730affffffffd2692b54a6ac0757f450ae07e4e0bc2d7a00bfe9422d7c3946453fefb1568373050000001716001472ce1f3313e632a583f9b2edee7c1c41824e4da7ffffffffe1dc0cca2c64e26db59328b0f32e35a73736a55b40efe74ac53ba8cd2a7fd53f00000000171600146fbc3aa9927a824d9d5ce099cf5191820d4a839fffffffffaff8dfafef89c3f27c43e21dec934daa5897d1bafd354e7b59e0df5ca40a65ca1c000000171600145e2e19835463503881f3ad1d3a56b072b59c9604ffffffff3e4e693fc9f04367a2d3c2b0193fd0571a1e2bd5d6d839e999cb1b0bd7ca42ca01000000171600146e63c5f30105b8060da8dc98e1a6a185fe7afdc4ffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e2b000000171600148d1f3e12ccff3c3e03ca01acabc4377de8a1e3faffffffffe3c21fbfa36fa5d236d477958a0cbfeaf5bfd6e9ca1373d66a9719d038f38f7a0100000017160014ca564478e293d7117c908fcf431714d8d22da7ffffffffffa7a780761a8ab229b60ef5df1c89727ccc681b5421b92fe07543f773ed97d2d00000000017160014887cc7aab0934cbf21de06ba48cadfb6e7b8cf31ffffffff69f3635ae9fa0912e56a93da87461b2ba6652514f363de9d90ef494edd003eb1000000001716001454ca9d76ddeebe608c3dc0faf7f87518b1669ab6ffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1566600000017160014a65b7eebf0e5dfd0326cf7d093abdf8c94e74e05ffffffff3fcce332dbc9618665f421b488abab733be133801757b2a9e9345c73ca32afb600000000171600141d7983c0c25498e825d3710be0f03216bcd7bb13ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4873700000017160014372934b37ee5c48d9b11598b5dff79793fa789cbffffffffe8b0d412f6d683b02bdbcba2d1aeb56bba9b7565ecf168d1395e441b657ca69d01000000171600143a2c6e73046138a27c07d0c1d5d54fe245fa88dcffffffffb4a0c5dd54c65ca6048369d44fd87ed37f765526994fbe806b99601de2a046730000000017160014dad31f4bdab9d735a7fcccaa9b8755e91410645affffffffb835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d84113000000171600144dc7b534a7e3a4979dd75e59a65892cf105fbca7ffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f5c0000001716001441ef0a020818fb46da07d5aa7f718de175ef88acffffffff5e0f48e8b51bb4ee1f277ff84a91de737726ebfc934b28160e6b4015d4a9378800000000171600149685432b4ce23bf6ee62bbfbc98787a94dadc702ffffffffc5af2806d5608ecce31590531feb49d2d28322af17073282a23702d5176ac8380000000017160014f342f23b17943c5cc4448c8d5757fdc22b0b8e24ffffffff66c505995e1795aebdfbb3776d3f20856bc7d86b8efbc524ec711e0707993ea700000000171600146e03bf44af9eeade895d574b6dfb5474ed189dddffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d06703207e00000017160014e801a69d45902f4b086d5aac758d5d5d920999a2fffffffffa5802bc2ff6a7955b42d736cfc0f54f756657161b0b9e91d538e8688381d081000000001716001444f251f42ca9293d7943ed926552496251da37d2ffffffff50d7ab1fb0ddeb776b67580a0583024e2e8b53fa4b07916f1a81466e31751f2700000000171600149191cca6f7312e5fba675b6832fc5e8b77979cb3ffffffff3c08a27e232d692d23153705051c3a90e729e8e0a932e7db39481540c89d0d540000000017160014ccb5d417abc188f8f5916254d814e1a1def36f0affffffff144340b1d1e050b753de59158b9872ae98d078d19b9a0f82f12019e6eed74faf0100000017160014d038aa9c5f4847b78f6ee0b7c81aabe647e296ddffffffffe2b433f5af7fad91bd8e4c952a203258dbb342d9c4eef272ad7e2011e7cfbb230000000017160014c85c160f624959d33649b12b8449f1f06b529f5affffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b392b00000017160014cb7e5e3a59a5e084933f83a4a049e0b4ed825b3fffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd343f00000017160014f4b561538f8765feb0e076419a9b2ab74a1f77c5ffffffff19b8f2e8c295e7fb5ed75b8da29e58708d5f0b7fb1d15070e9c02bd34e7955600000000017160014fa7ee994e22f4f69d8a62bf8a3a30a4dcd735f1fffffffff2c1141bbe9b17f564fda66089fac4ad511036b4a9e8d3698e8368103f9a23f033300000017160014da0363e3f537425cc22f4913f73416ff65d73dccffffffff04fb9cbe48edb815a1221710cc1c48899ed10ac685c0fc802721d448057bbfd700000000171600141da921df702897411fa1a1ccccd2b790c810ae04ffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1015c00000017160014aae41e267d316709bed387b2d5324acdfc516e49ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223a000000171600141c14ee9166e23bf17dd55f31a14f382237be6b94ffffffff5d0dda4f37bff1acc602a39064ba95a84383b30c397289510f2f36ff7762db170600000017160014747cba9a8fb6789d2b803754810b4cbda50fd72bffffffffa73b17665e16a0f36d3916fda698ffb842eaba607be9b39e884f520687350977000000001716001461f96322006fa3154f298f723981c1e4eeb86235ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d0670320850000001716001416e919a2192dca3349fd2b614eda926ed6335a71ffffffffa23fe7a56295400ecd60af319cb8504728a83957da64adb7a65dc69202dc01c5050000006946304302207ba1ef404e9ca7af5372e80a4f2add06a0b339586f35942ac212b2a383ef9022021f1580578166b4f05a3d3b8542a61701fda3643ed0b90b003010ef58b44a73a2012102854c706fc570552c5cd88f71a4dd60d46c61a0f47552faa770c49a43b4a7bfa8ffffffffdcc2ffd2e653383223c6102e436984836273a4de87e8ab9eac77b094911ed41a000000001716001494261c9c4f3c7aad9278e1eff10fa36409846ee9ffffffffee0d57c89922d2319a86ecf535b7fd6fefde7d9badd4155a2a3b90cb4d5645b5000000001716001442f146101d36624d658c7ae416e52396c6d57baeffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b390f00000017160014a0f943261fa20a6b84efad9cd5106202bc1f59fcffffffffbbfbd1ca0fb76572f70b5672865411886f4a0c00ad0aa4f0d46cc3bb8780cdaf0000000017160014cf8a2bdd047f093e8e9b62b69ce77ade04ce9927ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d4700000017160014003a8eef83f17bfdaddd5a0375f0860be6bcacc2ffffffff0d81b02a060bef94416a9a439e17895dee664ae3b744a4de6cb4b05ed4fe91550500000017160014daca8e9f79822907be9cf49382bba2d1ad161983ffffffff44de40cb7005a609259ed036aa2f196667bb94287495bbf109be5a5b3be07b3000000000171600146e22d1f88b34a3ec45286f536e0c761f66b009a9ffffffff9571d3d229483c4bd1089f58f773add8859dd08b0f1266e5f090a0718f1cb9a507000000171600141ae614ddbd32c9282017ce6788967c068e0fe60effffffff8e1ad2b50c8d5bbcccaa20205edaa68f726b369009ac96a56759d1c6c44d2a5a0100000017160014e8849036db6c94be4631daca432b4f540978779bffffffff53756dd54fd59b6da4b903b674c6441a6acfa934d992214ff67bb7fabab4816e0b000000171600147b82e29121121f62b88f54a0094947c3e4024e60ffffffff4f7f5f0955f4b70465cdd18798ed9fc0ba7f8fc50dc83c45c83d9109e04db3a60000000017160014116989bb115f0af7def6840c8399db1c8d14ab75ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb4700000017160014f4b561538f8765feb0e076419a9b2ab74a1f77c5ffffffff28c4c0b79ed383126e0b92c65853db2b1317a4b230adce50b88e95331843b60200000000171600141145d06ae446537a9e5cf4b3e623c49a56c40af6ffffffffebe72b7d622ae65066f1f345faf499eb4025cc6ded282227cbe97a055105c88600000000171600145f7682c4bbbce6679958d3490c8fea7942b590f6ffffffffb835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d8410400000017160014e71641f0bfa20d18c03f0fea9b9c73d97f97895bffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be413a00000017160014140de2a59a170cc59d18e180ffb1c5277c2850f2ffffffff0690382a536c1e3717e886b50ad98c540b15720f86f120c5bc60f75cfbef27bf0400000017160014747cba9a8fb6789d2b803754810b4cbda50fd72bffffffffeded8cd14f6fb3b4b60b161b12432db0b1a8667fa0855e56cfa9bb2b6520757305000000171600143544a6bd2c911af7dce3e181b375faeaa099501cffffffff292d044b6eee04df8fb2a4d80c796f4ea36eb74c2e3ec8f0e37f214ac8852b0a0000000017160014f6bfcc5d8e51729ddad7e8722d5e7642c709a274ffffffff50d9fb15b46f7b6c5901c0fcc969e19a760bda5382339b5ca7472e1468433e0000000000171600147c7b88e5eac91e8f8d65e8a5cd5db19f4d30ca5cffffffff3a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa13000000171600142081f86aecc4d61d47b8add98cddfdeab90d5c85ffffffffcc69faeda34b2e8b9fbe3ac20ce8ff99360e8b6062e724817f3ab71715d41b060000000017160014a1db82b987e3f26eda88f1c6ce9d9ef458293812ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace532249000000171600147775dcca04fe2ce2652ba0737db5fc2493ffdea9ffffffff8e8506ab44df454a40f3c4b7d61dc506a3d6d6fb56da1583adea01f5453ccde00000000017160014d8e6f00893f2528cc99c133474190e8fbdeb867bffffffff5c25fd9c52215a0ddf19a9898245baa728d368f58cc22be890a0878bdb5103ba0600000017160014775b858f57ddc602c7048c0929300724d7e25820ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc62d00000017160014d86fc09448662c91392e9a241017c4784af46a3effffffff80a093e8cbef202ef4c173a38d860648653490812493618d19541e06b22abd570000000017160014df0277327039d8f525727b3637af05f60165cc3cffffffff4e077b94eb1d7333b1361ac41f1475f039df301d9b50a5535084881f73c4a75700000000171600146332daa98ff901efd8b52fa40fcda75102caa690ffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d1380000001716001458c8652625640f8f8727cef89003ec85d0e832d4ffffffff7005de51516e9a2792fa561757e61b6447d9ad25b49048b1ac705853073a5e870000000017160014a0c0274ea9ce4b91745f17c846a923ac1961e0b4ffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac53000000171600142eb58895f611479144754517a0c33a2b07ef1507ffffffff6f3164a1b96481409d3a36f40a870b97dbb264161609b16d50d260842ff79cef0000000017160014dbe299417ae3f888820874702e7a5db8b91254d6ffffffff78ff4b3c648099487566a948a5a0d6b359231f1622ee23fbb8381512059da338000000001716001413c018994e07c881e1a365ce04d22347b785450bffffffff3c9c22060390debe7c5457cf4ac434b584d1699cbc237619edac48e79db3f39d0100000017160014140c0ed47dc38d3fa64cb89154272ecf9ca2e000ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd34560000001716001497d18da1c58e79af69480fa89a3d0c6e61b846cbffffffff17edf37217763c39f27059f7a86bb761a2c7a4a83f64b637d40219d3429a39920000000017160014db1409f12accd8d2d74ce291687985696a58a121ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc61b00000017160014312a31e7098939e58371a4fc2223526c6a2a2dc3ffffffffc242dfe6dc907c842a86024cec7470a6147655f95042bf3297f9b48db605114d0000000017160014cded76d69f5ab918cb5e212de164d25633b57808ffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1010a00000017160014628e4ed8668daf52f30cbd217dd885439e71bd3affffffffc2aeee30cc4ba8b244a68d97c26d93e23e731dbb60d57b6037498165a7e8d0861a00000017160014fc6923b9086957661aa629f45c0add9648126abbffffffff35e3ab63d884e94b6056e0942fa52ce5519fa94a6310267ab93ddb0a6e5d3b0f01000000171600143c6b6db6f89b59e27aa7ca14f408dfa1eb257839ffffffff3a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa0500000017160014f8fbd603cb79ea23f39a1a2a87743bce2f109283ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb14000000171600146d5be1c8243258768e6402e7c9153134a00766d8ffffffff21f9a34ca5045cd3b3984b0f433e87fd8d4e96565ce1f32ba6a70cceb577d9e30000000017160014159a4cbeeff0870fba882ebf5206dec94894596cffffffffc4962890116ecfecf371d07d4aa1c3e04827344614eeaa9bf48dedf09d5790640000000017160014c51ade5fde730ad82fe7bb20d2b4e4952c5d4693ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c27000000171600147c7eed2871a9cc2fcd7d6df71404d83a7cdd79e8ffffffffcaab2c57a3ac0f68d7eb6499387c618c67d54a7ed55f2355867535cf2d654bd600000000171600145a45d973b1055368490e44b9cf3fbda365dbda40ffffffffc23938cea8786688a341b9cf47dfc284f5c94e2ad6c00caaa831b0b156687e8500000000171600145688e2deed4dc0df9a5bb03ac3a7ac8febd25790ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e2440000001716001494db1ebe094da330e57182c59588b0a4f0971e14ffffffff210541a7ced85f290dd719a4d166f0bb9ccd1f05b7132b9544f3ca05c3c0763a1b00000017160014a49834a610513da0ba0c7d0dd76732b182fd13caffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa48705000000171600147e6433633f74d2e1ae7c8b4a0e861882c41c888bffffffff76cb6c68f9efcfc7df50a95de85c18a8f1110ecf0c20ae7345c3a35e402cd8020000000017160014dbdbd4088abdf5d5009a0ed6b97234a99644ec00ffffffff706d0290778cae9d7c2e9841ecc5bf58c166a2a02aeed44261d235d5017386550100000017160014b7c2a0d585bf83825142631df9ebcc911a21a259ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc60000000017160014224fab48609b17bc76d9acaa81aabcda70d8828bffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223000000017160014c3797dba16a260062eef19eddda6d8a80f7ffffeffffffffae40c2c72851ec4bfcaefd45266b9e8cd4ad59d043e64fc27d94868292744d5d00000000171600146478b1c861a4a878dfa4e076bdd611b869cad864ffffffff91da5da7cc18b8428e7aa868b980f9f732544e0af298e3b1e600e0ea766b2fb20000000017160014f65c8d82c872a43589402142dc3d684235428a9cffffffffbbf6318a44429ef5bfa0c36f4fe1c42d9482fbcc128b8104f061817410821dec00000000171600145e4a5c54d71a9ecec56d8e367bf469610bc2ea87ffffffff78d361623a12843a4d851b407856e7743b3775b29631e6cb7cdf5bc153ada54600000000171600140d73f33891af97d3fca8bcd0d733e7fdb7adff89ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c0c000000171600147ddd5ee8cea3e25c06622d977c702f429e76d318ffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1016800000017160014fd5ec65e9b240ca1292afd6ed45df2f1081914faffffffff8e40a440087289048e9caaa8427a6f623c4d4afe6c7768eb88fa5179f80563ac000000001716001463dac5d70fc76f8635dbfaf93eaec932fbd97f97ffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be411c00000017160014845f4300df43b9f67471a1e9bc8a01ecfe4f0665ffffffffeaa931a27f2b421cde98a6bb3e5bb43d61d6de25b3c65827bd6b3137cb7cd4aa0300000017160014a29f56e21e5c0b28e2acbd26d66459a8ca92bcb3ffffffffcc54971a26a054191d09213feba5b5a04848d6598be46561fa9c559b798a26990900000017160014cae708c037114ff105cc9afac6ea0ff74900c838ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd3405000000171600141f622a9c5ec056e9645c656754dd2b21f299f802ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c0f000000171600146c24d836ee681daa36accab8fa6f61a3c07bf680ffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e460000001716001497d18da1c58e79af69480fa89a3d0c6e61b846cbffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1016d0000001716001449ab7b4db22dcb97842b49b6b23959288a0e6573ffffffffce2c9cb9b353c6b56a5ff15da8649ccffc26fdf9a706c8475b75b73ef48ccb660200000017160014468a38358b4f4f5c9c1fba059c5d93b1db697dedffffffffba6a5829c627738bef6fc4f138f97511c78be2f006d12d217cc35e7967c6b3320000000017160014d2b027a5b915d3abec43ba1bea96e71748313d08ffffffff5da3599f645519dab9b718c88256aa412494c09eba568123aba22f16e05d22b30400000017160014e90b9f60246848d5b576362f92a5f3e759bc769cffffffff3fcce332dbc9618665f421b488abab733be133801757b2a9e9345c73ca32afb60100000017160014acc64de5ed3ce4d5060e396a741a9585f16e4ebefffffffff028deb6452fcd651885e7dd93f07a8794cc5afff6a75deef707cd64aadab62600000000171600146d995270e7c9deb2183f5d635663061913a09cb2ffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df35000000171600144cbffcba8e81dfc62891c9451f07b815d71eb3ddffffffffe01fc9422cf363505fa2daea0a72b046695a106e3b2289e03664d8fb23b70bd60000000017160014494e523dac510533b3b916d30a0fdbb9f77ce423ffffffff3e700b18701d0a1ce085d7920460ae8c3ced3df16d02a7d92b1c6396fcc8e55a0900000017160014fc0084424fef363b73604a1069a28ee12ff3f997ffffffff28056f7ac27e345546b787d00ea2f47e917411b1a95081f76d1cd8bf4e69afdb0000000017160014cf8a2bdd047f093e8e9b62b69ce77ade04ce9927ffffffffaa4cb155e7760f347836cc547fb2609a6ad090c7684bccf0da8b79c528541e4a0000000017160014bb3ca143fe6b764eef794cb1ca68354338bebc00ffffffffde2df047843f58b18f595f7096b231fb88b6adfe4d788d443ff91c1763c26190020000001716001422655ca0a4e8d0dae985989c912c7e9ae54fb693ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd345c000000171600146cfad9f7359ea9a3978d4f4b36302af8b62b6b9cffffffffe8028a05785b86a87e9690afe843100d0d8aed6638eaab39a55ac6d6e64387ea0000000017160014f5338051b14d7b1d87633f56fef0a108fd5b6fe4ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53225300000017160014a4383859c7b57cf2d4ae0a0a2bc5b2f47bef4f08ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb2c00000017160014061e5b56413df95bac30190824fed29e55134642ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd340d000000171600141711f241284c4a7fffbe8b79a5670f09c49d7501fffffffff30de41b8a737c479aef0ab3f8fe27193eb4831c487c064fdbac62ea8f60b67a0000000017160014fc45d6c862a710712676194180b09a87d09e94feffffffff310c1a42fd69edba69e3e82b13b7f17a726aff5b6504270285b2bbd3e5777de90200000017160014553a67e7cd31eb6b66bdeea351ebcd0bcd8059cdffffffff2c1141bbe9b17f564fda66089fac4ad511036b4a9e8d3698e8368103f9a23f033700000017160014f657c84e6119d675ae18d2be41951467f4b936e9ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d25000000171600148fb3de4582e8b2182d0025eaf409d8dcfc22dfc7ffffffff2462ba04c8798c60897de129c1e2701646486bb9561be866af59104aac6a39b006000000171600140d4aff04b114b0bfc16caeb66ef4f880bc6d598bfffffffff84285bcb7371227cf92265f4ec5f15cb4968a079228711ed2c184a3832be5220300000017160014d6280adbd1d74ad8a4b6c322370439212b669223ffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac4400000017160014a567bbe721eba71da0fbf059cbb0b56015a7270fffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c1e00000017160014b28bc8ffc1c038d7215127248570a90638eb930fffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb5a000000171600147585bd2055fc5cb9063acc632929316bf2b0a031ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc62b00000017160014a5d24831d2001d04898503d59b7aa138309397ebffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b3927000000171600144e8dfc41c4038b0aee939f42ac705a325845b133ffffffff871287f28af15810005d42e205179b7493cc7fb3af501e6ae01ad731544000a0000000001716001413c018994e07c881e1a365ce04d22347b785450bffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d0670320060000001716001448808817ebabeb7a889bec5e888d864332946050ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e24a00000017160014f3ad9ca868219198f67338c83628f2222dbd9cf5ffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac0800000017160014dfa0d7530aadef693d3c38c8d6f741208077ba00ffffffff981a0e9a9fda4ef33735d517bddb18a07546ce9d2a2afb4d8d6d530b8e5fe4af0100000017160014d1747150e0441c29980ed745b3aaae4f277f3ac1ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e21d0000001716001498e2411b6faaaa50ede4e3deb2c3ce047805063bffffffff6a16553d73141e953f71d36ff214669df6277e4a3eb0ebcf00343abf740526d50200000017160014acc64de5ed3ce4d5060e396a741a9585f16e4ebeffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd340b00000017160014f24469e8b3aa522426b7f6e4c4a2a5138eb1bfbcfffffffff7081e401f868ecaa49fdc13edb81fa87714ffd43c3f023d23a5300d93b73de90000000017160014de4f7cadabed893b22d51b65f3df59488e0fd050ffffffff27f26fb950c559790332d4ff06e1d81831df64f4cec94ceabcd32519394ac57b03000000171600146100a086c29cfbcf60abfd36881b76fa2de5695fffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4871000000017160014b46460d0db0481843215987212db4638ebf403b9ffffffffb385f751a753471c04aaef551ff9887f8bb9f6027e8bb9e1c00d47725096c05a0000000017160014d572d4d5ff05f30c831744dfb05371c73f6b5d06ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c35000000171600147ba01767c7a12c26efdb17116f032f0792ef92f7ffffffff29e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec1230000001716001415267b4b970899a72a20509e7dcdcff4d3617ddcffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd343a00000017160014e00d5a43e177926223461ec23c0962779754f710ffffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40a000000171600148d3ec8ec7c620393edb8cb1014be07989b707dc3ffffffffb7a58b1009bc4fb321564b0f8135cf8dbf5aee383f51e47531c97151180a56a804000000171600144c7b2f091fe488e58d306feb78c2ecfc070ffe95ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb3e00000017160014ecc8fa08acfc94521aa1ae7604abdae853a5ff4affffffffb17430e09ca68694ff6c29906a3bdba66956a8ace4e3579bb18810889907730012000000171600146de80f3c22bd39e9cf803e6f981f6c4b6a0a05b4ffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b393a00000017160014ab0203718dd61cd3c679e97b84fdd62210383eaaffffffff030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee1040000001716001483b49dc3cf4d1ccf9a1b670995d71cc7abdc1914ffffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c70027000000171600144128979df0366e50e751bea6835ee3daffb86ce1ffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d12500000017160014c240b07eeeeb243c9eea6253bc82c00ef6b8bb3effffffff31b6425852eed12ddeccaeb408152f3d5e2b1945a52e92c44c3a7dfa8b2450a000000000171600141cb11ce4ae834e023f4788c3fbd23524a48e7b2cffffffffd2b52aede2053de471033e645523f6916056e43475cf87d3d4e4f9220d9faac60400000017160014bb4784c00ba4e8002773228de529b5080d4943eaffffffff9103846294a57536a81b5ad721da0dd0f82d69c4bc1eb359d454a8c8a9ea24b600000000171600145c21432f9d678cf2fa0f24498417053cff67d14bffffffff8797b26453fd5cb3a827375780a313212f5a5675c11aa31ea1abb5475f3d110f00000000171600145ba1597076c666f048b518b9cb4205fdb21aac39ffffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a541f000000171600148d84eae2497d796f85ed5ad170b0c86c28f934daffffffffb17430e09ca68694ff6c29906a3bdba66956a8ace4e3579bb1881088990773000d00000017160014ecefe02652270435e0207152df0eb6dd851cf349ffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b391b00000017160014d8082e47d6f500cd8c03625521c0d38d443d10cdffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd344e0000001716001413e7f6ba2e1c64fe7e99dcb6d7a9a86f701cdca0ffffffff66d955af747c13a4a7a984d9d5c55b8130fb01d0ac744164ab629448be14ade20600000017160014dde4a829981384b7467a3377df05b40c86f4538cffffffffe91b176547096cf921a59f9427dd57e0446c6060c95b315aa6d5b2bf66b4ff350000000017160014875462b45b3862f080fa26a9ee1cd1d55703b2d1ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032073000000171600149d528cbef05845d40eb1e052833ad38ab05b950affffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9782a00000017160014b33f1608e4102be062f1729147388b7b76a81f1cffffffff71cf52f7144dd3fdd5c5ec5bc89d6be99cb2c0fb83ac4a8fb38e0e051f5c0793000000001716001404695496f432a3df9aa7a7440763d05430362f91ffffffff825cda3824e69d5bdeaf39cddcdd9e5e8b9e94379b31e24cfe472bb17aaa5c2700000000171600146e86d1f1c10dc52c3770c545dd8821e3d3a91845ffffffff138fddeedbeee1bbc4abae8756e5877f8d29c5b53fd3f32838e4b2443021c8560a00000017160014b3bd486f25ed9c06fbc240b5ea1a3375a9dfe9bdffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa487320000001716001401d73708da18aad699037aea35460ab353083dd7ffffffffc85a66fd7c595db1afd2148dd7932a76ae4951dda15a30ae8e885bd6b260873500000000171600141a2ec6251e2106db04a0a0852bafaa8258a07594ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d06703205a000000171600142fa8d6920edb1585bef91556740cd6c8fc3e4e34ffffffffb7a58b1009bc4fb321564b0f8135cf8dbf5aee383f51e47531c97151180a56a800000000171600142e5f239acace2dedac81898d5b5c2532d49bd785ffffffffd0959ef71aa4d3936992ce4bd4a5bc92c9005ed95fb265b9e8c4591d7ccc62a60100000017160014db25233781e4afc9ba93ebab22d966be7ca01f69ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb1900000017160014b8532711db2edcb526dcf4669c4504ee8c56fa3effffffff40bb4b03ce2e00465e07208dedd61a8a48acdb4f67249c50e6fb9029831223180000000017160014ffb0755a7bda15d297f2604357f75cc35f82eb62ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d6100000017160014b84d4095988e6396f58f69836003097c1098aee9ffffffff30ae3fef0d0bb008b861b0d9c004dfb11fb872877e090f83e5c2f2f7cc9086110100000017160014bf2b184a7da2b161bb161015cc05250d742bc1ddffffffffe9fca66d06853187a6d2fa5c103bd37013e5d8e961b09f1cfa041c3383f2be59000000001716001483c24602977120848922b07311bebde3f6190658ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c46000000171600146d27d4280f4ae677f41f868583747a450070debdffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e0e00000017160014f70cef9cbcaa8f6994791f554b6c21b2037a9bfdffffffffaff8dfafef89c3f27c43e21dec934daa5897d1bafd354e7b59e0df5ca40a65ca4100000000ffffffff60ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e100f00000017160014dfa0d7530aadef693d3c38c8d6f741208077ba00fffffffffa5f27cc942f95adb7af298a43f7f3d4f5be5cd8ffe547fd5ffe7bd2d4844ff80000000017160014bf148e6bcf28601b98927cd7081fcdcc1f760d25ffffffff16d05b4a95c5ec3d905baa87cba720a76a5a4b62d35a992d0921d62164497aad0000000017160014930a03b0a997dbd04685e8d70ed01e414f5c866cffffffff6280fe3a8189cdc61d1c9c2d1b1112769efc9567f78247db674bcfa08c7cf79400000000171600144803c04ab51aff22051b7ff9152f30415358eeedffffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a542e00000017160014ddfc1888d61ad68bfc0f52f8bdd8dd47157b5b2dffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac640000001716001497d18da1c58e79af69480fa89a3d0c6e61b846cbfffffffffcb2ab77b7b3d43e4e315d7e601e6bb916a8caefa3b6d04ac1fc324638040beb0300000017160014ac8e2ed24fd481708662363301419ae1afbbec77ffffffff8168b130c2a4ea774cb61b6558cb52a0e02349133f6d737ac0016096e1d16c35000000001716001404df1f9456d5931bf398a7f98a3d1c5016c9d539ffffffff1aa22b90214a358a2e334afbbcba09238862ea762f9267efcbfd474814a61a190300000017160014c375fa35d81f125b39e105732403b61a000278a2ffffffffa5687b0d4fe21d3b6783d7fd3847ce5090862bd6603a3b1a191ed48f4851cf600000000017160014cfca685e8b96cd7288e2970263ed18c2da401ec5ffffffff7f4025ed74403c9d3477f25bf40110eeff6382c783b073fe979e447bde5b6ca6000000001716001483c24602977120848922b07311bebde3f6190658ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53224b000000171600149131945a980a9128bb0e44079b76ea6fd3b131d8ffffffff5867db44975f6b5d2db1a912a70c331c595668160b0a681afca8366cacb27e8400000000171600148f630022f0067e2d5b70fb08f4cdc90091f299b7ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb3400000017160014a28f4b1fdd06674ff56663ec16e407040f5b40e8ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d1900000017160014a6123e045c8c7dcde04718fb971afae882e1a3c0fffffffff36616dccdde07308708d436912b745c24b8bbb1a3d20cb97f2587c1a87653ac0000000017160014b8510c1ac6f03b5c5de12f14967ee88bd0fce39dffffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b92100000017160014b514c753258ff37f49916600ceef712e1bd5a7b7ffffffffc9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d743700000017160014b750887498a41a49794cbc20adfa3a9a320491f3ffffffffde2df047843f58b18f595f7096b231fb88b6adfe4d788d443ff91c1763c261900300000017160014c118ca2606aea0dacdca7689f32497294aeb4287ffffffffb3aec851af0d0a6cdfa2d5daf458e1811335fced665c7269f3dc84a5bea959a00000000017160014deeb93da43e6e0ec369c0f582406496728551180ffffffffff3ba4acefa50921859a74241ca0ac133042630377f86e286e1935f0d2fc87ef01000000171600147f157bc055622a2fea950398cdb5a7a8480154f9ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c2c00000017160014a21b9dcf022a71bb2d7a1f529d4e224b51236d92ffffffffb699eab3bc1bb52ba2176b6fd686fc79472288bf5644edd7c4259cf7fb0fbb380000000017160014b78bb131b62376850a92c2216201e1f891660c2cffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4870d00000017160014cd13b9f2dbf15321a11559d18af792898fb6472fffffffff6267da857905e70d096f39fb150568366a781038208155befb848c97b4563e330000000017160014eae19ba8b3340109ca9f406f6a4baec31864454efffffffff6a39ce4aa41b80c219170dbc1beca89b77160c802b41501ff43d0b3db04f385000000001716001414871eaf90de8d4a932fb1c73abc9683b68c74d9ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d3a0000001716001480c50af9db6e2d033ee4aa243ea58e1da2fcb1eaffffffff847ac870feb835b95a306563744af1d5c78afd6b71d65a7322ab7576b0b5a85c02000000171600141c14ee9166e23bf17dd55f31a14f382237be6b94ffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f3d000000171600147775dcca04fe2ce2652ba0737db5fc2493ffdea9ffffffff9e12e0228a243c8581cf4fc79b024cddffa8b06294b88c8872a68f4343d39bd100000000171600146bc9f07e7b27ef4ce554a50c12679c8c1a5f020effffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032015000000171600149cc32f5027cd34469992f79aadc288e9c1259678ffffffffdddc8f6be4e20568ca40968ec43428ab60e19f6478a56459b6c52250dd3b52bd000000001716001480f644bf546ce7096d27e8868355a3242dc39286ffffffff5734378eced4970ab1feaad1f288b6f6b4a5b2d8b7c5a06ba3f59a1b585f1d6d010000001716001466a14845fd84c621d6907b900caa24f9c19d87c0ffffffffbb21d3a217b0de35d4694c60dcab866aff13e899b913f77ffb8e04bc1a29438c0000000017160014074b41c3a28452b5d799833b6b0462595e9bc2b9fffffffff287f2a497a0a4cef21f6fe7e1fa90360c75cd73fbbfa93b61690d561fd214720400000017160014d2c1d20334a13219b2424f7d3409632318848060ffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f6200000017160014c7da2fcf203c8de5b160bf2646eb7c75bfcd3bdeffffffffb7a58b1009bc4fb321564b0f8135cf8dbf5aee383f51e47531c97151180a56a805000000171600142ba48680343e35a42864f6f4fcd501dff5f028d2ffffffffcc704585a43ce16b4551db1505b8acf176119ecabe04f03b3afca54bc90758ed23000000171600149d668ac50dc3913c1e58f27b478dd46d163ecd87ffffffff5b00851608e2960e206ea9cc7ee323f4c7f3a1258c95b233aab3bf9932aabff500000000171600142462070dc2b0cb8a9d371a2fd3640bf592aa272bfffffffff9c0dcf17653b35815de1bf798b7d1fe45c554ca5f502b3c4b9a1f9838df3a9f00000000171600143cc451415fd1c902fabd4004b334ef269224780bffffffff2b9e3e78831fc308d33aa034951b98d86778a24c0fe33db3cc8e220af1c49f470000000017160014eb98312a5d830a54a7a45900120ba16a0f3ed1afffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df24000000171600149105862721b889d5c212cd955d962907348cf0acffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac0c000000171600141b18bedabdb5404ab12ede4f7a0051ccf59a71d5ffffffff001541ab6a985d37479b7802f87bf2ade636c18b2239efb61bf120af4af41f3c01000000171600144b9a1e7c9a4f901102c8a3f976d5e6340d910e0effffffffe9b92a6073bd4d6eee0312ae7df1bd79885046c62015b108cd2aec0bb720b5be000000006a473044022044b830144cb2d79419e068fe14ea78c1d2d9a2d0f6748a7fd3f5a6c14965390302202922d4b031af557279aeca3bf9c049082602c5fa41117d5807db8d29b1afff4601210348c0e8a75d9263c4372ad1f9ac7f338843258e4461c56759cd063a2bc0371e33ffffffff9c13a618f7ec9254571f1333d13777db9b117dd43039504040c3edef544b320a0000000017160014432dfc6cf879f86739648bf01b071bce7d8a6ea6ffffffffaf0931f8fc4f76fadb41c9bd0ccfc215baab2dcbe9da836f38bfe476764c87d800000000171600146dc3bda26ff51eb258a5bd9cd019b28b0f32a797ffffffff343b1c52a0909282503eb065b7dd11bde232766fa1665aab67cc85ceddd8f5890000000017160014b51a5004eab05cd4816512b401ae2a3b6a6c09ebffffffffc6791b1679941cadbc2b5321a26c0b8e748e39854efc68115ccca5e5bd16b7870000000017160014b69e3d604c7717df83a3eb0397b7d88eee0727a8ffffffff4ac34e708e29dac7e04231ffca4becdb9ad15121768eb0a04b72b3a74f8767f2000000001716001469b2ff104eb0b1d6293b2f7de6d9c1a1c415e89bffffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da1c000000171600141c59ea15488d4779ef293d63192eff31a67da013ffffffff719105d79109d4a858165b5dc3f2bb574e08ec2dcf10f5b417eafe103062244600000000171600142c0121ed3c42769618f09bb7be515f6ca9e73400ffffffff105e300b1620f238b34d64a1fdca954d7a52e7497111a8e526235ecf03affcff00000000171600148d2ce1a3904cd7c1f2953bae56e7a60f44640b8bffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d380000001716001486d60ba8354187eac2ab7a6014b345701393d05cffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41220000001716001462c20f69cc476b152ad9f532f309d8cae249c2e5ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa48763000000171600147efa5996da60e2bffbf9a2c39277d1f8382801f2ffffffff6120c709ab2afc5bd007c175f5fa475c654f3d0bf7087f7d385e547d57eeb7ba0100000017160014825cb6aeadc2893c427a6c4119f447779d8061adffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032096000000171600143edb782ffa2444b5d63652f896c0a92bc7dcafedffffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7002c000000171600145e2e19835463503881f3ad1d3a56b072b59c9604ffffffff5f1f879a1f7c8fc51c44370b8e01734047c77a17a4b8c505d4972989d77ba2fb000000001716001494261c9c4f3c7aad9278e1eff10fa36409846ee9ffffffff985160aee4a2ef600b1b8ebdc0247ac9e2b6edaa17afdcfc015505cf72f01c9f0000000017160014d62724877a7be92974ae2e57bba12a9b8c337747ffffffffc2aeee30cc4ba8b244a68d97c26d93e23e731dbb60d57b6037498165a7e8d0861900000000ffffffff9e00706b790d6498282ece1169cffabde03b57ec173f4ab058fcd0e2491e041400000000171600144dc184018d368c9de13ea0dd680b6d8f092472e2ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e23800000017160014eddd174f558b51bdf693578ebd446dae8a4f5e16ffffffffc9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d7436000000171600147c229dc230e2afc0939bab644eb0b2f13a9b28b7ffffffff1148ac6f5ba57e00de9ce402255c33e784859ce1d03ade9a877b75d9536047aa000000001716001446efb77321b33cdbba93ed5cccf12917ba185d0cffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be412b000000171600149c4b5c5d9b9d4d040ef592dead4eecb323c400f7ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa48754000000171600140205b1d99588698d2364b96ad4ed0d883f2529cbffffffff546b5a68555d6f1e1b7e14155992754dc09af7667bac0c8ede00239f2a166e9b0100000017160014c3cf5bfa2a5cd0567cb62d9d0bb1ff1e8206f7aeffffffff29416bf48c8a92fa21831f8869a91da2f47f7885b51f3976452f3b81a1b4d14a0000000017160014c386aba3a8fe70f5207c9ef55056d553071a853affffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41420000006a47304402201f03ccb86150fd12358254776613cd57679acf08cbd651d81aaa915286b9c0d4022059223296ac406012afd972fc3b1f4a3114dde1750dd497219e2a7cf29706669a012102199e2b2cb6e509b78b448590507c2f0008367af42e10841de5c0a026b79de9d9fffffffff7aa3816fad4dfd47a90ed669af58c590a991221cfe6b29a56d9efb2ea640604000000001716001414871eaf90de8d4a932fb1c73abc9683b68c74d9ffffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9781a0000001716001445926911acad4bfb7290525d2d2bcb4d6edfdc5cffffffffda0265675c91dfa35f0ed28faf9252134851ff9ac602039774879fe8cf0ec75a000000001716001483c24602977120848922b07311bebde3f6190658ffffffff9cfac58a6feb7aa75092bc43c99e65336e40d49961bbac86b91d5cee579908160000000017160014298f79df490619442fa39aa879c07e51ddfb576effffffff931ead1b0e011307434741939addf0dfa330cfc53b65420778e31fa128ffd60202000000171600148c6e3465fd4c2106c273d11994c05d3e75756555ffffffffb249c1c9e24fcaa8c499deac3d9d599ed2f9b955a32aa3adfb6a1500c23465d800000000171600147ddcb7acd462ed957a18cd78d7512f0131701d99ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e252000000171600144068326b593feb44e4afc772eee3c194a457a07dffffffffb9d11c3d7904fb1caf98dafa38f85f32caea1db8c64ce8d3306b4565bd9ba452010000001716001490c2daecaf013787c3fae47df70a3178bdb5cbcffffffffff25c7f5e83f019099d6778aa9f06e9acf94d45a3dd650dd5d384291bbbd3da3e0000000017160014ab897e0338dbfe71a4b0dc75ae6bc53e2815357effffffff6a4e1a3fe2163ae47b64c37623b6dd46b2b8b298ecebe2e988299af8c30532ac000000001716001448e508e8e6140686bd165e5830f4201e49b8d084ffffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a5401000000171600147fa678a4428467afbd2cf8880a54c49389a01699ffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e4900000017160014c88b1ccb882fad44a5a332be0800ab467d3d28b3ffffffffc6d008d7de49979f91ac35fc5cf8495c9484024e59f6a4b5744c099a5b7fb7f20000000017160014b9abac22f7248a8a34c49d254ab018962d64a5ffffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d10b00000017160014afc5178347e6f30404b19684e036c8048fdd4564ffffffff55d096eca7a22de67386d092c907e84ceea01f8e643c4cf93d493d8cf6cb1cff010000001716001461336f07b5b9e94ea8f16e0733560965cdf60109ffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df1b0000001716001445d965f617ef2473f2e53e5f10637a5088ecc390ffffffffb007d394fdafc0ddf0ccbec729cfc0f9e331d6d44d9333238f5ff8629a4b1dfb00000000171600145299d18ed5ecaf02ef8bb806032c6c739116b66fffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df22000000171600144ece56e9058fa5b38aebb237da43734d7aa481beffffffff7205d5ee8cc59bb07eca14eaca04e94bdba4c7191b8c07a1a380af77cd3c9a8f0000000017160014fa935d957f2bd618155f8d36e62be71245e406b9ffffffffff24426055ded4a3bc55144451cb8f5a8e1119e6209e4c4cdb4fe1a793841eef000000001716001459700ba3ce502e4862e45eb49e19da1c1d9fbd2bffffffff5f0d3ea9ada2b18437f2355745b5e4694e1912fbed15394a4e8c630eb999dd5d0000000017160014080fa839febcf4ee0633555b8951eef9d88b1eccffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1565000000017160014655701dc93cc52594fd51d1353ff0c47f6398fb2ffffffff61dfc21bca7f6e33db7afa3658b77b19f19b0e805ce0acd36ac30fc92e43c4fa0000000017160014ce249a7752e62a2838fa660aec7ea0202765bdc2ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb1800000017160014ba89d1f8d43e76d1e1ee48611ccb2d337de8de73ffffffff5d6ec4c49856236a6c2d025cc88e33fd3ad4ec0025deb423ac2b83039b436c0a0000000017160014246026c72abc49abc9251719becef651381a6c09ffffffffcc54971a26a054191d09213feba5b5a04848d6598be46561fa9c559b798a26990000000017160014f9d2ba24575ec789ecb21b283c55ba383e789a0fffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d1390000006b483045022100b6621490c53d8cb909af79e1f34de3b353caeaac30d214d423d7d001659beb130220094e356b2cebe184e81b3c0875384cc53e11b3064a46f27d263a0639f51b9c8e012102232c76c8bab7713ba176c0836882ae9f876c303b42fed51d24d257b457bdc4e1ffffffff29e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec1350000001716001432cb99481e6619695675e6de45b82b80006f9463ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032082000000171600140d359ca149955d822149c30d7ad237fac8baf949ffffffff3a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa22000000171600148b330a5b6a44181b2572d292cc9ff46e7a3f57eaffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4877500000017160014d3860edb634610e5437aaebb0777e50c6cd24bafffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a15654000000171600145daefbd8ece835d6aace48d8d4ba766e3cc732f1ffffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da0e00000000ffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b3926000000171600144e8dfc41c4038b0aee939f42ac705a325845b133ffffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9784a00000017160014281fad29fa97ccac8a822dd3cb395d9c0f3ab5cdffffffff1b14e67b806ae3cb76ebe37210963b3593b651463150926eb056b099d1732a850100000017160014ec20f9bf164b207eca69b1aa157e1a257f4a04aeffffffffd011fbad67f3cde16ca1f59180753e1dc3b41299917a0f417864c8b80c5669680000000017160014e46b064cbe5eeccfc27766c513f2afe38e70a906ffffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9170000001716001447ba158ca8b81d2f7e95717aaf0be18c2bd99ca7ffffffff74fd4843200455608b7d5358d3a66788642ef4ee1c5ebd03b5c462aefd9c794100000000171600149216c17cd524ec1e4b7995f216a8159ddade6332ffffffff030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee105000000171600147181586216e90fcb2524cc2727cd224013efe476ffffffffa4c1abf1b010c720bd206dd3d19d73a8c2817fb227abc5c435cac723b8bd037100000000171600146e05e11721c32996e62694d25781f849c1b113c6ffffffffd9618c57fc5261c44b519d7af8418ad8d51cce78d498148a51695e4b0725ae6800000000171600141e18ea00adf01a9c283ddf8e4609e6c0bd207aefffffffffa93773aa2f410fcb1501072affddd20dca958630c3f443fc6a5a76be73603a6600000000171600147c6a6199043488be3bb058ba5303e95d13f81f6fffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a156510000001716001418bd25d4b6f51b9ed818f07dfdea0dc50b7dd565ffffffff711c5bc2425cd563e2be68109262fe2a2f4dda200c49a57e176ab0fefe841dbd0000000017160014c4b5928fa1d70b4ee73d6d8a7aa90d981fc5080bffffffff6ba52d2bd367045d7c1edfa1e3edb82a36cb88b51f06eefb0efa61f11e8704a70000000017160014f7e676e7e51698fb4b55a072a974cd16416fc7e8ffffffff943419041532a0220fa7157fb9a789f683815db29019c977cca29dbd239cd2640000000017160014dc5285612163826c1730151012971126fe9c6f0affffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be4115000000171600141240c8a4e3976cfefff0820f3b2773fcff5b4953ffffffffdafdb366de4f3a138bc35d37da27de48e233f7c95b59b07821a3bee0d16ab8040000000017160014dabefc57e39c4faa310a44d597f4ebe5854beefeffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df430000001716001459d3e103c51783f80dafd4477e537217951007f9ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c06000000171600149cf9ebddddedbaca722658758610249907f1742cffffffffadf42350c68883d228c26865ff9c042a803f04289f6ac201c3b35af41750b00201000000171600142423e9bd0fa1f0c6e1069d1ab6d4f07731cf60cfffffffff9862e7fef82147f5f147348861ff4ad597b8a93189802a7d51a3197e92de67910000000017160014e9735ff2b940f77c4f9726daf20440ea38b6b929ffffffff94a173a84c5a4ee5dfa7a0e89c1042ae93f7ecc81435cef781679ca6baa8b3cd04000000171600144ba11eb684e517dd3db7fdb2eca797cbeccacd85ffffffff752c95c85d04d572f21f4427fbfc4f211cc366761b5c0b8b7389f5db4a77dcd200000000171600140aed7d4069dc043d84bc9dfc978262c8368ca58fffffffff60ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e101a00000017160014cd02ef245ded6b21451f5b7fafa3fa4b1038b6d1ffffffff5352df881af76fc61e09f3c941e1788d7a260bc7ce28bfdb972332c5269cd2a50000000017160014490c1da80e32934c76559c37a1c6be93093efa08ffffffff29ff0928d9e82f6f2dba53764164e83cd8c679996640fb928113816adf194cdb0000000017160014386a2af4d5e5bcdc6dfba0132ed2ffe4b6724440ffffffff310c1a42fd69edba69e3e82b13b7f17a726aff5b6504270285b2bbd3e5777de9040000006a473044022015e64362f09010f68738a746931b90693b124c6299bc06c5053188f7b147c27f022069819d69ad46cdedec4836a4997d735699911f8b5142aced54051d53ecc85ca4012103ac2aac194b028122397bb680461d2e6d8866436a00f8dee58c8bb58825d5f462ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e231000000171600147728e1351d34c2fe056fa8aeb365bb95112b939bffffffff5250f1bea7916aaddaf8c1390cf534fc59d5657112e266d8080475b93135f4e500000000171600149191cca6f7312e5fba675b6832fc5e8b77979cb3ffffffff088afc752cd4adb9adc74e23b78fa5cc3ee184acd702bbe2fecc822fe1a2491b000000001716001463a873784f413017813886eb9b819f8ce8e624deffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d106000000171600147acec427feb873b0afa534f9c16158d9293cce94ffffffff0298d19e43f8404f8a34bd9071512341e6efd0021237d5d20527d3c4fc250d3300000000171600147f7911f412ab4ad2befa8aa34bac5297ad706ebefffffffffa5a6f85628e2826e5afd942aa1d6f90e424fb9697394c6ac51bd956c1eef785090000001716001440c06fdd955e08bf28c75fb3df7985ff08dd3c6fffffffff95926c05083c47f7fa65a5a9c2101186d4d89862fb0da8225d1025109974e3d90000000017160014f438a6c7c65ba17da87fed455629921e921c1300ffffffff01c62199190000000016001468d7f8507349bcbcebd7dc2132ac483b68e00cfb02473044022011f43c39e0aa2c1f6be65350c97136ed0a049a753a038a2f5d5581cf5337993f022014f053527ab9857264e099b9a134928f73477c40987df861baf22ea0a7313509012103f3a55335e360c492e534d57720eb8e2c57ecc5ddf65a9d698edaa2eca9444a2002473044022035f8c423c8865172ea5949f71b3d6b130172f323598805d6a9b07b8c450d913a0220710072b7e51957c4b801641037827802dddfb4cbe2d9fba6425ee007d5f1558e0121029a4c7da73639696f36cb442bda6d467e4f98dd050587c086f798b7631bb4e6f502483045022100c6780c63660057c89cc1dbef66c4cfb3f2a32c9e9e9e166ed2eab86cdb6a801202204862f8b0113e48d45d7f2a5731a0cb8fcf9addb3731ab250648266ad8bc03fb70121028f5fbfdd91cd4c320674459000370466bd9a8b5835d0cdf639516fd06aded2a30247304402203031b8cb166b4ffb53b065e3ca100f6b9cd5a81d4361f24f2ac72f4b480201c202203be6b8b206f17bc5b1f2a08143f141994d652f1862f188d64495538e1547d22201210391e4e9572a9151f6999d3b3ce00d0f592c2336aab688bd200646ee57f2dbdd260247304402207d06607d9f7001a4f54e25af9c248d0dc9eb02e93661ae2d08fad50e256510880220395505f3fbffae0d7280eb44434874685acd96751737e42bc821a32ba0f4d3b901210210477c87e3b54cf8a4e8cba49987dc546747f049088feb2d5d3d94f0667915270247304402204e0ea19abc018b5fb1c47b62f88d979d09fb7871f4a323c6b096bf7493fb86460220441cc3ead38d6623925f85265b1eaab6b87a373ae09f5a4c07528b725f50fd550121033254991bcf9f3c18b3778872ca3049e41b6a39c469da0e881de1de0b1336c431024730440220052e25d193ed7141bb9c36c32805711216c991844b322eac20679e67be81e84d022007104ed5e9eaa301f6f5e3a98f1c1a785e87124d1926fca488199535d2c5384b012103a9a0a3402bb5a05dd60548296a8af6998b0ef698fc4a170f86bc7795b458d57d02483045022100a3627e0ac1b7b5503a0193e00aa563b6ec6d56dfe21ba6980996eb3a25e7ad6d022050ddf81d44a2684cb7ed8d2a64f319ff0a46d83c4bff3bde14901efc48c6679b012102f18a5387b9474cd384b852efb07751cd5e006c40609ba45281fa455ba1b60f52024830450221009d863ffc02ff2936b7de0fa42f0a07ab837adf41e3705bd8cda35c4b94cbd4e702206bb9e24baa713345cfd80d4754ace40e87a7ad8e2c2ace658fbe2bad8f7b7765012103320c879307d10f05482f28ca8d55341acf50454b96a1be23b7cb7df4575d15d202483045022100cbc8646e049bd137c56e068e161945f90f2241110706a5ce884215fa76d25c6c022012be60f2b22a6d23af886fe55c600512fe65b3c8af14c9114eae9de505e6188f0121030e40a9c0c1f3da4ced7901854d291d7efc00f7e52d4d9490e02efb601eeee3ec02483045022100b0e58fb2f67ddaa1e6dbc9680ae64a6d4b607778f5da84644b806e732c32f5ce0220719792bc6a37709f2424a1596d82a5ed9ed03248567d739509952359b9e7e517012102022e4134e7d4c2545328684e9eec8c5c31d377cee61f11746d3cd7033034d1b902483045022100ae9bba41a1557e2343703b91a3bb82d581829913bbe2596907b6c5b1f827842b0220647a9554c4435372c492fe7389ab3fdafdfbdf0f819ffaba4048bb987190157d012102ed0353a3a86e314bc06b3b309adc912f5fda583de801ed593b802dbcabca59e6024830450221009afb49ccbb93d0932a8978096fc111c671dae6c36d0cd04f1c89f950d00efa6602207a8572c64d728e000b80ee000320b6ea6fe6bac3c5ea19ff8e0853f5e1cd3b8c01210360e4058ca61bc11d403583ed713dddf16514bffd5eef8aa54259dc5c9e50b05a024730440220209e8bac9400f20c70cab07de3a7b715d6411337b0909e2fd79644850c70e9d10220698813d1d21e4406df5a365dc096b33dc35fc4da78797d43995f6e778bc7cc20012102f5185a0beab51840144cec80bdf784e6d3b10a763e5740515191cd508d0b292402483045022100d5d96af779b5234616a03678ff512e469e96f5b9fce0dd7994057922d2fc7b99022050750a4fa7dea2df16b5d1960de015a996b3347fa51ff9e45f1782ffa5977c240121036254c5772fad24e3c153493c32bb4e8cd1c5c1a6b56b08c77a31a28096a30de602483045022100f049adaa20359948b0f34438b4b25fc840675c37f1e77983fc7c38db662bfec102201c265602c7171d91f4d5bf2ae41258fad208ce304c4b0da85b9abb0f3dd9754301210320fc8bf47897734c65223e85bff7cee27493289c3a4d94334ddbdb6e210aeb6402473044022031968929e3d646f3acb6282c033280d12564968307b4c513d85f9fc30df849e1022003dd78374718c4f07c003b64ed07d2de62942b54e7f20b7aaff8da86d1427d0301210292fbd32ecf93aaea26e0d8a98f10bf785c66b37edd7fc3d0a89f4c977f21c28202473044022070ffe061d4d2c54060c2f48b669aefce2ce2705f88388286afa334a8f6d8f9d502202b8682f0a0b31bf9ee9a08d9e855dd72a7b7f4f0b9cdab25914850d3383c4475012103d0bf31ed28ad12912ac41a203ca9f91d1843cdfc7a52d2ce18a3ad34eb1317fb02483045022100ff8403d08f3048904c3ab21ee501b863c93040d6c4b068cdf0c7a6ebfc9e34ba02200a261a09245af1cd72afd8893ccddd3fdd29cca1fcd42cbab3938d2de6b9255b01210289484fbdafbe4c95a8235f147afa2c2bf5bcaeec08267fac4b3224a238ffad4d02483045022100c7466bcbb605f3557babb22e048bdc5fa51fd92cb51f5c01db94abbe5a0a3f1c02205cfad039061bf98cbb940bb285867a327f437b97a90ce53eaeedce7c7433d9c9012102151ca67c3788eada52ff04fc7348ba61dee454060bab5ff1c3c941381b8688bc024730440220678ba31b05c65f108c175d3cc8577d98222088f33cc2bdf31a2f8871a82f233702206e77ed29b1c6346c1ee56e73ae4b861f0226ccf1acb78c5d2ef4df1bb4275b1e012102d9f288eb75dd0b967c4f8e23f90cd365761c5d735b3b4e627992feb280c7ce5302483045022100ad7b72b05a6c2b36b6b7650b94dcd75bf4f2eca519375286fa12acf8b5f0f8a70220545bd87f60a4082f5b6223fad301a3523b752ffe816012e81e7871f4803012500121032cb5950ad570d0b66cd596a6b298cfa995e2bcc628aa8cdad71c9d15aa0143fe02483045022100e223eb7cbf41588e70477a2608fd5dbfceb50d9dec3fd6e53e08c3829730b575022028a291c5cfabbd900e2091d622b23faf54069250792408ee3e3ed6a4ccad34c70121027ffcf1c395e8b1f44a60207e3ba60e38668b68d9676c1e34cadb8129ec74460f02483045022100991110d3f92e3ba4c4e46c2b8fe8bff60fe8ccd935209c4881582310b28d37d902201c17abde6b168583a19bb337056e21f52e057ef97c496b777707856a08c5096301210303c7ff429d4aee12a3d533511584b5a54e54dccdf02df8a42eda1323046e0fcb02473044022008633766cd30b76529ec1760e810ad3d5b714083da3b2d1ea6d1c7fd893dda5802204ad592e7c19132279630993d3cea5515318298ba05f4fca8cede3a92de6094f70121024a3c8a8dd0f46808979379cc7ba900ce603a2c49e21934335b849b0f68fe2f3802483045022100f563f32954cd2980b4801b44464942d78afaa338624e85c008c8383b55523af602206cb0b595e8e4b6f466a8b96747327ff6b558559bdba5249e83888ee79e13a2590121025cac6d93208d618752d295bba344a4311c2302b23d2bb2f941be23c4c0ba544802483045022100b5ff44f65b3d3ea1d314c198147a37d1f64ddb99d261044d9998036413d544990220057be0f78abc08b46df024385b116329c0030b6297253cb549ccca694de20b3801210210477c87e3b54cf8a4e8cba49987dc546747f049088feb2d5d3d94f06679152702483045022100ce4687f56414dc412d1f41cbd89a0f988f792e715a26dc039f273a5965fd9ada022042e2ae1ebd28d92453236b275297023c6e8d804dd84f336a9079bc2941f48fe5012102112926cc34e37d2d202e2a6d579b22e56ac663735ecf2fd4503d541fb5af38c80247304402205d310ea39705edfdd035d882fdd39c8cdb1ba7334b24b50aebc6a0a6dfa3d4b3022049a87ec32f07382e15e90c05d1e2ed2a57a277a2b4bfc7457691f3707bfd9918012103fa9431d3fe0b31c205120cd95c3caa0f3192b772e422448effad0f93039a0ffe02473044022076227b0969c9f557c357d892ed40e71002bb3a18700e8f0ed0369364117969040220309cf38595582462fbe121600dc84051a1105314396663e2d892b02ce7878ead0121028c574174700e0af56bfb59f4d52f2e992b7b95b613214a67836b4bdba336eab20247304402207ed716245ef326033da1f249f5cb8379e96fb4e2a4a54c5ea330976b2a25d48e022042f64b5dd82322aec02863335acefd2ae3df8720da4a7f5c596014ebbf5e52410121033445005a0ecbd9b129afee18cb109811994ff24c8533c93ef36cb4ec6b121b0102483045022100889c77ff027a9ef9875f37a9c529c7821bdac5c5cfee550f4a8b4395383420e3022025c0f098b43cc7673b4cc5ab6e7b9fe1127d6025ee6a84e8b19529f1bfbe642301210301a3d421d3cfe14993b8c9a3cdacf0681d5a3aaee2b7c075b5f3c217ee04230b0248304502210081c30e18bd77cedbb34e833c36b4ecd1b947f367171fa55c5d58601b058e414302204c87fc3ffd01bd86523dce0afabf03dbaf629d906a72ca8f0b07a33d9325d1830121034779681ec73c0757b0b8a272cd0e6b00c677854f15f68d3652dfe2fbe17bb81c0247304402205bf2d0df20f712b58c85f5476c05af64f0d9ec3e3075d090274476a0bb3a9387022056486c180fe904a10d6d6603a5d1e98bd14cc0bcce12d1efeb079777df87e227012103655ca87e24ffcc229f1ed324a6e38c73f8c42375162cfc9731ff407958f68eb20247304402204869c466a922b39d95ba78cf2adfd4685fedeb0ca4d8e15253b17b9f68fdc01902201c0257dbc0c9dd9715d6bfd3d98a60a29eff0e26fce4df5ef3b94ab6ac842d84012103a7c47380bc14d86e728dc1897ef40dfa990f59f0a1fa6319806c67ff698c50c702473044022006a829e08d63ca15a14607e881e939cbfddd2530655fda7bac7b2a1077b5344302207352c892d358366a4d2b03921acc0ff5c8cad5872bfd2b83a97d227f9a28af6a0121032a3b314c3f823bb30f55b4b611c61866da4f3d3b20ac42313629df41b224290802483045022100be4bc0bb561256cd7b666a0483e41891a2ff6b8de93ef9b85e5d4d5ed81123ae022011b84200811763006d2899aa525fa5080a7b10d9aa2568589879b36f160ad745012102b96f6aa8a2a7c8a956e98a69f54d671a3bb91bfc0996281258047ef9372f56450247304402202961977f5537ca1b491e48a94edc0cb421969ca910376e3225f7121ab315b80a0220023a2d8e88dea9a8bc312e981ffdd690a8a278d60246319fc5815d0b52b4671c0121021f3e1c7296c003b8c993493823706ecf341184a39a5a47f00bcedcbd6d6b54a60247304402202d02fb200d9f06d81eb3da2092fc5ea6fb7874ddd04dc5f3d477c98009a91f88022015811baf2ef156ada2c6195dbc4dceca59e26330ae9aecc5aa4a9dff5923f31a01210334fc3e8c5391c0a2737ce82e8d6e5f692941c5096f4c34678c88b94dfb74f8ab02483045022100cf73937c7eb812265acd278020e5d2f8655e0b72bcce0960d7819a92f69b28a1022057ad66f89f9868219013c8b617438f685ccaf3ceb39fd9c77b4ebdbbf8eb28c3012103d0bf31ed28ad12912ac41a203ca9f91d1843cdfc7a52d2ce18a3ad34eb1317fb02473044022032142c9626b7138f96fc9467f49e8c276bcd00a908c6410434cddb2172acfe7302207e480a536803b60798c006eb54161ce09d9ccd835d068695c05ec136c394d3a1012102605960ade5c3116c083eea8dc8322bece85eff97bb2cf90b17dbd659e5a206f2024830450221008ef728e8c0197590f3f8eaf6166f546b16fb16fa46683f3185e6ca724f9ee2a802205589875ed001ae1602e69b143ff325f1de226132460f838f36d84b85dfcf0431012102cfcab94cc9c52783d5014704eabcafb82e079b753c36212a2843528599f417f702473044022052fe02706cc4bcb634a9ed32ca9d4ed87e9c9dd8128d6cf339e7a1d7b1b2a40402206f27b30ea18f0c3202e5738da0ea5cdd6d1b7ab3abfc878099cc8b6f7bbe96100121027e8df711cd1392d661b843a7c61c2e38ab2376fe3f8dc2c653f654d6b118d9ca02473044022006ee30917aa28ca55cbfa3c56dffeb3ec7f783c62e419b5fd804a3a63138438c022004ea88cbdd598371a50354236f9ff6d987d464537f8eafb1ed99780c9c9f97f101210370475459ab1a4b6d9642272301f64f2f528dcb2ed25fe15611dbedc2bac94421024830450221009278deab004d6a4b6d86782f708be758c0068fd496bd39ac7d7806bdde00f22d022012f2e0f368eb4b9600738424ca079d30c83220bf37bec0dd0d9a17ce40566a340121034edfaf50a0fb90bee886a531212e30476b2b6d2eeb9ec27dee972b3b08896757024830450221009705c7343ec9275477cba7089b4048f3a46fef2e65d17f63499391bc2f6a1547022005af3eabb48a8ab3528ea37f6d872dda11e25a4e7976e3b71a370f7df8ec37b60121037d39d13eefd85ff243f361ae8e248fa12596494b8d11f9ce9c4b1ce749488d7502483045022100972b2e2eb848a86967066b899f63744890e65460fc60ff6bad73414e5a448a9702204e62e7382aa1e75dee3be85d430ba2000ca9c645685857e4adda948252572e08012103f55b32f68c562314232e677a8d54adacac5403c70c67981d617ca5585f378ebe0248304502210093e74c8e78a14129027bcea5a40ecf7cecfb1e7c5be4a0c3ecde8b45fc63073702201774700f384f1b20a6c45d9e5639880201ab19294d999796f98613ca138428d5012103662fd1e768094d3c0cc7d45a5da01702148b41075f1ceddc6f0405a80469cab1024730440220249f477d6a9819d406f85902e6879f1b80a2432edeed48e4ed5d5cf7cb5a9d3d02201a7af8e9c8188df8c57935a8f26acf497a9acbe63a0f7deb5f9c8f394936ac5c0121037e872566c6094e55c13a6c8b1dfe7f58f10c2fb6ef5d26e68bd955b1fbc81fd50247304402202e16de98fab1cb9ca18fd076d04324846412457b148f39ead2243b62953169d902206211e4ff388faff8d8ad83e028bd071ff03ea09272addb446b893737f94b3de0012103af9f4c7c51d37b7e1affd1ddcf4ca9e223efe0c866a946b57ef14a1f775c26a202473044022001645b021e594f2d95c6bacb3d1bb4951a8e1479954494604dce2f01ba754361022051754a79c34c77d31abcceb3e3f7b9f2f3ce2b697709849de43d3585108815fc012103c53b13312c575f4fc78612f9785b367a29d6c6215188986041684f5cd5ab98e40247304402204f74dba1f9227f5338577033b32c366a9c61bfa8db23cbbbbe2e81fe9c9a4ca4022078806473dca09b8d2b449ba3805a2133f955ddab6b4b693a5a0c2f8ac1fc4d7f012103d4877caaacab83456bb43337077887d351a44c9980d0995a44038f7d718266df02483045022100e43817401702484bdf37b2eb155b8d18246ff75ad2247d4f562a68cc3ef7823002205c299695613d35a60147ee53fb146e231c603fbeead72b525348e157b3672265012102345f12b637128e96ffa683b859b9dfe38832b4affe5c23ca8fcff527f26ed697024730440220772c5960459e2e285583b87ea77868abd49d1829be177cb4e28413f19a78e3e902207edaa1af4a0a4225180b8faa305e21158eff26bd614295c5502ebdeaac37e831012103d373a37758396758d78a3e8f7d1bd1d8b176e3e1fecbc0a008da3e9a6845d32b0248304502210084cb8a9c7ac39e7daa12cc0f1a58d34f7baa3e9bf66d74989c060533784b55fe022047492469534f93e54e066a4628363b3a7227ac4f0f2979838d74c41cfe5e38ab0121031b2d1337f93d691d3b86939c08a0d91058840dd42a8a2e10e9fd45bcf16cf608024730440220168b9e5265d00f1dfbcf36385e7d5f57b59ebd7afa4a519ae4e1688a6d925f8302206fcd741dcba32d308da415d9b0beafac74d4cb01185d5ebb9e8bf48349637d39012103d61882399cabaf02abd5747e05199e0524e25fe5f9eba8df74ab0fd4bd9f4c3e0248304502210094f377881d620f293a1ea4aff35a5236849c80caf0f669d0cc60b4feec3592950220509a183ff8820a61278d867c85e89a95b1993079bfa3de03f21af7fcb35d6c0c012103f0011e49b2bb38d35b860679dd2332bcf2408c8d2b8330886c7013924abfc9ba0247304402205156680ff010b8b20b841386e0bc5e1b0151a60f9550d7c5a25aa2e19859519f0220730ad1bc15ef322ec85bb5433dacc957ea3153b2ea8bee14a79d356ccb4f3b4f0121028955519e26b8a2883660f7eff3a900a2330d9a412d6b846f903bacb03a68097d0002473044022000996d015dc17473d03e59bef8b493a53db82b1717b6c05aa25b94b146d1bcc70220428ed0bbad043ca344d4fe560780fb631add8e88c71829597123893dfec5cb5001210347491376534dd7cebefb18702b8880c2f376c98671d01df4759c3b82bc797f9502473044022056a67f95f38b1fa8b198839b7ea5da32d0b0bf14b93d9e80acd140e3e2b243ab02206bbae4cb1c0e5a1a760c7c52ab797ec3934408db908f638e233581c11c8e501b01210267fecf648929c26616c90be1f8c1e596a134ac8fd8cd32ced86ae7fe39c9af39024730440220297f400e8703c1fec8feee9ab56162851158e375e68f49aa18352742f2a636e102205e81f4dffb6d53a08c8da09533cd7838c71f2bfa3403e2176408372ae4c078d90121031d75abe72061d9d170777fec50059dfdb86310ad339b55478d13a695fad5aa950247304402207a60945b0d194bae080545dd728dc3d5015618363076d2898891f3371e4c3b15022020f2b885983e84691e76a1040399ec83fef227ede9a88c0edb4c8c84ab9caaf0012103fc6c34e54def90cebc15615b9669267e9cadc36e886ad92f4bacdf11ea06709702483045022100862262eb516e1c1e6e89f8c287782a8ba8a4f95c80756bcbced4c782b68abce702207ad13a8c2785744099252410273a0521f621fd05b9550560dac8c9939daed058012102027b3a85860ee743e838bdfeb75df756f1834e9daf6fe785dcebc289ec630d0302483045022100ee55bcb6786109a550a4d06ce21335a82b9f40f355325b6b3ab80c16b99df73c02203c6d3586bc898c369b3e023a1254d8e1628143db2303c967365406f948f325e1012103e7e8fd0fb0ae089ab085210727c87eef47cd0d9e02683d1260031e6978018b8b02483045022100ef7de39b6450e27656b07e98046e28c58cc0f0c8c665e9e6683ca186f859293c02205bbadc8022030b26131660db9ad5f126d107c9ac9258560cfebbfc8fe34f8eb8012103490310227f84c7fc2ff28c48d14813a7c6e086f32f01051af20b936c025855b502483045022100e695936a32f5b92ec5fe2f012a30c25672bacb076ca1b491e398e55453e5b67702204b291d022b3853c365b77d387f37fdfda919dfbfd93fb1a500279d345f922c5c0121023c7afa00bd53a92d2816ba79403904097802084c6031015eef7d72c4ff80e4430247304402207a61c633c8b59f17021201ead4f749b0d967000514b6e7c388510d06ca853b5d0220549267a8cc03642707b7b60742384cf53eba32cacecf95da59e282ebdf127f4701210330cb7636c4127ec0e14e662fe6a63a349720fb452dcff0953b93d4a7b3c5023e02473044022021ea607306d56c41001306a51eefa139de4d9fc9657b771f6b5bb035b197fefb0220348495fb3733a2e13af92dd315d8b0172021e64a3d31b047dd604bc30f879d780121034560274ad4f7f149f82e5e921a3e697e05f24f1055e200f0aa310ee036f020cc02473044022037f75c496295ae3644dce524f66251428d91b4b4b9982cb146314270f8b6c9d102200f810d9232b059007055e2ed022b18c8ee28c1d7ad0a15ead15f58a24d265684012103a1ef725dc2f2c3f07f878293931ce597cd6b543c81dc0b91f87a215e511b6a260247304402206f08975c4811983fdc9240f8b9b6b92ab37f3a0fbd67f08a078aee37943de75302207fa26331f6bc91496c5e8e708a0a74b9264732b28cf840e971de19b62bc0a218012103af9f4c7c51d37b7e1affd1ddcf4ca9e223efe0c866a946b57ef14a1f775c26a202483045022100867ddf577a9ea63e8552ca892d4651afd17514b229de63221bf0d326c2074dd402201ed8e3a3134a77df43d5f3367d371bc268f498f2f054cc665a47a9df12d9aa0f012103e33e95e1eb5ea24d6ab8796ea9aa81d90679c9665ea09639903bcabd7816f5db024830450221008ce5655a98e536abaf2c301da9ae6d17a724c446140389898a3840c13ecb5e50022017d9cda883be4f82478d189611596786f94e97dc619e9bc87f9e0022de8e35df0121027ea1e2ede6148c69afb93abecc1affd8feb016e3193d4cb11eebfd57911c5daa02483045022100a3c85da2ad5c8e7cb75598401fe6c6d9fc3495283ec5080fb424ba530751dd0c0220280e9129dc954cabe1dd5c69aa908a327020921626667724eaeb99024c066dfa012102b228f1df7323178fe9a06887845ef9a04c36c52c1fbaf20c347c668d2b392538024730440220444cf02c159dba0c0bdb73fbab2c99d5ed62b80896f1fedfc7bc6952d40def0802202fd668ccbb5200ab88e0ed746e7d9845990c120a43e0a4e14a5786c740306d630121036211a00c1372fd73df877d5a4e878bf7e47db9b009bca162225bc3231387f31302483045022100b29c9c5cef1ce668bdf128435a78df851ac9b7ac39e4061b4575f2068dfdb8e802206da1aaa0e2c7b538ef9e2111b84baaed2af9261096ffa64e496f304c84d594f5012103d61882399cabaf02abd5747e05199e0524e25fe5f9eba8df74ab0fd4bd9f4c3e02483045022100e80135d66b922f004561d8f0611834243c21885258e000647ac1f3ef653c8f320220338ce0f90653c666d671e2b9b5d7d31d9591c67ddfccfacd52c6fa3f18d66b16012103e9aebc48918b2b49db3b109a01e9216e0aa680d06dffb3b17dac5408c71eb6a202483045022100b63d03b4306444c94884eb6980f6eb273ef2674475e646229101caee648d518102201ba55cdacb0a590a26c898fe4adf70d675c49f6928f19754b18b078cbe81aaf8012102e1771d32e1c382aed7b061992bc56d8de883d90fca973fc5158fff06ba319909024730440220697037d02286620fc62b8947e2ff17c80edddd38823804ca9c36071e249c475402202e41c84761c58da9a97e3ee99055d798b16d6292ed1f1f51249ba5b49cfaa42a012102c58881eca38e21df31c15b729e95d4252b8d963c8640c369e335e7d1cb9af4cb02483045022100a34f856dc0ec24a7e1136edce2990c19dd62980f12aea078dc739018efbc47c0022041247df10029747e287b163067fda89e744d3cd8dccc68219c7566a9417900e40121028608a94fc5254324f3a83c088634506e7176a9855ffae545047ff6651468506c02473044022024980f82afe20747457899ef93fab6a1ae778614ac207003751f376fabc0588b022036ed39576483fe2e9d5793d10e8f582c619ff09c26aeb71abd1fcc5d22398dd0012102892108315cd4ad6169e02181ec110844ec4a4ee113682bfbf6f43e74cb4d3dc2024730440220623ffae6d204265aa69929eee7ad348acd2f2d9f6348038a90ffc5d645f78367022026e4b2bed43ad2d88e0c0e921fbda346a9ae103f8f7e70c377187e3d87c85a92012103a9c8ea0e7cb69a08bd1919fa3b6bbce8f631e4e9a54b95007b7b0a6acbee39fc02483045022100d200bf2276bf748141e182f200b39fd11f8c93528ea5363f06a6e715dc6ae94702205d8310d9620ba666bd34ba6053ec89e88f894528cc453ddebe96ab93a74f0879012102a7d2c9e6a6ce01f831f292e83f4091fe2fb5f561c8d017c2686add8ba0260c6202473044022056cb8aa333e29727678f09fe5e3b2c31d342416a8e88fbccd89401269ae1285c022021a543004c967f5648ab7a260618e5829b74f28d6c3534082f95b19e24b955500121031ef468311ccbf9e21d288433f17f74b47f60da345d662c8b911a9be38f0b01770247304402201453bcf2e5c6160e526684681908ee1b1f531fc0583f209f3c811383f14d150b02206f8b4bead1a60958a7c914d7f69a3837e002775893ae3003047f48e2f1755603012103918d9ea4a4011e2eb680c158001c85c18c20bb4ac67eb04a9e51dc8bbcb0fb8b02483045022100f4395eb55644ecf67167848056bd0b48ebb237e1d8160285172c06f5edd269590220252976af9460e6d6ba62e640447ed4aec3b1180518a0ae3a43b46227ead3ee4a012102889193b78c040a4ed78f041e04e703abb792ffe1b440425cdd7f38a36e9f307602473044022007e0d32815f52282a357b1b1c04863710dd0a137d37d82326747bccb6a475b1202206520d5f98d604fceea783556eecd8eb20a5d01093e801b66c31679f0957de7250121037e651942e0636a72de0e4e08d5baecd81e82a28d562d26a5f4243ea6d9a203210247304402200e350b376dbf66f449601fb207e05bc4aff88741b70e28c0fcb5732337214d3002203aa54dbf99d8b2c06d3d59a2302e0259d5385c1cebf51e2eb9e8af60ae5703d7012102dcafc448fe5a2e204f9ee9c9812ffb3e41ee113631faf34fc370a6e044918dcc02483045022100b47b0c5721d09c3553cf3bc12eb560c355921c888e5f00d5ea3d76c62467f838022001bfc1785280c6ee3f359856e4faa332a06f24b6acc57a9938786ba6e5a776f4012102cd6b75fd14248108c3877c8fa5ec89998414293a2822fa1fededb96c51777e50024730440220602d5a7a901db0e65c042a7b4b2d70bb018d3dd9fe774eaf87cc6a4245e5c46c02200ee4ea2ab850d96d13cac00525d134ea07927176f820acbcf95ed4a0784b91220121027478fd6bc0248f5a136a115e5f0659c3af52368be8888e8e6b657ad0f54c7d1002473044022058212f5a745dfa5b970208cfecd051d1763e327e27e34ee824c23cf0565571e202207b9c3ae195c68de37e2c437068560a0315a87717ac2280a529a88f9d2f420647012103729a58fc3a54baf884432b728c09632fe49689f229bfd69d30b0057368a0e64e0247304402203574133cf52ae7ded4595bd6ecfe68f3c1c3bca3d53f9d72b9df4f33d47261bd022014b9d7227dfd8f8550ee0011509ec7082474a3c3931bd098d5cdfd65aec2e379012103a0f30dc10fb49c4e034b49cd754521f9bbe6737ccee3965c26f6b07b01fdcc4b024730440220288a32f7de6c2dd6b81d14fb9dc3c63b9ee75d1880ebf72f02004ae89aebf3df022025e999d1849a4a715d820f380984383a26fe7b6e36d6eb6067985998f3916d10012102db6357ec8e93a841357bde1b00e2b1298aaa389533281537af7029073c0aa238024730440220606b447038af8b61c37df512d505b01d2c86a433e36d008212333a6a0ab3d7d302203ea0bade61807d45a64855ee04024071abe2f962a7976d24cfe6154f88a530a7012103623d8dc913cbd5a75d41ef9e41e481ca602fb8ad0692fa482057a5a0a22e5a1a02483045022100e5dd53ba5850d34f4289d459169068f73b0b5b27f690cba6cb7b84db04ffddf10220737ee30bfbfb437fd0b6ab7302a071084999b836e1f6718bcc840d5862e55427012103785890bf2da8d430a9f7e210c1bc448103eba35509982ad9915d50b06db95c9202473044022001ee790449416b1d11a60164a3b212cd0a6aefc035eaa3ea071364e17de78c5d0220401ac430faccc7811b5fd4a0262da5d51d7f9035dfe4136aea3ec8e7aeb2339d01210392169d654ca1db85109421cab89be5f1fb5e5d79a60d5c88e223744852962c31024730440220487cad1d9f34b0f93ed2e82806ef88af55f17966f7fc9989941b57895abe4c37022034483f6739c0a2303916911cb6b928e71df3487a1889b31ccdad9e41604df46d0121020be0725e2be68e106702aae6c5f6e0c999aaa30821f057defc9ebdf4cd074e1102483045022100c01861f7979dccc11a44e159b04d960e860919715a3f82c54f9e0804d98231f702205208ce3afb77bed01a80fd0fefa3663c1af5bdbbb968ac648c11e350877976c3012103f35d7636ed64c19bfaa874602d0f6e089b427103b86970c9ad5ddd59e903d47f02473044022019299172bffaea7d0a506a8d8b79aad96ab82148d0be88a8156695290d07b3df02201b479b1e4c60c63d7a0b29067b287c0e84f6c378de1440ef839abc3415950ed1012103e8f542bc69c849d60fe24c8fe65031b8021a53c3ca3a21b30017850423eb374c02483045022100a6bb0de348060f10cf22b886fae3b4524b109f0a17ffc76840615a2d28d812dc0220245eb5516d7d86496b1bb2bfc44af0308b9c79ba6615da7b1c1b201ba81dfb180121036d978760c5546c08b52a2bc1df9460e1f161631fa8e283b80485b665a0443c8c02473044022010db308622d72575e0098197bf505197973d5d240b3c72e2a5134a9266f800d702207343cc202e9e02bd28ef26fe929476f4c9e217432bdb842d481b4b0ae383e3030121037ebeb28e8cddc00bbd320aa250fabcc06eefbbe4aa950f5084b0e57c923aa3940247304402204cde9c11d7960fe4140f22919fbcb70d58d48d1b9ee4e46a40138bd0d61c0862022029fed8f50bb753a5bc585f922586272667b3da7dcfcd13d9bc3f3465bf172942012102dadd98454340e3ddf919900f769a26f3d7f84a0c004882f93382f3fa2a12916202483045022100e91b5803e7663485fc5b9797936dc7bd859eac8f7c9432ab6b46fdfa9ac7e659022038ca293c4d027669a835e507cb2e65b8c2434094590436c3e3ba1f7a6df97d3c0121033729b6fa746584606c0331c8b8f5a67d3a582507f67839cbc6005d112fbb8ddb0247304402205208916a9df64694742f7be9a801709f919c1099790bad813bd8d03f0cd5111a0220461cfc9aee389c1bf680cd67072f68df525dc5b4f75458e500c9a98157c21def012103827bdb0b700847cb6956fbf9b3c91c9d000fb41394bb82a65395a6a642669acc02473044022000ba88557b44ddeb69224579f992b70895023aca015f61be86e22192961700e902202d24ac2e1a0f604877240b5304c92af23b59e5a34fa25daaade1ff71a93ab5de012102502497572066160e8a0e7f8e806cc3aa8b36229ac71d6d366aa0e06549b6457f0247304402206de7ddd88c1586a92c717456dd6dcbb45cd253a5616fce85c4a73cc6b5811ef702201a2e764d7c6993f258115b925eb18caa06113a719a82d54edd1efe6878a8ad01012103fcc203348e8f94947bead88866e6e865a8cf21ba57bece34e824dc12272a203f0247304402202eba0022b45c15d02b6fb010ee25016ce17b8c5ac3bf0871047041f4d7d9fce00220064385f229bd0a35cba3df7045029cf07205e6c681b438ef794321d3f30f21b201210246fed652fb2cddbfb238f8f1633a04049e474f46045d69280e1243ce57d54eec0247304402206a283a684af8f447113ed445ff2eb9e8dfd3e6cdeefdc5b57000ea628bbb41ce022049243d08cd4470c9e8f9e00a530c67c9f62d8fe11d7859d164434f075de2ba600121034295b6a2057f2cf9c48892bb8fcfa3ae9d528a074cebf0826d70dd07152471990247304402206950b5bd2dfa09503101d32d9c612ac833c0cc779fd42733e69557b867117f52022018b6bb5f33fb10d7bb7b27af3799f5444889b83a6a3145769aa220de8880dc4b012103d6ddd39eaa286a5e86ad4d2c984e977c23e10d512caaae6dec55cb9ce6fa8c7a02483045022100ec4a410b3c637a0d984995183a14fb8fb04e69cc5489bfbfc43bf7cb6b1b80ed02201d8e7545f7bb7032e9f88119d8c5c01e1adb8c3b8f4191e8f2078782ea03fdc60121026280bee1a6ca163391189845e80f378f713c0389766c05763b6e6bae86f16b0602483045022100a3b2e3ef8527fef8236dafe4f5dff1cae64da423dd6f64a46309898c7dffb8e702201e5fe60788fab6f9ad960517a4441aa16744989be352dcc8b7e37fc8f4d40bf60121032aebfe7ddcb2fe9bb9ce92b485be5d17c3d19c71904a3d1907f93be9d84b1d1f02483045022100a4982fc2abb9bcefabcbd0ba0052563c98e327ad38f8d926cb47a76cd58b6dfc022067bb147a8081687630266363e2e270a12abb8e72a23f9a5a37c7d78000a8e88d0121034eeedb0eefaa3148808e6dce5e41a94fe032d13fb1c997fe8971df889cc1f0f20248304502210087b43ed3b6abefe02c36838c0f90bc7efdc1e4be6d76b983e11b3f33fa91886902206ffea684fb23eb4d3511bed8c23cfc4c4e2a278c2d0e78a7efbae4d3f1354ad6012103e273ff5c2029b077ca9c89bc6c12724afb9324b9e9285ca8b49c0060c5dcc66e0247304402207f17bba92ab69272ac54332d84206c20391fb04bcb6c7887991478c6a344d56f022013dafefb32cc609674092f1a5ca616cd8e5280f89b364ba591bfa65bd452819a012103b6a8aae639e3096991414fe3f17d6b5b0bec88bbe66f2eaf498647e5330d42a9024830450221008fdba451eec57109ba772fdb740b2b25fffb627a11d2fa3fb231ba318559b85802200120dee55e499032e3b30042dbf1a590d504aab78bbc122ca54e7c5923fd97e3012103b1b947e2b813691f59b80aa3d107b3789af59bb91aaaa75f44b647eab7012b120247304402200c0fec442d21caa3e9b6a877043c993d02f073170ca724c9ff66c3947d871a13022007fbf4fe81ffc8b54d26fb2398e752ec37e2f52bc732f7239b0dc439c24ec0d20121032c9ded352f8a203df07b079f1cebb086ab0df530007c4740e074d83a331b38ed02483045022100e1003ec2a62f648328dd260a06a46c7107b674221fff472eab07d88626aa20200220296af7b952815ca6a3f68ad8579235b2ad14dfb082229df00acbaa05ab39f3400121029893b6506a598cdd0a2ea304e9d6c84a6e8e631514203e20e6bb34e37d9ef6900247304402202abba449b4d4cb80795410dd689bcc179ccaef68c1a821b10256bfd52829558402204b1c2131d0b45032579934b7cf87cef35564f7ec02d006027794499fc62898b60121025ed245014b34177d1e662eda1e18b067ccce648264207098a1e91150e1e8b18b02483045022100bb06622b59a9202f4555100d6f5f9335bb733a077d8f59b0f971600789a15c6502201156eb88a999c1d4e9e53ae05b1347b290c19cf6837ac06697e668c268d07c1a012103b9872c551e61e63023a43a8dc9d32fc23f86f27681423c13d0a6a634a20244720247304402206f4ac18a444138e27f3ef24f7a6ae6ce305909bdaefd8e960b1049fc50b16b6b02202068e5aadc41f1ed4a4cbed0e88b09d52500388f0511d935456b841e787ed34701210232806d9d5a7a4d5f2eb4b4a889ed6076e2f0a04fcf024ba08bc089164ff9a31a02483045022100f362c94455fe373cd6ee4a978681498dcf8991943335f70e6c0d8ba5332df48202201323f38f3d3748ece4a6f38c14c1e3e2b6b7f80f99e14a4917c781f8a0fc172f0121034fb85bb310945779157e303e0262f13c0313a3b8ef335d90485205dd5b9b0541024730440220697cb451b1aa092ac2eb3265a98af73d9d01275f901d58de9575e4bbe4b9d22f02206635bc3d9ab2d86106cefddda006e8d680e0808133703dba8ac01400d983beda0121029fb3af09aaf239de23ed20a43605456647c5336fe9ae220d28402e27105ef951024830450221008b53232b0fe64a444e776020d3dcc78286f057fdf238d8e9c4e581e6c2c35a1402206e0f14b02ba1c5dd1cbf44756015a31bc90f96fae6247553cc2cd68a3c531478012102c0257b6277ac40508ae6f79a1046633f50bde6befa891b945483fbc22a8ac666024730440220217992723417857d26f1a0b01724b10dd4df0eb095594b5a50ccf7965b4ea0a002203054cfdc7acb66ba518b2b7a073854198221109a3e473217c169e550f8e98e4201210293b5891a6c6f3ba7651e7b631360391dd3ea4032ec5886d258e68f534ff96a1202473044022045f191708c04fac1c52967480b75f91b97c89539d48abcf48905f11866c582330220273259302b5de8305c6965c8413214ae107eedd965efa37adb3cd0cc69fc46db012103d6fefc52d9208b43f573bd2d686a2b595ea6a6573d2bb701989c7b6478e7b0460247304402202f2d0162e7812ad93019fa85b54c47d105dba5a8106d49e2eee3f78705387ffa0220576861a0faaef46411691bf403388f4f46c1f3df9bf3de4e9363d65b36da805d01210234dfd8c1674ebe160efa1a769b1230bb4feb4846c4ab69c818438f9c8d94b75002483045022100bc7ace2f5b5b69500f494344078cf665d6baf7da22168e671b1272fc09e58900022031e3766225826df4d1a99d2c6c19b45b1913c7e2c59a0cfc9203686cd9332ee7012103623d8dc913cbd5a75d41ef9e41e481ca602fb8ad0692fa482057a5a0a22e5a1a02463043022023e2166723adf60acd77c63721fadecde34a043b69257ef36dc2946c2d784781021f2393cb09f57884920d85b8fc77f620af05e8fc42730b57a2b047a95a91f89d012103116567371c60ee8de178a7cf43d9cc73b666971ee16bcdd2a1e61cf8ec455712024830450221009aba9ea5b6e7ef4ac04977b2ff2c6975dc6abddee0d629588ec9a184b760298302205c548a5f6c176579ba35621382461d9dca721bc8904389d0348c2b0f77dbd843012103873455879b50730be7d81bf796b7d7053169f8396c99986015a9cfd76be0eb060247304402205543517740396458b74e188bc93ba428d502849f35c1f9beb12cc7001e2a8e4b0220261caf8f8851817b295cf2048653a34032129d6c07da1a4683e086c86084666a012103bbe769008b061fc50ad23bb54be976c5dfcda276526ba0074764c1fcfad9280602483045022100a5bfa0b9274b5119c8c6bf19a3581f847772aa3a43255b5ef78b3f499be9539602200b955fb5b5fdd78b168a73bf348e391d2d6c6cf3b2d803aeeb332ad9dd12966c012103c909c0dff3e5b27fc51da75568744fb1dbbd6d2355f04e31d369e36372bda8de024830450221009a6d3d78373d1f28abafd573c0789ba71aa77ff528d88bcaa5157fa7c9645b480220353da872d4a0f735dfad080712ad5eee4e63babb735041a6df3de08dcf565e94012103b0512a4e7cc8c098ce1ca1b8e0e0d6c1288e0c720f09a5be6a09253c67f2d3a602483045022100eff183a9271c9b14f078f4a2c068fc9e5100b3ca571326687f669047e7d1718902200a4c4abd759e0f51b3e792ed2176c3907a153aeb10b3189f9097f8689bbdee71012102adf48e5284c307669c854f9e4b245dc4828ffa585ff3af8a9b64e8460b1bc02a0247304402205d7598c49370f93eda45e199fa342d55fc365c949867017ae8651fbfa8580370022052a5d5261a30b1da5a8a3cac2656628169c440067b04dd59f3ffff297da0cd3f01210270f2e87ff41efe8dfc840c9d7b5c66de337af9754bfe0215399afdadc864a522024730440220786b2d30d710353977d447ecb2fcd09fda3686db754ba415d32421ed1fd1ba47022039bb235abb5baae6e2faa29a25edbe476377943145a105d67b133f3ed305a48601210369da264bdfc9515e34369d44c3a6e63bd8d0da38289cb09d1f47ca709480e5940247304402202fb27d5d83df206a1ca5e1a6544dc3c656c28d0aa3368f7cb4c6b110da3e59bf022064b98d85cdf3977319b81537fa410e05abec25a96c60e7f553cd7f5e2ee43ef1012103c2dff31126f4fb820c27f834fdb52c22a11e687aa6bb2be35456f6e3f80e08ee02483045022100eb651bb80ee2b592cded6638b538a407f82d670a3d9daaab8e4872a2e210813102203ff43db4060c044da0726a68a423da286e7fa058fbdda15ab816a7d3c007a21d012103fc6c34e54def90cebc15615b9669267e9cadc36e886ad92f4bacdf11ea067097024730440220281132bb7e33dbee88b96b73dc23198bffaae1df9cba2ca105f30842cfcb1a20022001f2c7cca695dd5eeb463540fc9c08bd0593ec6b150704c65473e32b7e8486be0121038dc6f06df0db42ef31a7b9141c5e8170bcb2e35894e787a451c3c8d3c9bf9b3302473044022012e938254b47bd06f1214ccb4e06247f6e7bf0a5b1e35f1d8da8775b909679f902203b13167b0556797658714716edcd5258498276afa6d6e807506be685605b6fa00121024dd6b2a44fad13d7d3a53a85ea039788790cbedaa336f8012fde0531207770cd02483045022100de30c0982e354620fabc62db31b6d1c676b56cf37ee48418cf0f85c305fd5334022072b554b3029463c2dcbde306196bfe0153da047e9c4ca6f14fb2891033c4bea4012103f4d1213d5bee5f1cc4d8067c3475f555ebc92e72f4b9d2b2f3febbf825cef45802483045022100d8bc22d1f9eabd3ba2c93ebee41f6eea57a8dca7c2807c48124bfd5de8bdcd0f022006f13f6b7a165f457677dd06feefc676676bc17a8f0166016fcb117c032e66b201210267b2ebecb9d7fde1ef7811b0ebf58c375a75d759abb78fdc1d50c5d2baf167ea02483045022100e3805b8172c3e71d234b819afcd654ac1a036cd3fe862636916936d0ef51eb9b02200c1ec016869fadf78678339d60c8cdf5cc21789ef8bb008cbc1c6bcd035e477f01210205a61dc58129cfe9afcfbb415022dc0c43ff2224b87ae2cc0f61b14996fb1a5302473044022005c4b7ad135b204245011b2fcc42d7ca41288aea1d538113b34c4c63158e5f4902203a496abd1a179c01750d6e205d108ad787add8709ad0f959dad1827a3a9022ea0121034d28bbbd349ac724d4a3f3128c041368f60c1a018cc4bf499095f757e202c68202483045022100f4b946935ff219ee9e0487c69c793b2e22bdcc3f41d0b585c995e0b848ea00a002205d8a1b3059fd3ceee4215aaea8bfe6a70af86dc58a9acf75d497e691a96013000121023a17234b03abc0a8e0b5a225a71778c6a658a896ff7b6781570135f05ae57d3e02483045022100c8e423fcd2a9593daacdb5c2f7d3a7f5aec60a6ce6a0327a5ab974171e567e45022017b75e97db597cec750abd85bf6d9ace94e52c31885a77d6efcfc8df85b99d84012102265e801d98e9d738f5c13568c1b72bca20ac7a9c6127abc91dd91d45a005454f02483045022100c0d01d92f5a5a9276fa811105e3a3f3a77325c1965a416bede13de822777f1d8022077f832de6343e41204e78858be688c3c61109448859c30efc9b49b1f8ebf416f012102d210a7052686f367bdbdbe0f597b40a51c85de6b24a8bbe99c31eb7274a0b5130247304402200bb46970ffed3c99e4f575930f6a91fadb1902a1745d0a7180b21ba57849650002200e63f2654a4858ff25c224b6dd3cd47c49657cfec5a1457f47c15498ad8212f3012102310e1c6de014b4cb8b3a4544a055b3cbe934cd4df6baf02ea686f8c037cd10cf02483045022100dcec07f6723c92905c921b4f7bae8e23b2e5e429233ac9d2450d0e33e131678e02204f4d79268ee55936ddbb68fb410f4d655a824f426fe2d3e3421ce396740084b6012103ead042e60dbfbb32e86a69096c6ea18f879410903cbafe4f06da953eb5799f280247304402203fc8e78fab05c20fb112b61c2775334744dc8e756aadbb5b63c2efa0a1d2fa4a0220757f98d2ee881807aafa61c744d5539824af4542184d7b3501dbeb4a5b9de488012103ae04eac574ee657324690a2f2860df7db91b6ddd8be2df277f17096b3b9b0c9d02473044022067d1751b493d6042bccbf4427ba650261f409603d619eab94a2b630eec5edc7202207cedb30f6a44dee7646c7476ec18f8fafe9db8370c1027dea61824c16a54863b0121022ac7fa76f7f1f77a0440d69126ec9a7e67cfaf1f36f454cfab8be4543206afa702483045022100b2728bfe6a705277fa53bfcdf79ac90901d853839b6d178c975b8ca15afa1c43022047e4b1edbf9321831aa75e4b9050ccf12e8f3ee21b388efb16595891c8176d900121033c09cf5d75f18fba0fd302813c4455ec9f9c9f67cbf011fcca3f73beee3434d902483045022100e5f5a25bfd6ea42f52c549171228d1f2cbb38b9877b880fcd8221db7962fa59f022074e5f6012bea4585accad9a5f2383d860cecc4cb25d438b7548d537883c92c700121037ec879f59e2871577c12ad731ca80fa8955dc822bb23e088eb390ede991fdf140246304302203ab091e927f8fcb81db6c72dd54ff3cd56cf71f92a23110d67d0d1c3ec2f65f0021f10c0d7476c02afb2b33c121c3e75e0f005e3ee9e37cbd6d366db398ceed1ea0121028f4ebaa6659c8c17f403a6bdd197c248eef1a6fde64fc45ecec7ee88465d80f3024830450221009bdad8ea8c58da6eff74d6b43fab6462b439a998f0f62d9d3140e5813187426e0220523ce8e5f60b40e2e90019f57ae2a6f9ab4899a2d113338e9ba539c255d702be012103f0ff4d855e957748f324c6e4af3931bef9d35933fc362c6643c411f1541acb7c02483045022100fd4c5419cc9e0ed5f02e86328ca84b2a95f7cc3869f3e4bb2f274a555413340b02206b4be3eb22ff936108552e8165d318b7143284980432182cd6f363861a6dd2d4012103558ade9e713ef4975a9279e88a521a56631702d9b70cec44f59916d3cd3d7e79024830450221009b4c7879202f8a204a6f212ae474d7680eb32afe462ef6843fb9a869636d181b02207da3649ac1823b7eec7d95ec7bde07184120b587a5753bfdc0867b93019a253e012103a0f30dc10fb49c4e034b49cd754521f9bbe6737ccee3965c26f6b07b01fdcc4b02483045022100ca07f08ab8e139ab3866799a814eaa30a6bc2865ddda45c5a1de9a9093b42ef802203eb1c6df5661571ddb9d09c04715aecabf2ac175d57e5817702b7668b85174d2012103e635259f7cdd6d69ff3ee3f785f839abd8500c53e98b705bf7e78a8eca08cb5502473044022036684c3b7e3a8910f2b1615535e0d4c951447fce9bc2465046af9fbc8e4f63df02206e8a93d251f8d7bc2428cb6225aa26b238a783da84a4afd0341ba68b8e5a68870121033c06ebac6cb21eefef1d2d4e6401518eb35711430353fa3e985c2e351d9b66c4024830450221008d4d666f9f546d4ab1e9ec1943476ca6009b5568516988a21d339fb0156fa77b022070869d4da791fdb7006686b16efadc1127a0a90a2b902afa4fdbff1e1034e0a7012103cd85f8abb7826dbb451fa8ca330e114b66949dce6c491e930de8549cc63424c102483045022100d9c68a4b0528d850e3eb8e786ec10742c0964b9f091dd44c57400dc25ad20cfe02201b4606af9bdf240fe2e13a425071f0661b8f89ac851a883adf5443202be3c2d0012102be9fadc7d84ea883f2792c1c30d237c72e5a89846733a6adaa7bfa1ac852a00a0247304402204f0a8527057cf96a2fa89b143b65e23fdcfdffdf4bf1a0243f42b29037c6a24602205aa0d3a7c0080565d6c2ada1a15811a5f31cd09ac33b11163bf0c5dfc6d42e4201210238bc52ca5e54313f3bc26f9f374d9ae43b681263fe81897bcb7b5480fe421f9502473044022045beeeb29c88c56cee4f7fd799ac137873b1a58687fd845dbc75847bb0db01f0022061e56888c9a482b85e78a6046581c607673afdbfeac985850ad4ffb32690743d012103b0512a4e7cc8c098ce1ca1b8e0e0d6c1288e0c720f09a5be6a09253c67f2d3a602483045022100d6837d4c223dfa8c134d444809619f5ce6fbd1a8b5acc38a505987bb9797a35a02200be29c72c3111a8f8f7ad63b8a0798f475cf76c6983a8ce06b893c4d7847be4a01210241657226e9c90135147a7bfcce81765b90c4cda34995c2f9f3ac55a140e1929402483045022100c5d975e29148f9df6590e5d5ce07577b619d300df2622a8028a063abb10a189a0220342a75cf58a998a64409943adc30ffafdbdfd15d05b837b92d1732d660300f110121029a34da5ef7f3c4859ef8241c8d53ab64390c29247f726a01117e82f398825761024730440220463685c92e3de58b0d5459fa26813ea304e46c289f34615f5f8001254205e30a02202e10ec629ef0cb4a150c13c729653eb7c86fdf275e2d4bca3df1ea668739b172012103e7c43bee6e8109dd6d818bf4d82227c0a58b12d7e46228237db09231861ab5b10247304402200ecf4cebaacb2f54e674a6515d6c3ecbbababbb7e259a319f0ce32ff137a52240220521dfaf72085fa3c81c7d3791a1b9c0877c68e34d0e9068bcc0775c4ce6c4c38012102868fbe86ae80a01977225f354a57fa66b32294050ee2fb5b953cb73099f8dbb90247304402206d01ea7b3224dec5ca0fc687e0f40b510a15993698f0f79303d73ff6b3a3c63502206c041a8c9812d5911b01244f6e8cf8f456b480bc918354adceef488fecdd6ae801210373b772afbb486b421e25e61d4808711f46b53aafb74bb041efd2a3fcf2d99dc8024730440220278c1f2d7b9742dce7ec53600b77e3e221de5007bc0a896e1d39f3d08a2a845a02200b2acc657a9030b0e55c5af2484c780db37fdc9f1bb738f3bccee03f017e12d3012103b185c55a5e9b7b439eaff7d195025c0259118eb07374733acfa1066c58b19b17024730440220522f4dea5b1b48fcdcec80a7e8ac29112fbf6f6ae8de7e157bb8d1e7a5612ed802203ba487d681da6302ffc395dce673e6214f842342f40297f6a979009d4bb915d2012102d48d64f1171bfceb6ba14fdb516459ef390f718db45e2e3e02aef7b6935251d20247304402204115c879f7c8bc32e8e609138d2070a7138580f7cdb38128b56a75e2e4abd4a802207cd78c148ed3803f92d9bb3d56923b7e122e54332784a1b32404dd73986b24b801210310266fd9518fd0757e8b9ec4abb40c31151461e2222897229b7dafa1f19a1afc02473044022049b87a5346b8720ac1e90612eec31584daf27643b2e6eaab398b7d2827f6609a02207ee1bfa81fe66a30c1e62c32ecb2b0b43b645edcfca303683e4132ce700a316b01210370ed92dacf970a457592f116603115d1bdf420a99c6fedc1a5864fe41f6804d902483045022100ffe91606bd7d4ea17aa790690ffb264f3e50fce1e3720637b28c8f7d344a2239022070897e4c3bf91c1448224a5842dd43a361b4e77501cf86417e3c4253789d244801210295ee93851ce3cb2394593e3de894760f7aadb5fde4a8e75cd6103136876cedf102473044022056da83a9fe9a9b52841592cdd8c76f5d1605807d99dd76201cd80bf1b6a54de3022058785d04ddea8ec3ab7379a5808d90dda54a19bd05934c4540c13f6103ce4751012102c538ff3934b7904bd52ed61473381e0af2062601283ef0d697ebce8ef202ad630247304402202d14686979e30f2be6a6d210890d57ab6daa169dbf05e1458385a764ed910d5c02206331534a12af41c9ddd6c2a5e0311a7e2e398072b68f2c39022fe2e7d753912f012102c5f2f73bb6c1de5b0bc93ef58c13314166041bac06b7fd45f73ab17eb23fd1fe02473044022076175968d6eee685dba60174b9d7945421d93d10fd6e3172df45b3332f1e79970220490bd8eceac0c64e4e4b9e7c7b79a154b10ab0d0d3046b7bf5a3fae6360f0748012102e960f86641002db7624b6af3e0f8d4c236196166639120fdfe43d18c10d72d1c02483045022100b19c1cb8b3f070047f87458fb287452f6f0e58894744bbc21658dd2f17f09df00220443e2491c669793f2c7ec84283cf8d4bfecfc763ac53a1c437cd38a941b5b8a00121022f502781f29eaff43e2608bd2375e798727902fc62792bd5c74736d892a9e5b402473044022077158b5125e091095f6364fd857e5d0b961521d89e50f777298a59981f272c27022011e9465ed7cf99ca8dc0676b3dffadbff483d50f9d5fb03bcc25a9df8461b6e3012102c00f2b6862816e051f6cabeb2eb095191d13686bf07ce92f81142197c203ed6f02473044022077a5db89bf99ed09f3bbca83cfc788705221aa48905fe84fc9595474e78bb8fe02203805fc8f9be6b2a234d39d9e6082dd8cbe055210ec6164220c8b04cfb0606184012102564fd823be891cc32d9ed936d3ce6975fa03b5f67684a2ff3a2d98d2eff19f2902473044022076acc0d50d5fa3bb1936a3dfb0dfffb32acf5198446a12316726f4e0f861c1c102206093ed98069ab091677508b91dd63708ded0f29f47dbbcd4b5fdcf9b82c834990121023e12c82cc890afbb6d701eac6ce92550e9f7ac89c2b2ae3d2674638788f0144502473044022054ee76137b4bfe11bc242ca3565d4fd2408fc928b0fefe7455d46f23e7947acd022042ed304711edc756593ba4adf94e5f4d62ac1d036770f0405ec78a13a38a142e01210307e0ee038adc96497d46843dc158c5642e909888ddde058a62ac64cb1d6b67680247304402202800660af0b8bf38375d92082c66c42a08ee894a471610a4a86d134301a51bfa02205c1f4c80768438972b5930df2b966a31290a81eceddaa2ec245d7ad6d8d30d8f01210283ca16bafe4b437ff47c2732538b291f0fa8dd460181b8e2fcfb9ce41ec7351f024730440220627eb1b8bc3ce9805a7f78700022b8d8c094404c59b52c5460d645eb708cc20502207c42a1fba32a29725b54b564f3fa16b186faa31ef8c93cc02cb52e1176497126012102607c28406abd6361b340d34e6d538bbeb047d72699a8393dbc30c4cb92e35ac50247304402200a5d488697ec77c5089e0d0666521a7ac8b597e5b9796f8cffa4d51cb99b60a70220661a42e0cafcd8633f363ecd3af755624572e9cf3558a05e9f4b97250b13a3c10121022806da39a29da9309a20794a92ceac6a013f94c84cb4e7ed3444436ea48ea9af024730440220024f71b741f93dcb39705e411f8c49a09f60e3c6086a72f2cd565fe10f756bb60220247aec72118a39317205184e09e7a1d49c7855ef846fb49cc0221c344863a5b90121028f678a57e0cf5e104a07f6e714b5fa4ed89e35c2b334fd19f56dbe73df05aea40247304402206ad716e76e264938ac24d09c272361224a7a205e1c429531473af03343d6b46002204ae9e061963ab93e5fa268e1dfa1b39ef0fbc0352dc85312cf8fffc3a64f150f01210352a11e46110dccb288b881a96d6695efa84c46e861c6d03e4cc7f549d60cbab2024830450221008c77055560dbbdd56ea0ec8e92bf7d8c71bfdd3c266c1ecfa77dc636af2f444502202ca37f91ffcf9499aaf357bddc7730e1f169d746b69af543510eec297b26eb0d0121031b842cf5f4daedfe3b99f8e95805e92130ff780a52c932ae77ab48b3d051067802483045022100c0203e37ce6914c747c1f9bbd607ef848fdc72e834db50db680a0eb8374ae51e022006496604deff27745b9218b96d4a106ea60adfe45a5925eadfa7dd82c129c1fb01210325aa2fc88179dcd10f228bf799fd490ac62eef76ceba78db37b8ffddecad42750248304502210081e85ffa9a729c0440ff1b066b5cca1f21e956d201b849a9cfbcbbb6c19baee202200bc17f9689387dc2f84926d7649faaed92c0645624470558ca0653b826fe6e470121026e57df686e6040eb1ae86fc0e30548cf7e25a8b2adb25bd8063d0682902986e6024730440220387539c3ac3a56959becfff4c02518d91fbea619e2523767888e32918733fe92022070488c2e3980ac4b981ad9e41091c2d5317635af1fbf6faf0fa86eff642de0ce012103d6a610ffc7f560c1d9eb520ca09e3da321464ebce616ec32e907c848cd320bde02483045022100ca07e5dc6ab19ed467f202401e34f42d4ada493ba5fc11db4e26c7f633a5868d0220595ee272194a7758c3caf557c0c2caab676b072bfb1d0fc31d0aa4f1edc7263901210267b8687b942bc659a0430f56876207e7fa80a1b5159dd6c5f4ff1b317972f55b02483045022100c2aed5396b95916648effa79be93490ed28486d0e89fbb63fb7119ba010d3f63022041aa69114fdf265648696d1ea635481ecd36a06b506fa283ce021ad9babdb56a012102e1d094cc7ecac2e1ecafb21f08628ec703826dc12fd53adb53d9791d1eab85eb02483045022100a3687e86ec4ebf00e089d21e55328ad7d4bd52aca72d268eecdbf7ccc90210c3022048612c234ea9911cf694e480499472a856fbc94cfae24736b45f851ca9429505012102feea44825baa1cf35fe181782edebb4b44cb61a57bfe30b528d04ed3435082da0247304402205892d3afbc47c50b580c68edf8805de8383c94d2dbfe3b19cf6204a3233389fe02203358d81ea7fd908346538cda2ca21eb3a36952030ebb90aa08a733ce70e9faa80121035eaf4043f2041acf2d5079e1cf64427ffb1c3ff501eb7313ddaaeb78c0a1ecc402483045022100a8506f60f5b90dd9ea32d33837ab94fbf989003ad3a0b86f216834b84613b4e402203399214351a283b982a058720cf44bdb52e8bb32727ab79309e3ceab47093b00012103fb1381f9b7c186c088e000b61bdce9d0f71030932b36f2496d6fdbf58fc8c45d02473044022007c81da6444970c226ee2fc31e50b16302bafefa079c47f2546269587b116f4e022033041635ffd3363df50b09e660b44c1af36c04c4263820bc866d7526988dfb86012102b9abd6d6dd0eb070b6bb14c542ac5fcccd39eb890f2a43abfc5ccd4a91e9a27e02483045022100e25fde86ad44b7062f44103de7308e4221fc71bc714d0e80e82e786521c9592a02206dbf70cd31ea3646a2b9f886d28a11d596fd9faed5f96535a07ef723bc3d3dc40121034850054f785afd46059ace4805aed52deace0d3d53de0d77092e9fa5735e98c602483045022100e310ecbe3d202532ed301ada9992ba54eea4c5433079129ca4e7d2b1e956a7fc0220303145daeee118732b02586382e2406d89e70008b35b856389f1d7038cdbc5380121039da086b24e9f8784144ce6c55f6f1b607943cd8dbcddc3434e37eee312c5bdad024730440220228b100aaf9cfd6b2ed88dec122c785a0b214b12a0e551062e4d8271016dfcd502205cc2c09a4f29a47cf183da304dce750153fe56f5ab540b6ff149cc5cda5ab72c01210399bdd2f316558cc93db558fb889698406a6c06c3715e65e0d71eaa5ecb9a928902483045022100d8f8fbe01e10bc8175a637878b4c0aee091556a619aded022fdb6c99d776c2a902207f1bd1819c408d8c162c23174138bbe4fe643c24310fc70ccd0af13007c144d7012103be4836c458c207b2ae7b0f99edee800499950542716b1899a8bacaecfa4745c7024830450221009b3e94615129a6dcc03c0218f61b2ed072058e301667ba04f6efbbd3683f97b002200c088f10003b2d0e61d79d2c6dce905d9b987e1a18ea1124e900666eda7e4e3c01210229f4e6ed0a420025169c4d6e0f4b24bd245724e876edb9c28ed327993ffb810202483045022100f8b3699239b5c9f5fd43f357d43cc971a8f692816f73a2f0ac686759d2aad965022061862a2b93e282570a453017b9e19db0975ddb7beb6bbbbbb31469905af940f801210359cc361b4c23dcc0bb3f80694d35b24f74553fb678f59ff7a10c4311ffc76caf02483045022100ca3d02b36bfea01357542d03a9efc71068f2e4479879374b91d3d92331830514022057b05851cc4bdb2580da8ad59310d1a55a9eb5177105ff1a8c90b9a4ae3404010121036eef02d8d91970e6ce2cc5a704dedfbb4b29404166d6faef64efd26d9772fbcc02473044022037181578b489108dea705db002f76f6b428575cf64d91a92697e3b71610b073c02206861367901e65c1ac29993de1f9502b03e2f7e90349adf2cc1e57f2b257de2bf0121033b00585b703f6aa39f36a3a266ca0cbcc6d535a4595546c1e5537fa757e3ed030247304402205ce09031b5fc9e9b43abffd59359e3fad78ec3e1ad69c10961bddabbbba1bc35022038ce43cac8d13cfb8793303b457e62dc37803f66e93c06ae8bf773e9c2045dce01210323ae69e378021d2434a83e446cdb934054780b2810cd906a924b939eec5a37f002483045022100dd63ea774709194ee95db5f25a11ee7be3174d16450a7bdfad28287613c8fdbf02203245ed8750bc65e913124bdc5da28b252929646962ee9511d6331e08add36f6d012102350f529a32286f6eb5ea1b5c9de10642be7522df96dee2dd638a4a2dbeb959d902483045022100ba06507dcc65f1341b0aedcfcddc8d3980a2a21d1e675bbb8445a4d64e1f044702200b56a3fea18d876cd2d65045e7c108edf8d512fc756f67302c309b098a4e5df501210361ff9da418ed7b54955fb6dd902c4db56b603fa6e7696af1ee336a248355d9b102483045022100ff0a860fc73c63e99267f960793768d8019c5f3c1a46ec1e67ffc512605da5930220586b4963194d6e4d2a51f8404db6323f2747294fb5f2c9b2901dcf866f143f02012103cd85f8abb7826dbb451fa8ca330e114b66949dce6c491e930de8549cc63424c1024730440220406f7da98c62cd959bbd8dacd4b73b2f121841662ad89869e5122761017aece202205b93712e37d7552983804b6cccfcff1864adbdb642621702a99129a4d4074e79012102426dce357baba451cba85e2f3d042bc2e3a3bf5ca560f5a7381b45f20e612a8102473044022047e15b26df1961f6fdb5ac765f657b3532a6189d2ad1baa5d9c208bc7c00555102202a01c4fd54a3b051fdee6ae7cb4de2750b830be53accb41b86e2eabf38eeab44012103ba353923c56cb537616c84354ec0d4a5f59d0ce0a8f41ee10baa1b2e513f5b3502483045022100f4279d0fc772bd9bd6f528091a8004141c29ab996fb7fba6bc7711e3e15869d3022028c7a92ab098e40bcf14fbfdae64c4524d6a037ff20c147ce97f6dd74b7934130121035efa86829e1ce16a81a81d8333272fd8a3432ef2aaa90c68b0d6e908c82a681502473044022045d0118c1cde3d6bebc3718d8e718c8cb35ed24f8629102b6e2988c58e11c5c202207baf87daaedba6586249f0999272150718e0ec1d87d29cd37d608c2a75df96cb01210223b4f3fe5554b458610c8fa68ea53c3cf4f9efd4a03d0e96d6e1cdd68734f6b90247304402204f249c73c7d88fe8f09bc9d850ef6247fd65ff273e1192ebc31260744220f7520220035a2647b8d703c049dea65b475a5c0f117c25201cc1bbae004b6d3522a8fc9a012103623d8dc913cbd5a75d41ef9e41e481ca602fb8ad0692fa482057a5a0a22e5a1a0248304502210084d8fc6366997d52c69fa084ff70b22179f9b372b4ef48c9d161349fee94801302205a1cfaeece48d23117fc22686313596b302360b8403ec8da0ded98d24377897d012102b651b9e448cb4ffb45428a306dcbde7cebe52bbec3d624e5d9af52b28edee1af02483045022100b957700898cac854bdbafa19b7285ea92c6f0495cfa85fa768f036e5b6368de002202ef83089be7c609afc7b996a19f71a2c1a8c60d20657d6da2fa0f9a55808de1501210328a55ff0361caa9463f25c759cbb6ed4778bc7345f3711f13dfefca09bd3092802483045022100f689b9ca87269ae9d9c364b3e622aa26dbcdbf7175a7e185b0a97f78a172b6f0022031d9b3e2349115eef7443b4124bd6df829d50bc3a5b084f26468b6791e853e0f0121038625260a45c8b932f6883e0bdc24232740b94d6a7c5b3b573b6c68f2f34151a602473044022071d97581ae07882bfa963adad6d55ac354f0ed8895fe5dde52074ee76a52e707022040678dbe75d0dc4301a78868c6f9b8cd3d4ef2f8f977a8016894966485c36991012102eac5dd056d2f45c393434669a68e699fa9f678c96948d05173d626d2aedd054a02483045022100e2cfea51b01e978899613821758410018b82bb14a1f0fb19371de75f2fb331e3022077e1190d03e1e878aa61ff9cd02b5603e60fbbe668cf756d2212ab1d8162528e0121033b00585b703f6aa39f36a3a266ca0cbcc6d535a4595546c1e5537fa757e3ed0302483045022100bc1d409dcbd2bd2294dae078d6080ce361ac5d5de0d2c54136f2322dccc088de0220669d4046459ab3536da8603c990fe5ab5df0584b46d3bc69f703477ff298e11e012102e3908ef8a3d6978db5cbaf199a8e96fe1f3ba296b32bc44307f8e0d1068fb91c024730440220618ad4f12f6438bdd6babffb6c6383009ce56f8956fe408d9ce0fe527cb56b8302204abd7b64bc5c2ba8c040110607422d45b3e8821d6780889c70def0a90b4cbcbb012102f010294a627359f8810bff1ee7ca9b618f244a9b8753723251578202eb032b3f02483045022100c1e56aa92c16f8df81badb14cbcda5cc8363a55ef95beecb9cd898173fd6f7d00220424fe624eb5910a6b6adf7d2389a74da83c441fdf6dd83ec93a33d68621087d3012103a9fe18bfa2ff68dcf70e4e4418560a6493fe1b49636b26191285530d2a7e239d02483045022100bc7db9a1a70cc293a022a5fb6496de4b46011ab98ccba6005b8cf6dfb5be1d80022005f91a0610379eb78afe254c6f2db52568c4e3d08af681f5111e87eae36cd4c6012103e3edceef4b1c3a0a05cb972e4868feb736628e9e20e96476b7bd279dde583ba002483045022100fd4f95994ffde84205c1cf9d628e5841100bc7bf0f3c2b444395ba7f74d88f3a02206b3a28b9c032c966e4304535c224f92e07d26e2955048e55613c6a439e117d870121020083142eaba06060d9084f721d42d55545e1e6576453874663d818913b397ac1024830450221009515bd202d3ab632cef0e80baa40938031aa469a3e9ceccaa2885fb8d7485ae102203d12da5faa08a2189dcf89a377b03322720bbfd7c6d1774c062ddd3556df8c34012102a6a70b47c0339d53f9093f00f12f20cc02d393ebb868d3695de405ce90f4399402483045022100faaf7b927c661fbf58bdd5602b6db3447e6184f410cec45c66b6ee008631056e02203e98d413543cdc0a365e07d018a0a803b11f3c590a98b336e3e08d102c09db8b012103994dfdcf3ac2835ac09e4f84edd755fa89e49d4be133bda9dbf643804ccd5e52024730440220528d55f4f1c95835168440ffcbf22ac7372080915571494eccb23499aff8a08402201d39d62f8d4b2b9c11c4961c41d828ff286e3e31eae7a4af3b2324111be067950121022b3bdfa522e9c03aa489b768b853e8816831167a6da940f13771e215324b6b3602473044022075c6f5b3a5d122f642112420cbfa470b50329cd04e3f93beb4db95cafcbffad30220366073b206e01442d378bc1cdfa53a200e959eb6803a6258caeaaa8d468b377c0121033a1e26ba585a9a7f1a9e6c07b5fbef9007da4829c1f784da3c60d4ba79edf36d02483045022100bb24addecf89e7bfb447659d661a67cd680384f7b985775c22664633f82db3dc02203ba58dac38720773c8a011a06e9ded9c736a10585eb1208b70a93fe18c7ff73e012102bce2028446157945d9727516dbc9de17ba5f50c7a5ae80055f8323b4574e77b5024730440220594283dcd8168a41fcbadb4daa9c5bf717e09c14fad84c313c0453b122f1a9cf022068aec1326efe44f9a27f9234494110326e9f15bd8652a7e7886090b49d62b86c012103f3b517adaed1b8cbda7feffd06e82ed71ebdfecfe6c5812f8c7eb98d36f607690247304402205379baeea89f54b8e4a28092201cf98ac86c16a312264962b7dcab0c3cc990c202205deb58ace65a0d261eac5bb7f20c393a6d89ced9222500f91692eb54c815adee01210250f1da8f46ada9bb746997c951ba1dd474e9ca45cbe687b335a6d7bc025413c402473044022058e3bbf491832bc853b647b82d4592ca6861cf274926f3f2211aba4dc51a8f26022051cc4f77e3877b5b225641c9bbca597fa03f72e10f822a1d2f3911496c0c04c401210243352b5f45d9a3e7096ff8f3d5095cf6e81b3cf8e1aba1df09eb38e0bca247b40247304402205fd9d69101e768465c50c364afcc553fbdf3eede6eaa4617251167ef189c33f3022065ab3cf928d1f20dee83c01fe3e239365fde8739ba6d7fab965f5d5918599ffd012102367ee7f1e3908bf9876471f8b90e2b08ed231cc8f82716285ed5dfcf1de6a0540247304402206184e0f56691dc99f7fbb0926c569a5321d6a19892d9609ee9680a0e4d951c9102201a08b102366e205ddb27777cb34218ad9b47ea951b708bd4b12d36ebb2dc624c01210242eeaa6e44b207267b4ea7941981379edfad946e9d86e15f43b35328e08e258a0247304402200b4400ce1a41414b6d2cb79e462c93be599da7142c0b48251b32f7b23b30b4f902207855260a33265982b0f6c1280b3460bbfe861969805106fd93f37fa743ad71b0012102cbf4b3e99c081899f8df4f317969e4dc23a38ed4bd5ee1723d03495386659d5e0247304402206724aa3e73d1154f5b8e1541539507bfce7205435d68846b773086b2b058c88f0220492de1c8a24e98861c66af3a6ce220474ac20641016c585887dce407b603ac210121031b2d1337f93d691d3b86939c08a0d91058840dd42a8a2e10e9fd45bcf16cf60802483045022100b19298dada345af831f326c98bef91e963a48ab456d24e25c19d6e38c1cf3a970220196de1d061a6448009407c4bb415f710464a13fa8c5b60eab9701bf6dc93771e012103a9c8ea0e7cb69a08bd1919fa3b6bbce8f631e4e9a54b95007b7b0a6acbee39fc0247304402200ea81db228b6a282ac9105a29829602b876abe9650726dc56ad31892e97b830f02204e999d6208a07df110f32ce5e180abb4605d0a7fcc45b92cdd924c0780f8eed4012103c316563ab8892ea1883a9699bd7ac1708b646ca065aef49c5443269abf80fe0002483045022100a6bec2f00f36d99ef57bc7e94430ea0037d71eae4182e3220f01138b0462bc7302202609284f0fcb856a7595b1c1e10ab200755056547b3624e2bb27dca54c9caab601210335c8d8d8facc054238fbb1a42157883a8706bf1224a74c208009456071f2006802483045022100e883df05a240863e521a5a6c8884b075d5c7d9bb7eba309baa25613e93697296022007a7fbd3b983ba8a3e09ebac6ec59298803b4261452771ad0656b1c98b4d4736012102ef07a32e44d3d0f6f5fd1dfb0c52307a8bb5589b436db3b356cade606fd062a6024730440220222137296a7a5f38d0b3747d083b8f58a6a38f50b102e8e23a98045cfb053cc402206a5cf73f1bcc69a420436f83d44daed6cf4c9a592604b1f641d0506ba4e043c4012102b4216e3c52bdddb8712f68fe1b5b162f5b183fb6c9a4b096b81fcd49c4d3766f0247304402201f06d8edcbd3333bad833aa582e8469e8a0ec46a7f9d18f8cb9a16cb81a4d84002203d7d483ead601c669b9b60990ed0f8e70caa802d2d5cd9cfa02bea58463f1598012103a3f36a89186575813e381f52e73c6be89335beb231082ebaf7405d1d7071ccc90247304402200b78fbc0e78bec1079b94549d457bf377f7a494be2710e7b6b7e5498378b227b0220763688cc13596305aea156b256ce33dffb50132c12222a7ff314fe37e084b01d012102a7129f9cfd5f7db653a25c7224c8b165be8dec5ab76eefc29fd6b3069d3aa75f0247304402204d2d290b7c33cdc5b1e4e8c3b4ae18c5754f1ee38f052d960d18c0a9877d12b5022063157df772f02d2bbbfa8a699413535b24c8bb60ef019e0668789212a1a28575012102c226f9053a8e8ad34473a4c59a2958fa1e6bfb8060f9ac2108a0402fa5f6d0f402483045022100e76fedbb73d78e3be648e344f44a38474224a47d5a25dfe1a795e092c4c767a4022040a2d0a06126d63bec0101a9e24a45c5a28e1e1f3264b16fb90ba27498d57a32012103b2ad730b379e9537ee26c797ed92ea23407ff840540d384e14d698ddce0c85a70247304402201a1f068baa8962bb30b4e285447a17716bd55944d88f72aed9f432896a8b6ba10220400672d24da41249a5b478d02f17bcf4cd800ab41043d8f002c30846827a0b150121035915bb7d456cf8d01b80a319b51eeafcfebebe0972322fa3ded7a51362b850330247304402206b9f6e35fb7a5e9f72c381aaab430c4367732a16649a30b8373944202a164ff802201cdcd3a813993c8d03638b84d051842d732993a5c21802d516ddbd6931e60648012102ee89cfa139b320bacf561dc8172050e7c70233e9f28e3a7499f31a64448c0b7d024730440220372017d0d0670e649aac28f3208068c0f218b2116f1c04fbde60f65a98d46e6102201176984fd325d0fcdfc102d69e494cc9d414ca524f4e5cfde87337c2d30a925e0121034a7d334fe0e5edcd3b0ce29eea6dd005dfb283fa882ccd53381c7608b851b26b02483045022100d6105ed6fdca653cf06d645c802a4a5d8f93e7a7a464e079a2ac11bed1cb9b78022051e176572a6d0f93499d28e1eb3c611958b6ebc9f96c9c9c83d44f6165a27003012103e5e8537c960d3804777ca922c6bd37acd2278f49775f3e758e2c60ed5f16f34a0248304502210082776d6a38c208e6b19dd6d4cd7caacfc3c883f9d82a9ca6b8d15f88da2436d502204a59c2a91191cbd62e4311e0ef5eb1a51a95a0e1161ee27f803b28ce0d70a57e0121037bd2d50d1bc55e8a7c9ddf8d2c45cb56991b394af2ba6444c7bb543c756dda6902473044022003a4fcb070cf73014c0770a8c274891a52a2d2a9e3ba308188a9ec17de8294a20220266aeda076dc2a364989ff05d5072ef92418836e314c5c25530184fe437768e0012102cfce75ccd8c1b4119ddb80d08d74d3dcaf41cd5a8891e05889cece80614e29dd0247304402206993c4072f486b9b7620e26a62dac04f6beda0f8584cfd8d92556581be40df2a022072c3404980e8304b35604d8e57e42bffddf1024f0887229159869a8f816f3d65012102216fefd8ae6e7a23d9b87b8507bff440dc1236b2766644fbda69935951ecaced0002483045022100b22d8165e0e8b4df021225ea16dffcd60c9b5153da424181449aaaef4d326925022030ee5321a219714075df3defcd2e4ceab03482b3eaf1f1e766f4f759ddc58e2301210270e6037ffe3b0173de784367d7e44774747e23915465c0e9aa9b141e076aeb6d024830450221008216b35a3443a39406b58c016689d387f6580d853e9dd5539b9a29b52476d02c02204054c1fa7286e6ab0c54c89598d2ec1a324e1859f85c3bd276c9f23ae154f1f70121028685b571baf91831367e5ff28ba1cc6c66ab63f83ee0242ee192ecfa0221c74c02473044022025a4478a048959120fbe057548ee56f0d9288aa0546f293b5a273db6db6bdb5c02200d7a56ea24a5cbf21e0f5199dad632f1de76b26104d5f4d2173cc413888000a6012102b81e857adb79cf4edd763f44571b0f269c002b85b4399c6beceee353e0ed63a002473044022034ecf5b5754af7d2e8bdd144dfb2be82edc0cd37a2c274bc348610e45e0dfaa502205d1a33e9abcabda6c41fd23a7bc5ace2e52fa253fd100f84b2594dc732cc5bb1012102980d7a46523ba34477db4566abff1fa1556e1866572f15d1593845580b9dd0880247304402205ec2466396ce97b12e1fffbbae11789f79dcb4d1c8ad2f0fe795928ae50ec71202202102e804e46cb97aa54e58425b9c802e6fe9d47bffa5cf1fa66be35261119656012102a726d1d0d1554e51f1ff953f94cd1b29f3043c88c1c2d9a1f9e26ae090e6c0840247304402203d9a57e607d5ed7d867828b022f872eb58c0aba529961320395e96f7b898955a022057a738ceff8142d261637c5d8fd16083c657a430357962f6420651ba37e8dfc6012102393a1aa371e6946a7ca64651e5d09719af0a189f74a24ea6fb5f8081bac407c00247304402206526bb92bc6f7220eef29aa2a352ade1d49acdb84186f285ad0ed344f26218d002204b8bdab6eaf31e0962afd7d12cb057cfb2202f11956d96ec82ab5d7bfa4191bc012102ccee72630799e6fc10e4c5ec4294fe02404d807df06815f378fa4b82847d594d0247304402202a19d5e2ca6a1722af4ac20d0ab1c2614a8a717109295a5432a4d0ce37c311f5022012b01aa7e8d6d01a2772545394a0c5c6d0f1769298b1e1ff5031bf64b4249a3f012102c1620f357cc1e7ea445faba7b685fd87bf30cae7e9f3fae4db0c72b080abca580247304402205cca7654888538a5c254340272c9821f6ca6ddc5a1e898197ceb4cc39eab648702204a158261217aeb068ac86eb7abdff90bb38a6fccd4febea9635636e2b5c0a17a012103030d6bd733fdd8680ad339e342b5df3a3d602b28cf949cfea8da552a973f232702483045022100d8ad3d6e18ea2f07f3735575b7f7de1ad5f6f26f308a3bd3af0ac6047b749d3602206494fd0b48e3417934df6606692ec358e80667318d38861c0b598a295c388ed70121039a893d30c66e8a17bd27079b74d978fa16da13f43459792d27e893f16626fbbb02483045022100d5f34d9b260c4a1adc3c1d707965955df862bf35e2fe096bfcff68cb3905902c02206726ad9931a9a8c34e4dd8ecc2d5412ff21da2c991d2bff28a1f4ab62d1d0054012102736ad497623d8627ab0eaf97736135c776721ef309c6a535623f3cd1d83b09db02473044022059451ba1c49b7e73d5ed6e2d987bca0bd3c244c14fa08745c8d9a300e55fa50a0220537c170d32e094297650330f8ce7ad9f7bea7603318f91dff5297d7299de4bdb01210227bc5003d155db1194cfb40ed2e7d98a37aab415d3bd7b2db18e47814229c8f1024830450221008e22e4be8428130481813cf34e4a30ca3caa1700b6b4944704313e77d88267bc02206eb5437bd725e0142ab48ddac3dc91d4aaf3b28e02a112218209c24f87c7399a0121034af6926fd6cb59b12321d837ebecb63687ab204a0f0f7ddf9fdfe83a21c6cd7702483045022100fa8b8487ae0b258508f8da16ee34f280543106cbfb53ac3fb5235bb18ef8ccbc02206fa79f532a6ffd0e143c7a7b96ad146cf9a68c3f5706d999b82a29dde2f73a7101210210477c87e3b54cf8a4e8cba49987dc546747f049088feb2d5d3d94f06679152702483045022100c1f7ec468af3eb85ecc66bc2d13bb5f2fe13a4283d85c87580478198ef4f6d510220306069ce2773bb2acaed5ed56d6b87c0e73f91b2de2cf13f64ed78c94e7832fd01210347491376534dd7cebefb18702b8880c2f376c98671d01df4759c3b82bc797f9502483045022100bfe952401f68767b67bf86c958c8c666df671c45a1c86ad4cfc29eaf6692e00e022013c5371b78be48d451a569767317a5386be747dd50af283b72cbb62f1a53dc7e012103e43b0ef86ca5b6708aadd00e75006b8d77c4fa5e192775c2fa7b64d4a431ec1f02483045022100be8126e391d1e9403baea591f69ccbed6122b2cd3887a92132eb69dd69513d3d02205d81a5981d8fb2e5a6531853f9ca6c7f10e098e569c2b73d82148d94c988abfa012102a61cc77e0e29e96c4223a0b6f358e03f1770b88208333627a43b4e42c46f21ce02483045022100ea01fab51bb38b2132005c6fad5ba6c872186a1821bdda2c6cbb2630910a9f8b02204f90ab48ad1dd0b6654bd5daf41aa127d385d9cfb38607d9c626e8026a94d8a2012103186568d8dd51ef03b5e2b9facc74a0d02eef89b918d2cacf24576f6a9d61bf4502483045022100adff313e17326e7ae4d8bf6d444eb10e5dcf44d508f212992abd7d6cde14cf6002205a401fed1d1e08b2057f2180de33b6aaa429e6368775910c14d3bea986ab1e970121024d3432e9c7b5baa0572d204b245095b454c90cb9fd0b6a78b6bd7adb5da86dfc02473044022023f4915e2e52b1408a95c28ec418c7f35c74cf42d64b05698d6c14e1c6c462ac02201c05eecda368bd1d60a8f5c2cae8c3876eae3c8fd342992cdbe63eecd64ce2a4012102550c2e7dc88f519ccffb4456b5f63be4dd3977116b3d7d280bcc57e6e7c2c7ec0247304402206f487ded34c68b9a3e9529a4132a88ef98a09fdd67fcedb7ac616e136bb9e61002200c0756ee20a0952f2ce1328d21a3a8074b50c97c05dbd4fa428469f55d7d5bba012102b1fd4870eada0aecf62daac3707a2df67aadcf3dc9e7e5edab5653e6edb4d8430247304402203ba27765d92e8554f94dadddf2b4969550c4886278a1518ce3aea046bd440dcb02202ba6f75bfd9eb33817af232b6015a4663f144173b1677a9b5db1fe14490a19ac012103e8034913b49c3df8615a59750606e97337b465997d6b774f072402a30718a3ce0247304402206ecc8e57a577bcff040ab80bde480d2860ca0516993175a2baf99cc00219d92002207092d8986fe1f8372d2be420a81c5decefc2fc430a76bbf6ce62a13a2f4e99090121029e30273025d302015d4b9522175b35010efbba15765ade70a84f3581bb0f61f502483045022100abd4050ab1b031a991c6894cd2d0805565101b9e7dbfa4315db2c68955a2ae89022047f23abfbe68b2079607a56c0ad72476567b9ae09cdbc73ac1525c6e9311c931012103ab6bed599e04b845b8c6dbc32bacf773044f60c27f301fd4dfa8f7d6c4576baf0247304402203e22bf59e208c838d90a77bf2da14028bbe6642ca6d4c65133d635b859f7483d0220497ec9dc25ff1bcfebbc76a1c623ae5c631af3e20fcccfcaa1f05dec16a481e90121028f917a8f54096542c1ea0fc6d75e5483242dbd3b0bedaacd08d96b820f5c22890002483045022100d273ba0de8ed4f321ee2318f145fbfa12a9980e0916682396b26b2fd1de0ff690220199d13e083d0095adb91ff0d797256aa5d7fc48c4c83a257d53cda5549480a9a01210242eeaa6e44b207267b4ea7941981379edfad946e9d86e15f43b35328e08e258a024730440220163cb24bf4a3a9fc21bbdcffa54a86097b67f6de8fef546c101ce7e62a71f846022027ca24062418c83eeb1251c95b0ccd3fcc51f6c90324fdbebc91955d229f9f020121039a23ccd39ea44a8c79b32634d90ecf7d4ccdf5d2c6186a0dbe68956fd0d94de3024830450221008d42a3865dc6b9908fa211dfe7724f20946a63d9d32e824142b0eb32f0f8bd9802203ba55bbdd184844d01b1163af822647b0887f8231ad729767b329eb62f71b7290121033b00585b703f6aa39f36a3a266ca0cbcc6d535a4595546c1e5537fa757e3ed0302483045022100e03258a9e061a9da805ca7de5235703437e954e8119dd96c817cb507035d5aca02207e7305d999f048f64fc7a310bc4c348b69a7c407038b0a264acf6e1a40e7b472012102d351c59227a32d933e2a87618991adeb737f6393fa34c9181bd422c3f6f115b80247304402207e55c7cbe97e733943c8a715b0b45828eb1db966a8d118cee09e09f8fba7ee2202201331b33d6d04702732ed6f194e3361e8980187fe24053fad5d1f4a08e0da595e012102be4291094f16479d281ad848757e1ebdd812925f962e9ec4c92b4ef7f00a11d0024730440220410e8838932261035a22a4c85e9c5764a20ee1c6c2d72d95f96772a73f661cd502203e1a208007ea200a8635501fb3f50535c8eb47d1cc5e703deeb39aa3d4c05fbf0121036c0f889b1d37a600fa65f2d2209438e96d97188ad951743b1041a6b5b7354df10247304402201a54ece978183b03d6be0ab140c486906b7498569469468a8307c3f28a52261702206473b4c118b1c0c2352820f515eead94e12a3ee3c47a9c044ca1b3dfbcc898aa0121027d8588c9358d198e693faa37e0b5645c096acc7353b7e7c5360eedd121081fb102483045022100b7851b5dd27813316262598133ab910b884b9d99b335b6bd8b77a0d1e3c47d9602200bba9f9c415997b0cfc1cd420877e9444ac130f9f1c53082ce9ebc6e96516147012103afe9eac220fd34465ae78095177e919e75c093bff52b5df56e9e19f83ed109ad02473044022009f41c38551427ea9298f8e67724cc6603ba6b2b077733bb5d9154be0883d2ab02205655fcb0ccd78f3b53cab0db86c99b99b6b9ca9bb46b82d9f769b3bf6886b11a0121039fb5620da8683f9e437a9927553355ff0591a107bcd56e2245cb9570244e8f95024730440220073ca711160adb26eb58bd6b30ecb8683426c15b538c8e9ad6eaf43842ec22b5022014a9cf80fcd5ec5ecb5f74d74da7db301589026d9c3da0bc23e9022b30bea9870121036ed3d745d3482914153d338c3fd87ddc4f9da150c6aeaf5b2cde3f8424fd3911024730440220559c547a4764ec9c6e846efe7f4a59a6bfec4606c8b48e9da5129c992240624602202d2e52cf0c53bb22630a3057492daf794dc8fc3a87676c763de830a179d2a0690121029b9cea8687f261dfad0bac1c87d77f5812aa04e4b0620b695e5cb16a32938c1102483045022100d26b6e8ab7027f4fe2218f26ab26d3b1085b84093872bdb0c7596cb5756f509b022010f66882d97b8e966ad9b098c139e7df54fc0f83a0ae819738204a3f6c04817c012103397d7a98ff92fe4f7173e3dddf73da0626ae46a37274761f17b6ff45a56f6fb10247304402202912dbca49b9138d54f29d057f84e41ce1b14e7b97a4e45f50e1be0300a290af02203763d26a6a012a3fac91a932b0c23edd06ee7338dbe2f01441897bc6ebf42853012102442d47e572149c2eb3cbb47345193024e26af48b6b5c21f5cc9d920cac698fc402483045022100c819539aae1fbde64f604da7902ed91fb26735791a2310de5bfd77cab020ffc8022035756be9f4f8d01f141026e41ad71069fc76861e2bcc1dc9ece782e12dccb70d012102264b9acf36f9357c22a4226356aa63db6e54353c60d175430986757f4946f08802473044022063be11f708cf01eba244c56eeb909d9becdb4857349e541f4fd1dbd1a97019eb022015129ac1aeb4b2084c41254799783e4b4b5257e2bdda903e073650ede2211c45012103501268aef6ae7ae34f36bc84c2abb06458be36df5e4b02f52b9a5178f1c4e9850247304402201df2baaadd18b49db7cb194c022632b9d31322d2ce513919208f413fc162f6d802207cf06ed4009cea6837ffa58bbb18dee9747590b75067a2083396a0a4334dc1bd012102247cfa7c0edcf56fe1d46db38a0f943747536db7fabf84a56e51b05d76a8ff0102483045022100b9ebe92d67cfa30eec8681e9f9c53447b06cd1d3e25e9a32e6e7845633a977d602206c383347dbe52d667d9c116364cb4d377b4962fbddf378570fe0141a41677bc10121024e1e1dddd2c8bccc9f74b1baa5c04a82d6c2aaf0e8249182b6d02a0e216e424b02473044022013a4035f1317977d1a2dd25e60cc3b3480b58ed62573070445ef68ff9488743b02207c3eea21ba691bbb89198c5a8c4547915c0f9a07c969e146d705ea7465b0b4be0121036930d66b0aa902e7c513563ef39b3194d3318526962de8f52cf657bf832276210247304402203d2b1f092832bcc1fa010768cadd5d56275ede5767df2b9fb9654df2069187cb022061bfe4ab25b7b080eb709b81d6de5a008ffa6cc5a826ec81730867b61e2a3669012102aaa8efc22e3f0c2499aba8b3a304650e467a3d713353943c6c90240b146b634f02473044022056bb0eeadcf7d063cf838b21ad0143a3b99e6a348887ebbac8b198711246943002201ea8e44664456b3a845acb5034db08b07935195800a775b4043b2672441850b5012102b325c0b40141b3a4dda896cda69ac14348d90315db9f5f54e4cd17e2f5635f440247304402200aa27709d1c997bebedd6903f31436e456928b4c34b790a0cd3b4c98b9d614a9022002c2ae2197fc6b6e34d2b422d0a8d371f2223d55be8209b3223b80d9a3f32b6a012102997e3cc5fefcb840c72d0b121862e68da214c87a13efb02f7cb9c193f4047598024730440220292e780b7d9bc9be230ff10962d8b4a298ea1887c012524bd885641518f5a59e022050cc785372ce5663483fa859d5116625673f41fcf6cfada3f69feda91401080101210289fa7c9b3a204685ef81ddbb4591d1bd221f37b2c946618a5d8ad563dbaa1af002483045022100ac73ae687ee3d95ddad4b5412be4136e8c3d6d835afe6a63d83a2bb92dc7af95022071e028dffe0086b5a413b82b7edb88a5119cd4efa2015373f9e78905cf931dbb0121023091aaf69d1766e221ede855c0803706071f5336e3425d7bcfb7161e4f984786024730440220077dbb2203e0a54c6a1733fb6bb597c2958cd23126ca680f1a71337315184070022032275c8df4824856a3cd9615e390745635a40e11ae3d52d3bb0af90b2f8e1b2a01210263fcf7220ad4025242d2c44302e44c23bb4709ee70ccaf5cb24f71c5558fdc4e02483045022100b4132c2779067dca697589019ff431172664dcdc926a98fa53c033fe190d334b02203b0dac0760ee8ef6fbb8ad2f0b6ebc2453772d7ed0526a9fab5ed9aa6a26c1e9012103939586bd96df7f1f8c815a71a492230894117dd928b97546c9f4fe1c8baf41620247304402201d632398b4bdbe0f86f3430974f621ae990a272716f76faabde825c1484b190f022021cef744378fb46b4d3b1669fdf3311a76a642bffef0f34e1218537b6216d2af0121029ebb35d7a2b1ca506a56412a955b1f10096c70548ec08881995ef114a378ea830002473044022036229ce2e6744c568ce3dacd092e7cb52faee01d27a46b27c5f81852de7d48c502202fe91974b5d5a3e627994513b166c3b33b5c9575b832815a5c7338b14ebe446a0121029848ca5780919ace55bd161a395aaf895c662521deaae12f91f01e5d1e76ccb602483045022100e136a0a7d4900de03a76abbb718b14ca71748f1f4d092219481c392f08165e7802203009558988464154a50580bf7a65bc74fca70917f228657976166ce70264327a0121037aba34967dab4245aaef1adc456c83a5d09c949469608c901d70bdcb2580097b024830450221009447f6c3b9a8f5e880ad414d357a61e15bb1daf8f61d1ccf1f3896bccc4a3fd102201a41adeac61fdd593044ca8b2102adbbe13dedc678cb9eb0777eea695f00e1300121037b18d5a8c21b63af6bce7c26ea2c83cc40ef33bd976927a4840edab6c007356202483045022100f2d44f9a2ad018cf5d765b57adbacd26f902d11d055f450d5cb5cab0f86d63370220573a7cba744786e020b9f0a2a32baf0c1cc416fea8e82dc42075d6f50dd8d41d012103cd0f56c49fb6df012d0b1720a0b9671027671cbcc32b772a5a14154e3335b5500247304402201e77cec5bb20f93084c725aae9be1ab9edc642d18a9c47bb8d5e6b9525cdb2ad022079dfa35118ece54828d0cba0d3df3638ceca8225297496b4906b912d6c4591920121029b60e5b5ed7b3ff42c19b2e67e3f87a6dfeebb9a7c199e469c85ddaed731149602483045022100989b10227ca09ff5c6b2fe7b3faec0dfcf9079196ddf805155c6aab49bba118002205973807c4240672ce910bca9db36622c9ac00f8d733021209e31f305accee34701210223e258361a5cf98bf4ffafed508da93d00f5d25a128fa037cb6679fd24e6952f02483045022100faf4a7f9712d1ba44aad532bc45ea5b547394bd852de5a9d4d8fd63c8931be1e0220447ce50dfe36169507e70d460ada06cdd932b25fa5316d2705c154e877043a50012103558ade9e713ef4975a9279e88a521a56631702d9b70cec44f59916d3cd3d7e790248304502210086371f4374bf436c20e3975e4e1fb3f7a93bf3c127cd80e00a3b75856c8e1b4702201e59be74debefdea888e2d011957d9ed6c7821b830f4b516596fa6f7e4d9901e012102824d9399d06bc1752e3078fdd4ed38042247a1a8fce454ea74d324d3eea904670247304402201ac2c5c230d3ab640168e867b58353522b6f9cceb42aa73d7b777a73b1dbcb1b022054e7c199d7eff0c3612838b24cc3f6e3b805a2e42a7d88129df9fe261d8bf4920121027366e83f0c18dbfb0fa9b75de1cfe740bee33f48afa08e112affa61edfa510e202473044022024358dff81c02a970f2f900f377120b6f272c2e752aefc7cc558c5f0a545903302202038e106882c9f2737b1abd705808e88f5ff9151b601aa7a5617dc5bb02ca93e0121021d94cae20dbe670b2872a5892b3f446a69a6d15068f8ce3275782fa1c174dc2302483045022100cab76880fc02ffb7d38b9be9ae9f874075f5a5498b4868de908d782df9b6ac7202201c812c7fd4b5a2d7a7273affe3121a3a7cbb0b082dd2179d6d38d72c4b852d0d012103547c44106b1e082243d4e6971c7239bcaa066c3b30fc7cef0991f035b3011b4d02483045022100cb81214f2280f5e142da316fc7cf62c5197a9a0258a2a641924a906240033eb902202c8c0840e550fdc5ce17315b570d1333017a183969a83d2ab88c89c8aadf02480121029b068ffed444f8c30fcea8b56ef463c9505766309033c96f9069ce37e48fa02b0247304402201d31c0e389a3732143029808ecf38db878c9faceadec6eda6ecd4877d772fa8f0220618278fa99906b64d466eba58d60ff61253b410ba9d554a8fed569b12baa646c01210307687c488061baa1ab5aaa3c762b4dc6805e7ffc3cde864c186b8e61da5a32560247304402207853154c9866c487671cb3e8a1716311a793ae8bbbb3ba52c021fc8cea86bd8a02206adbcfc6b69171ccfc3e528cf1ffd882a37d443c230e2d9c4a6ab976eaa43242012102e4d683505165769dce2079f724061d27bfc88c07e7f7876e43ff231aed88dc110248304502210088892ec6503063857e67843d079b5d7ba4cbb2e62d553262d946264759dfd63402205be613b82cbc5aeac8ab6570405a63bbf069225c48dd7b84bb2575f8e1d7eefb01210382f4cecdef8a658a0a9c530ec950ad9501423ce3194cbf92308b753d070cfdee02483045022100b854d0b82c0741d3b38cfd94a42b32d479a366c8e80f408724cd47e2b0b10a0002207e5fb034abe6cccfc2336d21090c14e5c68471353def9ef1b1d23f5e4d7b4bf1012102e3e010f899cf94db7381d29463a5d5657ca330c11dedd2f31a6fa77b34a2ce0302483045022100bebfbe61e0c0cb6641d9d0412d8401b52e5ed983de8dc65706f750914f3ab8ee02202fcbc88e63eaf61cf070560bbf39baf3b515cadcf8339f3716fa6ad8f2f9cbeb0121029dc29ca6e51784653a3dd7b31369d8e006aefe3cf5f374bf88ef9cc070b364ff0247304402201ffd678e0be292eb48c5ec5f4146f96b16df742acbc87dedb8037910a3629bed02201215c0673fe1a9e30fff74660649df561378125f9ea7f12458734427562c7341012103d4f065b9860a0b2803278cbb7b35c267cc5b19b180640c96d11078879bf82c3e02483045022100ef4b3d841bc14bb6eb1ef8f1544c8bfb894135bf8f5be7c0b9d3880d00d43b64022040375bad523ae4546d21f8355fad06ebfd7b8bad48dd70db7f31ff6f5b73759401210301e1fd9f94c61655848cc07d6406a870b2d9e9ebc647b694c8183e7813381ca602473044022038b3e627db843fa5675a87bde1c2d6759fbbb991e4c174d7b171bb5175df5748022067929aa86b4da005831f2e9d8df24e8ba1a809814578dda469f0a015b18e6210012102ad22e71e43862dd1c49803e63f482f250a8da0503cbc767ba4fb49a04a2960aa02483045022100d14658f19d7d7c70d231232a5f6cdcc143d0826575b9c7b154511a93d285205302205f65b45570f67cf5adf99a3d032d368817f0425fc803e888a308506be75c84c7012103ce043d04be5a0004600e25e0ad0a82d353e1d6e8846046ea63cec75b44a6fa1d02483045022100cee9f846725639c641c46d40e1b19e2ef140fd9959185db5eb020b4bbf3b2fc1022045e27d9ef046d29725458281137eee9849114be9cb61d5484589e89896f76aab0121036e1bd4307e1790da06935391f2561f4e2b0f711fbd7f0f9f5ecb81246283f5ba02483045022100c5ade26c59d19e804ca0f455e203d2eef33c9ff89e49a189333a67899c1613920220627ccfcf0cc782aadb86ad140f4d27ddefe72ff073bea2e4c88e498848f72505012102a201b65f20e3ebbe76107ba5e5f8b9ac40c2a15a53460cb78b70f71e48ef90e402473044022063abcce594b0a2c0dc64349bf0e2593f535a7d48f496be8cc5f4ff17df1eb0fd02204bd468ec8273e3dff3d4bba2b33861bdc5c7a6f2b0035a6210576597cd810835012102ee8de5b7419a13f3697bfedf4aa9e4dc967d29f5e0d05b0ba05a2cbe714bd22b02473044022035130d0d11d97040934242f110f2c94eb8489880ebcc910dc3dd4b3a1608548102206c2584bcdce0291721aab6fa8fd110e2988a3085869c15961c902afc7b260b87012102524f238001138570fa251e5229152340918082aeba6155d0a7faac4bd837af0f0247304402201f893033e02cf53b10bbfec2fa6bc41b42e75cbf1e06f4d8cdd386e65228c6fc0220081327ad99dddc4939be2758dbac8b4c97547b72d47120705e82d11a80bef8f60121024dcc80dcba82b22676412a09278dc71bfe84c438aff428524822d91565382db402483045022100ac1fceb730de0612c6e0fce1ca1b09f8eea4e165215cf8416c4fc15d5a9afc9a0220446198927ff912fa675ba18b825f0e9e81594c1cfb3620bd45f50caa5acc65f3012103146b466d60284b04b21ab59f90a16598d771d05203b6b3f2db8817017c4bd4d7024730440220531e76c9345e1056139dab0c0a99534e2ee1848aaceb10023338a42da6ae90a6022056eb46386b936b47d8d86ba2a01e586a59fbeeb095f58b65b9289980ddd8b863012102ba38b5a0889b45ddfe5db7c4c85abc32a27fdd54fbf2f15c70f75df693384efc02483045022100bb32caf2bb451b190c11283059c567dc515a20b226343a19041aad49442712f1022049bc661832508fe0cf3045f8e78c59a96730abc81749885361f3659f6b2cb8420121038df20a308d9f1ae6be6cc67bc7e7c6fc953721894946d53555cb554bb89cbe1602473044022020859f3c1088425bebda3e76c1d152c6c00c10e4939bc69fe818a5c89cbb4c1c022022bac68716fe1bf231d9845e5d337117f658571b9954950731c4dc7a85e97945012103abb0b8564d37b319f3e0279567138dd25ce737556bd6b89712896325aa4268e502483045022100fb776ae450c254df9f1838ed58ab1119d90162b5354f5049eb61445f7c0415fa022001f45d4f2b5b55bbfa6ed2c18dfdcf3ca85773852272905d055233da82ec105701210273a5446e873ed83223a075fe7aefedce9fe6930f0366b1eade8c16b481151c0e0002483045022100ae269dfc19ec673d01c246d150294922e079607813edd550e7ffb1084a26dd36022039494f7a89bba6f996df4aefe32dbf4d272b0f11234ffa67f0c8b06a8e977aba0121026d46d2a2246cde6c0e187b53fbabcbd1b927ad24f9b1cea3498f4377356c893102483045022100897935a00823595c5a70ca22130c20995516754ba4af149463d506655bffb6f8022010bf692d9c351d169fe91ddfeb937e5e035f701e04d40aae7887e47c13ce94640121034edfaf50a0fb90bee886a531212e30476b2b6d2eeb9ec27dee972b3b08896757024830450221008aefd8ab485e334966f1f7595f06b8ac061a218714ad609d83a87529459d249e02200e99e749ab6cb7d930f44e569744276745d0163c39c57f1afa393ee04fba259001210319b3ab4152dbf2bbc153750ce22090bc493357dabb9ac6bccc6fb6978dfd236202483045022100a084aabca16e98973a7ed9fdbb0bb83a59467f86be895ddd2735e5fe4b3512c20220142f9708465a36b8d869ae107b2be37379e8268bbc3792ffa9373a3f3e191988012102eebb6856ed636c080f1597a37e37e774b5587222db8a68958d9d77394b95591102483045022100cce3af61c0fef4ced6d0ce193234d2ddaef0045d0bca4bfa6f291587d34eb08e02207bea30996d24ca459b2887e6beb816cf52732b4cce239973abb03c288e7f80cf0121028fe233b7f4dfca0783929df707d08c6cc9eb625bb07b33038963c4113346bc9702483045022100bfec49447440b044708a73076dad7d7cf4fb3f602b6e8f5a35354940efd1c14202205f5258f828200dba2233843a097b7f72cb0723a5cda22ab9a2ed9d0cc1a2f0c70121023c14a4b7940412c00b5b9edc246e829f42731a2fd36e7fc5194c19423d8a26e50247304402206b19c7b917cc4c7a78fe81619cf429367b7d61701ae92620a4872e29a0176c4902203d9a87d455d8f9ea2b8b2aa7d3592ffe28cf33e4b8b4c0ed75e2b8b567c53d6c012102e9f5e72498b4f1e946daeb0557cac23ee7e63b925593b8495437179c428b2acf0000000002000000000101174402e586524784791e2f9154ac45ea04038c67dcda61ba4b07458c3d43e2c107000000171600143eca84354f4e3d23f786cf6550b2f6bc02d15e5affffffff01580005000000000017a9149a18a95c85a62c04c4e9fc9d8c1c7f35e3c01bf3870247304402203641baac3bc2768534cc07ceb83208f4eeb59538f5b6f73be89417b4955e552402204b161c21e32dbd32a7540dd88c548c7a7bc18b35871843b9d5423ff95ebd1cb70121029d6cc641246780aa770effb75ed77e8f4ca718f5420d2b0b179c6a6afccc13840000000002000000000101a795a0b601134458436cfc272cc21a2181f8b2e26c234979e1c208952e06a6a70100000000fdffffff020094357700000000160014f48746721f7d1cc1f180612a47a4fc2eeb6ba3cef096b8480400000016001449af066b0b0375ce34b15b011658e428535c6de10247304402200bc88edce6be55320f220720c9251f0de25fddedba4ae8d548e59991554e134f02206ce0e7fc9276b31a71cb6feb50665ba81fbf4bc522a5df8a13cae024d51f56c50121025dce4be2d8ff91180ea0fb6fc40a289e96d34d3033c97b78ed296e0d3d7aacb049a00a0002000000000101add1e8709f9832ca0c3c5443057fadd7e3ad8700dddc6cb1388d7b5563664ee70100000000fdffffff0200ca9a3b00000000160014b0cce493a5eef22536ee33c6a7aad8476e50bc9ad0daec3e01000000160014187134581848019b731a4801cb82556764f790280247304402205e938156353ad1deeb29455ef3bf3d98a9d1d33e3c6cd52dae43367ab2ca6baf022053b75a479519ae333b5dc8414c84412226593a367c693e3cce809d37a55472820121038208d07647228544820bbddbca3449fea5cceee4cde8d590d5931c47888af6f149a00a0001000000015921f0889804fb8ddb15db8b151e0fec6d1c8c7670b367b446c443ce66189bf4000000006a473044022030455a16f1f59b400e6aa6fc055012242375a3ad6a9733e8d48a07da659ba64d022074a321d2ddf7e9d456686597d1952d10ded913293905a259346310863b54062701210397c3940595cb6d810ea8b7cbae05147859e1f5643fcde9d1eb885422b4a9c483ffffffff0220aa44000000000017a91451728b108a484eec55d88f23838c999fafc9247787927b7d00000000001976a91400a40acd35db62ec1ac17dc8cbe5ba3dd86aa5bd88ac000000000200000001162b1f820845ac1768aa762181c3a10d6174f7c4ed5bfb0747334e750ea99ec5020000006a473044022002a76197405518a7398fb461126e0cc1503cbac9c618b591aed8d1e74c3ba43402204cb51e953a8420737214392c4d039e7f11fc305ffc114d8e615f43e32a707efe012102e764d96dbab0d80c346e0bd06115eadd8d37741072159130ad7885b9aec57129ffffffff029c8a0d00000000001976a914529633b57971e4a2d0bf303c21f3340f176153a488acb9a95000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000000101dba336de11d633560835fdeab133ae8953a4a7985d619fa96194c8d4d8ed6b430100000000fdffffff0240420f000000000017a914b53558f83198b804344239435c0e2947a7057b4587dc371900000000001600144c24a635dd99fede61b873f35146f1d600637f6b0247304402204c9a16523d3cea554e2809c103e7d1f8542354b353cbc38578b1f69dfda434650220538644875002b17a36ee80dd61483a19a7bce6783e35dd176300cdd31234145f0121036cb6207f6ebf88c6e4030ad17655f352570b744ba0109237967283a5bc06f42049a00a000200000001735174e3b23f4f187fc093156678addd4e33c573bc500f2fd612df59ae99fc82070000006a47304402206c7717782b1a200ab0832e980de0049302d257fd30673ad2d352f617f6815109022032ddbc926e3ba4d6ef53ade9c8215296f880dd1103fac2448234a8faeff4000101210254d068ad1c7d8a9eeaf02c380f8b146ec26de374c5257101d63f997222f2b577fdffffff01448f980000000000160014cdeab3c02b1b4323ff18bd3df075953eb0f0aca029a00a00020000000184e40d1ab46321ee7ea791d5343fd1689ab2ac7fa4c12a8aec3a815f20c6b78c010000006a473044022059601d6f6c3da7c0d24aee187f460614936ee8895e9e8ef3aca173690723b28c02206f2388e23db0b0dd2af599aed64c10e4d6889889d935466dbcb18f0129939eff0121037559d8cf70c088f30fd51b80cb2e68117fd96610f74a6dca04dce889b99d154efdffffff02d4380100000000001976a914a0cb2d86d3d0b43d814a73e07ef4b45934e3109288ac9bd7060000000000160014d3bc619103d23b70086f22797ebed4a620289fb949a00a0002000000000105e0968e2b80cb7e486c3cee535f5225e220225c89cd8817e73123cc5212dee1170100000000fdffffff99be888ad7626941e606b36cb4d098a000a3e2ed53663bb3d45aebabe427c14b0000000000fdffffff4e07dc1ca6b2930f3867c74d615744b6589c753a681eac969e948ca9a839b8b10100000000fdffffffbded886fac673c9854ecfb0810fb0f3de467c99b2ff60c80ffd885185d809ac50000000000fdfffffffbc3a64b7de42c55f1fdd6f25089731261eb97b011e4ffa7d8f65ded0d66f8c80100000000fdffffff0189a2b4010000000017a914c721021f811081926ae596f7a1e451d4a6ea5a20870247304402201a6f1670a7297d3fa562a4c08b43408d7b8a1ff719fb84d27184cca2f6c0fda7022012aa83a2ac18b6168022f2001e3ef9ef2aa7762f5c3b9884b704d960245839030121023879dd9757ac57226065409cc07ecb5d3434d25092b1e146e492a768a100405c02473044022039c0eac7ccb9187987fdec6d083b09b7ca26106b5d3f5c06260ba384d118889f02201fe9d6f3fc02501cdaafbb291e82f9fb9304bb72a55becd6d414825ee1c68b1e012103846fb63ef89786658e701d3056fc685a6024ed42103290428540c33e541436f1024730440220500601396bd1697c01440bc5cf6bb2217abfcaeaae40190f4e4d138024a9834702206a83289710cb968debde516c3f0aad8ab8b5ca9081e9f294f8e8629766d7a3d601210383495348ac5724f0079b271ceeb10166be8d13034009fdcdcb7e0ec9bed0a0d50247304402203d4c34b196769f89369953a7220de583debf571b0524200a2d49b04908da73f002207a71d25194b36202a4a66dd8abaedd311d3ce4feaac5967e0f37742eaf05403201210260c44f4d0f3f7818b4b47c5d496ac30e5f77cb3f064487a7e6ab8283e0dee1a302473044022010c454115bb1ea1e966e94c40f8c03b121c599736a775a357da64b4705fe5a85022071722aa41591ed58127e36e3b926f37175549402bb5dbee07e278e278fb211cf01210255e387ca436fbdd56d8d9706f6e1715c12613541f6318b6ab7300616419df54549a00a0002000000000101f2b2348f4bf3916624d4789413d383df0fdea7b00ad73dc5377a1c1761d0ec590000000000feffffff030000000000000000166a14266d3e72f4a2de7513741f4c2eaf238773b47b83809698000000000022002095eed2be2413e516296c4fa919a731766605dd558cba3ec192e7aa4a22acc192289267010000000016001424a307d71640ff2bd745bd890f7b3460dae9f48102473044022048be1e28db1ba4dd77f8468a83ddf0d685af172b3a025cf047ef73e342c3723802204d02fa3f23144b876f8039292befaea257d9e353cb0ee88fb4a4c4ab7d806d2b012103f11510bc4e60f13603e976d1c2f4cbc3be88dfc14cb7acf3550ccd74939891f449a00a0001000000000101f9baf3220767e9a24bc2a7e610d7b1f04b769c64eda615c5412ac58151d0d9e10100000000ffffffff0230a40d0000000000160014b9ff4f0f938f6d559ee39ee5807f2865268b47842f0a0500000000001976a91417b38230e22253b56c56eec51d222e0203ecd6c588ac02463043021f5c754bd4c382b69515c0b1bb13da0133e6e2a9083540eddbc69797453677ae02207cc34f0f35970727f8a0a54a9dea14461fcb7a600b0f93b970e18603fc272031012102895554bb50c450b0183138119e9db32b19cdb5dac873f2e81fb87cf990b2d2780000000001000000000102b76cbdd276ca766e13ec8acc8d5466785a5f08f6b66a9f01a5d8935f24d31ac10100000000fffffffffd6a43704c18c7f8b682bf7600ee5abb0e839ac0d6a6ba9248a09dd8511e12a7010000006a47304402200b28b46278a1414ca7ef65b7b21c5c13f5194231c82f0f5e12e6d0299ea33b61022075ab0590f2aa3f1855f83c56f1e7cfc478879f0e8313827296e8d8d1351c62ab0121029b62e00d20571a704b3c8d47713e96a023c1f68f6ded4d89126b750f223f92dfffffffff02685c0300000000001600142178a815d5f29cb7c1194a02c96e22fb8ed1529ec4230400000000001600145f79912fcdf12e9834e3f9828115a91c192ed25902473044022002979b9c82ea08a8d59577f0ecfd68fd04ddb659571451938b6a3e3b39d1c810022005a2069de538363e667d1784035c8e599c80bfc546026ce3c71fd87e1c793b250121038cf3fdc261fe72f39ea3aa4471196d8faff13be64403d3dc6f34a5da7e60c1e10000000000020000000001037c9b50054705cd68c9e00510200ede72a4f7257fa4b3fa0e25018daac3dafa780100000000ffffffff020b22281b184b8fadadbd7d1dd4e7498ee628663244331055fa4566765d75a40000000000ffffffff373de55d486b2e5df777dcd77015688f124461cb904dc03c3866bf0d9ec7911d0100000000ffffffff02a241090000000000160014678e5a88dfb63e78d6318f60cf1ada4f33ef9f1272250000000000001600147190d232b65b43e7876d5f045833871e8c1ae8b7024830450221009d6ddf66185eb69bed525600938bc26d6dee9924392c17b5856b3937859cc6aa022051713daee25bf6659a02d5b35ae5e09292e6b246e04c3e5058090b4f384c677d0121027066e4165179bc668e2a5097281ad2dbf25e979f9eac24638071c32bccb851e60247304402203cbece19a8cc1d87477f90c11bb88f236c93418b0f8faecabc9127fe6bf759410220788ee2439d9fc2d1ef307e21ed3f3aefb49dab3348f34127652649b3a06d64aa012103a0fbace8239a373e2d114f56b91b0e9c51ac0d9f89092168c47bdb48e3cb342a02483045022100b82ce38d17b07b0bbc3a97a766c52b5c346e11e95dadb7f0af9dc4ef49877e5f02200b5dc2a9f6de7f8de2b88217f156ab227cd7ec2ff4eacfeebd4eb33125b1a1e70121024dce10dccf64bcc22df79c4bb2b569ee4241e4209cba0d7d81dd8cba8465ad4d0000000002000000000101eaa931a27f2b421cde98a6bb3e5bb43d61d6de25b3c65827bd6b3137cb7cd4aa0a00000000fdffffff024f34020000000000160014f76442a1d493522f4d3543f3a41b7f834cddb8c8395f02000000000017a9140e0f14c4ee140eb19aae6aaad695f7502e213d2e8702473044022038734b88f84af0956814ae6107fe6f4bc66c0d7616178ca4b7f7d90cfe86981f02203767b805a783136f1b4247c5ce49c55797c6f60a30b8c1415e728f1a85c0f56701210359b6b428d99905b7e7b5b6478ede490334ed84d8282e54969b211734fc69b3a02fa00a0002000000000101124b93a8139a67f4b55d748b90e4f8cf4d3dba2094845bbe9de3ae60da9d4a880100000000fdffffff02645e01000000000017a91459c12370ffe4470e648fd928ae814261c189d2f1878b02520000000000160014fc6f319937aaaeca55801f8990770755b4e899c402473044022058f70e7cccb8ca9fcfc848bef10cf7553b018d4af7d58d525b0420ab1a0db40c022070f38bf3f924738d1e3aa420cb1015940f85880866758fe158dbde52dcc7368a012102b8a75f13d3275237f9b55bf5067bf102538a6de232ca3d779ec20d10326592a749a00a0002000000000101b921ff224f6b375525d5b21952eca3665548103385c18901722c8eb8a3a3c4870e00000000fdffffff02c46f1500000000001976a91499517977345cee504ac930d9116aa67ebba042d088ac2d195b00000000001600146c16d699bec113ad847a59c070ffc0e9d47d1da702473044022040b57dfa53c1ef8d5ea9e15080552a66b099ba4bf794f697048a3562b01a967002207615a61af90f2e59cc3a2b436868b39ab36e8f719241ca3872cb64269db68692012103f29a26e8570b1f9926a929179ceff4512c9f0278e2d0882d26b679b67d0149a449a00a000200000000010149887fdaa530387f51acd1bb69f77000630f0cf4a82a76163304c75a05ebbc680000000000fdffffff02c46f1500000000001976a91499517977345cee504ac930d9116aa67ebba042d088ac00cc2200000000001600141085677692a7cc4be9206b85b24d13927986f4230247304402201088e72c2d0d69ad6ff934a13af31b490b6b1449f9657d27ecf1a51d9d0976a402204bedd9eda90049433a4194d257598ca22f8c30cd0592d32aa425fceef4a9252601210258c53414cdbb1792e29528afab60ad62d6964f33a717fe2d6514eb2fe771edd549a00a0002000000000101ef02a666e3d73cd496e5087b029cbaa3ce8261f024936a7e911d8d46197f4c5a0100000000ffffffff02a0860100000000001976a9140136cff36184023bbbb224c640d5350e53c8d59088ac95f64800000000001600147227058c37d991c7d8b4249dabc91aec1a7c52ef024730440220411aea2c23d813c8b9b4770418c48d920f98c25127f432b9486644d338c5e21f02201780ffd06a5e335885719121ebd954d7acdf5588ed61837236685d64df15a6910121023a3cfd124e074289871c3bc8349fa68de01d2210a6bc57296fe505ae97bb6124000000000100000000010bd3f90fb1eeb1b1746f8c9987529521d160c00bc3b81ab35ef1fbb9e909d0070a010000006b4830450221009815941f5681fc8b33f393a408461ceb7bab170776a3cacd8f9f74bf05d86ad302200de1085b4ecb82ec468c619b0d9df75acce8d4f4adc6f9e62d06a909cd5293a301210271e89d4d440eea3f02eaaf97728f8830ad90ce2f1ac0c99650de90c09a6618b8ffffffff09ae0b3d9648caaf33534941d1917ef4c73cd11fc0a41ec0212f821b4c83a62f01000000171600142d2f3f610952ace376251d1fe144ce3125ee27c1ffffffff18f17f1ce4de34dd6e01e0b0301717fe86b5eedbe2406545f61547a2edbec7bb01000000171600144bbd0203da96ce23dfb4cc3204d4df020a1c20d1ffffffff4c0e86053c05e51d72899ad0940a675038deb26c8a0b152fb2d798a8777b573801000000171600145a20c5a63e6a4805da25d19fa879427c495afe13ffffffffc6dc510d3b7dbd542a144c7114419d38c15a63f7a2d00b22b443abd0808f3aae000000006b483045022100c3dfcd5ec2d399f002c6b60ca16b3959e0f7145abcfc822e987671603343c853022023f968200ef0a7f612b5f65c3e206307ed055f74afbba1d1c232bb578af753ba012102a6dcfc46187ffd67517279bde86173e9e03a62414e0db96aaa23577793d69388ffffffff020d320819c3b57f6f686026e65ab1c890813ed35441f575c1e76bcdabed0c66000000006a473044022074c31181279dc609c88b76cca41cb4174d70d2d41dc07089061300941595f63102202abb783e06a664a8d1cf6f1ed3ab7132902c363d7d79890695d1d46623c1a9f6012103176e1833d7b7f254ffb0864857715bb4d76905467927be3e06526788b94e13dfffffffff23b3d4c0795d79f8ebfda511d73d89c4835a4dd874243395faa7ba6e0b3c14260100000017160014eeb130eb92a67a8b1faeb5c622ef8feedc7d1fdaffffffffcced15c89e6c7d358dd4de594365fa2c87e76eccb565135c4c91c69b345f9bfa000000006b483045022100aa6982f0d0cd321c1098d6b8f26d87f439a802673613dec04eee7b971ac2f6bd022028ed157c6136241f1ac7a56410db3cc7ed0f92b87270a71028bbc9963374f1b50121030c1dc817f058f9bab3e69d286132e44d40f2f11895ad66fe981cdc58bb0337a4ffffffff2f83b0e09da3387d09852d569d323f8d89465179c84d30bdb8cf07fd1734fc31010000006a47304402201d3807a4cdf63e4dddec8ff04e33abc0e866b9cf09b907d0c881fe48318bc9ee0220712fb87cb8bf24ee7056e0e58fd56aa72eb46984df03c217e7776c37a2631fc4012103890887cf6e2be7be9bc94fddbeba2a9d7777a3bcf65a603330a6d00f9bcd7c52ffffffff51a2b4880c8fb10d8bab5e9ae73521b219818436c513c843f7f3cf3f65dc6df0000000006b483045022100b62b49c5ad5a56274f0ef292ba68206dfffe5989b242f73db6d4b04179f62b900220184c2be1dbae5a8e79d4ac275a9ec6a6af23f52fa617e06dfa18702c8f0e326d012103b7c322e5b7d45599ad015cd8445ee8a432473c8cee6eb41ded14433900b93261ffffffff64af78e5c81ea38e06ea2bfaa17a336972492fa320248fb23a49279fde7d4731000000006a47304402205047550221eb8120a4fddb2950279391d3242fcc68bc1ab9d7df3d83aa8fee9502201de3dfc8a4eb6ac4b72f424e7fea073e93fb4c9f21922f9c7a5b1c9622187f0b012102fc98c6e744d062425f4895ac7d05bcaee88fec91d31e69656cf1284d4993c2ddffffffff01a90ff805000000001976a9149c33594f5761f636d11472d8a0c04651c325246088ac0002483045022100d8b62eabe545a96e225962df5e8d3d8791eebddfd8c51be9fd0891f58822288e022035216798dc0a4c53aaea95b6f026491ddf8030e41d3a12dde55661606912e3f60121027d2ec6289f268aaac0c1dbe17938c8f3859b1aa8e7f8e0243e2a5fadce71afe90247304402206a51b04d11e830f04d8513a1ebbcac27f8c1b96d6a58cdaae97802d9577bc3e202201c498665304804e1c343170f9a38f2336cf37682d92f86ec62c555b052ddeee4012103e6b628388b2a36ec93a4d50dc127b22f557bf069a21f7a34a4416091f61e347b0247304402203bc4bb66aa826aafa08f6fa52458ff0e8793a4ca08056670d836a4256c4009bc0220373eab51c3ed8eab1cb8ecb07145d7d49bd3613d8da2cec72d5aa1331d716ab0012102e4acb7a9a2b2cb4b95542cbe306b5625a7f0b820b9fe7d88ecdcc130d961b247000002473044022041460249dfbede79154e08ade6e51998f0ac706569fab116a6bfd389abc32b4702206380b9799c6d29021d11491e9554626c236bb7647f56c0228dbf0d69e5896f53012102fbb1e9d56cda3509fc776e69085dec190ef293df757fc39799f713858155a3d200000000000000000200000001dee2220ed24426560182e29e03539c8df68e9067981009ca70b65f38d221308508000000fdfd000047304402203b6404a557e0044e6bc8af56b29e1519ecc4aa544647e85131ca5e5229f4a39c0220366dd9a24c8cc36c07b89a234bb8017ea2854771dcd5aa8703766bcf9af1303f01483045022100a2a6a55181994b6266b64973d422fad8d8ea93f5aaf733af318ffb45e52a3d6802204dce5d6f38fb094f827f4ce8d1e609951cdfb3b0b0fc7fd195ca19d68ef2ffd5014c69522102cd0012eb8729c17d3ab676725dd6992d027ce999bfa19798ae2badeb481b17092102fef23f1d5d9122d7132db56913b8e076432261085e086e594f9d76e8302225512103ea7689913fc3125eedf4944e982a7fc0012ef1616994b1274a37978ed49ce6ba53aeffffffff07df541b00000000001976a9146dec64fec7ffab045c7a92b66ae52c782ba705c488ac050c3800000000001976a9144289cd63f2f59f71f757c0e0bd33ca916566a1d488acd0ed2d00000000001976a91461229b8e1d1d5d0182458db6dc296298173d7f4088acab501b00000000001976a914fd11ec95021ff60e32cfad7f71bbb9dce6044c3288acf3b81b00000000001976a914a383069c45ad6dc50604f8720236c4dc78fce36188ac270e0800000000001976a91456300a7366f8904d3bd3a5a8231ea868dcfecbad88acf553411a0000000017a914e0756020a29969b3903d07ed08b28dde9c05166a870000000002000000000101efde3ce7e5ea5de60bf0ad5ca4525b7187cac700a8d48e31ee24bac6a5d88a6b0000000000ffffffff021eaf01000000000017a91403d7d8b9f54a4fe48642771ce71288078466e21b87c69a900000000000160014c371284e3cec074cebb99c710cc9e941e380d87f02473044022063fef1b297721daa92fa326bdf4e5c3f751aae5165b1989b1698b4088603b97902203de55ddf415d57f4a6bca5f3c9158e0a3a5a4f7fa60808d40ce9eb73b5c26970012103cef1ba12d4a958e6fa3d3d232c89a3c5034851bbe40d085de0c64434e1409a820000000002000000000101ffc406a4343784bf58d7434949c3ca1ca1a89503d3068e852a0fcf116e6eae200100000000ffffffff02d7ae01000000000017a914162a9dcc50bb0bb7ad2981c29fcb4f4bb169ac0187cae68e000000000016001422fa5ec5d9ab435512f5608ee005d1b015bb690302473044022057703a664adbeed95ff679da5720c7df423c578f749014b0b075460fdebfabb302200b41448481f8d610a3579a83e65981b2209eeeddf5ff9bd22cedc2b51be901c7012103dbc090f302d26499fb51baf50bc15f4bf6d66e267cd47941ad19919b3825727900000000020000000001025267baed8319ff41020f74a4583170583bd4a53bf1311ff99e14a55b180d728b0100000000ffffffffeec43f416d420381913885056ec17b6bb7bac5e4267bbab4c53f700bdf10d7ce0100000000ffffffff0283c00300000000001600146b63137e9f5f67b8472bfa181129ab9e0215e481b3e9b100000000001976a914355511af0913f41f674ab9dd7baea99f06a3362188ac0247304402204dd687e72acc96498122b8a2abd6a309901f624be0f8b9c2a5994bf0bc3b364f02203f4fd2a489b75dab44b5665faed2b4bb196bb17caba88f33e8a2b3e5c908f386012102ef20a4f48ea8263aec6cf49b991030c500e9c363f4238463fa8a24cfee2fe1bf02483045022100d0b0b5ad207710f45b4f0556cff2fbd2af173ef79ceee61dd4e8cab809f0901102206676c3421d733e6513f77c204387dd94ce994cb2d2265eaa7422b522b94d432001210392ffc3bb7244ca7dba96fabd39c362b6440b8072b24dc1349d729dae11a38869000000000100000000010111563533de3e39ea5dadf40bb27984893921156fee6b1758eb1b4cc46208f38c1200000017160014f3ad8b068eb1ef25b4369de29a9de6593d189e9cffffffff01f4d902000000000017a914d08dfdb51243c80b104296482ea20f61253656258702483045022100eda15948dc4991cab61197bd55a5d00469cc78ee9e5919ca55852f4f868cfca302205f22e5515d351210706c6c5f1a875b13aad5a1d5216e4c324ad80470b24c0614012102dfd84760676febcae6d31b3ea84cc98b8fc8d60e97863530f542a4ad6f707aa30000000002000000000104996ffe2ff7902e6a014fbccd763ffad81abeac2f7fd347e3f89a00984ff76a090600000000fdffffff092e8c65bca6bd959998ed42050654049d7a624e1a5c36403ca3e0142f439e510200000000fdffffffa730b913e7c67d0e3d3cdf2d373029f6ce7fceb6e7655fb411bd4eb6486148660600000000fdffffff957e46c276282b8b149ddc6fdb89a0a1caa83f7ff4247b05dacf829ca5ab2cf71300000000fdffffff01f843120000000000160014e34f131b66a0a1764a67fc8553911c58f8fb7f02024730440220094bebb52ecaf1508d1810ce27a21f382bb08ba6f1f74c1510d01e5d163e2a1902205d130b3e146980d42d92cef525791eec0c955000e05aca8960cac57bda8716d80121029081b5d4bc874e383e18263851e4aaf655963b2f318d1fff3cc97eaacd672d6602473044022049dc0ce5dcd42793856619e399d39efd5bd533176e014508c3fff8d2680692f702203ab82d8d49ec8bd4a735392066e83f8c01d8958772c02c4af669bcbb4153a86b012102a09b9e441411f8fee0a4634f02a4b7632f3177778ef724e6e91523d3adbfd9bc02473044022063dc8f08d1133d7a9ff7ce82d2427f556808873bfbf4b804a691ebebd45c5c0c022061fe44fcecf46aa998b64e05f48672426b273c5b22ee950ab98b2635c15396f1012102a9e113b564976836068c3f7a2558d300f9476942a570e635b1bbe6ef9091dcae02473044022014046686a12f4c34095da6e428abfb1357c58dec41bdeb6ad88ad4e9c43c1e7f022039e14a947237c18268984fb53859af50fc60595135e94f95183dab986b25ea8101210394bcf8ab0f223fa47170bda29bee9d461d4fa5ac48708616410345ad54bde57549a00a0002000000018fa56e96c0c320b7e242cb3073e63957dec85cb06dbfba5675787efe740e2ab9010000006a473044022019d6911d29a1729279accdda3d39e38c0775b533620f49adc6fe02bd7bd337f302200c891e52d9fbf3acfb2f0715c936b65ac9f048d94e0b33dee1eef706f7985a38012102ddf13e254e7cc5b42a3b323582082d6c9022ced77f8535682874d427827651d4ffffffff028c5503000000000017a91437ef014f168452d5e5198285695a8fd1f8ccda3e871db10800000000001976a914d927fdc342415211bb4aaa7864e88630e5b2f5a488ac0000000002000000000101f6a47aa8c02ee418e469e9cddbb435cc345b8d52ac16bd7cad21d77d885933500100000000fdffffff01f08e03000000000017a914b3ceeb93d1ec12571e9154f76a585d31998fce248702483045022100e675efad3b2003998e38adfb31f825bf3df941364655e1b7f03969810bb7a99802200484fce049324bdc5fbc791cd4cf8ecda79efd88de93999aa29ebe9695e44181012103ca19372fcce5f97d350cdb8cb6d12a3dc7d615126eff29d61ca642bcd241d65a0000000002000000000101d3281d9e0c4de3b3aac24a4e2cdc285c5b2b1913e855d98869273332d8b8af980200000000fdffffff0428576700000000001600147168f8b9dbdaa2520acdca77a83281090ec088ba440404000000000017a914032b8cba037077bbd910905656658411390934f9871211100000000000160014f278b31dda27c46a7bea371369bb3eeebacc31cf74290600000000001600145bd4ddc14049d69bd9cf7338d63b25696a329a7e02473044022028ab21afbbf0058ff4dfad3484fe8f52f2eabfc514d6876464dac282646a171c0220704ba441d25f47e908064a4fba2dbd99d1073359e18ddf80b5c278f6ac46e757012102d5d15e22a5cb0ee85a322692b0143c08515a4358681f313e47bd77ab9eedafd60000000002000000000101872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc62000000000ffffffff0264a33800000000001976a9144c23e86f02bd9b158522ea33443a698813f6ec6188ac5f38bd0500000000160014fd5352ecd41c2bac42f8ff3625c81e38fbf0712202483045022100a419b9cb03c4ba194c4bdf7b3664767d1e654cf54a4f4bdb7e990173cc3f02cb022069c7fa0df9d6428d684d3618ed3aabfe03d4eb512d86659ff4a9b400dda2ac97012103295afd667c76a5cff407c60f31e5380af51cb5abc88913b048e3bafe8d7dec320000000002000000000101e15390d16496c591ce1f354347e8d31a3fbd63842902446c9fce3df6f6f62cc10000000000ffffffff02b2bd0000000000001976a914d19b5a24e2c48018c05e93f6a3e43a4025780c1388acf17c03000000000016001449fd8cce8e1c0de074dda02dc5f7b3f309827757024830450221009107ab641dfc3e42a7dff533ca0e93742d39810cd38a722726e9578a8e3bf55f02204d3002ef6284b47d1707b109efde000688cf15bb3d98b592dbc82ac467a59e4f012102008f44850dab998a9fec3b0ecbe2f2121387a2250b528a5e0efe61b99267f877000000000200000000010117640f9f132abff40c5e4b42370b7149e505c0ea2a92335c6109656841ec9fcd0100000000ffffffff0295c20200000000001976a914f2d6f54da78b0810739fcddd64d67b5106c64e9488acddc22100000000001600141446a2238352a19db3d74d1bad1978b873b858ca02483045022100c4ededa9a8bb1551a9c082aad568554346a741722427ba2a171b97bc5d51d7aa022040841eaf733b255b9de6e3029297445aec890d77133073f6a2161be30414f2a3012102dcfe7141d1e107d407201ddd73c52132a09c277983f707f7196fb293476650300000000002000000000101310e9fb1d7c6026d55cbc25cd4d0048ec24d7f237805e2b84e007f49ab2dcbfa0100000000ffffffff021d2b0000000000001976a9149a41ff83ed8656d366685a2bf98315defba6616888ac07790400000000001600146773d766bfec77acf20dac7025577e01bd35bfd702483045022100e5307316b3fcff43dde7121a5b02eca1d629d7c5c038f58d100dce2aad8d9c040220043be11c73fa68e92adfea8f6d1afc9e70d6d7a5460f4379637e53fc226589f901210266298ef0b6d1ebaf93777c8d9634ac0d1da611f090af2cb6554ac36a0c417a1b00000000010000000001016561dfda2953e81877ab873f40d3311effdb173a2771d67d4c53769fa1c9572f0100000017160014ecd8b66660dfcbbafb803f0d0a1fdf1feb3e6d01ffffffff02052e0b010000000017a9145d9299717e5b2125da749fd3f2a6f11d9df4980a87e06735000000000017a914fc8e7ca98dfa3fa201dc8f892a06fb724af4ee73870247304402200b698f4e6f5d75323f2fdb0257371eed61c1758d3f944ba663fb6ea4432d26ce02201b297037cbc57d7a59672df4e4ec9f5069a313470dec640a8dcb4e02b5586c24012103f01ca58e862a759001a54bd02bf83f342782d52dbf0d6869c79642bcc65fda930000000002000000000101eea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be412000000000ffffffff025d050000000000001600148285c85ca4f5a163250279735ab1f5ee572a73c71db824000000000017a9141ed99bd67b071433ef3091ca738c34ac0a75828b870247304402204fdca30b78173dd7ca9b9def887a704ac2dfbcfde7c99f900583536eb9fbec77022054878162274eb7160d3563d5a194f70163467546de3fe81d07164d9232a708260121032d61f5ad5c498c6cfde5ae9194f1e7518a6057c7df7523902f48f7d561e3db6d000000000200000000010178ca601ef9a5b7c9352640e470c8a0c4bf8e37e2db182042b5ca1351f134ac6f0100000000ffffffff02187900000000000017a914b420261fb0531e47cb189996c7f2dc296cae703887a390e40200000000160014f4e2e1acc7eaf3778029043826060942e76979240247304402202ca808cf8a9d2482cc1df659650059c3d50ccfaf822495025c16212523ef300e02203e356ff8ea9e8ffe2b5a4aad2291d6c82acf629d0ad7efc9cb7c463aeb1b9971012102fd754eee01d4ff80a26e3dfe26de1a439883c47434b125ea5c26adc7f676bb130000000001000000012e2ed40671eb9aaad960377a780cd0bb809d66c9357ec511fb2f321a95f0b053190000006a473044022037ebe55acc8d4e9b2707885ac2936046f7a7b1ec7ff5bf68de8ff468c735bfdc02204861a07ee7e330ce48145e1b8b2e96ebe4b3a4eee569420cdfc820fa61179dd901210254d4f8f0c47dd240b7bf63adb8aecca6ffd3a90aa8c76a9714544d2aa2cbc436ffffffff02ab120300000000001976a914d91e010220f3369d9679414fe155732639e579dc88ac023a14000000000016001453108841a9465214664843f021e597c4641341650000000001000000000101797e55f2ac912cf0b77e2d39c2561238987c661e0a577a80406172e4d05118391600000000ffffffff13e2000800000000001976a91413399b84c2297c909891580a1360dd902a68570888ac04510400000000001976a914183f0ddeda6d18ac8ad9ff0feb8e6f1947c34b1d88ac97901000000000001976a9142290f798e67153257f0885fedcaf38081786012788ac63001100000000001976a9147f2866991112179d3673541be55262d528d6927f88acf01b1200000000001976a914b5d1634c437850f7b9b6f9e5101b879dfef62e3488ac873f02000000000017a9140537ab490a7b39d617a832c82f686b45fab6a93b87b4da19000000000017a914237f8c3eada719534e0681f94bd0c2ef55fd883d87df1405000000000017a9144a7f7a52f3cebd338660b3e267b071c4ee52a75287e30704000000000017a914576918c18b3639e62a2c627c8ad81325da2e58638706eb02000000000017a9145dea491543470e8d11544f5d088d2613489097d487176202000000000017a9145e744eb40a11757df80a2e3f87a139770c27dd3b8769d203000000000017a914a114207c66b983bd810ae6fb43d8780c5ea14ea18717c0060000000000160014d5f27463a6b0bdde8039df5a1402a1769c09f60c1eb9000000000000160014ebea252a431fbbd3336d079ede3ed928654d3b28fb68020000000000160014da1b50e94127f67d436aae152ba04bbf9709ebfc2d3a1d00000000001600140c6fd4b5d2385faa56104aa7fbc91354c84daa486ffe08000000000016001483ec36d536dc5ef997fe818a9a07e332988c5546c4963a00000000001600148360ca3e559b0d800042a3b64c671bd9dbfcd91518edc80000000000220020923a51c2b9e736dd6cb8ae55038c4e3908fca4c28c65d345f437e4a4174c57880400473044022061eb77668d51c7f66718d3849760c685f57e76290a90b7ae50fbd6f1590164fb02201138e295df46fadfb4d17ba90ba478718247d8758b1e8c2ffaf87380401f44f70147304402200c67d903c1eca9a9978c7b923ab6ce21838656eec3f40ba2018ed993459279f2022006fdfa61d4049e142ad56d9dd23e6524f8098605443dc121894c44c6d59b620a014752210341fd34442d6361965beea89d4881231bb9aff145446538931009633c326fcd0b21037e714df9945ad16f4c442f1d52283ab8e5189783f77677501e318de86ca4aae752ae0000000002000000000106bbc6bd75d24d61c11a8d0a054b96c384ca97edac2184ffc9b31c887365e9b8013f00000000ffffffff9e8a43f71e99751fe6cdc5a006b3dc5392a0c23fcd164b33b6d4974a6300db261800000000ffffffffb60f8e813edcee3214b5ebf21ee9386a4b6a3d1156ee6d9a222f88a69953b7500f00000000ffffffff66e99a5bfcb054cb1d6892a5aa02deba0990deaa4fde31b82d7cbff267b1a6a11000000000ffffffff909d536626ca5b829ca78bd7fc138ee9f930bcf4f5adf7a68ee49c261cb24cdb1000000000ffffffff5dd3c78776c90e2be5db6e82debe75d7788be0ea98fa6036a6a6cbb942c813f23300000000ffffffff02ebd73e000000000016001432797bd76a71fa347f184f44d9ac66e85408677ebab25701000000001976a914e6f6a2ffdc711fa5f8d2997cd09dc132176ce6df88ac02473044022068c6e2eb48139e1d3a0cf1eebfccfed78e907e06f7dd300fcf6b3a6355dc4de502201ac2c92472b7757721c2f39f0ffe2df5702402553398ff015e290b719cb46fb7012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d6024730440220619f33dbe3db0e20629fcea504f8b7cc5c3201f1671ebb9936442ade1552fcce022041ca88cfcf0ece5c192c0f2fff0a703ca09d1732423381e4de8d5627967284b2012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d602483045022100ec512ab59a49bee1d0c5f407f5f50548e48b20ebbdeb5add9fd33c2615418bdf02201d3622e44068174e84a7a4b7b27cc8e10aa93b4eb71d79b320bf681f017e813d012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d60247304402203cefbd0c851058923be588a79edcc678b9ccd403306fc29c8b86567d7834ce3702204a54750b1439b0f00e55b08989ac50459d713f02f6c5f36e7b55d1b0f6b36921012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d602483045022100e3b92eb58b95cbe36cdafc658400f5d443147486a82926922789db9edb1bc507022002532199964fa50247c8d4c2bf3d84b537fc9a506eefaf0163b6e8fb18bbe0e3012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d602483045022100ffec4c82b228aa068b8765ebb1d2a1ae8879394ae5cf84ef586bd05d9ace88f702204cc48f9456d4a0e140aeb67ae71b13fbb391ee8061d81b80e4e2176c2accc2f4012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d6000000000100000002ccc8f653014035adfdbe26f67c3b923ceb3d545a971b7cf7d1e42a0b0dfb1286150000006b483045022100c3f6c01cd206987559a44387342fb3d3b002a33da60eceff44d30f1c620632a90220354ad421808b9fad9f0cc47ad6409807cd480dd12333157f937d70b3c20f03b40121030ebcb0897e8fe8561a49eaa0f944cab48088e9698b9513d75f56182719dc4b9effffffff3b6484fba220090896dec543b0969bde12402eb4bad0be10830db636f9631b44000000006a47304402207e9536c6b426cbb5f400585ee8a30037c1580f195487a5593bc88af11918ce8402207bfa3e6898394a1f1a21099c018caa9740f2a973b0012ba7d7272a8c97168899012103c6e54ad9c7cf9f47183a4906c55293006eb9b6bf1c7828df0c137c40361039b0ffffffff02de690000000000001976a914e14eaf761bfc923e7518c9855b8556e7db584f4688ac5e923c00000000001600145d8032c74a2db07607d7bd3b008cd55c7f18b30400000000010000000001017a37195f07cce4506e6791caf99954338605fd8111b1588db988f2a323ca73960000000000ffffffff0220160100000000001600143dfe038731e35eb83c0360d3da0da571977772a3af990a000000000017a914ec089babc8e00efac869ed21d21f4c6a6cd9338b8702483045022100d7b96963df50bac568adcf398f48a3d8c1933fd68a522154a24b57a27311bff1022039cfc9ffd01dd29db73e7874ebe3d6e85dd8060c219b7b065efc792cd2a6341f0121034c961815b51a3e13d85e05949a57580d82d21ef6ec6689987f1779bfe2c56eb30000000002000000013334243348d9810552389a91079f49339c3cf8cd49f9bf228afa7d42c2632ca1000000006a47304402206ef11ffe33a4095da514a530652a7720e227f0bd94ddc02c9e1e68b16d06a98902203b35db4699459cce86ebaa2e848b3198acf14271d2c27985b65092076cd27ec30121021d84c996b46de3b0b96e092ec929e4a3d0c2dea3a88151d615b09877b5330266ffffffff0238c700000000000017a9140097d84c2702e07f0ef506aef1b01ffe2a208ae887b6b90300000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac00000000010000000161b2512bf39d776e30b3f51312a7e5ffae23d24ed8d89edffee87e454e1a8a68010000006b483045022100c605ab5ce464501c8f913ab1ce423d76d7f72e4de42452eb66e70d91c878105c022079ddbabe6a22f096f57ae24598395ab2816c429f318cc622d97869addb9e6fe6012102e885b6711e0da8f3c02239d1d19488e11267d239e7846c099d06c36089bb2466ffffffff024bd20100000000001976a9140ef6db3006b59ff539dfb9d74701a6a5d0c27e4b88aca6a621000000000017a914b09e26872b4929f822e1f0088b72e70bfcfd3d64870000000001000000000101a99a2bd0e17bd1f38cc469c716d60354bc5aa2f055067b8c5508d29bd20a5b020000000000ffffffff0260ac00000000000017a9143757545dae63f4002d8d9215013442aeb244f214875d40000000000000160014828860cd81aada29bc04ef2232540fb2a3047c0902473044022039701d22e0220cc13c9e0067754163ed832674da2aa590c7cc73f76dbee6c4f9022027baa839792b53ab406f477b68404c82de413dd7b185be73e638bece53f6d4be012102ddf5e40015757175c32e744ba0fe4667993cd63fc515361b8e4bb8a11f7a731f000000000100000004b40f7dbae49f648c0e43b218534603a62dc38aac34be7f554af61792a9740ab1160000006b48304502210098e8e63401134c625a66ac8df90a7a4cf8f2a63b82ebe8cc6848369cddbbfb920220723f838e862997edb708ae9cd28dc373d2f37bef0f7b7fd0c6367edf6f91955801210332a2ae5d389d09b3c3348809a324d32a85ed688d99894bcc6dd5c5c2ac7371c9fffffffff9086bc0a94f5752a8b7a93516ccf246fc990cfeb612bc56183f2dbda1e359ab560000006b483045022100cfbca77722f954af0d9c909b2ac1c2e20075b3a8a51f6988f1bd216b68a8967d022070e493ce2450c0b142366d75c93782086d02de7eb9e3f2d59a019f4de3742482012102c0e498f4db81c8f3741f579546f8721f84d4ce007112a4e942428646b162dc40ffffffff74a0818498ef667cbcd6c8e5cae3fd3adfaf7bf94c6a403f05bf03e61c3f504f7e0000006b483045022100d108c7204766c1ede49cb76462475d8552d62a57bc0e7b14deb33481ebda00190220734f304983e135a3fc19d0dff70977b9a517ab09647fb6477a900885ff94b93b012102f8510ec8a6099e51dc0073c38934e35441ea2687ce21f4ee8f714bd8c09d6e3dffffffffd715608d3794b824163338845a3ef7121e44aa2e6404eba6cd034b3a20f6daef000000006a473044022044b1df1f86db79a87808b2b9266656c06199268c64d6a0989cbb4bd25d22f4f902203763202bb84942af5188def4a8b8fee0dc5f6be188e454195ec03bef67058f6d012103eb0d9315633fe5b3c6940d1e8fc058ed8c4a524f42fd4dba073bc571036d522dffffffff0292d70000000000001976a9149502b17dc305b7f7e1b221cbb8c979b20ad707c488aceeba06000000000017a9146df2780d544d660d080edd07e720900e0b7404a8870000000001000000118c6ad31ab9c6846e77dd0a4a3eeeb4ac6e85e0241db15040f0aea85bbda0f430000000006b483045022100f94c8b0e2bb44a5a7e7c9356634f7c0743e01c1f3be7a1746c01f19361dc77ca02203f75a2bfb417e935628f3e4662177a3256ad083993f1b996fbfbb36122e3a6b4012103ed79fecc5f6a1b86c485eef637cdbace865c8d3cab1b9c4d06b3c0e384961122ffffffffad9147d8c15fec8b30d5dc75f5af700ede398ca0fc6539a9af4cd62bf475e0ca6e0000006b483045022100ea44f9bd7f2c8e3db4bd72ce574323a9d80aefaff3726d6dbf163f2bd14f881f0220572a9f72ee2afffccc6f3dd2734b46e9d485afde632ec5716a466f7d03b8569c012102c4f5f212de9c7223828cce4f670f3eda58088f471ba0af28e5b8de608cd08cf8fffffffffb4b1cd56d1f6634413b1a05e6802b73e6f454d0c7b44cd019729ce5676290404d0000006a473044022033409b1dc5b93d335b01991f6dd6a0abeff71a0333cc580a617f8dcf4e7af5dd022041cd721b9490932fee5e2d88a834667727b1dbd68ba756b3afad37fafc7d5a620121033768a225066f3b2d50e0d2e3dd7e1b24516d9651d54e71f2cdcc707060021771ffffffff4f4d97e3b751ea81de842a7e57c7275f97f7b501134ad285da67e52a962c0fdb0c0000006a47304402202b02741ab6445a6bb5bf4296cd85a6455b7311623ed6e2ba1fb1b4cda17d83090220753f0b9f078314d11604a9ca784f5a8d5470547616198e5972eb397b9f61b810012102b94beaf4c7a0163621756d335457fb7f41f1ea9b6a5d2e6e014bf1c4ccda9d43ffffffff0f3a4e0b09e34bfa44fa84e81f7e8637acf90164ea9d9be79fce8dc143b452ce0d0000006a4730440220156c5424235e9041d4126908904472234587e0d3a2a60e42661556c907cfba3b02201e2128d2b219fd4211491c70502d5a957b318d75b46ca283a15c762023e46aab0121030d48f830756a05929f516abff0019090736040bd37d985f67ef4d2c47a6d6728ffffffff229e9277d7b997bb58a12bbbc448110f7e5b69315983fd2633e722808ff633a93f0000006b4830450221009da53b504daaf0753a8f790b38f80b45adfb93484cbb9863a60c20c1aa24254402202afdf8423033a9a04f6086686be2ebab25061d465c2fbcc77c29de34c2c74e5b012103886ab6616a7b1537d35d73b10b0b84687db0871fae40050cc77338ac64f3794affffffffabba4b38743244985de209c73e6e935bc9b914a8386fb5cf4fefc946379a0d0c790000006a4730440220494d8df3e8244f74d8e0ab0a689b3cc30a0a2097d382c0b53c083c17fda3cd3a02206ae644605da61a14be4aa835ba23a7a159ee0db305a28e7ef9a8fc20da631d2201210308085f29360acb0bfa19e2f6ab546f25177612c0afbc61a9004986bce10d4d43ffffffff658ca47b9946469bd6add92cfbf5bf8fe4df89645bee738bfd6f8c12e75100341c0000006b483045022100c6f592f7f19d84d6600965fe707d113a0080dc0ca310fc9996a18d5d8db0886d0220681cdfbdfb0440854a27218a7587d688f81ad81039e9283862de18e8ae7068dc012102baf0981cf39b54e5350d1806fcd5ae87a60b96a198a4bf9f3369fcf67209157bffffffff96cb1bb491da511f8f36ed3b18a083939345d57f136735b01ccf1602ed12e064390000006b4830450221009460e0aece52c2af07011e8243306fd8438776eee0ae1d504a98d4c40dfb998202204e68c44fd53db0a8f9e1556bdfc8784cb7c020433567a34dffab618fba7e464f012103c1c90e4bbd129d5021446e498eb2a300518879ea5ac1dd32f0db2282df9a6f5effffffff13e14cbf51c05abce44ff8cf014f452723c253809d5282fb34ff014253dcf3a7160000006b483045022100846c0ad53b913c975b5caffadaa32ad684761ffe5c738fbe81a47473f033d52802206044dbd610c99c1bd02529a026759faf923547986a93b638498d4df756e1aa96012102caf82c5600a5b0578a77f1414aceb3652001b4a5f3d6afc7233e82d80f13dd6bffffffff6aa8fd31677572b385ebc7f7994a833b8da9ab517256db4d36ffb9130d769e67040000006b4830450221008556555c6c086b07c064f9c4d6407529a9b6b2e48b36196a6b274fe9c9c469ef02204758b0f2a595f62a332f3a71ad17cc8976d7e9495a1a77b5ef4f0d2453f7d0a2012103722fcb1ea1a8a6961d1c6d65e0480bd08cb4ede3683353c812926223e2fa21c3ffffffff01c6f54e27eae010e694fdd20928614eb4d5603a21e12ab2825fbbbae5c8a8da380000006a47304402203f1e3113790aa2fe9ec275946e7d0f002954daef9501b483bb16cbe83aaef4a402203fd7a72ee3f47f463c02c46edb1c3db42900ee22e8cdde73ebf6dbf68a273870012103cc75262a196dc4be9b5fee2af41ab57e42d505d215b52649d0b2dbc55119d2ebffffffff3c512290617936ad1d6606a26f12023c0385f6d3cabc64da541bde00e97c89a3570000006b483045022100c12e33456093e3aaf82bf0a158bb9d47b2fcf7d0d9012840e327fb6b8f86295202201e7b980a72124be8222e36d78883d374f4ab0c542134ae01d2aaec26ccba4b0a01210328ed84f118696af890b8bd5da1377a6c14feb34ebe1353c10b39304b57fe04d4ffffffffa1c4febfe0d464b2ed959878245fa8f5888f853797c67fb7dba8de17185a70df250000006a473044022005755957d44d58c7301b5af9217b9987c7cbae22b08ffc0a20e6795856e9671e02206f440b183a0925c01e0836253d21e5cd231f21149b82f19f9299bc34c9ef0f55012103aca30a3c6564fbbfe8a3ee58aadacc59f2e1ccf2ca1ec936669b76879f6037caffffffffba6c3b8e89fc61328d456368c110d4a462866728ac94b1af9fcd5705037f1f30290000006a473044022010f6979905e496b34764d80c0e76d65f7602385f29361c0e2fb488b9f517a7b00220185ad5133070d90ada512a04ce7fe3bdb941ac654ddcb73dc4220a6f28c6ce100121029cbc226d60e7f4643f9b15762d55c9c50732747d046b4c9d001db7f4a691a539ffffffff6fe0dad267d64adec32381c8e1722632b7cf043e0dd5c2f03c41dc90df1a120a0e0000006b483045022100ec66528f6131547de21b55b1b57876a2a14de93d7e04350b4016e95b61f1181802200c8fa261c306868e5b12284070987615d67e7d1c630d36fd9a9d317d5f55f4b3012103b2fe1d1245182b802ac1034671eec8f5ab8ba55063ebfceb5044a1d9f21749f7ffffffffd6f7f333d8a885234d68f1902576089fd57aecb16c0d230d6ed96d7599d9a97d010000006a473044022043937911f01f790c72948702d4b535d2abc19f09a0707c412243f63196e08551022060825a9a7a3711167bb56ee27795b6d98f7c302a9ad2ed0c7f69b45a6f96e662012103e22edc31992dee67ed189ab8a50c1681036fc198655f571044b0ae4b5f494574ffffffff02d24e0000000000001976a914b467182007ee3229c103082d0b52922f3dcffc4088acb4b221000000000017a914b2dc5a5d2d0384a7a1a5a249d5c53d122edea40c870000000001000000066c4565667bcd559341a43cf8cd5c839b734e1b74bedcbcd9ff5b59c030db7b19000000006a47304402201bb6ab872a64daaaac753c24382e732ef5826e2e5713913976e7830ebe1e05c40220055ad1dedba14dca1319eff39dbce4a4764948365533fd27a54242003a69bdda012102b7f8416a6c5c749accc164716e53968e91d75c9032a859b7f5fd3bbf41c6969bffffffffcac06763b2a820b3511f95b4674959c0680502aa0711290e53db9d69b6890675120000006b483045022100cbd6004cf5ce655702d65c0af98e7c19268a5669d05ca47cce554c2f77660aaa022005cde2662b0cc568565e1219d9c68be92445e7e5dda918d368d4ba6ee4693f84012103a6d1f246010d58acd38cefb6a8c6cd9b1f0ef62b8e10a923a868c3aac09ea9d3fffffffffe5cedda93eddea56bf31d0e56feeb72c028409f04a44d5b14191c21fad1581a000000006a473044022045bc9ba0bc29b9c22397f092b4b2e0a007c920728b9a31db5615be37133413b3022058c3511e2071b48a3e9085ee4b28c1b2e5548b380042287e50c3bd3fed78591f01210331d485f15b1428a029a1115fd9a5f4ccf3411583a2e687be468516d079d63f90ffffffff86132f918015334c977bf75773f304733b59b8a4ec7e594a990293f5ab00a49f640000006b483045022100990f668345d2d71866e6cad30a4e427459a63c3d7e4284824ff56e6899d92ce902202520d0f75d4a78a292110a9ab86816abba10a1817437910ed67bda171c797cee0121036ddb1f070de025f063fc872d95d3a093dc16410cfe77c4a2d76989f86a0ea62cffffffffeabcf1849717bc4c677dce93e6565ecd95af41458f0aba40c8bc2a45c3fbfac0230000006b4830450221009b4ccb64bce65fad67a1c06a0ce4c51ae19c8c7a2bdf06e43db2e2f6dd76e1cc02205df2139754dc0328eb583532a6353f1c911106def859815e8d59521aaa39b35301210380970fafc72fa1d83a4be11b2dc706056433a2264ea46fb8cf4a5357fa54c02bffffffff32247522ba9735bf6fa0037cfe99b9631f2716f4b061adbb620e027d0f6407560f0000006b483045022100c05f39cae0c2803a1fc9bb8ba8a6b94944a2572c3d834748e02be70d78fda9ee02207678dc865d9dc653d52b02788cf6093ab4d272be3507616d91480029167a2950012102946de1c8e1f2d3fd91dc19d2441e7e7257a3db98f7269a6a001c404bac1115fbffffffff02f4300100000000001976a914f527643753744c250d8a84fff6fbeb4718d67b0b88ace4e7c9000000000017a9147313b49f9c718973b1b0fcdaa1f67cf115cd15ab87000000000100000001a81f1ccb5dbf3ac65a152d98928abca4a51dea2471fea8ebc748c89412972eb321000000fc004730440220096c4e88f466f8aeff79084f53adf8a3b8b39fea3929a24225a6f95dca40841d0220483a733b13c0fbaabc0f6952565dd10165dd9a9bad1ebae6f4b547cf4d3b21880147304402203bfb0706457cf4497bf66c5bba57456240cd560ede742c6d1b3cfbcc1262129b02202cb0e827301af664415bd6a1cc6f6b64864a060430fdf2cdd753d70dd59664f4014c695221020727e42962d0fb7a3178e5249b7a4aff6476a9b4d50045b97e9e96aab194f8e82103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222102e6c69b49f98cf2a5c529ba440062007146cf951743cf5db9979f4771b4eb9eb653aeffffffff01fcf71500000000001600146b032c20867178720bf69f7f9cb79234154c0dcd000000000100000003a5619210c107342d0e439f2aa79ad7b56bd0cc452f305f08e47f226b825689500b0000006b4830450221008ba2d9a6ab809af1ca3bff4748914f8a67420bcce1a2b9572d48f4fd6577daec02207bbb77b469d892749db5c6e39c560e9a54973b3f03e510ad7e4ac1d1af0917d00121029bf93a3032953f11a95387ea51663cccaa7cd503326205e6b59ab73f06a7325bffffffffb58a16b2f1465ade14fa674504e0e3e102d73b03dfa7edee988a6f05f1fda21f000000006b483045022100a2d8714a8dfb8dcb5abf4f5dea4430637a04b6be1a4f45bc521f8f4ecdb136830220707f0707f5588354516672d8cff6b64039f5211088dd6cacfd8f64da9a74ba1e0121031da3c5929eaf08030694c9562c3ad502039a1f46e934a1779ad94bbe3b6856b9ffffffffe6b9bbe1b84ef9b261a2048174495495fa69874e3f71923a4787ed13bb0e9963420000006b483045022100ebaf666a601ca003629b406dea09685637f149034581a8ba953403ee6b1427f902207913b46215d10438ba3edf0367f586c0f25e3ce3c4e1d5204b75f49247960afd0121027dc210ecc2cd9b39d899a2be7495adfeceeb683a1d324a348fb38ba06ad1d6f6ffffffff0222140000000000001976a91402bc9efe41a1e04db9042600366a0e9427a97a9c88ac62d605000000000017a9146960b4cebe7cd8a04f043e6c187f3dc580fbeee6870000000001000000012d184bc15fd1e964d30335cfa85d4db664dfdf1af38f61bf6877c2ec156db7fb0b0000006b483045022100eaf465609a402b3123a72676552d80d453447cae404bda95d6d59509a2f39b55022004597fa5828c642ef89a90ff954679e4f3b5133043adba91c93d8498384f993901210221cf474043eaeb22ab064a67725f2c26bbf7fff7418428b81656b546e4cf1775ffffffff02d8560000000000001976a914c017ea6e96fffe051a0bc02ef00a4da7f3631a8688aca6a62100000000001976a91480394516cffdda9749feb456ebb8e66f7d94e81788ac0000000002000000010e904566b1959cb825d0ec5c3a41277e2f95e2349bdcc0a92384c79289c80a6e030000006a473044022055aeb508178c343e22d2083ccc3134836f9cbb66910fa94e930f26380be1af5d0220211b97aa7ee7b701bd72d7cbdb02b983b0b9c4c931d2dca1bcf7ea9574a28f79012102a485df0d3727553db8ebf6362c7ad4d0c2a242de41b42abbb80ab80cdba46ae4fdffffff042b020100000000001976a914a48fc90c88892450e7ffdab0509302c97d7dee7288ac90d003000000000017a9144089df6053984e93e80573164847e9ffb2b1c40187346c0f00000000001976a91477dc5354650427a0e975038d84d0e5906ec745c688ac55faa302000000001976a9146e9f5e93bd30bc90ea53face39cf41863b2571f888ac48a00a00020000000001016de2ab2d2cda0ccee36e0281361a9155dd5dac13763e42a31c81ff8bf6b6bb8801000000171600143967d342a3ee4fb3c31ab29ee6a8f0e44fd2fdeeffffffff02350703000000000017a914a2b074f17a4d7ffb0cedfb9edb1746977b01b34287cfc02c1d0000000017a9147e4341bb0bf4a969b4d4ffe6b18b0506df40a6d9870247304402202cb85b109076447795d8bd4ff6a975a0923cbbb6e6af97c5faff3a7381a0ecc40220731e745b61ec548d5fede4bf591e805c5d3305391835436c773fd07c80a03390012103639dccf65fc96765aaa5c7b00a63e94bc66b3d01267ee25f5c3fc5bc4c40599c00000000010000000001013bdbc57b63b4faee37e0f6e0cc9f0bcbf77235e65ec43f415eacddd023d451b41900000000ffffffff1707631600000000001976a9142290f798e67153257f0885fedcaf38081786012788ac697c1600000000001976a914ba0a0b202f548f3b1f59c7049588f11cbd308ca588ac015c02000000000017a91427449dd2e8db47e82294a58d0d6e65bdca82900787721608000000000017a91438bb522fed7d6c1c1514ca6dd65a3106935ffdb687ec5702000000000017a914493c403ebdc47749db996b83b40a02e2094f6e4d87763f02000000000017a9144e973ecbba4331fb5fdd9ad6ba19ba9065c932e887d7b804000000000017a9145db7370d518e0cab8e6d6b9d82ad30fe9140db98871f250b000000000017a9148366cc2d76069bed578c19ce382dcafe464eae42872d3e01000000000017a91480497bb47b0ef12e9212f4b8117354683ef7083b87ba9710000000000017a914917ed9b41502988521039b28b9947098724c428587734902000000000017a91496bac19feb47959e9880be9ef33a2e88aad1f5ad8764ae01000000000017a914a8b940a643ed4e521ae9bcd0723acbcf498e8830873c1603000000000017a914aaefb66ec615aa51e88e64adc530b6d1e66e19d787e85702000000000017a914b6aa608e1184639dbe2e5524dcb51efc827647f687b5b202000000000017a914c1731b64b68a7f7b1764c8e6a078187e45cb276587a23f02000000000017a914c9f6d54cd15126b1c0d9d14c4f6f2f7057b42237877c061f000000000017a914d2139b9f0ea1fd3e568071013569ad1ed8bdd12487c74b06000000000017a914e2ed7a37b8a4accb2428a90de397bce3a96c87f187d7bf060000000000160014d5f27463a6b0bdde8039df5a1402a1769c09f60c9822040000000000160014bc99cfeb2dcb70368ff9d2e4961f6f289ef1bad6660b12000000000016001496606530f5362b4e12bd3cb27fff8349ed2d8e8373f9080000000000160014727fdbc6bdd67cbfc9dac90251225966a07edcf312af540d00000000220020923a51c2b9e736dd6cb8ae55038c4e3908fca4c28c65d345f437e4a4174c5788040047304402203f6f2a0401f91e044ef9116b78e6b2c13f98f0ecb7717b8a3c41fd4a566cf6230220424a17d24e2dd53ebefdf878e140b6fa84c3bb2da78746267d97aaa693fb7afa0147304402206386b034c0dc7902bf5746e4349fd46e5c2f2db11c001b698de9f46f4bdd9a04022017b72649e24e56219788c0b8cd26f21859230a52128b3929c362244259dcdc88014752210341fd34442d6361965beea89d4881231bb9aff145446538931009633c326fcd0b21037e714df9945ad16f4c442f1d52283ab8e5189783f77677501e318de86ca4aae752ae0000000001000000013646de3e824e6163c0841535f88666c285bbdce3dc577a6a188dc9632af8fd22010000006b483045022100d876f8dfc0992c076594d69030cb268d282d7efb1617120ac5bfe0da5d0169040220310c987c33c8e31974d294881ca671e72a0930a84d43684451bde4c816decbff0121029f69d5da4219d89244913df39d41164d825bb12be64e4d3cfb71779ffad669d4ffffffff0248590400000000001976a914ba385784ac80b04a547912e9e63eb0820cfcb93988ac8a2d0000000000001976a914c5b45d4d94bc03254d1598013a2637cc24b714bb88ac0000000001000000000101bf3c8c554e6d0b119219c7f8454b120b9ac1f857e43395fb0a2d4fdb10425c421800000017160014b4cbb70f52dbc3ae6828f1b7797aede523677437ffffffff026fa72100000000001976a914b93ed4cc93895572822d8864cf0deec839d2a07288ac923200000000000017a914ef0a6e2baeb4ab63cd9a6c8bf63285653bb4f0138702483045022100d56191feb5b9e6248e163285153cd81798416c7406b37e215f783027e5204eba0220567fa124a9182926dfda4baf655e9dae97fcffb306b153b85de3fd681913a866012103e1f79a8b304df9f9c987b316245eefa814ba91b33905050dc452e5f1aaecc5330000000002000000000103906ddc5e2ee54589b41f159f2647868a1769cae5ce641fd4f4d0b6608ecd838100000000171600141c70d07510c9d7d6aa86a22024def9f65e3996cefeffffff0fc7f8214370915063976f2a4bbd1e08f910c8cd753e6f43e68f6fc46aa17516010000001716001466b738eb9938c769f185d3126d480d215df1e2fcfeffffffd65654f54b4096a62d9d82f30b079ce988449028eac4c1a3cbd556dabab9b12400000000171600140ab86946bd472cf9dae974ed9cce584e7804ac70feffffff0200e1f5050000000017a9144c06a6a9ecb664197df09f988137a8288058c72287a39b2c000000000017a914b182da562430a37f3b899017cc9284c0abcc4d64870247304402201be63061812e7862cd5c3db1e5fbdd6038c876f3b7104d891ff2aae644c9bb5e022068f74624e02ad1034557987335d9772857a8b0cdc81b445cb42cbc5aa11f25290121036e1714254554b59d9d32fd3e4287872993a7b47b7f905c999269ba1ba2c7d53d024730440220674132fcdf559f008e5c93d8e64b6e4827a5809439f05b945a0f868e573b190402207fdcfc3609e4abd171bd9853f3d9b1b93a7ae3f6599d6ebbd46f14d93422eeae012102cee3263961ceac36a4459b66f71088e296ea7f38b7713872613605d0aa87fc67024730440220113cc94c788fc5d131cd32d38a01cbacb803193f2036ceb94bbdb9eb4fdbf0440220115e1ac3b7e9aff911b5c238c343ebd92ed5935557f6fce745753e6b1d4cf86701210210f8e393be44fa9247eb327606d2f09b6e5da35d95b3dd80c00a9155585a37da47a00a00020000000001026d7625baae5cbdeef047351fc645bc9e8acdadd631f4d84a72de58519034c02a000000001716001478219837b1aebf94e02de13c3f7280a27c921128feffffff127d49393bb1bb70f03b7243ebe4ab5a791c6e0934e5107c91df15d9e95b1bb30100000017160014823e39009f1f3dbec0cd3aa0143ff8f5612ef01efeffffff0267d80f000000000017a91437c798d38f3e66807ab533299ba26ca4cdd94ee2872bee0000000000001976a914405efad180b423bb438e466e03d0361b1e4d9ce288ac02473044022027bc8f789300acd06f83ed13a3369ed26650e2afff76bc49752137a84545791102206e77b0cc3bdac766ba192d7cb88d5a560060ec0c50b03d0400055c2e3038b530012103d1f6cab16bc0093e64f4bb91eba5043705cfae1c9a223ca11c2a4dc7f587299b02473044022024c7fe69f293cdc5da6b9e62db13a562f5d0d955778de2ac8d9c67b487ca02e9022047d1e0458dc0f1d4eb9af0cb1a1b61068fb22b7e877f289858e42e6f4b6333bc012102b052e459c31166c72e839d7d7564d84ef4eb29cc9765a99191888fd6898fa6c347a00a0002000000000101af474d6ff5d4f7c65ef90ca7b92abf8a3a8422027bff8e8e6750a2d48cda99ef00000000171600146c738d93cf53901beaed600512c3760633ac788ffeffffff020fda15000000000017a914319bdd9fe1872d1057c52ab9cddee2035510b0f287fa8109000000000017a9140055ee91b6d254564e739ec94875597789c989b78702473044022027e5e57a482f2b758f8d42ebe60bb4cf5c5f2a79278e246923e0839ed9ad7cb302205a980292b8283c1b6fe12db491597dc8e5491ba6dd02851da3fc941b45ffdd890121036654b9a0abd2bd0cca93309d445f82d3773d4d5c4b64b41a8952a739d724a38c47a00a00020000000001052449ec4bda6331858ea3d06ded411e83edcb532f229b02b9da204c687e4ac6b801000000171600142697f87d62f05a0bca3a44566932a0ed6a5cf974feffffffba504b0960aa6ff0c4919945641b568635293250fd63189cbebff26200cd92d900000000171600147e756ec57b0f40a8048611cda3dfeadaccae8c49feffffff3ba756a46089fae67b11e1f6fabdfd911506da901bdc7025d60fe5a203c57cbe0000000017160014c69d71b62bf61e72877ed0b732c3badf4e8319cbfeffffff229405d60a78a24d41211f540289c13d0dd1747290e63036f154c3be50143b271c00000017160014f29da1f9e7d294ac2f9f32c2dd96843edc01070cfeffffff6d7aa5b619c79289e8b5ea40c9c04111d297a8d3d888639e1e98108eec14b18600000000171600146c160bccf70d78f0baa61b9ed56df5b19fd5e98bfeffffff02f6364500000000001976a91490cb2668b8d7199d1faa270ed7edf40a7ee61a3a88acb1610f000000000017a914e71187073f6d8d3ba23c94cf21f063f9dd924af5870247304402203cd2589a8b7c09650892ae7d50e83ec4664a91930c3283c4699349bd90cd484802204391ae5a13ed129533492058e1d137b03a47fac6f76ae14026c34a2a768cafc20121027b8c67742b04c245d2a79918575519d0f2c17f652b5440ae84bc1f105a950378024730440220187337a1748a86888a862e781c57df0e29ae74ab70f38793daa39dde4b5f747c02207b4d4187100601de7948e2b7f177a656c0469af24b4d72fd163ef38a3cad9d2c012103616ef3bdfa6742cac621cf2a65daed08c1d42997313a0a482ba0fe8ba93bd4fe024730440220426e35aaea463fa9e443d8b6c834281cafd007709b5881a2808ce569e49abdd3022009770312a63dc3707f038b880681a789d5f456264633622c4ad6dde44a1adddc0121021b2128f7aed66679d1d49316b779462fbed29d29656bd730f72155df04eda72f0247304402205b95ebb57d93474e1c87f531b9c7df2d3138db415938fa88f028e5ed225270e302204c42539ca65fd73d9dc8c5bd60cfd2ccb46b8b2268fc017909649be91e9608ba01210362af61e52d0014d8b0577dee8f0db1d07958e6ae2c5d67ca4d16f38c96ca2b720247304402200a34a785caea09c02fb76b3f1bc798f16bfa81bd6c37bcc99982d13a386bd89d02207c9550f2841c8773b00b03f148f730f5398cee6f4518e8ecdb650bfd59a317e301210393596b691b010c7a9ffbc68b7b3f547547b4ac80952e7c800f8278a1ac312ccc48a00a000100000001830193175e4ae01f0d24b32f0b5830924cb0231ea5ceeba3632fa0e24d1faf26000000006b483045022100f3d4c880aad705eecc7ccf1ad6123f8cf5bc5c86964c4efca9ef416a56b8517502201367225a7d5cf61500bd585817291187191c93b07c58bc8d3bf0b3cbfd39fcf3012102fd55becaebab391dd9733438481b05da690c644226e38b8b7947bee9f565b492ffffffff02057d32000000000017a914e6e553f0e3db893a05499d97867bcc3c9f207a708731a31200000000001976a914b7f3a71bdad74efff50c849c738b7f065b63bda588ac000000000100000001cb4890a2511fb9d0d33fe2a4aee6c1daee3e85668f13969a9b299b344bd2c4be0a0000008a47304402204819715e764f55dc702524b4687cd3b54a57e9b0470ecec7493a8b6a1b0de78902201e63e419a915df81b712d16e6ae1b233b9fb2ab80bb45ad49fb27bba99253c090141042ba133d3a2c0a4e4681d110cd8be71fa539e7c9bfdb9cb407bd2da97240e02f95dd4e673c102d8535d7265e20d433f9953510133fe6cdeef072aa9a061a911d9ffffffff021020160000000000160014dfd4a13cb12fbdb97c1e19cbccb31c4068dfc3ca64c70000000000001976a9148d37c836a3a1d2b0a2a1b6e5d68a9f65dd52499e88ac0000000001000000000168858dc17fde9b050ca5e78519fbe08aabad5efe9bc7d06d3bb6ea73bdb45706c80100000000ffffffffe19f1469cf9400bf0092981f0a81d9a431f6559f809446d93560cbb0b0d3da4e040000006a47304402206594d2b1416e972b9cb2f058b27933b7913dedb80bfd3f05d154c42a08af545602202a18f4b0d8c5a4efa86c89d122579cc16bc6b07560fbbc5a1f20c56178e9b3fc01210306419fcd8b357f5560d94ee53b4d9803b8facd4bbac305590fc5092cc415762effffffffc2680972af094fac46ba2d2acd77609ed3d30e8e1b3ea6bb374da83680b6bded050000006a47304402206f848c9e9f33c8637a462b4073c1f6ba7e0f930e83259bea4cee9669a07878dc0220681523eca58ff80df8eb212d671fde23407d3aab2c30afe56a0f6f4184de7fb20121027a24ed212c42f5a63419e31f4248eca2e3feabfca085176ad42edb6ae110538affffffff3162dc6564cbd12aa9dd0c78f4c92991d75a9fdfe83378210b2ba309f78b0a81110000006a47304402202958cdb970ea5cb17ebc34b562ae3c0fb1a5cf627575f3af430bcb53a5aa186602206032fe3ade62fb60a9ddaae484aa5b69af9d7c67cc3b9d74bc581dbfaf15af2001210332437478e402e612278a32a425de143af4b2d0490d336ce8ab155115f5a7f65cffffffff161e3f7cd233080e9e8c7f0478b1514ecd167f8eae71f6b7f431f56db6ca6020280000006a4730440220340a588d947954afe35a1b55e2c20daebb998c6c5db4eb76c6c0331bd273783902207392f0942f8f1068d8be15d5fdd7dd3d6fd61f36594183df3a9a5e19d95e941f0121027897a2026a645f61af4727d6e451dd9b9da9e207bf87c1f7a0adf4b278cc7a2bffffffff8dd1995280d192f9520166eb452feb4d51c1b720bd7be45884b41c774fbc86a6000000006a47304402202f85b9133fd3f4a625660ea23f64cebbae17232ef6bef704c5654816ccce79a30220126689061838634a6b467473cbb63b2f5c38a0160c29bbcdb192efc330944703012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff86c101be9399912534ba236ca1741318941a7147fc673ee92a485b37b3f13573000000006b483045022100bcf101ee48e43ffcb2b4f8e2213b9e6d69d9385c6345519b35cfcbae534347010220674f990aa4a34e6cec34767366895e859c1bfb7ab87f382b6ac9b9ce6e9bde8d012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff0f7ebb745947c198a27dfedc96d67261935da5f8801e0c556a46703f78d0ed5e0100000000ffffffffcbecbd0d250ad8971789d87d4e01637e2b64b967f4c94ea380f25890f9568d6d0100000000ffffffffcc15f3c128f53e4229a8e8dcb47265172835c69b978d53aa7289a23a99794eda0100000000ffffffff80b773685ef949a0aef57c98c932d31e89738aca7fb286109af4d04b45921641070000006a47304402202a545a3105dcc9eb590546d3c62fde73b94f94b8cdd7431569998f57d67e8f30022032773d5eaab5afc7aaac40119b59a3ec19ddd0ed0a4fd4e0be2d56f19166e6200121034a2921cd7f28515c20830f8cc95c22282c6827296b187ff7bd046d5fbe6142d3ffffffff70a1e7a954f282498a8fabe6efe8cbe91df9694098069300ea4fe3eb20402cee000000006a47304402204e6a5638f3d24e78148e6a25935299617cd917ca7d4c826c59b2c210db7553600220445e8216244c261f9d763d97fc87c4d9ea162de5e0f5ed44e325f5768a21afb7012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff530ebe3b8e133cd8021a2405f126dbc2d53246504ad79dd93145f34738939717030000006a4730440220177eb69ab236ca45340741870a018ae59140a517813efbd9dffd6d2e2678ee9902203334752cb23e2452fdd1e5211f32c5283d4c478b7c4d3abc79e6bfd953585cca0121027a24ed212c42f5a63419e31f4248eca2e3feabfca085176ad42edb6ae110538affffffff99b45ca7a0ea966646dc5c2aa925908b33cc2d8f4743b5d856f0bed25286ec5d0100000000ffffffffe9425131079a506061bfe3f0d426f362f939fabc6ca57b3e044eb4665239851e490000006b483045022100f52078364fe066726a471e180831e0ffc6f87af8ff18473d597f9e9f37f71ddc0220336372717c51c918378051790e505fa736b4a930de9a43cbff9daf573e50b1da0121038b1d11362d31aa1ca6838012b736f64447b6e67b73cc77645eee45c397214fa7ffffffff9fabdb1d27676689cc02793cdb333ec10e8724ce8519ddf1751113f2cedbd3aa000000006a473044022028afd76107638a53506b5c313e31540502f21001bc37caf1c06950ee6b2d1f4502200f78cd85e246bdb3db830db9aa799633610b60977f713f9b52a2158ad154f423012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff09be09fdb6956f401a739a927bca8c230ecfad9e3695ef1ccfdcd59076678c820100000000ffffffffa1aaa84c5a150f65d5e7a88c01c6aea179e9ac3a36b234021e8a988c86c787870100000000ffffffffbd49a129538222665472f48645688a95a1119aed1cf53d2dbc29459dccc97300000000006b48304502210088a5c40037c01d05fef388f6b2aca94cea3e70e6fd2430b1a7ae0ac4956a100a022018c033e88a8bedbaa55c1e60bc425201a0079fb2f3911d9600762a0bfc28eb72012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff4b6f12b235b1b93ae5bb59e0b0c1fc470b373a8b2c0dca07538acdb9ce55f90c080000006a47304402205d1d5d5d857a4211813af92d344e1b85eb430da669641147224557fbc897fd9b02201fbf7af5bbbd2fe15be298a75bae64251ddb1e7a1d81973d1403413932aa798701210365c1e5e8c4e6b58f8d0babd021910d2ace9066d9d9cad621d9d094132321260fffffffff952b79ad5c1e2e25fd705da935ba7564591d499cfb1e82816a96d11888b471ae0100000000ffffffff697130abae3b3632ed35d218fdc29ab24f9ab06bec68a0670c7fc2298ee690310000000000ffffffff59b1ae8a879eaa6ad8c8452381c0d0236d7948a504ebcab492358935116f73c00200000000ffffffffc00c2a6880759ce2670cd247f3a0d95cf58ee4139e173981bebf772865cda232000000006a473044022060d34690d1b0e18798e48f4794369e135f900dda7563f99bfc62f44e804d9514022048530ad87f5155ed3b2524a30c6883cd35041ba1470a47b34ebf98437436370301210397e6a24676477487630cdc4854e1dd8e966b9bd164e11c674b661923e4c4c809ffffffff58c58ba58bf0c609f7459cb1af96f1cd63167929550087112a5bcb761d2a1dcf070000006a4730440220027111251a97770917370780ff3a84b4874e96a5eb9cfa6446e88deea33945b10220362e69aae34bd749a15f09ed3da0af9f1630bfa30d5b81f55d9d95a9d38fda81012103e37811961c190fed555169e34fc53e90ea9c2b1d11bb866f8c5898f0765c9cadffffffff8d1eaf8fee798f7f57352a7c0b6a4d47234664edebd250855e3e7bfa90b37ce80c00000000ffffffff7ca3a69f124c33a9248f45adde6e36b26e6fdb8f5a8a956c20711629e53bad71010000006a47304402201d9a4ffc1d46d171035290960df4711161cf2914acf71b63f88d8b49121f786d022072685649c0e52d2fa0730aa051318ba0034bbf44471c6610d4b1dfd1941098a4012103fecca90283de10f3e5fcae513ea419adbb6a44c38b1b25f868ce1840ddf2ad82ffffffffad06882c7f53d68065647d93b0436387722e0ab87c52d213cbf3ebcb7c0819a80000000000ffffffff7fa9a38114a02bb03defc27cce57d56e0a05009d7f4b199744f865aa11c6d36e000000006a473044022052dbd2dc32affea83aaf8e313903d5d0026f9f2be76360654f3be9ed7b364118022013d4a55687be058a6ff4250c7982ffc83d8e0c9abef20071a58669bb449175dc012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff8539364b73e85845e52a1ec674050287fb6e315f18a19aea7d083803ee71e08a110000006b4830450221009d7c26990a4e67e34884ed5fafe37ed6978d4398cb9b969fe93d208c2a35e887022007e91a49d8566869e475fbd8229cbee60ba9f0fdbb992fc154d42df931a39288012102c7fb91e521bb9d58af02e6868834a1e06d575f275601d1fe7de3c7610a6254c9ffffffff61461efa014a554b1fb99fd68113e5587a9f28ec04eba4fde13d48b97898325f000000006a473044022060117f29d2cac4084c630ea9e0c8b47e1811bb8fe5ec69f6fcf73851f2558dcf02207ffa5e2da1f9f1b284ceab219cab46facaf4b9fd2a08c90fb7edea17b9bf6faf012102047ba3ce2114b2ac281c3e391f9fea819bf386e71edd111824d6bec01e458171ffffffff62b99f001fb570c6a2a0d5f84c25ff2e2b33f9e6896487bec39809c80ce10dee000000006a473044022055fee9b62b1b2d8ed4e8ccbe0bc7fc118a5ea6d2edadddba0b1eeb31946109da022009557802b85b4c5be87e7b7cd2013a8491d44f1ef01f9ef2049639003b415242012102382439ce1b331807fa2db519b56da672c8bdb683e92cabc6ae4747150140a533ffffffff12905100924e8ac6c8ea064cc06f31719c689adc8c4d303b3fbba2bdeebc63ab0000000000ffffffff23a866fa0a7a24d5f059817e572f6605b75cd881a2fc91a075a4fb61faf36f760000000000ffffffff1d92c0a64f7f901b77177789e2d1b2185721268d08ea79b9ae46c865006294a60000000000ffffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b11275040000006b483045022100e5aad2d57a319519ebfea96fbd3402e1638d41efc562920c74db6a9c5bba781d0220402a3673c52b83eb5ad6efdb29be7051472b1246ae65425fe5d5503bdd107868012102a26385d7c6411f8314383bdf5ede2da5594359cfb59d71cdb0d4a6b7e46a5a92ffffffffc3c8d5c01c77269ae8d4813693291e1b1d577a7abea14696d25a5a115e3e59d01e0000006b483045022100cb1a99471427c61453ff42c4cc5649da7b8ddfeea132bc844b5493705e05b86c022068eb87556a1c8a913e717d08936db05a8d72beef7fe9c42b951eb8f30cc2b9830121020dd1186f77ec86a95affaf5701ddf6dfc6d1f839226c039905d671bfe12ff7e5ffffffff4be5829505cfc46514097e3f98f7be9a7b9d996be198fd8380ce4787d0af1817160000006a473044022023dec1a482ab5bced1e590ee6e75a90d105e064c09aa54371e56d04275b38a5c022003a0f693db28ee30f277cddc4f2ff73eaa0f973c7ad829bd2e515ffd5db3bc8f0121027897a2026a645f61af4727d6e451dd9b9da9e207bf87c1f7a0adf4b278cc7a2bffffffffb290d592ff32abace5173ab7f82f517e23e19b40b3862f58c6f08e430bd3e4d00100000000ffffffff115cddec6bad45c5b715e1815d4e71c005cc39c9cd334d27268013f251b2aad7000000006b483045022100a9660de33b495e0bb801a311a5f46cf6a1fe77acd2995f93ad659f9d3cc66e0d02203edf5d571d7f505f6a305ffb568240ecb99371619060277a934df8f59e65589d012102b6e7a76ad5cebd75f0f72c621e30b3968d1eebba265ac59ca237782e51acaaf7ffffffff58932e837b203c40ebd68126a9449d0594004ca0923926f76b61f95eb84caed0000000006b483045022100a25dc4ed37c99dad39afcadac628fd7da0c8d4444860b7c2e56ba135639979fd022044e6f7709b75506385d4ae0a1da349fc25b1e017d4ac26e870885ea75fc607b4012102089b7aff06ead07a3ae75a49f4c133ff35b140c5baf327627603cf1b2f716075ffffffffe6d2233c0cf33eedf56981463b5e6feda5160f1c2317b9d2c937c2041254fcf00200000000ffffffffdc15b1cafac6f87e752b4437668000aa74976df970b40a75d9384b07330f3ef8d80000006b483045022100aabbbc3ba4c678837478702addd5aa4edad79b6a2f79ca5c304012004eb499e802204473ddbe865eca2f8b9751ef12a656a361ea0cd32c6e198b9a252e59ffcb8157012103327f1cab856f953263016ed9576fbbf32b6c318a0fe608adb08fb9e70c10fb30ffffffffb30d1ab234f94fcf20dbd8f01b33ddccd0c24d9d0729fe01746a17a809f105070f0000006b483045022100a0a0521bf6d496ba88dd03f7597909c5b464ba3b57a281e778f7f2a99983595902201e9701cbf2dcfa9c3ec7e8680f854365b151659ea8dbd31b0820f5b49da1cfa3012102f05ff4bcd4316a142d55c50257c871fd6bc81a7fa708f43ab0329c4280fa0ca7ffffffff301397020182fa3886551e8d04ec581c570fb8314355bb965da61756d90b8332830000006a4730440220304acddddeef7d9de09fbb9ee0eaf689f0ccf9c255251396a0ecdbc018641c1c02200161dcd500b1f774c42117c1ffa2d7015804bd5f087fd5c216b88338ac6a6157012103026a09de494ccd80dbb59fda11e6ad047f21ffff7e67e209794e894aab8b2cbdfffffffffc94c023f33751ea7106c2a10228cfca7e44a60a8981667e9476e667d1e814c5050000006b483045022100c01b40fee615dbdec16fcddffb9ddac433496971deaa2e714db00c66e28377730220228af07b54e8765ae4f5782ee04c1972f04aee46be99cb0d2f81d0daea4923c201210301ecedbf2374684fb2314de520dff27bbb7184cb5dd546b7d77eb7f01d90dc11ffffffff644195e9c025ace387d35370c3ebcbf6af4003362022b8d29abf392fbd02ca90000000006b483045022100dd9096e9258938c1b85816d89cd65731f46059add8b4f9be3a54e877ebec2e30022062f1719f03db740a2d07824ba6c8a16e3da411c16242c3e910bd47fd0f94433c01210237dbcb5d169e1f5e975d30fac6534cdd56c07d17dcffcd0d30dec21b9865119affffffff6f5344d02b6c400ae0ee414d2b61e4b3247e315a4672135137aa15c20b48490a000000006a47304402205e4da3c636882b5b9fcbb660bd44809184a4168784437a94e26579463263108402203500b5ec65fec326077246f8bf0ff895aa64788d047f0ddd4ba6618578b076d101210238502e32fc1a35e84e58c95ab1eeea60dd5d7d91f75b0f94a979727d85497e3cffffffff4dd3e33d29376eefd723409154aa35e3803132e5d05a0385c5dfb5b9e4a1e073010000006b483045022100ed79f570f70d4a045b292084384a569e0f4d5f5766d88342041570265c496f7302203ad6f5e0255bea1d8feae1bddc5052022e29573dd46c7c7079d57c575d076fe3012102089b7aff06ead07a3ae75a49f4c133ff35b140c5baf327627603cf1b2f716075ffffffffc816da9323279193b84b2971151aa73097b722e8b9d168f43bf10fa0957394a7000000006a4730440220371a0e4bed483547036e01b537b916a781a5c645da0899989bcc5db49828a68b0220160404d3f4fdeeb1edacec4e0c235f665ff0274a86f15f6735e22e0d0b1a9caf012103c81e03f7786ca6c5c038b18e890646a28d44d16c7e9f4e10313e7cf6e6d04c78ffffffff18d00526170939425381d2d19547abb8ed73ee7e1564395d8e4107120fc47a3a0000000000ffffffff5f311bc0b7087297fff5ca355a6038ae6e8cccd4cb9702d475f1302fd4cb21962300000000ffffffff32b2d4340d9a36fdfc8d23bd92ff15df6bc50b8c7b11a53a3299c4a3c0eec4e90000000000fffffffffce29f7fbe2712bd20535e937f117fa4f78b6dc5c939bb5c8d71688cabac841b000000006a47304402206cdf8f143cb0a15d80ef1ac6e03f180e694b68ed96f179b03219906ad0f670ec02200b6a462c0755860586af733da876be27821d5e94fcbb539f33a86fcd9e406a67012103fecca90283de10f3e5fcae513ea419adbb6a44c38b1b25f868ce1840ddf2ad82ffffffffc8fa83d8243a2bbb6a4ac1a0d742e9ca3db44b401aecfa14039a035b6da309a8000000006a4730440220682a664a04d4989b034b307ec85ff8584b10a0b707e78dc9c15884c259ad52610220611ce7019f971e2a50530138d81d6711d7ba0f971986495fe761e9ab5c948208012102089b7aff06ead07a3ae75a49f4c133ff35b140c5baf327627603cf1b2f716075ffffffffcba579f729ad828ddbca0e8c7eff8eb2a1735e51e0c600569cfcbce2bb64ccb2000000006b483045022100c328a9df64f53fd109af1e7290b4b2ab9a4e9abd9b965a48459d572bce0328ea02200e7a7036935f87e01df557e4976575ea3b34ae6ff7389332939a27598a40206f0121028700bde402f67b6a52652f9f9791ebc82863fbe2f366b9328f0463af8bf3c483ffffffffea1160f48acff9b1c31aeba1b51ddd296b4024872ec6c3485f6898c170cf98220200000000ffffffff61f8e3d12b21b08c715af620438e051f43330765c5cd2e818a5431dd989329f80000000000ffffffffb920e459ee79f5e1d564a2bb689f55ff26d2f86f4dff2b4617a12ca34d0b49a50200000000ffffffffbfa012c5496e9bb69deca27fe002dcae471ec184ff55e34cb93d1288ade1dc8b0000000000ffffffff84eaecb22ea8e1c10301addb936910a38e959570ee61cad25da7190f2d6b0d38110000006b483045022100b7b209a96e26f8425dd46fd922a26bb26398d6866c40a27fdf5119bbe3f4648002205db3e73e4e696845da891241d94b6d109595c703bbe82f66b9481e5591370586012103d50702cf2a9484989e2381c944b77631ce69b657e69421fe4f20726a6d64d66affffffffe5f17a50d76a19813e6dc3397cbc78da20b69fe37bce3251818baa398c1ff6b60000000000ffffffff8fd1a479715923e27ff59db329fbc1ea45abdd0b30d0fdf36a87f37afb9b0ce80100000000ffffffffcb4b38e3d9817ec2ab05cb9629ab7b2e80fd3b687d6fbabd829e6469b545ecff0100000000ffffffff2e30d84315d383e0cd3e8421b3d0c1c70fb188140460212fb7de2d43d9505bcf7300000000ffffffffaef3b78765dee527a8ff5295f347e4d6282ff008f71fa0134a1efada9647f7c80100000000ffffffff372550d661336078dd74beb3bf910dbba0226630200d8423a5b6a5abc031773f1000000000ffffffff6e94b7db8ed628b7be6157302d69f3b406c1004af6248436c6a9fa8ba74322780000000000ffffffff915dc6a72d8bc72cc332e62450680dd12e55536506218103ae023a5661b6b7310200000000ffffffff3c36f3ca29ffd1c85ee59a2245b65a0e7437a1ff78e30c02c5625999af41af940100000000ffffffffa28f330cdf99ad2646515763037b2df4cb5414ebf4fa5303fe635f17f9783a010100000000ffffffff8aa2d5b4d0a10e1dfdea8141c9fd3844303a7641028660922b41ae80ac58fb6c0000000000ffffffff11e1072332ae0767fe2ddfd27698ade75cfe78ff53886d6a09302b014e90b0110100000000ffffffff8d0bf9905599bb507ac8b14ca344f5dcc645300872d7eb196fb749ee69214c5c0000000000ffffffff89f5a26111244bac6a5ee393caf66801e7727a0096cc8779fa9b1ec4cd0c19b60100000000ffffffff5f2117c617a86feee7e4de2045244dcb772fb28adc4ea85435d2cf6ef0540ad0320000006b483045022100b03ad6fd0a79ee5e529c642d7e5ac35f09bef375b6c7a45a8f25f369a4b08c7202202cdf8e47c4efdbaaa17276e8ef73c4b412ddb4e3307bd59eacb2fa4abb62fc090121025e961c9d724d129ea7873439fe7879a9e95f77a8d5f2721bd3d3430ca84ad08bffffffff70ee3651c8730cb8b0e75935aba6bf549162f87fd9331709946779c8dc8b3b090000000000ffffffff0afe36654049d74584fa30de1c298d0ac54baa57bf8da73636af5b20bb016eff3a0000006a47304402206ce6cc4a7e4696796029edc5e0292b61a34c60dc92d19eeacae144f8900bb10a02200c4b71e7b8f05756ed2241a6d269e84e91313bd43b0bd3420df758dea4b76e9b012103e27d2896c162f8809b82314bfd87d8d0d45554e401b851d156a9c77f87bccd04ffffffffe0094a31df5fe7ce4ea43cef3df43e7c67869cd46066488821d70d29b84d13b30000000000ffffffff7e9465fc324d799fee3f303995f1efdbc26ce75ca756b89ab269b72d71def6ad010000006a473044022027dfb59df60066a14b3be40eb1c1b199bba99bf01dbd802e801d6b2a2588ce75022063f839c23023a94b8e7ec7fdd8b024ef0f97eab4db7bbaa3aa100536b478dcf201210382d51cfb0185f7b54c1a3881f50a95172e0fc25f0c2c2f9716a6b7a5ec797f48ffffffff176624907315da6299d1a69d5e28c450e0b990ead92bb15b8c6c53e05a96f064000000006b483045022100e35262d84556a3500a42874475937a0fe006947d6f7fd1790d9eef02a7acf75f022042d540218c668e72397320a5d8a4dc0a6b218aec2629c0f7d5fe3baaf7c0452501210382d51cfb0185f7b54c1a3881f50a95172e0fc25f0c2c2f9716a6b7a5ec797f48ffffffffba204cf4408066c7f4254738f0f4e2041fd86d373a265de64276a5e57dd944e1060000006b483045022100c075bf4affa9fdc6c3bdea9c0824dcaabec0be04e162fb803ec7ec1f0f25999c02203f531cf4a536e8fefdf2929dcd01b0c7fce37fa7fd63ded2058ef48f3da09223012103615ddc5d023031f229047923089bcce37c135c49c19c528bea945f094bd87f52ffffffff237d38674bfe453854e3027e973be6e5238afd83368b76ed6342611a9eca1122010000006b483045022100bce8375405eee6debe2a7c645d01fcac9d3a82c80c8c78ceea3ed5ca00327f9702203860f51d5122a3a44459d7530dbbce6eb2d283bbedf20260f3986fe8a4114b0801210382d51cfb0185f7b54c1a3881f50a95172e0fc25f0c2c2f9716a6b7a5ec797f48ffffffffd057058dfd018405774080be39e63a7a2fc1065531a8983b187b8d75ecbd11ae1600000000ffffffffa32983aff94e2ffbf1e72b9718879c28fb6154ff66474b0b84d1d793014ca5450000000000fffffffff732ae481462d3ad59294797db183b0b204818b4594348c0b5c3b0934ee4b4810000000000ffffffffcc30fbc27a377a89c0a64b6a5d7872df51eafbca693aefeb4e92a29595035e030100000000ffffffff29baaf6a725d4d5a7ec55131ddec11f8a06113f9dfb9994a2231407c8eec43520200000000ffffffffeef50d26f3521c8acc5e7a89f694e3c1d9f38a0da99a80ea832c61fce8eba1771600000000ffffffff1d62af6dec09272fc848860d81559a8c3a41db2d8f7ff4f7fe9e5c30db4f7b350000000000ffffffff2b6fd81fd25cc0d097d59c37ac1ce414249fa418f1a237696c1e3b9f25d337ba000000006b483045022100a03528d654f646b3f214e1a664ab1cae5ae50a9b01bb7559d6c8a6630a15bba5022054b4f1c51ffce65e4edb4c87b52d240cfa12532f8a78113486543a8e28c38581012103615ddc5d023031f229047923089bcce37c135c49c19c528bea945f094bd87f52ffffffff1c336affdb87314dd34feed0752b5db632c4e9306a1cd58af4e746638bb14eb4000000006a4730440220434296e2a5d357bc18987acdc7d5235278ae6bc176dc8d1557a15bf7d5263d32022060f63f5e9ec32472853cdf0359af89148eceef4cc7010f169d99505a9f3545c60121025cb9f489b420b43bc0c7fa1d0c0916805ce6f80a2cd518f35565792df40bca79ffffffff544e75fe6a2aa0f239d0dbdc16d78db6558f98dd695bd4a933e20dba8dc1022e0000000000ffffffff8aa9aebbf92907eb16efa94bec80a567c0f7428efd6afe767a690f477be9ad4a040000006b483045022100a39e08659e4a9f50fd24fb234a7379c009ec573dc76f10283e8569d92a87fe3002202d2ac3b98c84a4859b1f010d8255613d7015d9c94053c468ead6a815facc3729012103aa376076e3b68f761bc2b293d1779f8c16de8e794508367e6b0643bb754fd9caffffffff96171a7937f2a12d4503b0d82389ed86a0ad5e63555f4b124e0f9e07e17cdf0d0100000000ffffffff53ae271006f2f8d20baee68ea02f8b80bc26d095fac1f1576e292fef8c7726540000000000ffffffff23f33484de94cade04ae512df02a83c8d642f4bd8cb9cd6b259e5b08e2490f9f160000006a4730440220608941f06609572b249b45a196bad8589a50ba51cdc1451ff23ff9ab0dda578202205850f2bc5cdff34e3a2e871e77ad810f3a4de066f19a68766b3edac643b785dd012103603dd38ff9e41b0c97d41c25c660a9784b1f5a472ed19828075762dd3fecd91effffffff3f1e5db297c934a237de1b4ebc91ccee2c2632b9ebb28ea3499527637b1de2864800000000fffffffffb30691b3af4dfe917671f4fcd388e685fc3b1400e773060384478cf505ce43c2b00000000ffffffff9090ff5b61ae88dd0b1b8dd194cca8476fd9384ad14f2c1cc32736b1fa699584030000006a473044022017b87348f9133ce05f93df7179940022e0ccebe891f807058ae7ed5207d19a8d02201973cf9bb61c314f647f65da6fd8adca8a763b8729333c8822b94d855536d596012102b5ccf0f9bf5fcc519fba5a9f6450181e30e8b2a7e2bb4de27417a3b75abbde4dffffffffde9a4f718b3cc1741a79477e157b8d68b353c284a2fa769e12c0d0f34d87209c270000006a47304402202082c34078c9b7053c0e96aee192f6577fb69c55f94b3f4f1ab81cfbde258d4a02205e394665e86492814c3834c80d29d418483a33c6ca403085979377de0efcaa7e0121027897a2026a645f61af4727d6e451dd9b9da9e207bf87c1f7a0adf4b278cc7a2bffffffff3e8de374fd110fe098563a519ae7d17b6b94c7ea29ca65771baa43a88a99ae94090000006b48304502210090457f7c54b93cf5f58444da65173425cefb92cb3807fad7921478ad9ade22e602203cf68ba52dbe1fd8d6d914311bd7d4cf30a20e198298fa0f5d903426d341e658012103aa376076e3b68f761bc2b293d1779f8c16de8e794508367e6b0643bb754fd9caffffffff780fafa47caec710ed8b140f8ccf3d3648147177c019efad9aeb4c8b5c0ed8320100000000ffffffff043d664b58d9980dfcacb35022c84e2861239d225979e39f9fab5ab04ed69aba000000006b483045022100c3fa7ab797a1d49a64a320aa729dec7fa13ff12a390a5d8d8b9f08d47bd9579702206641d3bf315ef64729bb48e876f0ce5e4e548bf5cd997ddb2710d2e71bfa6baf01210254b2d5ce88775a0c9a5b54c32be4edf5308aaec79d3649c242bd5e6062677cddffffffff02aad921000000000017a9141e54aa54973cbb78d8b45f90737fd189768f08b0872360f69a00000000160014028cf61a8dbeea74108326ca2524a0009e9705740248304502210098c5eaafe44affdfff35722bc19ea82602caed1233b45c0c47e870387db7287c02205a2510e47920bf25961a23a449721e646c6c309658fc946ed2a13de2f1e8ceee012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583300000000000002483045022100dd3bfad5b4024505b4c38b485764a3f76a1cab1645fb8a9c92b2d5bfafca8a8e02204a087503956fd565356ef78d7abbef9b410ef2e1294b3f7031b81a805b463ebb012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100885f0d50e56c7e6f915456ea14aaaf998356c992a952abc240fd84ed6bff8803022008f002ed81df37a408c5829819efe780a33dce9db350cbfd1c8f78572f9d0842012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402202e6e11c60741902134a11857155ac431cece2f0b9c7e0bfc21ef678e1cd8f2fb022056c753ff448d7e0315495ab56950a5a9c8afa6aa83e46c80d0cde8edb7abf505012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330000000248304502210098879304962549ea3c7447fa2e0a1e36b5a6ccb4319fa6041deccd16458485d802207521b2a3e24fd1bd1a1f9cab57ba32524fe7e0771cee7077bc11e3877bdff2db012103692338fe925de0a69c427b82b92fa522647859b8ec4873a22215afeb5e6381e300000247304402206fc832956904057cd91fdbb91ffa20d6ed68723671fe677858bb1329205d821c02207fcfa57a62bed7702e83e2848b143731f0d8c1e663960bb88fa440ce619bacd3012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022034355a59ab687c721daf6607a35ff9089828dea82228d268fc73dfc4fcd5ecef0220229572fc562c2e317fa577f073fd3ee8bdf27c6456bfaf1d94bfc6e5547e7d18012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000002483045022100f016ef9b944cbe6af634cb8e3df241b09403b75e5c942d1da4a54ffab5939b1502202551e75ab3c5a31fe847361ef28b3a7399834eddace179839c1ff6b57a3f72ee012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100b489abf70f875b5168c274c8f784cc723ad8343db23870c69c14d4efc853dc910220672abfea8035b5b31a4a53dacd22f1f0bb82f65fb9a34ca0fd4823fc76d8ba18012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100bb53f28dca3717fc0c4abf0cec9d76aa59ffbc131ddd268c0e586820b157048102202ce6898e06a0292fd3a125faae0356dd2421ab4c359039c5f9f5e9c75ecc48f101210366aac659b167fbdc9f0c4e94f488cd03dea679a40a3c3be9c213d60507eef34a0000024830450221008fa400be8397a4884a7ae9c62116dc6e60a2c60400df47e176372e5969b0e108022039c8dc91e52a53ef1534024817b243162c826a2bf4749cc8e7b63722a1ece227012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b000247304402204aeb719d7e15432edf51d08519107d82642534d3a041423d3fbe84fff5a721dc022069462833d39b1623261aa043d9ca5fd372f20d32ba8e07d5718af95ad9f54575012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b0000000002483045022100f3ad6f2bad9248d4c47ce1f4e160adad98f4ff96904b3ccd9cf94dff75e766160220304a44c96fd395f7db862faf63915ea618cf6d55f55279e7c87cf0fa3f082a43012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402205975033fa8bd8d28b4f92f36fa825f73cf2ded55aa19220081bbec0a5d75d95702204c5c06053cf86237c4434705dcd0589ec84820bc47dd873938f46a2a64aeb1c5012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b02483045022100cf6bd7478cf59a5f18329376a067cb4c481c3b778695e62410484bc69a0ec2d50220768db1a5ac93a06512335c7aca07c305284eeaf5cb328eddd77d7114eba85d4c012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000000024730440220055c8b31a1c05306982a3ca46718ba680151ce61f9b500912690ee84ce35d62c022007040a1f14473a4d62c7bb2b03bb08e6a8746e27eda714f5a1251a605e6cf545012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000002473044022033907e47b9647425a45ce960847f9edb2ff2b47f7d6ced3e042290df9d47e6a80220125bb2d8a76f788d00c1dbd3e7775758b5e9bb86e278e26fe6507e0fdad59f59012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000000000000000002483045022100b2a35e96f94049700f3f73cf7e7d555bc3eeacdebf807c856c3e20c5b726dfa1022064e2628598e03a950694a8303650307662dad1ddc0b8086b64cf9103144fcdf8012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b02473044022047a16a075ff562da6d32258c1fa1ddeb90ffa7bbfb92291cb377032afb061f3402206ad98fcae7ea0245b2b5f74670308bc957fb65fee73da43c525ea2b9a70792b90121029052065b6fe42aa58eebc9750875f39b851228303e9abf0801aecc1d8ffa1e000247304402204323ea0d6b023c5ae25995c8352f99bfdf10166e1327edd7b6753b22464ed24502202144981368408fc9587c581745b3712395657d89e856a6b13e254e364ebdc678012103fa64b97559c507af4dc391ada8baed5a4cf84131d27173ac52dfb6118ccabc0100000002483045022100cd2072912f78d4b9a9047b8afdee8e1af9c96c9630d667e447684fe62bdd61e5022044bd0037de25ce8890238ad430dd745912647474cd6f425f93f44bdc3d52c6cd012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022019973d135e514d863874eeb89b2a7e20582927621cdb6ccd4ed716da953d12530220510309554a84c828ca701efb0b982a44dfb1b7244753a9069820bde4e3e9b1f301210326caad8ceeaa0b4079abffbdc1d3c4f43c217457d3070721dedbb875c5ec20890247304402207ba611369d2d91ecd866b796e64865d836f848af5d273274d537558473ce7c7b02200794d5d08f5ab5a79e3026dbc74186ef4951bb4497d08d6bee36452fda11a808012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100f5bde00182fd54cae95d38f8e98af6fa6e8f464489b05bdedc15769ae9e92eba022038d3ca97b2509558a8b8791271d4fed3d72995f9d7ce39146edf57a3be3c607d01210326caad8ceeaa0b4079abffbdc1d3c4f43c217457d3070721dedbb875c5ec20890002473044022020b45fdb57d835959bac06e6a1e7f339f9fe82daa9e3be54807b67bd94feaa01022017d36c9b8ffbb207dbc81f2f75ffc67b25123879a24ac73390ea4fe99d9e68bf012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100942c05727a3b189a767e83d92cab9ca0281ccc7a1ac4367b1b03df8840b17ac802206d0306ad0016c2ec1521bbc0d75616e507630659b3e6aa1f2fc3891caa00529d012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100d0574a3ae430340d9492fee914ad153daad450b430df874e863a2923215500f9022004221903983517a39ccc10b9af3d5b27e52b6baef409a167907c89d9f5313d05012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100b0061cc46dabfec08d24b31542cfc95bb920a624b817aa91f4903bd453bd70e002200d510ba3ed3ca9f57a118ef6d8a5cb3b6ecdd21a69c6edfcbd6ff381291fa2fb0121037ce301e82d52ca7348bd5a608fa3b32aa21786984a82715c0078877cad1227b1024730440220460166cd3a223067c4c5c66718f2212dcbe1ec625fa83578120bbff6cfd0121502207d6b1f30d24ca4f5f46ee037caea2ce42a9d950714ac57cdb10d6d7b001977b6012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833024730440220377122edce0c7b3af106b4da3ee8661d866255d7962a792b2d035bc9e07a8a9f02207cf29d16f7b82112e0802e61c72c62958982e2ed502e82ed141473387f286021012103b78187a9f1ffeb1a6039c3a6834ec362adee2b00c8242575510882207dfdfb28024830450221009dc05f33e4c422b7f024e954d9349bb78c2a7703252e8cfe28468634a30b487002206b0f01fc79fdc00f7d10d878563b3304757a4805c672e9c8b4319012e3d22dd0012102164b6c07415e4b2f1c385206316f73179e3d74ce51bbea28e6f39f832a2105fb02473044022057da8e5f1882ae7a5f6467cf5bd536abad0bb123203ce28b508be759cf8741d0022029640fc862a92cf9ba8c254453ff8a2d65321f5155cfa93ac5273f3b31ab4912012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100e17b140699913fea05fea97b33db00f6b05086abac36dae7daf66a726eda32fc02202e914f49ce8ed32e222a64601b0a67163775be338882ad03a2fbd747ae3ad968012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100b2833fcdd93cccd0b9d32a4a52dfd26b17beea085488ebc0088b516e4c1feab50220649ce8a96a29e862267c3afbb228977dd4448288fc39cfd1d1fbfc840a0cd003012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022075de05eca96f3f8e6e16f22e1d871b72566ebe172a260e9fefb45bc834a5e62102200bd6a30ff9bfbed0d09a331b0e88ef317d62347f07bf6f8d722e7da7555ac2b1012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402207a0a80ba80313e0d1397140fab19b75657f17782274d5566bac06d7dbe8ef24202203848d2c57d54bde52066210ccdd627285fe25de71216fad9d0513de1f37816f8012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402206d947ceeac872fa169579dec7e782485ed58c728bc94e31410b64595dd2daea902203ef03a5b8835322dc0b62e8762901b5e0ae63f11a932096a02df829ffcfde6320121029e44a29b444bc42fba1addcd42cdf31281f4e61d3928008ea1468065d5b3c2390247304402202e3bd3e47c7dd51555c3b1cae20c240d053b2df7e81b8f6ec8fb7e8c0a3286bb02207fea3e4920e3e2436187c8c30f70605ce8c4aae8e2041aacde64a8107694d0f6012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330002483045022100995fb0771e7e5142b83b50ee6d12bfc8eac36b4c8bee9916ed1d4188da798d4f02205592a18bb9f095682d30b0d8c3a64c2a08dcec25d2968ff04caf0aa99062870e0121029f4c60a434275bee00bcbb140d44305ff0af575ac97928d327fe70eab56d7a550002483045022100d5f232ae8b45de1f58463c5549476d8ff68b5d0cfe4255c4e3013af24af851ee022073af7f8fa8ccdf97974766b59d3c218bec1478d2464f4fed88595ea3f0998cfe012102164b6c07415e4b2f1c385206316f73179e3d74ce51bbea28e6f39f832a2105fb0000000002483045022100f7ba0b815d361ba63fce8688a3b891462f06510ed833bb7b5159ed6fcf789472022013cbe3c818e8141c2874c28ec247a1dda1cc87290c3c21371a8353482f711813012103b78187a9f1ffeb1a6039c3a6834ec362adee2b00c8242575510882207dfdfb28024730440220332fba98a238fc2319b9fda8cfdba0443ffaf1033d50f4241077559fde755690022030b453be40e22135631f095fb1e44d6e5a672c3fcb6807ca1ff43cca834f9766012103e1a43046dd453540c438ae10ba2a0072ff09d64d003edb61d547202b21334916024830450221008baf78d28bfa38e647aa7f139f7cc31e3cd61d8556127033bc6b4020254d24b102204c441e13f17970518a61753ef7efb5256ccc93e1498e04dbb0926961032909c001210326caad8ceeaa0b4079abffbdc1d3c4f43c217457d3070721dedbb875c5ec2089024830450221008f33382ce7fb6535ca919f72d96b3b492a34e2baa59b976e4ac869ff31dc52db02206895fed4a9a21669cb3024c15af7a644ffd847b1f123e633ee1d9eb25df59aad012102dda68b9b4e2aaf3899704098a18d756cb930c5ec5a63327dce76d4271939ca7e02473044022016046cb1861419bf82f27260cb5e4576d680e3b7f2fb9b119cf617f1349310f00220058ea78d5ffa33ecd449ce122928d59f428f2d8b217bd52f5bbdb3f9fae51b10012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022033e9be15284dd63fa8609d33e895283a5faa6db77efe3d343e5cc9855e17547a02200179c89bcd02d4469ece27261f52aeb125abaf972598fc234198726870cf0b170121033aba9c3e0130657765d27d497990a3923dcc766ebbeb875a2dfedef012993dd40247304402204b969e7606af224725ed9a9da6378c1bb82f3bb695ce06fd27aa4f53a17992df0220232f60736c7c4831810abc85edc0d5ab930376b35e88f4a79a1a10c17d7bd93d0121028801f6ce6902f1c7fc0513da2ccb6bc03088bd2afd4a89890b50bda8a1ccf254000002483045022100ee3ba29ede1aacec8c6d8bd0c3e5764689e48303e6993ae0e4766c2e466777f2022076f8b66bbd4835d0be9dbd54567cce2d10f0b407b3a6662e866265623076425f012102b3833a6a1221b8475024c47f14852605826fe94ebd65bceabab835399e27ef540002483045022100b487ef914e9f0798fd27e7ed2603acec6bca1abb834348bdfcfad3d0ccfbd81102203d26302fe70c8435c04c87302b37c008d989586f14344b262158425240faf5d9012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100fd8608ee285bfce814e900d4c344c3ddad76fe9c4d426ae70d6b68fd77df6dee02203a3280df88a0deac6ce5291301902ccceb2b1a2da5a9e1dcffc37d7ec2bcf240012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330002483045022100c322711a037db1610a244a034b24382d9a8ca88978afab6b4e80c6a57f60a34a022008628d1234b90ed0b95d5179067ad4b78127ebee8774d585d8c046a8f569176b012103444c3d12c2f298ea142a20fe09b53e297d7530ea6e85f62f28b44d6d3249a56602483045022100c9cfe6cf9f742ab0cb0a06ff338b5bbd16b02845766aee602b6e14a7f70177e502200d54cff60c175b0e12b38e2e09e3235f6e3824041b5d0760457c601733ee28f0012103e05bee7e42959c001bad3e55bdfbfef31c477618ed729d274d73318a82c6a00400000002483045022100c11ec1deb876844738957e22fae2f8a7948c7df6f6b1dd5b4e96a770139bdfb402205a3d0ea458cdf4b4754b3677c22a0175af281d04a75af6b4a8d99f8a93fe6bcb012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330000000000020000000001030d8d5be601db882e0f0372df8d09f4424c77e6087d549202510d525d95341b800100000000ffffffff50f93a300088c6e1e8e939999307b919f7aeae9d0825ba968db72c169292612c0100000000ffffffff718b23f5c9fc59c6e37645a82b980404dbb0ac0639533a20b340b2523e83d1ef0100000000ffffffff027a111000000000001976a914730153d22583c6d81f07fdfc761994c80c0788e888ac7b94000000000000160014571ff8af68b11a40bd4ab4f8793cc96be95c93940247304402200bdfbc46057c614c8795647c6ee43581c3aa10f6868538b9498412bd904ef1aa0220782ae8c56a8edd8a9d82274e7c09c076380bcdf1ff94438a48b110792d82dc3f0121036b3cc9e0bb9996391a31daa1d0d916972e60483847a79bffc06bb9abebf0921302483045022100eb7097371685aef73cdb5079c308e8b7635958bebdf7094ecb79f2ce7efc2c8902207d2f2f0fdc36421355a169487115aa4f6beb37a4fbba548310f5660ed3ff9e0c01210302b200095100bd404dcb2a1d2997dee0ee314a212356e349005fefc2355f5e350247304402205fa3b5cb6be0b3ca9aa9b49754c10f21b1d9a1942966ae801963db8d5986628e022047dd556a37b40a0f049357a971933b85d430ae9cccf4792737fc7e265a360ffb0121026ff2fcf5f12283fadcd53b0de525f06bae9aed256c81b45b92985e4e2d3b279b000000000100000001c1184f713980c202ca3013781f050b511a8fc5ed56a0a8d7b5439d9aabfd946f000000006b48304502210082c2402e2cfc30f6d26ec9b77c6f01dbbabee91fcec8d4ef5968507b35e65b6502203e7f3b7e8596da255959b460ebfb21a36ec804b9b4c5cdb0f915a6c704f6b3cf0121032d1345b4be76cdbf70da93b2c5c436920070d98b290de74f4beb99f95525c59cffffffff013c041000000000001976a9143c22fe3023f18b1299c1d102bf38466ae4c356ae88ac0000000001000000000101e37cbff7edcd5bcb47e1bec965c4c3e871b4a4eb3aa9cd10db319b98c452d72c0000000000ffffffff0268d70000000000001976a914d6250ec132b28e47185ca7d3d7b115dd993a9b0688ace0fd6700000000001600144aa2d4cee585fd9189170d71297c828c8c0bef1d02483045022100d90c6b35ff98d81adbe7a69027357c38c5ecb41f944e133b55a814d24c58816802202528d80030f0a84b7f22c937cb5359e373d830962ce067a94d100e5c07dbfc27012102c769089384103c5e44361769636fe2f3d517c354a9a2285dc9d50d1ffd4fba9200000000020000000001021c24095922c9d9dc2a111655de2b31f690ee82f4184870a1f0003dbd6f52b35a0600000000ffffffffc5dba8ecb40b4af7bbec1a5017758605db824b43810ac5eac6c1bd00c96234460200000000ffffffff01c3c61000000000001976a91417e5b7b64552daa0c63e0cc3fd9f439d29e8aaa788ac02483045022100c08130db8a82e7eae8caf586516aa79108903eb3cce3990b55516bc7b73c06c8022031ff5e7637b286855b36acfe8461f0fe762a6cc220ac5638014c36144a494d65012103ddbff37e94a1a0d4695757bc8f15c4d432d2c45943e1420344c9b20481580dcb02483045022100ec2a9feebd1239b5b28b9806832afbd940ba8732b2735e3e8432849326372df302206730643faf84c7805a98631842018505e44ade06a2e1e97469e7e6f971c017c8012103ddbff37e94a1a0d4695757bc8f15c4d432d2c45943e1420344c9b20481580dcb000000000100000001ade582baeefc893410389cffaebc7c957d292532c1a0491107bf8cf0125a3f0c000000006b483045022100dd988cc39ee6da84e08116330965d92dd09db1910e897a888ce1d749884e1be902204d8858359b12015ae2d3b803eb1cb4bfd6b68982ed36ba1068f7db2438ae2537012103826ececa22c150d0abfb1c0c7c5133282b415e15a699e286891028b661bcb3fbffffffff012bbc1000000000001976a914be82ec7b99b976e5da605c14aaf7a558387dd4eb88ac00000000010000000001021ee9a86262652d095d55e01c5a08fd412562d5061530302c40f5d60f988a2e6e0100000000ffffffffef1e9fd94dd6a05dfebb34941d228ea73c39f05a1199f03d4fba81abd48e814b000000006b483045022100adaf4007877912c985e1b1eb7d467ef8536f7480b4df518c0854cd858ab5f3b402203f423b8262235fbbeae8a02e82e4fecbc862a719819972824d085184e472dcf50121036011fc192a06514b830f14543ea4247863bfa2733f42e534c6fcdf8cd0388f46ffffffff02404b4c0000000000160014bd7d18a66cd2cf18255ef3bf0852e41b1d07b3a39d70150000000000160014ddd583548cd0b2b3bf8dc24afd06c967ee9af2c102473044022028c8862a05b95d9adcd256992986ebfa1e45506f1eb25792034b6fd8a4e060df0220439861d1644bd1f5606a4687bc2cae8ce88d056537e12233133fb9e9e2d095ae0121039a43865edc5ca6ec5922f9cb06a126de6679784a379e9de4e4c909ca05139bfe00000000000100000000010133197476f184eb10510d33ac05dce1db4e4c8897a776f6b3b3433a9aecef67d73c00000000ffffffff02073100000000000017a9144d5ffd2c0d317877f6ff48c4046a0b6a6be84b1587881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d8702483045022100fb74c66688fc2bf3d086a2fb07487689e0ef62404059f9c47901a913b476092802203f2ae6868f90bc288f62169acb74b042a29534c10de637a384b6d8512f0dfa4801210337f9ddde1dc2ceceb2b0de13375334f19329901cb4cab8c19b358f7d6e03a17b0000000002000000000101051ebbacb17165d86ab2a8320e9a778747183a5adbde50866d4fc1a57c0c5b381700000000ffffffff0246a107000000000016001459b577ebe07f1293a162dc1475e64ced1f1e495f98690d00000000001976a914bff995ab3ec3a37bebd8b806dcffd64d483eb15488ac02483045022100c8aa5057fa48969e024ad9cc6c553173199abc91031c4ee33ddeb1184e767f9302206a7bf605ffaea02ffa08e1805bed681112ac654d64be8a00f26d946e3530ad540121037e0477d975fb89506fc189955a0c5b1f16774a287d7b262497518e94ceddceb20000000002000000000102aab8f2383ad1a18e0c2f1d4abc7059578183aab4bc7ee0a1bf71592ac6a080dc010000006a47304402206ad2abf70bbdb185e30df891f9934d53b99ffd656f965659b3ef964f757be42f02203f3261cad805a4991f1103c2b3b94dba1114790fc03d6e3c84b57ff915b83cc30121020a861cc0f466cc91683b9ac1f8c7b33aa04b51b0073cf09368df8c999773a285ffffffff8bd46ec06daa6d3a8778e220ca0507bf868c88435bf8ed586281785b3024ae140100000000ffffffff028d090500000000001976a91493e8a2cf3406f0f3c530327d82b254f13a77124d88ac0ed403000000000016001459b10cdaa25a287d1404365e3945d13918611a79000247304402201c8db0a0bcb2b4561e6f28f95304cc2f116a37ba57e2ab1374077b97650e5801022019ecf1718537777da381db1c7a73cdc9b2453042662d9d279dfe8457802c74ab01210279b399824c41a745ccae1932365767aa0ed211e465a3d0d029c7d3ab35dc678e000000000100000001bd50a52067034c631e7787d1f43444162d485dc1ad538f5e42041a83bf0184ad000000006b483045022100ecf39e48beec9c61217b5fd1b4b0ac5e90ddad15fc782538814267be6a332e1a022021d671235db8a921aad3a3d1024443d5548c93ec090f2c6e3b1361be09f5ad260121039c4dcd98c9182cd7b9eea47f96c3a31e464cfb37a7c6293bccfd08b4a746d359ffffffff024d9a0000000000001976a914ac3096b1b033f47dd89c120e5765f1023aaf024588ac206104000000000017a914935b875cf07f6daf1519952f7a150702f15931ad870000000001000000000101d3c889b7ec5bea96406ced757518f9b333764c01e3044f41b6040d07fc6f179c0100000017160014c26d05b0811179236d1da413115292b16161e39effffffff024e19030000000000160014ee15e5dd4827475ab67c843ea3fcd465a409df4e47724e000000000017a9144a93512fdd7e05de870fbf399a3e3c361bc57e108702483045022100f968abdbc5b06b1bb779657d33e2d82c7cdfeaf914b19e0a17013061b70dff92022013f74daa909cd29c1ad19f79bd200f00b3fa4337ffe3762776820b9f64ae7f06012103f4d04fb07ae98adb683fd0159b0a5d28ad33f17a97ba711d438cdad4b772f698000000000100000000010182a41ed1990cb274f0387500e5cc50dda9b9a1f02393dbe32190293b34b8fe88010000001716001436fe05201cb0ccee034c1c7d96be3bef5eac7740ffffffff02c89209000000000017a9143eaa99161886d5ec192aea976406dbca1b2cd98a87174a1c010000000017a91437265b59af8998316a0934cb26e8e642007ad5d78702473044022068d4b87ec77a905e4eee1143aea42fd4cae9405d195719e424478e2e30e9c3e402207537f4d3ea2e8a6dd628b60d5397c5c5c1d7ad4c1696997852ef68bcd86f0f240121021eb067b290a3633f2709be25ebcb3b8934280a4bd9a63d0ab3966985f355794b00000000010000000001011c45f31469c50c4f58e3f0f8e1bfa3c86a841d27a7793b3932b2e9c38c27fc800100000017160014314853a6ff4b366d478cc20e6a4de40a89af0ba3ffffffff0248d005000000000017a914eb29643750de5c4c67072364f556e4a18386002387b90d19000000000017a914917ab5f3d3b0bb00ea7707914ee0c989e114069287024730440220562777acbdef9d3f74b0da090b9aeddfd887948ddeac624cd76b907d68c4561802205fca1313df38c8d723ac6920a9b168f45c16e550130d2edbc00b39259e1d85870121039c669dbef65e87f254d5b838fd342f6dfb84b0daed2280e1889fc63dc3b8c1e800000000010000000001013a25abde48f45a1744daee238dd72e1cdb553bf196d5e756c6fcd3513760863f01000000171600140b9e064f46a166074860a904ea0f0217e2b7dfabffffffff0238380300000000001976a9142b2bea9bea22f4abe954655418389fbce37c80a688acf30d57000000000017a9141bbad5a1357d50349d2e8ea59d860e3610e3df348702483045022100f4ce45662f45236bb49f96c530212f55e4bfd4f966f420cee2aea5074be5a54702205df95e21769654ce8572357b167c07fad1cdb750ec4bf5efc8ce4e07c50cc5ab012103e1bb1492b53afe43bb959d42c947072ce2133e6dc016c07e7e2c36cf4b5b0bcd0000000001000000000101ea1232999548830cd5da5bf9baa957312cfb5704801dc0eb181cb527922bf5160000000000ffffffff02881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d87c22e0100000000001976a914d7bd330b0e0b732f8e4830bee7a5e5248d00f21388ac02483045022100ef16eb8cec83a57400fa7af3c4665e834fca5d19be491116596f89e2cd4cc26f02202df830fe88380ca1825ad588d9f4a796de5f20a08bb9d3ab6b823fd7470e257b0121025810f36a580f6f2c066824ae557edaa95977046d4fd778cacd72dab8527f3b4e00000000020000000001066b8459b79e7e1f5a77e9df540ed7b4cd1a239f20aac56f5ed2753d0ec61d7a4d0000000000fdffffff7c51fe81b08d181a7a10ca1c52b1184e42033689ca3b518b5d68574675ae053f0000000000fdffffff46baf451fb7d113da8607120ad51ee131490ca18cdaac4fdf19c920e85952d980100000000fdffffffdb67f38fe06b021aa866855f08db9650d2473da0c637f18116bfbd516e33c0ef0000000000fdffffffc195eafaa333d5fd98bf3f9af81a6d9e5099692d5fa9209b6b24097d3b6060110000000000fdffffff691cf2aaf327a30266aec100f694198aa88616b808f97e178bae1701c38929460000000000fdffffff03485f03000000000017a9149be0b0edc5ca96c0b6278f1a3d687cc37a2406a187485f03000000000017a9147c768d8ca794a5e9a7032b8576af5680cc03484087cc4200000000000016001475f776f349d5a9c5a56557caeca675ffed48208a02473044022008ef903e928332015ba248a4ac535907a75564ecb40267fb52025ec6c3ed88f102206929506c96f1c088c68f5d9b066240912ffcdf0a58e23ae1e72b07423ba79dbd012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c0247304402201fef638859e2f20c2f90a610fed6a04286c9219836910ec38ed803e658e906a50220751fd035a43dfbc86a2235aa51011dcd1db9f61dcf0a188a9aacec44e3a8f67c012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c024730440220532b4bb348a753caf4ea7533bc8aaaae00589ef4719e106aeb5e2d8098dfa80a02203aaea497797af0ff17769b6345a06e4055ed81bb07f8c2fd8ed70b7d742f6d55012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c02483045022100cb418977eb864beff119ae8e4dba97c0b5bc6d69b8c3bee397b0caad6a658dc202207da2fbcfe5ab19a3af63d7e4e8f3c41f9eb0652e674e567ccec043fe42e3dbb5012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c02473044022067591d5633a66c58fc97c0e19edc6032e70c54addf1ed05fba71dbbfa9d4368402205955e1d18483f14ecdc517403012a956bea5514f23ca030b5f1478976015306a012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c024730440220655d7e6666241da9274f9214b9c94c648a966768c59768f7ead3523f9e6ead2202205681c0c1dea9f4cb712af37db4d2ec6220f17cb041bd5093faf5b00e45194399012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c0000000001000000000102194e0bc8f9263be4fa02aa327bf6f08a4df1d4612c4af7fc8a02c91d1fe027480000000000ffffffff9e0c352fe63fe0837739f315dd7d69be64410df97f30034d1d49da979bc34bd6000000006b483045022100baf7d64fa31db4341fbb7179f696dd41696d32fa7bb1cde4cdede24b349b061b0220053badf0072635691f50ebdf1318e846fae3c31b828f9e7cfdb99d296c99b63b0121033f46d26f3dd11241fdd9e98aae66d36ab894f2bf9faa1e17bb5e1983b021f1c2ffffffff02d0460200000000001600148fc99793827d8819794211928bb058f13881a528f1ba06000000000017a9140a4583a2936a98e90abf655360ac20f8b659b36f8702473044022027d6acb9b105e5e296eef71b88b1e51d9ee87a46d403108f61d356360a0c180002201b6358d416ec0408317efda9a17a712e0db72ac49aee90f6dd442b85528cf1d701210387e5d2f6e20c79979eee6679df26ff0a4f5b6922e3caf2042c7d74602c0b3d57000000000001000000000101696ce5ac0856f551ad64dca6eb2a6dfcf06b5d0f838c8e5b2f3aa1efbf982ab40100000000fdffffff02803801000000000017a914399bcc5079e368fc17617b4f764619bbe105baad87ca20340000000000220020943a204c790fae9f2bf1ce501d3ad48487d2193c2a6af781cc6391b1522301b0040047304402207bf260b53a2930278d5289909d35e082d9cdd44845174620487287570f6fd22302207828ddb347b98711f7983090eef37e7c9429fc07e05fd5dcf5f802cb44e82d7301483045022100e2c4c144fa87b45f4fd99912fffaf4cf1772416520d0dcd0b25a0ad10f403cd1022047c64d5e6cbb477c21f3b23246dc3508a856b0504cd36b59a75b48c2622eb15f0169522102e2e1113884afc4bda3fbe2e3eea0c3629df7cdf6b81bff915eebb4c44cfa2d4f21025cc02ad10826c07c2a1dff53071829e6f1597ff89b7e0ab67a154fbed7a0b0ba21039b76a062d8ff2981a6e1ed84b69dc0c4f08b160ab834c1305433beffe13caefb53ae0000000002000000000101c25d15754817ddf70b742ca6436149f63820e3ae00e4268ba324ec41d1aea627020000001716001438718274cc26961324107c2530f8814283d34a25ffffffff02b4fd20000000000017a91474e83bbfe338614f35f74625129ce789fe7c8a1787fa1543000000000017a914b474994b43da99f91148668261254bd2d8772ed88702483045022100b57b107420af9ac86ce93c36a98bf677f65d8c7720886cc068e3f7e6b0b12bce02205815c658c7702743df0efefe2efbf43e63c5d1294bbad7cd4584ba3eb8aaf5bf012103c72793ae597493b967ce917198f883e5935843ce97b6760bb3ba4157dddd63620000000002000000000101d62b17a35004a6836b0538f1d3f5507e47282036980e243475b5ecb365788d880100000000fdffffff0101380100000000001976a9142ed444b77543024076225c20a276d9fa18984ead88ac024730440220193eb6cf7ac7bad29bfbb34e3679f23e1f704403e5c00d289b5945510623fed202202c5087303860890dfc504cbf3fdf01ee691b2d336fbe44acab099506727b3bd8012102607ad6bfc288031e35cb1eb7760412a38f2b6d8a59f7af335b3c2e74c657326e49a00a0002000000000101105d54d9b6468945560f7ff1f89415cde159d1bd8b9769248fff945cc4437d8b0000000000fdffffff0119240000000000001600144ea34a956bc90c3807f048384683194d68034ad30247304402206d354f7bf9f0805a07869ab5299990159697ff96c4d3329199caac0720a9325c0220193ebf77f0a26364d6657f50c8d949fa73e5c7be19117cff6a3df5e94f018ddf0121024d33e3667717cef410e9b7edd4dc777a2e062c9abe372de0859e4e205e2a7ab0000000000200000000010105a03b6b7f438e16ab9907c566a10624cfb033cd60b4d6604638e4f0238a575f0200000000ffffffff0105c10a000000000016001436a13cdd3e29893a95c3178d9ede1ebd4db162f402483045022100e8381483d1223b16649a8835e1ff8de1745e465673ad749f7176db4ead68e84102207967163933205977c715df5100c5611da7e40b6ede482b3435f3f0b50341d54d0121035982776380ae82cfa9310881f46b4c147a2b148894a579a2a391ec3b2000c002000000000200000000010180ee69d9c47f7366252166d3f4c494aae3eea1d6152ac2baed179c1091cdcb4f0000000000ffffffff0194450000000000001600147dc43a9fc7e0029450bb62f6e0e63c84a9a4238302473044022012b900a9bd7d328495d301d5f8ea66033e660887945468988da14d6d032268850220359c6e2a713ccd6f7d1d6b7ff572afaa7a90415fe5508bda98d3993dae994d6a0121035d8cc7c58e2beca0ac9fb1110dbda85e22d2c1edc6e473abb7d7d01558c7663600000000020000000001014b33859c30ee5dc3075342afec638e0f7da5c00f3191e61c792416f6f8a94ae80100000000fdffffff01c1bf0000000000001600142b7a181592444e3a9cbe4fcf0d34afaf924c24a702473044022066bb9a79cb31efc6ccf5d60d853682b8f75382f671c9b8d98eda3840671d0192022079aa0d11d3a76c388417ac6f893a42181f10a7fb62be5a8fcb44ff87f793f589012102adc4f92ed35be94abc84960fe10a62f60eb7e751f679a65a47c2f9742617688b00000000010000000001016cfe1c7fd8c048e2a8c18ca805d17c17ef7cf049ad33435e88105daf137565bd01000000000000000001a9731200000000001600141095cebdbfcb21492df7c6155f259b7bdc1f36700247304402207282f84c274a067136972ba7ba3dd1dad937dae6b29a1272fd91bb0bfa3a206d02204cca3316965a753899db01306b6f4af5090a0ef7a7df3c864587642b4a6305000121027c9925ba1d34ab560ecc8043486aac80da68d9aacc36904ef5b56e9e73ef130400000000010000000001036b8d09670b30128eae779e378faa878fa625b487414ea52e9287dfe88ca415a901000000000000000090f028b0b0b7615e5d8376c834d9de2657d7602c1627a9992a5e4d7bfafdd63b0000000000000000009c209a7cbe7db5bbb864b40711366c89b88ed78797877163e18ed45ff51162a8000000000000000000028eb61a00000000001600148ed99f1ed6db7da8f11bb1e730526763fd65fdb40579000000000000160014e81a4655cde6d134715718759bca4f7ab2ac7b6702483045022100fd7593cb3bca39bbb41b964943ac5ace7e51a71467d5657c0994dc49dc136bb50220511f808a1c93f8cc274c9fd9922dc8141068005eee09fd2dba37aa1c1a22bdd5012103973f5852d0a9dea4f56aa9a9d08cd24de2956942f869ee6492e897401d0f8b1f02483045022100e77b2c78acf836d25a5f88574beea078662e6a2b186d816c210671ddb65a53bb02206749c7261d516b9333903c2d6e48c037af721e3de3ad03396a0eaf1a1f2e703c012102c1cf730cffff2f36cd8d72d5214b2b2b9fa3ed6c2f565bb012362a146ce64fe30248304502210098359811ce4b1c1ccb09b9cdcc332c27fe389c8a3ac6eae1aaa544ac4d638be702201152943b8cae1efdc22999f31381f1054aa4605097b738721879bc4a5eafab50012102c1cf730cffff2f36cd8d72d5214b2b2b9fa3ed6c2f565bb012362a146ce64fe300000000020000000155d593d8270c0428e3c4fe1044d388d2b9626d91a2dcb46ced26839d95796da64f0b00006a4730440220481d9f7b8e063e5565416458fb9e242b4e347b626e3b2ed4d22adb6243e9361f022023dd432469b53b110899070ab250dd759aea4d9c90221201c3fc4b3e1c150a53012102d015515eec53d78f6b956442a5085d66c0eed5214dd4b47997e28ce24cc5196affffffff0152ce46000000000017a91497bad66868f56991d1008060bdcfff9f083bc746870000000001000000000101c64e924f583371f9c777434d1b7f010951c84d35c0a985c8661c66681c4ab54a01000000000000000002d8590000000000001976a914e9cbbb15e14253581446c99d489b89f7e2e5afbd88ac6ca6d90000000000160014ab88de626b83ca4b03084f0bd5495be91a15a9ae02483045022100f0f908c18a2d629653aba7d9284910f9df9e917c0f3512f7fd9b19a0e5aea2f902204b96b0de1b4e577e131274755759924286e14efa461cab7c16d0d71fb19f5c380121020931fe37f260eee7ee2e875889a0e2a60705119d979ec01682fafc7c01c8715300000000010000000001010d7343636c0eef7483117aa01523b5f676ac316c464a09c3f76d6fb6128d8f8a0100000017160014306090a8f9318e46fcca39bd03ff5156ea25ddcaffffffff02cf730b000000000017a9140d9b3b22d6df41e21697d7846f83ea0121c4f3e887f79401000000000017a914ca806f724012e1f66347257de04e931948a0bb138702483045022100c3b361e766e47f5d1bbd2a267ee01eb323cd8c28957dca95058c3288df476dae02202caa0ba51627aabbf30fa063120c1e17d972358cb2e69cab55f47344b16ccff20121022c25bb1c48b71a0263eb4de84b77b447fecdf26cbec2b432fedcd03a983d5fcc000000000100000001aa82dd83de64ab54de31a033e4b3eebd0af829f293ca01923e10862d64ed11ac010000006b4830450221008ee6ebfd0d9b9c2bdabcb1ca56bb628ab4a34d9cde01bfe28d5bb2429fc6d3d002203b7a0343861af42fb5114c1f8efe01ffdee4875306ee9eb40363ef9e98f6cd420121030ab53e5afb206c416b5f73e2311b9f25346dfc8e630e87a07e6b200b038ea38f0000000003220200000000000017a914558a7e0e0700463555d19c552185364e74e1c6c687389a6e05000000001976a914200a8e13b937fe899e5ae84c812d5a7905d61ab588ac0000000000000000166a146f6d6e69000000000000001f000000155ae6a39e00000000020000000001014b8f7ef22f7e10e65dd37da607e90a416a719136f31d04190c0e5e0c6b2c02dd0100000000ffffffff015e5940000000000017a914c32b0682654aaf10e1f28f77fa8e0ffba6104bed8702483045022100ca63d059b8dd39594ed111486f41326484228a4f33968608a19428dce11cbf3f02201efecea743306aafc1e0b299a9753d8fbc9626a2cd4fef1f4566447d6979b4ff01210318d9403a426c37f75d32724ef86ccc444488ef070f0d6b3f618a13a386edc6a10000000002000000000101e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1561f00000000ffffffff0190c901000000000017a914f251d96caad272771b9066f946f6a6f1bdb7c6cb8702483045022100ca3f8b4fe52776bff08f48b78ef4e784a7d3927aa693de0d01db647b20bf3c6102202ab71f3dd28386b0924e2fc5dfe8684fd9b98e225da255cc23fb23ee852f2346012102d17310ddd524f81638efd65f0b653b87fda40cd3cb1ee27152ae209fa1f2d6a600000000020000000001012356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1015f00000000ffffffff01375c12000000000017a914e3cafc7d5896ff486181fe14313fce5bae07b75b8702473044022044ead50367b61fc3c3db0eaca31bdc232e17df725855f19b598a8331a5f763f3022067d8b1ece408c3fe88346efd66343a57f84397715c7ab5eff0073e118d086d460121031d06b08a6bdaaf4b6ae16757e9d2a33837eda44d90ecd00ff28c27a95bff889d00000000020000000001011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d41d00000000ffffffff01afc407000000000017a91434e36a7160701987f9c3c2f7ce0df675a6288617870247304402206ef9b615f6772be33c5dbd15b32147977428b6622b23d76f47616645dd0f72fb022057e54d970c85ea994870411b5abb8b36d35027df14beb676f926222d045e19c4012102503e7805067f5c4d73c85ebb42113d7d8cff87650a5d9b876c2d679894e53fa90000000002000000000102249fd3160404cd00e8ec8ca15b399f7bcff08b987cd89dcd2ff525a6cfad521f00000000171600143c5d37a5f8237a9d10faf256b1065cfb97a62dd3ffffffffd54f86b334d915d380e017d4558c2effc50f0b66bd510d25a3810a2c7e971a850000000017160014781193277ed7d8ed4ba854970a69069987a9da14feffffff03af2d2f000000000017a91401a96ba81d91b0596162afa8fca9190da17a9f79870000000000000000166a146f6d6e69000000000000001f000000174876e80022020000000000001976a91421e08903a7aaedd8d5fc9bcfcd747f12f424f5f588ac0247304402206c476dc2a1b5fea8cf0ef26042c859284b5c50c7ecec49dcf51bf20ed7147a5602203b7b6a94f1b79cdf189b05cc41e54fe02f2f73f9f64ddbf1ad79529bba6f54f4012102a847352a29bfffad4959868a2c8683d790205cabb28b585a2ecee5869d77810b0247304402206110d9918792cc3996d4dd7896bd9e4c90898dae85f43ec5fc58a2492133186f02204b16b5ffcd8e63ce14419c6307c4f620a5969fec56883a83c9779836d68f45a60121034729a10bf935db28416209f735700218d4410b6a25050918ad821edf4b98588e0000000001000000000101db744dc6be182df9e674c9001cb5f3c524e6f56f9684b736bafaf2003d3a2f8901000000171600140f5290764f6e7911340a63423a7344957a36563100000000027d63a700000000001976a914ef67d3f868f0d0a0ca3d746feb74f31a89b8595188acb645430e0000000017a91405c89bcc6e88c3ecda2a679e07baa9f0dad74fae870247304402200179677598aba11d30bc5c3665082f7a6570b365f996dc874432c368c713e5260220729f1fedb142ad2628c7f2f5f8e7e7e2e9c561e53a6d77d65904848801a2d420012102745707cb07ad05ce8355f14ea39c9407c35dfd48f086ec581fc29b353dc5cdef0000000002000000000101b118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d5700000000ffffffff01f6b80100000000001976a914fd9f5898a2d14ab3e0cc0fca123cac5fbaa6b9e588ac02473044022031709d8b8ede5520781e724280036ff69364d2ef3a9215cb74f936c4d0f630f00220138d9cca45065dbd90d49f06644f657fd33fcd2121645e5f3f1e41d38828219f012103bd027cbfa620c0aa7211fb37410be10d6a6cc461e75f9df998258941fe6b57780000000002000000000101b1cf082e84dc2aa4074b8b4fd99992792ac055c5785e9da3be90bda2f9337cd40100000000ffffffff028cb30100000000001976a9140b04dc107ce6a9eaf824bf39d1702296acec863288ac79ba600000000000160014b82991049ba43735add9bc4a393e1468a962c8330247304402201b77f5eae0b1b7c4d05fbf2f0b2e72a38b6bb259b53d7044ea9fb2f75364d41302207ebc674f2479790f4069ebf953293e31a2179fd8d1a6b454729c8b9ae184aa1f0121029cacc77a80805ac0deafb5b14e1f51a96cf8e268e5043d2e71ce2a8835851bbe0000000002000000000101139476a1c4c523c9afb7560913b2e4cfd68a27f31dde29eeda68520659fe0ef30100000000fdffffff0338c101000000000017a914fe52ba0dcef0c13a4ff88c1fb7f3b5ac04f8422c875b325d0000000000160014c23ab75257b2ed8adc72f754231c8778a2772f0038c101000000000017a914ed04034bdd4a0abc437b5a0ed83e7889910745dd8702483045022100ae183782d7518755930d504c94b90420112d5b0ba588e0f0fe8daaeab673e6000220065b36c418c84cd68f9ebfd3d0e9e1e4c52ebaaa35b394c10c2db2c3de5e25c5012102a86420a5420add27b9f29d72b6360964f0e32ae73b0024624747d82882b04d800000000002000000000102eafd556406c3dd7cbf86c5db5f0c711a4f906af18bacb78f8ebd0d253ed5058d0000000000ffffffff03b955bf32ff32204595b275179ae34415785b587d382b74873292108934192a0000000000ffffffff010c290400000000001600144454da68001f026619047122559181ef30e1a97f0247304402200fb186c055dcdcf44373e2d865feb6229cad6ffae9ddeaaebe3b3a41c3c1f5b8022048905251276c36a8384f1cefc1afd5c513f95355a52a04da273f314c6dbeb63c012103fd6ebe5dca09b90b8319b67e8f62d025cadafb2a16d877603c6280aa70d3732f02483045022100e1bef69ac072c3cba38bb04d52376d34f9b29db65e6755a15d9a2964c52d2c9802200682c42bfa9cb63c136368ae665a2bd5228ebaded860f63081fd3edbacad4f8a012103fd6ebe5dca09b90b8319b67e8f62d025cadafb2a16d877603c6280aa70d3732f0000000002000000000102d12d41c744ec4c27a2065ed60eaaa8d210b66505ebcd39bd8402d34fab7de4a90000000000ffffffff033323d7f28d8885d9fce11e003d0fa01c1362293ce752609d5dc8d57ce479890000000000ffffffff0142f90600000000001600145e9d91a80e6d9a05903fee76f8ca6688339cbf0602483045022100a7d32ec9d96f01b74b7c8502b1b5d1f35b39be716a265e867850d7e4f134b5f4022059f9e07fb103b3002760f9f00f2a56e832154896ee17f152b6479b58bbeb17ad012102c31fb9604880e9dd63af2dff577ea2de8e530274c449de9937c45d457ec8a9d002483045022100dbb4142f342e1dea65a668c0e4804708093b5c2042acd124aa4c494aafee8bef022024312d835fe176c946afcc92b217c6786b9444b88e85c9f564ba3471da3d9ba6012102c31fb9604880e9dd63af2dff577ea2de8e530274c449de9937c45d457ec8a9d00000000002000000010a061ee3c622bde857f0789c494d07a0e639c911259211c006da1a18fa3e7fc20c0000006b483045022100d287ef9ead13e8ad720c2bc7112714e7a38294f0c5337bdceb3d6e18bb3fa258022047ca189fb997a8d570ada0d042b9ade2312417ac983c5a2d1910fa8aadeb9cf7012102c532d4fa2b53e8812441d401f3ac5baca00f5665bfeb2662b59d709826ba9f61ffffffff01eacea4030000000017a914d2dcbfbe214cdc0e72f4a850b7b8d14337b75ed987000000000100000004d3312638013a32c441492daa2b84bf792464d846f5b166908aae69228002c9b101000000fdfe0000483045022100c661836113d49fb5b0f813b6c30bae335c69789253fd7529a94bd3778aafe74b02204a837a003773dda964930343111c190ec1f882dd24e60e8beaf4969eb0571b4101483045022100d6795642cdf7996aa4a7b30a66b5859584fda1fd51910ae1eb54345a0f1124b8022036899574025359958a746d7c39b26092b424b937237e7549e8763d9af0cc20c5014c69522102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a207614821210341e772debc35023a2c5acac4fb6edc3f065d10312b12445fbe810423bb2d416c21037b79d8d6243128156b20daeb60c9a4004a7e6895257e6c5d6560ea4d1304778153aeffffffffaeab08b8c677588ff54d65092d34eb5924a7700d12a37823684061fc39adaf1701000000fc00473044022049ac37085a1541a9cbfcde794e9b4c6730682f6d119f9956d0f91f3f5eb5015a022053e394d89d354cc05ba2f1753d56a71a2fbfa9880913f3439f674121981ae02701473044022003df2e2571caa958d2e67a365e849c10e162c0df50a3705e85f03dd6b924de82022048631a6dcafbc2fe12ac30a02a7db007a00dba2768c59827aa1edfa894df6811014c695221025e5c3cac54e55f8ba216d34243424282a31169a3d3a91924b3d768464ddc13732102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a2076148212103d3f2a1bf582098c60caa9151b62b850fb616be00bcd1139caeace29b92cf0a4c53aeffffffff82df91a496127b276934e98a7aff46e57ac89aa658a7bb42e05b2b15bfd1276601000000db00483045022100cabe13106a4581379fb387ef6c37f45ae4a55a460a22731e7199842a8b862ef3022054bed235b9db5495ef94f4e01d355bb4639e149e27ba77d79ec9110a300dd6bc01483045022100c1b522b1cd50166f0e41232974784521d22e48c497df8de43963ce050fd5071702202f55d23e834188e7ac52790c4534731c62bb0f2c6d7910d3ae6b79f7aac5bdac0147522102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a2076148212103c6186c11f8c15ee1945b1f7eedf46ae1a04b83dbf2042a0dd029b9bb5409af4552aeffffffffebc87d45b7d3e6c9546b6bab99c8db3a3d7831b5e7bac26b11e27a0317a0b48f01000000fdfe0000483045022100be0e06d51cd5f26f147e2685a9dfea4ce1e07e5fc8161f1aca900160d092dc4002205d643f69895b105497cd600c4b94423acf1efcde87857fc7eb4ce58786d18cd701483045022100c3610f41091ffa6ff4da3c89891447571dd0e9a2dd0e4ef5c1f5d426c73a2cf202201388f8b5ba45b3a020b81d9b0f0e2ca38df1385107de29fdbac3b4ec67571a9b014c69522102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a2076148212102998b012eabba38dbbee018a010507f2216de1e3a51109d188a75c0a46970782c2103a77aa57ddedb81868442311c8a11491b85ab36f30c6b1c5f25fab6a2050b66bf53aeffffffff01d2421700000000001976a91463ca39865c531fb9c6181dc2b25700750939dea888ac00000000020000000148551f2f910118ca7fa73ae2c84b6a51a4b851cdcd97d172580b31f9af0c396a010000006b483045022100e1e05ececb62aed045f6d1031427e492bf760c1cf90f7743f6587db33e6bf31502201b06a5cc28dc4c9c9c278ca5cc87392c9013451e22dc6ca12f81a6e860072550012103c27f45c17e774916918345acd46dd2a56250f11e4570978ef4080ba401fa8ccaffffffff0181badb01000000001976a914c7122668944d16065eea35047eaea204e60b373288ac0000000002000000000101d2c6d2f7eb6e8bee9b2f74bf094617845ade3366220dadfcc8650741141655e40000000000ffffffff01d3a003000000000017a914697a1b18daf37ad836a0127a5c696f48a4d67c0b8702483045022100efd6dff28b475d5822c6033f9b578784a1d1ba65407e3c08c32ab9fdc1b2ad28022009541287f87b8a5c53ae057614edec45cb3b3ed75e79fd462f9555046316b3120121037f918c7c36bfd552569d4662ddb5c0312b97d2b54c1847e888065cd93f5a0fb0000000000100000000010174944178b5f0d3a08105959f2e7e14d65c0c8ed1807a945f11b6b49279ee142301000000232200204cc6d2985a83fb8db490dee250485882fe2edef55b97565cbc079362058dfa4fffffffff0235e505000000000017a914c3d258be8addf0b29309e9b71abbb0b81f5a3b53873842ea010000000017a914507f4829a7bb236f8701338154a7e9c2855dfab3870400473044022030c67f2b84518a130fce37dffcbf8c110dfd173a4b308e25bba16cd22a88f997022055b0e690778f0fd3cceea3e9225adba2a985d53bf1837e8237d93ac636aa718b0147304402202b080558b6e8ce2662594a71efff3f05d7b4d4879c48787a6b14ec1c7b729af90220765aec47979f05919a37a441f89f4d72df6646283f6d0dd8ff5ac27a81727e7b0169522103faec88fd92a4223f83f31aec652d829c0f1c9116c29ddf2fdf046436e77765e32102812bdb6f02f1f837fd5eeaf85c290f05d79681be0b0344275cfae3f2d1947492210319acd73f39d6a120f700bc34e6757b9ad01c7a88af912e458a433ecb8860ca5d53ae49a00a0001000000000101fa82e7540f08c61e9a4e86eb0344fba559a57b69804e8509eed6cc1fd85a0bfb07000000232200209025d61df1256609d28b3078b8ca4e56df92a3856094bca1ccb53149c29fd026ffffffff3c5ac100000000000017a914c82b3ba659ca4a5bd77100243f16a17c182eb28a87bfe900000000000017a914b6b6206cf1f97c074b9d4a357119eecf5b2ccea7875d3a01000000000016001472191a761c169de1c386706a1ff55e3f887e98d4ad8a0100000000001976a9149bfe66102e0d51e91372b099610a323e12b9f62f88acd98a0100000000001976a9141f912e72e9ab095cd64025bda78301f66440635888ac3a8b010000000000160014fbcb06eaa2f1f36698e76d8e452626d77ceaa7c377db0100000000001976a9142358b648cc59c052912a8ef9aeb4bea359c4d5f888acdedb010000000000160014616de8f6d5b72f09554db890b344ca79875ae8247b850200000000001600147c4efb688eebd1fcfc87c5b2ed87ff833b6bc5e56f1e03000000000017a914bf9f5781bb6f9c1e3bcdd5cbb17f16e506ccd65887b66e0300000000001600142644b35fe089e86113a37944e1b37b0bc56f7ae8b8bf030000000000160014c63b1344a3fe93737d1f39253a64ef35df79a5827fb00400000000001976a91449d12e35249ab33eb2da3a0fffc4fb65a655939b88ac5243060000000000160014438e4fdb25bf0715ff0af4d5a41de57b3992a14552430600000000001976a914aa8f70bc5e5565a8fe8c2c51132bbbc181d86f1b88ac9544060000000000160014ad3e8a6dc5d57b4d056f2dd7e1de630f1537d505906909000000000016001429e6e3eac2ad5e65376180e7b6d20b232a0000e79069090000000000160014e305e18a0ccb3d5d6ab2ad2340b857f1f4ab75ad9669090000000000160014f4afba80b9ea4067809002ecc92352ffae12bfeb70aa0a000000000017a9145bb1feec1c9f5c951ef7338057609826970918af87ebc00e00000000001600148523bc7410ab8db53369b055b90205885c7fc7a28f130f000000000017a91440569ea7042aba1e31deb2fe7651d732ecdc34248782b20f00000000001976a91412faf61c2584729fb58821f0bb0f39634be0a22a88ac82b20f000000000017a9147ec46e769802259b7f807c993772745758b32af487848a1200000000001976a914a542675c607e722dba1cf3a3d3bede0ec3ae0d6188ace9d9120000000000160014f4afba80b9ea4067809002ecc92352ffae12bfebb7dd120000000000160014dc4cef21c3eba3ee0b994614a63ac1aa797950d68d6f14000000000017a914ac192428f877b23e12faea0414b34f13e8eb6bdd87ba1b190000000000160014aacb923110059fd421fb13650df67d00797f2eef3525190000000000160014ba71cf3b096847c044302a82ce926696b60490ee31401c0000000000160014a3b1a9d6d9e1a882d880896741c913e12d29a3c331401c000000000017a9142a51ce5c95f7b10cd46126a08c5068d74252f13887b1471c0000000000160014ee19cf96e208ab386901d3cf6b9108a4b53c9862db4a1c000000000017a914ed9ff6d2b88e3808019bfc7d359c198eefe41f2187b74c1c00000000001600148e300e422c29c50e56d63ed97e0ce338dbb91be5b74c1c000000000017a91494eab3c1169743a869e99481fd624141eafef8df8790501c000000000017a914de2e24646b66d1fa0bf1086e84f607559bcd295787c8511c000000000017a914d6d9b971db503ab19469369b3267ec623ff86aa9877c721f000000000017a914efa0966729b3941158d97e42f9a127c84fe69ae78733781f0000000000160014b31892f0300081ab7494d45f6449608f7812471e33781f0000000000160014f976a486e863ac98af59984a96dfa40548ad57dd26962200000000001976a9142fbe866dffadad6b2c9103b8fae5926f2c56ef6288ac10633700000000001976a914d383bc08874c8fe1d9fd80e213f63ce00709470e88acecbe3b00000000001600147cfeca65aa5443feded84b91437fc133a21a2ecef3e13e000000000016001412fd8c7877bb8e24467883fbc51ff1ef938fe8aa8a2c4500000000001600145d90eef5d1707ec4ba9f4a4718ec673a338cbf6a38a54e0000000000160014f5e65398a885128fbb09389bfcf663d4eb2f95b71b3d5000000000001976a9146689d5c7c8208d4ac6e8e128246d1e6ed920e39388ac09ac5100000000001976a91407641eb56f13a0172dec9d5119e38f6243946dc788acb81b5800000000001976a914550aff142c9baa27dc961dd4000bced5216b915a88ac9c315b0000000000160014235b0cd702f4e9f84ae0f19ed9e62eaa5e88a6bc9c315b000000000016001476f7d4005a2218fe3d1fc1d86e1022447ba73a12cf3b5b0000000000160014129790d81265236df881127f0efef322f3fedebe42c45c0000000000160014e19b63dbe4bcbc217cd8fe31d71c3bc87e2779f1e8336e00000000001976a914ae84318512532b31c72df9f5b697a5c6f713ea1188acd4409d00000000001976a9140750c5984abc088c0e29446490c603b3c4493bad88ac2066a000000000001976a9140e71379f6a81acbc112d57daddf7076296d7c8cb88ac9e27d00000000000160014ab01a933926c3f7c2f8ed8d96b48cfbb591f42b7b337da0000000000160014acf952ffd7ce825d938bdccb0f5f1ab926f94a90ae8d1c020000000017a9140ef9ac59bd61f571a4287b8009984c798ffc262987040047304402203a4ec3cbe5c5418d0106c4349fb907d7fa2e0cd3d84b94748294c578158fad500220789c3cd03461ea8f10b5130b1239b3725df39f1d1267711ae1c07969318a0136014730440220423b0621c8f1edb180a74a22278baabb024e953a736d069ca2e7c2f98542a3db02205c288576dc7697664e431d60c9f62ce316ec1495dc7b9788e1d62bdd5b1cec9901695221039cfc457bf3b2aefce7aa8a8fe60df9c1e167b1c93f4aa6bdb51a4430fe39f2092103bf7a9e06359310d3488695e73a81d526adbcb2d0c9f460c1fd001404faca27be2102ba5a2cc9cc394735b335360a64aaa928bce7416d8c1bef780bdf7d2be8171c9553ae49a00a0002000000000101a13a85b02bc9f7fce24295fa29651de5345e02ac920be2ece4fea58efa8d2e610800000000fdffffff01fa810200000000001976a914d6b26c97b971fc0ad2edadd89c294f1b4b54eb6e88ac024730440220629afdcc705048a735f2f2eaf5ecbb5a09d3039eaaec4291fbc8ea39e0d0148d02200e5d651e58535553074ae7be2516e98e40a9c616cc97abd4f3db462cb4e81702012102bedb4c60f83a3456d454e76e58490469e02d1dd375cc4b7a271bad2fdc9ce5090000000002000000000101224ff98ec5e4123b85af7e7a39afcdf923b0f9e91977860363661b1443ba01a10100000017160014d793802e7c682e5cf8351cef45a25b4d7d8f23b2fdffffff02100306000000000017a91424214313f6a82096abca81138e45a254fccb4d2087807e64040000000017a9144de4c42af56d2b81d1e4d8f84dcfbab93c4af3c187024730440220284b15560adf0944178d72c602864c9eec88e04e4e9d3e94d7b059be2ab006b102200adb6af1f5dbe36a80ed0efcaf7ec94d6f61ad3ed099fe9a4d76e82daff3e57b012103f64b38a38f40675be203b6fa96adfb74cc5a2519e8d2e4dd20d03066ae9ebe6149a00a0002000000036a73ecdae14607ac9e1db14f493000784e2ae584a97806555389d4e2bd6b45a3370000006a473044022061614c4f51f76190a42333bde21347069d2730f07669de395600300933b5287c0220095ee79860b7879e089e41fe1d768a35570728fc7805fa784184b6a689ebbb2f012102ee7df4fe35fb21c450fa90fd34b02d36068a441e7aca286535af804204dea43dffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb640000006b4830450221009dd9869197f577808a0892f330a90d9ced08b5ed5144c07af3ab37b4259b402102207cdb339d53d38e3cd2fdcc515bc1b1cdc3826da0c94cc88d92117d61d0682154012102ee7df4fe35fb21c450fa90fd34b02d36068a441e7aca286535af804204dea43dffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd34570000006a473044022060d94e68ab23d430479b3c20fba3332a10e9c599ec639446c8d5a0c173c9cbcd02201240198aaac8657ab174e89b493e79bb614f60674169d276a210919576807f44012102ee7df4fe35fb21c450fa90fd34b02d36068a441e7aca286535af804204dea43dffffffff0129461200000000001600143fcb25f909e54a4da1a71c77ddec6c999c5b2e46000000000200000000010117b60fbedb1233c8ab65aa3e8d3b2f8269557218fe328fe903ed31597dd215c4010000001716001413df1b443930216b2ca29be7c1b87eb8eb64a6d9ffffffff02a54d2500000000001976a9145e613df6dfba12e0fd5bb7fe42df5ffb9118ce0e88ac2c4853020000000017a91499761888e53213ebdf135fd2d52aa9b5780505ee870247304402202514315b785533952a3ecee149468bf1ce2df84af546528d917f17c67145787802207bb12cf24ec179a2e2f3ba73e13d56a537a3b5893735d0e7053420983324536e012102a6b947d0b0a0d1461bcdf2ac28b7dfc3689dd612e73881d56745f57e47eb22b70000000001000000000101aedec521e2dc8c401b75bf3c57ac9cb8bd3a7eddcb075a3a3c73b1152b435db70000000000ffffffff020a2a0000000000002200207c7a3646cafce2526acb8323f2d04d63cb617d227b4f4ee15f9ce507c891d87def7700000000000017a91438aadfe99ca6550af7ee3143b3e4ff375a953069870400483045022100aabd7a6f79ace5d7ed7998a483fd17a9da1d86ee5af87275bea40f1115d0a6ef022061e668129a3f4f2b3859531536910e2be965e7a7f4e3436622f6f48b52c7329501483045022100c55dfc7b8f32c31f91c8c4853239ad58558c98ebc630bbf3241ed7cc4a1376d202203748bfe0e2a6d915231a8b98d7f3929e279d101bc0d06fb035f7f5ae0122c5ea0147522102a14a21022df3ba98a33fe3765cd0106ce9bab2a4c5796d76e4bc62dc0ff619f72102ea919db2ffd021e23e3a5d5acfc27832d08eee12a3e54c919bc0316bee6d1f3c52ae0000000001000000000101e84d600a4020eebc73053ff26c46b4033e02fe5a619cb20879b58f9a569304e60000000000ffffffff0294fb1c00000000002200200e86e390965df1a0c7cedc0092df5ed423d148868dd0bd43a1f40b1a03b98f0c38a92100000000001976a91466ce5222c327e42efdff5c5796658469f4821c3688ac0400473044022050951f8553ce8390461dd89e83ae13d476be444fb3956a6c6d3dbdd0c797317a02207d353d5f67a7c481afe6504a4402ad9cf3fd47865eb0ba583e761ce7bdc648270147304402207077e58dc4adf0c26a15401b9489fe8267078f79356fd1df8a7e9366e515fbe8022065706230f1f539961661c874f6231f7f2e1c8fc3779de8a721b481d7ebf61a3a0147522103bea16f58ce1dcfa4448b0fbed041031a62b55cdfff20a3cca1075fdd7d2174e42102556a18f2e8c0d26d8d65027860406427f9321dbb5631dbe5c2e527cd748c097c52ae000000000200000008bcc54e826f51d11c058cd0b9030f06fd54de1f8562c921212e24f79b95425f34160000006a473044022077af0adaa20b998cacd45473b422eb103067fb6478fa1b39a272fef0c4c4bb3802205097a06a31a22d0ac28c92448e23dc4f4e4eb611291cc141c66e6a48e6372aab01210348bdfc93c8c20d2fa8d19dc38e68776b2dfd968842ea034b99e45e1410dcef35fdffffff9c5b3310f5c0774c3dec452984a0c2c9c569a978709a2c652deea3644919673f0b0000006a47304402200b03d4cf913b3dfcf8889948c7aeec10ea5514e361109b7375704ad6f1be726c022003d6133ff0974923319e3d60990e09cef25bef8fb2af2c4984ae4ad4f5e3f6630121020c017601a08043eed7fdf4ead07c61635b2071c59257637b1fc12d53c3acaa26fdffffff11551c91473d6f527a3c2a10a35eb82e7b0f25a861fd077930cd55bdbdf55f79000000006a473044022058d01eefe8884230a7ce699e77aef18e0ba901f79165c7c776e8cb0d6c019ca1022062eb55005f4e4b8be237ed9531cb59c81f0f1895e8debb10119781cf89ecc7a10121038199b1cb3b5167d7446a8e5a18e186fb2d823e67346883106306da4181581c06fdffffffcbca00c4e6140901e69661236cb5fef23377d4a80d709c3c7992a746e9c74ea1010000006a473044022002fd3eafd3355d76b6b565a0be0ca9d26f7323a2a303293258a0b23c50eaa99c022018f21332a1a7b4c1f851098f1463698b85cdc06ac891f77c5439f37fea79e6f2012102dd0a44d692556dd2c8048f32bfb04a337faffb2ba10042d64afd2c69c5f5e35ffdffffffd82702baebd2f888fbceef3d47c1359d3be839313e236a963ef545831552aca23f0000006a4730440220193da31f05288242b30016d5dcfc3e504b7fe888badcc5b456ea5a490864f54502207a7f352bf1ceb210343210a20445e3180786cb4ca2c1769cb631a44f5bf6a31f012102546eb44920e5e6e6266629abda634031e736f39e619892fa509d33dfdc1375fafdffffffb2ac08025e692808ee0b485e16fe33573ee83c8b990d9f09060f2b88589111b0030000006a4730440220313a1f4a1257ee6847c91182389f677a201f9354e11fd8c3b2f9b6aa6f29a0b602200f09d7b7728f985fe6d6a1c84195233b508e011930c0f9050b9313bb77f1a9a1012102818ab67a700f55e120acaf406f3b93088d6015b7c0a3962cfd9c44d9f8dcdc92fdffffffcc8103e65940dc62a00eee285cbf4d9bbb09738f39e59091c595ecc3a0e2bbb5160000006a473044022062be779ea75092b81380588e52b3429e2f323b5d53cb62d8a88164b06550bf5d02203691f82f337c60ccf025fdbdd5612e2005a50f0ec493b5bc86ae62f479e47a29012103f06c6ea94ab66e4cf82e4a6386462022cf20ed648aa7e8dc86f770d20a92639bfdffffffb83c92be85ab9b6c72e70f78924a30664848f97679e53498b3f6231abcbe28c1190000006a47304402204ef2208e201d959b57808ee0da9e10ca4c546b7a2782cc3b5fce7e582cee40980220159fccc58aa6a42671a5ca1f22251725462e44b329777a0f523794ba7655040f0121022a3c52761b11e014ec1c38869a87b8e38d00b7bbc559c5cb57574f8dd08c89cafdffffff0104f30c000000000017a91439c9a0846e645871eb0eb36b88b4d7de651a7af68749a00a0001000000000101ba04fd3dac0459cf18f666fe4db8563ac5a90cec2044aa2ef303253a5f22fe640000000000ffffffff024ba8030000000000220020cd8aacb336d085cb7ee6f9b4a27af4843097dab2a8e361240aa5a19dcf68989c476c0800000000001976a914d29617d557571a428fd962f4d2f290b4f343400b88ac0400483045022100f96e2f18cbc3e359829cfce18eec1afb3f708f98015d191822d30b8bc18f56da02200e4762c9d4336d6b17d5548863b055757ad39472f41d72c48b6e0bdc3268d5e90147304402201dccda648775f08329248c35852badf92e5f073f44500c30bc4f5b09dce5de3802203ba019ba7a4b8648fa35c10fd847a44f8b91bbb98a639c37a7b74f053a2ba26301475221032458a698932d143309922716c1951a32a6213e596187d246af3d9183af12c1e521024840a8be69770a2de44607becc2c0a79f22a6b5adc39530d1fbce285aa6368ce52ae00000000020000000001018caf289a7e5dc94966d89620441e41767ba665ccaa629fcba8ed0cc750fcc2851400000000ffffffff0111dc54000000000017a91488680cc4faace8dba4989500a12c019ad797cdbb870247304402206d3952ba1e9af7bd3e023a0a9d1879c704ca8facb2e043113892b9bca9f82d670220785062ef8b498e2cbce6cba2b63a25e3f2508c278f9c8f048b69c8e5fb40257a012102c470fcf3d7d3f6cbbbd0b71d184c0e8cc3ba500822c65906441ebbcaedd8ad300000000001000000012368065e4f6c72bbb43c566d86b8bbe1be22fe719ee920b8a5b360fb59ff42de010000006b483045022100d4d12b1368adde4c11dd5e226ec538b6ac17db45a9240af5d7b5284068f751a2022068a09ea42e65577a9f3908692adb8200bb7ea3656e712281203e6455d631a74101210288289b9071832a5f617a3684ef91ca9ccbf8a81d91911173faec10d121104aabffffffff020000000000000000306a2eee7c2aaab65714c23c01d481af80f037682c1873a059cc07bcd9a9159d4d87464c174121f835d8b4239e2429abb712997300000000001976a914cfafd8852f7fe1ecad6efef2577b34273c73459488ac0000000002000000000103676a6c627fa822f0e2fd513e00aaac5ee06fbf465d09d1a782e723fcdf8b61f44700000000ffffffffcf64712629086f2304ab64a69fa19a4671b982379dac599ad6db2dbee40b64090100000000ffffffff28beb268b90fa342ef126e61a8b04be4311034fc08530211ab6a82a5e62cdec70100000000ffffffff0297c900000000000017a914505c5a94c1aecdc4d18171c9ce81e3f131f4d6738709fb00000000000016001419a8869f1e0f439d7d00bc9386d74003ef65be8e0247304402203f0dc30b7fd6c3109e029c8391a6eeb00d3422d5a06e7a10602e5e3789304a230220034c5ddf0b6981634a8c1193ed01b898118ee359e6106e559cb04724b9cab943012102536d0946c583dbc2cb16b66a6c2704c53eb1ba1028bdf30533eaccad8d67029a02483045022100ba9c82990cd9c18912c61fc44716c04e9ef523a5ec46669988452176252f0a850220232f94c8a375042eadd914f8895ddf6d7bda1ad59cc7edeb599a6b3e042e335b012102a3787facb9eb57b3962583fbd5519b5cc544a3c78cd8477b432b61bc358b2672024730440220252ae9ed5398198f61e364c87f592c7546010ccd47ea3a9fdd0c3327e490034c022078df7c2227e26a7be45d0735e371f345aa1ba33256011a2c523b34de3207daee01210359f7596f9503380ed9472a346917f6ee34ea227142491c28650364526ccf40c10000000002000000000103e94fc5a3a5d2671be16f26823bf77a6a6f0d26123c39346652a9d993fb713ce9000000006a473044022064ec8db1c924d9153097820ea018fe69e05f75b6a4b2bf7f95e67dd5b104397302202c906516e61c9b9dfd2614c4576454998cdbf32d15f51056236dc1bde71db491012103f70ee650234ec5f25466bf4281efb7c7d8bd56be52989fad45a79283ee8a5c5affffffff7d9f2955fcb8e81b26e6970e877ffe721d222e80e1c6b178d3c01cf6463343390100000000ffffffff9105a548124b3be3263d84ea3c556f3e28b2ca5f52f1e54b883a5a394e8ec02a000000006a473044022041d170da9fccdd3277a2c0f99df055f389416ccc58496459ade8ffdf5f568b9a0220372b6413873a35c829a0a8ef9453b15a8ff6220bdd9992115e9204bc220c1e8c012103f70ee650234ec5f25466bf4281efb7c7d8bd56be52989fad45a79283ee8a5c5affffffff026850020000000000160014ad8f6cb5f6efa1d62863c13c882a2a8f5f0a3eea8a17000000000000160014826d34b34ef71b235487ae0bda63023f85cc08430002473044022079005814d65fb2f3625b4bbf71e31d3f5039fb19bb4f8211657778b0988cd64a0220485c2aa5ddd28a50548363a95380cb97b991fa52f334cc93ceed21f3d1f22b51012103b5058a7ed66bcfd6012831f999f0f74f79ac91cfb0efee2bd749b5f399a22ef400000000000200000000010264fa4355d694ee660ebaf6b18a236701d5a173f1c77c896b6fb243dae0d204350000000000ffffffff3ede36fdcbe075a22ebcbb529f5234ce920889984c3f774fd4302567cd15e68e0200000000ffffffff0217b70b00000000001976a914ffc21e31105ed36c799d4ab774455254a58561fd88ac9148000000000000160014af213e3be2594edad9de07fb36b5c00b27e3195f0247304402205e585d33a09d0339911e2cec07db4c8a54c1a65892aa9389cd5c11a67c31086f02202619f711aec1007c004868a85efbe50a9e62299243e196aa04d165e17619e004012102d1a67c1f335bcb75c9f04912ecc2bdf65e5f2fdd06e3d18690588df085281ba70247304402203b9238d54304dde6f39cc669e80da3097066ef5420fe5918584c5224cbcea6f1022035c62bbbc58d5393f703c56ac462d3b8a67d1fd2f7443c40f8e5c0e64545bbd2012102d1a67c1f335bcb75c9f04912ecc2bdf65e5f2fdd06e3d18690588df085281ba70000000001000000000101030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee1030000001716001496859e49bdef19e9f4c285e4f19cbab2257a146bffffffff01841d22000000000017a91498a327a548ef3264ee185ef46861685c653b7b8e870247304402207e45c5eefae135cc108e06ba9fe8d78d6b562beb0b2e86f6012863ccce69dc9e0220547d34a0b1dc1f0e0da397f00e17c7d035c5076ea50715cb7c2d2c0059c69d500121025a3b9636fd04b2e69a632a4a25a2d628769329a76fdec4142547635a76b0d7c00000000002000000000102eded8cd14f6fb3b4b60b161b12432db0b1a8667fa0855e56cfa9bb2b652075730200000000ffffffff123f5aae62ca02182a2e9f9fe879a6d8fadc5fa0b0f1876ac56fe2416bb7d0410000000000ffffffff02985d04000000000017a914dc5e95444662c7ff603271fe7be9d08a88d3739087f8b5030000000000160014ffaa70fd638d862237ee0d99c69ff9101195281f02473044022043f095d7af649709cbda4fe30569fa38e40a2ac01cf3aff7c14e1513e965cb4a022026392c38c625b640c52787023fbfe7a4f2071460345eb1c59241db7ed5c552400121021fdd93d0104133758bb9649691a2af96d99bed138d0d0307d351e7135c77c62d0247304402205aa071405efecda363472a451a01777bb3a69a931ea4be5cc2bbcc5bdabc1a0102206d16db531e2690e3e89829ea2aa6654fa2ed2e56d8daf8d4775e15bc46194d530121021fdd93d0104133758bb9649691a2af96d99bed138d0d0307d351e7135c77c62d00000000020000000185bacb0435a7ca2cb9dd4110e80759b5f6f4b44ae3de790073d54034bbc3bfc8000000006a473044022050eead43a22c3eaceb138f96a240e46477a22d80ea3782a1a29f592ce7888957022059854cda42a12c8d3324e6c44a3e4886d07113bd86e7ad169f85fdfbf96031f9012103bf800b9ebd341a11792123b6d82dc78fed1ed5213c85b03cac3cc73314b643fafdffffff02f89503000000000016001469aeb0473ee2a9b610c0aec30ba6de51ac14cdb8b48c0500000000001976a914cdde2e11a0f4368460c59d81bd1cd729641c7e3288ac49a00a00020000000190126b06283dd90eccf52c85296083b37c4459f544d4de15bbf290b53fa293b0030000006a47304402205f6e5502631237eff94584c9479d8f7043312b9bdf1138b21b7847a678efd2120220028b9b35641635a364d52fe4d5977eece914a2e074d9a4d9771f2d50e3bcd08b0121037456e06b37ad2057a3756a59bc59157487ec56bcccadb182798d79d7df12793efdffffff062067000000000000160014bf143c8a619a435c00127c58785be699b2e48c0c20670000000000001976a91471ba1088597bd4ba506deb8f322d22d862aaeca188ac247700000000000017a91421599a78320dcb77ccac6ba4a50b4bf44a73d39887d47b00000000000017a914f4bc154c37ade047b6c46393d4cd104fe3f4e027877cdd00000000000017a9140eba954f311ecea673c6b135ce8260a2b84c993987347a0600000000001976a914626923fa6c0cafca107130077bbcf289983e3dd388ac49a00a0002000000000102139a860c5950fc0ad47af8b913a05a4bc00b8eaaaba08769431b8fce372184dd000000006a473044022025c49cdb0b518489008704e333865f85b62064f353f7006efd72d53637955073022041780dca4ab889de963a510e5067f16cde3b837eeec0f5226a0f044048cc059601210280f79ae92557fdb31d8358bc919f7a1718c72562d1506ab52e1159507ba78667ffffffff586e3474f3ce01940b8f0f654365a0245d499a240201ab92406d98dfbecb7c380100000000ffffffff0226d70200000000001600140e062c68d05f7495296d6b5e7b53e11842f68384490c0500000000001600141e50230a1d3c6c6546f75a36108248ba25de8d1d0002483045022100aa9b9f0518f44c1e979df480e6240e56d9eb44e5eabede264065bd9ef6ac4f3902206123c2316c5b202b512b678627fc2d56fce3175a14cb60ab8caafef6a593e0e801210289fad1df93dfe48efb723b610d93c946a4c10a73e134bc39fd36cca86e7b6e790000000002000000000102988c7473ba3e295e942ecf607ae9a6a10a7a734f4d87fb33a89818bcbf852ce90100000000fdffffffcba3c16faf2902ce7f035fdf1375a1a435cf312383293577c95fb95bb7df66f6080000006a47304402207f80c73c739391a23b5c9444a492c2c646dd73d870ec487ec45cc0dfc66fda860220209f1f98c8cd563d680e4f0e47e4b482d216e1431304a4fbfaf69e7f832eae5b01210239f34649b47ca3c79003ab75791925dcac08832cfb27c0bee736e641e9b20fc7fdffffff02a7430a00000000001976a9145cc3d9ae6b6c8b2caec237243dea5b8b163e18f988ac124c010000000000160014923567a761d1c9f52469c8ce558adb01492c34e402473044022067796006128a69f0dc46fe9d806fad742ff3b52af36bdc9a0a35fed4d8b54e8202205c98ed714625c949e32807ce59bf8f623ed3ddc4dc893e858e058d281587dbab012103ffb39bb0b9148b3ff6c40949e33d8731fa78e20cd9521c7b7aa0d4da2d23eaa30000000000010000000001015ffde0cd9d507ea91e62ed88ca442a3a176b5e14c24f20012d4dc1194f93993206000000171600143e3bb1c7c11c639fd516c3de10842314720a8dc2ffffffff0117e10700000000001976a914512cfed99ed6c5addc11e5e830f14bc99dc3426388ac02473044022077a034d8648b8dba8dec26211a893fbbc73b335b0729fb7a12443a11853931a30220394bdfe598b6cfbe434844514309c8373e5c8aeb54172ea5ff6930f3d282cbce012102ca1223cf5d3f27528e86db38611f312dad222124e07107eace40c59df1b6f7340000000002000000000106b42e0de6ae6fca060f8e61164fbeef13f9ec24d64ffd76d9238d176ade62831a020000006b483045022100859ba6cd1231404e1b5a2e1834223e843abf48fc981336f87040f64a1b5de16d022050dbf9ca7214f18992ce578a52d433a826e82d2364832b29528eb382d7a801db012103c194d54b4163f72972b8fc50d144ed4df7e1f97efe8bb69a376dc63ea351f501ffffffffca6123570130e76df636e7740093f10a0576cf422801ebba366a230d1b75a9b10700000000ffffffffa6c5df6f8044298c472604ac858cf388acd3b47282c02d409fd0c62802e0fabe0b00000000ffffffff2e2d6b294c1593afbb671393316aa83b3a59eee4d844e39c269d67f0812743b20800000000ffffffff14be088223fc6cf4c82002f29b42df4c913b454e3ee3dd05d2ab643598093f6e0000000000ffffffffb19a3305baf74e661652684b07add34427057ac58b181a3ce167d15ba04c5df90500000000ffffffff020d14120000000000160014162cc388cafbb62fe7e9c10f375d0b2c524d07a6a0c69d00000000001976a9145d52ab3ef600c0141a4b6f466d5e12bd886f775888ac0002473044022001d5d3732dc11a0a92820f570bdbf034d72aaa7e039c3068c7f71efb0510103f022070b30b25fe72a8e23d8055bf73d96be0ed70bd48c753777e9b0a87cda70febd0012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f02483045022100f23d5a84835f86a32165431e7e1416d2e2015a9e02003183a4d1749e9f7c554d022016bc898c5a50c425cf2f394aed0af19b00925cb8cf858c013d38c19d7a58e550012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f0248304502210084113c13764dd902a5846183de63067e2c43cd58ff04e4e9623dfef7de6e92d202205982ab9aabdef4c5aecb9e819b3a191ac7596581e7461e62f006feef7b4bb813012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f024730440220723c2f62c731c3867981259c6ffa82f921c7eb359c4ce02c95b6e955f373871102201aff1b61c6460d418357377e6af9c92b3e51a666edd7aa4a63a9265b69b503fe012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f02483045022100f99169e17b1bef6ebea1d56a565ce6f09bee9f023890140aa6b60738ed2f0576022031b08de3d39157710991edfc9dcb0e4a6102988d88a405898a0c8cb3bc4fc333012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f00000000020000000001018d110daa5560c05af4e8d1471441b45be9e1cd4f3f00cb4875c7fe1d120d683b0000000000ffffffff025df42e01000000001600146013978472755c576f7485dd5ed3f5fab7bf2f4753e91c00000000001600142dc0418832de9e31f9c9c394512bec093acff17702483045022100d5ca94a38f9bd04cdb88ab60409cbfe405ec5aadafe66fe6273f3f4bc94d514a0220032f5c12014a5febd20a4c55ec7b79635d05f5fe4b0c11f9ebb0892541ec6b4e012103e74c50cae0ecb787f34b23080e9344baaa4a80f3c0e56ed04cba74d01e0efb2d0000000002000000000101c3deed34f1634821b0fec482132ebbe6d1f361cf11f6d6b2ce4ecbff23f039e60100000000ffffffff0251c52d0000000000160014abc84d64ed31c68a61a8d7f2810fb1924d01f7400d520000000000001600148b1657b86693a55423448c723e08db751aed734a0247304402201792ca572854226f7f5008dabf56eaf65e2a8479183f27c2c6a520cda62a5d460220719b270cc1ba18d6fd5391fce9a689183f3a4f3396715456d0e539a31750c568012103473e7838a26478e6e249b3c5bd76a47f29b8e584e9db544eafc2146188c430ea0000000002000000000101ef8bde0c7c9eba42caf4dd584e6e3f4c893b8b5f74952124dd4a0df695a0b6350000000000ffffffff02548101000000000016001442d58a51b7c3e3a8cd9c398ccf31d106a53f5f122d81000000000000160014cf7ea84d50a37d1cb9c7236a0c4ce3b3974b471202483045022100d4331df9b67581796b0522ae69e3460481efebf36a2bd282d5880069b750ff9502204461a36b0f821161738a5c044b152bcdd0ed4503c2dbcf4daf26423dd4011a04012102d3c3ab8a1f9eb5c590537ee812994a0d0c5da7260a3b048302b6e985c37a51a3000000000200000000010128ecc948bb63fe0b25f04fbd8c2c54bc505c4ee2ac9e2bfbe440b1ae59ceb7200000000000ffffffff0260fecd0000000000160014820e9850125b7a3a94d4a1478a17380f68fb46fd59423e0300000000160014b49185c05e3df313d60b27590a7632ca391b38430247304402202689a8967eca400b62410e8d2497cc76a771bca32f45ff9ad13fbada7c3dcc4a02203e15cb3f5ee95809aa6e19c2a8885968003de40e051a19300a9165bbd40978710121038690f5ccd79a6a21f1652dc918924a2c014a944c27d7b0da6be4ed453819abe2000000000200000000010124e4f43962b72e632dbff2d87ce3ddef9a97de09da85566e2b533f65631267a80100000000ffffffff02a29a000000000000160014fd95e56aa375f7a36518d5207cb0ebb3ae269bfbc3ae010000000000160014bcbf1a09346f46b8a09f34590c7701ee9e383d920247304402202d49a54cf978f21b37b922f70b3e0251a411353a1003cd1ad011848bb6cfcb9102206ce907c4418dd9bc4683a0e38b65dc5dd1b4be573dcf1f030f0524dab2c3060f0121021ff52f324c04ccdc1b92b38007eaf92b82e97096a91acdecbc460b68f8ed2c5d0000000002000000000101fb83479efd45d5bf438b8660e5fd227b698edc41dfc55293706c774d096a267c0100000000ffffffff02c5da3e0100000000160014da806be77ec12aad8ce738c811517d631756dfd459d5100000000000160014780359a6566c8a4ce0fd03dd5d140543352dff3f02473044022028ac5bf0a09c7316a3a24f035bc4be8de023244ea2974f77c514c8d5dc076fc90220263afef2ff89c3a8087ee77509cf208d8698f749f90575affde0e72ebea5d4ae01210234eb13517d627deb37811769a14fa4118502d03b03be6240f5ff0fc25178ff2c0000000002000000000101d670ca3bb631d8ed2383276a2bf18373806976636c8385c6c54d501d181109ac0000000000ffffffff02162b0000000000001976a914f9ba029f846962298b7e0eed224104e3e1481a5988ac1be30700000000001600142dd8a52f03e7b951c5bf61ab78befa5d2128cbc702473044022011a5a378bfae7685e665d1b0bce25f2bae70c844286c8584765a080f9588623302206ac1e7321351cc25bae5f46139888e76caf89cc1906c2c1d27befafde8c6b81b0121029215442e042def2ac7fbc01b77ccd788611e894f70d97f42bc5a2b05b5fde9170000000002000000000101cbc63f0903fea567f2d64db6574f974ef2949c09f51511ce97f91047a4dd15000000000000ffffffff0289060c00000000001976a914732cf229d3dc3b9b8a0803ffc07d4e364e54aba388ac71d401000000000016001479f9e222935cb56131e9f634239a90f5788d0dd70248304502210080be028c2afc68c5b8c99f5f65c85d4ddea91a65ebe94c048ef37a96f6c36d3902202ae9b9c07c09cc26c56b155be2850926523fa391b64426e474e071137cb9275c01210354207a8a8f1d617bee21b9c6374f74912dd18e26f458b3873f2fa1dc4eaaa08500000000020000000001023c7f242d634c1ebfd43a9028e3f5c7a77d8f001ff6620e1f22f2d0402a49ce110000000000ffffffffad28a959cef70b7995e3918040658932bc9f4772b3af30d93f36687e4e19d0230100000000ffffffff02bb2d050000000000160014cb5e9ba4f38f70a676e57290653fd54f2b6e0cda46f80100000000001976a914d8754315b3409e3fecbb35712d4d9285d52ae5c788ac0247304402203fdc88f2feef372b152f6473fcde3515b89d6ebedc9a3af8cd9546d0a560275a02203decad4067db79ebe496f891882d1ac7ec0de8597edda5d9f058d0e024c38869012102375148066b9fa54cc138c07e0e0708a7cf09fbe7b82027f104799928d7fad57702483045022100dc902b81f2865457be786178bc2ac7b49e5748199d645459ec951ef13430edb8022042a740f23836ef7340d1c17d1663b98e64631c219bcf8317894a280ef90c9557012103b8785099601aac55c829eb1cfabc9e89d6955b377fb8e414160b76d3d857d18c00000000020000000001029204d3995e8708a2545e0d8a256da2c0b13d23c3559e09f5747b9152131f93830000000000ffffffff5b4f1ab1afdc4caca1d032e8d7b5a2b0315e680f0a6eab6d7c17cea78c1a31090000000000ffffffff02a5ad2b000000000016001414d5600816961393e945320f08dc691b2f2ca6c0f3760d00000000001976a914f5f9d1fba85ca7cd8ec1e20abc4e90aeab41a80f88ac02483045022100a4f6b363a536d1aec21e5e79c0ed81dcaa26043cf5e8dff44ba6acd8c044e1d6022016f9ba57201f959f2c6018026543b72cc9e2413201939e09149f4ebc0c0e11840121038f8fb3ddc1fede9b33fcf5832d70f5a153fe573d4e64d7573ea6b79371d8535a02483045022100be1478c168167a43796765d7d8dc244ab985ee382eb48b29d3cd2b40a3ed199702200e50e8dcf6fd9ec2fe5e35c1fe95f546963aff42f54cd464d372a81194a0db6a01210358f32db71438578c2dd2eb50c4dd65e1769bf54b0909e8b720c9ba85bbcfe7210000000002000000000102418aab81f5413f5583de2afafcaae169204676c7d64a0bcd8dfa5816e90a9cec0000000000fdffffff33cc20e8590d5584fa1297b81e2e9abad462fc417b435da43606b7e83a59320d0000000000fdffffff0256c3300000000000160014a3d588e0489422281f549ff155fc947f2ee98c81b3410900000000001976a9141cb6be2d300aea8ca144461245d849645b2a451f88ac0247304402204a8626f3565219c0903471f8f19faef4546c5415c790582fdcfd9a569c8a134a0220356979dbf81444d1cdf1a50c455eca3cb54fed138e431b4f6fa0172941e77d4a0121024b49baf545313869b2b778634891b0667f5260b9decadfa21ed92dfd34ccc58902483045022100d14ed966bdef681161819d7f11e44408e94584a4a7482acb89ad3a9098affd1b022059e99c22895ee125a7bdd7e253d226ecb407c980b77d4a91fee2cab96f892f19012103ec9164d5f4b41df3e29c1f6b8744417345c8608f9d1fc803204ff199887d4245000000000200000001e0f14f6f94e6c2cb0535d11ef486132fc6908bd90cefd7619030ac0af835e350000000006b48304502210095d1413897f0864875df69018d975481fa1afe44fe80c7835b90f8e155ec0c7902204b81055643b68ee41a220e727ac381058b964b0df8061f23eab3ea3e243474300121037bb2953b20bfafab60165f412ea330f64795370a44839190cc84ea537660a3f6ffffffff026c3214000000000017a914254f745eb36c64ebd3f8a463b78343a95e9a745a87773e0300000000001600146c6c8a2e9417b9c6b6be417fbe2fd2ef547c60490000000002000000000102847ac870feb835b95a306563744af1d5c78afd6b71d65a7322ab7576b0b5a85c060000006b483045022100af5fd4615ce7e4003d944fb4be69ae3a2f0222b066565131d1ee0e87d5884362022053a2c8623c6c9844fff067548f9dfa1e5da54b7be0d48df7df27f45208de6d8e01210231228f9c4f48a7e3c3c873b89ed746ed8e104fbb3b7d1e80c8ce4b548c0ebb99fdffffff9582ddde70c4de6485d49b0062716ebcb83759cc70726893655e00a0a21595af0000000000fdffffff025a9b00010000000016001415970205eb8bd576e10be2a66aa03bfd8d104440d3be69010000000016001424fc17111e5d4ea7e0871b05fc76de3bfba7f625000247304402206057990b9d75c5f952738c5cf233cd7ceac9836dc5f7737cb7ad0674ba7a527c02205f4515d4557e2f772b16689a86cfd0224ab98405f219b884a53af2ebfb19cfe401210271b6edff401a1d31d04404a4f1f2d0712dfb49c6d976698dca7fa02c0901eb53000000000200000001d3d78b18180a84eeaef17183fe83a61f203a8012ac5a776776a08412c9cbe1d4000000006b48304502210097cc7b385d5e76474b38972693c4b210eab34b48334774502b7f46233bdf9fb002206a7cd97146ef06fc1e3dd76df48ffab22f3e95110e1ea1141ca89475902f425501210305acdd7614c0b32e3c62526a6d4d366f7485112b2fd631319e16e527efd8aa52fdffffff0240f15a000000000017a9141e1c22826d8da433b9a900b680a5568a02bc570b87f717000000000000160014ec824a97db013fdbfc235e3580da6eefef81a1ab0000000002000000000102ccdd693502b4f24ffbdf189ae2d4cc270e2b819bb4d7a87fee4b755e628a02890000000000ffffffff1cb9efb3b94c6869e42e47686880daed5763993d10e6ffebb0cf9669852633f71300000000ffffffff02f59603000000000017a914a6134017ae547edd6ed376d193b70a7a2d1dcea08733070500000000001600141da53663e51362b537abbd6280479b3d99f68a0202483045022100c493afd9af283a0df09a08b95c66a7073722d47a1c72d9b6d7ffda26ce695fe902206fecaa2b7f29dde073bb682e4e50577a5ae278c7e75e756a3d713759e0044de00121037aecfd92d349c85768fe285e3f04797a7f299ecd8baaf9da7e6d7cf8485292280247304402206a46ba9f95349d67036b98abe4f2221af25f645353d7e7a841b0854b7babaad20220018fbf7e4f9e6ad07f4b4ba8c17521825c1201eb11068a44a86273a7fea9697b0121037aecfd92d349c85768fe285e3f04797a7f299ecd8baaf9da7e6d7cf84852922800000000020000000001029966e36b28a3bb05e174fa0877dc9eeb346fe9ebece93a229bbe79de390bc4670100000000ffffffff67dcd5e6b630ae93842813e203532782515653dd1d3f59970396beaf790ba8410100000000ffffffff0213fb480000000000160014c18004ab172fa0b83862c32535013073f51aecb7441707000000000017a9142bac30268f2ffc41f39ff565e683fc61d247e846870247304402202e54e79a4d8151f376a93dbc714a74e02b292ea139597065d975beab46d3cc8d022079c5e48657b4c1199b7b2924ce3565370388ca1c75f76817657e73224720ccbe01210248cffdef2f6c838c16ca7ed4d02e75dbdd3d76e8f3933ba45f7ff54b6565d85c02483045022100aea5923a52f19e09c6d53e36b4aec3aff5a1b5370e326e9460c658c86a4034af02202d3202575fb647203ab82ccd42897c1ee575fa702b568b13e6c74714f872ed0801210248cffdef2f6c838c16ca7ed4d02e75dbdd3d76e8f3933ba45f7ff54b6565d85c000000000200000002db4c5ada8524786cfdb339dbac4dac441b663595d27251fbed7cb07332ad901c220000006b4830450221008174fd067808c6cee38bead335b5c223e1c2016abac6c4a69768c95723ee4d8e022021a0caa072d880c40db0b0af287c89535204d71e6813fe8b77094e622d9512060121034d5611c3e80beebd9b639ec26c084d30c5ac7bcd6a62fa8425809f1795150f25ffffffffcbb329383e601f5730d18d63f8221f48b14e7ae010c34f683a2cf06e6694745b210000006b483045022100b1bbb13090ac414643315d6e67e41305d03cb64d38d7d9b922717ac465cd70fd02201dea0f6b29202de5b40b0375e09ef3b37035eed78a5c802d73ebdbe1957846450121034d5611c3e80beebd9b639ec26c084d30c5ac7bcd6a62fa8425809f1795150f25ffffffff026fe70c000000000017a9147c963e4296d902138a07ff648d3386b52976d95f87a65d030000000000160014a6459452023cbffc9838d2f5003bf5594975d732000000000200000000010144dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb0300000000ffffffff02e85c00000000000017a914a9fc48103aaa00496467514339271e40dfa287ad875462000000000000160014c802d6e3888d4179ffb0a6af6ffbd6d5fb3ec09c02483045022100aef24a7a6b44012bb4fdc7d99d5e09c1302c27878f0b096a21f82376dd19370c02207d208ef9533ce0e5c308b3f718201e10d978e8e8d46442baa07519fad143996f012102605155f6a65cd3fe5acb3803c2901482c500ec09bae0dc837b233e07ce3e22450000000002000000000101cca81ccfaeb9d828c7d662d077d9dc1137db79297f33e7da099859d1843457ab0000000000ffffffff02d8d1010000000000160014553d62a9acafb81abc492e2bd58fad0a00667d8436190a000000000017a91467518ba51c830a83c8bab60b260dcce8deb678ce8702483045022100df7eec10e5bfc98adad79be740acdf8b4f1a5a69a8c1db7865cf7b3b2af0977402204c03f0972405b1a163bc50e4ef152a3af5252c05166d73de72cc5bbddc939649012102e4a0d9d3170c27adee29412dd92d6428cca8f646e5c921c35819eb4d759208340000000002000000000101f02402c5ae0835f0a22e20b211ad1f3c97975b11450e1ad920412437799da7bc0100000000ffffffff026c7a08000000000016001430c327f3710aa3ef495773269accebc8671e26e324ed00000000000017a9145071e5ce1d3fa81c52fa83ddc3ed7ac86d6edfc48702473044022031cea31c4a2182432a24df25fe3c64e61ec605c06e5134397ab295c6985092060220361211c56a0b12977426e6700bb643faadc9b250d9670bed157b8be5f2ec2843012103c3a4135f766840508fc16a2ed6410d6bde15d93425788637031f079d40ca05b100000000020000000001018e836dd93e0828505a98c1f89bb3599185531bfb9fdd5cf27da6281adcf2240a0000000000ffffffff02213002000000000017a914690f1bf881b19e244b9161383ee1edcf90fd056b8704b20d00000000001600141c7d7a96a4d45b11df941eac738ab50303505a8e0247304402202a8d19892063d2a39a10d3a6d9f70ab05f4994f2afb67e4490517efcb8c1c717022031c82b09952c883e39269a70ca203f67303f978af7e04a26d7796b7203fa23b6012102ea86d4a7755b1aa708a187b79432d6a667ec4c18e5d8e02f641c86668f94e2ec0000000002000000000101496608b644800190dcc25e82f9e863a81da559b57e5c9dae0a48a5f8de259da60100000000ffffffff020f79010000000000160014b6e82716657d71d326fa0b45f0829d2fa5b373a952f103000000000017a914bcfeef7caa0e83f7ba10bdd921fbd01ec878ac658702483045022100b197a312903fa7e96ae199ba1897a3c545075d90b95b1c28391227841e3fd3ef0220772383a77ef472b21ccc132e9d95b3c5b2cebda68a8036bb83f63a0c38101fd80121031ed69f15d6bf997fcc90331706ed927c656f2ef3b72f57cdfcd035e61a7d559700000000020000000001017f11627ab495c832fe810aeaf5c2ec5e79bb9d691a5c79288b5fe557c70e0ba70000000000ffffffff02b15801000000000017a914ccbd5134e6974dba1e764f81f6e62998075b784987aa6e01000000000016001400e9bb489a13b22265f63fe75cd8f011ea119780024730440220071ce677f7a7ef584aa99b5695fe411763ea9c4130c35e9df9b45a241e367ce902200b51d5b15d0310dd30936d3e744d0c1093a7561778982bbb0fb70a97beb689d301210324a516a512801d23928d2291e2c76e32bff06ab61a9a6e97d43c2ab3e0b7038900000000020000000001014ba8f719e905b95dec97c204ac7021f574642a7527d0848c4339092d9be1d0240000000000fdffffff02624e0e000000000017a914772e0aad81005650827825b56a6a7291a7b5a29787566d180000000000160014a03c7df6b760f2ce90d6c7de44d2a9bae9db6810024730440220568e6e3f1c234512194ca7f27e0bb919a4ab52f24e38760915dbe666497ada17022003567dc2bf61d9567db0cb0f24a5f303833db26433ff8271e5e8d83ad09e9bd601210331108b285d715b8935593191bf38935349f4425e2f9318e674630151b81701d50000000002000000000101b59cdbf5cdd0c55aa540dc883f03b4cd361ad627f22cbdf136dd5b1e23a466dc0000000000fdffffff02291b000000000000160014771e48899341ea113b715cf4b4935e9eb24f303d305600000000000017a9146a6cd3d25548980355a95095447e606c78e5ac348702483045022100a1b0fbadbc135c6f5899e607dcfcfa4d466283f3c135f02c0e382dde9a16a24c02204ad31ce97b8215b33779bd2a1e71d93c9b300e1ad5e64eae64b26a2a38b9a18001210328c5d751804d8ed21d2de120f530401b7244588cafc6b7a97fb8f99b2ddf265e00000000020000000001012e471f40fa790c72b24f066bd9a0b52080f964bc7ee9fbcf86a68362f73d8b210100000000ffffffff02908b1b000000000017a914bff2bda6350c3627239f1ff219cc2177e85245d587db5dff0000000000160014695df5bb9a4d8ac47eb969bd3c4c9c140a2b5f0c02483045022100a265b35681fbac33cb3feabea2f6df2fb86f8d4650daacbaf946afebe5ff31760220073adb38ca87ea5ac5c40b1385e23b7f79afbee40b5e2cf5504afd692acca75e01210363321bc3b22dd99ffa99494c23a55bd2ce2e6ee136574c610c3d873e878199d00000000002000000000101aa76b738420df8a6c9efbef44ec5dbddaab950d09a9af1d482f5350a83e88a460100000000ffffffff02524f86000000000017a9140529fb444b22d13bd3a3984a137a210b843e67d087231e000000000000160014a852d6b135b3519b027e931f1d61f67ae73edb5502483045022100f28263102171893cc83f4f14e90153e393063e9a50ededc5af941374dc01dce5022017f8a0da6601a6615f2358454a9585575bf1176b5922dd291dc1caa0ca25663e012103bb916875a57d340d2ae159894f00f27fc3d643861c24939a8b4d84fc6c615a5f0000000002000000000101346e9dd71ee1627cf38cca725e905fb144d811f3d287d2e7246b01465471a60b0000000000fdffffff0218f600000000000017a9142c71dd475d6e5e0679b78a18aaecd3fee27268408736f5440000000000160014ef416262b731b2500b6df65b2b03f100034d10f00247304402205df94aa3bebb9efff27fca5713777ca015266a6fa1f6059b0897cfdca1f9acf002205e0f7cd6047b399b299e0c49e0eec42855cc9a440e133485b9577596e4982875012102ced7adb74448ab35ab9799b686b6aaddd12ed4df3e13502126d70bc49d7d726e00000000020000000001018b368a0b247672ffe8ca3cdb7dcd2bf541515399bc746477450e2d5489b442f60000000000ffffffff02c69e010000000000160014080e6461c16ea241ae19279c3257a70445fe92e7c72201000000000017a914f6a4d2521f061869ec30c53536230624825971b58702473044022061960f95ca13489c969329b0143680df23fd350c1e314c8ab6b794f9e24897ef02206281035738f593f3183357e7e739c439e0fb6a3ec74bdc85129dd1dde83ed64d012103d9bb002b877e7a996abe298a123315e83be94c8641f8f49b5bd5b7a1b74dcfe80000000002000000000101bd78a201b0662eb5631929dc41459b27a90102873b0ca8597a4277f078de52740000000000fdffffff02490c05000000000017a9143fc8ac7baa71a3bd7e6ed61beff39f656340b12e87afed0a000000000016001483b1dfdb20c39349c3436153834eded8bb966f0e024730440220557a48951f87c2dc452078fcfc7c52a4ce431a3cfe34074670e5fa11a5f7239b0220645fdd869c967b68cec1ceeed6b83e93a7b00d54c1e9a0ee57c91601581483410121020d80002cf99c05116d05d71fe1e65ee858bbdca4a302f2a6f9afdbd95f63ec03000000000200000001e15c0970ae101d6de8d817aaa29c78a5a1d2d0be68ae7bc7cdde58a26fb1a5bc040000006a473044022075497f3fe0c47fc5e4fdc00751baf12c5a78fb7cdbda1ff9306377f6fc862d1402207a0888bead7f8faf53d02f86b516d969cf08a24dc58e7a1142884a07fa1fe85501210239e69a259c14e71d58b71b1d3bea33ba64c7f872537a64c6ae36d0216449fae7ffffffff0351089500000000001600149506e7e1ed12ea1b5e0b89e970f314d4f6dcaf7517c601000000000017a9148fea3201ccca491c195f22f713dd46d05c58605e87f8f95644000000001976a9145b4a23660279d1b6015d2a35ba3294269486d8d488ac000000000200000000010121ca750bb20d33e1d8c64f5a51261722e699c73a141b94d11561ff4b632495b00000000000ffffffff02cd814a00000000001600140fab34cf983e5d3f854850f5727c737b164b4e0c42814a00000000001600148fa7ef1f921ba01fdb8ab2be9da98a3f89b7077102473044022023e6a7bc0a4a77f90b2f2a306a238edc27f39d2c1dd716d050f5eb28fbc22a50022030b40cefbde46641de7bc90392ab62b5c04376e33b1ba4a092384ca325432db80121027e6f2c2c8b6375a7b14a3eff50a6e0ef77e449d1974e23510a5585e0554dc4e500000000010000000001018689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd4500000017160014aeb00824022e347d66fe35bbfa2117e9e16f9cf4ffffffff380aa302000000000017a91456f43c9ab22b7b8d25db05d08e1b5a4bdfb7107687804109000000000017a914c47e0cd6318dc0144b687c6308e5b6a8d3b301178752d704000000000017a9145be5f6c73ca2402f4d2c9d3310dd781a24d41a2687b10804000000000016001430e0131101a2a2cfac126061b91761c711476f0d8f9a0100000000001976a9147221879216242eec366c47b1d032fa880ca7802588acf8ee0000000000001976a91415d5d60f5b460989008ecc3eea6eb0eef9984d5b88ac2b9a01000000000017a9149e2f30e10d88c0ba1eccc9c6800ed7ac2c4b5b1e87877108000000000017a914bbd34fd34e1f459e18a20dc11d096a9086108ea1874c2e1500000000001976a914330e4230e77888113a5410af4bb0fdd8c963134988ac042b0700000000001976a91411635aad247b9ede39359a30d27fd6d6c909956f88ac4d4d0300000000001976a914bae72f91e2b8aad7e781be25805d804a47ed9f4f88acf4711f00000000001976a914d250f34d44db57ffcb3cec307c38251f97c80fef88aca5c800000000000017a914414bba85edb72465a897fc55175ad02c1246159e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764c8703000000000017a91458edf862cc4e84266608a02c788d552adad79b4e877be60000000000001976a914c9c26abcf91f1a6e0630aec8bdd0a3020277038088acafe70100000000001976a914d7b6261c82d1b555c114dde43db86a79ee43f12e88ac3d3b0000000000001976a914da429b5260797fc42004b0e0899aaa72b2167a6788ac68ae01000000000017a914c304730c05c9f3a9b3c1bd743074a8748a005b6f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7667c80000000000001976a9142d1bb6875741cd936ca645ea61e9a3282d3cd7c888ac46a721000000000017a914284317f6da524925ddfb8632a15f5807abb7863287440c0500000000001976a914ad2cd0482c665016575d4519a4775eca8c092a8f88acec6100000000000017a9148903461d52af89bb0b8a9973d00947e9fa7c83d687efbc01000000000017a91432b1d6224602329d3e629c102b7ea5f92ba4a875872efa4c000000000016001434670074cf0789de7c5e8a67c208248751a34651bfab01000000000017a914949becdde47335277ade5ee222ce650a47ea8deb8740eb03000000000017a914085e41df89ac4ba460232f2a06a814e719bb6cc287dc4400000000000017a914d11c96ab4bcd62b8aeb6b31cece1fb346f97e73187f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76cf6902000000000017a9147f8413db52ff8734243dd0cbb7531ae86c08cb8e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f2531b000000000017a914b728f965608c8e46d2afaa3803aaa7b1a238934d87df3c0200000000001976a9141bcac61710eaea28c70bc42fbe517a3ba2ac2a0888ac80f124000000000017a91456283e85d0f2aec66bddc06b254066e2f06b8237876df00300000000001976a91453b08defe9f6de6cbf5ea69e7756f1f9d7a5d3f588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7663140800000000001976a9142d47aaed3ef30b445fe560adbbba7d57fc32974088acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a1460000000000001976a9141129f03811526caa2a25f486d9586fd376257bd888acfef401000000000017a914f861eb89867c62d379078b7f455b30123f46ced28755370300000000001976a914b6fc7f51d1a550961bd58ed3de14cb050c25740488acddfe560000000000160014bccd1069dc89aa78543eaa766228fcb4b336d36ec45e00000000000017a9148bd9f6f4ead6482154871af19f5165783eef1e7787d39d0000000000001976a91435542d3cfa6da45fc8f054019033f3b4c385dfe488ac176e5000000000001976a9142cbd56302afbf313bc2e4d36bfb6dedfb2665a3388acb361450000000000160014e58c783a93003021a0b6bd73b9ebf8dbce68efb8774e0600000000001976a9146a9c2a5949b469eb9fb2fd73e3a113004e50c0d388acca8900000000000017a914d5dab13e9531245eb4cff2a46fde0e4996d039548787d8020000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a7ad00000000000017a9145fc0babd560a82e9ea7c9b36911a335c07d5f6fc8733f10b000000000017a9140df0299d4f1ebc666e6d54b3466f0c494de86cd087a08601000000000017a914e0b342cace3d59b9d692adfc2fc319e8e0a87ac887d1630700000000001600146d6f6ca0666c3443113b7c6f386f02ad265f15dda0860100000000001976a91401f2d70caff07f26f7c919aa1a985a7a3b0209bb88ac02473044022051cd0ed6de5361f92a7a652a447aa32be8531463e9c3fe41bbb82ea09896cb5602203aa00340472f52958f61e55bfb884026ed37b3fb447d8a58db8454052c15587a0121031db7f3a376dbf8d3082ad1fc8c72555ad1dc74aeb475f24dba9113201dd34ad900000000020000000001019352e8514936cd2f89780c75bbba237d1c27574c2d1a34c530e172ba01a085913200000000ffffffff02567a000000000000160014f3d7e6fae2c46d19ef767dc5cb33ad3c230d30d4fb4f02000000000017a9144f468a007b8bd3b788dce89ee7ba30f7f90a8fda870247304402205cc0ecb9b3e75f1b172f3c296d3da91fcb49c0a0a427fbc90e1295e1326abd9902201f077b020a903292c9343a11c925749bd66aadd0dce5856bbeb4ddc29321af70012102a8d33c25f5edba9c2e23da268bd2ff7af04c46c597e9aed54adf44bb15c6751a00000000010000000105a03b6b7f438e16ab9907c566a10624cfb033cd60b4d6604638e4f0238a575f010000006a473044022052f1bb80a199c0eecdcca3e047a4e631e67538b77417f11774abeb0ea2ee773902202c93b3f5bc250cac9e36b4584b642426a0811f98cd49ee17d0d9947bdc58c7000121036473d3740cb979be8f6ac9ecc98a493e3001bf184cde90116e4e07b9d78b2d99ffffffff01ebfb0000000000001976a91454a36bbfff043077d3c5de598f9d12722aade11a88ac0000000002000000000101cf01cacc1a888ca6adccf4b1944e795e929a2702f88cd3bdb9294f1b7e9d2b7700000000171600149937341a916d0c6b9ce10e6d93e7fdd68e0bf502ffffffff02c65305000000000017a91442e39bea24f0223fde88282339f0b6e273b3457987132103000000000017a914d0d8b0689bdcab9dcdad94d65652444c18f7c85687024730440220670f68616bcd4f02a118d56b4a13311acbd1998bb48847a20b8da48a47efe1fe0220418cab356fdacd0407ced30e1269cbf5814dd093eacfb280a452e0530c8a46fa012102fd516e1fdcee31f7e060add9df5f18921c231748cb8c1b12bc1136e820cc31c7000000000200000000010202342db74cc7a63c36d45a592a58114cb9d77057ce954d49c2521a639cdc63840000000017160014cc8ac66cfa36ea493b9b367c98ec4dd64414ba09fdffffff50beae74208d47bd8bd543d158c3e9578318f1b6e45b0dc2fbbbaea1c4be4ca2000000001716001455114a4fcfdb4f1d52aedb16650d13223a1bd9fefdffffff021c9c53000000000017a914695c5ffe322276cbfb8bb953a2c267777906fc768740d3650000000000160014785ee1428defb653a8d269d4aea8453637d3cbf902483045022100b5f45974b17e452d317d52cda1a4693c3b0d32ab9e30f42e335eb294c5d405d002204bb83d02285e8467f6466663e55bef718c0d3004b022cdf7d433f7dbaca72578012102434dd01d50934c6ea8f20271c3bdae554cfbc119b38bb105795c1d9b72023d5e02473044022070204169657696ea54097d5331cb4eb3e3b347f2979e99682ce041e066dff5b102205f247946003f1373d2cd241e213246957c0bb222723df5ec7ee89c6fbdf21227012102b5ce5eeb090a63e53a49aa58f98b69c11c5809c202772e21f4b7182895931bf249a00a000100000001e1dc1ae61e18151aa12271d2336c8bc7d1d623e62a2e9d733ea71a21ac7ec00d010000006b48304502210095c96225295d2dbb9c0a87fe71082faeedf4dfbc17b3fed947582f0d60de986b02201f05aea325d2acefab18b0b6b4e6e3537a47ea4c4c770b1aa98737ae7878bc18012103c9190e5990c1763ba41be0e5f7854cdb8b57ea42dc1634baa5189950e782b3ddffffffff012b5429000000000017a914d8f3d5326e69beacd5c29d0ad89d13f6a9226794870000000002000000000104551364ae14ac8bda5022d3c7c6ea368bfe07b3bf4b18dd1de784aa7c56754e480000000000feffffffeb34a7d1edaa197decd78bc0b47b91888e0f0254fee1b0d9e441e3aa6f4f62901600000000feffffff293b01161bfa6fb215bb7ddd89e9617610f5977f80df73b079412e15142714990000000000feffffff867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd4200000000feffffff02e0220200000000001976a91475eb86e2fa02cb35d76a88e6bc6180833e0d3b2488acd38b0f0000000000160014bddcc85fed54e7f703c869f974630a4cd654e23002473044022037af2620f2af64a23706cd72fde96245fd44616fe2769b0dfb3745c87338222d02200b4c34600139c0e041e1023e42e04937875787c61851cae6fd1017ae88a8da410121026e7a1a9d07201ba4482d6e2e6f33751ce5248fbff1976c3a94e64b56c96da6e702473044022024014c13c00154eee78915553d478a7622ef0c5e2fc6f377ba35a77528ad3496022058bc6349411181a5f25307c11f24936dc2a58edd273e1998b9f97ce8c3b567200121038487c38d87f9c55bec9d3e5c2682f52af22f5dddfc0130f39f46c219865e665502473044022056e933447fdc93e68c9f604372768ee57d957fd6c61e92af0e96e1bda007c82d022053aea7d03c0fbec0a7d09396c89ed04f6f318230b23a21ef554198dcae2247960121030c008d3e4879b5613145adfce34bb12fe6dc4fb393c3afdc8462090df38dfa020247304402203b32162a4c0fe3c4ee95a367e2242aefbf364c502b1091b8399b75226322b83a0220718a0b122cf9dc301ec8628524e6a49177161cc66731f2748a4271165962068201210284cda6f896d027f18256636e804c1849e284011d667c13be31e48c108fd0cc4549a00a0001000000000101285dc6e63cddc530b5be94d024451b09f05ac465f629df22e5ac22b86d4ea1240100000000ffffffff0260ae0a000000000017a914c866bac5a508f274a1f1b59bb34871d432aed62587fdc40c00000000001600146b59b8bfbce4a543f34483c56c030e52632532720247304402202364a4ee0a08a5b39a32dbee72260771dea84ec34304fe12f0d0c9b9722455e20220478215c44f7de455e526ac9487e28b3bb9eb729a7ea0a69176e7c6da655e53d401210225e2f4a32634f0b78c2cec656e2c97117c7293c27eed06c8a3a8e1b20a045c690000000001000000000103c70fdcf46a91d1e2ec428b48b8d613c251ff5e482ee224fcc9e5d4dabc699fdc000000000000000000d4f6e0cb1754ba60ddddb80e344dee085fa6d1ef66a4511398268802922d50f300000000000000000023851418af837c32f98df5a0005467aded4078a7d4c4d26b804687bf91fe8e610000000000000000000200c2eb0b000000001600146478165e603a367f2cf837404054cbb6f75c107e4ad9f50500000000160014b872499a87148ed51c904280684a94af749155370247304402202b215d9b653cdd0c4f7f40a5e12ad29fe25d2200fc20db6e6c2006321c0d483e02201917915f863a643832af7528a533603266fcf7d325d4bb0f44b4019e8ccf445d01210266fe876f8412f7e858d582004c9bba14e4fc63ec408516c474830ae43cf76c730247304402200b31009ec7508f169350b95fac71016d81c47bdee7586759ec6f6e09e33660ac0220184ce14be785576aa4ec1b6a38858a493334c0248e2bdcf40d5fa1b7ba88781501210255ce1f99b23be9e0a722258265526cbf3026390761517060d446e3b11e5fd1be02483045022100e5edb6f1c1e1c8b4c4f6a204028ab9e4ed89b9e686e467ea6ec2cac412aab1e40220294462efc51bcd64aecd24c9c93f68465a165d128388a09b752436419f5a2e11012102d7faef7a83d756543945a5d8654767f08b8accfdc657bf4d1571ef8a895a63630000000002000000000101528bb4427ac2025c44c4a32a6b82f3cb1e4d82d32e16d3b9170fddc82d3604d80100000000ffffffff02e0ab0000000000001600145c9def6b8870d5854ec4864d886c2fd3946c6d7f3d7a100000000000160014268e04332389ddf12c21fdfbe9825c8ae0c037a502483045022100e3013219337130c54487b7a49b3583a269dfb04cc66b60d05207cd0f8a452735022049ff786224a499a7974096bb5c01a2d0218598c95ac64ad45095ad59892eb27b01210343b0b7cdfe46221cbb2c404e6de6d06160fa1b61dca431486cbc7608f8616229000000000200000000010132aae9f04d4285a446d0fc477e6200a156b60053abea023e068372bc5e02fdd80100000000ffffffff02e0ab00000000000016001426edb76da94a2470fe443cc474bec0b881687a326dca0f000000000016001492ca85ac82b241571ae5c2bab58b7ac25e6fc5df02483045022100ce1fd0834a373a00c3fc2e2ed2d18c5fdb71886642d943d7200d9d5ae44a2bd7022013e055a5fce33665ff624d36b7660117b51a11baecc7918d6ac9255a2a673fd5012102c281d89653dd46eaa45102a1eeac61f7abfb869b60e2c346b35f702a6a3b734a000000000100000000010103de176fc5dc45c2d88eeebcbfb4fb89629251cb114213c8bc29e039d18cca900100000000ffffffff0280220000000000001976a91461150c6f1d8d914c55b26f7b76d0d6bcc2b579fe88aca2a36200000000001600144ca380f569a92503ffe5f7888290c61c12067b7a024830450221009e896344f1e20de3e01783bf90d838295fb0192dc1998d30f11791fc4bc11f7602202af98f87c5af77b5cffe97e91ca744ae4c24ee75b54ff487066806ae2d048cc90121027c301ab5158187c7c24afb6de2d0837947d2ab1642dbca0f9d66d868776f2a590000000001000000000101330d3d3b0a3ce0c02a89cc384575e773e726301ce70963dcca23c940015613990100000000ffffffff0208090400000000001600147a42864c511397b9fc4007faf970814432084a859c965e00000000001600147601df0441a8188c68aaec1ebc1830e1560598ed02473044022042f938424e49d8fd879e84d20cbe7c6cfdf25d2b1fd713682c5d9bf2ab9fd82502202491aacee993067fdc8faccd4079efce5ff58724c366fbcc5880d6caa582bb28012102024b7b140df01d59a670f75e61c2f3311f70e6324db853ccbc53427eefaaada70000000001000000000101f269ce2a70728c1532737eafafa4be1bf3b1e964d548a3e6231ab6d55a0ec0d50100000000ffffffff027e220000000000001976a91461150c6f1d8d914c55b26f7b76d0d6bcc2b579fe88ac8e6f5e0000000000160014fbf5166964c28ad8526076a3094c3e09d2da679102473044022068ed738cde29bceea4464d57353f56042191181e8c1d59ef204806b72bbfbd300220267716e13e2c3d04e4884508f2f469f1ecf0dcc125a3596c9137b63ee5f36cab01210353c1e3aab263d38311bfc871304a9f4d509813f71d45c7980c0709c4dd9327330000000001000000000101f4bdf80440c90b3bc56058eeab31350680283298eb00c39cafa5f6ac9928424f000000002322002018f481af0c4fe19445d25a373d76eab6516db4a21a9ba35ebdaec773ff79b044ffffffff03e0760d000000000017a9146ea0978cd21cb4e16b5610e5052777ad20d1d2f98788a932000000000017a91486f679db395c942f09cae90533afccb12e3e143c874d3cd4000000000017a9142a1cbe7013db32a850dbeba96eddd5196b2aabc48704004830450221008379d6c94642207acde61d412181d987f54536e5eee1353d53c72b0f28d543540220415fdc90bfd98f5ed462db743ba0bfa0111fd0c4698e766025c520911e4a9ef10147304402206a3cc720fec0c1fc409c212c9c6863cec8bbdae3c15125366b00efb16063f21d02203fbd5ba1611d6271c7b89aae2efa01a908a0b064c72db079f6444010ca7decc80169522103e70515a2c0e259bd41327e6f953f5785234f893d2e26fea5413ee0972709a74f21020370c28d6fe2bb7919bce6117ac92e8caea916823ef3abf0f9fdb8a980a95c2b2103b05a1a823e605541795ea9c49bd5fef7e4de0ae20878e70a12d9c55f7594c47253ae00000000010000000001012b52cc161a715521150df99b8784d5e389be45b97b42264ff3800969ebf0a9bf01000000000000000002001bb700000000001976a91452a7b74417145f9c6504bcd112eca1e4387836ac88ac98d16f020000000016001407bb97ecb6d3d101f903e58f921c64416fb4544902483045022100a0a323782de7331971045ec749ca058fde5233ccca13bbee813997cafe0d18e302201d1fcc31384ec98f5faead4b3adc53b3706b976a450e66c5cea7d525193fd731012102c731f0493e2cc9bdf6686a813a0f82e138c831d77be14eda4c7a836a2b8b2f2d0000000001000000000109469ab1ca38874e71d0ce9a8537c5bae3687fedd530bcf39a57df6b7969f1250600000000232200209f46f5f34beb2cc41241c553b2389dfa65ae3683e257cc87810898cdf460f8aeffffffff00679327cd2a693dd4845a3eb251896a28c44dac01869f1c0f30671c8e66b61a00000000232200200f2fa42dce6a7402a47341f3ca51d6ca406be9368bba9cd143c821d5a10bb08bffffffff15d2c53765cbac9dc70faff0177bb629fb4f842c25b8149a06b6fa995fca322f0000000023220020e02afcb24d2aa35aa3093067ce35e19ce8d034f0db91695ae0ea0a93045f4dacffffffffda26f1d652ffa99015006e492dc72c4aa478dbc736684f48fe41f085ad1215330100000023220020ff899e5a6500552c8b18c6e4dd53802a28b267f4f8136015de3d88e855dcaa77ffffffff2e25db6d3be74b833a46782f7af45168cf3014fa0f0f0f33dcda5961e9bedf560000000023220020cd7ab0c094892fe3bb20c1a4b447418521597d31d184b188a1e57d4cafd10378ffffffff83691a446dd5a3c37755384f93759fdbf3b76a2fc95bfbedc4740caaa9c253790000000023220020b1ba16660b9eff395bdd8017bd18a4babde826aff40d74864afc9f91e7be9659ffffffffb864cefbf182e995effc93d420ec14d966eb52517c3c0f062e7a10c45a0825e3000000002322002070f553121b2c024cb81a1d27275c1aa22418e496247a3e4eff6ae1eea986ad35ffffffff5ea70142330b70711b510a91927b7f3e821dbfed7adbe64d2f254416ba37ade8000000002322002095a75a813dd1148e1a9378174e2a2d3e2935391c83aefb55fa9301e72485f74dffffffff15a1ccaf3333e19ea2687cd534d54b1c62a570581f9f47b011d0ac24927410fd0000000023220020c4d47cf6fef2ff7ef851ae501ad9c485dc5438a12406b148d0c6ab8df7ef03bcffffffff05a99e0100000000001976a914e9bda2ba15eadff41bfa20e00ccd83d58f53375f88ac2b050200000000001976a9148e88fb84a3ff6db6c1113339e28321a567279d4d88acfee80500000000001976a9148265260b5b22f6512a06c4bbf3193f324734b78b88ac20a107000000000017a91488e943528cf757a0b352980c16937471004b7e698780d810000000000017a914f5c7f4bae4d00756ad548e128fc5dff9782294fd8704004830450221009f91c4669febfe95afc12f86bf51223e275e46ddaacb12d1631d39e100703324022076d1e025c874ce2ec2aa3f1947ce67e1ed56623929b1956f8ae2900839aa4b4201473044022034db76cdb953749e414e40a0bfdab1889f19e3d379bcc377fe4b1acca4fc2cc20220439b71a794f6afc86503842152224dd1332cedcfbe682d0f1ef911d8469b9271016952210213980adb1b0d246d9c937111ecf5e40c432d9bb71e6398cae9a9fbe67e5eda71210268d1b88230c4bc40f65a521c9ae12f19d7a6812228b5787a2815688bcae5205e210309aab3baaba5493f5cf7bb5499913b8f89ddd449b2fc6efe9ba2ca34b2116ef953ae0400473044022016006da1df352e20f22046de8d91c43015f08649a0ef741c23f8a04009f23e35022066b0a2ae99b05887e5f86f08d31498d18cde54eefd5895331c35008ef6f275b00147304402201d2aeb1323010c79bd83a2eb3bb0444c8a81ffbe59bf2abf072a2bfc1bc5651102204483ab59d77570213bf66fb09564c7bc1975cc5d7b2361a3ffdf73325614437301695221030d585028661d9bc82d0d1e99b82fe3fa69282d98745e2bc8b48019b1350b3d8a21024f1bc297ef9ce94a80a8836776254ed6722f1d344a54050f56bb6b6f899c299b2103ddc591692c1b25176e26cdff4feb079711c2cbfde4d8c8ba3a15c54d6174928b53ae0400473044022007685ff3535ed77c5624107bfc90c6865f6c8b84f725644ae1629ef480dbcbac022071992b9dd9d52c82a556a268c4d4ef9ee1f244a30b9d830d2df287c31a6fcb6b0147304402200d8c7807baa5691c08fd5bda0fff1e3548508e1a0c6fee6538337b496139042d0220125017769cdf66670c8888562c63d611dac0db26e629304f1f9bd08f40a717940169522102d9c010aed4df536a2127363360fd472d2baae177987320151814707c1cb824132102bb5f8cf170f6585ed0f8cc77f29d16d2cf003396cdd0956e4877b989add592852103894eca4c5a957d09445a7d21af6e923270aa5e3b6a8085fcc8b4135790a16d3053ae040047304402204904d27a6d62c75f2a740bee03d6323e6d4379b569440a31066dee027411cb7f02201fa2d149b32c08f40cff2df349470abb4884a8e30ffa4b228296fe24363156c0014730440220260f6e49f7dc752ffbed9a9d4ab7a621f85844c726f1d2e74fda32f02157672b02204b5669bfd5b1bbc56f82d0f8ca1bd8c817b972a331ecef61a408a0adc2088424016952210316ac5a19eaee794e6155a35340650f06501eac5377f733608f59b4a35178cf152103815762733a3d0563801044434dca36426fb138bc6513621a37a2bbad1b92524f2103fa7af1159512e08d6608cca1514a1f02f7d5efefca2d95b457fd8c798195d7f753ae0400483045022100deaaa84fba947ec35fcb1f6ed87c7639cbf0a221f45e7beaa50b8393202715b202200fed319096a48195b20b267b6149e36cd0f8f40efc94a821b8e3a9e040df63750147304402206939318a52838d8455f9ab928cbc69e47495345db1c8ed83ea38eee0b57c7dc2022060fdf7c46642a1141757e66d5fc8dfc019b1075c83aa3c46d6200feef85f489601695221024a704e6224ef618c5a9abde800ed0e28d5e10ca8e08f7cc9dff43195d24bc2162102b19cbb85237403bc35e0cc722dc10a86d3a608ddf5bf5f9cf93da4916655d43d21032f2ef87364df2e6dd4c3b5547787e213a4b0d33749c827ef66f019898b98272e53ae0400483045022100c50770dcfce01b517382e0c73676493a84fb1a3c656e9a089aa6a112bbb2286602206d853fd2d7dcf17f37398b6d5958e30ea7e2b6ac153975b10ac5d4375e5cb8330147304402200eb7bfdc9cf8533094f36487e7d87a2b5f23bbbd32965e2af1b7433e4bc1f80c02200b88f80ffdd636417f662ad81c564e7d9adbbb6fe1dbd09af4a9b23891860f2b016952210211b9b7180c73f0cc66a3c765e4d7fe37ac9bd79e267b47287f42d39eba478cf62102779c93510ed3b207e1de3879d569abe4c0f6a98df9e833694107168ffc588c202102795595a35f7aa60dc211ea966c2938e6a3e24e80d6ce2d10c2262fd0ad1fa02c53ae0400483045022100fd410bc3f6fbb05ce168981d67d3df41d2120e9c472eec36b67a7ab0f29d4907022065a9a46bc0f5e227dcc0f1be891170df475c9cf270370541bdeeaf963251a8690147304402200b2391817d3ecd9f83a9ee3331d2cce2daeb8701befbb37f65b1c9aee646afed02204ea5fbc1637478070ae78e881325ba05069dd1517344ca93396797bfe58a1f670169522103119d30ad5e81e4862267f9db537e17fd69cb43f4720e224931ee3a7a47ca4df821038075c0da033d6a95b1715f7fd7f08805d9b1515b631d26a34e6a8b63911d2f9f2103bc551489782e3cbe8de1d37ab173b8c3793538b7162ba5dbca06945b5c256d4153ae0400473044022005ac0ec7a170978a6353dd59b7cfd4eee31b6bfc80cebe2afa8f37a4723fd4f002200df5fbfd1dba872e23f43e0d83a9b5ac216554cad5c53212a4329470af757c660147304402202549114d5eb3426af6e37952e28c525010a919ac72d9aa09a894acbf878c969a02206e551b5228fad6ca6dc1aed33ae4e22ff5f30a1fdd82177e5e0bd4220a7bd3ac016952210202b061b414b6493e7dd1548162b005642f17396d53097749545e475b3f27f6f32103af5794585fa3e5836a448d0769d0c3a57e07deb383279c989650e0c527abf8262103b4cb1388ae956c8a50c312bf70400a3157e57ec1a78318625cdc6d5dbcc3331c53ae0400483045022100bdd158437cebfb1470491cdaac06938e7ee646fe02aaa490d9cb0c1ebf9ea9b60220766009170663d0da20a73d47be3c68e6ea4c5ffb6c143e2829831088805b4fb30147304402206ff66cbfb3c97950dbafb5fd94e460cbba854040c20be38ce7f942f7cd3f007102207783a006012536d425df1233a49ae65acb494921877a72a4600ea947792e5f4901695221035a13f8812d6d6cb18ea4baa6acd48472eea53070b06ed7e849a28156681d9fe72102792d73c90c973d50ffbfdd72ea29cd6f2c348f6a6be5cac8c5be962c2e51432121039ab35c50bcfb3ac0497d0e3b568e022c265f6a8c1c0d52a2911ba278fb1ab3bd53ae49a00a0001000000000102ed636b765d99d0340c8ded4173455da2931b07cfece43e4f09721e38a2c1d02c0000000000ffffffffd29613e9bdacb0d41b798ea0caed431ea30e4394bd355c8abf45504959162b1e0100000000ffffffff022c0d010000000000160014a660c44ddf4e485c28e178bab7daddc6a8bbf53cf36908000000000017a914e5ef1f590b15d49669dd6099e6039416f7862e2e870247304402200502dcf3438af1b678b6bb6fa1866f01b5f232056d752c74a473095daf3419540220272e6c459778c1331cb2f0783d5637ff59a46b47a95559b74769aaf2e56e142d012102e7848213ec7d8d3ed0e3ae331fce95a41fc99481e718fb235e9b307954cd76e30247304402207696f327c10982e496be595469d2ff0ce6e89ad0b68013b9eee5f246cdadb50802207e185559fe60d3431481ae5ac8fd522c2d2a9f348713bb646a9f8449e8bf1d6201210243a3a0cee8fd0bec93437702c900a99611aceb53f17f05b9d9fddad99bb82f9f0000000001000000000102fe687cfa7da2e995f383ded4244dac256e6ee00fc40253744f65d61b045540620000000000ffffffff6a52226d8eadd58024407cd9f498587dd1edfe293f5fb213092dafdde7488a790100000000ffffffff02559e03000000000016001433742a3742f9d7d1b4fcb5b82e08690bf30efc6d3c6b03000000000017a914babbd3d568f27e541c5221b34ca896814df968278702473044022038e3d6bce2aa66c21c59142b2252e087668249e3930fedf6b5f9e2e077ed47d30220150aba23b0463c602a86e3200136d757a7d1d2cc17a3dbf6b5eb76d62cea098e0121032b4a5a2cd32bbac9e3bc853a5d397d27322d7ab15d7809218ac3ea3d1ddae7f402473044022003978b0f12d3709c0b380ee66092d687ec5715ba3866b7b2883b280ba9e151d0022005bc1a0df7d1a7debd80e8381a20e936b27d3c6e424dcbd50ad80bb0443fff420121025eadf91035d1b16665a3146ac5470bfaa38ca79bf336690da3827e51b0ec867500000000010000000001010f9c11cc06fa852c1a93e7344e7b3703b607908d0804fd1d9954e5615c630a995100000000ffffffff0156a0510000000000160014a5edca72b6454c12124b767ee7278c9366bd1f7b02483045022100800e7f1b5a30a0c969178cd88634ba18863d2e652c3ebbf0c8137521d99ac80d0220334f32c6a7910310477a70d3e9eb4df1f19057d8d28cd36a8362cd1e0bf09d7101210221ab627696af4ea97eff5cbf5f1bea09d5b398357e3019785d975fa5b45022430000000001000000000101b437b5f752f7c8018888eec713fa4ca5cc6e51a8250ac057d205b25e597460bf0100000000ffffffff01bede010000000000160014a873d5c1e3559fa4c8333bb9c1f152ce96709d3702483045022100ffe1548c4303d12deb80a55b64665c7f83cc961e20b1dfeb76b4f7dd7e4094a8022057eb2273ff7aaf950e3946568df8570cc4f4ef58884afdb053af9fce42f5b3da0121023b61cc6b7f9ce826e22c3054b410d90a245942041264b204d0572873eebc5fc9000000000100000000010144ef69b842e8b5dd266fa2d03a8998bf77ddd02ab4807e94656830b9f42eeddd0000000000ffffffff0142a96300000000001600147ebecd0465abcd5363cc12dc66f9961ea5343832024730440220089f3629293d6b26dc79852ddca0a1d57136adbecf1f924cc2a5e4d5d0a9d79d022000c5a155352bfd92dfa2e19b8a2576e775476788601ab6d65dbdaf57836b37aa012103b900bd10b4ea43317b2d265439115f7ad604afbfe5f51f997bb6f183d36a13fd000000000100000000010146573b9d638cbf6e7631366c6760ff72e07606e2d7ae165bd9bd8ad9f5e2d897f600000000ffffffff014ea401000000000017a9146b4649b4796a94b0fe61128c45f3d7cfeb613a23870247304402200617472cfa2a33fb121f34af2e2d7fa9458b117a2c0bda87b6023feac3460b65022072646b3e214c8c49165cd0c21cae938848c79bc6ace634162a0cb0017fd8a1750121027f0abfbb5e50468b19e78cbb4419b96a00b5bc9c14eebe86d5d3e8fad0dfd0b5000000000100000000010140702fc5120d9c27c23d60bf1f456db33f410d345d67be3d7a83247cb76042790100000000ffffffff01e1f31f000000000017a914d01dc0129621bfe6c674e83d4755fce3488e8cf28702473044022001856e49404e1e996c67f06392c1005a909dde1e778e070ffc3076acb6a4202802201be0ff750afb9713ed0f8cda0fa6afb940df3b9905d32b5e22ab446c9dcf30e2012103346a2f01f5cf0df2ebd77116b711967a780500a562536fe33cceca9ad185d1050000000001000000000101750120196659980346ba0279668bcb6de1d8c114c59c90dc7d166732a2a177360100000000ffffffff01a05e05000000000017a914fcd67b4c35a67e9567011aaea2ed16cb421b0bcb870247304402201d308c30c17d9231cca74d5d55e1b53802f4eaef1f858471edc80499e953076e022029064ba3238a1725bb0d66e5ae213a15c0d20c7f402fb99121c24fafc2e8395f0121028c4ab3f7f7b1d4dc2c121b7e27adcd6e980f775e0d974fba7dc268554070859b000000000100000000010176a5f7a41a73318e028db72d2fc2b7768b798d9de7fe3c4ea542301e71f1367c0000000000ffffffff01547503000000000017a91432f3f1e4e8e4c914c4e23a4337c198c2d849f79f8702473044022045d1731acfe47641241f37f241b3b0308055c1e26a8490f21617f445dccda1f0022001b40842f224a21fc7a86ef09b5b1cec7332b5e68b897acedafb26909aefff6f012103af8f3993a2ccd70298f63304b0c2ce0f40f91b4eb3e775312a38e99a605fde9300000000010000000132a6c340e5ed256f9abc0da01130cb03036bed51328e2d4b0af0aa98d119b102020000006b483045022100937245bae84742be906d2de4b36bd62d26b48d6f8e06a4da943e710915b380620220474cd95dc47e5c262bb683dc9372ba6f13f483e7656731e89ce184799cd3b3a801210219c42a836e17258cd1d8f5ab0041b5aaaefe78794585b8f01d20f1432b5d29eaffffffff0138d44804000000001976a9149e95dd36fe66055526f3583b4cab0be972cd721188ac000000000100000001f111d662b6dadbfe5bc61eba188ca3af2483825da767ea5abee3e85651a72483000000006b4830450221008c0ef78834d39523f2d16149cd2597162a971965422ed53149561a539cfd04d602204479cdb61ebf50ca3961893ca9eab320785a33d82ea7030914c03fe55330efbc0121036b54097e58fd12591ddc51c3fd8ce8491e98ab62cc32e2cecb7eb0e0a9e35e6affffffff02f8a701000000000017a914c1f3a8cb7b7d4b1175f19094c685934a44c21e2a87d4f10400000000001976a914abda4e5c70a40a48dbc34663ae1bc7faa868bdb988ac0000000001000000011dfe6dc515097f3832c3bcc7a4f70e398620a199c568296d3a81a28c837fa372000000006a473044022034274f1faa8b0cfcd693329e4a3df87ced46d414d42081a94ef0eb9a02952589022005511403f3ff3b8cac2f336888da59c3b0e3f66da36e312e25166253ac80e7dc012103c3795efb9bc9afa2bd7d307ee14c245fb5afcd90805b5469f3c29719a15aeb10ffffffff02a3da0100000000001976a914c6fa3403d93fcb9be92d262cf8e49d675dc5506f88ac5ef70800000000001976a914871655fd48378cc21457cfed945b07214acee6ec88ac0000000001000000000101467d68009e32e59ce4d1922e2eda72db0f8fd81063e86c368dd86d1f20544bcfc40f000000ffffffff01abaa0700000000001976a914476767c838f9dd9d7636925529a918944cc64b1d88ac0247304402207c1c6b569df7364b9c6d7692814c35cf6d750db9ec10193253699524d496238f02205f590227d67ed7ffdd79b8c94215fdf80400939707ac506ee011492c95023c72012102c93f7406421d4be2132ab18e7d656b62c7c9cd5f75ff60b829e21715957b23f3000000000100000000010158604375efc9a00cc99f6bf5e6a63f964610ef017be39ce06c8418622d78800b2400000000ffffffff01419e5100000000001976a91484ac82ccdb29cc098bc13228d5920923e31ade4e88ac02473044022007134d3b3f9b609b61fcb3a9146658d06edcad98da0d3934c82de73777ff279002203e9ad90465e1bd06e7458a5c1b8f9ca49b72ac4521c8f50a9156c3823c8019e90121021c278ded503f6f24ad78b3a875640be20322571e2e82766941d7f84f2af4669300000000010000000001049f20f112d177d82ef62ba4efe07a44ef9c3c72c7a1fd6848c271dce4f957b6cf0200000000ffffffff7e8f3a23d1507114fafbf93dc0088ff84d989382051f65bc4e62d7df76d9253d0000000000ffffffffb373cabc7bbb49b66b1de5febcaab5ba771628d4aa0d256151e3e9cb8ede5b220100000000ffffffffe0e897f82064358364dac41f74d2f12e1665dea31564638ba3083bb16b40b0650000000000ffffffff0234346500000000001600140e97ecf3e06e4239b0fb83fb40f0e2aa34640fc975450b00000000001600144919c47bdc38fae2ff73d524d9aa4ad84063936f02483045022100e49a8066e97f1d80a61bd1d885f03a4e669d627ab9eec3861c3b2be234e738a1022005090915f9492ee60bcebef9f9b4ae54c976358fc87d5a91345d901db8d52b420121020a67d2e2893c679f142d5daeccf6f0e107c22acc07098cf75edc2c4a51648ad602483045022100f87c70c0278c57016a62eb7145450dfba41ad265f73e5f97b766dfb9413b3f54022058d1f82787796bf9ff83dd7fbe206e88fbdb7a0ef4e029ce83c742367aafdba601210212441d9f8d9d26ffb33322f1aeb8f1f2145959ded62d47a278562e92fdf79a560247304402203a1efc82583dfc6c09b1e5d01f5e3709e1a4d8360b2ba4826f065a4c279f9008022013b9f3df70ebc4ad6037919465abd0aa4be0a28e0f83a9cf8e24d286bb204fe201210212441d9f8d9d26ffb33322f1aeb8f1f2145959ded62d47a278562e92fdf79a5602483045022100a49a1534732656a464791629553ae392f927df868a0fb9c58176084c723ca63d02200b96d43a226cdc24bc38310c7be057cf8406b6f6005ef06579ab1e55c2403143012102bbc1f0dfafe66763d321753934128d153a27023ece68454144e99ec0539a73860000000001000000000106e87830a49142730f5f77cbc255fb17a1c31343d3c8dd1784d3d1db33198482760000000000ffffffff75b3ee144bffe648633b2b67e769f5f14e947ed0faaa5c12db2475548acbf6ed0100000000ffffffffff25874de98367a7d3e5435841deeadccb73bdc07bfb8b4060b234f6be16510f0000000000ffffffff8714e91fe2c889e122e219bb228cc9ebc88ea898371e869e58013e9a78f2b6c20100000000ffffffffdebd16120db62c4e418cecd9becd1b51c0ec74fbf55f30b7156aee0b23f67af20100000000ffffffff07062a614655bf1cf24171c56ab9ba625e4df052a769f6abb10023cdbc3937440000000000ffffffff02c0ee86740000000017a91494e297dbd7e8ea6994d04d2a2bb50dbb134fa57b878d34535200000000160014dcd98f218523460a2610fbfca009ba78ed1be00202473044022074cc24960961e6911997ef3896d1339af09c8430c0d0e4138777bd81ee4758210220102669268588037954e0495412808d3f2799c95cae6ddfa7e657e0692ac46a7e012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02473044022075feda814cee79367278c0ade7236bbfc1a011bd6dd3ca12c6d8a660180be9d402207898f5d0bf83b8240f202b3c0ed230605c2ecfd67f045c43654237f3cc6ccd3e012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100f9962ccc05f72f0431e9b1d36bf42984f3ea34c5995d5241def5380a572fb06902202015e2080952dc4fc7f3b9faf7dc1ac4d5d7dfaba9cfb25b07ba42eefdc7bd48012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100d2c91de401d7286dbca42c9ee76847005fca866f39a2c9c30249524ba96b64810220115ab357c056187e3422d8c4e21ef2c7cb9addaeed1bd76161d29f733dcd8f83012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100c6d946d9596f54d1be3d33b987446dbb0e01a95a136d19b066caa6a76838f6ef02201e27620def5b992d4e4cef015fc3df809a322cbf1709207ae4b7939fb4a64093012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100df2b74a72f942ff9555c4c96ef064581ee2a9d16fe6daff0a4a6b66fc966f04f02205498afa1687065ec9ac43bfc93296eabc56293243c4d85d79494388a66c89151012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a0000000001000000000101bd5b4f022f2e1da7fa46efcc05b96581ebb1e3fc506bd957fab8f29ac0e2a8e90100000000fdffffff02402414000000000017a914038bf150630303298d3398952c9640eb6c6be88187a7b0610100000000160014da6948296542ae1a524997ec3fb54f5e34d94c7602483045022100e18fa7fce5a1ef5ef0ad4842a445d9bc2007c74c32229b873bf185ba0dce3c7702204001bf58226c02ab6094e8264e2fb4a709907cd4bdca67764be04740b628a8d0012102d742751280179e1e69559f6745abab368f666e31e73aa5372a47a53acd5ae94f0000000001000000000101d4c1dc8ad27456f6a9342f48f80f4f4a9581085755ee23b9c02d91253b0c88350100000000fdffffff02235600000000000017a9148fe8ea73264964634363f070dd68a28099f4cf6a8731467601000000001600146e828afc73bfdb3951dfaca5d7bdaf919831359702473044022068909182cdd9dca722093150255299d290aa6f791dd434535f4ff920a6bcab760220437bd1df41e9352817271c4916d5a8649806905a193c916d974a12c54e0f4c1f012103bfe1a6c8b7d61d81dc747134c7c03ce113bd5f6a56494515ac79f13371c5e4e30000000001000000000101aa6df44a8015a4364c2031d21824e2d75bd44ab61b56b2820be87947ed5fa5840100000000fdffffff021a880000000000001600147216f7430b8dd968af18428cbef95d62ecba8384007102000000000017a91401c24df0800dbae29a827dc01492d0bcc9d269aa8702483045022100d6e5d8d0d5af9bc8c3a6d234338d9a7be1721dcf2da12214c30f3c00d0b2a22902206a091d537c2e51dbbbfa656543a37b538c21a517fadb32e9622feefcf2011e38012102222d01e8b17d9de436c4d6f1e67ae82ac2086e0e1a7481c8749972738b7b0a050000000001000000000101177ec05d3b6c727e5629b87ac03282726a575a853f7a6625423308fc924fa1830100000000fdffffff025c160a000000000017a914b8c41e0fbc53f98168d02e8c65fdf16e1a21340387c0ccb100000000001600145a7e9877e64ecd8e0a6b1691b25414c198239d0b02483045022100ccb4aaed01c689cbac14e17715613545de2526aedbbf2aa7bbe5eb11b77d3395022034ab043203648465c210ce7ffbc15af3bd60e8e0b389a7402d36e87f4c0b65660121032873fe6666a4681a4c9db957345c8ce498ec7d03287a6af3fe9b7dfa96fa22fe0000000001000000000101e136d64472463924168357cd453a32677c96cd778d0e4ea4164a4accd7d807cb0000000000ffffffff02f2c0550000000000160014e8ea3c8bd139eb0fc3d47a19bcf01b670e47488288b559000000000017a91484a6d0138c2f303915a3bf5f8daa039070ad7d548702473044022021f927df5c6895d86cc95003c407bcb7b2f193a927e0d7b63ce3dadc79ba7c6b022063f656621fb20787d1bf4a160237bac9b421a02a0f117ad371720fdcfc1f96e3012103695c8664ca0368b1c1d7bbf6975890aab0083da8ea51f996215dfecdf3fa95d20000000001000000000101af9a708d1ad225fcab3060b762c879c8044ffccdbdeda0a7889927a07f24789a0000000000ffffffff01e2bd55000000000017a914c1e123a24c33423559b8671ceb33418d78475ad5870247304402203bceacffde8cbca1188fdd172b391aaa24d1cab3f6c4a5239ab68dc6f27e9c6c0220447cfaa454b09b65158bd1a4346e281b3fea1fbbce921ade4394ff3999042909012103b59444f723c28dd21c7b2ba2fe0105c2534442934cc116347aa257240b63c1250000000001000000000102d55994c42399895deb9ac5acd4be91cf4a0fba74dcf6bcb32ec5997aac080f8e0100000017160014d71fc9dd74509d327a2430d064390bd5b7d4190fffffffff171fa4c308cdcd309fe7a3d413f7d96eab06ec47e7f884bc7e5807e0ac7014ed0000000017160014020243e0ec1d7dc279b105cee29ead4338865303ffffffff02e41a0a000000000017a914d9d991c528b2d4f8590018c49f7153f4032f527f874f7825000000000017a9149720de736175c5dac0643a2f77b6843a63c9dc9e8702473044022000ee0036a6465d17eb8dd57f7dd3280a7b328d1b6388b21b7552b69c907720b9022045f72c4a27bf72fd98c86de7ec8e1a230ebd55f08cad8db5ae57ca1b13137e17012102d1c8d5bb3ad0fce65d0a877b55e2039ef427db646066bbb18081f8f11e5bd8c70247304402204c80b588314398e291cfe1b4eecc4f6f562dc525127e105c9154592ce549bec80220110af6e9fcf147aba3688164e2149bd023db434a8777af9a50e98ec8bed749dc012103cf740851702b9726c73a0cee4b511e2b8d6208447bd9360f637b38904f7b357a000000000100000000010106ddc2fb857910aa3c367f84e384be9643e1ac1a0209cfa71857e5cdd972c0070600000017160014d27191651904ea43a0fbf3056977d263fb60567900000000015460a20000000000160014a00bf6092fa323c1c6bc6eaf182ebd9bd4f33f2f0247304402205e5b1d3c0be9705eb288447d11b599c1dabe667e6316fd5a116559a51332f21f0220487a9d771001d1faabdc2dc844a2fa165921f7beae3205ea04a6cd171e081bf601210282647a17097bf7044366cc147358e19fce90f994971ab433e29053e9a9eb982a0000000001000000000101c269961671d920129a91a9b76724365e4dbc8c6b42ff9870b0ba2235c6a750ed0000000017160014d73db8114d7146fffd0d0a11502489e9a686f9d300000000018decc001000000001600145f76940034b0ad40463e7595fda249ad3892607c024830450221009a19c2a136a2aba899074851fb77dc34f504afcd5179344e1abff0132b5081d9022025aaa8bc355dcfa5b021000e5b634703254f14400ed3b3161374d54c132abb1b012103c0c6805fbbb16e71fd61a771bdb6c3d3c2a59f8e204d72fbe491215db388b9000000000001000000000101b39c57bcdaf47000b9ba6bbbdceda23e499ee3b0d142096b59601d8ebbc7e6d101000000171600140aaef1d61037c00582b9e064d618a3065a7befe7000000000124e41200000000001600142511ea2f186406bf69c0f7941b3789e016fe272b02473044022006c4e0626442ad2031227718420fd7d90f3b93ea4f4280858ce2a797dbe7a32b02200f19a49cb8707e0ef5012bd1c725f4101f947e0c757604db40d98e3eba99e529012103b59337128cabc6cc6a9142a397b45e4f6c7f51ec99d570203017bdce7b45205b0000000001000000000101a65695d516fb03e8588df2535ae65a6a3837f00df986008cf927ca181a081f3c0000000000ffffffff02a0860100000000001600144811392b3ef6099cb5c9ee1d1bcf2108c5c83bb2e21ec302000000001600141db8eb219294c0047567a398d6fcb2ccdd345e5a02463043021f7f082eff2d1c4f8b2075468bf900d9800c4d74e58ba061f189379fc3fa53e102201607f9c8a51b94dbf07dc95f978bed70832bea174dad5cc56684f081ecf87da0012103a6b2285c8054d81779187e8f9c98b1306300b6475baee179567a4a45f7d020290000000001000000000101735e01508a15dd04cf145d48ed47fc982d400cda5709ce8ebc10d5dd7cf490ab0000000000ffffffff02961c010000000000160014c1b8b195c9f0c85a9ec5ba834cc890b064d3863008b30200000000001600147c1b112fb4aa9bc7a8f55a975ee80abc37c813f70247304402205f0689644672b286b9a2e240e403d82492fac6ebdf0a6f0191fe2938af121f120220221ba0da4b2e647cf87cb8f4eb9cd6cb3fc2565113b54025aa765b1a88d1929e0121030ca9e4b3543c7675c65885700fa48cabb28907414665f3918dcc1441b5220ab900000000010000000001015e2dbd4febeddbc7df46440b221d5dff32175ef53cbe0153e6e089bd3ac540780100000000ffffffff0299da010000000000160014b2ee41d584240c64a99770de744853459f59d06037ea170000000000160014c4bd77491ad9d0a845cc16a80c88292f979202c10247304402205b96d9e7a3d9ca53cf6396b3add6fb2168393eb60a47dcc66c2706eeb3db05a702202f36b09114088c1a669f687e5ddb3ac7a0e8c5db2deb45c8fe37f82336b4873f012102fa46c2b15f67863a82bf199eb8212728a241c826ab7733cabf9be7f30c43b9810000000001000000000101e7e6e7c4d2f8e03d75f01df666560ec0e5aad0bb73780f17290020e4493aad470900000000ffffffff024a02000000000000160014f49d06d332db837ac2cc5fcd4211cd5a4808039d54af010000000000160014b23bd4b12a536a582ff04000632fc0815c4a70b902473044022067c91448103dab3cc736ffa031d692c1dd1ff862d23ff8c8ced382d671c8c10502206dc56b1da5a148d6b771776e25c3196da59dab52900393fed84ae1fc49449a1a012103f5d42a3fa49ca48e4cb4f35e76322b6fa1a8d2bc1705bf5842e54ec52ff83e570000000001000000000101f305e4b9acac867bb483f6e42520ea7a89a9a5d34418145fa24847d1e9582c9b0000000000ffffffff020af6020000000000160014691dfeb9a276d7355acf8660eeebe238b89fec82590f01000000000016001480b243c1fe0a68bee34623f85fe5a963185fb9ff02483045022100dc810dc3169c3a9c53b3e4a9409b3fc8deaccafe27273b3c13cd7563c6403eb4022005af7dcd5b67ebe654212a9bee18add7d9f49707e38259ac0c368a0c7efa9cf7012102205c78cac4f090df3919c40434f9f45ef503eca180f1236c291fe8cda57bf45f000000000100000000010160c6a3f91fbac59379e98d5965dd6c18020ce6dd4e4564a3856d29a24c67b6390100000000ffffffff0245ac00000000000016001493f198f62a5d64985d09b32f1680b0e3133e07028e37060000000000160014f3e05fb498d27636ba90ad37606b55afd3d2087602473044022041f800412a9aa879142d3730ed18dcd6c7553e7d5a943d3a6858e3f3590e6cfd02207b41b8fd3c55e95ae9adc31a38d44baba47520ecad8c445e78ea8b0ccd52c83c01210255a0483fede7e845dd9cc69df91a29d3a9ee2c268fa3c2eecaf54fbbdab4b27a000000000100000000010186ab1b92c4ce6d071605c1cbd24fa306f3446b3b9d7c565d2dce1adf110e9a440000000000ffffffff023c953e00000000001600147f97d3e67629d6d95ec120fba7ffea057c33661ae4a304000000000017a914e8199791f8228063238c570f0982180f3e9ee0588702483045022100ff4f31e741c262119231e3b917d81f15f56c43ea05148d528c9030ee12afd21f02200c45755aea2386e0832301c2d1015a61f911007d2d796b4f91961b7584146b8a012103c379bc4ae97be96f17a0bf1409a306562a9ca2f51037bf5fdf335c26c75622fc0000000001000000000101f74bd38616df9647dbc15e4a721a29e58072d9f457b2221116d9ba81cf0834f40000000000ffffffff02a65205000000000017a914f7c0a38375ee2637990e80c2d7a46dfeccd748d187c3310000000000001600149dc547026350750a79fd356b00d7428ec6531ab40248304502210084e876a9b958bd6c41356c1e82aca54ff5d3bb63a2b735693354220642f51e3e02205f5ee361af3efbc7ec87624bc285f4b2bf03110c1c29bc68410915baad46023a012103230c7c9235b16401fd84faf38524156091da6faa2e1b727f332e94b45d0d0bc60000000001000000000101f87a0fc26ca17f779411dd1dd6cfc9a5f2c1138c1588c53ad168895081f58fe61000000000ffffffff02e9c0cb0000000000160014d20bc0a6f165ed6590c08ecba05886f98baaca0969a421000000000017a91465d9bf3d3b7f347b2de8958fe80ce576d2a6aec687024730440220482845212742da7a64f99d06ec72efd033d203163f6eabd3d110a6b81b2b4265022007b49cfdc0b5884c36aa9cd00d0546f0317ad8b51af7a82eb929eebb6a25c05a012102d10caa11947f4b13749f706283fbb45815f5b1239736927afcbebc028970b3d400000000010000000001017b767dcb3df89faa22bcdeacb706620240b516dab1f463b8e637c87535a36c540000000000ffffffff02453e05000000000016001400fb44ad7c1eb8073ffa6a7f1ad94d0861b555ed410b04000000000017a91439cb35c87f83820cfef203786283523428235f9a8702483045022100ca4d2cbf289f8c72692a5fc2af2ad91165606eafd399d8beff2ab86750588f900220585d700eda292fcda375960ed9d692540e537c3a32710d9630733b45b50313380121027d851b03573bb16227788b4dee1912c9343f47384ab31660b182aa8d0cdda25a0000000001000000000101f6e8fa5d63dc3eebf8398b5187a2c0964f15336ea7a15bc86fdf4a0c54dafc410100000000ffffffff022387050000000000160014a618184c09ee9ac313ce0b8b18d98be4f4479cd882ac00000000000017a91477f85423297ac38e5f45953cb6acfb77178d2d298702483045022100d6b7f4b22f06b8dc11b29deae1b1b99aa22ed262ef34f37c41c0b82ae0ab930b022031a01f8180020168d3cd52b04a8ef88103c4487bc9bfa5b5540c468865ba391c01210316b72361243d8f426258bfce2c32b8d07ff6b38cca84219cf0fe54e851548e65000000000100000000010154a103cdf8d0e70285e256b20007a04ae35959ec8ae05c22186c065a92396e6f0100000000ffffffff0223ff3f000000000017a91492d536520ff291de22f2e82d99a6989e73ac270d87b2d7e60500000000160014b6ad205fec3b516374888931a76f5594210d5e7502473044022065bff9de674a4c9d8b5d2d5ab70056e6cbae363992ed3eb103be7bb49bd3bacd022045adc91fa3cf12e89d05ee4bc1c17f6b8d273e9b5e8af6265f8a22251eb41d44012102bb47414d3fd3db8e17e53f24b7fccc4725af73881273625d436bff366d68c82900000000010000000001010e0919918902f71375c31d2d349c552bf826b54a56609d4536b86e9c3cfa2a980000000000ffffffff02802503000000000017a914ce5448f41ac1aafbc6a284915a8fa7a09aba5e3c8776c7030000000000160014e6d0f9afbf3e6f9e01a4d872397a6cd61b5dc76702483045022100c0c52e24f8cc43949dd526a78f1b025f5f0805d571b2cf783fbdb35517b970b9022017831c5d2e5f5d24a713247567ab6078571b84ee6ebb2db1cfb470e606d227bc012102f2541599a55d1d2e0a1c5700050359b3fe9a9837ac3b714efd2426d5e0cc3846000000000100000000010130ab555e20c45959ba3ccfb0e2e360926242e80d85bc09ef9eb12c07313b3cfb0100000000ffffffff0278140000000000001976a914c749e7506099a714215f126e828d0073306715f688ac454000000000000016001433cfc342d2eed15566ad0a6afa2666f607a27f6b02483045022100d8d75b51b675dfb9051a1f25cce4a8f6a7447bbbd453c50a2181ef87aad5f7db02206c6eea8b88c63ff74e27de78a1abbec3e7df827dfa2169f5dd9bb0b5f9e3391e012102ed613e6d3af72b506d2baf1b6eb399d511e57af513221a1b922237c582a940d60000000001000000000101e80d29a3072398ef0007e4d6ae1d51245e2b7dd4741aca9d4b0bb1ed820e38180100000000ffffffff022c61450300000000160014e15ead5e95d24a230d364fe0f1d84f8fee3a96b08f72a102000000001976a914502cee684f8f0cab12963c22efaa59d9f384342b88ac0247304402204cf51a397bc1f20d63950a31170e046e71170e56744e14f8708d4d48f344cded02201a402ddcc8171bb1a7e99c491e6619856d9191d906a44a2faf2fc8ab4a5762fd0121032b90588ca36c77a3c01a83e94145b1e9c1eaeed8b2fbd41b8ec6490ff354e2d400000000010000000001012d7c36cd4a6128ebe15a0d9acf1e075d61c2d343ea173ed540ec49231b6e50f90000000000ffffffff02eed90000000000001976a914c93c27c5c82173131d337e63f24436abbeecea4488acee181d000000000016001450a2773aabd308582d70f63bbb06d2a6b6f79d4e02483045022100ce047f6872e5439643f32b3ceb63a632b0f1f58b3dc4d642a4f3afc55b934e0702204c720b6d6f25a15c069a5cbb9508c60781fb185ca21b4e93c297a07927445bee01210300b215b1afce6dc9f271bc8906f267159917f382f2e564ce61e63849142ef7c300000000010000000001010631175d18f8af5b22aa46748dae51d70f64da2d1ece8325144b1f709e0d82e70000000000ffffffff02ecc20000000000001976a914270b0fd4d0fd543ef64083bc94d94fdd23a60b2988acd104000000000000160014fc0b58e69d3ea239dabf8a0977edea821aef0547024830450221008377118729068e517ed7c41c52533ed6c81ed5545588d464f8ddf1ffdc946fa802201aca8346b1f731ac9ab2f16aa6b4a0226affd1bf2b2ca0cd0d1b6b1e83780c2e01210369136281e3aa460485b5c2fde9019f8b2101435616c4f327cec8eaca37c1392100000000010000000001010974aabe690e1e75daa959738fa511b7c30e2dd4a1b5a06a1bc821b640edb6480000000000ffffffff02235b2100000000001600148f73afef271313c68493e86ddbea486fd81d8b6f388d1200000000001976a9145a5fb082a2a4552bec00e5c0fcc9ca985ccb528888ac02483045022100e267931411abd88a4d68cb092bccc47a7d42e6b11e31c421301c4baad9eb67150220426c3bf04b9eded849fd3a41ab6ee3c7bfa54be73d5d41f25edff8a4e53942c5012103e0a0132c489dfbe984c47e6460bbd7176dc653fcbd787ed42b34843cb4a542f9000000000100000000010144b7eb0ea7f5cac7044e07821bf391502675ad2e45b9f1d5c3cee7ca8ee054013d00000000ffffffff0258540300000000001976a91473641c689bb46f7467fbde6b3dab5d38c9edd82288ac04d20600000000001600144baed9d51ae70598917725ae79eb47e1cd6d9d280247304402203a18de02df0c3612b546510e202f7e3580e07d0de19bdfd4e5b2da794b531e0a022064691738e41746fd8775e18af6b698517eaaccd543a81774e37d5272df07379101210219759c219a89144be3ad6d1f36e1c6aca5ccd70ab536a75366fe5022ac371d9900000000020000000ea6f8a8ba4ed8ab47b6a9e3a3479a05d3c31037d52a9e049ebc16f3333102d30c000000006a473044022034f64a818ca5fedf8016e8c2dda41048c9dc45a52703a2ed42cbc2af5db0332302201b3112a9954b726ce9545c52e4a630f71dcf8d7828347508d5945f2f53d713c9012103347199f869adbf727a16ecf56304ec60079b9dff89e1e32724899e52c1264941fdffffff6fc03343a00a1fdf73a14b9e978308b12dd490482f8709a8156a52d9499df83a000000006a47304402203a044fd7052266abd29afa49047dcdc59b277ca693dfdfb1ed9246fbfe6accdb02201b202014dec5c42f47ce63b63e892d107aca338afd1846f0f71b69e9d7ff7383012103f2e6f6823d054b6f10beec6cc003ba5e36e9c4306e48075e275525d6aeabf6b8fdffffff3c7a5d9fa672e310eff0a564146ae912caea727e580435410f5137ce66f2293e040000006a473044022059d9f5e73396e4e3dffcaa9c17cfd9167124fa7627d82f2cd06366fe2a90f048022012406b2a91ed273bf9a57b4b42440e4a2c2b48ee6c3e75d834c7f71c696e867c012103d6471b6bc15e84ce444165f57c4d624a4126ee12771d9700fabc2877eb369af9fdffffffc58acbd92bd0ad99c8549769dbae07a8a28daad18956ef9b794a27e27bb2c960000000006a47304402203e5803c60bb1f64d356546e3d07802a88098f2c202a39cca8cb51a03600b0e9c02204d7cea1d63004c890d9c77360c7e0ffc8d84f205d33b7669a0397246c804715e012103336c69612743dd2fb6b9e6c2402dd655d22e999983c80cdb7e90c22c38c7f4fffdffffff7a9228e7291273056fb82fdff6052f9c76fcbe790162fe6ae2b333d4bdb99a69000000006a473044022026056aad73476e930cdcbae7a53522538dbed4ac22793a584977c8a934b6fd6502206cfb4c354f539b9a3463c111d0f63e26c827d8b69201812993ebb1d44fddcad80121029f0475f4cdd3bdef1cc3639c57a0e378e93a3a53c463412376a99f2fa46a8fa6fdffffffeda4df85b6b8d0d671e09c0a48d7a436f18e64a935506504b3c33d658641a089000000006a47304402201097260ae76cb0e73d66f3cb5831626f99bc5f20f29b89c8e09c83c639c3258c02203a503e88b7f6909006edf57cfcd817f21827ea47359da749947efefb19f0508301210339e0a74b9fc476dfaba51aacd2714407a0be947ee5f6add75271e17b9e451a48fdffffff3a8074ede610fceab5b5df59e483f58ba6636eed516372caa4ad740f21624f95000000006a47304402207219859eb285f88a96fc764cfdccc64fa70352b3a68b6166077368581a65391b02201b131d3a63f31ac239ac48570ca0000fe8b3f3b5e7be8e22b6197aec8895670c012102547b0412d7cff49d20c4efef179f3e504d6c973b737f7e10f1fd6cdd5dc38e36fdffffff8ba415ce59c36eb7805d2f02bcc5098c1d0b5b9e8e86f04f6e1ebd29a9c1d496030000006a47304402204690417a13d688548fa36b19f9b8d2ec5b2db1a08e718d56318d4c498f3392c4022026b4c9dedba0eedafe731f88276e07934fae30bdbedd8c316e8b2112c70e1684012102f140d9265ba5a64b5eec4f47aa83dc2d9b8ac6ebfd759b819e4779d1a97fe55afdffffff1cfa068b1c6e3f7fb7d79b0437ae9a95830dfebbe344fb526b3b98fb5c17ca99010000006a4730440220383b48f4f415a020cdefafc84994592fa724a9355d242eea531adb709db6947102206b7e9d82b33d90fd23badaf4fbb6d0a660633aacf0b89dd3a18cf847136d6b8b0121025a0c694b1c1fb7605285e75266d53a70a3472c71fc4f4dfdf0e506739e1d3689fdffffff2880aec4f0251f5e6f24b180a811a6750bfe76e1b82d3f88f86e111d4d15eeb6010000006a4730440220336e08f71c7fb6a62b53a8583917258fa339847faa334395f969f084fc9ffa74022071a632bf3c55492a1077e661680bd73f1f935617aa9d6435899027192f89081b012103d6471b6bc15e84ce444165f57c4d624a4126ee12771d9700fabc2877eb369af9fdffffff87f1816010501601d104b2e6b8ec90057e9e28ff00f97e23b437c08a74e960bc010000006a47304402205280f0118a6bbef37aed1d73a78959fb41f1e66fcc0e772fd5f0dedc23ee30d202205ddec811dc2049faaea40ba7190722df65849a04cc15ab04c0145c1d5500f62b0121027731517f46a62fb23c3ef0f7de1ed20599efe71542865dd1e12a90ca0dc9d6a6fdffffff8a2cb2d09e4f487371499afd8db48df2f6c302a8e618bacaa8070b40d9a9a7ce010000006a473044022052df8d70f22cfd8db65dd0a49c4bd499fe6fc2775b749fc838ccc2b8ab13f96002201939442a9f708aee482161cb56c7d24f8c1ca14f1d670f4431e444157d33566c012102edadafb7d844a5bc3ba547e70774e12c180ae8a063b4153551018f6ef3f2c26dfdffffff65b07a3ebfa038255d4c407430574a2c258ea4cd908602bc716d9ffbafdf17d1000000006a4730440220185029d5ad32ff60e99f38f4afd5433e0a725a8141e115823977f15560f7eae702206cf9726fa885673b868691024f04c5bf13e578183007dc29046c704ba21ca3e101210384c9b25344788808e649c112202250580ed6f3ab95e3776f43655a8a6744fa63fdffffff396a488d57b939459c45a7858e1e3611a816c0c4bdf4ed625e65436d11eb5ee5040000006a47304402205a17a5d0f7c906bfb394d9946153b930a3ff3202cd82a82fdaa0be22f4bd646302202309b5d9e557e173a57d047fd8b42778f5a07531072cc5c31d8714726871dbb8012103d6471b6bc15e84ce444165f57c4d624a4126ee12771d9700fabc2877eb369af9fdffffff0142894e02000000001600142f2e168354731ce9a4e51d1ff33322da83f2344949a00a000200000006d7d4b1cbd8fbe202ef534ef85180ac72b75edf90caa99b216957081fdcfbf403020000006a47304402202bd3bd38ae772b7a3a98b9e8a32096c5e8ae0fa418336d755006f634dd3a6880022079bb0499391479959e86f5523a6baa23cec583a7a737329067f72f8def3d7cae0121025084cc6c9fbce1af57aec6c160362ec455048ce923c6f556d4bae552ae3066defdffffff5a57c54d38e235ff662d88ab28f251866270fe0bd38c0331d4e1c174d6aacc16000000006a473044022055c2f8b19df9ee54937ac45e97711653f75fd35e9b3240b22971fd0db61f00ac02207e7db62d1307b8e6e6e12bacb37eb6685bb83b7ac92d585679676161e32bbc970121037ab463fda3926d95431c9ca5af596ef1585fd143b6868a8687048cd0eaa0ae2afdffffff160652286276430e10d0b95d4da2c42bd077b764f44b8b8cee4a9dbcfab538330e0000006a473044022038be49cf3a6a06a9266871d9fd86d2ad9420c16caafcb62006055c09b6f89e29022000899e1204af61271efea8e8bf1d52889a7c6c5d8264d4b07280961813b6e0f40121020c289cac83925c849e5f0ff8513e9749e35a9c20bed46cb07310aacedd1c483dfdffffffe2f9e7c7dad795dbb5a705619a606323aa916b28a0f0213e44cec5c62972484b010000006a4730440220593468726ef9a7efaedad785ebf70f7a941a4f0ed18d06ed0027156436869a730220295a40ba9ea47a48a48c911bf4a3c31ddb0b5e1ee2a776cdd4fb169882ccba89012102f90d30b68246074eb258cf5dca319f1327e08d351ac0be4dadc5b2e6e8b3282efdffffff8a85f1711c836830dc29f18e1254bdf5dbeb153bd2a8ad4e30f889d4007daaac110000006a4730440220715359b4e0381832c6b6fb045a0b2b12460dcca7170da5b55260cd047c4637dc022078732c9aa9b86b6aed0a1ab6369984c9f2fba981b74dcf435b0f4d29d93ca64a0121026a6ee325998d91c010006db533bfba58d1cdf525a82e67b85bdd1d1e87ba6494fdffffff9d48e5ed39b3398cbee72ca435df6ce5ae38e0d9a252a58746beb159e3d137d3000000006a47304402206a3e9da235f35c90f7003cfdb3d5dffa32b29d9cb5dc0fa91897723bf0d9a0c202204520e400b962572497fbe8d9e9e39f4f3dcb7ba4fd625299edfe5af734e89f020121020c7cc8e5b268dfbcb316d6f3220cfb6944faaa7787539103a65e8b4ee7d8089efdffffff01844057000000000017a914d3089f14c73e846c8a4198765a89e0388637c60c8748a00a000100000000010212986e45a3e4ba1a71a55365114c543128da88e06570de804ecac7ee97fa55c40000000000ffffffffb1267a84f7d56a2b68959a5f0d9498cbbffff774253c4afc1b97ecfee0fc82e20100000000ffffffff03a086010000000000160014bb88406779eb25465b9b253a4ac455969ca61d2e243d040000000000160014d943548ea4dd0339b0894f11d80d4fbd6b92c60c0e80090000000000160014c8a4a4dad7b37d14618e54827c939ac85b4b99c70248304502210094f2ac974cf94e74c53684034c4c6c791f70d19cd86d0d70b1e5cada017bcb95022029c52714681d47794e9c1b084b01d83891b70a00013dd40bfee130fdc3065228012102b2350df84ab1814ea8bac40acdde8ac347a102e7b63264f74ecc28c4a8918feb02483045022100f2c8ec45ca288a27fbffb76450cb8aa6420693ca41da0cac0e545dbe664f54c602202b5a59db486ec6b2ce2afa6f0a16e6b3cf76b96200fd990a40e3ec1276078d5b01210362e753f7a1871bfefc85f82111ab7e9a7cbf98c32cb0be215c87c8845dd32f930000000001000000000101420fbde4767b4842495cd4070f59829b9b367602704fea4627438de8c3a086950200000000ffffffff017a7e090000000000160014c22e0c5dc6400df1ca05b9da51bca8721f3deaf00247304402204b260594343da7635a368979e89f4e3c4f256acf1579c0df7c66fdcf2efb0dcb02206941a6e431874f0d4fb2763a0bd3c4a87320d77169ba3cfbe633d17f18cb7b5701210228ea8b22edbc842093141866291c8c6e82d029584bfaf1370558c9964ec061f00000000001000000000101eac3564593d21e170e6a9547409157a160eea1831af2ee47e19e17e5bf89a5090000000000ffffffff01e67c09000000000016001442699ad7ddfec2450c073714ea48661ec82c67fe02473044022034b60b9cb97d242082338a4a6ea7b28c8f8213b80a01a61449588ffb2d7adc7102203229accd7806908a7444e17a36bedde1e9970dc0536ade09ac0c76f561127ace012103b56617f96a52d3b1f61f9e0908a96f47f531bbad9d777dcd52f76571effec09b000000000100000000010154beb22cef8b4c73295a285ad387eed75670d71fe992fb4f7c8e1f7d7a0528540000000000ffffffff01527b0900000000001600141b438e79f248298e2ab4ad3310ee258a13e175fa02473044022058c4887cdde0fe8899a45c85d483302c287485abb472d13f4198ed1d4bd851a1022008b9ed04a2468394ebb6d77d26a65ccf1952a6c5d7de96720ba1b946f7a338970121034481d9875b7988e68c091899fda2fc54cd5e86840f544f7a9edd70c9a7c24873000000000100000000010196092c6f0f1840724badc83a72f0316e4c4bab2a9f30d42e1a04717216d3a8640000000000ffffffff01be790900000000001600146e6c428682da43f8ef1df28a4551c663c4908cff02483045022100e17a0728268b0bdf1e56bb57319587a0433662b03a8c7114ef60ea1e09f074100220118f6361cd3bb2ae5d581a6ff6a83c49184caa6d02269fa70ce351bafa735ebe012103f6fe4576bf2fa86f1e2e1d787e8ba4fc0b64839ec7ca8612ca57003b4fd4b2de00000000010000000001016c99e5705f67bb048f398eab0124ba57ef1e1a60b20b8ca4a29f9b7b254896040000000000ffffffff02b03600000000000017a9144bc07b10e86df307c408da115896a0e8293c24c487f43909000000000016001452fcccd71fff47a11202958ffd46028d53489d7002473044022016e7c3f24d40dfc9939b72bf7625636dc9d4b5e57d97ff8d4b28b9ab44ebef5a022004db5cd3dd476b073d74ce7e554ea1c46f6a2cf749675f508a2325a24beaf157012103475ea2f14ef23e2b50dbb770dc15e061096e6cd11a8e77112355295171247d780000000001000000000102ed33dd589fbb37a6e39c77e60d0e18175118522385600601ee5db06decf5dedb0100000000ffffffff1521f55d9853874fe0675fda4f75263f7c62f52b941faa9872eb52ea248000030100000000ffffffff011add30000000000022002077a5888490d2b543dc954a00c91d9c36639560f654ccc3a8b2ae760b370c90a502483045022100eafa7050550a3a241546e704e4ee792f5ea669590d62ccc74baf05b45c4c29be022064286f2f4d03cd5d1938716a083c420b86fa8c65feaf38443ec6cd45caa810880121037995af3b21ce9fd984586ce0a0a54684e4d6ff818b428ae404e09ecaa99543930248304502210090a8dd1861353f129f6ea82d2dc148baffbcf85dc50e8d1f1e40ed4ef07eb9a502204f6c5b24a4be47bbd8fcbf05c97724b918f6e5e6d3bdf596e9a00cd9d9ecb80e01210383ad133b284b581cd0c76ed8c97b747e892dfbf3951748e9362646652d91797200000000020000000363962c743350a7f018f4a6d7c8f6cedb9b9c6f1635d78a84afc7b6fa366295100a0000006a47304402206e5831a3b99ad6b6325021e02ae65a5a2183b894058427bcf87f175368f16b4302202e746ba337968ea7db5915fd71b120cc0dbb93bf5ba45680a3f6a5c4010474ea0121030b33b5d014dff2716b05d3d1d58f4367547b4bf812c6e09798bdff74c95da670fdffffffc21b5fcbbe45b85ff4595ed6bee4a4a2a37db9ff96065400609aab99edf43462120000006a473044022035a0f1267259c297abe6781258c5cda2f27b285499f001fb67bf1fbab065d2ff02200bdc914a4962d6057e2dca6a3d0a60700610528f10670540e5e2338ccda83dcd012103abe172de4c5465d563634f3c1dd19c0bc0672d4a93db7deacf15e6d122b0ef41fdffffffaa7e9943c45d417723e2ef222fc5b9681da11cf08ad0d1d751379cf0bf3d8d993e0000006a47304402200e14c486aea08bc9fef7594fd05c1ca532719a0d6fb72987cf39b1170ae0e5bd02203375d6bfd47cf547736982fd383ca039342030c929be9d4df182c95f4c2ed0c801210330709726bb8dfc7d1cfbfc6b24ad64b9fd6d67970401d38f071436aaf0f08516fdffffff01cdb69f0000000000160014efd8fe1087d4d816d273f2149d0eb1f134064b5c48a00a00010000000001010d911490c7ce1e360c9783ea7aef5f31bf118e700acdf35d5838396faeb8d53a01000000171600149842bb769401b960c832c134e6543efc9d5f3a82ffffffff0226c4eb0000000000160014e61a424dfb10afc08c337b811dad70eb3cf732ddf69fa1040000000017a914a7173d9fe8c95f08fa54805559cc9246069327d5870247304402200e5752ef14b822ee44490643757037555f93617b48fceab4417b7e6bd29c3c7802204fbc2f8015e6fc45db8dc76ac2333876c2149c7ecd3a78c517a85c974621469b012103466a68ed405aabd9b9d03825734262efe706727ec06d1e8b321419ebbc38afd900000000020000000001017d9119589639eb26ff4f4add3ce447b726a807b026bd9599db24a3e093848b420100000000fdffffff02d8ca02000000000017a914a3d623f95d4756e062823924b922c5b94098d46f87387f2500000000001600146c99da85e04aa102cbef6c862aed76e236a9798b02473044022064683c08f154d08c6a12cd49031abfb2e791b1934da59c64fbecdb73ca0e44f6022004add8278d4efbbb1388cb6b5b4053f048b554130fc0e948fe1c633bbf102905012103a5963d2470e3c0669c2c826f69e0fbacb2c03d80da883900747417e839e7f9dc48a00a000200000000010153c14c6539855ad8fdd20a88b9eb244d74f5e213f7c3d7b125ca442217cd9c1c0100000000fdffffff02109e01000000000017a91497a42e23b428f35471f999536cf961af4eda69588740dd23000000000016001479e682d86ac5e1a82f19d170bdc27ebb0f2498730247304402201aa6e0a22a4f4ca8748fdf3b27db480f7a852743bc91ed4073a3a3fdd3f46b5b0220350061443c4008aaa1a71a720528c3c699667aea622d0dd7d6922b6fbfd97c87012103d435145fb0a8a4ccf67bde6a374fc29616d47ce05656bf6fcf07353d3bb2a8e348a00a00020000000001013de066c7788175aa2a6d7c5ceff5dd38d6474b7722fef2a5b17f6b8945295c880100000000feffffff02494009000000000017a9146f418a19ac81853df8766c5901a733b530fc582087677fa22a000000001600142a9b61b7c59c69816cd170b4acc5cc2b16c390100247304402201a4b307c09316fb67ed8ebd3be4b1c9f50a7193944c303e72d53509ef6785ccd0220071ed176d4f3b49e825eca3066076f52866d60e85e1fe0d14968a9938a1a8b550121022688ca16ac3af10a200ef9006aa3f4fd63b727de5ba3bdccd4f9736b06fb18b10000000002000000000101cca6b9459d2478b4f9ab34d9c0470da0254559ca2c0b955aab5385e7144d28550100000000feffffff02749c03000000000017a914164af5551377716f83608f11cf1e002e9b5db952873cf7280000000000160014fdf216afdac66d63c47dd4d00a166d8207e077b602473044022013e78a4ce7ebdbbc0a699e08b9a6e1522ac254a9b1aff8b96917330b930bd67702202cd159e230c76084344a461dc0ca0c801e52727b6ff642360523ee81efdef79d012102d02dab758a3a9c4f05d3a650fd1dee85de588a786ee16b4208454cbd5cc9ebc80000000002000000000101988a29a0b44eee9957efd8016a4fe30befcd054d00ac103525f0eb2ef76caf0d0100000000fdffffff02b8ff01000000000017a9142edac31293da2cdf210dbf867879c97736bd023787a0d92100000000001600142e5d549ac8459994c5202818024163edd5355ac70247304402202ce7ac14ea132881fe37a2df8fac8aa3b3743028322349176a1a83016a292c1902207d03e842e6486756be0cc4d05747313dc9ba13ac0a8e52bc7cf3015721a7c2a50121035c384579ba9f497498045fcb5e0d054e6dfc85b119c27c46b14f5038a948d6a148a00a0001000000000101bb8cbe305578a475dddffc070839af431b5f8ab1bafd395dcda577102aab07bc0000000017160014f919ab55bc9564e2fcb5f3dd85d1e199010bc88bffffffff02872b21000000000017a914d03db8f9bf7cd1cba96dfb2296d91c00a5adaafd87a89521000000000017a9141df458496e363f56c070b586e6d51f61a5714acd8702483045022100d00dd7429f253d17d01ac07dee40e8d4dd5e206bc9e094b303a6f0dd32bebb9102202718b74c89c13d2ce10da1c694dc54a38fa1996db4a86f159fa616d6464f38f40121026d55545da8b443f68f7d45aabac64dcd569bbb4c54f50f1e67ea20390ca9f63200000000010000000001015037bfde014377bb6d37af629e9d591d1c5c73e4f8ad09f07acdf08618bad8870100000017160014fa89b921fb9d67ef8ce07b3f000b11849ab6b17bffffffff020fd60c000000000017a914e8c74e1ff50145da2d57bc288065ee95e96a34e78740bc35000000000017a914668a9f7d2021c0ea1a1c6e870b093a3a3a0ba13e8702483045022100b0a8bf13ba392ec5a27749b03c70178709fc8cd165b03e476462dcebf6e07e37022063a89900aef40838617514362cbf0f92c3342d9d2e707b2ff3071358611c6ceb012103866bd62e9173b7cd1de5566fb6548122047fbc70d65b1c19cc96a79c8247a2190000000002000000000104bf24d7c7cac74dbf73adf988c6dfd68628dd80e52d23c47aa569f267fba9b94b0100000000ffffffff0e62f9fdd26d7e65c9f61e1c6ffd704fd8e08b650841d11d1ecd7331d7209c3a000000006a47304402204d6041193166a19299f785352bb84334df97009541fc6d3140d5280664d3165a0220409e3baf96bdb6ed72415e67946cf7bcd396b1938edeeeb4ff958f4839c4fa64012102260cf56a5992759b64634e607b72053ab25f37cdbca0ae990e4aaa0bff9aa172ffffffff7249174d18ea054afc26723c28aeff27adbfe1dd4def39af09c77204bada6b09010000006a47304402200c35f003be17cf9b42a82c02ce9fc16a1bc968baf9ce94ce2f629fb5b720fed602201a4e5b67deaa764a02cb689c40fa45321d994ceefd5cb68b833bb65040b336310121030f9484bf763ba96bede9b039b1c3b278c36d0cbba47913eb4b6f6873907fd1a3ffffffff013a4b5ddd8699fbd94cc98ec9947ae7cde7f896ba618ed46c2106aa7c4e5d7f000000006a473044022057eecf7a9a4356e8358e95754c416da09dd1d959fb5cababa6963fa4f17fca4302206a4af0801b57825599b54fb9289308d93bd1875bd3ad5b285e8034e6f2b387ef01210389743af2d1a4be8ecd7ac1707ac09ab7e688d94981295b628eeb885007ad43e5ffffffff17a00302000000000017a91478d04a77681336a45e8d42c4afe6b1a0c7888b9787b5ad1c0000000000160014ed5b6a6f941352db60656a001eba905d65665a7d510c5d00000000001976a914ce7dce9ee783016f81f76b5b3ba97334ea18a11e88accc8a01000000000017a914b6e3d4b43463acc853c962c95730d6a0b974d34387e88000000000000017a91452e7e123a8a9522f863e8083fcc81dc6defb88838744040000000000001976a914e51d9bd16d935a5246e0f3994f16042e5e36befa88ac43c707000000000017a91494a1febe8b7af395c54c6ca7b2710cffb7d8ba7087850802000000000017a914e7549918d49fe34e2cad0f26f50709674e557cb387a08002000000000017a9140bbaae88315ba9fc19e1832d15d4c6472693e1f08714dd00000000000017a914eebd7c90a29dd4b04c43143eed50331a1244044087de8f01000000000017a914f3b864deeac85a3b71fa997a9030a22e48df785887033503000000000017a9147f53a0274e0bf399a2be3f570abd4e0db6754e9b8707ed0600000000001976a914f3dc82e02f3135b1d4a66bda463b14c939dda79188ac2f5263000000000016001408ceceba82be8ad94918f19302bd1fa99c11231610d821000000000017a91463061a4f60eb49d5e68c4b8483f9c69e1256996187faa600000000000017a91454a9cec2214ce7ada9f3aad7ddd458951e9c3aa98773d524000000000017a9146202f6404197f59fe119ef5ddd071f931150337487101d0a00000000001976a914471793c8ba8347a74745e9df3096749485da215d88ac504001000000000017a9142a12c3c8382554c1b5c51b94da4a44bb08855d08876ca35100000000001976a91470fd1ff8ab7a316ecff56ab560f4230227a5392688aca8200a0100000000160014ee3822fa7f3b0b0723aa376561c684d6e3b68d7f04b900000000000017a914e9af7babede626e0ef24db7001c267d38aa677c38750ac00000000000017a914db11406821e02feb476aafbffc9dfd5b210a8f3e870247304402202d48f68614523e7c71763f62dea052bbf2a560484d7bb264aac381037a7c62150220422c1f4b4a0b89bd0b71a3a327505c4c75872ff5de6bc26eb9685b94a5a5eaf6012103bf26ebc56159ac8c74b9de794e9d5beee4d204a5a6c5c301ad01f9de2042c00200000000000000020000000001028b292835acd0c056c0cf8f78f43c55a815f29aeba54a9c9bac974c39d6fa86141400000000ffffffff7af747e5034e06434eadf5c092124a1c93181dabfe59474198eae0fd2329eb1a0000000000ffffffff02f83e8a00000000001600148f144fb499d02bbd9ce0ca3926361368575c317bde32a700000000001600148ec1474c75a40a9b365b1a2b1efe70388748b9b902483045022100b3f4329dbcc82f00db8685968c7312b8e545107a388b531c5843910087a7c4f30220500c8304f27e39e34424fb7b27d3b121e4a8c2d8f78fd533f3389639fbe5fc020121024ca2a9d908408e56bd98f11adac8fcbf284562f352504b3ced3c06070b12c90e02473044022035f1a82bc4fa62918663e1534167264e39fe8f81ae15a275d71e61c52ac537d502202019fac7f5979a10a9439f2ba07cb6909df80943390e3c7041319c376d1048b601210346ea9de3f5ed1a3e3cd50d0414cf9011832aa78b1af87d1944a45d2d0f882a98000000000200000000010106961ecc8e386da278ef3422ce9270579c9c797852ffb166a30bcce1ff6591c90000000000ffffffff02902a000000000000160014cd0859eeca492deecbd13fce12eb669834d50887430f8a000000000017a9141dc25560a7a1fe1d15aa3b1420272c0c098a29698702483045022100f034bf423f3fcc6243656a37924ff4e4acd0ed5113d35e0a16f0505e9dc5f79702204fb192b393ed727194fbaeb49f506aa35075ce37e72d30ca44a780346fb24a13012102bfd9e0bedccb9d3c83f51dcb930d21e7b5fad75f20ec75f8ce0c1d4b11fcd002000000000100000000010163b6d1b27e6bda43edce822aaa188af739aede683975887c736dc9afd27462a6000000002322002016e16ad64f1a7e57a4b5abce824a3b90e33e36a9044a41755463100050c7d7efffffffff02bd1f0c010000000017a914b22dea9041dfa491916ca231d8af30b0956d449b87bcfc0000000000001976a91441e84d751a727b6bbcceb962058b62c35565070488ac040047304402204bdaceff083b8f4184f8a672bb00d136c34ecc9bc5a7492d20cd777c70149521022041418ec59b81515c89441dab47bb05f7ac6fa28e01927ac201e6f5ff77ca8ca90147304402202a4f8518d1e67423220a0abbd4c365dada8a957daa5deb3a995bd09694aa92c6022055e271c7d6c08f08652f313e53e4cc5b345a6cf0c95abd5ef0d267ca84a4b1760169522103a4cfc162ba64291ec24bafec179c9db7520a83d222d0f08e88908200c8ee000b2102826f932d7c52aa99f7d2b559c4663a55edbbcb235e2ff7966bce3bfc09e56be121039ad8a3396f6fd447948990a09c94a79ed74b39ed99e08bd908ff1f5bacf103bc53ae00000000010000000001016b9046a452c4d71350df596a9132852fffe809df422be2b26a764f881b93497d0000000000fdffffff0295030000000000001600147216f7430b8dd968af18428cbef95d62ecba83848f800000000000001976a91479024a7d3232e1fcc42a8e70041eb178bfbac69988ac0247304402206f2edf5dcdbf04305f48d04f43b62bd4ffbe753f73df2af1ab4f336c163602970220608353b6009da00ede86f120f8142b86bf10b59fd024dc088c97147acc8be7be0121025b485295cb51e5e051918ef8b48cb408a29e56754e24fd93307ea6bb76ea0f6700000000010000000001013c2227d4ba73a104fec764cabb57614de157797435ae19f97f1e7528c72d76ce0100000000fdffffff027c3b0200000000001976a9142c1608c0d7ab3db8660a1a455137c6e67a26475688ac56e12200000000001600142f01f52fd495f2329c166b8092de4396263fd68202483045022100f57b03abe976dfd584fa7eea34688a81cb82e37a8404b2915e2e38652ac927d702202d9c542ef9eb6f9c114654e0e36e418ec052c3249aba543dbfe4db780db4e1ac012103c97247214678942debde67d37f57ca8218f92570fdc89d87dc6a7bbd1cd16b030000000001000000000101d24e4acb3704374df92b4f1bcf0e54b196272487a59bf4df3bb1352c81e7cffb01000000171600149e59a420b92ed554704fc1a9b4ebb931d9a85e69ffffffff02bb630700000000001976a914264b9e9c9ebd1a9735ae725f9b90c9c739c57a9688ac0f5393010000000017a914e01c8ef7bbf16ecc4f43cc04a5224665d3e0fbb98702483045022100f00e9401ad7705de9733cf8083ad7b671efdc15da7d365f2cad0466fa7105057022027e4f34a73e12c684cc2f31a852b78e925491e24af070a91b90b901d7bbfcef80121039cebb8c8ad4899504169fab3a95983dd977c0d67c15146c06d7e42ebe9a8bedd00000000010000000001010926f7643147dc1c5c0262fa386296ed295ac9c9bf3bbdfc4ad85af48519983a0100000000fdffffff02e0dd0000000000001976a9141a91c231af09fd06410dafa778d455580aca21d888accca31700000000001600144b77d0a8a9fc2330cb9f2c6f56ab58ba20f039fa02483045022100810e7449f8b7bfc615f3de1fb38c44eb9fb3057cf53ffba1e546a07bce8df55002203a9679cc24e699c23c48d5220cd9d7a2cb57d0ea66061feb09797b2b91e33c2f0121036cbf1c0c4a6ebd799497a43a1cb8f620c0568392dd643b69bd9d958260adb90f000000000200000002da70da0b6d297c11dd303e28748dd099d0d2002a5a725e8088c06734d373f523000000006a47304402207b5d81066bfed6ebaab2d2a5abfe9d8fe3b3cc0cc902c7b45dac62e3f9c6ed7d022064f66fa2c5dcbed1aa5bf06af78bd89a8f7f312eebe70998e2a502a19df16069012102e0378cff34c718f17e6c1c2edbcbcc5ec3071cee9eba11a7e2a23a00e2b08721fdffffffe4716a8991a0114a185b70f59aff5374042818b26a8bb3de06ae057e138133ad010000006a47304402205f10eab512a1dc30adbfd185451d00acf7711edd98c98e799b06893c5b7131ef0220634d96181ce661a7f4270a52ab06a2e4ce8ff1587dc806a57a15a3081a7eabf9012103511afd807e923258e16612cf09858f57dcfdaced3fb4b4015b71e943367a28defdffffff01fa940200000000001976a9142296f4973572cf0c6e95f3b2c0e6c65954f981fd88ac47a00a00020000000001050c59fec7cfd2414c4d47073cacec3e972b92a8b63b70e3c300f4ecbe1352ee340100000000ffffffffa959e851ad65f5c20676e545fea97d720f0c0b92f5ceb48a04f0571de22e5a8e0a00000000ffffffff49a2d1667767bd51daf46d2060c710a5f915ac8100ddfe305146fc8f4e753fab0100000000ffffffff1a3c8cbe779ea418884c3c9a7616a4933e0de9f370a57e64a1d939fb7bdb95d21000000000ffffffffa56fe50325d59dd8b7f9a6512eb9d64b2d049057602c7b37cf85193f0b7670f20100000000ffffffff02220200000000000016001490a54fde9b747f0b0683ecbc3a25e84b13559c74127c9a00000000001600146bae800aaab60e2ad8cec236650075d5557488ec02483045022100dd50b2f2d32ece4633c34d525451f988226ce1e4437b4004a7296549653e19510220178df882dabe508399c59a1acfd813ffd0b2bb02cb9c0285af8c2a2eb2431213012103d767796dc3bcd4c2e9b15354988c2d6a0d14c0b85185680d57e3117322f8114a0247304402205d773cefd06a3a6047cef0a864a7fe0dbc746fd548a7b31d3a6ad9c661023aa002206a94bd097691880e9542aaa44a74e1efea6a941b4604a4ed39dbdece83f27bf00121026e63272a4dcf2c14897e706ec233b2bbefe02b8cc793ea96b3843d03f6bc6f470248304502210097fa34cf4ec9765330c497b11042d47036f37fb08c3e32e86e90c7b453dc95a502204aedeb643b0b9620154f9e5720c285a4966e49ec2f710c8ff7b1c9f8aef116a601210250480ea20c8db5d4da7958a006e754e6c9df5d1c7dc3cbd814fbdf4c2abe5b0c0247304402206d6e4e70986cacfdea4fd49cdce306441fadabebc6a31f89adda8c9406657ee702202aafe6847ef5f2af3c82f98a9742f576284611e191a0bdb3c2d2e2c45e07e3d70121026e63272a4dcf2c14897e706ec233b2bbefe02b8cc793ea96b3843d03f6bc6f4702473044022025d90d836ddd9a247629a23f849a00cfdabcaf81956a02f7ab0d66b5e2d0b65e02207dd90a32c08d7f5a5ae8e12a5fd674a373988fedf737b1e26a8415fc45d297760121023d66d118f80b5be2950fa8a61220bbb6df18a59e3ba3cbdbfaf53f25ee8880170000000002000000000101d222f84a4a33fff744828e92f6d80fda982590b126678573cd612f054f84b1d70100000000ffffffff02bcf003000000000017a9141d65d8f7c7071b7e83557c56bd381f1f93563dca87318696000000000016001421059c992a43d98bdc9b1432ae1ae79ac2e0006302483045022100fe7c1c77fa1ed7311386e830fd42ef0be6c3b056402002c77b3e9b8a7959585f02200bcbba195470be4811aea4dcc19b1ac6649537680b92ecf65549b8e695d0d12a012103e048a6567f6afd6a36dfa02e60cba80e62b56064ee700cee3efee168ad8e24b9000000000200000000010180751518ff7121cb21d071a6afc0869c3d8d1db121c490cbc226964d02ce77aa0100000000ffffffff0277e107000000000017a914f2ee97592326a2516ca1bc2e5a05c38c81e728e387dea08e0000000000160014dd36a37091ba0c8dc9b0ed62cf45375224a9bd3a0247304402206f856ff7e87fa9bbbb8a0f322e51713082297df2fc829317a99a690b3d2c3f3b0220724c9d0fcac869b2da24c6570d2071e4c5e57354cb4672b1e6524219ab55afc501210268316495d02d9d159af051a5a308a05206dc89b7d67e5574eaa85edd534b4eff00000000020000000001019e050cd2ece8d9912cda974d2232d475f62c1d36dda423534d2da86dd5815f160100000000ffffffff023cf807000000000017a914d3734d4bd96901e76b2e2a79b0d802dd7d36d82487c6a4860000000000160014fc01de2bda9490c2f04ea9f49537aa263da1608302483045022100bff03c76ea3871dfc4980475e55bdb05080ae98bdb6078928662db95f75e8a7c02202dd37a940b80207051e75ba19bc5688109d4ae667162e22f7dbc2ed14b0a2ba2012102c52e1fdec487e9bbff0ccec0a2cbb91343bb22d66f365a924c6eb11e3e6be8a50000000002000000000101ebdc7f48ee495aedd3a74cd7b299530e1395b4ec6dec3171a9f0a4b9ead5837a0100000000ffffffff02ca5105000000000017a91422876cc4b29569b7701235d1c31c105a801583ce87b24e81000000000016001428b89d620609749e4fb9065a7c64588846339e9e02483045022100e742fe0385d2579cf18be631f35d3e73647351d508eba5aa161d00d3f9737811022016b6d115d3ae604b5777e2cadff81d3a60f1d7ac06f28bf1afd48329ae4362be0121025750a08390cbc15f1c29a11c5aab7b3a369c8f4044b869d1045a3e34b59e50100000000002000000000101a450b607fad051377d983c3aad1dd216b5c7510ac29816d691ed8c5fc5a2a4660100000000ffffffff02087203000000000017a9141b328b788e82680d33e9d3786c378046dfa718648760d87d0000000000160014f9b80b9418617f96fc609c81f81510c8a63fc04002483045022100cb9fc47fbf46cddb5afdb89c3fe736e45eecb489245608a13e1b32f6ae756b0a02207887621630786ca522893f3974934ea50bab649ff6ad3c50fe78a047342960f0012103d5a88966cc453591eb32ab929d0cf4f703de6ea284e2022815dae4d275c9696200000000020000000001015e74c922862c898e73a1bd72c3e8ca20c040b3366f974a40724aa1e747aec6880100000000ffffffff0277e107000000000017a914e2847067fcc2f3359b0d59661dd40e3b163409b4879ff2750000000000160014cd114e592747c0542177a422fbb4a5867d6dd48802483045022100e923273fe57b4b613b41744daee38dbc6512f68d51943dd8a94b0cdf0c50a20202207e364518a1d728f81a53b12807d49230a630e27491612b4f961f2faad80fa00a012103e35b8749176ab918de3ccbb50d23fdd697f30095c99739b9412d459280a2e2eb000000000200000000010163a40fbab5dd2100cd2e135c33e2015f294bf16bfd7a42d94c7d045001b9fe780100000000ffffffff0277e107000000000017a914796570a0c3dc0afcd90bfd19b2f36e2377bfa26887de0c6e0000000000160014cd114e592747c0542177a422fbb4a5867d6dd488024730440220642c3493c0dc5684541293ec8e51ead4a1b0c4b4844ad70fc0fa56b54588d0cd022007aeeb25c60ab300fdbafa370a502bfcb068b3976b6c4b9ecef00d3d10b54ed2012102dedc87c18b69d82d738c3da32c1614649d2f238181bb67a4b150166edbfddafc000000000200000000010122c7cd9ade331927ac453e67f90ef1c2c31066c9b1fee4933ca28cbd85e52dbc0100000000ffffffff0219e905000000000017a91401b22855583b814139b4f5ad8fa0232b74ffd21787321e6800000000001600145321a486525a84bee6d011ac63e4b752eb46921202473044022051b72bca5f90f92f6470b9675fefbc7ca8473f31882b458d48868c5460d40194022046e6e1265f79ee1d1d072a71ab3c9f0bf3bb9dc46151f2a592a20ea2d58c99c2012102dedc87c18b69d82d738c3da32c1614649d2f238181bb67a4b150166edbfddafc0000000002000000000101529cabb85d30d61883685bf4b35bacd59b11e8770ba4d4d78c73f2b830a350190100000000ffffffff0277e107000000000017a9146227046ddfa0c6178a0d1232ae8e4419c27de2d1874c36600000000000160014d90cd13790698e4f4fdaa00f14916ddcc7b33c7f02473044022038fa89da8433ed6c5e1dba4b1d311074d6a99de4b4a4e2f4bfe25a953ebf14700220336edf5db8470c62f3fd59163aa8d832befda4ecf93089ff22f45f1fb1c8dfe9012103e0178f896c6c2175e7ca0670c3bc2f57f8b496c66925218635bf41abdcf0847000000000010000000001049135838a4b034ef42891d390327322e50dc72292b19b9f6904799c2f15149a3f0000000000000000004fc7f207ccfbee62e9b3958014438bbdbc0130138c5fa4957a3e9c7fa418c7141e000000000000000062110d192e2ed7adc33692c9eeb9235282e7292885aa73718e68c82664eb52200100000000000000001dcf8b8cd761f5caba544e323cba7b74e48a9908d720225db3e56851209eaae4010000000000000000022ad86101000000001976a9144245e08ddf09b4a547f0263b94e935efd5b6cf1888acf230c7000000000016001430efec7145e637cd125c3edce665fd31ad88c35a02473044022031828920b318bca9f9c959c1f257ce9fc758d3a7b5954b0bb04725d35699849902207687cb03275cbc9c4ce4226d13300c42093d5c130bd00a210b714b4397ad60db0121022cce1f1ed0c2601c06f33eb6077a23eaedaec0d41ff76eb8423bb1651112a96902483045022100e5f762f4cdc77cd107eda42041f9da0273971eca348621deb1ddc1f7856d4d75022034572a208b15bf88c0d7e19387197f95eb4a8a19ce6ee8b332d0ecbf261bec090121022cce1f1ed0c2601c06f33eb6077a23eaedaec0d41ff76eb8423bb1651112a9690248304502210092a5683d7a94af4d8bc909c9836d61ca51d2c33c38824a3289af457e4af627fc0220793e52a2001df3f1ba83bc27117690a825c314d1271b4e1771898064ea4c21f40121025547438bdbab8e8335a057b2687cb710f24b9aec9bbe2747cafa2e08a2c2dc6e02483045022100b85ade70a7d65e71c3fb6b4bfa53d1336f6490b81c428abc23f6b0d92a276d9d02204e5f3aacd517486d90cf52dc9894b734119e9ffc26e3d86a1772ebe3d91f1bb1012102cb23221e08f1d20ad19e47661db8e2fe32d093a8a964ae9bf702a8741d0878020000000001000000000102a8d520f89153555a159e2706e454192a661f97162dfa74621dbd7199eed0b5cf0000000000ffffffff5addb8b409dfe378ac252c63fbf04b1ef1f0972eadb2326dd372cb32f0bcebf60100000000ffffffff0226e6030000000000160014f3e7491316e7972df0f154526cccf1c58652800080b501000000000017a9141f38e2c290031b8fb46a5e7e7149e736de49c1448702473044022036bcde4840d27eec04b560ce3ce5a32d179037cfa232e83dbe9bde94a5bb12be0220142a24942c1927b46521b9711ebecd5aa7dd68f800ad6350f75407ba8bec753701210275f17e938496c111cf88a9152e8a71a9422f4749a12ffb88bb27e68bf977ff6b02483045022100a6725c1fa7c2fef83fc6f5a1a50e29a70d332b921cac23f8487cb05d2664a47b02204c381d43fdfa2ab42580efb36a003f1c6f6e4f90deb84393302a56dd111e58f201210319bb1487d0112d5209618fe7aec18ecdaa670efbc93f037337a2bd0b8befe6fa00000000010000000001012766b92c26a4fd6b1dd73353fbaea163341e96adf0ab56492e6f3c79e14a54110000000000ffffffff0280b501000000000017a91407a67bbfb6dbc458ae42dc6b6ec3bd7b2ca463ef87bd2c0200000000001600147327329ede6c3c482356f6b701b9f3dd9abccc3c0247304402204a8d1d258c861e6cc9390ab5ab828c146f31d9ace820d75b298c752501d57e5f02203ebaa229086ab555886ba64dacf50463e13c493ee518589bc0490ad650bd0a2d01210224237f37ec3e1121081a511cce1c82637a175e076dd074b3ef0646b7812c6fbc000000000100000000010215ab51d3cd3fc923cedffb7db3fe183cc0a41739ad3c610acf2af35e9a2554820000000000ffffffff4bee2682ea2dac82a785e17a09c2ca6b7c2371caed120058170b58a3431a5fd20300000000ffffffff018e490a0000000000160014112f338dab696342c455ed0b5592a1e11f95bb7002473044022030bdff0f4452966092ad673fcacc82398f48bf93226d2c8fef42d9323ae7bb0002205ccfaa952f9ec83c23dac6179cde646018da6fa34d04891f8da0bcc048f082bb0121032583d022070e87f6186a794f32af960fc728ac20f06e50465c039f839047b1e5024730440220691f7a3e25c767ac2465371e0dbe0f59747c7c796aaeb2c0737ab3975c3abf7e02207ec7ee3df9abeeff92aafd98b98f33416134f71ecbdcea58079d837552d154da01210298ff325667fafa47f9075749dceff9ab2f78aba6a27839ec000289257fc76d0b0000000002000000000102a72301fd3a180473d181a0ea742bc6208d950a56cbb24897ee3e1bece5e866708401000000ffffffffa72dd81400df77d41b3df09089f028db5d88581020a9bd52112ac26ffd979b8e0100000000ffffffff01f81b0000000000001600143f206ff4afc67ec143d40b5fc5e562c5c5eb15fe024830450221009877efe830ec1a8815bbdab8c14c9b254fb516c6a0eb5c2340f463b5a95d11bd02207cd7e2ef5778cc23ef28d4c2c98aa45608a084c79895e699e4ae995dc49624930121026a402d9d8355ca07010c6bde4ddfc81f08c1534dd875a8714e574b2ca8f0542f02483045022100d818662d99dad0c3bb5e1aedebfd005b3526096f489af445478837c70bdb347202202e14dfa5d93cb973a4e200d8c6ce0117928e7151e1ded60dd7fd71a0116fc4c40121026a402d9d8355ca07010c6bde4ddfc81f08c1534dd875a8714e574b2ca8f0542f0000000001000000000102f8f1002c24321cd76b04ff1a6b9bc7e9de054a40d594bdf4c76437d89530ff580100000000fdffffffa3e72d11d5fed9b5fe4928a56867ecd38f806064be505e2dd990ce34972e86490100000000feffffff01a1f80100000000001976a914f1acef8f74a982d500e0a17fe8519140f2ba28b988ac024730440220046fd0629c5a001bb3cd51c663fd4660a7c185aa5b06507460f1e202ba6bb14f02206a758f185e319ef31b120507da033e984475c95c48e97d51846b69aaf1d95a6c01210341524e0d7960e47e00e6e03da3a90326bc24407bc664b95d33a268ee187668fd024730440220516b90ddbad65350844611230c753a4b0d08cd63a948a61768be55e847f9cfdc022058322ec40feb2b815f35f633c89451161f265f0d2ee2387185ed32d79abc9e8001210341524e0d7960e47e00e6e03da3a90326bc24407bc664b95d33a268ee187668fd000000000200000001c441e718f7f5478372d84f0dab35ee1e24dade227395605341b8dcb3e77b2785000000006a47304402202cd1a48d36c98edb8e8fd3f5f41e4644b4f9129403b2b9d3d742000521620e110220262f3c55780d89155c9f6a14f133680f9b867eebd60053816bb59b5b8562551f012103f982e3c95702330215a768bac4e9cc87e5464433998824116c2cebf8e8daaed3fdffffff016efa1100000000001976a914621ffa3635fc6910da09fd922f167f7613777dd888ac48a00a0001000000000108620137f7cd13f2c7b79437eb83fe899d1a53a92cb9fe4fcc8e523d08a189f9741600000000000000004c49145667e2f5a45e9c53fa7a084d63495f3d9f126cf7620921db88975f708d2600000000000000004fe3c4afe044d772cfb7a627446d5e6a47e8964f5304a6a649df8af0fabdb4b72e000000000000000056703e2b68fb676306988af00267f5dc2de18dd53cd2d91ccd8c3cb3c0e6d10c2d0000000000000000dd17c2c335a5a4fd149cca72febe5c2412c09e2bd9cd8a4f7e3abb966441bacb3e000000000000000015937a3cb9b31d673e0a37c406f5840966d1e27d2e263e05a97d105492caa868120000000000000000c0d2e1e74c65a719d52e4df6ac710d6905947c0598682ba8c2863110b8cabf03120000000000000000e476d26a328415815ebb4b3184bc453c501d3ecfdde793517d94a2344453e8833300000000000000000148942000000000001600149342ed9ee5334acae0cfcc50dcd9390c3672f2de0247304402202591d2dc8c2f1ed2d668c914efdc2e3f9971f43de382c8d46f8d1ea4dbd146eb02203d5b48888d8ebbbaa46ef6a2061b0f8e0aa87e1bf62fd2ab71361c43a49c1ffb0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d0247304402203249f5156f356499bc580a9fdd95830b69f12c157421bc1b3c4c8cb674e100b1022021ac5fad7a733047f06805ff8885dddbbbb765c6b0bfaf2c7372934800265c390121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d02473044022021639c353ba87a31cbf5018c7a2c9378eb57b2b721fd43e1029a11b35159e56102207b7cc21e8a02177afb969fc35b3445180cfb7ff96797cd8e3634ec1fdc28a97b0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d0247304402204a91bf1849ea24d4b3f4c487d77b1dfbf19e015544347ab7ae682a268924760b0220667f1ace024d700d9a8e91f674b317eba748cdda3ca5a7b782b7299025a9683b0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d024830450221009ae183cecebb9a43523d37399fccde96190b48c5da26f54d44078549decf863e022020bff560a398ad9876aeec326e13608a24b691f53793e86e5753a9f36a761d140121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d02473044022003bdece58759c428dbbdfe27225145d3fdab2a0b8eb9965dffb8ce377193de1002203194fd39f255bdc5b819ff91b5217e92a4d27a2033dd84628f1d698189e442260121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d02483045022100991719d300f0f997b6215252d38325f20fa2163d738de72f8e475e135ec3af9a0220128bbb89dd9ea3d77a86269ac0644fc0ce1a5b410f6bf105ce7e342abfbcfb320121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d0248304502210094b2c143dcb1576bc0383940ca9030eae0ec9e4d53a407236288d7b2d8bbf81a0220559c9899109747112c7447b421ba57391e600b289c3227ea2c5cbbcc5f19607b0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d000000000100000005cb472c9dffbfb923f66889008b6e06386a983e6c520dab31735d4442a72f8c3b010000006b483045022100b7bb7ccd946eccdc25d27dac61bf8f83e738849c0ddb8c80a61ae04feb5a2a5502202b92662770ca6647449c84d348e5ef63dca8338b710382c4666ecf64836b3dab012102d315a78814ae2c70db505a9dbacc10082f98f7bb6e9aeda08282ac306d00b016ffffffffb96f7ec50e1eca77334d6511838dc9c0d42c100565dadb5c6581e47b388fde92000000006b483045022100f1e26e2e2462fca4504ca7e9d305f122d07ba65c10dfeccb9edccfbb3c6bff2f022017097274bdbd9c43eb0d494a1761964a10d955821d6694d2116ff2a1862c4def012103b6fb6c55acbd762a06b2604273006d667967b7903e335fa8450c1d21fd6555e6ffffffff5fd2c21d4945c30f335e87b6dc27e032fe405855a5573ef6c0dda837a4a8381f010000006b483045022100c586bb204da6d8b17b18194efe70c94e918780cd5090489ca6150693d07b5b4202207b869d0dc90c19445c09f76457d8a8245e91cc1b9e006135e91687452151ccf30121020a65fffb482025e66670afd1e26b2ebdca4341e25f583b9053508355639b3fcfffffffffeab9a70c0ffcb33e8143c44bf251fb880ef8328c1339e11719359cda1279c3fd000000006a4730440220078a0b71d02a48dc67d778f7cb19d0c453dacc3cf8b12343f23a04367266589e022017b455739610e5abc5117cb828ff78d8d9a36279b9ed50b5af77dbd3465c493001210290eafd3d9552a710a3f515cc87cd201fc3ce988ca6d27b6d4e9fd69b32f7d669ffffffffab993d4c9040f5aa76d92e1ccb54c3a15810ccc49171b7dc4b51fa3b3f1b766a000000006a4730440220377940e7f9ef34d8fad4641e255912583d60d3358d5978cde034c5ebd70689d802204d17a4f2fce3c32af2293aa14f37f52fbeb18d453916066327be92415b878f3601210255078d3fe51cee8f06b7f8a7ebf7880e1b897ee66af4f858840b3cd51cd17df0ffffffff02376c08000000000017a9144d207e60bb4af91e1adccca84f0151d4f3f2df388776d00100000000001976a914cd6b96b2e20c2e6974caab70c0cb742eaa5f956488ac00000000020000000001012f5b3232e231e686910d52820e3ad4738b83c747e89b69917d3374ec9fea5efb0200000000fdffffff04ba8d00000000000017a914d35229d1d390ba8f454ef2a8db471a30a2380f6d87733501000000000017a9143d08481ae73e98dcec0df4ba2b66ac0b1b905daa8774c502000000000017a9148992a13329c969606a5e82840ba559043b7d943087d342f0000000000016001495fa16d1f3d5e76b2078cc167c50170882821dce02483045022100d5278042e1decca2a70ee66cf13fcab6ac47a81a4176d771961af1c55d2e0bf30220540782a3e46f786726fbe7330b943b428a5655f39e09c69e5c6a18ac981d48210121026a35d9ec0983c1e63b0b4cfa76e08741d68a6381f1ee9974604b0fea4aec7bfb48a00a0001000000000102dd88e1a6c79c8f975915c71a06fef44fd598524a331420bbfe845c23fd6ea0448b00000000ffffffff2faf699091831548ac697aa5f91cdeff455b2e94a285adb66990a8ccebcedd8e0000000000ffffffff02dd450000000000001600140e863b2bfe604a133574de35d16e348b1338284440420f0000000000160014cbaf0633e5c0f05f426eb9b1ff8968b05d7aaf5a0247304402207674cf01d3ddf20eed66ff072f53920edde3b64cc322eac9955565f45bbcb9cf02206fe76037bf20b1d1f94f4ed72b279040b76ab98cd6c94afad5f4b6635dedbde20121028f61244dcb30547638b616d383abb37b44b33a34f5dccd8a9cff84eeed83a9c302483045022100cce212ae512da972eaa103f41f59686a8c4ac1c95727a55023281a0cbae9478c02206346c7f8b509c17ff0e8d400654cb513b4f53fe222e04bef59125edfb9ba6364012103359e7f5ba457593b5af1da597b16fd480159078a8fe0657187fbce426bad1fac000000000100000000010213a2fa53d70f468b63a854e5b1d95aec18c226755dbdbd2a05d15eee683bc2170d00000000ffffffff91db6fbdfce21e9989db9412f82d3a900a523e593d9209c244a16f6430c1fca41200000000ffffffff023eb200000000000016001470d73822cde1c3301296976a7d5929e64e42f5a77c180c000000000016001411e99f5e9d9f3ae7b91d625b25ca5d119df3444e02483045022100ff565f7fb58074cb22c0670007ec267e2b64f1f00dca7cf8ac9aa57593edc81e02202f7d67504fd76e453a8e0350d290b583a20ef2233e017b2fcc1d7876c1bae5a7012102bab494a082deffbe865b626b970c103562eb25844704d0eda32d78b34bfbbcef02483045022100e81f27a6f9652c98a8e0e04ef399e6637e5288824747d7c0e9b0c4e275f487530220730b418dc07bdf6ebc661156db78fe74f2f7053beb1b8eb73e6ad2e3876d4074012102bab494a082deffbe865b626b970c103562eb25844704d0eda32d78b34bfbbcef00000000010000000001029b223e2bebfd61c3c67ddf93414ff22d8f51abff10fc57475e717e719a27ebee70000000000000000069c4116e098f1aeebb92efe0e274ae8587c5e98fea68ad201aa479cc4045b5180100000000000000000260182300000000001976a91424abfaa84d6c75f1f02eee8d509ff74bcb02edcf88ac1c9c050000000000160014a29a1ca74d3a002e6d40cd539b2eb7333aeb33b10247304402201c9e2512b57f0de09c82316650d02e39335c5307c0ca55623c3de991af9879d202202c08584d2b2034991be22cc87332ba397cd7798a7b1c5f6c8f0e1e13230bc8900121027fee68032b8e2906e106d5f59815cbe54a19af3466b2fd9f2754f5b8a3f6b89a0247304402204cd1b769490a85c88f9a228e77e9fa347ffebe11d084a11638bab5c37ed9cf110220073aad261916ce89d70ba6838f1b258ae7162fd35fadd67e43f64eda29a3da930121027fee68032b8e2906e106d5f59815cbe54a19af3466b2fd9f2754f5b8a3f6b89a0000000001000000000102046ce5f0a69750a099b65013c0f2b66f0bd6ad79888c83d25243c8ef765b604c0100000000ffffffff5aa668e8220fe919fadb94b3ad5e6f02f6f5b57e4e03b4ff9bb4482958a005841000000000ffffffff0266230700000000001976a914b02889737f189608ff135d7eea38a9290375b5cd88acc3c4080000000000160014577b11875536550fdb8ae701425319c6eb156dce02483045022100d63a4664095fcce4697296ea31962afa91300ddbbd59c519708e94dbb1521cbc0220671f9b546ab061886b7385583de6f54266f0cff1776e497e08d734fdd020f56a01210279665e2d4d5ab2c70d10d2de1b6790e1f73bf4f0ac39f7f0482b19cdeae6243b02473044022001a8ca5dbdd5c0f682b3139e3004c4d8b801e7ea11c4819fb39e52ef4661d392022070d3941eeef712f019ee3e28739ea0b981b56b078e89fb6b3e11c86b478f15e5012102be12df3165a9165bc9fa33cb35162991e64bf63094ae6905699144f4e10fc81b0000000001000000000102acbcb04ccbe4b403268b639cb100426ade9ad1e30978fa26bd68445eb7622231050e000000ffffffff200d2bd0fb864761f37e7f7dfd63b43e6a6a453c21d173c090402d389cad4a440100000000ffffffff0220a10700000000001976a9149d2bcf61fc439a6eab082fd465f9cd547d5636c288ace17200000000000016001436512433415155f058b43f045d8ed8e8513982ac02483045022100c7c327954b7a0d1f9b380a51e8a744e69d10662ae5742cf80b2c0be0bbb29b8e022075adb1a75f05cc484b030c1c6df02ff134eef662144bfe94d4372a1baa3cfe37012103c862c67576a101aabef9ccbdf0241419bbbaa76dc82fbb364e8ecd53803ebe2402473044022046b9e23ae581f4b9c03f1228bec442a519acf56a8651b80c8e224d2ac1cabad602205d19113cae0d9f9f3ee235bc8ff6f80ad4a44290318dcd628428358175f77b990121024d96759019fb66d58332da5b35d594d10619e56a4e6cd54f8c95a9b0803efad300000000010000000001029bf62a874410d6703bb17487b8e8aec0ff8d6b2e089131bbbfd8382e82bf3fcb0000000000ffffffff7f739554b3b72c17e99e1bcd9dfaa79d70d3d3cfedf25f9e4003b2816af87a363b00000000ffffffff029533390000000000160014dcdf8f7741c7dba6b75d78e4c16628c9d4f39b52acdc3500000000001976a9147ef9e6e7bf1cc0e9baad4ac06ed3edc601397dee88ac024730440220209f7b63bb290d134ba7837a13c5c40201f939303b8b3edc799af5e01770dd62022033aac3dc9a7a53c606e55a728cddea08f3279bafa0fc35e6edff6eb357cb5fd301210286e0a0a766d6d62c0c7d9c92c662d050dc08e160476a1ccca771d887716532f9024830450221008c3eccbdca0462798447ac7687cfb0dad6c0941e28fe8fabf35d6dae2a208519022045241da85c6543566ad07331954b33974215e83c08cfe609ea5e9992c25ff156012103fe7fc80ebaaace404ca0ddfafd37b817ab108ba20609ea4463486c832a7f73d3000000000100000000010274e4d045da5ca9990abf2d3e4708cde264a0d43c631bb0092ac5009638c3e06e0100000000ffffffff9234af6b3e4dff8b01f1ebe11104154b53f123ab18c555220a958448991f8b198709000000ffffffff0220a10700000000001976a914708ecbf77357fd2b064c642228d46c4508b91a9588ac57a2080000000000160014d6c2767398fcb722ceb8c6ead1295c74961bbe1e02483045022100d3709b465b78061871195e55b170da6213288f2ad589f07822e5d9b1a6f408d002206b61b366f67c9edc8b2145fa2cfadd5c6ad063efa5cd9877ce8d5f60195090ee0121036eedcf6bf27917dfc2bdba667dce8216fec33f4d538e1991c48f0c2279eae77c0247304402203246ebaa91cd60b067fe2e1fe8a419c688271397a9de9f6a116e0c9873ae309f022044e35e0cd7f2ebce87ee19cc60c56743498b2c4bfb7cfa8238aded100976db9701210322c561c6a78b22a074d64ffe5279380664237b4d320ec4edad295b7af7222d4d0000000001000000000102257ca4786fb03b55220be6af30c2ddf3cd064a6b60faef5e004252962c4aa7990100000000ffffffff982660015c9f5b1261c0ffba11f3a5bde5232dddb0e473cd110c917d19414acd0100000000ffffffff0218560000000000001976a914536cf81d317bd441eb1aaf86689f448a36210dcd88ac39f400000000000016001408fbc5c963429ffccd9c8364cd9ea63bbfd1ca7a02483045022100f195fa5285d4798531f6409e5a48b99ba8dbeca4aa4795d854c69738583835e0022054006d2ed76634ac86b7da17197ca03a1c8e335cbbaf0d0b881ca22fbd0d7b0f0121027c05f61d7086a70a9897a264c3e5d7fcdf07e450aa466350e59b0cd85451fff502483045022100bcf617d7354df8621e63631617de20482a8b1d7046bc01891b76a0f25d9a31140220663439f9546293f09740d2bb1a839d8f5a6e9a7099260913799f0de76392b758012103b46f3709df78609f7c7b011245864ea74a1129d51d643569f2556028f3c298d200000000020000000191d831821d511824b962ab904535002124dd421892979be675f0b25b7fb23d2d000000006a47304402200218b6725342372969849a3f76b742bd77216827ab6a2cfb1ab7df7e376d8330022029a21341f6698c5ca800ce2d47d4cc96681117cb9685a899732c6d9101cbee68012102f9d9e2945b89c4e0253023ebe008de4d5aa41d1f02244f239da3378691d820eefdffffff02409c0000000000001976a914e120b6ae284818b23a6bc3485f41e8b5d31d7b7b88ac5bcc3d0000000000160014c7e9a1cf2c91787f71d4cc7129eb61a2e831febc000000000100000000010214d0c99d7381346698bb06c84063eb99a1eddba40f5de1f26fe56bb82472dcb8000000001716001422668697b5a9a6090e64b76cac1f416ae8f0293bffffffff81764dce21c429eca3e880d74389e846eb148141d18c3ddec127ee0d8561559f0000000000ffffffff022cda05000000000017a914458a58eb04538c38f157640bdea7e00087196467874aae2800000000001600140dc135200bae019c894ee2041056a24d8fa4fd1e02473044022063371625307c82332aa1f3defd589edb82458cb0e19ef9c7fd4647cf00fb805b02206187a9fbc1f17fe42e2880b9660491f5f888f98a7ea209eec0d6a2a69aa26e75012103cd44ea4adacaaa4b922d5bce8d2ab8d4af1d8697b2b6cf11538bff124317a3b202483045022100faa72998290e1a001371025a2d67b71c4c244e846cf0a3d0326ddf1f49e9d30d022009b700f71afb7d387841488b6d5f5157b851b0c7c76aedafd453d192454bd2750121022ce1fc898b588907c2d236eebc8c6777efb75b63139688a31fa56fa0b641c61300000000010000000001014f91b0c5c13eb78a9b3a67cf7be9e21c415e287adb55e0c349c4cb57f967fafc0100000000ffffffff02ceeb2100000000001600143d766a8da7b156f24df178c54778a3deeea465c185be0600000000001976a914e9dcce94fc01146e38cf73c645994b02e6acf2ed88ac02483045022100ed4db8a792f568959048dfffeca0fa42c4a2463716f9cbc0c49416aa6f4332c60220729824d39c1424c678489f523f4da5382250af7cf477c9b86593631a43ee3ef801210384f5167a2f80231cddd2012e371cace564445796452b6c66b860f6306196fe150000000001000000000101d9b27120c76142bd8fa4ad9311b772fd0ea7a243788e5a20ff1c78ddb19ab1080000000000ffffffff0229bb0600000000001976a914233d6a9444e42f1def1f2c3f0a1025524bf4db8988acae2c1b000000000016001490f23121978983658f48bc22b896700ef90755f702483045022100c7cfdfe1d2e829432aadde6e5751388a4d98476c576a96fff4602170ea43c69d02200c2102e2ae79a25d460fc66379920267194b5cf9fce1823bdc176039d8f8505d01210232fcc4a0ce0b719d347ca415d4ee92bd5c07e0deef00ebfd54772242da02bfa8000000000100000000010349879576165b3f2caea399990cf10b6e94dfa99623e1c589b67d15464ad6c2480000000000ffffffffafca72665f36cf6e74316151911f48ac105765b328f7eb67c4d0549f5f6e739c0100000000ffffffff0feecc2e56c9885413777c3cd009467ac2253fef7846e5e8e6beebc9b04ce9530000000000ffffffff0253680000000000001600142902a77fb422e4da13b57d6be16d2082c19898f200350c000000000016001422ced4a45a2a2f92196bc09b1443217c6d3b3eef02473044022043aeded09487c42aec0f4c9f29d65a2662a1b6911ea1cd13dd57f2ca6f5cd57c022018b455b17c106aa9efaf5d71da046db28f95169054bebe8ffbdf63b24f3ee307012102da7c27e9b578a4f0125aca812e27788a95307e77553019d6d2a0d4ad8d408366024730440220665e57abcd17a0985697e4db1490f1e310c67f2a3f8c4604ff1ed79922da9acb022060b54c9cd23b1a4a8a0d64fbf71ab9978e536ebea7bfdb72a9f1ec8db06d65140121032d93b5a11793dfe20be2b6dbded16e207e063d2c3e16e3de95dbfd38188f1512024730440220599abb3242dfae457164eda55369717957ca381e0dfad2eae834445e126f888f022049fefa9e5adf6ef542e0b2febad2a17e90797d618371e5aaa682d8b5bd5b3e970121023963e970daa32783cce05ab20a895601d3c759f0384decaf1fd57feb11d475020000000002000000000103e5199c0d95dea38db73936268e20cfdf52aab4c7ec311f95104903cfdd6d40788101000000fdffffff3574c2c97902ee6edf05fcbaee48ba38fd7e474b0df642895d095407b1f01d474901000000fdffffff10760fd5b3901ea8ecd42dbd80d50337f969acd108686cc57cdb2d77ff9d8b547c01000000fdffffff02d936000000000000160014bb22413ab5a1084290801e4506915b3eb25276e9967c0000000000001976a91476db512e8300fd076d89900f13e812053cde7f2b88ac02483045022100fe2dce8488360d3aea4fe6a4e31d9213906c6ce004cd6d25c05773d0eaf0d03a022032d2d42561e6559860e44d84f01eeecadaed6ce42806c1c326fd68166681cfd8012102fc068173319abec88ccb15a69c1c750778c2afe48e54eb1d2917e5f94684d83a0247304402206069ff163d98b21ab31b2fdab568dbbf51e31ea2410cb8274071f6ccc9997c5202204e907bc9c38bb2f31c71e611449de6e0d7da44891531a749274701daca244827012102fc068173319abec88ccb15a69c1c750778c2afe48e54eb1d2917e5f94684d83a024830450221008dc9b8bffa39cd2c4213dc3c35f8489fc05af44c15292a28a1803f328acbfb2802206f00cd713a54447d2717d1d7eacb1e8f5815ca0266b7c2679da561d8326cde35012102fc068173319abec88ccb15a69c1c750778c2afe48e54eb1d2917e5f94684d83a00000000020000000001029aff48de63b216ff89819fa33e1545d3a894e1867b79ea6ae6cb132c6d8425e10000000000ffffffff24c0d7c8fee925d8f4ad555c67ab7afa46f45c15ded2b97be67c51064378cd18070000006a47304402201a23d6152aa46e29ce061ed483ba8e3a2cb947e55377db37b1d249a4a6e7c57f022077ca79a132db79278333a4653a8f90be609eaf7b2c1811d60e4da5318a3a6834012103e16055033563666f49e749d07635071f994c56e727d30cd3abd3489b098e2844ffffffff02b1bb000000000000160014b7057b566596f7728e1136abdd2e6c90b9e66d189df604000000000017a91423535c61feffb48a5778b203e944893e4f9dbcd8870247304402201313cfa5148c102b845cb902c2e8999fefff5bc1be20447be5aa5bff8e06f93d022013deb83e09ba9060d07805e6431a2e793ace342cf0124592aafc68b770e1573d01210372a4310e785dd2c3e8d37c26f13988f5a09271c89190365e2838951c4c1094d00000000000020000000001020483fbb79249e87328f29f880dcb72cbfddd9669f55817498a7cf2765fe515100000000000ffffffffbbe4a99b11ffd91a4687c1528d400607a0662d691c1579636021733a5a87dc61000000006a473044022003dc795b8638acfcc724624463286397624fb16fda20e01f18d882b1e87c3697022043187c4a2564447308a4711593a69210fda92ce21f6bd4dfff52fa6db52d8c910121037a6c0a3a83e1f990ac90bfc4693c542628b882235bae3272e9167202b96e1af3ffffffff02485f03000000000017a914762312e5519920fc467fdd23282856ecf8f1b60787f0050100000000001600144f561e57ef08fca2a38d860a3201351cb220d21f0247304402201739fb2c7be3f9331fe9de23f98dddb5afc5c69a71eabc40dd4a25bfbffbbbbd022045ad10420d72a385f1026a9add042049dffd1996a8f9ba33096d4eb6ea2ed4d3012103e89ca04daf527daf826f0dcc2325e6cd46aad58d7c66020834a07b37082974d500000000000100000000010187eccce446c583d222e1571f5e043e433f2908f0852dd5ceaac5b81b5fb882860000000017160014d5691635c3f62b2a5e560e82772c5ffd2996b2d2ffffffff023f1b010000000000160014f2f3197838286bc1fab4ecb41be1199758f0239e903300000000000017a9143f4642412cec5953e60bd75975fe3db49df42faf8702473044022061bf082dd5c248ac271d0083cfcf48569a494af437c413f84c50d0a8b61acd450220690143121b8537345045a855b2199cdaf3b77a13c1f77be28b940f39e9fa38f60121033542eb3ec2c0296a91a53b9b67ed7063638d237d7a0fcdc73a288657da4d54680000000001000000000101e4791bd37cfb35ec8feaf73ec8617af5f4c822a2a762ac19962b9cb2c9d801d20000000000ffffffff02bc4d00000000000017a9143f4642412cec5953e60bd75975fe3db49df42faf879ac90000000000001600142c57fae99783d82b830d29242d905d79e435f07202483045022100f8b13837d479723bdf5388afd6c211d77d28565b82b469c045991dc5d8ea396e022005efde736c68a38d40d57bafd45e51390836c20ea3b2f881fcb0e8b0077ff1a601210244cb9bf09055055154a363f1588cc7389336d0632f29e0631afde5dc35202f9b000000000100000000010939f9e22fc0ed884e31736deef69d374ac76a177f0cc7ed93f7f5396fb59f208d3300000000ffffffff3805d46aee1a7ec2ed18468c4e27a81121d0274bee908b166dce7501d53ce5b42300000000ffffffff828dbaf7b11c2ae758ca88aa9a61532a308df24b05937e5eb4d09b6bb51524a03b00000000ffffffff78e84859d5028329bec2e337674a2e8859858fe86f8c8da76e7c6236535770581800000000ffffffffb34f08367bd81732a9476665ba3fe179bb533182e2ed4ef623feaba569ef74224700000000ffffffff1ea53dd599365e5a311abf096ac89c2f3d6eea615d1af02622a5ebc41ef5a05a4a00000000fffffffff570e8106cdd4c4dd3e54ead61c1be8af56b221a2f3e6d5557c99044f5b4e67a4900000000ffffffff0b6a6447619473085c0a992560b9927a2c4343dc7f0bb50c8195b16dbde488212300000000ffffffff21f717e977b53e4ae25eee3326b462636bbc71ab9023e7779ec293c5961dd3e51f00000000ffffffff018297e50500000000160014c77f1862f03d3576d5d6da5a92df1dafeb68ee5a0247304402203d9f9ef021203c6408e75798cd7456d1492ed58f8c4f14b505450c355a72f80f02203879fd1ee63f4152cb74deef1801f4f6b69b21bfca75228cb8784c69020debb6012102f32a1d43bb59d89d115c4acefc2656822d758e2d0ca4f70505456c0837664bbb0247304402201cb05eaae04c7ba9ab87cc69a53622fa560ddbf587d762ec31c9efffb9ff1c0402202d929b8cc1b4fb5c1c4b1f3867d76683d2d6f4b4891c892f42da29a6baaea2c0012102d867eadd040a7a6866eaaaa52822cce250070d422cb5d996073b3ba2e8df1e18024730440220422005397a79b12c05c12d1333d5ea5f85b13285f3657db2b60d528792329ac3022030c9aa7e77b1fea562db71abb55879428bc0b221375e6459ead3959817504140012102651351771c517368c44bc66382101912dbc2ba3e28ada3bf1e2cf1be59266d1c02473044022023a806f782045549f4ef37347bb99920afd06d6f57b0058ea245b78174bc48a802204ce3e674f46324e741b201077e17ce5b5b7bf3331555c06532bc8eb1a92a35490121037db72a477a16ece49c335135ed39141368987b833f68f06f744ad2a0f2754a350247304402205f3a4ddf588b691d959182a43a283593d84eb2f1ce3cd7f92c6efc4b1a4e19da02203eece759cf5a523f2cfc629bc83283c1976b29e6d1eb774dd1b17458a8fcc90001210248a1153883c038f8fe33c139754d974deb1f4640f5af1c391c5ab18aa1547de90247304402203c247327b1499679cceaf5d710c87eeb29da397a5019ce25e4f9ea9ff2e170fe0220257b0f127397a7244dc80219de8a30da3b6bbe1b33ecb9d0dba958747e2b336d012103bb1d7aa32ad937ef2f7ec4e874cb4cff66073c37060fa6ff805dff48b531a5600247304402206e6d1617a92d961353c1e7778be550096f6ed6e345dc00bdcb19c7b28f643b87022070be54738a42bac40bdd410de4fb5b5541d759e936a7f172b944c58bfcfd4a4c012103c973ae8b5f6e145d54a318b0a1c21a690c06036f1ebb0ccea8803559037171fc0247304402206939a1e16789c87b7b1aca52c15f78d8e8678dbc307f9753adc193ef6ed35c33022077d835f3f0a21eff6360ed1340655cc233a955378be5877725cf13f1a08985290121024541448015d9c729a5a6a547147b679cf818c0b85cf78fed1560a5957b1707fc02473044022068886bea83d366424853be42db56daae183053a6ddd385b1a6b0127e03aa6dda02204d18c05c7f90ddc7dff41f9e94eeb4f5f78c86c23d1dcc8f7354809f527da51c012103dcf1838dd029d9ebb3eb0b684e43ea570ef52ac4e1c5c6a35f7cd2497eb42e310000000001000000000109d1ea5435d954ffc2b17d03ac6ba9082f965806c53fb61e3a320510f9fb72e60e4d00000000ffffffff0980042148e5133ec95e2540e123c121e91c70ae667295f9d07b800628627e2f2700000000ffffffffcffc7cdaf91dc5c4448e009b627f3c152d1b514ab006ad5d422e8466aaee816f2800000000ffffffffee5e79e766a25ddd00d8b69c9da433ecd97058be99a07534e66273d4539eff532000000000ffffffffd597ddebe6982bf43db3a6d5a278c7cf7c8e8f4fed24a5e5f79f8884f88678374d00000000ffffffff50911e57987fff41dd4f15df650a01eaf0afb39e1a0a0e210205c89d2b0f66384600000000ffffffff1ac839e9ead010a6d335cf30be33773a43d3ebaf853155d8b6b38274868acfdb4400000000ffffffff0f545c6cfa6f438035abce2d08f8690edca0485b08fa952136789a7ace9884104300000000ffffffff0c6a8f423f04d4fa60a4a396659ce1426d526ca68cec7525621c74f6b6215e9d5000000000ffffffff010883e505000000001600142455a5736e73f9d66f03410814bc4ecac1705d9d02473044022030671d117dbc4f82c216741cc1afb488aa34ea597e099208b241d2d7c026d8bc0220723ffb52f0de77cd6de043553a1caa3088a3d7856d6a27bf207ab528f8a6df1e0121035527f248668f32e9170b0ca84d2899772249ac42ebbfa6d3a9ea5a03392871de0247304402205b098221a25e671868b6d19a689e5c57394ef9d4d4d3aaa573779b1aa2d3a69502204683eba7779f297684670fb1818dfb3c1a5657930a1869452589ff2b7565cf8d012102ddf68246d0703dec49c4c1b54bc071ae15799f8830afb1ba523cb1a0197bf4ec024730440220761c3db6178f14d3b03a388b83a5818f2318f94a1a7e47173b09de967c6684af0220291dd6b89e8283d9c6d521a2f5510d873ceb31764e8d4a348a144f44f08afb2e0121036a111c161b7d7fab17f0e12af227b0dbc4d5c375a029ae60a44b066d1f2329780247304402206d5fd40d16beb6a86b0b9d37fa2e91249dcc4b823eb53166cc851b4b574ffd5d02202ba817920302fdee327a0c190330dd0e7c7fc137fc31a632273ece91fda249c90121033fcd7cfab2ad5069288cfb4e3db5ebf066cbe79105990106d9158c5f23560aeb024730440220581bb07edfde8238d8a4f11bc649fe791ba6cf0f7fc9b4ec86e02a54f3b916600220218e37ffd1972f323a1e77addda5857f2b4bbc4b6ab3b87b5531151271ecc4ef0121028e3fdec0b96445ad12939026468f4de5d98db4518ba68c14dbb5ebaef0b88cd702473044022047727083bcf11dc7d00b01c75780de2c7f540f664ecfcc7b40d2c49b27d8ffb402203f9167ee37fcd70fdcd88b50ae9c264fc0a8dcc941f0f2d7849d8ca1f7b153100121028e6eb3c32ff79fb39c94778172a0ffc2457367b1658a9be9c85d8cca6c9519550247304402204040abf953d4098aea583ac291a16951b16be0c2b5515357213ca4a627087bdc02200a878173e764f83681658222a957de0f80e41b932a535bfc275ae69e8d3714460121038cc6489b308bd308356175ee3e6678dc7654d883c45fbf7984beccdb737fcc6802473044022074163b41d83bfb2568eae9993d255275516666393a2c363ccb70f32d2e2ec2610220163f390c6952edc9b424d9ba90f0955bf2a7180653d3b0545cb06a344ad944600121021c8af354077e002466c9e9e82ef630455cae2b4e6733f4f489b286f03ca766f60247304402206a58984e3220bb01221f4dce3881623b66da1ec6b46ba79464ffe172fd57619702204f64b170765a5630a774da08abac924662c9cd450f406277504aad55fd7651a40121036a111c161b7d7fab17f0e12af227b0dbc4d5c375a029ae60a44b066d1f23297800000000010000000001021cd325c35bf096d56e3a0a96fcd537240bc8c5ae307492dc22a0dbe83786870b0300000000fdffffff1b519eda1cb22ce1b8c85e536403b3b7aee3feec7908ce76bc7d1d2f4ca697560300000000fdffffff0266cf7200000000001600142572cd100ce74cc230a14fb75ce409150dbfcd8430740902000000001976a9143266abdda80ab7f29668230439a8193ef705c2d588ac024830450221008dc804ec9bc0066a00cf22226de553c681d837c38a2a5b64e830199b809410340220369932934d22bf07a3aef5df72251fb12a681921161c12204cacb8ba0eef73810121034db0b7a1c3cc76ce8debb1d4ce26579bebea44c24d8d6572482eae0d7c112a8d0247304402204be5d809f735ed0b3c255e5fb37092cdb983f46e01e1b753a0a2725b5adce537022019437b8967209d60c0b46ce708692917dada5b35c99ea3178301209b45923efa012102d2d2df12bed8f97b80749c6b0ea98ae1b79133e9e57c80dfc5d76b28ad1759200000000001000000000103534373012c06d205c30f1549adba8ad9c3f4bdc72a9679c50edb36fc85d806ed01000000171600141a615a4ea3ece873266912b34a7c813fadb0d6e4ffffffffc923bea16877c52e31b361658c0a26f4e07ed83b883a21ef8b6ab93b8663ee660000000000ffffffff492534fc63f51cfe45a667ca0f6c7e2fb88e1361089e99099fbe8839ddec74f5370000006b483045022100b25e784793ec34ce00d8158a93bcce4685d942efec0ce5db696bc68526fd435402203864d9fa551095480fa318c6a8df41a7e1cb460cba89e6bdac11832813377eb8012102c7052ad0594853fa286f21847c441ab4a6ac07ca6f8df0fe2ebc5f370eb4f896ffffffff02326b03000000000016001481e7764b57f088ee73afe6b75deb7546103487e470b70f000000000016001446333328b2df0e36cc7b8e503f4a8c0388de15b202483045022100b35cd4425c6662f809fea9315fd2159f59bed1dba96fe3bd8848a0a9ed128eda02205d6f0f79e83b8b90f04e065573039ca60c8b2c0badd77417756fa9857b25917c012102a9585b8af3baf07e8b1a44c15cd2df4eabd0e6f87381e548dc13750bb6b3848f0247304402204b51fb9100ded95313071deb518fa56bb82514dd799fca274c4bcf9933d835600220370a9227647989025c310516382017f8916e3d9e666d2f7912c4a5556134adac012102913a7c2cce49231f346bb406904b8868ea7099137b22c83f75a963534387d3bf00000000000100000000010594023f1b969d268dd7fddd5fef2febd7e8b1c2672fbdf67567a664f114878e700100000000f8ffffffe01d93adfe49e51dedbb6615c55fe0cf3ac3a83c7aaf3fb506bf237d17fc85100100000000fcffffffe06458ffd434a467b522f00b0f2025c395667b85a391996733f931410683e44b0100000000fdffffffc7e3c2d42d8c0d3d0a60e06298c8fe6ee65fc85075163aeb0d6ac4505145453e0100000000feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40900000000f7ffffff02f0490200000000001976a9148c0d33d52d8d4ac1a7e6e0e17a28ca48bcd3809688acde0a000000000000160014d0646cc47c10e97bf4b2175deb75ae696576e5af0247304402203f789690be658a1290942851f54221180b9869623999fe225f70cef2ff2cf70802207e0f8b1e34d9fa95abe944a64c73775b716e696ef7478b62d080956347ddd8120121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402205615abcc2c06ad11059e983eb51be217a2e6c53330ac2fe7a3aafb7ae9cb369a02205e9c9a2325ab215f0cb36b41b7a7937e64496e590eea2006c2319ca92457d1df0121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402200d1dd29b88f472600e793387572deb97f03a8848118c42276bfb432548bc9df602207699ddc639ec238116f870179c7b86b981d88819b16df191134f8e150258c5580121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402203d500a31ef66c79f371334abc3b633520d6d4e85de7851f7ccc27faec7e9f202022075f0c42fdee48ad26e6d6c013f175fb4fd989e208cce19ba9d9a5435f8cc656c0121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402202343d6566fa63e2a14f48d778f63b8bb1233b8324cfd0e4e14f1187f6b4d02c20220036bbd8fbe1cbbd4700942c1c376874b6e9a1a2c589b6f9198b7fc75ba4991d80121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda100000000010000000001041a46d143f9a23ba39a9930cae2c7bae681018147b7479f2818fed457c6d1c1dd01000000171600140236917da4958f040cf0b2ff2be61b6ebf2513b7ffffffff3045106e3d72164d8ecc4e11d1869c22119d66620622c7f36211d4662c6438d20100000017160014fa7b542a466e14a4afd985733c5c73453662cc13ffffffffa0258a93c8ff9575d5b24be0c369274f9611d9c139669b564422406613e4f6a90000000000ffffffffc06f4042f275c5d475ff87f6675f447351051da0d8bc91d06798beb857f853010000000017160014fa7b542a466e14a4afd985733c5c73453662cc13ffffffff02941d2f00000000001600142b594fd0de045a9aa4753f5a5ba8dda7d5e25f1cc0ab7f3c000000001976a91484f189286076db7521f49c91de28e0d04ee2b60788ac02483045022100ced81c01471a687f10dac006ed87dbc8abef0dea3fd4635766acf88dd45c82e40220132738d40a9cf4a9f48cec85f210264e0953f1e8dbe4dd46bc86766f8609b25801210275e1a36e918cd4ddd8ceb1b35e7c042054d2b69de3ef148d436c234c64425fb5024730440220519d40f982073217b848d02abbce61fc194c25cf5c7fe0743f18afb97945c4200220735e075b021d1bf82284ae52a0b949e28bc3f80976b4fffc2bdf00f7bdc26e550121026fae007849b858de1f1420192a989097c2de112e59733ec4b5282dd075eef03302483045022100b559c9bc0edae4bec9efaf359f6841f01d378c87aec17310d378261379e95fca022028e781b407e60f97be61f4256b81c9a0ddd0f68dff1712773a35a952516e6c1e0121036eb72fc9a5d566d580d886e89461c5bd628afebace91adbb5af28d3d4312b1180247304402201d3c0aa8d0f9682d4eb9c39a2bd68d7835296f6c0826cf4752bce832d75aa409022064aa7b29e8af5ae15829b1e90b5c3542e8edae156a05f137f2c20570866b536e0121026fae007849b858de1f1420192a989097c2de112e59733ec4b5282dd075eef0330000000001000000000102069dd6960f92226d1870a1240331c1b9e43438cb9886bcfb91ee06620f6305961300000000ffffffffc758280bb59037a094bbe3beef1675be4d54b14642e66a3685b6dfae0948dbea0000000000ffffffff019c7a4b0200000000160014d972a9bf36795c0c1ddd2f7ad7f5d4ca27d92891024730440220761953752982661ba80fd4f563a8f55132824c710f8e36de5b5fee405a6fd16d02206e4dcca3632fee763431b0458c690b701530affdd616f23180f95d16f6013b7e012103b54aec316c10695d9bbd542ee3b211ff7a364b3752423ff78bb48c74a2c2b37102463043021f54858b78644b8054749c716ec569f69ec1e6cac52116a43c5ded595be82b580220328414ddf5e9a82c561ce0bd17d97b608aa3ace44a05acd41fd88cb0ca5d4e6e012103b54aec316c10695d9bbd542ee3b211ff7a364b3752423ff78bb48c74a2c2b371000000000100000000010235fd03f99e8047707c647d597ebc3ecb3140a2cc735928266c1d87b356ad3b2d0100000000fffffffff5078d3c45e2a325087b267185deeddb771d95b1042a566d141768ec2e002b530000000000ffffffff0115a8c302000000001976a91465bd2b564a5659a65abc13611f01dc6c5189e26788ac02483045022100abc38b23a1da97a0dbbc0c15ed1b3b8f84fd9c7c01d2ba6019eb50c7c6141cd502203bdc50d2ae452d4b630c7a5ef3cd9acad6ccf00e2dd18011d1b667d4365eca870121024cd0954cba7b8d3c7fa0519c608e04da7bb0e0c53d23c473b6d02fddbf82780b02483045022100d70a05ee2f073ba1929ea00cd684169a0fc2002f02faff905b06249c7c6b5f500220478e763a41acae9321116e058b93db9d690d205001326da8b45c8a22174197350121024cd0954cba7b8d3c7fa0519c608e04da7bb0e0c53d23c473b6d02fddbf82780b000000000100000001ea6a566db396cb5c6e1d208d955a9e1ba762bbe54d0921a7b5fd863637d6f3db210000006a47304402206e7f1137e4020afb79fcd43263aa30685618bddadd3f13323c75d83edf3c492402202ed74b45994c238be83b202bff87df5b59c0544b7f2dfd222e0ff1e4493858d50121021a02bac634b94b72480237aa25683b228864a42c1df34fbbe9637da98e56806dffffffff02e4b91000000000001976a91471cf466c76538270eccfc461ca45184215dce0c788acc0b12100000000001976a9146550b36f8fa4c48c5549e03632116ca9b8571bd188ac00000000020000000001023a1aeb9ea6514d4ab0275a874a61b84e8cb4f37294c193565b0c4c6c25262b810000000000ffffffffc16f53fc8c1ab7b69ff005c22e61a5c99deb8f24d20d5543a9beb0a9a3621a21010000006a47304402202179c99b3066b4f7069c642e43db7fc5ff79acd37c192c5d991980a86c633de4022041ecf2d764db0a11e771a37afe0a97ee195a0e1d641936e6dd047f3e30ff2601012102716ded4b074feaa22a13fd1825dada6a7a11d11dad1165c2eacce3475afc435dffffffff0233ee000000000000160014f6c5b14c03b96d7d7026787ef59d2fbee16ad93ee4b12100000000001976a914e3a6f2bb96b32ae2b0e1a1d1a1ac8b64b1d433d688ac0247304402201a27ffbfe9757a49b5b827b220ac293cc0edd81e9589eb321e139aa263432bfd02203bccccec961ed9de45b7a710efe9e72b2b3e9b0976fad31888aff21ece61b68e0121021edd7e8945e2c67d4fd8c47bccb94395ced90db681e9d997fed9ab07cdea756a0000000000020000000001033d404902a662ec2db32d2cd30d2f35de47571926e9e9868299cd8c6f66ace7d7040000001716001424ef1621a1b4f8e998612c65bd56742bbed63565ffffffff819b68a33db70a550c69d82a9a70c25cbfa6e1de48ea8d87a56b1e1c1efa46f21e00000000ffffffffd94661a4b259dac09ca25c87f15ec23c9b510c6aa757a381d2cfb92e1b01db9f0000000000ffffffff1a406e0600000000001976a91441af2b9a47b40f51b2452454e4ae3c4622fc206488ac02fa0900000000001976a9149ba23207a52e01f73097c019c63a6ef6ac0fc2f888ac71600300000000001600149f695a371f5e5e972ad9b589f1c46e21a634fce4601904000000000017a914fffb05d3ecdee1aa9c386a6605657e83ccc10761876cda0100000000001600142d2317782d547634e7cc4ed05c546e8b8ba6e667d07203000000000017a914307174eb95e98c1787839007fb68bbd710a68e11873f7d00000000000017a91442f8a625aad997e102154a97731996cedfd42a0a8787790200000000001976a914573d7eb05730a3ac586c64811e821d67fc4ae4aa88acd6c5e90200000000160014fb3600c8a5ec656ced25d6ce3b5a330c87580b465f6f03000000000017a914975e048181d170e6855b2ff19ada364bc7736aec87b3fb010000000000160014e13f6e758cd1abf8d8bc1acc0ea459775da63c79f9750300000000001976a914fd3a61b74d44eabe0ef6aec51ebfa0c5ca647fb188ac7c9a0900000000001976a914246d7c4a05c34a45aa576581bbc49239e682af5088acf79c400000000000160014830cf5531e49b7cb91a99160806169caabd2dc2a79da00000000000017a914e927967471461449b5856fcfe690d159827875a58706c01d00000000001976a914fe7f1ea30b55fe222ce105a87f81391564e6d8d888acf87c24000000000017a914dddb9a377d000add5ba91c629b1e0d2eaec5cea187a465060000000000160014584a79de734b23c8f405aec2ce32f56de91a287c204e00000000000016001477dd101237dd247072b5651b135e8ce7d5a2d32d48770d00000000001976a914e37aac6fb5f851aaf0dc50c22893c28ca1e1c32988acda9906000000000017a9147b4a25f0203fb72ee650532d90f309d822807d3787804342000000000016001411fd0b1eec216ef9b66ae2e9d48dc2eca90e63fd278317000000000017a914672b48fb973a51105af1db58c8b0f19d3549908a8707050000000000001976a91447cb4999bc772c8ec5361b345da3155626dc92ac88ac73480000000000001976a914fb94e3c7a6031ad6beeaaaa34586c0d6c07f7b0c88ac6a7d00000000000017a9140d350d29579f9cef5ab00a613fe3765b89807cd987024730440220601fee99fc2a8bdb97e60f37ce08a57d5a65df684c90a325268fc91b074cd65402207511547569be9c0dc8e2c0f668711bbcb69506b299946875c702102c2e37ee53012102b5fec666acc7aad96c138d1e2772a4dde0c994cdaaf9f83d7e055c4454941342024730440220486c914b7fbcf71917c0a51842309e9034513e56339e56ff247c471fee72cba502204d1125cdfccc6ec0ee1cdc669393d637b2711b372897ed62da3add9a87d4e153012103a9c65edc087c04f84c61bf0812aad95c1a9e84dcd4acc62704cddd08759c6e4a024730440220613c28e5a2a93beac5cd82470e7ee50b3ca28f966dd1e14141f7741da4af1a5602205cdb12f143da42ba59f8e25a6f9984154fd60f8322351943c59aa440567c517d012103be0ac5fdfb8ad615deb1da10711949d7916a405af310e841c927babbdf01d6f6000000000200000000010137150aedff7065509f8951091dfe19b20fd28b5b7e523b55d35fe1e36d6c1c150800000000fdffffff01d2ade90200000000160014d40094e95f72cbead21b48d6199b15df0be7d79d02473044022074dbe26443b8c3d422582fbc11654a20c3434c678fb574e7edd6ba931f5f2f1e02200e3c0cea3b040483e0738a7334c9beae7f7cb91735e33bbd3b74a5705136abe7012102cada3de5dc2373a32db0b4ea7b2cbe9791aaa4cd7625ca0b6636a47b7114969600000000010000000237150aedff7065509f8951091dfe19b20fd28b5b7e523b55d35fe1e36d6c1c150c0000006a4730440220732504d8861f30e94d860706e3a4ab3b1742a626f5253ba44ef19d088adb3c2c02206020dfc55272f7c94b9c430fbeb6f0c7522c433b297ee266ccbf7bfd1a2ff6ba0121022594279f49228f8f098afe5500569bb533a60c36a8659bc12ea36da44625edb9ffffffff0a30e5d41321aed592f9453ffcf410153ae037ff7ebf2016a51792a875b2317f000000006b483045022100e4240db318826ca2b436e0c6031dc0f17f8b3ca8cbc6103ca064ddafe53a6ef0022022b56d0b42c4a273cf87ff58f5186553954f3a8cf25d1a94a2d4b90c15a401c2012102c49c98d02dd1c2d0fcd2da69cfd3fccbdc0ab92cbe483aa17e6c331b7a81de6dffffffff02120c0000000000001976a91455752650042364aa938669f6f60744fa3a54e53288ac37220a00000000001976a914a61498adca971b69c18fb6a2baeb34e3b627479788ac0000000002000000000103b3796ac235bd62fa4752b19e59d149161f13287d6a7a43ea0c3e552e877ee9a20000000000ffffffff78eea2b0b6e9580acc2c90c45bde6f4e7863ec3672e21d703b3ad58840e964890000000000ffffffff7ed317b95542eed247206b934f6b9b34968190b0ae157576d3866361335f16960000000000ffffffff74195801000000000017a914acd6a309796a1e5d68fb26ecc2f46af31ced971687945e43000000000017a914ffe1e14f16af847d3db0d1a5e92a8148dd081f7d87864a27000000000017a914f188867ac97e110c83bbf5509bbe746741d0ddb0874c1b0a000000000017a914f45cf47bea924f60ff45faa5d2ec9a33ccaf8f6087b99906000000000017a9143618be53ea4ac24f398470637cb535ef8c2dbc3487ef003b00000000001976a9140aeaa5efc680a0c3227a1862a3b1669a27c0f56d88acb9a30100000000001600149536a0fd566d4548480730ec93a66be7032df148796f0300000000001600146fabced1bf698af0ad0cd4dfb2f32a265447156e2a7b1700000000001976a9146f7eb0b9a3faf80a0b025c47dd6c031d52b74e5788ace3e709000000000017a914f2fb464cef95efe17d46ec4f3935d233597b175087c35d03000000000017a914e1bed0917817955e4484c6f1895fe8299cc40cac8745cd01000000000017a914cb5bc2b6268795e4871509c6b45ab815512d87f887f0ae060000000000160014d69e57ff78832357aa0b6739fcc81ac0320b8e06b4cb07000000000017a914b4242707b5b0da3db6474e5e728eec886bf712e3871f78030000000000160014116d175a840f749aba87dbc85b5fd1b71cbec38df20c0500000000001976a91475ce5c4b5d1719eeef8bbd4e54c9c2a05bfb080888ace7481a0000000000160014edbec46b0845272738c5c5814c4182fed55c0cb819760d000000000017a914f3dd4727bc03e118da2985cec286e3b6ff53647f87fc971000000000001976a91483d1794f458855c162fee06e92c29660b899e80688ac91340400000000001600143f86e94d0827320053aea2f14860f5d1348a60459b7b01000000000017a914cdbfe058ba5ba641803bd8c13c0a2befcfc0c91287cbb22100000000001976a914a6a2f0745f46a7a47136d53177d6f50297864e5488acb3ce00000000000017a914b7aee1658aa8fdbe31c54cb18ae60192a546bc4187247442000000000017a914b3e2ab546933cd773d595a9eabd52f82c93fc80787b9b303000000000017a914d915e0b148659f8aaaa7db0cd022f7cebaccaa98878a050200000000001600141b8db5ee1adf1a9ccafe98d305d3f74826eee06d46221300000000001976a914f88dda43d603fbd967204297c713ef827c66772288ac60af0100000000001976a914e7bb57aa3baa39de7533c7b2e4efd3ae2d78dc1288acea551805000000001600145d00c1f462acb91179deb0aa888c0a8379812912a2a60000000000001976a914304b6d853d940de8d8cfc0c0623a86ec619ab56388ac71c70400000000001976a914c860a7bef3de7d6ab3a357bace4410a73970b8cb88acff962900000000001976a9143f9f77b8fd943e3795bafa788319e0b4da07ed7288ac41e000000000000017a914501ca049f7ed4b20347c45464451ba8b4b0aa58787c8554200000000001600144d0101431fd9a0db28f059e85e1b1af5bd000d4ed1f90000000000001976a914fad0b40fec29e4a2d4dad003b13797663c01e42088ac893601000000000017a914fd1ddafe934d191ad8ffd2efd2541252fb85c13687c00d05000000000017a914ef0952c428133c911aec1ee6d3ed7e34517f552187d34e03000000000017a9144056142c319bff340102f8519731e510b2eaab6d870fa00200000000001976a914154d54bafdd6a22492b99848f83a340d95f6ff3788ac562501000000000016001471209716bddeb681d1eee2eeb3df38bcb89e403536ce0600000000001976a914e269ef62fa18e7da936d90ec6bc93fd1333a8e2a88ac340d0500000000001600144d97142f007c528e2b7554ffd4947bbb6ca81aa766f104000000000017a9149103ab01708a53430cc7b6a335801e6c80cc649d8703590100000000001976a9146afb06700b0aa7a014fd810cc91faeb0c69e920288ac3f660800000000001976a914b4638797a4623b36227e5941aef889fc10c03fff88ace2830100000000001976a91427dcab465d30f9ae21f306113751fa28f8e8757888acb07502000000000017a9140c5b7aefa7e70d451a0dc068d6e3e8c2c8b2920c8715af01000000000017a914bcb50eaf29b51a95b47008ffa6d84def56ce0f418744891000000000001600147a0ec4f3360c06f2785fc93b760c913b7b1109ff59c318000000000017a914ddebc1b2457bbe2891b3dbc80d7d2e4bae67c4b88760d803000000000017a914309fd748732e0777a00e5e3a032017cd00decf1d87601823000000000017a9141e6432239138b3e2fc5984f8dd9ded62954807578700d430000000000017a914db66b2880869e49f79d849e91be7a12be0b126bf87476343000000000017a9147c1d3c1daf99fb77011022f8026500c722e6e3068798690200000000001976a914b9f3034be3ab025c6bc72ec9b59a3d268093c0f188acc3a201000000000017a91446137afa9dfc1bb361a0d9dff63c191316b89a45873d8f0b00000000001976a914eaa3b7781a276a89c150892a77141c24850d763e88ac976b08000000000017a914fce89de3a023d9f34cc77a9fc22d416b9b31808787265600000000000016001454a55890cb2a7e3ca8894f3c288be0d502e1786b404d03000000000017a914e2a9787ef631592887f439fabfa7c9278f9f19dc87e1760100000000001976a91434933bc556f6b2470445743b4852ff9632a0899188ac6b0202000000000017a9146e02f88d54e04d07f8f9f874d83e328e20e12362874f5001000000000017a914773e82ac6f99fb258e0abed46d4a8b18ee4f1ed3876a0c08000000000017a9145c113d7feba3815b38a919001ab4854885c2bf858720d9100000000000160014776794ae25a6160009c737eed6b60e1979f1dfaa6e3d1900000000001976a914efcd7f28efa0e6c30445b2105df27b5727d70b4188ac4d480300000000001976a9142cecfeb624edd39a42196f89faea9091cd8aed5388ac88fa140000000000160014150e50c0eb28680038a326617cc1a20de29f7e5727b50000000000001976a91489483f2da74afc74a21ebcfaa9ab6c4acbd7560788ac585d030000000000160014d5b549a4c746afa962d440ca3ef5304f37cc1ba6f3e501000000000017a9148e7d6a84087d6c02a9140f15d39bdf2ffca062688786f004000000000017a914ccc1ce4ab936c8303a0f9f625d8e429322cc9a5387fec209000000000017a9140444bf001ac71cc4e34c5c7cb06c9a8de9ed8c408715a40e00000000001976a9145f3755aee56b2209fc86cac50384081368db9cb988ac0b4e03000000000017a914dc119f575c6a898e906e00fe96cfbb32ad9cc6d287e25c03000000000017a914cec75ae5ed4f5c5fc88eec9ebb1acd3e12d27dfe87694e04000000000017a914dc3260e5ba3127d2102c4b6e54b05f81718cc7d78744b2310000000000160014f7dce399fb7c6acb306782c36377bde7cb4e02c8f5e30e00000000001976a91431d74daa3bdd2fafff6efd75112a2b54c05ce40988acae5801000000000017a914dd3636554c4e3e95d83e22954bc63c09f5af820e873ef307000000000017a914b7f5d9e1f2e3c0936d74b5ba36eed76cb064eee187d0dd06000000000017a9140b42260fa01aa17b1dd10652585066db42d9059c8710320d000000000017a914d0cb146bf221e3499a2dd76446ebeb3ea3258f7787c4bf0a000000000017a9142e97f1f944298433b65becec4a92ff8b008207a3874f6f06000000000017a91477bfcfa7f9c07ae2f5c77595edea947d29e4dde187b12d01000000000017a914dfafdf37150d24491a941a219aee3f05221b2efd874d4d03000000000017a914a30e503afe92f77726fdf2c1c4cc2016bfb0d3d2873dbe06000000000017a91485301501a1acf575bc73866c7d90b1ef964f860587dc4703000000000016001481c8bc153db4830c59c9d8e90a0ae4ecbe3b3b6e82ac0000000000001976a914fe2245ffaa14d7b7bdebb89d4b59dfd4e89046bb88ac352f0300000000001976a9147fdc9d8f799c8965154c13388d884e6e92eda66588ac15ee0500000000001976a914fcf18685fa0a6a674f2cb7dfa1f3670c98e874df88ac9ba41c000000000017a9147a9b7088a236335c5052c0bc1a8a575de50c1a56876c02210000000000160014fa1486498520e2df0dedec523b667c9d9bbb826c71301200000000001976a914ee7d9bac899dbc5419435d11ff40d8ef17b6555488ac566b08000000000017a9143c34d767345c41286a06e14db51351c39a55790b8769db0100000000001976a91482ef12089d3662c5189a022d0b301a0a4188c18b88ac974403000000000017a914af7122467284498f3814fceb9ccaa18c969065408719b102000000000017a914983bd103f7489776b5fe71e8f8c3cdc44a93cc2787c9020100000000001976a91417aeb689d0ab053fcee6c7f17cb06284b1837ea188ac59132100000000001976a9143c8ac776254953cf502be476c79f04785d3abfb588ac045f030000000000160014c4eb8ffce1de2b695b7277253b3e7318d9ab36c0898301000000000017a9141c13177a1ac3d53686da07360939620faabb5c4187739d0100000000001600145b5ac06d383a812405edd3b16ab0caf6d5112997f7cf10000000000017a914797b4344b43caa16f753edb96cd7e1cc224b9ebf87ea940e000000000017a914f07a48d90901b0fdb20f1d6ec787cc2a56dada31878c9d0100000000001976a914d7bc56e94cce3c9df12e6034fca8b264e056451088ac41b40100000000001976a914e058417770d2b0875b46c448e681404fad37548f88ac434903000000000017a9140d39c52f482e14845e5f9a7f3b15efcebc2f9eeb8711a70300000000001976a9142f9a9be8c53c56d752b08ab4ec068bb102943abb88ac10870200000000001976a914ed9ae106eefd4188ddce9813890f317186faeb6388acd46b00000000000017a914e09fe01f334347987677bb6b7d3d1df153cc606d87eb5503000000000017a914d0c1483c29a3b6e0bb22379a7e64117beba960188749af0100000000001976a9149f42f5533d4ed23279b030f40e799695c9ee624688aca08601000000000017a914a40a836665d8463e5aab4acc342ad8de5eb8983987e81800000000000017a9146105c5060c6c3c6f0ddd899d178ca0e3e99b4d54870247304402204a0a5830a08bd2d583e24808290372e0d577557509474221a2913a2f907ba7d00220652f651f938fce481925d5f1cbe29b68622775fe8155f0fd0c293c1baeeb019d012102183f174e75051fe085ab46348f67856114edc41a00684f41afb236f80c59d0bd02473044022005ab5db0512ab3fd4c2cbf332ef8a429083efccf6c7f9de8936c7f3dd7ab8ed9022048541bb4eb96615d7f868444240fd75a3f3ced70b2b968a39e973fe1c53088a5012102048cadea410986df875da30a58a2d09c3980b6850b6e900173ebb8681469e2d10247304402200b34b2c3508896615afa19bd8bcdd7ee91f378728ff093f49138782537571efb02206b1eccb5616309cca92d22b5de338a2f1cbbb0cb1abd93732551850d375eed04012102394b45db256d71ec91e31990f45ed3f7b2b7a28d4268b9cb732df656bf303a9f00000000020000000001016b1223de98887238ae70cf055592942c14eb3c69411d1fcb8edff4ed9a77f92a1c00000000fdffffff016243180500000000160014d34aaf8728443a047cabd21abf356706964b389502473044022066f88aa6b179792fd4b7ece74aab8327462a93fff352c9b5556b3c32946eeb3f02205776d456e690e2f58133716b02960d2428048c35763a13e322ae7a4a7b017420012102af9a967a35951927bcd2467bba9478ceaa55a00a05d5ced0df5e60ef87e2b16e0000000002000000016b1223de98887238ae70cf055592942c14eb3c69411d1fcb8edff4ed9a77f92a050000006b483045022100a3ec641fa68042b67a13cf4195d5159d540541af6e2b1943a85b629c521cd61202207d9cdb89b26fc38082da0d2f40453c7de7e73cdffce7a869d568d5268eaf1e6b012102eecfb727b6f358a2dfd0015b4ccd47c1547ae6fa0d758ea4bca71b541e9fd038ffffffff0162ec3a000000000017a9144b4e4c6bdeb0d8c70c9ac99766cc6a64167ad4888700000000020000000001019b1941459e704f37236308a3d384f503ef23fd53aaa03e836e94af924a126ed3000000001716001402ded4659cbd7531c418d2ec1dc3be1414ce2836feffffff025fa36e080000000017a914ebebf2773483c996e0101d0ffb33d2e60badfda98750a06e00000000001976a914a6b706f62ccd53c89b2e52247e9a60ccd776383688ac024830450221009c2e12b4fbf7b23944329e880b346d170683c2bf8f3483eedac8cb0aab706ce402200b774f4b9e608e30969f0bb34a796ebbc2f6c1616898f01d3fcb5b9639651c8e01210308c1a114d3b3ad076b364d677c008b6cf8bf706c33aaaaed1a6899b6df55f7c247a00a0001000000000101ec49cc91767830e32894faee577a341229e687ab38ecf7cd1f52a4264139f2fd0000000000fdffffff02fe99e605000000001600147c1333e6055b83ab94932ce31b68b2b1543ac3de40420f0000000000160014a645a1c54b29f2cf50465f570293923566fc3c6102473044022079cde8fca40f94c4e67f0167a65f1b84d7120cbffd5b01566714b781e93a935e02207e30ec3104df7da739ee5476cc18484ea5dcb83a5f90699e10f20825094c01dc0121039e6bcefef93724767203efdce4037787b9c68ca113efa012ee7e8d5f3dd200ca00000000010000000001011f54aed059f06add709885b933d83624b1b96eb48664dfb0b90749f0404c007e590000001716001445cd2acfa16f56f5d16e4ae6a25ef96b66d68cf7ffffffff029a572e000000000017a914232fde864f5ec47de5b4d5db68e533b01bd14b7387034104000000000017a914c55507369e68a9387d320afdc890f9d7b40c5e028702483045022100c062839259fbc24f841566bb55a25f991809569408ed6a5f01b79b893f351e2b0220370f54aa3d19eb6f17e3b4975f1e79b78221647dab0db97899f8b526228c6291012103fbda2c8ab25769b6bfa78d46108742acbbf70f9254808aa66a6dcd66c03210210000000001000000000102c013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c3043000000171600149e6a5e5dcd35da060e906a0c8d650d19f3cdb657ffffffff80fe3167edf09968ec13999074734587dc5f95575950d2e7e6ccd804baca28f80100000017160014a501c3ba0c39b4b82a66271f08386e21a46fe8c8ffffffff023e4f4300000000001600143140dde2473f2b889b7cee4a6917c74283c93635397c40000000000017a914ab347ab2415dd3b9be23e0310c3c69c3cbcb63c28702483045022100afcd64c26e061ce838dbfe8044d19b8275be95b17517485611d0d3faf532c82b0220506fc27bec38037aa1a856fdaf530a74a4e6acbde92d8b32f904be6818a5000f012103cf615567f120068a8375b011e41c019eed5cd2f45524ec802ade59c5b6b06b640247304402203102a4f44ab10f22641bc9de241ff46eb9fa236bec0a6ca7466eabe8119f0cb6022018e57dc888f40d5bc9399a6c35fdb68a42de4847c27be1ac8a95e809117d32410121029c59507576e7ca75738bb4266f73025464f7033d1eafd314b021ec1bf1bfa02e000000000100000001c238cb39f5fbaa0eaa95e9fd4915d76bf5985cc45656815654bf67416bd2ec37000000006b483045022100cd7439187c52b07b1fce2d6211edb5d7fb3e3c9df51b2c3a09a3e7e3a9e7957602206e4fd96608bf6ce9c59da64240a5971d4d5868df7fe6ee5d9c59bb048e1ca75401210339efb8d68f458dd37818ed747a4b6e455303fc5cd999b7b99e516cf111aa7c66ffffffff0261b80600000000001976a91485032fb31d52d4a8a38d3b4129adb1af01ed412f88ac36c50800000000001976a91499359da059f8437ae8be882299d9efa0e249bcb188ac000000000100000000010149ecbe78d9286f12b4839fd1618aeda9ea16409494212925c94104a0ceff6c080100000000000000000249e20400000000001976a91403f454c6698a5d29172d5b3ce48a503dc981ed0988aca5dc04000000000016001470a8b701f97f97624bfe4c80831dec4bbe0fdd6e0247304402207c74efa98a9dd6fe98e9fa878ac7b9502d26e3e5c71e00ea64828eebb088b1ea02207cbbcbcc3942865e6b7147d04023e097e532fe3876e5151f036c1aad5b73587a0121039b4d9ee82f60fa3caf05e1e8f9668856244d4c3397d4bd479e909081603253490000000001000000000102e2d56a9b703202a28b2ae4133a31a0af6d01799f232b633c5d6949d19eb9c2660000000000ffffffff6684ace4c2755cd1ab705f90bf35835b5179303cf6a0d9aa0b159aa65ab229bd000000001716001461a3c348e1916bd6790f8cab95aa6ee8d38d8efdffffffff0232130000000000001600140b69a4ed0a5e0136492f9b376d23a663b419e4bcbafc04000000000017a91472f2961ba8995dec50f6203d28ec01e0093c2ef98702483045022100f866d091fb5dfebd6e541eb4a2bdaca143de69b0b83b0c0f7fda1ae31a4b7b6302204f0a926d0e0e2405d44144b2750fb634a2f5010d2ec88de31e5d226f0853e7ca0121035ad9fcadc808315cc2e3a86b4e554ad03e065e36c336ab8fa1abe02eb2ce22040247304402202fe231424e5e4e3b25638de6b57e35ade15615c24627cb7e918e7fd3672a3148022070e467228269cdd98ba4b0252b17bddc6c1dd0a24d55626b6bc5019f6453c70e01210200398252d7893bbffffe30744b123588c7847cdf94910360a7ccb55ed3238af60000000001000000000101ab55cbcbce4cfcd94c941c3ab2f1c6802951ab0c73f3a3b63929f38f4757a3f50300000000ffffffff02805700000000000017a91459a587de0e2fc9a9b9cc582bbb5552a852cd5eeb87c8f51700000000001600141221963aa6a9d8b46d870d55e8c70803dadc56be02473044022049c82055c7e33aa93ac266db272b00a5c1fbfdbcce2a286b07bb6f37dc3bb9b00220116defafa9b8841716d28ecfbb51b2eb877d358607683776ebdb70ef818edbbb012102148141085715fadad2d08ca6e4119f7e530d1c1bbe7e272c14e4ce795f643666000000000100000000010197c9efd00a85f581afb6c60044c709a1ff1ece991443000b197e8926425a81a50100000000feffffff0175b20300000000001976a914710af2fbd0a0ef44bb002cbfce533f79a69bc64188ac0247304402203e3ef64fe203e7b18657c38300fff81900316784f77cc78da543bf1703274df4022008f9cffd2959842a1758d21c5ed7c5749c385bc49421dd0f5621ac32a0773b9a012102c5dff146c2bf02ec32e73aab17c2c4dda20ff06ae0be4aea6cfe4d08bcdcd1a400000000010000000001013aaf7785fc53118952eafaadabe1ec4e27547f017fb5d0d582a639e1783419fa360000001716001446c723c0e3456076546d728babc20ce5b1dc9fa9ffffffff0205ed03000000000017a91410c76f1632db9f71c344b076eff3b9f565d6233287162e00000000000017a9146c6bdd39888f13386c39ec6a4ffc893a1d507caa870247304402203e19d430b353cb4274e0957443d5108e3c29d8189a16f7b3bc4c4d5cbd657ccf0220682938c7a49961622dd3ef1b9441a2e719955683abd6f04934bdddf83e6cc34d012102bafa237a4398f09ea855f8076e7630102fa5630f55ba65d5b4cab671593c8d1b0000000001000000000101220ac0671924d6bf131199b18aad9c83d32cfdfc453639372bf6700c73d4f2794c00000000ffffffff011dbba7000000000017a914224b7330e6d223d62fca8b7e154277af99d963d4870247304402202a05f5952248564710d578740234caedfa05d9e9ea7d49e60842547fedabc7e10220698e299970075630dc876ae41e8afa997f595d39b2ad9a9e75584febb6f7aaf80121026c4bf64129ec69204a20390f45328b82921e418cdf731357d4fc8d0a3931beaa000000000200000000010184e81dab5ecf067dcd66adbf0670ffdd39220e3effeda193f023ee2a9263fe480100000000feffffff02a05a3200000000001976a9148b66746a03ccf962624ec15b8d99d485e167109888ac013f3c030000000016001411ed7251f12e1e66a8ad280f0b76ad3dc6083db702473044022039cf241bd672716c69379e981772bb045e8825ce43ecdd96f78517d7f0e723e702205fccaa5739369f014ddf5fa64af859ad465b17bef29b7646a7a2a1131236b9f401210278f6e667f7c2cdd075d10daae4943c94cef21ad12a8e5ebc849a5c18a331bfd800000000010000000001012972c2a22efdd5d548898c04e356e9603b5995019fbfb94972bc6595689ef1ae0900000000000000000118440300000000001976a914cecdb2185389241a4915de9f07392d9ebf5a6ff488ac02473044022100c40f077baa8ad3e903fcd27529201a8160fc246945c839c109ef4f163c348539021f0599be0daa967098111964c7203b8147cd791da90d7362d253395a90d701e7012102d3c1659d3896418789a3a43ac321530075598ee6867f009f0e2f55d6c96d1a3b0000000001000000000101d4e21b7d5ee748cdeeb9b1e5b517e98f87b5f516c432c8a496917149c84606651400000017160014277d56eea7310c82b623b43df06cca66ab0304b9ffffffff02956b05000000000017a9147d309295b5cb64d06f4fe837637db9ff04e5d1fb873e7f00000000000017a914be0356de0bbaf59e6bad962ce9255ba436e205c58702483045022100a623bc51589b5df8ee37652aa6e97fd1638163548c49328b2406bb3e4f21317f02207c8518c3678290c116592b3c7d1c9da29bff6a67e2220d6ba1497221e99ce1ee012102f6aee04f55eb89eda68e606e7af2e848e5357cbd60c028d5e6c866fea42c94be00000000010000000179d8c9209bfdf6798f919b38eb2be2b61e0a67315870a600a1f244640925bc2d010000006b483045022100e18bdddf260369240a2febcb1655f3a31fdf94de065d7e323f5ebd33753216e402200f5b8e89bea9cdda4714aad034f7ed184901ab79dc139016a40f6018c20af999012103e9a458eeae55b8c9a279d518b40ed197fbeccfda573af7dfdefd7ab8a87f5c65ffffffff0225b50000000000001976a914c8845174f90940358299ff7c1f2936beef4870e188ace1444a00000000001976a9144517e5ac5d05dfbad1b08acf11a0911867af23a788ac000000000100000000010252fb60458958b4bf9948457abb5ee30460d5b4de95175d8de6dd38eb8a524a6b0000000000ffffffffdc3107480d32339667081628d1f81758f5ac3daa34b40c31925f69f94d3e4df7ae100000171600143fc031528e3ab62475a0088fef5a2a6b7e2c6575ffffffff026b220000000000001600146e7a17ec17c91c5ed53f30ccb81eaffa4094a98220a10700000000001976a9140bcc40a41d002c702377cb022e89e06449aa795a88ac02483045022100c85a80578c9ffe9915c53166f5bbe82ba721a8e2abf91124a7555660c9c5e852022078db7207161f4506b4d9cbcd5df29a135b82ce79289c4a066a5fb166db5d7264012102a51e60fa3dc82412b365bec2339cd6a6b8fce04aafab3354aa7fa2c29f32e1f602483045022100a3626275b5113ccc69c4f63a42545244dce60aa4b8ddeeccb3279fef85795300022011e1339298184dedff46c891d7448a58f9e139cce7043deeb057e074b2cc1c30012103476df51e462452a84075d046ccf7464bb6655497ef28c503e5001bb2a011b5cc00000000010000000001014f16970be26d73717e2cae290cfd6b100e5af82d0d52393c81bee197dae2393e0100000017160014f3071e352e6cdbb286c5984226d4bae1b87f423b000000000148d6f5050000000017a9145769c2993f4e5ce65b9fb8d2cfcc32d89a3f581f8702483045022100a48041bf3ec25ce598d296ef5a8921b87ee0042ab270aff262c0d93149258b2702206b3651ce37ba5cdd8bb4878d1f57d893e26164addc9e113c5ee77b3a59fa6d140121027629394a1212223c47912a042415f6acd633276f6f6e04908cf482d0b7a470cb0000000001000000000105301d898024fe4eb4d7ac3c427ed2b8a814b8aa570e7fe837072e4b1d4fda35d2280000001716001499849c5268aa56bcc926a84af89aea7503346944ffffffffc7c240b023e36667f0a27b89165f55b241947e90d81727f2714cc2d269447838140000001716001445b12dae29cf759d15da6ee780cad78b4c8ed942ffffffff006a1535540bb38d089cbb74855c9b7bfa16dfe88aff60332c033e8845126c1a0f0000001716001421baec96b444afb4fa5c4628c03dbf9df138c731ffffffffb4e318ab8735c8c26ea608e86c8c6be95294a07b6a57d304d3c66edd6dc491ac1700000017160014466bc3d31ffa5ffa811c9c767ed4704ff7b19dc4ffffffff6c8a783ab2cbf4e8f1fde1eca7913106f4c08fb41f016d5da3cbec18da5a84711600000017160014e0e9abb26e2a45fe21f5559283a19c41be6ad885ffffffff0280f0fa0200000000160014ecd024f0d14a7381bc197c1b0a3bfe460838d1ef6df5c1010000000017a91420684134f71baca5bcd8b6eee74271fc7e8a7ce98702473044022017092cbdc51d4e9d58d18b207f6fce9f9d0c637a2d0ff5f20b80e13afc880be902206626c2de2193dab60c469977583bcfadee9213b7fa4e63dd9aede681e31328310121039bc8db590012b6b6727e0372c850499b6c8fa4aaad1e0338df035c2342c555f00247304402203b159768f73e24598e5a8adbbbb79da3c53fd397c13b9d52e125279e987f5776022067784e4c0fc16165f251eabad0357496b6efe89d37829cbf12147a18240211ae012102c36d50a06a143a93d9d3ad915b31d8f0d18aa043b14c30961a474b593e4f0a3702483045022100ebb15273ef0ff74a5107025ad7355c3def422bba3d5d64dffcc38c740c90100a022039fdffe70d3dd863bb038ee725d976e07ccf252c0150dcfba1fd8d330dab955b0121025458bb09091fae97aad20645db35a00559b94ebf632c263824028000c99241fd02483045022100d55284d1562621419238366d8952ed6efca1817b28781278e269a52b8d2da3d7022040ec89c71b896a209954aec60713674142bd2d1462f0e6e565ef8885e5884ef90121034145fada9cef3f52e5bfc74d2dd80194750f9cbbf63793bf4444516ec66c868f024830450221008a6dfa2d631e11212d3086ceb3a24ccd9f4b19cdb5c80933c01c7c137defe70002205c53f71229d78ed106384b370ad3eeddcf3f6f749a021aaccaf201066c49007d0121020902604b222dff62470f933fa417b90d7b14f91c3c4979b54da92d49721458430000000001000000000101b8e2c8943acca24043b9ab77b29eee6e382f4626cf855581213e8a708da942aa0100000000feffffff019a7b0300000000001976a914bdb86d82e3345a47332fdeb4f755257c2ccaa65a88ac024730440220451ab38dba5a0d3b62e8f320647b5b1b224e2c1488a9a8715e1e9bf361ce0bd302201c900d89749802b11a0319c7b416e5c69b1018f961a587f3e16eee5bc266430601210375c90c7fb2962b94b2dc6faf2354993292d9507ee8e4284d25e5ca5c68d3e4790000000001000000000101c1b7500fa134334500cd854d4f4b1a7f7199b6631bf79ab96067cc2cab1e47d74300000017160014109cb3dc607f8023964eaea11986a1a1c54bcb49ffffffff02fd4002000000000017a914c5d21cb16d7f2a8c8323f345b3a1f99669fae58887690400000000000017a9141055c143558305ac1a5a2cf5cfa6ca8db77f6ffd870248304502210097892aa629bb4a7eb8bbc91d565481b8cfe165a97c173dd8f1892ac407c6c0100220750e66bed8dcde4fea8e0e04118f21d3bd8a9beb79a7a50a086e2608ea11ebd501210325f6043dc9fe503da7fa0386c8924523fb2041afcc88e00ba6e04bf9dd3e0edc00000000010000000001015ca40767387e54b7782328dc337732c54a7ed13620a9d8fcce6e441fea0411ff010000001716001442760c79fb01a00ddf2639bae3c12680b8b7e646ffffffff02475903000000000017a914d25588d631dec6322a466bae3b01b4283acbdd35873b0800000000000017a9149c20563fe74ae701ac23c3902e3bff79f9b02d6e8702483045022100a9e35f21125e63536bfb0cdfafbdeef058e090fc5e2bd8e0f9dc12efc04e8a75022015f1fc5bc12b408561d7b90a615c2283e05f7013faddacb24b9c62dc08a8b51d0121038e54ac2c0b6bf961207fb823e6f0607be9242e558898c208e4f2b073420aa3ec00000000010000000001015c3de906f335760132290977215e70d74ec213e48110fde9022cfd529feafeee01000000171600143d442d11bde6593e40e2d4ad9fe9b8fc515c4a63ffffffff02a54105000000000017a914391e5ea508c55a34188bd4b0a8acc5b9d256933a87762200000000000017a9140da334e7627425e547e50d93b9838404f9ff2db5870247304402204dc97c732a2648b56e749ed940865576327f8f844c7ce3fc572abc15f29a08610220547da9a44a01afa1f1d522d3433fa141f038f6c73d53b7479fc07f13215f4ffa0121024ce5eaa835045c98589be06dadb3fe16c99fb20a7c8043a5e81501c2de4f9b2400000000020000000001019c1ae4590637360a0e622ecfc70d8415f442ec7ceddfcece4f462435f62fd9230100000000ffffffff02f00a11000000000016001470023b13bfb0436885f11d5b683574e9f83a6a252eaf01000000000017a914d154dc3a3dd1eb53832a25851e874ed772aa2e0087024830450221009f463ee303ab8ed3ffd8e77396bd2e9381236b81761b5b9b8f50bfc944f1760902202505d74644f9de1db21f6d64a8a6bc79f7cc9ff2d3718102126fa21858363a4c012103d695dca3a9fb93f18f34b5b4a3b86fe770d92fdb9324fd76feecc94e04a796010000000002000000000101466db7dd3c3314f067f605c846bfa5a3dcf2a615312862667e2a0c7f2465d6a10200000000fdffffff04d0e64300000000001976a914b7dc8588ecd41fbc67080397138e70b7bb27d00388ac9a364a00000000001976a914b816d2b9687d767b0501c461a89aa407156a6e5d88acc0d40100000000001976a914758c269b925d45b6d9f38a6ab70a04944a7bb44e88ac9d15d7380000000016001419cb5231f64b7364a0a6991ec5910c8f0d4b69590247304402205a69e55359818d66d1c7748cf0399b0625a8a96e5a21f3e080b1fe2f44356b07022059e4e8bfb82f8d67e25427c7f76d0a3b37d601865eb366e65769568848950dde012103ff7bbcdb27547c34034b8224b43e4d22f4021e941e46bfeb7cefabb6e7d963fb40a00a0001000000000101b0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b259270000001716001410720482c51a73668e2df9bdecca39a5930d8b48ffffffff0216e207000000000017a914e0cc323b31c321dc8247f18ac6d931d6267a83d4871b0800000000000017a9142654240b323666ff1eef8738b5b1de44aab4d7428702473044022007b53e034d514d2c439a8ace5fe757afd7be52762f628cfe06c07d541d37feca022008e686240526743c4740dcb7fdb6bc75cbbd6f774380cc06415d88c990de00f20121029448a41e804dd0e85c700193e81c438525b7ef0d8340541b727ab505fcd1f97d00000000010000000001017508cf98127f1c3e9d299e57ca5c96aece586884bce389862aa84b983fbfa1b68e00000000ffffffff0142e80400000000001600144202fe19401a4b3febe07823fed5341feb09061602483045022100e6a5fec2a8b242b3ffe916a1cfdc614e02f4889fa8b78e636cdbd205d943e57b02204640edd8ccdf2ca775027fdc7808aae131f2e9a3ec4cd0f4261d69a8c03e2f7701210361538bc26f5d443808f3aebf37cc039a97d94b4bd86f4f2da4d1584854057f500000000001000000000101c013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c30070000001716001477b1947d5fde62968174c148f0eb23ef2aef3c09ffffffff0233f102000000000017a91419f81312def65a3d6f66d2981f156ee45a0d3003876f0200000000000017a9142d885eec7ca99a25dc17cced7417876194a39e3a87024830450221009fca9a51605de68ddb29b00e1b6b1a7c9d55ee772b1b254c40a2c4c286fa2452022078b4172679c4b66416917f13ee8c65d3567aaec5c5a75b587b1b93a0cc2d89250121028e8dec430ceab002b8e7b3da65f9d5d58345b5717b62b3cb7c465bfb4c0918250000000001000000000101fdc2a85587e61a77f83a79cc7bc071aa25f59123f0c08c3a37dc4524b1ebface0100000017160014d527a46d30539763d26faf3c19085d52acb890deffffffff02a7050000000000001600146d7264b5242cb7024422ab693623fe2e2a27aa11d9ae01000000000016001448bf5c78838ecac57c73ade4b2153af93ef72fa70248304502210097cd34c6a924be5358a854abeb643fa06e76a248028ca812b531ea02a90df51f02200c902fe493896998d0c3df7c3bf3f2a90dd2fd8abc98e7a7172bb054f3f48082012103300cc0f4c602e10e79f9f6d60be10a651501b6e42a059b0b3ed324ecd2ba2bc10000000002000000000101f494af74041ed5a3868e49d6b5103ea9c17816d8475fd7d370c7ead3c5eae3670000000017160014eb982d4da2f17b2066b65cf4851af49019cfc6d2feffffff0200290d0100000000160014a5220fac55e222190b02ce7115dcd63ca4f4386343e1b804000000001600143001662fbaf92af1d5934921f0492fcb70000f090247304402201be1b6767cb0501368d9b64ca169214dbb8e6ad5ece86011cccefee3d67e7ab102204b6ea08dd2040034be18bc153da06cd5f37eb8e142e6c995bfbf9f5c6f998aab012102de4bb734892f676e423b5d0a99e99f465e17813c7d0fe0ac3d444fdb34a7f8a247a00a00010000000001014abb24584852cdf91a6475f801493a4a29cf408b31fd93685a162014ec54ddf00400000000feffffff01ea3c0700000000001600140713f3e8245d979f92fdd2afe44f3e527747045e024730440220201009ea87f72dee09ecd3ab5bbbb201344c3a773fc03b61e8175ec25af944ea02206b8c32c400aea8a391acce098e97795146b89c3424e10ac19c87ccc5c0c7e4fa012102704c9a26513f3dbd3133de9f8822803132136597a129e2328f5600cdf6ea511e0000000001000000000101c1b7500fa134334500cd854d4f4b1a7f7199b6631bf79ab96067cc2cab1e47d71400000017160014163381939a5897d14a62a41079ea2b4d7b1e0d93ffffffff02146403000000000017a914411cad984b573e3cfc7032956eab346390a3577387a70800000000000017a914c30a66a3a44a50f4c79f3ba38d0bfa469a86d08e8702483045022100dd476d7fe7188fcd282bb10f1da205937c17954d1b700d76c16e7504193d734d02206b292c9a80d93b7105b0cdbc0ffa1e04411daa882d04787e4a5d7e9b07c05a0e0121028ef52205cf2e7491621dd8afe343a3c0fba73bf1e99d45e76e985af613d41a6d000000000200000000010114d06d8bc5dc37b288e6bde20adaaf2a31c2265ab988c178de09f4007fa6d9cd0100000000ffffffff02bff00300000000001600149b727bbe8837a8045b3e34409b84ae4e6a3d812d4623110100000000160014df3989b1cc3338a7fd0861190f14bb01961adb760247304402201112eaf2c67bc7e3093a95461f184a7ebe0087be87d27088dfd63acd3c11b6d102205ab831d2d3bae36e2979fb33a5ef5eab9fe9f7ba52e1ed48fca74d45124b83b8012102f02f42f6fd571f073b99e26b2dc2fdbfa34458cfb9204c57fc675045cdcd19de00000000010000000001010801b2feb72d5490f4aacccbe9313b4bbe59d4182ff43d301c968a74edf2f31d01000000000000000001b26100000000000017a91407c9c6b10b1797b129a749e8e6891c7f25bbfd59870247304402205d0181b804383f711d9026d800d31ebdc54ed0c43335cef8d66167eca1b62c5d02202a47bf53249da411f6ce40988c3a64bbb69e7ac14d711e37f40bea8693dd24020121039ee53794420665635ab65b8f20e6c1b185933fb11ce80dc6cda6886d3e1e4c640000000002000000000101765efe3e30b01d6e2c363d1efca81b8cc0eeccf8036772602c59a378426718ce0100000000ffffffff024645030000000000160014b2c33bcc41f59d262d8f120ee1397594afcc222060ac00000000000017a91457cdba1d466393109136f6e6cfddf66ff9bc67bc870247304402204d684e702cffa00f968fe35df33cbcfc550b677c6015adb7edeaee5772e5f24402204aac154ab1d35dfcd88decd5124210e70d968d1a2aebb8cf3e551d178c84ea2b012103fe57e0c78fa87ed3c28193e7fff70e4d81f4f5a9487ba5fc63eac2e751817d810000000001000000000101227cd7e4935f2ee091dbf091d779df6f9b6a6c5b519378293a304ab57fe627848400000000ffffffff01b1b175040000000017a914b51774039075bd0a15f003f8f9113dfdb8513d388702473044022068aa5d23086730bf946eccb4b9f9f21b6a87a35d46d5fe92bbf7864462a90b0d0220711acfd5d0b9cafb95f200b358928f2d86f0ba4a21e665fcfb258a880bfb467b0121034f6a0855d81654ffd613a032c7043dc11398e3e2e9d46d22ac0337b8e000152400000000010000000001013ce79500932c23461084ef7c6b1a404d250a2775a2dbcc61ed3dd9e09e16a36b19000000000000000002017000000000000017a9147fbe897c4aa5c63847d579b7ceecb6bc2e7109e187fc910000000000001600147bb5e5a244d995c1fd12fa1a3df66ab90588643a02483045022100ba1c6bde0b816aa852d609631a466f1740986b2bd67a1645dc7657d5a3f3b21c022040d090d7cbb765d5c3b50b197a100c229186617c313ea5d6eec39b36c49214a0012102be3619a239990e598704545af361a3a845c25fad4388e99c5d6d6f5fd5de002a0000000001000000000101185559c8b2e7e4bf2b6ff7bad1587b6888f6aec4bd9ac92030057dc42d22078e01000000171600140f8acee47c4bafe01d132cf607bb12575dbd1780ffffffff0265f40d000000000017a914c650d62520fbec0d5daaf86141acea82f1358ca987800200000000000017a914a6144e8a1b245664e7edb3c41e91f9ea8926e7ef8702483045022100af981e827ca1784097e9bb958c9ee89aae004a09e212f3a79fac3756981a41050220438778a3b2d03bb3dabc03e12d17a1a57901f3d6de53125b1aae48b17887800d01210335bbd372b36e294971f288a1a13ba03e74b78b7550478a3892effb199ec5fe0e000000000200000000010183f8f78840e6ffebeed392f6d4869cb556d94a18724da72c0c481ffb27314d7501000000171600146c1e9fed62324a07d04cfac99f4c5590d3339bdafeffffff022b3eac010000000017a914c6ce34b07dbbd171dda9921dac7a153a7f48f32e874e310d00000000001976a914bc6a858a0a08d7973cb5f35b632cc6e62c8adf4588ac02483045022100a65f3b7822596345eb7f3938601350a480de731d1c2b58519a80fe5c288a45aa022051e57ba10ccb7ebc0e23b667a4ed410e44338b36c3f4618811ddf540bf9fcd7c0121036599fa85ffc02ddbee58755e90b1f863d3ed40ce1c75bd9997a4d01ccbbc11ab47a00a0001000000000101f13fda694259434a1de909cfb3326e742f2343fd4d41cd15b6f8bd2fc73606920100000000ffffffff02867c01000000000016001420bca679c37eeb76c927fe3aa761146c39de42356e6b0000000000001976a9141b10e43c085551314d8e405e1f93f932f620972888ac02483045022100f7b6750797fa9542c39da76ca5dce74d66dde67109558789a6232f217b99ff10022007c1ff9d90f301612dd241b81d9baf0789f17573dda7350d5abb210e8504927c0121032f5ba3643046ef16b942a8015df690d69ee2639a39e7e309d8ce7bf7bfcd07ff00000000010000000001012188f70c954c903498cb1f7651e926bf0b4684453ed9d816ef6bb39f9ea09ab601000000000000000001261500000000000017a91453ce5bcd67f2fab7567666d4f15fb24014b4011b870247304402202425ac62a827390d3284a4ef24a9395d8834596428721f4a5148c73f6f4f839202204fcefb23394a770556afb8ee26e3e5b2a05074a8501c437b0d076b287013a49c012102d2afb85c3fe7f20bba67062499b16a3643a11a8e90e65d8ba3ce74ba71570d33000000000100000000010148976a4c37c2909ef252b8fc488adccacf62a85990e96fca29db382d37ea88af010000001716001464f60b9149f51ad9d2b4624519ae04d5361c53bfffffffff030000000000000000166a146f6d6e69000000000000001f000000a63f8127805c0a24000000000017a914d37b42942a6bef8c6a68d7f51927364b5d5fb3098722020000000000001976a91426226f3f2e24f55bd2e89ac0b2a9659450daa43688ac024830450221009e417e2b15d16da93072b748ab1908896bd8cdd17cf6780c57516dc98e5079d50220160dcb0fcf9f2b778c1ae2a69328da99b7e040d5f1932285023a96c6c430ee810121024283a293fc1a13a0844fdadb5a4fbd9b7d90ae339e7c1a37295aa636339e64df00000000010000000001019ab4fba88dd02fa1baa41a11bfec8696fb01c0028af89f95f0b338fe8565e822010000001716001464f60b9149f51ad9d2b4624519ae04d5361c53bfffffffff030000000000000000166a146f6d6e69000000000000001f00000007e321aea4c90224000000000017a914d37b42942a6bef8c6a68d7f51927364b5d5fb3098722020000000000001976a9140140e2720f825065e97082a6ef25cfa3d1d929b988ac024730440220463fe52d05ed3aaf685cd04dc91412ef9c97589ab6afab8604c35068add261e8022038a6511622b921975ded532be0b5aa3ef3c20c20dbf8d4349c9d00663236fa280121024283a293fc1a13a0844fdadb5a4fbd9b7d90ae339e7c1a37295aa636339e64df00000000010000000001016cb0f1aa3868fdc51406f1011ee0078b4762e11c1abc0da4865b4895d4433dbc1000000000fdffffff02990b0400000000001976a914d9f1767af454a2eb77077d01b9f06558376493e088aca50300000000000016001421cb4e6fcb7fad458432d4f34b97203d4da0f54002483045022100c95ee9440117ae97e38a7e452bc87c1673abec478a79a96d1d8b3a7b6be0b40002201a1ecf60da2dfb3d3f09779c8776578f51a9311bd6123e49b33c7437d6ba1c600121039fd22670245b3ec33ac30ee81c750b845f618c8b925683403b3bc2a58e2f45520000000001000000000101c685f5e5bfe64d84afef1e595b8737a934b380b90a59793586d2f281e5ce6c3f3a00000017160014f7079c4fc6cd3a3c73fc03e838161ab5ebccb6a8ffffffff0273f11e000000000017a9143090cbf9a65a581105359c373d6059dd91531a4b87c10301000000000017a9146113f5ff5f33febd068431fdba20dad8d0b83c6e87024830450221009dff9bdd03948fdfc4b23c3a7d1baf2dcf0057460f04a51fb24b1bf587008c980220782c1af22a9f9f9832581a91e2d407f97ea7d22282e6314b1a78a09204f524740121039f917b15af4fcf7be56d43dca481ea89ceeaa5f5d66bf3a7b5fcd498a1e9ccfd00000000010000000001010b7fd3c6b0b51dd04f28dd2d7673b8a26cc67fee11fd998ec749cd73495ff5a8220000001716001472d78fb791786873a7a2cb5f648af82ef365f912ffffffff02fe5511000000000017a91421437d57b9d80f76a910e10b10341d4cd9ecd8bb8753da00000000000017a914c02cf1ec2c6d1a79a843f8ec548199fa00446c80870247304402200b7444b30a38d0880a7ebcd54713a096bbdd9d4f0628dcec90a6c5ed2dc771eb02205f6d834a6426634dfedfc5a610b2edbd21f839de805a3571edea71da7950bcaf0121026a3bbc7e5fa4a23c8a484acdef8cb3e6125dc681979d5386beeca1681c215ff10000000001000000000101ab2ade9eeceeff7793d944f71dcfdd340aa6933bff899f4a8e70d53ffb43b7737c00000000ffffffff01a789e4030000000017a914df9179d37d0ae98d82037e4d01db3b61be2b092e8702473044022018989bd2995339880a3c2edc3305432fd8aaa636e463d89178c1e30c3016888402204bc5ca7c26f15e0c43b2b966d02c54328bc545289cb0dbcba9607933658fb22a012102cf380a4fa0b156e2e95847f2059409b2145bd80d864e6d7ba483ce9f66cd9e0f000000000100000000010136308ef00b5748479ad58c873e058dc7bb48ea159e06b63b9fa60da7c4d3dc611c0000001716001444db1716f81123310b35e0ae0a733ed0b3702d07ffffffff021d5f06000000000017a91418c15a44fee7064558dafca2bf1312f206c1557e87a61200000000000017a914861153a90c6960166c4afea9051385d4c1fd16168702473044022028a63650a539b81192285d8ceae69e9c7fa16a8110f4048258461458c8ad7e8b02201869e77b5a8cac45f74daa8ca5ca31135a82d2788f8e4cc55a1aab6f16c6255d012102535b30ec220b330a8dfe5ec11224a3067d7a1e294800a3f94c93d5b46ced44a8000000000100000000010152c3f0978fa653fe8d9bacf1777991b4fe79911775a486d4c7a5218dbd0cc5a1040000001716001429a3efab13874a0a53fa25dc0f2305681ab3478fffffffff02052043000000000017a914bb7c74b12a2e53012b18ea3a1e3aa5e63407e3c987da0300000000000017a91470f7c776a2fc62ba8adbbafb233b28d83d5b9f5387024830450221008541ed98cce39d92d6258edc30afaae6495ff973f18a619cea43a93043dd129202205f64e2f12eb54f9b16eb266f9622d2a1fbf9a92643cb47ba3ba0d72c3cde5a27012102e6fea74668d007e97721669876e5c918452f80963a339bca3bcf0ceab83db490000000000100000000010114998dfbc6c24ea35ba253df56cd64a1db11ec904b8dc10dafde095e98928dc70000000000feffffff02746700000000000017a9148443845b2bbef890e4959e15cc55d80ac29105b187f30700000000000016001497d489ce749013505681b648d6f45232084047e002483045022100f45a7494e03cf79ff838fc87711bf9431c656d7522ecc7989d0f67bfe220735502207ed8903fd0c55bef0fd9e59d58908050ad8b2c534c9062fc604d92a9dc0d832c012103dd342bbc5c5eb5a121e11cea74455383f76d7e3c38742c277a6898b096d63a08000000000200000000010147297ffa92671249d011aace83a185831d722f6004c366a00f9aabc9fc051c210100000000fdffffff030369f73a00000000160014f90263428d7f8a62f7a8566b68b5f8525cba4c224d614d00000000001976a914b7dc8588ecd41fbc67080397138e70b7bb27d00388acfea005000000000017a9146b2b5b7719883bc97583c73486a8d9e9f21d4e1b870247304402203f7e323ff34c76da8ade013b89dda34708c197f3049026c3fafd5cd7fbc67489022047808c6025894d420fde75f23d1a9bdfc38e577e5d00d8ec58a28e2b7069b670012102d948fc174a1abcd17249b8e901ff382a36a2b8b5825512051fbc915e08d854fe49a00a000200000000010195ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e5c00000000ffffffff01cd360d000000000017a91406af7ffc225426996d1a12aa2398390c6f9f1e57870247304402205f22ce82dd176be659e96eecdaf3455be4bab8953a0e649e5d59ace7d8041b18022063ed9ba1446f40b1b05eb715bcc77046eede1223f2bc4005807381524adb6a0b01210336014abe4d177267b8518dd5e176fa0e2d1f9ab3e6d63ea9ab50d03332c1582e000000000100000000010198b854c572095846580696e8ef6ffadd1c1f41d4302e9a691106366c84e35dba0100000000ffffffff02cbad1e0000000000160014c6ad71059dde2e88f4cafff0039ad29c403f1b0d0d4e4400000000002200201d69e082697465f22b59dc9e3eb7a045efb4f62ecc9bdb03ce0c6102dbceecbb02483045022100df8640bf0a164a50d3b43c97e4ecedad09c67bd23b175effaad280ab8564737502206f2b3ec991ad924f05bfa70337feb145407c7c0a188ae4de62f4c8a2b1885c900121023681668c1c804367432971b92bbbf427aecd35d42d7eaccbd74ff03ecdbd7fae000000000100000000010196f77b2544e5fadaf136b5db52e673a601c6d3e27b8b43213ae1142a5259c9630100000000ffffffff01554a4400000000001600148306261a9bfbbeba114ec90a248b6b1f6ee0657a03483045022100d2d4349a379f233540f283e076836051eb253b84df2aafa3ff7e3cacb39fb196022038e2b8fdc0456db42fde5130202e4a16ca65f9d7d93ea22ff231212ca7c455e40120c519e74ce38d748e4a92bf44550e8805186a79e8d67ce569b858b7f1b196a4fb6a8201208763a914d1bdc1e076cb9c60cecd6d9951e47ebf1e140fb988210374b61c280a7ea29493d97316e549333a207ec5926e89e3fc00cbfdd9deaea35a677503d8a00ab17521036bcdca8160004b2bc7f3f01116502ea61fc8a76704a2a79cb052644cc240c4e668ac0000000002000000000101c1b05bec62244100d8aa7f1e8054bdfe23dc1c3afe721ccd6e456be8508a72100100000017160014693f3c22d98acdfb06a73bf4ab5024f5031820ebfeffffff02f99910000000000017a914fda0f06ebd37b9a4548b33e31cec69ef5f452cee87c0c62d00000000001976a914985cbf0081af2e43f20b11760bc1efb30e86a35488ac024730440220212b209a1a086d4f3ebef04008a1d0f143cc9b82203c6e4ffb3ec3f2bc14815f02200d600e70199f15fd2f040a976b63d3c1ac413106f9e3b8db067ac587cb7d7b2f01210365923f82410358e57325c2b0dd2c89469855d00e1029f9909c96846f345b116c48a00a0002000000000101dbf42408c64fedcf202641b3e50ea1dfd56e9d13d6d8f510163e9f28e47ca88f0200000000fdffffff0e79bb00000000000017a914767cf39a7b609b3023777bef5067feb8a83dcdc687b2bc00000000000017a9143f27908b33da919cf2d998642d0accefc31c95b58703bd000000000000160014db7af6eed964e531ecb6d3f55e3c07e90d4f407b24bd00000000000016001429859c8c1dc69aa9e05fb082071ec3774e804aceacbd000000000000160014a26d01f990b43cda367e956d7b429a9107dd97380e6a0100000000001600146e227785bf349ed37e52c89ab54ef07b002ec3181b770100000000001976a914a059a162858f2174cad9c3fa8a80cfa77b2e4d6288ac2979010000000000160014a26d01f990b43cda367e956d7b429a9107dd9738c37c0100000000001600142ec4e3f2b489a84bbdf1839b0ec7dfa3ade2f051c9f3020000000000160014a26d01f990b43cda367e956d7b429a9107dd973833f70200000000001976a9143dd00c0bc0f06d8c5d05d8bdc5188faa60078a1e88ac99f7020000000000160014c3c0e70826e640a27f08c9f2238b8ba2f87b5c79b4f702000000000016001415bfc41b02d239b6396fd124f0f0c263cd6c6ca0af94410000000000160014879fb8519fa2787adad4a0b555c2ceb6ecd65f970247304402204a7a1e10ed34786ec19e6c3196a2a9b9c25a64947efb6da48a2e50fe49bfa93f02200e5e1fe1b6fe28949a4447eb033bc7ec91daaa9ed9483ae0e0540a1f0796f699012102bccfc773d0c4a8b98cd83cce08af987c0c11e615bab2127f8dc065cad6509e5648a00a00010000000001015a8ee6f511b5b2bdb50733c374c9f3fae9a8f65951c8e5bb859d88cf6b0ef08700000000000000000002faec08000000000017a914c70df891a36004c4211adb6dee4f74e8181c1f1387a45e0900000000001600148bc4e8f3f0ec0ff86bfcf97c438bb676ad68b98b02483045022100aa114d393fedd99994e873b43f8b150b6f37500fc3cb22bfd5d9c9469db9b458022056da1ac2cf776a3874848e4c4a98ef433a488446345dc8e4e0190bbf0f11a2c40121022a1c752e69eb193a5922da1fd853eec066b16ece323c931ca695a1ecca09a3160000000002000000000102cb27c664cc4e95846ec0d329a4a1eb3125f58e37fcbda1e359f9b59268d3ba8d0100000017160014b50db181dbf747a953d1eda35b782a181d375573ffffffff2f5d30a505add77b46c67ef4112e1a27ae2b6173869ec996ade0fa5a3075868b0000000000ffffffff1a205f0300000000001600145d3d2df08d877eb0fd475cc09289c56a727e8b7ac6c139000000000017a91498aaa4e75b38def102480d8cb7a91a409c0db4f187208e0b000000000016001469fe48a1fe79a416242380d16b5cbca3397593ed34240000000000001976a914853ec8b4941e99e60546e08e387677e6e417a19b88ac3ffa00000000000017a914dddb9a377d000add5ba91c629b1e0d2eaec5cea187cd9619000000000017a914e5fc1aac83020287b878693e680e7cc42aa47dd68759200000000000001976a9147ba171afe97b350b7c90f9336e4a783cfaf2140688acc3ae01000000000017a9145f53c6caa4555750d07c410b30408355d15041fe874e6237000000000016001411fd0b1eec216ef9b66ae2e9d48dc2eca90e63fd38ee060000000000160014183ab98f4eb39070f13cb41b6441865f9fbc9f7f606d00000000000017a9140759dc1a3b5b528d3cc613d9e61d9ca8648f481d87609901000000000017a914f9847c0221836b3e575c8dcddf88405c3641a3c287f4ad01000000000017a914dc50572d8a0ac23f736e2bd666bc254c697155ee877e0901000000000017a9148d989677e5afa2ee2193b03d2d32e9e950facfd287f8e809000000000017a9145f262ddb1563ae62b220b85be416d9e0fd4813a1876c3a09000000000017a91464e31d40d6dca61d9747c663703ac71072a81802879d4d00000000000017a914f829b13391dd42fddf0339b3e92cc4c3c7decac087cfe200000000000017a914a4ae6bd33137c199bfb384491f769e61379220f2870eab0300000000001976a91476cc45a57451dbfb4f9e1d2cd1cfa5f2288c424a88ac7dac000000000000160014235a4cf84665a9bf9b4d74b6c55e91a252ecc5d962d9390300000000160014e13ec45c6d71a71abb33e1b0553cba4cf622a1b74e9b10000000000017a914024a2b28dd3b0cf48b4107bce9c953f8424505ab87e62d0100000000001976a914b4485705b3d059c2931150062b8dc8405712d66988ac4bae0100000000001976a9144733e405059e028c80be69e89e3c04d5747f22fe88acf8ee09000000000017a914457c06a39d8a3df81619b525d6601843a3cb01af87303211000000000017a914af82f72b062716685d4e68a619d992e3542556228702473044022029f27df227f4f8988490d1c38b6eafeeee8a35c0e02bc2bfd6364e7a82556801022070d5a8100350973554a2d000303204bdeb29d6b4e77d9a38c465babcbaf22ac30121038bb6e00f69d23876451b555b21d85bfb886404f570cfa451da958f535fd8dcf60247304402201e0945f54d3c8fbbf7361adbb0099824347320db66dd2af2056a55ca0ffe3d040220544ccaef2ae4f2da0874108e4f0960261f436ab47a35955d41e49ed4c3d3fe84012102023c024f26f05c2953ff81d9bf2d2eccf28db1aeb16fd2c21b39939121651ae40000000002000000000101d5eec262a7909035f87da5584b44542c50554c3f54083f9e5bff76e524c29b7c1400000000fdffffff0190ce39030000000016001441c1f3dfd400e4a08a9b26b192d16fe7594426c00247304402204eda94f7152f8d36595d21e8e0e40716e29e7b5b6cbe73d59a77c774305c208702202f38dd81f5a0a7f0c92b9717750e2ea705f1aa7a5aa2efff41728c71af28ff400121021001b39665e500be746559e7b95bb35cc0d6a168d9b06424c3a57e88bb68fbc3000000000200000000010237150aedff7065509f8951091dfe19b20fd28b5b7e523b55d35fe1e36d6c1c151500000000ffffffffd5eec262a7909035f87da5584b44542c50554c3f54083f9e5bff76e524c29b7c0800000000ffffffff018a9a79000000000016001494ea3335fb0f606ed17029a4757a15f87c0e1782024730440220530a8840ab1090f9eb6cd16d4f4f6fe3a652a2274bd9453c5b0a82c8f06c67a7022059cfa02e59210e4ff1560563f912537f872c5f50a2ea053ec515b26f11d562500121032ed3fb8db6816d57bb27a8498db69a18d7db84e3b304143e800dd50bbe1f6c2302483045022100f197ef4f88c8a5aeaecf92cf5b3bb70035965463dfcd9776c3d344215b309da6022031dfe0f0af51163aff051697f8aca21669f8143f35ea9b88b79f8800b646d6810121032ed3fb8db6816d57bb27a8498db69a18d7db84e3b304143e800dd50bbe1f6c230000000001000000000101dc134f3e2787802a804547421787765fbcb7853e4327d1e55fc25a4115ced8d17600000000ffffffff012e2eac020000000017a9148ad09b9360d135024d34b8cd222d9b3f966149c8870247304402206d06d1f612a811e22578ceadf9ec623b82c29895b6b454a5e43c97ac2fdfdbfd02203b75966bdc1a77178d02e63eb16bf269296aa09ca2f5d76846555da7bd2f973b012103796f18e5e4ee20696017701dbef6456682ccc12e4173664dc8bd5d63a39c77bf0000000001000000000101d5601c6f7a6fe36b1f9bf4e93c49238580f1fe8e4718218eacbef50dae4e64a901000000000000000002095901000000000017a9148aac531980ab0203bb869957a8ddeb7ecb2398d187cf180000000000001600143e6222d358a5000bed56ca72f72c7d14092b07b402483045022100b9e149f827e99fa794dbd5283d9359eba3c5e05e1819367d3715d6e3c1a228ba02202e5fdf418381c05ae917348b166e07157a68772bd3e9cc159f6e99cb4d0854fe01210308045ab26eb5e32de2006c705f6784f911f1e09322c746d7da372e47cdb7cafa00000000010000000001011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d41c00000000feffffff0191340700000000001976a91414a57557140919fca469e6491c2677594960089088ac0247304402205bef85fdfbc83e6f5c3741def26b1ebed2c6f03200a3f8d8436902169835cd640220152b68cdd52dfc4839b9449f98ee3313746195a39e175e4666ea3d63a6474af2012102c48c498d549fbb004cdb8338c6c2c8f694c1ff6830634fd81d8773f79cb818d80000000002000000000101aa6fdfe9f7bd2a60fcb01797cddb2781d05b6b8c689f6480a7375ba4473fb9ea0000000000fdffffff026ae80100000000001976a9144274c8e7b8b777707c2fd1c4d51b4a1a9877e42888acfb40950000000000160014cc9edbbe737f64efcdaced8065b568129e238c2b0247304402204fe6fd54c7035e7b38ad816099bb45348e46f70527e12cb8ca769e57baf9e4e20220202136b6a25e3b7a92861aa760a5e4b02e403eb2f67506bc1ed5967695cfd6100121035ef6200243d294b5b07289ca969990c729b64061514c8ab054b99002f5a8833547a00a000200000000010197e6f5b6453da407cd142aecc652a1250b96aa27c2b480ab6e9ab7dc029ac7710000000000ffffffff028dd74e01000000001600147aec05dedf59b5a05ee33247b6fa0fc64d6a01bfdcb2410000000000160014eefc04e0e863a72b90605e52bf8d39e221924c690247304402205920ecc3b32077c39737323b8ce1ed4efe30311d15f1e87e8cff75e5eb653062022004230f1f4dca86857bd7ef7bc438c0cbbc1bf16e603211d8146d9500b73b69c7012102648d491c1235d6829efd5b4678441106a4be6e71b4cdf242aa75f27370f23b370000000001000000000101fe9e975c14312c6d5c9ebdd3ef15eefdf641b8477091235e3d682cde4274d1ba51000000000000000002217d0e0000000000160014ad134debb59f78be0d94b0eb1427e7d016807c558b6e030000000000160014ae589bf0fc5001d7393091491af4acc510b648da02473044022013189e889a250e16ea589999862a1f93ca737d02d4f7526d94754cf075740c58022048b590b37e2b9a91a0883db31151024c3eaa7ffc4000b698c0318ccf35635ab6012103eace4fa57e802c0065bbfc5acd3366495d0e122949ae0b0ea20842830877e498000000000200000000010134f43eec07e1abe4403c6c7c65f37d48d9cb82e0e11f598ceeb7d510a6a9ea060000000000feffffff02238c00000000000017a9147668626ec49f3d86fb9cd255587f1a6481a02dcf87f8600a000000000016001427db11c7ca382e97643bd5ad0e4ee91d067df9ad0247304402201d91686f99354778c02c221d3e780a46d4d0337cb18b8cf9662f77989c9206cb02202562134c3aa71c0963ddd57cc30fb63ba0dc31b8697de63e4abe770e116ee6d401210213a2bbf5a5ab4ab0241fc86673ebc1c69f0413899c8e3b1f97826f3a2921e74648a00a00010000000001014b8bc8544e77ff31b14447522ae6dd50b2df440c5ce308330d5e011f3f7598440100000000feffffff02e27200000000000017a91465c6ff5117693d867ba590d49f59b44ab873dbab87f925040000000000160014663c3129381a58d74d97cac27d223cf4a950620302473044022038c13ae934c3d4e1e1bc3009d9a4ae4805d548b73b4d267e305a901800646a8102200e48b814ab51cf16e02d36537c983c9092f394241701b986401fd8d22b4d0c1c0121036d4f539d856575a1e5032d4b48ec1850e3aa44f7383b6f55fa6574270a3edce349a00a0001000000000101067e40ec13be4ed086823bb840d4e6c451523f276f87c0f5348dd01546063259220000001716001462ef4171a0f0e9f1ea284f95c6c1e6145c6f1c2dffffffff02ee331900000000001976a914a42eb866316d5a36afd8a131fc2e6e0b87661c1188acae5700000000000017a9147c9d75a7a4343b5d4f38d604bba61bc120f78d3c8702473044022028662a751bb913a36c6355573d382066b0c3701431c550003086c80a11c19a2d022005fe4a11ee6014cd85b332036970e9094b7aec1d9e3aaada4785a6424fce25bb0121026a06a738be00065dce20d7f78a140afeb5c0f32316ee314cb83851dbc273c81000000000010000000001012b7cea5580b4c5fec90598dad0fdfa55be5074bbe988d36617b8c4c1128a08550100000000ffffffff02d95c03000000000017a914aa920d0d1a09fdec6caeaa6a8137bfe15f812519873545010000000000160014ddff782c1e58e36ada753a15279c4970cebd485c024730440220170bc6936094702770b6d312aea644e902e8a6650ee413a60e3a7c544745f7e3022058b21fb6bf9b4f4580ecef0d8c9b543b92e62b1575d3e5ddb67c1c02e9867ac401210392c4e1128abba556d0261132731430716200989c6dea240cdb9f2e31cdbe25540000000001000000000101502fc2cc0a1b1b05fd16778af65274e9f721505c762a45389d887babd21d23930d000000171600141a13023dce61f22863fd250c46ffd180cf92e4a8000000000200943577000000001976a914e34a552ed1811c8d83dedf291ac30706a46fc0aa88ac6814bf530100000017a9148b856fac00defdd1d26c3ac6bc5d90b4fe67ee458702483045022100d439f9d7859c9c41aa27a937089599867a438fe09c0d691d43f0639b6c40ea90022024d5d873ed6bb41454dabd946e1d056866a1d0fa66c2bb5d9e21be4b5bc4b6c9012103658509daab2b7627d29cdbb5a14628b7af4e334b2f7f7989615636a30ff07ae40000000001000000000101d322f61ecfde41f01fef5cfd99af9493d1bf148e426d0614893401d921d33c573100000000ffffffff02732200000000000017a9147b512d7a165432863f5c801607c33be3b7bec858878b8f9b0000000000160014fa8bcce7b532f4f12d5061474d9c1b20874699760247304402207de5f031fcd9c291c2955e562c249db102facd5f4d3c8aa945187bc2e265f3b502207bfc38ca19dc4bcbcfc9317872d3e585b72aebeace5fc67955f9ace2b4636162012102328d1fa0a963fb4fb3a4a94793eefdacdaafd1c5329f79e0a5ad43472b2e90eb0000000001000000000101aa2d09d46a79f7e5db9415abb51f9f0dc650a382c8aa797d6af06a9c239f913548000000171600143a7dae435eec7337e92eb3807e1de18ef13ba67d0000000002eb580100000000001976a9144f726153d8ef4e4efecc2fd5259db6cb6dfe396d88acb8927a0a0000000017a914352a95c75d51035869918e6971be549c6b0024548702483045022100b50451fe8d9ff75fd7554e205c8865d7f241d561150c2dd909b83b11900f8a6902201ed04b851137e8949870e1415a0e58a4547f0a5a35ea45d9312b489dd87fbb8501210230ff50232073b15b48dbee97c16f7661eef894f655a6e5da32225f2cac4ab45f00000000010000000001010a152676d98ff5826ca427abdc20fa4c78152d358e01ab3b15c807e52c8293f301000000000000000002d0fb01000000000017a914e93a15a1caa676367077cf74f16fba76b2a3d33c8736b40c0000000000160014335aee81df75dcf90b657b966cef3d113e985ccf0248304502210087b534a656630a040589b1a939a63318adcd2722b254e7607ec88459bd4580880220381e577321dcf806cd56758a496d0344b2da0fb6e1560c5d99aa01418b3b889f0121022fefb488514a052c6ea2127929d9f961a712d8ab1d9e1ae4e482f118a9fa9df70000000001000000000101eb70d013510905fcad0b66fbf764bc84c20d0574d0b3d03f315ae1532252b66b000000000000000000022cb00000000000001976a9149bfbe9f9365f785026c98f437502c8195871f43788ac3f12000000000000160014d72a4405d9c9e03de05b225c619afd61bf41b32c0247304402207c477e803fe6b16c6f5e41b8db1f7f14ad568214ba96e66abefc8b708dac141902202471de93c85bc80c3c2838b871e5ad5afbce7a684b37c52c8bc25b806ed88d9a012103f1683127093bf3cc692c88babc207e1a0a23e9334d840b86aefbb158351d3412000000000100000000010109b11e7053c923996a537b1847d0d48cfb4158dbb76d30b616a1264b275585710000000000ffffffff020a4700000000000016001478a20b4c1041bcf2f96da7a3fd0ae280190923ae4aee0b0000000000160014db8695ebf1842f5fc5dafe9aa71388ecec54c04f02473044022079dd7409d069f7139a51c5914d514ae6309f78ab695c314fc4829ea0febb58320220091bddfc888f78a28afb1f56c49e46d792999e9af32fe9826893643c8da58ec501210331961a039a9e24f770ed6111bf0970fecd2d712e6b1264c5301c0354c28f719600000000010000000001019dc93a84dc594be24c0012551eae915d31bfc46a740bb91837248c67128261f401000000000000000002b0b300000000000017a914829118ca3c84a89865e5ea47200a0da2a572634f87a66e1100000000001600143f1152432a499662df76c7fc80ff25993166daeb024830450221009e7b217a9f313ba4945594f37979e6b1343bed3d295aae5960da864f25c8f0b2022013d5d4a8b836095fbd81e05c1bea4e337362fdd8e720e5c92c495f545820f6f6012103f142b655721018cae9fdb9eb41905dedff1ee3f292fa60938e7b94f91a9a57cf0000000001000000000101ced2552a5b684271afc5785db79022f76fd134fd4c6819c38c43aaa4b92c330f0100000017160014411001e691cb161a82df24f40c0309895ef0aba5ffffffff025d710d000000000017a91475daba4b7d847903a4a0646b5b943e972b908f808713e601000000000017a91487707b842256bf66cab92d12bb49b05d022306de8702483045022100c277a3e611fcc213c4f2e297e01616c5c66b76aea7ff488933e13cf83370bf4702202869cf80aea3cf94f40e56e2e39272f3f33fd6f6772607f9a23ce7c825e0ad61012102615c15cadcc987f76b32b28e30ab70d9f0ebf7b6e3d9bf584b6a5c9789e869230000000002000000000101a53ea5c643316f4f6a41461ff7047d9233cf3ec9db37ddcfe5cb72a16ee781020100000000ffffffff0271cd1b000000000017a91406cb57c567eb8bf221d1d3ed2e107a68f404b64f87a0225a0200000000160014de219d2379a72d7798a1c261264b5e514cd9784a0247304402206f74e7124c88dcbc8364c7bf6dbca87e7e9336004324a2118325d054ae898b6a02200763f00618df15d0ef14238000943c58f028c40efa758210708f6cefb825922101210262f9625fead18f1527c4a5e31a4c6ae6fc72f33a308ae7bd65eaa3396d47f0cd000000000100000000010153302fe57d7525f29c0b0a598d869a422fb0a6df7c4f0b3972feba52c198e46101000000171600145a062ac10801255b2617754b402b24fca16f1b5affffffff0263a60300000000001600143d9e9470046f9752e84f2e5bf11dd1f9ee8c4ba2153600000000000017a914fce5a993359e5b281deb91b2da8b6dce6c2680008702483045022100cd8d78ad02c73b8a2501394807a3135daf535b81d44bfe6a0b48988ae2a313c902204dd4f1a186726ff3b87e9164dc45d02e03e750013799169aa43efd93df5d42d30121033a86b3aac9a03f432fe1d2abe27146e7c5662c759bddf22106b8bf781e30fd24000000000200000000010237b435329963f394fff1fa8c7ebde4c372901d776ba15b9ebf4ee28b885ba7410000000000ffffffff0fb31f86fa17627ff9c826f6fb569eec1fd3854602772a0fe0898b8cc0025ea40100000000ffffffff02dc341400000000001976a914e1b57e189407769abd4923c2b7b41b5c4dca8a8888ac27fc0d00000000001600140e98f6a49947d4e1db8f3ebe728a0da3f921fa940247304402206dbf7bc56d5596e4aca477c11cb0eb6bc453b1c8e8816cc2ef8f366772f79aa50220640ac2dec81c20ea5fcedba11f1a5339c4d88258b6e336287427fe196eae1bea012103a7b610fcc604244bad7770d60c7ab18ce45d27cfcbabb1b8c1d27806017a825a02483045022100e33c03be5564b6291f39a4063ac20397a90fb04716b63c76b67376870e1691d00220444e5a4bc50fb8f959f51a6083db08a2a7c3a575d6a620d593775bf73b26b4ef012103a7b610fcc604244bad7770d60c7ab18ce45d27cfcbabb1b8c1d27806017a825a0000000001000000000101b0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b259070000001716001493b54ce61cee598949c4e82ae41ca80bd3d979d9ffffffff02393506000000000017a91472168e9bfdd528ce08fa33be495e697d47f5ea1687745100000000000017a9140f0d0b8c91cb75c010d45b6df565bbb369dfcc40870247304402207c228fa9034e898237aa74357b5fba49279a16cf87098e8544eef98a60e26f90022017f4f4d669f988abcc19e5c3ef4e0e97c47983f9dd93d8303e2740beb450012a01210310854572421fafd283829b0d0b1f8e7ca9ecf1e0961761c4590983e3bf5f0e010000000001000000000101ed7d84e00fdaf4d473dbaf3a76bccf983aeba2c4ba327903e6f9aaa6e531bd413800000000feffffff0250c30000000000001976a914c8197f50adf290a45187f7b582ce7fe959b4300f88acac0e0000000000001600141c701a611c44a3a67f7a8a23fa81d4e03a5a22e9024730440220065a5bc9feaa0ca7ee79698a6e18d419aab08e0b3bfc0c7d3574928ead54e4ab022059c50ec6d95d20b9f85937fcd1a27524c34b1ef4e713d49d8568c55e061c16a20121031b3ff47290e11dc7dd91b03cc2296a1e6543276d6d92b21e5e1b1742026833cb0000000001000000000101a2f8bf77b3ec6c564de7b61ed8878b99dd60156d7521495ded3a23009c517ee165000000171600144a2e836a754626c07d55a3f74c0a2f68af8001d8ffffffff025f5d02000000000017a914fbc92b02c0eb05f20ad963f485949b859f7dac26875bcf00000000000017a914e8a51fa882bcb8029c736b752c662f6d558ea8ac8702483045022100dcd97909fdaef5b311a3244f4af268831633c85ae6ba88ad94ccf980d0671f8102204ce624fc1221f3d39f61dadd8624f9ffcafb3573b14e10227a701a15da1926490121022ac9089012330ff50b40d40fb76bcadb82d0e8ea9f0e594287660fb524fc576e0000000001000000000101bac7a6b8f656a714da9e2098dc6f7082cd0d7915f17aaac27a751ffd8beeece60000000000ffffffff0226a54a0000000000160014d20665d55634af636338db983c0859afbba0ecd835af100000000000220020f7f4efb4c18b0ed6a3ea3d8ab400044a5f6dff3fa5f8a2a3d08f464dc434484b02483045022100ce511282859e955920e6646201873c831cbf7947ae733e3ce0bd6cecc1d44d5e02206b16434b3a6b3d984a5f3a6a423097f8d3c32f6c93153a906c08d802ee0ce8f40121027700ab2265d7345998d2af510c4fd7f0db77dd5355413f4d1479deb22fa476f500000000010000000001019ee4dde42c5ead4111fd130f5da5ad1ebc9fdd8742d123b9c39375e3ee7153a71c00000000feffffff01549d28000000000016001447127fb0a6b14098390e20b1557502257d5b8fd50247304402207cdb67f2e5acdfca2bdb5b3c7c43fce7c3066e651908453a9f303a947f820fb8022054fde18f3081c1a9e0e41a13819253a2573c30bd1df8686727c1b150b7a6e31e012102260f170119ec61ff651d898158b64002953167c3df4cd4dfabd6bc14364b45ae0000000001000000000101f4709b9623358496889bfe8ad61fff7cc3b7fe83f535b7a082de1bc0d42db34b0100000000ffffffff02213c2700000000002200203110464454a556af701f0bd87d297965d830e207d60f064354e43b9e4b2207138584cb0100000000160014c8de38f2992da66dd5a432a186222fb6b50a239802483045022100dbc8be8fe081e235d4e923c3a26a21578f01e72c2cdaae21f9f8f2e7e27a0c39022004a877a40ed71066b8aa96aae435cde7e083c0ab30af82ea79376bf0d832acc40121026e585ebde5a1f4acfaa45842a3afcf2d699d75c536bb39fc4046fe2badf5adfa0000000001000000000101ddbd5bb5c26f2e7fef08c34e7222e8f90d21a56023bb95fe4266d1822e0044ca0000000000ffffffff016938270000000000160014439d2bc49a031567caf750db825ac9bf3610bcb50347304402203bec554bfe54ffd6a50d08e751e9b85d0648b7ccce2e23f36cb65f8e9d4722cf022056283ff199f1b267be2b1c744e1ff996ffdac76188ad01eca81763e6d0913fa401202cec75ba2d9a55531e1998284b54f318fc1b039349442fff9af0fd92a28bec406a8201208763a91425db84d70ce3caa02153ff4691ba0460364fffdc88210256b5763a9435c14e919f1bc74c05ebe25a7fb021804eebc6ba4d5a7f6f91a563677503d8a00ab1752102035117e8f42385c868624e80b4d7d3494eaa97a6323f35e315ccc98ef22f8c1068ac000000000100000000010158530eb5607c1abcb37fa57832a245a3893426a8c498c53b80a37d0e2c7ce9bd03000000000000000001e61b3a0000000000160014623e88a5b4c1c779e1794d13e80d630a7c993cab02473044022019380d92e078e9ca8e29e2025fdda26d2de68562bc1109d05cab67bf8f9de5f6022015f0c4b1d50d18462fb34cd9b12c736c0bfaf7e522951b979461ddc97a3a8765012102b5542c5f543bf5dad130dd5849bc24eac9ed0c4c59563a1d54f3c89a6a021a360000000001000000000101d8026429aad05821f1a0e0e213d9f2778033b038d2ca8e9d74333355444cdb9d0f000000171600141aa603813100e58743aaa3ca980ddd162f0484b8ffffffff02e99309000000000017a914387d233a72c6f8803c749379d23bd071d30fc5c387740200000000000017a914ca8ef9067e6834fee9980337ecdb2ae59d7dbe0a87024730440220132329b0a02dfd9fba00e138bdf97704ea8c5b13292e87c46c8bf78c56e8f1a702204219809540b5eebd73254b8b6007af634794439a8788d820fcec6c5fcf6e9b47012102a4ea9a27362301741bc088804f1f7c6064a6ba2bf3f034191164eb1b5ef2a11e0000000002000000000101a8f847ab4d5dbb936fefdcbdb7bbb6ad3c61ae2d247e58f2a30799db633db6f90200000000ffffffff02bfe20c000000000016001481620204039a5daeee057469d0016e09c89652acf61e0300000000001600140f53afaed09a9cb8b7317b875ed8021fe919cac702473044022019c1aebbc8fe2a53be88e15458793d18c3628ac20dc93ec957fc1aa9fa86cf8902201cc56d942d1fa7bdb9765c4c87a18fda7eca7507a5a41ba3774a3dc620f350de0121033df7020a2f752c9af7ff82ad30228c5299e946110214fcfc6da44a95ea00331f0000000002000000000101fe3df429ef100d9fc6c6608f812da6925a3d470808274dadb9355a83b15076100300000000fdffffff03a7c202000000000017a9144931d93d9b01f3573764a7124ed24b916af3d309879e30cd2b000000001600141cdddfe414231edea840e4266467bf858331e0f97d810400000000001976a9148c11e238ed0f51785a81f7e94309e5de5ffdb15188ac0247304402204c6f01d65e956f73d2005cc41bdbeb8bf2fe3c654616d508f35112b0267fdf1d0220583015d2d334253f6dc0326cef649de4187683f44ade712a2405c8a15136f910012102c67905eefa1c5edbb807a69d2562dde550cf801edd808a412360b0efac991bc848a00a0001000000000101b31d5caa5eb86dca13273d16181bfddb27a361d73c4bebebe25301eafb174498020000000000000000026379a800000000001976a9148570141d33491dc3d1c0c2dcdb9bd455ec6ea25b88ac51323400000000001600147c6c0533f066e218ae830c91a00da6f52ce57b7702483045022100b9bb9246b559c17e00e33dbd4b1054a42e5a6f015288a2d2c0ca06ebcaae1db0022041b8489dd103d5f8d8a3b00db43cbe9c7df403f30d220070b44228ed3f01cfe401210357935a467a0c8ebd3b692f9595a350bbc3a197edca72f2bc851189ebad4a7cb50000000001000000000101ef46716d5b94b0fb0bc5275a1feef58e11bbfa85ee8b15181f74cc3cf498ebba0e000000171600144582cd5c4bf6097201072a5300f00deaaab96247ffffffff026ce601000000000017a91490ece4f224af7be12fbac4e562e651cac3d9fff787420800000000000017a91466e12248c41bb7e191a305edf0bc6a25de51530187024730440220088a3250c724cf5c85720c4d4e31454280fb502982017af2bcf4cdbde6f78c2702204c3d996dc6be0e3f730e8513c5d1e7b41e79f2455ec05ad3721fc63803e7101e01210200e77bf7a415699ca7ff4eb488fdff0fb61435f1480a518c8b46f37cb81764520000000001000000000101b34f08367bd81732a9476665ba3fe179bb533182e2ed4ef623feaba569ef74220d00000000ffffffff01549e7c000000000017a91445d0edcff19be446c7844d2beacc159951aff7ff870247304402200622d1d5fdcb3eddb191a08f3abf90a19adde66fb5dd76b18f664dae8ce407f5022051c86f6b18aa63440d40fd7c792ae65c7a0a0627d8ed470e42614531eda44f34012102211f2d686b441dbdf229ded5374cb3a3d29f6a0b604dc13edfa5c86dde23d9550000000001000000000101d9a25fe7c80163f2f633853e73e20c6c00ee7fbc2f503dd30c1d9951812bf590010000001716001464102a8620ced09f057f3db25f8ce1dc1ab49451000000000240ebd201000000001976a914208aef6dc76a821485ed1285d57fa087f79c63fd88ac101304000000000017a9146173cd8d37566c61bde1ac816ed2e92ad74cb27f870247304402204a6397410bc71d6c3490e98c2654d50e8cb78814bd0e17f76eaa95c2ebc32d0902204b074395946d8b742c2577d48ba2c55265d1d9d3b2668966934393b398954c66012103648f185da2d427955f5a68cba48ea87a785a74b594a92dd97f57fd9bae8c1c3800000000020000000001018688312bc314e58bd91b070908bcce2cdf978932b74b576c3cff0c43affe75d20200000000fdffffff024571000000000000160014439edbc0e491835e4c4404fb5889127bc03746b50b030600000000001976a9149f3a50204c9052eb3b98a3ee494dd57b336c6a9e88ac0247304402205632887704bbd0c88b7a816b79efb21121df94ec5677d46f4329abc8c1164f890220024f5d99b0450fcf0bb77a801fe6c249a2d18164bc9bab733bad76b42c86a8f6012102fdc196b76c4b3361b39ad8242dc6b1cf18daf558513066af9503a2b1c3c928fb48a00a000200000000010103212c077c7a7cc6dc33b76f2d43a96d5b2d45c25ce0d9e8765812c7213241a50000000000fdffffff0ddf7a01000000000017a914340ae75a5e7a1ed20995d7aaeb8d5ed85da1417a8761830900000000001976a914fc34c742f6d2e0bc4d53b044aef83f845a7f11b088acd3690a00000000001976a914653794d58a83de90a44237b4d2d3fa1094dd7be788ac0b8014000000000017a914849570840603594893d2a5bc31ae61f4f3550bc287c6ff1800000000001976a914115c5237e9a1262d30d6295d885c4e6c5f680e1088ac991321000000000017a914086de0d35e2c46c1881ea06c78c42a16363731b68742892a000000000017a914116d87d1acf09d456d1c6a07641c6c5d94d7393887c62b2f000000000017a914ff1324fd34589e7e0ce8ae32bf5df763eb04f07e87d69938000000000017a9145efb17eb3c7e78ee4e4978f80dfc51035c1b31ec87db023f000000000017a914215e02b9bf07841be9d262e09c22185db4f16cdf87f2af6e000000000016001418ad7d52fccce6ddb392eb0ad349ee6d5e519304fc3b7e000000000017a914fb71defbcbeaf3e86073001ed0f1e0b6c3f05d3887b7a9d800000000001600149cf85fd284dac17953e0c695dd7d348b1128078402473044022052fc2724b2aa4416e05da42c711c8c1e9942da0bb0c4ea08a231ecb5a972c61c022077b8841402bdddb0ee7cb56c73e1c2ab05337f554c502580e01838e7e0782475012103deebb80d4ca52217e3f86d123b607857a94d7d625aea1bc5259160ace319d22948a00a0001000000000101b278fcef9d04b37c0fd53604e7a670d8fc02c7b183d40c78898ec586b25fb1c04e0000001716001414fe5ea661ef2c0efd39223d53ba3e3c06f76443ffffffff026bc606000000000017a9145b180c19e1299fdd57a10b5008b6b96df9e1e9fb87bc0a00000000000017a914ff7a92c5ccf199282fb7014862626489c96dc798870248304502210084b2bb87d1cd4556e20a1cbdb554c325bd5502902f807702c7178ff80ed141570220245116f5e6b989a3e3c8183618c7646713305e80e5124c294f418add24350fe0012102b73407b5e9dc8fa14a01e32bd7f328109cb3a1c730a40c9a6c7d4ccbb193c9460000000001000000000101367429a7d757bbed62e5744f198f54120e2422a9674dd8dab29281145d81f6680100000000ffffffff02d59301000000000017a9148cf4973f0f990bbe1fd97c213f10e51a7e5e84bf8773280900000000001600145ae4169d6da5c291772c15cae977b9e40e8c508e0247304402200b9f69e46c57687d510a12aa82fc90c594d61f94c96de12c51e0dfbedd40484c0220208d523e2d49290a84f600fc939593ee55a1bed664ae9ff7afadcee736abb797012102a0ae2733ba6e05948d28a31d7f3541bd461e9279db1e5b6b07ac8086b9a5ff69000000000100000000010131e4a0a4fdf9e974feb89dc90ecf9d69fabe4b50247801260fc18945201b51f80000000000ffffffff025b470100000000001600145655dce0979cad516648c453fd5bd900f1c00a98100f0400000000001976a91420696f7ac7f78a2771d4fce9a51ea8c8abcee5bd88ac0247304402201f33fe029655c2e3e1f2534df3bfc3417adac2a88d3c4150430c6306007c3f47022026f62e58065a7f311cfd657a410e286610793db84cae0ec6060166154a9832ed012103319d3bebf5729115cf754aa8b7164ee0f25db473e4b0d85008714e8df06a50b4000000000200000000010153f826019b416c7f355f6ca7398e0c98f0fa44a1fe48f978c373dfd64f935d300000000000fdffffff05c56805000000000017a91443557f26802c0f2b78270315b35fa85d70485ab8870d43570400000000160014cb275fc303754191bbb749e3597ccbefa31982b74bf305000000000017a91482a9cbd2d11abe8009c8d45b92dca73669b82e8987e8287e00000000001976a914aa86836906ed1be8ca4fc7b3d64e77ec36467aa588ac19c20f00000000001976a91448401a4fa552bad2f3f4e25052e2fe95677ab15b88ac0247304402203de95a1f3935afe5558d1cd8b5b2b51385b0ab1ce1e001868bb16e9101a4ed7402205c62ac4415d44077f27b553a47a7b86224d122fa6bb787310bcaaebcd9fc088d0121036a91ad282a53d20c63c5863b664d44fbb88eba459752c43456d8bf97406fc10b48a00a0002000000000101fd33ff5b01a89332ba020af978a4da6dbff3d80a44422d46431d70b3d9c793f80200000000fdffffff0220f70100000000001600141926acb1990e554a7139db32ab65bd1fc790e40d5ee9060000000000160014135b175ba618a4057949636af66a45c3e331a3cc0247304402202e61fa454ab079b18546c8735a06ee9b943adc3e510fdd7f571c819c618393030220138030df8e7032ea9c627b0c0201d9abd036b9a99b1dc760d791da11df69925c0121033e4e20e520e6a3ad9cc43c751b93b0f8b4889eb445f2e4bbae23e88e343acc6b48a00a00010000000001012d9c3e84dc2df048aae8a96f99f4acbbc1efe01dc61db5f3290ace94ae3fdddf18000000171600148e291b983c87c3d04e6cee3c06e44e0bb85240bbffffffff0218ab01000000000017a91417ea704659269d873ced41580b23e9c70db520ab87b02900000000000017a91495be583589c5929489ec58ee604b2f5026635fa2870247304402203a6645f87cb4ddb0c2f2bd065826c8a95dead847cf19ee2731dd7d1b35a75b84022014a1cf64465d0bd319bd621206431f514b62c744e12afa58d7bf343258ea4a1001210205ab969de2dc9f1b894cffa3bdc51ef626fe78d58ab257c6c8485a5a0c642f050000000002000000000149ca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3500000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1800000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1a00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2500000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0e00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0f00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0400000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1d00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1100000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1c00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3100000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3300000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2c00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2600000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0300000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1400000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1900000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1b00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1f00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3400000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1e00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1600000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0d00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1300000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db52500000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002240300000000fdfffffffa7489fd391d4c4d15b52b31c3d3fc2e287fd3a7e8ab069a4e5acd3506e11e5d0100000000fdffffff071fd817e815336d4d978536c09f6bc68393b578d0ae0dd021174b947a6400cc0000000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1600000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0800000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0600000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1a00000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db51700000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002240200000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca0500000000fdffffff42831a047bcfa604e398765d3677ee5512262aa322100efdcd9aed6614c203830300000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca0e00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2900000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2800000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0000000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca0900000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0b00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2300000000fdffffff103f3b30249b6b48aacedd8ce5624347c0fd20d1f9e306c6bb40247c3c8305490300000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002241400000000fdffffff8ab78b26562f5af87dfe52f90ae7d7620a0b2ab197067137e149762aec7dbb621800000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1d00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0500000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0100000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0a00000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1b00000000fdffffff103f3b30249b6b48aacedd8ce5624347c0fd20d1f9e306c6bb40247c3c8305490000000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002241600000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002241200000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db51a00000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db52000000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002240a00000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db50000000000fdffffff8ab78b26562f5af87dfe52f90ae7d7620a0b2ab197067137e149762aec7dbb623300000000fdffffff8ab78b26562f5af87dfe52f90ae7d7620a0b2ab197067137e149762aec7dbb622000000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db51900000000fdffffff46f2b708000000000016001411f31e6d01cf9c1cfc61b26ec66e8c3a7d7b83a24fd10600000000001600144358e6403faffb4a81cf102d9537559385d3a1ef802303000000000016001422806d183ba68f24ef8d7fc13c4bab20a1a15db75566070000000000160014bf60b46f74ce722f1b624e7a0429649507639fbc4d2b66000000000016001441479d0d6ca0a5949517db8a4d8a0beb9d750f43feab0800000000001600141d2c3d5e4d1c969fcc82c6a77e43c1aa19166230131408000000000016001452160a63584cbd98a6b73a7e3731cd12fa55e79d7434110000000000160014249e431376b96108f1ef9b09d33cd52a0ea9db5734b70800000000001600142a31de92ba5c16a50bb971a940ac2b9c0cb3b3c6651e0a0000000000160014e6a4ef0ed1503c21921af1a2ebaac8141d1bf59f22e7060000000000160014599e87915498c4085f8b11c95a3b6da692f7d416cfce080000000000160014999d1b2e143268a56d8a2fde873e5b2f2a8810b20b1a0c000000000016001421bd3a942ede93cc89ef0f8fb09aec92d026535830aa0800000000001600140940ba74005ffb1b37e6240ad34f67e4777fd569375c070000000000160014e8a57f565099772452a9ff26c76aed9518e73cfc285c070000000000160014c0e5133aa5f2d602597c0c3d39a75de5149637495bb3080000000000160014b3cb7b3fceb7c523f73e76e2313acb5768e8f8849720030000000000160014e2f4bde4b844b1228e2aa1f1abbf5a9550cc6d9770f8020000000000160014e0c5828c917e111e7dc3a8365f81408ebdd67fbf1f6d140000000000160014559767fa15b359c2aab515711a73ea7f01311bfdfd131f0000000000160014a0f97510eeb47d38854b2a32418f8ffce14dffe8f934050000000000160014e04b583ae7ab6a54dc0d988d0e3c1bfb86137eaf771f030000000000160014c5e98802edea2b5f7b40a5e8ce4dc4d0b718c78339fb060000000000160014192c228cfe30f07c7e8368bb23880bacfd63d0d32da008000000000016001450bb67daac619ef48260a552822f823d0365b60d34b7080000000000160014b617abd87c5f103a8b31b0bfc67d0eb627dc89fd641c07000000000016001460ad2f959cee672d5de4442878f7c94c7036cb7416a7070000000000160014599ccc8553e3cae67179cf6af49374ffd569db7539fb060000000000160014690141d09042e5c8519bcc7b888dd5750205cd601f020800000000001600141716e6abca9207fc37898c015fdb55b03ea2c74eaaa10800000000001600141b703c22a26d38a934c447068c7d8d6555d85e89289e0800000000001600149d2e489f7449087d59e297f22070068a85d4ae6913200300000000001600147c6edf289097d4ba8807dbd9568dfe9261d3be45c7e6070000000000160014bcec883486e1ccc0840ee59b87d4b589b12b7df365650700000000001600143652182f3c0989accc923f3b74ec26e13059d81ae956070000000000160014de0dadfd13618f5e221012347e9c150d2df73dbec944110000000000160014bab7432bb4c53cade0dc91b86039183f7dbab3e9af81040000000000160014feef5244d98bb97c0937194d822255c952e4ce2fa95308000000000016001400710466fd25437f11b4b3e4f583161c4fef871e9b5e0700000000001600140d1ad2a55d7a96e4b86a99b8f73b15e6f895991d2aa9080000000000160014633a54a3d2008471a1ef8c31821889fdc034961ab56a040000000000160014a238314574fdbe00d8891182beff644d6a55af5c464b080000000000160014de9a2726503c6f82f3fbadbaf7385e81f30a524d69c4070000000000160014ab60df490c2ded163ea5b4b7c1af1db7466773db67ee0500000000001600141b1bc224a1bd7e9460a9866deec8e3d16e299356e252070000000000160014faa38e68f2dfb0349a6f729280a10410ea62cffa649c080000000000160014ec97ea38f915f27457598b034be221b20f894310dad306000000000016001423cb284a339cd2438895679f7f27d66f261c7cb8a8510700000000001600143f090f0ebfb1002ac1b5dddb8d5e3de3e51ce9cf622a07000000000016001415bdd90ac7ca8c7d5d4669a2311c8a870c8da83295d00700000000001600148627b22b567d98694c9b32768075751385f2bd759dd707000000000016001434c9971204a4adb080f31ba68d1daf7dc00846de22d30800000000001600141e948b7492f965a2ab68d2cccfdfe80c927a3366985e07000000000016001463f4e4ca075cbcf0956b3d5f680ec90bcfc9ac42be641d0000000000160014dfc968cc6c13400a5fe6136059911990af5039bebc461400000000001600147ddae345193f94fe476ff19bcfb02d2396db53ac304614000000000016001401d7791bf1113ae39769ef10762de5b55519030b38b306000000000016001440374c30204a0e0b347994cc5030e00d189e613f254f1d00000000001600146348284847d7465b33e8d9e1d8e950a6c1d9316b959e08000000000016001448e2de74c81c0a46a9357416559f68970eb6572a7fd4070000000000160014cca747b1139f569ff60f8a965b787dd06dcdc9220aa90200000000001600146ac0801868991b9e70030753ff89964ee0c1c48165441d0000000000160014645c1dfd2f8d1c423e3e292a9c0c274dc60c74b02a9e0800000000001600141d26570da4d06a3b7ac941da1beb796b87e141926652070000000000160014fe76fcaf2a629fc1580104d2c03cbcbbe26327c574a00800000000001600141de75b8e2bd26235ef5b1b952b14cd7b5f424bbdfd9d080000000000160014a8dc5df46dcabe519f2c4a5dd012bfa4c100a90c0c2f0600000000001600147c7ab2ab2f0ef6fb1424980fe1325d4eb62e93cfc726010000000000160014169ce47ad98367758653c983fed476afa65fa21be1c00a0000000000160014d562b3f7c153140ac91c66e0e1d5f1cdc7787d220247304402200852a27372cff9d5dafd44aa1d263f7b90e688fdf5ca2f657408e1ad0278b0a502205b2469d2e58759dadb1af1a27caacbb5a0e96d624a2d2a970d66a20e1798f531012102a9e44cb34e6023581a0d21359d770346960404fd7632a89b8764d199aa209cea02473044022041736287eafe528411e9b9ecda88ab10b56ab95b2dba6b1f45f5d13932a4d8a702202e5bbb5916c4ee45b20f7c66eb5d3ab12c7af15ce2d13c0c7ddef910b97d512e012102f9748d54962fb87b7337f781ef85cdfead8f0492d92493593553d66ad540f4180247304402206520c255caee3f1f6c33b246f0af092eb91e6e50f2a7e0d30f0fb2dd8cef2d0802202afbbff3da3ac08fcd9a66237b4ec7166585c8a3c93bdf0092a0a211b0dc904a01210342943231f59578be5adffba894be2b05b6aa8ebfc3b6ab65d5272a84a25f34d40247304402201e57c4e11655ffd9e447def35c1cc9bf5dd273a239198f05ef98c78a0d1ec78f02205e4d520645c65925be1795deded99be0158df66fdb9fff55ff5cb8c2f5d8dba60121032737eb7306a846d8221090d90e0bee39a2d34c6b5f052f2f6245f0715b4d76830247304402205f857d455c01cdee178cf70d0776d9e1229fbfc6d11602a93baaba3e50551d0b0220415efd48006f5d24ef8277c314a5a839ad4c44afc251c6503888d12dd39bbeec012103135c3f5b56da754888efb16bdadbfc56a060c4835635f851e6f824dd5364fefa0247304402200b3bc81e8123c96e7ff5dcb3ee817a0868dc282af7b47656c0be6cb322f5c4950220408c53640e2a3d8b43383bcb0a2e3ff33931112e9a0faf8ca7bbc3dc282b21190121030e8da0fa3fa8315399a8d34a910eafc445009511fe434422db1de5f68f30422c024730440220107b061563279c3332e69ea039b6b95ab39e5372a10dadbe4ab5fa2aa224fef6022000e3183ea9fc73b0453ecc2ccda43310d935187c87cb41f3b680d436e485f1300121022099ccd112c38bde427ad41f5748da38be875a438cd08965bf1fb159f9e89c640247304402205def2c764528ed526a151fe26f314a721204a2000b121b5b16a85734e5c6c4fd0220719d768c3d1f9beaa908876eb84f966b42ead7b8bdfe3b683a8463d37525194701210261b0990b68a2bc70385dd9e0b2e15076d8d7a52802bb722cd6b85c8836186dfb024730440220181c71ba6a83e737a35ff02659fb0517428ee71d83b2bc65ad16d9272e78a351022065f4e4e6454d40b7ee3783d2ad5cf18c95f1d2196023abf7215f1a9018438d3f012102112ca74b90e74f1deb4d43d7692fb4a3ae2dca1bd80219ab8d7db101828e40cd0247304402207a1173f5c2842e1cfcae18ad5d9defa0f882356155fde2f782a213e96b7244e502207341ab2ea26693dd4017b51d9fa7a2094867b24941e41ba0fca0ddb5eb97535c012102e9e66c824455b1d7d14a1f1b4b9c50cfc85c2c2dd4c12944ac69e9a487de50270247304402201862da5c14e0a083426d6ce1ffd3fc326fdd7ac436e7941df29272503e6afa63022051b1ec6ae48c6020cafb621d6eb382282b9e6c84c829df38bb2aa602fbed06c2012102795a2f2a2d828d5732d891e962d1a2eafbdd557899ded99693b9b82dfe0932d80247304402206705da075e3fc3fa3506b79e06b7f8fc4de8f20457e393a5a25250a18d97301702201f5c221aef325928f9820e9d22ce4838efd1c706b95a6bc15b81b2261f56e2480121032445606486b2ec4db59c21971711f0cb149804b57c18caca156db0bd8c312fa402473044022036dbda892609d5b88b8de6b4472515f9983972ab2e8d28a3e86e80ed1b17bb2c022014c94f4e1770d0eb2134d57f956ba71f32307f551cda865192d117d01a75cc2f012103beb5d370e151d9629336e0d990eda181b0d3e704d65e70643e95b127ce9a76920247304402205ecb5b6e8b222fc817ec748d6a7665297af5e940481d01119963485c63b9240a02203aa80b8126040ce8b5853df7686f8fcb373ac400ea41d38ad68fedc3ad44e34501210226fe889bc9cf38b57aa4173782bc9b906bc9c72847296b7b3674045efb5d567702473044022044afdff7a474dc2b39823fd44babca7b6df7a37eb7b09e18e72a139c1e20b6c002207ecc5f20b5d11a7881fa73888a2d80d23eaf0a53fa13a8388a8e7943a912fc9d0121026d465b6b7070c50a0c512bcb3f1c5bd77235ec02513d14fffc265bc9a943ad8e0247304402206897798a17d2823c07282621c9a2b51cae00e3628f0e82066a41cabf9da9fe2002200f9f009106c5a84066eb2cd299f58172fd2d0493fe937365e11d124b9ea750ff0121023a77c586a32d4814fa7c7c0ccd168f5f85a38d41bac42d460531185c051d39210247304402207aefe6e6063903502a757debccc061476b22fc07255710e051a09ea1294c983102206718d3c805859dda1b2a3946da5c5b7421d703594c969e98eeff90174eb2d2b0012103f8e034171e93b34a50516024a91a090fbea0fdba58370458097f5b03929e96c002473044022049c1b06b4836c1210ba54a8b040219dffcb5258216147d0540b3380f45cfa24f02200d877ddb0ebc7099504e27041fd75c7d2d1cb4e91d8b7ff7311a074e3cb6cd510121029e7ff1c88c11d8405dbce28d64032c919a4c8f62c055d460d560238a5944a3240247304402200fc59ccb7e79dd2399c04d01e22970e003425628d20dea15291253efacceeaeb02207bc9a660b43e774b0ef8857cf64b45c633742804f1cb9a6c34318e297141a6f8012102365d60488b8d3961d6c6af56d38e42c3198053676ae2ba7eb0a05520e0484f2d0247304402204d329c4062a65189052ca0671a758463f19f07d087a20b264dfc212d88fde62d022073924d5433a51b2f68f6afb54628881ee379a16226bb414206a092d67a835c6f01210331a030319da6078e8a8b7701e4a24d132dfdc892f3ce793eb35c5d4e188688ae02473044022044e7927fa43eece2528c0dab011cf2757dc4f582708fc84ce37a29843722143002202e397ffa6461b26d5d4455a46369debeb26f6ba37c091e9b54b1e8a85f7a85bd012103ed72a72b350d4b52d53edc3e6895a41d90dd2b2b06b6382e975c833f2986746802473044022073f4f685319a167f0f471fbed97188cc58ae16555066dcd9a820e1f6eb699fbe02206e26d2034dc38ea70c2eb25f623d9e379b11aa7cb293a01a5fdd7a85284c6f240121036b6bcef1b43af829fe9088f0fa19f523f2ffdb936181f5fed7a509c3c1fb406e0247304402201a45c843ba972acdcd3955b0ba60bf5c1575c4d24ea33f1cb32f9c084a9416fd0220211907e7ffaa1e26d77c2c5e1c347f9295060851d837de3b1f6d76ba9c78d5070121030e3f9423c657a186a47f2c624ea689e615396a32a52fb068506f8e157d966f5802473044022044318b10cd33041348f4ee237c389433c79565930d7660e5f1ef8fff7baf6fce022048651d051c8ef86eb8fc8f19a2a41038aa3764d09469ca4230064019cd1e38f40121020541871a835a1213be8efe59d9666b01b49b7b619957ffea92217addb42b5e2f024730440220061057c12c534ea645073572c0ec60d17a12dcef72e9315f9fca7649181c196602206e92b38c896269494434ee9d5099649df06e0b064112c4d8177b3fca3bb4bd58012103c603fea3d928afeaa2ba6c9693e8d3d85e9e40f017aac90e10dbb833b2306e530247304402201bf17d0239a5f1b9ede34513c1be3291ee37a7c7147bddd037494f112648d15002200e2e87664b91eec9aeb1c7c10e5e3b01afe3e07a98658e7c252a56371ba0506d012102e7bfcd123733d334f62d80789edcf84b691f72a820e6b30c74afe562ecd93a1202473044022074f8f72153649525de3e2369b5808935a6c564577e72ab454a59bb9ea628df1202207f8ccf3dfc81a12624564c176e5cc7789a56e90b9c69dbb5a9ceafae45973f200121021c667785c51ef2173a5719d4dc61e5d2e8b2ff21f0f5edc861fb6b5e171cf82f0247304402203d4666b1485e16db3bcd927baa567cd543d43fb380378458a0a2353602ea71bc022033433b03ca14d16a6ab1d3f2f10e8a0277a95f7f9deb428b6ad5f98e320f2ba3012103f27d501cbd14e6c934b70e89e418503b40fdca5d7fdd183c54dd9721220c100b02473044022031cc08053afd18d31b901992dd290ffeec42ae0f4de63b6d8f807d02c6a4e93a02205985144db11dd49362b76f8de21da68a8625d42f8192cb0961d2ad1d7fceba52012102d0cfefaebeda95a1225126f410240880e50a7b451285a0724f998c7657641bf402473044022024646368fe8ba806a3fd9b530e75ce9318fa2c75c0a12e516c3b67168a5a759a022018bec5b2008b08f44f95e7df71a3f4423e35917e719161e2f218a9b4d67020d60121032f4aede840727d37f3dd0722c04d70574cbbf12fb107e018838398b07ea737df024730440220143e7729dfb5db877a05fdc4463c1fd3f7f9d7d79133aaead4b66c290ba625bf0220533377bfe9d83c9aaab448e3093344f04bde9260fdcaca7b676b818da48c8c05012102ccc317eaaf6c401d779e7e48dc9c1007ff02f5c3870eb42387cfed0714403add02473044022039b7b8013286df8d036652487c4d210bc0c27db4d3ab739b193fc6d2cc64f37e0220533a95c53f4913ef6cba9166657deca8cd760507903601ca161cd843d1dcac0e0121028804b4f4a2735271befefc6d5a5bca97ed12bac4b8ded580a86827e18db89a730247304402203a538702dcacd0502edaa0fbb32a0287f69ada478fc9070b846831905e2607b1022024845a0d13078521da44fe1d48e2b6be065da6a727d91dd8113140d40d3751330121039e3adb7978a73e9adcf789b0ffdaed326e1eb660b341c9ae2934787905f730a1024730440220039d3c438a14c889a31512a2dce8359f5f4033f99a2694e04422aaaad6effa220220548589c3167c3d70bc41e62b7fbb5c41603b6daf8097c96ea13ea0c7be68bd38012103cf8dc0b8b834dd48712ae67242b12d9b4f36664ca8c30faa4fbf007683aa9f2d0247304402206ce1206c279a501174b2752489996b424e0cc2d16b24fbb91fcde55c4e3d0e7d0220615098a6b54b7fba73caac781ebd6bcc46d58363952770e56839b32204ca393a012102b6a7a55d9d2a54de605281870d5d3cea4e4eeb7dca7467e547e37b636614af6002473044022079da50dea624283ed54d9c6182888c4e3f30f13df70b290c726b4af9287fb98e0220752b7e47e0d5a15dbc84b115cfec3153c3a4ff47ae169a879633129e9aee6dc7012103f42882c6e1b5a93fa771e763600fbc47a1573e9c2294081754c6905150400a3e02473044022012de78e4dfe7f376d4805f8bd95f33aae50c1e0ade5c7a5bef2d672228c262030220406797957ff158c23201d1b5d7a827c6ff2d03114b8ed7d75c512bb7904362c4012103b76dc97d09232d56f2ea46fa43164771fc6039d577db47c250eb66ff5280f4930247304402204d08e9701e38473c369675497aca761956b8b0b3650f75ee923cc17e7208fadf0220630f9716c85e9167d6a3a0b725a4bd851490fe8a117eb1633f4fbd842acb3ed701210224252fb615cb430c73221ca438ed75853deb28ff5886bb81835327cfc462764902473044022053894a458ad7542ede8e1cd1645dcd1d73c58031d834e1d846d0eaeb26ead53a022071407255b4ff05adc0a546faec9e8ee3ea611dd6925f6484d681c1da24f62c2d012103eb42d1f77cda066fc6816f6482cba99c0f08ab694d5097eaee465a5b8319ef360247304402202cd4ad77b5bf14b4f0ba17f2a1e68d2702167ef4534d236ece554b3ae129433f02207aaa0e25b673ff63e9902750d39c105845868e05ec91c65d0d7840cf8571b25f0121038e931f6f9a187d9856c2df65eea3e7aff6b6782a83f8e0aa1868da7da4f2ecb4024730440220210b6790e11ad933f2bea88adbde68844e6a12ae2d9bd8b85de320e9cd1560b702207cedf7a8f1e8fd8c8c2cac55432365850c7daa568be83b2409f14c2c01834826012102d4cbe7b4b320428fc18fa496772903bea2dd12be8a0c26ef93aa053816c1f2ca024730440220794cb4775ac5537bd796a12b017f91135fc03aa5f4ee1f0c2a73aba2c453c309022003651afc2f725eae928e4f99abf3c9db71c8a0d02799794bbec643c77dbddeea012103f024b8a0792e347d7d08dab78aa25edc72011aa65757b19686610bbd092219b00247304402207c1b605bad97f8148a7d7fe638097ddec86292d78a250ae3f5aa6f930e5d127f02202e2cebaf29e2d9d9ae477af91176594012af1229671f7ead8cb415c60889efc10121021f19594eab8c786acb1ec8fd7a11c019da7c39dea178793482dc2ed618eefdf502473044022059481dca440609056870701b0b786e9403bb0868f994141d23073165428516b002204e49067e79e4b07cdf84c323f412751253c50f30b55574ad8ffb2b1e4af1b8400121029660902b19c5ee036ab49e8a8df91fb8fca256a4b063819c1abe688e3a4d00cb0247304402203ce969954c5eedb4c65caa91879dae25faef63a5c7784bfeabbcbd490176491602207608e83e99072537fe0ed955e2cdfa750520897e0292be64ee76f8c13a10c79c0121032a4c0fa8979b654647603c36de5e76805ceb33bd67dac90256085afe60236fd60247304402204ab9a43da412fe415d34f4503997f6b6688f232b07235aa9bb4a626f5950be6d02201114c682f5143d9a50dbf5b859489c7185f0249bfc2c1f42d48ae00836007d00012102c9b151a2dc960dde15b1671c1e075a26d78ad77a831249086cbd8a48162bc186024730440220664e437b51f8197b4356235cc0f7b305f1acf5520813b3adbacd27b8291683400220019c1a4fc3fc8c7254ae802141518d136564a8a5c393923b36911846dc24cbb7012103ac867d950584cf52655e55f8dc11a1617ff070f125ca8f868684e5beceaa1bb002473044022030ef6466c85730225b0cc8cd6cbd756b0c22556a1091500c8c58e2bad3394a1902203316287dee80dfedd339938eed51bf53e4dab4123aa7133eadd0f4f82007ab710121025e683dc8ae51bb80e2af48e7ba0e2412cf11763242328fe309429248effc2e3102473044022026651d9f8f46b202488df94bb254520836ea160bca27ab68dfce3c7bf3764ca40220434f1cabe33579b1e8f5240756b79336537cdc6084d7cfb0fed79403fbf13b180121032a98bf7fd880b2eb9117096d3091f2c0936de87e379da7bcf846e5e9beae3084024730440220263752e1b1b5aa54440a8fb1f44f1bfe4981fa49f6eb81b01bce24e3390b7dd00220640363c44f145248b74a81df98694e8ed397c9c3abda43c99ca3aa6cabb7152501210354a7fa32ac79bf6fb94ce2fcd5cd55217f0bb4475ff2086196e0ab7da4d9a9830247304402205154d8e4f3e145319336c7c6c6ddd5c726f238f347f500903d60717948913407022074e998eb52f456b2ac7041bd9a58b6c3c3d66d94d64c8be00900eda8a1151ef30121024151eb86493ca66a3dd3dac604da168ff10e3e9c86fe0c093da04c63c4b91067024730440220387649768b868045d019d913129ed4f7ffe7bf34f55d02cdd6f2fb24ab822b7802200d067826633ac6b9757059b26b6df340aa7ac467c43e188de7ccbb9398855cc60121037241e72cfa6dd38e908fd19eebc8d1b1c83b2ea708e2db91dc9777ffa1a2a7c602473044022045fe763042eef95e87177a2aac02c2c50870cae171aca11c2f718c698ff06f5702201602978b5ae0233aef10fa70c697e70feba0d50026a32afb8c88bc5b57a16c51012102046ad5836d520c9485285eac037f669b9ce960750532632b6af8a850d4df7f910247304402200f771502d0a30d3d57074271f2da14ad00e6a1eb62493b02dd8ff1494e2c7ce9022079156555da5360d48f96285998423f78646f46d59868a75132fc630d924332c701210244ce6c3eae7f040d03ee1f4fa23fb5d2fce5bf1b32aa2e62de68473ee8bda3530247304402205ab2b5d129d5acedf1fe8aeaf64f601beb5456c5ca43ab11611e3f007727fc9202203e17357c2ac8403ad5e955f4aff40016b874a5de9afb8442106c0e10a03446e5012102fd62c8fb7a1ff2180a9ce2bcd11707c2cc976e9791f8d8f89195456d614ebe9f0247304402202a7517248949fa7c73cab544377c821adf5bef50431c87a1743cad209397309a02201dda699c8b6a2dc5d285d273dd22e9ba30068dac6ad444917f456e45dc93c85c012103673d4b406a40277dac3952bb8886c6ac776dc62a6fbbf3eaf9d03d48fd6824540247304402206e67571e8462b02046264db066117d72f08764633457829bb05621d0697fd4fd022012931551cc33097ffe7cda0c61480f35d66a253ffd1cb3dbbdfabe3acca26c130121020bca41040ae08a5d22ef96fcf72fcde3da9714eb46450b00d560deb77db4349a0247304402206aaaf8b8a6cdfc5b62ed43e3123d422600975b5a249a5eb2c0d069efed79583c022047993c7d56a2507be2daad831278b069b617361a5a5ad9563ffc99e31dbf89970121039a03ac21b0cca21931c8cbf20796fef2f851dc409c8b640eb7854861cdd57c780247304402206414089a8b1f7f3fea34d4ceb5ebcdcd5f57f4d66261ee98b4c2f9bb0586ec2a02201152280d477ec396132fd17a7b53ba5eaf43da5391b1f41ea15543db45242ee3012103f26ffbd4f302a8e83aeefa5329071fb46f08b9864a9a816bcfe7c4194a2a04da0247304402207194525db08eb58bee2e65cc010509dff6006c740b2198226702ad7f1491604902206d476b6c3ee44c91d57dc12e00ecc32e265c24a67a88971f08c60f7a07cb3fc60121034d365b0b88c96cf6e096ea416450f22c3c149feaa626b66f33902ae0f0ec269102473044022040222a1a9e307c27d7b305cb98f58815538646f0dccdcd28c2c034ffbae1983f02203df06aa62437ec276afe780d5af0a8570257dfdf404effe9b9b8a495064bbdf101210388220e07b822aac4f94936037302cdd3e6d48eb0ff2e4480f97a80c498ab197a0247304402205328d3a4431238ff24a323765c749ec9765c9dd2683490ca806fe11fff64d61b02205472eb84b915f1a570b8e822a1d2361ec9abb4dd9047587d6cb44bae3373508b01210332eb74a392022e5a3393cc55a2b6d8e10dab11ac389746a42f076b4ef1c3249002473044022044bf0f10f4fb2479f95145867ec2324f1e62370028373463c487d1484ce322cc022024a7b2f44965354ed3a2d7f4e5329460f4dd07a02be12162d75672d441d456c8012103b4450f0e71451a1cc6acbc0c6a2e06ad91bc71525fc972bc9fa3b1397cd6ed940247304402206ba1adb588996444b79ad4003e485ba979eb538ff30f8601f29eacda63ae7b2802204f3a312fbcda0b33d77c9cd02806028f579c3aa15c23dd0175275849b32fb4b6012102be09aaed75c9efa0d501a6dbb9dadc60dfe4f25ead35acbf75a49e287657b41c024730440220562420dbbecd39bf4a708c102222ff1c823920716ef662947e4b57a279f2eecc0220443297aa9e31197bd4f32426d7b061fd1bf4e40f417592ac88ff8a4c0854738d012102d88d59d7e672930456305584d16eff81dc2fd787b20d38e776ca511eed46c0350247304402201453cf2b5e334f7d0c83e18e2bb5d446d6deaee47652dc68775c0da91c71a4d30220353c136aa02874ec31f922084e8f46b22914d57426f87bb7652b93c1ff8627ef0121037def2f9ece26975c4e9f5667efbbd3b0964f8185cbbe11e4312d6399d80c1a5f02473044022024352f43edb39e143a2ac75f1be6e98ad803a6e23170d258b2bd6835676eed45022012cf69b3fd7b920fb4217129261d4ab82514acb71836d6ebdc75d5c814c4e39a01210317355406f878d698f3b695643d461e38f702f8aa55342d034716acdaa622ccb90247304402200271619d47b273305c4855d1676ee608995f93303b6f124f6c2d316a257c5ea502202256addc33f04abeb617b24523ef61fa3c7b8d7ccf42504c2292e1b13b5e1a31012103588f512334643a5e7a30f0202dfdb980ea7a9c9f52855b451f4e940ec587173502473044022039d4e159646e6c9f7a30ae5053a03e614a0f2419ae6674dfea6f2625a79d99bb02207f53fb9806bc0338f198aa17c715994d1b19c7dbe02f32b4eeab6148f8c760ce012103ff338dba65bc0d9b59f71b6fc9c586f47e92b3689ee9cd48296e77552bc32f1502473044022075969146c4e63f375ad21678659284078257bb37b987b1508fdc3455858e17c40220045437eec9c5cb62737f4779ab74c4c9823ff3037b8fc30946d6143318d4fbb9012103851950b2613c4ae03d15cf641e72c56b156c7a6a741b49be9afdb8dd821107ea02473044022061c6670e2f931e5560e368323bc317ed1b5f0c1517baecb2398c6eda0e5245a702201e3a41b805cb5cac736531f6b19e7cefb6fd30313b570fcf79fa3eaadd3356dc012103cfdf4abc14752c7bb08b55c81b1747060cf5cc20d1f0392095ec9e8e3da0c5b902473044022056d63983b58e455621097d34445f4ac3200c5446a8e3cbf8eebdadb4bf54720a022017c0ffa72b932a521490b413340e5e672ac19012835c383f4af6de1e24c6a70c0121021af0e05cc4369bf2943c2f06b15ddc6e4562fc94bdb6f0a9773b44cab9de58140247304402201e582f64c4a410f0fcedaa9bd6ccf1b6e3c8270b02bd812d076ff86c51f15ed40220462f78fb0c6fce05a1e660f6e43f55daabc8cb2d9a35b2ac2605a7d4182ec4d6012102f49274275df07ca611245ac68b777b0419681739117c3c70b9210f16d81e98690000000002000000000101625b5dc266becbcb9bdd0990b4ba5be17175654f9b10c9a74563f46f0a2459570200000000fdffffff05107800000000000017a9142a791522bf778452dc7515bbb031fb75edefbf8b87bd7a0000000000001976a91422e9b1c36bba1e6bf78f7e3aee4a91a46f27cf9f88ac2fdf00000000000017a914e15b9bc99e009300d5b27fa367759ea92d63361b87692c0100000000001976a9143429336549b47e08a160378ddfb7f4c289f46f6188ac4b4f6c000000000016001493dfb09b36f87f0cf62402d45223a63feee01547024830450221008436f76131ea7eac070c56118e749397b5b3265a313b6d3a39b51ca829aba2e402205287dc4e1f709b085f5eac406f51baecccc52bac1ccdcbb042ec942bee927ed8012102cdbc485ca478f4d9c2fe4415becd8e48213ded1d95efcd7461c2f50d8659b02047a00a0002000000000101dc6c028fe38eb1220e1947b04b7fafa0d3ce8d37f6314e65b66e1360db3bb1580400000000fdffffff04ae9900000000000017a914e24618aff5694e1e1d3400f77d0fa1e0ebf19fa987d5d700000000000017a9144f69e703e611476e703a1774161a44f3b504d9c28769fd00000000000017a91427c1af2e4fa97219e0a170ba8f49ca8b125afd0e87b2da69000000000016001493dfb09b36f87f0cf62402d45223a63feee01547024830450221008473b4798fb96aed7f3637b905620ec11740d258013c921d94ac769c5e92fa45022066d9feec5797cb00472ce2dae9b0e7c59242447515631b7d009aeeabf8472c65012102cdbc485ca478f4d9c2fe4415becd8e48213ded1d95efcd7461c2f50d8659b02049a00a00020000000001048eb5203a2fa142235e5ddecb63033fc6140bf752025dd8c2fe8d294c576097220a00000000fffffffff399de56c4cafe0a6540619494cd0fc2097d7bd2b1d4d201d3cf44953ecd9da80100000000ffffffff13e1868559111cd548b160a4806b9f907860261546b14a57ff769b59a20e8e0d0100000000ffffffffc6d3b69f2dd1e566e92a78ed742ad096a8647bc7508f8b42f5f69fec43c491100100000000ffffffff011d953800000000001976a914d8a81ee2f17ee3b2038e339c2ae73287e8f12b1e88ac02473044022044e90c5777e5c9783a560e013f995dece57c3e06963cefc6e4994bf08438fc2e0220541eb6101bf9ff9039ab9fabf7c1cb479a87f8f01c5857ba08132d3da24a4ac1012102a9c9e9e72cbdd63934d3ddf17b9af6e172d07e21e7f700ba63d81d58def1fc1f0247304402201f7d31b6d840d6a8ec0f37436b26e178ea1e03f2a8772957db0dc9e7ad87e4e2022029d641d5add052aace19b5e953758656820e87815aa52acd433a4f1d1518c8a1012102b099ad781fc43e65d65ac733ae48d41473df1796c746c1a09998aa3eac4de10902483045022100bb49fff85da481e8d40b2ad71d3506d628f78c8eb2e3087614aa8313592ac3c2022002e137446cc61584628f403d40e856e2099343a1f7b2649db9f85bf8b21ff3a8012103e6c6b9436ee67199acd3d523b7dad1b0bb7b3cf7cb85cde28e4eb1a0436d692202473044022079596afa09adef5bff0bb317b952e4fdd3eafe98b6fb8d15c2d178fdc56cb47402204ba0e736ce2d5b959c1ad31ae7645d020b6a11721459536269a2f230232dff5201210373e86119292f2340439af13b18a5bddc0e9f3b8a68dd9261782b6fe7b851b42a000000000200000000010906a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718862100000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718862600000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860900000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860e00000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718861300000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860100000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860b00000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860c00000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718861800000000fdffffff0e7e1a8b0000000000160014d604f8e981b3309beffbfe6abb4b1296c2ef0a2764486f0000000000160014a6afbe6c32d1978a557c885e42f39d91730666113ee56f0000000000160014e83f31b872fab319c82461200b39adda8c9d88d693ee4f0000000000160014a2c60cc14032ff4a60ddf977f89f8791d58473ea16ac090000000000160014fc7aa5ad65d8ceac7e6c28087f5b0a7d42c9a21f4bd8090000000000160014fa532c6c706f5b716da27932c3b55dd6461b5a7998d5090000000000160014faeafe613e73cd0c62f291296f1b619224b3de2950d30700000000001600149cf40e4ac8101d0101ee7c41d40ae9bf551ce96bbdd4640000000000160014d9212fa46d1b3a4aa5b417a60339d3b7b2655ac4898935000000000016001490bff31ada82cb64ac579a9a774ab2ba29ce5ae0137332000000000016001468803961d7d2a2d6bba9a1d0fdf70b054f8ff9676210130000000000160014f2794a4024ae8c5013b53ef30c27d4a8635a5ada80670000000000001600145c4db032be439f5fc68a5bf0de989463f87091ddecfb330000000000160014ddd96bb2c9afc55cba12bb484f328d9caf5955b002473044022017301dea4c6ef66cecb93d166d3475a4fd45944f2556589d5f923b2d91fc21f202200b5c77cf620a16168e1d4c0b5190dd4921a495d0e48f564b4158282efb2bbd510121035d49901328c40b0646dd7c6675fefa4c2ec35bcaf24c3460f58c268699fe811e02473044022009c7f97c4f39bd061748a6ee3039efaa4367a39916e07d1c911587fd89653a9c022077abf394996031d663c864f4169215aea97b26917b3742929aa4e115784489b00121033c14c51bf5a02416d0b145023d1931b56b892112977bbf4da37671f82b48ce1602473044022030a84b7cad9d74906aa3d278d0dc6c51f2903543291208f1ad438438b621dca802200238aedea4d06b969dd02e52ff1d2397d62baa3fbef93ad35bd063d245e2f63e012103a665d05c3543d624e0a70d761a6db43bd788f7a23a62b658295d54ba6f36a2da0247304402205082becc6f96589ed9e90de7c322ee72c29cdfa2e5464b9e8df3657e69b9981802203f922559dbe95c32d5079f0875fce70113520c8e8eb3207ae3d382b0a464e84301210251f2c1a34cc8ed654111bbcec783088674ba60fbc2d9ccb305636ce306519e860247304402202829b0985b5925b81c92663589ab37a71a235ad99d9b2724fc584601e11bccc202207963b908a47d129de9dc6abc8aa42c8b95057192578a1452794daaf2f6e518c60121038934b952f1d6a4731104930dc40681e681f386300fa4f00ae0a426805b1f71bc0247304402203e132d63805817e0e0a7225c254acf953fac7034bc70049a414fd0fdad3a7f0802203bec0412e4f19c52616f6a9749acae9ef3b0aa81fe4ac50f97d69588f08ca28e012103c0257cbd49d4860dd6acfdf02f5ca60941ed51d21e51b3ea61155014ef3ccda70247304402203357749a5c8d7cb721ae8eb27be13af2fb012cadb69da38a6f30ae5f52d7131202202dd462f63fadfb280cfa84888c327d7ae879e565b51d9d3327b1b7a6eb7fe74f01210377b9f941bad9416369652381bbd3b75c45fe3a6e0929666d51e8c8994082166e02473044022063d2c262a784942a9d9efcb6bbbd1d2ed78401a4d62dde4042bf935c780a942a02202fc52c7ed06189155383f5e1ffbbdc2dfbe10e928d16f6a188fbaf346ca73aef012103b7ec6de3e10c296a413bcc7e6ec7e01a72551916ec099ae4778c2b9d740462330247304402207ad71a79ec3e6c8c0e99dae0849d759ed79e1ad01842ea7a03d73885ea569da9022057cf974658ef9d0de2b207ca98519dd363417c14b8c828bfc2524e4bb66a0cc80121034a063cd5110d098c66bb6404923ae5fbea24673c921dd393574c3ef0d7dbe0e70000000002000000000101055ebceabe807087cf3817cd2fef4add7b28cfb354dab684128d4faf7b42290a02000000171600146805a238ee3f393d8cf847c45d06bc4f6577f8c2fdffffff01322500000000000017a914029f5f834e35d78bbfb8695ffd834c7fe50f96348702473044022063a55798d53e743313fca393aa1ac86a44b90bebb0e0f5ae5e7a9d363b17e92202204016e7bb121c3e219088bafec63a4b15586b7e69679516133ec88e712de566f0012102a077088c89142f105c9d908bea29cdcb9a19b2cc0f4c8a1cb533ee8f509694f747a00a00010000000001062bfc6ef66cd7d668d59f849d715c5daf96fa7d66aca6077ebba7efc62b41a09a0d0000001716001413d535246846a0b561ea899f22d8d78062d99442000000001851bebcfe73294924cf8c611693fd250697be2f6382d4293b56e5dc3ef0f7af0500000017160014a8e1bf1b38178b436a8a5f2cb5eb5c46db00adb3000000001851bebcfe73294924cf8c611693fd250697be2f6382d4293b56e5dc3ef0f7af0700000017160014a8e1bf1b38178b436a8a5f2cb5eb5c46db00adb3000000006948f18f0cea68f950be9166eb6543b9da9eb2335c633c800e5326863706d7830900000017160014ecf8937b5e617d729c559b4ee98d41288b7208310000000005061cdcc135c24d78a043f487a9a6f338f08ae4b0d1ebee957fa9fd2708fb6d010000001716001458e67fb2f5cea9879f851526691c6b2c63911ed2000000002935a93030563ff4b9d804df4996bf355c5d7568dc885a7e9704468e0234e72e01000000171600141d4246b5543e3c340e73bfbb5a5780de5df0581d000000000280f0fa0200000000160014425a3f40eb3108fa22f6404017007fcbe97ebf8bbd9428000000000017a914c978162d72444173a0dbf7319c53ce5b77a4a7648702483045022100c388f32a4bd9da5d33967221e9afefc66435502417707a09eadeb4390dd01bbe02201efc14dd186cc2f2f0e0bfb6ae02ebe536480d30d0f9bdbf78c0b506d6294e290121037ff9fab62147ab2c45f19d5e3dd4191006333e34f183801f3e42b529fcac016f02473044022071b00cf685dc042e0c25b1bfbdee432d4562fc353555cc3a50f9e028a9ec3c5902204a016f6e77ba14278d8aee5c7ba75f14d3c37b9f8cd9293e6f8dc5b373010e8d012103861ff82ded12bb2882b45eb835617eff7872939f37dd7eb25ffa853428437e460247304402201bb5430a371e75392ad05f58048546fadc3a4fd9339ab33cf200c8322ef9eae70220628af33283d760a693b394cb3db3e835a7bba5f01a4d8b7008c14fe97a049ea0012103861ff82ded12bb2882b45eb835617eff7872939f37dd7eb25ffa853428437e4602483045022100a0da6b26293b7e6b550ddc1542fa9c4d4d70069b478c844611e5729f59fda9c10220138db58e12399be37403142e12853246080ec1006c6119e9f19dfdf35ada13db012103184bb2b8e7bcbfcf904fe55aa8ddc5afba0af038a7306710b2434cf3d2521eb002483045022100b2df42a32c438438d33657c4222f1e02bc719c6b0ec2a225a313e5ff1ee397a302204eeebc66de6dabbddceda2a1aad1734ae94d165dd7de6f6179d4be6b347a2d8601210363e41328db10ebde385d879b4a04d7e959749320aba84bab1f21d88add354b3002473044022067031e4ab7592f18e8f7478a4c3b5eadaac77e13692fc932d5926f662e82a1ff022000afabe652641172e5321e381e9531e0ec102b45ac047d8ba176fd9fa8b66946012103ac5e9cda2212ebd965cd1bbf5c133a0a7e13f8fd2d969838f8dde5a3baeb974800000000020000000001014f7e0d409c4052b560bb1516771dc1dff815c7f9287d90c70021f1c632be57630100000000ffffffff0240420f0000000000160014ce9a04a7a03beba0a7d32199cb9080bb10c0484ba9c8783b000000001600149c38191f20275ea9ececd2f762c450ff159508f802473044022038ddfbca788237916d28fa47ac0dd4416594566d78871f092c2ce6d38eccf4fa0220164206383e809d73babfd9f801ea3553ab5c08db55072a4c72f82d7e64a0951a01210244587bb17c3d845ae477a2fb2511ef7233e7b3e8f3ec6f83bd154be74c39bf66000000000200000000010232a7839944deb7ebfd01226e221aed6c0b292ddae9b3638800b426f699a0b98e0000000000ffffffff3d9d2b1044a7faec7c336d950eae0e33ba82acfdef34924b217c9fa379eff8760100000000ffffffff0282031000000000001976a914887a7ab629a05e7e8ed0e8be843db60c431173d688ac2a0600000000000016001409b8f3899d9228203e307354c4b9f446401ea5430247304402202a8d88e070c3daf911a10fb6d3edf8d3c08497115dd235f8b661bae67b2f649c02204267c76abe6587d36c6749480257c7c1d0e6caf6c20ffa569bad93951ab4fceb01210202b93964ed16ccf630e6d9f29dd5ad85cc9af1289157d6a3f19538a4015c99f9024730440220146ec111e093582cc1ffbfe7bba1c7c2a4746d18a26e54bd661f9440874b659f02201170f5ecf4ff65617c1379bf6cfddebb29e699105718701341595027beb9e4cf0121034077d5577c23bbc0a2685cbe025d1f535c3384a77410dde5900317ffa5ba1fa900000000020000000001012ce94cec4bc48e60f69007541601267d8b86d03f72c557b48f3b07e41abfe31d000000000000000000029c380400000000002200206f40145dc13811f79fd79cd199e8d2f6e51beda90677ad442ed25dbce021ae504bc4050000000000160014bae334e93ce33dbea94539fc3d117cc6cdcb79ca0247304402200dabedc9bcd39a0271a79d618971c84b418157339e0ce8d6848599ee63d777f6022018fd0dc8b8532b2cbc3bf740adbc1793efaad2eb899ccd8f4e102b277b2ce4a60121031dd2cf41808e6a64ad78dba60fb0cd65863ce3a69f9a90f7e1f7e36229c6421f0000000001000000000105fd06a20b698336d1ce2a2df4e78606b4f39f3a4240b0fcf244b84fa9e8e3df0600000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e00000000090b8c8bbf0784a2fedda9bbda747b5e6dd169412ec9abf8dd0fc17341c7762f005000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e000000000d38a8ea9578f04c8c9968b73e82104d49e4323e8fa9b2a1271c2d5902eadc89c01000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e0000000004b855bf7a64d6de3c7a406531f1d18c5fa0aee8d5e6a0fcc0f4615046d861e9a0100000017160014a30f2b51e6d30793b7c41c11c54ec2b52a10de21000000001325440299e6749fe04c2885f25e62d54c633dd704618a99ef23f056b0e3390000000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e0000000000200e1f5050000000017a914eeee72a290a2947cb96a900f3005135bf72a1d6487bbc05a000000000017a914093932f469b6499a6639d5e5607a22bcaeb2e6ef870247304402206a0cdd1e71aec23264b2dea4a629f421d60642f3f909dff9f3cadf56670fc72f02203013803925b84218209da348b714d1caab0d72e7f86b3e7b6d72dc36f96b23c3012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f024730440220284cc9d6f9932f8f35fa4933c4be8548aa3474f8ef205e403f0af124777e4f4f022063d150e942c95e5fedd481f4907e9305d0183fc609239d9e650a581b9a453058012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f024830450221008de5bf942cd25c49f6b545ed286fca5c8dd3d9baff4f2c3b74a5990770881e08022037b644a58c291c5d3c19ae0afb905450ff73f0614448816fa3eb61dbb00cd72d012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f0247304402205fca2aef160ee61732a043323cfec4ea95e360480d313a14233d28b40bdc39ca022062d8515aee16486d1bd2f67a23f99e52cd7890314f5a32d960fc69b29e05cd5f01210295f0bfa8f27dc3c6565b09bcc71ebc32025b22aa04b7ff1d2f72d681107a6d150247304402202537f337c50343b0d0b31bdaa9b41a0dcd795d0cfc1cfaad25b73fcff56bddc402201b12d23d91a513fad040a3c6110dd73ae8e7dd7368aa280ba2bb5b7f539095e3012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f00000000010000000001051e9a9afdb2305ad99b14c542dadaa8a3bd5929a0c78adde02f8b4169ad710b0d01000000171600148e3c44505c8cabbe588af0368905c15b18e45f21000000000c7fb29adf90b7facd7351ceba80e704843fce12302ac154cbdb7c30a4777a8a270000001716001432b286e1d33e5691cded7b140315cda22f66c1b700000000feb52fb1d30130db4106eab94b34d162278713d9d354753acf441dbea8c7551f0b00000017160014aecc07474e0f69e6aeca9e5d51f23d72bed399e600000000426d661a9600deba89dc2429cf79d6981d3a7c5864a53951aa346fc6a4443506010000001716001413523982e54cfd90c79f1229b79576712806e810000000009d135baa650cea7001aeb481bab034586e82ba6e9857e3c32189854f240050e10800000017160014e292285a78d01918315248ef960380fd72105a7c0000000002f0e508020000000017a9147b699c4a81a8451995ecc1afc9c089c456432e7b87542644010000000017a914ddd8d5036207b972bf5fa20abc83f5bb09e6196c87024830450221008312d64702a27c90d1d65dd29b7cfda07716c903a9de88697eaa3128bbab221002204999e5cb06fda57c40c31ef95ab777e575a74c583178b68f1f9e70021a56f2340121031e19a244f9a60412498cc53a2a6589b7be5721899ae206782280341943768ecd02473044022072c6f9cc349ee3aaeb766abeee469be810660e29139867ea23095bf7ce75dbe3022051cb055e46eef11e0fc34d8bfae0ff3616956e70873d34011c1b103dce47760e012102c447395a031a1d60b303ab1d78ad85161535319da0dab79418f2216cf8c213c902483045022100835fb701c32849ab2b7b92ddc6e1de1d9c82e9a2dc54bc927eb6a1809ecca2b502206b9cf4eb7a227fd73c011a36fcfe5d5918000941fd698a2a111c19a96f9fff28012103138001bb0399ab5c446882c2ca1e5ca530ea5685f395073fd195ac24e2a2ef1202483045022100fdf36987268e735d547ac8cd8859575e2fd18d9f67a59a6f6aee83c3c5fc156d02205b17c04f7e0d378c8f3c314bc26c8f234c677fea642f1a3fc9986fd53103aada0121021c39d1994f6879a31a54cd0af80a0662e6ecfc59ae05154c062439068dc18f390247304402205ec4bb4479cfa485e0af040c8bc6db7eb4a99e86d3c86385229e0c74a3e271a6022057c035ef65f8dda8afe462fe574839778cc443073ee6ae2e8966e861a07bdaea0121033d806d5e9ac1a112fd81e501a4f6274e69e00f137eef9d6f7f76a2783200026100000000020000000001019d3cb06bf46aef51509bfcd1b636a569b5c611cd0794dce553c5c4f12b6f3d111a00000000ffffffff02e85b0300000000001976a914771000d74f2d7826669cf2e1df7a73e8aca55cc888ac91af090000000000160014419d431b359419270aab721791e471a29c77c95b02483045022100b71c5c4807d946fb706e1b9a8af05f61e8b91afc2a0e42b9bc5daa0baeb9752d022073077370d2a7a636d98d72e0d0e0ceef4c94cc61c29b25583ea93c20c7c2c1b801210391d3e072f9365e0f741684aa14aef96827f1e3711153375a4600f4f223e550760000000002000000000101dadde375dc876822a89b9e06f4dba84938dc94ff39dd480a29d7f478d61a36030100000000ffffffff02e4dc1600000000001976a9147477b7e271b4b5f5fe2b89a44bb9d953fb82e22988ac2fd928000000000016001431dcb3eaf980b3153429e889e374b07bd0541bc102483045022100920f12408cfd2d6f10031d003cac08a91adeefd27b5647134281624bcd898ac30220788840480fdd6a4ed06a2bda88cf753138b83ab12b6dee5d229e7ad74acb3efb012102bb68dde0608872e83f169842eebde5a021c3c73efdeff5bf0ac1dddfe58df6b300000000020000000001018df82e92adac8b0ef9b9edc006c0d400a206600538ff905cef6e5aa3f3f3599d0100000000ffffffff02b35b0300000000001976a91416450f7f22f6f84b7731e12885a669408d590ea488acb28f1e0000000000160014155f4543ac1959aba30b0c980cb3d424cac7734802483045022100e51281701dd93002a843172adf5e24a819912670359bc24426c775837443e3cd022005a9edb4fdd47d802165b4fd688f86d792bb29c9822171aa9685f91e8448fdf2012103cc6f62999043dda6a6a5aad7f30223ee672628a74eaf67eb8e640abf029d27a40000000002000000000101c2421f0a2c260877af8149ca2c35cf6a873b6afbfad805fcd61c1c9ea853fbb20100000000ffffffff0273bb0600000000001976a91461719609d6dacdb42c25c90c48afaea442afbbb588ac65592b000000000016001446c1ad5a7ebbda55d7a0468882c6fd37b648d396024730440220280de045a2755b1ad1caf2ccd807a70cbe136ff544597c39f32ab844935d3afd02207319cab3c9f4f57e162ccf171ca02fa83c354dc00a08650a1ffb4dc014a664480121024ee676bde0eda1bc414f7b659a5942a26949dc5cd8f8366e98eaab9446c689f2000000000200000000010170cd0f9f4d554c3281253a60c021330dbd9499245cc11cc4d1a4d958a75c7faa0000000000ffffffff0240650800000000001976a914acdab00867ac716e4dad3a65695041364347721c88ace648080000000000160014ce5da13cbe7a4009c81120dd2f469b386886a3ad02483045022100f3c278004e00e7a654a554315ca3deac57b1fc2c9396ebc9f0ead40a00cdcab002202e36368806a8b3317bd2846627135f1248f2d7b33e92c5ea8cf01b628cf23db8012102fca6466df807717f7bf37396918d74418ce166a3c449b977b89cae6af8ba1d6b0000000002000000000101bb86cdae0fbdf796073a2d7831f22347e9e1098e0a32b11cce8bd1f7cb77488b0100000000ffffffff02327c0300000000001976a914eb913de565be9b71d793a3df42216d52e45f954588accebb060000000000160014cf6d943bc428969a3e776c4435ade7c74993059202483045022100e6efbeab237e643890e21722fd19d3fd081354c37dc933f9392aa307728bde1a0220054a44ed30ad1196f370613ec15a56cd9aea573ed9336f497a7cf06d965bbb3f012102cd47d93acb1621f357b9b2c44c1585d4082dcd7a56537f44c40418f67f979cf400000000020000000001016d6a36e6e583cab1c3d3bdcbd57fb6e0b14c6a965a6b1cb99181b858857a9b780500000000ffffffff028cb70600000000001976a914f1f9336b4dbbf3deb1b23eca6443972a55e7eeb288acd2860e00000000001600146ba1d798583551ca69b4deeb54f8faa4102193230247304402204d4991587c202913fbfb66923b68813a6cd37a641d4e91f20f134d768b61f358022076d850cd148dacd860d0c2fd118f85b8eeda8dd1d48faf7415d192a470f512bb012103ff93062bdfbac742e94ed16a96deac418128eef8f67472640a6cafee4ce0682900000000020000000001013d10a7f0c4cba5d596c0dda162ba9eb18e3a14699c3f768d699e876e81d3fe240100000000ffffffff020ab20300000000001976a9140d8912310ed9c4baed0b0ca956900569601cfc0988acf1212701000000001600147bcbc608212de78b15157aa19a49b1dcf55741be02483045022100d087ee715da6158fc0135691fa950b9c8ac953774822783825b06a27d7d56d1e02203a6adc77a3ca13762ac7072efa9f60be5c5ac4a5223f1df4953d7934f806c8cd012102159adfc73d5b5fbdaf9bcc2834ad8aa044647d4dc89eb4b58eac67d24736673f0000000002000000000101e55efd73547678520212ff88ab85179ec402a9d8804b27e9183f0265a423bbbe0100000000ffffffff024cc50b00000000001976a91472432f31b2ec1fa3021e5beaa89a8cfb06fe4ea388acffbe460200000000160014844616bd758d7bcd89768ab6e7a4d12873733a3402473044022023e876abdfc9fe1defd1922c34dc7be2db85065ce2774475f045e7b01e8ab09f022034ba045b076387b235d7c1cdc0d0723bb91d19942a1e4786bf5d65362f0b8a75012103dcde9023638ace90d998fbef285b9f1b0d70bfef8a3eb4c5f1ff9a882ed2869b00000000020000000001014a67cd103add6307982aae27853ba673ef33310db5df17a7ddd68185a73177150100000000ffffffff02cc6e0d00000000001976a914f5f2e339b5fd9f89f6b49bfadd867f4cb9f9514988ac9ac5bc00000000001600147a72ba2c2f030944a2d285a294e239b1e7ccb58102483045022100cd445cf3a7765e0bd0bd283bbd86ee705e7bfd783fade7273793a35619bf019502202e62a0ec14c2935e894aefc7e95c9ecd4197fc21d2e33959433a62f72e285e4e012102f9857fddc89740cce5693ec8701d01cc54182dce54d366f8cf2c2b33c685750f0000000002000000000101128743f8da385ec297e78b4f21aee87f44fc9d2a0804b9d250e9abd0221056742500000000ffffffff02003e4900000000001976a9144217dbb35f88857ffbe2b1083e19ccf2cf0e599d88aca620650000000000160014df722e798ad833827f5f7427c9dceebf42b78ccf024830450221008cbf15669aad0076a6a3b108d274c5ef45e9b5e848ac0f6f1de7b0206606bfd002206e664c62d75e9715487b23d35bde9d0916b95052583d2e25906dc28c478ea9b9012103634c817495558268afdc6c2a26030042fb1b3519892835b100e53bbe95e1ca980000000002000000000101b94b6f3f53435872d2808c963f17231a744f54d1090cf88a9c7d0e97df47e75a2c00000000ffffffff02f1953c00000000001976a9144888c86f3d23cf91dec8f5dbb63cecf3020bb90788acd740020000000000160014d4b7ee9036fd68ad578863fdb97fb8935ef827fe0247304402202009444f0a04aa85b8f15c4deece07abcfe865569a8864186972452a80435023022069060821fcc0171213f0b9e8580fc21778ce0ae8d5e45eb0ae93c91ee6e24f71012103ece355e66c9392503e25ad685dee484fad19e06972962cf9ce507899f32b1d52000000000200000000010191ec8f4b9e18f3410474bc42ff411cc6692ee68bb47ab292e933e30a97a8fba80100000000ffffffff0281461900000000001976a914e27a13df60ebd9eac9c87fd90e32685ac82a24a788aca760b000000000001600142606c728625925cd2fcd7bfd70bf85d3454932360247304402202ec5796d5c35e5a3d48f03e9b948eae90387789bfa0ae87f306f270cd276de3a02204f131d005f8e35e32e1a7d44c4629648464011ade1a2aa2da67a9cf34f88ca0001210329f6206f9f8d2b3eda9693ca1339ca1684fa62ad7c601637ce2829263f4ed8840000000002000000000101cd5d505e899b0dcd25f951e74028c7d0d5a9336324a391a10e03af81bcc43ad40100000000ffffffff029dc502000000000016001439f5a10ef26963e5fc95575a84d67f84560b6fb8a6c20600000000001976a91447de5f1c4af54a3c81d7ef0a61fd42ec76cb12e488ac02483045022100b5f5f38c76b36ff1f70765034e8b6ddd43331bf840231c4573cb2f7bffc1f1cc02205968f227c936eb694e1fc1293979f41a6860676a4dcc1a3f6583492520f30a370121021342070844d20f1ad4348edf67feaf4a4a45d4d50c28016008433e28392713a800000000020000000001010fc6d18e697147b7f5905bd5415c7b7b2d84b53f9dd1434899ad9abb9c5683760100000000ffffffff022e2d9c00000000001976a91440dc0636d4415bb304d0c4106a64f12f558c596588acd20e000000000000160014c3463bb94d069cd076375c4bb9ef84ec838cd7c702483045022100d0d13078cf43f777bab6f2d3e5da8d908b3b4898c161e7a9dba107d96896d5b602202e1e1d6c45e81dfaa20b1425a25571ced3cd069aaa90ef3e1ba2eec1e3fd6dbf01210316c57c8a1b84bcd1f6767aceeea1f26912c2356bddf8c6e1d309e163c9128a5e00000000010000000001014d7f179f620184c92e2dd2022511f522a092368977e6402bdc28dc9647c8e37c010000002322002047c1d5b19316c16378cd4b28078ef10ae57bccd4a0bccf6543b49a55d9e6b2d7ffffffff021ebe00000000000017a9148c16d9143afef795f115f96f2ffcafd603406ed487108c04000000000017a91424b0a33953ca1d3f4d857ef8820f995e15aff238870400473044022009eea39b060914d7d721143a43252ab893ebdd57ebe0222fd39df3b03d73da4d022063660edf9ca392626e5936d6b7395976f65158703fa180f016b4c718de85a93001473044022064d9ba2a3b3da87a26f250b6a2799976b1ac24cf7d958fa4211b781b2f169e84022054c169429897fcc46c37c7a4cb1ae66653b88a2c48818bbe4506371b30dc755e0169522102e0f532963915bb3a63a97a603c6ffe38225fd714b0168b3130aa17bc22810d232103f70527d26bdbc5418b9ca66fb3d6d5f9a12a8f0da174afed92e6c2e92899cf1d2103586e9e623d027c402b88c5af6160bef5ba0a622b8ecbec4b475399c63427fb2e53ae49a00a000100000000010195a37bd84fe01a23cdff36bbcfeee5c1a8b717642a5b68ae03447d483dcdf24a0100000000ffffffff0209941000000000001976a914363f360ea8e5ee9a6c9b67e51802a365d9be936a88ac1e723d1600000000220020a5ea1632c08ea0b7a86bfceb93fcb04b72e73f275572bef49ac000fa2ebb86c1040047304402200b0f0c852a4f55f6c97a56ab08d2fea87ed673d810229987baba596daa7107a302207819056577044baba115700a8c71e3fce884effc6e85eb908a13c4f8162615ed0147304402205af99142bca8caa4edf6e778e5b6f21e6d54502e3129b441eef2a4ff3134534102200d0dc7c05d2fbf96434aaf9ed89d35f2a3c17807fc87e4a80ca07ca68602c532016952210357daa4758dc300c43df52dc06f23298af12a7e7fa312122b1b65c300af1f2a9c210310bacb383f8be8d9c5d34e5381292a9bc6eef523383de56d2248b51d9e19e4b82103396b70d5b51c6f842d43a640418f60d8d638300a85cb3aa53545bc948ee38f4953ae48a00a0001000000000101e76c5d0b93e2f4df1f2c8ccd6b30f57e3c5ee00e80ed04a62219d5edb56d36420100000000ffffffff02d8e30900000000001976a914e7cd2ae23d7ea93da49ab2da5869928ce99ff1aa88ac3551f32400000000220020a5ea1632c08ea0b7a86bfceb93fcb04b72e73f275572bef49ac000fa2ebb86c104004730440220421e9fb7781027cbe94fec2260de83b2c14916d37d6fd5a87bb1e69dba2cd32902203981d2e6db2d113b4b215fd7d5bc62b1f34712134d9e600ff98be9b0565cd02d014730440220296286ef424a11ce75e779b29c0031660b09a52d0e0bcc11d02fcb80f920851502203e28a48d24809f4d6f6689298ac1bf8d87d4aacb927191f9440e7279ab43d11a016952210357daa4758dc300c43df52dc06f23298af12a7e7fa312122b1b65c300af1f2a9c210310bacb383f8be8d9c5d34e5381292a9bc6eef523383de56d2248b51d9e19e4b82103396b70d5b51c6f842d43a640418f60d8d638300a85cb3aa53545bc948ee38f4953ae47a00a0001000000000101cae443267f600b45ef8d21e3986a144a20723d278166451ad4e11fb9aedd24c90400000000ffffffff02a3ae6000000000001976a914f35e603d6e263099729829a98ddcc804b23930d788ac8583df05000000002200204a15e45b36f9676b974c78fbf52d28621a2732f9904ca2fd6db044a4d18bd7b50400483045022100ab71e02c1c9c0e90d050baf4f9b56cd6be792e2f7f4b7ec0011cc784480c88d5022023c8c847f62f405ec457c18efe6b220d39bf3c67c71b6669f4b793429106985001473044022027036e7d7d69ac6396401bdeb89c60bf9be727537d98b16461964d153120cdb102203f7524d7756a738afd6f68974cf2bc112dbdf02dc84b08e8aec69863597a9b9e01695221037bcc6d1ec076eadf5593de56052e924942faf89b07dc5e834f7b44276c25b65f2103f229aa0877a4226e69e74f645ea1e8fe800b92dace8f0699bcef6d607fbbf9442102b9b22703bda50429e61e95b630a68a100918ae4f8b0c4a322202b02bebcfe82453ae49a00a00010000000001019efa44a62ab833beb83bfc8eee8c382f414fb96b797466574cac489fde80b83a0100000000ffffffff02389c48000000000017a914436d72dca48327acbab6334d036e53e87a79803e871ad01005000000002200205dfa04ca762913e7cb975f8887638e64a412002770d012d315097debf7f68d2d0400483045022100a1739b1af621ef071adcbe33b9e4fb84157b4869833010d08de39d5d1c89cef5022041b462aa876cb8c6208fc3f0b9c32af5dce17108741deb28b4a35a1ecd250179014730440220016169dd56f9483f33651c19650c8b4d38cdb81d9e1e33ce0cd437a95596c5bf02207603cd0889ef043cd718a66fe67266f5c173920b2d76011b2f6b543a9df84e500169522102bb9e12ae986c063fa32232dc9f774efb9095e1f63d73304bea05163aff09eb1f210321d524b4da00e8c00bef977a07f6c6f5d82ade57dc07e6aefadbb2e78dea2e4d2102ec7ca178189f13f36153fcbc200e4a1c8581b125b0f8980f7e43a76c054eb17653ae49a00a00010000000001015b7b96c3c8ca115af37ccdd83679cd46e4e93dd9fb59906c34d6276bcddd44750100000000ffffffff0284e901000000000017a914db056478f4f5358670d2eb7f56ff6431816309a18791097607000000002200202dfcfaf7639c1a5f81b77d6c001b2a5814a7a46c880cc428007154d0ddec9a0e0400483045022100f8a0e35bb9902a49297c0ffd5b81a379f77c0211b9e307736ad7590c26989de102205e2e626f88f8a7fe7a5ae1d5314eef126e9c13fc73adc65755ece433da3e28c4014730440220531605da55fbfcd431289eee66986ad0c3de20861d5054929c0604b8f53c582902205e3abc1b18c22cb76652875cdec6c922c6df716a2c104be74bcc54cc347215f3016952210355d542b71f8b22251117e39e0c3a741e9aaf11c516888490cbbe62453598cd3d21027aa6c71a0e099db20e3fccdcd78ef75eda382f87e500fa71b4ce4d77bbf044352102e989c0543a6dd1dcf88a7407a459c1b428d2854d5fb84f99b0f038e62d100bb053ae49a00a00010000000001016711ac55a8a85432e353f8d412ebd4dab9715b066ac3cb9bd9f757aab6c418460100000000ffffffff02419e06000000000017a914b19a158d0474e0f6b9ce87121732a9a9a654eb1b87c46e9f010000000022002047e0aeb470bad0eeb2598bb5be2c719845f4d9f5b852d7bacfe3b0074c65f1780400473044022071e77a463f3da7c0efd128f25033d954d2c2a853029b764499908f10a80a7ea7022048401621a3337b441278c3e4bbc03c657fa9673a6e3575bd3332f6bc8a646d4d01473044022034491342c59e21e1b45ba23d96a3a72a50096fbd03c2ed18c3b179722dcb3bde02207ef8b2a95bd65951033eb97dc601616c2456de9d96eb1abdf2b5940d5083e62a0169522103ee424697eddd2bb6e314c4c3164a7ba6d96c5c732d6f4c985a882ea3358855b12102facda47fa6f95d629520aa8898b612df4ca7facd3f6dd827f9933fd95aea33e0210216130c353f2a9b1f30354d239f41cd26c3acb4f9499b327c9a6e7ea0423a023453ae49a00a0002000000000101acfc4a5d85337844bb97d12ca5a5beb695bd02499000e805a8f16dbe2515435000000000000100008001d6e9100000000000160014e7b127849b7e6228623f0347a3f618e7384a37bf02473044022042f6c856e5d62fae8febbdd75cfc9088424d8795749062b2b5c58b62010d085302204dbde488d5952984243dca877096d921c36881a6e675c80a4d6fd0ededa279bf012103df08eda76a7df05c3aa4369aa1a75803e3b30899bcf7e0640b9139dc476eb9f40000000001000000000101e71e169fc2e9123aa9dd9dddbfb9657167df989a2ecf8e831d47dd0272a5fd5901000000232200201bf9c9adab37ae898796e8d862f4958e3b29562158505fa9afbba36c562378dfffffffff02ee950000000000001976a91482b8770c9d6f8224be2ab8cc5942249f791b155e88ac44d29e000000000017a9146a15b51e36dd49812de61bf12e7d0c2afabd9c8c87040047304402200728eeafe6d9dabd26ad8d6d3a4eadcec8ea08fbf7d93b348f77c561fb516764022049169efbd6b91d3d0fdcdefe27f2e57b39cb8989f20ff67f43d6e27fbdb4fac6014730440220706d733254653217b8b5c31ec1cf4956bb2039e7c72678b2baf730495ddea82d02202d038f1a5345475297940a64269ac153dc51d33d732d23a159dece65a136077b0169522102c1eebfbd4ef490605212b8cb075ba4fd78e1ed4b6aa38b367bb4a06c0409e35221020328d8963f838d1089880045982d6702e51fd0ed94ee33c8bff9862c569753192103680b44094e3bb8810a1d8b6949bed3249090ba58b47d73b34c53ab465439357f53ae4aa00a0001000000000101bd20916d0a62ca1dfaa173537349be7504bc908742bf42870f9f8f5be6ad9f7a0100000023220020b80103bb9a8bf93091bf26cf8db1342d2d39738e27457faf13fdcfc179af2547ffffffff029a970200000000001976a9142d88a4978aebbbd4b2fe249fe7b97604ba9a910188acf62c10000000000017a91480e03d81b7eb7f5bdfada146f5936705f18e01258704004730440220251ebfe4633d8387f13da2366a252b5c8a3b6f3f01341234510988bf8733607902207ef8e6a6de4592d74d1541e92db9ff0447c7e6cb78d97e932db6430442c4d87901473044022007f33904144698d1e11ec752b332f1ab4d5201d7c0d73e1dfd8dba6f19c7cffc022070a7b833bd2db96942b5daccc73956bb6df6f6fa066ad63ae69a50b7c7f13e2e01695221036a0ac70a5e576bb898fba41cb730674efa3fab70b920cdf3755486abef009c982102017a89165adc8076e9d6edc180c92bf52bb7dceadee8327b435d725f22f394c02102cceb8a153024997700e13482079ccec422fb8ace28d632cffee594c93cd95e6c53ae4aa00a0001000000000101c1697c1ff940b5473446902f36e396fb9c2e3f3bf1776b3cfd9905e63a2d88e10100000023220020f196e033ae37e34b1c54af09ad49baad3a511521c9c0765a12999a73e643b42fffffffff0263dd0200000000001976a914588459a92c6f9352a7e660de557c360b3dd8c77b88ace7cfd0000000000017a914fc825a5b155c6c8354e00eb2b22738000d404fb687040047304402203ec2cef4ad250520acb697c087dcfac0f9dfd0298c52a378610bd017d56ece1102203d13a7fc996e7efe3acc71da2cc68e8d35c1c7b6151e2ec2265a42ac3f907d680147304402203733e6c97d21f8b87c84b3b8d7229c14ffcbb015c98bc405f1591cec8c53f47a022062fee40995a1bcb14a167ce4312845c26b445009c7348de9c52241c846d7b6230169522103595580b18fc0d7d23f7c929375bddcc791410921913e8be39c428ad1a6ff978021037f01dc391d6dced8e0d520fa740752a9b218f9fdbd0cea2dfb2720e87f899bfc2103204e90c2f92929fd7d6b2349b9cb2d7e0c908b24406fbd55f2125e33967d93af53ae49a00a0001000000000101d5a2496585f0b575c25b03908afed88d90ae5b61f34748f15cb038aaf82808eb01000000232200208910e4132a24d91a8609f2fe07c28b2ca0a3bfaf2f08b919fafc19b56f4d6137ffffffff029cd80300000000001976a9147a8019d12e524cbb0138521fec37975ea57b929088ac8d8409040000000017a91493f1c7dafb0b5711041aa072d0703348b7bf11a08704004830450221009fb88a49fe3d92a4cdc8eb69e6acddaf11bf702c3c6b15e4ec21e1c7b4671d49022012b0e1effdf4263af7d5b5d9e55257d2122a9c7c9f297fc72552d58f12e437360147304402207904bf03352fc708ff3e0f4df73c7062d18fb819090b948fa4451102d0d602b3022056b32dea231bb2785b96444d62b28c97748ed0517c9318862d5fede8ee1ad2fd0169522103cfe42dad8ecf1a0dba2d0979de96de8a588431db9942480183eb0c888cfc608f2103311c0c4a885ed0bbb1432c0eff4f006e43c4ad8f4b5399d0c2a1d36909271ac62102ddf97f893b18927e3710a350962631a5885e4435453802c308e1fd854761e6ed53ae49a00a000100000000010166e309bad0fbda394fa553be4d5dc61cf0933af6d688f84b38b891f117eafce002000000232200203a2e048314acc07eb41413f3cf4861e63504bbdb9729bb954df7473ab85868ceffffffff021d170300000000001976a91478995433b27e227aab25394c5a72c57e3156f69888ac1e1011040000000017a914f655472ab907a30af54ff3f9e953e7c72d7485ad870400483045022100af17ff47265710500b00011c60df55d225b2f412f6f80c7501a648ae4326e6fc02204fd70fd3a3d19c77bd7585b92db73b459915c27502bba6006a213f170cda72950147304402200d236e5f5db625fd35e1f7b6cb6f08a9c5a2bf183a8125428b4a38ab045b0c7702207099591b120391e7bc0fbcf454a9fc802396f32b2d39b84c82cbbcef7bbc6f970169522103b90efd33e20355e50c934e46fbb0d418c258894f772abd9affdd7c8213a05bd9210237f5ce4c168d5f98c691c3d5962396e36b7e9a15a9fd0869143d8e8a24c193912103cecf754182c2f0a316c284b78b4326acaa74d142b60c4b3f4e7f8a757b42997f53ae0000000001000000000101f6b89c45a3f2f9ae5c3f0f297bbc247cda6390639ed65f07bd3fa819fc0da2b90100000023220020321090f86eecf42514d7802e45bb1c9d1194e1bb7c4aec323d5ee61e5abbd39affffffff02d4af0a00000000001976a9148a6892d4926d5251a2765ebae48b47f8382828f188acf895f6020000000017a9146c641196688a194326d8103b8e9012abaaf12c9387040047304402200c295f573162c63c3dc74f0644b4f0ab6c473934665084394a71a8a18dc097d402203a06c5f9755260aba207ab98f6eb1fc656ccad965ae32d1dea4f5caddfbb7b2801473044022050fa48f0890b17f6edabe894ba8b0c1255a5d589a46ad95c17e852fd9f73ce0e022079d9c9079ebf612ca609e97acb423b9e5c95f97912ab11fe4dd79c4b38090f07016952210293c21fe2a682da6005b1a898bbec745e292bb0957373a7ad6a3a03af82c246e82102379bc1f949af6db5830d0856ac9547cd3936c36a1fb4b14183a1c094ce05ef8e21021f39368cc30984c2a1ffd350d71187e55f6159760bec20889773bd51aa9d8f1a53ae49a00a00010000000001014ebb1a0956a0f9c6b9ff488ead4f85df62bf7a1b946c0a87f5dce8110d47e9810100000023220020ba506b2bfdb5fe05a48bee2a1b36d93a53819bfb3bb5c7a7e65732ccb4d206dcffffffff02de0a0f000000000017a9145b156accf60f751cc85eef0b9e7e3ea9c2dfe3328713b673000000000017a9142d4ba8298265c77e5f2c24a0a48fd07a9c2a6da58704004830450221008761403d11cffdc6c0c108326817347dbe87af031a58a54c3187541262f65ce1022040fbbe1f0d19af880516b31f8b2a8b45bb75a3678532aae58962a1dae56c5c4b01473044022077879018372170e1501520031788702e1b666ac62c2fee611fa7aa4e7c5c77b2022058e47339b9dec40a203ed751c380d4b175cd78ef0a48291c5c86c4feec0ac0e301695221030a5f7ca228cbeee14a6bd6ee72e9d3007565e21bf9262bd47184596ed32ce07d2103a92bc4ea8aa4a77987218b27c60c30980e70846eb6b3334309204c9858fc7c342102814e3ea99e9e772d6d7f485904543d59d8ea82f8da91d6ad023f78f839b2e46453ae4aa00a00010000000001018dfbc5d8c231ac9feb13dd7524f9a25234771450e8aaba4f0b9f3811941c4ff9010000002322002029cc05a34a64fcad00a1d7db41106deb25aed044623d053a5fc0e2dde9ec398effffffff02cc4903000000000017a914efb740772c5e3a67b562bcafb8dbd9ae01d4d6ca87632d4f000000000017a914b27d782f3359d94613d36e1d15d679d874ce89c6870400483045022100f715b2183dfdc292cb7c02583b54dfe8bc55bd5e38b71a0b555d86aa7c1f1075022067fc9784bfac8dd05c2b74bbb6749d5d04fe8cd2c716fc81c0484a9ba05dcd3d014730440220701e1839809791bb91e9c97609149ae9c67513bbf6fb9833d80ce6d92e224a8802207ce966c18ce7334bbde5e92ae24bbf058a5dd830d2a732a3e351f57474c5fb0701695221035436b621d4887c68e4d2c097778cb938bebef21618d28c959b0df387231e3c5921025e58fe01374754279113ff1d4ba91de5e4f56b8e48abfbf1f2263cde307a3fd42102556844e13b50a9c34cb6586b6703f17a8ee52ccffa3faa43d89b5d69680354e253ae49a00a00010000000001019444de0c1a5ce3b39a68b80050f0cda56b3c76f83c0aa426f985280042198d210100000023220020eb982d88a2d0358e37efe0008a2c3e65f077832d6ea18d1eb0cbb9806607253cffffffff02f9ed04000000000017a9140ac196afbf5020dfcca401408b4ad8d4dbca1ae4878a1531000000000017a914a5e6dc7c95d220cb7b4ff1313cb3ce9a377895f8870400473044022074e51798af1d17f11441e948df14d574dfa61f5f0a6ca7eb463bdd12de8c543d02200fbc58abbd944f061c7cff0d1d062703abae4dd1c6b6111becb817f395fea7ef01473044022025e0af8b6057051e3fbc9c969770a2163b7e9fded2de13be6f3e48c67aec18fe02205bb4ed52ce997480f558261f01e938d101bd66af68ecce42b94c91316cc0caaf0169522103c123801d006e994e2834b88a9dcb64767d4a9cda1b314e2c9c71265d53a1d427210330d09d1f5aef0a3253e74cfa64ab783cbb27000231c4e660e99616e8ea8b09dd210365e28e50e87072d1ee61fa3655f7236ac46a9b0dca5fa1eb0b3d91b9fab0630953ae49a00a0001000000000101b0613d071f8bbe10faa27eddb8abf37c40bfa0ae0f602f47d2c81f6051d9dcd5010000002322002026c940904dd5df60cfda6c5317cbb58aab1f6e515094ff0fc7c9e28ae0062947ffffffff02f0a503000000000017a914b2f1311d5b54019ff1fec873910e9d11b3d127e687cd0f00020000000017a914b56080878cd18bfebb4ceb5d10e9ff44f7afdcab87040047304402204e52adf65f8620adec12a3ccc6ce18287309444eddc96027f53801fc89828ac0022075d98b35a8a1194df43ce75899ce7a30ece96c180e86a371c45c03eb550d7b490147304402205e22e9e2c69e00b6712858b978fb1fde0c349a4311a4ca8c10960d69bf48fef2022016eeb53c1c2214f6c58672d83900efd4fb60f1f0e1972ac59ff71ff129ec21330169522103c5fd91eb4338fa9072e2f6822ebd2aee9bf92c89831400be228c308275b21fff21038b0d20505d5b24912172467e911b76edc1c6137c892feb21a44a6f729a659c19210356dca9b2137728f492ce198c6bac606128e071597baa78485e5a6c25da8a330853ae49a00a000100000000010189a62756b5e228cb49beb6397d585aed0bb074cdcaca9a42bdfdb4bc954e25af07000000232200204db1825cd43b66eae0403881a83824a97a5e376844c351bd417e3aeeca98c442ffffffff027b3450000000000017a9144ba1ab7e039d7ff88cc355b4d19f0eacd23e8dab87928453000000000017a914a9e8b8377f23ff04a7d55f797ccfd55b588342b5870400483045022100b46cee9048ea180daf356c8b2b4e4494163114500781ccfe2be4fb63effd6a0202205dd48dfd6c86d13e7bf310a021852f715c0a95b51ce36e2c582ea990851bdbcb014730440220472ad0637b1e17ab9bad1a9cfcf964b9251d65a50b5a2b6b36f743a6af0724960220763e4b4a99d5e955c5315fd64b79746ae6839ac9c360339495a31ffa4e3fbe9a01695221034fcda2a266ac4b966d1ba1c9003d9f83fc957e738f137d2d4e496d65a37340642102a763c85158b63fdb96fd2962562550dcfed27800ac0e9810299a411fc4e2c2bc210361f44ae75e96ddcc8aa700945d5a8c82974ca576e9a264d073398980c081c39053ae4aa00a00010000000001019b30d48ca7bec3c6ad7b2d1bed620ae1d82e3c8754cabf1f42827f04d4d696d701000000232200208298b9913a951524ee01028b0cec82a78ed657a256d6c9862a4a25bf87707fdeffffffff0252a50300000000001600146f5d750c02b9277754b34c27d5498746dedb31bdb03061020000000017a914367cc8f70e198ef6b5646b25e58a6d5bfe5e709f870400483045022100f862097c34f2aa08387f3d567fd31688a8e2e216dec1140c891877b3731bafae0220097f4c2a1863a4d18e55ffa58e88a267d86b1f37f4a7382d7bbce456cf06a831014730440220578eb3bf927f684ba46833165d39483718e5b11398495d6a11b997c7824dfe3b0220071397274ab411918a2ab2c1b0aa770a5873ad595e29b9c4cb17b48649dd601d01695221025253c4912fd3e692f65064941ff283ae7242cf3da8161e44ce9ff772115d05302103aec121379e414d6749ee0fda606161d7c376234c77824efd4fe0b73a6a188cd12103e7ee9241eb937bc61d53aac27d05a3a15534c2ee2902bbea7634850c09b316d253ae49a00a00010000000001011949d2ab22cdfc04e17b8130c1cb9bb7c2b551ba5d0316f2357e686a4dc83e690100000023220020e50ae0f96be42d4291923a077d69ddf8eeaa6738c60be5a03fb1b526f1e67225ffffffff02a0eae50000000000160014737a008bf498ed91dd3f58598986c218f74e0551e77dbe030000000017a91410abdedf3a130bb06b0a637915681ebdc408d6dd8704004830450221008b4ff3d3378978a9d4d00db5093ea91ff1afe20fac5c8b5bada335bd492769e002203e6a336697a2e590c763b8b164fc2afbfd801175c40a589a6a68ecd82880befb0147304402205355d554f8534895bad24ae4ea6a7ae21f8fc9bc42ea72c3ab6993f023cf156002203e6762608fce26875bcc8d661ae175d467ac6ac93f0f01d67fa0859a84fb71b40169522102ef532e7f7c6ea2123d173fe295ee7bd9682efe1c71d5bebb8ae4e243df19de30210240eb8c471c9e861a5a335edd3e8df15f80c7293a45c2bb18d6cc2c63e911048c2102e882ba489c6efdfa52b57c44c14bb25a86b969c713b064c1fa8f109861d44f7653ae49a00a0001000000000101d635ae858c51192599b25a959ea9e7d693f82c4e0c9646fb83d2b31fdc3d4d760100000023220020f9819fe890ca1d2e7f805151143cd488b755914aa45b60b2d0af2b70bb671a14ffffffff0210270000000000001600149e8369e5155375f213906b2def9b552c34fea28df61e5d040000000017a9146af43df1746b0ae2268efb4dd900a65414a2f83387040048304502210099403f0e7cb946821ec3d92f26a703e58b85f97b387fd25ad2558b169ee0a97202203f78b0c94265dca6893dcdda5519a662d135657b9644283a3bd6e59a15d3e6b701473044022069e1cd606633dfbd8a218fb155d255ca5be1be011765299e4a4ca43b7587ff7a02204e5dc70a5ae3734b6a96542fdb3107c7ab738aa450f73e424f755d0b5238865a0169522102ea4f04f141463993ad6a1dafa27f199a8abde03daf323c07f4ebba59fcf57bdd2103c03bf22aef3cd624774510508ee9ae96701183ae8e0101c159d40cfd7bf50105210300896d037fd5b0c127d2eeb55c49c91b17b1fe38e9b78c83aff88ccc03330c9653ae49a00a000100000000010131fe890acc18f54a0eda23f7d724817cfb10392a9fa15bea49fca82b9ac4c3a60100000023220020c372138ea9118ec1658e71cd95cfc086da941f2a2ef5a23f316f8d4642015adfffffffff02f8680e0000000000160014e09418fe2be8fec38b34183dfc9df7517cb95ef555f30f000000000017a91479f37de171108bf6c7cc05e8dc73ffb366e4cabb870400483045022100834c65223adb27371d0d557d7c7c66c37935c3a47ac101d97ae89d7d03e872230220077ae755da871ba5cb5dbf378354a0f34ad92bd76aa34e52e16a0c64973594f80147304402203237fd43e88d7e354e509a985a086a5e97e7895dd4556d40a85fed8a7bbadd2c022063fa163403b9d2c892c602bcebec0df2450d9266526e1cf3573ccbc2fbf2c02b0169522102cbb2c524d2881a13d59c711607da6c45f2fe8d3ca785468c463099f4d6a7bd5121037dcbd34edc846047bfe7f2e1ef54cfb1c374054e5092302ff28019466c4f559e2103a3ec736c84845cadbe358c5c6e4881180063f2eaae30080442c416d7e411f4c453ae49a00a0001000000000101630e65c027453b9cc9f613736437da268420fe8b90d3cd9d151a6d1d4af038d50000000023220020def4074a0e487988bb7fc33971a145298e754265e097710f35e51cd5269c81f6ffffffff0295332200000000001976a9142597d1ca6784e7a2f5391772282bcd3502e7e7f388ac55d6320100000000220020437345e291a6e0a78d8f8a6bcaf6419d66949476a872c47904241036c35a518b040047304402201e80f5fc1f52d9f0ac6e679bba487647b8b2a53acb5e9153c5323a2b87bd75370220148ccfea11b1fda94d29ff86eca80119013fdcb0c48079f788e52c28fc72074701473044022050efced7126e34b90726737e1c93d0f87b44478bf0387ede4fa631ceac033a7902205878e59b7d3bd2e5aec96d5d50d0078115341bdf14293d1c38bb3371f2026fc201695221023b518c5eac28c2936f8589dba117625b42df9511852d7dd923ace82fc0143a402103cc54976c6335956e60fab1cfe0d4fc2a11889715cb70fb2d7af782976447c0b12102a0a1b4c42f1b12109ebbffbe62dcf413d2f7fe1b895fee406f45e2967108442053ae48a00a00020000000001022e2743985b0af85594209159978d32b909a96d25fa7f8e4b199f44fac1b494b7010000001716001470456b99c320595636fd92235135c0db8b7b9097fdffffffbd7ff3ae61b362c462baec861661420d1906c5e233c3e37cd66179ebd7fbe6250000000017160014fcebd5a0e5bc992efa82e48f320e4ca8ad44cad5fdffffff011cbb0000000000001976a91492169ed42f3dc4eff0b10060b6f0eb39367a0fdc88ac02473044022060a55e7ad8687ce7ace5ef7b1014f2718e4284f3cdbada12ee743a2329847067022038c70ea55d41fd1da0bd7ea92eeb63fd4edf98650a55f2f821de4873fda73a2a012102e7e41ddb876409a8a39e3db2369f71f451502e6f62c3f70ee3b400161001bad90247304402202f22b33b89b21954e9a391044ba83345b84587531473f483eb05f52437d4869102201e23cc41b0fe08764175dafb9cb2193756e71cdd357a9838fd6c92e1c72020ec0121022c13bdacff20dab5706f31b68cef94a66bc704a3baaaff2dfcdcfce1b4f4a88549a00a0001000000000101670a6b8c20cbbb3a9ebf40277b6ff87f7823bf4632ba9ad39794768a9e200389010000002322002003136bfa646e26cb4d196937292241ee6314825ca62a37c95c33d8d921fc0a38ffffffff03072b00000000000017a91404b790d6433b95034d263011fd3406f1717a3d0887929b2c000000000017a914e0ae233dd476d19116135cfcb24f1c527c2b8b1587fb3b4300000000001976a9142d88a4978aebbbd4b2fe249fe7b97604ba9a910188ac0400473044022075abebe0778af9af09ea980a22b559419b81615d417d52950e3993aa2d2fd0ed02201fce8a2bdd4e3c88f66e6f7669a845f710bc666e0600dd6f13f2c02122fe9ed60147304402206c2fbe93bbbe8b8b6ee46a9b9ee7ccddba12c6896da98820897802861c02bd9e022059639e6abb7e323f7d262f15603a56a688fb42477f1ce9882cacdf896f7de12d0169522103b9826af87deb1542d8b38ce5622fd8c0e560be8a4548e23b68611d5a665477672103687ffd7cee00484bf83f85bca381cb6369fbd2a24cd519fb0f3df525ffaac66921028ea5cfb006a49ddf89695189ecaf95c2b3e8170d99169b1f7cff5ef47e55838553ae4aa00a00010000000001011fa462b5ac4a92d5d7bd2bb64e4443b01b745e170516f4e23422c5c0f1e1991b01000000232200205155262a96d1a1a3d707fb1a9852177ef2b4fb0ba3d6b854d00bbc3c726d7774ffffffff038bb80200000000001976a91420d2934e1a12057d65283d0baee2acd6a10cdd5388acdc9403000000000017a91477da60a13afd0b422f7b2f5deee476e56b9174ae87f4a914000000000017a9140f607d560492a4e24909af8a7ba8c9d3f6c6c6e7870400483045022100dd5c61e2ed8dce36663e6e658bba6b43081c33bcbba38f35ed391262019d526a02206010013d6cc8e0f7b3a25793e07e6d0aab31e5dae76e5e0940b6ffd1412e73d00147304402201dcb42d3b2c60cb450465b385ce55f649d2e1ea8331e4a18462ddb07256a4c6002205a1d0bf5187425fbc572fdb717b47a6a09a3b9e7621acf176b6ec68cdf7ee2e60169522102895672ae0480229c5f6982d7e71e29faead01ee997d0d2dbbc8e013dacc77c4f21026544b6d212294e120a281aa242f247d1496122a5ddc399c6272fc6c6886a5bb62103d7587eef9a9179b5f6ba2cf2b9f0ff8cda51938d51df4170232d5ef25ff8113853ae49a00a0002000000000101dfa4f397344d76170ea5a046763cece98001b0e3dd794ae820c5e9b91f339ceb3300000000ffffffff016c2a1300000000001976a914f3d28ca372eb3d641e4ea0ae9e1214994833f25388ac024730440220505843af46ab3f5a03daeca20c4030ac6540c5329b6e2cfe8309c3af1c2422f0022047ac1148d26daa627cb911835eb04fdfd228fbb7fc774b7a00c8f9b4e1f6d143012103b9d6e30928ffc4dd355abf60116f4740f76aa72b324816712af22288cf11283a00000000010000000001015e1e54644c372e0fe6e11f82e66ea76be869e0541bc47eec406f0cc6d2eafa430100000000ffffffff04a7480000000000001976a914b12a0bce13f6be58082b049f8ed5261caa057aad88acfbed0000000000001976a914e4ca7c1646372e5732e7760ece7b3b9b4a2fd07f88ac510401000000000017a9146226c5bd2e7d19865a4dece7e198b6e69daac139876d989f0300000000220020a1c8aaea2d5979870c14feb2199de2f7e743eb46cabf1466507bac0017ecfe4a0400483045022100c60b99c56380676583c3a6f46fc156d89228525d620d3466a5b2b9e2bfe700ee022038d666ad2fcd178489914afc3c5dfd732180adfb92329cc6c8261a66568965360147304402201f40635972159f04ec8ca358426bb711d5d855c8ed584e2e706b00e90373eff0022034727e11d7b774af676ce8b7aef35badfcfdb72ad0e7d8a31cdd52c56cb6153b016952210235b81b3e1e01db510dc8758ff588b9afde2ffa1807e841f0e6af0cb2539a7c0c21029777c5145e3c38553dd0311f3cbf3b8b8772574be9c2b7a0f9ce9c42f5ef84be21035cdeaf4d34cad43f2c53501de11042e1d71f7bf136c6b887e9f51954a52125ce53ae49a00a0001000000000102d3d491dbf33b1aa6793094f340abd4d83fb7ca204ea5db4f51fe15eff401e6790100000017160014155090bf46115b5cc2c94418c6b966e89f272aabffffffff89a747b7da1d6fd590414df3b3e8bb8bdf0e26b16b254039160f751e4b7bf8cc010000001716001433d3ef6d9f6fdd95529786f07c3559b1d992a407ffffffff0272d310000000000017a914b85c71a91889042dbc50a696c1017e6386f589e7870a170b000000000017a914e15076722f0e6642ed2b3aafe744ad2a921763928702483045022100d759e6bf9654607e943363d26bab79c533ca13b3a0795d2dfccc757a14ef59ca02200d0fb7116aeb9d87fe1db4f0fdf2b609a8298b9986d4f5a7e32b28c4a4500c1f0121024958fbadd4361ae259550cc3ccf8a1bfcae949c00963cbf782af8273cdfc4d740248304502210080104a34bf64a85cee4b70f1ef8a4f08ea57dc32cc83ccce66ad27d91a609913022013c9e27b4d335862360c3553272fac3682f649475b35c86beced6cceef6638a1012102785b1797fb37bb9a7a7a97dac9ab56c3e73cb9df51bc8058d53f1b0d71b032190000000001000000000101cc352e0fc70ac255c4afe79f9725358408a381641b78fbf458a8b6721f8cfc130300000000ffffffff04c04dc103000000001976a914164def976673ce8e204561224dd5a9dc2d4a1df588ac3ccd7c0300000000220020cffcb0c22ee684012fbd9e04c5fb574a5d7f59fa934e329aea6444b0f68b251b6833030000000000160014b044ca3251171af8242d318a4d54f8c84f22fd05f94802000000000017a9146176f6555fc83a417096714faaf21f5b6468131287040047304402207c4b6ffc928555bc2fcbd44c660e6677d980465124c2e82c0dc5fae0a90ffe580220564ae922a4b2136971d53361727cb44bdafa6346635f0ca1c6f7d106423f7bce0147304402205ccebba85d003f248f9acf3290775af0b85ec7a65f4e6c02ff6cb73f6e6d0a28022066f61c7742147fd490d514754ec59e78b710c1588f2f4a54589307e4bf0dd4ca01695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000002000000000102525ce0d1d9fed6248b7385546149393cb145c871edaf4bdfd5c7ca5f60fa36c03e00000000fffffffff9ed9051e48b1209144a152751289b322b6cf2c84becf43b8a29be0fb896505e0100000000ffffffff01e6e40e00000000001976a9142cc2c78366caace0d5b23f05478bf403d6843b6188ac0247304402200777d6c0c9076044810d8ac32c4820cf498ae8d0b9a5e403e690e476fa024100022019e036f7bef403721a287e923572cbdbb1bae47fdde0e254a9c56d186f0d0bfe0121025f4eaa64dac2832842b38ad21a5996ec58e02e8ec0f2db78cade41c38235b9e90248304502210089aaa1d8c69252e228201085c1ef00e5d1df779fdc60cf6d223e51dc876bf4830220726a107df72272e7185d1a83ffdfcf43f81cdf8bb69a0566791c6136e1f36234012102e75a84165904bab974bca705edac19c044a1b15a82070447bc2bd9711cefbbfe0000000001000000000101a8e928c76af42ba74eabb011a1d69d9e01dad095c1097b5692135649e4287fe30000000000ffffffff04db3702000000000017a914fcef690e5825ba0988e37abc55bc8fb7294e919287318c02000000000017a914801445d90e2afc9070d0de682ad9354d945bcf348778b3010000000000160014fdb6e11178599c17f6984002b5eb95a37a0b4a7f10d6550700000000220020cffcb0c22ee684012fbd9e04c5fb574a5d7f59fa934e329aea6444b0f68b251b040048304502210092402d665a51be09afffb9561a23ccfce12bebb7b646307f9680d3c6c9c10b890220283520173f2011aa878de861ea79a9d33037f9d2502328d98b772adefaf5fbdc0147304402203d792a0123b470b3496317cafbd50d4f0995fef7af63cc6690beaa53a53de32d022015da3b907125d377f556dc1144aea984c302f9d9c0041ca1db3b98b796dacdb501695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae000000000100000002aafce5425d1df5bd660438f1fcbf6f0905578dcfd77abfc2bb080381ef8a7e3f0d0000006b483045022100e14ce81fe891d2a9a0896d7d9304978ea8bb3431790ce930a7d255030277c66902201b39771e4e1ad18a7dbb8136d7f23ce2ae7685efc08379d7e07c52029b463d580121026982a964592aa51335d614bb379e6e8b7521e2e911192cbd963ef7f665f1919bffffffff5d7227b49a0802a408204d36510c988786e3ed04c48a2e5e4d1aed88ca991256130000006a47304402200c41dfc7f82f53d4ca794f3859bf6e2aa9613721f5d92377822d5f38b2a6271102207c49ae4aaf8530dfa637db4f63a7923fc77e6be562528ac519839dfaee6248160121026982a964592aa51335d614bb379e6e8b7521e2e911192cbd963ef7f665f1919bffffffff02dd481500000000001976a9143dd8534222f64755c2f0679ee9365df2aa89998088ac3f5a2200000000001976a914b19e0cce97a4561772924b6d4035f1eecc3bdcc188ac000000000200000003045f3dcb33726854abbf5c6aff3f341c0ecf509f498d4fa1dcec65a1dbceb505000000006b483045022100efcf560cb92b07640d88753939386a1e9ae297c2ca50b27e3184856387b85fa70220301c5671daca0c36d8666f8fcb0510c6810673a1136d72683e2956fa8b141d80012103a5a9a588ee3469c24508e7d925cd4456175d6eae67e7a355b2cd9ed08a1d3e5dffffffff182287af8e29df56cad22d0702b089e9649eba34e819d6b90987341bfb482266010000006b483045022100c3deca6e31339f2b0d522ab04e79a13466a2fc1e81052d95daf07f078110a552022025c0ed6bc4dd56f84b8860c305768ba2346e36b4d02b2d01fada2eefe8b52600012103a5a9a588ee3469c24508e7d925cd4456175d6eae67e7a355b2cd9ed08a1d3e5dffffffff3ba322a8fced2565bfdee9d2da89406af923beaf2d76040a3099f9cba93aa218000000006b483045022100b524a0d03d610fec5ca67c0e358616f4e8e0e9dc6e1834361819985d181a722b02201dd6272202b3995ffb0c978992fa62c08f4e5c605a56c9dc3c34cdb198334271012103a5a9a588ee3469c24508e7d925cd4456175d6eae67e7a355b2cd9ed08a1d3e5dffffffff01c7825700000000001976a91451baf4358e163ab2bd4fc1471a6bcb8b642257b988ac0000000001000000000102a9d47e9685362f44f6ec27f1928f3707a4b02fed9e8805c16d6e944c33e492d90b00000017160014b7d4b8423cc5d74a9c641ae4919ca0690145cf74ffffffffd61e5e028959c52441dfb58e7b900bc4d4333e9cc07df042ab32f974392d08c30400000017160014f7f17a5888a4363164dea437887a7d131939d57effffffff019fdd09000000000017a91449389954673a6f1bda11ef47cbfe553dafdc7860870247304402202e6f37012048d9ce989c29031f39162e3eddd02b97605cdb7cc0172e8fce2bc502207c99c4590671bf384b1c8b9ed29cf69122a91bd582799ce35a07d7a70d17b33d01210250ba656c9a80d57277131b3a549d8ea1155e571d410c622bd948c9d03caa5bc002483045022100d5db0e93793e2d4468d6e1a3fedb9ed3f54bda416e76f1563e69ee9cdcb1255f02203b81ce61306b75c91f3527f39b8730eff41d1fa9229e8262944c8fbb0a96efa4012103d32aa87475ad8c144a7076d044be822c964d09ba97a3bc622e2173f1b08c6429000000000100000000010216f4fa35ea654084bff53be37e6be5356ccd277b1207104614389818a5544f4406000000171600147c948b04b1966c9a2a03d40d9576abf1a5219bd70000000032038f840b614660c7c50ca3919b01587b9decd0dd910c683d6ed1fb369d32c40d00000017160014b9c946ddd0182126eb2320f441e36b8c791fac430000000001140231020000000017a9140d76961f0ee5afadc45c16c0905a49b87accff26870247304402200fbc663dc41fd24a8a077cd5f0ce0f35bf3005f3fd1d5ffa9befd436343379f70220698c22c6242ab18e8c0e7b803a31ee404c9e6151c2b53b9f5e0ff6af429882ae012102810cf8bf3191449c227f946fc7289e252068953de22be8b5a53b71e5456b5ad302483045022100de283f24e044a07c5f64dff7cfec618e2cf33550d0fcd3bbb13569cb57d10b6b02204991f1f75b091c30bafe1e2425a467cb3813c64b058a7c72ba792aa38b21139f012103c4914c58239ca45b003b53b4acff142800bc851a9a902c0407d7c8a0ae45fada000000000100000000010161e6f0c88e826bf7cb6f13c04efbac0544b6790bde160ccb9b8744563a1ed8890300000000ffffffff03503403000000000017a914f155f30885b7cfc1d407a497ef44f8108c97797e8780234300000000001976a9144d83d2450a9a33214c837562fee6c6dd6844319788ac8ba06607000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe040047304402204ace1075102682825abece05dc00e3d74385ceef923dbebabdc5489e7cfc6d1e02201e7040a37aa96569baeeefae85ecfbc32059ea21a14dc523435eb857f60f9673014730440220493d216923e8c1de42f6288487d07fc9c8ed27fc0099e52bdfe70f2ae486bd3c02203734bb5ec63d480523889852e30e93698fe525dc486b6bbc14182ed41515651501695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000001000000000101ea5e96ad5fa6b25110059f59addbcd56afa885a6ddb7486749d0ec3ba778b6f40100000000ffffffff037be500000000000017a9143609033c17b910ce4dd8a6d9e7220ae69365169c8775410300000000001976a914eacfaa9fdda1d559caa216b684aa90a99e8b963f88ac05e76307000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe0400483045022100f529bfd8e3ef11682516860e8541c9d009ec073eb6cb96328187dc7fb72e4c750220063afc4297738bfa7adf918dfb82252187575a50197d7ac33b28987137a663270147304402201a8c3c59d9c3cbb3f4c45276ae5e3029ecdd1ee2fd39e51ce52a9959888872dd02203a909049e5a9a2a037683bb86d524affecec589772c5a546117db68f0559308301695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000002000000017601b7ebc7d636161977518f600ced6624037c67a996b844a11439d0a1c667b6000000006a4730440220059bd4bc6cafb9cba5870fc62ff327b43aeedb235a6d6260e596c2cc5c69a2c502201dfd1f545626d072bb2f3cb9ac5cacf85706fd0fb97257b5d1e7c57a099e6b8c0121022ccb889a191577b2653cfd05046a2bb395082c048885b0049de88c0ad078c79ffdffffff0288ef1e000000000017a914922fd14fe3b42d803011bfb683dd21d1e26ce84d8745a30900000000001976a91493d5123e57c2beb88ca39a1e650d77124a02b1dd88ac0000000001000000000101608fadbb6ff1000cd1d3a2a7aa1154b4b518f3e1eb8bad5ad963608244c1c46f0000000000ffffffff039a3a13000000000017a914ae01d1fcac41f1adf6289f61379f21edb32a968d8750eb87000000000017a914ad1ab288c763549789438d35875fb34c7239924a873f51e906000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe040047304402206e9cf7e36a89ecb3270456770e8f98d0f6b8ad7b15a508c94cc5f50df901606f0220027b48309379d275f2910f0a956f3683c27c1baf76b16516325fb413b1a0554c0147304402207aee483e997d47c10d2bfc11ecb8d8c8be84c47ac87c1e8fc430688fe3bd755a0220073a24279dd90ddf39e24ed97a77aa28293f3f3fc28dded04b0191193ca5f57101695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae00000000010000000001014de0fb06a155da2937bce6fd78989044cf5f7b3c9a78397f35ea201e442be9ea05000000232200201d54bfa93b4ad858903dc6476683034578f104ba95853f51352bea07f8f8f67cffffffff0617dd030000000000160014c6eea74a2f678a0afe7d539ae790991ba4ee9408c0df0300000000001600148c4868e87a673bb495d4fd63b51bce8478179b260aac050000000000160014f97deccabf78af129921f090881f08cd6506bba481bf07000000000016001498894b64bf8319c0463346b0c354bef00081b660e9176701000000001976a9147623c7a5170dc0199b2529915c95b757efcfaf9488ac2f5a6d040000000017a914b28abb9cc7f4128fd1337db6c3955a00d852e87a8704004830450221008de2b21666a538a1969f19b00ddb1d9eecc1c72a7b4a933ddcc5c07aa0323e0c02202e041265dd64246f49747971a1851cf0c582fb2fef76ee09edd25a6a92cf66540147304402204538956af7224084c0232f5f6e61cf323058239cf87151d0ba47f280c626579d02202919a71e65c5f0cfd0a9c0d197ceaa61704585ff9fb64fe1c6e6aa210220e9c501695221021cd47af2bab3d01704ddea9448da5535b4ad08970a5d0d793d254874f6980a8e2102182ad85504812a828e12c463af52d7873fe3ec345bd188eb9adcffaa6b4a837b21030656ac04d48248d1bda5ad9f5ebf5f3e2fa5790c98a152e1ebbffe86735a569d53ae49a00a0001000000000101dd891d61b5e35ff44930578727683a863e7a9aab308ce7a4733868e5c17ac2420200000000ffffffff02e095430100000000220020744c6d2305324262fdf8879c5d5861bd2698386d7580301f61d2ac3bac423902ba52020000000000160014a2a2df1face4096386499303e5a1649b73b59f2a0400473044022009c6e487424d0c1744779e359d76921458530512f6591853948d16200f6876d702206f8874716ffedc5fd0a7001f99e8dc33208f8f513589c65a2927befac11836ff01473044022032319e25fa7f5356d20319436014d094dad24cd049cc53ebe81cc77a3a35376002206382098732ff9efee653abb563463faaeb9748cf341fb769c2436a13f2554f2d01475221027c78833ed042a0e9a7e9145a79eb850934d125d0bf615a50f2bb1c2337b3f6912103e00ac494b10c7e751af63b857aeab4f16cf5b1808566e338ce997f1e034fa88e52ae00000000010000000001010394a8cb2ebce07ffd9a9b7a1d2cbb9ca89b9fd13ef1aa4635074252a2b2464c0300000000ffffffff0270640800000000001976a914a91cb8c08f51563cc1eb42a1626ece749f3c727a88acb5e34707000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe0400473044022015ad31e6bb9079d148fb5a07716a9278b74265f1d44c634b693e51fe3fbc5ad3022074ed2027c2312f84b32309bd7dc72325b96ce36d328f9a3309f8643cb5eab6ae0147304402204443d112a4cff145878ef6b7213770ffa9c0066cc25f0ec7f25a628dbe05b5ce022049ce3c90b2d001315bb7b401bdfe0cdcb1dff3a3f70585752fd75c8f821e4bf401695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000001000000000106a53238304422386462ca3d6b1b49e09dbfd6c26143186086654f79121d53fc5600000000232200203f3ec17d5b34c38ee84b28bc0d558af9d161d02009628eff05868f2ee2323cd6ffffffffdd6f1ca26b2fc0c65266b41d2d1f493202143fa132f541ea2326f442d154e35a000000002322002007a5e41133a7b340a88fc3c23a1cb31979238c3ce641cab168ddd0df03c6936affffffff993530e024d9755c0601136936bb6dcab727841ec8da69cdd7b5143f92cd5d8e0000000023220020cc320a34cd92460ed7d63a7e28f615ef60527e047c22be172ebd4b0f5f1b1292ffffffff0314a2fb4119c75e30964b7248436dda12b3902275a73262cf7e4b4a331b27ce000000002322002032888b337a3c1402c71d463a8348c09c91007197bd55b0d26aed76d5f9938231ffffffff76c3ad71fac6750c1f2d781bc48fc5fc5720811c83c83a1bba661f7f7d80d7db00000000232200208ae227cd119308bf3a99c6beb64a1c2e4f740246b0568e5e33c25559267901c3ffffffffe8b8d87d47b94cf7fcd3f16c09dbb4b9d61fdf8d0d395697dcffa4df51ba06ef0400000023220020d992cffa5ac0b2ab28385936c19225f012af420b1bade5c1982a98685a9fe151ffffffff2359220000000000001976a914c753e70375a0cfc4bd7f80b7f86781382bec95ac88acde3300000000000017a9141eee949b62a6ebeacfe4c19e3fdf59cedf1376b787803e0000000000001600147b1acd101b72e9343f47b8b22af62162287f5d18cc5000000000000017a914d4179a675eab870b504176fb64eb3345b01d93a6879c5500000000000017a9146b348b65869e18a16a18a11d6a57704202f2bb89879a580000000000001976a91444090aaf772ffd83949b773bf6be2ad5a1d2fea788acd3620000000000001600145a04d53a2cf74beca4b9889a6ee860f13f6c597429640000000000001976a9143a595084be64ba7effcac3ecddae6e9025b9d6eb88aca58300000000000017a91456f6ae6045cd46104420542150192176cd7468ad87319b00000000000017a91486a100520abde5eaf732ff84fea2a6510b140b1f87c8af0000000000001976a914574d951b98959bc130d6b78b47eaddab70522c2288ac77c90000000000001976a9146de9f32fefd91e7eb01953779568178efd7fbb4c88ac43d300000000000017a914d465c930e541f8bc8a6edde26ce279c28a4f2d3f870c3301000000000017a91466a9d0509cabffdd1bc7ca507f002834e0d28953872e3f01000000000017a914580cd4fe1e6181948c53bfe8e1417909d4fa9394877c5701000000000017a9149cc4e2c17ed56bc1570ae8bb06df82f445827fd187d36601000000000016001463f5087637cd4292a3448666a174e15ad875668a0ff40100000000001976a914ed22e040772f00bc10cd4d46b8b04f0f04d7892188acf0490200000000001976a9148a9b72eb0ae7716d7511f715a021125a45c5400188ac1e8b02000000000017a91459e33043ccc778b07ab730acea59afa63144427687bdb50400000000001976a914711b78a4896ad54d1484a1077cc6402384f76e2988acfc190800000000001976a9142430de6b26d629911472ad5e9e43e457af72cf1688ac524e09000000000017a9149b90b453467e87f5c4b055afcd112bed9197d931872cf109000000000017a914b89d9097ca59f4598f15198057bd973620313d4587b7150b000000000017a9149044a3ed3a332a934e801396485646ba941a263b87653b0b000000000016001424207d4321e3d94ec4ab8457da24968368eff9b579500c000000000017a914c786838b79c827f5250acfa5c1b589b7c1f7b2be87d89b0d0000000000160014d9e4ba0a821ccfbc7c88c804a8552e2e17700318ac4e0e00000000001976a91436b27163400f6118309ce7c56dcaf390315c321188ac51eb0f00000000001976a9145f0f464b4e0359a4e18abf17e34433aba942963c88ac5ba81700000000001976a9148e50ed55d383d81f81777f1e7bbf523a8f8f22ed88acd4c22d000000000017a914b32118b97040ee2dc3ebb03074ed9d8a0c075bf887d9d94500000000001976a9147ab6877da91d503f0caca318e7c1d7ad97dba3e788acd6bd7100000000001976a914b6dc472d358f02da2f81ff787f49d3019781c1d388ac228e7c000000000017a9148c63591d284cd73e05190e6326bf404008496906870400483045022100998bf22470145249a6bbc613d3c3d36ff44db60f256704f8f8b78e10bce275a602202c37cdeb83e11f68c3b57fa5a10392b419ca789014fb4df244b3c3bb3d4610c90147304402207bd95cb2a85b4100f19dc938ff0cddb48a28bf46d3c6094dd65b2222d4400cee02207eecbd01dc4cfcfc56e046fc110255d4d8ed2839a5c0847e314783e606f4ec7f01695221025379ba3878136a2c318d2d2f33aef7218451b48fb525feaed0b7b00ef24935d2210388c36b59042708ecd6b3c73f236458909c69f561d7d75dfab5841d4334b8d2bd2103a6ddf5b4c25df6234ec4af25178778b673307aa8b17fbb3792b5ed134f5990e953ae040047304402200aa0790b71e33df6fde24d5d12529131c80812579feeddd54d9a5ba6340c888602207c39f4bfcf64d2acf5c021f39146d63716904be87dbf3259afbccdb9d4e87c0d0147304402201d95e0578c0c2ab4df5473e9ed86847621f4b0165dd9d602ca81a439966547ea02207b46c050202dceb3b5a104aa3b6941267d079c9f1bc4a42b2fdd62b7c72edf1b0169522103dc56f5aa54d6bef478c81e30672effed8221a3cbb429bbdd12b9653997c1b876210360c68956233d463fe431a5ef77505aaa81609fbb64cfc8933b3eb6b89a0c47e62103697e50a9040401d97d977fb2e02bd5d7b54bbd3753f970472005fe8d6e6c68ea53ae0400483045022100ec791c16ef981c4908aab26683c4592250025a266fc225a730b82d6a6319ca6802207539b19b79121954a1b0c66a08071c72aae206b4cb9a427acf3dcaefc12595a00147304402204a968dcc0534906a68c43beaf578d6967b847961ba8cedcfe4baf69143c2bbc9022022d339712c4c9c25f121fc847c1c7f1e3a9d2e5430eeeecd4935e48883c06b070169522103d7bd60c38d7aea89e4988dd5d83451a92bb65b86a4578ec28324a79b5b84b43e2103a99c5b570ce6f0d96aa924a0d9114ed3d73a8f8e4b878372983c64cb03fd568721027e63e3b1749e96ba2609f21597165a988b06b6bf3f1d51551f1c94e7a3dd38e953ae0400483045022100d1bccaed8ffdb139f950489fc446b7c233872a6632e527e23f58e95a3b2e9f400220125a73dd20a2ea9c63b579153a68822ba796ede10589344112d35d1387922d0701473044022043e3cf40b27893539182bb0ba360b617889b7d8fcf4b620c7fa4419628b230b5022057542820fa6d8eec0701b192e1b78d6e8d6c42770b82153c8676c0d9c87581b001695221023acc221ddea555cdf98ab345cf940b3b28f83175b0fc3bf0fe837e0ab51f647b2102d9f49d3caed0365398fc6447b7989506a49edb4af626a6fb96fe8a116bab609c21023fed83b7028a84b52208fa4755a1d9c9afdfa5f0c6f92e4c486f9563d8aeb34153ae04004730440220523aaabab06d86b721a66af38c754c4600e81d34c8d532cd4d2d8c61926967bc022036e4b26e8a10bf716a70143d8fdad0558e891800a937c450119ecf11d4bd7b930147304402203918f1a538ede5b186d559585ca004aa343a829da1131b66e2c54f07c956098702205ef52bb508f0f50a6be8e4ba22134367ca2e025b0b0b2fad5e6cc7f46ca4365c0169522103c0ee790efd10375b0f8ef78648ea92e1f75d359e0147578f098f83be7fc27d082102564029cb1e4fbfdc452a014a59ed14de0482f1eb9965f1a8f62ba481fe23bf762102936f30d9068aaed8f7bfb54261faf67b3a5aeae82841c92e6f14139f7b82b81e53ae0400483045022100f70037815095b247137b6914512d5a82feb7667051d8005d269ebf325e7dd04802202996497c13007dac9486bddfeddd92b0ef5ffdfd5cb0a12a2f2b6fa9d8026c08014730440220672fef702c3838357341299b9b526af7c2ddd2ff9474759907a58ff0a65a827c022078226de16704d83de59a7c740b76313ab6a813df8505c6948e3ccd58c5ca5d84016952210258a0b1ce9790fe2fabc68be2d32a0873bb62c835e14d76d357320470d24d4fb921026b6a31702b831ed46339e76a470afddb5190516ffdbff8e86c4b82a6778a1d572103f7f3733a1811f7500f87de73a8dc19dcad0eea3caa710ad991328671610d5a8e53ae49a00a0001000000000101a9d09429106054032743d2461e99b1cdf5e3a1954da0f01d097993cd4cc5ee7c08000000232200200260fc464486f8d56be3aca9aa8bf24feb3963545db5efd97e255cc2e8698d5affffffff0b0589000000000000160014f2af5fe24ac0eb74fe5727e10c71f3c8bce916fb4cab01000000000016001429983bd159aa17b2e1c48f548c5b5bfc801a5c9735fb0300000000001976a914d00f26c4ec6dc87083c386f12125e9d801ef631f88ac87fb0300000000001976a914b7118574c8a22f1b425a6ebbd1ea854a4ca0eb4c88ac571d05000000000017a91422f1bf94825d0d83c1c18fc2cb7c81d827fe3dfd87ca5e0b00000000001976a914b43f8c786e94e18d10c3779d63b9fd654840dc8688ac97600b00000000001976a914eb8b8df2d0e134852d603d6a705f372dba105d6988ac8f300e00000000001976a914d676bc2c3cf4e599d68331dc776b242a1c58b64d88ac60b919000000000017a914254a0705e5ddcd0deb90ea7ecdc426e2cedfb6208787a53600000000001976a9142b16065047663cd38b12abea724c5b1849e404a588ac5c0022050000000017a9144a9a8e5c97508db512cab4a8cb153422b1dd1c45870400483045022100b07d994373fe895c3b6387bf7db3576f8386ee0fc488a2f8bdb4af2f38d07df602201d98a1e6b6bd694f7963c4435d8f83bfa8b8b943a687c05ee8becd22272e1362014730440220270f88e5ad3280b1a464e3cd735e9d54e58536b92c49b1ccef3aadf0db61e9e5022065d459f7dfa651663913df34f30bffc53e2ab1dad3ae06439d9341532c477ead0169522103e25f9bcd9ab8baa763774dc5401e2fc0124fced6a6a5bdf42daf4075099622202102fc3acdccbe9a3627f361a6b063f01136e2673de7029b65d2162b06797663d6e821024830f8871991baa519420efe127a466dd744b1db78946c7adbfead0befad34ac53ae4aa00a0001000000000101155096aaeb7facea14fcf8dd278c039249f4f9ee3436b3864c341a2c019200610100000017160014700c4f328f810257908f7dc38cc8287651286ca0ffffffff020f980200000000001976a914c9b2e6a5e3a1eb81680975c29c42306acea9a29788ac59115d000000000017a914128dec75ecd34c283b459e3bc4cc4d5268944d70870247304402204fd272abb37d1b19e51bfa6f2a238a4bf841d853f7d2e10e4b74f778b7b5e24c022043cdef6e896d3b0cb51f79c1385a17762f8f7b6e60f230b7e90a5ee2317c5e470121029ebeae29d65dea76b4d2d08556db3987cb2d154ecda037f3fa62cce14b7522c30000000001000000000101229405d60a78a24d41211f540289c13d0dd1747290e63036f154c3be50143b272b00000000ffffffff43870001000000000016001446bca382fc7b7cf83f059ae17016498b0caff1edd8d600000000000017a914084e66c423e9e2958fb73dc0f7f5e2a16490392587eaa517000000000017a914ce683e1a7872d4ee1a7033c7e344f771ec9186db87518301000000000017a914038f74775de9de6336554ecd0704be14f0f79c018716d703000000000017a9143e2981173101222a79832e282e31abe5cfc4b11c8718b906000000000017a9149b3478092591ecfcb0b46dbdd5b9ae5da6bea4b887f3001b000000000017a9146ac2c789120bfa2f8254d966dd0bbb69ffab136b87105843000000000017a914b813a95d2dd1d193d5db908bdeffafc992031b7e874e9200000000000017a9148de828ea53d06e2b101e7b35216de9428e2966e98734020100000000001976a914e9d62b80bb5e6b4390e65b443a724c8e3a0e3a7e88ac206b10000000000017a91402673f9a53dd800be4accf7096248e2ade6730cd876c0402000000000017a914e2de935deff7d5a573ab0bd77e60f872e0ebc9f987ea8e06000000000017a914871978c6bdfe8fe1daaf9618ed865a8a577f9ff087d2870000000000001976a9140a5b034b0988b24e1303544e721e4c38a208db8b88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7640ae0100000000001976a914b023d033efb14a0efea884d6213dfcfd0e62b88888acbad001000000000017a9146cd0628096969de251b3c074b92072828bc0d3cc878d5900000000000017a914cdf62a906a43d45be58e29fe8532fbc3e1390acb870f3600000000000017a9144dea624fdaeba9dd252d986faf306596ed37981f8707063201000000001600140a08f612da830c242cf4688fd2584fa744ec685251d101000000000017a914a278108ca2d0ee1464f7494d9519040e06c005cf87561a02000000000017a914e2983e32cb26c1ac2bef3d94030c1c7691cbaf5887361f43000000000017a914a5d47bd778e4287b2667add2d950097f495789d787672354000000000017a9148a66d3680ed872c53a3826d3163dbc7f1cec92af878abc0100000000001976a9144418ea7aa97b829d3670f2414b073b0545a13ce088ac438801000000000017a91425f58a4ce23f759744fe39bdf055d2d239e04c728789ad07000000000017a914fb8741f2dde840046b3b2a31369d3b36024843ed87e6150b00000000001976a9142e4a0ba1eef5bca91dd30e18d81aae99fbd81c8788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76de6702000000000017a914e07bdbeeb47fce6978382355492c2af5f3c5bba2870c9e2100000000001976a914951bcbc4ebc63d540e2a653a48a051c723157a0c88ac404b4c000000000017a91428a07fd45f38e14183f673ceb71673afc5452df1877cb0020000000000160014e6568fc2b546bbac98e4a1925e0b68964b5e7dc432b006000000000017a9146a5605bd8bab40db57b2d2def62f42f17c70834d87b66d06000000000017a91403d0df2249d0d2d6970299c6aab95333790f28ce875aae0100000000001976a914bfb45dd021d4ac96ff424b74bab6caacfd3acd5d88ac7ae001000000000017a914803dddd4cde72992bc9cb94766408acceef9be0e8738c700000000000017a914da14bbcaa164b54906616470e918d7f9deca3ea387dfa300000000000017a914ad45f5986729ac385ddfd89db8588382b1fc80e5877bae01000000000017a914242ea9c06adfbb0528161be44c9b79d7385f74a7878c8df21b000000001600144fb2b94f78615339b292171d5baa71dc5d426f1aa23003000000000017a914ffdaa89b34cb3a3cbdb42019ccdf6a69cad334a68725c316000000000017a9148a399272c27cb796c62cf5e22ac0ce8180f1a1ac87f6fe1000000000001976a91454bdf06c179960ad61edfccdee08456afb9531f888ac0a6c0400000000001976a9141e7359f33e0fd12634789e797537cac5ae8d40b488acad5e0000000000001976a91460225f52353b6b6b71159d30675da1532119a6aa88ac03fd00000000000017a914a5e31888193ddce873fcefd3714c969120a2a1a3875d5700000000000016001404bcf82d749bcf4ee0344e28841dfb9608802bf40e3700000000000017a9149bbaf7231d6e4ab3c445b7958ec3ac4347c6877687a6c905000000000017a914f0e2a8285264d277a562c87da21a90397a61a8f587752f0200000000001976a91475a5552d40350c9077fc8ed8bf1286500ba42d4c88ac55d901000000000017a914dd69a89347008716f8939f8e69a04a9ed8b74ca587c8cc10000000000017a914ac71ada37a12d8c0c7c921e3c7832b6749dbe7bf87400d0300000000001976a914ae746d53ecb7877ace8fea79bdaf2c019d2d9c9088ac9f3304000000000017a914f99e27b5cc1d259ec5d89e25cb979d14dfb1e7b487d20908000000000017a914127025844a5b2614a422ff4fe184bc9369e52f49878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b0570200000000001976a914012e8d3c383c92903bbab0d1319ac3ae25b50c6f88accac800000000000017a914ba82bd97bb6727e46a308677f72e935f21db0cf9878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7685010200000000001976a914502d9a2848801dd4e9a6c5fa63dc0bbee916105588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a85b01000000000017a914f33861c95280fb5b06a0d9ff3668760aefb27409872a4902000000000017a914e13deb7c46fcd1b0fdc890d37162fa8e47ae53a787f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76559d04000000000017a91484303ac8f5c8cf2f3b6c92af7d1b6dd08b6269a387a08601000000000017a914f3f6c3605868789a697d6e9545dcd3c16c74644a8702483045022100bf969e36d815e432b6d3c6ca78c87928c108d33c50a2708ac34e4c971db90cb2022033fc87376708070f7269ca391fbf2c9a7f4f41de6e5207349e9724c26f029edb012102c4c2cb439e36dcfbfe2e81584abf7a3c8f47ab6cfe5600dcb34335197f8d26530000000001000000015b3d9acadd3310e7ffa98c93c311f3b7d6fc9f34957b522a9a17adbcf06f3c16350000006b4830450221009e43ba294b11955c8c1a4dec84663a941db7303138a494c54bae2a3f71bb4413022004ac8afb7ef8b3e399d8ce5ea31299d6fc3cb31a52b101896944f536d544c5250121036a2ab0c26c8e86a28f62a72d335d3ebc1628224832f52ee2018f8b8ca0e4d98dffffffff01b4ff02000000000017a914d0da5bc057fdddb3cfece9a986381946592a7a00870000000001000000000101039c8801357c75bbfc3d803823fe0040e2fbd86b54f53f19d639ed4b9a8780bf0000000017160014e8321d55587f0ba849a30eaa22171d2e214558f8ffffffff0297b013000000000017a914eb923a8b17c82d33173b8ec5b01f0a425b74402287257b47000000000017a9140e961698ef6018cb3752afd92b5580a81d3e6af7870247304402200eb5d01ba8a95958afca1e8f782a494852a52c44686e5aa14a06bdebc51f35330220449e6a93ee41a1a3a27079c80fade7d7a1c07e5e2925fdaa5b67d5112d9e19d90121026f669e08087de4123cbce7a0013405746e1757ad0ddd58ff1a197a784fa5781100000000010000000001010db06af505c06303412d9e8deb5d169b658572939f30608f76fb29dc455bf3d30600000017160014d6c1d34d5a3adbbb131afd2f4410b400b9306dadffffffff022c5f00000000000017a914020dcf019d6719dec373f488ea30aabc935bb58087772603000000000017a914875ba2916b5ca18cf720df27b12f781c5ff14c3b87024730440220330dff3e8ecccd1bf5cba3d4eca4109752e8d03dc264c8991a8778e75d5c667902205e65d6e5766dd1b41674e033a25a22a3fb0d5fa9c8103576d2a754a0b2f3edb701210358d0a293242b27dc0b2aa3601ba319527dde67ab3111d304fdc97328c4a5922000000000010000000001010fb9ade01a052246858a2b5c6e6b4693b9331f301f3636823b075a13c70d9d270100000017160014ba1bf1b872844cece9be65add495acd687ec42f1ffffffff028cbb21000000000017a914702abe7bb699d8e1b7860a1fe1e65619899eb94b87945000000000000017a9140b131d428d8a7a7c1a932e73df46dcd691ad73f58702483045022100a651654fc57ed66257d5104f043e9e4d02c2769da9bc1df98de0d31c4f5b6d1e02204dbdcc758b0ffac78fcc2f160d72fd8bfb624d007ed252f26dd2416f09ba03b1012102abda5fd09544370429485f522b5870d5705ff082648dc12414985dbecc35c0610000000001000000000101e84f1332896aa76fdb9018a1e1ca0a57fd67fda58145477c0721439b36ba8ae50100000017160014d5a8bd422736219b4df70fc433757aaa4b655ef1ffffffff02714d00000000000017a9145a1dcf9785dc6e95a269d7b004fe4a7df55d9d00871daf00000000000017a9146b0c45124ee3fd495684271f804bdda983d3536a8702473044022050b60d355703f75de51a48054bcdea3fa6d8fd1433d4fb9ff465d7567c367aa30220381dcaf43d316ef6bc95084decff61544d84b3bd0882512dd92faf25492ad5cc012102d00c91545b6dca1320eb817358310d8ae22b17c60ddfe62879f1f4cae57467bd00000000020000000001012fb97ebd486f5c9f90a20b02ecb66cd133a19af753345c1bb8dbb1cf0d50ada20100000000ffffffff023f8a04000000000017a9144a88c2710afe95c60d8aa0bb06d69d5a33ab2c0e87523902000000000016001440bed5c8bdb601e064e3f21c5590dc823a25811d024730440220553800cee1827cc5d7645c73318659771b7f2362c08fab6f180e76476d7315ad0220259a5997b83223ac0202dcddae3226f7786e6c9211566b70dddcf2aa7d9f69d2012102aa2c5715bceb4e5210e954dd5bd76a39852e6aac409cf5c4da4916ceffb1359500000000020000000001013ec805dcf0ed2573cd063efef1f7dec035516bb3bfc615ee2670bfa4d06024c80400000000ffffffff021161ed0500000000160014acaec1acae955f7aa33f5c2d167bd37b69f8638702a7fd0b0000000017a9143a79cbd50994a2c1f8126675b6e95f51f417e5dd8702483045022100c6682340ebe1715c34dbf5b1cc0dc62f5191bb5132531a767c8fff58afc6671e022000ca0a1e5b655326be5f6f5db0538f40cea725004b305551a61e9bb445a07ea501210296c88f8ee3c752c3696578d935248b67a564a7fda7cc971a312f812b05b795940000000002000000000101dae0801f9e17f9fcf292d2c53309c891453a1608d7f41b6f0adda72f458af7bc0100000000ffffffff027f70010000000000160014f1ff2db1fda3d48000f87c5987b98be07d273a16a07101000000000017a914079ce7663b9f5468bfe8c4ceeeb85119da1ba8078702483045022100f8d12b3b62c34fdcedd817eafff13222de25d4b5483e901f8651cc95e9ed762102203c64b2d7ee7483fa06ff6860d3568939ff89994be33823f5fbe2155f171cf24d012102c79180575072c7ed80673a4b442897b67e7597d2ac51bedb5be5ecc3dac78ed300000000020000000001012423bab5dc6b33acb94bf4e3763db25d2a3b6b74cf5dc93a113c399dbffbaa020100000000ffffffff028dbd00000000000017a9143b98ed6c0f1a695853ce07f2e525b8a1250054818764300100000000001600148ea23c36581ffba5bcc2e896f336c3ce3c8e24ab02473044022046062ff5cf9bedea041c69748e65df7ed26dd72438becb8ce70e35cc3a1c589202204323fcf7e6d9f9e84663addab22927f250a65e0b1befbb59e9af148852f1614e01210214379722b2d1108d03e04559e18e9dad5b3a536eb06159f5ddd16719855934a4000000000200000000010112375f175857f1dce19dec8b9b070adf3a9979caf8a72da6e9a841e95958d29e0100000000ffffffff02c62000000000000017a914d71cc0cfbda6c7d2e1d8f6213b62bde65f0bf9ac87884b170000000000160014b91de0cf0bb161136c5f6c4d48cd70dd0376f1290247304402207e22f096ecbd94c76724514fdff3435b52b2e7a66f239aec4eaa004087925b4b02202016c34f6338cd3089641cd53dbd9556cb666c648b51fce1f482e05e2e914c8c012103c42d87854fc3bcc6fdb7ab18b3d1ae3cc22397b3820035f7bf7809cb3fe7cc9e0000000002000000000101138657ea0d90b5e8b8bd41cee8c98ef30132693339222915c999691205e714ec0100000000ffffffff0255ac00000000000017a914340fbc78ab8cc428a04183621f7a6d20ac703c858773230e00000000001600143ebd19c5fc7f807f5066b8f21f47df0d042e4c800248304502210085358877698faed372f61224616ed1bb241ba1c8765045f911d115c907b8c900022060084f9461e463b2b97dc10c36feaaed60d6dac73fdbf100480c7c7cdc84ed2f012103ba8eec8cfe6bca8ff9bac88fe830e40b030bcb2814cb8a267f4429648385ff42000000000200000000010167fc50b79f049264efee2132290925c1826e3f34dfa34462fd939d31893170060100000000ffffffff0211c001000000000017a9142a7ddd0f76294df2ab1f2e801d79cafb85d5e751872a01060000000000160014bf2f4310bab7e43f04e57e3bb21abcbb210b32130247304402203b52881096cd1dc58aabd8d3d487ee9fdbf41d5748530f507c3c16e0a55d7dc9022059984958d7fd097892953098f18cf5a4600a6a4dcb5b095e1a6db20da6adec85012102a08755f363413e9bc8f9e50e9b226c6f4a7eda1cd30c6c334125e33341a36d720000000002000000000101fb93287eedc878ab4bc37c2595e0805c5a680261747a484be567e0ef0123c1da0100000000ffffffff021088271d0000000017a914249c595e4a4061b744f5b3dc2317db825e5efadc8714ba9b060000000016001442207beb4ce1b3aca9808d848fe5c1fdee783d5c0247304402206e5327648d7d801fe44189f3c5b584c4e95a4d8a2b9932064ba40b9d667589f9022039dc5240385b331760b77f0f051922977a0d17b70c942440c774c2ef577a3f38012102aa1924fc6cfd0de06e554eb067314ce5ee4ca63c85f7afae40f324cc411171ef0000000002000000000101beb83c7388041f3a9c6a25e33e7bf825909c84b72c61c854b316c33363ceb5e85100000000ffffffff0213c50d000000000017a914f6b5cbadb6d127a1f22465e0e016e0e68f180e9187252f310000000000160014def513b6fdc7b303b422d2877f809900a6b3024e02483045022100dddcc78aa984d6030d54914f5ddee87053f6db590d1da7c8f16f1570a503dcc80220268a290cabb1be38d007966124472ed0501e84e088fdac4b4722adc43b99ae76012103c613c87377e2bbc5b91912e842f418d40a4b129b2549f48048cd3ec18627c8920000000002000000000101b0d6deefe72636812ec46d72f4f1e5c0cefa4699af2fded49828b2caa6f4bcf60100000000ffffffff02e3ad01000000000017a914d2805be62fa7bb0bc86ae73130fdf8459da8b19a87715105000000000016001448fca6d15a2adad16c196cfe1cef10a70782428c02483045022100c3f0d625f2b35d8cb21b41203f7db30110665d42e68dd75035e3f07d5ec0385e022057ab8314dcc01f57ac0977ff7332e6a7461487a570f646b63c75b5e02d34f862012102a0d6a1daa5f87bd742c56de26ddb61e328da83d62faef7fb133d87017a19b757000000000200000000010177159b03ec84deea456e378b021593f07db30835a789d8db8c0e72d9c50be1330100000000ffffffff02af4e04000000000017a9143f94f2a2b1715bae3e3b0867d12719d44cba6eea879b9c1e00000000001600143aa02f1653e86694038ae9e513e42dec1bdaf5fd0247304402201ca3874b9abb14f05b26f952d8ffdcec1bbd55a4893bf2455bbd93debd6ae83f02204f04241b5e89366ee9a1a180cde11b9ae74010e4adfde0bd97e854e6036c050a012102f329e04454285ca9252b10ea4c5773989aca98e038cf712d9bf39531b6e5ca300000000001000000000101837ff4b7c1bfb2b9076d1b0ae92b07f55021d9a83b7b170a327e6298110ad6f30000000000ffffffff0284ae01000000000017a9147170ed7f17aac1dbd26d074915e2e5222e0ff51c8704760800000000001600146b98459e08245eed65d1386d75b1c8321b756632024730440220273e5eb3af67b95f93bc6340e35e05a66f1d66d29df90eae735b80cf14089fc902207835023e355d8327e50f0726e3d8fdd36c7aefaa88fc03ffd2794feb95480337012103be9a550e97f468c6500c573a893191226f8d4c0820e3fdadf8ff6cbe4ee0af03000000000200000000010136b64bfc941aa577c4460cab7156e903fbb0c98bb619d8c645784edb84f15bd70100000000ffffffff0258ac00000000000017a914ca5a4b064cba0f74c84d4e839c7dad87c278bef787fc1eb400000000001600148cfe4379bc0f17b885406bd53fdd8025b3e326b3024730440220231796afcc692d0ba63ac7fc8a4b93a3e86a7b824048c7091d2e4e754fc7f93d0220419908f7ccd6929b8aa8abc685065a6ff1a68ed3e10589bd6053f03e695986a3012103f5c7e65dfd52ccada9464588415b5253219d12322785b4b432006cc503760a5e0000000002000000000101033f073e85bb47678bdb4b92b082c5ca1af488bbaefec2359903af3e8ce3e4d30100000000ffffffff02eca80c00000000001600148bcbf57357018e94bc1f3cd0424a7ad5d06fa64624f61a000000000017a914353e4d3f2061f00ac3a9b8d2750bd6e651f67bb78702473044022008ea5b1e394387347bac83c14bebe6d9cd660081738046d8188524ae01427b61022060565eb701804659fe54539ab0161ac1b421cb36721159a94e5480a343b846e7012103cbf4c058be4f7bb8788a9d38d36174a440d0cbf2ec80a2190f225f296fe779b800000000020000000001012d1d9a3941412ba80932c5e8113699e1802adc97e276f2c60887dd1606e5810b0100000000ffffffff02915c03000000000017a9141468a4dff58f26f1c3b2acb108ea7ef0f498c56b87ed0c4800000000001600143130942c9725513bd67eb9eaf30a4941c41c65df024830450221008fa0b6157ef7ee3e13b0f41942d7cffe80e2801d855f159e0aa764c2b5049eb602201658b7a24854636a165cc7fae478d0f6546e9630d7e39bde61fbe622781697c9012103cfa7d8581463ec7f0990871fe27957aa621f5d6f94bf663ade1fd5f4ab23b535000000000200000000010191b5460f1def86af5bc3118c4cc9cdd364484e537b0d85ce1b0362cfdfa1f4bb0100000000ffffffff02082404000000000017a914805970aca819ea3758a7dcfa81a33edd615d563c8733244d000000000016001410742a5759f64825cd56d1758625842590a01a0002483045022100b7a6dcd652f097f0477e59e81a5d61060a9cb74d93cc754450203b4538b2fdd602207f99011f82fe38bac69fe7717c0fc3d0b022c0d6e6ee3884224cd8fdf19195080121039e850f18f3f9efd229fd413bf53ed9b3769be7b9b71405590839f9cd1f5a4007000000000200000000010171daaa90b30d7a6f9dc151972184319be32f51d705f54c8387d78328f440f6b00100000000ffffffff0241a921000000000017a9145ca1726ee471e0e4a5052c26bb66708dc7e01e7a8720480900000000001600144ddabc13f82c2b2edda1de604ed375d7e9da4b5d0248304502210091243ae0dc5605bf6d2f1715c71c35d140849bb051645528c5c4f19190c122b002202ad60b6967d802b25b9ccc7d9e65e86ae2800bd8569ef08a7c91a4a0cb2424a00121029d2b3b4e86148d61c57b5c65bd95baf1e834fca8bae6bc466ff73077d79f980e000000000100000000010108710596fe200e0a568ba1b0f5478895976e611c3e70a259dc52858667c266b40d00000023220020d1a7b830f26e15899ad61e70ca6754b79feb91f62ee3a5096e3e54030ace652dffffffff0cd1e200000000000017a914367438fd4d7aed2e257fa01cc8de3d61536e8be2872c6a0100000000001976a9144ab31f9fcf5522c3dec385aee3f9b8f3e29942f188acd8e20200000000001976a914e86470cb374e255b2a29f0d12353c53cc0aab0e288accb0803000000000017a914f4e3d7a584884eb30885613a5df9783549d79ea387a12f04000000000017a91407f13051be5adacb56d6fb4331b082967e4fa531874e650700000000001976a9142f64c252c2200e8a4018489d8b1ba28b430434d488ac8b200d000000000017a914ce79a7c912220f8ba2ade369ba2cd103c9853f1787ccd410000000000017a914fe357885e8d091fca49adc9a2ea3b7cc59455ca88788d71d0000000000160014f9ceeef6bd5f53f4dff5872196f4a91333ebba72f4522d00000000001976a914bde4970384e6442f55c4d5592bfd222d91ea0b6588acf2964800000000001976a914aef0906b6970c78a64a0430aec8a9ac561de7fff88acdb77f4000000000017a9148b90bbe3bc3538d3ab492392073976b1f2dfbcdf87040048304502210093f2af8bd2a7024cd3224101a8caf8c801736f80598ded529943cca7b1f02d6102200dfec3c170201c3f13ed91ae6b5ce36d4da310800e7994fe27f95a507120322c014730440220176275b9ac64199d9763ca092e943a215d8742073cf1e6ec504a69cfaa92e53d02201cfd8ad38bcf1763f3f21c7f5c43122df7f2ff431d0abccc0a559f69fb17bc570169522102978a0484bc56566d7d4150e080c15c17ea6ebd36983dce58b10baed8d08e84822102be4f29861cb3d76eb67f0c4fb8d9277874eba59b56e577050596188a9aa234e021021c021b0b0e201a051628bff532747b5b27e3c1542b82d5febb154b0683c09b9753ae49a00a00020000000001025698602fdaeb32c2d15497c8a651eb680c854a8388cea7e990d89da944787dd40100000000feffffffb91d17d8e52ca4b80e3a7f1854e78fef05c088157f71a2c45c285603414100be0000000017160014e9f4bc5aeb835b607b4dc4fb462085ff8ac84924feffffff0280090d000000000016001457caa4c2937eb05e47fb2b1bb9843981769a30400dce20000000000016001481834de77fe312cec4364f1642beec0b528d1a520247304402207f8f735228b2720b63f6064b6a1dabfaf4861af980a958cb421c5580a30239ad022073af87c66d9d5266d832d021d7fb1f8cc5d939f8c5d7d8641ed9b3f42f39f1c0012103bb39983d872b19259ea80bf7ef77db246433e7d7fddbb72cfa2fb1bd434c9f730247304402205b86156d0593ed6ada49cb4c699f0234a4b0cb2dc69c11f02f163358cbf007e0022061d2667c1753b45d1eaeb34bb709fcee5053fb4bf562f77be1a4b38edc057fac012102e246d2b6fb73b3c7331a4ccfc9ea9ec43e57b2c5054666cf9a6fd9cd4cc0997c47a00a00010000000001020d07c5d8c05fa66c2720e7bbc8584628619b28df8923159f9d7a34d4f6b40b0e0000000000ffffffffa9afe7d9217a46fe58ff1dce05b8d4f8dd815ba72566ae6918a3ad88b9096c55010000006b483045022100906a8f0dce576f0ad7e45f24ee8cfc887879d62354c39584330a8d052cef9f4202206b1e909c09a7059ab2155f54ac27a98af60c37e87beeaf5ff7016cac01088312012103f9ace73eaef964737f047e72f3bd70279c55a86a0735c294ea9c3dc293cccd39ffffffff02ee630d000000000017a914720e6230fbea943fe2e4f590f736074a4d4fb8e2872a1800000000000017a9145720dbdb5d524cb282503b1434ecfbcabea267ed870247304402204a07c17dcf0851ed306b8df025d81f8acb78ae0c905b3733db66835e0973413002205413ce8ef296ffd38190b62f16a0c0daedf3e70dbe575bc72fbe9aae51965ee101210328081d35263a526330f8d03275faafa0e9ac8ca3eb2ab384d0215f8b7425452400000000000100000000010123ef338915ec470322286580eb9bd189a7cd38159f1d2fd3a093a879005838b50500000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff0f7b0501000000000016001491d618e22e823abe1c1a0d86855e1d2647680fb7694d0100000000001976a914cd35056236fbd73ec1f6ff7a001bd2faf6e81ca588ac0aca02000000000017a914ea4e7f5c221eca603c3d143728ac9a3efecb458f87d36304000000000017a91470654a2848075a45648975b2b6743742d899950287aba20600000000001976a914784ebc704455b0702f84757db754b846e4a4839088ac03ea06000000000017a914872be64d13ae7eb4a58b99e49ea05c957e2f7e8187f24d0800000000001600141f10e04780942b0a0abade152cd0b0240b506f7754830c000000000017a91458aed14ac3fca8ecd827d2a9ecfd87b0ee59acc28750060e000000000017a914f668ee9dee5be9f4047bfb8d0a6c178216e0ba3187d29c1a000000000017a91479c5e4960b3364176f79af9bba6ce520ff6871e28714ee1b0000000000160014b71f14f84ce5075a3baee34d156c6d3e4b0b237d9ef21d00000000001976a9140fc765ceff3e2323da52f9b5774fbaf0b5297a9088ac540b2f0000000000160014235b0cd702f4e9f84ae0f19ed9e62eaa5e88a6bc0e6b4b000000000017a914288ca8025955f8835f655f97f693702f36d4c0fc8776088c00000000001600144650f80d43200ed6479e0e766790ad793a61ebf10400483045022100855b3e7c4d532aee591a442deb9d263639e40490ec21d466bc84977135ea2e0902204f3fd8c7477a1164ad505028122ca3b7bed1de9bef73d0ccaf790162c49e9ec701473044022031b5dedcf8c9933e07e221b5ad989944b31df347573e3def7855fe9edf6acdce022059de9d04ce25be7753c15cd1553779e0bfbafbf90b1024a76626b4ab43d4bb9d0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae49a00a0001000000000103a4f542ec63084899a9693d08750a11fb6b959fd7cea19fa7b2158bb14892a8140000000023220020da60fa0da759ea734bff64867e769eb25c7949674c454c16b7b65be8f1d8fd60ffffffff5a790a6b5f172ef0365bf329c5253df0083f62930734b4a2919943e7295c3a350000000023220020c494747a708dbcb207e9674e9ae3cab757595ee7a95287b86ef2dc1b9186697effffffff27ccda6204336824588ad0526b03c44baae57efb64494fd27efd9d9776606d460100000023220020bccdcbd4bd0f49470180413c1cd07fbe4698c92d9b3890b195548c56a31c2644ffffffff01f4484e000000000017a914b6f42dddefc65b1f71fd93177b1ad6a4727afba387040047304402200ff88ff5f482d062ae9b5bdc34e9412aaf97c51d1054d8d2a6ad6ebb7ea18cc402200165b7df85db4132527218e959a6da473fa801c606e3e28745cca545e5fa1cb401473044022039343161dd2c3c2d130baba2251e4065ff2861a2d44b11744cc93cb53304e89a022013e1b584420d7c03982c5cb9573218755f72e9c4b536197b3f0312758898051e01695221023f7139e2219306c7e40aa67dc415790d534fc18ceccc2c66cbb126ae0f332d7821034a4fe733cd78039379cf6d9e234314f7724ac0f3468c0368dd85c2a76beebadb2102e5a0f0eae1e8a35e025ad1b7d0cd7c9bb155de847dffb9aaeecbae698a8da70f53ae0400483045022100ff65c6a02c4ad2b786fd60d8b35fa4245ad46e874b39930ebbe2f2e9d08fcafb022027e58175a439243a112e835bf630832391d344f2957dfeef126b177e06c63f9201473044022043fd97229e0777f05e791dc20e7cb7907e3c4ef08d4cf90ccd8a0ecb82cc92500220329dee745bdc6812b0deb42a6d02f72ddd83b4e45efedfa9e5266b51b76e69af01695221039c35a36b5b90e54a7912b1ca05dfacf509e8c6a4513ac6f71f281663e49332562102b8b8087965b93c9dbc4e31b9d8c43041aa821bdce3b63270c95013229eb5599f2102eab645c97e7b88e3325179b2920e6aba40108232426e974d314cee6eb5bf363753ae0400473044022030853f9829871ec34f7617428fecf4e20e5045c89a5e581f92b2a53dba4cb0ce02203127de7051a8b4286483157e54de1abdf8c28d659aef41d7e4ecedb7e5d632280147304402204009710f4c1a65e97fed8d1009c77a387dd010226c144fa713041431ab51b13502204adc70a746f2a3f3b1b05c815de5c36b808b1a8527b08fb230af01e8511a155e0169522103b5cd7f8247865f9b884bcee2ce265c4a6734a4cbeb895c17f55fcc26ce1f97c1210378f2ea608db6919a63ce29a36fe9c6c8f749222ec0baccf37747fa037db508bd210292b0f153c6721e1c68f57d411b2109e7eeb45c4d96b5fbe25892ebd2bfe1506353ae47a00a00010000000001021ac5f3a4e094c1d675c2dc28a27a1672629233e5d49b2c4eb6d378e2e80640f9010000002322002007f0fd7b1da8039f2402d02cfc04184be1aa73c31112c0cb5186c1e0a1a6c8dcffffffff62870df1a845fd835237c58aca65d49990b7ca152c74ef81fef52bd9bc8b29ac170000002322002033a45ce83ccadcf9f478f2ebec165861e15d8233f4a685e0bb4dbd8810177893ffffffff01ff6804000000000017a9142627466df2e7f65b92d0dd3a93a6e2205ae71206870400483045022100e936e805f348e62c0a2eebb1bee24e4087ec38cafca5c85f140051045c5c03210220743f648167e3eee308ae2db6b1ec3346ff1c60c43f0df46d0c9488ee778b4bba01473044022074a2e8dac644e33f0b39e0d8c59cdef61baa089ba800467afbb024d1e06dde7b0220316649d8df3cc3d8d4e410edb64173def93c13afac40437694c6a2ca053d6f4b01695221030c09be4c4e1f551594b3ceee30ad291979f569bd64597fd84652f75c8f192891210303bff3c5cb9df49986c18a667af622f6e129e3030e534a4bdf6bd4f8cb25dd73210260f4453f749676daa6859112a45e0cea8d44dacd81ea5f24ee306c0d33c1b2fd53ae04004830450221009fea064a707ca70cf62130c0e4e47de17e809db917e994649030bbd096e40aa602205a150f1208fdb09c8f10520b2e885163a9b05ae084380ea15b95401d9116b21101473044022050aca4d3083e435ea1cf167729775bb4a27eb569fed8aa5cccc273657c75eaa10220074f3a4338c29c78900c43ff9ee26018a34bcfe043a97703edb4513ef47231c201695221029c53f7d067115540e9796f453254132bb78c2189920982d23b5dad0280771a4821038d81d0a30d67610beec58c4ff27dde597f9658793417cf0133654570cbffc7bf2103bddb23af04b173e3ed44fc88ce00d67a4acd2c633bc2875de189b0e39d3c8fd653ae000000000100000000010190f69eee907129df79c43173260b0bbe4d793eeb656c2ff792004d81a8e4a34c0000000000ffffffff33f82401000000000017a9147ed52d3d5f555d142a63aa490bbb237d18bd8a99877863010000000000160014094600909dee42047db19b73a700cd1794f9bdb618730100000000001976a914f454804fd9db65402e7becc99e5cad5c1b9e235388ac109e0100000000001976a914f1d9a96839c9b9af45cc69cfa8d98fbfd07f8a3088acc8a901000000000016001472e2d2a48aec3c6730382692c7c968767124014cc8a901000000000016001479271247cf4fdd069c62595c4e89046515c32878289402000000000017a9144c216f58ee6f8abfada554d19b09265fdc56ca6f8730e602000000000017a914624b8bd6a925eb22f580aabe5e8665d1b3f4543a8738380300000000001976a9143da270ec2c4c6712620176c60f47bf5e0eaabde788ac38380300000000001976a914bac04dd6c87d9d48314bd58011715e8228d4e41888acc04b03000000000017a914e24d72ed6d1ff214019398669ac73ed69f4c595e8718670300000000001976a9149cbcd407d0b97cda3804891eb77dc72be3c0738f88ac408a0300000000001976a914a6c36c68048c3c932c457e2d5ab90595ee3739ea88acc0c80300000000001976a914185e7696295b08a745dc25ca4c7ae76bab2860d088aca8cc030000000000160014d917530bbe43d2974f4997c11f4307cf5109de52f81204000000000017a9141ca37396ae735295a82cd72700f592eda4c9107187707c04000000000017a91469ff1030d1e6d59bc529be4fbf43574d3a38eeed87108c04000000000017a914e2c0804c4f56e28ba2c37702e2bb05ab50ab03d787e09304000000000017a9145f15fffe74954ca1946f12974e1feee48631c39a87305705000000000017a914e1338ed3f01e892e4df69202afb6dc8d7020c263877070060000000000160014f1e0d04a48a6989487b10ff58c06c3fb4083a29e7070060000000000160014f33e8de39820c05b591d5045c0c0c01a43524b7338a306000000000016001413cdbba109917980dfc8bc94cf1a9dccf844f4d320a70600000000001976a914d13e2a0b94b483ecdbf7b039d3ca0b9d71019ab588ac90be06000000000017a914d811e2daba62d264958cf65376b757f736406c1d87a4c306000000000017a914c20070d894ded8b4609f883d6221f0b65b70915f87b17d07000000000016001466eb43e4ef47deb2a5342779583610ddba4a3004988d0700000000001976a914be72f4329a773a2b9538800400c045384c681df988ac69e7070000000000220020de4d7d5b8720dd6050d87c612cec04d2ec31d0673fff9b21087d8a1ba2d87828c8020800000000001600141609de493b5e90df2e9b585cf1fd413dc086f8ce706408000000000016001413c5cf9643b21fc380ab36bd4e5f2281feca6df958df09000000000017a9149236b59ba9868c0cab5b0ba9b7f815a441a4783987f8ee09000000000017a91418c15e95b0ab215dd3ec4179b3eae49da27e7fb08788540a00000000001976a914fb18f441c09f5bd57bae7d6ee69f65fa8fd7598a88acf0130b000000000017a914360834b2e9f84faf9aef76d16ed4f365039c68598758560b0000000000160014b0752bce5e2c3e1b03b82278ef2c82121d3ac7e118b40b00000000001976a9145077a7f546f2552fb5d0242bc39ab2c28746006688ac90110e00000000001976a9140c2d3c75e96b71d430aa73a14032be127b29c1f388ac08f80e000000000017a91431c3a63cd15b858a45c83998afce2f540061f57787d5ec1200000000001976a914e7150302af452f283b5baafa8c08a303ae8a1c6088ace85b1b000000000017a9144e20f862e66b9b4047086e9fd28e7c7812c38b5a875080200000000000160014bbe110ea38dd359ac773cb61c548174f5a9a08f3dfd620000000000017a914502ae5b8e9a8fadd44c17d8ed9b6cc1015f06a2a87a031240000000000160014608428bff98c9c1a35eaf96c6f8618de8fcb227058ae2600000000001976a91496d191ae70b16d941125cb35054e5e452f84e2c988acbf8b3200000000001600145880e995d0b6cffbbb10d84875010eaa258faf9570cc4a00000000001976a914237dcca874765a2fe749fb930d3b24b1b71ba0c788acb0385300000000001976a914139806721f60d81c93e588a4ea0ecfc924f5dcf488ace8f69300000000001976a914ed554a6306ffd153aded86690e036b79a507fe7088ac10adba00000000001976a914fdac3e5259f81fb487dc72f08a3c891f2a36a48388acdaf831020000000017a914739653c15ebcecb029f41139d714b71d627d140a870400483045022100a838e691823cf8f39a723b080a3579b1b56e39133676f273d19e3695aa76878a022077bb29b9a2d930e17b670e92e761f5f311229e8d60a21163ab6d941eb45649c70147304402204892c684990320d6faa0cdfa1d1115ba38cd50b756fedbfea3fef19ca19db39d0220435d96c0b657f7301314b101680cce56641ad2037afc40914f57b4aa5ce1122201695221032c8b08f646eb87524c2d566a473675743a4ed0420342c9b4300a48446614f9922103e77cc6012387e56a1ce2b2919d6a32ed700e75066a2e31a71fa46648cc362c3b21020d4fce3fab028d84d22cd49e115a4ec3dce429503a6cd9fd70055a246852947453ae49a00a000100000001b0d6993f4c435e0b7aab7cabc320732fdcd99371fd29b1d2500252e89d64e41730000000fdfd0000483045022100d22c4f8d25d75c3addc07ccfb4cd4cecd55d8d73be99c189c52b01f2d2aa23dd0220794e43fa6bdee8d3aa2591505a3ff7a5c82248d83ee917b7777318431b4a601001473044022036adbe9fa7a51da7bc4899784e3d782d7497d8ef055ba4551e519a9614c9d27102202c2755201adbe62a146aa006ad028e7a401ed80ed8386dabdef2b4cb7af1151a014c69522103e54bc61efbcb8eeff3a5ab2a92a75272f5f6820e38e3d28edb54beb06b86c0862103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210291c5a54bb8b00b6f72b90af0ac0ecaf78fab026d8eded282ad95d4d65db268c953aeffffffff33bb5f0c000000000017a9145ced447aa9af2008315b599cd68300ae04aaabd38787d40c000000000017a9145ced447aa9af2008315b599cd68300ae04aaabd387e34a0d000000000017a914c9ff3293579b7bc1c0e07c463f6ef2b46e0ae73287c7570d000000000017a91406c2f852f2a8aa74ab8fa04feca84ac850f58fad872f9a0d000000000017a9145c4c0dcfe4931387a96723230fc0e2abf7eb5b74877b2e0f000000000017a91479a52ede534bc5700cf415a3ca174a956d6308338743de0f000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e870bdf0f000000000017a914748759e22eec3033feb74a527af83798397269d08747ee0f000000000017a914748759e22eec3033feb74a527af83798397269d087f77014000000000017a914fdad36b3aa5100607648fd769eb3e0e392d7df49873ba014000000000017a9149c36c9db0cea15f0eede5e0a8eaf25dc570fc85787ffcf16000000000017a914748759e22eec3033feb74a527af83798397269d087335d1e000000000017a914a48a5d2aa4d4bf0a6c2c5dd042ac4eaae53de7cc872f981e000000000017a9145d6be984e5d4832da6acbdd46b038deac2eae6d7870fa428000000000017a9142887b24e2591482561c3024beb18e151d9d2a8d58733152a000000000017a9146d0269192f72735038799ba26e09e293a9f73a21870bc12d000000000017a91453bd2f4eeab0f7d2b887b1fabf1a2f60e69528cf870ba22e000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87df682f000000000017a91453bd2f4eeab0f7d2b887b1fabf1a2f60e69528cf876f1930000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87df4930000000000017a91453bd2f4eeab0f7d2b887b1fabf1a2f60e69528cf87bb7b31000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87833f37000000000017a9145d6be984e5d4832da6acbdd46b038deac2eae6d7876f543b000000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b18870f583d000000000017a91492d8260cb2ed6ad1e06a6c940a19a85c6e1bdcbb87432f41000000000017a914d18429443eab27782252172d345ed14b740fe6b687f78842000000000017a91460b8e43c11f3435b3ec009b1f23c4469fca24ad78723b148000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e871f675a000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e877fed5a000000000017a914fd1856ef613bf8d1b865e9ed387f7ba2f24a29748747aa5d000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a879b5f63000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87d7516c000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87275a6e000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e878be17d000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87df1f9b000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87c327a0000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e874ffbbd000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87cf4dc3000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e872f0dc7000000000017a914bfd9c1785d931fb175065772d258ccd579b05510872b16c7000000000017a914bfd9c1785d931fb175065772d258ccd579b0551087737fd9000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e879717e1000000000017a914fd1856ef613bf8d1b865e9ed387f7ba2f24a297487ff0ffe000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87f3596f010000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b1887f396e6010000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b1887f3a860020000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b1887fbd40d030000000017a9146aaecb227f51ff21bf9e8a09d6b6785bb5df574987330f64030000000017a914695475c117e3b1bc3e949402fb84ce8aba10eb03877981141a0000000017a91410065dd50b3a7f299fef3b1c53b8216399916ab087bf7511310000000017a914471c9be003e77d85b74fc2ef5b043db2877a19fd870000000002000000000101317b29d6464044c53b4ddc59c01fb2ea70cd5c01a2e44ac4a7b05f919e954c200100000000ffffffff02bf6d4d000000000016001457093e8850b68da7f3a35c3c739ea09cbc47b4cba5d31d0000000000160014b74cc30f6a3f2640703e2dd7032160c24b90f004024730440220337a28032cad44ec8489a6ac6091152cbaccac0bcb4ef54e8c04b0ff6cfcc6e80220043c2d73d693076897c83775c91aa028658b95d4521bde447acb319eee311d9b012103270881f5d90261329b4888700630360062f216137d23d833444355f3bb54c170000000000200000000010116f27818a7d67c74a130ee6e2b1774efd416579e40534b041b91cb822cd16d140100000000ffffffff020f2a000000000000160014e9902e8b70440394560b2b6107ac3b48eda8646f5423040000000000160014d4a6aa9694606a6ecbcae2b133151b6aa3acf2ea02483045022100c8cb0ae3717f04a78db18005154d25880c4eb597606710ecea4a1e6ff0e447c302203d03efe433364af3de71500583c13e1f31b031e38b1c36ec033f232a958fa5e401210378428f7d857b097aa9d9d77fd4bc8031929538ad9959c8d94c20dbd09ac9415000000000020000000001011b60f9d69bffdd6d644ea51b235400741e8e7d1325c15c769887d95c90a547370100000000ffffffff021027000000000000160014931c81d734c9ff8998bd70a861990ae9e0c61de25972030000000000160014a4dcc0706d8efa9eee763375b31af137c911b52302483045022100f449ab7fa3e331ae3755f0c2c1550ef9c2db8e9588ad8bf4d28ff9a5ce9ad1b202203e5d43c8b50e975cc6cee3e6534c9e73e4c0951c02efb87edc6d4bdfdb167f670121031ec8bb04ab2f5ea951ecfc0dad3309f02a3095d0dd9bebf10c6bb51261a923850000000002000000000101e07ebc5039bcf6afcd92df25d4e830c33b5469284d4a2db8385b6230a418c87b0100000000ffffffff0201560000000000001600149b248ddd8e149c31ddf7a36d7eeff74aacd4f69aa728070000000000160014c836e841c3dee1b111e19f4691e5d6c6a6315e190248304502210089184cf9674efbb2ce06887b35ee454fee02dc4c8506fca9dd0b1366a9862b710220725e5bd4eb00b9c320fa1faf0717b9d0ce803f223aaee98a6fa37e46d31a2b67012103a362c7abea6fc68cec2452a12e7b7f2964aa009e4fffced5b8b0c66d697be5230000000002000000000101a2c498524d02bd56eb18ed2128f3a700573fd8b8ebf656989210f427f5f07a6d0100000000ffffffff026067070000000000160014b87184252220fa2c48eb1b931dc47b53cb7ecbf67e22080000000000160014db26c5d1fdbfff4346a3b3177cf155c61a4526f60247304402206665faecc950526f6ea1c9f9a3599d744baadc7930af53ad9239d3503d88fff0022036d071eed88a8ce457112b8249c39b4fa7d75f064733dd4d2b3f82abcdf82ef8012103c6579418a6d0ae285210fa47ada5a6599e16213586d9afbe1b4627d3f6c89d820000000002000000000101891b6850f9ce7cfe3b91f3111c400f011baa9b22eba71d6909f6087fb37748fd0100000000ffffffff02a909050000000000160014c96f3f9d89191de9581c65a6090f5666e36033e071f30100000000001600145281fb878c437ef18338fa72d52e2fb3b8dc6b8902483045022100efcb85e0cb2bc21064210c76103a313f40814a5367c1c0acca9008e4f1cc2227022002c4648a371c511bf46968058bb832ff9a2a588bca8535d47df82d141ec3a66d012103ee767e5c92f29ba686e2670faf6c2a93a60c1c1d420bb20140edd2944b4b7bb6000000000200000000010152f1852d76b528e1c63181f8c7fbd6e81a4076d6e9635bb73d879712d3c203aa5b00000000ffffffff0229f8200000000000160014f59a12dbf66cca1e183c042e03d2e58b3050ae61524c210000000000160014c42b52fc9988231ac7d3f48825e9ce61d7e9e72202483045022100aef4b3276e8122087f23cd02ab468471a7bc874e37f81b1cdd859c64b7d89c6f02204d763fe4cf776346959006f497e7562cd37bdef080cf476ade0708e774be00600121029f8fc0793d3737b8c29dcbe5842b6d58e831397e1367e52f1a3565fbd5b309b50000000002000000000101e1547429070b0bf0217d14564148ce45ac67f9afa7e5881041fd27c7491e10840100000000ffffffff027bba060000000000160014b1b4ec7d19aee291c55ed4f917007e44c2bc040f214dc900000000001600149dfe3e12f1e68cbf7cd32f83f68cfe28fc0c11d70247304402200540b0e10fed241f0354d90737c28afcb7db3ba3fa0b47792df355bcd842a1960220525508d39ac829dd8e7c1a6811a17541c476e27e4004d25e9829823d38aac064012102d8412fb5b4d6ef0b55092522f8b301af7a7315bac820e3f53bd49eed29d31cfe0000000002000000000101d9387a95babe733e94bb5aef1ce029544fd1f756a221e16803d161d9b2e9f4ef0100000000ffffffff02f604020000000000160014f175b40c7b25d6caab562d323a824e08ff832edd0378220000000000160014dc5f52bc7fb51ee82c5ddbd2733cf41ab8ffb870024730440220710ed838919d9eb10d28112be88540e86a9a2347982f9f0599ee7924463ab80702201adfc304eed9b0d70302fc498ee2d5d9dcd5842cc916ff9e543a59a0d064a97501210287d28c327ea918dcd03c4387a91f090069002d38e4252313eea1f3b4cbc1d1390000000002000000000101e4e509953100e50fcb0d0f28f21400feac9775824fdc52885aff02818e3ad6a90100000000ffffffff025f02010000000000160014117e1fe6467e5f24960d581f20243d131b38cb28938a1a0000000000160014095ce98eae5a51424136e642de67ad7bb68abe900247304402207e402b7a475f06f62dbac74f2cbe33bd40de63209a2940fb89a641bd1b67d41c02204e9947673e5067a26ab42acb3340aa3e5c6f28973208524be67866b8406c3e6e012103b4e20f97208208f8d78b539efe729ca752f4f84413623fb969ecdcfafb7bbe14000000000100000000010517225d88896992f1990d493560b2f8f0ac456e72a3d10c1b8f168aeb7c4bff1a0100000017160014c1850fc9c1c37459bdb97dc8cfb3a2bc383df0f2ffffffff2b8c0975057958a6863e2185b0f19901b1e992bbb5e997c19b98a68e067ba830000000001716001455df85b22703eda03a028a5774db45ecb30e9258ffffffffc6478607059680df6951d4d55fcbcdeb369724502813d5e67c1ffc1a594163500000000017160014edc43f33e6bc95f4f704efe69c89f39f82fe4a0bffffffff50fb89fc6357b0d3d46ea6ee64c5c5245efe93ca2c74e470496f51a09cc0999101000000171600148bfeb02950568428005b4522dee8ed5486ac4319ffffffff054b4146ef14f319b8b1fca95749c626db758613bcf9be3a75df19af30e068d200000000171600148779535dfb32c6932716ef98add5a85300e438b6ffffffff04a31100000000000017a91402b9af5b122598d95cbc43a39866105aaac74b618723b803000000000017a914f49b313031576ab50b45233962e4afc84b361d6287c05c15000000000017a9145c707c710326720c6cad49d154221580cb05980087c05c15000000000017a9145c9f16ff55128b31727f4ced9250959ee6833aa88702483045022100b5c95ab37fd4e412aba90583764bafe2d70f3b8dfa652874fcea0b81d72e01c40220415ede3070517ac51d1096578dd7719d8d708ee8b424e75b01cf7a73a07f211c01210280b75879ca388206f6397c53cf65b065c3898a87885d74dc26361a4badde3c3802483045022100cadd4d6913439742f9045355adf034eea102eb94fcc40c9aa8e47238d162e12d022019f1b07e072e82e6e702ca4f02ddf95123c525129d67133a652900374ec958610121023bf88fa8f38c039e9f35dee896d083d9d74d5bc975e9e339a5228b55538246ce024730440220209cdba37a6f8ffe550d01fdc72c96118a8705666ce583796466374bb4d689720220297087d5f98c321bf91f450a2e78d16164cda0dd7b27d88fd1e96523337005720121031d3eda1b16d6ec9f9c56be3f8d66904b8c1d26db06a1b7c239867e899964e40f02483045022100a79e85906f9ad39efe9e161945ee38615e75561e176401c377e94d8ad2dca9a302201300db6f75ab96186dcf3a75d29b370316a608372a25497ab47f77caadb402640121025a3bc25dfd37266dbc9b1c87279f8e3feadd6e3af4993f4515d304e87f51a0f002483045022100e380a0831edc5b142175dbfdf7815de3d399c26294fd577d93a4b8c1dbb0b0380220495e3cf3092bee2672b273ca661be6e5b8742596f615315635cf5e82617c2fd701210338134d72d1de7f14882c4d4d7ed53f59c77b1b0479c7707bed3f13f5358fb5740000000001000000000101df9d0dbd2b07298be7d55d55bc5ceb47e0293e005a42a3985da702d1a8fe1b520000000000ffffffff0130560205000000001976a914f4739d8b07133e766a0d64baf2a07bd44e91ffe188ac0248304502210091eedbb89a504a61bbed209f8f43a84bd179d97a6ab09a66f87b20cab52dcc9302206988576954a663b84c4256a3ab923fa24d79f9e7ec1eecffe9e7cad6db2cf32201210251ee213b8f7890a7e4befeffdc7c45d28ec0144e445622a858f81cd477d36bec00000000010000000001013dbbc903ab9748ed4f544e1c2e2b1f7dc60c39a6f57de942770920a7272064660d000000000000000001bf070600000000001976a9140ccead47ebaec31b35f648ab468b0950e9459cd888ac02473044022011ec48da4368b0ba6d4b4d9aa041769fb7a22954c35288a8786b07d3870dd3a302207f5cd7cd2a74618a57e4f081ac13d3d2e559a5dad0db674999faa34acb5d9ec101210205c1484e47043049d8a74d769cab929280e0659e7bdf657e9666ecf85b31128e000000000100000000010123e282344cf88a82b25fd69b98f8d675541dcaafab34b0ced349211fb12fc0ea0000000000ffffffff0103930600000000001976a914c76c98544c7644c1ac12baae6059d4a622d2469988ac02473044022031513dd3a5f6e6469280051fe535f9e6b73c5a2379a865c4bdd1d6b450991c3e0220788c86f5ff7aaaaf5d8b2c3f9b08547b1149a5050a6b3df991873ef4bde221bc0121026fd234daa5a2a5dc5135701108b90110ffe33b6ccd12696c4963e9c03df6dc71000000000100000000010183f048db759ea87d9f3f6b50c9f1c88f423a1a78aee576a3429e327fe2a5b3c21e00000000ffffffff01b4b606000000000017a914a825a503ebd3eb2a987c92b32a0649e171818cdb8702483045022100e4199989f4540ceb7adbc71ea0d6d48a6500d6177f202b230b4ff488d059a22102206436e2db9d851ae570080b203f59ac08f140c91b9580d1a28b4f57369894a19d0121027c28a4bed79b032cb01d91f09abe4c8cba5aab7b92b123235b8436614dee68d300000000010000000001012c4ee94e86e5a6e3d18efdf978acdaca3fd68b611c152bf19326df3f9cef35be0100000000ffffffff02985801000000000017a91426e7d472fbc6d68ba26d5c2ed073d6589843488d873c410000000000001600148a218310a155c3f7a1b12ae6839afa623b365c82024730440220696adfe989db01ca2b96a64802c964af32ccfb8b21d9dc7d6acd4a98b5500c3002207b34af72d79941e8b8f95a1c246cbe4520ffc564f93f34839e9b32a2c819a628012103e28701fd1051bf66005142ae1a8c17b93f7862c91107fe83ad40da33a341b09f0000000001000000000101212fe74947c9bc0a0ea70434a35704889125541b78cf04189fa909031292f6940000000000ffffffff02b82c120000000000220020f8732548a888a9ca62a634c26ff1a24152cbb69b6a5673b735a2c0334546112c505f03000000000017a914774fd440523aae4a5aa5b94e1cc7c44b736bcc0e870400473044022032d0b6fcd6dfe1d48120848023e15dfe78519941f99db07fc8e96989e62171ae02204e0013682443cc2462a2ee093a8802eddf3ea98d54072ba7d7d678b8a6b7b211014730440220636369e801b313ef6030ccd9ad1bbdcc11986844f46595e032d1f6fa8118ddb50220659a51fb6334fbc93e7d197c4318301f412bb54632bb2449add402a1f50cde4a0147522102c2bfbaf52c66e1e7d5c1ff48b5f13c03bc0d5542b0fa3940efbd000018cd944c210203a2aab0b2d795c25e906042983eec460e4658f7d36a632c1d3697bc91c59e5e52ae0000000001000000000102c693b5e76196256be229c89d0fb06b79740790b8bfa1e1221e17b165979fc4870100000000ffffffffd41f166ada8083576894c0d2fa0640d29b2bed1a02416a2c8bdbd5cc57c426300200000000ffffffff0283760100000000001976a9149ea91d7e1c4da964052048fc701ff7bdde1948a088ac6c80280000000000220020123dd2725ffb736797aff6308e5cc93903fb8f9675ce936af71d41c389daec3e040047304402204f5c83abedc0807ca1b20362e8bfae8cfe2aac2a4f265467b7d705e0f736a93c0220417dfab1ecdf00fbffd81d8dab6500dacdfc69d45d2b361c5f9b789f5c7cec1b014730440220403ed8c2b79647c5ff06aa25d89f6687700d529ce4f9d67328e6dd264ea86100022041a6cf3d0ba317600b53ba5f2f8c629b8b9a39f3abd66edef0da8df359919b6c0147522103b22f6b7cb2f12e0aba5eb36d2f71bf69533616a6bf923092e8a390cff15c46c021029009039142b4de669fe67507bb3a6b17ff38f7798ae4d7bb3826a3cc2527d62252ae0400473044022058014e57ad677b0fef85c6dba3cbd2d536752c6feaacd0694d3be100f16f61e002202241eb355fb1931a498a5f371851026a92775727b6071395a9fb31c1437ea488014730440220382c3e47ba636d4d3bd100afd3d2e2e541f992eaade520de18eea082ea5f6f7f02206c9278edb31df8a19197c92635d195b1fc7f499e2af74cd3d25995a3b3f2f3870147522103b22f6b7cb2f12e0aba5eb36d2f71bf69533616a6bf923092e8a390cff15c46c021029009039142b4de669fe67507bb3a6b17ff38f7798ae4d7bb3826a3cc2527d62252ae00000000010000000001018551202fcc8826c35c89c05212cdfa4cb29c2556a190d818b400c43fc5f5b9e70100000000ffffffff02340d0100000000001976a9143aef9806ae0e04565933611ef139e1f54645795988acf86c270000000000220020123dd2725ffb736797aff6308e5cc93903fb8f9675ce936af71d41c389daec3e040047304402204082baec8adc250ca5b7f7d6a3c70583f5517523d909b4b5206934b44f91103802206272add273cd18e825d9af689ee1b22a3f1ea4ef702e284f5788d27ad8ef7532014730440220488d32590006d48661ae73278b64ab990a391f74f7c3069cba4e5eb3eec4edaa0220301ab897114f4b5d45b4be9da4c6a08ceae43faf49892a05c1cee01d339eb7700147522103b22f6b7cb2f12e0aba5eb36d2f71bf69533616a6bf923092e8a390cff15c46c021029009039142b4de669fe67507bb3a6b17ff38f7798ae4d7bb3826a3cc2527d62252ae00000000020000000001015841987bb5c6a7203c16305eab3b108c5f75266679d057d509385b15c3045d850200000017160014a6be0f2256c54879619e53fd6b444293bc5e3f93fdffffff03381012000000000017a91423c30ad3e1b290e1c806d88fc087f1e517d4da2587b62e00000000000017a914cb142c9d596930c1e8511c8c55c6ef8fc34a301b87535602000000000017a9145c7e2a200ae46ecc55fe03fb164a0f5e7a4ff522870247304402202d0c05f104abafc8db6a8752c3eabaae7858ce80dc8554487677278a49bfb1f802204a3052a2d57c1f6561f391ec6db5d52ba0608a48240e1e25d2adea1d8d42c7e101210298d9a8432becd032cafd4005fd146313ab5443d78c42f0b2b1706d2601ed57f10000000002000000000103dbd7dc621bde8e539f4cb796e948de11600ccdb894ce0df03d887815df5286c1000000001716001407aac19d7215270ee0c5564727ebae1922e89561fdffffffda76d565288ac7c175dc27b6089c2c4790e502f913f292d16ed2a1cbdb78fecf0200000017160014f1778554dc4ce35e3e31c8fff5ca54e4640bab0cfdffffff93621d8479f20ea948040dadf5c0ef10efcf91af1a48eacdfd3c2d8c802296b202000000171600142c337d23c4af2082f87965107f7ce49ace56b4e2fdffffff0260b74700000000001976a914615a36e12d98662960dab08759cd86d4adff728e88ac74f401000000000017a91406fb5ba0e74b3bb9706aa20bc5f360e1a519c4bf87024730440220113e1d8324ccfa715ffdd6f55aac549ac5316c421c9127016f701259b203827c0220764284ab070c5d4dbe52541d6a7939cc1977faf0ac696e3e20c86051ba364cd8012103f766b641d872aa0d4051809e07d6db384e1e0808810a4d65bbeef614bd3052b90248304502210084bf4bb19156caca8c0e95a7a460b6c25be63d9427d63edad0bae8455b96bfe0022011e9eb09b531e61cf54b85972ff6e4802b1f44b86f2d14708d2cebb33bf94ab5012103a9c9be339633b43ec9250f1a10a6f28ab344d8bc8faf6510a91cb25b68fe0b2b02473044022006fdc39f3b0e70d9a932ae6b1eaaf85c2baa3bbf22793619da4af0f3c73ad3ca02201b5aea57b063c5e4c3c91ea8708cc7036b408ef6f904c0e1612e9831a2eeff1c012103050aed79a7805174e0a400787dbab864f2bf94e9b6e3b8d59ef0d85f0b44cdfb00000000010000000001011e3983a4a8330bf351961d255c23389882fcfdc947ce0270c16e12cde40515e2010000001716001466aeb7199d120dd55288b950c263b63d47049a050000000001c6fe1b00000000001976a914c829fdb878855511f3bafb2ae012f5cbc1426d5788ac02483045022100b560b1f3d5ae4b701636577f3f89a8bb74296134aeff9f175cd0aeb702dcd49b02203250d7fb0b8be51ff0c4ab1c86638358fec712d5da5a0ae1044c38c2426f7bb80121030edf1c72d9ceac617c794ae658006d38b9ae2156ab66a13a78a38dea5a17ae85000000000100000000010108ed4ab01d01ca423da4453bd65250120cadab5cf9ba7f73e290834dfca1f52508000000171600144847a95619218b443f34bd9189df697fcc201acdffffffff016be31a00000000001976a91493aae5fd6dff7d10e7566051ecff74f2492ec2e688ac0248304502210094ed03d7363574eb357b9d7dc6b9cebf7395aec4029b683d02cb4137b4eeab960220353775fd94826c937f5e68d08e3db377cfbf2cb5b3cb93388aa2230845bfd844012102b2817c49bcae549e3af8cc336332c06c14d59592072bc0707e579c879e6431d90000000001000000000101333305ece052b75df28338fb8da05bc33fcbcd9cf9a4d61663d6ec624741798d0100000000ffffffff02f42f0900000000001600144fcce656f6d2893490d03129604a87304d6ca43359ac00000000000017a914a975a5b685293553fda0a6daff7fe502664777e987024830450221009b137458828c620f8e846ece071a4273f5b78931ed74ae22c4f36ec339af2fb3022031d26192c36bd1c635d5a416888a940d594e024c980672b8ea7dabfb93841d5d01210355c69b2727dcc7cf7cca04eaed60ffb82d2ba5a2c152ce4ce5c4b45d37038137000000000100000000010154dc9ea561d451620b9e8ca500bda3d358526484aec6e2dd54fc1b70e2258ba40000000000ffffffff02a21c000000000000220020e293a1371bbc82a009dd3ea44f61de5c50ee64144b0150081b0858dab91f7cbaa0200b000000000017a91473c9a5517c2fbddb1fd95e1b9313c79713a949ae8704004830450221008605c68492a86363eee34d6f6b3c06986493102a10365ab07e751cc1c836fc3802205a6b94df573e6e8ebde7734f804e710ab054222642758cf31d9ff3ded794220e0147304402204120845ec1429f0b709aecd2ac882f726041df0c621c85fd6347b044e6e64c2e02204b0f31f918a1dee052f66e562391a51597faccb22c55841684dab970be85f8b8014752210227b39d0ab5578f8145f49abfd5ed90f96bb838030b287a4ddcb6b2e4a574ef1f2102ced8a2dfca0a41fd8843176b023118c0d9598ed92a07e5f6118b92b7570046e952ae00000000020000000001053c226508f72d99c39f0f707bfd39af9f75ee6c57fa75e59f0ac8868af7a3a6410000000017160014765af88e4de81cd5378285abcdaad54aab5e5126fdffffffe1fcad43e821d75124652c3c69530c228f019c9f97ef7786a1cc223738f8f3b2000000001716001431e8e0e5b52d4c857b361b48517a72612292a2f4fdffffff93e213c7d3ed918acd9f8699241588c96478aeba4de99808abebce635a9295c20100000023220020394e280c0ec0bafc580060a6a549920301715bb2ce639407b1a8b7c7089207c2fdfffffff2483aec11c949dadd493b2d54a705b30cbce456cebaa630eb81db92b35387ee0200000017160014bffe7c037daa75c1efd2a4b7c61e610eabc7bd3bfdffffff71669f9afef5e84b5b52874b61d579411c1f1d8e59c43ddcf187be112db6370702000000171600146a56150c4d3dfdcbfc962852efbf5e55c1826164fdffffff0308f222010000000017a9140da87c452324aa4c63f75aec0d1f994296f7c4688758f002000000000017a9145d2cd82439e56c486a26d17b43c267284a23cfbb87024800000000000017a9146f9f0c92b6e3c763e0a033761260dcc58e6138f48702483045022100ff82e1617f8ba3a5c4cadb208a6067c81914f9c6538854a980666f9d4bf88164022027b3f7ecc2b03955ab20be9f1423a87ec6efaa1027dcdce8d7e89caacd346b430121033dc9945fcd548491eee1275ea8f991ed42b6db0384bd11e4d9741b92630642a702473044022100cad8ebef1f6c4fc309ec85bdd9a9d52aab0e5f16b2f465cf2dbb6ab4c596b671021f2e95117e6349911f5d403e0059a5668deac9fc46ed99042a6c41b6768327ef012103568747cdeff3afb4bca98c6029e10f84a12a817694b9fa957bae461cbd28b26505483045022100e3b7c488a3c6288b6ae9c1cd5ab47e276c4dde79ba280a3aace86ab1c47bc65602206592780a59d2d690d7727d5a3b45a1736876db3b411fc7da08dbfb37914697dd0121023c3ccb23fd9ac36961efd7f19b723f4799b52352068b3a0a2b76f1ef1f2a3cac206d4661dbb57123da568ea82687403688525137559e8c42bd72999e26299dcc930104877653876375a9149bbd96e8b27f5f95d7ec71c3402121db4d20372d8876a914eab5071e8ac7302d6a54078658452f236a0c230d88ac677654876375a914a2226abb8c2f5bb5e7925e58519d919639d4f4548876a914eab5071e8ac7302d6a54078658452f236a0c230d88ac6776a914b21593335313b125c5abf055e92ce0048ed25c0a88ac686802483045022100871daf72151e244ea44ef25508c28ca4924e8119122b193515e70d6b614e46b9022056356057a7c27c870d593c73bb9064143a46b586f0a72ace507191f9d5bcd0a80121029e3b35a480a798e10a3d996975987bdfdfc6f0d3a0067fa287b5fc18125cb47b024730440220307063ef8bb49a5560adb168de801a3a9247b338591ae2b2f20c50b1f7f03d00022033952ecff15642c3cd41796de49e689d26670cd6be9e44671de85e7aa6548ef60121037882fa002e7fe3568a882dab518ece426ef018afba9200295aeb33da24c9f6ca0000000002000000018366022761fb2490f65bfd355bb4885e90851480c5da6b71ae7488884af3438d010000006b483045022100a70872b1f7e761b5d3aabd19a8231ccbf1c70cb43bc48eca7eaef0b612a3ae3a02205a478b39f5aa3fc44b418d451c88a56624a8705ad09f63d9eb37c0ce89b0222b0121023205c9822b8da45e2f81ae44c2045c27fbd6a97fdd693848c5583440510061c6ffffffff02b35b0300000000001976a9145f367de1395d1722bd3c92fc139e8dd19e95bdc788acee461500000000001600143663739ae3e93a1c799f33f055b576f59b5545c0000000000200000000010207818e78d49ca72de37169897addd675870456688ee29ed2178959aecd9237180100000017160014722c913fa0fd2c77d84b7ea8a31f1590b36d13acffffffff35b388a4bc942c91343de6d5b22c1bfcb47b543e84f100b0bf26671496d139490f00000017160014e4e9e6e1cb0d5915ae0520ef67ca52d3a98a0aa1ffffffff025d4220000000000017a9148863ff7130a99b6c73fef9189d06dc6ca375c2a5874c1d960000000000160014787965fe076f692a4213e010c19e7e57e3f66f4c024730440220077b8c5a8d2d7101b932c58e3fce8bc766e0cb6eb5a79242e49237b4902f72e2022044bc791aea8b68219329995124efe861fd5b43136269bbf257ef7d04335d0705012102f16e7bc2d5f43c18c265f2d50a3c6380483521885e72a4166f23d1cdd55b3ccb0247304402202e3d06c66df53322f5a1e6d5ec9f1b0f36e7c197ce9eecf4d86b24e045088940022027de09a321d8951b01020783e31bd96f89cff7fed107cb0b74ac252b719257be012103e2a7aa4ec1205e4d4aaff4e74a44b85f95a74521768caa6b01ed2fcb7a73ca2400000000010000000001018861b998fa2a1bfa8052bbad2a43964504340beed0d9081905737328718ab4da000000000080e3ffff017a8a32000000000017a914a4e877140e727affe8948c984726c88496392abd870247304402207fbde0b826c4886737f7805f8e1e99d4770bf103f365ca66651631020347090002201392d4e8725dec85941732c92a0db88f970072a78ed5d3bf377a6bf41193598b012103bbb483ca5a05b5a63ba97f3c536d7b1f70a8050c7fa76c55b0e81979a8892ebd0000000002000000000101114ec9772eb38c237ccb0bb0760a529b0e268699ba9b4b06a51557edf4e2e53d0300000017160014b38f1461633a9ff97a42b579d4782a8f34e86659fdffffff03a94c020000000000160014be3e367692435e91e348ec0cca7bd7df68c074365d190a00000000001600148a4c30fc86534241db7aa987976fbab9eca537030e5993090000000017a91477c255f0bff6aaf692cd44d7703088fd9e62fbb6870247304402205f04fa7a3aab4df57a8681ec60609a3664afe2b9388f16664407374dccb8978502202d76eac90bc42cf6c6ed000c9e28e2fc96b738c84e515ce4520eab1e694e1327012102d1abbab06832837a346cc83764c79a500f1ed68a53f5c4f64a57474989965ac70000000001000000000101f12fd3c2476e8a0ddf43f3d1b5f45bcf89f17ddf5d8c9c85a923049d18fa9f5d0100000000ffffffff029eb1020000000000160014488de7dbe758e8a5dfc410ce2196c3a8e8ff82127125030000000000160014f1359c26443d5ee5cbbae3cd8ccc0ed66d6e1b370247304402204f80b909d3d27fdc323f179b520be734d97db209022c64d3ff617b6599d4b437022056148c5875fde672ba29557632f84018c79210dcaa772b8d92864b0e3a3c1a7301210214ea3970049d85640d9f99ad1a573552e0cf47b33060cb2133184638b50ae03a0000000002000000000101103b912f8099e43610b613e18c7257bbca1839f96f1dc6e543308b873659a6dc0000000000ffffffff01f82e0000000000001976a91428d3dec5c17d6f2c1e1035ca27712af65361e16988ac0247304402206563180005a2ae4691b6f8a7b5c813218d4616941652c0e64bf6d5655bea52bd022072ec6e33d218ca7ae7085cb34102e383ea2980e57eb509a8f5d1d584dcbb64ac012103d1fa669d05a791a983f59e80a88e4f77634950644438e926441896cff481b2e60000000001000000000101ed35476853019c4d64c42e886c368796ca26e465947b175e816db4131e5394cd1800000000ffffffff0ebc3300000000000017a914e52f3f1b3bd5779d33ac779d112d5fa6c312c45587145600000000000017a9141e505277a046a3d767d399d563d521480b463dc587d17c00000000000017a914b17a735414dd0091417c3f2ae191350d3fa29b9b870a8700000000000017a91462ea651f2326a7bc5650aff038dda5eb00f484dc87803a0100000000001976a91466e5eddf7e956621e24103dc452321066884501d88aca0860100000000001976a914bcb43a8c811b23a2bf11cbfbfea25b89ce6abe1188aca08601000000000017a91460e1b3c76bcb0914689c1a9335f7b4bd97a5352987b0ad01000000000016001434dfd7f9678e5d680d7bea325067c41616bee3c0b0ad0100000000001976a91410aad17593aaa5662fd568ebc38624278932182e88ac18130a000000000017a914cc7f13def9845f45b412d1be76662b375089d5ec87ff7712000000000017a91436bc4484325171095121efdce55c4eccbb31620387f6601a00000000001976a914feb11f7df2f6ba10ffb62fda8cf32c9fd3bf27f488acaa641a00000000001976a914dd4c2a38728529a5f529f22d2ab75234a0f2353288acb037fd00000000002200200235f4a4e1db3c45a5bd3962a3abbc6e319ea58b4a3f9a2083c9b4d0893d512d0400483045022100d226d65900a8948de36fa2fd646df6739348d64d744bde16f524a16c24daf37602202281836cb53f33782e53c111c02b0faca07c3471613212d238fb663fa75d02540147304402206b5c48b2b2b0831b1d2a3156bd15076752abe3713a70eaf8085f7e176cc07bfe022042b14cb799c14cf45a4675aa52b86e24510099b1a686d1bc0cbdcd5e0fecfadc0169522103d6867b7ff679b9775ad894e72d3120728dafc97857e1bda2b8607fc7e833f34c2102fddec2d769aa1ab6274ab01b1378a579693bd774b5ca375bf10550cd8329af19210210bf171ecc7b53ab6decf64326faee6523d85144eea821fd6cc8b762cd6e963753ae48a00a0002000000018fc8bb84583516b11ab1bd9fb66ef0d6322373be4a8a3f890709974d7632004f010000006a47304402206a709eec6ee778be507961d121e01a703c80dd49d1f8833700e7a87d93c857a002206c70e7e25aa687fd6082fad2796769b6ce3b57897b43e1b75e158547d74e835c012103e7cf92f0643dd6fe7e4cc6a88e3d90d4f03104b25d438727ff9bf49732a75250ffffffff028c386d00000000001976a914c01115ace4ac58314a336cd249f66dc361fff2ee88ac747db728000000001976a9141e92ee6c301ed0c3fdf49ca56d7fa20c8e04143688ac00000000010000000001010c105463f685ba482f47a4497e239dbaca39569f8c7d5e8b7f2a4a0e2753bb950000000000ffffffff028fcd0800000000001976a914653bb8726f364ef87aab912588a68701f9bee9ee88ac70b8e70000000000160014bd7e1651e57920536cbad0600b597ee84a76056a0247304402202a45dd79b83f63ee68a09a17fa748ad3ce9b6a83e8ec3ffb0f41066f80742b430220013447b34ac7fbb72f0129e76dd4c7468e4159e82fb809652289f9b7ae5de1be012102d678828f8abf45a451a6da4216f61217efde2d4f21528eeeda84b0ea051597880000000001000000000101a620db560dde3679da09f3b7c5d436328525841190fc7bd2cd9ca4578d0cd8860000000000ffffffff0232310900000000001976a9142e393a91340a5866ea76afe0d38a741d3d63d86888ac5c335c0000000000160014797f50391dd2433f8b3238feb7643dbfa73298b1024730440220588246533152262fbabab78cc4bb9ce342023098ee5eadea1bb1bb35b8e6925e02205db9f638449e13a24f2f7dfcd38e20c9d5490144c27ccdaaa5509f1f120fd16401210217df3489e0842d3788bb0796640d599e4f39717297c7c61a60e8320dea01b61d0000000001000000000101a9d035b4ba675555b617b05d916255018007dd62f4b0a506ea3da2d1220e91870400000000ffffffff010232100000000000160014db3ea46bf8ee2ce35bfef58a91be9556da23591402483045022100f18d720499a4275a6dc8cb42f4ffcd7a38c0d5e5d1718d52f4d5f84e38200c0b02206d0e7e408c89d9d65987acadc1642f05ed0fb28bce3ff280c7401dfe1134404e01210205f85e56e48f23ba5e6d996c5a92c040450ec118d3314cbf002538c4646a0ba40000000001000000000101cf37d95e3929ce508625a7eaee55a7c1f8be2b3dbef1a5e16743f25e5c7ded9b0500000000ffffffff01b97b040000000000160014d52f6171d954680bced33290c3e924c1dcfa1783024730440220379120d02e30a0b9249f025c50f2f1713c7a7b21a804fc12f54732e3dce74caf02202c57195a12a22901242e0178a9eeb43ad5033b8ac98d3b7be7ddbe8ef6e75a86012102b3379d1ba97a3d0f3fdd3132dd036c6cbdd1f8068c7b128c23b0e87032f5525f0000000001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70d00000000ffffffff013fea1c00000000001600149751904b8c628362af6040ff05ac0711c0e4e71e04004730440220270a9e78bab8affbbd2842fc606b30e76db5fbaaa7f0ab164a51fb589ec7d0e9022026797276638dc3baeff33d653cb354e04b83652a5d13e53baeb64cb959c00b34014730440220632a5de4858b7f3d4cff4203cee0f28e63dd2dc2791eea6378e1d365a428fe2c0220061bd07913b50924a85c5790672e071331dce3ea95f0ab2842990c7bf24cf6560169522103995fa374bf570e4518ff4a5e8c34760a9f2034e4abeac5ee4c37aa2ddd7763c52103ad4709bb9525c33c6e9c24bd1c12902a32a93c032e04a3ff606d7dc94160da56210270d083d5cf97a5095283466f0e9e379f92db35d44f22ee676234480a0dfcc53e53ae48a00a00020000000001019b99e6d7528c514c1a950d096b1fa58b8bcab8f6f2355f11b308d6a958459bac0000000000ffffffff02e71609000000000017a914ee70c8c6cd046201688e14d730b13d617a67c01f877ccf1300000000001600141fd53672790d51e8037562234e88c401762fdf7d0247304402201bc8b6b1e47516418b3f5acaf6d82754cd2cebe9860ab2bdb36c70db4a152ada0220471331642e5ea9ead0968bb4c1340750b433e299aee5d8a332c59aea3214e169012103477932e4642c2c23a421ee6880385a0ad5e228d58aa7ad4ba3cf35eab7b1efae000000000200000000010133b42788d5d4250c06db0a84f9b29fe389aaf2a864874fe88730691613b157db0100000000ffffffff0292670000000000001600141fd53672790d51e8037562234e88c401762fdf7d0e6413000000000017a914ee70c8c6cd046201688e14d730b13d617a67c01f870247304402207d8ee44226d8649848129b22c65c32726a0115215462c96156bb6d7578e2099f02201dd13e5e486fddee57bfeb075d73b87039370ca47740284edc723c2a61cadbfb012102456958aa617b6848f3a1cafc436e81f79e0c98dd6a52b7a018fe024106b9948e000000000100000000010100eeede39ee0612a6570f405d36c29a890560df49eff0922a29422ff7be8a5f7000000001716001412143b087040a52e2fbfe67a2b16ecd1f4042524ffffffff01c20a00000000000017a91458878a6f54991c5164dc8837a8a5adf1d25ae3df870247304402207bb60fe4617e93dc0db7426423651508d6cd110b55eb6558b5dc1b90c6046e0702207615d902f4f76e53578aeec495d3ffde016cf35a0f2cee2647302ec1ff14bcfc012103d717e049fc7bbb504d14ac0d157c88c59449dc71d042b979501648a473f0fa87000000000100000000010160dc868a8488ddeeec47c94054e6df82df7386313aee856bca0b5d2371d5198300000000171600141bd7be13cbf61dda3f2bc7b262e3f86e0995bef0ffffffff01320700000000000017a9149f62fc4b99c4b54d4e0ca8504fdf8100c2ee9aa28702483045022100a430247a9028ebe146be4d4c097a3cdff5e0fd5d3dc4f596123b5ce47da65e5b022024300179c4ef0a1430a05c6d01ced7b88f18b6a3c6be2c05cd837b0276c622b601210204376b92f4221215605d1e77c142d300a3ad6b0aef6375c5ff55d9ddecdf4e53000000000100000000010106a8c6b395d27464fa97b04eca69e2995d9e1b9188a44ed52b4c8ab7273090a50100000000ffffffff02aa600100000000001976a91467601adf17a8eef52696a037bf694463d103f6d888ac809c12000000000016001406df20f5a473de48649da516e511f712627c013302483045022100e7f04e5f56544911425a9e78b45d368aba8e3bb0d78cb7a272c4d3c4630a1b3702202ece0d9bdc579b18c3e862eec0cb89e8b7bed10048c69d1a95a3a1b108cf476b01210354c4c774104860af621aaf44b897b34a54ea55f2d21aceb53b19ff1bf66815150000000002000000000101afc89e5324cb8724c92173a34b7d92e47d2b9f56609fd80243148ece3d3fa8610000000000ffffffff02f582010000000000160014342251f650c223fe891f676f834270b78989f1fa44d6230000000000160014bc3ea58d2a93e2063383010558d51997a39e62ee0247304402203b360f4f6d07c4aabfdd2d839e224076d3c712eb7152c8f1eb147a718219467802202769f0d9ed37a582b31aeda706343c7d2e5276f6813719c0b7e533908221f8e3012102536f93df4fab89b7ea99a676f84fa9752fb1238bade5e0a60962d75cab6860f00000000002000000000101af724fb1cb9d748bdd7fdee326be2b6b81d6358e0778cf6f6dbc717ab80a25c30100000000ffffffff02f6aa0f000000000016001447154a7734e059d6c5fd5f23bf30ba8f302a0a2a722714000000000017a914047dd493a418135cd9796705ba8dbd19393519cc87024730440220202e99bf7bd524b26a712043d948f68946f254422ae83455d58a2cb79d62c9f3022022e926299894dda0380701e8960fce6827a2584473e41f4c662818f9b0c5a24301210298bd51e561ecf2a75f165581fd54dbd92a355958bbe17cf2fb8cd3008b5a2b920000000002000000000101822f1618141b0e4fa323e619c52edc88adf605c7a3c9dfb9c80db129701b086b0000000000ffffffff02f90101000000000017a91408b82ca43b0dfdf71b2f906dcf601f3cd8d4521087b3a40e0000000000160014db5a301b02f2d526bf1bb0b54ba163907fdc42f802473044022035b06a4ad8081e223d747a27700ea09635abb10c9992bb4fa1ac57e76f34a3610220462326805c2f42b18c6b75ee026c2105d665b5c99a9d38b5ac6c42b7532e8014012103bc04f62cb60861346c35d54fa64b51ad9d17bbab46470f4c0a3b73d229f16f6e00000000020000000001010e5aadd40efc0dd590bec855d6d4c8f114d13e08484a577c734770227d185e3e0100000000ffffffff02e40704000000000017a914d6e10b346030bd26fe31c78ba066c2ddeea4ee238717980a000000000016001426cef4b960a38d8895de0ff95a0321064ba97661024730440220268fe36e9d3461c6b15a62cdd9c0ccd02bc37154282067e679eeb2996c1cc17502201b213bc120d79d113f1fbb4efeec8784c697a935274b125cd19bdf79ae3ee493012102fca79d66b7653f27351cde5ea9ee5561345aaadb8ae902a36b4e587dbbd0f38500000000020000000001017e84f0fdef792b94c9ba84bd2b24b6ae49240e088c9b0fb91daabcefd318dc550100000000ffffffff02ac860000000000001600145c994784b82ee18c62e2d9f5867cd1c18d951758be0c0a000000000016001441f83b8bbc856cba28b7a7e5c51d293c3803f9960247304402206b0f5ea015a2afcad220f9b2b69e81c952a5168bba91a1845672ecac5e95dd24022015210e88cf91d35dfafa761c81f0ddb7713f6c1a330cc2fef12483749e41d627012102e377d9b3e460ea127f8be4c9d7621a603a6667c952e5396156bb63fad737fd08000000000100000000010109912d5f0a8fbdbcca5de2b011b6157386cce32688518a89f9ef88f26726ec280000000000ffffffff0221ed1a000000000016001411a1b9eb1f532c06cc9bff94d49c28b49c5200f1d08b0300000000001600141d9b3b31867ec2942ad5a2772882a94873f5639e02473044022074b9b40f876a6ac3fcf6cb5ccfc626b8c42c267313fa504adbc6b8a5cc8c8c93022041cb16a666a47d6171269159df8f93d6c1292e003f152f88d1861d0d192d5931012103ce0eefaaaf888acfbc244e195835a1aa016ff75973f1f99a715042bb0f514a5c000000000200000001aeaf2443bcc014ea211a41597e044f8bc9fde653fd0bcace40073dcc80008128010000006a473044022040b21e91a7dcdbe359aad3e99b4c5e44f1828cad0f350825fb05683fb783d8eb022021ea7cdb51304998ae1ae87a8c9b6d8a01077ecadc0a5e3a0dbb34fa7d7882470121032b723e22574ab54ca1987100c5684ad4b701cd60ca13f1ce2233e2a840862c81fdffffff01f9830400000000001976a91446569347d092f0c20fafc09e241231657dc555c688ac48a00a00010000000001011971fccd92dca708605bc8e41995cdb869bffeb33e1b8368bf5c50fc4e67ff8e0000000000ffffffff0208070000000000001600141f3953ef606cea7c48376328e6f1e9887f18df459a6e0300000000001976a9140f81600d6f8a7caad8fddeb02582dabca1178b1088ac0247304402207595486ed8f93551a354ef030a452d3a5f51c43d3c8c6f3d0e08defee9a2df1902207903b71048aa47834c0f80f783f8007154c7966f734b9ce66db9033c5f6bdbf401210209174317a577a4287bff33457b435130667924e9adb641bba63c39aeb9572d990000000001000000000101a60734f89988719f6f6236f0a3394ae8094c9d666cc32329bb4ca33ef063de0d1b000000171600149859dce5947032a147c49c23aa170edb4bd1f1e2ffffffff0117bd03000000000017a914c385195ff18b431a0beccaa9d4be247005f09ccf8702483045022100efd661c9f108f744157f5b5e2530ca7dd72bc104e2975251885b079ab2c8abc102203a6497691d02b99118b1081b9b261a1d9666223e4243246910f2894dc05d14460121038ad845637cd3e54be480ad526826eaa37ef2f1c89f45106b9a90c8b8884baaed000000000100000000010136be906215373f1beb1158e8193b8b0e42e44ef9e98c40165857ff6d923afb100100000000ffffffff02ed6400000000000017a914e4e25229863831eb368599eb46e081c6a21b7ffe87d8400000000000001600140cd9ae4f769522fb904ff45bd2cc63107ee4e3bd0248304502210092517bded9b2677cbb5fead4c2a1537bceb7e86910bbfdb3bbf94796671864c502203a9b9b3b005aed96c02b52b298cb00a69c73dcb3577a97890804e419a7265e9001210240caf609a05c44299f7c6c3085ce11c5398563a5484085e20eba1c669f5ba7a2000000000200000000010289bd9da2030c6cc4dc721352188fbb5de016bca81edab90706400b3e74fa49e90100000000ffffffff6b5291da5cef3336bfd8d8068d57588a2610195800876deccbc3c2f72d5430220100000000ffffffff02a89f2100000000001976a914a11427eff4d999c3f3820480f4e1cfdb60b6ac0388acd9281300000000001600142c6dc02dcffbbd519b2a8d973a28795d5eb0519f02483045022100f6011628927a8c87941d77db6c3d8731cdf07d57df83a36a65950ebe568a0369022050b6df946d936cc05edc471548108173c5d01f5a3cf1a1c544d326db2c20921501210229c4830cc8c55f7b204916352744a3bce6fdeaf1d3b32ff7e4ff464ced59d55702483045022100e11f9263c7259e7b1226cfd73bd0d7dacba52dc2eef70270711dacb65cf775c502200174ef1d41ef9345c1f8e47faeeb7f47d46e59f99eccb6b8a4256ea1a9cd6121012103e184bededc549bb51fa0fbb7872b05875674f27a37b36860ff6dc18e07123c1e00000000020000000001023fff17a0454b461a5b75fb42d8929c47beb9f2f98778da1efc9ada21d97114130100000000ffffffff1e561b4c68aa5160b60fd295ced782c398ec891a8ae54716b3eb5666a7bb7e3d1700000000ffffffff021119000000000000160014a6dd2190e5868b61c83ebcddf1eb2dedcec4d73cd9beeb00000000001976a9144995013d8f0a6d91d519f53bc4f9516cd21f764588ac02483045022100ac8bc16489050907853b88c16e35fb800efbf322356e8ca1a11c13f16f802105022061f92cf577c80a09552dc4f61dd51b4274506837f9fbaa13749d7f5934ab62180121036ad4c84ed6bab352e227836b1be4010c9f06b2600f9dd0bc2d835c6fa1cb5f1502473044022058f428550070abfcdbb0f5829f3af1a46deed807cacac2429f92691aa905050c022034c0532bfcc16443f30f6d8fd74e9802c0ea457b353d4bd35dc6a734efe2f5c7012102d4fa27f3b4d4114432a7e98df6566460ff64d7eddf8fb4a2ee82b3ef53785b480000000002000000000102d1af901b868567993b4910c6a911ae6d6deedc094184f412ff8284aa119d41070000000017160014ee71a52840b2786a4348c44d02b8e31b1ea8948efdffffff3994cbfe135b71c00b67e2bd1206b5dc9eac261036abb67c54430071cad12db3000000001716001486a779924ab80e3d0fb7e0f96c92f65e5ecf907efdffffff016caa02000000000017a9141d6dde9c855f511ee0793fc402516378afec95788702473044022046753ddcd5377d4798f605c18035fda544f770e0ae2d67a43fdff06e947f410e02207e149379b04f1163d219716c022cf668afe2371a5907aa1ba4699ebded973149012103888bce1ea4fa525c5e1497c04cb15c3b5f8ac21b4cc5af00479406e0eef355ab024730440220213ec7ee990ec43d768f667ee43d6221fc2ba2f4d87efc0607179ec0a2611c2c02200ddab149d3290e0e34664ff0c15aff0a2ed37c5f4a547a7144a4aa1bbf61d145012102312b43428552fdd553ed4154838de44a3e8c25db53e7c297a201e2c5a89e0e3118a00a0001000000000101bf8f0cb9a096e90b3965c63005e04f3a65af95b2146db4eb7b48ae22f4fc711c0100000023220020590495b4e59f1537e2ed2b69bad29e055ea18b55bb27de0bbeb730484391a9f4fdffffff0200093d00000000001976a9147f48d45523cb43fc87b792ee935b5cb06bc5765d88ac89c91c2f0000000017a91421bea4f5e38e6af586a3902a5232d90fde505646870400473044022069c8ff39f551189a3fca0c14ba45ed09ff49ea5f3ba7b1a30e903d76804e528102200faa4cc21adf4b4644d516e8ee447d6c0c95bb8fa2db5ab852cb18172b3925940147304402204375f4a359fdcf762558ba004d82e0fdc6c1f2008968e0fa33427910bf8d65080220169df3033dd34872ca9e61003830550a227506b8d65e876e2eb4f422bd6c4ef3018b5221020878f0382c50a5410b9e7ec4eca7e8b0a67e7917315df5050627b4dae2bb12a42103de497bf18c10dc94dcc4f7602b6f73b11726f741437802dfe9dfd789df2b5f1e2103fa2cb0414c40f880e06b586f3d9659cebf03c1d5952f28232815b9cb1b19a44e2103fb853110dfb80507e11d09fb81f0dfaeed5f50ca3c6b565e034d072381c43c1454ae0000000001000000000103a430da21c1c32ffdfe8c700482adee0570f40eb35f38596cc6bd09ab965398280000000000feffffffb62eca49cd7a0a04ec8425755348b89b6f76bbb71c437ebaa5b83f8a4a4e4fcf0000000000feffffff0f0168775ee8d36a20c59ca851a0a531ee56fa9ad5a560013bfe0d63fe8ef69b0000000000feffffff020073018c000000001600140d6c1ba99c1be0785892a9619e6c4cc76bb64939cf3a4fa2000000001600140d6ffe888cbe98075c14298ef206bc04c4d657790247304402201898326d1bbf65bde96dd0f895dfb3b7deb7c969fc0dd11bd6c39627deb779d102204f420e62badb821fdf5bff3ebd54f1b0ff4307f2edeacdf2192071414489523001210239d891f78b2169150e7893cca8a3e1ed8038e6305bda7a2b2ce596239a69f7410247304402204384563e790c4070319997dbd84e84c500429a3cb7e382aebb8d1b55f9abd5e302201326c214d24c1876aa1f987404b103c4ded9ed23f7c40a14d904d01a213450a601210239d891f78b2169150e7893cca8a3e1ed8038e6305bda7a2b2ce596239a69f74102473044022069ce488e6bb754541dd7a0eebd4960d381a5858d81acb897004d56b3814fb08d022078c08fbf3b7145512f42be24664c9b1729a4deb2470027188a679794fd84799d01210239d891f78b2169150e7893cca8a3e1ed8038e6305bda7a2b2ce596239a69f74147a00a0001000000000101d3007134a4f53faa24cac2e1dd55ba06d7b8f6767c02176ec6319376a5ffd44a0000000000ffffffff029460ab030000000016001491b4b2f333c94fa59f54a06461ccfac61c1a9f77a08601000000000017a91495ca35c5a43c926d1676a265a68ef14fa333a591870247304402203f678a5b029ba2155144e0b6e7a13593225c69356d5238cdb5d42631e929922902207ef8baf763bd07c33a3deb84a7845dfd015c3862ce1a04d1261b51776aedbbaa0121026bdc0a65a1012f7b5c933f1202d25de2084a500631e10f6ef309065e54d8bd290000000001000000000101359550dc5ccf7dfdee6044e2f85a5f1a8b6db8b8d6d58dc0a12c0b8d57e856700000000000ffffffff021e7ead2600000000160014efa3052275561f84b12957543d9361e27d7c7b6300f153650000000017a91495ca35c5a43c926d1676a265a68ef14fa333a59187024730440220213e3af23e2aa2c18f0b74a9dd4b832ad30a82c40cbbd00981f75b9e786602100220552aebb57b6a5db250fb945e2251d5e42bff1467c4500b7b51301e2f7e33490e012103f3d0d3b5f2822165b53d38ed65e9ce70f8490fb9f5888a51f07f7f6df69c9829000000000100000000010fae1a757a4340665118dcf0c44816c426d7364cdf58f8461c396be23a1fa7a0320000000000ffffffffa4305b66577dc05fceb4c445c74a8588dc904dca1e82262031290f9ef9a16ca20100000000ffffffffff730dd2a685eea22f74ef62edd6ffefba37247e28938ad0c4274d4346666fce0000000000ffffffff4ed4f328684452b9c7f2711648a70eae4f16edd6bd2bd1f034414e7cfd9ce5a00000000000ffffffff4024321bac98a705966f6b8e6d093f1f583adf295f2a63a0abd1ea0a6202489c0000000000ffffffff7ca544919c6bf27e3bf17666f84c2f04fbe6b865107f8328da5754269ef53b2c0000000000ffffffff8043540b00af6119f7186a944bf48b4e20f61ca5d95e55b418d481657686b1e50000000000ffffffff66b505d7b22c27ffbc8ee813478e3a54cccd61883aa6d62c8e75fef61581d9390000000000ffffffff37094537c36cf41665cc8ff59f87c85fbeb48f3d4e3fd333e40eb68408fd64d10000000000fffffffff9d582694604c0cac4df07c162464d39defe2136fccab21298f3d4c4ffc4be1d0100000000ffffffffb71e90d45ff5fee98bd44e5108296b1c841b8108399a21942881bca7c533db1c0100000000ffffffff2ff3f3787f60737ef470f6b00049382b24ffdde80ce365223c366e9f9220c5f80100000000ffffffff40893e423b90cf439c2b5464ac9a92c42191a3cc60aed4c1f2ac38507436e26f0000000000ffffffff11b4635520fd898ae138099bf447215ab0cdafdd7a13b629bab5e2980dd2e49f0000000000ffffffff45c907eb9ba665fc634c07ec0b37442c4fc43d7fa0d6c1e0f8ebda4204f8d5cb0000000000ffffffff02c999c50d000000001600142e1e127c55c938f2785ddcb87a46b2c662beae6b00f15365000000001600144811392b3ef6099cb5c9ee1d1bcf2108c5c83bb202473044022027aba088f6868f3952efd8c098f7523be5122d8bc8a9265c023548096dd4179f02202040d37ca16fcb6248acbfeb1f71bebbdefa138ac48ac4726c557d56fbc58b960121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec024730440220494a8fb7e77f9eed6a855f90b199fa278dac82088a0ea627d217fcb79ce0ea36022050c66fbd1c1a05b8931a987e8aa9cddd8a1a77c43c5626c2f41330b55bb0d9cf012103f0f66dd983e5a780e0dcd444ea7961917eda9dc0e4a1677820d9444ccf382fc80247304402200b48c6707bb4021f4a48e6596ec062e536b9c467bbf319aeba6bdb8b10836a250220098b6d63dd39a63e1b0631b5fe4d7cb93c66a32adf86021c3153dfb8fba8e87a012103129bde81389eca500bd610f01054890fefd811010ebeed40b8877ae66414276402463043022030f311433e9c4628b1b3b4d9c4b1ab7a0b3f5afac5f534fbc740985c50cc6781021f28d9f35486c02a55c0d557c65d16b6a5cdb9adc761db1f5e5f2a59dd8b3f22012103ce00ca83f65b2f190a04d4e78efc35874ceb1fc624a20b27626e63698d25d9710247304402200ce31e0d6ab7fc776f64cc010e0ca9c13e1f7a428e347b0993edaa021d38670d022032f65c9b3dbcb2b88a80a4065bab6bed03da9a7373d6adcf974c7d27f406e2010121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec024730440220638458e31ad522c41d2d33e7826974f5e123a09adfc8f99a50d8cf4447bfdf830220704b6415d0b919b329a8fe509e5d25e38fd520ba4770936dd880cafc5670ce450121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec024730440220190938ce6b83e25e855eedd05495500a57ddd7ae94bc4d31628bf3916fb1161402202a7f175f6df54b98ddc9216d56bcbc6d9c104de0b0113d5f824bafa3467ba1d001210382409683219a8668a404b4c80a8facb97e453dcfb04aabed2a4d202959425ca80247304402200af6d747d8e845535b724619304af3652ff9f8927b967ebb29c06443e4115b5d0220524c9012de1c790b77549cafee135d7d59df56f3cd99b31e99f9b793dce7eee90121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec0247304402200a60f01883219a31ab2b90d0017d63aa72db0a2b2075ac4146e608e5947c93b50220034f5300f54987cd7230a00e0d28ef45a4882a703a59f78c706e57f495636ef201210357cc6b846ed1c3681d55a60d290ec7713102da1c2336ebf96d49c66ea530adc802473044022033670a64060c73eb7408c5bb1a01364b9a50920fda8986583977b9c4ace509b602200ab8c6c33a7e188877826b4c4cc7fe698bb7982fc9f8c69cf6cc15636872edcc01210244f40fb690c670400643367dc7214f8ba4ac7dd915b4f5db6040df92120d8c2c0247304402204a73bf4f85f4a936b81b93d4824d2ce0b5fb84e82a9ce801c10956186793e9d902204fe2b510a47a48a3756caa469bb8d0bcd2a4e804ce2c6e996bc71637d390713501210357f0aa96f44e67ca47fb4cc84d1526a1a16277dc15874024e852303555c1f49d0247304402204a6692e7a28deee30626f656cb216ae9e10e45f1783cff67af5a4852f484dc5d02206605c84c492f1a8621c3aa21f870a16105bfc38f29351699f029add4280988db0121036686faa340ef4d3ebb9cb813df20447f43e43f856539561340371debb7dab5060247304402203abe19e3ceeef03aea2d4a0492204809a4286274d42fd1b0f7e0b7fba12860cd02201b3d0dd563a1382b6dabf3bc898e0f6a318f49f44cfba2b1597500114c45f3ec0121035dc268092f62c1c3a7198484d93c0904919c7c0fbbca86202a60793005fe9a62024730440220052582d1369018bd1b280b32c69bf5f811854465ae2e5e206fed580be6420ae302201057f7a404003b0830a4b57a6a1f5bcc0c3c1a39e1b36eba15fd62c48aa8591d012103129bde81389eca500bd610f01054890fefd811010ebeed40b8877ae6641427640247304402203ca700dbf1472d9d93c32b7f7523516b5191cf1ec3c17518cba4a87ea032b07c0220570fd4ffa8c8713e72a4cb89a518bba80d7516b9f1cb4a019c4e28a27d3fae54012103129bde81389eca500bd610f01054890fefd811010ebeed40b8877ae66414276400000000010000000001015235dacf6f8f826e6f5f17458f08a745e3e9c49085d90fbe607d5e22cfdf7a370000000000ffffffff01148718000000000016001477e6a1a77b3007d05acf0c621c9cec97a1320d38040047304402201709ee6d7c4427e83ae24543122812b69795f74fc6cbb3d182ff7558766a906b022062cc42b0426655b7331f461d6e7025c5a44174bc478c9d04b0ff6c4e8b5ed987014730440220755b59924fa22b59283a9025ebd12ee7a3de893f12c451eaae922e344cedded4022048b19c49f24dc1d32f638f02604fa3af25f208c9f0a7f8c8f093f668dd4d8e0001695221034966a228439da1d11a5b8428e9dcfbb285e76e6cb54f8febfee48db38c667c6f2102e69710863d421f5a8279aab5c57d188d71a755a39201bd60a2ef3815c5b399d62103c523bfb4e274a1c58fee282e3e5edbf1366a467f7acec107936e0978e298653253ae48a00a000200000000010279adaf062e3d19f3ef91d86634ea0e427b90b01358d81d5a29552727c5124b100100000000ffffffff0d64a140d86e7b5eb1b718c994d29865b2d93edcbee595798d827a8f41e2d60e0100000000ffffffff0210730d000000000017a914bafb2d7e4f86b395b3cf43105893acc8df3c123887d186090000000000160014ab0378f76d82880a348afd979a38b25ffe4bf23002483045022100cfee19f2b86fbb6f12b19a63b3406d0b22980e9d03771649b3f59efa891892b40220553b0e3f695df28670800bec6028c31931204f77bdb9124b4521ebbe5c3d284e0121028553f0b13a6cd02a279c98943b33cdc71a2968481cde0f7576445f0ccdf4db4a02483045022100dae9cf9fda3c322d078944b235abf1014923f2697f32b59e88be8d1b8c74517b022006cb8e835dcd3568600c53fc8baa4989764aed81b4dadd9c99b1ac60447804e5012102606c49d93f99f437d41ee6c5bd1e5f0c851d5d86cfa247c12364b9f196f55913000000000200000000010136ee30afab5cf7b44b4cacfd79a05721a893bd51594464bab37364a4862e9ca50200000017160014b38f1461633a9ff97a42b579d4782a8f34e86659fdffffff0211e813000000000017a9142a6514ae5e126c061a86546cf35ace2215b993c887d619d1090000000017a91477c255f0bff6aaf692cd44d7703088fd9e62fbb68702473044022052fbcf0172821a557d9a38ba40b6c766bc75897807b8e1c7dd405f4b17fe2ce502201cf80f8a8be85175f63635cb4f3aa45a40176cc67ca1a40b435977945e1f2583012102d1abbab06832837a346cc83764c79a500f1ed68a53f5c4f64a57474989965ac70000000001000000000101cfb30b6a681199dc1d1571323bc541457762d2fa43bdb68a1fa6b5b5c68802de0000000000ffffffff01378d01000000000017a91422d902d4350da958e5c309b69b03b7633b870cd28702483045022100c9595a94626ea391c582674611b1456875d5d44ad723356bcdce263a10bf839a02205e86fefe9c557f0a5d6271d442989951adbcc4aba9e015303a9c0039fae5c5b1012102576e82eaf532bb62bd778b331ad12f1e90ad9fc49416667ce304ce86f73158150000000001000000000101c07b342d7da8fa3db58815e05fa15c285c4ba1dbb72d955a00b3d6f019269c080000000000ffffffff01f46f00000000000017a914e376c8989de9e6417c226bfbb35ccef2220d06558702473044022003305da9162b030a82e5f3f5b99c9316d598c488ad1f013a7c25b6d2c5c4456802202adec73e7a5892450aa24de3df3180e744fc492b8568437d276d07cf0abc6bc0012103d8cf7c9fd5825008ca6a7a813b005c80bef844f118a52ef3f9a23a6e908fecf8000000000100000000010143a7ee48b69946b6bf4f1ccf4fbd20b25a2dc46e95e291a09e578f61d72e44450100000000ffffffff01cc5403000000000017a9147fc154729721fb9668b8bf37f0eb1eeb43d9311b8702473044022060f380dfa5dd35323c59cf17f1939a0b2f262745e615da440c5d5d14415d69040220198af5ff261c37151a7d02746bea9f4e0ae9fe8e898fd07726044586b80e01720121025048cbcb959c6c9cbde6e4f3fa37f0501afb786dbda941303c1265bbc89ccc9400000000010000000001015d1be03955bde1c41f997d2823e12de6ae1714460d5d3108296ef66dc98be5250000000000ffffffff01987901000000000017a91496ad574a665aadc8c70719c6cf645350e3ea53c98702483045022100c4abe062b1e2ac538bb68e0e1567393d06f7f2e8d79c3f219de7619b5ec179f50220782ba7d2505d3bc177c030bbe320608fa27f08b2a6fd0a5ad433748030153e03012102dee1af38d0ec3fda61fb3de1ab944445d7513a48cc933fac2456e214b79f922400000000020000000001010a43ec2499a517cc57f8a6e6fc5e9cf11f79818a1333cd3977614c31f0ff2b530000000000ffffffff023b1d160000000000160014d0be80f0d3d6658e09cc61e3f26091b10bb56edfb20e730000000000160014c168f20072ca05006fc6e943a5f29e8577f61dc60247304402202c9675624cc1317721b799ed729b0797b457213d803ec5f329300d71e7ed229502202dd11d44d27702170a1c45f53a565dc3a70a4efd34bcc94bc614f59d4d6894c2012102304e54bf1a457b562238900401aaad1034434bdaf46e97a8bbebe4e22de5ef41000000000200000000010139892dcf1d1e6333250b53ec124be9541f5edbe6beb713331f93ee5b8a1560b60100000000ffffffff0240741b000000000016001431091f3465fe830c0e23a5f3dda182ccfc02f8703296570000000000160014a4bbf86504c07ca2171a64fe285d1a3a5affe4470247304402206a47c31de1fc26cad479d775482bb4ffa2d9c4a856736e5ee4f6ad6bf96481f2022040505923349211c01dbceb3f94ed5e49e1a86d5c6a8c612f9b924807aea30c66012102208134c721878d1e5b3875033ef545aa3294e564167a44159cdc09b70e564e9a000000000200000000010159c2c9300ed1ccc6d5713f4713c2261742da0cd930d532b18680ea08dd30d7750100000000ffffffff026c4d1200000000001600148beef2ced4ae48ec3915c6b45c21ac1f74642b8f1944450000000000160014a72733de454cca5fd2b71e8ee2f4c8a4c4c855620247304402207edc2c64afc865570f7dee9babfedd4fb051e9084520949d688934829cdff5a802204ec77f3507b02a30913b2884453b162de199ea106d0cde4c1ccc25cbf32f83e70121028af7ae3b5a5d27e9ee12dd4394d5bb381055b5d78e4e5853da2ed0b6a8c5133600000000020000000001014656d6f816574f9f0bcf007af3c466f9c6ba316460bf9d4455538bd1782aeda30100000000ffffffff0245ea0000000000001600145a05b35753e150f190c9e299a04baf81a07d9e85275544000000000016001448b4322eb3314c4cb23a9db16c9e1a118120c8440247304402204330153ea60b9bcb4610e614aa0c3010541bd8f31c05736d38ee1bb6c3a17bab02201713f41a62fda1052cc24d5ae23908fc040f7dd4af3478d0aff1c843db4865410121027ee228fbe1504c7e57f3f027377601236e65ffd18d9824d5759efe4c6c5675000000000001000000000101ed73bdaba7480ebe2989f8e53948390b39e8933840876bede1648534c0eb9ccb0000000023220020b279288a7a3354d9a0537609f63e4e799f0be65e87c41f309ff7bdfbce30a2daffffffff023c81450000000000220020a6ef28093c5727b214cd3c7e5d07c73aae458b7cebae1d747916a189f48fed4a95af01000000000017a914b82f7b2b67fd30a4ebc57225be7aef6f92fc0291870400483045022100b3795d442ed404051a22147c64453031db453899437183c5c868c1e6f0b276c702200cd54b18ce3101cc0c52f7915f64f37e4ff5893a8a91e02bb5c182ee101e644f0148304502210094d86c19c2442948438857b22a3bc933f3245706b891e3fc2d7bed8335c2a103022011e596dcdbd17ae7976935ff5786be02bf4341606d5d1ecc91eac4503ca4e6860147522102b970a5d03ef4068c7f3c7779f7d1130ddf52ba7ba1317d08e8f3c0f25e15bd3e2102427d297d9a117f13e1b9217ddcacda741525ac7232c9f8d7c903fe87d1d94a0c52ae00000000020000000001012473142989ee156332ca4b436e181eff1fe3833c873c2e1d21eb052f5672fe990100000000ffffffff02983a000000000000220020c94af3b2ec12e774d3e3e6a113e89f654745ae9061a1b0d2e0b41816bdf228499d570000000000002200208d691c086c9c28f38d331b6059c1e5b12966fd59b96484e268643a4ec847ad2c0400483045022100b2ff98c82d81a4f909fdc08a9a5ef9ca9db36b20ff87107415aa9e4776fdbdf90220637957a92fcfda804d1d7ce623ea676266282b72ad4239458194d747d3ed4afc014830450221008365f29e145161c5d84afddfa0cf04a56a4ed511c94a130bdd576c84b89939bd02201b4eb8388df89154755fc5993867dd1fb904b868b5eb10189fca50b129ec662b0169522103700e7a54222dc2798f315698bb811c53311d8933b864bc3735c20d336674d3e32103729dda8d9e45c80aed1c2e4172b5f8b9770e6364004a1a72aac08ecdd9ac11072103cc8fce91e6aa311509ce60e8fef8e86601704d3b3583e9279066953a45e687f253ae000000000200000000010331634fcc50bf21b44239e3310c054f92ffdcbdaed0db7ca9c478b0ad303aaeba2f00000017160014b79e5443bf2bf71978c2ea48b71151360acfa17ffeffffffdf494cbc42d344309c1f2bb1d4d1d0eb270baaed0a83e1fe9acfa1d8d48b4f773100000017160014edca11a302d55a0110bdd390cb326d8e2899b35ffeffffff462536bffedc1221fb3dcc00dc233d8577300f9ea16184dc6c09eaf6be2c23ce38000000171600144d1e8c5970324f3f1f134fb7481f8de96fd7867ffeffffff01e9730d000000000017a914fae60f142927a365336e0da1da5d1a90266273988702473044022013fcf1dc5b35df204dbd3bcf0bc36d1ce6d7d8c344fd4b59d5dd7fbc9438c1520220292d28ae2668db29f97c0fcdf17b24946637028f830b776b813afd5dcbc8c3c9012103e9f4a43d4a7e09bfce89fc3a9ffb80197a9cf0eeb76d2bc892f159847fff22e00247304402201ca4379c42bd92b79b5b9c1eac1007f1c791fea91d09c6e05fe36dfaab5ea5900220333076d033fca03060126523e7679ffeb10184842171aefee8f468dbb4261efa01210335ea2cf2d81c63ab5a4f8366428a08df0e786b6e675ca9043eca344c76fe01fc0247304402205fd441e7752e90f16aec3be05c962582649231915977d1df7faa108272624e1d02204e0b59367a8d4c9884e1e72013cba577b6f7f83358d5d5215abc0a34dc4b0b47012103a875689f8f65afee8e4e140cc58c7052f855bbb5ee5cb94ea5cc0ceada2010eb47a00a000200000000010360c2fec34be254381986b5a6eb7ccf429b60cb83c6b65b55db4dc6a171bd8a800000000000fffffffff9787be0f84120685a44ba4d38f8cea76c4c48c2a716c98abdbce4c6315d94890000000000ffffffffab45f8805dc74f3f58ab433a0e87888241a581d55b23aa0a79bac9be9a6d33e80000000000ffffffff7bacf90e00000000001976a9148f19fee2233088884b2e443ec0f2ca50d257eb1488acdd0830000000000017a914c400c0fc91dc274349df19dc3e8c89bf194dfde6871f990900000000001976a914a05b22f0880d47e000bb2764c5b989002b93aa5a88acd4b102000000000017a91450debe495bb7ecef97b1a7c470c98b8760d6867d8712eb3f000000000017a914130d353449d5d50d9edb6435e3ab0a00dab190d587c3c90b00000000001600147b49ad0bd94e0de4bfdb80f36ff350300d1cdfdacc8110000000000017a9149f9867e29e99a444d2594a61968de753a635914287f9cc0100000000001976a9149d65b7038f1dad374312756d3ec9faf810c7924988ac02d700000000000017a914b127c48ac67b9f3b8716252da1e34bb2d84e646d8768660c000000000017a9141a9fa0826c406b0d083474031f3be39db78d64b387fa330d0000000000160014bf8b8105ece9a33aec14ca6a84672ec391631ff3bfe8000000000000160014f6ec55e931a84d6012903e4d8b470809adffff695c0201000000000017a914f1ab71befc3ca8f85d362e9b455b714f86346a2487edae0100000000001976a91419464fa7df3a94da5ef4f7eecc6f9c6fee11dbed88ac0a230500000000001976a9149989ffa7905dd36784588e70e5dc9c77e768096688ac4b1402000000000017a914a50d30290aaeb351620e075f33c5e855cfaead61871d9100000000000017a91434da82785b87738bef01c05817231c3a3832586987708203000000000017a914c55d71dbafb33103db1ea355f621f97a2afdf39f8712591f00000000001600145026292ea64eb114735e18a394b9432d2fcbe89c572a0d000000000017a914d9c77a8fbed5b3a8fe4eead2f333605ecdbc2f718759ac00000000000017a9142ee20a9f48a3a5daba764234b9dc309594a7359887034e03000000000017a9147879b22414070de4e1a206cda3df1e883b0190978787554200000000001976a9143624fa07b153806f7fecf2fb4e60c003aa03426388ac93c93100000000001976a9147430bab03d68e1f3008c379ce0382ac3f8520fea88ac681e06000000000017a914e0fc023400579d8c08391ca01d8a3cef416d24b2877fea0900000000001976a9141f1000d332fe02c3563dbe9ce51ad9172cc191bd88ac5b9f03000000000017a914bc748a36901a132fdd2afed3f589d8f6eee161328743a60100000000001976a9148790d191a11a65e7272f2640a33d0aa267a3471b88ac7cc13100000000001976a914930a6140db0fb4a3ad822dcedeaf540b9d31fde788ac3f5200000000000017a9148b3c74308d62789593b5c1a08733caa3b0ca71ff87c4be02000000000017a91457967256845518fbe745cb1c776d94d23bc5103587b0ad0100000000001976a914e4729198543abb286b96edfe62cd7c7f14d8d14c88aca86100000000000017a914b85efde9894bf7b371257791e6ca03f3a9fd93e487fe6303000000000017a91419e63c0ce49ef04420ffdb36baa5e637b50835fa87359b0700000000001600147701193eacbb6bdf3d3381bc6a30369e9ae6bd5d7c47040000000000160014db45ca476aff15f8bce97d3cf0702fdc36e5bf5c08cf0000000000001976a914faac6e66d3e165fc6f125ec288d48bc7d98fb7f188acd4c00100000000001976a914ca0eb29e02442777cb0b0481b03780f3f3e2eefe88acfaa610000000000017a9141a47268b9d0e87bf67e213b7572c6dd5a7cb568c87cc280a000000000016001438e5665654cc89a9a11b2cf32808ae3bbc7ef93e67070200000000001976a9145a5cc8ce13ff6452916a3d631d43531ed463a90b88ac0b4803000000000017a914dc831e684156c56d4d2d5560a2728285dd8763b587f75d0300000000001600142bcde12099d2901175352c403c857593edb0af82e1e309000000000017a91458fcf40115375a7a40cdc8a83494855dd0556a2287444403000000000017a914c37cde90b2f00c1dfe8bf5ca23eb816e061eb25e87f15d03000000000017a91425605c715a23e7739f1c6a7926fb244aae0dd4ef87ea15090000000000160014eb69bb94033522ef3bd697d1bf00b4a015ccbbc070b70100000000001976a9141abb51fcbf706d82da493cc9b65f4c8e44b1df4a88ac72990600000000001976a9142048f0fbde998c11790176eb13ad7e02031ee9b388ac534903000000000017a914ce3bfde80ee20edef4e0615caad9fef2c836d8db876b4008000000000017a9148068c638b891b5be30eb826ce2be7afd1e8edd5887b0bd00000000000017a914e378113b78769c2165038cc5c640be535e68803e87ee2000000000000017a9147e8034b08b0f8b85671624297a712525f02091e0872a790100000000001976a9149408a58f99cbe5c54f9837c1faa977832acd0cd988acd8fb01000000000017a914b8f307584b3f7683689186452bdfbf64f8f91a428736fd10000000000017a9143c53277e252ba76bfb3f830a77a0bf65f2f7ed5c879ffa0000000000001976a914ab2ef1013082a263c688e3fd91dce8b9ff6b515f88ace4a421000000000016001450335d288aef6db52278134b776c8c8363a660651cad04000000000017a91407dfb1c71ce5bfa7084d1cc671d3570c6f84d81287783f08000000000017a914fe7b2e5618a28b22bcb61b1d8c11e39c7a89394887e5fa00000000000017a9147013fce53d3ed0114103204f89ca93fd05b9581787924c03000000000017a914113882af83b80c2953d524f980278906e70877188731520000000000001976a914ea4bd207daa6b4f973d0eb72b9da0e4c370b47ea88ac46b30100000000001976a914cb57ddfe1bd5a1dbf76029b9cecf920b314e89ce88acabd20100000000001976a914cf95435966b4fa1bcab66dad7718ee26943065e288ac54460100000000001976a91439fa3aa69af56b59dabdd887c0a1313fff7938ed88ac34d000000000000017a914588a2c3bdade75c3e3d017606ac160d01ba199e187ecd610000000000017a914a8f9a54ccb16040d68bc49e3c900d421006c48f4876f4303000000000017a91404fe8216d7ea8126cc740ceb4b8f46653326ab80871e5e030000000000160014273ecf1a39da933a00f38255edf5be6c6ded27a17f090400000000001600145fcd2e15105fbe854c7758689448e84393727184e3d90100000000001976a914716503aac58a06a896fe4357cc4ed731a063601e88acca341a00000000001976a91431d74daa3bdd2fafff6efd75112a2b54c05ce40988acab1a0a0000000000160014629e0f2b740dee87a1ac45e435ba8ea487c4dee49f9f02000000000017a9141f949790a60a4c7385349915b6541552a68523d98751a301000000000017a914d1efdad210ba9a64aa591e319c943073356b170387ebce00000000000017a914b02e60f3527401c99a087aaa2e52dbe24749749b875b750200000000001976a9147a703c7a3c7cbb9ea69c3d13eab80c653c66e82088ac6abc0100000000001976a914748213f7ea593391d07b0ac9a07c1ec688937e7788ac4c691a00000000001976a914e695ae112f44344a1219854252872269aaad0a5688ac37e100000000000017a91489b7617f585f01f261ded284ecc923f135d0d6738791720f000000000017a9140659b22f6c17a25ebd4bb8e7ca1ed345d5a2ff02872946420000000000160014ebe57dc10175ef0870521507dcde684484debdf3755800000000000017a9146b536752e87d03c23cc3739881513f2737e76819879f8301000000000017a914419ef556b7f9df31a4c1ec5bc1e6609d3a5da1f4872e8100000000000017a91428bef4289e574b9ef685a1c3069cfc5e1bd5dc4f8795a60000000000001976a9146f25239e1bef5b8cef06ad67e67b83b13166ae5f88ac8ec009000000000017a914bd6c41816dfb914e6c3502f4b79d19735311ae8487ccf900000000000017a914b0b411be759ef8d0addda3ae4e677dc098f4473787c1ca00000000000017a9147cab32348246f83eab97abe524b8a9a37e57b62b87fe0702000000000017a9142e8d08448244e5c9179099bb724bd4eac3283c8387d380120000000000160014003fbe9c39d4f69d6617380393d91e3ff4b39f37b9ce01000000000017a914a385ffe8cd10f9bbd5359b224f14b24dccde109a8757c0010000000000160014fe52702e88bdf35c3517012649090e6c7e2af444314803000000000017a9140c9cbef0bc73af0a3ca054270503b3d20271280387144b030000000000160014bed4809b7b49000fa9b7a680329268c64b366f52e03902000000000017a91465d6eff2491744bb1553444d4b4a12b6d8d1bf018704a800000000000017a914c27693cd140997ca8c25d08464a946471c2689a8875fd70000000000001600142519369b490f562c399115a0b6818c6e1baba077acae01000000000017a9141cc88d7c117246964aa9e65897450f1bdd6b72248742dc9b05000000001600140374738f64e760b8fb8873db27f9bdf16875eca55f1e03000000000017a914c63c4f459fc6151513e6748d9cc69ca26941a44587f9470300000000001976a914e6e828f2bebf1db27f727f5f2abe441a7474c5a088ac4b4703000000000017a9144381140a1cce385c6cd99842b25e9735c5489573872705020000000000160014136d91041ec7c876d1baa4cf6197ce4581d60605fc0110000000000017a914d7825a1fd954853c761c55008803fa9c6c64dffc876a9d0100000000001976a914f2eb0a5f73d4fef576e62c6c5aa9735677f53aee88ac3d5001000000000017a914e4cbbe1956be7b168808da03c9d019d084809af287c81a07000000000017a914739de7081adc791b91a066c6064903a2f3eeea6b87f04303000000000017a91484da9ed651c0b3fa33d0eb13fb1d6fe5fdc9202f87af3f430000000000160014345c0fa7d0a4b947de28b009006e73e6fd3f948430e80900000000001976a9147bfa54f4c30de943bc06b2ba105595caeef582d388ac49cf01000000000017a914fb2e35c68740a678efa23bab7aa2476310ac18ee87b7e30a000000000016001425c17d3cd446e632d53a4f2d33ef90668a779d73bb1d0400000000001976a914d2d46e7a77bea8859e6c6ba5f67fd22948ea543988ac679f02000000000017a91466a20f9b3c03f1ef6e402431f8f365ce8b2c9dca87155e03000000000016001411da1dfb15158682eee3751f9c5796ce538d277597b701000000000017a9141259acb9e7d11e2becce0f1a065d6b7f20bdfa6687f3e20400000000001976a914915964e4cd690c6d8e9b0cbc0063fbbee9fc798c88ac40630300000000001976a9148772d39c9c030bd7803bd38917eee75c327f1c1788ac353601000000000017a914558fd36e329b5841fb88c8c2eb8695be7b572e5287b44703000000000017a914fcac9b2fa5751341d1fc4bc44ff2e2d44e6aa0188738c606000000000017a914b7b147651312cf6d386efe52f8fa8af74fdc908687024730440220312f8cf4c71293ce89a6541bda8b3b43ebb13e9d3112006f3c3e55368b218191022051ce8409272beac3c5eb7e7b1e876434da364432b9a84821dbad8f06ca58522c012102e558613122b96084504fd9b45ff3653dbf30dca3f8f340fddc5c28c7afa60664024730440220256cb9c8d120319bb45806d1f74bc307c2618f6cc33b32f31fb7a1034c67aad002207c527c5066477b97ecee34e2fd07298b9f1b45baae159a79b1cf7978b57f491a012102beed0f104069435d255b8dc21add1b7ea3a87242370632eecf6ac47d13db2c500247304402201823a90094f1bab0b48adb7dbd855cb24c04c598bf777b7aafda3ab2ee5c25860220657916e300f2e751c90594c50d6718e65f73a2fc5b53d3d2fd863e4058d67421012102c0ac4abca4417e8b2b21b7b570875ca0b22809a91f7089b32198aa334a22b21a00000000020000000001010e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc6400000000fdffffff01fcc89b050000000016001465b582ae6f99e98df2114d713bc77f450ed2db8a024730440220282bdcde255b1230c26af54fc36b956303385cf5531425b2884637951888733b022010a16dae8428793b28e582eab76dff7cdf2072dfa7e33d22ff1cc8b7ca8cf8e10121021991159f1963be5b99b70868c63aa2a871459c1b87ab5da1c79466d743e7144d00000000020000000001010e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc6800000000ffffffff011ffe0100000000001976a91408a9d5b52961dca049fc07e693b0c522d5cf913188ac0248304502210090d671575f55bc675a98148b11fe7c1fe3d1a7f87544ff56fc87745ef20e626702205f6fadfd3120dbdbe994033f997794b4f2d044f2ea16da5365408aae91e41dd30121024d0026a1b93c9d02fd8b529bb5b89f372551c7ca984464ea831814600d85e3fc00000000010000000001020e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc050000000000000000e7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa487400000000000000000024e8028000000000017a914e69d9a0b8212a85a90179e947783a9922d316c1c8763430100000000001600147b49ad0bd94e0de4bfdb80f36ff350300d1cdfda024830450221008a090b983feda43a59f1daae0ee0eed8f0c4c8f914df98409cb5806990c107dc02203ce311e25c442f860f2b18bd03f0f43de1d6c22802c9353070adf46d01d7ecef012102899cd000139e0ce65943204d6febfde95853d6c2242a0ea9c602cb9860e47e79024730440220333328354528f2a6e4f4ba9d5ad7a6d6baf0f7209cc524e097b11c3fa9c2ab8e02206d0d180dafa7ca9f342f0f7febb3ac0863809171adb0b6b6398d3628e1be3132012102899cd000139e0ce65943204d6febfde95853d6c2242a0ea9c602cb9860e47e7900000000010000000001010e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc5f0000000000000000010b4803000000000017a914dc9c79b9e267094d5dc5ef4912e5ef7c8a2fe7a68702483045022100e32de4c3750c6258848d5612f7fb82fd3fbd3af92cbd178cd69320289a50504d022011456dd931b4b5c44bbc9e7591f0208fd6f1165313ce1535b2ad2d0286bee1be012103615cac3185091e0d14dbad82498455697a7b4c64eb71581bf9d6537dbd1114610000000001000000000101f099652f51490d9adf6f867db474b523a59ef02b5bd8bb4c96c905e98a4f87930100000000ffffffff5dcce02100000000001976a91406ec753b1671585b074109c77fbddbd4e4d1d0bd88ac160c0100000000001600147fc83c038c50945096741663f1194d0637663021a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388ac0a9e0000000000001976a914ccf6db844365873668788f9b5a1675add4f4313a88acb4bf03000000000017a914d2c34ba3cd36664113630aaba4eb2ea9cae2f3d98736e80100000000001976a91497a26975f7bcdc87ea6e52a0f751c5cd5a9e6a2b88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd766b1a01000000000017a914fd8c623a37dc82feaa22f42a7aaed120bebfe2c08779ff0e000000000017a9141e8e4304b342ce4b8de512121d7d6ff82961cb0587d0d00300000000001976a9148a10a0c2cd10c8d78b0983e3b5f8f07fe3a73e2288ac875900000000000017a9144ffcd40d8b71f9e984078249f5dc000485b9b587878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388acd524f3160000000016001484b3ab882419eb25eb0ff21bfbfc973b3b214e57145600000000000017a91492a46072297e14fc702f5def2f1d3fa1cc88041a8777ef00000000000017a914210eab64e94ca27ac35d48e6c8529cb70625181f870e3800000000000017a914da15611b37160c1abcfeac8c954a126e5f0792e187e31b3f00000000001976a91481c4a44dacfb1d584c4de78c31bbd97eea5a464788ac036f09000000000017a9146ee92609190377f8ecd6040d1dfe4de3bab8ce0087801a06000000000017a914475b2b5cf9292150bb6ed5201575a9fb9ae0b2bc87224f0200000000001976a9144e7202a233bdc08c031a1d27f4c81546f04ce0ea88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b78c01000000000017a9141a2decc46aec972b3fc970eae9554ab953a35e2e8765ae01000000000017a9142c0205e3689c46864ff4d8aaf67d8d4168a9354c87d7e800000000000017a9147bc3fc9510d6911696fb807fc02a11de9d3ea56c87509302000000000017a9144767cae2db359d5fee6603b0eddd945263fc2793874a710600000000001976a914542f4acbe1732c9b0da547e8b4fdf958a381ee9988acc8431900000000001976a9149c3cf3cfcb82ce49f620519b4d1606af3e51938d88ac7d6d00000000000017a91447fe0c3214fef124147899bd52da06a0517cd352873f35000000000000160014185d76fb9148a6333468c50e0c9c4913010ba2044f443900000000001600142cd8acbe8c403d5c4e3abdeb3cf6e717fa3866975c583200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388acd8d600000000000017a914515d3acf78a3d06e797cb5294a45e86c5b566cbb87cd5000000000000017a9140e8aa010d23606564c335e80ad4f69ca59ed325f8772c70400000000001976a9148c6e020ed187db78b4de7b659a89d9c1a73014e888ac7d330200000000001976a9140ddd3d45d8ea45b8cf774c7aaa1aa97c5f610ec588acf20804000000000017a9140cbe98f92dd4f7c20147670bc13f5ac7eb8c5cd587f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c99701000000000017a914f0c3b5f96f5116198f79e5ddbe2aa3b3e9f3d3b787746f60000000000017a9145256ca9186a3970d4a7d0b6ba2ffe032159f9d27879dfc00000000000017a91441a81d10c085e7f5f51b169db9cb9e26f0dbd619879bd700000000000016001462b59fccc57ee14578a40c7d2c62e92b0f84539ceee26d000000000017a914d01be739b5b7bb73d8a1e8c3638a20f3a9d24705879c5b02000000000017a914fba89039f5fafd192eb397d4160f0903b74cd1b787106c08000000000017a914e0df028fa15bd66b4f48ab778d69c8458ad2a76d87a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388aca176000000000000160014dd9d98a44dddbecda020d2e6dd3b4fd22ffab3c27cac00000000000017a9148269a7907f93816a5f3c08c264231c6cf4e98e788736d00a00000000001976a9146e92fe225f9d806e2bca6e965e37965c933a1fa588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d8d600000000000017a91495dbd4b812a741fd721015cef26855c8dde77ec3878fad00000000000017a9140116604df1c684795c234bc3ba9e6679cd4c135987f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76704505000000000017a914c603b497ed538bbc97bfdce1aa9acb9bbb405e34873b3803000000000017a914dc00159be3c1f747cc0924570d0fcf06422ea143879fee790000000000160014b795ef1a18dae4f283c0137cf0434b2bca58fa1f5c583200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388ac909a00000000000017a914e98cbf246685dba55a9c6ba34cda891af032e741870ea302000000000017a914e1f52f61095031f655ac1522382905d815da6cc28711af01000000000017a914a846c7d08b3001250d0ce9e1490324068ddc520887ed440100000000001600149bb78290c39ae444fb42567e934fd66a6302ae82eb5e0000000000001976a91443c61d0ca81bb3c74ef24df955cf46ad16061c4c88ac53bd0100000000001976a91464c1dd903ae966b9bd8a459bc2ac6cb32766fe5388ac0bf65a00000000001600144cd87c47787bdcdbae85ba66aaaf8873b1cbd844a04f2d000000000017a914bb13d179c249b954da0a6151f9f82058acf31b828726051100000000001976a9148482e2291608247e4ecb6a8fa1a0a5a717628a2088ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76160c0100000000001600147fc83c038c50945096741663f1194d0637663021f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c66d00000000000017a91454eae234ef8cb23f20a50ed6dfae8566575fdb12875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd763f740b0000000000160014e7a29bfc64407ce9f10f1764edc8a324d335d1a0fade0300000000001976a914845440cd9c0b208c7f8f95d8f95265566c66ae1488acc09105000000000017a91419beeba7816224632e039152c51e0e0cfdda378d870d0802000000000017a9149e06fa1d6654d970760a4d8332769c17b635594087fcae01000000000017a914e848db0e87f15019de9401722d11d034e26675ea871dcb05000000000017a9141d6374ab6cad8f655c3fb30592f648ce849096a487f8580100000000001976a914cb90726dc69766320c2518dc41f879441ed90f4b88ac400d03000000000017a914f71ee2e7056ce6641c10b4bd86abdb6af3c058948740214103000000001600144a4b5316cf1d660707a5df446085469bccbaddd179ac00000000000017a9144a817cbcd2e1b8c7fc25387f0c22ac5293f81f7d8726331b000000000016001419a875afcda1f61521ffc9900db3b0e3600071d25055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768bf0fa0200000000160014da4572fdeee349547adf9574faadc68c15fd8ad1bb780000000000001600141b941a84d1819d27553bd6d0a1dbe993b17c983e54050a000000000017a9140dee4efa51aabb1d94d14dcce3c51cc9480948c887751a0a00000000001976a9144a597efeb0572964c99c24c2fe3f5499b27f42f688ace6b91100000000001600140db774451361792dd904fe96bc75e75d498bd50f69e515000000000017a91403495c9d6a79b71203ee70d33603087543c68f30875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d2c40300000000001976a914cc38d8f4775b8c3722d03a60bf4fc6068d5e852a88ac024830450221009ae504e7ef05573b9fafe859ec041e6083f370f7094c720f13b4a34d6dc0d29602207456839fb15a2bebd230574b76da5495727137b0bd3f458d3b4bfc5f002556b401210266c3860b4c92151b2098448898e3c83b885341f4b0998331e5bcad986c2466b400000000010000000001038832887a7f59dbff0de0b0f22b8eab1d78b3bd7a316ea808beb58e6f7c44f7215300000000ffffffffd7e2a5aa687fcf7651bf6133f6715ec50460b16c53a39d2f7a371e48ed3f99830100000000ffffffffd45ee4d2cf3157564283fe623c4d8acf40e99ea3c2bf6f3dd215963131205f840100000000ffffffff02803c060000000000160014c870b1cb3108dace0186f00ba2fb538ccad630a800a53c000000000017a914e1d68d1f160c37a5c534bbf4e06b5c1d221309478702473044022062276ba3d8c681aea18dd4e6d5d0e4783896e795b356f4bffd2358115ebe622702205b7863db012676d1bc7448aafd3f2e74578f07ff6856749ad15b626af410f3100121027f195b5d386178cc5449a52c31a001941c225a63afaba4bd35113b0888affeaf0247304402207704a8fcec1dd6fcc6127a04d7aa58a3a9a6473cfc24a0b0810d36544d4c18c60220596ca635e90935784e5fb2bad03d5057dc5ad4ad858c18ea5a540e21549a04cd012102c06a6cb775e65f1c99e7ad1d13b604d3df01554f787d529c658c41bfaafc5f5b02483045022100d5b25ec4799345cd24bf52854b7df16c0f009c492186996e30afbf4d0c34807402207ef3c794c997f354714d7707903e6a4d5b81ffb22965efb3a4fd49eadd8afe87012102c06a6cb775e65f1c99e7ad1d13b604d3df01554f787d529c658c41bfaafc5f5b00000000020000000001018832887a7f59dbff0de0b0f22b8eab1d78b3bd7a316ea808beb58e6f7c44f7215900000000ffffffff01deb21100000000001976a9149d295875c8d0ca68acb0fda07102c2f6a8db4edf88ac0247304402207a04ef6cc452a3035707447b309dd5aee0fabd0307d51f8feafabf83728aa20302200a4eeb7cbb1696aa23da51a7f7da344875d8713ff77e23e268f0d1dd666e74c5012103a0d8f43d26648c33e929085cf44afb19eb8898231dff8c71aaa6dee1e5516d8d0000000001000000040466d4980115c6c67b328516e4d0c3a2b9975e03613116c5bc77b16f6d7b353c01000000fc0047304402201c1599461c8649752a74ef155f78d79c534176308e791ba601995039711453a002205277350c41ccd0c6c907a1a8b290c1192c9bca93015cfa96ed6b760039927a57014730440220655ac4fa9c331721e78977ea34f21a97f77512840aa02aea1d709b82fdfd35ac02201cf52684d5d4b698bf7e9eb8787b2eae55fc46605403d03527ade581e48411c1014c695221023860b53ffbe77a101c81f9e45c9d99b78580bfbfd230428e9ae93c5a780e1f022103b4a4f0c915f05e2fac0d85ea038df9cd06791bec0cfa7ef2ebf1f70620774aef2102c89b1f2208abacb9729693a8ca6fd2c4c616dfdcbc4a463fa33d7d8ead1eab8353aeffffffff2c24566ac2275b425134ee750a9be3baa59d22b45d12dcf9ab9c30707582de7e01000000fdfd0000483045022100f5628aa752a6e23e9bb1ffba3ea26d2b2094a25d42c8ec7ab3b4f79542ad59a702204cfe7d7c501642c4e5d8d610baa017aaa02b858f3492b00b4d48f0c767649fa3014730440220458facfae1924f0ac6c6e6bd308d2df3e9294e7d1b32f0a98522f4f56e0be3bc022045d397e3d07182341d99d6f00859b8f4926f3c2a357f53ed12517dc69782785c014c695221034e3551be59f2d595a75b591672682e47042ae0976d671c6a6bc8545a2913993f21039b41591f1bcd8936881c186606593a7c2d445a4dcab133ffabafe1625935249a2102b46ac6e0d3c352096c2d03bac8a2cb3c1a519a2744715fe0e2733dc79cf4e42653aeffffffffba81e93f36c2cf3b1a389a00016ed9cba5910116533fbd6de4638704fbe89ce201000000fc0047304402205218339c6a8c1f0a696d0ff3cabadf7cdae892bded326fde45f39a432fe8d07b02206819d529a76cc2c6f716e1f8a9d911e5f268b40a976f21a1af0bef591494702c01473044022079702f40f90a1e277994a7a4eb2f58ea2b9741f1ae1ea5f45ff71d31f49cbf3e022034b479322bf98dfd3ca28c47590e530f71b064e793f1db8d742cc9af99641181014c695221025004ed1b9fe3654fa3d69a613aeb61796d8aadd524f7bd88f12efe255d02a4e42103d21747d071af77262e4ab64580f45017d0bce92c936784861e10d5ed52c95b22210310f6f665926ed2c94aea7e3f2a5affd3b08922c95aed9b7c2f45fb9a00439ec253aeffffffff00eeede39ee0612a6570f405d36c29a890560df49eff0922a29422ff7be8a5f701000000fc0047304402205edca5b7e730e83f15c9bb126f3dbc2d60c7a6319b23a6627f6a1f06324808cd022024a7693e9b3746e766a39376c78f277a1054c62d9762fa931eb54cbb221b41840147304402207d84acd1bc99477fad99814242ba2821ac683c80b39554cbbc58cc72ea0c30d9022043f902dcf9025728ae139be9953d3bb513e52ea0f6c4a9bec089de27b4b2b503014c695221030523599577ee5339df99fb20aea7d0d2bbd59021a09afb8dc8b42460f8c4483a21039e934fa72c4161f5d77cfdaa18d56f79d38acb981a801ea00c9a16e820dcd4732102ba4d88ce69f0a5db62cef1f5b195d96e39e488e42b0d84caf2edc7129f16d4f753aeffffffff01a1d2450000000000160014d38729a0ac4920498be5beb81e6509421862630048a00a00020000000001016b3d33e5d34682f142cf9cfe8aeec32a47ee30f93f56f13875cb90042ea6d8c80100000000fdffffff024882120000000000160014c215e1f8e30855271b4a0265685e2a10a681ed082229501a000000001600144e757f79b73ea2daafd78a7430f8db114b7d035302473044022012b8c94cdf8f7fde5c290ba3776099900fba12b60999223739bb0af4d900434b0220192973ed0685e5c90dda25e8db7ff6fef251b661c39a0af61e161b290c85988b0121025c17b4ae5a2944ec529c888ed81c49550ea6ec6d05d3c760d548b23ddee8dfa148a00a0002000000000101b56aed144d4678197cbbb1bd36dc8a2b2e1e676980f5357371e618986018f8040000000000ffffffff01d07c12000000000017a91402a2ed91454ace883ffba6ed0ac9e7ef48ae5aac87024730440220665a48cc0641ee32226d5e1dacbbeb9d7f9e389730e14cdb5d633aa1faf111c2022078c59166a3495571c00da24f08b860cbf81ec6b36da8cb1627801abfa3e3cf9d0121034170294248b817cc9606398f08840b2eecbf62b598efa1ef24017ac3ffe63b7d00000000010000000001018f6b0728177530d162c0c8eb5343ff392a0b9bc8c05c2876f677a998b32fb81901000000232200206c4c5b4caebca25770feb2473363969f66c968571cb1e95e48beb9597cd40665fdffffff024be4cd01000000001976a91423c70cd847f9ad1c25ca73f18b85c58f0af2f5af88aca36712360000000017a9149dd1b207c4b713e9c0b03529f690aa05157880ca87040048304502210082effaeed4b5909a736a334a01ddde36f90730ad11bdc2b9d6259bf6ba0752fc022013ecfd0020747ca64f434b295082dccf1c617a56514557bece6c6d01af934d2a0147304402200221c2769a1642312b20f46c7eb2319756f0a39657c80342a6af6872235f8a9a02201983a15e053b01940c419ca4aba8b12603c8ad02e7bfb7490f4e0783ff5a61c1018b522102e8c6dac8f6a4cb91ed438877bcd68578243be3a5f2007d4722fd883ebef2f5df21037e7b54aaf9ecc2e4b5b018e4baf98011b2fc097bb604a9416140f794d8661ed42103b50859377c3be5044ee8de17c748fac9c83ad9518c62354be0842d2cf1838c432103c038764055b486a84a916941e39adbe51d7c2ce5c5b74e14fd99f85c91cfdec054ae00000000020000000157a65314ced89d215f5703050e0d6d16b1848011bf62c53dd990130be9f6749d010000008a473044022063b521a9231345610eb24df064fa83bbeb661f4f3e1af80fc3455ef619f0b17102207cc3839a2687ab4e3e43a967739c707c6f63b463eebf3c1436232740827765a60141040675cb3563df262d6551e21c8fd5ce09bc5c2190c6c8376d788f4a2d4b32640901e5d78f190d62c812512a1b104a1a645aa8fd6934ddc4cec911036e36a1b789ffffffff02cc070000000000001976a9146c9ae0689eb19e8126a8f13365a47428ae39709d88ac9b5e0000000000001976a91445569d43a14bced1017f7a8d90c88cf2423fdb5388ac000000000200000001f6446b99ad9f86d9e8e6b4787cd034026aaf52a9b5c32cfd506596515fd6f722010000008a473044022075ebb72b13b0eb8cb7ec1137190220d796a632cf60ea2e47812f6fd34bae7ff8022049e1b41e2c599d6ded5e61dc63629b1ccf0365bd1781f622af344bec56950b9501410484a4bc9eb79a5600a745e404f7c8f89fbb29696ae6d9e41ff1e44bee98c707ea939da6b2e6655ab19c0f5d411bfa7745a9cd2aa8e1c80c12b74c7ce7460efe71ffffffff0205100000000000001976a914241092e379ea116bd196ae39e049ae5beb0ad80188ac90732600000000001976a9140458212ce86e22cfd3b59b2736bb5a885ad52d0688ac0000000001000000000101535c3145eb65fbadca590ad62b90200c442e1ea694f7389c68bae46b7f2ee8420100000017160014068eb6b7222f9a8b913ac595f194e68a517b2605efbeadde02208b3a060000000017a914fe19edee53ca8b0ac083da70475f2ab4591f9dea875e3065110000000017a914c08593a13c53a94e07a7519dde25e050e88e40828702473044022031134256f16dbf5167314a361ce2368c917a8eed178010582f5c5758fb1c14ab02202b605fc0a95f47e70179faa5611e492ff9f98c26b5cefc0f4ef3632b48fd135c012103b1f163f23e48d35c97ee415183c61213a31572afd12b0c04ce048884dcc7dc7c0000000002000000012314a340552eb09629c5d43f49f1517b85bf04427aa51a96d151bbcb9ff9afb6000000006a47304402202f1eb21e5602bfdea722946de06fa3a5fa54cede817878ca8c7d60987bb5e641022052c360453a16cc179c404d945738f6e29b55e6f803a5a9937bb2cff5600592cb012103cab6e09c0619fbd5ac5db1c05ccca1eb63c5b57fdbc01660badda7c6e5b71ca5ffffffff02b0ad0100000000001600143604725b67369d51efe9564ae918c14b3f64c8c21c1e0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001cc560de8c7799ea416717e6a9e33005565aaf38ff57f09a03b793062d00b3b66000000006a47304402206d709ddcee03b663e088e3296f712f52bc743484b484f2fcb524b0f78e76926b022072eeded39cd3b3787df93b5eb050609775060d4b0d0503ae1e56ccc07d0b1f9601210252ebea6cb8690084bcbe6f6c219fd7ca25f3d5b16c90fd90f32fc19d4eca2bdeffffffff0280380100000000001600143106d3df2bce4e245094294020d5f96402f32fd671100000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001301fbe2abd93222d93a689c5456424533ae8783306832aa6354ad03205c0757c000000006a473044022022982061596367e9dd91bd47b22a6005a6bfb8cfa6c959784511774eb4d6c83c022045908db9a4f2209c916eb79f268d3035f3d319c54c322b54ca6b52474848180f0121029881538769b3c4995035b998c7c5c7688316805a3a1e8d9ec839356e83377075ffffffff028fdf0000000000001600148ab6763f75927e7fe3a65aa48323dbd4b135d95ccb020000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000000010160dfc8d684070b91fe59a71df54d315e9233bd38fd7b48d38eb1caa56d218d8600000000000000000001a0b3470000000000160014eb60242d5ef0877365ded643c26f5436ca7c57800547304402202755c5d052e6deb626ad8f674b6bb622115b941485789b216725cc5581f4057b022026cfb7737a98730cc22ebc293788024378ff6b24d3fc7da18e5f822f865770a3012103c71d0bae841cb7e0e9ed05c38d3c4693636b53d38e9027ad350673bb1e600d0520b5c6b19c54d80d02cad7e7d510bcf2ad4c97c2d112edce36a16026746c9587390101616382012088a8209802528463fbc48019ff0228a19c8a4c987864bd1ccbb7da69c0827eb96be72d8876a914eb60242d5ef0877365ded643c26f5436ca7c57806704016a1d61b17576a914f76b0b4fa7bfcefeb5fe3afd7b9a9648ac0470956888ac000000000100000000010c59c671a48d4da705e1dce5b3389808cc1a888462a745dc9953a9d4a04484f8030000000023220020846f9e291eda64bd5fbce7516ea4799ad31a27b1d3552f6380b67e30e4df6959ffffffff80a258cb49fa27857e19d635deaf174b1c84c037157c8fa6137b4acc95644f080000000023220020d9837f722576d4651ec89c4c1b33a27e3f2f79452e11cce8cf0f99010d6be899ffffffff0b7a0847c9a6fa02eb7951147fd32a1b7d23cc2526099bbb81547541764dda210000000023220020f500e9987bbd53173e533b2f1a755d75ab51a60e295c82a969f18ffc663f6568ffffffff2d5d20a2aaaeb3988e676003c8e98348577ca01e867f7d16f82e52f050d41f220100000023220020ecac0d5987111e095e2d3286b99d7359ad6d3d09b86b0616693615d4fb5c529dffffffffa9366b0cccc4ae2ead90d56709f566b286600a8ebd1dbc327c52fa2277f5bc8300000000232200200c7be94f26ceeab39c00458533e80c9429b5886abd84cf35c77d738bb7f42417ffffffff18c0fd42dd336d1ef7834fe16b9d11536393da04ad57c2d6338d06cef97e54850a000000232200204f36af5ac3067cfabca1ad3969e098be6cf9439031e53f4c631a310837f00c40ffffffffd3dcdd3c440277cac6b0546a3b98b4f29811cf1fcf60bdd9b0b8e0f5077dfb9600000000232200203c409926069e7be16b02f07e9594aaecc5a074bd18b81f746c0907f2aabd5f85ffffffff71c3a5ae3dcc57cafb7dd0ea33760a665397f83773a7505b03e86ff0f4f7b39c0000000023220020f72e30059c6198d152e469c44aa4271dee9ab63aceaddfe02b67bb3234d30c01ffffffff5f565c91a36202b3e0a30daa02d7d386672eef9e810248c51ad4b5de04d5f3b30000000023220020df221b0a96935b064e1cb9934a5d696bdb9b027892ab66160df0573089248cd5ffffffffa659633a3a877a452ca69500d1b37a58af73a0fbd434d7f18a0fa8336548a1c500000000232200207bdfe39c970f38bf1bb5bae9de23d759f1277d82743aa204a958721866734f97ffffffff01aeb16ebf90b8d5b169712aaf68b8a8fa5a6cb654ca20f15f8879a81e167bd600000000232200206a8b09317c277aa952759b9ac1f30b2821c3e7feae0000713c8060d33101aea1ffffffff7ae083a10df62915dd61f6b764a2b76814aefe172e3f1a9a47364e67f7b697fc0100000023220020406ede1a66462e61948ac13878d001795efe1c15b9086e1540d69f90b9651313ffffffff03c926120000000000160014d11c13179ef7129c4d3a14e481ac819c431a7c0860e31600000000001976a9145d13d0b4604b5aae2b1090c2c69f8fdab5ea8d4c88ac6f3aa9000000000017a91441c028a1747f9040c39c06a2efbb849446622c9087040047304402207d3c46941d58624a8d2c7c5267a98b7b448241c4c76ece6e30906e53ed24dae80220678343190d550856a89e8c158c2b8e10cb146802b339630cfcdaded9722e9bdd01473044022072835be8726bce101a0bde45c93cbc8bf27d9ea14e8a28f4ffe245568d0e2b6502203b218fca405d66bc484ff4066b5377bf48990ffa913f20f573e769648c68b0c2016952210336163af49feaa9908bc30a56eae8031e7af3da16cfb4878a927966d433b7029a21024f6c1f33ae2734591ce0a07c4a3f58b8fbfb8d5c6b490e30e5eb6804236f23c62103ee0352324e36340e5a1e1afc74b2384b106d242bd5f953d42ff33383f8efba1f53ae04004730440220603a30cdd81476e9a7f01cb5173629321d50f5ba520097a4d30e63278cef604c022036daa5e226390d721f30c93d01b9756b24884dff6f067c2717d1bd2131573d0801473044022050ab4d40bc177c9fe875583508dd785565abdab816abb95e4ced240be723abd7022021448dffd82aacc94bf3b363b3fbab634290efbbe5df9d02f61bf8b8224487890169522102d840a95f6c24012be0dde96c5d68c8f7b2ca4e02b20da6f2871d4ffe9eb1ebaf210290d0a7f001ee8290c0a445ca0034fe0778920080fa3163957501886c685ab27d2103870f8d8a7bc19c5602e68f34d93e15533d8e03722e107ad27976d1658183ad6b53ae0400483045022100cdf6e0f7561cb135def0db74653dbcd11f6f80e8cfbd7018f543237927a6ebc202203bfc565289e6b245d955de9460f9430d51f221f70937486e6ade31e1293a1ea901473044022033cfd339c55eefc21da5e705546e97fcd3ab6a0a3e10b7c29c4d8515643bee7e022027f14bcbdda88a28bf41477f9652971cb5877895b106fc737c7aaabdb0c9b52d0169522103272da1049807dfacb38efbc34eace0f3ef3c9829c4a0c009af527654ace8f2592103e88fdd1676c178e719d7e82a39618d7c4df1243ded60dc3491d47333d5386f6c2102258ca34f4de8f103d3d1b0515dabca2eb0f041ac270919aa3cb1d35e0ef0678e53ae0400483045022100815d6915b32f98c8bdde8f77bd2f9618e3bbc3f19f5220272ac942c6715013dc02202e25418d6f6fe6ccd277a207d37388440fbcddb606e9d525dceaf9fa8dccc0180147304402205b9c189f9a25c9a1fea431368e8581493141ff9371aa1034d08caaef8c4ea8820220109e5a7e620b0fe5130f4f1768087cf6cd39e54b091ad4dd30448577a1719e7a016952210326a0560c6ab7809c848ebcd7aeeb30276c65e7d058366236f9479f09c27f173f2102728f73637f043dce43d8123031d1ded3d04ff934572dbdf905b364a9bf1ea16c210380e6ae66f484e34dfcf0b627c25a47b0f27ae06ee49ea9feb21d2f07bf7eaef653ae04004830450221009c8f781dd121157cc7e6a8c74de0b01ded61d40afcc782762517d7e3d134b42402204ec153562a5ea6c277afd4e27a831413af31e0793dc07ee05c889707dbb5f5b601473044022072002d7b1a4bed793dd85eedc177199446e44a1c98f2ee9ea59f61d9aecfa7f902205c050544402b7028dc81ce16e26433d9319bb3bce799e2ed0fb54bcaedd0d56701695221032f39b1e6d4062b736f2898acfe7127f649631b491da2f3cffdbe5feb9085665e21022a32eb47c9dc1b932b1664ad4d79976a90b37208eb4308b6c93f1efcd3e02e402102f96f6b4ca584e68fd83c7541ad9a229dec4fbdd81bd2ad59cd524986415d7ac453ae040047304402200edee0f466413f4dcfc2e425db5c163fdf129c7dfafadf9e2a1655b0d503af4f022069d027bdab3327e9626e79c47b4ed934992f597ece9e9be5f9508ad623713e030147304402201d663f5c152526393457176d98d1bdeafe31e81f1883f17a4313fe5cfa45341702203d3ed7b565b2e94a3240854840bd5f888862c1914d6d37746d8841ebac7475be01695221022e50a32541069dd0aeaa0dfa60ca2ef2255d9cd92c1d586f29f6acfd07600c062102eb8fc1d6f772b61bf01c6f6bfb10ab2251ad8f519399c597b88350dfdd37a200210382659bc3db2c2cb58834488c55bab4fbe83570873e1573a9396e4eff7bb8c20853ae0400473044022037895b1accfdfb89f9110de7fac3b2f543012c3cd38d7c87c89bdea3c594bf6e022016abbff02be468824ac3d14f13c6a546d32b7ba5b07a0d65115dc2afc8ea4b3d01473044022067604f0c5da9abfa2b7e17d95ba509ae021b38b589a232ecf6f9ef1805a201d1022047f6d3b1cf53b17c58f9c80270298d191778196de50924aea94a5438968bda7f01695221031dbd56e81c833dcbc9d0d18b2a3a3d1fc02961d949ca7e83ecbc62489bceb82221023b283c6f6a6241a2980a8a9e19676430b481f05ac167a190f42118ebed4e07a7210287786a6673252ab56b4cfb0972feab43e5de8d1ae384630069e7ea28e56641a153ae040047304402204262d9045b3b5a27502f02c6be6e8ac5334dc702d49b7082f71d89e1cef45e0402202330bdbb859fbc7bbadde2e5bbbda8c0ecf10dff616524675998b4a1a35092750147304402203f7a6273d2b24bdd9f538856857f5b263e44bdc419a3ec8173d2af4cc77acc5902202ba3cdc1ec874d457e2b5c92e42baad6967b07e56ee9ddc1e752cef762d779330169522103a19c253672a964ac247434986a38272a417145ede760192e4f7fb981ab4b8288210233afeee6c4c99da690471bc60aaac8e87113d2e8d44dce5912c92c6c92e65a80210283b437f8992a31cf85e924609e8ac291146fd8fe44968c1a1af67a171d00ee7f53ae0400483045022100c2914d7d7db59398007e28bc736865988e107c033ae8baf89c1871024cef5f7f02207ad1d86c07613010eeba61ff1e6d2ef92519be4976c50b5248fab8ccb261172a01473044022031c4af4053b6572ac3fa098a6cdfe4a8ac6b3cc4cdd6d60e9f11fbfa7e379e70022077556599346fe16443064b973467042cbf9edb89753c6d905494337f8757c84e01695221029627a228230bdbc14dfbf1432ac23c23900a65dc3323621130a43ca0205dd43821038c7ecbf68bd2e22f233d4697d5bf4de39e8b00605f6babbbe15c25483b5b0e6f2103a43162492d5906712558e01bf408ad4f79a7394105cf1bfaf808eb325ece5f4f53ae0400483045022100d435cf25da64975f9beedc16b987ccc47c29a7c1ddbfe865ec327c12e44bb05d02204b1161f5d5ab7a7bb6fa91554cc8da702027cb1153dee5c1406be955524b7409014730440220513fb1d5afada5fcf9e5482b26b88cf86194f047c77624f444113ed03461fa4e02206d948cfda0831c364ee8de69d3a12e121a9bc01c118db24ed6a8eba678e012ce01695221027d3e8820c730c405b876b412feee63545327e4ecca2e1c241c2b9d4a51c842d121033e28a1b8fcc2ded9867eb34af04b482ccdb5a7c6bdac20a54245be30a2a8ab4e21021f48c4219a6e44f7888b166469d6a0235db6ac289b724d9e85bbc17f027edf5d53ae0400473044022078613e5546f2b2d2cdbd022252e1653d6acf4b39432baebb79cc100adb0f4e9e02204d38baca0b759450aa7a6b623d49614e9ad086857cbd1daddc933c9b0fb557330147304402204c0749ad90f3976b9f9c6612552b85b360912883b07a41eb5c7fdd305b788b36022070f1d7bb61fef65f5df7f3de979140c6987c6bdbae172dc0ac238b4d821dea7801695221024379b40a0b358752ea316f85fd0cbc1567efcfdb88e76a6c289239b39a7af98421030bdbbca0c7946b9476e1b2cd1a5433fb9d034ac60535cc1126213405324d23cf2102f759f8bb204878f8f3591be03c2c943606a357a563929569d3d94fc6f8a2f88d53ae040047304402204cbb3502dae54b4a187c37904dbc8720d7e500e71df08eeb42fb2e16c45aea360220241a780aacee42f500096161f1d8414111282b02de721c70b4079c15dcc046b1014730440220425646d442b4e000b6bc98935b2c378ba4a8975632139a1c1bb813d2634a3216022028011f7966468a4933dc97af7f8c386ea84d62c769bf82ff023e082b2c889c810169522103379669a310706d29a49c6e6ac897627f65e1ff1a898678c55b73bd1d8d4c262521030a7762bf64192aee0994ca2c680a05cc61fb596697f3f1bac07bc024396305cc21020b5e3f92b64c7f066e5b8b33ab495f0261dbfda7c0ef42110dc013946bec2ed153ae48a00a000200000001307e3130c037a27703c7a745592ac88dcc7d03e47b27226102eaf5e135841724010000006b4830450221008a00aecf48636a4143e03e44b1fba81e92d16885a40ef122c5d49c856d591445022077d5db6f1bf67cdfbb2a5169914e310f194f80b91a97db4de64f57604b6df57f012103d52f2adbc30131dbcdbd43c188ae388964549561297e1e1aa88ef8eef708a26dffffffff026a580100000000001976a9144043f71dd7c858b5b1ded1a675f3f0c5a873555688ac5a500100000000001976a91474a843b96aaa0242e9180b2165c56dc1742cdddb88ac00000000010000000001019f73d1630873a58f1a305dbe754f081b08ce0065467e624e66456d5ea4dc734b0000000000ffffffff02100e000000000000160014c780d1520cbf1b22c915ddf678943a72fac65b08e82400000000000017a914f537c414e606b09dd777deafdcf4409c99d562868702483045022100b41d16f2b2899a1d504bf54d9e29acb0268cd09a24fc706320c584d7d84751e4022031664563c480a23ae8dd6189999878a830dca082dc2b393425cb311e18dac140012103afee7a6095cab9f35e123913b0624ef4ff701b89238e11125332ea7a3017888000000000020000000001096493a50cd92df1152d219c08efa81227eed20b53455bc17c412246d7b82cf08e36000000171600148705e7dbeedc408c1b3c9365b250591fc8d2074efdffffff9a67172bb59f76282c581bef6f19934912a58d424c49eff4d8829697190234dc0000000017160014819d64687e96b5ad20b48f9bb040119bb8e5d648fdffffff8237478ff1531d819ca1561867715b49ecdd6fe80ff7fef032ce77eb964ad4820a00000017160014be38462f022e61614c9b553ff18aedfb1e0baaa9fdffffffb03a6879c1e5a32556bd2ae4a39282b44e06e965e0e7e19b0617d9ebfcfee16a00000000171600140695efdf0d16e8a3fc27321d7fa3f29c2b7c4ed6fdffffff0049c254ec1f7d4bf8558f6c055d76955e7b7a164564aa6b4928ddd4b64d15da0300000017160014d632f4b8aaa561674e90375099ebe25c536a5d05fdffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a4800000017160014fe8a43b038a40e8d2ea20cd1e9e65ff1df936c91fdffffff5010b7b51bd400461d7c9a1b4cb43cb2bced5c7f65dfd18d32c7fadadf7e2de30200000000fdffffff818258d106a72afbc79588ac03371e58dea497419674bdc3d8abe7dbbdb1a5280000000017160014ea3ad34cb75cc4f3ca7d4891f839b534161eec74fdffffff466118b8570d0fa986e936875a938dc40e50359fc5011caa58f75b2d837f4ded0100000017160014b38dca9f79d1a0ed24a0970dfa963d558012f0a5fdffffff03a07bc901000000001976a914cdff017214cca8fa36cb98c25b57d7b167f793e088ac0ac81600000000001600144a9d276b645a0808d4eb81c086ad74a2039068e6658713000000000017a914c13559c674a3d6fd6f4810e9e14438387da4e9218702473044022053651b6c0d244797f3873ef1f64b94458ef16e56762abbffb502e13ce15b4d7802201e09434815b6df307a62aa0102b206f4e4848ca3d97aa89ac058a8cacf087535012102a778c02e0a471a1a970de7bc19e158a8a74a4b2ccdc09572e40daedb12a8a4920247304402206dfcc1a0b1e753f7395e0ec78f8ce33a7819fc02011f8363d3876f5793a6eb8e02206772a6ad32b24da14f3646aea9affca9f3a396ee1c2cd1f815a949502a8077690121023b0db1a27864daef196008d07b6a06dd85f7c4010d4465f857d2c64d9c7503610247304402200ede11e78c7d1694b832b4b4053e7434f00d38266b2d68ec4634ede0a78816b902203b4157bfd3b06735cffcf957d096915329ecd973e30edde4ef01b6b262f1f71c0121031f02523dbdedf555a701ad499389fa417deb8646a1088f5fad3f969ba2c1e21c0247304402204fe8bbc697133accc1c51082e10a125fe9b07e35f0e2a04e54d761a14091874e022035a79a0787d8171dbf21960154bb163541b501f0c5ef4045ac433cedce3af4ba012103eefa28a7c11c25c71b5408f62a03602ee68b25aecde180578ff72b7fb000b6eb0247304402201774ae8381a18064c79a877235f229336cc96a45b984ee0c104b87347c00bd3902200e403d3fe586ec7e795f2b7607e1a006156617839d5ca4cc8b63522d9b4a349301210377fb65441049a730755c9c2c775422588795779e5cbb5fff2722b5825091ed720247304402200f7c9fec93632b42f6597a24610d03d795c7b05c12098eaca91a390df9533a07022005f4ac63b770dd37fc6aa9c2780e83d56b92c055260a0c096eb158b4eb97aebd012102e7c3a85a8e296dd14d51c9a2be9bf49cced6e1ec5917b76ecf157e082a1f32e30247304402207bf2f685c2f61299c699f39a9f2fd045a899db17182859e50fed1785bf0c310802201c9e670799d0c6878b1088f3c82813e6d37711a5f51c533aaef4036cb466908f0121038d5a9d7705b6224ed3a74cda77f485f3b0c41371d2affa7e8a1a59f361d450db024730440220533bf02d5860da1be3a28a9d899ad75b2d223fdc4bd0aacbaa3625618dfb2a3d0220617e0c724e913a50dc7fbd3fefecec10a52323cb4b6f54347642ba741fbbd05c0121025f8261f96a4a4ce21bd989f18579ad9cdef30e5df7501bf19c8eb4aa3eb148460247304402201017ea2934306d4eaeeefe8651bcf0981bfb49c9f1a4b7167de2d452c2ce6ce60220595cb8f23ade144cc7e08ff7ce440e01126d9c82ac3cf3b38104bee4deca6c6d0121021147a0653978a461e197edf09c94a67694ddef85d6d5198b79e19d7615df201a43a00a00010000000001014d46e1d6861d67b9265676ccfca8f8f97be1e08046af93a544c1a343aef76c1a0100000000ffffffff028654010000000000160014c3ec13d9bcffc63d8b991f58862d9133070a54bf806d15000000000016001435d3f1ccaa90696cab703f2fea7107a8d980dda50247304402204f680336a43ee2d4c68f5daea8628af143bde20cb0274a6f76d544fe69cdefe102204033b5d5b2c67f813eb7f585dd2596c7cd788f474e856666bd4fec34b5fe8bd80121039dab68c790b4a373bbe854830898f2a196846b01c82d3751d388762fa28152180000000002000000000105155d9d58a9df2a06af2cb120ea7b3d4cc4b87244548f107c10b0544485b2229d0000000017160014db98a9df909b2154c0316401c466e5b63727c22ffefffffffae09dcc703fb03ffc0de6ddeb13d311c22b8b0b715e6c8ea04adddffc6d76dc0000000017160014894651b3a70040412374b5b6519aaac0eb302d95feffffffad2b5e15895597c9ba75d7596306054ebf2db901b4b6b41e7951d3a3a7f5c193000000001716001428605b184986e715b3aa997002cf01fa9f9b8594feffffffa456d2867961136cb699ce7c8eac879f9fb305b15169f134b45e33e271bc70950000000017160014af7f2d21f07b16b82c5daf8de93205ce2fbf27eefeffffffcf6317cc59736cac77306f7de907273ec3e99667e85b8d5b8c52707d3132785200000000171600141c1e35e3dacffc2b60cdaaf6647d8609c027cb18feffffff01d9ad20000000000017a9142f2797394910dbe0c8350e7b562930774aac5217870247304402200b325ace9227c0a8adb08fec68ffd48076f4303f6932f482661a40b109f70bc9022019f0f7f682ea7607e631b5c7cda1e056bfc77d4c4edc1ac06c13bf708f8493f0012103eca9a710f88bd232135c945545cc72603326b0dd30336ae6e9791381da7cd4d3024730440220772e2aebd1f5f5cb48247014deb13c9111ad0f217cf97832a810f10b2ce1078f02200bc9a9f91784d029539d674ae49bfb691218ad2087a778ad2b7cc9a87ed4673d012103625bc9ebfdf7e0f9fcac0f0add4c01bd266bcfbc089e8b414c7c7366a285aaa702473044022072d1d6f909acb17ed0bc177f245cbb6040658d4c46eb68d3fbb538f601031f0402202c7e15e876b42e911b1dbe6a9d7e0703dfc890ae4031c11d2a4ef8ac62bea683012103232769cc9b84f02828195438a8091b5887f73d5036388fe916388e6a152c34fe02473044022037472f557413b51b83da4f52b155cc48917571d2051512b7c95982d2d8ab4a5502201ba9a35e1710b0bf4fd3f4dda6929f867ce1cb2f477cd8afe81dbf0587c60a22012102c6c09adee2d5bc793ab7144c04f5f773f493437d5ea3b102e2a3fd8a64dc20b60247304402202b0e24702f01acdb45763bcb9fa55d0725d69e72f74dc25c4064be67f5ea84ef022048443810897fda57a6a9453ffcf870fac8bfd04d4c1b21b91c338ffa7d4fa5a1012102e691bcacf541a0ab846eb6edb5f367fe8b20e459c2fa2d5593c1a41d4d1aa60148a00a0001000000000101b0e242de122280ea50f7b83195e2a4c84ba8a3ee654a8eb3b2534a27b156f6570100000000ffffffff0280971f000000000016001427efe225c091675dfcf70439aaa579fed5e379d8bee605000000000017a914e842928007b63c19c80d74aa4a7f90ef5a6bf31e8702483045022100de75b888fe55ae96cecd65bc13a2e9bc6c4175d6e25317549f8450e3667fd33a022017fc799611dc90b96e41cfdb80cd0275ca119f38adeb35e9a819fe5046282ad901210249f9854d929baf6db25829cca287a2aa03e4060cab809167df41ac17b1733e8900000000010000000001013587cdec68220cbe52e4f48ce85e12fe2fdc4ca4bcb35390332f2665646712780000000000ffffffff022433030000000000160014f89d7400fb31e9260f1a33f73a20e34508c5868b16ee00000000000017a914c001b3970bd626458e0811a2cf60c1c804395f0e870247304402207949225c0b7aed56bdb0d01f402aff19bc507bf8cc175b5607ecb9096796fa51022018a5014f65af10d65103ea7f03740895bfc5f13d32092f6c38ac447faa85b4c401210387c6b53fde6a85c594625a3fa8947c5363dbc0c132172c88804ffcc75ddc1e04000000000100000000010243e5c7c92c1ab9c5596182a8854005d5ceddf6372be9b54f62d7e2c694bab4c10000000000ffffffff6ad59c856765521a02327e130cd5be6fd401cb4fbf66630535883ada205a7ee8110000006a47304402200c3594a8fe3a717f57bcfd3848b678bccf245009089e27e061008cc3c5ac40da022047748e6d15280d64bea5cbd04936e5d0d465a235842d99a16c9f0587d31816c9012103987f28ea43cbd8ae08fd35d7bd2b3117df6cf1d875bb4c4c74878a3a7ec3bdbfffffffff02b0f905000000000016001492e9861aaba866c6dacc643bc732ebb82d5566004eac00000000000017a9141b709aa250f20ea78ff31566021c58f59eb61b2f87024730440220074bde0d8e4a634d1f5eff5e7d0be60193aee6d8392409f976f3b45a9fd559c5022016f7504989e530f78192a51e81e7e70e21f70c7495636264e99523872734d6b7012103910eb75b19921034dbe3c720885e7638db65da7faaa9330fd3201d386bd91308000000000001000000000101aa485f9fc1f556c502d1005f5190dab0d76391628db516edf78a75b9f29bc6160000000000ffffffff029f2d0100000000001976a914e4aca1ef1571fe701deacbf30f34c54446a1d06688ac38c8040000000000160014c1b007464ba95a159f0c40294c5a539296e77700024830450221009545127a0d8f9747ce54619d4519578cd95574379fb28eef113f084075949cfa0220048e741cac0a63b3ce313bf98568e9fb25f1500b48df02e3f85fde43248fa650012103adedfa80f9e3f7fb517c606d934e45360c6b8e9e70f495a5bdca45e88175e9270000000001000000000101f55b438571f474ba232f20b5e69daaf41aa83bb39f8df96728ec66f5e29092bf0100000000ffffffff02fc6601000000000016001495e1723387fe03fe2a8327ec2fa75d55a232123c915d03000000000017a9148a5fefa6b3847f09f0933f422fa1a82c75f0907d870247304402203a26308a3e14dfb58f757657bd6231f2d6a78e82ca68898cd36937f37a1910dc02201d66cc34cdc45d16f2b7fe73941b4f781b7ca071ec74747af2d2df332dff96260121030f95853bb9af8974aa074ccfd7fca3f365fe2724a47bc936b5ef4e01c91bd29a0000000001000000000101ba1d85d16afc32922323f54e8ce40d12bc3a9a1662b2a664b0eefeec50d51e0d0000000000ffffffff02d0b6000000000000160014c57f23a6c17ddc0b2d095dd0d402f470e9e11a094cac00000000000017a914673f53583868ba05fb1e001ae24d2daf1613df0a870247304402206fdb8d272d7dcf8cd47881df1729ef33d136091f6702c0448a92afdbeb1ac0d002206d7112f13e51279907caf33c2ad2f9a167b9563abe5fdd79b165faa0a3f08ab3012103f9364701dfbed8c5c033166c6a6e9682ca860fb11719e9a6b955a1fc66bcb5bd00000000020000000181791259ec826b77b4f4e48569b3d7bd3f16aec22fc2bd8b45d6e97fa49b3666070000006a473044022062624e91eed387c3abbe59aa04987382b3587d054d20b50e201a8386f179d65b022030461a5e1db0be8ac8f522b8f8c5082b3034161f8296d7dfb12fde644c2a3645012103652315d9d5c614bb623fdcaae7a4fc16a2386670b71bd060e52919fe03cfb17bffffffff028c1c99000000000017a914a5eb64849a076fd50e4c74cb067bb953bf06ed3c87fefaac02000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000011eda41ba9d8aa27622dceebf93aeb87d869e14de8c72f9802cb886e0d6309378010000006a47304402203ad5c05bb7cb0a2254ecc74431d43873b96220b9bb89e23c601d9d552a4cc7df022014a2fc326984a29f586d572219e8ffb61f91fb9fc4a320c376f5e04fe6bab817012102302b56d06cfbf165e37e023865eade534448d28c6ffe6a2faa7c1519050eb89dffffffff02d85301000000000017a914b35aad13ba9184b56b78a12b2930b74b5cb67b3a876d190000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001c96510c1aac106686a0c9c2393257a5cb5f49406b010d177f7e60a76b08b1fa6010000006a47304402203efd6e5f14607b227e19b807177fc01dd9ce2ef0016de2d2c90bc234081c54ee0220247e28bba34c1eb82791d99fcd340a99fc9f2745e2998753ad2d59176e6a622f01210255cfae3d325652ab75861b63f329908f3d85efd8e070b67f83ea411b6ed399f6ffffffff02b0ad01000000000017a914fa08be5ed8dcf22a4a60ec8597249ff82c62c09387880e0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001b1c8b92e6cb2d29ba609fccabd1d15b231e881ad2d24ab32d4ae2d66d484efaf010000006a4730440220177dcab9f4b322a6ad885e73a3b88c922753c1c6cc4d304efcd573e19d73ae52022048bac9e9237a26fa0e224c31a7dbd24b209a366a62277317e6fa892028c22173012102894394e5ea85f1c8290b6ac62753bd5091a43edc1bc441899b9406d2ee535091ffffffff028c5503000000000017a914fd2805888e1fd0a176d7186d9af874b0727fcf1587800b0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000001000000000102ff2bbb4d35126d6f3bc93d52108fd7217bc4f935a49649bd3bc3c82b306ebd730000000000ffffffff304e2ca41f6b9c91eda05544bb5d0e8972f6a12d85371d69fc663c72fdd2f7fa0000000000ffffffff029c080000000000001600143fad646cb8b41f95c749b7b8771a286434671ad9f81100000000000016001440b1664e8d859481488bacabf25643b21664842d0247304402207d1c1560b454b1c65d0959c8930998f2c457ba855760f972d18c706522310915022007540bc7c21c229579642637812cffe840a1e709bc56d35efd7f57a5d32692d40121035da22331110fcea6495e8416d16aa989138b0887a58223b69b7d69446b062bc402483045022100d3240fe654ae2019e03544552df706089fe3af7fa3ae66ca7826f313c5ca87200220268f3f7b8a5cfa1f62320722fb62d4aa9c1e23da8f3edec633b1bf8ca56f1e69012103d337d69bf9c228ce64a0d1ef2678e7b6ef501c2b6b871be1e95d5aab4f9cb875000000000200000000010189b4795dc188c2e492c694a8dd99f98be6360c96583e21c341b5ea79be3271260100000017160014b38f1461633a9ff97a42b579d4782a8f34e86659fdffffff0270290f00000000001976a914efaafd399104ebd506985e715fbebb958dfbccff88acc74deb090000000017a91477c255f0bff6aaf692cd44d7703088fd9e62fbb6870247304402201709331fae03b5c5b988d0fa9172444d614d540b10ffb0ba701c3c71453881ff02206eea505ae02945829011502b79b9e0cc938a05995b44ce5cd974864ff228f26e012102d1abbab06832837a346cc83764c79a500f1ed68a53f5c4f64a57474989965ac700000000010000000001016997cf6c0d52a24e33d6bf9a690ded369c1fee36d3c730ede34390c6c8ad93960b00000000ffffffff02ce2e0100000000001976a914e813aba5832887a2cf3c6aa0f5e13467c960d03c88ac37173900000000002200201603bb92a1b8ee5c6c058c7d56fbb41789eab0896b273b4111a43e1d5b8d46d3040047304402202b26bfde0320cf168aa8548bb3a00220c2b333a787502eca0e217706cb15394902204b17aa62fb539b1cb7482fe16538ca68d1322d1467b0e6685cd0b0b2a6d9efd30147304402204db70536279c508cb7bacaf55e23c8c1f356f1aaf05bfbbbbf141bcfc29cab3502206374a5ac8d370cfa9f71285b6ca854c7b5f9f7d0b1553a4e9c187bde680ff62f01695221021e8a11ac5283f98c0fa61ebec7d7fd949a89f6eb3e47503716be10a12bc301fe21026cf4288ebed3e082e0985a970bf4574f620617a9287ab91c57befd43a0315398210337fda1ad2acff7015ece927ab34fbe6bdf7ccf7bb336672da0062c4c5c9c6fe053ae47a00a000100000000010366b043d1a03e07404291bca08808e70c8e9e91a3c1200d30eb55b1eb2dbc6bcd12000000232200207ea842690ca2ead0d1bef006858223c3438fca85dabad967fecc93966cced8d0ffffffff234ccbe7e038c3bbd516c5f394da76c1c11143e87664e23614a4482a69a919e70000000023220020c146d902d78d87bbe92a90ef46cf789f97f72bfe90985c92ae4f8fdbe099ba24ffffffff288cf5a27eb4f8ac95d1f72f70b4cf52b0b05c5dfaae23e91e49c6c604b3b2c218000000fc004730440220290427aed6e53cc5273e633cc3c33538dc838747ca14af15fe04a791b60a2196022041cd8063065cbe98d8d55308ebe663cfd558dfe774ae52c48e9bd4f402d6c9f601473044022004ece3bad29d180ebe2d3166ee8dba674df99821c8a19933a47a0f7788a67bd90220304eb3cb30470b7c12061a808ee28ad81851c6698cfecf4e1274bd1e9caecada014c695221034064875fe36bceb6a9071c090ee29ad2a4c79822afdfbb8435b96afbec036f6e210313f2b36b55c1e7cbae75e591bb67490a4a54f241356d90b34895b4b89a7fa4382102b53318d8d3795d995d263ea8cf38f75b7bc4af58649efdd74203c81fd6a3cfa953aeffffffff0432b200000000000017a914c6f3faad30ac25b5278b994fe458a55c29599b3a8788900000000000001976a9149c69b81ced9891320d7c11bfaadc7ddb5a536d6a88ace25e00000000000017a914fd8974dd84d4bc0e4f62b82ca8d4e831b4cb204c87eee60300000000001976a91489ca5f513a7c05e52320d912ff7c7240489d142988ac0400483045022100d4d81a90af2c484855141616de873876cd083dafc828346028303822116b40980220530a3ff007265acf822ba47a737d23eeacac637284e080b285810271df8379a901473044022073d24b9169d32a3b92bc59981f45e1b92164913617a14bfa429a018a37a16834022000ac6592c480074d87302dddec5a2cb6f89e1b50d6f60a1149aa69107d012f6401695221030ff3730fac2aadd53c537ac10e0aea13fa9c12e6ae6478b9c282b4a19a6d5d7221026504a3bb4e661f5d5eb18b91bd05c3773ad026fe7a1831398c6a649dcaf7f8582102bcc09102bf0e6ee32d2e63d376fe6b45fa49996668793675f10c54e690f4559753ae0400483045022100859802a0a8a96d6b674bb9d54406d42c706eb2d5a83c7eeb345c76c90851abe402203ba6da56dd4c8d0db9c17dd62f984bf04bd3655fb71e63945390aeb909e8068f01473044022014aeec1466435c361d248bd310ce471d49d225107f0fdeb5213af4f9ad83aaad0220128fa4e630d6d4486c2f23c4b24818af7af20549431f217e032ea76a74e1f3a60169522102b945fb24b450ead3b05dcd9a1f228b1089b6408340af83b749522ded429dfa87210361093d705466e92a2e81926055637479158e4f706c8cac3c0eae4e738c10f77f2102a7f5b8f752df9aee83cbaf455e81cde457dc4326c18ce6ac09a4c6313b90639153ae000000000001000000010ad125bea83c9b4ef99dd56352d1cd8f620502ec7518b1ecc13ced2142efda65030000006a473044022047406f9bc2a91ea04368b4e4296d423762149887e40e80df527129a74186169f02201d6f2db27f10cb8415061f482af667eac23e81efed08b8bd30d8fb2854262f560121028d254e09b9d37d1dc6141e4c242ce300b6d5bd0510c0173e1cb5a7b9d4fb6ad6ffffffff0164df0300000000001976a9144411e188972262754dcdb3acb2cb87e0829dd85c88ac0000000001000000000101149cf920672add1430f8d9512b7e70b1eec0460d7603dee4a8fb09def6253a6e0b00000000ffffffff2e7bae0100000000001976a91487e5b86088953ad6f11a874004b32534d10c354b88acb0ad01000000000017a914a751dedaf04c99104ba1b38659d7dff23e6c2ffc87c14d0f00000000001976a91455c887df1e03bcdc0917547c1cd30136210f912e88ac91e309000000000017a914a8ed38beac2b65b187e882e5c653dd986ef2bf7587c2e410000000000017a9145823ed0d7454204b94bf927ab83cb3ec1b743da487bd330000000000001976a914f22673232c50f30ef4e17bce557a1e10d94d5b2b88ac31ac0000000000001976a9144fea9d18eebfc5c9e68919d38aa75ca26cc79a0788ac445b01000000000017a914c2bd19ccee26ba6f3a2bba786d103eb8bd2a780887578100000000000017a914acfec294ef497a83145ae39f37867116809f216287b80d1e000000000017a91459d543dd3c655adbf2b3aa3b7d8bcc5a53f9360887eea600000000000017a9148f2c471e2c544b0a1fc5fb048e6474dce7bc92f287ab4701000000000017a9148dfc7dffebf1bd541cfea82635b36ad706b8b30387495e03000000000017a9143471ebfac03d0aa418673c6bc8c43ac57346adac87542d0100000000001976a914e3375f8081b884b005f612b663896283002e6d5288ac89bc0100000000001976a9140fddf52da27c2ba941c35339cff66511754e75c688ac42da010000000000160014af667c6f73842ac181b46c587eb839f5ace39449344e0c00000000001976a91438d1714ece7410ae6cb6286f6abffaf05fbd450c88ac90861200000000001976a9149540e61e7a7dc6a64081393bbd4e6e26a6ad4e1988ac1e5600000000000017a914e85190873bc59e9546d9b6aeeb7c16577032accd878b02080000000000160014d59b4e18e119bcbb5b160060508f094432fd37e1533c0400000000001976a91451fa78cc3730a003792ad4b94caa233c21c939e188ac6cf92000000000001976a91416d468200e3c1c0475c223bee3a69722c6aa464c88ac029a08000000000017a91403b9a89aeb94045fd4aea755d120b04f86fbff9587e50255000000000017a914ae4b6b9838366ce693850fa880af12b4178ff01587ece901000000000017a914dcd3984af7c33564c5a6cff7a8a797c8a436a2fe8771ac00000000000017a914f8459b304ed93c4e5d9f13f37beaa5575eb85b148740c5030000000000160014bad7253337b7e7ae5e3501bcdb035b2eae6bcc1c5bc701000000000017a914db8fbdc1d97383857ff23970a947602d5c8b665187ac6803000000000017a9142bb1b71d7c7722b362008e0118d776cd2bfce17a87c32a00000000000017a91446234624bb66fb59808d61bb33542c678f14bfdd879968200000000000160014dda973b9acf85fe3e5d39157ce2668e709e7aba13fcd0000000000002200202b8d5554ca8305040df361b83cefd090b2059ea200fda04b40a281255da861e899ac1000000000001600149348435d56fae2f0bf9bb86962a4cbab677e993b4daf000000000000160014cd841c53d11bc1b4265eac8088e423d3eca5f9006cd71000000000001976a914ad9422cd8a905da4744ba1e64d9df18e63fbe1a088aca747030000000000160014357e5c4471533487bdbadd3db1ffb2915d68a6dbbc2c2000000000001976a914a527dff26c83b875d3a020a404c35b7d9e5e716988ac495e0300000000001976a914df48f8925b797928b73bcc85d008cf895aa206ed88ac893302000000000017a91466ee143f44cb610d9263d976a78c9f8d02b36fbb87f89203000000000017a914c2b8770e8dfd03f32c7c3523dffb192cd8cc3b1387d5b919000000000017a9140e18abc82dced9bac790e32184b12826ad143201874a5600000000000017a914e6b739022ebb083105a680fdc3295d78f9e933e08737eb5f2e0000000016001439b0a08166b7a9f6a0a90af32e36f46b8f80dc28449b01000000000017a914b3d9919da2bdd7d593435dfbc88fd0603abfc1f98700ed310100000000160014d8d53e474690699708ae82bbc4afa2f492eb2372ed4c00000000000017a914fae42ad99df051440792b0dbbaa65380a460ab528702483045022100f93a2b9f445727c50a95c2bb9a9f07a9b9a1afaa6390077da6f4dc88887f41ba02203dbcf7992a0d326a271de1fee4b096658253ac5670b4b3c8141172b2a49f34b301210271c48bf025344076b7925fd86bcfd5a65bef3f48ea0009801e804f28acb1cf6b0000000001000000010d6cba687de3f267f85dfc4ce6d5b2a31b5e8f212052b88eab1832d55136621a100000006a47304402205b3fde1a149ffe79783300d3067625998217bffe38e7ebff84f89d3086b3b81d02204faa251c2cd3ddc5b0d48d48fd0143374cd3ea7b24b8242ffc7d2f3e1c3d5a9e0121027eb191031f1b28a8a17d50cd1f981424e5792a8be8c4ed8d6b87715e9a0c32f0ffffffff0188480c000000000017a9146ecb1b29efda871eded9dc1c6b3ef7d6740e52bd870000000002000000012c4cc4242bb01f844b46ac5890c889f5fed6598d6a05dc4ebb1b01d5ec3533f30a0000006b483045022100dc4fabc20e8e119ad83cdd7fcfdb506362977dcb1a15f66cc8822914fabfa474022039fede7bc36f3c6262b82886c7bd7b07044520b25cd1c8ab87b782cbab3f33ba0121036ceb0f22fbeae8f9afb1bb9e96f7ad8e587c51211b12108f2e9e00f5385e8972ffffffff0101ffa500000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac00000000020000000190cf2b80f8e95bbe0ab755ebc9a036e04105248c4f0f36d1981cadeb8b305aa9010000006b483045022100e4bd0bd763e45a98eb4fc9fd3ad6649452a3b27598bab9325a0ca966723ad4d002200a6fdf80546d36c0d30d05a3232b0560f692b92320df0be6f37ecc5b7816ad870121020bed532d79c840a3451477379edb2a935161a96ce49129f9d0083e58ee0fbcc4ffffffff0101043d00000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac000000000200000001eea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be414d0000006b483045022100bb04e72dadca4a385980881f15efae0c0b142f00e290211c75bc50a7cb4b41570220335a91059a8545274b17bb42d946efb568257a7b54e5e593969a756450e53107012102f7d4414ae40226362b15681d02aded75586d18d21bcdfe3abd977b833e94e8e3ffffffff01c2823a00000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac000000000200000001e19096d743454269c733b5ac5fae23f94949ff5cff2599cfe6f6dc9f05bcc7b4000000006b483045022100ae76f56c901b7bfcd887e8a472af8b830b3c60f0c24c5c6a693292548c61833902201091864a5cd43aabb0bfbbbfe13fed06f0c4d04d871bffaf0030a434ee5df426012103fd7f43a80388cc5572fdebec88e97ed3edc7709ce50802a5881a6f826e7b0a2fffffffff01c93b2203000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac00000000020000000001020b604f1644831926ba35642f6f5344a51eb98848c3d1ee244dd1be9f92269fb3160000001716001487979bd183edbaf7f450d204677f9174ceb5d6f4fdffffff7738193923ba42fafd17fb4f986faa0719e9ad8fb3ee0837a3a24a29bcb334c30100000000fdffffff0241d6b500000000001976a914d5547a9a6206f711495fad89d72f59feefc4588288acb86c22000000000016001404af0b93fd5bfd9ec35ea00b5c61f0c442394d3c02473044022028891d83556e156edbc67781dc5c3c595fbf2723fb3232268471b060c936c99802203a4d38e70ba0cb46a98cf7c7d4469cd8e555068617449d85dfc1c6459e77561c0121026b6b2645d882bab4762f4616ae25092905ebb416bc081c185cb0557ce6f56c8902483045022100fdeb19e4f7586b2c4dcb37b7853d7d9f9ebde27fbd71a5de60774ec6ef9f9ec802202b4498a7d9dde1ec27eb2f7d873143c1f4aa61d15c8928b4a33515d81cffd1d70121030ede538e2fe2de3da58ff421e99d4675e44bf3eecbe8c80a1c8bed1fae59757100000000020000000001047797f8e61d1a174c8d0bc8b111df28f656ff710fb1a6ca9e60f228909d327d86010000001716001457d218846c6caac649a3217d604cf6fafeada08bffffffff8076211da9103c32d936706365f6058451791b11a38dd1775557fd0e9ae7dc75010000001716001485934a49f438c750dbf9014696589c4e10588511ffffffff72157e17f593574805622c24c813278a777bfc228d3f69573273f86414fcf26e010000001716001491f60f654cd1d24fe38bf75e508c6417acca2fa8ffffffffd0576258002844671264730287300292dc9a334c93493229eb7970e36cf13aab0d0000001716001485934a49f438c750dbf9014696589c4e10588511ffffffff02a0a910000000000017a91450e2b49be3eaa338658a7a9f059db82dae3764e787509800000000000017a91439a08dffde67a1d7e6dc51b09711da23576d2fc887024730440220619eae8741d532d7a3422f47513e0fc539b317af9f074b4b78199a997da4bc2f02205cae09c3fa299590b297ba56ca4a1d096ae306c204530e409b84e9fcb8ac76970121023d607f37dc9b8fdfd2d70846431f05b098b0f858377ee96b7f5d5ea4cd7c25f50247304402203191c6d9b4cdbece38c5d355ac8e17320aa1bd2ed3bbc340a1470c901e4f18a0022024abbba4e3172efa3a36a49ea56a45ad70f7567135ee03096f4f7d85539a9b98012102477d607ea88b01c2c3e2d709c745b4c8c18889eeb38f83c4ac1884a88bd659ce02483045022100ac7ae13179fbda25c242448fadb0ee465bf79a43074aef288257d1f39111551c0220435ef92b302a1e2449bdb36169d3d4d5f2ce62fda2ca49c0dd951991fe7b7b4301210355c0ac667f4637881cade11ef45c381492faaf2f13dd6b26818e40a72a06222c02483045022100f53aed2056a9dc0cb4294d04836a244a2df6988d8f43d4adff2669e5eba23e25022028f8a080aa06466a01670c246d6acad559d73c7dab32acda2140c102331975aa012102477d607ea88b01c2c3e2d709c745b4c8c18889eeb38f83c4ac1884a88bd659ce0000000002000000000102f5c8ec9b41d57cfe42000f1267e2c7849c242221e5101547c85697ba3cf0314828000000171600144d797492413da145adf45365d51e76f91192fbabfdffffffbc9e1c75b6ccb86a9a895296e984de11f1ec58eaf8ecf43c0f8f67555d5478b00000000017160014c37bebf3af25c3097bd18db3a1fe56cf5b9b7a0dfdffffff034c6443000000000017a914cf46019832362f03224e98890f6e8db304c516ba87bce360000000000017a91411db5dc2e21b8f31c73f8d06b3c55a760cb67243870cb321000000000017a9145e0857faefd797380c228f61feac589737119f01870247304402203c7540cf3c747d715b7ab4683040dab435a5420d96e89c9f903d2d93da89b64702202b90518242413818f4bbb93831dae382f1d92ae6236050ac666409c3f9346aa3012103c06f1a269cce5118a7cc403ebe4d160042c4a9d73fc643a714960372e1dd6c3e0247304402200c2d14b11a9b82fd50db6849ee3f2aedb3dc5e6399478ef4be9c3cd904ce030d022016d7abe0120113b4b031c9939cfb28592d68694d8d1a54e4db3fe80452458fc2012103ab20345840abab226e023f5d63f095df230fd3474f3a97f648600f29138ab55600000000010000000001011db08a41b8d41ae2d53cdbc5837c0531fcfc5c17f9530516bff951aab37a21eb0100000000ffffffff020bbc06000000000017a914d4ba73583e4d6b0a9e6610d8db3ac2d3f77ae14387309d0a0000000000160014e1b3a24944d30a66cfbf14b471b335b2d871a65a02483045022100e860c6b119d9ffc0f91a6fc3a3ca1df4b233ca30df53439aea58d3f0dc5dd79e0220744000d6b92acb32da4a48d694c4f394ddac68c56946c72878e5248f0fd5afb5012103b2d195b05508ea07de6cb6a5429e73ee3ec510df103f6334c470f571225e83e3000000000100000000010136ffc5ec774294737afbe8e4335b921b803815251958e3b4c710a29cce606f890100000017160014d9da439f13ec6e2f3ef1373cb7e5144423421c54ffffffff031a4479000000000017a9149d524e6aa6d22b611f47d9a6feed28284d729cd38770360100000000002200200f9bbbd1b649e5eab7525095681449afba2cbdce70941fe4fcb09da499298737aaa413000000000017a914d7f1609034d28818991ffa960d149bd4f6400f7b8702473044022033c7ad81970f1bd3e835e220fb88612749f27322b21825aa700cda16c3a159be022003db4d12d01a02ad4ba85f7ba0e56ca78f685a25e79a934b03337afda0dbe2500121033c7a82aae6ded86ddcd8e10f3e763c5d5b40a817de867f5baf5be888018fcb300000000001000000000102ece19f69f0647a6cdd5cbc21b0645e1a6b97f9874039ffd3cf6d1c0ecaf0ef3c02000000171600144fc17a4b29200842b594576a1bd2793279713f7dffffffffa9dc172081fe0ff800f9ba47eeb9ec95460d2835ddab452001cb7b74519ddcb50200000017160014253fb503053392c44fc42b8961aa4fdd0e8758f5ffffffff02e86d1300000000001600149d9a9d9067dd5726909fcf4be6ed0588af02bb95bd310000000000002200200f9bbbd1b649e5eab7525095681449afba2cbdce70941fe4fcb09da4992987370247304402206e90fb942f18cfbf6094c6ba6a80a807e17fe886726abb3092358dc37720ff5202207f37b2e8ddc7aebbd8a83b856465da198d1e181358533e0d347673bb09979944012103ea78e8dcc4a7d9e3694a688445c8d5fccea83efc1740e19cc79abc8fe83454d902483045022100b44bf6259b9789258886802855495ed82761e4179d88e25938d3bfe0a8d9b0a5022013840dfc42a5a3df5976eb69fe5c4a8ffbc67289cf40fe1db6c36d2368d81c310121035a8164eccd54245e573a6062d94b2e74127858b922dc1d0f07aaf3d395d66be60000000001000000000101ea6a566db396cb5c6e1d208d955a9e1ba762bbe54d0921a7b5fd863637d6f3db5300000017160014a8fa9170a6df383c100b9e3e838f058166c19d33ffffffff01915a03000000000017a91498dad9eac49a7a6e25c572900848b3e45c5212458702483045022100820d8ff3153d2dbae6ab1b4e1f39ff47a7a2a0cc44f37302d628ff4e3ab1731402202538a2e3f73e81c3b3182dedcda57cd35588cc388fb812c4dbf0f5a2bf5bd5720121036a9d475da26ea78d4662ab38afb3f28b38ff7b1e2cb4b52e1419cf39160ec70300000000010000000001015e273dbb0127dc70f67a5f2653db39bf7f84d41567f536b144f49a3fbe3a801b0000000000ffffffff015fd20300000000001976a914d2b29f365ff9539a5f3f1174e6c30798957f0f4688ac024730440220313e4a8d50246d5c786c745ed751c1b42684716d51c971afb406ac10f9948a82022034b3f889931a76356220119779c9b0c7b6ecb6f234c6cb57de7eccaf79166e410121031b844d3d78a429b4c13ad7c2a24b47bbfb58a02058caaadae5e9dc8a619aa9b50000000001000000000101e48f419da5b6c13a6ed4eaf0971997f5c3b86238d3446544a1baaf7d3e9c4acd2f00000000ffffffff0157890300000000001976a9147910cc1f477cf05c279c577667938b100630e55288ac02473044022067e053b8c9123c73e6b6bb6a3a570b493b5fba941699e4ad67d3f0c5f4690a2f022034374c95b062a952df576e5534a7c09525598d38b41db9550b6f37e0e0b1dd5d0121030f70e89e051108017f795790e41061dc14e6f2ac7b8be62a5cf42e4b3d2b556000000000010000000001019ced5ecc3a4a467a5e4af6c7cdb4d6e013e288e3c038a8cfc58adda1eac9d1e51f00000000ffffffff0187ae7c00000000001976a9146c093daf0f17c4b180a6b861c4d7560a06e3158688ac02483045022100aaad046667f625f2171cdc6ce885bf53399d9c6a57f876370bcff0a58de3b71502205016d3225d1703d80a2668101f56bd195a3427ed873afa9952f0ff13733db746012103c9ce90a9ea26c45abb5acb86e96ec0780cbc811dd28258167f261b3a9499d592000000000100000000010162e58887ebf2fa37657786ce28041e8c34e53eae987c9b26337c60a5166c6e890100000000ffffffff0116a40000000000001976a914fe3d0abb5111548ec5b0b734063a942840374aa388ac024830450221008c539dc4b64f72c801f720cd2b9b151471ed9f864a3414b80a742feb279f6e52022015edd31db7649793713e6132d601aed6d52bd2ad9904e7da3e5e517a6a8ed6210121036e23aa61e83c72b6030787999c8efd1659473f46723b4efdb3bfbc1d5ec5e8ad0000000001000000000101b39c36e69af219c96f7e40d8eb62aeeec7889649ddbd258f7a826bf7961199830000000000ffffffff012f5c2000000000001976a9140734a1c462af720087defe83b7c0dea74775499488ac024830450221009e2375adb2aec2ef328b44a3dba6bed4755a7ee5993151141c7e53707a6a088b0220145b5279268c13719b1ce69e9553a4bd7e92e38dea8afb00b545241bf449c74501210292304392f3183d7fc001560d7ef78ad831d487efb420e92953589484a86e91f7000000000100000000010180ffcc1146d2bd7c6a2330a69e90404bdab16b2be78697c29b503bb5c95f6ce70000000000ffffffff0102b11a00000000001976a914d34a7e1eed1b9b411ede591460e61c58fd87ce3888ac02483045022100ea85f63214d43929f747768a3b5587fa40a5dcd62439a3573ba74f20a6ea559c022026a873abc7ebe004ac99f3814d7626af28d59efaa68acc92f8288bc441a065c6012102d66daacc4318014abc7a6916fd4a54fb524376841f33606a391eaa446ab4886f0000000002000000000101ab1b1c5e185b7fbe966c4fdc1d487de928d1f66165187d07739139418aaea3770d00000000ffffffff02d7f93a00000000001600146ec69fc2c338b3e99634596c2946cad43dafe7adcb8d0a000000000016001498f9075805cd914c868459d8813484dfcf72e24e0247304402202fb19b96ba97fac44c290bad8e38600d17e97352770206d154f708d3c109fa940220305b2fc96ee1813fd4bb6857e4a014956bc3a3e41072358da0f9245a5dda64f0012102cb0dd83a1e9f9454ec8d26d7e88bae128f1c2428acc0ee82f01cf5ffb290721f000000000200000000010242885b11e833a8bc9978e04b2398568ba9157635eaf170b3f20eaf42f07996e10000000000fffffffffa6132da7b0429474cda8ea1d849265b5402401e79c71a25131617dc80c0a25f0100000000ffffffff01cc613c00000000001976a914ea506f6a1880d1a9dbb6c16ab779570090ca3c7688ac0247304402202866dffd2a8e4ed2b4d42e3508c6f4353dc68994f11867b31102248d6ceb4a9d02206be85fdd3eae332565ae464d4a761b02dc0692bd55c605586e03c64082790492012102486e4989d1c014ad35c41a8d21c1409c591057c379e7c2b02f3c6706f49bd03d02473044022044e472a9cf08b9cb6ccc39d4f67dce5539f2a37cfbd729f07c50a2f61d4acfcd02202302de9de8786259dca172d6ea50bebd03d164d9129d4e322ca542476d4b2b71012102b274e1dc779f92adec3862c5441537e3e1ea7f4aa7e17830bdecad1d45352af30000000002000000000101c2178d41573b263bdb7150e0fcbf3f7181bde2a4f6e8358e70a0efe4b0b86af70100000000ffffffff0231b00100000000001976a914e31e69e87f2e6ade43a4cf0407dcd2799f385d2288ac8740770000000000160014393bc48ea7ce15e0c9800dad9fdbd9c8c2c82ab90248304502210095abe7cd8172f041392d1e8e65daba8a1d8bbd1c3ea1813bf1e429410655621a022024bf248f2e447363a6a79e3f9fec66855afaded4887fa1251353a71e9ddc6a5f012103751e10563678ed8b81c00e53aaf7813c77cdd80f3e6ea35630f88ec6dd9c982b00000000020000000001011a9b7a1fe167c2d3385e22ba122c93101be8cde67bce9227c701edfbda27b2890100000000ffffffff0286d90100000000001976a914df828beaa0d4952baa5229c1eff24833c324030788acfc627500000000001600148aaea4477819be5eb0505f63f4be06b6ab6c78e90247304402205f417a0c1a13c9009242a8cd480b326d132bca3feba9e980c5c9d3a6695522c402206609caa75fa9a633e3590bbbdda4f68f25029fd452a9a6ee5491cba6917fd3380121039d9ffc57ba5c5e0997f9c86c1ea947ee73c5680450fd124db99527c0361dd5a10000000001000000000101439590b36256dd2cb38063bf24b4d563074cb108af914a2ab2aecc2842405b06050000001716001451ce91855c561f5f59174b488daec26c718ebbd3fdffffff01a08601000000000017a914db836d1325befee7e00eb189ab80aa7a7185f3ee87024730440220045f19778f4022585a346353c41926a6836675eaca79f9a5322cc551d7a50dcc02204fe8215d5ae8551dc43f9bc97d63cb1c2dc4adb478eba4a35d611b0c305fcd8d01210385ac5dcb2dce7b88e30dbf8bd047d1ae6052915d7362a74e95793768387c33ac47a00a00020000000161c9b4bb73ede4cbf3b9b6b14ef9c4d0ddda01650470c7fd600960dfbb13ab72060000006a47304402201932ed455f7ae1ad59d4a23af5e055c0e86f61f8801a1336977784c0e78d458a022056708ef4ddd8c371bc1cb8028e8155a04192b75ba48ae71db4de8e514e351f3301210361ba866d13caec5cfaa420a0cc981141b57d8619b79bc23e43f74e0ecb972cacffffffff0290e20000000000001976a914ea99b8b815eba949f646916b68d138642d3e752f88acbc0a0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000018843b19944c9ee7a17bfcded2cbdf68fbed5bfbaeb9999d33b3898ee82f39cf9000000006a47304402204b5248cd8965a6f383cae6df2b20e76e333443c5d23e4fe42936460eef742aec022047bcbad59669f3678cd89b172c5105b890a790fc863f205c29624d284463be690121032c11dc8588e8d10da52b5f1052f303eba1e6af4a69877439f229041318c02b78ffffffff0244500000000000001976a914dc0708a105cb23ae04115bda8b62caa34c768cc088acff1d0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000015de51386466f5f194dc065517a7b377a26e62227b5c3381b661fa2723752920e000000006a47304402202227dfe0027280557992e83f29bbb523c9c9eb26382d660f7f4f8e8de6bd2ade022052ba3d3fd12ea03fcb8ccb24d2b6459d0f734c652c7b2d54c9182f7a4c6c11be012103cab6e09c0619fbd5ac5db1c05ccca1eb63c5b57fdbc01660badda7c6e5b71ca5ffffffff02c0c80300000000001976a914b68a93e006d3824499ace215cdcc1b8adbf8c0a788aca5180000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000001000000000101668ccb8be2a9c73eac8500b41aa3de876762b3f91cca5c1dab92e6aae1d6fe8c0100000023220020851815586f3a9c37f3b691c27e1948391e28ad5bc7a18383ed225c52d71a5251fdffffff020aae0400000000001600146a4b0f97a619fe094e06375f74168e1cc0515468269482270000000017a914f39c5094bffb5f08bf3bf467a90bf461813649d187040047304402206f7a359bbbc92bbda908e74ac52c910bc7f0607ceb32bf623c9f3d72351e596802204857bd36fdbb2906dfe91a4130b013c6659094ce618cde7746a24c365d397ef301473044022067a0421fa2cf3f6924aa03aef2d7f2a1b7d620324af3d7fdd26f3624844ba98e0220763fc8a2cb6eb0951b09aa71654e19557342abeba8743149a7285432ab8a5a41018b5221024f268784aa4ab1ff141b5fb659c3c3f88f373ee56cced439557fbc92448471b721027e6195ca05a736138de3eeced8315a71510ed640efb8944065c8bbacd7b2acbe2103ab3e26eb50666791b17036998000c93144f6c19689f32607a70868850dac0a1e2103fd1956549853f1ed412462e92273fc08ae92fd88358bf4812006cb7a271983f054ae00000000020000000001035e21248b5eedeb0153e8d8c7d98487d606d3ddb34f367137cf06b3c574b00d7e0000000017160014a2028100ff0a0cebbc9191ab8a1e56b38f902132ffffffffede5805d203e1b512c682821ea97be1947a0f9b84e8dac5e2ba65140f2f027ca0000000017160014a2028100ff0a0cebbc9191ab8a1e56b38f902132fffffffff558b6725f6014f1228800deb3df54ce4c4591eb8d2af85e42ad3496291aa7880000000017160014a2028100ff0a0cebbc9191ab8a1e56b38f902132ffffffff0200e1f5050000000017a9143ddd157eb22be95dd73bb37cd131f01e9565fdb587436c5c000000000017a914288107c1d4621fde988e6ca56552fb9288816e158702483045022100a8df9413184245a36df47da665bc9fc88054d991c2158ebc44cb529b2fa99507022016d5a61d186712ade5419a1c87de2ee77233dd8e320648ad5002feff38fcdd05012102c069454cc5714ab622c90e46f3fc5922f3445e1345bd90adb721bc94eadcdf2002483045022100dea3806f0fc7a91cee214d0fe8c83967ef459b6c43521b2b7bef3992cd6cb18b0220045b2aa396049dd07187c034d6e379a2b488a7d53dddef4f65966598c4dc2398012102c069454cc5714ab622c90e46f3fc5922f3445e1345bd90adb721bc94eadcdf200247304402202017d5fbed0661d9ecdfe4a231e57997ef156bf6981dd5472232e6a74bd22d960220037836f8c8727cd71ebff5f85705eee55b98fba65135cd154ccf03472283d0a4012102c069454cc5714ab622c90e46f3fc5922f3445e1345bd90adb721bc94eadcdf200000000001000000000102f2763db6c396913934ecdf4d33135e444acc2923dfdb93452db40f181b785c520000000000ffffffff14785b1cec69439fdcd72db7490dec05a3dd0dc3744d82fb2438496ab30be2b00000000000ffffffff02c104350000000000220020d37425beb076b0e4f22be3694a74372134b008923740d6b2cb40754c30e9545932df10000000000017a914b535bfc00b8c1d9f678c835ef3767f35791993d18704004830450221009b0a56cda9614b731e223095fb8a7b5c1f6bba2ec5520ccb81400b0f9179964e02205e4c5cf0d1f7313dad30e79d7fd690a00006e770788c3281fb92fc4081df9002014730440220322dc2dd26aaad9d18a629da7856da71c997e7d7339c5f667c7dc55b77d43be002201649eb3decf66c5fbe1364ee3fc31d7ff0499d27fb0eef0ddeeb54f9163856850147522103690487697c258098b6051fc2df4f8fead0eaf38e13a93fb58c985c845a47dff22102e53c154dbdde5740e4e4368d0a3fa7ae27e6fe067f73c166a30d7e63d795ee9f52ae0400473044022036fd7faae74e7e8760bcf4312217c395f3a143f80233fc5b984d6ba48f90ecb902206fb75c0c1d4d1bcfa99248d40f028a6e1ad9ec2e22442c67546d620c6029c74f0148304502210093a9916bc18875ca7b349b1d88b74c053183f9db0499bdfe2bc4e26411af9a12022050bc9e770cd094944e139e4af5716ce08078bd7761bb6213a4cd02e9d1f7addc014752210249f4383fa13c2f11af066663500ed4523b5dcde7b1180eba02297d4de512fb53210298c024254975d3aad70bc54ed89386aa4926b83345dc19aa56e4b9a31b81586652ae0000000001000000000101eb4eb80770584de34b0d9806bcc33dc919d54f9104848f29605f1aad80f1679d0100000000f9ffffff020459280000000000160014aa52a6f5b5a81e076dd52422ad73d396f5ce378ee76b210000000000160014d85f9cbc5fbd6153cd540ea10df0be72280c2f08024730440220751465f9f28a267b98a5c694a20a58e85b9c92c233cd2457905366803d9a8a950220791e21910778ff62337902f22fad546960bee258cbe559c33191c0536506588d012103790ade7d54541171409ac01d8191ba79a6780fab980b1507a4767e1e31ce7f740000000001000000000102056e8bf5a2ca579a12da99e5540a544ef241bba8debadd19e2989431cdef976a1200000000faffffffebc3120525996d0b8fe99a58e6135518b3f520406686bee9929acb5f9ad70d660100000000f9ffffff02310b250000000000160014a1ecd3cef98713b5e6575f0285ea66a06e308b870223170000000000160014d85f9cbc5fbd6153cd540ea10df0be72280c2f0802473044022019a3c3b770ed17865987016eb3be062347348d84cb5b6fd9ccf5ee2d58c269df022058a4acb00134e27ac724632891ff348063ae050c049c987ff127e53fc5884fb3012103790ade7d54541171409ac01d8191ba79a6780fab980b1507a4767e1e31ce7f740247304402202fa75912f2b04d4197eea3a7c348af2a06c3897518ad59651b24a28953af9fcc02206ce3c6619d7353915917fe8dec4895234708793a01c3be77a3457ae4acc9b0b7012103790ade7d54541171409ac01d8191ba79a6780fab980b1507a4767e1e31ce7f740000000001000000000101a2e07e8c70c316c7ecd943e7a4fd61f45d1e2d2cea366d77bdc3374f8255179d0400000000fdffffff04b69a0b000000000017a914a5d100433f8933e1a7d7d4fe9c40143111ac9d6a87078b0c000000000017a914d869c3249d31dc143010321098d25886b4bbf5c5872ccc09000000000017a91419c7fd6f4078f6174f43a1cfe2df92f75f87dec3877ac21901000000001600140c174b958501a2fd028ef09d2f0a090433bf498402483045022100b61aa667457403422cecac1fb75a135de8bf9cae9c96819c99643f3149c22994022001ae39631f1a57c09db583e426faff9ddcea190dfe94640202e11adb8a6e8f2d012103b7c76227b6c5515c1c7b721031334b84b0e57173047002714738044caed36e51000000000100000000010261c567d6deaabe2be9505389a6a9d694c146afdaf614798233b61e1d691bfc6e0100000023220020b0a829ea5bb163d2027cc4fe33e090d2fb7b2a58981d090c71d4aa46167408f9fdfffffff881d4cb7d9b9cfa71dd63bafa8d9fc9d4f26048c000a22e38ec11f71d1d26a30100000000fdffffff02828b0c00000000001976a91481e4ae811604134c5944284c8b1876a9f4bcc21c88ac16430000000000002200209270b06e282779ff2c32f3604bd3d9f3b7499dc22055be1667e37d685fa28c940400473044022040c161e6828a55a535c8487967ed9e99f16594d5bfc3af90136eedf98e5a141a02201035906ec9af08546238fcd4441c2c1f5a585099ca8d1b0a44738dd7e7da448601473044022010111dc66d60ea3368803811f036a03c8e84294eabca61b23bf9a1e08467c7260220279610c20faf614fb679583e43618399b0622ff0cb22651478f2eca9abe06707016952210286f8a55a40c0859f7d98c7cdc9f5f29ecbf9c5316d9ebbd09002dd6fddb382492102c6e307bfbb96a83876fc9bc76be96b31e6c7c7228dacd06a6c1a4e9908ba7e6c21039d62f094a47ec2abe7d77a3d7dba0eba069eeb5bd9ed563bf96876a8a02ba71f53ae0400483045022100d022645d3f2202bca4f77ffe67f54fac65a36b716f087671f55db27b81f041db0220675a90a9ecce42c68e8d44abf454476b02dcd3534fba368851bd1fad76e48e6001473044022000bca527fc9b0bd904b4713fc48e7288dec9a17966cc3dbd75ba581e257ecf0b02202f67c2075a2680ebda1674b6d989e9148e5d49ca8ad734db4aef427d790a19ea0169522102759dc3e4960d8d4ffb2b8a1eb050b42dd383a27c03feebd693056a7781ade4392103a7073e5d7b60279440bb58b02a1c30c8144a6beff5429513e8e8eaf8979877522102a416e5fe9608a8bd8ade3e7731992d0d049c95cc69c984d81081ede6b854c7d553ae000000000100000000010512fc50e8faa91dcb364bb1a55c5445154484cf0e27f9c2e5e09b0e72b322cb250000000023220020549ac51812a64506cf90702a54d116b4be227aa1d642e037165e617225c5a86dffffffffbb7f7ef4688358ba19def6f05b2556b5918ecc88d06731294da714093b9db5280000000023220020944cc00ee1ccaffe8e5daca85de74e240e0ed85484a6ee54f089efc47499791fffffffff48c7518f3cab1ad187c171e17be6ec94a9deb3c06cb5a7d644dbb594dbf8dd3500000000232200207ed77faa4a1418f2dc3564699c6f188e3c57c5a69a45a1324873b08a8e7d1e1affffffff50ad4dc6c9ac449663cc40553cdc7c68037d1004ede1111497224153813eded80000000023220020a73527115f5c7b6707c2edbfcdf93957d0616fc70517035d764c469cf93e2b14ffffffffe118d11a02e251bb2fe994c4da6fbb70c529c317e5b21e4d08d369e92564c0ee21000000232200200d83059c99480769662a6b07af87a96972d6eac74e83083f397b6a08e8332f43ffffffff01453399000000000017a914c066c1b97bae10b66131306ef3620d60be03eea887040047304402200899529d85b5d4eca1fcd1ee324e0a99a271cd31b070a6e702cfc0cc96d523f302206e357c642ab2b7745218411c2ff99326ea95b68d7a1a075a883b230d4cb395ba0147304402202b202c08f4a2476f969ed2be936457aa59b84bd5918cb583733ca0cc23226815022014f081ddf09cdf702a68f36c16deb05b7c6c84a2b428b5d0b8907e1436acdbe8016952210272a60c2783b9a35abf0a5a90820c5bfdf0efad73dd59b49df7ba2d3cf42625f0210399241675cc4b7f1113c78c99a389f8ea367e5936443918b91adfc4950de8b5cd2103c2aaeb3e3a5a6e6582e1c1e9e2dbfd209525827b9d5a6f365349873849bb606953ae04004830450221008add80b137b5af0d789e7e08b48f29a3cd965df79651d0be4908b4731156350b022050dc5d1207b050096c74fabdeb2b75378e3680955b387c9d3ee6f353bc04b25b0147304402204856b96d245c6e211abef7aa3078c06d053e856efa865e123a066f2ce0c7f00002205ed60f79e7800a5e67cb73d4798a15bb26d7ce63d492ae7777cc63163930256901695221027d687cfd119fb9eb3673ecea977efdedf2e1f9809a35824256c917d48b4db63b2102838e2dc553d48d9d8c7cdfe7253fef4a9b26d71a3e5df0665bb40b39f181a6eb210348a9c983e76f3c613dd9b6c30b881ced85266df5f72693c94fe0f5bbf457280653ae0400483045022100c6447f4c6cf3ab6cd899e6061bcd8e70cd450f666dcc5a0a567286849f8d0f530220686a4f02716dc666987f8bef9762044ae87dd7f9f2778affc0ceaf8a279361df0147304402201a1e6ed9aadb74981f9e906da908e7f84fb41d21da99769278f90e3a55f93e7202206ce7953283a1ebbedf6b175e14baf92fd85049e192aa29baded844e693657f3e01695221037d5378813f14e3271603a363a8977bfbf768eeb631f6ea044be28ba3bc408a8c21028e7eb38e017ded380851f77ac49951a410c260c97b109bbbca6e35f850f9dfa421022ec5881505282c6d1e47aba94f6260d9ea0592ac10e2f9510bf0afcab837fc8d53ae0400483045022100c1d95ba6727afdfeb11763ab053f5f072618f3946e5375ce36bb23b0b33f42e802201b6cf97f5fbb42c934dc6646eaf1eb3ea275acf502d401a8ac02f663af8d424e0147304402206de93520f5a848a5b4882f456f796097f9093414eecd1d6a930374c8d36fa97b02202b85ff9e631ac7cc978e8bed3574d8abdde73becf29b5d8dea2aff581b53bf6f016952210390016c4e47f7af647edec08b020ac0e972a87a112745b354cf74dbce20daf8512102ea709da5f43dbdf68babedfef9df620b595dfa595daf84e4ec9a954a24bf94632102181ec9ffc64daeba321adada4f2085dafb9b2dbfd87cfbcaaf83520a3b53e89053ae04004730440220025d01b4f74768d948bf2f78a8a721224e780554843f1b416773c768cdfb2fe402201a64f1f627b78880307a96965a96bd93da5faec3bfcfe2379a7feceec2ffcfd30147304402205ed0a5062b64ccb0f29bd481ecd9fc551060d7056be5e63447405a40e317acea02204c37dbb398d607aa88db795c06212bbb3105d6c35f81d750b9449197c1acb3a20169522103a3b73de52374988ee0de566e37fb9c031bc2c7cc3096d6ade5a2bb11e16a44162102cfd8ef6e94bfd4939fc1fca677ea23a7706059931184bc848e700886434e98bd2103caaa76555ee2e69afd34ab647c47fc15d516e3264fe0a71e7f2a7fe7341bb2fa53ae47a00a00010000000001019f6ed304627f088ab9d42439013169b35d8de08c3e60f35cec35084a19dcd7dd0100000023220020760238d8493c1c5304f26ac25e71c127bf63fc087465b3bf645f3e69f889ec62ffffffff0234e800000000000017a9141413cb8cca4654d67a55f8c3f95b407e4bae321287c46c25000000000017a914d7688cbe98706aac916397d63355ba656d86ea798704004830450221008d33abc4a85eb2e51e332495819b0a8be791cf93939ee17338b7cb6bf8eb785f02206e5a83e5cf4377e66595ff1fd4bc04c4a24e3f7275e6fd6e28cddb6143caf44901473044022049b4ccf276b6ad87ab333aadc06af73b3ae858c0478fd20e606b9a123742f3e402207a91c1aba8e3be3f3c8e2d544b4c712b1abd586f538164b7e2dc9ca64d21fab90169522103a6f6786d0a1537dbc0c31e1d11001e871f4333dcf093d01775ce04d93f0d63e42102806b1b260bd065b514033f6e63cf996e9cc605350f562e80ca613a41603f00b72102c5297bc5f2580de2deeb32edf55f54a15db33b78ddc1e160d9e529509bca247353ae48a00a0001000000000101c65178f990cfadeffc64ab7fe62622c4df45a4fab49979e99c7de41d5cf541670100000023220020fc8fb0abf7092dba5cbcbc96a5c9b9bae5a507d7814842d0ed54bb08332ac9faffffffff02e7e80000000000001976a91439ae49047551a5c5c3313c741aaf01af2f9cefe688acf97d24000000000017a91447c74e67da813cfaf85533505fc62ee6aac4c4db870400483045022100a99993556a728b569e869030c69c5c0b812730d545d5e6857ab01f9af9822fc4022014cd3d4f5c55e9cdcd2a90f6afaee0237fdcd39346b2b9685a47425d48dda1c701473044022007f58d48cb4b948522f674f73cc75edd134cf3e3ba24f5dd8ad10091bded2eba022040762ee6886132fa258689b7db1f9381593267cedaff9b92d01a1c087e9ac24a0169522103e2f70e33c991800e0b6863f3df89b82475efd25da623316cc65ccaa99e7dba932103691da66f3f485dceaa15f44cac21c9251fb9d41a7e680b2d11aa2bb9a83d194a2103412fba6b4ea7817ad836f0ec1d0b5b2ba208d37bde905043e87c6c36507b0d1a53ae4aa00a0001000000000101bd3f6e9950e9e0ddf9978b0fb9be3abbab9af9f17815afadfdd7d7525550eef70100000000ffffffff02649600000000000016001451299a96430218bfe73c36960e9db097d41bd11eed220300000000001976a91471a1253a7c2847f8ec6850f917d2b1fda9c10e4f88ac02473044022040dec2877c1d3af3f4108af2f7d6a7584b39d9bca2b43403cd1df2d61ac31f43022028b1a61ad12e82b9a98c0cfac659a103054182903eb56dc0eaaf749248b25e840121038409bf2886e5efd15aabbc37a575e9032ad9290730cadf0b555c1ed48b05121900000000010000000001015487fecab936c851846745aa90574a17eca4e0717fc8fd8702d02b3040d09117000000001716001400b7399646ce9e01eef4ae075ce9b8bd37e3b90dfdffffff02e28601000000000017a9145ba68116dc2403acc810ef385aab3e16247abcc587518f02000000000017a9147d629c8ffad42043af8ba44a28341688828b79b087024730440220352e5e2f2347a0655ac780fd6b256503a1c3971b54a83d5323fb2fa527f11a4a0220505a6446f1cc46fe3cad0c565f284a5859a34ecf218b724fbae3672e9aa4ad4b0121020749520237de074be42aac8e7849bd0a006c3b65e7af7f65a92360b558966a3948a00a00020000000001011a77cd342b311a386c84c9542d794f0f4803a5bd5b7e9e6fd99fb11032abe4e5050000001716001418d1f3eab6839986a20c2c6e8aa2fb40bef2117bfeffffff020c400900000000001976a9147004e2f1b5a4164689949ac67a7f47a075d457dd88ac853d1200000000001600144d7c7c8c8087e1383a35272c1d135a2e0bf2601c02473044022046160aa63f428cefa02187382d0dfa589a81b387a492798471791c0287a6ceaf0220514728909d386df2874605542bdcc9e6263124d797b452954da47b6a81e0d62501210244a7a952b40145797f3d7aceda4a3c0e368c280e430f6bb7fb32833e98ed4faf48a00a000200000000010134f3ae76f8e61b3a3167040ed3e45a727e113e783c837442db5becdda3a283f60000000000feffffff02e9f408000000000017a914df0ba256311a70575a69a097e58deb6136b5f0da87d3cbcb0f00000000160014b68bd5810444f810f916138886a6fa72c781c32102473044022055deff7e2b74b5a882bbe4a1eb301e08758fb79234b1966a543749dd8ba9797602204ca092a104c2cc4f31610f213fb21bae59f50988fafd3099e68a00b57ed0496a0121030b30ec454ce64b8a4c4d4877532adb91260de111d6424f9aca8f80fea9aed1d848a00a00020000000001014c8e2008724c7e567b4d234110533e75e3f3efcc9f7afe3ee40ad75b5133a56c0100000000feffffff02348703000000000017a91443ca2e8b9cb85adbfb2daa14052ed68cdec77ee0876980110000000000160014110246e503f6c117a45cba9c9556cf6cffa3f3270247304402202dbc2e369688daf16f169ab829d4b7bd1342594e081e0d767cb7399766707ed00220375620668212d7f70a49c6009e7187e15468e67046bfe922259dd8204acf4411012103918f777b61e27ffeddf9d27f2627a6fff93808fc0bb5c651d66b3541462bafc747a00a0002000000000101f23cdcd34e6c79ac5dad9ccceebaee03481ce0fe5f5e9ceb5a73cdd46c17e3690100000000feffffff02be92aa00000000001600146e2a0d4ff7be2a5fbe8af620a90872a92d092c3270620d000000000017a914024e93ae896aab74238900f5ba16842887950d3e870247304402203eac5a502bffd75f3d1ae8290e1cb036b970320c4c80d392fbd0da76b2fdbf5f02203356dc7c82900a75509f19b8b7bb6c0a9260a79905d18529f10d7b35ba5d35fd01210280f5f202e6e22335d4a3ff8a97c983c30ab71e54ae1b5d30fa8862a785aefe7447a00a00020000000001011b5b75cdacbfbf9d71e1801cf666aa7bed6fa74048d03c698b042c17cd413d150000000000feffffff0ff2d57a3400000000160014f9450f8fc94a544cef71cec7298ec2cc664137531c931700000000001976a914631d291cfe7eee3ead2f08f1e54ffdf34f07026388acea8b0300000000001976a914d21dd7fdb8ea11e57699f2815b1ab60d258ea4d188aca8ac06000000000017a914091180c6d42afc4b7f3afd938db6ad3e9b62f77f87dfab06000000000017a9145c6ba069047ab34591f82faae66b4650f1644f6b87cf9c00000000000017a91472de5941c14505324993ffa8c92e970938aff1c3877bdf080000000000160014a999b71c0144838f2346157864af9ed3c0c383644ebd00000000000016001446cb2faa05ed366b7490c091347cdd54f0e6de361ca3120000000000160014d8ca2c49589607784e83ff2c02769979afab5cb8530f06000000000016001499e4a533a58bfcde10388e0e901f29315b49cd0a92ce0f00000000001600140cd1bb8c0b587594adb4010909f124a08285560237063b0000000000160014629e0f2b740dee87a1ac45e435ba8ea487c4dee454b4140000000000160014736b6d09c6a5fa5fb28319ddd71f6013c01e2d904c193800000000001600141682046a06b00c79ba47546fd498b286c05d28144ee505000000000016001414c5fcc93ea5ad768461b9d3ee802ab433e6cfd702473044022000ac3e4831aee156938359e0d6f5a4e36f59cb1ddbcb6b0e6fe5eb86fa2fbd210220022c71e7f4145641cae5c29c14d0c7f673b1616b2ba7d3677bc4a670d7bcb8bf012103fc60778930219e93ef91aab1915a774e5dd8af8c4a4926e7ac92dcc5762c10840000000002000000000102dc5dd33f901473b2308a8c62acf67ca405fa26bde0ef6c1f8c340d6a85df1fa80000000017160014cd16b00dab88aaa4eb97615d17f9cdcc7a57730ffeffffff1aa00415c04c6b66db51a4800215c543f2966e76c96badd89733077d3f12e27e01000000171600143e2c0316e627a8676183fa9414cc9d4be81dd5d3feffffff02770411000000000017a914695dc5036c3657bd2dce85f4b65dd8831dffab2387aebe07000000000017a914396b35a94f3d205b1a8853c09fd33f8b8cef822a870247304402201477276ffd10d5b7097b2ddfe58aa8574a68b59e1d439e48725d0e82312382a702205a947dde84db0680c5b576e91b81cfcb6511a4efd08479ab529a23d62d0a6873012102cb12d6649153a1e562db4f99c7f929e22604992ed9d8dfda8a4aa11486b80ed60247304402206a6d9c1344c892851c13b3b61c0da76d528a9841c9ec1317634b337058d79b5a02202adc4b23f4ddd0b473cc3ae63ad3bba704168a3606f75e754d145a6fd7c3b973012102151472cd156f56523a25191d785b6fdebbf131d5f08e8127b0e68b6985bc7d2548a00a00020000000001013e1d310fc441628eaea934298d2a4382da47d4f46871c0dfaa680ab843573aa00000000000feffffff0522ee1e0a00000000160014f0ad17783b300b1c5c833c43876a58c96dc1af1adbc40000000000001976a9147e42c4609dd189f021680393b338dcd83bd326a788aca23d2500000000001976a914f8c196c0c9b5c372da067d91d95ad3a85bf3504a88acc0c400000000000017a91445369cd96853c59c836d3887bf6b20835a551d7c87ab2e0100000000001600148157b3c98287f77a17768b1ae96141f7c2d779f6024730440220791be4c249a863b9b73a2340e5e048f969519968c31cf527aeb4fd94d67c7bd502205f9b2baa994ceed94a192b37601be9ca6b12d80c266db1796432ef8e06973b4c01210375ec2f4ddec2c8a625704ed1daf4277da239a3390efa07fec51dc1f3d57110d90000000002000000000101536dee2ae2786b89b17fde52c18ef5979bfe36947d6968a659362215a50201020000000000feffffff02917c9a0e0000000016001476a6d57bdc40c110cf9e480244c560204037e83fee881500000000001976a914e9876ecae3aeffcfd613c60747d39470c8e725fc88ac024730440220305f13b9ec4b9aa69cc7ecd7a8502255d8ba90ee064029a4c40bf34ebf317702022051c7c858c7a5a5d5a5b430931d9980011f6e62309a6abfbcf4753934e9a454db012103020f411bd9da913ab5e383113085eef734c94942070284555533dbf187d3587c48a00a0002000000000101e92ea4bfb203f3b446e8c2668373a7352e65c3538ca6e47025c5f29f77e923b90000000000feffffff02ff5e0d00000000001976a9144d2000f0ed0afa28a585b94c60549338fe643a8388ac97737811000000001600140335e217311ba5c5ca599e909e69afc48e28725b024730440220102d94f349eb01b82edac6bffd46676823e3d743404f037e9d5f3c985b27080302204a3115f2c9e6dae7a2faec85990bf97c139944dbac4da88c93fa9fbcf688968f0121039280a6d940b92de0710ecb2054f319da22bb89d96305325c6176b3935347657f48a00a00020000000001018b81825d637f8ff7f2e53bd8c3d0348df3382d8229d02d8be74f8ac16a2b30fc0100000000feffffff02c0ee0500000000001976a914fbb60108955dfa4916f7c27a419456ad26b6583188aca23b450000000000160014541e8f53177958e2d72930ef0de20ace35949a730247304402202b5689dc0a612f99324fc7125d0cb71c6f1b5414668225e0f16449250b3b9e3d02200b2c4c9d07af93bd924032c2fcb38e3a6084d1882fabab1c7b559f36867c6973012103caa48aba96793d7e3cbaa2e20b4f405fe87a146456ca021913d685afb3af1121e59f0a0001000000000101677ef460cf92ea89ad95c1abbdd38f409f1ef62aaef19dd24d0fd60a0026f4c60100000023220020985fff4454d737933ee1b2b58676f10c4544704a5deffc7174645ae2e2c27ea4fdffffff0225850e00000000001600147d4ac2ab07b16c73fcc6d21d6ba68ea8aadba522e53b2c330000000017a9148c869ed9f331f58efbc75476ba78bfe03fcd6aa8870400483045022100b7f6d06bbeb430f394d1b9a9e38cc3423dc155fb3974deeb975142713ec659ae02207745d02139f88fac78f0bf60e7de274c4bb6c798fbdc5e920d13480f026c417c01483045022100a530a4eb9a49c412c821ad5825f8bbc7a4788c69bbfa853181f3c9e1ccf32e7d02204c843ce0b327519e1f83f20f9d64058415a045c0e8b77c1a1e4bde9ae1da8d77018b52210223e85c38bec3ba7266c1a4ae371327f40c35b6a88ed29e262c1a345b1c811a2821028b1a454b9dbdba39ea96b8099669d6bdb40546309c4fddd9c59925e0c16de0292102aa7cd471ec550234688feddb7617504cb5816ed1c3df8b980b529d2be925d0c9210329c4b94d8b94b6c42b888516b01af5f83a03d6d2d009a439f18ba2561c0b4c5c54ae000000000100000000010119918cc69cc1d401f20b5829c02a06c59b12afa56c773d8896adde8d2b3622c60100000023220020f769fbeb610a85cf93099ff1e2960ae4d0259fa12bd7c2b4d46546b4f91e4448fdffffff027215040000000000160014ec0398c147ddf75d61299eabf291c6e433215bf42800790c0000000017a914ac5f985c97e7dd02a2457dd89a4dbc0efc6fc61d870400483045022100b63b01f07b906ee404e4546586ff7db234913603babb8a407db08cef4bfd9bc802201ada9a0f63c50a990c7bec1ea5e7c302209d82521eac068f04737c181183436a01483045022100aec8578f79df141e5d5b91102a174f5d11e8f5a3b8cf25c793437ec88fa181f802206eebaa11b3d1d1753771c12ceb9212edbb160ea58ef741cd286c6263c97fa647018b522102406fd226ee27494affeb8835e3a23f77a03843b5de505015dda72a2a2069519f210253b172029546afdf4cdb5c3cc628f1179e3fdce64fbee04b9930b20a4031e4ff210319514800ea6f23ef9d264e34659528236734765bf7b53272213c12daed4694472103ccc3e5a3008674dbec8b0ce0ea07b34e25a3a728f3f2908ef6ac0df69870346054ae0000000001000000000101513d01db5691796b7b1b52f53da6fb12ae8a3486877ed34256991e1b648c852d01000000232200209ee2ae95cc76a5162964cb8ffe86eaf452d70327fad6ec8c2591df5afbc9411afdffffff02750602000000000017a914678887ae5ed6b1cbbc2a4ed21dcbfbf0751bd89487a2570c090000000017a91466aceed1c89fa7f0d472eb2fd0d2dce00e432fd3870400473044022071725626b9c4a28e1e3ef1a698d3ea9b01d5ff870d36593ac4f00f8804faeb0102205b2c60f77c2ce04e101558f2fe41ffbe9425c7833d4c52f9578d97dfecb51d8901473044022011ed44722215e27de780aceddeb3dba1ef803e448ccef3ea21f2a2e1087f711302202e8a628dbc8423120e3230013c70740f5069a65ee26b855f8d0d28995fbdae5b018b522102f40d410768fdf242cca64fa448661a4735c11ce057ff41bf089cb130e41d398d2102ff7f725c59b9ab0095aa42db08ae3d6a2b8fb3d48d0ce976a929c7cfb251c8ed210342076259da8d8b62d4e457671ae6cc8566aee84ae13d5c6c45b8181a688430fa2103c613f0422f9c0f91b414e9bec655b3bf3335dfb27fe22f71c137fcc055feef3154ae0000000001000000000101683f9aa355541f87f0f670b989389758795134f99fb7a7510e700016caa8fbc50100000023220020f2f7381485d6433e346d81245a4e9a1cbc3268f25e6927cba852b4ec775857befdffffff02d4083b000000000017a91421b4ac3211f33d3c4bf1d921107520aabfacb5058743f86d070000000017a914093f947ed6202b22b059c66d6364e0b02e9042a2870400473044022077eca8787430b24353f919df67361d4ee4501bcb3421449840e8906c9040e2ba0220363cd014b7b5e2933e2960fba5e49135b9360165f311a1af891f8253a7f4fdaa0147304402200572cabe9784c735ff0b51392aaa58c341425c256a8d7b4f848d8558501474ca022058884b1cc829db606ded6d1c9bf30bd054abd521f20bd658271e7abfcdc49d80018b522102aa3f4eb3c544a70717333f3798b78f2b7db601b9cbd6717d25a0a69f5767b2ee21036a277c69a92b1e2191949629bf564d8d9218d382187a445d622d1afe1e963b5e2103da7868cab976a5a53717f5164f3ad5de5705cdaea6471d8279e13bfde737a3962103fada2f84d55cc437f68080bab3f2c1796cc36b31b761c3c4b0c70aa2ec30133354ae00000000010000000001018021611555ada0728d29f9e2f8d881c240fd45595827d733c90401fb448ca0d501000000232200202d4f2df95c179d79f830145d95f35906549134b3e1c253aa4853592333a0555bfdffffff02c293ad000000000017a9144da75afab977c7c59ff57948108d33bd41951740875a1b40080000000017a914414886a2d3f999609b62a0981b92e5202ed4cd3987040047304402206f205dfe530336ce10f5585e991cd02f93fb43760da699f884acd2f3e2f1fc17022010d2e7d0865c86f3b6d360b74c7f42e1aa30abc010ab0863fc14edf6e238a0470147304402200a9af6b5f36f0cbc06f08ec878318e547169cdf8e19182aad817e79e6fb3d55b02200502f7ae0b32373cc0206f5ad0875771035384d4bd24b6f08035f8d22b57b2f0018b52210256bb6dfdd49870c8f0e894bd83c8635e4ddcd8f6e306dcedb982e11b50d237bd2102ee81d708f617ce7de918e57848dcda28b7a1c34662083a478340422211f207bb21031be908dceec7f40005a8a7a1f0e724a20294ca8d1af54a46fdc92605faacdedd2103684f07a1b69dc21111c3bfe1e274555d491af4d8719b1be4050cb05b31f9bcd554ae0000000001000000000101795132522b41e4bf69d7518579bef7db715ae65ba60e2f4893140face1f91fa41500000000ffffffff45583703000000000017a914859c58ec66cc229064d78118b1db0775eeae1e80876c3301000000000017a914ded9ccdffd24623f925ca12ce4481825c9c0082e879ab601000000000017a914347529632388d463c956009d2da8d5c528f3c9a687e4b400000000000017a914d3bdaeda9615fd205e65c4f67184278f2d97989d87387300000000000017a9141e68c8e8dd09e5160b4cee73cc3f8fca56f661ad8700e1f505000000001976a9145ccc83cf270fce5421ea8f8b89b2b487462c811b88ace8851400000000001976a91404a8678b923487a44606f195b1cf6f6d70c2138f88ac7b281a00000000001976a91476f9511df66d03a6d80098a6798c6e991ca916af88ac7c2d0100000000001976a9140c46db68c067fb57376a73284811523d20465c3988ac9cf91f000000000017a914ed4f291d2820eb56833ab28c390ee0725e0d662987336700000000000017a914a8628a37dde4d20af3db9fe1887cd5bb13a87eaa87007102000000000017a91446d28e61ae139d98886b5c8b3aae1040bb0326be87efb50400000000001976a914361d04dacf753e9ced8c2f1f380ba2dfcd517d8788ac3af100000000000017a914041f02527527a6bc17d367e425f267601abbbbb78733340400000000001976a914a38dc006d6c839a941671befebade3deeeee013088acfe6503000000000017a9140e4542a2da24cf3aa5731adc78f57b4f986ac83287d8d600000000000017a914a441e170356a743b3d38ecc1b382d51c554d8c5c8715a66100000000001976a914529633b57971e4a2d0bf303c21f3340f176153a488acc78200000000000017a9145ec14d974d9b20ef1e6ca11ebe7704a70ccb96be8738c101000000000017a914171b734fe1efca0e387624505697c0840800472c87a8ad9a000000000017a9143c5599cca9addafadb3209269c1a7bfc6b69ffc0879fdb04000000000017a914d683ded344a336705cdc908ce53fb376004da99b87e9f700000000000017a914d5947f1127115fb6ea9ae25e840b9ab25ab21f80870d4f11000000000017a914d2189d5647434a183ecb933db0236dcd0dbe91dd87b1700b000000000017a914c5c60d1defa6de1a4d1a45c3e1a3330da3474f0887f5ad01000000000017a914391eddd18432f85b55ca86e9d35de5c6beeb318c87f7890700000000001976a91418ad414b7be7351af54521d1da3688a3571b07c888aca7014a000000000017a9143e669eb477f111a7fe8f05a042311afe2011a56387b0c106000000000017a914e63fefad438844579c26e2c1bab5ec25bc805fac8726d1000000000000160014b095ba7c59c74ea978a0d9127b1bc7d06151d19f89c9030000000000160014642ca979a86b30382b0a0eebbe7375d9cae676cb9c2e01000000000016001403e764487c11934d0a2372bb60c8f1e04cf0db3a790701000000000017a914c0e7b3ac9362a3c7f7c94e694bc79298d47da23087c06232000000000017a914fa4bb5ef47e68f7646376e5be48b1eded70c0dd2877c2d0100000000001976a91482aacd81fb4a3aa3fd445517e372fd32c67d170488acbf590000000000001976a9149c7736b5b348f46945bac0ffea8d01f612d9365888ac62ce0000000000001976a9142ab984cfd2c51cec54647a942ca4500fbb51cbe588ac974705000000000017a914ee616f8b21dba752e2fb033775c390f8478482ba873f0901000000000017a914c650b2672e1ee94021b7672f8fc5696ae772d1dd870ea921000000000017a914a85cea3396bd278d8a26ce030b4603d72342018d871fbd01000000000017a91465f117f687bfd1c1d76786f046f2685683c22ac08735dd1000000000001976a914c17a4bf06882f4b85f53b9a50fef9075eb339ed988ac397703000000000017a91424a5bbccd7a691451f830ac88aa3a619f03d6c0e87cbc800000000000017a914d970c81ddde95effcde0e1c186857c0ecf337555873ad30b000000000017a914e3269c31b8f27c1a3c977783feb7c05a5aba97e88763f70200000000001976a91463c2358d4267dd0af612c41b7902077e183addba88acc042c0000000000017a9146a897d9519649c8069eaffb341e17809710746408707fc3b000000000017a914d3a347180462a00bb6775abb010cbc39c1e3809e87f05500000000000017a914de44fa97f4a0bd62fed7409fe5b58bf93445751487590b1b00000000001976a914d9cab8461f914f8a52398ed416f7c38143ef2b7d88acd8d600000000000017a91477922c86cedb8666747616f50e1b56e7064822cf87086603000000000017a914c6018a511d33bad788a8ccb72490b4fe8d54d35b87e27208000000000017a914f503a6c08297bb1e30bee159ebdc27d4c092d63687899a01000000000016001414768dc4c5c42e92116e2d257c670efe53b912ddb95e03000000000017a91467941aed25d49cd70eef056df13484a325a0629e8758c40c00000000001976a91478957744f0b0074626889895e7fb9e314c98658388acc95400000000000016001423097829bb7e65f03623d2ef8d22473c77a0611ed40402000000000017a9149c03959870e069b478917b375bf2b84a046c390587b0ad01000000000017a91483094cf1c02810bf484d8e143afe9611111aa3de87a1590100000000001600146dd98d894d43927b65005dcfe0c57e286c5bae5904f42400000000001600149bfc0ca5842ace40b8b3a598588f15ade35f33e1b5ae0100000000001976a91438db8968bc279d0326696fefaf3037595a852ab988ac2c2f0200000000001976a9148949e9304aabb83c575b0198a85c9af12057b1a588ac03982100000000001976a91451b08bfb6bf69fff1d0481b423f123444fc327a188ac68f164000000000017a9141f884ec705af16fdbe9482a759902825021ea48387c7b800000000000017a914b41334de0f3a124ab9fd8add56f8b4f3676239a48735ca13000000000017a9141fa21321c66a56866fa7a830c8e88703b094720e878eb1d22200000000160014afad386c83045e83c76e3567219bf1bf48e4d0220e200500000000001976a914a957797ba74c795c1f581ae2df9f5220cad0294488ac02483045022100835d50c9b6ddb665f12e4e3718534cffa1f6fea5d7591ab702ca0ff11a2bfce60220011f99afb12d8a6394ebc95ca7d422d4bcdcc825c5cbdf844db1ef52c3a96ecd012103ba14ff9d451c5105b6f0ac4001a6c9f8a24d47185cd4363950e173277e6aa2b0000000000200000000010379eba39401cbb420a6510a43e8eace8da6ee20f24adb871ae8590ec4ba65b1133c00000000ffffffff8bea2d7f96779671261d220e836940710f15b7c8b4a96e3b1477264dd76445c28e00000000fffffffffe0799a34b9dad871375b335a93c7b34c95a43ed709fd749cc46c97795f1872f0100000000ffffffff02eac24600000000001976a91435a0d0683fedcf4784307def9ff412a07ad5234d88aca64c00000000000016001466d433e08d65b8ee0e84aa316374054cbb0d0edd02483045022100ac81661eb347d6db8c62a4b74910f7b8a2b348d36baa7b7622a377878dbb238d022002c4d4d018820a46143c3edf7d805de61c721e5bc8329d8b8884b8ab148863d501210379e6996ff4443c58aa7f23cbbfd97f1e470bd4533aa1f7f6a337da2a109d8a7502473044022038a3127078a97fe0623355555c1cff2a2860efa1f9ef464aa7fe3473ff7f9bed022078ed59948b0de0b0656186fec77033d4137d8ad709f2b5b8fcf0603e06786b6c01210253340c0646a794d69c8807278188ed8209b78636d01d1a412bcf814c5ffdb31402483045022100cad991b6fad01c13e885e2aa8c7bca00f422a1ce6f2d97b4bc8e1bed6dd71e12022059bf34bbf32568c61650ffabe95e377ebad59651d4071dbabcc57c458cf782f90121038dd9b38b8a9707dac50b88231d534d9fbc1cf99e220c8db655861304c3147b99000000000200000004eabe78f0d5016442fa142dc944b2bb7c5725fea04be882a89ebb7e11c5cfbd7a000000006a47304402206da523fba2c0b9bf075708de90dc74fe5c025ac6cb8ac3b95868768f29702fc502204c4047ef04a0d0d3a2644de2223562c72e059220edf16d9bfc91992d3c4d09db012103bab665f51d7490b5c9b893ecaa0c240056c13f4ecd50c838c4397e7957832941fdffffff0652c422ac76c69650171081822b199e75c446136315705f32d67d85a760f0b7000000006a47304402200d916153fe96f62e8e0ae46df6886d69998000c828b0a91247832649c7ba2d7102201d3e16a6c0108a002717c4d4e7ba83bf55a351c5f5d75a09dd99ef14cb1c88db012102edec757c1d77618c7ecbf847a257c39b849d105f9df533962217d0aeba0831affdffffff8d802cd75ddadfe724ba487b6e76efd99d22d40ca3b493e74a701c2213c292c5000000006a47304402206671909df435bd511089ef7e84243102e44dd226a2fec36bc3b3501065c73b8c02204892942c62f1d550b5d455fcf2c48059b48b4189b103ecee1017e143d1699ac50121032ab52bd3204260029670d2927400edc4d05458ff8340181ea3c9ecbb963db388fdffffffd5f6f62617d52b222e37e94d5de9eb0fc72c55142f88440d954cabafcf26bed0000000006a47304402204ca716168d2f0b9cf88c4154f6dcc015cab01c5d758788ebbe34622536ebb474022052b12cb0650a2f58466b641ccd8b9373d6b96d19e6b6f1792b8e2c33079ea804012102739c22bcde71de7eb2c666c09cd12c5a02cabc5382551e9aca8598b80e542048fdffffff0218920000000000001976a91476c02f6294f93020a905515355b6ca5519ecf13588ac70640800000000001976a9141ddfcb2246dcd826144f8612e1e8128a219b6f8888ac01a00a0001000000013bc21d2fcdf8e0059f5fdf0dab3f9983037041db35c5d11b7df715f14f6cf5821b0000006b483045022100f6fa5be61b42f7f40afa594cbfff0ccba9e93cdd383563998f46606c6c531144022074595ea55f7935f831137214580343df3fd098fbad7c32714340b67c48b5b3880121037a4d64f1dfbd362ac586a9d217ef58a86346300e4c6d10adc753df1f6d91bd08ffffffff021c2500000000000016001439f365ce25ad5cfebee5745d20d7e75d7353ae28d0300e000000000017a91441d1143fd79f5ba03f233c2b9502c2decfe72b2c8700000000010000000001018864f1666754df626f67994046ab8db9f309c0bc47c9fa85921354581352d3b51e00000023220020e823374c3e678aae294c6c87179d52b3912f8681454821f42a193aa7e4942a61ffffffff1d3c8601000000000017a9148f26374018c1f840e9c875db03392759abf2909387a0860100000000001976a91494759c04f6a9568186c164626fdfd3a4b48f1b8488ac85870100000000001976a9141a324b27e2d668cec6bd2e13c7ba73ede1dc416788acb2880100000000001976a9149b53e27cfab657045d520d58ab4d48c1b4dbf50c88acb8890100000000001976a91463529dc1da8bf1f542b9a0697a132f42c851ac2388ac098e0100000000001976a914e1f6ccff5769700644ca034b275a9e513cacf93088ac4b8f0100000000001976a914c2cfc563b76023b2cc73fc3be1814b4f7a187b6988ac23ac0100000000001976a9143ca529221e7b399d6e9454998dd8efe9bc44202b88acb0ad01000000000017a914d3d908bfcedd4e25d080f936fdb0401550a8c09587a4d601000000000017a9142c121a09b872c7cb7e891253d7f66335ba35ba708747e201000000000017a914eea4aa87954ec5be42208b828b954dc59a639d2487bdf701000000000017a914a29e81e06852fb251236a4c691b4f994bbe24f28875c6002000000000017a91422b0a7bf40fe26c6a3d1adad837bb9061909dac387948d0200000000001976a914e8218d04df9bb6ef788529fd9fc6add78ae4d04888ac7c440300000000001976a914335166e558af5ff2911fbd315d759105dfd8374d88ac2e6903000000000017a914b4d9bbeebc078e3f0f2fc9c2bfebb476b73611bf87ae780300000000001976a914dc1fe5450bc4cf80a709d156bceaaa51c360f8cd88ac02b603000000000017a914ac189b8403a4dab316f07219d77c8a3e3465551b87f2cd03000000000017a9149a3b068d08352ee2bf0b7a49452f9727b1d4f5da8794310400000000001976a914236a3976630567f18fa2edd7538eecd7129d25b388ac7c930400000000001976a91489e2a68816737a7599acd8eccbb142a7a203299788ac32990400000000001976a9140197ab31c96245ca509f25627a52da9abfc7202588ac6aac0500000000001976a91475f03a128e2257b1cf3aa3ff3529faee29ed6f1a88ac598f0700000000001976a9147984d16be6926d33e45ffa5c24ef108fb75258c388ac7c8409000000000017a9144566fafbd83d1f6b05b3336cde6a5757d80714ae87dc410f0000000000160014638c365e6a5d36b115a94685c0b98338b0866c32421012000000000017a9148629b8fa50b35a99570f4feae15d4bf98ec725a1875b4a2700000000001976a9148ae9c105f7d2e6b7da2f1564f9e474d0d2ebb66e88ac4f036c040000000017a914c8d61efc09354d352236cc76312dfcf95e523cfe870400483045022100855941caf4961edaebcd1e43c5bcf2d03e7bfb03c7751395c3d13c3743baebb0022032a284ab4485e79a9a5940b4af11b584936b5d33116643256d2f46783521884b0147304402200b09332b26f3f2f1bedb5dc7ba2af2bcf5d0e28876e79ad7f7be2f9ebf6ea89a0220147a4058dab6ba7a9283fe7283aaff3767f5c90680e23589d60a7c083a0cb41301695221024169c34ea9b82b1255ad0951fe20ac1ebde056ca77f948ac501791788dfe25c52102ecdbf411fd01658def1c4a19fd2c09c25b185a1d9ba67971f0879fa62d5af4da210248e3e95a02d3ad1227ac7a9d75c3f6b24643121cbf5346ebad32389a06435b7653ae48a00a0002000000013d49cf53cfd5b6df4655ca0dd51e30de135e558628d4f3a933cc0f623251d700070000006a4730440220293d139e2db0ad6c2d6251478e731f626f0296b285ec36c8130ab4e747a4f18e0220787a16d8f222273cf4b05af1762a4cdd291664938c606ccd650a3e6425eb7cbd012102e33847eb3afad6d5169caed9ca60808a4fde78947b116c18bb1a5d9df2c5ffd0ffffffff01809601000000000017a91443382fba8833b2cad2724dd97d3b6d665b29ad3a8700000000020000000001023f031c0e9a187c778475030198856d987e2ee3fa585f4ea9aedbe45c69d9ee6800000000171600149cf0d95ca9b2dc43e908d42e358f9d5bfadf08beffffffffed0e9a80964e3ce161023e998add9fad838a1a42029c395ab9252c8f1b9b4f6b010000001716001468ca214acda148fbdac58ac4c3b62a83b6b74d1bffffffff0268881e000000000017a9147375475d503c3986328537071632b98fa004ffe487955605000000000017a9144681b77c8352d4be876675c79b4286ea80696a78870247304402207abe9f0a60a67ae519dab4145d64c134bfce05727e7e8d792f96585d4eb69c120220313844b02d6db79fbc7876e5ba4d446d62910573f41a29e8a7d8a46e333c76750121036628447f33dd1a1e841c7df1c2dec405ea45c10a86483ca669bd44a758d54e2902483045022100e66d7728323ed456ae949f21caa654640532cfc2fec562f41a71d3db272225b902203ea68156f0b6cb20e3bdb7bcfb949a947f17e458df0f19f4e339721980001fb1012102f50028e6809342bf8ebfac1b2d1d6693d4c3da405a6bc76eb4c0ed47571cf7a10000000001000000000101ea7dc78923a4939d3524472969aa9a64f7ca06b6f66a577faba8e244bb290a2834000000171600146154a910d9c9aac84589426d844d57195c383845ffffffff01200805000000000017a91435ebbd363e3994cd4775fdbffef329ba21fbd22e8702483045022100f7326cb6148087be2ce2febd061f833b28b68acb17b573bafd88d474628e2e38022045ccd970deccfc80b3b8fa4c13419ee2bb36ccfd2f97ff3fa04ef5978650c5fe01210322bd3328d402c09a0ff2b241b37e3dc5902891d8186c70611878e32d8e35aad100000000020000000001034bca1905f4767f07253e507bf26b215967d4c1859d3db802622dcf1278aa2d000100000017160014762b7427f76e42776a5d32fe0a14aa2ac61c36acfdffffffde7c5838bc647a87f9c871326e2a39d1e39fa6cb1b56281fb7500c6f521465d50000000017160014e318b0cedb745a5673f3301477e3b20023178d18fdffffffbb6ecd587680bca96bfeec04f034b6781e93a05c12b83776e4fc0a652f98cfb100000000171600140f75286919fba0238020409c1e5f56f0f1eafef2fdffffff01bca417000000000017a9144c3b34c84f04e3777bf45e72d626be9c8209886f8702473044022048224970b9d995fa7f722517a589676013fed300df7bf17397f1d056c4865de502206f52de291617459b56c034a02832f937f77841728deb10a69f7ec6b44f11c9ae012102a55cce9da7590c162a7b0f52e2c6c8e908fa0c6772644581762f9c6e3ab931590247304402201006ce8afb7fd0e88a0b8ddfdc6c17c439ede6edd1d0426f84b2a1900edca77102200608e9f8b7f80da24e5672e2c62d12bcfa0bc40a1cea23988063bc7c99b2ce7f012102305a1b49c478b91b38c92628964526321169b191b38af03df88cdbc7fb10ddd1024730440220604191454ef1786c9e8cc8630ae1b65aee8b6dad3c81f8b6f05d5c120a2c05cf022033e3a63118118a00a4cb77dd57c6c13974c554a1919dbb877c4a01fe7a9cf700012103dd39b395eae4f4199d63263ea7499b101c0b50cd0a6a85e25ca907b51b2cf53f48a00a0001000000012c57095f2b7052d5e67bdcbcb89cb84beab0917cb77c0541c9a2189229adda92680000006a473044022042738a4964c7c0c8f6179b04e3086b144649032cd9890169f98d6dc889cd0898022013b6e874dd3355882ce3fceab185b2e3a91d8eb38c18b55d54e943ee64d3ad9f0121022ba056f6699b1b659453a46a4fb7a127808449a74a9cf34eb5e4512033e1fa8dffffffff02369c1000000000001976a914df6b3a6631cb858fecbc42db01c0c8b1fa4c9d3e88ac8ed81000000000001976a9141d5a925312fc8b35722adaf4bcdca251c57463ba88ac0000000001000000015dd07da86290da69a1940f92b46946d09dd7b6f96391ab044d1c33042d949455010000006a473044022068cdfdba3cc3918dc133b58811d8253392b2bfdb79f9811f739391fbdf9cb7210220783dbcaee15fcf97b6db68b16d6004e09c0c9b91749448892697a8a9b06756080121022463169a3c5f11f99ddd2c655586c8e6d36c81c950ff93113a6ad561cac7a42cffffffff02ed1f2700000000001976a91421db291ea72641d4750c37b6e677b897fe99a21888acf9040400000000001976a91412ef8a698efaff34f4c66315435dd1f39477eacc88ac0000000002000000000107b45d04ee182e32e192d1cae6e290bfc805c1b204968d300f2172a1dbea8288c3000000001716001475f3c3a5165a25a8f99beb318e311fbb392ea49bfdffffff6645c5a80d6db1ec97f579e43b098b093986de0193ff898ff272473fa637d4a90100000017160014541a5d29eec60e80e393e2a2969c452bf51300a6fdffffff86f160b91b4fbeba802ca301e64d654e40b56e8ae19be261b6d77f291832e9d84c00000017160014edb920aaf8e2f1c8f6a6d494d08381add711dd68fdffffffc0b1d7661dd7fa1c7c9d67f0ce258259cf175db9e9a8152682df626d4c9581e60000000017160014493a633c8a4ba037df4e428f1f16922634a425c5fdffffff00015de1c7709d755842d09897e61a97a9006c60c3e481d0d737b2ce5a8a344108000000171600140025b3761d2306d262fdccff6baabb3b029b35fcfdffffffd2fff10a37e2d068caa229bdcf839f662d7991db7cb1a31a50436139752fdf8306000000171600140025b3761d2306d262fdccff6baabb3b029b35fcfdffffff253c0ba2a6872e8ad25478a7718409d231ab797c108bc70a12fc0d96db0477440600000017160014350fd445afd238d43b3914df08eda3e03ad1691afdffffff01fb6897000000000017a914d59853a5a3c0371da5f3cd6358c31b7d3031591087024730440220026c9b912aaaccb8b41d47b662e16191f2d6ffe1180dfcca9a9b43344cf5aa60022053faf4426595749ca227446c69257dcfb797ed3b37193332ca84a1a54c2b4f70012102ca396b4bf190e798e512584d6070283a1c9443fc431126d2146e289adb79f8b40247304402206d783f9873ca2fedd16870887350a8a547748b7a5d6215b663af7ea82200c93f0220268f76a527c96de50d0594ce47c8dd47544f48a039978856811902ef6ed7adbd01210363a398ec67c544d5501b8d3c7acaef99c79776d7d319946b96e5602d1820a27a0247304402206a8cc29e711934f66af4acccea8bf9d32004afe1cf3fbae8a0e41042513a82d702201d5cd3ce7e2cac23cb3177276dbd81a76262c19dfcad695426c7c02987eb307d0121036bd7ff01b062a7de740ce4f277a55cab5f197220bdaacd32f678e53f9fff84220247304402203b24440b5c94fa5d0f79ef1eb5b4fc69e11893a05d0c69e6d2dc2e56bb0d2a9902203675c17899328856ee3e28c1ab58f113bab3d18d47eccae08601cff11acfe9d20121036e1bef8beed272556d8a39779165a68068a488b765bca30cc506be32aafb58330247304402205d63ff5eea33f18b1add968d03148a045509ed9b8814134cc5b4a989c1381af4022049ba4c7583116364299ceba9c567c02366c4cd4ff29e098d78166807b913dd7d0121021c1fbee854063fe739cafcacf6e2b0eaecb916e44241eaa75892664125bbdffb0247304402204248a20148494eaf9e6199a6b73aeb4fa464d4d1b1db3e7db77e477c766a84a30220221799b3fcc0f2ab00e17346b3b50be94e501b846beae678cce545241eda011a0121021c1fbee854063fe739cafcacf6e2b0eaecb916e44241eaa75892664125bbdffb0247304402205ee816b1cc6434ef3c78a039c0f62afd1ea705a1ac97e858b3baff37aed75de402204eb1616637364b752ae9c275e08cc7f6dbdd657b8849f6d36b4ce37a0e6539b201210272c8dcfcf3a3163b22827839151229862bd0ed7bef7fa2a561fdd2c11699af7d48a00a000200000000010113e94aacd2bf534f2a886b1776f70d5b64bbc51dda69719be1f0c214e8f4fdd70000000017160014ec786c7d8bb67d7ab66d86f220f782d7df436d49ffffffff0103649700000000001976a914fbbb659fce8ecbcd95871b650f529f165f4daa0c88ac02473044022067a4ac878fbc075e8f751af9078cd02122f4ef9588ef54866c499cc9af3109bd022022373aa715658f7db56c4cda9bdcced5965409fdff77d2be3c76605e327b145001210300db88edf321df34aff3ca0573f33010c55ef148aef629211bdee69c01942ef80000000001000000000101c5d240495a328ac11f1c2fff5dfb8627d8116e847d6a50c9c59c71b88ea092fa0000000017160014625cb29e3b27e32a30aaf60c8e09136b9efa705fffffffff0235e133000000000017a91414db0e69c63c082c66e93700ea7fe07b48ffd42f87f14c05000000000017a9142fd9a0d25775da63476b48c316db4c8538fa100687024730440220030e12da50f812f18f6678da669adb99fdda1bc22f3ec557beaaf49836b28af5022015647666dfd304c867c8dfc7719a1227e8f0fc254872190584d1d2c1ae91309b012103c07fd211c29b5d618333f1318af23f41e7afe49d25dee2532ae6c8787cb692ee0000000001000000000101dcd1ca6e71b62bf06a9a2741c4337ebd8cebfe47c6f0bab0f53e133c1c701f670100000023220020ffcdf21214f1661cc3f29c7739e96f3d8691208f28a26e28d18891a8e39419edfdffffff02807d06000000000017a914470292261e769bfe1df1dfa64f46963bbf0ab6698736168a070000000017a914a006ccba66c3cd5d2e682d8d4d721bd53755dc93870400483045022100e8d26285625a97b704c16425e68d5e3d42c4ed38e098868efbf0da5f8aabc4480220586fae6dcb7fbd326730268a4d0686fa6152c7a142490cc4df9a972dd576af4f01483045022100d1a31c4614ef209b8d4119dd81736195e0024d9918f095bbe03fb7b9a9aa33fd02206dc0ba1e19cc7cc131e0657943805f9da6960e7a219f3fbf63a8766e5c3d7df4018b5221023a7b47fdec0634bfd44236f03a04738616b45298375262556178f06e27bc090c2102fdaf047e2cabe4a543b3bdaf7704e4c15a2325f452c09113b644168713ced78521032bd96f88cdb85721b520bafcdce72e80519b3f089c56276574665eeb3d3c3514210366f003715b170d37f780af1a1cddd4f0f02007037e9187a3b071e4e20a362bd854ae00000000010000000001016f5013e1fd06cffc68885c3b74ed94ad9030d5f71884a19a974e4540265c3df80100000023220020bed1cde99566a45ea3becad703841af152f71d001a830ff425c06d524c3b1834fdffffff02006a18000000000017a91425325a534522b41b2b570efbb80adae5765309fb8796be22000000000017a91417a788d704df80fc91f7e00292ba9395c8457a4c870400483045022100ca1e65ae610172843fc025290ddebde571ffcba247965ca312719bb3e4214587022010c67dce90bd0e938cf2513e991cf66b76ec2dded28eadc9a2e13b75bb65ac1901483045022100c4cabcfc4a9ed7156c0a06329035cfe91e9f7849b9ad0c7835089ebbd5d8566d022035ed5808d3a9544dff356e430d79050c285cb4870ed73d51dbc6a31253e94994018b522102b175777044cfd556a3a653b9277a0f13a66ad3ba006031df5a6a23d5a49c020e2102f00ee2d984902687026c20d3e1054f8e05e732d5b78bc9854913db88589707e32103a7b2e5c20e8993a9ff80be0b4e19e8718c0396afe668d01263c887e93331e0382103d62c309549248364b95eb710432ba28257d91c99304ed5807314ddfe0cd3571a54ae0000000001000000000101383de4f115e129ed65be5a7f4580baa361b8dfece86db9977b36ae2899ad574b010000002322002029e74387adc3624b88b2720ee007b1cbf1bdcb52355204813a02e758e8730c02fdffffff02a57946010000000017a914478bd63c757114e09beef01c1aa879f6dd760d6987b18e02090000000017a9148eeb183813d401e54bbfdd038ab7e87da85fcc5c87040047304402202c2f6c20a9e612d64c6c2fafa998fea21fbe24f9b9dfdb7e382c5d08ffda479c02203458d91d3a4c8e42ef94a83cc3b3b13002d4a62655ff3c7682939b34f7e68f2c01483045022100c4332e19f198e663369d3b5df3389e820d25c9f028667a8bfdf7064640d13988022046ef5cfa19436f31cff7cc97ecc7e5eb5e972fa543b7694220e7a9dd1cf8939c018b5221027720f40844c2dcc2a9b1aad205144d88ea1eb55111da310c8d8b582d33f33966210322ea70e971351b97db7f7ed3ba58b2ecfc9c18a00075b7ac57f18845911a94fc2103b76ea9b6b2345e752712e104006fe0fc807544cbd38904638232aeaecaec22212103c1794bde1cb5cc4512d46a9289d90122dcda6347b4ca3cb4003af5b83f53260954ae0000000001000000000101733ab4c07e00d9ba9d4cbc956a74bd8c1f5b67f1cac5acea4c51064b759e1b5901000000232200203701ba2621842cdebebcf58e37817ff834fbc35a537bd5e698418ea328efb7d3fdffffff02d81e06000000000017a914936d6a46ee239e31280893d75442b9574953150387e7d7c41d0000000017a914d12cc14c93213f1fb7b3454a3661b777b612d7bc870400483045022100dd69b67b680822e2afc1ea40f30049e1a252dcec1b30f6c3b2a5e7cb657fef340220619d95e4924e6b9802370d00458ae73520710385a0a0ca593109b587f2e8dd0501473044022029315f7f7f505dcdfe511357f13293c179441129ab6b31cf69a8fe6b2b31d52202207a63528090da95a1134c93d611b1b5493c37330f195f3708557eb1634ba98ca4018b522102ebe477c9fc403d75ac57fff3bfe6c6de22182db5f050b3f1fdf03b82923e5d862103387402bb5705e00cc7784e9b7680f33a8d6c2c66e11729101dcbb9412985290721037e1bcc6fbe25cbdb7bafd9b6343158e468ae71e153122d8dbbb48f4ae81f4177210398b8cd0a4df9fef78af336d047b6d3370cb08745f4dc76ee1b86e8f68fbd23a554ae0000000001000000000101130bf295ae5ff8d0f8e3281e1b34f1ba524304b406e3872e583530bc487d15320100000023220020bfc54ef9e97a8c86e508e2c082594680edaae65212672ed3f8020cf1b273c3f8fdffffff025d700b000000000017a914c0d3b9f6898e5c99f9c3d46181d2b2992f7924b987fc378e140000000017a914ebc36e44199ebe07e2d8ce47a1287611151e44f887040047304402204467b6eaf1481696fa62b7663a818b0f1242bb40c701a15775cc1cd54891c71c02204940e531c83d6603531e30133a678182c375c540255b1feb14564ace21df05c201483045022100c43f7729b9f1d08416d611439a90a81bca310611dbb1a0910cc389e079cb800c02201b0a25140effdb598d6e8e6bd44e28841ea5981775d5a36cb14059e86f52db98018b522102f7be50ceca3320ddf39f2c4651e8521739cb689a96375b7126dbaab613a7ca2321032390bdc8c2ef18ed529f258b31cc0f755263be304bf7b98be7857eccece2f5f521033fafc82182b97db08d64ccab3ef023e70da59caed16334b987393bb879f1585821036b1375669f44dfcbc6bffaafd80c3ef9df41785afbdbf58536399686813334c454ae00000000010000000001043a7fa2098e70f0ddf15a9673508cd5dd1bac5424275450311260ccdffa6a674c01000000fc0047304402202688cc2d419437de24f450e98256a861789cd972bf2f37b99163d9136daf059f022002f7a51054d5930f28eb6e2dbcedb5d67bd7d5e2f46f8ab8989ae4553adc38c30147304402202a0a74cd41bc69f63df329416e4eb4620fc27fcca60f0b8c00db94c8c7fe0e0502201156adf83d0eda98bb64c8c96355432f59f5591be2a93815fb5ca596bf18b950014c6952210375f68ff50fcef44f2bf5d0cd13dbecbbcba9ad3170781961b5fd1008096dda602102fd63e7682bc68e1ee9ee0422d1d37ca9c2eeb635488d5f3e148fac8f1dbe96082102cc4e4b3c6e734a9a3054af2f032adfbd02dd434c7b62a51dba97c0905a00149953aeffffffffb5392b043904af2b791f415a5eef7c5cbcb0f3b1bdd28e57bcbf6b6a1c4370810000000023220020eeb9cf137ec4e2bd98b9e2116d0b9bb73d4cbe78b3ddd0514032d20fe9e1a8c4ffffffff588b891415c09bde72fc221ed94a4b7470efc4136dad226e48863243bd4dc39500000000232200209c3e93d40a23de4e60583504c3b9965f33874c228e6957077ac443965fef8043ffffffff49b7b7a765796518cf9756b8fd8d3ae3a447a4e53047afe7227090521f8d96ac46000000fdfd0000483045022100f948c74bcf79c77a58b4368a182facd17b79fc39cf1aeaf69b2ce2a6c6bd91830220288b8578fba84e61b941c317adee9d7fb1459bfd72a4c80ccf9afe5917ceb17c014730440220684f0b52e7c345e061fa40f7f29c021419b6f841ca41c08c0be7112129f7157b0220360d7f0b6d74be4f15359319da2edcfcc1c8740faf9bb45e9c001b8737d3dccf014c6952210375f68ff50fcef44f2bf5d0cd13dbecbbcba9ad3170781961b5fd1008096dda602102fd63e7682bc68e1ee9ee0422d1d37ca9c2eeb635488d5f3e148fac8f1dbe96082102cc4e4b3c6e734a9a3054af2f032adfbd02dd434c7b62a51dba97c0905a00149953aeffffffff01262e88ee0100000017a914131d552a56e709420d601b5ae6b1b6fd6fd6f9698700040047304402202fce2de1cb265e934362345ba21877c4cc5293bd4d7f1c04b2f439d1cac6a461022069a8f352a2ac825bf56f95a482b05cc8bee368d2290e9fd9ac073feca5dcd8230147304402206d607e4f01467f574e304caa97e1826f2c52e89ec3ac38ff0ef98e63331446a202201ce3c58d983cd84d0ad16da42885ef28399e8bd36607abec9ad60c53b87b3a71016952210343097aad39f90f89e8b50a17d8e20179992bcecfc667cb7afee1e905d0a5ffc921027b30da9bb6a6a7840ad50c45b318fafe0128059bccb303dfbc13536bcca73eae21027fa028749df23208fb57952698741f90a7c0fd3524f762bcc77da3e79dda61e853ae040048304502210099a6c8f65afe61a47c26bc9d7cf5dbb062fb469e9a5b91c10ce6e1a1bc9f543602200a7facb6822dca83c70b31025faf7594b4de289ffbc8d421955d9f839e38b7be014730440220013e99909af4722521ce5ba299b0d13ab039af120e91e1690c73583d9e7db33c02207daf12adfd3f4ed2ce6a51373b08521d67112192dc08988783af42f832c2a9290169522103976e75248439f37a78d3263c7b780bf31060848a6e66fa1dacd5f24ed9929437210269d4a9aec4518019326e243741511083426268f1e4f80ac7f6937fd772e294d821036979619f0fafac415737e6a91e052ef964a8afd9d0283df3c63985aed709cb6053ae00000000000100000000010153423e803cbf48dafd448ec27572c4fe4d5b8bafe53707a28b316db2e5a06e230100000023220020115c4da1a0e6e7414964e3e6813b25fcfa9bff98e9652c33f6d11512e4676d7cffffffff02a00bd1000000000017a914c9ecba5048f30e56c1689528624a607692c4521787bdf570000000000017a9140fb0c20eacff2965b1f2594c250c165dd4450ec4870400483045022100940d84f4b7eb4caef61584dffe9cb9332b70963dedce413d100550b1f7f129a3022022536aa64a8099197715dfa29e068e07d5ce25e72d7b2f9d255b00a14ead33a501473044022053e9635f14e0ed497e2fba28d238d6419dc8363521b5fd0cdbd11ecc065401e102201a05696df46bcc2569076c7d30034634a9822fd7dff71fa5d38f4acbbb42ec010169522103110b6a279de37085c775c3899fa8bf3c7a734d346b86be7a6dce55a41623b4ec2103ab719ec244b513ee8a77598ef7a5177e7091390a52078874ed74b5e79d2203b12103b4e0d0ba8bb4a77b53175b02a8c311b57a7dca6afd5f20596d96c46f11ed827d53ae0000000002000000000102b3f1762dbf4741b86cba28399bd0aaed95d9cfff677ca928878f9d3d97bac8f90100000017160014427385bfc0fd72cb87c1cdf459fef28ba935e6ffffffffff56c443b2b13d1be316dd60c7070afb1fdb8c4a5855a86037573f8d51b4ec886b0000000017160014fe7bbe67b585e9793e39f5facee04deb62b6796effffffff0200c2eb0b000000001976a91406cc9254d1337c2bc93b32895bce9854a7ea109088ac689d66030000000017a914addff10151b48c89a9320d8f745f822fedc08abd87024730440221009716a58a86e8030d779bee5e2000534acb8c89f14f1930e1c061076b8ff9ec11021f6f98a23bb839d8deae110e6fce4d1680f04d8f00194ad9e91dff5915d9a70c012103a5ed074a159e14a35eb3830d7355237d5077d55d5eee3b23b0580838b44325c10247304402206555928030d773c05c1d1404064061ccae6ab506daf8a3271925fc0af4fc02070220102f2f1e2a17ff43d9c409f3bf49787520e01c9316ded2bad5f7863b3d97ba5b012102254725c7aa4f425be81fb2f96134a8bc5a021e4596be4ac11cbbb1c1cf324d3f0000000001000000000101da8bb35e94363550e7e34cfaff5aefbe4f4c0b0c4644c5bafd959701bc81a6770100000000ffffffff45b68502000000000017a914e3fcb470ae1679a9603e9be71c452e6bfab72c318735380300000000001976a914fdeb4f0531a35ae45ca8898336c5e6adbcf9938988ac50a7090000000000160014250a7349c6d02be065c01aa44f4adf5be95ab69488a01c000000000017a9145650b4b59039a2bcb12df43b2969b43722e17117874d260d00000000001976a914848e5b7135d011bd96453167b4475a3ea13baa0888ace95a00000000000016001415d96cdca3f7ab1fc715fae669b5163532f57a949f800300000000001976a91423747b54c03880d10412476d61730b9569b696bd88acdaaa0100000000001976a914ecfcf9df4086a30599f13248043df0c3af1da72288acfb8301000000000017a914317d64d48b00b086b06ad8a75a1b75a78ec1452187724c01000000000016001416cc6f3a170cc02d50e16d021c783572dce9b0193ed700000000000017a9145bc8c18267aeb6fc05e6ae15afb932977a9046868717af01000000000017a914dc92069bc5f8c481ecbc5e5556f2cc91c1fd7ba787c60701000000000017a9145153757dc76859d35a0a11c5629e62d8ce9813d18782d901000000000017a914c80df05e6c0a494e8b06891a565616079c19eabe873d8c02000000000017a91421571ea0e73cd5672382873794bcd5ae5bbf3abe873f4501000000000017a914f1c8bdca49906a0d01cf1e1e7abb0a7e859318a58780ba03000000000017a9144cf49d96d6f72c5747ee250735b79a9ddfa0b2b187f228de03000000001976a9146e019bc83aa8e94a3158e171d537e376ac4b3d1688ac649b00000000000017a9145b02ecc014c3a73342a9b2c1f140456b82fec7ba87037d00000000000017a914f8c72edabfe2b8ca6a65226b1330326783382fdf87508502000000000017a9144ec3fcc4f7cc22577522f5e9a09cd43014fa52a2878cd700000000000017a914e82a5efc541671c9fb901478ee3771545245f4cb87f18900000000000017a914cde861a4d3bbc5fa5e598604223cc4231b482ee387648c0200000000001976a914732cf229d3dc3b9b8a0803ffc07d4e364e54aba388ac0974a1000000000017a914d41cfe11faa7291f92906b83f74f1060fc63f51e870d8300000000000017a9143a431666f7212934bb454849c16fdea8168a204387a9cd020000000000160014667f320d0ce92e974f83a5dfd248eb35fffa1ca2ca3200000000000017a914ec00bc61eb3b36f47d90f6a38caef6940e5ab0ee87605b03000000000017a9146d18db1e7223616423bfa11a89eaf91bf201eb068752180100000000001600146813f6b12c4d1084046ae65617eb9c5a1e4d891a56d404000000000017a914e8b2b797ffea7db9b6701c4e74f861b489e8a09187cbac0000000000001976a91406b09b7ba9895737b9fb3dccdec88871458646d188aca3fa4000000000001976a91409342ae9402bda031e0d502c26f0703e3e6a190b88ac83e406000000000017a914506de8fb14225153ac2f2085954354e5f64d6f0087f1e406000000000017a9142d8426e7ef0c3543c5013e3c6833533a9d709be387d6370300000000001976a914a8bbeb27d3e193da0045a02a73cb660956aa3eb988acd7160a00000000001976a914b819ab4f519e161b9a8c00a6ef3e5246a1fca7bb88ac78a60100000000001976a914e7056730a33d0cc8d03988be0e7fbd9a3ca8b31b88ace94209000000000017a914ad3a0a179da4cea12d7e2124af0188c39e04e69787d8d60000000000001976a914b17b36526d7de155c09e7df0e584737499e08c7688ac7d320000000000001976a9140bd5b7f116333ac891ae36c6375c84f9ec98975f88ac265e03000000000017a91402389792625609c601797aadc1a2f9a1c9e9a89487ee3c02000000000017a9149f489fd780e0f988f7a1f2ae3039e158d03fd85987b17ab10000000000160014378b9eda380051ee13f90a85ee70dab21c79b8ce753f06000000000017a914b77856da2e8e590fc8a896648ff5e4e166ee52578720b00200000000001976a91481816a2cc1a5aedbfc4c283a73dbbda1b387a1db88acf4d003000000000017a914de1d4b750084c50c120050358042adb8c72eef1d87a05a3200000000001976a9141c038d128bbe644e141fe629185b8ea3685f82f588ac90c60f00000000001976a914efc188aab4bdef4ef5a941f61aa7407bf5549da488aceec90300000000001600141121d9f84b5ea07e9143da19a0101d041d5beaeaf25c0300000000001976a9145ea3e77e6152a36a3f1fd0d95c33345c2ff5ca3f88ac75383200000000001976a914cdf226c69dfc38e1ae85f508c777b3ed2ebaf64188aceb75120000000000160014b672b2e06f8c50c694185c5d44e57979958f390867450b00000000001976a91409fef07fca5f0dcabb6165a7237a7edac0af6eb988ac14ee0a00000000001976a9143681a13bb476e642272191ed3727bf62a54389dc88ac72af0800000000001976a91454a61925e0f88815d8c975f990bf53e0c90c0deb88ac722a0000000000001976a91470e86d8962818d118e30713f3c67ee42166f5e7488ac79c90b000000000017a914d1f2d29f97f4e3fa2690bb7c4eea7c560bbb938287e89307000000000017a914619e0c73b46f41d9e85ae424da4ad2a7ff763ad087a08601000000000017a9141026d6f5bfd844606102b35d60befdecb0ae3c6087fe6d04000000000017a914ef036aa38534a0b4ae9af6e9f341abdb2b5198e98735180100000000001976a914605ee8d2c843fd6f90a87cebaba83d1ffc79bccf88acaf4d1100000000001976a914a319c8a16ea40a49ca5c5f33c6eb6a24062a304988ac7bc903000000000017a9144c817aa2ca4c8921c2ad1906175e3a96321b29c78710cc08000000000017a91408c30df4a94e2a6d5d43ad09611b388f0b044c6487792e0100000000001976a914e98d6a385c83d5f872de3011dd0bb4ffad5755f488acb6b701000000000017a9144599a1cd3592634f2e55ef870d78a3d457922cd787090301000000000017a9149f9bee30e67d0239bafa13bce27b9fac77cdca3787768501000000000017a914941402f15905ad00a0e5bacbceb52ff045ff47f38702483045022100de5e2a9be135adef6906ac9d2e1981fcb1881ba4a9335eb5f73de76bea9d9f5e02201f21b91b78e5ba3b1750716c3d2de464fdaa6817911d6c82f4be76d1b796722f012102c1828a2409b93c16f8a3e1749f51cef63ce7ab654f86289c8fb2b791188e82db00000000020000000001014465ba6ec9712ea226c304f76c9d9aadd050518f19e2e16404ec80beb34ab3df2e00000017160014c08ac2a4dc0e9828dadf21a79ba2b5405b1de753fdffffff017dc803000000000016001451941a18020b8796c06c76a78fdd7617e3aa6f060247304402204b48c6ea21bafdabb903f49c29ca9640815262bf9e3300cfde7780cabbd6bc500220302108cde189ef54c9c13bbc446575939f6611ceadc1026a7c84a213d686346801210214e4e78a32a0df537cefe43cd1a06730532500a1079649e6a51a3056f07f83c60000000002000000000105fe186b636c257cf84d6fd5bce867dcaf0f9c8ddb336872219cea5e4b51fdf5600300000017160014b33622217793e1ee12a5bb999d300908895b681efdffffff5db9cb604d1c958eb234e9b285985abdad575452d58eabfc60c40489afa8ec9e0f00000017160014247ad1da9aa5f64d227c0658f607d547f790a5f9fdffffffbf1aa296ea604c85500a23c7cde62e95abc5e752433f6f940bdc4809a2896443000000001716001438bdbee2dfa7481148a02f7686b5f37ce94fe777fdffffff7b1a77d24803ed3a60df3d57b4fcf24d881121af6a9369e56d817cefcdee949a000000001716001486a779924ab80e3d0fb7e0f96c92f65e5ecf907efdffffffb9026e4280675026bb875ec1fa47c47ed870804c46f82ad02e631fc11c3c1aa801000000171600141a323f8c429e58568fa1b410ef41633e32b8eeaafdffffff01f88a0900000000001600144e54399f8c72c9ca14075b23881a1d474b5fc27602473044022005199979b5c0ca316c0ed3d9d72fdb5b72e6b0c3876300a9b1a0e264e6395349022033f62722800ffb80e27e0626b785d3929d2ef0e5be79b7e12740bbbd288b708701210283f7e11769960c746d60008fdc41fd3df4f1f443a8c2ad406cf895c1510c66fc0247304402206e55b27a139ddb03e9206dfca97bfbeec0ce5734095c946bb0fe15e2f41bf17202202c5e1e24cb56a3697c6ebc89ab02a6d8915b4b63c0ed5d786756ebbd25e015cc0121026f3dd2b358d0ce54d17b02f259122662826b512e6e49a1a07157042eb8765a3f0247304402203f97d4c350c4665ef0c923d7a488c65393681574087a251e19778f4517764d9e022062a66cffbf7caade42d4f7dcfac31c69c89874ff4449c17807b1cd96bc310d4201210240d91f801368c82e48099154ca05cba4a651821d41083eae24bacd890f2533dc0247304402205d9ca1aca0fde87aec0411fff89027109c9ba790fcd7b828e218df8cc819d29102201e31ae10d21998b1e0a48b90a9fbb969f280fa9cdec9424c46c3d54be3e7b417012102312b43428552fdd553ed4154838de44a3e8c25db53e7c297a201e2c5a89e0e3102473044022058c3e9f15d9d9a93c225113231c3aeca3380d990ef721c2ef098a7609502d437022068ca6577489dbbe55d9528e3d928443ad343f8d6f3936ff9d602f51e378919d4012103b69b742ac0552a44646fb873ddd2bfbc28a0dfc752cc25729ecabde26e35185249a00a0001000000012dff9378c7bcf8553d2b557551ee0f90b9b14ddb95e36ff8579a0c4a32d5b546010000006b483045022100f8ecb3228fb2cbfd9c1a88c1042580e85d7a862f4991fdcc0c49d9d25cd186d102201f4dee8074ffe008b7c43e4cad87104f4124df3940739f4903784305b18bf65e01210291a7eeb2e74fc3e83bc40a46075381043881c5bc8f13e78771c7c2ab3d715d70ffffffff02e0c81000000000001976a914f231eff7513ad38dba029b427d14df0db629517788acfd720200000000001976a914d42baedceb4d72b111f94d7a5e1a223804441f3f88ac00000000010000000001020c0f11181573d87d599293e4bbdd2239b1f949af3df9e796b48ecbe84cbccdea0000000000ffffffffddb5a3e5da0e5ae6a7a0b7fd621cc137e0f298625928b814841a02cd1f16e11c520000006b483045022100aa5ee846c3cb1fe23706513bf183e2a08b706f4bbaf75dfba0edb57f12fb3b5e022028ff108bad5f950942c49149b030796eb8ea09fc5ab42b6efd307863906e2216012103c8eecb1d332c9f50ca7878141afb90312d3fc865112f8518d36b31231a55bbfdffffffff0269a821000000000017a914f138c7121d259e5c9eb340f2534d721233ecb05d87795c1d0000000000160014b93f3a7b5ff1cc39ca28cfd181021eb5617f38e9024730440220606c5f8dd5d4187963a0bf758812b0ed050d81ab988b803b4398242e106b3ab802202ee693390f5a7de07de8eb6e4c0c40f5456d83be8a414c067ff95064e5fb66c9012103c4e084bead140ee4fc95f677b7b7a32c564db0c73fec7cfaa544116a030dfaee00000000000100000000010129e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec11200000000ffffffff372e730000000000001976a914fccb5d7cb3ae61e95aba4523be2458a59d9986a988aca0f70300000000001976a91463c8d3bf2ee3014e7bacc6ff822e651e4f8f960188acb129000000000000160014781cc59468393e0a4448858401739bd04afb44aff93204000000000017a914a2241a66f665cfb3a03692cd4537b594d2bd461b8716ab98000000000017a91472377675fd69f923044b809ba7af67d55ffa5e8b8760bd060000000000160014a494d691d2a6a63a89797704770caf53ed29d6cd381106000000000017a91413f319c1af68708b146212db6fb01b52e2dbffc087424e2000000000001600140161911be88760decb43f032c7bc802ae1cfb6d420300500000000001976a9149721f3f7b1fe284722dec02f74506d80fd824e4988ac8fe40c000000000017a914b8ae3713b9fc237cd576b24b40471797de04d47387b36b01000000000017a914906c0689922e19317c5a5c0ece6dd46e5939b2e2878e380300000000001976a9148556e8fb62410c884f06645ee4c12cf6ab67408f88ac3d200e04000000001976a914a79e4effc7c914e97b91a2009c166ba1789eeee288ac6021240a000000001976a914f3e5204022a1e27890c10e38e341bf394a7a75d288ac954b520000000000160014da4bac0a52183acbb90d3bdba8bc2581ec20ae2fd35e03000000000017a91480b14df6194414e974ee499aeaef32a14c7580cf8770d910000000000017a914eb98dd49254f108dd9121006366003a1641cc2ac875c9700000000000017a91403fc3f5ddaf9936f5cbfbf39c5eb2d2c228686c18776e700000000000017a91491e5aa3164aa2a9e1bd8483263ac62f8e0016e598720a10700000000001976a91453ef8c978ad907c64f73731556d34d3daca17a9088ac846a2700000000001600141d622ef2c6de69345cb0467a7e683774ca459b64fc6a09000000000017a9140855bd7b49bc772b6a24e929ba9da43a064b2dce87924100000000000017a914c540509d13843c48692e4b8e5ab95470e4fc1b88876f0b01000000000017a9145ef34a82d8eb878d4f8124480bafe9b14d4bb26187ed8a0300000000001976a914f80ff753ec8cdd9d25675fea230702e812c7881188ac47d910000000000017a914207f7eedcad07e8fcfe35d229a44c5a2a09575fe8756c202000000000017a914f0d338c837c0bc06e279183d52aed198e92d78d687f03803000000000017a914e5ba77cc5bd4e25a35e4798dde39cf83813f5d628739e8040000000000160014bb0522eb5747539e9e45f67b9eddaf2e47a3c45afa990d00000000001976a91474247bea0a2d1b6609cbec19b78f5d0878a842dc88acdb980f000000000016001422c10226d6437d94762d56e32f5797dec9508e0e801a06000000000017a914321f47cf348dc77a10b29f7108fc65a6219b073287ae8d0600000000001976a9145db3e333dba73b53c6cb68582c8eac87b22e7b4a88ac9a7b0d00000000001976a914e4ac15eee812385ff7c2443f8afa386e4562e35488ac80d810000000000017a91438b61aa62c13c1a3938aa59a2378bd58a9a7e32c870c3f2000000000001976a914b99fff21ddcfb7d693fb94d20d47b4189ce0dc9a88acf8a101000000000017a914bce5d28231f7f5d231262248465f5fb84481326a87e55e0000000000001976a9147e3d8df8bde88298a88d80dbdf9b5aebe1ab276388ac0f9e00000000000017a914e2e42de8afff91696e24436556f62ed0a0f8163b87605b03000000000017a91438cc0f5e4a1bba6dfd90bb08dbfb8578a6abe2c387801a06000000000017a91491d6e648ae49d8029fecd090b99eee238224239f87e23203000000000017a914e5c5ba04c30ec6998426f834075e7917af943450870f810d000000000017a91426fb151ef5acfa7ddd911220c4c4143dbd585faf87c77800000000000017a9149b4241f888b5b8c3cd8e2858347c5dae4f68a8288755ce050000000000160014fae1e0dd147ccc7da0dfd344b503569ed269695602ab06000000000017a9145f49ec9e9136130d2b98e07435149443a31fd8de87ed1c590b00000000160014c5df1d10d7b304d637f6933b744b8c146f6c70f7df5d03000000000017a91408a859bd8521be57104c5e32eb1653aa9235e32587a16e0900000000001976a91418ad414b7be7351af54521d1da3688a3571b07c888ac43c109000000000016001442ade420a9e870fe17cb45a9e4e599a15814add00f7b0800000000001976a914be2ff7e99190526ea5acec589d09814f06d84aec88ac18ad21000000000017a914ff706eae5ca7b8dafd753897954b50e127260f8487d5c52100000000001976a914077c99b9f7020a60e40bbeea3f810e9fcd80b6d088ac1b5600000000000017a91426e5a0223e14a890ab366fa6c393176e220764c787ad780000000000001976a91433bb2c2169e6a3ca1ddc40ec0cb1dd3cdc9da62488ac0247304402207605d4d409aa053b9b32a7b70e7d39ae8944cfde4fe92af2c8c92e1a51805e5e02207d3693e951d9106150d8c96ad1cbe75290cac290a82c85b1da70cfb85fb7e841012102bd04b9cbfc5e6398862826f95c7b65166ca588196454326806c1ff36c8b677090000000001000000000101e2bedf6222c4254d851f27b9d95d7eb9b1a4e59cc8b7d4f98b7d3183c66f67ea0000000000ffffffff3c9c270f00000000001976a914d8b69b8f07f19223f95d8468311fa1b588f9ace388ac39510000000000001976a914120c0c252a10ec540aab3da5bd00a78ac266c64088ac6dd000000000000017a914d78ec4d907b007c61a1298720fdd7db13f03fb6787f45c03000000000017a9147de3919fa6ef83824fd373546085a91b0b00668a87c058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f9e40c08000000000017a914f7a529e895a597be3e59f0d0fefb75a32cf7e81f87f00402000000000017a914c5aacacf8e034c0e188749577ffd1c50fbcb000387dde156000000000017a91476f3e9308e3dea711a1f678e3b412cb5408a3b92876ac50200000000001976a9147d7059130af0efea343d4bf700fa078aaa6b8f3a88ac7bdb010000000000160014c2011c32f7c9d8f6d1278ec9a10541240aa1b723298100000000000017a914fc3a314acb54374c0ab58ce2217b58cbb92833448760a70900000000001976a914b11bea33604e8f487f5fa871f658cbc70a919a0988ac54590000000000001976a9145b33fc3af572555a76e53f6d8419fda6c6574a3e88acf1df0000000000001976a91432ef77076df09836ace982944b81545c64bcc3e888ace09304000000000017a914dacf76d360bdda9a1a3d080a443b588efdc73bdb872a8f22000000000017a91426659786c306f7682fc34e9b609139775a1a8c7987c058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f97bb40600000000001976a914447810b1819f6fc1a9d40ede42ff1847594bc1e388ac037d10000000000017a9146a0da2901df51543332f0904fd96a30020a75c7c87409c00000000000017a914a858c26f24aaa08c6a5f82cfd0a0c8fcdf8f9f6887fc6004000000000017a9146fd5f285a371c9704c8d5e48eb68726c9ed6c47287b43600000000000017a914fbe8540f745883ddae3e4c373282f23429b730f287eabc06000000000017a9143866b661eb78fae7f7f98724efa254d7b8e3ea8b8788db00000000000017a9140f2b83971b9129b757f9e07a780b576ac25d236087a43508000000000017a914c7eac1f341627762e9883750bb4e3ce2ec57ffa587e35403000000000017a9140f4f52cc10d07b865678116e7874cf7ffde14df087407e050000000000160014bad666c8ded6216178f96e4c6a3dfa49018d3d58e43f04000000000017a91452a7694a9f351fa658a6a33952ead147ee84b24687dc562a00000000001976a9147d86b66e2120991225d684a8961d22be0c08a8b388ac546700000000000017a914654aa552f5c607b039ce3ddcefcdb6909b0e33d587102700000000000017a914d7a8d46a8b708605384a2f9ce59f176e4c9b58c587023b2000000000001976a914c9418587c473bf4eea22dd6cb19de2ee8864e1e088acd02a0f00000000001976a9147e985203476cebd488b5847b352e100ed60613b288ac4d690800000000001976a9149e623a1f1cf10e9ec3ac33961c8ff3ecdbbe350f88acaae27600000000001976a914420e25bf62f5973857302cf61704bbb601643fd288acaba401000000000017a91475fb3b34cf1693e3baf177260adf2ab61034747b873ce00700000000001600143d5caf483ab59d7e198722943d36b15374500a52bc7c0200000000001976a914b5cb6fc1d801220fa0e64cbb3be0454cecf0461d88accb945700000000001976a914715cf00a3600489b1ff0f32c267038643f1ed94088ac12bb13000000000017a914ade445c86c508ec43ddd7923070ae4391cee0a2f87bdf801000000000017a91462e6e1dafdda17778c8b6bb064fee47510603f53870eb1020000000000160014616bdde03a89d9f0a30ef3121972f0aa2880a678306f0f00000000001976a91426386b2b926432a9ec6afab9fffd5d5d2910e0fd88ac683003000000000017a9141b905c26e309a25f3955ad3b2b16d9a09870c2c68776b72100000000001976a91465febb1e04335f4941d194166e1a461e112be2ce88acacb406000000000017a9140b71e6fc3664484e535f4f97660ae9055171eaf887cce001000000000017a91483e77ed71ca3ea288a964eaac6024dc83ed2b9bd8790dc01000000000017a914298b985b6f65cdd7821b9e99b105d566296d63078785de030000000000160014fb0817b68b36a613fcaf5368a7e2f69dc3ff11fbd0b104000000000017a9142d7ba092a88fde9bcd3274f31b77e5f8cb25690687620201000000000017a914f3554a069a5826ad3258664207f7692cb23f92cd87e5ba00000000000017a9148adf0dd4132b1b6358e567eb1670cc3fbaa05c8a8701dc03000000000017a914809967524035414eb43c2ec4f28e3bef2e150b0c87948100000000000016001460e340f65afe39e9eddcd41624bd7bb4f8b5861b35d301000000000017a9147ad2690676bf1c98e43bb0e5c683accba606bcfc87b860f60a00000000160014b857bea64289a9f60a073c2ad331248412ac371d1e9b0100000000001976a91483e84b9f27baa1caccc88d15b0ff471e87cb87cf88ac93d700000000000017a914f0020c8e888f720ba282de45c8302cd3be20cc608795ed39000000000017a91456fe1501ecb863fe719823efdd9e9157ac8bf70d8723ac0900000000001976a91448dede4814de368ca8065e61a23893731719685088ac02483045022100cd5fe9cfea6072fc0839fc000af5d3bc420cb5b69fd6a9b8a18027a8fe1c6faf02205007e6f0e5d01e852325a5c04ac12049432f6f849f6da0ebe6ef61a92076b678012102030946c4a9e3ea8b950c2f08051bae4f2adc9bef74b0c55cfd2713becd99cb5d000000000100000000010175ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7001100000000ffffffff40c27200000000000017a914621e02a71e20c2a3edcdac4d75c575e18ac4c3768788d7060000000000160014d76e84b5c9ef5e550a0c97126eb9b6b60efe30a152de0500000000001976a9148292cf1041e2330bb5dd337515d78ce7acd0a3d888ac5d2b580000000000160014ea60527ee36d1f837b40ddf5f06b13b1f421aefdc058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f9ac1001000000000017a914566f7eb6443d1cd2fad35c83fad3720c4bcb54e0876f6a1c000000000017a9146f1b3f9646ebced043180c73fa816853c07f9ed5874bfd4800000000001976a914494e2efd06779805b81b09656fd01adaa0341a9688ac803e00000000000017a9143fb3085cb50a81e686faae47fe598c4552654c3187fc5d03000000000017a9148e497879598cce72fe56e4b20316cec4bcc6693e87e1691900000000001976a914af40788d67f43a52526b2ce3c4971ef201a1eaf788acc47e06000000000017a914820c3e24201576e84c9327b913659c84cd31544387dee40b000000000017a9146f1fa975248024bdf0a540f26862afdba760cb0d8756c601000000000017a914d12079a7d533fd24a264bf9194e2f2e8d12db18587f7b000000000000016001476289229327a6119f2feeceb5912af12311ebeea80ed3e17000000001976a9146abf5a71fe044b96f4a6ccdd487b034b319d84ca88ac2c5001000000000017a91478917e0f655fd4377e0fc0556107234a8d55dad787a0860100000000001976a914a8f5d4c934b644ec4178a84305272653a6fe125888ace3610300000000001976a914d51a56c832a9481d5a5571df383eecd8ef45010c88ac84f09000000000001600141537975744c76bfe849f86138e190bf5277a1df6bf3f0500000000001976a914fe35d185585b203121bd4930213f1fd06050994f88ac880ca5000000000017a91434a3569a0ce3ece74217da2e9bf07d0c096794ee877cd500000000000017a914310163a9dca5fd80d2fede9b2a5a2758a575f57b87c1ec00000000000017a9144fe9d65c72feaee417848a1ad7ed4edf2d5c60ae87cbeb03000000000017a914cc75433a7df727feae5383ca2cdd1fe6916c825087d0eb0c00000000001976a914d0b2d5f710f3f80edb296d99f06709160eba0db988ac6f4f0c00000000001976a91408e17ea7d9e97b1e41ad052e2be4ebf4724224aa88ac3ae801000000000017a914673cef63a222c0fc87644230dec43d9394234cbd87664a430000000000160014dbd66b231a73057dbccdc1d05d89adbf4017150dbfa909000000000017a9147dc1ffd0dca5c57cc62fcb9deb752c307b179de987d37d0d000000000017a914c5571b6e7e60a6c85dfa459cfcb7391bae340b0287513803000000000017a9144d0fa7c52e2e823d73b670091d08178cff791990870ff71a0000000000160014dbbf6901571fff530a916b2a47d09d781b1a9afe82e00c00000000001976a91448fab79a6707fbe0c890e89ce9cea0d4b4f98e0588acdaa300000000000016001467f16e98361936075e5c4a0cf67e5ef30fcd3f21a9eb0000000000001976a914cf6e8706b4c4b7dfe0d40978e079806a2e354e5b88ac96f20f000000000017a914b925e2fc53854ca65a8ee9356efc59ba7b689b1f87cfe41100000000001976a914c5a0360586cbb411b3b83d8b52b27fe9cb0f9e0a88ac035c2500000000001976a9148c7605902ff1256c6db596cf887de2edcb0d910988ac1aaf01000000000017a9146f56ac6b59eab117f1e6c7cba21bda725a7633578742950100000000001976a914e3f56f11284224a01411dd60cfcf3f027580354f88ac1d9401000000000017a914248a9315ce0a5d74a4db5d8d764c9750ee03e9a887ff6b08000000000017a91453d4614bf575605a7e197151336dd70d58e40c65874c530b00000000001976a914d6f7bdf2f01778d6103694a0f66202d0a5a48b6d88ac44ac00000000000017a9140784c7dee91b1070acd625865a737f37f47885e287f4751e0300000000160014b9bdee0efb4003f321e9fd022429eb7ab025225040420f000000000017a914fa01f671bdc21d3538dbc4fe6af29450769f514887488a00000000000017a914075ac31848f1273d9eccd73e20f30ee2c346fdc387fc5d03000000000017a91400f6ebb3a2b4e1dfa925aa3140587b1061d9c7738787380300000000001976a9141ed4502e37e9718eacbbabd64d5aaa972288da2d88ac084c01000000000017a914e5cb713e51d06feb216931b63b74c5eb23231bce87fc5d03000000000017a914d102cc37204b238d336e53904e6a8ee7bc255fa087af1c11000000000017a914e3c1be36927fd4720c5ea60bdc90f817c7577ceb8720af01000000000017a914fa797a1b38a33c0890bc239d64747758910b55df87c29d00000000000017a914c7c017c68377c7116ad0e176194beb7a4323a609877fa600000000000017a9142fd37f9b296de42bfad6d8e1aa2eec3ce7b2e7e48748ee00000000000017a914fb73c3e930b2995dea1bb3471cb2c366dc81eab487ca680200000000001976a914fe7f4bad39d877f34a2e16f2ae3f8ca1affc0c1f88acae3b03000000000017a9146c58ebca64b48748958b8dc9eba7659ccba3497587c058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f92ae30c00000000001976a9142f324eddab914193afd6a532a237265b4c29ae7588acfeae01000000000017a9145e57b9e12dbe938e65b3304a3fbeee19f690d7048790d903000000000017a9143d93fea2c9c59fbe631b192b4e48fde5208e15ff870a2e0000000000001976a914356c5e7a7714d12fd240c918bdbe0434db987a9788ac0247304402204c5b3d928fa08557ada30ada99dc5ae09e511f10c1a97cd11e8e7a8185ec49b00220753801f706779db22312f19fbd1defac87c4952383320e6aa276403df4c9a78001210339fd0c78f9f1488c314d437a36d9de7d451dd45c1f87a46232369f6252e97bd30000000001000000000101c9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d742300000000ffffffff4788d90000000000001976a9146a355b605c2cf07cdb25a75b802b52fb592250d388ac089c000000000000160014d5eab5addb2f36b3e83185a7996089d822b1d732b4956100000000001976a914532f703c7971097c6ab5dc4a354a0af48f137fc088ac4a6613000000000017a91427e819537192162e26e66eb214ed308b4007835c87298100000000000017a914795d922866be128ce4f540cd9b63bf8cdc11393b87162f01000000000017a914f28fc7f95341503a7dd7d5b37be83e0bf736cb6c87701a0100000000001976a91485c80e0598d6a3ee640ca60b993a5742c2e0216188acacc5000000000000160014ac1d7d8ab290d1adcb8dfb409b6808b610c7cdeda86305000000000017a914381132746a5ca271b68314f220f5d9fadd0db177877fb00000000000001976a9142236de3c0b5225b24ae50b619d3d3eb6486e6b4588ac7b9e01000000000017a914aec8791618f4813f15c394697710703b3784e8fd87078401000000000017a9141192ce9805fb1dcb4d4b0de6148111766584eb8e87b0a702000000000017a914b43be76f96123f58b273675b7737fc942cd9c358876137ee0200000000160014fdee8f513d513a8f11c502c675c8d570c8334e37dc9503000000000017a9145e713a5c91a01ecdeda6742dffc380055cded587873a560000000000001600147da05573c3509ecc72a0281326ea21f4d03d418b5ae20000000000001600140bd435721a27d5be3f8f3d83787ab343ee6fa4a3e1e201000000000017a914301320bccb329c44fecc306764c9e1127076ec7687671a0100000000001976a9145aa59d0f5b62d785800320d1bead4d014695f11588ac731877000000000017a914d25ba6e1db93662c79be01499be1b2ca8556f6ed87f47800000000000017a91408337281846752a34152aeb1acb2bf5d9d25b54987475e0300000000001976a91436fa05eb65d338ff5739d0bb5311da2b52361d5e88acd0cc02000000000017a9146e48e94769ec15c540899ea3df952d35c809d2508793d700000000000017a914157274410ffa3151b7ea1c8895b7b008d8e2c61d87e0fd03000000000017a914f1be6584f04b3f992219fe41cf0c4a6910b8abf987c4481000000000001976a914425c760a71386afd42cc66e68ccfc6de9c4b47a588acb0a103000000000017a914eb3707466071e2caad5a7184e78c5d39a3553a5587af020100000000001600144bf0217fbcfa017437357b24771aac66a7fea881d2e800000000000017a9145c439e1963caf2421438afab32ecdae5f385dd1d875d220a000000000016001467173550d6bdb7d8947edce7d73030991e8fd12d5bc50b00000000001600146665e56ca7f62a23af2ee79b41cd70f529538bcde67d0b00000000001976a914b18fbf52e2305e0e0f005fba2064369dd6df98c088acd59003000000000017a914b64afefab92543e42e48fec62cd477db48e776bb87ba2608000000000017a91468cfa99a4f0d49c4ee8cf3869075335e9a1cf745873ebb0000000000001976a914da179164f2d5a1e690a5ad2c4fa70cdfc43ced7d88ac0445010000000000160014a9a86d003084d4d9a6e09cd47233b8436321d5f385a601000000000017a914ef6671ac8611f1f663254a2612d01ed49da5059a875fac00000000000017a914962ed8bc0e8f96e426594f0e0503282c3eba9a318733690100000000001976a9142a4a8bb2d673c832a3219ee443f590c20fc4ebe788ac94cf1a00000000001600147fabc362d4f5f5188556f73016110490dfc71bf59fc0010000000000160014eb111de04e05d4d4c497e527b8aabc149ab92262489501000000000017a9146c1470cbac2eb791fa498a96ad7301970f975f948763c4050300000000160014b68f9aeade51a76c27581070612ba2235d92e368fa660300000000001976a914c6e57a871e818642e53af953978dc882ae990fb988ac75ac00000000000017a91428c4d7267187d1986b15184a9df5117a724d4e67879c5b0200000000001976a914eed4420ab732eee9710d3c1792d6fc4f3adf534b88ac00260500000000001976a9143084267c410a4f3587c10129192fecacf2dad34288ac047532000000000016001462b8eee51a279120658eb64a8798116c2fa80ca1f3a320000000000017a91466af9038b8cf21a24fd7bdcc3de6100c3350cd178726af01000000000017a9140e793012231370dc91e3d4df024a6e374acfb18a8735000d0000000000160014f6a04e67650314ce62be72af032ecb8e979a1d1507380000000000001976a914b60359f7892cbf8de29e3cc75920b38a6613a79e88ace8fb4b010000000016001474fc9dc1220a634142c83d379d0d3e944f1b59320d900200000000001976a91402792d96581b8d4721fb549374f04b5fe9e0228688ac5a150200000000001600147ecad926f63c9b989f88aaf8e1df9b777dfa1f62d46aa8000000000017a914accc646e8abffc8cc6eb6a9d8a28a77410a1252e87602501000000000017a914e4528791514f443e7389d2cf8ad49f4044d671d78736dd00000000000017a9143d0ef72990b36189385b75cc0ed94dd2194acfa787583203000000000017a9140c647b09c45dbf5df10a158fbf130ee25d772fc3870d2d02000000000017a914c6b80e18a26990a64caf4a315a040c09fd2619178771610000000000001976a91408eabc66df7ed7e94b4dc8dc3ca593ca42b63f1788acc058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f963110400000000001600143c213025e47a1be3d5675c33e1fa02ff8fcc98431be01000000000001976a91406a844915768d65b8d429e4488cdf70bf7f8d58b88ac27da00000000000017a914b8f2602ee950add9d51da92251f09c4cb3aafd908721da08000000000017a914d9af78563efab45011975a12877ad2229b83804487d4e4090000000000160014911f8ce5f8c4a49eb05607e1da5a8e8d24187af8433b0000000000001600146c4abcb1cb6ad2db352fb8b41c17e5b8efa98e10b15900000000000017a914405a5208f784551887b0e0d0e47e34f1b5d389ce87d89a0100000000001976a9146b66ee73bfb6d92642bb827c2cfe5857c597099088acf5440100000000001976a91496a632870c1b99c4bfaf9edc4c0fad063af204aa88ac0247304402200790931957eea17ec802b1f59efc488e3468107433dc51485fce7148099d2fc0022076ddf577b2d53606b28aaa55fe150818f4c0e15562d369b46163f970b16b8427012102a884a8e75c5e0cce0bb1a0f510c0f87c2efd45c4cb1a6637f04a442e4d9a562f00000000010000000001014039b775199241cb5a466311695d74514371b0fe3b1d8a1131d027724e9208442300000000ffffffff3b36ed1f000000000017a914baae100062852a7a8b30177c7354be84a55f75e987b0ad01000000000016001474c8d60bfe94b926b77df6bab3c928a5d029b3633b3d00000000000017a9149b99dde6e026a6c30cf9bf54740338abab49795187cb4902000000000017a9147286df6ad497ec67fe7c9f04ce566aeb6c364ad2871dda10000000000017a914e96f83187cb1f695b29f941a8b882f733d467efe87ae271400000000001976a914a28ce423ba7e851497c6597015b2aa8accb9572b88ac22e120000000000017a9149829b161da751019ef22ae08999a41c221e92fc7877f480b0000000000160014ce15419a9dbfedfdbf690479c895a79009c12de11dda1000000000001976a9143fbda0521dc9b5937ddb288d70288642ff54ebd988acb1a202000000000017a91447955fce93ee1d539646ea1273c99a25394e447a87d8d600000000000017a914238b0b906c17566f805c287f02e5b75deeafe39487c66c04000000000017a914ece31172a6cc280840a5228951dd86b458115806875e8b0300000000001976a91488f3b8e3ed433eafa99a6da507b3ae76ed46600f88ac03dd0300000000001976a9148e2d6a5db4fbc07aeaea6282b28243489ad74d0c88aca47b01000000000017a91491830e42c8c21f36a736783a4adef63b90c2f6b587523b0000000000001976a914628cdfa93b1a639cc816a9299567ff41c1b8338c88ac10c70f000000000017a91482e8cf68341cedb358bd14a8702c3b8b75f77557874ff50e000000000017a914f01adb6c43900cbb2f09933dba5730b8f98870e887422165000000000017a9147a45e67b7bbfb13cb72325a3bad395c7b97adec28711a81700000000001976a914e10847acaf7af82f11886e071fb3d37b498a872b88ac4b7b0d00000000001976a9146541d4124773e4591bcb1ac93bb502fd8a94c37088ac7ce600000000000017a914011841ac4e0bd83666c424d2b4b0331eb0f80ff887f5b403000000000017a914ab7665b914687ad927c8bc5185c13964495877fd87bfab00000000000017a9144b0c9b07c9246c4adb7f09f4352bddcbc623df7887573b00000000000017a914ea36bf36c6ff8965346fa6b81c3cba7b6d3090d3876d4403000000000017a9149eca99cb0d622af7a64980a24750050035b02144877ab50600000000001976a914ca1e7d50795760188b75f52acf83e7cd3721293988acfa7e02000000000017a914e6c3cbd55a41e11e67ad33bfcae4f5491bf9c59a87babdbb2d00000000160014ff2d6d5a936480b5e5e78c5c15b706302b5f55429d951700000000001976a914699977635e25ac59f7a515b52a90eaf917211a5788ac75dd0200000000001976a914eb22944825bc0f7eb4a6da0f1bf9f5035363ecb488ac55d8000000000000160014d9295bab42203d1e4d1da4ca169eede32523d1f6b451060000000000160014679de303090d42de45361983c1a0d50c352cc38691ac0000000000001976a91407518d2c62e15a3d47df9bbe7964da41cca351d888ac8a1302000000000017a91476ab21f74173133861d9a9ec348e545e733986cc8717361300000000001976a914dddf4b89a7d60fc8344173d168f4a39a4d97fa9688ac10b102000000000017a91432cf9dadba9efd6246f5ab38568373325d5c132d87ef4400000000000017a914be615c40aedc26d50de572e12b8e3695bb9b008287e7680200000000001976a91496de151d493578b1637dccd23195049f91df6bf988acdafe0400000000001976a91469a3079c11e976b1675255e28d0a77a3a89ea4e888ac1e8702000000000017a91436db66ba5f8ff2ff41cfe6abc23753c0ddcfebef87436cfd0000000000160014aa9ed5986559e1e77f27b78f9beb517f9b07af8dc40b010000000000160014b760b6f5efc3cf8c11b4ec7530a2cde9b5f1995182a300000000000017a914fac81216f81baa082c0f64c3bd175d33d3ee526d87636800000000000017a9144212b582ecf3e1ddead775c6f0f112504d096ad087760408000000000017a9149010967c7e515a91f7001541f79667db8e38c6ad870a410100000000001976a914daef4bff15b2a29c4aa163cbb9a5d7882ecc216a88acf58e17000000000017a914c55f88d81121ecff09b3e6dca8be4d8b7dabbc29877e7f0d000000000017a914a260c3805b38f5fc59e0e2b74e4584e724783b2187e13f0800000000001976a9141998b9ac80057ca7306d0424656ecd34fb7606ce88acba1d1000000000001976a9148bf2dfc49e98841127d01af816cdf07c3f83c54f88ac08b500000000000017a914f790e8868512984f09f84a7c7caf17ade6860d71870f810d000000000017a91417dbf57a816f7db635e7cf7734b5d2d30325e74d871a720600000000001976a9147367a127b35d252fe968149e53c497693729763e88ac222a0000000000001976a91461bb6307f437e291a1dc719edcc97e0eda35728c88ac79610300000000001600148c480c838a68a5dc6d0697fc58a2309f75203f708096980000000000160014007b1e73cafccf9d3376d3b21aa672fced3ca249598306000000000017a914c2ec26a35cdefa9626b1364c5f07c4e4f4932bb18768cb0b00000000001976a914dd017775455444310d8be8d5c96b006e0ee3353b88ac02483045022100feb73c26dd630c7303169d800f8cbceba835a5c9b4a36de1ca0b443c7e00d98e0220018030a51459af05573f266be82146ba9979ac08557c72547211e8bcadcd96cd012102f3d191006ff18eb5615cb25351fe456bf39dd25c2243554a632797c2615af8f30000000002000000000101da1d3c6a5078b47a753e47fa59a7cc3902644a7264a729d9d1bd7b9090419ef70000000000fdffffff03c0c91000000000001600145360bfe8e1dedf111f7d323bd7f415b110e54b2a275600000000000017a91404a24b0288393f633ae2e1287f5f095a25089ba087626700000000000017a91412f3c7130750c4886d325fa1065975114710308587024730440220087f8ea014cdc5ae3cf395f6dfd31b9f0996c134308b2948312613faa4c3b1aa02201d4d7db9ba771f183c23080a7e689430bf4908d4abf50c12ae3a83dbb790ce21012102cb4dcccbb744ff89028056614ce5b3f246c9033ab05cbe485ebbceb73609d72049a00a0002000000000101911f5bc5509347f7e12ebea52bed419b40b272cf4c0a65d9dfa0501869e4a1290100000000feffffff02125fa31c0000000017a914a8251054a547765a09a39af5eb646c9fa164383a872b9a0000000000001976a914f4ffa6110c11f221bcef6ea8be4bfc0ef945234b88ac02473044022066822fdc8c3986e6c09a10d7ccf0c55f8c574f2be58a20f5720a6a633f285c150220575f17f41aff17210e1c7f7528cfa9ea260b5a0c35283fb5886536ec5b0e97b3012103e8b59ff55a1e2fee644dd9afcf8f1045eb60c700f29c076da88bc6735753081149a00a00020000000001011971fe3496205ef3b5cd9330c8a5b0e76687a40fcc2a3c2bf2302bd0f7b32d7f0100000000feffffff03b8ca392100000000160014f1c43176d9d540cdffb018d42c7eeeb9d05e6e0106de02000000000017a914af731c437fb57f940bfd02791ee59af0fb81c61b8736f5940000000000160014a691ee171cf1e4f1702b6f3a92e676db6dd7fbee0247304402207bcea31e9a16cda0b6fc3f385397c72321e8a497dca7ff0d907446529982b73b022049474a35ff756b00b061d3aa5cccf5fe79085684dd8dc35d5b20886bae51b375012103fcb8c3102c255348b6fcbbf30f6860344d9265daa9d8d3ee09974f90400c465549a00a00020000000001018704b70b64ce2cab57cb538615f5ab8eb9186ca0f3c2a02c4acefccdee92f6b60000000000feffffff024afe0e000000000016001404756795e40a22c7433af99d9a895761420d7f2ae61500000000000022002059cb8075368472a8b24a2cd5f634bde9a71b9cd36c106855674e5d1f58934ef30247304402203a91ec26474ba2ecfb064bdfd3b8d37f34d8bf5b09db5e967c37f77d7ad4831f0220234c95629c0abdb3bcc81e0e45f659cb747223cf7d0270b545839273cdc10706012102e7826c86e916e0e69ab193eea998db2e35a468bb84efa71aaa3c8fa237d753dd0000000002000000000101cc558bf1ad3f28321d86917b2ec24a081dd3512692e8c0c52cc20158a72510e90100000000fdffffff02a51b1e0100000000160014e49d3c2c8f1385051584d5fc9fa58ac445001a0b24071b000000000017a914bac77a95a0284aabad59a72eb6232c3db0ae55fb8702473044022045775b12fa7334936c7e701f45eb6bde8516295d35c544f09eadc2b18a907fb8022006049d4565c90094415a51fd52f289bee8e46a3da02ca075e870bb70812dba9d012102e210ec0585c95378af4230060a9ce5276211c88847b8d27ff80f67eff2a3a7e549a00a0002000000000101b6b7cc9c52801d0b0c382e220a2582434e629ff3246622def2ea2ae484489ba60200000017160014e95ff55ce840f814a2b65b223f629bdb5bcf6339fdffffff02153902010000000017a91475a604c818c0295f4e93caaf336ad2c146087de187a0ef2e00000000001976a914fd63a17f89421cfc8baf2b4586e48a91823e259788ac02473044022003dbc21f14821dfa199e77261498341e7739059c33ec2edfa44e5cc45d1b16eb02200ccdc2b1095b06c8ed43e52a7496ccc17e63ae56dfc1c0cc12756a8625bde713012103d54ad458321350b495bfb4b44e4328d3afb9003ac30d3cdb782fec630e00977348a00a0002000000000101cf535979ca23281a1caa0f9176c6c46b81da82cb2cab5b866f44d347b94fc4fe0000000000feffffff02302d1600000000001976a914e1a5284a6476eb53e95c5e64f8d88f3b20b7bfdf88ac87f1ad3400000000160014935c2aa5d02d50cab9ce34d79a0554539c3db52702473044022074fc885d4f7ef61ae4b4c9093adefc9abcd3f08b560f8d292a6ca29b9979077b02204add552136073c67355d022f670184338b51fae080916fcd65466038cc55c1e7012103ae4daf4466ff8d4925a0f5ab67063aac7546cb76c028309a718fde5514690de549a00a000100000001bb3e833b5238f640cc76d56433f371c9ba50b313c1177572b7a11ee4750916eb210000006b483045022100be3013ec74dbfcbb7e2021362697bb18c248ec7ebb24f5168df9957bca7b670102204a2bcb23a98c066088844abe3583986d66cd070fa765dfb61bf844df3e906bdd01210311160371ef3d4ca26e94de8803ebcb9bc607da6fd2170c62d7658aa559587fc7ffffffff0248f2100000000000160014acbc25e15440886bdb5df3d4680a3e5762c8ebe98cd61000000000001976a914c4c69d6fe0926ecb383226eee0ecc7fe3a479ac488ac0000000001000000000101c2993c2f38902640f82050db708a06a0c23b7380c058977666cd0dbe469d640922000000232200201b9c21f047e3a8390fa63137b01443bfc4f074a7e797fd0a5041c7396d583cfffdffffff02953a0400000000001976a914d4ccecde7b239d65ddaed87df85a2febdad838d388ac02c80c010000000017a91452568a1d251268e991282bedc2fa288fca31d6fb87040047304402205a1aa6d6a323e24e05467a4514da1cb3a2292f2de0c16270534167c736629a2d0220449645b864c896b0f4cd64e250e9c79afd311a194b0d68d5b16c8b1daaf389ad01473044022055d4a04ef581619ddcb888ea152c5177df233bd742036887c6a7707f0fb6bf640220624ee1ff465e355b5cf8a569f828839fa359902c7419409741d5f52249500ef3018b52210227b2bec611517b6ce04b5291033216ee59f11a8195055a1ca0470d99e1ada18e21026c89295f0d3566857b881b7952875b8aa45a49d0e1fb5b121e7cb25fd584d9b5210373f7dd6c0bdac38819761f7271238ed28e01d10be1e9c5769c1170c21faf6b002103fae6497f18de660ca03a866e019c8507a265533ac67928232c5245dacb6dbbfd54ae0000000001000000000101ed085d5be2f0d0ba6f73a203e56d24f21e6871cc0a73ab61938a9a263907062a0100000023220020db6c375d972868bb29a7df9911cc70379d63425b86505157569a8ba27450e902fdffffff025cf30000000000001976a91498fd6522bec6b306742d5e437eb674fee169247088ac15e479100000000017a914abdc9123754e1b5a987fb6699988f12d97387daf870400473044022063a0c052468713819300d47826d08158bfd8634b73bc538adc7f3753bc9786b1022079421131792195eacc05df6ba26f3326f3df5df8305a3d1677d971cd730ba464014730440220344a4f1baad9760b694fe53e0e02a65301cf600327dd0f823000b2b16b22084b02201e63112aa1d6f8a4b5f1df3822b3dfba4dc01459c35ad268dda061187c63e8bb018b5221022bae34a276089c278b6ae1d78a61fcf5a85d4ed64bcb2c5350d1f1fe3396bd8d21033bbd80b9734ec7c1033d13d124224889222a4f1980a549bf5fbcebe51f6d9bae21033e46870a01c731a07535aba9b5acbe1fd439eeb45b0fb9d3cdac6cc99e8a47a52103a2fb9265084f6d88c9f05395e281acf28ee6214660175f7bb2f64f9ad17b84a654ae00000000010000000001019419cf33fdd1cdfa57eb6364cff678b6335774d238f715db5be9f28b1b79b0eb0100000023220020051709938bea707c3ab89a059fb73a4a2e749ca8442e55581e7dc853723dee93fdffffff02bceed000000000001976a9143720948f6d562836aa84ee3f702f5e4658ace9f388acdaa18b160000000017a9140fb8cb1699518984eb91453cc1769a68ef5960b287040047304402204d5ae148ef62455221210abd24f7f08bc6985a963d6c673147ae2042b365297a02207dc1167cbb078e1925d000e3ee143746e07b3e742ebbe63283fed597afb93b5a01473044022056316d00c401971c799cbe125dce347e9400eeafd9ef9301a1982e4a66958536022001ee310b1a499ea547cadc438886aaeb42fd8c866d76fdfe130755ed8dd3e777018b522102804879313205a4cbb15fd2c022a962fb6ce5e488593db97a66a994e0cf8e595a2102e42757a53d56fa4e1fc3f1b4d01cc1231304c050cc708d6e2283822c8ea6970f21030fec54a63f10a86d3ffc0c602cac2bf1b6e5e031e0f84d238531523658f978cf21037fb942c10fb47843abdb9084b27cdfbace6c82485a04dd9bbc4b6ecc89bdab9054ae00000000010000000001017db6b05fe6e1dc4df18aa69690bf98d1939ffba7511f633633e2b3de04f59ec50500000000ffffffff0184b4530000000000160014a93c6ed47a2fa26f5272d9537c98d2b79c354ddc0400483045022100fbdcb78ff55d9772b73c4c3f3a41c017dd7356a1d45b0108b9d0ee55fc93ebd102203a50d10d4c4b764150263a437495b3fbe2bffe70965be078fbaef7753bfa45a60147304402202fa10b848a13f1ef44d0549316c92a5764ada7dd219de37ddec1d5f2b35cc1fd02205c40abe98a33bef70ce7bd4429a60c04086302eb8dae2639a850ff57002cf364016952210324c60644f649f281802de952ea4611694b0c0622549f2438a19b8d1df35ddda72103dd9d7f35a86dd2f44dfee73add289a2f266b968fb2787d14182e25400f28d32321038a3837260c3975fd31b0eba4f5b00434d237eae51a11dd8059d863ee42cbfaf053ae48a00a000100000000010124feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10000000000ffffffff01e78d760000000000160014a93c6ed47a2fa26f5272d9537c98d2b79c354ddc040047304402205d68fc50f5e1e8cb995cf1094c4e6b8ec88c7306843d5a238327dfbd3d511ab6022070827a5c2b28498fa364a82822aa400b2cc4b9c0b7bf021ebce547b92970a14a0147304402203afda82db5c4e9524429b22b27f292273afc7efb2110765c3bd49fdaca00ccc202200a03651fb09b2cde48e7fd22deb8631e49dcbf05edd0a192077821eb91abb4680169522102ba20cb9b37dbb25dbb1dca51d3b8d85a1144f536a6dc4bd895da43daaa4b46dd210389eed93b545733209c23d4aa5d971217b724c9252a1a698b76dfec6492c4c6622103cf2041d4dd9c101650fd3724a1dce43777b957f0092b89f5fcdd68519cf21b0253ae47a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70e00000000ffffffff0124261700000000001600142d3203e5371213676288d9527214843d8e738cb80400483045022100fe113e48702ebdb4175e96e14fcb9682222f6e949388db7030b4aa9af4857582022074c68de74a2d8c1d4b907ef713b79b6746abdf9d3cc9f96572c64cc5567ac8290147304402202887e5b916d4815d3fade4e2656244e4ba1616759f91c92e3b34f5bd762ac5c70220457c865b7398f46d995296207febc849abe757f0a22e48035a3615ef45730c4d01695221023d9986654e77733f7a0e2d67e8431c94b3b87b108447200247fa047fbcb56c3521025d243bc7e9c6c3d920e4b6fc257d71afbae71252002ab8d1fb10f7d71d135b9921034c89bbf829dfc6c703af72ef553c550a72d8075312ccdbadb0f8d3620990cd3953ae48a00a000100000000010147d4cda8477dfb81d340bdad91fc34f7591cfc0f851fb0d781a177963bb807170900000000ffffffff017335130000000000160014ca2ec3061e09f463d0a31b7b71fd52ce861e6d8b0400483045022100af93e7c5cca0fb44deef06f8901288217d6eabf7e7429fecf3f0977ed80d83e00220614221e3a0f63f7051a4ab1145fbb271d716a40327592b8ffaba4cde00b1c1240147304402206b8745de955f3476c1fc5dc416f2b8cbbbd0137a4ee3cb457337971656147e910220500706c448db3c98ca370f3d8fe771583e3e412552f3c2d3bfe7b6706b9a2a730169522103f218a377d25c08ae48f2d87102b7520c09541986d4e61ac579efa098f58df7fa21038e9755b238f4fb2f19aacd70a3e4ce9e744ef2efbfee2832258e6198d7aa59a321031a4228063b465468207044754f541b9041aa6e9e7c8592461d8f6a5d3bdf7a3f53ae47a00a00020000000001026ec51b802e43ea90abbc71c990f2462c90f04e48c379fce3497cb77ab5fb83733600000017160014165fa2a56354ad4f0d5eabe8b7485c641f49bcf1ffffffff20c758079894a8e59e932cc2d654d866d66d0492bc4db286575ca383d3bb564f1700000017160014165fa2a56354ad4f0d5eabe8b7485c641f49bcf1ffffffff0213d51000000000001976a9141b6e8a8715c9ff502fa93c9bd21fb8fc1ba57cd788ac5ae400000000000017a914805bf968ef35ff4e35f016743df19448fc0e8e6b87024730440220275e90296e209b1aa2a3a6092444276fcc9d480c996c6d6e96ebcbab32596f8102201ef1527b59fba4a707f910265d944e807974fced0d114d5232497c6d344502b501210282e76f1235dad3def2dae0d7ef4c719bffa4fc20fc75bc378d9d5fe789a02c0c02483045022100935e76f10a8693ae88896345d004ea51ee2b643b5a0ed2c5e3cd742034e91874022026768dfab3022e7c4a5570c813d1110a5145f3b97917b99bf489c8b1142d562b01210282e76f1235dad3def2dae0d7ef4c719bffa4fc20fc75bc378d9d5fe789a02c0c00000000020000000001028402815680e541bf3d9e2038edc8820ed07a04a336120a065f23634ca83806ad0000000017160014ee0ee72b634b6b61971d88deb3eb813cec5e82adffffffffb8ea6a7df5a7a15ef7bf674ab63e6cf1085d3fd431481c83a195c0b57f2ec1f60100000017160014494cde8551dbc4f6763e3924957b93a5048c99e2ffffffff02604d2f00000000001976a9144e7e60713e76f31b9c6acfeaf22971ba0a45628588ac5cc219000000000017a914778702496d3353829ebf722cc2fb5f4afc3cd9328702483045022100f6f98b8963649010cc4c347d4259188e887ffdc8106f442927e090475a00e877022004d3684c3e526e722f4fb1414eef13ed143de67d7bbcee3c19cdb4fc9c7fd294012103dda3da2e58d34e6ae854c5954b609185a87eda1853239370a28e919e14563ba002483045022100a4df952587cee634f1b479b249ff16be41d51a86ea890615850d7c223209de9202206a3915ed7e579b115629c55ed29157efaa286a85ceeeb446eb0d0747ca801f35012102870792cf284bb0889a85862cff980bc51feeab51a26922d2849bb2c6fa19e701000000000200000001184b7eb381c6d3ba0f7d7e126b30517125e28d86b1c627a6699f4de380873009130000006a47304402202957c16598191be10073225a634245c130fabedaf019714f76db5bbdbffc840d022028e69c3646cc473ed8f04db0fc4afd2d905a8ec8aee8b783e69bd65112ef388d012103050def628583331b5b2ecc50d57b52491142ef0dd4a98fc549afec8435ca5263fdffffff0241b30d0000000000160014d6314a1b6b5e9b9191eeb9a1921580b207b9308177e70d00000000001976a9141fd022f445f972b4ff6d1dfe3b428e385c8f7e8488acec9f0a0001000000019a7aaea45145e3da648918b6fecd974b114c2d98ea4f9a0e0521d0aa034fa755320000006b483045022100bcfefe076023bab6b548f4b562c1a948911cb01d23bf80e0633826a7158d953d02203104c57580e8bf954f99ba24a60cb688fb5ae33f5ecf261665498de9407d980f012102af4a83788bd4a812c0ccea70b567bceb5060d8c195261a1c643c7c7033b43171ffffffff02df9d0000000000001976a914b43a6522d95b16c1eb86d5a27b85a961fe50ad6688acc6305d00000000001976a914fdf459c55621b96a5a3635a9a921d0f4efaa61f888ac00000000010000000150820da321ac39434f939794c7a0bdbae5c06414ca1b89d8c9cf14c7e3d5913f010000006b483045022100da2a1faa9b087fc2eb9452c3ffbeb06e44bbdc0b663b329102e3c16e1e59745c0220350a3f5131275526ef2b73cc9ab6d66a71125ac41a6587365d852d2c41048057012102ed4f307f82bfbd099d4f1b007f21a34b2fb29186921a8de9baa406ba33e65d18ffffffff0245a40000000000001976a914cc40a30ce1277d159c0ff39c94f8f493fab551e888acad835c000000000017a9146538570ce109f884b2b6ed0165f9adc26d713702870000000001000000000101e9a28d13f468d59cd0fe7c7b78c2bb6a4759fcbe43d9edc3d17d6038003eff791a00000000ffffffff4d437b0000000000001976a914f8de718b4bdce7a309a82cce315a39d2b73fd3fc88accb990100000000001600141ca5c4db4439d031136d13806c097c77c6b2d82b8bb70b000000000016001435b29d5081d6d6a30d0e703f6f5719d2fbc53185b0ad01000000000017a91478739e4361961d65edb9eb0f1538b2af852e7bee87daa84900000000001600143eaf26740c7d753c1f7d1a0d5649db0a2ffd09ed593d0b00000000001976a914907f30c73f415546dab2ce52f31e9a1455fd43d288aca74a0d0000000000160014f5eca18840c3f935e1ba0837bdfbd66537ba7148619901000000000017a9148a50cfb17f5d2ef01036cc8b8ecdc7904f8e19ca873d3b540000000000160014e60c16b14255fe97b4e40cf4a4996f516d6d7742390302000000000017a9148c511ca4c71d0b37592de6d7907fa139f000147b874de302000000000017a914a9be699fb8ad58ff520a561dd8e42769824d02e687458a030000000000160014c7e46ba3d0ce4f7cea22f8fb85420f80d8efe102ade20100000000001976a9147572134d026c6c72267c63d3e5601b3eba913bad88ac0d880300000000001600147bbd4ebc7a5381a4f438cfe9cf9e534c14bd938ae13e1300000000001976a9148e525eef6b38c21757435864fe76048c035c692088ac48540f000000000016001435398022483f9e743b0d440088066e11b2c1d1dd8c2c01000000000017a914892a4b8fa0e61ff840601d1e95859f601f4699b7870db01401000000001976a91434123c395f220018164a2525f953ff393663f07088ac585b7207000000001976a914c8ea0cef357db3fd65d96b49ccd78c4edd191b1288ac1d7df5030000000017a914c4304ff5eee2a6b6c9072c03b21e6270d65eb12f8752e705000000000017a9142d65a96c3e53d930d7a65ae73f417ae3736eba0a87f23f03000000000017a9144f7148c68c0477df719020864b8b8ce6d2c4bc2687b3480000000000001976a91473b0b0561dca0f6495f2812490b4747587462f4e88ac618f0b00000000001976a91441a69ae2adc0bf07ef4c8f8bba5c80a817bd37ef88ac339b00000000000017a9148652ec04c647cf198a4b012376f9333991cbd93f87e1240700000000001976a914339b81ee057a092dec9420650ee75d3e8299694c88ac1e080200000000001976a914be6cfbb6e6e84ac7174ca8eef79f6058afa6e45688acba3723000000000017a9143b41444193135b2ece720a8ffa6e9e922d8418ba87a7ad01000000000017a91461105b6177e103ba72fe78daf509898a40bd985e878c68c6000000000017a914cf2c5b0b65b8631e543502019dda261c869483ff875ddd12000000000017a914cb91b6d5fc07e4bf46bac54fcaf821f8962abc1f87bbaf0200000000001976a9148ffbadf772e83626eda50154b66abd29627c83a388ac9182130000000000160014b8fc4df3ef687bf9a12c356ee2199262cde57ea1f8930b00000000001976a914756de9e94c38ac39344e58ce03baf9f352356a1a88acabc600000000000017a9141895ec28354aafa43923d4937f1c7389998ddc8d87b55a03000000000017a9146bb1216071075c430990bc7536ae12dc489129d4871f500100000000001976a9145b9200c60129a69d22283436e26f1d960073a15f88ac3dfe06000000000017a9147f79496044bcaf9667dcf6cb8f044db7fb62ea3687715205000000000016001430939c0ff33fff38b1a5fdee6952eef69a08413e27a30000000000001976a914ad5b2f3a9ea58d0cbacd1313021f2e31f940931588acd5c619000000000017a914dfbce80c053ef6d454cf5015f11b64e28f57315b879d2700000000000017a91499ca5b587374d74b9cbed442cdeef84135accc5e8765fe11000000000017a91413a01164f3d444bed8a2a4ea6c27a01f4a24fda687ab9f05000000000016001465253ca87747fc2078bf888f0424eb6c884c4fedc0da00000000000017a914c429586ebe0a21b01e4dcab01f9797b965d37df38750e404000000000017a914256c67f61a6449559a07281adf2de0c547dedd938759920300000000001976a9141f87200ed8bba94b69e925a0bc1ecc86bfa6d2e188ac69b50600000000001976a914818cdf8a67cc1c750254fd2e072714bdc12588d688ac9e3d03000000000017a914c0460f4706625563a10616ab3c1519d250d8373a87addc0300000000001976a914c2f0ce1ebfdd789f70f8d0075cdb416a164dc23a88aced800000000000001600142251a20e7f3826508b85e094353282d0c58133a033080100000000001976a914f2e6a9de4c9dc8ceda98871f1958fe08e8b9bc5588aced8b1700000000001600147071f552ce5452d1e558db02d5a08b583bf31569593c03000000000017a914267f141d2715d7acf3a76545539daffbc9a90aef87df6319000000000016001449a9a3a5d704341e747c9693da7e64f7caf1bfef27870400000000001600147093bdea624ed57f872cf99c1fc8e5d3bf11a4dac5990100000000001600142ee6ea008afb4801328e1fb6b9c15ffcb48bccf96b4b0000000000001600140b3da9286d5b63d981880ece62044ca34221fdaba0f802000000000017a9142302f376b45435bc017b8a23fb482a466f4be4e587bfcbcd010000000017a9144e9d60b77f8362d659c2ad73cd4e480a2782a33887add600000000000017a914ee0ca3095e6a42e865c84fb964971cb517541ed58741ac0300000000001976a914f603f7541b73f10e770cef8a624294d4c35bb76388ace91808000000000017a914e43c43d6e9bbe8db3ca4d8bdff4bccca7842802187cc1a2f00000000001976a91462656738b217132e72bf74e6180697b28bd624f388acca3200000000000017a914e5bd660b50562974868b1e395794fd4ef5fc01da87466b08000000000017a9147bb17ad42e333410c88a8adab1e8e7118d446d0187e25801000000000017a9148f40d9e906cb784183d0c85bc869d0b16a3c0f26875c090400000000001976a914d1126e83f223e26365782b471987efb7f38d0d3c88ac1e100a000000000017a9148d7d3da285c1417678b5563c3ef7cb330d53be5b874cf80000000000001976a9149bf92c153a573baf47d2bd7577843c0d493a617b88aca34000000000000017a914b873426a88b6c91dcbcb3c97456f769572f25d718742b700000000000017a9144972b538a61365413395c94dd86ef3d10bc98b3d870e8b2100000000001976a914a814ac62c517b5afc2bfeda19a0bd2244691bcb288ac497047000000000017a914e1f28a9359a6b98f4681d0f26898d4b9b93cfe4687305600000000000017a9140316c703201790a3049e4032d6c8aaa1cb9159f187779c0100000000001976a914f28d7c9ced4bce050c67a15000df06d038fc82eb88ac30a921000000000017a9146cf884b44e255696bfd4e752cb5a924bad0847d387024730440220642fb24fd9f5c1e5882f41641f0c05ef2549637e1de5cd642aec7124f525a86202204e7b2e8dd72c0351b2cedc18dcc7113aac7235da6326fe6efc722c947c979603012103eae51bdd54806d620e9824cec107187949ef2e12b3e657c470130dca3358d0280000000001000000029444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d4270000006a47304402202c463a560086ff3877839ba419d3867e2343299d0186130e8d4b7f078e7bb482022022a10a34cfec8df6c4e7ec2e178e41d69c839ae5d7c448b7e12c280692458c2f012102d6342807c5895b8205a4454744460f51dc8e7f043c9fde44166c12ed4ea7bae5ffffffff9713cdd2120d739ff89a61430efd3f6fdce6b20a25570dc65d8a0c2bed87dc5d110000006b483045022100a3969f7767c54cf7d1ace9d1ca63bcf140f59268fb1df97584656cc660d8a78a0220409f073e9ffac48c796b0cb03fe73bd2cea9e6195e72efc9a133c39a7fce4ac4012102d6342807c5895b8205a4454744460f51dc8e7f043c9fde44166c12ed4ea7bae5ffffffff014af14802000000001976a9144a4093f7864b2a6197a3a1f3a8d4f653340f09d388ac0000000001000000018059497cb60ae58a87cfa62e55be04bfd0e103789b71be8bf8d601d2af48fce6000000006a4730440220631ae36a5508a6cb14ef083fb3f7f0532eb170cc26e8e7ec757b30429f67280302202f18960ee3b76a1986c8a097aba6445a725605871fece5c1d925d1d6f07b8b6b0121036c8f771c148bde1ef1e3ff4fe04282f9c88fa2e28044d274fd418074d69dc2d7ffffffff02bbce5700000000001976a9146546f4e2fa21e64cc2260e47ce3641c9f191f5ae88acf717f1010000000017a9147710efa4b590ee652628650c2cbaa2b1ec18908087000000000100000000010172bec257d67f3fa057f6484e42cf2afe03ec7093201d5bc7c8e7b796e761dcfc0100000023220020d2f773f7222674085ab6b32e3af34055ff14fd034b80ed453d29a392d73425afffffffff02556602000000000016001485e50ed785aa35d8a4c57738b742703bff2d6e18361830000000000017a914e6a96497590d0776b28c5327a6917c791e49283987040047304402201b498f44a8118a44b12ebe97f5e2baa1d6c812f9c49d801465155fe9230cc84f02205914b3b02240b5ad5ef20ca5681a953bfb116c5dcefe743e2b38a1726396d0b5014730440220516ad138ec7a422cc15269f4bfc5ca1740e9a758cc8316b1fe3333fea0120b530220016d39ad33c5889a1a28863127743aa6771b41eac107b9f46ea1928d1ac91664016952210308fd9b400bd8d039616a5d375d175a750b958693682bc16dd871f3e2a3594e342103aa6bc41e0f95cb69a5256b9b7e85f94648e1c302a3f79704fb5ac5f4c1270ce62103034abce97c5ef9d6836ef82ecf10bff7330aa1cdce3e9d1c489adb8498a26f9853ae47a00a00010000000001010665b89e9399e3797978a2e0b3b5788a76b15ecac47d06e4779120cc36ac492f0100000023220020834307325351b96e0a26e09f3d174ce913c246818a0f15b1f6cfd259104df63fffffffff02beed00000000000016001485e50ed785aa35d8a4c57738b742703bff2d6e180a1e1d000000000017a914382663a9fe31d007fce4545673384a5bc0489502870400483045022100d83d59e2db84da1cf744c53b70ac87cdb174c9790d129acc1c4624885e0b4be102203319942418f1ae90b8154cfb284f8cc40ac791a734104a06ec880166cb3240e3014730440220711d1089e0a9494db7a05394ae1cadb74b651d5e5fe98d973a616d4e053d299602202fd43010f437c7f718e13b282b9dac7383750aa11835be6fc31b73322325c7b3016952210287a68ece8c65d6be35c20a6a4156322b6edac10dd994adf5bbf4cc813083a8c32102b4de774f5f3cec2b9e8fb1e9746f75eacca406adf5fabe27dd25b3349f7fb00f2103383d3c50f5a8ba4f8ffa11e5f80617b74ca0cd3be9486c948c30b09a6cee273c53ae47a00a0001000000000103a8a7c3912750a083da77c255b212902b6fc430c3b1dc65f4b1d0b5a2a1e863ef0000000000fcffffffc2a84eccb10445f995af2370bff5dec85f2ae4d8bb98e6fb9650e733d083a05f0000000000fdffffffce6bcc91698f1678e13d4847af256bb46e2747b56a517dc65f85d29340dd7acc0200000000feffffff0152cc0e000000000017a9147a82273b61a3a8c5ca2f23b10eff78241f2194b487024730440220440de4a01cd72ea2e0e45d9ac6f2f564bc62c4b14223aa4ccaab94f432b05d74022032a2171a31e6b249109c613739638efc8c25e1a87cb2f8500183d1c164c3af22012102995dd866fd23f9f825f415ccef99f476d0938a4faaaf4810d9598ca15e6d948802483045022100974710a12b0ef7308419727133fe0f0674ce5212d3d2fa3579baa9843271a583022036bba9af4a50bd1cbe2bd2a6943eace1d7315698a90120553e6eb82fd6f3aebf012102995dd866fd23f9f825f415ccef99f476d0938a4faaaf4810d9598ca15e6d948802483045022100bd5459d41430026e75babd79af8185604830ad7af1195cf12bf29ec9733a11e30220666e122427a03bc115272dde6ec248ed982324a1a33ac92f3e80ec885d300ec2012102995dd866fd23f9f825f415ccef99f476d0938a4faaaf4810d9598ca15e6d94880000000001000000000102b9c5fe51040ab8ed7e377c5924f8060b3c6c0ea4e093d7135b3e23d1d95ae5be0100000000ffffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a4280000006a47304402206f25fa97b89e5bce0d6ce617596c979d903cb09e562da210b0a83f0e51234d43022028a3e2793be27ac2cec137948463ed61f53bc9da305d6593cb2a6458839e31f10121034587bbb1b533037aba2202eb171105882cef091e0c3db3095e18d5629d691d22ffffffff02108100000000000017a91411609da7142103ba9c1f81bf5c0f023d84af462c875887200000000000160014ee0bce9d56aa6fb65c30d4e3b1c6d5576337d02402483045022100dc9f6f3922153f40d98757ff245a23d51c9455b9af40a309e5c30045335b77ac02207ade904ecd8d3aa36fc6ac718f0d6e88459e5192446ed9a30e8311785491f068012102a92869d3ce64d4932b9335ab8b93b5d1b7e14346105093c8bb287e21fd2d4ef2000000000001000000000101c6e083c95c732e5780e1091ea906bc7d30eb8d745cf9e3115de84c0d25afab730100000000ffffffff02a0651300000000001600144fd3f9ef16c7a7a67867ef85bc92c3e00e70d969081e0d000000000017a914e2088a14e8e49e721e52bacb895c0d50d699ff4a8702473044022024f6692eb9babb83f521b7b543c2f744fb2136eaed6958bc77f9279860b3a1840220275f13f1b619274ed289461057a21ead07bff51fc148f991b6dd4e46d2dcf7040121035121c1a183794b0cc979c7d1e8deed53df5815e9d90b40040dba2fec8063ef480000000001000000012191328e78fb286df01e333123b66f9aecdc680e167915fdc361e9059807892d000000006a47304402201196efe01f32c4394eaac7a782c15857de15505838736bd83a8e2aac296e2e5c0220797beb0345b5f15b0920a392520b1c53b4654fa70a7a234004fac397345e08b901210334a0ad16af86561877da97befbaa3ca6ff6b2ae7fbed2cbfc1b44740d0dc1e52ffffffff0118f9000000000000160014cff86e2cc6287af90a0eee58a3d58cf1b825a3e8000000000200000000010161027d3c69b9b8687831d9d0631f610cf22a5bc99a4f72412b9f2a740286a3970100000017160014e013b6fdb113baa97a165ddda472b6f5bf1f70cfffffffff01f82a00000000000017a914943021cdad50ad491da442e3ead07adec62baeeb8702473044022010bb382a57a874a38248a1d9906e10589f89c35159bafd3cbf72c458c04202a102200ee1b13c6847d0bae05fe23b42b0641aedadff4f350666c63f647d6f621f05e9012102393e6e1d60c98f8e27236c1439b13d59d1b596164b93b930a8acc4f95ccfc30c00000000020000000135011c1fcd7c6d41c335b73625fde62abe817ab904c88eaddcc192035e8f8493010000006a473044022047221368b98a4cece2460b04788708222a25fea04c58907c428a412a4fa5e3d302205b6a4c674f0a22b32b6e82041d43313f2679fa39917217d09e0852cb6a83995a0121021ef2b7bf9db83f69dd1c61695fb4ad206fb60ac324c8c403123eaa74e6798387ffffffff02b8271b000000000017a9149c9e011f95ff11b030eee620bcf2851a10cbe682875c9e6304000000001976a91478a551abf692da3a932ce17e1301e124b90e0ff888ac0000000001000000000101ebfa6175cd50ab80987ede51d621400e6966d410645400acae4ab471c2ec6e973d000000232200206a9d4f73640f86ce54d32382a0623db8f587c1f23c66982aa09d65b1a2be6e14fdffffff02d33c0400000000001976a914564de4da4a9aeabc0ff4e6b3a94ae20efad5d3ee88ac2d1c03000000000017a91480a39286ad055e05fcac9ab7030d45164429349c870400483045022100c2ccc4523177ad4e795c2c59d120601f1bd383bc0d1a140cd933a119c63a3b6202204ae75f9c2ebd7071ad7f91eb54a39f447149ef1884b59c55687cc3da00042fec01483045022100e2a7f1c13ade943ff9d50c734b95395432d5262b234d466d9eef8d06a895bbb9022007f1e728e7024a107a725a9ae5c8369a32d382ce6d6276d887350a61d38735d8018b5221023dab7f4d9afade6f7bd66e99de4f7d79d3200a22624dd6e68203b95091c290cd2102572bf463a803ef91e8dc1789fc5bc721e7fe68a7bf23c97fcd3d7779aae0852121032b16e429717432df04c36004d804f62edd90d3d894ab4b75c8e5905c9d3cbb512103564c672b9816fcb2fe1ae40dbefad485e2095c7b41f8b571f0c46d2725a4cd3f54ae0000000001000000000101b16ded823047c54c4f72147b8b7b5855cabb43e37dfb6c421e2f2957c6202024010000002322002095f9c4c52b0b68126fd05f475cccb79801bcbc4821f3f114029e7caed1025479fdffffff02c0270900000000001976a9144c870f9c28ee7a8a9a2dbb88a766d69326ee19c088ac9d9e25240000000017a9147b5d3c4f7febf710b131bde6a5300273067ff04e870400473044022076e3b0ee557d67805e35470615f8e3af0bae30cafc28fa46b98435d38584c126022068a47c67f7fbfd74f8905bbd8a165dd0b10efafe94715edb7dbe0e08be937cf501483045022100e4b6b6dba4dd95bc74ebfc28240f9782c99999464f6555c36a97515ed4d72fd40220719b83ba1556681250702cd45851181832b0a14483888a9724000cf15e6467e0018b522102de655000a22e698f70ab09b4afb53da062e9422b87e7f718a6b5c77658ca35f1210314a2e03687d2f77cee32dbd646e0eb36c929f304e7969909662de5488f8b5b2421035696dd29f456d4fed304e31505202a058a4e47b9edc124b2a38348a5217fe4c02103c026021d4f405accf24f5af68bc7b51e4dd1e339cab704f7c556e2f5370bebc354ae0000000001000000000101805081a70fb4435b6a71e0fd0bb5149b6f24a5603fcae0b08c3d960f61dd355f0100000023220020c323ffe77c25f49e90dbf72362096d81215b659e4ad6a3fd103728f67a9de3bdfdffffff02d65f9300000000001976a9141004bea477f28eb1a393986e7c51d1a91b1b9b0e88ac6d836e070000000017a914c228bab36435b69820ca8e5cacd958d219a02fa487040047304402200d4b687ab121ca621aae40bc79e1ab760dcdf02e9dfa0f17dd9bc3cd369a7cad02201f85c72b782b5cb069068d0351667acd87f9e17567b0ee51f7f02b7113b68ddd01483045022100d9a30d0e1a210739b29ab2062d8b3558878500676b450c5ec3dec96f47dac04f02202d15c4e4331a388d7123f8e799de5fff801bcdbc462ae0fbc29586f298bdda49018b522102202882db8fc05ea096a41d5fe772333bac8a63200723e055eef62ffeb74e7fce210234cbd9b0d2b4399ae4b5290b05e10f57c7b283060d6cf6af0dec341647a7100b2102915ba416d30d0aaf829c38b675c7a5174ad05098e62e30dbd9fae2cbea7d69e321035f59ff9eccb93caa30c774a4e0d5229b47bb7d03d68309b00027b1b865f5725954ae000000000100000001dea80f4b3ac927e0a8cd089ad43f6954304a1756f2e66a61c89c608d49b89bc1040000006a47304402204cae3532f5de07ce76de8fdd00c02b3c201e3d9f5f83d3b6411be2c6b865adbd022073c4f1f563f6d8663f31302648f0cde9ce4f4200a6fad22e3fd1bc7acca0db04012103139de71caa01c8df5ebad2685f969b1764226cb939fc47dc381f3a759f307b19ffffffff02876b010000000000160014d92f697cfe4bacd35664c4fae653baedc57ba26b000e0200000000001976a9144358e1bdabe92b95fc558fef23be68cc9bc43ea288ac000000000100000000010306ea465daee14e65b1d853c07f189597dabb4c3954ffcbde2aaf577c39f0412b000000006b483045022100dcdd5d1623d7fad848e2a7fe929e2ca4c1022f841d8cb9fdb80bf9fa76a7879f022024e93ca35f5d5edec2734c9b61a42b71e268a61daee1081c8635c5a1769356ac01210311b632764ac2014e090bb4cfc41cd77bc6389a54c0db3785e3cb68e2c2ce3e84ffffffff9ff5f1df09f8c6ba49d73478b71b84dc2eae043829ad3bf4b11e3cdb77171045000000006a47304402200d446257ba53f35c9e4a06ef45892602c901b17f44d355a8d0404d037474c161022013792ee1d6a755c97b610a43c8e7dbbd138ba8ed6580a08dea1aad58c12706a201210311b632764ac2014e090bb4cfc41cd77bc6389a54c0db3785e3cb68e2c2ce3e84ffffffff5ac976af33cce46f99113a28f447043de42745245c8cf8f1d980ee5307ed11790100000000ffffffff027e1e9901000000001976a914d05891a138c93fdeb3d78fecc241681e6451a3fe88ac615d228b00000000160014a797b869a758dc2ca637a78b4736c668cc500bf80000024730440220247ff9aca35ac660b118e1168c983c52ea37dbe6333f62f0c4e6712d10c95f3b022014e9f7b53bcf99de6194102d7c83518ab910fe401589d7b9f8cadcbc2fd0c21b01210311b632764ac2014e090bb4cfc41cd77bc6389a54c0db3785e3cb68e2c2ce3e84000000000100000000010197c4554f57f61b09915b23c75eb6e3d9dfd4838de7111299abeedcc7573fbb940100000023220020115c4da1a0e6e7414964e3e6813b25fcfa9bff98e9652c33f6d11512e4676d7cffffffff02400d0300000000001976a91470e4134838bbf2052f9b089797a2fbaa851b8f7188ac7da619000000000017a9140fb0c20eacff2965b1f2594c250c165dd4450ec487040047304402201d3c45b5ca87c6a7cdf12b05d0b9b572a94ad7d21edb3bd924cb8fb72ec9449d02205ada19953317034b791120e985abe08c50230e7d6759c667d16f7779c2649ffe0147304402203146baf726d5217336147da6899d0e52d6b634aa8fde095ca37e7bf22637bffe0220259ec5b207afe9d56717ff7e1e0c63f0586b81afd98d091b4a947fa3b9766a430169522103110b6a279de37085c775c3899fa8bf3c7a734d346b86be7a6dce55a41623b4ec2103ab719ec244b513ee8a77598ef7a5177e7091390a52078874ed74b5e79d2203b12103b4e0d0ba8bb4a77b53175b02a8c311b57a7dca6afd5f20596d96c46f11ed827d53ae0000000002000000000101a4710c60703fd708b84ddadba09f7edc9da9376971b566f0bf553324dcd7d1050100000000feffffff02d4f9f6000000000016001496ce9461137c42279022273c74a95708bc0a5b5a2f0361030000000017a91485bb2e19a0001c09a865d41d8c285fe121c76e098702473044022065c902de3ae0670e04987ebcc16a6ca2cb22517e52fa9eece28dcacc1a82f80d02206181d0092615dc74604140bc2bf798f20cef32360682a138b330fcc1fe946ac10121036d7b7eb90dff0a04f824ebe797ee200136a45af4ed03bc0bfde900a5ca1e685349a00a0001000000000102cda994f81e9ececf80337bb571a0e8915b19e9f5239993806bf4620c88fb7e040100000000ffffffff9dfa2855f969d2f880f07edd915f35512955859edf62e44645e2fb125ee82c1e0100000000ffffffff02988c1900000000001600148c6dc479a7b78d28e0350b4be4da90dc528f7320139c2100000000001976a914dd129ca5bf608ce52975bec42f97c41aa08d126b88ac02483045022100939476deff51e2fe7aa7e3d9d431c561bb67fc556c5c33f51c071d42e9a7efc6022024706e87a3540694588ac6738b67cd2a5eccc2206649118f09e6bf82a3ae00be012103b1dab4ee9060eace04f67c9f837c17ba40c39ccaeb11e436e0e5064ff7d3122d02483045022100ae0ea3b11fbe34197c8d91f59b0d86237270cf9ce89788807c01948ce0ec80c40220573874bec61c8bd40439933447968315e58114dd5785ace050477664e4c0533501210268ec734c32682036d1cd35f74669da84a3881284534c83ff18ccf57d2db5fc960000000002000000000101e206afe8739d2d6830c59611227070b1ccaa0b8f5011c9542b7303394fc3a6940100000000fdffffff02888800000000000017a914ca2c26d4a05b38f38521450a75f5e5e2e76069ca873e29010000000000160014411930375572868f110ec6ed0ba93c85a651e1ea02473044022004f5ed9bc5ee89e450a3dc6b1ec373e460194f1e18f435a0a465b368540c84c502200dc4cdd04c693030ecebaf9bdc0bb782ec82bdc7d372411402ba3e0aba6d83a5012103b07d4813ff1ecd6e33c53ee575302bed2b39649ac30a9ac0d3e7f697db6eb15e49a00a0002000000000101bd7325001b52902da31bb6140eb15383e8b7d2807961fdf6b5550551b7dba4ee0100000000fdffffff02ea6400000000000017a91415cb5e2336a03cb548351e3f898f3d3f4f4f4c4e87b9c0000000000000160014e5ab16a2edd4ef52ce2a7d19b9fc20804148e00f0247304402200338d4d8341022b86540214a9b3799b7ed7e0a0051559b6c4265858d1345c5c00220356e74c17f5aa6fd21d69b6a471d63c60ba525116d90f66847210b94a924036c012103e5981b8fe2cda9fd0bf8cbda989368560eb5f4a90284355a8705cd96298b867349a00a000100000000010195194bf660bebc5fba571c0502aa4e23312f0d65adda987c44e61dd0684215390100000023220020115c4da1a0e6e7414964e3e6813b25fcfa9bff98e9652c33f6d11512e4676d7cffffffff02a0860100000000001976a91470e4134838bbf2052f9b089797a2fbaa851b8f7188ac3d4bbd000000000017a9140fb0c20eacff2965b1f2594c250c165dd4450ec4870400483045022100c18a958d18ad97b91a54a7241bdb327c83b6a3246f16f30a3491c189286c3cf90220589de133e31abddf396eab402ef66dc91e9fbee22cb2d337fa45e295a8a4e85d0147304402201a74b6dcfe02c51750ae5a2be93e2fee7cb38a7098fffa6426b09f7d693eca9e02203930bb60703f6ecc1a4b495d0de32ee15459ff422fa395d794baebcafae223e50169522103110b6a279de37085c775c3899fa8bf3c7a734d346b86be7a6dce55a41623b4ec2103ab719ec244b513ee8a77598ef7a5177e7091390a52078874ed74b5e79d2203b12103b4e0d0ba8bb4a77b53175b02a8c311b57a7dca6afd5f20596d96c46f11ed827d53ae0000000002000000000101ac6fbd96de91ccccf8a175c20cdb6d1cb40e23d3a498bff63725052375ac29790100000000fdffffff04beb10600000000001976a9140d92e38813e7a6a8629c87d1bf63583a6c620ace88ac6f3507000000000017a914b8b1a7519ebcaf64ab43402551d5682a9fe3049a87187d10000000000017a9142726d69f62479091bfe757c27892073ca26295ad87ad0c940100000000220020cc2d14c551e9d6fc49ee0d489fb79ba78501b3c4e755cd6fc6ace8525edafe94040047304402201fdc7812317d855f59a83358186bdc6add74099dfdc5cdca4647e60ebeab317802200ae0132ce347192326f459749c37e85c1862ef8637ac898fb3dd9a47926e26940147304402206a5875f8cf5f0cdfb600bdd92a0f9a4241191e036d3e61d4a76aa27bd5956d6b02204fe5c5c1d938eb161b3cd5542dba2db5e31d87fd59279f8726deb9c3d571423a01ad5221026663e680542081ee29a0f24818914befdaf6352236395df41ea0a10f4242799d2102e426131ca66ad45aec1274d5ef9842738861ffed1559df313942887ba694793d2102fd89a151627e19431b90e7e0cb82e3f9a03a5795a2167f0beb86430ecc8187be21034625110b7266183912b90c3c2ba27ae5b4a80e07a2cdadb3df9ca6469e066aaf21035c2f3a4b5fd45020714310a8f3454c3781eccfa3a967b6539b247020254ac1d555ae49a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70600000000ffffffff015e9f82010000000017a914d5ccdad95505b0b8cfd9deec7a9752302e7106108704004830450221008c710cfc3f1d1111fe9edb563d6931669a3733ab6204ea49198af3632823af4f02203627e5d267f73538a235525f8fb9817b4e31fb153890424d68443a91d96e615901473044022026e3880d0f8bb7135f7bcd325e19d2729d6b968a03b558f6cefd2365820c76bc02207b6ee06a2a073faa941c97aad52f37a9a6a078b9ee8860d9730f4f0c2b5f36ea0169522102b6a7effa28e0dde3b3390a14815c148ef069669bb799ebbf56a8946a83c234af210221fcf9be9338f3623260cd145b01bbcd0f29353d20da8932f1205bda236b890f21038151e7ea6b71ac5b09882ba681406d8fb51990859ed6735bf6ff17b906b1609953ae48a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70200000000ffffffff01913a43020000000017a914b81d35dd0e248e800088eb41a7497d26e5e2637c870400483045022100c910deb5422a82de20f1fb48676cdb51d19b0d58519763dc2fe20f2c3dc8724b0220263578755ff4ade39c77b22677ed40f5ad3ee5d2ded8826b44b7add52f067f4201473044022018e43826f1266be378304163709f9fa5441f0ba78629cdfb3b116d5eb7f3a25302207d7ffdbe65d7ad516f89843dd380896cbfc81790444aaa2507f795fffe22724301695221022d7fac9ad0a0e949236b1e78e795c73ff5c12be002a7b22e2061c3b631035c21210207065a9e2e091f19c9c1f235a857cf4075f4edacbd87c95a0d703cfc33be1fca2103a6853660d465f7b12ebb627f68fdb74de8e921b8ac6fe258f3bbf2962fb5375953ae48a00a000100000000010124feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10400000000ffffffff0166ebe7000000000017a914b81d35dd0e248e800088eb41a7497d26e5e2637c87040047304402203dd9f7e0d8fa02f3898d7ab88118209c0c1a10e0ebd3227c3bf34653d57dc41502203446326dc15abd83eb9212f7067344efe8750540a36623510931b65dbf9290dd0147304402200f21c68e284dc058f075dd3b43225907b8e5abac9bc01e4a1588e4bea7712b5502207671e2e5ccab1acb765e9ac2b14cb503ba5a6450a6a022e061bd792ea05061b1016952210393d6886709576c50a9af171fbaef2b04869c0509c7cd4905188af00d381f79272102a12bf428c7a7994884598ccd71923ca6a99683633c7cbd7a3d2d897d51c219e42102c6b5cb044a31fcc0ffbbc131b010045b2ad05a3ebdd8f9b6fecb993833b8537453ae47a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70c00000000ffffffff015e4cc1000000000017a91478fae23c356b92f21335dd7f133ab0e7f22a8d5587040047304402207f258eba52d242fc7025e9fa6590b0d54c837c82d8c543ad7ff1f03599d40792022047401290237f085908d755e133d91bea1805e978986c1195d6a77bab8f38b41d0147304402201920274ac6027e242fed99825330dd1f3d41954094a88b294a293ace724a367102200f16a64e5c093fd156dfa1a0a8fda418d35cebfee4ee529596c83cf36f5e57240169522102571e6a8155e0e110cab083a574518763fe1111a13666e266554466ca380bcd65210242f9679f868410249cc32c1b13b42c5848e72327f55e1b2642f43fc7939c44292102357a24d531a17e18568583513730036fa08ea203ae185c7139150ee5b4a92e7853ae48a00a0001000000000102a028a64b0cb77920188f718c2cabe7e1bb2f76bc9622c60713e718c5b3232119000000006b483045022100f8d0f91af376879736849d21a3b7ab69377212480d436542765fe366cb301c6e0220553dd1fc0f63f978abee9a4d38bb88f60ad64ff005125d4a46ff4315869735a4012103508572b63b0fdaa2895159be68d30d9295a6a2d514e9d449ba84507d082f406affffffffb3f64aaedc39037db7ba23a22294f4642b88619cffeca22ed70a6d2788d1b5f60100000000ffffffff0200743ba40b00000017a91431c4d79f52873cffca23cb16adcd50b8224494da877d5ca81209000000160014014ed9fd1f0ae0f62752af58ea63285bc05715810002483045022100d559da015eed7965b3080fe6cfa2bae7a3278ee11e39bac0825d17cc45a0ee200220477d8518120ec026369650e22902123e1d491d8dcb77151d40ae172c3682a8b101210282b4af8a8b9c1b5218b6167a8ceb9bf94fd4811d718b4a932e808e6850f46493000000000100000000010161b2512bf39d776e30b3f51312a7e5ffae23d24ed8d89edffee87e454e1a8a681600000000ffffffff407b81000000000000160014f78eed6e5b94ea746d48845f0c788459a02056e1f06c02000000000016001460da72fcedcb2844b111e8d0336b09e877d46b9258af01000000000017a91431948f8d8f1d558c20706fda577cb7a5c9048ef487e56d04000000000017a9140938254b6df3c7323457982e58c99aedf690c76587f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7685c606000000000017a91495373f4441336f0e280c9fd55188b3654af0552f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7646070100000000001976a914a3de3831d9cde66d171d05160e22b7851e2e975388ac0fc50100000000001976a91401fbbd494977c9fe6e236c680ae6b1c175c06a9488aca34107000000000017a914251282267a067560261846306e73eb65f5b22eed8718c900000000000017a9145f4d7325c8397feb03a95224d93330b4a8433eaf87eb0502000000000017a914c6b1b9a9456937480ee81e9179aabba36ed65f75874ab001000000000017a914ad899dcf3bfef3952f719a07e30afc2f007d257587f12d0100000000001976a914d20e7d647f12b557571dda96fdbb0f74fdcb437088acf1350200000000001600143d05e399186c993a979b65df3f94990ca2a44118b9ef00000000000017a914ad23f0fdf4fd70e23e363307cf86a5180ee97846873c620200000000001976a914932b076a66e4dbafd370368d7911518685fa1eda88ac6ab9010000000000160014702d72c42a1f816de9d38f99b9122580e234a9972cea0700000000001976a9146427acfcff816ea1e705107b1fab653f085d552888acdd1b18000000000017a914363c34e7a80aab9278ec65bb659a27fdb5cfd9b0876b330f000000000017a914a5e41e336564a5732e87709771794c4e790717518700e1f505000000001600143b8e46159b1505c6c974d6e17ecb3a3a347018653bc804000000000016001487b32ad281ce4737e35614f49271dc4a98c19d880a3403000000000017a914cb11abbf10c3bd7674f2eeb9139f8b7b474bc7aa87bb510500000000001976a9143535e7d0deb181aefa9e24959b04c46d57e82afa88ac36150300000000001976a9140d255e2939962ad1f744f32d036767d3a5c122f188acc7cc0500000000001976a91480566de31a02888fb012a2bb80af9d11ea1314fc88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76586808000000000017a91452cbb7c2020cd03b0d6f3aed5fb00bc6822fd0e2878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76004a02000000000017a9143e736212b0a5bc438bcb78be17afd0f2ae34cddc874f320000000000001976a914be93f892ca3520ac2e51fefb959783f93a5d0a9088ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76633c0000000000001976a9141968ba5de37af00a5f498f9b64d956252d1dc88a88aca6c601000000000017a91431da02f6245e22b45d1f080be0a6290178cf939987ffef09000000000016001431d48a865487bf9514f8549768e9f8f799dc38a15055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76265600000000000017a9147e2f8bd4e0d12278711a1c06fa1166a3c26d2d93872f170b00000000001976a91427022da07b3850c552951db6287b3017656dea6488acd85301000000000017a914069dee280be61f42a650887eb2e84e9d8e3114fa8743130200000000001976a9148dc5c6cd0f504913f44eb4e38b514e111fdf860388acb87c0200000000001600141667c22ed99f58c4c4a363b25311159cfa9575c28f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768b900000000000001976a91407d63b7590f190700c93d7b28f92410353c79d1388ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76292b0000000000001976a9142ac6924141fecc9b92040bd24e6bef4a8667df7888ac4b981e00000000001600144ba849344df69ee3916cffb7229621ea38ad44ce0f250100000000001976a9141d6976d0c3ff79f161d72ecb7af9d05d22b7346c88ac661a05000000000016001477cbcdc7ac865dd21249342fcffb50beda72b30de16d0400000000001976a9145dfbeaf9c61c53382b608879b66f6e7dd3086f1988acfc0025000000000017a91491dcbdb5976ebd2b0453c992ada033d994275e5c873c9b14000000000017a91480ed19b90491c343f54ea34e1811a4c9ae875edd87ce0402000000000017a9142f62687a4d7cbfdfae20d3bc0307af25e34342d08790d00300000000001976a9142a7f96504d563af0e719d6bd59b834e4a009840188ac401f0b00000000001600142e9bb05ada9f137abaf77b3942b83d83352b672938c70000000000001976a91451d935b5658a1ab33119f1ee45b6043687650ed488ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76525600000000000017a9145eec6f7365f4f933059c17c9ab892375456e3b83872ed90e1f00000000160014988d973f77eef4d890d10913f7dd4356dc74acdff654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76838601000000000017a91446fdf4c7b5b8f1d24a96931ee688aa255f1a048087b0b300000000000017a9149656a497ada4d3ae313f35555584e80f3a5d85d7878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7602483045022100cde09af7a728d8f7bdddc5db182c40159a52f7dc4612084414d0c5e54a2678ff022067550c610cc2128c9bd9fc0d1b69ee417c1a844e10fd2677d2f68c34cc824d4801210313613f900fe4b9a99c8c9e7bc3090cba15aa26a93fdb5c013ad76374a59d34c9000000000200000000010158163773e743d1cc139aa942de3ddc414bd3ea75695e1b9655f92d710f52f8202300000000ffffffff011be909000000000017a9140336f5e6242053ce4b509e5841a22efd88aa4c3b8702483045022100b53d941513f0f3dfa762e3a67c0ea2e2de97692a6fc91089dccef99c788f6c9f02201f1b69912bada43e3f6412bb2137683bc904745d1f00fcb2a8ec1b56b02a1b7d01210271abbdd231ccb7acdfd4dc8baa916d8aba2c0d2eb9335f1d9ee668e11be3264b000000000100000000010dab2a2a5dc39dd341b9e7b5c8aad82bcfde7b7fd7ed957b86d5df98ad438b69190000000023220020fd7bb3b13087d4b9fabcb064ff0697bfb1c56e3e9b962ad5129b2da59d7563a9ffffffff5c1ca1e60ab624d80383b98ac1e93570743d7318efe2a5f972d026067297b7210100000023220020efbf05b9d8c9d62ad97f112224c73f3d162e0b010b958ff47ab1516ae8f9e092ffffffff05cee9cfc319e89325b1b0125c5fcd48e8ff23c75eecdb6660fa551fe1d762720000000023220020621c294541fa8075f6249607350d8f0fd5098626c7bd035a8a6cc29ce04f033fffffffffb6dad996a2a73e308437082555e68fd55a478642905dec4d2b63dac67de54e7b0000000023220020ac0e24c09ac57b0ed81f219782b1fa9b9e91cd4f2c55e5822ede0b274e7bc1e9ffffffffa6875345d5b3ec78de6d3d0a248e1eb8dce9d40773cf818600699db32ccb827b0200000023220020205a73fe8035e0ecd7c5483ce4001553753f1c8d5bfad1554b0ee7add6ec7db7fffffffff146e3237d643e960d4f8f18c9f23ccf2c0515abb15346aa51d6e5d6858ec89f1f00000023220020a28b423e3e06a76057bdf5ee9183fc774a9f6194bd3bd4ddaafe010dcf59ad2cffffffffefb9cb8ef61d85f74b460494204ff7783c7d6f6c4484f4c0f69b8866b8bcb5b63200000023220020453c2ef4bdea9bcaa4335555bc9c574bab4969bfcf38a25661a03eab839df47fffffffffdd6050291da2265bda67fc80a50d1b4f80eeb141855ed0bc0ef02c6b0a1600d2010000002322002051bc566f6d7dfde669f1ff3fd239d9d083bf8273efac28870235798482835dddffffffff9c389deeb1d9ca1644675250e2826973e6921bff853081eb793fc07009cfb1d50000000023220020830bde4d71989fea2b64c5583856ccbe88c745dad1d80df3d3c9aab28c44d800ffffffff0a9dddc9b2458f6539e4ba9198c4a82d8e27bbfcad79f195eac51b8a3607e5de0b00000023220020eb9600a9d6119ae7238026333330b45e01714ac2080c7b0b06f4d511e68972ebffffffffa2f8bf77b3ec6c564de7b61ed8878b99dd60156d7521495ded3a23009c517ee11d00000023220020b684dc72421a21f58dbf128b30fec46da82883f43abe413795447d04683198e3ffffffff6fb6d7552282b644da4cc1799bfbe860d5cdd740117cb019d362d64b17105aee00000000232200204c68c3bafe902c45851e6090884d6401aad8a577eacb6aca958694d5b36b9087ffffffffbb46fe63b7f84ab9b03b91f92d76513064c553f4c413c1435c8af62f9526aaf40000000023220020ff426d0452013292ce3c22b93798af643d3afd4534308b5eee2dacfc79d71b7fffffffff31541500000000000017a914b421768f5ec385ff153332d1997362cfa323cac087d81900000000000017a914ba76ecd72864db8d8a72cf51e274303ef9c9e3e887e81e0000000000001976a914a49ed29b981917de26f5cff3d194348129030ad888acc3210000000000001976a91475d1057358c21d38ecc9ca84486f4f996745318388ac212b00000000000017a91487ccb189e63061243d2546aab17b69ea13bee6fb87df47000000000000160014a88e50f5cb0183a8ea3f76569bb0e52674f8b5a2b25100000000000017a914df296f16073f0a1b80c63f2fd9551b9303a128b187165600000000000017a91497b59f407befdf2fcc9d9b2cf6e280ea74aa3222875184000000000000160014eb49832591091c05a4f6f05977037311551774f6a98b00000000000016001426b5be4b0ceb86e408b2618c2f317b21a4327738fe9b00000000000017a9146f94cc24ce1927852b8b8ecd175138f07a786fe787409c00000000000017a914f9f9a9632fe2701774cb92b3eb0a7467d508fe8487bdac00000000000017a914709502f35d8c10b1ec772db8dd71c52886169589877d0a01000000000017a914bfcd75ef81bd2bc9518923768cd79d6daf7ba40a87472301000000000017a914dfb4698f24d39b6a5577e6ea7436d97b7c6b9c158754a90100000000001976a914d70b9a7c77fa998fa2f4f156b03d01453cac5edf88ac9aff01000000000017a914cd21065c8626548386f6a4c1d88a0f57aef0969f8710020200000000001976a914f44d676817120082350e6df646803cec19eea1ab88ac8b5a0200000000001976a914a241f6466a2b005b9ef5e5cb4a59cd0520b7544088ac186502000000000017a914c65de974746115196fc87ae3219c110295bddad087d4be02000000000017a9142d5070d31a56b07edfc59e00749116ad08a97c5b87630c03000000000017a91421571ea0e73cd5672382873794bcd5ae5bbf3abe87fd5c03000000000017a91439aa13b8504fd72fe268b50c27fca75bcaa3c55887d7f10400000000001976a9149b0f8d3dc787980e73d278f32f7d78190a6fecc488ac0c490500000000001976a914f4203f71f3703564d981ef2771a54119b152a35688ac074d05000000000017a914998485d8e97d28bee276c88ab0ce949fc890004b87c58e05000000000017a9149ff87c43ff130a9f15e7622577b4e6b4000df5dd874b3e070000000000220020df3ae00e53b5b5fcf94b7931fecbbde2a3bb698a2d8bd9bda883171c9341fb948c700900000000001600141b56de4e92f890917f3b57f8306242d9bc79bbdfe88c0900000000001976a9149a590f72cb7ef5990b18be652105362395faf06988acd79f0900000000001976a914f03041ff7dceefb287df177e6d7314d5c2fa93a988acb0ac0a00000000001976a914e294793ed359e174c0512f1f01d69d69befb0a9d88ac9f380b00000000001976a914b38c3a479ee8f1e8322a48db35d59c0d479fba3f88ac95920b00000000001976a91430472862774ddd5409a9db12d1665cddebabe0f688acc0980b00000000001976a91404bab1964805a9b863ad47e16c98f043b4ad086688ac2c560f00000000001976a914c65f34404da5b594b8354dc81151012f5184734c88ac631b1000000000001976a91468c08346af1cc923d10dc59575e71ce52d072d4388ac3cea1000000000001976a9144cc42d03967211cf40fae807a2e8d65b81878c6e88ac5a191d000000000017a91436f43003e198836790bd38dcfc9de801f578ebca87beba21000000000017a914b4eeff991416ba52cd2b2429f7deecc15042a1d387cf452300000000001976a91461719609d6dacdb42c25c90c48afaea442afbbb588acc86536000000000017a91481219484abbc4a2916dd83f66bfb29ea53d8d50a87638d5700000000001976a9146feb8c41dced02fae2bcb6732311d72276a7ed4888aceead7e00000000001976a914eeade5be34901d606717adceafa240d123f11a9c88accc46a800000000001976a9144c6447816d1588f324b0dcea6a1e02dd562edba588ac4d34cb0000000000160014b28498a4489ca4e0f99efaa04f9a18051e4482e2459d3f01000000001976a914a135f1572791430884f74359b1413546a88ef0d288ac3eade501000000001976a914dc99208954b7945d2c74db3b569d245ec3e691d288acf4c05b180000000017a914192ada04d33fba323fce796ee801604c5d251b2a87040047304402200773f49330c42a1f39b08d3690c0ace7ebbed1f779220b2b6062b9256a5c9f7602204813f998f30d0e4e11549c924ea756fdd0afa9bcb95c3a2e2e8e283e4a8dbd0001473044022019cafb26f4c44e969cc6b35386cdade05fc6df6580063bd6c6525ffc91716cb50220538c5f86388a1f485bedee667822832f4c0c4459695646ee7d8f07d75bdfeb7e0169522103c7c4b95cf42bd8ac5f260fcce585f6ab1f3a3cef5936f47abece11ecbb345a902102fc0c33566c9cd5093ded3e5cf29e22e57ca0740ca30ec1a52a9e0cbc56a0dd5c2103efb5524f7f910407226c6b737454f2a71c6bebd53823c3ba2cf0ed246b39568b53ae04004830450221008d0405cafd3222ea5f3ccd1b35f647457e9196e9ba8109b9569231c3bd3ce0ce0220359dd6be100a765a01a4b27c3a658d80069efe31df2ec8524ff66e7dc783dff4014730440220734297f6a9620f9c675e5828d2b9bc1d904d07393ba6b279fac1a8d376596cff02206ea0f70dd06a980efaa716d10760aadfecf71bafea66cd26d045927d8dfb105b0169522103f2cd5d06492c88bb3cebc64b99c03d7211bdf9c8d944741162394870ace801da2102f45fb4bdcc3d9f5d00a45f73a2e78ddaf7fb34709bf6f1c52487d9e2ee2b88c42103b15aba2755891815aa55329c50ad9a387f4935605ab9cbd15ef1d95fe8be6d2253ae0400483045022100ca76d322e1541d07805f2298720b8cf30297190667dd0326362b0d969fe4f3f90220581f32aa19d5b0865ce9912c2601f77c788f215fefde8303528bb0a5b12374950147304402203b2e11457844de4fec9f131b8ec351e5742e5fd2ae02677ef213b18025489c5d0220648759ce56d4f28ac55a7c9ca6ed5bd976c046970b5fb99db1af3fba53782f1001695221030af9f6f078495252f6eeba36f74ab283aa62338ff52e918e1e6ce3e156dc05e2210326afd1adc9709b5ca3d511a7b39b647b6e9cf2e1624e00277b89105f34f1c27221039f37c9619e21a79daf474444f1bb9cb758da679052d1d0645ca47dc9bdfa1dee53ae040047304402201c238603dfb23817317c8596fd4969f8377d385b2070ec92502e6541b13a2ab00220432e90f45ab57f60be1c46a6aad2c3a6299b9d733410a23bc66123e6f44ee45f014730440220587b8f372616bf638c65a376eb10af19f41c06f85caed69ef0dd3640e7afacb9022015b58a3517f36b89cebbb459c49ee3312b5085afff582f5c016209ac31d78dea016952210285bd8a340716dd08cdf150d42b0bf8f44c0655177d71316ae7ca959a9bebdb9521024dbc5ba534d5a8749c084014868b6f902477cd168a2bbdbcf965b8080170bf9a210200c1e819f0d2f039da8f737980eed8f54a3ad8b651117525b6b1df2b8fb185b253ae04004730440220179f263f8aabc910b5e018886a604c91ea9daeb8c2cd325eb66094621fc43e50022024b6e747d73dc1bfe43811b284ef866aabdccf09b70ed1f2ffb771c10f8475fc014730440220778c78cd40eee0cf9094dab19affa26329663813c36553cd4f4305846aea6c5a02206ea20331fdb161c09d15e7d3bbaf1d17518d62eb26e8498c60f865c042d85eda0169522103702469d25264db1c601d466a1edaa069b8c1fa31eb4bd6a2932a87fa013d31e62102eb1a34f7de378c3953349ee177f5e549aded05f5f6c93287fc29d9f4ffa7598d2102a99689d9bae4b43e7d87ebf58c76f2baa902e1a71d5f454568ef8758b5d67b6e53ae04004830450221008ae7b2f4d24639a7c8809200bdc8c95306fe252988beeee0a0f97b9bc6418171022061cbd12d062e5261ea6779df9cc89384533d46008514ccfecc0dc034d2b2e3d60147304402202643806dcfddec1b85d6894963704cd7b0380afdc4843c8f0da5c1fbb33b5baf022025503c85b511635495636de36aea3b5f461f5fa50b73ea7cd295900d7435f6990169522103c388ca502d5bbf7180fed6dc5149edab2886f0efdc9fe1d2c74dd04891f1f52b2102cb2ebd248e90beb18219094823a64eb483ace4035a12e08e0a61becc85964f9e2102c43fe9c39ca9e82c047bfefc65f3d204bf86b24b9ce024ab386a7df36bea8c5a53ae0400483045022100df2a7025fbd9328e6a1233bbfa2d9aa62dc0c3305f8b12e5066552cd7bf2307d02202d154215932576ef41c4b059e3eab2b7ffa92ea65a6f3d54af6258ff4bc6d3750147304402202b4dc2c7c576e3eddf354a9f880e6ebee9a675c5ff328613ec2b45f52d5c221902203eef67e1edfb236daff9e96bc0ff0e559a54e3b4d0be8452acc9fe3f581570ca0169522103f463bf4a7c2d2ca143982e089a7d40c095b5627a56770ae37a2ad369c321be1a2103e9caed61c98d69824fec45f5d116de090fadf7e43c756164d761aa1612e65f8f210214c7482bd0812e715e39b951cf82acf8c6bb1c8320aae6c1670b6425acd337fc53ae040048304502210096410ef526490718fab375b96c85c94cc8072570a5195b54827120e2de75ae5202203883bc46a2e54629fca5353cdf64addfebd811ed96f0dd85eee9cd26beb95ab90147304402206318d92977ac68be407277a5e8cf5308556adaf538a2fedf9cbd1d2f72a49ef6022060b3fb21e278eb02136813b0885683931d295fc5f590debb2c16833d66854d8d016952210204db684fa60ae08d538ddd96faae7c71e55f9c49c1a2307ff7f71f671f28e1562103e0f5eba9b2aad862ce35059bfee908352d03ceebc6278103752f2e341b7073df2102ea11d505ded009e6b9b2e8a5617b1c98363096fbbbfdc71002261ed1b134658c53ae040047304402205d10d9660168a2b4eb0a101b7923508e1ef650d21b2fb9001f187a4c461928af02200797a40316ffa1ee4fa8752b82ce29e3aab3b95a6bbd41bfcdb7d310555e1be60147304402202c1e330cf7c6ba13d8cf4035dbc54d37b24994bb80a3168ba142ab471876012002205bd402c5f6d7d07542239edd9c09f877b5b344158a93fd6bbfc3dd6eb7be0bdb01695221020ca067d3658f51286ed05fbdd1da13e4ad0460c3bcbf73afbd7d26b74dccc4fe2102c4fd63df4343e7af31b92a62ff9a8d7037d084866abefbad49ea87762a0055df210316aebe6e38a8b289528cff7f90e1254acc2a00295e2030864816392e01cddbf953ae0400483045022100c125e28e303bc09954796a18c3c082434480632ee7c3cde2a652c593b1e2d326022058379bc69f619b33fc93ba442b3152754e107d048d846b036a2308cb195fdc8f0147304402207ed61790513d7124617a7278a992e6572aad6166feda00966b88dfe49d2b9119022065310a8b827a04809db426c1314caf99cc15dfad46ab3742d9f8a1ae8cab693f01695221039399df644b35e196fb7b798914b11f9ca41e7ff2c95e06a555906996c6f68e0d21035f998e9e029e31705125e8ac180452dd46983ced0614103ffef4d481a099dbeb2103323cea88515b18a881f0c6a0bbea5bdfffa27a5cf68f27fb88e9fca60cb07cb953ae0400483045022100ba4c3e6ed1e87a6be36409d9296d167d64c539da4fb76678b1278e2e2c8f3b84022076fd33e0b3271fedb115b43f1ea94e6a02bb1ca4290b2b50d48f9ec116221abd01473044022077f91f5c233d1ad43a58eae1091dd7b5a76fd8f756e8fc5382d38fe4e488962d022066aebf69c19c0be9d02fbeb3b5c025bf048570c1087624c7c438ae6333eceda0016952210371d2cda4525d00a9d0a5d34360f66bc773b657b271b234ce92be659d3acde9922103c61aa79387eba17dd40391c4d49f7d90fc1804e810804a2f5caedb3e580d03dc2102b20b0fdf22c476ffb0036606f90c3d1e16b115a954593bd6a0d88ac637e4b0ae53ae04004730440220435a791c65af8da60493e4e6bf390b026134b293fa921fd16a24f945259add0602200b6daf9ae9c84f93ea2ecbbf211e79147a2531ebccb1b86c16b2e27a646982d601473044022044c14bb09d7d97f14ac83118035decff0571b81f4ce67becc9d76e0d442bdfca02201b06b7cb4e8f3f506fcbcecba07f851d273577a6282898087fb0cd54534a658e0169522103ec98f345908dde3392d328ddc9a98bba8f981aaefe4cb8f10ca4df3f099ff32e21025a1bf407819f45d1f3eeca3e63d7c71793b8853b21d2f80398d0993a9efa9e6121027ab6f9a135bd44ffa2b282e1493891c8e1ec16d0ba96ba79bff9914ad8b3c28e53ae040047304402207190fa7397a07c67fb9c0a62c7d5d8f4139939aed766f7168b80421d763a9ad9022041ee2d9fbe66af0fa127669eff1952546808fe218d323c1a369e0de6c7f1dfe001473044022014ca1c0cbcd9c769512540904e8af5efd232e5a19f4fe34e0d019a4c4b6f74950220179daa19c42c9605481a90d1e4c66947d084dee4efc54aabc9493f08a49f0c0e01695221022d5a0407ab95bc062e7e5ebabc1ee40b935dbf65bb2c6ab53d0cbc27f537b3db21036439700ca2b27046d174a40026e8ec854a8eef8af393c685740ac50fbd75c9cd2102153fac9e03a6b23e6c1bc86ca4ac61444655b6e653ccab3b471a835239be05cf53ae48a00a000100000001ee86c40d84625f2d3a46cbe5ea74bd77e5851b5805e7e6aef39b233e23adda720f0000006a473044022045f81c3f054a34d604071623a480e5ef6175fd7de99ce6673f4d89ce36023a0e022047f5b6b62f3fa16b5da13f9908e7c1a3b0ce41a0d1666d9c26090ff7ad777996012102fe2708466e67f4cdaaf5b7b3545130bbfa2121e71ce0f778ab487463d2511b6affffffff0109a10100000000001976a914eeb8bacc9220f59abb663e432985ee200d427f3088ac0000000001000000000108ee86c40d84625f2d3a46cbe5ea74bd77e5851b5805e7e6aef39b233e23adda721b00000000ffffffff0c238d8951df9942482feaffadc32daae5da34439625a1ae0f89fb01ab772e82040000002322002020335badac421f00cd72ae82cfbdd0c0620da0188622051e99a07d79ae613723ffffffffb08f37eaa57859da21644a17ef0808316122e5dc2c81f9efdd75b6d9a707bf9e1b000000232200207639310fa495fc266d527e9405c3a6daa8ae52a5087cb82f791c9d0a0fcbe144fffffffff9aab8b4f24d7d7727b8ebc53dedd0967301916e8fbf077f5ddef657933de5a30200000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff672bba2c477b07eaa6b187691444e034b4f847d236c4ce8a90a77d1fb7ec3abe0700000023220020d089f182bbf2a486a9b003ebaecd6ab5bcaa1b299a0f7a3823c74bbe2c5ea820ffffffff2f8c010c44bcf72590d0e82359e8d2e861d6b8338fcfb07798573c9c91b909c00000000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff3a861f47abb52dc93c32b89bc5041fe4cc63938d0754748e4a3b0832617d91d214000000232200206eaa4b0e46f29916ed0a2b9264f1137cfca69c0d037477a56d8c9e06f5c7d340ffffffffc53736363ccaf021d44255bfa7b7adf2b2ebd37df369ccdbefdd372ba6178cf50800000023220020e8a3914077ee8f4cd8c59a225fac68c8041e5d66ba0f84b653d1aa631e83c2acffffffff17a4cb00000000000017a9141864d65064208b0e2c8b7dc2b01267545548f6888702050100000000001976a9145cf1b9582767eab14683de91ed04369c0c233ae488ac310501000000000017a91481397a56f39757e948f033a1638f75f2a5f7744087bab30200000000001976a914495febf67a5dc8a3b8e18335da0ed0b4b0b3d59088acc0d203000000000017a91499816e369ce45ce5ec621167bdaa149c6727ff7787498105000000000017a9148746a5e7040281cd3df461be975b51594b5de57a8738e306000000000017a9142b025be8a6d4a8685b5b789c68ed26c0fdc49af887d94e0800000000001976a914a91b23cee31b61770fec6304a9a4894ec5fd60d788ac47e90d000000000017a9148eb1837fb8d4341d650e5f67ac9d23a2e24aa7ea877db810000000000017a9143eea9a8abf01b28efc7d457509427062c632262287ebbb1a00000000001976a91452d4124d1c0821707e866dd7d7df8cf287d85d7d88ac95ec23000000000017a914ce06ea07ab3e25e78573f3bef31e06f83d61c1de877e4f3b000000000017a91495942f092009b0c58e4ae0c275fb7aa58333c89c870c6c4200000000001976a914bc5d7bc76558a4979b1568a7573157c0810ef7e188ac8b20510000000000160014eefc57d1d4ff0fc20652335997fece4f600c447a75355100000000001976a91416dda5cf9e66714562024b058513d7877866126088ac74ce5300000000001976a91435dd90a41bba5d1bf76c2b9f522daa97a48dd4d288acccf853000000000017a9145bd5ea23b9ad18b4dcdaf89bbc63f3401a81358387c5c75d00000000001976a914349be278823de01c10e52d6154eda92c2e4338e688ac87606e0000000000160014344285b002c97f5e717e4dbd35c04f897be40f6d725a7300000000001976a9143292418f87c82b54c7e1f01609a01bf7c7e72fb188acbff7d20000000000160014df7b1adda5f1e3a4f34b3ea2285f5661466de3643bae600100000000160014f130115a9d2a19fca24db80961564b8ea06aeda50400483045022100e9951694e5068e60a370844402e95bba8592576c76dff823f9917fe56adafb7302203e746c7befc75422cf12e330d5f177d36100a9ae007ee557932e31676da365c901473044022019b076b8d158f389001484f68e30434fc5a0a9a9bc45fe74143155e8522ad5f1022011401681fe1ddd37e73ffe09ad92242c92cb5b5bc77310cadaed96d679653a1601695221035c14228b8f7f67bdb99055ade01e0ecf92c9d6fcc9d90a386604fc8ce5d0214821025f303a181fa1fba9baf352c5f4cfe24bb6c21f8a536087d533859f16edcd9ed62102daa4f9fbbf0e6aed4ff756fe08344d722c8e8933d16cedcc40da4a93911f2d7953ae0400483045022100b32f0fb8060bcf8549a2b840799e522e7324f043091c00eddf943acabc378853022070751941b7c1a55889241f41539e383d0fe7048fa6639f04e3f5c8633909d23601473044022038f971fd325343710ad16b55043e8c4bced785fa0f4a8355d296be276ee6248602203ac52d79c7cf152a0bdc67185d78747bb08921a9b4f33e95d48e14be090b8c21016952210223716ac911554cab628accc91d7f7c8716ef111e3080c9f2b2613a15343f69142103102553b9dc0cb367d4bb5d0bb76833eb3e455e5e22e710005bd3f0b1df71445a210235f248dbddbd6a0f591fe4a8992f49c1a14f2bb1f03851aab8c045e5d98b8d2753ae0400483045022100c5663eb2c088d4e4e901049bbe54bea91f489bd6cd5d3ff4422c226edc15ec08022053b697f191626a5586bad18a147abaf88a0ff90e0345a34fd98819aaaa3b213101473044022063d42916cfffe95bf66ad973165de42784acab04faae2ffb23a1332c348f4281022051b833c4efa19081e1579eb9f2a91e14cea89ba6c96aa9f2cffe6bbdbfaa30e101695221025d4960f2f279b24bf90350010982b21799f96a785da67f4a2b1a763f2255d47f2103304ba5d78d67bfa759a4362e13486cdcd9494b335b09a5e5fb4110d3891f29482102805428d6b5a220d14f2c8c4213a9e1638adbb275943b36aacb23435bf325383b53ae04004730440220342a6f84a0acc2aabfacfb1d8edcff0109e5fd3056222dc44d76e9f76325939d0220134f0e2621583eae424e04e3669ada450af684c330a4f6d93fd57efa264dcf590147304402204920b65fb11d4c234a33a037ccda2e95ad1b7dd6eeb4249508e47fdb21374fad02202025237dd1481bd427c9e0dffc8a1b3eec57a9cb1795ca446d1a54ac946e9d780169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae04004730440220712de596e353d8f75baf5988b5b28549adb5c5fdc05cd151ff0c3865f06fa61102204e35daa536a76049c10697d0e2e291613d4a86d9e1c8caef12822e1e03c481cd01473044022001079ac29f7d01a075da163bf1aca42e800851125ee2200f300844d87d498def02201633d8ebd5f2c0f56dca9a4e84b22e0d05ad7835846dc7eacf6d9074a239fe7d01695221023f220ecc5798cabc855696f36a4464f780a32e7c899fda8a9ed573946e7193b72103d5b2087a0b42764f298772ea55f56ce0545444f0ef23981a1bf6fa26ed345b322103623cf84510c05204df72363d46ed31afaac4126990840203857ed2ae934c01d353ae040047304402201a283d1e5b0349378856c5a945cfb4a7a9ffd9c878a3288625d859a03f51da38022072e1a6983cb17156a67e2ed7fe7dc0c665941c12ec9fe8db18c9536bdf443e7f0147304402201335af828e07a5c33733afb1f38c4f5a9f5bd4618bdfb0beaa6e372a1555ad9002201a6e1df703718caf5b0aa9bfe0eff73e1dd935627e7630a2f51db87c9dfd238d0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae0400483045022100b83b5088dd0b20069718d8a2b8274c91878bfc1454d23bc5ed8529a92bc4e174022003297de05a5bab10c704c2067ca8552668f6055cab2fedc64ca06ebc625f19be014730440220321f949365b607fa11891fb520a125e6167b7560209fed6fa05a2ebe0cfef68202204866bf07311b23b3b9e9f5882243965545fb9b6c8010c809f98a4d60c8adac94016952210238a334c175ba8480f9411677a782e5b822f4d00214c90644fac6925b65f0163321027b588766063d6016dd0c7b4bdeb84cfa280d0bbea796152cb2f4a7af9c1def782102c9a89a6be665d6aa28971d11e1a3a5776304b7605d437d596aad050dca84cc0453ae04004730440220286b513c5103e1e7e05d32e129eafc597ef3e4abcf8b9cf464491710173673f70220318da65ab8dd606acd8d96e0e92bf3bcd54b7f7779517cc2ce2afcf77a210a000147304402206762627fd65d4c94a04594eeba384604d8a15fb7fa85196c13350bc689765eea02201bc7c22a2b484dbadafba3281d49d067bc5c2d0fbf03ceec169b3e207f8c29c001695221022e66b96c3cf8097b4a8b05582c1610b1dd4a775322c26d00d2e97701812006f421034afc787a9ab07271273fe42620b030399cdb5c9a3c4162a2508daecfbb71e4a921027eabae0562f14a50efeaff2d802a7370cde708d4b7d65f887e1ff7a76fdc60f853ae48a00a00010000000153cf759da7b331d8c4b70be1c1eb25d0fcbacd9fb1eeafc3ff1f10a90362a152140000006a473044022003f1892e7d8090af03345107f4ecc8e2e667c9c005356bfbce69a88b81d110ee02203e4725ab9cf986f5aa0c090a1562953bb0ef7e78c4398242415a3baf4fc7687e01210283c07942dd0e907aedbab44bdd8784e208a2d444e3cd614fd2510c0278ac9599ffffffff01fa547300000000001976a914c4842b6f263e8298fc5de9de3151f768440cdad388ac00000000010000000001030108e6a2a6515946d1a76ff32acf8f931b68733167e84aaa6e324c9fc5c6bc9b4f00000000ffffffff33a335c2930cd49fc33a17c0e52597fc708e89c0b7f124e9baa09aa38067ea340000000000ffffffff68eef66c2f0c15ecf61300e7c3d76088f29d2114ffd0c93658ded6066dc2eb930000000000ffffffff020178000000000000220020b6a5a308feee595f88c1b31d013e941229db2a64325088e1b38805d051433384afa71c0000000000160014da6a062dc786684de3598b7ec1146e1cf6e19010040047304402201055bcede3504219c8fbe159e87198e7bb6159a2b9a07d30d1123d92b86bc5d5022043bd8d2328f3e6b01f619763b33ee7ef31f06423fcb603ee502da39d976511f401473044022030edaaafaad096676a786eb0ad2e225323c896df38b9868f3b0f85a239be72570220585def76efa3f34cb893013f979c7bc8d043b374d2880f4a4820f91b698c81ac01475221031d21849bd9e85a37b77bf79611caba99c3d5b797cfa3b5262913686458cd743e21023ad3a018a363248fd8acec6806d0f4b05b934a8896d30db89d7b128b0328512252ae0400483045022100e00948ceaec168263b282fc650347eb081427e31a1bb00b8b7cd5bf77dfda9d40220327ad26817b75e9a30537542d6b59e5e94afa9c8639c7a52f720ed747170d776014730440220734a4be5beef18d8d1918881d869c5353fb52b1dad005c351a926e01e73408e002204abf27988bbca3eb87416fc7444dfa70f74f10767c10244a101cca6204586373014752210282d06b3a24482e7e78bc909c780f71e94e362e39a1bdb88c8a5cb70744acee072102ea8c3f0983b54fa25e3dc15f113a882024309762fc466851fede3d9f57b7e9e752ae0400483045022100bce75821eaf8007aee797d54bd2ce46f6600637bfe5e2b6c44ccbdb061a9a0b8022003fd405e74c351aea6912a7bfa99a2ce651e01b82abe8e4d4fd9c8830fb9c60c01483045022100d590fb8ad6a6a4cef166e27df91773a1a6ba592f62289a25ad5ead03b6c0431802203e177be7d0508a830794c6db2dad153cd494522a93c9a75013207f6312d0bfdc01475221039723f9b22e2cc6f4db79d7cc89d3a583ac20f5ea23d5c1b4347df12b0adb629521021242cb32ad51f36d048a725e9277bfc19955b27691573b264902c599474c379252ae0000000001000000013ede36fdcbe075a22ebcbb529f5234ce920889984c3f774fd4302567cd15e68e030000006b483045022100c4dafd9fbac1a2c0d7f54cb032173bc0cf84fa22f6ae01f52ea441e267a26fce0220673523f5d95244c2bf3f9f42cc71fbebbdd8dc28e37cbfc53b35f0551440983a0121025fdb19918d31b3e53ee3a897877a4aa408ae1e5ba8d44d4eef3113380f7b9cc8ffffffff027f0402000000000017a9145541bdbc49890c2054d36ec2e0e824de74843fc38720a602000000000016001415cee51f9bd6b352947d95842be35ff46211311d000000000100000001b6029dc16ab03084ba0b7421a9ce7bdd85cb07b0993390e3069d0e6c5ba56f60000000006a473044022073031d98e23ef63bd5b1d1a80400e96e67258c3c2618302a127079d704b32af802205c29327f7eaabe0963af073ec8bdb8818b41b6bf281f46d95369e51014b74b4c012103265526a4827c892400c2159b9f804dd6624a8f3cf857242e470cc30c61d2d696ffffffff0114d814000000000017a91497b19965621e05c3e4b6044b1e5dad6b675b2d9a870000000001000000000101e200a9b21009b65047e133549853ef522def6dd0cf64b95032d4a6b8b252c44702000000232200208601ef99822bb29e4f7b05624f45333f2f75d1d0b93440029c7e5e2fe8525a07ffffffff04dc1e02000000000017a914885118287e45397eda06aa4804b1de1b4b67af1a8726990300000000001976a9144ceda7edbe703e456b1ec1218d52ecf27fb87ceb88acb4d030000000000017a91492acbcdf7087059a3e2443bab1b2043027aaec4187e6a16c020000000017a9149ca40f74e798623467ad9101200241fd0b2177b187040047304402205aeb313e5556c8230a760b5d3210485296e9a9c83080492957193375cda2b77302200a211de6860689fa663096f6fe74112f95d0634b39c2e4193411a19349093fd00147304402204691cc8e99b808ca42879d0dea1274c477c5145f77f8109d0e8d9020bb96e10b022059cc547b8182522ce5626a40e3d56c704219eb510c4c89aaa2a10aec52eb89da0169522102c279fcbb68184ebb832732232dd9434f5c61e1d52c5aef4e01f77d4db98ac0e72102ad27694d01ca381b5c7b0141e5d67d5f891edd952d07893d0d90e094c81c19882103937d64c4c915cb63ca04394a66dc1911012e275110dcc09c41bd47fe0056212953ae48a00a000100000000010194d126e03d339829cd61c8db1b36b5f89dfea51a31b451ba9f22229eae8257f50300000023220020c619bf93ea10041e74c00e80a8370fed5a8f73b9818a9e8afa245f215041f40dffffffff03b4a805000000000017a91455a64276f15461192fdafbb46b98c5feaaefcd3387e9db2200000000001976a9144dcab800d7a9de3ead3cabbbb16aa65beb0fb1f388ac3e1744020000000017a91480ec85d0911f9df1af21c0e138366950a3c5d39c87040047304402207530a17fd01f5cba6e65183fd744fe44d150e21c5e10baad37d0c1a35849c1d2022040d8edc62d9559722e234ae45e60bf7749fca576569c257c83359e097226556e0147304402200148e942bf2e4bfbd183c6c69254d3487427c6227b8fc7085dcf7c252801b4050220734b9dda411b564e829271df5e5665c8c68905d2cfdfdc23327770a7ad05cc400169522103c9b2dbe4ee8f77d7426438e5e9e678b427cee7a15f6006bee4fbed416e15e3862102f9832704025fb4070ba338825a7ddd92f876fc64f5d1f291c0c229e77f4821c92102d4926272f1129bc114a54933cbb6573438115e4ae49ba3faaf01069a23559ce553ae49a00a0001000000000101bc4e43d7ade42f1eb3fa07a62b60a99e8ecd8106bbdc81ff34c877b44006ce770200000023220020ac23f26f46c94f63bf42bc4389de77b23a14d458a8cc7fc2224e026d0096c522ffffffff03f4dc0100000000001976a9148e1bf8340948ded58ec299d0fef86d04036c0b5e88ac806d0d000000000017a914649727e2e84846f8a4a088145ed1b65081cdc9528708c634020000000017a914a7f561ba3389c63f4a26a9194a26937a01fc3028870400483045022100a5c2ba945c2b3b3adf30ac58e1cf6d0525c63f5754a0f10a734fa5044696c1fc022005f28825d7279fc115c13f6362f14f9e79566ee4fcfa843b573c21f8be389c0201473044022033c00de705ea6c36f75780379b3a8d824593bf61348f8c8dae70ceee43bf81210220135872d2cdd563fa855a541263657c6f16ac55da484bb49a55bb287695151e7301695221039c10657ab19884c79aa8f1fc1b9b10e9a1da2c1972fc79dcb68c0fb1c29351c62102185b4c41bdeb5a8a07317ae95cc8c1e97ea14d6430ee867f5f82d51c3b743fdc2103d776b6ed7fcc3327d92bd27c76b6b0a5cde77cacca4ba3b59f32f4bbe9e0729f53ae4aa00a0001000000000102a80662cf2d72dcf88eaaea2e194fb0b7ffd2a500ebfa4271e24406613c3ef4830000000000ffffffffecc7289c2892b9c469b0774cbaf50228c1897d85685981e8f61e4b597acdc794000000006a47304402206667f58b6c4038f71467438c3ec38943fa874863f37c48176049725708da461002205b5d5461cb0fba90c941228072f890ebb4f0011ab0e8540decf39020e4bd52b9012103c07105fc8c2287c37827f86cab20e2c7956ec850841cd37629ad4579b4ec8cd3ffffffff0276bc0600000000001600144c28d0e4ab090074de1ff52f03512531cab534b000a50a0000000000160014645d8dbd8967d7c06b45bc0ba40deea772ba60bc02483045022100de77f64267f6558387a83f4ed330dfef73bda7f413537ee1212cdfc5015b851a0220698c8f877cb5f18d8e5e3f080476e024dd9825c8b9de41739c57c0170fdeb4eb012102704cd3ad1024f2950f2134de6a9aa8c914a21d1fa72b1bf4bf72d726ae5cc0e700000000000200000000010224d09736b8c96330e85989fb584f61060c27a88a5c832dda0813a15675baf545000000006a4730440220737843eddf684b73146f63bd9a672a1a49541cabacff9e12603a79c4827ca6400220370fa6af0b817e7f65797bd333eacd36348fcfed197aec255463315be22e530601210370d16b19a4041701eeb06566a1e6c8ff0ab2c05cac3f6a50980db7f9bbcce55cfeffffffe035da95ca4c9ec04e8f97719bf75361280efeae52a394beb6049b38d7d6e9ed0000000000feffffff0222610f00000000001600142191d521d0895130a83f937a6533df02528d10a7b46603000000000017a914064aa2edf6c98f977e54c16da834e7d254351eca870002473044022013c6df5a8a35290e9daae57be0da1edd3ae2a3f586a9c318d733deb4f1c86c6702206c1cbfc6fe2b770d29a18fad4af84c7a3890b9a6f42089b69fbc859a8b489e23012102255d6cf089bc3496997e897cc43c83b999248e484c9fa0d07ff689a6777869ad47a00a0002000000000102e0243ed961c207d42392edf3de81ce103926e534d4196886d29711f5eb64cec8050000006a473044022011647c977ec3b458788617705489feed08b93d12bf2a4d073e5be1cd8eac523002202984389cb35ed7fd2486a5f417a516c0b43dc20612d721aa98612b0e310a80180121025dea07561eb063f3444f71b9bba79481210828d558705c0eeec108b0a0973224feffffff445cbe8b18b3b72b0b2a43ebf5782e592a428d249ccdbe497749620faf5a36d30000000000feffffff0190ff10000000000017a914edce9c339124f3ef99d4db547812c42e53a5708987000247304402205beb20b150974f681bf2094ff0f691e00f43b667acb47ec8a7bd0f297be935090220064536acfd555979a147b0dfb4223d00db22bf5e01d2ce911486a476e89c499d012103c08f26b146ce144a0fc43d07224b343c0a277a38f0ec8c8332a53a1742f9902547a00a00010000000134668e018fffa04f288f7ff61f2c217df1dd5fa7bd871de47b2d7cdcf1e456b7000000006b483045022100b20fd20c396d5ed2693552292efa128cb6bebb8a9c609c4bdda1e218c9d356dd02202969f774a344150dac374fcd8da320ef3f2ebb4b4380f484db1000c78a45dc7d012102d65ff4fcff14e2685b9515718c44b2d7b61a17835333e955b21ea94bd2d3a93effffffff02b86796010000000017a91493ef596a206a3d6a38f9bc59e20f44d7cfed7166875a4f851d00000000160014019253b464dd814eb9cb5e8f4feaba8af6be6fe30000000001000000000103a783ffa7657ce577d23c6cdbbe76e8f378b0977ca8cb4ad44862ff1609d0970c0000000000ffffffff5ac08ce4989632ec8e140a386c3920f26bb0d33cc454ea5395715da891d8e7270100000000ffffffff48c8287dbb0219e3dbaf68dea6334c5f90b62895fbc02559384c275485bdede89b000000232200208a21e7740d9410de9569b0c0315d595970bc3b6ecf2c1d762634a5f69328090bffffffff012dd8240000000000160014696a9c0b2691bb4b9a1ef3f980ea253f74c98b390400483045022100e4ab546d4fd16e34dbafd0f882fb6be792a4d3a4c756e14e205695e9b251897c022056c8714542b70864cbd6becd0f9aebde400e988997a0171a2dbc45373dd5344101473044022008d720c9985125180776e36a617a1ee05a38ebe47697171adbe629145b57989002202995f574df3b4c5958fb4e2c9e7204d8c3665eb209a9b49c671eecff07c6c6fe016952210226a9db23962b1d9d52055357f086b6f2736808f53c45bcafc3f45ff35d5414ee21022fa46a6d745a600d4e5d70b6e3b7bb53804979c5e32e978d42b78449345a92a42102e2f4df12d2395c894854fe7e7d7415309d42a45791a38ebe1b966fcbd3860d3153ae04004730440220292d01267ed17331b289de3398a3ac2ed7b42ede90895db3cf8dffdb0f071bac022039dc748b5540eda906dfc74eec2ab3b411ece8b1d74c875fda8d911ce67a3aa1014730440220722650f3a5285b7c90c6f0bbf5e6aa278221900fb54542b99281625fe01e81220220124bb91ffc9a395773cd10c10cfec29a1c9332fd8f527ab44516d2ceaf2d09850169522102f823ec94328e8a188d15339b8f1bd0bc1b49aaeeec4dd4a656bb23948a6c748c2103d8b19d8bc095a60eb1954736e94f2c2b708547e7afddf03bb6378d7ed48e1e482103b5193aa6dd66cba1ecca1438fc8ba552cedc743b39b5b36d019d3a5e27a85fdf53ae0400473044022035a3367eb9395cce30a318dafc5e3dbdce6c75ad31ff35e51f3f15d3f90863eb02204495d6201588d45aec0040235484067585e2f0406abf4b8ff8285c738b59a1ee01473044022068f89123a63ba9506742ec1fbf00f725f617a5dd3c127df76b9bafe8e2888e79022044d218a6106b3fd0f1e3dbc20c46777dbad8456d457e8550f62ae7218d5469c20169522103454b072ece7f19da0a626084133265e11dd123e5a82dc412469e8c699d21dbed21038d379464e981a057c702f91f5952a008a8da91b86e669144df39f3134adb0f322102425e098e4fc8ab848a213fbfd5c3f83e8a9796542edf0f6291577655ab317beb53ae47a00a000100000002d59dfed2853db67aacab70cbdfca590c58fa20abe535d6eba9fcde6c14729fc1080000006a47304402200db289692dddf6be894d7359cc0ff0f14cb92c427c4c90ada0dffbaeb267eafd02207de87d4abc10603485bb7b9a4905c2712f1aeaae36fc634df510b06b4f86cad6012102cbfbf78f57da985b46ff292301acfdaf2226433f7518b82de3e92a62e3e703c9ffffffff9751b4c7d69397c0d02e1602280da79706060d4d3016b4d44fa91f3c695f74bc030000006a473044022022ab33f7de4de9678994c397faef1eaa7707ac27278111c0580d203d3f40e87602202aad778b807872df5a59e025b4d9b02fa340d0028070c079096971190b6ba6ff012103226f9d8b2e66b9ff55ed0e003a2a5e63cb107580e59695ee122491dbba979c86ffffffff02d41d0a00000000001976a914a4ca7d11d5dff70fcffd2bafd9a82660f627d84888ac94ba1a000000000016001411e15188d37522aae49b5bea63cd149e4c521f6700000000020000000001018d0c6bb5d9f9671c56e5e72639cf7f72a5da24278e4a31c11f6db25d7a7575b00100000000ffffffff02b4e015000000000017a91411c495c0bb2073fb2a68af72f169444aad4618ae8750a99b09000000001600146bde7bff8df00ef5738fc4d0612f3f673c182d630247304402202cf5c1bbae9e8ed3ad1a43428daf3942dd520f0b1cd60307bea7ba4b2a0f823102202699c918254716cceaa101e91796a466bd3d5b2aae6f746f896681e5b35c16a001210226ef36699921aed1d8539fce3e52ee4a832655b8519f308758cfcb7ea00cf04a000000000200000000010198f41327ee777f5cda6fe607c4237881fc1418dae181fe5e62b06e513644f2360100000000ffffffff02eb220e000000000017a9146f7b5d366a76d1d9ced49d69c379b3a11fac282c8764838d09000000001600140d5572d88c2b2fcb7c5263eb5c89f09e4d4ba227024830450221008a2ff2b39b4115a010c2ad4e8cc9bb7aaed1c2f33c5f13c62174934918bb030a022007d85121747fb19e182a173e3b46c12bba7e99c6ac713d2eb8a993ac4b14303e0121027c34610ae2d42d96be5931afdf26f513b68ca7c6a49c75e56367d4f4c95d36010000000002000000000101bfebe4a58b13ff93b4d9c15d53585ad3cf0f8cbb406fc71eb935be9c070e7cf70100000000ffffffff02a6042f000000000017a91406550aec0a442f8215d6f216554f3e454ed2c76d87bd7b5e0900000000160014ed60142ad4fa5b168c521f21cc9e08876f8692e2024830450221009d00c85024cca46e920b6089d2c3a22b1fb806afb0e665f02400cc1db4451ddc02204832f011c66157c1e87d48888272903997ce36c2ef39738b62e3fd85a014a33c01210333e463826a9a0d99e7fcc77f5b34ae1447605d8ff02df01f677a6739ababf4bc0000000002000000000101cb89cb9c23b6873105810154686076c210fd6a7ed1ff52db80964001af4ce7cd0100000000ffffffff0216de1a00000000001976a914f328081871f6101d1162f520c391bb296854201988ac299a430900000000160014ed60142ad4fa5b168c521f21cc9e08876f8692e202483045022100c71b89fb5b176f195009c54cd8d13dcd2609b4294ad706aaf51a7918fe9f62bb022053defc8f74f84f8e89252b2b8510131cfce54f500b7a229db2f2294a9801e31d012103658018a23b87cd64219c3c952188318391a411cce82694a1ca03cf4655f5dc7000000000020000000001017cfd13c9444c15e1f2073a74a0942802260fa4599f526ea7307d7f08391416490100000000ffffffff02362b4300000000001976a9141e89b30780c3c51cb1114c50fbc480a307e7848988ac756b0009000000001600147c02b111d7ca1bd28412c5bb03a334860a724c310248304502210082a14976a0b19308bc111cf05e0a7f36177e9b3db7c0b503da5cdecf075f1b2502207ad1ccd2fc64351ea616abc0fcbc7395888d04c8360693c6a64ac4b3961b66c1012103658018a23b87cd64219c3c952188318391a411cce82694a1ca03cf4655f5dc700000000002000000000101716d21b730b06f64b24756929f8d1ee2d2d125ceb90f5dd825a9a61c9474d4140100000000ffffffff022db75f0000000000160014e32033aa4bfa8ee8a72d4efebffe2cc8af1e9b01e2b0a0080000000016001483d1a54940e3911e7e1a6a96837bff6af326aade02483045022100f6bdea57b10fb246256d01b668540d1e0230e9257da8562689a3bb1aee7da583022037d36a25ce1bc5be5a9ef4ef66ab5796739700330696ee29f9a997a30907a32e0121027703b8aad59878682f98eb9d930942572485aec0958fc7bbf6f5c1ef502cd8f10000000002000000000101a6dd0b5e6a2c3babdc565af090b738315c16de8122735e6b1296fb05dbf490fb0100000000ffffffff02c65f0e000000000017a914f42b7ed87ac903b9f0d3119a121de83817ffcde987ae4d92080000000016001483d1a54940e3911e7e1a6a96837bff6af326aade02483045022100cab5e732163061a9fb769346be9cdc55f597abf1ed5090f79fd9ea983cac465302203e2a2fe507d3395a10ac3ef85cbd615856627060494b4f82c3c1f51d6fdd5ccb0121025cadd8d51c705f95893d3e5fc86f109f203d47ae40efe2328f764383c15102b400000000020000000001016376ab162d9807419707b9abf7158e8ab8905ec359a0c16fea36ab532404a99a0100000000ffffffff02c5562d000000000017a9142788769a05c5ed945f6c3c5ae8bc9d5b56cb8a4a87e8f36408000000001600149b198168440a39b3a2cbad2c27e582d544f7779b024730440220514e688e05bd2564f517caa937ea8aeb2bb5d0f107a3999ca662dce9fed5e49f0220505a132e3876977b6ef94aab6009d69953501a6930a15dcda21a08b6f2e8295f0121025cadd8d51c705f95893d3e5fc86f109f203d47ae40efe2328f764383c15102b400000000020000000001010587c25c4623356bbf1e681ca610112a2998bdd795a963276087c1c6721a81560100000000ffffffff0267650800000000001976a91437edef3d923215756fec313e7684b6af60fa7f0f88ac728b5c08000000001600149b198168440a39b3a2cbad2c27e582d544f7779b02483045022100e8606e2e501c4abc7f97310e3d047ef1652eb16ede92afc4263f8f1e7a86c3a802203ea5af41cd56b5a9a010067ac269d24cf2903eb82e3ab3ad7bac1aa7469a4b09012102bfea8f16f4a6f0240a0b29c5a5758572c6ef9ef693fa2fd0522f2f14362aa8580000000002000000000101094d1653ac0c58f7892c7b471b21b429ee42f0a6b39b04263b4a1551a9cb711e0100000000ffffffff02c35b03000000000017a914ecb4e071c2c536649a5bf232090c4f92a624204387ae2c5908000000001600144fa58c80091038873f55988903d47115f50c992202483045022100c27ce7155d482db58e0e73dbb7f87cd2549b19ed8d4ce9efdfebe8591ca0ab43022055a6700b3cb022022456964ea81aa85dc1f20a579919f29db359da2106c88f02012102bfea8f16f4a6f0240a0b29c5a5758572c6ef9ef693fa2fd0522f2f14362aa8580000000002000000000101c38df5f43be2bae7bf38f30f4b791b3b6b9c14df1907e9299b11830585bbee4a0100000000ffffffff029b952100000000001976a914ce68c494f5efb9b66e9436a27cf509376bd738d588ac049437080000000016001471cc69b0ed0620a704626829e005c0717a5c786002483045022100cbc0ab8992e26ee55396996ef167768efc82cc5f7ce8fbac834dd5199c322d4b022031815a09ad7697a48492b24118b31708cdf4b0c4e21d8fe9a32153a5deb84ad501210250af32f749a0fd42e0478c093706ebea9d40a46e67ec052a11f59364edbc62340000000002000000000101aa687e93577d54007c8a0e128da4b9e70be21bacf125d2db8e81b560f4e237340100000000ffffffff02214d280000000000160014881a7dc7c58b9649d4122115b5b6c069c379a5fe7d430f080000000016001481de045ccf8df8725a19d6ce9c67e8642c2331de02483045022100c2533a02b478651f1824d08cec9bd503b48774a6e195f57a2a1cc526d9b6f06c02201a568286fc64f85ac91a99a354745435dbdf6fe5394022e32b6348d43ba4b11c012102f28988a4badfad8235922d21f499f4ab8ca57b4f7d3195242e1d5a92776634ab0000000002000000000101540c1e8d9fb5a9c7a9bf2a30a28afbd5d606b9b16b7d21343e70983ac7cf7e580100000000ffffffff02d1c064000000000017a9140457d16908f3594a0d5a94b516ce8146ba34305e873e7faa0700000000160014eb4da8093cb0e606779631928b6af434275e4f8802483045022100c22acfc1dfb89719884e58a7b0d14c4ef2278d96b1c813ee4feebbdbd5a484590220636ab25540d33e7f9ebf7cbbdb19aa9b342f176e61883aaf083848b2fa3ac6ad012103f03b8b7c1a154124bfe5852f783cca6961519a42d1a70aeb73c0d894b274c38c0000000002000000000101cff01dcb7498c0c4148248d2d45fd9ee96bf919f089aaf47731c36d893519a4a0100000000ffffffff0204f653000000000017a914921416efbdc7d74e655f1639a9801b16a7ffa079875e85560700000000160014922f14e9ddd184a8c06ab1162684a96e71e6577a02483045022100955ed3f85c2b8927454ef69dc28be6d766b32ec7e38c1420118e81c283df624402207eca7573aa25f7fbb0be5e4024ed4eaf988b8aeef1d6370aef956e1e5e420849012102a746b7f24192b2454b8afef65f040c1f96867f47fdb537e94a4326d5a435d7a400000000020000000001012b2b2d2a4a396b0e2b3532ceda821a2efb5818472f406a045d774eeec1c051e40100000000ffffffff02eff10e000000000017a914c82fd00f81bb8ec43314a59a0cf9e960446621e387938f470700000000160014cfe3489403e5ddc4ea40495f3ea7cd6bce0f9d9e0247304402200d9434c51b77a00d702bf97c4a9c2eb0ef5973db770f3babeb597e3d5327be3d0220159c40365a0c2df308d91c3e873d77637352a92b7c2ab5d9084f40f0de2bebcf0121032383fe49b7e3d28582bd9d7e3ed1adc949ce852417e5a5c703371f4bd7659114000000000200000000010123e7d462101a6e8a6825a996443445fb293afbf2b1e85580cfa3c3256f5282fa0100000000ffffffff0207eca70000000000160014780f2c19deea5a0ce9da7f9dbf4fd9ecb96acd1db99f9f0600000000160014d512620f7ca5d342d18e668bf09249ec83a1dd7402483045022100b4d358a50b3b5914c4517407865da7c9b89d5cdac8cb35f21b72899ae0ece82f022008137436541bb414bdb15181789d98c6e941707c5192726d4bfab453681e734e01210325d700bf8211d1014a6d8d44675aaca192a44e8588e87c8f4e436081dd90e04d000000000200000000010169edd3fb6d40946ff53b6c917204e267d77d6779bc2d27ce99344dff49f05f4c0100000000ffffffff0228dc19000000000017a914f8a03271566649d6a9e71100454e264622c5179787b5bf85060000000016001410f1417c72e5b18dc9e5bd717b867f16d52b8d1202483045022100b132315365cb02074a4fb0b4a6301f374840c413a601f3c0401d1777b12395a202203e56dbfe79e3235e7057f0394c4215c1c8f37303f1fc0055694346286f9e6d440121028737b5fef95aef5b5eed24169b6b0f8dba0be9518d8f3f28c78e1ae8ec672efc0000000002000000000101b6fb21cb634dbeceef15e988c8559ef819f672c80e2a0df0513254593e6b151d0100000000ffffffff02d1c064000000000017a9147dc902858bd8c198ce00de5f3d8946f517c619338708fb20060000000016001410f1417c72e5b18dc9e5bd717b867f16d52b8d12024730440220652dd7babf839fd68eb3ecdb8f29c4a042f4583239db552145e4c1451077e38102204835a506e9506eec85ed8c166ca59e3600b433d065f21f7c3ec81d439e942dd4012103b9f4b0345d3304f16d681ec052eda199e75a587bf45a0970aef7328f936bfad70000000002000000000101d02dcfcd85daf08a60bd6f9a3bd93dd4f978c605c0444d94bb50e545a45da1e70100000000ffffffff02d1c064000000000017a914f94c5f1118c2e41db9831265dc3c8a9e00b8d3f8875b36bc050000000016001427c5c032acd779bd423c6a56213376c1a48994870247304402200c69a8ed8e8d090585b64f057e3fd2406784fac5fd3fa463c1210c379db779380220579d5dcebef4821b7beb4f21846187fad43eaf8f4278b2468f45807969495ecb012103b9f4b0345d3304f16d681ec052eda199e75a587bf45a0970aef7328f936bfad70000000002000000000101f56bf4864e3db8b2725d928e622fc3996e740dd7707fa5a3a126f37dc145f28a0100000000ffffffff02d1c0640000000000160014949149f96858c4da1a4cc0574085c4b11e191fd84a71570500000000160014af30c4179342dc37234d03c5464b44ca4ee623a802483045022100e54468523711391d8e1502f3a8366e83314422e189891147ac30c30ae903adaf0220611daac87bca7bd6a9b97112e4deaff4b21c14536b8bdba03d3a761960e4042e012102986c37579aa75fe93a80dea4f67249c9d534372befb8be7e94a7280250bcece0000000000200000000010122d65a248e5b8ac7b0a46d20dc741d1cdb9703f8c719afc6125e6cb188b4e21a0000000000ffffffff01fbbb64000000000017a9147f6047aa93f1b6701f75ed7ce0c0c3b0fc62603e8702483045022100f4a2075530a6ce8760032f75e74976a4c73ba3f0a8097e3f2e2cca9afd22f40b02204f84dc8e25eb54039a8b64a34a534a7760344645bbf72a339e0370730f0e332201210286c4ae0dbfa092ee413a3f2f4d369dedf965f501a8a7e950899f31958f21dc00000000000200000000010122d65a248e5b8ac7b0a46d20dc741d1cdb9703f8c719afc6125e6cb188b4e21a0100000000ffffffff02445918000000000017a91429c4f9a1530fd71c8136fb3ec5d0cf08d4e8c17687bc133f0500000000160014076822f3495abc7735013ddb7a59b6ec7077520d024730440220138eceb59a23e79c31cc67ea5d6770422951ce4e4d2d19c28fb6b9d0601dc49c02205586f0108f50a3292a9a0124605a36c4e28d5e25b220114d6f209ce98055cfac012103b5a6273f9210359348b913832901270b9da8b21de5b8726c074197e4853c9247000000000100000001716d21b730b06f64b24756929f8d1ee2d2d125ceb90f5dd825a9a61c9474d414000000006b483045022100aad13464e9a81c6f575e4280289e35e95a7a08ce0de632ccdddb6fb49f56a70b02205a5f07517e5d9f5792392f701725834abdd122030b82a2cf1ba173ca17ab573701210252c143f94777ed1a47e8993381e52a15f9e7d8061bdf7399201a0a3ae3c292f4ffffffff01be2543000000000017a914f0d880155834773c937de80838315c5b70d5834c8700000000020000000001015e9a704f5b45ca37c42a3942218f270ee15698b6be99a921d1922622faa9941e0a00000000ffffffff029e74210000000000160014768479138557390b2cbb96132142d5bdda8a28f4991f00000000000016001429b5fdafa4525107fc9fac956187581616ddd07a02473044022068741642d319a11cf90e36e5b3821b82bd4a3ead5f99b7d241ea169285317e2b02202c530c2d31b6075a4c7cd59774c72ef9c2f77c0d2071c44380feac21df2d9626012103e6c6c3f1108e3e3b41f3438977187bc838d4eab869c3a1b5992eb962e6436d450000000002000000000101ac559473b3371c19a2c6cec96fab04e4a39bc6160c85dc9b71b5ac633fb8b6450000000000ffffffff02bf0a050000000000160014b28c7cfbb62c4b4056ddf2fda23aece7ce0880da32651c00000000001600147376e2d5c2883fef620f1c04e3bce0fc6969466e0247304402207e3bba882d1ea08a5349ab2dec3051817ba25d890dc86118d2d2bae7a6763f6e022057d1c8b16bff82b4568d87c1e75af87716b8530894b663d60219105c4b986c62012102036fe1ecdef54583b67af33a71a0d5756624fe6d50d24d970e766b9d95d7e88e000000000200000000010183dc096335ceaa188551e0424c4137f506f3d7aba2cfb4ed8728606e323783ec0100000000ffffffff029a5c03000000000017a9142e280e45c5fb9f572cf901475300672942f1d5f087e003190000000000160014f605b263406d15aabc272a2eb92722b3d7a05bec024830450221009d3df36c8232c600bb91cb4bcbb5aa1f9047869fd6e10c7ae40c265d6241679702203c56dd89257e0730279bd4563d222aaa5299fd2b64c89307a193527e3519340e012103c4b58faa6cfe2cb4c5e06dfc19744c82742341fdaba2710ee3efd90ff467b36c0000000001000000000101b5a3a1a8dfeb3041074481b5b5cbea2a39972059770b9f2151b77a3fd34d971801000000000000000002c8af00000000000017a914f92ae75b442f33a8374fafea7e76d2083cc93497873a5b000000000000160014954d02cb9f01d84c225ce2991eab9bc2726fbcf202473044022015e075dcff36f3717c148d440cb01275ea79d367e0aa4b0469a47b2d93f69f1002200c671430e7c26bc19e200d976b00c9749f9ab461618b22f34626a91b6ca35da30121030732c3be92bcf4d2e0c994fe8d5a669fd2a00178d59802d3306dfdb1afcea4bc00000000010000000001017235984beed1062b79484d8cd5b18d610e016c950de041864ad04c5d26aac7630100000000000000000123580000000000001976a9143d33c8b407135b91db2cf8588ee3b7bca81afa5088ac0247304402204cf6475398af52367d17d9c9850476c4fb0ff96ae30abd74e92e3adcd8086e4602204fd73085c7323969060648f1439454165dee72ceb65e0579a19be852eaa147b30121030732c3be92bcf4d2e0c994fe8d5a669fd2a00178d59802d3306dfdb1afcea4bc00000000010000000164b4b192cfd11352455be154e902652a5a82fd497c50184410db22fd7cd48208070000006b48304502210088e86d38c54dbd13a8d638c1c3061d0af9ba224bf10ee56337d214caeebc3d6102202fd12ee51672871637f755ab81fddc833464232afe60cd99ec76bb9f4f088cdd012103c8659001924ae721ad2c64feb691e06b75c358f815f73fc75eb7437d439ba015ffffffff0128e801000000000017a9140727f1cd25389e474523e476e8b8ec7f1328c59f870000000001000000012734aaf87a689e9e9cb66e9940ec92c01a6d8fc2936eaf5a85db4d5da4c0d54f000000006b483045022100a74d7abc730bc633d80a4ed1e0fe4d32910a5353ce00817d77c102d8411e26e302203cc94545cf38cc5c1609a37ae37f7c498b6522eda44af15b002e9e95a5e3321c0121028201524da806dd8e6cde59e24c2a9f5f021b684132f0605893b0a37b6545c0d9ffffffff01a05d00000000000017a9144d55f5c57f8dd76f1d975338f25e1967001b9eb18700000000010000000119520276d744f71d92c35f9fb068a6d91f4a5de1e2421e6f27ff5bf6d1165bc9010000006a473044022063a476491552d8d6b509711a3b0026fc7f018e43f712265ab9f9dbaddd7e367802201366023ef83a502cc6d293bc75845a8d52990d77d66551bead61e0e0a59590cf0121031315dd61f00e1e51642b34e6ffb5a9c29def616ccefef64a8a95184c42b10d13ffffffff02961c4502000000001976a9140556f64af4edc38ba6f341044fe63bb7c01cc24488ac70962100000000001976a9143f3dc8a42ffa44065602844ea28302fa1e4dc6b388ac0000000001000000000102b75ad6b271a698a946ab1483e0a18c9960c0bea49e2f8320eb2e49fa9ec92b340000000000ffffffff9108b9ed7a8ef05e698f49380fb776e19d8ad7af0e4a08d5943c7a99ed14618e040000006b483045022100b8b5ba2547416eb207a066cff7daa2db16990c1d8492aeef98598c49374d2fbb02203c22b090742b3e7bc5087bd7e9ef09ea2d93dd233ba653ce7a73df589e083409012102039ba27d81ae0f1a8d76e4048822df0eb1455242275af44c2d0b02b28130373fffffffff0294c0000000000000160014a2c0b2da10ca4044d8a734be22feb54fc5f488153ac306000000000016001460d0fbf49092a062a99adaf0569b1fa965715fad024730440220069f0966102fe1ba8506fd85990e4cefccb0dc2d422f172fbe317fcccc16e074022010312fb9307135fbff757a2ed2a7de483a3cd541ebfe45ec2bbdf1bf867a9d31012102f6327ca56b61025034eeee0150e1b7a1620fb914017d10c55628a1234ffecf2c000000000001000000000102a3903f2de64b8ecc65d524f2b3826317f816d184f2f99e759d01eaff4261d6da0100000000ffffffff8f242605cf2868fdd91eaa8e12d30b0aed50e4b8f3e2e25f68ecb36e93e514350000000000ffffffff0261cc010000000000160014a16f3a2df776b8d8ab901b3dea66c9d352625365c0f30100000000001976a914016a67cac3b4695e186e4ba6195d1497aa2d47b688ac02483045022100a49dbff6159cc84e9b69978327ba74d06c5c2e4ab4f03d884257d4450a6e337e0220043aefd62d0ec085cf7baa5f01900d6669a85b7c330a47262a78fa903018de740121028aeddf4770dff36119101330d415de183ce2ee215ebc52b6d84bf396c1d0f5ff024730440220377b12feb9bdea5fd7f82c9f767014ec20a1168b70002ee9f4da6d54e6cc014d02204de8751273a8fa3185520b4c91cc9232ac1d3179f2ec2bbeb5434319ef278dce01210240a64cd405944c74edc7af252a6d7c10e66b8a8922bc73e689730513499722d4000000000200000000010165b4ea6355202d4a2691a825ac8273d85a82ef449c1a614f2b6ea17a299fae033a000000171600142a0769974e36c86f7bc592f7f82a64c1c1eb5255fdffffff0113af01000000000017a914cbd85ae4a52858e10aa3677504108205c88821d1870247304402203b99ec76281aecc8db611c7aad52bb4107614e3f126f02d2ca2677d5399e943e022016567e7f786682d341f6d7aec5b193a047af5ca8d5eb7844445cf9e3029bb1fd0121021830925c75ba1a5ff570bc323fa54e107de23598d5c26dc0205125090cd6a9c1000000000200000000010285228ab547f594ccbf8d3ef6fd065ce9b947fa1e25be6962a1bc25e5dc3559079a00000017160014daa2eda9815efe858c74195a83a82c28d1884cacfdffffff64b6f2e22ab22a176da2f4b5bb437149377895442af67e3822c44ea9edf0dd042d000000171600141a680f43dd46144474be3f04b03a19d0f942ba12fdffffff01d5ce10000000000017a9146b8f965255dba62beae9b83bc108fb79707f7321870247304402204a612e5b2aff03727d45a90ff86b0eb2270c04aabaadab0dfc4bd146781fac72022075718d0400e4625deb768ea0f0f256cbc20d0794cccb106855a0c157cf98f952012102ab9d2bfe72fd8845f5a04a7e6bcb96517447fc331c960c70e79242cb0a756cc20247304402201fffa1cf76610c2f873bdd6516e3616bec36fecfa1f067cd9e9f2dea03be3ae6022073fbb4b33dd414ef10522989eed09c640961036b452ba192ded9b0d4ba54677a012102f331c7a7124c012dca4b6ae2d83be9839b081f81716f1b59b54de2db0896549500000000010000000001017396ac482755fff47f5775f1b46c06df192715845e63e37d6db03e9dddab293e18000000000000000001a1173f00000000001976a914b859dd1c0462591c06f0add93ebbb23e3619ed4088ac024730440220164ea4f6d1e56a7af35906d8466b7aafc67d63b62333e7ec05e586c432b4ad2702202c4de5dd551fd7c6db5b4c5efbaa66b6eb8a6bd249c6d084f13cb19b75fa0c3f0121036a53ba0829fe4de1fe603a5b7e999a3ae93867fd0a686f3ec4d1371e312df63b000000000100000001d29cf68b1f38f9b9b4007257cadc820a0a0e6caab1e89b81bdb8b482ef130efc000000006a473044022056cacee8c7e9059d1581788a044a081f31776acf939afac05f0fd25bf1a048d902202e7944c1cea5ea7d012a7c8234c9545322b312d48aa2960c3d3265f8d67fb9a20121023696bcbd0918cb61203117f96e325905a9a86a85a3021157d6bd612de234a4889bffffff0289b90600000000001976a9148ee0315d487b4d64050bfd9fbde15c1f2f39e65c88accc583800000000001976a914377b8c6f1df2e965b6fddc21831afa3a1e068bbb88ac000000000100000001c699b76ca18f3b6aa86d7dbf3c3ad0937ff36f55775d360b63cd391d69013bfa010000006a47304402207cb07a55545ba6d72f136467c24143c3e18995cbbfeeaa81341f4c5100ea85c9022064faf0d42cf8a30a61705c49fefdf5c139921217a1071d995956dbc44f8ec8510121035825a441d57a1ba87a14e3789a3dfaaf4c7ed6e11eabf48e86ab3c0342508bf69bffffff0252fe2000000000001976a91427a73e2b432ffec22cfe139a19620bbd57c4f43588ac4c541700000000001976a91408e982074ca4cd327acd6b4ef4a4de1036c80e9188ac00000000020000000001016da49dc5da0e34972a86e01aa97dcc508d9f86d29ace796006a9c987ae31745301000000171600146cd470d1b952bb2dc8e4c2d5fd0ea1af9301aae2ffffffff03114011000000000017a914e9ea446b00f7b0971206e3487af2b628bb1c53cc8722020000000000001976a914783b75baababb4f68576c06627c16508e8c5965f88ac0000000000000000166a146f6d6e69000000000000001f00000746a528800002483045022100d04f40481a4536991a8795566258ab87c20829f590696dced4485526217f0f8102205e93ad344fcf6de81984cb0489e03c423e567d9d55ad8f06b0979190764036fb012102a5b9aa82782f7248a854fff2f44f99e1a4dc9bdc8e1bb479d8de8d7eee31e6aa00000000020000000001015d4d273eaccef3ccf37ffd9664f33d914fcb964e879a1dcfc1307c5335b8cf03010000001716001429d314de324bbc1a63ca7430c0a7d6c40ea689d1ffffffff0322020000000000001976a91412006cf08cf436dd4cb403af9270fb9c1756151a88ace83e01000000000017a914dfa88984b567f457bfe4876a4f866b0cbd06ed21870000000000000000166a146f6d6e69000000000000001f00000002dd231b0002473044022037ee0dd0fdd78b214b728f913f2dfed095a05f9420992bf559dc622d4bb9fa6f02200d339b943fcc71e6339d5acdadb495cf063cefeebaaa10174872a18fb35d0755012103a0f18c39756e4cd3a202be5189f0c8429556326ffcfb871359226817789e56d700000000010000000001027e0da2fddfe8c4902743f4af4a7d1e2e76500a501c0b120276d6bf1ea225872c0c00000023220020543f05bd8c7cde7d69d5ddb47a1a0ef1d00fc01000c945c6753e68f2bee82bd0fffffffffc6cbf0296fe716cef402a25223efc642b7d794c62c2627723eeb867a53077d2000000002322002070f12cc8ff9390b02dce32ead166d17596b880c0a9b4a5e2db9ba985d9bc78a6ffffffff01f1610300000000001976a91421f200aef7d87f31b18048febf3f565b172edfb588ac0400473044022023bcc0062d216b624a2da899424ef7c7780440e43cfb3464bb18729835918fbe0220232f00faf0eea1df289ec5a4129ac9b4d77ea6b8dceba0c5ded0b2cc8ed030950147304402201fcacd75087af3f4dec13a5f734fbd222eacefa6b83f9139a98fc6a7d2a6920102201b405672dca6330f841e6bbc951237c70f3cb9146a85bbbd5e16309c70f95ba5016952210338412b4e522a34792f442809e5fbcd96cb31d974e7f164db931e325fd32ea7d12102a97e0bb1834f0b3d00a1dbfe1f90ff1d43d85be5ab5a35e4286167f1b51e330421025dfd0ea89113598881632a995d98bb79043f51b06c9372b0e4b238600089935a53ae0400483045022100a3a66773a386d4093a42c6810fbc760813f31788fe4cb5e9e1618f8776339f6502204d337f4c1f254ae46345f889a4fccb3820105f30b3b070fa231af5c327f77cf601473044022066249d5a8ecc430bc84e2fd9cc2b121e20330877e318cf9df5b92193447776f302206c109d71df464f052267fcb286bd0529e50049adb3b424abb716e0ef091b088d0169522103194331bb7164e2a488476e580f52bc35df9ddbf470b10df1c24ce3f64037c2cd2102e0470b3a176b00a949cafbd890f6b9ab0787c7c9c60088035a1574bde2dafdaf2102d3903241e375dd10a17ac473be0720070b0d6c10a61b32fb2904ebc71b451e5c53ae47a00a0001000000000102324feb4bf385df08f35b2fbed3e336b9573c30376db6421689e8f8467e7eced60000000000ffffffffb2eaacd719a996c12a35952e1af98bb63fa0bccba79fe26faf77d4184b9ccb33000000006b483045022100bfdb2e0f9d1734fb44d4f659af0980b1e71ec024e878e45368794d8df21153080220506e46b7d836ea42ad6bb23a003d6585f2b8d1e401ece743db429e75eca45c07012103c8ef10d633ddb3798dd6cb10bdae0336488ec351985a57db97d9033891012ddeffffffff02f0ba04000000000017a9148c28f1ac160f85041e8bdd4a66086acda303f854871c5205000000000016001426e4576c0fd21a7174ab4911da648bdca124e93202473044022063899731ceb807a71b91c22b2f8b85f3eb87efcc8f801c6f8dd500de71dd9867022014ced8b823fada37bb7c52639b7d291509e4d1e70b63b5b9030b71b13e5bb0be0121027810ac9fb3e410587817b8d5f1712a1d457820e8ccfacad483ada4c1abbf245e0000000000020000000001017d371faf3277f0fd78e2c0876a5dbde4bf69d0feaabeab9333acd3800d06c52f1200000000ffffffff1b887c0000000000001976a914bc9e749bfeb4c7032ba6734325459c999ff9191a88ac905f0100000000001976a91410581aa1225d52a8d26a23e4533d4b22663339d088ac76e50000000000001976a9144fffce53630be28c41032d0d14e385007e0a022288ac567d02000000000017a9148104959d77b314598a1f1a816b4c019c85f6e2f487ef5818000000000017a9147701d64f093d7ed5b11193aef393c5baf9bd508487bb3800000000000017a9145fbca865f16b047e6fc2739a8330477c8588886387c90802000000000017a914a73184d32fcf02be79beffc3a7b7c204a76652558720d613000000000017a9142b7c559d954ba634c36c0285ff5ec438d0242e4487774201000000000017a914700d1c26cce83a1f63e7bc9d1f0d2f8844db297287588c02000000000017a914f4c8dfc76f2f6be004a7f478140188e8d913468987a7c0070000000000160014e2ea5f0de6679ee3864956ea58543b3f4098a96a81720000000000001976a914702323220d69511a690983e34ce2df79aba5fa6f88acbefc0c000000000017a914d726b75810166dfb8937da7536cf85de73600dbf8722020000000000001600149f0495192467b3d51ddfe8a1439ae7838521faef82af01000000000017a914df250119e5627b06e229eae4f2ced4d5818f981f87e45001000000000017a914abebbcc41d07af873b8575f42799fd69ff8063f0876fc40b000000000017a9141dcae95c6aec8cb2108ad2185ee58208ddfc008287544f03000000000017a91415f343b668ad5189ee515c08dd508f39f4f14efa87eb950100000000001976a914a082f784fb9fcf947279c6e09b3c78a66d0cfc7f88ac5e83f2000000000016001457012fba877b6a24c59f6d8bc443759b938275c6754803000000000017a914f713cef3f0b647d43b17f54bd2747c94577def7c87b60802000000000017a914102f4d8a04444e54eb98009c19c4b97483bc52bb877c14c8020000000016001407af528d7703b19a2150eebc47dbfa776e84c58787724000000000001600147515efb16c3949a2098036676f1d448d5ab9dc159fd500000000000017a91457946924c6d49e1ed1ab05a9f79729f996d6d3728709d32f00000000001600141814f48c5bc9e7f377851b6e86cdd20b87fa3aad82af01000000000017a914a1b844fdc7bbd32876e1d19cfcdfa5e341552f3387024730440220414b3df4309d6b67b844fe6c20b83ab86b27ad5dfb757f85951da4a69bc4a0670220559b601fce021d89dcf57c4c33f7b4dac0ef05efe33ba905a37dce67ac6e5bf90121030d29b6531c1efcd8fae7fed973dd38bbfd98d3df420b2a91d303dd2d3bfe831b000000000200000000010141b29e0bb47fcffc3640c4e8aad85d31592b93a5f74c19870c3a7f6358487d901300000000ffffffff029076120000000000160014600a115ae2268ae676b719c3cf69ab498efad76b870be00000000000160014a34b94c8c8b0e7ecb32181546ab9a2e9a902b64d02483045022100de0c86ff9400b730af3fbf6b6e68f170a456f47e1bb243ff60f64ed6e2c7c1260220253225eb8f7928cbaa5a6ebb9849f479128d1ce5a58c51af1422db57c5d20cea012102a8490dda21b66acc204a67b079693da9cc56e9508c18e28236fe13c2e5c28e3400000000020000000001018fd7e0ff0a8d741d773296689216d038f9c8ad48a1334b5998fc1344a793e8760100000000ffffffff02808d5b00000000001976a914a7d8204e05f057c34efbfdcec03515710c1d166188ac9b76840000000000160014e9a93d42861c30767d456ef95e13f819c13c494902483045022100b746e3870152c1634b56a7628164101c7b906f9bb57a697db82ceb33c5dd5c8a02203ea80bdef0bc4d17646c233faf36c3ad1bad2fb731135657f39d553f5a6e360b012102a9e73f770d2833f88c0707c5987c8dc0ce003414a0ecb7d47f7deb547a5f7045000000000100000002f1667ca0b06b5852ac2c489c2287eaea4041bf6a01939c96c4a80ea92a771ceb020000006a4730440220144abfd6b4893c3cd20f57aaed8278b37ceae5e78c5b43f600f8029b549f24270220773b91ce4ad9b6c0ff55933395627f12d2e20c3ce133c90e33cbca2717d17e3d01210314bb4d0c6e3de20ae32b9a7a51323c0bcffb63866abba51b985a185ad6faab99ffffffff34ef75c31daf809bb0e321f99e423ab337cdb157f966de524d7e246a9d3230a8030000006b483045022100a76a31c248ff186c0c8cda2bbcb8a26a21c3c6cbfedb02a1b41aaac9953ad30c02202f345601d56fffe62646469b6c8a9ca7adefc1f5ae8181d2533a97088f5d1a3c01210378e38c6f0e62dbb8ac47f7435ab7a069b08dd415153afea597d096f3f4d079c7ffffffff028c721000000000001600148019408d5fa5c5dc90adbc1389d87a8525d94d0f89e1070000000000160014c68f50fafe3cdae966c87c53dab8ba2d1ed8877800000000020000000001011f73ef2fc133446916c8126029614440b42ae4473f3650699472d5737904fd1a000000001716001449c98b60055651d2f8abc4f007ba167af2478ac0fdffffff023e731f00000000001600144c58de2acf4cfbf77d89b5e301cb9908054bb0e778b1ab0100000000160014a2973b2c16a029acd31bed2fdddbd5023056f9550247304402201230b647d4b858a619b0dbd0bad757b74e27363e9e30ba5a35d81204e6646ba702205ba4cd20f5a5ce0fe89b69229f05e80d9c50d932fb1390527dbd71da94cb5615012102fca162fc9040e47a8a530a1e48bc237837e2f1b35c1fb6742c00e3588f7ce15047a00a00020000000001018ec7b3a3d724a45c5581c5e89a3602a7758352f887496874fc0e2e46ccee23d50100000000fdffffff0255581000000000001976a914b9b51038d5e936b5cc5936ce3faf114f5b38abb188acbd559b010000000017a914997eb5605b661f7857270fe29d40e3c403404c6f87024730440220453b477bc53c79acfda615b9f392814f901fc41a2e098c47622f8f7396907638022073ce0a496232205929bd412356bbb95088ff5c581ca28d28ce935047fdc561410121020eeb90978d1e22e5db20d5c4e376f05e86d0a885379879041800188eee97b9f547a00a0002000000000101f78cd9f244ee71e539839d77ba6e6cf753b80737cfcf6fe67ed704138bd534da0100000017160014346435e32dbf9b207ed41c6ef917bef8d1dd1505fdffffff0237d791010000000017a91410565a4ef40f874b434552941a9d38d22b506eb787a27a09000000000017a9142966bf081f79c57ffc13638fd1533dc20b760cc6870247304402203cca13e9a8272270da176f30720d2279aa49e2bee8bdc0d3a05e0d77ac0fccc10220799b76d3cbc2d25b8958dcf13a509989e45289aca57fff80904ec29eae41872f0121029b9834e75cbc64e6993995cc2c04a879d9068dad3858741da7a341f00c810e1e47a00a0002000000000101e9a5c623b9e5d5fe11d3109b0b2153d3ac82f478d873b0ed94c8b4cf116b459c0000000017160014bd0fce5a8fab213f1d7abb77ff0ee33e34734c7ffdffffff02e711d80000000000160014a944487badd81b453b22e2b83ca4e7a375f83b1878c1b900000000001600147d63f5e69f860838f3f0c8bb19e4c382ad075c7e0247304402207af647c3bb9418ad961f2ad67d93d1a51b87ac38a1cdea693bb01e76bfab19600220688cd299ab341a1f88ec2c9eacb49eb60564569017d5536870f633f5fea8a65b012103ea5ad3a91edfed178628c0549cd208c3e139676c5b493b13c266a98b7f64355747a00a0002000000000101492d8c16aaf3a1657a19dd90029c575eee0e609a576da6bb8b7609ebbfa567680000000000fdffffff02358ac4000000000017a9140e7a61e4cb5f2e428d50bed1990873c06da472d2874c841300000000001976a914313b08c154af4f11a767c13c57b00edfbf59bc6988ac024730440220081812fa83c3663e9d7a5553eb76c7b355935641ba14b0c79247c692e81e9ca902203ef6b47f0b7305d1cc8d0ae64e7a50b2c5319e4f58b66ff95a523fb1bfaa91440121039b57791130271e03a5e3bf86012412c56c644941e00727a4d44b4b836b303eafef9f0a0002000000000101cf010a05b04cf6680c4725b43a8458e0f00903f72bee80b0214984063a8015ec0000000017160014917d556c7d0c10d1d49d1d1fc859976df5675ddefdffffff021ee101000000000017a91407b22f259a242629449b5338db03fc1bd3c1aa7b8733a5c2000000000017a9141b2cc105b0708510dc0e3f64b8c8d5e9f22d4ba58702473044022006e76db814a9620adf96d8e07de19f23083f3e9c61c6367f530a208f3ac671f6022079ce4fce58aa576e67ebb7cfecfae4e39b8527c1b03ef0395deec887d23da081012103af901c93b5681fdc3edd955ca82b93ba2e3db956d8c750a16d24bd65580fea3648a00a00020000000001017d3453682d1d7d77b45e470eed1ec69608d1ba62ea1c4b8a4748a34c7211a82e0100000017160014b777833377d62490007e84359741e1fa5f374169fdffffff027be50c00000000001976a91416f642a3e929123bca3efd9ca713c7b2df3e822f88acc8bbb5000000000017a9149e4f55cf29556292b8ca1a3efb3c03203c41570a87024730440220693e334fd68ca07cf212d3b35d3c5514e719c2129499638e859fb0aad7fe171f0220613e5c667003bbe60fb142c98c3f81e4d384808e78460ee9631f25aa601313630121024895679137d12a5713939a27b197007ede73f601db84780de527f06f325a209b48a00a0002000000000101e65389b6aa701aa8fecddcb2cf1903d9a2863b588f6b584d4a2ff052f8eaf7200100000017160014bc9781dab089f4756d41f15859d2162124a91774fdffffff028330a4000000000016001491168e6f9a62bfa428031f91ff9461e4be89f77a6d87110000000000160014f28c4f6ee273649ff0043a7e0415409f52673dd1024730440220529aef056b0f15af7a062de11e242b2747021c6bdf4b5bb827f6affad2d2e6ac02206f64216dc5cfa69dddaf7a6c0220f6d0ac378a70f7b0dbe2a3675625e1a1daf7012103e7896be1303981a72f21e91b8e4fb53b4bbf2a3935cb7847aa1082c73a5e319e48a00a0002000000000101133a07ba59999c0e4374bb5cc5ae020d7039bc8b895f6ccdf9a1d75e33f361f40100000000ffffffff01978211000000000017a914cdd3bc162aec065e96a3fd3a0d1715809a95b5e68702483045022100fbd6f7dfa27f23d136993b07c7cc47bcf7910cd979754cd2fc56946a49c4f68002206028879c28425124decf844df3f2b125be9b626e4bee5bcb511c0099e47b59d90121026fdc41a797b448f91e5fe87b6d33144882111fa625ee6de5dbb75fe3e861d7120000000001000000000101577e538ab24e20bafcf2bbd04a163f131709f85d9bc31456c15bf450df5aa9160600000023220020172fe22d1e6fc050848713ef72c43b4ff29f9abeb63d0c125b82da27fb1c1b29ffffffff049a2113020000000017a914fb4ecc5859947e01ced0c44bf6cd841fda0895f887805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b493000868700a3ca000000000017a9143d7cd99748793a49989784a418c5e2cc49e195cd8780404d010000000017a9147a9ff6ed0f830aaee21ba54b0b4ea17375629563870400483045022100eaf2d23a52ac4a9aae4fb8a6ae66662b7bb4d309bfcdd4b0cec04524a20f1aff02205f7b4fa0e3574d21a25590514eb5d91f15e1ef4df3abeac7005d6e3e93fead5301473044022001b1428458261a8cc8d84ccb1a016b2d2a5e57c878152aed6c81b3b11970edab022021975851e13870f7cd5ed10f2c92e4ef0bcb46a9bd16b233243f58309e40f5ed0169522103a63e4bc0a9a31b4cc35b81fee166127447e69ce0321fba42a4b4f5719d42447c210262aaa1d420a4ebd6148a87e33f448ce37d10ccb63a13a4733a80cd9c7911bd8521027d8b4c03c8e950d74e4ab71d82e7e79edcb636e076d5420c4a05c1b1b236135953ae000000000200000003da4be5c7dc5f0392fdffeca5d07e7288f15491499adca50c5d75d2e8932be75b080000006a47304402205672672e51ca5d2391777c220414d38a89d27bf6ae519ee4037cc9321c7263ee022026a0ea150175ce1848e73c9c69425c90fe504e673c077fb7ab1220d302bc7ee401210329c5bd764389d491e647650e5e2e2076bf9c82c32c043240cde53c5240aee89ffdffffffab89c8024c857b2d0de861faf9ad633870ada47675fc9d39b9e1e040736df13f050000006a47304402200b2ba1e53dc6cbff04d53ff4b018f1a05aab3988c3fa0a203d3a71e12d758ae402206098a7a4dd4437cac2e60816cff3907500425bf9b28d67efa23276af4a191c33012103c923a99c0f80691d155eeba2395a3ffd3c4a0552c64c6522bf555a44b7e9c67cfdffffff20a0d84ed50e36ce2a2f08a5861a2996c1de02801d4f282f90001b687717077b010000006a473044022072dc0f21f6db0794beb1dfbd6d2f7b7bec25f8e8a9acdd5bae7a93e0807dc83c02200ffaa3c8e6f6896e73b9dd5cad3a691f4c2723149990210273f158692141b1c70121037354f6688be6b29e65d0f96fbf158ba374a1db41a206a25bedafad263ce16fedfdffffff04c05c03000000000017a9147b67f82ddc2d68e11c89607f478a3f94bab6df4e87875d03000000000017a91485fffcf77dbce03c8ce3343b09e2d8003d86142087ca352200000000001976a9141f50abd6b927c9ca5bb0ccbd66a61a7ae8ac1a6a88ac5a105900000000001976a91407cc15ab1440210031da2f8c920a0e9441920db388ac49a00a00020000000001011b41fa0a98f6119a2c85d5d5eb04424a45adb92d77a49a18a1800cc0e7b2a0de0100000000fdffffff01d468030000000000160014356833bf8ddf74bcec7187a84a6790226c386c2502483045022100eb66c2f8964718c5e64e0270554da5e519f6e9ea1730f64904fb5dbe7c1b78390220095991ca482b2e0edba60447f8e195af87de8669111ef85a751c12d22ea10f3e01210322ce8b8f917fd145473e18f18eaa00bde163bc133d3d237a1503e77655862fbd48a00a0001000000000101e1e5beb70a04c5d9d533fb90debccb666bf84f35199e3d1a5146af6d2e678de00a00000000ffffffff0103d92a00000000001976a914765d5f88fa4cd66b6bb45a2c75f29e71218a977688ac040047304402203442c33718cc55b48e4d81775d48142fb672ede09af66ae315e80bb0fa771ebe02201d8e1bfd434d83c4c6ea215b17255dad3b28d72b294ccb3d6b14574e6bdc9b8d0147304402201839a6da500ceb3d94ad586ab2a3e2f72c61b58519b9a75ff8a5bca1711f8d5702205e1b2e128c5b2c993a1947472d30ab9634fa84ee2f0b19149e6c1863295544890169522102f6908414564b66f32df29756727967939549e23eeaef83114b55d8b7e1bfb9f02102d6c054995cb3588f48fcff614609a437827cd510af06c454087ca39ff9d1e4af210203b80debbc81c43cb8acaaf37f8d1af60a6f553018e6fdd85b53a221c88cc1e253ae48a00a000100000000010124feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10600000000ffffffff0170944d00000000001976a9146eaa4a3ba017554a487c407b7b0648d98ea7b54488ac0400483045022100e3e700a512f9b236c313def8bff6d83a72b1fbb550b53768d2330ebc7817988a02207185aea3f1e6264231853014db9fb8e8d2b6f1c7bbce93c176119768b18d62f70147304402207fbfe53f1ab11f91341b1c55ca691554adb6b9deec1c9a0a4e4362f80169670c022035a4f9764af7167d9ae282cdc44879254e77c2b4ff8b6cafe87cc35135cd4b09016952210213218525353421bf10e1e2f83bb254d1a387fde2f73582a993fc900568055606210343ece74141a486365aac8fa0cfa8786d50d030f94af212788442de9bff00383c21031d43ffad31ccbcca0dd82761288ddfc1c8d0c569479be2044ae9f373563423e853ae47a00a000100000000010250ef81f0e1427eb584f748dd3ecb8bf5e2d0d452bc2d582dc7b3695bb72bcbc80100000000ffffffff8c0f59fe97c288ca4aa4e06586136ecb068aae264e82fe725454910b0edc268b0f0000006a4730440220427f90d537697a864f406c3c44dc5a7ae886d2d5e6cccd2331265e7868fda88902205c707e776d48c3b7fa606f56c9315889992ebf586c054d6396427bba1c8136b2012102ac8cdb24385e623414a71e63e0d07e9103f9f69a25ff0d5dd6810c02f779dfe9ffffffff020faf01000000000017a914ab218eda32f16ce85e0bc897f3b4f85006529fee871c0c00000000000016001431c8ce219309f4cac20d7569ad83cf16d0a44a9d02483045022100f76aaa8640dad52d2528c85c757bcb344419a139c8bfc3c6411b4fc53c3b9bf3022017c00db8950e95a41d72885ea55735e8403a1c12236b851e2f208bf689d0f00f01210309944d0eed27e387862bce8c4c68c24d8852144df165ad29d5815ec247e9612f000000000002000000000102215d0fae2019994dda71fe95f5488f3b70e136d3c3d7a926156bc2fb8602a75d0000000000feffffffd0a5335aa676c1799332313c91b2929703ea2d54f9e79c43264b544cb76863290000000000feffffff0237450f0000000000160014ddb10b6ced477ee9d62bb835a0417737f7cf15f230c807000000000017a91413d839407cee486d212122cdaa958b274c9904738702473044022004ef4d0c2a9c151342e5c398b2126942ec1ecc79ee827d351207d23d3a2edc3c0220356a3b4415a7571164ac11ccdaa67aab3abfa4774b1c74a01a49121802018b76012103f7bc5dfcd4121685acafb7ef0447ddbcf5a9868385b0ffe393237b07f6da62e90247304402201aa95e70fe5069fd533a13ec71aea9fe9df68c08ee6d4689babfa5c34b3ba300022014a40aa4d664b0eb713aa70121e2484904f014da6ff5fdd5f4ef8eb183542b35012103d0228cd9d148eb4c28d8c3cd94314e412eebd5c496c4b9c81c36df2ef9abadf548a00a00010000000001015e6ae478adb9e44aa3d365d9592fcfca67a7a257d835b54b03b4674f769b63020200000000fdffffff0252ec03000000000017a914058d27086d7eab1016dd9c0a49ae758e7ed12f3687d9300d010000000016001485b222500820af6248fecc684a62ba9088fe4dd002483045022100a7beccfa5942e630f75821550df5ae3076dfabd673116281a9fc340619e8299402203c6be2d77e03cb1e6098fd98268e2f0b2423260725742527bae1c8b875141dc20121034ee492ff049591d13a350a761b9ee245ea82c23cf94497f3a20bf4c13644d5fd000000000100000000010154d49266a86b955edf353fbbd81bb5fe889878768ebdfb29ab491bf1c94a14c3000000002322002018073e8ded6a6fdfdecb27b746e668a06f22d3d78b675863ead2fc9b1e5f3d2dfdffffff0182e603000000000017a914669aace975e26134c70e7dac6aeb38eaa9c37e7e8704004830450221008fa282f9258b8e8fff396c8e8c79843874585cc92469cf9ee384cfd5c3a41a0a022072d3cd192cb9b578cd823f83006a31fa62edcef0d2d2009d08b128e30863338b01483045022100c110cda42de776d4464a436af9027bd55230e305ad04526cfb43c7c7293eb96702207a940fcda8ac3025cc25bff5cb26d63b365c9bbad7a8577706f85495517e8c290169522102c32d2551d22726466d92163e62b3eda53f0df5c5550da3db187a493103f1b65b2103cb43e15070d6f1e0c53b294c6a0bf031cf54724e644660878ef7378ec60a16c6210290e823afdb84d282e42c55950451ce5776eba2fa1f68a5fc667e8fdcb469e42453ae000000000100000000010161c567d6deaabe2be9505389a6a9d694c146afdaf614798233b61e1d691bfc6e0300000000fdffffff02c24406000000000017a9146fbd39ddfb097a2ea6354611e8de37686d83f01d87707b13010000000016001406d183cbe6dc2b5cac3fd8ab6ee84cf38f78352702483045022100a04fd3117e943eac31b4f0d0029e99b90965f556abab0ae1de558f98d97fddab0220443e6762b84006baa3828a2a22c60bcd0ac52a148b2935e266875fc1a902f97e0121036a8fff116f98fa7487ecd3dfe85d9cd5a6502210a3f160c346e6e29787491be900000000010000000001010a2142947cb4c3791bb131c342c5f4d28232f60102c64cba32251fb81a4b854b0000000023220020a1cf7915ac8f29b6805dbfa6a3edb6c83ab674d0ef8b28050afdc3af743dcafafdffffff01f23e06000000000017a91452550a3e687967b78b9bfdc4de0a26e6c775ab9a87040047304402203eeb230d01265fd963324f400fc76d3959800f3d336a38aced14ce28555e1afa02207f8d699858b9da9c89957cc1af340c22c756b34f69c03b77e296dfa02a7786fb0148304502210094cf41ebb3eef2cc086952d1945472966c5b683b1d69846e854a0f721d72225902207bcbc22b1a81c0671c31683d08cfd80c020ca52012c0fc5fa0727f486489b60f0169522103ace6ad4dda0d8089855e854004fb9e4441df20126b72faf3a16b3c5515fe03922103949db543e514c9c6665a93606fba64638c53572e7dac71969911347ac9f852742103f7f11bfae6ff75c3224daf27c29dbdb3b6e3381bc84bbf9e4ac114b885885b3f53ae0000000001000000013e1d310fc441628eaea934298d2a4382da47d4f46871c0dfaa680ab843573aa0020000006b483045022100f9007dcde4ea1e7518a3e3605984d04cdf03c72a8d8d539dca9b5252384ccf2902200438a0d914b1168075c8017f55eb4d1513be6f87af258ff0dcb8540bbf22eeda012103cbac59ea485bcf97f5e503c2f523e6de501a4f9cb2020e2a05106aeff28a17e2ffffffff02d00700000000000016001488e1dc5486b48bcb79148155f81992472e8a3626f5bb2f00000000001976a91483995f377e04551be28b953eecea811eaf0270b788ac0000000002000000000108f06a6ae14dd08fa52b226063afe0ac03d2574e0dd504b428a90d38323b52381806000000171600141c7b0ef808eb0c66478bf90621c2288170096ca2feffffff5b7b06c330083de24ae0b6b48c03710a9c26ced1717a0ec25ae484284fd900f50d0000001716001483c5742cb24532044f9037ab37bc26a3f0bcebebfeffffff379d7557bdf9879895d73c269c9ccc8392be9941c1ce015d026a0686f460117001000000171600141ac6594f2e1f268a675737825ea598fc1e4587cdfeffffff16d8c58880cae967a097e6d5fb2dd394037b64277845beac5d592614551231a401000000171600148e5266fa0f81cd587af577172eb40db696a928cdfeffffff26db9fcc975a257cc80426ffd2988768a95a56666a380fb3e16986a14ad289112600000017160014a9cc0faf37899c8fea82c7a3c44c3850e48b7766feffffff34d219e7706aff07aedee23c58ba90be56ac35fff1d43eab164af35cc5a1f66b0100000000feffffff035905f60d35e0317fd13e7e2b6416d18b6525390b5ba6dd7bcb2193ff68e4ce0000000017160014d6d14ee2f5d4d38b84c1efe3b47dcfc9432c8e57feffffffea95dd4dc264a57d7cab0a768281c2c3c1f7bed4b9dd77d2f6f23a89237946ad0000000017160014cbba0e3f4eef136b56c2a821f94958fc0f20b876feffffff01d893f50a000000001600149a1f6c827ec0341381aba8e53134c32226207a6d0247304402205a8926b57096e8a76d5c6eececeb7045b690bcf2ef0876cb2b83453fa5c10d0f02202f80c190e852b470e8a9df0a0e16481dd35947f249cc7e73ad0c9ac6c4a573ed012103f2a84d1262bb34e8191dfd92f69889e88b8d888beabf64f807ca9e9979e67f5c02473044022005dd7f7005547bfb871a26b282a4d453cb27842a15d3d10e267420cf889adbab02201961f817552390c436e7af529b197fed026a26eebba3cba89ac1553177d47aa9012103957b65d7badb22f1bd90ecdc1e727f89b80a1b17752fce79427d9f3874cd8fcb02473044022044ba340f72cd40727c123502fbdc6e0725751e6d0ec2dba2482b438479c8a02d02202afb503b78e76d8634e78cd5c8cfe804fdf2315b0e3eb56495dde72e31b214a50121020433527645f03542a35cd67763fbe06ac713eb587dc857a597bc03e695087eba02473044022010f2566b499e499e7fb37a4179446979ea63233594def4d21cb2bcbdb08a67350220764fdc7aa966686ed053afda069f933429f3a754598deebdaeb95c9d996a52430121039ad7abb0a1add46db9fbc218c5d08c03fd0539ce046709327434b63ca04684ca02463043022068d117abdae52188a4cba777a6fe465cad0742ab8f4fa5628b1f660817f74c17021f28a4af1bcd760e323c470b656ac01bd216050cb08577ce067f45c669d4931c0121029d9a8bd0ea1fdc4d9caee810c898a50127c5c5ac127fd589a4f88ed12438383a024730440220477d57c9a9391663eef9d3e754710be49b65e19a801fa01562653607ebc2697602204195a3b242e3ba26d569d5477bc130d011657e94545ecf82fe05aad60bc0d44b0121036f12ea2a09e25025325bfa426e07150e7ae26ae63ae044df7c5f2a2f3ff77d0902473044022048a39ad0c773f1402a658552d0806ce1f7dae924e41ca3fc894007b3392ab78d022064aba39380ec39698a120713076a37ec8a8ae4d30c0a7517eeb39957636daa600121038ac9dc5717cc116c34050e0695d122796ae667d69ba9e76ffbbac31909bed7e402473044022027b849d61d318980ff5a13718daca855fb7d2d8b91c6d104c4ef555d490e776f022005821a2bdf93dda680170d056faad6ad89aa4e86c0cc7f4acd27359232084e19012102483a02147f353eed481176c4ca485a67979f60bf730a0d6da4f66340fcc6bdd03ea00a000200000000010c0395a6aee531d9bc8c8726c62757514967f00c179398fb170603cf9c7a8ab2fc0000000017160014c588a8134c3b4e1a9818d5b7c84d372e07cb7985fdffffff07bb12f6f842f241565205655124572a3f216070bb1c3206da6e5a0f0ff6aed70100000017160014561ce7b273873dd9a2c0a641d51f401bf2aa2a7bfdfffffffe70e51ac1e2e27765c6c7247c2cf811155030fccf01aeea913aa796a54519710100000017160014762b7427f76e42776a5d32fe0a14aa2ac61c36acfdffffffbb6c18457195fa31247abb2a5cba15dc551bf7137488f393d3d11e0cfbe96601000000001716001470456b99c320595636fd92235135c0db8b7b9097fdffffff8a3c282d8391bd5a45d30ca375e22b0bbb900654d2f18105e560bb7000a1749100000000171600145399feb25aad63dde3841545ff6fbe1f847df3e3fdffffff4f73b12e978030235893129f86664de1de8fa4b44475acf05f646fd9ee73edc800000000171600145399feb25aad63dde3841545ff6fbe1f847df3e3fdffffff0f536add093086a2df11ed63655610b019b358f7de372e0c5a34c10f020f99fe01000000171600140f75286919fba0238020409c1e5f56f0f1eafef2fdffffff768a3e56f5eb95fe1b9663c592e7c3223eaa71e114495080d70a562afb1f08da0000000017160014623089fd381e970b53efa32ecffa40349ae8a45ffdffffffc956dc97be4fea0cd9a4282bc710a6f68a4a2ff6bb916f82f732304e60a6be0200000000171600140f75286919fba0238020409c1e5f56f0f1eafef2fdffffff60474afb9202e6f9df20f9a8df38ae86a6d17aa24caea10d0a0efeca52c206ea1200000017160014b33622217793e1ee12a5bb999d300908895b681efdffffffa6b8ada72f97946f61ddac2de354f44861aaeef18fcc70ad11e4ff145e0e227d0300000017160014b33622217793e1ee12a5bb999d300908895b681efdffffffd9c502b25fa2ef5d15e8c3eb789d3f68e7b01ef24a24c6d0ff8fab972b9e9d180000000017160014762b7427f76e42776a5d32fe0a14aa2ac61c36acfdffffff010c7461000000000017a9145b100f61604951359e393850ea1079ec493acbc08702473044022012606b40a5b6e57914b32900353f3f17c0e59c302f19a7d4b29b1e8518f55c6502204e919483a73a0d753b050aaabf65600a98573efca4972f1d21f3f67a56e1b44501210258283d77fe41e38ccc0b26b757430ce0d4551ebead58109455fc14b032c22a0b02473044022038995517faca6f69fde87d9e4e0e895b1bace7cbdff25c967d44146fb332174d02206765994e82ce615448ad18d553b0f0d4b05e2330914da1296ec661376303a82801210274883798656799bb59049df65e6d40e20ae2ac50e56be4fa7d9f7b5ec8aac9020247304402200a885040a0bf5d89018785778949a7e26550ff1feb9133b3607400e9c93356ed02203935964a8b95a64a43593b8a6a795441395c040a624d30adf4fde9a6b250ac6e012102a55cce9da7590c162a7b0f52e2c6c8e908fa0c6772644581762f9c6e3ab93159024730440220093792f3be4de7d708205599d857c04039ac7364731354d11718440090e26484022048af346a57c9dcb1401bd69403c42762276fc13d4acdf842dcc0747fde1c0c4e012102e7e41ddb876409a8a39e3db2369f71f451502e6f62c3f70ee3b400161001bad90247304402200c68ed040fad7b9a17c50c94709a1296569dd0afecb17c973e5811d8509f749c02200ba3b45df0f3a0c8c845ffe31de5729a94b6a336953a6ca12a81879ddbfd3692012103947228a5a970e8a5e02120e13c6fff12035d072fb51916e7c1d3af155f8c96b902473044022066b7138339aec59975cf031e07aebc3d3185d95740500ab8a389348a1549b1d1022050c59deccc1ef5006083fbbebee6edeed139a9ff0e8d5b583316e941a75696df012103947228a5a970e8a5e02120e13c6fff12035d072fb51916e7c1d3af155f8c96b90247304402202525672d9f5b4fec16b1657915b821371b960fef3d43bd9ba31aa587f2c3ef2e02202cc9db552e48eee03f04ea195ce5ba02db338dcadc869c83c30d9c2a133bad9c012103dd39b395eae4f4199d63263ea7499b101c0b50cd0a6a85e25ca907b51b2cf53f0247304402206ea3111eb9ec6f7eec2487f5d68b38f7ef7727e81a7e0de6f73b298184a0644202203fb84e8de89830f3cf64831e485deaabcd12d7ed4cde493e40c306162dbbeb7c012103ee61f91d39335fcf70117d81806d1fe2054807cab2cb12a470e3cc8cbaa9759d024730440220133bd6f37ca73ebf682d1f0bed03ae51b701163ee626cf1b8407c12fd86f2b2e022046bc44703654387e9e4a7980e199693c78dad8d51ae45cb074a2f14dd7fd0045012103dd39b395eae4f4199d63263ea7499b101c0b50cd0a6a85e25ca907b51b2cf53f0247304402200c99ec76ef078a89607ac28cb4c4a932f13fac65eeb3bc2e03cca95f58db42a3022044c9227f9aeb7c867fbddc8e870d75fa26d73469d51e917cf4126c044c04c0cf01210283f7e11769960c746d60008fdc41fd3df4f1f443a8c2ad406cf895c1510c66fc024730440220504eb5c434f365eff2cfd625be79df995e6080913729bf5c1f55bc38a9d6558002201b7d5362301e508cbdf35f401c39133101e8becb234b8e7f1bf21cf14b745c5d01210283f7e11769960c746d60008fdc41fd3df4f1f443a8c2ad406cf895c1510c66fc02473044022050162468221aac62b6dd42c71453a261e7ec09c3e8614c54b80b171d1fa884e502206f2dedff41f64a6fba63e89786d075989eb2368796a8b193f5dcbaa78a002feb012102a55cce9da7590c162a7b0f52e2c6c8e908fa0c6772644581762f9c6e3ab9315948a00a000100000005346859552873e4c02c7e8cc2f0c753f140545a5fa5c6ddbfec51bc7891794a38000000006a47304402202e9a231354f24dda33040b7ed5a9bbfe72a1e4aa7480c18a237e87f196e0345f0220484e063665c641db4125878ce154576f93389bc08a8de13145dc38c326b7891801210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffffc6d9674847535bf66e97d4fcd7c164ec15330db5a096b9607b6b3885b8e0515c000000006b4830450221008d589361ef8afaf9db386d62bfad75d77c6fe7c6fdfe4d6ad6b5d6937299ee1102201ade8ba945e892bb9b72f031a9d46f3e2054ecbfe95c30d39a2f19558b3e301a01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffff8b903329238a14fce44cccb460b036b1308daef517b4de3354e5ba125955c864000000006b483045022100bdad92feccad170808b6a2b52f3880530583856fb1837a905cead1740009bccb0220599dae494c84f56b73996e26c834336770b5a40b995249d973254b64001e757d01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffffe79cb842cd860ae9768c80e87fd697591d1ccb9cb6e75d4b38f1f4454ec4f03c000000006b483045022100bb89690691a332487e64e4cc644a99607b89389090376063bcb7f6429e706bce02201993ff544920814e4edeafc38cb62f71ba52557c66639fc5171682c0960747fe01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffffae2ce446b431b73166be4bf4aa53001561af91f5c03d774fe7b445470d627e81010000006b4830450221009e3a0680150eaec1c15b24f0416da49f5ca72934c7465f8ddd4881e66d9d413302207f8c8fba4c929fa964f947e802ab619dbce9e9b738f10aed09c5359367347b7f01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffff01d47c1300000000001976a914a16b391d6ff57f7f310dc92abd489166e6996e9788ac0000000001000000000101dbc9ca5b89911e65b7bf98f5efb0ce78c4de3b0dff370daffae85f875e7793060000000023220020499d4f65c617eea9b88c366e97d95cf9a9239c6cbf0bb8fab38a6769f02e0a13ffffffff03e03913000000000017a914f201eb110c1563a4a1293ced5c2f7ab29b1cd58087bd1e30020000000017a91492922df4fe14ffbfba3d98711be19962ecf4bb0687f05c03000000000017a9143203718d5932ff7a7450920d0dcc0fc9d000573a870400483045022100ac95a3ba87047f81c802ea3b58e71218c8ff1facee253d52ab23eba0181990bb02202a8477693fd346d0cea6ebd85a16fce8feae8a7d95c865c7a9a8bc42df0cb1a001473044022028ffa8b69f5f03144a0153d20ea31f76ca828fd557bac34ae7cd5ddcfc93de3a02202e683cbc3a0b840e7d2c2ec306573477934cbbc36c05a5a03d3b30bd665281f60169522102bba27c50001ca9b8ae3853576f8c3d1ebefe942492204456aefe4d06940a6a5e2102c96982a6507daee7f40eaeba89ff0eeb18a86f806433a7ba4daa927039b254ec2102de5cd5e44b3b12784ce51b8f86bc67a6f8616ac2ec3994926ec903e9665bcf3f53ae0000000001000000000101dbc9ca5b89911e65b7bf98f5efb0ce78c4de3b0dff370daffae85f875e7793060100000023220020cf24513cc07b6782e6b03c34102568b057842ff97c4eb420f7d8723bbae054d5ffffffff03dcfa05000000000017a914b63d07b8ba18addb9424fcb91b6ab94066c8298287082cf2000000000017a9143586c9bfeb383d7056912a96ac35aedb1b3eaba0878c5c03000000000017a9149f9970629507c4f00436ad38e07b4e9ad665b5e4870400483045022100c63e2c590a3d5697868d597feb472007d6ba931e9c6d45567753a9e08e0ce87302204a4781253ff6c36e5abecc9a274f1193a98f25d4a2cfd253349d2d372ed369c8014730440220398a52db4801c0b4f6a75f97403eed37df04fa8f13199a5886aa3a692af7dd3a02200dbdecfcfa832cf5763ba1f76e4dd10d639c6c7f2f61f9a54ccc0761c6a5137e0169522102c9afd6672bf14962a03789600ab22699e7fd78d7164226d3b6debb9cb6824fd4210288fa22bf781ac2355343eb6ccfff143187e363bd099694857927072cedc7eb0c2102477320e4a45c6e49ccf75c91eef0eeae69968b25c7eb0bfb901d46fec263a79e53ae0000000002000000000101d1dd66715fcd59054d79cb24024ff2d0cad2beb2087bd06dfc94fbff8c3e172e0000000000ffffffff0d840701000000000017a91455884e731db8b151b499bb756e5f5ced86751bf38758db080000000000160014b4bee49d3a811db368383d64585fdc96db438144b9e401000000000017a9146af89b4e3d4385000228412c8d568c63681434e2870ea901000000000017a91497f25a9dd30ecbc98457019178000cd54960a76287d0bf0b000000000017a9147933c84464ea6fea532baa859021d951cf94470f877619000000000000160014fea8b777933ddd1e315e55a3dc2a495cd35e98c9113e02000000000017a914e587e0b80955f4e2ae6f9b65654faa4ab4dffc8e87e44401000000000017a914f72b76a01b4a59a8317baea62ed7f7fdd285e4ec870a3e0100000000001976a9140fb83be1a0a1470d7380554ab756a6f6bb44c92788ac91cbe00700000000160014081d9dd0179e6f9f49dfafcfc830ed0c1c5818f77d240100000000001976a9140fc234a65eb0a65e28aa2276e6fd2a43d9b8759688ac926701000000000017a91411a998f548751a1c6d32c743e1249df0f69ccb0f87006200000000000017a914a82e8e06029d22dbcf3fb3a5bedd296ca7d2a6aa8702473044022074b60562b1545656486d59872ab3425d17db003bf12e4d64f60c0d32eeeccd1c022032968fdd2691efb3ff803d4c1e972651446aaad2b08e68fa51ed00e311e8e914012103fb2e6bb271869bca5e19ef55e3120872cbf76932c23be7027f5e17ede2e1c8b60000000002000000000101412fd3f3d92cc2100f624d1da7925cb9c14214f2ed8398381813822e57bf348e0100000000ffffffff029cc403000000000017a914747d24a92496a32a3837a637860d944ce3782231877212050000000000160014d9dadc106b68ec1ba7705220202c228d6cd765d6024830450221008c3cd2509ac27ef3ab02584a46bde5da56d6f4a2cd3666cf28f0f75e986474ee02202138a686296ab381bf49329eaa3339fb5b74523c52c8ec66970710c685d7df1b01210308e0fc5dc8e585707d3cca0cb32f3b2ddc5b25a5c1659e8ac9dfa6ae459011cb00000000020000000001015b285151e2929a82ff56b2d688c99c9ff5e1413ac92823e39819560421ce2ae90100000000feffffff15e8740200000000001976a9143d50a817a679d132b3499563bd541c12624c9a1e88ac20342800000000001976a91440fadcea38b6722f71050bad7db4d9d8d15c269c88ac90bd4800000000001976a9145be8e9ff9d91b40c0d44c0cd2ec9129a927f026c88ac7e8a0b00000000001976a9147b27f595f47bdf05a0ebd1be1730580b6a07c10b88acbdf80702000000001976a914b75ba832fad08dc9e36ec81e2b15ec5cd2d910fb88acac091a000000000017a91406b5334e4ffbb1718314d167c71f8e5556bdeeed8782c815000000000017a91427116d63b116f4c6ec2a0b6c0b3724e03e2846aa87da9201000000000017a9149abe89703bad354cb12864f6b1792b2688a64d5d877df20f000000000017a914adf936466d7a8d804242f6dfa624a4532e1308d6878cf728000000000017a914b2845ce2320aeae06c557ff200979d8dfd0e99a987e88e01000000000017a914c5f9c78ff2d4bf38f0e7f4d91e71942c3d1be0d6875ece01000000000017a914ca4e9c42bffcd3861aaf7c03d443b216cb1316ab87365e03000000000017a914da2677514704b5a2a38b9b52873656dbbcf212a087d65411000000000017a914dfd6ddc6992af459501e7052439b0b143b8c12be87a31f7a020000000017a914e91b7c9d4f035d71022841dfa753458be75c78eb87100d09000000000017a914e93b4b772a9d882f09c61291a37cb810be670bdc876ebdcb2c0000000016001436a86c185a6a608ca915cf723c8f10fdcf126b4e173e10000000000017a914ebcf8c512683c4590fdb4334a09b7b196293487b874054890000000000160014780e3ab3583d951f9a01c5939a086e0594644062a0860100000000001600146e7dfae2164f2024d8a4ecce684dc4316c6e4020a760dd0000000000160014c993323b0feca3e891ebb9ba53b199883746df890247304402206afe0b74dfdc392bb93062b3f02a88ed314c289287cae21f211fec9f13e0d634022043b7f501b1c62d9af32feb5a443db2efe76a2edeb3795e88d17b4b196d081ecd012103a2754ee799e77673f8eca18c45c2ace92e9bcd9bfd8d1386d715b6e932b831490000000002000000000101e7698f8c59cf8d8d3d8bc3b70b16f914effd4a0b90da686af356f83fb85eb7331400000000feffffff01c95cdd0000000000160014897658e9da1fa0c9bba4ce204b8f004a081bdbea02473044022011161d0afa1a8b50dad438ad3fad30c6cc847b4e6f8bbf0948c0918f19f2de9202202cbd1afe546c4f10740653a63a42da81aad6f1d5e73cf840bec13d4d83749d1a0121020410ff3beb589eeca2e621450fcb3c82a7cef44c32f726afdd2583b0b85cca6d48a00a0002000000010b947e148e2dadb957a1940782f90be211f9a51fee6f8b44d14e6f29beee0009010000008a473044022076d94025c2c7b1f6aa23f41d4b60824458412ac64c03e351c9616fdae86021670220588dcd641379dcb327bac18bd3ba22f79947d090c25a1906f20d783c6e2c6fb101410470584e87f314924f00c5ca78dd0d7147a3d125135f0a9f89eaf5615fcd1899f0cec436790e08c3947b07b36039bb36e6e1283e39459242d48249c4e5fbc6de7effffffff02fd9a1f000000000017a91468f77701129e4297e248559360c04d990ee30a968745e79912000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000001000000000101da9f5bbcf8bbdc020a50f3a9d808019589648ccd58f2a3e9abff63042c2ea54d0100000000ffffffff0280682b00000000001600146b933e923981c979eca1c4fd97593a19c2e91d426e0423000000000017a91438e286d910bf4dfabc4d6b8eb696a94c20e9a8d48702483045022100deabeca2134edd83646d9ff1bbfce84f0ddc1052a26757056ef36cd9881fb671022036fef4dcfd7150620495fb27055f651629d647c5136cbdf61b440a06c629f33b0121029bf0a272a6cd418f6c6a31b4bb022f864ab6732d5c2211c71d7d88f8fd9bc0090000000001000000015b5cbfda929751f5dff9a85cc41d812af7d4c88a36db7b9aec083fdbf7094184170000006b483045022100fa4349817e6503c00f3525238a8c1217b69c93f073f24aa50e1b3ea04eb83ed002204417a0a4c6796b54ff87ab3c4e6db1950529f5e17964febbeea7d1ac1525fbe3012102fb624ccf98ce3aab4b9f09246f14c8e3e0ccee5ab1949603026a3ce4a5f39727ffffffff01e7d97b00000000001976a914733a28cc8dcc0f4deb05628055eccab29fd1460d88ac000000000100000001b835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d8410a0000006b483045022100ef91198aa98d43c304de633cfd7c2a498d48580daa76375eacfacf53b8cb199e02201f29f5992339e7768e595744fe6a930eb3016249f1cfc7d2ad12b98402cd39ce0121039c36348f8f859dbf3fbd467291a65ce1e19e06af8f9f8b425460b5bb3844219affffffff0132a90400000000001976a91408cc5363bda70acfcfb89a861afb2ddbc0541de688ac0000000001000000012817ff4544c8ca4996efb55d9413b8ae6cb4e81dd01e6480aa879f65d23a11c3000000006b483045022100b26cf0f069ae056eb194da774edfbf4fa358e0a4e3a37991eeab81223f8e187102207646e9136ae3b9e6d8519d6e0a6b3e16450a72bc9c2676e31a8261c235e1f9110121030fb004e97fdf10a8bf142b7b2748203918915d5182dc0ef028232a19122fadfeffffffff0168b10f00000000001976a914dee944ced2049c35d320dd667ed2a9244d40bbe088ac0000000001000000019530eb079242b3a3b4b03d43d38ac54d7cddb1bea9c242375aa7fba01a897790010000006b483045022100ef647726e4c7648fe742307f42ce8d80e13a1a6d26cb602888043c15fb86223402201dca44ccecd8f251b369a857ea039fce7d516765f57e07c974aef8e9102b2adb0121031fe1be76bbc57622da89612fa9ccdedb0198119fa648125fea38437621f08803ffffffff015f650800000000001976a914c5b45d4d94bc03254d1598013a2637cc24b714bb88ac0000000001000000011794c293e8cf2b67c94897c28d9ca1f49a755a01a43569d2117505944334b2d9200000006b483045022100fd707c3f0be79f05f793e22c52c508f56b0e0879c567283e43720bded94f6dde022052f36f5d306d2d06755eca91b6b4f5e66a6541dc9021d0389d8446bfe459eab0012103a8fa8acd8a938beda77593ef222d8044a602adf1e3dba9d88530691f511f074affffffff01a73f0d00000000001976a914d2df08b1ca1ed78f5d22db384125f231dc8f205d88ac000000000100000000010273f41f46e0b273513a37afec5e502a0d51be2eabc29f16b13adbe42de7ecd3e24a0000006b483045022100ac0143d05ccba4a5d5b1eca63f14f47538a75e3eb21af7afc693a8ea71ac9caf02206cba4980d5a0fe56cb58c244dbad572fdbb8cef2486fca59610f0f8de0e0cc000121031337f965221cebdfc853887dcb2be2a42b176af64e94242c3acd7b19fb6de922ffffffff0cf4422b47ceb02af122483e7362426d22bf67dfd81e41ee95555aae492fdba00000000000ffffffff02f8f30400000000001600141e0d5575e66d6f5f9797101daa11aa5ee9ba5e0357f90300000000001976a9143bf5d8ae2c1444ff42d426dd353a7d69498ecaee88ac0002473044022069b213e09439b549d37e97fc8edd59c3548d0db47085ed11d22086d272bb7d7e02204976b7d4a0001c106f1d97cca9195c1ca540896ea4d76fb0788fadda1dfc66c2012103077f609e1d3645b1fd0f55604be1346b8eb8e47cae052ff4fce3bbf9aca1667800000000010000000001010eff0f98307cdf0199ec9f600b16c1e22c48f8b92e3ac88b3fd8ea21c788887b01000000232200209cc6c05ceeca7822be85a21892fbb3425fdc155e72113ec1152e87327b49655fffffffff04706f0200000000001976a9145948869499b7a1ded47169d7d7e87ce386c520a888ac605b03000000000017a914c84c85cb9c0ecc9761f830843db08ae3dccc1fc087977b79000000000017a914094edc2db0bfc156ff482b09d9ee04e4aecf854c8738c101000000000017a91444c9b9d14f118931c6df759527020584ef070f9487040047304402202afa24eea4d2494607eaa83a7779b7b92fc69e8de464f4cb66a0ba2ec0b016ef02202896a5b3cf90516acdc15e1bdb423649b50c1c9003ed438e0f9bd81395e052890147304402202c9ca94f54a102bd8b9407b989fc209c33e971c5123f3ed02bdd05b5e2c7a0d0022068600db6b5b09fe71ded9362a1138f57d33c8b03de3f7096955810263d9f4a7301695221030cafe1eabd049f319b2b244287c0a3ab576122d02f78c926507135588c80b511210373aaad6a9fa9f2f475e8872c79a912219fb88382fa66bdec826c465d6235b90621025b94ed6f4f4f786d784db7ebe5aecd888932a06974ea57be2fe494b1a44b335a53ae000000000100000000010185005b6217e06629e1a6c8d849919587c626368455d4276324eafb963991364e0000000023220020d83a80a331943ce2ff466de9659617a7a37db540ca11004d39e7f1cf267d6415ffffffff04f06df6000000000017a914659c7c094b869a021879369b89f7b08c6698f73d87fb6850020000000017a914137a9186a1c67047fc6b851766c04015b3bab8d08770110100000000001976a9140a21366bda422e36b8b31fd502f0b4bc3847285e88acd09b88010000000017a914a461071457950d00887c9ae91c7d1352ae7b1d958704004730440220593b76d10ab1144a426abc7e21f6b488efada535c295212a0ac85ed552066cf3022077c9c534d35d76e6d29aa22c52cdc54524e279da9959376c8b727232f31f0f49014730440220589ef629378f2b017b8435c69d50bfb8fb75d2760ac8b1c21da1b0b2b25e620c02206f4aaaaf547a60430f8cee4c967304ebcf7345080abaaa19d5441faa1f2502a10169522103dc9c353d1177f92b93521dd57d66617a667b8f67e8f89dae282e0c650cb919d421024d10382771648c8d423d9307e1ca783813535563192eb26131fe49b5f7037fe021039ef3a7fcb2ed205fe3823dd6883e19ea41aa6cf7197a28b0d3882cd8a630c9eb53ae000000000100000000010150061bd1ee6894098a266244584c304939c3076b3a776a0101792ed77c0505de0000000000ffffffff0200141e000000000016001408fbae5b982050ff18ba09dbcf7f1d2df8e1335ca9b002000000000017a91489f292aeffa39ee561b12bb4f0fce0296c3165bd8702483045022100ae47f6364e702249be4ebbe7551d09b0bfce5a3776a33bd9773098e210068dba0220548259a3af23e74cd1b2ec1fcd195cb8b63074150a3bd2c5436e75c90420aa550121023fe803cafa46b6adf147e8c448a3f69f55bb1de5a8a539cdc67537f0f599fbe40000000001000000000109b4e33a7174cd5709536c848e6794d67193ad4124af283396fad9f7750ea1130500000000232200209b351a0dbaa37cd0dd378440a841b92b25c1c1bddbc5f09aebbfe86f67b4a06bffffffffe8ea3eb15510090c61aa0731843b5f9f41f9d2fc05ae665e171baf7279e71d3700000000232200204967096f1268c42a5872fd11dbb7ad78d484beee616ec3a550e4c45a9563af2effffffff7a04123dd9193e86e3e11406178b3083c2d39a56f19a93bc01ed49831083ab510100000023220020200bfcc885fcb75e8735634d0368142573787ad20561990e2c77de5335e9dd97ffffffff2e3a9de44906509e6f787bcf84e040f5a7be36e222652b16d484d0d4937a815600000000232200203e45a571bb765022ed7566e4bed5778af9d2279c9e5fce1f6835477b71291eceffffffffc0c65978efd46fe2c0285a5a908173757bdfb6961127a1365030b0612b2b205e000000002322002036e0fcbfbdb3eee1833ee67fb997d82fe4680cebb4620a200f0fbbb04d4895b9ffffffffd58f1c88ea1b235e4185793d4a4c00300ef9e53534b979859d199e83c92cb27c0000000023220020b43aebe3f45b17a1eed26e2e4eecfe00ae6d8b6623ec31043db1b9330a65040ffffffffff00f8f83f2697c6fb535a46aa94456d21d3e8898f3ff3d00071a5690920af28b0000000023220020af54f0572a64a498d67e2ba1fcac3776d5d7e84a2755a0e530a7fb5bdc899133ffffffff6e7c7c2398b6ea016dd34706ea543682661e770328886d8f519630d04d170c9c0c00000023220020a383437a2da1cce6c4fcc111435a3cc01df405c9d9b120389b20c3a93405d5faffffffffed848ce06321ae0e97fe06715044db0bc23770df6217205bf0215bd7a9f09ae600000000fc00473044022021c4621ffe8f81811e2c2b115e3f4adbbfd1bf070fb0cb81bd3c0e2c36b5984402205ff711395eafb1fb26cadd9b93303c9c8ad9292ba0286ad8c0e448bf669085590147304402205d18bb04618b2860d967f16aa1f6417dd48cca8518a673ef99b4cebb3cf2edb4022032ece68ae8a623a31af4459c7e87c177447e749ffb3b1212b3639f926429b3f9014c69522102c462329aac15fdb8188242ac3fb69e79fbc7423933f3277490b9f88471479f7721026504ac9ade1466e7580ef1451bfbe21f83c8d1b82b715462ad2d49422d4e08112102cefd09b040c1abbb1cd9049985063fcdacae7b0b14576cc6af005535668f372553aeffffffff05d35c0000000000001976a9140c78482318febd6308ad262f978aa9b5be3155e688ac54f01700000000001976a914d9c969dfe624ca93554e2e020f4833db9d1b062288ac253f1f00000000001600147879c46dd1529947ff8be21a24f359bf5bc5bc4534b92100000000001976a914784c6b6924ea78396be44665ebdbea41fa0df7ad88ac8d946500000000001976a914d05d3c01d9963d5efc92fd8441c0cc6265acf00d88ac040047304402205159a5037fa17382563e213ad526d839de278ba67bfb4bf9ad89637a612a7ef302205b84b9f43425dd67ddc2fe66b6c0a8449694e1bf1d429dbb7a6924589700adbd01473044022015c8285d3638e58167d48363aa2c70f9b74e281a82fbb4fbb8d58412cc1ada3c022029fcd075728ca9c1c13d4712f0cba38cb16927a8bd8a6800c20ec639f3432caf01695221028dd660c0f2c4e704d389d61dcb95bf8c287b76b2604ca712bdd5f2a6701c29fe210332091d800577392922d5ffd66ec8818cbf89f11fa521c3951fda8f735ef35dfb21029ec05ca59a695c2affc803d52d491cb9a58e25f6e96de116f21fa76dd75acca753ae040048304502210084ee76a8fcbca98e29a904674a8ec2d86189512b488ee040b21d7adf2fd2941502200cdf4b5660ff6e7e8c2fd79c440498a11333f377fcf857e80ab749ab9fd065ff0147304402203cc47a339966c80506ae114e826da643e0d763815c597f17ce4438be0fb3f53e02205cdcf44e160d9be8bc801f996f3a83d0c066d1b92b0f36701b39ff75e4ce412b01695221028751c9c5159da76ea72918080e922e389c0792113e0b966f62f9c6fa17bd670e2103ea7a9217e96a94e0730dbcf95786c636804bca7d225bdbbe462928bba6f883992102f40ed502d0c7bb7bab14c63d03eb5d11aaeb8f05b1445cf832d837ddef0f07e953ae04004730440220461ad1b069398e80b5100a265490eebd4d849aba3d7643a8335171f4342f161302204fbcd28a398cb12b89915e8d63ba0ac30a29099879c1a039f9e4209b02ae61890147304402204ebfeb986339d7eaae23ba21b490793fd92b4b3effa2f58521858a0e633e1d1702203bb52eeb01f1fe6842330f7b3e3c86e97ee6b66152e4c665b45d6aac30d62e0d016952210254055e16afddfea2eeb5efae61e13479cbfda6a52adabbe57c694d271c539a672102df699aca3671c3c3a32b40f6ebaeb87e8395dc4024a2159952881f022960a1ac2103864a303319d9909da3a4501cbf8f127d77797a6ca251a36dba0e3985b94dca7553ae0400483045022100d334179777368b3b4b188f0bf4d78f8a2f3453b87b66d42c6e0ec370469673e002201ea9484eac02fe2fa6fb457d39455863e51dd8d42f340205900751dac5a4801c01473044022010b4b4a564eab9b97e3967b0fae2214bd6c0bd7cbe1b5c400a4624579055580f02207759af37a9960eee260b4b57280c65855cb20ea0f12828dbca6fdcdc85fde9bc01695221037b0dbf71cf858629299d8183382042b8a47cf959dc26039eff358ba5dc6828af2103e04a8b9a8aa4d3dd2a7ffab9348d9cf7561b335f4a75caa722ba28c7285d393e2102cef1e935e349df5b87db6bf490d263df09f46fe743445deb0d62302e541b0f3b53ae04004830450221008ad25a337ea59509d670113fa8aca7299bdfa1ac189d4e529a4851550b3ff81f02203d562a3cea7156973a8138159e07e5014f883a3cfcc5ce38e68aead396cf9d63014730440220363dc28bf7ca3ea905bffefb689ab602728d185eb915b5b232a46b127c8bb0b602203d14dd55c6d80bab2cce6db13caad6b7796a3871b7be6c4ceaee573d47d113440169522103812974706972a2024f54752062981f04d8651ce3cdf24aeab02517b6473ae01221020914a80ac7c923431bd50a7a08155a86b67b5120e80c23f89e357f23f4055e742102b7504e12f181eb0dfad37120a6a1ccaed76599d3460b3ae988940f4a055cd88153ae0400483045022100a52f5045676ff5064bba7b06f21a7c506c158e832797d20318047fd497ed72a702207c4e7a5e12e91981488a372fa3325b38f693de86eee87fd0d3aaa183ec63ea4d01473044022077c954c1e8e3259b820d44679792d7f54fa1d979553f8cfbda61ba6ebfcf10fa02205d5c83848c5acd0967113e912c51f4ddf8a1402ed50030f1c51152233d643b9d0169522103ffd1fe0d0f85c9a5943f7d55264c9d032cf17acb27510d36bff8342b7cd7a8ab210318c13fa4f409f6aff604c5f0e8a84c71ba131ccfa0a2b6c6afdb2f3a01b4651921024bc8335f31d4762ae1f62fcf6f3151f5984b264d9ea4882195e0f093ccf05e3f53ae0400483045022100e6cb052a17d5ce8310d82f904734b31479e271f548a2b549889cc80f3f50212602207acf1ebad8f6a71887ccc6d877ee98fc137baadbad3aac6e702c8619bb4c199f01473044022009941f302fb9960f72edb4a30b7c6700208895ede8e52eee5117fb87738365de022045b49490d8c6a2f7f1327d64ecae334ac7e3409bb05be529ee2023e3e64f09800169522102db0e76164f08b340428bcf954c7b08a3e4f4606b989a12d39ecc1810d02fff062102a8a8a4bfe8a289dca53036906c7862b81ea63dd942b3552376f5322a7197965d21034b8814bc9a99bd4fb8b96d5cb97d2e50dbaff2911a6dc86117635bfcbceb813c53ae0400483045022100fbe610edafe8583efb5d55e1e76a4df2627f5e7e89a456ff9e2524d471bb73c302203e2d083cfc88a6b7736a54c0ee348ad5bf400e8f6c128056beb13c9167f17ed50147304402203e4b3d685ffc14612a235a1ace437eb698df1b9d677faeee14d3dfad7ac265fe02202bf458c8746f0d1daa4aea3a22a9e78c708c7abde540a0233d4666ef69bfe75f01695221038364510832967d6df06db292dc780a552a372cd8b4e200b6e1ce12ce71c837022103441edcffe58b1ac25156c1e71c7d47af59e4dc3af7522bef1df305528a2f5d50210349d771fce35fc962ac6d050fc85464936c9beff3c71ef46b01e449a717223f8753ae0047a00a0001000000000101552873bde52391cf1893802e6b1221ec05ddfb715467a8890a5161f666e7799800000000232200209807d96a45153145fae3f713a82fb1b8986d876951e9e8fe9f552e86d8db35d7ffffffff02941100000000000017a914c982030cf0b7d3307630a5c3326e4d037283d813871c9b00020000000017a914a1cdf97093f8911dbdf016205cfe1e032b14bfdf870400483045022100c9057cecda06cdaf921a7e64a479043247aa518e9b08a895736e7c8abff4466002205e71e0e7a20fc1d9001be6833b6023d7e6381434a00b70afb76d1b6fdf2c92ca01473044022021835367b874fdfe0dc8f89aa550a39514af082dba9ef068d537ad8ec271ab120220482013ea64e9e136680d4f2ab0ab219bf6b44650468f4f21c7c93a42a0001bed0169522103e536ba13ea8128603eeaa2f4b667e1befeb8dd4f04c04c0eeec7cc95b8b29ab22103a707c83e29ef69ae8c6ff4e499ead14cccd1738585de2961bb246c6deb140f592103e7a069c004a3718cd7d0891419fa9f9156b40ad49183d5e269f262d4fbe4236e53ae000000000100000000010151a871b00ff221dff46f9590940b4ea2114425730d3871f18ae036088a54b2c70400000023220020246c196064d0ddda955d6baa6aab45a09265242517cf11dc7a2a341ab0a5dd9fffffffff02b00a27000000000017a914f2196ff5da9a9f2de365b4aaa8013380ee610de18780e7bd020000000017a9149d1e59c0490deadaf3495f58494db96b4930008687040047304402203c5e72ce2b616d3a383f5c97b94c26cb2f2ed051ada126d276a1911c1685cfe402201b3e7aa36297af77d1d65c6e7c3929bffff7e070700437d42bc94e099cf7085b01473044022021d03be2baa2fa673bb54c92c9739a5e2330373b41f5c5648eaddc13a0be8d0b02207ac88a81a0a548f332fe1b6d9bc04e11b02a70620e1373b84a2d7e50531bd87401695221035a04cea4c13994d0ca323a9db2045b9287ebc5da6446cb19c803caf3e1636dc921028d4c6631ceab1ca51a8729142ceeccc45aacd41b968097f183580b3616b302912102e367da4c8e71e1afbad7b170b81e8c72ed9e232c22b93c8b06000e12b562e34353ae000000000100000000010134cb38d00f7105e3d589911f3f299507cccf6ec10dec953c2b13dcc6c47cf5950000000023220020bbeb9dd65d1a4f1c48d472fd15e2a6109f3b3a361d86ff79beab73d70497c92affffffff02904106000000000017a914161261e9447615efc2312132886528f0b98fb9ad8776be19000000000017a914b31e176d6536b2f474602308be6e4ccc1e408360870400483045022100a4a20ea72088aebd51a0bb2dc6f125a3ee34043157d7ff373949c5043279d69b0220240bbcc44880e741f87358ca72d8ca7a74746d51c58e3c03720304e8d135ac61014730440220209d88b84ae430c33e4da4db79e6d5f5ec3d065d3381cc1d18169a690003a6aa02201c6e58a8c7af2302aec2c69da1423426ca7b2fe5675f55cc1db989b005c806430169522103f1e33f309f7095835941b1d83fa3b8f3081a3cf36548e06b87ec627be11c5cc02103b8ea32eae82c3366901d2ecd03949934b0fc6644b1f31be8c8d665473a04f13b2103c2ad7761b96a5c390746e388a6480138ebb90ccdc8acfa7e35264c441536321253ae0000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb247604230100000023220020d4f481035fc1acd7359027a013aa92006cbeb010b87a3b021ba8941d7cc0093bffffffff02786900000000000017a914879c6a1213771a9f7479d5422840e6cf9117e5578738cab1000000000017a914133eb9a71268210a6a21f4827db9bae2678a1a03870400483045022100ec68998c93d553789278e28cf55d2758054ff455bbefae0a2c6ff66d184cd8cf0220111c24385bbc6636650cc6b1f9da393c3ee5f954bbe2a2d4a40995ad71000f2301473044022021cdb7c7b854cc96398371e8d7a3fb1d1ff3f4e3d4c3da107b9b365c7693928802200ded1ffd76e305374c912d0d017e32112e711f6cb3314a657bdab5701713124c01695221022c4006b4e2de1fd3a7ed161a8e8528afc519fb04152210e3cb4e01c1de0959162103a1d8dcccffe49db36260249e37f4e20623bc5bdce4219c9fe25115ce2b5f2f532102324487180cad71cc0a138d87516f7c0f9e72fed808bac710625ba6ba122cd81f53ae000000000100000000010157e580eeaea2ab8adbafb48ceebf4cf0cff2f403f09024a6ea0f1a07042513f6020000002322002005011ca05096d5485369b11ee01e70e8a2672294da8db3269f61d0a1745a6d15ffffffff02f21e9d000000000017a9144b1d64cc5d928d1ab95bd920db07f341ac77b1d187a0b612000000000017a914e190d6297e4f28cc301a37f055b14ab1432274ec870400483045022100f0cbd3b8df89124651b6bfc1b0972793a67c507de4634ec3d7bfae70cfd41be402205a0f69c096ccd6eae220c99f005f79b4e9517c8d463c05eca6e358e65dc08286014730440220583d899d3c38a18a3e2cf627943b421adb9093907cad42d513210e5b059b3427022053b03be52b57a64c7f66f52755d9ebb0aad39bf5824dab6cb7fef688a536593c0169522103386344cbb6040e6e417b60d8108a03fef2eca96aaadadfb15158c50d62dccede2102f417fc2043915a9bb4be595b79516a2e086e104571e2805e5585341d6c99d25421027154162fc8837b21772b7200ef7bbcc859fb8d78a576dc991df228b71167778753ae0000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb2476042302000000232200201901234fe621b868f3ec44a9b28e3712543c46f3bf041bfd3681d0208b7239a0ffffffff02b000f9000000000017a91494298e0eeac83ec3432d68881516f261b4c6d4278720120a000000000017a914602f9d4d6ff6ec8186d5fe39cb82962fb62c350b870400483045022100f55fedcbb0ba3a6d730f2af49eac39d2e5869ed9e131a6f5951c4112d2df2a45022056e054183a4aaecb0c777f45ae844cfe3b21293d419ffb88d13cae6e01e00bc20147304402202df0d57db249be7e758ee84eb16f72e9db2b623ce21a0b1e0c28c991954222070220468409fa322de37868d09ef58d24d199aa828269a885e5beb10abd300656f7e0016952210205b54600c1ef742fe47e9df98dd2cb0d06c8ccd97d15a6b49dae2e7d1bab0f1c2103b805287e5d01ec1a81e1a20140dff6aea35d643f86d1bb32ad5b3a169c896dce2102733acf49cbff93cc785699655db6a85d9aae0589d1b8931be1452e07fccc871a53ae00000000010000000001015c2a24c159c33727ab7aeb70a240b76bc8a935aed306de4a8374759ae18b22ab01000000232200209a69e7a9ceceeff94f668182f89e803818b0d32a20bcbf37ed55615f57d44159ffffffff02a00a05000000000017a914ec8baeed346ab78e1f744e89af9c4cf61d1c746d87f095c0000000000017a9149996a32d81f5c980ff87f0a2854679c7480f8820870400483045022100ce748ee79f611c36a920d398f1f269d6835cb4603d61a621f840d82a8be2874f02206b34c2cc795ccc6c97d68f4ad2e7e086d12b77f579c886305cf8db0aa2a87c2f014730440220678246e1c37e0aac9f29088e2cd8fce5acb3b466c6c3475e7f320a08856ba33902203d4e350166d8073a66765d9618a0acf63ffc2792b63260c14fa65e3e09fe5f200169522102340e28b3a485e9583a5325e6f82bd2d457fb74f3a447456fd297917140185a7721033bb26dda61a05d27d86cb4fcd29c455a8e7aaa86fccef7f16763a32f9bb454932103705aa6a939a3415a79c590f9f2000acc0f788dde72ca30e399ea47f16012045353ae00000000010000000001035fb10c62dfb932486ab81c979167a03e5cff6a28f0069b62c2624366ed1238e9460000006b483045022100c29088b5ba75888e0af3ca8eea59aa26affad26484a06fa597d2a2b9d73428ff0220132fa96218da43b2529284dbdeaa07b4686484372f4c49e69efa6240383c53d10121026443ff8300c361cb8b9f0dbb67c61d13ef35d014b5ec5706e61a171fd6045b8dffffffffece5482e699ae1a59539ddc894d33ef43fd100ba5d8c1a7be962242775a765bb0100000000ffffffff2d13ded158001ce7c0e7ac4d0f995ac621cbfcbbc559c03bd451618df44562cb010000006a47304402204ca96d3d87f5ee757fcfec7eddda3630f09539dc1aab64b0deca1ddc82f992c9022009c3ab637f05908643f953170fd055d01c34729e07fa44b2c763daa40aeaed23012103c43b6b1a70e02f71f9a0413373e0c85ffa90d53c00d09e25e8fd6d2ba8dac08cffffffff023fa221000000000017a9143a2081f827b944613c1b8b129a4617c9dfc1dd248720e126000000000016001438c01ea700449b757c4199997846a64869390e450002483045022100e56ca33a928b360c27b599ce890232bfeab7b5edac84eab332bf08a33f99381902206a6561ad64da97302f8e2e838ad991312ab85e8c6500effde921515fddb1f8e3012103cca2b419cddbfb80a33156ca5a120dc5772472a3755bd1cc2574dd3b09ed951e000000000001000000000102d191d34a6fa841156920f8c3f71c06b56bdd07710cb51165363856dc8436bf1f0100000000ffffffff44a44b74e7c0c73d956d0c45c82c7052ebacee99aac33743ad6029c48f258af34b0000006a473044022059dfb10ee7281c7713785389e77f9973e287b7da00f460e2cf90eeb19e3cefcb02203a0216181ff2a38d844d3c16dd0899bdcd3097d22b2b8c889ace9567f14c7e400121031b1d543fae1b6ca9139534867cc3034f17bf1ff2f753db5ad0c136bf257e6918ffffffff02e87a32000000000017a9147ca3ac3300b6737173e2ce68e4b949ab9d8cc39f87d04c01000000000016001498a45acdf401734137ff773df2ff940467a9cd310247304402201369e8a56548c56873651be635145700dc6e7400335eb8e8e1269c752ca21d8b0220439de143171e139d7849323af494e7ae69f3ff9a734d0a613521ab1e1408f855012103909872d0c13defeec04ecf4361d0c6097b912343ba0f100531b503bb036c2325000000000002000000000106f66f7518b9f3f1fa7d09e4d02f9218b6d547c1ad1d07a4d37a2d2476934435ee01000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db27000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffffb4df74bbb59b9029b91765eb3dd4e7330124db06d6dbb027ad3408d27f87e4d301000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff460ffcd7b37628ca2f0e290e87f912f52243e613dcd03b201dd50fab41c5deb801000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff4fee593aa27c4d64fdf0ea81bbb30937ea736be90d4d92876dd7ac4809a4ebbb00000000171600147378cf392f7a3cf8076596f4a55a283b96046a33fdffffff908fd81c6a580d6ad11c52a38c6c39acf43eb283e01d169bfab882db019fe13a01000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff01d4ba93000000000017a9147ef5c40d530ffeff15a7a94712d8c02003bfd7c58702473044022055f5756bc98112d092ede701a6f76b28dae075e2982b4309457f5056402c8604022061585742eef8adac9c40a4acbc9622a522d0fe5f87e6b3b3f4726a0a123697fc01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc7357611024730440220343f9a1e441d0e8662f39b2c9096cfbfea03c7b8bfd285e3d205cbf1cc1ca55e02201d2fdd4951b7b245a382bc6f19aece45e08b1530c2eca0064bb55f729ee016f501210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc73576110247304402207f47aedf79963e003935f1d35d9183868f51e26ee52f540ff5a297a8adcc0eaa02203cc9f03fcdea24fa0f9a05c0d61584f2c47d915a4c3b18b59595cd0d331c9c2c01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc73576110247304402200a3bdabba1ff5f1b0e87dd40f87c9abca77fc1a1f0d2ef37a82be6203c71ae2402203b5488929f9ec3cf0d129e50fa09f00dae2b46867d3a1b134e255fea9cc919ec01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc73576110247304402203033e4bc7158c8ae712f22b44b4d6033c27542d24007af52ecc312ff5d59c9ac022014cd1823414d48811bd68946994c75159659e5bda2b76a649c5f984b648d3b6f012103574ad16605907302a222e1c8bd9ae97b9095035f104ed6472372c349009cfcea02473044022049e6c695398deb58586f2d597e44bd0fa953331bdd6f5ba55d1c96844890f2f8022073d983167a8659795d2a723147d7c182b7764b6024d99faf02c9503ba01357fa01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc735761148a00a000100000000010a621c24e09bdeec55435c56c43cb9bab41645b28fd176400b1cb2030ab06d08160d00000000ffffffff8b606b0c69b1093752c8c786f88531a4238dbcbb8a98cd167016e4d537a3f2a81200000000ffffffff62984b9507eca54d2f1a922c5f7bf6f6e642b39dc4aace8f930bdff53118e52a1700000000ffffffffd76e15744080a70554e61c9f1925eaeaa6d590c1d5147e4ac8ad8ea21aaf94d90e00000000ffffffff44da7dda90030924833a14ffbfe4a90ef25508309ff944e3ad0285949498158d1900000000ffffffff80caa697be0c785d3b3c494ca934fdae5fa0a1ca68850ccce76e36229f0dad2e0100000000ffffffff6056c30947cafc8ae755f96487545f1cd11cb3f4ba7bb4b518d24a07991011b20b00000000ffffffff27cc7f1d0ec27d24a3d8998e4042ff65ebb2128254a9ed62f355f0b8bb74fcc30d00000000ffffffffdc56050240aa455461c15b2bca9de184b1d213383ba971b4e9ac9bb5c30888e20100000000ffffffff3d497fffaae79391934ba61b6ec4212f8712c92f406479bfc6b8291fc5d3242a8d00000000ffffffff01d94528000000000017a914b5ffe7164008b6e3e9888b0d1d350c64f57a36fc87024730440220549e75db4d9156de9a00a9efe01f64efd1bc7857064febf84229bb308a661be80220605ce4675ff3d276ac1f2dfd443062984079c06d8767dc4d99cd6a3e50b2e10b012103a8edad77ed96dba5410eba16ce54e499ae018a98a34ef22ffb1d067373a74e6a02483045022100ae8ba2ed7b7604038c62beffa0c146e3e1fe4739633c1b3e4b0f70c2f18a64df022017f9f3cedc7f91dde4246d17a87c55dd0bb739109ee73b89933e668f738ba2fe012103d314f47dd841656e1b58a5e1eec611a51af922961798cba6b5aa58721a99d69102483045022100e49ad0e55e8b151b40b374e4f8b7e82ec8c7c1747bb5e3f96afd82cb1232488602203f9a49af08ea6ea35e463308e92bd0e887cd01b626072f48d1f00c42bd2fd0940121022155cfea8dba45c6f8ce3ea2edebc082b02911c31ad3805e65153fda7b276df80247304402204e579b8577987e9b0e33aec75d307cdfaa6e327c82e72351a0bd3c249dc305e0022032c57b327def7157113a033a9a5b047a1c6f41ebec95fefabee5d2f1b55c116a012102ffa8df76b539219e3abda70dcaec5368b67eba05551ed0bb8c3d009ba636e7ed0247304402207024b6207e4debf333b48a21ccbe1f9f9cebf94040d341d8ebaaca2d7ed2a3e90220573e20f20dcc529288a847faf4f800afb97fb3c052a6aacc03593ef133af80f7012102d812af48490e29b5c4d5aad43e6a2c4f0fb15e977bba98c727b218b1db3851a302483045022100a42259e21dd2d977a7dd66c7b40f7fa83567d0e59981ad21ff2feed2f26869f802207c408fc54f64c74860ef89f5099ead4f907b0afc1c59251846895f991945d4b5012102b367672955fd986fde8b1f45e5b4a8d990a74c911b3a302d6eba7b34c24927f102483045022100c4483648ea3563831bd636fd3f53a67974bf6a7ae4a2c42cf94c9fdb2c8aeff302206e7030b62cf37d4040e4b84bc7b902765563b8b934aea1a1c04d98e4cd9af7bd012103053e739d3dc78f1229dd508f995cfa6637ec1493a62b8067a08c2bc1c3597a4102483045022100fb67448e9810f0c29f371187c1cc8e701c9de3b2c3261d3b360ab9cb7e94e4f702204a75eb88de81e54402d9e85bd23af722cf5af9e83632bd734ee0ffebc5aa91700121025e3cd53219f0b8dc0262df3d1d35206cb5afbb9e0d26331b56a8eb8cf59522f80247304402202ccc45e5e18535725da017d3b5ce5fc36f9c1ab7116e683a8981ca728c68887a022040d29609d8264d2f294d7d49c58f62ea2cbce4e977216ea6ed7f5bbea8f227ac012103a16acd19230963e78b434cf7d6f0086c358077f2bf2b2947f66a298d68ae4355024830450221008ee5d796611e2fce46e772278d6bbaa8212ee4a70e449a539211ac170e984fed022022f51e94e2ef672427006572c2da4b68574a5c8bf071c1b5f089c510f61db8e4012102abfe0e8b9de12fb4584fc2e01bcbd22b1a3beabc683e75ac845b9a89b8dbbe98000000000100000001a2a0ec23b237544e3a8977523d133403f0511cf9fa58703100cbf1f50c9f12b0000000006a47304402202847abe640e604dcb6960b9bb8b05ba3f749b9b6971b893b201cfa96129cdb2902204ba629e2f2e6bd744097284e7a7d43d6bdcc9edf69f258fc4618523d0d659df2012103f3f44c9e80e2cedc1a2909631a3adea8866ee32187f74d0912387359b0ff36a2ffffffff02cad81600000000001976a914a520c86a08366941cd90d22e11ac1c7eefa2db3788ac204969000000000017a914d9dfb5a2c34941e6674635947c788e7a9983f45d8700000000010000000001029cf5bdbcf550a388f531d3dd3ae58ec99eca93926f5e64db4de69d282f1a20340000000000ffffffff43ff55101f63aff9871865b6a72f02720e0d37d6ba75373967bcc9e25cc0ba49000000006b483045022100a841c6da219e6d093967528174abc4f6580b4e3f42c9cdc066116f883c004f9102203834a9b5dd47511e137182e2b70776d543b2a955cd2f3f44edf791337d2c1e62012102ccd7a8da76a4b24301770e285aeeb4af4e0c61fe6e85286e5586a2551dcb230effffffff02495a1400000000001976a9143f3868e2ba43586efc2539e26eb94381c9ebe48688acc896000000000000160014f3e4c9d9ab6d44460c5ab6e1927cefe51c3d9d7102473044022019d785548d61cb4bc5e9a209bd76c02ee951a75fe8af5248d536d012b16f654602207f1f3b795654391749bd1e572460f98d453fd28f1a9d57d18eade751e4f5a9150121020458b71da716415bc16771762150c37ab89b69c9aa2346040aed0919243a4a5500000000000100000000010315e1c957afb35a38aabaa4fd652a044dd098dd5f5b18600ae273d8e99d03688a000000001716001430ece263120bfc0af4f232fa388ce55a750e8d95ffffffff3255c2227b4ba5b5787bedee1cd4db43393d5c1a07b3209ad062d27d851afeb6000000001716001430ece263120bfc0af4f232fa388ce55a750e8d95ffffffffa34444453dfc65691e25e77c0862f640be007e1d7fb2c76bf522d7c5fb6e61bc000000001716001430ece263120bfc0af4f232fa388ce55a750e8d95ffffffff02d59b00000000000017a9144e3b7006e93d6a8d8df97111932fa01c3fa2c70387406c08000000000017a914cf5076d7e377b263cedb4f95e59a537fbd64a7ac8702483045022100c4a31fefe151fdbed7ac3b101830b2269a2c0fb636dff803650f04ecaea408020220667aa2dc22f386156088404bdd14d5a057b1c5e3ac9d6e9de14e30d56e397702012102564bf3d20eef3f0bd9ba26d79df6baa4d28b7595b75b155ab848bb471a2d379c0247304402201ee35dfc0064e44d973b3b3ec786793459b4580523e150af2478630aaf51fd9a02202cb51e52fb0653c854fdb74eaf910faff3d6d3441af83f5cd06d2d4b9254eba3012102564bf3d20eef3f0bd9ba26d79df6baa4d28b7595b75b155ab848bb471a2d379c0248304502210084ae040bb87354b1a746f99d46ce4b2494c88e8b567a4b332258d1c8b7d4df2902202205d94975a2556c8ac0623f5fb59ed414c431ada3ab17ad39bf4d1b658d33f0012102564bf3d20eef3f0bd9ba26d79df6baa4d28b7595b75b155ab848bb471a2d379c00000000020000000001029360e894d4961cb3493e93c7557d38c538f309c0e060aa74d0aa8f2041332ccf030000001716001440c39b5f020dc4eb1514d21e6d4267cb4d599ec2fdffffff6f541fa348bbc546bc9d602c9842568e89654c5c271a62ec39f61b22e87941ee5800000017160014ff81e73782ccdd7ee6fd89097a909206e789830afdffffff01d62e0100000000001600140dc14bdad4c548ca37f1e15b1069c00f7eaa24f802473044022057a0b6a158f8611fd43c2c97e1113ecf7c0fa77d6576351cd0cc3d5383b249a50220740f10e11dfc54a388d2074d03f521582e0e51ccf5d7f6be5bc10e5d8cbc1a230121029235be35951e0f43ef4c72d074520f00474002d74550d121cb7b848c9dc1bf490247304402207895299395b96a17d3ef65a563a2be2d187dc89cf546d78427c35363587e6f4e02204017ae0b6b91a7440ea0a960f9f3f7909573d5f1f7346383916a85b822bf6c3a01210280186313c42eda9496a3865a5b11149e91961b3a9e686338e6f5933637ba8da149a00a000100000001634f54bc97ccd647ad4a76899b80cc2f163a5afac87065f35d8986eb3492c8f60f0000006b4830450221008ee2462fc71f9dde2f15d0d5203fc1239a6e40136eef6a7a8180f388fdb178780220389a64a41feabb025da2dd332fdd4ffda10951d26b471930fe85b17574e898550121034775b17bd883fe22ccaab1ffd85b99f379599d7b5f948e93d8a8fdf847e1168fffffffff02e4ab050000000000160014445ecb8a4379f162978ee85245ad04fc9dd912896aae0100000000001976a9147169b2bc9712a6df724e0d5bfee312fbeec6389888ac000000000100000000010183f2b2969da8005a0f7572e013e7392f42ff580e12b9bbd56bb3ad4f4a66e46d010000001716001457bebe9a6ac47a890549974f2202d793d942a6f1ffffffff0230510600000000001600144148661e7ae6cd7e1d58f2d6845c4ac7a0adba2a0b7d6b040000000017a9142023d0f69c89c7316699c12d8cf6e65e16815af18702483045022100a09f0b902ed321d59bef6113643bf737dffcf5948797ae36fd8a02efa1f9db1602205c753cfc8e4057fac81d34adc3a7f8dd9b532137fc44fd14dd1fd83d12623434012102cdf841f5e642e8f79b89dbd9c7b2dc7da887c129383554d90308944cff78df4d000000000100000000010110fb2f5fb18b1f86a065f3c9d08d01f0bad2a91c9191f49ad5f930ac90e4ac5a0100000017160014777eba922f33dda676ce6ffa955e242ea1d9d002ffffffff02583211000000000016001475c2ba370d795889dd542e47e0ebb3567cebfad5c1485a040000000017a914a4b28cd169f84eb11e94b3519821749c329669b98702483045022100cc3672fc825535cc9237395be56582bbc486d5dd8a6c123e35d39a060b749fe302202561247efe5a91b0dc4065e427e94066f8dcb65a5fe1596f62bd1a311b599b00012102586dbb5415a813756685409fe58e247fe2c75e1c89b63d376167416be2c4bc7300000000020000000001017dd5f84b125858e6030146e922537193ddcdd960f04b323e7e59eb51f0156c390000000000ffffffff01502b11000000000017a91413084b723483fcb551aab98802525d1ac3c5ab9a870247304402203f98df36bd82fc75a273e21840ab98cd29089371ff5489606582f03af39e1d1e02200634a2c3f8d3a2ef3cf7bd3cbd8c6d67560509bbf661852c8a51fc7f035c12c20121020564e40b16c74a52ca9130383d88a31a2e79cef37c3045693685658378ba40fa0000000001000000000101aefde7ce3312d05c1e412061ba5d1d38779835a4c598b0f7ac8e4273c64b628a0100000000ffffffff02c8912d0000000000160014323ff8912f2b36d422683c6e9248ed4b6415a801701101000000000017a91418ff21246e351aff68cd9b72dc4e2253b480f4de8702483045022100d920edd0c8370f93889e9f5d7bac9d42c7aa0730887c6fa05b2c12ae19d67bd202206e65c57f426839ac216f52d929bbc4c97ea36dc64b3d3e6ccc2bfc1cc24b4b02012102be9708fd6b302b2f7d4ae0f0e0f0ae9557841b348315dd368d1f1f39e38bbdc5000000000200000000010185e1b0c1182cf30002a9c8563691436fabf017f819c149e66c5219d19d7fb5380100000000fdffffff0280841e000000000017a9143d9b2de3c3b349fd23827bcedd113dae2d130d128724cf0f020000000016001430ff7417d6ef67b0aaff0de333362598720f73c50247304402206d19fe4fb131db8c21d962e23ab6e078d5fac77cd428df52850d3a0212deef15022046ba34b669332d9f76ee82c4106304ce42f5a2ab88825795810706e3a05fcac701210323b92239d5fe003b440c58874de10c55033f251cec0380dd199573b190afb16647a00a00010000000001011a8fb52da33878374a66b33b3685eadf2ecceb2fe051590ac78a492e026637f60000000000ffffffff02900425000000000016001471365d1954703c1f5c1d0564fdb20710bd801011981007000000000017a914a625be8f7d161abaa10357f4dd0f640dd10eed5b8702483045022100b39f760fb5cbbb869fd849b7158c437664ca3d1d851c1dfcb811763085dd37fd0220463efce8370f23ba95772f8b105223658c579db65e63cafbc9fd2e5387e939030121031a522170abd14f28a735dff1a8bb0c12e37fef6ac6a682b275b0c8c7ee1c7b8f0000000001000000000101f75c95d008352e10ced6f745677784067fece512ce46ee14a54407816010f1960000000000ffffffff02c8af00000000000017a914e96bac6b256e3521e83404f7e6b1f46a1f9fad5787a4060000000000001600143354b976e205090d94078c7e3c5142bf988792d802483045022100fe7287f37cef31cc729bbfa4f79a3cb9d3a77c151bb2046c9fc34dbcb302415602206dcb7595d3879a87318b2f500c39d240e1a061804809b44edc6cba3749be3493012103e89c8e68dd87fd4127c6173b6bac929a96255822e74b9da50abc2f95243ac47c00000000010000000001012f5d6878f52c60a011bbe31e71eccc04971f0429969754489084726bef0791c00000000000ffffffff021057750000000000160014232d8c69ca37dd0bd36184e09a8fe522799ee678a08601000000000017a9145e70202677f20326d0fb8051c55ec15402cd38ed8702473044022017e77ceec0041077f93d84de8947b27e9082ef9a5b6ecad1f95c8bf9602439d402206a1ed370d5693dda06505160fa34091c75dbd4caea74cf10d5df8c6d263b3db2012102ddb4a8dfd17ffa3132a706e060225f29b544abed399e767e58b95b70d50563f7000000000100000000010bb62a11b77eebcf7ddf3ce3914f294898f3c36f39e59ed627856225fb69e1bc4e000000002322002029a05e3d05f6514f49bed0439169ae638000599173c6d2330bee32c58cc4e50affffffff589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a6689050000002322002034bf8e751ca3af95c5febafe3b72fc39da22f6fe2ebf0591e8d9462ad7dd0bdcffffffff9d06083bbd1677a5a5d322e84a314852905ef21a0b8643842f521832a9d8a498000000002322002090353785a4975b6443cd6d69e635318d819704e130ea3bae61c53a54b66711caffffffff5352b976f61857f9144c8f50bdcb2a845635cdc03479e13847fc110ba8dadbae0a000000232200209d0f3214f4617020109e3cc6460ffd4c50611df2fc223209331bc5bca48fc011ffffffffb3fb62c142ad262204a7973c05ebe148dcefd0b357d9d87c0dc4ed0b9699fbb90a00000023220020f2e1e6cf7c0a4b229096852844ff060a7396d41c242e326285f4acb00ee0a171ffffffff4efce4a3494194b28baf99ba4d607d30330de835cb5a4a83a2874bb08a3d7ac20000000023220020aa1277a0a8df93787db49522c3fe6375ba3d16ff4850eae76ef4a7bf27c7de07ffffffffc6d49f4517822a56d1180b0089d5b4bdf237cd05e7ea58cc2d281ba4a47906cd000000002322002002a40a7396778713c76f212d005b68b1804dc0d992b029b594ae3a48bd935defffffffff9444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d42e00000023220020d5727d03bdc997c9f02ca2d3afbf69e34c5ad19113506701d9dd43d177176d37ffffffffbb0c6560321f3780bdba879cc573c02137d5ce774c5702f7964b33bd7251d2e20000000023220020852066c6997237aa65452b9605a0411f460f3669f46fe7ca92f0a157f23499b7ffffffffd86da87bb5423beb4649d9e9305e9ed22cee37f7d2e0a70efafa8b39b7cbe7f30000000023220020a2f90b877337cdf4d5d674785588b897c8f215834d2f47ef43791313029c7600ffffffff4ef5b0f30e145c59d42470a888e3edd4f9419b160610bc736863aa2d7332c9f41a00000023220020ab4fa29c45b6fd8fceace087abbc67f95c9c5e84b17c3df02ad86ad4657e6b56ffffffff020e5d0300000000001976a914a1b31c4cb1a4174e2044142a2ec9e08ed75225bd88ac1a182200000000001976a9145cb6a0a5875dc932513b8580b4e62276647e209f88ac0400473044022054172514e728077d3d29b5d878e88769489e0a854ef39b4e17f1edf14fe6ec54022022d940d8a1b9ebf31de1bf8a7b26d52dc3a8f2fae5e1f890c796ad1f24434fe601473044022006a897228bb77e7c43e969b7f70dfb7cfe5758d0157e6f26659a9a146e305e23022038d6a15a104b796d97a3402ab1d3620867d917791fd6e1f25d1c94d0c9ee845d0169522103cdf8af6da131850e5f240a32ac5b119cd8aea930e8118ef61f217ee1e806dcd1210243cbbe97f1ee324a9f1e2c54e60304a249984c55bdb7033cd9384c48e2388fc121036cf438b9f3232dbc7c908595d28c005d56f90a75c16fa7ddb2c9a9ff8d64cdb553ae0400483045022100a7f92879ce1f88992c2f6ce2a8be01b245946932ffc3f5c536f3903e6340df5702204d7c66c76009ec9aaaa7bd521ec0b43d6772ee178d47619f48be17ee4d3e27d8014730440220403c91b47d266f35edbc1d5af443e2abed4514243081bf753545533b40e21e10022076e63564bdadf1ed43fd9fd734667a785729fa5453b14636fcde46b4357a0a540169522103ea4ad7167afc5d5db53cd6e371f311508c9504132333133dd2c3645dca98c08a2103f91f7f3b8d31f86786a139829afaf394bc4a1f09c2fe29ab6f6666df8273a72c21021ac194cc7fec661fa0513a7f6e8214a0e3b2510a0c0c720c5e3238801771651f53ae0400473044022045af1d737c181dfc09eae4d461691655fa1bf7340f483922e03be5a61bd0f2bb022003a7156ead5cef16e3ea9ee9b554fa879eb9902f59ae9c0ea209a56135f0c8010147304402200a296b709705a668d22de89243c29d3a37b860ad069ac012a2d9d90cc93d3ad1022063a3c060eb206269a317a5660042bca937678d0933216d53f9c9077ccdd5792801695221020a140d0555bbca888faf74de0a34e360c397f56d514962360e42fb1f8e2c16422102f15bd694b8407a6da6ab311982d70e559bdd2f9f6930373d3a9814fb854a796e2102adf529c07a80000f500d12a7288f14fa687d83066321fb8e38a6f8e1b13fa32253ae040047304402202165c9898d925ee17bd00a756a8f54aa8b5f59b72fd5a21f3bb7aad15ef218d302207c1fa63fc816a1ef66016f0e24c5976765f68eef608469c61bf9e6ec2d90a3930147304402206c4d4911de9ea32e1f10e2897ec6beaf56646d325aaef305dea6288eee282caf022037471bf48ddfe341aaafc55f5a5fc20b7f850f271172959df811dbdc1a92d9bc0169522103832e15d9ed6591c19ba51e82e8b3946bff57a7564555f59caec452b1352c4c3c2103fad7b4c4518c62010f88632833c8208d35b1eabca8a161b76b35c25205d8e22a21036c9bb5543120ec914e62b88e69060c79226d7cb9b743a9dba6eb94673912845153ae0400483045022100c911a10bf8a8276b5a86e12b1f09913b904cbb13fcbd4137c33b1cc2bf6cb73202204f17b86ccd6309666b133f6291ea34274ee6df97e23b9fd136811df8623e5b660147304402200b61619461e368cc476344d7b3297fa716edd3bcc707e1b630f7b33d1ee2cf8b0220646b272dbc7cc70b43240d554c636a7e0794268d99afd551d8aef2a2a01c5c2c01695221028cc1ff8f0f000a6c666dbab4a93536f159953fd0c69d86a4e170a07f481defae210277fc94425c45446b650fcd5d981ee1292a6717857aa47912298f177d179debec2102673fd8fb4f047c200b3361425dcc0c006578b7c76a5e4dd3aae7288a100ea33553ae0400483045022100a85e54ba64a25bfd6eef2832261e64b1c4fc381f75a41b0999ddf4461945892202204b7a07c86d6b40c08e132891820320130a6fd7a32c4ee01e6330d036e72572600147304402201e37614dfb06af1c6bc035ee1e2ee0584369f17f0007638633ad498573a14e3702206282dbaff4502199121be3189785dec4675a14882b816ea2aa0f81f803e4b2fd0169522102ca98e7a3e757678d603270e320385ec4de801b56d09e533a3efca2d37ac832f42103a1a3be28b69883ccd7674c4c89ec0f4079e9be1ad8b6ebca7ff7c55c56e741832102d7274a40c4ee8518e332be2313d53257c5194f3c10f7c681f7cb9728125fe49353ae0400483045022100956f56733a6b3e2adb3209c412623e23620a3a41d7e96e0699ebc06dddb32ad402203fbb03274938a54eaec6e4c96e64d74522043e5559d7946dad7bdda2d88603d501473044022078b152ba092e3b4962c4078c1b7c9a34b8b9c768a375a277e902e6742ebc338f0220154d7c34b77a564a9c9af23e1d4ad16f3ab11d4dc87a28b4fba9fd329188c4ab0169522102d7c5b10712e64a73d8c6db2dd8b81f098070dadbe25f3bdfb95e3f996dedf8ed21035588cfa1e7d0931267ef5220c5f08a17455aacd0d84a58ac024f3d01757c19be210204df69a1f05effe70296075366e5ce601811e58f7463e53fec9dafdba46342e253ae04004830450221009a0e594b82af1d4f848291a999a18185dd4bd76df001fbf8f7dad0bd8c2f6c2a02203a0cd04ede23a0adc4e9aa0fec56a3d7d76513f90e4efdb79005aa1ddd4426920147304402203a7875b67410c8d1a685ca0bb0586540d4567d38e0dd6323c63ed71a43992f4b022054a3de5dbd715cf1b3594505868210baf872f8c7e7ec1e5322aaaca7648736460169522103164f76fea8e9882564fadd4991eb7bdb620760e418bc86a5db8175cd554543442102013fb36dfd38616f9ed5bc5db8c0d3fdf0d54231fb07d0bfaaded36badd2f08621027911ff6fffd6c09285b5874d52e28df628ec265f4e47ed5409d5e66261fb356653ae040048304502210083da7a15f6c97d53119df2c0a4086c31f6f342be765df37fcc3d99d1ae359d140220207caa5fbec7c71858f9b4eca999fb710f89081c3dc85e797a3fbd3dea990ff501473044022020e0d1c4577944d0c5c9ab887ef3aadce41e34424a68b05a866917f6f9202865022027859116ae36b7071020ed7f12a0f69782d705570727b3d241a8f01b04f3b85601695221030835cd2121e8be2acbd36e5184228afd8a0cbcb3aa550f969b1f5cdcb888833a21023fd0aba8d56c29e944a5fa369590d986ed87d980fa45974c286354995e4a0f81210331a654ac9f9f105aaa60aa07b8b10e5d880e1a28a7a5854de2b141eb2c19f06753ae0400483045022100b2b36894875db279dee54b5bf10c513c1d7b64605e0502790684d839abcd174602204089fce54419bcfd7d1a0ddc11488dd3102570a5dd57ac9f39e14ce4e2ae116a0147304402202ee16df4805f2879eea04ec855de80c4125f2fbfa6f098ad51737225153498220220395a7e90dfa296cdc6b7a5c0bef3135ae53a2b708bfa335068196c38ea0b48b10169522102fc6d2cf4e1a4fd178c1687d3f88534b22e0ec942cb9efb8b6ba9b7065d85d6c72103bb0a2cb5792e678d2e3da015485efc1aafd3f24b12e44e9172e9bd8e3b21b2f82103420dbe4d568fdd07aff092a5f60835c142fc748265d311102bab13805b5b24be53ae040047304402203d5d8d6693bd2a6c3887d58a5a892481c2baf00bc87c8048b996627f452bc2e7022070fdd2405a0f7551ef195e9d7797f474e2e263b02e56ba5ee10b69ad709f8def01473044022007f5975ff3dca485350522417c0eb516130bf3ff6853a15fae3ab86c5688dc330220324e86796a79761159ae460d192ca2fbc73c1d00c6239021629dfc8011d1cf7001695221032f44dbd6cec970553004c8f1a04765ca6f94124429b0bc8651cdd1de87a0669d210245fa92523ea980871adb27ecf17c32a35517727d3d00722c3bbf4f20b1488c9c2102a89382e076f40848e4a24eb858be15211340cf8a10f2880e626efdf662a38b3153ae47a00a0001000000000101de11a0402d463c162615bb070974894b3d265713d9af25af5e582c96a8f0775d2900000000ffffffff48c762110000000000160014d84fea6886d48f514b1e98c45024af2fb43126ef102700000000000017a9140ce9f7126e0d8d060ec49d3756800b68c64d2b4b87ff940100000000001976a91420ed478fa95099e5d6f790307023c9db7a83ce5f88ac293400000000000017a914ea2bafe82ff8890749017ec66dc530452387480b87b9430d000000000017a914824b8a917e2ccb6e21362d064bf2c988178cdc0f8726c61000000000001976a91484fdb0686f95a7b19e7ef1e1bdc66423ac9d944588aca05a3200000000001976a9141c038d128bbe644e141fe629185b8ea3685f82f588ac0cdb02000000000017a9149165510adf4a1a6f4ee8f3c7db6d8997b3a46c2d877e342000000000001976a914c42eeda1922b01afa721686ce8a207e4bf7c717a88ac709400000000000017a9147677efafcffb10a137e18c45678dbe913eac5a0c87e02e00000000000017a91430e09ee095c435b4566e96e8620113b9c173ada68760fa27000000000017a914fdd1b4d0bfa54db06ffcc7658ca6e7837448176287dcae0100000000001976a914ddf9b9db262ddba8b654d1f499f0f36e9aca830988acdb342000000000001976a91484e4b5cb721f284fd3178eb74f8513d4ebca2d3488ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768b500300000000001976a914c5dbac82519a87c2a9656124b1b45ea6d41c535488acb6a6010000000000160014d4ce70cc582282dbe21043adba8e55e70dabeaae07c20600000000001976a914801b320ab5ce0bcd9baff7b876322c10d48fd88b88acf56d04000000000017a91416b8fc46238808871c4cfdf5a227ea6702c3d1b08735bc02000000000017a914fcce1064c532a6df556c3db209c1ae4acb20754c876a680200000000001976a914a0e5d4166489f8b968c8861318511a566b19518e88aca50201000000000017a914d834b49895edce45a81a17aad8a9cc79bca7ba4387148f17000000000017a914a7cc8e3bd8f79aa385fe5fcbf5b849d36fe987ea8719ba070000000000160014ed6bf2c8d65409888859f98f0b831686465063e0db120200000000001600148257dfeb287e6bac2f9333af8b33c39e90c7f734e1340400000000001976a914cd0342ef1010313b499317c06e6b6e42cbbbf8af88ac11494300000000001976a9143542689d0793197b830bad0d2e41aa43b831e1b188ac10270000000000001600147e2250db2da3bf2131877b5191d2bc42269050ca17050100000000001976a91422f459481e0f3f803f0cc388daa2fafad9d51c1b88ac5f672700000000001976a9140d90a265e10aaf89e8dfca9e096b06a8f3482daf88ac5725010000000000160014e3744e835073aa2fcfeb4c6e042fdd6ad73d3e5a7b610100000000001976a914fc734b70abb7e2f21e8c84c923320935cd86c2d088ac45181000000000001976a91451c8fbda33b1596a691d2759592b5da813e1ec2f88ac17203c0100000000160014ee9df3069864e19c378aca4b84cbec2bd8f97bfe60e31600000000001976a9140b753ae21519cd1e40e991995e921346f0d3e40288acd15e00000000000017a914a69e4431f3f1184f502f4bd665827867279d482c879fe61000000000001976a914f7f44a5428911d953b6a511d6f597b71289768ba88ac8ad700000000000017a91444ed2ef1d679d58d7899ffaf5e6efa85b137d41c87b7ae01000000000017a9140b1773e5671ec87df1f3ccdb2f379b9080cb175387252a0000000000001976a91461bb6307f437e291a1dc719edcc97e0eda35728c88ac4028fe0200000000160014f420dd4c71acdcad1112f7cbb9fde162897b85b230230100000000001976a914c741fa3341acb7d31fc174a0937b0878d55eb1ec88aca07a03000000000017a914573cd6f31752d8aaabce59d61b2745713f8904d3873a8100000000000017a914350ffaf2628408aebe9523fe4e7fda2a432b278587815d03000000000017a9141584c7d6d90aba7e351e33093954f8d7154b337187918203000000000017a914eb2592e91f59df8ed4e47f77aee2f1ba28f80c5c87a086010000000000160014114971afd1d8ca6a2cbb9c556891a3142b2f8f79b80501000000000017a9143e9450e3e443f321af4d72b215d340d3c82e10e88797af32000000000017a914bd42fba5caa4469a79a28063b618bf426e76388a8796b100000000000017a9145b9e7bfab3ea0a01f6d05b4bb57e16572c86415f87887100000000000017a914b62eededd2a413110a72d21a2e526e3f917dfaa287a54b040000000000160014a1cea6ab929a2c4e82c4b058a4797acae51f14bb915c00000000000017a91404511d120a868bf453aeabc60dcb535d5b18b41887c4240f00000000001976a914253a6c111a86a5c19082d90e9e52f32b6456133888ac737000000000000017a914839539909a487a7b8eb1ca1fca8f897890335a468701b50000000000001976a9143bddb41bbe976492a25c59403d1c729db80fe1b388ac2b43a8000000000017a914b205102d729c11c11f0ee97f94544f9025ae44cb8746b303000000000017a914c55010701410b8b8a882e28b3e4e5a43ec48d75d8744fe03000000000017a914e1ea0108c7969e57f5a97b57815fed9ec2f44dfe87209200000000000017a914deefec43f46a510d5848de7cde65b4de0e1154198706330a000000000017a91453e98d82b0866ee84377f7671f28a0dd0e98d7b587ce2639000000000017a914af13703a79eb3de46d671859f8262dbc1c63783a87fc32170000000000160014133ab36f836b6e82487c7f274808038de35efafea55d00000000000017a91445c458e9af5cba85dfe2e0c636f60a6167f12a4c875ef905000000000017a914e3dbaeb0244e5d505822635160bf7fd7473ae80587683003000000000017a914fccc477da613fe95d899ce55a76c43062f0c074287bd320000000000001976a914635acb778378a402616cb317905d9692a948420588ac4e5d03000000000017a914154c4b992fa95808d8e4b0d4fd41c111f57e2b4f87f6a301000000000017a9146df26864fdd21432a5db16858936188d69bc117687d47703000000000017a914e85cff85bcdbea32e7046b06dbc16f16950b63d587ef8b1000000000001976a91448310c6b458a35cd293cc765863a3f977346076388ace2560000000000001600144b6ffebbfa9d555e3ce7e9e89d7d3d87996caaf10247304402206947739073b7155cc11cd81d0f8ca916553b281a9d8f7493022fb78d8de4c51b022028f96baad3d5073e7e3baef3bd798e2555b5004bc6c7a2b81256412732cec6e6012103fbec70195971c3d5858074704d00069c4804c9ec9b445254cc830315cbcb9f52000000000100000001f2f12628d883ff2841cb680addfc6ba7fb4aa04753594d11f00130925fb48eee0c0000006a473044022000aedd7022fa20ef8864d926356a821446c2d60ca66297378de7fda9b2539a7002205c15912d45879e0a374ababd379724d68dfb117844e484f77eef3651380a3c2b012102f82432b8c31872b7f68f6256e7faf121411c0408ea22ea1bc2b1a6fbad8fa952ffffffff010ca7010000000000160014fd407a520d6d8e56515562d2592f31d52096b3c80000000001000000000101f2f12628d883ff2841cb680addfc6ba7fb4aa04753594d11f00130925fb48eee1e00000000ffffffff028d2300000000000016001488ac44701b2705dfe6bde06abaf78b5062a6ac51e8fd00000000000017a914b65e1e8a6be4832954022ccba4a01b1d1dfebe62870247304402200297a66460635d5d62f210db118322e63cdfafa7f981086c755cec7826e8785202206f7d01e9e8601fda8c26030290d3012e3a7f73cb816106919b17b8e04ab07bd301210288dd7800e497cbfed7e4cb797a90c144c78fe14531ad855b8d2e439bba1e1ee8000000000100000000010166c352d3330a72ffaad2855da97ba6a2f57106ef2ac81fb75ef7cac310cfd1a001000000232200208934016d286b621c4a78e54ff8df9b1f5d7fde57f48bb3a94f14481944e90f51ffffffff0350c30000000000001976a914f3ebd8200b083a066d77f3237b2da31f5c42f56988ac88740d000000000017a914b9db760ce7b8106eff20225648c818e825d0259187708227010000000017a914a7f4a6d075bfd7ff65273558c1737e2c886b5807870400483045022100f65c7fc254e3c66fe21d1e31932979c6b676bc4267119bf3ddb8b8416983ceaf022029c937962d3f0de41d98c5d4d2fadd398f58aa802e8ddbe21bdb7308f1d4b20001473044022054cead7048653580823dcdd096a6f067e58c9dcda61c785cd7aed151a551a53e0220125ee23551ee959784186499298901e3a2ced12441c3d4fcb7f5fce6442ea30501695221020f1000961bb9be4efa062cecb8e1e4aaed87edeff6161157ce1aba051cf6091f210394b01919ac5b81264fb8ccd4e14238d728014818d3518de92a4245804b447d882102a6d7d400d69a164e0b692206d8f11c8e5bd69a94e65221b3960284714bd1b53753ae0000000001000000000101577e538ab24e20bafcf2bbd04a163f131709f85d9bc31456c15bf450df5aa916070000002322002021b926bc8171719b835707369a6aa4175e65084788f919291a8a6635b08e60ddffffffff0340118b050000000017a9149d1e59c0490deadaf3495f58494db96b49300086874e050200000000001976a914a94d3b917969048ca8bd6e79fe02021063be8d0988ac9fa0cd000000000017a914452cee8e2a216ea69418bde98dac2410dea2372787040047304402207be4eeabcb5e41e120e218c6f54191ae63596ea250e2ef59592bad0d6c6bdabc02207d6f400a911d806f701182a5713ae2372df4af712c62944e97e63bc67798b5470147304402203453465834aaa71d36782dcc124b7f8d32d6c4ef393f3f1fbb9aa4e761b07fac0220376d4a8717ee7d8f637a69716ca099a60edea2a743479c818733d0c40c39ee050169522103663ae45a6fa4f47712d233ad097d4a04de50bfcae54ee1245752e5580012541921026589bd3fc896e3dbcbed2c4682c9cba885a5f2c850830874f1533100d622db6e21036337fdf91218674c19bd60f1b748674faaa826ec71724db465b7ec02e8cc6ebf53ae0000000001000000000101619a1c40063c498a91b1cbd30277e648f265f8a8538ccb656f964a3359937c4a0100000023220020b98ce1bae24af07c3f4f807e891535abf983c6468586947be4ed5536a957fd4effffffff03d8fb05070000000017a91400d4e86aa11694bcfe0f8cb3f918cab8fb723ac787104046050000000017a914a24034e91c098c19aafe4809b08cf27a8fe005fc8740af0100000000001976a9147ebb1dbc807712f8f2eb42a41c7306876792334488ac040047304402202e838bd6b204dad91f94b425672c0fc062bbf171019b4e5594d34adb5f5e97c3022076e91945bc3f924b8eb0d4055627faa6037e6899837a7cafa3ef528fbcba2560014730440220211bc7bd1841732091e02afbd243e4e811c13c5ec1ad315e87532727ab76bdbc02206cfdacee425ee5a792b92c4b38f6342d9f6be01b24f6ccdf2563317c860f21a501695221024209db6db1a7d202fb86f96a54ca3530120cfb916e032c4c181d915268e96a7b210214dee4e50af7287562466ff3d22ffb60e41873249e01fecdfed02a21fe4cc06521021fcc627189a7b3a6f43b27af226f3fd1a7578cf456ec1faa503e2f2cfc90ea8a53ae00000000020000000001013fcce332dbc9618665f421b488abab733be133801757b2a9e9345c73ca32afb604000000171600146d30615a6b7bee30132a9e74e262124aebeada77ffffffff056cba06000000000017a914638e02cb26fa753f73d5fc6c5ef373f52a73f38087d8740d000000000017a9148fec004962526ddf3f7d2456c3572d0d6c0a2120876cba06000000000017a91409e47dcf48c40aa4eef00ebd6d0942b8b1d9731d877880ed00000000001600141b658fc28da3ff29d570548bba9e69773c46ffe6188b28620000000017a914f82ad30d55a690a2b6c700a108ea843f313c3b1287024730440220093cdf6a26a1d0be2bfc49c3fc2f0fbb8dc4eff72c69f4fad685d6a737f4ec5f022008f09f01f45cda19d6e6ef195ff5d40488480c0124a20a272e4ad7fee2a96dfc012102c87dd7c367e7812415bedaadbd0e2685ba26f1adc5f15001ac2544308f074e780000000001000000000109510789176a27ff4cc748f0d05f0765001b32ea47041e1c89851225407c628f1a1500000023220020c0ad539745f161e0969d19f203f1f3815b5cdd7993bff335502069f2767b6a79ffffffffce67ca995ec7ea523bfdab24dc07a2aac2feb3d1771d74550a87a14d796d4c2a000000002322002071ee752e1fe04bd83a89acee85f41482a84c22099a5f359ae888809e1e2196b8ffffffff1ef56578c5aa576db7fccab7cbc1416843d69d3247118c232fdcfd4b080c433f000000002322002051f7a6f918cc4236c0192e26812d369b4b66338dee56f5cd9bd6b47cb5fbb0f5ffffffffb4e11f1ce0f63eb40f2cd6f73214c5705beeaab74cfe344daaed628670b5bb4900000000232200200740ac2b8b7eda6b0d846c1a0174fa641e72732257714315c0a925eabc29c444fffffffff222ca6ed81d344ebf5004362d8eff070f616c21caf194c8450c1c3a96ef19670200000023220020e47e10a748ab15b3b2636beeb6b08f9f71f5201bafcda2d1f5b221f905335e5bffffffffa2d062d5baa83326e4b2ea5c2d8ea76010b9ace8066b2f6ad4efd36aed0d0a890000000023220020c737e49481190eefe12f0962d3f86c7126a4093a9e59520729bd312a83ead490ffffffffcb1805a216d287240675ce2468584c37e655f48fa4c788f81366bf59549ef08f01000000232200204af40d0ba348971ab12538a29ab2ffab16c211e068c37e2b328f66d47b774034ffffffff98bfe11f67ae1661052a6cea10e7e8562e0a29dc81a7ea151125704036a377ce0000000023220020566928971350ee807b8e2492b2f9f176ef3027d74a0e172f7eceb0efd860334affffffff9444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d41500000023220020bfb98af950d0acca82c3b08f7f972aba36d85b624d6e16e89f5c912fb688b17affffffff2c5415000000000000160014085369e82db62748c7f4f31ff856b2440e6d117767200000000000001976a914dc99479b9e3f9d592660e371a4e588bf118da99f88ac9c200000000000001600149d531edb4821428d311096d54ba9a4879fefe6ffdb2000000000000017a914217d10ea1f617bf3e9d93fb23ec1721b11da61a387232b00000000000017a91412867f2ab41c72d2ec1d69e5d1c602850f8de34c87493100000000000017a914510d400486d4536a0e4144084651903e4f5c4b9c87d94000000000000017a914cd09c5eefd39a1b7cd78be5d70cbe53f05bf1a9387124200000000000017a914bc842b9e7cc2c544442897b1242133db9428400287ed4e00000000000017a91462bd70f864bd13c204219056d2969e98e9ae3f7b87465600000000000017a914baafa43b1728974982d69e5f433907e3d3aa33a1878f750000000000001976a914d20358e8b0b4df230ec49dcd283d30fbecd6830688ac698100000000000017a9149e74600c52990a65152dd45f29e3f1f8dd1688ef87eb8900000000000017a91453b6c45a3eb7b561cede4b2cf766b3718bd534d587e0ab0000000000001600149914058c3627ab64f73be44098fc900c2e246f0a62060100000000001976a914272a2793cd308ab961820e1b3b0f188f48d086f288ac4c24010000000000160014f7cebc6afdc81c331696521f5043abf306ee3a9bfbd001000000000017a914a720ca1f13d92335801f77a9bbb4d781c008b87f8789db01000000000017a914dcd73dee2fe132dd7b350ab78efc9499542a333487b8ff0100000000001976a914e090e49b598a8eb86bb885fc38305adf200e144788ace06c02000000000017a91453936e66c7de2052cff01235220c559bae42bf5d8790070300000000001976a91445818e6512e8dcf5794b28b9ce46e9ef766bac6788acfc6e04000000000017a914da2ba48f8d8aca1498cd8b300216e6b8f328fcfb87e09304000000000016001467cc499adca70ecd9f28d3cd0e32cc09d5602b4107000500000000001976a9142b62a3577f12ca06632200edcddeae86632e2d8d88ac143905000000000017a914998485d8e97d28bee276c88ab0ce949fc890004b87d97206000000000017a9147b08914bb83c3c521939ba5b12b2ae5d97291e778779bb06000000000017a914bfdbc4c56e3130ff82d7e378f0e992b96f884643877abd060000000000160014a74d661def508595338b87651cceff859a1675a77abd060000000000160014be8d2ab505f4a33523eeb88023dd30bad3f6957a1bc606000000000017a914e22b18b8ec4f5b19eefe79ce807c9bd4f631b37487c1d00c00000000001976a914dcb6345ce1f8e515690a649e16177ee414c2d74188ac953b0f00000000001976a91474482d794e1926c4518bace3289b73b1e9c8de6688acb0d4100000000000160014671db50ecf1cb7f3ee430616674a77ad5813a428fec11500000000001976a914c0f85ceda357753e76e6133b3bc2c90606858b6188ac9df718000000000017a9141b4b2e03fc791a2a3ab73beb0f4083848f250345874fb721000000000017a91474f3bcdfd76ae28ad557e5660dc0b758dd1e0226875c9b2e00000000001976a91495f66fde6da55b988ec87a0c20bb998516c6e94288ac12133300000000001976a914ce5ef000d31a79e61a52d095ee57c92a3c0c4d9788ace7433500000000001976a914980b63461f47831550ce4b257b90296167a4a66c88ac82663a000000000017a9147f36fd406882bc1b6b0f0093bce323719ea4f20c87289349000000000017a91431399582b4de74f6222dcf86b0c229eef7f2a43787689a620000000000160014406869fba393fffd17956866efe0303d5a2f4663d43bc6000000000017a914f5fa642e420909bbd939239793ed3516ab45fe67874031f700000000001976a91465b8ec70214d6f743a45c9ee14cf8ad42af8851188ac04004730440220200db0fa8e28b274fd1d164f646accb016a66f4c73fd3264a71acf6f7bf4e76a02207a5b67c05de22236eca5dda29b1a0433fbb0d86d01df8652ccea06c123c245b20147304402202de5cea019e69799a61e0d3155159697c9d3357ec3b7db14448c4ecaeb870112022040009e1c0d5e97f17c4836ece2c15dfce592000ea35d96189aad6890dcb67ff10169522103cf71eadf3731b0bca261643dc40b5566e6dbf664cb56f6aaad3039e60a0e527a2103153aca151def99aac6d0f814f227fc81416e730dcde32432c05d75d5222685e721023fe18c23809c35164d008f5979f62da08be3b8140ba24593511214069e9a9b0a53ae040047304402203e9e86a8aa5cb60ce93ad6d4f946ea8ecfd61962aba42066852147cb4fc35ef302202be57bf5d15998dda80c601588bce21206d27527c92af273116fd302c47b2e2d0147304402204143fa914de93b3975a3fee3e68dcc7d555a46daf0fc4ed07626284d7bb156a50220474a23529ddb4a2b1a6a88c9e7d631f0e8e8a43e39856329caf808c99a1f425b01695221034c3b5bd6d67c1f393083ba94fd3c8b5b005f4814dd55ca997d42794de6a81ef0210362cd595b5b13f34dfe489d4d73244994e6882c050a7e0b4e6789110aacf05e922103bc7e0c4e2f359bced724261a76f28e880e768201ce0bb1a8992120743b5bd57353ae040047304402201bbae086a7878d13e2b9276eb3437a7e386977d64d58aab52efb658b1a5ff0dc022018154ec23ea614d6cae46f1e48d10ed15023bd0c90692af44db1a1c50eb67c8e0147304402201bc48d60e084696bd8abcfb77cae9cb38de4c56182a81a28d29e254c1a20513502205051562b05e1e9900cdefd076bfdb6e9ef06f5bd2567f0ba038daac7627c8df70169522102f4cb4be7120763b17bf4e18b0685acc0a4da1bbb5a956ed599d4ad1761a879742102d0d38f21c0a8f190d7e59f80086c7430584dfc48079b95f49ba413db6bf9376021034c353204fc122de277a1a8e95ac49a316c85c21b7e1c93aa249a615f579d0eef53ae0400483045022100984794682c8fabf5df437aca797d891b94dd36d2a957dbf16588b1f5c0a88e62022076dc0b053f12346c572f330409178b6a404c80be887a78239554fe10ac7b59fe0147304402206645f97a2b10406222a7ec68fbe8e854ed2291068f3b9d380e1315d47f5a884c02203a747d70a1082567616416b9e148e6f2075ca6c57d25d2def07043e75cfdd56f016952210248cd62ec04e38c4aaafcd03783c33a12433821207376514679af6e500c823dd121037bc0832f38472e95a7d308488422bff883fd82c4482c2c3eb44b93bd0763cfe221033be008e07f8b4f69cb318b50d8e3857c2d3f45501a5728cebfae1e9ec390783c53ae04004730440220254a41176113fd91df625bff7bfa4967e35b9faaf966ef6c07062aa94960a91102203623704fefc69ca477e1c989444c167c04276466c1f241618b5ae2d52d3af1ab014730440220702a83342fda3c14e5d69460d56ab07b9b238d03b7a6073cc7a1a434a8728fe202204390f8efeece12340e92613379d2b2b64b3cc15ed480b65e5e79ad53678d449901695221036bf45b6ae8381039a64d26fcb4b9fe107eeaed3702cb58605d7f12f12e4b03492103adb708430d7c1bef7451739a23f7d312d6441a77dd98332ba2fd9d543d2f160b2102a3b642cf6d00033f918f1ebe694ff5e09a6b7a91d0c4731c5a3bd16718f730b953ae0400473044022013459f7ed99b847a96ba7f266ef7a6e9a7d2bbc4d79e97fec084addcf5ad508c0220429e0688fa5237d0c1d0f85453f5e24e3562034ba9e3980e19abfcc961f716a2014730440220390721aa1c336bb822535a9b4370b424746afce3564ba47e65d283deb445241b02203cb45896f6e915b8ba5e66f5ee6332ac6a86f497f62f5eccfe7148efbd3878be0169522102763de45261c4425d6c4f7545fe6374aa34b849128beaa7c2423c49eeecac4dc82102007926ed8c3c6f69881ca7be40e3eb94faab9a2737bd93a5651e18a3e3857dfe2102130fd5ca783039652ecdaa277f9881660b7ad396dffe5d3f30eca0dfdf1d602953ae0400473044022059fe662655b986e522fd6fc414ca95e8d427766ac28c3f92f55dfc748644399b02206d05659cd2cfab7dc9675b68d022d176483dc225c06c4f1a22ae5421493a3cc801473044022029b79e32359d9f488976745d7a7abeec36a4b9f4085ad195e5595017aaf39d3702200479fdc206c97c9bc41a503d2d41985d924f94333d03fe7600ac771e2b8aff2e01695221029d45cdcc7139c502434ebdf6ecdcdd1051038068c3ec57b111c1b5f662d2ec322103c5ebabb961233f35f9f2826b1bdad27980ebe895222097b19b1c6474588226a0210333628a469ca60943eb8ba0dfa30f1e46adb5349ea30fc32dcbf65cee9742bef653ae0400483045022100c8cfa2dba1102c9d59733c13298167180985e47a1f8cb877d4dba907f683ccab0220310431e7dce00c5b174c034aecee72d8f3d4074b8ffda7621f4480890aa8ef3c01473044022031b45140e65d1e1e09a7dc307add997e0b2ff18d76213de52713983aa7b7d27202200aba1c169a17e205d686a3d090b520b17586fafc43eb6101ae0b0c083bde3e4101695221030efae34fc04f2f4d066a7bf043a37fb0ac3dc2c4a3b580d78b03375c1600b6ad2102b763fa8847c950b85472e491398c9f05e69b40b4ae64975697a44a809bb7d59321032fe8f1e0883a183bcc110fb7d8bb7f9da47bfa3eb25ce890f9f29d467d99551f53ae0400483045022100dfcf7e7ab9b1da634dbe9f707eacb1da00d04e6a79f31a8974d03221e545c02302201f77d5abc89e197b08e0da133c1a7e737a7762a72e894dc1518dcdd44afbbdc401473044022075240d6fb409b92f65057a781d70c1d76d67a9ccabfbfd292461f1ed3ead46a4022061ffe3f0673f161443c864237dbd2e65c83bff9d85faa647e226118fbf2e7d880169522103c870d6c88f429e3c6ef81583e5f85399bb8c27ba31fd405b886df8f6e3456dbd2102db95949776d23c4afe45795c520ed2409870b9fcafd371e2692f7931a93af5d521033196acbdfccfb63a35c0ecc796ee0d984ca84566e6cb886a91aea24ac6b4427b53ae47a00a0002000000000101ae769ce00c43ad270fa2a3b519d3af37541793f4d314f5736d1bc49f494b74030100000000feffffff020c36070000000000160014bfc416809942660918eddbe4d51169f5ec4ddc2db683e300000000001600148606e534728d9cc78cc85b5ca0c8b18c9d855caf02473044022026633454b733c8e74710f9bb0ded0168224b14b589af2b375dbea3163eacfd3e0220475390464d39ff96ef431e782cf9ed6614529154eac182e2db5996deef22e68e012102e5bd93aaa7006c60169940f4e4cb8ff2b7188ba73af7af558cc06887f6ffb7c647a00a0002000000000101b84aa6d43b9eee45556aecde47928a945e27bd454026c9c0f63f998dceb9ab020100000000feffffff04af2b07000000000016001481815d7457945fe63bed533f3be79976a45a507f84b9290000000000160014329a6e3403063e245f3c4fac5310dfb46da0311a837b9c0000000000160014c9e95054459b04470f13e91ff8bda05c2e6d385ac91d16000000000017a914cd175541de1797c3b8da3e8aad5e6d41f1313766870247304402200b5ab8a9520554895081eadf6bd056d1204f4a4632c32c100c85a08bcde7a8ee022018378358ba91dee184bae68b560761aa4bd314bf7790d407be35c90b67c6897e0121029e27606e2ab69856fd780cf75d6b18fe2ecd2983d220067efcd21700ad01a82149a00a00010000000001038cd75923071be811605e700c907971fa6099fec77ada0ba9244eed0dff4305400100000000ffffffffbb1c730634810bbd9ffdb757b66920fe5588a88efc57fb0c55e216f095bb11523c0000002322002023def64334394297cef305b5acf2a091bfd669650e53f00b2ec0ca3e0e28d136fffffffff0120fe8b57187d08519327b47ab3f6fbbbafe658d3312fefcd131015eeb17ce32000000232200201c88a32358742ff2e678f7663dcc69e1a3f8c79833a204213c0d801ed962cec8ffffffff021d14210000000000220020a7e2ba166bba3fb71a8285f839afcef9fe22953b69c48c6f171012cb362e872e406e23010000000017a91406533871b72a54ad7d234e6df990edda59cd249587040047304402202891359c0d5f8fc91f6279bed5cff1efcb6b0ff05bf61f024818817aa299d90d0220728e4ff071628faa5da2ae0d46747746f5bd7e363db24a716a9a75475769e67a01483045022100bd290a56c4da0f085f0520047812c4dd9e09ab159b281673a6b6c43d16aaf71202205cc2cf57fc39db1a41238c38dd0f516fef5c655ccc3ea07bd21e6ad6229fe4c701695221029a035239f960df47e8e7b0ce11f89bd07296fbef1a737dd0f064c055562a930221039b4cf4c15e0a995e2b8b054c8b76972f04f9b1c64aab913b42f2c2ddd638f4b02103d3fa52282ff48585e52f078e90e0edfc857586771f88ed0cc200b76faec9c6a353ae0400473044022023d56a08a0cc8e8f81aa02eb40eaf935998a8be0f9f490c4ea1458ebd5a3102802201186faa679143483a63200ce178b08343fe783f1181da21c509854d01b70b5b6014730440220655ba42506fb073ebbea2f179ca526e57a42eaaff7a601bf2c6c63f41f14025d02207d0eabe905c613afc1badd8a30ff5c7777a5eac103046abe134f59d5eec935ff0169522102d126d5a81eaa20bcf961daacf4fd692160e1ef46751d59605b64075fa62a9eda21033aa3ecd735eba6bac2cac21a6681fd1f94941cc6ab324804b2a6da3742692428210359cf37316983baa50e26911f93ea59d10d13d0cda3a31a295bbadb985d4c67fa53ae040047304402205e8dba0f7facbae9c00960bcb3db0c90fc236d5edfa473c12123eadedb3a366c0220277ee14436acb4f42ee486d543a91f106e598f9147b56cec4c42beb821aa86f301483045022100a86dbc9b2e16dabfc71f2911f88591525bb6c674353daee26fc9893fa19a02e102203056b5d16e55cd55707fcba3e6f2ad1f2fc76617a5675f507fecc848fb98cac201695221022fa7ac2e0a1ef8fdc7bde0990dc3c5f90f85ec7a2f69c9b8187a0331d47bdd5e21023009aa19327fcc19eec525aac30adc5fd48ae10ce6de9e9529af56ce7c19e4f8210347f82bd3354046f2111f10d88055f123b6568b3e598ace19fefb03cce229c86a53ae00000000010000000001021174cfc135ef92cec75138d486e06825c2acdb54e12e2cb0f56d17773a9c557c0000000023220020bfb873193762fcfa8e973ef91e4819471505e88438841d26738aabffba7743c7ffffffff577e538ab24e20bafcf2bbd04a163f131709f85d9bc31456c15bf450df5aa9160800000023220020ca6d28ecc65d6b97a1c4087e15729b23222f713cb0c3ddd5dfbc9cedcfaa0a9effffffff02b0fcdf010000000017a914df1417fcd9ca0c378ed571062221eb6d2d4f6ddf87805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b49300086870400483045022100f14491382da62c54701112fb85a99838337e8ee71fcdb9fe8bae910201b7deca0220541308ee5ecbe73d38fdb6af46b8ee483b672e3ee8aec695d34e3a9d339f4a1f014730440220691349c8b1071d0bae5dacdb095eb5136497e355d46af7545110f9d98912b52302201267e0ad6020ec0ef996e32a0448498d9358e5262925c6f4209a8dba856440e5016952210397e501c2b63451dce458285a60cafad84339254bdc532e5cf8af84cade8d158a21025330fc113627af04fd4cf7134f84c3212c6d6ec46a1dbb77dff628b1f55617e821026b6caefc3f7721ae9f21312d79507e7f1ecd956cad465699ceb94f2949f25e8053ae0400483045022100f370920e9f5e58948d7abd832bf6c0943789d43001bdb6fc971de269cc454b630220605fbf14f5e196b8cef4754e9c4f3f0b9b41a27238a82e20202073c17a43756601473044022069a5a2c8e0f82d503d3dab02ffbc9e1aaa591b7dfaabaf3a8e9f4e3c1345b5a102205bbbe69b5123951ddccd0bc0d0fae71f40ad2e362e9701d7177a6de9f9552a0401695221023a2d692ca016317a9e81e815c63df47e37eafbe278c006354a016d7362ebb9a32102360bbb7244ed8315ff6bb82f99fc2c20e82d9cc1476bcc23ee5bb8b9680c4c32210288edf00cadaee67703e5c6a6407ed7035c30ee2f63c1d15bd628919ea3e4422e53ae000000000100000001a8a165621d126525553e9396bb4e17c2e900a5b6cf229bc6f16d8da17cbb6ea9000000006b483045022100f1072b30946758bcfdd911e0c469480a988d413fdfbb65441479c577943b4b3002201e189c9277a0d172ef0a452ddf6c2bd914c01d8ed1a78a43aea199aa516aff37012103f3f44c9e80e2cedc1a2909631a3adea8866ee32187f74d0912387359b0ff36a2ffffffff0261e3ef00000000001976a914a520c86a08366941cd90d22e11ac1c7eefa2db3788ace0c810000000000017a914a58a3a386ba7b6b36f3cf745dacb11afaefd6950870000000001000000000102d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70300000000ffffffffff287734e5ffa576f5e3cd64ad2f69fc87ec3f4ac5cd08ab7c8809cae8f2dafc0000000000ffffffff017a7713000000000017a9145bb62de63f3dbdb25180cba2ea57c7092decf6aa8704004730440220233e06dfa4a0e8928a0d379b36e7e680dfb5b8dc1788721dae9490fcd6959ffe0220640b47e1db969b716712d1b64badc2bae1b69f7ce1753ac3d9cc1caabeb77f6f0147304402200a4b44f07af97d4c8be1a0b663c455d43c635822d74d4ad68069104f638477ba0220087786cfd93c4d5ef4d135c9f2fa7ac1b096245c703ce32a149f2b1efb85ada301695221029a8534083d96295f3f59905a66bc335e92c1fdde5c1f60977081475b62ee7b7d2103bceb822ffbbcd2f9ef833f17b74c753d906d9ff94ded1a6d23bea4c539c6e7e22102d068a141ef27de38bc8e39899f58ca84f759b9321e037e279839fc35ce8864fb53ae0400483045022100d898f6acc30198554de2a59b84ba8f599977df0f21b644d5eb806ccbee6ff0fc0220309f49bc7bead7ef8a5f14e7afa48bbd199586ed107c72fe1fc6db39cd37a9110147304402204d474079a3f2383b94fb7ee84015af355e6219229823ed96b1147b4ece014c93022038abfb7048b33f064fd2e933388c57d9c1e154806a91b306ced7aadaec9ae52b01695221023834b93f77f2eaef67a32c5d473fbf25855c0e8dc8dbabb19797b83c868f965421026ed95d8c4045dd79d8082c4c7dc4732f15c97f75ddbf959053266850554fe68f210216b1c913a9b92e748c74bc325887280f67ca6db751fe7e0fb44755b9da79cb2a53ae48a00a0001000000000101552873bde52391cf1893802e6b1221ec05ddfb715467a8890a5161f666e7799802000000232200202aeba8b972ff57468c0fbf2c86b1010cb0491e55c7dcd24d3d4c02c458407a1cffffffff05f2c4b7000000000017a9147429157ae348e48cb266f2d1d1f4bc4ae067b21c879ce76700000000001976a9146f5dbf69464be44d54cc74eef9795dae9ea4d5a888ac007102000000000017a914aa6899930c25311dc2130796e87a0c512de8dbfc87a0860100000000001976a91471161e901363c01787fc810041035d268de5568388ac38c10100000000001976a914ea94d740f7696ad07e06ac20f020ececa487e39d88ac0400483045022100dac108cb3ccbd825cd513edd1344be8fe88e33b4c89f70ad16bebcd576eb92f1022065bc7058b9dc077965822a54b965af326c5ea91efb3c45e8ed563fde8119a0a001473044022022d053633be84cb77e1e12dc01aace24843b1ce30d619448e1245ccb6676899002205c103bbcbf624558e764236030ab33195db42a554cde54e52f25e50c71a869e80169522103a0fc2715134229b89e860c3c1b10dab58f160628d380968be05ec449a3f7bde62102872af3efee55d0c1d06a63d0a7a2d7f6c148e759ddf03fbdadd747c2b4ddd00621034ac85b93c49a11c089415afddfa4e74fb6b5d3fe59e50541cb9a147aed479db553ae000000000100000000010253295db5a9b70a35dd654620b50dc209aa31062db67cda99c0da35bbacf7953f0000000023220020d1983bd5677360d2e8f4eb96025965192f9332cf9cd50f32a1ccb1a7fd2fac98ffffffffa43cdc0afd66c41210ed964f4d4d9dfe38dfe27e542f299badf695c49998154b00000000232200200412e2a7d38bdae7261d82c9950da02f751a0844c9875991274197065c1bfeadffffffff02794d1e000000000022002037fb73d478610264852fc88a465fb33d4c521ef84809c5bdef24a72b678e5fd0340b25000000000017a914c0001905db101466f15b3aa25207e12edb7886018704004830450221009f527ae2191eb5ac433053b2df34e53ccd88f2cd6d05693159923d0fc33ad6e90220192a1bd3a3011bb1fe2ad92e1e61c927e1baad02fd462bd99333b98a0fa3bbdf014730440220590d1970fb7c9918eb60b085dd42805e84e4852b3382bb7fac8a639cbe07872202206b824dedf9c37f5f9ec0635671feb6f96a2ed8dab5c9a409ee78545b600cb3920169522102403ca7b2bda2e6cde762cf9a892ab5f137fe2db085963b0431b2b27bd5274353210341515175c1ee4353ae0c12594cf2d5223448c40ff345d81457e9ce3d17c533712103aa4a059eb67b7242fda0a1e87ea9a7047156961129029b3ffb1caec7a71e9c3e53ae0400483045022100f2fcd3e6b061844e9d248d58f816993642ad79d40a22189218965dfe9e580c8e022029e5dd50bf182e6a08d69ed672a68b1e7554bc174ea19558acf9000ecc98e153014730440220653d80b89bf1fbfc9acc2e8aff485de6862dddaeaa2ff39910636be037d7101b022005d6d5528f5380d7f587c96599302aef4e9fab9a5c9fb8bf199e1f5f5983550301695221026477c5fb6bc8622527ff918f0260e05fa830275387e1db68a992540034e91a56210282bd048e9721db5021157512ebbaead24215806a397ea34ca49647a1f866b0382102d44af065b55611fa5c5285837be88800486fe37ce2c5a648bd414ee1367fab9753ae00000000010000000001020e22bdd79ed6d9ebe23466a9259f3657d3b79319e29635f463772216141f8b2c010000002322002024b78c6d0071128e4f9198f61a741fbb320c979ece72dc49abf26ba5259bdd8cffffffff252aeac069972b82f8a08dd8913c7ab83746fc4cb56a7cd21cf4d1fd15c456e70100000023220020d60f3609283a9074651f9522177e5fd5c1aa4734137f6207914aa8bc3977c93bffffffff03207c2200000000001976a9144b544f1ec2aaf5358c16ce42ab1f9b68ad752bf388acc0d401000000000017a914232a65b647172ee34454781d285026590daac6ba87f8245e000000000017a914c05f597c3404618cffb52bcf6e13b2f7dbf0a8898704004730440220552bd1e0f5707b6634c3dc5e23787fe53e12cf749a8dd2b336490bdf05bdccc402201e4467d97b6cdf9bb2f571563186a691f1230ea8bd171d03443f5c3ff57e299d014730440220747b2ea56bee1b87a54dd0a8c491e51e721e909bd7982afddcd842e3bae2dd35022055536440ab55ebef054895a504ef1912fcdfe38dc7822af76ef7e86a2f12cc8101695221028a1dc3010c7871e50930bb5f0231fa40445bb393beab30572cf3075ac9ba4c4d2103fbdf49f36e58675c6e8c7d9598c6bde4054662332e6a59b0dc8938a93be6096921039fc5c0d91e61db4e1578491ed536ef77e624757d6357054a3695540384a25fe553ae0400483045022100b71b278fe854bd76623f8fd5b4d464ea6a69f4deef977fcf01c2d0aae6b71b1d02207c74b773fbe09415fb02722c6a4d35dc5804ee45ec8863a74a882b7901feb280014730440220228b8db55c265a7e83c17e4bfd6d5083ff459f1fc5fc33f3144c3a43fbad9e27022034d356a74a6aa941e9ecdc7385e726a7aa448186e6838cc75da8ee1b5cfe8b3d0169522102a1e6570f8cea328a572931cea9479a96f5aab2a6f134b7bac0f642daabd7581c2102eca91fc9ef63daf2440a49a5ca943203d366075807ba7d01f7e139bc55ef28e021029a8f79725a24dd23f6814f6e7b6e74bff49a52d35b470b5860ccb0a2918350dd53ae00000000010000000121b9a9e428f550680e082dacec17f4189646271880a030245562cc99c3fa23c5000000006a473044022071e95402a6777d51332d1c1c31c6b423d766728895e55614de5ae55c85e8a01502201e5452429343367df3d525330c63e9202675ab8c4f683be534751d4e1c2928f70121037a6ecfad67a0f286d8644c5ef25f2eedd1d6957f03deaaf6a4bd7e127898d032ffffffff02371e0a00000000001976a9142daea31982cb181b0f3b27932b6319ba7562a16988ac482600000000000016001456145c39604d8f01f89b8de97174afd36d81b91300000000010000000001028a769ef5ec87bef0f68da75805cd180043c2a3a9f36f46fec53296205c52adca0100000000ffffffff455795e54d03bc13711820d7fdb5b8d41737beaf6f04e4767312759ad4f8933c000000006a47304402202177f4361741625a31f7dd08632b3a69aaafcae52b683d54e32a418a26dea74e02200d3d361d296e7182f8cfa0b7ebd5ee66d7db3cb59addf6bbe397812fb29cc6cd012103958edf995b01d98b0f5d4dd2806215cd39f04acd957583cdb697104b349babf4ffffffff0224f5010000000000160014ef2afe76b971ba475a12a19ad60ce102d84b4b67c09e0300000000001600146d1da4bdc5a21a9f8687f3632d34b3096d1939d602483045022100a358401b267e521db2db8b1e0eaf91e057cf738032d71267a28591e8cb6a795c02207f8ce4cc14088581cd082b9c7e85d9bf94078f9ff47f6dcd4815aae7b893379c012103c2767f3f054ff8040c97835ce083ddba952a7c920e13273e9d3a399d02ef6c83000000000002000000000102dd91e2eee43e0d8d403b5ec633887bd837a0513efffd6508f62ca1af75f895a4070000000000000080ce874e63a515b687a523763b7537100191c2e47e44f25cd3ad6d10a58351d51c01000000000000008001bef40200000000001600149215a1dd8e4807e963e13c862c70e803bacbd1f5024830450221009098080cbfda66d99be394a55967cd61a0e79476f7cc06cf3c6fec08039ee1ca02207212ac9b5ef3db5128496baf45d77f624c19b1885b94dc38b39ab262eae065c701210373615b3c089d2685b4a5e9eef5c19301e7dc33fbc0b26a05e0eb53c34c3b2f470247304402203a74eaddd8b1b23562ce7e50534d135111cfc756b1ed8af062b2ade51111223102200a881314603edb8af42240528e67a641b5379e94523bf11c925f91b541ed75d1012102129907b5256472fa4b0f9710182ad341b5e7a8c0228526f3ec7c02209a538d1f00000000020000000001025015e8097df8aefa6876c5fa4ac3486cb50c15a884f56ad96d923a9514f271a80100000000ffffffffaf26b8b77be50af8709c16062808b80e634d17f710b8ed7a437c3f55a69bc6d80000000000ffffffff0220a107000000000017a914178b498444ff5b9d87f1c35f16902624ddae482887f8ce1700000000001600149215a1dd8e4807e963e13c862c70e803bacbd1f50247304402205b76529426ad9a5e90bac12bf592218e625816e7f1d9dc23641c655c9568e911022027ca2ff1539dab0d606b73f2c5a015dd396d3ce61569df559929c631a76f884a012102a506c085059d59ab525e7d4bb5cef16ce0a0fe162223d7c181d0259c5e9477ce0247304402207177f65de74aad4878c28df6f59160030e31811e97f2a6ed71f55b5d10a190e6022040a6150b43a5261b5e9a66ee3d39556df61e8e49ca51e32d4da753d70b64e4b6012102a506c085059d59ab525e7d4bb5cef16ce0a0fe162223d7c181d0259c5e9477ce000000000200000000010174f99da294aeb44b8e18ba7890df111a2c9bd9e4b143e462d47473fe743824eb0500000017160014d4df5ac39463363d49fc5c18bd4ae2edb665d492ffffffff03679b02000000000016001429792e4e0008880d8fe3b33a0824b99487d5cafe56650f000000000017a9146ffb1f8a2757bc7ed42b605602e2f610ea1b17ea871d1400000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e0487024730440220700724e08026d6707ff4f807f0614eb63b74ed2d76f66661ab291070904e1b1002204b6bd509d50c0e59bd43fc35f8e3cc4affd81fe4581c87a84f254a4c2142490f0121025e7fa0500e4974de4680b25108c7537f18276d400bdd73d48f7e8f030931e2fd0000000002000000000101fb2c29bc712951f262e9bbaffe101cadacf2ff67a7ad8c7e7207fe3c17d8bf470b00000000ffffffff02ef8602000000000017a91422e2541fea68f68ba94c036b8867b39195b95fe6878feb010000000000160014bf5f283cc0d61fd63f19f65122334d2389a536c702473044022046c298cedfb147e594b44cf7e716a675f537c510324d9463842cf39f8fb5933c022058a44e6b5ad58baa24a1d1428093985e59c1757f2db4309dc95a4c0d7e0922a70121037a1d94dd929970a7abbff845f6ddcb7ce3cd30071c6a5ffba445cd2f3b0d3d2d0000000002000000000101f07de85fd6425cfdbff2506f68f894f5aa98bcd5710d50b3827e8ab1ef66a4cd0100000000ffffffff019fe601000000000017a9149ed881956e8a1d837903221d2106625f7193375f870247304402204f32435659b28058a867513228d094ba4fe46af779aa9dac81af7072c3c60565022029eec2193a352756d428b6dcdcd4ea749c2d17457cbf593b6e797724f4aa31ce012102f342890bcc3b3b2bf2b5c8ca61eba87962ce4044524a0a88e23e38335654d51b0000000001000000000102d2787e4c860d573f78acda517104fd76dc50958b960996f0398d2aa97a34349e0000000000fffffffff2fe9433145b35238ea18eb4e2d9b69658941896d0e1e39ecb00c89399afd1a0170000006a473044022050d386a6440501ec008a0b078f5ca9f8f958cca07c9224c365bc3ff6637494ad02207bbf32b039e5ba01f6b044b8e72b394dd8165fc1f0893091da0a3ebad9df897001210339e9f97ffe13e5b2066fc37ca89a99569448e69c40b44affa12d66c47b9a89bdffffffff0200735500000000001976a9143dd8d0ef321414e0101fd9b0de61c93acedb03cd88ac2c6500000000000016001435f40ccba555d619d086905f9532101551049ddb02473044022045d8c2a3d264d2995c913cead8bb8fcbccf8df1298b63947e0c8dfe5b61dfb6402206796050cb4442e1b0c082b6b3b5accfccf6a216a039e4ccad2363c0a578e552301210326939cc4614c0341e493ee5c00a7cc08bd14f948b6acf5a23252a348d2af677a0000000000010000000001035049f1065c1bd729b77b45dde914d542f88c51ee30af85a97d36a3dd3d2f56a0000000002322002059bc5cf87d0f4b7b9e7af6fd9a7a38f539dd16c3026766f30a6f933094d341d1ffffffffc28caa1a0899f1d7866ba95ef9548029e23b8301c16f5ffa8b279226a14528720000000023220020b0189bcb0506c66cd90a428cda359d2561bcabdebba9a68d58b7a6fe6bc456e9ffffffff46924cc28df09ae63136991ade704ab61e037916c48674db8f3a5b041fbba3d400000000232200203796ca87c0995f867559f57cd0a7cc56dde39dade62d9ae5389f49704ed1cdc1ffffffff02805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b493000868771051b000000000017a9143f86563ce72fa911ec61a6203b8bb8af602965bb87040047304402200a9d3444eb05357dcbcd1e2c4adc4d463bf278a36d9fcecc7976cee99ad252e302207c4bfb6324e5e06ddc7e2ff37771893d33c6758ccfef5a55e30f23a144f9fb3301473044022058a0e692c8a236e49331838e24472636f592ed90a547b0244b320d348c80f2a102206de555d34e5b1fdef3b3334902cc0cb553582431e1bc4a9cf450b1569de817900169522102aabbf3147300e44480d390971af4a3d18e36e5f9015feb5f70255437a3b1f25a2102c8a9083bdec94e401778eeed432100c798000b40fbc83c6e5c3e65f19551884621033c6f20dad4f81c347bd19b9d59cfa5555056d378b33056ad1dfaf28df220c00a53ae0400483045022100b8cd953a220b5ac957c6f8ceb31797616aae64e69d458221c74dbafab03d728b0220733295e8b9e7d9a990ede2aae4ddb25a2ded17f6ed82334ce03b547bb16ac34101473044022063ccbe144b703729b76a9bf3b73ee7ac0c81100678c5344e857e2b5101b75fff0220467c62b82ce14bb570a31ed675bc1e01aad95c5810c4b179345d4e5658de4e350169522102217d925a0c752b827a1be2ee1d16bb0a1de31555f5e6871a3d265e68c22ce07021035978eab023f5a68b1f34a36e6a12473dcf1aa26a7a93b1c69872f15114ad55a8210212a162d4e8d6e470ad4c2e2292dced7f88a460316f5d04cdc0b1cde03c123d2653ae04004730440220325e19cb764f131943fa5ec78e4a7e79b7e0582c43df86f7bca6b99b7d7166e902207a0483f117584ade6a7cbdd456a5bd041cc54aab48de264b7de0e7d005cb3ade0147304402200d6fb1b705d57e7140f0fd235ee17f5d318d4f7ecc4e4c1482f27e54ff871fd102205e61ab299943a0a315ed1c1b209473077153b77b96b4939af6f9b0ec50b6092101695221036bd41a10e194b24a0d37f993077b4e5950d35bf9c17ce056ce876fb37d41f4072103bfaac1c648ff116aa15f297381505c769b545e4fb600f87f2e60dfcf40d8619721033522bc40e4d704517ecb52dd1e148cd14379594c259dd0ceca93527242692bf553ae00000000010000000001044259681954d2d66542eaefa5f82c893a0a1f2f804ff32bf16b0e702a58b7260d0000000023220020b011455b74b2df913a3cafd53a473da2f508400f28ebf6ab0a42e0c11fec0112ffffffffb7519fad3e6ea41bbc9336739786cce787af40ff8b0d4bb5ea314068462f8c3c010000002322002086f400d08d1deba156bc894e0275e40de7dbf9b584ab64ede676c12ce35d648cffffffff224172a9d59d6a40495f74075a32f7947d1353dd6fb3d899f04c6d685d649d8e00000000232200209d479bc2de3a8f258d0913088ab1e55ea73bb43e38010ac366d36fcaae0c66faffffffffee46a6b486043625374635be75d3a97c762e117b78c120e21681ac894eae08a803000000232200202629627d85586e4c80b347dbf669b09430d885dcc5dadc7554d1aa9ad0cd0e12ffffffff02a43f00000000000017a914e5da5bb2e27559337e2bb784eba26635874e2a3b87249cf800000000001976a9146340f1908d1c5e9bbabf59867dd4063e9599713f88ac0400473044022033d80de02a2f7d3495928d2699981c2fe75d342cf3094ade6357b8da53a6ad990220426f2efa047c1c587f37e022133ec4aa18bdff3317d2f8df1ea5477c91d92e6301473044022049e5bac58b098d7f66db9b2368210145aa31bc358809a0e65173701fe2cc897402202cdfb8f516c3c5a959d2d8cc1228666f5797c1a6c27c315d9e8d13128de5a8dd0169522103428509cdb89f5e5edb385e310744c8ca094af05f825b34babfb6c4ea5e1133172103956463ec8e50a4e989a3f3d57c2a6e3a47bc8157740b5d820edda0e71950c0552103ae47cebaae2384ce21a04dbe9f28c9b5b84b739a5970fe6a159bcf6ea878245c53ae040047304402206c84808b39de3657de534d4987af922ea0abbe66946804323f0ef27df526433e02201bb24665ae8466463c65184f2eefd40e89aa7f11108a8d33b3d50e529333f8d301473044022044a3c1aeb7d919179b11dd7fa84c8b46fa4b4c5e2fa9d44f52fc8ac19340512e02201ad267551a79f6a723008cd0a7cd95dd86c1fc0ba03278800ca05c3109e543cf01695221037193d9a36fbfe4ba8da86b2fc0a7a602e4e43ed4e48c7928e5cb119de00b247a210274d93c243073d8278585b75c58821247828564af429362d3b9561205dc5c8fca21028a1c41e298977d89309ccf404d248e246123609cd9aabb720794f551d94defa953ae0400483045022100fa848a33384a1f744c55308316d9efae103d135fdaed205ddf877feab712875902203404fa709189433a7483c6adb29997b08a8f2b43738e543a21ab20579852074701473044022005f35d6fcedce2358939c3822e8cb109ea16dc8602789d04d91562435054b924022031a400a8320f6b249f5f1e4a9bf04f51870a1ff33b8a90a983badbdc99be414001695221033aa7468fd499271ae4b7227da782ef973ffb328f9bae5c482de74fabb91bd0212103c4ab9f5aeef653c62aa0bc04f8cd4d61d5a0a13448dc1b642b6fbca37128afa4210304ea8c33a7cd1f92da885c3bde783a8170defbd8e182c58db92444ebd47e87a253ae040047304402206b88f14048ba5253381bdf70fcf4fdd853edd4506a3370d36b768d1ac0fa6b2c0220725fa2e5428cc8015b651db55409aaf020e2172921709e2c958b90f012ebf1e30147304402201fb5cac954cad87f85a8c62f684e05de5b50a87a50802c4d9b255acd4e16257402205bf4ac6c2975493ffed77d7cee11b8c1ed1013a1fbfc1d094e098080820671a001695221020101485addac2da80bd910b1f48568b6cfef4d1051f9be5ac3d5adfc590ba3602102db9d28c81b3251417c554181b28bde187a3e412d0def56c174fe954aa064bb0a2103055f90236a314bae7014bbea56763832cf49ecc393ae9f0dcd6b2d1f2f0b578d53ae48a00a0002000000000101fcd181c4e85a4451b19e50553061461134c0bf7e871a3498ee63fe033d8df2b9060000001716001421d900734b2ce2ab6618bde8c013800059f1e32dffffffff05b04956000000000017a914d33f4d304945c6b4bf80ecb43a72b2eabd123f8a878fac01000000000017a914efcc0a7142470a9921edd2040ec1abdfa3470cc387237e06000000000017a91483a59e81783ee9459dcf5ba3521c5ac7d70a03bb87080a0c000000000017a914c7020be73548e008261d88c3248f80b18cc19a808730c127000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e0487024730440220760bacce56479e3e20c17d0cd7f75cd82e3460b5972842c2135264a4e6547be702206e267879fb8342e4ae3c5d7c4b77e6cc482cb2c3332df64c9d645a7d301e6e0d012103489c725b39c4090b054d12823f1a3c0f25828b84c7f8a68e435725d90fa289ec0000000002000000000101280523577169f29b691d37359c9f74b0f96486b8b073ce57c62ecee9788215af0000000017160014c5e8332c1c9f9ef45a0c9aaef11b9c4f66d43816feffffff02e977c6190000000017a9144c2d116b68a7d92b42b239d1adfd56dc876a59f887804a5d050000000017a914d4de3e822689e1d1a4409305aa30ea4ce90a48e48702473044022016753613eeab105b15405bcc52a2dd3fb2da34285651cedac24c29e05b08e11a022018c2cb80d4e837938ed325cc86eb34fd0427fa7cbff68de4fa04cd5f672c721d012102f69d7596a6de787d54bded690d13d77054021c99695fa0c441ff159bb50b6e1047a00a0002000000000101f86fccbd50075f3ea829dd71c0074ae2d51d31afdd3cff129d5ad1e2926c15e90000000017160014c7b5c624ef810542021fee57eabcbcaa616fd96dfeffffff02c792d0130000000017a9144e99424626d4701bb2d553ab6d414efcef5275808700e1f505000000001976a914707d38b786b8280c3db603cf76e0ef52017e8b5f88ac02473044022015dd8bb7587ee5f04f5ff02b22d00dda0a4b2555f5aaea7d5b49cec78ee1e54e02207f2fc53fd0274cba376d38d2d10d188ab0471c603bee4ee03710cdc017f9fd0f0121022a4ae9b2cfb9e92cdc09d6a90cd84dc9897696dbed2e2a84b0abd4d90525369f48a00a000200000000010157310d2f02150839272db7dc010c889fc06b3d828f7eaa263ce02561a24b80ad00000000171600146acabab0f0283f9dfe019f671126b3c2aefe7ae5feffffff02b0feea0b000000001600146c7242f84610830d902e5858259b3e0a9355bf730e90e50700000000160014814cc28b45b119ec24a202bc35cd96e66f810a210247304402206243464d07455096c4bae49404c76dc1a227677c8d60235f4705ec54ac7c7c33022068aae9e4a0da0ac4aa40666b598d965f44587160e9078de13de5dbc17117b459012103889614d2b0add0076a444e5019fb223ec2bfd672b0b879c52c4bad4eda94b3bf48a00a0001000000000101552873bde52391cf1893802e6b1221ec05ddfb715467a8890a5161f666e779980100000023220020b71e6b9a338f81c09158f10bd56069fe541055b20a34ccf99197a6dbcf4a63c3ffffffff02ea354a010000000017a914f69cbdb7984253437320e3d5177a74d7246b257887986c0000000000001976a914d24963073152787703aa925e1ea127095ecf03af88ac0400483045022100dc29dc9e46f1c3334fe13a2c6e05f56b66f929c2ede8842140ec8dfb74e1c274022068fe5802195f5d19e8bbd1062722d73429d2959dddf864ad8c73892f4c30dfad014730440220626d4119524a53272bac5c33934ed19b1d889a36416147323bfb52898cf2d5a4022032e3b07c9fa3ca2e841b86416aeb9fb8b7dbee5651df7c8eccb274db20f8ca850169522102c09a3bcf45277cceb75a225f4747314ba6808bdae3361a301a577e9b3b5ab7df2103a9e1b2bab5f6031be2b0260c138a915516c0c7001218bbd3999a882f0195b93521036d887dfb3f8203e24213ef71edb9d6bb37ca6331af8e2dd62a6a04d72583811353ae0000000001000000000101a38a25dc066c2d63ebb0211898a7fc0a0b4c2395368fc9093f39b89cb59e14060100000023220020a3810ef9ab41b3cc2857670277c89c64cabc227d31ff613f87f35bf474594accffffffff02f8ed0500000000001976a91475fd9a00b42214a598004319867e28ac23b2d05188ac8aaed1000000000017a9144091b137a585bdfd4ae99ca5f4e2db35c7e407b887040047304402204b38ba954f4717c260bfba9dff07144f0b6c28a1e06a463b549fb3c84f5c2c3a0220130c97d970bc538eff3a08709b47e22fcd95457092217d3dab6f201936e659a20147304402205ac260477c455672d903ec239e950bb03261f5cbe9705935397bf9191eeb16f802201c086929b7e38d72686bd5087d7799bb2cd893b8bf6a12b63e1547c2903183080169522103f26f33e8912a2f4ae906097e8f86c6bd715e3b6c7fc3e91247655f6126b7573b2103e63875da618e03b036715b2ccc4aaa4772175574d48eb5db4fb9242068265ceb21035248d3b8ab52b11ee67cc0c8dcc6f57d3b91dd40ea1a6659166af242ca12c4d153ae000000000100000000010524cead39bf834220549f15ac62cd2abf3abee4c8858e55ff8ab8d78b5c21002d0100000023220020ec8a7261f5aec080a17ab146d3a5883c65e4d58c266e32253cead55ac824c814ffffffff13a4e915ab56e87701a29295e9cbcbaedfbbd45510ad51d786baf268bdbf238e1a000000232200203cf60988da76f281bccd723bc37bb6d56e04af1df8ae3fc892db16217870f3f6ffffffff5b83ee96ec57de1f881b1a380463e425a5384d00a2b52c829634ebd776b28d970000000023220020560cc55d3ea6a2ef1b128a725469b6fd1b8ff5486d38fd984e500c9f9511dbc7ffffffff75ebcaab56c03b72571945034a131305ed68070a533337e6d63d0da619c0afa00c00000023220020eb1e792da177a1f415e2380fc4348696f8a9dca6dd408d20e79698213f44d6baffffffff73a764196860faca8d601ca535ca84e0f140de62b6090825bbc5d4fe40a698ea0000000023220020c9fa87a5c3cc63b04e67601ab3b800a4c9e4db1438e788a4f3540c8e0d2ae706ffffffff013b3d0700000000001976a914a298c53498fa62502e46e726b89e7461b4685bd688ac0400483045022100bcd8f3ef691c1f4b3fa7c0fa1c4cfc0ac54a0b35bc83e3104f9c045dd04cf8ad022023d6116baa1fab62f6b24270c423f11e203277ef5015c3ae2d7c318aeb273ef401473044022044fb0813869ec818dd8e6409fd830c1a918df645d7e8460f2c37c37fa6b047e602200feb96b15a1d429214896aad4f54f0656b5622c716e1d6ec6a884fd9e7f57e6f0169522102b8aca2c5156d057c2b0622faba3a545d331f674eb64efb1ca48bd5f3c61d6c7821034850cea2fd6675d64781fdbe1e2ebb92f699e6138b747936ef100f348922056521038bfcfcfd657a404cc177b77c14e10277fa167556b26cd0fd045518f4781a69ca53ae0400483045022100afcddef7792f442b134eace54860e38bc49972d3ac16cae3e177226530bcfc5302203ac81298c333fda29b08319b487f75cc50cb9f0418d813ad50e6bee3b581b2b001473044022058df8e7e74bac22b3508a731f9d643218132aeabfdf6cb80161823ce64b3ae370220057591d9e6316bf446cdbc9c6c65fd27b0654f54f7756335cab3616ee46acb0e0169522102cabec589973a637e505f5fa1e492797d1eb59301be9609166a7bbf1a33a4c6062102709e79d0403cfe507f91d51bbfd4043ff949e797fc280f740f72438905ca8252210374983df2fb70ece5ff24f22b5bc2282ee0ad4cee838b9e17bd95abc5fb0519b453ae0400483045022100d5bd1a0255d974e3f106ca5899fd05d2137d6ccff301274ea31885134a104f2d0220611d628236dc7391741a8c4d2ac579c054b8f6415e2fdbf4751aa87bcbd0c19d0147304402200ed30c9125560ccc1f5c4e06b7bbace3e54a26dcdfa463495984953b08188aae022004970016ed404ec285013656354476f443dd9216821bdff653f91c54627231d901695221028c36316e3f0806e8a8b263e6c901488797f8275c81ba79f4892ba4c88408e21e2103a5d1edd164f8e9a36e931ea4c53b0e963d9493b6d8ef83a3e50222cd50303a402103efb29f17c2f73dfc590bb73cc1e7a001ed4fb0cbd2a083a207d998e0f47c166253ae0400473044022030f65a920697d42b8b80d54b7544fbe11878eed57b9d792ea52345aa6651a3ff02204486891a793f00eb766dc8f3d04559514cfbf45bd66acf8844d108c8a18c701c01473044022009c0eb517d4116b4ab2c4002dacbb20da2e5ce114091c6e890e090aa5fd3a76b0220384d360dbed3736f238817eb3ad5e4ce09ff3806a71a66f737b56111e752cc3801695221030f8785126660090c189d2c9324cb21f9ff1d718eb3f44ea3bb3decd090b9db0f21029968bd3a9aa5d8d1bf99fb20671da724ddb1ea7081e5eaa93c7e502016380a922103084f7027f37535e8f1281a2e2f709c92aea2a4721977139617740a822d946c9c53ae040047304402206694aacc84fd5c34dc6453c7feb28b90b91af2fb7d91c5b3e6746d2ef953461602205a1606d38771dfbdddc3ac71bdc8b16231c872fdda3b702eae76d679b50e3ba60147304402205285ede6e18b46b3f82c3be37971a6165fb0e4e6630734b05ceba5eae03d450302200c8d0d5f8715a7bf52ec77d7f304877ce5073ee5243d9bd6968cada248429c080169522103bbfda4184edc3667d86371fba8d91e8d149d1b6d08609ff1a469e07b5c5006362103bafc305dcf3440d466937f79d10cb6fd93391bbc00003ae7bd953d7fafa3338a21029db7cd13b01b6737480838c78480d025378664e86ce8513b5c6078e11ab2160b53ae47a00a000100000000010128ccbddc0c1346c747f6d8e356796c3f05f5ef3317d3b9c1d89ff2cfe9e72f7e00000000232200203c5ca226c6fff6646c475d7e2ece190c3a770391e8b37d870f8b5243a632cdcaffffffff0258290f00000000002200200e7c24765646ced46abf1946ed117881218177e2da96c6369b5d4d971b12e7474e811200000000001976a914cf7f6bda041b99c15281ccaeca18efb08a8b6b8588ac0400483045022100a0bfde0ccff41c3b3cd060cc9916ffce4fdb7893f08b22c404d49a260875cbe9022070a246b4ac466606488790e89ac8c6fa50d04e3485db5c0d9ce9307c8a401c170147304402206bbfb5fe1851a9ff7e9b968964a47cf4a06fdc59f14b23bcbc527432a0cf5fda02204a9b591d77ba0d69c50fff20aaf00219705806044378b2c1634ef94ab28d939b01695221029fa0d95fdcb4a920af1671afe9de5282977a70ab4b5a5c352a6868f413cfa0692102d57bed65cb4e67b03730a2d4f933c758b70134fe8ba9e51a8cdd3643201379dc2102fe964ee4bbdec853b67a09ad05e9fcebf2719be21ffdc192c767d6f376c6cc8d53ae0000000001000000000101f6f28f28d1282bef2c4c6a58155cd200da71fa6bff1c5f82d90aaf50117d0f9f0100000023220020c5896d42278b964a5aeddac69596810a98b59bece2ad3974afab368074b89b98ffffffff0269aa0a00000000001976a914fd7653077d2ff13bc476d8db0d20501d66c1277888ace500170000000000220020c757cbb36ae9e01d58314c6219ad3fc3c8ba7950337cff9ea0ef84dbdaedd9a404004830450221008c432d0a987a716f3178bca29ddbe3f72f73e9ae0ae991cd05bad1ae8c8da957022030e51a4521a98bfdf4cf41eaf7aabcea35015df2e7c07c237f11c43773c1f63801483045022100a022bc4d74c1bd7a9093405b618db154c0177d5e122db166e7759795e167dc0702203e924009b32e04dfe711e6c04901d0a1910f9232a85ed1d2c0843a9c77e12d15016952210260f50780688c3165740649a99c30790fd33c8dc7aa4b8dfbb67b2507c757494921028ae720bbc1f19f8ec9b1002f1be753f5ba9affb9ab7ac84d8c3d4428f341e2be210347817f4ced927e6e37013bff63bb375a018ca87a72a6426bb067eb641c59d79e53ae00000000010000000001026ff4c0d90ac8b12d0d5b128080a8abd0a559121dca8edef160fcf879bb92d36a47000000232200208ea20467833aa49eb4f9fb5b26712259e4643ce91b8eb42b92be472b3dfe0590ffffffff15c663b0b14a7a645a1a8bf0bc5a79eed3f89fe62efe0db37744033b0e5b8fd7000000002322002081c3e238603f100fed31206e0139aa7cf639c7ff46dcf87030ea74aa5fd3b046ffffffff0151dd040000000000160014ac6259c0dcd8f5b6a6268027c9d53c3bf044e14e04004830450221008e79079ebaeb032b9e94f1c323294e106f84691cc76a6234a47cf99cbd4fe4d402202b21d0a7cd13b395ef2f93726b7be214e998ec4cd2877a872a09388f870d24f20147304402206dde56ef58bc271fb43d9dc0a0e39c5744667c2f214dd13c72f3860af8ac7ebe0220432d14e240ed8dea67e97d83f38072ff1553f0524b2c2ecc0482759eda70d8e10169522103286a11552822a68e08e7ccc9ce07b88698c046f465fbdd6f4c748fbfded4914221025855cfb042ba653f32d7f881c573a904cc81109c6e5805b63b5e6d151a44733d2102fdb9b648b63557a1cf298e9b45d63521dadd36f78c5dff87ac6c2e145bd3258e53ae0400473044022009acab0d722bfafeaec6fa1efb44c742920c77a519883ec2fdbc957fa455159402205c124cc772062022a21de99c860447def532482bd50fdedc3464ea98f6dbc2e10147304402201de6fddbd838cd479d6be535f4a72a44fdcd5edd110e2884ce30e05565ddf07c022001ae6cd5c1c59eae94d4fc29670afe813ed230f4fa681aba6924a3fb51ae851d0169522102d40a7e282989d0566f80214ed9196b57f2e3d2f30b169015a4966dcb6cf807ff2103713ba408c15c7c0ad496db0f4c444c15ae453d031ae3b4e085e5ef7d917c17bc2102e9767791665d653c837479050b19aa3948c7388fefe19846ab0a5d03a3e29a7b53ae47a00a00010000000001075b346232e822b9ac5b84f3d01fc758c926d15249760d9c5385cf9f63acf0f30ec103000023220020242c97048d6f0a8a174d3794e6c6fa442489ad25e1844337c9d64b1c6116676fffffffff5b346232e822b9ac5b84f3d01fc758c926d15249760d9c5385cf9f63acf0f30e180800002322002090336c11503ea4ce2b612e95536b127b977176f0fabf3195d51bae7b3281dc77ffffffff1e18433ee275d688357baa82a1facbda6f639f80357d20ff9bb096358a43a3310300000023220020ad02bf1498266ea2e3694e42941e1d4bbec29aba67de3d123e493a02e9c1bc60ffffffff015594f556439852dd437b84580596cf08faf6f9f58fdfe40d70dc748fbf22322000000023220020a00b8d1373f59f6058b93acce8f5744c611af43563087066e6440b0ce5096149ffffffff015594f556439852dd437b84580596cf08faf6f9f58fdfe40d70dc748fbf2232be01000023220020d2a274425e0ca6e867dde508d1259808c8de72bab9d3ab5690ed510ef1170ae6ffffffff015594f556439852dd437b84580596cf08faf6f9f58fdfe40d70dc748fbf22320703000023220020f46571db93b77036023106435f61381d52d879ae9f4efbb202689e22e7cc4940fffffffffec99e2925d3bd7287186fe8481afd6a42da9d9d4aefd84d632013119e67dd60480000002322002069da989990f54f3fc161c7b560ac7ca8e3e1087f4880da5d562dfe36088d373effffffff01547121000000000016001424e477941227280f200d1d45d813bb1d1e6cadfe0400483045022100e56be84f7b01858f8d7f527543a0175a7c93dde40a52bc2c26e91d7654aecb0e02205bc9490e30b2801b13ea9146bf9ba6346180e3d12f23e1497e33a799039e2ca50147304402207a07af21fab254a75ede505123b98f91f14fddb5bdf452d772d3e5b6f687b21702200884af2e8959cbf6da681d42f36cbf55fbf71b1061019772d116911ca06625e30169522103a007dcaad8960c9ada87b97d191828eee479eb57e669efde55aba48fce3ee38c2103d9713acfbdef88de2c2c920f86ea29d5e776a0116ea29c88a7e1d14695f98e1c21026576b9cf1ebb928a28c5276ada41cfc15f14ee920733098d40d860900f175e8a53ae040047304402203cad8370d9269bb22eebe9bb2f056e2cb349f6697b5647ec240ef5fb82984a3502207f3c6d976bb8eda37c2191ce8f486b334145ff5f27d57a4d49ca381f52f206970147304402205ca30cc02792ae2b0e6f72b299fa394d90f9219f24426b7f42c540cc16435e6b02205dacb6750b4c799e8c3663289fd0a28a607ea32d824abc3b91a3c81f0e3279b1016952210310237419605b1384ac84650d18b549e9fa06c692f62d89c368e1db2858f676432102724f2818950f85840c2369fb078c01e599c785f41b75bdba922402586a90d99e210300f6fc59567c9273aada8482d529006ea0b27375062dac6901aebe538a5f9b4953ae0400483045022100fcbad200ea0f81e39189d072b9e0e7e73fa5e0f3943d731db0c0dab5c29189220220357cdc48e2cf532c65231d9fbb9e2a4903c4d735c8d5ca2a56f488071109771701473044022042751a4bf27bcaedaaabadf76dfa7e584865bf054e5b941eedc016a03d05343e02206a6b832b0b9a497212486ef9ed8f7e839490e595e37fd6ef8bab7c92073d27cf0169522103c1e0b625afbe59387d9d1cffd356b5eec8f0eb8e15cb1be5fbddab362972637d2102d8cb93ae0d8adf60ce10ebdd411ee03798a2497f656de16050d7f5dc668f1835210305b3e74b43706b48060c3e1a0ab05c2836cde0571f1f2909a943a4fa643db97053ae0400483045022100a32f5d3497169a1daeeac18f04bf71cc2659a2ac18cddda66d105b429ceac82d022015760dd44b7d197a494068ca30ab36575a89ea4c5248b091e74163c3d0a28a21014730440220662f751ff203f11cc9d3a9b48e3e9377216608d110f2e43318b45e2615633b2702206d9dca28c19a6f4230518bd5672df5ae6ee5e1ad7d8ffdfecb2c7796cd3dd876016952210320cbf8cc184860b48a8180c563d506931d4e38d337afa6134d36ba704538489a21027f2ba1ab6814f364490ec593111ca0b655508281e22c94a3b3d2eb40b757a1a12102aaaefa2c87e8f58947ba1218def717e28923923584190d74c7cc4786374d06a753ae0400483045022100c45859520b164a126b07ba2a564f64f28746b8c4a2c58d23229e2edf040c7c200220705f0b0a6c8009546abc880e30084d9917b96ca6e8e4cfefba07b022a1f5128f014730440220714486c0daa857e9727651c11aefdbd378af889d1bc8cb23dc2119f1aeee75240220332610be353875ec4e98f05f51a00b58751bb61f0d582cfb5c8d61170fde18800169522102fbcf70a709cec222babc7c0ea76b54d7cbb49e013957fd2667bfaa4e1270a7862102d6696df407bc9aec9d7c35300e2da85ced003f9ba0c2ad625f452befe4381f6921024db95c62bb27245a05a384e9bb1393616f35e4ff49b40bc9cd4b017f02b9a02153ae040048304502210092ad48aabe657a07d08b9e826c49fab5af31986e37bdb1feafcd9acbec0de06e022006d248c2e5dc65446d4aabe2354278da59e0e642cbf3faa7c7c12a83d4db2c470147304402207859cacc3c49eed2dfc3fc0cde14d114ab640fa8d1d3e85fa69922416457cf0b02202135b49cb3a695aa580c371aaa4bede320e5eb0adf7bcfb81bffe57e41ddf0260169522102c9dbf87c4044912193f60b9045ae949aa4244b817009754fe850edbe8549a8432102cf77a0d7e87db00985f7112fc6efa8a272e491bb8fb7a4d1ad5f07b27c47e5c22103facadf2f342a166f4d08c014c028ffa31155e99d982faea4139ad9a3dcaf85e953ae0400473044022078b5de3ed233ac88dbc547da8606c6bb591888fa5372013c9743ddd5fd72778602201617a1a8a257fe33d7b8ab868352b5c1bb09abbf7a9d80544c78dde6b207adb701473044022072f5f5f9a3e545f202765049a06f5b96f7cbdc78ed90d62776d1afbff8ad4eb302200a1b568b7c7241c2218ddd314db80326298a78c946f43cb9c8f76981b109efd901695221037562e534f025ef5e31f059f9b3ba9c710449a555934e05032b1124d7e4779d132102867ccdb3645567934c413b0ea22bb5931a0e62b579d4ecafdeea92f9304050e9210380f3a141c15b8a489d91526e0f5e1a627d015b2487dfb33b20da92184a89831d53ae48a00a00010000000001012d18deccba52344a161b27dbc3d3ed60f39ab221100057eb8f3597092922234401000000232200208cd3543424e3c73f216f78a5e0a8f84557c722e696fb7ad3c99acb1165ce915dffffffff02b82500000000000022002005861663c7380172555ce6bf788ab847b084d9d41148a72c8e947fb6d9e311cd8a84010000000000160014c9f92cbc9889da40c8ed332a6811c8be1ffcc5720400473044022061d7afcc6e70e918772a0ca2f5a8ce7d7fd2a033e3ff5c0bd8878e39e4b65c6602202ee655638e107ed2bd96b134cf9350c5fbc5d7b9ff4208ceaf09def274ba410701483045022100e5cffb2356490c700c22d6e67d6e899d4139d5edaab12f9b6d137280a5ef1d2702201e61383624af506339a2ae171b6946552e74d67cf581e1ddcc109ba57dd28b9901695221020a2473754345c002ac046842add6559fef3d0c71dc35df8f761205931ed4d89221032388bb6e733dd7423a27f94c02395a89064d3aab0c8c1ae6a4b78041beadc3bc210323a6fc61a18b7b31fa938dadbf99b1a6b7ec945deaf525cb5a3a1d4a9dd7fc4253ae0000000001000000000101c8aaf3e791ebd54d184ba383969c585d61a163d384b909e4df5b229a2fc0216f0100000000ffffffff029c6bd9000000000017a914dd9be47f541392d83928cf0b1aade292fd69220087325bff0200000000220020c5422f6e84aabf7093f16b025ebd0de60c8403135e0cca36f5c47221e172116f0400483045022100b9f4f12e7dfb23a924e60ba1c3135539906ce575f98316a6a95f8d8574aa0ca102204c2f85256f105abafb6c7b5397595f79af910bccbd0a9c0d428f4d6cec17426601483045022100f9cc4e761fe3d50b2dbc053ee8f69d9b3b86ebe274bfbcf1701bd1ba2d55845602206f0e8958556e7457b6db6ae185c3177e13fc66f44c84dcc035e11effdae4d2980169522102c734b729cb72f7314873552d719a3c60c622beacd81756d3aeb34f7e8f793f362102cc1d95aa9c8c870e24acb31f0cc31a91fd2ce492da93a218390b4c753df109a1210321bd8b299c172938d333c480d83fc02d22df89df4d801bdf7db84f1e7f76f6ce53ae00000000010000000001018d735cb457eccca6db72fb7b6d767b38de04cc4d5ac744d10c45a642a5384a430100000000ffffffff024c5c0400000000002200206acbc2b909282e4c6580909b848c350485dda5425480a0dbb2b7921951b2a86ae0f01a000000000017a914c237fbd7f81782f38156876ea2735eed5c14514b87040047304402207d92c7a4eb941dfc50eca96081e3df7395863536a7b0b4b51985e5475653fc7302203c98874939c92972fab3186808b35b54fe48432c9cdb0c8283f12e8466e65e970147304402205565fff8201376df1dfdf88d0d26e76abd17b75eca4348d4ed1b638ed7e715650220122a83f4bf55e9c138ba34d810cad201c0b923e5070310fe81c15fee9541715401695221024b19cf877523fbc9b551995d3e35d12bd9a325ebd26750d6c4dd40cea063fc272103987bfdbe3d0242bee3d0efeebf99814c957cd4f91300372a9dce11eec02052842103ee373d0d3417c1b7996e010a31c83dafc1b8d11495c76d35d5a52dc4f078747453ae000000000100000000010172c148c7b1118785b14a40512e78147d4e4c67a140d761e78aac38c6efd77dc20100000000ffffffff02ac1c0a000000000017a9145ec94c0bff6d61e25fac7ce38003701c7c64373c877ec4750700000000220020426d5778f1ed2ee156a02b4d8328db6eb404be04fd5a90c99e482938ba918925040047304402205e4b74e4784cd2ebbb448bd8faef6aa53acec7375b58cb31f4f143791c614139022050599c2704221c757ada3d835167630b2a7e834d146315953ad30e83738cc2ea01473044022062d63f17d0d09b898a65c6068a13f8121123bbe41f713c4e8c8de0631033fac9022013253c096a70541baa63d36a8ceba0e140f7b1be74c60e794cad01f6a82a54be016952210201bc31a911315eb6d543505554d984c505a8a25cdc62bedac2cac0cf9ffe486221033a4873432b658ed583bb05f2af5d02fae151a54b5f6402674944fd15c467f0032103a87c8c624ffcccd5e365b22845a677d05ddc1f443e2b189c6221a9dbb08cfefc53ae000000000100000000010126db9fcc975a257cc80426ffd2988768a95a56666a380fb3e16986a14ad289112900000023220020ad816b3271ebc0a41f8c51d501f81d627ed9582fd2e136a56697250e9cab0cdfffffffff02121a14000000000017a9143a8e17a9b71f17065660be5b69a398c5d9bf7ce187ac382e000000000022002093ac930c3129edf707430de32626e116c2a18a9d7c59be1cb572fa55ac53fe6a0400483045022100fab56cf0d7a111d3b14626bd758cc3157836c7911c0dabd340151529838794510220496c6214e46134bb6364a17746258bb1da5a4ad730fa25a8d0115b72fceade890147304402200e7d9f676443a5a0f4b1687b43f413d0757b8656a2672852e10dafe55f6cb79002202c1fa9202984e6bb30be4deb24e093fa4fcc1c2143c056c1235b7e69ed33f38401695221024280290cfc6b45dca763b7788ff9053d45ffe9655e687e0b60a3b9d53035796b210345c0bd12315f82bfaa41368316f210a974fbcae3c6406a517cdb1c9216ed311621038308290d0e71277434150adc43c45ef30af62c3a952639ea108f4a4bc4adbd9e53ae0000000001000000000101d0e9bcb689a7ac4d9af2d756d0da361939acdd80ad3e048d52c3c8c96c045f5a0100000023220020c37657e736b1e1cb5cb7f4affcdd38b0867b3f8b3920a7636029ba5c80554579ffffffff02d0160a000000000017a9140eaa22686886c2fe2acdfc3aa2a0315560963bb4878b94170000000000220020f135ad3afbfc79795e81b1c5a589673fe8e2277cfd34ac5fd2f6707f17e1132804004830450221008a6871726bd6f388ef771b6077529f9d41ec443dc2cfa7e5dcfd820e0e9e8f440220691efc0293941445070c12cffd0ab8465d50789df126dc7f39fb44f8ba35bb790147304402206e939fd54f1fc28ffd936ca1e63cdfd9c6afbcd0e01c4554ee7b014dc076942e0220204d740159ac2f1eea31c7852b724226fdfcaf055b42b810ac99861559ee0faf016952210228b7415f8b436418da2ac3ad8424d45842d3ae1b992cd60efbd4c710c2ee08182102fb74a055a8b060584831e7b63589083183ca822b09e987503dd523e6452e87fd21039f9c1b27a917173a7634c936b5d4fbd07221059455091038efd890a2903048a453ae0000000001000000000101e2aadfd41b4ce1f022d26a1c04ecb109189ea624594f74204a505de68abff68400000000232200205915a78617cd7d09ec63f469008b2af2d9eab6d0a84f9204b099840c39246167ffffffff02b03b14000000000017a91490db3f5876420e8cc79d3a0699876ebebc8754b2875e362f00000000002200206809305f371e3db342f00109bb72d9fc1e47e57f799c35dd6bbef6d3d5d036e3040047304402204e5eacc6b1adce698f380eba3fe4561018855c9b0726e716f12d37e0be488376022053812c4a7cc96aef9712be56b02681573b2a7e0fca12cf60e82492a4fd89ae15014830450221008a3a3e77acaf42112b75f951f762b048192f4173cff23eccf561ba01d97eb98002206cdd5602da53840abee99dce46918a292e5da4a1afb68d1bf736b3703eb9331101695221027a0e0ccdd4fadd069fba59550f220fcf5bbaecf12d87ec1a4edcf475e3ad653d2102cd01829ed8da45cc94c78531a4dbfde4506e6615763f9769558cfdb2c56decf521034d6874c1d326537bc2128e26f3d68a8e7380e6f97ba95839bda65acc588675da53ae00000000010000000001014aa36793330f626634ae1f86c00163e56214b1b9cc58cd30fe7865c58d75de290000000023220020989523833584984b5acbbf6481d5969a3ff453325d2eaaadfc89005fb307efeeffffffff02e6d210000000000017a914c8088b883297cc20d81276de5beb1a76666f67138796689700000000002200205606a182c9aa5b9d0e2611c6e510008310445a4d1d20e6c293c08900146b31eb040048304502210089cc1afcfeb1f547c723d2bfeded5f6fbef43cfee2b7e7ec780a375d63a8425c02203fe921da8a560bdfd089b58483728ba37e3c90b64d3e08197c919fe95a8879a301483045022100fbe9586d4565a91a6c4afa6a04d98e6df7375f061c45c5d08db160d6881a6f47022035a71aff4c52958433fc258db36899e8976b54222ca04f162a5e18fd9f1fe45c01695221020473a7cb8b90f38338d60ab779073722959b7fd4ae58a6b9b6227bd243ebdf2c2102ee47eb0262da34a6fd6e4d6347503bc2e625f60aa16cd397efd8aaa232f24fc72103e5e1cedd0442ff2f903def936c57eba57f5d12d18805fae07cc40844f308be8a53ae00000000010000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d40700000023220020349525a2ae22cd9af283146d103b2420141a8ac3d075ed0d6e052b741fbffb6bffffffff0246ae01000000000017a9148ba9b35c81f1866259afa52fa258f2b1db016dbd8741a341000000000022002014e35dd23255a520fa6eb176f994e8d59d8f672f4eda285cde0ceae697609e0e0400483045022100e5d91dd421dd057f14a007ad21347b5aec49d857747f76e318dbcaa4db9b8e46022004678fbbc5564b527d1b65ddff3575fb8d0723534fd0eab1ab871bdfbb771eb4014830450221009c357a524897770fa705457a3af834bda58ace634978f60a22ee534079e0b235022012a31909b803a8150a7feab2ead413fe1be1200592b24a90f28efad669b440200169522102dfd218fc63e3ac311dc8cb8d7288e0409b13b995279987f56de93bdc3062d899210327870fe719d9d4e0ab6adcaa400e6baacf89af396382b5b65a5ee8daf1ee38792103826f1442c39da08b1f9085574b60101d4983bb9d48b71b898917fcf0efc5d9d653ae0000000001000000000101589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a66893500000000ffffffff37f0cc01000000000017a914cc132fbc6a1e0b2ed9c2deb1fbf9eaeb7971440887f7c50b00000000001976a914d95ad83456290e36cf80610feda03d952cc4f35788ac00d8b8050000000017a914fdb2f88043732262ed21721e324e467e66a07b5187174b82010000000017a9142847bac79f37447dd6477fea6fd30355d937762787652d0100000000001976a914f2ddb87dd74f02dbb327dbc02dfe90445e515d2e88ac1d770300000000001976a914e5d536a040746e840bc8b7a78fc757c0bd4a723088ac55d703080000000016001458b67a661b1460cb1eb0206e66a405213c73f59dc7a300000000000017a9147512c3c484eeb9044c266b3f073f8a275406d56787b83b04000000000017a914773df5f8f33bb59d9084fc701d0484e2d7d8f4b187892d0400000000001976a914dfcf5d80d850ca1e41bd707e00efa0a661d2006288aca0c30a000000000016001463a7caa5ed7c0de5f5a831c31c8461cf655fdf2b8a2e0100000000001976a9140d8fe50d0facaedc28754ab2aa6453cc94d8be2188ac2d0c0200000000001976a91482abf74e9c2fd752d2857cbb384d7d70ac595f4888ac6c6700000000000017a91447f8cf88bc16e59474a925f9185c52f8279ece38873fb60100000000001976a9144ff07054020718f0d98e4f8f03fb8629f952842a88ac426a0100000000001976a914d0f489d7ce1e525f54f9165db287f19ff214c4a888acc6ea00000000000017a914943dabc3e702870b2b285ac60ed163c47a7eb33587e56801000000000017a91473e92f454a8f42cc0fc673a902a0ab910db8b36e8716e00c000000000016001465253ca87747fc2078bf888f0424eb6c884c4fed00840300000000001600148d3d7c0065167eb2f147fcd3f78430860cf1f03188af2100000000001976a914e7ba534676eec15e3ffb5c68f064c7068d5348f688ac8dd3040000000000160014e0d375a8f59d8dbf303b7e39924a240aeae801dcae5e0300000000001600145fcd046477c273828fdc5d103b0acece07a2720d1bc73900000000001976a914b8bc19380d9963f313ad2e4594d352187baf626c88acadc200000000000017a91474fc22b2e380cf2b00fcbdc58f949a702f8b23058781c900000000000017a9142b04cfea6014fc02651f700daf82e3291aa73b2487c82c0100000000001600148de1f8e970c4feddcd0de0e4082e02880960313460330300000000001976a91462077e9a16376d47d499f84d8850ef4b962ae99088ace0ab00000000000017a9147e1b99de0aa4608f94df8ddf5fe8716da57cef7187f45d0300000000001976a91405cb40d021b9003e2f3338ab4dabb12bb46cf6a888acabb601000000000017a91496a30f061c7e6cdb7b86c3d1cd95aa7215ba5c0d8741e904000000000017a914484bf7ae95e7fd4e122f9534aa551b7ce7fd4b7087b3ac25000000000017a914a227f2af162f21bf678d91d5554e6472addb194487f79901000000000017a91475486e97702a2a3b037d9c9b48d33d9ad0ce8c2887fd9202000000000017a914561a969badeba2d410902408f0aad9bc318d8eb487fd7c0000000000001976a9147d104dd9d88d62a5709c3d82baceb23701a0944688ac51830f00000000001600146324bf412864e1c3cccafa7cf36c8bd69f373d7209cf0000000000001976a91436759f8bf1a174a92025bc804a3d1833c2684d7b88ac0e574300000000001976a914bf2bb0adb2d22cf535ac08d1622812f68c22cb0888aca10f0300000000001600145ad9856e38dafd49c7b2b02a947438c967da0702d20825000000000017a9141e4c701a916e13729c13dff8db94b49e48ce6e2187e60f2300000000001976a914759a73c0591272e9ab6f01ec5b12177322e49dc488ac3156000000000000160014477fc4f8a14bf1f3ffe1342b145233b71849b5ed9aac00000000000017a9141058e1a0dfa47dc8352767a9ac9db6934ccfedd987855403000000000017a914617db28ca649fb1688614c41f379c1e82188821e87e7b02100000000001976a914712d3dd9014d9f8c21a5b3e50f07fe0cdb17be8a88ac1eee0300000000001976a9143d61a5e1411fe59831e190233629170febceed7c88ac2d750e000000000017a914d8e07bfea9beb242e9b0c09a2679b3683050086c877b2b4300000000001976a9147a585b2752683b8f57b0551878cef2aeffb35c1e88aca9d900000000000017a914a88f46f5814f39c93c0c07b6b87cddcd035f957887d06105000000000017a914c63126b0dab2246ef6fb43e519136daf67546b2f87854124000000000017a914bf3debbfa837ab09c556865dc0620f36c3e0866787d2d00000000000001976a914d9950573f3a0d5ba8e4fad0ac4692aeb7dc5947388acb66628000000000017a9148cf3ad565d2836c34302ee7badf19c277c34ef4a8746e60100000000001976a91444e39ed8584a07511a8aa6898235867ef4d8b98688ac02483045022100df25c536aa74dfd95f816b358ab4bf606c91a2479ef32721e46c1671958e7585022062d6eec488087d4b489dc050c958a2f2b6592ff15bfb96a0c4de8a1d092c864901210284a91cbebabbfb9a9114e423910e2c6a4d1caa16fa37f5d4ba8b880f44641739000000000200000000010173dda8fce01c9519462a2c4125dcbc7f411607bff84e6fd9e145975a66de40071500000000ffffffff01b7ce04000000000017a914fc91e850b207d3677a7b86579e8089ca59b4fdec870247304402202f3784ac3c8d3a6329608ca6a615f54541dc429f7f46b1e85114d3808b4e16eb02200c1a8a77832406e469daa9841e2a545ab995c813183693cc865d8b2247806d7f01210217eeb383968ee82b46b6b1487be2741fc1afebc3e64fdeb96267e39ff451653400000000020000000173dda8fce01c9519462a2c4125dcbc7f411607bff84e6fd9e145975a66de4007260000006b4830450221008cf9994301c696edcf15fbeb23be2c7b7b6b243b581bc1350c7f1e79413746a6022037b4823940d04aaf0d84d5e058ba0a7ab7f27053d9664bc359f3f2bff840d59b0121030a70b6c04415346100ad1969992ce07e1ff8c647409747b44910c1ce0fbe4670ffffffff0221b700000000000017a914cb6554677fe726f83c8b6a8b999f48ae40976dce87bb9a4200000000001600140dbbf014c0ebd098f8509624f0d5a4b415f702a10000000002000000000101e4f29bb38a4a627d081cd2b458d55045c1e56c3aaf0a82f96bd776d7bfeed6560100000000ffffffff0214d100000000000017a914304c1e7e0251a1f6a9f080918d189b036c8164ba8782c441000000000016001497a961f8f7346d6e8fea0f17c844b8910936394202473044022028cba9a9c8036f35c0ae18bcbfe1e21b1f3cf053dd4b22f8eb851acb2ff0a7cd022043aaed2e805bb09e8c9886b05d6bf57db3d456b14c9d88eb565bbe9b195d26d401210374bf461e0869283c3142a187f32063ea99659bc0c308778e1fc3d1db1418bea90000000001000000000104adb23385ee0229b7b26566972b04f9b1352e6c5e0420af15f2f25a94b50041b200000000232200202df8cd679b5e6c4c19180cda095c5176e03f13d6a89cc0d713ff7012cc3aef8dffffffffbea6dffad067eaee7e8b7b3ecf1e96b0ee4d0045229282244f57a621bad329ef0000000023220020cbe82077da83f76ab60873bca4facc34f4c99e1b4f47874f038c102fd60c7c5dffffffffa7113999d1fc5fc61a3294a7bc08831dc937e1b525e56262dac3d6ce25cc671602000000232200202f3cc2940e2764a4909facb042bf41f47729f834a7073d2edf9f75205099f951ffffffff41766955ba9728aa70c09fdad7e2de715f2c8791a18ba53541045d60595f96a401000000232200202715f276fd13b0236ddf5bc583ece19116fcb36d6bbfb6a36415179f404445b7ffffffff02805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b49300086877d1531020000000017a9140b519f87f95781c1d6ae92b28ffad5e5b4f763df87040047304402207cf8c1be10c71835301cdadc83f642c5076746ef968892546d0cc566c097cd5f0220733ee17300833af7b896f5cb8cc0f007a77cb2ae37d8c5555eb3b47a849ab9040147304402204c1dd8fbb2d627ef91a4defa1a62847a51dd193170b4f69097d1daea3e949c1f02204ce61dfb283c614fbbda039b106ea00c4fec069b2726fa7c6e85fe1889f6a6e30169522103686b5215b7e234440717e83eae136da2be7c1eb97f8c2ad3813d4a1b893b7a9e21035d7f16c8ab27103082c8285502582eed0d3d5a8c443f29db9e5283633b297b342102d2e3e37f5e73bde7695c3d309863e8361226b6d25a6fb50d161cea3bdc16709953ae040047304402200a1d8da2935671c0acc3a958063d54052fcb268ce551a395b1af3b9dd2e6034502206db7d92993e9d2d21039af66c9bd31881ce8c367deba8de05893db35542bdf680147304402205eacf978d28431cc442ad52f637a7f5e74752aca277959a0124c7b7ffe4ae3a802206e4f9cfd4da517c3b7f510e71cbc91ad7a3cd4ace54dfe2e1806fc45f3d5a26d016952210237860983f35f8a17f6c2bf69f7ddeeca21e0b1bef1854962836e711d8cc9b3192102dded5c1af6aa987ba156316d2da59a75a3050c954ab5969783f1493e9437a1ad21025e30a9967ef1a37ad7ca8c08c22f1af5e6fe43a5bc203fd4a22bd5307a263c6e53ae0400483045022100a39e17a5ef22b4cbb1dd45c742e29abc6888a78520152a6132e78deeb1baa46a022019cd4c240258566eb1e874e77015a929dd60b7b233dde7676d5e67e1ae72cf5a01473044022034d0a2bb9554c81426226053c9af5d67159fbf60bdf0dbb988d8976fbf53abcd0220235dbfac0106793bba36348b871f35d9e53e7c155d0013064e48386ca25bdbbd01695221021ebc04ffac0ff9cd41e03cd8e36842e71b327a83e920a20c5720019d637d6b6121038468457558efc56c1d899cbeb1a27250115d62cd0eb14df6c3828cd8001419542103a6ade99e88c8046ca155678025fd63e0f8b6ab10df2b8ad34aadc2432b551af553ae0400483045022100fb3e77fa490c83d252a4057dade8e82161e159f39f349ddda0af0c7b1166688a0220616aa07daae3c1f6ba6cfc2b676a98facfb4bfcc07f08b4cd913780b2ecb8a0c014730440220094b07a761840ef8a98828694b138425c4ff4384ef8d666a4644e1287af8081702202f15c77b89b047aa09d5400201d0265b177450b1be6edb835bf48ad4879cee660169522103f6c3b885c6b7f8b3a29afd0d59587ee92fb5784df66d104aab13bd74e06f4bf32103501741f3f6ce5ae25924a3319448417ede14a2d191ce9ef1cfd6a262c3bf6b2c2103a1ae744e0375291cd0bdf3a09f6f3e7a752ca69a784c23cefdf8a5938967483753ae000000000100000000010496984f0a12c0acad2994abd75945b82361a35901466585d5fc0d391251693c3501000000232200202ed7bca248d55165da7f965b2909a8692ccaf78d12fabebec40e2fad786fb410ffffffff049ece2e5be42d9631aa9173901fdd5af6515ed2aef7cb28886603b54fbb7dee05000000232200207b8f0806bd63584e9ecfa172e41209643f181b7e8313e9e438a77ddcb7f76f69ffffffff0e36b0fbe6f875b344272474b4c778fef25817c7461d0321f6c34d3fb5a6b69a02000000232200207a16683e186e2515b75ca002e062b99d3663589ddc4fc9a6e87fa6d0d34713bfffffffffcabf7f82ed32ba67ec36b61237a69955e802dfa3f8353b78a0c0159f5b91383d0000000023220020d0a663cd5335ebe9ce65b09e093e8cc3ab293ff855fff2a5ea14fc184605f5cdffffffff02ed7c2d020000000017a91462bd8a03553ed4444775c7e63ae4d4db67b62d3187805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b4930008687040047304402202a7c5757a5954e719702332eebba91c5ef0c42daa5450b1e9e5bd1005fec166a022038c38dd62a7690c6dddab7774454fe744d61b48406830bf101d83031a428f0b30147304402207dcbb13f89b909cd49bad8500c11e56dfafcf7e38279b6b06dd36df44ce1b0d302207c071dfdf335199c0ddf465706335de256ff7ba2836cc50ccd7456e55cebfe66016952210329656d584ceeb80e5f0a9be191add3154b856ae3e1881373767cbc40ec40ccb9210355a05138c8d84c3246fbaedd8ebb7f3b0eac823ae353e8ec25795ca80400e3f321033fa4cb58578520d262a8b300c18cfd4e62a504e38d3c56f846988593f6b2522953ae04004730440220346c5ca8d7b82275c3ea42f30354f5edb7f6802df5db01db9db9f67905ef6a1b022009e6b51d8138db6a8bd7ffde835c4a1edce36ffe82433ce0e6e40bf55ab59a4501473044022035d9a88dc1a67b7e666816808873af98f386853eccf0691c10347ae543b1681702206b1593d11cf4d92356342469aad2f6fc3367c7c3f5cd64ec7c9ac06e18614aaa0169522102e129976f8bcbfec3b67248b879657a686ffeb095385ad89502bed3c80549b1082102615d0acf3d78f13bf0cb84dd3bd1d736600aeffeeceaa6cba87db97dbffcc314210367fdf960f5c431c5a19e4c45657047c0aae2ba2e337124b70c690bc2d20d124653ae0400483045022100ff6048063384e163d1a247ac45f2cdc2f5eaaae6e05db016e01db90563fad2850220659211978b313582d60a75b18e50f26604b54b53bcc00364074b774931e1be100147304402204271285919dda54a1c0dbc37460c34795239e8621abd8eb27e5582b0a472d55d0220361bc6ea1b71dfba623fb2bc2434cae8ab94e584cbcb36cbdf39e03dfcecc1a50169522102de3c649caeaab909c1e84e2528869911503fd6feded1c125dd7c83102955363b21027fa9431b2a7eb35dc870d5f541e58e119b4d79b933b3f4eaffab26a59131032521036f27188d5db196c72f0135472d66c4ae977d016f86dff19eecb915ab1f7eb79f53ae040048304502210089dc6a3b9883a61594ef183b7a1c334624b7e6f294e948371958bd4902071af502207a81e605884d0c519dd8309c60db2f1d141fa24401f02ed48338015329754a8901473044022002f120cc3d1800e39743ed3c89e17ac2231a2300cf7d31b6e9af89a8bbb4972e022078a72530d338b6466625e655569c246361d4d72d6338759a5aa8bf17e940634e01695221028d397e1fa0d1333798c1fc2a42c2eeea4aa43dcf2d0bccbb9385b723a623c10e21031108f27f9d3c6bc50d21f6c4d58b0bcf15e2b5d79031902bf0b102a548ef2251210295d28fbd09c4853b390b01741146779b498a1e2cc59f1cedb70adb78594b73ac53ae0000000001000000000101391f581d72b536c4b0894fd807cc97720da95ce18c9294dbe5ff4d72d254d8e40200000000ffffffff59c6e700000000000017a9148a8d3ec6a130e84936ad0ac571840efd279250b887002d3101000000001600146822b63856897bc0b6f234436bcd2373f257d5f8559b0100000000001976a9149852671077d5b90105080dd257e04df79bff173588acf4380000000000001976a914636b6af7e5385764cd7394897f3046715bd74d9088ac7a9b01000000000017a914f0ff7de7da0431eada500e6508aeaf79a701a17b87466c23000000000017a914e6d9a519063ac2567313be8e4017e9b61af7d1a4872fe305000000000017a914f765710a2c8fa8e61ea1f24d44925c2fa23161fe87b87006000000000017a914f41d38fe770d6ff2d0cf8fd135e12bdc9b9ffdf587aed700000000000017a9149bb3cb05f9a493d05f14d6f49e861a91070d9c5387b56a0200000000001976a9144b97cc94b63d3e49b8889c20af6f3ec7b6284cd488ac5f3911000000000017a914cb68e7ba4293caafb7e72b70561633d8084ac79b87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7690f10400000000001976a9142633d5f8cd6a0962c9888ab296617a545765be6e88acb47200000000000017a9149e3b91b78d19bb653553c1b6bf8c51d57746d5d38759c50900000000001976a9145c4b11ad11e97b293bfb17243256096eed55baf388ac528b03000000000017a914eee0ec8f5b8ef705ceca73a173f0df6833d3691787f03e0200000000001976a914cfe6ab0a15b7fc52e702f16de2de304d29dcc31988aceff11000000000001976a914d459920fabc835736599bf266768627a58063a3588ac721608000000000017a914086a84e77c13a94f6b18d4279a40562f48a7e47f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7690bd0600000000001976a914dc750ee2cc357566b64cd516a8b5a1d0cc69d9fc88aca35a00000000000017a914b1b18367a9f7143df40acb1eb03060d10d3304da87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a84643000000000017a914761ca848561508fbd332e9539a2976dbe4d837bc8785f202000000000017a914d933c554253ed6e8b818b714be64c0ab3c23061287b6590000000000001976a9141ed4be544bd252b9c25b81142be50fe3c72cfde388acd10201000000000017a9147b0dfbf02779b74487d3222a49ee2c77835fa7cb8772ef00000000000017a914c8902d278b92552ce2fb5fac26c1760383248e03870e4500000000000017a91414a8fb9ce453a3ee0d0ec89d813507e1c4b1fc188755af0100000000001976a9143679887ac2305a3239ed66fee81a45ce12c171be88ac232b00000000000017a914d9366a35692fc2005ab7f87d55a317b4b1bf5313870de30c000000000017a914851a31ba011dd78578083cdeef05f30a8166e7448763fb0900000000001600145e6d25b36afeb612bdf134488a1213b15b8186903b560000000000001976a91497c34cb743770cbd1c11cf4a999b3eeee879e5a788ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7621fc0100000000001976a91462858649f1cca6fa8b7b135c1c005bebf29fd44a88ac9bbd06000000000017a9141ac09a3c6edc0c299b57fa6ca42bd885c6e3420587c1d609000000000017a914871978c6bdfe8fe1daaf9618ed865a8a577f9ff0875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76935c00000000000016001405c637833a49bb726223adcf3749b5330ee148b2e03229000000000017a91469f375c28567d0220d9e2b341a1aa49a7e28059d87d72302000000000017a914b82c5464731dbe9ab09e8612047c5973f13c828f87bffc0000000000001976a9144f726153d8ef4e4efecc2fd5259db6cb6dfe396d88ac2f4a4d00000000001976a91444a3d3f936350d9c1e26ca31e4bc4d63cc23c2c588ace95e03000000000017a9146cb074bf4c4d028f25aca2a7ee7a00f747111f4c87fac5c82200000000160014571e2d6d1470aa2e9c0352e3f68b28f0efbd5a308b4500000000000017a91470f643cc06ba15251393bd5510ba42a907163e0387f6bf03000000000017a91401d37be2e9202a3cb70ea2af8cd931e3604bf17187b95e0300000000001976a9143b29c7be76712529c793fbb212737c2cedf6140d88ac3aa400000000000017a9142677b8db348a2c5d9f26ad7ab91e8c0fd231a9a7872c2a0000000000001976a9145d4db605b4098d383afb6bb7a82105dceff2d4ab88ac494301000000000017a914c139ddcb594dcf755c63c181f728f5519352a69587ac3000000000000017a914a0c3ac3e2067abbe7c445bea87383fb5849cffec87534e0700000000001976a914dc2037196407bd9fc606900770d9289b12cf361888ac619b010000000000160014ffb457101eeb8d5262ff0171e1ac6c2e927f926810270000000000001600147cb4c11ed27d8ee70508d0322b98979168d6f6505055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7631bb0200000000001976a914fb835688cad7dcdeea9581755628aef3a6da5ce288ac60700100000000001976a914395f7e9f9be575cc0758c0855978a9046c08a4e788ac42061a000000000017a914cd5a77ac7741a79e0391859c2f34b0c59cff7a3487ac460200000000001600146a0b62d830da0128a7da24ea0a7c095cc6cc0f06f88301000000000017a91464be69f81ee83726a71a6ae0c8c7bbcc2bef89048703af0000000000001976a914dcc97e94e0ce91885886af252289ab1ea93c8edd88ac58f010000000000017a914f827ab2de46529fd87d479bd9acb29f735d2cf8e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76e022020000000000160014ce2006b4c5661f5c162b5241062e4c70f11d74afb95e03000000000017a91474f867704717a3968e8d84b2b79e226a62f7bd81879c6143000000000017a91427f6a247b806e21e038d60b610cae4c5f7b03cb18774072100000000001976a9144af9dc28100d0e1a2a1639d05424f4708c47316088acd0471f000000000017a914b1774dc11db0c16efb3ded79a6351e2a7172e13087c0912100000000001976a91444f7e89510332d4a496cbee10146f5b5cc7928a788ac1fb121000000000017a914c6cb7c7ea82c5cc04745cb8d2af15892a3b8fdc487305600000000000017a914b2a2ad15aa3c3f2507eadda6942afec72b26c4c987ae6305000000000017a9145b0ca2a97af55467b8a65d720e8347112607e47187742103000000000017a914c5207c7136584971084ce34cf3614972a45b56b287cbbc02000000000017a914c64a5c768030547444faa382d59d54bc1fb5d092878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c16702000000000017a9144fca358cb1be2cc7242c76c988716bb7f40f23c18763bd000000000000160014622ebba0646710a53d14bcff02b2977d191a7b35f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d8d600000000000017a914dfd5aa8487db1551cb755aa50c6424d26f2a14ad87b3d12100000000001976a9145f4911f5ee817eafa9ef89bcd0e9951353d28db988ac384401000000000017a9143a7a344c3d19e6570a9ab111fe68619ab43c974487aa564300000000001600145a8b72aa1e4eb40a21ebf38c6010be5ae86f7808075007000000000017a91413090292c08f2671dca811d97a789cb8c0d9e11d87f339a1000000000016001406517806408256d077d04f4364490845c607d892024730440220166fc7135811011eb1ec68e4256cbdb5ea3fceca5554958c59d91691612a0aeb022023d125f991de6b2f245231c832fd89a47484098d2eb6ca4b06092deff2c91ec60121026290e047dd17b860ad88e54e4f059ed7a40c1e671816a0cfd8f9fb45603852a20000000001000000016c83cae4e235e88f63fce2ac9051c34ca350b444bf0c89ae18264452e6006301110000006a473044022068fd6641569e886aa54ee281a382c90004393f41d24b1d12baf999baddf29df9022077bdb6a260fba66775c9193bb6c461593e46745f7a7f6f40d281ffabdb21e916012103cd6d400459b66da9a5fe83cc1d8dbafa2e0ec233f1094c89fbc78448f03e1519ffffffff027c040000000000001976a9146807e999c3d6ae409df1d0cc9f591d0e7ac0dc6388ac9fe41000000000001976a914343b8071218df57fe1d0adc74a1507c920831e2288ac0000000001000000016c83cae4e235e88f63fce2ac9051c34ca350b444bf0c89ae18264452e6006301100000006a4730440220261169184e7e4ee674d2583718922e75379346e573944d4392aa1f79109fbd1a022015634cb680d067179a71d94c99f3ec9cf369c33c30e3e50ffd1949cae9eede6b01210235de5d16f84ebe60c2dede353ab9fcaf6d7d1e08685dccf6c4ec703455adb57fffffffff0184370200000000001976a914b54297146bb23c2a4cfe353adeaf2435c05c6e6088ac00000000020000000001016c83cae4e235e88f63fce2ac9051c34ca350b444bf0c89ae18264452e60063013f00000000ffffffff020213000000000000160014e145c4a61a34986d61eb257e26d4b101ff422e82d72f02000000000016001488a8e5864068415fa72917a51768c3abdea8f84102473044022075785db168549a58d69a31cc82a5567e5082531df725c9b1d66dfe307098a7f6022052eb57cf4224f897abb2039655fe92265ad3c069e4e1ab9774f7fa5d3a3c0fa70121024f813dd4621c1a1b7861df6d06c8f64d0779ccdba766d3f0d53503bee2b00533000000000100000002d3cce0b65cc11fb16513fee1e40311494c0f279098d45a6dd980eba43f83d85935000000fc00473044022009c4c213d49e794eef551d4eaeca273550c467e4d8e407cd5d3798c7ee6ccb7b022077e23fb43270d06e7573649e71bf472fab96e42be15f436e0e4ea6e8209ac1330147304402204ef6b75a5612c5b188a4f57593850fbe34146ff544305ba461e7d13ddde74d0b022005ebef69ca3c031e32ebb9b4f92c6819ab8d9bbf9f764cf73832555ef01ae034014c69522103bb9f8d3556bae3577ffdf6aafc0c598f9a55cafc39331d92f38f648d640db6c22103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210252fd3a3fda5a44adc0a40f761b919b461ec5c676fbf8d56ed75f928f0a335a1753aeffffffff918d82cb34538d01add6a8308f385563691622f4eef164839ed8e809a09168e101000000fc004730440220630de7698b5a5f81da304103cff2b97dd82231869fe8746fe84a18793dcb016802201ec42eab7097282018bc5467a46463e1416f27e3c32f1e4f4f6462af993ddcc20147304402202ad8748fc5bc14b234bbeacaed7c7da2037d05630c0d8f2598269a0b1478f4f002202654e42804d15cc517ad358ec9f3ff747349f371fdecac188a8e2043ac60f5f0014c69522103bb9f8d3556bae3577ffdf6aafc0c598f9a55cafc39331d92f38f648d640db6c22103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210252fd3a3fda5a44adc0a40f761b919b461ec5c676fbf8d56ed75f928f0a335a1753aeffffffff020c4400000000000017a9147da0cf00fea6c91bf16d80cddc8928f0a4937bbf8710b017000000000017a914331eddfff7167b336fd6bee90862c3bcc8a4ecb98700000000010000000245e1dad3c3ca0457b017536e96e2f98595490e7bae67b053c3b2cf60b4077f012b000000fc00473044022009e3733ec5c83a6141051575a5c162b31ab1fefbd510e8f8b675e5b0c5b07c540220069d81a21d1c15ec663f549ebc4e4ccb76ccbe3ca970a0023ebe12f0947068fa014730440220275acc8e3abd16a9f40d88999ec96ae8c105511fa62a706f191dfec7d4f4e80c022039d5c3419f2d089858a165c3b93484e8b1d197a67eddd550a4dc24d2f1f5a5f5014c69522103c1bae157bfd6aca6fee140bfa6b83762b481d75841973422e70bbddceaad60822103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221022777d217e5424e5c93edff94eac69213088881f4a5f22a68df80ac04ddfafd5453aeffffffff47fe04d1692153f19be829bf3194047666b35b282077caab5ff7e23d28ff1b5e01000000fc004730440220031fa20cccc571d8429befa38eb88f3342ccdc360a1909bd64cc4c8cf5055cc0022037eb09888d646af789f1bb1cdcde12d8df987c9b64e1e3240c85a46b2b51a8dc0147304402204f8d7e86e145e8766975854db05e0445744e43aa4bf05c5208b73bd4bcb919f702207e4cfc6330eddb19ff98124750af93776ef34f91d40b2ae831e0ba56c3dc0f37014c69522103c1bae157bfd6aca6fee140bfa6b83762b481d75841973422e70bbddceaad60822103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221022777d217e5424e5c93edff94eac69213088881f4a5f22a68df80ac04ddfafd5453aeffffffff02a22700000000000017a91455355666a567cd40f4e726c5bc958ec7f77f48f087207d84010000000017a91472a6fd7cd4d4b296ce77496764fb53c8b0fa124a870000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb24760423040000002322002041b55b47f29757da3db9dba1231ce11f42b882e2d1f93ee445ff73618c587462ffffffff03a9d330010000000017a91465133a297e16b49f2a49a11bcf1ce4db89c393318700494300000000001976a91475aee6513daeaf8721d2511c5f621af223aad92388ac84cf1000000000001976a91480b1bf6cea94f8e7e8a91085e5130046b178270f88ac040048304502210081370d224c4700f1f1e769df0b768cb09b8808f4f2e2c071120e433f442d3ff3022019490db4658fcab7673122bfdd39c94317a9bd85e87b840aa81f414047dbc670014730440220745f6d8a427fc2985aeb338f1c32ad2dbc97e8ae78be1b7fcbfbfdca3df9e54602205046e61a2c4ed2a0c63b1ae9d9f4307de8ee967abda91de6cd8b9984fa6fa84f0169522103b75277f5e28b1b29b5170e7a55acae2db8757993a087f169fa2df4f01a6075ad210261eaaf7d37466a8137881bb5777e76304ce7c6270432bcfc3ba5b56e4f28d07d21031d8f353a8cd37b0c8c1e316a9a0444abcf169fb49927831da19b51b678c3fb6853ae00000000010000000001025ecf4c56134509c0d2b6526067c6db7598b24acfe926e883047fceb7f20f95130100000000ffffffffbb953ac413233e0d1480eadfc6bb19975e2fbfc3cfbdc57cc7a351bf5a01a7c6000000006a47304402201a26dee77f52a72007785a9ed7c095aa133dd6d8a293b5b10e4722e913b71486022048b4c96ca951ac6f94675f370de27715b87a4ae4761cfbb84923905d17d886870121020cfb554494e13e91e043f504b02bd3189160b9de210bacea1c1d3a889e8bdc43ffffffff0200d50200000000001600145a7bad1c72ae65c32d1603945b0fafc55a5cf4d42a1d05000000000017a91446d5f25db90ce5e11ee4858648f1b04e951f9a3c8702483045022100bcfbd5290640e7a26f22779e227a26ff66c5c0593f71949a0359fd7c7afbd634022038ed5e919fd59e7f97e7edc5c0ff2cff6a865a8ef4ed391379f9761da108a4720121023bcf3c614be666ca94408c1b74cfdc8c58ba0f785526bf9d352f8164d7b76ce1000000000002000000000101afde54c68569294ed665852a74b48da3c4f66fce83de7f97575bdc46c9e4951e020000001716001481a555d9713f01c4426d13572ff4a8b8538fdb3effffffff08dc7e17000000000017a914681a8be9dab2a255a12c6e8bea8e17c8f1752bf187572faa0c000000001976a914adc60e12273d591294a7f13c4ea293ee5b39cb3688ac98375c000000000017a914d1249b7c99e6fee18380e09ec91a4ebfe9b53c1e87c0d401000000000017a914d3b3ccb53910a15a4b58b203f5b0a115e64fafdd87a08601000000000017a914dfe58b07aeb04843182e1810906f6bb0f6ff409787e09304000000000017a914e1f77b02a42124ec4867facdd7ca6c022c90a20287438f03000000000017a9148b874515ef552f225d861ef3f12d2b57f6b288e287083a05000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e04870247304402206483cfe634ae1adf6cd9d74cfd53825c183fd142de1d50fc2c70e8bebc4f754d02203088038869c122a4c990f62bdba023f28b6cfd50bfba1a04db2cb7fa446d93f2012103684f0406a7093e0500211cc99c84f90e46fb70042ec4b25d9dc7a5863a2363cb000000000100000000010132f1611155b590a5892d3ac3aba447d3bf8b81ebb03b10f3904867fcd93f82640100000000ffffffff02da5200000000000016001405da842c73b15bcae29847c1cdf78a5fa5ed999a362d0100000000001600145c7aa406f988223232c66f7d18c6de1bfe0f95df02483045022100a214eb8fae56b064332f936c082870eed89a45b49071ff20d7f162251d77cbde0220714454e025263a0db4d2fa72426afe3a9a4842decbd86bb35deebb6bcdf93d7e012102708dc366e815183ca325bbcb2695575a95d4f63ecfae9dd73564de6c929f6543000000000100000000010232f1611155b590a5892d3ac3aba447d3bf8b81ebb03b10f3904867fcd93f82640400000000fffffffff5735d641fdac0708fa3db194cc727e927ee23497f7700040000ed122edcf5490000000000ffffffff01a0d10100000000001976a91404b1cfb3546430fcdad7f44fb112b12f1d93f0bd88ac0247304402200d9f7762577c9454271f7241e0564c1b3289fd635776746cfe997bbe25401ab402200154621547a0be68c6fc4961f1c3303139b57cefe033d46d38e4a034a2a8c53c012102708dc366e815183ca325bbcb2695575a95d4f63ecfae9dd73564de6c929f654302483045022100886eea719aa3ccff44e4a64526f6898f2e4f55144cb9544bafc0fda58b653750022000e4311c38e77597aad2eff9ab8f779efdcc559c34f8137f969984a40c7d242b012102999cdcfb9a93cbfc7c3e9589e5abf3527d20440eab001cc2e6109c531e89ecec000000000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb297902000000fc0047304402206736c38e3fb7360d19020ad2e64b50fb833f63e39041156722e2481185e1161202206b9ec0fd023ead4d3c8f58fa45417d4429b0592a583d0d6fb026db0e46e29a2f014730440220759b951a5ab4b329501597da6cceca7954aef873a06346b8fe758a0255db337e02206dc8f40d8ec32e071b39531e3b38bd242a08c328ef74ab958cf043ce339892fa014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff02c11c03000000000017a914cc314101c3961cb286dd0d1321e97e58f24952ef87f66e5d000000000017a9142238a5066c2f49e1921d3aee7fd81529071c3e258748a00a000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb29790a000000fc0047304402206178e2521cdaf7b064b2de261737f6a4f93cf22760dc8bb35b3d6e09ebb55d9f022027fad4f84ec0077252877dfbd577332dc737ceed784b9f869c4e7935815337c9014730440220275d927bd046f2b6bcb1870449a335c5f2cb2d7eef7b3a909d8e4fe6a9a65d6602200a132a33f6efb3875bba12bcf65532a876ed2c1e8b377594413b502cddd5bdd8014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff02037802000000000017a914345f0d47d10e3fe574611b3d2da6d1f19143bf1987b4135e000000000017a914ecd79630722e2acce877e6d27e7e7ee6d63b6ff08749a00a000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb29790d000000fc004730440220569511d29a1fc061e3b367b0b80635b66bb3166e4db5d55ec3245c95e172d015022058cb84d01b055b669f90380c5d3ac40b934b8c44a109786e6b0316490879cd26014730440220431823449a266ba5704b891113ca742dbcbe6893f02cf52fc0893aa4644853d40220125e9a776e324b50c6b1d72dda06738e09fe87e595c016b8092d49b2844f0396014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff02490f00000000000017a914b92237e57ed58e3881e61972f32266ae1269368f876f7c60000000000017a9141ec0118e0ac55344207564b84de27cc7c09af7548749a00a0001000000016881199955736b0859e9d254057b7da1d2afb6b470d99f6d235b8569fc5a222b04000000fc0047304402202d97bded89d3dcdca24ebae84cd34f088b8e3fcccc5b948cb268b9b56be4be2002205d286647027a88f470ed11a3d5b03d17dbe36d8f9d91d6797f133260d5aad5af0147304402205c34d8594fcc60213b741950054962b69c0bbe843f5ddefdc39522eb95ca28e402206455ae34ff29c868a0f3754c2356bb95cffc5c420da9aa5ae282f0e2406453cd014c695221025a687170a67b6f202dcb7551ffe6b5869d6993b3dd150f382801fe1b6e1e648e2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222102a5db55abd8c16b47ad594979bcea4b0796c50e28e11b08dfe23063c652b7949653aeffffffff02e2b400000000000017a9144a77c75280658291439770e247519a764422341187200b20000000000017a91447b286add51b4ff87bab58cf9c2f7b48c94ec34187000000000100000000010150ead00895a313cf1deb87cf4ad6caf3a1a22c5145d85c93d2cc6715751c2f0b0000000000ffffffff02d40d3c00000000001976a91441851dd4569cfcfa18c59682a7d68a89c9b0d54488ac465a24000000000016001440fa9148a179fdd76206323ef4b9b1dc03b7f51c02483045022100af2bcf9f6e1f1ea27c7c023c4ab0cb81342e11e28ec19dfc3c1044f39db4d9a302201b5b2ca75991d2431e5ad43e1b6b5e99d2c310be9ef7a4d1c4b1ac1fe4ce8b1c0121034668044499027d909ea4449fc137a121d09fc3c692bc0f0b9f95dc323711e0e40000000001000000000101627fcbcbc3f070dd1a6b0cfbaeca959b6269994c2f271d6a7771230dd686da830100000000ffffffff02ac6a0800000000001976a914a7bca6b7873c96f6fa161791d9fa44d8f7ad691988ac557c03000000000016001494131c5cd1147003e01c2fb6cc27eef4219377ad02473044022013401012bb4beba6324d6a95ec906992436ffd58fa48b3721b1c0b23c743907e022002e729addcd7aac2a277c04e942b9f4b0cd21fc5cf5da0c65806b9befd66faa80121024bf171320f30bb6f470993d54f6fa2da0217cbe1c10e95520cea807564c79a970000000001000000000101a21d4f81cdc9e8d8bb7508505548275653b058d9ec4be72b8d1d0498e39a8f5708000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff0378da0d00000000001976a914ef73d296718ad5207f8d03b568173d2a2e5b902888acc4e70300000000001976a9146055cb4d1911ea4fe1e973b13a9043659518621988acd09dbb1d0000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c0438702483045022100aa13a9e92f7d86a1f35227d2c24888373cee1c05afe5eb4c4e43555cc263dc3902200de006cf4a3e19d1132e395dc233eb02e2f4e256c5123b0ed05fd67f208e2fe101210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff000000000100000000010123bed277f01b15df38dc214cb5a518b3e4736294dfdf3ee76e0c227abd6a0fd90000000000ffffffff472ee90300000000001976a9146b86555cebf448b5797526bbdf5cede794b1f64a88accd6b0100000000001976a914d52f5c041300954453b0d502c486939082f8d89a88ac5a5bb500000000001976a91444151ac1f9f30f857352bbd68048c001b9df43d588ac18dd0000000000001976a9140df766a0e7548839dc74a18d09d6bf0edb4fd6d588aca3ce0000000000001976a91462917ab3c7ec3604f31028c153155b7341ea794488ac7ae600000000000017a914ddaf54e62cf03f231cff1d19d10c1fc789746ef887f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76bbbc01000000000017a914e436b9bca58259edcaaf0aeb03a4f28ebbcd744e87f0490200000000001976a914041ad43018f699e802d4493982596c63f0fd67c288ac4c280000000000001976a91475134b2e0a3e523860f2c30c2741e64c8282cae188ac0abc070000000000160014f0f881fefbe36b60cac0573e0870b97bc271826f4dae01000000000017a914ed0de3eb4b68c4bbfba05b8dea96d549afb93e0787df1a5101000000001976a91421fb47fc0462085188e61c56ee05291da81a656b88ac4dca02000000000017a914b71bfb68f9603fbe09add30daabe5278155fd9d887a0500100000000001976a914f0e102b503c36c99119472f907d46593dcac6c9a88acd71c05000000000017a9141dfb257d8f308319017076b13b409859c0c3cd1c87d06e00000000000017a9142c30bb57cbe9b2ad1f7d0a5995815cf2bf2ecf3b8790c80000000000001976a914b62a14e705a63c0e2fce683713f579a421f296f588ace1ae0000000000001600141eb731a80b190155981cc6afe9c98c6e60c44ee5062b000000000000160014b5d4c14ffe93918afc3b6154dd9400dbf447f2231ab504000000000017a914117c4af63a4ed199275a60734c9d078b07096f7d87adb605000000000017a914782064318bad9f9803d804340160a0dffd901e3487cf190100000000001976a914f883e430d94f0461d6f5c5fd149587186f0462ef88acc5470000000000001976a91478fa085dbf223ba7c22a5d4f63f71ad1fb1db65088acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd761fac0000000000001976a914d94054f4ad4f863413c387cc0958be0d912bccaf88acd96f08000000000017a91494bd5d0b7f7a0f8e6d1293417e01b319aa0eee9087624c0000000000001976a9143f41ee52c9d11b099144896ef957faf268d262ea88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7625d301000000000017a9142644b3d2957d1dc17ad3072537d3d660568ec8c8878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ef150e000000000016001434198e6e34a99ba6ff1d565f124517a7ad843ff19b5c0300000000001976a9141f49fc27bfba8dab8fe3233ee7b8253a00cda35888ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a66f0600000000001976a9147f239e088b05001d44d68a0357c5d4639587e3e588ac9a500d00000000001976a9141cd8f680cf7ffcfb45501b76b75a345592aa879988acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76be241f1a00000000160014b8334b364ef07cf96c82394c7708f89a7e4f6104f57c0300000000001976a914c4bb8ac4669575ba22da3b93e4ee451f82cec75388ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ccde0700000000001976a9142bcfffc077fd0b25ae3fa0b9502125a89423babb88aceedc04000000000017a914ade0015514ba512634bf7ba4a8bf554aee2b4792872d481e000000000017a9148f35554dfe0f91332fa7a90ae25401aae8a22fba87a00302000000000017a914ab8641d446c11ea844b49f5c6c8cdab2cc2488fb87d8d600000000000017a9143aaa0d3674a7e99c6af69ff5a33272507a956bb3878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7657e610000000000017a914f02e26e8d2c4d5789a28724e5169b027380a3d0a87f7f205000000000017a914e45f97caa316fa6978b61f0a038819e42f0f18b787242b0000000000001976a914d250f34d44db57ffcb3cec307c38251f97c80fef88acf3060400000000001600145d827a9cbdb704de6f6f051f78c5b82d0e1d8aa509dc0400000000001976a9140ec691d11d08d75940b9282500d1a547c059dce988ac74690100000000001976a914fd2805a61e7211385193ee7e1a06d3ec179e933888ac94b906000000000017a9148224ff96d2506197efa0daf06ce5a6ca1e9fa84887ffa706000000000017a914be48e82a79a9b4c65ef585c9742ea7eca55fcb5c87e96306000000000017a9140c0c0cf112ee116e18194949cb04b284a10b7c4b87403200000000000017a914a85e868196bac87a3302dfca467127be073ad253878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7662f7020000000000160014d1085f76d3f16d87d90ac8fe71c706e01957c534e0a501000000000017a914e68d5c997f1a4bae53183490ec5da950b3d37059876d7c0300000000001976a9145071ec9cbe23dbb21db83b539dc5d84c84ca835788acc6f5200000000000160014f854b4bdf6741f7d55576ec346de9cb165ee3aa50d5600000000000017a9146d68d41c3ef5c4d4373631ee91c7fdb8b9234ad987d72620000000000022002081f1de78be3b7ea643f81a4504713ad59015473d252d5219752cb7a6f193a797362d01000000000017a914e44398b521a7efc41f8ef94bbf734ed58d72afbc87406700000000000017a914d5f6c019b1f7b7a5dff0fd1a21dfed7dcf51774787196c0000000000001976a91475c8a8dfb182f39dadc966add4e1c6bb225ff81288ac4dae01000000000017a91412c5c905848f6e03a204bdd2e8ce1c6924051c0e87072b00000000000017a9149f23856a254304b1ba40a543dd1d53e683090a9b87c80807000000000017a9149595f8abab48ed3ae2d515bd8d7a1a5c5b1e36e58792e20000000000001976a9149f096d88b4bbe9bf6dd8fcfb361d954294c86e7088aca6c90500000000001976a9147bd6b9ad80266cb3634fd1c2709312aa6f89608488ac02483045022100c62842dc3cc313da4cc2c1bac1703ee89517d88e96f576f5d27f3125fd149969022061b47c7a60c56d65c8048b4fcbe78c9a1a935488063e0f4f4ba246d55a63d5d40121032a2eba978e28f6d47fff157c5cafa1ce1efc6916da7acd864f07d503013687fb000000000200000000010184f0badff0810d73897b926898bd7f54a5fd68376d839fce97716ca59352695c1f00000000ffffffff0193100e00000000001976a91450c64c785f6daee2d06302f0003a74facb4263b588ac02483045022100ece5a87ffb9ab7f6bd44f3d7bc714dfdc8407e0ef2e5c394189017877e2001ec0220143e02e02b4dde6c0e4c7f37bfcdf7fa82a1a991e16e4b08a770779a56eec8560121030eea0d89c002081f18e5d26bdfb6c3a90d4953ce91ea1b966f18ad13d4709923000000000200000000010184f0badff0810d73897b926898bd7f54a5fd68376d839fce97716ca59352695c3100000000ffffffff01ad010400000000001976a91478eafba54181d0629c311194a13fec55b657c6a488ac0247304402204619e1448044d520747b77dd8f7db8a9b1f98dbd48ac9f29c0fe9efb8a1cd678022012ea6088052d79e35bba257eb2af7a73de5b2c346771f2233a4ab500440e5c08012102be1b5a18b8d270dbbea8a40cfa517349816c75669268039015855b1713566aa400000000010000000184f0badff0810d73897b926898bd7f54a5fd68376d839fce97716ca59352695c450000006b483045022100a5a4d984ff1b8783185613fb41120142872910d33306d0e9d02532d25de4b6500220409bc18915933a04690600c2d7aaca99f259167bf45128fb24bb581458f75a8001210372885eedee08dc1e84c5fe00eafab5d4ace19b9c4ad3036cc98793e0a60fe0feffffffff01cadd0000000000001976a91484232b84eb51cdfb066d034e0449e2522b1c8fc588ac00000000010000000144dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb370000006b483045022100bf7339cd12241f09675024a17d8fa235e2b726214ce8ec7be7061f67d5dd9a160220493b3250dbd188c1211d6c4c026e77b3222cf577da7c32b41323eb1afaaa2cc90121028c9d281579d0149038bd9e55c8fa5c692d0b7d9eb088016d6d05c88025c142ddffffffff018d750600000000001976a914e48fcd28d7d7d8adec59c03973c6ea71a004e3eb88ac0000000001000000040eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e14192b000000fc0047304402205ae641ca8a6603dc305db76eb6a26e29d72ced46b8eb92de017a3a3aa170d67e02205a1bd7e5744948ede96b31f14d351852e3edf13d75f7ab49f6de0a0f9b9cff2a014730440220753fed4a6842b45538a2a6ba83786921f4bcc25f1eb578048abd83bc97b784c4022008ebcb65a35679facbf3535403eec15041ae0842dd43e5a7ac643aedff1b47f6014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff0eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e141932000000fc0047304402201af6a43735a18dac84fcf12afae0d898da409e4265fa0ac38c46e666703eb71102205d6d2090bcca8b3341dc1825dea4a29628c1c025347bb254c1490539f372c5da01473044022018c56a9060033e477c3ab349f88f858b5a65b0d186ed46bc2c5b61db6381084f022061528be7cad1dc5707ea822c87dfd9d887cf313f036e10ba41e88a34d1aff922014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff0eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e141933000000fc00473044022048ff5eff196cd39b09e20273a8faf457bcb5bc3be27c0bcde948157a0fb50de602207bcb229c7e5d652c9be7c2d7802e34cd48ce606820786b121ba8f4f780c12f7c01473044022037b442a5615bcecb0a449566937e461ac72a45d34b8d637260b13b95729491b502202d6c0f0f79261d7e3aca06c00f552bf002c0d4a41b9a99b91f33c36e78566fea014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff0eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e141935000000fdfd0000483045022100c07150def762d9b731be3048320df210d08e7ce1f307e78225dad1b2c48fe919022055dfa8bcd758cf1d4ca49763f6f8787b45230660c1349afa35646cc2edbb38cf0147304402204a3a090dc506ec175c2f0c71aac335fa8b439d5fdb067481ddb0789d5f1d04d1022050444a9c9d9cdb1acb19665766f1ec4f4407ded6fbc5e65653b8fa3d024bbee9014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff027b6f00000000000017a91442495f0ec7867713826c410200e54e13e1024a6387a0c5ac01000000001976a914a4b9c4e3dd6cfb9e233a46aad7407b5493f6647488ac0000000001000000000101a6b668880d65628cc72e2acaef44c5b08ecc4a1783073cbb0ea9a1361aee74b40000000000ffffffff4fc08b16020000000017a91410df953dbf4e1fd850ae1b95391ee3576e98fcbb877bac0000000000001976a914c8919657e75bc47a8a26d44731e20c908361818f88acb902010000000000160014b8e7d87332db6012eb7ac10f5090d820a6e17aa5ff9202000000000017a914e485944fec91b78ae626d7322b7a9f8e2930878b874cee0200000000001976a914e06810bc483463a52735fb167ff702c71017b15088ac683c01000000000017a91421458301c707f31f9c8248b868095e67463f158d87c367080000000000220020f019719a81596386cee79ae87d18556a902a96068a8f40e585349c76526ff44cf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7647a419000000000017a9142efcad77a36889bf6bfa7cba9cca1720c9930eb48754450100000000001976a914b48943ae4a3b9e1164c974310446f50a1508575f88acdaa300000000000017a914a6a0275735537cb85fe17655ddfbe8adb25d844c87b5690400000000001976a914e43771b3d9d2d70ab920bef16351bb486018e5ca88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd769a531900000000001976a914000aeebec0672572078d4dd29464586631511c2088ac480701000000000017a914c408e9ec4d2f7f6d6b1163c726cfae8c0d1c8713877d6700000000000017a914cc0ee8a86a8bd15dd5871f9ec2fdea4f79eb019b87fb7723000000000017a9141ef2724df79d08c4a6cfffe9d8e881fef1c62fd08757a71700000000001600144d0cacbc1aded2a24786193542dc82a3710ba83bf2123700000000001976a91442556aab3b4b4800e04d87bfe8f99992694c851288ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd767e8012000000000017a9147518ada39bf93b36bac93538c30edea2cb8c9ce387f09e1a000000000017a9141f4942c3aedd30994a165a40a014910047b20576875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b4470000000000001600141667c22ed99f58c4c4a363b25311159cfa9575c2201705000000000017a9148c484c7b04a4f64902c1d68a313e44b5a5ecd3ac8735eb05000000000017a9149be2f487d280a6ea18576ce758beb1a58dcbab0387863112000000000017a914b2f9b647c86a9ca826de3f518180871f22f19b2a87bd3f2000000000001976a91409bacc51eade9bf7c93b0e96cb470ee8af4914f488ac4f090100000000001976a914b7e946a345f927d23a0cb3d4315a496f273e5e7b88ac282700000000000017a914ad3a0a179da4cea12d7e2124af0188c39e04e697878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76bad001000000000017a91404975fc6b5b7542fc54200ee1fcac21098edf9fd87e47a03000000000017a914ae66510fcbc72469024e7099cbaa3fced1d4e4ea87be7813000000000017a914ed2477b23cc5c37aadbe5fdc71f8f43b02ca7ff5878fb04d00000000001976a914a6d57f05c49852a4f92f10381327e62d17c0adde88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d8d600000000000017a9144fc98f68ca7aae05c1afe70cb7dc7dec036d124b871124d50300000000160014e64dee5f598a8aa1ab8daddd3895f5cad216943ebc3d0600000000001976a914e31a1ae808e7a1ce8481459fdbdfbf7c8d82b27f88ace7b704000000000017a914f507a387d33019f38c6ec75eeaff5af42698b0c987ad2d01000000000017a9141e1f1ba163cf4bfccdd1bb5bc33e0b39b453beb387d8d600000000000017a9147af7f4d9f9903fda39b612742739049be748c80b879c5a000000000000220020af338a0b34d2f8a6761215c960cb47c6c0da0cd49343aeebc0854677f95ad84cdffa0500000000001976a91450ff5f67112daf693671ac893e81e934a824dec888ac60450200000000001976a9148d2ddc7ef9cc66adf55669cc91529bdd4f3097f688accb871f00000000001976a914e2a3855de7b181e646050f5e68d44023ece3765888acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76cb337b01000000001600147a38182d52e58335908b59eb846e3ef5ce525086317d24000000000017a91419628f99b13a1305ec3eabcfc5950966248d7789876adb06000000000017a914bfcb154c3e92be1d64074c3dcb0344575bb0015d87ff5702000000000017a9141d398ffa720794a7b06979b1fab45a3942df4a2c8762160500000000001976a91459ce934f306f747f02b382357f67f2425d5bdd8788ac6aea01000000000017a914bfd7d3a2019bfcd9563bbb2c6f2e0bb8f788578f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764abd00000000000017a914cb8d6088ed4bb73ad2b2d5a3540ffdbaee325ddb8733bb000000000000160014ef7d2e410756d22c95fccd3c83d2ed28d57ff52067cd1400000000001976a9142e7f50d97719a82ece01830fa049eb12a0e8d82f88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76e7c001000000000016001451f2e822550bfd03718518fe1233816a0736de5c5c2c03000000000017a91417556ce591d96bfcb3fa3f37f34a124b7f0023128717650000000000001600144587f5fbefd913f752dd1fa9ffe77ce29622e7a829fb050000000000160014752d0ae337ee74c4d336adad9e1fc17ad4023d32cbf010000000000017a914e9156d12a93721057210b7605f79c4027a17023987f74002000000000017a914b9cc58d61b9ef4c1afd2c0393b143d8f99ed1ec6870bc90000000000001600143767895daef4ccb1167e9f25ca19253b613af3c0a00302000000000017a9147265424867fcb65ee0b3c1120e0e1a7eb6d69b0f87022f03000000000017a9145fe656715f31e2d26f522982f86f7e4c517d7f6d87a06a0000000000001976a914e64eb233531f4309477826c539ed79d58816a35d88ac4b3303000000000017a914d21733c62e7a52887c576a2d65a3d3d509a68aee87f6b60100000000001976a914a4e60439a439239636ae09edeeeea96f06239a8388ac4c3801000000000017a9142eee85933c279f68cff676fd611e2ca25216367587287e02000000000017a91495e45a3e8fb26ddb99ed756d12983497f520926d878f231400000000001976a9140c50cd2930e4ae92196de58a2eab85c82d65f86c88ac93fc04000000000016001446d141e829505691b6b6268523582124692580ac6e280500000000001976a914f1cccc33d4efcf9c0d5143c16d4e38119d34da3488ac02473044022005658c1894cf051e50b2c5d700a9ad39d04894b9c63e483364bc8e44af0b236c02205d4af6dda2aca0e9c7b8f51258e46b8ab6d962fb061588935414b38491a9ad0201210305c37aa12ffa56610fede1e7dc550755b7d4c5b932ca3571ff63b8505810e19d0000000001000000012b1aa36c7da5b78d1be7c474d2e8d20ff9d60daf12ec62b6fe0684e77d8d1c014e0000006a47304402207fbad4f3cd6afa5340c8f7007c5fe3562f88e5d44a8c87555bf54af2ccef228602207c938c08c98a1c767f86973ecb9dfea191398d25e15acc8b5355844bca05cfd2012103ef16fc074d927e1263134ae423690cb2cb2f1ce1297b8b6270f77b919250be79ffffffff0220c501000000000016001412cb908fada7f4695e33ab07e9d4da98734540d8d55d03000000000017a914ab54cea25146b29478b2e605730f7fbaee5ab5c28700000000010000000001014d5c047286de6c0e8fd907b683281bf34618677560469821e8ade59c3c4bede30000000000ffffffff01a8bf01000000000017a914651e2aae69069582d723a68280efc689f507d9488702483045022100a2b88a4a24230cc8e9c4f222f59aba02568844e0a2b14ef8116ea9b096a97b2f02200213dcda56a476c5a000a6318127bed59a729adbf171adf2487009020aa825330121038a4dea56c310b083b770d49661a0c7c99305737d1fdd3507cd6028248780d7f6000000000100000001e28e66bcdba82fab8dd3a814dfc9f37afa0691ffc2068f1d4ca34876ee7c333603000000fc00473044022062f18bd3f1271c3f96ec173bb21a94cc51fd49d18a8aeab0f4d38341f48e0f9002200c7a9554098d4d226da5f32c51b08866fb43cc1a689d2e5313caa1cc0a65ee130147304402202f88902e3694111ad90cd98da84cd7599d97b0f16eccfe34b54d93fda6d2ac7b0220185b8402fe60c097ae183abcaff9fb8f913a3de2a52dbc2ad85413de2b589255014c6952210268b1659da1393ed8a6e4a25b15cd7997cf45f1bc2f2adc567109b2cd7b7e59e72103e0d51b4913546eb6af290550287c6290a291632562ce6e4d06b6fe8e06ded24d2102676c026bfb976c3e8464eb97335a6ac6789707068add8bbd218c05e2fbba401c53aeffffffff031a1d00000000000017a9145336be8c972f0660d87b7e45bef849b98bb496088784a91600000000001600147912c7f21a754c40ea3b1ffcf78de8f6a7c8d5cb54ddfe060000000017a9145336be8c972f0660d87b7e45bef849b98bb496088747a00a0002000000000101c9a6536052bb49a9f877f3a149c70ef353fec3c3a9efe21a24ab647a9e3a34665a00000017160014631f58cce75ddf4e540ac0f54c3771cba38d1504ffffffff0384b215000000000017a914985663aaf87d85d52c1cf256b2b07170e5988b2a87a08601000000000017a914c48cc4db4cebdcf9b34a7cc510f51725c06b574d878b0200000000000017a914f82ad30d55a690a2b6c700a108ea843f313c3b12870247304402206c84267debe300beaceb2d740123204d07819c8b52101ab3979fe7d1ca747cb902201e74589b34d381ece6bf3559053b50940a92fa20ea1e14fb63b9f4868c6a2308012103d600e9995826ef07adf23eb982fdf8634ecc3264f1592a1574b5220eaa02db65000000000200000000010146885d75ba385602ee00260fc15e51a86e458ccf56b594c22f6bf9933a4e79121900000017160014db03742b66a88f277cc5487f2f5bdde7f5a44d2bffffffff0368de05000000000017a914a8c0c47353eee4d9135d70d58b3a6df135b3c8eb8760e316000000000017a9141e16561839e60f68010959fb19c211eb1225a6568779ae00000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e0487024730440220747bc5961eb56da5cb1eca9ddad539e5412c393a42507bca08227784b3961b18022023cc9722ef68784e1b8b29a3a67e325b624c999fcf649ca0703e9a81b9a364410121031af62042ffac37e17014984a147d32351ad962f60668824d2f99d956c6bb627e00000000020000000001019a624ac763040b3e707a7696a4b5f3696939a75bd2c5bfded0d9b972426bfba604000000171600146d30615a6b7bee30132a9e74e262124aebeada77ffffffff034cc198000000000017a9144c299e895b12716dc4f410381185f44380dbc955872ecb47000000000017a9142dad35cec6234c6006222b80755023697ba2bbbd87c4f947610000000017a914f82ad30d55a690a2b6c700a108ea843f313c3b12870247304402203234ebbe8a1b1e4330c2a62363c0c211fd2336aa59af1fb71f1a9d93760f465802205447223c573825d2fcbdffb9d23cad3fc798c699302c7e160d4714557b3f846d012102c87dd7c367e7812415bedaadbd0e2685ba26f1adc5f15001ac2544308f074e780000000002000000000101baf567521bf61e24b5b4ab9e6e24f31626dae08b48448095e57b279f2149a0fe0100000017160014a01a9170b81999223dd78203fe887a18a1b45092feffffff02c8fd45030000000017a914180abc8ac03647c84f18a29b16639e59c8917e5087080c3c00000000001976a914bad8dbacef824cbf34a6d9f3ae4f954e3347807288ac0247304402200e4ec38f20c6be675abf0cc9adaa847b2b98ec62164446433b8cb9354c1d55f402206ae39f1a8ae88fbee093eaed6f7d04efbd8462daca34977c83efca4de31ad5200121033c9fa5086688454fdeeeb29ffd694f37af120306562dbb64394471fc8b2fb76748a00a000200000000010161e1f4bf282753f6fb522cbd12f746ce40278f59e26d7f9b22abaeb585caf84f0000000017160014e302d736a431ec8c68970b8bfd335fcfdbb368e1feffffff02c78e34030000000017a91408f6668049dfa86eae1c5b116e55390f79ae8bdd87b66a1100000000001976a914ef8a9f415aca541c20634f04dd3543699e0d5fa488ac0247304402205451655b4d001505b418f9c847408324d75b8e3f74117ab049ca8ed889771a9f022058ae89aa7fb2396bf65b49da8d2fc1d2f4413557e770b11f8dec25edee027441012103a687a18736fcac22a96808dc49304065c09bb56ac6352602b83d84bae06f55b949a00a00010000000e11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287604000000fc0047304402207ec822a34feced8a71019254a74239c264d5a5e4a8e06102c3c61f71f54052fb02203f8b166f195546115ea3f00ac1da6e0c5e230d9adff0e0974ac05ba61407c76501473044022052091d210b4b3c49344504aee9dfef6ad0cc4988c0be2efb01656327a12aa75102207475f9c6a98edd78927e80cde60dc6313c0f420f7a9eda4c458336698f8721af014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287608000000fc0047304402207667db06eb8c3e0c8ed741534d628999619b22f79e66a7693b84fbb68e1cbf2502203ae085ee09aecb7ddbb510faac933b35b0527cb1bad3167d945e9df049bcc2040147304402204be755f7b1ec341e1620495bb0f98e946a12b4c6bbe0b4e6b5b836f297f2324a022067a3075257cf9a8dd34a02c6e051f3b12190455f2cb2f4d14103d79c106e6ef5014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287609000000fc004730440220135ab3a2544cc18f000dfd1c310fcbb38eb650403c6af364e3caedbec643a06002204975e4d52a4e89c86fef7829e3ba50908878f22d3d022c74f534f283b7d4de9b014730440220697579e07094419e3028ab4e36c3110d1da0e4be9820ad05ef6a8cadc8c171de022005ea9787c20d07c50493de0915a5776e7da1b8beb848ed4e42b8e057963e90e3014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de28760e000000fdfd0000483045022100fd401655c4b457550742a477503cda37c30517bb21eab27b324c2814775fe3220220269e5a1c62b9a79de039a31da7bd1b032d34ebc13e0da3949a67e4e0073b763c0147304402201b5098a35a49157b1037fcfcf7cf1363586f8c00e4727559fb416fbb3be2d0d302202a66682b594f46b34fc7942f8517c41690c6c68f31639268ba590f7ad399b128014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de28760f000000fdfd0000483045022100a425872d8170a4c95930346eed44a8ecd8c2cc28cf91825b5b3ac640c23165cb02200bf294cabce9af54836f94b0b79e30a9ee8d8e2755020072e939e5123fe0b89d01473044022043b491fb5992a8b292899786fff659d2462d945d653225bed8cc6ee419e2865b0220634d1752d60851906aaa0243310d0109da74b3515dffa2cbae21402945cec466014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287613000000fdfd00004830450221008111d6c5971de5fb6b0eb31ed78adf0b917cc2200fcedeba16f367f507efd7eb02204d64928db4e0160832c911b04ac74b17f8c37ac96299b34b3c8517631e42bd2601473044022019fa391d21445d2c7a6102381cb89dc56f1bae8f26b3771c6842f0272c706e670220015792e6e03786a706e631c12176296d9a9d05556dcd067d4fba813fbdc1fbe0014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287614000000fc0047304402201db85c10740c6b2d555f7ee883f4b9e97e4b67bff73a4307a035a8415a0b409f022014b7e795c841975f05122112e24b9bbbd9e0dbd60b1f21552e3b5f69916640dc0147304402201914e42bcc517658b56fbd775bc6c0651f270fd27bf016b261f67ef5672353e202203c894ee036cd431a76c57b68ea9986f3f16849e8f2b581cef63d897ba3e2b814014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287615000000fc004730440220783d738a645d12b8e7a77ad66fdce09daa03b404ee4a39912f378557c5d08f8c02200399c89ebe8db7211693a7ce929fc7486cf9f422471b42a47641944efc400f020147304402206a11ec5ebff55efc65f9aaa0406f3583feb1226f48a99fb746ad1aed0dbadbd202200c7654d17d5036fa03934d7553b95b5c9abb41a1283752befea7dd2db4e4423b014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287616000000fc0047304402204700979b543416ea0f78bb312f87054b7da6e35ba6debee465e655d359782a1702205de3c29a338b57f51e370bf3a23f3d4851381269f89de6ae5bed43d2fcae2ae10147304402201ffa27752ccc7a58e5be0754b4af8a4d47655347fc504d3bb2c207f0542fc64b022028c9542c8323faf8ca049f90fae4cdb0729807fd47d22e46df02a485946b230f014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287618000000fdfd00004830450221009ab2e00ab8e0e6fbe67fecf2ce2e6c425a938532015ebf00b568490350d088dd022069df5f4f50a93a03c37c37e791f0594a4dc1a839c8f347d527fcdfd07284c7520147304402206e97d4969e63be31803017309f4cb3f7958a5ffdb006674ba44dc825d30ba2100220484256c912f0269e89f09dc6118041682d957a1b03969983a453a3ac8e4ed048014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de28761d000000fc004730440220784ca92459b0bb1efe7df148e2da31f9e7f69f9d45e905dcadf1304c5f02d1ff02203a8b5d6baf9a51dd5c5306b622975ad1049c94f2746eb9055c7c3327b76429740147304402203112f5d4b1e73f471cd1ed2d05f3521d302de0a266e2ee58f88f8266d4fb7a59022010a4c80826e08e46e10bdd6c1370feba72f4cb50ee838b774960b4ff81b1a298014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287622000000fc0047304402201a0a5c589381089397e4aeb519930e8c4be78bd4fff521a2d1c0b13b0e3d5f3f02205e1987bfda730b6f9d50329df19a4bb0f3a271a0231107a362482f90bd7f8f0a0147304402203ef847daac5afe2917dc8e551ecac3e05212eb511e9644dd286ecc6583d876ae0220678c49a6f995228bf76ad9d51477a6b4d73de495eeb4ad4827a251584c24d8e1014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287623000000fc004730440220421087d881b97673d35b2f20454e41b12ab563999aa5fb6f5409391242b743280220365b15d1fbad7c088a3da43d4f03d5235126ec21f6a4f7f66f18e28dcdd0365a0147304402206da230f95605f449e7e591813b75c2db1595a7aaa0977721940f5b9c64eb13d8022039e217404d165f15a0722190a532d54d077bb1f64d7fe10778cf76f340bd0525014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287624000000fdfd0000483045022100eab6d9edad257dfe947fdbdb01f822241dbd6057b7d9f02be8adcece65265454022029a06c0744f44e4bd37929e7d1c8e2cee8fc7d963b80be9444d337cd83f1d9b001473044022073c2e584e67f69bb16e5e30ec42b88c84a1158d45942725702d2ecbe3b38164f02200f9d34e93613693a3979cef13601a55935009ddda48e677c4df88e6b05b26617014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff02e31b00000000000017a91493c186fcf56e5338392a63480fcb4de2cc46d15687c005d90100000000160014463447e36703055083c29fc661ae38b6f08cde920000000001000000000102d38424d976362da3053b9984064bc63fa0fd8e732b9f379a5f11f23f5598ea040100000000ffffffff92cd5ab7a567c570e863dd605de72a4c0d38815b541f6ad3c7d110a58cf897e6310000006b48304502210093b783e9ff9a18f4523e4dca98ccf4542013565adc96d7fd7cfc9d701d480ac802203c7e1f81a46b2254347fca57df1ea4a319a59509c05ba0215db91df71e73d097012103bebd6d6ca204410db9c1565d07ba455cbc35cc09699a67a4b05f1c937796e77effffffff02f80b0100000000001600144da77180acfe4dedc4e35fab0da4ce48d509aa03d04501000000000017a9146d4f0e4072b3bb7eb611aa1ce9a906c36df4d34f870247304402206b607f80adf78f0625e0f92d8192c7570619212ed79af8f4dc911e97d2b5358c0220527a11714ee568d557c597cb56afbaf6dee84ac665d5c798af1e7d3a9e776321012103dd838141602e9e524bb4285884fe427a616d406e2e1624d1cf1f6c31a28b1089000000000001000000000104ed87e049a13f9b4e54329e44a6ae4939e6cb9e4a5fde2188cf50a3373041d13201000000232200209f697a71b0ff5e46bcaeee87dc0503dd763c65607409b9c2ff3ee794ae4429d1ffffffff13fe65b87796b7896d44ecefb0408d120351e4234ef22c1eb1099373f738b51f02000000232200200c6605ceb6301abd079f698e886a91061f05a1eff2b1d588b6d58f68ff8501b5ffffffffb195c19c1f5982aae1cd90f3b00f6fdc34523c407c065836d694ded365c1379e01000000232200203e46d6f4b2a00a159e5a75449200d7e6d688c8033d6886b1fe7f524ec996d2cbffffffff232126449e89504851d7d79b644dadb405f13ab671c806366c813098cd9494bf000000002322002038e1667bae57b2573ccdff82549d29d26029d54c59cf67fa64ad485948781790ffffffff02b617bb000000000017a9144a9b8cb8535cc8bea5bb83be4bcd34e420d61d668780b14f01000000001976a9145948869499b7a1ded47169d7d7e87ce386c520a888ac0400483045022100f59bb38bb3629337fab8c1940beaa29abe93a80ad4b50a67f6bcf7130663577e022075b3aff8944190c38655ae90ab71d96e90034e9ff7507d01eaf4bc4759a040d00147304402207d38c327a830d8ea3cfb8b79ebda1c08a6172f551e03477aaf190c3bd5f7bb83022050dfa201bc17e4fa556042de663b4cd5c8c6f692a0ed38e5a52249d06ae3947301695221038a649fd739986946ebf5f6474fbe9888cc35a62696ab2fd122940c8ecd33b9a92102dcfd18d0c261f946ac406abcd71e41ace5f2f4354799cac181f2bd4b424719fd2103781d5785a5ba852b7ec2c2859744bcd57c9f6c6ec3cd0691dd5dac747ffebe4f53ae0400483045022100e3a926bf424c3a329bbb5c0c9512752fb8561c314d185195e4a0f976a253e48a02207b0869298d21657d4b3597dfe2c2bd457dc45f900dda1cc9cd84c29a18f6f8350147304402202955cb0056b32cb63ff09b0aad8c6303c57fe4090a3ffb09193cc14e42e6118602204830c73bb6d4195f57ed28d7769079df9d3aa70dbaf0b08a439f161408a88d0a01695221033748512b52f09641cb4d7f8003c46823747533714f0eee16097b32ad380d64a921032ac74f3d2350e8f64c7a3eb62cccd04a7528c42f8b90d867b09caec5d4ccb7882102769d9bcddebe8ceb237d4c3424a317d129576c5a086badaa251315b2f03fc58853ae04004730440220451baf988bcdeda1ac1ded426e77042c409de202e8a2b1d765fe4c85947ce3390220016c86e6439caccebe5f25399a39cf02ba796dda6357777d1372e4a63b2a1c8f0147304402202be14c374577da6aa5d517e96eaacb5f6d84577019b5854c72de459cc4fc4cf0022042cee0332b2c06e8a48e4f8d5742202d7c78f5630c990618e4edcca7f5cd40480169522102bb5059ba4424731fb5d50dc5988a469b88979ecf2c362edd77af1963c64cbd1b210308f72f52231b5691d4e0851035c30f3c52decf2d45d2a9758cc02681309fd6642103a295e7aea757a5163bc74370de4a0ddc6e2c2843fa4aaf558308c7c38c670afe53ae04004730440220259bf036315b96bbb9a8e8100a71138c8ba495eb70bc4f1f363f3cbc8f416a05022072b33592e4944989f0ec4527c30150fc3986bf9ac5a5d3332636241b118650670147304402207a315b94279c0287bdd4142b15ff8dfe5ef4b26d1ca7b4bf4ff0dcd1b61b5f800220658aa555c22ef6e400328bb3740bf4aae6eb383f425ade2466e8bb2bfabdcbc40169522103e36983b1fcf5879096beadcee8fa41c161579d1da23269ebca8834c45a2e304221036cc4aaa7c847d19d04a44d00f4e098d765e4132f0de5eaaf3c66288b6380999721025ae8be4b4b4727a01a7ab9f0799b3d115857371bdeef074ad0e666b2aea7261f53ae0000000001000000000104fd2afbb8d0bb4483d6733a22259a9eb2a82e873e55ebeb68f25070b4f1ff303d0100000023220020842d53522c8135caf2a9764188721b3d383250884376357d8e7bbdc44988e2e0ffffffffdad9519215b6ad33cd517d757118cefee4be1988c692904522a30d603059776200000000232200208ce3cf830dafcaec37608cbcdca117daab211b674e7b4830217c95b8f770f1c8ffffffff37b8963ad7cdaf6ad543ba65c040fa0b34f94b9366d569e205ac749bf5d8d7ed0000000023220020a3297215c29e3c9b75915ef885dba40ec2ecb706930fd2126e5d2d97b3d0e4b6ffffffff9ba24e2955d0e8edebb6f747e54e4995c3c0dc5badcca20156fba868c3cb0f4b010000002322002013c20729b5656b3d59518bc0f274661f150e39e362add3e90cc256814a298a31ffffffff0280b14f01000000001976a9145948869499b7a1ded47169d7d7e87ce386c520a888ac2de19f000000000017a914b95ce669a2d065cfcbd4b39d63324c02bd2803ce87040047304402200e2983d3550369777bd8c10c42a67f419b9ddf432822d87908f52f9a3f56f29b022008f1a32834386a35ecae9e5980f0d099ff633d50aabd751bb277cbaa773d33230147304402206524adc31d034c94a3d049488aa66b3e55fc5d602bf6f9fd76d43565826c340302207ed146a7756b5f3422f8190e9ec9257354e5f8790f0a99b660b876025923bec501695221023331ef02418d7f0fc6bf156e4f345346324db1afd40ff1672620d8d62318b863210346fae161ba846fbd883de89d7304fcc7f815ba38b2b4220aec9ae1ef1353727421034a26cbb409bbf9c905d262f69ad056db6ed8a386e0836e73b7e74ed68feaa6d253ae0400483045022100a0df8374709ee2ada78f7d1ac0edf6d62c827517bf9fb3883247a7f559bd50d3022025282cc0d72e521e9cfad4d52b254d089b9c0c1b6317d9ad50b832537ba70b4a01473044022078ee75a37d1d743bcdbfe8571b45bdb2e78a25f87c37954bc7b4e00a730cf04902204cdcc8e98ae9836b54f12a235e881988e7472f383437887af09367db6bd5fd2901695221028e0bfbba853ce2a37e58436f07a4de7a412db38fb92929b3833e3c65a6934588210229982e94cd0cac90171d6e3779b9a5714f449f037fbb7638e5ecfa224e2804082102e6acf9ee9e9b22abdb15c82752b5307e8e782b70091bebae59d007c337844dda53ae040047304402203923442aa29b6bfcdd5af8fc49da613cc76c17273fc8df1f402e5460a1f00e5702205e4eb56822de709b7978bef441edfb36ca0f168d2a0cac1d9687037169d207110147304402200f67733506d875ba40efde2aa9ed751c77c8897c0e58cef6aeed029ba1fb38ad0220188056f1e0aa89b9fb12e62ce4afcacc16f419e7bf526f48f1ac9b9f09efaca00169522103fbacdd6475690213b12593a30c087d383061b42fb1ff87edfbdd5cedbb74440721023cf01a19bcada3e9c77465d8351141518eb3c1e3bcb09047f7fd24823a9e08dc21035ce384e1155a960edcf89082bb927cf421219e2d3bcf17125c460c40c24df6fb53ae0400483045022100f1bdbc8e695ace73683f454a35f7a12a1dcafeb9252cd9e99e4f60976099bb5a02204461d9bfbc91039e0ba8863af087af4d79706fed6c22eaa096f6059074de1b33014730440220726f4e1a92f7add7112014efdcb5b1d664c7e4836810c82c858826d8af810a0d022042d6fc24563136a2815217ef1799798262e07609edb93479883b22a29ade2afc0169522102d2a422255658bb3abfbc7eed563dcb9f67094d9e6c02de7faf4f4fc83ea0b59621020d226ab288269a283390d886020f20a166157ee5866a3625678b75b738f3a69e210205379187c0e283da19b7a713c40184dd6a61c4f0bc2d0ea229b7e69dd0924bed53ae000000000100000001673237e1bc1493821b510fcab4a9ea04c383989c6920e0d3825c53fa91afb98203000000fc0047304402201637a30074de5fdf06bac5b26a1cbe634fb7229fd56f609a82ce76d2cf35a85f022017c5993c51932c74edd3b87214a458716e3374ff745a21d0f766f4646d098f420147304402201cf1237286d07cc8748f3f2f021af7a5ce34ec66ce6b64aaf1ceb7d34f56317102201150b13adc66f587da5f442250b360570ef446c4a9a6f9b5d9480dd07f632899014c6952210268b1659da1393ed8a6e4a25b15cd7997cf45f1bc2f2adc567109b2cd7b7e59e72103e0d51b4913546eb6af290550287c6290a291632562ce6e4d06b6fe8e06ded24d2102676c026bfb976c3e8464eb97335a6ac6789707068add8bbd218c05e2fbba401c53aeffffffff041a1d00000000000017a9145336be8c972f0660d87b7e45bef849b98bb4960887defa0000000000001600148c3d91cad194c9d3984772c54b7ca298a7e63b70d8b7970000000000160014bd12bb87652d5c7fbf99ad39f97bb598a4ebab0f61073a090000000017a9145336be8c972f0660d87b7e45bef849b98bb496088748a00a000100000000010307de49826eb8eafb40098497e02c31fc3819907cc82cca5819a505ef7d4dba270000000023220020d5501380d4b970a1a54b5940309452fcdf1bd5bafce5bf76f520f3846fdac88bffffffffa7a89bfcc5d58f49677555beb4a15b7d471703b47b18bbf3928aeabb7c5f69a4c1000000232200205b26a4e9cad0271ece7f7116fe07a036a30a1f8fade61e1d31e6d1dc7ad8dd50ffffffff0915b25f1f0e554dd5fa70bd51f28e828e1a1f66d548391321f5d9d3461b1be901000000232200203871e4e42829136b119b9787dd025a0c40260fd2ef6bc5cdf5153d9d6fdd1590ffffffff01668110000000000017a914b6f54b5c325ce4cb659c9f58af5c81c32121e0cf8704004730440220566adb4fdede7df3828a6053bc45e836e8fa73a076b5578d84ce24bb17260347022040c19e4addaf716cefa906432e04a5774a5b4d199741fdf152f74a9a8539b5cc0147304402201f2a893a0555c1f28fa03ce594fcc7597f81ee04bef9767b0ac1dacec8b8c7d202202d72b28e63e3e0955718efe855921b80493ad3c96cb0d02e5f2e4bf3918e998f01695221039cc1be229e7c8590b874c93c40bee114b4b1e75dfd7a07a8c251d3f09714e624210360f882b34de6e8b9fe9b63f9d6ef917c1021a6a2d1f2dbec9f3fa6bdce583e8b21033744ded95a58d6f51ed9ab9ad3b27a0f360266d37dffad136dc5bbf156609db453ae0400483045022100f8d783d20b512566f67f8f3534149cf1664c9620edbf1be0e57e6424e76bea3502205310234a03c6272caea077e7099a3f9c3f58e702a136af66efa5afba175d988c0147304402202eac074da183d6d44cf50747057d9686ba56c49de00699caca7852e9de253cde0220559aeae9fa87212eb6485bc148c5f6d0273b0b33e47a15af9e47770e83655acc01695221022325f472264ac740ea184c818c30588895d1c6389637265b980bca5314d136452103dcd231734efcc0d836f115e1301e3acada58e18ffffec559b23f655ab09a9c552102699a5c4536abd6427fb33f2700cb0632ee44d87d8f709b8e3b3a8fcd0d46fa2853ae0400483045022100974f4e0299d18ab9aea7babcf1d61c7d6808bb2f1df5370a77c46752faf9ff3202206f57dcd60abdb2af6987153daff63d6f4be0c669fe81b4fb855740445f27290201473044022073057ab6c00b8b35c90ed727ec198072c8958167dc17b2162fd2a3a4954367d902202b3018f1f1f7d3caeacd630c2e5b6a5596e0e2cd6ef8fb696fa53455dda84f820169522102218f62f016beb16ffaddcd227ccca3088dc8070377c95ecdef3b74508875ff162102baf355a577ee7e19461d9a9ff21086e5d3112bb87f796b6023391ee7eeea97bb21027ed8e2ad2642c1e1ceff2425d0e1488f8dc3f33801119ac4738a6f5bcfce636853ae47a00a000200000000010107818e78d49ca72de37169897addd675870456688ee29ed2178959aecd9237180000000017160014fc1aed55c0a3dbb757bd77f32a5edee7a0a0149effffffff029901470000000000160014f0136b4c003e2e2ae67d1123813da6b25b13ea35e37f5f000000000017a9148723da03f1b5c0b1f7e4e51d548b98cc52c4a10d8702473044022074533ca7dd752ef3aca16a804438c13c4933e941943b6fa2ecbbbc21f0b03a060220704b58e410ca97591a60bf5f26671b319f6b2a137005ad873deed657412046c0012103bf752e12be2114485bfe327219055d5d0267fd173c130ce165e3895de841510b0000000001000000019ee807b7a76122ccbba7d78788874ce6f989dabd1b633c21b09a563a9b14cfc2140000006a47304402200298bdacec9ffee021d5d38d31cc9e4876e96b2b3e90a4c353df7edfc6c21b7e02203eff14c6f3cc67ef6564e3e25740000b80383684d1403f67907723dc41fd199d012102c54fb68286b373d5b1fddd309ba2b9fd28790cd7cc0e08827230ab7dfd0a8b5bffffffff0260c702000000000016001403341ee4788cade6f9c11d5116016522b2fe0ae473160100000000001976a914ed5e2b11ffd61e3c468178a8443197aef890e35688ac000000000100000002bc3a0e6452baf167523bc181f6a21af09ab45f44ad45bb7a34d33dfa6e5a825f010000006b483045022100c8d406d502d451341238b1b9f7971c95d10510ef56613942d131a4a9c8477860022051adc5d9bc0e43a6868678c869210fa4a74db44806fcc947ed8117e4046f52890121021ba1e887427d4b8233fb500e9fabee58bd8b45ec5d90e47d7b1a8fef1a199e17ffffffffcd6f9d989d97f09ce52d5b722fa7e1146388a0619bdf340cff2fe45d80df5523030000006a47304402201410ea9631ecad7d2551729ab5dfc24b86aa257aa7cd79544fa66fb75110c4d202207ed752c611091523421df723274097b08f99e90f918905ad62869e4c3e4dd8b70121031c40c19000a74c7639ffd5e7f38cae3bb4c14622b1188bbe6e3886fedcaffdabffffffff01e18b0800000000001976a914c6699781c26d897e8d339625e43f900ed8ec8ade88ac0000000001000000000103718d90768f7365ec4593dda3e00ee7158296b5882fab7f3257b7bc79c44231f30000000000ffffffffc71c5206e6d9755efd455a88ad56974958ada2c627a9fc8d43d0c21db13d11740000000000ffffffffc9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d743c00000000ffffffff026621000000000000220020df45020e24cee7e724248272b9fea1940637ca8ca2b766c3965e721213c996ad199e010000000000220020e8069c8d86acb0f959df88feccef53e7b8939088cb23cf5c096ca7a03e001c080400483045022100a47dc27fe33812d95c645365d10cb24de439e7018ede0548f6aa08f56ce7241d02203f96bf1eefd810b70407b7f88176c643f1b2d8143c93ca67bdbc0fe93a73f6c701483045022100c4079ea8c275676b589e9209250567e2f4e7fb4c533374645561edb938202c7602201442ca9857edad5d52df50a5629cfec65b48868aabaaef5c96a697c66990ebeb014752210355e675474e86ef3684ecb6ae48ebbda1fbec662c6d981c36ea28129275fa4aac2102924264c4a9446493eaab3d98a21a569f3a80a029b0b47bdf97c6b5dc792839d952ae0400483045022100ae217ea0d040dbee1544df24a1a4c6f4bacab6fbda36ce601c11a6bb6bf40f63022071b2547bde1768d661aecc8742e2c11cbba148f9daa2ae79d1e45d85f0e2498101483045022100a2017e77f565aefa2a007a282e9fa173c193d67f40503e9075c8404ebfbedcd302205b87f6c8db9c33fdf83c506514f204bd153f62d51f01fdc4b756f02133b4b928014752210374f46dc58f553747ce6cec23b2f4e073f8ea66e8c0873b507b6c908def45bafc210259547fe7d66f2cf3da9fd7073ab5b02953da8847b41e27e6e48fdbbcc958264952ae040047304402203adea27a5666ed19839f5df5d081221fb43a9a243995d8afa04f532fb60f53e2022055a1b8fe09b155b3d518f6b90e3a0e1d820841b5963afb8c0e88587dbd022f9b01483045022100dda4f8455de5f66e2f9f8cd879f206e425e8e37e75f51b7ba4b3fea06cb68bd002201f652f3e7f3b08daf9a2590dbef2b6adc7f6c53af6795af2a3ef6c990c8078540147522103985f9f1cd0ea225f18d9e6a24a683e9c7e758568379203bee6d5a7e47683d2032103d17b8461169c4fa97f3f7d6924507f765bcc519c22773b9bcae918af0d42f58852ae0000000002000000012f86c7d8935b2f0a9da3708648a864b05f9adf7014a0c5644d4f432644a5b19a010000006a473044022077947868a9a0e9c7c2b93712d73e161d27d18a50a2c6a1a49365406ed20a5e3c02200fce0bc54625af1fcd242c0ba67a3259ccbf742aa5af3812f5d21fffb7bb7a53012102f14290cc70f3f73a6b2b6b2a646a08ac37a92597e4bc620e323e1b07069daad3fdffffff02b80501000000000017a914c97fe1d0fce82bce94493e6ce1941945711c801a87085a0700000000001976a91466971e298e267c410eb45f1b89e6b434cc320eb788ac47a00a000100000000010dbd45fd446eaf7ebc86cf5b7f4c032d152aa40012cf0feb8f59b4f368d063bd08000000002322002042df394e721a83eedef2951791096509911794ef0263d8cfacf8e6ba0045d1b2ffffffff7514a6c261e352bfbb90d657c6052ab0ae4a91d7794aa1b201bd9131e7e5f016010000002322002017ce2a13c0ec85b24df4b8fe1ef261117ace0f4ef6c8f2ba573df91778c5c5a6ffffffff29bc67de2e320bdcce250a60d03a596b6e181a04bd448c77dbdf531ceba0271c0100000023220020cdf52fa5546cce8854b059fac079b93ac00f63444839167499558092a7c9ed17ffffffffe6b67205b5a1e2d675e872b6aba753f0954cae721eebdf589a0da5c5c7c43c4c16000000232200207d55ce5e9c12fa39794a24fcbc354c025ad54d7502ce9f6b33066ca04b6b178affffffffcc945e0b54a9dc2eadb061c70dbb429c703e73bc6795befae7786863308c514e0000000023220020b73b51f99246eb8cef2c3fa79a52860aaaad95429d3a92d521b83dddc230daa1ffffffffb53a1ebdf2865705d166f14d3d4e0f9825651091b23f3b2baed88effb9bbf46501000000232200207c05382163638eaff430721bea983982670e2647812530b3c8f53c744889ed31ffffffff3f28eecc83940e8df3cf2977e4bfe3121daa9131a87f6fbc4994cc68e656476b1f00000023220020507efb36a5746cd677145c183938bfcfb3ae116ce0ab1c9a69ba084080e97573ffffffffb1c3d26069c502dadf587f9383a5d3ea09ecf021f004a9612eccedda0d91e4ba030000002322002097ad8638c2259c6d74362eabd4ea937d83a8e77ff173d0330287e19df4543f91ffffffff0ef91005c1189e15b4cc17d184ce3d3a4f556bfc95ecdbceaace7bf9ec70b6c32a00000023220020c1be272e03ee9dd8e5f39c7543f8ed408e4b03d162a5fe436f1176c44c45e0a5ffffffff34f43e96c79e850dc5e89d7acdf236c1c1d391e231d5281dfd8f9311ce579de20000000023220020610b1fc3c880ff94eef3b175c2c4cacc9f5dcd9b49f31032d91b32f9d228c0e1ffffffffd6356ae860e230bc560d8db6faa00bde3e8e8f240cbb16dba3200813278cd6e91a0000002322002071a5b58e61e7237629805b4ebe0d4a3d5be8803da0b78f82fd78907ef1d65847ffffffff44a44b74e7c0c73d956d0c45c82c7052ebacee99aac33743ad6029c48f258af33700000023220020c00895447e13a0e8966684a3fdc55890ab9717a5f5f18f770b2b7ec1a7961e63ffffffff641975ecd2fe3f209afe787d6561d23233389f61e8450031b816516d964754fc08000000232200208925cef6d2a35a82fce943a4094aac1e0c76a515e7a45c7a327caf8eeee74f42ffffffff20f12a00000000000017a91499a4519a81447bf853948d940c97715d680c6590871c5700000000000017a9140b2cde1ed8f17f26e48a407748437a77471854ee87438100000000000017a91455f79b6807c907bb35033ce01d5abe4294a4433c87a8a20000000000001976a9140138826862f2c8188c34fcdf7f837d2dc5a46e2e88acc3a6000000000000160014f682c55a49fbde3411f22621b4a50c879aa4976237b600000000000017a914fc8ea1b7c65abc78a0eb46312e5beb1a00efba66873930010000000000160014d8403b546156ec6ea78bd6998fde8d980cdad428f6ca0100000000001976a914ded049156d1100d3a2a6c14597ac405c55deb77288ace02202000000000017a914fef3425511958d1a18cd6d9a1261cd3b339031c687317802000000000017a914c2539e5f330b2546501648bee8fa1ea426e61ecf87d95a0300000000001976a914296e1af8629edd05ba458b4a7964f5acc372add988ac09b7030000000000160014eef99787f09e623218caad228622e80a7b6b664cf09804000000000017a91492a02d3e007350edd26fa7ebbe5eba34c391ddee870a900500000000001976a914136d292cbd008205732f452d154f5b1fcd8cf22988ac11b90500000000001976a9144c4652c0b59e1a3885e1a8e027089c6a47b6b8d088ac83d10700000000001976a9145f1b15c0050004559076fc4c04ab433ef0f9b0b788ac7ca90900000000001976a91497d161efa3866ccd051aeab211d32d167f0bcde288ac17e4090000000000160014ef33de69aa556ef5a66509b734e5cc6fb33591f949370c00000000001976a914a3a5ec8a522faae34b0da2538fe0712e5801ab8688ac11390c00000000001976a9144a90e308334e00b23e7f98d2f17474e3a5ebf49c88ac6ee60c00000000001976a9148a65dba044551bd0edab55140dad097e8e44f12d88ac7e250e00000000001976a91444229bdcff05acfd400f5d4cfa885e33f49b074a88ac068e100000000000160014c1385b82971006fbdb4665086caa8322609eacade4df10000000000017a914885bee615035d74d2cf8d0dcce8c665f4ce2b6298748d61400000000001976a9146f3f9bd4e6445aae60ead05b00c0a4b81e8c2e4d88aca5e11500000000001976a91420ede910ebb4fd700ef82fe27cc64069c027a7e488ac4b9f1d00000000001976a91483f83172000ed7f7e375428c547693c280ae523d88ac46fb1f00000000001976a9147ded5b04ca4d0aef7399ea4e05875e1e529232a688acfc1a42000000000017a91442a5e739aee218961d82a16821351e90a43966e78775860301000000001976a9140e9554f8fe83c0b2e97b7a531d209d0ccf85004088ac461cc802000000001976a914b3f13a1d77662aeea63e104cdab4088f200cf96c88acd220c25c0000000017a9146eeeadc19a620ce252f9f24cb4a963229fbb6a43870400473044022051952eea54e701c1c8d60f76f2961b693be93842496ffe999b3592a158733cf00220183d7d8ab081b94a5078d1bf29d37ef4ba0b111036d75e88f34d7a6dacced41a01473044022025d1b074f288be62a7db1cb3e9335f88eb4f72f0cbc891f1b9923ca4355a96590220533a7d1bb0e64f09ab42346cb9eef4fa4a490aaf6203a8e9088531aefadc14b50169522103a32024d4f6e2767aef7074ec1715871ff5577a8c61ffb4d97cf9852aab915c6521034f1c76571bf237560cad8dcffde50b022729d3da474ac4c3844d48f415e962672103d161579d7ccc59cd346bbb50d21363c2e4e3ad995d741d3fa0db25182777380053ae04004730440220577db5841d4dc7b0f137223e4c376d5e43488a1ff1d6df69426bc1e10f59f09f02206ba81434ecec92be3a5943419332a2d5918af26e7c18cefd39802978666d9db50147304402202a8e89013946707859c51d46367cff617e37ea2b5bfaddf78193ed0dee24b41c022074cd7ea32bc5ff573fb90015b5974f83219f2c32d7d97608a77c9d2803be2a7c01695221037814a69e50d54c575456fe9f11027f261d58fb798ebe595487d9fde490fede8e21026cc673e7d08316eabe60fe6c46023a61e18afc2186d0f705fc2c8501408982dd210237e8957d22adc42e16d19269609dd6b019da3663e231838419ce0a430350914f53ae0400483045022100baca00c8da7aeccb66ea8fbb97723ae9857fc4f95cf56f3b0c6f75ca3f84cbcb02206c3a15cb28bcf38dc4738727b8544a10fb085453f30b2a9a159842deab1b945d0147304402200525261ff55508bd052bb1f7246910baa96a5a71e3031c6b313e28b8cc1f602a022072367744eeae46934d4b228592bb922d0302812ea64b7dc549c123ca13a7ccde0169522103065138e1be5fb32b0ef393c2bf2af7316eb6fc2ae89ddb95f22a730ead7a7209210337e9ae75b84aa6e0f0fcda7c3082da0213ed6aac660d0719db7b96257394616321035fe5679ef57908bf91f77027a33c44516cb2544024066ac5e800479566f4a1b553ae040047304402205410f451c29e701348220aa5c6ac24cf260073bf5939cb3d73e5298306ce77c902207b432846b8a913c8e1c3789f952d7692b183351ecc2bb2c7390786f4c07859c70147304402202ac9793823e34640c882678c855627136ad0f50f68bd0620f9472f66c447afab02204d69656ae7bd0ab265804e8ce92a0c8dcf75742f304f31d78b2166fe49b8f08b0169522102fde889acb2bc8c1aedd55fb5270d6e6017363d1ba26b034580e6434fbc6af40e21039c9f4b6ba36e1b5d9710e6a3b5951d4fa2144e2db6a24ea80ec48009fa319a6621036e4012d30b355570ae0972202a4aeeb146244af30d5d16568ad2649b7c52cd8253ae040047304402207067c58f037863597de8c290bcfd891d314ba0dd23bc28cf07e31d4f50606c030220152a4be76c5bd0ce0385ec300d18398a18a6066b2896fbe026f9f80ee74fe4020147304402205318efc9c656b459bfff2660c8dd4a66470e75b659011f6489de67a31d9ab2b102202021c258bc7f9acfddb12d4077ac72fdc36cfe697617052c17c579ab9718e5f20169522103b37e96b54254a0c0392d440c7ad5172f8d1f606ea1d9d5fa7114b87f1f948a4d21028e802e3b7b9eb3a8c729367ca876d93143b7e8e65a5c316731f11ac8e0e85cfa2103538c83626b0351c052f5c8be00bdb610e57910eb2ab8787c2dadf2d08da8108953ae0400473044022028069231dbdca789e2eb497c8a7ed698785f423f61ebaece675e1bc798c9b8ea02204d5a6e33ad4ccd111b14413940420739689b1b334418c41b043f2d139ca55cf60147304402205d1e2ebef9b99648d46aa5ab440880f6cd71cbda002a019fc286108e1675824c02205d6ef4279c91ccd64449a231bd07921e0e5d8828543182d4a6fb937da68c289c0169522103915884299ed89198c905cc616cdc54f1c247966f015968be7d0b46aba332ab342102f3677aabf3940c949d17fe4ffaecc09fa586137ec14fa65bd0433bc05341c2ea210297b9ae6c315ce77c71e202862b397ca9a30edfc0c6b99961fbf4e44dddd6b0b853ae0400483045022100f15acb4c8fd77f23e456d20fcff943715fb2780ab6a82ba4ff73f957b044c72b02201b1897e6c7eb61e53766f1a956ca17444a6b6f70ddfb332f5ff768c690f81be201473044022073a22ea40e1a11b9828e76c3ee3a9eb3d4cfec43de41b6b53feab71377437165022039851f781cc9dbba5eea1350e99538f1907a1ae2eae0bff91458eec5a30e88b90169522103dbd47ab738567f0ba05603a8dec196390b88d94021daf1771ad872889ce7b44f2102d9b5cbfd23d3e063cb7076b3ddb18db4e24bf3f80aad2304de9ebe12881db26d2103bee9e852797d4b17d15cf0fb91bea027b0e08d30f86b717ab69d576ce18c163e53ae0400483045022100e70fa7b2a2d554b89935102916dafe5b5d5e00d9b8deb5e6dd678be7942cf0e402200614cecb6bb27b093ea2382a88a6b5191b050eda465caac692f20fdcfe5350a30147304402206b0fa5ec055bdc6a367396e06adad9ca59efefe0dc67ebd23cd10a6d34ae4acb02203fc3e5a61df4edf0ce9b13f2f02f2c63401bf50e7155096811f423c09027b91a0169522102e7d307d13ee65088dd5c7518ce7866e86cfd0d596a136eaeb4dbeba3b2a7cd892102c1a174828d32e082da1789afe91d657248e7938f314a6b2f57e49aad699201712102b8499b3daf3f1e2966441db5421260374179a1b333a54752e29c4902b8b0beb953ae0400473044022055b7b52b46e3155caad845179bf74db896eb4982fb5f999741a925730247e7bd02207602a771e8176ecdc5b1fcdfe16d44250388dabf5aff62164b8973838385b0a801473044022057483d8694e31e034ca68c76516f49982b2e78231908c28dbb1a01926956f2e8022012729b651b1e1b9cbd7dc4024a413e26b3f791838abc044c401d36daba60b3bb016952210396f6519b28a707904cde2efae75433d4b7cbf532692f4418ca05524a81c23b2d2102f8029ea70f0df060bffa811c99f4f7ca2be1fcaba59137b3ded915aa46fffcc72103116590733567c778b82edf653d0feb2f7883cf64706ff479a47b06e558502ac553ae040047304402204e0d11d26bd675ae9d2eda90da9fcb54d5d4bae639c27a133541745426d7d05602204f631252d119fc8a5462ed9b1bef75997e7f70ca004cb95bf278cdd53937be300147304402205ca469373e4e9a075f1919fa8f8299fe056b487f18d3f4306d4a81276ef93830022055774679df350a4ddd3c5b1891a14a65f9371255b513567dc0962f59a39e75850169522103f4dc4783610dbbab78b0f94cd828c1c7f08f3f08a04f48f3941ef2d83673f72b2102d28d3a971affea4f5fb8c5712102586ca8ce076744fcb94583df5ba7e91d396e210291d31c539ec31f775932c9aa50c9a9bdf77c5b41030bc55f0eaec0fc81494fe953ae040047304402203209c7ce61c58501f194df85556d4770dd68b5165e907572390c07d713e9aa2502205b8d30ba9715348d9e98633ec8bced1952f9fae69d4ec7595726cca8358a76a701473044022036a321c8265db29baa6f2453fd66be52a38b64132c09cbe0a878af27c4d497c302203003f9c3316a263b7c51c8c5ed79139c8a1772a15d084cde5ad2bbf0ffce571901695221021587d81128eb1edde9352b8e48eb6507d34165a126cfe6ab4610265b4a6fa7ee2102c129d86e32e6d13ada8792f61897172fece0815cca9e7371fd10e0606e352562210264b594194b2f6319107cc20c4537d35e4d6f1a26eb4000a38377e5dbf816623e53ae04004730440220639b1968f79697b0858e1ae81b3589fd9249d8bbcc1f25b9dfdc97c54e88cf500220258d5d29d5922e98bd1eaeaf1bf92f7a6e8c34e02e23b2ea3c1b274bc524130b01473044022061a45b8d6e53d23c1bf9c1c03725d53af93cffb6b497b09eac79fb4f752455030220159926a28f9dbdb7ac589d4160bf7156119ffb9be658a8f5388e6f0fe3a8e0b00169522102db1b9acf29a66b30d9fc5299270b0eb982bedc2bd7667b22010ed388069e727b2103b759b9aa7416544fae433ce9688c1aa486f0c47a24a8887e570166abacb3a1d721029c0907a6ec497ed1dca3dc43d737bae29a012b4bf44b820e3e2866f7379b352353ae04004730440220280e1804225faa912b0ce14e2f7dc05a910056a1cfcb91107b4d049cd6d186cd0220123cf944c645d42f071b479b875a25dc0205c53f2f65915862e9635b9313b8fe0147304402205c0ec8180f668164a64bc711117742b88f4623d0e47ab68a8ed231a95d6fe01402206f1e082f9e4c42e7d18f4ba299a795a734536db0d8345b928325154dc8e74555016952210217a9d9010b092377ce81d39c9dac9557113cfd95d1e4e9fc5b21bf06f36e5f6c21037fb7250d9b1999fe48c1ef3806a7e6679b0d3f76239c31bb12c629b9f951a7dd2102e0ac45babc8c7b343c7fcebcd8f63bc2fb8c5ded32fbe08039b2217cb620b88853ae47a00a0001000000000101af49357157f5d78842188d627ac0a3d5843de7374bf5135cf9b30c2420e0238e16000000000000000001ef8a1000000000001976a9143ed8ca8bfa28ae9d2666e3b3f5d2a582b7a224f088ac02483045022100c0a6058def6e69c5b953bc4b5130746638e4f5c5e3ae72aa92365d28a37731c402202523b7c66417c6212b00114e6d302a8777fa230486b8751f9481aa924647165f0121033d821ae2f23539a347827841ef1140c51becd8bed5f5a35e3627c08640aa79da00000000010000000001093cf057f7653960448d5e2e5956711da96f8a7d39b464cadd8eeb8c85c74a7f580a000000fc0047304402207ce859e94d0d4655b564b9386b68f289ba2796191111ae8615d44dfa3a186f74022035acbe890e140b96cb419e10b1f386216cd67f8cb5c0cf9dc3e82741fd9325610147304402207c8d3783be3d0b3bd0fd85c657946297f3ce3b9f4ea37b2dc8d90cf3cb6f6973022075014b57ced63f20cc296dc06e1aff2c49b3560b656ec3240ff8729265e3e6b7014c695221021cbf29296ec5b1c3ec35a87bafe3d3658b315c6064751aca1ed9ad7f26a30a382102d8b98340502e831fb2a85af9ae0c7c405b4187b8dde1ba98d8bd22b89ce2899721033590928c762d78fd13fcd5a290130b133718c775716734b2f59d41ebea8c4b9753aeffffffff3b73f38e11a4cd35b6beab25688aa4a5ff43c220d15a554e64c84dc9ef4348252c000000fdfd0000483045022100973d2dd0cb51ce3a2f2430bfc3f8de82d4fa9e3688482f037c9ddfe940d1bd1602206c66907a4ef9784f033863f15a504dea0d16d2315d9afbb5c1caff63cfe3375101473044022071ba864140ce4976b808f4eb82380c587f69d6cb1727ebbf2c5f37d9ed8ebe5b0220792023666bf789927705b52fbce8ea0265145e6b423b20edd5f712b90afd4854014c69522102e176e50b054f69ec7314a37f82c875423089eac858d252c52f3537a455ebba512102ac33d2025cd2803f1ecbe05b7f1e2fc073784d1dc36a007aa69e86312b52ac2921029539ed640cb43e2cd83d93d24cf43d98b21eb2afff9efff2777c66b143d1b3c153aeffffffff59686c1ccc6a613f97bb75f29aebba142ba0db48c3263d5b1afbe222006c751c010000002322002028b17eba056d8ae0329e646f4ff252c7c70d693f90929e6ecaa6fa202b189659ffffffffc960a41692f8d050a2ea755fe1da3913701f87f784b5f1aa253c936df78fed5017000000fdfd00004830450221008a3db3447f8fe26f09394da463fb3cbd01d49850757220ee6e1665ee66b80d12022058abd4e417826ad0677801921927e44376fba0a04c69d6dffc795387633a59e70147304402202707a9ad8b37896913efacf2a83240cee14ef9f8067ac5b6e56999e3c91be7720220326b0aa25a5055e12c22dc89180a24b6b8c989bd7658abca3398960bb027499a014c6952210303cdf44fca5d7eb9f2d343986e8e17f944152aed6444eb9a57395ea38a8a30b021038bb965741db59cc144facef31e0766b5119c761003f6ad16b6790dde8ca37b4c2102dbd0fabe871e4ee21e6d3d51eb9415cc82c45c5af12383a5cec823d39ce48e1b53aeffffffff85351fb9598c4df20ef1b25ae1ccf023e7e8442f95e34fe5fa7c0d9f6f6b897913000000fdfd0000483045022100d2262503d9ede45161699b677b0a662549fe4aac5c936b014b0e5c64adc70f5b0220735cbf4edb927985dddb92dfb6101b2bc1e8a5e6e7eed605377ff5bb53ea84ed0147304402207666c99de908ed361ae907eccb65a998d5227c7ffa5f5fd128e6ace15f2796e4022011a5abd28a92b9cdde859cbbe31205303bf68008c75f165bb73ca1ce4368d532014c69522102e176e50b054f69ec7314a37f82c875423089eac858d252c52f3537a455ebba512102ac33d2025cd2803f1ecbe05b7f1e2fc073784d1dc36a007aa69e86312b52ac2921029539ed640cb43e2cd83d93d24cf43d98b21eb2afff9efff2777c66b143d1b3c153aeffffffff1e6728f073b6592306b584d873f838814b11644456bfebd336fd5c1e2c0970a857000000fc0047304402206d58e98d7c2b52c2f12126491c301f9dd842b5d9953e93c0376bc451ad9b460502201f7c9c076201cf165a9ed6b5048854473ac81715fb3b7b7a58af8a6e5fc965fe01473044022071ed7589f18dc667783c3c06a68727e9eec682c195ee15f69ca94c754bb8bd7c02201806b16a131d9d258c31b7be8ef32132c3de20a9dadcb98bb3c8b81b7c38ba81014c695221033b498f5de3148c86467b9bd257457232e8e92a040cafd0e599efec28eee167eb21038e07c8a0296191e4c706a1d54613c9ace87d72ca25b1c86bb9bcc6b5bf25c508210203b1178ffa93838af236befc08694447155e98c6c18ca379ac77e0b39f997e3d53aeffffffff0975e88c75de7389691c4fe9d92ec79f6e23146bdd2ce80fb59955c2e62728e213000000fc00473044022079958be2313ba7e6d760d477f93920aa2f4eca71003a511b3ee18fc207ef68db02200cbd408646a02641abe4fc335561697ef354cecf3e458ed0f755301689a253c10147304402203f67e982294c5639211c0084df140018291ba5cd19792c8925e3f7e90b9d5c840220256bdd267fdf95008ecde9502a24ac4cb684ddf658a034079e278df8e74889c2014c695221023748f9725b5f38f6405a01028403af5ea1bf3ba95461c5c520e094761513a8642103b11aa5a515b4f1c70b09cd7dd8aa263cccf50e7db788c676193b9d70ec5e62cc2103a84ce8d4971bef3d1a98f1fa3e53e87176faec20175198d92e335bb42adc627653aeffffffffe8fe72fa9b57afb28d07d188606a561441e0e4f1047a2f429efe01f35df2aa4801000000232200208fdb005536e48bc0753b87c998074ce498e5eef6c25b4cbe7db7232292f3ef65ffffffff1e498c979cc7ab01b90389515a396e2ab7a888ce1a7890a43cf4649a731038da00000000fc0047304402206a63e0ed94b12409d4330eba233bcb1263f4a51592d55b3ef57d94b07c4f259702206e4fa2bfa092fb4903eda423a52a8a5ef6a97e889c05926ed9079d60ab018eba0147304402200ef78c81308845da1c0f8ca495fe97822b6b4a6598afebcb22a5992e1b71f81402202cff7e708c2da5c41f7202e1de0fbad2abb21f4ab24c582fb10a9ad06d723c40014c69522102f0452497877f3b34914ed8bcc877ad67a9cda747302695df9572c5e365341f1821026df568621fecf517d59becad2fdf4fe5ff7a21b6b0c7c591777da14b5bd7a3a5210252f422588dcb45fcb22f0cac64e3eadcc9af390d46880d16bbf3308fc8ec5e1753aeffffffff02dfa808000000000017a9140a9e2e266a4a0e8af9e009549c77c8bc9913cd518780969800000000001976a9140dddb92cc192355fcb6818ea9c19f06f3a091f8088ac00000400473044022038f6ec721533acd98a9d586c3824181de02805f8f480196cf98fecb7fd5ab77e02203242f1ce3db434b7ddebee3d92982d2ba2034de736ee56396b0c5854c80e04f30147304402204a764d98f4c718db303e796cbca606a7c84ac1369f94dc12dc735b77102198a70220342e85f02983c25caddc9f39603004db5cedd9d0ae1d0997a00b2719fdb358810169522103330b3cbf2c22a494d0152d5acd1976eb036bb3c49494221076e0b9c73e4220772103c4f422a802e7d700ed2445b6c934492dbf53160299d270cf62532aefc0980254210200fbbebab28c9e569bea4ce81df5e51030dfd76f17edd863e55c50a617d8644353ae000000000400473044022040892f220a31d1e3a0bca5903c85010582b7ab3d8d3616799d1e8ecd7a972de002205a343dad9528bc9166ca45adab64fed96eae67b1601d8ed8f5ecbfab1dfaa74b0147304402206b75e1e59b4f1b86aac0ca39509dd1ec7f008ec987a39866ad1471a73cf3912f02202a2ea7c24b819d6c1da9e49fca41937b1c42b93faab60b980b8bdd221a2420bd016952210238e7701db0487e7d34ce3732346696d4b753177d88ddda640e4a301cf2fc81552102a8ef460dccbc19b95a3b0d1d20add53f71f632114a78f7c5535c9adc74b48096210313fdb1ea68e008cfefce59cabe0cacac9c6bcc83302f5cd447d33aff7b783ffb53ae0000000000010000000001028ef3d4b6f025819a85c44336fdc6ee0474410ec3e82420503e3fa44de0c0ce260000000000ffffffff417e548ac7daedd069d316d01c5bbf0d7dac34aa04996e7bf099db1f93d1c4db4b0000006a4730440220216ca263e76d94dcca462ee71f4bb162526bb6be63ffed819c4705ee4ed47f1402201e59ea95445421e136daf912f865e5aef38cc94648efa4beb23390e08d528201012103711b433762d162bf7f8b5c77c65130ffdb42cada749c5bd2e728b2081bc2e454ffffffff02900201000000000017a914023a1d8030a8d8e19199f86f47268a788cf3d91e87842f0100000000001600141b57bb3ba790085d30459b3b4e68d1f3c7b8a15502483045022100c40727dc1188bd5767f7160d3fc8c4b84d7106d104012a659157d8f0963395540220712a72036765cec49aab1bd5886c00cb0495d17df571b4d5a9c884964bc829e3012103b7277bcf781c3f85b18d0fd88dbc1c65192a895c8f45e2dc33a2f05bfba7936900000000000100000003a93fd58bdd92f729f35681568f309bc085dc58729131252295fbec4feda9b94c070000006a47304402200d4b15741c311c2fcb2664e473cac5a2e645a49933294c347304682fda2f155f022064b42e95133c79d37ab457f8143a066a546bb7d065073cae9baf2bf3513411590121037a405272bd6853e89d5e23cc54587e1d827d14357177ef7bc274154d1de1b00fffffffff59a08ca928764c4fae0efc7ad8a452a144dba8fe3cf397515dd16b94b2f386f2010000006b483045022100f9ea1df119e03669d0ef66bd00171b76ee80151b96bea781efb3c082ad9f88da02201482f271af7ecee649d510a61fb593b4a18dedfd213c3777425989652fb8a0ca0121037a405272bd6853e89d5e23cc54587e1d827d14357177ef7bc274154d1de1b00fffffffffe86641fff884572d7dd2dad8913b88fef3e176faf28f6f1e1fbca79028ace0c9020000006a4730440220568931dac2f0a06146f4fc5a01d506326f96e0a929b2359546399b0372af962802201beb2c2ad8e5a8dbe5bbc2d8ff6a51436fd012fecc25e792151147e77b88d1460121037a405272bd6853e89d5e23cc54587e1d827d14357177ef7bc274154d1de1b00fffffffff016b13740000000000160014f0d92cbddca31fa631799cc447d39555201aa80a00000000010000000183563c022f3b1ee350f50aece9740a184e1399bb7f56a0e76655098403c7cf520a000000fdfd0000483045022100c7e7062550d7664587676b6f412f84ae66e8ab0130ce19e4c5dda510ae0afc27022006670977ca1c7ac70f01d28b4f7d9f5e98e421392967b463bee0cbd6f5239a1c0147304402203e083feeeafe8eb3683c2c6e876ed5303a3f4b24a86588419219861938a9a82c02202e508c63ef5c13987d61ca13ce9d3b38f9494a0c1c2d846c5c887e698d9fa24b014c69522103071bd92f1e6ed78dca0ca982666e312d5565f2c1334d9dff56c013e81be4e7b0210325136a6ffe95b136eeed86b17290d61346bcf02b1a243ca2ae371c3f1e3642fc210330cc37435f61af21a5db758c1aab78eee07a22b52a46d70368babd08a058b21a53aeffffffff02c05b0000000000001976a9149e18c42fed4fa7c43c42368b821996647ba6062188ac373801000000000017a9142c3a7c386df4774b074c2f3bdf629a6a5b5eefd1870000000001000000000101ec61206b80fda08a18b603f3657df5d0d17afb9807466e8842f82f919a980e960200000000ffffffff04d30f01000000000017a91494c36edcecb30a10cbdc6071baa472580e49165387d93705000000000017a914cf285d516f6b81bcb41d996a31187f2c5c75540687cafe0700000000001976a914d8065c4cfe87dd925a469b0bf3d552f8d12da42988ac15ba7800000000001600149f46039b440101a4e9fe20fb8ebb1efed686548f024730440220232937de10ffa30036534b8a054f80fbba0b08c3fa9a503b1b873f43ba6226aa0220368a2faf9b580956e5d0028dd3c7105009cc221a27d59e0d0e59cd0868d22b8d0121035df9390379f74a83bc4d6279fed162f8b8df08a48d735d408a95aa81b5813a68000000000100000000010210e3ea194b47b336d3da2cc15b72e6cd797aa00aa5b8920192c150721e8450210000000000ffffffff649e2f695dbe2059f57c7df2ff0adb40b89f1a13a435e00e88309c21aa789982010000006b4830450221009f0bbc964a251362cd849d296433452e5de77634762bf7aaea8e0f5333c26d8c02205b7bf7f95bf726795498ad6dc1d280a7e6a029116b630f0eddac5acac3cfc97c0121035348289cd10b6ed4716be950f1cfff27c3aea4cff856caa5f6ca5e66d0bcc50affffffff02a4600400000000001600142e051bb4514fca44b21e5392e4a81be1c8596e43405e02000000000016001427cd19d2bdf3a2d9fd4623bbfbd48995d847a54502483045022100b34ca034f837d26af1b12204b82b7d6f2688e1e9251a6103367967950e3cf04c022078d259af3aa1dec452819cdfb275d8b9a390f02bd6c3703030738ae14e788ef20121030877130e81d7e956f3091a7a723b3c79588a932ee38b976faed0e29940506243000000000001000000000106a48f6eeda8363cfdb44800f718a98c0bbe9a2e1c6ff22bf69f98d71bb7d7839d00000000fdfd0000483045022100cc6103cab6ea367c792cf25a768299a00bca9c93d2bcd8e10fd4a7e2df7eba230220466fc8137febf361aa54e62c223451e78c526947075504c28cff475e3fa809bd01473044022010b6006b63f0cc3de89e75d6e6f576671d0062303262b74094fae4f7be2a9213022052accc66e1e43b476e8a28babe1c14d45e1bb03aa9c271f1e2490310a274da7e014c69522103bbcae8200c71ec8e8f0787bebb70d3e9b4b7a462cad9cdf36fa892ccaf50903a21033dec73a674ddb8c6fe3c35cf0ab1ff22b17c641eb4a6932dccd232ba6674ed362103fd2de37ad1a4fdec977a955f354372e910ee946a978c61cbfe9987c4e73d787953aeffffffff9de113d8fcc910af28ea58fc97cad00fce87f422ee8c51177412684f58a647513c000000fc0047304402204b4bfef23b8d538363216b63670646f9e12b420685310139450f1299143acad00220099552c64ebf66aacc390f77f7b32bb49bead5f949d1cd81e7519081e4d404e8014730440220112608e0598dc491affb6dccfd01e69d5a190f865b9b2aa1c68be0043747eccd022034435c3cc165233771af25c50947fbf562561cc2f9f87ad22a93a3e4cf09d1e8014c6952210292bd9abc022bb4fcdc4c35b8c307ef44abf8694ca75cfe604301d6168853baaa2103f5028d5b03338587b04ee0064dcbca75ee7f2da2f9068f32eb19b1d591ca88a8210287b68c53b28079c52db06ced27a413618daef3592323addac97851e75eeeb31953aeffffffff708b606cb2e309686aceeb60fa3394cdde75dbe55a653e7076ac57ef8823aabd0c000000fc00473044022074b409791c4c0d16531089f8878787383510105511b1a9ec83d6e02dd7bc8e34022015196098ba5647fa41b2af5c53ad3de3afce58114890644803b4a0f1debd33c20147304402207a3d0f242082e26c8b812c69147af9874b4950700fcd02fd9b0660bc6d0663b9022021cfd7c57eb12a36a9bed93491f68ab80a8c64e4934b42fbca1bc2805a834cf0014c69522103ea2355c5f02e870cce3ce7bd01ed8a147f29ef29645703100ed48f0f243ee98d2103398a3cd7d1bc34acfafdda315b06f96f3bb980addaebd707470878d6db9c4d5f2102aea11e100f4116bc2c2176e3d2708c0f320035141ec8d9e8f80ce0428e81bec153aeffffffff3b3fe26c43b540bd6f8e2471cdb6a3b3072ff59a617db987d2c8d7a27ecd750d0000000023220020b9bcbda149192c3b1c879ea0a52ae320da7ba322cbf7e50b799e70b497b3cf3bffffffff7d9fb90364c8e7631abfb32e45f492a70fd617e82a06e3861d57c20f7f9b2aa30e000000fdfd0000483045022100fdb742213fa838fc5f128599063ff27c0c915b10c087900164a32fd154c6633b022024538c34c7dc4b93572e4dcfdefd79bd64deea4a06a7d4a189f7e496b49b0067014730440220447e8934861bb58dab200749abac0d03052422da6edf360601253f64a98f7713022070a9fd4b2751eb793eb2a8784ae8225281f8aba047310e5fc92f416c3d5af84d014c69522103721307f8da5fc49c056ec787132eabbddb1084b9cf2104d4a37969cbf99d7f9c2102bb210bf2ffcf35b37243ab65578cf856cbe62d93b4a0958fa668b6f559a6f36a210346c713dc216832ede557b1beb282f13598231ec2ba37b95aed1ee17d35f96fe353aeffffffff02a82850ea024be17ef10c37d1d65284d1224db8425d2c81aa3b159c50a642b737000000fdfd0000483045022100c5cc606ffa934abdd7087391b801ea93e6ac0cb24d14125af10156b6be0e35880220116096d276599ef29d699f7bf65207b4c28f7133824148640e2e00e3628ff09701473044022047f0c7390f513beecbb449e9e9749c5504217d5c3a9e5f71c880ddbe7d57828402207cc5e81dd4b0e4056fe2224a314360bdf0de0ba0697a361990016d8203077e22014c695221035771802e99076a8c8cc21730c97cbeae55760962668f2b5d593adc24856c8bde2103106071d3d3d5a0e341194870da9daa5ecde0f7a9a0f1df79aa33d9bc9ba6a01921024d09acc2136ec7e06b717bfb87c0a72cba7ce169c2bc3efc9d0fc974b6b5e0c153aeffffffff02b0202c000000000017a914d5af331e74d715b81b03753e92bfd3085edae5468760e31600000000001976a9142357604d68c269106f8237bf804d6c66e70e4c0188ac000000040047304402201fd36d7c4741d9cd754d25cb7a66c651ca23f463900f06fa2d863cef4f7bf25c0220521befa58b63b8f3b9375d9a5699d6f0864b62644b4fc4e6922bc299e9dbbdb70147304402200f14440dc899c7d0514a36bb8ea00584a29f5ee0060fc77109edd11d9549aa590220173db6b6eb3b4500691bb89e3c0da51f3eb35b1a34244fe78e4b2a86255f6dd20169522102fff87d553245850902e8a1665bc8fe230f77704b7fd2042ba48400a785b0199e2102536102764ff506e4d854502f9c083b07ec3542695c237e094d4bbaea5468f0a921030047c11615a7bf4470f4f66fc8190d53ae28c1b66aa218680a6c91e5a676965053ae0000000000000100000000010366dbfad4f12bb3875225d02df9b8895255138c3ab5e67fad4a7336d8188286ca00000000232200206aed7a09fe74395beabbd0b456d60d5a9134fb434f48789ad45a64adf63d4da4ffffffffccf2d05bfa9e8a00690c5d9308bc6caa49e50b5e2b430db7b98301c6e81403070000000023220020eb671be0f3a4dd87eab76e551a8f4fa5668d142e62302fc6673c1163faa3ebaeffffffff884b2d5bbf9de00aadf23559311be0cb4728c95af461b6d61d19ab70be1118c50200000023220020bcb8384a60ceb5239c6c916d87f5a011e8c4e4778da113cc974c8a51debfa22affffffff03f01d0100000000001976a9143a7b61bb4b962e1c1274fd34b6d038fe6372eab788acb0992801000000001976a9149d667d640337050c45f7841541fe6fc47a4b0f1088acca4f23000000000017a9140d5bafb6562da4d86913c9bf9fe09b60279bc63a8704004830450221009024347a3ca4e6122711671c7889fef3587b669f1ecc79ca2def27ac000db2dc022039cae38ae844d996ba573e66f76691b4d67cb46eb702c79c58c24f8ca5ec900a0147304402204f86fed6d3f9cf6c3fa00853a30eda4b7a098957258bc1a2c0f987628bb8a8d902201f8bee0babd5f5f28ff0473c61c2774a684e95de1788416cb2edfecb6c8b25110169522102de1ebba25ec02e830a9c949a5ebc9c0d322f2a01fb7c436050200bdc00d3e83c2103509eb046a56186193551f49d02b0e38d26d06e4990fed3667f6b65555b34758b21038db9a4adf399239a77485cc1ebbeea0ef451a41c2461e889ec5fe8b07366687d53ae0400483045022100da3b49a39c18fa6db5b11c6a9ae9ece05e7a232216e061d64341d6a78df339c40220748ae8242e04272a97aa16557c12b98a155c129e6d7e7ad8c0ad05d8a10c72d9014730440220097b08e0df30b36b2c0cb6756ce794d345759a9eef7a21d97ba448cf4f75111e0220212b66233c0a003d2218679df51ee595790af735cb458048a81b23e46455ec3f0169522103681b1900ff54053466199487e3e9eecdafd3f78f9bedf3757bcc8216961c0ea521028443d0a2aadb5dc5bd7a94a9f0ba53ccce46f24ad65dfc39e6d96252ca8c8490210283091a83dae4b602970b6d8ac0ffad832147eb7eca7f7e18859a85357f2a62d553ae04004830450221008ef9cc3e66827073bc3190b25602c6b033618e76979faca96a00771478cb5b4702207fce0b46168d2f943f29dc66cdd5c16e54c94fe7b3240d43d47d1907a5ded55301473044022021b4d1380407db8bbb6b571cab751b59442da56860d2b9cc59dd773607a726f902201629e73f0c62a9db6cac7e0ba4dedff6d0c897298365a8e22e57603ad972778e016952210353ba46447f6ba695caa7c8ee50b51c43700af32d74bb5627428ce0a57e2658412102be8cfa800efbe010fbff3a7ad2f0557fb44b4ca60b2ca5dba7a2b17653d72b2a21033ef37d2e6ad70482bc1f3f09fd21217f3e27437cb3ea32ab27b5fad8ff7ed4e053ae00000000010000000276ac70ddcd70e51c889e2cbed91fc1c01676fe1e3905c1db402d05211bc3997c01000000fdfd00004830450221008bbe5175a8f5d86035f616128c5c7c3ae07d4f7e25f78fbb57b495bc38efdc8102205910d5752d069c77799ac749a1fbb0e6c3d02a9ccd49103a75a78d80327efd5b014730440220644d334e9a4ddd185e50952a8f1e596f922446f585666bad28f9a076cef3854b0220334b52ddd2b0a7c5d9c8ccf8c771116c7fec10d5e4462d0d151f7fe47953d7c9014c6952210306a0c936bef9a0498858431314144b266e2788ca924d6c569f5bcf4060a486c821023515190d22f119463c1cc2ac8c6d91d0bbe40f6c20df4f02488407a2e9f18d242103f8e980f6e8477d0a436d8f7cfa4ce8b68c300e3d4b1c76a2b5c6b8ea6af76f0a53aeffffffff6b971189ec12c7912faf8cc52ff2a0fb5cb0bba260e8e34ad1bc45f3943f1ce600000000fc0047304402203dea7ec4fa5e07383db8510f09984e07e7b634e40dafe965cad050c1e3e2fef3022028a698357e13cd6adf8ed551e0df72ff9062f1911f0aff9edaf1c4740670ce3d01473044022005bc5794b06118aee1d654385cb449254a089365d78c8d9c0b7893ec32673b0302205a58e897871af6f1c6abdc8c7dc2bc2da09227bdafba507c63744391cdab06da014c69522103795fc4fb9ae3f76d099fc70083925faeefad00fdc6d2c7dee88d83dd9694cdf32102517c61477a6f62fbc82000249e8823cd53b4580f2fa65b5417c1a92b670079a921033e6809d844bfee20348ee684cf57e459a8ffc67f1270be5077b54783778ff96e53aeffffffff0299021c000000000017a914230f436777d764efe3d946589be2c0e627242d84875df92b0000000000160014d38729a0ac4920498be5beb81e6509421862630048a00a0001000000000101d0ffb3814512288e31049ec525956b7ef6235916dcc1ba94a4f7b1135082d8bc2f000000232200207f457a48ba1b0d808df1d7c1bf42f63c4c721b34434d9377dd8b22ff436a095fffffffff0937cb00000000000017a91431169a5e94cad6d08e77e881430667d0fe7067a387720201000000000017a914dadce58ec5e793e19a0300d7aad43d4c0258a66987581701000000000017a914a1f36f4fd7723b3a6e351d0584e19986f33f706f87b0300100000000001600146373e0044f7c5ba88ae3c09b9da6b125004cb0eb8f180300000000001600143b103a60d7b542c3b92ede276c883dffc5560bcf1aa803000000000017a91463351ba5eefc067a229ebf1bf4ed8c2e833590bf87aace03000000000017a9145a231843bb5cf9a90f5c5f6adf316bb61525cdc987d592040000000000160014cedc4d024e10cd9135d1227e5cd4fa19a6b3e30430ea08000000000017a9148c6a362e25f3670508905070ea4580d8c5a483428704004730440220421429c0eccdbdcc60d665571c8989bf7d3aab24fa8a6128170fd058a84cc25e02204aa3fbe02dee521efb9a265b2acba068ed748373f24652e8660dbf76dd368b8a0147304402206d325756d08ecb3e7fc6f48e12ebf4e828d1fda32aff5fda2e079ea11d0f5231022066d871a66d71fff7208e21b223bc94a47c2beb3eee544eebc7a1b2a62009faa501695221032326326a58fff2211369db39e4c11017e5f5ab4ca3c052e7e20db559307492a42103ae96b1b8515b203699db9278f13808bf2027e941d37125f43dc762281409f98e2103e4f64b977d239c1cfa773e1cf9fe6acb4d1de2b635a36277324fa5e9359c30d853ae48a00a00010000000001015046dd6dac79c2f7f07f8e5fd885aa1c7f20bb580ebaa42cb004ab56ee38d7a304000000000000000002ceb1020000000000160014ac5d204f54904f7bea7f10e7358719c9b958650be6620000000000001600143b103a60d7b542c3b92ede276c883dffc5560bcf0247304402200da50fe40e5bcc3a04cdd10f81af9490665351bd2bca85e4322efba2482dc6ca02201b6f43879a100a01185a2950b3235938d4fa1a6e72e0fa9f5ba15683f3308b1c0121026b209bc70cc19754bab4ec3a7cf447f3d484d5e74ffe45e52eeabeeecc6999f3000000000100000000010967100e9f5ee1098166b93221c869ee8aa279ed299175219573898f3a82fb623f0000000023220020c1b75ec37eb2db1f95058e19167427ef89e01c13453b3fdf9ab4f01fae315657ffffffff82e4db70665b240a1809a92201aeb988524d11a5af364e58f2a38b38c431c257000000002322002075e3848ec5e9e59f3851b0b1a9286658826f742020860db2d43428cc446ac614ffffffff795132522b41e4bf69d7518579bef7db715ae65ba60e2f4893140face1f91fa40c000000232200203673eb0e3a619e8c6cce72e366399227f0c993bfd5dfcfe9a15350d2216401d9ffffffffea3891ea5894974bf8391332a777fbacd94b3ac289ad328c0a03ef86d3ebaeba000000002322002067e4d86328c8f40c62e5ec84e1614e6d42373066f02f3e1f92baa8ba41e4888fffffffff53579fae2bd2839ffae6489f213f48d5e7fead06d7fadeb34982301d42c15de50000000023220020a06fee00d7a34e61086e22b5daffd617b41738398038a428825f866a4bafb74fffffffff6acbce79877e256ed11beaa6ada7626b731ee38d0817c45a023901aad42151f40200000000ffffffffdc535ce375522bdb755377410fea206c1bb2d6f619f376c043d162251d4becfb000000002322002058db57855bb336c5a53ae251c592fc63b04a47342c5b75fbde1c04bb032f9ceaffffffffa26309e06ae479fa583376a1707793920f928dfcdf63a460bd35f7cacb4d31fc00000000232200207390809e6450440b788d25f5811a765ec2774676fbed5837f18458a73ad44359ffffffff44cb05806c2fa23eb0b87af3eebd9fe083f0ba190a4dbec27b002eef6f30f5fc00000000232200209c1bb2497144e134826638c1cbbbe81a9ffae71eb6844088f9c7fada622f8b41ffffffff0560ea00000000000017a914aa5f1a9d8bb00bac894f3647b2833dd57118b9f58717ec02000000000017a9143d84b9cdd8ab7dccfc4ed6855dc04811da0d156987d5f70400000000001976a914a242f93183e0a470f5fdcb06a8b1f8e529a16bcb88ac1ef11a00000000001600143443c18fcdc27c85de1fc83c35603d004d925807a6d7f505000000001976a914bd836a3704efcf01589f34f678db967d19756a6888ac0400473044022044ff7141bbdaf792a0eb7719f4eff6c9d7d8bdb152e70fdb580e162d294deb3102205731f83313a24f51b88531886886e1d6a6688794c4d9e11174a234efaa481217014730440220053ffff4dc2f664bce54b9baa850e0bff2c4b62f741dbec7592b7501bba2917102203475e8cebb6b90e5df1583494befe5d28dad3cb64e33517e9104743aef91d1e101695221029360b85fed9573aa0bb434322f0799a9f040cb4c2263b69428113a72c7a0ad8d2102c0cae548d7fc722f8a1b5592a44141a8405df02eada2540587dbe8314af08c132103cc4d61ff9eba9bfd3d962309f5aede55309eb0fdff7591a39aef700488900bfb53ae040047304402202a5adb1425373852f9bbc4c83cfdadbd53b07e56307e79c8ec56243e00ccd39f022031bf44aa6d05884a3fe098a4049e43810714ebd7bf7cb98bf2cbb11d88b70d1001473044022055754825ce2adba1080a1c3006cb150328e8eae229acc31ec55cb0a6dbc2919c022062b7eb93d9ae904eb4d7bac84cc21accbb893b805cab5c355e88fb680f18f81801695221023f1cf93fd984cdb4fb685d8c474cc09c1539fc94f650e73eeb5a6cdaad3f53452103d7cdab4026215acd4deeb85637deb517ff472843dea44415d182fa4c35437990210321fd151d5336f1c50978ea912f5e36f0485426ba693504ff596a999cbafddc7353ae040047304402206f79775dde4a1029a6df865f3964d05360de9f84c8d7d0bdf93247364b2f9cdb022057ff6c3de85102518da8638b53912b5087529961626a0a52320405fed7d643a50147304402201220694fd9a668512880e4b54ce9803cbb9261db97ef1f5b666b7f1b471289fa02205cf733922fe9e83848ddbb42617396f3ac619588f8dc60567ba6d2c25252232901695221034a46a4c6f821b8536a83c8d1bf32f5923a936232e37f5ba203030ef87e76046821024229fd469f2628b85b1062cff9df88f7007f9b6150783547cbeaaf57dc61466d2103a2a138626f2d88f03dbb1f0759905984c1cdc8d0dc33e596fa39d589684169b253ae0400483045022100d815e1ee831b7251bab696e0299d513cc6a48ba358dbf779e2129c579168d76802204ad4bd9dbdcd5693040bf26510493709ad6b5c8a3953a50d48e4c1846d04292a0147304402206dbf8c669c9d449b7af6108834d37b84657749da489e16f322c3b8ae961fb2a902201ecfb0724efbc626448486db0942434ab5ea44301b4c6e871f112c9eb5ec78fc0169522103512249702d99688e037701f675e1c437352d6f46a7930fe9ce67223d687eae18210237fa97432c728eed98f4b7903f077cd715fafabd22ec15679fe24695a13877ea21030be573791aa3db4bf45a6740a79c0d2acf44fae189d251bb56e0946126c7bab553ae0400473044022043c398c0270aa64a97320879478183023c9b61998f9bf3a1bda051f91be7580302201a506c80e974f894d927fc4b15130bc874c5e21d53eeca68db31a1e6cda78d9b0147304402204dd7d30ed9799532b12c3ba1196f9f5b9dd98dd574f5e9fcd0442c0a28efae7902200d5b0828f5aff72f80c13ee74b1b3534368744b97726f46b1f0a7b4cda054c1e0169522103468fdf077291a01113186f36abe98a0d29b7de04f02faa72d8b735126a7e74f42102fa38b21323e7db5b20509dfb0ac1f9755d5c2b1728e7deb82631f7c3403fbfc021022e35c77b5f253cd97cf044cb4aefd7541151a87178eeb11a8284e887d5e143e253ae040047304402202e7697e0d70b69eaf5c3daabced3f159ca022f4d3f2c408638779283e69200b502204da7e3de378aa839f5bb3e437bb994934a9576ed44ef2f27020862f305ae6e6001473044022018973da37d9416e1815080b4095098ffc7a2b731a7eecc46ae3af56cc1cc6482022002b0415bc97682778cc41c909b5f9354a9c2c98777949777b62e49453b159980016952210312fccbd687d86673b3cdc383adc97d2b25d7540d15b8fbee35dc45edf1b7e20f210278ab234a1cfae6e92355089efdd87354013bd333100e4d33d47104ed2036d9652103be9ec9d92a0d278c543dd0a254cdfc2816da093086b895d6dc49c871fada72b053ae0400473044022030645f0d34c9cc0fb214d1a543a5d1907574dbe417514b048d137681672fc07902203a48ef4c9c919aa101f0781dd0f9aefcbeaf58fc8ef8e040db7dd618cdfa869301473044022074543a2b819df0a82a2ac4b321e85f11377a9e9c6e52f7d50208f87eefc947bd02203d994ffa9baf7b50da6841ee313bff82f4191dc692e45628bf33660206f919d40169522102a7747af975b1062fba38dfbec7bdf7aaa104b0c0ae9207aa9763e548d337826e2102816d6812995aae65286c249a7fa5f33666574f31b4b10d96508dfd6a5d0e555f2102b2fbf55c64cebd9925103601da8ca5ff8368f79a175b4ea9a8f0b72c916e280b53ae0400483045022100cd85991d8c351f045fea7647f67bad7e7bd7cf2783d353218cec6378935ba8ab022003e98579457b2ff3bc0ffb4ceeb6d9a06732e73626238578311b12903d6336a8014730440220796cea18dd38a1b1d1eaf6372ea7a5e4aec0d0d7765159a92a99167e463bf7ec02205319c9aca8189c0faa1bd64a768143efc96f41b66e5f5579946d8947b2110b0201695221035025e655162ef06635382252b6bfcdb11a7f503b1c7bed914ef70bf96a45df3b2102b2f5ac0512c3e163ee3bb2e5c86667e250a95594715bea43aa1f0e2713266a752102854727208e823c96402448cafa364087b573c39690f667cd252e6bde9323add453ae0400473044022077d457d60b1b8927cdb4f4a1b2c25970d461f43712ec2d1b719bacd6425a4e45022051adb50e82515c6fe248593dc1d1c7ffcb512d438fb6b0bd7e7a2bb9ad9b54d30147304402207ba499ffa5ff236da4dcb4758a91b9b3abd31b500b794614fe2294d76d8ce39802200dae66416836ebe70b4ebe2f29bc985da12c8a0bdede22b8fb15d0d9dc39337c016952210299cfc55322183e4a88f823a4d34f3f08c38ff3f0a5c313ec89c0555377ec94cb21039a3a0bf9f469d13987e017728834d692d51791a1262a0a47f46e7ad35262a993210281c0339a2ba488021def4130d609276f42df9730aa3f14b862a4956786f2978e53ae48a00a0001000000000103e0a943467f7dd7916784831005b5e67df3aa4ed3fd1f3c47b308061ed728d1303200000023220020f9066b0b44bc380cb6ab4521b28ef607f1d5755f1d64cf9429b531abce8b6b6cffffffffe94d92cb8a913253a540e69c85a150cd8374c89617e0b629be30f5073ebbb89e0000000023220020137ef05fbd153d5c9b7602ed6a511a8b7d4b49dbd61bd9df3aff2173d546089effffffffef3eb3a585b7817cb8acb5c8afdd30c8ad1989fba95751bf74bc70815e93bcdb0100000023220020d14d2dda765ece63c6a70a5d5945862e8ffbde61d7fa83182ce3fc02c9c34bb9ffffffff01804f12000000000017a914f24bc902ce22924dac39e66db479ceb17f35b396870400483045022100b165a517961e2d6f0e63f6a3939776c80a7d24e958be6bdd41dc24139352e85502207ef39b52179b44e7fe8a47848f9cdddd2590e887c43d36ce81bb9d60300ad17e01473044022003fb290ef74824e94faa5368b676a683160cbaab18e2128f49f58d746a8cf7a0022047598d6f7ef4ae3a04ec235e66402f8db985fda6bcfa2086ed43137e22431ac801695221027d20ceeaab5a06e0c79b282f9c45a22aa4656adbac4a400705a2612bf7008ea42103e86679a82f936f93bdd0ca080b0513e2f8769d9dd495e7d5fe95204d887b2d4e210265b305a1247e02e9f8de7e9b31bd88d5b504f53d816386cc087565c39b8c05d753ae040047304402204200a942bedc486f67efe411ac07962fbccd37b5f113b621e6fcf4d1160f92a002207250ff3857f607efe70a1fa2acf7841fcdaea5a36fcd9e1db2864014e6302ec301473044022029c83233cfe0a8df4f142dc25c735e3b6aca15a31c4809c9d8f4e467041154cb0220108f41d73ef60511f4e92d320d42172297e67f430123cd791e68392f407907210169522103f3faadd482016233a977e847202fae3faff5b92ab21b41c9bd9b054bfd22f4502103d2045e42e62171b41dcd79511539b2bbf1c65b964ced74c46de46356579d4ff221032ff4fde745b5240e8ff4f6d80c7acfe6b085b45249f29d1240ad25e0cfa0c16f53ae0400483045022100f12148a61874cc06673dad03798ab95acec29af4384b877f1771c2bd3a899e1b02207fc60099c717d58ad95470ccfd45cea133eae6fc30b69111bad23ee10d3cad790147304402202db83ad29a5e6042f10cdf1feb9599b9be340fc6b973a93c17a204373f895be302201e9cadebbfab459751d43d458a7bf89ff206939ccb8214bf1c987390be1fdc030169522102e89943233b1fbfbe2037feb3bb9b1413143e992e4589ff0314d5a715ae47526a210219663c0f1fcc64ba7a9aeb38ff9404774dcfc7c68584153086cdb2d5b518127721032dab328c13b34087648d3657787a9347db71047794ad21d51749e0fb81ed801753ae48a00a0001000000000103be964aa85a870b9cce0248f61aea5f490d87ede55fd0054367d06b4cb29478550600000000fffffffff70fdb3d7eb762ecb4154feed197ff9dbefadbfc964eb17b9a095186606026940000000000ffffffff24feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10700000000ffffffff01bef6290100000000160014048d0381dbaa8508c4fb9452d080c361e4095ea5040047304402201e175e9dd9d62898bb0462907118bd2283c5080d44fa310dca7011ee42eea9ed022014f9358e340c748c5cee5f93ba602f3d78e0bdf2a6d4aa6bbf37ef89d96f4e6d0147304402206b0362aa4f4ffc1585e74770de99e7c8dff111d13c4ca13e983b8e803bff1ce902205593b5b4d66008b6f6ec25904ff03051ae2519f0c79ae39da415cc2a91c8c81d0169522102cb227d4e7e0aa21ea7e98d484681d4395fe653d11d004f1c25339dd543a087762102ba90a03ab74ae2d5eec2d1700930213fc7c09ef64ca2750f109b34eedb0e9f0d2102a1b8e44c3453b9935868feb5093b4aa2460c31a43abc471ecacad597dde021b753ae0400483045022100dea3d9a980d02cd9adae664cd8ba269e26e6c1b3c1071999a4eb23f10f925d2c02200ec871fff8af08b8f75e5beecc0d805318b243e93feaab802c2716ef91f8a83b0147304402200818d9aeb9b808fba6349e8aa0ba085726719d8b1c6dfc4154ad48c77ea6ee2b02203e18bb2dc1aac6d96ea45d234fa057f3102c3812b8030f680abf3adaceb64b9201695221034fe63baf81997b4c9481c2b423c778114fc77dc47a9d675e979c9cf082cedd00210285fe53b0869fa34d743f78da780fe9bc4675aa678ad06591e2a6517e29bc3ca82103c1d81ad963432f1f8956e74cac4b90dd93a70d0e1889873cc9a8c19dad61e98f53ae040047304402206cc14ba14360fbd4b91332236477bb36f37769bfb0e851704bba204d1fb4756e022055e96f6f25c19d1c668017ba7243108efc96df9f96b915b4e718f78b519c9cdb0147304402205da25f68838a3ac809fc638cf60f08f1b82aa5943b69daf5aa08a55e6df9960e02205751206bf29ee63d541ee166f1dd0eff7aa1adf6e5d819e97bf9836707ddd7170169522102be7614aeb19d70d0a9806d6198801ada4fde5376dae6a2332c612b24cf445dea2103fc14411492ed487f712dce818e1d344a910f6d5c59ecf9ee0d5a4f9ce8592ae02102c182a824924baf2368cdea726aeff8a069bbf9586ca9ea9705cb01cf98be0d0953ae47a00a000100000000010151bef0b29830defd1b3b7eb30039e17b8af5859cbba0dcfe7c004c6d29f529d501000000171600140c1a4feeefde3330063a0c99969be8ae94098945ffffffff0178ff00000000000017a914ba2a0f2b6bbde25070b7deb7e127053fbb3c636e870247304402200f46bbcc097490d1f3017c2c1f41f034905c559e123b7d6b13e1c3d64cca2590022062c99fb48d09b34372b82832a0f98f6eaff07be3fe12cfab02521e5018673933012103b728cb55b9ab95ddbe2b75c62137db2960b98725fc35e34550fa05d16e67206d0000000001000000000101bffdead4435b08cefa6aa89c625dbaa353b2d13c1a07b5bee2bc4c9253a4680c010000001716001453dd0aa89db6725ae2f9c222ba1e52571429faf9fdffffff02a28701000000000017a914e50fde399720d37868229f96f5dbd8652fb693e587203005000000000017a9143f3648191b72ffe32bf9882d0f7583f6bf91e706870247304402201bbc910c8aee09400199d50754bc5fa5df527aa01c1f2e943088a020ba8c5e8102205790e557699b6a67ac1afaf068b3655db3fdc2a259a32250bfc100b7a23bce76012102a8ad331d4e3150f7cb809b24d5016427f2503f057da8a6c0b557b897949d04aa47a00a0001000000000102fa78a3824c6412878dedfb8abccccbe3aae60d8fe5c39deb717f8236b10b92130100000000ffffffffc33cf75e05ac57d7b5a907d9472745d3fa8199eb9fa5d836857d4896451ef4a80000000000ffffffff02d46d2700000000001600149ff1de52633718e7ea76bb6694fd8e36389619d15c8b270000000000220020a6547fe21cbeb7d58530ab5fbdf4b68989e24492a5b28a9e4eab004fccb72ef8040047304402207479874282719b6399d99f748ab585c778e775aab8c5b0d4bac8585733fd5c1402207c7921156fa2d523e72a1e5711f35ae2918509999aa168234f503e6e86e1b9f801473044022042817777685188762e3dfee11f6c555a83529a86c78f63d14ffa71f5a82f79a902207e7f7b290fb132e78c94d074c8573814cf6d2a3917ecd48abd67ac2649aa17180169522102acd2db76324590f020976f46d8996ab6e0ad401746baa0a9abf5c28b7c8695012103d9328afbf0ac105f986dcd7ed97c85ff901c0703b4be0e5b85d6cace9b3b847c2102bafcea7e96a6b76dc1e3feda6bb05a4f265f2b144c5c564175d7e91c2a3ad4f453ae040047304402207279b3c93f5e73e5d528ce7cbcf6d82f84c6e86e45c5c48c972751e2d326473a022021dd057a89f5893d9cb53602d384b9813ec7b18848fb4b59ce0a82b0a9aebb6901473044022052c9b586e2ec04fc73e8e5e6805c5de456f8156c97898a6caa0e11cd0c6e166f022069a767b8b04f710fae0f4b506c998b3bfe699df6d2f8654bc36e533fde1daeaf0169522103b4f4ce3a25b5f1ec04644f27b15ba9ecfb358bea944b0d372bc45a95240396fd2102b1ab2f22122652ced31c212d6da8e00115ecc556da50f116187b6afb5af65d1721026c88618476b32b56117f1d5e016d49989aa626272fab48575e74dadafc0fe9ad53ae47a00a00010000000001032edbac635a9086d4f38faed923fc42b26544c486ffe03dc340c3bb58de8f49340400000023220020f40f0609aae71da5164745795332f4d3e5ad138e6e1701acd89542034454bbf4ffffffff417ebefa13bcca4b3227e55ce552106ad62f15ca6eb9a23013f82dc57b870a840000000023220020f40f0609aae71da5164745795332f4d3e5ad138e6e1701acd89542034454bbf4ffffffffb39010b7761ef9a529d517118a9246d3667bd18c150d717bcb105431ee68658f01000000232200207a3a1bd9c294343f85b924fe426fb1546500eb850aafa376419ec7d4f4cf0de7ffffffff02e4191e000000000017a91443353027bc2c2b67d97cc56a4ae2a28be30f63da87a1521f00000000001976a91402ebd7a928a66eaf6b10567c8f2835e32ea29a2a88ac04004830450221009c132a9ceafb93c6e71f55a4fc75b16b8d19eea5844bceb61004b13ddc07f72502206e1b5047dca9eaa480e70552f42b002d3cd44377324d38fcbc95079bc2fd45bd01473044022073171097f41dea9559ba51015e3c99049bcaffad78b73e7583c4e79d2b60dc290220459ae7e015b0258eaedad1b9f5c81958bcddc4c41e518710cee17c4ae608752c016952210280e022f0f5dae84c2aed5174ef4fa6552d51c8f8c981e63ac83547ac1bbad9ad2103b447a70f033139232e826b4f1de237405d67934fb5cfb2f9c70beb2e51e8c35c21034a04cf51963a3ef43a86bffb00712cb62c407cd42c718a02e36bced7d079a64253ae040047304402206faea1ba82a9f903c728db472d12e619022b169def4a99d1026e973ff9f6eb0d02200acdfdb76e1a90f0771a358076816f627a4657b9b408b3bdb9b5e8b26b9314e90147304402201a1c9a06c1ff2a786f1c041c93c65555a873d52ec8a934a9f5ea88c1555cedae022042bfc8241673622ff2f711302b81ab2c01508c112e19f80a21a27fe7a144997f016952210280e022f0f5dae84c2aed5174ef4fa6552d51c8f8c981e63ac83547ac1bbad9ad2103b447a70f033139232e826b4f1de237405d67934fb5cfb2f9c70beb2e51e8c35c21034a04cf51963a3ef43a86bffb00712cb62c407cd42c718a02e36bced7d079a64253ae0400483045022100c9268f373ee73ecbf55de2d11d2ee1f1b32924c98b459fb4d5ccd27e48d60d890220128a35bd4bf7d940d07c33c42a351d769fc3f6da5c003330c5f9817151e5b9410147304402207dfb9902bf94bf825d6481973ad67f688314616eb9cb4c521e29c8e59cce3dd8022006971350451110dd0bf16f3f08ce41068c3879159a017aa26732a224901f0d1201695221023df1bbec06425f239326c1dcf56096ff8dd4d7064152cbf8d44b95032594b17721030f8239e01b7151d355f4c5779fd1753f441667b5bc6033592826b401e613f086210284252af1b4823709b7e34cb2f2ee9d70272d0064eb29dbe89907b394daeffef253ae47a00a00020000000162c7023067e19f1a5292e65e2ae34aee3da36f0ebb28f30a87b6e6bf49fa3bba01000000da00483045022100bd4fbfa828e77ee2358e435264eb13f8be828749eba3d5e11d7073de4560e9ef02204314bb9471084981fabf11b682608f3d1fd89ca813cb3e96429e9fb22a0b967b0147304402206e1ee1ae1602ee33130db08200e2c8b07caa91b92e365324d55eae1b820ad59802201b6b7dd23e4e10664f706942b22596abdb16fbf337fd650b5e516e2e6909143b0147522102816ab738135fd14996e5e7634d0a536a8c0be8a27f780895c18214a109d41aa02102244dbdf46d1367c6b8f44f2bb3153c8843347b440a2920f095388d5a9807b2b252ae00000000022c440f00000000001976a914f1768ae6ffbb87191b8600fb69bbff7b070c9f3e88ac8d72a6010000000017a91440634823fe9a4a47a51d1f4f8e81137c9d9d7d79870000000001000000000104bbabcca2198fe3013b2a88270260387363ef5213f190ec45a8168d3c8117d8200000000023220020508cba13b94cbe7f139d29675123f7d79c258f809deacb78c7953b6ce9bf07a4ffffffff022bea7421a8f8977d9e4b7c0c5c540e46db54d9ecbe628f81a334ed327639bd0000000023220020fc17ae29044f99d6921a916cf8e8f2bc0248e8cd735411666253d348dc42c08fffffffff022bea7421a8f8977d9e4b7c0c5c540e46db54d9ecbe628f81a334ed327639bd02000000232200202c42d1abdee3db86c4a10038b81b43f9595077a348a56dfb209c8e83c28b1c3dffffffff022bea7421a8f8977d9e4b7c0c5c540e46db54d9ecbe628f81a334ed327639bd0600000023220020130831d177ccd71afa7ef0c06ad98fe19d4509a9a8b668b49945548b1831e7faffffffff02a3ba27000000000017a91411f70e8674cc7746036ed8e932ed1789446d12aa87d05ec9100000000017a914ef08f58ddcede15bb6e82c72a7bdce1af788ae3487040047304402201ea0f562aa37e3dc7901d9ea6517f5616ebb64c9a685e9755cbaa958491a6d240220299427e84964bd590bb846af286cbeb9b91ca947966860f02a4a58a8e3ab4a9601473044022046fd1194121800ad5748b9c6d75cf42b15f2b47782d379f186922d4434b80db1022026ead0357642331d11f2c98303450429468d2a8cc37a5e17d17428b18879be4c0169522102b95dcedda09f4ceace26e0095fc5fe645e1090a3bb2f6cf66914d8bc52fbb07a2103404e82d4eb50b6db2c98b88ee6ac26caec187eb72e3acc5ed356bf07f657d4f221023486ab7f288087e4468638c8ee2f84ed1c4cdc19e3db31200e40251b60cda6a953ae040047304402201b8964b7a789d3b0a9349cd06ada6e86365bc2a7b67f81063ca7838e6f7bb67a02203646314a84e35b7f673d3001ce6cd126046cd8fa06a7efe09f22442a1e12db3101473044022007aa77a0b14be273408e68ee1f44096f18aaffaee658641127eced562bdbc65a02207407aa7fc8e969a1acbdc285fd60624c9fc9c2d5614968c3520dca7dc0a49412016952210379391669b0006b8500ad7666ab87f7e66e5e277269e934637ab04afe568808182103f9f13d04453b47958f126dde8d0f016c0c9f293ff890021af0c546aafd463afb21020f16211bcd306de33b66af6e7d3c2ea28645f9efadcc139fd0b85f5c31774d8f53ae0400483045022100b00a3795f2672aad9895dbda77532ebfdadf129130aed0895295f93131262d6f02204731f21147985656c393b369fb0d73419828753fdb713bfec02c9e97cfd42dac014730440220044eb953148a53fa7a00da38403216b5ffb79693280f73487b7aef53a937296402206d6f1d3b6ffbb2fb1c34ab453f1226e001801c61893a0c6a11d7313e43729d500169522103b5d9cdf6373b7f9a2249cdf64e43352c60a03c0e07bc9a85178955c8cebfd2e821021fa2b0c70e51a4c86b6543e77473e6d76eb9debccf1640832590febfdacc6aef21033f3855923421c0db28ed27793980cddfff05289b83da9fca9603805b6c1840ce53ae040047304402203bdeaf16347da7db367773a7f199bcebe0bf2c666252bc1fff881046ca4d11b302207287870ffb156fee72b12d8c4b1ee020647ec460aeb07b4d186f9a5389283c120147304402205d17798db3bcc9df90a6d08c27529471ff800dc3480e8e04c0b6f2140d3e145c022049ec4ddc0c20b6525aeceea09fb9e685b6a8e8c066c9e6facdaf7a10103b26d201695221038debf466d756823e5ad90f669ad902fcf70469dccc8d96b34064715a6f307ca4210318a000b05a387f4d2b8e87a19aaf7c29af94a5971280f83d4f9018bb06fda652210284bd7f613327a0961789b18f73c846fbe66b661e760e023becfd82711257ceff53ae48a00a000100000000010103e334d93fe962f07ff3eea641e492de620d54082e549b2c603cc4d71bf9788c0100000000ffffffff02b0ad0100000000001976a91417b38230e22253b56c56eec51d222e0203ecd6c588acfc6d3600000000001600148f35ef41d10ecd22ffab5aa309df1f299e391fbd024730440220015cf9615f0afac48f072764a6fa59c63cfb17f1f55a3dacc5d1f63972e4341602201d90d3f380d99af4c42b9e949f7d6a512e751ca3b0ae6ab5a7d87968454e66b001210299098625ea281ae339d9f660a7c1f40996b661369ddf4a6168a9498aac828a0600000000010000000213a0939fe113832027aaaace9f25f140ed19b8290826d79d67321b74c956bdb2000000006b483045022100fc97fcc437728349fc741d38e4b1499b8c94e97ab4a1b0c3bfb5f42fcc7cbe2d022062a31f6515c52264a6920f7be53829e24ecfab9648dd8cb60891a7244fb30aac0121029dbb75e27c953d8e3a5cdfdd6043ac1bc70837c5264d43d8a2e1fd3dbd14453dffffffffcae8a0580c989660922b8991e990b42a894b8c5892c5044afe709e40386d3f30000000006b4830450221008c49669b8b7d0c56f563798613b23a38dcf0a4551da0d3360c533478ce4a1cba02202fd042c3c645a161b49ffcf423e49d3fb5fd35ecc8a81dd4471f46335869c1ff0121033d24bf38988feafc944e9ef0c6f798d7512b2128ccddf5fd11ff090b52fd14d1ffffffff0240420f00000000001600140c95e98f8572914a4eaa58b9c03acdeaf1d244958443ce0000000000160014c251f9c4feeb566e603fdce803b8eaa1b11a5eae00000000010000000001057c5bb5d7e563a8cdcf1d3cba97f4a4693dac5b63037efb39a21dce40e63bde02010000002322002062265ead317088bd888cd4d4c0d5322ed1d5d7fd769eb78e1f59c45c7e124d0dffffffffafc3b3ea4357eb7559505c6c81a525a4d8060d480b9356b69a8ef9a8c8aa8d2902000000232200207dbde115d4611ff2cd834d0d1e8d515f06d2539062ec883a05725045600a3f8fffffffff7326094c73359a8e841b30bad10f1a1098dfcae2562681a1e3d085ff3b4d014501000000232200206b409964bbb5081a15714ee3fb75d62af85a09b410cb46606b915f8f48e03ee0ffffffffbeb6de9c3588fc993df2a6021db859a995571fe9fb9ae279e1af5c4606e0188f020000002322002025b9791689d1f02940791149121fc71da313d56364b3ff12fc53f29fbf30e191ffffffff9970b10a4e9d2c70cf256bd847fffeb5fe2d1aa22b4c287d66681152d12900b00100000023220020dd4a082b71b5dbfac2347643bf386bd9906ef52aa36e8a17e47cfac09427e1a0ffffffff02f4cb98000000000017a914ec804bdebf1af929af0bc82b88b72f0256446509870065cd1d000000001976a914cea3656b5e98d764bcafd4b62850920ee426c70288ac040047304402202a488d243815b1ff9437d702c3a04caf1fec2b68e3b9c01b5dfef6c46c7ce95f022048a45f78a37bd3873dd52a57dbe57262e026abf06227d8d077e2049bb25c40880147304402201d703c2ab8fbfe0fd89c4ebf3ff6cf50cfc6d5cb5b28add68662fd8e11f3378a0220375009633bdaa18f8f126b0b1826fef96c6103f220815ce9fb1b3b1857e7a4770169522102083f15fa648503e6661eed119898eb750f1c3bcebd387ec63ccd8c6537bfd2d72103d553d94697ea62b175a2764354329b83d3ad121d29a4ce9c5dd9cf4b8619ef6421022e42adb542ccb43170d35f300113d6293d6af138e6b47701530f616ea2f6814853ae040047304402207616d85f3a10ddf3be146c7a7367b807b2ea21765ed9170643603eec1919b2930220269809e88d262ca1b1f4b9b86ed5f7c083d7c9dd822c078ac3fa0d3b76d0de0d014730440220622fa1456447da05953e2141e21a7cd49c0d02307185af5c99a8a5c9f4d24e7d02202c31eeffe778ff49e01b660ea313ae106efd730ffbf2edbb2e2a1edcdd4ed8a8016952210294f8aa383e65d9511e216f779ff7ce91dde0ffc65696ff148ee3757b54791024210241c6b5b7340c36a6f6f85355349e005a878fb8e23b9659852cdfaa755f89de7221022d7fa1e2650a37a0362aecdd5328bd0310263f129f23a275fc74f48e87d6d47c53ae0400483045022100a871dce49687a0ed63f43e2877a112df723b8a5b546e77f340b872601bfa8ba402203f11d8ec9941e9f41e082c4305b45b0d00ccbf2c8fafbc4b8fc37f145cd490fb0147304402204e82ebd32b7ccf1fe15359e1ce7355a3e5ad4138ccc58706878a88f3c169ef630220108f5b45fe6a9558f41abba0306723c51a4971d596ad1a3a5b828ee04e92297d01695221037988b5f27932fc625ab7dbc5c2e3929cdc7da416c055d477ea75427b048f17a42102e2ccf7599048a8097a146b0a894331bda7176ca71d7ded18252d9fdaf3ce9f9a210277ea5fb1a5a0e2fdd0f6155d9fca280edf88f32035d1e0f1119de21dce5efcc353ae0400483045022100ac8992d4ee3399a1792bab679249726cff0fccdcc58e159c8cd111f1c9d235d102203d650f70229fe68a437ac20d39464dbd07b25be8932e3564488496c9bd56eae501473044022060970ed9330a05fc7385489672da1c613c9ff5aca48f2a7c882ba4d454c944ee02203d4102858ba0a925d783a1c913e5493dd6f1100324d2a419a5bcb8a4d134be720169522103dfee28856f385fc7b935f4f6f0b39aad049bcdc8cf3ce3e5d30250b34b53a2092103b0b2c6c21b1c10d6176f024d07753f598664d57f8f23830f8bbffb61ab976d8b2103155060fd2bffa59f18a56ac95dcefcc9b5f9e85283c6f60b913d651167eb35f453ae040047304402204d288736fe532e6fb32ddfeaf1309717f3152e4600f9f75646eca7a2e4baa24902200c761ba90e92133567ff7ae8d96215f90b2a70c6f468659ace88b54fa5948b0b014730440220288c8b3511ff994c5f6dc6d88614ce7c456a6331d191e255ec95bda6a6013851022044f477edbfea48e035e5e1d2439aea99b087442859d61563c761667c9948159e01695221031f543204354864f2ca4ed852fe9df380d52faa4119eab4bb39aece72419d8f8321027409700084c73e154c846ebf9b4d544fa5a03f987bada23cd922cfb89ca50d922103fbfd5dea08c2bd8eb1d54e7c82717a73d09230973265a13bf4589fbb0d8df0b353ae49a00a00010000000001036cbd696c266a64634fd2ade800c751a321057a299ed87aa85d599f07881b801c02000000232200204a4d65d65337e568516b1bed74e44f59ce563a49448001f83028ffa19408ec09ffffffff50d4b2e3413924825250cd6ec2c449544fafe5b74ec1b5b3874df612fcaaab2c03000000232200204a68942e00130ce2e937038fa18753562ec13985fb846a7484f9c55b6066d7efffffffff47155a70c27e642cb0c5af2cba683cf60ca073fbc80da270b92bcdde1b74e7705f00000023220020d0cb4c910f84b53412f4fedbe5afa32fd403db9513ff7f1232f3346c75a260d5ffffffff0199d10a000000000017a914da756ca67e9b52969643fd783e8d4df97cfab45287040047304402205d761bae92162469546c8a268cdfc20291ba3f81de315ba0f4254eff2b7231160220022426158976a0c0b84e7dbae47161c127660c0662344998081e73938efed1f801473044022059b66d985f63b219107072ae858293e5668df97613514bdf13f27c8a838837d802205a6d791991f3c173b43f49345f945622ad369d8d2c29adbb67cbcf50015d8825016952210312091ebbe8b3ca70755f790f28611551ff3dea44f7faf639f2b1ff848c53b144210246af196007d1f636400ff8e5b60282c4186e8fa4b467a50f11a6b9d2abc9ad4d2103061037a38e72c6fc9f0fab9111373572ce242bd06a175cc49e30c5d46240a7a153ae04004730440220138600b05d0d18894afeefdcbdac21e776d8dd2ee73f4cb71eafc41f87a700cb022018c6af2639ad63e49f7b7abcb284ed1d9d2c7b00065cd931ab6132542b27f6a2014730440220385afcf5688e4e1584f927cc71ab43b30995e377d1bdefa613505d027ea4b2990220385168d6e186cc9f4c9b074612c4ca7969a0e9174bc695121dbed3b59a1f6f490169522103d2e38b2fec781dd1274ba3a3ebfae8ff467191d9bef229d0275b68d380ee71c621031be63a53c623d863592a5994b25ab67ac0787c91f4953501f6476589ba8fae2f2102072d315895bc6f6a60657ababd4f876b4aea508e7e1dc7e62da2db99416169a653ae0400483045022100b8771c44cfebc365c1d05410b182993a41260bf2bb804ca32d4c24e631565ab902204dbdcf1dbedb53a5cff94bb087d8e104aeec1eff6969c4f7a54794a5f4577fb2014730440220662f82f7fed081b63341a18f12c5e8dfacf72e2fca3e15c81129ae96ad274448022006d65fdc217c71fd9cbd33688bb3be304c7c3d44bd5b8c8f8ddce9af54b25b300169522103f7e5b5f2cebc4055b5a23976d11492fa24e162eeac9cf5ee4059964b2efa73b121025cf5b692d458b9377529bac8a38208395dbbcac1b12c192316c01df1722176b62102f4666cd112e4992c1165df8d0d1480e69f0f4efdaa5a731d2ddf55d3b1146a9553ae47a00a0001000000000102a186767a6c6685227496db0019fe024da64a759108edbf77a1f17611d6a9347701000000232200206a133d2621783fd0727a38fa5160c36f8927f14e13085411fdb42aaa5b0cc5d5ffffffffd0f7eb8b2314e70ae38b1ac18760eb555103fcc9fd9dda35d674e12c48db90b601000000232200203ef16605573c6f9aae60a7427380261dbdab39a63d41715cabee07b590ddb1a7ffffffff02804f12000000000017a91487f3b1c5efb746e872f5633374fecd9fee6e836787c7cf13000000000017a914103a2daa10a67a5ebb875ce2efb65b362e70c8e18704004830450221008bb20e694931e4f489ab55fe331e68fbbd1b662deaca2dafe106f60b9386eaa402200f92f5fb9ef9fd4dcafde893f0c1928e9cfa156b013c71c7e2126a06040e5a3101473044022037437f7427248ba062ed1ef1b4855c8eee4a2801b453e06b0a322893a1eb185a02203ea806ad1457623602f37399db7d3a0ac8b9c5eed3d1b27e9476f4d79a93ba3301695221026381e526e8de2d02d27ede9bb15cdbb88bd4fc76f3b32ed04cbdb847fe9b3d5121021ef18a740ce78d12ab055e67067dd33f50a8b8a00f7703bf339b6490a83b2790210349587dacb319dc181395887eeb490cd2242f9b0274fe80bc49e306ea053de10153ae0400473044022049c0b7db9791412b0bc4a60b2a00c9092cfe8b167e35cbbd232f96b79991e3d10220335be6990aea873ef9ab63de82202c844c40f4d244bd0528e34e4b4b9daa2f900147304402207444c39f78092e1687b9de70b9eec4f20cad4f094c12549470f9ccbf74743fd7022054512c1539f62f00fa45c7bc05018a1dfaccd5b7ae28fac250c2105778f4350701695221038927fda8112795cf0eb16e94822c01b819db9bae1cf5bfa42751e380477b35e521022540e61ccee24e8c330b031e87c669da2367098ac6640301d50f7440636e6f3e21025add7a9fae344f05875eee90dd63599f4d3845f07b7ace50bfd63cdb4bb689d653ae48a00a00010000000001015de18a76baaa89c1391f3f3fc5d2d8a0e8f3dcf0320aef984f1d955c0a7fd9fa010000002322002075884ca6e26011cb48064ad2e72656a291b8e1cb398fb110057c6b9d765d0c2dffffffff0280f5be3900000000160014fe9c1b14110f6f4a947960cfe118cca3c9307ade753be6790000000017a914b47ec3d5bac5c7febb5b8ebf31831a5fc276ddb2870400483045022100bf3ec0cdc6dcfa6aab52a374c2652b9bfaa356bde73e459a8095ac1ada58944f0220080304f012d343daf2c4761ab0d63cf5555d3411d65b36f62bd637668ddc6698014730440220022076b76f4c0a60a829574bd68827a54bfe572c874df14456040ce036dfd1fe0220577e37de5a37d7e787fe19e58a849b35f9278ec18ecddb8d082f76b4861530d00169522102b6d2c7cdf048abb3e7f32a615fcca3891aab4d3a7dfd12b91eee20a68ed4adbc2102f5e670ab81cb87bedab70d06142af498b185f68ddf863f6a41b031c87ebcfed121034d15873a40248ff78b7d458db919d13e31bc0b922c2bf1e755402d08b141ba0453ae47a00a000100000000012c820e2eb1efd253f123c992e29202527c4d5cff66ce5b08fe7f40a8efe038b80acc02000023220020157a6c888cd28aa1fd2ff8dbcc165ad12cb294a3c455f6c5b7612ecf9c43d09efffffffff098dd06cde78690dee54869b4e95f86b43aade9e2cd92736482ecb6b87b3f0e18000000232200200466f0faf3fc37eb3dece6b3b130bcceeb4b7ecf938120bc6c94beccee6a5a33ffffffff36347c7292064c63f9b35d49f1b5351cda8b125e31260e3187b14988ceca9c120b0000002322002044ae191aba89f7d96bf609b2e19e95ffb24fb5bc5e3b742fb401b72f06580881ffffffffc8481d59f3bcc9fee800a97d73b1f8705ee5effe1bcbbddd552cf22639307a171500000023220020a110e7804760bb48f97dad7db88348ff9c10d922d8468d6ccc9063e2e376248dffffffff83e08d18cccb2b77f38fc9b11a1961a4761940b89f400cc451719ab0165946191100000023220020e30a78021b9565a2310755b32b84ebf390cb23f7660a337d4ada5c5c3e580b81ffffffff8d09987e4b753e3878b57f6a50682cb61cbcd6cd87f694471e1f41576be0e019bf02000023220020b3083a5426af8d18b9657093643147b01b17f38f122a8a277c360dbd4f025e16ffffffffe55da240e3cfce90cd1dbf833e7231d8b2618997d0a09421074875eb02d25920140000002322002074348007aafa9c474ca9fdd4e7b94efa5febee90b6e9304f616d5627ab97b0a7ffffffff44d705d1df4d63ba49d4e41ce384814b26b619add30c0784bb3ef5a063aee0200f00000023220020be93da216f0368f863d863d01361f43bb1303063994778d5ce71e7e4ec208929ffffffff2b0f7af01117efd84c7a5f06f019ca13015ae7975ecff45e4e3f2b7a385d2923f802000023220020d75ff6ca413a5ffe855385abdbc423172eaea39e97cadbe91c4101b4b46ec134fffffffffa937827620f6ca2e6de3b9d998e8ab62b1ef0bf89ebaa55b02310c878ae03260600000023220020b4c9a09ab404d1424fe6947b7ca2fdfad1b75294ec95423eb4e395e30dac6aa9ffffffff843b68dd3f572d4cdf696c975051e22910b1884196d2ee05437d2706fbbd3c32120000002322002030815acb88ed693e6b3a294bca372ff3e385c0518a5e2973185b18d2ec78da88ffffffffff9ec988c7f08f3a361fd754090b5240b5725982df8e6b25afec4b007c083f40000000002322002043966d3fba024e8fe605d1afb6f3731f96420fca005f9d193e66a992d523e89effffffff75633525264bda6f65bfcd19565d0ed4919a77120ba1afd8bb86ea91e4c3e6497f00000023220020d6b89ff3c3ca280bccc3dd22595ec633dacdde848e3b5983d74c56f7bfce98f5ffffffff627996c95157a9982dbec8077d83baa7dd836943bc8a3b09e1258ba2b03f345919000000232200204165a042ea4ea9041cbab08e092d3dd0077b0c9bc214e942123ef1493b8bf224ffffffff80845e38060bcc5296f300e5e79d1f3c1eafbc04513cbf3ceafcd24a842d28630c00000023220020be93da216f0368f863d863d01361f43bb1303063994778d5ce71e7e4ec208929ffffffff18b483907cc08a1f5ebd69a0ffeb1b81e64745d7f662fb8aa20b9407865787630100000023220020f856543c85d0867e8a592b7f567438fc1e95b38d5d28f13925299ccc12e1aaf7ffffffff5b2553d57c94b5725c481d6f451120b1069f637c108095032ed83a9d743a0c6801000000232200202e94989dbaad89b6602946e06558f34d6c05a2f26d6c5aa688c30107eecdee73ffffffffc7f6a231120143706717dffc58ce01a685335144ad15d4485a7e7225fc9e1969280000002322002074306cea988d93569bb04a5c5fc511be808cb57f381e496f7e621587506f1ff0ffffffff02dd54ca71380419e621a8c9e069f5cf002bf376f9d54e1693e27a660083ac730100000023220020fba49e4c2f9ab55cdebb81f9d650a435ea3980cd2de3e714c4f347bb0665650dffffffffafde2cc8905e1c17800ecb129383227f69effd762d0e8b60248fb02ddd0e83774705000023220020ff6ab2f515da4874e1f1f50fe4893bf7900c03e068975b93c31df6a35b2051e9ffffffffb931c8e7ee065bf8f1bb4b9ee1fa0e4b42a33a2de2ff46aae457f9b87b6d91781200000023220020fa9133390e83689998667349a23a712e2a974ad6728b83906f53537f190229e8ffffffffa74220743ecffeff0a5dd785739008c2265382b17aa644ca56ef968d399da478d207000023220020cca67f5325e86fa75059fcc3e956e9378051f99c8c4984c8141140863972b835ffffffff5d2ee9072c20fa009c366f0ff95134ea9958455498f7eae317a10c8314132a7c010000002322002080524557a947e8471c5fd72a3363f150577793cd0481db8700f40cd664ded4d6ffffffff43b8f4bf0a998800198cc8b4ec958158eabff0ad179193b7709e45c0da4083820500000023220020c5681e2cb83d7d66d39e4097763de418e880685f9957a4ad45f9c88edc36df8affffffff89ea01c37ed9ea444e67353dd2c077d9cd0bd3b33ed82a753701ca445bf000830300000023220020d1a435ba723b2137df69964caddb180079b9dba5e06cbcd4007705311d6ca990ffffffffdd306d27815face0dffa0606931970b5fa9232207c7c97efac57cb3d662d798a0b000000232200200b72da9e0f9c7f8f99dd47d786e887fa67c4976c940943e1dd31f9fde8e89724ffffffff65dfe07e486ed2121a0bf5d0598be453960f022008141aefd186d2aa92b7308e09000000232200202544620848656515525d2db2b86e5097e8f7d8613064599cfb7c0f5cfc3b4400ffffffff2bcba93c5efbaa3a366e4fb48ad68ddab40e540eeba3725178f60394fe2ef9a300000000232200202b18ade78ea15859cc2aea184624511539ca745e36a96890710f0ab309bafcd2ffffffffa2a9e1ea78a50ebda619ea6d477b493f7284f613687ceabadbfadd1143ff26b2aa000000232200203eb028916d860d794c29dbaac43e20e628998bd6d266b1ec1f34315cbfcde77fffffffff8ac936b72e36377d7e120f411de172ed1f1028f9385dc486628ca7dc5fc9b5b2ac000000232200203c949a89ead1eecda1578a13f3ce611ec1008da1ad9e90bc52df1d17e8d4c3f7ffffffffd7ff8fc452ea785dd534017128a2fdb87b69085c360bfcee38894df1efc7d8b7100000002322002007984a9b65bc38b99c7d12912ae5f3c3032484915a6faa036bdd36a4c4e634f0ffffffffc019b7d40e4b0e8a0faacabad4c7d07a580308fddbfecd1275901ac04cb168be2609000023220020fd758fda07c1b239fa797868fc88fe2f58d2595b426d91e7cc523daf6b73b70effffffff01b460bc4b3479ace1039d27601fac9e64064eaf690dcef9433c5daf001018c43f00000023220020416c5b47bf6243be8bfb6711af6ffa8c51478f376d3388d250374312cd3358f0ffffffffeac9ba43eff354f31940953dc5d1b478dfef86a5a6540f8fb79b8c13184b3ed30000000023220020fab52a2f4acf2e0ef734a218d9bd4e1ef2aac44c37fad6e4b2c22e9e00131a95ffffffffc1d2d27c37a863803a43caee948f7d5d2820f218096319630d99d74c7af9e3d70403000023220020f131fd6fedbbfdcf780dc1e9efdb681f8627e03e74df8fc632a1a10a7b36a795ffffffff3194c7bf1390a126a3522e6c0bed492ae1fe00e33b91123f09316c40854b1ada1f0000002322002037cbc15396a7de4c1e3afb4c58d9a4cd2d3c2848ea7d0eaac25503a156d12c8fffffffff3e8e5fbb3cbfb418c40a54e4c34ade6844eea64a42c61ae9368c817961092fde7908000023220020824e22fddc05cb373bc809a08b3a8edb218fa9f6e0c78c2c6ebed59a2ffe5225ffffffffa1acb59bc5502af945b79126165f43eda83d960c27a03ba86b7663780b1fd2e627000000232200209eff597cd49603f43a1409b9d0770b41fb7c3915eece65a58e614a2216237615ffffffff06cae7d75f3ea0761b9f4dc52380123df2f5d60894189de615ca3d504d929ee85d0800002322002035264bead63ed524af49eed8d961bd41e33cccd388a4ba0124b6c7e9ac06809effffffffa13daa753362a62dd63d9110f7e9719d00b15410ba47481d9fcbe627d57321eb3800000023220020fc0846da6104f5587783a858a57d0c94b053022e7d81c52ef48ea9ba7d1c365effffffff8ce114f6fd58a7111f28eaa22723df86d9b7e70831bc4c676a6c593355d46af6b0000000232200207c05745873e72daa3da13730ebea98c5100bb0edcc43c68143028f9c7a0cf5d6ffffffff1b9d160323b8674f868909a937fa062f63b8dc5f7ded512872713a1c5a159ef88f0b000023220020240d9fa352834411d329a80a2d4c92f1466c43bb9023a631b389f360a5087adfffffffffd8a463e9be74f5399bb4e5df872150f83078c48801b29841787b4286cc7259fa160000002322002014e9fa16470a0a63512ba1f613039dab2e74056dbdabc74d6bd86d1c797615f1ffffffff0d7e98fbb39e7d4b7df2814a154c187423b8a4624f592a6f32b4025cfebeb0fe1f00000023220020413438136d8728d623f40f2057fb848a7be0b9b8a1dbad4f982622e970545eeeffffffff0229cde8030000000017a914cf1e9559462a6229903a8c1ac576635990d8f580875e731f09000000001600142b2983420d88dfcd1d7f93e1bb9eab06a124bf2c0400483045022100ba8a460c734cb0d5c67f4a24c35b87223fcc82351b1019193a0bd7e264a3db9d0220060843d8c2a80f1d8a8cdded2d80912993cbb83e57fe924b74d02fd4992fd9d20147304402204574d7d3bb900c3d4c9db36b3d8659fbc3fc1d79e1b5579ad387c5634c1ddb50022013867e3ef4b249440bb1fbc76271dfcd2d2e2007e2dfa85a10ba1c1d642412dc0169522102a5587a18e65792d4fca8f692523f7899c3a5b623814320e0c9d6809f30906b022102d0131087eb3c8e148b227bef3f2af23c89b4a71102474bb58688353dcc9f1cc0210363d915ed0746f19024e1b318db76842fb81b8abad83ee25edec25c9421787bce53ae040047304402207bfa3ca07cf6d0ef270110d322485cd84a277fbac07d474c151c846886a84f6e022036da77d370c0df8fddee40233194b953d1c2c44f16ebf76d7d571b9f84239b16014730440220310dc0e62e1508977a2b7b1c90bd2641fc41d8e1a4fd17f40d25cac8f278d62f022072e03f0a07758395af3e91d268d9e170093339a71be2c8f3dbcdebc275f51b6a01695221035baada09b485865fe3cb5995fe787cb4dc3b5bdf8fd24a065d2970f06faa87742102e5a8d893d5da09ddd78f76b705e10a6c33509534de29554aeb802a9adac074ee2103ed5be69c2e1c656ce95462f973e86975633506a9834c210992c02050fc48177553ae040047304402207f3af246e8607251fb6a24d20913c085b23e83e803d4b15da821dd6776d2cc57022074c6207dfee7b2823812d58d80b3fb6849cbe267ec10fae3cde5e6692fffabb30147304402206afa73f017ea3a78df96c9afdc6f45ca764965ec4c7904ea9b5e2e1d217dc6830220573b3b9a4ca49df145c68634d697b2d95a0301416d56332f453aaf79047cc252016952210289c711e6759a8a52ef35356ca1f048c4195ad18096816d2fb84cc05242c2b57621039ab50a3e7da3d2589ff2b9d5f2392582cbf93532acd9a22b23fdae10e2a5b08a21038e4d73aeba5d56e180eceda447ca7afb211b72e957a7b2d108f83248c670efb553ae040047304402203bc5f745ecb7ecc554039a3d5a28ed002e7d7a76ef2d884d7856f4a2c04c5ef202202ba0fe7698ae19bc800aee1f046d0a8c8e04822937b106a60c7018407499ec840147304402200b35fab02369b453197dcee63cfc9350eecdac9f99ecc13122c4e6ed15deefe102206a947b1db4ccc943c0fc5a3295d5852b8b9176bc058a1221d865e379de6b3d8d0169522103fc0d09058699416cb3555daad423e67f59f4ad3c2bdcb90ad0786c78239724f52103444241d7d6b8a1ae2c1b056b0526ec35a83f1da150d79c791d35a1e31f07a5312102055a1db0f51b9f9727c71cbe764adf2646d4156c9c1e6bcb7cda8e59272d0a6c53ae04004730440220017f5e3d7dc3729df2ca9cfd725b8b3cfcc3ff31a3c43a4a6ff05d18218268fd0220598bec00982a796bf327ff7ecc694f14b48701b968e5efd8e4136aedecdd0c0d014730440220168ded1363283727ad14c3c9affb6bbdf4386c1fd1904c2d21b5e8e6dfcac73d0220372f9123def8b1176d57b5e09a35fc8526afd8596972fe87d34464f6cc4a0f7a0169522102109ba5d5095f02501579d296ad67436c02a43e9f074cf9bba34283a8eca046c321037033edba8106e33cde5bbf0a782cbe7ab4d06b3e7dc03bea99d17fff6b466d092102918e2752d819090787b6dbf6bce89e75184862ff676c57dfbd5d6024047a7f8153ae04004730440220238273eb28ca375663bb8bee2046ee36e471279933de477f174ca955a767264102207f39d6f136abd383f74b2cbad0d47924cf91be689024fc001afdffae995e580e0147304402201f665aafe6943f3cd11b5e11c8d3ecbda1ded0467bf705bce72391accb75691802205b03da40a1a6f9c8307ba80b9a0a903b12956d5e0274c96b66178cded0249d500169522103efe693d799447e66002911c3004f6c71f7cc8161c68979916682e6cb969067952103bad2dac1c952dbe1396a1554d07358713e217f29be8df92794ecb0fabc47e733210270428c85cc5b7937e49ada42a2606756896b197a47980387a892f52e143e8f8953ae0400483045022100e954b4e9eef9df9052ee289fb42db772cefd6ec925a4af4b477470763526a5a90220366fcc383129fd6a01373aaed2318dbfe7871a44796a30c36d8a558d82c47067014730440220599b125ccb88ec38037a6122c558c42a4c9ab749cd438c475f3140251420196102202aba51f477fd0a62ccfe9e0c351e72b8d904746300dee4620690bb67c55475cd0169522103055d59be9d96d5699836f5cf82b83319f1888b1c26af2271dc06226afa89812121037923db249b09ae6ca3aa8f26551838a7564e8bb1794ee8a6fb8557219461b7e8210260a7c707aaf4aea78bd904b3798d9fa71eb1f953b979bfbf4cc5f875eab9360053ae0400473044022040d100e893c2d5e83b8a9c9e9d0745b082a21fef90465608b93d4a16ec34928602201ee1e62cc3a49cdbb07fbc9edb458ac558adb986765e54b06a081244ef17b2890147304402204588986f9b2129d19669d15429bc02ceb318cc2f3ac01295e35dc914f7fb6b38022021d88d6926f6a5a24a4cacf00d1fd66d9f92c8102243928ece06e6551312722f0169522103d9b28ccc34271609b23273f500fa70ea7bf14459ab6b384f5373bedfb20a2a4d2102dc77fe2b11e51c41b97e8ac60bbccfef097bfa1e07136134b634b6a9a10999e72103b07cc8f3def67a5bcbf9c40fd8e788f7670373024bd33141d1208a31833d115a53ae0400483045022100fffee5749c359316cbc7e3ad7fd7eafc18e1ab6c6a695d502f025db983ca5d0e0220278ac8f6852f2076eeae2904b625e83a19acea593be651e252086c57195b69900147304402203fcd00e01f3cece622d0563cb90531e9473489c4a67434a0db686b1610493bc8022034cd1e02b30be7081bb2bd7d1d41caaa7db7f3ca0a0e37d7926f1194d11eb6c40169522103d0dea7afedd67a016e4413aa3dd9cd837753d83fd44e87448cc2b044595446b2210380ac04480c3c8f920c0e859f44728fd5d9e847d23cf0ef00c0f49ccc754025a22102a5a9f8737e44c1a6b0e0cf2e6bee14304b2261e5ff1fb8dd1c177f50e777af6053ae0400483045022100bc8890ef05d63f488d2fb3bf268752d15afbc767f371605e30ff77f1878622f0022070aff8de9197861eaf719850266df26c56ffb9b12e0c50e4fbdcdcfb803fda1c014730440220233e3add4d7370167e87f9e9dcced5bec0884aa4e806ff4acf3ebbfd08a6fecc02207ac358ab07a3383cca283fc18661703eeca445e3bd9db6842b79452767023726016952210263eca629d06784f002aca6cc2d07841a20209b8f693338172c4e1d19d0d9147f2102ab37e5bca123b58d3862ca87bd34fefb4add649aba6430e33799657743054ad22103a9e33271b9940f9edcda5128272363cc782d93bb77d866a4c4d45af9443b21a853ae0400483045022100f72df3ee399cee990cb9ec2bdb11471ac86e3b15a64b89c994dc612727e48f950220455f014106c1bda182ea62cc16a57615c11fe02275ffe5c81f20c16bc544ede701473044022026463e158b080cf46596061d7c0240850b669f7765aa4319c8e265f6253e0ae202202a5f64f1a6688957e736eda7da47fd946ae66f2930624ea501390588f6954a44016952210318d872910a19178793c812847ad556269e65a22e7048746f990e5a67a78ab2072103bc1944b582e982906b7d1d0d850de3d9d6221165c823acb56826e85eec1e60dd21032f05c726eaf87172f3c5ec4322ac0d4ba378f9a5c0c4db85bbb3ae93bfe9823253ae040048304502210080009f95eec51ef03498bc2c9469b8e674a59156346fce422d8a4c1531b29cd80220078bc2fa93a6610a29b4b43c5579845acd707d8866d9f8f25d94f0186302b965014730440220254ce0948ace0b3be96c3f93fbd52fe1733c63946588bc7ea21d228977b0621b0220374138417df3df490919327018e06f300b3e2fb414af3ba14d3e37d19d406ece0169522102af11aaab7fdb7d5115cb31f79d68f7c14507598634e6d9c517e4b8936f87ac60210251abffdde3935264032b64873a4759bc12fbb721d3cc0a4fdb7af72045e7aae3210298263d4806f5e956d050db71146a4f27c1333ec707e434790d36df1a83477dac53ae040048304502210093885299bfcb89bb9c2bbb38fe18c1b64be763b061e473072170364f0564fb850220124aa905728425635006c8cc9913303905550e110ec2c8f4181987a7796e37a40147304402207f70dabfba4089aee2ee0a8463ea9c3e36880fa5773cc7fbff7b3f978fcac6fb02206e9010d3f9193ecc50cf252874eb9c503c1e9d6a8812d8fb8b8e0b7c5e9bb24d0169522102e30252db940f8c7edc0f5ec1ba5517ff77cd16e83026f18fde808d0f0755c4da21031df78a58e74ce27c97222cc2f03d75d3f7b474db1ab9499ede337156061fe26f210217759543a9b57b189a855718dd3021f06949dfb9fa2e94881b100b64a221dba053ae0400483045022100fe46964313ddc85dc02861d20259d27e13d56c7325b899bd0981ec4c3e6d114c022026e106d415b07152bf05d5aadd1e0cfa2544494005202c6800c51f8b0b310cce014730440220141ac1ddf58200569fdfc67c5af70b9df3e721a5d781586933a465a12542737502207883a33b870f8725280975a97b0fe26954fcf9c39133106b3bee3b29839bba95016952210254e5cc7f407b4933f9e60d81d21c62adbf2b5236dad74f3419457a6a1205dba121026f9216eacdecd5c385f113c95cd6b3f865e1bb422a0358411c68a945cd561dc82102d47dfd4bff0c2172815b6f0db2cadc904a3ed0a8eaa9d57bb1fa461788d965e153ae040047304402205d30bf0c1228044f5871a984e0f4f96f63d2f9d30b5087e6b421c69f2364489e02203baa38bf1b6467226bd67ba66054283f53387f954f102a46e9811bed8df8322a0147304402203fedf67594b1e6b3aaef1b063e0b898b996d8d2b446190b828214459021b7a2d022042c463b0a1f47a2c57588d93121f46988555daccbe32e56b06ae0f4d11aaf8b90169522103d9b28ccc34271609b23273f500fa70ea7bf14459ab6b384f5373bedfb20a2a4d2102dc77fe2b11e51c41b97e8ac60bbccfef097bfa1e07136134b634b6a9a10999e72103b07cc8f3def67a5bcbf9c40fd8e788f7670373024bd33141d1208a31833d115a53ae0400483045022100add444ba28444181049965054a55fb75ad8953aac3941c052b7464b863fb762902202bffd90265466950b2e31f895ddfc3ed19019407b5559af5d151488ec7877877014730440220554bf544be3bd9ac95ba52965f67fca1f78cd3cd98fb520fdb438542eb13b2a70220184688c35f75b21beec23f063d050c5e4d437acae933414897c4778c85fd4c4801695221026abc8cfc08e521dec2800850db03995cdd097e67ed5b59b2409c2403b4d233b321038f64d5f9b40c7261d7900900c2d2c80b1c18a9f992cd9852043bee530d0077102103f64517658e572dc6d96314f57a7644fc0d7fd901d755e4bba52468cc9a78505153ae040048304502210087547172629a16568d7e9008553ead623f384cfed9a1de3b313caf497b29f5b702205240f82851f1786300ca972c44a47c2c1320a2515a606b68651dc01a64fe4f7301473044022017ce35a5539c7532a3a4b52e41acdf8ad1d60bb742387423f50697fd9c6cbf4d022017ab8e6a15f37d07844ee397fb61618e0fd88c19079c1a1141f4020d9e5c79e701695221036ddbdc1fb2e7e7c69c0b963a3e516f0b338093ca693cdde7ee37090addf03d5c21032ddeecc80afeb9abf7b591a9f22cb7f74cff4c78c15f7d02efe3ea84c06789ee21032ff3be51f6124daecd8aab7bfc2aab3613eb16c5f06f749513a4502a952eb7d253ae0400473044022050011c4d6f10f6fa9caf844c3d0963a7101a8b8cd1769af9a35dbe3b80c2a8bc022012894b82655b08768903209c75697134483d4a1f2c369a9129039809c531c4940147304402203a8713173fe8867ab692d35edd3607ef0cd21f5fff60bee910c5f1ccc1c545c502206071381eff52246f749ff0450c20c4a40180c9a365d8960de2baeca10e4eab4a01695221024a61e898f4b820a63fb290a59239a1ad3597edc2b4366e4bfc785c5025eb73d92102ba87e91e79b21eca2118b5613b112df509c697e9cceadd06e94a76c62b13bca72102ba8b24127a8163de26abb8dcc0855fa391c7bb1ffb030deb39e0259f2d5abfd153ae0400483045022100dbeec09cea323b6131414e0a22af56958d0d7428e518887d4550582fd95c4ad80220380a02e51e9f98b9f04c1ff262a34d5002c6e27b8a4392ad2ef9c98394907f4d01473044022003280b002f127c767d2cc9bfea85494e563217c3ef2595bd4ea94a3e1348f4a3022050589796cdb58c113f6586e2633533c242723b6695a8afc0d67c7e78062d7d27016952210247c25526bd86531df907eb4cd359ac4e50ca70b0ad6ceea21886c8f55bc08adf2102d31bf39be2aed8157de9ed3f56d64f19b59d345da7f52d93c99414f96f3654bc2103fd5f7e18df08c5a6ca4504f8c16c2a6af7d96cf0dc70040d6822e25785327b8653ae0400473044022056f9ee43264ed0ad62f7d634381230abb389d8ff92c0706e54d34bd8677b19ab0220788675e488794af672ccb07d5eadf1893bc90c5f582925acfff450b965bdf2d2014730440220382e6ce7cd39a94783d256f5268793f382dd18cbe7de629d1c147eb3f958d92502204b378105ad6f48f90170776b166223c5c716ccd8b74ec485651bb036a2ed9dde01695221031867e718daf26e10dc8292a874f39d78da444e802ae72061229972e3daab465c21037ddab734e7827a14fa976571129810cda0e3ddde1fbe806c4e19715f6885aed72103808a7c1c54dc794a3ecceff1d0eac68a6977356e3806ca5f47fa933f22d0099a53ae0400473044022012db4ce01b7322eb9aa594ba8b48ecaadccdf199a201dab1c2bf3b03b8592f81022074e39158d3b6da431dbacc00acc5d75db93cd20e0694243c1a0a9212d34a882a014730440220760dd1a1158897a2ecadd6f94cfbdea8c3b586c61633b6fe66d3ad698c8bf650022049dba39fb697e431042f4967831f4cf9e6a358b441b962e6dd6db1a5f35a067301695221030e7a05bd240f0bde38410464af0513964227bd4be4570941e2efdbaf5862b0412103a920dc33df9a23b21d8a984ffa90b164bac497da9057fe6633479bbe55e129372103572feacd15d5acab8404aa2e0d03bb887d13712111f959b254b285426c3d98e453ae040047304402206f959656d8ebb55300a9bc08f03d07bcdb54e630c4df33edd6a06a6ee376a1e402201d79450c11d4ceac9151ead9983b69c38be45cdf8d905ec722aa375a05bbabea0147304402202f23ae89609809aef57bcf3799a5a3992e666e2a30d02dc6f98714dcd0af755502203dcac5782c25b6bc0b78dcccdae14d5b888429d7899b961f0686fbda4c5a27150169522102122ee866fa2cac61e084c1ae8a5f3987cdfdfa53a9aa639ef378dbaf53a2b8962103750a438e25d61f0a5a8029b776d39392ea876ee17614bdd5156016088b041fec21026a707bba97f455ae981cb6d19f2f3fc3561ada330765a42970519a8c85728ddf53ae040047304402203ffa60ee1edb82141f51f1169b0889b2d0bef7d1987d97a9c7245b20f7851ae90220278f925ade3bcc1e00235518141ce626b18d01894a8a63cdab5509673d012b4501473044022077c51b25a512a399cddae6ee32bf6d70dace8f23d8265ff578514f2aa40d305f02207a3a863f5b350e6b7873dae99211ed88ab6875b65f3a6d59cfc5d3f0bdeb0a7801695221020c32fa75af038ebcc890a2a09bb1c0cc89d4efe45c354f06e820bd2d6df300d12102d05315d200d3c193b2145407d4957e9a4a904b0ce2b076a0a181f3f472b96e3321023199791cf0252f1728e1646a875370edf0a584d0d1511ef0b4307b101a38b31453ae040047304402204258b9471660dd85e8f84956f2f59916a6b880e6df7157c9c89e40d64b1a2df002206b02941e1fa566870e4d8350bea38a86ee17f6d6c5152a6f813ba8996762363101473044022074744eb21cfae25cc226bb497ffb39abc24994164bcff26dee222518f3a5ac0b02207dabf0d36d502a9eac3088ba20cdb6d5e86af0bbf08af81a46927bcc16b8ba8601695221025e67ac2371a32b504c716b1445c1f12b553a3230a2a964e224833a2b902413f121026f285e09589b13021a9de1715fa29d7c9964177354137d55f288f016586ab195210229412989bbff2eb48c4645afa212294c8fb438c50865a32edbeaa21f7e3d687d53ae0400483045022100d485e7495667b7d68faf35731e2ef126bf0059ef2588e8a23e4a4d8e7d30e1a302207064286058549646da5ce99066288880fcbe32d97404a695c92628bd71432fc101473044022066424f9ada3b5258d9853a2b4d2b457c06b27f6cdcea77eaf9837ed55ec2feef02202713e881f9df1ccdccca800e77d7f3abb537b39df02bc277026b7abb00dd6f7d016952210313458abcfd510c79dedfd7504aca825e5706559b2a17cf8b61dadd2622c814cc21020027038a747b59b524bf310ab8de260802a938c932b4a2bf386889b2304682bb2103a3b52f37fda16ec2df32236034698c2248af6069461c9bee15b4ee39ce64651e53ae0400483045022100afa92a4053efff79f22fff317034f0237ec2b69aff712a538225c3206073ad910220745eca771799ad50e473698600df9e21a8ec560c06ce00e3d9f390c6982abfc40147304402200f6d58e653b3fc65d93bfbfa9acccac54bd771b0b646fc8fc8372191719ad09a022059e028ce04ed26ab8888b53494ba7d96d27eddfa0e115587947f3e045f70ca2f0169522103facd42112f4a3dee35aefbacfceda814cec6cae3589ee67520b0a4b3e1439fef21034bc7eda59b359a3cd54ef580d698659af6b6d3ba99f1333150bb007644e6241f2102b2db0b966efb20f471f3d72fa8762ed9342b5affcfcf7d57b62d523ff86a1a6453ae04004730440220560c7b5ed5bd0fb50478878183b8f74d324793ba8df1e2b9ce70e6275f990bab022062a92f5c1ac3790195bd5320bcdf1ced281e4c04d9bf9d5d2452eedb179e3f940147304402206a1f937095688aae0c8571a9ecff119d8f52571868438628725791ee9ea5332402204a1527c634505c7247e14cba1586facae964ebe80c1a9fd748cf22aee50c03a801695221039d2e81445d811c98ec2773409166cf887f2307ba6c85d14be7c75b83453588622103571f9bb794929ba51bfc0034522952ba0ee1a1d990b498dd3c7f8a2d5869e9a121033c1a735f04ddbaad21b283ad9802a85e63bf314d424df7f1b80789d66a67c73d53ae0400483045022100e26adc429080340a89bb1f804c28ab8f44b853b5b26eedca7d5e7c070676d630022014a446a9520a6c5831c2b7b4f3593b80259c01d06da9341948ddcc9aee76caee014730440220178059247b6c4a7eeb9624386c6ff491c4e8cc14e1ad455dc8cca8bc3f5e33ff02202f973faf022f24ed81278ec10a2e612b2478c6469bdd946ee890326b76df4b5201695221021ee43bbb9ceb803a68a9a22e5926ec9037365c58ecea5bed91da064bc5ecb9102103b88087cbc615e0a717830963f258b5b0eb8ed84e7fe74d4e1efcfbb038586e0e210314893182073530f78160a868825b2fe7436a2766427c2d2a732b9a243a63b60253ae040047304402201ab03db7f406fd8d65af852174c03b2d0c536b4e409eb6efa6b6c8a6a8d59d1402200f5000ac54ddd044210c3992a81b7a57f97ff19b31adca2ff3898dd9ef31864201473044022062b15b8ced2948156fbf69fafb8db8bfee0ce0a9db7cd21df270816acd9533f5022032da67ba233986dae85bdb9fc34f91fc4ffaf92f2210c9d71186b7aac27267aa01695221037c8e0e2d531f3913700dbbbccb5c2f89731a776079e733559f0d8aa8b34e1e4d2102e63b7491aba082413648c0ab8a30ef27b63b72a564c08df840daed7fb336748b21033079da7f26322cb88a3dc22737fd4710e71f8fa4c459cc5681176dc92517910d53ae0400483045022100eb2cb309ae5bedb7ee295b444ac4a938d2119e4e525995fe7054687fbd75571302204cda9e8551a87ad413c109bc6d1df79ca0398a17c1a8f6de342d44876d3c2123014730440220520a00e23243aed9d41a35badb39f4366b355f27da67613b0c01467619fd8234022072ef323e013d5163fa1fd39626d5900606a944206087ec0e32201a962eeb36de0169522103ff3d6a212b98792e2728c01eedf2881c2083f95fd3cc8d71725ac5211b4b83bd2103d412791e0d2306ab06f1af5c67c20219c5b02720163e89e66eb33dec433982bb210336e3b2fed92fae5720e19f15c673afabe2588a4c1a3233eac2066f0e0286c17853ae04004730440220393f24ebff9506d2071d95f3c064525f1514babc579d3c50ead2a0301cb42c4c022040a356c8a28aa9c5e5834bd698dfbbaf0945494a384f070e387175cfa4939a1501473044022029fb2de3c4dabb6852e9e031cf457dca4353aa8ce5a499dbb840cc13b36f7e44022005dce76c0495d66f2309be144d5847d97bc3d5c8ad53c109fb17e87e079f771901695221032770a180c8b46ef6332a470fe780e432f1989f70d170cfa38fb287a77ca51ef321021c9cf5a94dbfa16bc652f9c95f16aeb624410769778126e481cc1b813f320e3321032af1dee75f4d6221f2873527cc12a64c15f59577b28f9204cb6f722adc13e9ae53ae0400483045022100ed38def6032457b5c2f980a683429c8c12862e1def093e455469a86f375b8a4602201faf491002d6a1ef313c670f3fae142c534ab31e3d861c5c353df87b33c0f28d014730440220398fd88668e07786ebb73d26e59839c262e2620cf67841797d7cad6016faa11b02203f2bee85c782af7beac16d8b7a684668cf10d9e1234ac8b5701f832367d5b10401695221030898b73480082c5544e3b23f62b3e90b68bca12330a831822d31a55dd2ccd8d821031919c730a563214f3cc6f47ac56b70f9fcd4739abb11b42d30fe23735f0b6a692103238622d5de0112d0d7eb667dfa92f9630c4ffdb828edb16abe65ccb7c979ab7f53ae0400483045022100fe94485485326662489d5653e53df55f3acbb0169e54598014b17e2afd5c10b802206f42dea404d2f9781ace22708f5e30cde66a65d7d71140a985cf2150ade0e16d0147304402203be17ed61e4187d28ba7ba61d4851a70c009ccc456d75097f8d450f1f0c6885702207be5889fdcf48afe115dd2a748d786d0ee5af5787c8fffff7a7518e0b93ec4e60169522103f5548118f2c98fd79fb5a706b80b5e05a4f45df60a8ad7b2485ebb78c81c3b602102b58773fe23b7bcbbce1c3695f95e67ff26ae4f47a5c5723284c5da300e4319b421029f001d294346eff103c04e0a7a99a601678f2c0b5eb54ca5c64f94843c7835c953ae0400473044022055213758ac8a9ab6b797484a1cc08a44c2b0d3bba7a1ec4718ed4a17495e0dbc022054dde54dc9122af27e8415721c388423753ec00db74307bbb756331eec7476ed014730440220254cc9c1b9903f60d437bd745ad6bab2dcbecdc25f7d33330178e6605d60ff5302204c4b80c60075e61a02291d673a8961b6527965153755f2cad5579b56bc6fac0c016952210363cae418201f90b1ce020b02b6cad00918d83a6f7a25d9b56258f6a64eb80547210356eb06ceeb2636c331babf059837f6a3967abc2c6b19230a2949701b40eb8d792102daf8222d68322fd0f240f36b9a47bd64220267e150e3174e0638eaaabbe2b71453ae040047304402202fc244f87bff5cfbc1f9d58e3c0736e94b8b71ac2f6e654cee97bd7e7def9fb602206e8380a5ef216f7e1a5e00dde807e3ec7b3733625b0e29c3665c79c1e52ec94601473044022009d9af1026df5e001c754967c2927486e8e102a2a5defcc1e4d19d19e79b7238022041bb8b6a210d112a2e846185eb05e6c85883e9ff466594f59b927c6c975d168c0169522103232f1d44cf7e0c10fd1cd8dcf899687a3631d38f229b2367df32c19b703fa7c72102479d58915fcf9ffb15a66b000c0b4e86485d538d115e4105db1cb9fe7ab40fae210308116f63b9ad3ae44ce10fc45d27ae158df8c26cf00e00d4453c265f660bf9fb53ae0400473044022058a900c08bc15f4cda52332b3c3d69624b545192781ed5eab86bc463ecdb62ac02205d7d755172e8165fd963ff0f27972c8693ff7e2420ea904b84d42bde5dc120dd0147304402204c0b71f96fa373ec3d89e8ca2fe5946c52325411e025a8e4c0ba515ab95ac6dc022079f9fb7d3efe1349d3715150258a19cd21d53b06360e5283807c96722dafdba60169522102d7664594b903b4e30dbb9fa969df78391e26bdaaac490840f546a44a3addd5952102157042035b7d73343891f477f90cfe40f670aadc3174af947f426b3348dfe6a82103f78926372c97694b53921dd814beb1d7dc3f6eea65903e49c568892a686214dd53ae04004730440220786c1d2201aa902bda9df88aab8e1a55e93fdf95750fba72ce8df64656e746490220242f464bbf9663aeb63b42c27b25a28c44699109a7120fb6a9c48c15745342a20147304402206cc6f48a53fe6526587ac30d5e718355719ebd2e29afe7d4ea4eba44cef0a01f02200a33b786d6135f6cdd8b5d4dc4f26c5fb5f5187044dc449d51d374c25d30d6fa0169522103a0d93382e1e4390854e98b76ee4866d5fcb8334e94810a50882efc8e99a998bd21036ba95a11f3d3b08d96d6b0684601e6ca26ebdd5d25f5867d539b71612c1bf4d72102e3d600534d56a23b86e6cc7b0a98368a2f006e31e917eb96dc2c57b55fd037f853ae04004730440220712d593a1e64860453e1c5a2ab24ba9567987a6dda1a0e1ad29979247079a18002202cf13c3e09e89bed17cb50e18141456b0a8f0626366ba6f788d7954963b0bbd701473044022002cacf184b462f622d7e66230f829337e136b1c5fb5677bce3176877157ebb7c022022b2885ae0dde6eb378d568bffbf710897d84ef94a95ace77a8cd5028785a4a2016952210284c97ef2a740dbe355f888f2960015d23681e7426732fbfb686cab3b8bb351542103ebe9adeff93529168918747fc52900b4c36ac15fe89c6c85500d2fa32d3cabaa21034b51c56a255701518ca252278be6922aba2417ee97c23678fd6176a714713b1753ae0400473044022100c048da024662464457bcf715983a69a954af730536403570b479da3ed0130e40021f2ad2f0bf286f2ed951ce960bef48771482d41d137b5d8ba908b1b925eff27b0147304402206c0556d5aaedf3f5bd170ef85f0c754c461d1c4ed47d03855dc4b9602a2c9cf6022030f817cee803d246ad80dbd353c101fefda2ea3ea1f5ce6d8ded7c655ee07089016952210312439386b77aef075cb4bdce88d1c826333dc0d15a55507c061251a54d942e482103f9ce7183c020af1b94e713ce38dd440cf50de58fe18f19b7466fbce3a9cb71c3210349fb932de657b897f7e574a6564a32d967289ff61f9a1f66a9b17d82813fff3f53ae0400483045022100997a4204277ec3cc1737d203ce1d15e70df2385acd8feeb05d5a04aa5e3df22802205e1c46e02d0adffe964f8afb77452aed2d240abc37cb6142147a98e73330f05701473044022018b859450bf0a4d9ef4a95313613732971cb7b5ef82397c26159d022ec104cfc02205437d185fe83e7d31a5bbe160f51f84e4e4f015083bf4ea1f6297efbf367a51e016952210209812d2937db8fd72b964738253479843c75af9684e2fa99533b16ecab3e30422102c93da81a4123d34f19df350480f45b3364fa6919846bbcb69f8abbf6ef54813d21038ed5b8e7a7f59c6681ff67c7dd8f7a9c4b767d21fc490fc30d0901f02e94811453ae0400483045022100e8b5ed88625b7b555297eb7f144ac7873f9db891093b04fafe78bff2740fd11b02200d7ffab58aeccfad0f22737224eeb189ff7f8d6667a368183d6b99f9222965a101473044022025cb7701b8f70d816d510814599d8857e12ef8de86da108adff6a0dfa1f042f202206304657253589029238594a3cf30a2ba64c943eb012174982b8c792d058f679e01695221039d70801345516ae834599af34e9ffcca0e5f0941315367cbc27392386164bfc321026e89a5d915b5da20c560852f2a8be03baad19391dac109eec83709b91ac39eb12102f614b563234e4cd07e38114fefbc91c151d6cc61cedfd0dc47d19d2497c6aeb153ae040047304402203d50fb1e50a58caa5887ffa6ad0be44f85ddc320b07411f087e1db9130d2bc6202205dfe91ae775f61ad3aca822c76f1a7b5eec92fc17c2dafa80fb826405d39be8e0147304402207b1e5595033b661c2ad61f4b91a582bcbc859a828a5bc909ddb06fdd49b9982b02202effdaf19bac74911c5077e8a3d80256081781b1254eeddeec84cb5c3bb80c9301695221030433eb1830017458bc96d970f5c170288b260c7afab6e73e26dd76ed92cc458d21039128041a104fb77a721a9ea05faa3428c6a2341c089bd7acca7ff30ae6d6b8fa210369a12747be237b54d873a603bf70ec3098fc5ed373a0e001974a3ffcc6256d3953ae0400483045022100e60ea82f2e5ec873a8096b9c129bc7cce4c96ace5613bc278499b0ce7047947f022019fd734b812cecf4dd7cd562d4bc74ac3a7efcbf9a7a7acef36799ecff852b3d01473044022025cdbb39b5bf7e31547d0a8e0af9967fd45cf6290a7ab856807a48c28e08a1e602204cdeee98fd0c5fca4b563f1259ee37e6168f5cd2406dfb23e41611c82cbb706c01695221035a111a666627b3516592f7f57e55fd968f0e235f203cb8ca1b768b781262eccf21021464c3ec7896ce1217ed9cd5f618337daec0790aadf03bc8fe8552cdc9cc372f2102ab017c681b8b7c9ad0d47e9343a48057b8e4cc83158a8258d0eaf3df3946c5dd53ae040047304402204f14c4995f8bdb6483f4830f1830670929cf1aa372243823f3147d602aab4407022059779a493960ede21aa03468b369626df0c2b5a4f5bcbd4c22172ee68d2bcc060147304402200eb441e11d0f5e0369d829278061c95be5d540cc8fa3627a941cb557c3d1578102206e5ebad641c188fbba2fab14fd23f2aad6aa8bd06b06fd49177c9e06a6956b1501695221029d69465c994e36702dd55d54429c0d747342e51379033c6dc79ed55aee52cc362103c278d037f92aee3698168a16660faf4dc704ad324ac78e3496f2e9bfe505297f21038a11f769f5e15299e92c2dc16fc2259a94752e21c56d41785a38c78b17c23c2453ae48a00a0001000000030f49a08e7d4665bad2fac57d685b0b2dc9e45ed901b87d104f157bf57afd3a9f010000006b483045022100fb7c1fadf8f85331e77880eb5c1c10feed825491ccfeaeb9f6d323ec542bf59b02200a211435f4b7ffa59e197ce8d3176e6bca11497dc1e310c703ddbac54bd1f0710121032293062f90c4bc7289e41ed53663a254d5b347c622ee26e496629ca7714b870dffffffffd43c3a9fb8e1d89cc3ad7d28d563890be7cb13aeb73207bdaaec246cde832118020000006a4730440220101e5f44d9da9778c3822113f180299899a6b73821f30227a7d0ab9eda6fac3202202f3461e974e8f77bc0079b984b82989833a36d1eb24cfa6ab2e195d258af29f90121032293062f90c4bc7289e41ed53663a254d5b347c622ee26e496629ca7714b870dffffffff8074321dd733dfd9293adb4ae6bd61b013e19971d87f119fade239a372c35a05040000006b483045022100a539153024a09735e99dd91fedffcaba129f5e3da272f8615c06e91401a289c40220525e94e045d815ff440c81228751a00db27ed058a0c95eadaeda67d369ad7b440121032293062f90c4bc7289e41ed53663a254d5b347c622ee26e496629ca7714b870dffffffff019d3f6f0000000000160014f0d92cbddca31fa631799cc447d39555201aa80a0000000001000000000102143d750e5814ce87b6d6295a2e28b8e54f997c7b2e26f72f584d48f28c66e04a0100000023220020b04d22d4e56f79790ccdd320c199537a1f96df8ad329ef011f907e6f66bc0cbfffffffffdf0fe6d11873c6cd3654d5273b203b11c06b553eabfdbb18fb626b4bb8fb06f9000000002322002027dc60de65cb130db8f6730517d7fcf368a716a8c8c22c261e8ef693eefb584bffffffff02a49a0400000000001976a914c930690e888312478de9c747c2e9aa0ed5241e2788ace3a710000000000017a914222f8c776e641c205822c4cd11883154eb13211b870400473044022055643f4982ecab4887b0a4c33326128ba5456f68b76a2574ec713e94512f4c7c02203b1c0a916790cf171118b614b1e3206ba7e66366370ef4d15f284265d491f7340147304402204cbe9c9d21c8c802746cd357bca39e706644d0717f9267b4b067e2884dd4514c022003d5ccde239bbd63b80236fbe1f88587c116b3cf3c2b34448410ac7d4d2a760b01695221030843d36c12bf75b580a29df4fefee56053deae720ba2d85613d0e69ea7d4bf0e21038756b44bff5a692bb9a596f6ae8fec1b78f5c921a0c67ca534ed04ffc61f215b2102135e5261123d96e1c508adb955db1b3bcc36f6b1d4a382e5f7ae22344443f31253ae0400483045022100f5c513eb27cffca886655135ab8fce949f30a1dff17d79fb932a787e567b79020220309c57dc98da4eb66aacaf593745689a1946e458343dfce42216cbfa4e2cc33601473044022037b3fbe75e91db533eb7dc2f2856ced67a7b2a72995fc4f7ef735a2de9f1a79f0220276c91e2ded1afcc2e8308ac43f588da978e64be639b6002589fd15fef297e9a0169522102d0d4ca6ae8aa04181997face3b260d7ceeef7528263f589fea3a5646a2f978332103df4d5c8dbf186b0e1172b43c87874b3d43416c2eaaefe4d52bd8df8f57f4e8042102fa68202868f0889774474a1747f5afe394616c147054eb3867f75564a1212e7953ae47a00a00010000000001017c7e32bfce9cd2cd542edc0c8887711c8e503a262a04ab39be2e3c52e1d250100000000023220020c86021a3961ee7f34d4d6ffd7045d791af8cf57c9f23c5ca30d576dd43600b25ffffffff027ad510000000000017a91406057d3bc839bb0178d06b548fc315225a9dfd6b875d9721000000000017a914841edfd8d41c1f74eb2dea393a6967ef53d0f4d4870400473044022053dc20fa905a01a56e5ed89e93cc8a1548050fb6136eb7537ef67e147623a91c0220770f47410d118c7237a25af8af749b63fee2bcda1f707805328f065f2bf89b730147304402206bc84950c70fc5de0fbca01b98300bc244f15420e0012c58f87168c49b5b3d900220406c0816e426e92b93e9e4fb0a982c50897e9ad52f682443c73867d923fb656b016952210382c24d169470cf423021970690aec514bb9a3cc72cb201648738316a700942012102fae3bbe86fd613964b1c07646adea5d9d20e9996da16b9c1b26be6070df26ed2210275b2af1f2ba2be55a87e4079b93b065df5bcee100812c93a39561e0077ac354d53ae48a00a000100000000010ad671d7f1037c1e54d1d78688d755316c687e492de8e9871ae065b7dee761d60a2a000000232200206a11207d413c89f8fc8b52c2108c2459f0ad7e5e365aefef7ddc11b8bba866f8ffffffff6a1d88233225ca5afd175e720ddc849f37b0925fbef756adad2ee3f796388a2101000000232200205812818a8ebefe2f4f5ec66ee1052139a05ec7850215cfd98a9568b980ef0dffffffffffb7b4e93d27d13a7959b926036b98686c577b64f3f7f5340c19394101bcb4ac230200000023220020eb588ad4218c1fbe861f499be7952f6d52fc1896684ecef6472914d138a2bffcffffffff902e972352f65d5ecbb205b57cb8dad2aaf6323741137fa1fb2e5d4be7749034830000002322002025392ecfba92bf815b80c13744867dac222e8e7ac9fd41fc4f49a8de6ab07cf4ffffffffc746bb6471cd19d16198ad71e8fdb63b73ae8c7792af674ddf33ae3cf2a1ef411200000023220020ab7df18a040a30b0bfed4a537d37c03a2f7bfd8343bd553c5f3cf05680c3a79affffffffca30981d4c50ca68f467f4d6991bed81bdc4d15022608cbb52c439cdcc1dc9ad01000000232200204374874a911e0c73073c7bdd357c64bf4b50ba7bbb68c59a9a4ed913842026c6ffffffff7955011550a403755762dfe0b25dfee403e732a1539157214c1cb7a0e282a6ba31000000232200203569898b2862728175f6ca712b3bf79ee99769876f4109e79a949a839b5b3621ffffffffd0f3215810e67b9da6bebe95f70be6a5298f3d1ddd554cb5fafffd23282a3fc300000000232200204e5007d4964d43752fba39b9ecb5a1371a2c0b565d7cf0a9d79c9b22515eef5effffffff3d52b59831767a89c7fd8b0264448cafbd7e4ca7a1f5f32323f6252f44d1d5c43c00000023220020f58034bc7ff13c9a1d973e4ce18e8a7a4af36cd762f28dbde8d1423a1cf38130ffffffffe7b961963359d8aa6cc572ad0f8859d12b2f36588fd8958fd892618f463582e5070000002322002077a51646b14b2a40b25de4156d3bf44233ff6ffc00a8c4a5f187c027d9b73a71ffffffff026cde14000000000017a9140683654ccac23810550f756bf460610d151cacec87c04032000000000017a9142faf09d676c0d33cd0eba606982b1a9af0e32f228704004830450221009aba0338fb1e15a13d547ffb93b3d4fd726b4603e3f465948a9feacecead29000220197770578b2053e13025673e17c8e4e2ec5c75d8aa97b66c7ce5dcf63e6e873c014730440220212c4e46dd0c7df29a5424047535b597a36cad661c5a15b50dca99eb0963ae69022047bf7d829126e59a5318cf543909e2e917f78752a542de3dd45580636bc84b440169522103346f6ba93441252cbf54e49e35cfbd421d2eb15c7d79b65aad02734184b0596421022e73957a7326f6f2d607ed80a9c52ab1b22d46461be127cf1eb369e8dc9c57a82103ef8bb87e22d60d0b8e591d9579498b7993bfee9df95b33507dd16e2cbbe0c8da53ae0400483045022100d21bb13dbba259634476b278efa2d7614072bdb21e06bce9a707bec3c989fcd002204b679c3e875cd77c6b4597558acfb9152467ffcfbd1a71f03753cfaec38c1fb8014730440220210cc88229bbc7d35a710c2ea86a816407a859ebd39ee1c9b8d38b0323f4b0d1022060f5260cecaabb95d1b523dd1c02fde1c70d417aa157450d7c3b197a67a9dea9016952210211a0d7cb66123ea4010e5c2e30b8ae3b155fc5da9c587aef356dcd7dfc462de721024f9590a5e26315b8ac8e6be467e82a94a509e153ede48b3d42c20bb3bc9715df2103d62e80bcf794e99db239c704b2e75620dde5297abd443652172292644b88f3b353ae0400483045022100a978ca2060d8d3c9243ff2b79a474201632003c48b71a50667efd04a66be8c5d022050d475d0a8e2987b7ada433115abc7c88786c81babce6cb0c107d32b95ead2fe0147304402200a152ca7b6835005432137f33ff954e90d3e7cc38e827c364c2fc4f3100dda8b02202aa91f9aadc2787d8a29121e2c406be88290e1267dee1e5df48afa8824e1350e01695221038cc2b2c8f48cd1dcd75386b57298637c0d59bdbc5c8b02213a8db5fe5e3c82772102fb3ee3cd1b5ace036283dad605ed8164fdbdd8ba75feeb732c96baea359a2fbe210329b9088011a4778307cd0565c2913d9bf2441df9b5223eb88ff0e54c71e515a553ae0400483045022100abe9c921dec8c06291e7e29b4808a6f2db23474cdbf96f342e73126085e65ca802203d4a867c404fec389b10e0dceaddeb399b4d43df270adfa9aee34e2400c75d8a0147304402201ddd4b3f04b2bdd8aae3e6baa280239ad52a47330c1c5466613e89046d7ae2ae022034e3bdeeaeae333719b3845ce7659a0a2004f8e92c3f85ea6759d245d246c3090169522103ae681b556866aa9bc32207d478d624cdca1ed293f30e4c46ba56ab53cd309f8c21023727e78b995e847aa3b782b4380954ee0a906d18dc691ce787f62d7cf68dba012102eea379f518adcdc97ab7e80d66b8756867940bbacf6827c65c23b8e3304f801b53ae040047304402203da9349bb8f6a6aad228aff95d3bb4ba3d6d2e6fa0f57c40815ec90607bf6ec202200da942ec2817141f46529fb62fb3eed1575e01e09124c783dd01d0158d5d681301473044022068d13df32206271014e46bee0ca092b4e904f84419951b746a100d2890e34458022054766b4cf777769f59cd8b201d9dca49f711344e2f499c228e876554678600e001695221035c935ea18caf27eb2849c465a48e5dfd1c217a0117a0dc527ce66c760249e1ee2102c82fa56abee4e940051a77403ef405e4a156a3e225c2e95c90beef611958c6412102f8960fc843f2295212a1e77b97a83f5834e009be462924ebaa0b50619b2cf39d53ae0400473044022023273181e68e6935dc084733d24c9980b242e0dd8fa84dc9dd4421cc0e66343602206f60cd0ee28d4792f03a945e8224301160842f213a578517530a59846f0c17410147304402204cc494ee36ac818f9f187bd67074021ca68beef1467ad4ecaa4fb36db8fc80e70220146b66bcdb54f6be6d7deb39976eab180c15ca95e70a5b325b5af490649fefb00169522102b2e5cf2170c9e724c5104a1b32b67ce12db8e4033aaee681fa05b5ce1b3780cb21036b60245dc5e981d9b053b9cc844fd31c96600a916ba09c053e4883cbebee934121036ba91a649a79d3464c0d710282861e3b7fd88048ba38e31c6b3cecb6d74c595953ae04004730440220710014beeb3c64e168724cf7c0843be42fa5b84bbb766b57c194c4dd1c25ac7f02204b74bb8b064ed24e5b2e77136960610987f049a35c9784959f3900baa4f7b7f3014730440220025d60dcaa88fcad1a97e302f59f73994359a4cf21836623cddb47aebc701cc4022065a362e6743d8e1f0164e182f4388828dd5549fc699098ab5a4df3568ef0452601695221020ea493f23a1bd475eade33381a5af0b63080cdee0a0bafff4544c71bd1baab7f2103c4e57e02d898adabc703e148bad49bdc2871f0d8cdaba1668a37c081ac0e90732103ad079627e6529cf0e784b363bf5b52c9e3c851c6a15ccf6a2d2c726359ba63ed53ae040047304402200d9b6167109f73fc498713382307166b226b226a9bbc140246c30622f3c5c9ba0220671f0c35a60d0317cba18b6a60d9081d0dc432dfd4e45bc6679b7091ec0b0c87014730440220250fa3a6189ea06c5ebc65758d8447ab73ed66d1446596ac2f3d2fa7f96dbf9002202fe0e7e0e7619a031a50d743202ef9503c5939693560bfe117276f04aa14a9f60169522103e3c55900b8ce68b8bcad23598aa5b3a54c07f778435c9e27bea123dbdb1d140e2103ab4bbef8138135c6a15c1d75e688ec0c6fa4c6e1b15f500a9cd37a0daaf43b462103ee4c7c0e29023163d247a1cb73c7ac9d4601135adf849e76155c33cfcc1c65a553ae040047304402204720c39f5aa99c3814750a60b02037fbb77c5b7bc15eba5d57eaa2a910c236be02203a3ddbf6cd04a06991a950be24ea228309e84f95a8bfd7917e82ec0d05ac43e8014730440220044c6b309100d1dd73647d701682788241ba074b6b5d2f3fe0ac0a1219c576b602206b8fe1f54a532fedbc627978338b7abb043724bf38574af4cf6aef6b15eaa0830169522102346eb29be298d40bbf3b31f854b8bacc902f11fc6a40146859616d3d4b4e0c9e21029337fd755aec4f6de4c9ecac86e3e1485657e888e21d0fa6a7f0c36da2e86cb72103f5dabb2e80c7c8ed79cd9bcaacba0776637893ad51def03ea082f58c3a64f04353ae0400473044022071dd32f76ae7076a6ed9db5743fc724304326e5218571e4add6d65b9de9669d202205fceac0cc9766d7f6a6289684dd0e40697ebe97902de9691f000af0f57b594f6014730440220668ec8a36f6ec2640673e54f1098a49a02ead118521cd2e28f966d826daa4e3802201008d12ab9bf295551044a270d1480a8bf2d44d0613b9dbb99e658903be8a084016952210380115fd65f8717e13c44f15eafc6c212c3ac5e4c5773c3115949ddc36ec9b2dc21023a6fd05d1dd15316dab99c22d5b2f97926254283ce12dd10208252a0c9c5e1ef2103c04d04c48816ae593866a9da27e7b340a378b7cdd959cfc97da2afbed2c4a4ca53ae47a00a0001000000000102840015e6891034a29e32bfe93787e2d8b6f467f9e21e512b9036df3e9513d32d0100000023220020e07b7843697556449a20f92608b639495346e1ef7d59c5e1aa17a445f92d5daeffffffff3c361ff7f1f2268bf8f4173ff534c0124037840e9e7f00057155517ce5eee2380100000023220020105b771fec41d26a540fff6fa4420e1a7ed03c389fdf465ed821c78096502c3dffffffff02a6a20f000000000017a914e2b95b3ad34f429c499bf52f466c24b0d01673d88797d01d0000000000160014d7fdaafe511d5e0a774985dc9120e9471a068016040047304402205f13b0ee4af1c31c02d3ea89ef6d17a98cdbf7aac5879bd55c92414a2e1df4f302205a0563c6390bcca1604b1d859006719afa659af5a3623ab1d346d156527e547e0147304402207ace204a00860161b6e50ef4c5e1a011f27670911b2d50d3e6993fded3d7288d02207caaf10d990f19c6407aca4115b4f92dc38e7e0d0762b821be91490ec45389bf01695221035af3f4b6f8a972974debe76e5437731e08f2b0120dc666b79ad08b6320f601c121029557568f3e5f343c5f8004fafe052ce9ff6e943e8074f7681955c0c2849621c02102df514d72051b0418582cbe745d5738173eb5030e37fbfb9e5cf95c335aa61d3053ae04004830450221008eb4ec9d5f7135e3c1e20d79a3986ea246a58e59dbd8a5986039d0a547a4b3dc02206cb4130c179ec090d21b6304cda58fa15b30b9da5557724059ca60bbf2b18d010147304402203afa2a98ead597dd4eee457cf0c7c44fe294d092af8e8705b0854e14e5bcc7c40220786c379ad70170448ddbb6797b0f1fe13a29e705f0b5b6576d5273e6d3f968240169522102f4eec5ed1538c90116cf540d284595c0b06bc56e090961ce4fc46b69b197764e210356466ade978d400a9cded2f3251090bcf9bd2441c8bc79de73696ad5867c6d6a21039e28cecebc6c05bb94571741c66211434ea0e957130d6b94192af3d4c7eaa11853ae48a00a00010000000001025aec5ac55b212de4e0ef3b5ce28fdde457ddf9539e83f08e448e9fb1504813880100000023220020b372f0f54ea365353a9baede35ae1a8bd20e41f76e9002fb247fe48c95be4553ffffffff47e9b0a275398da0ae8d13a48150c1e3c9e24326a07fe259a52a674eca04d9ae01000000232200200bc303b24d47eb889ae302e0bdf25891fb4f743654c7f3424f8b63d2c18425bdffffffff029122030000000000160014e69b965d02caadcb9fa0020c8b5c0cf60bb05fa8aaf11d000000000017a914f6076f56bcc3cf4787925e7bd6026c998faea454870400483045022100c1f6a9a503317e152ac847d544b5832e9cd5e99daf79b24aee08148117914aab0220217164bf521e640b88067c902fa058d402b12c44a6d73f514a40567fe5f6973f0147304402202ba98daaf276e630392608ffd829e0a580c81c64dc7529360f413ef9fedb9bca0220484710bbedc0723e8e45eefca7aaaf121ac23ca71478c413d0a910d552f0092d0169522103fc691c5666edcc8da23867de9684fdea80d2bb2d4269614879377e4b5e7e1bd2210263e2b67c3463337b84c9d72e52f92dacc3772b7ee2653cf68f0fd53dc0df64782102d11244ada873c57fee29a6609b7f82e82ecacaca9ff4060089790bcf3c0e6d7253ae0400483045022100b1dbfa3288bd11456fdb4b764332529359ce5561e5b1e8ff42af2d6cf9911c6902205030ca2f059e318087dee1511ee825f2e05bc5b0b7373e74c2fcd76da39e156c0147304402202a827e1a3cf06cdb1beb250724a583386c2f634a5b7366123314cac740f4ef7902205a46bd5cfd58ca6294462a5a5ad51ead01ef8d4a641cafe8fa3b5e9cee11c76601695221023bac2e4e813acce53c4bec9b8571ab34b173c5efe2e5dc55e9c3485bedf74e5b210242b83854e2979153c7ecdc89eb9c2d4554c3dfb7b7b43ff4d103402c53bf166b2102dacdf2df89aed363549a6b5d22a50ad68a76fb3abb2379eab43bf5292b32294c53ae47a00a000100000000010165d800a25029adf9245352915f5b484fbec97b09bf331befc9c9a3f0a96f9f0e010000002322002069aece5a7728d7d067ba7950abfb9006ce38d8d6fa96d56ca44eeb8c37457410ffffffff0280f0fa02000000001976a914f1b77375a0d24bda42a2832bad76c18a541e09a588ac7678ba0a0000000017a9143041b34c4003c661e08fc45c7f2f94b4c60420f78704004730440220029aab3a64987b5fed68ba923e443fbf0dc4e3361af5bdc5d0424c6c7acd08bb02207d06f0d5a00d831ffcdc82ab1fe502c6404e0901d34a0f4bae19c48c6823996801473044022056edf316048412892ca336c7a86826f222c7fe631658da9a5870f22062c9ae1802207874295da34cfca2072a000b9d45ff765a5636e87dd4e077062e95163d0cd24101695221022bc472a9fa6c25ffa4437ead482141886a83c9740df5f3de981f7ede46afd17f2102e98d7e38567cecaa94c2ec2761bdd1bbbf1bc9fafef51274f7c45f4da8b92e7f210380e8302da297bbb220f29040232572fad81ad656a8bd8dd991f63e6c2b0f92ac53ae48a00a0001000000000101b366da076e8536b8f53faff1c8a0d3e8bb26cc7c6c75ad448585fa561a5334c401000000232200203fc6329e9b78e710cd069a0a365bb8599bb67cc945cd1a4bbacb2a8a9e241942ffffffff0200b4c4040000000017a914fb87b993f63248d13b026a0e7332dc45eae84f25873dbff5050000000017a914690657d083fdb86e7029ba34aca9be732ed86695870400483045022100dae839e847ab53a4e94c5677ddf5e6b2646843c9dc1129ec737305bdc51ae9f90220710fee286ddbc7bafbc727e1475afef2e62a1bf2a91f9b2aed93c62a0cd0f61b0147304402205a04957c23f62ef22bea09cf85240a757893816dc11840e2bc5f54f88bc74a3702206b84dd4aededc423dfb87f952d62af17dadd20752a931bc18ccf9ee7de5128a00169522103000a3e8b2c2a60b0a7753d4bce3fade70f0ea054da01d2cde303647db2085be12103d4a437130169da88cf9b56bc4f45ea084860f2961a65bbb0aedf6cd65d95c9302103b71e1b45928f03f3301877d5936c5481d8ae3f51a70bd83c640943062fd6cb1853ae48a00a0001000000000101eb6bab71f3d966736d12d0bae5bae3ff91768ba3613787e5d2e4c107f37a07120100000023220020154863a232f68724967610b2e4967419be0b9577ed9eeb551678b76520e21991ffffffff02002d31010000000017a914a68aed6f7e5574240a27b3f77ba2332f71eec7af87048dc4040000000017a9142ead538de840644ce081681e3954f37bf1246f418704004730440220077d1b8cc4c52b576265ddba71fbfdbaa9f6becf8ea896ce32f211c1ff2d158d022007d08ca8cfaf35d513f1d244e9904339a9b1c1e8cadacfe0f1d3763eab8eef720147304402206a49804f487372601be1dccad5489a447c14ee2fa90185d2f188cbe9b5cb612802206c4d3c8cec8050ef4f75ef9639a05815a0ace553b0a89903503d9bc3981d1e53016952210317c89de2309510e77a46992436278373aaa3bc4a07da052158cb9d47d8100d792103bf7512170000006c4c9d239b60692944c9d3957bbbaea2d2507359a81085794521022f3ffbd846f53faf99d8813bd6514056ab6672db42b803f5c0c05cb9def3416853ae48a00a00010000000001026adfd2076c2be24f3691ddb1bde984472714f50a1aa52c74501f1dccce6da455000000002322002092e3d12f905104f1875b63c81e26ec8c188208281943759903c69c43ad0a2827ffffffff81c0400b407289d8a680b7bdb8121b4028097a3178b8e1f597517000929406f72700000023220020405f2fcf6d8a25e4d922f25f9934fb2f476a472cd50b413366285f5d1ef12033ffffffff0211b103000000000017a914e37f45597cff5b9b5d4558a008431f699da53888871f6b11000000000017a914ac945458f281d4fe42888f424aac1e56b9009a65870400483045022100e449117f6567b8e4e3c53d40bfda56a0071b4bd21b3b16a4654fee960e1712740220131d611e918fbd3f652cc0f58059387d92b57da583e4d2affd40a2aae2d9c3a00147304402203b912cbd838f941e34ed7854cca1311ef5767ab6a9083af59f8bac07f2fa137a0220604941d82d15102476d14c53c18956045598cd52630ae9ec40ff3e53b2503aef0169522102140eac6c2b731d63f8ffd4c1825649e5fca3c95654d25f9b4d3c0ea24a040768210313b356ce5cc523447766c5ad77b4b8ae64937741fb3f34cffbe9d87b3bd2aef82103f804af00769aee09b72bf51433c0ae56ee39c70ec824e3729ecfd9b9eb02131753ae0400483045022100d140f6e4b8ecf341a3406b8551ad894f0557252a5250237b030605c0edc6f4ad0220411d03e56b3563e9c347565a37f18e74a15c43b4be2eb7ff06b7d8a27fc969cd0147304402200f68807015c5ece93f4b6671bab0e60c2fe9fbe031bb96253983f339bf7486e0022072426bf4cc2ce3189b34431780ac1d108d7e3171a99eb8cf8b275cac1396d9af0169522102c30423b9ec7e819bc3e696aef1fe3b8571980b2be5ab74fbd8c988abdc6c52032102df52c33193bd460f349cb4eecd9a46bf88b8768a60d7ddd96f1859603334b8c72103d688b3be241d1d47cf4f0a6eaba734e997d98596b094769e1731ffe93d6229a853ae47a00a00010000000001026dee9d56f510d95eb686f49b38d962dcc2d6c64be91d8b05b843e69e8a0d842d0100000023220020eb8c7d362afc77a0a188da08a440e7e24996c36a509072c0dae5fce01fbc2533ffffffff8fa8e824ccdb851fc821f2f1711a4fa68551f218d91ccf6aec02c6d1f6eb5a3b01000000232200209b0d4c2911bf40e854fbe6786db241f5a7259eae59ea929ebc25b01b5787cd50ffffffff0265430f000000000017a914308a131d84cb8e745769b0ab9116b0c922542ab987ff3010000000000017a914d0f33c73db25c9e202186fbb498e9931356ee06f87040047304402202f3d98d397ccc90afa7fba67411703c28b2ef0db061360ae54fe779ff251d27402204154c9e691a9e9b45ae9873610fe76a6b4048f08265f077b295cd73e82d0a4f40147304402200f939adb469be6f64186606043c5ff06688dd37792c027658cd71c3c15bd22b202205a3f5a766f499c60ccbefe051e068f797637071b15a1d3cf385cf47b4db7dc380169522103f7fb8b5ddd13332ef5ab51d503b2661372a28d1a991fa9fe023a100733465c2c21025d06be5cc47d1fb9c4fb036b5da3782ed9bb15d535d9dc30dbfde28be66ef9772103ac23e7a3c45ed966a259e51ad16a2c09b1caad27d2a909fbe16ee2cf1c351d6253ae040047304402201af016a50a778e6beabf74db60fef761014163919e3454cd4242451a88f00e380220283069cf1d838290c4c763c9a90eec8654677e654dc5b4bcd1c45132ba3fb5ef0147304402206b080afda27f7e824e89312df7f47b112e26ad018f6cca4b63999122c343c696022065bc9e357e40c777df26dcc3198066777352e0560088a4c3e4de8f488b657d9d0169522103e58ee5948a9f700758d5bd1aae565c78d8dd1a1016b5fa71940e80db0683ccb921023cf5f7c2d92d08620449d970093be19b39aee4a41fe57f9cdd607ee044a06945210230cd8668b12ee44703e9268cc1b99e04e606776cfe5fdda2922ea2b77dc53fff53ae47a00a0001000000000101a21d4f81cdc9e8d8bb7508505548275653b058d9ec4be72b8d1d0498e39a8f5704000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff03b14d4e00000000001600147d11ac4c48a1408b694da86a96c7cc02e0811216404b4c00000000001976a914019d2af19efb389deefb53892e885e5f3a14075a88ac34c7321d0000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c0438702473044022051b7e2f278cae8eb8684735e35069d495dd553369ee56f5090cde83d732842bc022059f30473057b7e4b625850ad1d3da0b438e710238c818b96b890092ac573ed7c01210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff00000000010000000001012b756be7add5c75ac61befa2b82f1c7d5d84ab3670da134b6c6775a5417de90d01000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff038096980000000000160014109831b744243ac86c44281f163791442817ee0fbd471300000000001976a9149924a8bfab420a89bd63b7dc9c91e5ae9786840d88ac1d251f1d0000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c04387024730440220326eea4bce2b88a3fc853e74f7aabfeadba8b560d88b02ab0f1368ffaa5bc73702204dd526cc7a43579a5c4eedf4906d6f9295b2447774a7dbe1c6a2cb9d609d1e3b01210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff000000000100000000010113b5607a19f40070bfdf4a39e5d1b9ba868b8b2b8ae8063dea92282c8cd9d8430000000023220020e295f82e06e470389d22400f51d45ad9665906a53bbeda02ca9d2c85f5f9bca9ffffffff027b620a5a0000000017a914a2a016eb1df4ce3c2a16472513208e7fa47c99d18770e64275000000001976a914e86da0e5cef34d3e440f3373819671f50233e51688ac04004730440220227e546dcf47ed775edf39d7e630cf0477047fda2df3af385488b6af5c50aa0202205df402f32b9d7bf52242ded4cf592707ff46f8343e14051da3f04c6995f828130147304402207dfbbcc6f0208b673248841eabd9ef1eabe01174d70467b6a3d3417de054f4e9022046b14279fe4560999f21367f3cd1754c41c13e15790a2970c0c0a63143c063df0169522103b50f7d54d2686b57f57d34fa89bace966e38009a60e2b6fe48042a36d3ed175f2102e005eb06cf83e8989c162e9f49ee606a6e3a5bf72f301f406a412f6a211bcac12103ff7a061b4849581df7dad7f8c01131bed2be7d9b205d3ff5567d209e273c91f853ae47a00a000100000000010156cf1575f76c68dd45309f88cecf891fb14b45ab91f8dc4c2c60503d28b391f80200000000ffffffff02f0e01500000000001976a914937ab8899e468b8fb1499a88e9a22f42057ea91388ac7c719908000000002200207ebdf7fe72c2dadad8533347911937672129095079aa2bb1a2b396f70b8f75f00400473044022042fb0f7b6406c4e6fcb36919fd58094d298fc0bcab9003f00e060c4a5dc1cfa5022079e33ff0dc7b8ef9fe63330e1864265fec71f56628e5c34d5a1626195b0db8ee0147304402204bef355820b698f7f33e0cdfe970781e88acd639e02454e28f490ba35601a59f02202c5a1aaa6cf3a78ae1addb70c4b119710a464997ed87e742d6e4a59bb6ce60330169522102b7bb486e57355f479c64d784be609eee40c9cc7aee896dfdec1b43f0d44a4dae21020848752ddfe72ba478c2ad52942e425b222abe565974a3ddc9516964ae7f2b6f2102b65e1c54d59bbba3efc1b391e2cd29af12c4be1f4ef822eab626d94b444c82cf53ae47a00a0001000000000101e64eb2818b3fe71ba38589157dde2b0f5ad4eed4f5b47779ba0525aa6ae0c65e0100000000ffffffff0250c30000000000001976a914601f6046359c4fabb3833338582022be3cb545d888acf6b6c0030000000022002013869e09d1d61c710e69bfac8fc7e94da69ea521aecdd00037c044895a7200b4040047304402206e91e7e65496b19e57c09507942b5622f048622468f8d41639e2d86646953c00022056c1117f1136713949ec94ca513c50ebf17a5e6f3635e5a7a353b582d0b43be30147304402202a95eedb5245de664d45f38601ba2db3e618041e3dc8620fa9f00b392ae15a6702203f31298247cad9d15e5b0b413102956fc83b6548d2c3391d794d244afa63af2b0169522102117a18ea94a03676e548eac55e79816d07d4ac68caffd22e64bcfcdecb98e156210378f578aeff5a5c1996b68942eb6fcfdbdfeada5632877f7156499b4dcc843cb221028387f2cab816c75f3bc842f5ecaa1a3a5ae9b3a25ebafb4c9571e0b389025a4f53ae48a00a0001000000000101811dccc8a430088f78f8762eb18ee25801eba8419e13cbec0b40de8a17b7e1ba0100000000ffffffff02d33c0400000000001976a914526f90f63bd26c159c902716765fc3836d092f1a88aca0e0c60500000000220020ce9272f7b2457cf3311e57dc8573522b4f8c7e8f99c9dcf835350f2421bc100b0400483045022100f209fe20af883a45f3c674ad99e160fea1a07fa4335dadead3b3b9771856da36022061cc639ee1d27ad323c94268e7c27085771ba0c7a5ac7e7cb7f440a4505b8d5a0147304402201688d040528cf310b0adcef8dda721e51fdd4b0d1a17327bbf9ff25fae2d63e702204b808e41c49de80ed6ae76480c2c7c8bda6bcadfa344257a96292cfefeb3c83401695221028d1ab1bb93045b5e7b33456e4e6aabfca4b32cb3b994f8de8b2eaa7dd2402a082102bd992ab222c6ff3bfd1fa73b57038b6c2575140a31226a1242eaffb1e1fcb32f21020ab7922ceb57714ae478673021a77bc3d38d43f521d6d6ad10abca291396886053ae48a00a00010000000001010fa8e33f9d78c1ed2ac1e142b0c451a3584805ba14bfda53be3dbeab1fa8dd730100000000ffffffff0270640800000000001976a9142d421fb2e7f4c4d4a1ef23ceb6f00df4cebfce1088ac1b69350300000000220020aa3ed1e5a96c16f797cedbbf86063b099933b37e419a9311698d86e9f0da3dee040047304402207b107087da03e0e39ad3a00f4c8855d883072119d8dccad43a593aa2733409bd02204d578cdbbac84af4d72619021f9da0b40b95876c8b4454890871b1ac3cae16c40147304402203ba1672b916edd503a300783b210f321e6ff8d9bb810a317084e133bbb22c1aa02203e50177f20eab236757cb0d56ab4827edc0679d006b91c7202164ee4757b23500169522102783df1b28396f5fd037e4521fcd6f68b340ff0f3ddda4f7d1c73124c92b4f6112102178978820ba4a4f5c63dd9793554bc8048dd39b0eb522fa9151cc8291cb3a82a2102228c5b950cbb061efa4e691a461e41d468a7b4c9138aea1f1cb51d475ef51b4e53ae48a00a0001000000000101782122b61da694aa8979971badd7659708ced2a26de739f5542429942b094c0d0100000000ffffffff022bdf0800000000001976a9144433af10333dcf4495aa07ff7e568bc44851393f88ac77cebd030000000022002019edd9232989c1cd232e036252a0318b070f01896221771b5c5cde33d482eb7f040047304402204e2e73425c2b2b7cdbf169b00cad787e3a00de84ea9e903b06d234e87a48ab5d0220202938f35c1a7b3455912be75932aa0be475f8d21dbabcb36a61429b04db10570147304402201d20473b8f34fe0a2d50e68c84244ec7903b23a8d30b167b53f3c03370851bc00220786948ef78710ff098b3b683c730d479b56450f48b08fe36b852ee49f0b0a46901695221023aed40c695957d354d45749b43b82fdbe0ae3be4c959444731ccdc9b1a45b556210288d2899367227c2bb373ad3829c3474245f2f8c48e1f5c7a0a09b61ff725c8ac2102a68e818040a0e5e4b1205892cdf7e6ea2a452c25565cf57f4188dfa8a25aa54653ae48a00a00010000000001012375882eb343cafd6c9aff35a388f88f687bf5b78efd472aa663879bd13a2a850100000000ffffffff0250c30000000000001976a914c2a94e4744d43b64412b70fab28c549f8844062588ac53bacd0100000000220020db1071691cbe10efa99ed39f3297c03d7b080267efe1e51d84116c2f265df252040047304402200c61e2d1bba39882964f18c0e94f2f46b9f8f580355cb2359be0fd7783253bf502205704aa4d1b4a60aa7ccf02b12c630533363f3aa9a91d632190d77f76e76db30d014730440220713c6f1e4447173f0d2eb144ec692b88dc545db11f6893a7211582b94b5761d702204639e8266acfb57599fa0d79a7d36573470b27457af16646427611742dcf5c78016952210333941b35bd04fa47892acd931cfdd1ca53a243e3fb36bd92249fc179c59e7f702102c1bdf264e6d91d6819473c020befb76b4e2f5a6c66a6e7862b26a71e52f70471210243dbbe89e76c0685719ea5c2dce7668a49f306cc36253e9da7b1f942b8599de653ae47a00a00010000000001011e65114db7ea0d936fded1971cbf223daf2bc7d1cc491e307409db7b08796f7c0100000000ffffffff02c82c0300000000001976a914ce23e890b56b970762763c8b88ca17f357fdd9f788ac56509f06000000002200201fbd7601944d28ba53043ce7b13a92fdbcc78e61e5ba8352dcb09b135d24413b0400473044022058d37e58c1a35d542b331cd33c72c062cf3d49102fcbeba8d92fa09b347b5c010220337fef3fde41cf2cba09e07f1f228ed0b70ea547099d2d5fc4a479a316004a450147304402205363842deb862beede9b21d34a0cc6f9f6bad7531eba8e1843c2f34ad63ab18c02202929f527ec96c1fbed3d186630d90b0700365dca4a3918800182109ed4f3fdc20169522103cc119289642dd158cfa6fbb92f503aa89aab6330fb566e945f2d8c34384c0ccf2102400bf32a0d46dba0e8ccff2e93f37d22b6892f301d4cdc41c0f99235033ba4ef21033e5dd135d57575855019226d4b12fdbd3a14ceeb91176af9611b9e35093b9fde53ae48a00a0001000000000101b665c38297988b95aa5efcaedf81d38562ea9dd7c9b7ce470ba3bdd5d6eeea8a0100000000ffffffff02cb241400000000001976a91427cf15e2f270540cece80758d3a41dc7614f0fda88acd876440400000000220020a4cc3cb8b3657c01bcfeed16d43bb14714e1d54580c7d5ce63001cc929d1a29c0400473044022022d3f23541b1a4790470bc912015a3180bbbaee54f50334d6c6c3d0d047b653c02206824bc138d0716054288f4f625819e47f1624ae95d04c37b1f7a92a8d824c76b014730440220230419b45be6d8134c4915ced16133c6a0ce98f80c2937ae33edf00bb406d91602203c5677487c5a172361088b8d3349efa258a99a7ff56fad6aec202d43a1eaa4ba0169522102d4b082b0930c4b05da00594e3fb59e4c5ce0b9d4794943aab7bb146780eb367f21033ed8a84b822bf36cd968a9e83869b0db836a1960cebe34bc64ddd6f73bec76362103698bc14a6041d88cecf392e60b9d4991f5bf04bb71c4fe479c1d2b2aab8c18f553ae48a00a00010000000001013bd643ffc17422c58c88e49631f420ca5b06acd85d3c61dfd35b128fb19a7db10100000000ffffffff0210270000000000001976a914712768d60385d30faba697b49929570401d3efde88ac44cc3703000000002200208c0067875482d855a32b63488e3d1b9d5082287c8cd2bea55bbe3ff0282326bd0400483045022100ae52afefbe7c0c61aaa5ce9964f3bfb8ee9f56ce666deed39e90d82b940974a50220716901492cb89b890cd485883c6c1e2355c1bc525ef6de46ff64f6fa06f887830147304402200596f1fbd6172920e0c068661de14ce644dd350c710d63a6471faa67d92be7cf0220089fc1e23d5590cc97934cffd5c475e44bf14c1aadd1fcd76e4044f828c7578d01695221039cf7de805f2cac8a38950de532fc6ad806ea2470cbf009d0b625fdc84f0dd5be2103257d924716124092fa1533959417ebe5efc3f94ce361ad3db273c08de845d35821027ac09a0ade34f1df2013dc95f7141c7b15cbc7a097182c025ac9828d7bbd9bee53ae48a00a00010000000001019a9dff65882bcbef0f241d17d0e0d1ba0cbbfab9fc47ab698d60c03c12afee2e0100000000ffffffff02f26f0000000000001976a91463b9f125cdd3e242ca7c883781cd124cb48b814788acd8a7d00500000000220020eb690a8a023a498a1341f62473d78b6c81583b90f74b0345fd626dfb8d9d8e0c0400483045022100a70bdb1b523e07cd089749a08eee2906518e8232ef5ad7ec44582c8aedee9d5d02205ff3c339634286a917d9b76ce337a95fc40ce17e3084025348141ba535b5464c0147304402207c79c2a103d5f8634b64d093764f3a3dc92990f33deec80abf801035f73ca9ef02205d4fafd288688d017f3adc8d8cd02890725f4ff56caafe06cce051c3ac8e0a5901695221033ee0f5dd2098dc679eeef865ee0dc11cf0aa832ecd656a121317256855faa3da2103d948f301f9f777c546bd6073c6c635beff13c93c1d9925eb545c1b8cc47e89682103dffe697d5ef44bfa74382348b68009dc790c3840d2c52a7fa8b9da1ac8e73e2153ae48a00a0001000000000101a41c24be43a9e8bd54e08e4064b3f6e7b228c246fcecb2b2e5ed0f93be62776c0100000000ffffffff02405dc600000000001976a914005e0d6698e314a155cd2fc35586f67578496ec188ac4c9eda020000000022002073e811d0fe651bfad24a21e5990aeddb24ba92ab0dcba09d01fb1e309ab051a6040047304402201b1514cbdd96c3dced048cbd8845cafe0eadf720d219ea6882f72d177462da4a022016b74417986f3bd71bc8d9994a94b0b57137298f9ef5c9f1047903df3847b8430147304402204ec82da68472c3f7d1f99762683bc8b701613fbb9929b6db879a4025026b26460220319257c60b49479c32165e0959119037002d45814ae5b2a297cf7fae05eb55cf01695221038f4e0a2d6e08a52ffa9479692cf34c2a85e0644d3cd70a8eb12d2ab4b34a37b72102ba0cf1dbda5be6a95ed7dc276fbba976fdce0a50f2eb84f52f0263721bd7cc8c21028f3b3bafc04f164b7a85c5aee9e4e9da20d3666b4c60bff058f1698564882cc253ae48a00a00010000000001018e422f716fe4220c111fa806d783efd3682dcecc7fed6668c8b1b24ac782dc2a0400000000ffffffff02c1400000000000001976a91436ec598c1641da6c8e40d3215744c9f7fe34d8cb88acd5bddc02000000002200209a153ada40d1eb3b88edf789d0a870e69f816313d2d661583e39b9856aee375c040047304402206103560a242b6ac4256b8e26b922696883b2c05010ecb3ac4ef27073d48c3e9702205a535e4d4b75b98e04af70ce7fe8f95db5702c66af4ea033b782157423c64b310147304402202d63f3d9dc1eab9539c3c4a9fca8cae1cd04a014953a88e95203fb3a70e6c908022008a340960dc881f63af13af95bba4df4d25eac54b106b8b0d070a28b16c919850169522103f68cddd2c11d931c36f728d092051919897cc6270f739e699974c5a6014d28b0210372778725bf3d025076a9201aef48e7073dc7a73badb6b94e6876473dcd05186f21033248ac805caa99a58a8bed491f96cda8dd53d1b9c6b851f1426d2aaa908e38c753ae47a00a00010000000001011bc2bd91002ab689a0c7a27b262bcd94bd16a84af24b5a77c13f72c6b4bffd740100000023220020585751bdbd61bb3d8a17a7cea99d1ac1fc80704e7e0f6718ea758d945504a6cbffffffff02f3c404000000000016001448e83877653ab448dce7e22a59e65a8ad57d5746cf5f07020000000017a9149f2eb8186bc1123cb602c22393f70d6c595476af87040047304402206ec59efb0c825aea7dfdd934b8c34ab2cf8edf107bf15a8b0556dcf576b1c14d02207278a9fc6aef82623085ae7cb464baa92f3379e1ba09386dd32b607f72cbb99201473044022072a1edf0836981965580a31aab9c5a3c010e3ada5849f887dc1ab3bc5fce4cbb022076ef93976b33cac692b01e4bf2e554d728fcc880ae488363f5fa8d0e5f62b90b0169522103838952a8ab1bdfb9739b2b7963f646ea39daeeab0ae49ff8abcc808694d3b54a2102a3729ca832009be4f13427a2441969bad7a1000f5c8c0a23fe4be2cd73673d6c210312b63195d2a5df3aef65ca7dc6e371f57dc5cd00c602f63fec15233b8c17b49253ae47a00a000100000000010145d606803a1a7a5cd145e619686353658635043e335824e75085722333b21be70200000023220020a10b0cf1391b059102b6f398f7c33f122f1f8bc45d717820195daabb2b9e3729ffffffff02cf51100000000000160014570666be8269dbbf51e9c4ed14d842e4b1a8ccc4bb6ca5010000000017a914007c662d7f1b2303a831b6e8fa6cf4dc9698c686870400483045022100e45cca3e803fd63508d3d1b603bec5d72caa87e94c85be6a9264f586ebe7872202201eeb19f543b2b261f9202b5cd45df6eaeeade6439b0bd736d2d2a25727fb296e0147304402205866aaf7b83cbf719480b005dcbf6f0b24150ba3e8bd250186842874a7d5fbfa0220190d8ede79fed44769d993eea5f78c9c999a5e06b35e88dae2e131da99058aee0169522102c490797cc081df4597b646d448508e2f971416742492e4ea2de2470ffacd5fc4210378ade2f907cfc2770eae0fb35f7247a335967678e19767a0039c2abf778f0b5321028e81a9783c19a5ea3c2334c714fb8b1b77ed8ee777f0dec38241a43c0c0436d053ae49a00a000100000000010143b41c23016ae735875f6209f837ba86b9d03c48cf2f192e29fb73cd14a3d0f601000000232200203df8d7035b1f108f9fb2c976494ad369cef33468fc3b60b0365170e895c11788ffffffff0266b527000000000017a914025362acdb1ce183bf8a7b6baf86e6f5d4bc7214874c21290000000000160014ee1663210acd78b5a270a4f646c66b0408d12e8904004730440220406fe8429d90134e09f6c93935276be989550bbf396f680b0fe83a8adcffbf470220294fecbe0d9a921f8a3e788d770ebe35af1fc518b517c0feb35498ffcbe6846f0147304402203f900d3070983aabb746652d4782397f6caca12fe6765cb9c900afa0c9c7923202203fbe25936487e6f319f2d94dadf8632936bc7ef0943742a1c06e7f175b120bcc0169522102c745fbd23eb3a53ac02925386a4d54b74720f434692f821da7f941fee40114dc2103fa8b99fed85281a3c7376d9082e2d08a07d90a669f3fda5d5f63ca98ec963305210207e3be6cbf4328120ad8f1ea5b34f7c0bfd777e49774f56eec355f11b7cf9c5853ae48a00a000100000000010104f6b3667951d803178a2f91e6b37ffdfad7a7dfb83faf8ff34b435d4262142d010000002322002091135dd6f70e9e7668c5b119ad0e8d30c8d7f1b1964490d92df9b5709d5ab4dbffffffff02ef5c030000000000160014b6f25a7a415bab29639db862325ae6ef7e4114e32f1915000000000017a9147697e3334f9dbfdd8dc3a22038201396fe85f29787040047304402202239d054f24b622cea3e570dfa86bb361a01d4dd3d5516e662ec9c9f93ac1ce102200dfa6cd58b896d92711f930dc0b0fa5bb363b20e9cfd2e4a2a898625eab7421b0147304402204077e7ea5d6f4b69dea91744a95cffd12097b137fe5da2b87f2f1a754232b6c6022075c041b51a55f1a33adba622ac6ca60d12d0af69f8a37c2a5717af859860d4c3016952210333f17976f1b00163ce73b02df063e009f30d5724ef550f1ce03411a32634322e210270220ba8f5b4d8853cb76d82abb6159292973ee02b85b6bbe03ecbeb255352c22103c7539055f22cb79fced28ef4464a0f0c9867004520b90eab5f7cd02fb42bb71053ae49a00a00010000000001016f7eadc48d859cec10f43491888e2f61cda01488d078308c206be7c2bb1a64830100000023220020aa85cff8e11d8f405f6b812dcbd182d696b8a417aee90e3a94983ba71a56c65affffffff02c9503a000000000016001460c81f59fb5803fa71839fccb8386bf85bbd16c7917fa7060000000017a9147a48399d9afea2ec851fb0500e5278ed7f91f83f870400483045022100d39abe95134629ec924b3580bac4ac3956e5584919f57b7e6200105a52688d0e022066ea025171df852ce177c1350642fe8e9e620c86248186a2d8a14cc0cda2116801473044022020a4dc943524a6770bf9a577d750542dbe6ad79bc198d3b6b68b687c8356ed580220077b8fb5da29b8c918179e036923cc9ad36c20b7e298337547da26f1c8617aba016952210394469f282f6f7d0c0aade302ffea6473a68fe41f8d89e6c5e857939c81a743f1210302434b6cbab010414647040fb4cecc38c0e2c1686f4f0f450aa5d75a50a571c321028657999a7e1265976c08e37accb091e461c7f4c67dddf60bfb0f6042d479cdbd53ae000000000100000000010134b3b910bc86d030a161477f159f3ef971bd3cde85fa94a1c67121ab7d77e759010000002322002002cd04425107d0218dce60ae9d92f7eeed084111101886a2beb1210d6c1dc4d8ffffffff02a1c2440000000000160014d32c88fafb00553345c32217070d05b061f8dc30707eb1000000000017a9142eea16a80be719455cb33e0b6394ae7f38b1f8d3870400473044022039c8a229527818fbb880affca63a559e3c17ca935316da5e73be47e14983338c02200b0061551ce9a457a474973fce54f18cebc69b57e82e1c042c774e25c700f57401473044022008cfb011de6e0ae834fa43ee215c1934e6f64e7fb09de648d67a4bfa7c5ff457022054a26dbd0e2dbef2641dca5947118da97740dad5cfeb03b8d5c45179db6cd2a90169522102ccb770fea4fb83fdbcb696110c680bd709cf2720f3911e1f88539e2400f39e16210371afa4612dff592f46085183ae25766541c086a375ccd8f08a7848e1208b1bc2210331faa2b509bad3da2a3b9fc2fc6c9828117418454313c5e2bfa8001b49b4779d53ae49a00a00010000000001019c71edb2470c09ced7057f2acb2be7441b71b01a28c12b6d309257c1950bd1a30100000023220020ed70c1c71c33583167cfb989624e829aa91e9d5c8255a8586a26b2d1d36c7a4fffffffff02dacac30000000000160014a34c1dcc9d0de7a12756cf80c1c0faf648fcb2717db29c030000000017a914356e022dd0af9903eab52f25694e08af6d227776870400483045022100e17cdc13dc250121ef8e0ec6ff8814d87971dd23a747b4af478e657479684ab3022004306f8cca364617ec9b89cc4fd30f0535f395b5277b1c0db587d2187ff93b8d0147304402206160e8e920780276be22779b4ce37743eb59b833e3afa05779b8365f9967384502206ae020e7998f2cefa3da1f8b297b0b7c68f01bbec600a5b65d5189f1035370c101695221021317dcab32854a80af3842e7b2649ef11e5c68c8ba930c7aba1894b4da5460af2102f109dee83f5be8b5228cc0a46abe16f4d4732a83abf0ada8aa191ee0eef6ae4e21020bdb5eb3cf46f5405c3f795a089cc7da7889ebdfcc08d61c0c4c3b8421de05b353ae47a00a0001000000000101bdf3bab1482073e970ce342bcf186725242a531cba721543c5d5b644544d77af010000002322002019d8da5d1fc8dffb53371a89c737299b933528df38aaeb773f091ac1a013c3ecffffffff0268bf000000000000160014876819e0bf13c8253824c863caed150d6724e9b37fc104050000000017a914d2b6ea5b4056c628ecd5c8a95f4af77ceeacd45887040047304402204f465a8562546d46191c8d8b264d9d05a2624f40e52749ae61272b5712fa456102202be044fe1b2342fa1e9e7e20d4f72ef44eb8c894fc978311c3b4166f44a73db801473044022035d39569fd8da24113bc92c87c046122b7fb3b6e6efdbd645e1f9053903014bb022009a9e5a360444d93b0393f9c354322fc3aa986e5071b70999b6c98ae3bc288ee01695221039cf30686d785a9a516f743abd25a5bb31676a50cb43ec9d89312682a47e2f707210397142c56c769930636e530e7f0e76526f701dd184e36edd8278cd6a9ecbaf58d210343368ebb3109cd2864211d7e23bae22c500e0c6965765c419eaf031e333dfa3853ae47a00a000100000000010149c822fdaf77538e8c36362d48ae22190efee159c464068d2858543f54897ad10100000023220020c0c3e70e577662a3655ac3a91ef8830f181e4537470eabc6600594c947e76cc5ffffffff029a3a020000000000160014cfb2100d4d8451234bc4aef4a74a0d48f063434c2936d8000000000017a9141bd8c08ff43342242d8e2c3c2baebabd16c871f18704004730440220095aeb69085a6ecdfce9d362fecdfc8d3cd4feff5b1c6ba8c8119b5a9730f68d02205b120c20a74d1a41b26975bed033c4d834bcc47e5dd645b68b8e5ec9defc0dd201473044022053a4d70f02602b903bab00659348ab141911a5aaa8f86a1befba58443dc6075802201d1373884234c1181ff766f0e81bd688225c639f206f8a4cb765ea2e03eda3620169522103e4af937cf0fde2077070e403b1a7cc4d763f1dd5822447f1c013ce068b7d7c0c21022881d368b5ca3e33b5abf8f6eafe20aa89b2e1b351c484ca2bc4a8a9455a4b0d2103920530b58e33fbf20334b63b3dac3bb4670ae228335c07a866b45b6cc0a96a7453ae47a00a00010000000001015c2f5319fceb8752357476d348575bd253c571838b68ed76d00f0ebc5357ae5701000000232200205d72df6d4dec572bd171086b720fcc9bc3dc83d99e386261bcb2bfb6b90e25e7ffffffff02d2dc000000000000160014cfb2100d4d8451234bc4aef4a74a0d48f063434cd96601010000000017a914fe11ebf666ac74392252f12510a80c7371d208f3870400483045022100a97ee2fcb80d9e9c39a1a0d02eb0778f8adff85811870dabd809b38e65c57115022017272d6a9fff475fb74b4899173b60841651b2aab2316c009cdf40cd1a17b34a01473044022038b41a9320c10f112a9a7241cd7608a648bbb039479dde5eb3ac69dda043b12c022026ff45d7cc26d0e4e91eaa6e7427aea49ff3a18178bd6b67f9fd1a5c81e9fb3f0169522103db628459e042df949c9c510dda7616738110eee0b08fe6b8700c7111a3ad6ef92103361c208d971229f82db7fa71eec532da2b466bcc9f929bd5da995ae42799dc73210305f67d0b3d55c7f9b02e86673ee69e7005a73226491605e4cb18fe86bd2934c653ae47a00a0001000000000101dcc4177dafd6c0487b1c7d537bc3aa3b568945fd8c3193ee64aa1440b662b3760100000023220020fb0f83eebf0aed14254f1b8d4b722fbeb4e68dafc8e09786123103c6fb6bde6bffffffff0282b11400000000001600140c77fad2c100a582a4e5555053bfc79b7fea095f8d83b7000000000017a914a8380a34ecfc9230adb3e3fd5b679115a520675e8704004730440220157e10f66de6aa87c22344c69b263a8cbb0d84c30c17381b15c3e274806770f80220637719b0b158b12c401e289a92debaf08a4747ac846091db5704d7346346f43101473044022064a4d74a35f56fc34cda48d406d13aefc7e27575ef759ed632cfd30b7dc899520220432bcd8904e898bfe2cfc65b8ac62a597b5633831ae042dcf75b18803de10f81016952210331a13aaead8cece473fafe067a9fdfb0fd1ceb2fe605d74de8ee7c3dafcda76a21021127d48a24a32627e0cc28419a4c838e4f7bb382645e95de1b75bd95f60f8e7d2103498f3ea1840988592fd8ec1582950887a1ddd713d5409fb4e19aa6bf936dd8ed53ae47a00a0001000000000101e3f6a7daf5193387639bbf8491b106d5c410fe52d2defae848dde7997fee3a3302000000232200208b0da041c71b8551ad5e002f2eafb94c3b6e8e023abd921a8025a5ff9433eebdffffffff027f2e71010000000017a914b517ac60bae7ac718db5de68af4aae30c621ba01877bfcbb0100000000160014b4558d1b8b030b7d051feafa8a065cf02f83e29c04004830450221008902795495673ee264774b7a8ec0214e8e077a0f2870b67764618116c1c0eae702205be99ac88f0b8c5489c16650849e45f48168f47f04e6f251162285c5e596351901473044022006fb3c0cbc4f91f3149e63195d8b2a2cc306e9da492a0bb3f30c079d00a9168a0220591db3c51b7556467eb38d45eb846c09a034942514c8c5fe043d8b77539fb94a01695221034513c98f58f8f30f76e785a93106b447f6e73600da2054e4cf464ea6b3c46f0f2102d24099521e84e2f3f77e2b8cee8ddf1040298e979ce3b189aeba10f35d0b1c572103aee387e0c39f90c36a7da5fa0d7283bc67ea59790fbd89eb50fe71ebc40b32f053ae49a00a0001000000000101670a1415a6ac1e4bf03ad21fa94e48da7dffafae04c40fcbacc15768bfca9d8801000000232200204c477291dbd881fc6cd0afb0a3656756025acc405d4f73135d39cac2dcfa7322ffffffff02a0e7030000000000160014571ac7040cbba9feaf06fcf148d784ab1051e977b2cfc6000000000017a9149d942c6e901b2728362b111a83a0df118c25990d8704004830450221008a015890376cc5fef0403807aebb94a4fee460930efaa166c595e076b518372b02206bbbe6bd990b158f93463406913d0514336173b27c9b6b009524e9c3c818a30e0147304402200c28d0a112aaf7713ca3d73067fd36b20db1ad7140b350379370358efdc5169602207bb1c85e51e202cc60ced0072415c7f1f31b12aee59b131f33835447692e954c0169522103f0e60f868874e9e1ebb0aa1426aa58d53a69d648e0e07eb1737d8f4cbee0c9362103d27d1919ca1b93256da14067fa95d1f2a2c245aa6badeed19a37eed8e87509502102cb9ff2ad762eaa52ad3040c8c7e9f8f48b7cc6c2efb4d306e1bd0308d19b53a353ae47a00a0001000000000101e7762a6e52290e1c8ae888802485874c8e42e45af38525bb38c1109d9369ba7b0100000023220020943a6f26a8475e2ced8d0cef5039f926c6529c4b7fc6d6c9297877b5b0c167ecffffffff02751c17000000000017a914ef6bcbf52f70bf9c84c1613eefd5a863c635b11e8798e34c0000000000160014ce76520da2c2b44ead6484da5aa4bafc695fb9a7040047304402202021d99727d7371c4d218e7de44977230b373401be052f6abb03a2de1036b6d002200d11be6c9fa33b25cf32b603be33a91a849a7d12a3a24830fd2b4ce7a34f92a30147304402205552b71033d2007d5ee917a46d1c65a9f071edb9e83e329c392ff204d522df3502207311afb4e3bff1f7bf1772919cc04794b74286f5bb867a2e13a4920c60726f2901695221027a67b01b7c06bc937127ec2685c7ad3498022447cf927c8f23927d5fd8a52ccc21035cbe1e01c871dd90beaa8f3edda0434a78e538096417dcb8dddc9ef04a5fdfc12102661a50b9f46e1eec9b91758c72ecd59177a68ad746474998722968b6a288bb9b53ae47a00a0001000000000101e5178826c9f0c0b4f197754564bc280449a74aa0a08af2bed42ce5e640075ad90100000023220020e062644de3a5efce26a617e03daf6733908f67ab2381614fc42af63164419b00ffffffff02d798030000000000160014e71ac7201e07dc6d353fb4690d954bf7b227ece2d22800050000000017a9143fe7dc0c5554a4c9cd9ed5fb8e82c9991ac1e82b8704004730440220318b6752f5272f1ca25795af8e552e3ceef86dde5a9e160811d8b29137fc86ca02204c79587c40dd0bf8805fe80b42beeac4c4daae282c5bdb5dcc2fc7be3d3de4850147304402200d55bf912862c34cbc58a17c8699ada2e7b0269b1e2e5ddf33be0454669d879e022071db8593ae668f73f77b5dbc5ec2f9a44019feb619107c4ca93722753e53f71d01695221021feb11c47e4ff357f5b69f1dbab3b26613d6f15e5eadbba06318f0ebc6caf9e92103c0b51b3598d0b081795309021902fd90fdbf502c52319c70a40581dafe2f673621029cf48cc2860329180d0e5c178b1f212b4888906a1b6e4e84824c863eb6846af353ae47a00a0001000000000101fe00b5b72c0b3881adc059c16dde8a6b50241912fafe330ca83bc9aa896af9610100000023220020e2a73f84c7603fbe4ce079e2dabd79143a54b9a174e2b47d9c0464b02d0059b9ffffffff02b1320000000000001600145cdfac9cde12ffc2c1dbae38f2d14ade8350a683ca1f24000000000017a9140ee24f0b42a7819c7dfcce3a0337dd31cb24676387040047304402203ffe343a220142ad7aa5ed511b259f522125737ed8ebfa3b63a04f26a1dbef5c02201f8fe4e03bd0efd15106f2297eb78431c35319d0864080b6a8bd2beac5bca5270147304402207a195a10d105c48246744b97c2aa4245be44925d760cf4ed7c694d82549afd820220156a6593c312083cb2cbb15af45583f9c92312af5e78f8232502f36f90431cd8016952210308f2f00b7219b837a3fcd20847287e15554dc78d2329b70668a935b7fe6e6ef92102dce8a187771cf04fa504b821a5c26d32587e531e72133d3ee4215ba8aa52cecf2102359b6dfd0d5f4aff30ce5d75e7efb16a46ab2ea29b75a7e2062a1eda493e89fc53ae49a00a00010000000001016b3390c6f995d7a46cf8c5480d37042d41306bef365b6faf723fd0d14f50274a010000002322002041315eabec907db73ca0aa6e02b30120cdd2e70e8137d785caed23a9621fc0d7ffffffff02cfae1b0000000000160014cb82b7e0e877e8d7f6fe6c15240f0ec724accf823cf400030000000017a9143f032f4014002fc8384753c5748c875473fb7f8d870400483045022100a853cef95f763858cda5430c672bd5a8c1207515acea4c5153b5e49661d294f102203f4fdaf5fae9071bc777d2da875ce30f5d3d4a9e5a4dd2f4bd6b5ca49c209cdd0147304402206a696b1441e66bbc956785a8e6b7fd32d3ac1690b0c8fc490f6243d48f25ad5c022052081bd7e6e38689c9c20913d66b9a4dcb2b1086d82d26a2bac9f55ff4f430e80169522103ec71c9a339f228cdef1fdfa89ca7edd4364a858b13593b2c2498afb842e455672102720062d8efb520d55a1e5517e4a8b20eb5843d2d5df82daa31a24d92c58f322521038b8dc4e8be006fbcf2a7dedc6bb5022f69d0496b98ae6adb8a220ce992c256f153ae47a00a0001000000000101fe52ae9be2158c922bb9f969488ebde62f809c36a7bd75725d7d41f6705ecfc3080000002322002090d2ca0a9cd12afe9f109e0352f86e5b1775bd84311dbe72b656203bee559e3affffffff0222af0b0000000000160014bc968a86458b9cfdc2c49e6605e5d0f18559055cc8b221000000000017a91423bfb9816996321a4ffb464343fa64d6b40399e987040048304502210090759e7ae5182ed0cccfbfba344aed96c1316c0d3697da24e747e20333943eba02202663c2c5276027bbf23f22326369092cfaefd7eff136dfce5b0f8e7a95209f870147304402205f6b9de57719a55c10b51b45f610b88214a155c63650e5039689bdb7c521dd7e0220043f85a4ef6e8f5c216a5c46fcf54e336966fea877fc2aae4b46ec8709cd2a4c01695221032e4059117f3c1ce24fafa4411118858c1d6d21828c707d598011c8770cd8de87210354ca93b9a0b53370a3840d9f1a8f98ddd981948de446bb363f1e31abe1fb81ad21036fcbd84a08348900ee6583e7c8f0e4a03c83a1f3628689ba962036376d31806553ae47a00a00010000000001017c4685a505c2464526d9f80afec08f46083e135edddcdbbb2a32f6c29154f7af01000000232200206abc3b1d2e2b87b897cd69b3808fa1b0cff5d990851b26eb6d7ee5b97e4961b8ffffffff02f25411000000000016001418829e3a7ccf19ee6fa27095564b3097dd9630b84af75c020000000017a914b6a1daee108a001375f33f7fc1c4f2c6c41246098704004730440220438b550a4cc8c5c95fd29247517e3349e7aa7a83c54a48361d424cc452064cb5022024f747c25609056410786df90ae35dae9642cdf0c48d2eb29eea33836ccca6f001473044022054468f94d28f0fba160a8549256e64b49027241fb0e5fbf633886adf04df24b30220123c27f8cc34c7e235a30fdb7984d6571678201d60f0616f054e0977ffbadfbf016952210211e8c9db27ab895ed4378e38dc03e0a63c43dbc5d52e5884bb3ed0926f05ef0c21030c06e347b0b7f0449f4189b11bee7392b99cce860ece151b1b470488afec509c21033b4d027f6e2979b945ef88bfe7c911ca0b499dd80a5409b07356060ae17a06cc53ae48a00a00010000000001016cdbc9e095a4bea5d03b6eeabb9831c13e7904a2cfd77d47d7cd54e9eec6273d0100000000ffffffff0285a2020000000000160014faefa9800be38a1ebcf79bac9b83089df955bcaa3fddb4050000000022002012d29f5611f0066a062d0cf92742fea364ec01887fd8959a8da6a3d7f4035e2c040047304402205f20d0d7924519ef4495ebb7bdbe9fcf05443a0e1c8b2d74dfb4a7937aa6b0c002205a05b431aa89cf638d233e662f02f5b67cf78932262746a239b6e9a9db255ebc0147304402205d5c4c365e647bdb515720b084e83febb47daa980ceecd28a55af162b2171f2102200ae7571fd0b036ed8dedb0744e5474d0651505a7d81179988a5656a39b1cf862016952210270ae4c05ae19013ae8dda2c97a9dbd34941d247e24c14364241bb15e0e2718d7210289fba3123cb41b3897dec188bceff0e4b3b5031270fe095477ee92963ec5c25d2103bc306e9216ff778421205908dffd715fa6f4abe6423135d92627f8d59912383653ae48a00a0001000000000101e36215b0a841d896674a36ba714296b6f34d1b26e2145d80b7f59a298996e4260100000000ffffffff02f18c1e0000000000220020e4685987fd60188ff794700d95772cd09c9ba98de6f7484404968ba75258e3b7127c2700000000001600143da2b211f09d99e5790ab23f96b8ad1f7354bceb0400473044022013de20f1a64534cb7d2d1cc33f57c8ad60d97f3ca1289c012e7d55d351e774f002202cfd46b579659c685715dd1053960171ccec40b238988f99e29276e3d6959e87014730440220758e9144cad9baedb770f455580e77efae5774f971ac29026d325698420a9bc602202f7893389d37776616b5cce0a80d2eb63bddeb94df996e1dbc22b8f5c09882640169522102195309bd21f3264a30af8fddc0ef1d46bd6ce5c8c5e53504713ce1d8621e392a21025211cf211d6b0eade66c324952c3604ca96d75d7a22c98ba6f999deba0f4fe542103bc83a953c958fc5fc1715e71b61e4b84df9509651caa88e91931e58bf62fe7ff53ae47a00a0001000000000101b203c47d739bdb6d68876299b45d809fa2150f34ab7300155092b7fd1ecf9d970200000000ffffffff0240771b0000000000160014e7b5e60fd25e42bc7d1b52cefdb76c1d41ca7f30640b270000000000220020173ca806323f5024712c3efb60b17cb100a599fcf90a33cd802dbb7215f8d1df0400483045022100cd43f62b0ea772bf1d2dffca60595b304310e79f09a4b32ad458ae615701d8f602205de75ac41c6f050594dc63f90cec296746b733bd84b35edd8a146a1c47dfcbe30147304402205066223ff519d1d6639b9b471177dd3d6bc6fa2e4fa8ba8a56609d06c0ad55fc0220690bcb3ca2ad00fa10b23bea09674aaf549ac94fd95d8e771f592a7edf92b8fb01695221020142058a44bb3b5dfd3724f66f92230cfb2f1e2e5355410d57295c61d80c04b32103dee85765d8fb48cc4bf8b1e252f19d44673a5625b4df8570c71c40820b55a5d821039fae9c6d0b3bfe94f38df515db596aeee9b5402e98470a3749b12ffbf1c358e453ae47a00a00010000000001015edb2e91dbfe8bf3c2e6b83007f492e7adf715f1196f5b22e4e098fd3e767f750100000000ffffffff0260f60400000000001600142ea3d3ec62547ad94d5ab89f2eae9f0445e5de41f3a3e50400000000220020b3e51be23aec83b29154a64126ce5435d25ce98ad256ec458e6df7f181576cda0400483045022100f23ce010a26b1cf19d039bdc8af1489efbc9b9ec01ce0563ad4f9b05de2d3f7f02206570dda3dba1772b117278985462b36077307e71ce2fae244a6c721ab1a9c4e30147304402202be3e163ad9474aa3034ff3c721ac3435a571c271a3a725244faebfbe8af0a95022032ef859c07198f746d1fb393245a4fb8effb475e346c6ea7855e14f287e3f72501695221033b925986167b22276e8ed712c4816388e1c5927bfaee39d89c85a8ac534b4971210368db13bbe615a689f99b862e43a1b0d16b677ab1e8e1b81fbdd4d035e255bd6a210355728814c542f383596e71f9b0a30aa44f73a3586b0c10d9d18077abceeec50d53ae47a00a00010000000001016bfb52fcf0ab00972921f7fcc51192dac26ade2ad711b092b504ba4dac41eae30000000000ffffffff026b1e050000000000220020b7e49a8eeab62209a59649576a0ed3031370df995ef02f41f281f5d284608e3962401f0000000000160014f2ec753e60ca46940b46ca373d65b261a3d3e1c40400483045022100fbb6b84e93a5e5868033da4c238a0c9fe3089a7bceb692b3066a95c40283cbf1022002bfa457578ab38d5b38a05aaf29678cdb6531a990e79f78c94a06e991954451014730440220478cc31d1b795490702bcd9068917d1a875f25040d4293861db6d1896b93bd9f02207269a7b7f6ea8174fbfc1f3bfe3da43c9f2cf8413b8135687f436094328664bb0169522103845a206ff161ae417101b8d503ee88725b10a78c2af609da27a7ab4d55e39c682102f384261868aaa2a5f304d427c2d979605249c89b94813db09633b9aebba94e5b21036f8d51c303d07e7542b582083201d897f3f081abe855cf2c0be26c5dd5c213e953ae47a00a0001000000000101a9844ac5bf6cfc9e9f17d7c7b93785875e22586f2201cce2931f3ecd9c1290320100000000ffffffff02525a010000000000160014b4e79a70f9e505a59ee0593c369bbf1f8af8de6e11c7100800000000220020dcb84f87b5593debc3bc8824e248341d5e69be562c9dfb54b2fbac8a9e443c5704004830450221009514e1e5ee18f0584899519118a156261bcb3b13550c03d0158f7ef15c427e740220344554cd58df08061dd4cf3045d5cf461d0aa85856205ed76fcbecf28c075471014730440220657c4736d208e8b43291cd00cfd72616e948e5798f0cfc4d8caa3ca2afe30a5502202fa78f85680bf255313abe61e959975c616e3d6a694c96b9adef138a3bd41cc70169522102eaaa004aae31c1d5b93f3f2d54ab071c5df32d85662f5becf1b2e9085681c72f2103add2b1973e255265865ef3ed6e83e2ac5e186a41db21321643481602427f5db8210239069b4702f0a46c4c15c5602333a82e25e232580d688fb4f6c25220aee556d853ae47a00a0001000000000101d6cf419ffd63fa250d17a827c25bb5ece9783053aa28d18ab430ba76ef780b390000000000ffffffff020e6727000000000016001422ea0358003eca60cf343a4891601fc6518eb7c7a529540000000000220020270eb717d930c80f0bdec589ff40cce79206ea51d6e6881fed884df63f773af30400473044022005cd0b312d4a803ccd5c654567becb4d205ca4d1de1d5e75bcedf7c3bced618502204aa7b6f28c33355d29c7e5ea0d883e2fd8144b8bb942824743935d45f74df7c10147304402204bda4ff56dc9faf2cb10c2c42406fa4b6a84594319879cd64b10d415feb51515022076103da4db5c93e775ddea59052e6d60cfbc3b424a6d49abcff1f194598c459401695221023bcdc15b1df98d8f05a3d4617eed5860ff67e2177a8d35296fc3274ba7a1b93e21029dc90ebd17edaea652433183402e89ec37b69f61848d1ab115d07b034f2a2dee21020d08e71b8f7e9efcd7ade13331cd0b7682742c3bd7d1659721b115a00884223b53ae47a00a0001000000000101e13de79c06590631337ae50978c3f91bc351314079d59f996dd80b50cd89875b0100000000ffffffff022fb4130000000000160014d0a0f438d3765e3a6f32861268f45c517d73433815d5350000000000220020ad6af22c703862448260df285bf527b5cd89e15aa96d820216f8155f5fb9c37e0400473044022072fb112c6960748a99a624e61e3ac0364c2f4d59a9e43b9debd07a55beae0a78022028852325a1a8cb48147fc03f59c808de35a7a7b2c5ca7b5dc998b9813b733aa5014730440220624f5560918912dd8b29f41cdda2c5801dc66cd27cd6c1ac7d91e459157b38a702204b26b50f72fddc790f3931119456e50542d91cc4a9ab76d639000bd7e68a1c7e01695221022fe6342235eb24a147ad6ac991d74e5e84683db746c148cd55c54d2bd214b513210388e283d6660055019ce782510d36b1269df7a05a4dd52513e6f45483646e4f162102c802d24f83e058857ba959f2ffccf9cbe360eed59b67bddaf2c795efd725e6fb53ae48a00a000100000000010113e86291f5aa0cc9a8af48e105a8dd768242367765a9251cd65def7ac5550fbb27000000232200203ea7049a7554dbdacd69c7fbd069af2d5c77d03cd100f2a39ab1784d8b39e2fbffffffff02d15e02000000000017a91483a45d36c22646e98a44e2e3d5e2090900e6427e87cfab33000000000017a914a6c2e55b2bf0f6c5de165ea969269d48e069947187040047304402204ca7eea5b190b9bdd62d7fca281f017a98c3c85b295320d994536dd0e47ed5ce02205afb59aaf0db87e48419c0cc67f54aaef076407290deccdab49989d71411cbb9014730440220737dc1db6e13472f1a23769ba4c67c8fed2c8477ccaa1d82acdd435201174335022065e6ea094a0b02113e59cc3ea717d5f91f352ab676a2c77994488d19e59fdd960169522102f4d399a5d368b1c3a64f19ebf1f5ce6c60d2bf5f75eb317f8d99039f60bee63d2102ab633f219e1442f21e4b45f9c6b9b91f44e86d9f8b1a8de8a53b6be55c27c6ba2102302f9057481b871e232e7450b4a97d0aa3749a511ef40227b64b4848843bc34953ae48a00a00010000000001013aa6db4dfab4253790b14da8f199f25dbe15dab558710cca2cf9031104d887dd010000002322002005994e8a1a8665de9c7998dbe3ea26e51e7adb449617cf5527af536753b2084effffffff027c4805000000000017a914164d9cd85345eb3b842384d57f862ec1ec46cf3e87850d4b000000000017a9140a517e8123747a526b6b1d1e8f7fdf8f8825fa898704004730440220403a12da135f3bf61ec2e728260955dff22c8bf90f4782c8547d00258edeacdc022056106398a061c0db6e2f5de019abf12bd3dacb60bca131904ac98357bea7ffc8014730440220038acfd2bc25ead68f87834b0d74d23eeebd60c8496d3c0952a6fdf6548f8c5c02205de66ad56c6a6eb6f57b760a7b4245da0263c6d11a95bf3ff15b907fcf1fa95e0169522103d776d74e86e8e62f42210027579e11a5c4bd2b32d5c573fd933c991985c428362102c85f90f4d73e2e4476da353fb85f6596864c1da66893eb2eb8cf6567b5cc269d210292aca9f9e4f31b6dd2e109ded736238142e2f36c1888c951ae3a00235f2f730d53ae48a00a0001000000000101ba03fea0af9c58539d3cffb970aa83b66113f1457f3d2dd91b9a3f697c58406a0100000023220020cf3dfd7a5b107fcd47d1a3468efd0b490bd6f92a6298ab6c94dbc1cb25609771ffffffff02918409000000000017a91403004eec202bae45da67e2500709ddaf1224f66d87c7de13000000000017a914ce80fc555ccd6c471467bc4690025142e25fb10e87040047304402204f2bf72f2a69ea914737262bd7ec20b742b17994698716f3fb44e41ca920989a02203e31586687e0a00481aae1c92d01b201a9f154b221e324ec1b6a1ca2f17336480147304402200d7909d278a443ca73ddf2c4c976247ac4f410b19b2f502470332fde23ccd72f022002e350ff6c126255c472571b8b271538a557b07a4544bb8f47182a5c7e08555201695221034e7f5e1e319d4a6df7e1158562ec7c0e1f8a3a1c270b146aa0c7e619ca95a0e52103c8ab44f3369f4f2d4251cc9f3435c6c6a9516bf640ba3b9ee764d0ade22e1b7a2103a607fc5a4d6936ff73965b34f45c2db71109383451c35e64685b14999f74bdbe53ae49a00a00010000000001019c2f9c086b7e1f1c6d71ac28534f7a901e648d3d7af9812b3ea2c7dd6e40f68e0100000023220020eefc8992af7d7044c6dc49e6341b1a458a64189305018120600eaebd39da6f40ffffffff022ac617000000000017a914fcc83478d8aebd0ddd1360e5361a43a2ac1e78b08785a446010000000017a9144b85652d01dcfce9595d28a23d8683b60a2dafb8870400483045022100d62593b1c202d2f83eee4ea54ed7512ba6a4388e7cc8516391a5ea4a6205f17302205926ad74b201b63245b14052b9da517bf6c49180ffb7f566f3b90b1a9abaa808014730440220696f07a0e660e2c5d90e26dfac93d9c9485428b9ca6ec6c0f62c2c0343915d5f02201fa90faafb268f13f60d85bfed31b68f330fea9284db29b10f7995dd512a08370169522102fa00387b64763de210865de12aec2f88f38e9febb91d10e8a93a4bc9c05f80a6210348b51da6859ea478f3f5879da81ca6b48a761259c59102f51143bf144c51a13421024e986b862aadac885091e00040a2a5a637ce868dbce99b35c7b6ff2848b3daea53ae0000000001000000000101c6c326a5cec92334c7167139dc13a8100386024d75138d5afd42d9a6a7bfe2fd01000000232200206cd54f30355a8e53b207840247bd76bf1a1f09afa3bcde2b6f4c4c8ff96e51c2ffffffff02425a03000000000017a9140c34eefe6bde2c0574eeb03575615dd38869a8028720635f000000000017a9149f2f58b008b0b78412803392df2f2c64fae1db22870400483045022100dd8e1fd2004e141738fb67f8d19635f4e914075c1fa871abd6c06c9130dd08e202203539562c6b9570268788fe915a5b71aa2e951246d6a32aea69a8a5c15c829a9f0147304402200c57e56ec2b797ce8a5bb3950c68479600bf748cc0e1815df21800d41501f1db02205f88bb9b2a41f4d957a6c15466d937cbdb7572c5600a5fdc53f9fd9cb56562cf0169522103606f3d6ddf1c36a0a2e476bab1e2f6e593c91efd0e4514dc22854ace369381dd21021aeee27e91ffe84cd06e0bcf8cdd112d2b883fb0af6f8d902c7f02714e083abe210399920287453f4f5b25cb33ad79dae6f10e5b2f51c61542f8c110c74f704c2d9f53ae47a00a00010000000001013b2b7bf03d73955a0cd8d41642dbff541cd63f218f035f67776377f2b6cf58350100000023220020d08d61dd27f81829a76f28e7f8099fa839ac1ee8e2c9817e51f7e75558e96074ffffffff02803108000000000017a914f1f417cfc64c100852164f17f6b8fa1465d5195e87883157020000000017a91415d2018023cbf8f49bb1bfca8442a2f482ffaff2870400483045022100ed34a746455ec3bbb95dce1f5d3831681a182e515e4a2170adb9d29d94642631022019233553071b4e7bced89b79ca0cfcadf6d68cdace804331cbe21241d42dfc9c0147304402205b3e0a0c54f4461c1e8fe2142c5effcea2dda6153b87e64b5ce6cd6f9d415c2402207635fce4bb0e68e4528fb6a3647de57eae1938309b7f0bbb05f6fbb33c7d80790169522102b87e36f2a11575a737712e6e7d73b3c1b865a03fc257794e27ce1f385fe2b7a32102a2442947c679fdeb809bbd230de62562d7778603897cbcc353028a8ec3bca2de21030cdbd9fa97aa97dd5383d63a426fb4141d50372c456ba5fb46395868922a2d2553ae49a00a00010000000001018c42b819bbdac1ea1757cd741331008bc84152adeca56090265e0707fbee76d40100000023220020f220553684bc0b0b1c22dffa4ee9524a7dc1fb38eca612859a0c97ea756ebb6cffffffff024b1604000000000017a914bb5c2a4a8c5ba67fc3a989092580ccd7d979b009874eb974000000000017a914cc8451d67b8725ba7ea007708cf0f71d0a91a624870400473044022002de614b1bb385fd86eaae95ea91400f16794f6e64d3fcd5458a19cb7964c1e80220592c6867d0a1f769c623867c55e9a0148660b0608b1459e8fceb946e503bbf5b0147304402205c0685f4b0f6d7312ea4e43b96dc2abb7396d1c41c83a51eb7fc10ae1f538b4e02204c3e2e1015aa89bc5d6a74be0f6ebd68a8a7659d12fdddb2deabb476fae959610169522102761d243e6fc3ad0dfa153c7b512172305d691fa1905f98c972d691d79408ef2321037047bd0c24c04fc2f2fe0f163e3baa6e62a549a63e4e28ee64b83a71997dd985210350642b5527f72596179bee5b4707b3687d2c7b1cf508df92d41b98d9a7b1d52153ae48a00a00010000000001017ef10fcd0388ab76ffca32a1e7e7833b6ca393dbacdd334bfe5507ea68e03d710100000023220020fa3d0d581799edbcda0546a3002492c31c99059c8a65f90c6d6863d8ae4b09f4ffffffff0200863d000000000017a914b5a48a2c7247c727db448991a630bd38f75b52a6870cde90020000000017a9140f9f90b0631d42bdb34b3f041cd4d6d9a007cb89870400483045022100ec59c001904f5d8b3d2bc0f23aa70f1f218d69c69bac1df5a90f6a736b2dc16b02207db8275c5ed6ebcba993e5fdf1acb083c9fbf6b511d183ae107c9366b63cc22a01473044022029e95343da2a4c3895db4aa1db2531b4510f47b3869d0a3c37e4c478fea6018d02202a31e92dd9d02e043726e47e40c2ad08a3aa2e8967e7a135c343ea9b85896af20169522103793bbbfe6fba607fa8565b02efdc466e3dbc2d91fcdc64ee943d373b4459560a2102ef7d334fc9580d021843c77543515e00471761a96b306962299e173529ce165d2102d558eb03a50c3e2c545b49c063bfc47b07e23727bea7b49d329ed7132913bf1853ae48a00a00010000000001015f3b47e6a4b442541041a6148c9459328bf6406460c8646753ae8f405c2221810100000023220020f6f3559ca0d8fa8b52283c3ddc44ff565a45e67688f0c3dc9e03bab4847af690ffffffff0297d281000000000017a91459c4c3cc5599b51e3cf31c8ac47e13defa6f08a487747944020000000017a914370aaf340a0f923a9dd2096cb35f161b41a6dbf9870400483045022100a1f99faf203b434fcd54eb381ea37b947c08e4f3cb0f912a5efba590dc72dd36022034489378ade31af98b129a390d4d539dd224f4300609fc9eeda9d8ef30549be5014730440220744c38d8da9f1f8911ad96ef18842aca23dd0812535aff2600754fda4b5363f3022070f2167c1df7a0d30e28239d5c93b6903246a2fdb0e6918d9ac5f66a5a00c5f001695221030f653c48b790ff25196419eb929eaff9f78f0f1b6397e919ef1f4fdf465295dd21025dc15e2c2deaa4ffd182935157ea11cc26573725264c545e4238030654caee3f2102e4c04353094dcf57c7c6dfa549fefc1c075030532367d06a9e2aa4ad01b9ba6c53ae48a00a0001000000000101343e45678cd16f572959ea17e16f7ce117a5033096310914edb5d2257aed11770100000023220020ff5b8173cb6cb8ae5fbb2c972f37056c55b0bd62931063ae81b6a552c72fa6eaffffffff02f7d81b000000000017a9145f4d104bd0c3a5de130c53300e80ca674aaeaf1a87887ca3000000000017a914486d5c060ebbc4f113ed72e8a8bad3848cf65ec2870400483045022100cf68910dd71c3202f575de731500c58f4ec354f492a408c42fddb776108e726502200fd5c27075f690956b14d91524325f5cf5410324a91344569d9d92fa56e8a1af014730440220751d5a2269b723f2aeef3c4358de341c0bb7647961f3b5b471c369e7d459b57202207e328abae6b6e6499aebfe584b57462fb761e31bff9b2066caab11fd5a162c9c0169522102f389894327247d383d00d961d97e86f39d8087deff418b4818ec34db0841b52e2103f3e7a54597801d145b8d1a01a39b118dec1d054297d968d86349a8bb481ce40d2103ad8032fda5cace560c6b5c4669e456d8ea2ad912d543004c137960975e76a3b653ae48a00a0001000000000101661585b782751ca73161f6c87abbf63d7215c403fb048c331e2e6800bf15aa9f0100000023220020e50e8148ae97693944bc13226de44ebaf5ddaec17400e5caa804537b294e7038ffffffff020e3503000000000017a9147aa4ee090166c5f503aa70193db77e02c992a8ee874242a0000000000017a914ef045c9e42909fa2554ffa155959fade322bcbcc8704004730440220275531eae47f279f4a7a9d5193799230a734bc504e84a74aac08e28b9183545d02205796b9a655400e8b7c9b81273c28770c26afe7cf624ad6142c72bac1ab83cf5401473044022064611604e006fe95a6c21b3ae2e6a9af80072b07e92af80160bc7d5c9f7cfdf40220349b2fdb2798bcd4b810c0134014cc94709fb6b71e8084048dcbfc89031658420169522102c828744a6792a68fc150cbcb168c73cd283933205882024f72579b614119b92b2103d52dc777d68ab75744c7cf10293e7d3dff5c19e6588bedc1e31b4446db52d9ee2103d0c5e075a320c0afc24e0dd2bde3b27e0099122b9dc77833753c32f253ec3cbc53ae49a00a00010000000001011f09158a302673ef5d4dece92073ece56bb3c9565eddb3061b76eb68eefbb4b602000000232200200fcdcce31ffd819a89f81eed7f8a1f72aa4fe4a9bf58109178db41b6d7fd1278ffffffff022b2701000000000017a914a8937d58552c16de27897ad855cf8e71884f9ee6874f55a1010000000017a914d570d6302c4c73391596924f760bd45c22874f988704004830450221008151ca81dff17c43ae70a4d772194018dfeb878eb9a326ce3fc2b9f24d6f19ec02202aea891e1e2d10c51c5aedac364fc93909b93219263b9028637b42122293b485014730440220715ae00914738a247d9a7fc5efee9c88e0054683ea77ccd1268503137b87385802207e44d9855cab8a4e70a7368823a59778a15afc9fdb648e58f899d7731493b04d01695221023724b293d55e80603d9fc69c08fa14f796cd3e06ed8d0ca2608297ce330300c62102c8993721b8a412dcecea4038028029ecc2389853cc8d1d6ef30e75a29ebc4c5c21039eb86d273db31807812383e28526bef64108a3453fc4c42e540c1f634bdd6cbc53ae47a00a0001000000000101c6b896d104f352b889bc4033774e8cb9def6e8062eb84b1236997c1e80c50e950100000023220020ff52812051ed396e66ddd5a37743b2a48b3e13725aad33fb999d436cafea0e95ffffffff021e8b00000000000017a9148bd9473f2571ba2b3f417dc661cd91845ed0b8bb873330d6060000000017a91408a07c0444925d5a0e6f6ddf61ce849170456f738704004830450221009d69b2cb37105c93cbb74cd01dc8d14cdc9f63f46945b7041a56204011e86aa302207357d131188b6b79818b88c0c9b2b9b9134a1c2e7e38b56838fa224f1ac677ee0147304402200d476f709233f5cd1c099647f4f00186e70c41f9e5176b31559f843ce852631702203b4ea118ce398228f541bfdfded36fc645f8ac898c4fdc2ebadbe0ec22b0876801695221020dc4efd37ee19628350cc7f99ca548c6b4af05b7de035d3ac0cf375c559672302103d579b569058ebdecc1175cffbc37a7bec24040b82e465df68fd7e7fd486c216121020a7fe69dee0220c9cbb3433e1c0f1cc525ec9badffc042715729f49d9bb5baae53ae48a00a00010000000001018d29fcbfd573958e62cc5251091b5edbb8670b4b535648ea943f21d4541e1a970100000023220020e64642e92f93a3197130150b29d3a4ff12b7eb6a973fb755a87c324cd97a9766ffffffff02025523000000000017a9145b5f8fc351ff5aa7baaff0f04c006ef0fba16b768733f349000000000017a914d74e2bfe40311515a84de5a48f0b5793b5ed2a1d870400483045022100b5b56fe582163382e135aec908d021876fa235e0cde1ec99ed166d4d0a791de102202c78f76b35e8745a121af63a6c23bd5a61176d9d07bad4f67d42637074579bca01473044022025d761e7a12363c7b9cfcedc3bfebfd86500013de65747b7a4d596c10a40dfdf022054d8214050de55ee4c7f2cbc6178ca03dbce5f6ec4be7816ae13315eb3dddc630169522102ff8e3d60810aae40b0376169d21d4f9be79c4750ca01fc46b391b7489d57ae7421025281f55620cf2ef306f443008bdde82ab0836553d5407283ac491ea67845d61f21027c4e3fa72b97ebea879c383d804ec3e654a3e8def6b6495bf933ff5b27d4c4b553ae48a00a0001000000000101c725de0081a0782b072b48bf2e6d51b7d789486ea25e592a7f0c2b729459868201000000232200201cdfef3c6bbf611293e0d3cf02d2d324b05c85731ba7d3f1b9f82d50dfb0345effffffff0281bf01000000000017a9141bf72a88b1f2eb6bd0c7a34982c53e6c2cd4be6f872b4224040000000017a914af4bd1f8e568cb7e5a4fa99656f61b27035f4809870400483045022100f30010626fb7b9bce5d08e620b694faa30af64d1572acc9076cd45101bf2d1fe0220664f39826a8952c00e06a671af047cf9d35d2e1fa63dc880c7936f2089b0e640014730440220474294373311d1c0ce67469dd63413fdf503c64af541bdc5e3a14d0c83339a8602200a566e65c287ca089344c9d4242dd1381ceee3e89b29e581b0da72e653e6a25301695221031bcf012177d5bde84deca2f1a87bb386f8485e90107f3923254617c689c116382102b90d739c414bbe0ad59b5240704f6bc869a444abea5d7ac8ae5a86da3a7fe7782103ad7cce02889af9ab806d0da7a90d65a175ebffc87b4ae5b99dd9a9be9b923ca153ae48a00a0001000000000101630b0a960cdc9dd5f3739ed75099ba15b4ec9d67f9fc12c996ee2697d2a2a00b010000002322002043d32e8d2f53bb989079f959e2d24bc080d75c4c7a6ee166e36e2f58c0ed9b90ffffffff022cd900000000000017a914664d06227a0c322532978014e43d7dc84d402d9287834ada040000000017a91479384d94ed81783967150619caa035329b75a5518704004830450221009562979cc62babaff5484db3b5e19603f50d38165859513904ac08b042d28357022036feaf01471e7bda62e005bec4d7c6166ad9299c60328167296b05ec07b657bc0147304402202187b49a479a95de21ec87df80534dbe40e40f8742cdecd722444bf7ab1974e0022022bbfe981e4e659f13856b6d080e284eb6c05a42121d42d612f60653225c83e70169522103ce59145ab0125532c1313be7bfa7536d97038eedbef21b9ffebb4cda3779a3722103d5fd45cf8c33ffe36edee6f7d67066cab1223317097e7743db3dbe6feb77fc382102716c1e3b8d5394d7b2c0e131972329050d9f07f0e22421855f6b73fd4da96cf653ae47a00a000100000000010179f0db861292bb72fafa4ee02c06562e826d150f9d114746d99bdf23d7267a690100000023220020f13a31d7f07e7867387bf8c891c56a5bb9907af3842d174e65ca851028523f9affffffff02617200000000000017a914fd37aa59544a59a1ac5e530996bbbf0fbd3db06487c3b549050000000017a91446842724f36f1044a4f1ab7c7d3d26395a7f9ae2870400483045022100b3c2216ba77f4c9d7a60aca0078b463c35bf460991f220024a481f93a9fae347022040a09dcaecf724218afb452bc96b1753ee4e136e62abc13ae066b9d32515111d0147304402204513e0dc7ce80b2e4feaad78f49c6d95b99fdc073aed6f674d89202a94a9a8df022041bd30e2fd7448bf3694bdbe4f8786c75bb7c1d955aec75cb5a62877dfe1730d0169522102778a72b55afad5d3ea24ea103ee9208220634dcc3222b73f5c1bf07501db3eab2103133eabcd9970a49a410c2dceb0d1a16a6567f6663607356bb497baa7016fbe522103d5428e9495dd7688391e7d4e30f6754da30bfc1b0cfc5f0b03bc111b1759c92c53ae47a00a00010000000001012da44e0d36295e5d4f4f494b870a317f07324377156bc5cfa858ab3fabe412350000000023220020056a01d0832d67f8fdcc5b9baacc4f3793e88b0c6f77a6941454dd964b349704ffffffff022d4e01000000000017a9146c259170435642a234f4697c0ed8d5da5515db63879b3110000000000017a914e03c09b34e9b4b33cf1ea9a2e52a60f568c80f1387040047304402200448ee8b1ba8fdcdbdfd89dde09d2bf7c0e6c351b6c48b94ba9dea29ae9521d302202d521787ae26c195efcc1747a7a2ed7635bd720c92959e6a934a4671afd606210147304402203b31ffb3be4d7447b99b069a3ec9c149e73bb07e6cdca6546615d376fd37b624022011130ca2b0abda6de52c0cdabad1031152367f4ed2f7c765a77ebf13820e6d0001695221023191f456c1f4c6ad338ce5df91a86293bcefbad4e7ae372c2ade6a1b51abd1052102a294a91671e84efdbc442573f679860b7b3020b6c5f373cfb86eb4fde3f81aef21036e2dc48dd7d279666252de0bf4cd03575fcd5eb365498e92994053272d55bfac53ae47a00a0001000000000101104c23c5ae31b142f83112289942331d5893f84cc7c4bd671489c036fa1158380100000023220020275a575c286b9992c9cb315f16fa822e204762b5bc6b5c182a0755f59591109bffffffff02e8970f000000000017a914a6718382dc5ef12d8958147fb6bf6f20ef85ef3887852d05050000000017a91497b66d473d76be9d1732ea025e7c899d8e5be71e870400473044022045534282eac06a2a1e56d9527b92f34960f3310229ccf1a84ab11e2821afd05d022047fdea6ed091d0ff116f4a3aff3a83bd2ff4aac1d72c8af22d27ba8375cffe5f01473044022054f7f9ca50ae0ec9c5e16b4a48955048e123892bc1768a6b2789271b63bbb181022013843d214d92a484f84d9a351412d934f54836c727bd683bf01d53d3fd06c1d1016952210398da7a972b8c324fed886ee5c0079e892fdf98cae0cccb6f59cba44352dd192d2102407f4970ac30f2c58d955655985bc77b1016abb616ac8f2250f84ccc796041932102a24a5a69065ce1ab032d487ae00ef7f0763c450148e9eb80acc19d9634cd79e453ae48a00a0001000000000101b9316fcfff3e61726f1d73b18685c2de27832e4a1bd9571dd3b1a91439d0bd450100000023220020a54f38a81a7a9fb773e350845b7f51dbd9bb8777bdf0b6d9c961e1f6e79efedbffffffff02e1e000000000000017a914ad8ed3b8c372cccdca73b1f4d4feed71f1b9404b87bc8af2000000000017a91424c63fa3265252c72e983535dd1e2b9fa53798a887040047304402200da16b03344e2a045b469a6ef19361a5e0e7283a4199d47dddacaa436c5b5e6302207921849a4a486e87032f9a40d97acf202b891ba7fe87c8fed6d611d26d8b33e101473044022015f5fa2aaa4c1ebe6efbf21a17956db6c4ca6b96d84c5dfff57276619d801e2402203e257e676309659ab4466ee5f66592af3745c18f6397cf107de5f8f473706e840169522103d65675ad139c6a407e2db52eb7058b49aee9cd08877cc22f1a77e25dcc61e0d3210258679ea976f9beccde7676d7dfa3647a46864f1c287aec8bb96ddd857c20b6d021026d2a92f0f64ea5a11c2251576bd0a5345151c0eb51035ffc0d5d618e61492aa653ae47a00a0001000000000101b0f843d6bfbf681c824a83cd86f750bd2f0c555e1a34530c97ca6cb84c44ba7d02000000232200208ab73608648bc5c83de0e1d84c1d5548f5972e1eb0974e41606381a9c6a76fadffffffff0209c001000000000017a914c29e9d7dc080ca083640d02ef8e84b99e8ec29b887cee264000000000017a9144b50dafe8aeb3b010c1df148729205e1b6e7b441870400473044022064120e55fd8145d01f312910dac3736593e79834aaf6dfc996ff337043bf017702207637e65cbbe33c8a9c56a1b7b2ecb8b5fca077eb2320f139a64f0402b339e7e80147304402206993463667146d16cea751bc5b5c6b3131401da4798bdbca629297783ce4334d0220671de176dc11fc6cb0b338c22e017a1eb9431657cfde34ef7ed30cc588ee29f10169522103884704a5a46c67a8c0474b00af72d9249908e2d94bfdc36edb763d8578ff998d21036e74f622320833f1c9f019672642c964f4c04f339f9f576018862c89d99d4b4821020558d11db1a618cf77ea3386e7ec4853fc46dbbb06bdabc1e3639560fdea05ea53ae48a00a0001000000000101069dd6960f92226d1870a1240331c1b9e43438cb9886bcfb91ee06620f6305960400000023220020a95a340b95bc86d3937ffa710e9253956647c2afa22c457a00ffb534e8a1bf1fffffffff022d3102000000000017a914664d06227a0c322532978014e43d7dc84d402d9287f16844000000000017a9146e43e4b9511fc7dd2dd2805cb649db1d3df8a770870400483045022100d07f0a07b5dbdef3324ed23f3a64e2251969d3b7b9ca324cae6d9fd18851983502204e3393e05ef939afe61df15a5d95e6e21e539c7809187d8c1210a0ef6888cf6d014730440220656978ac45c48d1d31191bb8c77d5e0a07cf59dada95c0ce8fd58caa68bdf4a9022069eb26e7d7ce26011f995921f1367773bf64480980c2efc19a5eae433447585001695221027b18d9478561cd63ebf57f4e1a1299259b910d9fa0a130bde586848cc035084d2102cabdbb9d0c07a9f3b88eaaab0f93a4c33c932598b8fd2533851773ff7146245b21038be5d12c0cc6ffe58aa1ed59a5038fcb3c5708e86e9ed58f55b0f3d4e1cf0d4053ae47a00a00010000000001012288c3947dcac9c12677fcc56647040b281b2484aa222c0b4c5c4dbefd748105010000002322002076a7651eb645c3c92b3c8c1cd102a78594749ba86793bd5ff8ead751182165fbffffffff02faa150000000000017a9149e9307ecaf78bc4cafc4cc51753384921444d54687661405010000000017a914b5fa72cf1b14f9dc1349ce688ad00b4c82004f3187040047304402202761b4d2d72c00f7b395b7c0c376891217543ec28159d1cac60aa725fc3dcab702203a44e8d6fd02172f75516a94103e4b6c35ed05b3c97059770bf692340b5028a701473044022060b623168232dd2fd98f9ea469ebcbc1ae6ffa0db407579c1760be98df1de6d402206d5a39c46ec087598b0e4c031e1f325aaa842df26cfbc954aa2ccc686d7b021201695221032b4e59bb04903ac6ec44e309bae9fecab080cc189b529df5308b4360834899092102517719f1d1a35b271b5f097f62ffec377682ffcfd16efbbace78d07fadb4824121023bc0ec8acdaa7d5a9b56762426f6d4d58e4b912cb29c032d6c2573750fa31b3253ae49a00a0001000000000101f93c3aca8bc4d767fe7a8410f91121e01aca05cfe5728e29faa15ddef5ea25c70100000023220020723ca694275208ee0b1f598ea2016bea8de7d41a7ddf340dc35941f735271dc6ffffffff02501608000000000017a9146f76944d40406ed551c994957013dfddae7edd508714dae3000000000017a914b2650cc9933c1575f225ea2a2b80784e5e85be10870400473044022045dffd0e7e40c942a07fa6ee8fe7e92f2f99da96ba82c5eb2607a779f8ed300d02204a17612bf90590ded02813ff2af510d0c99fde8db1f00ad7fe5378aacfacf8ec0147304402201c384f7ef5019292bcb4c55706d5d45d652f5341d61ad9988b7e88c3553ed4140220147f0c93266ed7f8092ccefcc7d840a9e05f2c95ae50eb2e7aba4de82f1c67b6016952210382c730dd08c2971d3c46c28a73367b63c5d9e7c69fb4d2a7bb5359e272ed286c2103d8df66f73991b25819ef055e5c020ad438b9294ee78927d008f0d81405a22657210372ff96cf3eb23217d0fe50b9c537b5f12fb86b6bc4beddbcf3d6ef4f72c6612953ae47a00a0001000000000101b567d9e85f5a8c11271dd416a9b1d7923140af39ca081c24e00ac5f99a89a8ca010000002322002022132cb3d5f1a3a9b4cbdc0e468f3551957dca301722614faa7f290ed5757f4affffffff02f2a903000000000017a9146bfe3968f7f83c44246959d1c86791283d6ef75b870745c3000000000017a914831daffd33aaa63f764294eff0a7dfd8ec6b90e9870400473044022049660e9437057d40cec2d04c8d96d15da19c2eb65398cc4160a4eee814c06e3b0220723c7c6173f53ef0ab7878ed9322374257a2ca8cc138a8dc19d7c34023519fa201473044022060ac8719d8cae6a463878bcb63e6ef31a21f4ed92dfb7092f0579f07b2977f9702205f95c38a0ef39da80a673d73b94b4a02ae756355c6fd6387127d1a418fffc13b0169522102206c45655bd2631574b1f1ba27a69e50c04880979dc272a353e9850cf8e935412102a9d12d8db3b6e293967e47ff89a4f59f8c29da7e33b3cd28963ee1bbb8215d9e210278c43343efd5bdcdc09ec4e69b4c5655790498955c2ee8ffd3dfd45d6800659753ae48a00a0001000000000101bd374755adcc599ae06484aa704efb3e5bc7c540b7fec2c0b23702280d45e023010000002322002014852e39b778909c0a5eb3464ec09ad619a9daf68fb75abd705f4f119eced84cffffffff0240f129000000000017a914dfcb52c619e2044da4264a39415778ebeb8dcaa9872a471f010000000017a9148691ba1750168572bdba86d6baaded0fffbe950a870400483045022100e6a8257231f35a106f742f4c2a424c4aed6cf1e3f0ce0964bf08cb7fc5bc9b2002203d453c58d2f80320b872b08f1b3870c8cbc2916c638a0e5564bed7ed3e70c11f0147304402207aab0cdf4432a20b57fed78106525d4b378a29ada9a57e77594f396d0891622e02201ceacddfa8d80ba7ede0546c33b298d1fc774f9a819d3a9c5c85e9cd283df70701695221028df5b0f204d7e99b14f56d7a51aa516a6f0ee77a1e254d8099bcd782f06c53582102b573e17fffd05dc4f2f43a099b22c0365cef701374511ea27f07d1d1b97051e821026cd0d03028065ff2e6d2738c8b8516b1d0183da832f36e8bbd772a4218e09fd353ae48a00a0001000000000101d86b682b9714aa74f3fe024f13261bf1be6e1e1b06d9e376049adfa9bf87b4520100000023220020d66636bcd75c41dbe3debc71e97004be1a4cb74c457b70078ece13819b700aefffffffff02c3b1b9000000000017a9145a1ae01003f069cadd70cc22e82cfa6183ef664887fbb3f0000000000017a9141233a9d76fff40484b4a64b5b8aa1b894d703fc8870400473044022038128c99065c9e6f76356fb63847385564d4f5a9e070b6e8550e835b49d9765e022048b141ff2c09dc9af26d24c0cd0a98c47882aa7bc565a3c95fade956ac94e2f701473044022024699160ae5b69140c442966e67a4c3e28886d623be513e3d56345604b419a7b02206c53f90a454e16cfddc9c957b869f75a66cf5807165e6b771e803684b3006daa0169522102d28ce0313563c1649055d5af3f231ff5631e104aec04e5314341b4b82d9bce8f21032fd3cf315b06b38883e7525982f8b1da859d49780b0b8f5f4bb668df867a0b79210354e8e0dc870b0a71a85701956bb72eb6e6ad98983795fb8f4d98f595f906232e53ae47a00a000100000000010132837ba18d6ea403394a2f7fdf40f33823ef0d9bd45c4b5b52e4997d37d1778b01000000232200205cd4a2c4ccf92c76f684698a3b5f0b864e8b197213519c6ab0c2659ba8ec69edffffffff02a9e908000000000017a914bb5c2a4a8c5ba67fc3a989092580ccd7d979b00987a6e657000000000017a9146279a9370c7bae0aaaa1f09a047d60f7a4f51f60870400483045022100db7859f587269e1bc1f39c6c7dfcb12cfb06852ffab7b105c21f35594b251aed0220754612e6f015460c4cc4fb06875ed5afe19a099787a73b80365cd40700dd65910147304402203048b1915b500fd867ea2b46a57b52aaf9691207b2db4f0647ec04e55f9faac202203aa1510b0e1b696e3bd596c49503420b3f40b170eb93f857132b8aaa92c5a9cf01695221027195c8f742856edf748b30bc9ea59425d52b1d8715c21630801287bf0b433d252103ad6a292112207d44b935f5618c7fc6aae5a30047f4ce13d488b576748f3a883221034f6f8b258ac867c7f861cad3c9a9e144bb4a5cf65c7c5a0001154b0dfb31081553ae48a00a0001000000000101aff8f0185e2c7c52876bb0b905651f9a7cf308e6e49e34225d5b75117943cf8901000000232200201ecc459bdcb04038fe762c6093ef9f8c80271a65584c7a6fe397790a8aa5bb69ffffffff02b35501000000000017a914a3cdc31bdaf5cdeb6021b3472cdc55ccc073eda987ff782e000000000017a9147caa8d58de7af10281f821464a1105e60f60065f870400483045022100845f5dbb9dad1fe4aab2d58c2aea241eee8337ff4e0f120b535626148ddc12d502202a8cc41101412530216be610890e5ec028ecc3e44b359581ccf60dce814f2eca01473044022060fdb2199875c1737fd6f66eb7cfe1a1e350da6f3071212de24d613c4a0e51dd0220266423d4efb553500b7c06586c703c8a62ce17d26bbb44635bc49c7890ea972c0169522103dbdccf57357879368932f8b3db85775e1a0fd9f226c200edd10b83146e91f63721032fc32515f92346df17b77f3682bad129542ae36318e06d0fa29628fd0b52d7e02103a835f05411ec1ba6605a6c23ee1af60c4198bd80fd58c842ac53a172e48b943e53ae48a00a0001000000000101038a56f8a1e48540528e95f897aa8c6b895c64f5c353a3ea2ed0100a53cb56dd010000002322002046209037745ebffb8de704ee062c262ed678fcc6812a9f9432a12df8a92ab20bffffffff02cb4004000000000017a914ec4dba6b4590e56bbffd14413d3fd8fc263328bc87992658000000000017a914bc5ebd9c97ba5601f71af7ec06f92477f87cd85c87040047304402207171551ff0e10143e22d6ab0e073a5b2941e9727bf0f93c11e2ea7e537f302a302200cc647c1e1d9a8f6ec5b74e4514b1b350fe8f83aaae7d69d5eafd03e5821852c01473044022068f4bc1921fa901c81e529d400b2bf60675f5d96d8cf3e2dd877490ee40bfc0302203683efa32b1cb249fc49d9c121af24e775bea2778ab9934e3fcaa503bdd143b401695221029d9e03077556febf9f3302cd2a6c1445d49da09025a73f4e069515082c2ef45a21039ff08230e2b0aa7763903e1c688c3a1b752a17861e9289bbf1cc76b03521d52b210359a34e0ed24b8e59658b1fb4ced1d2776aad67134c6bec9ca2e8a6b7c9070d4153ae49a00a0001000000000101d6bd17fbe0ad052e24e5b23f2683e00e6a03cfd630566f58cc3d88fef15a01c90100000023220020da92265aec0829999176d46b9a1f839cf7a3e12c0334f1f712b15d9dd97081afffffffff02780709000000000017a91437d845af391476247701c6857b4d6e7522fa9ecd87e18d15000000000017a914cd10aba89035db6422ec55e6c3194332db4a05af8704004730440220680de9d03135e468fbc78a2255c86e2175da3a3e0b628f03c7efafff8c2b6d18022024d1affe8b6adc7143d6b3111b1d49725f7a2f588d70e6c6984b4c4b2a3bdf7b01473044022078f1101d8451ce9ebcf96e193735cd227b9f36915e5c920f7c2e6855535575dd022041b7c52d636bb4178349097cb68a68985c3a2ccedf98df6e2142fe94082584ba0169522103e9d302eb09218cf2dc8ac02f88a51038e73f3ad83877776e61c30ae76907ecfe21026adb55d416a4d1d3191ddaa3489a95bde68ef5adb9e9541a2c0dbf56949dffca2102b29d8fb0181f9c17efcb3514150905285cfb79a9ab34e2fd6b3d396f6f11a25453ae47a00a000100000000010191e3a5438429a9ed34d7a65402658ad8348132d06ff6a500732b4b0cf00c49900100000023220020f1e945eb2a20708d31de2d4060236a1170562c1bcc02d953a6bcf0c0e5abd64bffffffff021a6b02000000000017a9143fee4f42c2f00fd1e89963fe09699a04b0343c208746e95d000000000017a9147855e1c6c714261cb28d16edb3aade307494b2dc8704004830450221009c3e9ae5d025c162d86e813fe6207bec9fc898a31450229cf01f4d2017c7bbb7022048f5d61a0c576e52c14a7039f3752d31b113702b544227101f1870ed5dd30cbc0147304402200753ae1dbb89a11ccf8ab75bdff05e797289f8f74ffbf79a5b60752e6374786b022070dcb253ad66b348add6a0db98cf8c6e591ff35c5b1ce7a625855f8d6795ae27016952210264225b71a48370e217b50ff1feb02252ec5dfccdad4ab1bb5b02a30b8e3b996a2102c568e1cb8c3d0d68a4d4d6f3c9c881c460e0cabb65bbe875cf7aceda9a9698c321034bf3896d34160dc65ebf6159e3657bb4523f2235e7463164125de4ab2a28c2b453ae49a00a0001000000000101b304a8f9b50b2d7ca68048b9c20e32431680f6b8dd72479b2e16e0f50df02e840100000023220020f13fb96048391294d961ee6122333073f986eb9d4d7a443d20b4129843196802ffffffff02e22300000000000017a914e37f45597cff5b9b5d4558a008431f699da53888874c842d000000000017a914f5c9334067ee03c1701a0eb2aab2c5abe969a4f087040047304402200468394182816e4504761459b9b0d034620c00125310e6f92307064f6dfc36a602202cb2836318268d17bd9ec55de975ed6710366d991ebebcabb8dc9478a9818c2701473044022074d250e2d94e2d1b5bfe0dcaf69ae25e45b4307e6df1c6d0d87c98884bb7486d02204134eaa8127bd12bdedd58d1c6fc0b03a0eaf8c0872ab78538f53a951aa00709016952210387d7a2ec5b53dd7130d2bf4d84b614fe8820605e5d22e9bf9f6988bc3aec6bd7210231e051851533353c1fac3fdba43c2325b870d929f316a4cf5ec4e0d665d6107c2103c8b75caf9d5e45e0f6992d9367726f5ebff5a4b7b9c5bc1958de5a3ed9d852e753ae47a00a00010000000001015be06b7cda36fbf168f7bb7bffefb4fb93207d5f3bc2747bf02d0db95265e0400100000023220020d03613e703798754ac19404100a0892e6bc42d5fe66605c6f8f9c14b19d18066ffffffff02bdb901000000000017a914de05984a144be4a19df0fd5abe0a0b5f78c315c087f01d1c000000000017a914e631867281c338c8977960a07bc0cf0eff6b7f6487040047304402204cf0cebad49d53b6b58aafe6a825fb42162d2d66c395e9c784aaac49bc35eca102205f13567a2327b58db73cdbaa7878a4da067a449eac4ffb6eca042898e533b2c40147304402204ba942982a7b6af6707ef1ea394072fafc718fd317bb900a9647b1f85ead051e02200e4d13b39de7565a022b59f53e359637591dd255e8b1820e6c162b778427b8d80169522103485701f72f8b0707e97939cca011a610d04e60d2424eeaf8e6cf2e8296a244872102a646bb7136c5f2ae0cbad9b345c1f4f6ecf1bd93d3ace32298fbbc46d8b09de421023a29a21c062c5ac47a995f71f94e56a037e66b98c0869cebce427808ef27451a53ae48a00a00010000000001017171ff65cdb05aed7dd3ecfff00a25ae41ca06d4c8aac7606c2f41bdb5272772010000002322002037beb0a6dd4809977e52cb99c605d1f899c87e41c2a5be9e9198955e9063fb79ffffffff02a18703000000000017a914d7a741411a2545fb6909012b8bfa06a92e71e846879a5d78000000000017a91446d8c5a1676bf084e9a1f983d695c1df5624900987040047304402207bf171eac5000bd4aff77c24ca32916d9db362c2b84668bd63e853a1215e355902201229f6a9c297588b403351b4a4c5b57d2d265b3d8854530b013b967bbc1474860147304402204c1a3227ae41b312fd1767b309450521b3293f89c50df41c0f5ec3ee49ef878e02200b86e40d298767c9f3b73ef8f7aca385afa304f52e1a3ad143c70cc6050fc91b0169522103342767a7d772e65da2b8a9623d9fff1631e279e9df625b9ed43821db8f53ecb52102bcbc3badf6723e8119c4d378c3f053cbecad793189b44d0c0a79594d409cfb6621031f407e5c8a5599bf21149d579a5a1ea285c6e6c4af6da79c173b273e7de826f153ae48a00a00010000000001016880b065eff5be03bb8c526c70e3cf5a2580354a834fd34be9bfa1b07584f5cc0100000023220020373d299e3f73b2d9fd8741f4d7487c15aab9ae2511c5f06327057ccad0fac4bbffffffff02c0e207000000000017a914c3797e048b64e5b2d897aa8d1288184595f932d387d1c65a000000000017a9142c371935766d50979f388dcb1aed3e448d1ceccb870400473044022071c6340112db1eb59346cfd32f9d839a9cb4cd3923331068ab34bb741061271d02207f51bab6db92df44bb9a7302666552cd812e187ba3a1342449b410b87b77b90101473044022032c65578d1e958ce6e8553dbfb5318de4e52f7edc789340ddc1f5e226a9b4afb02205dc51afe9ac656e9f676c1ab34303ef4c3cae474d474c3657c4f8d6ac19ccf090169522103c43c4a6bcbed6fbbd990b8ecc3779ae56494be2be327e9cb37964c65f0febf5b2103cefe0be0cd9cf834b6e3ecfbb34be4ef5a6dcdd00ce678e7c320287966ef44412103e90902111d16ca05cdc63f5014e45cc175b33cdd53ec3e68dba7959f5df0cd0f53ae48a00a0001000000000101bb5944f224a85605ff86f6e2a2410fbb2d98a4e67d1e285cc02fb42b5415e32f0000000023220020a9897a21600fa5f992435fbfa4548c2b405b0711c3f628bf2482ec9e076d5a32ffffffff02d32c03000000000017a9148ded6f0cd3fc1e76116b87dbf09b587f74ac0305878ed3a0030000000017a914d02fc8014dd397eaa19e5dc22c12cf39c1f0a94c8704004830450221009b81869ad15773fdc433164386f7af8d1a441d719edfd12f66f975cea9eb15e702204bea8948ae31eb0f1844af3c483b88db1bce608f659ac5f130fa589b714e4ad901473044022043abe53610582337d709826646e8fe9b3ea6fb737cc957e7a72792d16cceffc602203220ec4b03b8352611e18d5e78788116e81fee58ccfebe7c2eb7899ab5b12615016952210253fd38b414a484c247ede14ad97ad8b286f72d658db05fbb7c02d98d6f795226210337e80c52c555c152a3729e724e888b20af13b49eecf9b4e67ada23d49fdf0674210379951f4138b6a576042f8cb0d9b52a3a9fb46e1690963f039c729d1b05e9ae6653ae48a00a000100000000010134f481929d167c7afdcac6bfd95f15e5002e6448822d7bac21f7277b083101d60100000023220020f149a21ce175a9e2d0595c669f3b86a22024f10c6c2f064bf1a8eb50da61c348ffffffff02e00401000000000017a9149c0f540f10bbac79668c35efeb605982eda543ec87abb8de000000000017a914911c97d9112e278f07afa6a4f4bbb7702ee32e7a87040047304402201e11b72022bfd27d956cc629db7ca71bdafac2bbeb2cf3ac0c915643c8f143520220666b529335ff38c44afc80ee71c496dab86a707b5d1f5e59347c3bd77e35491f01473044022056653db070fac0b201419991c1372669f02ccb6548e22904d9a09b9379813562022074a1ee9cda89bdc4ffb8aac0be1bf556e3fed0b0cbde7636348532e59eb2a2050169522102a4ae97aafbecd2e182ec322ccbe7a7fd7c860a1dd8965239082f9abcd285418c2103cbfce6e88c5a1cebfaceafe8782a697d81a9fb5438458f3dc06b5b94042cc4802103a4c6ea4262a60ebdc038e66456b545172e02a8564bd89256eb1467dd1b7a434053ae49a00a0001000000000101aa12669a162f35253cdde9d4b3b77b7cede3b65dcf31d4414790650fd9b5422201000000232200208aec6a281a44a5606e24e0955d322f7d56b4addfcc6e1b960a9cf575ca9f1baeffffffff0204290e000000000017a914d7a741411a2545fb6909012b8bfa06a92e71e8468772bd0d010000000017a91480b37d490712d8751463812745316c10a3a6ad8b870400483045022100c0391ab907a0925c04a26a5825af727f1dded934f4ebe1cef0992d6bffab645202202d724341acc3ccee05c06c04168e48936dc141d3b2012607a8807089223a8c770147304402201accf97427eeb7a76dba724892fe199bac7ed3a8e61fbbb90f238a0f3cabffc302203fc06746b77be704e9a9a978d24e25ac956066b87d7d5461b22c52537716e5800169522103c07dd4cbac56d8cc5dfcc526ca89c18a9e8bd39e2c72a196ee97b5916065ead321037a221ed49a3bd1a76f67c66b9dbb00a4cfc5f61ccde8d5a206ce9cd48dcc44192102cf6114f6bfe543a59afc2e04fb0b923753527260f2a6726b5823af3168bc113153ae48a00a00010000000001019aa2f664e1b8e3bf592444bd5d14170e0537bf5341a2e8fc944d1a6c0fcadbae01000000232200209efe7a4e777bd06dc44f824b8c283368c04365dd8bc4a7f3c82f71943903b1d8ffffffff02d51600000000000017a91435aa2a405c54d2ae783aa51cedc85e1ebbfd8fd887468bca020000000017a91426328ab0e462aa591a5b599061689ffe17502260870400483045022100cb4285b356992d7844474cee98afcccf56be16ad65bef743e5a1890016931d44022062da81a9f4e649455e472e8794cf476bc6024da4907cb468ec9763a6d52595600147304402200dd7ff31eb8f252586510045a62d7efa3a2438e5a9d33a71691f82ce2cd616c402203970a077a889509045bccc607128fc4d43276b7381e02f8cda2a2e85872a8c6101695221038047c9c15fb65ff80133d0546e33212f7e9507dca34b2abe2aca1697bc1b819e2103ff001ae3f049f13ea217dc91a05ed0a638c520bac59e5e3145bdd562fcc7c4c12102fb2ae604bf11cc816b751cc012f45ac7c51b05dfb33726c8978d92accb41022153ae48a00a0001000000000101e0800f33353916d2f2de5ffed34890c9bd5004c18e7a88fa603e33f4d0817895010000002322002044332b46ee6a901c75415f8a8e2d81d542a1219dfa34cc4f655b24a522063edeffffffff024ec003000000000017a914e8599bf9c28c670d8eef3a757b8fa92b6cbd440087e2001b000000000017a91471571c714e5ef36059fe7957d6ab8e4506a30c4e870400473044022006f7038d3c5c9ec114b156cfd08b9aed76bced645e3c73342b29a2ff434f937e02201dee7f23f35fee2254d7dc5ea31e247db73bf57140889a7cff3eecdaddaa23df0147304402207845bcb763ad8bb84c8a2686a892fd83bb906cc635c5f056b662a3262812886b02203c19b216df956129662245916417d1004cf36ef2cd7525a4cfcc23a5d2f7c59f0169522103a04b00259a231aed14d2fbccbed18432002fa92d407afd93741c4e69736307742102cec19393a8c9c2f8b903358873f7bf9e54706bbc3edb42d38364c21685b65014210376bda9d00334c51c60735dce57537ee5c336752eba800d38f66f5b4b20a1611153ae48a00a00010000000001014c9852fea27617ec2132eb7794fe4d3154df1edbc67cfe10617565eaec4c8ec10100000023220020cb062b372d64330d5d398e533c7fab3bad9db40ac98e2e75c399ffe3fa2007b4ffffffff0298801e000000000017a914d46b2bf65e04ca10d06c5087573c89c5ee5cae048709c4fa020000000017a914603c650f6b6de5c8ee409e9bc6b99c8e114e27e087040047304402206b445b278f15c1231d0206ffbd13b64b50304630c1b7e61ee9b414cd2ce48b870220536db42f0db460572f1cfd579b6e57a52e0bc980f322c7813d7fee56aaf9fdf60147304402202209e3d08f9e31c4c7fff9f2b083ae35f963992763c2a5528a3406c4eec0f21202207257e3279de7832cabedd0bd04b22addea469773fbcd69061d7e279e6e8b150e0169522103362ef1f73fa155f5b74cb96c57d2274be5d810b88f27220952aa59549c3a06592103871924be92db46f2987b14bd29b9de47449e1de8468db43d33df8b880fe96d642102760a4938e4aa859f82dc64a2c4a7130cd08318a3e412b64f22c4f84805101d4d53ae47a00a00010000000001014d5eee5a2a575cece600645787533d646f5e1326ecb278799b7937bd8c5ec8dd0100000023220020b18762ead1d3df73038424612a71bee73c194144fc9859a994f925fa865db796ffffffff02f9c504000000000017a914ac583457b6ba313d38913a442e170247d954b8688728ea68030000000017a914e3823ecc4791eab3c8b66c0690c1d0caa515c2e887040048304502210080899931775a37bf74ebc95358f28671329d6b9c9974db2792bbfb12bcdab27602204d348f43efda5cf1494ea841793d7b78b8331f9363140d2fb2a26735dd929e930147304402207754857ac2bd5efb989760c56b383092f138d2da7ee282ca90170e1ebeacc38e022026b4489197d65caf16e2aa646e0276d741e7ffa36d8feb772d9c44e2a113360d0169522102648aa3f9e6cf838f9374d329cee620a786bd88cfd2f124bae9f106547bc496652103bade2d54f8dab218820d53334e0457bc266035401ad69cf808554070face4d3421037b3c19bb707d7c08ab85321ed9bf31726ad81c79dd26dc097f5d6fbc1d23da0353ae47a00a00010000000001018292a45f7d706c9cfc5d2d2b37e285ee4e653ccd7497137eab86e34e705224b00100000023220020f882811bd76cb06902729c453434abcd16cb8193c01c36ee152be91e22b490a4ffffffff02cc6ca8000000000017a9147eb985da26792d7eba20018d08c927cf0746b7b787d5ad41060000000017a914a5cbeff69890f67ca8b47d0a3ec823dbdb57f65e8704004730440220699c8498f1a2f22dce4bc53af891dc76939c144639408f686e64d6a6cbc66b36022004f62c6e067f94e977e4fa0ab73a428e2ab44ac1b141f8fb21b10b92b50e2b2901473044022078a2efc35c5e55161ce8d56cd38192094410be09f3ad3632acf654890b7212a3022033de126e2bcce45b377982657851cfbee2700c6ad5f1e1b8b97ab561ad0c172801695221027678d684cec42d5892fe4956c78512742437d1b454f4203bf7136229851c2e952103d2745282a5dce9c8638f9d79b37be218745850c3e8f5ea2044acf21743be21e921021a284824f44eccdad937073f4e40ee5a9cdcff5907b8ee91768a893c9de8385653ae47a00a0001000000000101ee4b36ba125d72a2fe2a7778d962e3a0a16f52c881783ef9ef08ce35b7a4f4d60100000023220020906215bcfde477914b77664fac5930b30e5bf3760a67ce3880954441c49231d0ffffffff02cc800b000000000017a914ded58b4f9e4688fcf44171323f7dd88e40048d8f878d2c06010000000017a9145e81da2c6f0286281a881ed55d315ecf307fbdfd870400473044022016e8cd5e813ed13f5c8b6c571ec259d5466c460d8217029d9c9d771e34034c7b02207495204fb796a914b6a5d7e8768a633424a43751b008fd857bcad5180ad138a901473044022010e7e0ca24afedb85bb509dbf4df1af112a48d7d22f1d12737b51d66e4c20888022016ef5d89bc7c572140178504a7041ede35a1884fca4ab838332d06bbcf13fa7a01695221021474cde5b74087d963f25458ee865ad7cd54ac81b4cbe89cd4465c8ebedc403e21038a779101527b5f50436d5cc5378532d066339a85b698707a4cfc517d9759094d210272cd32deab718c72d7cf5f518ec01833e1fc7506ab1d9a29f93294dbbb826ebf53ae47a00a0001000000000101f553d5ca9332ab6bad19b3801df7df9aeeb691000779f242e113354f18fad7c001000000232200201591041085bfe0e2e95c65d3f47b3468f90a6fc6b31748fae2e07976978f0ef6ffffffff02a68203000000000017a914e37f45597cff5b9b5d4558a008431f699da53888874d3ca0000000000017a91494feaa971f0df668f7627091823da2f7e0c9743187040047304402200942513acce03a5228fc5eee0462fa4e7dbb2f97fbbe19aca581947e9340e3da02202f176309cd86d8ef2bf5c5f0b08f9d3f838a2b4ba452a8c362986bf602c7241e01473044022070d368962f64ada6ec56f06a52c4b9d6d0139bf2f5f92b13e37490763adce515022006b9d7cbf9acab6013c2c1c251934c117e2ac073526d203867db0c377d26b652016952210232d5df0a8e1b57770b17c5256868c69fc1c09758a6bd97e0f78b0f56a06dd81721035ee08e3f5e618ad2480656a78ac886f2b2a367d1f1eab26e57117637f0af76c0210388633a6948e5de928303f192ab77aa2afe7e8df795f9a92b751f17c7d5f5f41853ae47a00a0001000000000101d5adf6de81c6b86ea22ed7c2fdb70ff759bffb6ffdbb07caa42310a57374b22325000000232200205eb0a4c786cba7283c75a29edfb1eb54cb937750fb98ae92dc7abaeed22391b0ffffffff02dbf329000000000017a91489c98bf41828049f166c08c8c74ec027bea54eec87458237020000000017a9147686b6a1ef1e4f3cbc40ec20c8ffaa44d9bcf475870400483045022100bae9750ebc49a916a425879171dcb04a4a086a14d44aa8e662e9717ce9c406df022029c2800e09db43b352ae2e254c5faeeec8552a81ad8658388db0e1704d9f4f160147304402205263115dedcd81eb9de1b531e429c4a0bc4dddd3a30b726ca8e701365cc701ad02204d56a6ca4aa38c4937c66712dfa93d19df8574e5d5dbdded588e35afcffd2b670169522102530b4a2f72e6d253a4a7b5487ccb60fd470be02b6ce58c763845bab61b4e7ebb2103e6f6b771c3eafb936e7fe3360c179b1a48c2835e04af52261d733766a4e8063221036de09eee47c0357f1421ebca28593cfabb0490f0259dfb5c4ae6e1b9a7c99c1753ae49a00a000100000000010246dd1884d2c05307a330b7c6ad63b2cc405d82cb40af32ec7f41d7ad0785826e02000000232200209b49387ff64e93dc1ea585fdb3c08023117150b5903697539c9b4ffee2e2c21affffffff5353b94ac70b4b61a4ec7db388509e2ac1f9fd717244105dfc22f080bbb79f9d01000000232200206a869e4b9454b2925a6d40003ee59d48c7594ac339df83bda0229f4c3d296fc8ffffffff0358a30300000000001976a9142d3ddabd20599afbf602f95aca2e1336e65929e888aca1ca03000000000017a9146607da53758068eb97254630c242ac162cce421887e2c81f000000000017a91444d55a5999a4fd1211eeb83b10e9c1eec642567b870400483045022100ce704f5f4f2dca2abd4d0acf97326211afc9f24640ee41d4359140f837d024d3022013b6e4f039bf6d3a304a9c1988cda32d36f2c70dc6138e16f86ea650c4e679860147304402205f4c6aa4ef41211654279de60ec1b4c3bcd0562a6e15fb0512413b2598365ce8022005786ecf209ddd372fd96e1ee9675c432438057a7e39d3a311804c3af27743dc01695221022df1190b1aa9d117cabb5dfc671865567c3d5f009e1005f206e6024aaace82bd210364d6a3f0848c688c75d5c9f61d1688275d5f4b1ea4a24071f0b1d921e33f99972103164a75424679d97e4f8a00f4fb33650df27a24cf1b4ea8d5e46ea6701f59cb7e53ae04004830450221008ed28fc9ed0b529147293c676865a31db8be7a93a4385616389faff351b418a902206cf5b6594310a1ceab84eec5232dbec8b39b3deb10ecb18ad6e3629a07a2eb870147304402206eabb51b406760c48eb416bb536760de1b42d4e02b4366b5d188a41fe1dbaa6602204c3f6edfe6b479625c8fe1d076ec96e18805c84ab524aed5807ab3326a626ba4016952210316bac0baaa739e50fab8773457a1cfdf669fc453c15d5b98af200c27b13e03cf2102d2aee76d0da7d0e8577765d6305a2467d44fdee4632e86608e1f83a653096ff62103091e896c43a15f0d736033a79bcc94ec450ffc8eb7cb84a91d013343b0d2bb6953ae47a00a00010000000001053a772a7aa375706dba729d26c843675e4646555cefd64268c7bc06cf195c712a1300000023220020e06002539b937ac7e4f4335a578f7505cf921ce246b4acdd55ac6ab0becdf08dffffffff0e5eff6c7f25229820cff2603952175ac75ccde3cc528b81a92c93840a3ff04b0000000023220020d6cc14b503207d36e8131a3424bb8a37d1f06cc061d797e18841e830e5d97468ffffffff373f1d0edbfd1d8c35cb51a872a167c59e9151b768bb7af2b6859054f5c51e6a02000000232200200206ed0d0ae1a228f7d0127f5852d1356ba07ed0866f0d04a5f0c3bbd8959e37ffffffffef04fa9b09818503ed99ec332c883d3893bb4b0715ed6333878cd5ad50b94c9700000000232200203a427076950d271924d77cf1eaf7c21681ac82339437f73c0f32e09a085d0a4affffffffbcbe7ee38d6230c234c893d983adc8a3d0fc3892e7809f02a39236af5dedceb40000000023220020f88956f54b37772224ef67fa3392ecb79dbd0e4ee5fe554774c9984402a2ce17ffffffff02625900000000000017a91442f54264082b0e502138c51f53f1f477ca6ecd6c87f0295d010000000017a91429a1792d5c99a6f8fdecb879739f5eb5de46baea87040047304402202bffcc43aca1db4f6cb52c781d742b2324c03026fe1b9551bfc1e7bfadec894f02206e9a98e4e3094b86db2a8ebcf5fa94dd3e9ae1c9fbd25b3377354d92962c0c0c01473044022003aac602ab7296679f6842a89f4a586dfd371cae66a0eede6e563b2dc2aedd5702203528112abbc1c62eed440da89b1e07bdd6e7cced3a50d999fa61e25b4bc8830e01695221035cc519545bf8d70d00e109cbe053c0467e7185eb615a40bbe853abed9db7167a21033c21fb2d5f2d142c169e72fc06833b4a363c573b5c55213d014d3d1cb683158b21022df0dabbdb529af3dafce5a81026bb600c932b6098425bb91a67b77b71d12fee53ae0400483045022100b4ef0c4d599c59134e39e5f680900640e7f2a0c467c50d5162b3805a58caf209022055f0f31a7613bbd5a522871cb3fd24cdc2f9ec4167eac321258ebb6475af012c014730440220478e67450f009d7f72916377f5bd47a5423d8046c550fbc8557d284a85e7fc6c022040bfe19b3223ebcb5ee4e7065bca625b772993cd0fdb80eb758c2a7190d111dc016952210269f6bffe7dfe8689fff742b8714db96fecdd6476423c06a6cb97b34d1c7056f52103d68cc53887c56abff27803897183a24bce2150086f2233158901034cee0277f821038ab375c1e415c9cd652f095812d7347488c4397c74d99e7221bcfea67ca266ac53ae0400483045022100bef648d3dfd4ae793671753b7557538cce30b14c3d77be463af4f238fa7e085a02201e8e95f84a8d65507afc154ef0cec76f5893fead2f9eaea6f7ac2b2facf15e620147304402202c5922ece710e2cd328a6f4b8f0f5c63a37590f423127e13497a07045739d9d1022034c0c4d0b6d09d9b1e91ddb6ec45abc555ba8219cb84f0132bbfb850b1bb47d90169522103fd3c39d35df9be66192af5dd02560210996d52d075e097ec0b09862af472f79d21021a2bb2b0f7aae1740ab526e4a7da23c696a90a6ec6256485f6ebe3d80068fad321023e02dba62b137bf51de336d0eb581559f48cdac1a9d2258a923973a1dcabe0f253ae040047304402205f93b55ed0a78516607e12a54441900e73f0ba54f6953ddd5fce3b14edfa550e022066ac091a8ce10cbfab2e2a0544cf38795418a4be99c55820c3ceb427ead728090147304402204c773044fa937a0e4df0c423452a93095989313535721b83b48c89040f7a32cd022010028fb2475594328dea9fcbecaa60c07d65dd6724487c30080c121d8382167201695221024b4ece84cca896d525b854c2164fe378989634c6e576ca14e2d213daa4b2e02a21026e8b018797b20acdadd217551154bf83790be0fc165772586d6b5a0b1ad29cd1210357cde708bfa540b1996d7d09e0ee975d47767f5703872544fd6d473cac02411153ae0400483045022100f90d76ddbd4e8b1a24718707d3ddb41562514416de7d815325c954c36b190afa022061e55734cf941a029aee116bfe02902dea624df8f1a17d4946716a7a5f1e05e50147304402204fea21e320a2bab7c2c9f9f3e678753512f25700928afd2664799700bee5992e02207e98bc577f6abe7661187fa2bc9c54c9c4ae756a55a60f03244ff19db237c60e0169522102b8c6f6b7ddbbadbd626bb8912302a4649af3ff898337e3c1cf7ef2cddb2d42c4210333cecd553c34c15efa0a78c6fb86e248fc816e3e4924d7fc8eedd8a5eea74a84210315d49d19f6327b5103006ae23e2d34b642f4615377f1181fe55269860cc8118053ae49a00a000100000000010167e498e4779c9bddf58a3204deafddb254ce240b61e65ddf5b96d34f0904994a0100000000ffffffff0219b10b000000000017a91432a4db311f79f8ca0939bb61d4f87e633f5c138f872b216802000000002200207f5e081fe4b81ff1455b5208507b85a0ec4f95075c83514aa675a64804b58407040047304402200dbcc28a3450a543212a0116ff8f28abc4e4ea4df5b4adb112d0a1f5ee4ddfc102204ecd979e686d4a0ac85bf6d7a179214ad3d0281471470671fb40dc1774e9b05d01473044022073c45cdda96b146cab590f97515be2216c6f386dcdaecb3a81baf547cf254c30022056f01ca3aa96c7c12fd1634f7c7d2ba44740106e5a3032e0d036b775961d3af30169522103a299831f4bf3f7dc8ac93718cc9a2a3989e6bcb1aef21fa27e63950f76a71abc2102bd6eb1d2d86dd304e62bd63c41d037e1cc7471481eb38cf184efb9b07b3cf10f2103d3bd1a49b70d645b87aee7642347b2fc108e7804a7eb156548bb8b48e48842d953ae47a00a00010000000001015067fd105eeb13cef346bc5922a0d5ee09ec5bcaaa2982ddeb9d1d9af59c0d5b0100000000ffffffff02af3600000000000017a9148d02083f6a14a3d808f2a72114018da01e347e3d875af0ea04000000002200207afe4da629dac86f7cb81f58e0260070a1c2a9b3466e0afdaa62a5fb639acc3a040047304402204c736c52437160062c1a588881e6a674bdab76cfcbf5a656271971064353bc4b0220119140654a4312e851d389339d6a4b20ca8eacd4d28dce74eb3d72dfd49ffbc901473044022067c4f476bab30a59df836aebf4a0a6b52702419056e4197f98b996c48d6643d1022059be21dfee032571a2f07b7ffae8f9e3e08cbb25b2c150e35d7ec5dadeb726150169522102a47f4dc5b946365203e1bb4f29811bd2ad1738a0331f5b9e92811cfe87606e7a2103f5b914d27f4396038526e28043ede8fadb67f52da113cd9cfc2868426f4506c72102e35257e85cfe0f3f16e6c99d90d710abc81b6d84b1241c6549bd2f6199a162fb53ae47a00a00010000000001018446f9b5ee84a915ac721ec814f4fc19c97ab26daa6c50227160f3f2f730da760100000000ffffffff02796308000000000017a914579400d812d36a27934228c13b8b7ae05a9d1873876633cf0400000000220020caa7f3cb850b0e451f6fd955db0c3bf13dd5ada720511c21743a38cc5a076a6a0400483045022100cce94905fe0556c157521d89636577d6359fc16fa905f868cc5397fe200fc2a3022025c63cc824353a88a7ffe72c3dcd66726cdb1bd707bfbcf542697560bb6876480147304402203ace5cbd63b4e8b633d9c4dc67b05dceb5359a8353c2059bc0ce139a43255ccc0220321e4185eafedc8114ef92553591f0053446452349ead62cdf75e8ce984a70610169522103d7162fd0a2c011137aff39f0dabdda968bc85f6b2e8f22a3ed8eb5f474f342ee2103294f24d57137e1b0be2efda049fb3dd1216d8059c53c6ce5861746fc20ec58fe21032ec0e2c310003308eb85e0882f2394a227106754ca8b0be63a91363d961369e753ae48a00a000100000000010107e7e2dac5b74d2d922176548ab34287082f78e06fcb0cff11506b07bb1b38740100000000ffffffff025d8400000000000017a9146bfb750698fa1f3e8d1bcc6f2162d2943b868c0a87db72370000000000220020c695c7f234382302c96f75a416e2b5f15b8c30a5de426bd6bef739552cafdc6f040047304402202a3469eb0d7a481b20303733cc0ff2df3f752b9ef509cd60e54d29608751842002206006b1ef32f022b9d01353b29c2cd2e88d3b0ea5068b17efaa7188285c1340320147304402202a6e13ad0bd288a095b170eee9c07f48b44dc0447feeb690fad91f0e5e5f801802203dde41258867ee3d243ebf1a6e36807f59af0a6e7cf3b9bcb5b260253c9c7566016952210290b4f8505acf87d0e6cd351c9fbe8a594c6cc924141f27842d33a0d46bfc205621036e38f142598781b0682957b52aad0db1817d0be9f26cf960dd4b617844a5e9b9210334ec93ac9fcc009aec0fb99e82ab494f8a86f7c7b8f7f2aca24a6197966a85e153ae47a00a000100000000010175ef122d5d8bfdff2329912c85c52c08578e8c7345dd95138647d5d40b7fac7b0100000000ffffffff021ec119000000000017a914256ae22c130be04e4aa846975fe14ca5dbfbdf0187838a8e050000000022002037fd7786aaf6e2c4ed64639d05bd310287ebf2f7817a1720c6d4b79e884baa08040048304502210099cff038dfe9470430a166f669ad4cd9e4d86129d03271509fe6b321efae61bf022019f50efacc975da60b77cbdd5ac4dd5fbc7d865e3a11f1bbfbbd6be23f8a524c0147304402202cd01b019fdff44bf2b6530d0ce85ec7b5110a06ec7962a0e8fa9d81a7f0b7a10220332ca6d006f04c1d1e4a9402617049f11f998b12cadeae62aeecf0a629c2c31d0169522102df2fe64d6d4da991927a6c26de63ec526eaca77da017e33031a16c183592622f210226a725c2d50282a0b7d023caae1da1085abc3d74be98c8eaf7c9a75423d53032210247ad1500d8b38f40cb2fbba0d75b04824919b8adffb72a9c93b6e06d803799ba53ae48a00a000100000000010156844dfd73ad902926f86790ddef05dd2304242cf66b96f3cfc0158925016a1e0100000000ffffffff02eb1500000000000017a914e763b7847d9cd50063933ebaa618b1be13363c168763c902040000000022002079bb9b1db822dbf396977de32b03eb38b84b7e86262bd3959004b9ff7edd08290400483045022100a4f9e1f6b293f844d8a3db27f5460b467af5ec9c1325cbeb1cfaf2d5ec8e883a02200fc19727c71ed45f916a2d8a519c37fc0ecec55bc160f62fa19306794d0725be01473044022024faccf0f3cf949508c2267b2efc7516a6b1bc64ad78dd1e2a8942752aa2f4fc022056d74fae5d7aec72c982e8a50b8631aa95049b6c03848c526a6ce8e9e7f08f450169522102fe028e2fa8b9c04add326ec2446777b07c335f8ecc091881ecccec0698ba32512103467390d1d7e036be2f70490c8e4a661b80ea95de2f81f3989beb1ec543d38f6d21033db0981628152fb816c6cff13a7e7a3a70df3f370f04740c13e83328a500977c53ae47a00a00010000000001012865b5b7d99e69b6cf811b66ad20550a72d27f2952c31397cae0192ad2e6d0020100000000ffffffff02682810000000000017a914fec3a9e228ee710c6b401d50d2237a3daa85592787705b4d0800000000220020af8a2f9c5003d002f8f4ee3947243904054d478d29279efccbeb60589b265a180400483045022100f43e4012135d1c29b0e71a66794a470412e78cfd90e64c359f95adaa4bf6137a022064d46ed797e9e73d2c1b1e6b8c7b3a1e7df75d42147b8956a95bea06ac891eed0147304402203a0b1cf3039bd5bfca0a0fdd199d80d69b238b36c8826c822921d5f8d6805dfc02207c97a2b226f5a20de7965a96065fc568ab8c1593dc5e71ca26d1e5336955a0c5016952210356c9df609500ade51db78ad983b1dc6888e7f78fd1a73c10da0823c2c8cc6ec82102baef2ee94681e38f2e19814928951521d90e201b590c2c96c8fd9bf7b102d6802103c1c8b82aae2362e635a8341e8c8b22ba99c318f1256c04bd68a1694d7d623d5b53ae47a00a0001000000000101e43046747526f38c26521dfc4cc713036eb144d3f8c2c250bd79d416a7dc5e290100000000ffffffff02478d25000000000017a9144370994d375f076570595668156288b85f29142487564ee90200000000220020ab45c66baabd056203d19b6c6d342d5ed084f1d06af19c75bc9570973f74d41c0400473044022015899fb8847cff22e4b8f50528d3d0e0e9075bb0720890309dfbd68efec12d0c022077f065996c5c075c9c18e2c5a11fcfc5bded9a0e7ea325b53654031642429690014730440220177174ccdcc3204fa47e17190a95fc19e77693e9a8290d716a1dd443ed9697e2022021e6725c34fb14262ab480b23c38372ffdb4643b2c4ddecea5758968556893750169522103d2024c7676a4cd119b2fe03f538ad2f11d9e077b1052f99d77a81c27eaa4648321034b7033c268c72459ec08206b8e93a9f6f1662682cfe7450bb945c0725f060a82210275f88fcdeef2dbfa4b3f224b8ea6c3ee55545a207b6d72f869d0b918eb18125e53ae47a00a000100000000010145d5ece55f85c696517a8b46b1bbc8800f983753818cbef736c74791ee826a310100000000ffffffff02f2150f000000000017a914b1d7a653884c46de9f42426fd4cda1dbb1b18de38709679303000000002200201bbd95e382d21ddd5f225dfe1812717a501b977815d818fc012350da5eb14d5c0400473044022041d209a14fe5af9715f917de751f2834ed8b78f43822279e0ef66de6f9ed7e6a022024c3b25cf1d2f7f583cda5124fbbc7b94cbf4c811b60439832326dbb02a9ca630147304402202a05645761040633bbd0113883763994fd14dd5ed622c5ec07c55c6808c6f96502201c5138d8fcbb24bf62743ded6107e5773aedfb56ce82a7b6749c06295a76674d0169522103c7ed84168c0077871de9b54ddf8d5612d132b2da707a3a6a107a54038ca2720f210310fb33c5de4b01aae51a3503ea11a6b188e0eb15b80b939a3be5e4d4ab64992b21020fa67c4ff2bebad4103c6d96878f257a601de7c7b67d535c6fd63dde5e24760f53ae47a00a00010000000001015c3fe7745959498bf826bf03fffd1513914eb4b52874a5c13b20cf9b418c0e4f0100000000ffffffff0236221f000000000017a914a16bbe6607527575fda2c52ed1930fd93c4c948087dbdba1030000000022002016dfbbb5aa2df4399b5f790dd4ea889fe99cc8de0cdb2fb743d92c6fe40ad6010400483045022100e946e9a1ed34783d6938c2d29b5c9dc809f54c0e845d02b35cc8f8d4fc1f4b4202203e743a8cc9453603dbe59529b710430d326abbcd098c95d293691cd5211912300147304402207ca5859cfa79e6aa9dea1a75ec0c62a8d813599fafdc8c77da9ba3dabc13eda8022024c6f1df65081232ed0824149acd42cb23c1700ba3bc1377daaeee9394f5d14301695221021e2ce309f78ae43730cf320e2bb4aa9a4cc64c56517a4be6361f65d140179f3a2103db36159b45e4346c984e6327fe464675a3ec5ef8e4de71d241bb5b74c94d55492102d59c7e8f8b3755d65992bdd004a8d82099c52284b1992ee5f6c8cc6b575d2da653ae48a00a00010000000001011fcf193f12c813fe1a29bd7663d98c6378e7794c1c4ae126fb2220972e6fa33f0100000000ffffffff024aa810000000000017a9149929c2e6e4139f48121b62e57d929e50c5354b54872399b00400000000220020be1a87c4431971a55da4c826fed5603776454b7ba6a7fc6de2ec1fe823de53f30400483045022100df1f2da1b2994843d13735156cf4178bf1c8ec36112618554d2f18128dc68319022029ca26e5fc5190663395f9cc8123cb5f83a4f978c713785a0bf350d8854b0cca01473044022024f29bada90e858cdc397f01c71763e94cef7b3ff88d9e10c79a35356e6c777d02206d52c2fdaf69a34a9831eba176aa343ba77ec1130a900d9df4a0c84f899181120169522103fcaaee2e09d2aa819ea8f93ee85cc4537f7ca08714cda678c9000b49fa7eacd3210325ab7b461edf8f410e52a1d43934ab1f67020fd526b8598b9e5666dd3da8cd2b210207e29953bc85030564a5f00faabd74ba57e4eec50f65c5c21a743df8edaa635153ae48a00a00010000000001010f1ba412b46f8b54d7fedd1167274e40915af991f257472e9df34b3f76c5c68c0100000000ffffffff02e5fd01000000000017a9145bc167152af659eb56e03f96fde90d9acaf78e338705e4ce060000000022002047ca6ba851e76a713abace70b03ead5e1e3c4616b00ac79da5db194a7405a82a0400483045022100b635e43fa56f26fd0ad23d52e5da7687b312d49b256360a975c8930baae79f7302200eada4ec9cf6a0f44a5765578b48716c0e65968e6b4d10d4af0aa4b27e6a12890147304402204adf3ed40832645dc0381af35402e19146fca355b1ec471ffd39270455691c5c02200a028613478ef0e76bd0b46cac9cec823dd38cdca9852d90d2643bb855abbae801695221024da23d836fbbcb67c730844b8428ff0cd477a52e55711ece79a4fcd8e67dcb2e2103aebabe318a49d2d343cf24dbb9dea85778d60f721b6a395cd1f3c6044eb1a0372103d0ab06cdaf2854b01ba61b63cd958d5e953106079de22457f3f7ea8520a4b12b53ae48a00a0001000000000101534b82c73e7ae381039fc759ad28be78eb26a8467aa8716d18b0f7845c9a1af90100000000ffffffff0251fe01000000000017a9143c180cc5c085373462ced449d7fe2a2f36e7ae7d87633f5e010000000022002077175a723857e1e17d045c1b4d13e6cbf05625e56981004568038d92b4850a070400483045022100c39b9f1cb09f1dcc08ef5b358ca8e1c673490659c5147fd4a52afc1f4074b9e302200407734865001bf7b8e04961b1818506271508d7fbde80f7eec47fc1680f74bb01473044022025465ae3a00bad39d87fa190305de0d79c71356f5aada5be7212a7bdf5c0f7ac022040eaca0ff7f078f0c245771b101a7d16277da68f6e7cb7ca56cc7a9435b3ecf80169522102a2bd6f6880393b02063296d3f3ba4a8ba018b32d742d11bb09e7bf894c6a26622103e3c683e0e7cedb3ebc535e20f0fcfd9080b9257eb541e463e0d55c05e5d4398f2103062393de8ef3bdb5c5c6e82b86645aa797f3c232073e6981e49e409b1c8a704253ae48a00a0001000000000101d36f681b4fbaee4726eb4f355742d3b2b8b1d90d99e5a4124256672da6f605d60200000000ffffffff02af1005000000000017a9148831d74373ce2c93dce78f35f485ced2a73a30a387602b78030000000022002047aa5e788c9ce02768e6e3e595f03990c1f32cba8b9623714a4575848519d4eb040047304402205c09c281a6bc0ad42f98f892ca2ae480e41f3a848c4e2072cf77659ea81ee8ac02201724e5045956ed0ff0d9c9e229d212550f8b48eb04ad014ddd7ba03180e9fdbd0147304402204435e6a8cda51c64511c7faeb73a8145c81163cb4a3249b7c8178e6fe65cda010220258b5df1982cbbf26b67627b720c6c93cd412ae2eef1485412a6c1b3d23c2c3b0169522102340a92465f61bdc49db90010babc8a1eb9db6779707206c25a638f9c090d55782102d1a1570bfe9e0ffc83c28b5ee752eefd38f0a59e595316b63963e918373bf4f02103f887f9373be6130ebeb912f5dc93223ddef4bf396cb8b6f591a1fc298920ec5853ae47a00a000100000000010139808f91c312abc345623720b943ee8fb31a212315cf99019ffd4cf3a46b2fc60200000023220020b6431fdbff041ca4b3f19f03ca4ad25065548cec8b497e00c984bd576e420381ffffffff03905f01000000000017a9148acf2a162d71eeb5bbba01f1d67a4c2c122688e0873b8804010000000017a9149115fc2109f011ce6248b324b5b302c22d4cc2738700512502000000001976a914273bf51cc4fb3c8c10134341479b5ed5124e451488ac04004830450221008201ae8a8c3174920b305f41b60836ffb5663958ee3a65f2d4ea801dab8f957602207209129463b6891d06858c8d5e09b68a212efd1f46adbc38dc37b54416fddb2801473044022067e33539213a04b5ca34ccb105376ccdf61aaae3386c20265c53b04769b999a6022046cec292be04ab1432ae2b1f5d6f003695951202b34f5acb2b5212d6dc89537f01695221034d8d13f4d0ba24fbd2aaf7161b93975c79007c3d4765eb7480e93b5f4cf5a9d42102af2c43c8668f67e8f68d4d8b004aaec8124cda4d4275f96c1d68124094e06a8a2102394c5e6babeb23e57bbad03f922e13bdcb3cbe3daca91a0a29d764326f5a62a153ae47a00a0001000000000101897e2de3cf5c976872a3a6bb3ebc95cf2fc3be66e8bee6e7a2f03c00011e4cdc01000000232200203f2f973ad0399a5fc2c8fabf0c3244d7100cb74a5cb8221204d13b88112f4da3ffffffff02c5cc0200000000001976a914a314467ce48f1dbaac36f00f63ebddddf0d83f2b88ac5d4202010000000017a914f87576872fdc00addbb9a66c1196ee3c0f059c28870400483045022100c93cdf6189ed0ad33f96d9a06ff1363ae17212d16d01bc29dc9264167443201902204019adb939920d7a27c76953c04f85409a79e06620c2d1a3e668b623938de5060147304402202afb200f0adb192bed9398e91a56adc35069edd2631a60b60b5469a7bb00319f0220552c44fa46da5075d733101a152ab2f430c3325b1c5f34f79bdfdf670a0d9a5601695221030799f0bd039fe22d758981f1bee1da8580114ec886e349253b4f205a1c4edb5b21021e436736b86d89934e3654939c13b7ac2e139b3582fc80ba7972bd1f8f95dce62103e4b3f5f5d19fa3037fc52ccef3d062e2a5053f03e0e1b4874f7d0d0b6240f5f153ae49a00a00010000000001014b8d9fe40aa564991da2c4e0eb072004d538bc8998a6bbf56dba0b64645ec7fa010000002322002059ddeb7375c1cbced538d505314f892f2b368411af58c35bdfd3c87af1951322ffffffff02686d54000000000017a91489c98bf41828049f166c08c8c74ec027bea54eec87bdcfad000000000017a914905f65fef691d04b0a0d649b0d9731f21cd303a887040047304402200ce5aa2e6c4ba82af38fb6de5f0aa9157f4d3e8bd49f991732fa4962bd814bfc022073d8e8262e37175070bd2a10b41b53dcaff292535793f60528d0aa171b70798101473044022052fc004a79df63216575c8cefce0852d1717f31564952f6f56eb30ce1efee81002203c41ed9ce485c829e905f0f976d54100e34e9de9782c69b430da34cf44b9f9440169522102aeca9337bd48bb79a4cce0f9d6cfeeb33677cdcc517e90603844dc81374dfe972102e63d817abe559ddac8aa5002a9614e39a7320edda3de24d8343ae2a0e3beb37721028caeef8c6a753557419be31577d2465dd26ee02ff842bec5fa11512d24cb73e253ae49a00a00020000000001019e8b12d6cd8152868a2fe1123c45489bc0b895285dae76bdc4747cc525cf0c910000000023220020909bda8bf36769094b6434d9954f4b3c6f3cf864a3aa89e980d48c26690c61b6fdffffff023b6d02000000000017a91480de60fb7a96bc449373b531d3bf94157c17083687033200000000000017a914837452db33aa2ea5928cfe91f9b472ffb42d6f5a870347304402206d7d9edc6ac92137d973b564f131902ade176814cc5a823b5490f9df378ea29502204af935a138b2f96f0f72fa40ba5991a9b5115336978bd9597ea17adec4073fd90147304402200b2107d44e3ba28c423dcb3dbdb06bbdf3c2166c1a40459ac6878f55528abbd702205e476013dbf2125b4fd304646730467e2b630aece26c66fd267839b5abbd6a93014e2103a04513c6c994e18bc01100db7a6b4a83b29166573d7fa5c65e45addfaced7f82ad21024995616d8a481012e926983af65fff5921db2eb099ae8306b1f4183c97ad9838ac73640380ca00b26849a00a00010000000001019372aa5d0d0d3aa5cce3d12763a34290c48dc50c6ce95ac80bce9955409a8beb0100000000ffffffff032c580000000000001976a91471070140903efde1733f00dfad410fd7f667e9f588acb70702000000000017a9140c5ed70dd0bd462ac05b78cbb27317390baea419879e072e050000000022002054713a001ac4ad258a2f9258c420e2ce8245be057a50cf023fd0fee4c76ecaea0400483045022100d91d1937014da50eeacae1cde0b696c7592bdd65fca74e22ad1f826b976d54fe022059a44653c2f01aa95eb1892ad3f78f0153ddcf25fb5ec5804abc3c5210323904014730440220249d880a248fd137bab16883418ebf62fcb585bd071b66a5caefee42511acab60220404a3ae1617d828b41451cdd12ff709f67a6fd777286ec06f17b1f77ee3fd35d0169522102c4ea841929872bac916f2b63e3910b8d50453e87b24c3be72c7c55050ccbba8e210246badc370f9caa3144c393bc723940bad41489bd4c69a13871168962a24fe5c7210260a56d05e43752e8e53d4f2d573811d4eee70aa5cc24f63f60713e391357837553ae47a00a0001000000000101a467702d2ae816547a5963e7720a97e48e43861345e3af0c143bc52671abdcb40100000023220020bc8c1dd08ab518bbf38ee4a8548b778de745b2fc48648e71c3a9deaf521d0ad4ffffffff02aec3de0000000000220020d8d9eecf7b43d964cbd8ee5d33f9523da2242c5d33a3962e86dadbdfd730e6ded00ab101000000001600149c59c8d458b784f5efd027c53d44a41deb419e94040047304402203db15a4f79f56a9098c4535b76351ea005c7ef74074cb0622766133e7312f71b0220336254bc2aceb4e6e19d0b795d13e84ec0cfd40936bf335403b3c3ee6213610b0147304402205bfc1bb3de324b884a40b4ef21d541f305aaeda5f9e7253c1ca4ec5d996cbfb502206f36a9a34d152b01b1f371ae84d0d246f5c7c46ea4509ebd611e6d1f3dde0c0e0169522103cf9e9222ee73aa873102f4294a07e02dfb625b53addf285b6a220e38c1a8716921026937613552f385276cbf26415f76e094b8a60729c84ba0ba610faf47aaf432ca2102a4209cd33d160cc2db79d86411c5b031a432a24dbae1f8f1dbde64138b7efb6453ae48a00a0001000000000101f1382c1a5b6f4dbbe6e0b416103aaa6230cdba869cd9a0f8721ee2f247d0238302000000232200207f8202464acb8fabcc3174f693d0f4cab2fb8c90579ced142f6a584205630966ffffffff0249873b0100000000160014747b9300799ce7cfb5f35b18f9f2c145f33781f188b36402000000002200200000e8a9b20364f541e8bbb2fb80effc1d568c1e298fd89c6ad2de7dc532fb7f0400483045022100de7faede039831797e00763f022680fc62a9282d53caf6547ab1cf79e265f4ce0220030e8c5b0a944e5b27412c5d9754fe918796cd21d30774a878b59f1fac25710e014730440220081bbd880aac8695d94859bfa5356f68f87ffdcb6c0bf7b80a2f4717c010b31802203af4e50e6ed2017315733be1eb7cbd218045f1bb16e8197866f132df9f15f1f601695221034cdf07622db1260b25da95d00ee5afc38d191afdca05be6344cb968cdf2a26392102421e442d77e41396e4d798d09e9ff3561c06083d996ccffe69345c7b6e1ad8c421037fdd45b5169e0463326d6cb468af7d41c0520d1ba98a9774b8b4d397cb6ccccd53ae48a00a0001000000000101ed8eb1b6cdfb257f0aa397b0c76864728f805c85fa224045a7dc14276de152ac0100000023220020fc25ca2f6933b738f93cbc7132aa0facd384f69694308b965f2ded033525c09cffffffff02b4ea0200000000001976a91490d48607747ab79f5c4b51235d5fe6023a2872b788acb8ccf7010000000017a9146308007f204b1140ab4c93f98e64adc8ab2de304870400483045022100df80e201a5130bc309f4056c40eb256e0cae0b543ca2e2646bb92f2cb9b2f5bf022038934167fe5e63367e7aa0571b189c2c7cd3cfed929695146fa55d22c19a960101473044022053dd87d4a6c76a46a1cb2af38d12ab6759906bae5110376710eeb1879dfc18e0022019d4e002ced1da85570035696647e57600f7a8d05bc6118ab9b3f7364920f70a01695221037804247a05bb43bcfe7016c7c791b136363f8946d3600d373f87fc33b6d7e5532103f4cd60692ee32ac4da0b1c301793df7d509d1c21d4f7e457c445838dc7f9a27e21037b2a0c15f2207fe4fbd38c7caaeac8013cfe397bbd41c26c14291d677046358053ae49a00a0001000000000101c3b34a307a739d8351002f1bb73428a0b20569d693e16805fd181b0256cf84b40100000023220020d5600d0fa967e2b49a03f368a4bd3fa9c3b57d93acb1bc8ead85cd159fb49067ffffffff02c82c0100000000001976a91490dd4e08fb5148720e1ed2e18952372d49d6ab6f88aca5147c010000000017a9140a83d9feeeb4651b6b74eb8dbaead606343e01408704004730440220018c937e48d589bcfd48f5ddeb89358cc9351f732b42629c86721522739d2a59022079f69ab06d4fd9761d63068a307e92fed7969785513144b3518b446807504c350147304402206d793fdc3d1786041ac8edd40b590bd490c7f36deecfd1328d77d4be8d3f96d002207b53a6477b3f3b9f9b0695fd19ed00cfab46ec0748fa12206c02f844f66169de016952210314a61fcbfd838ead184a836d123b585132c86078aa90385a583f638e6df392542103c037e5fd09d36303cd927f505b09c9a38c7c62723294a951ef0645b59089d5e4210352303e950a6e5d3d40ed3e076007fa5fcd4111225d14126c7b9681f5378a967753ae47a00a000100000000010115567b4ae999977e532defa97cf2caded55387f2861638ba27b5d9227c259e0c01000000232200205a0de772a397a614aaa5608223e8b1ada4555dd496e7bff9be2a148586de4931ffffffff0230750000000000001976a914f99065bd70d1ded7947ae4690293c90d716c125188ac6bd77c040000000017a9146ce6b914d79fb3f160e85e3b0309a8e6345c6695870400483045022100fe66035a0f8ee46e7cd8b9bb57842839876ae650a2ca6b62dda7ee02e9f443c302201f2c5e3d535f16e541881a0c6d351f9fbfef9768eb23251e0025200d9ae824c90147304402203eee023143e90a3a674f2cfe80071ec6d737a95469eb0dd482bdaaddbe146b1c02206d0e37e8a8760093409ebacc862f0d7ff14b7ecebb46f84a794f7b1dc8cdcfe80169522102a415e10fe3ef3c2e48846f8d0b73f5b31356e832e1209c6fe9a80c68e5c8b7132103724dedcedd824820803688fbec6f7670f59ac338b88757d2b8978c1313f21c702102e74401e72f647a38c762ff327e9b6d7837f9deb9b271d9260faaa4bb94c1a5eb53ae47a00a0001000000000101258edbc85cb0fc47796e80b9673b76cfcfa9a1a0c9f30e8e26bf0a3cbaa94a0101000000232200200f70f7041a648cdcb492d8927b4f69cc446fdb25559d97b9bfea6ee8f5d55cc2ffffffff022c070400000000001976a914205308992f082fdd85ab4782851b35a769c4e81088accb26e6000000000017a914c3fd26cc14b14980b33e29300092e78ea8009cdd87040047304402200e4513babc8a1c0eba6e3c163e95746e49f72c1a6b6223eac7ca9277e50aaed6022021eda6e3fc32297f33b0d78bb6c7d215f06445aeb7bfe982af4e02a6e464ccf001473044022073f8da69f369c08225eb20796c98f2b08a90e358edf8a69889b16dbbe29197b602206479703d8fb35f0a63f5a69382288cb8f29ce69ef6e244a79dfd9e81976893aa0169522102050c8a1e617a7701dc37b80fc1994e59fd52019d7beb4e6564ed0abe790357142102c5d6193ff28419483b6ee402e7d7299f38f3eb40bc96cdc7647a4130ac7cfd4b210281376778b81f579285da77926a0547223ab9b37e40af7b59cebfb3ab9026c00d53ae49a00a000100000000010162812ac498845a3acb19204386a6cb46a0a0fad03bdc35d2bb6a48a0ea9d7b1f0100000023220020a701ef8cfb59fee792561ad8262d63cc609e5fd15be127ef4ab21c1901f78598ffffffff02bc4d0100000000001976a914dc6280faeacb103de1346d1b57e2e4c162c19b4e88accbd3e4000000000017a91446e014a6a65d9f612d151d40cf5fc7562b747f6887040047304402200917bef835e8165b359ac3d292411079f47a71ef1cca3e5e08431b93544e4ca102204cf18ff05bac064545681604a110a1458d178ae45c7221576440f3ecb0d0989b0147304402205d6a851e4e23779a436c842c79779fc3a6ce604b2061d7003bdb535d476cbf0e022038f717883056fb88abd87867ddf03d9cf8b751242a57abc58d2ea29cdb6635cd0169522103d49849bb6c79d19b62d54401dd6dcd0762bfa9058c098e92eb922e8b5375871821029fb9da24d84ba1bb1dc30906ab7e01eea5308345e4ca0268f2295123a24b229e21024afa1d8811ba27fcdb7520308a3513614077fe032f91b1312afba3f9a60ea7c653ae49a00a00010000000001015b35b424f7e985ea1e9a7460e4313192f84b4d3cfa0ca73e0e023abed442d3bf010000002322002029777095313ebc28c583bb6023bff50cd66a8e20492831a9d617798a5b93f8f5ffffffff02ae970100000000001976a914a9635d3cee875d200b36a7dc1b6eb62b9c3a500288acd936e3000000000017a914b2c0a3474754352e7f2e314d06842e8df0da92fc870400483045022100e13311f00477f4460e6590be09963cc2c5515530db1318249d47d1a9f3f01b23022065cb7af3100399bcdb484b0ef5a3459cd0d19a17a88bbde23425fe22be355c4c0147304402204c4fc476e22a6b7e04b806860ad6dcf51ae96dac21d85a8cc06fba36c23043e302200fd131e3fba259856c4f64abae5f42bf1083f2dd626b50f29c66fc741fdce8b2016952210260ff5da8e385c500744545a545f24ff9c4154eb655a7ea23c30de9728069d8ec2102fc6e35b970d2b59946e3d7b0aba39a44db7f0ad57c6bac8fdc8f15961f260958210216337764da212d6df3f6f61211f95b906fb6c908fdfd4e17140dcaea2f4e228753ae49a00a00010000000001015d1b8ef7fb4f444ced27aa669f6a2960e0e210f01a868e747a5e602c9b2cab5a0100000023220020cfede87ab16c6ccd348f2f843c795d97f481891e7e546b5a1041cc273368c91affffffff02efde1300000000001976a914f411c151fb2f328cb2f4c4d7319e5e90899449c588ac3d9a9d000000000017a914ecdb72c6b479db27be383c33d146379a49d544a5870400473044022059210f238e5cf4b1b2b5ad44ecdf85f0d5279f3c5553f3af5541e4349a5244e00220256c440278e82ee9302fba589bf5690f5ccbe4dd9930acde3e14c933bcc2a18b01473044022074afdec1e6ab719958bd4aa4a829ccc97bc88b8b5d00196b7c80995cb504d54802204695fe804c36e05d2d5217c3f52b63ab32d243c0c11ead94b8db9d370bf1738b0169522103ae902456a79e278c3a3716d356cd214d5f4df18accc48b2f8825a57276ebd46321035f24260101d62ab9ca78e99bea4aa76b7e1006fc0d65259c09aea64c9dde9fd721024c5bb3bd1e6b24693816ec594186d06ae6c97d214a3c0688013946680707b09253ae49a00a0001000000000101fab45a304f9acf0973c0958b4aa72553b1eaf5c3db83111d6ee3904fbbbb89380100000023220020d23eb6b0dd757fc6b8f941d2a0a6e31044498ebb2db037389940dccbe307beedffffffff0230d39700000000001976a9147a492b0d680fe70ceef887711a9421990ef73bf788ac845833040000000017a9142f8f01bf1cf03445ba156b72e6c6f0a444409875870400483045022100962faf4c4345fce36eac990a589bc5876b60de44afa20c0b1fb0cdf3d0ee42ca02205ec66de4735a4427da11ae85504404e8240722d361fbb216a5f84801b19e886201473044022028d8806ad864578cd8a4414ccf08a0c1201c9cb02e1ab9e068d6118fc1a9c0860220672aec1f66792909e945027510692b9d18e2e9c14d02c49e70e0879e8df80eaf01695221027b2aa7e6a94d02cf632f26c22ab67a456d2d04c9fc58884d75ec2e085087e4792103d9e957b2b90e6c3e5b8ef080bb79ef92e217327d952b0bc7729af30ea4f564b62102ef5e40700091f5e5d8248ccd3a9da2ed43799160945bc1abc5a2756042290d2653ae47a00a00010000000001014b05f9129587341bb78d8fce97c015a73314e94a97bb89e473f10344bfdee72e01000000232200204553d3f35088abc4c9819db5513ed6e532eda266d6a33223eda67a3bcdfa9839ffffffff028ca63601000000001976a914edb221b0bb556332836b58bc9ad2f2533824883b88aced779b030000000017a9146beaf2c96b8f42249d12115cdea495fc946926658704004830450221008c1af2cbb6a2f7af91ac4754c0ffa427501764b6ee08b4286d296812696e751002205fd4e784cd5dec76e74cfa7739ebaeea40289399dfc356ef51133bdc98ee4b8b0147304402202f947310c0250c24906a104ee115459a28945910de3c22fc0e5e8b712d63fbac02203708415edd9e3e41936903136896276e5f10ff898445f91c995b9e905fa3741d016952210385259d71216bd913519a9abd35b6eeae65f7b6593fa40ab6a0e3f4d0aaea8dd52102bd17ce430d6cc5fd2586af42d03eeeda48fb9ea329a357212df681bbe55bf4d021024a32cf67ab108b607fc8622ce2671252489bd94c660b881ef0d04eda5f3ea6d653ae48a00a0001000000000101412f5faf0be3d041aa6bfe1771eccc614c98e738402a1fa57685c27b21ac13ac4400000023220020026c073b449f247b6ceba36a239fee26f37738b369fc959042734715650a79e2ffffffff0217620300000000001976a9142ca71ae625ad91d766df5f61ea752e4392af8e9888ac95111f010000000017a9140316c211835bdba8167161611ebb919c5c7a4dfc870400483045022100907dba4dc8ee971cc08f675b1ec57beb5b085fffaf5a8c54bad593c95869dfcd02201f89adbe02934e6e425fefcf685ef8ad841144d3978df55a1eff806024f9092801473044022078a99dc4c2352bd1fba6a9ea780b0203d2bc54069075b843ac05f28b4b91582f02201b42d9b9379da722599ac5e2108b31b75fb420e97a1ce7e4a9cf18011261127d0169522102ec23b11f07dc91e17bfce6479a6fdaee8545f45ea1ae4e8f882f88923060c70121026ae25023dd0a522d56389c8aa5f96a4d730fc7fb2def470f7a807cfd6ca5410a210298d2e63ee92fb7a0066876999404713f10eb006a3453c165c2db29641936425a53ae48a00a0001000000000101be36660bf041c90d0633bce6fe6a77a72bd83913e43dc4c58a70e8e90b14e9ae01000000232200204ca18eba7713a425ba3a70343b413ff8bcb43e6c9b9e08764c97713fcddedee3ffffffff02abff0000000000001976a9146f7a2142cf97dbdf7109d01be4f4ff8fb32f8c9588ace28340000000000017a9145449e22b7e389b95a434bba373c5a8e6bbc4ddfc870400473044022045c6fe3aa6f90cdadb884ed838a7a96a48f34849af5af6e220ea6dd0f9c89af80220141cbd6f587cd2f124c0042588e70eeca986c0456633c42d4387297df1ff171c01473044022049f8d744d370351b6d74ca12c630fb269e34e6a50a415e3592b6389b19434913022004b18300aefa19b088599c80732b5a51eb3bf6df4332e14d22657dc945ae13cb0169522102fd143e862760cbcadf9072147fe3f381448130f09393d27c55ae6c2f5b63d939210249b31f583b574427d3d5abe19e33f84a15d460b84fbe13591699d606041da0e82102d348665cec216c59d68c9972ed3c166403563e8368d763f370f4ff317dae173f53ae48a00a000100000000010162e49b92543c50cae4b11fd0c209f3abc84470dfd1dea933330ee262c2494b1d01000000232200200be9d958f65d786e15955c391a196331e7f75064460a56c2d885fa3e0581170cffffffff02e03b6600000000001976a914a8d36aec3fb1c83c656d08de2348666520750ded88acf2f6da000000000017a91456ae04aa7574f55a0e30ea6b35b2fe59685035d4870400483045022100b1a207e185c5a35f90e908a11ba1ab2f2d1d6c56852af17fe20efecac3d3eb1202202a563c773670be1ef60de088e25906506af9c37bb5f1256a84e9852b6c9f6c930147304402206ec84902ede8534852a0667d1482b74b373f38896346a5d6df456a41eaebde850220610f3abdb94d28d5b43315f4bd8fb1cb8f1439c03e935143fa4f21957422e2150169522103c8d46c1f86470dec1aa76a5df7b4467d66748b91563aca9403ea449a7be24de4210263174bef3e17f3b7268ee72c5f186456672f437b0996e5fae251de6b9813e89c2102526690c749a52a1d1e384bd2cb9242a94141dc2c2883a102f9baec55f0fb5fe653ae00000000010000000001017d87b756ca7c214072e54fec8422be5eb9b3f9f47503b6c5872182445a97cd0405000000232200204143915f309b0b5ec9a74db01e67e6bf1f39676065fc43e620d4985619d2f83affffffff0278500000000000001976a9141479bd9d80c121d22d2794dab975859af49bc3ee88ac255f67010000000017a9142d46f296b1bff166f34e8988d2ca564709b60b06870400483045022100b922afc0f96dfc5088b8c777e669413b699e4dc85201b628f45bda20217a4cfe02202e19058d33bfec102fe5ea14ace2c37f49e66fc2fd6d4b54df471127441c082a0147304402201d8bb48f3daa9065202e7c7a6c340a191ee670494f141728aa59435ec9c8f5f80220114b37b898820430e6c876c22b7bead6c2d3c1c45d23563b850dc527c49b52e80169522103794b64b98ea54b5402968edfad42fa166f9b9a2a26e2e32e5f8ed84760fd3818210201dc254ca85a36863eeddca094b4cf2c9bea3b75d6a7f0ee43a75686d943acf12103a323a8a6f89261f935d148577cc8a27181806bd791bf0f68d3f41e78ed554fb153ae47a00a0001000000000101fd5036dfb024891b190e6b535f028d9bb1b8d99f72c4f13928a90fd7e91f3d9d0100000023220020b0fae5c1dc908fac007a3723d91fab3c6276ea9564951f6c028e749195d79a0bffffffff0272cd0200000000001976a914a6ab32060707132c4e65106c7b30133e01462c2088ac8faf34020000000017a914d0afb0ceaf90ce0451bd28493e21c9c2dddfb78987040047304402203bb7c30aedacb86cc075249db1576a703c4c59f86761263aab1bacdaafd3844202206b5591fbe85b0cd8a9a20d06a33f1adf224c4f94c613e8c00f3fd1f0c13a81aa0147304402203e209b594d06c41a1f8e53f51f540d92b71df38ee2a93bd3b7ad42c0d01d666c022018018ecbc70bc8385c88c86517e234fa708086ee31773bf764e6e373ee1f350201695221030b4ea4782aa72814f786ac2086805593068e9c70007fdea3d8be31eb68de45a021034de551e72255af56a271bac0c80db57d61382d5c550f2fbe501e5ad88443f3572102705b804a271b9c6ec612454af8f97d740f160a9e4468db882fb49c625a375fa953ae49a00a0001000000000101dc3923d53122ae8395c6f05e2e049ff24d849f102424a8a3bfb89a2a96049b72010000002322002011efc455a5704af31b4e860cb47d4923b3e2e49e3ed125d60a36ef38030a0d6dffffffff0247d31000000000001976a914a08546f46f21455d9155b544292c1d92feae4a3c88ac742419000000000017a9147405ed82091ccbdbcb835d935bedaa1e1dbcdbac870400483045022100a7cc652314d6cb431652cb5f4ef3d2bc45d8d09e04470eb2a760daa39178852d02204443132110151d3e123935a11565cf8aa7cd4110a6209f6f396fe507615a4344014730440220702ba1f438c6584e1f6b82d8948858987a93b2447f650e51b145e706bbe13826022073ac1b38f8d526144aac67d13db1c3684032fd097018ecf2e06c9b43d0b65cc50169522103b0ff1e8887c22033cf48e7de36ea0afe42a995e8a8811ea54bf5411045a3e09a2103dd9074830a0cf73e6e46a5a8e2975b658091c8402909a58980a72dcf571a007c21031734af4c3d896a611c987bb9a31f5b973f87b5880df5ddac7538a50fa2da146653ae47a00a0001000000000101902048c0746eb9d6dd410d7cbabc5610f020c090096510606b4ffcb1c85b162a01000000232200200396ca28d17a8781c04d3e49e32c858b1e62c8bd88881d553f91ff4d0852bdf3ffffffff02f6600000000000001976a9141ef3aba46d7e98233e5489c6b82e634aa4159b6e88ac016f36000000000017a9143708915357f652af9c90d7f1b170a502cc0d7cb3870400483045022100c244b3246c870f52b12bb28b3316a8aa429afc4efc1023cd655cebef84b596b702201e48339f235a7bb614632fe436add07b6a70af87344309552b972bca402464ff0147304402202f06b49e72ca86f711d097e287205eabe52cd396ce55bba900541d01bb5d043802204d26ffa7bd8457ec6116df1b6d15cb5d593c4c3ac0849f938c84c3cfcb2388b60169522103ec5745b9ad0a43ebeb2ddc37191799ac4bdadd0c06bc7d9558dad55012d0e10321031f5e7c367ffc5efb70b0d805cf566e6e1eb8cc74c7137189701ef345dc744fcd21025641b29986153a34c4cf5aa3a36eb23bd4da75b555cce11b07763185f147bf7f53ae49a00a0001000000000101cd102298a3e1ed7bb9734bb76a8d9ad0a01d95aaa0b2c32677732781f690bed10100000023220020126e04d12bc58683aba6ddb077056e2f6dd17f59ae4bd41b266ece8de3dd545affffffff02a8a60300000000001976a91485c15c803fbae172284ada2a68577159a3e77cdd88acd89d59000000000017a91420063c016c241c4523d36b96a31d5c5b86bf6ca08704004730440220207e4663318a171260977a7418fc24f72433c5f9c0c2c0c4c4acf8f801e57f5f022007f021f1d78de956be82eafb74259f8619830c35e5cd8d9cb488d75ced3977dd0147304402201878d68ef7cfb7ee525717a57885bbf41b5f31106f3f9cf56ddf4512e254d4080220755e9d686f45ac99467dc2ab3dc560be99214d2bda04f8ffa998c659f5641acd016952210339dd5b0421822be9bd0ea5c780943dadd7df5677cf2c09e26597f06f20bde7e42102c4a1dbc3235f29ca7f973914f050ee6d950955f9829cd545599715d138a12b9621037aa600635b45261790672910fa08957463ef8989c7fb64761c5199398802d9b753ae48a00a0001000000000101f2d4f09b2b33498c2db0045b9cd7763edf4721b4300aa2db30a9e47d4e0d1fc70100000023220020c7ba9b24a6b9a26f1015d963ece15a2bd8e4371b8d55da218c34c002f128cb5affffffff022db80400000000001976a9142f8325da9b28f4004645aa395307dd81c8cfc59488ac023a07010000000017a9148d86742a81435334b652bc4d17ad8d391f12914d870400483045022100863b288e7c49f87dda62df87e9698729ef4e542c92af9f6e0167615b0b471fa202202650bbdbf3b07671a38490f0e4a6bc3112593cd0f94b07344aff2f8b024d61310147304402204f609446570bcf886f87a8de73dab77d7300338bfc9112a5312256bf4ab4b5ad02206e75a15536e33db1ba5131c25ba5a35cbb235a9bbbfc485db54716b732719f8d0169522103777ed4fa2e0d58bb1846ad6440a544ef45b76c821177c90fd75c3c0ce2b6fda22103a79d7c6d842c9dad538948e003dd30e90b0d2343071e897cab19b0a8cacee285210340fd330a22fb189660d9d04b4962c7c5788ee286908a795202e2b331ecc5172b53ae47a00a00010000000001017dad6c58be1125e86d27ee1c74bf276f23941b5cfba1f35bc5556bbf7066c0e601000000232200206bf416de19a878a60d7b1599fcaad88e79f20de3120601411953884ce2130773ffffffff026ab10200000000001976a91463bb534414ee988a13205cc4c852fc38d19185e188acf39927000000000017a914ec7cc029781019f6f0204632a675663d2d8c626c8704004830450221009cb413526d5fcd063b9af9d08ffddb232ea297a78f814b0fd91ce42d3877a0550220530bf9fcc8f242b40b0d710060871664c5612cf11c5d5e1c39de7ca60e046407014730440220474bf6ea7c038c594a1186cb8c24936f7de5d14c2935afae814bbc304aa19f4e02202561f1d6db6bff77f3d232a29fbf1640dfb50a8315e3ef167c3336b6126daee30169522102ab6e3b108ae7f4d3be9eeb2f0c10a7941abf7232e27879259b927bda0869fcbb2102f09eb622b9dde39b53a37564780072229596a7cdfe530bde4e78e3f5f76b9a742103d5f64a7640ac0f1eb5050a8d6da6a28be7db45e07b16190f4f7e011c4adcd49a53ae47a00a0001000000000101acd9abd7c00160557d98c6e633aca5d8ca3247f14a133926e0d338ff7750b6500100000023220020d61bd704f1fe00792f99d4bac6fc7c8770fcf42dc1c67b211d3d9d50b7c30c2fffffffff0200be0300000000001976a9143a4f771ffd44ba24bc46708c84d8213eaf23003b88acae287b000000000017a914571d766cda764be30e8cbd76b6be2ac6c48b35cc870400473044022036ce4b6cdc0cc13a21441f14ddcaed2a0fef4f13a7d880661e257034928692ae02206b79e781dc7a0b5edc51acaeceef57665157128b507d208f40aca01f05393cfa01473044022014cc9a3dddb13d50b6cdaabac7ec545a1ca82b75624eee98e6b06b5c2484812d022012fdfe24fcc25d11fc199cb925202dc54c556ae3b57bf25c34d378ac84677ab30169522103b67f3c821d62e1dbba360c35f53eea4d5684b756a7da81e718828c263d82c1d92103f947084103f042ee1af45d16428e174aa503448d45ab1354bfae7382efa1a4d32102e141e9873fe88e5a2a37d09e82d6e1b62e3b2cda0f592479d84e1c18d214aa7d53ae48a00a000100000000010143b15a791ba00e53f6cd3aecc7790b71ce0b3f16e844a595456aff65dcc98cd00100000023220020be7ddd3bcb48714ca83fd7a6fa5615a9ba1d5dcccac33e4976e03ffcf34eadd2ffffffff021877a700000000001976a914edb221b0bb556332836b58bc9ad2f2533824883b88ac021726060000000017a91462f1676a9cd5b24f5f05dda2f0ee6abd7c900094870400483045022100df4133a7eaf64d20c7707cd3e9ecfdbdef1d78edcb9b71d94c1cf9e49a588a6302204be0d205493e4db44f0735f051aa12978c5ab4e2533eda571192bfda753eac1501473044022071c91c918936d831c1ddc5c84c83b2de276a75c0eaa841f6708f25eb3284142402207d71a06b010d442ecbb9439ca1c3b0ebfff89c02901483feafb429929e40cc8601695221036c0e6f1fab1ae6e2e898edb17bec292bf310d7c8a57ff2ad05adbd269ce0e7672103d2fd2eb4f2783ad0700ab5c1ab6e5d51ba3b8468ec11fded8464d1964bcf71832103cac8e85c53f3e21998ab7d3b0a8e41baa613c99e1ffb9f00b9894d7f86e4262353ae48a00a0001000000000101e2e27fed59dc34cd705c2f36315d92f9019bb2687792b729981566041e037f6803000000232200200dc6cf3ec29ac82784acbc789d887484876686828c473dbd1374c461333cfffbffffffff02005e1a00000000001976a9147e24db633572cddee3f5785682545dac3d63d50388ac8a653a070000000017a9140136cbbb27933e8829a8a7a3bce04ec12a09b0e4870400473044022050dcc65990a16156b283159d93a35524089bf6fc5a6c94644db044dbc7d5b52c02200e68e3b5edfd76dbfb6802ee14c54bcc95d3ec831aa5a36062d4b01e09ea25df0147304402205d4e01ba6a59ca82e1634e25481ab3b7625c4a200e0976c027f940df9a0b5deb02200217f5e6368175c8604e92a23b797f0b6fc90d8ee660cffa478f06435118632001695221024c33294aea1a9610d5e60c593ec10b7b82fcfbaac123bfe4ce6ae3808a5688fe2103fd7497040f7188a6614d576a06f8392bace309e9ecf43ebdc4f62e30c5147b6d21026356d9174138ba47ef0d04bdd79f0c10669807a30f7b48def2843596e8b75b3d53ae00000000010000000001017be83a4c2e0f7369f7ef2622d72860db9c7b5ce6c403589dc417b544a5a3277c0100000023220020c369f16106794d05bce855090b91398fcad5c33fca210803a1efed18ba31e8c4ffffffff025c2e0c00000000001976a914af7aad5048b7d9138921685f2b838f432333c49b88ac10d17a000000000017a9148586bd97ab4471e84e32cf7ec71d49c40f170f12870400483045022100c2a129b3d59bb6abaa957dd98247fe4f0d5404738d03c2360641c8ffecdc8ca9022034ddc5704e730e0236fdbf1e634ff57249f860f0856fcae6d7646b7ac253821b01473044022078f6f38c58b25994cd39cbe1cbaade1f8edec29fc74025bda089a22c4b120e8d022059d00d477811b078dc8db011fe0f8de10cb9e368011c76b60fe325db24897fab01695221026ba38d2c5e98cbf994178b26565c69977938ab4175d37aab6ebc71fc4a9c1d3921024d18ca8b7aaa454a4aba771211629f2acf7d01eef0b9e5be7150995418fb9cd82103673b761485a73e70ca964e6c9b48fed779b076cb69d81d7b5b5b30ec24d1f91253ae48a00a000100000000010142094daffdb30f5e50c2c3e4d530f0da93e7dde4c3b896cf8845a28bfc6630d502000000232200208808c4e92aa3a5bef4d47f62d12ae71e9d85710e8f734acee494e54680cd20eaffffffff02c59d1e00000000001976a9144b5b31b4d1261d32449961521aeaed441901101788ace788a5040000000017a914c080b44b22aa3e3c9b86839d614edeed3d1b1d8487040047304402207d595094914be3c2024961a7ab8c69a5079f155b81a3e32ea6caefc9f781ada5022028c61835977572e0e5843649c0e2f80ac34b59f9a14a163c9ee30e0c7dfdc897014730440220725ff3a5d9a04fd6c6b1891fd8fe8241fde42a06804e7baf094f0fa09fb8bdc30220168cdbc96fb2153746a552b3090ee3ebb6dc7f19e910375335e266420ab2e45401695221036405af90d8ad8dc0b46d41a72b63fa8b5ee29cea10dcf5b87858a67cd0811c2e21026750d9523b19521d7ceb1afdad9df6af1d298c837e8ba1a33fc2de551e2ac9a721023934f16ed62c3b17d7f76fd01d9435e7dd745ec4626835a54f7004e40fff73eb53ae48a00a0001000000000101500b87ea00f21a319c3de6ed4e59d5133e0d2aa9e428d72c1e38db369927dccf0100000023220020bca7e2d0c28ff5c080150884b13eab0f755c2f388bf6b5569cf256473c5ca7f6ffffffff02e3070400000000001976a914f73ba280fd397dc37683b51e7147616b4b7cac9488acbbfd0c010000000017a914ba903b9e19ed2f0c194b8c9b6ea036178a4d3c9a8704004730440220409f2c3a3e55f8f3d9472b0ec970f500a76cba9fe2b1f645cc3019d7b8e1ca640220791120d0533aa2c88dc54ecec738879166a4fa1169c0da591aa515d6f0e02c5401473044022057ce1499dfcb2807f03e2a492ea193bb8fb117ee3392e0bc057b5757f03dbaac02203bcbb4313b346e3945004aad393e5bc9cc79a2d8f7b5dc1cd4c4be0e284fb6a70169522102cec8f5337f6aade4b4662661f457ca68c5dab0944ff6fca796615bca8d27a16621020eced6eb3b989f9b458cb320e81fee02531b2e9846d3fb0fdf23dbbbd0d5d6a421026b54c79c7e8aabf130859a05a6f400b810a4947b8b72f57e35edf1c52272f85c53ae47a00a00010000000001013a548de8314a1c97b498abbc98051b9bd3df798c1ef6cd663266c21d02211a8501000000232200203cb2b36aab06565665596089a4b89d6e2c577e463b9cf5e66ec2274b702102b3ffffffff0259690400000000001976a914d34200f99d3bd805a772bd4bdd0245520267b79688acac000b020000000017a9145e7e05a3421c691bce5325c61550eff610a1d0d187040047304402205bf69290679c64624199fe6a89743f970b11878dc1824b91a3c719279cced49d02207912b1d606619a426ab38c63d7cef375111f49cb9c91cf8570407f7d3155656a0147304402206c2c7d7d3932538ed8fbd60a85a5f429f5c1294ff8377001e5b5c020981a4e420220399f054bce042637c7ec22d15897ae2b8ad1f2046855ecdf67b69d2e64bbd77f01695221032d47b070c6b97f2464c41caef663bc7985a0522f263adbbe8cc2101a8315058d2102515df1fd625ad700a30de937016ca1df75a1d0b53d7e31545214196e3f35df3121021fbc17de6aaed21ffca449be6a26d84136b69a4dfa440bb1ade32aabcd52b9fc53ae49a00a000100000000010163249382b8cd79f37af4a795d19d1e68b097f133f38efd6174e3343f6549b226010000002322002018084b277fd882251b632f585d02ff4683c9a879fef650db86a3d0402ff6eb72ffffffff0254e70300000000001976a914356eed393438617d3cfef994317867b0f2dbb90c88ac49cb82000000000017a91480aa7f74ae58eea8fcf3a288bb627b35841bd78587040047304402206284dff14b2ba2f62291d22e68dac6d623994ca4be7eb53f1676c71245dcc61702201e75c15fc1444e824166089cdb193c976fe27170d148e319fcb46d38c4541eaa014730440220047f01986b34fcd8f0aefb7fa59707c4c1de31174a2fca3d0f0ef4b917f17075022013ccfb7bf09eac0e5757731ddb54ea5261f823a6a7410318659131d27bb1ef42016952210284a18125933d196838f7738f5d44e9861bb0e30541a7b53c7ff253a29e2d5d302103a3c257701e83b3c595e91ef8d0badf5e1744ec876a1514171c15a752864b0cf62103fdf8b95fa68feb9c6a3b57dbaac94aa964d216475cc4b38e92bec69a480938d453ae48a00a000100000000010184a5a6e6e7955ce3d16484a94ccf3adc6d7468a53a12c2ea65e83f49b69947cc0100000023220020f4f819ee8406862dbc3d624b70dff5c53a3f6c28c38ef069223a4aab3d5da038ffffffff027c5e0300000000001976a91475f5f8bac17a00596d68bc6e352de534bc223e3588ac6cc917010000000017a9144daeef1a7ed4ec828f5bb355ed89062b1532571a870400473044022068f1b40ec3cceb5b1a3c505d9d293b0b1be80dc681bc8cbc0987012b2ed14b8c0220618aa1ddebddb128e8e1c18342f54c30b83c851407f1cfdb1f6432d04dd6ea9701473044022058982d0834d39f509bd6eb55c8bdb92eee69514febfbf2d45fee98f6d60978c2022029e24bc9e6934b871412e40df5748f5ba49b1821fc7dff681012441a650778da0169522103452e97d56d588ed38c02a1e6a6918b42c879b9777b2a87bd077741dd644fd45e21024299795d46d01ca7081d1507a95704206a9fbfa6cd67c74cf8dbaf758c35fc6e21036b7339a49049cdbb4ecfe50488d2c23ac972cc34495290a76c7b59a2b6d710aa53ae48a00a00010000000001016ea1520ec752087bf04e102b25d62e00003db63afdca529a099bd671f26e94be0e000000232200201901b0fe98bbab8e93628d176f4fb633c2fc583f4245ef098d7cfddcc7786c22ffffffff02b9bd5300000000001976a914ef366e1a71aea73aa732d9462ec3d48c7049515d88ac6df028020000000017a9147be8ab6554a9d4a93c120dc12818ca29784d449987040047304402206fdd5004558c01d5abccf7dcb709a82b7c7da303cb790062262be5bec8d6a17e02200f40437ee4ebae694ae0ff7f5e200c5d1c8ef9283a946be58f16a4f440fd9ff101473044022021eac248151aad3ca55613e2b6c44595a6e3056107e26d61777f20af3309253b022008b4bd66bd6d24f7dc59d75938f848425b8bde2a65a7b53f68a32462690ecfa90169522102458477ea4254764ba8cfdd6f0471bfbf2cd6605b615b7a25512ea8c206b28e77210327744c49530583fa135cb623f660c8564ed5965d3adbdffd697a7b5dad6f30772102087a9dbf76670c0069b16b2f5ed0f02a2b969e5b101c05b7ca26c0d0d5e9f4f753ae48a00a0001000000000101848142d4e18ad43e805279abbbe08deae38c5876b23e413fff98c50f96220f9b01000000232200201204848b0b04559fa3b576270855e0bdbde83eb4b6b1379df735d42dda76dd49ffffffff02134525000000000017a91458a8d3c1710d08bdaf10f46049d737807440ad2087d3f47500000000001976a914ef53f1e2e7cd6d04c2273e7a10e0ad71d5eb358688ac0400483045022100ac4b05b9ec54bc25f7defaa89505032b9bec156e8e7bc9570709e9b390a9581002201e36e0c92d3f380b89c3f8ac6a8c4a05382751ba7415bc09984f0812e00d512301473044022063b903435a8f7803dbb859f58b6ae25964aae99e6fe5071cf9896081e2922ee1022072e4d18687b4dbbc71f761244965204e17f39077d30df81a84409df7cd2c80be01695221020e58e98d0f8154105813b74dea73b95d55912426a94956c3e1ac826ef6d4b4862102ba50b24a1f30a7a2c0ca6957948e254c1f09888b8aa8f627a9251652c7b734822103116852d43602a87a9fb153a23891477c1b485e0ff6a110bfba4dfbd7ef5d9d0953ae47a00a0001000000000101e30345c553e41427f7c83e03c7aa58a3a716b0497150bb16e87e515c6fb47f5a010000002322002007df283228ff755111eb03bf8e1adc9947971d908b63fe1c205aed46b75bbfe2ffffffff021c370200000000001976a914e736bec47cbfdd7d183f55b96e3df2d5b33f2bfd88ac1c3c47030000000017a9144e0a8d0534610c782d930d1b1fd4d3ab81c2bd2d870400483045022100ba4529073d336437fd53101f15f4c1504a563fff64172b73750db860b040cd2c02206c44d11d64464b32aafa7c508e92f30c79ec52925a86c1e42c8fe617f3723d410147304402205a3d6cf61d133be35030dd2a7cf3fc5b92a55a1fadb2f8f31c1ab0ea31efdf35022076e69bf356208d215af86cf0e0d2e188a9fe20ae184979d7602fe4d6bd27f5c5016952210399633f45ff3844204fa558005a00e7ee37f3ae4d2893af1ca761d8e267d61e882102e6c4066cf88ef0053912d6c43def2b6e71562d8d7b1547607dfdfcf5f0899cc02103aff77738193c7c7830e1ae37d7c9113bfccd1a5e62d52a88d673e48e29f891e353ae47a00a0001000000000101d4b389d0a9c54951b3cd965c73c9621237dedadbdb5637b774b5c414d5176dbc0100000023220020c76e3e12abe99c1860254770f09fa74a63c1d0d13166ec78563168259a2aae97ffffffff0208210400000000001976a914fd13f0a0680b92cbb71c24c1945e961891e1b82788ac633688020000000017a91442d3105ffa6698cc6a06859eba2939f9f99c52f687040047304402206a54fe8f1040fbd039c1a76e5099f6b0a4fa31923f10542f49894c2a65347488022073044fe8ecee02f3c69af6983ba5d1ea158c776000d81c8a3ad4745a8fe0e7280147304402203218315b839412eb76973668e13355538b5b86403ec1c7855b388aa817d9376e02200577017a4bd099bd3776b383f7c37f05c19a6663c77f733b394a08acf13dbc85016952210320c097f0c43e1d874926f59d27a79bcb64efe61fca6a45e9e830178b677608d621022c65ecf52c760c666c4409fc68f9810b437ea9fe28ff706f3adec32217c391122102fd87c3f21e7176f25e8d4ed0dc2ba701a696b454b6b9d73a8d1370e119ee73da53ae47a00a00010000000001013c351a8dd2c7bcd2af868488581f96a6c449035f31a41b94efa8ddc8157439ca0100000023220020e452b2ec9b14818c45ed51ecb199eac7fc4fe51c7c68acebd6fc077b4d7adf03ffffffff0228170200000000001976a914f17c0a4223d052af0827758a40175984fb4e805c88acf61241030000000017a91477f128db037b12d11715bc4e77502e93528af95987040047304402203649542d84041a9bfd3d2209f68ff558e0c5eae430bd971ccca947fb47898071022010faacdce970173a606ec5898d7c99f776322ccca9dd024407936c8c2da6957c01473044022057a6411165393a2764244fe4d9c938f8eb1c1427ff472b593f34777358639874022018ae300333b5945bf4c32fc8333f0bd0fe825e05f210ffa7466a380a29170e8501695221025aa73ca1def05f0c1287f0e689ebb5b2665dc5e9dc1d17fb038e6c5c618be5b8210327578a8f97e9e843d2848528d536e617df77e6a30a053c6cefc0c44f71129b6a210279a53e6299a98c24a2e73904b122faf247c3a143119f3cecbb613cabf3e03aca53ae47a00a000100000000010153c5f530c0e7ca270ef63a703d9f32f377ab16dd63bb6e6104744c3c6fed3b210100000023220020f3bcd2e34452d210349aa3aa4012f831fe84dc6278e34fa362d6a732d17701bbffffffff025be50300000000001976a914237317553123df8b75a06e617366f32ca3f97f4188acc73029010000000017a914fa12828205ea3b2077c2df5b5a4f9c78f18a4c11870400483045022100e0d2c97df8b0835bf9ee30e88abc42c7ea64ab7d25f3ab77037de8e5dc830e7402201e874f0f057c0feafb6b79f832bdafef7f03b77a4d3e8d57703d8c5464ab42710147304402204a7d3704d978fc5e5b73a875407175bbb56fb868f8ae227332941e0e84209220022017bb4f5faa6c11d6b425062ec469b1eae5e4edd70be1fa6239844b00239da9910169522103f11532c249bbca53c0288bcaca48f2bc72173a0938ffa7bec8082b4cf1d01de22102f0209bc97cc714e7768481a61913167053e850693f1813085d38fe9e1914c74d2102f006a50028d9b3c71bf2fe6a4fbbbae8829a44c4c0c5b25bcce8dc075f5f720153ae47a00a0001000000000101fb413eea331395ff2af7599eb532225131c62db2b30ba16d6f753ce0b4af352f01000000232200201e85d8d40fb4a3ecda9599024a402ebf2d867f7905412dc7b6fdacc43919922fffffffff0297940300000000001976a914fed7ef57ca2f05ae1fdd3ad948e349c55948aefe88acec8853010000000017a914d5f51421482d574ba9779e4aa23f5a7167a693f6870400483045022100974a53bd33b49608ea82e5ad743a1c42b3e32faf376b2d5fc74c426556387016022073322517626e92446fc27fdb3dc07941e5906f18c71ea22713c5030358ed718e0147304402202e9a3da4233ac2af4aebb910b101f9e33f52fbbf2fb77aa2e6398112408dbb48022041e12d5a8f8a72d8549e92dd0319dd52d00d55208919faf49d7300c0d70fa13b01695221020a22234af995d575bacc20b07c34a332371496481664ce209b30df352ddb591c210354d8c066c5dca7252c4438e8aa4a9e7b4e519bd305d65d216e6c8b1272ab81db2102d2090212eae081bd6403171ce187394c71b9572a784f05b7950c66228a8e90e553ae47a00a00010000000001011b39721b329a94d95c6b1e29d6627ae5a9a212edade33c2d167cf955ef451d6b0100000023220020c538adfd92c15f288de11a5bb54a1eb79e64aae26dc72601786b1ec46c402527ffffffff0278db0000000000001976a914e736bec47cbfdd7d183f55b96e3df2d5b33f2bfd88ac392312000000000017a914af8adbd4454a6f58309758a343258e29d403b0dd87040047304402206f2cbb26c741e4f73af408aee5ad81f9bffef7fa1f8df4a43d7a0998082ff11402206f6155021ac749fd584fb5a99a03d03cbe291e291093390146c08d55e1e907b30147304402206e0805c00313de1cc5610a4777c02e90471e2f166765b3e19966ca48bade83de022018667a83bc8d56cd3492c011d184c76c6033563e3e49460f84a7bc880a549b170169522103f98bca092bb1d08e198b51ab20453f997a4eaa8f509fa3c46d576c2cd4bbfae62102ed8d81d46c2e16fe909e3521c1b165f65d2e00a51b36d06cb8555f756cc4ff8f21033df093f68d33b580fd20afd68ce51987129829818e72daec65ffcf730ebf8ef453ae47a00a000100000000010121656b8961b6a0ba2bf2ac61343fae5cd0360e269dccfb589baf1536c352f8e3010000002322002011543eb697a5fdb72128db325d18b6fcb6856fac914c3479426a987d562aedc0ffffffff0268d60000000000001976a914a8d9dfa196c265ada307db1b66f39f4989e9a5df88acffba13000000000017a91455f3ae18de4c04133fde3bd17edd8ec9e0dd1f458704004730440220746a62c3aeed3c513e538745ce1035938a70b2a1d59f3a039fccd72bed9025ae02204708e1ffb5136d0007ad0ea4561060cd554364d0de834ddc8c4e20bf8ee0189601473044022000a2b4649a08d20732a26e4d951145dce70549eefe5614e6a41b8eff84a3725002206655e826f3fb77de12267b376ad7c238d96c1eeac9dff5cfa4d6a6cbd647b9800169522102b84d36ad27674ec658636d467a2e06e0f4b2bf82b789ba1980623327e86b6fde21027fee7c5130a89c9940cfeb405885c821c5e86fcf99b32244d2664c69cb7521a6210292097283948e172c4f2167782df7e62eabe590ab1bd7a4b0a9b49aed69a8081453ae47a00a00010000000001019ed35c6f72bf33ee5464b119c2f6a1491958b02e09cc50554b4f46a8dc0a84c407000000232200209376c6592b1bbacbd9645c2121b0a7eb393d86b474d9182fb0f4e492075731dcffffffff028d317d00000000001976a914ca3f6048bd290d5cb19e7060f8250306e01b36e088acc1471a010000000017a914eeeb95412fccaaf7ed9b93e4880129b5940f5447870400483045022100df83d5802fd58d21aae7d0e32cbdcccbb10d8fbd08a30da5017ef9754b01623202204a0e6d663f9d9e4f15e1286143a7f054aebfb586c749e94e3e254d70ab1374ed0147304402203b1e39ee7831061bf368f3e91a5426244790fa39571b500db1ad603e5eec080c0220595e8ff26c319376e72415ac4829836d2f70dd5144bf1b69b4aa66f86f4ad7b30169522102b46d005d60346f0d33ef590e36058632c13b9d32447dc0fbcd257b1f400bc8db2102860936a8d838b49eca27439bf8cef52018120721dad722e9d41dd3df841e0385210383053933b991a9065e3596dea1747266b49206ebccd28f6ece5a2993ab359fcf53ae48a00a0001000000000101dfa04b7db571b8797137ebc3943fd72cde3cd1ad4aacb2336948e70e5489f30b0100000023220020a1090de31aa6b6fbdf7ca28b08251472038d4d23f18f44dc2ab4f8e90c3645feffffffff02af2c5500000000001976a914c88dd9fe399049866de14e3630ffe93ad7e7d34588aca7eb8f000000000017a914b299b2861a9b20f9c9ddf2c43606f6c4c0ee1f4c870400483045022100fe9f1396c12583e844c248580e6f36a1f5cf3c0b99203d6ac1661d5d41e9192e02204fe872b98a1cd3ad1ccaeada5db6ec6875bf8efe14e5b986583c5cc76460ae17014730440220233a4390955eb70ab6b2313140234fabc1f5e24cabdce4d0cea40b6790c6d24002202f56ce950b016812fb91e5ab42347703be0ea6648f6761bc578b6338d5583b220169522102c66f4b5b821f48a1e8ed8cf8b9578910cc1ddd05221b3abb1c8917d1b8e70c9e210206853fe1e170b022cc22507a571c06a30fc2bd5ebc4ca292c43fe3034502e828210274b54f534bc08e56998cc942c9a324dbb5c75fd8a5299ff04f3dcbf4bfe0f73853ae48a00a0001000000000101fc0893d0c5f674d2ab662130794008607392f0a7ded241abb9c08dd9373fa1e801000000232200206e7a996f4c6d2ab00eb7eb95399ad61f8aa7a3799ff850af71b69e621a5de22affffffff02d8f32e00000000001976a914f0a3c53992872d744981ec4ce16f7c400209970688acf8ad43000000000017a9142175540f88884eac0ed5f89e42c9306d2c27dbf18704004830450221008624af8f5bf0aa6c2bd2e43a5775885366411c037fb5cef1dedc6fd612ef73df022040b532dec8356ed92e710979a04a109bc8e3a88b991ffcf8cad07d73b15b8db70147304402207bdc4ecafc2cc078cb1110a16e9e9c7058c59eff60c8b6600e08aace4585b77902204622af06c4d7366bef5c248c661f96cdcaecc064f49b0e59b88c5f27267ec8990169522102e1be5699a5a7c106f4369d14d9484ce1460c034491a54ffa1d7ea35ec023d66221032200f94b525375431a4e105d3563ff486120de3aa6d7b9982834137d582be8f5210281f3bdfb15ba3f081e40eb6861d2fc1d04a0518d7d3714c48f900428d2eacd4653ae48a00a0001000000000101902c293ff8fe7aca59fc13d2149201f87a800d00f1d95453df6bd864c5c61d1705000000232200202eec4bde6533798598f9d6bc5ad420d10c96b18cfe6c0c3ac2842ca146e3d24effffffff02409c0000000000001976a9145d864bce32f1ba552ac493f3ebc2f956abab48e288ac1c5f3c000000000017a9146aad9eb06a84f9e12a497c954f69315b6deff02187040047304402200f3bafd1afa7020869670867068262f6bd673b62c8bff9a572f777e869cb105f022020f2df995fe04146ffe6213021a5460df8d23cd0ec375ddbe7326dc06d58e68401473044022054024aaadccbe6e2fa7a1d413168ae27b48e15a375bb6807acc492a5ba8b377d02206925caf59b3c1494eaf39ab135785f21210bb55657e91be46cd6f1a918dedf720169522102947e915c1fc1c26d37fdf9e6cb80bf7cda6584c70f68a30304196d915f1beb5d210351b30c49013d6ecc69a7f3780173bf37cbe0e5fa0d1caee8a7985cf92366495b21035122e2a9949832458f7a9b37e187dd5cfd6a14ddb05273ad56c55be58cf9292153ae48a00a00010000000001010aaf9803a9eaf1a108198243bec027586006e4739e23f9e36a28efafc1b62dc501000000232200201c169593c7a73e3b8bb246e27491b6ede4491075d2d1153ded4224866efb9b72ffffffff02a6940200000000001976a9146f7a2142cf97dbdf7109d01be4f4ff8fb32f8c9588ac55736e000000000017a914491ba68df5d2b1272128a7316f84b5a61675c1258704004730440220128364d3b12b0e971fcbe9692197c745b9641119ff412c4c6af9373af4d724670220627feb824d32755a8a03a31a7a7de54c89a9d1ec447b167889b712b32bc22e820147304402204fa63ec46f9019abfc7645dac23d882f134df9f626573adcf6ac724a84cf9175022076236fd0ba3d1728470c3c34dcfc6ff50879b821bb38695572c73fe71d1ecb5d0169522103d05a8eab976d1d6274a65a9146733626a1e8c1bed333dde52a34e431492c103a2102d41fa21604b727febb5fc819329f3b09f5d2155ed3a5ee33f1bf9bfedf882eb2210220114ce384b884c7b4ff15f5409bc28bc01c74d29cd83ef6e27685c5550d6aa753ae48a00a00010000000001011002eed725b3c6d0cc0dcbfc8830366a63ecdbe3de6661fc4e5da00e932069af0300000023220020c1569bd78d6e70eb904f37dd0b183b46a0972a0b686d37b2043d1fea7133518dffffffff023dd20700000000001976a91444c629aed74397ecc1ef4f3a91972d151b50f56588ac912d6c030000000017a91403888c03eb9c6c582728d7eb95350c5c691d561887040047304402201c1fc0072d52f53f8f4103cba97f877c3004af7186c8a6e4311b34856c84caaa02207b627f80a78b724e8fc594a27d2b2f1983b8e69ed3c21ffd9987899f81f542220147304402200f2971ff5c19191ddf0d5282b1eda829419ff4050b2e1e21528833aa6acffe2f0220410ce7601e20d6ccd928a9487df1f240a1f1d38abcbc5710b39fed75def445410169522103527958de7026d6a059ecaebebb0c3e671772b26562a9d2a64725bae91079cb4d2103a2f9f308ee9790bb91725423e8fb6875f3fd4175d85e2dd7c93e167b7a4ce41921027a77c5628919e38f8e8f156575027af44306565bf4496c7705686a2233e0b5ec53ae49a00a0001000000000101e55159930d1eed94345ffa1cb200c3f65ac3f5bc694b2da643141cff8e684ad9010000002322002065f2071f3c1730790101ed3045553042412e9ff07436a868c862c4eeba2448aaffffffff0209060f00000000001976a914271cac83f164e5f54c97d60208954e94e29b2f7488ac3041a2070000000017a914de0a07bc5692bc664aa0bf5e07dfc1982c43920a870400473044022003622b7114afe3caf6e7b9b554ee461934e207fb4d1bf902c8176198ef684873022046dcc550206cf47fe4dad1435d1b3c1e8b3347b3feda618b5d2bde8407fb6dd201473044022021f10aca1d9f1ec5e42e74977329d3db25b29cab5b1317965119103ee0df73ae022055fd1247effad72892d5aadd5bd3b606f301b34c030f854e158c8e48e78d1a6d01695221028601dd0b6b5bc15b24aa3466e0f1eaa08fc37fb54ee89fbbe0e3b79cfabb415f21025ca247ab0a784392431a5ac101db53cb26401b52ccbeea1cfddaa821dd9f88fc2102ac5319733c17011b15e81102fd67b58f4abf00e008df9d00f3f930250a33cbe653ae48a00a00010000000001017734dbd4c5186ff198c1e69bc014748daf237150d57d914f8fce15db6dcd2ee30000000023220020ff1bf5a54e02b9cc6599fc2a9ea5c9826faaea83edb0dc8174effebcf0074e8fffffffff02130f0100000000001976a91497b3798758d6dc2fdf3601058e4b06cd65584df988ac6f7820000000000017a914d0cf11beddad78b5695c065d05000b4f7a4ab6d987040048304502210080f23a32bc84a1ab2a27decde3880b4ecc8008ffddb22ccc6b7e30f27b5189b0022006b2db5bce602ba0dc0b1609cce392d6fdbe5213120bcb3d8076bea63ef578a10147304402203015b56217dc537269d748c774fc018865ad883400ca7fd9fec0fd290c9e32d1022062b5ecfac776cfa1faa63fd2b6c3a5edf2303b6d3223fcc8f311d8b6ee119c9501695221038fa70989dab2d6e2f78b38941836d80b188c0d3a1d57a310f27f2f5bc428978d2102b29f6849b1466bc74ae396e549bde6af99f898f3e9ab7162caa7195e952096b7210373d164c89ef8bbed8eaaeec788d19a32f267ea878fdea41709afa60c80d880af53ae48a00a00010000000001015b4e39f31e64f10f918e2dca84e2eca910bb36df6cdd050890ae1535ff4820170100000023220020046d04bfa33725d86ae99ff2b95b9ef14d3b72432b1b87b57e76169a769b93a9ffffffff0260b50000000000001976a914f1616f738e40ee3af8aa2afc06f0f34695a3892188ac32c174010000000017a91493320b09adfe1ce6b9b87d825afab53c47c41a9b870400483045022100b1a76d999b928ee7f217b3abb6b237644248f1c8928cc0b0df0705eb2a8b628202205920777c87b7a6c7a4a1bf92268fac7714db91a8ea17024635767b5f8898d39c01473044022042bc8803b3bda48e1e78c67d4c45750bd849b102938bb15e9c7561adc5cb3b4b022033641965f7d2948c81edbe616337526ad0aba4356b2ccb25586aecfb3a5d64ff01695221022891dac645f3c3492f52ed8f981c76a20bbc79a6c52488654bd41f046ea013232102de6514852bf9f946166e28780bfd39ae7150580dfda1a8dd065ed7e0e411c3c22102a567690faff8ae92bdd47d01093ccda966654d06140dbeca964278aba6b00f0753ae48a00a00010000000001014ead6b7b18c331ab83b33a933089e66b87ffa6430a9e2a4c901f4265959b3a1a01000000232200202bc252046a82446f0d0b4de975ddd0282913e984117d65ca6f7ec54688f6e9aeffffffff0229350400000000001976a914aedf7e296ff1331ef3550203203a01f131a3339788ac19963f000000000017a9147846f5670dd8e181590bac5f4e70a4be66db506d870400483045022100a05d53ab983bb3a3c18f3d35aeee7c4d750b7d57258ea3b39bcbf005d5b873a202202d07dd59a3efc6402cd6d3784737e2d494f0ed775b182511928703beb1d566480147304402202a8f48c3db17877c74aa0541440393ae05bcf4a1068d1bff89763a400175c49002200ee7eb559368eb6283bee4700146591cf98a223d1791253782fe9632600025740169522102b1bf584c0022bb92caef4edf64b7ec3a442b373443d9fd0e77e492b343212a532103cf5aa711272a2d2cc0e169058dea6803d13768f540c8be98f163b69e1857264a21038c012f7fe07c462b1a5c9504a36fdae52451e16f5bdf191f907d3fd9faa5cb4f53ae49a00a00010000000001016f79f01857e07a031d0c594d929c51aba4ad9c06cdf857b693275a3ec13a065601000000232200204fa0a0e75caabb5db3dfdaa4ea2c54230e6683bbb2dcf2b2dd0416a0777c2570ffffffff024f1b0100000000001976a91413eb141f5ab768d3c755e283333164a51b6b855d88ac6016cf000000000017a91444fc19eb405f3712e7ed07a19228f15267f8ca90870400483045022100fd9e4dc8168f692148093ba8e01581e059459d9b9d417e0bc4cd409b6b54c2d402202dd312a1e9f458c9dbed9f9e834d74763915b7b7de12df27eaaaf5e9beca70290147304402207923a0113119b64be4b022f72b74e1979ce65dc20fd9d89098c6cb0f4f0a5f5502205d41742a298d3f539bab599656e0a3a9b46bdc042de34965b1abcee461ce62190169522102944599a79d2dd1ed8923e062243fac25b992366a9618fb224b38a47c6908f98321023dacab40d77fd82f66a9b358cd86dd4656f59681590c832606faabc2dcf424852103d4890c9f912863c21fea411df4fa143f0b9ba3d5fd178e07cbf9ec055b937e5d53ae47a00a000100000000010169808ee81ee95c2da4b9eb64dfbfef547d5229339ae012d4a6d378ea3607ad000100000023220020f5b07bfb51eb44dc98b781d06577d06ed2d1ddd7701a5dbbcb577b8cea551e57ffffffff02d01d0600000000001976a91411435632132a0736280cc4cc0f5c87acf8dcda2188ac66e743000000000017a914fdeebbb09fec8a91dc7f41cb8b0f6be23a4f7ed887040047304402200512cae9875fca7ecdb5ddf94f2d2cf2c1c52f2f012ca61e3e13b4d3afd680fd022036bb9cd1b15bc558d3a6a7bd920e5fdf1144883075a257eddbd044a703750acf01473044022040bc49b335a2426ea8ad5d2f7848de8ab0a27436af86033f47030fcbcaf6309d022070732cd7bc76bdc42d1ae3f13de606b503936bca3508ad0c5ed7e906a7ea5377016952210351b1e9978d5582f34cf8c747e7c40d83a3ef0388d336e5011bd3a747d825d1252102c931fead05b6be16897d62c8a22cd79861c4e7066a593960df6d29d07668078c210331a8673fefbff3f707265a315cdce62c21db3b78fe6e887c949b5e5f35733c8153ae49a00a0001000000000101095f8a4b5066b2ae41f9ca7528b07f700953ab57193b86ec2c464223e32d73200100000023220020e1f4ed925e4f8e46e960812747a640e0148943501bd4ee505523230a4210aaa5ffffffff02ab9918000000000017a9144b36fba26c2ac02537875231dd9d4ccac6b5cbc087f0ac3000000000001976a914cbfae731380b3201fe39672b382890596a0c72af88ac040047304402202ec4157d9e3ed08aebd09b037ed91591011453625171eba87818090109e87f45022075d21a29e2cffcd156e9172ea54d415976431365a23c8fda7774b3b2ee5196060147304402202d836b0e02d622178bc9fd9a131b753874c370c814ac3ebf39be6f98e4593b0402202f2d1bf35b14abcc9b02118432e49c8e8d63f3eabe5e34d557e19ead636678730169522102733167d81088f0e85e66b4a5004ad6195f45ffe52b64e189b470a6c5e891bbc82103f0a556673a7a8cf21a9a74a64a0d5f5af2bc6f0817893c02c276ed1cc4fc1bae21027484d6d128ab9b8db9164cf759bf480dc1f8c94257880dfa04b061b49373366153ae4aa00a000100000000010149beac2576fa9a9ca825941c9069d10e4a4a1e2b576e73716851ffc51a36e0b50100000023220020d5085ba1d9cb49481967883a7295bc49c447d3ebcc9d8162b0591d832c6a9527ffffffff0290ec4100000000001976a9145733dad17d050af4b082041b93ada187f55a22e088acaf51f8000000000017a914556a80553a31b660a622d1eb091c098755fd6eb0870400473044022066c75b492b51fd13c46285f995d3cb5e010409e25c347a8d6e973df3a9eebb320220275f5fa2b45011b857dd3ea2eff9a1df44605a7bfa8b5907ede6db13519717eb0147304402204c8e21cf6ccd66853a81378e6b51e0f241473dbdd8865a74af7e2c345dff2d180220520a277b5540b91ef303a219fb886d905c39671102368476b241bada4ceeea9e016952210383ed03ff32740790861550830ef381708b360aeda786eca6701741447ff5232621034e7aab25847dd6fbb52c3c229c02a71716a77d6a2168332c4c0759fe02c4b66d210303b99d00b8313a9e8fa762775085220a161ea38c1023320b380bf74db026785d53ae48a00a0001000000000101c7a3f7ce2a20827085f4c6181c13ad5a2d544439f4daed98e791f869d9aa545a1300000023220020b6b4882f3d061553641edab1bc7075890e558de50246732f9824a3b27abfe816ffffffff02956f0600000000001976a914c37c70b554d09b69686880a4d7d551a61a4ca1bc88acc3904a010000000017a914718c5cf2497d5554744bd7d1ca8c5af592de0384870400473044022053a14e9c4262c9c842cb4a2527bd24e30b0ff27d1b664f803bc18b13808d69be02206f6a7a7aaca7b18fca085e4a63fcfb22157a8c4838fa01f0a8d3a69507573e0301473044022050f96d5050d7f871c271345a5953eac6e8aab9965b857dfdbf42f1b18d3e5925022069d0640fe97b54948a2ec5677a615992c0f87809aca4a23ea5f1c6787132d2ec0169522102a3153b85c0d6af6994f61cba649b2422aea7a6f5a89141384ed62d33b0e4623c21027b84b25fbe9c07e72c2d2d1bd715324e226f6cb24bedd817941036a5359cc0242103c21932f6e4ce7550fe0e0bf2b5bc7f1548bb71b28f1517b47b3214656f5899ce53ae48a00a00010000000001015e6cdeac23be1649740a167fb74c45163572537dc32dfc20e7820bd600ef413f010000001716001461eef5594b4eaf3c3ac22d00965e83b17478d706ffffffff02190201000000000017a9147456f77f1125236af2fc39cf476b22da3abe0c6687fca70a000000000017a9142303b02848fc9599e599bb639c3e3672c67250b98702473044022076db6d0f0ea543d44c335094794aa039c7a691990ae7508a66cb15a3acbcfa8202207412da106a040e22c7971f685dde96ea6edac0ec65c9ab384601e222e169838e0121020732b51ddce62fc72c143a3a9c0c9f51732a3a1a6d2eb6861fdd44217243d1b100000000010000000001016b322077bbf420f262baf0403610e447c1106f3d3ce0c1e08f5c88859b0c184c0100000017160014129bbc3199107a6f4b195417c9e684c477e219b5ffffffff012ba30a000000000017a914b65b74f74455b21e077a7319342c8ad886b5fd00870247304402204f4ff23eaf9088f41826272afb1f9b355f33007d6bf4e56db3acb10f2733d49b022052b5445751b1f95a21b1ca62b59749d4291e6ec80d800eaf2ae4c9e018b0c5f201210321f72bd8009d7135eac4367762caf81a78f6099507c7eeb60f298326ed3a807500000000010000000001020cc3d55ad5cc55b876119bb56f930a1454efce33c7e7388f24c426150b2fb17c0300000023220020134957ca36d83146e9772e62f11bcc21b7846e70c0b868abe96e4296a09c2c59fffffffffc7daf0c5351b1476287d303baab1ecfc3696279993f82cdcb15363a6a00c49501000000232200206f7f240102c8673efbc0f6d1b98863d2050abc2c8776e3ea6114b0d87cda341cffffffff046de90000000000001976a914da10255d296ef746ed6b2ca5188001c1a8b5501088ac879903000000000017a91453ea3dca4912d22455e7391baf280c48d2fe7aaf87d3ff0800000000001976a914584276e2bf7bdf5ece789d9eb5ef396d7a68ff1088ac40581e000000000017a91441da14f83a0d5e2fcb7360d4aba7520b06ba6a1d870400483045022100b0fbf7a3ed5eceefba29b8ada5043f83884693e533e02d445a21177d0cbe917202206372b89bb34c74b0061c2ae4e859cc9a9715db9f1131931945304a8e14521dd50147304402200a9de91f7e3077e032b937946959f8de13aed44e6693c5863b430c343dc90fa40220191aa34c781510d6cdb8a9f873d2a7456ea955d8cc38b3766fef6bf5a2fb6d6b0169522103cf2546f76b583e5a0b6846bef36ad1ac7b5d89e44616cc3708d7944475479a5f210314f81422ebf594c8e493adb8c812a014a97a03bf553308fec31f3bdaf32b05ea210372f04c58ec4a37d9100072414422f8779ad837807756a78da17a33b3dc04400b53ae040048304502210082c9e492cb7cd68cbbaca4e6cb98f78cc76e8572508d22c2580d5ed0e46a83370220718d55dbde02046a98bbcca599a327f1914c61247ed19fcb3c53a7bac3daec7401473044022015dea5ea5c11f388a8c20ada2993336e9b32388c470dc024f39de840363b7d6c02202a82483df2f10060691777be45585b1b48c124b1e57779262c4f68e4820b8fe20169522102ed1580811cead31cc8e13c08b182877740d5f0c27c9a4d4b1f52e08f6846e16921025037351b339b39053160fe390d8c7fa308fc51e32efb24ff250ebbaecc87f3572102b770599d07233cc8270d914f834fd13e15554bf9d0579d229cba9b6e2f39d6fd53ae48a00a0001000000000101345a073279a95cd2aa739ef9815e2f320b1e5ed7908bac91688fe00c8544f9b5010000002322002092e1fa48ca73f07e278a35b7b06cf48a6fd47bab097ee0b3825177c30177849affffffff032c3600000000000017a9143e175d556df4ad29e81d4f1428ecc36c19dd4bbd8730a654000000000017a91453f9a3090d27040166c017122c4e4a2f010a0939870f4c57000000000017a914f968e20eb82158ed51335227064d497f743d443c870400473044022079c02b36776d17c01a955d53c1f5826f252513212b7d6491f252ba0e5012270c02204d4afebca4f0dda9a6a7544dabd4bff50f7acc6e9fd3c62983d16d48a9c5e6760147304402206f61419c07acf96410d96e7fd0753c2dba848e7da3693fa9037f785795c028d1022043605095831146225b5726bc68df834c0e6f492c3a8187648eb64ccf83bfc01101695221027b66f5bc1ab6d60bcc09e1e36f587c2f2a7b96214e9dd795a5ad4807eddbd9882102944891b5ea24c6d51eccfa5195b9a59ff1e1c1a87d0a311e5fc882a070f46ba621039773b02c1b540d795429d0006101889254b0fe43e149db3e61f32e29edfcc10553ae48a00a00010000000001019bfcbeba31252f027509602767a11edfa66ba0a3607317653143bd623701ed2b0200000023220020303cf21556f518184ea541113812e930910bf7a3e7aa3075eaea39ad771c9135ffffffff03373600000000000017a914f8cef5943cef4b4e35e2bf982afb51bec526d11d871f5902000000000017a914191e82b09c3376c678f12fd996eb099a161ee1bc87bab654000000000017a914b14063a89aa602c00da1aabb619e7ff103969e9a870400483045022100e76edf62755bdc05e99678ff429db5daf23976b79c77c8162429d8f30d254a65022037948d1abf05042e3f75ca18bbab5b9319cb55f4d9e704e4126584addefbc3910147304402203fded9da3b5812104af28df2302a50d9692018e9462090fc994fc032aea557f402205fd857447e5593c8875bd637865eaf86a3fa2c004d6a19756a2302fb4bb9c70301695221035d7788c081b021144ff6280345ee6695a57c56af4ff39a1541dc37a81faaa5d9210210c7e4f8879d0f3f733eca1f7a1e0f0de92c79ab550db616f8d1dad210f1b1d62102b56ffd1fe3ccc264e3c2df650daff25f299e16a82b7d02b7d3549a40c4f5368d53ae48a00a0001000000000101b95cfd7c08e80b553ce08c7f0734fad174a273381acdbc8ce273891b3b057aeb0100000023220020c3e19bebab3838512a8ad3a05acf5cbf0817035f29dbeac7e6868ad0f90b72fcffffffff0370270c000000000017a914393306f9d5a8554c304c1a48c75fc0224d382c318791e713000000000017a9149bac987e313cc6dadc9064bcca9f76a3f601a99c87eb0a19060000000017a914bf452c795128158c2cfdc8697187e5e6ec3292dc870400483045022100ec298d1b86e1d93bfd2548b52230233f9d3399609f5a2e71a3cb7c9e0bf7840d02202d2609eb37b1a9b22a7441d5472286d693917721a8913b8a0572383ebd72a312014730440220016174090e46f7bda86e5b0546a6ab030242d6c5670ed8a0fabe5f43e22c86e602204e80f046cead211e4627d1c4e4195293cfaeeaaab06e790f4ec0750ffc64874c01695221023ff83c24e7dbf7b0b129081aa907056497d09fd311c9456f67ac5fc4d6338c862102ec40ede04fb6ffc1084e92043d51d317478a908e97ccb16175ecff6d00b2424a21038340f65a55f20dbd502add8ce985b8ed870d0b6873c585465a22a0bfa38c9da253ae49a00a0001000000000101a382fc9757f9c023b5ec45418c0f9e966d463e74c5564c27ed80056364adeb8a0200000023220020770a72050adb525f632603952f2b734e7acb199357474e56acf74d52d90b260fffffffff02804f12000000000017a914f8a284495a1743e3afbd8cd2d87d58a8f3ebb8768733b606060000000017a91440264290b5003f6a7a587a8967cbf517f349969b87040047304402204209db97436f29303dbce19f24cd8dd1b659e78120b377653847a9b5073df37d0220508b7c8ccbd9be4bc26b85d537d29e134256470c413ada5da9283e412e9af2cb0147304402207648437b499a4cb2a05526419e356a0b0fc713d59648fc6706a0940b5d0107ac0220586709a4b26f2b07d65ee6130ad1693e767071a9484522d553a26d00ccac3a300169522102ee7b2ea417cdea1c7d8bed32b636ef5deb9221c99284a739894bf1bda477bdbf21030717dcbf66b65d5ab2e137a802a5c01edee696c63d03f65efe746f2c933d24f6210201698c869a85a73384187e02192f2282136dbfd1c169d807b30b4bc81694770553ae49a00a000100000000010193b1cd8c2265a00c43aaea7b3608380d6ca62725b77ae1670674ae31c35a2a0f0100000023220020cf9ca70ca310fcda01d30a8ecdc8cf6f7f3102ef7b65755453e0137d4b8fe193ffffffff03e0750100000000001976a9146dd65e7237da6a32319cbe1c899799bcfacecee388ac1fcb010000000000160014e71ac7201e07dc6d353fb4690d954bf7b227ece2139a10000000000017a914dc6c8a321a983617728913826d09f530a6db8c46870400483045022100be9d9514a8573b5a0e0ec46598f00b8c66e84fe94e15457a48bf741820fb6475022040b1a8e8d798028f936c8b23cc45c95fb519e89d93b4d1bcbd058cc5d4adf1310147304402201117aa86a6fd4c3c8b91f3db9a8ba85d63ba5b5b840e4a1614a154c403c09da802201bb1feded083806910d218efa83054f20f19c9520f5723e55f7b856d4f4706290169522102968671e508c4223b08606e99180bfd6eaca98171a6cb55edfb42d0245e687367210310c6589f7a587b498402429fa4d35cd8bc0638f73e766f807aee18463c1e4b15210214c2da3396fb26a52348257a94d32cff9b43cf69b824793b426fd81b173d43c353ae47a00a00010000000001012a0b40092ce284a63db128091e8afdac721ce733e1e6edca9e5f63a48ec0dded02000000232200201121cf85d179c1209fbe641a73d4fafedfa8c868343ebc166e8177a39b84d903ffffffff03a7870200000000001976a914880ac6003505ea057c7af66144aea571ef3bdbae88ac91f071000000000017a9143e8d259bf1214fb89bcb5c451f60f7b5c9a3459087b15828010000000017a9144679b07e1eeff03e2a5993dae2da87a402bc7e9d87040047304402204149f5d9ba0b29d2b671dd752ac2abb07f25eb72473b4ea89f0eef7acb21b4ff02205b5f3e1c33df519b158cfdf6161fca411084c93cf79a60ae3207b911430919cc01473044022028bb8d69e171bfd1d8a07548606a074412f677cc584f52b3504e00417eee011302201cdf6e2a00bcb4d59a64b9bc7ae691e423710249e7d9a972481f8a655fa9325c0169522102e79392e475e92b3ab2457aa30882b00903a1915d663d18d6e75160914937727c21021b7ad0f9248a1e8e0d3c53c586bfdfac0d737ec731172b146b46aa8cc57e1e012102eee29a5e5c46843a124263f7a7d6fc2c1dd92e97095e9489607263795fe6b12f53ae48a00a0001000000000101b694c236cb5faab70dfbdca193d6f8b79a4939876d3c05b48118f13f96656b9f01000000232200205239aaea049249f12900f2774b1428c357357f5ba14b813d95a896291818e2cdffffffff03bb1800000000000017a91457e70bab7b09ac19e12f436c5fe6823e1d03fe9f87b8a52600000000001976a914ed1d851c7677852eebc84fcd681fe38ff4fdb4bc88acdc2ee9030000000017a9142255072c122a3a247300255c2386e1eb939f76768704004730440220537b8625321bc2f4b34d0f5d4b0ac30116279a1f160c57835454516225d2f498022020676b67351c2e01dffc23a020489b35e898a51f352ca04ba248672640006163014730440220531473726e5d26bffef73a9931f96411ddfcef7d414ea03764b0072c3c763af402204159b1d76b4ed3063ec4d1beddcf49563a3ce92e45356b1f79bb622f98e77a120169522102dc7c6bb577ef25aaeeb21a854f6d33b9088bce01c8b2f05a898014ca8f25e6622103bb3b1ef89ae530c709f7f661555eea13350c8221a15bfa9bc445c76e220515462102ed0d6650dd6eb8edde27dadd55cc816ffaee46fea12f5277f2c7475c29e73d6853ae47a00a000100000000010136e81a18667c373c1a3871a984b8445eb15c00b7675f7529d7a815a32f1b0578000000002322002098754ae11c5e23366dfc237fea9b889fde11734abf7321260628b20c48bd6333ffffffff0264305300000000001976a9144e2cf9c86d58665d5587276416b28ad2d43b8b9688ac94e7d80300000000220020f3410dd80c4ff42eebf9e7808cdc4068b1f58d5202b5e47cb7114755d621340204004830450221009f6ed60083bffefce07259771445116247f220f7506b5de94528b54086ad2699022021ae66771d3a9df5b9ba7f87abb583f17e335a056ad06deaf43f8835dfca645c0147304402201e429d8c2eec29483cb8fc3b6432ae888941e99d2638635392f30cc9427ddc03022079c1c5846ea22730f486b169d68d579664efb6729332a1bc0c1caf116dc35e1301695221034742fef0e40753db2fba2eb4e61740ac13fa4c8154a6677c951fb47ae7d8d5842102c4f2478aed3b8a519cf05f9277dac841d226d4d5688352de7643d9a63179581f21037ec1ff086e8f7b14adb5654d897522e5f34b086b4bfbecd026182cdff7bcd16553ae48a00a0001000000000101027434ad9d151b01094e9797518dbd14c22df293cfc6385fb44c99a9e7d1518e020000002322002082fbc7463f4ff79411a83851f6ee4b4b2d9b0fe65419d0925b8aac9fb22a9ca6ffffffff0342e20000000000001600144214ed91ef661530cc0c2b02801f37acb02b2686058903000000000016001418b472efd9ec92f33a8487c59fb188d1b518a48d10061d000000000017a914bfc75a83bd2bcf820354344f545c12aecfbe9748870400483045022100be991fba25158712b5c710ef21dd640ea122d997fd2699e80bac26e61139870c022032a08ef8bca97e303306573bc4ca833e7d77194732eece0eca1dd558beb14fc20147304402207d176bc5b51f87a466048ec9b132a6140190da5bc3fc804d2818f883c8e0d817022060b8da5985893972a23d3b7d082582841f7e13e398d1835fd0dec625970044720169522102d098f11abaa103f09f2586577fd1c725db505661610533462487b72694667c842102bc545a9eef196bee7c17fe2cd84778de1647a5b3f26e8b78cf5816f0455582ea2102689e663f809bb43c4c14cd585390ae025e545759bccf1ae4c7b5f9bc1bba277753ae47a00a000100000000010115a0694a9b2ef3b1813302b657f32aff1eb6a906bcb2dee6aee930f3d47dddfd0200000000ffffffff0375a101000000000016001445250523bed7c1aed4fc4dc02b95674c3bd68e2c5e672400000000001976a91461376ab13acd91de093aff2f517bfdce239a417c88ac9b9cb10200000000220020006c6280291e42d776e058c8f1557955bb47cdd850c97f9b0c341e23d859513604004730440220376141a4ab0550d47aa505b06a30a7817f9c645489cb6c93db3ef61197aba5cc022068c37acb2c4481c9dc88a0bfe7f7dbbe1fdd1f31892d39b5e8e34eff39fd4cda01473044022027fed6e0b8f729607f13b475012446c26ce8c70a48184e106605abf6375265d502206c80122e6885e0292769932335d5ff7bda1400c6e8a51f68b00077ef77be0208016952210248f94ef70300e83d8e9308eb41534fdff4e9e53150b63bdb4896e6a1f2e002b02103b5817e913a6ed8a9373dae8a92c12f8964121b6037c7fa7941991adcda88954321033c99cc373707931965677d8050e0935db231f051fb1771437f493c3f0350638053ae48a00a0001000000000101f704f02d12c350d9aacb2d25dd147fa9d084d7f2cdc125fc23de22c3d2622fca0300000023220020e0068641ec24723deb5721fe211f27afd34ab1ff3f581a39ca32ec06442cdec9ffffffff03187237000000000017a9140ae6e964406757c8b24e1ff0477dae1859af5972877cbb540000000000160014e4fae9ccf17fce1c1afce054ae84c89ccd8fa16839884b060000000017a914ca4598b31c2bceb987311f05c3d29bed3cab8cbd870400483045022100b70a0aaef5e9822b657c3a9190be7bc62c2137f59162c7efd2e639067c262a750220752933ac0d99b0a1516d0917e75bbda67380621fcdabcd55f9cb940d6008da1d0147304402207954cb81b9c70a03cbd191fcaed911e534b8085f7993e790097314a4d683c59e0220592dff15ee1d6e0ea9dc78829155cc799ba74718d8bf782724056deadabe9a5a0169522102e3046d0b07801dbfc98612b00b2e8561755c8f226fee11962e81fe47fc21322921036c0de09bb23a7c4d639daa375a89b23c1d68c7a208f90492ced88d306519aaab21032453861a8b03314662abc278666f3670ea9fc6847711a04e10e51c16eafb8e9f53ae48a00a00010000000001013a0b752964c4aeed01d52653a4aa716dcce3f22eeef53b9acd109d35d4b9a50a0100000023220020ea857579cf812e752cc3d315b825ac640eaabdacc0d7e568c4f2fa5cbd8636daffffffff036ae5000000000000160014ad711b5122b47fa28d015327294e0b2d0cc4124836cb01000000000017a914ea2c393253d3b3f2e16f6d8592a753ae835d519087f71f62000000000017a914038e9a6535db01e7f66dfbf0ec212bfba29e2d1e87040047304402201d220715f16b6e47f01463085a71e30456509eec83a30de88bc69b7702c7bc220220583b5048d2ebf9a48bf0d6273228b65ef3a7d853f1a04f465d52df2f52d6879b01473044022038403ae2f8c4955e4b4cc4ee45cbc36ed60e3cd51d32a47e6a847e6dc81dfd290220623aceea49c3b6ae2581c384928b2cafd62c59927ab0beeebedd55a32666cc4a016952210298930999aee431b9e5b4a1aaebf65c4b7d1e7679d4301120c5585c1e65e0ee4321032c12ca03ddd70dd4a08fa7b9872c5888c8f8e41146062926100d2b69f7585c0421026f461862859bfb96e47ece97c8c30ba3b71e3a1e0cf7bd9c9568fc167324ea8353ae48a00a0001000000000101d58bd11d2cab48075dd20b85c6a53e367e743d470821481599eb7f38b463654401000000232200209d8980c09ce19c8f2cfae789ce67a1f9497d53cfb43366ffc3643afc34f3be61ffffffff0309d001000000000016001422113e5588d016aa4d093444a4955653fcd08e2e8b9103000000000017a91488b63722ef23b2797a9ecb98a4bda1f1f3091488872d477b000000000017a91411b677c697a909bdb02aa92b0d9f753e5065de7e87040047304402205a2efc43de5dbf6f8c28210d2431b34207795c119963eb027b9a53525869ea5302200fd14c34d69dc10b3ad1d4dca4b06448e92a3d69f82e0e3f24aaeae029448f450147304402202cba62ee1e9e03c2db19109356ce1460bcb70c025282331776598f6eb2bcfcc602205a7b94a4ed1a3afe1fd6cf48c6fbfd6313a79ba62da9e412863871b21ab78e2a0169522103bcbdedba29bf8c94ff2db94343da6aa2316edfa272a27a1d7e7bd682651a21c32102a2782811176439282036b202d71d1d4db6cc3a212678ff50eb9c02b0c9a0f45a2103db02a2a703f98d3f33d19fb8c5b6b06204df1d096c2b9a3a982e3cef646e126553ae48a00a0001000000000101c15983382938b5892d3c4ccd60f7d7b3c08014eda6fd480a53a83148872c2a460300000000ffffffff04be1200000000000017a9141dcd65f2258265f15151cae4cd367bf305b00ed687ee4b0000000000001976a91410dc0762ab8232a2defb95fe59b83192e79b0cd088ac57ac0000000000001976a914d7e8c4e5bdd1c649df16b40a96221bce8e2d0fe888ac1d574204000000002200202c9bed9e7419f68603f7a2aac2cf6bdf760048c4d41c6bfd5e139db60755d4d7040047304402201e463536766d8b72a1d27753ce3e4211a8aabef90db55d0acb1e212bb9594008022004456882f63ef2d0ced7ae594f0a6224ed986050015d68cfdc76e1d133cf35030147304402203165c4f49c2d2a71b0607cc329886f63971c6e153831f09f4f4af45476165e0d022059eb029e6af0ae06e6312de30f5e3d7dd44beb8d742670b342c9174f65fda5b70169522103ff99608d42bc463da3ea374519df855049ebb79e5339800ac852c9a0dbb8d5432103faca449d83901953fb8dbfafdd40a1926bd4150c2482679af57c0d1d5226a60221027cc9930ffc86cf3d34e5d4090576bbf76740bef4b9b251fb6e5b494c6edea20853ae48a00a00010000000001015174081a64e18498bfe8200202f1ea80d356287cc1025f6251d2c6500dc235d800000000232200207fba0e1e9e41f2e3667e3c7168299f5be3e64e7e5d5f47d75fe0c18f126376e1ffffffff03525301000000000016001480562c44d8e881591244ce178a982a901f472098439d1d00000000001976a9147a2ea9b297d60af7b4eab901a3261e13e06a862988acc66d4700000000002200207d0b3fa23a641519456ebd0514478d0274727b5113e5244c405d799aa0e9d144040047304402200ca43742d411ccad3631e955ab03dea90485b73a39be1b7a4b69ea8348aaa5af022016db0f529fd4a7df0bcd7d4b338b41be2cb91fd36da18de51bedc292366f85370147304402201ba1ea233d66ddf26eafa27a55c79df9c4606481007e4b8bc2a7c217e567020602201189c117d508f8c19ecba246f659c4edbb1bb1a6f7d8bc350c86f642b17563c201695221020cc11923393dca06ea649e71a283688cec0609aedff6df57c93724453ff0bba02103b55839e9142631fe85a41723895c93c02e811a282ddc5dc1449f07dc2565dc1a2103a0c214e0843dd20c4484dd4f55933ca74a91f9d5314e66c81e25b214a1aa325653ae47a00a000100000000010173c1b57c6591b3cdd45051c197c492b9b5c6e0a0fb4aa5c90219c231930a26c20100000023220020f2c6d8c6593422f12a67dfe2d779183cff785fa109cb21a948eeffff4f5c72cfffffffff03a5900c00000000001976a9146d7dd67cee9ded13a5ecb33422fb235254c70a6d88ac28011100000000001976a9147c54087875ab44c134611ae66e256ea531c9d44888ac086379020000000017a91481b8b6b88ac0ece6d9f983a91cec7207961675d9870400483045022100d59449a3b26520b475eee32aa14b4aa89192f3f6b281c292b81e129a62b288940220330b86a7424de371692fd1ab167f7570ad8e7672970e5f9f3c0855013b0e5bea0147304402201bd2a1cc1be61195c62fb1869144be8a1d2a0dcdb0672d756be8ff60341e8d2102201351a2f167a8b59182a93be6c6442a16842b7bc53049eb6da8ca294dd87f7ace0169522102492f7c976205a16676acfae5bfd9fb989331f0bed73ec220dc9632310912959f21027726e14d50ae279af6a32f6f89a4fea654a592516d53943b5ed9af545af532c121027b225e0993908d74e24ce2c4e545f9c36e2675f22618e391fcd6615d675157fc53ae47a00a000100000000010181a9af3764fc4c5d1fa87772f78a5156ca5a8eb4e9d563a8ecc3b0e9f55223050200000023220020ae8ab26f479746f46aa2abe873fb94392babc55cdd3ad6525c6d86b86c2bdc1effffffff03309503000000000017a91488b63722ef23b2797a9ecb98a4bda1f1f3091488875cb105000000000017a9140acd3e9b0b24919249aaf113d5b4c39ed4d5420e870e0da7020000000017a9142bfb90879e50d03c6907856fa5cb7dc079c299138704004830450221009992cd2acf058bd8b7262b9400ae222c351ccf73aca500dd428ebb2dc552a83002207c80df4103f4b01c59c5f68ff0bf3ca784f4e7eba13114fe0407e5f1222a7a5c0147304402205981d0c15c4b13b8200901283cd3402473cf6f0156aa6ab8a9ec6758a125383f02204afd0d16e6cb235862677d7adfc8e6a80416f963da7e5ae9b4899d7c942541cd0169522102477bf1db296e336f2248b1effe1bdd32e3f06a49495bf89eb1fbbddf1194068d21020b0cdc9ff3e82e8e3ff4eb36ce427049c988b7f27096181ae34c33ef5953c0a72102f45ab513381e9d323679a1691cf4bb508b0a961c014e34f495052bc14da49c5b53ae48a00a0001000000000101ecc16ce21af56e83c4db9f3838dc3a47808ba16e6bc46d8e2a622057eca4253301000000232200200d826922265b6c3e6aaf8f2894e80ad9df5761464ee7170925b6c61af0bc8f78ffffffff039b9903000000000017a91453ea3dca4912d22455e7391baf280c48d2fe7aaf87a14d07000000000017a9147f73da4a92f055bec34cda307d7bb0ec10b6af55872cde32000000000017a914a7161abc53f0c592b1d1bedcd5d33751bd8af8e487040047304402206283c98daad48b80b31eb038cb8653124af209f9d00e0fc236c345b7456531f902204a1a41395c2a279c9688c69f75da000fc79f8f030e6ebce45f45f422ed8a6b3301473044022052f490a2e605c11f1414ec28deef341ff01ee278e3d74b086e86ee28d80f50330220588582b8c5c330eb6f5a8ff334a0a3da22f6b61604db0034f65a22b0b645097e01695221033e8b3e7c59b9029b25d13c8eca9d16e6de3efa7ed6a1fca37a890ad924f1a6e021036f0c54e56b6d96a00b50f18ddb67b6d8d147a1fbb5dea4b0effcab65bbb831902102c0f6f43b1945f8f219e1f6f122835ab06f17df9895b9261d56a53d861bff63c553ae48a00a00010000000001016340d26d8c5d8608b7c69530decd8d11af01f63a3f1ee3c39d27bb10d8283b0101000000232200204f8bd174dbe7697ce87d8be00d24a199178a36c309d45dd2cb6bf115606649bdffffffff03a86100000000000017a9147c6ede017e559055d4bad7443e1cd6e5f350b36e87809698000000000017a914254658f9832a4de856aa4c88ecd15c2e7708770287dae25c050000000017a914aa058c26e899cad7f3421aa1b9adcb74e679ed9c8704004830450221008e3abccee7057e1f9a02af533125bd1ebd8525d31a713a0f3f62e1ea6c2e670202202f32724169e02ed29559e28dfa57c07738ed633f64865c8b23187403b63b5cc60147304402203f6f0ad6ee3958cb31488edfe73664747e4638aaf6c5275e211e96b5b184c7ba0220747f6328708fc97902a5f443885774f08d2112ea278ae4504d4aa86c38f81bfc0169522102c8a449a58784b4d791d86682c57a0f052591bac8e8db3f1dd4ac311d6467b7532103cefdabc8da644ed206333f0269823b5877331e21f6ecb6108114f56c8b39eb4021025a7052e9156bf954ab784fa426949c76a56255ef32c501a7a4d5a324bd52bb0453ae0000000001000000000101ac6fbd96de91ccccf8a175c20cdb6d1cb40e23d3a498bff63725052375ac297900000000232200208c63126671ae2751cae3f10b13a8985d01226d53d2a5f5b3865714243f4c6f99ffffffff03b85d03000000000017a914a78bc7afb6d2da4eb4a73a2320347f73ec3f8d8e871e3c0800000000001976a91498be30a8cf8d7416084e9e5bec7f6562cc429c3d88ac454f470000000000220020eae987fb0090b23f20e6b57987a401622bbe9ba49bfedb8c223eea01cbe46bf50400473044022019f3b89d33a8c1e797751ccba74c4a5f028180d8631d05f3f860ef208b37c6cd02205febff04e3f7f4100afbf2731d7b4d8ab385f280a102fe2af47441c266678cb30147304402207b29dca5ac009b797cf01ad72ed96483365b828f552fa5469ab09923a930190a02207bcbdb5c84beddca27462bd8576d9c999a73c5d118880e66d388fa378aded90e016952210373d590842eb2d85bbacf4c15e4e72ef07c7cdfd10f029e0ed24373ac8f17d4d0210338e6003f5387adabda32cb180c29ed784dfa4fd77059314742d40a7382b1b918210275792370e203d9b7639eae850c4a67ae8f7b12c970514fb36e36ba5f41d9d54f53ae48a00a00010000000001011a77cd342b311a386c84c9542d794f0f4803a5bd5b7e9e6fd99fb11032abe4e51800000023220020c7a9be02c55decd5739201198cee14a0eb49aef96936b034ae876f6e546e2f84ffffffff035fd10100000000001976a9142f875826cac1523ac32676c4b74237d97e83e6c388ac94f802000000000017a9147c90e724b05d0ad7994d38fc1d7a44b82fa57a3487aa3b70000000000022002089c5e568a3a074daa56f7a79aab665a687043f952b2e4a813d201ec8e25ab15d040047304402205a6833e161d0b44648043e7e0d7ad87959ddcedb2e8b709d0697ecf402913465022059e49c224184a1c3c5ae4b248ca517c34dfc2782fc5cca81f31bba6c51baf1dd014730440220587404c14700bf7f7958206f05150f1d9354d28bb817e23dd3e02c8bc11d73bb02203484dc5d09e1ec1629be513bd54e98d693ce5e5c4ea79b3b7c742ae4b9077113016952210208a66ee8c99dff843ccd2bb4075d6eca2f1d18d49410ea9972aeb5e799ae8d252103375a3f187873be47d06661fe8f05230abdd6c250373f9909dac342a6d36983f52103052db5550afcbd84ff2fd9055e757a0edea96503e484720182208dcd0981713653ae48a00a000100000000010118e3f6dbbcd1ffae432416aa469831b677c2b6f40d0545c3d6e29ccd542d768e010000002322002023756ff05282f7e51bf64643fe6d02ba743e1d9c6a058e7e70a402271c51ec07ffffffff038c45130000000000220020e91a6bf127c486d5ae41bd94b46ba94c2d91aca7704b01bed577b8588b15ee02190118000000000017a914cd5b30dbe97b88654794a91deb078bb653a64b6a8747292200000000001976a9148d535072df0cd808b9d7fd6ea269d98c47b7057288ac040048304502210084986bdeede1481901b955cb4a077f1575f66485f2cee39b0d6b143d13a4f87a0220342d02015acbe357765249a4ef5717d7b3db7f8cf27b3c639821ba5f725ba1280147304402207a72734bbff8030e42393ba813ab72b85a06f1e98c37751bfb3b84a55330e83b02201b977ee1b26586445fd2ee02c2beb4bb809f69ad064d2173a634c63a7aec6cb601695221033af2e91b0f8d84f041507f175c3ee0b937de9285d5506647afa9832f9f27f67921028e103c02ace7e80c1a1c88fca8cc900526e807164f6bb9bd2f0f994986fa80d22102aedd706b07bc23e1a07c675dd46b7a3a90c1250e3f6da77f1a02cdb82d43529553ae47a00a00010000000001019143e15225107de61d4ed906fb52534a160f38ad5530affabe191b4e9b2efd490c00000023220020ac88d0b1aec172a2e55675d114e5d6dc367fde2709d0c8027b9dedf67444b074ffffffff04d988000000000000160014a16b4a5bcf90ae7585d97181ebf95df2a71f1192d3d100000000000017a914dcab1af602d11f350232332721cbd536d414bc6b87d2641c00000000001600143e803dc4aaafb804208d0edce1bee4340d2b100a2d3344000000000017a9142362df7e2dc29b89014a04962419d2e1030d36ce87040047304402200de6c5cd3d76cf64a1ed69100e6dfee73945becf71e07d47798f3a5b05b45563022018a177b49920118b2289c06ecb365ea5f163294199dfc7605621c2f2bbf5c1e7014730440220274c937bb5ad59063f828f21d19e233d28ba36e21c98a44cb5b671c6d990f69e02200be45f11e34137aaf5abf76aca0d63b522fe7d11d008f5ba22e433ad5e1a301101695221036aae313d369a3a600dab1a995ef56cf6e218706bac08c54162db8e9a172393a32102f58371649a3dc82933f1d975274a050a9376f664cd6a00ccdf0343b1fe9d90512102c0530fa1588d47c0e47b693cacdaff831480aa72f8903afe9eee38ac4b8c3c7c53ae49a00a00010000000001017bf6e84204c929437778619e4b27a78c4222583868053fb5bd37c062f15cac3c0300000000ffffffff049a4f1100000000001976a914ab374d91470025ed6ae5b5b47d8fb2bb9e166ee088aca950240000000000160014d11c13179ef7129c4d3a14e481ac819c431a7c08c0c62d000000000017a91451f6225ae81034d32083c58a706df4f555ca8e5887d39f4601000000002200206ee1d30d745a82ba9fce575a2ae8426101ad412daf4556b212d22c79686163f8040047304402201c18ddca6116c5756c2cf7cec158a8b362a1ef9a153c9ce473b03f9da153eb9d02202d7dd5f397e7b1014ffbff05affc70d2079529d29a98a1e3de5aa251b155434f014730440220152422db925e65ebab2ec794ec8f49cb0f3ba112fbd7a3ed3bed217cb6490a4d02200dc6830baab7465cda6bb1140998e9bc97cf520dcd6c592a9bd5aafb6ae14317016952210229b7b2c95d899fa0ebfcfc024b77f8660b3c0d45d7c6542608d97e749151d9cb21035f22c971aa24709a0f2f20c3242e2b984de175e2b0a84e68026e4c4a91f01bcc2102f86636b37d980eee355f5a8150f606cd4220a7871bfd44bdcb097841b84b24d753ae47a00a0001000000000101bf6f6f31032b1c2231df1dcf22696470ad848971ac2aaff584c2ad13e5df294f01000000232200201764088ddf3ac975339307edc867dcd623f0a4aaa0d5e0841f0592cb48b91f22ffffffff04ed4f0400000000001976a91487da394e763cc7763853cece11e8e4fa67a857c388ac7f090600000000001976a914b3565d4e2484b40db1e2567efa754d428ed954b988acc3de4700000000001600140d2b01732bd949aea218bd390c770a219968678c30ead2040000000017a914c4d820f33235196b0088448c25dca36513f98fd98704004730440220539642e63af2974769e5b8b23ea48e72d7463c94a41146fa4a49fa93b224f827022007d269c81eaf1666b7a394dc1925dad1432a7050b73e5b3c866a57cefa3e72020147304402207f144e4a7d8a8b2ac76ba589148c2a61f136c83fad950290eed95c85bc600c750220414ad717cbea10a430f592e1221c7419146c07e84302dca87c384621778759d601695221028c67e45038231cc73e17172ab2ea2f99bf2eef34168e9f24f4b55019d5c01dda210290f3637cb7e1fe84ae33ab7b87d7f63e8d13472d12fe747f9fbf5d2d3a4d4bfe2102c8f3c1955f80f5af43fb14d4f041f200058a14ab53b26325bc35f7e456874c6f53ae48a00a0001000000000101630003818cdc2629fdccf925deb9df606b80d14b31e20996579148046b886f660400000000ffffffff046bd700000000000017a9147436cdc6d87a3eb4ec13cf382589cc6a71565e0c877b4334000000000017a914ecb0680dcc849ab894e43f7fabcd01102f31fd248727a27900000000001976a91466ab8332f72996e886962e6618fd062a3eb599f588ac9f9f9601000000002200202c3b560ca3897d36eedb2567a57db53a1f184c45cdd54c14bbde62f950bdf5ca04004830450221009f9d38f95efbca7702b0a0781410c9d3edf0439faa2689001fd9fd8a047a94550220539fea7f1bc5bf97746f949f7000cf241e6871ddc70d6ca71d50512dc8e8bafa014730440220092a74415c1fa0fe79fd2db6a8227250c58c6d39272c4b57cbcd1605404324ff02206bc1502cffec16623376c06f306a5a68cad613c1dcb5a90502864e48e20ce1660169522102681201e01250f2ce4aa683df252e903c40bc11ba2e9b17f728f6a3c72f9a92e32103a028c6704f0ffd54d4a120d6a95bb79d3ed892c531e0d608026481343f10bd2b2102a92d637630f799f560e2ec256a38242a473cd0d156745755ebebdbb3620daa6c53ae48a00a00010000000001013cfb66e77aabab3713ad3c5cdf354a2b6b2bd7e2cabd25cbc806df29bc2810f40100000023220020c97f51fc34035119d651b2393db1cae1a0017c638bc2963082566b86767ad08dffffffff04e58800000000000017a914ed2af8233552111f88175bcad91dc6d5f9c46a538796d70200000000001976a914804650c13024e8d81ff7357d903ba7fd3c80092088ac071e4700000000001976a91493ffaec640caf407b02edd3bd6b9c3602dcac7dd88ac08412e030000000017a91421cda7a85f89cd794affed25f1c71fa7063f6ee5870400483045022100c9e61f6e3d910558d7a367989a357ae3b3d367067da82e316cfea2598be9892a0220760ab5bbbf2582663d1b9a9462e60d979dc807d624c43dc4044ab0d760bf6eb50147304402205a3d320868dca3152eb0cfa91b0484ef570f28343cf9442c758c21ce5b1d91e70220510f188aa2c99e2b63c733a666724a83db98cd8fc33dfb17acddf0b6e5d0f5a70169522102092fd1c945214eaba8cbefaaeb73c564bc8ad5f477189c65adb8db91f8ece07b2103e5e133989df6f74451bb3cd06cfad2a981acca23b7d7f79d771414e92d67255421028d05be783da42ec3a93fe18279705a5455f3527bff4e901fba5cd3dbd8db8e2153ae48a00a0001000000000102d025d3df7e84438f7d3ca956c39c3771adb9a58d594703dde26ed67432963eb50000000000ffffffff7c7f60dfbc1b1d86842d705c512415bb2c682eebc305a0e9be9fa3081c6ff19d0000000000ffffffff02d950060000000000160014e1384cd059630ab93a639c2c384157756dbea83a778301000000000017a914782cb07d27838c746bb86403ad51c22695f1c9ab8702483045022100c2dadd4c918c525196e64b4811ab5a3eab582b8c530cb391098455d53b84c914022074dedae5f7bd71a932539cfabe98b182ea03b8276ffcb1af7e91d853656d91ff012102efd112c679c43effbda264a9562aab37b9e1c8d04f3fdd96a1bf82b484b62c7f0248304502210096808e1833d6e2c17029cf90064ca40b5d4b0d1cac026f5ee11797c1786e518402205a1d16ced8fe3150d77c967ae3b6d8fcc255c9a70473e64326401f5da53345c30121026c660c8751a1e65d027373b56d2cf0de6b5156f969487536f91b1297a287e1620000000001000000000101c8af4e538f8d52038889257e8042331243c8a72ef025273a3dac9c896f38b41b03000000232200206f0c8aa44e66b062a8f53ea84b6ca7814690e6c3c1d435df379da3e92c3cfc9cffffffff05741a0100000000001976a914d9fd76ca39a0a53654ba2403c824a2292efd0d3a88ac69360e0000000000160014e289dcba7f67926f5051841c6c009f02e1c79c0f70ba110000000000160014a0b5469b4dce20cda2f1fc48f1d0efc06a495e84f11a2701000000001600142f0245c2e06a2b36760f82b5e5bf22ed9e71ba67d243c3010000000017a914d2b2586da93aa2f0b1f3011307e1c1cda43287af87040047304402203be8c53a8c434211c109cb3296309a8bcb59d7fb2843b50d6a36abb9ef78c00f022022ca0e64bf238040147fedaf9b7026887cd7ed6f8531babf00a1e933cf2dbc060147304402202578211aec3833d65cb95039c8dabad5c164d5726e44319ea78065bfd7df7fa902206f55ea0c3897ed19f43e47c37d78dbc5cd37f1bc8aeb4c120b3ce485403d50f10169522103570e76c69bedd0b62517f353596fec20b657ff30f719969b8559af2bd8ef24c721036a96ed0cb5c4ca3b66dbe02d72d20367b21604a4e4c241b2236b3dff47c420c021023d9febf84cf1a327a26b8965c2cfffd89cf05e1d2a6e8addbce9bf6c9ad356f853ae48a00a0001000000000101e869399e57d384362ca33d44da8d0de1bb74af96df5ea3930d761c773064d5e20100000000ffffffff052a0104000000000017a914c58d3aab049be1d23d2d3e8d0ddd3199c2d30c7787b71b0900000000001976a914b6230d4dda6a5c56e519515528f3d5c4bcba42ad88acb0200b00000000001976a9140ee667c9d91e1252fe300498560ee65e5bd5b42d88ac80584f00000000001976a914d7144feb3d6f3f158177d1ba47e7bdccfc03499b88ace0c5400300000000220020eb8698f37ffbf309287881b6f5fc1481f82f746e1355f851909a18407bfc6232040047304402205c3352d3a5abcfa7a475d034b6da04a9e10f51c717ddf22031abb0864e7f42bb022046711fcb20c0d33eb63a84909f26c3c0bc7db689ed87a8b4386cd7b7dcf97d830147304402201fe472aab2cdac3a8b8e98725f8cfdf3fab86a5aed53b379fff2c3e80142ec8e022060ed9e79eb69f5fafb0fcde71f1d595f5e1672a048d34d72c1446807e502be5b0169522103b5ceb14db96cc9d8a1b350c5f4ab86f2a19102135f065156e11776e7fecdbfef210231a9efa385e848f7d28e8da99ed83211129445ea3ec505bf1de84ef02915235a210264441b3673d2ef86a935e3c5f218097fddf3229fba559cb3e0980154fdb6f45453ae47a00a00010000000001011bfa1e98ffc313080ab9cded53a94d460523eaa72545843b7268c8d38a5bc1210100000000ffffffff051d3e0300000000001976a9143faa26be3cff3a037d7b320cbba01a59e7d7c76788ace0c810000000000016001418ecab6af32ecd3d1dd5631f352c32d14485b37e3b4f14000000000016001483eff5aac3e48fc4dafd3395a10e78a5756e4800f92b2200000000001976a9143d9ab58d59cfb63d6f593095884076777624c2f188ac50f69501000000002200209304b9917846a00d20d04098f32b92584e826fe09aa73f4f06719dc5b511380d0400473044022025fcfbfeee681f4f30029bf5c8a29460d17452a61575b567fccc39024ed1a56a02200556e28dae4b93aab0cefac1e7604c63bb6e2622907279a383a81c3c417155720147304402201d5716c86184a99a44fe58c86c92489d083d63ecb0ee1371af49a2133414bb1202207f3443c47bcecd92fa4e29a170d708ebb72373c59c27c7353350870fbecbd7ef016952210360df2fabdb0f3e8b43aec3e2d5aed3f0a6307afccd518542fb9596b13b037fc02102db9d5abcc44c78e79ed5a2491fd0e0fea5ecb5f2798b8200b863bc08c68d2349210359d428bc2e9475374bfc93cf61fe8ec436d48a354f6aba257f03c43e404819cc53ae48a00a0001000000000101560c31fd42a39533d7b5a4f8ec93cf47d289c80387b3a68241b6216eee6cb5610100000023220020a570eda6f0b75357652bbca8245fd9d7f6c2a243fbbe54f97da6b74d4d86208effffffff09bde00200000000001600146aea0f1a2d5bab5864448ad2581ff44d21b5251af24625030000000017a914b32b2b9efe782ad8f5a182c7ba13c941fc9b2bb2875a645c030000000017a914b18a9604800e139a178400878614b74aaa82075f8761a966030000000017a9146c5aac9b0fe3d80a59b4e217d17a42eac4c2436f87f8c46f050000000017a9147032730533477ea1d7b02d84facec6d6584dccfd878f6398060000000017a914699267cb28734e054613104e314583aeb5831eea877e04d6080000000017a9148012497f0be0d18efa2133217150afaef33c1d9d87292be10a0000000017a9147e1ef5c1535c854766def7ee919fd72794b7edca87884bfa0b0000000017a9149eb5aff98209e768fed283df13dd444a11b439ec8704004830450221009e8914a220256e6b0115d2a28c943c4219375fc4eba4c90bd5b7663e5744b10c022033e5abb8f5e075d669d943b38ba5ec0ef41456b038610a4495dff36ac44072bf014730440220768c6564a1fdb1c3d4803cf80f125646b1ca28ede806eefe59a923f11e402c4a0220091cc048c61177beb4b6cdabcff112eafa47a729ca02df1a9c5a1e98c20e399901695221020d9c7704dcf0495517830b4c49855492f9d5a02e1b21030a82943597b963e7a521024e87c1be56673008fae48e06fca770b523846882a7dcfb637425a2a35d6f9536210375a4856279a6ba4b2d8f48694db79a496752641966f82ab9f3741ee48e5cf9ad53ae48a00a0001000000000101439026d1b042c2228435e3162f47ca111bb85113e2ceb42a82ee99f9565f299e05000000232200202a7cbded90ecf2d754185167fce2e3b4e826e169f842e627cd4633a4b35c549cffffffff04cbd100000000000017a9149bdce331709fe6bb2382193dec7a8392e4e7a87f87c7701c0000000000160014dbfb9546762c8ae4708a26bc1ac55f943266cf0677598d000000000017a91478f64d74876931d101fc03e929670ef0254470da87c7c0ed050000000017a9148c7b584ed837e2905153c1e028ee7a0e3afbfcab8704004830450221009155ab864f0245c1d92bb394e9f54a961cb16b057278abaf3841da1bbe23b40b02207dadce8024c8c9ca3865c9d9f04735a4ddfb413cc2e0c3a40112751185dfaeed014730440220681eabb782f5b45a41d5b6dc2eca37722195e5cc6edb6ee3ecab22d235ce874902203fdb0e0ffdc70fd57e06a41ca2727b79ed89800d592372bbee0e0f6cd624868801695221026946cfaeac37396e4abbcc16579cba715bae71d314e6e4a48b80277ed641218f21028330a7e71ef364d94f6c9d7352d9ef429efbd56197a34058151498b316fc04f52102da71634886c56015641a79b6ea30adf0d827cff9ae2531b94e0afd89cda4054153ae49a00a00010000000001014d5c33586eb7a542b4a32e7207732eebbc95c81ec7a7f23289c3402eaa184e3d0100000000ffffffff05a4c500000000000017a9145771848f04360c39e56b8fff60ba86f3309407fe879e0602000000000017a9146a71ca8d881284a7744d5d26be53018bc70b114a877c61040000000000160014db4fd562198c9199eedc2104aa1ce6851435eb1189a9830000000000160014690351c30b3387807b5c74ca4d4e923a715c00a6d25b790500000000220020b30437bb2c2883af961bd1c9922f060a6ed631962e59f16eee6b7bb7d8f75e350400483045022100b11640c0fadc4476609605682c694529b76697fc4502dbe37db24fd936b6b47d02207e3e6e3fb288531a1927ef62544f05090e21df463b27ee84c868a08f376ef8b30147304402206cb636704aa89946b3ddc4240601f29eb758b8e4bbe1c436a24a9769eefb30d202202d6c3e446331339453c2c21e0dff849a8eab43f03a3e442a6e9e2d4318f3c9c50169522103565603d4b12265e3cd61193b6a2f40ef3b5276db3031335ecfe8074eaad2c6d721026950270f181469229f2ed804373a62d42f03075df8e68360748ef73a09d90fb921025a2e843eadf7189929c8d7b00ad9afab1aba35c8655ca53f9372832fe06b932553ae47a00a000100000000010155676f25793c5f811fb12c48f775c5aa31ee3779c2e8883f2a34a69f39560a570100000000ffffffff0558090300000000001976a914662c7053d7b3a2e0020a03d5d8895894fddad66188ac153c0400000000001976a914af6c2bdc313a2d799270a672b870b3740330ca1188ac2a170600000000001976a914014a81efc202335928d8d4674afbf9bb1146761288acdd3d0800000000001976a9145a8cac23d4e50cff7bef433f9a4c4e09dc8c760688ac51e30c07000000002200205abb814b6bf6de371ab4900fbb1147f094abe855f123c4b5a1bcd64a1bf1d0bd040047304402207dcab51a1231d90a631fc3c36caed0f1b7fa8cd45fed88dbfe8ec77d2464bef402200ed4a53c7761c8e8bebc5066a01b293c9a4650aa0918f65abdecfcece7b063720147304402205914ccee47857764b81d43d3eca704c0200e9709f7a587e68535b59aeabbb03c02203841af7633d9649dd85659775c470d66ac802618a5d3ccaf789c46394bc7cf4e01695221032bd7f412ffc4d46bf8f12e84d63799017a6ab3d4eafbd42162b554722b89f09c21030bf8d2e39893b33b93dedb61f3a6096034299be1270492d97ad59a45039459552103b41e5ba209f8ded93cdfaa3649626b773330c0e7e2603a391349e40ab7254b9153ae48a00a00010000000001018582d611dfa98ece11ab0af1cee5b25587ccb30002d546e6626a83f8fb1f785b01000000232200209bb53364395b7ec8e2c077e75e7477b5870799efaebe04d20978567d66db9d02ffffffff05036b0000000000001976a914635f2db8c4e788b8e98cdeae1612ba532d5b57c988ac6e970300000000001600146b3de90e3e1e3007cf65530865ec9c9ecc579b8cf5a30300000000001976a91455a356350df5eb9927eebcca083f8e65c2ab39df88ac03a40300000000001600140ec3d5930f6a8004aad7ec05bbdd40bb3c8f54d75c5135000000000017a914d5628c8c1307546cf6a464db9fdf0ceb8f52531f870400473044022017ab07ff7ab6f64c3b7ef59ed5bb4cf3a8e51ab2cac13b6d6556f0d112ece0bf02201340d564e277851f9eb7f3380e963abfd14e3ba58b84125aca9de83f0320dc470147304402206b86bd2b31eaaefafafdbb325011ba40cfc3a4f15772d2c62061fef0e12d25b802205ce72f7e1cd9400788b85ac6a2fb9b27dfd352fe4ac6a75f3221a4210d94602e01695221022b3832b6231fc40c13431e3d09e6fad136f67a3574505f27ea194e05b973190c2102360902e261f43d374cc13b75a1d6901b8de04ad90ad1aa580c0d9c38c3bb3dd72103f9a64c0c14c57b10a90739d7f57786fb3263588750c1f2a4990962e4d70ad7fb53ae48a00a00010000000001019d33e04b397fd905c5c88ea7f980b1204402564f91bbbb1d749b4489dcc44b1c01000000232200205b3235a2f9b7728fb7dfc7a0c005f0d3360ff9d4883b051cdcfa37850959694fffffffff05411b00000000000017a914e11a574c25d87e89031312dc326ee94372d285dd87d90702000000000017a9143eb2217c1ad20a855869906f18b7a81bfda958cf8708bd0400000000001976a914dc0d3820b8aae25171e1fbdb3e3940db8428104588acd2f7370000000000220020cafd024ab85b8f4f132d345209e930951a2f3b1fe62b81f9d12ea734635f4002c2818600000000001976a91466ab8332f72996e886962e6618fd062a3eb599f588ac0400483045022100ad2edd018847f474cf564006481b7c0e61c8c972411f936765047331c4024610022061b8bf6ba4a260811db8207d33c81386415524ff80334ac040dafb2ee1804bb40147304402207bacff4c57cb9cf5c843f2e9bf95b43bb6a76680f0c2dce528d2b5f62eb5c31b022049255337f48120914926b0c813d2a5d70e49c58a7e16dd35b90f6777a3af44930169522102e4f6e1f7f3aab7b9172d188f1d5d5a5b9290aded0ed4dd1d89181e7f91152183210387a86d62a6791577b9fa0c18ed04ff011e403374ec8b1d8f155d927aebf4f3862103e17524aec838f3bee798b8e3edbf0f046daeb7f7786746ada290e1002a1d8e4653ae47a00a00010000000001010e7b594c5bce7fa65b17003c547b84b055df83d6f99412e03fc9ce0e592532d00000000023220020b114c135e7a6650a98cc99a6a0267f331e9076e486e5200b82b33054fb78263cffffffff051b0b0000000000001976a914bc12bcd8f16c9c21023d6a13348788f785f3766988acbc0502000000000017a914ea1ccb5485705f31a01f42fe9b3257f88f152d3c873d070200000000001976a9149467d96eb5008ebb4551e5adee9ed39013404de788ac573004000000000017a914cd0dcfdd97c155827cde8e567f02c980913e358a87a94e0102000000002200202f3c7924ca585f401912009e79f0e65442810e4778c34816a72c48f42fa2249804004730440220123d1019508225d03c4bb58bc343f0cd2876520c99f2f7d5d614dffd661778ac0220170962ceb9324e0062ad2727f79e2f3ff40713c5946728fc16ffcb42a87baaf501473044022049af43ff4af153620ec07007c761873dcd7d76b32905618e3d98b950a4d634920220433c78f1f0f478e7743c96bee50145e46e7d7fc23766bf3bdf76c1847cc9f8e00169522103f970a114ce9f4a1ffaf9fd7de6a06604822d7efd4446cce395583c829c49945a21032bf185e814c4d1f5e43cf860b3dccf232c5695b46482aa9e590095361180222e2102b8d94a4e40a727532aba084065c07128b4bf46ee5aaff15c35c363533554851153ae47a00a000100000000010170c405a1918e71ba840e5af9ba90abbd81234b8ef64213e96edfc92f55ce9a4a0200000000ffffffff07fbb50000000000001976a91475d645ddaaeb447d3b9ebc10eb10efabcf1540c988acb0ad01000000000017a914276ad512f474ea044239b3bc03900132a525add6879c080300000000001976a9143590712a1e8daf71a13efd38527caf5aa513c19a88acd80004000000000017a914a561dd81cfe94e5c7da9e8fb9451ad0decbe95bf87e03c0400000000001976a914ca5735d5f17712e397c637e0ef016b17b1bac8a388ac7e782200000000001976a9143602ec9d11d2b3012c33c0331715aedce4cc7cb788ac553d120600000000220020a91755537623073591bbd4384d088d0ee22c077a8f451a0bcf64b6b1a31f1c480400473044022069f0eceee032e7e1286a8e6e4113b084951bd1f9e28493a323ffb4b6531476480220550ba7ee1bca963f10cd25e2cff8586f0f466e3a762d490c4a459306e15b83110147304402203f20e5bf627410564f9508779c4794ff26512e25a93144356a470b07225c3eb502203fa287c737b97973ecf6287d9e7db2f1e7666ae727255082a16752b90de42d9001695221038ba478cf610f75d740692289aa16f622a9af4cd6aa0954fa11f08d58ba62fdb72103881f2219c0fdff5eb27aee3ca6a63fddb922e9b82560a7fe5280c5b02adcff3821033b050bb6e74b1ef379f3bfa3e8bd98b127c35a4d0ca06e29c95cde274a36d88453ae48a00a00010000000001012d5d20a2aaaeb3988e676003c8e98348577ca01e867f7d16f82e52f050d41f220300000000ffffffff07120f0000000000001976a914128b202637847f0a7bd922d1028ba05602c7b3fc88ace0280100000000001976a91459b4efa31d482973096cd7d0aa957b770d67774e88acc63101000000000017a914d98380ff20660079fa7138ec7ce80e9c86d26e798733bd180000000000160014e488116c7a3cc62470a074e9d8a31cf62f3cbc44c6a71d00000000001976a9144057053c68b84f3b915acc695e299a5247d081bd88ac8fe94d0000000000160014802d5178159a5c039cae7bf9eb137fbca2cfe1631b20bd0400000000220020cb599e6a01a1194790f39e5bedfff1c1fe7174c0282f7986eee266ec14cd56520400473044022017b7128b6562d60039415150ea85ea6475e90d6745b933cbc9131cec78ac53fb02207ce4adb302f3d92fa09d5c1e4615c968053c412ff3688c84e65ee79dda68bd1f0147304402205ff27b8b9dd651140a9d71fb3619848c4480a3cbf55ac6662b0c5976fde9816202200e59d180c67fa0b4f23be25bf4048966fdc6c44b8e6040a22ef82b42321cf5c00169522102acdaf936387d9e183e285416ad33bc72a4ac2d10290e9c787ce4f29cd82877082103aad522fb6fd867460342b55156d27274b85c5ac9dbe87d7fcb90f3461abefb5f21024f1eff46258bfd54824cc5ec5f99128caf39137bb0586341d1732c9962e7e30b53ae47a00a000100000001a372a11de8246136861686ab0e3514b41166696d3dd77b92b95e55fb01e38a7000000000fdfd0000483045022100df72812ba8b24e420d50c7a9adfc12c093689738cc2535cc9d35965ccddfa8ab022060d701b7fc3196c3bf5c0a80ddd09266088b5814e2c67f6cef0efc01d29f3aa101473044022049b5d46455772421b0061154e8b114d62770b49e5c56bedc68fa8266e8ad69c302202fd1b03110637e9b1baa92a639fa7eb7d74e627dbc616ff76b0e02eeea8ef912014c69522103c01eb34ad56144b81f09fa217a2f1c1cc4183fcf570f4b255f50f7026acfe4732103b46442b074075bd0f5a970e616eab1279ebc0dd0cb02239ecec97c5c221900732102163653431d5382bff1a350a218855da277cfadff0d310e3667a7d050562577e753aeffffffff02e1500b00000000001976a914549f88887478928720934a8f05bbe8eeb4e3bbbf88ac847a32000000000017a9143625fc09dad8273ba615174c5d4d1d3e971808e18748a00a000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb297903000000fdfd0000483045022100eb0ef4a25ce215342211a5c10a040a5037f26daea1543d193819f500456a323502202b15f21d92a5634264d141325a27787dea3c1c0be14f9dba56b634d7f58d0df90147304402205c96181817e94acf859151dd2cc5dc094201f101e701ab6580458574d1b5867e022014f9e5a574e725bd7902b2f8aee52f5dbbd7d28416c73a5799da7bd3460d1474014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff0277540100000000001976a914ac8506dd3d90c8384514613e1916b586b2ace93c88ac33375f000000000017a9142bca1eb1d8a3f761270ddac48ec5fa5eec00730a8749a00a00010000000001058f1456a0c411b7f1caff8afe06520a357c9f11d01f5c01228bb9c531b5eeeefb0000000000ffffffffa6dbd983e78b0f4f157947c597ff5aedbcbb7ede1d05e212eae0529cecfc3ed5230000006b483045022100a63cd14a332e026b7e63a74cdb72694cb6516538b8a1860b1873fbbbf8490d6f02207fc1badfdfe8d3c991c6c0e0ef12f7957cc8469692eb9a94c94ee71ec9ec3a7c012103cfd040d20020bdfcbb8b9a5663178de0fe480b381714090ecb1cfbdf41169673ffffffff8164d7bcaef7f83d05367bd6927ef6c71ac5d430a9ab554d125f5908bcb0d78e000000006a47304402205a223d38774e46fd95b0b22b501ebb3e13aee1ff8a3f68ccc0b0590f948984e8022065ffe9f5ac7df3854ca51fb862cf9223b7fe246cf6776fd52b0996d68e7310c10121025a55dfb8161fd1956fde1bccf0ac95787b6dcab2f7a87c6eba239e9c98d0d935ffffffffd984b763f4105c959b9f62e9f4e559c528d4e64ef272703b871364dabb34e37a080000006a47304402207bdec33306a45a9657292a121277f5c6f56ea19edc3a58a44ac85e1a67094bb7022051cef329b00fca6347556da0d5e49298f2088ddf1727ebbd0079953802eeff5f0121020dc0af0eaf1e19fd61b4d285f591fa542822cd2d8c12439943726b0d05e6319dffffffff75e974fcd392279c70b0ccd7a699363fe347e47f2788091503e8251142d09f33000000006a47304402206c986150a6d79244ad3a68dd5bf7218eae3cbdc666a57aa75cc0c75deeddc6f1022028645150c8ccfff55c131e3199e449656ee38a49461468cc070d47494b192e69012102dc8aadb11906b2981a76eafe4abef08be70350cca0de92f689c825ddc1efece5ffffffff020ad44e000000000017a914210d9da476e54f9b0d72cff3d08809f9eb538ed187c8d007000000000016001450b8cac63140fda5c159db1b773fc0e9d41905660247304402202143979c8a27bd882eee0bdfca69fc7748a39e5234fb247e6f4e4c5e6cfca0ff02200a2d15991d4db5fc1e5b8773174ea37a132a788002b191e68377236ea2e27991012103a27d41af7a7446189a07c1c43433eab5474d5d8525dec1c05e452aecf0a8473d000000000000000001000000000101a1b22b149fa86ee1de58ab3abe3b52b8850afc767897003f8f4773a57a048afe010000002322002079e5633552235b5e564c958ab630023c8a93e54196101c038748a943737a1393ffffffff0629d702000000000017a914e03e2b1a25a4ae94774743c6e73ad7201cdc9b88879c850a000000000017a914e05ce6c92f3903725ad38adee3fd7ee80f4ef0eb8769a60d00000000001976a914eff09bb13393c7b3258bc9af96c014dd4cfaa9d588acbc441b000000000016001401b0b2544e4682355440f23bfb18f799faf4b6eaaa94a20000000000160014460e0ed47e6a7ea1e7220012b83a3d80e27b82e8870b50010000000017a9145cf3ee9419eb81822402a3d9504ce37c0dacc9b0870400483045022100ff2d4bec5a9b61425c3093d87810ca11b1b2f39e4400aee1fdfab64b0ce057270220536c1a5a744940b8fdb4cf9f76b3449dac510cf31bb5dd1de66ff21b2bd25b0c014730440220687a01731f1428f8af8c69d0be7db5f0fe2fc3b178f3d8e9e08a05cdd54f785b022052b09d1988f2d31f3e28995fc80272b654512303167e96be80561513ae60217b0169522103d2433a03904778493d078f1d609d480bb44dea2d9182bec1c516d241ec00383521020d36b102c53caa7a8a963a9aed98266b8fcc431bfe01070aaee2e81899a153232102ed05f1a65a010979a9e6a90810b178b9928fad62b590e9adbfcd9d393887ebe153ae49a00a00010000000137cd8a89e80bf15b811dfc6f8570834c43e482d6cdc4678384e696d887fa496800000000fdfd0000483045022100f7ef263ac28da3d478b797f0e9d1cfe8857d6ca27a44c6a8fc56d37aef69c3f20220433591b698f40e5a5c3ce96f8d550807a6090d306e02015993750927c5c87c2501473044022036151de978ca55f7b1239645fbb7b50544d9ca1f1b7e2dc60cf3a74d5910790f02201c50819ceacb6249af2d2a0d915e57c0f30376e226b3c4b009b00ad8692dea11014c69522103f95d0afed57e6286d951364a4b7c1bd78933d2da86c59e0e3878bb9176046a642103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221036380fdf9b539c440aa5e083acc5973a2bef6987246a0a25d467ddfde5eed2ce453aeffffffff02f055000000000000160014ac387e45fdda2d59e155bbe3a5bb4a1da5d654317e2a01000000000017a9147c52fe55b87e590be02f5074759ce2441149c6c48700000000010000000001019707b0aebc636c038abe67ce05c9314d2138e778d25e1b0a17cb9ec356f6fe0b02000000232200208d0f4ac21bb6ab016ff87f86f770b10ae1a36cfd93c353ad8086e4cc6974f867ffffffff07dc88000000000000160014c417d35b195d41b44deba11c3de085d2e58ba8b4dc880000000000001976a9140640b1a7416fc12f2d725e4c7910980bb36e622f88ac146301000000000017a9149f06f1f5fe630393bdf1b4359421edbe58bd6082874f5a0b000000000017a9147738a2565ad1859bb444b3609fc411fc04af7b8d8775c31b0000000000160014a05166d97ae0f5f6943a49ab1884bf462c539d25fd9e2a000000000017a914334349f05fdfd391caf38d156da4b543b311c3b28789a015060000000017a914242ead46d929f47b2b41b90bd3da21466ca30704870400483045022100d74392c742c73f537fd125e5cbd5e1465ff93b7f96bf72259f99f5bf7869394d0220534a4387a0901f51919b3bbeb3328e528ea090cd8bf6338e4967f8b520cdb47301473044022078aede7e9a78baaee8c468fb086523d839ec9fe8ea69e610afb92005f0c9b89e022004c0b4ef9fbc46b16d9cfab4abe1f21d053454111058ca6caf642ae8f32110dd0169522102e06bba1b57a7575830eed44ed7b5a5078cdada2ffd61f0572f101eda220d5a0e21027dc8de69e2df1ce465aa5f018ad0ef5fbc70bec545991d050f3749b526d42f502103ae57e49c21d767c8dd4837379dd70b28bb33965683d2283f5b174f12a284d10b53ae48a00a000200000000010724710cd5107facb1c676ba789ed19aa98c44c5ed0f6bd2d82b919b0c52582bc5890b00001716001413dabb465f76c3216688552f2356f740b5074a21fdffffff5a0ab2c688daeb9c7ee88dd61cdcc83ed8b3ffb3b5df0fccbc99893dcaf781c900000000171600148f78fb9bf79fa37a27ce3e719a7d3424303e3fdbfdffffffdc4699775b8d786ce6c2e91062f77459cbe8f66e3da556568a3884f7807cb40399080000171600145cc866eeb876c6f54086177502f35a73cfbdae6dfdffffff5db2aed6aeaf896f72ab9913981786dbfb81f0fd14c5c624e857a346bdcad3b70100000017160014f3646ef2770888ffc2b4d244154d9ea8aa1f4debfdffffffbf20893262073370a3566cee4eb414d4b9561b0b2039614bfd641690891be9c900000000171600142232ec1ebefb4017a2a0420e11b8c9d84437b33afdffffffc6926040f7d37f8683da90ef7cc1c29f24f88739940fdb71d290e637297f6a2000000000171600147520326fbf08cca6c2ba1bc1f0b347fe5c0b2770fdffffffc7bf9937a9c77a2cc533ae8bc9ebbce358dad38b9d871074a0f7a02ad692f336cc09000017160014bc70de9c1ee0f232f1c6246da220a62be8337f3ffdffffff02bad48800000000001976a914ed472e03b4e1e7eee11171aa01b9666fee6a250f88acab8b3200000000001600142c61ae28d6bcf7486175639ccd337e811f3f2ae002473044022060d346c7caaa2fc50a4350941748d81ece3f9183c0b91266f080e5aa131afb1302205d2e3765bdc7afb090b2a92aa501ca92dfde39abe7a2c8a0ceb1135103b971a001210309260e38bfcad2bf952d54a59a75f93cdfc730047748a3095dbcf07aec48da3902463043021f10d60a4b29dc472b673c9c93cbdd18a55fefa5fedd3e1e7f270d97867c63cf0220655d9c69cf7d7d21405921bc0bff2172f84ab787176a7ed69fb447be88e7c413012102e123e7d9a5c23ecf84a1883da4cc46311ff6ed71e151541401d9ce043d15cb160247304402200fddf9d33e7bdf2faa91da4d56fc33866eb8a397a03bd212b38bd39f7dc0daa602200769694bc389820a1775576094bf3ae8a5f5615cf1695fea1567512bf089856b012103ef061d6f85d07e57e17b964bb839d69523fd11ee1c20feb26ef5d41da44174ea02473044022071fa6345303f07a3838af4a87f77ce6b8747ab404cafc77d81799316e90b873d02204c33b4890c0bac05353a18e355fa55b27090d2e2f5c81279574d2a3e8e89d4740121026730f8d59a6fc01bc636e7fedb7fff840bc35c05a90f187a2430daad79ea1fda024730440220142f29dbbb44e51d6f4616537401c1f944d1d3c92c98758ac42f9c2aee3eeef702200f6b975c3fc0168858d9cb722536bd93fa8b9ae030d7eebd67517ee87b70ea6d012103f5eff8e568214340ce1eefb0d8058222c9c46b28ad6246940e3c32d3cc2584100247304402206c19d3ae93bc470f87ecb38ac22c44e88e0488a7f457c1f950512e324c38952402205f51b5e168a731f0fa854f60c9b6c3e942625fc1ee989d6ddef3dc3c0a51bfb6012103a771eb1293748348aee1876e48b875bf484329dfec910227b918083ac311b9f0024730440220365430b961fbde8a9a56487f217892614fe234a807397bd8359d46d2f0889e0902201943f8347ff450bef08e76c44d018dfe2006a329126f330029a17a95a76860d4012103dd43eb330cd35aa800c1639f6d3a37dfdaf5806aaf2dfb7348c3f09793d756a847a00a0001000000000103d50a099a5b01bf998cd21bbfe4bc83114c38ebb5e0e67e3fbea3335171d64f200300000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff766944e2f1ccdd1174f567205b9b4429be72d5af33fe38f147cbec152102334a0100000023220020700355430a6ecfa0524d25a689eded1d36b31704194743a671deb7389be402bfffffffff5a1cdd429c62d38bf6b9bf72fb616c7958eacb0db1a3f9f0aa1b99cf7520f59505000000232200209258d375dcb75d5a3351f51c37e3a722fde5bddc59bff86e61a5c9e7a96946a5ffffffff16540501000000000017a9146080f28a17c13be1571f22ee3793ab1fd3ab6e1487a7050100000000001976a914fab3230d9e1bc2af04ca573e2be0086286a335d288ace54c0100000000001600143c2eb30a3953ce6237001ee86a75e68de3e0de3abd240200000000001976a9146acfc0e022a900594b9e42789384466afc288a0c88ac43b402000000000016001474d61b9998b64137f2a061c355167339ffd32d8a62b402000000000016001495167457aa505d15ec2ee513f363d23152a75b3ffcd70200000000001976a9141db7bf39b2a42cf018086f69e8fd9bfd8784fb7888ace3430300000000001976a9149c49449cc84f80ed031ea6a4e05492d624b6b61688ac43d303000000000016001495a113fedb85f4719101f3d5638094e02a9fed28b283050000000000160014d39cfe0a7a25cb7a5990c3a029e465135813cb5ffcb70900000000001600147739ee16de1ba1f77e19e39062f6f762a4fa26fe185d0d00000000001976a91497fc9af5fa3767094355e3c15b304abf9ae0e32b88accc7b0e0000000000160014e840c5bc02f4193d400371c08f79fbfe802d5d9996bb100000000000160014906ad59a62cef973617d94e5247046f9ec0ba1c93b2419000000000017a914784a21620911544f3b4787ad5fcae849ab2a566487c22819000000000017a914614f9b8cd350a7fd0e5c0ddfe5d3bd58833e827587c2c81e000000000017a914784a21620911544f3b4787ad5fcae849ab2a566487deef29000000000017a91452b757f5ff0b659f6ce7989f984de95b7d87dc2e87db0c63000000000017a914c05e1f62cfffc48d55d990f7f347e9ce9ce5b9d3875820fc0000000000160014f783f58717ece7b2c94efeffffef00a876966dfc0c4cfc00000000001600146f8b3147906a23c5810c471e44800580df87c4168c691801000000001600148ec89274abafc8507634c1b21bc90f4a8e576d3a04004730440220273e4c99c147e6a8743fff8da75f26b051baadf6f437e91fbc987501b28cc21902207c0f1667d47d44ecd8ac5ea552d80444ac8b80e195838e33c85472f6da46f6b801473044022048e35882ad079baf38ba08d70616054383aead9868020d30caa282a000297604022066dca5798ed0deca9b5a6eb60e5f388a32283bb7178d713f6490a8a885bd791a0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae040047304402203140be1cae940cf86331afb0d18ffa08ee23ef3c037c17b5489444590f6ef4d502203291d56cb7f78b8aa285612a60c6d35884ba7f62a10a78272a25e3fe77f7e135014730440220457eb06dcea63362f9fffcd9f992cae4a64d11f81741839e57be002baa7645a202207aa66102e74f33311baa6c905d5f0ff5af86c45719a8eedeada41d2d87da05ac0169522102d4b772c3fe711318d11255bfa12c8af4fed3ee2cbf8d264eeb838280a9bb86572103c606605e7b475ec91351bbc538d875c32b440b37efaea9066e177842bc3deb582102626a3a6b2943b4e0056f846b717a3008b43aa7f51998557d80e38b71c847d99e53ae04004830450221008c37638a85f9e826bb53c526e403638a0775a5c5b75b35a5eb12cc946c035c1f02204d73527a4ccecef5299ef8d1e446d0cbcf84845bacdbf03092a27df85edc16930147304402206d1e7c69a8b6f97ddb80932f7febe7aae7d5945b26b19a489582e984223d2c18022024937a71a43c2061f3a656c64da0adc06156d60b6b9f43f66c00c02b8ac246030169522103bfa7bb0f0d0f23fb4fba9d61340183affc815ac69ca941b5f64dc92e290f07522102ba0fb064392b191ec2b8b9b987843f3b003e990b3d9447a5f26d48ef5340714d210368c2736f0c60494aa0c15279ff7662a44276aa6ed3207835b7bff9d704d4a5c353ae48a00a0001000000000101ee659da4f6769287d15731b9da40b6ed58d3273d5007cc909cc4a7695b0837670400000023220020afa1407a7d38969a68fda344215e4db21e95355e0690cc44849a954f96e55c15ffffffff08e8190000000000001976a914bd19ba13af18a9b56effefe96d4259472c40b01088acd7950100000000001976a914cb4100b54b31a00977fb077027809563918e9d2388ac4b7c03000000000022002051e0bcf71c3335a98ad053c6f6df6d2d28920dc3e22fa97c93528ee564df8c35f0ee10000000000017a914773669084713f2f4a28236e7c08a7a3bba88113f878efe1d00000000001976a9148ed215db969e0a39a03d343c64e5710edd00d3f388ac654d4b00000000001976a9147fda2c5d0c3c5dfe217162524326a778cbda5df988acd95e4b000000000017a91471cc9ed0aef9e88869ce164049ecd4a9535a9a8f87a0968c050000000017a914b983dc87a46497249b42f2223da58ff2da1e42a487040047304402202f6ce050acf81d7e5399d9501cc8f7e145c05d7bca6ab6a96c6fd594a35dd86f02205586606e2e8348cfa0bf36b698924c2f7ca99a64f060f25e43e29c263b7d1ffc0147304402206f9d8277043b32c3fa824fb8678374bcf82fa7933c65ab2d250d591ef437a082022019d22fb01d4b4789a3c9b52f28065753f1a33cd7407e1c99ef8ba9372334a25f016952210243aa1778f224580af04e5cc98ea9613c287d383a91517a7cc11ac7bff28b815b21027177239f076ec19b3aff2499cdb39b6bf8bb33b220cace63ea940778a18560072103862bc7910160d7b6fa6c10fef9865bcad484b5d737367e2b190ed169dfa262d553ae47a00a0001000000000101a5ab499a1a1e9a3c0e67fb16c11aaa22a8afc8fcff9d565f5c8cf9f6198455f1020000002322002049a2cc73c048e29aeb21c4b325763cda7698222bb7fb45304bb807685e8a8986ffffffff0841c60000000000001976a914fb7b59a08d02403bec03bab33af2c234f919048c88acb3950200000000001976a9145b18beb9332b761ab27b7da62e33d159a3970b8d88ac0a1a0300000000001976a914d3cc0a234ea887d6b29e23bb9820c3899e7700e588acb3781b000000000017a9145e3c3e8c1d75effc1f718dcac2b4d906ef25b6a387a54a1e000000000016001422de9d5f6fde16967f2376b54beb0fa2f3df252f5a50290000000000160014615c4d134ec098c67ad3a346dc1458649b2ff3cad5aa4f00000000001976a9145b18beb9332b761ab27b7da62e33d159a3970b8d88ac609705030000000017a91497be509e82be6e88752a2edf2d2d0a62d21c5879870400473044022025a4ceb86ba7e6f98ecb77c3233e553f06a3745c658de025e12764e564c6581802204140d0f01578d592042bba16b03f379bc1e35c7aef2c5528e81d9e41b5e998be01473044022051b34fb3a70ba24635c754c6746d622556e7d220a2d8d07e50412c28c6fc019d0220374e8c6540b8231ca7cbfb6d8a2647b102f02701d3584605e4322ed133d55897016952210264198f7747ae9339b052fa2c8034826a5f6dd59e629ee73a9f5b7bda40c5d9e921037412fd31490821662e1646f6dfde1f8e8010e3b634f8b5021a0f19e493682363210222486cfc323f22de4418dbe26eb17e27229b2fe815d96805758f075e57c04efe53ae47a00a0001000000000101e1439cc56777bf6afbe3418b4f656bfdd2804f9abca9827dd9b00ed1970a3c840a0000002322002014adcdb273d670fc952039e0b9ad19a5140262de317c6ace09a5fe00c0ee96c1ffffffff0863db02000000000017a91469fb91eb06f3deeb35ac20fbacc9c611ef35a93d876c380600000000001976a9143dd46b1feb38b3d62ae6d1461d53ade62298ce5688ac11720d0000000000160014ab02e344a0817b44a7e36e4750f1b8d06afad294cb4a23000000000017a914b8527411d53077a13d7db58c4288cb905c613c3287f6433c00000000001976a914ebf59b1af45d5ecd179bddaf5655cdfdb53c423d88acef034700000000001976a914aae746cec7057a9bb0622078b74d46c0254020a788ac05f84700000000001976a9146feb8c41dced02fae2bcb6732311d72276a7ed4888acfb6edf030000000017a91438d11c5eeda57d26f84557f36a93bec84024535687040047304402202d023e4e0cf992f4f8bcaf90fa35635635e437b0bae9623d81d5fa11d43e05490220509d37c9880cd7e4a225c3d654d62e8b7445e26a5b8b7af33a0824c0c6a71c4701473044022069fcdee1d69d03a0ad8fe6727c589c09c4a1cc5755ed1bfbda7abe3fc2fcfbc502207717d3b380332e50dab50d099ed9b8b707c8c76c6d6019076fe83360825bfe480169522102a7114dd560786b2d574614e1c28cb84a06c04a2a8f11c27f516de68bbef9fccf2102344842a2b26acb6191c3d24f1d1eb0391082227c2b4575c34441dc3edfd4076521036aea0ed5bdb6ad1a3f7440c425057df31876c26a1b012615e2dc5797284cfe6453ae48a00a0001000000000101dce562b8554ec0a1ded6f3e768bbedd2ce76856f07877e8d1a1cbd4de246da8d0200000023220020c32d5ebdf7049eeac1d1fa0b11f850b15e53b005b974ea1b91b5b8d4f5eb3460ffffffff0ac3c600000000000017a9142478e2c9ae8dd4e2f092323a661d4c9a9477982f87ca9502000000000017a9145ff6d863d22fcc0bcfb5c645825ff64d120561ed8789960200000000001976a9149b2232a50cf9390c1b5906ce4db66ab91aa50e7c88ace618030000000000160014fa3e1a1b54307aeef8d328292aed31868b01a73f2b32060000000000160014bb2e9f2fb61678c0c9c9daf468659d84e2b59d488ac20700000000001600145ad0d56dac009bc75e466b50d994fc29052e2aedb26c0d0000000000160014ef30584af55e2aae3114b4f5da3892629135d894daa311000000000016001475c38fff9c5a83e9d760beeda30b9f5f7654d18fcc551e000000000017a9140a71302a33cfa273e32c61ada8616e3d4c99118387f976e0020000000017a9140c0f76274cc1d7144fe09aa5657de6aff01c348b870400483045022100ce333329759a666bae406a231a86399f70fe843df504d39339edcf150315f550022066fb47088129e4576004ca204313c3220b13d5a6fa2c7b0aba8fa513fd6a6f7f0147304402200d77793aeef54de6dcaa21893bc3206e7e15089186ee43236ff13d63bdc79a2c02201deabd2398321b6450129fd1c713edb00e63fb67eba6bb750173c28bc679875a01695221029a00a10255463ecddc109925aaad5387b30e720778e5880effc982450f47d5882103732a09c890c53676208c75bcce2debea928f9c854af6778584ef6372e469985d21021782cd53d6da483f62fba567289732f25d62b4e08a330f0ca0dea63b873cc88a53ae47a00a0001000000000101ef275e2270547f95ec639b782c8054f67e1816e29491c4766dc30e40126753ca09000000232200203598503b6dc3af946854c9283435c16c0a24a8091a92a76defb101e5106196fcffffffff0a8a2c0300000000001976a91485d2234fc849b4f0d139f7287933f4cb1c4ae47788ac482d03000000000017a914b0506eb8170e7dc968f71e813a30b0949844846d87e82d0300000000001976a914376bdcdaf70a2374d3363c969448cebdd88121de88ac7cd003000000000017a91473166780f619deddd6f5376b7909276253485a97872ac204000000000017a914ff378df47102a20d6d85bae5fa9fb2a9fcc7ee4d87b44f0600000000001976a9146aafc769efea63257f8f829dce63fb502bc1326288ac948d0600000000001976a9146aafc769efea63257f8f829dce63fb502bc1326288acfc4608000000000017a9147859d9bf0c106fa1e03df81a5107cdbedbf7ef0a876ebe0a000000000017a91480266c5741a664e39174ed2def0ae44fcaf53c7f8753765e030000000017a914e1687c51c2fa7e24de1826af53dbb38c71e1f710870400483045022100f6de25ae6b2fbc6b4a2012a68cce4e07c78dc1ce58f848daacd5d6a5909f622602201ba7b2ba468bd7f806d890ce4301e7f4f66d460de187bceac763b3b0683b7a0d0147304402201fce29143942c6dacec905c8097ed378510658f2533c39ebcf94d12bfe140f3402201647b2bd618bb8782ee8e89ad0cd8b223f674bc1287eb3d0dda54a40d5249a60016952210241997254b9ee35591756deb8d5917e12f001fab61ff017dba0a19c6aa8c647122103ec6485acc33cef8032d9e58d965b37c53240fd5e760232315d84621dc5b7526221025dfe8f762e653aa58ef0872e13e3f80ad0f0795b3095a5b46c655056f21d2a0753ae48a00a000100000001bad6cf12e05f3153280a23076e5b07523f5f830d24ba499a429dab1f4b50aecf03000000fdfd0000483045022100a0c6ef9926471c394cb4695911a163b1f6b2c079db317a79c2e60212afa0c8bc0220347e4dd478ab93e54566226c50db3589e1a032c010ddd5eb335b667692cc78c00147304402203bac51f03adf2606570f0ab84547d13da22e0b881184a86df913425e36ec5bf302205f54134d6c5e9af3fc55d254509ce9b05e360a0880fd07bd0fee707f0d02ca8a014c6952210268b1659da1393ed8a6e4a25b15cd7997cf45f1bc2f2adc567109b2cd7b7e59e72103e0d51b4913546eb6af290550287c6290a291632562ce6e4d06b6fe8e06ded24d2102676c026bfb976c3e8464eb97335a6ac6789707068add8bbd218c05e2fbba401c53aeffffffff0a1a1d00000000000017a9145336be8c972f0660d87b7e45bef849b98bb4960887340502000000000017a9149d9eebc1e59e6c2e6fa57e2e4d41244a54ef5ade87a3d03f020000000017a9145336be8c972f0660d87b7e45bef849b98bb49608872ca6ec050000000017a9145336be8c972f0660d87b7e45bef849b98bb496088782c4fd050000000017a9145336be8c972f0660d87b7e45bef849b98bb4960887272638060000000017a9145336be8c972f0660d87b7e45bef849b98bb496088778e342090000000017a9145336be8c972f0660d87b7e45bef849b98bb49608876fb865090000000017a9145336be8c972f0660d87b7e45bef849b98bb496088799318b090000000017a9145336be8c972f0660d87b7e45bef849b98bb49608878bd9d50b0000000017a9145336be8c972f0660d87b7e45bef849b98bb496088748a00a00010000000001013972da63392c0c0cecca9300ce1e11627dca9d3b354f768fc3da8545972a53120100000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff0b50dd01000000000017a91461d976396fda9a92393c4ca85c801ef2d054c85187e7b4020000000000160014eb2f3282fba3deebdb7b5474b88f98ae3f65bb0de7b40200000000001976a9149ab8b6989b8d2bbf59e18a2e70a3ace9f659a53288ac6ad403000000000017a914742f6c061c3c0aa362a0e694d24480f7d598ecc187ae8305000000000017a914785c85baeecb29b0503590cfa9ad749b98150bd98755140600000000001600149956236e81795db9a4c6f602bee2af5b7578144b17ec0600000000001600142c0ecedf2b6e046520bee61b65596a64d491725c881a1500000000001976a914948f9a8bd6b195648765f1220a9d2368ed26c8b288ac2d982f000000000017a914c4addd63af64085bc33ca11c26f8ab8a64e16086874211540000000000160014d77838aee790bafc8c08be33a6d5b6d65745be0b8cacfe000000000017a9146547b97761958174ed93654fba8d8a735411e0ea870400483045022100de68d3c5a41ff304192b6950ba76f598a6b3472a7d55c66aeb1e382dc766c63502201eedc8d31bac4ded79e0b1d909e4e641c2cc6df84afcd9291216f82be52a91c501473044022012b626144bd83139b36d005e2d2330c3038bce85fc03b86e20eed3e4b696b7b202204e9192aef4cc5ce7b944c9b54cee2f8420fe7e0c30c751dc1750adf56a3e7dfe0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae48a00a0001000000031701adaf58e8123019ce9138602e1ef3398b1e4d68caf039ccac819e65f5c889000000006b483045022100906c108dfc7105a50133f5ef125d5c070b54f11963393d9f62c86758d2300dc5022033a0ede2068d6c646f3def020d04fd05d48e72e5d53368a9c2d023294041e942012103f82766673796048a36c165de60bf48662e8dabafee71c4c776d6f72c8634337fffffffffbc05a4ef1b22fc68debd98418c7d68735c00daf1672fe3f0cd6195f029e7c924010000006a47304402205b5963f1b7402d71353fceef904b170a8e0b6475de1ee47a2cfada7085ab48fe02200ec848216fad56c8c097aacf7cf6ebf06905e91ab4da6e48b3a516dd4015246c012102451b4f1bb25f5b37a46e286c0ad782dedb925d0fe2ce337608c7d36f1d3a45a8ffffffff66cf314c90078d21c03c15b39f777fb409933e764c371c4790f0a1b88748ebe1010000006a47304402201efa711e3024fadd769adbe1e5be3ac6e5a0c6728114d40567199b0f769f460d02204713d8e58a666e61ab9841a72b444815191ea3b957e1679995e4ba858415c889012103f3ccacbe713a898bcd3674ef3bf46294da6531628cf6376ec6a929fdce17ccabffffffff013bfd0100000000001976a914d097da125db99d66e31dd0d8c84e1686922b574588ac00000000010000000001016b9793a7029aa1882e7fe6ebb94842f63f7101db85bc1ad2872a8b1ada298ede0100000023220020858fe21a4dfef3a0a454451cce106a181ff3e034ce4a26b2c2f63c94bd05b4f2ffffffff0d95640000000000001600144627f287d2ed5313988c4f8c8a7285257194d5942a3701000000000017a914ff51500b839f4b52b526f97abef36407a5e2aa1087231202000000000017a914e4eb77ff1cb9a1700add651a332b4659cb181755874e3c020000000000160014076fd24c3d6cf6e0384963ddbc8e272b02dcdcce70d80200000000001976a9143c2f1852abf6a818040f0286c45c9f7bd29ba99488ac70d802000000000017a91411bb5aea37c79c8d67fada559d47e420810edffd8797f803000000000017a914b0181c69298495b96ed6b1d578f20eb3e57368e48798fa03000000000017a9147c16007952b008bf4a5757ece7e7cc3b0482c6498707b00500000000001976a914d1fdb46aa4ec821f932a1182490844e33399a55488acd6640700000000001976a91496be300d9333d21da703b41574f3e4a609f0fbe288ac1c0f0d0000000000160014e2bbece033c762d165ea4d623025bcc7300dfa7856a03a010000000017a91441cc4c0fd8d3b27f086af8219b5cb4fecaffbe7b87ef769e030000000017a9144a8ccf8d06fa91c9c3e4d3d2653735c2e8d8529087040047304402205737a503f9e4e9042a3a9a9a87af5bb00609a2ac1ee83797e15ad1c8cdda3604022054b55f55878233ff060357c183903d3d84e343b467c707c0a58a73685b7c30d2014730440220177ccaaa19cd0d345f7c90a827d8492b79e7373b0b2c5a322d6a87372f79536e02203ebe5805226c7f26189f9257b7a65d9ae85e1097dfb27e9d649ae2efab305b240169522103cdf1a55e6fcf9e9b212301b4d607e92c0fcda95fe70705d1b3d7e01eab1789d62103a72c6f6a7ca78797ce676fe37e759c453bfe2181e57c3f69d2f2df09b4137c70210363aeadbff2b75c9f41a9fe551dfc9a2bee8596bc15027e5579d0dd91e40777f453ae49a00a000100000000010149ab66630af86867967a2beed7bdeff62d967c9564aa3a97d0db254f75c3c33001000000232200203142fbb1b591f86bdeba421ad9b1d4c8529fe5b2db5caf02140db8befc3db4caffffffff0d84ac0000000000001976a91447f5b28bf29ba8b71f557d5633c81bbc4b7c955b88ac8b0502000000000017a914d5e71810604249ca0a15da4503ba55bea67317d087269502000000000017a914f3b9a09d32b10115fffb7b1bc0c08b25240feacf8795830400000000001976a9142737eb8288707e2c13b1b9172b93738936a6a13288ac564807000000000016001464290da9d691eb05a02e567c1c0e82a6035f1f4898500a000000000017a91438fc30f330c8a13c17fe30211410600c5959b376877cd90a0000000000160014daf2273b57b452e58787be60bb93d9ec9681f060278b1200000000001976a91495a11d06522aa0f8979df819c5e701d8a61813e888ac4e19160000000000160014d895f483190fb428eb548a81492ec0a9568a6573ecec17000000000017a914a16806c6a322418fa066d63ecbc5b4804b4f720387fee11b0000000000160014bc070f6e4aedb513b36bad3ed3d1cae2bc23877982664b00000000001976a914e7c2f51260b898ee90f02ee90f3c0c97470d2a2088acc39f7c030000000017a914ccddb8865c33c44fd5760859ef357eab2a3a318b870400473044022014d6c4d8c1cb36e1d431cd7574886d1b3ea790915c7c463c75a1f7396dd79e7102200b82540167219167b7b5ce3450f7b206b23b0a09f6cd388c609de1616c3251950147304402202d1fd05f8578c90dccc7e2ff6202636d052e3c5e393b749f4061be965ef809e802207c0ade3e82825c7bc9b47ffabf2c3b550d1d0a3d2f8d66d4eedd5b6c46d4d1fd016952210261b1cfb9dc916de9cbb837c111180caa712bf8e83b8d89f6b4e80cc3ac6e7b5f2103835a9394afdfc3bbe609af5e50d638f438e655a9febf57b9018b2e870e1f6e1221022d1798396352b3e2f465718bd89662bbc100e0e930db04eaea5ab663c625466653ae47a00a0001000000000101c38bf58d977f8b9ebd017ef8ddc8b319b2de068698613f66ab811c9f31390418080000002322002021cd33d70b92069e527f3b06ee15f62d87a66f36778e60e539066c65f59507fdffffffff0e8e2d0300000000001976a9142c013ced13e362abb5eaacf30b3b7c088e6277ce88ac1a2e03000000000017a914bb4c343c9fd6fac24e01d0d0e75d09f2b633584b874c330300000000001976a9146867700f7a49f263ae95c7f46b95ffd8fbae9ef588ac605603000000000017a914df27237d79e01be3ded98639f511a835a5f7bb0e873a0b0600000000001976a9146db386c85045f9f1caaeac8430d83ca4ed9a68c288acca2f0600000000001976a914175e2697cbcfd8ebba2b4edc0fd03fd95c3c9ca188acfa590600000000001976a914b6c197211000c3b58d8a27fdaf7514c3d428ba6588ac8cb70c00000000001976a9147e6d7b4570d9223db93898c8df81d9891265f96788ac104b0e00000000001976a91417a87100957fc684d588799863cd0b9f67f148a588ac62821100000000001976a914903cacc4400be71d1a65a06087208abd0096320e88ac10a61200000000001976a9146383226317c4fadc5392fa740cfbb0908a24590688ac58ce1f00000000001976a914175e2697cbcfd8ebba2b4edc0fd03fd95c3c9ca188aca04a1e01000000001976a9147e4efa95b0aa70f3422220343956706189002c0988ac1ce31e010000000017a914de3249f843bed5f36e44b16f485f7f4e8e1586fc8704004730440220240162dfc92a03991d0f63b0591d5eefebcd3513b43cb1144eca014e5aafa33402206345910c17684e3c12d7210900b9ea7d40dd241cf5777a729b7e551194a20d800147304402204726d73cb7a8df123401a45588a58211de46e33e6d496bf5fe7e2990ce2217540220096c4a6c38f5c6e823ec5b199cbbdd9c5cfa686de91394e167692962122304d701695221023cb7667802995eecb387b4c112019893593b70c2eaf5c9a8ce4e3f8503718ffc21028975996a5d41ad96ec39965ff0e814aa7eefb563c837f7a6073551902c5a5d6f2102459415ed6a4cef6d54fa2033ebfdc1f87c24c2ffc89e7c177af71f2e9665b44f53ae49a00a000100000004f976a009ffbe11a05f425f745cd7a1a4a12e650cd3344eabff220ddf89d6bee6080300006b483045022100e6625fd18f81049f349b47b7bf2a0f0352b42b5c0985d4c5ed3f625536af8b7c02200553ca38b3bdc0bcef384f13df4725d846cf1079c91193c8b4aa84ae76fbf44f012102af49895337db47f118540ece4facd7a69cf2031f7d9f3991c5a5f25bf86f3273fffffffff976a009ffbe11a05f425f745cd7a1a4a12e650cd3344eabff220ddf89d6bee6310600006a47304402203cbf15e6266543a37599449beeb22afd854e762360d193614c774065b25ed9e9022076ebc63adcdf892a0ac167d9ffbc0cddf92cfd0c47b24b2cea692f8b84ed71df012102af49895337db47f118540ece4facd7a69cf2031f7d9f3991c5a5f25bf86f3273ffffffffc078bfd795aa25331408d574b2b5568f07d82eb3c9771a143b2110f651e9cc2be80000006b483045022100e8d2685c4e474bab795691b6aa42756907c4b7909ea0af575adff8c4601ab3be02201df263f75321ceb7ef8fa29d29e400e275225e7eac0e8df9713a675fb1039ad401210395f4118c3f16f6a01d977e86babbd9ffed54a9f82058f87500c9e8ca6915263fffffffff9ac140e10026b6f0be50db7f9e6e4740886df34764eb0d4ee216d1e2cfcd6695480000006b483045022100c91d46aa7eba5c2081afdd51b341d4df25584bf243e447e48cc842d9f9d0ca0f02202310f262662448f5402195c5e55bfa53ba9fd7be237b9d477f552ff2ffa793370121029a82ceef8cd8e04d1a45b392e2833717924751472175872cd20245714e315cbdffffffff02d6e7010000000000160014ba7b662d2dfed3551481f5a713e29707ae4361ef67b70b000000000016001485b802810298b0a773b62c89866823e1eeab08bb0000000001000000000102975b936f5b20d8fdfd0219a1c83453965535abcd3c672b9e02e501ea2879edc20000000000ffffffffa87c02e25115bbdd7ef4499bb0be9d69db561cfdb731d09548023c14d6bb472e100000006a47304402200afa123143cdca62ab3f258c9b1a7b10115bf8919eed81540114894e5fbf0b43022001c8d983018ad16b8ffa643aec25a0e33e49aa941a26d126e857a8b67d67b19701210208775110f02341939cd97bbeec6a56711e758b4fc607563eb2cf91c186f924e5ffffffff020c940000000000001600146b96fc51e1f0c6329e281b268eba5eb4964daa121e300200000000001976a91403728c88b1109188abaff163b2f378742a5b50f288ac02473044022016ea41a817ab5c689cc24708add01531bc236901ef0e10d0bdefcceab0efbafc02206ed8206c96c8a51f941c08320a24c9ae0b20f00ce9e50b40fec584740fa01c970121035d5e0feb6b4154fdadba069c80ceb2304452305195904bfe6b701278d8947273000000000001000000000101dafb78351fe54ec32c413975e09a6b1c2e71ed445e69554e024d2f2700bff3470200000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff1005bd00000000000017a9143c4b7cdc3df4e984037b668ee497fe24fa4ba53587649401000000000017a9140ebd362606c587b040c961cfa57a47ce8da4fad08765950100000000001600145e33ae40e86a500690d90a67f67fb193cabb63132d6b02000000000017a914648b61f277e0565536f70932a0969f793c342b7e87774403000000000017a914232496be1176412ecdc85dd133e1e74e056e831e875cd30300000000001976a91441983e6116eb9c2ad386ce13422ae8b514e06c1b88acde7e0600000000001976a914d1a0937fb98c183b315c634a66d5eedb3e3c700a88ac239e060000000000160014bb2e9f2fb61678c0c9c9daf468659d84e2b59d48cfbe10000000000017a91457abb161a9b92441ae5190936a40991399dcc2c487ca171400000000001600147303d921f328050b796788611c1ecb267fb03f530b0a1800000000001600140954b4463f2b1a093b1d1612149560eedcd1216f40e81b00000000001600145d73b1cd6e9c4f40a9bca5f5fc6bbdca9421716d77dc22000000000017a914c8e55de19c2eaa45f6bee646cd72c97ddccdce4b87461c27000000000017a914ff0070199461915d2170e69fcc30067cdec1615487c1d145000000000016001440b9649a08b230518f7534f9d529a62e85b81cf604dfc5000000000017a91452c051b666060db26b8ec7be35c439144c6768cf8704004730440220208e2df27a406f8bb012138b0ef6455af64b9cdf8869195518d9a735ff4962e702206251979f7e4d9be66752929158d24d0354f2e8e9f1b03d4987745c1cbc3e172a014730440220201b50281f6187f7ab9b259dc83af4efe412e0c557566818d9b5f581604edf86022001c9bb4eb6690b5bbd12dae6683af4bd5d1907c731d60e4f92dc389821d405420169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae47a00a000200000002fcbb2b64d40b607cd29ef62dd34ef2ec3354043a6d6d01ad637b8affc51d4b04000000006a47304402207cb4ceec7f1b75bfe29441bfa360077f7912c08fe804ef0d8a4392af1eea1d1a02207e3e915cd53acf231f509e7d9bf1779e5809c1a97cf226dcfe7ad45581d7edc80121028e306d64c8d1979bcb2151e7100a602610441ab34b318ceaac1108ceba902e5dfdffffff64e2ea7f2a9e90fe59edd7cf38216eca21ff47396f834d58e16a41288288e8f7390000006a473044022056096241f161b9be3390418747ffd821f94ef3e115cf7eb94bb1303e394cae8502204287a56fb20fa0faa60d5a6af61b26e8d63cb69b049e652adc637f07fbdafce3012102af54029c55da5919bb5d3542be4befccc6c5fe62aa510c3d02509fb330974e19fdffffff0240380000000000001976a91456f4bda98df8dc0e6fa2d033fca8e5b59a64864a88ac00b0710b0000000017a91434ab2d93bd3c169100863d4d561636c5b0a6cb758748a00a0001000000000101a21d4f81cdc9e8d8bb7508505548275653b058d9ec4be72b8d1d0498e39a8f5705000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff0318ddf50500000000160014f418ca7eef91236defd08f68151af7ba6e954988cab66000000000001600145be9874c6406518791088732db45ffa56b7c93135ccc76170000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c0438702483045022100a5a548157e3e862a5b62100fe0f0b835ad2b4f4187caeb619227883653ad1873022051a35323a745761621a64a9006c5f6f1576a21bc6d655081850016eeceeaa2da01210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff0000000001000000000101078a2784f354e8956e21ea98ac131a5b98690c249697f8c849e1b07cec8dd8a3010000000000000000021b9d3c00000000001600140efae5d7364aa7fbf7a04ababed43f0673f4566e54734100000000001600144a8e7d0a9608229ec3aab05e1afa82eb5e4de05d02483045022100e651b1a183cc2d1f4d20031394f136787f4c1f98b30025097b1247af233a496f02205da7d3b2372b8c2c69a9c4577d3ee1c03ecc6e4ad618b2de708eb635c8a4a612012102c109133f85d7b4633c5efdfcc5d04638d5e217feb46889f563ee593764c6bc6c00000000010000000001017ac074b203a2f8ac580e6a944fd96a47c9a1b71d730c46e50d6e81539cf85e0f000000000000000000027ea443050000000016001408162a8ea44f38cc706229bcbdab22504a28c9facf574c04000000001600140c00e098db890d270e1de154bca0bb23de5770280247304402206d52b6e914cf2ec75d5e367a582ea86a83164cd8f096d3d631a597ad734d5d600220576f3135483779e410ae2a75f17b6912cd91587255dfa2b1644ff9d724e5e2cc0121025eb24d96be53409536e21eda8ca6d91a7c253a998ff509485fb9ba7f966173a00000000001000000000101903c4e176e8ff82c0717d3eeecac24f5a4bca281fe6b6b0cd8fa9a637fd446e501000000000000000002a8760000000000001600143dc20c7abcbff52d93d8a3519cfa937d66f49876135e0000000000001600146599a90d7841a1723103676d83f11e28355ba6b50247304402205da67be8648bfa708fb0f060ad5b6cada4a54a61ee361b21894062aa5cad82e202201c72e562e9efb49db5d066892d2bf89a44d3c7e18ff6b4f14c446aab97caa288012103235826cc5f3f44754a76785db0228f283e4be2559ee03dd25396cd58b69e68a20000000001000000000101ea56b4357360517e972c8c743a2994f26424c3408bb64670c144bd4c86c14aef01000000000000000002c8c2030000000000160014e55ac1f4e8d1ed3d42ff228ba1bc3478e1976a0805a3100000000000160014d3877cef1b9c5c1ea3d855347aef6661bdde579f02483045022100cc6b2cf0858d30d18f42f8cabc77d24867b17d0a50a07af1b0b4a085b915545a02204629eba38a8426aa8a77d07087cb29749e0910937d29596ce83115f0d583211701210273ea661024c525a4bdbaeb7027337e1972ccbfb8e6abe420a26d890c288821be00000000010000000001014dcc9dc0e413ffe822413cfdf0257faf672643ff89cabbe052c36c3d93e8b3bb00000000000000000002f10d8b050000000016001408162a8ea44f38cc706229bcbdab22504a28c9fa5867ce0b000000001600149ff4c2b62ec7a44c21a03c702d6cbba9f57cefd70248304502210091a7e27606f055c3cc4e417b97bc73cb3e7b4d74b8cc677e97a80c1bc7ed301b0220783319c94e900b9124b3a9913b3a0dd04ac47e1e0ae778ac75c2122059673f0901210345c89e1e454a041810fe85ea32c304312e47a0f5fa70a9e8e26197f12df0e4db000000000100000000010180c335ebce6a72fe8f88a45d2c2f6b5efdf943f7da41c327782ead43512c2a690000000000000000000234a3040000000000160014f3496579cf6ee78530ee67716f6af7b36d167dcea7f5010000000000160014b1883e23ac9401429c3ec58a293cea4dcd7ad0ba02473044022007857facf7d29369f5e8a8a6b5a98cc9f2b96c1b416da945c3f1da4ce151f83d02207df25a96dcbcdaa739298e4d7665707d809d8e73cb97e0121c1bc6f3fa0efe9f012102fdfca8a637e9de855e73d32c3c66862a6b4ecd54b870d50b076a4e60246cad970000000001000000000101f791a328e8bb46547e365ebfb956f7d7d6bbac8865f77510ec38a22ed084205200000000000000000002a086010000000000160014b28558558747eb6da08e220114de1c41a612b5ee84b6130100000000160014f89dd4468508b478b14a84b5ba04fb119d13e0900247304402203b3b0860320283725a96e691cd13912410f07e233fa00be29d45cdcdbd5e83d10220512503cbefa30d950b2e23423d3af04b7f44fdeeda181c2016e3160dc28bf430012102c0945ce4e3dd1fdc9f917729a8a199e368d8cb62380a5059b3aec441372a2c7e000000000200000000010180339d98582164a8690b0041633c737502fbb19fb7539cb0f5efc2bd043f7f170100000000ffffffff025d104800000000001976a9147b7969a87b7ee4f42fadd6cce31899323c4ca78a88acff11ee2100000000160014b41ce198d0cf0095f951caac5bc0fba4580947340247304402202565783ac03198782825aed32dd9405331fc5f382070bf43c5587ffd66a6f8df02203ea333a7e7ba277ec2977b912be790400565cb46e92a417d0a3b555b4dc826be01210361d29062bd3cb07c3b86f705e66874d5f497c99395a3fea69e12bbabc3334c3a000000000200000000010122575d3915a8c8d15419eb3e1e41d43832a5dbc46f4964c7be42ef98da1c9f6b0100000000ffffffff0242a1051c000000001976a91460eb31a655386dbc7977cdd7a18a36f7c84f344c88ac106be80500000000160014d012dbb9db86d57c11a0dfc08133fadadc510c5602483045022100a4dc34b048ed4d1c41f284dbcf4c96cbcd6777b113cbe32a9c7b1d5d0c2ee76a022057f98a89d642598c36dfe8d98d787db83e405d9bf531a4cb56ff860f3acc5ca20121023c7da3166e6ce5fea14f569387ab67894a9401fd7549cc52620ba0f88be284ef0000000002000000019b288dc5d9e13b60826b4c5c9aa0a32b6700de048ee14e862421cba94f89fad2010000006a473044022027353e3b4a1a2e317c2a07e527f51edf873fa75cb86e3e76c7bb6660ab6618c1022043aa4549f069fde7be324153b42cc0d8d2ba80d796d175cfb94aa486262008d801210208b79248b18ccd4317da4dabc78c7b43befcf8b8fa3775c2f6f122e45f5c9f90ffffffff0252cf1a00000000001600147a76f990f93692c2e1f9068872852ca9304785dba7c94804000000001976a914e262644f2838225eff62b788e95e8b93864db56d88ac000000000200000000010115dd71e5b61eba9da4f6c2c4abb8441cc537ce6999f082f0d41b9a4bebb874740600000000feffffff04bbba14000000000017a91449534e1b57cb83b2bf7be8bd62e2092dc437079d87f4d20b00000000001976a9144d1fb4c48cc9fc675298103f633fb7072410870088acb5ca7a0400000000160014c130f273d77c570772e97d90e48fc0c7f38776e230883a000000000017a9140a1962ec0d09a72c1c59b3414ecf0ec311b95e26870247304402200fcd0395db013c66a48e69d8e59bc1a40c6007db7a01bf595fbd5233ab8ab3f602202390e8135c7888f9495595254cfb6a2fb4fc34bddea3226deddd6f9a44fae2e601210374db459fcd5f8a56823d9f8bc21eaaa48fdec9d4035d9f876d6a14ac338c21c346a00a0002000000000101add71acd73cda67ba9c13584e11df153df17572b6eb79b0aedd0e415f8681f700200000000feffffff03983205000000000017a91404ec82f1395153aa192ed565c99ad7c26b8dcad5878fd6520300000000160014c1616053066d8b563edb01a57d913c3a8fc1b7cd80bd220100000000160014f999d810cb28b37f66b73971a7b86f9d23743a200247304402205eb0c8f616533cfd6f333a16493a94fe6a141d10abbc69be0d78d43aa7e717ec02201ca8403726376eaff171ceb53e0ac30b7a07f3aac7ba5a0df1f82159bed70a300121036274f2eb0147fcfafb344b3a9355c54fb9959b6df08f04ead21ef0dcdd5b4e9348a00a00020000000001017d6135d961cdf97f0307f4a74500f840c76322e0053537907d7fbc7d2403bfb10100000000feffffff05c9680600000000001600149619786da233ddc98013ca9345f726cf03cc7b156d6f1c00000000001976a914d43b26fc3c7709391c0feb1d6e03d193659411e088ac47ebbd0200000000160014d7ccd48f266a423210e260ca53586a848a3986cccbfb38000000000017a914305a6a6201c17e89bcd16a24e6bb2974ae98e8ef871e113900000000001976a9141c0db03a96195e5a29bf238e932865241c2a013f88ac0247304402206749204ed1b7f1778927391e48f1822417708f9f7c469517e6a70f3a49f82b8b022056fcb0757567e23c65401befb9eb912b74187435d1451bd089ba15a7dfecf8b7012103d7e07389004395cf6e47d31392f54914917e19a454c696a6248e48320107cb8349a00a00020000000001013ac611a37c5b5190f08467cead3a5b3d4832b6503c40ee6380da4afc5ee089150000000000ffffffff02f73103000000000016001431362e4c72b9891ae3dd90c9304f1649f08c0c5e05f01200000000001600141030249a91627c0e250b014560ac56cdc382dcf30247304402203c1bcc6b80f182bda1aa8e23f5fafd91864055c30159f6c99d9b908ed1bcf3d002200aeb5cbb1087156213b6890424ab8b645c4b21426d678662ed4a8ab16c7f03570121021e3a77741d11d42dc793d50093db20737fe93bf4e5c2dc8185790620b3beb54400000000020000000001015f1a258838c2a0fb989ddbb5c90362d14f069484dc67f484e843f4335a7e9a630000000000ffffffff01212d03000000000017a9145cde351085b1187c876d8480186084f5965878cf87024730440220055c9c33389ef8a404d1dc9518e443ea7ea156190821a9d70733c5ca19abf26102201e8aacf62bdaf908c1f1e7282ee10e92ae29a81b3fb3726b0f8771ca9caebed9012103e5f631233756dab06f2bc656090ad77aa3fb7e588321d7c6c03d9cffda8c48ca0000000002000000000104cc704585a43ce16b4551db1505b8acf176119ecabe04f03b3afca54bc90758ed1400000017160014abb86952acba587279e213a89cbd2763b09419b5fdffffff1991d81c7ceae0027d88121878e707d053b8f104b36b95433829cc8b09a749a92900000017160014569a10d0056f077cef0c4c6b50766594654e8adffdffffff9e5c786826d6a92e36be426272c079cb78bab701a43a4f66cd960f08f04ef8ad000000001716001409164d65e72b05e7be8c543e1b668b928c172b19fdffffff1b9cd58857379096d2394deffec53184739d6ba24fb0d1a0460a81d558e23b3c00000000171600141c0a4a6c88d341234824c32f8a2046054f1837dffdffffff01491524000000000017a914559c054024f00bbe66df55ab81f5a9d7c79eba85870247304402202a0476bde67c3108456fdbdf94835c948be2eccaf744ceec96883b63c45905f002204207b4e9218bf651467382be3153ffaf48cea8ff5216f41b596c0aa8831a5cdf01210389f41fb0494d6cc55295b45e7db0e664a9ff903d268c69014d2cff40970de5ee0247304402205810e424d7dbcc8318d1841cb6b01d458c2b15aded9a247422b53e0cab3d4ae1022046a903554f837d766f910988af8fb0a49783f2c1df52b54659522c9d970f2f0a012102c5201849ed21d24d1531280d0d9c9826e83c2797c61b0043ba62e72e9aa3954f0247304402206ceac934300c87805237e1b93cf97cb0a197ec36d3132ee4ee4fcd5c8047212a02206b7e7f75a256ce68a662dd9ab7a14dcc823fd38a4568f2c9fe3c77e1ccaad6c5012103c2f2b79253e72727da66e14dee8f2555083351ecaf04d9875ca85156d8cce71902473044022012a0dab41699b3669cee83a21e512262b4f6db59936a988508d4d751adc9972f02200336059252db9b7db1867c154a678341bf32e6a69a8ae983fcdf98ec6ad85e160121026c6c4f489c263bd701a3062f9144ebe7196316ea5cd15e531dc3afdc3eed5b5149a00a00020000000148b6e1d2c206cbd007768bce6781c5fa48e5229cce8599d97b8215352f73afe5010000008a473044022031db4613c3a2eb50524320940e0e62ea0eb994a783a7c7e691c0c16b2468e89202206354f1020f7b616513c9b412a977f066ce3f97c2aa4054cdbac42329ead5ee9b0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff031339a109000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f0000000306dc420022020000000000001976a9143a0c7346d26d13dbecd0b6956cf1c5492cfe421588ac49a00a0002000000011f29f24af695ad8953d1e5fc656d5871c1cdb070c9f95fe92ea6a0a540e5b7b9000000008a47304402205364c20d77dfd25eb65c2d6bf69ee19151e3267d2e1605bc315cb9945259ec6c022014f654d8891225414ed3874e2d37633754fee4560c037c5d80c08fc022ff0d4e0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030730a109000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f0000022cfc6fc5401c0200000000000017a914bd68dd9bed35bf291a5d834ec75fd4325a26ebbd8749a00a0002000000013383770e338bce10c2bb71712daef1721434508a8d3a62ec4ba03aea96446e6c010000008a47304402204c590858dcdca1e099a65d9d1a2963fc8cbe2ad04d3a70690fcba6346be84115022046a3e492045abe0fc76388c225174a69118f27f163d73e0f539c0ea221c6e0fe0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f0000000ba43b740022020000000000001976a914c74aaedd7f255d438e3de7392aaee460e0ff8f4188ac0333a509000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0ca00a0002000000012f7fd6281c43427929c68e892eae397f2888d245f86c904b1d28e2bc91897484020000008a47304402200430431b75fb869af9c74649bdd51e9a503b548a1afcb134ecd0979afed5aa990220417bcee6623683d5c18f320edae4c707034bbc1e7c7055daf2974a3b0a57ab3a0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f0000000ad806d78022020000000000001976a9144d3cd6e756964f7d3011ac77a2988c1f0ca90b9388ace529a509000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac49a00a0002000000010f6123569f59505b603c4dce2b21276132b316fca8012af6faedd77bff7937e7020000008a4730440220088089b07defa819110c760e53470a5a7e93a3bfda35cea30a4e732cb44c1a9a02206fed468b44ede1a688ff1d82b80b52ded7351f7ec7a6031f2a42d6b995c4238f0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff03d920a509000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f00000002540be4001c0200000000000017a914b42a576e24994d328d505171a00e0df5df27fa4d8749a00a000200000001d48112d4783609ba0f602a5c1fae57bb381bf91763e9ca02cc0257ab870754ea00000000fdfd000047304402207967fd8abb03e0e8d9f6737379ea14e2b92ad27babe0a347066e334e87431f0202205691e41c5e4cda13ea8a7a4a2b363c0faf285f5c7096d84bae833812fb68b0b301483045022100db9a5bdf3fb86dc7d3dba28ed61a707f95b022d549b607b06e3139c960a7ca76022024a2099870ba1c2cff701fe3e6eacdac8795b9e443139d23a110e9ec228dfa73014c695221035c037a36e4ec9aa1aefcef02ff742bec63c098c0a7f1c9a1b822b6294afbb7102102a1ccf15bc58870240578a2922b3f0e922260f37098adbd988e15be36943816912102af3be4803e51fef309a51f0332f399026e99dae117dc2d22a71f4eacc1f3f4f153aeffffffff0376c879000000000017a914a7aedd0d1e77300fb06aa154c9a517b74c08d24587aa0a0000000000001976a9148b7ecd919c48bc58142d38795a155a062963ff7588ac0000000000000000166a146f6d6e69000000000000001f000017eb18c029000000000002000000014e59819cadb76de35a1e931c910e958e3e93023ad74e85e8e110ff56b7a4db70010000008a47304402206ede4e550cac738c120719dd4bc777a79cc6a97dc17eab44dc2e8c2e57e942e302207c6bfb399b818be3ff5c970c41460c7071160aaa04c4ddeff666ce7209b25c760141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f000000e8d4a5100022020000000000001976a914353e504dd287e55e168b96b3bcd71f2f3056b95888ac4bbf9e09000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac49a00a0002000000014a25e5ff034746be7c17448673e14d34d4337dc9050cfe72d1fcffe6b0e4a127010000008a47304402207ec7698afb90252d22c9cbd7410353b908273af36bfd0c22f2687488841e1ad902206855b86f32aa85075bb2ef7b145d00d932ef985c9df124c94ca6a24802c1f85c0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff0343389009000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f00000002540be40022020000000000001976a914519c88ca4efd6e1270356d08fdcb18ffc73d1e9288ac49a00a000200000000010103f3f8d4a349a22ed498ef337733879b5a976b2923d9af834df75dbce8b79d730100000000ffffffff02f9010100000000001976a914e34bcdb2b9e449a0e8a14101f84ea4583a09c80f88aca6670300000000001600146068c549e10aeb9659640c2e51219358baa4af6302473044022028fb15bf44b072c4e8fe42447c79a5287f2a41a3f4992b1f52ba9b04d214cd4e02204ffea3e63940a13db64af8bc1b41a9ed9db7981bad4f1623319022bd71ee28500121037557fd1063643d8a68990c593ba1842f62241335ff62fa07babf46a6e9fe383c0000000002000000000101b8aea3a703af7b46b67b1c43fc3434f9a2f93fda4d48ed7e5e072654e6960f1f0100000000ffffffff027b6f3200000000001976a914cfbb33fadcb5522f7f3db573c5303a426d8a927e88acc0ef7c0000000000160014b4f93871218e8c5308b75b21390ee7c07c8c6ae802473044022070867b23c7b79bc783034ee4e305cc7e66188ced828fcb2a5df9e2ac6612167a022063f953ceded72664b98cafcf5dde93f357bf657881c055eec87dd5f935e8c87f01210379de9a203f2374c16a700ba27e5b91e08956f17ab1626c4e83df15709e0aef470000000002000000000101c43a2d09acecbe6fd3a068e97aae03488603fe5e3706c562f97d76404095e5430100000000ffffffff02f5820100000000001976a9145c0491881afb8338c7c5d7df499a1795a50a214488ac8c081100000000001600144a6ef39555c93970c4ffda61371b93dc7a87a3c40247304402204c8296cc866d74e54f526f92bca0a96ead60a307a14e5f8e0645c105d452157002201a70bd137cd6d11797cb15dd8f3013fe90a9a36572d567f100db5479de63d40b0121028ccce3bae8a17653ac51ce41bdd5b9dea9e32dcb268d197f9c077c6d8a19b7c400000000020000000104f6f5679f340c4e1c7ccd27cf5100f1f0deff4d84f39211ca926255b2d05656020000008a47304402204982ed949f6f3ba84139fb982d371f158380d2b8d37ed74e7ea00c9c89ec542202206a4bd678a52b3a32d613c26175c7a46c108f2a56dd364ca764526350c1c6a8110141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f000009184e72a0002db69e09000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac22020000000000001976a914e798b41d0810a85fcbe2280d132a810d4ac14a0f88ac49a00a000200000001116819a4caa293c2fa3738d2ede4ea8a9c166bc9ddbda23f63ee32dc0fc4ba87000000008a473044022014df60a48544b8d67f9e6f0b35880ffb9b090e39a2a36049827903dc9ebfcbc202200655036d10aaf8a3e948a1c7537502981b3dd0dcd23f220f89e9493063f1b8a20141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f000000236c9bb880252f9009000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac22020000000000001976a914da2bbd71b0fd658b2e8ba456f3bd272d0db3ad3288ac49a00a00020000000001012e11fe49e4c0051a98a99ff95f2b7e695c913d77b0aee172305177e4b727d3340100000000ffffffff0218560000000000001976a914f01a6f5fceed70f63efa081d51a6f92b24a5f16088ac974324000000000016001496fe112deac3339323f9d2ab89691d8c60bf20ee02483045022100c6d6d98582e5705d849880d871c40554e8f7587737597de76d8d92ec9faf82d80220118494ba6c938c8d4f401dab77d8380972b491acb8dbce00ce910ade8377405c01210397c6f5265c770357bdba9448e1a235722373b1634efe08696f676dbceeb4f67a0000000002000000000101347f5db813158a6fd3d6dda503cb2044f61fa354464c28fc790061527fbb234a0100000000ffffffff0240551e00000000001976a9148320d3a4792ac6496329b4294a2b991ccd202a0288acfafa060000000000160014f6d3f9b8e103936b24903dea7f02dcd61b7f354f02483045022100db098db23612f6a131efe991ba1aef9bdf60559cfb2400dfb50bfa73397134a2022013695761f7cab289d22ce675caa87c8e021c7aa387ba1fc295e2b07b541b9fa2012102db8d517b945f83ece84024912ab8a8cdebd94edce7280d5cfe2c302dc862c5d10000000002000000014bdfa2807d7bcca96840f5f60b572640aa6746ca53314fd812a3e730fe1f2517010000008a473044022057b7b9dbee83541c2d659a8575d3dfa73e6c4ff050efa320b622a9b08d72124b02205fca5e250e76a1fe5003e6e8bcf6edac02f6628b8ea2f636b86d8a3487b10fb50141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f00000014af83db0022020000000000001976a914e533b3df4bcc090a49dc94058083f60d804283c388ac02f77009000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac49a00a00020000000001015db03386b9fd26e229f9682a4c56ca0ecc960cd2d57a897a378d9964063cd9710600000000ffffffff02505c0300000000001976a9149d84afb990d9089a2d7c40502d01a2d91096b5e788acaad305000000000016001482a9f0ad0d6b138e121c657ff73210b04f6ec3ac02483045022100a6de63b6915cd4320745050624e240f785fb8addac83cc6c9f9987b4f3a5433d02203b19846aea6328d706e2324bb1cc5c4e34ab32028453e3816c717d086afcf9530121031bbb398976cef5e35a490228311aee756b3fd22b8725a575dcd0f7cdeb70e0ff0000000002000000000101196fa177a4191b7d7ab4048252a043f7ba44ad6667e2f10fe20f641565f38d630100000000ffffffff0240771b00000000001976a914f3af4beb2d5be452bedaa946d25949154a67c69188ac78e3220000000000160014d791e778c6d52cf65c6ac7fb7a0785b8d504db7302473044022013ae0d0a364bb82909f048f72a767fcf983f178dd15f0dc30a123c6c54f1208e0220066aa6c344863e9acc32108f00f1da53476d963c6b8f87eb1c7edc26ecf9e6b20121023cd7105ae91eec34b0fca530e9160620c24d34818d156ce41cd01277e78bb5910000000002000000000101d3363b444952ffa12cd50b2d61188cfe03429cafabe9b0c7989c798e95f8a2730000000000fdffffff024b681e0000000000160014c0e55193472abdc9386ba0fc5a084a611db202ea2a8d190000000000160014d8477799535ff6613f8367f0b8b324a84eb1353c0247304402204d3de925092d52b9588910097724ff95c4412fef231c34534c6e697e2dd109970220529e81835e5f8a58537efa6dc0836a66778c5d7acf7efee035931429eadad9750121034e7b52977a3d489e1324bf76dad3a37b49f4968e3895a77c708701e6d14fa01549a00a00020000000001024d024b41be5a6e718263738a42cacdafc4447cf443162f196c04a2c1237fc0180000000000fdffffff11d9820e415cc61294af6da22f226e3ee106acfcb3c878e4c71c3ff7de67b4c20100000000fdffffff0266b30c00000000001976a91491ffafb8c66bb11704b011a3d186d1828f298cf288acdc490f000000000016001451ea2f2e1829cbd71e60b16868d5a289a9db288102473044022064d7cd28a83e08f8cd949f9af737b5000f2ea3921b55f6b0b51ae10d91e54fb302206deccb86b527baa4d2b6a4becfdce24618f9733ec49ea9296bff03100b23d7580121026f0ddb4a3edee6adf585a9550c258f5bd4b7898cbdf28a973935430913bbb8680247304402207b3174635d8a96c35c8c54e9b9e1835e2208bfb71651e2acbaeef03557e7454b02206a324f53eaac80846f25518e38f2b8a40c7d30bcbb1f836c954ebdf1f20d81f301210241cde802e772810bbee424dd31d8686baafb577b934497d9355f067091577e1c24a00a0002000000000104df61a43ddc20a811e5a70d88de45d9e5cb1baf44619e2bcf309b1f15274731fc2d00000000feffffff7901bdd53c839a10e2b944ba8ec0f6f51f763e41ea70792a9fd01d97e85ed3080000000017160014ff46a748eed9bb8e5ebf4b079965ff4169b7a8fefeffffff907cbbdb5ad0772e75ab2a2d661b523796b7a7f2a43adba465e47ef56ba352140600000017160014300cb82650a4a4a2120aeb77497b87dea424aebefeffffffdf487dab317b108993110f7d50c08185c32be18e45e8e327f1871bf837eefd8be902000000feffffff072ab10800000000001976a91470d84faa320a2c052a4398714066b25e84294dd188ac70af07000000000017a914ef85f7c9dd2b560a627106f03be2cd9be053b557872bbe0f000000000017a914406d2022a4e5d9aa2e7898f151a7672f9395c6b987d85900000000000017a914f231590cd1233044f7429ac4ffb7569b023dda9c87b6101b000000000017a9142c64684a2739b4e7bea6ea5bc8e34e35f3518a4c875eb216000000000016001482c990cf9f70fad955e5adbc58fc3bdd0b6ffb6f149f0900000000001976a914749ca7a200c2da2b8de3c96bc22b8a0f6801e62888ac0247304402201cccb63bcc1ee7ff184f6df98bba0caf077e34ef5e92cf1ca2b9931b6be7922402203624024030d1b473cc68ac96770c1abe7971fc0a8b6a54065b0ea5f7a68eec5401210211b2a20abe2ff787f4d2bd30b7651110f0bd6fd916f6c4dbb3331f5540dfc41c0247304402206355f3f6644137d19fe1af917f45651008d6c76fbe35ffd66024f68462c1153e022047048bda9824a23f7c42205cc5a3e7065a407c11490f5c8ef591894743abfcd301210295f662ecfc420666df42edc9cd29099ec3554f6aa0683a9452ef936fdf5078d80247304402202c6b9d2c936c397d1d6ffd73fbf2698b835897d79c25eb6e5e89498d568c6920022061ef810f2891bff38575a7a879c2b955ac8623ac8fec7261aa6ac702103e61b7012103d85f86fb4505a7b1a0692bb6d5921063ae242897d9c8673f0f208336561ed5880247304402200f02684a408ee5bcf6ac7f75237cc934db8abcc1362b53b5855d0600bba2ef0e022061148f24c89df2b9f1e87b2cecc4f71bd3ff41ed3703bf37cf42d42a5c97bd920121025c3dcbc5684b4f4b2f607f1741affae0c4d0e9f208a1721e2298242642b9e34e48a00a000200000000010123ae6975afc2291fc83bf0dfc0d2ddd017e65a74ffed19e358b2be2d3d390cef0000000000fdffffff025e8311000000000016001436f7c2011bc7cdb513f2bd1e1f639b475cac9a103677120000000000160014d78088bff9701a375abb00ba4b1d9e4c781dc9c20247304402206f8b611874088e14df9e7ad6efe3d20855857dbaca4494097aea9f585767b25402201f57673012f18d1b4fa375ff961b40f245037914f332bcf291adbb6e09c6745601210395f7433ea1a2abd28ac6ff0a2826d5dabf99cb1a53aa51c96b19a3576ad283c049a00a00020000000001014602273175af230e2172f45cb7237021ceea7cb51b875122b13c86a0a6670aa00100000000fdffffff02b575110000000000160014f92cea6f398aa497fa79aa02d8018f882949f02f03fe0000000000001976a914772c1b136375419c0bbcd3100f6e5e97dcac363a88ac0247304402203d63cc3d2f7e4ffd789ecfdc26c910c871cdd57acd553169dddc00d265dff570022071ed06f1d134ad9acc29b4b156728b32489de562b46a53c55ea536cafa70232401210394a59431a16c61a28d5034f42b4c2adbb005885e36a91e2332febbb509162b5949a00a00010000000001025e4bb86da65ab675365aac3050d07bcced9dda47efeb8bc168452a682097624d0000000000ffffffff8c902c5e0c2eede584cab9b8d940880ccf4f84e8ffc5920b3f958161157fe0f2000000006b483045022100b78d7237c92a6b0dd76bde9d4256d82f55cdd621b73aa9c183634628fd5dcb52022053a1fc3f2c7599f50d9d61deb8d53ad93adeb1df924a2dc5bc5755ad90e015de012103ffc8879b76b7d94603c6a171e5479569f80bca2a4a4c7752fe0ecf5fd58bf98dffffffff02803a54000000000017a9145f0efdb1779c6c8ddfd45d205f2ca5261ab06a31878d453e0000000000160014cfd4c82fa5abdc541a543383dd2f1c55d10036d50248304502210095c6d9a67c027f3dfc75b35d82110057182a7d16f38e1343926aa4e0376ccd8e0220023c264804ba1bd3928819a02b3db946bbc99e2a5e1f96eafa2359325215ce9f012103e2dc042584b50c8d8ce1430c3b9e41a4426456b789a01a8c9e65c3f5c5adf7e70000000000010000000001022cbb930364c6812c673da47cd74565000636be1a589a02b4dc9816b27fe96bc20100000000ffffffff5fc37e407df249c1f43bb8640fad307f1f2ac961a78ffb7fbdf7fd36b91a0015180000006b483045022100df6917882b92f1a0ac5e08df37f3a10b447663994e36d3104e64e00ab5f19be302207bf9824a0bc420217f92741b41860762bca39eaa7ad6c452a41c4c1531128fab012103b1f1fdeabdd404e7b0b2e653d163000f70e30321a13394660ae96d353976f631ffffffff0214050000000000001600145d715d0ad45d65539329242f75ffb1bb5e47ff7f90ca04000000000017a914da4f9cee619c862788a4566aad3e893dca66d7dc870247304402203828431d861728facec52af1c2e687c1ee9eda52fc14ddb4f4542ae2d4cd8de3022004640c8d6c7da4b184d5f8dcc66f65c840be6f27e2e1741b6d19147c654247d50121039a0230e4f383d5d188bb06de6bcd080b56695eb9a172e65eb4576b056e0cbe51000000000002000000000101085b347472800669ab6c3c2666c836811f9dd0006aebd0075e5c0c3cf076a9ab0100000000fdffffff021af710000000000016001423e753aa71531206dfb750023f8faa073c390deaabb0020000000000160014c628e28a1e009cedcf1f2fc51aa4516d8556df8d024730440220697cd32c8c5a43683f7fccc43241150a2bee9c57eecae11f33eb04eb8b0d9e75022063d43f3cc6405146ef54f5cbcf6688d6f452ddce73626e56984ba27904cf1ef20121029ce21fca00f3eff55a7d999fd00e66faf0aeeec03860a33cdfe85e5c4b46bf0249a00a0002000000000102ec769e6c417b7653ff16cb42f653384036e208b9b76c2ce3e7d55b3300fc198a19000000171600142e9d84797a7456fc8823b8df5060e12e34a30ee9feffffff18e40b4876f47d2bed1739591378f49bceaeedd2f8edccfe54b0deddee2b33820100000017160014c794319c7326752db63bce31ddbfb862cef15489feffffff0148b606000000000017a914171df1bb1344bb8d2d6414ed182277cfb635f503870247304402204f0b2f93b62452d5f6e2f08e71a431bf8958e5e207c879dddc24608bbf2254e0022056e7f4d0ba625de6a5bebe60e6924f6afc149bf6cef38664f29358f314d4ba24012102936ca3c3d85a86eb049ef4c34cda817eadc3c20fbad1af8567f2262e99483e77024730440220504ab9971f2731dc61b263c1d7dde5239f78d07a790979bfa4c82f5df3354cb302201f0869c4a84a4cef5aa4e6553764963e9bc4fa5529e11dbd9963570ffe652a9a012102f3b7fa20034511c4441b0096b2f7d44b109acd235d043786a9ebe30f8991240147a00a000200000000010197e2949ddfeda66faeb66cfd13dd6079438865ab34d63f1aba547e7ff18231ce0000000000fdffffff02a5bb100000000000160014c2ec02b7890a94f6c69a328a2a84f4458a3f65a69fb600000000000017a914b85239cf1f83fbc556d2fb89f5513778343600038702473044022043c525fb45a7bc20fa0ffc9b086514c3a4d18039d61331ff95895c50167fdcf502205bfa199476fcf7c648cb8221747f1365b73d77fd116e01e43a88a64f31d85051012102c8ab4c5e637072e2b8fe86e847693d5e26f1ed49b45044f48b6cb90fa504f58b49a00a00020000000001011d5a401db5770823e71a23eeabf97bb991998218206054bbef1d0e7934f0c11400000000232200209bba3255ac5cd7e4e2ef900a108ad96f27f7bc484b51d819441253a8546d1db0fdffffff0158560900000000001976a914ababce7f98457e0b2bb1a2c7e20a74f56874778d88ac054830450221009ffe8f9d7c79358b39a8e95e347229306a458f5c10708f5300fa67853e9b8e3902202dcc1dff92197789f53579271b7734c3bfdf410798232fb0cb7f13dcac1d549d0121033d863a272ef48b92bd390660aa1c2862fb5655685f7df87f8d547e6c4f31a20120780983d26ddbdd710bc8a059ef2d0091978bea5f6836e747dcf2a7c460051aeb0101c67651876375141c3cc68f41e7215304d62e34449ec1fc0d8c8b7b144dbb5a18bf2db2d3a94fd390d1c52a4245ae0e1f677652876375141c3cc68f41e7215304d62e34449ec1fc0d8c8b7b1460cb1eb79f3d53e8e2e6b83632b7b8c30aa2273d6776538763751470c5e503d6e39b6e45a60b623773e1b0a56c2fdc1436ee1808ce48b67df04b06a331923ece3f5180936754881470c5e503d6e39b6e45a60b623773e1b0a56c2fdc14c5b206d4d3d6cec50bec5ce2b7108c6fbc1d408f6868687ba98878a988ac0000000002000000000101c10e2a87b49b5142a99e75dad34bab97dd33a825522c24e951484102c6b91cb801000000171600144d22208ef12281650b253b6876dcf91ed29d9e06fdffffff03838a3a000000000017a914dd2119f0e678588b83f19274b21f321e27dfdfb887619700000000000017a91434c5681333692876f346b3a9bf98f9045ddf376c87965d3b000000000017a91440eaf2f263e922aa6486b98603e9557269466d72870247304402205e32eb6dbca28d3795d16855dd4c7ef29b6f12688e7cca61f2e98c13bde62ba10220168228918dd25c58dcee448d0753ea1ff3cbdbca892a9d115ecb6acaa591b9e6012103a5e0d71bf03368e6309cee3fff18aa2e7322496574fd788248efb4305ee0c08c0000000002000000000101e92530fdf77ee49fcd6d1ef08a41692a5b48ee20c8750f729ad340d0be410d7502000000171600143aa65288345665c1e1e6988f80b8319b5d675f79fdffffff038c4231000000000017a914b2806d465d41d6855625c8477e66b0ddc065239f87627f00000000000017a9147070b3be9abbb607e80fafa56b4d46c8082654fc877cda3c000000000017a914fcfa42f68c1c6046832311beec3821e702decc6a87024830450221009e7e9f8053ce2ac7011b775e076c296f5502bd79d570eefd982691a06c510e51022043747efd7164af953860fe3e6b2f8365274ea903d3d4302ada18d64a31ee4d0d012103ee25eefcf869f9900517c3b03c7c69cb7f2ea707da48473d6d93204b7c696ed50000000002000000000101a80ab67a6e3de009bb2b231687557c2991e9d887d5a67d02f4eccc799ad0a0730100000000fdffffff0258920100000000001976a914c90a385c377005bc5fd2f1d1882f552da8603ed588acace7160000000000160014ef19973155806b9ea6d1ba038010b882c36e03c20247304402205623def1addb850008e68ec96088cd4d3f43d55ad962634a052e6676cf41c2c1022076ea999ca1589e92797775cde618be4dcf56ddf0f9878bc86239c04833fc431a012102bcd53eee3e927726775ac6b4f34176a8ac55a6fe7ea1ee6a9e6b4a7f2539291148a00a0001000000000101fae7ce79a027115fe6d889d763fabd1829bfb1858f9f369d54f47abacaefd2980100000017160014d94289afa0fa7cffe41ffb40be10bfcdf2b38ea5ffffffff3e622620000000000016001425e0bd3c29f54210021869a39e7ecf8db721a697395600000000000017a9140d01f7d5b1f247114df1609b91f7a7278f6e727487236a3600000000001600147bd323097dc8cc8ee02b694902779287fa1fd08b709400000000000017a9149afa4cc0f8c82a864d96953617f11a5ad4d7affe878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7669b22100000000001976a9141a9a289c4d1d3d31e5cf83b7490c6aa5cd20c47d88acece60400000000001600146e7a66d14233c5e24dd5598cd817d93fbeac890f8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c38003000000000017a914ab359fbb916fce6d8efb9a6777fb962e4a3257ab875a3c000000000000160014848ec6955dfa189c971aba2b50efbe7eb3aaca320aa901000000000017a914567d5f8c4226106c7d3dc122aac00b1550836d7c87815d0300000000001976a914e8a230b6f356e61e270853522de5bbded4ffc78088ac126103000000000017a914a8eff5da52fea29937884d0bcdf1b377ccfe8105877e2e00000000000017a914005e6f8d35683adfdf6191ebaf416f7c3b25a63087fe190100000000001976a9149d289ff8b555f234507865aabcd4f0bec031ad0b88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76027102000000000017a9144610172f859fb9e4e359761f2ebeab34d9faea9887ca0201000000000017a914734d26b3eb655f57a4a873648e72cc5ecdcc104487e6c203000000000017a9147363171a3d3a07c60cc7a9eaecd9775472fed97c87b0ad01000000000017a914f1a3525a684d7a435ea745438a55dc95baa7817f87540502000000000017a914dcff4ce7baf86296255b159bb90cadcc39f038578799fb0a000000000017a914f00bca4dff8bea97651fa3720c28f7ec4ae916488776ef0000000000001976a91464056fa77fce80723fb085b52aab7f0ae0d3be0788acb3e20300000000001976a91496bb253ec9c933ec2e379f35fbe665b4adf5a92888acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7668d10f000000000017a91424affbb9f11f1ef273c5e705b9d061da51068d6a87023401000000000017a91492813b7aa9061a61c67a722665cf85ad18e92b1687fece00000000000017a9140a211cf1581d0c4dd698b0b90718eead106f942087078b0300000000001976a9145b33747acc116fd58455096858a8138bb429ee2788ac18ad21000000000017a914778f237ba0bfb5bca38a5967d0ec0c420962906d87b7d700000000000017a9140f06904a884a79f814e607d49b66d7ddd34f7bc8878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd761a9806000000000016001458fe0831c2839e5c006538ed5e19ca68e0c91a42c0e44e000000000017a9141fbc096e631ec34a9b986ecd90b6d04e95df028787ce5e0200000000001976a91469bf55415581628361bca94b5f7bcff19009684988acc2ed01000000000017a914e746c564faed82509246139297c3aa15b9ea995487f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76872d01000000000017a914038f74775de9de6336554ecd0704be14f0f79c0187790201000000000017a914a797298a23c99481f837a7519edea7cd8f34dec387314808000000000017a914aab09dd76e5ff55a569d0f9d1323f92768c2464887815d03000000000017a9148bbfac936bd3b376abe68db2caa8b36a8f445951874d810000000000001976a914a327a6e953fde66aac293034565f0de66a10f39d88ac1ee80100000000001976a914a23e9ea8dd4d79990dea8d1dbb1c57582972424788ac3fc00000000000001976a914dfdd20c458aa3b1ca5f2009e03e55f5f6e4bda9788ac88d200000000000017a9147ad181f4b7a8c0f8c0a8cee4a92e53b0ad80b27a87c0e1e4000000000017a9149497edaa822c73b8879deafcf853634aaf5a4f5d8734aa09000000000016001453f72c74c7b7d759db8517d3615770b7050d7c6cb1ef00000000000017a91437a1d356180d0c1c0994d115692704092747954b8742ee460000000000160014653f10ae29f0f1590727c13abd98a004cfd0e91591bd0000000000001976a91430903f327a6a95b9cdf9bfbfe71b64c60a42165d88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7636703100000000001976a914f5583e84afa06e2d3edb1b540995967f3aafc04088acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd769cf900000000000017a9148b61d1318d82ef3e0eb4345bb94f789701630be687808d5b0000000000160014e5281bafa1a117c09b0b30a898369896f276bf4f27bb0600000000001976a914c88fb87129ffb005cd20b1a2dcc34e3e2640be2e88ac2ee10400000000001976a914920e5b97132330e81526b0146f378267e364143588ac8e0c0800000000001976a9148589242db0c36f6b035dd672a82f3e58d669251b88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd760247304402205cc44b78e047c63f38028d62ef1252ce98f340a4f65fea15d9b024626ec2ac3e022057829900aa4da4a819f254182f04b9df76cb46cb380d54030a2032818f0e442d01210318ce0c82728e86281f7242c8d9bdacfe542e140f2cabfef943b336148dc8805a000000000100000000010169592f0fbe5458f68fa16bb861fbc0fb63d0de54edc0f2d6844637eff112801f0000000000ffffffff0102222000000000001976a91415912e94cdd9a6a969967ca0bcf8f87ceffd20d088ac0247304402200887d262ca64227602e390faed500bee19f22c3e7bd31425578c0ba5c4feb7c802200d6338f74ede94e466816e0fff673c11a8c26eebbf72f58de94800f6c826aa3101210394c23e2bea67407bd3886a9f03216cf58e0687adfc4a3bc6b69254b7d43e5e460000000001000000000101040ac828cb5ca98e62455c0ceed61a254e5805c8510960a54db40f8045e643c60300000000fdffffff04e5ea03000000000017a914e82f51299b2d6c21ce8890b5085d0123e9b857458727eb03000000000017a9149495ab703c5acd9944b8a35afcfc6c4301ffb80c8740180d000000000017a914b78e8fcc710ac5efad59aaace523e56e2e659b418760803201000000001600148f198fae9651ce75a4e96d61054b542e69515c1d024730440220530b9f9602fb4aa262b40dc10442c8180ebfa5ce096c795ca058efb4e4eacfe50220755be1af32f49e3da8eb795c9e38957cf4c3f2b7911b6d099ef120a6f0ad125b012103b8ee38101c41483d4207df0b42f69f2c54cdeabf70a3eb24c2c122f414a4428f0000000001000000000101603a91bf4fe756f0f38b36f64b285543e1ba539dfde4667b1a20a713b0eebaed0200000023220020bd16730af3d19dd63b50b78bca38b9debe1e46cf208dc31400e39559d72fe571fdffffff021df30c000000000017a91490d4f8e6d56869c71250a899d789adb509f6b5a187fb1d0000000000002200209a8fcc511550e3b9bbefaa12b882a2f3b70132d420b1aacbea7283d656aff09e0400483045022100e77db0743d566554396de0d92368a9af0916246489acdcab25f2617bdd41362802204559a8e2e699798e0a6259c0e6d5aaba21960257191f5b8e6fad2100d11477f501483045022100daa54f0a0700e4ce78c79c93609a0657ecb65fea8e2c2945d10d1a10f70eb70102205d3b3866ccde72a7d22f7fa3d49d5ffdcc3c158de6d2c74968be1b8c9181181e0169522103176ff6d92cae5eec08a20d0699095b154685c72113baa6c9a4b7522203e4d3d1210236804d999932173a83244305e62625b76ea69fdd937147fbbff1adf2ab492246210323490adfe654ae8adc11114253d5e3d91d3609fd6e963fe1a9df3fdb3b9736e253ae000000000100000000010100e68cde6fcf8df65c0ea90d81ee4afa4bd4569e79741b90f6f1aebda49377750100000017160014543b22e0cdc077a1c0eb4ec1f1bacf861a4f9a4affffffff01c25903000000000017a914f6fa236eb0447902456f815ab6416222cefc40268702473044022045fa84b94a6985cec89d40ee6ee938ab68ac87ca547488ee13112cc5f6bc2b4002207e5856e4602197387f2d5c691400c5cb763ad38529fddefcd6424514dd7ef2d30121022c6507b51bd0aa784cd814860c70e5584de918b39b592f2fe73cd7a1b40d2e2500000000020000000001011902d84f23a9cad9fc211f001c6600ab60455a133cca976ab2461a0bc3f80d2523000000171600148e1ce632d871d78d7e547d983c756a3762ac3c0efdffffff01295901000000000017a914a7674c12ee520b7e6383490c3dcdd9e4465fb8138702473044022032ac26614e41bbd1bcef1962606909cecd44a32e8fae0bd90fc457f07d54961d0220653741314e401214ea235a8ce3e65d9d2c92c999f7c6c292f92d6c50056ab7720121021d2f8c3fc72a79f92530d5e11874b5f215e36c0668922db9b4af83a49bf8332448a00a000100000000010132db70351d13ddafda504f2acccfdac968cca8126e7e439c937af6a60f859e520000000017160014649604d03f7bb5fb44dff876883e87b0c945a2c7ffffffff02bc2309000000000017a91476f372f32c5e5a1316c397ed0a94e2b22833d40b87009f24000000000017a914e625bfd863c9a5849828445fbaf59187c77d56118702483045022100a5ccdca46a240992d71b0fe3b860dc418720e79724a6abd6c2d6ad02aacc74e20220421d5e24b46ec213f65bd201b88b784df272a864dace4b5fe57f9395b44449f4012103a457bfc74edbb64a74bfb05931f371284e0849367cb592d4791cc8af84d889130000000002000000000101793091abb7367ec465ebca78601fad4288e0244afa6803c9e47c1962ea35f32d0500000000fdffffff1040548900000000001600141882322d20b18c744ff499eddd117c50df44f42d458f03000000000017a914836dbf2c0e605c29dc01e651a417755c8e55f589871df07700000000001976a9142d912611da115d1ce832bc146638f062f38fb63e88ac5c5c410000000000160014562245d661165af5cefb80a24d8b8f4af7e438405c191a000000000017a91431ef3b60214554e4083d082ad4b997d05e11d35287dba501000000000017a914527899399864be275842b01daa740d515b43d19687e4111400000000001976a914aa61db8865c1be5e943cb53616750386c277f63488acd36c0400000000001976a9148770294629b77fa5feeb88e486ee5209f2ae163488ac705d1e000000000017a9146ac37fdbb395ced8fa70a73cd60d51edf1cda6ff8714663f00000000001600149b38bc9617b52f51399cc1d7c8cb15842110e9ef4f4d220000000000160014c3ce3f567d216dfea2cacc5a5600f3c34f31cdd0a47011000000000017a914ab4b0f74e4dbfda300455ce79420dbffa6721bdb87223e0d00000000001976a914f56d5e2e9ab3d4a74191b5721f867aa8e1b99f4b88ac1f5c4a0f000000001600148d4bc188a25e4350d60d2ebbe08318b81f47318d8ee7160100000000160014fa9ef4ca31d13ca20980561fc4fc3f43038c78e98867ec00000000001976a9149187a2ceb80f1d99d2f8a790b110bf8d88cfe1df88ac0247304402203c498bbc67409a64f2054e9fcaf8ce7fd67de5ae475ab3ebb84506ab5476e8ed022023b7dbef825ac3496ba9b565945b0a6b7da5c3ce7c3515b0765646eafe723504012102e8f54f00e3b9688ea47ee844e5ed6fc10561e770ba15bfa98aee1cd96643d7af3ba00a0002000000000101743fae5537be6b137212d6f27b1a8f5171e7f0d58bc25cbee10a364c5697022c0e00000000ffffffff02daa60800000000001976a91457404a221d421988291e5ef3227e57bbe14bf0f088ac643f0e01000000001600142a8f33fadb33404a8ec4d77132ba83508a7bb0ee024730440220456cc85f827cc15aa947377dba5b793d74a13183865476139d6ba6e84a6fe1840220089023e75ab0df6f7210985e57ca56ea393fded494f772adc7255f6edd726db5012103bec856b176143886d7aeb20e172721e2651be120e6756aae1230fd42874937840000000002000000000101f188f1b905c07c6047c113aa989703b66480ee3fae9912877e3b8585ab180d9e0100000000ffffffff02a7020100000000001976a914a4cad39e8e7c350a964746e3d7e0dbbb7d64565f88acef370d01000000001600142c59860dadab391ee1ab19dada715ec93fb47eb602483045022100d83566c42e7a38ff716d24864a0e3f6304955c584d05a3b90f10152a4db79b3f02202fbdb81ac2688c76537ba2a7fe5bf123d5372145394fa9166a4eab335a4410d2012102ead5f8f2743f5b0f89f116f48032b42542ac9b789f589973b1eaf298a32866330000000002000000000101f7b3fff2702c77f6ea6264a5be2c95723cbc38e84e38ef10ce0083b19ff47f9a0100000000ffffffff02135303000000000017a9140f2d91a86a13625c39559b5f4e0112565fe0be3b8724e00901000000001600142c59860dadab391ee1ab19dada715ec93fb47eb602483045022100e4728d6846991691836bd0ea8ac8b1fb0b9a8ca417d80e89d228eb99eb9a8bae022051c59ce09e3bed72326e2f766e86d5f62aa3d5f25e74bfc03db2b295d8f34dc4012103af6981e71dc165c6b781c98cf267209689b6f0f7f2c3a727bbf0f501e52b9c340000000002000000000101cee9cb3487d480340c80cb2750e70f944a6bf3123f400ba1ba9288527feb5f350100000000ffffffff026a782b000000000017a91414be93a8a8b14f26a1e3e52b9aaf615b14a9e2b0874b08050000000000160014761142dfdddd23918741278f45e3df94e6df621b02483045022100882614a02e79a6e537a1d2de8379b9b1a7ff769c57eaa8065a8980d0fe4e95d1022064a46d56ebd78c2000b17514e40cb7663868cb476a64b7dc9bdcd2ef945ab5d2012103874e1a80b84520ae1bec0c30a7fe6d193fb38c2bc8980eadddd717c03590ab160000000002000000000101c85ac1fd46691cc7eb4deec771bb9e16093ca5aa600a9792d3c65737a4bcfc510100000000ffffffff02503403000000000017a91429a68d793ba493ab895cc6b2720798501922f689870719110000000000160014103ffa6cd5e46a64ab26dd7593cf8162470608be024830450221009073432952d1bd239ad8fc14eb50be22426b0f58cf8f7722f8c3413909aeb36a02204f888574d287e158f9b60fcddddfac8dbc029ae847224be320e807c33939c62101210395e79db629868b754f8efc7cca3dbfad7caddf6c1b5b262e0983a13f1064e0020000000002000000000101d1b2804ae98c5a21e54e0fb7a593aa6ee4fb62bc924743c000339ec1525c93340100000000ffffffff02f80101000000000017a9147d0351f9f43352ed8d118955a9fcb99d8d9fbe07871517000000000000160014834b8604cf431fb0af7ac4e5c5db62c49987561b02483045022100cd7103efe4ec70a478b5ef96fcd2a6f71064cfce6f61c3a1a2c9d4990926693c02203d67af374a1664e63dfc2c119e8ecd0288f09fa4c4e0c48a42ac9f22708a6643012103f4cf7277423da7f5cf02f54517940a2bcf3c2a4a97d652be58d562b083912aa50000000002000000000101525ce0d1d9fed6248b7385546149393cb145c871edaf4bdfd5c7ca5f60fa36c00300000000ffffffff026cb82f000000000017a91419a3cd3143be23ab122403e65c7f4eb4cedc3032873f18000000000000160014b7ddf27b6959e472e0653ffd4d55029d957bb90a02483045022100d99bf06aec31e2190e45e80e5e24a0099bcb4a976d51a1b08e0fb7229e4cca1202206dfcd5579e572de0ecbc1e3e378630a48cfda53d4e602ea0c8265079aa416c54012102fb83fe495a675419651ac27d8964741c58ea69e312e1086a6817b5566dcae6d8000000000200000000010141b29e0bb47fcffc3640c4e8aad85d31592b93a5f74c19870c3a7f6358487d901700000000ffffffff02ca720000000000001600149173c979740754a298d2173414cae3bf7e43a3104ffc3f000000000017a914641913b1448655badb5e8b19b1b8082a2fcd22118702483045022100fa5460decf8c7f8eaed21d2d7bfcd66f66b2a97938cb66f932a9049f4356f86e02206ca7eb9d5af1dd0a0e4f757687930c7ca99dabf83d1530f46eb441c4978cce77012102256d65c71e4ece9b21ae1c637d35402cc409a02318b0641e30960c9af3942b6400000000020000000001011b673d0cd991db9634be806cd3390c66c80687ee127a8e4fe7272499efd353730100000000ffffffff02cce901000000000017a9145491b104ec45ba3fc7fdeb72a278ac2f56f32f6f87dd7c77000000000016001479e8a6464dcd8e2f815abe47c00ff5786e817946024730440220673510e01d355898f32972fc0124bd1856d3c8fea86c03cc44d36c988d655d71022036a78c35dfc64b93f3e93a7cb5f2bbd8b9aa120e45456d47ebbd41c7be716851012102bc5eca2277949663c8fb6c1dd30b36bbf1dc0170cd66980e2e73a40007dc5019000000000200000000010153c724fdd64b16f26366c1161410e80e47a48f75f609835630ce9535c1660b2e0100000000ffffffff02565901000000000017a914b5a11803c80fc2a2538e6e77f77d0583e5c3c85987c36e820000000000160014cfe73216e23b9b28956db8638d560ad1c1ee1f4d024730440220465d891c1613c5c21c590c5f0507fa9b63570ec9e685b4fea1003254df0bf1140220191481bddc03192c692f408bc7d4971fb9b3f7bec11c84ee0896a59da0074e2b012103e332531f8a83c3ff40cf8b26488c3776b71d6361383459a1b85d4f6fd9970228000000000200000000010150ea0c43c53b4f3932a09053bcd94913a27987346a057d6312a3fda523a816090100000000ffffffff02565600000000000017a91499eb6b2116ef20f68d65970bc5dce86ba1bfe775876651810000000000160014a2a26e5c3a433d5bea4043027d1b0d8c1f3f7fbd02483045022100b0a225e6104670bbf756f849e7df98ded3ec7b617d494c9c995da86e761e42a9022072b7fbacaf559b154ba67a266bc08b653cb0c98e9006b23f754f5358ebb342e201210229f1d795efd966cf901a8284c6cad92bfee2ab6156d58571afa6dc55daa78e1f00000000020000000001011ac1ad6ca2769eb96865b2aee892dc1f3f5aa946933ba789a0ceceadd06076ba0000000000ffffffff0228ae01000000000017a914b6b5f300455865335707c28dc9c01ea8093ec25587d302090000000000160014db59f9218a15584b299e3428510d838adf3356f702483045022100d919712e579e0eca745fe5b459ec8157802f73702209cf8a7ad1279b762d2154022020b4236f6bc4633bcb2bf4c5ee4daed35edb51f6235ac3fe775532eed9ec8f1b01210353174b4f691297ecc945975fea12188872b87fe401c4d468c061ece583f3b4e100000000020000000001018689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd2d00000000ffffffff02d06c04000000000017a914eadc0bdcfb02e80d595429ada451fcd553151eb6875f9d1d0000000000160014744674a015d040af92c66bf14c1898c2ba7ff08e0247304402207e6966268b34017ce3852519b9c4615ecb7d4cefd9998a63baa5c6f41ca9738d02203d23028f45a3773abb6d068e79486dd6530092fcf6aca725c2dd49e7a8fb31a4012103fcf79bab0fb67276005451bc932c4ece4997fd58e7de2d68da4f9f3be24b07e80000000002000000000101474d2690125abe0940d4f10d351cd08244784b4181fbcc876c6d870b9a52c9822200000000ffffffff027dbd06000000000016001499272c1f46b721d334d935b77de318af55f245201d0625000000000017a91465bdf585a60a14d43fdbfbe7b00ad262d4b390138702483045022100fa2b78cad6584ab21d2f8953dab3ea48f1d65895c5b846660615ae25b3ed8a54022046d522fc6d7f2a1ada7ade60cfe1f47589d15b339db565601679174be0b90a25012102e6df5facf4eb93fa3bbed71a21e2997cb058ab10401f4c3c3883754ad85c3d6400000000020000000001011be7b3fda7ee4e7df4fec49cf9c530afbffc98f168b6d4ee059f92a22cf882190100000000ffffffff0285b706000000000017a9147eff8eef74cc4b67d48ae661090c20361bc6c13787225803000000000016001410f0fa812254a9913a37580ad75ed5f239da5f8d0247304402205d8624e2543674f1611369996d05518ee238787960aecbabd4b48ae12e12330202207e56933503ca1d5c0185de854e0303a05cd9620c831d44c5052e1e52cc7d174c012102a65aa4ef7fbb63ae09abe4da57290c298486e21363176c2ab7ada9a30248281e0000000002000000000101191e7f6ed24824262cb2fdcaa3da1e10fe661cb96f1e0d14500949a3cc83a7430100000000ffffffff02842e0e000000000017a91490a1ca06d65c6a376a8eec131e3a0bdf1f688da7870a15230000000000160014d644c415b39939b4ed3a32fa11b00d1656430693024730440220247386a5c645b16d21c0d9eb058c72119050558630519f9ea9f6cb9626b9796e0220024dc149430faafa65e2434a10e327d9166b93dced67f3e80b4f1a7d7593cc0a012103ebc58ac226c93521674ea05703ce7bf9947b8dbf302d4b4bd4eced1093413522000000000100000000010117fb730fe5e49af31bd9c9c928116f73119b7d53c7632d20d1e04ab204dfc5d70100000017160014c213fd2d1325bde5f7afe2038eac80337aadd2f6ffffffff02267500000000000017a9147157c32528bd8ae7aa9805df11a9b85c80889d2d87fe0e06000000000017a914453284c1778a486792164c2eed76662c1d45e0e18702473044022068a63aec0c6ac150d15744097a4229ad3729062bf467dddad3f751fe8f8134ba02207c53d0c72ad87c9a0819b1fef3c44a72cb1fb0306fc3dec0e5ed916e4d7de794012103ab4c33f36fc6c2c7b437cbd1fc53f08fdfc93429b5879f1670a289c42d4d056b00000000020000000001032e530767e6fe20171d20e41c0fb909e002cead373d3c5fcaeb1abb3958dadd4c0000000000ffffffffda80317156f7cede1a5c9e033a4e1f5cfdf853fcf87b55c188e35668b15e82ca0100000000ffffffffba67f9ae085d1b7bb9fafdbdcc76f802d93d9966cd744cf6b1dcbb684962bd6d0000000000ffffffff026cc48c0100000000160014e4fde8cfb67a6c8cc274d8c81646eddfb430616973f1060000000000160014bc018679bc8ea08ca4a9a8f5af5536cfd9b99fe502483045022100fbea96bde65f142dc5c052c6c2e9c9d977ba4d3b82e79678740cafd433c044270220550f81f18e0d5430a55921f7af1290075b03e2220790a5b7a790647bb0d28b590121023c69a93d25fc0c52db6bdd5d0abfa9a7d491fa4a0cac22f5c25dd6c2a73e36f00247304402204d8a726470f46738028cc22cb999a2072e8c9899021238decacce6ec9562d751022015940def0ea2d3531c13d16ef3664cdee42d5a0ff79c7b9b8af5e3fa9027f954012102a4ef72a62167ab1ce5016a89fa196044388eb3cc34f5c393d5fb495e1c0fee7a02483045022100f7e20e35a0f1771c783108a2c0ce73b359070b9da8bccaae9288a6bae86f3513022064a0ddde5ac14be44af508d15c8324fb2b750d8270598817e9933d20f5b1e251012103b30db0385b21396d13f2d35b30c9dd9864287cccaa034e6e758caf0c8e1d555100000000020000000001019ef09ebcac1dc179d2b3e5eac21586701a7a1e94fce39cd925d489b41d6d3520330000001716001428e46768a759942d07196ee9f5847b467326caf4ffffffff064b860200000000001976a914167b14f615988fe48f85ace41abc95a6faf6c19288acd8ac03000000000017a914d05b06bdbc91b0629c81430d5320055bfd44abd08720a107000000000017a9141e16561839e60f68010959fb19c211eb1225a6568793230300000000001976a914c9d5a5c06468088ab7ced3ebf499ff85b654c3cb88ace1d80e00000000001976a914b47af6b671decc5233f6bd2e66c6a259ff76a06f88ac3a0700000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e048702473044022025b168896ee9a59ce2f37cfda176cfe6f4569cba26f57a4b092930d58e7dfbc10220792a01ce126d034c7d64bac093c3a0bc0c1d36e18136f06829e5f20738283172012103ef01ebaaee7e3f69baa508cfcee976162bbf2b7d0fcaa16b0bbae606592f893f000000000200000000010192891bda419733e9769bc7f1f7442ae4cda4bb43e7b07a1bcb3e3480df3258450100000017160014d36768a941510633abbd5804556f6b4d24106e11fdffffff02a4d620000000000017a91464e914f0144f1f2f20cb34ad2654e729208278bc8750ade8860000000017a914dabee60d29aa48180c1105ee08adead9c63d301c8702473044022069d76044376e9bf18c363426df56ec7eac10a6d8d8ee2c2c6e7a96eafe0e04b1022030da596ee6253809e8ae2365ce1a736677f9db0dcde7b327c0222d22209d4fe8012102661d97194af4cb6233f96d46aa991cad95215e31cb261cf06ef4b6271afa2d4c47a00a00020000000001012473660604a298b09fc3b7f90e5fffd4bb0c2ab392b9c8a36ce753303ce1a43b010000001716001446241f4ccb526b9d0ef85e8441039b8a7e02424ffdffffff029f484200000000001976a91462d5f1a2ebd595d16561382888ab84e9a5c6b32588acc160a6860000000017a914af532be08f45206ef9c98aeffbf24eb2034dc1a4870248304502210088d68956502285228156e2e3afcb6361202a8f40fc554652b3c0cde23af761d7022031ebeef097145c5951b6295409f4b624987be53f0080983ab1cefa25590ea55d012102fa593e703841c61122f138d55a806cb95b3955533ed58def89879328274b93d538a00a0002000000000101e1eb4d461da51c59a24340134ee7d90a97bf7ba0d99352a4dceb8a4601cb51c0010000001716001429470b614140b65971e1e6e7e15850b196be4bb5fdffffff02bc2d33100000000017a9147908cd52d902869e3c8f58db40d5cca5d93c8a8a87212f73760000000017a914b3e882bdc4e843b4e2a7ec3876d13397c17140818702483045022100b9464f3284966aee6d290fb7ad263174f71df43577f0447a167e77367e284548022047e087845fba5018b95816a99ed4447942258b75f949f11d4b58bfa4ac03de84012103f5bdff59fba04c4477fcd9f4f26ec33dd95479c3daa20631a910c2f201dd3f1548a00a00020000000001018e579e23a6a6903ac2d891def8f7a8d02fa48f5d3485fc6e24797102c3cccd9f0100000017160014b611be2b43f60fd5e144324189fb647f9edaaf32fdffffff02f6ba1d00000000001976a91498171af683091ea8d1b1ccd52f45c109731745d788ac3b7055760000000017a914d1af6766d1a6acf442cb445261c45d328d7bbc978702483045022100e0a186f84a69fd9794d0a3558fcb5e954645a1531ee016e947eb337bb962207e022036dfc518abceda4ec5ed9f2515d11e6c92185cb56128ad01b1ad4eed1cfaedaf0121038cc1102af0eda1b5d37541dd99798dde8329fd404beaeb0022432c72a32ceee748a00a00020000000001014290115857e3f86465742e07f5236db0c3fcc6dbc5df9db3bfd1f801eba71be30100000017160014b1f04f1462fbf7e2b3c5754ccd81e54fc32aa27dfdffffff0240d62000000000001976a91462d5f1a2ebd595d16561382888ab84e9a5c6b32588acb09534760000000017a914fc686e257b9dd5f895641c4ee1812808e3c4467a8702473044022005fb57db7921e56f94cbcc86cb479a117767a2588e6c7da25333aaaa82b27fb602207703adfb5e1a844f206d5a56c5c464b5cba00f4a36bec0103061281aa5e48c690121027c040a5ded40fd999662f967d2524c112c7c7a038857625b40b3afce665d6bcf49a00a00020000000001017290eb9d3f08d0c8dee7ea60fafb84711129cff665e67453c8f33e40a06f0e320100000017160014d61f9a0c38725cb2b9ac472674836ba74d7ef81afdffffff02e79b867500000000160014ddd7d84330b5d6ae491e0eb91c897714aaf9c49698f5ad00000000001600144fb332a4b7b915d43b00ab867af82d99b9d0739b024830450221009ad84180cf6824d1be6b9becdefbb6d25279b64d1b34d8cd4b4dc3872b99866c02201f1ea52e1d6894cf03e2c8f6274f09257c76569cba402cdafe289d7c474958070121022b9019b590cfb990df899b11fbe4c70f78c6b830a225fabc0dd56026063a369c3ea00a0002000000000102f5903c390887dd2cfb97eb5d6cbd6afea89a3c438c1780f59934d6a490812c6000000000171600146055b97cf190c00c4a3bbe08bb7070639702f645fdffffff750126e038c144578e8bab11e865ff5449535c5b734d4449319653805c8164680200000017160014b2c7e080ac2b409330d9737f08a5bb851c09cb10fdffffff038c8953000000000017a9142e45c58231ae34f34aff07e30700b3cc0ebf0db58704d800000000000017a9145d1eec502e6818f8640d6181e741076473f3a0cb87141d00000000000017a914c30fbaead0175f21c5ac48dcd84b67a5deacc001870247304402201c29186838f059fae4ea270d11002ba868078580f61982e10d3166279f5d82f502201a78da05e425f2cac79e8b37b1f399407e145b002b072b7b221fc79a834c1c5f012103b20e39cf5b99d14fa8213daabd26baf244545fc95ddbba51338a19a364a2319b02483045022100fd301d9b3b8f2cefc7c4c4b867e45196223e3844c2b9371a70d4cf08cb17baa0022002a2cd790e099b14aab90105b7da2bba5f125247f0f5f22092ac5cde3ab9729f012103f47fd651f138d101c1e255cb8f0fd3942c0950b2652448718052d0612602da8200000000020000000001021a9b13ccf23b492165bd8c03093ba9989c009da975f0485ac3ab6ee64cf97f920a00000017160014b5b6b5c44cc8278b9f7ef1fd597da36585c58a75fdffffff50ff7c0aa00b87cac616755f24db626bfe810a89cca4b99493d6098d4c32e42a2000000017160014857fe4ac24ce9217be24145bdb1713bce0357bdafdffffff0367472a000000000017a914417c4491c2953fc97d25f3399758519f9b5001d7875bcd2b00000000001976a9145c4c8b2ed0ebd8ab977b8256eaa62bf8a9f9685f88ac7d8a32000000000017a9148519b2c8040814ae0ab2a0b2ebc9f7e79d636463870247304402200d9b26555ce7f54b4e076fb4297d8306080f3d96f78847f830a9c883ad58adb4022019dc7233835c84d4d50629b5cea18418e458eb30d185fcdd70f552aa1b238d8f01210217714eb62f2243afa46efb572cb50f0d1f8a1d46091e3e56e84936839604c1430247304402205f42ea5e43da62b3e5675463c933740a2bd2460a59bcf77eeb3b7da8021295f702201a62982844b1aa4604366cb1c999f07c0dd69b7875404afaf86fbdf93afcb58301210386fda3b0809b00ac73c93f3ecae59906f2af85880005fc78bbdf8c05e62534120000000001000000011801b22d37caa8aa8a6c386bd0b2ef8e8a38f74cdb80a3a824b7c4d3f6a6ed3a01000000db00483045022100889e6efe719a488f0536d11f86c1786b1570428a007e2cf4f5aa8d0c41ce02f602207dee5e3e1688a544fd61c1d33dda3e9d40dc2682909f4414c7c100eebe7a248e01483045022100df52ba8665049438dd0d6a43c84b5a96bfc1ead88aa766d650710e0393eb60400220223bc70201d282a40f3a3ee958bca4b206032005383ab7cdf9420c53c962164901475221035063450bf6bfa6970b9013ac8ab7ee12c4cf89eafc3c6dfedbc0f8d7b9b8f8c121035b01f48968a0533e3a43cac1f0b540ff50fedd82549ec503ccdc6f9b0c0a3cb552aeffffffff025ad8380a0000000017a914fe097846f2915df1de0ff3403b65a2cd4d38f4ad87e0750900000000001976a91490209e73bf4eb3371d4e379c557534947719f91f88ac000000000200000000010407e9fdd01f3f8c8807cafa8877b45df3bfcb7d7ec889825d9d0fa5539bcd2012000000001716001438f9756b01c1c3e8cfe2a6c28bfa264305ad4d0dffffffff0a083afd6819507726f1c4f9b13c7e1048bf73a1d028bfffd6c04bad813f525300000000171600144242ea09546b7d95b5c5c7f7505449faced9edc9ffffffff10dcc3720868d027f2fb906127c7f4040a7748895fcf458495974ca652ae29f00000000017160014e09c560641c1575d7370409795167361f1d11edaffffffff1120b02e9af0c9335a14610e44a16e0971a7d42e84593a7d78630cf882ae3c0b0000000017160014734f6d2cb2d71f09be19f271ba8e85973441096dffffffff021c6c4f00000000001600145f3dc182e625b12adbc6c28cb7a6544c7f8219529140ab020000000017a914fd7e37292b33c0866540892d6b79bfda23e59a93870247304402202e5c802133e882c3486ad5b900c7401df0b547ea678ee1d197a3530110051765022058a67f0cc844743cdac201e4ba3cca3bae2bf2853052707526895714783ee6dc0121022fbfd5c260eddb8d0a7e2036951e137e68bf2a4934c782eb690f6566fe3c3ff5024730440220211c2f4fc62c15b031639d28b397ca7c0561c130de62171be259eb1435644bd102201091dd59b5249f85e56a1c26cf2aacd9a91cf834fa2ec36858960f89e7e91fed0121029d956d6c6dc0a4a78c3f4e9880ea07b1efbcccaeb9b0ee295032ccc3bff4ef5702473044022078827e8c93ca2d73d013420e45df85c5004f7744bd97db9bc9d86d4b09686c30022059fb6527d8084e421a4cd2b5cf1a5a9012c379ced7312b0d0ac767c059aedff6012102f526957725e720e0720352b243a1f533b58f35aaee0427bcb9b890ce37e3801a0247304402205ea18772a771f7c4e6c382e244efeea66bc8c3e0987fcc126ebe15ed0b6945cd02207b4e841df91ef4c3dcfc93e707a9291b06345d8a4570f47d8a77651cc54acad601210234f5c3efb9b5b14397aabc32d56abd1023e99df74592f77a31d566ec880bde27000000000100000000010319e270d90f18df293b26a91b4ff51e524e715c7c0b3b7cfaee17ca3b9ab93e83000000006a473044022079a086e4c732b3d85e21ebba4eeac66ad77144f7e31d1d62d13890eb60f7775602202bb98020df327dca08f8bb6f17952cceb8fe4a5d57480e4ddcd6f1876bfca0d40121031dc265a7718e80e1aa6b1c8aa457a1a195955c9a0d80f7a4b433538887480280ffffffff1c1cd70a9acb2b5fc89d9eddf20638b0e8f13e1097eb32e9db3ab94baede19f7000000006b483045022100c2460acb08824d80678bdb9d183e70ad91ba4add80792cde3b0ee0bab9c1e2bd022077e99dd5fd3dcfb6fd4a18557d902d25c14202086d9e2c667d425a3b4f84d845012102deb15120ba7b32dda2b95c967052a3e034a8ecb35f91014c20792f75d3cba164ffffffff656f1ba70ef1508a6b073531a498bca54c1becfe9ebc5e0497dbbcf0de3f0ea50000000000ffffffff028813000000000000160014e7095001027c96e08f5fe5927f721694615670ac706408000000000017a91465fe371dce8ec0ef24eeff3b6c621a82376f2fbf8700000248304502210098a16a527b3f1b481dad1051f8a59e36eae78a4001ba02ef57c612791d7ad1a8022073c82d051543e1fdde4ad2fbab56ca18a9e8961bac089fca0228ae31618b5bf4012103e3a967be51a714361b5365299f0e0055b8e6ab0544a6c573de5a3cf7254f0f930000000002000000000101cc2285cff3d94ebce46a09721d60fd842588c58ecaf19ba9de0cf3c490f9b48f0100000000ffffffff027b880100000000001600144aa2154fb21e4ec0e66c7c0c9b03928fba302fb69c0f07000000000016001471e56462c0fc53bbcc50b5906bd2fc7ebeb0431602473044022063e3d44a779efb5c603eff67234c0489451612cb076720c58ee3ab69d7a3401502207012d4b9163c7101292d6f072bdaa096323ba5040b5c90639cf84e710469dd72012103936ea56b66dcc271ded5aca2f78c998e073ba36dcb42dacd479f77e91e40990e0000000002000000000101055bdd55b0e8cd6334f58a699782720d352acc1ebc327d676e36c31cdc1a35b50100000000ffffffff0282941c00000000001600149734ea1539bdadff1c439279ece1cd8d75fc597f2ad7270000000000160014fa8ddcb640380a91df72e7e0f16b9c63566636eb024730440220167b9ffd7519a87f7529bc7601e491d495780c240541721b39150fcb55d3c67502203a1dd068e93dcf87ed444d5eb90b40118799ac03099a0c7cba27e7125cf60e8e0121027d3e92c965c0027766b59f36c7cbd0d42ef1868d544c641535f6075f714445710000000002000000000101dd418429ae6b1827b0b92dd97619c9c1fc3ec8f78df91fdb9cc57b896f28776b0000000000ffffffff02eef6610000000000160014212c7e2a50bb652773743fcb5725da970ff6045b3a21970000000000160014526f1335470149c890a7feb020577db6cc0c8b90024730440220465a595139e16cd6f320b7b7e3362c60ecd145e28b901f51d29a85e43771fb2f02204d0497091d138c1ea231e6af6328a81ff08502e1fd8325094c75faf739ce12bc012103217a45f8d0c2a1551262d6253649a36d1d882e2fb88158f16c52f1623937fece0000000001000000000101d09552b49e223062665e7f13da7b6e9cd8f63c97ab8ee657d909c3dae92411a50100000000ffffffff0280841e000000000017a914d3fdfec46ab6a28821c10141bad9c97e216f45228734c834000000000016001421fc459198d4db1c6a490f9c8949c281ef70a8c80247304402200b1dabddaed05644c9e6d468776a7ffdf7aa9913fd0b8e10b027f91705dd6ab2022042991d3a9463ea047a8fe6f1153cefa77ee3a566efb8247e4a7c610b518fba02012103a8ba788029883a38ec7a0a046527798fcf67a664eb29cb9e6f8efec2f9ff0ddd00000000010000000001016a958b462a1c3c85d8c97a249073e83f34c0e39f2c665c0c50dd16e921fe431a0100000000000000000280a812010000000017a914620712796c66914dc692a43614d422b045f95eb387bed3740200000000160014f63a49a99cb7629bc272837cad3afe4a0c0c357e02473044022032a25209e33f2eb6e3746fcc0ab8b2d4a26bdf5c0a4b2c2dc0feb6c025380b3402203b2eadbaadc5deff72c034b66fd92752112fbccfb8cdbc9168a7b162efe46e9d01210349f8eda8144630aa5456e46b33fc03c7f2d245f50b18abe63b0850e2f73ad3ed0000000001000000000101fdd8c89f230b8720507aa11f1341b718031200d8af208156a7922a2b4ba0b7660100000000ffffffff02f22d01000000000017a914c046e6e79b3448691c06a4c69012a326e3b5f5e88798ce060000000000160014048f5c7f6134e1f528432f527a13d7c2696877fe02483045022100f9bab72bce4f6ceac2e7f1080546b168ddf413bba7c0f67e71ff16413d711300022035345f99342db6c87bd9e7b4b4048f578b0e9e35ae7c1105a179cd3fa4bc93d601210338b89b7925dcc45681ba5fbd48497295d1dfde822e7b06f72571962e1b2f6def00000000010000000001013278fbda969a05252876b8fbfeee4d90533351af10e6d0db449ca500864dc94c0100000000ffffffff02909804000000000017a9149404bf5040e3566e7a9e041f98bba0ecd0047ca287b8af09050000000016001499c03801794930faebc9cfe28e0896965e3e53dd02473044022032fbada6843167f3758b430d222a1d24e9445b031533f6883ee305e56b5756e702205bfaab1345a3b44fde600e90734910cc2dacb553bd0e2bf6bf05862ea9bed6c8012103b5a3130f46166445930d21f7f5b256fd3c309899114a831e58a03ae090daaf5e00000000010000000001019217b0e38a91d86685c0233f0f0c93a1f710f64f4fd932a3b4edded43725b75b0100000000000000000225e70d000000000017a9146e9e9c37bbbbab561ac2a97464b58bf1507c517a87e2ad300000000000160014af6556a9b38bc59b6617a3dd3e336ae47e17d27802483045022100a443fef79086b5c23eaf218d6c436fbe1ab8edd15c8f17c07fe3aad183a7940c0220508b83ce4a3b9ab40cff8057c54b97a907056f9085575eb94f136e42ede808c8012102754581ac855aa4a7daac01d091211c58dae0d051fb856ee660d31faab45ab83b00000000010000000001017c61117aaa32db2457492045572510d97528285d4617480b0a5ddcf0f3d275920100000000ffffffff02f9bc06000000000017a9144ffa39e4d2a8e2c03ff0831b65234bdf435259c9871be00d0000000000160014bedef437e5570b01dd58f41288f4914f40b4320d0247304402202b0244502065e26ec73e85125bf5b1a2e22e61666d942ff7080bb5e746f7288d02202f9bfd5188e4e319540127c6617872d9a19d6d2c87fcdfbb9cec246b99e52c2701210248060877efb9bc74566bc69a738d5edf0167b01ee8131f317d64394ca9dddac00000000001000000000101628684523555c2034ff8f19d3e7d9046a879279c73e4c73207f6c455b3f85a1c0600000000ffffffff02c0cf6a000000000017a914d303356e924625636c41f31b41a2aa519457a533878cdf9b0000000000160014d3d11f64313d48ef9f5dc0fff553139a2bd19d4502483045022100b200a24fbd1e4031f56eb5b961b54c4a785e239f82e59c5b4037c24d0fcdcf01022070ea4fa067d204f5977250d71626d1a9759d24b75af5888bf58d069ff566e6d60121038550902d4397bb0af908142fe834dc107104ebfc307864199ba3a444b66e60fe000000000100000000010105de45eef4c4cdf63a27e1817feb1f4d6410034ec5b3a897838857a26c8d331a0100000000ffffffff026ed00a000000000017a91459e57c6f3a81488505529d7bbddd452ddf86a79d87326a0d0000000000160014d1885d251cbc838cfc4e15dda2875a45caed45910247304402207fda679bf634480990259fb5811e9f98bb1aa01f480a570576f820f9f5b2e09602205586c2ebdc6661c7ab857a372ad75f0c4721481cde7c17eb648f66af669029cc012102d7c657dac5636c45d25dce99f623253bf5d1a285b66d7e89725398f03dc9e0280000000001000000000101665da4bca6158fe4835372295a7cd5b623d871a93c15b507ff9252dd789116a601000000000000000002400d03000000000017a91456f63533907f7c9d7f84b676f4d652aae29cdaf987043539000000000016001427e768825ea04a36e969c795520809db4f5f0ec802483045022100da1bc58096d6ddad2473ecaa70384f1f980f316cc76abd668577fd2e49621e9002205cd7b3995da0e7989b591052f6d6da706e4af3000adca81bdd9872f260a14bae012103b69256e5769d3be65a8a208c061993ddb6ce01ea4c7d1e75c46e9d87418de47400000000010000000001016f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9340000001716001462465bb436f39a176de3f08408b53c18b0f4b8cfffffffff01efe309000000000017a914c0065c3cf79be62e8ae142ce6a196aa04cbbc00287024830450221008a54c37f98c054ea52ace8ed52b2cde28ae960a89847753f2d4a87b8b0416b4202206fae28a2b5d686a0f640fb6eff0dd910b6c87d46e8cfc721b3478061d3d45b680121029fe6ae6f9beb07a065c97b7c5dc2045234cfe1365b7b639027e39f8768cb2c1600000000020000000001051e76fcbc440448c6e976bda2317cde449fa068fad1f049417a35e6647458ef640e00000017160014baaa22b72780eee3acc0cb5dae7aa4dd02edd365fdfffffffa31ba9e84407a40ed3479ceb70f29d01f6cf1c57aa8627853c400d1268e390a0000000017160014c557f37a273df03c61b5290eaea00d8ac1b2d3d1fdffffff269fb681a3d2ff612bca556aa1e082dc1196e3847af46bd4c68df16ac1865f3d000000001716001456f32c22aa819c0f1f9f96ece21b3554d9c58bbbfdffffff80930ee4c161c7970b799212a5a92b21053426951e89383a3cf72f53277f7fd50000000017160014bcf5b40ab4d81069705c1b21e965015f0b3df6a7fdffffffee98cec84c8152df22fe2a0bb319cb10b203df32cfbb88bd06def338b2f3d034000000001716001436f0de0a6a235da0e734d1934c0201b438de9c86fdffffff02ea8c4703000000001600146dbe4da00542b83ab674a03632867cd06b1fbe25ec501400000000001600146f76a8e51d51864638d1c4c83093329accc5f71a0247304402202319815a331cf91d5b2aed003228e4542ddc89e83259d9ae8f5ac63294e869f502203a661a6da0c3ff86cd805b9dd44837ac86d3a6fd921e9dca092b1fa04d87555d012103e71f87a6ce6e1c5b3f444418bfe6cfc149a53d96c153be439e9d5eb9ae28dc460247304402206732423e6fbef50d73449ab9c9544bd0730b57d57ec07b3e4d66c3fcd2a09a050220110d85f0e242492d46fe8f6ab8630649cff83d94c1a9d32fa8d82fa4d532e834012102fb879b66f4e6927927fb93ce8abd5f30432cbf6fc96f0175b1209410921b823c0247304402200c6cdfc89c30766264c7216fa1f97c501fbaf65b9276051f8e04a7484400a2be02206030d146d9cbbc4d4b21cb432b3ce6368ee5912c41239c8c607828c05f61484a012103039a2357d916e00640a3b880782e2da435fc307551d5d52f4677ffe6ae3490fa02473044022003accdd685ae1834c1ba97c0586a91f411e6bc9320fe7c731aefdb94455a21bc0220546e8583a0bdd8122fabe920cc01c759ee273b35090793c7bdc34050f2e854b4012102b4e01f13c2ae21d7fdcad69cbaf23228dde52a552232ea7b1389d63763ff3f6f0247304402202dedef9d03fb1d6bc88e67897b72872fef42fe628a0570f030e53526e6e62f3802201be1ec1207b5d4ad59fa1af96988df5ecb03a0402383a91668c715a0730a12760121028bfcc34a6f6e961df1c10f8025d8a309a4acfbee40174f7f70152b0fce4fb8a7000000000200000001b94b6f3f53435872d2808c963f17231a744f54d1090cf88a9c7d0e97df47e75a2d0000006b48304502210095e12a95df029193b8e40f5fc19f03ac18aa45a750f8c94fc135af1be00e23de02205ce789706084dd58198dfa7a509240aaa64ad447f486fd3a16aa7dfa6fc958530121034466c9cf82de0feb88ee4dcb3a47bd4205f60063063d58947c76cb3bc0325ebcffffffff02887e4b00000000001976a91445677d9659736ee38427d54c764dd81f3277368b88acfd1a0000000000001600146f3a558ba24ea134b55d8d349310530355f232f800000000020000000001028c5bbd106d84a391a390f8fe231d8f7c77cf57e81f3b3d2f17c24b0a621b0bf9000000006b483045022100c379474a2860dac3f51bd586ff0a270062ea6a3aaa023a815680f1fea0510de102206de90bddcdeeba6f9576e5ca82e06521b0c8dd13be32e7108067cb7330f48889012102b7d3fa15bdbad0f0b23baf46d3a40c2c51e0353e7a276350301ca234c3b411e8ffffffff231cc6c1aa3c58c7035f7ef7e8c9c0fb09c4644ca7c18a42f028759493add7450000000000ffffffff02ff2354000000000017a9147f36fd406882bc1b6b0f0093bce323719ea4f20c8728f107000000000016001447b95403204f1fb2a668eceb2d92d65ab32f113f000247304402202fe96dfbf03a09e1cf4d0d2a963debd12014e4550ae0fd57f494d648401f2d2a02201124d7462682092cf14b0d6a3cb38ade1d48073057ae0b362cffb2502954152201210378837649e74a620b2601bd48b3f892cc3dc7c9fc5286c744117efe93c9a4d8f600000000010000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d43900000000ffffffff56f3b503000000000017a9142c2c3b228e2e467d051d89256d55058c0b31171487fee10100000000001600141d94ee2d7d0621d1770a3a41eda991120b7c11f78f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76da09050000000000160014f833a90495d80ec7efbf5fb107e2ec0fad030a18f75e0000000000001976a914cc4e2a4da2f1295bd4061b68246ca5995948ddb788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ed9a0200000000001976a91475063e6e6104f7ed3dd30cc7274498575547644988ac755d030000000000160014ec91f234add3c943edbc99ff00916fb2d386700637a60000000000001976a914033748f4161bdc6f722dcf6d2cb9808adbfa9af188ac41a10100000000001976a91433dee2ff07a9924073876a2ae06d50c210cfb8b488ac2fb801000000000017a91442f00c15405916eeaaf65d5113e119bad989d960870a0101000000000017a914307f577713adb35ee7c44842d86ed52fdb765adf87542c04000000000017a914363b09b9403141f1e8b11098a96814f8cb7f0b6d87fedf00000000000016001432895d354f98284b0eee79b7b51923d3697f2315f1bc04000000000016001413b06e4fa6bb5c2663093d3f3d81cf8346ecfc78f1f7060000000000160014c49042b72182197938f3c1025b0b3912bb2d51b0f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7600093d00000000001976a914f3949ce2ecc67fead5694a3de93dbcf0cf2c875a88acb2ef00000000000017a914000462dcd263e3428e3ab3bbe9eb680968f71fe187017903000000000017a914acc7bc45968eb9b7e50f5f6b9c18514dd4c8ebd58772f715000000000017a9143a90729c74989da2d5ea9330bdaad9355e2c5e7c87a9d910000000000017a91408606aef337554fb05c99a034600bc02724f4a4287102101000000000017a914b78c3edec45edbbbc60b3f09c4bbe778d7e592638790de01000000000017a914e255f1a8a136e62aa7982c42d1dd2ecaa08adfe587349c00000000000017a9146909f35550b29c2530894080d1bdcbc389ee31c687848d4d000000000016001454728dbfb81200f6bc5efec96cfe479eda10e68d508f0000000000001976a914b8c8320b0a441c9ed4a335a352ab22240e6b286288ac76ce0000000000001976a91431e79222b2896e5c0affd0f20ce04d320074cb8888ac80d810000000000017a914b268fdc5ae36bd61bc43423b8fcd168676df66e087f2020100000000001976a914a15b696f9e71e27c114ac0ace127e7354aa5468e88acaa3e0a00000000001976a914475d6a6ea7a6a479d77601fca1839290554125fe88ac4a196500000000001976a9141f5cdafed28c8998569309ac02645292adf2677588ac809354000000000017a914715b8624aca1fe4c3dca9aa7c29b1e34508f6e73877bb503000000000017a91476ed4b67e6af56861d8140773bc3ac5355b19b3587ea3a14000000000017a9140710af23c4a39f8d16a71f9540fb06bc898ee9c8878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f23502000000000017a9141362f454bd98636c93234622bf6f134f430515c78747ba2500000000001976a9143dd9e912d307fd5447bb9209fc75f692ca42732688acf8a101000000000017a91435f2c8a5512fc09ebdadf6595353fa4304537516873b250100000000001600143f9d1f8098891e362670164d425bfe52a12e8ebafd152200000000001976a914ae5d35c3f7e5f7542186eaca767cef4ca3c1349a88ac67200b000000000017a914d422f3b254feffa088ce6f6043959bfc62100a9c87632f01000000000017a9143aee30b1680fa1184e675f06a67b6e58521bba5f87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ede83200000000001976a91419aea15c2827792b1fc7d978082dec5c06da956c88ac9e070700000000001976a9140f2975874f83587c6c14877247da13cd9854aca488ace57000000000000017a9142fd2cdb9a91520a2f56c02583481acb7a40a902687dfb30100000000001976a914580696b069d16022cffee47e2e358ed882b30eff88ace36b0000000000001976a9146801e44cb4a87d1d8fba21a74104fb06cfe6a32b88acff850f00000000001600144d93eba800c9830b198c802617945a2efe2fbdb40e7900000000000017a91415616d68bb2c250cae44e7b7af9e5e576872ff7a87ce7704000000000017a914ad20f3af12118ddb1f7ad406d00834a2b03b01dd8727bb0600000000001976a914b55eaefb0e25794c461bd829eb8b7c572c62d92788ac225f03000000000017a914ad781c2307b13a76e668cd1f9f356554563bbb5b87766ac100000000001976a914e0d8624588ffe180dc5ea58556323fb96e17c37a88ac3c730100000000001976a9147e11ba335e9de493061980a35e4b1d5b788b966d88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76580f23000000000017a9141ac471f08cae5375ee58a003c346ca383494eeba87f30720000000000017a9148f7af9047693854d70b6068cbe9e4d602eb33b6e87bd1a01000000000017a91493cbcf2cd033363baf2f3c63dc6bc6f86a2387d087b0ad01000000000017a9145af7953a5ba4b5048c48c38f8a619b62f2b3ce8287d18b00000000000017a914c8a14cd12eb15864fb9e433b457ca1eea006ac8787e59203000000000017a9142b9ae16fc5e52400e29873366aed398f730bc1398782af01000000000017a9141192ce9805fb1dcb4d4b0de6148111766584eb8e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd762aec4a030000000017a914715c4de53cf374ca5948aeed646e8207463bd8e18723f0fe0000000000160014017478195a44865ff95fb87707a967a8396d76b9e8e24300000000001600148ed9adad140a80bf360ed12702d5a19ff6cd8b1b8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ca590200000000001600142b35fe6b624a5e16e197b47478ee2c861684ab3a900b010000000000160014cf28b3f3fa5208efba4cff92d79175fc10bbec74ff5600000000000017a914e8a0e4cacc281c686d1612a522ed6a6fb13f8eb9878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764c8100000000000017a91490e3a836b496b87740747c14941b35912da3110387d55e00000000000017a9142486ff21ff3bf7a198e71a8580bf1c904f689ce587bf3b20000000000017a9140595bdde75abe0b979d8cb2ad9878ec226ce0419878a6903000000000017a91471ce3a8af1b1b8fbf0a7b50214be06c8ca00e25087a5831800000000001976a91474482d794e1926c4518bace3289b73b1e9c8de6688ac95f410000000000017a91469047a0c51a05475ee1c7d2921f04004a45a079b8767103a030000000017a914081be5b512f6627b27bcfb52587a0c584f2edc28875f3102000000000016001431fcb1b12a68d57f355c9b1c94215b68ad780dde386c00000000000017a91401750ee336344cc43ab6ea4495256178f737db2187204503000000000017a914061c1c9f1c495e4df9676d82835df298e8938a9d87c0470e000000000017a914d2640ec2bdb7bd0b3f953a8b90fb9f1de86c4dee8776412000000000001600149fbdac96811921192bd2fdb7b581c451058ac14d62b804000000000017a9146a3a26cce07a575613a7ba3ec38016828529628a8702483045022100d7bd995213ef8d00c3d8d3bd1f7e132ac169ff73619ad908415098cdfc86ed7c022066a15ec1ff14a29989aa77df36b3d2c9e8c1ee244ce68ef8c5c1a5c1c917f7be012103f689b0251843bfde1d754e2a75430d1842aa0c9b49af26033a3d8822a50dc0f1000000000100000001805c5c5b55f40c27ef292b137d086958a25f958238171dfcf82c8294acdb32601e0000006b483045022100c1cb67a7ce89ea2c11ebae8a76dc8c174f7940180271a40ebe6530f22dd9a1ab022048226e0919990f66f9cd485044bfef6d953b6baac3aff01a34c9d6e439ecef170121038b5b58780aeb43a85a4a697f7a5c86f6ee83c4223729b2112ff2e2d8814a57d7ffffffff016a380a00000000001976a914e90299f625881e5c456876e7b0643871037ca80088ac0000000002000000000103b5d3de50afd8e6bb04c7980e420f25886389df936675d96615e1f6374788a1de2e00000017160014841a42fba3015ee87ff13c0517cd9434d678fd7efdffffff43194a0535214e77fea70f6d9963a5c12e1b563a06ececf697a986288c9c49a82600000017160014188b9fcc602d4fabfb538fa0df4c8b90c8559e7ffdffffffefc8cd895e2e33370f7b38c7b0c9fc43b21ab2af36c1c5a4366e718b985b66a100000000171600147a2bb0ee416bd6840d9473ee87dfdc7a69918d50fdffffff02440951010000000017a9142ed48b3c3a4ea6b38c00525bfc12e09edb637a67876eca7c00000000001976a9141aed05fd3ffcff2f699b6085f99fa2e60bcdcf3988ac02473044022003cab680a9fc014171eaaa1ea9848ff19289052b318f4d944854cc5a7e767c8c02203854fa7c5a6815325ae35bb1cb5c4a0f25514bcf0ec53108e595bdab3981a1b4012103fbae5864aae0556edfebff195862ebcb0180c42f0c32699b0dffff79207fe5e80247304402205d80433848d9ae6c878599f4710891c79fe76af1e8c3b7d161f03c9d8038cada022050e0ec0a5752d4ad3432d90f9ec236990a25abfc1715b4c4715317017e0c5bca012103f3996f7b11bd5672b12210324a69e0262a80cc9856decd93148493b5c49f812802473044022059de10b6b501a1f48b85de1cc41e705a3b4b03f7213a087a53b1ec8438828b1902204db09a929247574534c50e54db29f48f959e2ad469302b79482964634e02e4240121025af18c6b88e9d18fe030f2a6923100d45c298bdc96152ed911b72b053c58bbb80000000002000000000101f104607651453b6d00e1c0a3d18cf66585553013492592e45861996ed4f369820100000017160014378961545794ac2094fe15934d7622fd9593fcf8fdffffff020e4500000000000017a9142104be28c618f6878e401cdf906354b23f0c77f1878d2300000000000017a914f24be6cf1f7a4f1c0f932848cdd749be0a0dc949870247304402200b2999d13f2a4fac2f044ebd71f4cfc969819053e3f5e2916b2345c3c607dcc402204afcf55c5182ed4e047542794fa6f3d40a0b03f876475748016e3ab3503262810121036f70de72e98987b91dfb82411768e9036c424867ec70242bcc17336068da99660aa00a0002000000000102c336eb43915b38e0eff147851594c94c33b5c92e7c71c3bf53666fc2a858fe270100000000ffffffffc84d70d434180463a12c588066d711ad7c2f988691300c77f8d7b06e23349a840000000000ffffffff02435600000000000017a9146d4d604b6d8ece08f2c22400541cc6d0fd3a3db98747090000000000001600146a3f92b151a8585d0bcf1645ffdc51baff37134102473044022077544d7928510c7adb5617e50f60944cd71b04b0a85478ec505622a6537e4525022061c69b6575635985c621c906d1421d5082d4ea455af0a6fc58d4740d15ac61ad012103b200825aefc71fdeecfad0659ae1dfd93333b19e9a2d0ab0a85d02878438bacb0247304402200a4c5b5655e5749d06813a0a2a4eb3d80ce2f9050a69e68b1295c85ae29d785b022051c19693a069cc0d2e5885ef8a33d9ee54787b95f342517adaeda63fcd47081b01210306f7b28f73d6a8399b0a107d7922d4cb5474f7c03f9f50144f70b4cb875265bb000000000100000000010202cc8f53dcb160279e4d8ee70172a4400c701bf3796a0dfd1c1b90339a7d0986010000000000000000cbd04c20a7347560483b0a87b59580bba69f54be6b759a90f32531fb960c5de8000000000000000000024e74a800000000001600141102db443bacfe4accf7594c54bf7e6ce0893f12485e870000000000160014cceea11e907adae1f71bbebedafea18685523b1b0247304402201527e0de20ebede8a030d8b68eff755eced41052a52100b69800846764f3360702205278f7be942493485bd7bea4ed2752363192f24a61f43e8c2d6f5c4ca5a1dabb012103a5e634bc39539747e26de0e219196315810a09199ce9bd8fd9583f1981faff6d02483045022100c8b3d86a6d04f9bd1347428485e9cfac4c74d71804ad4c0f6e80dc14635a37d202206edd6f6cd4afb8435a43d6318d29bc6582028830cd8fa6976d7571c1062bafdb012102a93b3bdf0b25563df9bbfb0abcfe9ead626c5591c77613ba89d2ae7e9a0f996000000000020000000001028fc106101339ac998a430b0cc25461b6f261f0b39a2c013f0dd0fa5b5e0605ac1b0000001716001494353f7c41105ff75bf760ea177cc975b2f15d4afdffffff4ad97ea5f8182883254bf60a25949e0a4d5c2b7af0a8a0f51f0e82daa71bdafb01000000171600145aae3b86817a9aae689b85983354a3a806074589fdffffff015c0b060000000000160014d2ed9aaaa3a285b8a8ed069de0aa08591a7bed600247304402200f6bc881ce5e6bdef069be34ca27857377798d5725fe60eeb71ac04a7097ed1802207eddc79afee8108f3eaeff3bd83c12afa35ca2e352fe2c94b02b918cb210ed4f0121020e8be8fb4a4f7cc34efd4d54f7e3547fb60a11bda2cf4c8ee292662f22303b56024730440220572df6e251e6a63b05232e4c67ff369faa8b22eb161e1b9ab7e29e9812bde72e02205a3cd6d49e4ffccb116bf7b30753f99734997c3725c24c54a906dc9a0c583912012102ec2ded6e3981f6f8170de187e6a2cc19bdde534c1a46ddcbdb0bac0f575b04fa47a00a00010000000001017e0da2fddfe8c4902743f4af4a7d1e2e76500a501c0b120276d6bf1ea225872c1b00000000ffffffff49533b00000000000017a9143070a131682ef04cb7307fb10334c5f99e1a467d87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76228217000000000017a91464c437215427408dc941a86759e502a72ea800c687a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388ac8cae17000000000016001446e3ba86e112339fe82ecdf4922052b75f8a920c517800000000000017a914d0d6b32cedfbb5b07c6c77d36fd91a11f25f09e687f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76445908000000000016001477cbcdc7ac865dd21249342fcffb50beda72b30d541d01000000000017a914930e9620676c4fdef170ec71666304a2c64e5ccd87ddb221000000000017a914fba30756bc19084c6d0128ab3d54ab28cd91f4ec870f7006000000000017a91461ece2babc90cbb6810834799795a823b2b33fdb87052b00000000000017a914a365417e90aab4f54b8752973fcd343df0cc5ab587dd1801000000000017a914ed23954cbc1d8f7912a981f25ea1872e17318ac2870f3403000000000017a914e53218f2eeabdf397e644f2a936949c6b0dbbdf3877f4207000000000017a9147419d44121fea4909ac7561283b0cfb411393826878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76695e0300000000001600143a1b4fa9588b225873230f4225edf8fbeaccbb487d1e1000000000001976a91425954b10efbbf105e8034cf0f6834b18c780498088ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765cad21000000000017a9144fb912092d5013cc4ba5496b00f692c3af6bc85c87167f0000000000001976a9146a94cf586c9cdea00efedfd86e88498b6df9599b88ac642d2f010000000017a914c669e5e0587039bbc33c49f92927fbe91891720a871e6156000000000017a9149088a79468f190ef19aee7bfae5d37d4aacbb3978797e63500000000001976a914bf8b1aefffde342c12636ac8a6d7daa055c1cf3c88ac4fb90300000000001600144ef8e007795f1ec2f7d6bc75e16a5144a14e0998db850100000000002200201c3a1fa29e8ab5e3e023df105e4562ee2514e525854ef1140e81d8f5dd2bdc1f40420f000000000017a9142ff8c9d85c9b088a9fdcbd82b82bdc27e50f4eee87ce0201000000000017a91447e256115dee4ae3c347cb88b17adc3033dcc9ed87cfb70100000000001976a9149363032f16a29dc73e9cafd89be6e168cfa7f49588ac33a101000000000017a914b1290ed27bf34dbe3e1f41cbdfb51d465ca413ab87e3600000000000001976a9149fd1d986c22f727bb2e1eda43524c09fd6db540788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7697d90000000000001976a9141cbff7f1650b341fdcdea8a006fa11abbba17f5d88ac135901000000000017a914322baf8bd37f9e5f8c67fcd715229ebc5ad0b9c587c28a0900000000001976a9142206b057dfe2f298586bcdfa30b71d62098821b588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7669743700000000001976a914ded471777f69357ca2829e0fa5186b88d05ea5f688ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f79e03000000000017a914c11fb04c8c32b648d0ca96707a45a0c9c8ab938287607d01000000000017a914d0e0e1fde003473e97d407cadf0055125f9864d98757b3a3000000000017a914a52e8219be7d01916ab87f47dcf5c9f8da69127787d8d600000000000017a914de1a8377ebfd0fa8d0b0d8cff82a6a5f8e36a48987d3412000000000001976a91497414475f310c6fccc4fc067dbb7ff174945e1b888ac89fc0000000000001976a9145a455593e278d8b31effc51be2b2c989f2ecf3d688aca248c400000000001600145e306ad963ed20bf4119dda6a9948e0930a1e2364e9201000000000017a914e7c552b400522f201d9be0c6773d08c58a5ede9987eeb001000000000017a914c8685f72fe153a98e40f51ac89a53bc0893a2ece877d120200000000001600149790edae2eb1e570073732bb3f3c6e79d7cf1c83455102000000000017a9144c60e19a9f30cb4ba5a04a96817dfe4e90a90e71878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764d450300000000001976a91447c0ce28bb8921fd29623455284d859f3c6e37c088ac7b4a4c000000000017a9140c5122e63beec0c083064457d228d21d3b5e975187123903000000000017a914a83d5d1a73064b94796db8435023281c413613588786d906010000000017a9147ed2a584ad9ddb057b7213475c2c390c7dc0213c871f2b00000000000017a9144dac6df223df146d494faf51c571d457964e9a0787358401000000000017a914e6676b66364ed2b2cbeddddcfc209ce651cbafd187586808000000000017a914fcf3802126141b6812cd0b2d192b01d6f47f4b0c874ce6fe1b00000000160014e9c863c73cad3419c7c735011bfaeb76560ac7424cbc06000000000017a914b03f898c50132987384c299b3d40cd2283639c25878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7653493e000000000017a9146a405c599d3aa38522453ff55968177807864c1f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f16f03000000000017a914229abcf6b3468fddce7c382d124e59f61e85fe5f87077506000000000017a914613ab2f099c73b511062996e15bdc2f412bd94c5877e610400000000001976a914d7bc56e94cce3c9df12e6034fca8b264e056451088ace03f07000000000016001483faa4559ef19046c519b6a08e7ff1850d43da99f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd763fc901000000000017a914d413d90c2d1e9a49a6254c66ef350d0ee23b5bd48702483045022100e55a109650a489bd8c1cbe1f6671f6a3e2750e972a0bcad5fcf6193c50796b1a02202b458e46da5592e1bf51fdd4809756c240d410c69f3725b32c522346a2d1cc9f01210342bf26e8e584948be6642542e485871f2d99009d69c5c0816f0aa5e57fdb44c400000000020000000001015189b481c8864d4d46e6704c78e830053c903c8ac0835cee8d605c4adf60ac551100000000ffffffff0250c30000000000001976a91421ecebc2791f5c972f8252551e3e90ed04c62eb788ac4b96020000000000160014def30625c7a841f803eccdc05d3e3f6b1983dce602483045022100f23ab93fdda1c54119ccac38a2f88bc6771a6a679ba7e066f63c40a512325ebc02206fa2353b6577b713f615d718c36b2282a8d24fbbe33fe17352fb4ac9651ff058012103a0f01d500ae7f0480c4d5892f7946e84700b86669cdeef090c0203ad2066aec700000000020000000001024d390b504382814c0095ad291f1732dd904679bd26ead85afc831e674009083f1600000000ffffffff4eea05f79130c0f90b0065c38b226733984b4edbd337a403c2ed1cfe548add340a00000000ffffffff02c0b60600000000001976a914573d7eb05730a3ac586c64811e821d67fc4ae4aa88acd718010000000000160014b72b2888a9e0064b1543f4c6aaad74106f71b1d6024730440220257d7b4730f5c3d348f0832f08870e6afa3c7eb5f824676ba54e2faff152afd8022065df3970baadd7ee5800fc254bb63be416a215c303675a9cb7c2a1f756462f7d012103f2393d6885aa34d38814e5973114619cfc59dc634b199974888881fb764e936a0247304402206580aad085d8f7076a0be7247e548b7750e7033b75f1d00b11c9d3988c9f055e022006f1e23c9d68f03881ece7966122a84ba0b24a685e5abaa9f2aff40c832985be0121020004c23e9773b8dd00b98974ccb2c9350f433dd43081cc01efde4b931556946c0000000002000000000102cb5aa370e8fecc1a84720dcd558306dbaef82272fa68d95b1a40d4fb9aa3fac60100000000ffffffff293b3d6dfce8717decfff974b4132cbd65c57e07246fb4d7b60386c5f0d9bf240100000000ffffffff02ba952100000000001976a914bf2fcb71302bbd2a4c3a12dc7da753878d1aac5088acef86030000000000160014732eb91e1ee7de2f0a04f0cfee145bd3e9dc90cd0247304402203e4a3f6070c7dce2c7cf278faff99c23f17c7ace7ae550a8feaa874bba124680022049c09938880a75b781316c3c796cadc583ab638cc9c8099e7a0793f98220a0d8012102558f822aedd7f45a9d4de84c80bcf3fd443363107f1380e905aefeca915a593202473044022008d4737a2a4c37a42f9c80b25f14cc124f5940293e270d0373bc211106678bbf022028ae689ae09bfb42f483cd6f654557613b86d1c1a20b02979a6358b9029e375b012102f93b02fd45b74a5fc59177605ccd60943669c6fc9d6afc9669564c0f21c2fd6100000000020000000001012694da2b39568ee7323ef9b0047073a300d6f904ecb2685a7c881324337cec200000000023220020a54edd7d530ab3c3d1602fc28aac2b89498c8acd3eff9400a654f7709af23cdcfdffffff021f1e2b510000000017a914f35d56da9c30a28e45fe632c1370386e0ffc1f5e87404b4c00000000001600141bcd91aacc4c96732387e5e02d0b37b7691b519e0400483045022100829b6d531d5bfee28fec165a3064d9f21d52313e892ac4663ae6db926fcb387802207d14eb026b6bee9dbc4703edee732a193c4a6d1477dfb4908511269e2d6fa91901483045022100e9c6091de5c4f757c0d8cd2b1c14b75569059a524b908408797ff407aba996cc0220359a0de6f8bc507ab900cfabea3686070457892be5a09ed06c9cab26b5d91d2f016952210395d987819ab03685492940752f61e5409dc5c46764a44a183d78b52aba554a8f2103ae48992f9fc5fe7d086f8230f00c6af978f4161940a2cf9cb1a33b966c3953c82103e56b69760cd1b97fea74cf3fee48d22493e6a9e4119e82cc3a5828f1a855017a53ae0000000001000000000101bb1c730634810bbd9ffdb757b66920fe5588a88efc57fb0c55e216f095bb1152190000001716001477402f157f755c8e70fc26294317c42db1ff25d8ffffffff013d940600000000001976a914213a11f65620aeecb1d91a9a378dfe0c3091df5588ac0247304402207c78809880beaf59e37a9d9455b51238e7252ce1dd53f8f4082f2c05a67592ee02207c16b2ce064abe7b37a32f661098be564f8097d8c094b2b89efaa45bfe6bbf9a01210251ef2359601de546ed5e4c43ab112c50d635e488c4c0d4f310e9dcad84c803420000000002000000000103ea4027ddce5a1e17a7bd8aca0f49d3e4290669464f2c859ab284d89b662ee44d1300000017160014dc3f9a0b27ca76b964a1455076ce215441450c2bfeffffffbd5015921c55420558d73bc43b4d69c91f0669055bf2dcf4297a14328f35e74a51000000171600145fd69a39c937dc3c7c799c6bb160586ca54e9cebfeffffff5c564d4249e8554e574d9ffd7eb42196f9d20472138acd8ae599f03d0007564a3100000017160014d9abb9cc881855124b5d72c9b6bc797167966889feffffff0109150a000000000017a91496d77fb6a82c76c25b721c52edd9f6f78473370a87024730440220747e0b14110a596effe660e85a004128cf157902dbf8a4c3bf0656d861e75713022065b8cdf9e14d6c2ecd8e3a334ad2029e7d929fc888fd4f708004421d59ad68370121020ab84eae7c545bf53bd0144210612a23a8e004929998324980ec7de9e4cc7ace0247304402201dacf390d60606df791da4a130e5db5b79e6c637932b705b4f2a14fce6f52ca1022001a9944f8053fb8fc25de3bf2d1bf074649440c9e3f43232c940a8ea46c0b6ce0121022a75f2316eda09e35205256dab6705212bcdac627d68c7f6f35249e29dde09a30247304402201a849be84cef79453941771a0a45c9b006746aaa10ccd950da68118c3ad1b603022044cc1ced3cf3c3104153a98bc724bc475f1ea262f192e674f51c285706b9c0060121031932a63e320f18fc9919bcb521c692239c695a783efadc89ac822bc815339d9348a00a0001000000000101bbc4a77bae29f8985bca2174ebb042a7cb6e008c145da96b50ec2ed47399502b0100000017160014bc86fe7f860c81724ce8c29d1cdd163276e951d4fdffffff03400d03000000000017a914a0ce8f29d6e10449189a61efdb101601a444434387409c00000000000017a914f38995b1cd6b5801a90826bb798f2afc8cff2f648750c30000000000001976a914074e7a9410ad48692bc8d69dc6dc638066f3ae8788ac024730440220050cc912721c15d31592242a3a5ea9ef339bad1dbeed5192d39fc047319a375e022047b766b76c00e6844245473c0fdfcfc692a49075bf4b3fbc6dfca21ab845258a012103744fe622d7597907f0426d0d65364ed31716bbef7c686c05ec01e45db7677cb348a00a00010000000001018b01a02300dbd9efe9e977e9d8fa60732a391efabc43eb1ca73acbe16b0fae860200000017160014bb606b11d15a260e224817f6f137102b4e1fd850ffffffff01c8f700000000000017a914d7522e5dffd247c5044cfbf1f409fdcd14b1fab387024730440220555595a534c9d705264833132cbbd0555260bcec8871992d0f5c291ddafbf58802204ebf1466758e2aa6e2785a7c10f4bde697960ac897a3864837181c247787fff1012102d49b732d6d2ae96a39a645a331b89f02f68828ffe8062fc947ffbf581b69131a0000000001000000000101664e640dc2b8d2cdb5759c783f110d6de9933f7acee51c01c12bc12b11ba15f5120000001716001480a6fd59ea9b9787ee1d4bf659c574bca426dc64ffffffff01b67a00000000000017a9145a0baf63ddeb62f47d915828542a7feed01d8e6a870247304402204b7f35ecff6e7fcdbcdddc2f3f4d749bf92c187d79218faddcada64f8f57f25502204fd01aeaa2bc72e5f04a499310a01a1360d586aaff6ce7b6f62807af6b3723c4012103c154c0a37addf333bde15ea4cd9a6f5d2411cbc5c8e075999e40caac361c5c76000000000100000000010177be49eb445fed10ce2b679772066d8a3a6f72a04a47c4263597cac716a5b02a040000001716001436ecada2864dd980b51d3a07fad6557e77303cbbffffffff01598a26000000000017a914684d2388fa75d3c932e75db6c4c304736616a0e887024730440220738abb5edc2c2394246865f37194deb5cbd09da3fec0c3a04237265e27e97fbe022048662aea48d75b0ad4982318efb58863e98ea0c2e9084e2b32ac9eb66ee73401012102bdf1baa3fff58b1a0223ff68028630c1b556a456fbf0b46afbce064caf36d4b20000000001000000000101b7b6b4a37769f219e8aad1d7b338f95eb7db57c811de7b9468a802fa3c33d6040200000017160014b9b081243bea0e4d5b8d09ecd18e750ebc940b33ffffffff01d35901000000000017a9145a0baf63ddeb62f47d915828542a7feed01d8e6a8702483045022100fa42fbd897206baa775290f82d87bd5f4441e4156e8f44c97ab15c829edd0bc402204a9f9928a28b900291a8ac453e523b58dc5555ad854372123491d2fc1fa4eb35012103c844cb377f5c0a8d074f60c9894509ff20c21c62033ad6c46d3943f2e48b75ee00000000010000000001017d461fe705a300153a611e87c09a3f7e1c2c5ba93ea7c8a831b56cfdc17cfbd231000000171600145aa53b02f554cc45d2d4bc56aff77179010db136ffffffff014bbd08000000000017a91479e3233fc660a1db36073258a999c76389abb6c0870247304402204935068260ba013404c5658ed0391e44a86fb722f903861a673ea35accbfd1b3022078050e07cd9a98e3fb2c64f1847c9e5db08efad7e763f7773487c80e9d5d47cc01210284a2b9b3138e0f60798e69bfcadca7c4de6277ff9b0d4d0c7488763e5dc8dec500000000010000000001018469fb7e8a0a7d588b8a372702d61dd50a190e9ca140c5913d14e66e1dea64840000000017160014caae01cb7dc60e2e116bfbba9b9c637147c617a4ffffffff0193fb00000000000017a9145a0baf63ddeb62f47d915828542a7feed01d8e6a8702483045022100c2c7249e665eb4e320cf902fd9646d11e7c42bb6cf0a0e4f070f145fa41cb9c8022019896f5359c1537e63bd6e3133d925dfb8632218524cea785d57a41fd1d550330121030bcc1518644fda1f2be063962d79af57936795739d14fd8631e8a0eedf6cf796000000000200000000010203bad55e4ae37eb1d42c84d801d2248e334c0b8e05ad49d3696a70afd43c4b660100000000ffffffff5546879bbc0f95bf9b51993de594869993ab7d4af159d1a4ae67f9052bbf93180000000000ffffffff02cf4b2200000000001976a91467741ee60eebfc8ec54342fc3ae0c097f265d1da88ace3d10900000000001600149c6bf7021fcc87317fa2749d872547211859838502483045022100e8a2120e8f4eb8d8412d6fb6b03feea3a43b350d1d0f001247f9cd596a23d17602202de39df1018fdeb1108216d73bbd6b9e9a11faf55b2b778df9acfcb7b1a53f600121025c9fac51f2cf49864a5d4e271906538a60d655f177a91ad47956d5be4cd9a1e80247304402203878fe5a8f137faff57399033c73818d55bd4c2665e7c76abe458594c0c6aa3902200d9bc826e1fc711ff9967a0bb36657d8019d10bfee1bcc3cd6e8a132b16caf76012103e4a69034c84d435886107cbc59e4eb03800a8a9309abbad480c948a259609a8200000000010000000132bf7dac367649ac5b8610d52c153a481ce303cff212ade5afd769539f89539b000000006a47304402205f49ad3a0be641a5614ecbe190a64ef4f8b6eb8f9e6c7922d1be03c80e59f6010220661249f65bf33310d21c23219ecda1d6913f0cc0d16509b37afb5d77462df3c801210387e8fdd5c0c9d63bfd319f86123cde3afdadbf55676b8702b467e77a34e07f9fffffffff0145442200000000001976a914c35cf605f9a20a69442c28d86426736f1c0879e388ac0000000002000000000101a561f84ea1ce6f7928c8ab76bfcf826e8ed9c5e7d1f090d190a04ce8f62168060100000000ffffffff02dd5e0300000000001600142d0cbcefb373254801a1f0c1af7c5ea245c052cebd84aa00000000001600148d5e52dc5f4f1c0e099f0771883b4ea5fc0effea02473044022046f33f1fdaad6716522cf1e4ceb524a282323227556f86afc74332a154d5dc9e02203d2a99d1729752c0d8428f37dbaf9264e8918c62814445543ad3a8d02e3c2677012103860508a62ca43b334c2058406b4b2abd8b1c5f7f7e17fa1190090cb5cdea11d10000000002000000000101aff1a59dda61e704b47a536643bc20bc24d96574f052ead5e8f1fa70a247a9410100000000ffffffff021879000000000000160014581235906ea14d5bbe5b834ef59f2fed52b6823ecd8b010000000000160014202e98d6b8bb09750b4eecda6bedf8380c4ebcc302473044022034c997f2882982b2054aefc191db2cbf42566c54ebe61be56205a8e4d1579f75022064c1777ea8a2daf1e6db30691ee35ec346e77018dc33ef4907925f65bf5b837e0121039af8e40ddd8e1b41e55c7ffd9749597635f075b93bde3cb290e54565fbf227df0000000002000000000101cafc1e0097d5e157aec6e602693fb46a655236084ce30cb5df33e3e3341835fe0200000000ffffffff0287562200000000001600140e5fddfc37d47d6b36b2a9178287593d1d4ed8dc99410d0000000000160014aa29f5a31dfad49c2d25164ab9cf9bd9b8af53310247304402204d082b6731594e49c6ee8472c3c406eeee5d2396a7bfe7b0a5ae629950fdee600220626dd6020a90f43fb0b009ae6a3b0e19916b5a18dac91a61e9b85e9ae1863649012102d426e696a83567400544f92ce3ba3c70bb540bf2b35aa49dc956b73ddb4cdfda00000000020000000001011a7db0170c8f5abd5d6d3121e43e6d1d1a5382a7c7df02f854a596dc2ebf1fb20000000000ffffffff0240240000000000001600145310608dde675e7819cc57d81084710be9369eb08f030000000000001600141b5a71e26a477deed62af6f12466b4c629cb01360247304402204bbc5701e359409a2e5f7f3fbe3da72182de334084487d6c535d5eeaa5fdb45402201a76961321200c59b2e6ba38f1dac8d2523c501a3a676dcaf7b597df6ac3bed70121038b292c84426a49a4d7ba3b8631179b2693a53325b939714d82993cbd3336fef20000000002000000000101861c444b5deb78c32efee08d6a8c4fcd2900f0b65425bd518e102826343930870100000000ffffffff02dcdf0000000000001600149acb132562d50d0726a01dc52f242029c1a7f2ab52200400000000001600145ef9b98c1ce85cdda755047a501f15a6f5e854210247304402200e0b46c80a6d0f434a9373f3cd9b28eae50435f789b61df1a20a21bd78dc08ff02207075bccc2cbb9cc523e69daf08727c79bcde17a705bd51fa1fa76ce1d2ef1e270121027c8e4fb2780a2d1b95740236f87e9a45bfb52bd7802dac3ccae3eafed62430720000000002000000000101b6b897aedd317e32fb067ba34717240a709815cb275007909c1e9b2e373e59853700000000ffffffff0279d5090000000000160014c51b7708dc163da732c8fb23390f458d802952f7084507000000000016001491c19e9b6bf9e0c99b5b49fda216a595d7ae690702483045022100b5e5ad75efb089e9176841194acfa500f4950282632910eb8675bc15db7cb9f502203cc844a222258b771c0243fb51c991e2765df3336adc14e2c5306c6a093d22ba01210312667b887e6515f93429ed30d189b1f8d064d268fa94179cddf3d583424e93f800000000020000000001015a9af2ef324e2b955044a2e4fb34374ff39e8ca2b728dda458c09d393eba88a70100000000ffffffff029b490d00000000001600143d539da9af591af72f6b18fe12a76cf50a2dbe36f42900000000000016001439203231659006ba5ad95807281ef14c6b9350de02483045022100c089f7e063bd03481cf49d9f376b7005ae8ccbc631d312d5a3081c63b4a8bd7c022063398d925aea3cbfee90b54af8caa4ca7201a2f458f15c6b16044f042b986bac012102864f7ce293f18bab4813102ae0c42758df2b6de4c882a4098a7e1e6dad0117a000000000020000000001018e065bc3734e9e71310fb8fd4f5fdbe03addf383f8584d93fba3968ef6f2dcda0100000000ffffffff02790201000000000017a914f4f3c6a2183c48a644aa9b9f10a62f2ca482ec47879a278500000000001600144773a76700b3e83de49cae63bbaefeba100fee8602473044022032fea79a8eae1ee0b907f709b81f53467ee560dba6628a5288a9c9891d4ddd400220184c329dbf2b91beb403aa03c725515e683a098133986e1fd69e74d6230e0366012102a7d462515258e93e9a71239f086c7ee37c9c72ac1dbe19ec91465d236a928d4500000000020000000001018445d6140b675761dcc5f337ea89bcb8b0d97c325d533d99cbd36cfdfa9aa1d40000000000ffffffff0225455e000000000017a91454b9f8baf82b524c9243765947ad1bb824f22da087f519190000000000160014eff3f473d0d29696bfe8c22ef0cad5aa8f0dd68102473044022078f896b2b9aefe33080e7d74360ed676901744c8cbcf1940390720e2db8a289f02205fb5923347fe2d59b38a11df7ad28f2ff89f865d7b33ef23ee608c27057fc446012103bb77af7ea74d7ec5b7bacd1a0044f6ee99888df481fef458e80320aa379b3f8e00000000020000000001018eb78f027c0f3e7e5c372f0dc1c838f674d7bdb26ecbeb5469c07512593ec6253200000000ffffffff020f2d01000000000017a914b058f239ba28220503a1d3a74ade0ad273e45480872673000000000000160014548a1f53e5357ad8f6e0eeb0ec257ecde2621de602483045022100d008a5241ee139773aa9343320816998d2470142b1040a6a35ec3b0c3cba6d0c022056ad17651e77360eb380c24540817c155983ee28bb2dfbca82dd488404337a91012103e9c3267aa6a18bcbccf991280934fa60104378a5b40d29f84994f0e7d88745e4000000000200000000010114d6879001aa30db6c73bb582153595c88a89ae787a62452d281458d0986c5243300000000ffffffff028ba701000000000017a91429203a5346a604808610ef85c7be8dba91f99f5c8760fa0000000000001600144d4df0a4309bc519229cbfc73b31177f5b46759b02483045022100e24d8f64ed32d36b5daf05b01f858fae1b28f14f183440d401050e921f81a6c20220076812a2662d1fcdfa5711ed45f5b42bfbce1682dac82bd266c4464b6d6143250121028a3522e0682c5cc6ef3f786ac68f4325a92c5bd55f66032c9379401732a4d3580000000002000000000101e4b3299f9c6ebdf936ca16ad74f163a7ff5daa30bab58347756f1c1f99d189cb0100000000ffffffff02a85b01000000000017a9147c395b4ef4309c3d14d682008b2e780b96f6939e877f7b00000000000016001426c1e7e367f86aee3c6196baa6a5fe26e7af7fa50247304402205c457f4d64013bd462264bd2e568914d7ce608cdc5892a0c51a4ff7140dc5ea102205ddff59bc4b249fe7ff43c3d690eb1bbe08d94d5a485fafc1cac7aef47e1af0a012103c1340efe0c4b67170615b8108fbd072335f9775a275c2f9788e14fb77909aa250000000002000000000101dccbccf8504588805b33471887b76e2af84a4ff551adf6bea9ded1a10c8e3a7a0100000000ffffffff022d6703000000000017a9141b8b6ec270d42321cf0fb17e0af4c32fb717073e870bac0000000000001600146aab1caecf8ad6c60a5adf5fb21aa93e8f537b880247304402205006fb9b1009d5713ac48d4f10cf3dff4dd295d77727649000613be377f4aa5e02203566ef59f3536dcff3f7bfc3a9b032adc6c7ead654f8bd8d988361cbd4dcaf3701210221398d733a6f269a78e4732815e6f9e34dc54f69a93cf532f481082d0fa85a3b0000000002000000000101b5f9308def7e1b267e85be741240ae87b72028e6c5a5c5758d57a217811fdb5d0400000000ffffffff02efbf0b000000000017a9141c75893d8d90731d3c05d40e03fb107dbf1332d787be0b03000000000016001458a63727ffe770a41d1f9970c9b50302d2f1eae10248304502210084274086e6ad351296b46c0b3e427ab50745eee600810511311b9daba825538f0220111f4ea1c9a18204b7ac37b3d06c1bbce885095c182789bc2b04bf3a960e818701210271e43375b4073403953202d8ba164e42a5db6c63632ca884047681d0d0f5db8c00000000020000000001010abbcfc05bc13199b5a5534f2de727d437cdaa9202212ef458bfa61d4be95f140000000000ffffffff022fb202000000000017a914062afd41cb078c996ca6d9aaedd4dda7b4bc3bf487a045020000000000160014ab89bede02f8f5619398ea2e674e0b0fa3b0eb0902483045022100b39d9a58c2a3dfc4cb1f9e43a5d982d1d5aff4a067f1f99ba68faf573b30f828022071cd3269e50e27906e8a5b13eda4d94030f464cdf655e0cd18c525ea0109e0b10121027280f2dd25f184cbe65a5a0351fea20c7b24ceaf783e704e16ea815c417e8a270000000002000000000101e63dad084c4892e3f41403084375b492df1aa276d6312a0cb537ee538727ec6d1600000000ffffffff02d48402000000000017a914fead174b89883589ac04658e38988d3eb2313c2787362300000000000016001469cd7505026bb7029a6d8d0023786d4046cf367802483045022100f734e73dcc394a25282cb5ac9255c96183a3c3f1ed108002cc93fa32e7f3a73302200ba56f0d2335ceeee2849f269eed2c3885d5896fd51ee32b1142d790390836e80121023678834ce3cb58c21205e1405bde252b8ceb3d11f3b65dbbabb7085c16d5c69700000000020000000001016b5ac787c5ba836609e9bd255f06f8aa69115be1fc75d6f23909b38c0e0e03652500000000ffffffff025a6304000000000017a9147d226fc21abd7709f70cf391ac3da84edb6819a487d731000000000000160014069b91afc3284d971c1dd87e0e5514e74934227802483045022100cd82df223d63bb329cd98af5a0f7acd7b51f8c817cc00b08220d1229f1babf9702200a8985ded3798c6abbd6b79df72025094bc8dd39210401011808ca2e0debe1bd012103399e9d0f07bbb14cb5c1de111cd84d3417683edb4bb82fc5c02be4e96052ec4e0000000002000000000101abb33279e9d6671f8729f150258796a1ceb8386fc779944961f6e91b33de8df23100000000ffffffff02f07e0e000000000017a914e80d9c9ced8fd647c25900718aac5cada2c2d4708757f807000000000016001481f490776d8fdb55ba6c174a37b067431b4adb8302483045022100ac0f814a90e5d458cbb63b27c3f55338be7a9b964f5b1fe9687a1381c97209900220214f39173459c458a035dfd0b63427ffbff1091903bb78e486cc383dcbb36fc1012103f42404123ab1ffbcf1d0263411bb0b2c6c787dff28cb9be521685691818f896c00000000020000000001017bc406cf4388d6ec4f68fdae203698608fce7ecb21adb81f1bfa62c8e235f1430100000000ffffffff0268dc10000000000017a914fafca0a3039ce9a227e2908f43279774f5770d4187f14c0d0000000000160014984916ec495b93a9a2a872179e37e45eaa39a8900247304402204b5d40d39091245e627e976d5991c1d92a99f47514439d51e9251145270e3177022077de53670a5f039944d3214f8b2d4b06d72e305322b7f99b026806747eed2acb012103a701bbfc25b57f7e3cef5ccd2c1bd107989480c98433f7121a46b2e2e38321e200000000020000000001016f74018e8a6940783323866f222d8eb9aa71ef7ec46559d0a2894da87d5ec1f41500000000ffffffff02527b0d000000000017a9143fa11a035b90e7af47d05fde10792f94ee045a9f870e3c0700000000001600143295821ebb03420bd8800ca24cd8672ac9160f320247304402205e8f23ece5a0c5632972adad04f5540e396ee58b24e6ff023744b51693e1e027022044487c94ffa934626cc9bbbaf28f6d0dccfdb3827d87bade4b9b7d7b775d2861012102a02c5008ebaa1bbdde320ec25b6cfc52dacbbddc6089a1ce6df241b69d08e8c9000000000200000000010136e0507adf75b3e2ce0b963e1cf5d9298b8c5d1e98caf498e000a6ceb68329770000000000ffffffff0250b150010000000017a914b25d3b6c763c85f4cdac66fe6d0b48db0a9f4773873a53a4020000000016001412261eb8badaa5c6400f7fb01b0581199da4980c024830450221009b240b00030235a8a1f7514d86dec0626394885524f34f8ef972c6f0f9ed420402206395c3c7759099b8800f9bc5fc3b394962a9b88051c30b4222802a69f2fd99340121032db0eb6d06212f3b07b7ae0cfcf0fcb410580b3b48785bed4c5dc858c5539dd90000000002000000000101661e4471ad6a21cfc20bd5907632458ed48cbac5e47916db532cdfa67ebbd2445400000000ffffffff021a3c00000000000017a9142abdf99bae6805cf0e54f332290c5db05ba57aef87a00e000000000000160014e271d36929d44c87f0a5d344ef2899da04dffa610247304402203f899c21025210e753329c3bdf93fe22769e137b8cbb8e234a9cb5384942d7db022063450084a882894c191c27d474161ade8477796a65c3bd6101cc3bed64d71d4d0121025fdd30c38fba9d3e964579649b88aabb31c96e29558dd150d3481294c34bf6230000000002000000000101801c2dbc77fe206f43c3ef150b1c2c502ce0965366ea2d7af1f68bc674e9f0d30100000000ffffffff0251e50d000000000017a914be5fae206d7353065097ccd0d71e339fa022f4038799ab270000000000160014b4b6725a6e5cb0bf3d4186c0a15b778b1e9e300502483045022100b0b0ac5940da7a02f053d49d580c9b6f894c85f8ac1a307ebfaa5990e57212fe022013c6128a3f1e4a6d06e8cd6ef1a94cb454963a28744c8b135ae039d284d0e060012103c3d5b4dc995c6203070f25161f4ea895e4f6e146e2afab6000e3a1dc0a0a8fc500000000020000000001017deb5be7f9d8d7e9c00fead8caee340a47e59ea52ab6a9bddd4bbf725d028aca0100000000ffffffff02368100000000000017a9148e6c62c1b55f2d3df51a1366be89f33e31d3d20e8797ba0000000000001600149a58438d7231de126caefec9b918e0f034f8d8870247304402207deb68b52599b2ca0694408dfa64972308dd8f3cf4be76de510d98d831b97070022064c0cec3e212fc810a9d5a1666c2c4e46fec4bdcc435131e6556e90cd181e505012102357e1fd4bcbb4931f780efb09365529a3d30117a0ab535634d8b686aa5176348000000000200000000010146369ec9bcebc7394213dd08a7d71f816515e5ef1dc3f8ec69828127445fc3360100000000ffffffff028b3343000000000017a914e75050505b7ace8186ea488a7d030d792682adba876a1d2e040000000016001438cd564805b641b242abf1fa0884d8eaa7eb790a0247304402202890b06d58b8de3756340fe27f3d5adba776a3405d96d89d21cab0f7041c6dc5022000d40336aa96af0c3299144d2e450bab09661f2414422ac92e91df8f858eba9d012103e50cfabced248575cde0f950f284832e903fec4725e3fd38cec8a916d193283d0000000002000000000101bc50b8811a279ff9e826f1037ebf9e206dcb04bd918d697d8cb0fa76fd17a7bc0000000000ffffffff029ebf00000000000017a9146552926868801f7c445751c60a6b3012905145ed8747050000000000001600145bb66ea65c0231cd069ca00864c3f72f4edc9e5f02483045022100b17e81ed1fa45f3d92712f3e4206437dd957d247b05ef615f01b8277d09bd7e70220231dd5ff149863b13226c31fb583ec70aaec6193cda5aafa902bc756e3bb098301210263bd2779cb19297817a1499865f377a5cd94b5ed4bf586fcd28b9ddc8c54753300000000020000000001018b2d32effadc7758e5c93992df7d7b041767d854333d07be7304662f443a02470c00000000ffffffff02165606000000000017a914bf758bedeadb7337769482004ff17b3005d04d1e873c13000000000000160014661f68f68285d520d32e31108c8ee4360d2614a20247304402205235fbe4af8be0be0bcd072148a1eeb6d0c1ec8f82ddb08da89b61077b8a2afb02205ea09d328e0708a0803b61f8ef59ff886681e6bd6d25f5b015d6e3b46125351701210393e11ea03bae6a0773a6ebf996caf7a304df4b685e5da09826cbe8a83926a07200000000020000000001013799d903b4bcef55b30fb7b1efc0560d1d9ec3ee86f6140b5e3fb70f96fa0d900000000000ffffffff02cc0201000000000017a914ceb612e99a5d4dd4379007bac772d54cbddb5fd087b9700000000000001600140cd2655099eed9469754f5be5fc411b2d5acdb69024730440220010396c56b90716ede7c6c2c262c9ead309105111d96c678ee646baf602c16a8022072459e6a2267476faa4de4eb341c4c229b104f4cbf7131220d1547f9def42ebb01210269a2a58ca06f3837c53ee5b3b5bfbe9d2d98ed6b527a0d08df0c3937c8ad8c0e00000000020000000001010dd38db01b14bc243c49f5a0e2919a4da13fb5afdefdf54dd16ec75b24624f591f00000000ffffffff029c7c0d000000000017a914d6487d354acc962ce5d579ee9a27ce889ecefe8e87ca28000000000000160014e1a60072cd94fc79d8ceffd606fb5ea5c0b02c2e02483045022100d5a54416c330dd144ad534bedd435aac7134421f02362f502ad5c36af8ab3ed50220411562d97332c64da953a2f3e3a2c1a1ed5b2a74598b9df0b471d7f483dbc1b6012103be5fbc4d59dd47cfc582db28b31489c231f2d9ddf50e524670140b97237e3cdc00000000020000000001016afcb122ad51c47fe364f39e6d4bf41e8bafb009ff849cf07028813ac441f8570100000000ffffffff028d5f00000000000017a9148f8a1021a4238b014ded770518c31b16ce5206f087820a0000000000001600141ac34245c1449daf2b0f6275c6ac9ad4b79feb450247304402205d1aae0bd158e21d629b3200e9ff082742de92301e53c12e5f8f0301d6fce85e02202896a9acbc94748d8d7fe1c2a654899a3158bc04257680ca63bdaddd5c2db1b0012103fd15fd8b4aa68629373dda9981a45b940ba6e6e805e5bcf26545c62f871137710000000002000000000101fda081c31a34e6ad332a71738ba68b30bf49776d533db59b91abf465fafedeff0100000000ffffffff02178502000000000017a91411f19b105a3065716036311ce973d7b1d694e23a874a300a000000000016001404f3a4566d2ba4feff02f93468c6eb58ce26df6002483045022100c37151f4cf433de5d9fba8ed43bed99f5a9a67aa605a808ef939e4e5e82dfdfd022056330a42e52ec25d5bc510be1e28bc14d6d66db79a73c66962bfb91340c1260001210212fbdb55baf4535b2df85c790b0283c51fc44fb0af240bcd824b2e06dc37ee2b0000000002000000000101c4f6bae64ef2520893399c4804ec444fcd2f1aeb80e4076bf868aa051cf20dd40100000000ffffffff02501d00000000000017a914b4828c5bf1e81738f1dba08fb3d9cf981dd3fc2b87ba03000000000000160014e825b4b7a4b670e8632174eed6d40f4ebc0368f402473044022040dd18ff3d2cc37af8ba2f3e88bfd25e792b39e85092362a718cc325266e8d5302204d45cbc268e5e416b92e37a8ba0a9e1d253d5c44a430ff4211479cd91feb152e01210207f577aa463510ace9732caede2ef6fc0aff37889cb165934cac7182e9f703240000000001000000000101b921ff224f6b375525d5b21952eca3665548103385c18901722c8eb8a3a3c4870700000000ffffffff01f88905000000000017a9148f7fdaf3d7f79ac3c6ab9e4646e4767b58bcd4ae8702483045022100962224b53031cd006c521173f97960e4652c6cfc39c3ca22657388af46614e1b02201b4fba0cf2312698f3ffa33950366de3d78f1db596da1aff2db6c036964d55c40121035a9fbe5ab23a5e764f682ba82540532a007e03814b4b7cc5cb26372a992f32f400000000020000000001017b01e28c86824afe2e58d988f3b1d22963baf7fbafcceebe19d56a30cadb5f5e0100000000ffffffff0296ae0100000000001976a9147f5113be94d804a571026ffeff0f1797713ad37688ac6eb91c000000000016001407754d27b807e85f0c425f4fc7f7872794aad63b02483045022100cb9a3a992533a62d055c7a84cbb99211e24cfead9a669681635958371d6eb2d9022041c094a95e248c07c07f050d6c2c95c1da86331a27d52753fdb4d2daea2c8d7c012102c646e6ad75143e3d27b47af9d001e08dee20930525696599f9773ddcf0b719970000000002000000000101844322728151a36133246f9cb64328d7711422e35b3cded53eb5fd0707ced9c70000000000ffffffff02ffc10800000000001976a914349e6b215984f8c0ec4bfe3c6fca290691e55cc688accdc100000000000016001430aa87001a9ac4d5c35566e1fd9161d710e05e2202473044022053b71b14bd3b05b6cfb5218dae21e2c9ef968974624cf1f1ebd2705dc2df6ad502201f469ca2cb5f9573f6742f0277f20889c50749a368abeae1999eaefdebd42151012103e8560d614cc193768b09a3b48f7f71db921d32f9fbe522fd27ba2c062bc0755d0000000002000000000101be021c4fff8b6f3c2602a2af6c45bf6b8027ac49a579be4ea2db5b80a663b23a0100000000ffffffff022790ba00000000001976a914d4dacb4f14d9bb347d263b0abef66da693028a6388ac0fe56700000000001600140f55885024dd20c6f2dc3254cf9b5e9c66fb93d002483045022100a7b6c70e19b76ac2285f5700c0167517e462f76c904aff9e1800dd2799b044990220420c5e9fad934909ba4377899cb6c23fabd8157ef5d613de733739bde67f419d01210292f1bde034f0cb742cb24c3d17e2debe4594aa58d53c22f94725ce54265aa5a400000000020000000001019de1af84cc811fc85f4db151e5427709401daa49a00c822fb0595d42eaf0d0450100000000ffffffff025cb20100000000001976a914d3184c1dbd75a2d4d81e6bb2f1889fb632b59af588ace3210a000000000016001441d693f9dff60e6eed2842c337c0a03bb60a7e4c0247304402207415a21dc3f6253fa9ff29478a447a767928eefac6b3aaea6539f1593b1f46c40220754d77c58358ead350fcff08acc2eeca73460ffde78593ad9b79a66f553047a60121036029bface97a665379cd2ae1b5a4b5e55358d54eb0fd64eca808ea5a54d01bb0000000000200000000010168eecad80be5b8549b2428156308576dab70d9d16074019e3e34969c163ca4d30100000000ffffffff0207da0100000000001976a9145f69d1cf08cf5bd9e7d3773d7063da88c6f7007688ac6c94750000000000160014f151177ed5daf6250e60a6f16347398ae6ea2c5b0247304402205bd2da3e6eac824e1c6afaff757586c07de606f8447ce36e015f8f7e134348ac022026e13f5c596c29ade65ea7761087d772021daa89df92eded843eb956e68e3c7f012103009e964687f01b6e283f0542f02d34df298f5dca371e75ea4da6d574292ad5d60000000002000000000101d4b279d924043aab0e5eade28f24228f696c4b22377ea71be4f9c81787a620aa0100000000ffffffff0218140100000000001976a9144ad2c95e6a829474d1cdaa3f66b6ece1c477d98c88acc98e00000000000016001462108cf719b779d1af618d2d70314069f2f1b62702483045022100f9b116c6a46d4c30b1669ba656bb7effbae2203b6c3c0fc32538c54bb82e7a24022044b262a7c7b4bc308247c08cd518b6f52a763a77cea0193ef6c948160e3e03e7012103e45ffafb017c150bdbc9875a63ec61a06775c6c0317ba7b1ce56c5b26efbaff80000000002000000000101a462488c7f828da11e820234fc5a7267a34be672ca211ea170250ffb7c1bdf1e0100000000ffffffff02c1260000000000001976a914d75e9dd05ca300bb9631000ba1748b2488a21f6c88ac28470100000000001600141f30d243b4597242545183112be4c96171f53ce902483045022100c22e970cc903edd031e627b86a381d03daa92793726bb2b734c31a34851527dc022030b4a8730728cf64e6c6b6fc56d9009aea9801424c0893f09ef8b92da09fa96b012102c00b56a630f65ede946211c5d781117c17d5db36c4a4374526e988e7ab20d8fc00000000020000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d43700000000ffffffff0298640200000000001976a914ad3b00cda70e6af6468c1854d25f1b42b662195e88acf608000000000000160014deca1f8addd29d37f1c5a61f371b921bb5202f7f0247304402205949e77a943e36a97c8d412b898cbf42ca5ebe3883765da8c91467c2d3c80cda02204802f79ec30402561a78b61477fe6b193784a6c7cab1a36386a543854777c485012103eb7585a80c7a39df0c4745ae99330fa9352cbfd4b626b811729fbbbd4378c9080000000002000000000101b26fd25e8dc72feafa9ebcd6e127ab655038a9853303f37359a062c01de5789a0100000000ffffffff0275270300000000001976a914fe4ec5a97e32f1f9b4144a12948310d63198f3b888ac6dae000000000000160014e79ec28f3aacbb56d88e5320411dccdb1dc6a38302483045022100a419cf40b825a42e7c4d6ad0d3e6ece9707a0adf3c2417162cb60d3d975e05aa02202ff39516e9c076dd765938ae8b4d75c96fae411dc16950e8937cd952b2e74627012103bbcc3a5bcb7471da9b113913f19e78eb39121ae5df107fd8937350b4c948a8da00000000020000000001019ee4fa18d738778dee052235a54f98063fcfd965042c4019aa48fc10b923a0c90100000000ffffffff0270b01700000000001976a9148d145383cc2c6beabe57d10411f608220f443f9388ac485e100000000000160014a3ba1ed9de058b0baaafd7e538208407c5155e7302473044022022e95c8b5afb52a74a5400375f54fb97be11f38f477b5969e21ec3b903f793ee02205be36a5734a8138f0c1c9a30f1458b418ca1ac86c0e685e1c626d6b5ed5fa217012103e7a62e58e1b2b5eb4c348a493738546138ba9489192ffcc1de5bfaf9194a2dab000000000200000000010270be73a1cbc4d9ad8cb158462f09fd4b4f4e2cc462584727c35a0ce2459145ba1800000000ffffffff2d184bc15fd1e964d30335cfa85d4db664dfdf1af38f61bf6877c2ec156db7fb1600000000ffffffff02458a320000000000160014471627f17dae35a5a297260874675220929252ec466e000000000000160014467e8d9f8b293eaaa998322fffeb1ec9084bc38802483045022100d09c9cd307e835722567b150c3fec1ef7bfec17cadd29f664a06ff731455feff02207fb8dd1c42f107882d331c2d73ad769e41e5e43798b55e50be516b6ebeb30a4801210237fda9c675908b999ef3ff8de9cb79265bcc3c249c66f6b1116116189520929102473044022044bf41a83ca04a876ebbc881cf45d98368ebec9be8873cfa178b9f13425b3d7e02206c3aa96a6e8588fc08b6a8e8c1fa6810d7b3118bb9ce262cc9d94d37a4fd369e012102e35fd057ba9e6cee8053c0f35eaaeb4b752615899cea52f0a0e242078cad33f3000000000200000000010104415edb86c438f6e1a428d49d3e93a414652d6c0c8815acb007f08e2f7b44e70100000000ffffffff022856000000000000160014471627f17dae35a5a297260874675220929252ecbe14000000000000160014d298046b95e94a7130f22eb8d08627cf848523bd02483045022100eefad72e7ff65def0b1123898fd959e592408b977635d843c1f26f4d5d524cf70220145b3fa8987f401e0928b3bf5cefa83593bf2845770923065208708b599d6a72012103401fb83248d965b618b51393d7050dba890546b1387410f92dad0f264411e9fc000000000200000000010191e22a8e212236f95cd8249ca3a6bd9faa7f8ac8379ad101cc8ec96b9a8adc4d0100000000fdffffff025a540000000000001976a9149d6558342235e51b0a36e730aa669c2a0eaacbcb88ac0589060000000000160014989b5ab3a6bb8c00992db8cbdc5001b51b0d2d340247304402202ebd08472864d99dbe02ea8667683d0e611afbdaa86fbadde0b6666c2aa219ee022033ab756e2c3c9d0d1d3ee846ed071cba636a536d38ce229c049fccb97721018801210381352ecf1a49deb4d41a900a3159889bed2d060cb55a8280f345bf7e24d0b06248a00a00010000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d41d000000171600148a6303d468213a72f23914a505bc3e75b32b103bffffffff01a8b80600000000001976a914542b949963e00788ab4d2a81ac89fb51b531179888ac02483045022100d256e27ca94b6202e1a4f1cb713ac1f20ea17105ab811eec33d75721b87d801d02203e0260731e6dd898e1007c5dbdaa8e8bdac45100b0a0ec4ffdc13a55902c2c60012103d4ccff23892f0eec8b3aae546ec38951bb9d4cf39b57fa6e0ea524fee776e92700000000020000000001024b672c6b154aa542f6dad7c4091e827e8ef47ff792e37cd35f8ec903b523a67506000000171600140e5186b1d7d78cd1e4e93df16281c096434d99feffffffff9d2418001948a2a0b7f7fcb44a3cc73a031616ce1d2dc3b7dd4543d1c3358154170000001716001424a74e5b19bc6a34f91976862164e00fe21de53dffffffff0240420f000000000017a914b98998edda0acf62bf7a0432294dfe828006e2088711540f000000000017a914caf61d6ea8ecc0e7abaa5fab3cccd67cf805a10f870247304402206fe4563dd97c7c70cde7016b11c53ebaef0209ce98ee3f80f11e4cca48a167b102201f34811dd8a0c4cc5a3ff40fa76e9435efddf9ca29d558edab93599996b757ab0121021b9511f40db2ac204c2230c98f020f9b4e433e9e27a6dcb0afb7f4ebc26ecfbe024730440220603a92c084e7635717ea5ad7b17c2a7b2a620eee91076437036b31aa3f2a7fe502202c068359748ac86acbcc1e56d5e3656137be6f71bc72b88f1527a264015e13bc012102f945abcdbed15757301e9496e32b3ee6cf8f17bb20d34578bedb1b26342aa3b40000000001000000000102adbb1780ea3dd67ad8ee4d0625ce50dbc0c257784d268480ef105248f025ca2e01000000171600149a95ce3c74016c25b35d80f2be176d34e7846867ffffffff6caed9fd22ace36372c61a4d3f7e3fd7f0bc3daa5596037148665524974048cc01000000171600143c2dbdc09a3ca1d84665ca8ef7322b718346da0affffffff026c2300000000000017a9147283f3f8b511cf4cfc0fa835d3ffe61b6885f684878b0201000000000017a914b32858a3b5bb28aacf87aa877c94ee78aed0d6c9870247304402200168a090e98171c16c0464ba16d3c1ef8436962d8f4cc0ec9b562a188ea5417002206c8334679f7070790d4f66f901bb96433b1bdabefcc0a944b1da86641d0bb0ba012103f5e4757510a0f65592685c477fcedf011f3141b4cffd474abb3803eac4270ed302483045022100e99f9b0807d2f10673d0d0f4b20b5c7e316b1b4f486b7740ecde5e9c65498ede02206dc1ecd5487165874b7bedfa01fdde33f8c0c4067a631139a027b7a649307ae5012102d9622456c5a7ad25f0b24477fe4267aba313f0330f0a00c2a248a7481597b3a700000000020000000001054a20876f68ee344b15a86b48eea4e1395f804736d508602191c95abb56686e07c500000000ffffffffade3a13d934074f6a932d4758c524ea2812e7d104b8d85a3d06fcc522e8811895b00000000ffffffff81f097d31a00520bb15577c1edde4da4edc679e0872e839f300162d1931b37792301000000ffffffff18557735eccde13b3c31135c42a0cecb1619a08e22d3c3f024bb9bdd0e52ebcd3a00000000ffffffff0dd8926c71bc7174cafd41c4fbd3cf0d1ac690c20fe8488ed12bc3a7c6aa4ae4bd00000000ffffffff02d45e0300000000001976a9149cdba499451db4830cf0e7da00a515418f688c4888aca5a7000000000000160014748aec84c2c2d62eb71aa094808702f13055ea8102483045022100be8a66bc7dc78497af5748e53ece845be5bc5071be36425c8add7dd6f7954188022079304d40e14a74ca897638a67a7d12eb2ee8a66ab633302e63677ee28afc575f0121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca11502473044022057f8086c4f7b03e61a82e0f97018aa9ec2ed1c7c148d00098cc154fc20bc830a0220648229717fe340bb3a356c97dcd6aff9e699e59e959fe75da104215dffdd87110121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca115024830450221008d26eb18520579d826d5d84c3495ffd26eeba13d526cda370b1e2b78d4cc881602205ee7ecb3ce8ba6dee974e3a783d0745b1161886fdaf00209aeaa51c02ec187bf0121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca1150247304402207f3e1e409b048bb698dd52cfc9dc8ea9d5e20ec7ae08124eff827a082c2fd977022009145eb08c1f46b2fa6c561634211a6364004bd7f8a546ff0cccb7e90a2c17a10121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca11502473044022014126d1d4c06deac6c63bed0b5538a82b0be5d696bdbea21fb9adf629d6790d3022018ca827f60c6672f80eb5ab428cc13c09353539e9c347f467e9614f88807a7010121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca1150000000002000000017b6b291c690262d0656530ad25c376790c62e05fe286b8b56bc6ebf72c5d07f7000000006a473044022037aedf13be13f5e4e09973b2678035dd36c4ca70aa187e0c46fc7d6877becf69022067894746e2ae9c4f62e542c15e0d0f1b61cd39c206aa71b334ce93552def403b012103c3eb615f9e354237471d53f47f30f151588f59fc62c6ceaf19e21811605e5e66ffffffff02ee4243000000000017a914a62232977ce1b7ac66e94d70477aae287f9b8795873a920f000000000016001455ab28891572627ad9a60b1d5d9b42a744c34125000000000200000000010162b63444ad0ee84400321f3c70ea62c00e5a1c7e5c86e8d3812ef73b650f21a80100000000ffffffff025cbc0600000000001976a914f5aabfe98246b909a214971fe9072bf42de640fa88ac6cd2080000000000160014d56fad0ff8b83195b47671754f096ad70bbe817802483045022100957890b95282d46522e586b0268c3aa379129b06dce626f2de725d83c8257a69022061d77f360dc71ee1a96de99a42839fa9f19cd3a07b869dc9b4b104f211066e2c012103bcff404fb9bbc11302a410ed733a28eb3817d49d672cfe68115666c619527869000000000200000000010223821ed78ffa205490d8c5a9f766b0c7c05b79ef8dbed610b443223a6e6f8a261400000000ffffffff61b2512bf39d776e30b3f51312a7e5ffae23d24ed8d89edffee87e454e1a8a680700000000ffffffff0220cd080000000000160014f45eac30ebe6579dc700542b34d653683abcc6493259010000000000160014c375590807e7d72817d93fb4c21fda3ca8a2200b024830450221009b8e0d3a98fd5c6c4c3607083ebe8189709f884263bd10918ca1c39b43a4e2850220619dd5fea15a3d08390c1a15465de1a7e2683f5f1ac81727ba520a24114fd6790121031d49cfa741310d85a563e7b3e5fac421a00974981d85356b9f8f9644034394c302483045022100cbd0ffef5b2ea7f518df103cedf8a2c3f962fec02a934cba0842fe5338fee18d02202684f9bcbf3de485eb26ace36b7c5b0fd0d86495ac325bb954241dcb1bbc102b0121020a9f796ba22c90f0ba6d1bfd9fef6e7897d6ede2ade461192c39b105931d6e67000000000100000000010201edc1edf6e98ca52b745f929e180220e7121cd25a3c5e6c408e68ba4a8792c0010000000000000000c6a6470447b310f8bd3081847a72ff7ce868ac92e4b7b1fbcd34e49c38939d0c01000000000000000002b0f44f010000000017a914e4e33a0b508ca788273fe5b9a1759c2ad924fd9f87e711110100000000160014b0406726c4ba289fbf2c0d9c143831553c384a47024730440220347989f89002513322045cd41cd091f4d2ed3cf6a1f43f81fc9d8f52a8e3ee3802203bc968a395cc1aa762851388c32047c92a657acd28e1591d59725b68918156580121036c15ec11018ad519161ae77e67e070588d77babd000efd23679f798bac8b7859024830450221008b27fd07d16ad4b14a4dfddea0fded87fead8b849d7240a1d1c8319367baa11302201465298cb31c5bbae108380b10d67f11a4ee3c73e3b49ea50a8b3a4e8ab20468012103d792a86ede3054f815ce80cc97c8ec5a0effd5023384ca9299491a60fa22698e0000000002000000000102de3a363247ac6b449f2d400c4218df61531eefa70d6ce108fd3fea66e3d50c420400000000ffffffff13aaeafb63fd9f23b346cc145b22c72c4d79105dc1df1ec2158716712777a8b10100000000ffffffff02545406000000000017a91433e72152fc9feaf069d42fed35b8fe2b9a5d594987aa29000000000000160014aaa5fae7e648cb17384e36179f203081b57583eb02483045022100dd775f58ce79c8c4240426665320b01cac009ecfe87f87f24202f7f4b194f35e02206091411a48ccf18d5c86c41751e2dd45298151c4b1fa630c2f454538146fd569012103b13f734bb6b2c4625ddb9ff70e4fced27b591a9c3f4b371e251772f281c6e87a02483045022100f2baa91fdae17c1550e83e3964729786f1c19ffda9739f0e20d9d9164238a4cd02205d644635959279c3d90dad14ad58c922fd3af661a5ebd51f6dd2a2a7085f95c501210371580f0ce398fdfa8f996e18b58b9c86ce96dbfdf8faebf5f86748b1f72d326e000000000100000000010263c684a04a3ce9b84f68ea1053a176a60b9e687ab547652788d731a51f484bc90900000000000000002117ba251d88a449cd3ec2ec0ee38d0c0bccd3195e645fd619ef3898b040c98d06000000000000000002160a00000000000017a91415b8f5bb7a4d75b4d8b348e504179d8d5f5b54ee8701b4030000000000160014eaa206a180572d7e3b078f12058c26191c761b66024730440220579b5169d710b8f061ee2addddc6f2c58753df30acde35df04c569e715aed9f702207ed196da108f2fa8b409194041e038d4c8737b839734df696434cff74451d7830121031a518aaca4edc3cb9ae0f834671fd1e66c78cfe78af1fcf694979f7a80ab624b02483045022100c13ce7722b9d8a8a4421ffd1af07b4944d321156bb76e874d3cec6164a94ecb20220457a8d7552671e04a7b694cbe6aab1f6316e42e1ecd9f1c2d315b5bc748cca950121033ca9d0446a8a7e2b3ede63257edb4a566b4b4488d4796df0d729970c2696847d00000000010000000001025eec900f6697eb8daa60a9fb8f753e0afa4f41a096409d6218943862430cf4002800000000ffffffffc86aee7ad75cadc8d8fa4b65b2bf645d76be2347ee935e73231f959100791d543000000000ffffffff02d01213000000000017a914874d11399275a5d7ba8976162535545028c599e187db63000000000000160014ed24f578a5ffb0a13a5509e1cde08c863e6ff3420247304402202ac4da13b9bac56593d5e914a8307e6e387411e7218fced7e3ccfc1f230fcf3102201f99298d2b70505bc8a49ba2d360d8b833232d349c72f40c21ad24d694d1f2590121032b86e97c48a8b32374c2189a0734198e142e6cb0da4f3c2353af1037dcba396502483045022100884b9b1c09431cbd008fb5df2b7dbfacf99a332ed000840d7b62ca32bc5f4f940220350d3f4d2c2c1c25a3508169a9fc9b4591316e3476b00d2fe3b7839a1d2888b20121026ff4a8f91c3086ef0beb781bacf60de6c9b86a22c6b347045ed395c01d2b4c7a00000000020000000001020f66d64f1097525503b9277282459e7adaac251356e887440193a4f40dad12490e00000000ffffffffe6c70fb3d44e23e428194b2eb1e2445a813a8dd3a8d2c867475d4206056d2af83300000000ffffffff02281702000000000017a914bb3ccf35a3ae40c52e441a77f2507201c34c1dd787a4110000000000001600149f0eab32624b10551a9d36ac62d852efc159817f024830450221008f65c949cd6b13cf8f6be8d9a449682f191edf703ae87f8c4be39987587e05730220285e03973e8262c3253c496175845fd750775d6afa9dd16272a1fff891b7ba4f0121033e810f0fdc6315b4d7ff19c2bccc91565f7ce84770cf13c3c2a3215ba8ac4f8302483045022100bc2375126d9dc65f7a9fe789a65f7f91672650ca7a572e99618ecfa6c6d00961022024a77f1080cd73257bb427eddffec9801d728392d7bccad81a9c16d6f8b80c460121033e810f0fdc6315b4d7ff19c2bccc91565f7ce84770cf13c3c2a3215ba8ac4f830000000002000000000102d4803189558941ccde0c063507d2b16d2d4b40666801015f6b20419e0ef933be0900000000ffffffffc1644187c9c08f350d8a4f939a50394f9e5c8cb62beee7002c202c42c9bbafe62b00000000ffffffff02293801000000000017a914c80f15c368b01579cf65491ee8586aac61edb40687a1480000000000001600141d5d0f0fee39b0a21716ba536cafcda12becd6e00248304502210096f022a568e6f23692139b245168d9643f520e02a7bc2f28e129cc3c7a1ce58302205425a9c67d2408e062adddaec995302d7f6cb549dd1c9af4723f59a2f7a1536401210222536414df97862ff2b6c4a98d66c0e7c84fecf0c54360dba35e5607a49c12bd024830450221009b2a9a4ab87884b09a49fc425343b864ce5b7391c8a53ab973af08f585ee146d02200b55e416708b09e7063644b0f8616bb9b9f793aba0e779e4448ec4b45857492a01210222536414df97862ff2b6c4a98d66c0e7c84fecf0c54360dba35e5607a49c12bd00000000010000000001023b745b1a47578cbde33050aae62f44101ce899ec8d514626e95fa177b8bb162c3900000000000000002e9537534313d6f2e205cd7e982822a2bfe8dae7d5ef91cf02c0bcfd4a05a2a81400000000000000000280f0fa020000000017a9143e6c9eaa4ccb9c9f1a959566984a83b8c989083c87daa89c01000000001600145672555a58d5c05a9213919bb30997bea1aa8a0b0247304402201290878d64d8c6eea4c9bebb89f7a6247ff751a4672018aeefc37d9e0c82936c0220672e1919ff83900b6e2274e8b552020361d9d9e9836d57590bc0d1aa968c3b1d012102592d3028714785314ec84a8a64854a1cccdc48c42a67704af37b9bee48a048a502483045022100ec24d20d1b85cdc5ca8358e715f77fde56fccc405d06632b543c29ec71ea940502200ad500c7bfcfc6be53cff6c2c04e27c94e65ab489a04cacc41be68282907337f012102592d3028714785314ec84a8a64854a1cccdc48c42a67704af37b9bee48a048a5000000000200000000010273292f2a2284c621693e9f8131e42c874b2bc493408860ccb2900b6a6de535f50100000000ffffffff2c1ad7f252739bee2568b0f2b0b5ce66c68742d7c39b69ed176b3f9a3b0fe08d0100000000ffffffff020f6843000000000017a9143108f597cc4491be2e0b2bb02a7b1b52af05121e871d1e2b0000000000160014af2e2b4aee628f313c8b3cf94e16e1e77975c18c02483045022100e9c0a883fc10929b1a9639dd31d281b1b93b0b41684ec6dcb92881d432fe7c35022063bbeacbda126623d392b4a3d789ac266b4c007d580cc1eafb8ad0467febca3a012103f569c052df97653dbddf3632879bc1374ebd745497d2050889d1750d7f0a790b02473044022033fd903e26dac69ad51a770e70ff04dc23d98344ad382548b36c468112863b0002202c4153f1a41ba67ad9d6bbac6c726a1cab0d2c443569c610cd795e37903aee510121034be25e8038d712434d8c2ce2dea07f90fe2426d705e31fa7e7ae486833e5367c0000000002000000000102313b2106a4e5af4987b3905a0426952409e831d9305444596c059c6446f0a9a20300000000ffffffffe2f0f1c1f341f1459afba9076efe8de94e3f04e4637e0da3512e2ae3b4cbe2240100000000ffffffff02ded91400000000001976a914ee213968071430af94f94716822eb98c8954d6d888ac76700000000000001600147072fdacbbaa0b4bb684397846b3c2a27b44f3b902483045022100e7db45508543f575a0a26c7a7c0f5e658f6a2726028130f68faa3ba626660c0202205e6a5c204011382b1b3353167bad00294011fa5abe2e9c331fbb32349011dbb40121022b0132337c47fd5f023473ef4648292c90c0374196e7176590fbbd109d6af7810247304402200d8cea18405ff679c30e65e613abe82f84f3df41cee6902e9bc2f2760fb9adbd0220120132eceffa30622b7e0140c6749e63d4621725d77987cededbcc7047c8d999012103049dcd223ca305708f1b6f6ba83e34e5de67d3f7fe5180d6dde988e36d1c616f00000000020000000001025e5f71052043b32abb0d5e846a0ccb859aa9298172155cccfaaa197cd3b346150100000000ffffffff63fbf8a5c3bf529b23846cee81f60758d4e3d70bb56b6b662644fb5f42434fd61500000000ffffffff020d8b2100000000001976a914fc9d1cdd6f45196ba22dc026cc5860a70cfb3e3788ac0bcf100000000000160014606500158f597e2f7e1825db550cfe2a0626259702483045022100afcf5461dfec5f307709e47b72e31d00c90f65534c9c47ff3f5b5f2fcfa066ff022071ef6a3789adde22f1d64c0a6d6dc3ca6b993d6d9910bdd94258cc7d6372ef1b0121036042153b7eca5927673a37fdb9058df20ce0d90f4e823e75d215633e5e0c9a7502473044022022a6e931c2bc3e2c3200b5ab812d82864328505558ab3c92e736eb891669819002204d7b62bbf9583be1361787d10e5888f932e873b407976d8879e429c07cdbb7aa0121028c2a2a47751055e9cb868b416b902444c57bae587aaf4450d95efd9cbafde8150000000002000000000102a3ccfde30843adbf582314e5c513d4331b4ee666a076f4f7e64bb554bde1ba3c1e00000000ffffffffb76479970ab84d7e6230588d665cf3b61dcaecb2828291399a52968a41d9eeed1200000000ffffffff02bfd71400000000001976a91446c1f69817227b388b9b30fed8c2abd317fe752988ac41140000000000001600142f8d04174f4e7c864d2796d5a3fc1772d6fd191602483045022100da994e2920bb2544cc4957c666e7a3a8de4d5f63b036a11ce1af5c4847982b5e02206a603703a4081b12d8dda2ca13991f50e4caa6c9792735cf83b886bdbf2589da012103bda5c002821a0e746a3bf3d74026a8c936317a98851852c820ed2efe90fdb9bb0247304402202bd9c5a4da2f7fbe46ec1bf18df85de64c78358dc5fdcf5daa592296345e8d6b022036ae87f47594679807ea2ddccef71a2f79b0a9c34a7bed7b0d199af467270e88012103c2743678b5bc2438cdc2292ed59f4a75e14aa63588be11c69ea4aa1cfa959fcb0000000002000000000102c32121cb8ad6e62ab8afc88700d3972a38a4b1033a1962af8d560413c158e2930100000000ffffffff6e01f2b81a7050d3e1423bcbbeec303418a2ea29b48184881d481a5db4ff13c80100000000ffffffff02beeb5200000000001976a91406e61a4f8601eeabd329deb2834ec9054fe5271588ac3ee509000000000016001401a5fc74518e69b4b399e40f1d0e085689bb002a02483045022100c502757c7b9a2dda228c92b550660080716083f1239fae7a6b74c6ebd9d446a602207d5e0615f47eae0d6ab91ffdda423c80db00f143868a47b50da4d4187776cb53012103c5147d8a840ac4b7defa4cf2cb1668df4411fc16016b1818b885dd1223eea4a102483045022100a2a9b2209a1b66a55e09f83157dcaf4f36c7537df1e142d3119a409397ca57b7022047828a10dc2831c9a606259a4d1b01691e9b564979fffc15cae348ce77e518c1012102ab83d5a67b08f8f784dee1190c059269b4c2c4c680c3971f9bca05334a6f105c0000000002000000000101805c5c5b55f40c27ef292b137d086958a25f958238171dfcf82c8294acdb32603b00000017160014a967cd389050a4836000860f387d5cd2e2577de9fdffffff018a1701000000000017a914318bbb0f7b28684c75da3b631a42c45cca22c1c78702483045022100967cc1d4c2f8c933ecef5b348454d87ae4b528050f8c686f13ef3db1beac53a5022022174ddbbf563a780f6468962b4c8489d51d2bfe710e3a17028cf58f668f600b012102c8d352f04f8969a0f0df4aea66f5775f8cc4d80ff25402a2432b9b02e732018e0000000001000000000101ecc244685f02303b8ea966080488fc18c95831fc96374e28f26c47d8afaa6a640200000000ffffffff454ed700000000000017a9149bb3cb05f9a493d05f14d6f49e861a91070d9c5387bc8faf230000000016001475aa5f410c9d7aa2348af3e06cd19350a92c4896c7b800000000000017a91458b903beddf7d13bf1b34c3a35e57bd61cc3cfb787695d03000000000017a9143534ddb8c3feedae8dd8bbfb133431219d58dfbe87e49401000000000017a914304c47c2e72cb8d6544caa68bc5bffd13b1690f48790b70000000000001976a91444019ecd39f9ef2f2fe78908cdadd692c298d67188accd1104000000000017a91455921c15cf3a7f92c22f12fbaf7a57f1359ef4b88714c600000000000017a9144757dc372b151c7753cf03c4370e5299d435f28f8702a000000000000017a914254441605b44775e8885a028c204a3944ff07ec08713ef0000000000001976a914f1e7274a519ada212d07b963618007a9be53723088aca6c500000000000017a91413245f7464147d9fa65ff9faba52a25891b55356875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7660df0300000000001976a914198602ec05a707b71d9fb406803f15a318a888a888ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd767b410f00000000001976a91466a359c82e9be93aec71eec5782b4ccd472cd3bb88ac36730000000000001976a9144a2a3d0f2e927ad42a389b630dd5235c9627ab3788ac9d950500000000001976a9142e2384b10245f3eb74ae93c9b9f02f052de09ea888ac243f8800000000001976a914f286afbf9bef4588325ae8fc7429ff29bb74cb2c88ac4b590000000000001976a91495b3b66224ae77ba7d9dbd0211d23c8555f2284e88ac17db0600000000001976a914b23764877a32a8bebb9feba5706c5aa87a632b7a88accbc800000000000017a91466e0b5f61518f6ac09d0bf109c6f79c4d8678d9f871ad70c000000000017a91457c360359f84c41dc3208dd5a285b8cf2590443687f7f84302000000001600142e4696cb4efd9af304eaa76d0ec04ae6268c8e35226006000000000017a91425c0338e8c3ff9cce70aa6886a1ba520f072b59c87476f0600000000001976a914b4eced7f0bb93d64cf86f5660bae35d12e3b71f888ac907e1e000000000017a9146b1583f2e2ac28f36c41d5499ffe2722219b5f5d877f9f0200000000001976a9144dfff70d7e1fe6deafc395b0c4df200e1636d4f888ac6bb700000000000017a914530f1cad5012571bba640fcf856252aac2d3d442879bae01000000000017a9142d77cf5c3ef3735f68765b5ea6ea96d7348c0b5287c5040200000000001976a914712161639d187d1549bc22865edf1c21fc6c5fcf88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76e7300300000000001976a91421a0d23570ad006dcaf678c181f46e3bb24bb12488acc89b130000000000160014bd8d477690848320417415a5e776338d9c6df2618f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7656950d00000000001600145436a9ab04cbc8e30f6c2600429eb07152eee13dd95a0200000000001976a91422e90297995dcd8f4a4d679e04501962e72d35d088acaac900000000000017a914cb4e207df3a5d43aec90f1be4a14813472ba7d4087dcff000000000000160014de0678e3282540a049b8d430226aa5c6841a3b4a303f09000000000017a914de7a6a2498d607ccf45f516f2751791e7c92fe318713c507000000000017a9140b9717a3e0d835c197d284261ef952210db2e4af872b8602000000000017a9145715638ea74db96ef54a4f96084de4245987e739877b4d0c00000000001600147cb4c11ed27d8ee70508d0322b98979168d6f6503f391800000000001976a914724701a17895e2283fd775ee6ef4aa3d8a0be31e88ac26ac00000000000017a9141657e0d9a4fd44d209e35a66fa2fe7787bf0af3c8790d00300000000001976a9146fc6844ec42f1d7620b2b056d36a798e5f8d69a888ac674808000000000017a91403e99b78f6135d5b8bd1916ac74df7d9e7515d92875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76785d02000000000017a9140125a6f94cdf462d892a79beff157ae9e4b2b3398773a70100000000001976a914f5388f0878bddc3abc8afafb2764648dda00db5988acf01901000000000017a9145a584b44a911673d54fa0dfd15ba0d048e36e2f787f07603000000000017a914dcd36c19d5944a7dc9f7fcfab354cdc719df9f1787a8600300000000001976a9144e7a7c528f00617621e20e974bba2b08aa59ca1288acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765d0a1b00000000001976a91461f64577254853065179f65a8a4404323015944588ac98b101000000000017a9145f5615d0349ec486703109a4f02a861d91ff558d87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f88900000000000017a914b8f0f07b0869a59e593ca0e33b815b139ecbe88087f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7653670000000000001600146de8af29013b0c7a38904d09ae7b54a834c7322d8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ed4a020000000000160014102e98675fd45599596b87db04ebb234838803d40a200400000000001976a9141119246c8cfb0dd8b781993d603fa08dc44e9e1588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7618dc04000000000017a914bbda74567a21c53c457ed0a4e3cb73f44e47a69d87f6070600000000001976a914799993f5a9b6e804dc32d4e816fa60d86bea11fa88acb93f0700000000001976a91425f0a98f7404cfbb2f8afaa01659009e055fa9d688ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7648ac00000000000017a91420041daf10880026528f4a995b79161c87a7ecef870247304402202380fa616d98c7ef8ea7004a2bcea6e77c22ea72e04b8ab32ae1559d499a586a022030de1cd11e883ac89124e7ce6178622982043f9610c735ab11d13887d05e630f0121037360c196fe193448b8bdcb3fadf69a778c0f93b2d21abf7edd7f900a8f4dc64900000000020000000001013e2bc64bdb8a8349654cb985379e250de371ebfee6b6c984edb2ca4544398cc02000000000ffffffff02095c0300000000001976a9144f123f9b07696ead1de43c977f261cc5f9fc552b88acd13b100000000000160014452b34c6a171dcfe9d8a4b9792a5d8826a2bf3920247304402200bdcc843cd22e79c8d752013ebf98ec93a673b5acdc3883469dafa66eb13bfbc022004c7c5a6f33bab1a33a89c5e479863e85dab2ae8d3d360fb2e7b11b878f00bb001210205e1232d932f0731ff694c9b9a04202b6de9c4e94ed54f16bc48f1b0161c759f0000000002000000000101fbd15583764b1905ba7021041ffa3915fe3078d7f5fc5b1a1739c111c626941b0100000000ffffffff026ba50100000000001976a9147ec99c07776943a5d45a53f142a14a7b3297f61088ac78920e0000000000160014452b34c6a171dcfe9d8a4b9792a5d8826a2bf39202483045022100e37d06bc359915de8cffb9bc7ba473a7a281d6d887c12bfb3cacce4a02f5f87102201966ef02d21cd3776a2844cb6d78d2cd7980a99f56a37a39ae62f5297667c03501210343464bd66e3207502c6c570faa2dba48fb479bf85c594284bfe71594a70472950000000001000000000101a1fa1df01de35bb26fc99806d6b491c8ad584e691aab80969802a0953bd6d94501000000171600144de8ee2c6154fca1278b0e49c62de6a3b5a057680000000002a00f0000000000001600140e02632fa025c5cb702ebc26abbe467ab61578dd360a29000000000017a914e8dd167f60e0722362c4242702dfd4307e77bf108702483045022100a1ad5a5351e1cb33e51c2bd8de6aaecb645795ddda2b7b3308475b5ecc3a250a02204e313351d01f83595323eddfaf7cea3b73690644dfc35463e782ca614f753f42012103c13890047fe12c5f2637fdd0e05f55414087b16030675ab18993477cf8fe06050000000001000000000101a762c5f65cc708d2d970b56383dd18094c7caaa2da597a61a778b0cb1b2922932700000017160014623502bcb75e827f9e9a30f4f012d778bd92adf5fdffffff02e58701000000000017a914b09bc1742709a0e486821ab6b3c4fd932a959c4087f391010000000000160014f2854b809810d00d2e3d3e46f1d99cf36302528a02473044022077274f77cff46d369e2b89d45b250190c462172f245fb1add7615720fe3d8b7a02206f53f01d0368455095a51d9447c62b007c375af85fe76940da22d7135fd4f9fa01210296ec9d121b0da05c594f7435927aa7198774abac49fb1d4c492f033cb20f299647a00a00020000000145fd6580746c3fb0c3faf7baedb13f842675c0cb54549e1e5869b3c908d8c1260e0000006a47304402202891a228804c704977d8ae11ddff4d99898e954544858a4e4dd15e397845935502206ff21a027ae299fd5458030f3edb45469d75741f10704b032390c67202320a87012103349082d128722e573c6e25d11fa9fe0e61c2e66b3933f557748b51d7b9a79ed0ffffffff02878301000000000017a914900bad31f7d487824407f393852c65e55103999387940d000000000000160014e0a2b7ded080b86c2d97e1db88c5b5f73e652719000000000100000000010189bc0b4278f7ad18a409f319b9e78448c9fc5ccf7deb89fa7a8b75a028e16c690100000000ffffffff0116931200000000001600145b2bd4729e243e67f1d231ae8a62fe758df7a4480248304502210093caa3cb7ec4619997c89b56f41284f9cb85ee3937918aefd4a9815249727afd0220147269b1bfdc9d0666b16bf7d064960bed8cc6321e5e91c858f5b31b6a98146301210200b93bc8afa62352bf49f59a75a1b8c34a458b8bcfdd52559da10786f0299c0600000000010000000001013fba2c7bd5f8121f1db5fbf0492cdfa395d6fceecaea71f32bf549548c020a0c01000000171600148d3375f6644a9dbbbec275907588261a6ae7279b0000000002405489000000000016001497d7842fc57eb5a3cf2aade4ae1704ff067c14b6be29d3040000000017a9141121f721881d3a7c307cf21e52583bc9ae219559870247304402201dcd8ee98337ef99671ac46c72490de4c326efefe2fea0480c6f2e0a3ac3dd330220303dd2d45a0da345007ce2ee14b942016f8bdcf94f25cdc8c4fbcf773a91884101210326c76df02e3c0cfeb7cb80e0b97016415df69cdea72fc6bf8a5e718a9a517fab00000000010000000001018e5ccccb405c95d190558a401a859824e3158ea377a1deac8f6f72c1052ecdd379000000000000000001eae10700000000001600141afbe9df2a22400f0496ea630db0b2d2ff410cbf0247304402200a0ff61a6a5f111360bd42526bc915373ed5b059fcf71a3c079d930f093f6a3702200d785b51d8424d92e7f7762be6e5e257b1d368232201b377dab71914a8d16d99012103d272d7363f558ffa63d8a47dfb1218b29daa8da729eddbdeeb5d5a72d4a4ac470000000001000000000103ca389f62dc568d5f39ccd4a2cb52b903d5779c8dc0400a81c22d0cfdd0fda31b01000000000000000008ed4ab01d01ca423da4453bd65250120cadab5cf9ba7f73e290834dfca1f525090000000000000000f11395a8ec3efe0d87e28d06fa6d427b625772903fe789f7e1c0e43fb68f261d07000000000000000002509731000000000017a9141fbcc0441bce8e55cb352f8892d5f1ed4ff650e387570e080000000000160014f7bbb8f5512e1b3559c04f4554fd096020e570c50247304402205b8575d8edfbefe354d2f72bda23f04418fee2daa724748888faee528f92c4c3022010d923602806603eadcf7cc6b16a27d3bd9654bd006f060a8985adc3f06061e5012103ee17db14a95c5d6c93ebb5514ed9a5a37ddbb4afc0a8ac2ea36ac539bd47590e0247304402201c327557930a8f54bee02bb2e035bf58f2a08eed7479050dbcacf2aebf8e41dd022029366b85fcf80ea7b1ab5a84b076a7d683880e4a137f83881fb801aea60262f4012102d006d7fa7dcefbdc04bedb365fe091cbf071b503547384a1598e65aed46681230248304502210084fb524ad129a818c8eca870491f2632214c6df9a40d035ff489464e9be2615b02205cc4c2d5712df81f776b1a13c90ec64685a84fd2a767cce302ebc9b64f1fdd66012103367b8cf3a01a1f65949c529c952cf369941653e7653109dea3057117b7fec77c00000000020000000180e8660b2c76d4961fd803354c54056200048661561d8334c97c9fa03d326ff2010000006a473044022036b2444e516db97e46ca19aafe4361cfe8631de36a9123c5a7c1ea201666f779022044446e9a6d270c03e09930f95c029eef57d5b22e7803668d3fe97e87411df0fc01210238fa362c33d9089d93e48cfb40e904652012436a94d460d0fef0c919603b509fffffffff0231ac0000000000001976a914c6425e245f875eef38a5d951667b138b0bbcbffe88ac250d020000000000160014b6e68731413df42337b7c71ed37262340f42b3ab0000000002000000000104bc1b9f058998c0a6cdeb55ede9264a8bc662a364f9bee1d74b61b9ca6bfb405f0000000017160014dfa799847c881662e45725ed004f816f3b1a3342ffffffffccfbc2b48f4eabaaf5627aeefe0c49c049c6a41bbfe4aa71c6fc11278df590530700000017160014bd45e0800d03843c49fc0005fd55b9b5eda4aeafffffffffa494cabd1d8101ec98c315b602273d8276041aee11d7cabdae5914e600f14bbc00000000171600147c09e5546f4c67568d0a55d40d99bf5d45bcf00bffffffff9d2418001948a2a0b7f7fcb44a3cc73a031616ce1d2dc3b7dd4543d1c33581540600000017160014b1fb6aa050bbd37cbbe8d18e5c56c580f7704036ffffffff0420291b000000000017a9141cf4b8a0e953ced4f15d5cd7b83db10ff75133da87281103000000000017a9145d8a1024ebd8258dba66128add6426e4b22afeaf8740420f000000000017a914ad6b0ee010fbb4f1701dfb56417c3751490c93278788ac0f000000000017a914caf61d6ea8ecc0e7abaa5fab3cccd67cf805a10f870247304402203ccb5ced02f1e308cd7609f990cdb29c6d16e4464224fb118fb5e97ec464e95b0220305ac91bd95331ed0fe3888b1985dcfc20ec2a880abe89edb650d14738ac9094012103b50d59a3b6158add24b9ecbdf70144ab8f4ee95b04fb9129d0e73b5a6d94f440024730440220563880eeed85f3f2b2e3e89ec006a4cbc95f57cc227216b4e3cf25f8e94faee3022062f53a20116f5158e436251c33253838377bce96642b3ce0ce52de2696a9231901210356e27c5f7e3c11698884d760d2b88d614949b29913d27026ecfaee5b08a89caa024730440220083d2486a84ff0d1578046d6252d92fbe45f6dd32c9c88e11cdf484948ba7f850220691bdbf22014742cb3b07727042084b96f17377b99840f3cae055f4a68e625d0012103482a66780f923bb277442b56258f3de7ba146a5dedd7dd11c40cfe93959b312802473044022002d31a99b5d8cd083d75585faef958f2a664077961ffaab9945df5939562cc7202200368208fd8ba348ee827f2484abb2adca1cd6a16930e4bdc2eb8769d46a0515a012102c7890869c150f5fecb2dd2693810db0813d9f3b8111b953a06f11c5c1868ef90000000000200000000010364c7cca6ca4be682e2686a2d6802055ac593cb88ba9b6201e3267a90104a139a0000000000ffffffff768d188dbc33f0df7bd9fcf22c1924859f8993cc548707e5d39a64902ed61d530100000000ffffffff5199dfd257d8102e7ae4f46f2c7ccdd074ab57d92579a2b5dfb72aa2c6b3b0f90d00000000ffffffff02858e1700000000001976a914c280f014f554fd9a9498afba49e3eb620df4f68388ac2f1000000000000016001482c7daadeedadb87f4af861881831471007cd68902483045022100ddaaac58588fe2194c037c5e9daa744f7967a39c6f54044f9777c46e3ea0cce10220331515733fbe5fd916febab877f295097b9af9a4ebca7c6adea772da50dfbfaf0121035af791af49526e3380d40f781bf4b8de53315db2a520e49bf3a558665b6bd10e024830450221008a3f78fefbff0cf1c9b72b3f0e6098037f9108c282decdf3c72482791827e14702205393c485d43d1a0a9d7f70ea4d90c622ff2a8120567656126b81219bb29d2f55012102af2346fcadc2aa64af0fb382cf6dfbf8bdca261ba567469b7c8c6ccd0ab9495702473044022019537120d308471641c070df5bc501ddeb0ff0820af116fb468d5762e30cffd402201476c8667ff57ab7ef513633d437ae24a75607e1adfda7f2bd795c2460dcae1601210282a64aa14d57fd5fbf5a3a199ead1341840e0a264a0da05b98f607a984ed49d900000000010000000001010da308e0be7c14e649ea8ad08a76494b604498a09f91b98dd5931bc39b532b7c010000001716001469ee38a971385a14bff801d24e5f6327cea5c5f3fdffffff02a2c801000000000017a914c30a3020d931acd5e84809494ff6e537e2be47068720a10700000000001976a91476530282b14b33b36ebb33bae304b9e031a8d95088ac0247304402200e6b3255d3741ff053f9a3545f5e320eccdb12a6daf5c80b02511f376cdd466e022053f4e89938d1d297a20e63114614588a50e9c40528be2edf68381b6e3eca90f7012103ce67f46bacbbcb94c44088e3072c66c968bd24dc74230e1e63f2cd17879ccbde48a00a0001000000000101c53617e6f5d808a532e45167d5fc50aa56042f6421586292bbae3d95e183d60f010000001716001425922e53bd63022a8def8496569739b04cb4c5a3ffffffff02233f29000000000017a9146521aecf385fab269f525bc1e0cd94fdee322cdf871e613200000000001976a9144913d5c1f34f8316eb04f2de7173d8cc2f55375c88ac02483045022100d6db436859b9f31cf8925ccb0b61332bce0b824e128bffaee1df59f9dfff089102205a4db9210102938b290e6402eef593a664ba99e3b832bc08dcf21830e3fd95e0012103bef5e9084db9af70d3de5a9447866f96db616ac47b3a6e5b4884cc9d1797ed86000000000200000000010105e45fbac3288da1b61538b7c5d0003c681aa3a86b03d52778ea6e9e560cdda80100000000ffffffff02e1904600000000001976a914872832d8665907d47bc02b04a630cfa85f30c31188aca358b201000000001600145df5d88cb04ad348ffdc2d0b28309b06954f0bd302473044022038c6f9fd8ce46f9147d2be69075b81ea8547d49dc7fec9aabf980d183ae6b27f02200cff82aee13742763312f39fa8c5f577d42f698c9a4e6c41e087e1418dde81a6012102cb79bfd8c3e84ed0e80fd9d5bc4c03007ce8757f82c1b92ffb84c10c115db5a70000000002000000000101855e9bd3587fef93d5802550b7eb942878d3236a360c66db98e783cd565587b70100000000ffffffff02e80836000000000016001467c7c9c13b7f13c4226a55479624e30e638fbeb2744e7c01000000001600147c4e6b813149cff8fae39802b87dd92876d38a8c0248304502210096e3bce1cc027d763eda43e429391351f6518d18c324e5331c5aee8b169d31b302200b35db7d42b19a7cecfc20efb7014a7bd69c7d0d9507e38c2d6046163f1e1420012102f3c5572636c340326c47458bbc746dd7ed339a791ec3fb2e7c26534a35ce039500000000020000000001018680555dcb51ed88b9868d3c374af1390880515a071704f7f46cdd74aafdad480100000000ffffffff02034a0d00000000001976a91409ab66d750233f9ac303fcdf385a8a68565ab11088ac21036f01000000001600148affe05c944b175b7e4aa11edca476f5fc22d38e0247304402202f40ca01dcf57dadee12a39d1db74df8d9c0380b9bf2316c5e13d160a197fcb802204973f7a9e0ceac0c07ee20ce6711e3c77daf31092fe6bd50fc48721bbb7799c90121023968278884980938429ea2f491c9953b60ab83c24bc376f3958c9e4a8101283a000000000200000000010136bd02417ed2c4069356a8877971d469477ac32ccc6e2010c9110d74b2b743fe0100000000ffffffff02f45c0f00000000001600144ee06367a9c9097869c495dd11ebf8d64318ceabe6a45f0100000000160014e9921102aa08ec2d03006cfb8565285bd119f42e02483045022100a10b3db72e3bc015e8bfdbe06fbdb76ce1d4c9bacadbe9a6258b20e3452f216e02201bd3a6a59d81fe530f40016455a952c60a0833e7b08e69c31c9b9a5e1f00c6eb01210252352017fa80f6f8beae00b2d52b4da096d18a83ee2e7b191c1c438e6ffd1b4b0000000002000000000101be82221fbe3484d9387f65863e25bbb5d6f00e7d1e29f2ab1fe6e405108c99480100000000ffffffff02bc5f2200000000001976a9140e484bf5cda339b81be7552d135ae8bf30ebe55788ac6b433d010000000016001485dd4ef72034834b4e5a093818edf157d60edb500247304402201cc310de862b3544a0affd1dc476f3df5b8e0cbe6a84e377edbfa186943279c902206317dede8fe406621d45d29c366a8635e03a7097dd90634a5ef1803e7a96ea02012102f090ceba6280ed8aed2f6db8bd41f9bc1c5ff57ef0e98e4383330ace41725ed7000000000200000001bdec46b3f3f43e43c962cf9cdec835711adcfc7c7dc1e9ec902d9d37b227fde4000000006a473044022063a8be6fd3aeb2ddf429041d76154df4777c8a0ddbf7cbe7c5bbbeac1c98a00b0220354b4782a9b1fcfb0fbe09431c0545af0f3a53fd103a5165c358f8f8a43ea2a30121032b6f9cb3aa1a4e63f0aed08eb489fdc2deba84a0210032a753704d41b179d822ffffffff02a99b00000000000017a9148a9e29a0925b81a987773800c693ba4a847c62ab8733b8210000000000160014e983a7e82a2d7d2c03e63cbce1b1092baa0eb4630000000002000000000101ee9a0cd87a98d45155191fa61725d6ad13f07196aeb6e0e062669fdbf6a2fdfd0100000000ffffffff02b38e00000000000017a914de2c92782e43b5a3896bb3b3bc9d1bfc8bd6f55087a4222100000000001600146b037729d6cf1a812e57d38b9d04f92715123ff7024830450221009b520820e9f7f73e195dbb7c8c11c6d2710d23df1b698a82087034f7e60e4d35022054e0c36aa3b720f8d264a8d2351d33ebf7cb86a1be9b87a775011196f5900c9c0121039d63fcdd899a762ecec2f3ec908b77dfcd12087d8d20b207852e69e6cd858a7700000000020000000001049bb5fedcde870fd7469fbd205728055a1d7c913d6d62c782dd34d325bdfedb820800000000ffffffffd4d08b879d682f81f9bc72916a0162d5a9572d918c4761626a6a8a0608bc676d0100000000ffffffff9bb5fedcde870fd7469fbd205728055a1d7c913d6d62c782dd34d325bdfedb820200000000ffffffff9bb5fedcde870fd7469fbd205728055a1d7c913d6d62c782dd34d325bdfedb820900000000ffffffff0248ed08000000000017a91456c90dad4b4e38ff3fda3b572d5bbb525add58e187b3540000000000001600145074817b8a203bd9009e6810a44b250153fb990402483045022100c31be95db8b7fbc19cf4bde012c18fec12064c8eb92475564bd09221bdd0a1f202207625f7e33a28a4b9d44981485372cb2c5564313ce7155beecdf4d10e22b1751001210318f7e6d0f377b2f4799aefe8b2e6ffb27026f64db5c557dd7093127b738467920247304402200b78f948c6670d8e48e024ac05b606c6b3bae8e6d2d7fbb9c65242bb3dfbda1702206ea55b41beab29bd4ceb827c014b34f7050d118397f936b4bc80669ff23f742b0121036b005dc713bed2b76ebd3f2b35d4bcbe6d0711da2c12b07c4be89014f06298a602483045022100c464f4a6d18c3f835962709b970e419e8e42ce2bb7c4362b0146ceb14bbd18a102205bc9d10cee36b404db6d6665b80f45114ab2f683a7b159a4b97da3c65ce81c3901210318f7e6d0f377b2f4799aefe8b2e6ffb27026f64db5c557dd7093127b7384679202483045022100906e3c9e96ec7d0da9926b49e66f5ec5bff7b2542ed8d181d1f50b187a1f077c0220458c2da99f108f84d8ae46efee79939cd1127608070be980bc232ed5ebcf5c5801210318f7e6d0f377b2f4799aefe8b2e6ffb27026f64db5c557dd7093127b738467920000000002000000000101553c2b2249b18e2924b38b407c55d1201372dc04fe5f276c19a163aeddfe9dff0000000023220020aa2e2563515395f6941b0391d4a9f495d182b3b76dea844f4f82c547d3abe466fdffffff014dae09000000000017a9144710ed444e6f45ece1c0025616aca05efbce00bf8703473044022010fa5146914531dbe7c786d3a998b22911706e531514ddcdc2aad675d0570a1e0220051cb2088a9fa2a908e35b8546de2643beb3123d365b21063655f1330f5938f4014730440220670e87fafeb70ae80ba449d35e1eadc09257923a367e2b0fc6c7d9346132ea3002206d219cac05f5b183c7a1515b039efb91fd20ba5c70e077e89903eb5f1d16754d014e210358803ffe1e4b0bfe83878823a80f9fa9882af4e0dd0c3d75c1c1776b87268579ad210264aa69de27c43b875a389cc0355f1676f6948ce5ea8e46b1ac35b13ef79bf64dac73640380ca00b26847a00a000200000001db52843bd8d4e8aa14ebf3ca67c0a6122d4de1c1b0fa244a3fba725981c580e7010000006a473044022073aec13ae31050562c73d6ab85ab880d7f4e9cfc9b71e4a58246869cd736a85e02205ce4820c83d3a8def73213c5dbe51d122fcbf8502cf547c900e25c18d2555525012103327f4e24a3c6157706a3855e84885de3a751eabf27fc36db4949b6614adcc288ffffffff02ce9005000000000016001427e06d4f9612c15de818e90097dfe45d3acb969cdd1c876b020000001976a9140a708acc6882bcb59b393e89909340c50376610988ac000000000200000001dc6450535e60a09a90211a41fb8eedfb23b56e1fedca2f5b05616a07db721bac010000006a4730440220203b14db75326c4f2e4cfcc21af440ea871b5775dbf8d81c4be2a2bd095c9aae0220242959c38bd51d8a9ff356bff921d8fa950657d44a1bb927ef875df28277a480012102499f2c0c26542603fc687de8d082db26da391761536c81fb88f402535895b245ffffffff02288406000000000017a91476826e0f3eff6b9b100b687a919af1af4471a8ef87df93806b020000001976a9147b3afaee7811c732aa8da591f884ecbd254cc8fd88ac000000000200000001a7c7459e370e809b41945fa8063c772714cd3ec85248f53179d37d7cf0628a40010000006a47304402205e8f7626fe7a9649b2dd6704eb8ba593563ce02472495f3ca30380b181dc77130220744fc2b3450d8657bf4dce8fb83beacfe8580a6ada6f2afaf3ac8b7dd449f1f1012103a55282308302eb6ebd6614cc731683037eb27a83c06e394deb978fdbd09e804effffffff020d6b630000000000160014a269c9a76d1583bd31bf2cd8679981c7eef06d5fea241d6b020000001976a9149af676c9cb030117b8e4bc2280a4eca2144a464f88ac000000000200000000010127801d4a3c1605741c6d46a2d25252c980c0d8286868e1a734bea459b23564780000000000fdffffff0234d807000000000016001471b75bb9f5d1d8faa5f7a8ebde23cc5d4aefaa99808d5b000000000017a914b6301a5515e929c3f97fb8fb4b82ca0dd35a3df08702473044022004383ea5ae140e4d7e45307c4be6dc922974c75c484929bd777fe221f7787aa60220597a51589aeefaf92bbcdbe2369664f0d44d4064bd987a2f05a5d21d5c65c50d01210369316b75d92b406e5bd0c664c506985f02ef67c0f76167dcc43234327e35122548a00a000100000000010239a01de4cc8df7c2c56c68b65b7f5d8503b777d8ef519cdc7b988698992e295906000000000000000053967df0a1fb141805d74768ee3f1ca5c25cfbde0df5404b87119d3390e4fb8b1a0000000000000000018e685a000000000016001426da2a4f50ec66b05366cbb84a03478c321ec5d80247304402207987d2e78a9d5102023b95c5a17fccd5a6f324751f6643d1572cb1940211a80902200f6d95159fb9b2efda6bfcb1238fd3dd6fdc4b1a0e4922f75a5e0b71d2ed91f30121036f55c7dd6d0920c8d9bc5d702cf22068dc326028d42cb5c7d868812df48867d60247304402205091b0b6d34e8ae73624431a3536f887ffef3f8f3b64a2e2494bff5ec83ae45b022076fad001d0cbdf753f515cd3a8367eab8ac309f99a54c0715676103ff2b22e0b0121036f55c7dd6d0920c8d9bc5d702cf22068dc326028d42cb5c7d868812df48867d60000000001000000000102057271c71560c95876b1274346a4c86e1c43d9fb773163d2fee4ee010f35ab080000000000ffffffff72e2c344246f1dafe3548114ab5ee9d19d72ba28e579bffc2a83ea42a1ea87f40000000000ffffffff019d790f0000000000160014764994dcaed2c3e660a4039f331d5268f2c1c54f0247304402202d1b5c2e2e20584e62efb7d1c438c78a79ca4f44d5b1c857627fa044251e5a6902201333f28e18fbf47ebcfb0e189aeeb58767d26571b7c0aa98d7f036a8c6b143bb012103c455b248afba69102516d5c64caa49528109f8fca83b664b03aa46883c8a29b402473044022033d5708092e4ba39b14869fac5b64747ec5f4e32ad8ff07e9898722427a36003022065658790fc7ecf3f177011e92195d997fb016080938ca1b56929123fb3c8eb67012103c455b248afba69102516d5c64caa49528109f8fca83b664b03aa46883c8a29b40000000002000000000101ddca0ad54a1dc65a4e48c9607b9b11782f92a3878c6e04c03d84629e81b6a9ba0000000000ffffffff01c7740f00000000001976a914ab1adc011a2b1589b65427c6bc5aee6138889f7688ac0247304402207424cb0fe660ea81302cac77f28e53b1752a9accd262452ec68fb152b4c648f102202411a3bf144e2127c010fb6dba0c80a7a38ae5573aa119ebd24384ac51d72fe1012103c7e71af338aac470ca175a816d0e2c1884894b8ed14a10093916fa69592058f3000000000200000001555a49b085eab85ad7ba1f0b63545d92eebf04c992122824e9f8dae188335527000000006b483045022100efcb01cba7cc62fa734d5eb1809b02761353324ab0283bbde7cb19dd747373b8022056bf85f1da23c6ae0d0df01b7340ee62fc5825381ff0a9ff964611a91bf2b3260121039fb2bcb343f6e4381be35d42b8ab2c4fe715d2d6c10c297c901eafbb7d03183bffffffff02508103000000000017a91455e067e01c8c766401c51dc1a24f991ae0b9e4d7870f364200000000001600149e4e1fbc556d95d67bd9dbd83f97e2e80dfea04a00000000020000000001014675eb86ead8390017ac4d26eec2daa9213d9bca76477b3a94615d8a014474190100000000ffffffff02b77803000000000017a914ef7ac05d22ad9244dc1d5ea24955c7f788ebc9d787f2b93e0000000000160014f7cb105c606cae24d4c279e45d28aa8199f624c902473044022009ec39733ba85523cd8550ae15a67412cf364ba0114d10b051c49b31d1bd57410220677095031b12b0b627daf77d4ad2c293a822679c6b825fb3453019dd29d2ebc7012103e7c05ad61ca1b1d7ee348bdd804bfa35a69596176c9072d70247c45ef5b38559000000000200000000010187120feba42d12e37749ae03e0faa923b945a9b68c91418d8e48aaa42e2682c30100000000ffffffff01fb0b00000000000017a914188124334ed819b96e718acdd52ec7dad8d57fb387024730440220132bdc6da82cce2b853c140f8bf18cd4a5f7811296d9a0446eef731b043bc3d80220535726fa578402d43e39037634da22844c3dd0d2ccd3f9ea888265cac4db160e012103a54e28f4bbe84ca32c6e18773f0569886332e3c847eb13e7f66a50a4d68eabea00000000020000000001013b3e736592275c0b1adee199a00a2d1108f601a13a2aa5ee09bbc856d18fa2e70100000000fdffffff03b2c60200000000001976a9143a04074f3535bb1465ca8eff3f3957b2e67f527f88acef4b0e000000000016001474cd5b9814f6068152deae12313084ea26523d3f756a514b00000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402204069b73e7ed0f8ac6f6e7699255b1df3654977a14b20a0c5e9431f2e899cd2f40220742a00f814d635d80902c17b035d8006d4e3a457fff010ec61567f989045d360012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a47a00a0002000000000101b82272afb2943245014c8a0a7a66c9c5d46bc6c63b145567c54c88ad3149f4810200000000fdffffff02ed2dad00000000001976a91482d8634d5deae9e95b1ff7c3d0044c17b08d552088ac2839a44a00000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402204e0218ab68810a22f0cec56a8ab325eeb1b3bd23e8534990442d96268748d1c302200813982f61354e418df22510b36240951ffc4fe49995d09fe365aa6b2a9d44cb012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a000200000000010112e48156a67f281edc3b5f4190079489fef3dd1d88e0fd74b29c6e10d1d300d10100000000fdffffff02f07904000000000017a9149b12c0362c45357abcd94deffa3b5375bd0e8c6587dcbb9f4a00000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402204588682440582e14e6f26f0f009950d90f3b1b22d7ef1bf2637eff7dce27799702207a9edac04050bd30ccfda896757e7abc24d7a0e925835acbaaee2da14d99ca19012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a000200000000010179eb149eab3ace219928e0cbdb11074d96c17ee7ca9cf1084cc5b63c205e58620100000000fdffffff04c9910200000000001600148e5265c7a1226e5933af44d58a6e2551d0e281cb5960070000000000160014c4a5ff2c505e9bd3af5378ad749aa7a23cc2442c631a4700000000001600148271176a61ab14767e1abb735907d3d6f0afa78395aa4e4a00000000160014b9a8f2a2b75894fd155251072c5866b39f291118024730440220049677c58d84832be967e049ea4a32286b4f35c14b87a7e4c79cb6e8718a1c0902202d380f7ddb4f67fbba2089771eb1af62ee321d31650c2d4cefac438cd7585feb012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a0002000000000101cbf8a220ce450e67950c9058e232b549bf89a9606dd4218d929cf99e0bfff55d0300000000fdffffff02c0e1e400000000001600146c4d909077d63c0077ef10a257123eb8723698e378c5694900000000160014b9a8f2a2b75894fd155251072c5866b39f291118024730440220386e68c586a6c24bb53337deeb15dee11c6c6c5ebb9eadb638611e5ad733b01e02203b1030689415ba6bf6f5f6f49c6ce7c195515b043b440fba74b53d134b511326012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a0002000000000101d008a29a9b075325960badef251c23a1849c3306ee374d290554340a2ac4dc010100000000fdffffff028946010000000000160014bebecdbc69569e2036a9c1c1d27b7d17b9ee67b35b7b684900000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402200199407743a1640632393b19c4cf16862ca5e6856cca4ef59b00c49d748962e802207ad60d9f6b744f7578f290f799707bbf7310e9468f2c493e0ebb04caf23bbdd1012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a49a00a0001000000015b1ce210bc32f2cc64dd50b270fd17f8f212c865a8fc13161d9420176863dcc1160000006b483045022100e373df188a7f7ee381a23aa40a77ba252381434e67269f07ca779b70ad6a80fd022053d7ce3c227d531cb89f91c8b7bf6f213b488cae5e4d473e14fe9837145d96c90121030048ab7a429b263bedb5fabc86ee1e9dca4679ed9f7ba88f7510a403bcdd321fffffffff01463d0400000000001976a91470b73247c630f033b26464caf2462254630cd91588ac00000000020000000001023aaecc12f141ef120bf6f5b40851f228a28f75d5fdcf4547ddff2517d6dfb167010000001716001458875acfa722e89a962b69dfef82d86b7f80dca1fdffffff4af214f05cda01a244891bbb9fbd0d1074c3de7a8e75c0a92808205ab1b2626f00000000171600147fcc75a399b696491d039aa5e056b4a30d4a8b4afdffffff0297f801000000000017a9144326d4b89cb46da346934812f7edbfd636b5e94387453900000000000017a91447cc89d3d29a825d3f6aadb8a8e5978dbac46a6a8702483045022100cd598bbccb75e2287cadef0dbf4a3a7415b7adce55688d84aa4a51eb1c10618402200c9f2962b4ea37fe796068752e61af7daab4e4f5aff9afb427aaaaa815c921440121034f44945acc1613f5ad047b2214bd796545503128f813224002d24aab91840d6a0247304402202de48e76739fcb053cc2f0ff4a9be66cceca7328ed8af6aa0f3bc9df1999a9f1022027ee24766ebefce643c40c5f7885b610c16511f4d5ac3328f7fe178b771bc9e9012102b9bbb5becee2f5341ac1b0f0416c0091dbb15b7b753cc9180b27429920174ecd47a00a0001000000000102418edc68708f80d14c9e6639125068655ebc57b0d82ace63a4b7b30436ab67990100000000ffffffff16bfa6de4bb6f4cd238138f2dc4743fb3e7ddd118d23ed8d84e6b06bbcc9d176000000006b483045022100b0800725a13252ab57bf9c58a25383911f5719c67d82b1c3fbf074b15fc026f30220043fa6e928f46d5fef2df03df6a0abaddb018cae43a3fe0950c57e015ca8558a01210320affaeeeb2bc6c64f60ea761a8931b138dad9666bd92e9a2e59443ea398ca04ffffffff0195f58e3e0000000016001467657efd1288f3b664269bf75eca25b482140940024730440220698fc2e567ae2d83c140aab46be647c52b50570d196f5c58c898877f230c9283022020c1eefc937d2569d99da155ecd8e679d39051d9a187c9744c5d25630f686d6801210320affaeeeb2bc6c64f60ea761a8931b138dad9666bd92e9a2e59443ea398ca0400000000000100000000010108d4fca84c4f3558d4e5151e95070471b3b81911c9cd9c639af9390fd878d46e0000000017160014d04339c0d2142984ec79289a5f50d421808aef64ffffffff4c98af0000000000001976a9145f7536abe0465940c959a7937ae8699a97c8cd0388ac2fe500000000000016001408b447db567362ea1afc2286757d9d95c7ef3b95bbbd0600000000001976a914b1811ca2953f59dc31e8342a407cf279aa3c60e288ac3bfa00000000000017a914e55be161d9af66d6887fc92e8e658b052cd1362a870581000000000000160014b459afae5a91628bdf3c336a3e6e42c2d4ebaa75a8f759000000000017a914671091af88b143d7b5cc39de109a2f6a47713d2287b0cc00000000000017a9142a9595f3052363d478e2042718bcf8c98dd537a287d61336000000000017a914563908ff10250fcccfa9124e6e677dcd0849d98d8728db00000000000017a91409d6d0f891486415a3465913dc27f1e409f09c4c8721af0000000000001976a9145af4cfdc742086648ac45b9b3afef114e375ab5d88ac4a560000000000001976a914549a13c6cf5a1c0a6b1b3f4ccc76132862d061d088acb4a63a00000000001976a914a86a50738bcb0cf1112016bcffb198e6ac1fdac888ac4ebd01000000000017a914fea2e02e0feff598c22a46855a8054c642bb0d6987269b0000000000001976a914ea5125c74fd23730b0adf7036b977d19de3cbe3988ac78ef00000000000017a914bcfdad2f3b18606e03251ca22ff242d1cdc7b3288793da01000000000017a914809e60ce5afafc897000a4be18b25ad37491052f8786dc0400000000001976a91403c95429cefbc9bf445c5d1967843db36761850c88ac579b010000000000160014e38afc86f76c970279800a84d0569fbe7e8a78c2e2679b060000000017a914f0f560bb231e51cdc2ef0e1bc8692b08d686ca98878ea9b113000000001600143a2fca45d5c033eff633d4a04b6a605aceeb06393b510100000000001976a914722f1f95d822ad1fc92ba8d41d33fb12feca8e0388ac768a12000000000017a914522267c98e128d18622732c05f44db0e143fda3a87801a06000000000017a91447419c5eab7801c36e76016fa885839f54fae3ee87770502000000000017a9149e8316c1c59a3644cd4851aed770de5be252dade87df8901000000000017a914e31330b24d8bf2700ae004fad6d3e97ee8c1409387f51519000000000017a9143606c9dcf4a2f020fd8c2bf2a4e00a3782cba4b087801a06000000000017a914ed88c583fd7ab7ac9cff252104fcb8617910bfb4871c9c01000000000017a91405af2487c54c5aea61c2a6894a8d292baa96d2bb87ae4200000000000017a914372c920c6b698e34cec839eb9b4dbe6274f7a36f87465305000000000017a91494184f05ba478b73e5985a181cfe4502251ecb4f8708210500000000001976a914151aa3e9d23942d3c73c68db0443f1efaa0d614488acedec00000000000017a914ac398516a94f72392527591c1c5383580e3c94f68798b701000000000017a914a4c50172a79e326700f842724b4360659b8c678087d3bd00000000000017a914cecf4460a2adffe3fc79f280707e6a23ebc818bd87386d0400000000001976a9144489c504a44ac6d39c94be21be57db322fe70f5988ac779200000000000017a9146fce2e7fc9c5400211c0a3d22aec63a3fcb9108c87f3450b000000000017a914a7272ec0e73b0075477d2c3cbcc457de521e86d287f9c00200000000001976a914ad171af7e41b9c9de74d2b2db79818538a3828df88ac52da10000000000017a914feb42ba13bb51290d4952b9a696bf71e192a97e087db3e0d000000000017a914d0cb146bf221e3499a2dd76446ebeb3ea3258f778738f110000000000017a91485f9d417808fef674deccafb679e3fcccc50cdb18758a20f00000000001976a91475b592750f3b14b985a3d25f39c79739bd68f77288ac56060100000000001976a91475f6226015a4c8788c5a16bdec3f3fb5d8e3686c88acaf0703000000000017a9143862c12ff9ad5246d1411f482e5aa7fc456aabf7875fac0000000000001600142babf955cb040dd2dfe92efc3a59e139b4903d7115c90000000000001976a9143cc2fa80bd342a7ade2ff8c1afa7f568880b1a3e88acc051050000000000220020de4d9528df447b48adb3f69b0eb0aafefe6fd3cf5727cbea9f2cf0a7a637c01166ec0100000000001976a914cf996a6715e8bbb03b48daac208dc390cb8adda888ac7e3f9e00000000001976a914f94b73ac26348ccc3e1f7a39a5ce0fa4dac63f6388ac83c12b000000000017a914eeb5cb440a5edaa1c7501a07043230e65b10a159879bde0300000000001976a9141c051524e2e575eb56de1e875475699d219764d488ac265901000000000017a9142f2f56438209bc7cb0c6296271d0be251ee6f0fe8746ca0000000000001976a914420c0bc274a7827fca96cc7095c2a5701ebac2e188ac095f03000000000016001440936309b017d35ee423ecbad0346e71bf194fa410f803000000000017a9145e9965db8383de694856dccd3ea1291fcb97eb5b87939200000000000017a9144b6c68ff98e7f524597ab02754395f471aeaaa9f8700ee0200000000001976a9147380895a67cb576f77f88214b61c7f9c1a92970188ac45ef00000000000017a914c1685383c1df346d3e160031eee95c883fa6127c87bfaca8000000000017a914df420535cfc3e6d124f6a1345e9914a8b8c0e8fe877c9200000000000017a914fd7593b5c40629ce2c97adf0adb026648b5292648726e505000000000017a91424a2b639cfa3b31104179135001e98a43cf48dd78742012100000000001976a914331c2dbda6a4d5312dedb69ccaa89704d7af926588acb70e05000000000017a9149a19b6f9c8b22f2abb13145f0e582bd559d54ef28785f502000000000017a914f6c4a67beb177d73e9a9d97212fba7b0190a0ab987d2490400000000001976a9142748da0c6718d200495fc8e5a0d103ab8f25a57188acf3110100000000001976a91496c9eb9e030361e377dc8c5ce7d4bbca4907c75788acdac800000000000017a91494452a8823fe3201b73c7305386f4c6f13bf514687204e00000000000017a914fb5afc9c4a63e37f090d50f882f2e267fa22235587d73002000000000017a9141c6584bd9b40cdc5bb394d7c7f400ebcea47bbb387f52707000000000017a914640519b9c308e9b9fbc851b45feb7d0c40e4096987a038030000000000160014a04568307661a270e9ce0f7267cb476d85341872496c00000000000017a9144a78daa8c0337aad00c23318d4111812f5dc9e708753c521000000000017a914515755b95470842dbdf7a499ad125fa802af332b873bc99a3b0000000017a914d7f4e1a642d2e95570951f481eb526782158f51887a31a060000000000160014dd4bacb7ed203e90eb499c0c30c3fad65ab1a65effa401000000000017a914bd26378233a00583a01ccb95e016413cbc50b75587024830450221009116bb7c165418565209c869cb1ced1f89b23aed2e05622d6d5c4b0efc5843e3022015c5c2551eea55249c0e7a2baff0bad6ffac86457fc07bf400e371575bf187b301210210b34217a2addaaf3ed4fb24cad15ca498cbc8562deaef8a0bb8758931cc647800000000010000000109a3846f786ca749e2db35ef6515a70e583f923f9396dab3afa8f1f377cb44c8090000006a47304402203cd3698108d140f4d5cf410d20e693e6534e5c7975fc9b147ef576a3dc623d2e0220501f92df5f9477c9aa1fb6dea61d3b38b15e2087965d314254d1e90334f6507c012102a83950703db250b09775258acd867d673208500dd89ed477a9f994a2f5282bc7ffffffff01a9a90000000000001976a914255d2e8c1673f94392368cc2e679495101fda80188ac0000000001000000000101e65ae7ba66f9c8e0de5e642ef1c1010593e960f8da7a870034e6ef954c276b5801000000171600141f24dbd3f2a79068e170a9ac4517670a21fb8ba4ffffffff01581000000000000017a9149d9d70ef6e77349aad9eb39c0c5eb993f25192458702483045022100d0d0398c86a16ee94c71bce73180bcbecf374f627f789b26388a5ff8821127fc02202cc4454aca2a3422a1f3798b1552b0cff8d55c3a638dc4b30c84ee9583b2ba6c01210306c4f2ef3ed680fa3bdb79992f47cddaf930769446746ed3b003ec890b4c16f10000000001000000000101b94d9b12ffb2fcc36e15aaa71bd19d63319fd41d00e50a974acd376d1deea4530000000017160014fd049bb34d161a16fb2726c31a0a6f7288637277ffffffff01d87863000000000017a914c48fcce7cd5af01722dfe375828e12ad9fcef95f8702483045022100b510e330c51383a3d330b29c292533edbb96f8604838a8ac8d424a637052397e02205e99d648758ce7071aab56271f78314a9df028d56645a3e8134f6c7521fcfd97012102ae88ee0db72d049f79f17f6fd1c37917788b7447c4d957bc76bdf2466ec8dc790000000001000000000101e65ae7ba66f9c8e0de5e642ef1c1010593e960f8da7a870034e6ef954c276b5800000000171600141f24dbd3f2a79068e170a9ac4517670a21fb8ba4ffffffff01581000000000000017a914bd39e0347642c3589eeeb4058cdc8601860b90fa870247304402201f2572b0c580f82cba73f97c9d351b090b411494c13963c684a8fc4c0dbe74a2022054c5470930da0a6f44740d4fdcacca910d869867dc809b4d2ab760033bd9fadf01210306c4f2ef3ed680fa3bdb79992f47cddaf930769446746ed3b003ec890b4c16f100000000010000000001079d826139f5a3d7ed642b6af0c4b037dc6a1574c1e2ea9032565b1875f3bd8f171400000017160014c683032150d6bca37a094f7645606742d07b4b77ffffffff1238190171c96fe4848ff509a41136f98d819d1d19af9a8e53075f94fdbdcf3a050000001716001446f5bc1a7ffd378f5c1aa870bf747c9081ed0d73ffffffff0688d9c4022923f30a209173644ea2cb860ac31e1b775b1568f8523e33d1a6510100000017160014aeb8896050c9373974af4c952458755a8d40d635ffffffff1ee0654ab7f02b485dd0b380162fa248f2cce357df22f8bb8255eb5792b6e1820100000017160014f611d4e058884d63a538ae4a341fad862c160082ffffffffa0f33f57a3162c17309c0c25582dd73ebbddf85d91ede2bdd4ce12a9d857559715000000171600140ff5dee69142a1cf24ddd9ade69366733cbff282ffffffff92cd5ab7a567c570e863dd605de72a4c0d38815b541f6ad3c7d110a58cf897e62300000017160014b716bd15df85387a3d3ee35effe09249d12e1bb1ffffffff0c1fc1c4889891f067f82f2915eda1ef14baca48ee8e786f34d132ebfbdfedea010000001716001450f619c9804d41131580855f8cc347dc3a863724ffffffff0121d44b040000000017a914684d2388fa75d3c932e75db6c4c304736616a0e8870247304402203ab596610f9ffc76fbdcebbac52da0c5563485af688428511043d86a3b1a8d4702207f9bcc51a8a49e29b1a6a56bf94e9972391404e572a82e21fa97d72c0874a8b70121034054a60f6e7d65a0a73541e75433e0f0f62469e50ec7f9f84ea0959317fc522002483045022100bda3df841afbc32d8ce52b47ea73f232655321508310da4019a8a437206136fb02207b34410190780fc2cbbf4b354b154557dca5593b6a9b96fdf7783107cb4f9245012103ffa496d48abae5eda06d9d566baf9140b88d2ced357c977e42326316d1202ee702483045022100c324d9c456c7fc26f7f33833c6a5fdc28bc3066f7f01b03819f62e43239bab6e02203650779dfc81b8e603edd3ca441a5a713d8bbb7971b6cd970a67f2ea4a15355401210362c22877276f22ce59e445cefbd765998de0677a5cbf7fde3dfa8c097676eac20247304402203eaaa4afb45ba804160bca9bfd97be12658d2032c237f9949468504c090501bd02202b1ee08e11fe28532aa758a0b6bc625c76ee5222b3dee59fb5288ba450ea32a3012102cd6534692acfd443e50b04eba18b3742d35798551004cc02e35afe9adf9d74c7024730440220158d581dcf107e383ddeb7154bc16af211ec3dd5571ce14f7c992c3ccbbd344e022037670c237f63360f704931c6c80ce0c643d9be0538501f2bca789d2974e0b8030121029f7e61f7ea99153bca291cd908c4b72adbc5f1271eff01b29bdcab0747afc70b02473044022035e9ca4ba8db82be5df9afa8e538ba090c26f4bd7ef27e84daa9621fd0ed484702202c954269360f443c56252d0a3bf8bd6b99b33c23e20714a14786658fd8246a8501210213ba4c9770128edcf28aa7f8421c5b4be7be17671d30436eded4c90c2373777d02483045022100d7087f400fb6cbd37b58eaaa9eab82c2a908e2a29f33e0a1b300e8d8280d7b460220214479207e0aba93d1949088cd5d708e545eae742c152fd3e7bfd9653a97cebc012103128a24b739da8b62a0fc98d1ba693f8a1eb0c1938aa9e941aa52b869622e81870000000001000000000101dc6e59e3e65c164989c00a67966753f98e8e2eec0012f7745bf8bd49360d0d101c00000000ffffffff3cea5a00000000000017a9143c0a42343345d011f6f72e07a51511e4e533b1dd87599e01000000000017a9140c1004785f096a9cb1de8d5ee76f11e681785210876a740000000000001976a914a85d74c08f906eb81b6d500dc77ec9873a7fc72b88acca000100000000001976a914178bf16860f53f1809a17b883708236e75380c9888ac24bb0400000000001600141dbbc89f09399ca58b66b3bfc7147b15b8dc86f3a2b911000000000017a914586ae74455e355f4b2cb7d914cbd5e024f3f387287623c0000000000001976a9142c2836cb1199bb4417c18af0433c731b155219a388ac8ef61300000000001976a914198b1d4e726c08ba76d460bfa33fd77cea44eabd88aca6590100000000001600141509d72a63d853b44a848c5ffb8776b35a55135f36ca01000000000017a9148939ce42cf2a92f54cf571c48c061fc8efdd4d7087da790f000000000017a914866d1a48a29c16868b48d9d7c2bbe847a046712d8751c800000000000017a91477a8941b7fbd5ccc38feceaf7f0291d02b9c787187a2220100000000001600141a2e456e1ddff4952c8526351e28f2d3cc3d8a59e09a090000000000160014d1085f76d3f16d87d90ac8fe71c706e01957c534ecae01000000000017a9146322f82298b71933b5418686211940b63f634f0f87467a00000000000017a914f2c4f0a933f99d5e9e59a36206609fceaf76804787352d0800000000001600143ac3504a4897ab651e9d836e684daa2865657ecd212b00000000000017a914666ef662e567bb6fac9ad004c057ffa1b1c057f087abbf03000000000017a914d413e3fa9aa8a85e46e3d42ce06d601b30c14ea087f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd762f6e0700000000001976a91475c2b9b1d9f87f4a9b3a6b409cd9fb15828d55e488ac1558170000000000160014042a5a662cd07ffa9e380ba117b22314810217f74ded00000000000017a91491ba8a350956cb4c592f54ee42045228b49337b1878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ea3c04000000000017a914de0b014a11141f767fa43b5ad6ed3902376c6e43877fa204000000000016001427cfefa13996324bf1cdcba60aee019db39beba0f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7672370300000000001976a91443b0c7b39ce9365b4ffa7d194d16f62b57dc593688ac3e4c07000000000017a914c92949e40631bfa42ac71e32e127065e64d73bee878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd761dab0900000000001976a91408f548243eb45d202bdba4b95a105b3415f4003088ac8b0e0800000000001976a9143288c518cbfbe074f1353c6c683f10eb40c2a36288ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ae2c0600000000001600140aa3b448ea23ec06631cef2ac3fe40790007eea1aebe2100000000001976a914c8eb74337327e0c6ba6af59b4f0456bff8f4caae88ac79e60000000000001976a914bcc738f5f02ef5f1cdcd544fd37be0d2496be34b88ac55360200000000001976a914bbba477d40689190a7dce0ae81f264846b10720a88ac96cb0d00000000001600140f65588e1f4da0eda54122735de4afa36b053a67a3d500000000000017a914ebb4414d933ad5bf4f3a3c21f8a70943c26647bb87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd760a0804000000000017a91471382ad2e8f4ac94d6a2cd47bb22366ce24fc03687739d0300000000001976a914e305503585c1204d2979f871b550fe22d3ffa18988ac26755c000000000017a914f84d4f24692ec4e7ecf695de27140037dc6d907687dcf901000000000017a914b4ae8774b314dc89392649dc9dae58d859e8e78187407d65000000000017a9147ff1102977c0730cd6e973daa271dafa7a89bd7a87fe9905000000000017a914542c458e9bc4442dc92b9a66a2fb3740b5e908cb87cd0201000000000017a9149ce823cf8b6b711e2b302ff5d003e80134623a83877f0c04000000000017a91469094fba37b02c4de26ec5b272a9c3c7aacd47ba87ca8d0e00000000001600147d09541eeaeb72d179b0921b5e3b3e2ea7c2d1bef06a0e00000000001976a914741987c0a7941bca02a3148ce27fab16f363501388ac352b0000000000001976a914bfab9befbac04e497081ae899a495f90832853cb88acbd4600000000000017a91407f9c9fcb0c307591b383d8368d9690dc8a5a4f587f15a00000000000017a914b69e6afa74ba724b1e5369cc6cdcb2708e8753828712a1a300000000001600148717b4abbf8fd3b6289b0196098955d4a3b2de1eadb221000000000017a9146783ee0d41278ec087a860637ca1c1cbdf104d908780b501000000000017a914677966a2f12b16762465f85c46662f8a60c7800287c4e40100000000001600141c05754a1bab387dc154eee6d80dbb527adc8936445600000000000017a91457bfd8c7332d559a70cc095949789a966581a835879e3803000000000017a914682d7b9eca107a06034d47a5aa33e265881a7270870247304402200bc8a7641138b08052a732b5edfd2d0314a6f7941afd4c41bac8306d36ac5fc70220083baf46189c4725f6bdb111f07f5eb6f6b3d9d2516b836daed6feaf60c9e12601210270336065af5c8893e908d415219909bc8f760ce9c41266fc8e037c88b47cc9010000000002000000000101736310d24e1c2797211658519ff51010ef70f9222417f94cab9e3c59c259b72c1500000000ffffffff02afd91500000000001600140bda35c98bf6d817d38e35b5cf1776b54625092f1f7d010000000000160014c4d543310f32e1358c99f6981767fb0433d6adb502483045022100f7342eb7f98f1dda390957a3db790493fec2d8747a6d12677841c96c50c346f102201e8dda6bef7be7fd62ccc22298d617d45abbe4328252d3cd87420eed0813a596012103add5d7506896999615963a6c083ab4b75bf34db3beaf6af2bd2e45f26a76bb2e000000000200000000010360ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e100500000000ffffffffa8b3ad90b42ac41baf2dc88c73bce82a7b793b4d86e89a08871e0b964ff9e76e0000000000ffffffffca09c579d4b86eef8358c658c1742047a2977c6b23fd0734ce491ae5ba0465f50000000000ffffffff029a0a0000000000001600147ab03f63165fce21c19f91a99a67d9354d72ac994c405800000000001976a914366d0d5fc57bbc466c01dacbb66a737b256d3b6488ac024830450221009b558123e410a1a5028a5a61f3ce7da56d38ae9f2459e58128585bc05bc335db022051c08af8d9f684db890d3ef5148457c6c09c04472a18a53ddda9a7da2b18eeeb012103fdd776808444daab19dc18d4982bfac0d3966fc40878e4700aff2dc0ec776b9b0248304502210085c7e4824606307df8fccdbf7a39473dfdabdc4e8809d0a8f5d4fc944e34e2cd0220279d1133f2e019f28c57ad76d6f8a6504b71aee80bca258d90f69c74aa3c578a012102c4f279437e495350fbe77f287797279ef9c5b4b9a3642df012b26b07f92ac49e02473044022055abcfd8b3bd467206681a1791f0c6756af39e9810b8d9238ff7be00085938ee022047e2005be7e620933d6351f93b5d5373269e1c002d966dde276577e28d2da85d0121031bb557b0bc7b4cdf9dd274a9e04e9e0fe1f6dc259833c1834856282aaf017d1b000000000200000002b79c7dc97af9ffa7920c5b92cce6bc86c5d2fe0de4714a6260d220e2f6cf7693010000006b483045022100f8907eb514ac816eb35e9019a24f473c091b4d9397ed186243739790d1026fe802203d2df1350240053b2311b7b5409dd4194d35f357ccb401edc94b3e5b82bfa7b6012103d8bcfed344baa587de216e18fa42c01d02bae278b0945d72998815e5ba04f814ffffffff287c51301b31935a0f46616dfa7845bc0dcd0303b4699e236f661926c52b828c010000006b483045022100ad738bd154c415f620a165e90fbc8b548752d53aeb4660f29128eb27c523ff7202202d25ba18b5a1987c8cf3f5eafa231f982a247415a9af7e651b3dfbdcf627589b012103d8bcfed344baa587de216e18fa42c01d02bae278b0945d72998815e5ba04f814ffffffff0123ec5e00000000001976a914af3d72ba00e41523f3e33c32fd697479566c6f6c88ac0000000001000000000104cf40da259442cf5eeda49bd2be3aa856dd770057c272d3b1d10be62edb9b8be20000000000ffffffffe81a65bd8b5eb5def27e1cc674f3cf50c90a0e8bbbe8cdadab64881ed39a0d270300000000ffffffff20e582126051b3270fe41a92056a0a668841e0c15c18e2322f7e0bf2acf865700100000000ffffffff04d3141b84c09860ca8f37e01952dab1a9627c75bf5bd39b8718dfbb3e8e69800500000000ffffffff02002d31010000000017a914ff5c18c0d0ba91e2318a452145fb6d38f30a5688876d8d3400000000001600147e0543cb775aaf816702db6e322da317a0243e5f02483045022100b76d9f0c9f017291ae2614374cf9682415f96450985699777d0a7dfb6a7af049022013630f2e00e91bc9b5e2fa545824e3a5fab8a99029e55b5b5240b2843221f1de0121023b0a33df2e81c38cc1e2ed99212e1e8f7747b46244af613263df6814a9710f5c02473044022036985a647ac594d3a77e0309a172e214831fa09c73758f8bfbe2fcff860fdc3802202308a6237c5c67f96ef9720191f8e81d1e447dafd58cd788981991c6c17a336201210208e58e12c423ec12ea78c13cd115870d981e63f73e2269ae8e21309d7d48093b02483045022100a3522fddfddea9cc27c2c0b7074716ec034eef208e618db5c8b95176c851378002201c5f7500357021f372d2846be004b87f0dd44ed4c4b3fa69c38f3553f447396801210242eb4f91a153fc4aa1a37a6432e5f4cbee5b77592255948f3bb8af7692f75424024730440220040821ffe96cd1831eadd2a54333c507671daf4768d7e351633c177370d749fe022037772aa15d7a347906b2368cebc585537ca22fad18eee0cf981d16d9f0dfe2680121037560062a7078b90abead7039b372020ead597a17a1140dd9857297bb8250d2ef00000000020000000001014eb60cd91904b70da926e8bee12d6947ed7a74207b1dbee56a243cff2610ccae2b00000000ffffffff027f4e4f0100000000160014d5cf5561d2650e15a39157cbb54fa1ee21fdb8298a64120100000000160014ac04b0f760d1e73ee2e99c17a8c567a629b0123e02483045022100b37dc1a624776e097a08fcb6adc84544af47cbd4e4a47feb840545d979e214ed02202b99908d19560b339a422d9857a0a090e85702248ff6a9726f18475ebcb330b0012103696a69171e49f07d521c6a46df2944c38127fc87e04f0519461a1b152076921f000000000100000000010146cfdd056a4a01c936b94b01861ffb23466c60f1982d8673dd0f2af2bb45384600000000000000000002d66708000000000017a91467f15dba6d3b0c04d607cf9d64688005fe34db598755e3460100000000160014d5cf5561d2650e15a39157cbb54fa1ee21fdb82902483045022100cc37160c40b797d169503078fb59de1bde561912f967a4dd25cb8bc6c580c629022050d93338a0af12bef4087f7beb21cd08aa33754aa876a6493e7d14f99d3d96d90121025c3769fad6bb160c7eb215c3deac93d4d294e838d5b82d4641eca21b354b4dd700000000010000000001012c90265f1c6eb32e5b32a0a2852be5e3b73c9cbf33452e5f4259e82e9b99d92801000000000000000002644f240100000000160014a19c3f0448801359d5244de3620b271cd9767ec2a390220000000000160014d5cf5561d2650e15a39157cbb54fa1ee21fdb82902473044022030992ab540a8af97d513dd596b73923fb7f020c89b4ca142b7cda46f75aa4db9022015d10e2a355a49a0c6017a6f455da64f2c53a4aff71252359856eb35e29489310121025c3769fad6bb160c7eb215c3deac93d4d294e838d5b82d4641eca21b354b4dd700000000020000000001016ed13ecc57f46d6b43d0b2cd002bd06c2066a8c070fde981f2d22c0b1d9088c90000000000ffffffff02fa1eef0000000000160014b0b0ab233a899e4de17a71f6ff01837f669efefce42a3500000000001600141f90944d624a321d430965c12c3d15b40c650c9202483045022100e1555022d0744b1f37dc528762338e4556f1a57b3d02fc0e5206ec730c21d520022019f34b92a8b05cf697c18ace8d0ac5d44bff85e723bcad5ebbef5705a26b683d012103232da341391f18ffa43f16cf8fbc8fde6575cc07e8a3f363d9bca26cd20ba82b000000000200000000010146cfdd056a4a01c936b94b01861ffb23466c60f1982d8673dd0f2af2bb4538460100000000ffffffff02d9ac0c010000000017a9141cbae5e771e26cd84376ec5b06468ce2c0ed426f87f9b2050000000000160014ac04b0f760d1e73ee2e99c17a8c567a629b0123e02483045022100818d0792e052fb6ffcc09a40d39abbc54c645cc42b79653f443f4a9f0d30687402203cf38a4f8e4484f961762637c3b28ab2e8b3e0cdeec80713d36f147c05181768012102a580d19b9aff07394e30e31b3d9dbb4f0584465bb0342b4c18a7edb03e961a9e0000000001000000000103a8e988580e642db1b5418254f8464863e45fc957c8eaa26523a24d07f594eb87010000000000000000355f617b6b6f4a8b881041d73c6ad20686686c97e18991e17641bdd7d5447fb704000000000000000059b1ae8a879eaa6ad8c8452381c0d0236d7948a504ebcab492358935116f73c0050000000000000000024081ba010000000017a914e5a9e8a69180ada05fac407a781831f62d5f29ad875fac08000000000016001466b1b776b9a4eb1c7c4f75ee738e30346b3aa55e02483045022100838824cb8b6135359a18c73d079005fb044114d9ee129a6da187735f7d7b30d502203261152e1eb24c3c9c0c14639a661d48da39e778f3d21093cd5d2415f63edd1a012103af37502d41dd1d619c7d4cc8234390d0cc5bfb227fd9146b46229ea2d8a1484f0247304402203e090ffb1b6d47a386a291f3125a2d00538c852483fb2a4e938893a73f54c35e0220580cf89fe5e516f6812294bd554d48e1ed7c50ece810f1025a49973eae2778da01210360976ec5534cf358eca444cb79e58a936c76be562596c33e1182e905a39ff8ea0248304502210096eac8bf944426604e182bc4c322a147e924eb386cf4303047f9eee520a621bb02201290a2e08250574ad3b334500cbca466c9d592fe5559dc37009d6d444bc72ec901210360976ec5534cf358eca444cb79e58a936c76be562596c33e1182e905a39ff8ea000000000200000000010281f69585d52eba1cdfa241a0decb0ce2e38a93f98a3ad72ccaf116bc1effb6ed5400000017160014dee0c1df150c0acc4779e2cbda0a03c42c33ef39fdffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a416000000171600141be30c874127230cd178136a49c97bff927d7109fdffffff018bf724000000000017a914ffcd6b66a621414946c4d4a5caeacd0cd4e124e587024730440220502826f439983de146a8fa406fdcb8f42a72154ea5e5686c880347e1b8d35d1f02202e956bc70a309de08c79d458d3019356cd87a88ce8bd9f96bbc29d2c18813e2e01210372654f9b53ae4f92819c08f29b88ca8dca4dc05bb9cb2a209454ebc1f98d65a6024730440220749211c4a352aac498d11b9ba1851843d3f8b0067f9eac354e08de431a62bf7602204031d09bab9744f8e2fd480d68cb81ac1480a41672be1ebf9122d314901f9085012102cabd1c83b5635cc621d6fd2782ec63fa74a67331f17e930d0bdef5ad07126f2747a00a00020000000001030dc69871f81378916d59211b8137a515b8b15f2fd05e73952d12df7f690e6f890100000000ffffffff017d5b99c66a937f1add611ccd05d2377637dd538346b2cd545224b80a5242000100000000ffffffffc8c4842dc2a09a78aec7818c8169fbf6049ddb29eed1c519029a1ae5776b3404000000006a473044022009fc2df3df90596176e487bee0012a47c1595b39d8ad5e9f7eb2a6b390f8e98c02201fb589b88ba090301252ae68b6abc10cf0fe6dcd412555f544b2a7e05319370b01210349e3885de72513bd3b190dedbc34147e754ff6b76c2a7a3b35b63bc22523b392ffffffff02f43c0700000000001976a914e703ab62352938f2a6bbfcf7fd43742205c9669588ac3e0b000000000000160014ef73aa3687103f6b8a82784c0f3cbc6cef9cb3e2024730440220433c007e32b6c7b62ee0d3a2d42b024a1b578c5e9d0296bfbb6247dc3dffd0df0220687973b8c89450cc60d70cdbe4056c22744507008ca7d5ba915c131e19f0ad9a01210335c2b40eaf04a17047c80f5bf7a06e97dfabf8ab0968ea2fbd2d2f22223295350247304402201e5840e44e7c3568b515f1a0549b000b2e77900fa6083195b428b4f8acca999e022026378441be952185b3d00ab50f848f77ab9324637422ee9c784f619eb247551a0121033e5888e05fdf88e227a1f6d64c28c4a132b52f857c239cd6103bd0d8ef9e30d2000000000001000000000101402c4c7c64eedbcfffbf37b5098cd479639af7669dff9fb2c3aa90b94a907a7112000000000000000002e2090000000000001976a91466fde6e31af0c3b3d2fd77724bda26c0c9c7e48d88ac7755000000000000160014f559c1be59feeb13ca4a04709aff216f723bb64502473044022013e7485be0b20b216e15f0d694167d5767a53c998e7ca463c671403132f1b88602203e9a5944c087458b92b42d69f4ca274cc91e7e5f7860015d85ae1c3d6bdd79d101210313a6552cdf396b1d540ecccdde9102cda972863af3999d3068bd034ef645327d00000000010000000001018ccca2d8dec844a5b535e16d44fc742dd518cce1feb2103c118512efafd5a3810400000000000000000204850800000000001976a91472ddb20edfc48a71ffe9cf03366c296d30428c3488ac18386d000000000016001408206737ce48c72eda34c3a180c5c4d901ee547002483045022100b59c130a66fed95b1e1cd0a31d1e83da4ad1ff93493fc7e85c177e859f085e12022004a43f1b43162c22d7789b9a3bf030746290b341808d095194ae0e34f013c1ce012103e423fbfa49bdec16396f06be327a6dfccf1756e789552939ca743228f2aa7d7f0000000001000000000101c96dcd85daae49eabea1321ab0e0f34d183695bebe4b99c5cf30da1f5c3d8ab80100000000000000000217210600000000001976a914674b8583e2704c5ceefa555c9f2e7532af8af82588ace3c5a40200000000160014340520c5a0da76d35a78f17ccf81bd779abbf824024730440220392cdd2bc255977db2bd808c0906544d0adfa541e6f2797310005b242588c47502202281d09c8d9ae99e194a524be859afe8bde2bdaf06d3d56f5f04b3a252bfd7750121038a399e0978fcc996dfd57bf46d12740732f60095c1d7a0a09e371a1962c0531200000000010000000001018f713afc7218c4e8fd44aff6aabfd15ea83f96a40a897e5bf470ede6bfa9d4880100000000ffffffff02408af701000000001976a91463f5b6d6b66b71cc5dc36ce174223d342175b24788ac0ea5880100000000160014e348fa4ca132aaa77cb3730661b2d60ecf28a84902483045022100e29d6d0d86d1f3b469493613f5b45ff6c1dbd25978c814d2a213fb8a3c2a74af02202148c3651fea23cac1a84cf8b96e2de7faee04d4b847a45dda8786b3d673fadd0121033497b50b020d3175c6254d20e32bfe52a12ed94b13709189c6bec2dd329be9b000000000010000000001012997f83d883cb88cdab95103d423edb4c8cfb4c9b86974fa191c28f7f2e38a390b00000000ffffffff0280969800000000001976a9142409db3a3d52bd9f5d57f5b48595c1db3b0f9df788acec41f300000000001600146df0e66f72dc90f45238fa3735dcd9e671971eb60247304402200799367f1f5e47456a7169611a2acdf9c05d6110d5ff4ee829c5da4429c04b24022000a8438b3186a62a402b0df47682e9492e689a80a6682e99c26947ef8fdbabab01210234b193146798def6a1b01bd30d118a4e3ee5376e7937847e3e0888bb1d7fcd5800000000010000000001015df19f86b12fd6fc70c4c880ee00f8b4beef13a2ec2f59e7e20865305c70b6d30100000000ffffffff024c5e0300000000001976a91482d97c02b45ac3765fb8d686821bc082a7cf36b388ac37ecb5000000000016001498182710fcbf02020cf156195d946e32111a71f5024730440220085b0911643ea4b112f78b7fa202bd7baddc41cf096fd3152ec6cd99e9abce8902207a17a6f8a4503c3cec57e6d7b01792d30697bdf7a370d54a71993ad7ef3ee9240121038afd83acdcb5e5de6e713c3ba9e2c695cc52088014c89cec504747b23fd0a84e000000000200000001d49e0620193699879654857b00566e09391e9bb218c7555dd66fa3869321ef33140000006b483045022100c0bf8cfa45482a44bd9aae17a3c1cfbabda934a4668f22f57e27259b0fbd5f2f02205be14c36fa468099146c5b3574d1ecfeb48721e83035ad62be67e06372e108d8012103f8c5a77a66f0b77dfeb16fc4982186783b0c10ccf799f8c424b2a2940f027155ffffffff02bb740400000000001976a914bda3727823ce988ee721fc02dd00fad1d5d7d23c88aca62703000000000016001484f134393a570d249acb9b30df53dcbaeb81bab10000000001000000019b2f345c64a37a7e223122b8dfe0545b3295936545af4ff92f11a65eeef393d1010000006b4830450221009e66230ad85b711483a38c6d1c2e40864281c20f516cbb9664334b06a6960a2102200cb6cca25b409fc0fcfc512d34208d1a5438d6f0c134bfa2c02c8c7d111e34e301210338b9bc60fc428eb7ed72eeb3d8ef852128fe8cda5c8a7ae3ebb5223f6c842a2effffffff02a05a32000000000016001414f8557b376227a0cade625f38aad1839e3519d66c7f8700000000001976a9146896a5f2273a9bf9088a660f175af10cf92abeca88ac0000000002000000012b0a80d8cc9ac1847f82fa014e78bb70a070c65c2f0c53f66bb21bf4dc814134000000006b483045022100dd2f7a1bbaeba7080e396d8cb27dd9b3bfdc83bbfaa0b3028f453ce32b1453bc022049d7071dedb1ec1f1421a0d063c7a721506a80ff6913383c1c5996d5d0adc4de0121032aa00062414b104f7381d76cb43d449379f450f79a2a34fb0d384ec4e777efe0ffffffff02b1540600000000001976a914397b4affca0efb52806600af82cfdff04d5394f188acdbe33300000000001600142f788e3b3cfe7fb3880d42a707dec477f72a20e00000000001000000011698ef5517b7add63001fa43d813ca03aa995f55a3b88d867a66cbe2c8965355010000006a473044022041050c7e5ff5be7c20f88a9da831f28e3fbcda157b7792e07f0c10ed9825d63c02200a3d7231122aff9580e25b9f142d3c843dea6673c58f219fdd2f635dda8683a501210223dda1b9aa32eff821f101498bba661b1408b2220226e284c073c8ab97c7c48cffffffff02746d2c000000000017a9147a980923a70f2a38059b5c0c28546c781bfc122887be919200000000001976a914b0b7868177c13d63970ed51c1c2da69bee9ecd4288ac000000000100000001257865e47ed4501aa460dc6061e434413bfe5515bb00cacd40788b073389c036010000006b483045022100b470f78d7cd827b942c82537d12efbad5e82fe676e53c3fa0fd66bf14b9c340b0220070a3dceb1509907b30c83eae848f0fe7df432e7b56bc9405a234f68b12ec2d5012103fc5a9aa7e2336c29aa29a598faa73245cfb5e77980cbb44e547313adcdaabeb6ffffffff02ec4c03000000000017a914390ddf1e32d458a7b47899155b8c84ee5286b7bc870b050e00000000001976a914adc076c6fed5fdde3984739a54053e08fba256da88ac0000000001000000000102d8d5aa5c11a0b3eceaaff49792e81a796a2bca76ca828506e0cb27baa1543f192300000017160014d1948fe4d918461bf708419b1b04c8b45c0c9407ffffffff511735fc467a5c31b40021bf7672500a0869aa551b2536cfe989f42fd7a792382700000017160014b760a3afaaeacafffac35eb4726c61563cbf1f5bffffffff01cced04000000000017a914d799587f78d09c673434817b11e670ba571f52f88702483045022100b49f815daa9a03845ca50684a49c226fc631037f6382e8927b48b14c798529d00220710e5ac7ba9e0104ee382d13ce00b39fb1b1ddbd05cae5bdde804f1641d17fa2012102ff06d392763b9117453579f4e1429a3670c92b9d5a9abe416da50ed2269bfa32024830450221008e27b2462321af212fa042a02ffbcc43421efd5e84a741b77373b17dd3b590a102204fb9d4fd429f3c1582bff39021629af1e5ca88c1a3f001f830ef7aa7eedfd1be01210239518c611d46fbe3b5a9319ef175d828dbcc077f92f6b54d83d8c8c7919ef0680000000001000000000102f21221f3bd63939cea359eca05166aba7662ba8ce20f406a19608b66e3422323040000001716001487a8905c1c6088cec74cf72e6bdd1f909b14f6a7ffffffffafdefdc34a68a2b9d9bd925d4039713fd50ad1ee3c27443aecede293f6e7554f38000000171600149a63c79eab75a20cbcb2a1836815aed2886d9127ffffffff011cc501000000000017a914ec4c0c99a75d77ce4cdd153f512a47d5016c36a487024730440220093e16ce768b7b156698f03d99b5ad71bb4534235ac8e3ad4c2ac9dceca9ed6902206ed6c9d1a029ae24652063f43513d0dc9336c651d68056533eedfa77979693ff0121032b9bd7ff1e9db29a233b5864cf325b44da53dd2ac9d8fb91109ece66a255232202483045022100a9afcabcf4d19ef805eb0f43a06b7690d3601bab301c74fe312ee447092d3bbe02200544ba583d4f9baf1c01fd3202df2223433760845f3cf1bc7430fbe2a95d75ec0121034e92da907a7e067ab17f69d4a46d029746bfd3fa778667aa7669d24dce5bbcc00000000001000000000102e3500588fdcaa499a514356f4563a246e3c0908b8b398af000a4e9250cc7cf140300000017160014f2aea8f7b22dc65c5909bbb8105319bb1be86ad0ffffffffcc5e707e52ca1e05779103d7ae1fc126e11b094230de5a60aee4b0cbc3d5c4e22600000017160014ee0d18a0c6ddca95123e76d8f625ce1daa7b1467ffffffff01cc6300000000000017a91498c02270898d064b8d7beb435f90f0b480688d8d8702483045022100fbd2208ab6f089509f9afd975fa0055c7e4208f6b19be00dec593a69e0ffab290220754157bbcd5e8e17e5cb1c33629a59d5f362f4c7a46e67824fcc17ddb38dd9d60121021b9a94c3d143acabe78e4c4853258407e5da91939277e781f65066505d3e248d02483045022100e66e9e3eb1a3d686dd0dd836a7e6b46ccb3e02df1573d5f44cb8feac8ae89d260220046e858cc5b80895e54aa1c3d6159d44709a8fe2b44bac99c861246f474db0dd0121038ef0520cfef58021f088a3530b42938cc354035f87a6f7d5f68dbcd6d9f9e521000000000100000000010139efa2013edc814ee37e76935888fc0eeddfd3e9e84d901ea3d00db736a902940000000000ffffffff025aad01000000000017a914e6210fd93ee8fcb3500e8f44d86d30d3f2a535b8877360030000000000160014f1bb8ccd229f0af5af3ed7482c14b413df94fff702483045022100b5b4f796c2fe794d9d998011f7f0264f5a58a1f09cc39e16a877ab3c5fd193cf02201844d3bc096746cdf162146246f4c661517a4a8d0e6fefc36cc2bd5d128576d2012103f122f1efb1f798f81667a739308ec70cc3cd1d3925eb60ebd6c7db5d28c2a51c000000000200000000010246dd0ae65a059bedaa7265cd5679082de07b1be8e01fa2d2b0a477ff6871742e2400000017160014644dd00d65412adabefe22f2a65d968543f1abd5fdffffff3ad5bb3f1b74ffdd8da29fadfd0935e368ff50ded20c91fe9404b64ccddb822e34000000171600146a0057a927f5a94c55ba6725dbb9bb443bb1db93fdffffff01c7e91a000000000017a914e48445ea11723886ac13c4f24dd0d65e06c8475c870247304402207ebab23e5d5a5e96ece66fc15b74c6af5744b4d6c7e6648058697ab9b251228c022077ca2e092619b391a43f90cea8d652ad0489d8ce5241e44e74cc9c96e4ce16cf012102132baca7bbec287e064cc66b801780f01bfa4992f092f4e687d8ff06fb7fdcda0247304402202c83a0d1d007c5ab6fc5c29798204ced83bf6b85d4ae80a1ddb0fc0e3ef7df6402204e97f4f68ec1635640fc448324da40bb8734feed94c563bf703081c821f2ba570121029b34e04928ad8b5aeea4b1198da984f4ad925bc84f5a963a590bb8cd8a08338f48a00a000100000000010599f70d3f97dc578f459a0cf86b95db65703907d14b09d97556f75e55b797e0d60000000000ffffffffb1c9f2c60a4c716bb36d8e325bdff3bcc684a125792434f23b6fae665c58ecc90000000000ffffffff798865bb5518a35e338b15ae98dcb099df96bb542bee53f37277e0e287f9b4f50100000000ffffffffd491f244818eb4e120d220374a5fbe2a8961d8d113d5f2ea91e23cca4c8f77940000000000ffffffff7eaa9b6eda8264b8d0ed95af7d8be07a0064724dda0e7289950c528527f45b070100000000ffffffff020084d7170000000017a914d3ed9ebfb65319f87bb0118b2833fa807b0953368734d7f50500000000160014d4c5d71eb0f6960f3a8ece4c58a3172fa20f4f3b024730440220390f25ebd3bd37f3f81999bd0a26be79a067928851114957181c22750e143a6402202f00b602e6776516806f0897ec82308c4e32b31ee9ec4cb610323743906cbe5f0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30247304402200b71d5a86b841847472516f2235a2acbf91e2cf0fba2fe7f2b7bba5b61765e0d02207e2c5c082dd82dffddaea3d8c184680d2a427586ace25a2370c5db8d1e38e30a0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d302483045022100dc15e329d4f5f140d181e83f62e092a0bc441db20d1e83c05565f3c6481dc5ad0220439a1996338f66fba802c394754731fc6bd5ef9ccf921296993450112657ff6d0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30247304402205fa33ea3f2b80ea675839c93c1981891e2a75676c28f795cda5f32ae6a6707b1022002d10054dc44c21bdb8196c20479b7f30ab63b5f894f69e713bc57a4ac33644d0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d302473044022032f60b8222f916eb2f13f300387c8074d9a6d2a43e751299ac7fefc6f760ded80220092681306e159675dcbf90c59caac718efbfe9e3f9a2a40bf39f90b70881dcab0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d347a00a000100000000010588bb76ef35a01a7c5d4fc2239209287b655ce9450bb1ef115fa610a53b45545f4800000000ffffffff303a8449afa4e7125a7aa9f56df8238e7e2a3590b1d1d5495e0fff487d47a9370000000000ffffffff519744b18325602418940619acee31ed8612e758919da61a6007d0108d05e80d3500000000ffffffff4400ef849b117636ddeb74b42dc9e2970d09fe3a3932ef467812e4e4740e3fa75800000000ffffffff39d1e592ca40c1274dbbf7c204d4c2c7da6e6f84030be24f293ffe5db148f6ee2b00000000ffffffff0262cf4e000000000017a9146fad525b13a07aa1e53854159589a583962661558729b51a0000000000160014031e2de95272276177cac3b385cfb409a92033080247304402200bbe562f3b6b77810f6b65343f4d51a3281c7d9f8607a7ba9d8a9c592c97111d0220251fedc2ef4803270295f3f42a0201c532fde442e23a7c74238bc323c3b955df012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2002473044022042d6461f298c395757049ea293bffd4a25b2d41b2ff830bf90af6074b6b46ca402205fa00ca01f1dad2893a7a51f5ead2814a1414983d5cd1735b3b7ff6b1b6bc1d801210225efcbdcf67f77c79c112dcdaef637fa604deead6a446f32ce9624cca4abd1da02483045022100c0f800dee727698ad61d7d8e6ec4ee48659af86eab4c6e2813fb01ffc104b4a1022033a8f02bd410b228afdd14f47dc2b06c46b666a71610f2c892cb4243f873bdb6012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2002483045022100a720b2a19fc65d596f6622b27d1389f29886734781f7fe71b97fb0ea2c1d53e302200799597d36dd721620e7687717df7d2bb41c6dd51f15be5f1025d8e47fa6165e012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2002473044022027e948556a16308a4c6cd0e8a8d5f4968df455d29c2257ddcc31c1655ec723ee0220558a1d49d979ac459fac2927649ab1b8d9c761c0b526e927f7ca335fd32b8aab012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2000000000010000000001056994101a0d5e7bc52c670788b216570c5936d8350344e00812d89a0e444121e40100000000ffffffff3a9ac96d59812fe13ef0b8b56c181d72e4a8a52cac2b086ff46da3b0e8e717540000000000ffffffff328508dde9ddae61743c8f694a3d810e1ef2b9544c5b8675a57caaa02e94e84c0100000000ffffffff47863cd28eb01f043745ca6278d685889cb39dbf4808b6ef19b0f6165385653f0100000000ffffffff7d5016096b4e119c498433814b677236cf10346f05976771b1c7de110ec511060000000000ffffffff020084d7170000000017a914d3ed9ebfb65319f87bb0118b2833fa807b09533687bcd1f5050000000016001409126b9062edcc40d35493f12e5bda5341cc79b802483045022100e9b6b683ce166141f7c06cc66bc98f38cde81b4166e9774bfa31995d62fe046a02207190a717ce23db95d78210f76063fedafdfe99570f8e8c7071e3d36b8f8c1b5e0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d302483045022100dba43be1c79731a3be1679e9a4093b64bc8821b7e8efd076a5dc03d03a1d68fa0220549c6d80e3444ee44a73984fbedec590d03f7d211a059caf754f49337d47680b0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30247304402201e7a15c1dea8be5a1e5c72886b866f9645ea5887204bcaec5d2fb6b39533fe8f022048f2ad6fbc7c67b0f84b2443595682ccb8e0a2ba92c4dcf5d44554490c9df7e80121028956ac1b7d13f400ec3f156e0fbecfd577e1c1d259c68a164a83ebf9bb9f886002473044022036aa6f1887e9b0c8f99a1752abf19d96d720d184e46576cbffa3a24710e4e30302202e19a445b295377a20c3c0eda05ad808acbf8465e39f3dd29c367eafff18c5bc0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30248304502210092ec4e1cbf27393cd12d4c6930cd4969baa96f8a33e38224f551571f78c139e802200857ca8fb1edbe4d8a3a088b0cd920ac284545cd62edb6cf10f6238d4bc7d9e90121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d347a00a00010000000001019da9abf11a12dc6c29c342162529a3177752bb451425e18910b9bb495a8debf80800000017160014441cefe68ff31d3053d23c548bd0d0cc64296c570000000002002d31010000000017a914ddb688d2da1464553301eaa854c037f22605672b87611d54010000000017a91465a2bf3f2fa7d712791109afc99f26246e998f9987024830450221009aa02541671f404beb012893b989d6d53eb042c0bacd61d1e025695896da191d02203c41dba38167c5976c886db6a7dc6fa6b65a16c27086830286c07858b99f9cea0121029dc352f19c2100107731d955f929102197d671a3590ce4ec3e151e38e13eeb650000000001000000000101b9bd0fa9e77045d54b1259fe6e93122df5c00de29475ad265afce57dc24a99e500000000171600145d044cc5c5610f78dc687282f5c150897f3b81fbfdffffff0282d101000000000017a9140979c8801f449b1012aada7af23e9ee1ead0d4dc87e09304000000000017a914d179198172187f9b75ec364ba200449751d70f0a87024730440220010116fa749a5e35afedb9d30814d4e612bd2360e8b7639ec073b0a8dbd4d03e02206aee301faf79cc6d473ae4f06c69db31ba9f4645c3fecb5016e6b5d5cf42b86b01210208634edcf947babdcc0ddfcec58d2d2151e3a967b457295a06812cf8b488d8f048a00a0001000000000101eb910fbea2a979f0b56bee878d4508d92a5a3572ff00b9e4f0b5c2a424556ff101000000171600142c131e37bd149f0edae86c5f20bb8b41d87c4fe20000000002902904010000000017a914de46c3790f61e5e8562d101324c30a1844e497a387d058f3000000000017a914cd1ad4365fcd95c9082e9ffe59728e2c54f84132870247304402200ee62113a99deaa4efee89a892eaab52e2a4dbfef1858fec6bea543cf393e5fd02201faca5fc22c5503852b43a78f03f4a6143a6c750e99620abe300bab6be958aa3012102d0b759f43404c53410d908af8334577b98535e7042a7aa673b88d937f6ff8c82000000000100000000010104fb82d3adb1267670889e2f8496b50fc87c8628605260cb9842a2f90ecdf30c010000001716001491ca122fd33f62a3ce3e9da71d0e7558f95484d20000000002212a11000000000017a914f79bbc710a53884306b40a72178be06b51921aaf87541800000000000017a9147e2477cfdcd479862733857ec5c13fa813bb44ce870247304402202fd09ad1d33164858d897c825c17e1f49f347653863fd1855f369f7209bc139702204bda20763dcc9bc6c23a883d7329f2de359e322b12943c8c4ff8317efdd58eee01210327992febab0a64b00ffe82833953891b4402a8c0437bda7cb895323912ef2b060000000001000000000101cd544d84623d875eed891905935b11dca5293333c784a11c0b5989f5b2b7888b0100000017160014870bd6e74de38f60f9f65c2691d14b1b5db15303ffffffff02ecd909000000000017a9148d155144dda3227bdce55b93bb5318bcd35421e187530126000000000017a9140c17a74f2bfa8ee4ba96e04d708fb83678c68555870248304502210095c73e55ff3bd31a744ddf35c52e36798cf97df54872af68b6ea4150a6955abb02204cd1c8cb111f8c62b921591f66d8932ec8dce894327715c6121fd345c86971fa012102cf27b4635abaff7b9ea09bbeed79ab49b9e0fbbc8a0845639ba89e7aff334bfb00000000010000000001017616b53dd55bd5784fa3292f54a14ea361711ffea4f2cf047f075199d79c3c490100000017160014ba877e7520f1906cc4d567ba4a53f57d874cfa47000000000288d910000000000017a914fc94f4fcd462b177b30ae0c25c0f3539cf5fb4e787313278000000000017a914cc9111d3a5242e23ee11719c362d73d4975947ee8702483045022100e61e90c264a411bf73d690217bfc9c47fb61224859f90def58a4fadff2df98b002207132e66befcbf616cd5745d1b9f5c02d0dd29498a931ff71f054354daa1b9e1001210277d3657cd155615716be6060e76df6133eb13a4be5b367a891ad94ba725ffbb80000000001000000000101f925a451a634d65bdd65c57a03862147d3187e388900127b99de287c595e554201000000171600147adde77145b8cc89b1be55a6511d2ba35c60c21f000000000202fd6f000000000017a91446a902446e8e6562112b986249871542828c3ae487094abb000000000017a9143ea47d0567df1db12fce97181328deb4265f32928702473044022040eeeaeaad9bb03ca57eeb533ffed287d8635654b8b7f7c8bc44d535b8305a3102207a1d25986eddeb76edc3882b4bfd52539f35cd5b0bf5fe9a1feab165a3e8cc7c0121026de866565eb8bdb50638c058a0013c5ba00453b101d938fdf4c374e0c50e6d650000000001000000000101b02f61d0beb5669e72909956e0fc07d0d15c9378dc84ea138abbefbfce33877f0100000017160014dd2c8a995e63724578b0fd0fcde4d5565b84a141000000000237c90b000000000017a914c276bdaa28d76e52eec78ebec10d153c2bb96226870ba21e000000000017a91437546e307d5394fc39b88e84fb3a6b74ca8ea1c18702483045022100acb361a184165f2b1c06a0d39410ed529595593f5740f6d840146806c5f95d34022002c0cc8e1150c9e83fb193ef828d75bba5ed686004688259378447a00d141d9f012103085215184a56416f0957c13143fc509d0b1bf0f6e0c93f831c35158bc39b7d8f0000000001000000000101100334dfa5fa3c4fe7bddda988c2bd1c324cb8ad6692d85acfdc66b42f32691f07000000171600149118aa85b410713e8b3d9ca5f5083b68ed76eeaefdffffff02389601000000000017a9147e2060eacf3ecbee6bc2a0304d2cdba448ccc3f787f04902000000000017a914db836d1325befee7e00eb189ab80aa7a7185f3ee870247304402202bf13466d95ee18da71d1a15ab8e419696cbd8ccfd9b2ee0ef0b16456be67b0a02206e2eb5c91f1a8df36e794b0fdb8264b42dcd390228e0edd7246dff0059c62d4d01210241b40706c8437d30f427fe0c65092a99e610103910a3631a57de45ba011d253b46a00a0001000000000101b5d8aa3d2072a02c19c9b1a8e00e40be09738bbdaa7cafd3bda40b0a726f367c010000001716001490df1f91f347faebe20b1e5ace2ac12ce41c1b31ffffffff02fc2703000000000017a914058390916e3787cb1c7a52692ab50a25561f336b87bbb5d7000000000017a914ccc140980f7ba6c4e3ce443047d88bf8740189918702483045022100b67e10b21cb510db15ad1f625a8e88f4d5bdb1d6c8c621e6020a7991714346fa02203974885f3a6e96ec041169368706c0cc79c4f9088f3ee224026b9854fb2e98ae012103e9bb8ab3d4042c6d27b1ba94ecd0445ae2ba18abc5f388d1edc97443d18a5102000000000100000000010107175616be18836d21ad22df69512e56a3d593e975983b6cc599d890bdf962a20100000017160014f9a0aebd69b408b903b121f0730f8ab67d07b2bc0000000002c77800000000000017a91497b205bc6af88ec82dd31ce36e0384bef3c4b702874d5500000000000017a914744b45af708643a77094ba6a94638c64c0493e7d870247304402203ede23dde8060f1be288e0c6f70a7e79fb7f0142a86442e5ed8ec70920c6772c022008f96eaea6e859f18b96d4e790cfb53c1ad7aa7196e6f515c9f2ec7ae5fc700e01210352502e0a0ecf2704e4f781fcad0f37204a89d2e6157ccb110d23e50e81bbaf8b0000000001000000000101c83b2da45a19b604d5249b78befd2c6227f20fa13e3f757205032920283f37af1600000017160014827f293f22d4d35a5f8c95f89c7c5a471651bb07fdffffff02908c01000000000017a914df610f3adf1b18e2f8d270c71ed54796b77673c287784c0b000000000017a9149d8086a42d52d66781a538d9b3463eb1f7f171c4870247304402207cdcc870ab8b20563d88c1b411fc8bc5a74c76600d2098092c67a91c55d5d1aa022031856450dcc4f9f4c7ec5d67c9c96196ebb860e0d8b45002e7eee1529aa48818012102979f2e0265b1c7c892ad0131ff3279ae4d47c4b32e87c33a4eb4c9871ccfeb5a47a00a00010000000001103ca3b9f712666dc6f2d8749de913ed9c2d9a91c8d35501bc8a6681c1d178a20d22000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff56e772e755e7bd981409ec9f03a3b3b6663929fd8dbfe4f1fed529f968d73e0f05000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff4b1dd2c8362df900d008ffcc37a62be17859622ec2f7c649c6ef3c9ba15dab2400000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff8e83ac16911c4fecd4469073b9116a868090fd8f4c23d24dada28fc9dc491f280500000017160014e2e7c07c8079b85ef7f3188c4055f401f6217975ffffffffb0e29a22476805a571dec36037bef31d47873253b02cc0976213246665ef713104000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff048a1e3d459db9e5ad1f39f973d2e7d6fa725ae78123103dd23c519c315c8e3b00000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff9ec553d471e69504dce4cc2aec22d68fbba123b2750572bc2ec208e7ba6e0e4b00000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffffcbbd1cfd01f03f06f48a207efc9742e22c0bee910b1c9b9377a44d4980a7466406000000171600145f042d257fe2b2ec5613859c4d7b7f24c4a013ccffffffffef5704ba001eef7e56fe7817f8dc19325e021b98c646ac1769197545833d3e6e01000000171600140f5e3e041e7065396afb4e6fa73b40e66712eeacffffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b1127500000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffffc4d7c561e22f5ed851d182cd39b95caebadaf2cc82292ed8790b16f532b9c29f01000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff78f8a6a45b9f3a6d38c2d8dc660934b666b13bea2273312d2ab119adb0adf8b402000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff8689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd04000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff49307451403b5fdd3cddc2da6d17e874a6573a2ad0f5a03af03f73165a0990c800000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff506b504455e6c7737b798ccfc5c155f4db519f4e8ee380cdbb513fcc6c20e0dc0300000017160014e2e7c07c8079b85ef7f3188c4055f401f6217975ffffffff67977947bf09d47a9f2af989a91b138535fbd21acf677f0a3963f39e6031e4df0000000017160014a4180631d0d4611b7bd9f60ce0695626a581184effffffff01630ebe020000000017a9149aa89177d9aabaaffa19c638207e1bae4bccb2d58702483045022100c00d9bc1f269719655dc03aea135c5d020a2afd5cefc451ca3d1d266d4fcb425022009640d685f6ebf6120dda7b5c5b108c0d376c987742fae37b402dec7ef6a4cad012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100ec8d1a09745d2ce0205601fc6bd920c6d243d140724afade079adadae41406e702206c8b638e7cf3dcfa3a4a7300899744240fe03465630ddd1737ca4d12885752ec012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100c7a07324377e06924c8994834e813856aeda9e5053e8846cb33febbd75b5834002207f9726ee5f1fbbbd965f968310035da2fe4b1507587139acf82a592de2215592012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100cabdd796c8495c82004ba1ffbcdc91df03bbe2b75e9ac75f021f258c0a1a15fb022042a59988d3e57e08a827dd5e359c42628439aa6a7fcb7387e5c3b41123fb99b4012103075318765aa6da8a8749a140b3377e61ebce2034c1d58dd493f135b50096b28f02483045022100c0c32daad90b097862decc9c4499f5f9534b42439fe5d69d679d6663a881a7dd02201e4569233adbac1084bce7480c54246f00f2e3bd832b01190a9387eba039ce79012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100c125ee419fab4b790fb619bab6ce9cb9716b4f8a370483ae594b96914468e8010220033b67b0d30aa8ac84b2ef564a1cfc9934e8ccca080cc905340c43b1b37e6cda012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022000e10412297149c918891942b93ac76695220910ee285aeea9834abc1df2750502201cadb333a3d99fb5792518889dd34e2658994562952ea6abdf2b6e7bc946759d012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a0247304402206fe29c733d69ae7e07ba5ac9515c12b33e29cb835e48c1e961cb86605d7d6be30220635e9523b7c10223325cf45e370e51685996d5e1c2a054264d15ee503e2acb470121024d1365d5d94bf7ecb269f20e583c922612ea18027cd62cc893542be4bd8abe330248304502210088f8494516bd6f81202a3bf07a467804a5d7cb7928ad6f6464f7575feb014f6d02203ba5912c30edf9e70341617cbea79aa7d9647f28e0de4ee4dd387590772156fe0121023a9968a4b863ffe3974e8163e020436bc7af2e117eaefd3d6bb9492c9cc178bb024730440220146df3ae02346d7755d81dc25f6f368b1a6c308c52464fe4b3338c5a22de3d8d02207d7e6f18aa47f3fb0dbd543b3debc7d338cd513ce92d0d0f56016e5b6cc03871012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022029abb86bcb5b3eb8e06d9a845e16c55a8287d7daeef628a6549ce1057dc947bc0220729e1bb8d9bdc7c8a471cad784f5747ba8eef2496f83fb73d826dd8d9d4e88d1012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022030256bd7ddb455bc071db234f813bdb69c497b58ce2de71d376c53eae8658ea30220028b42e5032ceab7f64fc863b49f8f70f81497e71de54c4033b9526076e1f9f6012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a0247304402202b49996868edbc5e63c1c20c334af2df026da25abb8d3e933bfe73f8758efb1e0220215dd1c289babe3d0720f870a76854c0644e18f7838a4b175e6ba2c221aa8f38012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a0247304402207273f3d8065fee6a5826b713a6300abc69ad9f430762de1b30cb821c3c9b55b402201fa1f5cfc8939609ba5dedf76e76afd2c4ffbcde1c395c0f3542bd590551c5d1012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022014294e5de65509edbf550dd1e53b4f411128b53c5865c61e8cf473abc9d6e08702201c9f20c9ba22a2c1ff31ff0b99994b2ef6c81b4be1a8e07bbc1263aca1f71456012103075318765aa6da8a8749a140b3377e61ebce2034c1d58dd493f135b50096b28f0247304402202cac3a4da0c190a7c6d51287fd2ff7bbd8f35ccc8fe9e4120524189df45a317e02200b060445b5250301f2abc45b7c4232f88f9ee68615215e6e431285ed4914e94e0121024d66c487558614161f337bc84ae96625030d9bcba544a26cf5e2498f731572170000000001000000000102bcf9a969f870e830a56e659014d72a00bf9f27958777faf9dded2342ffc7361f0a000000171600147eaec455269a540ec1fd03512420fd2258d880eeffffffff4c9d79cd4a2c5513754066d890f34f75cdb6abbd0c7c37881ca15efdbd29553800000000171600142e4a4979696bee7d8ed78a87aeebc9d8a8507bedffffffff0254d425050000000017a914b7b2258bf2b5cf0f8b7b98d682fadbe0a6babe2987385eb0070000000017a9141ae9824920cac8474e659f629d7ecc479aec33da870247304402200a9cfbe275fe779efdcb7142b6b323b240145c5680b6fd90c75239144a5f932702204bf418b7de693184b35e6d58b0b549ec10985bf3a23cd6226e7b121fb7456e950121037cb2ddbeeec174fa94e4691e0409fcbd7cde4bc73cef7f6123ccae96e8d216ff024730440220154266cd561436ee677c62873b4d898644423f16c98c5f9b3867c50fc7d9fecb02206803dd44463c0d03efcb72c054bcdec184ddae2f25427e086dd430c5596d7f6901210262f86dabb2593bfbb15aa50105e69256900752cb40fa6cddadc56f2a477b13a20000000001000000000106235d74103c1700816bcaf927da7d9e8a3fc0c8aa3a76d9bd8ff815fe28116f160000000017160014766990f0bc0a1ac1ba588fbd67e3d394d5d28204ffffffff67204573f5fd81eb0d6441ea19d1208aeeaf490a58bae3c53b912bf451fdc7163e00000017160014fe3b6135200be446f07c1ed2eda07072c5a405e8ffffffff8d2135d60c5dc553e9d1ef842c9bb11a9fd8e016d33fade544c70e7c5b07949e00000000171600148e0fddc5bb4cb55edb2829ec45f949834b16369fffffffff004ecdbd070b5b9dbcc98036e934489135205375bd8499e18a1106dd43f5f0f53800000017160014b81f36b2db9c7fbb6b1ca9b71dd778ea072335d7ffffffffc9df2f405cebc5f0071793deaf1b8084359af5477753b3cd43b5991b3eee1df607000000171600140a9fecbb95aedd98a4593697c85dd7ead00a8be3ffffffffe72309331e766bbd693a85a7957733062d5cf4ce8b5ac4fc0d85d25fc29ff5fd25000000171600145fe0f5e628d331b26826838b44f7975efd3f86dbffffffff01dce6e4070000000017a9141ae9824920cac8474e659f629d7ecc479aec33da870247304402206d758db6c8161d45af265aba9ceea43d4278bccce56107d7072046bd11173ae702206e6ca216dce66f6a8f74ec8e2ab1a46c604addd977c703e4056e7becea7266ac01210214fcda8138e2a0573139e7215077b8ef3e97197f303a7b0892230b813e6e318c02483045022100f4ebbb648404b86f3abcd70bc0a8c1dc529614de84ece9b202b1b0b4da409f7002203136b5c6e07b324cc1c3237839ce0e768fe31272b3746ac8881b05db77e0be900121020f6b52192b5830c765bcc9a27012744fc40d834dbd5934b782b9fcf60f6c4f07024830450221008adbe11b0ecaee18ff0f857efb7546ce806b6bf3e81670c9cc6fc14c3514ab87022013ff6bfd1addbfa128031d64788ed6d96f38087ad46dbeddc11cc4761cfbdabf012103967a110bb603c0c9389e1f294931184b35e17a234fc17bca7e09272c5c5454ba0247304402205437b3a3a75d7493aa121dd4e0f1ef8545f069583d7ad01f9fc3c27b5f2abdd20220661d3dbdddb7f3fbfebbc6e19197da2c592ede771fcf3980d06a232cd6141d9801210292e3f9309b0b3da9966a429272ee19f2cef9d2dce8934a9dad0c6da7cdb4137e0247304402203979dd273b3614cdc175e415e59f1fb4d6d13117a501794d36b6e899d369e6e702205a06af08197e99b22c362ce7d323a107a6ce341c808520537eba3fc161a5b54601210395e43c5ba53dc4df3fb68aa3100a9dc9e6450c6aadbbe8d54d17796f62ffa74902483045022100b5f7b8f863f0cefeca7effad31a5cfa894fc851a5cf2780269f03bcb427d9ab702205ddab5a8302cb0215c135f4383ba33abb3f1780c14995e4df3b1cfb71ea11a89012102facfa581d2f539dcd6fd2180985403944b9b8ce906f3e8eb6fcf1d9437fe4ae90000000001000000000102ba101d470892fe991c5efa1b7e68fe44c0dfe3e2709be09cbbd4c525379bd5ac020000001716001435048d0d833ded16a5e10cea020e9a5f922f8f39fdffffff322361c0ebeaab396e27a36b873bbce43efca88e126b556e83075f30643c15ff00000000171600140952cfe0671e5eb526bd466d0e4de3ac42e27866fdffffff024f0f00000000000017a91431625e7c6afca364f93b04ea27f8c4e1b90f840b877064080000000000160014b9a8972085abe757891f416b37f240a74bdb702b0247304402200e3c72de8ad278de2f52befa6254e6295602a8ad3674ac53af56e065fb44c4ec02203b12c62ff97b19edfc6501be2ddd4181b06f1a46d8b5e101c439d0a76c6db2db0121032a880ef8ecdfc2a7cc011e5d5ac94f38db55b56a83d0370bf72b6fe7326f2acb02473044022018a96db826875621f7aed6d38c6ad509846399c7b75dbc9cd64e39b76a5008760220300973cf965c6c46c5af74b087a895d02d8f670b10b07c62713cd9db2080aba90121037fe4b88712741841461ad937bfc580cb0a186b4cc43dca1fac94c1c85736b2a100000000010000000001024837ae6698d2c09e8963cc64570edf1c773ed69c0e6626532f235070196a753f000000001716001496b24fd78e0c60c941614cb59bc6f9d9e0e3791dffffffff0bc2015dbffe40a53b8512b5477317ab8a2e2d391991cea5430aefc03f8b38b401000000171600143d6a0b0c364bc1d71d8adfbc0ca6310466911b70ffffffff02da3e0a000000000017a9140e8f395a8f992ccdd0e785763fe98d2c4fb3276f871f8030000000000016001435c8b8655cb6a69d0a33e28dcb6d47b9a434d681024730440220615825af1f87f9d6bef3e7dcc8584529246e9b320c0764d33935dd4b11b36f1302205028aa42b953a3a41937e57fe403a1268a44b2c8ac84bdf72bbf2f41217402b6012103c8068599c1f1e49b3d27b963ffebca1510ed4793d7954845dc764d7b7f48e8e90247304402202926cf2ea134cda05167d9680a9820a1f7ee695121d1452bbd9e907f6d0ed12e02203416c496202cc40ed5ff5cfde5644de37670c263066a627b1a36f02632c5c0b70121028000935bf8c70e288f98e1c262c93c23386659b802db462ee20ce91b90c4ac1a0000000001000000000108c2cdbf0f1919a3c7f86fe349121bc5fa031cfeb2729115ace9a5968ffca9f100090000001716001434f6b9c447d2724e6617d807c460d5a543d183abffffffff1dbe7a64d8d745c3ca71695b4df373dbe396cfc2a95aa32f482dda31908041160700000017160014a3a05c19226b120401ddf3deedae476db55adbf9ffffffffd91884c9edbda3e096a8c51c87191f3332b75812b40b1b3c154dd67c2517e3590000000017160014acd82ad41118b7e71008c633945e989ea761cbbdffffffff2e6469dfafb1993ffea2d7a70e14a85619a57a3156ec4729ee482ca1ca13c15f0700000017160014f31ee0592eb99158ba1dd75f6b3557722fbdc3c1ffffffff8d0976a73e7b35c6590a98f9000081a662c3b2a88ceb02d0d893765dee8ec59e0a0000001716001447b099e583c47782624adaf26f58565fb5e1c7d4ffffffffb959873dfc30bc8a2a5b1c4529761274d03e253a476e705d8f94f331512ff5b70500000017160014f31ee0592eb99158ba1dd75f6b3557722fbdc3c1ffffffffdfc9769d7cba14ffb0cfa0f7f8d3bce3bc98c7dcc244d65182c7296dcbcc6ec30c00000017160014fcda19be9bb23202db5a8c09bb1e6fd977bd01b7ffffffff413dbdc5b6156a63399f30ce1146dc7c71a63f5e32602af1fcb593711c57e0da100000001716001455c728c9943cc44457651542b991d54ebc3eb27dffffffff01a96f59040000000017a914684d2388fa75d3c932e75db6c4c304736616a0e8870247304402206596638e83e72794a2846786a0a8065fd9e7a856ab2f83507de45a6088f129cb02206d58b9d8f248adec016e7e168cc7074da8fc77f7cea39f28946b36536ee1d27d012103b4b8f52755ee63c1845a36b7ae97054f6e906fbd001915c7251716042a42fe54024830450221009958cd91081d683e9625b169fe1e0910238ceeb58d438aa49902405cbcbf9bcc0220343cba1c31d0c2b95b439c57a58f9b6d344d23c79c11633368f974a37e05553501210274c835c15dfccd0c93dd13320392c719817a681df2ba15a0db8e6e1bc9a4319102483045022100885df3f939fc146df57c5f0bb93b81d58d633d32a6bafad03072f89b36cc31330220362d7b961116b92865aad083cccfebc00715484f54dc73943be11d7809e6579b012103d1f3e1f97ab731285a2fac22bb65fee8df27ddcf74428a022d053619b792069602473044022010ebea12ff14b0904b1399d95549ccd586ccde6cdbe9dc029c664a33d52cd9ff02201c88b626be63c70dfcdcadbf0b1203621d5147ad91ccbb00bcd0ce437d2298790121036179dc5228db52d45dbf800ccf08118299400ab2743f887dda1930f2bd6f9a0a02483045022100dd10b39895d60b8290dccd86666c7d44530ce9316f1813d20736a8e16586d0e5022002a5028021d19cf8fc078c2d6763c07dea374f8f46a7c5fb79afc3e4825e48c7012103ce180edf64fe3e71d17d533bd394114499a0883f9428fa0180558358d2a35d4702473044022035b5a4af5c791ccb06767c9eb18c92a524023c143a35fa23b9e8c1c03c6c6eb902205c0c41b8b24e28b09a485dd0e7faecc5d22da31ab4f0234b594eab6879cbf65b0121036179dc5228db52d45dbf800ccf08118299400ab2743f887dda1930f2bd6f9a0a02483045022100faa44f474f20ff5188188d342671cdbb278809c83ed20b58e06d29890dc72621022078bddb46af7c992d6fd6cdc3acca719ab60a92359eeec004110d79f742ae5715012102547c2bf2e1de76dc47efa1a1bf705ba43affea5b9338f582a2f08671a2a30c5a0247304402200531a9fee86f13f933c54386678a06af6eeb69b91722570c3bb87cd534d240f5022051f3a4224b7060b659e52dafd85d478e69cb0fdb62ebbd16cee95b372760629f0121023dabcd6f67422eba4d7b8191e09ec003c4e6050ad9eaf36a04561e5c774a326200000000020000000001023b491229cc79e87ab9767c589de167bcadc166ffd53589cc9400b53dbd807f56040000001716001482f4e0a69e0584768d80c6248f5490a16f61ee6ffeffffff2ad5a648b3b647448ac087fce93bb0a6f101aef53afc4aa07fc1e8a6d87f94635b02000017160014ae2557581c8d9ce125ea3a3dff27507c3c952adafeffffff029a4b0100000000001976a9140f158a7c91d760cf07e5a576c3209f95d78cce5888acb77108000000000017a914fc6776dddaeeb85bce777cc975c334494c35e88d870247304402206edc33c5611dc6455b15716c43af76f9f7f7dcce9db92dd73dbb06e9bc3d9ef1022076406e959deeacec1315589eb1f179d21c11802cd49981641d84f9685c9549970121033c7421180ee7faca08e5aff72316e295cc775e7ab770e1e69ae7ff119d544b6402473044022047047eae32b0f176753f9cf7f379be118767794699a446ca5e50c1bddd4cc85402200998aa3dd53f3355707eb55a778068537d94b199a39e33ec7bfe1c1db6c5439b0121039550b790a670395cb81f85273d07682937d1d8aba9a9750434c04f748766509648a00a0001000000000101181cca9ad1094832f4d6edfef0886fb3bf716428b9014d3d0bc36c898352919d0000000000ffffffff03881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d873fae01000000000017a914b00a58465efda6fbaefbea9595232141044f900f87370609000000000016001428f7082bb964a4376cd52356e8e52e966e8e8a0502483045022100c5ed195d300c5cfd71721661f465be44ca9adb45e59b158f78a9aaebe0e6d27b02205818933d959aa6ee54168b64e9fb1e6ab964123daed70c9394a0dbafc336dbb8012103ddff5a2d03bba8c1cbbab4380f66c21704792d47607cf44fa4ebb68ba35941590000000001000000000101a3c8084f440de5b0cd1b52c6b571b2f0a6c74f9b145153b0d48254346536b9600900000000ffffffff03881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d8739d510000000000017a914af04995d140909ce765403ef693e0f3181b4413c8754c44400000000001600144b3e71e72cef83ed3ffe79664d85f906532b930802483045022100c3a55c2dbdf37e7e3d4fd5c573c276df328f0eb8fbb8e1b0f3d54eaaee48342f0220076faaf1653e71f3b4012ca75f1e7498d9bdc3563ae86fc092d91ae6da068dae012102c1002c0a0adc8a7ed1c296857015bf12ce20a9f6fa110aa46fce64c6de845f7c00000000010000000001022e3f47fa3b9e6655863eb111f07b388468e20c150eda90305aa21afdfe39d616110100000000000000c05cd4e6785668aef6f16766431ab96e052f874f3b98194e372cc4ed5217d336d9040000000000000001b76318000000000016001439bbee5b28c03da7ed58bdad468665e551faf5f1024830450221009bdc7d0c7929234aac5d95a343843dbc4fd0717dc34bbab48d36740f5aab7a800220573ea7274ffe1fa6a9f32ed4987c85eb3b38e81e6d340eb871ceab97d9085644012103261ea7dbfd1723f1ef61c6a4cc0137ca8d56bdcdfbc2ccc6d685a9cfac8c096c0247304402206fd0ddc04420d16049c07e2aab0e32aa9b76e3859bf435dccc384d49b26b00f1022044dcd7c26d8373c437709bec16c1703142bd943c7043dffa076162a9c98d2553012103261ea7dbfd1723f1ef61c6a4cc0137ca8d56bdcdfbc2ccc6d685a9cfac8c096c000000000100000000010866eeb4b9d7956c9808ef035b8595dca88e9d4b665dda24ebf4a934950930f9020000000017160014a6b2aac285e4d4aeeee55460eb7b203ec2820d6dffffffff68c89dfcb366f5307ca2b1bf4262c71ad314d2ecf013530f685e6428bef85a3709000000171600142857e371952618ae9a00a433dd0446edc2e71742ffffffffb5042515d0c953d4407f587958c282cd28b1204dc0630d1dd3858b3d59d8214e230000001716001437382c6137e92c2b9154fb6c15e42be27cb692feffffffff16eaa3b3b0d38fe8f1bae966f1dbf1b2613f79b4ec253ed314535faf22f2515707000000171600140cc55378ac404efe509d101ae8bd75cb3eccf217ffffffff9d72f9815cec927963f132ea970d464aa3b44888adaefe911a58427b5e33855c0500000017160014e2a6bf3284cb816d8d88ec6622265e7c0d800df5ffffffffb7a3d924a342e8259eb56baa12b420a9c248aa20e1428695af2ceb4eaf39326a1100000017160014e2a6bf3284cb816d8d88ec6622265e7c0d800df5ffffffff6b7b48630848cbeb7df1505abdcf1b691f8770eea8f622e98f1fc8316497986b000000001716001437382c6137e92c2b9154fb6c15e42be27cb692feffffffff6e85e5769ff4d219dc3529bebe880cbb81693205148676ba9935bb61f99ea6e00b000000171600142857e371952618ae9a00a433dd0446edc2e71742ffffffff02ed2a5d000000000017a914df6384ac4924369539ece6d6e932373409c94873874aba180c000000001976a914ccda8941e697ed4f2f317fd64f380a201e58dc7b88ac024730440220213ed5335f738568522d09cb788ebd8ebba3f4b02bed2b1a2761a6cdd0f8e74a022032dfab49bfd002d3558e805a14ad1d4334a86419e53d784db99cdc2cdc7b9c370121030b2d0c662418a3473395d20d38b71e62cd0d89c26b572c536336634ed8946b64024730440220606412c827f11a9463660bf37280156d295fa798f9ac55f9dd542a1e8bd6a41b022039b569f33ab780559319599bd04c8ff08fdcb6df4293cfe122baf4d952babdbc0121025d3f78b745ae5d1221eb57817f8bd16551ca4f112e2de4f788f2c51afed1eacf024830450221009936f0567973fd3ed7db82ddb38fb14d26fed2d5ca6194cb9fac7fec096a4f0702202f6538ac1f10c74186aa3d2ca537baa3b1790b265d56085b529c12a41c7c4f4001210344a5897b6060e7c66f4d7694326a5ab222e2ae4e7fadb9f45f8e4e906b4ca51c02483045022100e57bbe6d32485c24ec547f14226befb657165cca00e39ed316b2e1153cd30e410220116d95db0d5a83998bcca878f67360eb46d1dfcc21d7c01b676472af189295fd01210248984a5b881ad1ba2b166d5a82576f7fc255eeaad5cbf19be80be654cfbb066602473044022009eaaeaa8c18d061a47e96d136ea92a21476a585e1308fb30af57cd6ff57438e02203175bc0183139b900ab47f1945d0bf13c53510e8de0fd3d18a0434e234bb2dd6012102b8559f6297f24f6014a6e653391af8ec8d7019bab8927bb06b622f399845fb1a02473044022051defdede8848a7a2353ad56fce7f866c4dc6a600759507c669d9378baad1c1902206aba44d6bad2e8fd196005abc6236983e2a05fcf471ebffc9a66767749f08c32012102b8559f6297f24f6014a6e653391af8ec8d7019bab8927bb06b622f399845fb1a024730440220705b72912478c162f00fd23dc577206e6d627e319724ee153e5dfbda811e8172022038cbe0d65ff8b14ee3a27e1dccaf13cbec3e524117ec8dfa20dde07d992a96fc01210344a5897b6060e7c66f4d7694326a5ab222e2ae4e7fadb9f45f8e4e906b4ca51c02483045022100a3fa7602902ac166dfe4317e247b194819c139fc6780defd53b756a37866f6ac02201868036e054ef5776e34f5cbfcedde667fdc1ece1803e15865fb5d39f4774e000121025d3f78b745ae5d1221eb57817f8bd16551ca4f112e2de4f788f2c51afed1eacf000000000200000001144fa160a25efe88131525c6d05acad52396259d9074ab8c45232a84cc96257a01000000fc00473044022047cac1ff9ef7539d5e94596c3513c7a9a115c721130a886a83176a5cf22884de02204493dbecd86b61bcbf8805fb59dd70b5f2f72f3b1480807dc7bc570f4a319b1201473044022077e8093ab836d7f641ef48bda540bb98fcfed33facbcc1df7cb117b6c21b0259022022824ac02772006840f8cd7ca1d22ccc4c3ec0b76a05e9dc2cfba276af3e0a4f014c69522102c7b9525729dfd92702dd28bdfd4477e005cb023c98af0fc7ca994ed294b22e27210344ac5838131b30aa72246816bce64975c8de5ae309d1bc49b8942ec869ad4e302103c52d4daafc59ce8fab8a74a0292de319fe2f6226f803ba509ae4372f4265219253aefdffffff026a2008000000000017a9144bd1bfff7269b2d745becc8647e2e39ad3e1620887426722000000000017a914a845596702e75216503f110aab2169b44e92c6238747a00a00010000000001036bf57d080e81754200c92cf131b7964915d8a73b1022b871b173c840f61aae4a0100000000ffffffff18fc18acc62161ea6c8b66a8d183e88106b1155c6160d4cdca609369bee7f2680100000000ffffffff2993394cef221949400bf9a48a2b32868574fdab66f3c1bdb8bcb06f94d082570100000000ffffffff02803301000000000017a91414a1d6f15d28e2676920e145f642cb9fe764112387bd130000000000001600146546238487731a05330fdfab74732bf138ffeadf024730440220625f7d24d224655c42f2939baad17d431d3f89868e33de91e973c393f916fbb802200e18d5d8377b22059de71eb5a7f53ce9db0d7ce9654301b94f4da1862b84a09201210236faa8edf39257d39662abcf70f3a1e21a6fc01ba3e3cc0a8305dd0ecb13998d02483045022100e1ffcd32bd28e799bb23ec294728099e403a3f3141e0246788884d47ae023b46022079d92d19a793e3dbe04568f69eb1a37f625cf770ab5e5fb368a30e18d66fa6060121035686fe8bde8052606a47b153e4746a13b26936507c3f1c5608ca3969a64d4bbe0247304402206b4d475bc3c8ea37e9a2e3d6428d6a8a5e1706a38a4e8f5e8ac98ca45f5f2b7b022016cb339699ffaf4768661e2e89fa198b559daf037ba0a54852810b895f0633d3012103636c2003dd3f3d8882bcb65b149a2933f892238b4e8c3480df9f08bd631e144b0000000001000000019a9dda5c3dd0d9c5a10eb1147091587a5f15eac34e8b71f5256cd1b21ed80aa7040000006b483045022100c6eaca04db04d9796010bf329e71a30e53fce1e2e24dcdf266eb1843e3cb320a022037e008c1143509f95c44cebe03845f398fdcf76b0df53cb486606a7895f44d97012103898daf21d93485dbc20403ed293af473e36a83ef2ffa6a414559513abd5b87379bffffff01425c11000000000017a914327104ffe19f0d6845423d47a38e3dd6c0dcdd2987000000000100000001094b74a06877f3d26350bbf555183b9be5bcec360e165629b280895f40751bcf11000000fc00473044022013348a20f8f0a9fc3dbef5a0c16695e39c7b7567408b2925f3dca0ffa230d2d502200d20c952f62791be2b90a9b695049067fa86d940b305f3c93b3ce596a8709ae40147304402204b14af4812fac4197279e5722d99f4a111f981bd7acb41a390081b89442b6c9a022039502db1ba73a3848afb1410a69e020a8261425289cb3ce8b75e32728cf8538c014c695221038b3dbc78136c5ea0081bf97c3cfb3c3272a05f3675b72d4e7b934b34533634872103e216c971fd0eb56ec0cd0d38c5a28232190295580aa3b6aa8c1826b50eb8dc2621020c8ded4f2713f6250b4d479dafb94e0f94ab6eb97a9e1db5ed833edaf9cad55653aeffffffff0208a110020000000017a914884d70eb60c6ac9f09eb55b5ca684f6929de0af887470ab4020000000017a9147bf7f1d27d55587df74dcd5a9dec139387deb1e98747a00a000100000000010640564d459b8a807d5b8394c7d9153a6689aaebca9e0066ca7be32224e9cc65f1010000000000000000a47d1a47798dcc3bfcfed26a874b324da8408ea7aea7671f296078ff85b7cc982d00000000000000008939d1905bf5d11397037cc43ae6457126faa07af2e823cbe5fd13cc4184c05101000000000000000015ca4c30d508c0745761d53fc7470fa3c62d4c91536bda5b50259f6eeca6b94102000000000000000073d9980b2bc09318835abc1e059bd8cf49f81e0f69d4c975e414541127c421fa01000000000000000046bd019a745e29c59d3ae3c54d3570879c2df0a6e16f5ecea6077b8fff89bfad13000000000000000002002d31010000000017a914a9d362ed7a8fb37bf561e4bca9628065686e35eb87cb5f6a0000000000160014aff7bc32d46362426fa1795c8a29f4a56c36cf0b02483045022100f0d2e01671cd6ab7b81631ce422d5ba76a2ea5e26c7b28ff9a181a6a85f7ad2d0220726451c56d714063802e949d02e428bbc83f6ec33c5d5f922222547fcfb40c40012103ec69bf7fb14b301c60416cfe79a9f478930b916ea76da40abb4f21efd10eab3e0247304402203378a0587a263678a41c5476336785e31ba06218a8e0b3bcae16fc1864fa6eda02201bcc3a805af975ab91695e120f6349bb5c607aa459ce6d61f138a272f2a4d002012102f94b848400178688b0fc53687118dda8a15c9827fe25091a6d3094b2698ae5a302473044022058bb2341c31ca90071753c28aa9d8ebe2de52546aa465c725de1103f1435f25a02204110f9094a988080f0b7d266f38e0ae944659a3166901e0256a14a4f9be32fe50121039129667b2636a1983c7e5b74f06f04a7329f89fe47daaa18bd2d97a4ea84610402483045022100e3d50814a3fdbff29aeabb9023c1c09e5be2b97a92ddc424c36b4b272c16bf01022071d1c35b401ca9abdf88bf6fe475e7264d0536f65af0ebdab19802fbe7aebe3701210379f2fb2e182076872e7fda95077b96c9e1663a633dc63107b55f9000560bce3a02473044022076e8f76d94246a7dfba09e1a04e82554ab69c892b8857069010e9ae73e599d1902206d5ca944693bc3efecd57951413bf0640280af8a2613a14ca1d6a2d795ddce7601210379f2fb2e182076872e7fda95077b96c9e1663a633dc63107b55f9000560bce3a02473044022013bd718dea24f5f49bb7ba4bbfac095eca40dc434d11c23cd4a0a9c71a4e19c40220253d6ff54df7a6ed6f15fff0683ca721e1c42da82038d82dc4cfedbfae8a5cc3012102f1b31463dbae3332ba359c4ad63aaa5787f227f42137a8cf599c160690e23512000000000200000000010134878033e66e878c6aed493cec767beb60cb8406e677f492a1204dc09384d7820100000017160014d18971b263fc06096c38282224dafb7bada6a4d9ffffffff02be06040000000000160014012d0a6b2d4b33d71ffd1c94b0e04626e2101ac4811900000000000017a914481f4fea66c27c6aa7d4754f60c73602d7f7415a87024730440220427aff45d83f7075adf5c5183bbe83fd12e82af3f4c48bc777ea70dc29f8d4ca0220792f9b72229fbec7aa21a9069e5ccc5bd685296f4a698966bf9c7fdd4907f9aa012102ded653d8ecd207cd84862694bd1eeea677d626ce00f6ef177183ddbc4087ead70000000001000000000104f64d5ded35953ed59ebababdcade951b23dc4c06c1eeb192bd940529c0ebfd130000000023220020121a74eb2ca51e34a51684ee8181fd590e8d33638d60583fcf780e19f03d6bdcffffffff9240e9b121feeae1468dd89980b701d33130a37dcb6afc6ba08e4c293771e1ca3f00000023220020dc270ef2b5505ae43a1ba48731d77089085f711e32f6616833c9860efcdbd4c5ffffffffd9c7b844efb1c796e064b51f2a446110470223ff6a15e3f537f579c4154a28d500000000232200205dd9f9758c50fe49086d1a068db15c274b8bbcd4843fc7fa0fc2da2773cef5e3ffffffff893774c4387b02e3f9be48d2569a77773214b097059fea50ffa09429f12054f81000000023220020c0b3c9e4bac33d3f3b3cde3a9ccae912ce1174257c28ea8d9d84c2f7319960d6ffffffff01febf64000000000017a9146cca76b861ada64b12027a775c71635f53e843408704004830450221009c053fa00bcb2aafa31e96d79dafcfc368dfa25b7c3335aa11891052c63bfe5502202512774dddc843e78d5d66a610c99a6991e6caa4f2109eabe956203abf0d05820147304402204f4124b3c012fee549191b08070c472b8ea0b14612288b47216343f4f72d8bfd0220602f4fc3bb3cf1a68040704fea8fc4dd22aa739469f605e8f1bff9dd6584c8290169522103b9907aa4b4df7e761077f32017dba608a128f4bcc8c735a27d2c882ca7512ec02103fb5d28d102469eef3509b180b986064002d315c8058942ddd87107cf0dd5fd2821034999d2de58d76fbcb3013429f575b758350e2de337d6a94d080ca0d396f4398f53ae0400483045022100a6e3714a4efd71daec2b2dd600922779b41e16089f7f2a105fad409cda7adad40220184b766a3d7759c7cf57d11166e27905744a87b261ab4a77c49edd275348029f0147304402207d1e07f167a49d36b1c6946e0cefdd3bccae13cd9c9675c518fbdb98c1dcd7b30220587c4c6086a807aa6d98fc4d21d240998ddd182841ae579bf6e9a2c22ce062db0169522102181b8a9c59b658fb3d53ae9a76152225a7a22e713f8941ccfb349bafdc49a94a2103ea31aca5d9d96761a6a739183945108c55ab789182b1542dd2979fd1de7f146b2103d06651256073171b5b96b1e80eaa10aacad87fe2d1d39ab517437d62cdc27fb153ae040047304402202b7d3e1e6ebd0e7eeb052743b32e7cc790802a3ae3d559f8c0f7e701bb9dbddb02201134baae6cdd42ef6c70dbcb8d7fcb7daf2a859976c9c7ef37b5b291df102653014730440220502b2e2c0bb5e9000e559d250b6aa55edae63e7aaaaf8c6fa2662bb9608338d302207a2c42c48c136cfa35c4790163511d96897160225907fca526fda95a7908487f016952210262c788b04bf5a0b4fdbf4a953e099f6cc62ad470aaf4723d55c73eb8f831c62e2102906133c3b350ba8a2b9f4bbfc49f20af4a8f2048cef63ac4639bac8b1472216d21039ff32b0a2f18a528d7abbcd1035d816aee71859a5ffe09931d082c651c10cb0c53ae0400483045022100fc09b99e6a2bfbc5b3ae3f732e8ac304ed3c078ae62c06d0f6d1ee304673babe022076f0f5d1bb32c5c2320c7ae1091779e49e921d4aceccea4d15a0daa9dd09f2ac0147304402204706e4c16ac732d537a280123b4a8963114f4acda4ea7a72f6e1f1a6f6a3a0550220581a5700a4c11961747ba691e4804d71ad986ccf2a637f22a1968944be5067370169522102d3a80f63c373f338b8df5e11a90af67cad1c32aac7e7c44467276ff3cda719d621025f4d57dc25d14ea7f932bb750a007efb12e579d806c616afccc6fcb12e9a04772102e9762bb36d40c4dbb71f045f82fb5efd66237b037730d8984a1243509e3f973b53ae47a00a00020000000001016163be12f136e68ba8fb354b506d2d8a326777c7060c6816b1c4fed42108a641350000001716001464b74a46343fd407f7896abc5496eea9a6c6eb72fdffffff01405600000000000017a914029f5f834e35d78bbfb8695ffd834c7fe50f96348702473044022062eaf287d41c9e5d15864a2801d9bcfea152db3597115d1cb050d24ba52c56d4022053d66bfad545a7518cef42d767d88706351c4a3aa059db497aeb35c3d524e2cd01210361fb9db2ef72154ea06be7a997116e5eb676f6fda0d6451a059c2f40432a014847a00a0002000000012dde93fc0947c5b0ada3ca96965e4995d0b1db31459a3d9f5b1fa4be5597d9ea000000006a473044022077c9187f3ff1f443ce0c9615e39243004cd34abbf8ef002bce9c34577c024b7e022026d2799f935d511d24e483a0e76c813b0e8de6b9dea55efcc43d58986fe689300121029fa3224da31808681b1d810828024f93f8c90b02dbf12b3b33f64f56730a2568ffffffff0186fc0000000000001976a9141718ff9a56bd3a526055155c8e24a05e0f6cf2bf88ac000000000200000001fa336c4809e53224fa400435436ca001f5925ecc7c2feda779976f4c0bfdda16000000006b483045022100af5cf947207106088f6cf85fd17661815f9b612a84dca32ed78cda74cf32bef202203ae099c1e73df1fa25ecd296b610c4a31647f6616ec3af7cc58b7f785e40ca670121029fa3224da31808681b1d810828024f93f8c90b02dbf12b3b33f64f56730a2568ffffffff02178100000000000017a914e8c5f4d75954f690c1b84e4b3b68f6321474c98a872f760000000000001600143df9d732d0df6b35ddc9e63c811eef7c5903706b0000000001000000036fd277e55827f659a0230b7dffa719bf869216bdb4efe7509b5dcc5fd2ed435c010000006a473044022079fa4a309a07adf843dbd339f431d77b2f51c49f47e88b8c4f9f7fb5493ba8d5022021e98a9cf0c9970cfc5dd9d3dab2819a79d3292ab2fce5a660ca6a7274a9eb1e012102e102d5d6c10ea3017d485661849071487bf919681955587a27a41a77a871a2f79bffffffa9c5d31819ea17e89664298acd4b04e76c12c4e6a6e51cc9f249d30b562b484d000000006a47304402204168a306c8994da8bf395c1302954bdc93c18af3096d53bbf3b1fd9ed59526b4022005d7a1baaa105b5cb959e7e44f40afecb6ff332e18df8225df07ca5dc6ac435d012102472da842637189815421264b27e8a56a4aba4323f5603959bcfd7145682f9bd19bffffff23aa27ccf1bbd677cd72ee2ccc4dc45370b1ce3ec7ad1f567490f869dbd6bc472c0000006b483045022100d2d03197a4635ee4272fb22dba3479c4326125ca2c998b2e38b75ecbe355be900220223d817294a398c39f346661c9e792fe8105c9c8111030b47ca2dac3c705ff2f0121024b76a224de87b3c82e222558d28b19494e124231dcaaabc0ccd8ec67557687be9bffffff0218de04000000000017a9146c52735993857f55a0c90b38e1839011bae38c0687821d0000000000001976a914a30ff142de32fd828ce17a8778feb6df5526734d88ac00000000010000000001045aeef89233904e66772945b4d232be9faf3903675062d6d3ece46d89cfe5f06d000000000000000000d695d52bef9e854ba6680d65f6a1a5f3d22750d7bfb6c604349350ee82e533d5000000000000000000de67af6b2951de467c54d0f772d669cd7fd8f5731a74ec379be918cb22f0b30b0000000000000000000cb64082b4b4bc643d901b23de56ac67b418aa61a218fd4bc0e57e02b0e7672a00000000000000000001159a9801000000001600148277865c56400776bb2e74a9c175d2b076d4ed830248304502210091ca7723269286b657cdbd4a3a155533950e37fc1ea57c20d93d107ebee957b102205dafbeef806e01ae59369d33281189e4eab66b22615dfeffe34dc0bd07ac1e3801210249d0620cdcccf488a3b5a5293afb2bdb2254ca0479c91fe9ac870621df847b060247304402202871048deaa529c37ce9d390d1453a3fdf5e5f85febb8ba132cf388e983ec368022063aac49a14d3483f4e22ed64019a6922a697110c68089e301bc49b1659b7ff09012102a47cedce8363452bcb169cffe80eac3a16cd8423406a02ae3a46b9b3a585965e02473044022054cf228384cefe3a3e6bd05b9b47b58e0a44c7bb0a9d027793b871ce6d5b8c4d022054e5d05d4dac5f6c158f7098b678cfc540c876e15bf4f81722cf557d5050e8de01210372ed70f58c2354d42406bacdba5193d0b55e6b6ad52f120ec250c1008ba58db602483045022100c87ec33513e8ade5dbd12b1168b4707aa7614045935ba2a5f37e74d15ff7405e02203319874bc879786cd211956d7f9c1a86b0e811c464bcd06b8aed57d7cad8c442012102416938305fd429baf0155dd9ff6f2ad9ed4cbecd27ae24f030c1fe9ee6e0926a0000000001000000000101168d200c1ffcbeb54013ae07861233fcae136d464d7d4f4e4e9687f76225c6430200000000ffffffff4607ec04000000000017a91481b0b375c6446112eb74cf34cc8834afbf7ca40087201e0200000000001976a914cfec1abeaba99da87e3690a107dc1bbd8ccc714988ac5bd50400000000001976a9146256d4279431413c572c34f66743ed73b7624fa088ac9d1a0a0000000000160014185cbb85287e6a51b2171a06724b5d2a336938ccad5d0300000000001976a9143ab5ae9a860e09fb06fbc1188b7d5c80959eb9e088ac20bcbe000000000017a9144e02e42639b4fecd68eb0271816f54e6b060145387275600000000000017a9142ce1625a41aef73e0d9ba5e2799feb37ddbb4bc68789fb02000000000017a91405badd108688100452db3e81e500fc99556e39a687d43820000000000017a914003b70e68b3be58014b640140d1995819fedadf587fb801300000000001976a91425b4081b4dec4662391bbbe6ac4bff433513a88188accbae01000000000017a914814d1896f97f2f029de7d6a7f808536f1f1fac288737ac00000000000017a9142803bbcdf69f690b75efae2f40a906859b4dbf418744f9000000000000160014af276492efcb833c8a30beedbef8557889a356c40dcc26000000000017a9145e3e4c74885f119176a62b9cff8ae0641d5b9d6c878cc50f000000000017a9148fe0e6bb8db402d49b3623e952dee4557403413e87fa7200000000000017a9143cf116fca0964c66655300ed7291143f411486b7870da60100000000001976a9140a2b2cf57191752fd5b039bef978fc704beaeab588ac34fd4b010000000017a9142c615afeb65f598a32b414a91a03c60f3ba4bd47871e0703000000000017a9140048d83c55c7c8b2fdc5577ee328d75d4193de6b87340b01000000000017a914c146f717b72cf9b0e110d926fb5399096659a4ff87f9ae01000000000017a9146756eb99774b29321f142a1e0449fde441221ea987579b01000000000017a9144d89da72f9a65de3cf437b18e6fa615a026c22c587c0d40100000000001976a914221a6528abc83be9dc5be0928d3570000e9a3aee88ac4e800200000000001600148c08a8b86b5ac9117d6b5bb2d6bf183de63a9ceb889000000000000017a9145a3f2d5a66e31ee717ff8171ddbf29a7cedc47f587eb927800000000001976a914c78f2b13b984f4db18098fc3a075f2c2f6e0b24688ac3bdac3010000000017a914891dd9be6ddef5f2246a077f75a880f26f530ec5878e45090000000000160014702635f847b29c66937fe3cfd7afebfbdb12f06d0d0c08000000000017a914d0a43ae97f7105ae8afd26d9f2dfac8c8a9a4ad987d68d0a000000000017a91455df1367b7ad234325cc235da0872a0b562a398b87ce7203000000000017a9146bfa1be0c3605feacb1a77da8c1d7fbb869e47408727da1000000000001600144ed5345eaf4bc77c4686e33628b7bd7cddc5e93a606802000000000017a9141da3880b1be6186725a35367e4c930390f9e37e987d8ae01000000000017a914cac6a1e4daa921257889faaba046d06279c6f5c0870e8a0000000000001976a914690a0df8b05701544db674c7a0cd2dc6dc5dc52988acdc035600000000001600145a51af3399c9081a1c4b0c5cb932439db5cab3c432b5000000000000160014c4846102dd889a669fc4b2ee4c963b8ac151028c87274d00000000001600140aa98f611bfa9169895d3ab17df05c9c9072737ae0930400000000002200203ed5b134ecca36866eaa6fa835303772a93b908466334bafd04b1c9b22eab6a0482f14000000000017a914cb9f63137aba4c591cb80eebd356bf4e4f580aa987e11cd428000000001600147474cb4f74648f0e6e7ca4b172828fa35b9b8514013803000000000017a914c156d2b92a6808de9a4678c9b33720841f3acd3587947f01000000000017a9141023153e7a3ac72e8c094d46cc3519f5e6156ef987b15202000000000017a9145d2a67ee9e4e97b313da436a5d27ec4c8950b738873a2f1700000000001976a91445c315a70eef69f8d88d5c3815047e285b86998688ac830201000000000017a914e50e610e3b2e69ae59d55b66623eb563b81fd57587bcd51000000000001600144a0f736a459497d81858236fa380c7755e7c5047b9c800000000000017a9140377f6886755a8929e68cb3eb1ebf161a62c15018759c00c00000000001976a914c65ccc1bb1fb9921fe00079a8b7b18d21972991e88acd0110800000000001976a9149f27426e22381abac67fe0926f9b905f00a910ba88ac183002000000000017a9144c0f9e408381425ae7fa9fd74d2fc9dfd143bc7e8736e10c00000000001976a91428928d8580d2d02aed6591a4a4dae19ab7f8b6c688acf56f01000000000017a9140a87a0785e3194485efc35000db7fc50ab20de898747ff20000000000017a9148373a14a7d988c5d9d2d674cd480024505452e44872df60d00000000001976a9141ae3d80c54a62691235dd6bdf8bde7d6fc902d6088ac682f0000000000001600142444478154512f3a898385d28f92a57845fcebd0ba9e04000000000017a9146bfa1be0c3605feacb1a77da8c1d7fbb869e47408766330000000000001976a914aca5a4a6bc7d20399ce1eb446898218e1baa651888ac54f100000000000017a9145d5153f0ce727378aa7e48ab0c5a208056ec95db87a80854000000000017a9145a15237bf1270376122f6937f6fea598d83568d187c0cf6a00000000001976a914cd7f74cf45c1ffc86880c7185a490c005a7b061588ac9fc704000000000017a91414f5388ec9339c2d64af0e2d300d14f9cc14ee3387d0eb0100000000001976a9145beea89a3d359790e79d59f54645f61d620aabc488ac162b0000000000001976a9148d1959711505175b396944e160c3781236260a1088ace78f00000000000017a9145646cc759dd35fe84010a8d13d194e993896393c87ae2d0100000000001976a914ba9fd3b27b80b6d09cd3ef4ea445b0e5db0035ad88ac57aa0800000000001976a9141efad2d1ad9a1fe468af468bf17227769bf6be5a88acc3da0000000000001976a914cc8acad4d4a8f0571dcf11e717ebc786661785d488aca0660000000000001976a9142d7e9d24160bcdadbf6517fb67565945bd2b8bd188ac6fc40600000000001976a914f52f71397964426351a9217f03b2c0ef3b5e6a5788ac0248304502210083e84e01178ec0bcbafd64ad3939ece783231e2ade852aadea99662356d781b0022032fa8205f3f1649bb01afc7062b48887e3525d36c2536b3afea74e4abd1aca530121030644ab3b6b3d97fbdfec73360d0c30c3c40bdf382ced2dfe9b2fe548802804c50000000001000000000101a4e40bdb822039d2ce288720223f9aeffcf7fb958fccf34e2802f904afcd4fda17000000000000000002a08c0000000000001976a914370aaa048a65bf817ef404339ef072bc40358ae588acbeef0100000000001600148c08a8b86b5ac9117d6b5bb2d6bf183de63a9ceb0247304402202b07dd671000845b4f2b849e408e1561ab0a486562ed3f0cca45b4c46cfa3dc6022029fd4378646cb9a7ca0b59d7c770f4df84516b91fa9f7f009b89895dbcee48ef012102f6318e4745f40bee01916ef8f1e31e63a1f6a1674c28b24d8174693928fe6cec000000000100000000010253ba0c24c30dbacd9bbd01bb9387050ad9acd8b29f78007da3c248e36fac211b0000000000ffffffffef2fabdc2833cf4fe0d59912d68690edf5089b52f603a3813c2471fae55410810000000000ffffffff02009b0e000000000017a9149e42c922158b8a330e0e018fddd48264da83687087c808070000000000160014c68a5fae3093a1c11b5214c732e859defee609bb024730440220703ac6d59c06874f14b8ce2cdf0155137f08b39207c95d03fda7030919b08d4d02202b816d17093289af6b860dec6b4286fbe65273c7a72a55ba52cee0715430646901210346d4d3484257242cbc662a6f2919e9891da286d50d9ad4841bd585222ca0076402483045022100a1cc224bcd2707cd2ef14e0b19ac76228a28af523997f5993aecc462e78796ca02206f5e7cef7ec362d21daf993d68065cdf24aefb63b5bc07aa8522b55a4454d98901210376828399d0ab6efff49b43636e6d56d559babd50b06ef6de5eae0f8196bd7fed0000000001000000000102176ef162a8edac9cea3113712cfe956969eb007c5a87cc233dbec42519f65a39ac00000000ffffffffdaee2eb1c71cb1e618e4fdd2af2a86c53c2a54bb1acf4b94ec82644284aa4fe8be00000000ffffffff02105522000000000017a914421e4585be2fd1111669657586c5ab8cd6dd1d0b87858b0300000000001600143be6585f337b322a4e26d7118a114c444c08925b02483045022100d958e2715ceaa02bb88961019b875ddd8532b9d77767700842b3b787c4f763a802201f0f8d4d3dc6a26b173fa2ed8e9e7943fbdcfddcf4824c26748932bad028d5980121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a0247304402202e22de22af42e3b5f7e6680114f3db2da1eeb05c3e4b3b3384f4f132930863b9022025ae3b911e0f32f8c2ba1469c261966703cf55f334e02e2fda5f4f8bd05aedb20121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a0000000001000000000103a85b1e021a240d23fbc80a4591f2e964032542d7af789b12f89976010854817f000000001716001403fa69bee6d43a6a8e0688d931c051934c97cc4afffffffffd92ed1e61a93724d51b5a7b8ae11ff08675d18b38fa608fcd468c234a9078c70000000017160014733e4158b6a549f276bce7ec1aef89b36860e5aeffffffff7017c0412d78500c53572b0ac72ddce482492df3b8ec366782f4a38588b6aafa49000000171600143a779098dd46c50bc250d5148d90b1a855aca398ffffffff01d1c211000000000017a914f2576bf170d03300e5e643319bea2cb19beea2cb8702483045022100afd844fc44357729dabcc3f36731e907579e803ece265673363dfb1e80416b2202201ded8ca8587ebf3d2495479b1af66578f5a02240ee6b7e941b1dc61cf50427d6012103cb9e814ca2402209882cf3aa4b9906ec8702c3ffa8625f437d15790378f67ac30248304502210097b4f02080d9ca4351551689666e0ac6bff0700892beb675d6a70e84e9a1872402203bdc268592544aa6a43bd7111f8021d9d93c3c4a3fed853fb42e893112070a680121033c1abdeff408a32bcc2c0c81fd1e1f70594afe55952c3add907cabf6d5983e8c02483045022100a5d32cbabc2b6352bc415d03f64b649c972caf2bae05bb1d4c93d7ec3eb0cfa002205ad881c1ef57a9e22f7a171522ef633bfdf2a363bbbfb77af7c9df064c665a5001210338b4042ede2eeda731584cd0c4a52731480c3af4fb9056a385c08c57bfcd82a00000000001000000000102f0bb8b7307d6e135763c1f39e7febf2ae457c1d609ff91344f478aa82c04cf6c0100000000000000005b6aba2a6b591811af8f539b1f5588794a7375f4e440bce734843d77d17498fc01000000000000000002ac550400000000001976a914f85f15568038bf921227d597b9f0b152344a07b988ac27990500000000001600142702a8ab14e11fc0fe40087de997187777c7872c02483045022100d268bca1f616dd764decbc1f13608d5f23c40ffb1a072268084734835b72ed5702207a4420e9b743e9981a0b5fd5ec484997ec70e9b688ca82d0ba3d93c8232207ec01210390731f95834fd5c5b6c7c3b56c6b4afce52316d94f49dfffd1635dd2d7cf2f4e02473044022031b2fafc773d75c970b95dd476685afc4be113cfc15e8de5f921e78ccaa3213a022058e54b573b431eddd1b67822b02680967e253c2c963e9b8e1f802a5c6dd58fc7012102d0790b2e21d27779a8737eabeb2cc2b8ebb492648abb0c1b2729d8a683d729670000000001000000000102a5806deca45fe9e8e69a5f0bf7a1bd9fdc2b60973f95d9a6b33ee449eb128539010000000000000000901b96704bf06a913155ea1e121481e4542d4dd6b56aca1db5efefa31150ce510000000000000000000230750000000000001976a9147f809a296c9482bcb7657078a5ea974f251138ab88ac3c9700000000000016001431859c81d88671e92f34dc46088523b485f46d6202483045022100ae8d09a0b65f43ea1036b590df592df500f3c6b7c8d149284925d7cc425b0f66022079096281a32c8bbfbfb8a386a5a526579b05bef9263bc02675742760d117fd5d012103617449bcba91059c44a7c378be8e3a1c9406b8d5d2aa84c7eaa153c85f793d560247304402204a7301587d721d64c997c70f6751da855f1c0d32187afa09cea84ff5721e77a5022039f47023e0cebc945ab54c0a82ce85cb946eb4cf05c809387b1e9abb0f5484a7012103b2506d42656c538b98d56ec75a8f00bb3ac2db6cfde56a8e224bf5daf624f0dc000000000100000000010130e3d32aa894b81d069178ac925383278c5a6f97025edd0f49df6fdc62ada2970100000000ffffffff01e0748e060000000017a9145da7eb3c03c00bb5415f9b6e671083d0fb46f2618702473044022056530c03cb894b8466e72df8589fc73dffd4cb6b57ee7b2745c31f1b0ba6a324022018c630bf7ce2f090585d938811666e178798cf2a4c55e26a1e5caf9bcabde3a1012102b541682ab71d55ff9db27882425799fea513176c053574121bc2178913a3f34a0000000001000000000101c4fa78fdb464b01ed2dad33acd421f286ce1c3e88f72fc518c4f40fb102127980000000000ffffffff0156df60030000000017a9147eb9f2e9f98789b588aceaa6dc283ea89bc47e068702483045022100a35d30620a182496d05c4020011dbff1f5db0145b84766bf8c818ad43844119802206bebc5d5c1c9a2d29698e31c1d665e5710fc11418492acd03df99b8695b4308901210300ee8e402db5f33a90ca00539dd08f124dd60751d957ae597446749710985ab2000000000200000001aca912108d920960f7a8b1ab84a4188cc7a1bcda07b1394fad2b014314008d0d010000006a47304402200b7742bb0aa9d6dcaf53eb0dbf063e1fb86677b166d9f479c20c67b43f9938d30220744078d4f0c1b100a610c25a0bbbee75cb74ff11dc768901be5ceca6aceb465f012103909233abbba6d8e0b110c3fa917f05f772f790697ec8c0e04cbc26d19d3dd93cffffffff02dd610200000000001976a91443eaed4bba950d2a1da33187c6756fe25000123e88ac83d102000000000016001462bbdc74fe28e735f74153e5ee5f61a6fd22590c00000000010000000001013156d12c912c6f0301054d8c28017871dfaa6359e8ccc2c3f89529c4c8531a0f3700000000ffffffff0188d296000000000017a9141f05edf331197ea0a49ab4be74f4b319c5ceaebf87024730440220051fb060d66446a5093c9d1e0ea2c42c4c4a3700ef437ea6f9c86a6e7e42f99302206f548ba06a5dad1b8ad9bbe8f02fd68c483589ae45c160fd31218871b769a1540121024d675f5b7f08d2566e39dcf87b90a2268b089a619388b3314651dc3befa4a2370000000001000000000101f494f6649c16c34222936085ef07adfb2b53e5d293a5e5f62eaacd5e668565e802000000000000000001393d03000000000017a91463e8c076f861dffb4b2bd152b56d1ac5656bce8c8702483045022100a07b6cbed20de624e56478f955c293fe8db4d8e0cfe5d22398eeb8149979204e02204b264b1d6d8b981c6638276f235666fa11202b93c6e4a80a1550aaccc35a488201210244bef543f5c79d2f98cb8a9ccd0a7d93d2487ec56a787a76e172a64fb085338e000000000100000005fda0f92e6691a7519f383ab777828e811a5514f5ef4fd233697b545a74245e87010000006b483045022100f54ed2d9f8d478f26c6f5144dd2390550d05822f373fc77caa099546ba8d2f4a02207814383b5e8d65bee57d746a7b0f8d94f1947403ad480d5fc078b6f34f658025012102dbcc14d1aa42c9f433ae5bdf6c2ae9c4e98db8aad5495dd3873863306a37369b9bfffffffeb453bc281a590af288986a7a1324792da88ae0e6f404cbeaf3e5648779037d340000006b4830450221008cd08552fb6cc1ce1c52aefc974a10cf6d5d6b59526ede8113464442f12c72e8022029d9e0d0c428a0f956880d38a5c68737839735634cb7188b08b56fea7760954b012103a12e32582ab2183e82ca1cebcf77565257e427861f8a0efd79587aa2bc2441b19bfffffff977606e966f3b5b364178c9b3a1d3cba658675b36792b66b0bcc1ea531f91c2870000006a47304402202ede1efef73c70e577cd3ec517b819288cbb35eb872a57fec677516ea8c818ac02206eed3b2a6810807ce0dc82e32236fd9d51e242e0facf51ccde1db5b5f6c3d9cc012103a12e32582ab2183e82ca1cebcf77565257e427861f8a0efd79587aa2bc2441b19bffffffbe7dafe9b770e4516b7ad351245ebc1c0b7516ab56cea001227cf2ce07121676010000006a47304402207fc4dfb2332860e8a8bf2082732033f98c63a2e5c9086b69b61119397b92bebc02202d3f3bcd3e088c3f9b6cdcb74ee6d9dbf432a2c908f42bc9d22d929a26fe49f6012103efcc489a9a0594fe5b3d9e68d0aea1e95de7a6f4d29016faa28f564c8150eaf99bffffffefba4e047a0e02144d1a48bce73dcff08699bf853a9c3790dd86c48419bcdbeaf40200006a47304402205368ba4030f8d1797b1acd1d4d052113e0092fba8b9d209587a46fbd47eee0e8022026107ba1fa7dfec48ef6172bb634aabadbfdd9b122013fd10e7421d3078c1fcc012103a12e32582ab2183e82ca1cebcf77565257e427861f8a0efd79587aa2bc2441b19bffffff01d4b708000000000017a914ebc7dda2f48678bccd14d4ad93fff4c6baa89b8087000000000200000001e47a81d70d1abb35891a855e27af3ed52b556f93a534c80622a6c3665538e463010000006a47304402204953f248f9aa3f865924692e9d179eaa5515aad585eb88180896fcb62567852a02205270c7b5907ee86e1f0504c0e2c0954e4b5dc021a927a1a0219f64f095838649012102e7a84e93c76013c454a4843243ddacb93638cd0dc41ef31382847c800bc7c3e6fdffffff0242cc00000000000017a914c97fe1d0fce82bce94493e6ce1941945711c801a8780880600000000001976a914e6bd304c6211f5054d0c03a707c0c9d1ea417fdb88ac47a00a000100000001ab42618bb35984826044fbdd42d8308e46ca111cefc82442fe27ef6621f5356e010000006a4730440220136e7c72c9f1f19220e97b878b6685dac04c5f44515c16bcc263a60baaf348da02204425cd88369f587ddc3d75f88da864898756f7afa23a1716430ce6e45f1b47dd0121034944e9891bf96a5802c07fd83d3d60a42e50b43ec69170b61337ac2c5501707dffffffff02f9ad01000000000017a914c26297fc180f43a900290db3729fec2484c7f7a68786362200000000001976a914b046369c8a63599222c651a9a35393be0888705288ac000000000100000001f31461c16c52f184e0613a49f36b2f5b6bfb0373a3c4ac843504f46e1f295f0e010000006b483045022100cde60df7618d99c9d8536094330bcda1fad31368f39a68bdda8c01c099c5c69f0220350a3ff9240f0c315b145cc4316616b9ce0dc91931f2c652290ba9f1052db373012103f387447b67126e7685e5ddeeb59a63fe3ae0e90d84703b339f24909e15efb63a9bffffff024db301000000000017a914659122f7bca595371975da256e3ff824d78dfc3d87b8240400000000001976a914e729a0eda12493eadffc03609b17351f0792b41088ac00000000020000000001026883a9ae1aba52905ffb970ba8e8e3f389467f2202c6c886da4f5d655bfd81880000000017160014ca1567b340bcd5e489eabf105cd00a77ba2919bffdffffff55a7111ca6f1a18b840ead54f8eb07dba4277183f39631e00db389b050efee4b6d00000017160014e5550a682fa2660629aafa2418ffa91d099babb8fdffffff0103c364000000000017a91426dab79385eaafbc6149bf6a54bba4cf4f7e921a87024730440220601b7ee20758149932be99fdc5ed0a0ba3e384335ab47b7380ec07f911ca01e902202551b97a5038163b872b51fe53387eadd04da6abd92a522d0d960359cda5464501210260153e01486a0586f6f12b8bb3937ecd9843057a71c3e9b0d5222aaa026a60ed0247304402200c2768caa8d2c1abdfa68c7883f6037921722d03654101e82cdce412e0c40c7d02201df1e00cc345ef07314db7418d569a1c0404662042c13f403d1c530e3340e7690121025c1dbc67fad570951c8c17264662dfe5b4ab5cadc55fea082269013610cec9a80000000001000000016001a2d4470e8089c200a5e775ce12d615cade2d4340a3d42036efe7ee373245010000006a47304402204019b0de8cfbec37a79f0be653ba9d8e3b7700d657135217938803a750cb412802202c7db91fc4efd4e2b16c28adef17fe03dc17dbcd490a66d4e260fc090922de4401210355ca767096e916d8306737c8ef503de0901aec3999741159ce4cd967452cf971ffffffff0250162b03000000001976a914e01e3661ca7705db65456b36291397c5530c2a0a88acc7ae0100000000001976a9147460ecd681ae4a57f5ce9155f150f0ccf28b447e88ac0000000001000000000102d9405cd3f58e7dfb7e07c9dac0e6023ab3108c712a457de2a25c4900a72d4ec2010000001716001402957e13b360cd12975d13a9a29c00a8ba6aec61ffffffffb2c88b8ffa5e321a6be29c59cc87bd856cb329b252280f38b9f821ffa34324e42700000017160014bdba96ddc7be008debf7aeb7efa497cdb8371333ffffffff01d8c1db000000000017a914684d2388fa75d3c932e75db6c4c304736616a0e88702483045022100e3315b0ab96f2ec57370b6a57c975577cd845c8eaa50571ede0328490ef736a602200e8cdc458bc5bf7df46909754a4cbf751380762bcfc35dd917c75c43700c895e0121028b028d0cd16a617227b59b8335c1b395a88af9dd422e55e2d98243779b9b368702483045022100dce501c93fd0bab71e0b987adfc0fb18d916b6d8757efbf58a0fbfda08911c24022049ade5539154670fb9cf360b42d6f2a619954779407fb1c5bcb80c1023b73580012103d10f56ac26b7d5ce2381137d7c4b5818f38274048f6a06cb28e7f40062ab2a500000000001000000023c95ee89fe507b8952e14e549ef2fd208c8e99a58f2f447d8763bd1404a613f2010000006a4730440220094d57cbc18e1f900eebf1d9fee17df19ddbaf1f0192b437460f0e34e658d4b1022035af3dc9eb5abdacc46f3eb64db0bd5f79ae999729636c5ec41a59f8b68f208401210366b4e2de61ee868339ab2fe91d2cf7384dc5868d0c476df72272fb0104d034cc9bffffffb2e5531d4a69eac956faeffde7922411a4dd4f472279c1a04a7b2d7f97fe3f57000000006a47304402207fddf742b9b380b2243ec0fec10d8873dcada053d1e22dcfbeabb7e17e82dff102205b8f003fc8afd5eb40c707fade4a5dd90b56ead7d9507aaa3caff7ec17fd5981012102dc4159e7a7b67c47cb712da220f7ae017d4b24a242fb43a2cde20fc2b8139ad99bffffff01c8480200000000001976a9140e28c3deb55b00a4095806faecce68f6dabc23b288ac0000000002000000000101776bf2d335797903cb766801d7b74e3ab3f3c5888c930bf5b929252266ad09804d00000000ffffffff01b29d0100000000001976a91454851fcc817abb7a57fddf2ab4b07bf282af9fcb88ac02483045022100f66cb8a42dcf985be2918fbed5638d7c8ef548be41fbc2f525c7608472a4a0cb0220175018cb4ad126f7f25d1eb55daf0fb3d733cd4d1405d510aa733b159c05bba4012102fd10af7cd49b6e9745fbebfd3feb6e4c1fd6ceeaca6dde0f6eaaccfc0223b9de0000000001000000000103c577f4fb91010c22c3c693e8ecfdc8c1d0cab0705f9dfe6f6099e7b7c3397f1b01000000171600149bab7ab0dfdb72454dd7a9af0376b9f46e061c4dffffffffa617ae30c62ce51c354d549a734fc2d65e80e5a3ad1968ce69495944599fd18100000000171600144422b664e6c4c5479e3341b4885e892a0f9c44bdffffffff648c2e312edd2a23f53d864be518893856dd167ec7678b447f9f750ad922658201000000171600149bab7ab0dfdb72454dd7a9af0376b9f46e061c4dffffffff0219f80c000000000017a914001679b5e30c01c194a72149eb996269c1209e7e8701bf6e040000000017a914bf7d6b9b0412b08e6d75766e36dba9ec8ee21c0a8702483045022100f9e59abf8fc535adf0835a0a714030f1e5fa05b9aeefddd0a8439af574bfdf8302206df351a352f92c2eedfd994d55a5d28842537d2f186c1cd885f6348cb2f8efe5012102b1f3c93dea0c41f62b5537adb728cfef5f30966d583d81785b9d38bc40ac07fb024730440220220b5985db592850ffdb032c36e3a999b8781bcf41de319c6c890f25e4bc16e9022021012ad6b4176a9f112492712eca6de3f6e62036ff0ddad50171d9e13c524aa301210369b98e463994add72be65d49c6d95d8c76e9bc894455b93b3d2b81a61d69d6ec02483045022100bd61670ed591c00e0573f634929801c7b3828d861b3f12bb926e76d65464354202202f784c78503f0ab22002765faf282cced7fc06a8992d56882ae725f653f040be012102b1f3c93dea0c41f62b5537adb728cfef5f30966d583d81785b9d38bc40ac07fb00000000010000000001039a52559b3c32b28c4106ab822e52c3d540f972703dcd953cd866151169116a4f00000000171600147dab16178a97ff5d74951b5f34854c9615edadf2fdffffffcd0fa92d620e72afd9dfb30591169213a02d9b4a43227ec2b73ebd2a1d0aad9e010000001716001453de04219db928d0458c20ab4b0cfb4f8d37ad27fdffffffab1092b838b68b2977b6f00368dfe9ab6c4c3aae4a75258692ab6eb7b0aa4bca0000000017160014f126e2f078c6a2cf471816ac7f6425b367cc9ce3fdffffff02680b4d020000000017a914f0f9a14e897c86f9940501106e92b775bcd4160f87009435770000000017a9149eaf3858b4c51c3a234d106aab8ca0aacd5f2da88702483045022100f9555e433ff8403d33d3d87218c4483a713dfddb9140aba81d7f59498f3115c70220683ea63e46f924223e55033dd8693cd033f3f6ce62f357463d585963fb6f44f3012102b963dba931956518708dcde0efd604d3912e4568dad6437b7f168ccda46a930202483045022100a5399cf6fb7cef778bc84d754883b5b74255e8ca3360e5fbd09b11b897f860420220052d7ae8a78b3f0d721592c6a42aa3dc833b366c19786202bc70f70c45e427da0121038bc49e83f0d8ea944d33e86be177f4ebf3d62cecfca93293feac6a7648b6f53f024730440220488c42c66d3663352028cb0667c006920955b7c8c08a23022674a8f4419f1b0702207547ca6ee1713ad59e9377ddb4800eae2e43235de208a664ddabef4280edf897012102689a9bbc4f3bec114f15999f5835bbc1557d6b04355ee4ffabe62ae608e435ef000000000100000000010143fb107ee9a9fff3967e489fc35f77b9411014c9de8aed3138aac4d0233607752b00000000ffffffff5055ac00000000000017a9141533e7b88a4e42044643f42a6128881b06db879987f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7684f10200000000001976a9146442501196b4f45dd275af0918bbf4709123ba3e88ac8319040000000000160014e25784476a1e404533d8bd01245635b5b647dc734f760500000000001600145ff15e243ea2f6009094e95c605dbf8cabad79eb5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7687c613000000000017a914748ae8781ea298b99daef0f99664583bb0100c9f87275001000000000017a914322baf8bd37f9e5f8c67fcd715229ebc5ad0b9c58789af100000000000160014db08d3412cce1b1d4ad774e0cba8f2def0d6291d564b03000000000017a914a6347d4a8bba98c7a8f4b72fd2bd2538870dead18768ae1c00000000001976a9149be1e0349520f5e319616276166dc14bcf785f4d88acc95c030000000000160014a534ae7b77593053d838511778d611211c9b132d503100000000000017a914b122020b9db8317f69ff19fac9a0782b45ed95c1875703040000000000160014f25f1f667effaee2941645c93ec6df16e242ad3682bb00000000000017a9147b576d34b4bbffdfcbf5595060af8d5729a3e41d875aae0100000000001976a91456ec45a152f58210e148b2a1812ad49e710da1f288ac6f670000000000001976a91466c81ee7ffd4de024453af5987a35247fa7cb83788acac6506000000000017a914f15c88bd259a3b55405ab64582e395603a07dd4487d8d600000000000017a9144935eb5d9e0ece0fa356e3be1108a22695ed5cb4874e7501000000000017a914794825037bb2ae71d0a70661327599a2c01f07d487125600000000000017a91440266d14ed43490107460555e12c3dee21a0b25587c52a2000000000001976a91497dfee2212cd1d79fbe976ae0e61e537cf83a3df88ac02bc0200000000001976a9147cb815b97767c725bcc8f1d63d271bf0b73ba86988ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c1790400000000001976a914a4c2e6a3edfe396f606d1ea43f5b0e82a63dd57688ac80f0fa0200000000160014e50f582ece0a2354e5f8405c4729411e1fdbeffdb0ad01000000000017a9140507c1669b3c222df6881067237ed9ab3382f4498704470000000000001976a9145223efc4ff558cc0b251c03e24033dede7d44cb388acfa440100000000001976a9145bae986451a23b8825a006c6fa6b21a1d362258588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7688f345000000000017a91496a19f370bbafc8a8cef83d13a3da6b28558905587d8d600000000000017a9148ced45384369fd2b29008cf4cdfa30582107d3c287c7500b00000000001976a914198fff87bcf0bb3a6b3eb9be8879ca2addd50db688ac145600000000000017a9147ba23667175a17894da79e0597959a89cdf9868887f3ea0300000000001976a9146941ee2443ee019443418fbbcc6babb802be1a5c88ac43f100000000000017a914ea0bea08223ea3ee71f1081a4807d53b672cf60d87937106000000000017a91422b81806b970271215c4b25c16fa2447d472d9de87e5b208000000000017a9147c0221a4bb764ba9ac283be343c800f772bf27d287ea3e0700000000001976a91476ef84b2b49fa73888c6ca0638b3372b8e883c4d88ac450833000000000017a91453ec546f31daca42d7794e7c792a9a37ee74f4208779ef0000000000001976a9146374c8e896db61a4ee2473a912e991c436a16f2788acbc3001000000000017a9140df00a463a8fef6db6966f03abc36dc0efb06daa875e0205000000000017a91459487c446e2aa17d7f50089729712d21a37d6f8a87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7676ef0000000000001976a9147f81b086e319b1fc15997bb5663ded23a9eb649388ac5db602000000000017a914a2ea5367d06c69d32a322568f7a484cf56901f1187d9d709000000000017a914ebefcb0326804d08888d24389c046990e4c386aa87b1c201000000000017a914b9ae71f2ff935e63b51b9b32426e7bd37cadfeac8772b900000000000017a91452660edee341a018280b9becfd3b2745c057d31e875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76cfce04000000000017a914e3f1bb3144f851ab6bf8a38968baaad882128cb3879eae0000000000001976a91430903f327a6a95b9cdf9bfbfe71b64c60a42165d88ac801a7018000000001976a914451cff54fbed5f61503251bd163db23c54bbbf7488ac340a08000000000017a914dd67043177799bfab87f2b5f701e529ca0254711878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ba0201000000000017a914c5f72d8b4583932866bbc33ae1db294e5fbd8310873665030000000000160014114ad83b406b40e90efa0e1fa98f2046ebb25225439800000000000017a91439e638bf5d33c1d6b103ad78f00294f6701641dc87494e0100000000001976a914fb6e552e88ac599f5b5817afc9ffd0f0ea901af588ac462a0c00000000001976a91403d6da4dc1104c1d13b6f8b4fc15b2232cfbee2d88ac60282200000000001976a9144062f3cbb040d553af538bdd662fc6a80b17b28988ac6a021100000000001976a914551b191e09400f31519896ef05b0ed1b0a535f4388ac0f560000000000001976a91432d2f3a72b615d8794257305ea03103625cb4cb688ac63ac00000000000016001460110cc22d0f4ac7170c9bebb643cbc7215bc74e75ed0300000000001976a9142cc2c1c73f19b09fe27c772c35301ee04c432e1588ac0ab0320200000000160014855d8d1f85c41fabfe9c0f3eb51e9d1a41db281c843803000000000017a91456adb5ca3cf74560e852886f504af7828fc2622b87605b03000000000017a91429b7964e6cd8d077a46b12a49c6d1b92f7a2bbaa8731ac00000000000017a9149f7a5f8a62d5669178a616922e2895b004a763ed87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b3b306000000000017a914fc0cc102c0423a47a75d69743bbbc621c10a2914870e950400000000001976a914d981d49d77e5e3b350743ae46fe0e23249dfb83b88acdb4400000000000017a91461250fe8f6ef62f296d0f0f72a8f8783abe8741e875f430d000000000016001452dab7db96154f8a3c0bc86875d33710264fcf91fd4601000000000017a9147b1ffc3a07fb5ffc65b9b43f833f95806d37d5b987d2e101000000000017a914b6620514ec979270b7a64ccc9a570ba1dc0f28a387315c0000000000001976a914ab538057f6cbb91ab760f6001461a7041142ccd488ac7cd7000000000000160014b94ad9fdb92408ef9aa7d0873d6631c3cc7fa8a5e4d40000000000001976a914fdddf5f21bcf7931f547ece3e422444c03e47ade88ac125600000000000017a91407b05898a7825ff4e7b083600142af8f208cd81e87024730440220451af4df11bb711c6605239fc4db2d48ad222994877b58a695b8757ee12064e602207b309b0d128490f433c9dfc991fb2264b6c27d6acd38ed5725adcf14a96123520121032ea52b82e991e135eac877fdeb8e623f7423c93e6895eaceeac0377c78be8b1d000000000100000000010276b23c680fae4f9ddff68599c5dbc05fa2395e6699273325563fa7a37c0d64670100000000ffffffffb7944640551c5ac478828bc1e44da691db43e08198d635e35e04e6c5e6a918e5260000006a473044022016a4d27faf81b362ed8d4a484e1741ba4c33b043ead279ec8e4bc604c3d9319602207da41c7ed36ce1bef5c6d0fb3674b6dbe5c13ea5c457c0238bb150cf391b362a012102dab07aa096e6aead4109db3d3dcfc201d1dc10b6d3c3dd09c9699083c5d4e09affffffff02343c0700000000001976a91481b6f2817b695598d59bc0e513e33f73dd2bab1388ac141e0000000000001600148a302cb2626d5bb7d62b21ee109f49ba83a9ef8b02473044022056d14b85a8da87ab35f0f9da26a89be2da6deabc5042fc46e74ad62e6fc4a36602203e314707c6cd9231f878e2104c49909cd32f66234f466dd98d3573f6a5aa91e301210269e457b0c42001245638c5af03b1e32a7491041d5fb7c3036b5d6b5a6bdb069b000000000002000000000101df96adfbf5c29b0fd47225520f8e56a5947092b8b98d40181b786a951d03e25b0100000000ffffffff02842a2200000000001976a9143b9f09b9697bbacae443eebf7655c56098f6d56a88accf069b00000000001600148ed16ef059fe11bdab1d31aa472fe3e29c4d2f370247304402205a6f0f6131013aa67b6db4ced3162373eb518ad32f55a98a289da2fbd3fa692702207ad530cbabedb28d186c18a700adff28cd366049cca893ac5b567f3156c7ac35012102332f786741fd8f3ffe8a58e10f1018d79c2f4c2459c95b9f52e95598220936e9000000000200000000010166744c6b347dff33474c879de996ebb8589a4c3f830c677c7f9052591de6a0eb0100000000ffffffff0208cb0b0000000000160014fbea8518f3964f94c4b433235ae15fcef5428dda1a378f0000000000160014c84256be20203958e4e5cbef5bc81cea9331a24f02473044022062444d523608b063392f807b625304c4194ed135312bea3d0d9b623f799ee57d022005a864c799b16bfb27c4d3d59534a3cb1797b4978fe683fc60e29a4acacf60fd012102189de7fd48ee78cc4701f8c7667b010917024d4f9e305c2e470137d55f805420000000000200000000010197b6fcd4ff586038cb6a816c49dc8cbf4f83c8581fad825ee35b2982ad89bcd10100000000ffffffff0284337f00000000001976a914e18e49ffcbca444e3f2ec8e220c87a3a4815dadc88ac4602100000000000160014773b6933dfd15d1407806a7b1e4b38a7019d3be002473044022074fe71c3c38793d7badf67f152ba060009332aac43abe21e73c97399babaabac022053672b95ad73b66c8f8e59f7a4cec34f4c027d40b4d850088800c31f6c057713012103372484ad84f33c34bf1333cc92b237f2f1e5ec7bbc7014297a3db5ba4f31027e000000000200000000010252a522aa771d4d6e3e5b66539041efa6bb575e2c22905de5c78092dc5a95437e0100000000ffffffff2be0dd99ac75840688c939c4ba740b3d3214be7e34d4fe97a3672f7fc6372b9b0100000000ffffffff0163df100000000000160014fbea8518f3964f94c4b433235ae15fcef5428dda02483045022100ba7081d6a1814cb6ee5c5a1fc495518e14ebb9391c66c62e25b85d8579fd1b95022028f7085ff79ae13cac5b309b925853c75b1185f1e88e5ca3ba23da811c9159bb0121022321159d3ba2f5017323154257aeec6089752f1ecb9a709a12c1cd0ea3948c6c02483045022100e2391556dc9671b856c00cc1db912f3793ab4d3a6cd275ff6eb722e45ae26635022067a6e3e0ac7439c08890359b2711debacb4ef39e183b8427f0f089c170428b7a0121023d1bdb338d2ab766a07dbfb94d9dcbc12ae744c67875fa890dcb11f4904cb246000000000200000001dd6d1a4f1d5179305c09bc2c6f6e366e6ab69225dcad8e2e181c260cdd02037a000000006a473044022031dcbd9956133036f753e54f8d04e11c3d732c7c712ca6b378fe5f8b74b5ff79022056ee36c00e4517d3e0ea5e3dfaa18240865d0bde91091505a5e47a86ff6e6f34012102f6ffc26e79ef4979125debcff3e7953c6129395e1a6425e7172ea20252d495b7fdffffff02553d07000000000017a914af14fe5002802bb358eb0c2cbbbd85a8f931dd2787024b0700000000001976a914a1fa9bebe41951a9dee3517f52d0cbe693a48e4f88ac48a00a000200000001b0650af8b176f8cdeaca0f12af965f68da4ccd7b09b24f4baf4a3c8c29e65731010000006a4730440220507a84aa2dbcff61e1e2ad5226c738124ea52360a9a2d48bdec34fc99f9259c502204b0e273ba1c135490075285e2ed4683b44c76a0dc3193820ef9dc5069cf6a8f0012103e91a59c9f5c50266d175b5c13239eea233a850c9e4b8af3c05015071425f4d13fdffffff02905303000000000017a914750bfcd28b6e7dcd31f15918b051c709bca412a28728f20300000000001976a91448a18a64f963f2c6ab6d6638dc8929ef248359c188ac48a00a00020000000001036d93cb07a57d091b30aa9ce7e9aee0619a5737a06a29464693d0e4ae6da5b4872200000000ffffffffad8062d1b6a9bf2be96797a3876889229aa5f96dc643a3dece19fff3313dee3c1f00000000ffffffffe70f2610d1cf36bf3db76342d719b07a1f568fa722b500a8bbadfd725a190d6d4100000000ffffffff01153646000000000017a914454518a94257ed40985325a2162f679e05e4b34787024830450221009b7e6fcbf7b851bb1913357171fd4ad7626dcb17dca8d3ad9728a38b0603cb86022023e5049770382314678cc6b6dd9467d0cf6da60ca83afaede1265d659ee7369f012102ddb107fd1e4f019e1ef2a5ecf86e9ff4229a01f3f68d75e273c4ffa61eee1da902483045022100c129dc30f12618fb0ed7436f5c67df96f0523530b9edebd9781e2469e068a75e022035fdef8bac65e4eab2edd025640458258e83f1178ac1966102c1c588c6df0c42012102fe8d9626711fca47db3f571551150fa6a2836ad145b573f812cbb75752dbb25202473044022013e2ed620725919ea8627c147feec3dfeb03195e1affe6333046cbf9e46abf4502201d21371e045c08a44c7fc1cd92fdd7db9df10369166892e38b6f63a95db9b168012102fe8d9626711fca47db3f571551150fa6a2836ad145b573f812cbb75752dbb2520000000001000000000105d7f83a54ea3d77e59418bba4585df33b4a8604ebc661a063acc5a2dad9b2a92f0100000017160014a35da4f8d79dd9d07c160309053851f85d658700ffffffff652194b2115c1e061d5630cd78c5281fbd864fb05ecc3099f93b96dde1f1984f00000000171600141bdad691a3483093e92f70d9570326f970531ed9ffffffffc82d89a2c11504bce631ae56bfdce26f34a612906005c373c1e78220b97c58a101000000171600146fd93a53f1627614fddf7e811050cf1e0f3c40d8ffffffff83581fffe74e0a2afd2e6d99ebea5aba6407bb0134007950e4b2c6f76eabedac010000001716001401bca0a528e0dd58408fce0f6a365870ab4127bcffffffff89b3adbeeb8eaf23d3dc7fd7b1dc5e07d0f59d001d71513b8d2d5bd29fcba8db00000000171600145b0a744709d63f0b986ce1f7cda36b26ccb94c5bffffffff01d0eb4e000000000017a914d82ed5931f41d270ad372b817072018378098f75870247304402205ffa3b1fff90db0bc6d61cc2dc319b13d16252c35372cc135ce3b8852befb76a02202a969179b0d026ac2bbb4a38ce6d7f69b08b575bdf8d0e1bcab5659fb32dcce5012102c05c40fc0872f827b7e655dec27f88548e5cbcc48ed7b96387264a496628b6c002483045022100fb10ca6696e3a6d236d95d6514332623a1157895fdd61b9a999c880015bc5d2502202855b39c462eea7fdccfa7ea4f6a1668b5258972b31c0e7daf5f3923416c498f012102889fbb4b9048e6fb02943e311f8f6f46891a2e84e095537bc8c2d827adb1f70d0247304402207ab736f78aa37d2508544da6c18011f59fedc12c36a9a4957da78dbc234cdf6502205da10e72c5584ae2105e1eb67edca2c3873f6a27633d1efdce9b145430e0ed79012102ac94f50b3bef6a447af452f143e0e95228bf0e32caceba494ce8135b4c90deed0247304402207070c24ffabf2ef0c1fa4977d01f474a1069a8c3380ffd3f4ddd22966507a0b50220089724617e48038fa4bf84ad023bf2e56858f0b6915f0f9f407676932033255e012103042f04cc1b26a8d41f775c2440eb887010de151d2524b74afa6cdfa6ad8517f702473044022067c6269ede75b00c7686a79ca9ec0acf959f451efb9a2f0c262084832a790aa70220374b84802e69da577c1a5784138026aabf8daa6e2ffe702197c9cc17fe37fc30012102b9b012b09e94310d4cacd9f24548e8f3fd6c4f201a1ef06b96b4e5dc6e06728f000000000100000000010205399d181fdef31fb7266655378ddcfc1b80a96b866681bd3c757f8d0236a0ea0100000017160014ab1e714ef706b913a2e7b46dbef62b186d7ee21200000000ad30e7c5d8a5a464ee548225050a01ab57ac035f4556360df39a6e1ea249107d010000001716001435207c4595f096039353133268555779f76bd7f10000000002d9790b000000000017a9147bfb39d72902dd74c0f6afde155450dbcfa38ee287582018000000000017a9143b81db14e69daa67450554a6d19adf1cdc330409870247304402205fbc082cdeb71ee168ff8ef503d1cb6702152ee0d0cd6e2f4bb97a0df0f56beb022010e012395b90f9600d7c1035049d371e29078ac50e68e8ef83d3d4caf35f4bf70121033c82b267aac73241224db9dcac8f50496b79393bf2552ba62db8edcee1ee5f8f024730440220625d6c5bf29b38e109e235b97d34a3f5223c47002e43bad3f200f965d0643cd7022074646a4a94f9c22d1569c7ff713e5fdc79f9575f3e15e88c008e4ea9d4bd8ddb01210358f634174a45a0d9bb0b1184cbc8290c60d465fcb6e38b72ea3f145c96085e080000000001000000000102c3b08396b2704b50ecb0174c581a42c27c4e2ad04735740aae7e5070d50be7290000000017160014c58ee976f66c8f86aafc6e5f5a7d2c37a6495cdbffffffffbe82354d3b8f75246c536bf7067d2b98b51576d11b312e40e5085e8f279dae9b0100000017160014cf38be9f403a1dda3c965a37cafee686dbaafe14ffffffff02b08a04000000000017a914164d511e270418cee506d29312b2816c5e282a55875b44a8000000000017a91492da7eeb82d528f9587084475c9e30f1321afed9870247304402203df6aeaffcfc040951a088f52c044047de542065fd5471309d1c32500667cf0702202486b3c8e1f4052d6d495de079b01aab130dc27c640dc41c8240235573edaeb1012102f1a877369ef1ef3e6ec173c16bc7044a5c639d5df887323e5ab3b61049def15f02483045022100fdf32c1492ff677954a517945a197a7a2fb12b6767d82e13f263ca4776f22f0f02207c6e806a7355b652a9604138f7b9c3a205013986b58a752ae845a0362f325c8a0121039056a1eea3c2278026947268c46e25a2a6ab488a6cdeb341e787610ad2f556350000000001000000000102604bf964398d6fd616b8fcb87cc092d25559301e3c9d3a5db9dee822cea67a260000000017160014291e91c1bc24d848859c16b79e40ab09bc1de198ffffffff6081dd7316b0bd80a3c5abf10c45d96cfed461ff8ce763c8da610bbc760f57aa16000000171600142a40e740ba3ed76616b263e98bc9c774d9f891d3ffffffff02e5243b000000000017a91431ee122cd2d0366a925cec1be7d575802c78aa0087fa49cc000000000017a914884c0e32e4a3b38175707a064ab15e85290a6df587024830450221008531e36ad9be799f45970ac5b46d80da493f5b90ad86ed75064d7b419a89927a022066c93ca385505cb2e6e0de791fa4dd7b6d5af20239cc22650b1f138040493996012102c0929c812e12d58a1425c8cf76ea1d173614c13993755d3ecaaee348da65fbe202473044022033847c0dc52ef0333165d0bffd526819b87305d4c899723e29beca1962ea1efb022043d82259bc5225fe5c6c187734ad847895e3993dfca771ca45f5955cffd79f28012102d47fd17f68836ed96a1bdeea12ba9c9f1aa10469bc6f5fecd8cbf6fe97372cd100000000010000000001020ed1b2754cb7a588ac12f25b97edee6e6b6c171a0c1bdb2307514e6b886ef1170000000017160014b8b40863dfac4e06a3b170a69d378d925d63e9c7ffffffff0d5ad7b96f5e688cc34b93acc5afab94d6abdf38adfcff15ebb78d127104bbf60000000017160014338d27ffc7402e49d8250e77f39e6b2c8218f8b8ffffffff02e70914000000000017a914c660af4075702d84430cc2554ce6eccbc53fe9ba870d2838000000000017a9147fabf8e0c1841683eb9d9b02abbc105c43d36f03870247304402202af59ac3087d686d8a5ad5b0eeacff17bb451cd1181b0b43f75f4b2dbe565c66022054341c4f2314db72eb649947575d943874b8d5dc6eda85ad930b34ddfca319af0121036c91359db04353b0bbce96080207fa1b2df714f19134601fa470dea801b131b402483045022100af53f017876336704dbaad8730bcff6485918e7145f1250844ceff31c9f206a00220223ba5fd7bc6617ba688c76c92b6c909ccc1ee3665e9ab3ff122b5457541e07d01210388b331adbb87a5414864acd59baa3bc84d803af77475da045cfd9f3c1feef64100000000010000000001026a95dbbebe36637aa62e5a69607af3b37213af699d6db1ef89c53c74535d64479b090000171600142af9b45b34855f395fdaf729f12f17ad71e1120ffdffffff1bd2ffd29e54d934acb6b5dffa0ed3a23e5c29aea4327135a01c3d363a9dfe83f7090000171600142af9b45b34855f395fdaf729f12f17ad71e1120ffdffffff021cd606000000000017a9145980723035393499c8e5554cb66b8783fd5ffe2a87ebd51000000000001976a914701386d9b39fecd3e8ca2dbefe1a9746a4c4019d88ac02483045022100b668d5d3115a5367c1b6e9eef023f6924d5b1c340ddd9220559d4910fd58ea8002206df148daa5f1e2ccf96ad9f3cc92bababb6b212ef0946fbbaafa05bfb4485d33012103dfb830abea7d709b38435fb5f2904c47507ac8b2524b1b4d5d51fa481771b4a00248304502210095c11bf0cad2cd6c1be004431e3a91371219dcd94e3da2eff818a3793519cb9302201e49628192f9293119d226ab89654aed67c588108f2736051699790249f64584012103dfb830abea7d709b38435fb5f2904c47507ac8b2524b1b4d5d51fa481771b4a00000000002000000000102a7aa8f19d7127a91459564c712f0a927b73f47675ef9580e71e869ce05d2d468010000001716001443d2ed89145a7d8a5ab5e06a1f92b728c05f0f0efdffffffbb1c730634810bbd9ffdb757b66920fe5588a88efc57fb0c55e216f095bb11521d000000171600149058995cce48b6f8b3cc958eee5cd37fe0a642acfdffffff0295650700000000001976a914e9c2403e1046f81e4625a0cf2da94097bdcfdfb088ac430700000000000017a9148cede224ae575632481829bde426639cf12a84c387024830450221009680d75c2651f7f9d16d33ae2da62f9154babfb3fd2b60641e46088be2750dee022072747adef1b8546375aa1ce9c7494de71ea9fc55679377cb969f96ae5c020145012103050295df70b7cba2aef03e79c34dcd2ae711c6dd9d7f646ded2f22a5bb08ae9402483045022100ae40df5211dc1efd0dd4df289f93ac5a23f22f7393bc4a2e362f787bdac18a6d022024f435ebd2ec6bb81ca8f5e3f1a4504f46d9e5433f029a6f1844e5e1887bed2f012103e3fe26cd4b4204e30555a36a5d8908c8794f13c43373c0adc1fca6af955661fe47a00a00010000000001025c845321c005fe35e98b2918e3ac6ed24f34a1118163fa3bb15ba1881cb60d6001000000171600142395ff13bf58c0e34015a107d53223d3c60993c6ffffffff5a9e6ae307477f1b255c6dc777a2b4c1458cba691f911278e58ffaa6c5b82de40000000017160014eca790c140455a771cdd2d25bff394a6ef559895ffffffff02edd029000000000017a9144c504398ccb1784c8b02bb32a526f1453e07f28e879d913200000000001976a91450b634c794ab8d91de09a1857979dabc491dbd4f88ac024730440220553e89a02d3b178b0c59e1a85e07e5cc11c2695f40741b5af05f06f22f10f6d2022039b04560ad972c7150887c12ee2b363e457ce9da803f8edb2365e35a52837745012103a9261f9c105e9be93e9d783fab9fd655707b26c37946fc15ac2e6f38616eb6eb02483045022100dbf5aac85347f6208aecf59f542271cd5f5d110a21a412cfd5cedae11a79363002201f09e4f25259e4a0d4c1b1a2ee3be97ebc38748db5a73449681d66e36ac07399012103d7eff517ae5894dc93fde67dafb604e015e45d7f761520221029c50f67b765a4000000000100000000010113b0f1d4d5f0f6c25c0e2fea169c011d3134614dee50f10fcc7f43864fa9c04b0100000017160014f29d40a2a66c4566a42e3f9955fe9e4c3e098b45ffffffff01e32438000000000017a9142a213542351cb6fee95c26fb5878947ffb1d6ecb8702483045022100c785dc3b96de627b3be873fcc4ebe7311cf8d1312ed4e3db4fe7387a610ea4bc02206064ea055f0c7903bca8122f94717101be7badff17de8464552027adb67e45cc012102a3b6766a70104e4e51cfb5d8379974d7d0cca854913ea900f39d244a27d29b2d000000000100000000010188ddfc350134f8fbab07808f9ec09b8105bc27ffdde166a4a3115170142fc66b00000000171600142a011b33216dc87c30001225e95034f482db4667ffffffff01b92138000000000017a914a4c6b9bc04f9802d2180e4e43d29af42c9bf2a308702483045022100aca0d566b76a638433bb091d1c601be98d4a4430fecdaa834db680cbe1aeb5ef02201b1fdfe3d4f83d33118bc085568ea0f70861149decd4bf0a50810d25487807e1012103b7d81ef4e928849b3b67ced37bffef14bfebe6a76669c0caa122d418f22a54430000000001000000000102dce7d57b42b8792c852d30479b6a625ec6856f40c6ef3741ba693cbae9f41d3a00000000171600142a40e740ba3ed76616b263e98bc9c774d9f891d3ffffffff0d5ad7b96f5e688cc34b93acc5afab94d6abdf38adfcff15ebb78d127104bbf601000000171600147f56622a628aceabf0c5589fcebd511c5a95045bffffffff025ef017000000000017a914197002af6a44af0e2a7a85dd28fbac5eb5fef4e9874375ec000000000017a9142db779f370a61a90a550bc811b010a782e68b6f7870247304402200e88ed8e2bf5ce3a3df3fae2e4fc6604ad0c3d894e2c2b4e35b464b0ae49550302202fbb1a7908e1414a807f3f8be7de8ae031340c7a6efce88fef8a0df52757a6a2012102d47fd17f68836ed96a1bdeea12ba9c9f1aa10469bc6f5fecd8cbf6fe97372cd102483045022100e5cc5fe4a06fd78f705ef23a250e83b6c1c728077a53be82f60f9b5e114cea90022032efebbb727a01abe2527685e289251140d61aaaff3e4bd7657e96e07c2565c30121031caa1ac5e2586638b6b427955673a6cc89158ae2b7c76cd392f826c5ad89a8c4000000000100000000010267310d739c163d42f6a69473bf90469347e285a73970ed3863a6d2dd4d9fbc340100000017160014ae8468791daec42015480e4294a9c0538a2ca226ffffffff1741cf21e26defd09da85783f5aef5f39cf44a9524f126130ccb73302a61c19d0000000017160014173bfc72474a1ee799faad067a1a7926e008ca2fffffffff027af002000000000017a91494151ef6782c2753d20a186c04224273a7a4cee4874375ec000000000017a914dcd51a26f82abec453cfd9b7e82c15fd0107221d8702483045022100e87e1021ef0c06743c8d49403aae92bb4cd19150ecc4d784bb9f7ccffeeb6f9702203cf309e6c818763df21020395236bf644f9e7617acf09658522eedd1cc77c65701210285fba2310a83202fcc0871bb780207a65e9af9cbfbc4656ae6196b4c3adac4b20247304402203152394bd350461a611f314cbbe7f07b5bf6ee7d551b92508614ebb539ccb31d02205fd608944933184f5f1f3347dc9f8ff937b26322d0ffbcc8b4efbf4ca9d300c401210265063ba0cf5bcf61cef3f2ea82bc47e8d6326caf476e9320eb0b730c279943eb0000000002000000010e7d52a553a76d2b997dab89a34017358c49ee6e848c6d1398fde13acebd14f800000000fc0047304402200d155628672f58d0f1622dcba1ff27183dee226587b245b7d11d37acbabbbc2002202b6a5f747e5f4641b98338d1dccff66a02373e271a686b2b547ab84127d1147101473044022054e64e19d48acc3bea7ff93a5abc88a1310932e7862c76d1520417600d8e88460220260629cd8ce349574c95708fb1fa60aefac0617e4a165a9193addb928840724f014c695221035c037a36e4ec9aa1aefcef02ff742bec63c098c0a7f1c9a1b822b6294afbb7102102a1ccf15bc58870240578a2922b3f0e922260f37098adbd988e15be36943816912102af3be4803e51fef309a51f0332f399026e99dae117dc2d22a71f4eacc1f3f4f153aeffffffff03f9963f000000000017a914a7aedd0d1e77300fb06aa154c9a517b74c08d24587aa0a0000000000001976a9144c7c5c2454e832713ffdb99ba58d52e4db628f8a88ac0000000000000000166a146f6d6e69000000000000001f0000001deb32650000000000010000000001018689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd1c00000017160014fb557e8c0e078d31fe1bec2a0f89681c3b44133fffffffff0151a2cd000000000017a91464733e0caf2f8a6ac1b6a4c7faf63565594c4678870247304402201252bbd6ad1685b6ab66e105ca601be5da1fb749908901de5a3b8cac7b1463fc02201191721158b64965ef87e66e902fc31fcb67be94fd7736e18f6b3c55b8cd1523012102003a4a6543046f6c3101e00b946881bc34618a2b529cf0c188744f8ffedae819000000000100000000010171e3640f86da9c404d450be37fb044b4a9cd4a11149acc94eb6cfc8de90f089b6200000017160014ecae9c76c1d4af187d0c3c07f01de1ac99136fd4fdffffff01b2dc6d010000000017a9145a675e81e7ccb9409bee18634ce5904ceda7a8d18702473044022062d659c557a6cd45120b3bb8ae21508e3d0217a09222a601f795ecb77e2893170220500ae074aed92550c03cc92329686cecbeea126c3360430543a256c621b8c20d0121039645c6666a1de750208c280fe7824256851ede2de252551790a9752bd9e8e4f800000000020000000001016d0b95bc75e17b927da085ff738b909da97506a34c6edb00acdffa1a5ac7d1f90000000017160014dd6799988a273f9190b2c7e6cd20a2e390273477ffffffff01ed8c03000000000017a914935a373ef47ed64a3ede76828b93bd3bd32d6b2b870247304402202d5bf96ae3b06fde9ea6126897be842855f698cec50902c517b6420337c3c62502205bdafd3f4ee47ae73b6e7feed40a3efff7f8baf6f553bb86a6bb0852b70ea680012103ba4ddb77d169e5641537df0fd81a6364894e5b1d90cea6879eb94a593ae9619f0000000002000000000101b74b0da176ea073d0f98a3be6fc02c611a833176e50fc0a9344af5714b32cf5e00000000171600143226cde57949494ebb39f192361400e2621cff2bffffffff01461e40010000000017a914b160da693ff303e75c1dce18e0287d58b2349b09870247304402201a18d12b706aa3a861b28428fa3f529bb52d6063d878ef41d64eadcbbf47a34e022029a0f0cfc628f0e7df4b47b63902802ea9ee01a9c1fe7d715aa1b9d6257803e601210350ed8743455ef7bf2a0d94b1e1ee290d9fb960a35719d30ffc58f65eb790b4b200000000020000000001027bca398586206d4d386613024dbcf36d3f984bf412fcfca11cc0e63f73bfc5f60000000017160014134deeddb28f785cb0463f97cd9e5f52d44111cffeffffff3b4179cfea233824f228cf0eea9ed433f3f108ce53f5a1f78265d1761eaa35ef20000000171600143f3aea8a0f67a1a2165dc8a46db672e8c8a5059bfeffffff0144560300000000001976a9141f74103d46426cd48fee0c6e6ca2849c1d0fe26788ac024730440220049a47c7149f470b8327e292cacd4d01b9837e6b55adb0e4cd0c2a9f66677cc8022070843e59de7d9ef4a0d4ba50baa921f6e9378a82fd8ebbe378141ba5017d1bae012103294cf4eaa958608b1f8ccd35540b16361027c44ee00c86524ccb3f7fe88822390247304402206cc224fbd926861e24a42dbaa32a4eb8d61a570d1c24b5b1d8c6a3337027554a02207eedeed378180bffe7c8da019e2d75c461348872cfe1227d4eeaa40730f2b5d6012103715e1ebc94871434ed15dee2ed9d494081d529c65ae2a58a8a91fc03eb5b757447a00a000100000000010108b8b1e130635d01eb1dda71a311e3a17b459635d54bcf78d009d597c5b38cd20300000017160014fa8c51d456903161d372127581df054b7e8f8aaefdffffff017be80000000000001976a91471323c1e2bc80954e712c6d38559069c262b70e688ac0247304402202ee7762a1f014671e778f089a0c90692590ee576090b597f670ff76306bb7fe002201814732991c1fdc9f15fbb640408f03ce32bb62de29af92771a86fb91a4e2b9b0121035a4bf1f87fdd5e36a2af9636fe3ec18ef7c00abd8526b4973e15f9a542e972db0000000001000000000101d624112859a40fecac323f73eabd1d799d84ec1fc3274ff1322bd60edad626d6010000001716001445763d5e86f488d0b89a42314b401dabbaf114c1ffffffff018c730200000000001976a91443542bdb27aa5e732fba9ca4eda9742735266f1288ac0247304402204afc0708693a4c3bb3073b878615bf2435ab6c02f2a6020b83aab4ef913d06d8022030e1355db59c8b2bda7a07416651adfda25123ab19aee8c577d3a80ab0ec5f79012103167277402ac6ba3b5ce88cf566cb71963c35d903033b269fc7023cfe6857757c0000000002000000000101bbeb19a7845aa4f4450498b1a74fac0497ea3b41db04545def12bc61d908dcea0000000017160014a148a695c7da69c5f03313c108063884982c9007ffffffff0169600400000000001976a914c52f51146e1ec7a21dd5ec366c898b6f1c05575588ac024730440220041e8c4f6df621319664a906abdc394a9018e35d6526c5c938d71fd1252163600220676147b1fbc44d803dd653d00670b29148cc92818b8c416c5fabda9fe8949699012103ef40505df2dcab89f25b490111201f01224af316a035b52a35c79e3e1ff0f654000000000100000000010164b0839f4c44a43f7150cef9f5c0deb04dd316d43e33070491754259ba140474000000001716001460aa4391997e61ac8a8917fdaf357fa3f5d5a82afdffffff0135dda435000000001976a91424f0ee4a4613043cbceb33e487e55519e66aae5388ac02483045022100d4d72a22e5f6b48bb691a74c137daaf72eb009ca9c224724795b2600b7e70d7802203026e6505f3cdb4ce4c144c742c61c62c98c6487bfbd37d2f9f7bf39ff1ad98a012103a82f585c8cc517856997abc32665264a2730050c5fac623c305e3bd6935b8ec80000000001000000074ce9241a9a07e4eccd3f4c3db4a119bf1e698f93821b971f137d2ff2b20f2339190000006a47304402206fc4ee3f6516a891a2d68f51fbe7a2dd616101fedf02dd8cb831fc22bd37f1370220712a96768a7365e80a01d86bbb718b932a7a526eafcdd552e84bc090d22f2874012103247738102de9d18ae520ce02363547356e0b4f83b2f71359c4fc633d7ec20a1800000000d74e627f5603d0b37c6919f032faa2c0007e42a1301e449222240eee6172c44a110000006a473044022061b93cd23a0eaf6b2c894481ac51eb528be12363c744bf4c6123bdd013aad778022025926b3a2716c846376a3823f7ab44e79a2203200e2f4b8996b688075e583d4b012103befce56ef16e4d001d2107055580924cbe9959fd89e7acb5917a549af5a3225b0000000068453bc5af770563dc14bb97e480e21e3f66f02ed45b58e692bc431570ecb538390000006b483045022100daf01ca67938b294cdc50f0a1038c737d0d4d3a8ba94950e88724a0205596c8e0220391e100ee96a41f2d2f58b14705496f95ebed0878276a25fffea86e2b7a82786012103c2c8914f91c71bed1c1bf86b5173bc6b2fe738a983552bd8772765308ca9f5c7000000000b290437066b5ffc8293f7ecdfb5662005e67d46f70c190bfe6e3fdf00df73271c0000006a473044022018ac743963343e0d5257cc15a49faccfafdf28d558b770dce2e4ba352743a8d002202b9b0fc1e8acd327c39aa08196d281df3500c64ee294b5f0698473aa03b093a5012103386f4d73db8d2d9bd36c764dc35dcfe42f7ab11ed2cdd5ecca812284c128141000000000439e0eaaeb3d8bf5f57868be446483a09893525fd34b34d3cd2cb03871e78af4010000006a47304402205fc247888af833d93bf6420d457301c38bef97e22539119a76cb93f3c152295602203ddb6ffefeea863a2170bcb2b4a19d4fa28e7f9008961a8e57949ce53a3de13f012102553bf27b9f807683eb4c5a738e0f179168d89a2399c56496052199141ebe7c0c000000006bd2482aadc7884dfc0669856a4a7c0a0c0e448c8f8577f189a8c1d49c8dc6d4000000006a47304402205c6c0bac4d92142613c73a591628365902f1d90af6b7b061351235e365a4bdd202207186ddafe779eac685c6da8ea62462085efc05714ff94cb6c718bfa9ecf73eb0012103336547bcdefd0755221b227e054bc556a73c5f499ea57a0fbcb485495bec60c50000000067c6f5f71e2de70b2e40efbbe917e7b56fffac74978b5c83d3b3fe9af0133631290000006a47304402200581b54c8fa18c1d6d3a829af7616d05ff44372859b438c7d5715479c012224e02204547c307ba5f830337bd3539d2d99e01419615a57db8755de7f79d057fff85c901210218e8a40c66eba52733162096408ff81fb0a9ce9ca9b7622b41464121930951c2000000000220f1ca000000000017a914e222f48013a04fc75c371536a11b4240cce6e96f8773940300000000001976a914297941d45c298c1d7a723fde24a38859e515076088ac0000000001000000000103d833da1dc7a44f4f638b1ca38ea6b53daef3f22a8796309d5d2880e891ef9a207500000000ffffffff8b5f0a88f013c82e9ab913c7b0f0530456336b198ee419d787efb7f0807b0de64201000000ffffffffdc3107480d32339667081628d1f81758f5ac3daa34b40c31925f69f94d3e4df75201000000ffffffff02ce5655000000000017a914219a9dc1016278b0f96e36589f15b768610e65a587d0751a00000000001600143be6585f337b322a4e26d7118a114c444c08925b02483045022100a9e48acc874d7862ec2bb9e93c390bd1a22010ae7c2f04bc20544152caceeb36022044931d80e330fd0149b2395ff12405b60a6c6116843cd47635550d9889c61afb0121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a02483045022100a574ed71129091cb22fc287e74ebb4f53dbc2a53d1247aac8a0d4f7887cc8ed202204a3286788b7f053e91737d81630a4cd36c7d20d86014badcf9bfdd39046e75210121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a02473044022060ad6f5e573b6113a900031c3ad88c5af03510b248ea9aa820e78cd0c754e994022056ce438b10c1c370cb11fffb59a0bb83f089044b5683a32cc38d20cab7fa2ac90121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a000000000100000000010a13735328fc9b1a19e282703275e89af19f6ad398c458477d8bf651bd262d770d1a00000000ffffffffabfa05421ef3ddb201793466bb277da8d13e28d06bddded9a40325da5e5513110000000000ffffffff5295b834b6e4151a071a1fea7d57ec35426d9346a530f17894827c64312b7e270100000000ffffffff37fa88380ac6d3564f86a0d1a56d5f75310a8bcc189eabe6cfaffddc35dee42a0400000000ffffffffa7c818de25f3f2e6912d60d6750860b03d5b42ae56e31be61d37b079018f41870900000000ffffffff0a83eef200ba09405963026d0c56556065acc6dd2b94d5429988019560284f880a00000000ffffffff207ffe1883301ceb6e2febbe43e733c229ab3c429167064923afd6967f32fca40000000000ffffffff9999434fdc1772f4b7b9834e55665465bb54e4336e28a20d670fa45d700707ed0000000000ffffffff4967d847ebac615df56675885a3a8b707ca2971512550db784abeb4debb425f90100000000ffffffff1f3ef90cf879a10f975597d82792ca16aab7aac666e231bd9fc6073cc774b3fe0000000000ffffffff02d7c60b0000000000220020103b495c2042becff4a30a3b5ed907d23b884bd81b41d11551259c53c6d747c080a8120100000000160014814e0e4f262914e12f602833ad4237f41416270d04004730440220681ff93233387e41a5a347178dacd0595abe6781dfafe8f950e78925580738b802202b0a2554fabdf1645b9ed7d716b612749a764180e1a58425ee394383eb996f370147304402200cf8ba356cc6e1d4acf702b25a7861300599f40b9e619f323da98f5e03be03a4022000a897be6c5e2d7281b30246e6046eb934db62e1a43655b9a10cdf5591272e500169522103583fca9668ff1093ce72c7d87091a9c1a159253c62d21260b5b067e364b307ce2102510fec1d21b633d79b187b86c721daf6d9d4f6770bfb6eb4c45d56fbd712b9ca210285c593f2eb65a37f7e527a5d9074f8b4eed8adb7571916160c6a417a2a91765b53ae04004830450221008c9549e4e2fd35a034611b25202f2d49cf8592a327b8dcf5aaa610b92879d8b2022031414fe82391e2f56c16e612ea26fe5cda1bd55c042f1fbe81d7d6d2a821b2ec01473044022038b520a5f43414a0797edb77c2b2c07a865b2c3ec60c517e57382ce109ef5033022062890cde5e2cd7b5f46cc85cf3922d988c574218dd3f9f7d2a7b809b378c6450016952210302f9836de1ce50c07964eb8b3fce70a03bde2586117c284d22552f3393e9193e2103ad542ecdf1228705532d307dd2fac56ce99cb3c0a6dbca2890e5f5a75d10953f2103a53fdffd6102d00063a5b62852e474d2fc59321a93f0202d4038ef8ffd6c6e5b53ae0400483045022100c4cf89b5882e9d641c458170012735985dec0935c19321f17cc392d320802fc402200a0bcadac40b6d397077a42217c7486559e5c69ef78310f9eefab31a027934c30147304402200403be703e974ce7c72a558f2c71489366e653f51f218a51e9d60147464b5a2302204b34c7b52a09ea17d28c07284944a7a1e84dbb3c7b0d1a0b7cb33d8887b9e595016952210348e95c7dcd2c6b1ec1b37ab7b84b02a323e268df184fdda3868b81d6bca6421d2102d3608d6bf371b83bcfe5ccad62db8edb3899b11d59509ba34ac0151711739e7821034a388edf5d559eb46f1f3e694440052e6754e4382a918e12256d28eda451480853ae040047304402203328ac7ea6e0c156ed3026645eff466c0c50259396beb8304a6f258a66bbabd5022011402e6d4fc927a111fd83dac3bdd5b23f7cbf42e1121c24517301a57868243e0147304402200136d42e964434e16f8bd9841928d5719cd73c9434f42385007b74948c29a32202206b246ef6d74feb032cfe98f927aea3d0f2df0a90b1b0db2f1456de4295f27f7e016952210248345ff5136ed853dd16ff069af807c11a0dc004cffefb5671a6e7d6e1a2d881210317d5e6f23770f417a675f4c7165abf16d573b94b84b6dab859c2c768b383b9382103c3622eccceb2358f4513550a1b89efe9209c0daf0f24a2a594142580d58c3f5853ae04004830450221009f88f0a61af79748b108f6157ad911b289477d0fc29b38fc9f00630fb94675b202201c2afa5f3ddd9a734f5560e2bd1163cc6a614c2bfdc5f1f2bc8354c456728b70014730440220638d25c69680ac3d71b13fd8007ea04b7723ccb0465df3fcfa2fce22b3d0486d02207ad8d90e7f6546cbcbcb690340715423d282d91cdb9a27de95f663ffad63be400169522102e9aae75a4eb9b9672e44248ebed573f63db7042145f7d990afc7f7eba19799cb21023f972f443243c0de95de47e03110b6e6a25a6a2ced9bbbfaa5fca65d389dc7222103dc028bbcb90b45fc446bbee4905028c07352ca53c2cd5b1c1241404d6394805853ae04004830450221008724c19ee2730e1a0518301f5287f36474658dd042778132f5d09acd3d9c5ef602207b2b4538730cdeb61e151b4b318a4aab69e7d9aaf4dde2790671d7201330e5df01473044022077ccfa1de043e18d8ef1368422c5103ff7dbb9c87e1a94cd01a465bad3502a3f02203a787dab318586a3e2a2b43c2ffb399104df625b1d78912afdca0fc83c0e990a016952210351c15c77b933b0fc1e2d297a4aef6cfe15f6947bb26327820020fba9b7ebeb83210364ceb96e5050521adf9b1dcb36a9ee2da7f966d7fed4a72c7a361b45bae75d962102ff3ec1f6939ef64c98001599cf312c259c947b0606079995b729d890be583ddb53ae0400483045022100feb81b6f51e2b92881480cacb9c005f4550ac5331710401f0f3be985acd1e90b022063886023b6d7f73400903e591c1139889ad0ee0af571a12488251f27a9424e4201473044022005ad0a9885718ae29e1a8c82e39da087c2c6708637ddd0e523fa434e833ac8d10220379cef0e47a13286d6845f96b94b06b4952da79a5cdf3227c524f3ce36a8ea600169522102972f248ae1ed2a22e77813e5c57d26b36e634a9c26a4978aee03a8b32d4028572103ed7cf224082b3e076f2e9ed34325c94f79880b4c50a3260daf204a67338eeadd2103a76fb2ddea0455d9aa0c30a6fdff674a850972b1cf0f5adc2f2d39ffab0c984253ae0400483045022100e3f57ae709de857dee3732ef4346cf990b2f4b5ef4ccdd79f0d6d1514d8be6d802207f5e497a626acf972828a30e10f534d71b46e4e10852f1af14ead78557672103014730440220383312d36fccf7c8b7b75fc993eb65fe08c71ece4ed70a4495a3a9d4d6f7fbd00220667907bf8097b42557ebd86bc9931c0725f3e1745b34cd7be13f4af47c20319d016952210275f582acb981ae4216b9eb98a2fee81b242a5da7a2d3f83e8546435c299a822d2102ac7fb27c2df5ac6900531f8885ee95678283222565b1e947661d18239c95f0ea21037efad9791537c77cf17cbe51025323407e841777ee5b96006819fcf4f0c54b4d53ae0400483045022100df92a13f71300fc3b94adccfedd3b6fb58a883dae18948ca972acc702796521f0220114233a0aa710515d0818d270a7075e99e150e20622c5c514b85d0438c9a73860147304402207d5f30715f45019c3d053d28fba85845b6a9f3e5e6e5855f4cb54e5428dfc3e702205657f82d0e94352586c83b684509b8f8e98e31539793e47e7790ab5d62a9c4c201695221034a4bc5910ec242ca68b7d4bda6fcc7356a0df53349da75d91920400d918a59bd21031d041bc3dd27d66bfe70a8d5a4deb1ab7f1d4f5b7b2b40d9e812da9fb7d995f82102dff9dd59aa46f1885053d4fe1269cdc0dbc54e24e57e6c95cd732c43c5642ab853ae040047304402205e33d6ae72c327fc9d15f926932ea45037638798e27708fcec87545afabc402202205ff9ee3decb901626b57369f2552a6755958e75ab0af3c678b4d2dd15b54f30d014730440220161ba33c8d731ea2e55e20d9d76844cca4d0331716b7f56c408cb6412007e990022067bdd88c39b55c84eab8028fad8adf7e22870b389cc0c6bfb26e9ce3f5a21b440169522102f524a865ff22d4ec8e4063b85a9536892480ff79dad190797229b659109bac5d2103f833e34d178135cafb6d5343b2482fd42f6c46b759039a24f23c6b2c3c253472210290e4b5756412f1165bf6f5e20248ac5ce47c04a89de27c3aa21a573b5bcfbf3253ae48a00a00010000000001019904d96bdab6c4d3087d34f622a18fb18444b43977343d23e0bffa8a9fd429560100000000ffffffff022bf62700000000001600149c03f7a53c37c7690f9d7538dc58909578ad8cee8b59503c00000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100b11bd042730beb2103fd4c96b304746cf481121bda36e495a4228df0033ab81302202f2d10afc91615065cdce6a86d5a6615d6a2ac15888dd7e03698479785a24761012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101fae90b59d3fa173fb487d4d382de74340be46769c934864f4b4a39f5ddcab9a60100000000ffffffff02c9d51100000000001600148561bf14a48261dfb56c34ae0bdf677a8db158f986b2a93500000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100a5cec3ed698b432e36048787d2d26f1b2fe2d501aa98b908c2369b2c3775cc6902207b378910ce96ca3a054d282bc4126849890e5a8331e7a9ed04ccf113e90d3268012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101b611f8b2923fe4c0d0f75acd59ee186dbb3740ef310fed6d13bbd6b9c6711f2a0100000000ffffffff021bd8200000000000160014c151c92e821a92a54c452476858f57fd93d8c1f4d139756b000000001600147b2aa3b67c3b0746a80f5ce027842640f062e8c70247304402205b5856dcef9a88bcc09db4a57ce4f1a5256ba96a451d91076213ea3edefdf5470220062f5a21dd5c09ce14a30606287436c5f218a7ad4302c931322fd926bde34baf01210343a21bab25e836c9d02739759016bbe2d3f7db8130cd224f09393424b850a660000000000100000000010190cbbdb86da7e43155d6d186539fceb685398c850ee241ea6d760a7b2929c87a0100000000ffffffff02db5600000000000016001497a75211371fbfc52d09ae963137e24572f3d0995c15313300000000160014ebbd98beb987489286e5952f33f05a9bb38e349a0247304402203f3ab0c7ac2f3b81c7d8fd77dc014a71b569b2f58596bbe4d7c6bf73fe7e4268022041011c958c8e3e8c0fab96c2dfb64bb4ba2b5667ba30e1f3997712ca35982d17012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101e6788529a1bbe7b6a733b3415f5800a5df95963e80a8a1071ec1ea7029d56d760100000000ffffffff02a086010000000000160014db339441b6b4e43a20a91eee099b1ace4c0dd3b6a680950000000000160014acb17c0fd3ff55ef4394f86425acc18991491dcd0247304402207c8e570d526477ab7ee7ec49ed6ada5138131379a9443222ff0306af0607e9f902206727a941ec278433dafc3f5dc601deabbaaabfcadde57e1cdf570329f86adb57012102befdb54e9dfc1a88f46ff0de3c255f7407fa32031515112a1ceeddae30f6882c000000000100000000010160e05c46e8f4c2bc58bd7ce84fc7e14526296c788d73f42ee9f90e162c8997ee0100000000ffffffff02667e110000000000160014af54c9643e1ffce667822659b2c16a031a52fdeefcd4cf3400000000160014ebbd98beb987489286e5952f33f05a9bb38e349a024730440220750cc71d7807638778b934351b2969f62d3a550fbed0ed2bb2ff8eedc4f55db00220353269c75e752c77efef0695951d282a9419526ead217c5cb5253e94a8d81ff2012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101fdfffc1fa75a3c9a0edc939c3a1265531690aa443463a2aca0255e885d3c190a0100000000ffffffff020fb201000000000016001441c341ddc5d49539e5a9f6c604c91582ce37f579af3e082900000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02473044022073ea75bf0861e07a8312cf79bafd7af5f487367ffaecfdf95d060cdafc2af115022045fc55a99fbaa64a12fef5fbfa16afb3d6213af38897621bc5a8735136910c5d012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101ae04053812ebf33e8858163fc1c7ee2a5f14ad7cb010b7c7671c4c60c1b2f35f0100000000ffffffff023063f70100000000160014b69ed15b0e90b64afa81aad569669b6d55e6ad35de99f567030000001600148776a0d51930317f6839491e81abe990c861dbe602483045022100870a60e7c06024026234fd928e2b21ce1fae4f9e3a7d199fa532932e34a4f36302206c9316f0601c94abfd38e91529536faa32b42118f44df88323c8e670b85358c0012102e32ff4bd5110e57e8aaf9517557eea6e7545dede276ff998c924900711317599000000000100000000010138425a6c3030ba3c028d9ca41a66ad72817951bb4ead6080b3191c3d56c343b10100000000ffffffff02dc0810000000000017a9140377e81c9c47b9daa5329e426986e54f9e8d5d4f878fb6424800000000160014ebbd98beb987489286e5952f33f05a9bb38e349a0247304402200325462164f80301ca98a47ea9b51f818d8b346f85e38da0d28ff4847ba753f202203211eaf31ce7ff8dc6c567bbc2175a386e2270cdc31b96300efe1b5e743bcdff012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101616901b7ba9c75c875aa6542cbdf8028ecc6c5aff49a658a1dbc7ba7316d9a250100000000ffffffff02bb9a23000000000016001443379e5e2359cfe7a69ebfdeee0c6b2e18556112e8cd08000000000017a9140a02bf000f834ab1fad0e524ad1f887487c3208c8702483045022100afa5b315ee4e9688f10dd9134c9b5cfc1d69b118fa210a8bb9306a9708a8bbd7022058c617d8834a9865bbdd9ff9554dd2edc57ea3979f57ab1b2c376fb5ebfdfee501210325c338814c79ccd23e5a916bae4cb969ecdd00bfdefaa6fab767e972858b30040000000001000000000101c3f9ab2024779c5251abb33fefc0b0c0bba8c4bd842fe192c70bee19788c28030000000000ffffffff02ea2d1f0000000000160014f48d04fe037d4a7389f347f115568d05364f959ee86804000000000017a914089d9c5ef1c22ec4f4960a14df671626d24f7caf8702483045022100f20327c2f3989dfa11e703cdea529d74e3515a11966ce6476dcdca75b7a3fa9c02201c7237e136b517941935fa3fede5d0ddfb07be233bdcdd210c631cc9662259de012103847e60e7867a8d1781ccc74ab4ae4c75758fa52de02eafa129ba7718bc0733130000000001000000000101c72a4b22cc39edebfb0a32427a764f2979d309220230fd35604181ab2be755c90100000000ffffffff02a1810000000000001976a914137fd289533c1dee2bd18835c6082d44279e76f788acfa0d0b2200000000160014ebbd98beb987489286e5952f33f05a9bb38e349a024830450221008ac75540261fa2bbe09c5822542f05633c3683ae9ca484c7c52cad5f8f96595a022042ee54d5cb536393549a2aca6c8379b9b6d6456e5fc7da2c228900013fedb57a012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000002000000000104d9ffe6bc57e8f4822a4e0c6093861fcdd246c9ce3f0f11c8a5b639a3ca40fb700100000000ffffffffaba2bbea4d95ce94f6441d606ac633117bcf0a0deaec50e6ba19e900b3ef75a9000000006a473044022068ad37120539b35b9ba4e845f5f1d64c3f2e9cb940959f7c9adae625db048b4802205c758f57efa0d2a74f961383032f0b62a107a6f3dc2fb75fe8e3a55bc5e4d44c01210374ca2db2e1d7907cb87c8c9f171c4ec6434b4997e2a2e9849eb741c2bebdc881ffffffff78785411f9e8f18dbefee73b773c1e81c877e9bd4f7ffd4e219263945d2be343020000006b483045022100c3d43bf9aa44f354cc2f812e1cd43bdf521b9753b1e148436c9d189071331cc102201f7bf4c92d912a327bad1448d6724a05f92edd1a6542373de331e8cbdc53e59b012103b0eee7c61925a636297ff1ce2d0ebfa04cf841d09a7631a868f7aabbca40b6c8ffffffffd5a9ffa5802575fede44a621f77e1d96a28b083ed3e915cae6a475962c6afe92050000006b483045022100f015204d3dade4ce52a841cd934ccb2f2cfd4b4ace39efdeabf3f2f542e91a0402201e87c7e2138493d318ef47604dcbe0f6f49a450e5a4d6868353d0140c70040e5012103b0eee7c61925a636297ff1ce2d0ebfa04cf841d09a7631a868f7aabbca40b6c8ffffffff0289c80a000000000017a914aa0d3eba7116efb0fe48ad864513c2f196b1f588878286000000000000160014bb1c6d3928d220320047d81f1027d2251368c0a50247304402200fc636b4279f9a92e58788cbf6ab6b89be35c3a339c1dc75f288227b4083b283022036afd592314b8baff26006f4f88e9e4c6ca3c7afd2d896f5fac76f41f49064aa0121030c2c38701edeb2df8c78f1858dc2c43e2c7599a1c60957edaab101a8d1e848700000000000000002000000019b8d0e5c045434ca5f0346b7a49903f2739f665c0072bd871ed373747feae573020000006a47304402204a45efe41a01d329b3f482eedcde03bd81978ce2e42729115f228162e8cb64ee02205057c6c82e17f6697d96ccefbce5e0ec9d3728430805d4f4bf99b27e39217249012102f81f31afeeaf57a8521ad9e353bbcaddce87d70d72cd314676bb3c5655fec54dffffffff04cd360200000000001976a914361c7e3b595251a75f268ece966600bd7ac6f7b588accd360200000000001976a9146f1b3f5a8fbf958d6d7119e21aa6f12278e78dd088accd360200000000001976a914dc86c2ab0c56eb6b989fae38db6ada5e8aad654788ac40bedb00000000001976a9149d7a124db0d946b65a81984fad65b21a892caf7d88ac000000000100000000010470ae00f0bb275500e1535642072fbcab18fb4b7c0c34b1bc3852380630f7f9212c0000001716001493985a1e8daff09f985e249c2e8e1844ca9a675fffffffffbe4c6a3073f8b291830111a327f8f3451e3945476db024bd02bc08568b89424400000000171600149b7aa51dd68b93d29aead4085fa5cff458771ab4fffffffff6e3758014b30b32725566595961377357a224fbd66212d97e9598905956dbd40000000017160014937cdd7830a75e2509fddb69cd1cd1e4a15344a9ffffffffd678fbfaa1a16e093f4501d4908a3f2d33f3f3b7d8e92eb5c17ed74681fd9ddc0000000017160014fe2bbff184ce19952eff891ace9af1e0eefcbd53ffffffff02db6e00000000000017a9145fe7f2177510a8e14093d44922d827cee9b0dd9887541a0a00000000001976a914e089db993fac9049e0d7b4966bb1d42a0a44a2f788ac02483045022100adf0c94512c1b364e229dbeac168cf3847d48524bf687bd940190332287fa1df02200b9b532ad826e4507faff6e698a80ed22a3d277f037d6fb6de7371f0ad9e3a36012103bffab4d0c3b6add924fc2530a69b6ffacd1b411e804b72ea71f3d0a8a312e0ff0248304502210084415d41b39d36278baaab39713d5d6a1bbdb39a4d3cd4f2542614549bd0209202205d08fceaaabc43ad33c11815ea13389869616c57d66f0c389b7494a74a6eed97012103a604b6631fd9133f56e71d463f47392ac1f1e68c2c638a3c2822295ba658ab4102483045022100c80a66507b26941edd5462fd8377fc4549576468078c3d7019583563f7db4af802202e14d25c9305f08289d8962eb78b8d900f52116f0eda54645272fc7c63fe537601210319dd7684dc4265206a56ffede644a227b459148b25bd010e628a8f02003ce6220248304502210093202ce5b4847f5ba1ec05d3184ffac2aabe23f069fd8d2f66a3ae893cfe399a02200e56515b787c640ed7eb539cc5f873e1361f080276e560f6ff3b5bb5f6527378012102a4c881d73daae67d518778e2bf89843f6fdcd1f5632ec99ae446cab44a97001f0000000001000000000102bde64bdadd236469428f64bc50e2cc8d5d6f1a4d89c84657569520aaaec8521c0500000000ffffffffede903ed5c56f720af6eaf992ee3d688bfbe10bcbdf87ae5fd2cabc1f2cf01af0000000000ffffffff02ab3e010000000000220020d265e9455c92bf25821580dbca4fe41dc186c52a8ce35b60f80640169a4d36146656b700000000001976a9142fc8e805bea78346ce4f8e772b5a5bfed160ee0a88ac0400473044022068738e863641d5dc11e32b1832a29912af3e3af4213f2f5132fb2a50e560d54102207c0b3eca90f0dccc65b6107960f480ea7b913edc14af730d72ae1905cfccc0090147304402205eb0b8a104c2eac342aa9f003799987dfe8ef55a6d3d5a8db0da9274bc6d51b80220349dc89b77ccbfdde7c7df02349aa85e97296ce3682976527a141ec1a905bcb80169522103771891e71dd6810d1d0ed2aecb8ec0e895a879c4f2d809805632d97d28dbb076210373efb58a6a3ed1017bbb4c86bdfce5e1323bbdeb99f288d2d74b77650b50ca1221030e84f3ea006c971c0a79013e05d8f577c2f56c6690db70bb4596eebfd9b5283b53ae040047304402204b03f4e2c3e5a5d4dfee662982e45887f5ec7f0332b1851354ae034066bfa239022053403226c371a743a991bc8ce2c0376ed5a5b44c7825f74ce9cd5f568bff2c0f014730440220723fb2038aaa319fc20df318059a36b5ff02217d3ced6fbcd7d387a9757060a80220729504185360d6d3d0107d0f5b268dc890348fb6f54fb3f53262bf504dff1e3b0169522102f0bc6592d2c1b769b49cb5ca4c8973a4f0e33bbaec01d736b01baa5a22db49912102c3cb927f12a94ff7c2e3f578d328445d15f26c587ee41853a7cbb3ed0ff99c6d210332fc5bc30c3c9e576e59e441f29e9151e52aab9c1d2a7ec7f176b232b4dad2d453ae47a00a000200000000010201a5280a4fbc6b8bf5703e6f920e71c38505a8d1bbaa1536ecede39073f440c6400000001716001493b35d56d6efc3fb94ca16e416784edc3ae2ed83fdffffff3c38ea3561203cde49dad0af65150546d12a264c0ba9dca83fe74aa0481d7f2f00000000171600149848ecf62233cbfb2623b9980d7871166476c319fdffffff010d313b000000000017a914bffb7318cf11b38a2f00faab6105ca0f5a7d2b98870247304402201be62cf4ad7ea1b9d89dfd841723d9227285a609f8a53eb2884117552f92776102200a0d1a62cdd14aa8bf3c23e9f4f3e93c2602ad11d2417dc8ac544606cf66b97e012102e986427ef34e2045e975091d6389412f903eb543949e36bc3ec3b8c3e7a5d1bb0247304402205271db6c5152e69f885cf8320a99557b72414738915c79a1772797e8e6a451470220328761d870790cf595cfafd14861aca2e30feb976f6d8ad34914c594ebc17b29012103cb6546712fa3e9443bf5e6a6490347f0dcbd38abdeb82d5ff6000a5647e7e4bc000000000200000000011d56e9ef574aeed39b0a22539e9310c746e1d6faed8cbeaffdcd1ce0225b64b0e01e0000006a473044022017441bdbf96ffe0a68aa1d481014e62f5f6bafe8a2d380c44ed8d2e243b56d6402202c2a4b325c67cc1c5394799fd10645cd23d93c9d5639c49ff892534c961099f00121027052fb0dcbee43b14bc42714343c63d63b63119ddd59f70636dcef7b23726944fdffffffb645dae37a34ec98261f6c4a79c479714a30603950a2132a0edecaa07fc0b29e1c0000006a47304402205a33c764faa97e29017626587ab617d942dac8b272f44d78a3b1eea0e9b29f13022074ea6f7ef6d0b45a5467beb4a82e893336295dd126852e3e82eede961ad7d472012102470d4e0798f9bb76f4bccc893f50fc66a7a56c685c508a057fd8aee655f5f1b7fdffffff2ae2a1f01c67806ee111ef64e4a90a664087f76591d211d6e6d40584c134733f0000000017160014a8d7aa71cc2fb6812f9b72581e4a1467c35b0e0cfdffffff669fd4b1e924b5c1062cb34d1fd62809097d360e69b99d747d89f405be5de9b2730100006a47304402205f434088f5f36ea11fdfba7c723aa58148746ee07155d2639400b9a0cf1a51ee022066624f00c2ecbb0a52f142eafd5c67070a78e6d40e7043e4c0917d159231c17c012103808699afe5357d905944e50d9c93152cf6b0e734be65b1bcdaf22599b3eb068efdffffff9febd15657be8777e1f27cc1e189ce35dd6490c6b2c94a70c00f4f447ff6d479020000006a4730440220768a08778028226a773d2f242941d80f7393d2ed031d0c8fc18b54705960f029022042d223848a3830888b302d3f8230320087a191c1a632480035390b88056eed2501210329f527dd3601222aae60c1b14127d9db44725c258cc9142b7579aaa1c408977efdffffff7265f31458b895e117d6b8271eae91790cc74a23fe7aec6754ea3726ee174f8d3706000017160014f6108b94703ce2efb0bdf491358062d24f20c2eefdffffff04c917c2f41cace332a53af52c4d068bc881cf8fa7a81a1a52027865564afd96010000001716001450bb0b9e6d00327ea36313ec8f6d8294a20ca106fdffffff4df6c0d1484bfab722899fc86233da3dd558c50480f0c93cde7656300162d02d8900000017160014d4f15742c27cccc2959cd04879aec0643047a437fdffffff9ecdabdffa9e128ee27f038dc1df08a88044237e3c326dceb3de8c1efa84baefd40000006a473044022053b324e5346cd55ce772b77967459b2744726cf7af051da9785e29fb6972dcfb0220176d152ad5f9a5afce17df6b9f154ca19676552e9c85855a15e9fa58e56d26220121035b587b840adfeab8a2514d5a4c7476e69482ff6f8484d895b53a4227a22889cbfdffffff10a075f2d9e6f31eb0dbd1f0c2cba4852e64459eb271e26ff03db498816a7e8f470000006a47304402202bb37eab088d3c0337cbc4528e73abc2123cdb56005dd8c314baea24f0cd97b002202859b9615c128132b881056426a0fa8176d261c5e2f7a220ef6eef1e56cf0609012103bfb17edf8ad4e331216353c421a934b70191749b01285092204229f5a134439afdffffff3b4492d68ba3e69584b9d44883163671b0558926d5b263604a2656ea5f35a31b000000006a473044022065faea0defdfbc4278996de8a5120b18b7d84c10afe70890eb342cd7864c11670220784d1d726b6c51ed8a5f52b2cd988d586d0f2aa174669a9a99301976ceda740901210380040c7110407becd011d2369d5d92f86c87214765a20818142240948fdc1e93fdffffff5f4797f656c694a9020f5b0db0db527d8f0dd808fd9a2bf1e4fd47b87f4a23b6fb0200006a47304402205cb72144fe94c02d0b4304fd9820cec187d478b3edf1c632a28d482b388c353402205b7dbbdda58853b550e419a392670f82b7e4ebb849e0c24efde6601407d75f0e012103c087a3e431126230df4c6584eedd6db45f26098948efd136bbc90db3b2a40fdffdffffff21dbca8409e909bdad12942e9d238cb58c0804ed8d808f1447981ea3aa9fca47040000006a47304402205c4a09deec6798fd0e2280458ae4282697520e84e95c13d1d1e806910a308b97022010dc647d7517c6613df872b6acf16a4f77134e5ab65c672987a4c226b1e50eb301210385541a7ddb6d70554019d08944da2d42f2391c8a076d65641635854eb59a7683fdffffff7265f31458b895e117d6b8271eae91790cc74a23fe7aec6754ea3726ee174f8d4b0600006a4730440220048c26ec58362a9a07e657f67a19954e4519c251c008b6472b105d65fe55638602204a7ad3c9d5cfd17664449f4516c0b8efb02124836c0ede17a4ee65984e5d144c012102c92d3ede08de2b98c5ffd13a9972ca6d39112b6e30655da82f976962a83073acfdffffff89d6d7ebc36f1da4a9bbea2134a660cd15789c358be7630242dd0725a85ecbba9b01000017160014432ed69502cd9867ff240359cb5b681ab462b941fdffffff53625126629f84a0bac66a1fccec949e3216872f1ba299d947a70fe3d0e0f1a0210000006a47304402205f11a85eb78683cbabfa02b304476ce13b233036bbdfafc357bab93c03e64d9002206a618e4c9036f8ba25e0521f0ce471f1488282401b9bd5bc35094be7312938950121022642f721ee289c32024eecec32408c3fbd00f1655bb11fa30aa7f58f504bb4a0fdffffffef5463fd230415292df2525d9c7942ad193c262532f326f5d3fa441772e7103b050000006a473044022032880c0f079184d776b8b268016ea6b9d3a3ebee4eff1e3c51ae10bbcff4830f02206b99004e6dc2d3b755ca9b8725777453f5f33b456f1e130a44d0d2bb5f170f7901210385541a7ddb6d70554019d08944da2d42f2391c8a076d65641635854eb59a7683fdffffff8b5f0a88f013c82e9ab913c7b0f0530456336b198ee419d787efb7f0807b0de6190000006a47304402203efe9240c152bbbe449e599616ed27733ad04fcd510cd77c8633c8260d962619022007cbef277860b1b5ad94f1f4a42287bb6376c3219ad1e21be9dc6411ff7d0263012102565a65b59244e3417fe23965702b5886d35a40a56f1cb0dbed2813eb06c84788fdffffffa6c1c17981a7cf303b6c622b9cb04b8a35cd3106f233783cbdc9a11fb6415396010000006a47304402205928943d543e9413d6ad533a6d0ad99bf86c235fc792af677f647a96d37c751202205f543d645dff10f695a863835dc9791d1aaafa0392467032a79ab847348e5658012103a46e9eb73e3ac49e64ba9712136842d984b6f19e1ac78ab40e64bfa024ea2f06fdffffffeed9da3c533220b3ed3bbc25bf099398b80c2e4b29857e653c1f4817728562cb5b00000017160014d664ac70aea7642179787ddea7fd796fba2792c3fdffffff898afc129e7605fd865c44d475e55df407bf7dd1154a0375c0a8c23944fe92b5040000006a47304402207f781f3b610b5047215e639ba2def9e9299d8c777e69ea62e42592d3fffd3f8802205aad2a4da9035fd9e2df4d7c54a6ef5effd4af60ddffa8f78e08b9cd7bd7274901210385541a7ddb6d70554019d08944da2d42f2391c8a076d65641635854eb59a7683fdffffffbaaf768c7b258892509127a5fc195e03b026be03f46ca5d7b87b075c393ff73502000000171600149db27228e9bd1acbea038d645e2bdafa4511e3bdfdffffff6e01abd306f3f2a3067ecbe62a6d2ec6d8ca08405a009e8392b805afdf0d600f100000006a473044022049067e93eb5fa48f4c14831bdc90c19752315b02c4abbf5b06c61bd0b4df75d0022073afa902358aeb42f25ca2ce6a217c3dca11bf9cbb94bebc1edd600240160eb5012102470d4e0798f9bb76f4bccc893f50fc66a7a56c685c508a057fd8aee655f5f1b7fdffffff7265f31458b895e117d6b8271eae91790cc74a23fe7aec6754ea3726ee174f8d9e0600006a4730440220021fc1a19498e5c13b054dc47a27e1e024e06f8ed5cd970e5ecc8c166111d6dc02207fc5862c07b5d941b4979b43905a165f150ae2419477c43e6d0e67fbda7ced2201210246a5c53244ce63af90ab7fbfa6df9f8c9eba983fea9a7ea3da522a202cf33694fdffffff9ecdabdffa9e128ee27f038dc1df08a88044237e3c326dceb3de8c1efa84baef950000006a47304402201e4f15c07cf4360f7ef284dedc8044113f79b7dc6414cae9e90f91e2c739c2150220627f9fbca8f6402ca4cb931ba6dc1fd5325f85c44202cf1ddcca7839dbd7dcd2012102a133b1ae104910fbd254ad109fd2e3b8f0fb9d48416e1a9d7b7a06a0927d4074fdffffffd55856eea03568a4d8bc3a84f926c45a9c568c979469f08da4c3df7f2d3b6dcb0400000069463043021f7c0db1db84d34d15643dc2816e43a02e94b113dc03907d2de52f1978dc88b2022066ebbc2a3f249d4273fbf200f093a0eb21a382872d60abf4adf0d1a77c3e62760121034b021e229a515efc4a1b8e932affbdb676d6665d3588f07244be1ea0e3fd1e4bfdffffffbd0ecfae6acb7013f83773e169554b978815b882afd86a09dcdd6f213cae7fc74500000017160014e920a0bbe3dc72579e5ad112bf830e4377b3b992fdffffffef1a41ef46ba98d1ee8fc545a491a892a7acdde95fe3fde4c1e98f40dd64bc300000000017160014bf65a5d22e058898f5e0af7f19afc79c4c7944b5fdffffff00592cfcd927227346a83e39ef9d63b641cb535c584296fa0236cd98b9081fe315000000171600145147fd5b2e8899b496af531e09b5441d2932d254fdffffff0140787d010000000017a91422c6d7bf0881ac34c735bd8a2d045844ca00efa3870000024730440220147f43378a890c3c7dd91649551ab891715d23ddd88575bf6bcfcb4ea297bc410220436a38c8f1588184e438f078102b1a1bb3b7273ef125dd09d67c0f2fa92bc8c4012102fc65c1a74b49c1982889255927a7ac34c5f4c5851ef6805b831a48258d7f0c280000024730440220428bf6f2af6b43a7d0caf377126f17aa6f1d9240c0de572bcb1866722c1a5202022064504a4802b88b68a3b9008eac9a1507a1eb54cba5a330a62c8bdf1e54e9fa40012102a2cd6577bcf8cba47d4751f9881f5a8058c45413f60175865ee750a2f9d563ca0247304402204f9d4db2735b47f54cefeb8d4b3fe9aa32bdecfe3bee08e282924cee86c85c5f022051291a456d53781df752a8117d81d827d6c68a1a97e0f4116076da19fd0f1dd40121039d44e1f76ab73356f15559081991f81c37586692559a53b3e2e2c339b25ba51002473044022059ba86c5670922573e210d8dffdb4036bd2238c6fee44019d99e5561856e39f102202c018dab64079eebe59578f96690cbc9671c376de89092625cc55c6e594d0a0e01210333219a53b9aff1a172017506bcd8df024655e880d5c9b6c8d4ab79ce9d2765d30000000000000247304402205987af9d6bbb6fdebb2f0d1d3a917f65ed5253da23b2527e4455115b5bbdc324022031e470f51ec705c12e22b3a44e93a2433a27a74e7509a5eecf0676290d7a2670012103409c6d4c8ff5b4fd13bde4ffd97113148baa83e12342bd0a545d2c2973231dec0000000002473044022020d8f6f8557836c00449620f1b59d832a9d7d6341420c97b6737934a17dcd617022026ade099f6c951f585dd8441dea4f3078c4e187c67bf4ea19543c9b86644b6c5012102cf299741ce02c3d2974767ac2369a17c4b78ff188d6636f391037fb51a2e2bb000024730440220197b2d40e74134bd087c89d656f4853f35a49f55c8365d5edf709ef5dcc73f7102203c114b7fd6c7593296c0509f0212d23a6d63256b460b8ae1edad7a814dbfb263012102b5871eabe86a1fc4552ae2dfaec87206b69924343bc6a93d93be6fa362daaad90000000002473044022076729e66e563052f47a19853bb88fed9cf71db596ee029e9b6ab598d0d79ac2b0220057e281f079295054af422885b46a8961e278363adfdf9c8e0cb902cf8550a58012103b5591059dd77337ec29bd3ab9637645b2b9554232bfb38c8fd7354849d75be51024730440220034f3a9faff17ee0e8bbddb300d3d60b7e044b97542182cf6d7363fd1305df05022015a461c122ed55ba18972b2541112b9bf50ae9e70d73e3c70717b3cf29b675b5012103a3a4d200731e50868622571a34040dea94f578482c6b4e8b6d3cb19a778d16ea02473044022059081081652698b2881a87bebe1a82a0faf1db70ce095b81dd4891e716fbd26802205b716237a1c16d179f308c2d772c860ee8ee3e9229a7db16ca0a8e80744d0501012103afb8e3c4f739f33f30f154e7fd3222832be7825e667deb7a6ccb908ee3aa731844a00a000100000000010473193d49b2e8021fa6f9bf433057822a197a6c81e48fdd14c332e3b398380f293000000000000000000b322da0b9e7e125ca25e4d4f1b00b7f2f875f9747c2806fc0f0ad04954eadb71f0000000000000000fbfea665dd3daa4ba78ca2607e3d7ad67c12bc73b433af7c0e47312041638048080000000000000000bfcc5977771dd5e45c5ac34d18d44293fd7ede26e867b0ce74d2926c0b6e006d010000000000000000014870b6050000000017a914d36749117ee85b22322ef20a433911c8fb1449858702483045022100cd529059ad28e174f2022f5eaa2084c9a905a8e0235e4df9f7acd42850bf10f5022077c71a67166f2b8905e9280c0334b576c2dac6aae9951e8af5db5b1aab7d63f101210352c25409c884de50422a9b5ad5a59f0c6d146dc19e1fbc3a5a6f91b4e364a25b02483045022100cf3cf16ac41e8032317f5d5a30c27e380320f8329d175ad874254fdb1efd736102205f7beb40ea0b50070b9521266028a48651e6d5e7ca93e3bde225e87dc5d036a1012102be0c56bdf15e6ef62eee6b0a8e54e9b2b3eeb5e2bf4f01d5582b94a4f3bb17aa0247304402205abb9bc034a89ae1e7ea2b7b0af677d75a6fd78ce4a9535328900a42e8bcfe2c022043a3c006cb43ae910cd4bbe491bee5ce59371cc257409f5f1d9856a117eb0e2c0121035e832a32a6a118159015e293ed772255ee50e89e0f8f9903dd0145c0a17b00520247304402205beda515a8651e20d1d1a0309e76d307b1245d7a0c5e4937ae8587a53a2d725b02203e88b41afcc7761c17126ab2f2c96e2e2965e60d56b4eddd76d927aeccfcc2820121038999402745d08ac1ab6adb3220308da59f260aa0766f1ef878a9ddcee920a07200000000020000000001047562cf9fcee9a40dc003d47675f997e5e8ad0232e560cfbe59740bbb3742bb3273000000171600148def566553b2ef19931e8d2b9624f81c4c0591effdffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a2000000017160014936dd8421dfa09fe568828645fd1d11b3e3df5b7fdffffff1ce05fedd416c032c48a21596ea39132cf71a4c426ab27b6ea778525f8fb4b6003000000171600145a4007c3e395c74c7457e9d12324834ae3f40682fdffffff620cac8a97495ce0b0a6614f526ca5a0e5f774e9677c8b12fe3148b5894759ff0000000017160014911777bc6b231068a246318b2d6db96a01fd72defdffffff0336c02000000000001976a91489d618a3678976a30963b8210abb6e0cedefc15e88ac440b42000000000017a914701995d14beb925cb7ba37f42131cfed5383968f8773c11400000000001976a914f0489e3e4de93203352696769ee93db42caf14b388ac024730440220270e4751e46b814edf62c932ca33f1f72d8a5eca26d2534627f66b58c509333c022029bf10a886c32d3f71cba966e4bb26154e96b7a6ca8dd554b41ecbd995fc0b19012103c40760027ad43ebe16921906365d6d0ea64b205ad96955972d13691b5c7c60af024730440220009c67d1e0572d065e1096f0cd9c3a2049ec452ad909bc85cc06ea31e1e5204b02201ebe09f7425462bad13a41354d4283dbab9ed7e231e135c9cda8115acbe31d95012103dacd76227de638b58a08a3f0de47e6ff99150c31573db33b4b3c1825587deff7024730440220390cd2b370469976268ad781b7219c73133b76473925624837c50e685dbb2a6c0220649b28a6af26310ba999f4984b2d943df2300228a211f7a1938adada1719a6b201210310e59c0c3018c0705a79743548e72e30931cecefc7ece8d480e0b2de2f2592aa0247304402204c9d8128b6a46f0401168394fbf4ce1cfb0bc97092540ccfaf024df736faab61022027c5587518b91807248d113202e5e868f924379c4364974d1a45521e0b11d6ca012102647bafe9bb7b8aacd1d8868eca7191f963faa512066d56c704df64030c9a241048a00a0001000000049c5c472de3926d4e12446557aeb9094230500d7fcb62e9d1841f8b69129ee5a6060000006b483045022100e3069d24ad0172c24588b74bd3c86ebb0d91f5a9716e1cef138ce363e695055d022052c40c81ff55f65bc372e0d4d1da1485f2e26acb8f522cd8e82620c24d31f689012102dccdcbd47cea9a2c7e77856d894cb382e403f36947b102bd6f3c124bdb1f5df59bffffff7308983e8cbfc50a3c13893dac19270d037cae9e14042024899dbb82fcdd168a020000006a4730440220684adf5675a95592ed2f135f4e94bca32e65e9f8c6ec190976dc7a1c4b7666a402205f60cff3244338f8c05bf8f0381b349cf94726df0cfc3cada375236ac72bbffd012102f95fb813a1fc18345bba588d9d6595e68828ed49093abecf01a2bf83aea9ae999bffffff5ef36c7551e39d98b793d28e41ae9e7baca99920ecb2b71b0606c1b11816c137020000006b483045022100b9e91d9fb1658f3de1da24f1f1eedd4ed6f3aea7bf0a818924c3121eb3b9288a02202231b284da4a3fc3ea8a92060b0d5aceeb73bcd8cae8463fb77950df01a8f053012102dccdcbd47cea9a2c7e77856d894cb382e403f36947b102bd6f3c124bdb1f5df59bffffff749bcfcbb1917ffc2e0d5528ed98dbc8919138216e1b96eabca4f7fd3b91ce64010000006a4730440220012478f0dc2d0f942e3a1c70e630322ce5838dccae18ee2ccee62249ea38782d02202581777e51b102917faf667a154bc3e1b87b6390529826a4f47d2de41f28428f01210395c86ccbec0688e6e5143ba6fb2acfe178f8ba6d557516b83b5b1968bdb4f59f9bffffff01e367517b000000001976a91460bb1c1cae8248d4cb0960887d93f831f29c5d7088ac00000000010000000001014ed605d5a65e1b3b5118459c4a71cdfa63455d51e2264c02c178c04b4a0ff0d20100000017160014e2d2bb743573e246d9db896690328aea6eaf2313ffffffff024ac0900000000000160014e52d2376f8654d14b91bcd6fa51b64a920f8f8cdc8db10040000000017a91403acda23c16991de161fd058fcb056b56e6f92bf8702483045022100f0d08a089a32c8879389331ae15a7ca3f43c8d81b80eb3a84c088400f505f420022018a890c7ce72569bb9b3994c28c2931c229aa8a8e10be3ab13fcea2317af6995012103a5ad0da6289d997fa6672c6be901c0d57ebcab62b0c7342bb87a6563198c27070000000001000000000101056cbf0bb334741344e7b03e362b697052a475883059aa63dc8791171e7869bb0100000017160014287ec8a346c76a935d95d9c141984c4f08b3c294ffffffff02542beb00000000001600143a5bf19f9b86cba7e794b29832348dd4208de26690ac25030000000017a91452563695ee8f916d39b5ab0fea0c3c75922bf4ec870247304402201311055d526da2bd50883415afe45ecf4c12c3fd257a793df107d36b19db35ea02204f71c61bd1765eea2d97aafd4100fdd31648a4987bca3000c9af6492a8116508012102a0de3ead07065f68a4b545b3662a9b27e48d1985718e18aec0c163a7d4ccf57900000000010000000001013be913511033825a5ad733f445a29cbf761a8c287af6a1931a9eb97641ef72d001000000171600145678970ce2a0b9d02ab69b3515b09410266fc2e8ffffffff024337eb000000000016001452418e162bb75bd115b19f15454eea1a375e198f69713a020000000017a914866a2d7e71354d95b19f78cce7b9594bc097567e87024730440220479de1ce2d8b18798802a805ca114545bd06890bfe001058e5c290d2185900e002203170209e92cbb8c4c34bd2cbed5f0aef4b27cae1e66c61e94f1c08ba3b946570012102764ad7a299ec5722973dce5b7feec75a6f58f2c3d8bb1b242ace4bdf64fd0ac600000000010000000001016c397843ce03260da6b9044af6e617517755c4ed6d3c231595a2128c2292d52d01000000171600141524264dfefd6ded439a6afd151d6920ad6842daffffffff0272461c01000000001600143445ae1ec166c09bc914f75711b3d436c295b13b13271e010000000017a914342021b23658fa63f74596ae17f0c32e81e076a68702483045022100fa29fafd47e607b774e65ff4ce543412c6274fe3c29f64a9f8fb0f4fef6eeed70220079c3544d8a2326f6ea4cbe6c612e161141f82478b87ff5997e152d0026d1bf601210331ee628efdfd4e1478b30f57a79799cb0a8010d06300b37ea9f2ccaa664bc9900000000001000000000101a379e86639aeceb83085d9958d40ad244f888dc37f81be89001e6a4035f0511100000000171600144d16b976776effc4767476304dd1aa3c4a429ea9fdffffff025c2c01000000000017a914b229a747a771fb916c1c51afc62576e47b75e47b87760d020000000000160014fe03de26301326f53fe17e853b0e911f760bfe0902473044022057881c660a9f4287f1d9ca78f23136e02d32bb9767d7f03d5b130dc2a72e95c002207b805e2dd91943749ea5a5fddfb4c59b0b8e63446e08f57bfaa83d00888a0edc012103982cc24b7c27a25a1b8ef51104947afd9f9120c720b711d416baeaa95546da8d000000000100000000010120fcbf6658ca21301be44634544c8bc74a0bafbac200770c0c4f6c8d644762c7000000001716001469e6e62f7cd060ae905f041d4442302c2119b39dffffffff029c0a050000000000160014be990708ac2448c8996063059e5048b94d031588fd1b1c000000000017a914ab05ef93b7fbe4b8fda90160712297d3abe0ac258702483045022100f2d97ac501df1491360e74f4cca594e9d4061367bbb4e0781bcc50e6b7f5a880022012d9b9ce06183d087cf0bba0d5c8909f1349ad4760c2b773fb7f851f0ecec85a01210224fd850c02b1ce66b23230fd09a5dba2fe1e25068bceaa9d33a601b6d2a6964e00000000010000000001012e7c8406f40eee14068ba5547d7e09e35b3ef4d5956c867bac9fc536ddbcb3bd01000000171600140720791be6219491018fc63a6752c2a133a92c8affffffff029f0300000000000017a914c971bbdcea65f3cd2b7a5d69f345f6cbbe54681c87901f1e0100000000160014a8e82a45c3f4ee1b1e05fd80608e1a4d0e758e5e02483045022100ad88405dfd547699ec922817a318a8631ab6f917ae60cc40e6a3ad6948cfa7f002201081229f8cded9256da2ae0c5d14a824186259bd73557ca42c697ecc48c270440121025ddb9717e35303d9cf1bc6df0e35f097ab19ec0cab572968ebfca3809e31dd660000000001000000000101bea72d9ec544c080f99b16575cc48e90699de7243cfae736aba235a9e3c551280100000017160014c26902f6db43cde1b5c4f9aaa72fd0a5209ef0b4fdffffff0230ab6e010000000016001469e5a18b2a49acec5f90a1745b65ab9382a0f89bdf01fc030000000017a9145cc903b87e714f260e220a5b8c819ab8488fde798702483045022100c323852987265c8921da23d0e1fc67c01e5ff152ecf7188915ad66e1d946e8d4022006ab721533352fc87d8872e13b07ae9b9a6211f3665d913e6b707dff1f339dd5012103a57eac38453ae4a28738547cdce81335c318e114b1f62dd824283c5927cc744c000000000100000000010169374a8eccec9b9e6b13714b6c34593973d1e2521e2bcc2e1484c478727ee5930605000017160014d192bc4f97bf89e8c119680f587e79dc847e379ffdffffff0284ae010000000000160014456cd214642611cc2844c3c667e48f7eb5c878f25adb18000000000017a9145b15d690e9d7d1862b7da01bb5962373dc570e518702473044022024eec0be2261e0b4d30af1af502165b7dbdf1813edddb133f942b7e6e574732702207762cf73ba5f6cdac41ec4c8ceaa88d315ee1e36a18dfaa4199c41c00258d61b012103fc3cede4b7d0ade84c4e68fd90478dafcca0dd94e325880b0daa65faa20e29fa00000000010000000001011d1bc71247a4024b8f519d6e65375ec991203ed02ae6b8f64c29dd2c215c6f2001000000171600146f9515b575b5f5aa791a974782b1f21c8169a839ffffffff02f049020000000000160014fa82e264b5df0f4c64bf2f678279f59ac96d4fd2b26c58020000000017a914be4f989a06cbacb0d0a1d338c1bcb4bf137bbd8c870247304402202b4989bd42ea0c1deb0c75368b72050b6d927598f87c3008bb123de2fef71c3b022046bfad1386386fa4e45b09a6b3431a9eee9615a54d94fd59067419039f61bb1a0121022d7536acc49cc3a1a64242e6fbf0b88421c240f97c08ce3e9074bbe54e55f2dd0000000001000000000101c4e407916edfdf53d5ab8a7a818f1d9077a4cd62a9b1c54a17f1524c6163170f060000001716001460d9ff48ce1c2db801fc5d6834f036e5837cd613fdffffff02e75c030000000000160014456cd214642611cc2844c3c667e48f7eb5c878f24e3604130000000017a9145b15d690e9d7d1862b7da01bb5962373dc570e51870247304402201b5991c60df8d72124ec0c9158184ee727e0a2c2ccb91dc93f87fa70ece8832802207461c4cd26525b6a44fb544615ebebcb9c36a527558db7e4172ba7f494775fda0121038a7189cf032f03dbfcc98a01db4c09935c3141c84b16057cbcf22fe50f8f869600000000010000000001016dad3286424f42eb659ae39efbb691e3bc9fc748e8018d82e493ce538e0009bb0000000017160014352a36976b06f57bc802b5fa5f34d1b28d2e8268ffffffff02088401000000000016001486978127532ebc4d1a5e4e52e8d8512aaebaaef73d7c44000000000017a914b931dfdf03ba48f7683944057fe0ee8215cedf17870247304402202f16c7bbda770399a501a76707e7007dc9100d61324b6dbb8c3d1921e2b933aa022005d194361cf1e517ccadb360a205b4a7766eb84f96b8df018ecdad7c8423bdba0121038eeb790d402154c4ec5d409ac2a93cd860701f3f98596388c0469ff3fe72982600000000010000000001013da42b08821792515269222ea99ab88877bc86c3ae15512aa807457bdf1b742b04000000171600149b3e2786178f4e9df70ddf76b01d2677c7ee99e6fdffffff0250458c0100000000160014f8e96d40954ebd36df2da900acf5f1d399438e956b7d16020000000017a9145cc903b87e714f260e220a5b8c819ab8488fde79870247304402202c8bdf5787ee5787022c7e20d23c6f26b983caad873a454260a492feadd3803302206d82cb767b7285dd052623da6e85b211af3bf61e6f0bb1e15f134bd0bafc26ce0121024ea19963b898244dc78b85361b2fba00e0bad41a40c31fcb8bda552914257d3a00000000010000000001010f5594e35c6111f0c21691381ef3fea5b9efb92afc2876ba0579a1d4b556ce0b010000001716001489ae90918bc9c9890066402343698b84d0ad9367ffffffff02941f01000000000017a9140df2e45731469f93a77257889e1c59cd7f3a4dd28761834e050000000017a914becfd4fa6b7152c3dc84bea7cb2debc09af3d0fb87024730440220458aabd4724c5d2ece55e575c2fa695f554ef9fbadec630af3f10b51732611f3022035b891ec0cd0d256f06a31ead5405d05a015b63ae02a188e00dbf7bcd054eedd01210221c495f2a325f9462c7e45ef4c00624242e6f9c4d833a0e4368ca05b96007f0c0000000001000000000101c3436488aa610417f55e58a2ca8f61285490879540d03d74194f5e5c501f0a860100000017160014079a80e1f90c8f9517c54460990bf031bfbbc9b4ffffffff0248ce00000000000017a914e633cfefd37c32428d2e8c1ad6b5412ee3d58c3d872fb14d050000000017a9143a9f90c9f73e692a24d5b442d5693dfc9324e265870247304402201e1a1dc3c5298158a87409eb9241b71d21a360bbab589ef12b23e606b274639f02207f9a834bddfffc73a8268e7827f08e688086974601e4d9dc0e5a0847f508969901210255d868545e0a600581318b8174a69476251c10277d1ab2a6c4c942749d4aa7ae000000000100000000010130c7181ed93a2d6c9784379cef69cc0befa9a2987c3d9b81f93136a8e626683a0100000017160014e9243e33d13a4971af805093729868676ca898f3ffffffff029d4101000000000017a9144cde92e8c7ef72ee59eee9cd8ba09013a238db9e87a86b4c050000000017a9149972e039d0fcbf351ea64e31bc46b1a72a7b581b870247304402206ef06cc9dec0f62f038ed6b28cabd8c958bf9aba58a7457d5541dd5d2cb2b63802204c50b10d25b8a1715f8a3a896e2e525581951af4f275e648f6ac56829f899d2d01210359be4f0cd4ceb2582c96baa24996d8f1dc4c33fa978075635edbfe572735013800000000010000000001011f3048d757ed8f9466e7e6b1922dfcf52381fcd9f5042a0e519ddda1668a7b770100000017160014ed2ee2b62189910487caf820a9e952eec7e71410ffffffff028ce500000000000017a914f3ce0328e9c11e2cc628fb89fe4592a5abf07da78732824b050000000017a9148674cf9110d0e6083f1ed2e6300f33260803ff1e8702483045022100db45c12b4552ed0e28dfc5a66c42bf73eb221a217e9f604754c8849b7eedf7e6022070bd6e7748f76cbbd30eece6c6d6edd506c57fc04628ceff9be665f3564695cf012102c879b45190ad994765978eee2f999e108252040c3c62a29e3b50adf2a5e73b9e0000000001000000000101583886bc10c9a4c0471b9dce90ecc9fd2a053a975791cea1e3d1903f9785748f0100000017160014f410d61cebe810f053537299dd93504be0149ae1ffffffff02243b02000000000017a914e9ddb8975991adcc8a511d2f02c614d32bf6d4e987244349050000000017a914822a3665e56113cf5cbbc4cea568caa8d12b02f7870247304402207494657da4ae24a9e274b3ba2bb03833209d8e0ff47374f31f6e27b57ce396c802203b0735fb92502e42272268b333b654e2d66fe584654cc103d719df2e66cda567012103e9069cae203d33dd34eb2032250770f070983829fba57a0886aeded7ce27f6940000000001000000000101588a9d6dfdf31b4c78680b4e20d88754acaa61b8393595125a73714fc1d75bf8010000001716001443d08db1fbdc7d23df0e3b33cd9c7a104bce3832ffffffff02b9e400000000000017a914354cfcf598da6843c7d03bc65bba2a0b9de67bbf87815a48050000000017a9148d832ff783ac3b3e0ed1155ae5eb53144b61870d8702483045022100eed17eb3c8b8d7c8bfa5d37ff77b4ad9e432dcbfc3d6d77841a8425225884cc6022048cb9dc330f8553a8067737f78299fef2e220ee5610cdd3eff008656f18edb1e012102a684aa71b1b48743d30478c2eee65d8befb7bd5bba2bdc6cd9d357684f6ed08d0000000001000000000101087438e31ecd8fd740700a484412fd37291bd83fc4cb62e682fbcc852483aec701000000171600142e4f683769979530fe4d88028a96f6ce99d1a911ffffffff02f8ca13000000000017a914f30d604f8dc15b5906cb14f8ddfe75fe56b6adcd87c53c7a000000000017a914a89e853b27194de05ec1e36521bf979232405c08870247304402203219a80ebad60b6ae5c45f795e3e66ace2d29138f8547ffcb409985e7cec141b0220788406d0455a5d607d00fbd7b6fc607bbf954822f29b4fcb0401bec0a2b9905b0121028f6c74d58d8a07d3f6ca6a70ecaa54bccfec84f6f0b5d994917e85a16600912900000000010000000001016f6b4a5a58547d27720cce2931dd610f87fa514a917761942afbc7de8fd978cb03000000171600141a05908409963177e8caa2b11613202c18f7d33efdffffff02e61844000000000017a914c4e8e91b6dfcc9751156981ba1c8ccce2779865e87f470b3010000000017a914850e65f24b5bc9d0ab15a485bd7e801b12340be98702483045022100f55d433a4e346251628de02cfe4fd8418728054d855e0234869664bfee31bb5302202f9cbb4cf62542c56a6b968d011db217262513cd800ac938cfe19818012ab90a0121026c162dfb211ae7b2aa22e317fe13cd4d6308535d6cb5bf4b192b4469b407bdd7000000000100000000010102015ce1b4f3daed58e0c858c2b7bb3a2ea74eba67ad47c36c3231b4d0f1820c00000000171600142aee6d528971a9cd00cf43ac58d98acacb72772effffffff02cece01000000000017a914394ab038dba14e63af661927e31b1b4885a479ab87ae4422000000000017a914930ea3b00a6392024925152bba9cb268169da2ca870247304402205121ef8c662e336b47aa7f10883e89c182b5b3c17c9ae3908fd33023b366263a0220053948c46bfbc08feabdb18a11736c34201849ba2817bc49404313ca90941cc801210262e55f53b1e3eb24ff720b9c2028b253249a70bcf4a88d468e778ce07230fd230000000001000000000101988b03bcc17c8871b0b983d535bde85f06757229089df6c88aaa7326fe2c97430100000017160014c4283c5fe0f414813ec4f993d7d2b3a164dc93b6ffffffff02ad1e01000000000017a9143730c203a86d2f74da69f7649d283834258aeb1d877d948c000000000017a91454c2778cb1695a0900af374978b549b0ab5a9e8b870247304402204672b9ec6f84bd21afdbd8aad4621eb8afa5a34ffb6b848f0789af666b22781f02206fc99628053e48ced85b663e929fb5ce629d9eaa4ccaa6750f0699decf6c74920121035589bbfcdd009eed70e50f069e621779b1f4376c25aec6f2d591c8b93800f7d2000000000100000000010106f49a88142801f8875d54fc2707e4cd56b530dc24036e68613cc9719cdaa74d0100000017160014a776858df491b3333f5c6b26caeb0635bad501e5ffffffff02fee400000000000017a91463f68d3bb8f477074ddf9cb24105b62ddac42d6587997147050000000017a91419562fab23f8fd0c11161d7e2d2162da1893683c8702483045022100e9247776faf0f437236b56f4d9cd45496784d482eed778daaf25ff21f0281cee02207742a467fbf12c8967eaa391e95dd351cc189c23b37008b0e4f0a990101f8300012102ff90e72c7d9dcbf84a4b147715438248e3ede500bdce7703d061a64470e158380000000001000000000101da9ad890c6ccb7c14cff1f89dc4c418597dc570c0e2b7f95532d8a953bd2d71201000000171600147cdf44d14cc2633154ec54c8273384617fe7d544ffffffff02255701000000000017a91492afb85e31377d06283370f7882112cc2df2645f878a1646050000000017a914fac688b26f59963afca20be8cfc50e8a83bd7ba28702483045022100e72f3a6d499da67c60aee85e3770e340d236c399bcab59750be5b951c20fee2a022058a82ac582dda8a5445a4cc5a792a712af3527417e67cee2f66c6c84b20ab3b7012103ebfdc1eced8c4c59bb14210e26e3683689cc3d3ffff50abd446f237043042dd500000000010000000001013a345ccd614ef7f2bcd1af964e5fead72d43ba9c68dc652e0dba0cc40cc9a1670100000017160014f67b17d873e2be26a2948f9c45b44b3a85eb99fdffffffff021ae500000000000017a914ff3e5cccd2f1611d14daba6710fdc58e07152b8687862d45050000000017a914508900ba4c59faeb7292a1a961853972833b6d9b8702483045022100d19acf2cf1442e1bd1e333c059e310e59f6baa109228136c13f3b87758863838022043c880834642e988a34d6c6742ef04f5cd20124b52749be7ef9dc0c5fce37734012102877a27d322698a0b56acab5ff4cdd8014207f8de638821d9659ff2ec6cde77cf0000000001000000000101cf6d5118f5f725241bac9c3439a2a37c0b71f45f83b36b8c6828457e2bceb1720100000017160014ca6bbf71acedb618bbd0383a582701339691aa97ffffffff02c1c900000000000017a9142e57cacae2e8b6aa41a0d9d676eefd7c74f87c4f87e9d503000000000017a914954ca664033929a98abd31731677c56fa7c746668702483045022100f3706526551f7c18aadbf96e63712c73490db2357e7da1c039f30e11937b9056022064c1f771db3060f148672625be44a7179174e65b36dd181c07cbb18dac3a2bf9012103520b25206434c83bd9ba6ee1464e83eb5ca7701b1a45b0d2a4a13547751a06400000000001000000000101067a734196be1ce4cc930e9c4adc380c001d9099e987df1ce91dbd9e44ddb88c050000001716001456e0b9d723e0c2d9c7dd52566bac9972dacc5923ffffffff02707c04000000000017a91473fc4df39363769221aa688660b6f74f8ffa96598755f305000000000017a9140d8ba77d98b32330d449162641b789dd35b004708702483045022100a9fa7b8bbbef8c799ce9c5343405453a93df584a2d2d5e620de57cc13a80729a02204dfede9e159a24358fa598fa1be7ff1b57a2507157647727608a0044583e8d2f01210276862b33e0ca32376489c9c4318e0c8506f52b37a26a16b8cf6d695e1d67a14600000000010000000001014e1855ee6136367374358297cc516987ae53ff7b4b200f5b9b8c5d95ec6b6c8d0100000017160014fa89b921fb9d67ef8ce07b3f000b11849ab6b17bffffffff0256fb1a000000000017a9147c3642375795446ed1803dff4a7db113574ae97187d09526000000000017a9143c77909a4b49dfa0cf6bd4466defe3074f66b288870247304402205e71f17ef1aed6890acb5ab7c43b2db6ba2bfe7241cddab329c3c8718b00f7fa02206e6417232a8bf64ed3cedc55689211e51d0dbad27a6c5db537a55686879d0bbc012103866bd62e9173b7cd1de5566fb6548122047fbc70d65b1c19cc96a79c8247a2190000000001000000000101182d1c420796127a567e691f4698ecd8a7b8078cdb075eea29104474673c0a3e00000000171600141a8d3aa65b2e840364e1cb356e2ff7bd434abbc6ffffffff027cee94000000000017a91401ad100bf14c2271981cf3b2bd770b5cb1c778a987005a62020000000017a914d48fa4637d8cb1199c3614bada835a7ae974c9fc8702483045022100ec124a8ddc5e9908b8d74fc493a86e350189a4b09c1de9a50667d78a3f329889022055a96a021e8bc2645efb521a4547e62e75ffb243944805902962145925b939a1012103f6339b20f1fd99e09c9b6ef94864c19df7c3d7c3d8c793c9c6c460b279782ee700000000010000000001014b5ec07a3da4a340f0fb38f8184438333df681172bd4f2c843efd2ba955eb9e10100000017160014b81018bcde33f9f434b9ce1b950ed9c91b35e3acffffffff02c1b706000000000017a91480e592494f6402f6b7b5fd5417d3af1c01c1e21687a22339000000000017a9142121f341e175fd56b40810594e16aae95efce098870247304402202cc721a964eb4f750aede101a620f0b09a4bfd7688f95e96df5e65d5bcc0a39902202fb0a13acee2d8b1057aef2e1b0b36d252d79969cd97d775c6b00a4c1b72c4960121034a5a8f6e2202e82b8df62f7f38200babc7abe8d2f1760e6a9758e9e3136e17ce00000000010000000001013191eee8acadc72c912157955946f12df0b45e997efdec42cfcb8d0aa45d5389010000001716001484fc924ac820875f43258624623d8dadf9c6593bffffffff02f7e400000000000017a9149a638876612525b989a461961153ae6d27eb530087a54444050000000017a914fe21591524f087398a3f49fb6bec677dffcac67487024730440220612bda6cb967aee5610b23054c48aa2a36fdc98ac3bef893e77294c1f2504be3022019f12d23027bc106d62062187825794b0a1f4b0de2290d2e418870a49fae1d4e0121031737563dbc71ca4e0a95ea4a2d4db2b922191358bed812232a7dd3ee735eb2c4000000000100000000010101f27102160782e9a29976ac0c60b0efbad8475969c7a86f03d04090e3308069010000001716001415d1ca07b16ac24d9b621857ae704e69de617cf0ffffffff022dcf00000000000017a91403b0f0602965d174df192a74f997df528dcb2deb876ef5ab040000000017a9140ec03df3a69f1bd1ced90f36bcd6f7252d89557187024830450221008cb9ed8b806a075f8626f297d9ea3ef5c7f8ea6eb3b6c39ee55804e3b92ba72d0220701d4c4684c984d9c7652051f9df7f8d449fc44c1737bf7c3248ea6a797baa5b0121039ec7bbad63ad6a7b47853b6c3d7f1e393d14a3afc0731689ab82dc043f83de0f0000000001000000000101c89982cb0cbe8a9dd75eca7fae963194b0ab528ec8043d4ed4782740d2d6cd9600000000171600141635589bf4a1420c5ef508a1164814a50bd6d322fdffffff02610a00000000000017a914d6380b15782adc943c0054f0aea5b46a4aa76c7887723314000000000017a914065aad06467213240b95165e4255983744a0db42870247304402205a4c1045a67483250bd5ef7c1e7747ec547477890af8c6474f11b8c142deb7bd0220542b7bd872878eeddbb2025afd5a1232b48f80ac51ebbf3586ddc35bce91691401210300f1538ce5b4330dd5df25f21e5e502472f58a948392455a7f23387fb8ed83ac000000000100000000010117c7c863bbbb32a6958543232ecf135b83a1f90c18448560cfa25901fb75a06001000000171600147c949db445e0efa6fe7499d5aef137abec03d06bffffffff02a07508000000000017a9140106fa5689284ae88ba3256f2f7088781d43747d879e4811000000000017a91415ffe5e1f968d560805cbbd072ad011ac7a15bd38702483045022100807f262e8ced563561f2667ba2b194afea3b422d3a43d399b1a52b985a7fef3b022007da46870c2f804ec1ec16917a6317f142ab706fbe9a11084332f9c2bb7857bd012103875824502f4e56c04e98e1f43bf69c256b5acba93894de25bd6b5d27b24a41cb000000000100000000010172f3b0c5304a2c7c495e6e82b9497d77ba088ffa4518f46a098b0e4d49cb83f50100000017160014af1ebbb8de6f434f44a6f9d9b152ad069b18c948ffffffff027b500a000000000017a9142c19a360f265a1dc815ca301a3eb14d358782a3b87c9de70030000000017a914106819fefac7c44d523b091e47ce820b20c519f7870247304402206b2a406ad85c6e8837bae2b38abfb49eda052ea1958c14de2fa02c0a37674cea02203e248fd77d1faba1733c67cb6d0fc4f0fdcf73ed64236b0d58e8e9d613480249012103256b91ffa4864eb98b0eda50f69e9db894f9bd3fb08be594f918cd604c5a93c100000000010000000001010982addb41260ecd880547d72e70d2a17333bccb7b2c3e053402e4fe30cecd190100000017160014bbbae2c80de5a05cb446a59dd075c1e1817b75d0ffffffff0244ea15000000000017a9145f9d298ebbbc316abd786b1dd813d1b1df841d33875cfe22000000000017a9149d3499f882d89dc63a94201e32d2d4b365f52874870247304402203b1332c8c8ca53cb18848a4926be409a980a03023b08292f74422d7f1b113a5f02200d703309307cb980f96d6b1eda37ead7fe1d9ec0ad24f916284021af0073d547012102424e988a2680a4bcd6fb50ec4942a957ae899380bba22f8e680ffad83056dbe300000000010000000001012903c8c7a5012b6ac58d875730808ae6acd81a6c87be8e41e7219d453be5eb640100000017160014e32e89a30ab9f7536e830c8ae4e546e0faa03a9effffffff02800365000000000017a914a6e5b2385b6d678ac74d1f7612ad910bc787551787cfdef5010000000017a9149699427fd42407619274f1e154b33671dba91aeb8702473044022057abfeec6576b73eb9bf14f64cd1282cc29a6c8f4a59e2ae069efb3c67811991022051af1d2ad0c4f239aad1fe494d986bc8edb94f6fb23b211d12f05487fde0b5ec0121020762fbcc9896ce61363a17c921e67b1fb2f591c6a7af6ea863315259e47d0a290000000001000000000101345314fad5c1e135fed0b638d1c632078a900cd00c459e4d1f27aee5724faa8f0900000017160014918d901b10578e1154c8f70c969ec468d47d24d2ffffffff026aef03000000000017a914a452e50db6bdcc7a1ff18081f5e6565a16b9db9587014737000000000017a914fd0d7da1854197289081740e23632e08d8cdddaf87024730440220261c0f4220c1f3c0805f1af9b9da511fbe623d1485638ac97c2934035ad25dbf02207106b64e7e9e26d3a5c35da6b7d0d54fa290d95831d6cc11d2bba1ce098722600121028f7c7dca222bd657f8acd1258b9965dcc81d9f9fc585f59b9fc2a9786cf30c940000000001000000000101f61407d94a4ae1ce41af96285e81fa6757edabe5f915c5a678ee475489ad07f40100000017160014d8a7601fcd189dc0cffe3dae0c0cc866dc8c0204fdffffff02d35043000000000017a9149fa2186694168b788b3d300c0ddaf3c2d40b43f487423aa3000000000017a914eec89806bd961517f38dfec688d9abf57687afd58702473044022009fd63a6155c0794e043e9504e4ad3a86208bf3bfc7b24afe79613d23b11206002207e8c1604405e552a96390dfc9825f746d7c386b153d90f7ad5c70349ab519a0401210320efb60547c9884562b668705e788cd2af9bdd81db0480b1122de65820fdd0b80000000001000000000101d3e4ce03cf983599c0795fc0f20f962faa2faf5525072e18937b9ea4064639500100000017160014726ec4b42b9bbff9e7b1ac0ac276e483a352ae02ffffffff02b0fe03000000000017a914993853afc629ecc241d8261d171204be4dca2c348749f622000000000017a914cb1e175bae772a6c58e09db79109e3d314b64a7d8702483045022100f0e1b86317c21fe784792da8c826968cfbb115ffd5396defac042a60044216fe02204e743b70aaca080f236fa9278fe1b483eb126cd4968de713e0bfa87906f13f5c012103e9351dd007f2241cdf49734b14610c80196fa6d08ff5d05fbddb4e3b157620b3000000000100000000010152ecc1a9eea33b015675119942b7ecccdf1293b0975d3f223569f7c35ee760580100000017160014d2260cb4f0260303303885718d75e4debe534819ffffffff0257e502000000000017a91466e095a03da82aa3e41f3d8dc5a7ed52af1c3c9387ce7b5c080000000017a914b402268818c160b49ba9ba9ea4b74acddd1930df870247304402203076bd839ace0391bd0a0a2148ebd32184e74e03318d6e1488c4493759c5bc0b02204c53f94787e93191e82f5d0c10e5267ec3372bcb8933ae2ec29788b98a68d16f0121020d129e4b2b84c8c75dedb67f791088421da9c825c9935ded709ad5bd10e1c28b0000000001000000000101d0d089a8e57846cc1dfa81fe3408f7be946da80d64dbeb7b48484471ec0058420100000017160014f69d1a5a873bac71a907203bbc7b5bd5ab5b01f6ffffffff02087404000000000017a91408cfb0e39dcfe442bea70aa89e9795ffcedcc43887a1709f000000000017a9146229374992793249fc60fbfa8d633f6210e695dc870247304402206350f16c6f5c269754ca9281a01fdab7daea91697436e9d7cbb8405339a36d8602201ebda2de3aa6c18895429a246c9753b1bafe46ea20a3cd42175e4284dd72cfae0121033326d97d0d47b44ede2152f452bdb2a2fe4b04f8b5bf751fe07723063f243b3800000000010000000001014f7b54faa89865231ddb57cdba015bb9222c0787e44dc0f78c3c9c0e5b157f9a000000001716001467c67dcf44e47323335b2f606a91cd1cf07b7a84ffffffff024a8e17000000000017a91474291bb44c01dc5713eb7c9f5a7d9c2cc64350d487a844ad000000000017a91444944f3418894680b1e299b3f221ff2763d8c8458702483045022100ad5f0319ae7e038fa4d9dac03ceaa03e92da0a51da7ad492e1c2de9a2855198b022027651778f9574fc21675699e213d6311c31a52a920c69a1ffc83c7247d39da3c0121029b4c9378a503e1c7a2375e9e6f9cef83bf76df2494a9655c3b88e674fae95e8f000000000100000000010187ec232a5c7007b02fb3e8179df3ca06ab5abe73c15bf140adc83b946fff9d8500000000171600147ef7d2fbf30c350777bd1844144ba0a3fb085fabffffffff029f430b000000000017a914d6d3cb9a7dcd86ba4d7852cef2b1d1fb0ecda91b87800f25000000000017a9141bf804b38290bdc7fa440997ec583fd7a510abfa870247304402207a7e0c751acef75f280ffd99dd8736357fa19a936ac4cebaf99497c40a91c8b002201d597846c7adea7ee8d7b20f4ee3d57ed601e66ab0ef00125ab9187b8a96016f012103380478f03b548c4beae30056d62e2d490b6eadf4b7f3ad905046dfa365b3b4960000000001000000000101059c2dcffb22efae2644b93e8af3d819c9522160f96f99094840e35d6213cdb40100000017160014feb1d5792968046239f7365fa3e6c40ba94a6cc7ffffffff0240420f000000000017a914bf610e4c98d45cfd92a5e4d1f4cfaf0edac8f00087dc1422020000000017a9148909691ad217ab27709439ea5c3c2948313353958702473044022025f6b51f4b726f67e17d07ed5156a135629d0f77d3670d331f1ddc1ea73350c502203f5e7d63baf81edebf20b5801c0438badb7604ca04d8418e138f291bb203942f0121037c3f8a40d011f2d9264aee342e0671b16b739bdcb1cb80df6358bcb54b834e180000000001000000000101588af00124b204891c8840514cc08b98cdc20067baf97fcfb11e92de99d86ffe0000000017160014726ec4b42b9bbff9e7b1ac0ac276e483a352ae02ffffffff02f50004000000000017a914a1b0f90c98e6bd6a24fa92f963deec37c681029e8754ce8b000000000017a914683ed790c0149b3f44af5ac8104276de5e908af28702483045022100c308e0d19e01fb204d9dde706976066563efe15c2e47af9f4ed166a92be0d128022052796ea75a36bad57d2965db4ec48e3a9484312374d16ed632a3dab0f18b3380012103e9351dd007f2241cdf49734b14610c80196fa6d08ff5d05fbddb4e3b157620b300000000010000000001014facbceefee8ddcc4daeb23db61b5da4c9e3b526f94691dca14ce7e2c10527740300000017160014065c68eb36b4a1cffe3f2e8a4dc4c551f8e12fbefdffffff02179532090000000017a914c374125030ef260eb4eb1a17b27367568debbecc8700c2eb0b0000000017a914e97119a4c90c66227fbfb93810bf25973e052ead8702483045022100a4b4f4d0a8e34c1137d1fcc6c4b1cc6dbfcc2d62011027316975f4f3b7f8308c02204b30daf24878d6e4e52fb28f8f6d2f527ab811aaa455c5bcd992844c6e848fda012102233b7573e66bfd60095117fac80a992765f27d9ff73c2dbf4cbfd4ed2b8c1cb00000000001000000000101448619ae2d6c4d947b9b590e67355da411217d9e5ea70753422d0de162d93202000000001716001432b498842ba081c0858e527c177269b51e2cb49ffdffffff02858800000000000017a9141b3aae1de5947a4fd2fc00be02fa2750892a850e87b5a801000000000017a91439df85777a082528859ca8cd4db8bc2db69710db87024730440220253b393464fb63065a9f1066019677d5d7e6f39f21c168dc87898a260dfb289002204fcc1481881ba4b8d2a3d9f3ccbfca38abf7dd2f7120c4255d9daf0f52d956e1012102f394a7b5a7f682b8dfb64c2752e4fc6810add915c0b863f40dc947e6781d38ba00000000010000000001012397f6c9691440e4670ff962886c16e61dbb969a606fd3074a0426aca092e4a60500000017160014fa75c81d7f55a6ba5a33f988cd9034c1e496cb05fdffffff02e09304000000000017a914f0296d127b92fdfa49ac350a1f5bfc26588046c587210507000000000017a91407a3378f2cbeb7f6729ff082ea8c47490ffc927d87024830450221009c9566536c07b5d10389188170df76e978a959467a7d17595c00d3e4b89f84f402202873d61458a44eecfe0650d67cd28ecae8a70b3dd4148dea0de0ae9d17c957e0012103e0485c21d402071a7d162dcc6018810dc6d6742b792ad83a953f8409769257f60000000001000000000101ee98e2d2fdcba48b24c27969cfff6779200ceb00fdadfcd83c687e67f6b9131e0100000017160014f060ee2b2d84f82ec9513be6c7889ba6c91ef73cffffffff02349700000000000017a914e9e3ddd9e87af15d482180a32e9c9cd5a7fe882a874a7c17000000000017a9143806eca6d814f5f8e774813937fcd966c43603da870247304402207e624c7aa3c5db8fc41c6c3b1f629b8c24a558edfb68f829b53f1123ab416658022013d869be43a61b79bf6682fd68be9344040cd407e7227d95f15da773f83e7666012103bf21ed6a0ba1e3d49098f9475edead1bc30e3d1c7a7299eb736f6e0f571205bb0000000001000000000101328486155a34b0d813b6f76d26467ab0763e9b1238cf2639bf17a13a050201bd010000001716001497294e0fc95e7913778cabc52f8384ea28546320ffffffff02f02814000000000017a914b79f2e5368ff652ba39aefb9c84ba9bf519868ad8749fa1c000000000017a914c280029cb4a740461723faa6b5dcd59d606ee9aa8702483045022100c8a61ceea866a220b7b27fa544e580bd98521d5b658b569b13b48cc95772724f02204ebd5574e84d6545af6ddd12cc0aa1d4b8a487d5caea66c9e358a7a6bc1a7b0e012103f44af012649c9f7169fdb5be8035a20f5bed27d2b984a282aac7dba678d73764000000000100000000010153ce532269ad2060b2431ad3f6887eb86d52657e4b5418cf494932f3dfce7b5b00000000171600141a6ff7c10a5c160ac9d42f02abdfc347ab5f730dffffffff02b0360000000000001976a91479efaca9d5d84a9d34d754bef2bd1e429380672c88accacd03000000000017a914afc2acbfc287fc4c5e6dbc359e3175f0f0d9ca1d8702463043021f0328b7962685448d3a27a398411dd3cde85bf13589cbc8f642299b58b1d510022013c754fd3a38efb48f49921db8c1c7c7cdbf8f5a99c3f128f3c54e64c07c61ce0121028dc584581e0e4f41040bb21576ea3e0e7bd5484a2392d2ddd20128c135582e5f0000000001000000000101d151c243288acb5c81baa75a09d730ee16d56e2d18b80707a6995b327438862e0000000017160014361ea94997d70bc598248edd2f35b70ced431e69ffffffff0220180a00000000001976a914a73cfadf49c77f048d3f9716e54aba6308039b2488acca561a000000000017a9147a149d3fd76e28fcdc1ebd2742a250941a61a23e870247304402200871e8c6be59e8a07c2d2873120d5c3400bbc165f4edcb2307c68a50cde0f12c02202e2cf7fa0b4ac45719a3139dcf48412689ff4df8bd8922ae005bf5636c86a2eb0121024443e68832c8fc68ff4e1f1eb409bf491850867a0f2dd88593dcf8bbdd93261d0000000001000000000101ace2bf3fbd316b222020cb5dfb576070fcdcf039ab6c08041fd0b7d3ed23b69907000000171600148a6ddb535a9005988d6a8e5666ddc24f7160288dfdffffff027df7200d000000001976a914d09c43f34f87eac2865f1f1bf73cea8deaca768988ac0076f0220100000017a91461df30d8777780bc6fb1fd84ae71fadc1107bed08702483045022100ed3bef9dca16e1aa892b988cce8c609fec688ff25fc98717cbc1ed34d244db2f02203cdf90297deb03a918551700091c989113b50c9e0a810f55bcc23f2e2e34fc8f012102825607800f554fd4f91e51e6670d4813fea51c01c485a482c2c467b0e6f269dc0000000001000000000101872b284d3f68de49d99018fa18c439612ce62da983e1558d0c408f2889275938010000001716001448d2a305442f09cd2548315b930bd172dee945ceffffffff02b53da800000000001976a914b23b14eade24f455bfc212492b99a3439e0c937788ac8fc970030000000017a9145929c3cbb2cfd58b8224348474cd38a6ba6d0cf88702483045022100d23da0f73f21a848f73666e80cad97120fa5cce220b06fe5356d5c2d7f53a8c80220664acd920135787661405624d5b940eb85bf6dfd54899944aa0b7e1fc5261c190121036ad178daa2a8c70f3c303365f5cb161ca02aa24621aa181e19764daa72ce54940000000001000000000101397f855b984c0b263974609d549d27fe8f6e49b02efd48a31629f27b8445a55f0e000000171600146a509cb89f94b8e7bc5a963a96f9bfa0568cf4f4ffffffff02aed61000000000001976a91434e06ff8336e6f664969b2fe5a3e0c1c44c0a3f788ac649b4c000000000017a91472e87e16abc627596f7fd3e90c2145dc924a5639870248304502210092f8a807a4489df12a2f44c2e3ed291db8925a8834ff4fb5460add5bc6a40d3b022011ca91bca3a209b504b266d10f94b19d545c4839e692a2d2bc8248e080d95e0c012103866978f9505ee9341f86d12c3f989f3c91b767202754c5dc7a586463ab37de6c0000000001000000000101267dbaece95e30166bc3421ffbe2cd8332049509d59aa53d760c8515cd059abe010000001716001418590bdd9a4fb0677666d188f796722fe2378819ffffffff0234a56c01000000001976a9145ccc423118ef044fb8a135ecb866904671ffd1f188acd6a405520000000017a914310ce2a42f68216d20ab2b551c1dbd0387d7230a87024730440220778d1ff2efed9b1f6b0747001595560a36368914343e52bb45389c975cb4cba602206499f9ccc124df61304ab9a2b173b092cac325c2392316ac4c00a27e9e98a6620121030af1f068cfbd1e1f30ccda8deacec8f0c9c96502bbd552db6b85c39b5dbe9ea40000000001000000000101542331a9d6211c353f06d14f6e4bda9b9d676ee23bbcc8ce0148bbc1ccb1ea3e0400000017160014f30d093df33bad3333fc8d417c72357421ffc3daffffffff023ac401000000000017a9147d9fb555ee1e1c8bcd24ce9bacb5ae4eb6f28bbe87600ca800000000001976a914b23b14eade24f455bfc212492b99a3439e0c937788ac02483045022100fcae04d0c5c959127ef5d90597659fff94b2d7441bce735ecc259b96b9bccea80220612d08e0764048e7f47c503dadf8876518b7f1644d86bf6bde16f3b42b781cf5012102fbd0db92fa655e1b6e69b53e4b2a2e20b9c5df30e06ad6ca26cf4d3548360e580000000001000000000101bea98d1b6f001b162508407acc31bba8961690734c2ecd0c3ff250255696800c0100000017160014b24421259c6c235e56b1669a7b300aefdd8efbf1ffffffff02f4f6d903000000001976a914d9f4f2961dc6e2edef9c22469a4299820521aef488ac7265dd050000000017a914d43b3c2aad9c595afb941939ed9612f222e1cab9870247304402205c6d3effe159e83c382458f203234b665af8796b1e3ba0a0437be56ffc3f9bd602206e3344dbf720306021c265ea223b451f7d80a3e4f61e2cb07bd0430c32b801780121030132c62cdf148f98fa0a36ee55066cc28481cb7cd609289aebc04ffd4efefe790000000001000000000101e068543714eac6b2ff81187823167bae8af8cbc1e2c58f4db90ff95fdda662490000000017160014512e66bd78f1b860a723b03e4fb606ef29aa6a0affffffff02ee160a00000000001976a914583ea358bf51cec1792001d2d4b78b727311884f88ac735d28000000000017a914bbf78fd596fb5c5b134388398948fe1dce1ee7c88702483045022100c136674e6091904a94388ba097dfed8734504db840a3074acf499a3123ab30760220286893f530fe140cb8e64d10db958a5fd3497568c2da5118d3e458e1a9ea7039012102df3f07d6eca1e5ae6937dbdd24498de3cbdb176f4e83ac9975572ebc69f3b1aa000000000200000002ad93ea388c6be3f8357cd80b5529efdce31dd4980625cc89d2f972f7c25f3438010000006a4730440220710792a891e79ce3d748b32a60d8425e79038bc7cec151d59d54f33eee8c4ce902203648c2fcc542a98ec89aa14e53974f27bb24c29d365bd43cbc3d884c214e6d82012102d3cc5520a83ec3a431532bbe03db82aa0c8940a7eefaad7f962f3570e3014776fdffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da030000006a473044022008a688092f285bbdcab41f327e52121c2f8d0b7198e52594b96bb3ea2f3d508802201667a5793338f0907411d2e06102758344fb7117898c1d31e487a8a91f11fd5a012102d3cc5520a83ec3a431532bbe03db82aa0c8940a7eefaad7f962f3570e3014776fdffffff0170c90f000000000017a91471942aaf5ae4954b5b65e7d0fcf4dde6f04a0ab28715a00a0001000000000101365776b28c760d84c68cd6333b710a41992df74fb22834ee484db67d2b93bdc2010000001716001483a6da40fab7ff9b569f0594b8b058c1e9601b95ffffffff02601bd801000000001976a9148dbc50c3b3b4e59ef524da633a44919198c2063188ac9372a40f0000000017a9141491b9ac3e9b541d718d064720687badea74aed2870247304402207904606cd452b12c7123415324a25c1548f934b18049a63c402120abb42375be0220131059d8763d4f42f5c6c25bdc50009a756bf123c39b9790c5bd6d7c2dd2f9a6012102bc1a523180c18b5b8922f6e6822bab65efc2530f01ec502a2f46892ef03e7ea000000000010000000001015f1402bcd2c4129efad1aa6aa95fdd1c1587e543918d51114f54e035695559bb00000000171600144d5f959e6df12a8d270aa6d48d5a33c779743ddaffffffff02f0ad0100000000001976a9146251954f7ef869ecedef81c4d362e6f567eb1fe788ac3bbecb000000000017a914977298deb8d7eb699f8005720b7e60bfc0c0537f8702473044022029f0a679a134f1d8d38115370e23ee8746a30b34fd5bf3f13490c00da70b800f02201b4bf312ad76dbe8b0e433e010741801963a3d6ccf33165b3e0fea9cb193c2f20121022d33e7a16dab43263ba2f2b328fc5a7a5ff991226261d3c8219b4b73f4d390b90000000001000000000103c163dfecb9f6e1b108ef1e2ccd5ba231e2ad8d7408f674317eeba156fd3167340100000017160014f8096b809690edfec9b4f3577a5094828d9356d5ffffffff7cc7a7dd4fdeaf348bfd78981b0bd11fe85d04706f3bbe6a9a411d71ea20a1c2010000001716001498af0aaffd0174cb9d9b55b6b5d90c6b0475ece6ffffffffe5fd437750bfbe612ba309a49c77d878ce03c5a53ec9feb1c38d610766ae17860000000017160014286833441d95d9de62f2a8546e2cb1915b944f4fffffffff02200598010000000017a91463ea1cd8261bd9b3c99d01564a4930e2e1ea3cf8873be706010000000017a91418e044e6daa500ade8794d60e8dd5df94f312fa68702473044022016d665ef810e7831dccc7aa38dc7e0292343f09d0a882865dc940d42aee21cae02205d2202b5c191005c5e986d65dec9c13fe7116790c41796b467fa593faf5053730121031b5f3d8b1d4d234782c968d99e67433a447853ed82cd25e42dfc88312c9281cb0247304402207b3f36bd957d7d135179729304194ecc35c8acef160f2f5b219399b88f55fe020220504943d318a04db6be7979aef18c2fbfd2599a3face0e423bd15dbd7ae3ad9bf012103a4f380903ace9c9f130194696fd162383e54a7a65825ab862815e2452a40bee402483045022100b5b0e85d411fb0716bfae8926dbd9a2710a8a636544a9a6784b685b7ee4559f602201e4122e1f227f683eca8c053279b4d949d1538f25d700e03936c9095942fcf6d012102ce271633e9c07929563198a79785060c51ee71c4f3a64108bb52d38ec9a4324700000000010000000001017aa9476470af1891e39dfa71b18c5bfcf5927a02db211790c2f3f66973ea03ca01000000171600141bb0e244a33aa85009778e67325d97da8f34e0890000000002a08601000000000017a914e9d95155b81455ec33a86a93fa348e94cf0a289287ab5c05010000000017a914a7e12fcbb0fb4f802732518b2d92a09aab1d778b87024830450221009b261ca3c418793a3a3e3fa28654f6d1cc1be9e8bd3dc6c5fb31dbdac02afec902207c5f1a08bf4e5b0708fc2f4a5345df32ef06a821c07c69c96ae6387addde039a012102c0ab94a0e39f38ff4e268470400103e2c53e3c3853f355ee474c131ea84b4bc00000000001000000000107183abb0a919db5db244542ff6f10bf9880416f3cc8c3924b6480dcf7e74d0fe20500000000ffffffffafb7e16bfbb5787f6c0252844d1c451957ae60f1a9d3e725e33150a334e517690900000000fffffffffc2f3ff3bc5a22f2820e5c021682cbfd9d80194cc978d1e217bd4c55107d62470500000000ffffffff1de532d20383ca5b1d76cee894d9686e8372df61d66492778fce7c42ee8fd5320400000000ffffffff79994220dc1dc570252dbab3759524c9fb71a789f656e1a459b70e53612609c20900000000ffffffff046a8d9a6aae5416b1b1d798481dee8020b82ce5b62f19cb8cea90cdff6598460600000000ffffffff304689872066c22cf2cb21838c63049599a148ae6a151a5ce5fa3c9e0cc3fe600000000000ffffffff0123b343000000000016001414498eb4f7e3a91ddf84daa3b678a64fe7f421e202483045022100c237d2f7d67088bb31c431232b0fee5def6243ed2b5d8bc13c48f3ee9127a41c022033becef9e0e388692deb7588ac6c84494ade9ceb9b36440ecc7ea001b131508a0121030ab3b154420c51b31830e5795b9fd82aebefa76f51ab605e88f3c7cf726d8ad00247304402204915a6097cbe315750eec5d5727f2aa5aa0557a014bb201cc4f0a2eb1ab73b2e022007b5d2f44c8e0d043027c8310aa18b18805dd803aaa99721a36c7c7b1cfb18ae0121034853ed0600eb62455ef2879e00a89c0d0375fd5378d120aff44af70e54625a8e02473044022057b07a410fbc419ed3493c402d3e6172749d2a10d6249074648bfedc8c9c1e3c022078d7ce67dc6213311d8af5b563ea1e608444722571c49ee8beedf708b611b2140121024b1dcad99757c02f706bc5692138e67d6ab76209f91588dc1345ccce22e1a73702473044022060abd1469066aff4d78e5b19ed712b6e4fc2ee30a1afeb99a55e7ad58bcb2c8d022064807cf353720b1986ebb7c8a6e1c9983188a1f309c47ddc1affcbd55c6708fe01210236b7f7ec07c0abef76fb857937c44c1e8979ab3198c79c0694a478ca66e4a5a202483045022100eb05f9ab4c261c10f330c0a61c42f55df1ab3b9b01cc9ca14b3ded9d21c1af05022072fbcb531d7acd54b419c851f4a426b0500dcb3c78bd0d843a5e40f3be24b80101210343bcce6cc3ad93477e7d585290922b2b3b685a4acd92da0aaee0544421ea301a024830450221009577e4c7fb7024e595b6e540964f5887c7eee20903eb1091a796c2ab501f842d02201bb2e108e37f6db857e26b00d866e1433caa2a1901b32692d3231d2777ec723101210280a1d0d8b5f5ee1067bc2babda4e67c8c9ab8439933fec1786788db72a74235102483045022100ffc3ccb5bb886052db8bb1be5379c260cc59a7775396741119d7ff566b758b8802205a5cea6c3549b38e730e545925afb5185fcfc78446d1d77840e4dfbb0d4d4a950121037b14e9fc18d000865c9be9c0e0d9d39ab3b81d2eba217fadcd814f7f696e485a000000000100000003297405f0181ca21ca6db2d15f150da0ccf0f0c7bd03914dd7c1240fd5e045350000000006a47304402203092643d10c8666711ea00083cf202459644a4d9837dc3c444e2f11b124246c702206fccfb349a6363f0acead791d243b73d7cabf7529c4930bbf1d9353bb425bff701210373524709d0da9c2d3ddd9381e330ba908096f76d6327b24e8ab1a61ed1e078b5ffffffffa6b6561b511fc1b4d89c28ec69c1e55bf5133338c5e6947fba620532ddfa481a1b0000006a47304402203a106ab8c088af0dc32237a07b9129e5815e47f51a10f34a48402412e390b91f02204f87e0054550e2192e98e94852fea049d3441e0e1b4e6c41b62fcfedac0f944f012102bc2902d5e18f7e911fcd5fe80401422a11349c4d486e2c016e982b1ab2ca494fffffffff16856291ee24de9054b553c92e70c8ab39d278b6af26ca9ef61febac1bc3f1a9010000006a473044022072718d281a77340a605f0eacef3c2ee4622d69e94bfff2d83d6be930db0983b702203669faff8986ca06a9a6ab51517df65572322c30c72cc14ae2f89a85357a9ac70121023ef070af64c1c0f7434b2f1adecfac3b205d33cfe8d25649b681ac8395930eccffffffff02629e0c00000000001976a914e5ac9f0e89be81750f20693e016e2011fba6daec88ac0a170000000000001976a914bfb5c1d1572e3d8a0d99806661ced1b47e7d75c488ac00000000020000000001012b14134d8a7b27bf2923b125c785e7454684c941791698de6d0355f55413a0860200000023220020c85f4d3f08ecae4e3a27664fa4b230cced3dadf7f576994a234a7b02dfb93210fdffffff01f6ce02000000000017a9146fae35f50b75870a07b16745ceca1e7d57f8caa887034730440220612972d02e66a47c08efb854e0a20612b27e70dcf3d35c10240510752cb01919022021a5b37172b7bf55c8baabfc799e61c8a771cf9f555ffcec7122381b08b31209014730440220360ff5a99182a33c11d85514b41edd11891ca40e979dcdaa948db9d0a8f2b09f022044fbecd786415e2fbec858fe586c31aa61193c56b4ae83e4efcd31965d274671014e2103408f94094de61a847c3a1f9e2d0c8999cf2bd601857e406addd0e60d19126088ad2102056dfb8c5238fdc6b5f6d0c107a40ed0e29a0891939819566350ba947acb8ffdac73640380ca00b26846a00a0002000000000101b499206fa002c1015b78bf98ccebe784621892925e37b743980fde683926833f000000002322002029cbe218e6fccd561f64d6c98a653c570040c979319acac94487b186fa09bf37fdffffff01ab9301000000000017a9148cb1730a42506bb5e8765338bc37393a6e76886a8703473044022077af1dcc9fced2c399ee13fb6735251188b255481fc4e3704a5774438ce41a6002207be570fb059fe4b5a772b39c9beb054338f2076cbb5ce7742f43c9726be8483b0147304402204a8e87a19183ffd29a6bef3457c8495f245f078b881e4992e6f90ddd01146d3b02205135da9b4bc9e4eba0924864ded7bc1af12ddbb6d41c781452145a33a39b8a3c014e2102eed72408d06321541a39fec80893d5e25a23d4f360c2b4c8df16f3ead32bd749ad21029faf99e9eb01c6ad3d99a8f933915b1d78666f7a2a28fb7b536f1bb231a95016ac73640380ca00b26847a00a00010000000001018036343e923b1a9b72bbbb26511ea5565847096c90d4656ea73277b865a9edf70500000000f0ffffff054e980a000000000017a9148fc3e8a4acf48298df2c4be0b775bdfedbf3c9e78713e68600000000001600145d6758f828d1614dfb87ce68453601de4713576190798c0000000000160014aeb0067d646026b429ed667528085d5f8ee3ac73980d840000000000160014061ab5181a51a7497059fc17f0b23cfe0d6b3335d13bf5000000000016001470301761b0f36ae791bdad749aff5dbfc777a10302463043021f4095978ff6adef90e74bf5c2b31afe357253c33f87c358fd0c718d570d79fe02205188b3004744bb90d5479ac624ac0a7b8dbf0b716627c2f5db384669648060b3012103f1526b7f0b1386e807baaa9e1fe54cba560e404a136d3be375d0c06db553cf2600000000010000000001023d2b98a0ddfe4ffc074f3b989bcb1cfbd191132bc4ceb85cb62e286a7fb426ff010000000000000000068a488cf3c8d9f4d4d059b7913c8e56441388f1a21daa9c69849e91546872da000000000000000000014cf701000000000017a9140ce105fe3d62d891f94ad9e49f6275ad93ffda4587024730440220768d1be19b07ad5921c0d9eaa42b73884e52561d9c31af34016297ea19c24b39022016e47e83b0e6266a086a8c8732c51c4ddf7a10a5c1e0c3c2d0525a7c435d1c67012102404f8738e355385f4feba28de23dafcaad5c7be9756bbc5caefcc97b1764a3fd02473044022041c6baa1ce934b14d77de3d41c59670dc49079a456d30b5cf9f304062943001902201a152bfc4d9b900971a26672eb3126906ca6a3b6306c52ffecd4e95d1dde5741012102404f8738e355385f4feba28de23dafcaad5c7be9756bbc5caefcc97b1764a3fd000000000200000000010285685151f5ccffc3929d7dbd89aa40adc62590aae9b02972b3be6e5f4467e5740000000000ffffffff5f589f7e5bc49af90a13bea4fbdb3ffdb3f794da3d8f5bfcd1192915981203230000000000ffffffff01d7fd1f000000000017a91491542221a5cabf4313e0274062d6e5485bda425a8702473044022100ee4ea6a3f8af13530a2bdef64045e2900d5b30d02e00b9ddf0133e5e7cf832a5021f0c0f8fa5d08850e5a6c415c2d78037fc1016443fba5295518ba1ecde445d7c01210343d03d7af297e4ae4022171a1f6e7c50f1b53994fb24e8863004e91145c59a150248304502210097a1f4d45bb302a12623b06182b90909b5708eee154816193d491004de2ccbfc02200c50cc2514cdcbdb79248055b50b36bba564210fdf31e5d3c157e68c9e2a895401210343d03d7af297e4ae4022171a1f6e7c50f1b53994fb24e8863004e91145c59a15000000000100000008dd6f8b3c3c48a2e5c30ce80d0542f8b901c270f27cbd5f8b320cf4430efcef0a010000006b483045022100c5bf1b5b1ca688da3236643cb571c77c681492d0b71734b94ce04572e7ac0cd002200e44dba9c72b4fc4acbd49e15299b3d32a67eebc504fa75ea2c3c12e56589ee4012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff8dd31d620020930a2a65cad1fd4c63df76f3830e34cab7beb2fca7afb09dbedc000000006a47304402207c154f7f78401e9d1050899ef1e78c2232a16ea34cbcac77965425f01181b608022012ab017c14881970ed73ab8bd6137575a7461d12acce5a26ac590dc4008f2b98012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffffab508f1bb7160c124c2eafcc20ab7fd936215231579c3976b15cff1e808a1b19000000006a47304402206e2357083ce43d7de44dec4b42259f8f1dce018c1051099d21729065c19c823802206875ba35337fa8d1f5741e3752f9cad3016b394841212742057fb8cc5e22e857012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff58c8108c845397020019fee01fbe16b12a8160ae5bb47c8fa740bc8294b1c2d1000000006a4730440220060642887ce0a7de07ebdce2b78392b6d87ebde6236366cd8197019858a4b3ba0220327913f4194dc2ceb231589f3cad61c35ac5ac59dac7ef137e951f5d560632f2012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff1f52e38e81e569d89a952af292a977a575d38dd746f2989712acd99e7f341e83000000006b4830450221008e5954580833db1ff8a293143bb16102c31595bc5ce9d7c4f499c038bebe21140220409ddf5b1c2c239760f620cac7b691f3f93caba3ba6e7ddc2cef0051718c0f91012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffffd331e01e8dc5584d68a1a605604c958b877c2433d10a830998c73101fb1e19df0000000069463043021f671327940db1ba69b2b1357215c062c6b804c7fa35e7b819d3b970e133bcd8022005f1548191190a2d164953ce77dc30588f1f89a96ef397ec23bc6e80bff8500d012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffffb1e122140b2e1115c502165312935c1c78a4f6e8db7ab694335be3d2fe1e8460000000006a47304402204df5016adf9b859e6acfb8a9f72876f9b57446c48106fc1d81af0c276f61e50302201cefc85e56a4385b9cf51ed44e7aee0346abac3208188474cbb2ed4842854a98012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff033b55b4f491f44a1f601bacf8044c7b73d9cf1dfbd2c04790a4694b8a02ddad000000006a4730440220049d7da374bc0bce995047609d41282bf4dd37254d4e481c78cf28b3ac9140c90220029b2156e4dd9ad5f8d17f8a4f5efa42bc45f10510a74a095042f729ac6d3ffe012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff02204c8f04000000001976a91435ea5857775c9e55ff4ab7f5441e2580bf58bbba88acc4110000000000001976a9143b9ce0b6c571264340cda99a7a5f95f790ae4aec88ac000000000100000000010275235b08ed15d101aa60660699a3b34397b48b19b767a27c2e9ff679b591581c0100000000000000009ff804b95ff6731758e4331a5892c69a84200f9348e8999159df07d15247a085210000000000000000014d274500000000001976a9140f446e978cb66f1a576e9d86e63e9525d6368a4788ac024730440220577ccc0ed51bb5c1e6c52f54abe274144f12a0893f835bb180d91853be9527ed022069be4a7017bafd3369db12b49aa8f72fc7f69c97ef3d8f468a79899a41a016bb012102e307b753f5e0a54089e471d6976a503844f96a02769984f88dc5c035b39665ba0247304402206210301edf8deca548fe1132cd719667f23d620a24d9e0d85113145872cc7b2302200ef51fe5c4b823666deda307e569570643c543501fe2a01d95738f80ccf5025c012102e307b753f5e0a54089e471d6976a503844f96a02769984f88dc5c035b39665ba0000000001000000000102ac3b28122d1dbf7228645dceb4b52c4652c6ce16422e2c07d507281fc43b01030100000000fdffffff539d1430ecb25f0493f0e586a7d552099ffb624931406f2de33ffc33e76bf3340100000000feffffff016a430000000000001976a914ce9c875c152f3fc2f2950d6db2fdb51669ce7ea588ac024730440220615ce3564329d30b53c275a07456d18e2265e18b820c0a6dececa98c83c23813022008bdd784cb18d649d5b849b288ced9854cfa71aa7835c8755111c4f9cc59e0220121024d9aa777ee0baead8a947b16a23faed0bc8d3e94f7b7208fdd0d18ed6673e52a0247304402203c17051546b57bd20416a5af76556ebcacc5d8a25ad1b005b6da0ed4fcabc6b002200b01b5f65a63025181f60b8b9a03fcc40a31f7c05fb06830d242e1c5a47b88610121024d9aa777ee0baead8a947b16a23faed0bc8d3e94f7b7208fdd0d18ed6673e52a00000000010000000001028c0f59fe97c288ca4aa4e06586136ecb068aae264e82fe725454910b0edc268b2400000000fdffffffe7fce15e25606f9b58e690be98be217f790e3f83be6af4fcf001d3960588d55d0100000000feffffff01ce710600000000001976a9144aa51700610970c1d151f1c8aa339b07faf6efff88ac024730440220147894376ac62aea49fadca1112f567014876091eefee2a37bf690e2c59fca2402205867a47c5e50ed86282978c91aa6112839b6415766074f6ca730a05cd5430fd1012102a8681a32c36bfcb6f13a3c6854df08625049a505893fb1f27412d6e51365dd670247304402200eedee83f65f825e6ec785e6f92d1ff693450a8c336c2d41d7e3708ce6eadfaa022059274a4defb5688101eebfa56cd82bf94c5ab82dbab5a0a6a69ab44915b53ab8012102a8681a32c36bfcb6f13a3c6854df08625049a505893fb1f27412d6e51365dd670000000001000000000102c05cd4e6785668aef6f16766431ab96e052f874f3b98194e372cc4ed5217d336b401000000fdffffff921fdd20241eddf84e6e55180ce4ec33e2592d0ac0c7bb55295ba18d204eec184a00000000feffffff01815c0000000000001976a914c923a44459378051f16daa82aae33ed0896f508988ac02473044022019e27f288dedbf099ea56b366669712420219a679495c73cd83884cd3b16a9d802201752558e00b1bd9e9a3fd09c9adb001f7ac4e215f8c6d750bf70c86faeb99357012102cfee65bbda3536d62bc85b8cb26c1110db654ebebc8a162fa6318ca2369b05e50247304402205f7f573aeab601be7e384e6cd16481b8eb01817e004835d5f9a5f45827831daf02206e6b0cdd5c8bbe87574b289268a73c913cb71c60c404ea5d5e8af0e5f70679b0012102cfee65bbda3536d62bc85b8cb26c1110db654ebebc8a162fa6318ca2369b05e5000000000100000002acfc631cad7e9776f5424500e0549fc645dde988015a6614f8fc5f3ac7cc1509000000006a473044022017cbb5041db7d4f4b82d59700be8c95f624ab7f375ee80035f0fe4780103889f02206407c211fd963fee21faa8e2a27060e23b2e25aaad5c26117a892ecd6f798cfb01210357d060ebc272bebd863f5401596201c9f5b30eaf6383a0892d125ae78c272521ffffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a4090000006a473044022021d2727be757ab31daff2f1fe422dfc95a87746c0b68f94cbe3fd2c1155b45d402206552713df9ded223f0461e96a45cd25c5e5beaf60542d1472aa1676535cca8b0012102d4582381bbeae8e5bc63392b1e39346b46f45c049c8903f4c58b4f1acb0211f9ffffffff021d1806000000000017a914812c087f3147684614f26cbf5df835d358b3a0868703d40000000000001976a914c0f6ea8afdbec8a7f11033b41b84703abcfd24c188ac000000000200000002abc0219a07d97cba3465d2511ad9265fc3359ebcbd41fb69e1da656a33974d80100000006a47304402205f6f3c262509feab29c50b9db28fca7508e0341bfa370e3aadc9457c6befc1490220255830fecfa3779a4f07e5a23681f155b27d4837f14b3f52b2229b5751917660012102b7695799e76e1e7db7546009ba5e886010e95ac63ffb1f7b73a6045ca58f6288fdffffff7835eae2709cf0d36d6c59e8135416222811a479358a527b882a8d93d4153e89060000006a47304402205637e5d3cdfd90ab0c707dafafc22813d63fc74c88bc47892df59d6281fcc498022013f47941aae321d31e19adc75e51a8197c26ddb46ca326872bcb77419da01613012102b7695799e76e1e7db7546009ba5e886010e95ac63ffb1f7b73a6045ca58f6288fdffffff029b620d00000000001976a9140d87107e2195f76c5c77c60dbb8dccb6021c933c88ace0df10000000000017a914686258fbfa4170813ed9f6a0d257dcaecb8d8fd08747a00a0002000000017a4ab56882734f4251bdb14b67a3949c17326a91559df387588f05c8cb5c68cc000000006a473044022026c085ae3b81747ed098c1d601413046e54ba9d78e9f98fdf92fa3a31b16b70602201bac795989cab64514417143b9a9e017d8e1a88c24bf0e24da635a952d3bff54012102ed8c5b6eb87ed2928250fa4c1e0a5f139305f9d0ff5d1883b3a98d8a986ac451fdffffff01161546110000000017a914865a6ce0c77d73c1730f009fab9fe0b4eac655d18748a00a000200000001c309f8ebee524e03925896e43742782bf17d1ad05ef44a4b4e85a6e11eefb0e8050000006a47304402203fa225b907e28fc4c7080fc659172e76bbfdec55ede34e71aaf4d3f772c14281022067b46667c4eceae36865f16fc0d431fe2a6b12d21d6193a20424701757dcecf7012102f7a8db109436e3cedf944fe827fb873a6eed2c44f642e6899cc28c2ce518edc5ffffffff01f43102000000000017a9146b21b3870379120443fbb4cfa549d0680ae8f19087000000000200000001da754ab0b2d56cdf4af89ace3264594405d88fdaea56d12f1f98350bfc67d9e9080000006a4730440220757e971ce99abdfcb4aba22410ca69444d148816f56a8127685a4923788181ff02207f3af99f6a0607f421f56fb65b2ca831dbb8fd836f41232d784496fca9d93f9e012103c721ebe2b01db8a64dec2e37c1cfefb432c987c6fe606c3170d33873192151ddffffffff01b20c23000000000017a9149f5d0b7087091d9927842a5eaacfcace57543174870000000002000000000101d8653b7f01eaf9ed43076bdaf3f532d63f7bb33eb343f86795559478feecf4b401000000232200209b241211f8499a9f5324ec77d5440ec8676811339ffe9b1a3c2840005de3866efdffffff02375600000000000017a914f7a24a5fcc6d957f401279f903c04e44604778ba87fa3a00000000000017a914dff540759bacd280535eb264b0e9f98355c8df5b8703473044022018a7ea99bfc77b46b30a27606245acaf6ccb642e26f25158bc736242085e51bd02201a15b23f6f21bf0d08caffdd7cc7f6c732793badc1f03a46a2cf65faa413fd500147304402202562a14f7ffdd88a8db1c3928bb15bc58ea09769b12d509eb0e0c4acae66cdad0220146922b03cf3cd0f5721a2cce861d619aab1ac95db7fecabf708bebd0fca0bb3014e210227a8f1e1acc172de35d847ed8a486862374724845a85d9ae3059c2c45a2c0662ad2103ff82b751662d70441fa48b982f994929bed413c4951575aa8ddc329ba5e8c39fac73640380ca00b26848a00a0002000000000101588991891b8289b02febdd21c131a9707c5f23644596e175b9705b160456d3a10100000023220020ac95284749aef38e0d9ffe4ee5f34eb8ca1668dc6570edab92bf5ab15379482afdffffff01da3600000000000017a91490191e9356be41df82794590bebf68056f070d1e870347304402202b5b1d765ecb01dde788fd64ed32c694d8f4f249457a8e0984d31d94506d6394022060bf2f5be9ba3fecc9b48f592168daeb6d823ead2df3101b4bd030229a092dd0014730440220334246be2bf4ce28e94731dda1eb5e0ce9ac78c18fc34bc17ad0b33e6f1fab8a02202293546c7e0491838daeb7e2f54507ebee75f1136256958cd51a6b7a79524eb7014e21022d537976be3f00645ddb88a2eccd196972165bada3890d96f64dc636c6f8f3adad21023aed7683246b653e518b6230d1800e1f298155d4e666a80193c8ed12538f8b78ac73640380ca00b26848a00a000100000001e9f0ce1ecdde970d4c790bb392a93fdeec02af322d0ff40f9cdd2e651cecc831010000006a4730440220790a906d97bf9bf6ecbfc08d09e2d3665d26e3414e3776ca2e751640a328b4e8022030d9d545be347db6fb9a323664b029d7dea5c1b1df0a3b8c557ae9f71067bb730121036db9c68dcd2943c731f439eb542dfd434facb843e7daac325465cc473ab5c4879bffffff0123060100000000001976a914ac3f8daefcb3f82ef58d6ea7020a1aa9804b171788ac000000000200000001462536bffedc1221fb3dcc00dc233d8577300f9ea16184dc6c09eaf6be2c23ce300000006a473044022066d608ebace662a91b6da9d8d7b164546ea96c15ed95d0b91154e7c8dfbce279022063318ce916d789c42073869ee99e6e09064d6c7f893b5fa67079f400e62025f4012102634449064be4704e3103c945c89ada1573008b9c772cdae4d6bed3fd509b5003ffffffff016d2e0000000000001976a914d000c91295eb43d1be81aac66f40dda09c069efb88ac0000000001000000000101abff3a26ce39ac942bf8537797232ce955b0fd8d3ead6f78985847a31fcf49cb0100000000ffffffff0277810300000000001976a914c2e41a0dfcea02177c886aea7426d2a478dd3abd88ac1ca1030000000000220020722c89fc1edc540e142f3e2865e07fb1487b0769346ec1ac55cccdec2539117d0400473044022100d7a4d0a521c6c4ed0bfa78c5b0ca3f8ee216623dbd7f9e8ed262fa0087c99c24021f483e0bca6d6ffedc46c08661271784c82272bd229a421543c0d50e56f38f20014730440220657a789b1edcec4940a260cc9c65790be4fff794014944ca7e357bdef6a2513102204dabf54bd616aa4bb0f1baca2dc134b4a359b00880ad25e1c2063621493d67190169522102d16c0cf38fc04ccc7dfe4782d96047138f35dd0eb41492f08cab59dd9e55f6b32102be5663113caa38b3894b8136bd7164661c6e689a90e60b5fb43081e52d63ed4921020d1cf455c2ba1f9316219c0036cde157142c1628df5e312af2275cf24b5cad1f53ae47a00a0001000000000105536dee2ae2786b89b17fde52c18ef5979bfe36947d6968a659362215a50201020100000023220020da1b2452c030ca1e318ebe6a897d1c86b1564b0daa5056b3199c8a493b9e0710ffffffffd1cdc95f8dbca280ff538bcef77818c5093118e0b669cd3d17fcfba684d7c7110100000023220020c4cd9a3f41b50174e61f3e78bc90f0989bd8cd67eca6210e48f9b2147c81ff4cffffffff7ffc2bf07332c47572789a831475dc94847587878be2cbaa1fbd0df7125327b100000000232200205219a18d3a05c600751aa36e8d385e7285701f777a3e383d591d23c2ed008124ffffffffd9b4c46c48552fa446cc0847e0b8e42431e0bc1e5227bb93585c33ddff4401c901000000232200202e8fb0e77fb24952c60d9e146a75400b6c22ad8fabde91a5839fc23f3330f8feffffffffb1fe32d544e0a1635ece2b488e6e6e3aa813c81ab52112c4900bb6e72302e4e2040000002322002054727faaf15f31e2a3dcc649bbe37f22a7ce214ad03a5145629284a6ca2b7d90ffffffff0291eb0300000000001976a914758626e46b241b1825c288167499153525de1e4d88ac2a932c000000000017a914274dc84e8ef702fcd5063b3914acc62945236a168704004730440220135ab4316f6a1700d92bc6ece085827c459d03156a9a23d257a7932c9a1c0f560220568aa9441f108afbb3ad5d1db6a06053eb9584a46ef05b3081755151040c7ec40147304402202aa15c7697e79a8ac3db76672160c710b1b040002e28def635940278e07c6dd7022046e0166dfbdfa7f00d7ed451cc743456b3aa86065a0ac9104b63798e34a46d620169522102e8bf8ec9100ac270fcd3cd466fe89e37a54e31ec2cf4934185964f0b033b32e62103bd7896fc618ad8dfad036e778e544eed5704c1306ff37d2a1232a50cb03f36a42102bedb8f017b8a91ab30cf4cbc7a39082ea5d42d899af05c8ac75582bb6d98a25553ae0400483045022100debe2032f6fbbacabf880318a4846d578cfe61353718957c8c9d1ac12b60c1b40220589cae36386cae72ea5e043f986a2355a63756d2223737787546a6a2749cd2de0147304402207bcc14a6454f79b46b41b7216ff0f11df79f8bae93349232716ebe1e2e5c8a0602205921d1c7240f300ba3fd413fe830803147ff026a32cd2b6c01e06c584e75b33301695221023733397f15dfcb9ba4ccbcbedaab34565f8f58fa26224a69f6bc68f34c392b6c210399441374c0a6ac490a81dd63f37f0db7ce68d4bae6847496418b32d1060099292102db5e027bdaf64734baa57507c62137f165eb0e3b134b46ee99ddf67ca246e93e53ae040047304402200d114e30fe3a992bd74c70a22fbb52e7e59341d0a3429b04abe9c116d4f5a85002202048793b30400eb6456e5dd6d00c3752d1cee2e4fe66d1e7ccf488138a0614520147304402204129643010e60aa0999595d7be683cfa8fc71aa1e530a17dc7b0ff5a1d1848ed022002582a8f467c8eea8346f3873bc45190e87fdae74732e398a69e697901a936b901695221026ff0dc73b2d836ec13d754d5fb4acc7b334032575c1c0093c0c2c7bbbdd635d22102aca51f5151c9c41184716a4c4bc571b1ff9fd69c7cb6e84876f253c3cef39d4e2102197e674bee07caa634da24d01703d879ce913e0100fee95265f448ea669fa52353ae0400483045022100ab3b8b197d7f463ffa3f9a9e6f41389c17091f21a33d724146818ca8be1475200220273e115c5956e689e054364e17e3a2d72bfe37ba0bce8bb889ce70ef064b9efd01473044022060df4f31775119c76e2cc0f2f82dcc1809d9975a6f0076c75059b579723ef2c002203770d1a9031cbed5e0b8d4492fb83d2a6e7f0c65dd6149d5093bdb9aae7962bb0169522103380eb3748e7fe2553c6154dd06c12f3513750e4ffe2b5577a4fc70b105e9f57e21024ef8d650155af5f2927ce8c4e1d79ef699d4cbcae31b1b88cde43cb30567de61210218ac94f34cbc3d8fc6b08205a13368f6617052b1c19ab5daeac63c78f082bd6653ae0400483045022100e4397e95122a1f677523f4f9a5fefc5f4f91449da29a5c0df45306e83dd82673022000c5bfacb0dea99559321efc7fb514759062f3ab52f3ab01d26fdbe9827f89e201473044022050b5dfc3e78b8f34bd898bc24866b1ff5e66f634448e857a578858d26f78468e022074c62f99e39ad0850fe4faabf22d2fff951c73c1044351090f165d7c75bee9f50169522103c898ff2c7311c7c1c0fa2781bd3ba2f3ca37e984ae10a78591fff6469ae0206b2103e3790289befee80428ddfb6598ae51cdad4936a87bb9aef7fbb24cac201de9a22103f593f68fd84ef54a4b06504c7ff84ff653e018858837634d1e165fea25b1fc3f53ae47a00a000100000000011145b0a20e47b72b953b0de4eb4b674d593e47aa31054e4d561e37155288bcecab0000000000ffffffff6d54d9322159c83b6335d2d3ca13785af901007ee9e6857f9a96c0b2ab4f5dab0000000000ffffffffac54fcc6bee64bc4c5020a02be7853a5600b291f764b55f677b0de5f32ad457d1200000000ffffffffcc6728d6f62c754d026651b2df0a885fcff91fd8aee16b4b573a0855bdf73b6e1200000000ffffffff756e1411d9fdd5d84a6a11fbf21a22e29abacadaf465f167fe374ab480c14e3c0500000000ffffffff6b7e282e1023e44dc69ccf04e3f8a339c8b2c8ea40629665f6e13d7e105b62210500000000fffffffffa64d33ab1d128daafd9b2690a3cc7cf66753ca5e1db868975e9c4a1e8bebb330600000000ffffffffacff967745563529a590d4088683c675b0c10ac581395e0b31472d7aa0add6861000000000ffffffff839205e9614a4536871a7ac7fc86e273dccb694f103783307e443b39cad230cd0d00000000ffffffffe5362fb97ccb936699353de4916a8c5878bd2e363643b8cf3a47e311287db3a30100000000ffffffffb6b9301b495a17d7e6071e89b4b8f68ab1f0dd6167f77c121863055db1c985350600000000ffffffff49f6c5729116a1df1a47596be953399c70f5cf05bb9d87731d784209909b51880a00000000ffffffffc91424363a15fdd60d0f70fd86f0f156179cc67c56030fbbecb7148369ded8c21100000000ffffffffbdc0aa9515c5e333b7ce284be8d39fca8df42ca0f6401da71d869b770a37deff0a00000000ffffffff7c83d25cf910998338b880c05d7ee15edfdc4cca2d30c438bd4771c2cfeb41873100000000ffffffff90045d26da7516d77fb38fefa82de7c72c8ace2b681f629f98de1baa561872d50500000000ffffffffc04b615fada44f8ca9351e224aee65f40e09881227785b5d205a6d265369e7600000000000ffffffff0221d753000000000017a91424fb404b6e5f238e436bc6e57e0944891524ff1987d7860000000000001600149412efa0cb1284d2edebaa62b712cbee73132cf80247304402200f00367231a9543783ba3fe4d29613b5c12370a9882e2fefe49b8c55d9d76e0802207c83f3f2bc4887ae4a721d29e8d7cef487c1f4c2daed3d35827a98c634788f1101210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502473044022042c490ae43483493d54e779cb8845d11541d415e5a6f66c2edae7b0b8ced13c202206f42073ec27d1219a2dc4bd56aeb724a8fe591dc4415b1e676142121a82c322d01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100f81093a375a7c1dc5512b13cb7f8ca77f6d040eca662b08019350b87a19f397a022008100d180972437f48709644c676ae8f6a048e8fb856547e7439f8bbc06b63e401210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350248304502210080260e1382866326bebd28d18856134740431695a150925daa9afcaceb803902022067333a755f22670703e9bdcd6fc26b6b1168514bdf7f5c4a84fe7f9ae46b840901210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350247304402205883796d0d74f3fa455cf1dfddfbead65ec2291461e3851b33e8f80916a7879b02205e577e0c0f926d8420268ff2409c7775dbf65fc978e0d8acf03d1bdb0056e1c701210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100b72c3d6a73b885dad19ad7a5a6fdf77643595779afc2c3a09a16f9f946fd6b83022055708cc71ca8264abd35792c270c0b0fae6e259bd223f3a1787917b558600f2601210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350247304402207a4dad8a0ee405439ef52c03f68151e2865b1bb15daddb640f85705976d4c360022066286adb13e6f1868b318aa14324555c02344bb0dd3e58bda17a1027c079300e01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100f9e9ec912cdfcf64b4516e098eb184f000aa875653ca2323685627c5983b3c0802200a50857e5be51beba393ce40f9b985092f626a2f9e3f9f1636aa9e29f93c50c301210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c4735024730440220754f5913d37e55847cd372c8300f52b1a2f52c5ba9171a0d5243db32169eb8dc0220653542eccb784050b707782e8de6613265e5a37a5986628b15342ebf09d61d3f01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100e23963f2832800ce437400058603b4affeee5cda0ae9e728babb97572edb6d0f02207f7e42fe0f4a43822e62944a5f843f1712d1395b60b3862f2838be60b3b2143c01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100f864cc64ecb8b986b06a55445e05ae9e0473278927c1dc08c00aa4e28b7ab7b7022042d08cfa3865f6f1422b242161dcfedf896c49e731d90dc0965f9723f015345d01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100cde21969d88e796f23278dc232704aef181790c66baba0d1970d3ae3e61cc9a002200552a7c245a60a9e6331453a981c0a74b00664be97067957c221cf86e068db2a01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c4735024730440220128a18f348448588b7de8a1191930fc84d744fa64f34350b675739995cc9d9ea02206bc9de74acd9b044cea7617f1e4883721ce504cd8249ef043ef398cd2155fe5601210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100d203a2daec38f17eb823e051646beee38fb8a510b4259cc6f89ea60e5088e9c302200a7d5942f6c3d26ea12a1a793a5c1ed94984f24cfba74ad7c5f8b300ee4dce8c01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100b19a94356ee985b97a9f861c3b45996a9b5156bb3f1f16ff543612e7677181b802201ff7eda3f25bfe90c657b4f3cb112ff544f205629bac2147970a4c9ad7f0795101210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350247304402207fb4f7a298bd8c5431ff4c22100665ea119d899b588577a579b448d01f8d70a302207cc4987b4c67cd9d2cba743c0a1fbc5e3785937fa7d38507c79712232f8366df01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502473044022071062a085d3e16fd7dc07ef6cc76b9ec05c65a8c8b1242ccaa85ac536f3bd36b02203da46d572e3cca8759f6d48801efbb30c406402a2e7940300cffb91f720f0b5b012103067613673ecf208fb1d7107cb5e2b4d007b20a2729f474da78bdc8cf99cb84500000000002000000000101a74b8b4d63370fcbfb93184eb34aa214a39e7ff2a29da109301d0831eb068caf0000000023220020e902abc22af5c439da75cc27628e074a95b104604e3f9420e30821ce7a23cdb8fdffffff02537a0c000000000017a914686ad7f1e89e01a451ffb725604ebda7d464f28b87588b170000000000160014c7d09772eebc4ea3a5969fe6310965c98f43e0ee0347304402204b708da27ad540639478d102a2f8a81cdc454e1ed6701d12f42ff9677cbe3f0a02200d105bab4d79a2dee17e3e7a7c03ad88338348150682be398f6a700b919556e80147304402204328116c4d9f3c08fa021a3cd9595ec10a09f5eb6e4243982dd843e558fd117602204a0350e80fb4ef366430526783c83128a77b8df5870f872042f07c9037ab454e014e2102beda5e511fd7ea6156cce987fa09693e91d865261c9cce7f7690a2ec110e1753ad21026781ba93b808f1387aa93e7ef27f4b641f1672736f17e6e30ed820040b773d32ac73640380ca00b26848a00a0002000000000101b5424bb27adc55669f2aad7ea04cc9d254acb2f780284c09f37b279cbd0fb3e90100000023220020ff53cb0b21f9e6fabb2370af02e003214e76b5cbe0779b00f9ce46f6781402a4fdffffff0275f0210000000000160014462b0b397516be7c135bb6b9af47634871c2f3ad40b3610c0000000017a9149966fb14cbd5492e626fc124e7f958df3a12a1418703473044022020695b4b49902a47681ba4bfefa548e3f2f4adaed3c9d18060c4b8bea36330e902202e5317ca445b54397ad3b60956855aef193d510ad33f3a444be48e1a2ac9ee67014730440220704c2de4d9f586ff9026c9db5b555034a00ec2e3e9edfec8525d46e83591f29f022008b705e7d63ee70794a1b6432d79bf5c3d7e3ffe8e60384ae2e5646037aec068014e2102883744f06cc2353e7eddae246a9ef4fded97e96143bfefa9acfc9bf3f8caaecfad210220afaec469eeb1f6342eb4d54d1fbe16b121d74dab3b57683f3dae0a145e4bb2ac73640380ca00b26829a00a0002000000000101e687dcceee4009900fec7c5001fc4393f0299d4ffc8474e56fd4bd10a24d978000000000232200207228a6fad1b14c4a7a7df017245102fc99cab67306df98a6ccac6ee28f51decefdffffff0247550400000000001600144d6a87ca2b019151dface094efb52afbe872ce872c6100000000000017a9149d7957ad9182bbb3722f46f4eae816d1e021d34a870347304402207d78c6e49faec5f9340b20226cd524731882d78c202f0969fb3486a17f0626a8022059ef70d1abb744f267336b7f6f83f283cb085c845509d1ad70aa8b0ccf05e8f101473044022045a73c57e4f3645ff0fb2d1afdc80fca58f3efdb63fa496081168118d907792d022071df984a632f7aca53c5697f6aa39800d213e0e36f772423495747390b4850a0014e21020667ce4acf7513c84452c35a01ba42ae6da9bf3ffc43f820bddc9f7644e04c31ad2102d465b8fb196dd12a621344459c5c311b7afb412b26674dfa942f1e2f12d96240ac73640380ca00b26847a00a000100000000010508d025587014deceea930003cd00be8a5d3714ea882b634d07f09547d43cbea20000000000ffffffff47c19c0eed7d2e8c53d1f51d7c7a0351cecef19577542c1157c4f338dff412510000000000ffffffff56baff5dc3d15b7973440a727ec6d3cc1b1a5fc86cbf690ae69374960b771e810000000000ffffffff5e0a42d94a3644fb71d6ceaa2f721226b07e76e4e754d34b3d5816ffc328158c0100000000ffffffffcaa69ab66e18fd7835688622b0c207ae9be119e550ac767832f6d108e4279e370100000000ffffffff0270ecc10e000000001600149061efbded57b144c14348ad8bb0d34f9823c38913ba3504000000001600143fb0b3b60821c5795b328e3019fe881098ddfdf702483045022100f1efd64c6ef71ef049a4164476852b64d45240ec575417d090d71c5592c4808302201a8be5e46e2227d143899c68dbbce2e343fe6b76ebd145168d70cbe6a346541d0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b024830450221009c910f073bc28655de26c104465b63b8d8925c890ba2fca438bb532101746b8402203c68ed156fe7aff653882ab4fe23a64165a594ccb9fa8a24b633275de5e9a0ed0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b02483045022100a1e1e35dd4a4f52d1215f5afa94ae29e27a84acfb099a543364c288d12f06f8402205c83b31f867a935d8612ae62cae0ab52548e7e1cdcb3884817cca3ca9c23027c0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b024730440220462d4ec172ebf191e69f6b97a45a83169910b4e11cd2e8b7ea3d723f7a12dcef022026cd2430918d2cc563a90d5067dd559dc60baa84bd180ba37e29131adcc118ca0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b02483045022100f276a172add0d964b83fb571fafb50e629c24cf65914478519c4e19a7376c0ac02206b81ebf482e2702c3bc4a6452ee6323a166ec8ba54c1741c2a11f4199837f18b0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b000000000200000000010184afe2bf87bd8c879178b8a9fa319bf70110676dc7717ddc25281fef4b9f732c0000000023220020a767931c99f519b51f7e2cb0fb01057988e3d3b09145c85e1dfc1f2ba61790adfdffffff02c34600000000000017a914e71ce86e5d0795c007bb4a3365c0e75fff57495987d83000000000000017a914f33db711808150ae31f6ba8bc505c4047bad4fb4870347304402206154ada93e474cd5ac7e0b8e6652fe9ad723855b6bbfb6a0ea78eac45203152c022050b427014bf95115f48eab34a388b26dcd1c87bbff37e18ee206383b4e39cf7d0147304402202baf7f19b4072d4a74571f08f593ac9e7158cc7f14c3e22b6d5168b804c2b170022007eb1e531d4cae98d76f683263eb1d26d3898236c568d223ecd4cff3850d785f014e2103209baba0083c38f982c20ddb194bbc744ef33f45a0911cfe692623930cf3a729ad21024828d735e20c23834951ab8ff90573ef310c3845202e2f6c7b9733d53528ff92ac73640380ca00b26847a00a00020000000001019713cdd2120d739ff89a61430efd3f6fdce6b20a25570dc65d8a0c2bed87dc5d1d000000232200207f55c882bf5703d6a86a554a2538ba480d54697d0c0648a16869cbf6c81ef654fdffffff02120f01000000000017a9141e342723da4fde717bd9adb96111a863febabe71879a54c5000000000017a914f4b1286125a3b9fccb8a3f8f7d12697845b8ed778703473044022002e9bc872ed20bd0398452b9b365a11dc4b462fff4a4bb5cfb1778435b3f3a5e02202aaaabf675b48e61d0cefd34887ae6db65a92972d93cc063e67d62784d50fa46014730440220218471d0698339f7faf9ec95ec9b214e59a4fc4268ceb5dcf22e42bdb09968e7022057029307bb141fb0c263fc8c24a4ed35b2fb6c7e84f66c2fa027ed5ac01af285014e21033819850da25ed29ad6a610d4e171ddee8c7a749c7eb9cb68ee94a1365ea860bdad2102a853f13b9021e0cfb3dfbc380ed8a4bd4531682675c28a7e25dd6bc7e39f541fac73640380ca00b268fb9f0a0002000000000101b09cc09efb99fd895ee5161a7108287dfcc56f4791ebcfe42e1180fbe91663a60000000023220020ddb719db11dcda4e06a047eba9d9513a7269754ac43a41a65ffca7c38f089185fdffffff0270a89b000000000017a9148af955f4f7de2b2decafca2df21240ca107d2d158700350c00000000001976a9142f0cd3995b8d8508461378e58e7af7fa50d68cf388ac04004730440220422ba65e3ff120b9525124401ed905847c96f9415a92b6c18989be5c08d1aaf80220305667a4f8caab3947a1426fc072eebc7a8fa50c690c560454dcd9f25993e9390147304402201e405a2fe36e8aa46f405e8283137c34ca07b38e5de2ff93b0d0188391f4b7580220037ed77de8c3e98c977d8dcd4e8fc78b0dd5425b1aa5e5438c68304cd365ca650147522102009e23e6361a23b74949bf178c8a3a73bfbba7aa3a7f8d41eb111962f09b020d2102e7bbe9302a9e40e56d43d1b4e51c11a3153ee6e91803cf93865b2332afef10a252ae48a00a00020000000001012464e6cc3c0d98176ccf100f28eef669bc9fc137902d6bc2c93b52b1552b475200000000232200209d5fd9ea55490562ef912bfc23947a8b1adb82f3e1586550d1f8fad30200c1f8fdffffff02ead90d000000000017a914dbf8643d6ce27800f7a16d8cce3d9d7423d5fa868740980a000000000017a914e9ecbdf7f4c4affc66b9d77f6cdeb0c6e78d0b4d8703473044022044724480b7c9124eb60938e2b1f11d40231fdfee81324724b370c70773921a6202205c83d0604a465213bb9436e7b58583d80f6eb33a8b1351868d728bfba3a7c42201473044022069ede424e4a797e607343b47d572f3e4682f9158bfee9e6c631709bc1ed5d71302206cc7e7db6310009da2fe7ab3b657dc8c6d021411c26c8e7cfa35fe6239328afa014e2103a81dc4972ae9f743498b50718c2ab8c1e9cc501995f3615c6216f8dbf436bec6ad21028acd50f7c0f9736d400d462e5c03710c44ac1e9d1bc6e23ef1775ecd7e38cdd9ac73640380ca00b26848a00a000200000000010196ac37c700ed45bc3f2edca62c93de19d8fdf0c3372bd29eb79073dcbb3a3b8b01000000232200206218787c4a57366c60e5b5a738ed2b719eaeeca69cd4eb2299ab498611ddfc51fdffffff02a2953a010000000017a914079d52e39c6345e35f6a91af716fc5efa7090c5587808d5b000000000017a914abe51129735699c6c573bd3e04125f04248709c6870347304402206aa2fa368b30c0abdb8a1f0b30ca5b22d9d0ed3d50906f97b75df759cc1190380220073e7e0eea3e69cc202b1d003adab7f441bffc497c7d50c0aa6921c07a48c36201473044022054890f1dec5e0df7212ecc14eb06f2ba75bc4e57d60774cb28147d1c67fc72dd022024b19ef92da1014e374031cb4b6211d423837a6995280b785dd5ae5768958d22014e21033f1318fec31fd8917dfec85b0d50b2d7f43629843914bf60ea6332a399da4300ad21033cf2802b56e48249b7763264f2a07c3ccc7c126b25bc913908865e12fd7babc4ac73640380ca00b26847a00a0002000000000101e421300a97b1b6c460022825d6400191250a541f25218ef97370ee1b84a31b1d0000000023220020b00ac6adecba02f1fea5bb28cf8efcc069fc2a475ed321f3a71890d948c06a86fdffffff02385102000000000017a914f1115b53c4c380bb77a8de84255fff8b899fffe38748e801000000000017a91463cce9d6bffb1d6d49bda1cc48527bf5506288f1870347304402200fc3aebbc898babd8f3b73cd130825704275f4e0722c3545a8505f0d65f8bfc40220062d7773674853c354c3a046cddfb8e412df23b9ee0e40cbd5d6a777c3b91b0f0147304402204ba52507b164c925295c76a1095cbbc2dfb3b0c4c8e9785ed7b336f91f7180e402204f475e335c7d7c9831cff6fca96fd633dc5bf95cbd17776b4e38916daf32a476014e21035aafb425a620fff6221a8bbd28dce812b98fb0ae660cc924725486fe002f2034ad2102f011771b6e35010791d6b567d20cae46c4f2e117c99a6cdefa640acc6dcbcbf9ac73640380ca00b26847a00a0002000000000101ad9ed755b0b92cbb227afc75f958be8b21d318c072efeea2e66514a3a0b4868f0100000023220020a8e4616dffeb599b04340903f76cb97d5e3f89c09d1a737ff5879757baf635e0fdffffff02c54e3c000000000017a9149a9c330e40d6507b550dfa10d586e79b5c06459d87c0270900000000001976a914387bf67ec91190013274c9005b6190e8912fd75088ac040047304402206417a2c14aa3dbf85a3342c0eb41f155eced21af504a15325dabfa53a02f93bd022076c41c1079e8c1c3dbcd3281df79cc6ae970bc5197eb75ce2956be50f202085201473044022009460de667ea71f2eadc8d32f4b0581c0d49a204c95d2f162f83e0fa8aaabb6102207812b0038bbd78c7430dfdd498c05ac9e7536b49ae2db9ee7cebd30f758d1f330147522103612c32a0675cff0d02fb61a3b34c4229528613ac5e62f50b89a3486a35bc11ba2102acc2377fb7873a862c8daded1fd9c1ac9ce754f512bc571140755623caa65c2b52aefa9f0a000100000000010256f751cf4dd6c3bfc7a86c1b11778a37b561740407beb3f289aad6a74474ea010100000000ffffffffe1080b679ce209826bc9cb33f627da4a374d303e82b634b714c5e4f3105f33a80000000000ffffffff02ec940400000000001600146dd1b95db63b50e5ef4d4cba2726ecbffcc260268dec0100000000001600142080bb632058f1e108ddeedf8a92407fa564a3f002473044022008f52cd5bb36c54996a28745f601d17b4e1dfbafbd07c3d5551fec3548accd1c0220230ad5804c36514019c286d3a3864b68575775546ae8a8be2544d29d504375b4012102504f6cfe4abedab8e0f35dec53099ac50033a775ea7834a65a5c1996ae1867620247304402207b7d4da4cf45f9bcfe9dc2fb8759a3bccec668a33247e56f63711e3d1888f001022068aaf1366c3b68745bffbe489ccd2554d88c18b0bc3fac6cdaee950768a62fee012102ec076981e11957794559cb76c9146c85dcaebf4e17a46da80ca9963f0ff482b10000000002000000000102fac9d408c5eb31c8e67f9e8b31c38960467d4cd7b2f402e7cbdf1ee8f35a61780200000000fdffffff80318b159870aa87032d79de2e3184463579d17a278755efbb11fe3d60e935ed0000000000fdffffff02668f0100000000001600147271e3b2d5204158971a1039a6e9ba1e646be8f5e9e11c0000000000160014f81075198562565fa58fbaf415daa56fa78d3bca0247304402200785465a322173a0e533c1b5b349da2bd9d26f77eba22b578f99fce08c6e919f02200b1a61c1c0d636681c8960cbf218e11d4061b7a22218cae3db397789aaf9f928012102c7ccf699dbf77fd16f919fb8b2d7bc92beb9529ea0cbcaa2838c460d3f54e51f02473044022011fcc330ce7a74da0448f0862b6022ddf7aeb1d5c3ddfd2ca031641696cf421b02201f2c5805fc937c1a197d92f3974366f688905c14a1ba9ceca73df19cc814719e0121022e30510415a6c7774ad6c79888a1507c7b62d5c4f70038740350b84f33ae0fd8000000000100000000010272272bc3a82cadfba0ec69fa258808931fac5430983a0bf898e4cdc984c44fab010000000000000000f3df6568bb392412f1aa03a0876b4c4c0c2523735d5c2225ae3f22ef4de24e4c35000000000000000002485f03000000000017a914be130b2cf3b4052a603b4bd68ca32d3de79aa5618748dd0000000000001600147043f6834ad0f4cd7d2248a9ae3aba1c716111b602473044022029e2d341af4c9d80696a1679f9f3e98b94fce37dcbcc1ad289f4ca7835e3a7ca022005b7c2928f233200a12fb90fb251fcc9a63204288c51b60301c10ed38b13ee01012102b5a10ac01b9de3f09484d6fca9b21c601bade21b10fd59940f97c8496256fd2702473044022027127814ab86f98c9f836faf17e3080e02cb52177cdc48b1de6bc37dbc5769d002203bc640d2797e33a130756f3bc40ef50ecc343b789ff4797e50399f79f14b9d86012102b5a10ac01b9de3f09484d6fca9b21c601bade21b10fd59940f97c8496256fd2700000000020000000001024494cd1c214ca9f6417250871dab3b4917e249b2261576f87ab82e175eaf84bd0100000000feffffff0a4104f494ce8f3f69ceddf77390e49a4d1a5930150cb22f8849f6a273843bee0000000000feffffff02599d8b0000000000160014630aab59cd0b00fac96e35aaa5383b8414a981f9c7867d060000000017a9141c0edc5ad566fd0b399fe3b490f2761a12ce9a68870247304402207042a9d783eb4bab3773657eb8779da6bffcd0e4491d76cd594db655fb3e7ea902200524dc359ab33e8aada3fe0d57726e3a229379dabb3de23b70387d26e3c20e6e01210205ab2bf3003f4552bb3ee7d3d27887b54f5d26a3bbb6677c1425708c9a38c4ea0247304402207879bbf3935dff9e5aca4764797a6f17607850753a7973a067da58fe55d1ec010220193ed9f32495535fa8fa237b2d10892fc689e6f258bb26fd2aa62244fc6c762801210342ec41b6446ecc0f68f925a70dbde58340b2c3faae7c645e024ba1429083fd3348a00a00020000000001038d7149895a74edb71827e316bca146840391850c4d21168eada7721dfd1bf57886000000171600142eec697a44be01850b4c768fda75a51d6707d655feffffffa94c430b7fd79d63c539db22fb150122c0db445783f2653321b904e5a17907680000000017160014d031d6d0a1c541db4491e17e709a401ec8ec8de3feffffffd9fcfc1d08d1adfad076dade759719415ec8478733421b28e9a333324ffd91300000000017160014572cf4169d4ba33b62cf2902af410d2e80e74a98feffffff016048980000000000160014c00d8de78b6e707dbf844ca30ad8b243959ae82c0247304402204e6bef617fe658869ec75b8fbea2984121052940c4b8c22245868bbe0faab36e0220141cdc4bc71e13049c8fd179f4cd338e3214ed61e311d9d2c9a09e09f5ecab25012102b636fcdbc1fe3aab254dbbd680c3bd5b6f89d20cccfa8eca4d02aeba95479e080247304402201f517108b38e6d3a67d621a86406b1dcbe3d03746b8ec00549469ab1183d3d67022046edba9f52baa4241b16ed59d272eeb1dda80b851087e80db46988c32c9b9368012103506a99f4c501aca2bde480584907dbe7cddc0a06aa60dfbb4c965f7bbf4fe8320247304402207770471c61a1d5b26a596109483ec0c39426c42631e8f285fd63ea97d669e246022015414aea6157d48a88ff4293b9b97fe49ef11b9c579467517c7801eff7da72d20121027bb41c99cde805ffc437bd7f9fddf5cf716fec4dd32a2438184936aa08ac8c5747a00a00010000000001024cf9618515e64c5a065a2ddac774a83cd80015a04e0f65ac2775a3dd4f1e53030100000000feffffff947c807aa5317c9bd525c6f0b9c1fdb1202834b1e5321452a1c3f78fa0ea9a5f0000000000fdffffff029ab50300000000001976a914a519eb11f88d37070edf886b912fd7a7c5c6ca2888ac6e3700000000000016001490c23942cbaaa33282b0623eaa001f07e9c9a47d024730440220458cdb0f88e9ac297e0c7b2be8daa9bf430cf8be55e7542be67e1f68ee968e9402201a32b9bf2e0db6eba17ec4810b3832e9b201e137c732e6d64cd47d062b9a25ed012103fc3083153e6bd6015a09ced4ce771814a9a7ddb685be84d863c5396585af25ee024730440220483373722132277f881049b46d07ff4e6715d694c2226413860318b0aca1c08c022001f7ae55a98dd664b3fc4c31e4f484055b5506ae1139d550ab7429973fbc0484012103fc3083153e6bd6015a09ced4ce771814a9a7ddb685be84d863c5396585af25ee0000000001000000000102753c99f268bde8409e305da217dca7ce8f7216f0b00f25893347c6c440fff2020000000000ffffffff224f3b3537d2a1832d5a1da837cae9d216d161da63bbfdc5fd8fd153adcaa33a0100000000ffffffff0237bc0600000000001976a914c05d496522524f2627a735a167547087023c221388aca50500000000000016001432460da4b2c837497afe900a62c66dfd8e316bc5024830450221008207a633cc289670f3db9f1e1ab026917c60d1284efad5c85844291297a304fa022035f4c4bc5de514aa59f342aa5eba6a7cc921e2c5ddf1e080839c16ac1afd13390121036af8a64f5b53cbf13fca55cb0c1e0f5ef57c35173dd3736a0e08e2068fa138410247304402201e2574063f508e8dcdc4571d3b1f66ae3cda0083421bf9e858de30c18360659302206198f8e9ae85a0a3dafb887a833f5330a5e1f2fa3b5a66be0b866bf23381ba6501210294191aab2f0b280db37e578993c8fca737bc6a66312f732f77f1051b15a3ce2d000000000100000000010268dab359deefbe9ab4d8226536d7f9cad6bd1f58215e83ec9e9c791d2a97de670300000000ffffffff5e1187575deca71338bb476875e31261fef7a1591d7340002ab911c68480d68c0000000000ffffffff02eb3e000000000000160014f2e74fb5d37c91aa05ebd685a161385e08ffc19918950300000000001976a914ad3b00cda70e6af6468c1854d25f1b42b662195e88ac02483045022100ff83bdbd6119832ff80f648a41b0c7f60f2e8f7c7fe0460b82ca8a7ad968935f022014a8ce3e05a03a8554b8de39964f623d07b982ce607b13ee7ecfac42f832765a01210372dd50f752fe3c5a16e168a5b3826123bd5ec84a568d9f99d08518f698273282024730440220406d98b38b44c4c370cd9b176aa2e79fd7ae9d0edd9e109a4e9c58d6e37ef16d02206d9ba88776a151f2e896e0b507908b820c30f2f5f9229c3c1ef335752807abec012103c3755ea95081162f2d0d7d64d7a093b147230cf5aa4c37b032a73f45a16d89b00000000002000000000101bcfa4f9807dc183b974264c5831cbd386cff479f93c1021f386b6704f9ba28620100000000fdffffff02487a0b0000000000160014f0886fda93552b542fd5285e37b6aa8dbda9e4ca40ac27000000000017a914020ca04045cbaa22840bd5a96d5a83bde7f2689e8702473044022074dc88e351e26ca0c8546bb7754bb71245300c5786db9a8f6b5dd6507e138b1b02205a808db7dc3452d7f3d7d7fb8926136f7eef8884ffe56533080455449d21f4ea0121021c87b42386b72e027599594269ba867ee554ece38b8a46362ee7572dc35b265748a00a00010000000001015580f7d8644f5ba74429ca2c72796c54c3c78662c283bc351781e9b5b6aca9dd0000000023220020dba031993895a6c322093108959f091abdaa4e0c335b02329e086c09c485b56affffffff026fec03000000000017a914eab33cd90fca4146b1c737dc522e0abb5ff0432b87fb761e000000000017a914c8b3f7003ac43ce131f2ea246b5b923c3e86d218870400483045022100acad0452c1a28a762802b215dae8ce91f51ec74acb74b16c34b32c2c2da1ea1002206972600f8b079fabac43e0ee3c2a856b674dac47f6c57581ea478e8276f0edd9014730440220238249864233f17a9fec710ecfb4ab9257865c89aeaae8d8d5bbbe95070fbcc802206b8df70d26f567e90ad680200791868bc18f57e4cf34c8148a733b4d969954450169522102a90c13da33b0d3287e3f7b563cb36641d744a02545de92d61d34c19d227c169c2102532d2a19679fe0f62bfebf5393c0053ac867f171b1d29b3a51530683bce88b1921023b87691db61e0ff7bcc3607e20869b5f1e718a00d4d964b604b0b4b1771d677253ae48a00a0001000000000101ef89cde6b62abd6f42e8cbf072df988e7433ea6fdd82f012b6f36ef1cad504f60100000023220020b7e61a42a116f8d73971b28170d5b7575935dec1ba970b7abb7232313bfcda4affffffff0208d856000000000017a914eab33cd90fca4146b1c737dc522e0abb5ff0432b8733a4401b0000000017a914e172625a981127c8de7ff9957446a2fc850f0c2887040047304402205f79c25151a4173b25993a71b4bf46aa2588ff511629e916023277743558f4e80220097a7b7c99d5a9a45cfec803ac83c00569795d88bdba5ab36f1065f13ec3797a0147304402204157966893fa5176dcab3afe9f068dd617e072c0304c0e1bcc1f55b4096668d2022039b62e7adf69c19c0d6253b2796446ccaff771a3b1d5e1d0567623c69afe97a401695221031762980f16f54c75362d03c6d6ae0e173102fe2b075ef547bddf77bc36ca068a2102682eae164dd32e8681edf452e9b349c56165773365c88a43136a0f63f6981eef210320b291ef817b4a64b74cfd5b1c0a23db5078dd27ecc01eaf0d667c71a354e83e53ae47a00a0002000000000106dad7f00cf231d1b5e5e0c5add6efef3d5815c57a2a3083eaa409b7ce2e20f9dc0100000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffff2d628df09aef9ce4337ff903c0adcf41d7a6edc9a86220788485e02d61c5874f0000000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffffea795a431e0cdb68c0cfa4550fb3624677ec9b2b6df5fcaf2c9bbcb827e6d5c00300000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffffbe322a18c9d1191ad38c284a0444baff328f5fcae07ce74e52cf3662f79b68cf0400000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffff1135a01dfb7647cc1470cda5f984349d19512c91d0450e0f0ff3af2cdba6817e0500000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffffe76a9e6e2c6d1f400a6e6beae59393211c068e8fba1e87f9d901bdb37278c1810100000023220020ec5a61059980e82118989b9464ff3f3bb5d3e3f66c330bdbf2d8c7a5e682f8a4fdffffff02a0e9a0020000000017a914cc76c6b29a599fb5e6db9c1cfa29ea4ba07598918752001c000000000017a914da2aa565bf53c9c3a0062cc7f5dd0c174bab8bb6870347304402204cb6e65adec08ae2e5eac2dc7a5e31f550c3744ebce2e37d8ac9177c0dcba74e0220495dd279f0272919679a770f25f4965429dcf8e7792ba774dbb7df319b9d6a440147304402201ce4f83573edb24d58b70175db8b7bc013ba8025c117bbfc640665eb3b9980570220771669a3cd41c7e4d557658d7bbc90151f08da2d6dee6cd6cb517e0868311b93014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b26803473044022016772d708b01675e3a5a590a710961d6460f5d4888e5eec08b5ea1adcf0c48ba02206a7e1641e99258b04b61afbe64c83e056f5c62784bfe42dcaaeafc368175880c0147304402201c72d15122717d627fad6e3e21a1f76df02ab7e1eea46e988202f525d0f01cd002203bce4e334e0378e163f3c7118b3cc6e7d24f51e9c54db5d4326956115f7dacbf014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b2680347304402206db5edf6b25d883cfadbff3bcfdba31496aa2a525f88cd9e37b3d6aca30fea92022052f78493625db1120bbbcd5747de5478ccf4e5c7573cadca0925335b4be96fa401473044022040a2ff89bcaaccc052ad0d004c09e8b6618f5da9caa3913120323204730a129702203a6856f0effd9e99b91709f1cc44c60b5c8551fa854cdf97915f5c5d6f19e96d014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b26803473044022067f3a64319b2ac89af7bfd9fed7fb5433ffacf89cc11afef8544b27403213015022001e66e6a6685e6ad2ab44c4d78013f4550ebf8f90705cfe71002a292085e33410147304402204926763992eed91b5e5cfa413645eae5b1657cf865acc3971fc457babaf473c70220221bda67c9a2fa1f8f763ef82ddffe349736a42b6fbc82836c915848c6c75128014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b26803473044022003c7875eba5e4d5c336dc10faf2963d1cac0287b6545b62ad30d86f337c6169402207350d4b7e79065a87f06098d582c9b958b9b09ad55bd3e7409280fa97b608d460147304402204ed4396e6c9a6966218e9d9f0f3817e6b4a02f2e2db0b0cc95284fb1b83158d80220434b9214463818e65acb60feafe4a836db4d3991ed5dda59aad62d66fcd52307014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b2680347304402205ae11b5166965e7008382cd7e1f080906233633d400811e3afa3aa291a408204022026cbdbe81d7bf51fc1d975cc0f48b025b64e8d11eb4d64e95dc6c7c43b6a2d54014730440220532de17921abb1dd69e456164da62caac1109daedbeefacedfbe697de7386355022044fc67096270c6813ac8d1cac1ad698b5ec2f7a7a1a1497d970dc4bfd5decdf2014e21039a8c2ff68b3bb557ac7248fab41dc12ea04fd7092c7e0d4d1e3d20517f4553bcad21035f626c806733920dba2a87bb51c63793908f2b0d417e04fd6826edebde45b6dfac73640380ca00b26847a00a0002000000014f15c3ffbb142aea3e58dc06e8779e9f5b63b263b013b6832cffd1e876117795010000006a473044022029bd61a2272afbe45315668a32cf2ad058456d51a512569cb9e4e6a99f3a2bed02204a405ed79e5bd7a8346d39b51a49c8754cea3ac26ca936d3be9dc70f2815f2f0012103aa40c176d58de5eb583947e4a03a7e9010e32b15364463ede6aaea25b0b7e097fdffffff02568a1800000000001600140c7d779abb90b615bd6b4f2cfe6e75a6710575affc180a01000000001976a91482cd851f5c5b554b7226dd55b6fd241f1ccb233a88ac48a00a000100000001c17158458827347404685a41355459b6c573f59e4280b2db94b660cf1c8286e6070000006a47304402205826394d3e968fd376a425c81c69c0fd2890c9ed8c565860e1d69004f002098a02202b4020fede6e1d2fe6d81a25350e62f57be6d9866184b50b48e7b65d4cab495f012103fde7711863a85dc63f46ea6c3fa717dcedd6eadd88c2f165db32b95f5cf72c0dffffffff027bb30100000000001976a9145b0c2916fa642fcee38ff39fe269ed52c3a981ec88ac5c190a00000000001600145af3a18d9f57582c13b5ee8d429144937abe104700000000010000000131071f1050c0820ed1590791cd3aeedef0681729c8d6c8c766f6badd75a51e5a000000006a4730440220702636f8a3127493f487842b7ba04e01443e2a2fcc570460bdb5c18cdb90abdc02202faf7069fec409d4a5086357f4a5c53881eab42aeaf7cebff14610c9906afdd601210209b23238a8c0b30bd97ef113524abd5c9816cfea54d24734eaedc0fb3470a886ffffffff02f3970100000000001976a914d4b4f87ee84be718a0d4758aa767c4ae7245b47f88ac50c300000000000017a9144638ee33b20682a6fc5879a5b8d9589f44c70bc987000000000100000001af190284d3d137a34703fc97655a71b1a7c65e6074a62bbb15acfcfda45fe15b270000006a4730440220536bf5534cbd31ae3fefad749a1e217e0f9b30916f177683258c5ee4b732fc4a02202242b8a4528a0e3c6eba4d372a2770f9346c9db3db9972972685d2b54c980a72012102a997fe94039f378ff94e1ba39c87465196ef68fbb207fbc0080cdfd60674e490ffffffff02d8a60400000000001976a914e72fa4b99b46becbfdb45a1bd4be1610636e544988ac305705000000000017a9143be0677e5556d7286b7819f2da7631496911124b8700000000010000000102c72fa7897b09b12631616cc97dc70c569cedc90483961a8f2137a49c26adf1000000006a47304402201924a4dc8f463a5dea9a2d5646acc9b35ac047dcd8205d653e9e64c58f7467c60220363ad8a1b781c847d7765b263ddfcd83db0a9856abd0efe86babc0195acab0e00121033487db11d91a7e0eb4e542c6b9530cba2cc580188b58132a996f85126619b31cffffffff02c1550000000000001976a914611fa94ead8a87c039082aca680d8fb0b97997d488ac831c01000000000017a9143ac12a03680d09fc2f0447e76680b5dbfe8c36e28700000000010000000104c826d672631e5e817039f921e9e8e71fc5ecf0fe9355e5c1ee58a2dc30a93d010000006a47304402205377aa596256c4514878db789e716b3d3b354708df073871fbd6a6a7ab27f97a022005157a064cc030ca7a4d4a078e1509c196f716bdfa2c83c328e747269ebd895c01210356ee6846e7214d1f013b73d3099146813fd7797e7242952f2ddee73bd5fc6115ffffffff02ea8000000000000017a9141a61ba3a7ca7fb5c8a936a1c25f5a9b3e5fce0a187f0b70300000000001976a914adab044f7b5b193f8213279eea3367a2125cc44088ac0000000001000000019c2316c45611d2b672cc8b2bad6a12952d10cb7f46bd2554d0197dfc123c88e4050000006a4730440220430f511e370d133be655ccfba697cc9af559bd5ab0244b4c773387f5401755a2022004b59c914dd4a69773c6c9c066208bdc93e2f848484a0d5e54721cf1c35a0b84012103401b6b9ecbd49c09f0309cb55bc5ac4666097c6e9087a9d2169f222d469c2417ffffffff020cbc0500000000001976a914bf5a4ea08f82e997583ce4ad30e286a89afcb58d88acb0ad01000000000017a914010cc38901d1032d46a328453e390af3b69d33538700000000020000000169f8fc3832617dd022f7b9a478935bc5640b58078ac47a99c7c7d960f053b7bc010000006a47304402207eeee3645b94af2780d49156e473ce11227b0316f921d5af5ef2a168ba497d450220100e2c67fc05a209570359e4a7022d98c4eda5b7323963ad07294de07531bac401210276a9d6835c6decdf50a47440ec3f518b13da17b3ebd0c060216d98ce4cfd2842feffffff02195500000000000017a9146a94f3dd5bc84ab4bc6352fa3264e9c1726609bd87a1cb0300000000001976a9148045c1b4e0fd173100f733de0bc80746daa72d1288ac47a00a0002000000011919e0f4d6678ce3f17fabcebe73ee8a2ed09857af607d6a87369011261529b8010000006a4730440220303d2e4407ae6e318027da08f799ff94e63a39668a07c47690002a6bb92340b202205c1a41392ab30bd97b2854a81bcd592f68e4a3c5e2bd939869368b1dcf4b1c0c012102819056ce25932f375f6098f011853b4cee3c6e96d4ae6704146227b051f6eec7ffffffff0280f0fa020000000017a914622c5650eebd66ec207c444938e1060261db4901876d392f04000000001976a91459a00800d833ddfc7cc77c4381b678c9b3faadd888ac00000000010000000130da0534d3285bec884ebb47ace94ca788bb92abbefb79f00d95b3a79acb90cb010000006a473044022062c33c1b3efee7ba41182362a3fd7c762a17cd3cfd7bfe77e259423fa753a7c3022015a57851a8127942070031afd8f927fde0a608ba2a79585207077b1155ef2916012103582b06f99ee98cc53dc5be45417091f74acfe62e173559b2bbf3c36fda440d90ffffffff02915d03000000000017a91439cd33eca94d2d3f860b8ef9ff70ce3dacff78c687eddd1300000000001976a91492b9e813ba9e7750f998d5424f6922753688ae0488ac000000000100000001a9bb6190b887e6cda0389fd0862cbeaa6697958a838aea48f526042b6b290d24180000006a47304402203a284e3dff75990bec27e7526ab13e4d06b50cdee6de78afbf06557a7775a0b3022069c4c7832848a388f11821e7fe3f7ec2ad0d76b83b8953c5c48f6efde7644306012103404d0efb16ab3568d0871bb7b9b567c6f5e9c5d03741226bccbc499f62225719ffffffff02d8d600000000000017a91402ec581359bfb44b3ddb6943a09159509651b1e587ee5b0900000000001976a9146e61d52e6139964e71e3971b612ae0024344353588ac000000000100000001243d2eb89601c8134e9ecf008f278005740f3c2a114060d182962d39a1fc3cc4010000006a47304402204a1c15a981a30af06ee1e54cb3d6e58def30a4fc89bc8052cbef692650a7eb97022049c2661e7d13564f286f065162f4884a40a38594368c6f2f1c8cb27a65c63923012103e4e56b56fdae54a1d7c82b11aab300545005d767bbcc5711a17ea002f8f031dcffffffff02636600000000000017a914481add906ae014279886af81e951202c5dac86be8790500000000000001976a9148e59261a58f1aed52ca4d6374d944b7c1860b37088ac0000000001000000016a73ecdae14607ac9e1db14f493000784e2ae584a97806555389d4e2bd6b45a3140000006a47304402205d591d2e4d2c884b62a9ad261f8d72e45cfac5bcf47b3d01550af823e52908d502206ea906b3bdba89240a4af8dddbadcddfa779510eb3fdda9cd7d63ae5ca6b7f9f01210389aaec27b9c18e1d7ebac870c2d9bde60122f5f028c4ac7f1886c5bcc354fd1dffffffff0284a707000000000017a91497a0baaf5eb6d6dfe5462f370e9f411d8a50fca187bd940000000000001976a914ba3b6a9940afe943c9634cf2a6a2f13befd9b3b488ac00000000020000000136d6ceab70209b7c56798ac542e795b06d1b79090381df258acf1194b9bfc9c1000000006a47304402205a2adb0e5479b23a46c6f98575adef2abb3f7127658d1f7add1df6d919c53110022014e2e88fa0560c52b91b1fd76d19b130ee5c13aa0bc8ddf6218ebb0713eb9ec5012102dc1b2d6638037cea167a916cc466f74f6b7727242d4509b1a0427f8c1c1e1de1fdffffff025dd90100000000001976a9145eebb2850eec348c92e631536609dc9e7f21567288acc2590600000000001976a91452464697e3171cfa844a9bd8e8419b258a47dc9a88ac47a00a000200000001c6baf281e07f940a06d534a7b956d9205691250b3975fed8b536dc05eb019582010000006a47304402204ee05dfbebbe6eaf8f1a394c514e68c69a0fd95c7f48bd1e908b6c69411fca2802204254bc619dda2d24c0ef6a804b9db47bfc6e6df2a4b317bef6f134d533b8b0fb01210387ba7e527dd225c155f59b4b6fb3a49871e35160fea5a7e1896c873667a692cafdffffff02eabd02000000000017a914e8d1a409bd7bb96c4ff579aa132f7608f8d9b4258798960300000000001976a914ec734863be1e4b98570b2b6e99569ab9cb1eb69088ac38a00a000100000001893025e205a0cdb2d7cddd510cb987ff947852bfbb7c42dc113a1d7c55288665000000006a473044022074a0e6137008350feced1a6050b6463addba10a46a08bd410f2e81ea5d5d278302200d4160a5c6e7d3fd954eb1065a4b1e78f89c73c80288f1e3c2cd3e49d651cd91012102d58cb26cd98280979a108c4380fe9be366bacfcd1217228c9003efefe4de87eaffffffff023d201200000000001976a9145b47e8fa7eb89f45309f862299affdfbf2725a7c88ac0ad35f00000000001976a914cce42c7edcf85e1a160c21e917a09fc188902af688ac0000000001000000012e7c82c534c7eb0c0fd8eba5b5089c7a5c3402b2ffe1c6f8e57e95d61d8ebf15100000006a473044022076f5e38168eea0878187fc33502d9d27d887186c9cc40987aa9bdcf98728910b022046f99095186c9d20d9c1cd55106d5196132603ca06ba953542a65b4c71c522a30121034b1fbe80477d70a31197a08418c22959ca6b58e3f9846b85ec12fcd83de9b9e5ffffffff02951d0a00000000001976a914915964e4cd690c6d8e9b0cbc0063fbbee9fc798c88ac8e921100000000001976a9143452668815371d9fca764679b1e6c19d5343cf7588ac0000000001000000013a4295997ac8eca374b7bec56b6f191a821fe5ca4ff4ae3915660dbbf834ea8f000000006a47304402202db51ec586fca1891c8439660a5d260715f70f30837a323885b229b84300d5fa022008a716490069779d17729f0e3f0c36cdeff57066543b7d3920eaf9583b55202c0121038af4e7fc6cd6a7b3e91de582f26cfde6f5e4796a1c236f85b454289998cbe815ffffffff02af030e00000000001976a914ea91c66273d027f2102a9e670ddeb1efc128d71b88ac30c91000000000001976a914a4dea144ef171ff1944af047edcbcd9e1e5f615288ac00000000010000000158163773e743d1cc139aa942de3ddc414bd3ea75695e1b9655f92d710f52f820260000006a47304402202aef66f38c0a94fb2ae839e4d0909d1013179c4aab02cbfa589b3fbcbf0ae05d02204dc98257ce745f80c081fc6ce24c777c22d921ed27d29b97bdaf83d0032058740121026986627b03266e326acdd42162df0d305c85efed3a4edbfe4ce7a5d8352e6162ffffffff02dd5d0300000000001976a9142cf920f21711fb731b4c61303feacbc6fab5b67f88ac06b40700000000001976a914bcf96b4241eeee155a491d4a4a6054fd74d0d70688ac0000000001000000011f7674822d8da5134b419876149a6630cda1c0ef7984b7d653974b53f394d48d010000006a4730440220378c5d587986261e9cffd43d833a18220989c0855c8284c443916223fd369b0a0220269a836154f4d10b3c50bc06e0c7835a998f993e1f7f90707b74c7a1bb66328b012102b7b709744e3dac31b7837be93ab0b6ff4f0077ada6079be6529f1d602a0a89bc9bffffff02c5470200000000001976a914193a5e211efd2cb607e0b6b2280f48010d0b1a2988ac45820f00000000001976a914490ee9cac05652a1f726aac71a8633086788368e88ac000000000100000001c4adb8b4598621a19119a31b6b75ae2b405a1d983f252af5edc0dccfc150b826100000006a473044022078897cd499b5252c5f4008c23dab0681d868765444ac8d92edf67d285081500b02206929373331c9e73ebb295a735d5da877aaaaa7044e4716fb7325f7744fcdf1dc01210237caa495fa5e389ff7760824060edcbe23c377640c950d709af25368a3cca862ffffffff0200c2eb0b000000001976a9149cc8e98aff458a21bdf9b66eb06b3d5f3f5d9e2c88acd4126206000000001976a9149ac9cb1fdbc1296d967c0a5ecd911750a274ef4388ac000000000100000000010546e9a6813d80ca9357862df71f65019b494b4376d7bb0543de0b92d65e2948060100000000f0ffffffbd370e88be76997e4d789a3f0397a07f66a4fa8ac9ce8e796f50661cebf31ecc0100000000f0ffffff1785d6e94f90058bc50dbbda00fae2a39dc5956a3cf9f7cc89b4e802e4639e5f0300000000f0ffffffd54908d338c7404fe90804af18ad2ec0365f125233f50bf137e884794b6b94b60300000000f0ffffff349c31315f7729cbbff4877c00bac3aa332405046d93ee1afeaab7e05a1b63430300000000f0ffffff02951208000000000017a9141bf14ae8e651f38e11a93ba4e28d0a93f78559668765720000000000001600148cbf9bc5172d88c468b5881eb67222545f5655dc024730440220627ced87539f3bf1ade13abc5d325c6b65cd075ec5d7c00c99772126464c9b190220401e6639a62385df503e0e027f2458d09a691fc9aea7eef38d059926ebd85dd9012103bd0159c96016ae54186814a15d1e8eff0e7f8c679dfe9db906e806a3d160cec302483045022100cb51a72778689895187dbbcfdda26c370471bc10ec6674c543f4f14b6f3e116d02206f024eb79bdeee1f88399618dd76e17b99e980fe1f1d85563e2aa5e3f3559572012103b3a797421c323ae8135f359825a0f854010e628921ddaae353841312c1d6f740024730440220291777bd2cc2f11f6887a74b4f52ed5c02a0fea9b2e63a1d46d5b86485f778ed0220503c29125121b6bbef0213e5306044e97817f90c2f287b7f05fbe2c85f424809012102963fdca4d6b1e461a8d85b977727df8272d65d2bd33e6ec9ebb2124b23d2918302473044022007481acb53135fd78a1bb583d6bf323821da483ac6921c174e5658f30eb3322302206d8f39c6d9ce2fec9660d672c5f7a6c240b45805ea43c114da3131b70f53fff8012102313513690e7a54dd03315e652a2fd3157c1398f12fbad9bc4611f523664b341f0247304402206d5d6b05515b9e31b50874c9d564c5b6e87fe843fe3bf23227821223b6d3cfa50220789553011c3329d829a3fe975371fa150c4a6991d41b96c3ab8eaae35607642e01210315cc9c241e2537aacfdd2a800213bab1a8640b6b7d50e3282d285b731b9120b900000000010000000166867859d65bb57d853b8a3b4f7f571b5ed6021067dbc3fb42d36a7e196d72c3010000006b483045022100a383541bd89cef84ec1ce135230037b41fb8296cc763ecce38a7d3442035d955022028f7b22d24819dd1951f9ac0575e4ff8a1d23baaa37eaf302098cbe9c8163649012103502de90e8a628e530944983ceaad4f940e7102fe36d533f630c8f34b0a1cf19dffffffff02685c0300000000001976a914ed0e6230acd27d4d5ecbffb1400663f3c9c3ef8488ac92206b02000000001976a914b45f7573a0dfe5fb0cf197496c17f64140d6093e88ac000000000100000001ea4bfb4cddf84a6a387d340168c00a1575885146cbd92f65fad27c65588e6d0d020000006b483045022100e342add37f83e253b9db1fc81c827ff8d580dbbabbc6ca4d18089ac24929b81d022050b8b7aab85e408d2ab059818b06ccff06c1da7a4d2e0720dee91cad3beab72601210261fdbdebd602cd95131a229b860444de6ffb3ebaaf9465d513f18d27b6dcf2daffffffff0286b44900000000001976a91467b2be7c45d98e0226c6ddbf2a93f4fa46b9ede688ac85bea600000000001976a914c0eb88a5d4c8c8bb2ee8b1cd493ea16682cd956888ac000000000100000000010c32c33a343870a74090c913acf9c1a66c484f46410604db7b6a26e1a1d6f43d181f000000171600145a78c1c76900decd5dd474a3dab1e52f6966ab8effffffff31584fdce734efdaaa5581c68f957ebecefe400f93588f0b9637a23257067f2600000000171600145489875fe7df449d6408307da055a265286add2fffffffff77cf2f67ac1a982e396b037c0a6b64ce48b8afa7f1f7363381aa93137d46362e15000000171600143d8bce89f3972914523154aa6b886d7b03870be6ffffffff5b900112455ddbe17ab5992239471e574a3686a512c897a691c5c2f2e9d9263401000000171600148ce75b6d09aff2c0fd6ee571414db5ce040b64c5ffffffffeac74ad24d27a43b7cb17ee36de312a9476871e17948939deb8403c47d948b580000000017160014c5fb72807f522f910f2ccf3a51603f012cc81661ffffffffab91ed08e41a851dd0351ecd2768295e2a93ef54c69e9255aa6d27018017cd6103000000171600144e702b293ca45582768e9487923474414eac6b90ffffffff0bcba1283e929c84e47f549ea930bacb231da049aaef27f5794ce9a11b5b5064020000001716001471f087a4a275102094315a443327915983f63f79ffffffff40861f4ddeb32f8461a75166f387ae895b152d649e4b06bcee045632582073680000000017160014c79819d306f63b2da541394c73cd16f2116611b9ffffffff22b2a31aaab3a7edfab3eca3d8cf24519ea593f21f439c762e48fc80114b7ba30000000017160014afb42b74d6e3f1b8518f8035ac974974b37cd1c9ffffffffe609de8fbc58a99f67a2f9ce9fd1b4d834a66d0359dd91b12058918384ff9ec109000000171600145a78c1c76900decd5dd474a3dab1e52f6966ab8effffffff3f358656a118eb662e119e6c92667dd61665303c83180575ab27b715b52c1cc96700000017160014a23066fee8ed14e088ea7b8a14866464590c79caffffffff590ec0729a929031c42b27e1c32787b1507ce807ba797a9da5b0ce6e1df55dd51500000017160014d23fa60a74419fd197fd1a285d5cb088fad240f2ffffffff01ad110d000000000016001463714a1d646482dd1fb95e0169603403d5564c480247304402204ef8a5cde0d8e7648db36a589ab44d08465f5aae73efef1bdaf91cf68c7d38e802201cdb8ec73e5da56040b6cb268e6d7799c7faee542503f88e1137b1c949f69ed0012102612341212c953088bf42db8abcfeef0ac89a2b7c89d906f97f49bad14b901a810247304402204dfa8096ffb3298cce43969563b3c42c4f634ae9ba51326ea485f04fecacc6a6022055fb01ba2b9224637d0b25798542e56c8e8d7efc952fa9ce5f0bc1b5d4c8848e0121022cfc93bd913384eb2f33b42b7052a312abb5f03f6c65d8f29207f645870c984802483045022100e50219ba91159393814b57617498b42ce630542792fd3983b3ab7d2f6656ae7d0220644a572324b493eb4b4c589922efa6048d6868d6e18fdcf9b4db7574e698c3c1012102fa105983dbb39ee35247b9e0081449cf603e94d772df6d09943a103ef89c29ed02483045022100a73629f60fb51bdfeba13817f39ded5c2484ad8f7656f36a21018b3a7b5b214c02201328fc6613968ee4377875556c00e78a3c6f1f714ca8013d863fd746f77a5d82012102ba295f1e0b95f0c9b4b5a6f5ca02430c95016b88c06791259787c2cb3a2941cc0247304402200ceddfd1c35eec933c9b2c8186ac843c443851cd69cdd895515d2155898e228302201168cdc6d207eeb357f345571098da624bafde097b77e584360d2addd107bffb0121030ade71d86a6a52a9a52ef18b7c493e8463adb40f71f0ece514b542223c6ffbe702483045022100db2c57d2c35a99d41695b00e4100659237f68afbe02af97ee518b6408fef6b78022038ac76f78af9d99c737a7f11e2bf3046a98d53548efcc993613586051cfd29c6012102ff9c1e8fe6fbb6f9360a11cd7f5b8f1ec8b2599f8df971c2f04ab92092915db5024830450221009d0be54eb3df037c5dd0427ea3342cedd12ce8dc71b2889b9de8462448f0259702207496a8d29e87ec4e39a334aa3d59d8cdfdc45b92fa546cb5aaddd14729af3b4401210283693ece8c569969610d61e2c0becaa71f23739e2116c109e9217c39d876df9902483045022100bbd387df2ad7f86d702f4ce8d76da93e549f4deac2bf0f6b7805eddfb825950802202c8f5745584ef0372fd779bf8cff961a69a5fd8ec62ebf0361caa0db7d49cb0e012103ead258acd662804e6d04f22fbd880369adc91f343297252ae14582b26ed111590247304402205f7741518e14b34de5b8577f133deb54f10f675ffb39bdffd0c43f796572875d02202ca61ea179f24f6a5ada7663e1318c10bfda1b6591aac26634f2ebc412b27c3b01210320fd465ebb0d3d1c0a3bd0303ee6c6bd2c531afe6b4d1839eb4505da96400db0024730440220631d7b3e4528723c043810072acee752c11a38562ecd1eead7473b3159288c4302204c0d376a0f6586df886fbe363aabff9c9e202320c1e5350516fa589b6f0d9bf8012102612341212c953088bf42db8abcfeef0ac89a2b7c89d906f97f49bad14b901a810248304502210098b35c0f87d2425e15f1916f0a8a6065ed5545d286201496e53cd55410a766bb0220562c698fd88eec77a644f87fcaea360b25e22498c4941d6251be4059ca1c024d0121039b6a423aa542564650faba1c16fecdb80abe07b454f23f3e48cc6898a484d05402483045022100eaa4f865a8fc65b40fee8f666c8318940ecd48b04e4d53d1a47088d955bf8514022061debd749334caa50f1ecf8757c47b09f0bb67b573555da7daeca16f330e2c1b0121031fdb1a7481d73b45adcc66e688f83f6562a591d1d23db85439a18adafa7fa34f0000000001000000000101fa1c965b5dd92a2dd24edbba4de5e705b0728a311e83cd9182ff21c4534422640100000000f0ffffff0256980100000000001976a91469527488bdc4640de2d46a7ce88b5ecdb07d8a8788ace15a0600000000001600145ce1c70ab8849758f3e656e4b2f1fac5bbdb8d800248304502210090e638b14fa2b0b1dfe80de798c73b5c1948167a4d02cc6aed682facc26dfac40220159e36d102b43aa439b73ed80b77f8493d588787cb750e76d8383481cf154873012103322632a5a0d968dbaa0e63dd2ccf01a5269c438b1b47a304d22ee74308e215ee00000000010000000001045330e31bcb241fa88ba9a3b3c8258bafb9857807791d836ba765461acc09dce10100000000f0ffffff48ea678ab487f2d8dd331ca66f8e56ca8a4738abb20fdba9f1f770d38ffc920b0300000000f0ffffffa21eff227945f3d5ffc16268c700ef8f76cc9cebd971e6a44cc863f4127c79250300000000f0ffffff7781816dcb0ba896926445f12d3f1d75416f4f243e59c9ef6bdf6d2c39c434f60100000000f0ffffff02dc2042000000000017a91457240f848f6a9ca8ef73728a85bfb1adff3832df87e23f0c000000000016001497b1d4079eb399e0b0fab09ddc58151aa2aa1bfe02483045022100a163c34a566ff03bbc32bd8bae82e1b285e2edc8c43151ba712c75f59078741202203a60654c19f2b971d9d0808afe2ff4e8b45f9214a3b3ba6bd937dfa0f377c56d012102df9b584174728a0cbc0aad88a5fabef40975776c9a7313a811edad417369ece602473044022059390f60783e6c68012a7bf9f837b8bbd10b7997d29b1d45bc5dd003872544a8022075266b0cc1055427a863d1d4bb6e5f3d984ceb551e7ff54571ba4bcb4f952c0c0121024fe0f90e8da8b61aae0fca15541d2638d8931f91c178a49596afc3953e3f56a80247304402200ba5eec2d5233b893a8e813cb43a026c298ec6ffa8dcd0882f1b7e390e032b2c02205b9eacebeb97a066b9529d8a89ec7b916e90a159b0984753717d7ae92a80298801210257643ebaffa0d7a3a5b993ca7ac85251bfd5d9d02dcf7bef558b8ebce3d0511c02483045022100d683e8a8a2e3d7ee3dfa0ce9c764cc46b2d663a1ff5a411e4d632ace8b3d35c30220060540753a84e2b12f5baca3023ea7f44a51aae1507599f661787e7de150c22d012102bc8461c11601f3c7c6f279af22176e2a46493b46c80e7f78a1b8e44109b08cec0000000001000000000102b94b853b68b049a2e3ef2820ab54d290af6fff2c98552c33e5bd594b195bb5550100000000f0ffffffd13699107149bfc3e54e75dc309a194599a0a772370567c6cefb1687d9add2140100000000f0ffffff02846b0d000000000017a9142477b820e6b9854492b7d97115619c7fca1a60fd87512a050000000000160014dced375e695767dbbefa58b650233587e5042e1902473044022073d36bddf2fd84c457478c87db83899af1040895c50592f58ab14eb68f94d288022004d900cf0cad8dda1045eed6223bd967bfe6889e8bf1ed76dd0d3ffa1cfcb99e01210304052369a354fa8e81a8b471454c23156c6fa50b7fd2c27bdcd1bcb5f4ca7032024730440220206ecbfb8e4fd5b3c24cf65be645af25a2aa46eeb090a1d080eedf34fa5febe00220507076790f4a8e293c6108adc0ecaf1d41e3c94c79022a9a7ce51efc414a8ce8012102ea60cdc75f250452ff41974e93c92dc293236be02fabc1d8eb00636e0553a96900000000020000000001039cf9bd1d46dab4632acffa6ecfa1475a9b1673ecafd96f882132400c7d7d039f01000000232200208901835a105321d6e2dfc6d925e596c41d36f19666b206a3e44cf6a715486cc0fdffffff322ab16c46b8be3d71034a3801df046c825e0f46e2e188df3014cc4a4e020caf0100000023220020827ee8b65c4a0f8b65a38679bf60dcad44e8337dc65b345a8c58a0656710fd20fdffffff8ef6492570499700ce45c36d3f73a77f5bee8b60a5654ab3c6305c26b51ee60c00000000232200200d3ab1854ba2327ebb8596b02e848702dc37b3a3ed06c7df8c8e5e7eb52304cffdffffff025aea05000000000017a914c60081fecfda001a8a098f2bf5d0fbb58925be4e87067c06000000000017a914442730b217ef2a8feff28393531ff9e2e324e699870400473044022033d1af12602f7aaca7b97f90876e13faba0aae40e68793b35cba3e4d7a42388b02206d6a9a5b6fcfe7871f0edd5964f0a269f4a1002f9ce9cf9246f54640d02a1a0d0147304402207d7343a7d7483735ee5e81fa3c0159fe66794491a640775491736834131346ca022072facb0028f8510be3219c7032ea1871aedb3561842f3a8b71b46a1fef1f5f7f01475221027d5fe48c570d1332ccb476ed8c6338d8a70174d8386baae4e10f984c25d3a8be21030b0e11dec973ea606450a5a81103aec8768ddb9bca5dd47750499561cfd015f452ae0347304402203505799e393d4eae0dc731a412eb870c98fd1732a7a3bbffe462fe1dcc99ea5502204a1d5c0e19dcbe3350f825e77faba48ba2fcc5a0bce6ea3fb88bb77245f3eac70147304402207f1b43f8cfadf447337855442b2a1ba48984c10c8adb01a7816ced768a0dd45b02203a34d89d06cc3736fc48f0445bd030d9fc9f4f9dd2021693f96e49551dfe87b2014e210255c31a6263b3ae9af7be553da327689e12af3d86c986955946a937577058a89ead2103d5ae1ede457b43a0300317ad87a62c7918c2312b4ecbc99422ff6400cbfc67adac73640380ca00b2680347304402206cb7d8acfa885b26d97eefee8d6a76b712c327aeec674cf09344be20d54d9984022072036371d7c666142ff0605e4a40508731e46ae39ad2c904d2a896645663ea200147304402200c6de268148bd0bc392fe853c3bd4591267770d45ea5493e8fa7d1a0d5c119210220390148fde304b7002af38e70de4e4e1e1224a582456253fb935f060c04628cae014e21034cbe99ad6e8c1950caba8eec458469c391ef849cdde13617dbaef5253a0ecf8cad21022785c5392c1f3115e1d8f6fced56a9dbe83b32781eeb3324c067771b11aa41e5ac73640380ca00b26846a00a0002000000000102210daab76159fe41c585fbe8111ec24132cce1bf9eb4c74c63fd93748275cd9c0000000000fdffffff6f9f2a8989c64902c268f0c685e01ff3f1b5c2400e5a4c10f7f63b73aa2c94b60000000000fdffffff036d781a00000000001600147a5f99513c6cce33b8798bc0f370ddbc0baa402dab4c0300000000001600141def7722c19e83bd0b353b1baf8c6ec7891e8b5824d3000000000000160014d80a38a7a09346f94ad393cab10aaf7cfbd56165024730440220530ba9e1520182f5743e85bc2ad04b47d327aae9640a47f0d2d98681c94af9a90220769fadf22dc0e848d1fa0d1263cfc98e2b8c080a96c9ef5f9d704c8701bc8d9f0121035e81cc551c9f183cbbeaa7e11b3b65b6fb89e3ad190c746f2d3eb9144c9f2286024730440220459681aa387300d515f23112f57429548ee66167550e985925bdbe238aed3838022039215d77f6c80e2f429df771b5e29aa6d702b15c0125b73e6b16451002d4c59d01210218ecc15fdcce21c5a495210922b049eb74ac9f4fe8be4f5c1955d4f923881a08000000000100000013e575d67eeb755c5d82be0772b56f6f5ca205406bbebbfcc00783f74159ef7622390000006a47304402204e99a5dc9b232ee23c1e9eacbc9b5f7f2c9ed82118f1d883b41009a2b64ff77a022011c6a39cb22c2e477a5296a661e42b0c41b98f2a089ddff508e4e6e4ece5c43a01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff7524a0325e76d489a26bef83b20997e84e6977b03c241249f660183941666cef350000006a47304402205ee4ec50bd74793cb66407463851f047e7cb5385700c5a9c93ad1f8952a260cf02204e1493f36f6639d71cd6a49e387a08bb2b2ca147f86a2349542a495124b70d7c012102603828fac74b1d20fe275c809708fea1149cd626bc9730503cba1c1a89a708b1ffffffffe9a28d13f468d59cd0fe7c7b78c2bb6a4759fcbe43d9edc3d17d6038003eff79230000006b483045022100a2020223d54e96155405807a96a3454d1e5a5de8dd405db8b358907fce59b22e022036e8e9d665249518de6ceb846cdb936e5e2efeb57a97188de22110807bdaf6c301210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff7ab36648965585e5ec754b470686eb170ea092780d356b7a89214a832549db7e290000006b4830450221008d2769dbeba6058431e2f33e9c638f41a8d299cec067a04ff8f8dd6f0876ff840220188ba549d0bd811616adb3c4c40bdb70eac6392b772978e9684f7281f5f32b9d01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff67bdf3cd11ee4a8e61efa969b981b3c618b6fab142dd05b09e6caa94a0c28c532d0000006a47304402201d3d0de5337315ded13a834f9f4e8066fc54cb63403889153f313c715e4689f5022023e8ec15e2a8de83712ad96424161aa29ae0767276b6655bce30ce23e38e40e70121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffffc159cd65b011d4cf2ffc79f3e3fc943a5ad9115df4e92bcb0522b671dc6043866d0000006a47304402200146230bbfe00d878f536b459cb8e57c8c0d6cfb2bd491488cea5d5092304c7b02200f96dbe2d2d8f3126c37f821819ea1a97fb601b3c6e2c464e837cbdf595f66ba01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff87d1e55378f29d14dd47a24c81a8258a86788baaa08a0fd544fe7b790ad102c64f0000006b483045022100ba44e22cf34fa57959d566768d0248584c5c1378b0a0af4cccebc02d456810f002207892a7cdc3e36df46e54836060f5a520f69e69bf8c3222e2eeac93d1a3861bd701210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff242416b1012ae5ca7636d47d63207469870d632988169f374e18976cf6f6a1bd230000006a473044022070dcf3adc646bd03e30a14e626ac17f510e944fda4f5e5c9e0dd0c581d4bf71802201f9aef7a020ed8dd84bc1a63983f83d238eb5043c9291d42dee0dcadc9d11936012102603828fac74b1d20fe275c809708fea1149cd626bc9730503cba1c1a89a708b1ffffffff66426c7c7fb90d29f06484666b5a465b868a8c3f52b97ed742197e8868b54fb00e0000006b4830450221008de968939b12a27b0e2bdd3a63f5cbdddbc5830a07d3bb5ba8defc46de7feaad02206ec267eee2be469e71344b2baab754ded1f1ef0daaf84edc5c8a5030d1f919f901210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffffe88111c315bed74fce737273d91606f060c61b92431bfc8a8f0b7cf155baefd60d0000006a473044022027a109d8cbd2e0a848f873d7f0dc5f173be8532c692045f7c87413eb7e9f5d7802206a849c69c125eef5addbf2146ec744aa225babf246932c4fadaadf8856661fa6012102603828fac74b1d20fe275c809708fea1149cd626bc9730503cba1c1a89a708b1ffffffffd7f3341d83991f185c8b78b3bf8c17ab059d40a1713159c68d23c5505c03d99c5f0000006b483045022100b1cf1c9838b2a713902c23eb5b311d6fe9f3877c19d068c44b5c935af136c137022041160dd34f70106d94a4f6747318ca27caf4e7add7f99b6217b48c483548d4df0121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffff498823c2b3a410477bb21b89321e75ff0d50f7e38182e0b700ec222be0d0e878210000006b48304502210097d594d3568a886c980f49f54f0f995d1a1ddf44f5d490d60629bce5dc578bd302206eedf972ce61050a7f1d135262458eea9dd97789b1fb7ea40f9710bef74c099f0121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffff47ad152299daa642d6ad7d2a27d5cd0a6852c40ff697dbce3bd05c4eeb45a7a6000000006a47304402206f4681ddf35bc456eb9d011003c43d7f75cef5a50c657bf4e9f4d27514ed54b10220110f2011b32b2c3b26d42440739a8b0bfbfe87ef7acc42105af30f7136ddaf0a012102f2fa0257a9aaf5e8abadef7cf97c594be3eb83f7887f600c8e54f5fd7fd6d59cffffffff7f7e9915928aa76699e4f9eb44b5cfca8d36c7c18795b97b31ca75946484d0893e0000006a473044022071c07b164e1f2dd68e311ae9b8fe2f9b2483814d3d81890655468ccfd6196dc202205848a2d2e1a962840dbbd8dadc3cacc049a5d12387b3d7416784ad0cb1ee1ab701210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffffe0301cc5c57bbda8fd46f83c9a6ee18ba6b31719eb8fe914418200d1cc9e9fbc4d0000006a473044022027c8ea5dbdb99c2dce9a32c3f3672a91697e3f29a96f8ab34bde041b2188577202207af891ad17d9a6e784b18abcc06ad99259d7f79b168204ac13cf34e52a4da6c801210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff9048016fb2cf0a6c41772a2e47cd4658b9d52fdd5dfa1d78c75910b49ca21e6b0f0000006a47304402204a28e284bad11e3ecec63534a53c603cf8a9b0314fcf784d4985dd17de9a7d9c02202ceb8c51dc3b7996b471cff62b6c85d1c50d2e83a53615cbaad994753868243301210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff03bd92bebf313e837dfe4a1c2c465834aa366bc53abe1f9399de04b74f9b96b0640000006a473044022070c4529cb51c49e404b55ad94630f009f4e7fb335769f888d522eb68108a24ec02207981c13c7f15a05894632517df6bd4d36d7ace7b960ff93ab52ca664430baeab01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff9be24d7f38edea4c976d4ce3b70547360566f0ff49fe96fd064cc36e63fae320000000006b483045022100cccb9e8e127b382ba937a4feee241fe705b05fedc178cb2c1a9c16cc4c54493d02204f8d3ade428765d22c6b2227537276bc8084ca012e5a1949325de1b39b9ff712012102b02d22a2776cf17220c774e135d4fa8ca218b60c2d42c1330bdb1e7cb4bc046affffffff2ab01bcf672d940b9a1d9dfb867cfb725cc94cff982fb8259b73760ca4de0b8a370000006a4730440220300a000dfcc60a875bfcae2ce4b1a1be72151b48af9552240d13f01284f9fc4f022027143a0482bd3b426dd4f46c6decc6172e7e4f205b020de4fa2ebce5353164600121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffff0231f186000000000017a914b9068dd946c5df2b1171f0dd3f93d14a7ccf21e287a21a0200000000001976a91498df799c6b591e08405d8eab5d93a5c14988a8be88ac000000000200000000010101f9b0fd646c07f4ee6ecb1119db4b5bf5558df48bb11045b8155b3b87c0b4d600000000171600144feb8b40c21096a68f1cee6a6f20895329643e7bfeffffff02b96902000000000017a914bedca39372a67e50cee6a2573678841718f115ae87540c04000000000017a914c7e72d867623eaa7d59cc2f2b8d647ab7d8a2ef88702483045022100d072adc1fed51b65c1c6ba21250c0805ee37705234d3ad205f4de474c782b6010220658ad9d430fbd02f23809fc1b1b2613cb8cf16398df8910627b2f0941908f7cb012103306ee510136ad398da0bc6a9ddab0bbce252df58c364ece7c204e78f665c636847a00a00020000000001014c769f83da7de210df6d5f7b7e058d2ad622bde6d6a5f473b9a406901883de1e0100000017160014439a5885de04f1b4e73cf195029bf7182eba57eafeffffff02e6d749040000000017a9142bc17f7f62ed4b0b2cd754d81d080a45b8e802b387d4bb06000000000017a91484dcae8799ddb99d578b87d8c8dd15fce23fcc878702483045022100bba224e6106d763634511b666eb4d93e1189f441420e328ee86ad29020a9d78202203eb77772d46a1a97662ad059ba580107d0eb5242af5e1624ef82977bcc57380d012103308d506fecdca3e08d2b84637747066fb0df5b376ca5732ab0811494fd63199b47a00a0002000000000101c062692e1eb6659126e54f8b5d060a71b635f51a5e9903b9b040ff2896252f730000000017160014a23d3d61dacd55a47cabebc43bfc2f396703b954feffffff02540c04000000000017a9144c1d238704f7b48f1e8541bb48e9ad99e353ecc587857302000000000017a9141c62f54406f1cbb824fcfaa634eefcbce932768d8702483045022100ad27624e68f185d62389c6f6ab3d48245f66c228f23ef560c34fcfd29d95d89202206ca5cfd9a4e41e644d3d8e929ab9b62403989ee97d26b1152af7a9f6131926ed0121027e82f6e3c1e114f930aea3c4f0a3168dcdd9b49255a680e8f9daeff28b664eed47a00a0002000000000101b61d4e368f32cd6881a72ba0e216f60957828abac696680ad5884d23a60b03ba0000000017160014813d5247548e08d19577f625f00b2be9d077c6b5feffffff02a6f86d0000000000160014644efec808af942fde7aa97f5f15c7cca934509968dbdb03000000001600144d4a6df2bd7f709085137afb3f692a9e051c900c0247304402200ae15db9ec31980a2d1861b384004374686bc37e2ba9a400505a3aa8117ff81902206ec52f0900c6248a3689e507a89dea084f4ed72a958cb31f1e9d284f4ec77b4b0121025db9c567b22f22b915a8e38527b303671c82a402be635144d4657d9f2c0cbc1147a00a00020000000001029e25908819d3fd35d907610d8a48d4f5b29619858d9a69f2ad5801bc25b63d9600000000171600143591906a8be74151f17a3cc46aecbaaa13e1f128fefffffff545cca1c19cd59e2f851caa540f1caf8d8d4de68e0c8cbdcaaadb9aff0bb0c6010000001716001463874f40645f818a376c4f5b8666706716b04618feffffff02fc3b04000000000017a914109b677a13c6cb694f9480b1e9bd947a96b58ca4873c9b00000000000017a914394fe6b4928aaac608a5190dcd5609ea703cd2f8870247304402205a9e570538efd7de6047be509c21287c65024ff173ba2923156d1e0d6d3f6ce50220114ff9ad07c07abd1a12900eb7be7dcb7372a7130072ef2a636d5a8b098503fa0121020f04342ce2d7e13cd1d1baf7a1797aaa3ef96c6786c60134c16886ffe42248c302483045022100817665206074cf36f17ac580f26d2921253df4fd303750eca665ac6d07dfb94002200f8407b3a8de0580fc691d07b4b17eb12ecc3ee09b6b635ae95ebcc37e5ec37601210204a91b1e82d4b70a3563da42957d0a1c38d3b7192b5dc5dc9007fdd48721f23348a00a0002000000000101a58c31329c1257c3b90f69add69db3e192779e6a087d6adeb8c582b24f6ded360000000000feffffff0278fb68000000000017a9145d05b69590ae75a7a38de56b7bab370820985f6c87d4f904000000000017a914f4b851d18052a25b240a3c385bf50e024f4628308702473044022036efa57a6c72676bdb8941525a1dc2fde92e2a9503287416c5db84980f80e8d7022051feccdd6d338f93a679ace3649567b4eb5c8269de4ed98b52ab522d596e1a1801210276f025ea76f6c446e51ac7e1a68390b911e31f3e07f7437c2d9bfbb18a3cbdfb48a00a0002000000000101f1172aec212a64457431a3913edb01653737cac9f201944a789ac803d676cd9d000000001716001453f2a0aa1f417a140e491af9d744022919e3bd08feffffff022c7c43000000000017a914bf1a1ed0045d9c78f376cd1a62d7b4f66c14662d87687b25000000000017a914efd600ec58e0283d418cb64e97999f57b0befc27870248304502210094eb8e7bc92851ad78455618f51d5e4b34124965a0a4d826fd8cc725dccce98802206e5938d568cea0b30f8c92fe4faabbd3a854ae84a6cf5b331ee23a6511b9270001210340f02518a50608339e4312d2e3ffee2eb3eb8b3265ed218f93ef033c9377dd9148a00a00020000000001015b7daf2bf15f5e35895a68ecbeb734913f6d121302c41e2eab657cc279ee77390100000017160014ac52f06b866f6ebb4d1f580731a3e7c0306679c8feffffff02b0bb1e000000000017a9141866d713eb2468bdaf6038de7c4b8e7aff2a2c1187d4bb06000000000017a914fd5d07dc9c84b8c1cb009a0283ee55000125fd878702473044022014aeebc22c3c9c32de9a22baf3fd5b0c9c5eb717690c3cc884bf31760e066a9602202360271b96f3361b61f173dadda6479fffb64d9f6f19dc427bf65256f49a9b02012102c4f6ef6b9742d85c6c7ba5f70d8911ca7a41f0e1fbe91c634d7a60741e4d79dd48a00a000200000000010122395cc17580f42932cc24034698b9c276c0020d6cebbd9e8aa675253831f4fa000000001716001476ae47bebe7b8b5a57a48018e6f05ac2cdd73e62feffffff023c3e19000000000017a914b1f202136622876e734b7151741d5837772a9d1087907905000000000017a9142037653efc474c77cca771a2234ce13757d18a3b8702483045022100ee458784b4a70d67d710e6218a5b2331b5db372d1623665b9aeaccff26290eb502205637bcd274084d3dc66469e16d214fd4ae3585a8fc4fd213258a12785d7490340121022a0b889bf806c9ea65213acdb955053a5c945e09ef7a1d1d1d476c4677b3540148a00a000200000000010158131014f23598b8d0308cb1a4fb3ee4c13463b18b20d1737abcf153c8fbf31700000000171600142cd3eb10b5483a7ab6f94f4cf0b874a6b39fa9affeffffff0260d112000000000016001419b32e42a25326b878f9ea4f009ca38143a3d66d0469060000000000160014ea20ec8f1f82293a3f3dc36721aa9fb39e5be14202483045022100f4704151f8d26e1ca1218ddd2d9cc485b1b45c1671fa7913c04f35d7454f3cf40220189a08df2d8a39b781126acffb3f5a1233b830de4f422fcba0108e13909a2b55012103ac8f4f20860c6fedae0a05ebec1ac9016892cc909e3cb11561cb536bc567f9fa48a00a000200000000010235f77066366f8183ebb64537aab2a5817f56c3a9f61b858f13b71050848d33590100000017160014b64c3b4a59e42d23ba2817d5305f15f70fc32685feffffff8a75f052fff668aee13d99191384cc41c7faa77dfb0502034fc3edec75ab7ae80000000000feffffff02280b04000000000017a91496ccbadafab0cae95fc580b0e99d03208e7028b487c75b0f000000000017a914497c9298bea3f959524c0682671061c4954afb218702473044022030257b1f84ea001ba8c71dfa449037b8aebd7322f76a7bb7ec06b3a9aeb2ea2a0220511554d4160cb0e55e05b1ab4b6c5efc38cdfd758218649cb4467f26bf2ddef901210379ae0d573dcca0f6c22e3c519b7b46114b549d4091d92696e9285a4039876a5c02483045022100969108ce6a889dfa25241954cd849be6640c574752b4beab809bc24dbff0292902202f506e8f094a0e367401334fd67ed325887023ac3eb77479db983fcbf94c74800121023739b4579e4c4a9570bac8014f5ddbd35a78d4eb8110af7821288acddc42a8a049a00a0001000000000103ba5c7aecc19c8846740ffa120889c25089258bb2f54cc65f4104d478913d07cf0100000000000000009e10dd3f6dce979f5d9eacaefe49ab82421ff41e151ae63add97be41de1025c1010000000000000000854ba31e7dfa07d76c7d67d7c7416faced8c8ab63a225a05dda626819b3c58fc01000000000000000001066d03000000000017a9147de660ec80c5de8de18e319c848db1c4ec161ed58702473044022015c3ddef0e4de59ecfc5d8189af989513770c2e657a3602defb5516b6ec0d7a202201ffa22bf85a1630756d4993dcd256355927fe91f443b9bf77bf9c56515a5718b01210340a96b55c0c15a2f655913727d798035b64848ac88a7aa89cbfa245fa6c816a102483045022100b34a66a7474733a749fb58204c62dead8b2e71bc873db6844967d0399a5b037a0220032aa13dda0026a75f63d20d037e622e1f130b119966b7342bdc81e9abe42bef01210340a96b55c0c15a2f655913727d798035b64848ac88a7aa89cbfa245fa6c816a10247304402206ecef031084bb76105d1f66f5c41574878e3c251931d66481b21b30f5217bdd002205a01c55396a77f900f8530d95aa5ae01a6461cc4d815a462eed6f80cd3c9a1eb01210340a96b55c0c15a2f655913727d798035b64848ac88a7aa89cbfa245fa6c816a1000000000100000000010365254065710a7124683a6b5e9f9c454c6681926562fdf99cfea4990f911cffd40100000000fcfffffffc85e83108872d2cc5af22e2eb39c2542076e19667b2204ab9803186a9bd328f0100000000fdffffff807d552a6f27a619c5d40eea4b5e217fb99ecb2bafdebeb8c04eb0b8fcfc6cf40100000000feffffff01efc90100000000001976a9147ed1f5eecd0779ae88020968ff13b559c508447488ac0247304402203e79794a3aaf34ef85a8cbf9dd88a52bc4895ea56c5c16dd98ffd78c796a1f7e022038cdf6f457104043050a83e6127df91c22d3d4154a69eda03b2533d1cfd32f3e0121031e5f479a07cca0aa7728cd01dc62118175416feae701f574911e095c1c3a1a080247304402205b4a2e3f3c739a7215bad7818c1681be2e7d1bf28b7dceb7e6d1e524f8c3fa0e0220502ccb0fa4a4a4ed80cb46e43115889a44737f70137eb40b2f73165d257edac00121031e5f479a07cca0aa7728cd01dc62118175416feae701f574911e095c1c3a1a080247304402206eee501d3fcfe16a3f12b47172da8c4be1e166f5042b55fcf67f9d6afe5e07fe02200c12379d5f697d7645ef395a07f4e8d8bced3c3444d45c77c50587fe2d739e300121031e5f479a07cca0aa7728cd01dc62118175416feae701f574911e095c1c3a1a080000000001000000000103bfb1174e65c06317c83340feb401cd576910d51b839ac8ba82f669cff5877de8000000000000000000b0e9c7e4b6e3e166ba9b3b8f88ed998da5d0b827b0b6c0f62c05218719ce7ff12a0000000000000000b50a3ce222033fc652438008967b4905fe08085254483b1dd02ae5aae8f794d028000000000000000001c5e00500000000001976a9144c61ca999b88defcd1a2f92b7949680246bb979788ac0247304402206ec1a053092075b1aec22de685b1b07687f768ef2bb68198499801ec440e4fb702205c0013238986f8e5c07ee6f54dca14a1200429270fa33f5142dde4d73387c0e2012102a2f55c1f9e8a0109712674a7f7956eb454c02e014c12acc5939695d365a40c950247304402203b367cf9c5c6f3f11789e6c1ac1d437308e2779419f32b7a3d832801c4df01bd02200b946d8788e5bf483d49a4666a46ce56600e58882931af86527009870c149dfe012102a2f55c1f9e8a0109712674a7f7956eb454c02e014c12acc5939695d365a40c9502473044022045a91ac5eb8a02ca27cbd90439af88bdd669030bb887e5435d1337444d34d9b10220723ed75e5692cad09f4ead8fabba7de069c428bbafd0db834c73c7d22fddd267012102a2f55c1f9e8a0109712674a7f7956eb454c02e014c12acc5939695d365a40c950000000001000000000103d86aa443a95d16fcea70af18747d25bb938eae2f6295227efac3d38de29d9c240100000000fcffffff85076b3f82841b17f4205e65829464b59431bd89a7c9bf02986cdc62dd78edc90000000000fdffffffa8b8a392f03da8a2123046a61d4beaa5648e576f069fc464826133f79308f7f00300000000feffffff01eab00600000000001976a914daf04d2b1748910ca680a13fd01d7caa9cd7054e88ac0247304402201833e1197522fb10062c449e503fa71ac05a36417afac32eb076925784544fbb022072ce66d48ab2a22e97adc92a1d3b56049879bb3eceb838f666c198970bc3c3a601210243098313ccd721207dc9669292e64c16c1b75bcf57415a07a1f26ddf34f6b1da02473044022064a23af546707e1e23c7746177be4512453239fe6cbdc8a570d213d5e23fc8cf02201449f4b916ac3040dd7ab22e980c5c0bc4b0805ca61a325ae223bf80ada84ebf01210243098313ccd721207dc9669292e64c16c1b75bcf57415a07a1f26ddf34f6b1da02483045022100eef23f2628cb36355359e8f633a1d1d7e8a56333a7cabc1066f46b202f17be4e02205b455d2eb8ad8e54f9201356ffa53df041b79cbb10f895fa497910e0298c234401210243098313ccd721207dc9669292e64c16c1b75bcf57415a07a1f26ddf34f6b1da0000000001000000000103c10d7517fd24ab36c60eae04a73100eea364caed27ac9fc5ba641d031a01ab7401000000000000000004dfc24ff0501da6bd318578071965a7b42560d3e82966e2559115d5ddf0e3462d0000000000000000ae14e752503bb82d7a838843436c650679ae6ea9f67ab8dc85b2c6833d04785926000000000000000001f2b90d00000000001976a914fdee7a2f38f477dfecd7e299815ed0675650a1ea88ac02473044022013f532eb882d2240c05cdd7d2c85f97bf4d441b75875002e89cce4729b3db91002207a5f46306b947cf04958161644dc153de404fe8b6adb289c0bda94b9a0c0016f0121036b6b7521e0feb0777258ce48f85543faf58b5a7215480edda50dd5c808a541bf0247304402206c6a2b74660b4f5d0eafdea106eb2abb83705ee0977f0853d7d25dce6bd28ae902207ef21f2dae6a42823be0828b09af5cfb8c4f5c877817b08b702abf5b51de19ba0121036b6b7521e0feb0777258ce48f85543faf58b5a7215480edda50dd5c808a541bf0247304402202bc92da39b7f68843b66153c43b22a36de4bd112188bc002fa52f65d978f574602203a0ad3858e7b1817a32141a14b7e2e11cefd90ce68f445bd9785822284a8a4420121036b6b7521e0feb0777258ce48f85543faf58b5a7215480edda50dd5c808a541bf0000000001000000000103cf9b41116b4b5c02caff4dd7b8d285140dfcc111129de15f8e0bf6835842495595010000000000000069d013aa694d332dadf575813a9271fd597af49692f8202e0088ca340a1bf3308f0100000000000000604219401b901d547b33066190d6ea95593b261160991f864434e3d764bebad09d010000000000000001c60d0100000000001976a9140c13a270e219b895f24ac02bf384103b0d933fe788ac0248304502210099c1e41b9a4af370d9a5463897ee9cd80ef1d3a6c294e0ddf830f062acd911000220103c06cb11d59086a1512eb684efc689e775c0d512afacd2e42de359db5e63540121026a65225a80aedf47e959735b123b7b2ea60f8ac6830e7adef0ad177f98128d390247304402203dd14bc2b0ecb9314f2f90d624ccf7030c4ec64f76e2c4cb853d6216533d92fd022056a8db7bf1cee758f2b66cb671d07626406fb84cd6893774dad6ee6fe09f87cf0121026a65225a80aedf47e959735b123b7b2ea60f8ac6830e7adef0ad177f98128d3902473044022019873b79ba47ffc5710a716cc84e241f219fdf79c5bfb41757fcad013b61865f02201238412fab13a2f9aad5443a720353fc956caf45366caa58a63b19f877cfba560121026a65225a80aedf47e959735b123b7b2ea60f8ac6830e7adef0ad177f98128d390000000002000000000101693bc41061d2c8db65d27a88e15190cb3485a28797d55829183c734d97bc4c4100000000171600149278c214f2562cd021c66c36a1ccd9d4486d8cfcffffffff023b1f2b020000000017a914a36aaac5de44f9705babf5c5e80021cafaab4b9987dd6368010000000017a91407e330ac727c58b98fa74fe99d60c4b7f9a5eea387024730440220174ad0cfbfbd42674197ba21f22fab761427f0ba4caff2ef0f4f0b89c9b21d6b02202a5666a197335c53f869c0b323a5b7c91e2c5b71197221c772fe8b65dbc3f4350121020ced24a030df15c4be192b1b5ed1f62ca49d487127e038d63b0963744e8ac0510000000001000000000105952de7700284f10f231ea3b5467b1b3ee74774febfb1fda440f946e1e5f0b2130100000017160014a66e03ba1125c0ebbb81d87f9241de5a895f5763ffffffff700f39a45e1cc7665c59686b1307ac7593a1fac6a72ebcaaa675883e9adef61a0000000017160014e755a87d9e8dcbae720328a32e797d2329954120ffffffffb17f9a312ae79681eaf1e89e76c8cbb4378aa2e995e9731375f4fa4c9ac85a1c01000000171600146c59db3631a3093c6254cddf6d65cd1ee5d0ffc0ffffffff1f72cd695556823d80fd225bd5e5b291887b668a66a30aa67fee0d69c33bb84100000000171600143e1229c381acb39160590f0c2f61abb134b9dbc5ffffffff9d9bed33670b234657dfcead6d3bd180d10bd1afa4efa56c21de6149b2d28a86010000001716001443f573cfbc9ed0861d2ada5e9deef0bee146c564ffffffff01889e3100000000001976a9146b3972a37e4c2a44da4ab1843b089201a7634bf088ac0247304402205c7a876ac3e8f81bfc547e21cc2e81a22a0226fe30ba785c0bab1368a6b6d369022056d6909a0fd3056901cb95b6fcb9cce301dad41928f7eefdcb4197610de6641f01210398a6222703cdace0fe195d61ba1853fa1cb5c917b8830fc5744c5ebc812593cb02483045022100f8b746cc459fefc6e5191d98dab814bfe1c991a09f2f71c188cbecbfbe4d9c7d02207f41ae801aa7db144c2637585f74e1d8a5dacd1595c166fb469df0379167f5810121036b8e5e7aae8cc81fc8a7331b479b0b7f66587ff4114de097d8e6049f3d7c9ad402483045022100fb15320b371c457bbebb4bc052184e13a31fed2724ea089d00f63b0ff5089752022076e2eddb8f0620a7a7b005e5f685cef6528f54a7272e77a0819d8b3eec3eebc10121027fd3038ba3f33a0fd4f488b1c4fa524584be2d088b61e4b93f82dadbed38d9a602483045022100816ca95ede83897831edc43b3e67b6d9f9155c0b2119b80fc93578271fea550702202e533d365b624888148d19245a34a347cb4e98c1af2fdb074ece7744c9e71e8d012102265d7461c85a3f834fee8f31098e32d601c528d3605a506bdecfda2f0eb0b8250247304402203eb3db447ea7cd04b20ecbc4b2351657e5246132a0805242ae8c2d2918e93b38022023c91af841451e795e5099743cb0f7ef289ae7fb729bf4422a3859f2e820a9020121031996bab23b11afb10ab5bc449ed36b896e497aeb64cb85c310255db9c242974c000000000100000000010191776fc1f5fba2e3499ac3bb032d93dda7fb4abaac350f22ec80cdb6caaf2d5d010000001716001477e20f9143a13835470a71b093762c8189ec6f1cf0ffffff05178010000000000017a9141aeedac9271b2c2623bf76ae341ecb8162e5826687dc37820000000000160014de2e852624ca25ad27774aa78c2b890643bd9d5af32d8e0000000000160014f9d8a4721a63ea5913c22171b0d6f6651620c33e9c497d000000000016001457eca7eb1a71ad875152fbb82c42098ceb140f7a5fdae401000000001600144c95a6faf7b6befb7fcbeda658085148016b103602483045022100b13c80e7d98cf35d4fbed71b976d8a9430858e6019045ed91a13378af231e0fa02207a65020b9cdcb289344081d1be4c9aaca56914e0f3d67aaf1be55fdc300a0f87012102d9792563fdb4b183aef750b6afc9cbd2fb527340006d80192fbf7fe873103faa000000000100000000010177fbd0e5d146922beed8ec5ba6b0ed7d5eeddb075b9696ab133bcc48a5cc47cf0200000000f0ffffff02a13674000000000017a91457240f848f6a9ca8ef73728a85bfb1adff3832df87fcf3190000000000160014709eadb4ab309a2993d6db178b1af148518bc11702483045022100b73840b205be2401b5cc80109e0edd6fca5af9df35f97b0f955877aa862650fd022012443b2d0a3d8905d809065a5e065f0f9bda5e1a2e3619c139d31c2d1519820b012103f86795d52bcbd3a08097688f6363810ee1b25b6da14b08b3bb47697c151b775b00000000020000000001056834eb79247866a74770ad15bdcf686e1914171ed2dfabd1c2d99dc05347c9bc00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff20be6585848116ef921e1f5bab834e6f6b96f8e0630b825991445d5bd966a8ad00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff15e1db03c685f4ecc332fa255805c82f5d7904b32f51e216ebd588980c469b4d00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff3b0f842e99f4e4c08613a7ad3937b37e05c3e1b15326a0a2a33b0c6a156b7ccb00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffffd13699107149bfc3e54e75dc309a194599a0a772370567c6cefb1687d9add21400000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff02ab5f50010000000017a914354a1977e05c2c0d16b6046198ed7a0f78321ede870c7d2b000000000017a9143bae1dbeb51414bb27ef745389ccb79cacc5e2b28703473044022024a39fd93cc6f53001c2c5e78c398847a94547e259560121d355d8c36e5fae1a022025e6c3616b68e7cdf4e86d7c51cd41a25977aec60c85f1a65ada28979910cd4a0147304402200a9ab7645c505256b91924670feaaf3c0f82dc1e4b0d7fe37a1aa0564120bab4022069aa573b8e41e9c3fe06b79b8891b6aa47d9f523367cc6438f62ab9102965490014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b26803463043021f551b7ac605057991c9040c8e21eaf44ad8131dab90c6fa18cf0d6749c989b8022077aceab4246692440b5f9e726806b61cd88ff6b8c9995b2e3ccb511bd106f83e0147304402207153fd49745aab075b07d1aedd575f79d8726186cf5d02973be1f05347c7f1dd0220560409ee54fa7e313a5dafa8819df6a3c248c641b5e876dce8fb70f9e379f6fe014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b2680347304402204c39dc9ad4dae49340968513e29fceb85433bf60ff80579df6d706e3cd15c7ee02207c98bed0ecbb4e90890f86197144e94f14606c6d6fbc571c852604e62260262f0147304402206c96a8e1e25ea77ef93174f905eca0676de808b3e2584c4fa438e543f3aaddc602203cdcdb344793fee7be33644848c8c44a30d54fcb28a5b6eec09ac6f9d5459e34014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b2680347304402202147f5b8ca925efeaf591b3ed7961ed2c00f4ce4198cf17e280df25a8780167f02203103eb2801c53ff2806987e7700d1eee17b01021f9e38786722e11a040170a8a0147304402205fa5f855c590c19145dc27ab88735051af66191b55b380c079ee822f1b70107702203d20c3b84f51f12e0c853f34d15e402a892664441a402e9dc21ab6a393a7af5a014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b2680347304402207ef569367236a30262da471b95742c889c6ff25f62e957b10cc0f0d428316433022077e0a711ea9bd75030455419291811c2efe69306b66d73b4df5000ad1ee3d90701473044022023e52f926d8a4f5c9e30243241c4b9d0715f67f39d7d00c219933a918b0d1ef202202126d4142c1662b58ff063d42a459b23f8e953ba07a805849a9b8cb23538ad49014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b268e49f0a00020000000001074039b775199241cb5a466311695d74514371b0fe3b1d8a1131d027724e920844110000001716001463e1b6db961279fde15f97140481368612cb98fffdffffffc970b27d9316c61ec1d4f1b7a77789f80b63d23bf84ac7e696bf82abdf13e24a000000001716001475c5086b1e2963cfdb34306d44ffdb58eda441d3fdffffffe6b67205b5a1e2d675e872b6aba753f0954cae721eebdf589a0da5c5c7c43c4c03000000171600140025b3761d2306d262fdccff6baabb3b029b35fcfdffffff811667966a22e75bbea9047d047e1e5fddcc6527306fd5852853f70712a57b301a000000171600144ec307e5e3bbf6b03d60d42a03c6dfb1ce1858c2fdffffffb4299453bb8a165915aff3d09efa4a3f2d5f7d916bf460089e7440f21e442ce701000000171600141a4fb31ec32129bba0a6fd9bf00b284540b6f6dcfdffffffd6a5a6382c9a39a31eb3e111ca964667fd608b4140f09852911779117f57df484600000017160014aff962914fc79f728c8a1e4d727fef89b932fe2bfdffffff1d255d9f69ea8d17689992297d32eb0c46eb79a0ef610e4101e72e99452bb29630000000171600141be30c874127230cd178136a49c97bff927d7109fdffffff017741aa000000000017a91471a13bf2bd6fc4951bff1b08c562e2e0829698b08702473044022023326a32a9541617303f6c3563e355ba6063016e2143b87ea28df06c5a7fcf26022036c64307d3538f11af9975a1f652e7170b43bcd471546dec5f6412833bfa6068012102f8a44c19dec941a3fcbf390ae67a4a8986f1245160a2bae40aa99f8c017a464f02473044022072cde8af5ab3a3a235b889ee9696e99de8ab36411b0ed2ca2a02f5fefc116a57022057708b5d3d44744e8563bb4d3bdb52736cd5e533b7a199dcac57f9f9e4db35b8012102492e6069e9c363328b7efc3cc3145d3085808106047783df00d6f079abf2f7f70247304402203e2292414c29329d45316ce1904f1d80a743979d3c39d9ef3980989b9f80ff0202202d2a6381d2535d9d36220ea4b18088d5e8b00b318d062dd844d90a093aeb37f80121021c1fbee854063fe739cafcacf6e2b0eaecb916e44241eaa75892664125bbdffb024730440220228687a51fb7301abcf48ee1bf05b7f39f26e4fd28e55d0bca4c3fdc37ab811b022025c62f1bb10e6837c6f5cf19b230aa17e6ae0b17464eba441f533f44bdfa86400121029c722935bbfd11bfbb4554d476c7acce5c1cf045cc8af33350fd04d646ecf7210247304402204e0783d090eacf2429346500d63b9b06870adf9793e068b95694a840154a17fa02205cb98f30f164f6b49c9bd2a8533f5f2bdb380e6c26def71ae6ad4b2bfcdb7b9a0121037947417ee0dd0afe504769c064d2f2af9ca571cc924e44d92c77ef239aeaaf3002473044022070c4f2d13c8288e43b44d3db733547cc1a6341b5c58dcca03a4a54320d5f008002204e51569cb0693a96393a4e09bf7a5bacb1c98674d68fdd63813d7c49bafe071401210350beb553a6e8a4a9223f633e05c171c7b3781269ed74539e62f2dc369249aa9e0247304402207ace6a2084e99a3872312143c60fec4cd6142b64679283e389d697f750b054da022048f3885ee5baaf4a729432a007b4fd17870bbf346cc9762e40d6129ecda05a2a012102cabd1c83b5635cc621d6fd2782ec63fa74a67331f17e930d0bdef5ad07126f2747a00a00010000000001029924ae8c0a6b8493bf25b594333c5ce3504c8cd091a095b7f1d760552ffd889f01000000171600141250dc405d813f0028bb5b2bc094110c26707426ffffffffb3fc57a3cc3ecb3cd49349a0d13ab9e235a55f4341a886c60faeac6faaa85ce9000000001716001460350222802010febe0bae3175a0b03ea4c208bdffffffff02a22204000000000017a9141a68126b69ffca952a64040f0bd4e05ff5fafd9487110001000000000017a91492a57605bd300cbc3e91184ce07486bd078cc9f3870247304402207654efaa8be6e44c91e589f42e2e134be6b660d93aa6716f0c5459057128d944022021c7970bcb289bb18d051c4a9d79911f0e06afa5f36ed5fcf775871b1e3714320121026244f9128de82b1d79aeb4df4c573876075e6b813fcc61057b57a460ae2fa2d902473044022018e5b63ff78ba871dca97b40110b0359bb6a740b8bd67892dd6f5635a476a8de0220754f922369a07bf8ba39da6be9519cec214b122578f3a171718ddd8127bfdfca0121029f3a522fddda494d4e519c434e9741613af3a247439ac6eac6ee2ed6d2c69db700000000010000000001015b7147689e63c8a99442078d4ffb0cdb45bc9721b6ec8277bb89d1f8fc566fed0000000023220020a6d1503dc935fa1ac644bc73c1c46efc7cdb0f1c849622cf87aff5d11ef93b9cffffffff02801d2c040000000017a9146e2ce39a41b8b273298a4910c93cd191b215d58687d4605e6d0000000017a9146fe4b1bb042ade2a0c48cd725cd25971fdcc7fbb87040048304502210080ae988cbeee74b0fce37343549e977ad7754d803666e0de3b2061a1151ceca70220278b02cbff1fb120bdc7f454f750ca2fe2d28a5a2b353ef61d7e84f7d710ff1001473044022052f05dc0a955d12f1e35c276803be4be31f292529618b2b3a9e047cb2d9e180d022003cf54be33e23884adf2b5aa1bf38a9b78acc2b3750ecc7c3ce91adbdb7394780169522102970a8b4d7978fcf470f4b210cb58c2d5666be805055ec94f83c7be09abd634962102e18bcc685c387deeb1f3b9901b81ea4bb50834fda7cab797de2cbb829c02cc4a2102f4d6bf9b8ed5a3d4c1fdeeed85fb59d5be8184f97ae1fa8c4123c6385829c61b53ae47a00a000100000000010239a4a7e00ae797032715d6a590081cd2f754946c280b13265c77910a949fb394000000001716001457565b6ad218e362b83e4c5977261161d5a2c22b00000000be455a52df8ef230e180219e6abfa6f6687f2b960b690ee209c217bfa46de43b0000000017160014c6bfda47cea6ec90ee019ec27fc30bc6bec78823000000000240420f000000000017a914825d6d20bc269bd6cddc6ed535c291771cd61c99873c2631000000000017a9142b9b4b1fb3aa11febafda6020f1991abd83585628702483045022100d0a0d509ec71aa477a2f73160d9dbfacc7aabb5b10c71cd7dd0cd1dd3fa8401c02204dcc3a7f5c49b02f91b42b6246865fc76986d69b14ce77343a595454f5860813012102fc59760d135f0fa8cf351576eea0b6e9bf9940c83c036c080b9d6cfccdd0d80402473044022031a4d4bca868ed95f96022612a2a400dc1dffa91f11438c2a6629333f317ae76022028132ca05456d3edd179a739ee49684f190d248ea9a4283432d0c1997609fb70012103e9a19931e9c05682bbe55e0445ba7f4d794ed0749eded8b8333264a903ec88e20000000001000000037e661ac9efd3ed9a040be6f6d5e6691f3ffdf8f5d1824e7ba911b19b11a13ee1000000006b483045022100f3563d37f86332ce2d700eb69b80747d9e01118230c452d154eef4ac8166633d02201e0b11e7e33ca197bed7152f4c6ef1b70fdbded2eab77cf4543f61481dfc6b69012103c621e92ffdd48954fbdfbe4c5b06b8995bd24d517c3693f98366492ca5c69a12ffffffffde83acc650ae80ca955f43542663ce44908cd0e98d25b0d0b34dec93e8af69820b0000006a47304402200c18f3b046348b386656dcbdbf9361d90e7aa904d14e941bb52095b62853fa63022050d13cc8363dd42af0ea276ed95915ff83d041f250932d0c4692559d08d4f0ec012102715a988c1fb046fa1d9db74e421fd52529ad0eb8be4bfc9e8098d8101c669b74ffffffff9108b9ed7a8ef05e698f49380fb776e19d8ad7af0e4a08d5943c7a99ed14618e000000006a4730440220030b39fe365d7e5a71411425c43e84a96be635f202faf438b9f3227151bb400c022002fe9e9f32b69f67b294d9ece0bcd5f0bbe4c76df1a64b5508e12c744934c5b3012103d1c524e2e2901cfcefc8253638d60c4c14be64adbdf2becd1ec7cd7d512a192dffffffff02d45e09000000000017a91440ff45620d102c3e4f7a92eff52aed52e7fddbcc87abcf0000000000001976a914bd35566953081d8c80673da858f6915ba44fcd3588ac000000000100000003a6e3e5314678dba5e9afc27d934ff63e2f983d041b69185703a004942b36831c010000006a47304402206e332838c90baa757712efcf97f44edee374aafdb16eb16635cf15583079ae79022034e2adb0e870c4b4d7b7de6b4dd4cc000b7969db8bf8ed84c703e5d5c6ba845d012103e4fed1d6e91c2179227d14d9ae7b6ae22b9f82b03b5b8d7324e8e2752aa3723effffffff5d9bbf3d6b87ea30af6c52cdcbc22d5141112ada9ff5bb47f242be88d256c780000000006b483045022100ab64579ecada09d6a2d672f12e6804ce9ebb886467508f1e4ee992b1cf1fb4d9022013f7ec995ad479ace7df4952f1884954bfa4038bc9a33bc377b191a982c69c7e012102b31bd4b4f70c2bb34c5b2fbe60e84a4ca2da75e5fc24dc77eba01f00ba5b0db0ffffffff7efd964a4ce101b58615304bcff559ecd25aa0e81428cfa3657179ec2a138738010000006a473044022062c4e49ba5e6987905108cfe7cbd0ee5a3864bfdc2336b2bf337425afd01ba4502200d1a1730751753cb6fe97fa7b96b5bb5c347b9c3e0134dcff4bc83786519c5b70121020927418af0a38f04ea0979ee95ede5891262ba2170a864201c2fa72578d36504ffffffff025c5b02000000000017a914af3fbe272d7de24beed7a77f7ba79ff93511d71c873d4e0000000000001976a914a63e0f363f4fba36a126ff543b72c6e309aa14a288ac000000000100000001a8693314969cd8f5b8d2e34422385c8d6036eb1aa0b5979023c36e618b7e0436000000009100473044022070c62d2592604bbf77882d4e5eb369c3322c174d2f80434a4a64cbb88cbff88c022041da40f4b6c0b632a8ca9b8693b3ff0c60032d07f306dd5cf79bea74ca5661d101475121038a17c200a7964712d733120c07235996d56619add4afea0451761764f069a9de2103dedfb5e867ff0f2862b0a6940e113865a2971892556a54336b4917458bae6bd752aeffffffff02d0f011000000000017a91430dd5e6290e00d1a42545195f3b5a223a9dec5ea8720a10700000000001976a914aef396e5de9064bc80bbb3d23c5379735947588588ac00000000020000000001027fefc2131a07afcb6466b60b53ee2028d0a95d6febae962fa2431c8e63dbd0f201000000232200207fe7f4f6b321ba98085315822bdc7cd322450ae711a9074de0773858119daaccfdffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a543b0000002322002001470b990ecd4e330e5b998d8d7f5715ba11995cd856752adcafefab6a603528fdffffff0238e91800000000001600141d3002b18d4ff82344a8346d1f2a12f0936481193ba31c000000000017a914f2f8eb4556334206ab915eaf37f89452143a57f4870347304402202bd9290e6ee2174bb830304f1c01ab30d031092c2c37ecf41e01ac0684debda002200f1f9e27a5a23b6b7f96336ab27ee4bda12eeea18fb6e5c94b9c2c69310feb9501473044022058507fc4ffdb4cb7469543d2e4eeefef8fe0ca9e08a2e14c72cb7917c8bbab9b0220709be173e908d4a384f366280d5920f28b9188cf993eef1dd03f1df24fa9e3ea014e2102e77ea141342148dd70f58af45d7a4b5b9b5a696385d7c29f1d3ddc809d7b54f7ad21039b520255ac47cec5d93820115f1cf7941b1ecf0c439e08b146b81e450bfc583fac73640380ca00b2680347304402205f2893d6e369f6326848a827051acaf1f5d4d683e86ad35804d8d962b40d9a9802202c34cae96ab5e1e630117fc2e5d068e33abbcd810a6abedf09a3305ea744a33f0147304402203866dead15948cac03cc3a8f13679f316e023c54add0795a049901ca579db8fe02206a5f97928bd2208def65b0bc10c114ce53a7ffbdd457891f893ac45bf0727b2b014e21023982ae35b18f415a490ac825fc6db01909d90cf08d0da86627ac39d8798dfe87ad2102d0794f82ee51478e419224fac54ef395303cd8072b5eb40b3e2f4d9aad0476d0ac73640380ca00b26848a00a0002000000000101b11e50e542521dbd5caf45cf45b0aa529d39adbc9efea2bd789d6167f7dd007301000000232200207c047e3469313f1e73bf1f6fe0c0e8e31ec6d776e01163d671073f5fdfb2016afdffffff0228cc02000000000017a914fe77fb7ce6fb2bb16be0cedcd6e6ac8d417252c28733d219000000000017a9145ee17b8a5961a241c3ba23d0171f8b83efdccb7a87034730440220333571b6916f84643e27414b6a52b47fce9298d80b1daab42e13aa324d4d537502207b10812761815de3a3af4fbf3ff330981d7484c5a96604596828f19743e52bc801473044022034c2f92b90c110a6f64d12de1c470a9640c72e6aaabaebf7994e10f8fd85f7f8022036f47510be2284454392a6820f1c600ad6a8f9fa184f72e896a3078569016005014e21031f355a0142b1944d76140082b072d94045e679d2f08b75437c26e86ec85a40c9ad2102505f75f57be6f706491daf2d7ec22dff37a9de21806105ffd6dafcfed2f435f1ac73640380ca00b26848a00a00010000000001033672654d6d5be703b0db71ad4870ed01a50d606a1362280a4632ae5ece1f94d70100000000fdfffffffa29be180386bd9786ab514c48c182cd85aeaeea9375f90777c2a747fcefe0dc0100000000feffffff534596cabc5aa50e53dcb06900c4e9b77bfcd146de5961f137c1e8046ed25e190100000000fcffffff02b0ad010000000000160014f35f9d0133f6834b73e75b0f632d54a079931672ba020000000000001600140d780517bc4cce1dddff0a1e208702e3c9fed3430247304402205ef9dfab8fc1771caa2249e2accb5e70d8561eed7e2ff69b07738d339e80c71702200bf0a35371a0bf6379c7fd1e1ad66b68d91b8a334750b6a4d456c9888b615364012103851b7f7aff4551c9c744a100bbaff370124608ad7bcf651b4aa0d2ad6cbccadf024730440220567d6f2f152e348cfd01c13da212dc493f7825abbba43ca1bcdeb2e8bf7344780220717998b991539e04506d670be5362be36a02f63b6f85dbfa0bbdf859c377e454012103851b7f7aff4551c9c744a100bbaff370124608ad7bcf651b4aa0d2ad6cbccadf0248304502210099f25374dc59554f81694642422a68080fca75bc123948f25a4c02773056e655022035210f158dc019da118d5dd20323e481e0094594f63e0b1c3d45048c76a59ba8012103851b7f7aff4551c9c744a100bbaff370124608ad7bcf651b4aa0d2ad6cbccadf00000000010000000001038d175c062bb6cd2ed6d88855745ec481da0bde02838fd0c4307b387ae123470f01000000000000000050e2e6820fa955a04c3f663edf58e3bb4a9541ddceb8f69f84ddcaf820b822fb010000000000000000b2484c4949228cca40c9bf61e3dbced326a2804d4cb38f95e08c2b9b4b05b9bc00000000000000000002815e00000000000017a9141c732b574736020d4ed23aeeeeaf42051c7e4998877402000000000000160014ce8c9224cb2f57a66b78a00f8ac33c5f2589b2a202473044022055e5abce4dfa457756118650fbd65dbcae367ff86507e399aa670f33fe8bea31022067aac0e0bef5f6af595a7ad5754457b9b3270fa92ebc59575d568e991f44cc23012102c29a59a11d039b04ca3e7dd484e72ef2546686bfb015f9a25002b8ae15141f43024730440220229f85fc6b4e52d5a0a2dd39629e7056e4e774d63173b4ae9d966b72c91dca7c0220150a4a087f82216a06ed8a5547141e101f6cd8a01928218afb09d6796a1d99fd012102c29a59a11d039b04ca3e7dd484e72ef2546686bfb015f9a25002b8ae15141f430247304402201b799950d7b7ae641114f5e1c2e0e78e789e1466eaa9c09ea40607e844341be802205bb876c49f5c427b4abaff5c6ce29069e0fdbe68efeedad59c3dd4baf448cb8e012102c29a59a11d039b04ca3e7dd484e72ef2546686bfb015f9a25002b8ae15141f430000000001000000000103b778e872fd0522055aaf7fbce426e8e9ea64c1a921b131e2cf1c2460f02d4985010000000000000000b0af90a1880879e1dde8a500f19eab6a81271a1e4865ffc9b709530eda0b91ca010000000000000000bd5eebc11c2ff885103ba2795cd2bfbaeee66a828447a16326331af4af7143e90100000000000000000206b701000000000017a9147204c7fa517b9a1c051b8d879b63062259c50c8f875d030000000000001600145327ea13eedb79104becab1628b705d258d9251c02483045022100f1ef45e08cf9795d406e45b0e748442b554dfb51c60916d4e4df2c2b28a20cbd0220358c810077247ed61693180d45176bf0cd554520a9e8d8a9ee3d2efa8beb5e4a012103d0c088ade799f31e94058a3a71e4687c4db816bf77fd758176bf17f3adfbd8c502473044022055d9cbda375c0106e28fe1c2509fd9b902ad708257e2bdaf8639bd77affd3dea0220213c3f09998fc8164861cac39b108d163bf7123326b83c53a94a344f3837b82c012103d0c088ade799f31e94058a3a71e4687c4db816bf77fd758176bf17f3adfbd8c502473044022003e77e00eede06631d195670b76aab41470f64c38624265b2086275daea97f3002201977c4d0cd685af40f46fb63e50b7b4d28c1158be4d4a7f6a802c51b2650171d012103d0c088ade799f31e94058a3a71e4687c4db816bf77fd758176bf17f3adfbd8c500000000010000000001018036343e923b1a9b72bbbb26511ea5565847096c90d4656ea73277b865a9edf70100000000f0ffffff06bf3718000000000017a914dee12394ad6a6ccb598604ae55d8008a09451aee87a8510c00000000001600146b3febbaf4f28e65e5971037f01e491983bf9f7378090b0000000000160014af767ef5730db3568b71de93781a4965607ece5182820b0000000000160014bd5e146af0bcd6f8969ec91cd2972b30b461aa38dc650b00000000001600140612b34d7f424fd2330c6f82f92442c54d5ce89fd2552900000000001600148bdae4853b0846e0e6cb4d4336b85ac68d6e523d02483045022100c5f4c41bf4ee7b96ae8e3bd4ab37ed9e64186d68b900486b358f5f760f5d081702201bfb2e0b2978b3e468a2f373608f8460af0842d0b4ead6394bff44286cc779db0121020af1c48f4012b7f4a1c70471e1090818453a0543b758e2aaefd31308d0a035f800000000010000000001040305d050f801a511735a002ddff566b1d322efdabe2166abf53d8461539470c40100000000f0ffffffb04af4ed30ee324317e13f24aa4f83377282f666b2d5e83bd2f335d1e8d486be0100000000f0ffffffba3a393c3b7a2d7cc5367ea3cb0705481481fe1ce68033e72cbb73bdb2bd5cdd0100000000f0ffffff42a68095fc173ea111e29161e347ddd82d979a261a21394fc335f7cff19368970100000000f0ffffff0262ab03000000000017a914e20792283696d91f19be3039dd3e2d558f105d4187cad00a00000000001600141a6e5215525ef4acba7e6aef89f82c5830753ec402483045022100a8f958416f888669f04fc03999e0974b057453f89f9c499d1fe0a0a5406f5fbc02207a5fd2ec3ca5e402bfc64b018a8c8ce1783e57d1501b600d6864f438323b162a012102e6630b02e069ba344c71dd0a7f0dfb3d3b1e01a2078b4997074ff9a697ca41880247304402207e468c425b2fa320370a49f484ee7b6189d56eaa791d363281d5afe2e8a38eec02205c20f6133f5bd8599b08a4f45cdc3c2a1cc024d44e66d57fa8757ca661a36d47012103f60780f84ba60c42ee51a7cd14847c0632e99f85728de18f1226c62cd78c287c0247304402206f5ec870449acf95ae3b98ea380206acc85de9e46b758218560312da727cfe0e0220796f5fc3c472d8a1d071b23b79ff101a74f0eed9ec4e501f10066e2f754da2b5012103eaa5b8b4b605717fa8b1cef0f341298f30f535c8470e99bae4c5bbcbf6c9d3870247304402207412e0236004fe51169d55f1c6251a9f99163b409841e423ef634710cc0a669902200bb1c7e7513c74ac2069ba350c8ccc3a9ff4c5b10f6a641610a16904fa3fdb510121037ce3a09fce4c2e046ffe7d5d74e120537933948bd995c8321f3703fd18efb85500000000010000000001021fb47927df40cfa63833f603c09efd40af0fb34fd6d2c5176e4a9792e35fa9b80100000017160014f3a76b04cf4a2b13d517b801766c44613f5b51a9ffffffff3c38a792781d079ab9bb9250dbd6cddc924e713757e3c2a7b59f92beead14bb900000000171600140bc41a40d2b7dc05f52915093c231914b36f4271ffffffff03605b030000000000160014df499f0e3fbbe1b0f436685f12c333d018e5ee2220b903000000000017a9140f19cc4f9f1ac50de85e584557efc1752db3d3f387946e05000000000017a9140d8ba77d98b32330d449162641b789dd35b004708702483045022100bb1024f6eed9871215b5d6908fc540f29a9ed169dad38abb770c27d19017e7c20220250e71f9250060ba60fde53830ea37cf9a133dfc7b4e3984ff377448b56d6a010121033c42038e71da06dd3f5897376fed199ca9397ad1bec747fab26b100b66ad6246024830450221008b5be17bc444efb1aec04e2d8910b52ab38ae2e56cfb221ab4d0dd4ad48d5cb4022007e9e0a02ba92d373cb179c504e27b75ae326c0ebdd76fad3770a5745f127bdf012103c88a3077a59270e9c28ebd978ff3b54a017087f7763abbd217553acecbfbc53500000000010000000001081960717b7dccdeab525a9566afc9d158e3aaaea60e6a46aef636b6b76273f3e700000000000000000063a8c2dedfdd696fca14a0c0059723b7b4546ba8a50a5459f935b1dd47155f8400000000000000000055a20ad099e5a7ef9d44992d6c047cbb886ba9d25593f1997ca00bb0f4f7208700000000000000000055d9b28fa717a9e3be81aff771ae7b6149ab273ee6d861f373369337f26ef30d000000000000000000936d7eadc89e53878e078f47af5a2bd6be28e0c6f212d895b2e071433f41c70600000000000000000005b873b35cac3efc8a50b7ff0b51696abba4baa397af5cce7a152b0a0dbab61200000000000000000085713b54687d69132f24c9c0e0035fd4a15cde3c8e71747dd1d90dfa2cee6f6100000000000000000083e8d9b1da364afb9839b6b8d0fcb4c951ce312e405fd39989a289b5ee51dd1c0000000000000000000191718f020000000017a91444241a71dd156900b5e4d7cd31447e826ddb10058702483045022100ddf53441d0bc37a11e5bc54f4d8b6d6ee0fc02501edb47e239d660a896979bb8022045f0b71d93e01aec76c5704a3eea709c79f20a25c4e3018a4d920de6f4a421600121020ce6388b2e87d87b3ea8119f32a63c3076d0e2d5fa5d04cb74950e87fa7df9bc02483045022100bdbec0a780a6a1fbdad2227c7e72ffa255094e3307031cf5253a419fa688963b02201c315432532b23d4c84d6c6049ced91060477867244e15f3f41d8ddbe2eaaab3012102143752c4d6881b1d20b7a8c56bce25de33cbe2de6fff6e384d5a0b8b27b41c1b02473044022058bc34c5d5b606b54be828649c1faa436294ee79e57cc15f9e396f96067b1fda02200aad92c4e9a61d4d5f28099783825839de32ce75b01749a8ec9ae2103e96085f0121036489d8aebdafd8bc327674e431e4d2f4124f09cb4e140245ece59204d26c496f02483045022100de995afc604584054be2d8471abcda07b71a689ab1e7201cb0d6abe204e881c702203020955559d3f0d468813440d01e8fbc6b195b4c08f3ea137a02da608824e28e012103c9e57b7dd68a50cb3863a4d0fda2df7b67ececc91bb6b963cfe0fcbbc9e78a9202483045022100d2b9129d0051a7555dd5335f8f626055b3c0fec2f9b3fcc09a4d14a1b6bc817e022050b40a85b98af5c6418234cfa92c5a48e18ee551f23b8731f8fccd0b2bfc45d601210373dc6fcc30ea7e04d0963ccb539dfeb6a86c485f8e7af093f5636fe5001576f602483045022100cb7bef3753bdbce4e26e23123a6e7c8ab2fbe428f034fe4fcb96721e96df0d88022008a1c730627b74171277a3e40b36762191c52b223daafb8faa00f1c6690dee11012103182a5006afd211e784d0e0a140d20c4a87126bb472c0fc0ca15b1fe45d5925f9024730440220140b6993a366f6bdcf8eeb0dd284a841467a26c2013098039aed7efa1dc5216b02204969a54471c783b442702026fa5eaa15a1202219c98079e615b7ba061034f4d4012102a01b9808b30e0196166a773e3798a234792c287a03f5e22e6149de2dfcb02a080247304402206dec168e8d609db59eeb1afd03c17015438d9c638a4cd9ce936180cc8a3ab68b022047c91927a987e64321e1cabbab5c11859a0cc3400b84e3e03029f3b5431efdd50121024ef5a742a54397a5026c954b23f1b4019a62ef6fc2f26ba59bcc91d13cd8f0440000000002000000000102b5d62636a494fa4618e697f94fe5902e7c1f8da8eecadae6f8ce20980e4752af0000000000fdffffff23702c468e89acb2cc206cad2fbd66f2dbaf66df1f9210dac1326bb93d2212dc0000000000fdffffff029f1fb50000000000220020d38f9b8d2039936704d04ce9ab0f2a77e025bcd0588540aebc4f207cb0bb7582edd8c4000000000017a91425fd3c2a96446c1fbf6186eefc4f75f1b1ac4227870400473044022003ac691c67001967349ed10cd11ff8438d00050d79b1ed2a16c323ba8bdad836022010604fa25d9f91ff9b077e6775304b9402657bef406796a008a6bebd4234421c014830450221008dadaed028879b25dc26c9f87d141b020a2aa71cdd349d48f8ad1dd06467781e02207af5c1cb610f1f30d0f9de9f3f7b506bdd3250fef647d1e1947bdf2a7fdabf7f01695221027fee7625c40edeafb566af7205f4435f706f311fafa83234e35bf9408a84d8f72102854b00d9da8237b4d755f3ded3b52f4bc770a0566e936e4b960a7816e549b7262102bea8c400a1ca982ba9cd3a3753dabd21dbdbf8ae5ea0f4cd6ccabc7b12ae22ea53ae040047304402202dbc0b46a2c6851cbb3e7ea59af387126dda08de35ef53845f2a1c939c7ce11b02205b14ac881ec93a3e82789b764aca92434364e8ec33a42c7228084605d5b0d05c01473044022041bb7ed3fd77ebaa2e41a74e332c8a0c2ba4a5881efdb383d7c861319574196d02206b5dd22442ce1f23cbd74b71667db3ba727b281481a4fe8ed9cbd025ae436dd201695221027fee7625c40edeafb566af7205f4435f706f311fafa83234e35bf9408a84d8f72102854b00d9da8237b4d755f3ded3b52f4bc770a0566e936e4b960a7816e549b7262102bea8c400a1ca982ba9cd3a3753dabd21dbdbf8ae5ea0f4cd6ccabc7b12ae22ea53ae47a00a000200000000010e68aed45f44454c114371d104aa238847a53f7319eacec08d148fa67a370022970000000017160014d86ef706fda7ec587cb83192fb78fbf069b6ddb1fdffffff249f08aa59dd367a10d1a3e8b6ca56fca2b1e94d5eb624f995f2df6f2cf1b57c0100000017160014ba7c20091abf41e57530d21b2e3750f3d1a6b127fdffffffb0e9f121b3d2b45f6ad0e8edfc9e677cdf397af2ec2d056ea15c57965ae6897c0700000017160014630170c2978d4bcbbcc8faa34dfdb238212a9b5efdffffff6b103109b6348c1bd525ffbc08ef65b4f0db638e2b2f54d14cd445a9d59ccbd82f000000171600144a5cf2e50c80db71bca9dd82f12561e9cfaaf80bfdffffffb3e4275ed8a47deb75ce8ce447e4eddb0a168a13ab4240d0dda21ec6d22c3e430500000017160014bb335d23b516fa13c817c311eba2edd714c80c97fdffffffe2759db0347ec96f36d63e0b73dd9e2168f974479849fdcfa5dc6100a6761e8c01000000171600145cfb182b7219b0ece46f9306bd8dba2385769a8afdffffff4b88c00ea1371dd54a638f0433cdba180f2eb4d3e190d435a96d9841fa9946bd37000000171600141470556d9c9a621106589cce012b63f6f7b3f7e5fdffffff31372ba0c26128dbc5aa1259b4c2dfc6bc296d6ae5cb47d5f3f7bda9d7c3994801000000171600143bb3930a71c209801a54cc8bd46440b1525302a1fdffffff93163ec1a4bb8ad4bb04445eea9c092d2e2e52a3bf26143acf535f5c92f8f6fa23000000171600145b1f1a6f25568a6464eb98e450c876a11092d1a4fdffffff7480f7b2a1c8b302fc349763ad12473ac7b679892a1fbc25940f1f296fead8260700000017160014ac9f35fe900aa65f93376935fa53c0dd6049a01dfdfffffffe85e789be9969af9774dd05630f25154787a0ea9031f5720ce4e643de22092c4600000017160014cd87538500f3ff8bcab20c52d878ed49c1d11b6afdffffffb7e85ef50c10f5902adf8d14bef9b8da13d01cb9ef0de747951138d64233758f01000000171600143536474b8833019c6d0e408c24ac06038f7197d1fdffffff29ffe3f0db5d40f3453e0c72ed9f80b5a440628290d84eb0a9bc88e4b7ac57c4040000001716001446254754b850c7faf2cccfab81c7a69cf7ac8e6dfdffffff41fadd6d9627d298c6a9b491d4373361bcb6f6b85061ed6bdd6fced403d8a12c00000000171600145c355cd8280497a8fd3524b08979bebedc8d116bfdffffff0377b01b000000000017a914b3ad1a98aa47a0343d724e1842ca5e4b07e0fe35873e2f01000000000017a914abad3c20f6de22ed82458ebd5573a246d75d995887801a06000000000017a91401bf31d62080d6563b92285f9963c3c093993dae8702473044022077ba55e6b1285007d6397fe8ba690b5fb33609a3560ebff2284fcbd7d994853602203377b73a49f7752b6b57494baadff07d3841a08be9727265f5153e12de0a0a61012102381f249b716d96bbe90d8a30a3bea26c1cabecc9628600e6fa44297efb6c899502473044022024dc9ffc92381b405c89b6c48db6aef9bc27853fcd4cce51168fe89ac447f7160220739c358633dce2a5562155a74e1aad72570a2ef644bcb90b03eaa1bd05b560a10121020dbc6a5d2d7d31fb8e9745f42dce73b465258cb07df58ce9a04241fce7af11910247304402207f1d60a85ef93c0fbd7d4387791d91506ca8e50de57c9a69985b1ddfbebd27330220706d1077f09d48fab67b972f3508723ffbaedd1d05348a2c690f6d15a2dddea40121028d7ba42ca0fecf33adf8ce1c83d0fe2e72cfb8ff1e70b903e456f9d690300df4024730440220485a37fac08dafb60c46c7036c60e48296d62b2fcbc50a01b8098b57a09b3aff022005fc3965fb475c4d731d3ec3f4fffaf09984660a4fef1039bbd27fd23719f0750121038cac571011ef84b28e51475c700fc92049880ef79f149c9922fa5b29a110edd502473044022063bddb3aa9735a0d7f255bfc1eba8ae51a4cd936084d68048275570d53a88c7602202bafbd7fa4c664f07431a4dc903c5221ccfd7376d26d027c87b314b812af932a012103fe03329515781b0a254cfd7e4d6e49f167e587e06d023f074c9d6b83628b46990247304402203e3d222a61c012c24f79853568695ee8cb3b3ed8aecd32947de845b68e4e9513022046e520a482bb580dfb5b03713f2904ab38662866b158a4966231c3e26d9c75a40121021f1af7f9fa2ff0b8579246fd2ed331fc881f4ae40f229ca3e814dbe952b757ab0247304402201ad98bde1acacd6a19c69142a56fd5b9acd0b4c82910321670da4c38e89f126002205fec6f777f56afeea374c1457fc20bdcd92f7b7692b4757806461bbe53d5649c0121021eaf61bf9ea803d5a7edfe1a66b552869f4d4c9d72b5b73e52e5b372f7ffdae20247304402202af18f5eb80697470df178ffaf5db5b0bcf23d3967134d4e9b5cff32e79961a60220486f08f0cfda36ffabf09ec219cf371ba36e49c104adb6ee3b12616cdb7b1693012103fc0b820c0c7e3251e2263f86bc1e44345799dd38534823352b9f05b93970d922024730440220654bdc977225bc008b703239e3b04891d39a77efe8915febce3c1436030a3c420220282a85d4b08e9a67894c40175576fa9c1b5270386e4ced3ee935595f4ec56f9c012102d695d4336d8e60105df1d9a4f18cbc0477c4265f5cff936dc4ee86abb37359650247304402205e6d4aa98e7cd216844a16f8b9b6261d7de8865333a9c1c4c8e5e5b4e4a079ad022075a6b765787a99d67f58ba3ad0027e9a59b6fb2e5947700fe0cff1f9a6cbb5190121033fcdd85b261fbbaec58125a0ecd3b7459b2d43b4ec7f8d829c8e95a98746ff4e024730440220334101d18d7321e53f3817de465fba49e0688607c390103d2542b880c0fda3c602201bca2ea62e84fa74b6171edbf69b7fa2a3084ca6795efefd21b5ea27ac4ef1100121039044e074e4952f81f9523f246d1a0fbc1e0cef32c2f7e5f599e182ccbd08ad610247304402205731070ce0a4f4c786b19a35ae70d51d7422728dcd4756a4dabb2c52c3ac78b802207b523f3350259d6b1c7363de8e3dd5747d0c4596ed8cf00e2a82ff10a9a1f5d3012103886c9d42c0d7f7865c49ed2dd43bbc17b1dd8e47f8e7659058200fdad2079b0e02473044022027af1ac01807906d493a53ffea7f41792bd86863ee5972cbd778848d7f344496022065df0999777b379dad16386c0c4269aa4024d8c122b75dbafaaed66450cbb6c7012102be0e4701252b8b6c8ba6544b467cd59b55c769d51bdf3c77846923be316e1ac902473044022052b7d5969776ff3fb60728c78dfb5bc01c8cfd7e57e2947196f2cc73d3cafe45022050269a516070af8256c25929e5f6cc12c773567dd6f7125a18361c261d27df2801210212ca0ade2ad48c5f17b77bfdc25833542074a0b3cb804e9c40aacada0f5e1c1544a00a0001000000000110d91ed721ed2512ae916f21a5423053193af0a71339ec8382a9870641e2621b0208000000171600144d0cc2f6bcbf7e9bad628e5db8150398fed62829fffffffff31b76e05549cf703e299acb121365479cb7fb1f59515d9af540b921368457180e000000171600140ba0a0861b8c353d5bc29230974df2339df4b7ecffffffff54b066edba69cce8da6fbd3312c8cf1408f2de8793ffa206990b64f946f2c0342800000017160014352e96afa77fea7fa96472f5ee7b0a36ba0d52abffffffff8c8df1b81b16605930e82fc0fe9e22a281cfe0e740861f06db13f609e4af1436000000001716001481c1662aa362b89e5da81c35aa9575c2980f7437ffffffff880350dc1805b5acec52b5719659decca06065d50e06f31fea1a7226612f82370100000017160014efa0e45e4b15870b1429fad8bcdf972e9183183affffffff8a41f80ee42e88539fb308eac3e4937db841a4603ed8c8208b0ce97b9bc6fc37210000001716001441e2a2b80d8094675be790a3ca4598c49e530fcaffffffff9c5b3310f5c0774c3dec452984a0c2c9c569a978709a2c652deea3644919673f23000000171600141b477c555caeaddf5056c3e674b2dc480c55d6b8ffffffff4c804062af937649578fc66fdd012b9624da4315580e6224d4eb874679aeeb4a0000000017160014261884661d99dfb20764e378310aae54bd1eacdbffffffff9b754ce517f3c1feda7f11a01a482031fb40be12011c6acaa1c15bffea08815c0100000017160014e359562709d1569ace33a1f80a0e23a47de3db1effffffff2bd3c0a871698260e839a27bd7a5ac0dc07a325843f6bf21b7a34ad917979b6a1900000017160014ddbdbae32e6213dd65d001ef51713a81263dd4a6ffffffffb626ce3ced721ed7f74480ae2786c63ee2f8031a74b7267d5ba18f5a736a596f2100000017160014016d6053f1d7fe8b2eeca0f2ce98d6f15c7482c4ffffffff656eae91ae97c72880c4854d137dc4ff337612b4781558bad83414d1dae4429a0300000017160014a4fa5812a6566ff4a4ef8141683b5c7ed1f3741cffffffff8799c252989c1d86ac9546e9adc1431db40d5e3214f753e0bab0541a06278faa2100000017160014ea66136f78be1eb9ef708a3ccd2ed6665223ca54ffffffff05a49d1381123fc3257b85a147cc805445ee084b75c65ffab2bc289076aa99e21c00000017160014c7b763b02f6bfd246ca821510daf07131e1f42f1ffffffffe78e552513548933b417642559dc70a2ece65fb1a6b23dff50150733b78795e3010000001716001464a5fc24bc4cde508b77c514ad7cd2842b56221dffffffff624657354be7b5db049654695aa75fb0bec8e1f7d07840bca0f3c3b36d6aabe30000000017160014a4f66085f155698f5f317bd4c98ed1410bd71ee2ffffffff01ea1404000000000017a914ce3f4f28d978ec9c89cbaa6bdb04bd22e4a4a3458702483045022100a437d03b1ca638da3e3bab401f4b23c16f7a2ae6093bb93853d46ba62955c9b9022051c7ab341de1e225d1a68544d8608fbe5157b84691f9b888db34334e696c3fd0012102ea9d98ff00e9e5b7ef7e451abcba2cc6b6b93059db3fc4c5ecafd93625b0b5470247304402206651af095c69b1efca2389bc351904a8840be8bbf4e83785f18bcf3fb4032de9022000bc2e6b12f0eb051e43bbd454537c81fe7d5f9ae596d5f2bf813cc61263e42d0121032edd6fa23df63be36258cb84b62a2e4436383cd52339ce2604d9549d7651c59902483045022100fbd35e35cd05d552b3a34b80c6af912717b78411163e47d0607b8b29845c59ca02207171be1667559a4f4147e4d88daf46821bf29b7f4412028c892165aba5eacec401210355cf33d2f365f84d5956d6e6ab6a08b31d5a61c5e650c9faace28d70af9be3e6024830450221009d612551ade25657e0787937da1eab9e120d58f8f5d5999a2f03d8b60fee8a8a02203fffe6a3c06db71d375ae481f55d96017ca5afcfc44018301a2a10885ec5ddf8012102c512b7c6b7021a43177e3481579d69566a0cb9aa860c9bb31661a94e89473e4c02483045022100c85a4cb75c24d3c4ff538b699065b3415ec50cfa2f0cf6af55a5aee13dc100000220580afd7e8f70fa85bae0a431811b22b4f321e3a60a8d67b2f2dac972b2dc14830121034de4e918295e65ae174e25694a32561675d4172d4ff48cca11414c31f935a6c402473044022004ae2cff89dbfe3a7ec5f9690fe399f413b0f01f450f3931154f10ee48f492c7022061d3f2153b045ba202cef2a1fc102dc4cd7f37b4265e54f9e626c88c85c20c46012103c9ef5d95acb09b674fd3ef71e9360144eaabf86fe13d8f1d5ffd0a3fb6aec3980248304502210096d89618f6a1438fc1131c874f0d53698dfa2b4ddbb7bb443358ecaf04e632dc022019a7de7e9d667fad15bfbc5f1f521bc445f167ee0eb1521baa53339f1fdd2f96012103aa285cf0bf4e962d269c0f643036a34ddb8ec90a40be59d17d91e3f96dafa9550247304402203c4661d040083dd7d38f4253944e23c04aa434bd2ad3ad5d6f5cba1e2dca1cc3022020559bd27c677a18e87142597d1fe01548a4f094345518804015a9ac69f74c5401210290e55b7d96858ffa6d4e5b1ea1000822fec4979458b42e37ce5039f8b6e3fe420247304402202ba4217b60ee625babf2f07c282769bbd8811e79c6123e20bef9e836d3499cd402203f67986a3c6200f3f2cd3cd86b6d54e127f0fd6265ee86708a7bcba6bf90fd72012102e881ce97fbed793e35d2adc4215e8f88b8946335c70a64832d29e63e6b7ece3702483045022100a59f592a91b724bd94e176b39b8521c1d22a87035c47768e008f43eca298aa5e0220607d10c07528fb768bb2aaee8387e47b3d980ed64c70ce29010e9656645252d70121026451dbb851bc00589c324f0276985bafdd04152f53f26e47132fce64d69a522d02483045022100fb623564730979af93cd2f73db70cf5ea98c6a937723375152bc847648d68c8502200aaf5e108a7e05a15dab662e48ef6de6cbf61802b6c5745b63de6f431616352b0121035dd8baf2825c825f1ebdca2f310764cfb30d5f54b3496bb8fac2fd5f2d306108024730440220495873a4bc4099214aec20c93142e376d8a07e3cb0332e9b403e46ad5e23211e022012ae78ddf5d782f89a91503120f15c48478256d4fae88c61aff60299fd5c24db012103c0db00b49569ba7b106cb42b06fb4685e30132a894e7fc6bb61a89d8fd1140520247304402202f777f20f2d79c2f3221cb7066fc01998cfc23fa9c58ac3968e23176e21f7491022001ea534819a347e43d7dbf36dc4aeb7a979e7d3a74c5e05d221d3bae30a4ae8c012102a450fb546ca9627f95fedb44f9acff626667a8326fec7c3bfa095f8ceaf6679f0247304402206df84144cf52d994ddb6068aedd87d4ebbd07eb81250ee9b72c242e3ac7432bf0220798b318a58462d4c7877c0d1da63f3f0b32a52175f5755163e7cb1f000ce896a012102bf1670c07f858af931aa89aecf970a1ac2f0870189d942c43ae3ac2c3cdfb5e702473044022072a2c2cb70927d416d7c06d9a4b6c1e9ea5ba94d4e88d3f87c1257676875299e02206c80a9f97dea0fc7957da51d21933de8be1c9393b84315a4cf1c3d1207f939170121031264bf739c2b00f536bdd7fded3ddc1d6be5694a3e755016badb679728bd4ae802473044022008b6f219b1980a2aff65122a8d57937ac55d50f58b02077fcc9a8d8494fd349c022010b71677e74e626ed75e08f138d586c3d3e4fe7c2e3d4757c3b5546921331b7201210388d0fed26fd8c00660578a767e2c419c203921022f5b024f0fa2fb84addf7c4300000000020000000001c016a6b1a6fbfaa3c1f22b5af1c3b180f164db563a8ed2b0b7c588dab0a1e963cd3f00000017160014923c658ba5ce4f5f48c3654125af00a1af36b96ffeffffffeb4585c16d1f0dea8d61bac6de87081e574b3828fa4cf999f7d7dfe3b95096780400000017160014487c6ae643d2498e7144aa85d5dd5aec910193d3feffffffec6a309aa482b503eb383bef9c77d8a49b524b5985e6ed7092e4e5dcb7ceba1404000000171600146a3ebe906ed7dcea4b0f1fe7fe03563b68573bccfefffffff0120fe8b57187d08519327b47ab3f6fbbbafe658d3312fefcd131015eeb17ce2d00000017160014f8ba168c88840df221cb4cb94e1c84c481b05054feffffff16a9e7efee5429e8cfd6cd3a9967cf57d45beb0921f07ab0d77fa50d63fe684c7500000017160014a60164903cacdbc3d6066bf8e4b1961980789358feffffffdc559854733df9e2d7c746e8db72e4ee7d11d49f574cfa35afc0bd58863b201b0000000017160014ee7bee5d6fd5ab0e5c6b91695574bd8d2a44b85ffeffffffbb3d5bd0afe2f265c5a45d26ca494c0b963f620ea3a4232dba08836aaa70b24e1c0000001716001438febbbc3069ceeec249c153ad2d4dd0ed04120cfeffffff0715d937172d1ccd67b7727b19a827f89043be693059c36412d136d3d4de73dc0000000017160014eedb87c6f702604e7cacd8ddd447c1c712cced4efeffffff867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd3600000017160014a98ca9b5b9d2c04e29dacd9d4ded7bf4a31b427afeffffff45810def42d0c2a8cd7901a3c546b5f561877db14b954c60f831c89985916163000000001716001438ad10a092a859986649ef180a55183fa81fe23bfeffffff588434dea1a08781c6ab1bec6bee771723f94570c199e296a0b8a4c37e14b7c8000000001716001478f0f2b7435c8e15fe36565a3955a4d79b9074adfeffffffee46a6b486043625374635be75d3a97c762e117b78c120e21681ac894eae08a83600000017160014e45011e3e611640f74d8f571ed66deba8b725855feffffffbef81cc26430fe9034f61d775a80d6f4e14f8c4c37f2dfb803447fb918007f3d0000000017160014ef1bca93908cb08bcfab00eb927d7477cbc31579feffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0000000017160014e2c6b01dc1a84773a2a803c78340fa581591faa0feffffff3511cc5b4d40a40db79141a329c2766573d44309eb96bd40ef17aca08b7fbf401d000000171600144402b799cde567aa2dc6259d99e95a3b7f0a09c6feffffff061e429ba1e83e6546c267e563eea4692f5fac5f48d29e03771298c41928ed3b2800000017160014111a7e2a5bdf53ccc151f5ba71b4bc470788d558feffffff958919e6c89e822b59d7406ef4b5e78c2f180b84814197f8c51774759a9f2be604000000171600141e70a2faa478573b9c9d6d68793da8e9ad09c566feffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db1f0000001716001477271a970bf0ede0634ddbe0e648cf7f8d8b14f3feffffff117496673b62ea07568be7b71f81f9dc2ac61862834c271081f5ceb5ce5003620000000017160014094fb4ff97b9d0937b5e640f6ba6be2ac3305f6dfeffffff598c5747bcb8e858f23109a6382f842c615cca4fbd01df04f4434cbb8154a47800000000171600140b8005340369ce3996cabbb263c5ec837192ba51feffffff78f8a6a45b9f3a6d38c2d8dc660934b666b13bea2273312d2ab119adb0adf8b41d00000017160014f4ae19e336d9334932adc50de8eb646c4617c551feffffffceaea910df2354c7f203fb93fb3226fc05020d6170a7e019511c4d425b76bfe126000000171600140a1f1b135403739074c6d033dc055e53c6777ae7feffffffde305a764049df5e38bf8e54624d15c32fbc4ab7ed538dd5cb9a8904cad2ea1e2f00000017160014c02425d6781b9e69a88eb509dc110c7c6e55c2d0feffffff9f4ff004e3f70f6e176ba8c0cc275b5fd42e8b3a0632444c1d4eff6bfeef83210400000017160014a88420fae2a7e910f15e25d9297c2942bf5262b0feffffff16a6b1a6fbfaa3c1f22b5af1c3b180f164db563a8ed2b0b7c588dab0a1e963cd0c000000171600145425110b75478128a9d64854ea6f705660266ff9feffffff379acb79aac65b371c7396e919c22673a62451fde9df5a1e116ab7e0cd3b5cba010000001716001471ec63e954a509df4b5ed521acc37b19eadbe6b0feffffff7396ac482755fff47f5775f1b46c06df192715845e63e37d6db03e9dddab293e09000000171600149f41f2ee6c11fa1cf76f5fd07b5be910cbbcb783feffffffda8bb35e94363550e7e34cfaff5aefbe4f4c0b0c4644c5bafd959701bc81a67720000000171600142c083efae8bf18cbb50ae8f2473b97e90c2e6386fefffffffbd3b685f7d193d55c00d6cf586d496c0ea9e4830271f027d4c52eab85eb68f10a00000017160014f2c0cdfa83585a2577413d4bffdb5f4ade5230a9feffffff6540ab6941808df6f9d59f338354f91387bf77af735d407bd2db32ce69d1fc1300000000171600146ae09f450cdfc1bda9050323406f85ce4b503df3feffffff16a6b1a6fbfaa3c1f22b5af1c3b180f164db563a8ed2b0b7c588dab0a1e963cd2a00000017160014c6566df032dc97123bc4649950fb0f04cd316982feffffffc6f03024d0973d42ad49ea8921cc3d6b5419cd986dc21b11cd51559ecb3ecfa203000000171600147121e8666821a0f97bb430aafa714cc934ece16dfefffffffb51cf9e09e215f7c21a74fed1d5fad13496605df74201b2a10923f25556e7100000000017160014cc8304d0d92b6538359cf549289346751343d139feffffff4eb60cd91904b70da926e8bee12d6947ed7a74207b1dbee56a243cff2610ccae0f00000017160014b7c7274c41e4fb566cf293e65698b75290144dcefeffffff1bc4dbc754b56cc8c6ca6a370e7d8ed57bd378b5612b35f7367e6bc9e577383a01000000171600143b06153b6b50be3e09c35bf0f9edf4b5270c06c3feffffff83e2e31f660d96859bea1f3ac82008c60e3aa2f85bad765cf9c9dcfa8e2c1b88020000001716001483f0f835b1f1e6b1deff5d689cbf6ba5a000682dfeffffff1629f3c823f30830d06e582517b7f675f56a8035d3402d76f3a7c2954bda8f280000000017160014fe117e06919574f0aac8a79fe26736348c5ed44efeffffff661e4471ad6a21cfc20bd5907632458ed48cbac5e47916db532cdfa67ebbd244290000001716001473a766422d1b74adb391e76fe7b0ef83fbff90eefeffffff9c53a69fd71efee6e0d21606de424cb89dc7cad7c1399b3bd7e85db8e6ca856a0000000017160014966b99fe44fce0f64bd5f7b30a43f427dd4eb264feffffffa86a90d296e0e88e6375c9f0841e0a6d28bcf0153b02f851d7a3a35ab27fca5d0000000017160014c51ba99753a9f1a7a1dc136d8707044a161701e1feffffff2ef1d6be4f8dcba5a631db591e02ab654954591671eae9aadcdff99751232d63020000001716001445c3b2d1e0b27afba5bbea1d69bd5c9bd75b3c43feffffff867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd21000000171600148f3fb01b38665bd77e8c74288f9749028855ae07feffffffde11a0402d463c162615bb070974894b3d265713d9af25af5e582c96a8f0775d080000001716001430c1ad0960838b54d6a302637605b308d9e4b407feffffff5014989b7b0b14b91527773761f2eb9e0526fea553da5acc41adece99a31c8700a0000001716001439cf20c4b4300e0e5b0d6c5f5ddd03b7776f0ca5feffffffab7520416341476bd6d498dc342d9842545e642a1f7ac1ffffa50fb80ae6f6280b00000017160014e7b11a407842e85eebd0754035f6091448fe6b6ffeffffffed1a55765ea699c2ebd90eee3e66e9484beaddb6b708d17966be8c3becf582e90100000017160014dc4a8f8c7f6cfd6c5ef53bab71d1b0951f0b2bbdfeffffff8b2d32effadc7758e5c93992df7d7b041767d854333d07be7304662f443a02473400000017160014a2cb8afb1a55b8397f8118c1067019c0fa0a0082feffffffdf6b32e5dd5ee8ca9dcd09ec3a5425f221a175651c7b2460c6943a15d8d465c0010000001716001485e23e80bf62f0f1e89bb883ec5e3883d1e669eefeffffffeabcf1849717bc4c677dce93e6565ecd95af41458f0aba40c8bc2a45c3fbfac01300000017160014f6c77cc5af4661e57ed15bd555d5edfed9fe2ab4feffffff8df63c35e8de399d2194dd81396bac4e85d7c58fd578a79748ccb3d0c90ea40b000000001716001486459265b02fe1744c891e369986666a25952f8afeffffff9048016fb2cf0a6c41772a2e47cd4658b9d52fdd5dfa1d78c75910b49ca21e6b2800000017160014a2a57176ba3bfecf957882ef095c08cde5427ca1feffffffc9571e9b678a28832b48489cd289551fb8d6d29c258bd0d8e5be536739f5ce3e3900000017160014035bb9f0213a43cc9601e5c4e12ebe335652870cfeffffff8f1d3268346f14e2f446f6843027efe7a9f22c1a5ba094320c3361a8847b9489000000001716001457a6c9e127d842bd5df2238a2210229647bac0c1feffffffd95c7252a1ab4109a5c1131ff80ef3c66af574cb0914514e8a2d6ed569a0c4644000000017160014a7a25a9f122c48adf908ecb9547accb83eb7cccafeffffffee46a6b486043625374635be75d3a97c762e117b78c120e21681ac894eae08a84200000017160014611017570c65f7de25eb159b1fb5fdca086ed456feffffffc568ced040e969c09850d07f2399da2a92dc92e2f06848e1016f93834e0899a52800000017160014dfb55495c867e67c2e6fdbadd21efe63609f13b4feffffffbdd2b0d73414b02af513d29a85ee9ffc3362443cba4ba658114f89be6568bcfd0100000017160014f12891ffd63ba1ac15bd49d6caee99da04927bddfeffffff74e60b256525b987dee50146438c7e1d6524af3a1c6654f686d7feb412cfcb0d0b000000171600146639cfed4cfc3594ea266bd6f1fe95022c6523f1feffffff19fed193af34806b1a418b2644655b1d68b78c68348dad44b7133556bb5fcf2d00000000171600147ddc7ead1bd59fb1de05a56c76740887cfe7ca61feffffffd95c7252a1ab4109a5c1131ff80ef3c66af574cb0914514e8a2d6ed569a0c46425000000171600143c8329d9e2dca493de0b63f6e080d1faa5c4332efeffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0500000017160014de25859100406458be22bd5a0e0b98e0af610721feffffff5072e60708dccb12ccbed883d5b31168286e510b6b4f6789c02682dc9956e4822900000017160014e9633877927224883fc01191943d3e2a2a02dc8cfeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b611e000000171600145f2c625e854059558ad24a14dd3eaa741ef052dafeffffffb278fcef9d04b37c0fd53604e7a670d8fc02c7b183d40c78898ec586b25fb1c05000000017160014c61b60cc9a92959e24e05302e06990abf3772492feffffffc013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c3060000000171600140c8203328942acdedd2075ee1d97bf23c68e9983feffffffa34b6b6e054e601a3fe83122b793003665d9e150e760e72e80d33a209b7a6f9202000000171600144ba4eb7c07b6804451152d9dbf2c564a1f195391feffffff6baad1d09797f0eee66526a081997b96e8c62532ecaa23cf38350d712b7ff73d3200000017160014bbc5f31da74e4acf74f5c42eb6dd557ec9f64ac2feffffffcc14c186a876ee0b508d4ad31c61cfd6ccd8e82591789e2055c40b1e717dc7a6000000001716001496f97072e78f7e2c5c15e626bd20d14404aa5f8efeffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b112750500000017160014c19b2dcc5c4523cc3b88f424b876d79dad1a500afeffffff8bd6094400334155f1825451fa46a8527c05c3a78473494790d948ebc19c82d94b000000171600142b403750f31f19857c94738be4b21b7f0db83b9afeffffff8bf06487284e83ea8058beb0c049770952d48f8ec4e8d4018b8856370bafec5a0000000017160014fe117e06919574f0aac8a79fe26736348c5ed44efeffffffb0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b25920000000171600142089a69091f35801317bf4852a8151eaf5a354f1feffffff1f54aed059f06add709885b933d83624b1b96eb48664dfb0b90749f0404c007e1d00000017160014e3d8f7dd070c33f80ceadb0564e66a086bd5ea36feffffff1b0e80a38b72f0c3c1f5a2860a114137d9eaa679af62d55070bb250930ef1a2138000000171600146dec633b992c9228d461c09ff299eefe9cd673a1feffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a44c0000001716001478f8696e5bf7065509938700dd4583f7f3e6a410feffffff661e4471ad6a21cfc20bd5907632458ed48cbac5e47916db532cdfa67ebbd2445500000017160014dabaac253e5a5a04ba85b54830b1ae57a61639a8feffffffde11a0402d463c162615bb070974894b3d265713d9af25af5e582c96a8f0775d1200000017160014dbdb439bda1fa6892a8d59648884ef7203fa562ffeffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a43000000171600148a07e0d5873ecd3b997c7b888971cbd4e6e7fa87feffffff29b4e10063c7532e95e9681e901de889f17ce821af03f773317945174bd0d36b000000001716001496239f9427d4227d71215aa461c2faf37770aedcfeffffff0116497ab206256599f52c284f7b17b1b55f2c262ff2e281ded5dc5c69fc1cd20600000017160014303235ed74a32489d9fec1b0b081057db40c8246feffffff4ec1084fd5dba17ad734738e09269959755f4abee8e1c4fd4cdacd88c115a0440000000017160014018514476372e4984b561b047e140e3fefa1935dfeffffffaa0cd535b2e093aa4c4a53feb5efb660c7591d0179871c8c834c60e64199cb3e4000000017160014e15a66e59295ee3e51c7f3737e8eddfd7a23e5c4fefffffff89bd5e135c8a34eefa5e1681cc022b451ba3eccdb31905592dff4477f62d955020000001716001481d9644e2ce01ae34175cc2aa945ea327e3945b2feffffff16a9e7efee5429e8cfd6cd3a9967cf57d45beb0921f07ab0d77fa50d63fe684c7800000017160014cb654ac7837a970c02d8444cfbc8260b26f0ab6cfeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b6118000000171600149da187e357237e42b659b95afe81f37351ae1d2efeffffffa2f8bf77b3ec6c564de7b61ed8878b99dd60156d7521495ded3a23009c517ee157000000171600145890c6d900591b1de6e4370d03f6b261d660c2b0feffffffa1a254762861a2990d0f6f7a0d14b02ba74bc48880d38bdfa74a75fa802dfcaf010000001716001404e3f62bfc96218fb3ce0022e6444746cd70ee4dfeffffffd2f3b6b64a58edc8352dd0721531336c02e92262d99da2893de77fc420039ca90b000000171600143642247aa9d480c51c1df4c978147623e136ac7cfeffffff4bb95b5af1ac94cf9c728e296245e03b058e49563193f93ffc1102a260002af52500000017160014a4c42a6923655e7c2093deb71350614f5a1c0880feffffff1991d81c7ceae0027d88121878e707d053b8f104b36b95433829cc8b09a749a93900000017160014477d279d29444200ced4a745418cde458ac99312feffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db160000001716001408433bd142cdb8b504c421ca16643c5ce9c85382feffffff7a296393613d7d15f8a864fbd43031a79e9ec8edb58dd2b0aa972b62f7a8515c1d00000017160014f6eedf4c8632a8d8ee0663df9af38951bdf1c7f7feffffff81b9a567c76feb5f8044a5ac269673ed46a585a271d58a0a4e148e6d40f2a05c0000000017160014a98ca9b5b9d2c04e29dacd9d4ded7bf4a31b427afeffffffe2df204acdd34998359d94bc6ec9b562b468eab0f73c5e797fd3a668ac3581ca0200000017160014b500d3632c2d180c5ed7df5782446e1535f9c708feffffff97ad1ade65928e1c273b6160b66eaaac2f993b3d14d13a2470775e39f8f6f974030000001716001422e9bed31d7745178c4fb8a3463b5e6b87f9bc83feffffffc013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c300e00000017160014408afda761ea861d71b6f5200c0d5cf425635b71feffffff82a84ae4ae3aff4948c30d8d2b433c0970772d7f469daea9dfbf72c69ab522d207000000171600148b9b5ced84608eb0f72781f1cb19f96e714e8c14feffffffb8e49fe9c05d3c182a1bae7f4014858a9d722c9ee69b246825c6d547bef41ab90000000017160014f60ecff3899d37a29d9828551f8cbce954176e17feffffff101921a1ca9f9d0346dd69ce9834611c73fc6e4dc9507b250e3d418f92bad99e1d00000017160014440acafdc7f76a04c074cfb8ea6abb846e134070feffffff8f18e55cf6a7f7f606dc42bc5e2d21c5deb46c8e7bc3f06460f18f7a783671d600000000171600147263a28a48c4d536db848e7aa5999512accff881feffffff0c2e45a25ed938e8d40586bc1b4094b2a653ab5132173ea3d8e624f0e11b66a816000000171600143c8329d9e2dca493de0b63f6e080d1faa5c4332efeffffff589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a66891900000017160014d35b7d3698cdcaa9dd416bd1616be7a3513f494ffeffffff7aa7f046fa782be8b64deb99a70c75f3c6b267c97c70183720e8c500ae9f380001000000171600146931aab091cadaba5d98030698860053e44a2cd1feffffff3603efac5840b8ca933a5df80b32381ffc1804d5207dd5fea70ae7048c75955200000000171600145c5de831229c1c184f18d624497dfdb28c8409c9feffffff1991d81c7ceae0027d88121878e707d053b8f104b36b95433829cc8b09a749a940000000171600145d8294791def6b878695072a8da3545c7f98f810feffffff32247522ba9735bf6fa0037cfe99b9631f2716f4b061adbb620e027d0f6407562200000017160014290b51d4032069394c169a6e6f3ad26a6e32053efeffffff43fb107ee9a9fff3967e489fc35f77b9411014c9de8aed3138aac4d0233607751300000017160014d44170a282434d37c425f6dffdeb6c774fccf595feffffffe1354601be2c44719158f271bfaac17d3725845c895c70fed13536efaeccae532d000000171600141d22905a3699c62064cf86eb5d7c34e8119914dffeffffffd5a88537cc8b5a0798a73a42d9fb19c6cb6a222e5ac8762bf93b8aa8658ffdd00000000017160014e15a66e59295ee3e51c7f3737e8eddfd7a23e5c4feffffffd5dce652a9ca89958cb7236358b0c49da28cf72ae42d6aa154b9470d7ec2b8ac0100000017160014536eab3b3fe25588a41d247353b5500a25d4cc20feffffff09ca753b9459103db7d85e57b3bc1c34a06bb9a486ea5c16d1392bf171905cdc000000001716001423f5ebba30e22fede0cfaa126d91d3384fa18a00feffffff04f4c427fd476129eb51f807dec0704c3d69f161b8e0f9d177d390a221e3e4d100000000171600142be86fe930f0d87a1ff3a1ee981f6a30423e99d7feffffffc6f03024d0973d42ad49ea8921cc3d6b5419cd986dc21b11cd51559ecb3ecfa25500000017160014c85b41fffdc03b478855c9e64d02988de6e13765feffffff1002e0fd009b62ab687b3d603756824386c0a7bc468120a71b77bd999c240fa00000000017160014ce5d30df2439b1da957b5a84bce5ebe47042880cfeffffff1f67a75c0752e17172d03e49a7edc82364e5c32dfe3b3c9c1effc53dd9b991d30000000017160014738a1b0b32ed2d12e403a5a347e29ddfe330ca80feffffffaf64dd859f3d0c5cb6a4f27b64973e8698aa30a386a7cc97c4a807c3606694de0200000017160014ee227798f4b04e749d3a62f6c6d157227e081dc7fefffffff2e2aab1c4d83668a1c7b54a6900a97f055706392d7b1cfe15ae189efb5b6ba202000000171600148208e23dd1332c354ea97a4c04f4349c425ab401feffffffea4027ddce5a1e17a7bd8aca0f49d3e4290669464f2c859ab284d89b662ee44d1900000017160014a76c7e141ca739b69439817690da53d7886ac031feffffffdfa4f397344d76170ea5a046763cece98001b0e3dd794ae820c5e9b91f339ceb6200000017160014504e1a7b4ebc9d2ab97eee35c7419aeb69392250feffffff5b1ce210bc32f2cc64dd50b270fd17f8f212c865a8fc13161d9420176863dcc10900000017160014ad2151288c7b82fc008c7944459eba39df47cbb2feffffff067e40ec13be4ed086823bb840d4e6c451523f276f87c0f5348dd0154606325937000000171600140503bde470315981cdac096de9e18c4a731e4368fefffffff05b4956914a23986b29b8a387150e936c3a63335fba41bef9077637e803d1560000000017160014e15a66e59295ee3e51c7f3737e8eddfd7a23e5c4feffffffc8ad441b6f63a65c65da4014615682f237bf0cd4ae1d378c1ef2b22eb37308d92b00000017160014880baa6ab4acc113bba8b7baa7753238058d676dfeffffff0c78a4e57c545df872531963b8a210fccf9cd9d9a38fdf305b227aa7773c478907000000171600148c2dafda7e243e33529291eb24323dbcfb112065feffffffc1083450d108d5912d9042d80af1c6492dbee2959ac060d942d5bc6afb43fd1f0000000017160014d24400a1b31e67698253650df9b8765907063f9ffeffffffabb33279e9d6671f8729f150258796a1ceb8386fc779944961f6e91b33de8df2260000001716001420f5e68050e302da1ae34c063c3e9c70b400111ffeffffffd5adf6de81c6b86ea22ed7c2fdb70ff759bffb6ffdbb07caa42310a57374b2230f00000017160014e7c7235962c0261fca9dcc89ddec9716afb0abdbfeffffffdb1d6152516ea2fd416316d1de550a1d479669b150976bd8350a8d41b581028d0e000000171600144e4e11ce084dc2a6250410f093b5256eb14d43ebfeffffffb9386bf239f3bd91eae174b259d11ae1a7dd3da6b9c468030a07fa3ed941eeb40700000017160014eda42c8f5a5c1fd7515240ba385d637b0584024dfeffffffd3113749e9d76dcbea04d373c1feb4184fe4a5c29790fcdcf3ba1324e574da2214000000171600144a7c71be23125d8befaad3b941fcc87ee27b7d8afeffffff22436689f3dbab0ff4830dd3f68cfc608d4b144ec46e8200f76f87855084f1af2500000017160014a5d012210a66dcdfa0d902bec804861e5a6d840ffeffffffef46716d5b94b0fb0bc5275a1feef58e11bbfa85ee8b15181f74cc3cf498ebba0f00000017160014f3589026434dd0c4f732822f558314ce144cb3d7feffffff69e63737c98ac91527407aab91962db5d0f69a02c745c5e2f67b984c2a216a61200000001716001477271a970bf0ede0634ddbe0e648cf7f8d8b14f3feffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b112752400000017160014c533a47bb7be2e26613243cad2678c87c72dd52cfeffffff9048016fb2cf0a6c41772a2e47cd4658b9d52fdd5dfa1d78c75910b49ca21e6b240000001716001430da98db0b0fd50bd0751507e6eb51f116f9086ffeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b611b00000017160014779940c4ae4070758f455a6a1d5604791fa55e54feffffff2f82c953093866954d3d39c09cd16f49f1ba5c1e699e345edfe5a5504609ae3a150000001716001498960a779117b27c854f91714e0c027ce1a5b423feffffff0765339803096c3bb35b8e8d83503b4fda3fef1869df242df8602cad939d4ef855000000171600147d42249445cda38dd056849254490b29783c17b7feffffffc35f2beb4360cec36e83ee744c971b747c8f7b79143cf58d9567a77005b6a2f31b00000017160014851a55bf95a2683c36e567d4cf535ac98b1f446efeffffff0765339803096c3bb35b8e8d83503b4fda3fef1869df242df8602cad939d4ef85f000000171600145870c18da1da779d507ce65563097fb6bc2a7486feffffffc013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c3024000000171600140b7952be54038813dc2cc088d6748d39b7ab5014feffffff6ba64d1c35d7a2aaf0495666c1942108e7d727eca5abbb8e619788b50013d43406000000171600146ea9ef1acda9a1788f94710fdfa98d2941daea6ffeffffffab05a853b10a2f49a27fb56214197e0c092f02415bca9ae86878442eada14da202000000171600141e6457ee1ec0c557024f9ab0a65d1c5b19917022feffffffe2df204acdd34998359d94bc6ec9b562b468eab0f73c5e797fd3a668ac3581ca3100000017160014713fdf025ca606c35d9403dbeb748e0143444601feffffff0b7fd3c6b0b51dd04f28dd2d7673b8a26cc67fee11fd998ec749cd73495ff5a81200000017160014101c80d9ac52c79ea589e6982ea8247b876b21f6feffffff36b1d77d5f645003b0d205ab8974c000fad4e2221b9df9e639af53ed4ca9f5300100000017160014cc8304d0d92b6538359cf549289346751343d139feffffff5a182baa289ccadd8d13f9e68a7cd96e449ea259b91490a1ecef67e9fafbfc710000000017160014a4f28c26b23486a39d9d1597fab9009b085bf10cfeffffff6e402fc8edd39ca262102e2ecfc78978e38bec66cdc79bbace94b41366bbfc7e0b000000171600140757a9cc474e3c2455f1f26056082daf37cd6f65feffffff1e66d9e516504a2ae74d836eb6c8ea3de6953948ce550a652e721476c96ebebf0700000017160014a54c8e62bdd3bd253e8f548581920f35e18d828cfeffffff2a27948d74de0eec7dcf776ba22d89d16c3df5af6070a11240b8f49e1453e9810200000017160014538b583b46aa9f1a30ee64fa4777506b1061343bfeffffff722245e00d50bc66daa0459e3ab203555a7a32f5872ca5e04b51f8d87c5e377000000000171600143e17cfa14866589e3a58d281d795f6fd1c23dd20feffffffb278fcef9d04b37c0fd53604e7a670d8fc02c7b183d40c78898ec586b25fb1c019000000171600142fa6c14370d6b59ecfc7f20a7661a41a2f4a3a5efefffffff17a99b5ea54db411ceac773902de4f60c4e47d79ed6005f2d2342ef54a919370000000017160014302eb10c824bf4ef15e931ccf35b36695021187efeffffffecb2e9f18cb6b7f778b6c00a8e509e8d95c229ad13cb93d2c300b08ed578e1a30400000017160014c51a8aa9d6cec3939ab4522d7b8bd6b1c291c2b6feffffffc9571e9b678a28832b48489cd289551fb8d6d29c258bd0d8e5be536739f5ce3e4f000000171600143c0e4c1b70a828cf00b8b6a04a5f0b41bc90178dfeffffff6baad1d09797f0eee66526a081997b96e8c62532ecaa23cf38350d712b7ff73d4e00000017160014ffdd1f9defc5ecbac339634c2fd040ffcfb857a8feffffff3a9e2f8039966e852c860851a9716b9b57cd472d4598ab2bf319671c4f3c04fc0400000017160014caf130c55895d920eb5340ecdfa53636f07c06c2feffffff16e9816d02760be17bf701a9a4065bfcd3df28aa7ebda1b046ca2fb9222e3ab601000000171600149a2d675317ebce5faf81ff9dbeb2836521573899feffffff2da5b0bb11f12a72ab545f8305f881bb3d52802208df5c7c5aab40c7e0a2cd3100000000171600148c394f2ddd249f381e1eb8c8fb5a47fdf5b5dd65feffffff71f0deb871aed32e7acea60c94f3a58893dfe806a0c05420f0ad8b28f5f191d30000000017160014c3f173a4b7eb5fe764643e816cf25ca9251a2793feffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0700000017160014b41e6ebd1cc1267ca81e5344eb260ed604327174feffffffb0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b2592800000017160014401790d38b92a9e340217678b863f1cfad377baefeffffffe1dd09ff6c1171aec585d227cbe0f83fcd3b7922c1514d01baeea55d081b04b00100000017160014f257aca15c44cbcbf20c3edcce9e68e848c22a56feffffff43fb107ee9a9fff3967e489fc35f77b9411014c9de8aed3138aac4d02336077530000000171600141c2750ff2c6fd910d81b6422e4be2f6c8ba51965feffffff589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a6689210000001716001476b277c3fa798546ea4adb417c5bb6baae822aa1feffffffbff80da2c1e77f7f39af79b2c937b5bee05c2c380dd2aad8cee659fff284ffbf4a00000017160014f44c6422b99578d931043bd47c82e65630d4f56cfeffffffea4027ddce5a1e17a7bd8aca0f49d3e4290669464f2c859ab284d89b662ee44d14000000171600148af6c04ea5b6a09a7613cf86aa6a9133922bbcfcfeffffffa68b591d5379791472945ae05f35c86c3e8c972054fe1ba290d48b51add2ce7900000000171600148a5614670ba73b772ff01bc6d7ab777a270d6825feffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a41000000171600148c19f3d2d31abc830edfbfc3aee0365e969a78f2fefffffff624d733610d7999e5cc3ec828754579c63a3bf1c6c83ee7cd36daa53669063f0000000017160014d0c795a14584900a071b756e4a062ad0874a3639feffffff38eb8e1f526ef2fd9eb2abca0555d9c8e9f7a2de9521bec79c6b8b711bca1d720600000017160014de5df9497a461fc11a8f53a724b7c0f9853e4bcefeffffffea55920b15839c32892787f6be35cdb811cec03616422ba479e5e0bbfb677f09080000001716001483ae518dea95b99859552c515feb8b2b18283b48feffffffe1354601be2c44719158f271bfaac17d3725845c895c70fed13536efaeccae533f000000171600140ef49e5dde4b7052b6466193f97f30a81105572bfeffffff3e79b72a8971690195ee02bdb9898a2abc0cb2b2c5ad03d7cbbee271c382622c000000001716001479baf9c41b92843ce636d2f20fcbe67cee1afa04feffffffebbe4797c8aff05ee18de51f319ddba3dc3a72465c7495e5bcac1f55f2cd47fb0000000017160014e57864035af507b889690002280880307e990c02feffffff6a73ecdae14607ac9e1db14f493000784e2ae584a97806555389d4e2bd6b45a31a00000017160014c787b42a75a1d1076992516391a5459fe92c080cfeffffff972bcb07d84ec542bba977ccebd1f2443d844d8438ea2ccbad59985d567b746f03000000171600140a8343425c98bcb607ae431bea9532f534d80760feffffff500d3261deb9173bbee3324b7d750f55123fd47c6fbaedba90d248870fcd40960d0000001716001496239f9427d4227d71215aa461c2faf37770aedcfeffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0600000017160014e2c6b01dc1a84773a2a803c78340fa581591faa0feffffffab7520416341476bd6d498dc342d9842545e642a1f7ac1ffffa50fb80ae6f6281900000017160014c070c6ec4314c7702e92f1cd3f003c443dc7bde3feffffffefcfd592c69c545e71eed6102481c078bba9c4d1679c75c1fac965a6bac47f5300000000171600145cb73fb6079ceaede2af58fbf600e72a65e3d1cdfeffffff12ffa7110ba1175e7a4baad2179640ee336cc014e44da9143efcd3e6f2174d2f020000001716001413d0a895e234b7b44b71bce0dc01e39627205468fefffffffe9e975c14312c6d5c9ebdd3ef15eefdf641b8477091235e3d682cde4274d1ba3b00000017160014e5c45c8e2458d4f73ca4240cc61c7fbeb60d0914feffffff47acde9e4a900ae2a25237e0fb93daac938763f071a1f515011be4cc40fb30410000000017160014a98ca9b5b9d2c04e29dacd9d4ded7bf4a31b427afeffffff01c14ef47e9a7ab95c00cbc1676b412b566126ef6d8926ea7f689242455215fc00000000171600148aed733244270a6a6f296dfff6e68a74c55aa74cfeffffffc48719db38d7286213202ef512b180e389ed8f863bd5116b658b7b1913dd9fd70600000017160014af1d01a2f98f9a682a63700511dfc9e178492302feffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db170000001716001494d236aa3e040712ae84859fc0e932b52b94acf2feffffffea7dc78923a4939d3524472969aa9a64f7ca06b6f66a577faba8e244bb290a280100000017160014877b372539ec5f5c1e60f95b3d14fea8074c01eafeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b6132000000171600142acacc7fbd6c3149fb8ae405353a0c1823804550feffffff53469bce4f0e70f18cbb7ce97c1b80d0cf5a402021a191d8412bedb2bb3fbd9800000000171600141f7da2aab82557c9e57e2c281d5265e4f0bde6e6feffffff9c1b85151a21728370b31bbeeb39cde9ec3aea7eb1984a4deffbe60806b96b0d0100000017160014cd50a713ea14decb542764569028070b4fa434f3feffffffec6a309aa482b503eb383bef9c77d8a49b524b5985e6ed7092e4e5dcb7ceba140100000017160014e76288770b1fe971b592469447cd1ea98bafaab1feffffff01890adb250000000016001436a86c185a6a608ca915cf723c8f10fdcf126b4e0247304402207a65db8178959f68cc36dfb101caec1cb3f5dd8baa120d881f52dd6bde00737a0220112e509afe3ae0e12df683482c0bda8d4adf927f5b080583e4b181ffbca2c20b012103bf4ff8b503d8f50d3a0311eb7b0f38b5be1c9ec47bcac95b2a47a7378f86588a02473044022078fb53541634864dcfbc9929db8551a91fd2e79a29ceee2f1bc8bc9af0c98ef90220352de6b0078c1c120a799465681641079b9bbe971476218a93e7466fec42068d0121034fd15ea3aef29c73b1f8ed2c118a85b5ce13118963144baa149d7b84282cad7502473044022043e060a35def864ef3a9680a09e957e0f9ca73ce2c18c25e4530687c1c9adec202205952722e735748c84ba9a3b8a18a1a741f96945e6501a962c0b2dc3ec02df9eb012103c592b3098758ac5cef427b2965a9045feb7a04eff103bdb8becf3431bb76587e0247304402207962d5705c0eaa39abbc712caa36da94e2ee58bc77e43d878bb9f037509cd954022078989ec0b48c0a0d99f37e03525936805a8bf4b749ca61663106652fef14597b012103982cf5f68744f3bc4efdb48c2cee468e393bb2a3b4c5c8639a215acbe495f7bc0247304402203f9bfd539a0ff9367bd47bc3f40bd07bd004679fe3c68c1e744d54fc78693c150220417b515f3e095a9a10e12d382a5ea60b97d26ccfb70ef10b43077f1567db4777012102dd45178e6d68d5f63db22b81d1e792a40b7f063f1cd2b48acd9bff844d288de60247304402202fcfadf9af4b7011005650b75641e1ea6e40fc1fb80d349295d6fc2f30a754fc02201ba33cedecedb722277b2d49e522e34715704a58adc429be85d76e76a13da915012102238df0f5c3c41e53d9f903e28cde87cc88136548d02e95adb8b19b64250d7ce502473044022011dca498d74973301f570dba0547af9c3f732ebf336db6f29fe033451d0714270220567ef6b1a7559f25010b732a8ab19a04f19053c344ff5a8c8006485e777cd2af012103b54f8d5e9557f0263dc62925b0c725aa787a8e0ccde7525851b4fa1054b1c75f0247304402203ccf98f44dff941b1346e93ead50b961e9df914538bca9767216b2f4e29f2a1a0220162e1fc983707fecb83d2caff44ff7ff17446b1496dcc5181c241481b270c378012103ee7881da3153a8656ae9d97745e01f6e2c765d4ba7b99a15506ae7b71df44d5f0247304402202edeb5bcbad766d78224b5cdaa86d4eaf22721dea7676b210b7e83dc6e80cbeb0220311b5340178895e8ab8e975067050649de16f27889853f5109dfc9f6f41e4f2f0121025b00e200d065be057a6641129666c38b269dd2ce1cd0ed269e1f436fa3acc87f0247304402203a84f6a5b9be30e2fe1e9a5b86329a879d8beaf5e3ac6fbd700159cbc120a71102204ccd266b8102c3b7b9e12ac9b0a20d1330fee954365a8e6f34d583d23e86447c0121024d7abf2650574bd644811e248c22966566fb0ae62ac178ee7f78ecb12a8decd70247304402206c5c0b386ed2c84341f3e6f995cdaad2efd305c6fcaab763acbf75d0e12102d0022034c8a9b807b66f337e6bfbb35d189bdb7d94a935095249ffd65165f2300dd4ea0121033c94b7f237d438d87716724e140684e0f32219ef8770e67267f1e722021433f0024730440220470ceb4e03e1134638ce808f3c04d389a51892be1d8a9b48068e1d58bc2927b20220389075d0f26fa1955699f35ff21a18f2765949dfb8a605dd96f68367f2420fe50121025d3cdae03a2acb084939e3c926bcb1db537a5e6ddafc4cb7c0ee3d6b1ddc7e670247304402203b15feae05cc1b000e3d2c613cd1840357e90a848854a3fd805977ad20877b4c022003486526736ad8143948b119f6d035d866eac7b8edcb8ee4d4e1f416f598f249012103651baf7d5027c6dcb1bb7a50bde1f328e3d8dbf569ff8b3de6a33e8b39ade3eb0247304402202fd9330cedbe1da6e95025c66db555df741962a16efedf5e8788188b062faf7702205235fc007eb5b8b261796f17b815887882a594696ee8085ba1d887b9813b7b2b0121034ec5235fb47395ba2b9f285e40257b45357067a3c750be26d5d3e433ad92296302473044022021fbb68b920c91d429d7d8251565d56580dd99a945e78fe1a399125813114c370220628a2183a29d862ebb986b1d9a9fe327af0636cb181af745783221d2c152363a012102a756bc96900e13e5858e268d03275acce8aff1210c76faa26a09ad74df416dcb02473044022077e280026323cc2a653d923ac9b0cc43895763e41a28d76490bd81f785ae7fe30220447167987cd774d3750281ca6b54365875eed38ff532c563c9c8d3101f85738f01210241c8dc9abbeb06db2192a0f05d9a4a940c24681f2191906eaef36facb23ae43a024730440220097393d335e1d7b18ed8ca02dc1c36e9bbd6264d4e8749e86b289886e203399502200f906ae2a002d5140a29f81c5f2239cba94d70fbd9fe232684072cb23c1cba3501210343b8f7e362e8eb24d65146954e4e9a45c675411b34b9ce6cbd8870084cd605a10247304402203bc4ea49cb25afe37d8bfdfe35f902d2503b39ccd249940b595f970292412b5a02204f4f018750120a88a43e69aff9d7a5a39c061c1c1bbe0ab849f0aa4c242b111001210244e1a850649ab31b67eabede1c152a216de7de4ca357e498977313a5feda5306024730440220223ab99eb516a8157a02a13892be26ad8e207f65d86b238104dc5012aaedd9ff02207c6d0decdcf4ad35c906839443149c23016d7bf80da591dfe07c1b3eb8faf4a701210363bf4247703026f684651a1356f24a116d40eeb8083e083b2c7d8bbb11059f2802473044022047da84b4f8313b05d88ae573fb1f95967ec7d5a5a64c66b58ced85befe468cce022074dea719850aa9b8e27eba9da131ee2db37f02f25a505c8fbc3b62726fcd4572012103f5ff51dd47a604e3623e3f58c03d93a177d57c7581656ff1647d78da510421ff0247304402207f5e74d57177c716a6dc6c94e107688c3e6160739c16fcf56285fd885b5cce5c022019c77de03ba0d2b1c21553fe07a002cea083a2605ab1ba03984a6212ccaf189401210312a455378e1bc973277693c4738981ef1b3c46f7199e66bb84053bdd71ef22480247304402203a12c82f338e09e84ba74cbf4bd61cf0a050884d8bc72fe4129c1afcf1f7401602205158a2684e24876b5c6e41e975ce9c9e7e7aec54a54dc45c9fdae0668a6e4127012103258032eaaf5615636a06270262bba99d7793982a34656686fad0d76e2a3f94c6024730440220623a270303211afd3acf40cce04901808f6947da773e4b387021236fd3120f5a02206e8b7df9108dcc6a0d46d58b5a66f685ea83aa66c9f19bdcf16f1533fe68a05e01210274446efc497a8a0d3db397bdfb98239057f73eeb299e4b45ad2fc9043d253eb80247304402205ef43740bbe02522d041e9ff63eaccfcc91774cba9722d95d865dcfcc5f497f10220072b11c55a962fe34616d13d30c7b51347947f0b92960bd561db6e0fdb7344dd0121037d707ae35944ad693a6e2a643277529cfe8c133a00267a5d7bdbf852cecf2bf50247304402202e9671d5aab0a716750e73b2a5b6795ad805bb72de4c8e875eefde8f08de83a402202a41795d946683ad3a5e7280ba9dca7b3cdea108d6151791acb546bbbcd93bcd012103e107db5dc33dbda0e93f2388ac624241a21b868172ff7c35eba11bd85c4cc37a0247304402202f9c49e04c017cf597614b136a8666a171030444cd5d27d51d2b4c65efe6964702206a667614cedf3bca8af8677b2a4f511edbd952dfd04523915a0fe612c6a94d82012102a3d2053b12ed57fa19cd435509c5404a466a553084aad0dfdbc34dafdb47a3f70247304402203c97a5130987191deac53410127535e5dade6c52c9d01e72d46c6dca6dc67805022032fc21233d62eb46fcda184520515d4a38eff6ce38a2664ad2bf41eabe4504550121020404a897b4a76c79312b686f466240fa88140f962450d5f92375c41e3314844c0247304402203b79c86fd82e0b19e4f9dcf610fec23515b5ec1c0aebc2915d68df458b6baee402207575fffd1852144ed6bba3bb6d3902f478e7b029a62bfd337bf35ec871b66738012103af326b099eeb6a3ec575f50abcdf0393a89df0f3583a5c2cb8ffba257c3d50010247304402203cab38dcbdd1d71fad1e3d0f54518ddadd65da6ae70906e71c24c481b7372efc0220642dcb511665487f492782113a797db5099f20e53cbc2cd68ff1edc6590c91cf01210289074261cd1474273e91a2e30ed7e5e9beb850747641d3723aa02a9218dad40402473044022037d6f1c51de794788a49e032b65632b5688e0f0c0f691fd8aef3b81d0d85d8a50220210bf63c88b2c76ec185d9c5e16e1b008d539be840b59d52cf0293320fbb3b6801210260fac5e0010e5d403c46ee0af15f8369974e45a1c4b946a6f2fca43c0ddb3d120247304402200318518e2805a3fa11dae417a8b02fbfa2d4558a2aa27d6208f5139f255af11902207cd5b08d8f8363ff20fbc6cd1f321c0b067b62d9c99d59315e0f91632f7b0432012103844bf57003241c07842e5c6436fbda93732c5cc9cd78be382524a97e11244d140247304402201ab24a48c0184c6f374b484221e815b2e13cdeedfbc13fd318757fc6c229303a02203cb8038eb1e3cf90f9f09fe88d55ccebeaf72229ef814af4acda3e71a855b5bb012103c77b6f6b94bda07380e7b5d697ad08a5b5482ca958728b630bf5676cce29b1640247304402207458cbb60ece22608448fa1dc2329df254a8b9b2245226824780812fa884548502205070c7b426fa7183eb0739fdb8ee51cc862a02a7278b71b755bc828a4bfda1a50121025b8612354eb2df11e133174b776a3c5d31c4f7ac975e725704c2416ed0453c180247304402207c6d7ee158e87750efab02a4ecdab459983dd1f093f353459aed5f51ecd9139402204e3216dfa335e533c30d4265bdaac73d00e7815c4b433987bba9efe323694503012103ec3901bf2a34d03ec2ddbc3a85c942ec6a5d862ee7291b422b5f2120b319c9ef02473044022050e05f7e4b2da688f1b7c5ac4296e0e539722a5c447ca702d44184ac731fbf6a022053e02d8efc1a994e6fc00f2f27cf069bcd59c1c5ae8867761a53bff95b4b02c101210208f9b0e700976ce1fd23df260623288cc55457973bfc42ef022a57e0f549f9600247304402201eb7f0834cd0b80da25ad29eb18db858abb2a18b06f16f7385bcdff5442b6d7802204e930c8f35d3527c4cf4d24e949a1d9d5a93a8714c34a34bafbdf6b7052991af0121028a08bf7a2e0dadc17a8e74ae9d9abb3f07b5aa36a87d9110a1f42560edcabd0d02473044022055bf56b8d349d49ce42e761d9449136065488e5581ac068b790223bb46e0aca2022049e94991e276d166284de313e351ce972b109d9f1291aa44ffe2f59d6a17914201210342b54e3224258b47ad303c89336362eee7425630bb418c01332575b10ee5d8bc0247304402200da4f5a1d7f2b6818abec68c99ed87634affe66235deb6e120b37a212cce858f0220405e7c95c67658fc5fa8f3c13c52d34544989f4cb961ca6d38355015340136cf012103cb367099ea96c5ddad7979feb5a2c1ac13a01c33b0eb065fdc617cdf50418ccd02473044022054f094daa30f45039be460c708a720c628a620c5008124eeffd9179c60daaf470220589d4b2c919682afaaa396110a51e1ac5d4592c969e9678ff8a80463573a7111012103c3d64e7a1e39abcd8a9ccf9715e06b023d1cb14ec3ef65d1de0bf33876469b360247304402202a493dcf869979d0cb5fd2724bf395c3f1280d8ffa49607e96d2c7ac9cb2058602207571109f68408bc1bc5c602e388d4c09d2cc888a97ef827bceb861856abd3e5b01210375a41c3f4ac53adcaade50ad4becf927c78186edd0453fb660f83180659278d7024730440220367e60426c5e5d1ca00dfb3b286db791d3bd4600811eb4d856cd85bd77e97c3d02201a974d86d02fa648a3d8ca5244eced89e1e7589db7848b46557f5411a749d205012102e67ed1a5223c3f649e32ac75bcdcaf346cb87c8ce122d8c7a31a7c4eef1036e40247304402203d7680ce14d37ce54c850dc1492278b5e57e4b59eba43e4efaf466ca4c946f9802203b2bf54478f94e5ca6efb77e81cb2e071b471e086a6ae6e0c2277a7595f93ed8012102ec4cff0c7232798e996bc40e30e463bfafcb39488da51685258ec35cdad1f3320247304402200de96cc59cb58cc3383a7aa281030f46fb82236f014dcbc789c008c5cd717d8902202a057cc712752e3381f6c22691aaefaee1d2e87c772131e0baec71cfd79e54b50121035eee6b2fb2b13970024de184c94af8d0d26802674fcd955d0c86dec9a9c6427d024730440220408369024abe46f4842a39ff2e9b00aaf275b7af6a1c64877b88ea18e69ca319022034a5e57abd4614f69af9e56e0c2f9553c4b7fcb7a844e6a7a23ace3c9b5f9feb012102d860b99e007d724689c75c7b9dd1a3d2aaebd5deff230311d66f2b98cf3e80710247304402204c282ade3e1f3044e162f52c4620350a9ea5657df961e10e581ed662b5f5738f022069ad2968b7b44c5cafd634e26b2d297c67fb1c01de15cad4d54ad1ac12da439a01210238658816d5d30c69b7ccade04f71a9ddd11ddbd60fe8ed740894cad425eb076c024730440220408a1504ee0620389fe2b7a9e16985e485fe55f70ce09b0ffcc63563de219b6a022012ce026e1370fb7dee5a2a362ff19c52cdffbb72a36c10e4eb42c56acc1a2c5e0121020ec8fc5e86be87c74b9cd344ca9fd80ee7c309c15c4e967ee99c3ee1840ab1c2024730440220486b14d999334d13fcb37b56fb72d3178011753b77192ad5e77cb2932234979302205db1691c5aa0bdd5bdf9b51d9fa674eba85c7f7f5b306a97970ca388e0694d170121035432d7440537fb9ff15dee99416d697968e7cde454299d7bdfe1ec3acc828e320247304402204911d40ccc63ab21bad1ce2bfbbc9bf9e33b5355bc45688f381da9da55a0408c02200e3c1261fe94347242032ca31aa45120966952197855837bd77c484c64cc142c01210365bdd6b8318291f7be3fb37516e8c9f632495d87dc3e15380645944160896fe60247304402205139bae9b6657ddddc27fd19c01e55ca81e566b29241124bdadaa478c85d167c02207a4e64a0b8231a304005a4c3270c12f872fe32e63d88ea022a831bd04377a0fd012102cc71da42b9991e1ee83d5b7c9f10e341318f2d6a5d16aeac5ef6415261a3c5930247304402200f7217cb0c0d9b7627afdd1ccdd9fdf137a2dca2b39f4cae1f007be1c7301b280220775f73499114f4a5a7451628798792c9c4832bbcc450f6c25cfef2478fa85f0c0121020596530ef52dd8fe9d3a93e6dc3925afc8f6ee10b5380ad7a7907e512ae2168d024730440220227b593f07cd244c8d8f8229007c71f6a4c0e59779e329c7dd212d994369376702200665950db4be98d8dcb58671e6dca952d5375d1c35c0c1f58f6d7e957d2e8d640121038d0e735901cf32ac376ecd9a13a0d3718e62649151205c4e4299b42140debf3f024730440220614bce30d43aebf7ff4abd65c174996d38d26574edd7e1de4af035dec0a73d40022024ae1cb6560e0ad259f68560d45da2c6769896147553f8fdf123a0d0e649f868012102a9e7520e116df0d374b58f07ed4078642043a9613201803170602330aa82a25b02473044022045115818222901708e6b87ff7bde3bd631cf53c7328a16a3fe14889ee6a5f05a022020126a6f974bc54995b4664ce7cf847a029b16f114f41d4dafa8dd01f90aefc301210267cb13a83fa9198700d4ac46d4a56dcd71521660bb5029db8a7cefbcb512d159024730440220270944090d226049e9056bfbd86123f82b28f628630b3309837279fa52e54b6202206f345f9cd52abe864ff86aedd1081c047ee9ba2071902a5d1b2dab9fc6a896550121028b132450702208bd3725d14c5d30e2d2cd0a8e7a644bf8df34de4dbed9015ca002473044022062b4e7d3ed9de70bd227430e28bb68662c639ef7d3fad9a630701dbfd97ceffc0220485678a41e5ae3f49511c82504a09894568ecf6afd3739b2e46882a28804fa180121020303244b4e92e1d0e853c7113918a6884ca06b15c8f2c7c0e0a464676f171e45024730440220701ee126f7cbc6655df34fcde7131f4e1c6ea3f6059cb9e49b66d50f1b68187d02207b5f4fcc4c426dd2cc631c9dd47449e75a2be1686d040b6dab942a625c1414c90121020887aff6ddc65dffb03ce6563c7d63d89574961e4a05ee53c527ade357199b090247304402200a6f17974164d9dfc1ce902630da161c140ac07b96490126dfef3870e53957ae022050da575ab081d2cb1cdd216c58ad094e922a5800f8674032869888e7b4055e5c01210304722cfae59f1d296e305e82764e773b8d7152e7f5f6cb15255f2d83c89c779a0247304402206999c19c2e52db9ef12921dab0dd1e82b8bcb955cbe135c2f3493b44196b107002206bc5fd7206e1b7c4fe2ad2e292aa439c85bf3c0cabfc0d2029e2ca19384ad2140121025701d24258d6813744ff86aaa9d5ac0df04656f3e173552eca4fc5e0018e0940024730440220367c3201d3b50481a8cbc9e7db88b11877bf790d58ee3e0aea085accf518a2f2022045a359d03b4f887ff0b0f4bc6a21af349a79c41de64e24a27596cb37e8514c72012103ad5fa34109e60d7346b112e0f39c0cbd3fa2430d92e145420754ee2e7135ec940247304402201750b3bde8c8b50b0a8f3b6d726de9e13410d329d8cff99d2274d0eb562ce3e302201a024933aeba8ce56b5c19a403480442eb1f6890645e3dd7b80bfed95371ac2e01210397ad7434872371fd75405e3369c01740daa89cd06fb3ead2c99c61b7f65275570247304402207cdada2a4dccc8433473c5aac52c305906ff60e68c61dd5beb10f8ded19f0e85022041bcc1bed70fcdadc0be23e87adf4a73fa5ec4f5dca88824af0662b2884779760121027ed16b436c7f88add1644c9fc550fe74766140f249f445c09e3641e14415af9302473044022051829fb4e36174685ed7c5ca87f44983a4a404b6cb5d7b200e312b62f531c2a2022012b3783164681f6e1635e7aff72e719b68986141244f848b7883b9bc8dc75a45012102af231eb9ead38f0fa0ff5ebcb3fcb6cd18fabe7981c72d612babce7b3461aec002473044022038a7cf01c4b1bd1cbd0a7238263ebcb43b6877cda898f65a7e4539445a6cbf1502202c1cc8377294b112b733335c51ace495df99bd6583e111c3ce656ef55a4250a201210396cc4f4ae2653f6f2604bdea26231f08a42d856cceeb59a547921d8cb0270108024730440220209b9da0ce1aa73695e895fcc70fc80549fa5b5aa32b039724d23b8e5495567702200c74e43c82740cf69f0a2ab43f13743be454225c1ecdc8828431b7b6ee0714fb012103fed0410a4dc2a72ddccbe65205e2acf5d44fc151e1888e25020cb10bec8071c90247304402205ef78b3d814906c0ea8253d15ee81ae02a232843c0c21eb51cd3f9204628d3d002204bed98cd0d055a0ca2c53658470d87bf3ff85dc64ef25e086c34376c7b149a06012102c70b68011a030711c49448281fe049ce2b6305fa1a0d8a0b26e94e3a3c783a180247304402202bd84c3002776029a8b18b0a626ea321f72992b682ea40eee13f4fdf565af61e022044210eaa829952dd25d6cdbc7be6b4d59f811a6ba8bcadb5d613592d304fe13601210322eaa6608f97f390f6110fcaea2ec70c4b6c323fdf4eea8e6748c6b3128696460247304402201894ca4731b5933c47c40ef3b5ac976e4d7673b28274803264285332fce136e7022078e69227e1e00cd8b61530903391ba4d88e8427ee6ae4fea82e126445af1b3da012103f366ba7c9258da6d2d6e310864a5d198a667c0a62f61a97ce767299049c09a640247304402207409b5d96d6439fc65f7ea250fd51dac02e6034e1105c60a42f2ef6939dfd9dc0220023f291c8869a18bad0dcd0f8f3f2d5bb1d0086811a3dad8aaf39db3d0814cb6012102be232f0d4b3f75d4977616cac0569f412a4aa0c6b8969076c3c0b90edf2a1b0502473044022018b2d8b9a077533ca7a8f19f8ce0c038a11f85df6f4deec3097c3bdfe05a81da02204ec8c5c0f37fe672b34699d1c7d324bfc06dc8db1f8b774195bedda0796569d6012102d43a8015b58ae9226e7a5109a6ff5f61b7a6b404fdfd0f6d023f2fbdce92011e02473044022028eb9e5e7a92e7ee5e7282dfd1dd5adee46a6d429cc81b9d12364d5dfab0d64f022024637163ec9fe46a1d57c09707581076adbfacf0143c071983ba1706beb630610121022d2be5cfe49a4feb53b9dd0b5b47be3a067accde9bb33db3e7a352eb5e6dd71c0247304402201ba7b1c6ef6e2d7a8e91b06e9d2ffda53fc1ca16735fc724d295d061a9a7b7930220525f51f1324191b55f90761f764229d9114628fe94e44af877230e40552ad22801210342b54e3224258b47ad303c89336362eee7425630bb418c01332575b10ee5d8bc02473044022018bb645f71dc159f8a62b1a52f6ff1c36bb740860f409bd0e9a7539ad675c42002201fd0496fa23b868275f7c9feb9541f001e406ded81955398ab29818ea9deac0a0121023fe6694cecad624b92a0beb3a389d64040f9e12fa715650a75a1050b45c2b6de0247304402200fd1dc0e83d112e9e41ca658ae6cebfd89a52ad0f9507f25ebd3ac95a2fa2e86022049e80954fc04658ec32186dc3cfabdf0645feeb2d9a3cf9fd7b2247e91c67d14012102cdead0b58209d928875ae06f6ac9efa242dfca3e0e59946fdd1212f1f3a37cb402473044022009a915cf97af0632b06159fa62fd329beeb60aa57773a3370ffe96e744461df2022035bf5c1e0f912b0d268dd2aa1af671f3306d329a499bb0bcb905717f32d6ba0c012103b88c5a5535d622296e5fa3826f8de7deb739c27a7ac04ea37eaf3b4696ef28db0247304402200097079950b3824324d90fa0e17eee5e5ec9ab14e9260f615c6cc036aebc126102203585b05f420df4cb490d1d8367d378ee6603681b99b796e6cbf7f537b095539c0121026b28a94f69a0bf8f5cd50b51ff2d2517661f5080fffd9765db4a7c84ad2436a902473044022056d28fd4bb30ffd1b0d5f50ea4ca6588756d6d4645d0371e674282fff1152bb0022032d9f0d58fa6844c914e5c86b66039f53557cd33cab9b71f6f4cfdb9577f65de012103f01d23dcf955ac0ba8e9942093896d2e3379314f31358ef0944618f97119bf120247304402202f4dc51c898bfdbe2cd8c32713267bf183f8e260f892b08e324a549532ca2c530220188de1a486c277f52dc0b4e36dda9d011e2929f1cf316cf8e4dbd2785777dea0012102e306ece133e6cb860cfeab0f2b0c8d72c7bbb941bed354506b6bdd51ea81d224024730440220365004471240b7996d07ff923d157fdc15cedea775688d91eb95aa31a27442320220433dd248082ad3c1c54b41d884e6004c857dce74ecaaedb6bcd5feac9e3f11f0012103586f8e56b4d0b726733d888ab58b57068f7a506dc60af9741e5fe3037137226d02473044022013340d8a2f9e697cb91587b92c2090cce5bacbbb530dad693cb3db932085107e0220161eb4a87a473988a4073ba56f902f382f8088e4eddfd398a6f27bb0499c8fc6012103078cc114c442ad435fb5d464f5b788ae4e048784e6d640c75af2651ef6d71e7502473044022079bec3c6f9c25b5d5f45f2b83bc9415cb47367df15d28fe07598869d2074b06d022034cdee1956c0a3dfd26b2911ad879e759c50286efe01857d56825340d95d6fa50121036d2d66d6a7df4b9229ed7964d3e77d613154b4a50174737a71b2c00aebcc44d00247304402202eeaf695464e1d35f9d1799d988559c57d6c03168774f6fc392f467438514e1602200ebd53d4f12e217a5c12fbcb0c488a700f735b15b004d9da5143dbcee759cc3d012102992c345e8e2d78d8a5990db66f1cab03e378bae05aadb15e17258f66fe9363070247304402206df721bc8772f6831481b197172d79675366770871cfe01de7da6e5647942401022028cbfd90e7787a3cdab4f7f1e64bcd492917ffd92195e974060f502ac127748f01210230eb5e2d290e66ed5c90c00a5c5c25d70be9120a2e8a16693f51e4b8b7aa0f8e0247304402207df9298aca983082667c21820dd3e16a3d783782e4b0dbb27f30c9c1eeb67aeb022059a2e832a82d1b1c694695b389b0740c07238416f9da139ced787cea102273ed012102aff4fdd04e956c5e56288a1830265f7b14e3996e2beeec5c772b4b9d3b348c5c024730440220046bba1e86ff85275c218f4365c3dd1ff94bc19e542573f0dea9781e61da3dc90220113ba43a78966a890b438b3fd403bf442eae86c072e7a6cb8f60cecc750af6c201210352a64f3a4fb6540897bf4e7d20d79398921e56f6a1f3ff71b6b2ae469900b0d60247304402203f111e258df7f022fc6d2ff3fe6f554e57b055f1257ccd2a9ca9bd05b4757bb6022051232b67314a0c50f7544c9abd4d6bdca1ccc8d7224d2fa5fc344be8225a7fec01210314e447538cece9989da482a1887d02fd434cd609459f5e6cce2960f5846a72a50247304402207d22cf87d516b8db425ef12c083f37cccdbdfbab4b1e958675f8db93fdb96a62022051381f99b45e60ea620c16ed38a79758da29ef182a6e19484fd3e79a0d6b8ba80121020f873b7adacd648d674e730c2dee3d7fc8ea1248d01ad18be7d686880e190b25024730440220089935879cb8d92dfe52a7f9983b4df2a16acadabad10593dbe7e378bdd321a4022063f5438f1755cdb79d645d3d1c3bd42016f6c34a131965f36d4c1c80f94a924b012102f6a4667b91cb7145f5a8b6c866df00314e489c1d1fddd4d0e61128336a7e7c400247304402204ef80397bd854e5748c06a48945b754fec4d42d63a18e06e2df620aa4acd2907022039eead6c00445ed41556d10eab0840b84d784e0fc76ed517af9801002cb29879012102a05087dd0ba36d4dad2f35b8def008346ff822b272ebafb90824c0c46a381d1a02473044022007f9de728e675078826abc480f6487678844ef43361671669d40d762f150deef02203afcc3f6cf6095869e38900d24a41dd1a2fb13be35aef22b92a2fb2f3c452a47012102e127fdf7bdf0ef379739084ce8c91d8b2e4464a9755e5374726e3b0bc941f2920247304402206f692c70cc9a1e8d20c2376582032d391c27f770198919707acaf3cd82447945022073df6a9b08964b5975a99647b65dc8d10b3992f38daf01589c3ee2e19acd0fc801210322de4650620b6543112006a687e1b8d0b64e81f6308e5487a6ace5ad67c569940247304402202614ad204ea899392be3ed5744b2c79c471c12674e06aa3fb5142567bb59f27a02204da6830fa9d615deebb3230260d6e3f5e96547e6d2f6594de6b2cc0d8fec2a640121038460648002de67efd960ac0ea533569ecd08e92cd866a3725a94ab9dc9fc7c8d024730440220642602ec38150fcd7d83f396dcf1bdd9f7cba1202ff1b01648f38b98654ab2cb02205a9156771bdbcd2d4de89ece5a15438f99238220e815ff3ec26a5871134e13ae0121028f08480253ee36ba3036b8e799910c558871757e54bdc156a8b0274d6a27ee8502473044022064a6e89d183931fd3ed718229f55af32eb0bee7deffbf07ebb07258f12009672022026436962e44d81caea9449e5822aca07592d3eea82009604553b6165c9a076700121025b00e200d065be057a6641129666c38b269dd2ce1cd0ed269e1f436fa3acc87f0247304402201ddc90af731bf56c42d152ca80c591096d364d828a142bfb4f81f6a9b75412e902202abe55cf3e01c632c85d21ce1c394c4d1cd5d19486c7764b3761db03824b412d0121023b21133f369768f2696c32b57d169b3df8d38e2c66279b448a6aff13574882220247304402200906c52138b7c61f9f24ee287c45b9bb42f154a1ab95f31b31ecd7c6c8a70f9802207ba13e29de2e42c9f0434f050d89c334b8b7e0f78c8f7a49a28bcc742be142370121025a561fc9d5baca1973d4f44f71a39c290a3bb9ae6560b31689f7725791685dc302473044022028387370260edd70ef9b23d65e3fee19b1675e3ed19391bef50793096e6e25e5022046605374a4ea337e717fba0a1bc3a2d40673743981ff70a14b28a9fb6e59c501012103f5c78131b68be2953697a69a65bbefd3b366b972a4e2502f6d69177df40a73010247304402206fbce87c321a46cf1f504b77656a98262127f537ccdd02fc6b6b0fcf43a240df022026de394964e1a48dcd6b1022eea6d01c503475b48c903126ae68cdda03a27c36012103e73a67195bcb7c533da3f95f3eec9faaec993bf0c7cb2f602b2cf34e62fa194f0247304402204cf71783c60c41d5bc0389e4645f94118a8bed7751b94b5e57a2c51468c4aa35022007fe215d6e49af0d8928e33c594549e9c6811f38338a32a99de82a23164987f701210275ba776b3f08265a15ea5187004f3bbd23c550fb8d3738c56a18421d9a429eb602473044022012ffdd3ceda682c7b07abb71d25ae171007aa20dfab84dbc256af8add3b6737e022056d8b3024fa0f76bb6aef5f1686abefcf25a754a9f601e676b90abcb4243da190121039a35e18fbef80419abf17a1496c8ee5515776be1229e07d566e5e0718fe0e5be02473044022030f86d72f646032aad728c6eedecd133e287bff2b8e9daefcb2766bfc7114aa202207803f6a0bffcd70d4827b6c5fd8ef87e776c2f7971f91a68396255c51753deeb01210294f9011ffef6f4a8433c636d50bd9e6ca9930f14c448879bd1d8de76e4775b7c02473044022023b1773d30bcdfdf731ed7eabc82e4969f364bad898187ad4e9f96012144c8f602200f2c33ce46299fbfc1c2ef0bd5c01069ec19ad5713d2458bf955801916a65ab301210397ad7434872371fd75405e3369c01740daa89cd06fb3ead2c99c61b7f65275570247304402205b0e834703064f744e532d0d60eb0614e6ce5592381b6c86b1087fc60cde1047022000b2ab8ed0bd8091751c07f5a5abda82152bb852d925964026f2f7baf9086a8c012103c33178010b0bdc28d4a04125aba89c7542e8af516b6445508de9481a147b30ed0247304402202f128814d7b6e3e91425e485960b7364e35b388e3468f2a79413d582f15f5f8102202090573d5e9d07bc195e60f8ba104d5fb944f81168f05dcf68422260c4a7517d0121032922988d7bc3c7e2aaa852392ff9f1c689d67b2ab2b025757089a2bbe825386102473044022031d431f1556dfad613d5f5d514ce85812665b49f3299e41b851192f3b817dfd90220583b1d5b9783d3fac8fc78be51cb87d6f7b66a1c6ac8fd89ef6a895b39b39774012102f7346bef3ee1df4e7a3c825eae8aef9184bd566f1dd61a942a8326093ac971de02473044022079a54a146c868541d851464a0d3b9b3069dd0fa2754b4b970414719e15629c3502200e55a495df45332179bb3b51024935b52dd436e28b577b87c187dab4112a178d01210329251152ff32f10ad1157b4359fb04e027e15a661a071289e8ef53b7522a435d0247304402201f934d0c9810529afd281f62317d973114a5deaf5fa8aa8ceb1caf661c8fe38d02204270347286508ea15e15b22b4d0664da86aa46bbbd3db1d5336a82a62fbe1b580121028113ed92618b03757a6b6568252479d060b6712f032c6b9b7646d017cab8b9370247304402204158cffcb9ac3903ea67f54a173ab2a5bae965f378b24520c1a8e445bce2411902207408407dcf88998708fcac65a098f8fadf94a4c650c111efe304835805cef2c6012102e335bc727a0cb612ecd47decb004061f8823fc6fabfc8f4788191d51bd2dbd450247304402201e202433b29cfd6cbd97e2570e412328c6aefef393061e3d278bfda6845d17f002204160618ec27efd6eef35e6d4dec9d8ff5ebe123a18a14ddab7340879ea8e65fc0121033ae2ad0b45ad461d44849bc10744facdaf01c6754ab9b0c1972d1540b5d84eb9024730440220486d433323ec0eecb9643930fef8d3bfd6aee7f3504b0b065d35777ae8ed4f480220062c2bc2b9dbcc65ac1e903e1c88fe7dbab378164584edb3ebf6cdc8fc4d882301210230eb5e2d290e66ed5c90c00a5c5c25d70be9120a2e8a16693f51e4b8b7aa0f8e02473044022000ad10058619ec35e7c5d16d0baabd01a8de15decb1b1fec0cf555533a3c4355022079529f8cbd82d544fdbe8dbf1055698e5d5d28651c00f410f38a5aacdf519e610121036f960230e93c431c2a4e0eb87d8b1ddf6ef20e339db6f2aa862bdc11e093656a02473044022039cf8eefef262b8fcff264d859af2a03c26e7e4461d7c20426cab2df2fc300c4022064a497caa872ddd6ef2037b66765686898ba29add5f0fe1f25b2001f387aba7c012102f17d281c1dde2313a5ad61f60c4479abc51f91afbd2ec889dc1ff5b65ebbeaf402473044022028efb5625d01382be33bea2b2eb100116636b302f2612065420e7ef2136f1eb202204d27b87dab7a8e779b091267689424acbde9c1bc0dc243aa0b98e17779c5d98d012103a194220c84ef3d6c4d4ecf89324a3e3250c699c68d4d80fc893be989a30f03f10247304402202400c889965651817d412c15769e17ffe21da8b31d4236dc752049b6ed9bd5de02202dabad21efe0f44826ba24c5bce232bc7f74bfdb5846220dc41bc7573ca11f9a0121020708a1a1975737fa45da33952006b903c1bc40a3838a251861c1d40d7c127efb024730440220519305c57a1d4a359beb612541088a989f5ad83d0702753925f62cc13a96435402202872673b0cb290491382f0e8d969afe3e52fd93c1ebe57020dcbc7d64cf2537201210241fc4ea262a8c2de633fd79991eae78dc0a5cc7e8c94f80b930d7c1c8df3351f0247304402202125487dc44db8e0cc5c3ac67c7c7ac2a2838c6f52995ee7bbee8b00ae2dc911022021418479b844384ef6cb6b8fdb5d20ebb3409d102daf62af1d813a457621483e012103633e4e6c7310e082d3ea2ccbc3cffed5cc0b302cc82ca1c5c29c07c81c23bbf402473044022019720c3da11636350967bb3f2c54611747e2c8645d1ad44c24f8226d5289b1c5022031e2647a7180d9113e50d794673ec0ac89cd2910ea39d009a6dbc6376af93c4a0121023eed8711e196c26c01897a2f842f9dac22de77315e70d9f85fdf40612c4957ca024730440220015f8952832e546d09ef1a21ba37a8b3124df90db78eb5a407a3077e2d602d70022019e2d945cda9fe650a130d6d886f9f8821ce000ef9b20493cd0c3e30791e36e3012102353011175dc7b6c2cec0b07850b5077488c04857b78af5bb6d16335bebccdc790247304402202fe6b8088bf832f974fdac53df0ba6f1efbf91d723547a7a02414f70a7fcdbfb02201b94233dd3c8bf3038505ba383f24ac2b424030d263433613383cb44a9f260b40121023478d62b285e0b1e87bb2f0e9c0dc41c42b7b42a676ac28662d621ca1a3276cf0247304402202a097d09dcbc2c7843f65d10b5146d42928ba6a6f04843b6b3de37d1a1e58be40220596b277ea5f58d7cc2715544054ae5ba472a5fd4969631cc26e7e4ce54a2ed340121036f5c9f430b6140ba4d82fa583ebc8024db66bf0a533c42f3abbf7b6976afa85c02473044022055485054f6eb3c5b29eba11109f9ae22c0f7348cd6005f6d257680fc63402d8702201ddac389f6a5c080226159cec58b62430936e963697592f8477a8f9d5e7aef330121033d68c25dccd9b7886901a9b4857332c2dafbea29de46bbe5953d3132bdc8e49102473044022008ad7d9dc97b3a9baebedbc1340dbc82da0453f5fe647868198ea2bfffb25b46022071359ab0150552e26c597cbcfa21155d4d7fc5ebe484fae14e067581e98756af012102f5402f21c03676fad2ec31ca537726a9262742547e7f4d499b74e5f0334fa4a10247304402205c96505d5a1e3f08e8d52f096e81ea3a06b5881964544eef8081e0374ce337f90220698942745c18d4c1f2c56f83c51957dc2d7ebe7b9714a24a08a3f8dfe1a6a24801210230eb5e2d290e66ed5c90c00a5c5c25d70be9120a2e8a16693f51e4b8b7aa0f8e0247304402203b85f3bf9a8f625660295061e92e3ba1a20fad2a0d808cde92cf3f2a22e19f450220761727e189e815644eba89c6c60ff8a2a48af02eedcf06237b188d4ff3bc3dff012103d4e8e521735919c2af448b69d61ad65598507180d05829a336e9a51e18753d46024730440220178d3e2e5be38423b37049d1307e6359404ceab490c2a0df9d1e5294ddd8116e0220193ac1e09ceae3f66feeced95f93f94588fda66bdb13dd8ac8c4f8949b0c63c9012102c9732a1add626fd61d347cc1aa321f5a9661454182cd7beec364e377fd92c89302473044022033434ef4072a7f267de3541a977ed817c32e69c618698b6aa27b5eea80dd2d1b0220275e0dbace8058ab45daee4de7c142f8cafee01df538ca818edeb0e5348fb16a0121020180f4b6987db81cfa31303ac56f95253292ad39121544fbb3af47650c96420302473044022073621572160b8fdd6ea8a88d76405878c5ab1f26a2ebd0cde6042b806ccce9c90220638113cb5a74617d2db794898597e2ab44bf48af9aac2042b3509a86b9bd490a012103e6593e5905b6e3dec42e023bd2460cd92b55caef897ebe881c72914b04c0a56e0247304402207a77f461d1536598e37ea5192132f7eaa2cc889dae1da2eb774070a8741483cd02201aa068822dbca9de4601d2eba02607682ed6091e7836166e21f41fbb098356aa0121031822d7dad7cf11c3e81826ace6ae74886cd856a491d199f06d210b286dd2f5550247304402200f2400db3359ff94901a7f9da13e1166d8295ac9eb8f1f1ac88b4f9a13cfef7e0220291dce80c8b89f1456935ef64d1a67162020b0d890db16c3a33127ab7d55833e01210389fe3eac4f3b5a7e4950b421b36c4ef8b7e0f37f2b084bb04716d7b32a2fd9080247304402202e3b4bc238a1f0d9acc19850aaa2e6d4cc5ffeed7ab0a9f8d186384816a12057022037bbedce0689d2e9211ef5cbdf59d54e454e788a303ec170da5ff43e657306b30121034a24ef017af7c56639935b945c1a1e256bb03d18f70d26e315c437d368c654f5024730440220260b7cef5eee9c43f70be65d01cfdbc4099ec4847f74cd966da0d7c2cf2428a90220515d97ec6917d20d28b305a7028b614b00de6ba5bc6068a0a85a5f170ae3eec90121026bcfd9ab52a882013a88858701a36210bd81295fd16e96497cd558716b1e769b0247304402201590b8d7c7ef21a601685e32a545c216f1140ed2425b02d4c30446bac1611ba402202af483e3b9f2878980076796c7f6b3462691c296f56867749b8c43a4cd8ed4db012102cc3965058fe5c7f3f0d7e6d077b8ccbfe5f9c8004eda0ea3b79db3171dd1586a02473044022070e2e2b75e2be862df5258b8faa87d9d866083694424b6fecd46baad53fdef350220165986cdf93709cab6118cd699faa9d66ba5bc1fdbe22abdd9739f803334f303012102362ee1145d60b8f8e93d43d1e9b5ed3a65a94918402b50d848bd928a63e719450247304402206d3137e782ad1e754e4b81570b1001b789c59b632acb0fe50818edcaab88a3f802205d3de192961b0b609f3cd69029552e93df7e92c26716b8c6bfa34b8d63b5954c01210244e1a850649ab31b67eabede1c152a216de7de4ca357e498977313a5feda530602473044022036f65ff87b7a9a3e36f49ed49d35fa8f9d5e6b82cfe9bcf7017f764f6b30ea2c02204feddcba234d3443abe280c7d731a1989adc4641b5d853385e81b1bd9da316730121035cf2015aade914ad19542a7b3f60d9b8480c93698d35e9ca1502a79ab3cb96330247304402205de1c405a431b5880ce79fc09f7dfb6d897928d71988f12f7f72eced87f9bcfd022075c49f20df3d1b669add8f53fc7f712ae9d0f1b390e8968c47fdb2f587c88f86012102d68deaf8bcbaa0d34554d55e9fac44cc26947a25662860917a3d18854860947b024730440220222ef1c5b45f692f644e1b769e24e6fa5a00263258a506b121dbb08fd38c0d4502206172602e09cbd9ebb54ff381519b4503345f07e80d932d3c2eecfe06d2a97158012102d57b72ecc69f802d9ae2d9722e2acee5c23f9f779f6e77b89a39d822cd4c4610024730440220264ace7006446b8fa0aff843e5dfcf40b86e4b5ea17ff262da897731b802978f022001c36e1fff11b41cc2a234a451344d5d251f93b4d7b17917943b10da0a08166f012102b546078ccabc794c45e94ccfa4158cb1ef0e9a7bda1312a490024888a577090502473044022015499379de4604e2913f21aeeccbee37a0df87d93e92f8efb6f1b8dd2e1a873d02206c2df963eb325445cf06faf7727abfec2d8827887c9999cc8ba610dcacdec85b012103774643414e3be07f6a3ab30088230cd05aa568050cee51261fafee151bd5461a0247304402205d4c9a17a9398cc4c9c702dad537500d6f47b2301a8b68f587dd2fed8427cb5702204f4a190506797350dc36eef59909d94564ffde11b6b56dc42ca261508cc7d2e201210282ecbea7fac91069da2ec27c6dd577d0101a9e5473fe5b65937243738c49c3ba0247304402205efdc28384e99b5017933756f929f08a468e097f527687c4abb986b30a8e0a0102205b540e11d78543cd8173eee80cd06f1586cfcf5cf77fb27e112053d0dba8f69f012102a28affd6c1de0df49e44d3ab263ee5db6fca7974296e04e467efc6bc82fcdd9e0247304402202a98117723e9d1a79867aa916d8c4cb05aeeebac4832c6df87e03b4323726b1c022060e1cb07dc956d451314c09fd20d82faa7aa03035b355db0e937b4c5b70cdd3f012102770ad5bdd5bff0a8ecd400c707cb57a844528f470290668dfd44cbcf240f003d0247304402204f62e5cabd2b4541ff5d454799598e60fcccdd505e2e93dcf950392aa3fff62c022058fdfe201b05de2dc63f4e42b47b854385c09f6569d7590405687617b2492523012103035ae9c7dd349a401c7fe364e7ffa559f82bfbe923de4e734500505ca4c6b4c40247304402203ef3c983419c5c586ac67448f981d8eef13883945bc79459598d8c5544d336be02202b2ca6d6274a8c65aace1392aa6147ab25fa2ed2a8c6d574c42571c4b2e23a660121022020174ca5c20783c8fe7c6947219f592ee89b08cc36da1ca31aae3f15ad241d02473044022054bf693104512739163a607f7af0154e23b8ae74efa6cc9bbf61eac85951ceff02207304f85d081f4a63931a5b5d1dfb7618caa61c7d9726fe1cd60716fb4026b3a101210364d9e2c1ceafee63d7b86ef389dcb466e739a0ccf539bf80853e68bb9f18a3230247304402205bc4874b18908961738126b53c7f09a485f87a5d05527b69af09834c7c7671890220150ad477380469ac8c9c9a20d03663452645b0c91b7331dd1d4dc280dcbe137101210256ab1e35c38726b6a6d324e6f6e71b7af2257a519c646b7c9f28a69f336ab49f02473044022006434266d471b2095e9f95c908d364fca607255f2de37b2d9f21358620f613c40220494201e188575e7aafd6a123a27a882dcc67395369e20e72ff1395560e10affa0121025b8612354eb2df11e133174b776a3c5d31c4f7ac975e725704c2416ed0453c180247304402201838bc0885a66580e7d29ec1e7f67ef8fb5750db3f146918958eef269935fc3c022019112b7bf2e7df9db7dc2e38d4e4010bdc73b9142fbd59563037f4da6c4c08f101210271bc7f52a1e41cce671b5606793242163415e41a9b0d2291bd6b36f7e46bf3800247304402203fe574777a34186e701b625276763977c846485b9b7f5d44f12ebdf5d3cf39ea0220549a1efe67690734ef8245bc6034344ee2fff739815ee2a4eae393d216db655a012102b89b9e9441ce167d82400df21a2e413a0027784b71696424d3ae226c493b60020247304402202cf3c3b53c4e8491bd4a31e03db35b277a473466f380a141da6425da78235abb02204060e89be5b9ddfd2d9dac6cc10bf111ce02fb66cef19702fba47b17b3c3a52c01210271d3ae4548b7a30f6dadc7be3a08dc2f1dc5bca8b4277bfbaab03c1adec372290247304402200bd58487f4b205b6f67786bc584a9410de3c535817eb887cd9ef728df111ca7402203024b464b7076080395ee91db87abd85d362c3d8950143a0110c44b7c94d3671012103aa2895338190d0be5fa5d8f25d182858bada198266ab1f698dbeb7c0a22c2fc30247304402206abcc7c3763c72fba2c53c436d2cc789c474a6815340264173194918c139e6f70220760d1070521393186d1b2070fcf6d26f96e89a49762f92f7aa3cff8f7c0cd958012102602a4d2e4f767eca7bf789b28addbcca8f33688eab166b8ac631f6e60e528ca802473044022038b5b789f276f9471a7c05b173797609b5d69ccd384a2378c07140f1ef3aa45b022062d638567cf97c27f67e2af38374148800302708b73b31b4e80c5162ba859901012102e6ea54e4335a05ae2e28e14aa9dc7569994e07c5bfa18ef3f8b70a3f456d5e80024730440220777c1dd3c7b074c03afdbc1384352d6256c4e998a74ac3d649f9478f364ae7cc0220247df44ee84bf011bbb4ce3bad0ef84afe451cd2bb818fa4867c6d7468032f17012102125df27fdfe49ba51f792a17de2e12a0326abfed3c54bd2547aba8dd63f1cc7202473044022033e32abd1b6f0832a876d57fa57908a4e81df10cb3b3d2c9b439a786a18eff9f0220629f6ee345af9c190270e899e90390470bcc0dee73de6d8a84bdf4ccff753ce0012102f4fe7a5bd7c67a92e6077fe9182ca9ee2e24097d3c6f8d8c2c846f9ccdfac90202473044022029ce63b61fc359d28a455bbfa953c3212b52b7ed77092a5ab597ddc1d0b48ffe022016c4d467dc273acc6fb32414392e31bc3d5589804a6a419edcb32e609f813d530121024bd11e01fa7bfb8975d280b189ee7906992501ed391af981ba2819bce83c79270247304402204f5e66ac18833548912abced93c6f31c950cd9303b85625769be275347a81f0c02205113308e7f7cc2912e98687e7eb47392eb0003c9ee848b42a5082489c2601df70121032ac8834127be17ba878dccc3defd310ef7d794dbe8814717d598cb95be4a850402473044022002ab75f94a376378205f8cd46ecb548e3e24791f2f2d5b58e706ed5c9bcfb25302200f58c053979e678abe63a0da1f67f908c902079aef1f0a1cfe6ae340f029182d012103008c2d6e3a99e6c8e7d2681cddf859de61d493b01ddf880d592dbd6c5a59614d0247304402204309c0728cedfd13cc0fe5e8db0493097ac7f74958fbd3bc1ad0fedeb365f111022035e9674f4f453dec8b7cb3b1ae6e149b8d695e3f1be258d2949d03787455dbfb0121034ccf99051fcff75091df3ecf596a2a142e14e57150357cf94f93494f5746d8610247304402204996339ec24993ef07783d89f96e6eb3d839e957be7721d2250e3ab89e1912d402203ebb4e468edb0cc629840039b78a091f81bba4d0cff33e82c4384583219a6663012102909b1419e58a815389901e9278664c07b8e94f617fc4e134436927b2c8f728ae0247304402204878ae8ddd9f2bc7dea6abf3274a7585c15ad0a0981d42099c7b94bd9898807402205f9d81b8d8a367a48478d1fb1b084cc00dd2602b1da378d659df9d5816f5e06a012102e3561bd8b695ac230b0be70fd72f28812cfac08ce8fa50bb5b3746175c22779802473044022036ef68579605303074915b6d5d6b2e1bbfaf7c0853cec5757c510574e5031c0802207dfafbb5b4f194a99c5f3c783a68964cccef1ef7863269388c19d518a9cbf15a01210389674898d2c64e5a073bd4b2898295b0c6fc9b08c352b898422bd24659eb819002473044022064cf58e43dc5989b46b3116bbb09b6044aa03010e2ddc55992c7550671b39ac802200e77b88fdee3bab82bec1bcef75018c4cc96a058f934e251b95a260042fa87530121037165af8d2124ca51c1b5cdb4d084a36509179a4e79571d3e09ed1f1f36195a65024730440220700225138ca27034ab477a9b38642af38a58cc4867654c48877c045aa40e945802206e4f60f387138386ca8813e7f33d02a129f3d0e22f8ca1ef4346253b29447a530121033a817c13eeda0ebb3e8ce55627015c8a9cb38f6fdc5703d77a661b30363e8d2d0247304402200c3afd9e07a502a096f6cf41b1ac26b3be58565b1f056627cccb7a4ebd20dd8202203c1a7d19e28031c829b35cd0c9a826a68a6c8b3a249f243d7b2ad650a2b6514801210296b983a63f7c37af1b6908acf18f8ffd73afe31ccb4591c27a9ec04dbecf5ba50247304402201599613d7f444fe78013607eea5feadb0f33f12d43567f4d4a294c64c2eb0071022016d410bab78293d06f173fb73e30654d2f95840b27d30deca46021313fcc23f5012102d4825f1f9d8c8610414223bac6778ed288cc5a303a36ced0d24200cb656638450247304402205e012cbce495e1851774109939320d8ac83d152f6a980e2b1c7799382389c0af022018bdf4dec78b5aca03f21243b49ef52ae84ff4074fa708b6a9557a2708f51fab012102024451aa3375ead00676a43d0c14204babac6480a5337d754f5d625cc76550c002473044022043040282c943037e4f7499f0a8a0d159174bdfb6bb1f0b879065b8a6945bb469022001da29afece17419ad668595a3f6c6b1b8f0450bf062f3b5f6098e7baeb6f4be012103f8fab9f285ab8486f71677066c33149696dac9fbac6f02bcb45cf6993f5c153502473044022071d1ce22c8ca1ec72776f2e9126403c147e6dd2c7dec6f62319af7e81bf2dcf5022034cd15cba6999c7998addfc71bb682c1bdabed1d62dcd5755aa6fe20852d8c87012102f2cb6a64eb40f093b616d6025e53eff480e7bb84f64d4bfbd428b0be7e85c30d0247304402204dcaf740f58b5c33f774688a147224c7c79ab17e52b46650c65cd29459ad6707022016687409287d811a2df752af30b455d8c8f9c082efee8f65e6070413a483194a012103871e2e091008c7fc8da7461d56cc9209792a2c2e9d1be2cd1581f6b4b1f1be4d0247304402204858ab664b8db5f6136cc5c055ec0840a219d4988a84e949155d9e368a64eadd0220652c0303de4a2a92b141fde3a537c11046c98c4055694da39242854560265bcb012102cf55113a8baa991c9043e7b51fd505c1afa7c4da5851fc6e9ada79868c30cbfb02473044022032d86ef3867e3afd5f65a1fb96f8732af6e00ac17b2e530f061132f22d3b365602200dc383412841849b4f850dae15e8d991427de4be651341f32daf6c4c35247dcd01210305a69a7d559ba1f91a2b91ec4158e4f1e2efe864ec8f9342e6a0a4b2a0f88aae02473044022078f60889f91cbddc51608ef727a6ecce32f59c15a322a2c7774bebe6ff08dc0e02206a67a1295616c880e66163a587622ac9ea7f6f86f74ce932eb6f0ba00f302e060121020286f06808a159e0c24fe9147cc1ce6769c594d74d6476c2d5abcfeaf884d53602473044022052dbf11294ada4b2b0f37a4c611e3f2b5dfc9e80aaf8035774e9b38447c41ea8022041a9c48137a6d8f6072372478599a6bfb849d42016637ca8932b32ac1daebe78012103dd544b9db77da7cfa671dd0a6d539a8eddb8c352479336809701a450b6785036024730440220039e3c4d3a5a1c11bfa09878b6a344ec4e6bc62cc3eec6f19aaa5e936a9cd237022057496476cbb473c2e9aff6ec6c72d5b46fce015d541f88c4f337663b9ce56a85012103a8e20276ad8cacaf6a02b2054aa56141e73e3951a0d0ab7b046b235906ed466a0247304402205cfedef757d2d39be06dd0707675d65ee88ac0e5037c7e0667123d6be993ea2d022026a800dbe25f98685ebc504b0435cef99e06f914679ce927348e4c17cc85a1840121021542d7ec53cac388cef60788ed39da4d9e2a3492a81432107ac1b84deef53f4e02473044022036631397317a87b786fb45ecff7a2919c35b90db7290f12ac34997427492191f022043fd0559c11af00388bda59301066d297418a74ae90179c28bbb2e4569fd914e0121031f6600c8b1d6a9ac3a536b954a8367e96c28c379a6f43df5e22289e228761447024730440220030a6e87bef8bcf9329bae6644ed4fa3b5e95bef1e34245367e9330a6906a3d00220043daf2430b6487eacb08c4bb713486628345f3fc4844a47ff9c5fc78a150a60012103c537d3f7211b25c055b410f32dd90496218df5032682655793e40f197c5532720247304402202a77ab80bc2956321a8c0022fb7c63db5cd2424acc224aced2d7d0ddb595cced022023008b2b461d507c8a7b9ce0ff284ff263a495f3d6bb873cb759ade4e531b52b012103078cc114c442ad435fb5d464f5b788ae4e048784e6d640c75af2651ef6d71e7502473044022001d76a5c166db083dde0f6dd5bcdb26911a0472b9153a9d554b63a8241ee9022022048b4ebaf661666ad25bd874db34e22a057395c5a9038feab786f7bac1a6e387f0121034ec5235fb47395ba2b9f285e40257b45357067a3c750be26d5d3e433ad92296302473044022002536f7e895efe6b2de8928e747dd36cc0536e0b22b9492df8ae53586c5c0b8e02204648d71252c80217f94b9e2ed9f4765627a4f0ba62ec4185a20b24de70a4054d012103cd03a68f18770ce2387ca3dd074ea756e8040302c8b99b9597eb4e75a946f6ab0247304402207cfbb96188c2ecd3a79a75325e64e73fb9834264ef711811996f4ae5406846d602203f6a1eec899d7a521d27f4d52e8bec72a720b3b8a69440f0546c342546b2ad5a012102733dfcfcff254f352640868c5719655e977abf4e92a2ba3fc1acd3b31578ca7d024730440220121a8f883bb2a0be5ff9dee869b56f71d3e4fdf9cd732c2b7e3461ddb9fab0c902202d061c83fc6ffc3a4504544e78109b8a22526f4c3b9d7f6b2bca49df17a2e8ce0121031824cb62ba37b05e7681ea84fb3fcba90cfa90f0b80dbb370bdff2b5fb519db502473044022067ee43f8643d522d570119f78ee8c1d6b63f7550a98b6af4c4464b687a56b2ff02206e4a1746469f37fb26d0b87d96bfd7ce46fa1ed32366c0f6471332e8a7b08cf1012102181f314ee73be2dd5feb3550f25869c1a198502edf5454a9ae6087a8d002405f0247304402203095f79224c623fa389a844c9ba8c54cbb5c391cd5498d6f5b438227e49f44080220767d91452f55eececd3113019f6df362f2a828c445392a70b797dd30c7ae344f0121025b00e200d065be057a6641129666c38b269dd2ce1cd0ed269e1f436fa3acc87f0247304402205d2fc244b2f4a29b7a2a4e95e1b8f6b3d61d7a054de68570ce4685888ff8f88a02202400de88a460424cdda23d232548cf5384baac6c60172e8b55abb14ca19970d3012103822900b6c6a2e9558ce02a69803b585dc0c4bab879f91d9ab97dd1c413faf7b10247304402207d0af7734d79bf9929a5c5edbce516930f4496c68c86061ffb056f9446311d520220581f10dd722dd3711878a996b198f90d269477d363e3eb90e8597cd0397b4f7301210393b835860bbc7bb42e527babfa33139e53bbd094a2dbfdf00385735a2b06e40e0247304402204f8a0c847959229e55c21aff57e1595667529d2c97871eac9c2c12f53e1ceee902204a519e758891c44803a5520fcc43cb40a6d1acf58a5551b8c30987344c4136c5012103b58db4c8b2be3a6efbe0eb179cb33af0a548b53c86d61e2d1d8046e47c525b790247304402204ce91045ff32882f94793d6f45e3217fa2f2db7be213601c474bc08f450ff2f2022079086e8eb7f2297c8ebfed1fcddbdaa4c8f845e825afdb62086583e520ce539f012103f8b67a97873429ea614df8b6b30259a13444b9d4849c9fd5165b719c71088d1202473044022017c263abb2435b27bf1d2f7f8664acbb14f6b9a92f773d4d844ad0b223e982b0022048f516ea2ebd07db2a66167567a0bbd1408d50a79492879db1cc02b1ecca05eb012103c146f3c41f9e038b4359b1c5d5e95991055ceb336348a396c3e81d0527f8551d0247304402203d76d08dbc61d5a26f1365ab0897695dd73f009bc7d9e54ca4a56454f8787a5802203a349d218f68ac1d9b73106269562ccf035ecb70301ea65caf1c347aedaef4f8012103569cfaa7a0c97dad26a622b4502aca88cfe540a74ae19a61a33ae9889b011cff02473044022055a2787f28acced3592f7cb091e1ff5eacea3d6482bffd2f8c497c5da1118ce50220604a22012005695f308ceadb23ca616df7de819e0cc0b9bbcaa18581cff0c41e012102945e33c21786d1001530af5555c893f2c7b1e5e2dd36d9d035bc5ca8dfed286b02473044022004b9d5378cdc2cb65cf69f8ad6ef4e104a17c9a2a1b280b1220bc4e24064b6250220708792c93e30ca451de3996f899dab74c70fb1bed8cb327ac49ecfd72d9fcabc012103a447a1b20c211f616c0b8db0a5281dc68aa3745df2db1d00f2558c9b684ccfc000000000020000000001010b19f6982a943ee9e78e398f830a802ea6f82bb4ba987f9360da15a9bdf737270100000000fdffffff039e0a5400000000001600142409b2d3158306a9bafe5b03981edbfc40d4a4fdd0f608000000000017a91489c38db38e0eb42e7b0323ac4f6c050fc6603d1a87bfbb12000000000017a914f5addb2751f101415ec2d42afb94926afd5c920c870247304402205512f7abc72a1d9fd0d551c4064498358e9c4554b601d984df51a03d143a561f022056030255de06ff0a3d89d19f358df5d6909af5818f0107e89be6d541b003178d01210356bdf3a46d4464602b5a8d18128f5b665a481e89853dfe0c33b72ecad7259fe847a00a0001000000000101849178b2b2d3ac5ae6fbdf24064c30c22b6703d2a3e64756dfc27dce3d7270530200000017160014c1806b71076f09c26108e2fb6fe6a6026f1d24caffffffff0195b812000000000017a91464733e0caf2f8a6ac1b6a4c7faf63565594c46788702473044022051c57230ca0f59498bec8cbff3bb1fb3bcb34e0ca1ec418d52b0086871a95a50022063a578028120a92e7ed75891b8b4e1741d2a1c1aaadf28f25ac2d233657405b8012102629dd05f9740c5b359a9dc698fa473ce5232f009bf18940f5904e72cdce7ccf50000000001000000000104d3ea0d572506aeb862c4515978a7c43345d9f8aa1741f31c1fb91d67ebf2b2361c00000000fffffffff450a399fb30268cf2a1417f94b18be05200eff70bd9fedd7f04f0193b85705e0d00000000fffffffff1fe961180d2ec7bf4e2414a095ef41c78d06897aa5e6f51878613f320a113632200000000ffffffff349c5f0c078f1db474a99d0147ec19889698cff068b1c0f09886bae3c446137a2600000000ffffffff01180f0e000000000016001450a0cf214c7b9fc63be612c748659530893168690247304402205b3bfc7635a05326416370945017510f26712d9687d92baf3f1bd09cca5b469a022023ffd02f12ca458f0a21d966fbc643600fb9e976f2490f5c18a3ba94ab2a8d000121026f9d39cc16cad955403094a4a8e5c50bf4973f8485c1e57f1d5b8673b720ee0f024730440220327e12da52096c2a6ad2ced85c97994d49fc2206451ccf4a8f198aeeaa0c9ed902207f03ac93258a48caba275e31f91bb926599f629919cdd782a029174f3dc5b9800121028f9d0e373810d1bc851f51744667545a9c9a7c8170f88f007b67b028286193ea0247304402202ad8d65b076a034a9829c7459f03ec8a43b82b8e4fb14e23fcb469ed484df15202200db094c105a0071a22d1ad9f124524cdcb1769aa79c6160ceccd91c1157e1b810121039a62df1dea3a754cdfb297e0f25144f40703624b52ba5b956cf074697f3c3d4b02473044022039d18660f88a04b5b8427ad9b3b378ce2ad79d15f3cc3a0a2aff0346910d07ec02207f15d40366e5254d0f872d432d2d56f7899c5d4a5e83a061e4f6a1713029d3ee012102c97f374dcd57415f3e71994b5f52f4e9039eeb2eb0c57491846325c559425cbc0000000002000000000104347ba4e6751df7f5a4c6d9e91b51551a6b49c128f8112af94b7640091871e9650000000000fdffffff1b5fb81b90404f4168ccfdbd159c2732457eebee5c865135257f7168c8a01d770900000000fdffffffeb34a7d1edaa197decd78bc0b47b91888e0f0254fee1b0d9e441e3aa6f4f62900a00000000fdffffffb7b37119ca063f883da8ecb862386ffbf8abe88bff97bfc12f2f0c1129196e942800000000fdffffff016f3b17000000000017a91471942aaf5ae4954b5b65e7d0fcf4dde6f04a0ab2870247304402204889a8125634e2372fad6814de4a0abda99646f84b7d52d65dc2fd7e276751c902206ad512f4bc2016805a49f45bfdcdeb19bcdc74f208d98a04d13e369e6846a11b012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d370247304402207826fe279d5f1c44327ce4439840c90bdaa144c1c5752ba117dbd4e278f1a8cb022051b85adc3666ed9dcdc18b37f9a961470adb9ef83a9902fc50361263034eff25012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d370247304402201898bd091c08fb787c87b9f5e8bf276b8d13b52e5f22df36a9a136f29641158a022067737429c3d0f566d491e3a3699deaab2d8f7b0608587a5aade78dc9a5546666012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d37024730440220106744044b342b4ae3a9bed1d55b9f104c8e5a0271ad627d84006d3df19c3130022030936c8aa845c2ab75aecca7833ff1d495a60e67344737c6f8ce8585334acd7b012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d3748a00a00010000000001049659f410fe6e30af72658700baed8e9db3d5eba24231e797b20fc8d6c76752d69309000000fbffffffe172b6847b0bc16deee77cf3bb383de6e3522f3306aa7cf448aefa31eb3bbba3f104000000fcffffff68f97ced4f2e695716c58cc3674d9f0e7fc15d5472b565b33bf51d22d30e825a2906000000fdffffff44516db14fe96bf3a2565d2c7b7a598928737f4e067d880619e9b0b7ce8c0f9ad701000000feffffff01400b00000000000017a914c82adb7141a87993722eb077c583fb64b26e2f838702473044022046c56a3df5d35ca298eabb753a9dc6cd2cf9ba7373dae678ba9db3b0a3ca9dc00220326a5bc206ab46ee09f26c73569524fff1c0eb8e95703ee757b5b2e467176b18012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b02483045022100b5c0ff9ed5dafdc71bb818ce4ad7b50ef5e570f592c761e726f993051f898dba02203a9c47df842bf8fd6a98f1049d964012a4f89053cf27dcefae05d7ca039040eb012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b0247304402203feb1fdc57e187740ecca8150f90cb733364d6dc503bde996233b602d7e83efb02201fd0b1cbc2f2368b1abe6897810c46e68a2e77e7d9552bca140ddc6716477e3f012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b02473044022049be7a670a1d34b2a4055813b095a2ec9164f00da5731ff032829245c7efbcb2022036f2f37aab3d99a682715c4f7e34cca9d3f1c8c378458f082e7e0b57f6224a3c012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b000000000100000000010358295982efc3c356724b96df28bc39ad4ed2c9d590c12edf4eee55cffe6e6f1e04000000171600147019990913864aae6f3051e513fe0c5ad4a97ce3ffffffff0212eb9497d023f52929afbed9b7ef25240a8ce3cf488389a238caf87c7f7f7e0300000017160014056a21604fab499f7903157c7dd529403d500aedffffffff0212eb9497d023f52929afbed9b7ef25240a8ce3cf488389a238caf87c7f7f7e00000000171600146966fb2300d1ba7a59977f0a14813306559443c9ffffffff01c66a8c010000000017a914599ed9c78a682ae7bed6aea01bb6627a71ba272d8702483045022100d990012c7d900b9779027baaae19b9cfb5d1ec42dbb5f7353130df08817c046a022057ff10c111e0fe4fe1e34681cf24979786142a3764a8db377039330999c4252a0121021225d1592bdf554a14efc8345e8a5a29c18624cd3c256c7647a86e7f7c811e0f02483045022100b76b6f1b493045420033dad1ec08b5926372d1c3ad74b9cfafe05c55ae6295900220224a8c5dee4b80e7745308ca50338f73e40eb7ccd725910e0e2c0bc92a1a797e0121023ae961af187ecbfa499779daac54f80abff81759bb4707f9bee2dbdd6fb89c4f02483045022100eb6fec46f71bab6f02fa8b2ac6643170d6ab1162540d8f01bcb4a74db3c7996c02201c9a31a56e4e1fe09647706d4b65b65998aa0a88c95ac6e6681165d21a1f6107012103b4648eb1e4cedf4d4892e65f7176462de95f6721b00f5b19066344d1e271eabb00000000010000000001043dcd4b450e46e61c24ec098bc5b222b729c9b11c9a705f2df112b9d18e5ac3c40000000000000000002515a78f3d429c5407b04009af58332cbfbfdf6ee6993fde816f9e0d207cbff8010000000000000000c917bfea138884c0d27c363d234c5a08c088bf36f02780690a2567f15ef166d8010000000000000000bd094b631c1d53293e8417acb15e013a0a9de8969e55dcc773555a3e934093880100000000000000000168591f00000000001976a914bf7735e0e217dfd65b92d19e85642ac2448ca97a88ac0247304402203bc99597d47092a89b6c2b53c4fe59e0af4c7c3668e0f96726f354d87ae9fd81022005b36c17e6ac75486eb8c2b9b4c387f75190d9a2f9c5b179f366a4a65be2e9930121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff02483045022100a9bd5dbbed4c5b359074351d80cb321c30bd572ae12341bdc8635da256f72dc602204c8d1e4d5d32cef0d1155b9b81c3e1cc9980ae0ef96b2aa45cfd0341e8840aa90121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff024730440220371c5d3032829deb70265352b4b39e2344fac9039ff5f208faf04459f077838002204f1c889343e0cf9e79dc7000612f9627f751f04db7f7e8c35ca093211d0b8f1c0121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff02483045022100d6792ccd799b210808c5562ea4cdb61eba164fc8ab356610b13c05ad0d62e0690220281603dba47bfae1e3e3f313d5038d8f5ac458e0f584ec226b1854958428ee0c0121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff0000000001000000000104a7fdee2da6120adc69a34e3c741685e3539f0ca6a6122baec7745245041eccb10000000000ffffffffe0f2ef011a9194b0c66830203a53d003b72f544f69fca7f45d3c7d5f8fc85d1e0000000000ffffffffee262b18f8c0a063c44aef124dc7204cb6cdb5823ca4aa9d6fcb3f3e33fca4e80000000000ffffffff1567434bc7383e66b78de5b0a0d63f9438ba3c5a2db4e86fca024277cd9d62bf0000000000ffffffff0137af3500000000001976a914815decccc80f8212b79347852acb5f0290490a6a88ac02483045022100e3d8ae6fe65472c4233fe2fe021dc70adbd4a87abffceb70e52e46051fa4440302201f97657f98d2999e2ec11edfca4378d75335da9b1543574095bff3f465b2aa3b0121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c302483045022100c8cbc9aaf7b86651cd0c49ade2ab49cb4461583c3203e20cbc23783f49fe0a1e02201810fa07e24d8132bf22ff8b4ef81cd290d8c10c20d317be6cac494d23d52b420121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c302483045022100a0c85cd83e5814f94aef92938f470dfdd0204a876747757674562c0734f1eea802202fe278353de8586d6327e92262a14b5194159cff3b58581b0a6ee0a110dc16c50121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c3024830450221008d65cbfb3ccf1e528b46ee6fed47f2f614ee9684b71a69ac2724ff219c38b0ba02207a51f00a027d4aa387ff4b60117343bac41c8cbb14267b03ee142bfe23e43f590121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c30000000001000000024760555502737a522b7a3f6f47b0f2ae02abbfaa623b3895bc9199b3d592ba01000000006b48304502210083fe1202d32ee20982515198adf570a1f163452619a1ed20b4f2270a159a60cc022032357c965602b3819e13e8fef1be1cb2de41ace2105be1b2c02fe721be82e35201210288a4ed5db17290b5db084729e8c41a4d92ee64e2dabffe67a634904f6718fa98fffffffffa07c0fd72acf3993e6383bc6c6edf75d9e5b11693c6873d5ee9d619087022c8010000006a47304402203b9d56c20ac66114d86b7890c83d611fef7641064d533b6b21026a5a7371f54502204db83300ebcca8e9cacc55999e9f2e357c785f13fb532d403b661dbd4b08c104012103d7ab5decdcaa23da51dbca65a20f2a92e52fd95504b249193d77bbf29b39f136ffffffff022b0a0400000000001976a914cd6901b9b522233f29f7e508247a6b7478f7001b88acc0d8a700000000001600142e84c9c2217221c801dc77ca1cad01c36d1d1af100000000010000000001014a1e0005d917b6dda0e2ae15cc3b249aaf1892aafe842bb6bc0a4f33bcec5cd90100000000f0ffffff0474bc1c000000000017a914806e10c4e32b502508c59e661b081b74a3ee7d8487b481840000000000160014cac2c353c58c732703d7a59d41375df28a9ae67800328d00000000001600148de288389517f84ee9b7273e378f61dc0262c1ceb1184d0400000000160014f1285a12ba2e219a945ff745b9d145d8a6f1ff6d02483045022100b6e2fb69a083223b9fc47d7cb1b0cc770c82c3fe0e4a0533d73a9bc94f7ed2040220571736d7bdc0fe5d99a12dd19d797b04a3e82252f197122c99f7bf62e31a5db801210223fa3da3e0bd0ab2f52faa25b2eee31cbffe24aeb3dd61ee2bc7be2a6cd96b3200000000010000000001013a9e06b5fb84d097b69a91fd700ac721842a0d2763725b3776e6fa42290133770200000000f0ffffff02b4ed2f000000000017a91431251f39fb65eea11aa79bf4e1386cf12ee1101087f7405d0000000000160014d86bcbb4a096c8712f7456947c4a2af5331cf37902483045022100ab4857b950c06aa745421532092265e00dde15003c28d131973bac28c95bde6402203a4f2be7999ccb6ea2dbfce8ebcd7264194d02a1fb8f62c8d5057cf8d958bae4012103a2c276d93418b2092f837da8e3cfc90082d2434690dbd26c3c2c2ed9b9a6665f0000000001000000000101453085912daf2eff1f23c604b3d0ef0323ee78230d2b2e924b059db7f563d5430100000000f0ffffff025c9337000000000017a914ee89588f998a90e7047d760fa0d041f24275237c8746aa250000000000160014c28b0d7aa6e0d45a805a02f9f684fb66297e5cc102463043021f4da886074cb082b42fa457cc51a3f1c9ad7c93a00f8d08a1c76094f93c32190220220ed627875fbf638c398665c063af81a2723e8747d5f79b7430bdc27ddd4abe012103ddba43b078461bbbe3a8deaae57142656987520447cf049019b53608bdf7b3ce000000000100000000010929358a3fd8726710620b40b1a52010c47bd54edea9476062813320f7f9d151a00000000000000000009df2d48ea3691e107964853209d9d9f80a88f70b5b3e815c14ba177244671f89000000000000000000652c650d4919d93c3960bd8e83d330d8df5ed2bbbfb0e3d62c9c9df0e9e5519800000000000000000013ef5b7850726903f80b4f76199c82eb38829b7592e854de2c3b2d956f46a3600000000000000000000faa0e6ee1c046c28b98a31abd2a8cdc69bd16627cdc88457cd1ee62e7d9b74a000000000000000000325ad9689cde42feeb7f1facf65a3bd20a662a7ec63fc2e625efe71ad01b56cd000000000000000000df1c43eb7a9f9f17584c91554f286fd6037c344590c00676e72acd1442c714750000000000000000008f964299cb231b9e2739254bb661a313ff9179edc8b99db93948b1cff91f2460000000000000000000b879d5d76e53bcdcb3735dd5c74e01f53933a1c9e5f7ed431fe0a5d92388501d000000000000000000018ccc50030000000017a91444241a71dd156900b5e4d7cd31447e826ddb10058702483045022100e8210817802d843727c9bf2c7ea0abc573c5f0c23aaf2568c39b52845ac4e7ba022024a0cdd50ca25ca50231e674375f3e3dbb8959cf9fb7a8ecee064293fb0886eb012103e05e6e384d1b046d579e2ef7798231ac8d05d8a6377a3fe84c0cdffa7ef0aa6202483045022100b97c33a4da2f27b7a7903c730fa5f8328d1c1c6f31bf0fb2f8bb001f38fad07502203811eebd453adbed28b4a05941abc6acdabc81e2a2277be6f20c336872e96ef1012103520024b9b8df69cd33312b9bbba9e0f033e999b2837e35690a9255b991a4301b0247304402207ceac984aa59474444cfef693926d5bea0b685af5d8af1273fa47f125361e79602201bbfefd513bffc6291083e333a8f73c553a540244a42ead307dddf09fd6b399d0121035e876ba3eff556162fa2ccf79aa00f24b462337aba436e9b9b81be341c5afbcd02483045022100a04b2ef03e1385d96b7cfca1aacfe3fde4444dc68fa626ca0e1b4b1eb31d281f02203b6f37a6e085463ce69c5b6c54a261ba59f11d3473c16a5ad63605f3f4ef40a90121028820b39e8b834cfca3048e8feeb014c94c2ea3675881980e5652d84732e3b7ca0248304502210087052d9b528014b733f67586021372f7a23557fbaf7d9a059e40147b18cc88b002204cb393f3ff820ca7b8ae481a4b30c05bb73950fa7c97f8a7653f54866ec0c9370121022d1210bd5a60520f8042e8febf377a4689b1e5c154956f2b776bfb06ff28d9ad02483045022100bb498c36f6a7f4b05065f47a097186d957a15b7767a976de2d76c8e7e29e8de80220373154c41d8c8ba6f2d18445233c76ef950379702cfafc91cd6c264e6821d737012103b558950de4d73e369715f8a324176d99415a8cbe562f5c06bd6f806379f6481a02473044022062bf65dc424f78e95106e466c72aae6f4e4755d77ddd5474bfba6dba9e77c4e902203c5507b73f641c24c33be53216340178db92d53dc3d3a7234727ad052cedacd2012102f64aac7aff25b693e2f5134869827f0c0ba53e1706f8a06fc3c5e9a84d7246390247304402203f6fee1ae384b923bf3eae736fc87b5ac486347a2d91867a02660b967e45040f022069aa8401f8213dab5b377f0e916a514fc37d62233b0641bd2e0e5e85c2869f08012103a8c9746dcf713f0833822c3aff8b5d603a4da2c1c71d57183e861653f1f722db02483045022100e31d8028c5c5443620277b9d66d45a9c23e80d46e93626df52e347ff4a1d7f740220590527c7168abd9e152a88128bdfb786be518ba564e00b04d2d3cadcdcf0e5400121021625e1a3fa092757b51c8fe4649bbff3b3dbae5564cbd33a7fe6c3b2e287061900000000020000000001019384b0447aab663fd693ddff7cfe1a93c32eac10f45406653cf070d052435a6300000000171600141560e87545047da8c0f3112d2ea9130d8c4b77c0fdffffff0275ab13000000000017a914cdfdae9b2a8b58329f0c9e32fa7e7ef85eebc59e87aff1ac050000000017a9146eb2ca7f97b8f417f8cfdcc8d82cd77aef825493870247304402201ebbd95e90fd79ae5e0507ceacd7b2015355cd86a720bdff982835d72a79b38902202c5d0d254e130287590286da157b98affffb191bb2d31ce90934360fff6b788701210265c34f49666f3652a68e075f8ed0e10dc3ca697e0cd5b1b9df10293ae29f625047a00a000200000000010138f1575bb0bc6fd7d848d10773e64933ce1393cb03d14107ec496b7f8666b1050100000017160014b87b851ab8f7ef5338993b1f79cd42deb64ecbbbfdffffff0298951500000000001600145f10c9de1bec6c7294cd6833836731bdf70c1b8b3f58970500000000160014d6adbef8b21a4b09e86bd2cc5b9c7fceb81f114802463043021f642e4edb74195aab588c3643782ffeef639a97e0f54a79f77efaec100329fc02205ec905f11edc2006287f773c7ec5dce4b1e2864be314c225ead8e59444bc6fe6012103e6b2844146c49b60cdf81a463ec8af6c60c3f483c9aa2cd91060081a0267346e47a00a000200000000010174c5114c78df15ca7032e7f19c2e06d47e62f50a1ab9b47e2e9eb136dde7107c0a00000000ffffffff01e62800000000000017a91432b0b564ecad298926e20e82dbf83f6e124f3778870248304502210086119d97bbf0e5060c747a5adf92b95e7fdd76644f288f49338a5f527dff36ec02204a0d880cef1937f7409b25101d41b78f619531ee8db2c65153e3302a0e015cb90121031121d89dcc1806c19b10fc40e5f8f7c14a43fee79808e66e181bd0518e3a8f1100000000020000000001026e660c15b71d914429562cf83da5eea6852ef0fa6222d0d532c13e3d964e92564a00000023220020ba369adb0163cc9cc7d74ccca765831fa3b90d8c8ea02da3eb52dbfa05539943fdffffffe7c1000195d7d7269069f130921d8df77234b3821f207b059575ebb8080db67a00000000232200208cb432f61f9943199bb5fd2e4414b3bc1164eebdbc4064405a12ef79fdfc64effdffffff02e044a3000000000017a914abe51129735699c6c573bd3e04125f04248709c6876c16eb000000000017a914beb3dfca8d44070faee0dc181ddb7a2184d4483b870347304402206ce1e3a620dd20b23d66018fb18955efe8917e5e823e9aec1ecfe31314a93f57022006f1c4da931a3e49deeb10ba1e9840572fe8a59d8696703eb6fc70b6d92b8f97014730440220041a6355bae0868b3d69e2c748a2ea15b4ac218f4ff6b6d0230ed45c0e393aaf02200cc5bc5001c63b162a926521cec96990da108f83d27e553a91c88c239286060a014e2102b046d463cc5ccf5fd981f3339259549704d2e2856173109c43a17fdeafc1c7eead210320d35950f54033ab8042ed34192752c8e95d81b3ce12dfc68f9884f9c2fa217aac73640380ca00b268034730440220791ca0e5e466494fffecfbca87429994a46ecbbd0a3aec73fcd9fb92a7f2b75002202e7c867208b38453f3ed0aa252abb572f3b8fa16b8cb9afa82e1b85a73f06e6b014730440220199f5edf2c0d2f4573ad70b8cdfc88a687269f9344d7263ca829af6296298fc70220259f4b53fc5b0d93ed4f5212735a563490fa7a3aa165fcc131f80f270d99f0f4014e2102979c979862d7b65122a23690aa65f57ef0a96b16599a2b530c99f0086f425f06ad2103ad88b4076b499160a2becaa2274bfa9f4dece8dd8403fcbe41c6c2cb054e7ba1ac73640380ca00b26848a00a00010000000001026688de06269b19c4384968c6e404cd7159872d8f338130b3a1d37f983d1127c70100000000f0ffffff9104ddc26ed24fab5257f345d6cb0663a7fa1b8524b32c832f9bad9085e95f1d0500000000f0ffffff02a689100000000000160014375257345224520e42c2b2451c92e3b800e3ae9a0b1a100000000000160014c23fa5ccecec0a828c54fbb463a67a66933ef60602473044022002bffca9067678dcccb1158dc47c83250492267261e58255d4851caa264610bc02204ac4677b14dd3fd510744d3d3c2bdd47fd7efafc97eecc81293b669caca84383012102f3ad45bbe99da6c07dcd4e287569adf3d2f998f615f873c8a7f01915b5c9c2e102483045022100dfa81d976a4bcda31a7acd834a8d5e2557ba7832a9dcf7b8fdd19733f5c508290220750df01ce6514065339ea2c5f5f51233099d568effd4c86b807e3d2d1dbb8a91012102a1d5fa5f43ed4d8c777a7060d72de4b075d2871fe271a9fcc0986326e563806700000000 \ No newline at end of file diff --git a/connectors/testmocks/addresswatcher_mock.go b/connectors/testmocks/addresswatcher_mock.go deleted file mode 100644 index 5bc03637..00000000 --- a/connectors/testmocks/addresswatcher_mock.go +++ /dev/null @@ -1,23 +0,0 @@ -package testmocks - -import ( - "github.com/btcsuite/btcd/btcutil" - "github.com/stretchr/testify/mock" -) - -type AddressWatcherMock struct { - mock.Mock -} - -func (a *AddressWatcherMock) OnNewConfirmation(txHash string, confirmations int64, amount btcutil.Amount) { - a.Called(txHash, confirmations, amount) -} - -func (a *AddressWatcherMock) OnExpire() { - a.Called() -} - -func (a *AddressWatcherMock) Done() <-chan struct{} { - args := a.Called() - return args.Get(0).(<-chan struct{}) -} diff --git a/connectors/testmocks/btcclient_mock.go b/connectors/testmocks/btcclient_mock.go deleted file mode 100644 index 34a1eba1..00000000 --- a/connectors/testmocks/btcclient_mock.go +++ /dev/null @@ -1,98 +0,0 @@ -package testmocks - -import ( - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/wire" - "github.com/stretchr/testify/mock" -) - -type BTCClientMock struct { - mock.Mock -} - -func (B *BTCClientMock) CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) { - return nil, nil -} - -func (B *BTCClientMock) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) { - return nil, false, nil -} - -func (B *BTCClientMock) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) { - return nil, nil -} - -func (B *BTCClientMock) SetTxFee(fee btcutil.Amount) error { - return nil -} - -func (B *BTCClientMock) LockUnspent(shouldUnlock bool, txToUnlock []*wire.OutPoint) error { - args := B.Called(shouldUnlock, txToUnlock) - return args.Error(0) -} - -func (B *BTCClientMock) ListUnspent() ([]btcjson.ListUnspentResult, error) { - args := B.Called() - return args.Get(0).([]btcjson.ListUnspentResult), args.Error(1) -} - -func (B *BTCClientMock) ListLockUnspent() ([]*wire.OutPoint, error) { - args := B.Called() - return args.Get(0).([]*wire.OutPoint), args.Error(1) -} - -func (B *BTCClientMock) GetTxOut(txHash *chainhash.Hash, index uint32, mempool bool) (*btcjson.GetTxOutResult, error) { - args := B.Called(txHash, index, mempool) - return args.Get(0).(*btcjson.GetTxOutResult), args.Error(1) -} - -func (B *BTCClientMock) SendToAddress(address btcutil.Address, amount btcutil.Amount) (*chainhash.Hash, error) { - args := B.Called(address, amount) - return args.Get(0).(*chainhash.Hash), args.Error(1) -} - -func (B *BTCClientMock) GetNetworkInfo() (*btcjson.GetNetworkInfoResult, error) { - args := B.Called() - return args.Get(0).(*btcjson.GetNetworkInfoResult), args.Error(1) -} - -func (B *BTCClientMock) ImportAddressRescan(address string, account string, rescan bool) error { - args := B.Called(address, account, rescan) - return args.Error(0) -} - -func (B *BTCClientMock) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) { - args := B.Called(txHash) - return args.Get(0).(*btcjson.GetTransactionResult), args.Error(1) -} - -func (B *BTCClientMock) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) { - B.Called(blockHash) - return new(btcjson.GetBlockVerboseResult), nil -} - -func (B *BTCClientMock) ListUnspentMinMaxAddresses(minConf, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) { - args := B.Called(minConf, maxConf, addrs) - return args.Get(0).([]btcjson.ListUnspentResult), args.Error(1) -} - -func (B *BTCClientMock) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) { - B.Called(blockHash) - return new(wire.MsgBlock), nil -} - -func (B *BTCClientMock) GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) { - B.Called(txHash) - return new(btcutil.Tx), nil -} - -func (B *BTCClientMock) Disconnect() { - B.Called() -} - -func (B *BTCClientMock) GetBalance(address string) (btcutil.Amount, error) { - args := B.Called(address) - return args.Get(0).(btcutil.Amount), args.Error(1) -} diff --git a/connectors/testmocks/rskclient_mock.go b/connectors/testmocks/rskclient_mock.go deleted file mode 100644 index 6c6c7f86..00000000 --- a/connectors/testmocks/rskclient_mock.go +++ /dev/null @@ -1,68 +0,0 @@ -package testmocks - -import ( - "context" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - gethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/mock" - "math/big" -) - -type RSKClientMock struct { - mock.Mock -} - -func (mock *RSKClientMock) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - args := mock.Called(ctx, account) - return uint64(args.Int(0)), args.Error(1) -} - -func (mock *RSKClientMock) SendTransaction(ctx context.Context, tx *gethTypes.Transaction) error { - args := mock.Called(ctx, tx) - return args.Error(0) -} - -func (mock *RSKClientMock) ChainID(ctx context.Context) (*big.Int, error) { - arg := mock.Called(ctx) - return arg.Get(0).(*big.Int), arg.Error(1) -} - -func (mock *RSKClientMock) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) { - args := mock.Called(ctx, msg) - return uint64(args.Int(0)), args.Error(1) -} - -func (mock *RSKClientMock) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - args := mock.Called(ctx) - return args.Get(0).(*big.Int), args.Error(1) -} - -func (mock *RSKClientMock) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { - args := mock.Called(ctx, account, blockNumber) - return args.Get(0).(*big.Int), args.Error(1) -} - -func (mock *RSKClientMock) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { - args := mock.Called(ctx, account, blockNumber) - return uint64(args.Int(0)), args.Error(1) -} - -func (mock *RSKClientMock) TransactionReceipt(ctx context.Context, txHash common.Hash) (*gethTypes.Receipt, error) { - args := mock.Called(ctx, txHash) - return args.Get(0).(*gethTypes.Receipt), args.Error(1) -} - -func (mock *RSKClientMock) BlockNumber(ctx context.Context) (uint64, error) { - args := mock.Called(ctx) - return uint64(args.Int(0)), args.Error(1) -} - -func (mock *RSKClientMock) Close() { - //dummy implementation for mock -} - -func (mock *RSKClientMock) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) { - args := mock.Called(ctx, account, blockNumber) - return args.Get(0).([]byte), args.Error(1) -} diff --git a/http/dto.go b/http/dto.go deleted file mode 100644 index ebeb9f4c..00000000 --- a/http/dto.go +++ /dev/null @@ -1,132 +0,0 @@ -package http - -import ( - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider/types" -) - -type ProviderDTO struct { - Id uint64 `json:"id" required:"" example:"1" description:"Provider id"` - Provider string `json:"provider" required:"" example:"0x0000000000000000000000000000000000000000" description:"Provider address"` - Name string `json:"name" required:"" example:"Default Pegin Provider" description:"Provider name"` - ApiBaseUrl string `json:"apiBaseUrl" required:"" example:"https://api.example.com" description:"Provider's LPS instance URL"` - Status bool `json:"status" required:"" example:"true" description:"Provider status"` - ProviderType string `json:"providerType" required:"" example:"pegin" description:"Provider Type"` -} - -func toProviderDTO(provider *bindings.LiquidityBridgeContractLiquidityProvider) *ProviderDTO { - return &ProviderDTO{ - Id: provider.Id.Uint64(), - Provider: provider.Provider.Hex(), - Name: provider.Name, - ApiBaseUrl: provider.ApiBaseUrl, - Status: provider.Status, - ProviderType: provider.ProviderType, - } -} -func toGlobalProvider(provider *bindings.LiquidityBridgeContractLiquidityProvider) *types.GlobalProvider { - return &types.GlobalProvider{ - Id: provider.Id.Uint64(), - Provider: provider.Provider.Hex(), - Name: provider.Name, - ApiBaseUrl: provider.ApiBaseUrl, - Status: provider.Status, - ProviderType: provider.ProviderType, - } -} - -type PeginQuoteDTO struct { - FedBTCAddr string `json:"fedBTCAddr" required:"" description:"The BTC address of the PowPeg"` - LBCAddr string `json:"lbcAddr" required:"" description:"The address of the LBC"` - LPRSKAddr string `json:"lpRSKAddr" required:"" description:"The RSK address of the LP"` - BTCRefundAddr string `json:"btcRefundAddr" required:"" description:"A User BTC refund address"` - RSKRefundAddr string `json:"rskRefundAddr" required:"" description:"A User RSK refund address"` - LPBTCAddr string `json:"lpBTCAddr" required:"" description:"The BTC address of the LP"` - CallFee uint64 `json:"callFee" required:"" description:"The fee charged by the LP"` - PenaltyFee uint64 `json:"penaltyFee" required:"" description:"The penalty fee that the LP pays if it fails to deliver the service"` - ContractAddr string `json:"contractAddr" required:"" description:"The destination address of the peg-in"` - Data string `json:"data" required:"" description:"The arguments to send in the call"` - GasLimit uint32 `json:"gasLimit,omitempty" required:"" description:"The gas limit"` - Nonce int64 `json:"nonce" required:"" description:"A nonce that uniquely identifies this quote"` - Value uint64 `json:"value" required:"" description:"The value to transfer in the call"` - AgreementTimestamp uint32 `json:"agreementTimestamp" required:"" description:"The timestamp of the agreement"` - TimeForDeposit uint32 `json:"timeForDeposit" required:"" description:"The time (in seconds) that the user has to achieve one confirmation on the BTC deposit"` - LpCallTime uint32 `json:"lpCallTime" required:"" description:"The time (in seconds) that the LP has to perform the call on behalf of the user after the deposit achieves the number of confirmations"` - Confirmations uint16 `json:"confirmations" required:"" description:"The number of confirmations that the LP requires before making the call"` - CallOnRegister bool `json:"callOnRegister" required:"" description:"A boolean value indicating whether the callForUser can be called on registerPegIn"` - GasFee uint64 `json:"gasFee" required:"" description:"Fee to pay for the gas of every call done during the pegin (call on behalf of the user and call to the dao fee collector)"` - ProductFeeAmount uint64 `json:"productFeeAmount" required:"" description:"The DAO Fee amount"` -} - -func toPeginQuote(quote *pegin.Quote) *PeginQuoteDTO { - return &PeginQuoteDTO{ - FedBTCAddr: quote.FedBTCAddr, - LBCAddr: quote.LBCAddr, - LPRSKAddr: quote.LPRSKAddr, - BTCRefundAddr: quote.BTCRefundAddr, - RSKRefundAddr: quote.RSKRefundAddr, - LPBTCAddr: quote.LPBTCAddr, - CallFee: quote.CallFee.Uint64(), - PenaltyFee: quote.PenaltyFee.Uint64(), - ContractAddr: quote.ContractAddr, - Data: quote.Data, - GasLimit: quote.GasLimit, - Nonce: quote.Nonce, - Value: quote.Value.Uint64(), - AgreementTimestamp: quote.AgreementTimestamp, - TimeForDeposit: quote.TimeForDeposit, - LpCallTime: quote.LpCallTime, - Confirmations: quote.Confirmations, - CallOnRegister: quote.CallOnRegister, - GasFee: quote.GasFee.Uint64(), - ProductFeeAmount: quote.ProductFeeAmount, - } -} - -type PegoutQuoteDTO struct { - LBCAddr string `json:"lbcAddress" required:"" validate:"required"` - LPRSKAddr string `json:"liquidityProviderRskAddress" required:"" validate:"required"` - BtcRefundAddr string `json:"btcRefundAddress" required:"" validate:"required"` - RSKRefundAddr string `json:"rskRefundAddress" required:"" validate:"required"` - LpBTCAddr string `json:"lpBtcAddr" required:"" validate:"required"` - CallFee uint64 `json:"callFee" required:"" validate:"required"` - PenaltyFee uint64 `json:"penaltyFee" required:"" validate:"required"` - Nonce int64 `json:"nonce" required:"" validate:"required"` - DepositAddr string `json:"depositAddr" required:"" validate:"required"` - Value uint64 `json:"value" required:"" validate:"required"` - AgreementTimestamp uint32 `json:"agreementTimestamp" required:"" validate:"required"` - DepositDateLimit uint32 `json:"depositDateLimit" required:"" validate:"required"` - DepositConfirmations uint16 `json:"depositConfirmations" required:"" validate:"required"` - TransferConfirmations uint16 `json:"transferConfirmations" required:"" validate:"required"` - TransferTime uint32 `json:"transferTime" required:"" validate:"required"` - ExpireDate uint32 `json:"expireDate" required:"" validate:"required"` - ExpireBlock uint32 `json:"expireBlocks" required:"" validate:"required"` - GasFee uint64 `json:"gasFee" required:"" description:"Fee to pay for the gas of every call done during the pegout (call on behalf of the user in Bitcoin network and call to the dao fee collector in Rootstock)"` - ProductFeeAmount uint64 `json:"productFeeAmount" required:"" description:"The DAO fee amount"` -} - -func toPegoutQuote(quote *pegout.Quote) *PegoutQuoteDTO { - return &PegoutQuoteDTO{ - LBCAddr: quote.LBCAddr, - LPRSKAddr: quote.LPRSKAddr, - BtcRefundAddr: quote.BtcRefundAddr, - RSKRefundAddr: quote.RSKRefundAddr, - LpBTCAddr: quote.LpBTCAddr, - CallFee: quote.CallFee.Uint64(), - PenaltyFee: quote.PenaltyFee, - Nonce: quote.Nonce, - DepositAddr: quote.DepositAddr, - Value: quote.Value.Uint64(), - AgreementTimestamp: quote.AgreementTimestamp, - DepositDateLimit: quote.DepositDateLimit, - DepositConfirmations: quote.DepositConfirmations, - TransferConfirmations: quote.TransferConfirmations, - TransferTime: quote.TransferTime, - ExpireDate: quote.ExpireDate, - ExpireBlock: quote.ExpireBlock, - GasFee: quote.GasFee.Uint64(), - ProductFeeAmount: quote.ProductFeeAmount, - } -} diff --git a/http/response.go b/http/response.go deleted file mode 100644 index 3775f349..00000000 --- a/http/response.go +++ /dev/null @@ -1,77 +0,0 @@ -package http - -import ( - "encoding/json" - log "github.com/sirupsen/logrus" - "net/http" - "time" -) - -type Data = interface{} -type Meta = interface{} -type Details = map[string]interface{} - -type Response struct { - Success bool `json:"success"` - Data Data `json:"data"` - Meta Meta `json:"meta"` -} - -func (r *Response) JsonMarshal() []byte { - j, err := json.Marshal(r) - - if err != nil { - return []byte(err.Error()) - } - - return j -} - -type ErrorBody struct { - //Code string `json:"code"` - Message string `json:"message"` - Details Details `json:"details"` - Timestamp int64 `json:"timestamp"` - Recoverable bool `json:"recoverable"` -} - -func NewBasicDetail(err error) *Details { - return &Details{"reason": err.Error()} -} - -func NewServerError(m string, d Details, r bool) *ErrorBody { - return &ErrorBody{ - Message: m, - Details: d, - Recoverable: r, - Timestamp: time.Now().Unix(), - } -} - -func ResponseError(w http.ResponseWriter, er *ErrorBody, code int) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(code) - enc := json.NewEncoder(w) - - err := enc.Encode(&er) - if err != nil { - log.Fatal("[response package] error encoding response: ", err.Error()) - http.Error(w, "internal server error", http.StatusInternalServerError) - } -} - -func JsonResponse(w http.ResponseWriter, statusCode int, body any) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(statusCode) - if body == nil { - return - } else if err := json.NewEncoder(w).Encode(body); err != nil { - customError := NewServerError(UnableToBuildResponse, make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } -} - -func createEmptyInterfaceMap() map[string]interface{} { - return make(map[string]interface{}) -} diff --git a/http/server.go b/http/server.go deleted file mode 100644 index bff74fe3..00000000 --- a/http/server.go +++ /dev/null @@ -1,2061 +0,0 @@ -package http - -import ( - "crypto/aes" - "crypto/cipher" - "crypto/ecdsa" - "crypto/rand" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/rsksmart/liquidity-provider-server/account" - "net/http" - "net/url" - "os" - "strconv" - - "io" - "math" - "math/big" - - "strings" - "sync" - "time" - - "github.com/btcsuite/btcd/btcutil" - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider-server/storage" - - "context" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/gorilla/handlers" - "github.com/gorilla/mux" - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" -) - -const ( - svcStatusOk = "ok" - svcStatusDegraded = "degraded" - svcStatusUnreachable = "unreachable" -) - -const quoteCleaningInterval = 1 * time.Hour -const quoteExpTimeThreshold = 5 * time.Minute -const PegoutDepositCheckInterval = 2 * time.Minute - -const BadRequestError = "bad request" -const UnableToBuildResponse = "Unable to build response" -const UnableToDeserializePayloadError = "Unable to deserialize payload: %v" -const ErrorRetrievingFederationAddress = "error retrieving federation address: " -const ErrorRetrievingMinimumLockValue = "error retrieving minimum lock tx value: " -const ErrorRequestedAmountBelowBridgeMin = "requested amount below bridge's min pegin tx value" -const ErrorGetQuoteFailed = "error getting specified quote" -const ErrorEncodingQuotesList = "error encoding quote list for response" -const ErrorBadBodyRequest = "Body of the request is wrong: " -const ErrorEstimatingGas = "Error on RSK Network, couldnt estimate gas price" -const ErrorValueHigherThanMaxAllowed = "value to transfer is higher than max allowed" -const ErrorStoringProviderQuote = "Error storing the quote on server" -const ErrorFetchingMongoDBProviders = "Error Fetching Providers from MongoDB: " -const ErrorSigningQuote = "error signing quote: " -const ErrorAddingAddressWatcher = "error signing quote: " -const ErrorBech32AddressNotSupported = "BECH32 address type is not supported yet" -const ErrorCreatingLocalProvider = "Error Creating New Local Provider" -const GetCollateralError = "Unable to get collateral" -const ErrorAddingProvider = "Error Adding New provider: %v" -const ErrorRetrivingProviderAddress = "Error Retrieving Provider Address from MongoDB" -const ErrorNotLiquidity = "Not enough liquidity" -const ErrorRetrievingDaoFeePercentage = "Error retrieving dao fee percentage" - -type LiquidityProviderList struct { - Endpoint string `env:"RSK_ENDPOINT"` - LBCAddr string `env:"LBC_ADDR"` - BridgeAddr string `env:"RSK_BRIDGE_ADDR"` - RequiredBridgeConfirmations int64 `env:"RSK_REQUIRED_BRIDGE_CONFIRMATONS"` - LpsAddress string `env:"LIQUIDITY_PROVIDER_RSK_ADDR"` - ChainId *big.Int `env:"CHAIN_ID"` -} - -type ConfigData struct { - RSK LiquidityProviderList - QuoteCacheStartBlock uint64 - CaptchaSecretKey string - CaptchaSiteKey string - CaptchaThreshold float32 -} - -type Server struct { - srv http.Server - provider pegin.LiquidityProvider - pegoutProvider pegout.LiquidityProvider - rsk connectors.RSKConnector - btc connectors.BTCConnector - dbMongo mongoDB.DBConnector - now func() time.Time - watchers map[string]*BTCAddressWatcher - pegOutWatchers map[string]*BTCAddressPegOutWatcher - pegOutDepositWatcher DepositEventWatcher - lpFundsEventtWatcher LpFundsEventWatcher - addWatcherMu sync.Mutex - sharedPeginMutex sync.Mutex - sharedPegoutMutex sync.Mutex - cfgData ConfigData - ProviderRespository *storage.LPRepository - ProviderConfig pegin.ProviderConfig - PegoutConfig pegout.ProviderConfig - AccountProvider account.AccountProvider - awsConfig aws.Config -} - -type QuoteRequest struct { - CallEoaOrContractAddress string `json:"callEoaOrContractAddress" required:"" validate:"required" example:"0x0" description:"Contract address or EOA address"` - CallContractArguments string `json:"callContractArguments" required:"" example:"0x0" description:"Contract data"` - ValueToTransfer uint64 `json:"valueToTransfer" required:"" example:"0x0" description:"Value to send in the call"` - RskRefundAddress string `json:"rskRefundAddress" required:"" validate:"required" example:"0x0" description:"User RSK refund address"` - BitcoinRefundAddress string `json:"bitcoinRefundAddress" required:"" validate:"required" example:"0x0" description:"User Bitcoin refund address. Note: Must be a legacy address, segwit addresses are not accepted"` -} - -type QuoteReturn struct { - Quote *PeginQuoteDTO `json:"quote" required:"" description:"Detail of the quote"` - QuoteHash string `json:"quoteHash" required:"" description:"This is a 64 digit number that derives from a quote object"` -} - -type QuotePegOutRequest struct { - To string `json:"to" required:"" description:"Bitcoin address that will receive the BTC amount"` - ValueToTransfer uint64 `json:"valueToTransfer" required:"" example:"10000000000000" description:"ValueToTransfer"` - RskRefundAddress string `json:"rskRefundAddress" required:"" example:"0x0" description:"RskRefundAddress"` - BitcoinRefundAddress string `json:"bitcoinRefundAddress" required:"" example:"0x0" description:"BitcoinRefundAddress"` -} - -type QuotePegOutResponse struct { - Quote *PegoutQuoteDTO `json:"quote" required:"" description:"Quote"` - QuoteHash string `json:"quoteHash" required:"" example:"0x0" description:"QuoteHash"` -} - -type AcceptReq struct { - QuoteHash string `json:"quoteHash" required:"" example:"0x0" description:"QuoteHash"` -} - -type AcceptRes struct { - Signature string `json:"signature" required:"" example:"0x0" description:"Signature of the quote"` - BitcoinDepositAddressHash string `json:"bitcoinDepositAddressHash" required:"" example:"0x0" description:"Hash of the deposit BTC address"` -} -type AcceptResPegOut struct { - Signature string `json:"signature" required:"" example:"0x0" description:"Signature of the quote"` - LbcAddress string `json:"lbcAddress" required:"" example:"0x0" description:"LBC address to execute depositPegout function"` -} - -func New(rsk connectors.RSKConnector, btc connectors.BTCConnector, dbMongo mongoDB.DBConnector, cfgData ConfigData, - LPRep *storage.LPRepository, ProviderConfig pegin.ProviderConfig, pegoutConfig pegout.ProviderConfig, accountProvider account.AccountProvider, awsConfig aws.Config) Server { - return newServer(rsk, btc, dbMongo, time.Now, cfgData, LPRep, ProviderConfig, pegoutConfig, accountProvider, awsConfig) -} - -func newServer(rsk connectors.RSKConnector, btc connectors.BTCConnector, dbMongo mongoDB.DBConnector, now func() time.Time, - cfgData ConfigData, LPRep *storage.LPRepository, ProviderConfig pegin.ProviderConfig, pegoutConfig pegout.ProviderConfig, accountProvider account.AccountProvider, - awsConfig aws.Config) Server { - return Server{ - rsk: rsk, - btc: btc, - dbMongo: dbMongo, - provider: nil, - pegoutProvider: nil, - now: now, - watchers: make(map[string]*BTCAddressWatcher), - pegOutWatchers: make(map[string]*BTCAddressPegOutWatcher), - cfgData: cfgData, - ProviderRespository: LPRep, - ProviderConfig: ProviderConfig, - PegoutConfig: pegoutConfig, - AccountProvider: accountProvider, - awsConfig: awsConfig, - } -} - -func (s *Server) AddProvider(peginProvider pegin.LiquidityProvider, pegoutProvider pegout.LiquidityProvider, providerDetails types.ProviderRegisterRequest) error { - var peginCollateral, pegoutCollateral, minCollateral *big.Int - var operationalForPegin, operationalForPegout bool - var err error - - s.provider = peginProvider - s.pegoutProvider = pegoutProvider - - if providerDetails.ProviderType != "pegin" && providerDetails.ProviderType != "pegout" && providerDetails.ProviderType != "both" { - return errors.New("invalid provider type") - } - - if peginCollateral, minCollateral, err = s.rsk.GetCollateral(peginProvider.Address()); err != nil { - return err - } - - if pegoutCollateral, _, err = s.rsk.GetPegoutCollateral(pegoutProvider.Address()); err != nil { - return err - } - - if operationalForPegin, err = s.rsk.IsOperational(&bind.CallOpts{}, common.HexToAddress(peginProvider.Address())); err != nil { - return err - } - - if operationalForPegout, err = s.rsk.IsOperationalForPegout(&bind.CallOpts{}, common.HexToAddress(peginProvider.Address())); err != nil { - return err - } - - if isProviderRegistered(providerDetails.ProviderType, operationalForPegin, operationalForPegout) { - log.Debug("Already registered") - return nil - } - - if (providerDetails.ProviderType == "pegin" || providerDetails.ProviderType == "both") && !operationalForPegin && peginCollateral.Cmp(big.NewInt(0)) != 0 { - return s.addPeginCollateral(peginProvider, peginCollateral, minCollateral) - } - if (providerDetails.ProviderType == "pegout" || providerDetails.ProviderType == "both") && !operationalForPegout && pegoutCollateral.Cmp(big.NewInt(0)) != 0 { - return s.addPegoutCollateral(pegoutProvider, pegoutCollateral, minCollateral) - } - - return s.performRegisterProvider(peginProvider, pegoutProvider, providerDetails, minCollateral) -} - -func isProviderRegistered(providerType string, isOperationalForPegin, isOperationalForPegout bool) bool { - return (providerType == "both" && isOperationalForPegin && isOperationalForPegout) || - (providerType == "pegin" && isOperationalForPegin) || - (providerType == "pegout" && isOperationalForPegout) -} - -func (s *Server) addPeginCollateral(peginProvider pegin.LiquidityProvider, peginCollateral, minCollateral *big.Int) error { - if peginCollateral.Cmp(minCollateral) >= 0 { - return nil - } - opts := &bind.TransactOpts{ - Value: minCollateral.Sub(minCollateral, peginCollateral), - From: common.HexToAddress(peginProvider.Address()), - Signer: peginProvider.SignTx, - } - return s.rsk.AddCollateral(opts) -} - -func (s *Server) addPegoutCollateral(pegoutProvider pegout.LiquidityProvider, pegoutCollateral, minCollateral *big.Int) error { - if pegoutCollateral.Cmp(minCollateral) >= 0 { - return nil - } - opts := &bind.TransactOpts{ - Value: minCollateral.Sub(minCollateral, pegoutCollateral), - From: common.HexToAddress(pegoutProvider.Address()), - Signer: pegoutProvider.SignTx, - } - return s.rsk.AddPegoutCollateral(opts) -} - -func (s *Server) performRegisterProvider(peginProvider pegin.LiquidityProvider, pegoutProvider pegout.LiquidityProvider, - providerDetails types.ProviderRegisterRequest, minCollateral *big.Int) error { - log.Debug("Registering new provider...") - var signer bind.SignerFn - var address string - if providerDetails.ProviderType == "pegin" || providerDetails.ProviderType == "both" { - address = peginProvider.Address() - signer = peginProvider.SignTx - } else { - address = pegoutProvider.Address() - signer = pegoutProvider.SignTx - } - opts := &bind.TransactOpts{ - Value: new(big.Int).Mul(minCollateral, big.NewInt(2)), - From: common.HexToAddress(address), - Signer: signer, - } - - providerID, err := s.rsk.RegisterProvider(opts, providerDetails.Name, providerDetails.ApiBaseUrl, providerDetails.Status, providerDetails.ProviderType) - if err != nil { - return err - } - err = s.dbMongo.InsertProvider(providerID, providerDetails, address) - if err != nil { - return err - } - return nil -} - -type RegistrationStatus struct { - Status string `json:"Status" example:"Provider Created Successfully" description:"Returned Status"` -} - -// @Title Register Pegin Provider -// @Description Registers New Pegin Provider -// @Param RegisterRequest body types.ProviderRegisterRequest true "Provider Register Request" -// @Success 200 object RegistrationStatus -// @Route /provider/pegin/register [post] -func (s *Server) registerPeginProviderHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - payload := types.ProviderRegisterRequest{} - decoder := json.NewDecoder(r.Body) - err := decoder.Decode(&payload) - if err != nil { - log.Errorf(UnableToDeserializePayloadError, err) - http.Error(w, UnableToDeserializePayloadError, http.StatusBadRequest) - return - } - lp, err := pegin.NewLocalProvider(s.ProviderConfig, s.ProviderRespository, s.AccountProvider, s.cfgData.RSK.ChainId) - if err != nil { - log.Error(ErrorCreatingLocalProvider, err) - http.Error(w, ErrorCreatingLocalProvider, http.StatusBadRequest) - return - } - payload.ProviderType = "pegin" - err = s.AddProvider(lp, nil, payload) - if err != nil { - log.Errorf(ErrorAddingProvider, err) - http.Error(w, ErrorAddingProvider, http.StatusBadRequest) - return - } - response := RegistrationStatus{Status: "Pegin Provider Created Successfully"} - encoder := json.NewEncoder(w) - err = encoder.Encode(&response) - if err != nil { - http.Error(w, UnableToBuildResponse, http.StatusInternalServerError) - return - } -} - -// @Title Register Pegout Provider -// @Description Registers New Pegout Provider -// @Param RegisterRequest body types.ProviderRegisterRequest true "Provider Register Request" -// @Success 200 object RegistrationStatus -// @Route /provider/pegout/register [post] -func (s *Server) registerPegoutProviderHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - payload := types.ProviderRegisterRequest{} - decoder := json.NewDecoder(r.Body) - err := decoder.Decode(&payload) - if err != nil { - log.Errorf(UnableToDeserializePayloadError, err) - http.Error(w, UnableToDeserializePayloadError, http.StatusBadRequest) - return - } - lp, err := pegout.NewLocalProvider(&s.PegoutConfig, s.ProviderRespository, s.AccountProvider, s.cfgData.RSK.ChainId) - if err != nil { - log.Error(ErrorCreatingLocalProvider, err) - http.Error(w, ErrorCreatingLocalProvider, http.StatusBadRequest) - return - } - payload.ProviderType = "pegout" - err = s.AddProvider(nil, lp, payload) - if err != nil { - log.Errorf(ErrorAddingProvider, err) - http.Error(w, ErrorAddingProvider, http.StatusBadRequest) - return - } - - response := RegistrationStatus{Status: "Pegout Provider Created Successfully"} - encoder := json.NewEncoder(w) - err = encoder.Encode(&response) - if err != nil { - http.Error(w, UnableToBuildResponse, http.StatusInternalServerError) - return - } -} - -type ChangeStatusRequest struct { - ProviderId uint64 `json:"providerId"` - Status bool `json:"status"` -} -type ProviderStatusChangeStatus struct { - Status string `json:"Status" example:"Provider Updated Successfully" description:"Returned Status"` -} - -// @Title Change Provider Status -// @Description Changes the status of the provider -// @Param ChangeStatusRequest body ChangeStatusRequest true "Change Provider Status Request" -// @Success 200 object ProviderStatusChangeStatus -// @Route /provider/changeStatus [post] -func (s *Server) changeStatusHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - payload := ChangeStatusRequest{} - decoder := json.NewDecoder(r.Body) - err := decoder.Decode(&payload) - if err != nil { - log.Errorf(UnableToDeserializePayloadError, err) - http.Error(w, UnableToDeserializePayloadError, http.StatusBadRequest) - return - } - providerAddress, err := s.dbMongo.GetProvider(payload.ProviderId) - if err != nil { - log.Errorf(ErrorAddingProvider, err) - http.Error(w, ErrorAddingProvider, http.StatusBadRequest) - return - } - var lp pegin.LiquidityProvider - if s.provider.Address() == providerAddress.Provider { - lp = s.provider - } - - addrStr := lp.Address() - addr := common.HexToAddress(addrStr) - opts := &bind.TransactOpts{ - From: addr, - Signer: lp.SignTx, - } - err = s.rsk.ChangeStatus(opts, new(big.Int).SetUint64(payload.ProviderId), payload.Status) - log.Debug(err) - if err != nil { - log.Errorf(ErrorAddingProvider, err) - http.Error(w, ErrorAddingProvider, http.StatusBadRequest) - return - } - response := "Provider Updated Successfully" - encoder := json.NewEncoder(w) - err = encoder.Encode(&response) - if err != nil { - http.Error(w, UnableToBuildResponse, http.StatusInternalServerError) - return - } -} -func (s *Server) Start(port uint) error { - r := mux.NewRouter() - r.Use(s.corsMiddleware) - r.Path("/health").Methods(http.MethodGet).HandlerFunc(s.checkHealthHandler) - r.Path("/getProviders").Methods(http.MethodGet).HandlerFunc(s.getProvidersHandler) - r.Path("/pegin/getQuote").Methods(http.MethodPost).HandlerFunc(s.getQuoteHandler) - r.Path("/pegin/acceptQuote").Methods(http.MethodPost).Handler(s.captchaMiddleware(http.HandlerFunc(s.acceptQuoteHandler))) - r.Path("/pegout/getQuotes").Methods(http.MethodPost).HandlerFunc(s.getPegoutQuoteHandler) - r.Path("/pegout/acceptQuote").Methods(http.MethodPost).Handler(s.captchaMiddleware(http.HandlerFunc(s.acceptQuotePegOutHandler))) - r.Path("/pegin/collateral").Methods(http.MethodGet).HandlerFunc(s.getCollateralHandler) - r.Path("/pegin/addCollateral").Methods(http.MethodPost).HandlerFunc(s.addPeginCollateralHandler) - r.Path("/pegin/withdrawCollateral").Methods(http.MethodPost).HandlerFunc(s.withdrawPeginCollateralHandler) - r.Path("/pegout/collateral").Methods(http.MethodGet).HandlerFunc(s.getPegoutCollateralHandler) - r.Path("/pegout/addCollateral").Methods(http.MethodPost).HandlerFunc(s.addPegoutCollateralHandler) - r.Path("/pegout/withdrawCollateral").Methods(http.MethodPost).HandlerFunc(s.withdrawPegoutCollateralHandler) - r.Path("/providers/pegin/register").Methods(http.MethodPost).HandlerFunc(s.registerPeginProviderHandler) - r.Path("/providers/pegout/register").Methods(http.MethodPost).HandlerFunc(s.registerPegoutProviderHandler) - r.Path("/providers/changeStatus").Methods(http.MethodPost).HandlerFunc(s.changeStatusHandler) - r.Path("/providers/resignation").Methods(http.MethodPost).HandlerFunc(s.providerResignHandler) - r.Path("/providers/sync").Methods(http.MethodPost).HandlerFunc(s.providerSyncHandler) - r.Path("/userQuotes").Methods(http.MethodGet).HandlerFunc(s.getUserQuotesHandler) - r.Path("/providers/details").Methods(http.MethodGet).HandlerFunc(s.providerDetailHandler) - - r.Methods("OPTIONS").HandlerFunc(s.handleOptions) - w := log.StandardLogger().WriterLevel(log.DebugLevel) - h := handlers.LoggingHandler(w, r) - defer func(w *io.PipeWriter) { - _ = w.Close() - }(w) - - if err := s.initDepositsCache(); err != nil { - return err - } - err := s.initPeginWatchers() - if err != nil { - return err - } - - provider := s.pegoutProvider - s.pegOutDepositWatcher = NewDepositEventWatcher(PegoutDepositCheckInterval, provider, &s.addWatcherMu, &s.sharedPegoutMutex, make(chan bool), s.rsk, s.btc, s.dbMongo, - func(hash string, quote *WatchedQuote, endState types.RQState) { - if endState != types.RQStateCallForUserSucceeded { - return - } - signB, err := hex.DecodeString(quote.Signature) - if err != nil { - log.Error("Error decoding pegout quote signature: ", err) - } - err = s.addAddressPegOutWatcher(quote.Data, hash, quote.LpBtcTransaction, signB, provider, types.RQStateCallForUserSucceeded) - if err != nil { - log.Error("Error starting BTC pegout watcher: ", err) - } - }) - - peginProvider := s.provider - pegoutProvider := s.pegoutProvider - s.lpFundsEventtWatcher = NewLpFundsEventWatcher(1*time.Minute, make(chan bool), s.rsk, peginProvider, pegoutProvider, s.awsConfig) - s.lpFundsEventtWatcher.Init() - - err = s.initPegoutWatchers() - if err != nil { - return err - } - - s.initExpiredQuotesCleaner() - - s.srv = http.Server{ - Addr: ":" + fmt.Sprint(port), - Handler: h, - } - log.Info("server started at localhost:", s.srv.Addr) - - err = s.srv.ListenAndServe() - if err != http.ErrServerClosed { - s.pegOutDepositWatcher.EndChannel() <- true - return err - } - s.pegOutDepositWatcher.EndChannel() <- true - return nil -} - -func (s *Server) handleOptions(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) -} - -func (s *Server) initDepositsCache() error { - height, err := s.rsk.GetRskHeight() - if err != nil { - return err - } - events, err := s.rsk.GetDepositEvents(s.cfgData.QuoteCacheStartBlock, height) - if err != nil { - return err - } - - return s.dbMongo.UpsertDepositEvents(events) -} - -func (s *Server) initPegoutWatchers() error { - quoteStatesToWatch := []types.RQState{types.RQStateCallForUserSucceeded, types.RQStateWaitingForDeposit, types.RQStateWaitingForDepositConfirmations} - quotes, err := s.dbMongo.GetRetainedPegOutQuoteByState(quoteStatesToWatch) - if err != nil { - return err - } - waitingForDepositQuotes := make(map[string]*WatchedQuote, 0) - waitingForConfirmationQuotes := make(map[string]*WatchedQuote, 0) - for _, entry := range quotes { - quote, err := s.dbMongo.GetPegOutQuote(entry.QuoteHash) - if err != nil || quote == nil { - log.Errorf("initPegoutWatchers: quote not found for hash: %s. Watcher not initialized for address %s", entry.QuoteHash, entry.DepositAddr) - continue - } - - p := pegout.GetPegoutProviderByAddress(s.pegoutProvider, quote.LPRSKAddr) - if p == nil { - log.Errorf("initPegoutWatchers: provider not found for LPRSKAddr: %s. Watcher not initialized for address %s", quote.LPRSKAddr, entry.DepositAddr) - continue - } - - signB, err := hex.DecodeString(entry.Signature) - if err != nil { - log.Errorf("initPeginBtcWatchers: couldn't decode signature %s for quote %s. Watcher not initialized for address %s", entry.Signature, entry.QuoteHash, entry.DepositAddr) - continue - } - - if entry.State == types.RQStateCallForUserSucceeded { - err = s.addAddressPegOutWatcher(quote, entry.QuoteHash, entry.LpBtcTransaction, signB, p, entry.State) - } else if entry.State == types.RQStateWaitingForDepositConfirmations { - waitingForConfirmationQuotes[entry.QuoteHash] = &WatchedQuote{ - Signature: entry.Signature, - Data: quote, - DepositTransaction: entry.DepositTransaction, - QuoteHash: entry.QuoteHash, - LpBtcTransaction: entry.LpBtcTransaction, - } - } else { - waitingForDepositQuotes[entry.QuoteHash] = &WatchedQuote{ - Signature: entry.Signature, - Data: quote, - QuoteHash: entry.QuoteHash, - } - } - - if err != nil { - log.Errorf("initPegoutWatchers: error initializing watcher for quote hash %s: %v", entry.QuoteHash, err) - } - } - go s.pegOutDepositWatcher.Init(waitingForDepositQuotes, waitingForConfirmationQuotes) - return nil -} - -func (s *Server) initPeginWatchers() error { - quoteStatesToWatch := []types.RQState{types.RQStateWaitingForDeposit, types.RQStateCallForUserSucceeded} - retainedQuotes, err := s.dbMongo.GetRetainedQuotes(quoteStatesToWatch) - if err != nil { - return err - } - - for _, entry := range retainedQuotes { - quote, err := s.dbMongo.GetQuote(entry.QuoteHash) - if err != nil || quote == nil { - log.Errorf("initPeginBtcWatchers: quote not found for hash: %s. Watcher not initialized for address %s", entry.QuoteHash, entry.DepositAddr) - continue - } - - p := pegin.GetPeginProviderByAddress(s.provider, quote.LPRSKAddr) - if p == nil { - log.Errorf("initPeginBtcWatchers: provider not found for LPRSKAddr: %s. Watcher not initialized for address %s", quote.LPRSKAddr, entry.DepositAddr) - continue - } - - signB, err := hex.DecodeString(entry.Signature) - if err != nil { - log.Errorf("initPeginBtcWatchers: couldn't decode signature %s for quote %s. Watcher not initialized for address %s", entry.Signature, entry.QuoteHash, entry.DepositAddr) - continue - } - - err = s.addAddressWatcher(quote, entry.QuoteHash, entry.DepositAddr, signB, p, entry.State) - if err != nil { - log.Errorf("initPeginBtcWatchers: error initializing watcher for quote hash %s: %v", entry.QuoteHash, err) - } - } - - return nil -} - -func (s *Server) addAddressWatcher(quote *pegin.Quote, hash string, depositAddr string, signB []byte, provider pegin.LiquidityProvider, state types.RQState) error { - s.addWatcherMu.Lock() - defer s.addWatcherMu.Unlock() - - _, ok := s.watchers[hash] - if ok { - return nil - } - - total := new(types.Wei) - total.Add(total, quote.Value) - total.Add(total, quote.CallFee) - total.Add(total, types.NewUWei(quote.ProductFeeAmount)) - total.Add(total, quote.GasFee) - sat, _ := total.ToSatoshi().Float64() - minBtcAmount := btcutil.Amount(uint64(math.Ceil(sat))) - expTime := getQuoteExpTime(quote) - watcher := NewBTCAddressWatcher(hash, s.btc, s.rsk, provider, s.dbMongo, quote, signB, state, &s.sharedPeginMutex) - err := s.btc.AddAddressWatcher(depositAddr, minBtcAmount, time.Minute, expTime, watcher, func(w connectors.AddressWatcher) { - s.addWatcherMu.Lock() - defer s.addWatcherMu.Unlock() - delete(s.watchers, hash) - }) - if err == nil { - escapedDepositAddr := strings.Replace(depositAddr, "\n", "", -1) - escapedDepositAddr = strings.Replace(escapedDepositAddr, "\r", "", -1) - s.watchers[hash] = watcher - } - return err -} - -func (s *Server) addAddressPegOutWatcher(quote *pegout.Quote, hash string, btcTxHash string, signB []byte, provider pegout.LiquidityProvider, state types.RQState) error { - _, ok := s.pegOutWatchers[hash] - - if ok { - return nil - } - - expTime := quote.GetExpirationTime() - watcher := &BTCAddressPegOutWatcher{ - hash: hash, - btc: s.btc, - rsk: s.rsk, - lp: provider, - dbMongo: s.dbMongo, - quote: quote, - state: state, - signature: signB, - done: make(chan struct{}), - sharedLocker: &s.sharedPegoutMutex, - } - err := s.btc.AddAddressPegOutWatcher(btcTxHash, quote, time.Minute, expTime, watcher, func(w connectors.AddressWatcher) { - s.addWatcherMu.Lock() - defer s.addWatcherMu.Unlock() - delete(s.pegOutWatchers, hash) - }) - if err == nil { - s.addWatcherMu.Lock() - s.pegOutWatchers[hash] = watcher - s.addWatcherMu.Unlock() - } - return err -} - -func (s *Server) initExpiredQuotesCleaner() { - go func() { - ticker := time.NewTicker(quoteCleaningInterval) - quit := make(chan struct{}) - for { - select { - case <-ticker.C: - err := s.dbMongo.DeleteExpiredQuotes(time.Now().Add(-1 * quoteExpTimeThreshold).Unix()) - if err != nil { - log.Error("error deleting expired quites: ", err) - } - case <-quit: - ticker.Stop() - return - } - } - }() -} - -func (s *Server) Shutdown() { - log.Info("stopping server...") - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := s.srv.Shutdown(ctx); err != nil { - log.Fatal("server shutdown failed: ", err) - } - log.Info("server stopped") -} - -type services struct { - Db string `json:"db"` - Rsk string `json:"rsk"` - Btc string `json:"btc"` -} -type healthRes struct { - Status string `json:"status" example:"ok" description:"Overall LPS Health Status"` - Services services `json:"services" example:"{\"db\":\"ok\",\"rsk\":\"ok\",\"btc\":\"ok\"}" description:"LPS Services Status"` -} - -// @Title Health -// @Description Returns server health. -// @Success 200 object healthRes -// @Route /health [get] -func (s *Server) checkHealthHandler(w http.ResponseWriter, _ *http.Request) { - lpsSvcStatus := svcStatusOk - dbSvcStatus := svcStatusOk - rskSvcStatus := svcStatusOk - btcSvcStatus := svcStatusOk - - if err := s.dbMongo.CheckConnection(); err != nil { - log.Error("error checking mongo DB connection status: ", err.Error()) - dbSvcStatus = svcStatusUnreachable - lpsSvcStatus = svcStatusDegraded - } - - if err := s.rsk.CheckConnection(); err != nil { - log.Error("error checking rsk connection status: ", err.Error()) - rskSvcStatus = svcStatusUnreachable - lpsSvcStatus = svcStatusDegraded - } - - if err := s.btc.CheckConnection(); err != nil { - log.Error("error checking btcd connection status: ", err.Error()) - btcSvcStatus = svcStatusUnreachable - lpsSvcStatus = svcStatusDegraded - } - - toRestAPI(w) - enc := json.NewEncoder(w) - response := healthRes{ - Status: lpsSvcStatus, - Services: services{ - Db: dbSvcStatus, - Rsk: rskSvcStatus, - Btc: btcSvcStatus, - }, - } - err := enc.Encode(response) - if err != nil { - log.Error("Heath Check - error encoding response: ", err.Error()) - http.Error(w, "internal server error", http.StatusInternalServerError) - } -} - -func toRestAPI(w http.ResponseWriter) { - w.Header().Set("Content-Type", "application/json") -} - -func (a *QuotePegOutRequest) validateQuoteRequest() string { - err := "" - - if a.ValueToTransfer == 0 { - err += "Value to Transfer cannot be empty or zero!" - } - - return err -} - -// @Title Get Providers -// @Description Returns a list of providers. -// @Success 200 array ProviderDTO -// @Route /getProviders [get] -func (s *Server) getProvidersHandler(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - - providerList, error := s.dbMongo.GetProviders() - if error != nil { - log.Error("Error fetching providers. Error: ", error) - customError := NewServerError(ErrorFetchingMongoDBProviders+error.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - var ids []int64 - for _, address := range providerList { - ids = append(ids, address.Id) - } - providers, error := s.rsk.GetProviders(ids) - - if error != nil { - log.Error("GetProviders - error encoding response: ", error) - customError := NewServerError("GetProviders - error encoding response: "+error.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - response := make([]*types.GlobalProvider, 0) - for _, provider := range providers { - response = append(response, toGlobalProvider(&provider)) - } - - enc := json.NewEncoder(w) - err := enc.Encode(&response) - if err != nil { - log.Error("error encoding registered providers list: ", err.Error()) - customError := NewServerError("error encoding registered providers list: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } -} - -// @Title Pegin GetQuote -// @Description Gets Pegin Quote -// @Param PeginQuoteRequest body QuoteRequest true "Interface with parameters for computing possible quotes for the service" -// @Success 200 array QuoteReturn The quote structure defines the conditions of a service, and acts as a contract between users and LPs -// @Route /pegin/getQuote [post] -func (s *Server) getQuoteHandler(w http.ResponseWriter, r *http.Request) { - qr := QuoteRequest{} - dec := json.NewDecoder(r.Body) - dec.DisallowUnknownFields() - err := dec.Decode(&qr) - - if err != nil { - buildErrorDecodingRequest(w, err) - return - } - log.Debug("received quote request: ", fmt.Sprintf("%+v", qr)) - if isValid := Validate(qr)(w); !isValid { - return - } - - err = s.validateAmountForProvider(new(big.Int).SetUint64(qr.ValueToTransfer), &s.ProviderConfig) - if err != nil { - log.Error(err) - customError := NewServerError(err.Error(), Details{}, true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - var gas uint64 - gas, err = s.rsk.EstimateGas(qr.CallEoaOrContractAddress, big.NewInt(int64(qr.ValueToTransfer)), []byte(qr.CallContractArguments)) - - if err != nil { - log.Error(ErrorEstimatingGas, err.Error()) - customError := NewServerError(ErrorEstimatingGas, make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - price, err := s.rsk.GasPrice() - if err != nil { - log.Error(ErrorEstimatingGas, err.Error()) - customError := NewServerError(ErrorEstimatingGas, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - daoFeePercentage, err := s.rsk.GetDaoFeePercentage() - - if err != nil { - log.Error(ErrorRetrievingDaoFeePercentage, err.Error()) - customError := NewServerError(ErrorRetrievingDaoFeePercentage, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - var gasDao, daoFeeAmount uint64 - if daoFeePercentage != 0 { - daoFeeAmount = qr.ValueToTransfer * daoFeePercentage / 100 - feeCollectorAddress := os.Getenv("DAO_FEE_COLLECTOR_ADDRESS") - gasDao, err = s.rsk.EstimateGas(feeCollectorAddress, big.NewInt(int64(daoFeeAmount)), make([]byte, 0)) - } - if err != nil { - log.Error(ErrorEstimatingGas, err.Error()) - customError := NewServerError(ErrorEstimatingGas, make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - var quotes []*QuoteReturn - fedAddress, err := s.rsk.GetFedAddress() - if err != nil { - log.Error(ErrorRetrievingFederationAddress, err.Error()) - customError := NewServerError(ErrorRetrievingFederationAddress, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - minLockTxValueInSatoshi, err := s.rsk.GetMinimumLockTxValue() - if err != nil { - log.Error(ErrorRetrievingMinimumLockValue, err.Error()) - customError := NewServerError(ErrorRetrievingMinimumLockValue, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - minLockTxValueInWei := types.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) - - getQuoteFailed := false - amountBelowMinLockTxValue := false - totalGas := gas + gasDao - q := parseReqToQuote(qr, s.rsk.GetLBCAddress(), fedAddress, totalGas, daoFeeAmount) - pq, err := s.provider.GetQuote(q, totalGas, types.NewBigWei(price)) - if err != nil { - log.Error("error getting quote: ", err) - getQuoteFailed = true - } - if pq != nil { - if new(types.Wei).Add(pq.Value, pq.CallFee).Cmp(minLockTxValueInWei) < 0 { - log.Error("error getting quote; requested amount below bridge's min pegin tx value: ", qr.ValueToTransfer) - amountBelowMinLockTxValue = true - } - - hash, err := s.storeQuote(pq) - if err != nil { - log.Error(err) - errmsg := ErrorStoringProviderQuote + ": " + err.Error() - status := http.StatusInternalServerError - if strings.HasPrefix(err.Error(), "VM Exception") { - _, vmString, _ := strings.Cut(err.Error(), "VM Exception while processing transaction: revert ") - status = http.StatusBadRequest - errmsg = "LBC error: " + vmString - } - customError := NewServerError(errmsg, make(map[string]interface{}), false) - ResponseError(w, customError, status) - return - } else { - quotes = append(quotes, &QuoteReturn{toPeginQuote(pq), hash}) - } - } - - if len(quotes) == 0 { - if amountBelowMinLockTxValue { - details := map[string]interface{}{ - "value": q.Value, - "callFee": q.CallFee, - "minLockTxValueInWei": minLockTxValueInWei, - } - - customError := NewServerError(ErrorRequestedAmountBelowBridgeMin, details, true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - if getQuoteFailed { - details := map[string]interface{}{ - "quote": q, - "gas": gas, - } - customError := NewServerError(ErrorGetQuoteFailed, details, true) - ResponseError(w, customError, http.StatusNotFound) // StatusBadRequest or StatusInternalServerError? - return - } - } - - toRestAPI(w) - enc := json.NewEncoder(w) - err = enc.Encode("es) - if err != nil { - log.Error("error encoding quote list: ", err.Error()) - details := map[string]interface{}{ - "quotes": quotes, - "check": true, - } - - customError := NewServerError(ErrorEncodingQuotesList, details, true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } -} - -// @Title Pegout GetQuote -// @Description Gets Pegout Quote -// @Param PegoutQuoteRequest body QuotePegOutRequest true "Interface with parameters for computing possible quotes for the service" -// @Success 200 array QuotePegOutResponse The quote structure defines the conditions of a service, and acts as a contract between users and LPs -// @Route /pegout/getQuotes [post] -func (s *Server) getPegoutQuoteHandler(w http.ResponseWriter, r *http.Request) { - qr := QuotePegOutRequest{} - dec := json.NewDecoder(r.Body) - dec.DisallowUnknownFields() - err := dec.Decode(&qr) - - if err != nil { - buildErrorDecodingRequest(w, err) - return - } - log.Debug("received peg out quote request: ", fmt.Sprintf("%+v", qr)) - if isValid := Validate(qr)(w); !isValid { - return - } - - err = s.validateAmountForProvider(new(big.Int).SetUint64(qr.ValueToTransfer), &s.PegoutConfig.ProviderConfig) - if err != nil { - log.Error(err) - customError := NewServerError(err.Error(), Details{}, true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - amountInSatoshi, _ := types.NewUWei(qr.ValueToTransfer).ToSatoshi().Uint64() - feeInSatoshi, err := s.btc.EstimateFees(qr.To, amountInSatoshi) - if err != nil && strings.Contains(err.Error(), "Insufficient funds") { - log.Error(ErrorNotLiquidity) - customError := NewServerError(ErrorNotLiquidity, make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } else if err != nil { - log.Error(err.Error()) - customError := NewServerError(err.Error(), make(Details), false) - ResponseError(w, customError, http.StatusInternalServerError) - } - - var quotes []*QuotePegOutResponse - minLockTxValueInSatoshi, err := s.rsk.GetMinimumLockTxValue() - if err != nil { - log.Error(ErrorRetrievingMinimumLockValue, err.Error()) - customError := NewServerError(ErrorRetrievingMinimumLockValue, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - minLockTxValueInWei := types.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) - - getQuoteFailed := false - amountBelowMinLockTxValue := false - - daoFeePercentage, err := s.rsk.GetDaoFeePercentage() - if err != nil { - log.Error(ErrorRetrievingDaoFeePercentage, err.Error()) - customError := NewServerError(ErrorRetrievingDaoFeePercentage, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - gasPrice, err := s.rsk.GasPrice() - if err != nil { - log.Error(ErrorEstimatingGas, err.Error()) - customError := NewServerError(ErrorEstimatingGas, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - var daoFeeAmount, gasDao uint64 - var gasFeeDao big.Int - if daoFeePercentage != 0 { - daoFeeAmount = qr.ValueToTransfer * daoFeePercentage / 100 - feeCollectorAddress := os.Getenv("DAO_FEE_COLLECTOR_ADDRESS") - gasDao, err = s.rsk.EstimateGas(feeCollectorAddress, big.NewInt(int64(daoFeeAmount)), make([]byte, 0)) - gasFeeDao.Mul(big.NewInt(int64(gasDao)), gasPrice) - } - if err != nil { - log.Error(ErrorEstimatingGas, err.Error()) - customError := NewServerError(ErrorEstimatingGas, make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - q := parseReqToPegOutQuote(qr, s.rsk.GetLBCAddress(), daoFeeAmount) - rskBlockNumber, err := s.rsk.GetRskHeight() - if err != nil { - log.Error("Error getting last block", err.Error()) - customError := NewServerError("Error getting last block", make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - totalGasFee := new(types.Wei).Add(types.SatoshiToWei(feeInSatoshi), types.NewBigWei(&gasFeeDao)) - pq, err := s.pegoutProvider.GetQuote(q, rskBlockNumber, totalGasFee) - if err != nil { - log.Error("error getting quote: ", err) - getQuoteFailed = true - } - if pq != nil { - if new(types.Wei).Add(pq.Value, pq.CallFee).Cmp(minLockTxValueInWei) < 0 { - log.Error("error getting quote; requested amount below bridge's min pegin tx value: ", qr.ValueToTransfer) - amountBelowMinLockTxValue = true - } - - hash, err := s.storePegoutQuote(pq) - - if err != nil { - log.Error(err) - errmsg := ErrorStoringProviderQuote + ": " + err.Error() - status := http.StatusInternalServerError - if strings.HasPrefix(err.Error(), "VM Exception") { - _, vmString, _ := strings.Cut(err.Error(), "VM Exception while processing transaction: revert ") - status = http.StatusBadRequest - errmsg = "LBC error: " + vmString - } - customError := NewServerError(errmsg, make(map[string]interface{}), false) - ResponseError(w, customError, status) - return - } else { - quotes = append(quotes, &QuotePegOutResponse{toPegoutQuote(pq), hash}) - } - } - - if len(quotes) == 0 { - if amountBelowMinLockTxValue { - details := map[string]interface{}{ - "value": q.Value, - "callFee": q.CallFee, - "minLockTxValueInWei": minLockTxValueInWei, - } - - customError := NewServerError(ErrorRequestedAmountBelowBridgeMin, details, true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - if getQuoteFailed { - details := Details{ - "quote": q, - } - customError := NewServerError(ErrorGetQuoteFailed, details, true) - ResponseError(w, customError, http.StatusNotFound) // StatusBadRequest or StatusInternalServerError? - return - } - } - - toRestAPI(w) - enc := json.NewEncoder(w) - err = enc.Encode("es) - if err != nil { - log.Error("error encoding quote list: ", err.Error()) - details := map[string]interface{}{ - "quotes": quotes, - "check": true, - } - - customError := NewServerError(ErrorEncodingQuotesList, details, true) - ResponseError(w, customError, http.StatusInternalServerError) - return - } -} - -// @Title Accept Quote -// @Description Accepts Quote -// @Param QuoteHash body AcceptReq true "Quote Hash" -// @Success 200 object AcceptRes Interface that represents that the quote has been successfully accepted -// @Route /pegin/acceptQuote [post] -func (s *Server) acceptQuoteHandler(w http.ResponseWriter, r *http.Request) { - returnQuoteSignFunc := func(w http.ResponseWriter, signature, depositAddr string) { - enc := json.NewEncoder(w) - response := AcceptRes{ - Signature: signature, - BitcoinDepositAddressHash: depositAddr, - } - - err := enc.Encode(response) - if err != nil { - const errorMsg = "AcceptQuote - error encoding response: " - log.Error(errorMsg, err.Error()) - customError := NewServerError(errorMsg+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - } - - req := AcceptReq{} - toRestAPI(w) - dec := json.NewDecoder(r.Body) - err := dec.Decode(&req) - if err != nil { - buildErrorDecodingRequest(w, err) - return - } - - hashBytes, err := hex.DecodeString(req.QuoteHash) - if err != nil { - log.Error("error decoding quote hash: ", err.Error()) - customError := NewServerError("error decoding quote hash: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - quote, err := s.dbMongo.GetQuote(req.QuoteHash) - if err != nil { - log.Error("error retrieving quote from db: ", err.Error()) - customError := NewServerError("error retrieving quote from db: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - if quote == nil { - log.Error("quote not found for hash: ", req.QuoteHash) - customError := NewServerError("quote not found for hash: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - expTime := getQuoteExpTime(quote) - if s.now().After(expTime) { - log.Error("quote deposit time has elapsed; hash: ", req.QuoteHash) - customError := NewServerError("quote deposit time has elapsed; hash: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - rq, err := s.dbMongo.GetRetainedQuote(req.QuoteHash) - if err != nil { - log.Error("error fetching retained quote: ", err.Error()) - customError := NewServerError("error fetching retained quote: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - if rq != nil { // if the quote has already been accepted, just return signature and deposit addr - returnQuoteSignFunc(w, rq.Signature, rq.DepositAddr) - return - } - - btcRefAddr, lpBTCAddr, lbcAddr, err := decodeAddresses(quote.BTCRefundAddr, quote.LPBTCAddr, quote.LBCAddr) - if err != nil { - log.Error("error decoding addresses: ", err.Error()) - customError := NewServerError("error decoding addresses: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - fedInfo, err := s.rsk.FetchFederationInfo() - if err != nil { - log.Error("error fetching fed info: ", err.Error()) - customError := NewServerError("error fetching fed info: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - depositAddress, _, err := s.rsk.GetDerivedBitcoinAddress(fedInfo, s.btc.GetParams(), btcRefAddr, lbcAddr, lpBTCAddr, hashBytes) - if err != nil { - log.Error("error getting derived bitcoin address: ", err.Error()) - customError := NewServerError("error getting derived bitcoin address: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - p := pegin.GetPeginProviderByAddress(s.provider, quote.LPRSKAddr) - gasPrice, err := s.rsk.GasPrice() - if err != nil { - log.Error("error getting provider by address: ", err.Error()) - customError := NewServerError("error getting provider by address: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - adjustedGasLimit := types.NewUWei(uint64(CFUExtraGas) + uint64(quote.GasLimit)) - gasCost := new(types.Wei).Mul(adjustedGasLimit, types.NewBigWei(gasPrice)) - reqLiq := new(types.Wei).Add(gasCost, quote.Value) - signB, err := p.SignQuote(hashBytes, depositAddress, reqLiq) - if err != nil { - log.Error(ErrorSigningQuote, err.Error()) - customError := NewServerError(ErrorSigningQuote+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - err = s.addAddressWatcher(quote, req.QuoteHash, depositAddress, signB, p, types.RQStateWaitingForDeposit) - if err != nil { - log.Error(ErrorAddingAddressWatcher, err.Error()) - customError := NewServerError(ErrorAddingAddressWatcher+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - signature := hex.EncodeToString(signB) - returnQuoteSignFunc(w, signature, depositAddress) -} - -func parseReqToQuote(qr QuoteRequest, lbcAddr string, fedAddr string, limitGas uint64, daoFeeAmount uint64) *pegin.Quote { - return &pegin.Quote{ - LBCAddr: lbcAddr, - FedBTCAddr: fedAddr, - BTCRefundAddr: qr.BitcoinRefundAddress, - RSKRefundAddr: qr.RskRefundAddress, - ContractAddr: qr.CallEoaOrContractAddress, - Data: qr.CallContractArguments, - Value: types.NewWei(int64(qr.ValueToTransfer)), - GasLimit: uint32(limitGas), - ProductFeeAmount: daoFeeAmount, - } -} - -func parseReqToPegOutQuote(qr QuotePegOutRequest, lbcAddr string, productFeeAmount uint64) *pegout.Quote { - return &pegout.Quote{ - LBCAddr: lbcAddr, - BtcRefundAddr: qr.BitcoinRefundAddress, - RSKRefundAddr: qr.RskRefundAddress, - DepositAddr: qr.To, - Value: types.NewWei(int64(qr.ValueToTransfer)), - ProductFeeAmount: productFeeAmount, - } -} - -func decodeAddresses(btcRefundAddr string, lpBTCAddr string, lbcAddr string) ([]byte, []byte, []byte, error) { - btcRefAddrB, err := connectors.DecodeBTCAddressWithVersion(btcRefundAddr) - if err != nil { - return nil, nil, nil, err - } - lpBTCAddrB, err := connectors.DecodeBTCAddressWithVersion(lpBTCAddr) - if err != nil { - return nil, nil, nil, err - } - lbcAddrB, err := connectors.DecodeRSKAddress(lbcAddr) - if err != nil { - return nil, nil, nil, err - } - return btcRefAddrB, lpBTCAddrB, lbcAddrB, nil -} - -func decodeAddressesPegOut(rskRefundAddr string, lpRSKAddr string, lbcAddr string) ([]byte, []byte, []byte, error) { - rskRefAddrB, err := connectors.DecodeRSKAddress(rskRefundAddr) - if err != nil { - return nil, nil, nil, err - } - lpRSKAddrB, err := connectors.DecodeRSKAddress(lpRSKAddr) - if err != nil { - return nil, nil, nil, err - } - lbcAddrB, err := connectors.DecodeRSKAddress(lbcAddr) - if err != nil { - return nil, nil, nil, err - } - return rskRefAddrB, lpRSKAddrB, lbcAddrB, nil -} - -func getPegOutProviderByAddress(liquidityProviders []pegout.LiquidityProvider, addr string) (ret pegout.LiquidityProvider) { - for _, p := range liquidityProviders { - if p.Address() == addr { - return p - } - } - return nil -} - -func (s *Server) storeQuote(q *pegin.Quote) (string, error) { - h, err := s.rsk.HashQuote(q) - if err != nil { - return "", err - } - - err = s.dbMongo.InsertQuote(h, q) - if err != nil { - log.Fatalf("error inserting quote: %v", err) - } - - return h, nil -} - -func (s *Server) storePegoutQuote(q *pegout.Quote) (string, error) { - h, err := s.rsk.HashPegOutQuote(q) - if err != nil { - return "", err - } - - err = s.dbMongo.InsertPegOutQuote(h, q) - if err != nil { - log.Fatalf("error inserting quote: %v", err) - return "", err - } - return h, nil -} - -func getQuoteExpTime(q *pegin.Quote) time.Time { - return time.Unix(int64(q.AgreementTimestamp+q.TimeForDeposit), 0) -} - -func buildErrorDecodingRequest(w http.ResponseWriter, err error) { - log.Error("Error decoding request: ", err.Error()) - customError := NewServerError(fmt.Sprintf("Error decoding request: %s", err.Error()), make(Details), true) - ResponseError(w, customError, http.StatusBadRequest) - return -} - -func returnQuoteSignFunc(w http.ResponseWriter, signature string, depositAddr string) { - enc := json.NewEncoder(w) - response := AcceptRes{ - Signature: signature, - BitcoinDepositAddressHash: depositAddr, - } - - err := enc.Encode(response) - if err != nil { - log.Error("error encoding response: ", err.Error()) - http.Error(w, "internal server error", http.StatusInternalServerError) - } -} - -func returnQuotePegOutSignFunc(w http.ResponseWriter, signature string) { - enc := json.NewEncoder(w) - response := AcceptResPegOut{ - Signature: signature, - } - - err := enc.Encode(response) - if err != nil { - log.Error("error encoding response: ", err.Error()) - http.Error(w, "internal server error", http.StatusInternalServerError) - } -} - -func generateRskEthereumAddress() ([]byte, []byte, common.Address, error) { - privateKey, err := crypto.GenerateKey() - if err != nil { - log.Fatal(err) - } - - privateKeyBytes := crypto.FromECDSA(privateKey) - fmt.Println("SAVE BUT DO NOT SHARE THIS (Private Key):", hexutil.Encode(privateKeyBytes)) - - publicKey := privateKey.Public() - publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) - if !ok { - log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey") - } - - publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA) - fmt.Println("Public Key:", hexutil.Encode(publicKeyBytes)) - - address := crypto.PubkeyToAddress(*publicKeyECDSA) - fmt.Println("Address:", address) - - return privateKeyBytes, publicKeyBytes, address, nil -} - -// @Title Accept Quote Pegout -// @Description Accepts Quote Pegout -// @Param QuoteHash body AcceptReq true "Quote Hash" -// @Success 200 object AcceptResPegOut -// @Route /pegout/acceptQuote [post] -func (s *Server) acceptQuotePegOutHandler(w http.ResponseWriter, r *http.Request) { - req := AcceptReq{} - toRestAPI(w) - dec := json.NewDecoder(r.Body) - err := dec.Decode(&req) - if err != nil { - buildErrorDecodingRequest(w, err) - return - } - - hashBytes, err := hex.DecodeString(req.QuoteHash) - if err != nil { - log.Error("error decoding quote hash: ", err.Error()) - customError := NewServerError("error decoding quote hash: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - quote, err := s.dbMongo.GetPegOutQuote(req.QuoteHash) - if err != nil { - log.Error("error retrieving quote from db: ", err.Error()) - customError := NewServerError("error retrieving quote from db: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - if quote == nil { - log.Error("quote not found for hash: ", req.QuoteHash) - customError := NewServerError("quote not found for hash: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - expTime := quote.GetExpirationTime() - if s.now().After(expTime) { - log.Error("quote deposit time has elapsed; hash: ", req.QuoteHash) - customError := NewServerError("quote deposit time has elapsed; hash: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - rq, err := s.dbMongo.GetRetainedPegOutQuote(req.QuoteHash) - if err != nil { - log.Error("error fetching retained quote: ", err.Error()) - customError := NewServerError("error fetching retained quote: "+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - if rq != nil { // if the quote has already been accepted, just return signature and deposit addr - signAndReturnPegoutQuote(w, rq.Signature, rq.DepositAddr) - return - } - - p := pegout.GetPegoutProviderByAddress(s.pegoutProvider, quote.LPRSKAddr) - - reqLiq := quote.GasFee.Uint64() + quote.Value.Uint64() - signB, err := p.SignQuote(hashBytes, s.rsk.GetLBCAddress(), reqLiq) - if err != nil { - log.Error(ErrorSigningQuote, err.Error()) - customError := NewServerError(ErrorSigningQuote+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - signature := hex.EncodeToString(signB) - - err = s.pegOutDepositWatcher.WatchNewQuote(req.QuoteHash, signature, quote) - if err != nil { - log.Error(ErrorAddingAddressWatcher, err.Error()) - customError := NewServerError(ErrorAddingAddressWatcher+err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusConflict) - return - } - signAndReturnPegoutQuote(w, signature, s.rsk.GetLBCAddress()) -} - -func signAndReturnPegoutQuote(w http.ResponseWriter, signature string, depositAddr string) { - enc := json.NewEncoder(w) - response := AcceptResPegOut{ - Signature: signature, - LbcAddress: depositAddr, - } - - err := enc.Encode(response) - if err != nil { - const errorMsg = "AcceptQuotePegout - error encoding response: " - log.Error(errorMsg, err.Error()) - customError := NewServerError(errorMsg+err.Error(), make(map[string]interface{}), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } -} - -type SendBTCReq struct { - Amount uint64 `json:"amount"` - To string `json:"to"` -} - -type RegisterPegOutReg struct { - quote *pegout.Quote - signature string -} - -type AddCollateralRequest struct { - Amount uint64 `json:"amount" validate:"required" example:"100000000000" description:"Amount to add to the collateral"` - LpRskAddress string `json:"lpRskAddress" validate:"required,eth_addr" example:"0x0" description:"Liquidity Provider RSK Address"` -} - -type AddCollateralResponse struct { - NewCollateralBalance uint64 `json:"newCollateralBalance" example:"100000000000" description:"New Collateral Balance` -} - -// @Title Add PegIn Collateral -// @Description Adds PegIn Collateral -// @Param AddCollateralRequest body AddCollateralRequest true "Add Collateral Request" -// @Success 200 object AddCollateralResponse -// @Route /pegin/addCollateral [post] -func (s *Server) addPeginCollateralHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - payload := AddCollateralRequest{} - decoder := json.NewDecoder(r.Body) - err := decoder.Decode(&payload) - - if err != nil { - customError := NewServerError(fmt.Sprintf(UnableToDeserializePayloadError, err.Error()), make(Details), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - if isValid := Validate(payload)(w); !isValid { - return - } - - lp := pegin.GetPeginProviderByAddress(s.provider, payload.LpRskAddress) - if lp == nil { - customError := NewServerError("missing liquidity provider", make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - - s.addCollateral(true, w, lp.Address(), lp.SignTx, payload.Amount) -} - -// @Title Add PegOut Collateral -// @Description Adds PegOut Collateral -// @Param AddCollateralRequest body AddCollateralRequest true "Add Collateral Request" -// @Success 200 object AddCollateralResponse -// @Route /pegout/addCollateral [post] -func (s *Server) addPegoutCollateralHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - payload := AddCollateralRequest{} - decoder := json.NewDecoder(r.Body) - err := decoder.Decode(&payload) - - if err != nil { - customError := NewServerError(fmt.Sprintf(UnableToDeserializePayloadError, err.Error()), make(Details), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - if isValid := Validate(payload)(w); !isValid { - return - } - - lp := pegout.GetPegoutProviderByAddress(s.pegoutProvider, payload.LpRskAddress) - if lp == nil { - customError := NewServerError("missing liquidity provider", make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - - s.addCollateral(false, w, lp.Address(), lp.SignTx, payload.Amount) -} - -func (s *Server) addCollateral(isPegin bool, w http.ResponseWriter, addrStr string, signerFn bind.SignerFn, amount uint64) { - var collateral, min *big.Int - var err error - if isPegin { - collateral, min, err = s.rsk.GetCollateral(addrStr) - } else { - collateral, min, err = s.rsk.GetPegoutCollateral(addrStr) - } - - if err != nil { - log.Error(err) - customError := NewServerError(GetCollateralError, *NewBasicDetail(err), false) - ResponseError(w, customError, http.StatusInternalServerError) - return - } else if collateral.Uint64()+amount < min.Uint64() { - customError := NewServerError("Amount is lower than min collateral", make(Details), true) - ResponseError(w, customError, http.StatusConflict) - return - } - - opts := &bind.TransactOpts{ - Value: big.NewInt(int64(amount)), - From: common.HexToAddress(addrStr), - Signer: signerFn, - } - - if isPegin { - err = s.rsk.AddCollateral(opts) - } else { - err = s.rsk.AddPegoutCollateral(opts) - } - - if err != nil { - log.Error(err) - customError := NewServerError(GetCollateralError, *NewBasicDetail(err), false) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - if isPegin { - collateral, _, err = s.rsk.GetCollateral(addrStr) - } else { - collateral, _, err = s.rsk.GetPegoutCollateral(addrStr) - } - if err != nil { - log.Error(err) - customError := NewServerError(GetCollateralError, *NewBasicDetail(err), false) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - response := &AddCollateralResponse{ - NewCollateralBalance: collateral.Uint64(), - } - - JsonResponse(w, http.StatusOK, &response) -} - -type WithdrawCollateralRequest struct { - LpRskAddress string `json:"lpRskAddress" validate:"required,eth_addr"` -} - -// @Title Withdraw PegIn Collateral -// @Description Withdraw PegIn collateral of a resigned LP -// @Param WithdrawCollateralRequest body WithdrawCollateralRequest true "Withdraw Collateral Request" -// @Route /pegin/withdrawCollateral [post] -// @Success 204 object -func (s *Server) withdrawPeginCollateralHandler(w http.ResponseWriter, r *http.Request) { - payload := WithdrawCollateralRequest{} - - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - buildErrorDecodingRequest(w, err) - return - } - if isValid := Validate(payload)(w); !isValid { - return - } - - opts, err := pegin.GetPeginProviderTransactOpts(s.provider, payload.LpRskAddress) - if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - - err = s.rsk.WithdrawCollateral(opts) - withdrawCollateralResponse(w, err) -} - -// @Title Withdraw PegOut Collateral -// @Description Withdraw PegOut collateral of a resigned LP -// @Param WithdrawCollateralRequest body WithdrawCollateralRequest true "Withdraw Collateral Request" -// @Route /pegout/withdrawCollateral [post] -// @Success 204 object -func (s *Server) withdrawPegoutCollateralHandler(w http.ResponseWriter, r *http.Request) { - payload := WithdrawCollateralRequest{} - - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - buildErrorDecodingRequest(w, err) - return - } - if isValid := Validate(payload)(w); !isValid { - return - } - - lp := pegout.GetPegoutProviderByAddress(s.pegoutProvider, payload.LpRskAddress) - if lp == nil { - customError := NewServerError("liquidity provider not found", make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - opts := &bind.TransactOpts{ - From: common.HexToAddress(lp.Address()), - Signer: lp.SignTx, - } - - err := s.rsk.WithdrawPegoutCollateral(opts) - withdrawCollateralResponse(w, err) -} - -func withdrawCollateralResponse(w http.ResponseWriter, err error) { - if err != nil && errors.Is(err, connectors.WithdrawCollateralError) { - customError := NewServerError(fmt.Sprintf("%s, please complete resign proccess first", err.Error()), make(Details), true) - ResponseError(w, customError, http.StatusConflict) - } else if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - } else { - w.WriteHeader(http.StatusNoContent) - } -} - -type GetCollateralResponse struct { - Collateral uint64 `json:"collateral"` -} - -// @Title Get PegIn Collateral -// @Description Get PegIn Collateral -// @Param address path string true "Liquidity provider address" -// @Success 200 object GetCollateralResponse -// @Route /pegin/collateral/{address} [get] -func (s *Server) getCollateralHandler(w http.ResponseWriter, request *http.Request) { - address := request.URL.Query().Get("address") - collateral, _, err := s.rsk.GetCollateral(address) - handleCollateralResponse(w, collateral, err) -} - -// @Title Get PegOut Collateral -// @Description Get PegOut Collateral -// @Param address path string true "Liquidity provider address" -// @Success 200 object GetCollateralResponse -// @Route /pegout/collateral/{address} [get] -func (s *Server) getPegoutCollateralHandler(w http.ResponseWriter, request *http.Request) { - address := request.URL.Query().Get("address") - collateral, _, err := s.rsk.GetPegoutCollateral(address) - handleCollateralResponse(w, collateral, err) -} - -func handleCollateralResponse(w http.ResponseWriter, collateral *big.Int, err error) { - var e *connectors.AddressError - if err != nil && errors.As(err, &e) { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusBadRequest) - } else if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - } else if collateral.Uint64() == 0 { - customError := NewServerError("no collateral found", make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - } else { - response := &GetCollateralResponse{Collateral: collateral.Uint64()} - JsonResponse(w, http.StatusOK, response) - } -} - -type ProviderResignRequest struct { - LpRskAddress string `json:"lpRskAddress" validate:"required,eth_addr"` -} - -// @Title Provider resignation -// @Description Provider stops being a liquidity provider -// @Param ProviderResignRequest body ProviderResignRequest true "Provider Resignation Request" -// @Route /provider/resignation [post] -// @Success 204 object -func (s *Server) providerResignHandler(w http.ResponseWriter, r *http.Request) { - payload := ProviderResignRequest{} - - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - buildErrorDecodingRequest(w, err) - return - } - if isValid := Validate(payload)(w); !isValid { - return - } - - opts, err := pegin.GetPeginProviderTransactOpts(s.provider, payload.LpRskAddress) - if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - - err = s.rsk.Resign(opts) - if err != nil && errors.Is(err, connectors.ProviderResignError) { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusConflict) - } else if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusInternalServerError) - } else { - w.WriteHeader(http.StatusNoContent) - } -} - -// @Title GetUserQuotes -// @Description Returns user quotes for address. -// @Param UserQuoteRequest query types.UserQuoteRequest true "User Quote Request Details" -// @Success 200 {array} pegout.DepositEvent "Successfully retrieved the user quotes" -// @Router /userQuotes [get] -func (s *Server) getUserQuotesHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - - address := r.URL.Query().Get("address") - if address == "" { - http.Error(w, "address parameter is required", http.StatusBadRequest) - return - } - - events, err := s.dbMongo.GetDepositEvents(address) - if err != nil { - log.Error("error getting user quotes: ", err.Error()) - } - if events == nil { - events = []*pegout.DepositEvent{} - } - enc := json.NewEncoder(w) - err = enc.Encode(&events) - if err != nil { - log.Error("error encoding user events") - return - } -} - -type ProviderDetail struct { - Fee uint64 `json:"fee" required:""` - MinTransactionValue uint64 `json:"minTransactionValue" required:""` - MaxTransactionValue uint64 `json:"maxTransactionValue" required:""` - RequiredConfirmations uint16 `json:"requiredConfirmations" required:""` -} - -type ProviderDetailResponse struct { - SiteKey string `json:"siteKey" required:""` - Pegin ProviderDetail `json:"pegin" required:""` - Pegout ProviderDetail `json:"pegout" required:""` -} - -// @Title Provider detail -// @Description Returns the details of the provider that manages this instance of LPS -// @Param UserQuoteRequest query types.UserQuoteRequest true "User Quote Request Details" -// @Success 200 object ProviderDetailResponse "Detail of the provider that manges this instance" -// @Router /providers/details [get] -func (s *Server) providerDetailHandler(w http.ResponseWriter, r *http.Request) { - toRestAPI(w) - - detail := ProviderDetailResponse{ - SiteKey: s.cfgData.CaptchaSiteKey, - Pegin: ProviderDetail{ - Fee: s.ProviderConfig.Fee.Uint64(), - MinTransactionValue: s.ProviderConfig.MinTransactionValue.Uint64(), - MaxTransactionValue: s.ProviderConfig.MaxTransactionValue.Uint64(), - RequiredConfirmations: s.ProviderConfig.MaxConf, - }, - Pegout: ProviderDetail{ - Fee: s.PegoutConfig.Fee.Uint64(), - MinTransactionValue: s.PegoutConfig.MinTransactionValue.Uint64(), - MaxTransactionValue: s.PegoutConfig.MaxTransactionValue.Uint64(), - RequiredConfirmations: s.PegoutConfig.MaxConf, - }, - } - - err := json.NewEncoder(w).Encode(&detail) - if err != nil { - log.Error("error encoding user events") - return - } -} - -// @Title Provider Synchronization -// @Description Synchronizes providers with MongoDB -// @Route /provider/sync [post] -// @Success 204 object -func (s *Server) providerSyncHandler(w http.ResponseWriter, r *http.Request) { - providerIds, err := s.rsk.GetProviderIds() - if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - providersIdList, err := createArrayFromOneToN(providerIds) - if err != nil { - customError := NewServerError(err.Error(), make(Details), true) - ResponseError(w, customError, http.StatusNotFound) - return - } - providers, err := s.rsk.GetProviders(providersIdList) - var providerDTOs []*types.GlobalProvider - for _, provider := range providers { - providerDTOs = append(providerDTOs, toGlobalProvider(&provider)) - } - filteredProviders := filterProvidersByAddress(s.cfgData.RSK.LpsAddress, providerDTOs) - if err != nil { - http.Error(w, UnableToBuildResponse, http.StatusInternalServerError) - return - } - err = s.dbMongo.ResetProviders(filteredProviders) - response := filteredProviders - encoder := json.NewEncoder(w) - err = encoder.Encode(&response) -} - -type CaptchaValidationResponse struct { - Success bool `json:"success"` - Score *float32 `json:"score"` - Action *string `json:"action"` - ChallengeTs time.Time `json:"challenge_ts"` - Hostname string `json:"hostname"` - ErrorCodes []string `json:"error-codes"` -} - -func (s *Server) captchaMiddleware(next http.Handler) http.Handler { - if s.cfgData.CaptchaThreshold < 0.5 { - log.Warn("Too low captcha threshold value!") - } - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("X-Captcha-Token") - disabled, _ := strconv.ParseBool(os.Getenv("DISABLE_CAPTCHA")) - if disabled { - log.Warning("IMPORTANT! Handling request with captcha validation disabled") - next.ServeHTTP(w, r) - return - } else if token == "" { - customError := NewServerError("missing X-Captcha-Token header", make(Details), true) - ResponseError(w, customError, http.StatusBadRequest) - return - } - - form := make(url.Values) - form.Set("secret", s.cfgData.CaptchaSecretKey) - form.Set("response", token) - res, err := http.DefaultClient.PostForm("https://www.google.com/recaptcha/api/siteverify", form) - - if err != nil { - details := make(Details) - details["error"] = err.Error() - customError := NewServerError("error validating captcha", details, false) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - defer res.Body.Close() - - var validation CaptchaValidationResponse - err = json.NewDecoder(res.Body).Decode(&validation) - if err != nil { - customError := NewServerError("error validating captcha", make(Details), false) - ResponseError(w, customError, http.StatusInternalServerError) - return - } - - validCaptcha := validation.Success - if validation.Score != nil { // if is v3 we also use the score - validCaptcha = validCaptcha && *validation.Score >= s.cfgData.CaptchaThreshold - } - - if validCaptcha { - log.Debugf("Valid captcha solved on %s\n", validation.Hostname) - next.ServeHTTP(w, r) - } else { - details := make(Details) - details["errors"] = validation.ErrorCodes - customError := NewServerError("error validating captcha", details, true) - ResponseError(w, customError, http.StatusBadRequest) - } - }) -} - -func (s *Server) corsMiddleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - headers := w.Header() - headers.Add("Access-Control-Allow-Origin", "*") - headers.Add("Vary", "Origin") - headers.Add("Vary", "Access-Control-Request-Method") - headers.Add("Vary", "Access-Control-Request-Headers") - headers.Add("Access-Control-Allow-Headers", "Content-Type, Origin, Accept, token, X-Captcha-Token") - headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS") - next.ServeHTTP(w, r) - }) -} - -func (s *Server) validateAmountForProvider(amount *big.Int, provider *pegin.ProviderConfig) error { - var min, max = provider.MinTransactionValue, provider.MaxTransactionValue - if amount.Cmp(min) < 0 || amount.Cmp(max) > 0 { - return fmt.Errorf("amount out of provider range which is (%d, %d)", min, max) - } - return nil -} - -func filterProvidersByAddress(address string, providers []*types.GlobalProvider) []*types.GlobalProvider { - filteredProviders := make([]*types.GlobalProvider, 0) - lowercaseAddress := strings.ToLower(address) - - for _, provider := range providers { - if strings.ToLower(provider.Provider) == lowercaseAddress { - filteredProviders = append(filteredProviders, provider) - } - } - - return filteredProviders -} -func createArrayFromOneToN(providerIds *big.Int) ([]int64, error) { - n := providerIds.Int64() - if n < 1 { - return nil, fmt.Errorf("The input number should be greater than 0") - } - - array := make([]int64, n) - for i := int64(1); i <= n; i++ { - array[i-1] = i - } - - return array, nil -} -func encrypt(plaintext []byte, key []byte) ([]byte, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - gcm, err := cipher.NewGCM(c) - if err != nil { - return nil, err - } - - nonce := make([]byte, gcm.NonceSize()) - if _, err = io.ReadFull(rand.Reader, nonce); err != nil { - return nil, err - } - - return gcm.Seal(nonce, nonce, plaintext, nil), nil -} - -func decrypt(ciphertext []byte, key []byte) ([]byte, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - gcm, err := cipher.NewGCM(c) - if err != nil { - return nil, err - } - - nonceSize := gcm.NonceSize() - if len(ciphertext) < nonceSize { - return nil, errors.New("ciphertext too short") - } - - nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:] - return gcm.Open(nil, nonce, ciphertext, nil) -} diff --git a/http/server_test.go b/http/server_test.go deleted file mode 100644 index a32412eb..00000000 --- a/http/server_test.go +++ /dev/null @@ -1,972 +0,0 @@ -package http - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "math" - "math/big" - "math/rand" - "net/http" - "net/http/httptest" - "testing" - "time" - - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - "github.com/rsksmart/liquidity-provider-server/storage" - - "github.com/rsksmart/liquidity-provider-server/pegout" - - "github.com/btcsuite/btcd/btcutil" - "github.com/rsksmart/liquidity-provider-server/connectors" - - "github.com/ethereum/go-ethereum/common" - gethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/rsksmart/liquidity-provider-server/http/testmocks" - "github.com/rsksmart/liquidity-provider/types" - "github.com/stretchr/testify/assert" - http2 "github.com/stretchr/testify/http" - "github.com/stretchr/testify/mock" -) - -type basicTestCase struct { - caseName string - request string - assertions func(response *http.Response) -} - -type LiquidityProviderMock struct { - mock.Mock - address string -} - -type LiquidityPegOutProviderMock struct { - mock.Mock - address string -} - -type depositEventWatcherMock struct { - mock.Mock -} - -func (d depositEventWatcherMock) Init(waitingForDepositQuotes, waitingForConfirmationQuotes map[string]*WatchedQuote) { - // mock impl -} - -func (d depositEventWatcherMock) WatchNewQuote(quoteHash, signature string, quote *pegout.Quote) error { - args := d.Called(quoteHash, signature, quote) - return args.Error(0) -} - -func (d depositEventWatcherMock) EndChannel() chan<- bool { - return nil -} - -func (lp LiquidityPegOutProviderMock) GetCreationBlock(quote *pegout.Quote) uint32 { - return 0 -} - -func (lp LiquidityPegOutProviderMock) GetQuote(*pegout.Quote, uint64, uint64, *types.Wei, *bindings.LiquidityBridgeContractLiquidityProvider) (*pegout.Quote, error) { - return &pegout.Quote{}, nil -} - -func (lp LiquidityPegOutProviderMock) SignTx(address common.Address, transaction *gethTypes.Transaction) (*gethTypes.Transaction, error) { - return &gethTypes.Transaction{}, nil -} - -func (lp LiquidityPegOutProviderMock) HasLiquidity(reqLiq *types.Wei) (bool, error) { - args := lp.Called(reqLiq) - return args.Bool(0), args.Error(1) -} - -func (lp LiquidityProviderMock) SignTx(_ common.Address, _ *gethTypes.Transaction) (*gethTypes.Transaction, error) { - return nil, nil -} - -func (lp LiquidityProviderMock) Address() string { - return lp.address -} - -func (lp LiquidityProviderMock) GetQuote(*pegin.Quote, uint64, *types.Wei, *bindings.LiquidityBridgeContractLiquidityProvider) (*pegin.Quote, error) { - res := pegin.Quote{} - res.CallFee = types.NewWei(0) - res.PenaltyFee = types.NewWei(0) - return &res, nil -} - -func (lp LiquidityProviderMock) HasLiquidity(reqLiq *types.Wei) (bool, error) { - arg := lp.Called(reqLiq) - return arg.Bool(0), arg.Error(1) -} - -func (lp LiquidityProviderMock) SignQuote(_ []byte, _, flyoverRedeemScript string, _ *types.Wei) ([]byte, error) { - return []byte("fb4a3e40390dee7db6e861e10e5e3b39a0cf546eeccc8c0902249419140d9f29335023e3a83deee747f4987e9cd32773d2afa5176295dc2042255b57a30300201c"), nil -} - -func (lp LiquidityPegOutProviderMock) SignQuote(hash []byte, depositAddr string, satoshis uint64) ([]byte, error) { - return hex.DecodeString("fb4a3e40390dee7db6e861e10e5e3b39a0cf546eeccc8c0902249419140d9f29335023e3a83deee747f4987e9cd32773d2afa5176295dc2042255b57a30300201c") -} - -func (lp LiquidityPegOutProviderMock) Address() string { - return lp.address -} - -var providerMocks = []LiquidityProviderMock{ - {address: "123"}, - {address: "0x00d80aA033fb51F191563B08Dc035fA128e942C5"}, -} - -var providerPegOutMocks = []LiquidityPegOutProviderMock{ - {address: "456"}, - {address: "0xa554d96413FF72E93437C4072438302C38350EE3"}, -} - -var providerCfgData = pegin.ProviderConfig{} - -var cfgData = ConfigData{ - EncryptKey: "abcdefghijklpmop", - RSK: LiquidityProviderList{ - Endpoint: "", - LBCAddr: "", - BridgeAddr: "", - RequiredBridgeConfirmations: 10, - }, -} - -var testQuotes = []*pegin.Quote{ - { - FedBTCAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - LPRSKAddr: "0x00d80aA033fb51F191563B08Dc035fA128e942C5", - BTCRefundAddr: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", - RSKRefundAddr: "0x5F3b836CA64DA03e613887B46f71D168FC8B5Bdf", - LPBTCAddr: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", - CallFee: types.NewWei(250), - PenaltyFee: types.NewWei(5000), - ContractAddr: "0x87136cf829edaF7c46Eb943063369a1C8D4f9085", - Data: "", - GasLimit: 6000000, - Nonce: int64(rand.Int()), - Value: types.NewWei(250), - AgreementTimestamp: 0, - TimeForDeposit: 3600, - LpCallTime: 3600, - Confirmations: 10, - }, -} - -var testPegOutQuotes = []*pegout.Quote{ - { - LBCAddr: "2ff74F841b95E000625b3A77fed03714874C4fEa", - LPRSKAddr: "0xa554d96413FF72E93437C4072438302C38350EE3", - RSKRefundAddr: "0x5F3b836CA64DA03e613887B46f71D168FC8B5Bdf", - CallFee: types.NewWei(250), - PenaltyFee: 5000, - Nonce: int64(rand.Int()), - Value: types.NewWei(250), - AgreementTimestamp: 0, - DepositDateLimit: 0, - DepositConfirmations: 0, - TransferConfirmations: 0, - TransferTime: 0, - ExpireDate: 0, - ExpireBlock: 0, - }, -} - -func testGetProviderByAddress(t *testing.T) { - var liquidityProviders []pegin.LiquidityProvider - for _, providerMock := range providerMocks { - liquidityProviders = append(liquidityProviders, providerMock) - } - - for _, tt := range liquidityProviders { - result := pegin.GetPeginProviderByAddress(liquidityProviders[0], tt.Address()) - assert.EqualValues(t, tt.Address(), result.Address()) - } -} - -func testGetProviderByAddressWhenNotFoundShouldReturnNull(t *testing.T) { - var liquidityProviders []pegin.LiquidityProvider - for _, providerMock := range providerMocks { - liquidityProviders = append(liquidityProviders, providerMock) - } - - var nonLiquidityProviderAddress = "0xa554d96413FF72E93437C4072438302C38350EE3" - result := pegin.GetPeginProviderByAddress(liquidityProviders[0], nonLiquidityProviderAddress) - assert.Empty(t, result) -} - -func testCheckHealth(t *testing.T) { - rsk := new(testmocks.RskMock) - btc := new(testmocks.BtcMock) - lp := new(storage.LPRepository) - mongoDb, _ := testmocks.NewDbMock("", testQuotes[0], nil) - - srv := New(rsk, btc, mongoDb, cfgData, lp, providerCfgData, nil) - - w := http2.TestResponseWriter{} - req, err := http.NewRequest("GET", "health", bytes.NewReader([]byte{})) - if err != nil { - t.Fatalf("couldn't instantiate request. error: %v", err) - } - mongoDb.On("CheckConnection").Return(nil).Times(1) - rsk.On("CheckConnection").Return(nil).Times(1) - btc.On("CheckConnection").Return(nil).Times(1) - srv.checkHealthHandler(&w, req) - mongoDb.AssertExpectations(t) - rsk.AssertExpectations(t) - btc.AssertExpectations(t) - assert.EqualValues(t, 200, w.StatusCode) - assert.EqualValues(t, "application/json", w.Header().Get("Content-Type")) - assert.EqualValues(t, "{\"status\":\"ok\",\"services\":{\"db\":\"ok\",\"rsk\":\"ok\",\"btc\":\"ok\"}}\n", w.Output) - - w = http2.TestResponseWriter{} - req, err = http.NewRequest("GET", "health", bytes.NewReader([]byte{})) - if err != nil { - t.Fatalf("couldn't instantiate request. error: %v", err) - } - mongoDb.On("CheckConnection").Return(errors.New("db error")).Times(1) - rsk.On("CheckConnection").Return(nil).Times(1) - btc.On("CheckConnection").Return(nil).Times(1) - srv.checkHealthHandler(&w, req) - mongoDb.AssertExpectations(t) - rsk.AssertExpectations(t) - btc.AssertExpectations(t) - assert.EqualValues(t, 200, w.StatusCode) - assert.EqualValues(t, "application/json", w.Header().Get("Content-Type")) - assert.EqualValues(t, "{\"status\":\"degraded\",\"services\":{\"db\":\"unreachable\",\"rsk\":\"ok\",\"btc\":\"ok\"}}\n", w.Output) - - w = http2.TestResponseWriter{} - req, err = http.NewRequest("GET", "health", bytes.NewReader([]byte{})) - if err != nil { - t.Fatalf("couldn't instantiate request. error: %v", err) - } - mongoDb.On("CheckConnection").Return(errors.New("db error")).Times(1) - rsk.On("CheckConnection").Return(errors.New("rsk error")).Times(1) - btc.On("CheckConnection").Return(errors.New("btc error")).Times(1) - srv.checkHealthHandler(&w, req) - mongoDb.AssertExpectations(t) - rsk.AssertExpectations(t) - btc.AssertExpectations(t) - assert.EqualValues(t, 200, w.StatusCode) - assert.EqualValues(t, "application/json", w.Header().Get("Content-Type")) - assert.EqualValues(t, "{\"status\":\"degraded\",\"services\":{\"db\":\"unreachable\",\"rsk\":\"unreachable\",\"btc\":\"unreachable\"}}\n", w.Output) -} - -func testGetQuoteComplete(t *testing.T) { - quote := testQuotes[0] - callContractArgumentsField := `"callContractArguments":"%v",` - basicQuoteFields := `"callEoaOrContractAddress":"%v","valueToTransfer":%v,` + - `"rskRefundAddress":"%v", "bitcoinRefundAddress":"%v"` - - rsk := new(testmocks.RskMock) - btc := new(testmocks.BtcMock) - lpRepo := new(storage.LPRepository) - mongoDb, _ := testmocks.NewDbMock("", quote, nil) - - srv := New(rsk, btc, mongoDb, cfgData, lpRepo, providerCfgData, nil) - - detailMock := types.ProviderRegisterRequest{} - for _, lp := range providerMocks { - rsk.On("GetCollateral", lp.address).Return(big.NewInt(10), big.NewInt(10), nil) - rsk.On("RegisterProvider", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(1, nil) - mongoDb.On("InsertProvider", mock.Anything, mock.Anything).Return(nil) - err := srv.AddProvider(lp, detailMock) - if err != nil { - t.Fatalf("couldn't add provider. error: %v", err) - } - } - - destAddrEOA := "0x63C46fBf3183B0a230833a7076128bdf3D5Bc03F" - destAddrSC := "0x63C46fBf3183B0a230833a7076128bdf3D5Bc04F" - callArgs := "0x" - value := quote.Value - rskRefAddrEOA := "0x9d93929a9099be4355fc2389fbf253982f9df47c" - rskRefAddrSC := "0x1eD614cd3443EFd9c70F04b6d777aed947A4b0c4" - btcRefAddr := "myCqdohiF3cvopyoPMB2rGTrJZx9jJ2ihT" - - eoaQuote := PeginQuoteDTO{ - FedBTCAddr: "", - LBCAddr: "", - LPRSKAddr: "", - BTCRefundAddr: btcRefAddr, - RSKRefundAddr: rskRefAddrEOA, - LPBTCAddr: "", - CallFee: 0, - PenaltyFee: 0, - Nonce: 0, - Value: value.Uint64(), - AgreementTimestamp: 0, - TimeForDeposit: 0, - LpCallTime: 0, - Confirmations: 0, - GasLimit: 10000, - ContractAddr: rskRefAddrEOA, - } - - scQuoteCallContractEoa := eoaQuote - scQuoteCallContractEoa.RSKRefundAddr = rskRefAddrSC - scQuoteCallContractEoa.ContractAddr = destAddrEOA - - scQuoteCallContractSc := eoaQuote - scQuoteCallContractSc.RSKRefundAddr = rskRefAddrSC - scQuoteCallContractSc.ContractAddr = destAddrSC - scQuoteCallContractSc.Data = callArgs - - defaultMocks := func(rskMock *testmocks.RskMock, btcMock *testmocks.BtcMock, dbMock *testmocks.DbMock) { - rskMock.On("EstimateGas", mock.Anything, value.AsBigInt(), mock.Anything).Times(1) - rskMock.On("GasPrice").Times(1) - rskMock.On("GetFedAddress").Times(1) - rskMock.On("GetLBCAddress").Times(1) - rskMock.On("IsEOA", "").Return(false, errors.New("invalid address")) - rskMock.On("IsEOA", rskRefAddrEOA).Return(true, nil) - rskMock.On("IsEOA", destAddrEOA).Return(true, nil) - rskMock.On("IsEOA", destAddrSC).Return(false, nil) - rskMock.On("IsEOA", rskRefAddrSC).Return(false, nil) - rskMock.On("GetMinimumLockTxValue").Return(big.NewInt(0), nil).Times(1) - rskMock.On("HashQuote", mock.Anything).Times(len(providerMocks)).Return("", nil) - rskMock.On("HashQuote", mock.Anything).Times(len(providerMocks)).Return("", nil) - rskMock.On("GetProviders", mock.Anything).Return( - []bindings.LiquidityBridgeContractLiquidityProvider{{MinTransactionValue: big.NewInt(1), MaxTransactionValue: big.NewInt(1000000000)}}, - nil) - dbMock.On("InsertQuote", "", mock.Anything).Times(len(providerMocks)).Return(quote) - dbMock.On("GetProviders").Return([]*mongoDB.ProviderAddress{{Id: 1, Provider: "0x123456789"}}, nil) - } - - testCases := []*struct { - basicTestCase - customMocks func(rskMock *testmocks.RskMock, btcMock *testmocks.BtcMock, dbMock *testmocks.DbMock) - }{ - { - basicTestCase: basicTestCase{ - caseName: "Return error when requested amount below bridge's min pegin tx value", - request: fmt.Sprintf("{"+basicQuoteFields+"}", - destAddrEOA, value, rskRefAddrEOA, btcRefAddr, - ), - assertions: func(res *http.Response) { - response := &ErrorBody{} - json.NewDecoder(res.Body).Decode(response) - assert.EqualValues(t, "application/json", res.Header.Get("Content-Type")) - assert.EqualValues(t, 400, res.StatusCode) - assert.EqualValues(t, "requested amount below bridge's min pegin tx value", response.Message) - }, - }, - customMocks: func(rskMock *testmocks.RskMock, btcMock *testmocks.BtcMock, dbMock *testmocks.DbMock) { - rsk.On("GetMinimumLockTxValue").Return(new(big.Int).Add(big.NewInt(-1), new(big.Int).Add(quote.Value.AsBigInt(), quote.CallFee.AsBigInt())), nil).Times(1) - }, - }, - { - basicTestCase: basicTestCase{ - caseName: "Return quote successfully for EOA origin", - request: fmt.Sprintf("{"+basicQuoteFields+"}", - rskRefAddrEOA, value, rskRefAddrEOA, btcRefAddr, - ), - assertions: func(res *http.Response) { - var response []*QuoteReturn - json.NewDecoder(res.Body).Decode(&response) - assert.EqualValues(t, "application/json", res.Header.Get("Content-Type")) - assert.EqualValues(t, 200, res.StatusCode) - assert.EqualValues(t, eoaQuote, *response[0].Quote) - }, - }, - }, - { - basicTestCase: basicTestCase{ - caseName: "Return quote successfully for SC origin and SC call contract address", - request: fmt.Sprintf("{"+callContractArgumentsField+basicQuoteFields+"}", - callArgs, destAddrSC, value, rskRefAddrSC, btcRefAddr, - ), - assertions: func(res *http.Response) { - var response []*QuoteReturn - json.NewDecoder(res.Body).Decode(&response) - assert.EqualValues(t, "application/json", res.Header.Get("Content-Type")) - assert.EqualValues(t, 200, res.StatusCode) - assert.EqualValues(t, scQuoteCallContractSc, *response[0].Quote) - }, - }, - }, - { - basicTestCase: basicTestCase{ - caseName: "Return quote successfully for SC origin and EOA call contract address", - request: fmt.Sprintf("{"+basicQuoteFields+"}", - destAddrEOA, value, rskRefAddrSC, btcRefAddr, - ), - assertions: func(res *http.Response) { - var response []*QuoteReturn - json.NewDecoder(res.Body).Decode(&response) - assert.EqualValues(t, "application/json", res.Header.Get("Content-Type")) - assert.EqualValues(t, 200, res.StatusCode) - assert.EqualValues(t, scQuoteCallContractEoa, *response[0].Quote) - }, - }, - }, - { - basicTestCase: basicTestCase{ - caseName: "Return error when transfer value is too high", - request: fmt.Sprintf("{"+basicQuoteFields+"}", - destAddrEOA, 600000000000000001, rskRefAddrEOA, btcRefAddr, - ), - assertions: func(res *http.Response) { - response := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&response) - assert.EqualValues(t, "application/json", res.Header.Get("Content-Type")) - assert.EqualValues(t, 400, res.StatusCode) - assert.EqualValues(t, "amount out of provider range which is [1, 1000000000]", response.Message) - }, - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - req, err := http.NewRequest("POST", "getQuote", bytes.NewReader([]byte(test.request))) - if err != nil { - t.Fatalf("couldn't instantiate request. error: %v", err) - } - if test.customMocks != nil { - test.customMocks(rsk, btc, mongoDb) - } - defaultMocks(rsk, btc, mongoDb) - rr := httptest.NewRecorder() - - srv.getQuoteHandler(rr, req) - test.assertions(rr.Result()) - - rsk.Calls = []mock.Call{} - btc.Calls = []mock.Call{} - mongoDb.Calls = []mock.Call{} - }) - } - -} - -func testAcceptQuoteComplete(t *testing.T) { - for _, quote := range testQuotes { - hash := "555c9cfba7638a40a71a17a34fef0c3e192c1fbf4b311ad6e2ae288e97794228" - rsk := new(testmocks.RskMock) - btc := new(testmocks.BtcMock) - lpRepo := new(storage.LPRepository) - mongoDb, _ := testmocks.NewDbMock("", quote, nil) - sat, _ := new(types.Wei).Add(quote.Value, quote.CallFee).ToSatoshi().Float64() - minAmount := btcutil.Amount(uint64(math.Ceil(sat))) - expTime := time.Unix(int64(quote.AgreementTimestamp+quote.TimeForDeposit), 0) - fedInfo := &connectors.FedInfo{} - - srv := newServer(rsk, btc, mongoDb, func() time.Time { - return time.Unix(0, 0) - }, cfgData, lpRepo, providerCfgData, nil) - - detailMock := types.ProviderRegisterRequest{} - for _, lp := range providerMocks { - rsk.On("GetCollateral", lp.address).Times(1).Return(big.NewInt(10), big.NewInt(10), nil) - rsk.On("GetCollateral", lp.address).Return(big.NewInt(10), big.NewInt(10), nil) - rsk.On("RegisterProvider", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(1, nil) - mongoDb.On("InsertProvider", mock.Anything, mock.Anything).Return(nil) - err := srv.AddProvider(lp, detailMock) - if err != nil { - t.Errorf("couldn't add provider. error: %v", err) - } - } - w := http2.TestResponseWriter{} - body := fmt.Sprintf("{\"quoteHash\":\"%v\"}", hash) - - btcRefAddr, lpBTCAddr, lbcAddr, err := decodeAddresses(quote.BTCRefundAddr, quote.LPBTCAddr, quote.LBCAddr) - if err != nil { - t.Errorf("couldn't decode addresses. error: %v", err) - } - req, err := http.NewRequest("POST", "acceptQuote", bytes.NewReader([]byte(body))) - if err != nil { - t.Errorf("couldn't instantiate request. error: %v", err) - } - hashBytes, err := hex.DecodeString(hash) - if err != nil { - t.Errorf("couldn't decode hash. error: %v", err) - } - - mongoDb.On("GetQuote", hash).Times(1).Return(quote, nil) - mongoDb.On("GetRetainedQuote", hash).Times(1).Return(nil, nil) - rsk.On("GasPrice").Times(1) - rsk.On("FetchFederationInfo").Times(1).Return(fedInfo, nil) - btc.On("GetParams") - rsk.On("GetDerivedBitcoinAddress", fedInfo, nil, btcRefAddr, lbcAddr, lpBTCAddr, hashBytes) - btc.On("AddAddressWatcher", "", minAmount, time.Minute, expTime, mock.AnythingOfType("*http.BTCAddressWatcher"), mock.AnythingOfType("func(connectors.AddressWatcher)")) - srv.acceptQuoteHandler(&w, req) - mongoDb.AssertExpectations(t) - btc.AssertExpectations(t) - rsk.AssertExpectations(t) - assert.EqualValues(t, "application/json", w.Header().Get("Content-Type")) - } -} - -func testInitPeginWatchers(t *testing.T) { - hash := "555c9cfba7638a40a71a17a34fef0c3e192c1fbf4b311ad6e2ae288e97794228" - quote := testQuotes[0] - rsk := new(testmocks.RskMock) - btc := new(testmocks.BtcMock) - lp := new(storage.LPRepository) - mongoDb, _ := testmocks.NewDbMock(hash, quote, nil) - sat, _ := new(types.Wei).Add(quote.Value, quote.CallFee).ToSatoshi().Float64() - minAmount := btcutil.Amount(uint64(math.Ceil(sat))) - expTime := time.Unix(int64(quote.AgreementTimestamp+quote.TimeForDeposit), 0) - - srv := newServer(rsk, btc, mongoDb, func() time.Time { - return time.Unix(0, 0) - }, cfgData, lp, providerCfgData, nil) - - detailMock := types.ProviderRegisterRequest{} - for _, lp := range providerMocks { - rsk.On("GetCollateral", lp.address).Times(1).Return(big.NewInt(10), big.NewInt(10), nil) - rsk.On("GetCollateral", lp.address).Return(big.NewInt(10), big.NewInt(10), nil) - rsk.On("RegisterProvider", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(1, nil) - mongoDb.On("InsertProvider", mock.Anything, mock.Anything).Return(nil) - err := srv.AddProvider(lp, detailMock) - if err != nil { - t.Errorf("couldn't add provider. error: %v", err) - } - } - - mongoDb.On("GetRetainedQuotes", []types.RQState{types.RQStateWaitingForDeposit, types.RQStateCallForUserSucceeded}).Times(1).Return([]*types.RetainedQuote{{QuoteHash: hash}}) - mongoDb.On("GetQuote", hash).Times(1).Return(quote) - btc.On("AddAddressWatcher", "", minAmount, time.Minute, expTime, mock.AnythingOfType("*http.BTCAddressWatcher"), mock.AnythingOfType("func(connectors.AddressWatcher)")).Times(1).Return("") - err := srv.initPeginWatchers() - if err != nil { - t.Errorf("couldn't init BTC watchers. error: %v", err) - } - mongoDb.AssertExpectations(t) - btc.AssertExpectations(t) - rsk.AssertExpectations(t) -} - -func testGetQuoteExpTime(t *testing.T) { - quote := pegin.Quote{AgreementTimestamp: 2, TimeForDeposit: 3} - expTime := getQuoteExpTime("e) - assert.Equal(t, time.Unix(5, 0), expTime) -} - -func testDecodeAddress(t *testing.T) { - _, _, _, err := decodeAddresses("1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK", "1JRRmhqTc87SmLjSHaiJjHyuJfDUc8AQDF", "0xa554d96413FF72E93437C4072438302C38350EE3") - assert.Empty(t, err) -} - -func testDecodeAddressWithAnInvalidBtcRefundAddr(t *testing.T) { - _, _, _, err := decodeAddresses("0xa554d96413FF72E93437C4072438302C38350EE3", "1JRRmhqTc87SmLjSHaiJjHyuJfDUc8AQDF", "0xa554d96413FF72E93437C4072438302C38350EE3") - assert.Equal(t, "the provider address is not a valid Bech32 or base58 encoded address. address: 0xa554d96413FF72E93437C4072438302C38350EE3", err.Error()) -} - -func testDecodeAddressWithAnInvalidLpBTCAddrB(t *testing.T) { - _, _, _, err := decodeAddresses("1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK", "0xa554d96413FF72E93437C4072438302C38350EE3", "0xa554d96413FF72E93437C4072438302C38350EE3") - assert.Equal(t, "the provider address is not a valid Bech32 or base58 encoded address. address: 0xa554d96413FF72E93437C4072438302C38350EE3", err.Error()) -} - -func testDecodeAddressWithAnInvalidLbcAddrB(t *testing.T) { - _, _, _, err := decodeAddresses("1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK", "1JRRmhqTc87SmLjSHaiJjHyuJfDUc8AQDF", "1JRRmhqTc87SmLjSHaiJjHyuJfDUc8AQDF") - assert.Equal(t, "invalid address: 1JRRmhqTc87SmLjSHaiJjHyuJfDUc8AQDF", err.Error()) -} - -func testGetProviders(t *testing.T) { - rsk := new(testmocks.RskMock) - btc := new(testmocks.BtcMock) - lp := new(storage.LPRepository) - - mongoDb, _ := testmocks.NewDbMock("", testQuotes[0], nil) - - srv := New(rsk, btc, mongoDb, cfgData, lp, providerCfgData, nil) - req, err := http.NewRequest("GET", "getProviders", bytes.NewReader([]byte(""))) - w := http2.TestResponseWriter{} - - if err != nil { - t.Fatalf("couldn't instantiate request. error: %v", err) - } - - mongoDb.On("GetProviders").Return([]*mongoDB.ProviderAddress{}, nil) - rsk.On("GetProviders", mock.Anything).Return([]bindings.LiquidityBridgeContractLiquidityProvider{}, nil) - srv.getProvidersHandler(&w, req) - - assert.EqualValues(t, "application/json", w.Header().Get("Content-Type")) - assert.EqualValues(t, "[]\n", w.Output) -} - -func testcAcceptQuotePegoutComplete(t *testing.T) { - for _, quote := range testPegOutQuotes { - hash := "555c9cfba7638a40a71a17a34fef0c3e192c1fbf4b311ad6e2ae288e97794228" - rsk := new(testmocks.RskMock) - btc := new(testmocks.BtcMock) - lp := new(storage.LPRepository) - - mongoDb, _ := testmocks.NewDbMock("", nil, quote) - srv := newServer(rsk, btc, mongoDb, func() time.Time { - return time.Unix(0, 0) - }, cfgData, lp, providerCfgData, nil) - - watcher := &depositEventWatcherMock{} - srv.pegOutDepositWatcher = watcher - - detailMock := types.ProviderRegisterRequest{} - for _, lp := range providerPegOutMocks { - rsk.On("GetCollateral", lp.address).Return(big.NewInt(10), big.NewInt(10), nil) - rsk.On("RegisterProvider", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(1, nil) - mongoDb.On("InsertProvider", mock.Anything, mock.Anything).Return(nil) - err := srv.AddPegOutProvider(lp, detailMock) - if err != nil { - t.Fatalf("couldn't add provider. error: %v", err) - } - } - - w := http2.TestResponseWriter{} - body := fmt.Sprintf("{\"quoteHash\":\"%v\"}", hash) - - req, err := http.NewRequest("POST", "pegout/acceptQuote", bytes.NewReader([]byte(body))) - if err != nil { - t.Errorf("couldn't instantiate request. error: %v", err) - } - - mongoDb.On("GetPegOutQuote", hash).Times(1).Return(quote, nil).Once() - mongoDb.On("GetRetainedPegOutQuote", hash).Times(1).Return(nil, nil).Once() - rsk.On("GasPrice").Return(big.NewInt(5), nil).Once() - rsk.On("GetLBCAddress").Return("0x2ff74F841b95E000625b3A77fed03714874C4fEa") - watcher.On("WatchNewQuote", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() - srv.acceptQuotePegOutHandler(&w, req) - response := acceptResPegOut{} - json.Unmarshal([]byte(w.Output), &response) - assert.Equal(t, "fb4a3e40390dee7db6e861e10e5e3b39a0cf546eeccc8c0902249419140d9f29335023e3a83deee747f4987e9cd32773d2afa5176295dc2042255b57a30300201c", response.Signature) - assert.NotEmpty(t, response.LbcAddress) - mongoDb.AssertExpectations(t) - rsk.AssertExpectations(t) - btc.AssertExpectations(t) - } -} - -func testAddCollateral(t *testing.T) { - rsk := new(testmocks.RskMock) - srv := New(rsk, nil, nil, cfgData, nil, providerCfgData, nil) - - srv.provider = providerMocks[0] - - rsk.On("AddCollateral", mock.Anything).Return(nil).Once() - rsk.On("GetCollateral", mock.Anything).Return(big.NewInt(2), big.NewInt(4), nil).Once() - rsk.On("GetCollateral", providerMocks[1].address).Return(big.NewInt(7), big.NewInt(4), nil) - - testCases := []*basicTestCase{ - { - caseName: "Returns 400 on missing address", - request: fmt.Sprintf(`{"amount": %v}`, 5), - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.EqualValues(t, "LpRskAddress is required", body.Message) - }, - }, - { - caseName: "Returns 400 on missing amount", - request: fmt.Sprintf(`{"lpRskAddress": "%v"}`, providerMocks[1].address), - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.EqualValues(t, "Amount is required", body.Message) - }, - }, - { - caseName: "Returns 400 on decoding error", - request: fmt.Sprint(""), - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.Contains(t, body.Message, "Unable to deserialize payload") - }, - }, - { - caseName: "Returns 400 on invalid address", - request: fmt.Sprintf(`{"lpRskAddress": "%v", "amount": %v}`, providerMocks[0].address, 5), - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.EqualValues(t, "LpRskAddress is eth_addr", body.Message) - }, - }, - { - caseName: "Returns 409 on non registered provider", - request: fmt.Sprintf(`{"lpRskAddress": "%v", "amount": %v}`, "0x9D93929A9099be4355fC2389FbF253982F9dF47c", 5), - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusNotFound, res.StatusCode) - assert.EqualValues(t, "missing liquidity provider", body.Message) - }, - }, - { - caseName: "Returns 409 on when provided collateral is lower than minimal", - request: fmt.Sprintf(`{"lpRskAddress": "%v", "amount": %v}`, providerMocks[1].address, 1), - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusConflict, res.StatusCode) - assert.EqualValues(t, "Amount is lower than min collateral", body.Message) - }, - }, - { - caseName: "Returns 200 on successful add", - request: fmt.Sprintf(`{"lpRskAddress": "%v", "amount": %v}`, providerMocks[1].address, 5), - assertions: func(res *http.Response) { - body := &AddCollateralResponse{} - json.NewDecoder(res.Body).Decode(&body) - assert.EqualValues(t, http.StatusOK, res.StatusCode) - assert.EqualValues(t, uint64(7), body.NewCollateralBalance) - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - req, err := http.NewRequest("POST", "addCollateral", bytes.NewReader([]byte(test.request))) - if err != nil { - t.Fatalf("couldn't instantiate request. error: %v", err) - } - rr := httptest.NewRecorder() - srv.addPeginCollateralHandler(rr, req) - test.assertions(rr.Result()) - rsk.Calls = []mock.Call{} - }) - } -} - -func testGetCollateral(t *testing.T) { - rsk := new(testmocks.RskMock) - srv := New(rsk, nil, nil, cfgData, nil, providerCfgData, nil) - - srv.provider = providerMocks[0] - - rsk.On("GetCollateral", providerMocks[0].address).Return(big.NewInt(0), big.NewInt(4), nil).Once() - rsk.On("GetCollateral", providerMocks[0].address).Return(nil, nil, errors.New("some error")) - rsk.On("GetCollateral", providerMocks[1].address).Return(big.NewInt(300), big.NewInt(4), nil) - rsk.On("GetCollateral", "anything").Return(nil, nil, connectors.NewInvalidAddressError("anything")) - - testCases := []*basicTestCase{ - { - caseName: "Fail on invalid address", - request: "anything", - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.Contains(t, body.Message, "invalid address") - }, - }, - { - caseName: "Return 404 when no collateral is found", - request: providerMocks[0].address, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusNotFound, res.StatusCode) - assert.EqualValues(t, body.Message, "no collateral found") - }, - }, - { - caseName: "Return collateral successfully", - request: providerMocks[1].address, - assertions: func(res *http.Response) { - body := &GetCollateralResponse{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusOK, res.StatusCode) - assert.EqualValues(t, uint64(300), body.Collateral) - }, - }, - { - caseName: "Return 500 on get collateral error", - request: providerMocks[0].address, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusInternalServerError, res.StatusCode) - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - req, err := http.NewRequest("GET", fmt.Sprintf("collateral?address=%s", test.request), nil) - if err != nil { - t.Fatalf("Error creating request: %v", err) - } - rr := httptest.NewRecorder() - srv.getCollateralHandler(rr, req) - test.assertions(rr.Result()) - }) - } -} - -func testWithdrawCollateral(t *testing.T) { - request := fmt.Sprintf(`{ "lpRskAddress": "%s" }`, providerMocks[1].address) - - rsk := new(testmocks.RskMock) - srv := New(rsk, nil, nil, cfgData, nil, providerCfgData, nil) - srv.provider = providerMocks[0] - - rsk.On("WithdrawCollateral", mock.Anything).Return(connectors.WithdrawCollateralError).Once() - rsk.On("WithdrawCollateral", mock.Anything).Return(errors.New("some error")).Once() - rsk.On("WithdrawCollateral", mock.Anything).Return(nil).Once() - - testCases := []*basicTestCase{ - { - caseName: "Fail on invalid address", - request: `{ "lpRskAddress": "anything" }`, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.EqualValues(t, body.Message, "LpRskAddress is eth_addr") - }, - }, - { - caseName: "Fail on non registered provider", - request: `{ "lpRskAddress": "0xa554d96413FF72E93437C4072438302C38350EE3" }`, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusNotFound, res.StatusCode) - assert.EqualValues(t, body.Message, "missing liquidity provider") - }, - }, - { - caseName: "Fail when provider didn't resigned", - request: request, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusConflict, res.StatusCode) - assert.Contains(t, body.Message, "withdraw collateral error") - }, - }, - { - caseName: "Fail on transaction error", - request: request, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusInternalServerError, res.StatusCode) - }, - }, - { - caseName: "Return 204 on successful update", - request: request, - assertions: func(res *http.Response) { - assert.EqualValues(t, http.StatusNoContent, res.StatusCode) - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - req, err := http.NewRequest("POST", "withdrawCollateral", bytes.NewReader([]byte(test.request))) - if err != nil { - t.Fatalf("Error creating request: %v", err) - } - rr := httptest.NewRecorder() - srv.withdrawCollateral(rr, req) - test.assertions(rr.Result()) - }) - } -} - -func testProviderResign(t *testing.T) { - request := fmt.Sprintf(`{ "lpRskAddress": "%s" }`, providerMocks[1].address) - - rsk := new(testmocks.RskMock) - srv := New(rsk, nil, nil, cfgData, nil, providerCfgData, nil) - - srv.provider = providerMocks[0] - - rsk.On("Resign", mock.Anything).Return(connectors.ProviderResignError).Once() - rsk.On("Resign", mock.Anything).Return(errors.New("some error")).Once() - rsk.On("Resign", mock.Anything).Return(nil).Once() - - testCases := []*basicTestCase{ - { - caseName: "Fail on invalid address", - request: `{ "lpRskAddress": "dsadasda" }`, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusBadRequest, res.StatusCode) - assert.EqualValues(t, body.Message, "LpRskAddress is eth_addr") - }, - }, - { - caseName: "Fail on non registered provider", - request: `{ "lpRskAddress": "0x1eD614cd3443EFd9c70F04b6d777aed947A4b0c4" }`, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusNotFound, res.StatusCode) - assert.EqualValues(t, body.Message, "missing liquidity provider") - }, - }, - { - caseName: "Fail when provider has resigned before", - request: request, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusConflict, res.StatusCode) - assert.Contains(t, body.Message, "provider has already resigned") - }, - }, - { - caseName: "Fail on transaction error", - request: request, - assertions: func(res *http.Response) { - body := &ErrorBody{} - json.NewDecoder(res.Body).Decode(body) - assert.EqualValues(t, http.StatusInternalServerError, res.StatusCode) - }, - }, - { - caseName: "Return 204 on successful resign", - request: request, - assertions: func(res *http.Response) { - assert.EqualValues(t, http.StatusNoContent, res.StatusCode) - }, - }, - } - - for _, test := range testCases { - t.Run(test.caseName, func(t *testing.T) { - req, err := http.NewRequest("POST", "provider/resignation", bytes.NewReader([]byte(test.request))) - if err != nil { - t.Fatalf("Error creating request: %v", err) - } - rr := httptest.NewRecorder() - srv.providerResignHandler(rr, req) - test.assertions(rr.Result()) - }) - } -} - -func TestLiquidityProviderServer(t *testing.T) { - t.Run("get provider by address", testGetProviderByAddress) - t.Run("check health", testCheckHealth) - t.Run("get provider should return null when provider not found", testGetProviderByAddressWhenNotFoundShouldReturnNull) - t.Run("get quote", testGetQuoteComplete) - t.Run("accept quote", testAcceptQuoteComplete) - t.Run("init BTC watchers", testInitPeginWatchers) - t.Run("get quote exp time", testGetQuoteExpTime) - t.Run("decode address", testDecodeAddress) - t.Run("decode address with an invalid btcRefundAddr", testDecodeAddressWithAnInvalidBtcRefundAddr) - t.Run("decode address with an invalid lpBTCAddrB", testDecodeAddressWithAnInvalidLpBTCAddrB) - t.Run("decode address with an invalid lbcAddrB", testDecodeAddressWithAnInvalidLbcAddrB) - t.Run("get registered providers", testGetProviders) - t.Run("accept quote pegout", testcAcceptQuotePegoutComplete) - t.Run("add collateral", testAddCollateral) - t.Run("get collateral", testGetCollateral) - t.Run("withdraw collateral", testWithdrawCollateral) - t.Run("test provider resign", testProviderResign) -} diff --git a/http/testmocks/btc_mock.go b/http/testmocks/btc_mock.go deleted file mode 100644 index 8e438ac0..00000000 --- a/http/testmocks/btc_mock.go +++ /dev/null @@ -1,114 +0,0 @@ -package testmocks - -import ( - "math/big" - "time" - - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/stretchr/testify/mock" -) - -type BtcMock struct { - mock.Mock -} - -func (b *BtcMock) GetAvailableLiquidity() (*big.Int, error) { - args := b.Called() - return args.Get(0).(*big.Int), args.Error(1) -} - -func (b *BtcMock) AddAddressPegOutWatcher(address string, minBtcAmount btcutil.Amount, interval time.Duration, exp time.Time, w connectors.AddressWatcher, cb connectors.AddressWatcherCompleteCallback) error { - b.Called(address, minBtcAmount, interval, exp, w, cb) - return nil -} - -func (b *BtcMock) AddAddressWatcher(address string, minBtcAmount btcutil.Amount, interval time.Duration, exp time.Time, w connectors.AddressWatcher, cb connectors.AddressWatcherCompleteCallback) error { - b.Called(address, minBtcAmount, interval, exp, w, cb) - return nil -} - -func (b *BtcMock) Connect(con connectors.BtcConfig) error { - b.Called(con) - return nil -} - -func (b *BtcMock) LockBtc(number float64) error { - b.Called(number) - return nil -} - -func (b *BtcMock) UnlockBtc(number float64) error { - b.Called(number) - return nil -} - -func (b *BtcMock) GetBlockHeaderHashByTx(string) ([32]byte, error) { - byteArray := [32]byte{97, 98, 99, 100, 101, 102} - return byteArray, nil -} - -func (b *BtcMock) CheckConnection() error { - args := b.Called() - return args.Error(0) -} - -func (b *BtcMock) GetParams() chaincfg.Params { - b.Called() - return chaincfg.TestNet3Params -} - -func (b *BtcMock) RemoveAddressWatcher(address string) { - b.Called(address) -} - -func (b *BtcMock) Close() { - b.Called() -} - -func (b *BtcMock) SerializePMT(txHash string) ([]byte, error) { - b.Called(txHash) - return nil, nil -} - -func (b *BtcMock) SerializeTx(txHash string) ([]byte, error) { - b.Called(txHash) - return nil, nil -} - -func (b *BtcMock) GetBlockNumberByTx(txHash string) (int64, error) { - b.Called(txHash) - return 0, nil -} - -func (b *BtcMock) ComputeDerivationAddresss(userPublicKey []byte, quoteHash []byte) (string, error) { - b.Called(userPublicKey) - b.Called(quoteHash) - return "", nil -} - -func (b *BtcMock) GetDerivedBitcoinAddress(fedInfo *connectors.FedInfo, userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) (string, error) { - b.Called(fedInfo, userBtcRefundAddr, lbcAddress, lpBtcAddress, derivationArgumentsHash) - return "", nil -} - -func (b *BtcMock) SendBtc(address string, amount uint64) (string, error) { - return "", nil -} - -func (b *BtcMock) SendBtcWithOpReturn(address string, amount uint64, opReturnContent []byte) (string, error) { - return "", nil -} - -func (b *BtcMock) GetAmauntWithFeesIncluded(amount float64) float64 { - return 0 -} - -func (b *BtcMock) BuildMerkleBranch(txHash string) (*connectors.MerkleBranch, error) { - return nil, nil -} - -func (b *BtcMock) BuildMerkleBranchByEndpoint(txHash string, btcAddress string) (*connectors.MerkleBranch, error) { - return nil, nil -} diff --git a/http/testmocks/db_mock.go b/http/testmocks/db_mock.go deleted file mode 100644 index 5bf4aaec..00000000 --- a/http/testmocks/db_mock.go +++ /dev/null @@ -1,144 +0,0 @@ -package testmocks - -import ( - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider/types" - "github.com/stretchr/testify/mock" -) - -type DbMock struct { - mock.Mock - hash string - quote *pegin.Quote - pegoutQuote *pegout.Quote -} - -func (d *DbMock) ResetProviders(providers []*types.GlobalProvider) error { - return d.Called(providers).Error(0) -} - -func (d *DbMock) UpdateDepositedPegOutQuote(hash string, depositTransaction string) error { - args := d.Called(hash, depositTransaction) - return args.Error(0) -} - -func (d *DbMock) GetRetainedPegOutQuoteByState(filter []types.RQState) ([]*pegout.RetainedQuote, error) { - args := d.Called(filter) - return args.Get(0).([]*pegout.RetainedQuote), args.Error(1) -} - -func (d *DbMock) SaveAddressKeys(quoteHash string, addr string, pubKey []byte, privateKey []byte) error { - args := d.Called(quoteHash, addr, pubKey, privateKey) - return args.Error(0) -} - -func (d *DbMock) GetAddressKeys(quoteHash string) (*mongoDB.PegoutKeys, error) { - args := d.Called(quoteHash) - return args.Get(0).(*mongoDB.PegoutKeys), args.Error(1) -} - -func (d *DbMock) GetProvider(u uint64) (*mongoDB.ProviderAddress, error) { - arg := d.Called(u) - return arg.Get(0).(*mongoDB.ProviderAddress), arg.Error(1) -} - -func (d *DbMock) GetLockedLiquidityPegOut() (uint64, error) { - args := d.Called() - return uint64(args.Int(0)), args.Error(1) -} - -func NewDbMock(h string, q *pegin.Quote, pq *pegout.Quote) (*DbMock, error) { - return &DbMock{ - hash: h, - quote: q, - pegoutQuote: pq, - }, nil -} - -func (d *DbMock) GetProviders() ([]*mongoDB.ProviderAddress, error) { - args := d.Called() - return args.Get(0).([]*mongoDB.ProviderAddress), args.Error(1) -} - -func (d *DbMock) InsertProvider(id int64, details types.ProviderRegisterRequest, address string, providerType string) error { - args := d.Called(id, address) - return args.Error(0) -} - -func (d *DbMock) CheckConnection() error { - args := d.Called() - return args.Error(0) -} - -func (d *DbMock) Close() error { - d.Called() - return nil -} - -func (d *DbMock) InsertQuote(id string, q *pegin.Quote) error { - d.Called(id, q) - return nil -} - -func (d *DbMock) GetQuote(quoteHash string) (*pegin.Quote, error) { - d.Called(quoteHash) - return d.quote, nil -} - -func (d *DbMock) RetainQuote(entry *types.RetainedQuote) error { - d.Called(entry) - return nil -} - -func (d *DbMock) GetRetainedQuotes(filter []types.RQState) ([]*types.RetainedQuote, error) { - d.Called(filter) - return []*types.RetainedQuote{{QuoteHash: d.hash}}, nil -} - -func (d *DbMock) GetRetainedQuote(hash string) (*types.RetainedQuote, error) { - d.Called(hash) - return nil, nil -} - -func (d *DbMock) DeleteExpiredQuotes(expTimestamp int64) error { - d.Called(expTimestamp) - return nil -} - -func (d *DbMock) UpdateRetainedQuoteState(hash string, oldState types.RQState, newState types.RQState) error { - d.Called(hash, oldState, newState) - return nil -} - -func (d *DbMock) GetLockedLiquidity() (*types.Wei, error) { - d.Called() - return new(types.Wei), nil -} - -func (d *DbMock) InsertPegOutQuote(id string, q *pegout.Quote) error { - return nil -} - -func (d *DbMock) GetPegOutQuote(quoteHash string) (*pegout.Quote, error) { - d.Called(quoteHash) - return d.pegoutQuote, nil -} - -func (d *DbMock) RetainPegOutQuote(entry *pegout.RetainedQuote) error { - return nil -} - -func (d *DbMock) GetRetainedPegOutQuote(hash string) (*pegout.RetainedQuote, error) { - d.Called(hash) - return nil, nil -} - -func (d *DbMock) UpdateRetainedPegOutQuoteState( - hash string, - oldState types.RQState, - newState types.RQState) error { - d.Called(hash, oldState, newState) - return nil -} diff --git a/http/testmocks/rsk_mock.go b/http/testmocks/rsk_mock.go deleted file mode 100644 index b3eec4be..00000000 --- a/http/testmocks/rsk_mock.go +++ /dev/null @@ -1,250 +0,0 @@ -package testmocks - -import ( - "context" - "github.com/rsksmart/liquidity-provider/types" - "math/big" - "time" - - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - - "github.com/btcsuite/btcd/chaincfg" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - gethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - "github.com/stretchr/testify/mock" -) - -type RskMock struct { - mock.Mock - QuoteHash string -} - -func (m *RskMock) GetPeginPunishmentEvents(fromBlock, toBlock uint64) ([]*pegin.PunishmentEvent, error) { - args := m.Called(fromBlock, toBlock) - return args.Get(0).([]*pegin.PunishmentEvent), args.Error(1) -} - -func (m *RskMock) GetUserQuotes(types.UserQuoteRequest) (events []types.UserEvents, err error) { - return make([]types.UserEvents, 0), nil -} - -func (m *RskMock) GetProviderIds() (providerList *big.Int, err error) { - args := m.Called() - return args.Get(0).(*big.Int), args.Error(1) -} - -func (m *RskMock) GetDepositEvents(fromBlock, toBlock uint64) ([]*pegout.DepositEvent, error) { - args := m.Called(fromBlock, toBlock) - return args.Get(0).([]*pegout.DepositEvent), args.Error(1) -} - -func (m *RskMock) ChangeStatus(opts *bind.TransactOpts, _providerId *big.Int, _status bool) error { - return m.Called(opts, _providerId, _status).Error(0) -} - -func (m *RskMock) GetActiveRedeemScript() ([]byte, error) { - args := m.Called() - return args.Get(0).([]byte), args.Error(1) -} - -func (m *RskMock) IsEOA(address string) (bool, error) { - args := m.Called(address) - return args.Bool(0), args.Error(1) -} - -func (m *RskMock) GetMinimumLockTxValue() (*big.Int, error) { - args := m.Called() - return args.Get(0).(*big.Int), args.Error(1) -} - -func (m *RskMock) GetLbcBalance(addr string) (*big.Int, error) { - args := m.Called(addr) - return args.Get(0).(*big.Int), args.Error(1) -} - -func (m *RskMock) GetAvailableLiquidity(addr string) (*big.Int, error) { - args := m.Called(addr) - return args.Get(0).(*big.Int), args.Error(1) -} - -func (m *RskMock) GetCollateral(addr string) (*big.Int, *big.Int, error) { - arg := m.Called(addr) - - var ( - collateral *big.Int - minimum *big.Int - ) - - if arg.Get(0) != nil { - collateral = arg.Get(0).(*big.Int) - } - if arg.Get(1) != nil { - minimum = arg.Get(1).(*big.Int) - } - - return collateral, minimum, arg.Error(2) -} - -func (m *RskMock) RegisterProvider(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _type string) (int64, error) { - args := m.Called(opts, _name, _apiBaseUrl, _status, _type) - return int64(args.Int(0)), args.Error(1) -} - -func (m *RskMock) AddCollateral(opts *bind.TransactOpts) error { - m.Called(opts) - return nil -} - -func (m *RskMock) GetRequiredBridgeConfirmations() int64 { - m.Called() - return 0 -} - -func (m *RskMock) GetChainId() (*big.Int, error) { - m.Called() - return big.NewInt(0), nil -} - -func (m *RskMock) ParseQuote(q *pegin.Quote) (bindings.QuotesPeginQuote, error) { - m.Called(q) - return bindings.QuotesPeginQuote{}, nil -} - -func (m *RskMock) RegisterPegIn(opt *bind.TransactOpts, q bindings.QuotesPeginQuote, signature []byte, tx []byte, pmt []byte, height *big.Int) (*gethTypes.Receipt, error) { - m.Called(opt, q, signature, tx, pmt, height) - return nil, nil -} - -func (m *RskMock) RegisterPegInWithoutTx(q bindings.QuotesPeginQuote, signature []byte, tx []byte, pmt []byte, height *big.Int) error { - m.Called(q, signature, tx, pmt, height) - return nil -} - -func (m *RskMock) CallForUser(opt *bind.TransactOpts, q bindings.QuotesPeginQuote) (*gethTypes.Receipt, error) { - m.Called(opt, q) - return nil, nil -} - -func (m *RskMock) Connect(endpoint string, chainId *big.Int) error { - m.Called(endpoint, chainId) - return nil -} - -func (m *RskMock) CheckConnection() error { - args := m.Called() - return args.Error(0) -} - -func (m *RskMock) Close() { - m.Called() -} - -func (m *RskMock) EstimateGas(addr string, value *big.Int, data []byte) (uint64, error) { - m.Called(addr, value, data) - return 10000, nil -} - -func (m *RskMock) GasPrice() (*big.Int, error) { - m.Called() - return big.NewInt(100000), nil -} -func (m *RskMock) HashQuote(q *pegin.Quote) (string, error) { - m.Called(q) - return "", nil -} -func (m *RskMock) GetFedSize() (int, error) { - args := m.Called() - return args.Int(0), nil -} -func (m *RskMock) GetFedThreshold() (int, error) { - args := m.Called() - return args.Int(0), nil -} - -func (m *RskMock) GetFedPublicKey(index int) (string, error) { - args := m.Called(index) - return args.String(), nil -} -func (m *RskMock) GetFedAddress() (string, error) { - args := m.Called() - return args.String(), nil -} -func (m *RskMock) GetActiveFederationCreationBlockHeight() (int, error) { - args := m.Called() - return args.Int(0), nil -} - -func (m *RskMock) GetLBCAddress() string { - args := m.Called() - return args.String() -} - -func (m *RskMock) GetTxStatus(ctx context.Context, tx *gethTypes.Transaction) (bool, error) { - m.Called(ctx, tx) - return false, nil -} - -func (m *RskMock) FetchFederationInfo() (*connectors.FedInfo, error) { - args := m.Called() - return args.Get(0).(*connectors.FedInfo), args.Error(1) -} - -func (m *RskMock) AddQuoteToWatch(hash string, interval time.Duration, exp time.Time, w connectors.QuotePegOutWatcher, cb func(w connectors.QuotePegOutWatcher)) error { - args := m.Called(hash, interval, exp, w, cb) - return args.Error(0) -} - -func (m *RskMock) GetBridgeAddress() common.Address { - return common.Address{} -} - -func (m *RskMock) ParsePegOutQuote(quote *pegout.Quote) (bindings.QuotesPegOutQuote, error) { - return bindings.QuotesPegOutQuote{}, nil -} - -func (m *RskMock) RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcRawTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) error { - return nil -} - -func (m *RskMock) HashPegOutQuote(q *pegout.Quote) (string, error) { - return m.QuoteHash, nil -} - -func (m *RskMock) RegisterPegOut(*bind.TransactOpts, bindings.QuotesPegOutQuote, []byte) (*gethTypes.Transaction, error) { - return nil, nil -} - -func (m *RskMock) SendRbtc(opts *bind.TransactOpts, to common.Address) error { - return nil -} - -func (m *RskMock) GetProviders(providerList []int64) ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { - args := m.Called(providerList) - return args.Get(0).([]bindings.LiquidityBridgeContractLiquidityProvider), args.Error(1) -} - -func (m *RskMock) GetRskHeight() (uint64, error) { - return 0, nil -} - -func (m *RskMock) GetDerivedBitcoinAddress(fedInfo *connectors.FedInfo, btcParams chaincfg.Params, userBtcRefundAddr []byte, lbcAddress []byte, lpBtcAddress []byte, derivationArgumentsHash []byte) (string, string, error) { - m.Called(fedInfo, nil, userBtcRefundAddr, lbcAddress, lpBtcAddress, derivationArgumentsHash) - return "", "", nil -} - -func (m *RskMock) WithdrawCollateral(opts *bind.TransactOpts) error { - return m.Called(opts).Error(0) -} - -func (m *RskMock) Resign(opt *bind.TransactOpts) error { - return m.Called(opt).Error(0) -} - -func (m *RskMock) IsOperational(opt *bind.CallOpts, address common.Address) (status bool, err error) { - return false, nil -} diff --git a/http/validator.go b/http/validator.go deleted file mode 100644 index 8ec671ee..00000000 --- a/http/validator.go +++ /dev/null @@ -1,27 +0,0 @@ -package http - -import ( - "fmt" - "net/http" - - "github.com/go-playground/validator/v10" -) - -func Validate(schema interface{}) func(w http.ResponseWriter) bool { - return func(w http.ResponseWriter) bool { - err := validator.New().Struct(schema) - if err != nil { - var message string - for i, err := range err.(validator.ValidationErrors) { - if i > 0 { - message += ", " - } - message += fmt.Sprintf("%s is %s", err.Field(), err.Tag()) - } - customError := NewServerError(message, make(Details), true) - ResponseError(w, customError, http.StatusBadRequest) - return false - } - return true - } -} diff --git a/http/watcher.go b/http/watcher.go deleted file mode 100644 index 086b1980..00000000 --- a/http/watcher.go +++ /dev/null @@ -1,729 +0,0 @@ -package http - -import ( - "context" - "encoding/hex" - "errors" - "fmt" - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/service/ses" - sesTypes "github.com/aws/aws-sdk-go-v2/service/ses/types" - "github.com/ethereum/go-ethereum/common" - "math" - "math/big" - "strings" - "sync" - "time" - - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - - "github.com/btcsuite/btcd/btcutil" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" -) - -type BTCAddressWatcher struct { - hash string - btc connectors.BTCConnector - rsk connectors.RSKConnector - lp pegin.LiquidityProvider - dbMongo mongoDB.DBConnector - state types.RQState - quote *pegin.Quote - done chan struct{} - closed bool - signature []byte - sharedLocker sync.Locker -} - -type BTCAddressPegOutWatcher struct { - hash string - derivationAddress string - btc connectors.BTCConnector - rsk connectors.RSKConnector - lp pegout.LiquidityProvider - dbMongo mongoDB.DBConnector - state types.RQState - quote *pegout.Quote - done chan struct{} - closed bool - signature []byte - sharedLocker sync.Locker -} - -const ( - pegInGasLim = 2500000 - CFUExtraGas = 180000 - WatcherClosedError = "watcher is closed; cannot handle OnNewConfirmation; hash: %v" - WatcherOnExpireError = "watcher is closed; cannot handle OnExpire; hash: %v" - TimeExpiredError = "time has expired for quote: %v" - UpdateQuoteStateError = "error updating quote state; hash: %v; error: %v" -) - -func NewBTCAddressWatcher(hash string, - btc connectors.BTCConnector, rsk connectors.RSKConnector, provider pegin.LiquidityProvider, - dbMongo mongoDB.DBConnector, q *pegin.Quote, signature []byte, state types.RQState, sharedLocker sync.Locker) *BTCAddressWatcher { - watcher := BTCAddressWatcher{ - hash: hash, - btc: btc, - rsk: rsk, - lp: provider, - dbMongo: dbMongo, - quote: q, - state: state, - signature: signature, - done: make(chan struct{}), - sharedLocker: sharedLocker, - } - return &watcher -} - -func (w *BTCAddressWatcher) OnNewConfirmation(txHash string, confirmations int64, amount btcutil.Amount) { - if w.closed { - log.Errorf(WatcherClosedError, w.hash) - return - } - log.Debugf("processing OnNewConfirmation event for tx %v; confirmations: %v; received amount: %v", txHash, confirmations, amount) - - if w.state == types.RQStateWaitingForDeposit && confirmations >= int64(w.quote.Confirmations) { - err := w.performCallForUser() - if err != nil { - log.Errorf("error calling callForUser. value: %v. error: %v", txHash, err) - return - } - log.Debugf("registered callforuser for tx %v", txHash) - } - - if w.state == types.RQStateCallForUserSucceeded && confirmations >= w.rsk.GetRequiredBridgeConfirmations() { - err := w.performRegisterPegIn(txHash) - if err != nil { - log.Errorf("error calling registerPegIn. value: %v. error: %v", txHash, err) - } - } -} - -func (w *BTCAddressWatcher) OnExpire() { - if w.closed { - log.Errorf(WatcherOnExpireError, w.hash) - return - } - log.Debugf(TimeExpiredError, w.hash) - _ = w.closeAndUpdateQuoteState(types.RQStateTimeForDepositElapsed) -} - -func (w *BTCAddressWatcher) Done() <-chan struct{} { - return w.done -} - -func (w *BTCAddressPegOutWatcher) OnNewConfirmation(txHash string, confirmations int64, amount btcutil.Amount) { - if w.closed { - log.Errorf(WatcherClosedError, w.hash) - return - } - log.Debugf("processing OnNewConfirmation event for tx %v; confirmations: %v; received amount: %v", txHash, confirmations, amount) - - if !(w.state == types.RQStateCallForUserSucceeded && confirmations >= int64(w.quote.TransferConfirmations)) { - return - } - - unrecoverableError, err := w.performRefundPegout(txHash) - if err != nil && unrecoverableError { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - log.Error("Error refunding pegout: ", err) - return - } else if err != nil { - log.Errorf("Error calling RefundPegout: %v. Retrying on next confirmation", err) - return - } - - opts := &bind.TransactOpts{ - Signer: w.lp.SignTx, - From: common.HexToAddress(w.lp.Address()), - Value: new(types.Wei).Add(w.quote.Value, w.quote.CallFee).AsBigInt(), - GasPrice: big.NewInt(connectors.BridgeConversionGasPrice), - GasLimit: connectors.BridgeConversionGasLimit, - } - - err = w.rsk.SendRbtc(opts, w.rsk.GetBridgeAddress()) - if err != nil { - log.Errorf("Error sending RBTC to the bridge on pegout quote %s: %s", w.hash, err) - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return - } - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInSucceeded) -} - -func (w *BTCAddressPegOutWatcher) performRefundPegout(txHash string) (bool, error) { - opt := &bind.TransactOpts{ - GasLimit: pegInGasLim, - Value: nil, - From: common.HexToAddress(w.quote.LPRSKAddr), - Signer: w.lp.SignTx, - } - - mb, err := w.btc.BuildMerkleBranch(txHash) - if err != nil { - return true, err - } - bhh, err := w.btc.GetBlockHeaderHashByTx(txHash) - if err != nil { - return true, err - } - - btcRawTx, err := w.btc.SerializeTx(txHash) - if err != nil { - return true, err - } - - w.sharedLocker.Lock() - defer w.sharedLocker.Unlock() - - var bytes32Hash [32]byte - quoteHash, err := hex.DecodeString(w.hash) - if err != nil { - return true, err - } - copy(bytes32Hash[:], quoteHash) - - err = w.rsk.RefundPegOut(opt, bytes32Hash, btcRawTx, bhh, big.NewInt(int64(mb.Path)), mb.Hashes) - if err != nil && strings.Contains(err.Error(), "LBC049") { - return false, err - } else if err != nil { - return true, err - } else { - return false, nil - } -} - -func (w *BTCAddressPegOutWatcher) OnExpire() { - if w.closed { - log.Errorf(WatcherOnExpireError, w.hash) - return - } - log.Debugf(TimeExpiredError, w.hash) - _ = w.closeAndUpdateQuoteState(types.RQStateTimeForDepositElapsed) -} - -func (w *BTCAddressPegOutWatcher) Done() <-chan struct{} { - return w.done -} - -func (w *BTCAddressWatcher) performCallForUser() error { - q, err := w.rsk.ParseQuote(w.quote) - if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateCallForUserFailed) - return err - } - - w.sharedLocker.Lock() - defer w.sharedLocker.Unlock() - - lbcBalance, err := w.rsk.GetLbcBalance(w.lp.Address()) - if err != nil { - return err - } - - var val *big.Int - if lbcBalance.Cmp(q.Value) >= 0 { // lbc balance is sufficient, no need to transfer any value - val = nil - } else { // lbc balance is not sufficient, calc delta to transfer - val = new(big.Int).Sub(q.Value, lbcBalance) - } - - opt := &bind.TransactOpts{ - GasLimit: uint64(q.GasLimit + CFUExtraGas), - Value: val, - From: q.LiquidityProviderRskAddress, - Signer: w.lp.SignTx, - } - receipt, err := w.rsk.CallForUser(opt, q) - if err != nil && receipt != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateCallForUserFailed) - return fmt.Errorf("CallForUser transaction failed. hash: %v", receipt.TxHash) - } else if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateCallForUserFailed) - return err - } - err = w.updateQuoteState(types.RQStateCallForUserSucceeded) - if err != nil { - w.close() - return err - } - return nil -} - -func (w *BTCAddressWatcher) performRegisterPegIn(txHash string) error { - q, err := w.rsk.ParseQuote(w.quote) - if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return err - } - opt := &bind.TransactOpts{ - GasLimit: pegInGasLim, - Value: nil, - From: q.LiquidityProviderRskAddress, - Signer: w.lp.SignTx, - } - rawTx, err := w.btc.SerializeTx(txHash) - if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return err - } - pmt, err := w.btc.SerializePMT(txHash) - if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return err - } - bh, err := w.btc.GetBlockNumberByTx(txHash) - if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return err - } - - err = w.rsk.RegisterPegInWithoutTx(q, w.signature, rawTx, pmt, big.NewInt(bh)) - if err != nil { - if strings.Contains(err.Error(), "LBC031") { - log.Debugf("bridge failed to validate BTC transaction. retrying on next confirmation. tx: %v", txHash) - return nil // allow retrying in case the bridge didn't acknowledge all required confirmations have occurred - } - } - - log.Debugf("calling pegin for tx %v", txHash) - receipt, err := w.rsk.RegisterPegIn(opt, q, w.signature, rawTx, pmt, big.NewInt(bh)) - if err != nil && receipt != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return fmt.Errorf("RegisterPegin transaction failed. hash: %v", receipt.TxHash) - } else if err != nil { - _ = w.closeAndUpdateQuoteState(types.RQStateRegisterPegInFailed) - return err - } - - err = w.updateQuoteState(types.RQStateRegisterPegInSucceeded) - if err != nil { - w.close() - return err - } - log.Debugf("registered pegin for tx %v", txHash) - - w.close() - return nil -} - -func (w *BTCAddressWatcher) updateQuoteState(newState types.RQState) error { - err := w.dbMongo.UpdateRetainedQuoteState(w.hash, w.state, newState) - if err != nil { - log.Errorf(UpdateQuoteStateError, w.hash, err) - return err - } - - w.state = newState - return nil -} - -func (w *BTCAddressWatcher) closeAndUpdateQuoteState(newState types.RQState) error { - w.close() - return w.updateQuoteState(newState) -} - -func (w *BTCAddressWatcher) close() { - w.closed = true - close(w.done) -} - -func (b *BTCAddressPegOutWatcher) closeAndUpdateQuoteState(newState types.RQState) error { - b.close() - return b.updateQuoteState(newState) -} - -func (b *BTCAddressPegOutWatcher) close() { - b.closed = true - close(b.done) -} - -func (r *BTCAddressPegOutWatcher) updateQuoteState(newState types.RQState) error { - err := r.dbMongo.UpdateRetainedPegOutQuoteState(r.hash, r.state, newState) - if err != nil { - log.Errorf(UpdateQuoteStateError, r.hash, err) - return err - } - - r.state = newState - return nil -} - -type DepositEventWatcher interface { - Init(waitingForDepositQuotes, waitingForConfirmationQuotes map[string]*WatchedQuote) - WatchNewQuote(quoteHash, signature string, quote *pegout.Quote) error - EndChannel() chan<- bool -} - -type DepositEventWatcherImpl struct { - lastCheckedBlock uint64 - nonDepositedQuotes map[string]*WatchedQuote - depositedQuotes map[string]*WatchedQuote - checkInterval time.Duration - endChannel chan bool - addLocker sync.Locker - rsk connectors.RSKConnector - btc connectors.BTCConnector - db mongoDB.DBConnector - pegoutLocker sync.Locker - liquidityProvider pegout.LiquidityProvider - finalizationCallback func(hash string, quote *WatchedQuote, endState types.RQState) -} - -func NewDepositEventWatcher(checkInterval time.Duration, liquidityProvider pegout.LiquidityProvider, - addLocker sync.Locker, pegoutLocker sync.Locker, endChannel chan bool, - rsk connectors.RSKConnector, btc connectors.BTCConnector, db mongoDB.DBConnector, - finalizationCallback func(hash string, quote *WatchedQuote, endState types.RQState)) DepositEventWatcher { - return &DepositEventWatcherImpl{ - checkInterval: checkInterval, - endChannel: endChannel, - addLocker: addLocker, - rsk: rsk, - btc: btc, - db: db, - pegoutLocker: pegoutLocker, - liquidityProvider: liquidityProvider, - finalizationCallback: finalizationCallback, - } -} - -type WatchedQuote struct { - Data *pegout.Quote - Signature string - QuoteHash string - DepositTransaction string - LpBtcTransaction string -} - -func (watcher *DepositEventWatcherImpl) Init(waitingForDepositQuotes, waitingForConfirmationQuotes map[string]*WatchedQuote) { - if waitingForDepositQuotes == nil || waitingForConfirmationQuotes == nil { - log.Fatal("invalid initial pegout quote map") - } - var oldestBlock uint32 = 1 - for _, quote := range waitingForDepositQuotes { - watcher.updateOldestBlock(quote, &oldestBlock) - } - for _, quote := range waitingForConfirmationQuotes { - watcher.updateOldestBlock(quote, &oldestBlock) - } - watcher.lastCheckedBlock = uint64(oldestBlock) - watcher.nonDepositedQuotes = waitingForDepositQuotes - watcher.depositedQuotes = waitingForConfirmationQuotes - watcher.watchDepositEvent() -} - -func (watcher *DepositEventWatcherImpl) updateOldestBlock(quote *WatchedQuote, oldestBlock *uint32) { - creationBlock := watcher.liquidityProvider.GetCreationBlock(quote.Data) - if *oldestBlock == 0 || *oldestBlock > creationBlock { - *oldestBlock = creationBlock - } -} - -func (watcher *DepositEventWatcherImpl) WatchNewQuote(quoteHash, signature string, quote *pegout.Quote) error { - if watcher.nonDepositedQuotes == nil { - return errors.New("not initialized") - } - watcher.addLocker.Lock() - defer watcher.addLocker.Unlock() - _, existsOnNonDeposited := watcher.nonDepositedQuotes[quoteHash] - _, existsOnDeposited := watcher.depositedQuotes[quoteHash] - if !existsOnNonDeposited && !existsOnDeposited { - watcher.nonDepositedQuotes[quoteHash] = &WatchedQuote{Data: quote, Signature: signature, QuoteHash: quoteHash} - return nil - } else { - return errors.New("already watched") - } -} - -func (watcher *DepositEventWatcherImpl) watchDepositEvent() { - ticker := time.NewTicker(watcher.checkInterval) - for { - select { - case <-watcher.endChannel: - ticker.Stop() - return - case <-ticker.C: - height, err := watcher.rsk.GetRskHeight() - if err != nil { - log.Error("Error getting rsk height: ", err) - break - } - err = watcher.checkDeposits(height) - if err != nil { - log.Error("Error getting pegout deposit events: ", err) - break - } - quotes := watcher.getConfirmedQuotes(height) - watcher.cleanExpiredQuotes() - watcher.handleDepositedQuotes(quotes) - watcher.lastCheckedBlock = height - } - } -} - -func (watcher *DepositEventWatcherImpl) checkDeposits(height uint64) error { - if height == watcher.lastCheckedBlock { - return nil - } - events, err := watcher.rsk.GetDepositEvents(watcher.lastCheckedBlock-1, height) - if err != nil { - return err - } - log.Debugf("Checking block interval %d-%d for deposits", watcher.lastCheckedBlock-1, height) - for _, event := range events { - quote, exists := watcher.nonDepositedQuotes[event.QuoteHash] - if exists && event.IsValidForQuote(quote.Data) { - quote.DepositTransaction = event.TxHash.String() - _ = watcher.db.UpdateDepositedPegOutQuote(event.QuoteHash, quote.DepositTransaction, mongoDB.RskTransaction) - watcher.depositedQuotes[event.QuoteHash] = quote - delete(watcher.nonDepositedQuotes, event.QuoteHash) - } - watcher.db.UpsertDepositEvent(event) - } - return nil -} - -func (watcher *DepositEventWatcherImpl) getConfirmedQuotes(height uint64) map[string]*WatchedQuote { - confirmedQuotes := make(map[string]*WatchedQuote, 0) - for hash, quote := range watcher.depositedQuotes { - receipt, err := watcher.rsk.GetTransactionReceipt(quote.DepositTransaction) - if err != nil { - log.Debugf("Error getting transaction %s receipt\n", quote.DepositTransaction) - } else if uint64(quote.Data.DepositConfirmations)+receipt.BlockNumber.Uint64() < height { - confirmedQuotes[hash] = quote - delete(watcher.depositedQuotes, hash) - } - } - return confirmedQuotes -} - -func (watcher *DepositEventWatcherImpl) cleanExpiredQuotes() { - now := time.Now() - for hash, quote := range watcher.nonDepositedQuotes { - if now.After(quote.Data.GetExpirationTime()) { - log.Debugf(TimeExpiredError, hash) - if err := watcher.updateQuoteState(hash, types.RQStateWaitingForDeposit, types.RQStateTimeForDepositElapsed); err == nil { - delete(watcher.nonDepositedQuotes, hash) - } - } - } -} - -func (watcher *DepositEventWatcherImpl) updateQuoteState(hash string, oldState, newState types.RQState) error { - err := watcher.db.UpdateRetainedPegOutQuoteState(hash, oldState, newState) - if err != nil { - log.Errorf(UpdateQuoteStateError, hash, err) - return err - } - return nil -} - -func (watcher *DepositEventWatcherImpl) handleDepositedQuotes(quotes map[string]*WatchedQuote) { - var newState types.RQState - for hash, quote := range quotes { - err := watcher.handleDepositedQuote(quote) - if err == nil { - newState = types.RQStateCallForUserSucceeded - } else { - log.Debug("error sending btc: ", err.Error()) - newState = types.RQStateCallForUserFailed - } - if err = watcher.updateQuoteState(hash, types.RQStateWaitingForDepositConfirmations, newState); err != nil { - log.Errorf("Error updating quote %s: %v", hash, err) - } else { - log.Debug("registered pegout quote: ", hash) - watcher.finalizationCallback(hash, quote, newState) - } - } -} - -func (watcher *DepositEventWatcherImpl) handleDepositedQuote(quote *WatchedQuote) error { - satoshi, _ := quote.Data.Value.ToSatoshi().Float64() - watcher.pegoutLocker.Lock() - defer watcher.pegoutLocker.Unlock() - - quoteBytes, err := hex.DecodeString(quote.QuoteHash) - if err != nil { - return err - } - tx, err := watcher.btc.SendBtcWithOpReturn(quote.Data.DepositAddr, uint64(math.Ceil(satoshi)), quoteBytes) - if err != nil { - return err - } - quote.LpBtcTransaction = tx - return watcher.db.UpdateDepositedPegOutQuote(quote.QuoteHash, tx, mongoDB.BtcTransaction) -} - -func (watcher *DepositEventWatcherImpl) EndChannel() chan<- bool { - return watcher.endChannel -} - -type LpFundsEventWatcher interface { - Init() - WatchLpFunds() error - GetLpPeginPunishment(height uint64) error - GetLpPeginOutOfLiquidity() error - GetLpPegoutOutOfLiquidity() error - SendAlert(subject string, body string, recipient string) - EndChannel() chan<- bool -} - -type LpFundsEventWatcherImpl struct { - checkInterval time.Duration - endChannel chan bool - rsk connectors.RSKConnector - height uint64 - lastCheckedBlock uint64 - liquidityPeginProvider pegin.LiquidityProvider - liquidityPegoutProvider pegout.LiquidityProvider - minTxValue *types.Wei - recipient string - sesClient *ses.Client -} - -func NewLpFundsEventWatcher(checkInterval time.Duration, endChannel chan bool, rsk connectors.RSKConnector, - peginLiquidityProvider pegin.LiquidityProvider, pegoutLiquidityProvider pegout.LiquidityProvider, awsConfig aws.Config) LpFundsEventWatcher { - height, err := rsk.GetRskHeight() - if err != nil { - log.Error("Error getting rsk height: ", err) - } - sesClient := ses.NewFromConfig(awsConfig) - return &LpFundsEventWatcherImpl{ - checkInterval: checkInterval, - endChannel: endChannel, - rsk: rsk, - height: height, - liquidityPeginProvider: peginLiquidityProvider, - liquidityPegoutProvider: pegoutLiquidityProvider, - recipient: "test@iovlabs.org", - sesClient: sesClient, - } -} - -func (watcher *LpFundsEventWatcherImpl) Init() { - height, err := watcher.rsk.GetRskHeight() - if err != nil { - log.Error("Error getting rsk height on LP Alerts Watcher: ", err) - } - watcher.lastCheckedBlock = height - 1 - - minLockTxValueInSatoshi, err := watcher.rsk.GetMinimumLockTxValue() - if err != nil { - log.Error(ErrorRetrievingMinimumLockValue, err.Error()) - } - minLockTxValueInWei := types.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) - watcher.minTxValue = minLockTxValueInWei - - go func() { - ticker := time.NewTicker(watcher.checkInterval) - for { - select { - case <-ticker.C: - watcher.GetLpPeginPunishment(height) - watcher.GetLpPeginOutOfLiquidity() - watcher.GetLpPegoutOutOfLiquidity() - case <-watcher.endChannel: - ticker.Stop() - return - } - } - }() -} - -func (watcher *LpFundsEventWatcherImpl) GetLpPeginPunishment(height uint64) error { - if height == watcher.lastCheckedBlock || watcher.lastCheckedBlock == 0 { - return nil - } - events, err := watcher.rsk.GetPeginPunishmentEvents(watcher.lastCheckedBlock-1, height) - if err != nil { - return err - } - log.Debugf("Checking block interval %d-%d for punishment", watcher.lastCheckedBlock-1, height) - for _, event := range events { - body := "You was punished in " + event.Penalty.Text(10) + " rBTC for the quoteHash " + event.QuoteHash - watcher.SendAlert("Pegin Punishment", body, watcher.recipient) - } - return nil -} - -func (watcher *LpFundsEventWatcherImpl) GetLpPeginOutOfLiquidity() error { - hasLiquidity, err := watcher.liquidityPeginProvider.HasLiquidity(watcher.minTxValue) - if err != nil { - return err - } - - if !hasLiquidity { - body := "You are out of liquidity to perform a pegin. Please, do a deposit" - watcher.SendAlert("Pegin: Out of liquidity", body, watcher.recipient) - } - - return nil -} - -func (watcher *LpFundsEventWatcherImpl) GetLpPegoutOutOfLiquidity() error { - hasLiquidity, err := watcher.liquidityPegoutProvider.HasLiquidity(watcher.minTxValue) - if err != nil { - return err - } - - if !hasLiquidity { - body := "You are out of liquidity to perform a pegout. Please, do a deposit" - watcher.SendAlert("Pegout: Out of liquidity", body, watcher.recipient) - } - - return nil -} - -func (watcher *LpFundsEventWatcherImpl) SendAlert(subject string, body string, recipient string) { - log.Debug("Sending alert to LP") - sender := "no-reply@mail.flyover.rifcomputing.net" - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - - result, err := watcher.sesClient.SendEmail(ctx, &ses.SendEmailInput{ - Destination: &sesTypes.Destination{ - ToAddresses: []string{recipient}, - }, - Message: &sesTypes.Message{ - Body: &sesTypes.Body{ - Text: &sesTypes.Content{Data: &body}, - }, - Subject: &sesTypes.Content{Data: &subject}, - }, - Source: &sender, - }) - - if err != nil { - log.Error("An error occurred while sending the email: ", err.Error()) - return - } - - log.Debugf("Alert sent with ID: %s\n", *result.MessageId) -} - -func (watcher *LpFundsEventWatcherImpl) WatchLpFunds() error { - ticker := time.NewTicker(watcher.checkInterval) - for { - select { - case <-watcher.endChannel: - ticker.Stop() - return nil - case <-ticker.C: - log.Debug("Watching LP Funds") - return nil - } - } - return nil -} - -func (watcher *LpFundsEventWatcherImpl) EndChannel() chan<- bool { - return watcher.endChannel -} diff --git a/main.go b/main.go deleted file mode 100644 index e48c5004..00000000 --- a/main.go +++ /dev/null @@ -1,212 +0,0 @@ -// @Version 0.5 -// @Title Liquidity Provider Server -// @Server https://flyover-lps.testnet.rsk.co Testnet -// @Server https://flyover-lps.mainnet.rifcomputing.net Mainnet -// @Security AuthorizationHeader read write -// @SecurityScheme AuthorizationHeader http bearer Input your token -package main - -import ( - "context" - "fmt" - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/rsksmart/liquidity-provider-server/config" - "github.com/rsksmart/liquidity-provider-server/pegout" - "math/big" - "math/rand" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - "time" - - "github.com/rsksmart/liquidity-provider-server/account" - "github.com/rsksmart/liquidity-provider-server/secrets" - - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider/types" - - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider-server/http" - - "github.com/rsksmart/liquidity-provider-server/storage" - log "github.com/sirupsen/logrus" - - awsConfig "github.com/aws/aws-sdk-go-v2/config" -) - -var ( - cfg config.Config - srv http.Server - cfgData http.ConfigData -) - -func loadConfig() { - if err := config.LoadEnv(&cfg); err != nil { - log.Fatalf("error loading config file: %v", err) - } -} - -func initLogger() { - if cfg.Debug { - log.SetLevel(log.DebugLevel) - } - if cfg.LogFile == "" { - return - } - f, err := os.OpenFile(cfg.LogFile, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) - - if err != nil { - log.Error(fmt.Sprintf("cannot open file %v: ", cfg.LogFile), err) - } else { - log.SetOutput(f) - } -} - -func startServer( - rsk *connectors.RSK, btc *connectors.BTC, - dbMongo *mongoDB.DB, awsConfiguration aws.Config, - secretsStorage secrets.SecretStorage[any], endChannel chan<- os.Signal) { - lpRepository := storage.NewLPRepository(dbMongo, rsk, btc) - secretNames := &account.AccountSecretNames{ - KeySecretName: cfg.ProviderCredentials.KeySecret, - PasswordSecretName: cfg.ProviderCredentials.PasswordSecret, - } - accountProvider := account.NewRemoteAccountProvider( - cfg.ProviderCredentials.Keydir, - cfg.ProviderCredentials.AccountNum, - secretNames, - secretsStorage, - ) - lp, err := pegin.NewLocalProvider(cfg.Provider, lpRepository, accountProvider, cfg.RSK.ChainId) - if err != nil { - log.Fatal("cannot create local provider: ", err) - } - lpPegOut, err := pegout.NewLocalProvider(&cfg.PegoutProvier, lpRepository, accountProvider, cfg.RSK.ChainId) - if err != nil { - log.Fatal("cannot create local provider: ", err) - } - - srv = http.New(rsk, btc, dbMongo, cfgData, lpRepository, cfg.Provider, cfg.PegoutProvier, accountProvider, awsConfiguration) - log.Debug("registering local provider (this might take a while)") - req := types.ProviderRegisterRequest{ - Name: cfg.ProviderName, - ApiBaseUrl: cfg.BaseURL, - Status: true, - ProviderType: cfg.ProviderType, - } - - err = srv.AddProvider(lp, lpPegOut, req) - if err != nil { - log.Fatalf("error registering local provider: %v", err) - } - - if err != nil { - log.Fatalf("error registering local provider: %v", err) - } - port := cfg.Server.Port - - if port == 0 { - port = 8080 - } - go func() { - err := srv.Start(port) - - if err != nil { - log.Error("server error: ", err.Error()) - endChannel <- syscall.SIGTERM - } - }() -} - -func main() { - loadConfig() - initCfgData() - initLogger() - rand.Seed(time.Now().UnixNano()) - - log.Info("starting liquidity provider server") - log.Debugf("loaded config %+v", cfg) - - awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) - if err != nil { - log.Fatal("error loading configuration: ", err.Error()) - } - - secretsStorage := secrets.NewSecretsManagerStorage[any](awsConfiguration) - - dbMongo, err := mongoDB.Connect() - if err != nil { - log.Fatal("error connecting to DB: ", err) - } - - erpKeys := strings.Split(os.Getenv("ERP_KEYS"), ",") - - log.Debug("ERP Keys: ", erpKeys) - - rsk, err := connectors.NewRSK(cfg.RSK.LBCAddr, cfg.RSK.BridgeAddr, cfg.RSK.RequiredBridgeConfirmations, cfg.IrisActivationHeight, erpKeys) - if err != nil { - log.Fatal("RSK error: ", err) - } - - chainId, err := strconv.ParseInt(os.Getenv("RSK_CHAIN_ID"), 10, 64) - - if err != nil { - log.Fatal("Error getting the chain ID: ", err) - } - - err = rsk.Connect(os.Getenv("RSKJ_CONNECTION_STRING"), big.NewInt(chainId)) - if err != nil { - log.Fatal("error connecting to RSK: ", err) - } - - walletPassword, err := secretsStorage.GetTextSecret(cfg.BtcWalletPassword) - if err != nil { - log.Fatal("Error getting BTC wallet password: ", err) - } - - btc, err := connectors.NewBTC(os.Getenv("BTC_NETWORK"), walletPassword, cfg.IsBtcEncryptedWallet) - if err != nil { - log.Fatal("error initializing BTC connector: ", err) - } - - err = btc.Connect(cfg.BTC) - if err != nil { - log.Fatal("error connecting to BTC: ", err) - } - - done := make(chan os.Signal, 1) - signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) - - startServer(rsk, btc, dbMongo, awsConfiguration, secretsStorage, done) - - <-done - - srv.Shutdown() - rsk.Close() - btc.Close() - - err = dbMongo.Close() - if err != nil { - log.Fatal("error closing DB connection: ", err) - } -} - -func initCfgData() { - cfgData.RSK = cfg.RSK - cfgData.QuoteCacheStartBlock = cfg.QuoteCacheStartBlock - cfgData.CaptchaSecretKey = cfg.CaptchaSecretKey - cfgData.CaptchaThreshold = cfg.CaptchaThreshold - cfgData.CaptchaSiteKey = cfg.CaptchaSiteKey -} - -func generateRandomKey(n int) string { - var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,!#@&") - b := make([]rune, n) - for i := range b { - b[i] = letterRunes[rand.Intn(len(letterRunes))] - } - return string(b) -} diff --git a/mongo/db.go b/mongo/db.go deleted file mode 100644 index 370a9c4a..00000000 --- a/mongo/db.go +++ /dev/null @@ -1,864 +0,0 @@ -package mongoDB - -import ( - "context" - "fmt" - "github.com/ethereum/go-ethereum/common" - "math/big" - "os" - "strconv" - "time" - - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -const ( - peginQuoteCollection = "peginQuote" - retainedPeginQuoteCollection = "retainedPeginQuote" - retainedPegoutQuoteCollection = "retainedPegoutQuote" - pegoutQuoteCollection = "pegoutQuote" - depositEventsCollection = "depositEvents" - providersCollection = "providers" - pegoutKeysCollection = "pegoutKeys" -) - -type TransactionType int - -const ( - RskTransaction TransactionType = iota - BtcTransaction -) - -const queryTimeout = 3 * time.Second - -type DBConnector interface { - CheckConnection() error - Close() error - InsertQuote(id string, q *pegin.Quote) error - GetQuote(quoteHash string) (*pegin.Quote, error) // returns nil if not found - RetainQuote(entry *types.RetainedQuote) error - GetRetainedQuotes(filter []types.RQState) ([]*types.RetainedQuote, error) - GetRetainedQuote(hash string) (*types.RetainedQuote, error) // returns nil if not found - DeleteExpiredQuotes(expTimestamp int64) error - UpdateRetainedQuoteState(hash string, oldState types.RQState, newState types.RQState) error - GetLockedLiquidity() (*types.Wei, error) - InsertPegOutQuote(id string, q *pegout.Quote) error - GetPegOutQuote(quoteHash string) (*pegout.Quote, error) - RetainPegOutQuote(entry *pegout.RetainedQuote) error - GetRetainedPegOutQuote(hash string) (*pegout.RetainedQuote, error) - GetRetainedPegOutQuoteByState(filter []types.RQState) ([]*pegout.RetainedQuote, error) - UpdateRetainedPegOutQuoteState(hash string, oldState types.RQState, newState types.RQState) error - UpdateDepositedPegOutQuote(hash string, transactionHash string, txType TransactionType) error - GetLockedLiquidityPegOut() (uint64, error) - GetProviders() ([]*ProviderAddress, error) - GetProvider(uint64) (*ProviderAddress, error) - InsertProvider(id int64, details types.ProviderRegisterRequest, address string) error - ResetProviders([]*types.GlobalProvider) error - SaveAddressKeys(quoteHash string, addr string, pubKey []byte, privateKey []byte) error - GetAddressKeys(quoteHash string) (*PegoutKeys, error) - UpsertDepositEvents(events []*pegout.DepositEvent) error - UpsertDepositEvent(event *pegout.DepositEvent) error - GetDepositEvents(address string) ([]*pegout.DepositEvent, error) -} - -type DB struct { - client *mongo.Client - db *mongo.Database -} -type PeginQuote struct { - Hash string `bson:"hash,omitempty"` - Expiration uint32 `bson:"expiration,omitempty"` - - FedBTCAddr string `bson:"fedBTCAddr,omitempty"` - LBCAddr string `bson:"lbcAddr,omitempty"` - LPRSKAddr string `bson:"lpRSKAddr,omitempty"` - BTCRefundAddr string `bson:"btcRefundAddr,omitempty"` - RSKRefundAddr string `bson:"rskRefundAddr,omitempty"` - LPBTCAddr string `bson:"lpBTCAddr,omitempty"` - CallFee string `bson:"callFee,omitempty"` - PenaltyFee string `bson:"penaltyFee,omitempty"` - ContractAddr string `bson:"contractAddr,omitempty"` - Data string `bson:"data,omitempty"` - GasLimit uint32 `bson:"gasLimit,omitempty"` - Nonce int64 `bson:"nonce,omitempty"` - Value string `bson:"value,omitempty"` - AgreementTimestamp uint32 `bson:"agreementTimestamp,omitempty"` - TimeForDeposit uint32 `bson:"timeForDeposit,omitempty"` - CallTime uint32 `bson:"callTime,omitempty"` - Confirmations uint16 `bson:"confirmations,omitempty"` - CallOnRegister bool `bson:"callOnRegister,omitempty"` - GasFee uint64 `bson:"gasFee,omitempty"` - ProductFeeAmount uint64 `bson:"productFeeAmount,omitempty"` -} - -type PegoutQuote struct { - Hash string `bson:"quotehash,omitempty"` - - LBCAddr string `bson:"lbcAddress,omitempty"` - LPRSKAddr string `bson:"liquidityProviderRskAddress,omitempty"` - BtcRefundAddr string `bson:"btcRefundAddress,omitempty"` - RSKRefundAddr string `bson:"rskRefundAddress,omitempty"` - LpBTCAddr string `bson:"lpBtcAddr,omitempty"` - CallFee string `bson:"callFee,omitempty"` - PenaltyFee uint64 `bson:"penaltyFee,omitempty"` - Nonce int64 `bson:"nonce,omitempty"` - DepositAddr string `bson:"depositAddr,omitempty"` - GasLimit uint32 `bson:"gasLimit,omitempty"` - Value string `bson:"value,omitempty"` - AgreementTimestamp uint32 `bson:"agreementTimestamp,omitempty"` - DepositDateLimit uint32 `bson:"depositDateLimit,omitempty"` - DepositConfirmations uint16 `bson:"depositConfirmations,omitempty"` - TransferConfirmations uint16 `bson:"transferConfirmations,omitempty"` - TransferTime uint32 `bson:"transferTime,omitempty"` - ExpireDate uint32 `bson:"expireDate,omitempty"` - ExpireBlock uint32 `bson:"expireBlocks,omitempty"` - GasFee uint64 `bson:"gasFee,omitempty"` - ProductFeeAmount uint64 `bson:"productFeeAmount,omitempty"` -} - -type RetainedPeginQuote struct { - QuoteHash string `json:"quoteHash" db:"quote_hash"` - DepositAddr string `json:"depositAddr" db:"deposit_addr"` - Signature string `json:"signature" db:"signature"` - ReqLiq string `json:"reqLiq" db:"req_liq"` - State types.RQState `json:"state" db:"state"` -} - -type ProviderAddress struct { - Id int64 `bson:"id"` - Provider string `bson:"provider"` -} - -type PegoutKeys struct { - QuoteHash string `bson:"quoteHash,omitempty"` - Addr string `bson:"addr,omitempty"` - PublicKey []byte `bson:"publicKey,omitempty"` - PrivateKey []byte `bson:"privateKey,omitempty"` -} - -type Deposit struct { - TxHash string `bson:"tx_hash"` - QuoteHash string `bson:"quote_hash"` - Amount uint64 `bson:"amount"` - Timestamp time.Time `bson:"timestamp"` - BlockNumber uint64 `bson:"block_number"` - From string `bson:"from"` -} - -func Connect() (*DB, error) { - log.Debug("Connecting to MongoDB") - username := os.Getenv("MONGODB_USER") - password := os.Getenv("MONGODB_PASSWORD") - host := os.Getenv("MONGODB_LOCAL_HOST") - - clientOptions := options.Client(). - ApplyURI("mongodb://" + username + ":" + password + "@" + host + ":27017/admin") - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - client, err := mongo.Connect(ctx, clientOptions) - if err != nil { - return nil, err - } - log.Debug("Connected to MongoDB... ") - db := client.Database("flyover") - - _, err = db.Collection(depositEventsCollection).Indexes().CreateOne( - ctx, - mongo.IndexModel{ - Keys: bson.D{{Key: "tx_hash", Value: 1}}, - Options: options.Index().SetUnique(true), - }, - ) - if err != nil { - return nil, err - } - - return &DB{client, db}, nil -} - -func (db *DB) CheckConnection() error { - return db.client.Ping(context.TODO(), nil) -} - -func (db *DB) Close() error { - log.Debug("closing connection to mongoDB DB") - err := db.client.Disconnect(context.TODO()) - if err != nil { - return err - } - return nil -} - -func (db *DB) InsertQuote(id string, q *pegin.Quote) error { - log.Debug("inserting quote{", id, "}", ": ", q) - coll := db.db.Collection(peginQuoteCollection) - - quoteToinsert := &PeginQuote{ - Hash: id, - Expiration: q.AgreementTimestamp + q.TimeForDeposit, - FedBTCAddr: q.FedBTCAddr, - LBCAddr: q.LBCAddr, - LPRSKAddr: q.LPRSKAddr, - BTCRefundAddr: q.BTCRefundAddr, - RSKRefundAddr: q.RSKRefundAddr, - LPBTCAddr: q.LPBTCAddr, - CallFee: q.CallFee.String(), - PenaltyFee: q.PenaltyFee.String(), - ContractAddr: q.ContractAddr, - Data: q.Data, - GasLimit: q.GasLimit, - Nonce: q.Nonce, - Value: q.Value.String(), - AgreementTimestamp: q.AgreementTimestamp, - TimeForDeposit: q.TimeForDeposit, - CallTime: q.LpCallTime, - Confirmations: q.Confirmations, - CallOnRegister: q.CallOnRegister, - ProductFeeAmount: q.ProductFeeAmount, - GasFee: q.GasFee.Uint64(), - } - - _, err := coll.InsertOne(context.TODO(), quoteToinsert) - - if err != nil { - return err - } - return nil -} - -func (db *DB) GetQuote(quoteHash string) (*pegin.Quote, error) { - log.Debug("retrieving quote: ", quoteHash) - - coll := db.db.Collection(peginQuoteCollection) - filter := bson.D{primitive.E{Key: "hash", Value: quoteHash}} - var result PeginQuote - err := coll.FindOne(context.TODO(), filter).Decode(&result) - - if err != nil { - if err == mongo.ErrNoDocuments { - return nil, nil - } - return nil, err - } - - callFee, err := strconv.ParseInt(result.CallFee, 10, 64) - if err != nil { - return nil, err - } - penaltyFee, err := strconv.ParseInt(result.PenaltyFee, 10, 64) - if err != nil { - return nil, err - } - value, err := strconv.ParseInt(result.Value, 10, 64) - if err != nil { - return nil, err - } - - quote := pegin.Quote{ - AgreementTimestamp: result.AgreementTimestamp, - BTCRefundAddr: result.BTCRefundAddr, - CallFee: types.NewWei(callFee), - CallOnRegister: result.CallOnRegister, - LpCallTime: result.CallTime, - Confirmations: result.Confirmations, - ContractAddr: result.ContractAddr, - Data: result.Data, - FedBTCAddr: result.FedBTCAddr, - GasLimit: result.GasLimit, - LBCAddr: result.LBCAddr, - LPBTCAddr: result.LPBTCAddr, - LPRSKAddr: result.LPRSKAddr, - Nonce: result.Nonce, - PenaltyFee: types.NewWei(penaltyFee), - RSKRefundAddr: result.RSKRefundAddr, - TimeForDeposit: result.TimeForDeposit, - Value: types.NewWei(value), - ProductFeeAmount: result.ProductFeeAmount, - GasFee: types.NewUWei(result.GasFee), - } - - return "e, nil -} - -func (db *DB) RetainQuote(entry *types.RetainedQuote) error { - log.Debug("inserting retained quote mongo DB:", entry.QuoteHash, "; DepositAddr: ", entry.DepositAddr, - "; Signature: ", entry.Signature, "; ReqLiq: ", entry.ReqLiq) - coll := db.db.Collection(retainedPeginQuoteCollection) - - quoteToRetain := RetainedPeginQuote{ - DepositAddr: entry.DepositAddr, - QuoteHash: entry.QuoteHash, - ReqLiq: entry.ReqLiq.String(), - Signature: entry.Signature, - State: entry.State, - } - - _, err := coll.InsertOne(context.TODO(), quoteToRetain) - - if err != nil { - return err - } - return nil -} - -func (db *DB) GetRetainedPegOutQuoteByState(filter []types.RQState) ([]*pegout.RetainedQuote, error) { - log.Debug("retrieving retained pegout quotes MongoDB") - coll := db.db.Collection(retainedPegoutQuoteCollection) - query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: filter}}}} - ctx, cancel := context.WithTimeout(context.Background(), queryTimeout) - defer cancel() - rows, err := coll.Find(ctx, query) - if err != nil { - return nil, err - } - defer rows.Close(ctx) - var retainedQuotes []*pegout.RetainedQuote - if err = rows.All(ctx, &retainedQuotes); err != nil { - return nil, err - } - return retainedQuotes, nil -} - -func (db *DB) GetRetainedQuotes(filter []types.RQState) ([]*types.RetainedQuote, error) { - log.Debug("retrieving retained quotes MongoDB") - coll := db.db.Collection(retainedPeginQuoteCollection) - query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: filter}}}} - rows, err := coll.Find(context.TODO(), query) - if err != nil { - return nil, err - } - var retainedQuotes []*types.RetainedQuote - - defer rows.Close(context.TODO()) - for rows.Next(context.TODO()) { - var rq RetainedPeginQuote - if err = rows.Decode(&rq); err != nil { - return nil, err - } - - reqLiq, err := strconv.ParseInt(rq.ReqLiq, 10, 64) - if err != nil { - return nil, err - } - rqToReturn := types.RetainedQuote{ - DepositAddr: rq.DepositAddr, - QuoteHash: rq.QuoteHash, - ReqLiq: types.NewWei(reqLiq), - Signature: rq.Signature, - State: rq.State, - } - - retainedQuotes = append(retainedQuotes, &rqToReturn) - } - - log.Debug("Retained Quotes: ", retainedQuotes) - - return retainedQuotes, nil -} - -func (db *DB) GetRetainedQuote(hash string) (*types.RetainedQuote, error) { - log.Debug("getting retained quote mongo: ", hash) - coll := db.db.Collection(retainedPeginQuoteCollection) - filter := bson.D{primitive.E{Key: "quotehash", Value: hash}} - - var result RetainedPeginQuote - err := coll.FindOne(context.TODO(), filter).Decode(&result) - - if err != nil { - if err == mongo.ErrNoDocuments { - return nil, nil - } - return nil, err - } - - reqLiq, err := strconv.ParseInt(result.ReqLiq, 10, 64) - if err != nil { - return nil, err - } - - rqToReturn := types.RetainedQuote{ - DepositAddr: result.DepositAddr, - QuoteHash: result.QuoteHash, - ReqLiq: types.NewWei(reqLiq), - Signature: result.Signature, - State: result.State, - } - - return &rqToReturn, nil - -} - -func (db *DB) DeleteExpiredQuotes(expTimestamp int64) error { - log.Debug("deleting expired quotes...") - coll := db.db.Collection(peginQuoteCollection) - filter := bson.D{primitive.E{Key: "expiration", Value: bson.D{primitive.E{Key: "$lt", Value: expTimestamp}}}} - result, err := coll.DeleteOne(context.TODO(), filter) - if err != nil { - return err - } - - if result.DeletedCount > 0 { - log.Infof("deleted %v expired quote(s)", result.DeletedCount) - } else { - log.Debug("no expired quotes found; nothing to delete") - } - - return nil -} - -func (db *DB) UpdateRetainedQuoteState(hash string, oldState types.RQState, newState types.RQState) error { - log.Debugf("updating state from %v to %v for retained quote mongo: %v", oldState, newState, hash) - - coll := db.db.Collection(retainedPeginQuoteCollection) - filter := bson.D{primitive.E{Key: "quotehash", Value: hash}, primitive.E{Key: "state", Value: oldState}} - update := bson.D{primitive.E{Key: "$set", Value: bson.D{primitive.E{Key: "state", Value: newState}}}} - result, err := coll.UpdateOne(context.TODO(), filter, update) - if err != nil { - return err - } - - if result.ModifiedCount != 1 { - return fmt.Errorf("error updating retained quote mongoBD: %v; oldState: %v; newState: %v", hash, oldState, newState) - } - - return nil -} - -func (db *DB) GetLockedLiquidity() (*types.Wei, error) { - log.Debug("retrieving locked liquidity") - - coll := db.db.Collection(retainedPeginQuoteCollection) - filter := []types.RQState{types.RQStateWaitingForDeposit, types.RQStateCallForUserFailed} - query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: filter}}}} - rows, err := coll.Find(context.TODO(), query) - if err != nil { - return nil, err - } - var lockedLiq = types.NewWei(0) - - for rows.Next(context.TODO()) { - var rq RetainedPeginQuote - if err = rows.Decode(&rq); err != nil { - return nil, err - } - reqLiqInt, err := strconv.ParseInt(rq.ReqLiq, 10, 64) - - if err != nil { - return nil, err - } - - reqLiq := types.NewWei(reqLiqInt) - - lockedLiq.Add(lockedLiq, reqLiq) - } - - return lockedLiq, nil -} -func (db *DB) ResetProviders(providers []*types.GlobalProvider) error { - coll := db.db.Collection(providersCollection) - _, err := coll.DeleteMany(context.Background(), bson.M{}) - if err != nil { - return fmt.Errorf("failed to delete existing providers: %w", err) - } - - // Insert the new providers - for _, provider := range providers { - _, err := coll.InsertOne(context.Background(), provider) - if err != nil { - return fmt.Errorf("failed to insert provider %s: %w", provider.Name, err) - } - } - - log.Debug("Providers reset and updated successfully") - return nil -} - -type InsertProvider struct { - Id int64 `bson:"id"` - Provider string `bson:"provider"` - types.ProviderRegisterRequest `bson:",inline"` -} - -func (db *DB) InsertProvider(id int64, details types.ProviderRegisterRequest, address string) error { - log.Debug("inserting provider: ", id) - coll := db.db.Collection(providersCollection) - filter := bson.M{"id": id} - - newProvider := InsertProvider{ - Id: id, - Provider: address, - ProviderRegisterRequest: details, - } - - update := bson.M{"$set": newProvider} - opts := options.Update().SetUpsert(true) - _, err := coll.UpdateOne(context.Background(), filter, update, opts) - - if err != nil { - return err - } - return nil -} -func (db *DB) GetProvider(providerId uint64) (*ProviderAddress, error) { - coll := db.db.Collection(providersCollection) - var result ProviderAddress - err := coll.FindOne(context.TODO(), bson.M{"id": providerId}).Decode(&result) - if err != nil { - return nil, err - } - return &result, nil -} - -func (db *DB) GetProviders() ([]*ProviderAddress, error) { - coll := db.db.Collection(providersCollection) - var results []*ProviderAddress - cur, err := coll.Find(context.TODO(), bson.D{{}}) - if err != nil { - return nil, err - } - defer cur.Close(context.TODO()) - for cur.Next(context.TODO()) { - var result ProviderAddress - err := cur.Decode(&result) - if err != nil { - return nil, err - } - results = append(results, &result) - } - if err := cur.Err(); err != nil { - return nil, err - } - return results, nil -} -func (db *DB) InsertPegOutQuote(id string, q *pegout.Quote) error { - log.Debug("inserting pegout_quote{", id, "}", ": ", q) - coll := db.db.Collection(pegoutQuoteCollection) - - quoteToInsert := &PegoutQuote{ - Hash: id, - LBCAddr: q.LBCAddr, - LPRSKAddr: q.LPRSKAddr, - BtcRefundAddr: q.BtcRefundAddr, - RSKRefundAddr: q.RSKRefundAddr, - LpBTCAddr: q.LpBTCAddr, - CallFee: q.CallFee.String(), - PenaltyFee: q.PenaltyFee, - Nonce: q.Nonce, - DepositAddr: q.DepositAddr, - GasFee: q.GasFee.Uint64(), - Value: q.Value.String(), - AgreementTimestamp: q.AgreementTimestamp, - DepositDateLimit: q.DepositDateLimit, - DepositConfirmations: q.DepositConfirmations, - TransferConfirmations: q.TransferConfirmations, - TransferTime: q.TransferTime, - ExpireDate: q.ExpireDate, - ExpireBlock: q.ExpireBlock, - ProductFeeAmount: q.ProductFeeAmount, - } - - _, err := coll.InsertOne(context.TODO(), quoteToInsert) - - if err != nil { - return err - } - return nil -} - -func (db *DB) GetPegOutQuote(quoteHash string) (*pegout.Quote, error) { - log.Debug("retrieving pegout quote: ", quoteHash) - coll := db.db.Collection(pegoutQuoteCollection) - filter := bson.D{primitive.E{Key: "quotehash", Value: quoteHash}} - var result PegoutQuote - err := coll.FindOne(context.TODO(), filter).Decode(&result) - - if err != nil { - if err == mongo.ErrNoDocuments { - return nil, nil - } - return nil, err - } - - callFee, err := strconv.ParseInt(result.CallFee, 10, 64) - if err != nil { - return nil, err - } - valueQuote, err := strconv.ParseInt(result.Value, 10, 64) - if err != nil { - return nil, err - } - - quote := pegout.Quote{ - LBCAddr: result.LBCAddr, - LPRSKAddr: result.LPRSKAddr, - BtcRefundAddr: result.BtcRefundAddr, - RSKRefundAddr: result.RSKRefundAddr, - LpBTCAddr: result.LpBTCAddr, - CallFee: types.NewWei(callFee), - PenaltyFee: result.PenaltyFee, - Nonce: result.Nonce, - DepositAddr: result.DepositAddr, - GasFee: types.NewUWei(result.GasFee), - Value: types.NewWei(valueQuote), - AgreementTimestamp: result.AgreementTimestamp, - DepositDateLimit: result.DepositDateLimit, - DepositConfirmations: result.DepositConfirmations, - TransferConfirmations: result.TransferConfirmations, - TransferTime: result.TransferTime, - ExpireDate: result.ExpireDate, - ExpireBlock: result.ExpireBlock, - ProductFeeAmount: result.ProductFeeAmount, - } - - return "e, nil -} - -func (db *DB) RetainPegOutQuote(entry *pegout.RetainedQuote) error { - log.Debug("inserting retained quote:", entry.QuoteHash, "; DepositAddr: ", entry.DepositAddr, "; Signature: ", entry.Signature, "; ReqLiq: ", entry.ReqLiq) - - coll := db.db.Collection("retainedPegoutQuote") - - _, err := coll.InsertOne(context.TODO(), entry) - - if err != nil { - return err - } - return nil -} - -func (db *DB) GetRetainedPegOutQuote(hash string) (*pegout.RetainedQuote, error) { - log.Debug("getting retained quote: ", hash) - - coll := db.db.Collection(retainedPegoutQuoteCollection) - filter := bson.D{primitive.E{Key: "quotehash", Value: hash}} - - var result *pegout.RetainedQuote - err := coll.FindOne(context.TODO(), filter).Decode(&result) - - if err != nil { - if err == mongo.ErrNoDocuments { - return nil, nil - } - return nil, err - } - - return result, nil -} - -func (db *DB) UpdateRetainedPegOutQuoteState(hash string, oldState types.RQState, newState types.RQState) error { - log.Debugf("updating state from %v to %v for retained quote: %v", oldState, newState, hash) - - coll := db.db.Collection(retainedPegoutQuoteCollection) - filter := bson.D{primitive.E{Key: "quotehash", Value: hash}, primitive.E{Key: "state", Value: oldState}} - update := bson.D{primitive.E{Key: "$set", Value: bson.D{primitive.E{Key: "state", Value: newState}}}} - result, err := coll.UpdateOne(context.TODO(), filter, update) - if err != nil { - return err - } - - if result.ModifiedCount != 1 { - return fmt.Errorf("error updating retained quote mongoBD: %v; oldState: %v; newState: %v", hash, oldState, newState) - } - - return nil -} - -func (db *DB) UpdateDepositedPegOutQuote(hash string, transactionHash string, txType TransactionType) error { - ctx, cancel := context.WithTimeout(context.Background(), queryTimeout*500) - defer cancel() - - var update bson.D - if txType == RskTransaction { - update = bson.D{ - primitive.E{Key: "$set", Value: bson.D{ - primitive.E{Key: "state", Value: types.RQStateWaitingForDepositConfirmations}, - primitive.E{Key: "deposit_transaction", Value: transactionHash}, - }}, - } - } else { - update = bson.D{ - primitive.E{Key: "$set", Value: bson.D{primitive.E{Key: "lp_btc_transaction", Value: transactionHash}}}, - } - } - - coll := db.db.Collection(retainedPegoutQuoteCollection) - filter := bson.M{ - "$and": []bson.M{ - {"quotehash": hash}, - { - "$or": []bson.M{ - {"state": types.RQStateWaitingForDeposit}, - {"state": types.RQStateWaitingForDepositConfirmations}, - }, - }, - }, - } - - result, err := coll.UpdateOne(ctx, filter, update) - if err != nil { - return err - } - - if result.ModifiedCount != 1 { - return fmt.Errorf("error updating confirmed quote %v on mongoBD", hash) - } - - return nil -} - -func (db *DB) SaveAddressKeys(quoteHash string, addr string, pubKey []byte, privateKey []byte) error { - log.Debug("inserting deposit address keys{", addr, "}") - coll := db.db.Collection(pegoutKeysCollection) - - depositAddressKeys := &PegoutKeys{ - QuoteHash: quoteHash, - Addr: addr, - PublicKey: pubKey, - PrivateKey: privateKey, - } - - _, err := coll.InsertOne(context.TODO(), depositAddressKeys) - - if err != nil { - return err - } - return nil -} - -func (db *DB) GetAddressKeys(quoteHash string) (*PegoutKeys, error) { - log.Debug("retrieving keys: ", quoteHash) - - coll := db.db.Collection(pegoutKeysCollection) - filter := bson.D{primitive.E{Key: "quoteHash", Value: quoteHash}} - var result PegoutKeys - err := coll.FindOne(context.TODO(), filter).Decode(&result) - - if err != nil { - if err == mongo.ErrNoDocuments { - return nil, nil - } - return nil, err - } - - return &result, nil -} - -func (db *DB) GetLockedLiquidityPegOut() (uint64, error) { - ctx, cancel := context.WithTimeout(context.Background(), queryTimeout) - defer cancel() - - coll := db.db.Collection(retainedPegoutQuoteCollection) - filter := []types.RQState{types.RQStateWaitingForDeposit, types.RQStateCallForUserFailed} - query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: filter}}}} - rows, err := coll.Find(ctx, query) - - var quotes []pegout.RetainedQuote - if err != nil { - return 0, err - } - - if err = rows.All(ctx, "es); err != nil { - return 0, err - } - - var lockedLiquidity uint64 = 0 - for _, quote := range quotes { - lockedLiquidity += quote.ReqLiq - } - - return lockedLiquidity, nil -} - -func (db *DB) UpsertDepositEvents(events []*pegout.DepositEvent) error { - ctx, cancel := context.WithTimeout(context.Background(), queryTimeout) - defer cancel() - - if len(events) == 0 { - return nil - } - - var documents []mongo.WriteModel - var deposit *Deposit - for _, event := range events { - deposit = fromEvent(event) - filter := bson.M{"tx_hash": deposit.TxHash} - replaceModel := mongo.NewReplaceOneModel() - replaceModel.SetFilter(filter) - replaceModel.SetReplacement(deposit) - replaceModel.SetUpsert(true) - - documents = append(documents, replaceModel) - } - - _, err := db.db.Collection(depositEventsCollection).BulkWrite( - ctx, - documents, - ) - return err -} - -func (db *DB) UpsertDepositEvent(event *pegout.DepositEvent) error { - ctx, cancel := context.WithTimeout(context.Background(), queryTimeout) - defer cancel() - deposit := fromEvent(event) - _, err := db.db.Collection(depositEventsCollection).ReplaceOne( - ctx, - bson.M{"tx_hash": deposit.TxHash}, - deposit, - options.Replace().SetUpsert(true), - ) - return err -} - -func (db *DB) GetDepositEvents(address string) ([]*pegout.DepositEvent, error) { - ctx, cancel := context.WithTimeout(context.Background(), queryTimeout) - defer cancel() - - filter := bson.M{"from": address} - sort := options.Find().SetSort(bson.M{"timestamp": -1}) - cursor, err := db.db.Collection(depositEventsCollection).Find(ctx, filter, sort) - if err != nil { - return make([]*pegout.DepositEvent, 0), err - } - - var documents []Deposit - if err = cursor.All(ctx, &documents); err != nil { - return make([]*pegout.DepositEvent, 0), err - } - - var result []*pegout.DepositEvent - for _, document := range documents { - result = append(result, toEvent(&document)) - } - - return result, nil -} - -func fromEvent(event *pegout.DepositEvent) *Deposit { - return &Deposit{ - TxHash: event.TxHash.Hex(), - QuoteHash: event.QuoteHash, - Amount: event.Amount.Uint64(), - Timestamp: event.Timestamp, - BlockNumber: event.BlockNumber, - From: event.From.Hex(), - } -} - -func toEvent(deposit *Deposit) *pegout.DepositEvent { - return &pegout.DepositEvent{ - TxHash: common.HexToHash(deposit.TxHash), - QuoteHash: deposit.QuoteHash, - Amount: new(big.Int).SetUint64(deposit.Amount), - Timestamp: deposit.Timestamp, - BlockNumber: deposit.BlockNumber, - From: common.HexToAddress(deposit.From), - } -} diff --git a/pegin/liquidity.go b/pegin/liquidity.go deleted file mode 100644 index 20d60928..00000000 --- a/pegin/liquidity.go +++ /dev/null @@ -1,196 +0,0 @@ -package pegin - -import ( - "encoding/hex" - "errors" - "fmt" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rsksmart/liquidity-provider-server/account" - "math/big" - "math/rand" - "sort" - "sync" - "time" - - "bytes" - - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/ethereum/go-ethereum/common" - gethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/rsksmart/liquidity-provider/types" -) - -type LiquidityProvider interface { - Address() string - GetQuote(*Quote, uint64, *types.Wei) (*Quote, error) - SignQuote(hash []byte, depositAddr string, reqLiq *types.Wei) ([]byte, error) - SignTx(common.Address, *gethTypes.Transaction) (*gethTypes.Transaction, error) - HasLiquidity(reqLiq *types.Wei) (bool, error) -} - -type LocalProviderRepository interface { - RetainQuote(rq *types.RetainedQuote) error - HasRetainedQuote(hash string) (bool, error) - HasLiquidity(lp LiquidityProvider, wei *types.Wei) (bool, error) -} - -type LocalProvider struct { - mu sync.Mutex - account *accounts.Account - ks *keystore.KeyStore - cfg ProviderConfig - repository LocalProviderRepository - chainId *big.Int -} - -type ProviderConfig struct { - BtcAddr string `env:"BTC_ADDR"` - MaxConf uint16 `env:"MAX_CONF"` - Confirmations map[int]uint16 `env:"CONFIRMATIONS"` - TimeForDeposit uint32 `env:"TIME_FOR_DEPOSIT"` - CallTime uint32 `env:"CALL_TIME"` - PenaltyFee *types.Wei `env:"PENALTY_FEE"` - Fee *types.Wei `env:"FEE"` - MinTransactionValue *big.Int `env:"MIN_TRANSACTION_VALUE"` - MaxTransactionValue *big.Int `env:"MAX_TRANSACTION_VALUE"` -} - -func NewLocalProvider(config ProviderConfig, repository LocalProviderRepository, accountProvider account.AccountProvider, chainId *big.Int) (*LocalProvider, error) { - acc, err := accountProvider.GetAccount() - - if err != nil { - return nil, err - } - lp := LocalProvider{ - account: acc.Account, - ks: acc.Keystore, - cfg: config, - repository: repository, - chainId: chainId, - } - return &lp, nil -} - -func (lp *LocalProvider) Address() string { - return lp.account.Address.String() -} - -func (lp *LocalProvider) GetQuote(q *Quote, gas uint64, gasPrice *types.Wei) (*Quote, error) { - res := *q - res.LPBTCAddr = lp.cfg.BtcAddr - res.LPRSKAddr = lp.account.Address.String() - res.AgreementTimestamp = uint32(time.Now().Unix()) - res.Nonce = int64(rand.Int()) - res.TimeForDeposit = lp.cfg.TimeForDeposit - res.LpCallTime = lp.cfg.CallTime - res.PenaltyFee = lp.cfg.PenaltyFee.Copy() - - res.Confirmations = lp.cfg.MaxConf - for _, k := range sortedConfirmations(lp.cfg.Confirmations) { - v := lp.cfg.Confirmations[k] - - if res.Value.AsBigInt().Uint64() < uint64(k) { - res.Confirmations = v - break - } - } - - res.CallFee = lp.cfg.Fee - // this contains dao gas and call for user gas - res.GasFee = new(types.Wei).Mul(gasPrice, types.NewUWei(gas)) - return &res, nil -} - -func (lp *LocalProvider) SignQuote(hash []byte, depositAddr string, reqLiq *types.Wei) ([]byte, error) { - quoteHash := hex.EncodeToString(hash) - - var buf bytes.Buffer - buf.WriteString("\x19Ethereum Signed Message:\n32") - buf.Write(hash) - - signB, err := lp.ks.SignHash(*lp.account, crypto.Keccak256(buf.Bytes())) - if err != nil { - return nil, err - } - signB[len(signB)-1] += 27 // v must be 27 or 28 - - lp.mu.Lock() - defer lp.mu.Unlock() - - hasRq, err := lp.repository.HasRetainedQuote(quoteHash) - if err != nil { - return nil, err - } - if !hasRq { - hasLiquidity, err := lp.repository.HasLiquidity(lp, reqLiq) - if err != nil { - return nil, err - } - if !hasLiquidity { - return nil, fmt.Errorf("not enough liquidity. required: %v", reqLiq) - } - - signature := hex.EncodeToString(signB) - rq := types.RetainedQuote{ - QuoteHash: quoteHash, - DepositAddr: depositAddr, - Signature: signature, - ReqLiq: reqLiq.Copy(), - State: types.RQStateWaitingForDeposit, - } - err = lp.repository.RetainQuote(&rq) - if err != nil { - return nil, err - } - } - - return signB, nil -} - -func (lp *LocalProvider) SignTx(address common.Address, tx *gethTypes.Transaction) (*gethTypes.Transaction, error) { - if !bytes.Equal(address[:], lp.account.Address[:]) { - return nil, fmt.Errorf("provider address %v is incorrect", address.Hash()) - } - return lp.ks.SignTx(*lp.account, tx, lp.chainId) -} - -func (lp *LocalProvider) HasLiquidity(reqLiq *types.Wei) (bool, error) { - hasLiquidity, err := lp.repository.HasLiquidity(lp, reqLiq) - if err != nil { - return false, err - } - - return hasLiquidity, err -} - -func sortedConfirmations(m map[int]uint16) []int { - keys := make([]int, len(m)) - i := 0 - for k := range m { - keys[i] = k - i++ - } - sort.Ints(keys) - return keys -} - -func GetPeginProviderByAddress(liquidityProvider LiquidityProvider, addr string) LiquidityProvider { - if liquidityProvider.Address() == addr { - return liquidityProvider - } - - return nil -} - -func GetPeginProviderTransactOpts(liquidityProvider LiquidityProvider, address string) (*bind.TransactOpts, error) { - lp := GetPeginProviderByAddress(liquidityProvider, address) - if lp == nil { - return nil, errors.New("missing liquidity provider") - } - return &bind.TransactOpts{ - From: common.HexToAddress(address), - Signer: lp.SignTx, - }, nil -} diff --git a/pegin/quote.go b/pegin/quote.go deleted file mode 100644 index 53a3b5b4..00000000 --- a/pegin/quote.go +++ /dev/null @@ -1,36 +0,0 @@ -package pegin - -import ( - "github.com/ethereum/go-ethereum/common" - "github.com/rsksmart/liquidity-provider/types" - "math/big" -) - -type Quote struct { - FedBTCAddr string `json:"fedBTCAddr" db:"fed_addr"` - LBCAddr string `json:"lbcAddr" db:"lbc_addr"` - LPRSKAddr string `json:"lpRSKAddr" db:"lp_rsk_addr"` - BTCRefundAddr string `json:"btcRefundAddr" db:"btc_refund_addr"` - RSKRefundAddr string `json:"rskRefundAddr" db:"rsk_refund_addr"` - LPBTCAddr string `json:"lpBTCAddr" db:"lp_btc_addr"` - CallFee *types.Wei `json:"callFee" db:"call_fee"` - PenaltyFee *types.Wei `json:"penaltyFee" db:"penalty_fee"` - ContractAddr string `json:"contractAddr" db:"contract_addr"` - Data string `json:"data" db:"data"` - GasLimit uint32 `json:"gasLimit,omitempty" db:"gas_limit"` - Nonce int64 `json:"nonce" db:"nonce"` - Value *types.Wei `json:"value" db:"value"` - AgreementTimestamp uint32 `json:"agreementTimestamp" db:"agreement_timestamp"` - TimeForDeposit uint32 `json:"timeForDeposit" db:"time_for_deposit"` - LpCallTime uint32 `json:"lpCallTime" db:"call_time"` - Confirmations uint16 `json:"confirmations" db:"confirmations"` - CallOnRegister bool `json:"callOnRegister" db:"call_on_register"` - GasFee *types.Wei `json:"gasFee" db:"gas_fee"` - ProductFeeAmount uint64 `json:"productFeeAmount" db:"product_fee_amount"` -} - -type PunishmentEvent struct { - LiquidityProvider common.Address - Penalty *big.Int - QuoteHash string -} diff --git a/pegout/liquidity_provider.go b/pegout/liquidity_provider.go deleted file mode 100644 index e3ed8f02..00000000 --- a/pegout/liquidity_provider.go +++ /dev/null @@ -1,189 +0,0 @@ -package pegout - -import ( - "bytes" - "encoding/hex" - "fmt" - "math/big" - "math/rand" - "sort" - "sync" - "time" - - "github.com/rsksmart/liquidity-provider-server/account" - - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/ethereum/go-ethereum/common" - gethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider/types" -) - -type LocalProvider struct { - mu sync.Mutex - account *accounts.Account - ks *keystore.KeyStore - cfg *ProviderConfig - repository LocalProviderRepository - chainId *big.Int -} - -type ProviderConfig struct { - pegin.ProviderConfig `env:",squash"` - DepositConfirmations uint16 `env:"DEPOSIT_CONFIRMATIONS"` - DepositDateLimit uint32 `env:"DEPOSIT_DATE_LIMIT"` - TransferConfirmations uint16 `env:"TRANSFER_CONFIRMATIONS"` - TransferTime uint32 `env:"TRANSFER_TIME"` - ExpireDate uint32 `env:"EXPIRE_DATE"` - ExpireBlocks uint32 `env:"EXPIRE_BLOCKS"` -} - -type LocalProviderRepository interface { - RetainPegOutQuote(rq *RetainedQuote) error - HasRetainedPegOutQuote(hash string) (bool, error) - HasLiquidityPegOut(satoshis uint64) (bool, error) -} - -type LiquidityProvider interface { - Address() string - GetQuote(*Quote, uint64, *types.Wei) (*Quote, error) - SignQuote(hash []byte, depositAddr string, satoshis uint64) ([]byte, error) - SignTx(common.Address, *gethTypes.Transaction) (*gethTypes.Transaction, error) - GetCreationBlock(quote *Quote) uint32 - HasLiquidity(reqLiq *types.Wei) (bool, error) -} - -func NewLocalProvider(config *ProviderConfig, repository LocalProviderRepository, accountProvider account.AccountProvider, chainId *big.Int) (*LocalProvider, error) { - acc, err := accountProvider.GetAccount() - - if err != nil { - return nil, err - } - lp := LocalProvider{ - account: acc.Account, - ks: acc.Keystore, - cfg: config, - repository: repository, - chainId: chainId, - } - return &lp, nil -} - -func GetPegoutProviderByAddress(liquidityProvider LiquidityProvider, addr string) LiquidityProvider { - if liquidityProvider.Address() == addr { - return liquidityProvider - } - return nil -} - -func (lp *LocalProvider) GetQuote(q *Quote, rskLastBlockNumber uint64, transactionFee *types.Wei) (*Quote, error) { - res := *q - res.LPRSKAddr = lp.account.Address.String() - res.AgreementTimestamp = uint32(time.Now().Unix()) - res.Nonce = int64(rand.Int()) - res.DepositDateLimit = res.AgreementTimestamp + lp.cfg.DepositDateLimit - res.TransferConfirmations = lp.cfg.TransferConfirmations - res.TransferTime = lp.cfg.TransferTime - res.ExpireDate = res.AgreementTimestamp + lp.cfg.ExpireDate - res.ExpireBlock = lp.cfg.ExpireBlocks + uint32(rskLastBlockNumber) - res.PenaltyFee = lp.cfg.PenaltyFee.Uint64() - res.LpBTCAddr = lp.cfg.BtcAddr - - res.DepositConfirmations = lp.cfg.MaxConf - for _, k := range sortedConfirmations(lp.cfg.Confirmations) { - v := lp.cfg.Confirmations[k] - - if res.Value.Uint64() < uint64(k) { - res.DepositConfirmations = v - break - } - } - - res.GasFee = transactionFee - res.CallFee = lp.cfg.Fee - return &res, nil -} - -func sortedConfirmations(m map[int]uint16) []int { - keys := make([]int, len(m)) - i := 0 - for k := range m { - keys[i] = k - i++ - } - sort.Ints(keys) - return keys -} - -func (lp *LocalProvider) Address() string { - return lp.account.Address.String() -} - -func (lp *LocalProvider) SignQuote(hash []byte, depositAddr string, satoshis uint64) ([]byte, error) { - quoteHash := hex.EncodeToString(hash) - - var buf bytes.Buffer - buf.WriteString("\x19Ethereum Signed Message:\n32") - buf.Write(hash) - fmt.Println("Liquidity provider") - fmt.Println(lp.account) - signB, err := lp.ks.SignHash(*lp.account, crypto.Keccak256(buf.Bytes())) - if err != nil { - return nil, err - } - signB[len(signB)-1] += 27 // v must be 27 or 28 - - lp.mu.Lock() - defer lp.mu.Unlock() - - hasRq, err := lp.repository.HasRetainedPegOutQuote(quoteHash) - if err != nil { - return nil, err - } - if !hasRq { - hasLiquidity, err := lp.repository.HasLiquidityPegOut(satoshis) - if err != nil { - return nil, err - } - if !hasLiquidity { - return nil, fmt.Errorf("not enough liquidity. required: %v", satoshis) - } - - signature := hex.EncodeToString(signB) - rq := RetainedQuote{ - QuoteHash: quoteHash, - DepositAddr: depositAddr, - Signature: signature, - ReqLiq: satoshis, - State: types.RQStateWaitingForDeposit, - } - err = lp.repository.RetainPegOutQuote(&rq) - if err != nil { - return nil, err - } - } - - return signB, nil -} - -func (lp *LocalProvider) SignTx(address common.Address, tx *gethTypes.Transaction) (*gethTypes.Transaction, error) { - if !bytes.Equal(address[:], lp.account.Address[:]) { - return nil, fmt.Errorf("provider address %v is incorrect", address.Hash()) - } - return lp.ks.SignTx(*lp.account, tx, lp.chainId) -} - -func (lp *LocalProvider) GetCreationBlock(quote *Quote) uint32 { - return quote.ExpireBlock - lp.cfg.ExpireBlocks -} - -func (lp *LocalProvider) HasLiquidity(reqLiq *types.Wei) (bool, error) { - hasLiquidity, err := lp.repository.HasLiquidityPegOut(reqLiq.Uint64()) - if err != nil { - return false, err - } - - return hasLiquidity, err -} diff --git a/pegout/pegout_quote.go b/pegout/pegout_quote.go deleted file mode 100644 index 33857b31..00000000 --- a/pegout/pegout_quote.go +++ /dev/null @@ -1,54 +0,0 @@ -package pegout - -import ( - "github.com/ethereum/go-ethereum/common" - "github.com/rsksmart/liquidity-provider/types" - "math/big" - "time" -) - -type Quote struct { - LBCAddr string `json:"lbcAddress" db:"lbc_addr" validate:"required"` - LPRSKAddr string `json:"liquidityProviderRskAddress" db:"lp_rsk_addr" validate:"required"` - BtcRefundAddr string `json:"btcRefundAddress" db:"btc_refund_addr" validate:"required"` - RSKRefundAddr string `json:"rskRefundAddress" db:"rsk_refund_addr" validate:"required"` - LpBTCAddr string `json:"lpBtcAddr" db:"lp_btc_addr" validate:"required"` - CallFee *types.Wei `json:"callFee" db:"callFee" validate:"required"` - PenaltyFee uint64 `json:"penaltyFee" db:"penalty_fee" validate:"required"` - Nonce int64 `json:"nonce" db:"nonce" validate:"required"` - DepositAddr string `json:"depositAddr" db:"deposit_addr" validate:"required"` - Value *types.Wei `json:"value" db:"value" validate:"required"` - AgreementTimestamp uint32 `json:"agreementTimestamp" db:"agreement_timestamp" validate:"required"` - DepositDateLimit uint32 `json:"depositDateLimit" db:"deposit_date_limit" validate:"required"` - DepositConfirmations uint16 `json:"depositConfirmations" db:"deposit_confirmations" validate:"required"` - TransferConfirmations uint16 `json:"transferConfirmations" db:"transfer_confirmations" validate:"required"` - TransferTime uint32 `json:"transferTime" db:"transfer_time" validate:"required"` - ExpireDate uint32 `json:"expireDate" db:"expire_date" validate:"required"` - ExpireBlock uint32 `json:"expireBlocks" db:"expire_blocks" validate:"required"` - GasFee *types.Wei `json:"gasFee" db:"gas_fee" validate:"required"` - ProductFeeAmount uint64 `json:"productFeeAmount" db:"product_fee_amount" validate:"required"` -} - -func (q *Quote) GetExpirationTime() time.Time { - return time.Unix(int64(q.ExpireDate), 0) -} - -type QuoteState struct { - StatusCode uint8 - ReceivedAmount *big.Int -} - -type DepositEvent struct { - TxHash common.Hash `json:"-"` - QuoteHash string `json:"quoteHash" example:"0x0" description:"QuoteHash"` - Amount *big.Int `json:"amount" example:"10000" description:"Event Value"` - Timestamp time.Time `json:"timestamp" example:"10000" description:"Event Timestamp"` - BlockNumber uint64 `json:"-"` - From common.Address `json:"from" example:"0x0" description:"From Address"` -} - -func (event *DepositEvent) IsValidForQuote(quote *Quote) bool { - enoughAmount := event.Amount.Cmp(new(types.Wei).Add(quote.Value, quote.CallFee).AsBigInt()) >= 0 - nonExpired := event.Timestamp.Before(quote.GetExpirationTime()) - return enoughAmount && nonExpired -} diff --git a/pegout/pegout_retained_quote.go b/pegout/pegout_retained_quote.go deleted file mode 100644 index 9e031389..00000000 --- a/pegout/pegout_retained_quote.go +++ /dev/null @@ -1,13 +0,0 @@ -package pegout - -import "github.com/rsksmart/liquidity-provider/types" - -type RetainedQuote struct { - QuoteHash string `json:"quoteHash" db:"quote_hash"` - DepositAddr string `json:"depositAddr" db:"deposit_addr"` - Signature string `json:"signature" db:"signature"` - ReqLiq uint64 `json:"reqLiq" db:"req_liq"` - State types.RQState `json:"state" db:"state"` - DepositTransaction string `json:"depositTransaction" db:"deposit_transaction" bson:"deposit_transaction"` - LpBtcTransaction string `json:"lpBtcTransaction" db:"lp_btc_transaction" bson:"lp_btc_transaction"` -} diff --git a/secrets/aws.go b/secrets/aws.go deleted file mode 100644 index 1eb60ea8..00000000 --- a/secrets/aws.go +++ /dev/null @@ -1,69 +0,0 @@ -package secrets - -import ( - "context" - "encoding/json" - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/service/secretsmanager" -) - -type SecretsManagerStorage[secretType any] struct { - client *secretsmanager.Client -} - -func NewSecretsManagerStorage[secretType any](config aws.Config) SecretStorage[secretType] { - secretsManager := secretsmanager.NewFromConfig(config) - return &SecretsManagerStorage[secretType]{client: secretsManager} -} - -func (secretsManager *SecretsManagerStorage[secretType]) SaveJsonSecret(name string, secret *secretType) error { - if secretBytes, err := json.Marshal(secret); err != nil { - return err - } else { - return secretsManager.SaveTextSecret(name, string(secretBytes)) - } -} - -func (secretsManager *SecretsManagerStorage[secretType]) SaveTextSecret(name, secret string) error { - ctx, cancel := context.WithTimeout(context.Background(), WriteTimeout) - defer cancel() - - _, err := secretsManager.client.CreateSecret(ctx, &secretsmanager.CreateSecretInput{ - Name: &name, - SecretString: &secret, - }) - - return err -} - -func (secretsManager *SecretsManagerStorage[secretType]) GetJsonSecret(name string) (*secretType, error) { - secretString, err := secretsManager.GetTextSecret(name) - if err != nil { - return nil, err - } - - var secret secretType - if err = json.Unmarshal([]byte(secretString), &secret); err != nil { - return nil, err - } - return &secret, nil -} - -func (secretsManager *SecretsManagerStorage[secretType]) GetTextSecret(name string) (string, error) { - ctx, cancel := context.WithTimeout(context.Background(), ReadTimeout) - defer cancel() - - value, err := secretsManager.client.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: &name}) - if err != nil { - return "", err - } - return *value.SecretString, nil -} - -func (secretsManager *SecretsManagerStorage[secretType]) DeleteSecret(name string) error { - ctx, cancel := context.WithTimeout(context.Background(), WriteTimeout) - defer cancel() - - _, err := secretsManager.client.DeleteSecret(ctx, &secretsmanager.DeleteSecretInput{SecretId: &name}) - return err -} diff --git a/secrets/secrets.go b/secrets/secrets.go deleted file mode 100644 index 21fe3328..00000000 --- a/secrets/secrets.go +++ /dev/null @@ -1,18 +0,0 @@ -package secrets - -import ( - "time" -) - -const ( - WriteTimeout = 10 * time.Second - ReadTimeout -) - -type SecretStorage[secretType any] interface { - SaveJsonSecret(name string, secret *secretType) error - SaveTextSecret(name, secret string) error - GetJsonSecret(name string) (*secretType, error) - GetTextSecret(name string) (string, error) - DeleteSecret(name string) error -} diff --git a/storage/db.go b/storage/db.go deleted file mode 100644 index 43c50c3c..00000000 --- a/storage/db.go +++ /dev/null @@ -1,343 +0,0 @@ -package storage - -import ( - "database/sql" - "fmt" - - "github.com/jmoiron/sqlx" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" - _ "modernc.org/sqlite" -) - -const ( - driver = "sqlite" -) - -type DBConnector interface { - CheckConnection() error - Close() error - InsertQuote(id string, q *pegin.Quote) error - InsertPegOutQuote(id string, q *pegout.Quote, derivationAddress string) error - GetQuote(quoteHash string) (*pegin.Quote, error) // returns nil if not found - GetPegOutQuote(quoteHash string) (*pegout.Quote, error) - DeleteExpiredQuotes(expTimestamp int64) error - RetainQuote(entry *types.RetainedQuote) error - RetainPegOutQuote(entry *pegout.RetainedQuote) error - GetRetainedQuotes(filter []types.RQState) ([]*types.RetainedQuote, error) - GetRetainedQuote(hash string) (*types.RetainedQuote, error) // returns nil if not found - GetRetainedPegOutQuote(hash string) (*pegout.RetainedQuote, error) - UpdateRetainedQuoteState(hash string, oldState types.RQState, newState types.RQState) error - UpdateRetainedPegOutQuoteState(hash string, oldState types.RQState, newState types.RQState) error - GetLockedLiquidity() (*types.Wei, error) -} - -type DB struct { - db *sqlx.DB -} - -type QuoteHash struct { - QuoteHash string `db:"quote_hash"` -} - -type UpdateQuoteState struct { - QuoteHash string `db:"quote_hash"` - OldState types.RQState `db:"old_state"` - NewState types.RQState `db:"new_state"` -} - -func (db *DB) CheckConnection() error { - return db.db.Ping() -} - -func Connect(dbPath string) (*DB, error) { - log.Debug("connecting to DB: ", dbPath) - db, err := sqlx.Connect(driver, dbPath) - if err != nil { - return nil, err - } - - if _, err := db.Exec(enableForeignKeysCheck); err != nil { - return nil, err - } - //Peg in - if _, err := db.Exec(createQuoteTable); err != nil { - return nil, err - } - if _, err := db.Exec(createRetainedQuoteTable); err != nil { - return nil, err - } - if _, err := db.Exec(createRetainedQuoteIndexes); err != nil { - return nil, err - } - //Peg out - if _, err := db.Exec(createPegoutQuoteTable); err != nil { - return nil, err - } - if _, err := db.Exec(createRetainedPegoutQuoteTable); err != nil { - return nil, err - } - if _, err := db.Exec(createRetainedPegoutQuoteIndexes); err != nil { - return nil, err - } - - return &DB{db}, nil -} - -func (db *DB) Close() error { - log.Debug("closing connection to DB") - err := db.db.Close() - if err != nil { - return err - } - return nil -} - -func (db *DB) InsertQuote(id string, q *pegin.Quote) error { - log.Debug("inserting quote{", id, "}", ": ", q) - query, args, _ := sqlx.Named(insertQuote, q) - args = append(args, 0) - copy(args[1:], args) - args[0] = id - - if _, err := db.db.Exec(query, args...); err != nil { - return err - } - return nil -} - -func (db *DB) InsertPegOutQuote(id string, q *pegout.Quote, derivationAddress string) error { - log.Debug("inserting pegout_quote{", id, "}", ": ", q) - query, args, _ := sqlx.Named(insertPegOutQuote, q) - args = append(args, 0) - copy(args[1:], args) - args[0] = id - args = append(args, derivationAddress) - fmt.Println(args) - if _, err := db.db.Exec(query, args...); err != nil { - return err - } - return nil -} - -func (db *DB) GetQuote(quoteHash string) (*pegin.Quote, error) { - log.Debug("retrieving quote: ", quoteHash) - quote := pegin.Quote{} - err := db.db.Get("e, selectQuoteByHash, quoteHash) - switch err { - case nil: - return "e, nil - case sql.ErrNoRows: - return nil, nil - default: - return nil, err - } -} - -func (db *DB) GetPegOutQuote(quoteHash string) (*pegout.Quote, error) { - log.Debug("retrieving pegout quote: ", quoteHash) - quote := pegout.Quote{} - err := db.db.Get("e, selectPegOutQuoteByHash, quoteHash) - switch err { - case nil: - return "e, nil - case sql.ErrNoRows: - return nil, nil - default: - return nil, err - } -} - -func (db *DB) DeleteExpiredQuotes(expTimestamp int64) error { - log.Debug("deleting expired quotes...") - res, err := db.db.Exec(deleteExpiredQuotes, expTimestamp) - if err != nil { - return err - } - - rowsAffected, err := res.RowsAffected() - if err != nil { - return err - } - - if rowsAffected > 0 { - log.Infof("deleted %v expired quote(s)", rowsAffected) - } else { - log.Debug("no expired quotes found; nothing to delete") - } - - return nil -} - -func (db *DB) RetainQuote(entry *types.RetainedQuote) error { - log.Debug("inserting retained quote:", entry.QuoteHash, "; DepositAddr: ", entry.DepositAddr, "; Signature: ", entry.Signature, "; ReqLiq: ", entry.ReqLiq) - query, args, _ := sqlx.Named(insertRetainedQuote, entry) - - _, err := db.db.Exec(query, args...) - if err != nil { - return err - } - - return nil -} - -func (db *DB) RetainPegOutQuote(entry *pegout.RetainedQuote) error { - log.Debug("inserting retained quote:", entry.QuoteHash, "; DepositAddr: ", entry.DepositAddr, "; Signature: ", entry.Signature, "; ReqLiq: ", entry.ReqLiq) - query, args, _ := sqlx.Named(insertRetainedPegOutQuote, entry) - - _, err := db.db.Exec(query, args...) - if err != nil { - return err - } - - return nil -} - -func (db *DB) GetRetainedQuotes(filter []types.RQState) ([]*types.RetainedQuote, error) { - log.Debug("retrieving retained quotes") - var retainedQuotes []*types.RetainedQuote - - query, args, err := sqlx.In(selectRetainedQuotes, filter) - if err != nil { - return nil, err - } - rows, err := db.db.Queryx(query, args...) - if err != nil { - return nil, err - } - defer func(rows *sqlx.Rows) { - _ = rows.Close() - }(rows) - - for rows.Next() { - entry := types.RetainedQuote{} - - err = rows.StructScan(&entry) - if err != nil { - return nil, err - } - - retainedQuotes = append(retainedQuotes, &entry) - } - - return retainedQuotes, nil -} - -func (db *DB) GetRetainedQuote(hash string) (*types.RetainedQuote, error) { - log.Debug("getting retained quote: ", hash) - rows, err := db.db.Queryx(getRetainedQuote, hash) - if err != nil { - return nil, err - } - defer func(rows *sqlx.Rows) { - _ = rows.Close() - }(rows) - - if rows.Next() { - entry := types.RetainedQuote{} - - err = rows.StructScan(&entry) - if err != nil { - return nil, err - } - - return &entry, nil - } - - return nil, nil -} - -func (db *DB) GetRetainedPegOutQuote(hash string) (*pegout.RetainedQuote, error) { - log.Debug("getting retained quote: ", hash) - rows, err := db.db.Queryx(getRetainedPegOutQuote, hash) - if err != nil { - return nil, err - } - defer func(rows *sqlx.Rows) { - _ = rows.Close() - }(rows) - - if rows.Next() { - entry := pegout.RetainedQuote{} - - err = rows.StructScan(&entry) - if err != nil { - return nil, err - } - - return &entry, nil - } - - return nil, nil -} - -func (db *DB) UpdateRetainedQuoteState(hash string, oldState types.RQState, newState types.RQState) error { - log.Debugf("updating state from %v to %v for retained quote: %v", oldState, newState, hash) - - query, args, _ := sqlx.Named(updateRetainedQuoteState, UpdateQuoteState{QuoteHash: hash, OldState: oldState, NewState: newState}) - res, err := db.db.Exec(query, args...) - if err != nil { - return err - } - rowsAffected, err := res.RowsAffected() - if err != nil { - return err - } - if rowsAffected != 1 { - return fmt.Errorf("error updating retained quote: %v; oldState: %v; newState: %v", hash, oldState, newState) - } - - return nil -} - -func (db *DB) UpdateRetainedPegOutQuoteState(hash string, oldState types.RQState, newState types.RQState) error { - log.Debugf("updating state from %v to %v for retained quote: %v", oldState, newState, hash) - - query, args, _ := sqlx.Named(updateRetainedPegOutQuoteState, UpdateQuoteState{QuoteHash: hash, OldState: oldState, NewState: newState}) - res, err := db.db.Exec(query, args...) - if err != nil { - return err - } - rowsAffected, err := res.RowsAffected() - if err != nil { - return err - } - if rowsAffected != 1 { - return fmt.Errorf("error updating retained quote: %v; oldState: %v; newState: %v", hash, oldState, newState) - } - - return nil -} - -func (db *DB) GetLockedLiquidity() (*types.Wei, error) { - log.Debug("retrieving locked liquidity") - - filter := []types.RQState{types.RQStateWaitingForDeposit, types.RQStateCallForUserFailed} - query, args, err := sqlx.In(selectRetainedQuotesReqLiq, filter) - if err != nil { - return nil, err - } - rows, err := db.db.Queryx(query, args...) - if err != nil { - return nil, err - } - defer func(rows *sqlx.Rows) { - _ = rows.Close() - }(rows) - - lockedLiq := types.NewWei(0) - for rows.Next() { - reqLiq := new(types.Wei) - - err = rows.Scan(reqLiq) - if err != nil { - return nil, err - } - - lockedLiq.Add(lockedLiq, reqLiq) - } - - return lockedLiq, nil -} diff --git a/storage/lprepo.go b/storage/lprepo.go deleted file mode 100644 index 1373b7c1..00000000 --- a/storage/lprepo.go +++ /dev/null @@ -1,78 +0,0 @@ -package storage - -import ( - "math/big" - - "github.com/rsksmart/liquidity-provider-server/connectors" - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" -) - -type LPRepository struct { - dbMongo mongoDB.DBConnector - rsk connectors.RSKConnector - btc connectors.BTCConnector -} - -func NewLPRepository(dbMongo mongoDB.DBConnector, rsk connectors.RSKConnector, btc connectors.BTCConnector) *LPRepository { - return &LPRepository{dbMongo, rsk, btc} -} - -func (r *LPRepository) RetainQuote(rq *types.RetainedQuote) error { - return r.dbMongo.RetainQuote(rq) -} - -func (r *LPRepository) HasRetainedQuote(hash string) (bool, error) { - rq, err := r.dbMongo.GetRetainedQuote(hash) - if err != nil { - return false, err - } - return rq != nil, nil -} - -func (r *LPRepository) HasLiquidity(lp pegin.LiquidityProvider, wei *types.Wei) (bool, error) { - log.Debug("Verifying if has liquidity") - lpBalance, err := r.rsk.GetAvailableLiquidity(lp.Address()) - log.Debug("LP balance ", lpBalance.Text(10)) - if err != nil { - return false, err - } - lockedLiquidity, err := r.dbMongo.GetLockedLiquidity() - log.Debug("Locked Liquidity ", lockedLiquidity.String()) - if err != nil { - return false, err - } - return new(types.Wei).Sub(types.NewBigWei(lpBalance), lockedLiquidity).Cmp(wei) >= 0, nil -} - -func (r *LPRepository) RetainPegOutQuote(rq *pegout.RetainedQuote) error { - return r.dbMongo.RetainPegOutQuote(rq) -} - -func (r *LPRepository) HasRetainedPegOutQuote(hash string) (bool, error) { - rq, err := r.dbMongo.GetRetainedPegOutQuote(hash) - if err != nil { - return false, err - } - return rq != nil, nil -} - -func (r *LPRepository) HasLiquidityPegOut(satoshis uint64) (bool, error) { - log.Debug("Verifying if has liquidity") - - lpBalance, err := r.btc.GetAvailableLiquidity() - log.Debugf("LP balance %v satoshis\n", lpBalance) - if err != nil { - return false, err - } - lockedLiquidity, err := r.dbMongo.GetLockedLiquidityPegOut() - log.Debugf("Locked Liquidity %d satoshis\n", lockedLiquidity) - if err != nil { - return false, err - } - - return new(big.Int).Sub(lpBalance.Mul(big.NewInt(int64(10000000000)), lpBalance), big.NewInt(int64(lockedLiquidity))).Cmp(big.NewInt(int64(satoshis))) >= 0, nil -} diff --git a/storage/queries.go b/storage/queries.go deleted file mode 100644 index 690a8b23..00000000 --- a/storage/queries.go +++ /dev/null @@ -1,227 +0,0 @@ -package storage - -const selectQuoteByHash = ` -SELECT - fed_addr, - lbc_addr, - lp_rsk_addr, - btc_refund_addr, - rsk_refund_addr, - lp_btc_addr, - call_fee, - penalty_fee, - contract_addr, - data, - gas_limit, - nonce, - value, - agreement_timestamp, - time_for_deposit, - call_time, - confirmations, - call_on_register -FROM quotes -WHERE hash = ? -LIMIT 1` - -const insertQuote = ` -INSERT INTO quotes ( - hash, - fed_addr, - lbc_addr, - lp_rsk_addr, - btc_refund_addr, - rsk_refund_addr, - lp_btc_addr, - call_fee, - penalty_fee, - contract_addr, - data, - gas_limit, - nonce, - value, - agreement_timestamp, - time_for_deposit, - call_time, - confirmations, - call_on_register -) -VALUES ( - ?, - :fed_addr, - :lbc_addr, - :lp_rsk_addr, - :btc_refund_addr, - :rsk_refund_addr, - :lp_btc_addr, - :call_fee, - :penalty_fee, - :contract_addr, - :data, - :gas_limit, - :nonce, - :value, - :agreement_timestamp, - :time_for_deposit, - :call_time, - :confirmations, - :call_on_register -) -` - -const deleteExpiredQuotes = ` -DELETE FROM quotes -WHERE hash NOT IN (SELECT quote_hash FROM retained_quotes) -AND agreement_timestamp + time_for_deposit < ? -` - -const getRetainedQuote = ` -SELECT - quote_hash, - deposit_addr, - signature, - req_liq, - state -FROM retained_quotes -WHERE quote_hash = ? -LIMIT 1` - -const insertRetainedQuote = ` -INSERT INTO retained_quotes ( - quote_hash, - deposit_addr, - signature, - req_liq, - state -) -VALUES ( - :quote_hash, - :deposit_addr, - :signature, - :req_liq, - :state -) -` - -const updateRetainedQuoteState = ` -UPDATE retained_quotes -SET state = :new_state -WHERE quote_hash = :quote_hash AND state = :old_state -` - -const selectRetainedQuotes = ` -SELECT - quote_hash, - deposit_addr, - signature, - req_liq, - state -FROM retained_quotes -WHERE state IN (?) -` - -const selectRetainedQuotesReqLiq = ` -SELECT - req_liq -FROM retained_quotes -WHERE state IN (?) -` - -const insertPegOutQuote = ` -INSERT INTO pegout_quotes ( - hash, - lbc_addr, - lp_rsk_addr, - rsk_refund_addr, - fee, - penalty_fee, - nonce, - value, - agreement_timestamp, - deposit_date_limit, - deposit_confirmations, - transfer_confirmations, - transfer_time, - expire_date, - expire_blocks, - derivation_address -) -VALUES ( - ?, - :lbc_addr, - :lp_rsk_addr, - :rsk_refund_addr, - :fee, - :penalty_fee, - :nonce, - :value, - :agreement_timestamp, - :deposit_date_limit, - :deposit_confirmations, - :transfer_confirmations, - :transfer_time, - :expire_date, - :expire_blocks, - ? -) -` - -const insertRetainedPegOutQuote = ` -INSERT INTO retained_pegout_quotes ( - quote_hash, - deposit_addr, - signature, - req_liq, - state -) -VALUES ( - :quote_hash, - :deposit_addr, - :signature, - :req_liq, - :state -) -` - -const updateRetainedPegOutQuoteState = ` -UPDATE retained_pegout_quotes -SET state = :new_state -WHERE quote_hash = :quote_hash AND state = :old_state -` - -const getRetainedPegOutQuote = ` -SELECT - quote_hash, - deposit_addr, - signature, - req_liq, - state -FROM retained_pegout_quotes -WHERE quote_hash = ? -LIMIT 1` - -const deleteExpiredPegOutQuotes = ` -DELETE FROM pegout_quotes -WHERE hash NOT IN (SELECT quote_hash FROM retained_quotes) -AND agreement_timestamp + time_for_deposit < ? -` - -const selectPegOutQuoteByHash = ` -SELECT - lbc_addr, - lp_rsk_addr, - rsk_refund_addr, - fee, - penalty_fee, - nonce, - value, - agreement_timestamp, - deposit_date_limit, - deposit_confirmations, - transfer_confirmations, - transfer_time, - expire_date, - expire_blocks -FROM pegout_quotes -WHERE hash = ? -LIMIT 1` diff --git a/storage/tables.go b/storage/tables.go deleted file mode 100644 index 10423c7f..00000000 --- a/storage/tables.go +++ /dev/null @@ -1,82 +0,0 @@ -package storage - -const enableForeignKeysCheck = ` -PRAGMA foreign_keys = ON -` - -const createQuoteTable = ` -CREATE TABLE IF NOT EXISTS quotes ( - hash TEXT PRIMARY KEY, - fed_addr TEXT , - lbc_addr TEXT, - lp_rsk_addr TEXT, - btc_refund_addr TEXT, - rsk_refund_addr TEXT, - lp_btc_addr TEXT, - call_fee TEXT, - penalty_fee TEXT, - contract_addr TEXT, - data TEXT, - gas_limit INTEGER, - nonce INTEGER, - value TEXT, - agreement_timestamp INTEGER, - time_for_deposit INTEGER, - call_time INTEGER, - confirmations INTEGER, - call_on_register INTEGER -) -` - -const createRetainedQuoteTable = ` -CREATE TABLE IF NOT EXISTS retained_quotes ( - quote_hash TEXT PRIMARY KEY NOT NULL, - deposit_addr TEXT NOT NULL, - signature TEXT NOT NULL, - req_liq TEXT NOT NULL, - state INTEGER NOT NULL, - FOREIGN KEY(quote_hash) REFERENCES quotes(hash) -) -` - -const createRetainedQuoteIndexes = ` -CREATE INDEX IF NOT EXISTS retained_quotes_state_idx -ON retained_quotes (state) -` - -const createPegoutQuoteTable = ` -CREATE TABLE IF NOT EXISTS pegout_quotes ( - hash TEXT PRIMARY KEY, - lbc_addr TEXT, - lp_rsk_addr TEXT, - rsk_refund_addr TEXT, - fee TEXT, - penalty_fee TEXT, - nonce INTEGER, - value TEXT, - agreement_timestamp INTEGER, - deposit_date_limit INTEGER, - deposit_confirmations INTEGER, - transfer_confirmations INTEGER, - transfer_time INTEGER, - expire_date INTEGER, - expire_blocks INTEGER, - derivation_address TEXT -) -` - -const createRetainedPegoutQuoteTable = ` -CREATE TABLE IF NOT EXISTS retained_pegout_quotes ( - quote_hash TEXT PRIMARY KEY NOT NULL, - deposit_addr TEXT NOT NULL, - signature TEXT NOT NULL, - req_liq TEXT NOT NULL, - state INTEGER NOT NULL, - FOREIGN KEY(quote_hash) REFERENCES pegout_quotes(hash) -) -` - -const createRetainedPegoutQuoteIndexes = ` -CREATE INDEX IF NOT EXISTS retained_pegout_quotes_state_idx -ON retained_pegout_quotes (state) -` From bccb7b1c7d0830e868774fc16814ada4291ac2b4 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 29 Jan 2024 09:39:35 -0300 Subject: [PATCH 003/113] fix: pr comments --- cmd/application/lps/application.go | 4 ++++ cmd/application/main.go | 3 +++ internal/adapters/alerting/ses.go | 4 ++-- .../dataproviders/database/mongo/mongo.go | 10 +++++++-- .../entrypoints/rest/middlewares/captcha.go | 4 ++-- .../entrypoints/rest/routes/routes.go | 2 +- .../adapters/entrypoints/watcher/common.go | 6 +++++ .../entrypoints/watcher/liquidity_check.go | 2 +- .../entrypoints/watcher/penalization_alert.go | 2 +- internal/configuration/bootstrap/database.go | 2 +- .../configuration/environment/environment.go | 2 ++ internal/entities/alerts.go | 2 +- .../liquidity_provider/check_liquidity.go | 22 ++++++++++++++----- .../liquidity_provider/penalization_alert.go | 2 +- sample-config.env | 3 ++- 15 files changed, 51 insertions(+), 19 deletions(-) diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 54201a16..ae7b847a 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -36,6 +36,7 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret if err != nil { log.Fatal("Error connecting to BTC node:", err) } + log.Debug("Connected to BTC node") btcRegistry, err := registry.NewBitcoinRegistry(env.Btc, secrets, btcConnection) if err != nil { log.Fatal("Error creating BTC registry:", err) @@ -46,11 +47,13 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret log.Fatal("Error connecting to MongoDB:", err) } dbRegistry := registry.NewDatabaseRegistry(connection) + log.Debug("Connected to MongoDB") account, err := bootstrap.RootstockAccount(env.Rsk, secrets) if err != nil { log.Fatal("Error connecting to RSK account:", err) } + log.Debug("Connected to RSK account") rskClient, err := bootstrap.Rootstock(initCtx, env.Rsk) if err != nil { log.Fatal("Error connecting to RSK node:", err) @@ -59,6 +62,7 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret if err != nil { log.Fatal("Error creating Rootstock registry:", err) } + log.Debug("Connected to RSK node") config := environment.ConfigurationFromEnv(env) liquidityProvider := registry.NewLiquidityProvider(config, dbRegistry, rootstockRegistry, btcRegistry) diff --git a/cmd/application/main.go b/cmd/application/main.go index b7a23a3f..cc9f70d7 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -38,8 +38,11 @@ func main() { } } + log.Info("Initializing application...") app := lps.NewApplication(initCtx, *env, *secrets) + log.Info("Application initialized successfully") cancel() + log.Info("Starting application...") app.Run(*env, logLevel) app.Shutdown() } diff --git a/internal/adapters/alerting/ses.go b/internal/adapters/alerting/ses.go index 740e8eaf..6af0d4db 100644 --- a/internal/adapters/alerting/ses.go +++ b/internal/adapters/alerting/ses.go @@ -17,11 +17,11 @@ func NewSesAlertSender(sesClient *ses.Client, from string) entities.AlertSender return &SesAlertSender{sesClient: sesClient, from: from} } -func (sender *SesAlertSender) SendAlert(ctx context.Context, subject, body, recipient string) error { +func (sender *SesAlertSender) SendAlert(ctx context.Context, subject, body string, recipient []string) error { log.Info("Sending alert to liquidity provider") result, err := sender.sesClient.SendEmail(ctx, &ses.SendEmailInput{ Destination: &sesTypes.Destination{ - ToAddresses: []string{recipient}, + ToAddresses: recipient, }, Message: &sesTypes.Message{ Body: &sesTypes.Body{ diff --git a/internal/adapters/dataproviders/database/mongo/mongo.go b/internal/adapters/dataproviders/database/mongo/mongo.go index 3390604b..02ac5d75 100644 --- a/internal/adapters/dataproviders/database/mongo/mongo.go +++ b/internal/adapters/dataproviders/database/mongo/mongo.go @@ -2,6 +2,7 @@ package mongo import ( "context" + "fmt" log "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -11,11 +12,16 @@ import ( const connectTimeout = 10 * time.Second -func Connect(ctx context.Context, username, password, host string) (*mongo.Client, error) { +func Connect(ctx context.Context, username, password, host string, port uint) (*mongo.Client, error) { var err error var client *mongo.Client log.Info("Connecting to MongoDB") - clientOptions := options.Client().ApplyURI("mongodb://" + username + ":" + password + "@" + host + ":27017/admin") + clientOptions := options.Client().ApplyURI( + fmt.Sprintf( + "mongodb://%s:%s@%s:%d/admin", + username, password, host, port, + ), + ) ctx, cancel := context.WithTimeout(ctx, connectTimeout) defer cancel() diff --git a/internal/adapters/entrypoints/rest/middlewares/captcha.go b/internal/adapters/entrypoints/rest/middlewares/captcha.go index f49efe9f..7387770a 100644 --- a/internal/adapters/entrypoints/rest/middlewares/captcha.go +++ b/internal/adapters/entrypoints/rest/middlewares/captcha.go @@ -18,7 +18,7 @@ type captchaValidationResponse struct { ErrorCodes []string `json:"error-codes"` } -func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecretKey string) func(http.Handler) http.Handler { +func NewCaptchaMiddleware(captchaUrl string, captchaThreshold float32, disabled bool, captchaSecretKey string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { if captchaThreshold < 0.5 { log.Warn("Too low captcha threshold value!") @@ -38,7 +38,7 @@ func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecret form := make(url.Values) form.Set("secret", captchaSecretKey) form.Set("response", token) - res, err := http.DefaultClient.PostForm("https://www.google.com/recaptcha/api/siteverify", form) + res, err := http.DefaultClient.PostForm(captchaUrl, form) if err != nil { details := make(rest.ErrorDetails) details["error"] = err.Error() diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go index c0b6e29c..2d681538 100644 --- a/internal/adapters/entrypoints/rest/routes/routes.go +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -11,7 +11,7 @@ import ( func ConfigureRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { router.Use(middlewares.NewCorsMiddleware()) - captchaMiddleware := middlewares.NewCaptchaMiddleware(env.Captcha.Threshold, env.Captcha.Disabled, env.Captcha.SecretKey) + captchaMiddleware := middlewares.NewCaptchaMiddleware(env.Captcha.Url, env.Captcha.Threshold, env.Captcha.Disabled, env.Captcha.SecretKey) router.Path("/health").Methods(http.MethodGet).HandlerFunc(handlers.NewHealthCheckHandler(useCaseRegistry.HealthUseCase())) router.Path("/getProviders").Methods(http.MethodGet).HandlerFunc(handlers.NewGetProvidersHandler(useCaseRegistry.GetProvidersUseCase())) diff --git a/internal/adapters/entrypoints/watcher/common.go b/internal/adapters/entrypoints/watcher/common.go index f7cbf85c..ef73285f 100644 --- a/internal/adapters/entrypoints/watcher/common.go +++ b/internal/adapters/entrypoints/watcher/common.go @@ -6,6 +6,7 @@ import ( "time" ) +// Watchers intervals const ( quoteCleanInterval = 10 * time.Minute peginDepositWatcherInterval = 1 * time.Minute @@ -16,6 +17,11 @@ const ( penalizationCheckInterval = 10 * time.Minute ) +// Watchers timeouts +const ( + watcherValidationTimeout = 15 * time.Second +) + type Watcher interface { entities.Closeable Prepare(ctx context.Context) error diff --git a/internal/adapters/entrypoints/watcher/liquidity_check.go b/internal/adapters/entrypoints/watcher/liquidity_check.go index 3b1d5378..14ee9deb 100644 --- a/internal/adapters/entrypoints/watcher/liquidity_check.go +++ b/internal/adapters/entrypoints/watcher/liquidity_check.go @@ -35,7 +35,7 @@ watcherLoop: for { select { case <-watcher.ticker.C: - ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) + ctx, cancel = context.WithTimeout(context.Background(), watcherValidationTimeout if err := watcher.checkLiquidityUseCase.Run(ctx); err != nil { log.Error("Error checking liquidity inside watcher: ", err) } diff --git a/internal/adapters/entrypoints/watcher/penalization_alert.go b/internal/adapters/entrypoints/watcher/penalization_alert.go index efd25b7a..bc1312ce 100644 --- a/internal/adapters/entrypoints/watcher/penalization_alert.go +++ b/internal/adapters/entrypoints/watcher/penalization_alert.go @@ -41,7 +41,7 @@ watcherLoop: for { select { case <-watcher.ticker.C: - ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) + ctx, cancel = context.WithTimeout(context.Background(), watcherValidationTimeout) if height, err = watcher.rskRpc.GetHeight(ctx); err != nil { log.Error("Error checking penalization events inside watcher: ", err) } else { diff --git a/internal/configuration/bootstrap/database.go b/internal/configuration/bootstrap/database.go index 0ff8dc36..3b3673b0 100644 --- a/internal/configuration/bootstrap/database.go +++ b/internal/configuration/bootstrap/database.go @@ -8,7 +8,7 @@ import ( ) func Mongo(ctx context.Context, env environment.MongoEnv) (*mongo.Connection, error) { - client, err := mongo.Connect(ctx, env.Username, env.Password, env.Host) + client, err := mongo.Connect(ctx, env.Username, env.Password, env.Host, env.Port) if err == nil { return mongo.NewConnection(client), nil } else { diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index ba9d9f57..d7a5f0b9 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -24,6 +24,7 @@ type MongoEnv struct { Username string `env:"MONGODB_USER" validate:"required"` Password string `env:"MONGODB_PASSWORD" validate:"required"` Host string `env:"MONGODB_HOST" validate:"required"` + Port uint `env:"MONGODB_PORT" validate:"required"` } type RskEnv struct { @@ -86,6 +87,7 @@ type CaptchaEnv struct { SiteKey string `env:"CAPTCHA_SITE_KEY"` Threshold float32 `env:"CAPTCHA_THRESHOLD"` Disabled bool `env:"DISABLE_CAPTCHA"` + Url string `env:"CAPTCHA_URL"` } func LoadEnv() *Environment { diff --git a/internal/entities/alerts.go b/internal/entities/alerts.go index 291bd345..2598dd00 100644 --- a/internal/entities/alerts.go +++ b/internal/entities/alerts.go @@ -3,5 +3,5 @@ package entities import "context" type AlertSender interface { - SendAlert(ctx context.Context, subject, body, recipient string) error + SendAlert(ctx context.Context, subject, body string, recipient []string) error } diff --git a/internal/usecases/liquidity_provider/check_liquidity.go b/internal/usecases/liquidity_provider/check_liquidity.go index ec7bfde8..7624b9be 100644 --- a/internal/usecases/liquidity_provider/check_liquidity.go +++ b/internal/usecases/liquidity_provider/check_liquidity.go @@ -3,12 +3,22 @@ package liquidity_provider import ( "context" "errors" + "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" ) +type OperationType string + +const ( + PeginOperation OperationType = "PegIn" + PegoutOperation OperationType = "PegOut" + MessageSubject string = "%s: Out of liquidity" + MessageBody string = "You are out of liquidity to perform a %s. Please, do a deposit" +) + type CheckLiquidityUseCase struct { peginProvider entities.PeginLiquidityProvider pegoutProvider entities.PegoutLiquidityProvider @@ -32,9 +42,9 @@ func (useCase *CheckLiquidityUseCase) Run(ctx context.Context) error { if errors.Is(err, usecases.NoLiquidityError) { if err = useCase.alertSender.SendAlert( ctx, - "Pegin: Out of liquidity", - "You are out of liquidity to perform a pegin. Please, do a deposit", - useCase.recipient, + fmt.Sprintf(MessageSubject, PeginOperation), + fmt.Sprintf(MessageBody, PeginOperation), + []string{useCase.recipient}, ); err != nil { log.Error("Error sending notification to liquidity provider: ", err) } @@ -46,9 +56,9 @@ func (useCase *CheckLiquidityUseCase) Run(ctx context.Context) error { if errors.Is(err, usecases.NoLiquidityError) { if err = useCase.alertSender.SendAlert( ctx, - "Pegout: Out of liquidity", - "You are out of liquidity to perform a pegout. Please, do a deposit", - useCase.recipient, + fmt.Sprintf(MessageSubject, PegoutOperation), + fmt.Sprintf(MessageBody, PegoutOperation), + []string{useCase.recipient}, ); err != nil { log.Error("Error sending notification to liquidity provider: ", err) } diff --git a/internal/usecases/liquidity_provider/penalization_alert.go b/internal/usecases/liquidity_provider/penalization_alert.go index 3ac21bf1..c4cf051f 100644 --- a/internal/usecases/liquidity_provider/penalization_alert.go +++ b/internal/usecases/liquidity_provider/penalization_alert.go @@ -26,7 +26,7 @@ func (useCase *PenalizationAlertUseCase) Run(ctx context.Context, fromBlock, toB } for _, event := range events { body = fmt.Sprintf("You were punished in %v rBTC for the quoteHash %s", event.Penalty.ToRbtc(), event.QuoteHash) - if err = useCase.sender.SendAlert(ctx, "Pegin Punishment", body, useCase.recipient); err != nil { + if err = useCase.sender.SendAlert(ctx, "Pegin Punishment", body, []string{useCase.recipient}); err != nil { log.Error("Error sending punishment alert: ", err) } } diff --git a/sample-config.env b/sample-config.env index 089d929c..b0abf6e6 100755 --- a/sample-config.env +++ b/sample-config.env @@ -81,4 +81,5 @@ PROVIDER_TYPE=both ALERT_SENDER_EMAIL=no-reply@mail.flyover.rifcomputing.net ALERT_RECIPIENT_EMAIL=test@iovlabs.org -ENABLE_MANAGEMENT_API=TRUE \ No newline at end of file +ENABLE_MANAGEMENT_API=TRUE +CAPTCHA_URL="https://www.google.com/recaptcha/api/siteverify" \ No newline at end of file From 8d7045a669f60ea48f7790aeeab660782905cbb0 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 29 Jan 2024 10:06:24 -0300 Subject: [PATCH 004/113] fix: minor linting issues --- cmd/application/lps/application.go | 2 +- integration/integration_suite_test.txt | 218 ++++++++++++++ integration/pegin_test.txt | 171 +++++++++++ integration/pegout_test.txt | 269 ++++++++++++++++++ integration/setup_test.txt | 187 ++++++++++++ .../adapters/dataproviders/bitcoin/wallet.go | 8 +- .../dataproviders/database/mongo/pegout.go | 10 +- internal/adapters/dataproviders/event.go | 2 +- .../dataproviders/liquidity_provider.go | 8 +- .../dataproviders/rootstock/bridge.go | 10 +- .../dataproviders/rootstock/federation.go | 4 +- .../adapters/dataproviders/rootstock/lbc.go | 4 +- .../adapters/dataproviders/rootstock/rpc.go | 2 +- internal/adapters/entrypoints/rest/common.go | 1 - .../entrypoints/rest/middlewares/captcha.go | 34 ++- .../entrypoints/rest/server/server.go | 4 +- .../watcher/pegin_btc_deposit_watcher.go | 2 +- internal/configuration/bootstrap/bitcoin.go | 6 +- .../configuration/registry/alert_sender.go | 4 +- internal/entities/blockchain/rootstock.go | 1 - internal/entities/wei.go | 4 +- internal/usecases/common.go | 9 +- .../liquidity_provider/registration.go | 4 +- internal/usecases/pegin/accept_pegin_quote.go | 5 +- internal/usecases/pegin/get_collateral.go | 4 +- internal/usecases/pegin/get_pegin_quote.go | 8 +- .../usecases/pegin/withdraw_collateral.go | 3 +- .../usecases/pegout/accept_pegout_quote.go | 3 +- internal/usecases/pegout/get_collateral.go | 4 +- internal/usecases/pegout/get_pegout_quote.go | 7 +- .../usecases/pegout/withdraw_collateral.go | 3 +- .../watcher/get_watched_pegin_quote.go | 2 +- .../watcher/get_watched_pegout_quote.go | 2 +- 33 files changed, 928 insertions(+), 77 deletions(-) create mode 100644 integration/integration_suite_test.txt create mode 100644 integration/pegin_test.txt create mode 100644 integration/pegout_test.txt create mode 100644 integration/setup_test.txt diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 54201a16..f7194dd3 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -62,7 +62,7 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret config := environment.ConfigurationFromEnv(env) liquidityProvider := registry.NewLiquidityProvider(config, dbRegistry, rootstockRegistry, btcRegistry) - alertSender := registry.NewAlertSender(env) + alertSender := registry.NewAlertSender(initCtx, env) eventBus := registry.NewEventBus() mutexes := environment.NewApplicationMutexes() diff --git a/integration/integration_suite_test.txt b/integration/integration_suite_test.txt new file mode 100644 index 00000000..069acf40 --- /dev/null +++ b/integration/integration_suite_test.txt @@ -0,0 +1,218 @@ +package integration_test + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/rpcclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/connectors/bindings" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "io" + "net/http" + "os" + "syscall" + "testing" + "time" +) + +// TODO this file is very likely to change after LPS refactor + +type IntegrationTestSuite struct { + suite.Suite + SetUpCompletedChannel chan error + ServerDoneChannel chan os.Signal + btc *rpcclient.Client + rsk *ethclient.Client + lbc *bindings.LiquidityBridgeContract + btcParams chaincfg.Params + config SuiteConfig +} + +type SuiteConfig struct { + Lps struct { + Url string `json:"url"` + UseTestInstance bool `json:"useTestInstance"` + } `json:"lps"` + Btc struct { + RpcEndpoint string `json:"rpcEndpoint"` + User string `json:"user"` + Password string `json:"password"` + Network string `json:"network"` + } `json:"btc"` + Rsk struct { + RpcUrl string `json:"rpcUrl"` + LbcAddress string `json:"lbcAddress"` + UserPrivateKey string `json:"userPrivateKey"` + } `json:"rsk"` +} + +func (s *IntegrationTestSuite) SetupSuite() { + log.Debug("Setting up integration tests...") + configFile, err := os.Open("integration-test.config.json") + defer configFile.Close() + if err != nil { + s.FailNow("Error reading configuration file", err) + } + configBytes, err := io.ReadAll(configFile) + if err != nil { + s.FailNow("Error reading configuration", err) + } + err = json.Unmarshal(configBytes, &s.config) + if err != nil { + s.FailNow("Error reading configuration", err) + } + + if s.config.Lps.UseTestInstance { + if err = s.setupLps(); err != nil { + s.FailNow("Error setting up LPS", err) + } + time.Sleep(1 * time.Second) + } + + if err = s.setupBtc(); err != nil { + s.FailNow("Error setting up Bitcoin client", err) + } + + if err = s.setupRsk(); err != nil { + s.FailNow("Error setting up RSK client", err) + } + + log.Debug("Set up completed") +} + +func (s *IntegrationTestSuite) TearDownSuite() { + if s.config.Lps.UseTestInstance { + time.Sleep(3 * time.Second) // to allow LPS to finish updating the database after blockchain calls + s.ServerDoneChannel <- syscall.SIGINT + } +} + +func (s *IntegrationTestSuite) setupLps() error { + s.SetUpCompletedChannel = make(chan error, 1) + s.ServerDoneChannel = make(chan os.Signal, 1) + fatalHook := &FatalHook{suite: s} + go setup(s.SetUpCompletedChannel, s.ServerDoneChannel, fatalHook) + err := <-s.SetUpCompletedChannel + return err +} + +func (s *IntegrationTestSuite) setupBtc() error { + switch s.config.Btc.Network { + case "mainnet": + s.btcParams = chaincfg.MainNetParams + case "testnet": + s.btcParams = chaincfg.TestNet3Params + case "regtest": + s.btcParams = chaincfg.RegressionNetParams + default: + return fmt.Errorf("invalid network name: %v", s.config.Btc.Network) + } + + config := rpcclient.ConnConfig{ + Host: s.config.Btc.RpcEndpoint, + User: s.config.Btc.User, + Pass: s.config.Btc.Password, + Params: s.btcParams.Name, + DisableTLS: true, + HTTPPostMode: true, + } + btc, err := rpcclient.New(&config, nil) + if err != nil { + return err + } + s.btc = btc + return nil +} + +func (s *IntegrationTestSuite) setupRsk() error { + rsk, err := ethclient.Dial(s.config.Rsk.RpcUrl) + if err != nil { + return err + } + if !common.IsHexAddress(s.config.Rsk.LbcAddress) { + return errors.New("invalid LBC address") + } + lbcAddress := common.HexToAddress(s.config.Rsk.LbcAddress) + lbc, err := bindings.NewLiquidityBridgeContract(lbcAddress, rsk) + s.rsk = rsk + s.lbc = lbc + return nil +} + +func (s *IntegrationTestSuite) AssertFields(expectedFields []string, object map[string]any) { + for _, field := range expectedFields { + _, exists := object[field] + assert.True(s.T(), exists, fmt.Sprintf("Field %v is missing", field)) + } +} + +type FatalHook struct { + suite *IntegrationTestSuite +} + +func (h *FatalHook) Levels() []log.Level { + return []log.Level{log.FatalLevel} +} + +func (h *FatalHook) Fire(e *log.Entry) error { + h.suite.SetUpCompletedChannel <- errors.New(e.Message) + h.suite.Fail("Unexpected server error", e.Message) + return nil +} + +type Execution struct { + Body any + Method string + URL string +} + +type Result[responseType any] struct { + Response responseType + RawResponse []byte + StatusCode int +} + +func execute[responseType any](execution Execution) (Result[responseType], error) { + payload, err := json.Marshal(execution.Body) + req, err := http.NewRequest(execution.Method, execution.URL, bytes.NewBuffer(payload)) + if err != nil { + return Result[responseType]{}, err + } + + req.Header.Set("Content-Type", "application/json") + client := http.Client{} + + res, err := client.Do(req) + if err != nil { + return Result[responseType]{}, err + } + defer res.Body.Close() + + bodyBytes, err := io.ReadAll(res.Body) + if err != nil { + return Result[responseType]{}, err + } + + var response responseType + err = json.Unmarshal(bodyBytes, &response) + if err != nil { + return Result[responseType]{}, err + } + + result := Result[responseType]{ + Response: response, + StatusCode: res.StatusCode, + RawResponse: bodyBytes, + } + return result, nil +} + +func TestIntegrationTestSuite(t *testing.T) { + suite.Run(t, new(IntegrationTestSuite)) +} diff --git a/integration/pegin_test.txt b/integration/pegin_test.txt new file mode 100644 index 00000000..1f20bd6e --- /dev/null +++ b/integration/pegin_test.txt @@ -0,0 +1,171 @@ +package integration_test + +import ( + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcutil" + "github.com/ethereum/go-ethereum/common" + "github.com/rsksmart/liquidity-provider-server/connectors/bindings" + lps "github.com/rsksmart/liquidity-provider-server/http" + "github.com/rsksmart/liquidity-provider/types" + "github.com/stretchr/testify/assert" + "net/http" +) + +func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { + + var quote lps.QuoteReturn + var acceptedQuote lps.AcceptRes + URL := s.config.Lps.Url + + s.Run("Should be able to get pegin quote", func() { + body := lps.QuoteRequest{ + CallEoaOrContractAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + CallContractArguments: "", + ValueToTransfer: 600000000000000000, + RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + BitcoinRefundAddress: "mxEp7KGqyjFiLnWJoXU6MNXpop8BYe9Gv1", + } + + result, err := execute[[]lps.QuoteReturn](Execution{ + Method: http.MethodPost, + URL: URL + "/pegin/getQuote", + Body: body, + }) + + if err != nil { + assert.Fail(s.T(), "Unexpected error: ", err) + } + + expectedFields := []string{ + "gasFee", + "callOnRegister", + "callFee", + "value", + "gasLimit", + "confirmations", + "btcRefundAddr", + "data", + "lpRSKAddr", + "fedBTCAddr", + "lpBTCAddr", + "contractAddr", + "penaltyFee", + "rskRefundAddr", + "nonce", + "timeForDeposit", + "lpCallTime", + "agreementTimestamp", + "lbcAddr", + } + + var rawResponse []map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + if err != nil { + assert.Fail(s.T(), "Response does not have required format") + } + assert.Equal(s.T(), http.StatusOK, result.StatusCode) + assert.NotEmpty(s.T(), rawResponse[0]["quoteHash"]) + assert.NotEmpty(s.T(), rawResponse[0]["quote"]) + quoteFields, ok := rawResponse[0]["quote"].(map[string]any) + if !ok { + assert.Fail(s.T(), "Quote is not an object") + } + s.AssertFields(expectedFields, quoteFields) + quote = result.Response[0] + }) + + s.Run("Should be able to accept pegin quote", func() { + body := lps.AcceptReq{QuoteHash: quote.QuoteHash} + result, err := execute[lps.AcceptRes](Execution{ + Method: http.MethodPost, + URL: URL + "/pegin/acceptQuote", + Body: body, + }) + if err != nil { + assert.Fail(s.T(), "Unexpected error: ", err) + } + + expectedFields := []string{ + "signature", + "bitcoinDepositAddressHash", + } + + assert.Equal(s.T(), http.StatusOK, result.StatusCode) + var rawResponse map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + if err != nil { + assert.Fail(s.T(), "Response does not have required format") + } + s.AssertFields(expectedFields, rawResponse) + acceptedQuote = result.Response + }) + + s.Run("Should process bitcoin deposit and callForUser", func() { + address, err := btcutil.DecodeAddress(acceptedQuote.BitcoinDepositAddressHash, &s.btcParams) + if err != nil { + assert.Fail(s.T(), "Invalid derivation address") + } + value := types.NewWei(int64(quote.Quote.Value)) + callFee := types.NewWei(int64(quote.Quote.CallFee)) + gasFee := types.NewWei(int64(quote.Quote.GasFee)) + productFee := types.NewWei(int64(quote.Quote.ProductFeeAmount)) + totalFees := new(types.Wei).Add(new(types.Wei).Add(callFee, gasFee), productFee) + totalAmount := new(types.Wei).Add(totalFees, value) + floatAmount, _ := totalAmount.ToRbtc().Float64() + btcAmount, err := btcutil.NewAmount(floatAmount) + if err != nil { + assert.Fail(s.T(), err.Error()) + } + amount, _ := btcutil.NewAmount(0.00025) + _ = s.btc.SetTxFee(amount) + _, err = s.btc.SendToAddress(address, btcAmount) + if err != nil { + assert.FailNow(s.T(), "Error sending btc transaction") + } + + eventChannel := make(chan *bindings.LiquidityBridgeContractCallForUser) + lpAddress := common.HexToAddress(quote.Quote.LPRSKAddr) + toAddress := common.HexToAddress(quote.Quote.ContractAddr) + subscription, err := s.lbc.WatchCallForUser( + nil, + eventChannel, + []common.Address{lpAddress}, + []common.Address{toAddress}, + ) + if err != nil { + assert.FailNow(s.T(), "Error listening for callForUser") + } + + select { + case callForUser := <-eventChannel: + subscription.Unsubscribe() + assert.True(s.T(), callForUser.Success, "Call for user failed") + case err = <-subscription.Err(): + assert.FailNow(s.T(), "Error listening for callForUser") + } + }) + + s.Run("Should call registerPegIn after proper confirmations", func() { + eventChannel := make(chan *bindings.LiquidityBridgeContractPegInRegistered) + var quoteHash [32]byte + hashBytes, _ := hex.DecodeString(quote.QuoteHash) + copy(quoteHash[:], hashBytes) + subscription, err := s.lbc.WatchPegInRegistered( + nil, + eventChannel, + [][32]byte{quoteHash}, + ) + if err != nil { + assert.FailNow(s.T(), "Error listening for callForUser") + } + + select { + case registerPegIn := <-eventChannel: + subscription.Unsubscribe() + assert.Positive(s.T(), registerPegIn.TransferredAmount.Int64(), "Register PegIn failed") + case err = <-subscription.Err(): + assert.FailNow(s.T(), "Error listening for callForUser") + } + }) +} diff --git a/integration/pegout_test.txt b/integration/pegout_test.txt new file mode 100644 index 00000000..e5630af9 --- /dev/null +++ b/integration/pegout_test.txt @@ -0,0 +1,269 @@ +package integration_test + +import ( + "context" + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rsksmart/liquidity-provider-server/connectors" + "github.com/rsksmart/liquidity-provider-server/connectors/bindings" + lps "github.com/rsksmart/liquidity-provider-server/http" + "github.com/rsksmart/liquidity-provider/types" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "math/big" + "net/http" + "strings" + "time" +) + +func (s *IntegrationTestSuite) TestSuccessfulPegOutFlow() { + + var quote lps.QuotePegOutResponse + var acceptedQuote lps.AcceptResPegOut + URL := s.config.Lps.Url + + s.Run("Should be able to get pegout quote", func() { + body := lps.QuotePegOutRequest{ + To: "mi1r1QvaBVxLDLBPoZ3jJMUKCYMh7dBkBv", + ValueToTransfer: 600000000000000000, + RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + BitcoinRefundAddress: "mi1r1QvaBVxLDLBPoZ3jJMUKCYMh7dBkBv", + } + + result, err := execute[[]lps.QuotePegOutResponse](Execution{ + Method: http.MethodPost, + URL: URL + "/pegout/getQuotes", + Body: body, + }) + + if err != nil { + assert.Fail(s.T(), "Unexpected error: ", err) + } + + expectedFields := []string{ + "lbcAddress", + "liquidityProviderRskAddress", + "btcRefundAddress", + "rskRefundAddress", + "lpBtcAddr", + "callFee", + "penaltyFee", + "nonce", + "depositAddr", + "value", + "agreementTimestamp", + "depositDateLimit", + "depositConfirmations", + "transferConfirmations", + "transferTime", + "expireDate", + "expireBlocks", + "gasFee", + } + + var rawResponse []map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + if err != nil { + assert.Fail(s.T(), "Response does not have required format") + } + assert.Equal(s.T(), http.StatusOK, result.StatusCode) + assert.NotEmpty(s.T(), rawResponse[0]["quoteHash"]) + assert.NotEmpty(s.T(), rawResponse[0]["quote"]) + quoteFields, ok := rawResponse[0]["quote"].(map[string]any) + if !ok { + assert.Fail(s.T(), "Quote is not an object") + } + s.AssertFields(expectedFields, quoteFields) + quote = result.Response[0] + }) + + s.Run("Should be able to accept pegout quote", func() { + body := lps.AcceptReq{QuoteHash: quote.QuoteHash} + result, err := execute[lps.AcceptResPegOut](Execution{ + Method: http.MethodPost, + URL: URL + "/pegout/acceptQuote", + Body: body, + }) + if err != nil { + assert.Fail(s.T(), "Unexpected error: ", err) + } + + expectedFields := []string{ + "signature", + "lbcAddress", + } + + assert.Equal(s.T(), http.StatusOK, result.StatusCode) + var rawResponse map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + if err != nil { + assert.Fail(s.T(), "Response does not have required format") + } + s.AssertFields(expectedFields, rawResponse) + acceptedQuote = result.Response + }) + + s.Run("Should process depositPegOut execution and transfer bitcoin to user", func() { + var err error + ctx := context.Background() + privateKey, err := crypto.HexToECDSA(s.config.Rsk.UserPrivateKey) + if err != nil { + assert.FailNow(s.T(), "Invalid private key") + } + chainId, err := s.rsk.ChainID(ctx) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + opts, err := bind.NewKeyedTransactorWithChainID(privateKey, chainId) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + + value := types.NewWei(int64(quote.Quote.Value)) + callFee := types.NewWei(int64(quote.Quote.CallFee)) + gasFee := types.NewWei(int64(quote.Quote.GasFee)) + productFee := types.NewWei(int64(quote.Quote.ProductFeeAmount)) + totalFees := new(types.Wei).Add(new(types.Wei).Add(callFee, gasFee), productFee) + totalAmount := new(types.Wei).Add(totalFees, value) + opts.Value = totalAmount.AsBigInt() + + gasPrice, err := s.rsk.SuggestGasPrice(ctx) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + opts.GasPrice = gasPrice + + originalQuote := quote.Quote + lpBtcAddress, err := connectors.DecodeBTCAddress(originalQuote.LpBTCAddr) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + btcRefundAddress, err := connectors.DecodeBTCAddress(originalQuote.BtcRefundAddr) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + depositAddress, err := connectors.DecodeBTCAddress(originalQuote.DepositAddr) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + pegoutQuote := bindings.QuotesPegOutQuote{ + LbcAddress: common.HexToAddress(originalQuote.LBCAddr), + LpRskAddress: common.HexToAddress(originalQuote.LPRSKAddr), + BtcRefundAddress: btcRefundAddress, + RskRefundAddress: common.HexToAddress(originalQuote.RSKRefundAddr), + LpBtcAddress: lpBtcAddress, + CallFee: big.NewInt(int64(originalQuote.CallFee)), + PenaltyFee: big.NewInt(int64(originalQuote.PenaltyFee)), + Nonce: originalQuote.Nonce, + DeposityAddress: depositAddress, + Value: big.NewInt(int64(originalQuote.Value)), + AgreementTimestamp: originalQuote.AgreementTimestamp, + DepositDateLimit: originalQuote.DepositDateLimit, + DepositConfirmations: originalQuote.DepositConfirmations, + TransferConfirmations: originalQuote.TransferConfirmations, + TransferTime: originalQuote.TransferTime, + ExpireDate: originalQuote.ExpireDate, + ExpireBlock: originalQuote.ExpireBlock, + ProductFeeAmount: big.NewInt(int64(originalQuote.ProductFeeAmount)), + GasFee: big.NewInt(int64(originalQuote.GasFee)), + } + + signature, err := hex.DecodeString(acceptedQuote.Signature) + if err != nil { + assert.FailNow(s.T(), "invalid signature") + } + + depositTx, err := s.lbc.DepositPegout(opts, pegoutQuote, signature) + if err != nil { + assert.FailNow(s.T(), "error depositing pegout: "+err.Error()) + } + log.Debug("[Integration test] Hash of deposit tx ", depositTx.Hash().String()) + + address, err := btcutil.DecodeAddress(quote.Quote.DepositAddr, &s.btcParams) + if err != nil { + assert.FailNow(s.T(), "invalid btc address") + } + + var latestBlockHash *chainhash.Hash + var block *wire.MsgBlock + info, err := s.btc.GetBlockChainInfo() + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + latestBlockNumber := info.Blocks + latestBlockHash, _ = chainhash.NewHashFromStr(info.BestBlockHash) + block, err = s.btc.GetBlock(latestBlockHash) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + + var txHash string + for txHash == "" { + txHash = lookForTxToAddress(block, address, &s.btcParams) + if txHash == "" { + hash, getBlockError := s.btc.GetBlockHash(int64(latestBlockNumber + 1)) + if getBlockError != nil && !strings.Contains(getBlockError.Error(), "Block height out of range") { + assert.FailNow(s.T(), getBlockError.Error()) + } else if getBlockError == nil { + latestBlockHash = hash + latestBlockNumber++ + block, err = s.btc.GetBlock(latestBlockHash) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + } + } + time.Sleep(10 * time.Second) + } + + txParsedHash, _ := chainhash.NewHashFromStr(txHash) + tx, err := s.btc.GetTransaction(txParsedHash) + if err != nil { + assert.FailNow(s.T(), err.Error()) + } + assert.NotNil(s.T(), tx) + }) + + s.Run("Should refund pegout to liquidity provider", func() { + eventChannel := make(chan *bindings.LiquidityBridgeContractPegOutRefunded) + var quoteHash [32]byte + hashBytes, _ := hex.DecodeString(quote.QuoteHash) + copy(quoteHash[:], hashBytes) + subscription, err := s.lbc.WatchPegOutRefunded( + nil, + eventChannel, + [][32]byte{quoteHash}, + ) + if err != nil { + assert.FailNow(s.T(), "Error listening for refundPegOut") + } + + select { + case refund := <-eventChannel: + subscription.Unsubscribe() + assert.NotNil(s.T(), refund, "refundPegOut failed") + case err = <-subscription.Err(): + assert.FailNow(s.T(), "Error listening for refundPegOut") + } + }) +} + +func lookForTxToAddress(block *wire.MsgBlock, target btcutil.Address, params *chaincfg.Params) string { + for _, tx := range block.Transactions { + for _, output := range tx.TxOut { + _, addresses, _, _ := txscript.ExtractPkScriptAddrs(output.PkScript, params) + if len(addresses) != 0 && addresses[0].EncodeAddress() == target.EncodeAddress() { + return tx.TxHash().String() + } + } + } + return "" +} diff --git a/integration/setup_test.txt b/integration/setup_test.txt new file mode 100644 index 00000000..4607c06d --- /dev/null +++ b/integration/setup_test.txt @@ -0,0 +1,187 @@ +package integration_test + +import ( + "context" + "fmt" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/rsksmart/liquidity-provider-server/account" + "github.com/rsksmart/liquidity-provider-server/config" + "github.com/rsksmart/liquidity-provider-server/connectors" + "github.com/rsksmart/liquidity-provider-server/http" + mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" + "github.com/rsksmart/liquidity-provider-server/pegin" + "github.com/rsksmart/liquidity-provider-server/pegout" + "github.com/rsksmart/liquidity-provider-server/secrets" + "github.com/rsksmart/liquidity-provider-server/storage" + "github.com/rsksmart/liquidity-provider/types" + log "github.com/sirupsen/logrus" + "math/big" + "math/rand" + "os" + "os/signal" + "strconv" + "strings" + "syscall" + "time" +) + +// TODO this file is very likely to change after LPS refactor + +var ( + cfg config.Config + srv http.Server + cfgData http.ConfigData +) + +func loadConfig() error { + err := config.LoadEnv(&cfg) + return err +} + +func initLogger(hooks ...log.Hook) { + log.SetLevel(log.DebugLevel) + log.SetOutput(os.Stdout) + for _, hook := range hooks { + log.AddHook(hook) + } +} + +func startServer(rsk *connectors.RSK, btc *connectors.BTC, dbMongo *mongoDB.DB, endChannel chan<- os.Signal, readyChannel chan<- error) { + lpRepository := storage.NewLPRepository(dbMongo, rsk, btc) + + awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) + if err != nil { + log.Fatal("error loading configuration: ", err.Error()) + } + + secretsStorage := secrets.NewSecretsManagerStorage[any](awsConfiguration) + secretNames := &account.AccountSecretNames{ + KeySecretName: cfg.ProviderCredentials.KeySecret, + PasswordSecretName: cfg.ProviderCredentials.PasswordSecret, + } + accountProvider := account.NewRemoteAccountProvider( + cfg.ProviderCredentials.Keydir, + cfg.ProviderCredentials.AccountNum, + secretNames, + secretsStorage, + ) + lp, err := pegin.NewLocalProvider(cfg.Provider, lpRepository, accountProvider, cfg.RSK.ChainId) + if err != nil { + log.Fatal("cannot create local provider: ", err) + } + lpPegOut, err := pegout.NewLocalProvider(&cfg.PegoutProvier, lpRepository, accountProvider, cfg.RSK.ChainId) + if err != nil { + log.Fatal("cannot create local provider: ", err) + } + + srv = http.New(rsk, btc, dbMongo, cfgData, lpRepository, cfg.Provider, cfg.PegoutProvier, accountProvider, awsConfiguration) + log.Debug("registering local provider (this might take a while)") + req := types.ProviderRegisterRequest{ + Name: cfg.ProviderName, + ApiBaseUrl: cfg.BaseURL, + Status: true, + ProviderType: cfg.ProviderType, + } + + err = srv.AddProvider(lp, lpPegOut, req) + if err != nil { + log.Fatalf("error registering local provider: %v", err) + } + port := cfg.Server.Port + + if port == 0 { + port = 8080 + } + go func() { + readyChannel <- nil + err := srv.Start(port) + if err != nil { + log.Error("server error: ", err.Error()) + endChannel <- syscall.SIGTERM + } + }() +} + +func initCfgData() { + cfgData.RSK = cfg.RSK + cfgData.QuoteCacheStartBlock = cfg.QuoteCacheStartBlock + cfgData.CaptchaSecretKey = cfg.CaptchaSecretKey + cfgData.CaptchaThreshold = cfg.CaptchaThreshold + cfgData.CaptchaSiteKey = cfg.CaptchaSiteKey +} + +func setup(readyChannel chan<- error, doneChannel chan os.Signal, logHooks ...log.Hook) { + initLogger(logHooks...) + err := loadConfig() + if err != nil { + readyChannel <- fmt.Errorf("error loading configuration: %v", err) + return + } + initCfgData() + rand.Seed(time.Now().UnixNano()) + + log.Info("starting liquidity provider server") + log.Debugf("loaded config %+v", cfg) + + awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) + if err != nil { + log.Fatal("error loading configuration: ", err.Error()) + } + + secretsStorage := secrets.NewSecretsManagerStorage[any](awsConfiguration) + + dbMongo, err := mongoDB.Connect() + if err != nil { + readyChannel <- fmt.Errorf("error connecting to DB: %v", err) + return + } + + erpKeys := strings.Split(os.Getenv("ERP_KEYS"), ",") + log.Debug("ERP Keys: ", erpKeys) + rsk, err := connectors.NewRSK(cfg.RSK.LBCAddr, cfg.RSK.BridgeAddr, cfg.RSK.RequiredBridgeConfirmations, cfg.IrisActivationHeight, erpKeys) + if err != nil { + readyChannel <- fmt.Errorf("RSK error: %v", err) + return + } + + chainId, err := strconv.ParseInt(os.Getenv("RSK_CHAIN_ID"), 10, 64) + if err != nil { + readyChannel <- fmt.Errorf("Error getting the chain ID: %v", err) + return + } + + err = rsk.Connect(os.Getenv("RSKJ_CONNECTION_STRING"), big.NewInt(chainId)) + if err != nil { + readyChannel <- fmt.Errorf("error connecting to RSK: %v", err) + return + } + + walletPassword, err := secretsStorage.GetTextSecret(cfg.BtcWalletPassword) + if err != nil { + log.Fatal("Error getting BTC wallet password: ", err) + } + + btc, err := connectors.NewBTC(os.Getenv("BTC_NETWORK"), walletPassword, cfg.IsBtcEncryptedWallet) + if err != nil { + readyChannel <- fmt.Errorf("error initializing BTC connector: %v", err) + return + } + + err = btc.Connect(cfg.BTC) + if err != nil { + readyChannel <- fmt.Errorf("error connecting to BTC: %v", err) + return + } + + signal.Notify(doneChannel, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + + startServer(rsk, btc, dbMongo, doneChannel, readyChannel) + <-doneChannel + srv.Shutdown() + rsk.Close() + btc.Close() + err = dbMongo.Close() + if err != nil { + log.Fatal("error closing DB connection: ", err) + } +} diff --git a/internal/adapters/dataproviders/bitcoin/wallet.go b/internal/adapters/dataproviders/bitcoin/wallet.go index e560197a..d09639c9 100644 --- a/internal/adapters/dataproviders/bitcoin/wallet.go +++ b/internal/adapters/dataproviders/bitcoin/wallet.go @@ -89,6 +89,9 @@ func (wallet *bitcoindWallet) SendWithOpReturn(address string, value *entities.W decodedAddress: btcutil.Amount(satoshis), } rawTx, err := wallet.conn.client.CreateRawTransaction(nil, output, nil) + if err != nil { + return "", err + } opReturnScript, err := txscript.NullDataScript(opReturnContent) if err != nil { @@ -146,14 +149,17 @@ func (wallet *bitcoindWallet) ImportAddress(address string) error { } func (wallet *bitcoindWallet) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { - var result []blockchain.BitcoinTransactionInformation var ok bool var tx blockchain.BitcoinTransactionInformation + result := make([]blockchain.BitcoinTransactionInformation, 0) parsedAddress, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) if err != nil { return nil, err } utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses(0, 9999, []btcutil.Address{parsedAddress}) + if err != nil { + return nil, err + } txs := make(map[string]blockchain.BitcoinTransactionInformation) for _, utxo := range utxos { diff --git a/internal/adapters/dataproviders/database/mongo/pegout.go b/internal/adapters/dataproviders/database/mongo/pegout.go index 99f6dc11..6048604d 100644 --- a/internal/adapters/dataproviders/database/mongo/pegout.go +++ b/internal/adapters/dataproviders/database/mongo/pegout.go @@ -175,11 +175,11 @@ func (repo *pegoutMongoRepository) DeleteQuotes(ctx context.Context, quotes []st } func (repo *pegoutMongoRepository) UpsertPegoutDeposit(ctx context.Context, deposit quote.PegoutDeposit) error { - ctx, cancel := context.WithTimeout(context.Background(), dbTimeout) + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() _, err := repo.conn.Collection(depositEventsCollection).ReplaceOne( - ctx, + dbCtx, bson.M{"tx_hash": deposit.TxHash}, deposit, options.Replace().SetUpsert(true), @@ -191,14 +191,14 @@ func (repo *pegoutMongoRepository) UpsertPegoutDeposit(ctx context.Context, depo } func (repo *pegoutMongoRepository) UpsertPegoutDeposits(ctx context.Context, deposits []quote.PegoutDeposit) error { - ctx, cancel := context.WithTimeout(context.Background(), dbTimeout) + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() if len(deposits) == 0 { return nil } - var documents []mongo.WriteModel + documents := make([]mongo.WriteModel, 0) for _, deposit := range deposits { filter := bson.M{"tx_hash": deposit.TxHash} replaceModel := mongo.NewReplaceOneModel() @@ -210,7 +210,7 @@ func (repo *pegoutMongoRepository) UpsertPegoutDeposits(ctx context.Context, dep } _, err := repo.conn.Collection(depositEventsCollection).BulkWrite( - ctx, + dbCtx, documents, ) if err == nil { diff --git a/internal/adapters/dataproviders/event.go b/internal/adapters/dataproviders/event.go index e7a662e1..192be85f 100644 --- a/internal/adapters/dataproviders/event.go +++ b/internal/adapters/dataproviders/event.go @@ -26,7 +26,7 @@ func (bus *localEventBus) Subscribe(id entities.EventId) <-chan entities.Event { topics = make([]chan<- entities.Event, 0) bus.topics[id] = topics } - subscription := make(chan entities.Event, 0) + subscription := make(chan entities.Event) bus.topics[id] = append(topics, subscription) return subscription } diff --git a/internal/adapters/dataproviders/liquidity_provider.go b/internal/adapters/dataproviders/liquidity_provider.go index 3751b80e..e52fed7d 100644 --- a/internal/adapters/dataproviders/liquidity_provider.go +++ b/internal/adapters/dataproviders/liquidity_provider.go @@ -80,8 +80,8 @@ func (lp *LocalLiquidityProvider) ValidateAmountForPegout(amount *entities.Wei) } func (lp *LocalLiquidityProvider) GetRootstockConfirmationsForValue(value *entities.Wei) uint16 { - var values []int - for key, _ := range lp.env.RskConfig.Confirmations { + values := make([]int, 0) + for key := range lp.env.RskConfig.Confirmations { values = append(values, key) } slices.Sort(values) @@ -169,8 +169,8 @@ func (lp *LocalLiquidityProvider) ValidateAmountForPegin(amount *entities.Wei) e } func (lp *LocalLiquidityProvider) GetBitcoinConfirmationsForValue(value *entities.Wei) uint16 { - var values []int - for key, _ := range lp.env.BtcConfig.Confirmations { + values := make([]int, 0) + for key := range lp.env.BtcConfig.Confirmations { values = append(values, key) } slices.Sort(values) diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go index 81a6a7f0..29d66c42 100644 --- a/internal/adapters/dataproviders/rootstock/bridge.go +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -72,7 +72,7 @@ func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.Flyover var fedRedeemScript, derivationValue, flyoverScript []byte var addressScriptHash *btcutil.AddressScriptHash - if derivationValue, err = bridge.getDerivationValueHash(args); err != nil { + if derivationValue = bridge.getDerivationValueHash(args); err != nil { return blockchain.FlyoverDerivation{}, fmt.Errorf("error computing derivation value: %w", err) } opts := &bind.CallOpts{} @@ -93,9 +93,7 @@ func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.Flyover } } - if flyoverScript, err = getFlyoverRedeemScript(derivationValue, fedRedeemScript); err != nil { - return blockchain.FlyoverDerivation{}, fmt.Errorf("error generating flyover redeem script: %w", err) - } + flyoverScript = getFlyoverRedeemScript(derivationValue, fedRedeemScript) if addressScriptHash, err = btcutil.NewAddressScriptHash(flyoverScript, bridge.btcParams); err != nil { return blockchain.FlyoverDerivation{}, err } @@ -166,7 +164,7 @@ func (bridge *rskBridgeImpl) FetchFederationInfo() (blockchain.FederationInfo, e }, nil } -func (bridge *rskBridgeImpl) getDerivationValueHash(args blockchain.FlyoverDerivationArgs) ([]byte, error) { +func (bridge *rskBridgeImpl) getDerivationValueHash(args blockchain.FlyoverDerivationArgs) []byte { var buf bytes.Buffer buf.Write(args.QuoteHash) buf.Write(args.UserBtcRefundAddress) @@ -175,5 +173,5 @@ func (bridge *rskBridgeImpl) getDerivationValueHash(args blockchain.FlyoverDeriv derivationValueHash := crypto.Keccak256(buf.Bytes()) - return derivationValueHash, nil + return derivationValueHash } diff --git a/internal/adapters/dataproviders/rootstock/federation.go b/internal/adapters/dataproviders/rootstock/federation.go index d2fa10af..a43b4c94 100644 --- a/internal/adapters/dataproviders/rootstock/federation.go +++ b/internal/adapters/dataproviders/rootstock/federation.go @@ -178,14 +178,14 @@ func addErpNToMScriptPart(fedInfo blockchain.FederationInfo, builder *txscript.S return nil } -func getFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) ([]byte, error) { +func getFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) []byte { var buf bytes.Buffer hashPrefix, _ := hex.DecodeString("20") buf.Write(hashPrefix) buf.Write(derivationValue) buf.WriteByte(txscript.OP_DROP) buf.Write(fedRedeemScript) - return buf.Bytes(), nil + return buf.Bytes() } func getOpCodeFromInt(val int) byte { diff --git a/internal/adapters/dataproviders/rootstock/lbc.go b/internal/adapters/dataproviders/rootstock/lbc.go index 3fd7aa05..d5a8795c 100644 --- a/internal/adapters/dataproviders/rootstock/lbc.go +++ b/internal/adapters/dataproviders/rootstock/lbc.go @@ -98,7 +98,7 @@ func (lbc *liquidityBridgeContractImpl) GetProviders() ([]entities.RegisteredLiq } maxProviderId = maxId.Int64() - providerIds := make([]*big.Int, maxProviderId) + providerIds := make([]*big.Int, 0) for i = 1; i <= maxProviderId; i++ { providerIds = append(providerIds, big.NewInt(i)) @@ -110,7 +110,7 @@ func (lbc *liquidityBridgeContractImpl) GetProviders() ([]entities.RegisteredLiq if err != nil { return nil, err } - parsedProviders := make([]entities.RegisteredLiquidityProvider, maxProviderId) + parsedProviders := make([]entities.RegisteredLiquidityProvider, 0) for i = 0; i < maxProviderId+1; i++ { provider = providers[i] providerType = entities.ProviderType(provider.ProviderType) diff --git a/internal/adapters/dataproviders/rootstock/rpc.go b/internal/adapters/dataproviders/rootstock/rpc.go index 06dd6df5..d8c1e17d 100644 --- a/internal/adapters/dataproviders/rootstock/rpc.go +++ b/internal/adapters/dataproviders/rootstock/rpc.go @@ -120,7 +120,7 @@ func (rpc *rskjRpcServer) GetTransactionReceipt(ctx context.Context, hash string cumulativeGasUsed.SetUint64(receipt.CumulativeGasUsed) from, err = types.Sender(types.NewEIP155Signer(tx.ChainId()), tx) if err != nil { - from, err = types.Sender(types.HomesteadSigner{}, tx) + from, _ = types.Sender(types.HomesteadSigner{}, tx) } return blockchain.TransactionReceipt{ TransactionHash: receipt.TxHash.String(), diff --git a/internal/adapters/entrypoints/rest/common.go b/internal/adapters/entrypoints/rest/common.go index 1bdaad69..9b603c8d 100644 --- a/internal/adapters/entrypoints/rest/common.go +++ b/internal/adapters/entrypoints/rest/common.go @@ -60,7 +60,6 @@ func DecodeRequestError(w http.ResponseWriter, err error) { log.Error("Error decoding request: ", err.Error()) jsonErr := NewErrorResponse(fmt.Sprintf("Error decoding request: %v", err), true) JsonErrorResponse(w, http.StatusBadRequest, jsonErr) - return } func DecodeRequest[T any](w http.ResponseWriter, req *http.Request, body *T) error { diff --git a/internal/adapters/entrypoints/rest/middlewares/captcha.go b/internal/adapters/entrypoints/rest/middlewares/captcha.go index f49efe9f..09539e7f 100644 --- a/internal/adapters/entrypoints/rest/middlewares/captcha.go +++ b/internal/adapters/entrypoints/rest/middlewares/captcha.go @@ -1,6 +1,7 @@ package middlewares import ( + "bytes" "encoding/json" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" log "github.com/sirupsen/logrus" @@ -18,6 +19,13 @@ type captchaValidationResponse struct { ErrorCodes []string `json:"error-codes"` } +func unexpectedCaptchaError(w http.ResponseWriter, err error) { + details := make(rest.ErrorDetails) + details["error"] = err.Error() + jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) +} + func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecretKey string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { if captchaThreshold < 0.5 { @@ -38,12 +46,20 @@ func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecret form := make(url.Values) form.Set("secret", captchaSecretKey) form.Set("response", token) - res, err := http.DefaultClient.PostForm("https://www.google.com/recaptcha/api/siteverify", form) + req, err := http.NewRequestWithContext( + r.Context(), + http.MethodPost, + "https://www.google.com/recaptcha/api/siteverify", + bytes.NewBufferString(form.Encode()), + ) if err != nil { - details := make(rest.ErrorDetails) - details["error"] = err.Error() - jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, false) - rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + unexpectedCaptchaError(w, err) + return + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + unexpectedCaptchaError(w, err) return } @@ -56,8 +72,7 @@ func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecret var validation captchaValidationResponse err = json.NewDecoder(res.Body).Decode(&validation) if err != nil { - jsonErr := rest.NewErrorResponse("error validating captcha", false) - rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + unexpectedCaptchaError(w, err) return } @@ -70,10 +85,7 @@ func NewCaptchaMiddleware(captchaThreshold float32, disabled bool, captchaSecret log.Debugf("Valid captcha solved on %s\n", validation.Hostname) next.ServeHTTP(w, r) } else { - details := make(rest.ErrorDetails) - details["errors"] = validation.ErrorCodes - jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, true) - rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + unexpectedCaptchaError(w, err) } }) } diff --git a/internal/adapters/entrypoints/rest/server/server.go b/internal/adapters/entrypoints/rest/server/server.go index 45a2696f..d18d1dd9 100644 --- a/internal/adapters/entrypoints/rest/server/server.go +++ b/internal/adapters/entrypoints/rest/server/server.go @@ -3,7 +3,6 @@ package server import ( "context" "errors" - "fmt" "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" @@ -14,6 +13,7 @@ import ( "net/http" "os" "os/signal" + "strconv" "syscall" ) @@ -46,7 +46,7 @@ func (s *Server) start() error { _ = w.Close() }(w) s.http = http.Server{ - Addr: ":" + fmt.Sprint(s.env.Port), + Addr: ":" + strconv.FormatUint(uint64(s.env.Port), 10), Handler: h, } log.Info("Server started at localhost:", s.http.Addr) diff --git a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go index 8385a09a..cbf85368 100644 --- a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go @@ -62,7 +62,7 @@ func (watcher *PeginDepositAddressWatcher) Prepare(ctx context.Context) error { for _, watchedQuote := range watchedQuotes { depositAddress = watchedQuote.RetainedQuote.DepositAddress if err = watcher.btcWallet.ImportAddress(depositAddress); err != nil { - return fmt.Errorf("error while importing deposit address (%s): %v\n", depositAddress, err) + return fmt.Errorf("error while importing deposit address (%s): %w\n", depositAddress, err) } watcher.quotes[watchedQuote.RetainedQuote.QuoteHash] = watchedQuote } diff --git a/internal/configuration/bootstrap/bitcoin.go b/internal/configuration/bootstrap/bitcoin.go index ba925d1c..b270c766 100644 --- a/internal/configuration/bootstrap/bitcoin.go +++ b/internal/configuration/bootstrap/bitcoin.go @@ -40,7 +40,7 @@ func Bitcoin(env environment.BtcEnv) (*bitcoin.Connection, error) { client, err := rpcclient.New(&config, nil) if err != nil { - return nil, fmt.Errorf("RPC client error: %v", err) + return nil, fmt.Errorf("RPC client error: %w", err) } version, err := checkBtcdVersion(client) @@ -64,10 +64,10 @@ func checkBtcdVersion(c *rpcclient.Client) (int32, error) { return info.Version, nil case *btcjson.RPCError: if networkErr.Code != btcjson.ErrRPCMethodNotFound.Code { - return 0, fmt.Errorf("unable to detect btcd version: %v", networkErr) + return 0, fmt.Errorf("unable to detect btcd version: %w", networkErr) } return unknownBtcdVersion, nil default: - return 0, fmt.Errorf("unable to detect btcd version: %v", networkErr) + return 0, fmt.Errorf("unable to detect btcd version: %w", networkErr) } } diff --git a/internal/configuration/registry/alert_sender.go b/internal/configuration/registry/alert_sender.go index 95bcf1d3..7591193e 100644 --- a/internal/configuration/registry/alert_sender.go +++ b/internal/configuration/registry/alert_sender.go @@ -10,8 +10,8 @@ import ( log "github.com/sirupsen/logrus" ) -func NewAlertSender(env environment.Environment) entities.AlertSender { - awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) +func NewAlertSender(ctx context.Context, env environment.Environment) entities.AlertSender { + awsConfiguration, err := awsConfig.LoadDefaultConfig(ctx) if err != nil { log.Fatal("error loading alert sender: ", err) } diff --git a/internal/entities/blockchain/rootstock.go b/internal/entities/blockchain/rootstock.go index afacfb66..371f861e 100644 --- a/internal/entities/blockchain/rootstock.go +++ b/internal/entities/blockchain/rootstock.go @@ -31,7 +31,6 @@ type TransactionConfig struct { type TransactionReceipt struct { TransactionHash string - transactionIndex uint32 BlockHash string BlockNumber uint64 From string diff --git a/internal/entities/wei.go b/internal/entities/wei.go index 1931017d..82e63a90 100644 --- a/internal/entities/wei.go +++ b/internal/entities/wei.go @@ -80,9 +80,9 @@ func (w *Wei) Value() (driver.Value, error) { } func (w *Wei) Scan(src interface{}) error { - switch src.(type) { + switch src := src.(type) { case string: - _, ok := w.AsBigInt().SetString(src.(string), 10) + _, ok := w.AsBigInt().SetString(src, 10) if !ok { return errors.New("cannot scan invalid value") } diff --git a/internal/usecases/common.go b/internal/usecases/common.go index 74d1d649..8f0814c0 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -73,8 +73,11 @@ func ErrorArg(key, value string) ErrorArgs { } func (args ErrorArgs) String() string { - jsonString, _ := json.Marshal(args) - return string(jsonString) + if jsonString, err := json.Marshal(args); err != nil { + return "" + } else { + return string(jsonString) + } } func WrapUseCaseError(useCase UseCaseId, err error) error { @@ -95,8 +98,8 @@ type DaoAmounts struct { } func CalculateDaoAmounts(ctx context.Context, rsk blockchain.RootstockRpcServer, value *entities.Wei, daoFeePercentage uint64, feeCollectorAddress string) (DaoAmounts, error) { + var daoGasAmount *entities.Wei daoFeeAmount := new(entities.Wei) - daoGasAmount := new(entities.Wei) var err error if daoFeePercentage == 0 { return DaoAmounts{}, nil diff --git a/internal/usecases/liquidity_provider/registration.go b/internal/usecases/liquidity_provider/registration.go index 2f4344f5..36646137 100644 --- a/internal/usecases/liquidity_provider/registration.go +++ b/internal/usecases/liquidity_provider/registration.go @@ -76,9 +76,7 @@ func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationPa func (useCase *RegistrationUseCase) getCollateralInfo() (collateralInfo, error) { var err error - minimumCollateral := new(entities.Wei) - peginCollateral := new(entities.Wei) - pegoutCollateral := new(entities.Wei) + var peginCollateral, pegoutCollateral, minimumCollateral *entities.Wei if minimumCollateral, err = useCase.lbc.GetMinimumCollateral(); err != nil { return collateralInfo{}, err diff --git a/internal/usecases/pegin/accept_pegin_quote.go b/internal/usecases/pegin/accept_pegin_quote.go index 117d38d2..7c2eb99d 100644 --- a/internal/usecases/pegin/accept_pegin_quote.go +++ b/internal/usecases/pegin/accept_pegin_quote.go @@ -51,8 +51,7 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q var retainedQuote *quote.RetainedPeginQuote var derivation blockchain.FlyoverDerivation var quoteSignature string - - requiredLiquidity := new(entities.Wei) + var requiredLiquidity *entities.Wei if quoteHashBytes, err = hex.DecodeString(quoteHash); err != nil { return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) @@ -150,7 +149,7 @@ func (useCase *AcceptQuoteUseCase) calculateDerivationAddress(quoteHashBytes []b func (useCase *AcceptQuoteUseCase) calculateAndCheckLiquidity(ctx context.Context, peginQuote quote.PeginQuote) (*entities.Wei, error) { var err error - gasPrice := new(entities.Wei) + var gasPrice *entities.Wei errorArgs := usecases.NewErrorArgs() gasLimit := new(entities.Wei).Add( diff --git a/internal/usecases/pegin/get_collateral.go b/internal/usecases/pegin/get_collateral.go index 479982c1..7f6d58d8 100644 --- a/internal/usecases/pegin/get_collateral.go +++ b/internal/usecases/pegin/get_collateral.go @@ -16,9 +16,7 @@ func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, peginProvid } func (useCase *GetCollateralUseCase) Run() (*entities.Wei, error) { - var err error - collateral := new(entities.Wei) - collateral, err = useCase.lbc.GetCollateral(useCase.peginProvider.RskAddress()) + collateral, err := useCase.lbc.GetCollateral(useCase.peginProvider.RskAddress()) if err != nil { return nil, usecases.WrapUseCaseError(usecases.GetCollateralId, err) } diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index 8f75450d..a0ef6a1e 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -77,11 +77,11 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( var daoTxAmounts usecases.DaoAmounts var fedAddress, hash string var daoFeePercentage uint64 - estimatedCallGas := new(entities.Wei) - gasPrice := new(entities.Wei) - minLockTxValueInSatoshi := new(entities.Wei) - errorArgs := usecases.NewErrorArgs() + var errorArgs usecases.ErrorArgs var err error + var gasPrice, estimatedCallGas *entities.Wei + + minLockTxValueInSatoshi := new(entities.Wei) if errorArgs, err = useCase.validateRequest(request); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, err, errorArgs) diff --git a/internal/usecases/pegin/withdraw_collateral.go b/internal/usecases/pegin/withdraw_collateral.go index d89a5818..077eaec1 100644 --- a/internal/usecases/pegin/withdraw_collateral.go +++ b/internal/usecases/pegin/withdraw_collateral.go @@ -15,8 +15,7 @@ func NewWithdrawCollateralUseCase(lbc blockchain.LiquidityBridgeContract) *Withd } func (useCase *WithdrawCollateralUseCase) Run() error { - var err error - err = useCase.lbc.WithdrawCollateral() + err := useCase.lbc.WithdrawCollateral() if err != nil && (strings.Contains(err.Error(), "LBC021") || strings.Contains(err.Error(), "LBC022")) { return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, usecases.ProviderNotResignedError) } else if err != nil { diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go index 37093127..69666283 100644 --- a/internal/usecases/pegout/accept_pegout_quote.go +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -42,8 +42,7 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q var pegoutQuote *quote.PegoutQuote var retainedQuote *quote.RetainedPegoutQuote var quoteSignature string - - requiredLiquidity := new(entities.Wei) + var requiredLiquidity *entities.Wei if pegoutQuote, err = useCase.quoteRepository.GetQuote(ctx, quoteHash); err != nil { return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) diff --git a/internal/usecases/pegout/get_collateral.go b/internal/usecases/pegout/get_collateral.go index 76866989..804b13d8 100644 --- a/internal/usecases/pegout/get_collateral.go +++ b/internal/usecases/pegout/get_collateral.go @@ -16,9 +16,7 @@ func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, pegoutProvi } func (useCase *GetCollateralUseCase) Run() (*entities.Wei, error) { - var err error - collateral := new(entities.Wei) - collateral, err = useCase.lbc.GetPegoutCollateral(useCase.pegoutProvider.RskAddress()) + collateral, err := useCase.lbc.GetPegoutCollateral(useCase.pegoutProvider.RskAddress()) if err != nil { return nil, usecases.WrapUseCaseError(usecases.GetPegoutCollateralId, err) } diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index 5e8be5ba..46bc0ceb 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -77,13 +77,12 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( var daoFeePercentage, blockNumber uint64 var daoTxAmounts usecases.DaoAmounts var hash string + var errorArgs usecases.ErrorArgs + var gasPrice, feeInWei *entities.Wei + var err error - feeInWei := new(entities.Wei) - gasPrice := new(entities.Wei) gasFeeDao := new(entities.Wei) minLockTxValueInSatoshi := new(entities.Wei) - errorArgs := usecases.NewErrorArgs() - var err error if errorArgs, err = useCase.validateRequest(request); err != nil { return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, err, errorArgs) diff --git a/internal/usecases/pegout/withdraw_collateral.go b/internal/usecases/pegout/withdraw_collateral.go index 8b08123e..610a0c73 100644 --- a/internal/usecases/pegout/withdraw_collateral.go +++ b/internal/usecases/pegout/withdraw_collateral.go @@ -15,8 +15,7 @@ func NewWithdrawCollateralUseCase(lbc blockchain.LiquidityBridgeContract) *Withd } func (useCase *WithdrawCollateralUseCase) Run() error { - var err error - err = useCase.lbc.WithdrawPegoutCollateral() + err := useCase.lbc.WithdrawPegoutCollateral() if err != nil && (strings.Contains(err.Error(), "LBC021") || strings.Contains(err.Error(), "LBC022")) { return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, usecases.ProviderNotResignedError) } else if err != nil { diff --git a/internal/usecases/watcher/get_watched_pegin_quote.go b/internal/usecases/watcher/get_watched_pegin_quote.go index 3fe3cae7..3550133c 100644 --- a/internal/usecases/watcher/get_watched_pegin_quote.go +++ b/internal/usecases/watcher/get_watched_pegin_quote.go @@ -35,7 +35,7 @@ func (useCase *GetWatchedPeginQuoteUseCase) Run(ctx context.Context, state quote func (useCase *GetWatchedPeginQuoteUseCase) getWatchedQuotes(ctx context.Context, state quote.PeginState) ([]WatchedPeginQuote, error) { var retainedQuotes []quote.RetainedPeginQuote - var watchedQuote []WatchedPeginQuote + watchedQuote := make([]WatchedPeginQuote, 0) var peginQuote *quote.PeginQuote var err error if retainedQuotes, err = useCase.peginRepository.GetRetainedQuoteByState(ctx, state); err != nil { diff --git a/internal/usecases/watcher/get_watched_pegout_quote.go b/internal/usecases/watcher/get_watched_pegout_quote.go index 0417816e..0b82be24 100644 --- a/internal/usecases/watcher/get_watched_pegout_quote.go +++ b/internal/usecases/watcher/get_watched_pegout_quote.go @@ -43,7 +43,7 @@ func (useCase *GetWatchedPegoutQuoteUseCase) Run(ctx context.Context, states ... func (useCase *GetWatchedPegoutQuoteUseCase) getWatchedQuotes(ctx context.Context, state quote.PegoutState) ([]WatchedPegoutQuote, error) { var retainedQuotes []quote.RetainedPegoutQuote - var watchedQuote []WatchedPegoutQuote + watchedQuote := make([]WatchedPegoutQuote, 0) var pegoutQuote *quote.PegoutQuote var err error if retainedQuotes, err = useCase.pegoutRepository.GetRetainedQuoteByState(ctx, state); err != nil { From bbab2d7ea4509b667d1faebde8b8554f4124487c Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 29 Jan 2024 11:49:58 -0300 Subject: [PATCH 005/113] ci: update configuration files and dependencies --- .gitignore | 2 + .golangci.yml | 14 + Dockerfile | 32 - Makefile | 19 + docker-compose/.env.regtest | 80 --- docker-compose/bitcoind/Dockerfile | 2 +- docker-compose/docker-compose.yml | 109 ++-- docker-compose/local/.env.regtest | 89 --- docker-compose/local/.env.testnet | 48 -- docker-compose/local/docker-compose.lps.yml | 100 ++-- docker-compose/local/docker-compose.yml | 10 +- docker-compose/local/lps-env.sh | 23 +- docker-compose/lps/Dockerfile | 21 +- docker-compose/lps/start.sh | 6 +- .../mainnet/docker-compose-block.yml | 2 +- docker-compose/mainnet/docker-compose.yml | 65 +- go.mod | 35 +- go.sum | 566 ++---------------- internal/configuration/bootstrap/rootstock.go | 2 +- sample-config.env | 103 ++-- 20 files changed, 296 insertions(+), 1032 deletions(-) create mode 100644 .golangci.yml delete mode 100644 Dockerfile create mode 100644 Makefile delete mode 100644 docker-compose/.env.regtest delete mode 100644 docker-compose/local/.env.regtest delete mode 100644 docker-compose/local/.env.testnet diff --git a/.gitignore b/.gitignore index 2666b887..61a53563 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ integration/geth_keystore /docker-compose/lbc-deployer/liquidity-bridge-contract/ keystore/ +build/ +/**/.env.regtest diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..aa9001e7 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,14 @@ +run: + tests: true + skip-dirs: + - internal/adapters/dataproviders/rootstock/bindings + - integration/ # temporary +linters: + presets: + - bugs + - complexity + - unused + - performance +linters-settings: + exhaustive: + default-signifies-exhaustive: true \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 5eeb9470..00000000 --- a/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -# To run issue this commands: -# docker build --tag liquidity-provider-server . -# docker run docker run liquidity-provider-server - -FROM golang:1.19-alpine -RUN apk add git -RUN apk add gcc -RUN apk add musl-dev -WORKDIR /app - -COPY pwd.txt ./ -COPY geth_keystore/ ./geth_keystore -COPY go.mod ./ -COPY go.sum ./ -RUN go mod download - -COPY *.go ./ -RUN git clone https://github.com/rsksmart/liquidity-provider-server.git -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/connectors -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/http -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/storage -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/pegout -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/mongoDB -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/storage -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/account -RUN cd liquidity-provider-server && go get github.com/rsksmart/liquidity-provider-server/config - -RUN cd liquidity-provider-server && go build -o /liquidity-provider-server - -EXPOSE 8080 - -CMD [ "/liquidity-provider-server" ] diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..d3c82c71 --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +tools: download + go install github.com/parvez3019/go-swagger3@latest + go install golang.org/x/vuln/cmd/govulncheck@latest + go env GOPATH + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.55.2 + +download: + go mod download + +lint: + golangci-lint run ./... + +validation: lint + go mod verify + govulncheck ./... # should fail on non informational vulnerabilities + +build: download + mkdir -p build && cd build + CGO_ENABLED=0 go build -v -race -installsuffix 'static' -ldflags="-s" -o ./build/liquidity-provider-server ./cmd/application/main.go \ No newline at end of file diff --git a/docker-compose/.env.regtest b/docker-compose/.env.regtest deleted file mode 100644 index 3aa433b1..00000000 --- a/docker-compose/.env.regtest +++ /dev/null @@ -1,80 +0,0 @@ -LOG_FILE=./logs/lps.log -DEBUG=TRUE -IRIS_ACTIVATION_HEIGHT=10 - -SERVER_PORT=8080 -DB_PATH=./db/server.db -RSK_ENDPOINT=ws://rskj:4445/websocket -RSK_BRIDGE_ADDR=0x0000000000000000000000000000000001000006 -RSK_REQUIRED_BRIDGE_CONFIRMATONS=10 - -PEGIN_PROVIDER_BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 -PEGIN_PROVIDER_MAX_CONF=60 -PEGIN_PROVIDER_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGIN_PROVIDER_TIME_FOR_DEPOSIT=3600 -PEGIN_PROVIDER_CALL_TIME=7200 -PEGIN_PROVIDER_PENALTY_FEE=1000000 - -PEGOUT_PROVIDER_BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 -PEGOUT_PROVIDER_MAX_CONF=60 -PEGOUT_PROVIDER_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGOUT_PROVIDER_TIME_FOR_DEPOSIT=3600 -PEGOUT_PROVIDER_CALL_TIME=7200 -PEGOUT_PROVIDER_PENALTY_FEE=1000000 -PEGOUT_PROVIDER_DEPOSIT_DATE_LIMIT=3600 -PEGOUT_PROVIDER_EXPIRE_DATE=3600 -PEGOUT_PROVIDER_EXPIRE_BLOCKS=5000 -PEGOUT_PROVIDER_TRANSFER_CONFIRMATIONS=1 - -KEY_DIR=geth_keystore -ACCOUNT_NUM=0 -PWD_FILE=pwd.txt -CHAIN_ID=33 -KEY_SECRET=FlyoverTestEnv/LPS-LOCAL-KEY -PASSWORD_SECRET=FlyoverTestEnv/LPS-LOCAL-PASSWORD -BTC_WALLET_PASSWORD=FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD -BTC_ENCRYPTED_WALLET=true - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_REGION= - -ENCRYPT_APP_KEY=FlyoverTestEnv/ENCRYPT-KEY -PROVIDER_NAME="Default Provider" -PEGIN_PROVIDER_FEE=1000000 -PEGIN_PROVIDER_MIN_TRANSACTION_VALUE=5000000000000000 -PEGIN_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 - -PEGOUT_PROVIDER_FEE=1000000 -PEGOUT_PROVIDER_MIN_TRANSACTION_VALUE=5000000000000000 -PEGOUT_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 - -BASE_URL="http://localhost:8080" - -# From previous .env - -BTCD_RPC_USER=test -BTCD_RPC_PASS=test - -BTC_ENDPOINT=bitcoind:5555 -BTC_USERNAME=test -BTC_PASSWORD=test -BTC_NETWORK=regtest -BTC_TX_FEE_RATE=0.00025 -ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3, 0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14, 034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f - -RSK_CHAIN_ID=33 - - -#LIQUIDITY PROVIDER ADDRESSES -LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c -PEGIN_LIQUIDITY_PROVIDER_RSK_ADDR= -PEGOUT_LIQUIDITY_PROVIDER_RSK_ADDR= - -QUOTE_CACHE_START_BLOCK=0 -CAPTCHA_SECRET_KEY= -CAPTCHA_SITE_KEY= -CAPTCHA_THRESHOLD=0.8 -DISABLE_CAPTCHA=false -PROVIDER_TYPE=both - diff --git a/docker-compose/bitcoind/Dockerfile b/docker-compose/bitcoind/Dockerfile index 9ad8186e..fc17aec6 100644 --- a/docker-compose/bitcoind/Dockerfile +++ b/docker-compose/bitcoind/Dockerfile @@ -26,5 +26,5 @@ WORKDIR "$HOME" USER bitcoin HEALTHCHECK --start-period=15s --retries=5 --interval=20s \ - CMD curl -s "http://127.0.0.1:5555" -X POST --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" \ + CMD curl -s "http://127.0.0.1:5555" -X POST --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" \ -d '{"jsonrpc": "1.0", "method": "getnetworkinfo", "params": [], "id":"1"}' | grep "\"result\":{" || exit 1 diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 4d15073f..4f688466 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -16,8 +16,8 @@ services: command: [ "bitcoind", - "-rpcuser=${BTCD_RPC_USER}", - "-rpcpassword=${BTCD_RPC_PASS}", + "-rpcuser=${BTC_USERNAME}", + "-rpcpassword=${BTC_PASSWORD}", "-addresstype=legacy", "-${LPS_STAGE}", "-printtoconsole", @@ -36,7 +36,7 @@ services: environment: - MONGO_INITDB_ROOT_USERNAME=$MONGODB_USER - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_PASSWORD - - MONGO_INITDB_DATABASE=$MONGODB_DATABASE + - MONGO_INITDB_DATABASE=flyover ports: - 27017:27017 volumes: @@ -55,79 +55,62 @@ services: image: lps:latest container_name: lps01 environment: - - BASE_URL - - PEGIN_PROVIDER_FEE - - PEGIN_PROVIDER_MIN_TRANSACTION_VALUE - - PEGIN_PROVIDER_MAX_TRANSACTION_VALUE - - PEGOUT_PROVIDER_FEE - - PEGOUT_PROVIDER_MIN_TRANSACTION_VALUE - - PEGOUT_PROVIDER_MAX_TRANSACTION_VALUE - - PROVIDER_NAME - - PROVIDER_TYPE - - LOG_FILE - - DEBUG - - IRIS_ACTIVATION_HEIGHT + - LPS_STAGE - SERVER_PORT - - DB_PATH + - LOG_LEVEL + - LOG_FILE + - ENABLE_MANAGEMENT_API + - MONGODB_USER + - MONGODB_PASSWORD + - MONGODB_HOST + - MONGODB_PORT - RSK_ENDPOINT + - CHAIN_ID + - LBC_ADDR - RSK_BRIDGE_ADDR - - RSK_REQUIRED_BRIDE_CONFIRMATIONS - - KEY_DIR + - RSK_REQUIRED_BRIDGE_CONFIRMATIONS + - IRIS_ACTIVATION_HEIGHT + - ERP_KEYS - ACCOUNT_NUM - - PWD_FILE - - CHAIN_ID + - DAO_FEE_COLLECTOR_ADDRESS - KEY_SECRET - PASSWORD_SECRET - - PEGIN_PROVIDER_BTC_ADDR - - PEGIN_PROVIDER_MAX_CONF - - PEGIN_PROVIDER_CONFIRMATIONS - - PEGIN_PROVIDER_TIME_FOR_DEPOSIT - - PEGIN_PROVIDER_CALL_TIME - - PEGIN_PROVIDER_PENALTY_FEE - - PEGOUT_PROVIDER_BTC_ADDR - - PEGOUT_PROVIDER_MAX_CONF - - PEGOUT_PROVIDER_CONFIRMATIONS - - PEGOUT_PROVIDER_TIME_FOR_DEPOSIT - - PEGOUT_PROVIDER_CALL_TIME - - PEGOUT_PROVIDER_PENALTY_FEE - - PEGOUT_PROVIDER_DEPOSIT_DATE_LIMIT - - PEGOUT_PROVIDER_EXPIRE_DATE - - PEGOUT_PROVIDER_EXPIRE_BLOCKS - - PEGOUT_PROVIDER_TRANSFER_CONFIRMATIONS - - PEGOUT_PROVIDER_DEPOSIT_CONFIRMATIONS - - PEGOUT_PROVIDER_TRANSFER_TIME - - LIQUIDITY_PROVIDER_RSK_ADDR - - PEGIN_LIQUIDITY_PROVIDER_RSK_ADDR - - PEGOUT_LIQUIDITY_PROVIDER_RSK_ADDR - - BTCD_RPC_USER - - BTCD_RPC_PASS - - RSK_CHAIN_ID - - LBC_ADDR - - LPS_STAGE - - ERP_KEYS - - MONGODB_USER - - MONGODB_PASSWORD - - MONGODB_DATABASE - - MONGODB_LOCAL_PORT - - MONGODB_LOCAL_HOST - - RSKJ_CONNECTION_STRING + - RSK_CONFIRMATIONS - BTC_NETWORK - - BTC_TX_FEE_RATE - - BTC_ENDPOINT - BTC_USERNAME - BTC_PASSWORD - - ENCRYPT_APP_KEY - - AWS_REGION - - AWS_ACCESS_KEY_ID - - AWS_SECRET_ACCESS_KEY - - QUOTE_CACHE_START_BLOCK + - BTC_ENDPOINT + - BTC_TX_FEE_RATE + - BTC_ENCRYPTED_WALLET + - BTC_WALLET_PASSWORD + - BTC_CONFIRMATIONS + - ALERT_SENDER_EMAIL + - ALERT_RECIPIENT_EMAIL + - BTC_ADDR + - PROVIDER_NAME + - BASE_URL + - PROVIDER_TYPE + - PEGIN_TIME_FOR_DEPOSIT + - PEGIN_CALL_TIME + - PEGIN_PENALTY_FEE + - PEGIN_FEE + - PEGIN_MIN_TRANSACTION_VALUE + - PEGIN_MAX_TRANSACTION_VALUE + - PEGOUT_TIME_FOR_DEPOSIT + - PEGOUT_CALL_TIME + - PEGOUT_PENALTY_FEE + - PEGOUT_FEE + - PEGOUT_MIN_TRANSACTION_VALUE + - PEGOUT_MAX_TRANSACTION_VALUE + - PEGOUT_EXPIRE_BLOCKS + - PEGOUT_DEPOSIT_CACHE_START_BLOCK - CAPTCHA_SECRET_KEY - CAPTCHA_SITE_KEY - CAPTCHA_THRESHOLD - DISABLE_CAPTCHA - - BTC_WALLET_PASSWORD - - BTC_ENCRYPTED_WALLET - - DAO_FEE_COLLECTOR_ADDRESS + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_REGION ports: - "8080:8080" volumes: diff --git a/docker-compose/local/.env.regtest b/docker-compose/local/.env.regtest deleted file mode 100644 index 25e69ab9..00000000 --- a/docker-compose/local/.env.regtest +++ /dev/null @@ -1,89 +0,0 @@ -LOG_FILE=./logs/lps.log -DEBUG=TRUE -IRIS_ACTIVATION_HEIGHT=10 - -SERVER_PORT=8080 -DB_PATH=./db/server.db -RSK_ENDPOINT=ws://rskj:4445/websocket -RSK_BRIDGE_ADDR=0x0000000000000000000000000000000001000006 -RSK_REQUIRED_BRIDGE_CONFIRMATONS=10 - -PROVIDER_NAME="Default Provider" -PEGIN_PROVIDER_FEE=1000000 -PEGIN_PROVIDER_MIN_TRANSACTION_VALUE=5000000000000000 -PEGIN_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 - -PEGOUT_PROVIDER_FEE=1000000 -PEGOUT_PROVIDER_MIN_TRANSACTION_VALUE=5000000000000000 -PEGOUT_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 - -BASE_URL="http://localhost:8080" - -PEGIN_PROVIDER_BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 -PEGIN_PROVIDER_MAX_CONF=60 -PEGIN_PROVIDER_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGIN_PROVIDER_TIME_FOR_DEPOSIT=3600 -PEGIN_PROVIDER_CALL_TIME=7200 -PEGIN_PROVIDER_PENALTY_FEE=1000000 - -PEGOUT_PROVIDER_BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 -PEGOUT_PROVIDER_MAX_CONF=60 -PEGOUT_PROVIDER_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGOUT_PROVIDER_TIME_FOR_DEPOSIT=3600 -PEGOUT_PROVIDER_CALL_TIME=7200 -PEGOUT_PROVIDER_PENALTY_FEE=1000000 -PEGOUT_PROVIDER_DEPOSIT_DATE_LIMIT=3600 -PEGOUT_PROVIDER_EXPIRE_DATE=3600 -PEGOUT_PROVIDER_EXPIRE_BLOCKS=5000 -PEGOUT_PROVIDER_TRANSFER_CONFIRMATIONS=1 - -KEY_DIR=geth_keystore -ACCOUNT_NUM=0 -PWD_FILE=pwd.txt -CHAIN_ID=33 - -KEY_SECRET=FlyoverTestEnv/LPS-LOCAL-KEY -PASSWORD_SECRET=FlyoverTestEnv/LPS-LOCAL-PASSWORD -BTC_WALLET_PASSWORD=FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD -BTC_ENCRYPTED_WALLET=true - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_REGION= - -ENCRYPT_APP_KEY=FlyoverTestEnv/ENCRYPT-KEY -# From previous .env -LIQUIDITY_PROVIDER_RSK_ADDR=0x9d93929a9099be4355fc2389fbf253982f9df47c -PEGIN_LIQUIDITY_PROVIDER_RSK_ADDR=0x9d93929a9099be4355fc2389fbf253982f9df47c -PEGOUT_LIQUIDITY_PROVIDER_RSK_ADDR=0x9d93929a9099be4355fc2389fbf253982f9df47c - -BTCD_RPC_USER=test -BTCD_RPC_PASS=test - -LBC_ADDR= - -RSK_CHAIN_ID=33 - -BTC_NETWORK=regtest -BTC_TX_FEE_RATE=0.00025 -BTC_ENDPOINT=bitcoind:5555 -BTC_USERNAME=test -BTC_PASSWORD=test - -MONGODB_USER=root -MONGODB_PASSWORD=root -MONGODB_DATABASE=flyover -MONGODB_LOCAL_PORT=27017 -MONGODB_LOCAL_HOST=172.17.0.1 -ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3,0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14,034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f - -RSKJ_CONNECTION_STRING=ws://rskj:4445/websocket - -QUOTE_CACHE_START_BLOCK=0 -CAPTCHA_SECRET_KEY= -CAPTCHA_SITE_KEY= -CAPTCHA_THRESHOLD=0.8 -DISABLE_CAPTCHA=true -PROVIDER_TYPE=both - -DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 \ No newline at end of file diff --git a/docker-compose/local/.env.testnet b/docker-compose/local/.env.testnet deleted file mode 100644 index 225fa251..00000000 --- a/docker-compose/local/.env.testnet +++ /dev/null @@ -1,48 +0,0 @@ -LIQUIDITY_PROVIDER_RSK_ADDR=0xd053b9B695BEb7104deEa56773197F05AD03E4e0 -PEGIN_LIQUIDITY_PROVIDER_RSK_ADDR= -PEGOUT_LIQUIDITY_PROVIDER_RSK_ADDR= - -BTCD_RPC_USER=test -BTCD_RPC_PASS=test - -LBC_ADDR=0x759d9B28b6CA416892550996AD531020bBfa3f03 -LPS_STAGE=testnet -LPS_UID=1000 -LPS_HOME=./volumes/lps - -RSK_CHAIN_ID=31 - -BTC_NETWORK=regtest -BTC_TX_FEE_RATE=0.00025 -BTC_ENDPOINT=bitcoind:5555 -BTC_USERNAME=test -BTC_PASSWORD=test - -PEGIN_PROVIDER_NAME="Default Provider" -PEGIN_PROVIDER_FEE=1000000 -PEGIN_PROVIDER_MIN_TRANSACTION_VALUE=5000000000000000 -PEGIN_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 - -PEGOUT_PROVIDER_FEE=1000000 -PEGOUT_PROVIDER_MIN_TRANSACTION_VALUE=5000000000000000 -PEGOUT_PROVIDER_MAX_TRANSACTION_VALUE=1000000000000000000 - -BASE_URL="http://localhost:8080" - -MONGODB_USER=root -MONGODB_PASSWORD=root -MONGODB_DATABASE=flyover -MONGODB_LOCAL_PORT=27017 -MONGODB_LOCAL_HOST=172.17.0.1 -ERP_KEYS=0257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d4,03c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f9,03cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b3,02370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80 - -RSKJ_CONNECTION_STRING=ws://rskj:4445/websocket - -QUOTE_CACHE_START_BLOCK=0 -CAPTCHA_SECRET_KEY= -CAPTCHA_SITE_KEY= -CAPTCHA_THRESHOLD=0.8 -DISABLE_CAPTCHA=false -PROVIDER_TYPE=both - -DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 diff --git a/docker-compose/local/docker-compose.lps.yml b/docker-compose/local/docker-compose.lps.yml index 2196ba90..7551cb71 100644 --- a/docker-compose/local/docker-compose.lps.yml +++ b/docker-compose/local/docker-compose.lps.yml @@ -9,76 +9,62 @@ services: image: lps:latest container_name: lps01 environment: - - BASE_URL - - PROVIDER_NAME - - PEGIN_PROVIDER_FEE - - PEGIN_PROVIDER_MIN_TRANSACTION_VALUE - - PEGIN_PROVIDER_MAX_TRANSACTION_VALUE - - PEGOUT_PROVIDER_FEE - - PEGOUT_PROVIDER_MIN_TRANSACTION_VALUE - - PEGOUT_PROVIDER_MAX_TRANSACTION_VALUE - - PROVIDER_TYPE - - LOG_FILE - - DEBUG - - IRIS_ACTIVATION_HEIGHT + - LPS_STAGE - SERVER_PORT - - DB_PATH + - LOG_LEVEL + - LOG_FILE + - ENABLE_MANAGEMENT_API + - MONGODB_USER + - MONGODB_PASSWORD + - MONGODB_HOST + - MONGODB_PORT - RSK_ENDPOINT + - CHAIN_ID + - LBC_ADDR - RSK_BRIDGE_ADDR - - RSK_REQUIRED_BRIDE_CONFIRMATIONS - - KEY_DIR + - RSK_REQUIRED_BRIDGE_CONFIRMATIONS + - IRIS_ACTIVATION_HEIGHT + - ERP_KEYS - ACCOUNT_NUM - - PWD_FILE - - CHAIN_ID + - DAO_FEE_COLLECTOR_ADDRESS - KEY_SECRET - PASSWORD_SECRET - - PEGIN_PROVIDER_BTC_ADDR - - PEGIN_PROVIDER_MAX_CONF - - PEGIN_PROVIDER_CONFIRMATIONS - - PEGIN_PROVIDER_TIME_FOR_DEPOSIT - - PEGIN_PROVIDER_CALL_TIME - - PEGIN_PROVIDER_PENALTY_FEE - - PEGOUT_PROVIDER_BTC_ADDR - - PEGOUT_PROVIDER_MAX_CONF - - PEGOUT_PROVIDER_CONFIRMATIONS - - PEGOUT_PROVIDER_TIME_FOR_DEPOSIT - - PEGOUT_PROVIDER_CALL_TIME - - PEGOUT_PROVIDER_PENALTY_FEE - - PEGOUT_PROVIDER_DEPOSIT_DATE_LIMIT - - PEGOUT_PROVIDER_EXPIRE_DATE - - PEGOUT_PROVIDER_EXPIRE_BLOCKS - - LIQUIDITY_PROVIDER_RSK_ADDR - - PEGIN_LIQUIDITY_PROVIDER_RSK_ADDR - - PEGOUT_LIQUIDITY_PROVIDER_RSK_ADDR - - BTCD_RPC_USER - - BTCD_RPC_PASS - - RSK_CHAIN_ID - - LBC_ADDR - - LPS_STAGE - - MONGODB_USER - - MONGODB_PASSWORD - - MONGODB_DATABASE - - MONGODB_LOCAL_PORT - - MONGODB_LOCAL_HOST - - RSKJ_CONNECTION_STRING - - ERP_KEYS + - RSK_CONFIRMATIONS - BTC_NETWORK - - BTC_TX_FEE_RATE - - BTC_ENDPOINT - BTC_USERNAME - BTC_PASSWORD - - AWS_ACCESS_KEY_ID - - AWS_SECRET_ACCESS_KEY - - AWS_REGION - - ENCRYPT_APP_KEY - - QUOTE_CACHE_START_BLOCK + - BTC_ENDPOINT + - BTC_TX_FEE_RATE + - BTC_ENCRYPTED_WALLET + - BTC_WALLET_PASSWORD + - BTC_CONFIRMATIONS + - ALERT_SENDER_EMAIL + - ALERT_RECIPIENT_EMAIL + - BTC_ADDR + - PROVIDER_NAME + - BASE_URL + - PROVIDER_TYPE + - PEGIN_TIME_FOR_DEPOSIT + - PEGIN_CALL_TIME + - PEGIN_PENALTY_FEE + - PEGIN_FEE + - PEGIN_MIN_TRANSACTION_VALUE + - PEGIN_MAX_TRANSACTION_VALUE + - PEGOUT_TIME_FOR_DEPOSIT + - PEGOUT_CALL_TIME + - PEGOUT_PENALTY_FEE + - PEGOUT_FEE + - PEGOUT_MIN_TRANSACTION_VALUE + - PEGOUT_MAX_TRANSACTION_VALUE + - PEGOUT_EXPIRE_BLOCKS + - PEGOUT_DEPOSIT_CACHE_START_BLOCK - CAPTCHA_SECRET_KEY - CAPTCHA_SITE_KEY - CAPTCHA_THRESHOLD - DISABLE_CAPTCHA - - BTC_WALLET_PASSWORD - - BTC_ENCRYPTED_WALLET - - DAO_FEE_COLLECTOR_ADDRESS + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_REGION ports: - "8080:8080" volumes: diff --git a/docker-compose/local/docker-compose.yml b/docker-compose/local/docker-compose.yml index 93714cbe..b4553e47 100644 --- a/docker-compose/local/docker-compose.yml +++ b/docker-compose/local/docker-compose.yml @@ -68,8 +68,8 @@ services: image: bitcond:latest container_name: bitcoind01 environment: - - BTCD_RPC_USER - - BTCD_RPC_PASS + - BTC_USERNAME + - BTC_PASSWORD ports: - "5555:5555" volumes: @@ -79,8 +79,8 @@ services: command: [ "bitcoind", - "-rpcuser=${BTCD_RPC_USER}", - "-rpcpassword=${BTCD_RPC_PASS}", + "-rpcuser=${BTC_USERNAME}", + "-rpcpassword=${BTC_PASSWORD}", "-addresstype=legacy", "-${LPS_STAGE}", "-printtoconsole", @@ -129,7 +129,7 @@ services: environment: - MONGO_INITDB_ROOT_USERNAME=$MONGODB_USER - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_PASSWORD - - MONGO_INITDB_DATABASE=$MONGODB_DATABASE + - MONGO_INITDB_DATABASE=flyover ports: - 27017:27017 volumes: diff --git a/docker-compose/local/lps-env.sh b/docker-compose/local/lps-env.sh index e2d4773c..1af3845f 100755 --- a/docker-compose/local/lps-env.sh +++ b/docker-compose/local/lps-env.sh @@ -6,6 +6,7 @@ if [ -z "${LPS_STAGE}" ]; then echo "LPS_STAGE is not set. Exit 1" exit 1 elif [ "$LPS_STAGE" = "regtest" ]; then + cp ../../sample.config.env .env.regtest ENV_FILE=".env.regtest" elif [ "$LPS_STAGE" = "testnet" ]; then ENV_FILE=".env.testnet" @@ -107,17 +108,17 @@ echo "Waiting for Bitcoind to be up and running..." while true do sleep 3 - curl -s "http://127.0.0.1:5555" -X POST --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getnetworkinfo", "params": [], "id":"1"}' | grep "\"result\":{" \ + curl -s "http://127.0.0.1:5555" -X POST --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getnetworkinfo", "params": [], "id":"1"}' | grep "\"result\":{" \ && echo "Bitcoind is up and running" \ && break done -curl -s "http://127.0.0.1:5555" --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getwalletinfo", "params": [], "id":"getwallet"}' | grep "{\"result\":null,\"error\":{\"code\":-18" \ +curl -s "http://127.0.0.1:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getwalletinfo", "params": [], "id":"getwallet"}' | grep "{\"result\":null,\"error\":{\"code\":-18" \ && echo "No default wallet" \ && echo "Creating wallet" \ - && curl -s "http://127.0.0.1:5555" --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "createwallet", "params": ["main", false, false, "test-password", true, false, true], "id":"createwallet"}' \ - && curl -s "http://127.0.0.1:5555" --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getnewaddress", "params": ["main"], "id":"getnewaddress"}' \ - | jq .result | xargs -I ADDRESS curl -s "http://127.0.0.1:5555" --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "generatetoaddress", "params": [500, "ADDRESS"], "id":"generatetoaddress"}' \ + && curl -s "http://127.0.0.1:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "createwallet", "params": ["main", false, false, "test-password", true, false, true], "id":"createwallet"}' \ + && curl -s "http://127.0.0.1:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getnewaddress", "params": ["main"], "id":"getnewaddress"}' \ + | jq .result | xargs -I ADDRESS curl -s "http://127.0.0.1:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "generatetoaddress", "params": [500, "ADDRESS"], "id":"generatetoaddress"}' \ && echo "Wallet created and generated 500 blocks" if [ "$LPS_STAGE" = "regtest" ]; then @@ -128,17 +129,17 @@ if [ "$LPS_STAGE" = "regtest" ]; then for PROVIDER in "${PROVIDERS[@]}" do # pre-fund provider in regtest, if needed - PROVIDER_RSK_ADDR_LINE=$(cat "$ENV_FILE" | grep "$PROVIDER" | head -n 1 | tr -d '\r') - PROVIDER_RSK_ADDR="${PROVIDER_RSK_ADDR_LINE#"$PROVIDER="}" - PROVIDER_TX_COUNT=$(curl -s -X POST "http://127.0.0.1:4444" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\": [\"$PROVIDER_RSK_ADDR\",\"latest\"],\"id\":1}" | jq -r ".result") + PROVIDER_RSK_ADDR_LINE=$(cat "$ENV_FILE" | grep "$LIQUIDITY_PROVIDER_RSK_ADDR" | head -n 1 | tr -d '\r') + PROVIDER_RSK_ADDR="${PROVIDER_RSK_ADDR_LINE#"$LIQUIDITY_PROVIDER_RSK_ADDR="}" + PROVIDER_TX_COUNT=$(curl -s -X POST "http://127.0.0.1:4444" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\": [\"$LIQUIDITY_PROVIDER_RSK_ADDR\",\"latest\"],\"id\":1}" | jq -r ".result") if [ "$PROVIDER_TX_COUNT" = "0x0" ]; then - echo "Transferring funds to $PROVIDER_RSK_ADDR..." + echo "Transferring funds to $LIQUIDITY_PROVIDER_RSK_ADDR..." - TX_HASH=$(curl -s -X POST "http://127.0.0.1:4444" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\": [{\"from\": \"0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826\", \"to\": \"$PROVIDER_RSK_ADDR\", \"value\": \"0x8AC7230489E80000\"}],\"id\":1}" | jq -r ".result") + TX_HASH=$(curl -s -X POST "http://127.0.0.1:4444" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\": [{\"from\": \"0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826\", \"to\": \"$LIQUIDITY_PROVIDER_RSK_ADDR\", \"value\": \"0x8AC7230489E80000\"}],\"id\":1}" | jq -r ".result") echo "Result: $TX_HASH" sleep 10 else - echo "No need to fund the '$PROVIDER_RSK_ADDR' provider. Nonce: $PROVIDER_TX_COUNT" + echo "No need to fund the '$LIQUIDITY_PROVIDER_RSK_ADDR' provider. Nonce: $PROVIDER_TX_COUNT" fi done diff --git a/docker-compose/lps/Dockerfile b/docker-compose/lps/Dockerfile index d98fbae2..b4aefb48 100644 --- a/docker-compose/lps/Dockerfile +++ b/docker-compose/lps/Dockerfile @@ -1,25 +1,14 @@ -FROM --platform=linux/amd64 golang:1.19-alpine +FROM --platform=linux/amd64 golang:1.21.6-alpine RUN apk add git gcc musl-dev curl jq WORKDIR /code -COPY go.mod ./ +COPY Makefile go.mod go.sum cmd/ internal/ pkg/ ./ COPY go.sum ./ -RUN go mod download - -COPY *.go ./ -COPY connectors ./connectors -COPY http ./http -COPY storage ./storage -COPY pegout ./pegout -COPY pegin ./pegin -COPY mongo ./mongo -COPY secrets ./secrets -COPY account ./account -COPY config ./config - -RUN go build -o /usr/local/bin/liquidity-provider-server +RUN make build + +RUN mv ./build/liquidity-provider-server /usr/local/bin/liquidity-provider-server ARG HOME="/home/lps" RUN adduser -u 1000 --home="$HOME" lps -D lps diff --git a/docker-compose/lps/start.sh b/docker-compose/lps/start.sh index 4f7a7fc4..dd48c60d 100644 --- a/docker-compose/lps/start.sh +++ b/docker-compose/lps/start.sh @@ -2,14 +2,14 @@ set -e -echo "Detected LPS_STAGE: $LPS_STAGE, LBC_ADDR: $LBC_ADDR, BTCD_RPC_USER: $BTCD_RPC_USER, RSK_CHAIN_ID: $RSK_CHAIN_ID" +echo "Detected LPS_STAGE: $LPS_STAGE, LBC_ADDR: $LBC_ADDR, BTC_USERNAME: $BTC_USERNAME, RSK_CHAIN_ID: $RSK_CHAIN_ID" echo "Testing if we have a default wallet" -curl -s "http://bitcoind01:5555" --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getwalletinfo", "params": [], "id":"getwallet"}' | grep "{\"result\":null,\"error\":{\"code\":-18" \ +curl -s "http://bitcoind01:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getwalletinfo", "params": [], "id":"getwallet"}' | grep "{\"result\":null,\"error\":{\"code\":-18" \ && echo "No default wallet" \ && echo "Creating wallet" \ - && curl -s "http://bitcoind01:5555" --user "$BTCD_RPC_USER:$BTCD_RPC_PASS" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "createwallet", "params": ["main", false, false, "test-password", true, false, true], "id":"createwallet"}' + && curl -s "http://bitcoind01:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "createwallet", "params": ["main", false, false, "test-password", true, false, true], "id":"createwallet"}' echo "Starting LP Server..." liquidity-provider-server diff --git a/docker-compose/mainnet/docker-compose-block.yml b/docker-compose/mainnet/docker-compose-block.yml index 265cf3cb..645e2110 100644 --- a/docker-compose/mainnet/docker-compose-block.yml +++ b/docker-compose/mainnet/docker-compose-block.yml @@ -13,7 +13,7 @@ services: - ${BTCD_HOME:-/mnt/bitcoind}:/home/bitcoind/.bitcoind networks: - net_lps - command: ["bitcoind", "-rpcuser=${BTCD_RPC_USER}", "-rpcpassword=${BTCD_RPC_PASS}", "-addresstype=legacy", "-${LPS_STAGE}", "-printtoconsole", "-server", + command: ["bitcoind", "-rpcuser=${BTC_USERNAME}", "-rpcpassword=${BTC_PASSWORD}", "-addresstype=legacy", "-${LPS_STAGE}", "-printtoconsole", "-server", "-txindex", "-deprecatedrpc=signrawtransaction", "-deprecatedrpc=accounts", "-rpcbind=0.0.0.0", "-rpcallowip=0.0.0.0/0", "-rpcport=5555"] diff --git a/docker-compose/mainnet/docker-compose.yml b/docker-compose/mainnet/docker-compose.yml index 1a232965..98e9f44f 100644 --- a/docker-compose/mainnet/docker-compose.yml +++ b/docker-compose/mainnet/docker-compose.yml @@ -25,27 +25,62 @@ services: image: lps:latest container_name: lps01 environment: - - LIQUIDITY_PROVIDER_RSK_ADDR - - PEGIN_LIQUIDITY_PROVIDER_RSK_ADDR - - PEGOUT_LIQUIDITY_PROVIDER_RSK_ADDR - - BTCD_RPC_USER - - BTCD_RPC_PASS - - RSK_CHAIN_ID - - LBC_ADDR - LPS_STAGE - - ERP_KEYS + - SERVER_PORT + - LOG_LEVEL + - LOG_FILE + - ENABLE_MANAGEMENT_API - MONGODB_USER - MONGODB_PASSWORD - - MONGODB_DATABASE - - MONGODB_LOCAL_PORT - - MONGODB_LOCAL_HOST - - RSKJ_CONNECTION_STRING + - MONGODB_HOST + - MONGODB_PORT + - RSK_ENDPOINT + - CHAIN_ID + - LBC_ADDR + - RSK_BRIDGE_ADDR + - RSK_REQUIRED_BRIDGE_CONFIRMATIONS + - IRIS_ACTIVATION_HEIGHT + - ERP_KEYS + - ACCOUNT_NUM + - DAO_FEE_COLLECTOR_ADDRESS + - KEY_SECRET + - PASSWORD_SECRET + - RSK_CONFIRMATIONS - BTC_NETWORK - - BTC_TX_FEE_RATE - - BTC_ENDPOINT - BTC_USERNAME - BTC_PASSWORD - - ENCRYPT_APP_KEY + - BTC_ENDPOINT + - BTC_TX_FEE_RATE + - BTC_ENCRYPTED_WALLET + - BTC_WALLET_PASSWORD + - BTC_CONFIRMATIONS + - ALERT_SENDER_EMAIL + - ALERT_RECIPIENT_EMAIL + - BTC_ADDR + - PROVIDER_NAME + - BASE_URL + - PROVIDER_TYPE + - PEGIN_TIME_FOR_DEPOSIT + - PEGIN_CALL_TIME + - PEGIN_PENALTY_FEE + - PEGIN_FEE + - PEGIN_MIN_TRANSACTION_VALUE + - PEGIN_MAX_TRANSACTION_VALUE + - PEGOUT_TIME_FOR_DEPOSIT + - PEGOUT_CALL_TIME + - PEGOUT_PENALTY_FEE + - PEGOUT_FEE + - PEGOUT_MIN_TRANSACTION_VALUE + - PEGOUT_MAX_TRANSACTION_VALUE + - PEGOUT_EXPIRE_BLOCKS + - PEGOUT_DEPOSIT_CACHE_START_BLOCK + - CAPTCHA_SECRET_KEY + - CAPTCHA_SITE_KEY + - CAPTCHA_THRESHOLD + - DISABLE_CAPTCHA + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_REGION ports: - "8080:8080" volumes: diff --git a/go.mod b/go.mod index 549f6c34..0724d450 100644 --- a/go.mod +++ b/go.mod @@ -3,28 +3,22 @@ module github.com/rsksmart/liquidity-provider-server go 1.21.6 require ( - github.com/aws/aws-sdk-go-v2 v1.20.2 github.com/aws/aws-sdk-go-v2/config v1.18.25 github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.8 github.com/aws/aws-sdk-go-v2/service/ses v1.16.4 github.com/btcsuite/btcd v0.23.4 github.com/btcsuite/btcd/btcutil v1.1.3 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 - github.com/btcsuite/btcutil v1.0.2 github.com/ethereum/go-ethereum v1.11.6 github.com/go-playground/validator/v10 v10.17.0 github.com/gorilla/handlers v1.5.2 github.com/gorilla/mux v1.8.1 - github.com/jmoiron/sqlx v1.3.5 - github.com/rsksmart/liquidity-provider v0.0.0-20231002161316-675248a10604 - github.com/sirupsen/logrus v1.9.1 - github.com/stretchr/testify v1.8.3 + github.com/sirupsen/logrus v1.9.3 go.mongodb.org/mongo-driver v1.13.1 - golang.org/x/term v0.8.0 - modernc.org/sqlite v1.22.1 ) require ( + github.com/aws/aws-sdk-go-v2 v1.20.2 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.39 // indirect @@ -39,12 +33,10 @@ require ( github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -53,20 +45,17 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.16.5 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-isatty v0.0.18 // indirect github.com/montanaflynn/stats v0.7.1 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/testify v1.8.3 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -75,23 +64,11 @@ require ( github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.9.0 // indirect - golang.org/x/mod v0.10.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/uint128 v1.3.0 // indirect - modernc.org/cc/v3 v3.40.0 // indirect - modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.6 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/opt v0.1.3 // indirect - modernc.org/strutil v1.1.3 // indirect - modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 27df21ba..cf4d4adf 100644 --- a/go.sum +++ b/go.sum @@ -1,62 +1,15 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.2 h1:0Aok9u/HVTk7RtY6M1KDcthbaMKGhhS0eLPxIdSIzRI= github.com/aws/aws-sdk-go-v2 v1.20.2/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/config v1.18.25 h1:JuYyZcnMPBiFqn87L2cRppo+rNwgah6YwD3VuyvaW6Q= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= github.com/aws/aws-sdk-go-v2/credentials v1.13.24 h1:PjiYyls3QdCrzqUN35jMWtUK1vqVZ+zLfdOa/UPFDp0= github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= @@ -67,31 +20,23 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.33 h1:gcRN6PXAo8w3HYFp2w github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.33/go.mod h1:S/zgOphghZAIvrbtvsVycoOncfqh1Hc4uGDIHqDLwTU= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.8 h1:eB91eEYUlh8+O2dXr189W8GJJd+/T8N/c5HocH2KzVo= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.8/go.mod h1:3ARttS6G6U3auEdKfaN4GlnfS9UxYE9nqub1+0YGycA= github.com/aws/aws-sdk-go-v2/service/ses v1.16.4 h1:uIMCeReGZkpzLkjYZSMW/Ea2stc9UAw3O928eKRecsE= github.com/aws/aws-sdk-go-v2/service/ses v1.16.4/go.mod h1:H6SFPIYGKdl9FAry2pSFLyuTfBmB1pvjUCKwjdnVi0o= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 h1:UBQjaMTCKwyUYwiVnUt6toEJwGXsLBI6al083tpjJzY= github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 h1:PkHIIJs8qvq0e5QybnZoG1K/9QTrLr9OsqCIo59jOBA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 h1:2DQLAKDteoEDI8zpCzqBMaZlJuoE9iTYD0gFmXVax9E= github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.1 h1:EFKMUmH/iHMqLiwoEDx2rRjRQpI1YCn5jTysoaDujFs= github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= @@ -112,8 +57,6 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= @@ -123,34 +66,24 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= +github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= @@ -160,31 +93,16 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.8/go.mod h1:pJNuIUYfX5+JKzSD/BTdNsvJSZ1TJqmz0dVyXMAbf6M= github.com/ethereum/go-ethereum v1.11.6 h1:2VF8Mf7XiSUfmoNOy3D+ocfl9Qu8baQBrCNbo2CXQ8E= github.com/ethereum/go-ethereum v1.11.6/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -193,225 +111,102 @@ github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= -github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= github.com/go-playground/validator/v10 v10.17.0 h1:SmVVlfAOtlZncTxRuinDPomC2DkXJ4E5T9gDA0AIH74= github.com/go-playground/validator/v10 v10.17.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -422,272 +217,107 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rsksmart/liquidity-provider v0.0.0-20230808193924-d77e7ee56a46 h1:Q6XWb112mX1k9sNlplRC/9AE5/+jV7870iuhJLbFuno= -github.com/rsksmart/liquidity-provider v0.0.0-20230808193924-d77e7ee56a46/go.mod h1:xZgVfirTQcPjJuB/J/lo21QarRYsPoI/NOpPdbzdhtw= -github.com/rsksmart/liquidity-provider v0.0.0-20230823142602-8f2c6f132d9d h1:F9ukcwBYM8ioasVYx/uH1hqk1V8CGfcMJw4tjUeasmk= -github.com/rsksmart/liquidity-provider v0.0.0-20230823142602-8f2c6f132d9d/go.mod h1:xZgVfirTQcPjJuB/J/lo21QarRYsPoI/NOpPdbzdhtw= -github.com/rsksmart/liquidity-provider v0.0.0-20230904124017-3a8e11ac5062 h1:Uwub5+grQCjD6sf4oNbOT2d36BZiFUu48EE1JCqXBr8= -github.com/rsksmart/liquidity-provider v0.0.0-20230904124017-3a8e11ac5062/go.mod h1:xZgVfirTQcPjJuB/J/lo21QarRYsPoI/NOpPdbzdhtw= -github.com/rsksmart/liquidity-provider v0.0.0-20231002161316-675248a10604 h1:z/tJAkDqISgt4mgkL91I9NREtefCXdYWP+j6yCiayZA= -github.com/rsksmart/liquidity-provider v0.0.0-20231002161316-675248a10604/go.mod h1:xZgVfirTQcPjJuB/J/lo21QarRYsPoI/NOpPdbzdhtw= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.1 h1:Ou41VVR3nMWWmTiEUnj0OlsgOSCUFgsPAOl6jRIcVtQ= github.com/sirupsen/logrus v1.9.1/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/wagslane/go-password-validator v0.3.0/go.mod h1:TI1XJ6T5fRdRnHqHt14pvy1tNVnrwe7m3/f1f2fDphQ= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.mongodb.org/mongo-driver v1.11.6 h1:XM7G6PjiGAO5betLF13BIa5TlLUUE3uJ/2Ox3Lz1K+o= -go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY= go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -696,101 +326,27 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -801,21 +357,14 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -824,36 +373,3 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo= -modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= -modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= -modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/configuration/bootstrap/rootstock.go b/internal/configuration/bootstrap/rootstock.go index 7125449b..7705a07c 100644 --- a/internal/configuration/bootstrap/rootstock.go +++ b/internal/configuration/bootstrap/rootstock.go @@ -55,7 +55,7 @@ func Rootstock(ctx context.Context, env environment2.RskEnv) (*rootstock.RskClie func RootstockAccount(env environment2.RskEnv, secrets environment2.ApplicationSecrets) (*rootstock.RskAccount, error) { return rootstock.GetAccount( - "keystore", + "geth_keystore", env.AccountNumber, secrets.EncryptedJson, secrets.EncryptedJsonPassword, diff --git a/sample-config.env b/sample-config.env index 089d929c..d6aa35fc 100755 --- a/sample-config.env +++ b/sample-config.env @@ -1,84 +1,75 @@ -LOG_FILE=./logs/lps.log +# General config +SERVER_PORT=8080 LOG_LEVEL=debug -DEBUG=TRUE -IRIS_ACTIVATION_HEIGHT=10 -ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3, 0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14, 034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f +LOG_FILE=./logs/lps.log +ENABLE_MANAGEMENT_API=false -SERVER_PORT=8080 -DB_PATH=./db/server.db +# MongoDB config +MONGODB_USER=root +MONGODB_PASSWORD=root +MONGODB_HOST=127.0.0.1 +MONGODB_PORT=27017 + +# Rsk config RSK_ENDPOINT=http://localhost:4444 +CHAIN_ID=33 +LBC_ADDR=0x8901a2Bbf639bFD21A97004BA4D7aE2BD00B8DA8 RSK_BRIDGE_ADDR=0x0000000000000000000000000000000001000006 RSK_REQUIRED_BRIDGE_CONFIRMATIONS=10 +IRIS_ACTIVATION_HEIGHT=10 +ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3, 0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14, 034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f +ACCOUNT_NUM=0 +DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 +KEY_SECRET=FlyoverTestEnv/LPS-LOCAL-KEY +PASSWORD_SECRET=FlyoverTestEnv/LPS-LOCAL-PASSWORD +RSK_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -BTC_ENDPOINT=127.0.0.1:5555 +# BTC config +BTC_NETWORK=regtest BTC_USERNAME=test BTC_PASSWORD=test -BTC_NETWORK=regtest +BTC_ENDPOINT=127.0.0.1:5555 BTC_TX_FEE_RATE=0.00025 +BTC_ENCRYPTED_WALLET=true +BTC_WALLET_PASSWORD=FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD +BTC_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' +# Liquidity Provider config +ALERT_SENDER_EMAIL=no-reply@mail.flyover.rifcomputing.net +ALERT_RECIPIENT_EMAIL=test@iovlabs.org BTC_ADDR=mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6 +PROVIDER_NAME="Default Provider" +BASE_URL="http://localhost:8080" +PROVIDER_TYPE=both -PEGIN_MAX_CONF=60 -BTC_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' +# Pegin config PEGIN_TIME_FOR_DEPOSIT=3600 PEGIN_CALL_TIME=7200 PEGIN_PENALTY_FEE=1000000 - -PEGOUT_MAX_CONF=60 -RSK_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' -PEGOUT_TIME_FOR_DEPOSIT=3600 -PEGOUT_CALL_TIME=7200 -PEGOUT_PENALTY_FEE=1000000 -PEGOUT_DEPOSIT_DATE_LIMIT=3600 -PEGOUT_EXPIRE_DATE=3600 -PEGOUT_EXPIRE_BLOCKS=5000 -PEGOUT_TRANSFER_CONFIRMATIONS=1 -PEGOUT_DEPOSIT_CONFIRMATIONS=2 -PEGOUT_TRANSFER_TIME=3600 - -KEY_DIR=geth_keystore -ACCOUNT_NUM=0 -PWD_FILE=pwd.txt -CHAIN_ID=33 -KEY_SECRET=FlyoverTestEnv/LPS-LOCAL-KEY -PASSWORD_SECRET=FlyoverTestEnv/LPS-LOCAL-PASSWORD -BTC_WALLET_PASSWORD=FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD -BTC_ENCRYPTED_WALLET=true - -# From previous .env -LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c - -BTCD_RPC_USER=test -BTCD_RPC_PASS=test - -LBC_ADDR= - -RSK_CHAIN_ID=33 - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_REGION= - -PROVIDER_NAME="Default Provider" - PEGIN_FEE=10000000000000000 PEGIN_MIN_TRANSACTION_VALUE=600000000000000000 PEGIN_MAX_TRANSACTION_VALUE=1000000000000000000 +# Pegout config +PEGOUT_TIME_FOR_DEPOSIT=3600 +PEGOUT_CALL_TIME=7200 +PEGOUT_PENALTY_FEE=1000000 PEGOUT_FEE=10000000000000000 PEGOUT_MIN_TRANSACTION_VALUE=600000000000000000 PEGOUT_MAX_TRANSACTION_VALUE=1000000000000000000 +PEGOUT_EXPIRE_BLOCKS=5000 +PEGOUT_DEPOSIT_CACHE_START_BLOCK=0 -BASE_URL="http://localhost:8080" - -QUOTE_CACHE_START_BLOCK=0 +# Captcha env CAPTCHA_SECRET_KEY= CAPTCHA_SITE_KEY= CAPTCHA_THRESHOLD=0.8 -DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 DISABLE_CAPTCHA=true -PROVIDER_TYPE=both -ALERT_SENDER_EMAIL=no-reply@mail.flyover.rifcomputing.net -ALERT_RECIPIENT_EMAIL=test@iovlabs.org -ENABLE_MANAGEMENT_API=TRUE \ No newline at end of file +# Aws env +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_REGION= + +# Used by local scripts +LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c \ No newline at end of file From 08e57171f1d1503fd3513dd3447bfda5ffbd5fdb Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 30 Jan 2024 18:51:46 -0300 Subject: [PATCH 006/113] fix: major linting issues --- .../dataproviders/rootstock/federation.go | 51 +++--- internal/adapters/entrypoints/rest/common.go | 14 +- .../entrypoints/rest/middlewares/captcha.go | 76 +++++---- .../entrypoints/rest/server/server.go | 8 +- internal/configuration/bootstrap/bitcoin.go | 9 +- .../configuration/environment/environment.go | 2 +- .../environment/environment_reader.go | 160 +++++++++++------- internal/configuration/registry/usecase.go | 2 + internal/entities/quote/common.go | 9 + internal/usecases/common.go | 26 +++ .../liquidity_provider/registration.go | 72 +++++--- internal/usecases/pegin/accept_pegin_quote.go | 53 +++--- internal/usecases/pegin/call_for_user.go | 105 +++++++----- internal/usecases/pegin/get_pegin_quote.go | 117 +++++++------ internal/usecases/pegin/register_pegin.go | 21 ++- .../usecases/pegout/accept_pegout_quote.go | 34 ++-- internal/usecases/pegout/get_pegout_quote.go | 129 ++++++++------ internal/usecases/pegout/refund_pegout.go | 71 +++++--- internal/usecases/pegout/send_pegout.go | 119 ++++++++----- 19 files changed, 690 insertions(+), 388 deletions(-) diff --git a/internal/adapters/dataproviders/rootstock/federation.go b/internal/adapters/dataproviders/rootstock/federation.go index a43b4c94..8cefd03a 100644 --- a/internal/adapters/dataproviders/rootstock/federation.go +++ b/internal/adapters/dataproviders/rootstock/federation.go @@ -16,6 +16,35 @@ func getFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Pa // All Federations activated AFTER Iris will be ERP, therefore we build redeem script. if fedInfo.ActiveFedBlockHeight > fedInfo.IrisActivationHeight { + buf, err = getFedRedeemScriptAfterIrisActivation(fedInfo, btcParams) + } else { + buf, err = getFedRedeemScriptBeforeIrisActivation(fedInfo, btcParams) + } + + return buf.Bytes(), err +} + +func getFedRedeemScriptAfterIrisActivation(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { + buf, err := getRedeemScriptBuf(fedInfo, true) + if err != nil { + return nil, err + } + + err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + if err != nil { + return nil, err + } + return buf, nil +} + +func getFedRedeemScriptBeforeIrisActivation(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { + buf, err := getErpRedeemScriptBuf(fedInfo, btcParams) + if err != nil { + return nil, err + } + + err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + if err != nil { // ok, it could be that ERP is not yet activated, falling back to redeem Script buf, err = getRedeemScriptBuf(fedInfo, true) if err != nil { return nil, err @@ -25,27 +54,8 @@ func getFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Pa if err != nil { return nil, err } - } else { - buf, err = getErpRedeemScriptBuf(fedInfo, btcParams) - if err != nil { - return nil, err - } - - err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) - if err != nil { // ok, it could be that ERP is not yet activated, falling back to redeem Script - buf, err = getRedeemScriptBuf(fedInfo, true) - if err != nil { - return nil, err - } - - err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) - if err != nil { - return nil, err - } - } } - - return buf.Bytes(), nil + return buf, nil } func getRedeemScriptBuf(fedInfo blockchain.FederationInfo, addMultiSig bool) (*bytes.Buffer, error) { @@ -188,6 +198,7 @@ func getFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) []by return buf.Bytes() } +// nolint:cyclop func getOpCodeFromInt(val int) byte { switch val { case 1: diff --git a/internal/adapters/entrypoints/rest/common.go b/internal/adapters/entrypoints/rest/common.go index 9b603c8d..cb84545c 100644 --- a/internal/adapters/entrypoints/rest/common.go +++ b/internal/adapters/entrypoints/rest/common.go @@ -2,6 +2,7 @@ package rest import ( "encoding/json" + "errors" "fmt" "github.com/go-playground/validator/v10" log "github.com/sirupsen/logrus" @@ -62,6 +63,12 @@ func DecodeRequestError(w http.ResponseWriter, err error) { JsonErrorResponse(w, http.StatusBadRequest, jsonErr) } +func ValidateRequestError(w http.ResponseWriter, err error) { + log.Error("Error validating request: ", err.Error()) + jsonErr := NewErrorResponse(fmt.Sprintf("Error validating request: %v", err), true) + JsonErrorResponse(w, http.StatusBadRequest, jsonErr) +} + func DecodeRequest[T any](w http.ResponseWriter, req *http.Request, body *T) error { var err error dec := json.NewDecoder(req.Body) @@ -74,13 +81,16 @@ func DecodeRequest[T any](w http.ResponseWriter, req *http.Request, body *T) err } func ValidateRequest[T any](w http.ResponseWriter, body *T) error { + var validationErrors *validator.ValidationErrors err := RequestValidator.Struct(body) if err == nil { return nil + } else if !errors.As(err, &validationErrors) { + ValidateRequestError(w, err) + return err } - validationErrors := err.(validator.ValidationErrors) details := make(ErrorDetails) - for _, field := range validationErrors { + for _, field := range *validationErrors { details[field.Field()] = fmt.Sprintf("validation failed: %s", field.Tag()) } jsonErr := NewErrorResponseWithDetails("validation error", details, true) diff --git a/internal/adapters/entrypoints/rest/middlewares/captcha.go b/internal/adapters/entrypoints/rest/middlewares/captcha.go index 5c30bb3c..6761077d 100644 --- a/internal/adapters/entrypoints/rest/middlewares/captcha.go +++ b/internal/adapters/entrypoints/rest/middlewares/captcha.go @@ -19,13 +19,6 @@ type captchaValidationResponse struct { ErrorCodes []string `json:"error-codes"` } -func unexpectedCaptchaError(w http.ResponseWriter, err error) { - details := make(rest.ErrorDetails) - details["error"] = err.Error() - jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, false) - rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) -} - func NewCaptchaMiddleware(captchaUrl string, captchaThreshold float32, disabled bool, captchaSecretKey string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { if captchaThreshold < 0.5 { @@ -43,34 +36,7 @@ func NewCaptchaMiddleware(captchaUrl string, captchaThreshold float32, disabled return } - form := make(url.Values) - form.Set("secret", captchaSecretKey) - form.Set("response", token) - req, err := http.NewRequestWithContext( - r.Context(), - http.MethodPost, - captchaUrl, - bytes.NewBufferString(form.Encode()), - ) - if err != nil { - unexpectedCaptchaError(w, err) - return - } - - res, err := http.DefaultClient.Do(req) - if err != nil { - unexpectedCaptchaError(w, err) - return - } - - defer func() { - if err = res.Body.Close(); err != nil { - log.Error("Error closing response body: ", err) - } - }() - - var validation captchaValidationResponse - err = json.NewDecoder(res.Body).Decode(&validation) + validation, err := validateCaptcha(r, captchaUrl, captchaSecretKey, token) if err != nil { unexpectedCaptchaError(w, err) return @@ -90,3 +56,43 @@ func NewCaptchaMiddleware(captchaUrl string, captchaThreshold float32, disabled }) } } + +func unexpectedCaptchaError(w http.ResponseWriter, err error) { + details := make(rest.ErrorDetails) + details["error"] = err.Error() + jsonErr := rest.NewErrorResponseWithDetails("error validating captcha", details, false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) +} + +func validateCaptcha(r *http.Request, captchaUrl, captchaSecretKey, token string) (captchaValidationResponse, error) { + var validation captchaValidationResponse + form := make(url.Values) + form.Set("secret", captchaSecretKey) + form.Set("response", token) + req, err := http.NewRequestWithContext( + r.Context(), + http.MethodPost, + captchaUrl, + bytes.NewBufferString(form.Encode()), + ) + if err != nil { + return captchaValidationResponse{}, err + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + return captchaValidationResponse{}, err + } + + defer func() { + if err = res.Body.Close(); err != nil { + log.Error("Error closing response body: ", err) + } + }() + + err = json.NewDecoder(res.Body).Decode(&validation) + if err != nil { + return captchaValidationResponse{}, err + } + return validation, nil +} diff --git a/internal/adapters/entrypoints/rest/server/server.go b/internal/adapters/entrypoints/rest/server/server.go index d18d1dd9..7ae316b6 100644 --- a/internal/adapters/entrypoints/rest/server/server.go +++ b/internal/adapters/entrypoints/rest/server/server.go @@ -15,6 +15,7 @@ import ( "os/signal" "strconv" "syscall" + "time" ) type Server struct { @@ -46,8 +47,11 @@ func (s *Server) start() error { _ = w.Close() }(w) s.http = http.Server{ - Addr: ":" + strconv.FormatUint(uint64(s.env.Port), 10), - Handler: h, + Addr: ":" + strconv.FormatUint(uint64(s.env.Port), 10), + Handler: h, + ReadHeaderTimeout: 2 * time.Second, + WriteTimeout: 3 * time.Second, + IdleTimeout: 3 * time.Second, } log.Info("Server started at localhost:", s.http.Addr) return s.http.ListenAndServe() diff --git a/internal/configuration/bootstrap/bitcoin.go b/internal/configuration/bootstrap/bitcoin.go index b270c766..a44ab94a 100644 --- a/internal/configuration/bootstrap/bitcoin.go +++ b/internal/configuration/bootstrap/bitcoin.go @@ -1,6 +1,7 @@ package bootstrap import ( + "errors" "fmt" "github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/btcd/chaincfg" @@ -58,16 +59,16 @@ func Bitcoin(env environment.BtcEnv) (*bitcoin.Connection, error) { } func checkBtcdVersion(c *rpcclient.Client) (int32, error) { + var networkErr *btcjson.RPCError info, err := c.GetNetworkInfo() - switch networkErr := err.(type) { - case nil: + if err == nil { return info.Version, nil - case *btcjson.RPCError: + } else if errors.As(err, &networkErr) { if networkErr.Code != btcjson.ErrRPCMethodNotFound.Code { return 0, fmt.Errorf("unable to detect btcd version: %w", networkErr) } return unknownBtcdVersion, nil - default: + } else { return 0, fmt.Errorf("unable to detect btcd version: %w", networkErr) } } diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index d7a5f0b9..28997936 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -10,7 +10,7 @@ type Environment struct { Port uint `env:"SERVER_PORT" validate:"required"` LogLevel string `env:"LOG_LEVEL" validate:"required"` LogFile string `env:"LOG_FILE"` - EnableManagementApi bool `env:"ENABLE_MANAGEMENT_API" validate:"required"` + EnableManagementApi bool `env:"ENABLE_MANAGEMENT_API"` Mongo MongoEnv Rsk RskEnv Btc BtcEnv diff --git a/internal/configuration/environment/environment_reader.go b/internal/configuration/environment/environment_reader.go index 3354ff74..a32ea228 100644 --- a/internal/configuration/environment/environment_reader.go +++ b/internal/configuration/environment/environment_reader.go @@ -14,34 +14,40 @@ func Load(arg *Environment) error { return parseEnv(reflect.ValueOf(arg)) } -func parseEnv(arg reflect.Value) error { - if arg.Kind() == reflect.Ptr && arg.IsNil() { - arg.Set(reflect.New(arg.Elem().Type())) +func parseEnv(value reflect.Value) error { + if value.Kind() == reflect.Ptr && value.IsNil() { + value.Set(reflect.New(value.Elem().Type())) } - if arg.Kind() == reflect.Ptr { - arg = arg.Elem() + if value.Kind() == reflect.Ptr { + value = value.Elem() } - argType := arg.Type() - var envVarName string - var fieldType reflect.Kind + valueType := value.Type() + var err error - for i := 0; i < arg.NumField(); i++ { - envVarName = argType.Field(i).Tag.Get("env") - fieldType = argType.Field(i).Type.Kind() - if envVarName == "" && fieldType != reflect.Struct { - return fmt.Errorf("field %s doesn't have envVarName tag", argType.Field(i).Name) + for i := 0; i < value.NumField(); i++ { + if err = parseField(i, value, valueType); err != nil { + return err } + } + return nil +} - if argType.Field(i).Type.Kind() == reflect.Struct { - if err := parseEnv(arg.Field(i)); err != nil { - return err - } - } else if envVarName != "" { - if err := setEnvValue(arg.Field(i), os.Getenv(envVarName)); err != nil { - return fmt.Errorf("error reading %s environment variable: %w", envVarName, err) - } +func parseField(fieldNumber int, value reflect.Value, valueType reflect.Type) error { + envVarName := valueType.Field(fieldNumber).Tag.Get("env") + fieldType := valueType.Field(fieldNumber).Type.Kind() + if envVarName == "" && fieldType != reflect.Struct { + return fmt.Errorf("field %s doesn't have envVarName tag", valueType.Field(fieldNumber).Name) + } + + if valueType.Field(fieldNumber).Type.Kind() == reflect.Struct { + if err := parseEnv(value.Field(fieldNumber)); err != nil { + return err + } + } else if envVarName != "" { + if err := setEnvValue(value.Field(fieldNumber), os.Getenv(envVarName)); err != nil { + return fmt.Errorf("error reading %s environment variable: %w", envVarName, err) } } return nil @@ -52,58 +58,88 @@ func setEnvValue(field reflect.Value, envVar string) error { case reflect.String: field.SetString(envVar) case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - if envVar == "" { - field.SetUint(0) - } else if uint64Value, err := strconv.ParseUint(envVar, 10, 64); err != nil { - return err - } else { - field.SetUint(uint64Value) - } + return parseUint(envVar, field) case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - if envVar == "" { - field.SetInt(0) - } else if int64Value, err := strconv.ParseInt(envVar, 10, 64); err != nil { - return err - } else { - field.SetInt(int64Value) - } + return parseInt(envVar, field) case reflect.Float32, reflect.Float64: - if envVar == "" { - field.SetFloat(0) - } else if float64Value, err := strconv.ParseFloat(envVar, 64); err != nil { - return err - } else { - field.SetFloat(float64Value) - } + return parseFloat(envVar, field) case reflect.Bool: - if boolValue, err := strconv.ParseBool(envVar); err != nil { - return err - } else { - field.SetBool(boolValue) - } + return parseBool(envVar, field) case reflect.Slice: - if field.Type().Elem().Kind() != reflect.String { - return errors.New("unsupported env array") - } - for _, value := range strings.Split(envVar, ",") { - element := reflect.New(field.Type().Elem()).Elem() - element.SetString(value) - field.Set(reflect.Append(field, element)) - } + return parseSlice(envVar, field) case reflect.Map: - mapValue := reflect.New(field.Type()) - mapContent := mapValue.Interface() - if err := json.Unmarshal([]byte(envVar), &mapContent); err != nil { - return err - } else { - field.Set(mapValue.Elem()) - } + return parseMap(envVar, field) default: return jsonUnmarshalEnvValue(field, envVar) } return nil } +func parseUint(envVar string, field reflect.Value) error { + if envVar == "" { + field.SetUint(0) + } else if uint64Value, err := strconv.ParseUint(envVar, 10, 64); err != nil { + return err + } else { + field.SetUint(uint64Value) + } + return nil +} + +func parseInt(envVar string, field reflect.Value) error { + if envVar == "" { + field.SetInt(0) + } else if int64Value, err := strconv.ParseInt(envVar, 10, 64); err != nil { + return err + } else { + field.SetInt(int64Value) + } + return nil +} + +func parseFloat(envVar string, field reflect.Value) error { + if envVar == "" { + field.SetFloat(0) + } else if float64Value, err := strconv.ParseFloat(envVar, 64); err != nil { + return err + } else { + field.SetFloat(float64Value) + } + return nil +} + +func parseBool(envVar string, field reflect.Value) error { + if boolValue, err := strconv.ParseBool(envVar); err != nil { + return err + } else { + field.SetBool(boolValue) + } + return nil +} + +func parseSlice(envVar string, field reflect.Value) error { + if field.Type().Elem().Kind() != reflect.String { + return errors.New("unsupported env array") + } + for _, value := range strings.Split(envVar, ",") { + element := reflect.New(field.Type().Elem()).Elem() + element.SetString(value) + field.Set(reflect.Append(field, element)) + } + return nil +} + +func parseMap(envVar string, field reflect.Value) error { + mapValue := reflect.New(field.Type()) + mapContent := mapValue.Interface() + if err := json.Unmarshal([]byte(envVar), &mapContent); err != nil { + return err + } else { + field.Set(mapValue.Elem()) + } + return nil +} + func jsonUnmarshalEnvValue(field reflect.Value, envVar string) error { var fieldType reflect.Type if field.Kind() == reflect.Ptr { diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index d5af40eb..cba5aa29 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -44,6 +44,8 @@ type UseCaseRegistry struct { addPegoutCollateralUseCase *pegout.AddCollateralUseCase } +// NewUseCaseRegistry +// nolint:funlen func NewUseCaseRegistry( env environment.Environment, rskRegistry *Rootstock, diff --git a/internal/entities/quote/common.go b/internal/entities/quote/common.go index 0fa1ba98..0f4d2d4b 100644 --- a/internal/entities/quote/common.go +++ b/internal/entities/quote/common.go @@ -1,6 +1,15 @@ package quote +import "github.com/rsksmart/liquidity-provider-server/internal/entities" + type AcceptedQuote struct { Signature string `json:"signature"` DepositAddress string `json:"depositAddress"` } + +type Fees struct { + CallFee *entities.Wei + GasFee *entities.Wei + PenaltyFee *entities.Wei + ProductFeeAmount uint64 +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go index 8f0814c0..100d37c2 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -2,11 +2,13 @@ package usecases import ( "context" + "crypto/rand" "encoding/json" "errors" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "math" "math/big" ) @@ -116,3 +118,27 @@ func CalculateDaoAmounts(ctx context.Context, rsk blockchain.RootstockRpcServer, DaoGasAmount: daoGasAmount, }, nil } + +func ValidateMinLockValue(useCase UseCaseId, bridge blockchain.RootstockBridge, value *entities.Wei) error { + var err error + var minLockTxValueInSatoshi *entities.Wei + + errorArgs := NewErrorArgs() + if minLockTxValueInSatoshi, err = bridge.GetMinimumLockTxValue(); err != nil { + return WrapUseCaseError(useCase, err) + } + if minimumInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()); value.Cmp(minimumInWei) <= 0 { + errorArgs["minimum"] = minimumInWei.String() + errorArgs["value"] = value.String() + return WrapUseCaseErrorArgs(useCase, TxBelowMinimumError, errorArgs) + } + return nil +} + +func GetRandomInt() (int64, error) { + random, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt)) + if err != nil { + return 0, err + } + return random.Int64(), nil +} diff --git a/internal/usecases/liquidity_provider/registration.go b/internal/usecases/liquidity_provider/registration.go index 36646137..e7df903b 100644 --- a/internal/usecases/liquidity_provider/registration.go +++ b/internal/usecases/liquidity_provider/registration.go @@ -30,14 +30,12 @@ type operationalInfo struct { func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationParams) (int64, error) { var collateral collateralInfo var operational operationalInfo - collateralToAdd := new(entities.Wei) + var addedCollateral bool var id int64 var err error - if err = entities.ValidateStruct(params); err != nil { - return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) - } else if !params.Type.IsValid() { - return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, entities.InvalidProviderTypeError) + if err = useCase.validateParams(params); err != nil { + return 0, err } if collateral, err = useCase.getCollateralInfo(); err != nil { @@ -47,24 +45,16 @@ func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationPa return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } - if useCase.isProviderRegistered(params.Type, operational) { + if useCase.isProviderOperational(params.Type, operational) { return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, usecases.AlreadyRegisteredError) } - if params.Type.AcceptsPegin() && !operational.operationalForPegin && collateral.peginCollateral.Cmp(entities.NewWei(0)) != 0 { - if err = useCase.lbc.AddCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.peginCollateral)); err != nil { - return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) - } else { - return 0, nil - } + if addedCollateral, err = useCase.addPeginCollateral(params, operational, collateral); addedCollateral == true || err != nil { + return 0, err } - if params.Type.AcceptsPegout() && !operational.operationalForPegout && collateral.pegoutCollateral.Cmp(entities.NewWei(0)) != 0 { - if err = useCase.lbc.AddPegoutCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.pegoutCollateral)); err != nil { - return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) - } else { - return 0, nil - } + if addedCollateral, err = useCase.addPegoutCollateral(params, operational, collateral); addedCollateral == true || err != nil { + return 0, err } log.Debug("Registering new provider...") @@ -111,7 +101,7 @@ func (useCase *RegistrationUseCase) getOperationalInfo() (operationalInfo, error }, nil } -func (useCase *RegistrationUseCase) isProviderRegistered(providerType entities.ProviderType, operational operationalInfo) bool { +func (useCase *RegistrationUseCase) isProviderOperational(providerType entities.ProviderType, operational operationalInfo) bool { return (providerType == entities.FullProvider && operational.operationalForPegin && operational.operationalForPegout) || (providerType == entities.PeginProvider && operational.operationalForPegin) || (providerType == entities.PegoutProvider && operational.operationalForPegout) @@ -122,3 +112,47 @@ func (useCase *RegistrationUseCase) registerProvider(params blockchain.ProviderR txConfig := blockchain.NewTransactionConfig(value.Mul(collateral.minimumCollateral, entities.NewUWei(2)), 0, nil) return useCase.lbc.RegisterProvider(txConfig, params) } + +func (useCase *RegistrationUseCase) validateParams(params blockchain.ProviderRegistrationParams) error { + var err error + if err = entities.ValidateStruct(params); err != nil { + return usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else if !params.Type.IsValid() { + return usecases.WrapUseCaseError(usecases.ProviderRegistrationId, entities.InvalidProviderTypeError) + } + return nil +} + +func (useCase *RegistrationUseCase) addPeginCollateral( + params blockchain.ProviderRegistrationParams, + operational operationalInfo, + collateral collateralInfo, +) (bool, error) { + var err error + var collateralToAdd *entities.Wei + if !(params.Type.AcceptsPegin() && !operational.operationalForPegin && collateral.peginCollateral.Cmp(entities.NewWei(0)) != 0) { + return false, nil + } + if err = useCase.lbc.AddCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.peginCollateral)); err != nil { + return true, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else { + return true, nil + } +} + +func (useCase *RegistrationUseCase) addPegoutCollateral( + params blockchain.ProviderRegistrationParams, + operational operationalInfo, + collateral collateralInfo, +) (bool, error) { + var err error + var collateralToAdd *entities.Wei + if !(params.Type.AcceptsPegout() && !operational.operationalForPegout && collateral.pegoutCollateral.Cmp(entities.NewWei(0)) != 0) { + return false, nil + } + if err = useCase.lbc.AddPegoutCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.pegoutCollateral)); err != nil { + return true, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else { + return true, nil + } +} diff --git a/internal/usecases/pegin/accept_pegin_quote.go b/internal/usecases/pegin/accept_pegin_quote.go index 7c2eb99d..d3cca804 100644 --- a/internal/usecases/pegin/accept_pegin_quote.go +++ b/internal/usecases/pegin/accept_pegin_quote.go @@ -46,16 +46,8 @@ func NewAcceptQuoteUseCase( func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (quote.AcceptedQuote, error) { var err error errorArgs := usecases.NewErrorArgs() - var quoteHashBytes []byte var peginQuote *quote.PeginQuote var retainedQuote *quote.RetainedPeginQuote - var derivation blockchain.FlyoverDerivation - var quoteSignature string - var requiredLiquidity *entities.Wei - - if quoteHashBytes, err = hex.DecodeString(quoteHash); err != nil { - return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) - } if peginQuote, err = useCase.quoteRepository.GetQuote(ctx, quoteHash); err != nil { return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) @@ -81,23 +73,9 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q }, nil } - if derivation, err = useCase.calculateDerivationAddress(quoteHashBytes, *peginQuote); err != nil { - return quote.AcceptedQuote{}, err - } - if requiredLiquidity, err = useCase.calculateAndCheckLiquidity(ctx, *peginQuote); err != nil { + if retainedQuote, err = useCase.buildRetainedQuote(ctx, quoteHash, peginQuote); err != nil { return quote.AcceptedQuote{}, err } - if quoteSignature, err = useCase.lp.SignQuote(quoteHash); err != nil { - return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) - } - - retainedQuote = "e.RetainedPeginQuote{ - QuoteHash: quoteHash, - DepositAddress: derivation.Address, - Signature: quoteSignature, - RequiredLiquidity: requiredLiquidity, - State: quote.PeginStateWaitingForDeposit, - } if err = entities.ValidateStruct(retainedQuote); err != nil { return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) @@ -168,3 +146,32 @@ func (useCase *AcceptQuoteUseCase) calculateAndCheckLiquidity(ctx context.Contex } return requiredLiquidity, nil } + +func (useCase *AcceptQuoteUseCase) buildRetainedQuote(ctx context.Context, quoteHash string, peginQuote *quote.PeginQuote) (*quote.RetainedPeginQuote, error) { + var derivation blockchain.FlyoverDerivation + var requiredLiquidity *entities.Wei + var quoteHashBytes []byte + var quoteSignature string + var err error + + if quoteHashBytes, err = hex.DecodeString(quoteHash); err != nil { + return nil, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + if derivation, err = useCase.calculateDerivationAddress(quoteHashBytes, *peginQuote); err != nil { + return nil, err + } + if requiredLiquidity, err = useCase.calculateAndCheckLiquidity(ctx, *peginQuote); err != nil { + return nil, err + } + if quoteSignature, err = useCase.lp.SignQuote(quoteHash); err != nil { + return nil, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) + } + + return "e.RetainedPeginQuote{ + QuoteHash: quoteHash, + DepositAddress: derivation.Address, + Signature: quoteSignature, + RequiredLiquidity: requiredLiquidity, + State: quote.PeginStateWaitingForDeposit, + }, nil +} diff --git a/internal/usecases/pegin/call_for_user.go b/internal/usecases/pegin/call_for_user.go index 494e9f1f..1a159ee3 100644 --- a/internal/usecases/pegin/call_for_user.go +++ b/internal/usecases/pegin/call_for_user.go @@ -42,11 +42,7 @@ func NewCallForUserUseCase( func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, retainedQuote quote.RetainedPeginQuote) error { balance := new(entities.Wei) valueToSend := new(entities.Wei) - var txInfo blockchain.BitcoinTransactionInformation var peginQuote *quote.PeginQuote - var quoteState quote.PeginState - var callForUserTx string - var txConfirmations big.Int var err error if retainedQuote.State != quote.PeginStateWaitingForDeposit { @@ -63,24 +59,8 @@ func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, re return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.ExpiredQuoteError, false) } - if txInfo, err = useCase.btc.GetTransactionInfo(bitcoinTx); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) - } - txConfirmations.SetUint64(txInfo.Confirmations) - if txConfirmations.Cmp(big.NewInt(int64(peginQuote.Confirmations))) < 0 { - return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.NoEnoughConfirmationsError, true) - } - - sentAmount := txInfo.AmountToAddress(retainedQuote.DepositAddress) - if sentAmount.Cmp(peginQuote.Total()) < 0 { - retainedQuote.UserBtcTxHash = bitcoinTx - return useCase.publishErrorEvent( - ctx, - retainedQuote, - *peginQuote, - fmt.Errorf("insufficient amount %v < %v", sentAmount, peginQuote.Total()), - false, - ) + if err = useCase.validateBitcoinTx(ctx, bitcoinTx, peginQuote, retainedQuote); err != nil { + return err } useCase.rskWalletMutex.Lock() @@ -94,22 +74,7 @@ func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, re valueToSend.Sub(peginQuote.Value, balance) } - config := blockchain.NewTransactionConfig(valueToSend, uint64(peginQuote.GasLimit+CallForUserExtraGas), nil) - if callForUserTx, err = useCase.lbc.CallForUser(config, *peginQuote); err != nil { - quoteState = quote.PeginStateCallForUserFailed - } else { - quoteState = quote.PeginStateCallForUserSucceeded - } - - retainedQuote.CallForUserTxHash = callForUserTx - retainedQuote.UserBtcTxHash = bitcoinTx - retainedQuote.State = quoteState - useCase.eventBus.Publish(quote.CallForUserCompletedEvent{ - Event: entities.NewBaseEvent(quote.CallForUserCompletedEventId), - PeginQuote: *peginQuote, - RetainedQuote: retainedQuote, - Error: err, - }) + retainedQuote, err = useCase.performCallForUser(bitcoinTx, valueToSend, peginQuote, retainedQuote) if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { err = errors.Join(err, updateError) @@ -117,9 +82,8 @@ func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, re if err != nil { err = errors.Join(err, usecases.NonRecoverableError) return usecases.WrapUseCaseErrorArgs(usecases.CallForUserId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) - } else { - return nil } + return nil } func (useCase *CallForUserUseCase) publishErrorEvent( @@ -145,3 +109,64 @@ func (useCase *CallForUserUseCase) publishErrorEvent( } return wrappedError } + +func (useCase *CallForUserUseCase) performCallForUser( + bitcoinTx string, + valueToSend *entities.Wei, + peginQuote *quote.PeginQuote, + retainedQuote quote.RetainedPeginQuote, +) (quote.RetainedPeginQuote, error) { + var quoteState quote.PeginState + var callForUserTx string + var err error + + config := blockchain.NewTransactionConfig(valueToSend, uint64(peginQuote.GasLimit+CallForUserExtraGas), nil) + if callForUserTx, err = useCase.lbc.CallForUser(config, *peginQuote); err != nil { + quoteState = quote.PeginStateCallForUserFailed + } else { + quoteState = quote.PeginStateCallForUserSucceeded + } + + retainedQuote.CallForUserTxHash = callForUserTx + retainedQuote.UserBtcTxHash = bitcoinTx + retainedQuote.State = quoteState + useCase.eventBus.Publish(quote.CallForUserCompletedEvent{ + Event: entities.NewBaseEvent(quote.CallForUserCompletedEventId), + PeginQuote: *peginQuote, + RetainedQuote: retainedQuote, + Error: err, + }) + return retainedQuote, err +} + +func (useCase *CallForUserUseCase) validateBitcoinTx( + ctx context.Context, + bitcoinTx string, + peginQuote *quote.PeginQuote, + retainedQuote quote.RetainedPeginQuote, +) error { + var txInfo blockchain.BitcoinTransactionInformation + var txConfirmations big.Int + var err error + + if txInfo, err = useCase.btc.GetTransactionInfo(bitcoinTx); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) + } + txConfirmations.SetUint64(txInfo.Confirmations) + if txConfirmations.Cmp(big.NewInt(int64(peginQuote.Confirmations))) < 0 { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.NoEnoughConfirmationsError, true) + } + + sentAmount := txInfo.AmountToAddress(retainedQuote.DepositAddress) + if sentAmount.Cmp(peginQuote.Total()) < 0 { + retainedQuote.UserBtcTxHash = bitcoinTx + return useCase.publishErrorEvent( + ctx, + retainedQuote, + *peginQuote, + fmt.Errorf("insufficient amount %v < %v", sentAmount, peginQuote.Total()), + false, + ) + } + return nil +} diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index a0ef6a1e..ea30ef39 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -7,7 +7,6 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" - "math/rand" "time" ) @@ -75,14 +74,12 @@ type GetPeginQuoteResult struct { func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) (GetPeginQuoteResult, error) { var daoTxAmounts usecases.DaoAmounts + var peginQuote quote.PeginQuote var fedAddress, hash string - var daoFeePercentage uint64 var errorArgs usecases.ErrorArgs var err error var gasPrice, estimatedCallGas *entities.Wei - minLockTxValueInSatoshi := new(entities.Wei) - if errorArgs, err = useCase.validateRequest(request); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, err, errorArgs) } @@ -96,11 +93,8 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } - if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { - return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) - } - if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { - return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + if daoTxAmounts, err = useCase.buildDaoAmounts(ctx, request); err != nil { + return GetPeginQuoteResult{}, err } if fedAddress, err = useCase.bridge.GetFedAddress(); err != nil { @@ -108,56 +102,27 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( } totalGas := new(entities.Wei).Add(estimatedCallGas, daoTxAmounts.DaoGasAmount) - gasFee := new(entities.Wei).Mul(totalGas, gasPrice) - peginQuote := quote.PeginQuote{ - FedBtcAddress: fedAddress, - LbcAddress: useCase.lbc.GetAddress(), - LpRskAddress: useCase.lp.RskAddress(), - BtcRefundAddress: request.bitcoinRefundAddress, - RskRefundAddress: request.rskRefundAddress, - LpBtcAddress: useCase.lp.BtcAddress(), - CallFee: useCase.peginLp.CallFeePegin(), - PenaltyFee: useCase.peginLp.PenaltyFeePegin(), - ContractAddress: request.callEoaOrContractAddress, - Data: hex.EncodeToString(request.callContractArguments), - GasLimit: uint32(totalGas.Uint64()), - Nonce: int64(rand.Int()), - Value: request.valueToTransfer, - AgreementTimestamp: uint32(time.Now().Unix()), - TimeForDeposit: useCase.peginLp.TimeForDepositPegin(), - LpCallTime: useCase.peginLp.CallTime(), - Confirmations: useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer), - CallOnRegister: false, - GasFee: gasFee, - ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), - } - - if err = entities.ValidateStruct(peginQuote); err != nil { - return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + fees := quote.Fees{ + CallFee: useCase.peginLp.CallFeePegin(), + GasFee: new(entities.Wei).Mul(totalGas, gasPrice), + PenaltyFee: useCase.peginLp.PenaltyFeePegin(), + ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), } - - if minLockTxValueInSatoshi, err = useCase.bridge.GetMinimumLockTxValue(); err != nil { - return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + if peginQuote, err = useCase.buildPeginQuote(request, fedAddress, totalGas, fees); err != nil { + return GetPeginQuoteResult{}, err } - minimumInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) - if peginQuote.Total().Cmp(minimumInWei) <= 0 { - errorArgs["minimum"] = minimumInWei.String() - errorArgs["value"] = peginQuote.Total().String() - return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, usecases.TxBelowMinimumError, errorArgs) + if err = usecases.ValidateMinLockValue(usecases.GetPeginQuoteId, useCase.bridge, peginQuote.Total()); err != nil { + return GetPeginQuoteResult{}, err } if hash, err = useCase.lbc.HashPeginQuote(peginQuote); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } - if err = useCase.peginQuoteRepository.InsertQuote(ctx, hash, peginQuote); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } - return GetPeginQuoteResult{ - PeginQuote: peginQuote, - Hash: hash, - }, nil + return GetPeginQuoteResult{PeginQuote: peginQuote, Hash: hash}, nil } func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { @@ -178,3 +143,59 @@ func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases. return nil, nil } } + +func (useCase *GetQuoteUseCase) buildPeginQuote( + request QuoteRequest, + fedAddress string, + totalGas *entities.Wei, + fees quote.Fees, +) (quote.PeginQuote, error) { + var err error + var nonce int64 + + if nonce, err = usecases.GetRandomInt(); err != nil { + return quote.PeginQuote{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + + peginQuote := quote.PeginQuote{ + FedBtcAddress: fedAddress, + LbcAddress: useCase.lbc.GetAddress(), + LpRskAddress: useCase.lp.RskAddress(), + BtcRefundAddress: request.bitcoinRefundAddress, + RskRefundAddress: request.rskRefundAddress, + LpBtcAddress: useCase.lp.BtcAddress(), + CallFee: fees.CallFee, + PenaltyFee: fees.PenaltyFee, + ContractAddress: request.callEoaOrContractAddress, + Data: hex.EncodeToString(request.callContractArguments), + GasLimit: uint32(totalGas.Uint64()), + Nonce: nonce, + Value: request.valueToTransfer, + AgreementTimestamp: uint32(time.Now().Unix()), + TimeForDeposit: useCase.peginLp.TimeForDepositPegin(), + LpCallTime: useCase.peginLp.CallTime(), + Confirmations: useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer), + CallOnRegister: false, + GasFee: fees.GasFee, + ProductFeeAmount: fees.ProductFeeAmount, + } + + if err = entities.ValidateStruct(peginQuote); err != nil { + return quote.PeginQuote{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + return peginQuote, nil +} + +func (useCase *GetQuoteUseCase) buildDaoAmounts(ctx context.Context, request QuoteRequest) (usecases.DaoAmounts, error) { + var daoTxAmounts usecases.DaoAmounts + var daoFeePercentage uint64 + var err error + + if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { + return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) + } + return daoTxAmounts, nil +} diff --git a/internal/usecases/pegin/register_pegin.go b/internal/usecases/pegin/register_pegin.go index dd234f2d..077c7a30 100644 --- a/internal/usecases/pegin/register_pegin.go +++ b/internal/usecases/pegin/register_pegin.go @@ -37,7 +37,6 @@ func NewRegisterPeginUseCase( func (useCase *RegisterPeginUseCase) Run(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { var err error var peginQuote *quote.PeginQuote - var txInfo blockchain.BitcoinTransactionInformation var params blockchain.RegisterPeginParams var newState quote.PeginState var registerPeginTxHash string @@ -52,10 +51,8 @@ func (useCase *RegisterPeginUseCase) Run(ctx context.Context, retainedQuote quot return useCase.publishErrorEvent(ctx, retainedQuote, usecases.QuoteNotFoundError, false) } - if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.UserBtcTxHash); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, err, true) - } else if txInfo.Confirmations < useCase.bridge.GetRequiredTxConfirmations() { - return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) + if err = useCase.validateTransaction(ctx, retainedQuote); err != nil { + return err } if params, err = useCase.buildRegisterPeginParams(*peginQuote, retainedQuote); err != nil { @@ -84,9 +81,8 @@ func (useCase *RegisterPeginUseCase) Run(ctx context.Context, retainedQuote quot if err != nil { err = errors.Join(err, usecases.NonRecoverableError) return usecases.WrapUseCaseErrorArgs(usecases.RegisterPeginId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) - } else { - return nil } + return nil } func (useCase *RegisterPeginUseCase) publishErrorEvent(ctx context.Context, retainedQuote quote.RetainedPeginQuote, err error, recoverable bool) error { @@ -137,3 +133,14 @@ func (useCase *RegisterPeginUseCase) buildRegisterPeginParams(peginQuote quote.P Quote: peginQuote, }, nil } + +func (useCase *RegisterPeginUseCase) validateTransaction(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { + var txInfo blockchain.BitcoinTransactionInformation + var err error + if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.UserBtcTxHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if txInfo.Confirmations < useCase.bridge.GetRequiredTxConfirmations() { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) + } + return nil +} diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go index 69666283..ce7e48df 100644 --- a/internal/usecases/pegout/accept_pegout_quote.go +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -84,19 +84,10 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q State: quote.PegoutStateWaitingForDeposit, } - if err = entities.ValidateStruct(retainedQuote); err != nil { - return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) - } - if err = useCase.quoteRepository.InsertRetainedQuote(ctx, *retainedQuote); err != nil { - return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + if err = useCase.publishQuote(ctx, pegoutQuote, retainedQuote); err != nil { + return quote.AcceptedQuote{}, err } - useCase.eventBus.Publish(quote.AcceptedPegoutQuoteEvent{ - Event: entities.NewBaseEvent(quote.AcceptedPegoutQuoteEventId), - Quote: *pegoutQuote, - RetainedQuote: *retainedQuote, - }) - return quote.AcceptedQuote{ Signature: retainedQuote.Signature, DepositAddress: retainedQuote.DepositAddress, @@ -115,3 +106,24 @@ func (useCase *AcceptQuoteUseCase) calculateAndCheckLiquidity(ctx context.Contex } return requiredLiquidity, nil } + +func (useCase *AcceptQuoteUseCase) publishQuote( + ctx context.Context, + pegoutQuote *quote.PegoutQuote, + retainedQuote *quote.RetainedPegoutQuote, +) error { + var err error + if err = entities.ValidateStruct(retainedQuote); err != nil { + return usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } + if err = useCase.quoteRepository.InsertRetainedQuote(ctx, *retainedQuote); err != nil { + return usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) + } + + useCase.eventBus.Publish(quote.AcceptedPegoutQuoteEvent{ + Event: entities.NewBaseEvent(quote.AcceptedPegoutQuoteEventId), + Quote: *pegoutQuote, + RetainedQuote: *retainedQuote, + }) + return nil +} diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index 46bc0ceb..8cbf707a 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -6,7 +6,6 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" - "math/rand" "strings" "time" ) @@ -74,7 +73,7 @@ type GetPegoutQuoteResult struct { } func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) (GetPegoutQuoteResult, error) { - var daoFeePercentage, blockNumber uint64 + var pegoutQuote quote.PegoutQuote var daoTxAmounts usecases.DaoAmounts var hash string var errorArgs usecases.ErrorArgs @@ -82,8 +81,6 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( var err error gasFeeDao := new(entities.Wei) - minLockTxValueInSatoshi := new(entities.Wei) - if errorArgs, err = useCase.validateRequest(request); err != nil { return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, err, errorArgs) } @@ -94,24 +91,68 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } - if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + if daoTxAmounts, err = useCase.buildDaoAmounts(ctx, request); err != nil { + return GetPegoutQuoteResult{}, err } - if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } - if blockNumber, err = useCase.rsk.GetHeight(ctx); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + gasFeeDao.Mul(daoTxAmounts.DaoGasAmount, gasPrice) + fees := quote.Fees{ + CallFee: useCase.pegoutLp.CallFeePegout(), + GasFee: new(entities.Wei).Add(feeInWei, gasFeeDao), + PenaltyFee: useCase.pegoutLp.PenaltyFeePegout(), + ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), + } + if pegoutQuote, err = useCase.buildPegoutQuote(ctx, request, fees); err != nil { + return GetPegoutQuoteResult{}, err } - if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + if err = usecases.ValidateMinLockValue(usecases.GetPegoutQuoteId, useCase.bridge, pegoutQuote.Total()); err != nil { + return GetPegoutQuoteResult{}, err + } + + if hash, err = useCase.persistQuote(ctx, pegoutQuote); err != nil { + return GetPegoutQuoteResult{}, err + } + + return GetPegoutQuoteResult{PegoutQuote: pegoutQuote, Hash: hash}, nil +} + +func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { + var err error + errorArgs := usecases.NewErrorArgs() + if !blockchain.IsLegacyBtcAddress(request.to) { + errorArgs["btcAddress"] = request.to + return errorArgs, usecases.BtcAddressNotSupportedError + } else if !blockchain.IsLegacyBtcAddress(request.bitcoinRefundAddress) { + errorArgs["btcAddress"] = request.bitcoinRefundAddress + return errorArgs, usecases.BtcAddressNotSupportedError + } else if !blockchain.IsRskAddress(request.rskRefundAddress) { + errorArgs["rskAddress"] = request.rskRefundAddress + return errorArgs, usecases.RskAddressNotSupportedError + } else if err = useCase.pegoutLp.ValidateAmountForPegout(request.valueToTransfer); err != nil { + return errorArgs, err + } else { + return nil, nil + } +} + +func (useCase *GetQuoteUseCase) buildPegoutQuote(ctx context.Context, request QuoteRequest, fees quote.Fees) (quote.PegoutQuote, error) { + var err error + var nonce int64 + var blockNumber uint64 + + if nonce, err = usecases.GetRandomInt(); err != nil { + return quote.PegoutQuote{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + } + + if blockNumber, err = useCase.rsk.GetHeight(ctx); err != nil { + return quote.PegoutQuote{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } - gasFeeDao.Mul(daoTxAmounts.DaoGasAmount, gasPrice) - totalGasFee := new(entities.Wei).Add(feeInWei, gasFeeDao) now := uint32(time.Now().Unix()) confirmationsForUserTx := useCase.lp.GetRootstockConfirmationsForValue(request.valueToTransfer) confirmationsForLpTx := useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer) @@ -121,9 +162,9 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( BtcRefundAddress: request.bitcoinRefundAddress, RskRefundAddress: request.rskRefundAddress, LpBtcAddress: useCase.lp.BtcAddress(), - CallFee: useCase.pegoutLp.CallFeePegout(), - PenaltyFee: useCase.pegoutLp.PenaltyFeePegout().Uint64(), - Nonce: int64(rand.Int()), + CallFee: fees.CallFee, + PenaltyFee: fees.PenaltyFee.Uint64(), + Nonce: nonce, DepositAddress: request.to, Value: request.valueToTransfer, AgreementTimestamp: now, @@ -133,52 +174,38 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( TransferTime: useCase.pegoutLp.TimeForDepositPegout(), ExpireDate: now + useCase.pegoutLp.TimeForDepositPegout(), ExpireBlock: uint32(blockNumber + useCase.pegoutLp.ExpireBlocksPegout()), - GasFee: totalGasFee, - ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), + GasFee: fees.GasFee, + ProductFeeAmount: fees.ProductFeeAmount, } if err = entities.ValidateStruct(pegoutQuote); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + return quote.PegoutQuote{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } + return pegoutQuote, nil +} - if minLockTxValueInSatoshi, err = useCase.bridge.GetMinimumLockTxValue(); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) +func (useCase *GetQuoteUseCase) buildDaoAmounts(ctx context.Context, request QuoteRequest) (usecases.DaoAmounts, error) { + var daoTxAmounts usecases.DaoAmounts + var daoFeePercentage uint64 + var err error + if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { + return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } - minimumInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) - if pegoutQuote.Total().Cmp(minimumInWei) <= 0 { - errorArgs["minimum"] = minimumInWei.String() - errorArgs["value"] = pegoutQuote.Total().String() - return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, usecases.TxBelowMinimumError, errorArgs) + if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } + return daoTxAmounts, nil +} +func (useCase *GetQuoteUseCase) persistQuote(ctx context.Context, pegoutQuote quote.PegoutQuote) (string, error) { + var hash string + var err error if hash, err = useCase.lbc.HashPegoutQuote(pegoutQuote); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) + return "", usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } if err = useCase.pegoutQuoteRepository.InsertQuote(ctx, hash, pegoutQuote); err != nil { - return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) - } - return GetPegoutQuoteResult{ - PegoutQuote: pegoutQuote, - Hash: hash, - }, nil -} - -func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { - var err error - errorArgs := usecases.NewErrorArgs() - if !blockchain.IsLegacyBtcAddress(request.to) { - errorArgs["btcAddress"] = request.to - return errorArgs, usecases.BtcAddressNotSupportedError - } else if !blockchain.IsLegacyBtcAddress(request.bitcoinRefundAddress) { - errorArgs["btcAddress"] = request.bitcoinRefundAddress - return errorArgs, usecases.BtcAddressNotSupportedError - } else if !blockchain.IsRskAddress(request.rskRefundAddress) { - errorArgs["rskAddress"] = request.rskRefundAddress - return errorArgs, usecases.RskAddressNotSupportedError - } else if err = useCase.pegoutLp.ValidateAmountForPegout(request.valueToTransfer); err != nil { - return errorArgs, err - } else { - return nil, nil + return "", usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } + return hash, nil } diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go index 2b1112a9..81b72194 100644 --- a/internal/usecases/pegout/refund_pegout.go +++ b/internal/usecases/pegout/refund_pegout.go @@ -51,11 +51,8 @@ func NewRefundPegoutUseCase( } func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { - var txInfo blockchain.BitcoinTransactionInformation var params blockchain.RefundPegoutParams var pegoutQuote *quote.PegoutQuote - var newState quote.PegoutState - var refundPegoutTxHash string var err error if retainedQuote.State != quote.PegoutStateSendPegoutSucceeded { @@ -68,10 +65,8 @@ func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote return useCase.publishErrorEvent(ctx, retainedQuote, usecases.QuoteNotFoundError, false) } - if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.LpBtcTxHash); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, err, true) - } else if txInfo.Confirmations < uint64(pegoutQuote.TransferConfirmations) { - return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) + if err = useCase.validateBtcTransaction(ctx, *pegoutQuote, retainedQuote); err != nil { + return err } if params, err = useCase.buildRefundPegoutParams(retainedQuote); err != nil { @@ -82,22 +77,10 @@ func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote useCase.rskWalletMutex.Lock() defer useCase.rskWalletMutex.Unlock() - if refundPegoutTxHash, err = useCase.lbc.RefundPegout(txConfig, params); errors.Is(err, blockchain.WaitingForBridgeError) { - return useCase.publishErrorEvent(ctx, retainedQuote, err, true) - } else if err != nil { - newState = quote.PegoutStateRefundPegOutFailed - } else { - newState = quote.PegoutStateRefundPegOutSucceeded + if err = useCase.performRefundPegout(ctx, retainedQuote, txConfig, params); err != nil { + return err } - retainedQuote.State = newState - retainedQuote.RefundPegoutTxHash = refundPegoutTxHash - useCase.eventBus.Publish(quote.PegoutQuoteCompletedEvent{ - Event: entities.NewBaseEvent(quote.PegoutQuoteCompletedEventId), - RetainedQuote: retainedQuote, - Error: err, - }) - if _, sendRbtcError := useCase.sendRbtcToBridge(ctx, *pegoutQuote); err != nil { err = errors.Join(err, sendRbtcError) } else if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { @@ -106,9 +89,8 @@ func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote if err != nil { return usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) - } else { - return nil } + return nil } func (useCase *RefundPegoutUseCase) publishErrorEvent(ctx context.Context, retainedQuote quote.RetainedPegoutQuote, err error, recoverable bool) error { @@ -174,3 +156,46 @@ func (useCase *RefundPegoutUseCase) sendRbtcToBridge(ctx context.Context, pegout log.Debugf("%s: transaction sent to the bridge successfully (%s)\n", usecases.RefundPegoutId, txHash) return txHash, nil } + +func (useCase *RefundPegoutUseCase) performRefundPegout( + ctx context.Context, + retainedQuote quote.RetainedPegoutQuote, + txConfig blockchain.TransactionConfig, + params blockchain.RefundPegoutParams, +) error { + var newState quote.PegoutState + var refundPegoutTxHash string + var err error + + if refundPegoutTxHash, err = useCase.lbc.RefundPegout(txConfig, params); errors.Is(err, blockchain.WaitingForBridgeError) { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if err != nil { + newState = quote.PegoutStateRefundPegOutFailed + } else { + newState = quote.PegoutStateRefundPegOutSucceeded + } + + retainedQuote.State = newState + retainedQuote.RefundPegoutTxHash = refundPegoutTxHash + useCase.eventBus.Publish(quote.PegoutQuoteCompletedEvent{ + Event: entities.NewBaseEvent(quote.PegoutQuoteCompletedEventId), + RetainedQuote: retainedQuote, + Error: err, + }) + return nil +} + +func (useCase *RefundPegoutUseCase) validateBtcTransaction( + ctx context.Context, + pegoutQuote quote.PegoutQuote, + retainedQuote quote.RetainedPegoutQuote, +) error { + var txInfo blockchain.BitcoinTransactionInformation + var err error + if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.LpBtcTxHash); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + } else if txInfo.Confirmations < uint64(pegoutQuote.TransferConfirmations) { + return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) + } + return nil +} diff --git a/internal/usecases/pegout/send_pegout.go b/internal/usecases/pegout/send_pegout.go index 248ca6d0..28023181 100644 --- a/internal/usecases/pegout/send_pegout.go +++ b/internal/usecases/pegout/send_pegout.go @@ -41,12 +41,7 @@ func NewSendPegoutUseCase( func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { var err error var pegoutQuote *quote.PegoutQuote - var chainHeight uint64 var receipt blockchain.TransactionReceipt - var txHash string - var newState quote.PegoutState - - balance := new(entities.Wei) if retainedQuote.State != quote.PegoutStateWaitingForDepositConfirmations { return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.WrongStateError, true) @@ -60,6 +55,62 @@ func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.R return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.QuoteNotFoundError, false) } + if err = useCase.validateQuote(ctx, retainedQuote, pegoutQuote); err != nil { + return err + } + + useCase.btcWalletMutex.Lock() + defer useCase.btcWalletMutex.Unlock() + + if err = useCase.validateBalance(ctx, retainedQuote, pegoutQuote); err != nil { + return err + } + + if retainedQuote, err = useCase.performSendPegout(ctx, retainedQuote, pegoutQuote, receipt); err != nil { + return err + } + + if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { + err = errors.Join(err, updateError) + } + if err != nil { + return usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + } + return nil +} + +func (useCase *SendPegoutUseCase) publishErrorEvent( + ctx context.Context, + retainedQuote quote.RetainedPegoutQuote, + pegoutQuote quote.PegoutQuote, + err error, + recoverable bool, +) error { + wrappedError := usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + if !recoverable { + if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + wrappedError = errors.Join(wrappedError, err) + } + retainedQuote.State = quote.PegoutStateSendPegoutFailed + useCase.eventBus.Publish(quote.PegoutBtcSentToUserEvent{ + Event: entities.NewBaseEvent(quote.PegoutBtcSentEventId), + PegoutQuote: pegoutQuote, + RetainedQuote: retainedQuote, + Error: wrappedError, + }) + } + return wrappedError +} + +func (useCase *SendPegoutUseCase) validateQuote( + ctx context.Context, + retainedQuote quote.RetainedPegoutQuote, + pegoutQuote *quote.PegoutQuote, +) error { + var err error + var chainHeight uint64 + var receipt blockchain.TransactionReceipt + if pegoutQuote.IsExpired() { return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) } @@ -76,20 +127,23 @@ func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.R retainedQuote.UserRskTxHash = receipt.TransactionHash return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.InsufficientAmountError, false) } + return nil +} - useCase.btcWalletMutex.Lock() - defer useCase.btcWalletMutex.Unlock() - - if balance, err = useCase.btcWallet.GetBalance(); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) - } else if balance.Cmp(pegoutQuote.Value) < 0 { - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoLiquidityError, true) - } +func (useCase *SendPegoutUseCase) performSendPegout( + ctx context.Context, + retainedQuote quote.RetainedPegoutQuote, + pegoutQuote *quote.PegoutQuote, + receipt blockchain.TransactionReceipt, +) (quote.RetainedPegoutQuote, error) { + var err error + var newState quote.PegoutState + var txHash string quoteHashBytes, err := hex.DecodeString(retainedQuote.QuoteHash) if err != nil { retainedQuote.UserRskTxHash = receipt.TransactionHash - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, false) + return quote.RetainedPegoutQuote{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, false) } if txHash, err = useCase.btcWallet.SendWithOpReturn(pegoutQuote.DepositAddress, pegoutQuote.Value, quoteHashBytes); err != nil { @@ -106,36 +160,21 @@ func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.R RetainedQuote: retainedQuote, Error: err, }) - - if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { - err = errors.Join(err, updateError) - } - if err != nil { - return usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) - } else { - return nil - } + return retainedQuote, nil } -func (useCase *SendPegoutUseCase) publishErrorEvent( +func (useCase *SendPegoutUseCase) validateBalance( ctx context.Context, retainedQuote quote.RetainedPegoutQuote, - pegoutQuote quote.PegoutQuote, - err error, - recoverable bool, + pegoutQuote *quote.PegoutQuote, ) error { - wrappedError := usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) - if !recoverable { - if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { - wrappedError = errors.Join(wrappedError, err) - } - retainedQuote.State = quote.PegoutStateSendPegoutFailed - useCase.eventBus.Publish(quote.PegoutBtcSentToUserEvent{ - Event: entities.NewBaseEvent(quote.PegoutBtcSentEventId), - PegoutQuote: pegoutQuote, - RetainedQuote: retainedQuote, - Error: wrappedError, - }) + var err error + var balance *entities.Wei + + if balance, err = useCase.btcWallet.GetBalance(); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + } else if balance.Cmp(pegoutQuote.Value) < 0 { + return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoLiquidityError, true) } - return wrappedError + return nil } From e310e2375f95c3df892cd7175ce85964cda99802 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 31 Jan 2024 02:17:18 -0300 Subject: [PATCH 007/113] feat: add open api file generation using makefile --- Makefile | 10 +- .../local/OpenAPI.yml => OpenApi.yml | 495 +++++++----------- cmd/application/main.go | 5 + docker-compose/local/lps-env.sh | 6 - .../rest/handlers/accept_pegin_quote.go | 6 + .../rest/handlers/accept_pegout_quote.go | 6 + .../rest/handlers/add_pegin_collateral.go | 6 + .../rest/handlers/add_pegout_collateral.go | 6 + .../rest/handlers/change_status.go | 6 + .../rest/handlers/get_pegin_collateral.go | 5 + .../rest/handlers/get_pegin_quote.go | 6 + .../rest/handlers/get_pegout_collateral.go | 5 + .../rest/handlers/get_pegout_quote.go | 6 + .../rest/handlers/get_providers.go | 5 + .../rest/handlers/get_user_deposits.go | 6 + .../entrypoints/rest/handlers/health.go | 5 + .../rest/handlers/provider_details.go | 5 + .../entrypoints/rest/handlers/resignation.go | 5 + .../handlers/withdraw_pegin_collateral.go | 5 + .../handlers/withdraw_pegout_collateral.go | 5 + 20 files changed, 291 insertions(+), 313 deletions(-) rename docker-compose/local/OpenAPI.yml => OpenApi.yml (74%) diff --git a/Makefile b/Makefile index ea153a21..1c7f511d 100644 --- a/Makefile +++ b/Makefile @@ -16,4 +16,12 @@ validation: lint build: download mkdir -p build && cd build - CGO_ENABLED=0 go build -v -race -installsuffix 'static' -ldflags="-s" -o ./build/liquidity-provider-server ./cmd/application/main.go \ No newline at end of file + CGO_ENABLED=0 go build -v -race -installsuffix 'static' -ldflags="-s" -o ./build/liquidity-provider-server ./cmd/application/main.go + +api: + go-swagger3 --module-path . \ + --main-file-path ./cmd/application/main.go \ + --handler-path ./internal/adapters/entrypoints/rest/handlers \ + --output OpenApi.yml \ + --schema-without-pkg \ + --generate-yaml true diff --git a/docker-compose/local/OpenAPI.yml b/OpenApi.yml similarity index 74% rename from docker-compose/local/OpenAPI.yml rename to OpenApi.yml index f5793d44..e3de88d1 100644 --- a/docker-compose/local/OpenAPI.yml +++ b/OpenApi.yml @@ -1,16 +1,7 @@ components: schemas: "": {} - AcceptReq: - properties: - quoteHash: - description: QuoteHash - example: "0x0" - type: string - required: - - quoteHash - type: object - AcceptRes: + AcceptPeginRespose: properties: bitcoinDepositAddressHash: description: Hash of the deposit BTC address @@ -24,7 +15,7 @@ components: - signature - bitcoinDepositAddressHash type: object - AcceptResPegOut: + AcceptPegoutResponse: properties: lbcAddress: description: LBC address to execute depositPegout function @@ -38,43 +29,45 @@ components: - signature - lbcAddress type: object + AcceptQuoteRequest: + properties: + quoteHash: + description: QuoteHash + example: "0x0" + type: string + required: + - quoteHash + type: object AddCollateralRequest: properties: amount: description: Amount to add to the collateral example: 100000000000 type: integer - lpRskAddress: - description: Liquidity Provider RSK Address - example: "0x0" - type: string + required: + - amount type: object AddCollateralResponse: properties: newCollateralBalance: + description: New Collateral Balance example: 100000000000 type: integer type: object - Address: - items: {} - type: array ChangeStatusRequest: properties: - providerId: - type: integer status: type: boolean type: object - DepositEvent: + DepositEventDTO: properties: amount: description: Event Value example: "10000" from: description: From Address - example: invalid example - items: {} - type: array + example: "0x0" + type: string quoteHash: description: QuoteHash example: "0x0" @@ -89,10 +82,86 @@ components: properties: collateral: type: integer + required: + - collateral + type: object + GetPeginQuoteResponse: + properties: + quote: + $ref: '#/components/schemas/PeginQuoteDTO' + description: Detail of the quote + type: object + quoteHash: + description: This is a 64 digit number that derives from a quote object + type: string + required: + - quote + - quoteHash + type: object + GetPegoutQuoteResponse: + properties: + quote: + $ref: '#/components/schemas/PegoutQuoteDTO' + description: Detail of the quote + type: object + quoteHash: + description: This is a 64 digit number that derives from a quote object + type: string + required: + - quote + - quoteHash + type: object + HealthResponse: + properties: + services: + description: LPS Services Status + example: + btc: ok + db: ok + rsk: ok + type: object + status: + description: Overall LPS Health Status + example: ok + type: string + required: + - status + - services + type: object + LiquidityProvider: + properties: + apiBaseUrl: + description: API base URL + example: https://api.example.com + type: string + id: + description: Provider Id + example: 1 + type: integer + name: + description: Provider Name + example: New Provider + type: string + provider: + description: Provider Address + example: "0x0" + type: string + providerType: + description: Provider type + example: pegin + type: string + status: + description: Provider status + example: true + type: boolean + required: + - id + - provider + - name + - apiBaseUrl + - status + - providerType type: object - Hash: - items: {} - type: array PeginQuoteDTO: properties: agreementTimestamp: @@ -183,6 +252,36 @@ components: - gasFee - productFeeAmount type: object + PeginQuoteRequest: + properties: + bitcoinRefundAddress: + description: 'User Bitcoin refund address. Note: Must be a legacy address, + segwit addresses are not accepted' + example: "0x0" + type: string + callContractArguments: + description: Contract data + example: "0x0" + type: string + callEoaOrContractAddress: + description: Contract address or EOA address + example: "0x0" + type: string + rskRefundAddress: + description: User RSK refund address + example: "0x0" + type: string + valueToTransfer: + description: Value to send in the call + example: 0 + type: integer + required: + - callEoaOrContractAddress + - callContractArguments + - valueToTransfer + - rskRefundAddress + - bitcoinRefundAddress + type: object PegoutQuoteDTO: properties: agreementTimestamp: @@ -248,39 +347,28 @@ components: - gasFee - productFeeAmount type: object - ProviderDTO: + PegoutQuoteRequest: properties: - apiBaseUrl: - description: Provider's LPS instance URL - example: https://api.example.com - type: string - id: - description: Provider id - example: 1 - type: integer - name: - description: Provider name - example: Default Pegin Provider + bitcoinRefundAddress: + description: BitcoinRefundAddress + example: "0x0" type: string - provider: - description: Provider address - example: "0x0000000000000000000000000000000000000000" + rskRefundAddress: + description: RskRefundAddress + example: "0x0" type: string - providerType: - description: Provider Type - example: pegin + to: + description: Bitcoin address that will receive the BTC amount type: string - status: - description: Provider status - example: true - type: boolean + valueToTransfer: + description: ValueToTransfer + example: 10000000000000 + type: integer required: - - id - - provider - - name - - apiBaseUrl - - status - - providerType + - to + - valueToTransfer + - rskRefundAddress + - bitcoinRefundAddress type: object ProviderDetail: properties: @@ -313,179 +401,50 @@ components: - pegin - pegout type: object - ProviderRegisterRequest: - properties: - apiBaseUrl: - description: API base URL - example: https://api.example.com - type: string - name: - description: Provider Name - example: New Provider - type: string - providerType: - description: Provider type must be "pegin", "pegout" or "both" - example: pegin - type: string - status: - description: Provider status - example: true - type: boolean - type: object - ProviderResignRequest: - properties: - lpRskAddress: - type: string - type: object - ProviderStatusChangeStatus: - properties: - Status: - description: Returned Status - example: Provider Updated Successfully - type: string - type: object - QuotePegOutRequest: + Services: properties: - bitcoinRefundAddress: - description: BitcoinRefundAddress - example: "0x0" + btc: type: string - rskRefundAddress: - description: RskRefundAddress - example: "0x0" + db: type: string - to: - description: Bitcoin address that will receive the BTC amount + rsk: type: string - valueToTransfer: - description: ValueToTransfer - example: 10000000000000 - type: integer - required: - - to - - valueToTransfer - - rskRefundAddress - - bitcoinRefundAddress type: object - QuotePegOutResponse: + pkg.AcceptQuoteRequest: properties: - quote: - $ref: '#/components/schemas/PegoutQuoteDTO' - description: Quote - type: object quoteHash: description: QuoteHash example: "0x0" type: string required: - - quote - quoteHash type: object - QuoteRequest: + pkg.AddCollateralRequest: properties: - bitcoinRefundAddress: - description: 'User Bitcoin refund address. Note: Must be a legacy address, - segwit addresses are not accepted' - example: "0x0" - type: string - callContractArguments: - description: Contract data - example: "0x0" - type: string - callEoaOrContractAddress: - description: Contract address or EOA address - example: "0x0" - type: string - rskRefundAddress: - description: User RSK refund address - example: "0x0" - type: string - valueToTransfer: - description: Value to send in the call - example: 0 + amount: + description: Amount to add to the collateral + example: 100000000000 type: integer required: - - callEoaOrContractAddress - - callContractArguments - - valueToTransfer - - rskRefundAddress - - bitcoinRefundAddress - type: object - QuoteReturn: - properties: - quote: - $ref: '#/components/schemas/PeginQuoteDTO' - description: Detail of the quote - type: object - quoteHash: - description: This is a 64 digit number that derives from a quote object - type: string - required: - - quote - - quoteHash - type: object - RegistrationStatus: - properties: - Status: - description: Returned Status - example: Provider Created Successfully - type: string - type: object - WithdrawCollateralRequest: - properties: - lpRskAddress: - type: string - type: object - healthRes: - properties: - services: - description: LPS Services Status - example: - btc: ok - db: ok - rsk: ok - type: object - status: - description: Overall LPS Health Status - example: ok - type: string + - amount type: object - services: + pkg.AddCollateralResponse: properties: - btc: - type: string - db: - type: string - rsk: - type: string + newCollateralBalance: + description: New Collateral Balance + example: 100000000000 + type: integer type: object - types.ProviderRegisterRequest: + pkg.GetCollateralResponse: properties: - apiBaseUrl: - description: API base URL - example: https://api.example.com - type: string - name: - description: Provider Name - example: New Provider - type: string - providerType: - description: Provider type must be "pegin", "pegout" or "both" - example: pegin - type: string - status: - description: Provider status - example: true - type: boolean + collateral: + type: integer + required: + - collateral type: object - securitySchemes: - AuthorizationHeader: - description: Input your token - scheme: bearer - type: http info: title: Liquidity Provider Server - version: "0.5" + version: 1.2.1 openapi: 3.0.0 paths: /getProviders: @@ -496,7 +455,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ProviderDTO' + $ref: '#/components/schemas/LiquidityProvider' description: "" summary: Get Providers /health: @@ -507,7 +466,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/healthRes' + $ref: '#/components/schemas/HealthResponse' description: "" summary: Health /pegin/acceptQuote: @@ -517,14 +476,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/AcceptReq' + $ref: '#/components/schemas/AcceptQuoteRequest' required: true responses: "200": content: application/json: schema: - $ref: '#/components/schemas/AcceptRes' + $ref: '#/components/schemas/AcceptPeginRespose' description: "" summary: Accept Quote /pegin/addCollateral: @@ -544,18 +503,9 @@ paths: $ref: '#/components/schemas/AddCollateralResponse' description: "" summary: Add PegIn Collateral - /pegin/collateral/{address}: + /pegin/collateral: get: description: ' Get PegIn Collateral' - parameters: - - description: Liquidity provider address - in: path - name: address - required: true - schema: - description: Liquidity provider address - format: string - type: string responses: "200": content: @@ -571,25 +521,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/QuoteRequest' + $ref: '#/components/schemas/PeginQuoteRequest' required: true responses: "200": content: application/json: schema: - $ref: '#/components/schemas/QuoteReturn' + $ref: '#/components/schemas/GetPeginQuoteResponse' description: "" summary: Pegin GetQuote /pegin/withdrawCollateral: post: description: ' Withdraw PegIn collateral of a resigned LP' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/WithdrawCollateralRequest' - required: true responses: "204": description: "" @@ -601,14 +545,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/AcceptReq' + $ref: '#/components/schemas/AcceptQuoteRequest' required: true responses: "200": content: application/json: schema: - $ref: '#/components/schemas/AcceptResPegOut' + $ref: '#/components/schemas/AcceptPegoutResponse' description: "" summary: Accept Quote Pegout /pegout/addCollateral: @@ -628,18 +572,9 @@ paths: $ref: '#/components/schemas/AddCollateralResponse' description: "" summary: Add PegOut Collateral - /pegout/collateral/{address}: + /pegout/collateral: get: description: ' Get PegOut Collateral' - parameters: - - description: Liquidity provider address - in: path - name: address - required: true - schema: - description: Liquidity provider address - format: string - type: string responses: "200": content: @@ -655,25 +590,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/QuotePegOutRequest' + $ref: '#/components/schemas/PegoutQuoteRequest' required: true responses: "200": content: application/json: schema: - $ref: '#/components/schemas/QuotePegOutResponse' + $ref: '#/components/schemas/GetPegoutQuoteResponse' description: "" summary: Pegout GetQuote /pegout/withdrawCollateral: post: description: ' Withdraw PegOut collateral of a resigned LP' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/WithdrawCollateralRequest' - required: true responses: "204": description: "" @@ -688,67 +617,16 @@ paths: $ref: '#/components/schemas/ChangeStatusRequest' required: true responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/ProviderStatusChangeStatus' + "204": description: "" summary: Change Provider Status - /provider/pegin/register: - post: - description: ' Registers New Pegin Provider' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ProviderRegisterRequest' - required: true - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/RegistrationStatus' - description: "" - summary: Register Pegin Provider - /provider/pegout/register: - post: - description: ' Registers New Pegout Provider' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ProviderRegisterRequest' - required: true - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/RegistrationStatus' - description: "" - summary: Register Pegout Provider /provider/resignation: post: description: ' Provider stops being a liquidity provider' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ProviderResignRequest' - required: true responses: "204": description: "" summary: Provider resignation - /provider/sync: - post: - description: ' Synchronizes providers with MongoDB' - responses: - "204": - description: "" - summary: Provider Synchronization /providers/details: get: description: ' Returns the details of the provider that manages this instance @@ -764,20 +642,25 @@ paths: /userQuotes: get: description: ' Returns user quotes for address.' + parameters: + - description: User Quote Request Details + in: query + name: address + required: true + schema: + description: User Quote Request Details + format: string + type: string responses: "200": content: application/json: schema: - $ref: '#/components/schemas/DepositEvent' + $ref: '#/components/schemas/DepositEventDTO' description: Successfully retrieved the user quotes summary: GetUserQuotes -security: -- AuthorizationHeader: - - read - - write servers: - description: ' Testnet' - url: https://flyover-lps.testnet.rsk.co + url: https://lps.testnet.flyover.rif.technology - description: ' Mainnet' - url: https://flyover-lps.mainnet.rifcomputing.net + url: https://lps.flyover.rif.technology diff --git a/cmd/application/main.go b/cmd/application/main.go index cc9f70d7..969c287b 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -11,6 +11,11 @@ import ( "time" ) +// @Version 1.2.1 +// @Title Liquidity Provider Server +// @Server https://lps.testnet.flyover.rif.technology Testnet +// @Server https://lps.flyover.rif.technology Mainnet + const bootstrapTimeout = 10 * time.Second func main() { diff --git a/docker-compose/local/lps-env.sh b/docker-compose/local/lps-env.sh index 1af3845f..4898d038 100755 --- a/docker-compose/local/lps-env.sh +++ b/docker-compose/local/lps-env.sh @@ -25,12 +25,6 @@ fi echo "LPS_STAGE: $LPS_STAGE; ENV_FILE: $ENV_FILE; LPS_UID: $LPS_UID" -go install github.com/parvez3019/go-swagger3@latest -export PATH="$HOME/go/bin:$PATH" - -echo "Compiling LPS with OpenAPI Specifications" -go-swagger3 --module-path ../../ --output OpenAPI.json --schema-without-pkg --generate-yaml true --mainfile-path ../../main.go --handler-path ../../http/server.go - SCRIPT_CMD=$1 if [ -z "${SCRIPT_CMD}" ]; then diff --git a/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go b/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go index 09a8519c..e74306fc 100644 --- a/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/accept_pegin_quote.go @@ -9,6 +9,12 @@ import ( "net/http" ) +// NewAcceptPeginQuoteHandler +// @Title Accept Quote +// @Description Accepts Quote +// @Param QuoteHash body pkg.AcceptQuoteRequest true "Quote Hash" +// @Success 200 object pkg.AcceptPeginRespose Interface that represents that the quote has been successfully accepted +// @Route /pegin/acceptQuote [post] func NewAcceptPeginQuoteHandler(useCase *pegin.AcceptQuoteUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go b/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go index 7059d7ce..d62c77b7 100644 --- a/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/accept_pegout_quote.go @@ -9,6 +9,12 @@ import ( "net/http" ) +// NewAcceptPegoutQuoteHandler +// @Title Accept Quote Pegout +// @Description Accepts Quote Pegout +// @Param QuoteHash body pkg.AcceptQuoteRequest true "Quote Hash" +// @Success 200 object pkg.AcceptPegoutResponse +// @Route /pegout/acceptQuote [post] func NewAcceptPegoutQuoteHandler(useCase *pegout.AcceptQuoteUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go b/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go index 70608fb2..f640733e 100644 --- a/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go +++ b/internal/adapters/entrypoints/rest/handlers/add_pegin_collateral.go @@ -10,6 +10,12 @@ import ( "net/http" ) +// NewAddPeginCollateralHandler +// @Title Add PegIn Collateral +// @Description Adds PegIn Collateral +// @Param AddCollateralRequest body pkg.AddCollateralRequest true "Add Collateral Request" +// @Success 200 object pkg.AddCollateralResponse +// @Route /pegin/addCollateral [post] func NewAddPeginCollateralHandler(useCase *pegin.AddCollateralUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go b/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go index 3c5c634e..25e97bed 100644 --- a/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go +++ b/internal/adapters/entrypoints/rest/handlers/add_pegout_collateral.go @@ -10,6 +10,12 @@ import ( "net/http" ) +// NewAddPegoutCollateralHandler +// @Title Add PegOut Collateral +// @Description Adds PegOut Collateral +// @Param AddCollateralRequest body pkg.AddCollateralRequest true "Add Collateral Request" +// @Success 200 object pkg.AddCollateralResponse +// @Route /pegout/addCollateral [post] func NewAddPegoutCollateralHandler(useCase *pegout.AddCollateralUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/change_status.go b/internal/adapters/entrypoints/rest/handlers/change_status.go index 92a7a873..07e4891e 100644 --- a/internal/adapters/entrypoints/rest/handlers/change_status.go +++ b/internal/adapters/entrypoints/rest/handlers/change_status.go @@ -7,6 +7,12 @@ import ( "net/http" ) +// NewChangeStatusHandler +// @Title Change Provider Status +// @Description Changes the status of the provider +// @Param ChangeStatusRequest body pkg.ChangeStatusRequest true "Change Provider Status Request" +// @Success 204 object +// @Route /provider/changeStatus [post] func NewChangeStatusHandler(useCase *liquidity_provider.ChangeStatusUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go b/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go index 60754261..62125bb2 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegin_collateral.go @@ -7,6 +7,11 @@ import ( "net/http" ) +// NewGetPeginCollateralHandler +// @Title Get PegIn Collateral +// @Description Get PegIn Collateral +// @Success 200 object pkg.GetCollateralResponse +// @Route /pegin/collateral [get] func NewGetPeginCollateralHandler(useCase *pegin.GetCollateralUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { collateral, err := useCase.Run() diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go index be8b925c..4c3915dd 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go @@ -11,6 +11,12 @@ import ( "net/http" ) +// NewGetPeginQuoteHandler +// @Title Pegin GetQuote +// @Description Gets Pegin Quote +// @Param PeginQuoteRequest body pkg.PeginQuoteRequest true "Interface with parameters for computing possible quotes for the service" +// @Success 200 array pkg.GetPeginQuoteResponse The quote structure defines the conditions of a service, and acts as a contract between users and LPs +// @Route /pegin/getQuote [post] func NewGetPeginQuoteHandler(useCase *pegin.GetQuoteUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go b/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go index ec547d60..e62badcc 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegout_collateral.go @@ -7,6 +7,11 @@ import ( "net/http" ) +// NewGetPegoutCollateralHandler +// @Title Get PegOut Collateral +// @Description Get PegOut Collateral +// @Success 200 object pkg.GetCollateralResponse +// @Route /pegout/collateral [get] func NewGetPegoutCollateralHandler(useCase *pegout.GetCollateralUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { collateral, err := useCase.Run() diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go index 88fe708c..de48a61f 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go @@ -10,6 +10,12 @@ import ( "net/http" ) +// NewGetPegoutQuoteHandler +// @Title Pegout GetQuote +// @Description Gets Pegout Quote +// @Param PegoutQuoteRequest body pkg.PegoutQuoteRequest true "Interface with parameters for computing possible quotes for the service" +// @Success 200 array pkg.GetPegoutQuoteResponse The quote structure defines the conditions of a service, and acts as a contract between users and LPs +// @Route /pegout/getQuotes [post] func NewGetPegoutQuoteHandler(useCase *pegout.GetQuoteUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { var err error diff --git a/internal/adapters/entrypoints/rest/handlers/get_providers.go b/internal/adapters/entrypoints/rest/handlers/get_providers.go index fcc5bd55..631e80ea 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_providers.go +++ b/internal/adapters/entrypoints/rest/handlers/get_providers.go @@ -7,6 +7,11 @@ import ( "net/http" ) +// NewGetProvidersHandler +// @Title Get Providers +// @Description Returns a list of providers. +// @Success 200 array pkg.LiquidityProvider +// @Route /getProviders [get] func NewGetProvidersHandler(useCase *liquidity_provider.GetProvidersUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { providers, err := useCase.Run() diff --git a/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go b/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go index dc46ef28..ffd8a9a9 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go +++ b/internal/adapters/entrypoints/rest/handlers/get_user_deposits.go @@ -7,6 +7,12 @@ import ( "net/http" ) +// NewGetUserQuotesHandler +// @Title GetUserQuotes +// @Description Returns user quotes for address. +// @Param address query string true "User Quote Request Details" +// @Success 200 {array} pkg.DepositEventDTO "Successfully retrieved the user quotes" +// @Router /userQuotes [get] func NewGetUserQuotesHandler(useCase *pegout.GetUserDepositsUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { address := req.URL.Query().Get("address") diff --git a/internal/adapters/entrypoints/rest/handlers/health.go b/internal/adapters/entrypoints/rest/handlers/health.go index dc35dcc4..2eabd4a7 100644 --- a/internal/adapters/entrypoints/rest/handlers/health.go +++ b/internal/adapters/entrypoints/rest/handlers/health.go @@ -7,6 +7,11 @@ import ( "net/http" ) +// NewHealthCheckHandler +// @Title Health +// @Description Returns server health. +// @Success 200 object pkg.HealthResponse +// @Route /health [get] func NewHealthCheckHandler(useCase *usecases.HealthUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { result := useCase.Run(req.Context()) diff --git a/internal/adapters/entrypoints/rest/handlers/provider_details.go b/internal/adapters/entrypoints/rest/handlers/provider_details.go index 65ca885c..64119630 100644 --- a/internal/adapters/entrypoints/rest/handlers/provider_details.go +++ b/internal/adapters/entrypoints/rest/handlers/provider_details.go @@ -7,6 +7,11 @@ import ( "net/http" ) +// NewProviderDetailsHandler +// @Title Provider detail +// @Description Returns the details of the provider that manages this instance of LPS +// @Success 200 object pkg.ProviderDetailResponse "Detail of the provider that manges this instance" +// @Route /providers/details [get] func NewProviderDetailsHandler(useCase *liquidity_provider.GetDetailUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { result, err := useCase.Run() diff --git a/internal/adapters/entrypoints/rest/handlers/resignation.go b/internal/adapters/entrypoints/rest/handlers/resignation.go index 1f42c89b..cc9dde11 100644 --- a/internal/adapters/entrypoints/rest/handlers/resignation.go +++ b/internal/adapters/entrypoints/rest/handlers/resignation.go @@ -6,6 +6,11 @@ import ( "net/http" ) +// NewResignationHandler +// @Title Provider resignation +// @Description Provider stops being a liquidity provider +// @Route /provider/resignation [post] +// @Success 204 object func NewResignationHandler(useCase *liquidity_provider.ResignUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { err := useCase.Run() diff --git a/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go b/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go index 0b01e648..a1ad81a7 100644 --- a/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go +++ b/internal/adapters/entrypoints/rest/handlers/withdraw_pegin_collateral.go @@ -8,6 +8,11 @@ import ( "net/http" ) +// NewWithdrawPeginCollateralHandler +// @Title Withdraw PegIn Collateral +// @Description Withdraw PegIn collateral of a resigned LP +// @Route /pegin/withdrawCollateral [post] +// @Success 204 object func NewWithdrawPeginCollateralHandler(useCase *pegin.WithdrawCollateralUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { err := useCase.Run() diff --git a/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go b/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go index 4783cfba..d7ddadec 100644 --- a/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go +++ b/internal/adapters/entrypoints/rest/handlers/withdraw_pegout_collateral.go @@ -8,6 +8,11 @@ import ( "net/http" ) +// NewWithdrawPegoutCollateralHandler +// @Title Withdraw PegOut Collateral +// @Description Withdraw PegOut collateral of a resigned LP +// @Route /pegout/withdrawCollateral [post] +// @Success 204 object func NewWithdrawPegoutCollateralHandler(useCase *pegout.WithdrawCollateralUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { err := useCase.Run() From 998ee8699af9c0124e62504eafa9be23a28ceecf Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 31 Jan 2024 21:12:24 -0300 Subject: [PATCH 008/113] ci: add multi stage build to lps Dockerfile --- Makefile | 2 +- docker-compose/docker-compose.yml | 2 +- docker-compose/lbc-deployer/Dockerfile | 3 +++ .../local/docker-compose.lbc-deployer.yml | 1 + docker-compose/local/docker-compose.lps.yml | 2 +- docker-compose/local/lps-env.sh | 2 +- docker-compose/lps/Dockerfile | 18 +++++++++++------- docker-compose/lps/start.sh | 15 --------------- docker-compose/mainnet/docker-compose.yml | 2 +- 9 files changed, 20 insertions(+), 27 deletions(-) delete mode 100644 docker-compose/lps/start.sh diff --git a/Makefile b/Makefile index 1c7f511d..431e6212 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ validation: lint build: download mkdir -p build && cd build - CGO_ENABLED=0 go build -v -race -installsuffix 'static' -ldflags="-s" -o ./build/liquidity-provider-server ./cmd/application/main.go + CGO_ENABLED=0 go build -v -installsuffix 'static' -ldflags="-s" -o ./build/liquidity-provider-server ./cmd/application/main.go api: go-swagger3 --module-path . \ diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 8fb407eb..bec3cd67 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -122,7 +122,7 @@ services: networks: - net_lps - command: ["sh", "start.sh"] + command: ["liquidity-provider-server"] lbc-deployer: build: diff --git a/docker-compose/lbc-deployer/Dockerfile b/docker-compose/lbc-deployer/Dockerfile index 44724d7b..6b0495e4 100644 --- a/docker-compose/lbc-deployer/Dockerfile +++ b/docker-compose/lbc-deployer/Dockerfile @@ -1,5 +1,6 @@ FROM --platform=linux/amd64 node:16 +ARG GITHUB_TOKEN RUN apt-get update -y && apt-get install -qq --no-install-recommends jq RUN npm install -g truffle @@ -20,6 +21,8 @@ COPY --chown=node truffle-config.patch ./ RUN git apply truffle-config.patch +RUN echo "//npm.pkg.github.com/:_authToken=$GITHUB_TOKEN" >> .npmrc + RUN npm ci RUN npx truffle compile diff --git a/docker-compose/local/docker-compose.lbc-deployer.yml b/docker-compose/local/docker-compose.lbc-deployer.yml index 14edb802..25af7431 100644 --- a/docker-compose/local/docker-compose.lbc-deployer.yml +++ b/docker-compose/local/docker-compose.lbc-deployer.yml @@ -5,6 +5,7 @@ services: context: ../lbc-deployer args: LBC_GIT_BRANCH: "${LBC_GIT_BRANCH:-QA-Test}" + GITHUB_TOKEN: "${GITHUB_TOKEN}" image: lbc-deployer:latest container_name: lbc-deployer01 environment: diff --git a/docker-compose/local/docker-compose.lps.yml b/docker-compose/local/docker-compose.lps.yml index 30dcb756..f74ec1eb 100644 --- a/docker-compose/local/docker-compose.lps.yml +++ b/docker-compose/local/docker-compose.lps.yml @@ -73,4 +73,4 @@ services: - ${LPS_HOME:-./volumes/lps/logs}:/home/lps/logs networks: - net_lps - command: ["sh", "start.sh"] + command: ["liquidity-provider-server"] diff --git a/docker-compose/local/lps-env.sh b/docker-compose/local/lps-env.sh index 4898d038..9820b280 100755 --- a/docker-compose/local/lps-env.sh +++ b/docker-compose/local/lps-env.sh @@ -6,7 +6,7 @@ if [ -z "${LPS_STAGE}" ]; then echo "LPS_STAGE is not set. Exit 1" exit 1 elif [ "$LPS_STAGE" = "regtest" ]; then - cp ../../sample.config.env .env.regtest + cp ../../sample-config.env .env.regtest ENV_FILE=".env.regtest" elif [ "$LPS_STAGE" = "testnet" ]; then ENV_FILE=".env.testnet" diff --git a/docker-compose/lps/Dockerfile b/docker-compose/lps/Dockerfile index b4aefb48..53208722 100644 --- a/docker-compose/lps/Dockerfile +++ b/docker-compose/lps/Dockerfile @@ -1,20 +1,24 @@ -FROM --platform=linux/amd64 golang:1.21.6-alpine +ARG GO_VERSION=1.21.6 +ARG ALPINE_VERSION=3.19.1 -RUN apk add git gcc musl-dev curl jq +FROM --platform=linux/amd64 golang:${GO_VERSION} AS builder WORKDIR /code -COPY Makefile go.mod go.sum cmd/ internal/ pkg/ ./ -COPY go.sum ./ +COPY Makefile go.mod go.sum ./ +COPY cmd ./cmd +COPY pkg ./pkg +COPY internal ./internal + RUN make build -RUN mv ./build/liquidity-provider-server /usr/local/bin/liquidity-provider-server +FROM --platform=linux/amd64 alpine:${ALPINE_VERSION} + +COPY --from=builder /code/build/liquidity-provider-server /usr/local/bin/liquidity-provider-server ARG HOME="/home/lps" RUN adduser -u 1000 --home="$HOME" lps -D lps -COPY --chown=lps "docker-compose/lps/start.sh" "$HOME/" - RUN mkdir -p "$HOME/db"; chown 1000 "$HOME/db" RUN mkdir -p "$HOME/logs"; chown 1000 "$HOME/logs" diff --git a/docker-compose/lps/start.sh b/docker-compose/lps/start.sh deleted file mode 100644 index dd48c60d..00000000 --- a/docker-compose/lps/start.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -set -e - -echo "Detected LPS_STAGE: $LPS_STAGE, LBC_ADDR: $LBC_ADDR, BTC_USERNAME: $BTC_USERNAME, RSK_CHAIN_ID: $RSK_CHAIN_ID" - -echo "Testing if we have a default wallet" - -curl -s "http://bitcoind01:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "getwalletinfo", "params": [], "id":"getwallet"}' | grep "{\"result\":null,\"error\":{\"code\":-18" \ - && echo "No default wallet" \ - && echo "Creating wallet" \ - && curl -s "http://bitcoind01:5555" --user "$BTC_USERNAME:$BTC_PASSWORD" -H "Content-Type: application/json" -d '{"jsonrpc": "1.0", "method": "createwallet", "params": ["main", false, false, "test-password", true, false, true], "id":"createwallet"}' - -echo "Starting LP Server..." -liquidity-provider-server diff --git a/docker-compose/mainnet/docker-compose.yml b/docker-compose/mainnet/docker-compose.yml index 4f2443d3..468ad423 100644 --- a/docker-compose/mainnet/docker-compose.yml +++ b/docker-compose/mainnet/docker-compose.yml @@ -89,7 +89,7 @@ services: - ${LPS_HOME:-/mnt/lps/logs}:/home/lps/logs networks: - net_lps - command: ["sh", "-x", "start.sh"] + command: ["liquidity-provider-server"] lbc-deployer: build: context: lbc-deployer From d8cb00674c52f9f2c0f3980863d1d9e03094dd28 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 1 Feb 2024 10:32:44 -0300 Subject: [PATCH 009/113] fix: add improvements identified while creating the tests --- cmd/application/main.go | 2 +- .../dataproviders/database/mongo/common.go | 6 +-- .../dataproviders/rootstock/common.go | 6 +-- .../adapters/dataproviders/rootstock/lbc.go | 11 +++-- .../entrypoints/rest/routes/routes.go | 6 +++ .../entrypoints/watcher/pegout_btc_watcher.go | 4 +- internal/configuration/registry/usecase.go | 1 + internal/entities/quote/pegout_quote.go | 1 + internal/entities/wei.go | 3 ++ internal/usecases/pegin/register_pegin.go | 6 +++ internal/usecases/pegout/refund_pegout.go | 41 ++++++++++--------- sample-config.env | 7 ++-- 12 files changed, 57 insertions(+), 37 deletions(-) diff --git a/cmd/application/main.go b/cmd/application/main.go index 969c287b..caa42c11 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -16,7 +16,7 @@ import ( // @Server https://lps.testnet.flyover.rif.technology Testnet // @Server https://lps.flyover.rif.technology Mainnet -const bootstrapTimeout = 10 * time.Second +const bootstrapTimeout = 3 * time.Minute // In case LP needs to register func main() { var err error diff --git a/internal/adapters/dataproviders/database/mongo/common.go b/internal/adapters/dataproviders/database/mongo/common.go index e6cf96b9..71d3aa79 100644 --- a/internal/adapters/dataproviders/database/mongo/common.go +++ b/internal/adapters/dataproviders/database/mongo/common.go @@ -25,11 +25,11 @@ const ( func logDbInteraction(interaction dbInteraction, value any) { switch interaction { case insert, update, upsert: - log.Infof("%s interaction with db: %#v\n", interaction, value) + log.Infof("%s interaction with db: %#v", interaction, value) case read: - log.Debugf("%s interaction with db: %#v\n", interaction, value) + log.Debugf("%s interaction with db: %#v", interaction, value) case delete: - log.Debugf("%s interaction with db: %v\n", interaction, value) + log.Debugf("%s interaction with db: %v", interaction, value) default: log.Debug("Unknown DB interaction") } diff --git a/internal/adapters/dataproviders/rootstock/common.go b/internal/adapters/dataproviders/rootstock/common.go index 7a208e54..068dfd24 100644 --- a/internal/adapters/dataproviders/rootstock/common.go +++ b/internal/adapters/dataproviders/rootstock/common.go @@ -16,8 +16,8 @@ import ( const ( rpcCallRetryMax = 3 - rpcCallRetrySleep = 2 * time.Minute - txMiningWaitTimeout = 3 * time.Minute + rpcCallRetrySleep = 1 * time.Minute + txMiningWaitTimeout = 2 * time.Minute ) type RskAccount struct { @@ -82,7 +82,7 @@ func awaitTx(client *ethclient.Client, logName string, txCall func() (*geth.Tran var tx *geth.Transaction var err error - log.Infof("Executing %s transaction...\n", logName) + log.Infof("Executing %s transaction...", logName) tx, err = txCall() if err != nil { return nil, err diff --git a/internal/adapters/dataproviders/rootstock/lbc.go b/internal/adapters/dataproviders/rootstock/lbc.go index d5a8795c..368494fb 100644 --- a/internal/adapters/dataproviders/rootstock/lbc.go +++ b/internal/adapters/dataproviders/rootstock/lbc.go @@ -357,7 +357,7 @@ func (lbc *liquidityBridgeContractImpl) RegisterPegin(params blockchain.Register params.BlockHeight, ) if err != nil && strings.Contains(err.Error(), "LBC031") { - log.Debugln("bridge failed to validate BTC transaction. retrying on next confirmation.") + log.Debugln("RegisterPegin: bridge failed to validate BTC transaction. retrying on next confirmation.") // allow retrying in case the bridge didn't acknowledge all required confirmations have occurred return "", blockchain.WaitingForBridgeError } else if err != nil { @@ -370,11 +370,9 @@ func (lbc *liquidityBridgeContractImpl) RegisterPegin(params blockchain.Register GasLimit: registerPeginGasLimit, } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "RegisterPegIn", func() (*geth.Transaction, error) { - return lbc.contract.RegisterPegIn(opts, parsedQuote, params.QuoteSignature, - params.BitcoinRawTransaction, params.PartialMerkleTree, params.BlockHeight) - }) + receipt, err := awaitTx(lbc.client, "RegisterPegIn", func() (*geth.Transaction, error) { + return lbc.contract.RegisterPegIn(opts, parsedQuote, params.QuoteSignature, + params.BitcoinRawTransaction, params.PartialMerkleTree, params.BlockHeight) }) if err != nil { @@ -399,6 +397,7 @@ func (lbc *liquidityBridgeContractImpl) RefundPegout(txConfig blockchain.Transac }) if err != nil && strings.Contains(err.Error(), "LBC049") { + log.Debugln("RefundPegout: bridge failed to validate BTC transaction. retrying on next confirmation.") return "", blockchain.WaitingForBridgeError } else if err != nil { return "", fmt.Errorf("refund pegout error: %w", err) diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go index 2d681538..53255f12 100644 --- a/internal/adapters/entrypoints/rest/routes/routes.go +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/middlewares" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" "net/http" ) @@ -31,6 +32,11 @@ func ConfigureRoutes(router *mux.Router, env environment.Environment, useCaseReg router.Path("/providers/details").Methods(http.MethodGet).HandlerFunc(handlers.NewProviderDetailsHandler(useCaseRegistry.GetProviderDetailUseCase())) if env.EnableManagementApi { + log.Warn( + "Server is running with the management API exposed. This interface " + + "includes endpoints that must remain private at all cost. Please shut down " + + "the server if you haven't configured the WAF properly as explained in documentation.", + ) router.Path("/pegin/collateral").Methods(http.MethodGet). HandlerFunc(handlers.NewGetPeginCollateralHandler(useCaseRegistry.GetPeginCollateralUseCase())) router.Path("/pegin/addCollateral").Methods(http.MethodPost). diff --git a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go index 20dc2d8b..5e02157e 100644 --- a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go @@ -105,9 +105,9 @@ func (watcher *PegoutBtcTransferWatcher) refundPegout(watchedQuote w.WatchedPego var err error if err = watcher.refundPegoutUseCase.Run(context.Background(), watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) - log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Errorf("Error executing refund pegout on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) } else if err != nil { - log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Errorf("Error executing refund pegout on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) } else { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) } diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index cba5aa29..f51fbc63 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -85,6 +85,7 @@ func NewUseCaseRegistry( eventBus, rskRegistry.Bridge, btcRegistry.RpcServer, + mutexes.RskWalletMutex(), ), acceptPeginQuoteUseCase: pegin.NewAcceptQuoteUseCase( databaseRegistry.PeginRepository, diff --git a/internal/entities/quote/pegout_quote.go b/internal/entities/quote/pegout_quote.go index bdca390e..b2f225bc 100644 --- a/internal/entities/quote/pegout_quote.go +++ b/internal/entities/quote/pegout_quote.go @@ -90,6 +90,7 @@ type RetainedPegoutQuote struct { UserRskTxHash string `json:"userRskTxHash" bson:"user_rsk_tx_hash"` LpBtcTxHash string `json:"lpBtcTxHash" bson:"lp_btc_tx_hash"` RefundPegoutTxHash string `json:"refundPegoutTxHash" bson:"refund_pegout_tx_hash"` + BridgeRefundTxHash string `json:"BridgeRefundTxHash" bson:"bridge_refund_tx_hash"` } type AcceptedPegoutQuoteEvent struct { diff --git a/internal/entities/wei.go b/internal/entities/wei.go index 82e63a90..fd5e7a54 100644 --- a/internal/entities/wei.go +++ b/internal/entities/wei.go @@ -103,6 +103,9 @@ func (w *Wei) UnmarshalJSON(bytes []byte) error { } func (w *Wei) MarshalBSONValue() (bsontype.Type, []byte, error) { + if w == nil { + return bson.TypeInt64, make([]byte, 0), errors.New("trying to marshal nil wei pointer") + } value := make([]byte, 8) binary.LittleEndian.PutUint64(value, w.Uint64()) return bson.TypeInt64, value, nil diff --git a/internal/usecases/pegin/register_pegin.go b/internal/usecases/pegin/register_pegin.go index 077c7a30..4ed91c3f 100644 --- a/internal/usecases/pegin/register_pegin.go +++ b/internal/usecases/pegin/register_pegin.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "sync" ) type RegisterPeginUseCase struct { @@ -16,6 +17,7 @@ type RegisterPeginUseCase struct { eventBus entities.EventBus bridge blockchain.RootstockBridge btc blockchain.BitcoinNetwork + rskWalletMutex *sync.Mutex } func NewRegisterPeginUseCase( @@ -24,6 +26,7 @@ func NewRegisterPeginUseCase( eventBus entities.EventBus, bridge blockchain.RootstockBridge, btc blockchain.BitcoinNetwork, + rskWalletMutex *sync.Mutex, ) *RegisterPeginUseCase { return &RegisterPeginUseCase{ lbc: lbc, @@ -31,6 +34,7 @@ func NewRegisterPeginUseCase( eventBus: eventBus, bridge: bridge, btc: btc, + rskWalletMutex: rskWalletMutex, } } @@ -59,6 +63,8 @@ func (useCase *RegisterPeginUseCase) Run(ctx context.Context, retainedQuote quot return useCase.publishErrorEvent(ctx, retainedQuote, err, true) } + useCase.rskWalletMutex.Lock() + defer useCase.rskWalletMutex.Unlock() if registerPeginTxHash, err = useCase.lbc.RegisterPegin(params); errors.Is(err, blockchain.WaitingForBridgeError) { return useCase.publishErrorEvent(ctx, retainedQuote, err, true) } else if err != nil { diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go index 81b72194..341e3d86 100644 --- a/internal/usecases/pegout/refund_pegout.go +++ b/internal/usecases/pegout/refund_pegout.go @@ -77,18 +77,12 @@ func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote useCase.rskWalletMutex.Lock() defer useCase.rskWalletMutex.Unlock() - if err = useCase.performRefundPegout(ctx, retainedQuote, txConfig, params); err != nil { + if retainedQuote, err = useCase.performRefundPegout(ctx, retainedQuote, txConfig, params); err != nil { return err } - if _, sendRbtcError := useCase.sendRbtcToBridge(ctx, *pegoutQuote); err != nil { - err = errors.Join(err, sendRbtcError) - } else if updateError := useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { - err = errors.Join(err, updateError) - } - - if err != nil { - return usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + if retainedQuote, err = useCase.sendRbtcToBridge(ctx, *pegoutQuote, retainedQuote); err != nil { + return err } return nil } @@ -142,19 +136,24 @@ func (useCase *RefundPegoutUseCase) buildRefundPegoutParams(retainedQuote quote. }, nil } -func (useCase *RefundPegoutUseCase) sendRbtcToBridge(ctx context.Context, pegoutQuote quote.PegoutQuote) (string, error) { - var err error +func (useCase *RefundPegoutUseCase) sendRbtcToBridge(ctx context.Context, pegoutQuote quote.PegoutQuote, retainedQuote quote.RetainedPegoutQuote) (quote.RetainedPegoutQuote, error) { + var err, updateError error var txHash string value := new(entities.Wei) value.Add(pegoutQuote.Value, pegoutQuote.CallFee) value.Add(value, pegoutQuote.GasFee) config := blockchain.NewTransactionConfig(value, bridgeConversionGasLimit, entities.NewWei(bridgeConversionGasPrice)) - if txHash, err = useCase.rskWallet.SendRbtc(ctx, config, useCase.bridge.GetAddress()); err != nil { - return "", err + txHash, err = useCase.rskWallet.SendRbtc(ctx, config, useCase.bridge.GetAddress()) + if err == nil { + log.Debugf("%s: transaction sent to the bridge successfully (%s)", usecases.RefundPegoutId, txHash) + } + + retainedQuote.BridgeRefundTxHash = txHash + if updateError = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + return quote.RetainedPegoutQuote{}, usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, errors.Join(updateError, err), usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) } - log.Debugf("%s: transaction sent to the bridge successfully (%s)\n", usecases.RefundPegoutId, txHash) - return txHash, nil + return retainedQuote, err } func (useCase *RefundPegoutUseCase) performRefundPegout( @@ -162,13 +161,13 @@ func (useCase *RefundPegoutUseCase) performRefundPegout( retainedQuote quote.RetainedPegoutQuote, txConfig blockchain.TransactionConfig, params blockchain.RefundPegoutParams, -) error { +) (quote.RetainedPegoutQuote, error) { var newState quote.PegoutState var refundPegoutTxHash string - var err error + var err, updateError error if refundPegoutTxHash, err = useCase.lbc.RefundPegout(txConfig, params); errors.Is(err, blockchain.WaitingForBridgeError) { - return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + return quote.RetainedPegoutQuote{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } else if err != nil { newState = quote.PegoutStateRefundPegOutFailed } else { @@ -182,7 +181,11 @@ func (useCase *RefundPegoutUseCase) performRefundPegout( RetainedQuote: retainedQuote, Error: err, }) - return nil + + if updateError = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + return quote.RetainedPegoutQuote{}, usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, errors.Join(updateError, err), usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) + } + return retainedQuote, err } func (useCase *RefundPegoutUseCase) validateBtcTransaction( diff --git a/sample-config.env b/sample-config.env index de345624..bef34d69 100755 --- a/sample-config.env +++ b/sample-config.env @@ -13,11 +13,11 @@ MONGODB_PORT=27017 # Rsk config RSK_ENDPOINT=http://localhost:4444 CHAIN_ID=33 -LBC_ADDR=0x8901a2Bbf639bFD21A97004BA4D7aE2BD00B8DA8 +LBC_ADDR= RSK_BRIDGE_ADDR=0x0000000000000000000000000000000001000006 RSK_REQUIRED_BRIDGE_CONFIRMATIONS=10 IRIS_ACTIVATION_HEIGHT=10 -ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3, 0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14, 034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f +ERP_KEYS=0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3,0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14,034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f ACCOUNT_NUM=0 DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 KEY_SECRET=FlyoverTestEnv/LPS-LOCAL-KEY @@ -73,4 +73,5 @@ AWS_SECRET_ACCESS_KEY= AWS_REGION= # Used by local scripts -LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c \ No newline at end of file +LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c +GITHUB_TOKEN= \ No newline at end of file From 5b8452d3e2a1fb0b64a515b43dab4b4a112821ff Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 2 Feb 2024 01:18:27 -0300 Subject: [PATCH 010/113] add unit tests for entities layer --- .gitignore | 1 + .golangci.yml | 2 +- Makefile | 11 + go.mod | 6 +- go.sum | 12 +- .../adapters/dataproviders/bitcoin/common.go | 2 +- .../dataproviders/rootstock/bridge.go | 3 +- .../adapters/dataproviders/rootstock/rpc.go | 2 +- internal/entities/blockchain/bitcoin.go | 4 +- internal/entities/blockchain/bitcoin_test.go | 329 ++++++++++++++++++ internal/entities/blockchain/lbc.go | 4 +- internal/entities/blockchain/lbc_test.go | 68 ++++ .../entities/blockchain/rootstock_test.go | 83 +++++ internal/entities/common.go | 5 +- internal/entities/event_test.go | 14 + internal/entities/liquidity_provider_test.go | 77 ++++ internal/entities/quote/pegin_quote.go | 9 + internal/entities/quote/pegin_quote_test.go | 180 ++++++++++ internal/entities/quote/pegout_quote.go | 17 +- internal/entities/quote/pegout_quote_test.go | 303 ++++++++++++++++ internal/entities/utils/math.go | 28 ++ internal/entities/utils/math_test.go | 55 +++ internal/entities/wei.go | 6 +- internal/entities/wei_test.go | 44 +++ internal/usecases/common.go | 10 +- internal/usecases/health.go | 38 +- internal/usecases/pegin/get_pegin_quote.go | 2 +- internal/usecases/pegout/get_pegout_quote.go | 4 +- test/utils.go | 21 ++ 29 files changed, 1291 insertions(+), 49 deletions(-) create mode 100644 internal/entities/blockchain/bitcoin_test.go create mode 100644 internal/entities/blockchain/lbc_test.go create mode 100644 internal/entities/blockchain/rootstock_test.go create mode 100644 internal/entities/event_test.go create mode 100644 internal/entities/liquidity_provider_test.go create mode 100644 internal/entities/quote/pegin_quote_test.go create mode 100644 internal/entities/quote/pegout_quote_test.go create mode 100644 internal/entities/utils/math.go create mode 100644 internal/entities/utils/math_test.go create mode 100644 test/utils.go diff --git a/.gitignore b/.gitignore index 61a53563..2420c019 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ integration/geth_keystore keystore/ build/ /**/.env.regtest +coverage/ diff --git a/.golangci.yml b/.golangci.yml index 36493872..a0a58d50 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,5 +1,5 @@ run: - tests: false # enable when integration dir is updated + tests: false skip-dirs: - internal/adapters/dataproviders/rootstock/bindings linters: diff --git a/Makefile b/Makefile index 431e6212..85979694 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ download: go mod download lint: + test -z $(shell gofmt -l .) golangci-lint run -v ./... validation: lint @@ -25,3 +26,13 @@ api: --output OpenApi.yml \ --schema-without-pkg \ --generate-yaml true + +coverage: clean + mkdir coverage + go test -v -race -covermode=atomic -coverpkg=./... -coverprofile=coverage/cover.out ./... + go tool cover -func "coverage/cover.out" + go tool cover -html="coverage/cover.out" + rm coverage/cover.out + +clean: + rm -rf build coverage diff --git a/go.mod b/go.mod index 0724d450..9081c518 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/gorilla/handlers v1.5.2 github.com/gorilla/mux v1.8.1 github.com/sirupsen/logrus v1.9.3 + github.com/stretchr/testify v1.8.4 go.mongodb.org/mongo-driver v1.13.1 ) @@ -33,6 +34,7 @@ require ( github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect @@ -54,8 +56,9 @@ require ( github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-isatty v0.0.18 // indirect github.com/montanaflynn/stats v0.7.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.3 // indirect + github.com/stretchr/objx v0.5.0 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -71,4 +74,5 @@ require ( golang.org/x/time v0.1.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index cf4d4adf..d25534fb 100644 --- a/go.sum +++ b/go.sum @@ -97,8 +97,6 @@ github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/ethereum/go-ethereum v1.11.6 h1:2VF8Mf7XiSUfmoNOy3D+ocfl9Qu8baQBrCNbo2CXQ8E= github.com/ethereum/go-ethereum v1.11.6/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= @@ -237,21 +235,20 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/sirupsen/logrus v1.9.1 h1:Ou41VVR3nMWWmTiEUnj0OlsgOSCUFgsPAOl6jRIcVtQ= -github.com/sirupsen/logrus v1.9.1/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= @@ -324,8 +321,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -357,6 +352,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= diff --git a/internal/adapters/dataproviders/bitcoin/common.go b/internal/adapters/dataproviders/bitcoin/common.go index cedb128a..3481ddd1 100644 --- a/internal/adapters/dataproviders/bitcoin/common.go +++ b/internal/adapters/dataproviders/bitcoin/common.go @@ -60,7 +60,7 @@ func DecodeAddressBase58(address string, keepVersion bool) ([]byte, error) { } func DecodeAddressBase58OnlyLegacy(address string, keepVersion bool) ([]byte, error) { - if !blockchain.IsLegacyBtcAddress(address) { + if !blockchain.IsSupportedBtcAddress(address) { return nil, fmt.Errorf("only legacy address allowed (%s)", address) } return DecodeAddressBase58(address, keepVersion) diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go index 29d66c42..199b97d5 100644 --- a/internal/adapters/dataproviders/rootstock/bridge.go +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -64,7 +64,8 @@ func (bridge *rskBridgeImpl) GetMinimumLockTxValue() (*entities.Wei, error) { if err != nil { return nil, err } - return entities.NewBigWei(result), nil + // This value comes in satoshi from the bridge + return entities.SatoshiToWei(result.Uint64()), nil } func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.FlyoverDerivationArgs) (blockchain.FlyoverDerivation, error) { diff --git a/internal/adapters/dataproviders/rootstock/rpc.go b/internal/adapters/dataproviders/rootstock/rpc.go index d8c1e17d..f5c91a4a 100644 --- a/internal/adapters/dataproviders/rootstock/rpc.go +++ b/internal/adapters/dataproviders/rootstock/rpc.go @@ -70,7 +70,7 @@ func (rpc *rskjRpcServer) EstimateGas(ctx context.Context, address string, value if err != nil { return nil, err } else { - return entities.NewUWei(result + additionalGas), nil + return new(entities.Wei).Add(entities.NewUWei(result), entities.NewUWei(additionalGas)), nil } } diff --git a/internal/entities/blockchain/bitcoin.go b/internal/entities/blockchain/bitcoin.go index 8e8d23fa..bd56c944 100644 --- a/internal/entities/blockchain/bitcoin.go +++ b/internal/entities/blockchain/bitcoin.go @@ -13,7 +13,9 @@ var ( btcTestnetP2SHRegex = regexp.MustCompile("^[2]([a-km-zA-HJ-NP-Z1-9]{33,34})$") ) -func IsLegacyBtcAddress(address string) bool { +// IsSupportedBtcAddress checks if flyover protocol supports the given address +// Currently the supported address types are P2PKH and P2SH +func IsSupportedBtcAddress(address string) bool { return isP2PKH(address) || isP2SH(address) } diff --git a/internal/entities/blockchain/bitcoin_test.go b/internal/entities/blockchain/bitcoin_test.go new file mode 100644 index 00000000..fbd64022 --- /dev/null +++ b/internal/entities/blockchain/bitcoin_test.go @@ -0,0 +1,329 @@ +package blockchain_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +var p2pkhTestnetAddresses = []string{ + "mzVTV2cwEpBLWcsPckthMA7NZ2Cw8ojWf8", + "moAJa2o3ggwSweWP8qmPznML9bRke9vsNc", + "mtEjnJR9MPQEkpqvuKemsFHdbL1cXrmEnK", + "mucJ4ZUriexq6poQv717ArtkJxEEZXVLMe", + "mtcy9BuREZ54EbArDTdTz4we6M7AYybU3P", + "mtwn2DFCfiJ75ppTYvAULs1v3nqyKo5Dnn", + "mpihFFPkg7HL1RbQcfogE3pksUqMRVjsqc", + "mseeU5gbFbEuDpoZQ5fwBi5UyTUmE3wD3j", + "mncLnq3YFdf8vvRkLySmJhX4YuVttuAp9C", + "mrQ6EZRMgKdSXQN4rK7rNxwqXV3Cnjupb4", + "munRXv4sfA4E6PazLzgEFF2mWo19YJQbTD", + "myTJXHz7JUcV1vq9Y9vhoqmdJaSYWfgkUh", + "mjqo4zmzzybYMcm5HHdhrWW7N6XfHR1qDz", + "mgDUopmALewBcNRoTCDNgTF75cFkQuCDdP", + "mv883zByNTJmaAVZ9RbcUEMFFmGwDBvnC5", + "misG6J9JgskhKsf9PfrAagan8fx2UUCErF", + "mj2ucWCL3SSkbJRoLExMQZPMH7fEvoejH9", + "mxa17v5jv6jT8YkX8GVPNkt4DGzRG15ebi", + "mq4LomGAruBzQm3UcM9Seu6TFtCSsXX6zx", + "n3KxPinGaXMLxJoVBiaaQa4N8x1i2aHNH1", + "mvoBtYKhVrnvWWnqVEGn7awGNRisw4PkVF", + "mxZ7CYDMUaKZt8VVsMvoXif3vRm4aK9FGD", + "mmWHzFtKBfBnitWBHX9VEJee9skear1qZX", + "mqfkut8yAQepC6kj8HtiKXPC66MefCj2Yc", + "miE2R7EWfhJ7mMfSems4moz8HejSR3igP1", + "mxTYtVFuZxtE6x19VAQ1bZEEBrFAe1NJfS", + "mxkZ6CK1edZZuEEwngy52Tm5WxLRaHXKrY", + "n4XLcxmXTXdhEQaBDGPP9FU8CReaVcNVQm", + "mjVA4tXotqXyP5qw3d6iNFSJfVmkPLThaW", + "mxgUSkFfUZPmmQRmhNtb7s3uTWFdRzuvWQ", + "n2Y3y2ZkjoDPNGM3GYAcgX91na35Prrzr3", + "mfXSEKxMzPkejLwrZeNzxE72QnoC5fmELi", + "mx17QNaAh9RCSQ9zajyaSN4dfjNjPszjUf", + "mzgWf4TVPbjYvDAKRQdWHEDyZFQCEHHrWh", + "moig2R8WViDPbEsCXYSCBQULgEVHs93eeS", + "mgFWCp1UKkWt5SFQ5MAa37Fd1JoYTGwmCK", + "mjjo6muRiQzuzqvpTAK3A4odD2RXjHLTz9", + "mos8ZoeAZVpJSafT7qgv3Pf7Q3WtKXP1E7", + "mtd3ueANi3hsU1NVVdoUnuhSwy5LdzVXXr", + "mw1GKH6wpUmu1w83iP93asovyNod11ByrQ", + "myVVnWrgcuqmGj7f6CD3EyCLCi73sjjFLD", + "mg4pSPq9azViCbfSKpzZFHsuG17xG4pn3S", + "mi9fMknNV373AsJuFPKrQgqaMopnQsqZft", + "mrcAitXFKFcGWZUPTRnDv7qodxq3rAH2C7", + "mtwdVmgAXE5vfk1QziXnMhJb5DG5icognD", + "mubMX7zb8gmNiSd8qqB3NQSoQ8dc17qkkt", + "mrE5MMQbEbcEQQeGiMKzadd6h79XKtycVc", + "mzdBTxxvDkKHye3ZbUqgxBnMTzTxN3Mv9r", + "mzvKAkcbBpGdDXdA3xCJEgtGLmb24mJ6CS", + "muoNEVG8kscidB8ijrgsY9HGQMfP1FWUbH", + "my9bJuzTzaudoUA3jYZAisjDMpmigwFrL7", +} + +var p2pkhMainnetAddresses = []string{ + "1Ld4rjLYfmtW2HrF47mHjVLfaU82ku6GFX", + "14KtqniYfjBw6BxyGadNqJRE2TfrZ2iDex", + "1LdzDJ51dpt2cg8jmcaay4ypVYDykYuRZc", + "16Pg2ctWtwbAGvZVNnQCEpWyLV85BwEDcX", + "1Ab1Jfe6xQHzL8RHoHDukDQBEks35KFWHC", + "19hiJTQpZyT3C7Hu29dJE2YYToCeKp6cGu", + "1LQdpgVCY2nYzsoRNRHWhuCLxMpYzb6zzg", + "17oKLsbZsd2BZdCDn1dbrbk2TT9HSzw2aM", + "1NbJonAytRKfCFkvGcQNEUCXAFnf17bYQG", + "1MwygkmvJHwwG934EbtkjhRUFyfMHLEPi9", + "124qYovdcDQQzBETVsyKBA8vYPpQTjYo7n", + "1BMjg4kirMSZ49h5DbR4fo6ZrAT6CaeQSc", + "14uFoAvDGsa25VSYk4AtehxcGfhTLscyGB", + "1MKLYiRiJ94p7T5BVi7LjkxQsXZXmfaDNY", + "19QVu5DkLHhvikdkCF7AHCxQK89xQFJGj", + "1PWFvoD73rsbsTqojvXGM5m7xHdM9iYDSM", + "1PC1Vz6zEocJdWvYe9rwBpDH6cJ23Jf57g", + "15PiaAwCXC6R3Ub9w4CjmWqC537C1GA57Z", + "17Q7ZhQxryfvhEhBv3tXtXrWhczCfho8Vg", + "17KXpqaBazhkNXxM3swFL1zkTzmKJFCmhX", + "1DLaPDD6tRWzqbvt9SQ6cdYcTJxdYmqpmG", + "1GzfGiV8T8MTADzrv1XBtwt6GDFNUNUbzR", + "1BGbjogTCqUwB7MmRBjBZob1wydau8BE9f", + "164XxTfzPyLY5DDXYfS8sCnChoeHZBNT3m", + "1Dn66Pqx8p7Ky8gc9G4x6x6riFZzZ4jJqF", + "18FixbDw6EEPqEGXphdw3BaXHb7xUYx3ff", + "149RXsdcY6s3Vw8rzfjg2pTNkCGWqhF1dn", + "1QKLNCmyqVPUZneefDw3Yj133Yf47E53My", + "15u1itBJhUJTY9ZmqpHJagBDuoN2fBrfbK", + "1MK3xXgsSzwSY5V78fiRX5PCPWD6iVg9ry", + "1A713zQYJLoQKKZLxyqawfdKwpSuy6Cu19", + "1Gkd5uTfvYjpubq1ZaYCeY8xDuVAcUoVnF", + "14JuvbQg2XJztYpyauX5WTsHdQwp1iX5pa", + "12YkAVgWxoJF1zMYJuCjbrESNWZY8iyNPC", + "1D6tCRyqecKUa2xGFH5Qqnnd3WLrC8JN8V", + "1LS6ZSCEzhfmP1g7MEhjson7TKCq1RJ5eP", + "147gsg9Y4npuDrubtBVFYxGfcxCcnhfXAu", + "19fkgqMpCkRJF6kXwyeT3FLLpBsN26Thad", + "1NqeTZNq8P7P8755UnPC782zKPhrgYtyin", +} + +var p2shTestnetAddresses = []string{ + "2Mssid57MEEAzrjiVCG87PsRDyW52Wnjwso", + "2N7A51EjcWVSbP3ag7b48oJ8QiEm5wk3CmC", + "2NDcdkBpUneEgKvcmYpC4n9faoRiALeEzbP", + "2N5WuV8JPs4sjBkjQsFkjTDPGDgjBhWxXMj", + "2MwgCpDmUiHMUsqmxqQmEM3AEoeusXxver8", + "2Mu1WgnUKR2C1R7FuVbfC2jRoFbAtcJCtP7", + "2MyKtiQcyAgQQdPDmBJcT4UMn6jyVdKVwxg", + "2N9TujzoGXb4LkzCQscMuuRSwaTVPhFfYSy", + "2NAvNk9t8fKwFRhMJGgY2wMLRboN8DHXeBB", + "2MzqFJDg3QcbzeWX87XpxRpHZm6SSNoGdoF", + "2MuBrh282woZkhycbpKAZ8zEptTAEtRSM62", + "2NAobddanbJX2AQmgv8iSCHTTT3LEFPkdN8", + "2NEwLSjVVuDfr6mpvkbVNy7MpoxHhLWduvy", + "2NAgRDmhg9zDeJQLFx5tfGhzs2zZfLR4L9o", + "2N3s7K9314WDqSNS8NKggcBpgAhsVBjoR72", + "2N1h7tqTub3GevTpdGnkyBYChApwN25w9Ex", + "2MwnxYx5vvCj46ThT18aB1e5K3rAhyVh8wz", + "2MzMzYAHzbTHFg4VEoidRjkuVDuFWce4vm4", + "2MzDws1oDEyG2f6hkubUXCUUnu7aLicXtEN", + "2N34YniLPdNJ33vBSbzUphmhM5F6XcX2vgS", + "2Mx4KfFN8vspsXkEZZGpZHdmjkTjnWQ4SCU", + "2MwGLNdaZSkVvcqpuJGo17AonGGWHfrjF1N", + "2N3vaXgbkvb4Vv3etHq45KQzCM2CczyTJGe", + "2MxXigcEyqQaErgA9qCjuyHg3c2YYqEY8dd", + "2MtS6SDDB1uN7zb8fTFhaiCfJQWLBQYApg1", + "2N6PiKxASAKihec1Q2xLHo8stXccCZsFJg8", + "2N4oTNvcvttro4chtve8qLCmEnp8cbt2sPR", + "2NBPF78FpdLBDxu6FvmZnw7K5462yn3SeVN", + "2NE73iNV74T4FTiULnRkwaAUxXKQugBeXDK", + "2MwgNDvWAnjsMZ2Jp73VhdyaFc38Kx4rFMP", + "2N8EWGy86QJt67m57DbRBN9V5Ksj8m6ZL1E", + "2N7QybDvzGcyKDJXYYkfzvFWwvHyrpc1M9S", + "2NBdfBtz7Wfht4QTAuEWCdyTnm3HucPbPU6", + "2MxeuFGBzQrA54YYEPcVMFaXKYVfBTBBKB3", + "2N58BH8rEq9Ku7HuJbZvKX6WRywdNmoVrnA", + "2NEv9myWjPZVLxEUKEMC5vbKP5euMTxXZyM", + "2NABLwMDsitb13Y4Peuoy5M5fishWaFKaV8", + "2N4qmbZNDMyHDBEBKTCP218HV1LhxCMRMti", + "2NDt1sRinReq2qdJf1wTojfhx7WgdvyumEB", + "2N8XxpAd9teiPEeBgLfi6vuAgq4KA4CeUaz", + "2NDTyc7YZ2Z3nnFqswcF1YjnuLAMjxnpiBB", + "2NEEHG27iCKuBWSmCKXygXv4uZ1yPWu6vfL", + "2NBnogvRFVas4q8juTCohgv7qFiKPomTvyr", + "2N2ZEQTGFeTDgzHoPX1KBAxejpWCwvhF61f", + "2MupuVBvFvcyEnGdrRBixhZrTxRxctaQHUM", + "2MwysnGXHByGyvyJKkwwdobdoyhcCC2LKkF", + "2N8Kr3eyzSwEPNi8DR1GEhuwnvsQJCvquXP", + "2NBTmXUJkgx5SFsiDUffNaFGBVaC2W6GjxY", + "2NEe5WztmDRC8TvUo2bqurK1dNMRvPf52qQ", + "2MzBVRSRJqmGhsYXc35ecWKyLw5p3Y7bdLs", + "2Mv4aWbKBc3k9ZxF8SN2k3VMuAWfU3Fv8hB", +} + +var p2shMainnetAddresses = []string{ + "3HwGVBDv7jPuS8ncTFm36UW69h36BsdjqL", + "384B1WkNYMm58o6F7w1yVEZwX48EvFKbSa", + "3PUWoEeffv7y1WeYEF9v2gA9AxQ9v1FVLn", + "3KXu18nZ5qE9mwap3sKi35Du9rdSn8hHuP", + "3MnspZrXnAvYhCrGLYNvRreHiHsz587Z5q", + "35Vebz7gEQk8pEpi5FyZy4fTGngBificfL", + "39NNxXAg35E256YeU3ofnPXzkq3aAoMJdx", + "3Pu2Jp63S5WfFTE3bZM9kPPUFAqQvXCEBZ", + "3QD7radHE3LUjWQGtpXvCiZJeGmPPLfy55", + "36xT5Ly3hyPATenoFvXn9vD21gLFecjSpc", + "3End97i9TYEkSFBEpAP6mKMYHDJHcKAJ2S", + "3JRL2REh3KGJaKLNuPXCz4K2ZSCVbzhBKh", + "37ofEuKT4cZhc1iZY5k1uRx1ShoRwtXmXi", + "3DEAo1q2dABPzoxvcqsEXYSzDBvBHpyPkp", + "3QmBRzpsUDxUjt7TzNGRcHHgZRn3gxszyb", + "31tvn8gdKgg525KNZM4wevi87GafSzD1FU", + "33BTakydSPnJfSfR13foniEsPCB2nuHiCb", + "3Fi3ywSD7eBEtnoUuiW7zFSBmpATd3YDLs", + "3DCT2YtzwZZYdr3pPEhqVjA1Amak89YrHf", + "3EuQdJ651cN7Cv9jJk2EJPdRhKT9JJFpt8", + "3BcLTSd24JRtJhLcKqkeF83rFmFxxY5qH9", + "35ficBSmjzqdSqAWCKgZCeeTG5q5mB5EFj", + "3A2YVYwmodEATGGKSjJ9vx7jY5YLkq9kst", + "34JdvFMpFfBSk6ibR1HAzjTVaZ8Dbt1YuL", + "33tB53JpXTNeDvMUeXKLU3VfYMLMc6oLab", +} + +var nativeSegwitTestnetAddresses = []string{ + "tb1q2hxr4x5g4grwwrerf3y4tge776hmuw0wnh5vrd", + "tb1qj9g0zjrj5r872hkkvxcedr3l504z50ayy5ercl", + "tb1qpkv0lra0nz68ge5lzjjt6urdz2ejx8x4e9ell3", + "tb1qqgzlw8yhyj6tmutat0u5n3dnxm3y6xnjp53wy9", + "tb1qcc4j0tdu3lwfl05her3crlnvtqvltt90n5s5m0", + "tb1q7k3nex0gssyucqvz7xpk25wzqfpc56ve9myzqs", + "tb1qur2ztvmx4tqdxa35js04zuqhwx624z3nyuv97l", + "tb1q3n9lhc63xwkfrj25sy2gqf06r77vzqcryxqe7k", + "tb1qc706vv5vyqqz3drx080c3um3t2ylze8fuxuujd", + "tb1qj36sglrgm590mdkht0dququug73azfxcxdnhk7", + "tb1qu05qzyrlqaeth5j0p0fkxek4tp5huffveryewa", + "tb1qv87afr2gu8g57v7u39g6h8txwx7afvkzc5ja0j", + "tb1qc85tj3uc7auyndw4en02vk74ty2720rpppaxd5", + "tb1q94u4lqykk9m387p59sqcvks7dhjpaz8tf5kdkp", + "tb1qclumyllxep6gp9rnv7wzks869t7w5ct9rznuzd", + "tb1qv55ksu4ll2xmekru50nknac6zkq9c87mf387n2", + "tb1qw853dsyg9745dm5q39zmgnk3m6ldr879q5rht6", + "tb1qtzx5vjl37rl8nefn4ppdqvwrxw9cvrqf2w632d", + "tb1qxylu8c2r9ypucc7jas47n3dy400kx0n4hd5g2t", + "tb1qmznvxadpzmzc5x3q9cvwsu0vrud967hnryndq0", + "tb1q700p8wdp9t6z3f59f009uwqkf8nct49arn9zh4", + "tb1q0dgpnxve9utzc3m38zmw7drh0ekdw20gup6sqp", + "tb1q36tpm7eu706v0ut0hap6yjuehgsg53rg280tc9", + "tb1qwnmmmrrr7hw60yulw2rx50ne2tkktj729076zf", + "tb1qag9uv7n266eyf6d88xc3e5nmek8sqe6aqxmfpp", +} + +var nativeSegwitMainnetAddresses = []string{ + "bc1qg5d579rlqmfekwx3m85a2sr8gy2s5dwfjj2lun", + "bc1qtqxd29s9k3tj3rq9fzj7mnjknvlqzy8hsuzs5x", + "bc1qv245zr29zw5urv5fy00c6km09l302fmlftf0aj", + "bc1qw4z64jjvuxyddjdcm88yt0ln7fntkyw0w6wqhp", + "bc1q8d7e3jrhsf8tj9q28x3msf8c644hdaetpqy7t4", + "bc1qzs5h0w6zjk3gej89gz3fjqx3xv9kvngntam76g", + "bc1qtj7y3xapmn38gra6jd3x6ua905j72plz5rv0kq", + "bc1qx2xgfynw4fjtm8c2glv9ceue5j0k42fdp6u8vz", + "bc1qtjrcft537z0kwcl7efucqh3f6xyvkqc908g9ve", + "bc1q4a2le8yt6l6x0t9cfxmmx35runhf58lktvq8wn", + "bc1q5qxpf5ca4s9k420h6vx9gegdqtq77sxdmqxca6", + "bc1q9wjmgcfny0rsyhd727y6t3xv8wf69ggmk04msw", + "bc1qufr3cd7kmr9kufd62wh3d0jq44zqrm4yqjyc04", + "bc1q455afukjmkm0v9fpldqacc8jdevfvcylxtz97y", + "bc1qyg6m5eyjlder7cg8ja5lw788jn9pfsx4ypyr9t", + "bc1q9qfptdws3l0qqrhc8fvfezw3uv3f0vtrzz4m57", + "bc1q7uq8kxtnu6ya8l3k7c4w7avxwweqa8c2nfv7zh", + "bc1quk39lyk9tya3z34g7zarfnxegv855584pmy9ud", + "bc1qfy323zdtp7dd6pjxkz5k46l7v6kktmsp2vrsfd", + "bc1qkmm0yj2heftt0safn7cgqrexdzhujz53kfpq6w", + "bc1qwr5glcl76g7hwnx8kunqsxuapm6vq3mg8yel50", + "bc1q8eg9j6khqeqhrjsmc5890nnpjyaj3wdkkq6485", + "bc1q2rrlg43vv5snstv3mvc79mfr9amfw4yknhjtew", + "bc1q9da5fx8eerg4m40vkqc2mm24nykxhtpw9sfcw3", + "bc1qma0pelvcshhq59wfur9p5rhacjyk0lmfdr53vs", +} + +func TestBitcoinTransactionInformation_AmountToAddress(t *testing.T) { + address := "2N2Sg8C2uX1YtugYSxEQvRqf9V2EivxcWER" + cases := test.Table[blockchain.BitcoinTransactionInformation, *entities.Wei]{ + {blockchain.BitcoinTransactionInformation{ + Hash: "0x1234", + Confirmations: 1, + Outputs: map[string][]*entities.Wei{ + address: {entities.NewWei(500)}, + }, + }, + entities.NewWei(500), + }, + {blockchain.BitcoinTransactionInformation{ + Hash: "0x1234", + Confirmations: 1, + Outputs: map[string][]*entities.Wei{ + "2N1nBfGejU5iLEqAS42fBKJ1Dw6mw4su8eQ": {entities.NewWei(100)}, + address: {entities.NewWei(500)}, + "2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(300)}, + }, + }, + entities.NewWei(500), + }, + {blockchain.BitcoinTransactionInformation{ + Hash: "0x1234", + Confirmations: 1, + Outputs: map[string][]*entities.Wei{ + "2N1nBfGejU5iLEqAS42fBKJ1Dw6mw4su8eQ": {entities.NewWei(100)}, + address: {entities.NewWei(500), entities.NewWei(1100)}, + "2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(300)}, + }, + }, + entities.NewWei(1600), + }, + {blockchain.BitcoinTransactionInformation{ + Hash: "0x1234", + Confirmations: 1, + Outputs: map[string][]*entities.Wei{ + address: {entities.NewWei(400), entities.NewWei(1100)}, + }, + }, + entities.NewWei(1500), + }, + {blockchain.BitcoinTransactionInformation{ + Hash: "0x1234", + Confirmations: 1, + Outputs: map[string][]*entities.Wei{}, + }, + entities.NewWei(0), + }, + {blockchain.BitcoinTransactionInformation{ + Hash: "0x1234", + Confirmations: 1, + Outputs: map[string][]*entities.Wei{ + "2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(400), entities.NewWei(1100)}, + }, + }, + entities.NewWei(0), + }, + } + + test.RunTable(t, cases, func(value blockchain.BitcoinTransactionInformation) *entities.Wei { + return value.AmountToAddress(address) + }) +} + +func TestIsSupportedBtcAddress(t *testing.T) { + var notSuported []string + notSuported = append(notSuported, nativeSegwitTestnetAddresses...) + notSuported = append(notSuported, nativeSegwitMainnetAddresses...) + + var supported []string + supported = append(supported, p2pkhTestnetAddresses...) + supported = append(supported, p2pkhMainnetAddresses...) + supported = append(supported, p2shTestnetAddresses...) + supported = append(supported, p2shMainnetAddresses...) + + for _, address := range notSuported { + assert.Falsef(t, blockchain.IsSupportedBtcAddress(address), "Address %s should not be supported", address) + } + for _, address := range supported { + assert.Truef(t, blockchain.IsSupportedBtcAddress(address), "Address %s should be supported", address) + } +} + diff --git a/internal/entities/blockchain/lbc.go b/internal/entities/blockchain/lbc.go index 58b86661..1afbf0e1 100644 --- a/internal/entities/blockchain/lbc.go +++ b/internal/entities/blockchain/lbc.go @@ -20,7 +20,7 @@ type RegisterPeginParams struct { func (params RegisterPeginParams) String() string { return fmt.Sprintf( "RegisterPeginParams { QuoteSignature: %s, BitcoinRawTransaction: %s, "+ - "PartialMerkleTree: %s, BlockHeight: %v, Quote: %#v }", + "PartialMerkleTree: %s, BlockHeight: %v, Quote: %+v }", hex.EncodeToString(params.QuoteSignature), hex.EncodeToString(params.BitcoinRawTransaction), hex.EncodeToString(params.PartialMerkleTree), @@ -40,7 +40,7 @@ type RefundPegoutParams struct { func (params RefundPegoutParams) String() string { return fmt.Sprintf( "RefundPegoutParams { QuoteHash: %s, BtcRawTx: %s, "+ - "BtcBlockHeaderHash: %s, MerkleBranchPath: %v, MerkleBranchHashes: %#v }", + "BtcBlockHeaderHash: %s, MerkleBranchPath: %v, MerkleBranchHashes: %v }", hex.EncodeToString(params.QuoteHash[:]), hex.EncodeToString(params.BtcRawTx), hex.EncodeToString(params.BtcBlockHeaderHash[:]), diff --git a/internal/entities/blockchain/lbc_test.go b/internal/entities/blockchain/lbc_test.go new file mode 100644 index 00000000..e95a7991 --- /dev/null +++ b/internal/entities/blockchain/lbc_test.go @@ -0,0 +1,68 @@ +package blockchain + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/stretchr/testify/assert" + "math/big" + "testing" +) + +func TestRefundPegoutParams_String(t *testing.T) { + params := RefundPegoutParams{ + QuoteHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + BtcRawTx: []byte{0x01, 0x02, 0x03}, + BtcBlockHeaderHash: [32]byte{32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + MerkleBranchPath: big.NewInt(1), + MerkleBranchHashes: [][32]byte{ + {32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + {32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + }, + } + assert.Equal(t, + "RefundPegoutParams { QuoteHash: 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20, "+ + "BtcRawTx: 010203, BtcBlockHeaderHash: 201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201, "+ + "MerkleBranchPath: 1, MerkleBranchHashes: ["+ + "[32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1] "+ + "[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32] "+ + "[32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]] }", + params.String()) +} + +func TestRegisterPeginParams_String(t *testing.T) { + params := RegisterPeginParams{ + QuoteSignature: []byte{0x01, 0x02, 0x03}, + BitcoinRawTransaction: []byte{0x04, 0x05, 0x06}, + PartialMerkleTree: []byte{0x07, 0x08, 0x09}, + BlockHeight: big.NewInt(1), + Quote: quote.PeginQuote{ + FedBtcAddress: "any address", + LbcAddress: "any address", + LpRskAddress: "any address", + BtcRefundAddress: "any address", + RskRefundAddress: "any address", + LpBtcAddress: "any address", + CallFee: entities.NewWei(3), + PenaltyFee: entities.NewWei(4), + ContractAddress: "any address", + Data: "any data", + GasLimit: 5, + Nonce: 6, + Value: entities.NewWei(2), + AgreementTimestamp: 7, + TimeForDeposit: 8, + LpCallTime: 9, + Confirmations: 10, + CallOnRegister: true, + GasFee: entities.NewWei(1), + ProductFeeAmount: 11, + }, + } + assert.Equal(t, + "RegisterPeginParams { QuoteSignature: 010203, BitcoinRawTransaction: 040506, PartialMerkleTree: 070809, "+ + "BlockHeight: 1, Quote: {FedBtcAddress:any address LbcAddress:any address LpRskAddress:any address "+ + "BtcRefundAddress:any address RskRefundAddress:any address LpBtcAddress:any address CallFee:3 PenaltyFee:4 "+ + "ContractAddress:any address Data:any data GasLimit:5 Nonce:6 Value:2 AgreementTimestamp:7 TimeForDeposit:8 "+ + "LpCallTime:9 Confirmations:10 CallOnRegister:true GasFee:1 ProductFeeAmount:11} }", params.String()) +} diff --git a/internal/entities/blockchain/rootstock_test.go b/internal/entities/blockchain/rootstock_test.go new file mode 100644 index 00000000..3b3a6d36 --- /dev/null +++ b/internal/entities/blockchain/rootstock_test.go @@ -0,0 +1,83 @@ +package blockchain_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestNewTransactionConfig(t *testing.T) { + config := blockchain.NewTransactionConfig(entities.NewWei(1), 2, entities.NewWei(3)) + var value uint64 = 2 + assert.Equal(t, entities.NewWei(1), config.Value) + assert.Equal(t, &value, config.GasLimit) + assert.Equal(t, entities.NewWei(3), config.GasPrice) +} + +func TestIsRskAddress(t *testing.T) { + goodAddresses := []string{ + "0x7C4890A0f1D4bBf2C669Ac2d1efFa185c505359b", + "0x79568c2989232dCa1840087D73d403602364c0D4", + "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", + "0x892813507Bf3aBF2890759d2135Ec34f4909Fea5", + "0x5dE07e2BE63595854C396E2da291e0d1EdE15112", + "0x0D8Fb5d32704DB2931e05DB91F64BcA6f76Ce573", + "0x8dccd82443B80DDdE3690af86746bfd9d766F8D2", + "0xa2011668bd246f9Aa10623f3Cfea704E3b6c0C3b", + "0xBb519e5dCB3f98ED0c48238b42BFa3fd4d1a5E45", + "0xe8d8c8f343522fd53c45c71723B93D735b149220", + } + + badAddresses := []string{ + "mwtKGvtdDno6zzoioQHgWbV9A2i2kbfWcX", + "0xe753be697499877faabae44049e7305afdfccd24fcf8b10f9e16ad0eec4aee6c", + "0xe8d8c8f343522fd53c45c71723B93D735b149220c1", + "0x8dccd82443B80DDdE3690af86746bfd9d766F8", + "0x892813507Bf3aBF2890759d2135Ec34f4909ea5", + "TCNtTa1rveKkovHR2ebABu4K66U6ocUCZX", + } + + for _, address := range goodAddresses { + assert.Truef(t, blockchain.IsRskAddress(address), "Address %s should be valid", address) + } + + for _, address := range badAddresses { + assert.Falsef(t, blockchain.IsRskAddress(address), "Address %s should not be valid", address) + } +} + +func TestDecodeStringTrimPrefix(t *testing.T) { + cases := test.Table[string, []byte]{ + {"0x7C4890A0f1D4bBf2C669Ac2d1efFa185c505359b", []byte{124, 72, 144, 160, 241, 212, 187, 242, 198, 105, 172, 45, 30, 255, 161, 133, 197, 5, 53, 155}}, + {"0x79568c2989232dCa1840087D73d403602364c0D4", []byte{121, 86, 140, 41, 137, 35, 45, 202, 24, 64, 8, 125, 115, 212, 3, 96, 35, 100, 192, 212}}, + {"0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", []byte{213, 240, 10, 191, 190, 167, 160, 177, 147, 131, 108, 172, 104, 51, 194, 173, 157, 6, 206, 168}}, + {"0x892813507Bf3aBF2890759d2135Ec34f4909Fea5", []byte{137, 40, 19, 80, 123, 243, 171, 242, 137, 7, 89, 210, 19, 94, 195, 79, 73, 9, 254, 165}}, + {"0x5dE07e2BE63595854C396E2da291e0d1EdE15112", []byte{93, 224, 126, 43, 230, 53, 149, 133, 76, 57, 110, 45, 162, 145, 224, 209, 237, 225, 81, 18}}, + {"0x0D8Fb5d32704DB2931e05DB91F64BcA6f76Ce573", []byte{13, 143, 181, 211, 39, 4, 219, 41, 49, 224, 93, 185, 31, 100, 188, 166, 247, 108, 229, 115}}, + {"0x8dccd82443B80DDdE3690af86746bfd9d766F8D2", []byte{141, 204, 216, 36, 67, 184, 13, 221, 227, 105, 10, 248, 103, 70, 191, 217, 215, 102, 248, 210}}, + {"0xa2011668bd246f9Aa10623f3Cfea704E3b6c0C3b", []byte{162, 1, 22, 104, 189, 36, 111, 154, 161, 6, 35, 243, 207, 234, 112, 78, 59, 108, 12, 59}}, + {"0xBb519e5dCB3f98ED0c48238b42BFa3fd4d1a5E45", []byte{187, 81, 158, 93, 203, 63, 152, 237, 12, 72, 35, 139, 66, 191, 163, 253, 77, 26, 94, 69}}, + {"0xe8d8c8f343522fd53c45c71723B93D735b149220", []byte{232, 216, 200, 243, 67, 82, 47, 213, 60, 69, 199, 23, 35, 185, 61, 115, 91, 20, 146, 32}}, + } + var bytes []byte + test.RunTable(t, cases, func(address string) []byte { + bytes, _ = blockchain.DecodeStringTrimPrefix(address) + return bytes + }) +} + +func TestDecodeStringTrim_Fail(t *testing.T) { + badAddresses := []string{ + "mwtKGvtdDno6zzoioQHgWbV9A2i2kbfWcX", + "0x892813507Bf3aBF2890759d2135Ec34f4909ea5", + "TCNtTa1rveKkovHR2ebABu4K66U6ocUCZX", + } + + var err error + for _, address := range badAddresses { + _, err = blockchain.DecodeStringTrimPrefix(address) + assert.NotNil(t, err) + } +} diff --git a/internal/entities/common.go b/internal/entities/common.go index 7e4ee100..82a46cd8 100644 --- a/internal/entities/common.go +++ b/internal/entities/common.go @@ -2,11 +2,14 @@ package entities import ( "context" + "errors" "github.com/go-playground/validator/v10" ) var ( - validate = validator.New(validator.WithRequiredStructEnabled()) + DeserializationError = errors.New("error during value deserialization") + SerializationError = errors.New("error during value serialization") + validate = validator.New(validator.WithRequiredStructEnabled()) ) func ValidateStruct(s any) error { diff --git a/internal/entities/event_test.go b/internal/entities/event_test.go new file mode 100644 index 00000000..da7e86ea --- /dev/null +++ b/internal/entities/event_test.go @@ -0,0 +1,14 @@ +package entities_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "testing" +) + +func TestNewBaseEvent(t *testing.T) { + var id entities.EventId = "any id" + var event entities.Event = entities.NewBaseEvent(id) + if event.Id() != id || event.CreationTimestamp().IsZero() { + t.Error("Base event not initialized properly") + } +} diff --git a/internal/entities/liquidity_provider_test.go b/internal/entities/liquidity_provider_test.go new file mode 100644 index 00000000..13082d1d --- /dev/null +++ b/internal/entities/liquidity_provider_test.go @@ -0,0 +1,77 @@ +package entities_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/test" + "testing" +) + +func TestProviderType_IsValid(t *testing.T) { + cases := test.Table[entities.ProviderType, bool]{ + {Value: "pegin", Result: true}, + {Value: "pegout", Result: true}, + {Value: "both", Result: true}, + {Value: "", Result: false}, + {Value: "any value", Result: false}, + } + test.RunTable(t, cases, func(value entities.ProviderType) bool { + return value.IsValid() + }) +} + +func TestProviderType_AcceptsPegin(t *testing.T) { + cases := test.Table[entities.ProviderType, bool]{ + {Value: "pegin", Result: true}, + {Value: "pegout", Result: false}, + {Value: "both", Result: true}, + {Value: "", Result: false}, + {Value: "any value", Result: false}, + } + test.RunTable(t, cases, func(value entities.ProviderType) bool { + return value.AcceptsPegin() + }) +} + +func TestProviderType_AcceptsPegout(t *testing.T) { + cases := test.Table[entities.ProviderType, bool]{ + {Value: "pegin", Result: false}, + {Value: "pegout", Result: true}, + {Value: "both", Result: true}, + {Value: "", Result: false}, + {Value: "any value", Result: false}, + } + test.RunTable(t, cases, func(value entities.ProviderType) bool { + return value.AcceptsPegout() + }) +} + +func TestToProviderType(t *testing.T) { + var err error + var result entities.ProviderType + + errorCases := test.Table[string, error]{ + {Value: "pegin", Result: nil}, + {Value: "pegout", Result: nil}, + {Value: "both", Result: nil}, + {Value: "", Result: entities.InvalidProviderTypeError}, + {Value: "any value", Result: entities.InvalidProviderTypeError}, + } + + valueCases := test.Table[string, entities.ProviderType]{ + {Value: "pegin", Result: entities.PeginProvider}, + {Value: "pegout", Result: entities.PegoutProvider}, + {Value: "both", Result: entities.FullProvider}, + {Value: "", Result: ""}, + {Value: "any value", Result: ""}, + } + + test.RunTable(t, errorCases, func(value string) error { + _, err = entities.ToProviderType(value) + return err + }) + + test.RunTable(t, valueCases, func(value string) entities.ProviderType { + result, _ = entities.ToProviderType(value) + return result + }) +} diff --git a/internal/entities/quote/pegin_quote.go b/internal/entities/quote/pegin_quote.go index 45cf617e..48c07276 100644 --- a/internal/entities/quote/pegin_quote.go +++ b/internal/entities/quote/pegin_quote.go @@ -66,6 +66,15 @@ func (quote *PeginQuote) IsExpired() bool { } func (quote *PeginQuote) Total() *entities.Wei { + if quote.Value == nil { + quote.Value = entities.NewWei(0) + } + if quote.CallFee == nil { + quote.CallFee = entities.NewWei(0) + } + if quote.GasFee == nil { + quote.GasFee = entities.NewWei(0) + } total := new(entities.Wei) total.Add(total, quote.Value) total.Add(total, quote.CallFee) diff --git a/internal/entities/quote/pegin_quote_test.go b/internal/entities/quote/pegin_quote_test.go new file mode 100644 index 00000000..aad183ff --- /dev/null +++ b/internal/entities/quote/pegin_quote_test.go @@ -0,0 +1,180 @@ +package quote_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" + "time" +) + +func TestPeginQuote_Total(t *testing.T) { + var result *entities.Wei + quotes := test.Table[quote.PeginQuote, *entities.Wei]{ + { + Value: quote.PeginQuote{ + FedBtcAddress: "any addrees", + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + PenaltyFee: entities.NewWei(1), + ContractAddress: "any addrees", + Data: "", + GasLimit: 1, + Nonce: 1, + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: 1, + TimeForDeposit: 1, + LpCallTime: 1, + Confirmations: 1, + CallOnRegister: false, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: entities.NewWei(700000000000000000), + }, + { + Value: quote.PeginQuote{ + FedBtcAddress: "any addrees", + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: entities.NewWei(1), + ContractAddress: "any addrees", + Data: "", + GasLimit: 1, + Nonce: 1, + AgreementTimestamp: 1, + TimeForDeposit: 1, + LpCallTime: 1, + Confirmations: 1, + CallOnRegister: false, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: entities.NewWei(600000000000000000), + }, + { + Value: quote.PeginQuote{ + FedBtcAddress: "any addrees", + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: entities.NewWei(1), + ContractAddress: "any addrees", + Data: "", + GasLimit: 1, + Nonce: 1, + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: 1, + TimeForDeposit: 1, + LpCallTime: 1, + Confirmations: 1, + CallOnRegister: false, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 0, + }, + Result: entities.NewWei(800000000000000000), + }, + { + Value: quote.PeginQuote{ + FedBtcAddress: "any addrees", + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: entities.NewWei(1), + ContractAddress: "any addrees", + Data: "", + GasLimit: 1, + Nonce: 1, + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: 1, + TimeForDeposit: 1, + LpCallTime: 1, + Confirmations: 1, + CallOnRegister: false, + ProductFeeAmount: 200000000000000000, + }, + Result: entities.NewWei(900000000000000000), + }, + } + test.RunTable(t, quotes, func(value quote.PeginQuote) *entities.Wei { + result = value.Total() + assert.NotNil(t, value.Value) + assert.NotNil(t, value.CallFee) + assert.NotNil(t, value.GasFee) + return result + }) +} + +func TestPeginQuote_IsExpired(t *testing.T) { + now := time.Now().Unix() + + quotes := test.Table[quote.PeginQuote, bool]{ + { + Value: quote.PeginQuote{ + FedBtcAddress: "any addrees", + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(0), + PenaltyFee: entities.NewWei(1), + ContractAddress: "any addrees", + Data: "", + GasLimit: 1, + Nonce: 1, + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: uint32(now - 61), + TimeForDeposit: uint32(time.Minute.Seconds()), + LpCallTime: 1, + Confirmations: 1, + CallOnRegister: false, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: true, + }, + { + Value: quote.PeginQuote{ + FedBtcAddress: "any addrees", + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: entities.NewWei(1), + ContractAddress: "any addrees", + Data: "", + GasLimit: 1, + Nonce: 1, + Value: entities.NewWei(0), + AgreementTimestamp: uint32(now), + TimeForDeposit: uint32(time.Minute.Seconds()), + LpCallTime: 1, + Confirmations: 1, + CallOnRegister: false, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: false, + }, + } + test.RunTable(t, quotes, func(value quote.PeginQuote) bool { + return value.IsExpired() + }) +} diff --git a/internal/entities/quote/pegout_quote.go b/internal/entities/quote/pegout_quote.go index b2f225bc..d77d28d6 100644 --- a/internal/entities/quote/pegout_quote.go +++ b/internal/entities/quote/pegout_quote.go @@ -3,6 +3,7 @@ package quote import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "time" ) @@ -69,10 +70,19 @@ func (quote *PegoutQuote) IsExpired() bool { } func GetCreationBlock(lp entities.PegoutLiquidityProvider, pegoutQuote PegoutQuote) uint64 { - return uint64(pegoutQuote.ExpireBlock) - lp.ExpireBlocksPegout() + return utils.SafeSub(uint64(pegoutQuote.ExpireBlock), lp.ExpireBlocksPegout()) } func (quote *PegoutQuote) Total() *entities.Wei { + if quote.Value == nil { + quote.Value = entities.NewWei(0) + } + if quote.CallFee == nil { + quote.CallFee = entities.NewWei(0) + } + if quote.GasFee == nil { + quote.GasFee = entities.NewWei(0) + } total := new(entities.Wei) total.Add(total, quote.Value) total.Add(total, quote.CallFee) @@ -110,8 +120,9 @@ type PegoutDeposit struct { func (deposit *PegoutDeposit) IsValidForQuote(quote PegoutQuote) bool { enoughAmount := deposit.Amount.Cmp(quote.Total()) >= 0 - nonExpired := deposit.Timestamp.Before(quote.ExpireTime()) - return enoughAmount && nonExpired + nonExpiredInTime := deposit.Timestamp.Before(quote.ExpireTime()) + nonExpiredInBlocks := deposit.BlockNumber <= uint64(quote.ExpireBlock) + return enoughAmount && nonExpiredInTime && nonExpiredInBlocks } type PegoutQuoteCompletedEvent struct { diff --git a/internal/entities/quote/pegout_quote_test.go b/internal/entities/quote/pegout_quote_test.go new file mode 100644 index 00000000..71310a8e --- /dev/null +++ b/internal/entities/quote/pegout_quote_test.go @@ -0,0 +1,303 @@ +package quote_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" + "time" +) + +type LpMock struct { + mock.Mock + entities.PegoutLiquidityProvider +} + +func (l *LpMock) ExpireBlocksPegout() uint64 { + return 40 +} + +func TestPegoutQuote_Total(t *testing.T) { + var result *entities.Wei + quotes := test.Table[quote.PegoutQuote, *entities.Wei]{ + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: 1, + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: 1, + ExpireBlock: 1, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: entities.NewWei(700000000000000000), + }, + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + AgreementTimestamp: 1, + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: 1, + ExpireBlock: 1, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: entities.NewWei(600000000000000000), + }, + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: 1, + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: 1, + ExpireBlock: 1, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 0, + }, + Result: entities.NewWei(800000000000000000), + }, + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(400000000000000000), + AgreementTimestamp: 1, + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: 1, + ExpireBlock: 1, + ProductFeeAmount: 200000000000000000, + }, + Result: entities.NewWei(900000000000000000), + }, + } + test.RunTable(t, quotes, func(value quote.PegoutQuote) *entities.Wei { + result = value.Total() + assert.NotNil(t, value.Value) + assert.NotNil(t, value.CallFee) + assert.NotNil(t, value.GasFee) + return result + }) +} + +func TestPegoutQuote_IsExpired(t *testing.T) { + now := time.Now().Unix() + + quotes := test.Table[quote.PegoutQuote, bool]{ + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(0), + AgreementTimestamp: uint32(now), + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: uint32(now - 61), + ExpireBlock: 1, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: true, + }, + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(0), + AgreementTimestamp: uint32(now), + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: uint32(now + 60), + ExpireBlock: 1, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: false, + }, + } + test.RunTable(t, quotes, func(value quote.PegoutQuote) bool { + return value.IsExpired() + }) +} + +func TestGetCreationBlock(t *testing.T) { + quotes := test.Table[quote.PegoutQuote, uint64]{ + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(0), + AgreementTimestamp: 1, + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: 1, + ExpireBlock: 40, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: 0, + }, + { + Value: quote.PegoutQuote{ + LbcAddress: "any addrees", + LpRskAddress: "any addrees", + BtcRefundAddress: "any addrees", + RskRefundAddress: "any addrees", + LpBtcAddress: "any addrees", + CallFee: entities.NewWei(300000000000000000), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "any addrees", + Value: entities.NewWei(0), + AgreementTimestamp: 1, + DepositDateLimit: 1, + DepositConfirmations: 1, + TransferTime: 1, + TransferConfirmations: 1, + ExpireDate: 1, + ExpireBlock: 380, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, + }, + Result: 340, + }, + } + + lp := &LpMock{} + test.RunTable(t, quotes, func(value quote.PegoutQuote) uint64 { + return quote.GetCreationBlock(lp, value) + }) +} + +func TestPegoutDeposit_IsValidForQuote(t *testing.T) { + now := time.Now() + pegoutQuote := quote.PegoutQuote{ + ExpireBlock: 500, + ExpireDate: uint32(now.Unix()) + 60, + Value: entities.NewWei(200000000000000000), + CallFee: entities.NewWei(100000000000000000), + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 100000000000000000, + } + cases := test.Table[quote.PegoutDeposit, bool]{ + { + Value: quote.PegoutDeposit{ + TxHash: "any hash", + QuoteHash: "any hash", + Amount: entities.NewWei(490000000000000000), + Timestamp: now, + BlockNumber: 499, + From: "any address", + }, + Result: false, + }, + { + Value: quote.PegoutDeposit{ + TxHash: "any hash", + QuoteHash: "any hash", + Amount: entities.NewWei(5100000000000000000), + Timestamp: time.Unix(now.Unix()+61, 0), + BlockNumber: 499, + From: "any address", + }, + Result: false, + }, + { + Value: quote.PegoutDeposit{ + TxHash: "any hash", + QuoteHash: "any hash", + Amount: entities.NewWei(5100000000000000000), + Timestamp: now, + BlockNumber: 501, + From: "any address", + }, + Result: false, + }, + { + Value: quote.PegoutDeposit{ + TxHash: "any hash", + QuoteHash: "any hash", + Amount: entities.NewWei(5100000000000000000), + Timestamp: now, + BlockNumber: 499, + From: "any address", + }, + Result: true, + }, + } + test.RunTable(t, cases, func(value quote.PegoutDeposit) bool { + return value.IsValidForQuote(pegoutQuote) + }) +} diff --git a/internal/entities/utils/math.go b/internal/entities/utils/math.go new file mode 100644 index 00000000..6bdefcdb --- /dev/null +++ b/internal/entities/utils/math.go @@ -0,0 +1,28 @@ +package utils + +import ( + "errors" + "math" +) + +var OverFlowError = errors.New("uint overflow") + +func SafeSub(a, b uint64) uint64 { + if a < b { + return 0 + } + return a - b +} + +func SafeAdd(a, b uint64) (uint64, error) { + var highest, lowest uint64 + if a > b { + highest, lowest = a, b + } else { + highest, lowest = b, a + } + if lowest > math.MaxUint64-highest { + return 0, OverFlowError + } + return a + b, nil +} diff --git a/internal/entities/utils/math_test.go b/internal/entities/utils/math_test.go new file mode 100644 index 00000000..c5028334 --- /dev/null +++ b/internal/entities/utils/math_test.go @@ -0,0 +1,55 @@ +package utils_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/test" + "math" + "testing" +) + +func TestSafeSub(t *testing.T) { + type args struct{ A, B uint64 } + cases := test.Table[args, uint64]{ + {Value: args{A: 7, B: 2}, Result: 5}, + {Value: args{A: 2, B: 7}, Result: 0}, + {Value: args{A: 7, B: 7}, Result: 0}, + {Value: args{A: 0, B: 0}, Result: 0}, + {Value: args{A: 5, B: math.MaxUint64}, Result: 0}, + {Value: args{A: math.MaxUint64, B: 1<<64 - 2}, Result: 1}, + } + test.RunTable(t, cases, func(value args) uint64 { + return utils.SafeSub(value.A, value.B) + }) +} + +func TestSafeAdd(t *testing.T) { + var err error + var result uint64 + type args struct{ A, B uint64 } + errorCases := test.Table[args, error]{ + {Value: args{A: 7, B: 2}, Result: nil}, + {Value: args{A: 2, B: 7}, Result: nil}, + {Value: args{A: 0, B: 0}, Result: nil}, + {Value: args{A: 1, B: math.MaxUint64}, Result: utils.OverFlowError}, + {Value: args{A: math.MaxUint64, B: 1}, Result: utils.OverFlowError}, + {Value: args{A: math.MaxUint64, B: math.MaxUint64}, Result: utils.OverFlowError}, + } + + successCases := test.Table[args, uint64]{ + {Value: args{A: 1<<64 - 2, B: 1}, Result: math.MaxUint64}, + {Value: args{A: 7, B: 2}, Result: 9}, + {Value: args{A: 2, B: 7}, Result: 9}, + {Value: args{A: 0, B: 0}, Result: 0}, + {Value: args{A: 1, B: math.MaxUint64}, Result: 0}, + {Value: args{A: math.MaxUint64, B: 1}, Result: 0}, + {Value: args{A: math.MaxUint64, B: math.MaxUint64}, Result: 0}, + } + test.RunTable(t, errorCases, func(value args) error { + _, err = utils.SafeAdd(value.A, value.B) + return err + }) + test.RunTable(t, successCases, func(value args) uint64 { + result, _ = utils.SafeAdd(value.A, value.B) + return result + }) +} diff --git a/internal/entities/wei.go b/internal/entities/wei.go index fd5e7a54..5596fd2f 100644 --- a/internal/entities/wei.go +++ b/internal/entities/wei.go @@ -104,7 +104,7 @@ func (w *Wei) UnmarshalJSON(bytes []byte) error { func (w *Wei) MarshalBSONValue() (bsontype.Type, []byte, error) { if w == nil { - return bson.TypeInt64, make([]byte, 0), errors.New("trying to marshal nil wei pointer") + return bson.TypeInt64, make([]byte, 0), SerializationError } value := make([]byte, 8) binary.LittleEndian.PutUint64(value, w.Uint64()) @@ -112,8 +112,8 @@ func (w *Wei) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (w *Wei) UnmarshalBSONValue(bsonType bsontype.Type, bytes []byte) error { - if bsonType != bson.TypeInt64 { - return errors.New("trying to unmarshal something that is not int64 into Wei") + if w == nil || bsonType != bson.TypeInt64 { + return DeserializationError } slices.Reverse(bytes) w.AsBigInt().SetBytes(bytes) diff --git a/internal/entities/wei_test.go b/internal/entities/wei_test.go index 15dd3767..a71d1dc7 100644 --- a/internal/entities/wei_test.go +++ b/internal/entities/wei_test.go @@ -3,6 +3,11 @@ package entities_test import ( "database/sql/driver" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsontype" "math" "math/big" "reflect" @@ -427,3 +432,42 @@ func TestWei_UnmarshalJSON(t *testing.T) { }) } } + +func TestWei_UnmarshalBSONValue(t *testing.T) { + errorCases := test.Table[bsontype.Type, error]{ + {bson.TypeInt64, nil}, + {bson.TypeString, entities.DeserializationError}, + {bson.TypeDBPointer, entities.DeserializationError}, + {bson.TypeBinary, entities.DeserializationError}, + {bson.TypeDouble, entities.DeserializationError}, + } + + type result struct { + err error + bytes []byte + } + successCases := test.Table[*entities.Wei, result]{ + {nil, result{err: entities.SerializationError, bytes: make([]byte, 0)}}, + {entities.NewWei(5), result{nil, []byte{5, 0, 0, 0, 0, 0, 0, 0}}}, + {entities.NewWei(77), result{nil, []byte{77, 0, 0, 0, 0, 0, 0, 0}}}, + {entities.NewWei(5678), result{nil, []byte{46, 22, 0, 0, 0, 0, 0, 0}}}, + {entities.NewWei(math.MaxInt64 - 500), result{nil, []byte{11, 254, 255, 255, 255, 255, 255, 127}}}, + {entities.NewWei(math.MaxInt64), result{nil, []byte{255, 255, 255, 255, 255, 255, 255, 127}}}, + } + + var nilWei *entities.Wei + var err error + var bytes []byte + var bsonTypeResult bsontype.Type + weiValue := entities.NewWei(1) + require.ErrorIs(t, nilWei.UnmarshalBSONValue(bson.TypeInt64, []byte{}), entities.DeserializationError) + test.RunTable(t, errorCases, func(bsonType bsontype.Type) error { + return weiValue.UnmarshalBSONValue(bsonType, []byte{}) + }) + test.RunTable(t, successCases, func(value *entities.Wei) result { + bsonTypeResult, bytes, err = value.MarshalBSONValue() + assert.Equal(t, bson.TypeInt64, bsonTypeResult) + return result{err, bytes} + }) + +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go index 100d37c2..7a87855a 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -48,7 +48,7 @@ const ( var ( NonRecoverableError = errors.New("non recoverable") - TxBelowMinimumError = errors.New("requested amount below bridge's min pegin transaction value") + TxBelowMinimumError = errors.New("requested amount below bridge's min transaction value") BtcAddressNotSupportedError = errors.New("btc address not supported") RskAddressNotSupportedError = errors.New("rsk address not supported") QuoteNotFoundError = errors.New("quote not found") @@ -121,14 +121,14 @@ func CalculateDaoAmounts(ctx context.Context, rsk blockchain.RootstockRpcServer, func ValidateMinLockValue(useCase UseCaseId, bridge blockchain.RootstockBridge, value *entities.Wei) error { var err error - var minLockTxValueInSatoshi *entities.Wei + var minLockTxValue *entities.Wei errorArgs := NewErrorArgs() - if minLockTxValueInSatoshi, err = bridge.GetMinimumLockTxValue(); err != nil { + if minLockTxValue, err = bridge.GetMinimumLockTxValue(); err != nil { return WrapUseCaseError(useCase, err) } - if minimumInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()); value.Cmp(minimumInWei) <= 0 { - errorArgs["minimum"] = minimumInWei.String() + if value.Cmp(minLockTxValue) < 0 { + errorArgs["minimum"] = minLockTxValue.String() errorArgs["value"] = value.String() return WrapUseCaseErrorArgs(useCase, TxBelowMinimumError, errorArgs) } diff --git a/internal/usecases/health.go b/internal/usecases/health.go index 1a53a8db..d9d04e78 100644 --- a/internal/usecases/health.go +++ b/internal/usecases/health.go @@ -6,9 +6,9 @@ import ( ) const ( - svcStatusOk = "ok" - svcStatusDegraded = "degraded" - svcStatusUnreachable = "unreachable" + SvcStatusOk = "ok" + SvcStatusDegraded = "degraded" + SvcStatusUnreachable = "unreachable" ) type HealthUseCase struct { @@ -21,32 +21,34 @@ func NewHealthUseCase(rsk entities.Service, btc entities.Service, db entities.Se return &HealthUseCase{rsk: rsk, btc: btc, db: db} } +type Services struct { + Db string + Rsk string + Btc string +} + type HealthStatus struct { Status string - Services struct { - Db string - Rsk string - Btc string - } + Services Services } func (useCase *HealthUseCase) Run(ctx context.Context) HealthStatus { - lpsSvcStatus := svcStatusOk - dbSvcStatus := svcStatusOk - rskSvcStatus := svcStatusOk - btcSvcStatus := svcStatusOk + lpsSvcStatus := SvcStatusOk + dbSvcStatus := SvcStatusOk + rskSvcStatus := SvcStatusOk + btcSvcStatus := SvcStatusOk if !useCase.db.CheckConnection(ctx) { - dbSvcStatus = svcStatusUnreachable - lpsSvcStatus = svcStatusDegraded + dbSvcStatus = SvcStatusUnreachable + lpsSvcStatus = SvcStatusDegraded } if !useCase.btc.CheckConnection(ctx) { - btcSvcStatus = svcStatusUnreachable - lpsSvcStatus = svcStatusDegraded + btcSvcStatus = SvcStatusUnreachable + lpsSvcStatus = SvcStatusDegraded } if !useCase.rsk.CheckConnection(ctx) { - rskSvcStatus = svcStatusUnreachable - lpsSvcStatus = svcStatusDegraded + rskSvcStatus = SvcStatusUnreachable + lpsSvcStatus = SvcStatusDegraded } return HealthStatus{ diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index ea30ef39..f8649275 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -128,7 +128,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { var err error args := usecases.NewErrorArgs() - if !blockchain.IsLegacyBtcAddress(request.bitcoinRefundAddress) { + if !blockchain.IsSupportedBtcAddress(request.bitcoinRefundAddress) { args["btcAddress"] = request.bitcoinRefundAddress return args, usecases.BtcAddressNotSupportedError } else if !blockchain.IsRskAddress(request.rskRefundAddress) { diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index 8cbf707a..66b9d59f 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -124,10 +124,10 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { var err error errorArgs := usecases.NewErrorArgs() - if !blockchain.IsLegacyBtcAddress(request.to) { + if !blockchain.IsSupportedBtcAddress(request.to) { errorArgs["btcAddress"] = request.to return errorArgs, usecases.BtcAddressNotSupportedError - } else if !blockchain.IsLegacyBtcAddress(request.bitcoinRefundAddress) { + } else if !blockchain.IsSupportedBtcAddress(request.bitcoinRefundAddress) { errorArgs["btcAddress"] = request.bitcoinRefundAddress return errorArgs, usecases.BtcAddressNotSupportedError } else if !blockchain.IsRskAddress(request.rskRefundAddress) { diff --git a/test/utils.go b/test/utils.go new file mode 100644 index 00000000..b5a99a2f --- /dev/null +++ b/test/utils.go @@ -0,0 +1,21 @@ +package test + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +type Case[V, R any] struct { + Value V + Result R +} + +type Table[V, R any] []Case[V, R] + +func RunTable[V, R any](t *testing.T, table Table[V, R], validationFunction func(V) R) { + var result R + for _, testCase := range table { + result = validationFunction(testCase.Value) + assert.Equal(t, testCase.Result, result) + } +} From 095461e4b5b5430d18b2cae2847c11da9d206675 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 7 Feb 2024 20:32:14 -0300 Subject: [PATCH 011/113] feat: test for general and liquidity provider usecases --- Makefile | 9 + internal/configuration/registry/usecase.go | 3 + internal/entities/blockchain/bitcoin_test.go | 1 - internal/entities/quote/pegout_quote.go | 2 +- internal/usecases/common.go | 1 + internal/usecases/common_test.go | 124 ++++++++++ internal/usecases/health_test.go | 85 +++++++ .../liquidity_provider/change_status.go | 4 + .../liquidity_provider/change_status_test.go | 60 +++++ .../liquidity_provider/check_liquidity.go | 16 +- .../check_liquidity_test.go | 155 ++++++++++++ .../liquidity_provider/common_test.go | 73 ++++++ .../liquidity_provider/get_providers_test.go | 47 ++++ .../liquidity_provider/penalization_alert.go | 3 +- .../penalization_alert_test.go | 70 ++++++ .../provider_detail_test.go | 92 ++++++++ .../liquidity_provider/registration.go | 48 +++- .../liquidity_provider/registration_test.go | 223 ++++++++++++++++++ .../liquidity_provider/resign_test.go | 60 +++++ test/lbc_mock.go | 155 ++++++++++++ 20 files changed, 1213 insertions(+), 18 deletions(-) create mode 100644 internal/usecases/common_test.go create mode 100644 internal/usecases/health_test.go create mode 100644 internal/usecases/liquidity_provider/change_status_test.go create mode 100644 internal/usecases/liquidity_provider/check_liquidity_test.go create mode 100644 internal/usecases/liquidity_provider/common_test.go create mode 100644 internal/usecases/liquidity_provider/get_providers_test.go create mode 100644 internal/usecases/liquidity_provider/penalization_alert_test.go create mode 100644 internal/usecases/liquidity_provider/provider_detail_test.go create mode 100644 internal/usecases/liquidity_provider/registration_test.go create mode 100644 internal/usecases/liquidity_provider/resign_test.go create mode 100644 test/lbc_mock.go diff --git a/Makefile b/Makefile index 85979694..cee12cad 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +.PHONY: test + tools: download go install github.com/parvez3019/go-swagger3@latest go install golang.org/x/vuln/cmd/govulncheck@latest @@ -34,5 +36,12 @@ coverage: clean go tool cover -html="coverage/cover.out" rm coverage/cover.out +test: clean + mkdir coverage + go test -v -race -covermode=atomic ./... + go test -v -race -covermode=atomic -coverpkg=./... -coverprofile=coverage/cover.out ./... + go tool cover -func "coverage/cover.out" + rm coverage/cover.out + clean: rm -rf build coverage diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index f51fbc63..0ce33699 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -160,12 +160,15 @@ func NewUseCaseRegistry( liquidityProvider, rskRegistry.Bridge, alertSender, + env.Provider.AlertRecipientEmail, ), penalizationAlertUseCase: liquidity_provider.NewPenalizationAlertUseCase( rskRegistry.Lbc, alertSender, env.Provider.AlertRecipientEmail, ), + changeStatusUseCase: liquidity_provider.NewChangeStatusUseCase(rskRegistry.Lbc, liquidityProvider), + resignUseCase: liquidity_provider.NewResignUseCase(rskRegistry.Lbc, liquidityProvider), getProvidersUseCase: liquidity_provider.NewGetProvidersUseCase(rskRegistry.Lbc), getPeginCollateralUseCase: pegin.NewGetCollateralUseCase(rskRegistry.Lbc, liquidityProvider), getPegoutCollateralUseCase: pegout.NewGetCollateralUseCase(rskRegistry.Lbc, liquidityProvider), diff --git a/internal/entities/blockchain/bitcoin_test.go b/internal/entities/blockchain/bitcoin_test.go index fbd64022..d52f451f 100644 --- a/internal/entities/blockchain/bitcoin_test.go +++ b/internal/entities/blockchain/bitcoin_test.go @@ -326,4 +326,3 @@ func TestIsSupportedBtcAddress(t *testing.T) { assert.Truef(t, blockchain.IsSupportedBtcAddress(address), "Address %s should be supported", address) } } - diff --git a/internal/entities/quote/pegout_quote.go b/internal/entities/quote/pegout_quote.go index d77d28d6..656fec9e 100644 --- a/internal/entities/quote/pegout_quote.go +++ b/internal/entities/quote/pegout_quote.go @@ -58,7 +58,7 @@ type PegoutQuote struct { ExpireDate uint32 `json:"expireDate" bson:"expire_date" validate:"required"` ExpireBlock uint32 `json:"expireBlocks" bson:"expire_blocks" validate:"required"` GasFee *entities.Wei `json:"gasFee" bson:"gas_fee" validate:"required"` - ProductFeeAmount uint64 `json:"productFeeAmount" bson:"product_fee_amount" validate:"required"` + ProductFeeAmount uint64 `json:"productFeeAmount" bson:"product_fee_amount" validate:""` } func (quote *PegoutQuote) ExpireTime() time.Time { diff --git a/internal/usecases/common.go b/internal/usecases/common.go index 7a87855a..acf5da98 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -44,6 +44,7 @@ const ( UpdatePegoutDepositId UseCaseId = "UpdatePegoutDeposit" InitPegoutDepositCacheId UseCaseId = "InitPegoutDepositCache" CheckLiquidityId UseCaseId = "CheckLiquidity" + PenalizationId UseCaseId = "Penalization" ) var ( diff --git a/internal/usecases/common_test.go b/internal/usecases/common_test.go new file mode 100644 index 00000000..15e0000b --- /dev/null +++ b/internal/usecases/common_test.go @@ -0,0 +1,124 @@ +package usecases_test + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + u "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "slices" + "testing" +) + +type rpcMock struct { + mock.Mock + blockchain.RootstockRpcServer +} + +func (m *rpcMock) EstimateGas(ctx context.Context, addr string, value *entities.Wei, data []byte) (*entities.Wei, error) { + args := m.Called(ctx, addr, value, data) + return args.Get(0).(*entities.Wei), args.Error(1) +} + +type bridgeMock struct { + mock.Mock + blockchain.RootstockBridge +} + +func (m *bridgeMock) GetMinimumLockTxValue() (*entities.Wei, error) { + args := m.Called() + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func TestCalculateDaoAmounts(t *testing.T) { + type testArgs struct { + value *entities.Wei + percentage uint64 + } + rpc := rpcMock{} + rpc.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(entities.NewWei(500000000000000), nil) + + ctx := context.Background() + feeCollectorAddress := "0x1234" + + cases := test.Table[testArgs, u.DaoAmounts]{ + { + testArgs{entities.NewWei(1000000000000000000), 0}, + u.DaoAmounts{}, + }, + { + testArgs{entities.NewWei(500000000000000000), 50}, + u.DaoAmounts{ + DaoGasAmount: entities.NewWei(500000000000000), + DaoFeeAmount: entities.NewWei(250000000000000000), + }, + }, + { + testArgs{entities.NewWei(6000000000000000000), 1}, + u.DaoAmounts{ + DaoGasAmount: entities.NewWei(500000000000000), + DaoFeeAmount: entities.NewWei(60000000000000000), + }, + }, + { + testArgs{entities.NewWei(7700000000000000000), 17}, + u.DaoAmounts{ + DaoGasAmount: entities.NewWei(500000000000000), + DaoFeeAmount: entities.NewWei(1309000000000000000), + }, + }, + } + + test.RunTable(t, cases, func(args testArgs) u.DaoAmounts { + amounts, _ := u.CalculateDaoAmounts(ctx, &rpc, args.value, args.percentage, feeCollectorAddress) + return amounts + }) + +} + +func TestCalculateDaoAmounts_Fail(t *testing.T) { + ctx := context.Background() + rpc := rpcMock{} + rpc.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(entities.NewWei(0), errors.New("some error")) + result, err := u.CalculateDaoAmounts(ctx, &rpc, entities.NewUWei(500000000000000), 1, "0x1234") + require.Equal(t, u.DaoAmounts{}, result) + require.NotNil(t, err) +} + +func TestGetRandomInt(t *testing.T) { + var numbers []int64 + var number int64 + var err error + for i := 0; i < 100; i++ { + number, err = u.GetRandomInt() + assert.Positive(t, number) + assert.False(t, slices.Contains(numbers, number)) + assert.Nil(t, err) + numbers = append(numbers, number) + } +} + +func TestValidateMinLockValue(t *testing.T) { + var oneBtcInSatoshi uint64 = 1 * bitcoin.BtcToSatoshi + var useCase u.UseCaseId = "anyUseCase" + bridge := &bridgeMock{} + bridge.On("GetMinimumLockTxValue").Return(entities.SatoshiToWei(oneBtcInSatoshi), nil) + + err := u.ValidateMinLockValue(useCase, bridge, entities.SatoshiToWei(oneBtcInSatoshi)) + assert.Nil(t, err) + + err = u.ValidateMinLockValue(useCase, bridge, entities.SatoshiToWei(oneBtcInSatoshi+1)) + assert.Nil(t, err) + + value := new(entities.Wei).Sub(entities.SatoshiToWei(oneBtcInSatoshi), entities.NewWei(1)) + err = u.ValidateMinLockValue(useCase, bridge, value) + assert.NotNil(t, err) + assert.Equal(t, "anyUseCase: requested amount below bridge's min transaction value. Args: {\"minimum\":\"1000000000000000000\",\"value\":\"999999999999999999\"}", err.Error()) +} diff --git a/internal/usecases/health_test.go b/internal/usecases/health_test.go new file mode 100644 index 00000000..82f71b5d --- /dev/null +++ b/internal/usecases/health_test.go @@ -0,0 +1,85 @@ +package usecases_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + u "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +type serviceMock struct { + mock.Mock + entities.Service + Fail bool +} + +func (m *serviceMock) CheckConnection(ctx context.Context) bool { + return !m.Fail +} + +func TestHealthUseCase_Run(t *testing.T) { + ctx := context.Background() + rsk := &serviceMock{} + btc := &serviceMock{} + db := &serviceMock{} + + useCase := u.NewHealthUseCase(rsk, btc, db) + + rsk.Fail = true + btc.Fail = false + db.Fail = false + badHealthRsk := useCase.Run(ctx) + + rsk.Fail = false + btc.Fail = true + db.Fail = false + badHealthBtc := useCase.Run(ctx) + + rsk.Fail = false + btc.Fail = false + db.Fail = true + badHealthDb := useCase.Run(ctx) + + rsk.Fail = false + btc.Fail = false + db.Fail = false + healthOk := useCase.Run(ctx) + + assert.Equal(t, u.HealthStatus{ + Status: u.SvcStatusDegraded, + Services: u.Services{ + Rsk: u.SvcStatusUnreachable, + Btc: u.SvcStatusOk, + Db: u.SvcStatusOk, + }, + }, badHealthRsk) + + assert.Equal(t, u.HealthStatus{ + Status: u.SvcStatusDegraded, + Services: u.Services{ + Rsk: u.SvcStatusOk, + Btc: u.SvcStatusUnreachable, + Db: u.SvcStatusOk, + }, + }, badHealthBtc) + + assert.Equal(t, u.HealthStatus{ + Status: u.SvcStatusDegraded, + Services: u.Services{ + Rsk: u.SvcStatusOk, + Btc: u.SvcStatusOk, + Db: u.SvcStatusUnreachable, + }, + }, badHealthDb) + + assert.Equal(t, u.HealthStatus{ + Status: u.SvcStatusOk, + Services: u.Services{ + Rsk: u.SvcStatusOk, + Btc: u.SvcStatusOk, + Db: u.SvcStatusOk, + }, + }, healthOk) +} diff --git a/internal/usecases/liquidity_provider/change_status.go b/internal/usecases/liquidity_provider/change_status.go index 076ce284..11b48395 100644 --- a/internal/usecases/liquidity_provider/change_status.go +++ b/internal/usecases/liquidity_provider/change_status.go @@ -11,6 +11,10 @@ type ChangeStatusUseCase struct { provider entities.LiquidityProvider } +func NewChangeStatusUseCase(lbc blockchain.LiquidityBridgeContract, provider entities.LiquidityProvider) *ChangeStatusUseCase { + return &ChangeStatusUseCase{lbc: lbc, provider: provider} +} + func (useCase *ChangeStatusUseCase) Run(newStatus bool) error { var err error var id uint64 diff --git a/internal/usecases/liquidity_provider/change_status_test.go b/internal/usecases/liquidity_provider/change_status_test.go new file mode 100644 index 00000000..9f70b467 --- /dev/null +++ b/internal/usecases/liquidity_provider/change_status_test.go @@ -0,0 +1,60 @@ +package liquidity_provider_test + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestChangeStatusUseCase_Run(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + { + Id: 1, + Address: "0x01", + }, + { + Id: 2, + Address: "0x02", + }, + { + Id: 3, + Address: "0x03", + }, + }, nil).Once() + lbc.On("SetProviderStatus", uint64(2), false).Return(nil).Once() + + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("0x02") + + err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) + + lbc.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestChangeStatusUseCase_Run_Fail(t *testing.T) { + lbc := &test.LbcMock{} + provider := &test.ProviderMock{} + + lbc.On("GetProviders").Return( + []entities.RegisteredLiquidityProvider{}, + errors.New("some error"), + ).Once() + err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) + lbc.AssertExpectations(t) + assert.NotNil(t, err) + + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + {Id: 1, Address: "0x01"}, + }, nil).Once() + provider.On("RskAddress").Return("0x01") + lbc.On("SetProviderStatus", mock.Anything, mock.Anything).Return(errors.New("some error")).Once() + err = liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) + lbc.AssertExpectations(t) + assert.NotNil(t, err) +} diff --git a/internal/usecases/liquidity_provider/check_liquidity.go b/internal/usecases/liquidity_provider/check_liquidity.go index 7624b9be..31a017e7 100644 --- a/internal/usecases/liquidity_provider/check_liquidity.go +++ b/internal/usecases/liquidity_provider/check_liquidity.go @@ -27,8 +27,20 @@ type CheckLiquidityUseCase struct { recipient string } -func NewCheckLiquidityUseCase(peginProvider entities.PeginLiquidityProvider, pegoutProvider entities.PegoutLiquidityProvider, bridge blockchain.RootstockBridge, alertSender entities.AlertSender) *CheckLiquidityUseCase { - return &CheckLiquidityUseCase{peginProvider: peginProvider, pegoutProvider: pegoutProvider, bridge: bridge, alertSender: alertSender} +func NewCheckLiquidityUseCase( + peginProvider entities.PeginLiquidityProvider, + pegoutProvider entities.PegoutLiquidityProvider, + bridge blockchain.RootstockBridge, + alertSender entities.AlertSender, + recipient string, +) *CheckLiquidityUseCase { + return &CheckLiquidityUseCase{ + peginProvider: peginProvider, + pegoutProvider: pegoutProvider, + bridge: bridge, + alertSender: alertSender, + recipient: recipient, + } } func (useCase *CheckLiquidityUseCase) Run(ctx context.Context) error { diff --git a/internal/usecases/liquidity_provider/check_liquidity_test.go b/internal/usecases/liquidity_provider/check_liquidity_test.go new file mode 100644 index 00000000..29a159ee --- /dev/null +++ b/internal/usecases/liquidity_provider/check_liquidity_test.go @@ -0,0 +1,155 @@ +package liquidity_provider_test + +import ( + "bytes" + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestCheckLiquidityUseCase_Run(t *testing.T) { + bridge := &test.BridgeMock{} + provider := &test.ProviderMock{} + alertSender := &test.AlertSenderMock{} + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, alertSender, "recipient") + err := useCase.Run(context.Background()) + bridge.AssertExpectations(t) + provider.AssertExpectations(t) + alertSender.AssertNotCalled(t, "SendAlert") + assert.Nil(t, err) +} + +func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { + bridge := &test.BridgeMock{} + provider := &test.ProviderMock{} + alertSender := &test.AlertSenderMock{} + recipient := "recipient@test.com" + alertSender.On("SendAlert", + mock.AnythingOfType("context.backgroundCtx"), + "PegIn: Out of liquidity", + "You are out of liquidity to perform a PegIn. Please, do a deposit", + []string{recipient}, + ).Return(nil).Once() + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() + provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, alertSender, recipient) + err := useCase.Run(context.Background()) + bridge.AssertExpectations(t) + alertSender.AssertExpectations(t) + provider.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { + bridge := &test.BridgeMock{} + provider := &test.ProviderMock{} + alertSender := &test.AlertSenderMock{} + recipient := "recipient@test.com" + alertSender.On("SendAlert", + mock.AnythingOfType("context.backgroundCtx"), + "PegOut: Out of liquidity", + "You are out of liquidity to perform a PegOut. Please, do a deposit", + []string{recipient}, + ).Return(nil).Once() + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, alertSender, recipient) + err := useCase.Run(context.Background()) + bridge.AssertExpectations(t) + provider.AssertExpectations(t) + alertSender.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestCheckLiquidityUseCase_Run_ErrorHandling(t *testing.T) { + recipient := "anything" + cases := test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ + { + Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(0), assert.AnError).Once() + }, + }, + { + Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(assert.AnError).Once() + }, + }, + { + Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(assert.AnError).Once() + }, + }, + } + for _, testCase := range cases { + bridge := &test.BridgeMock{} + provider := &test.ProviderMock{} + sender := &test.AlertSenderMock{} + testCase.Value(bridge, provider, sender) + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, sender, recipient) + err := useCase.Run(context.Background()) + bridge.AssertExpectations(t) + provider.AssertExpectations(t) + + sender.AssertExpectations(t) + assert.NotNil(t, err) + } + + cases = test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ + { + Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() + provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + sender.On("SendAlert", + mock.AnythingOfType("context.backgroundCtx"), + mock.Anything, + mock.Anything, + mock.Anything, + ).Return(assert.AnError).Once() + }, + }, + { + Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() + provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() + provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() + sender.On("SendAlert", + mock.AnythingOfType("context.backgroundCtx"), + mock.Anything, + mock.Anything, + mock.Anything, + ).Return(assert.AnError).Once() + }, + }, + } + + for _, testCase := range cases { + bridge := &test.BridgeMock{} + provider := &test.ProviderMock{} + sender := &test.AlertSenderMock{} + buff := new(bytes.Buffer) + testCase.Value(bridge, provider, sender) + log.SetOutput(buff) + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, sender, recipient) + err := useCase.Run(context.Background()) + assert.Positive(t, buff.Bytes()) + bridge.AssertExpectations(t) + provider.AssertExpectations(t) + sender.AssertExpectations(t) + assert.Nil(t, err) + } +} diff --git a/internal/usecases/liquidity_provider/common_test.go b/internal/usecases/liquidity_provider/common_test.go new file mode 100644 index 00000000..7c015f05 --- /dev/null +++ b/internal/usecases/liquidity_provider/common_test.go @@ -0,0 +1,73 @@ +package liquidity_provider_test + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestValidateConfiguredProvider(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + { + Id: 1, + Address: "0x01", + Name: "one", + ApiBaseUrl: "api1.com", + Status: true, + ProviderType: "both", + }, + { + Id: 2, + Address: "0x02", + Name: "two", + ApiBaseUrl: "api2.com", + Status: true, + ProviderType: "pegin", + }, + { + Id: 3, + Address: "0x03", + Name: "three", + ApiBaseUrl: "api3.com", + Status: true, + ProviderType: "pegout", + }, + }, nil) + + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("0x02") + + id, err := liquidity_provider.ValidateConfiguredProvider(provider, lbc) + assert.Equal(t, uint64(2), id) + assert.Nil(t, err) +} + +func TestValidateConfiguredProvider_Fail(t *testing.T) { + lbc := &test.LbcMock{} + var provider *test.ProviderMock = nil + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{}, errors.New("some error")).Once() + id, err := liquidity_provider.ValidateConfiguredProvider(provider, lbc) + assert.Equal(t, uint64(0), id) + assert.NotNil(t, err) + + provider = &test.ProviderMock{} + provider.On("RskAddress").Return("0x02") + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + { + Id: 3, + Address: "0x03", + Name: "three", + ApiBaseUrl: "api3.com", + Status: true, + ProviderType: "pegout", + }, + }, nil).Once() + id, err = liquidity_provider.ValidateConfiguredProvider(provider, lbc) + assert.Equal(t, uint64(0), id) + assert.ErrorIs(t, err, usecases.ProviderConfigurationError) +} diff --git a/internal/usecases/liquidity_provider/get_providers_test.go b/internal/usecases/liquidity_provider/get_providers_test.go new file mode 100644 index 00000000..ec48fae3 --- /dev/null +++ b/internal/usecases/liquidity_provider/get_providers_test.go @@ -0,0 +1,47 @@ +package liquidity_provider_test + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetProvidersUseCase_Run(t *testing.T) { + lbc := &test.LbcMock{} + + provider := entities.RegisteredLiquidityProvider{ + Id: 1, + Address: "0x01", + Name: "one", + ApiBaseUrl: "api1.com", + Status: true, + ProviderType: "both", + } + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{provider}, nil).Once() + + useCase := liquidity_provider.NewGetProvidersUseCase(lbc) + result, err := useCase.Run() + + lbc.AssertExpectations(t) + assert.Nil(t, err) + assert.Equal(t, []entities.RegisteredLiquidityProvider{provider}, result) +} + +func TestGetProvidersUseCase_Run_Fail(t *testing.T) { + lbc := &test.LbcMock{} + + lbc.On("GetProviders").Return( + []entities.RegisteredLiquidityProvider{}, + errors.New("some error"), + ).Once() + + useCase := liquidity_provider.NewGetProvidersUseCase(lbc) + result, err := useCase.Run() + + lbc.AssertExpectations(t) + assert.NotNil(t, err) + assert.Equal(t, []entities.RegisteredLiquidityProvider{}, result) +} diff --git a/internal/usecases/liquidity_provider/penalization_alert.go b/internal/usecases/liquidity_provider/penalization_alert.go index c4cf051f..b75e29ee 100644 --- a/internal/usecases/liquidity_provider/penalization_alert.go +++ b/internal/usecases/liquidity_provider/penalization_alert.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" ) @@ -22,7 +23,7 @@ func (useCase *PenalizationAlertUseCase) Run(ctx context.Context, fromBlock, toB var body string events, err := useCase.lbc.GetPeginPunishmentEvents(ctx, fromBlock, &toBlock) if err != nil { - return err + return usecases.WrapUseCaseError(usecases.PenalizationId, err) } for _, event := range events { body = fmt.Sprintf("You were punished in %v rBTC for the quoteHash %s", event.Penalty.ToRbtc(), event.QuoteHash) diff --git a/internal/usecases/liquidity_provider/penalization_alert_test.go b/internal/usecases/liquidity_provider/penalization_alert_test.go new file mode 100644 index 00000000..6362cea1 --- /dev/null +++ b/internal/usecases/liquidity_provider/penalization_alert_test.go @@ -0,0 +1,70 @@ +package liquidity_provider_test + +import ( + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestPenalizationAlertUseCase_Run(t *testing.T) { + lbc := &test.LbcMock{} + events := []entities.PunishmentEvent{ + { + LiquidityProvider: "0x01", + Penalty: entities.NewWei(100), + QuoteHash: "0x02", + }, + { + LiquidityProvider: "0x03", + Penalty: entities.NewWei(200), + QuoteHash: "0x04", + }, + { + LiquidityProvider: "0x05", + Penalty: entities.NewWei(300), + QuoteHash: "0x06", + }, + } + toBlock := uint64(10) + lbc.On( + "GetPeginPunishmentEvents", + mock.AnythingOfType("context.backgroundCtx"), + uint64(5), + &toBlock, + ).Return(events, nil).Once() + + sender := &test.AlertSenderMock{} + recipient := "recipient@test.com" + + for i := 0; i < 3; i++ { + sender.On( + "SendAlert", + mock.AnythingOfType("context.backgroundCtx"), + "Pegin Punishment", + fmt.Sprintf("You were punished in %v rBTC for the quoteHash %s", events[i].Penalty.ToRbtc(), events[i].QuoteHash), + []string{recipient}, + ).Return(nil).Once() + } + + useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, recipient) + err := useCase.Run(context.Background(), 5, 10) + assert.Nil(t, err) + lbc.AssertExpectations(t) + sender.AssertExpectations(t) +} + +func TestPenalizationAlertUseCase_Run_GetEvents(t *testing.T) { + lbc := &test.LbcMock{} + sender := &test.AlertSenderMock{} + lbc.On("GetPeginPunishmentEvents", mock.AnythingOfType("context.backgroundCtx"), uint64(5), mock.Anything). + Return([]entities.PunishmentEvent{}, assert.AnError).Once() + useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, "recipient") + err := useCase.Run(context.Background(), 5, 10) + lbc.AssertExpectations(t) + assert.NotNil(t, err) +} diff --git a/internal/usecases/liquidity_provider/provider_detail_test.go b/internal/usecases/liquidity_provider/provider_detail_test.go new file mode 100644 index 00000000..b804f4ec --- /dev/null +++ b/internal/usecases/liquidity_provider/provider_detail_test.go @@ -0,0 +1,92 @@ +package liquidity_provider_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetDetailUseCase_Run(t *testing.T) { + provider := &test.ProviderMock{} + provider.On("CallFeePegin").Return(entities.NewWei(100)) + provider.On("MinPegin").Return(entities.NewWei(1000)) + provider.On("MaxPegin").Return(entities.NewWei(10000)) + provider.On("MaxPeginConfirmations").Return(uint16(10)) + provider.On("CallFeePegout").Return(entities.NewWei(200)) + provider.On("MinPegout").Return(entities.NewWei(2000)) + provider.On("MaxPegout").Return(entities.NewWei(20000)) + provider.On("MaxPegoutConfirmations").Return(uint16(20)) + captchaKey := "testKey" + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) + result, err := useCase.Run() + assert.Nil(t, err) + assert.Equal(t, result, liquidity_provider.FullLiquidityProvider{ + SiteKey: captchaKey, + Pegin: entities.LiquidityProviderDetail{ + Fee: entities.NewWei(100), + MinTransactionValue: entities.NewWei(1000), + MaxTransactionValue: entities.NewWei(10000), + RequiredConfirmations: 10, + }, + Pegout: entities.LiquidityProviderDetail{ + Fee: entities.NewWei(200), + MinTransactionValue: entities.NewWei(2000), + MaxTransactionValue: entities.NewWei(20000), + RequiredConfirmations: 20, + }, + }) +} + +func TestGetDetailUseCase_Run_InvalidCaptchaKey(t *testing.T) { + provider := &test.ProviderMock{} + provider.On("CallFeePegin").Return(entities.NewWei(100)) + provider.On("MinPegin").Return(entities.NewWei(1000)) + provider.On("MaxPegin").Return(entities.NewWei(10000)) + provider.On("MaxPeginConfirmations").Return(uint16(10)) + provider.On("CallFeePegout").Return(entities.NewWei(200)) + provider.On("MinPegout").Return(entities.NewWei(2000)) + provider.On("MaxPegout").Return(entities.NewWei(20000)) + provider.On("MaxPegoutConfirmations").Return(uint16(20)) + captchaKey := "" + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) + _, err := useCase.Run() + assert.Equal(t, "ProviderDetail: missing captcha key", err.Error()) +} + +func TestGetDetailUseCase_Run_InvalidPeginDetail(t *testing.T) { + var nilWei *entities.Wei + provider := &test.ProviderMock{} + provider.On("CallFeePegin").Return(entities.NewWei(100)) + provider.On("MinPegin").Return(nilWei) + provider.On("MaxPegin").Return(entities.NewWei(10000)) + provider.On("MaxPeginConfirmations").Return(uint16(10)) + provider.On("CallFeePegout").Return(entities.NewWei(200)) + provider.On("MinPegout").Return(entities.NewWei(2000)) + provider.On("MaxPegout").Return(entities.NewWei(20000)) + provider.On("MaxPegoutConfirmations").Return(uint16(20)) + captchaKey := "testKey" + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) + _, err := useCase.Run() + assert.Equal(t, "ProviderDetail: Key: 'LiquidityProviderDetail.MinTransactionValue' "+ + "Error:Field validation for 'MinTransactionValue' failed on the 'required' tag", err.Error()) +} + +func TestGetDetailUseCase_Run_InvalidPegoutDetail(t *testing.T) { + var nilWei *entities.Wei + provider := &test.ProviderMock{} + provider.On("CallFeePegin").Return(entities.NewWei(100)) + provider.On("MinPegin").Return(entities.NewWei(1000)) + provider.On("MaxPegin").Return(entities.NewWei(10000)) + provider.On("MaxPeginConfirmations").Return(uint16(10)) + provider.On("CallFeePegout").Return(entities.NewWei(200)) + provider.On("MinPegout").Return(nilWei) + provider.On("MaxPegout").Return(entities.NewWei(20000)) + provider.On("MaxPegoutConfirmations").Return(uint16(20)) + captchaKey := "testKey" + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) + _, err := useCase.Run() + assert.Equal(t, "ProviderDetail: Key: 'LiquidityProviderDetail.MinTransactionValue' "+ + "Error:Field validation for 'MinTransactionValue' failed on the 'required' tag", err.Error()) +} diff --git a/internal/usecases/liquidity_provider/registration.go b/internal/usecases/liquidity_provider/registration.go index e7df903b..20de1905 100644 --- a/internal/usecases/liquidity_provider/registration.go +++ b/internal/usecases/liquidity_provider/registration.go @@ -27,11 +27,16 @@ type operationalInfo struct { operationalForPegout bool } +type addedCollateralInfo struct { + pegin bool + pegout bool +} + func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationParams) (int64, error) { var collateral collateralInfo var operational operationalInfo - var addedCollateral bool - var id int64 + var addedCollateral addedCollateralInfo + var addedPeginCollateral, addedPegoutCollateral bool var err error if err = useCase.validateParams(params); err != nil { @@ -49,19 +54,30 @@ func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationPa return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, usecases.AlreadyRegisteredError) } - if addedCollateral, err = useCase.addPeginCollateral(params, operational, collateral); addedCollateral == true || err != nil { + addedPeginCollateral, err = useCase.addPeginCollateral(params, operational, collateral) + addedCollateral.pegin = addedPeginCollateral + if useCase.isProviderReady(addedCollateral, params) { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, usecases.AlreadyRegisteredError) + } else if err != nil { return 0, err } - if addedCollateral, err = useCase.addPegoutCollateral(params, operational, collateral); addedCollateral == true || err != nil { + addedPegoutCollateral, err = useCase.addPegoutCollateral(params, operational, collateral) + addedCollateral.pegout = addedPegoutCollateral + if useCase.isProviderReady(addedCollateral, params) { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, usecases.AlreadyRegisteredError) + } else if err != nil { return 0, err } log.Debug("Registering new provider...") - if id, err = useCase.registerProvider(params, collateral); err != nil { - return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) - } - return id, nil + return useCase.registerProvider(params, collateral) +} + +func (useCase *RegistrationUseCase) isProviderReady(addedCollateral addedCollateralInfo, providerParams blockchain.ProviderRegistrationParams) bool { + return (addedCollateral.pegin && providerParams.Type == entities.PeginProvider) || + (addedCollateral.pegout && providerParams.Type == entities.PegoutProvider) || + (addedCollateral.pegin && addedCollateral.pegout && providerParams.Type == entities.FullProvider) } func (useCase *RegistrationUseCase) getCollateralInfo() (collateralInfo, error) { @@ -110,7 +126,11 @@ func (useCase *RegistrationUseCase) isProviderOperational(providerType entities. func (useCase *RegistrationUseCase) registerProvider(params blockchain.ProviderRegistrationParams, collateral collateralInfo) (int64, error) { value := new(entities.Wei) txConfig := blockchain.NewTransactionConfig(value.Mul(collateral.minimumCollateral, entities.NewUWei(2)), 0, nil) - return useCase.lbc.RegisterProvider(txConfig, params) + if id, err := useCase.lbc.RegisterProvider(txConfig, params); err != nil { + return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + } else { + return id, nil + } } func (useCase *RegistrationUseCase) validateParams(params blockchain.ProviderRegistrationParams) error { @@ -129,12 +149,13 @@ func (useCase *RegistrationUseCase) addPeginCollateral( collateral collateralInfo, ) (bool, error) { var err error - var collateralToAdd *entities.Wei if !(params.Type.AcceptsPegin() && !operational.operationalForPegin && collateral.peginCollateral.Cmp(entities.NewWei(0)) != 0) { return false, nil } + collateralToAdd := new(entities.Wei) + log.Debug("Adding pegin collateral...") if err = useCase.lbc.AddCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.peginCollateral)); err != nil { - return true, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + return false, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } else { return true, nil } @@ -146,12 +167,13 @@ func (useCase *RegistrationUseCase) addPegoutCollateral( collateral collateralInfo, ) (bool, error) { var err error - var collateralToAdd *entities.Wei if !(params.Type.AcceptsPegout() && !operational.operationalForPegout && collateral.pegoutCollateral.Cmp(entities.NewWei(0)) != 0) { return false, nil } + collateralToAdd := new(entities.Wei) + log.Debug("Adding pegout collateral...") if err = useCase.lbc.AddPegoutCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.pegoutCollateral)); err != nil { - return true, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) + return false, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } else { return true, nil } diff --git a/internal/usecases/liquidity_provider/registration_test.go b/internal/usecases/liquidity_provider/registration_test.go new file mode 100644 index 00000000..f1542cca --- /dev/null +++ b/internal/usecases/liquidity_provider/registration_test.go @@ -0,0 +1,223 @@ +package liquidity_provider_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestRegistrationUseCase_Run_AlreadyRegistered(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(true, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(true, nil) + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + provider.AssertExpectations(t) + assert.Equal(t, int64(0), id) + assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) +} + +func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { + cases := []blockchain.ProviderRegistrationParams{ + blockchain.NewProviderRegistrationParams("", "url.com", true, "both"), + blockchain.NewProviderRegistrationParams("name", "", true, "both"), + blockchain.NewProviderRegistrationParams("name", "url.com", false, "both"), + blockchain.NewProviderRegistrationParams("name", "url.com", true, "anything"), + blockchain.NewProviderRegistrationParams("", "url.com", true, ""), + } + lbc := &test.LbcMock{} + provider := &test.ProviderMock{} + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + var id int64 + var err error + for _, c := range cases { + id, err = useCase.Run(c) + assert.Equal(t, int64(0), id) + assert.NotNil(t, err) + } +} + +func TestRegistrationUseCase_Run_AddPeginCollateralIfNotOperational(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegin") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + provider.AssertExpectations(t) + lbc.AssertNotCalled(t, "AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")) + assert.Equal(t, int64(0), id) + assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) +} + +func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegout") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + provider.AssertExpectations(t) + lbc.AssertNotCalled(t, "AddCollateral", mock.AnythingOfType("*entities.Wei")) + assert.Equal(t, int64(0), id) + assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) +} + +func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(999), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(999), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + provider.AssertExpectations(t) + assert.Equal(t, int64(0), id) + assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) +} + +func TestRegistrationUseCase_Run(t *testing.T) { + lbc := &test.LbcMock{} + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(0), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(0), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On( + "RegisterProvider", + mock.AnythingOfType("blockchain.TransactionConfig"), + mock.AnythingOfType("ProviderRegistrationParams")). + Return(int64(1), nil) + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + lbc.AssertNotCalled(t, "AddCollateral") + lbc.AssertNotCalled(t, "AddPegoutCollateral") + provider.AssertExpectations(t) + assert.Equal(t, int64(1), id) + assert.Nil(t, err) +} + +func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { + cases := test.Table[func(mock *test.LbcMock), error]{ + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(0), assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(0), assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(0), assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(0), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(0), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On( + "RegisterProvider", + mock.AnythingOfType("blockchain.TransactionConfig"), + mock.AnythingOfType("ProviderRegistrationParams")). + Return(int64(0), assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(10), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(10), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(10), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(10), nil) + lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) + lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) + lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(assert.AnError) + }, + }, + } + + for _, testCase := range cases { + lbc := &test.LbcMock{} + testCase.Value(lbc) // setup function + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + assert.Equal(t, int64(0), id) + assert.NotNil(t, err) + } +} diff --git a/internal/usecases/liquidity_provider/resign_test.go b/internal/usecases/liquidity_provider/resign_test.go new file mode 100644 index 00000000..571aa3a0 --- /dev/null +++ b/internal/usecases/liquidity_provider/resign_test.go @@ -0,0 +1,60 @@ +package liquidity_provider_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestResignUseCase_Run(t *testing.T) { + lbc := &test.LbcMock{} + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("0x01") + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + { + Id: 1, + Address: "0x01", + }, + }, nil) + lbc.On("ProviderResign").Return(nil).Once() + useCase := liquidity_provider.NewResignUseCase(lbc, provider) + err := useCase.Run() + lbc.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestResignUseCase_Run_NotRegistered(t *testing.T) { + lbc := &test.LbcMock{} + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("0x01") + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + { + Id: 2, + Address: "0x02", + }, + }, nil) + useCase := liquidity_provider.NewResignUseCase(lbc, provider) + err := useCase.Run() + lbc.AssertExpectations(t) + assert.ErrorIs(t, err, usecases.ProviderConfigurationError) +} + +func TestResignUseCase_Run_Error(t *testing.T) { + lbc := &test.LbcMock{} + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("0x01") + lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + { + Id: 1, + Address: "0x01", + }, + }, nil) + lbc.On("ProviderResign").Return(assert.AnError).Once() + useCase := liquidity_provider.NewResignUseCase(lbc, provider) + err := useCase.Run() + lbc.AssertExpectations(t) + assert.NotNil(t, err) +} diff --git a/test/lbc_mock.go b/test/lbc_mock.go new file mode 100644 index 00000000..c1be77ba --- /dev/null +++ b/test/lbc_mock.go @@ -0,0 +1,155 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type AlertSenderMock struct { + entities.AlertSender + mock.Mock +} + +func (m *AlertSenderMock) SendAlert(ctx context.Context, subject, body string, recipients []string) error { + args := m.Called(ctx, subject, body, recipients) + return args.Error(0) +} + +type BridgeMock struct { + blockchain.RootstockBridge + mock.Mock +} + +func (m *BridgeMock) GetMinimumLockTxValue() (*entities.Wei, error) { + args := m.Called() + return args.Get(0).(*entities.Wei), args.Error(1) +} + +type ProviderMock struct { + entities.LiquidityProvider + entities.PeginLiquidityProvider + entities.PegoutLiquidityProvider + mock.Mock +} + +func (m *ProviderMock) RskAddress() string { + args := m.Called() + return args.String(0) +} + +func (m *ProviderMock) HasPeginLiquidity(ctx context.Context, amount *entities.Wei) error { + args := m.Called(ctx, amount) + return args.Error(0) +} + +func (m *ProviderMock) HasPegoutLiquidity(ctx context.Context, amount *entities.Wei) error { + args := m.Called(ctx, amount) + return args.Error(0) +} + +func (m *ProviderMock) CallFeePegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MinPegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPeginConfirmations() uint16 { + args := m.Called() + return args.Get(0).(uint16) +} + +func (m *ProviderMock) CallFeePegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MinPegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPegoutConfirmations() uint16 { + args := m.Called() + return args.Get(0).(uint16) +} + +type LbcMock struct { + blockchain.LiquidityBridgeContract + mock.Mock +} + +func (m *LbcMock) GetMinimumCollateral() (*entities.Wei, error) { + args := m.Called() + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *LbcMock) GetCollateral(providerAddress string) (*entities.Wei, error) { + args := m.Called(providerAddress) + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *LbcMock) GetPegoutCollateral(providerAddress string) (*entities.Wei, error) { + args := m.Called(providerAddress) + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *LbcMock) IsOperationalPegin(providerAddress string) (bool, error) { + args := m.Called(providerAddress) + return args.Bool(0), args.Error(1) +} + +func (m *LbcMock) IsOperationalPegout(providerAddress string) (bool, error) { + args := m.Called(providerAddress) + return args.Bool(0), args.Error(1) +} + +func (m *LbcMock) AddCollateral(collateral *entities.Wei) error { + args := m.Called(collateral) + return args.Error(0) +} + +func (m *LbcMock) AddPegoutCollateral(collateral *entities.Wei) error { + args := m.Called(collateral) + return args.Error(0) +} + +func (m *LbcMock) ProviderResign() error { + args := m.Called() + return args.Error(0) +} + +func (m *LbcMock) RegisterProvider(txConfig blockchain.TransactionConfig, params blockchain.ProviderRegistrationParams) (int64, error) { + args := m.Called(txConfig, params) + return args.Get(0).(int64), args.Error(1) +} + +func (m *LbcMock) GetProviders() ([]entities.RegisteredLiquidityProvider, error) { + args := m.Called() + return args.Get(0).([]entities.RegisteredLiquidityProvider), args.Error(1) +} + +func (m *LbcMock) SetProviderStatus(id uint64, status bool) error { + args := m.Called(id, status) + return args.Error(0) +} + +func (m *LbcMock) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]entities.PunishmentEvent, error) { + args := m.Called(ctx, fromBlock, toBlock) + return args.Get(0).([]entities.PunishmentEvent), args.Error(1) +} From c35c5f34eb8a50acdb27c585cea9168249f39638 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Sat, 10 Feb 2024 02:17:09 -0300 Subject: [PATCH 012/113] feat: test for pegout use cases --- internal/configuration/registry/usecase.go | 2 +- internal/usecases/common.go | 5 +- internal/usecases/common_test.go | 2 +- .../usecases/pegout/accept_pegout_quote.go | 10 +- .../pegout/accept_pegout_quote_test.go | 390 ++++++++++++++++ .../usecases/pegout/add_collateral_test.go | 78 ++++ internal/usecases/pegout/expire_qupte_test.go | 47 ++ .../usecases/pegout/get_collateral_test.go | 34 ++ internal/usecases/pegout/get_pegout_quote.go | 3 +- .../usecases/pegout/get_pegout_quote_test.go | 298 ++++++++++++ .../usecases/pegout/get_user_deposits_test.go | 47 ++ .../pegout/init_deposits_cache_test.go | 83 ++++ internal/usecases/pegout/refund_pegout.go | 20 +- .../usecases/pegout/refund_pegout_test.go | 420 +++++++++++++++++ internal/usecases/pegout/send_pegout.go | 38 +- internal/usecases/pegout/send_pegout_test.go | 441 ++++++++++++++++++ .../pegout/withdraw_collateral_test.go | 37 ++ test/alert_sender_mock.go | 17 + test/bridge_mock.go | 22 + test/btc_rpc_mock.go | 34 ++ test/btc_wallet_mock.go | 27 ++ test/event_bus_mock.go | 29 ++ test/fee_collector_mock.go | 16 + test/lbc_mock.go | 113 ++--- test/pegout_quote_repository_mock.go | 62 +++ test/provider_mock.go | 109 +++++ test/rsk_rpc_mock.go | 32 ++ test/rsk_wallet_mock.go | 17 + 28 files changed, 2317 insertions(+), 116 deletions(-) create mode 100644 internal/usecases/pegout/accept_pegout_quote_test.go create mode 100644 internal/usecases/pegout/add_collateral_test.go create mode 100644 internal/usecases/pegout/expire_qupte_test.go create mode 100644 internal/usecases/pegout/get_collateral_test.go create mode 100644 internal/usecases/pegout/get_pegout_quote_test.go create mode 100644 internal/usecases/pegout/get_user_deposits_test.go create mode 100644 internal/usecases/pegout/init_deposits_cache_test.go create mode 100644 internal/usecases/pegout/refund_pegout_test.go create mode 100644 internal/usecases/pegout/send_pegout_test.go create mode 100644 internal/usecases/pegout/withdraw_collateral_test.go create mode 100644 test/alert_sender_mock.go create mode 100644 test/bridge_mock.go create mode 100644 test/btc_rpc_mock.go create mode 100644 test/btc_wallet_mock.go create mode 100644 test/event_bus_mock.go create mode 100644 test/fee_collector_mock.go create mode 100644 test/pegout_quote_repository_mock.go create mode 100644 test/provider_mock.go create mode 100644 test/rsk_rpc_mock.go create mode 100644 test/rsk_wallet_mock.go diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 0ce33699..38a65366 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -148,7 +148,6 @@ func NewUseCaseRegistry( ), sendPegoutUseCase: pegout.NewSendPegoutUseCase( btcRegistry.Wallet, - btcRegistry.RpcServer, databaseRegistry.PegoutRepository, rskRegistry.RpcServer, eventBus, @@ -167,6 +166,7 @@ func NewUseCaseRegistry( alertSender, env.Provider.AlertRecipientEmail, ), + addPegoutCollateralUseCase: pegout.NewAddCollateralUseCase(rskRegistry.Lbc, liquidityProvider), changeStatusUseCase: liquidity_provider.NewChangeStatusUseCase(rskRegistry.Lbc, liquidityProvider), resignUseCase: liquidity_provider.NewResignUseCase(rskRegistry.Lbc, liquidityProvider), getProvidersUseCase: liquidity_provider.NewGetProvidersUseCase(rskRegistry.Lbc), diff --git a/internal/usecases/common.go b/internal/usecases/common.go index acf5da98..af17c1e9 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -105,7 +105,10 @@ func CalculateDaoAmounts(ctx context.Context, rsk blockchain.RootstockRpcServer, daoFeeAmount := new(entities.Wei) var err error if daoFeePercentage == 0 { - return DaoAmounts{}, nil + return DaoAmounts{ + DaoFeeAmount: entities.NewWei(0), + DaoGasAmount: entities.NewWei(0), + }, nil } daoFeeAmount.Mul(value, entities.NewUWei(daoFeePercentage)) diff --git a/internal/usecases/common_test.go b/internal/usecases/common_test.go index 15e0000b..cea5108b 100644 --- a/internal/usecases/common_test.go +++ b/internal/usecases/common_test.go @@ -50,7 +50,7 @@ func TestCalculateDaoAmounts(t *testing.T) { cases := test.Table[testArgs, u.DaoAmounts]{ { testArgs{entities.NewWei(1000000000000000000), 0}, - u.DaoAmounts{}, + u.DaoAmounts{DaoFeeAmount: entities.NewWei(0), DaoGasAmount: entities.NewWei(0)}, }, { testArgs{entities.NewWei(500000000000000000), 50}, diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go index ce7e48df..35427a61 100644 --- a/internal/usecases/pegout/accept_pegout_quote.go +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -15,7 +15,7 @@ type AcceptQuoteUseCase struct { lp entities.LiquidityProvider pegoutLp entities.PegoutLiquidityProvider eventBus entities.EventBus - pegoutLiquidityMutex *sync.Mutex + pegoutLiquidityMutex sync.Locker } func NewAcceptQuoteUseCase( @@ -24,7 +24,7 @@ func NewAcceptQuoteUseCase( lp entities.LiquidityProvider, pegoutLp entities.PegoutLiquidityProvider, eventBus entities.EventBus, - pegoutLiquidityMutex *sync.Mutex, + pegoutLiquidityMutex sync.Locker, ) *AcceptQuoteUseCase { return &AcceptQuoteUseCase{ quoteRepository: quoteRepository, @@ -56,9 +56,6 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q return quote.AcceptedQuote{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPegoutQuoteId, usecases.ExpiredQuoteError, errorArgs) } - useCase.pegoutLiquidityMutex.Lock() - defer useCase.pegoutLiquidityMutex.Unlock() - if retainedQuote, err = useCase.quoteRepository.GetRetainedQuote(ctx, quoteHash); err != nil { return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) } else if retainedQuote != nil { @@ -68,6 +65,9 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q }, nil } + useCase.pegoutLiquidityMutex.Lock() + defer useCase.pegoutLiquidityMutex.Unlock() + if requiredLiquidity, err = useCase.calculateAndCheckLiquidity(ctx, *pegoutQuote); err != nil { return quote.AcceptedQuote{}, err } diff --git a/internal/usecases/pegout/accept_pegout_quote_test.go b/internal/usecases/pegout/accept_pegout_quote_test.go new file mode 100644 index 00000000..7d1adf99 --- /dev/null +++ b/internal/usecases/pegout/accept_pegout_quote_test.go @@ -0,0 +1,390 @@ +package pegout_test + +import ( + "context" + "github.com/go-playground/validator/v10" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" + "time" +) + +func TestAcceptQuoteUseCase_Run(t *testing.T) { + quoteHash := "0x654321" + now := time.Now() + signature := "0x010203" + quoteMock := quote.PegoutQuote{ + LbcAddress: "0xabcd01", + LpRskAddress: "0xabcd02", + BtcRefundAddress: "hijk", + RskRefundAddress: "0xabcd04", + LpBtcAddress: "edfg", + CallFee: entities.NewWei(5), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "address", + Value: entities.NewWei(12), + AgreementTimestamp: uint32(now.Unix()), + DepositDateLimit: uint32(now.Unix() + 600), + DepositConfirmations: 1, + TransferConfirmations: 1, + TransferTime: 600, + ExpireDate: uint32(now.Unix() + 600), + ExpireBlock: 1, + GasFee: entities.NewWei(6), + ProductFeeAmount: 2, + } + retainedQuote := quote.RetainedPegoutQuote{ + QuoteHash: quoteHash, + DepositAddress: quoteMock.LbcAddress, + Signature: signature, + RequiredLiquidity: entities.NewWei(18), + State: quote.PegoutStateWaitingForDeposit, + } + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil).Once() + quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + lbc := new(test.LbcMock) + lbc.On("GetAddress").Return("0xabcd01").Once() + lp := new(test.ProviderMock) + lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPegoutQuoteEvent) bool { + return assert.Equal(t, quoteMock, event.Quote) && + assert.Equal(t, retainedQuote, event.RetainedQuote) && + assert.Equal(t, quote.AcceptedPegoutQuoteEventId, event.Event.Id()) + })).Once() + + mutex := new(test.MutexMock) + mutex.On("Lock").Once() + mutex.On("Unlock").Once() + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + lbc.AssertExpectations(t) + lp.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) + assert.Nil(t, err) + assert.NotEmpty(t, result) + assert.Equal(t, quoteMock.LbcAddress, result.DepositAddress) + assert.Equal(t, signature, result.Signature) +} + +func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { + quoteHash := "0x654321" + now := time.Now() + quoteMock := quote.PegoutQuote{ + LbcAddress: "0xabcd01", + LpRskAddress: "0xabcd02", + BtcRefundAddress: "hijk", + RskRefundAddress: "0xabcd04", + LpBtcAddress: "edfg", + CallFee: entities.NewWei(1), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "address", + Value: entities.NewWei(1), + AgreementTimestamp: uint32(now.Unix()), + DepositDateLimit: uint32(now.Unix() + 600), + DepositConfirmations: 1, + TransferConfirmations: 1, + TransferTime: 600, + ExpireDate: uint32(now.Unix() + 600), + ExpireBlock: 1, + GasFee: entities.NewWei(1), + ProductFeeAmount: 1, + } + retainedQuote := quote.RetainedPegoutQuote{ + QuoteHash: quoteHash, + DepositAddress: quoteMock.LbcAddress, + Signature: "signature", + RequiredLiquidity: entities.NewWei(1), + State: quote.PegoutStateWaitingForDeposit, + } + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(&retainedQuote, nil).Once() + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + lbc.AssertNotCalled(t, "GetAddress") + lp.AssertNotCalled(t, "SignQuote") + lp.AssertNotCalled(t, "HasPegoutLiquidity") + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + assert.Nil(t, err) + assert.NotEmpty(t, result) + assert.Equal(t, quoteMock.LbcAddress, result.DepositAddress) + assert.Equal(t, "signature", result.Signature) +} + +func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { + quoteHash := "0x654321" + now := time.Now() + quoteMock := quote.PegoutQuote{ + LbcAddress: "0xabcd01", + LpRskAddress: "0xabcd02", + BtcRefundAddress: "hijk", + RskRefundAddress: "0xabcd04", + LpBtcAddress: "edfg", + CallFee: entities.NewWei(1), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "address", + Value: entities.NewWei(1), + AgreementTimestamp: uint32(now.Unix() - 600), + DepositDateLimit: uint32(now.Unix()), + DepositConfirmations: 1, + TransferConfirmations: 1, + TransferTime: 600, + ExpireDate: uint32(now.Unix()), + ExpireBlock: 1, + GasFee: entities.NewWei(1), + ProductFeeAmount: 1, + } + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + quoteRepositoryMock.AssertNotCalled(t, "GetRetainedQuote") + lbc.AssertNotCalled(t, "GetAddress") + lp.AssertNotCalled(t, "SignQuote") + lp.AssertNotCalled(t, "HasPegoutLiquidity") + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + assert.Empty(t, result) + assert.ErrorIs(t, err, usecases.ExpiredQuoteError) +} + +func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { + quoteHash := "0x654321" + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + quoteRepositoryMock.AssertNotCalled(t, "GetRetainedQuote") + lbc.AssertNotCalled(t, "GetAddress") + lp.AssertNotCalled(t, "SignQuote") + lp.AssertNotCalled(t, "HasPegoutLiquidity") + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + assert.Empty(t, result) + assert.ErrorIs(t, err, usecases.QuoteNotFoundError) +} + +func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { + quoteHash := "0x654321" + now := time.Now() + quoteMock := quote.PegoutQuote{ + LbcAddress: "0xabcd01", + LpRskAddress: "0xabcd02", + BtcRefundAddress: "hijk", + RskRefundAddress: "0xabcd04", + LpBtcAddress: "edfg", + CallFee: entities.NewWei(10), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "address", + Value: entities.NewWei(50), + AgreementTimestamp: uint32(now.Unix()), + DepositDateLimit: uint32(now.Unix() + 600), + DepositConfirmations: 1, + TransferConfirmations: 1, + TransferTime: 600, + ExpireDate: uint32(now.Unix() + 600), + ExpireBlock: 1, + GasFee: entities.NewWei(15), + ProductFeeAmount: 8, + } + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), entities.NewWei(65)).Return(usecases.NoLiquidityError).Once() + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Once() + mutex.On("Unlock").Once() + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + lp.AssertExpectations(t) + mutex.AssertExpectations(t) + lbc.AssertNotCalled(t, "InsertRetainedQuote") + lp.AssertNotCalled(t, "SignQuote") + lp.AssertNotCalled(t, "GetAddress") + eventBus.AssertNotCalled(t, "Publish") + assert.Empty(t, result) + assert.ErrorIs(t, err, usecases.NoLiquidityError) +} + +func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { + quoteHash := "0x654321" + now := time.Now() + signature := "0x010203" + quoteMock := quote.PegoutQuote{ + LbcAddress: "0xabcd01", + LpRskAddress: "0xabcd02", + BtcRefundAddress: "hijk", + RskRefundAddress: "0xabcd04", + LpBtcAddress: "edfg", + CallFee: entities.NewWei(5), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "address", + Value: entities.NewWei(12), + AgreementTimestamp: uint32(now.Unix()), + DepositDateLimit: uint32(now.Unix() + 600), + DepositConfirmations: 1, + TransferConfirmations: 1, + TransferTime: 600, + ExpireDate: uint32(now.Unix() + 600), + ExpireBlock: 1, + GasFee: entities.NewWei(6), + ProductFeeAmount: 2, + } + retainedQuote := quote.RetainedPegoutQuote{ + QuoteHash: quoteHash, + DepositAddress: quoteMock.LbcAddress, + Signature: signature, + RequiredLiquidity: entities.NewWei(18), + State: quote.PegoutStateWaitingForDeposit, + } + + lbc := new(test.LbcMock) + lbc.On("GetAddress").Return("0xabcd01") + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPegoutQuoteEvent) bool { + return assert.Equal(t, quoteMock, event.Quote) && + assert.Equal(t, retainedQuote, event.RetainedQuote) && + assert.Equal(t, quote.AcceptedPegoutQuoteEventId, event.Event.Id()) + })) + mutex := new(test.MutexMock) + mutex.On("Lock") + mutex.On("Unlock") + + cases := test.Table[func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock), error]{ + { + Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError).Once() + }, + }, + { + Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return("eMock, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError).Once() + }, + }, + { + Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + }, + }, + { + Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() + }, + }, + { + Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() + quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + }, + }, + } + + for _, c := range cases { + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + lp := new(test.ProviderMock) + c.Value(quoteRepositoryMock, lp) + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + lp.AssertExpectations(t) + assert.NotNil(t, err) + assert.Empty(t, result) + } +} + +func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) { + quoteHash := "0x654321" + now := time.Now() + signature := "0x010203" + quoteMock := quote.PegoutQuote{ + LbcAddress: "0xabcd01", + LpRskAddress: "0xabcd02", + BtcRefundAddress: "hijk", + RskRefundAddress: "0xabcd04", + LpBtcAddress: "edfg", + CallFee: entities.NewWei(5), + PenaltyFee: 1, + Nonce: 1, + DepositAddress: "address", + Value: entities.NewWei(12), + AgreementTimestamp: uint32(now.Unix()), + DepositDateLimit: uint32(now.Unix() + 600), + DepositConfirmations: 1, + TransferConfirmations: 1, + TransferTime: 600, + ExpireDate: uint32(now.Unix() + 600), + ExpireBlock: 1, + GasFee: entities.NewWei(6), + ProductFeeAmount: 2, + } + + lbc := new(test.LbcMock) + lbc.On("GetAddress").Return("") + lp := new(test.ProviderMock) + lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() + eventBus := new(test.EventBusMock) + eventBus.On("Publish").Once() + mutex := new(test.MutexMock) + mutex.On("Lock").Once() + mutex.On("Unlock").Once() + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + e := &validator.ValidationErrors{} + assert.ErrorAs(t, err, e) + assert.Empty(t, result) +} diff --git a/internal/usecases/pegout/add_collateral_test.go b/internal/usecases/pegout/add_collateral_test.go new file mode 100644 index 00000000..668614ec --- /dev/null +++ b/internal/usecases/pegout/add_collateral_test.go @@ -0,0 +1,78 @@ +package pegout_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestAddCollateralUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + value := entities.NewWei(1000) + lp.On("RskAddress").Return("rskAddress") + lbc.On("AddPegoutCollateral", value).Return(nil) + lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(100), nil) + useCase := pegout.NewAddCollateralUseCase(lbc, lp) + result, err := useCase.Run(value) + lp.AssertExpectations(t) + lbc.AssertExpectations(t) + assert.Nil(t, err) + assert.Equal(t, entities.NewWei(1100), result) +} + +func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + value := entities.NewWei(1000) + lp.On("RskAddress").Return("rskAddress") + lbc.On("GetMinimumCollateral").Return(entities.NewWei(2000), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(100), nil) + useCase := pegout.NewAddCollateralUseCase(lbc, lp) + result, err := useCase.Run(value) + lp.AssertExpectations(t) + lbc.AssertExpectations(t) + lbc.AssertNotCalled(t, "AddPegoutCollateral", mock.Anything) + assert.ErrorIs(t, err, usecases.InsufficientAmountError) + assert.Nil(t, result) +} + +func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { + lp := new(test.ProviderMock) + lp.On("RskAddress").Return("rskAddress") + cases := test.Table[func(lbc *test.LbcMock), error]{ + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(nil, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(nil, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) + lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(100), nil) + lbc.On("AddPegoutCollateral", mock.Anything).Return(assert.AnError) + }, + }, + } + + for _, c := range cases { + lbc := new(test.LbcMock) + c.Value(lbc) + useCase := pegout.NewAddCollateralUseCase(lbc, lp) + result, err := useCase.Run(entities.NewWei(100)) + lbc.AssertExpectations(t) + assert.Nil(t, result) + assert.NotNil(t, err) + } +} diff --git a/internal/usecases/pegout/expire_qupte_test.go b/internal/usecases/pegout/expire_qupte_test.go new file mode 100644 index 00000000..96173d24 --- /dev/null +++ b/internal/usecases/pegout/expire_qupte_test.go @@ -0,0 +1,47 @@ +package pegout_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestExpiredPegoutQuoteUseCase_Run(t *testing.T) { + retainedQuote := quote.RetainedPegoutQuote{ + QuoteHash: "0x1234", + DepositAddress: "0xa1b2c3", + Signature: "0x4321", + RequiredLiquidity: entities.NewWei(1), + State: quote.PegoutStateWaitingForDeposit, + } + + expectedRetainedQuote := retainedQuote + expectedRetainedQuote.State = quote.PegoutStateTimeForDepositElapsed + pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + pegoutQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetainedQuote).Return(nil) + useCase := pegout.NewExpiredPegoutQuoteUseCase(pegoutQuoteRepository) + err := useCase.Run(context.Background(), retainedQuote) + pegoutQuoteRepository.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestExpiredPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { + retainedQuote := quote.RetainedPegoutQuote{ + QuoteHash: "0x1234", + DepositAddress: "0xa1b2c3", + Signature: "0x4321", + RequiredLiquidity: entities.NewWei(1), + State: quote.PegoutStateWaitingForDeposit, + } + pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + pegoutQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) + useCase := pegout.NewExpiredPegoutQuoteUseCase(pegoutQuoteRepository) + err := useCase.Run(context.Background(), retainedQuote) + pegoutQuoteRepository.AssertExpectations(t) + assert.NotNil(t, err) +} diff --git a/internal/usecases/pegout/get_collateral_test.go b/internal/usecases/pegout/get_collateral_test.go new file mode 100644 index 00000000..8d049f79 --- /dev/null +++ b/internal/usecases/pegout/get_collateral_test.go @@ -0,0 +1,34 @@ +package pegout_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetCollateralUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + value := entities.NewWei(1000) + lp.On("RskAddress").Return("rskAddress") + lbc.On("GetPegoutCollateral", "rskAddress").Return(value, nil) + useCase := pegout.NewGetCollateralUseCase(lbc, lp) + result, err := useCase.Run() + lbc.AssertExpectations(t) + assert.Nil(t, err) + assert.Equal(t, value, result) +} + +func TestGetCollateralUseCase_Run_Error(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + lp.On("RskAddress").Return("rskAddress") + lbc.On("GetPegoutCollateral", "rskAddress").Return(entities.NewWei(0), assert.AnError) + useCase := pegout.NewGetCollateralUseCase(lbc, lp) + result, err := useCase.Run() + lbc.AssertExpectations(t) + assert.NotNil(t, err) + assert.Nil(t, result) +} diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index 66b9d59f..dfaf3159 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -85,7 +85,8 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, err, errorArgs) } - if feeInWei, err = useCase.btcWallet.EstimateTxFees(request.to, request.valueToTransfer); err != nil && strings.Contains(err.Error(), "Insufficient Funds") { + if feeInWei, err = useCase.btcWallet.EstimateTxFees(request.to, request.valueToTransfer); err != nil && + strings.Contains(strings.ToLower(err.Error()), "insufficient funds") { return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, usecases.NoLiquidityError) } else if err != nil { return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go new file mode 100644 index 00000000..600517f4 --- /dev/null +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -0,0 +1,298 @@ +package pegout_test + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestGetQuoteUseCase_Run(t *testing.T) { + rsk := new(test.RskRpcMock) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + feeCollector := new(test.FeeCollectorMock) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge := new(test.BridgeMock) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) + lbc := new(test.LbcMock) + lbc.On("GetAddress").Return("0x1234") + lbc.On("HashPegoutQuote", mock.Anything).Return("0x9876543210", nil) + pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + lp := new(test.ProviderMock) + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) + lp.On("CallFeePegout").Return(entities.NewWei(200)) + lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) + lp.On("RskAddress").Return("0x1234") + lp.On("BtcAddress").Return("address") + lp.On("TimeForDepositPegout").Return(uint32(60000)) + lp.On("ExpireBlocksPegout").Return(uint64(60000)) + btcWallet := new(test.BtcWalletMock) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000000000000000), nil) + feeCollectorAddress := "feeCollectorAddress" + useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + request := pegout.NewQuoteRequest( + "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", + entities.NewWei(1000000000000000000), + "0x79568c2989232dCa1840087D73d403602364c0D4", + "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", + ) + result, err := useCase.Run(context.Background(), request) + rsk.AssertExpectations(t) + feeCollector.AssertExpectations(t) + bridge.AssertExpectations(t) + lbc.AssertExpectations(t) + pegoutQuoteRepository.AssertExpectations(t) + lp.AssertExpectations(t) + btcWallet.AssertExpectations(t) + assert.NotEmpty(t, result.Hash) + assert.Nil(t, entities.ValidateStruct(result.PegoutQuote)) + assert.Nil(t, err) +} + +func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { + rsk := new(test.RskRpcMock) + lp := new(test.ProviderMock) + feeCollector := new(test.FeeCollectorMock) + bridge := new(test.BridgeMock) + lbc := new(test.LbcMock) + pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + btcWallet := new(test.BtcWalletMock) + feeCollectorAddress := "feeCollectorAddress" + useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + cases := test.Table[pegout.QuoteRequest, error]{ + { + pegout.NewQuoteRequest("any address", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + usecases.BtcAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + usecases.BtcAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", nil, "anything", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + usecases.RskAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + usecases.BtcAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + usecases.BtcAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"), + usecases.BtcAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + usecases.BtcAddressNotSupportedError, + }, + { + pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx"), + usecases.BtcAddressNotSupportedError, + }, + } + for _, testCase := range cases { + result, err := useCase.Run(context.Background(), testCase.Value) + assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) + assert.NotNil(t, err) + assert.ErrorIs(t, err, testCase.Result) + } +} + +func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { + cases := test.Table[func( + rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, + pegoutQuoteRepository *test.PegoutQuoteRepositoryMock, + ), error]{ + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(assert.AnError) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(0), assert.AnError) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(0), assert.AnError) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(0), errors.New("Insufficient funds")) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), assert.AnError) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(0), assert.AnError) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) + lbc.On("GetAddress").Return("0x1234") + lbc.On("HashPegoutQuote", mock.Anything).Return("0x9876543210", nil) + pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(assert.AnError) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) + lbc.On("GetAddress").Return("0x1234") + lbc.On("HashPegoutQuote", mock.Anything).Return("", assert.AnError) + pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) + lp.On("CallFeePegout").Return(entities.NewWei(200)) + lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) + lp.On("RskAddress").Return("0x1234") + lp.On("BtcAddress").Return("address") + lp.On("TimeForDepositPegout").Return(uint32(60000)) + lp.On("ExpireBlocksPegout").Return(uint64(60000)) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(10), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) + lbc.On("GetAddress").Return("0x1234") + lbc.On("HashPegoutQuote", mock.Anything).Return("0x2134", nil) + pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(0)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(0)) + lp.On("CallFeePegout").Return(entities.NewWei(0)) + lp.On("PenaltyFeePegout").Return(entities.NewWei(0)) + lp.On("RskAddress").Return("") + lp.On("BtcAddress").Return("") + lp.On("TimeForDepositPegout").Return(uint32(0)) + lp.On("ExpireBlocksPegout").Return(uint64(0)) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(10), nil) + }, + }, + { + Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(entities.NewWei(0), assert.AnError) + feeCollector.On("DaoFeePercentage").Return(uint64(12), nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) + lbc.On("GetAddress").Return("0x1234") + lbc.On("HashPegoutQuote", mock.Anything).Return("0x4321", nil) + pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) + lp.On("CallFeePegout").Return(entities.NewWei(200)) + lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) + lp.On("RskAddress").Return("0x1234") + lp.On("BtcAddress").Return("address") + lp.On("TimeForDepositPegout").Return(uint32(60000)) + lp.On("ExpireBlocksPegout").Return(uint64(60000)) + btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(10), nil) + }, + }, + } + + request := pegout.NewQuoteRequest( + "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", + entities.NewWei(1000000000000000000), + "0x79568c2989232dCa1840087D73d403602364c0D4", + "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", + ) + feeCollectorAddress := "feeCollectorAddress" + for _, testCase := range cases { + rsk := new(test.RskRpcMock) + lp := new(test.ProviderMock) + feeCollector := new(test.FeeCollectorMock) + bridge := new(test.BridgeMock) + lbc := new(test.LbcMock) + pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + btcWallet := new(test.BtcWalletMock) + testCase.Value(rsk, feeCollector, bridge, lbc, lp, btcWallet, pegoutQuoteRepository) + lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) + lp.On("CallFeePegout").Return(entities.NewWei(200)) + lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) + lp.On("RskAddress").Return("0x1234") + lp.On("BtcAddress").Return("address") + lp.On("TimeForDepositPegout").Return(uint32(60000)) + lp.On("ExpireBlocksPegout").Return(uint64(60000)) + lbc.On("GetAddress").Return("0x1234") + useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + result, err := useCase.Run(context.Background(), request) + assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) + assert.NotNil(t, err) + } +} diff --git a/internal/usecases/pegout/get_user_deposits_test.go b/internal/usecases/pegout/get_user_deposits_test.go new file mode 100644 index 00000000..0292ec0f --- /dev/null +++ b/internal/usecases/pegout/get_user_deposits_test.go @@ -0,0 +1,47 @@ +package pegout_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" + "time" +) + +func TestGetUserDepositsUseCase_Run(t *testing.T) { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + deposit := quote.PegoutDeposit{ + TxHash: "0x123456", + QuoteHash: "0x654321", + Amount: entities.NewWei(1), + Timestamp: time.Now(), + BlockNumber: 6, + } + quoteRepository.On( + "ListPegoutDepositsByAddress", + mock.AnythingOfType("context.backgroundCtx"), + "0x123456", + ).Return([]quote.PegoutDeposit{deposit}, nil) + useCase := pegout.NewGetUserDepositsUseCase(quoteRepository) + result, err := useCase.Run(context.Background(), "0x123456") + assert.Nil(t, err) + assert.Equal(t, len(result), 1) + assert.Equal(t, result[0], deposit) +} + +func TestGetUserDepositsUseCase_Run_ErrorHandling(t *testing.T) { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On( + "ListPegoutDepositsByAddress", + mock.AnythingOfType("context.backgroundCtx"), + "0x123456", + ).Return(nil, assert.AnError) + useCase := pegout.NewGetUserDepositsUseCase(quoteRepository) + result, err := useCase.Run(context.Background(), "0x123456") + assert.NotNil(t, err) + assert.Nil(t, result) +} diff --git a/internal/usecases/pegout/init_deposits_cache_test.go b/internal/usecases/pegout/init_deposits_cache_test.go new file mode 100644 index 00000000..3aba22d8 --- /dev/null +++ b/internal/usecases/pegout/init_deposits_cache_test.go @@ -0,0 +1,83 @@ +package pegout_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" + "time" +) + +func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + rpc := new(test.RskRpcMock) + pegoutRepository := new(test.PegoutQuoteRepositoryMock) + height := uint64(10) + rpc.On("GetHeight", context.Background()).Return(height, nil) + events := []quote.PegoutDeposit{ + { + TxHash: "0x123456", + QuoteHash: "0x654321", + Amount: entities.NewWei(1), + Timestamp: time.Now(), + BlockNumber: 6, + From: "0xabcdef", + }, + { + TxHash: "0x987654", + QuoteHash: "0x445566", + Amount: entities.NewWei(2), + Timestamp: time.Now(), + BlockNumber: 7, + From: "0xabcdef", + }, + } + lbc.On("GetDepositEvents", context.Background(), uint64(5), &height).Return(events, nil) + pegoutRepository.On("UpsertPegoutDeposits", context.Background(), events).Return(nil) + useCase := pegout.NewInitPegoutDepositCacheUseCase(pegoutRepository, lbc, rpc) + err := useCase.Run(context.Background(), 5) + rpc.AssertExpectations(t) + lbc.AssertExpectations(t) + pegoutRepository.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { + cases := test.Table[func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock), error]{ + { + Value: func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock) { + rpc.On("GetHeight", context.Background()).Return(uint64(0), assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock) { + rpc.On("GetHeight", context.Background()).Return(uint64(10), nil) + lbc.On("GetDepositEvents", context.Background(), mock.Anything, mock.Anything).Return(nil, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock) { + rpc.On("GetHeight", context.Background()).Return(uint64(10), nil) + lbc.On("GetDepositEvents", context.Background(), uint64(5), mock.Anything).Return([]quote.PegoutDeposit{}, nil) + quoteRepository.On("UpsertPegoutDeposits", context.Background(), mock.Anything).Return(assert.AnError) + }, + }, + } + + for _, c := range cases { + lbc := new(test.LbcMock) + quoteRepository := new(test.PegoutQuoteRepositoryMock) + rsk := new(test.RskRpcMock) + c.Value(lbc, quoteRepository, rsk) + useCase := pegout.NewInitPegoutDepositCacheUseCase(quoteRepository, lbc, rsk) + err := useCase.Run(context.Background(), 5) + lbc.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + rsk.AssertExpectations(t) + assert.NotNil(t, err) + } +} diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go index 341e3d86..b317d252 100644 --- a/internal/usecases/pegout/refund_pegout.go +++ b/internal/usecases/pegout/refund_pegout.go @@ -27,7 +27,7 @@ type RefundPegoutUseCase struct { btc blockchain.BitcoinNetwork rskWallet blockchain.RootstockWallet bridge blockchain.RootstockBridge - rskWalletMutex *sync.Mutex + rskWalletMutex sync.Locker } func NewRefundPegoutUseCase( @@ -37,7 +37,7 @@ func NewRefundPegoutUseCase( btc blockchain.BitcoinNetwork, rskWallet blockchain.RootstockWallet, bridge blockchain.RootstockBridge, - rskWalletMutex *sync.Mutex, + rskWalletMutex sync.Locker, ) *RefundPegoutUseCase { return &RefundPegoutUseCase{ quoteRepository: quoteRepository, @@ -69,8 +69,8 @@ func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote return err } - if params, err = useCase.buildRefundPegoutParams(retainedQuote); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, err, true) + if params, err = useCase.buildRefundPegoutParams(ctx, retainedQuote); err != nil { + return err } txConfig := blockchain.NewTransactionConfig(nil, refundPegoutGasLimit, nil) @@ -90,10 +90,10 @@ func (useCase *RefundPegoutUseCase) Run(ctx context.Context, retainedQuote quote func (useCase *RefundPegoutUseCase) publishErrorEvent(ctx context.Context, retainedQuote quote.RetainedPegoutQuote, err error, recoverable bool) error { wrappedError := usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) if !recoverable { + retainedQuote.State = quote.PegoutStateRefundPegOutFailed if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { wrappedError = errors.Join(wrappedError, err) } - retainedQuote.State = quote.PegoutStateRefundPegOutFailed useCase.eventBus.Publish(quote.PegoutQuoteCompletedEvent{ Event: entities.NewBaseEvent(quote.PegoutQuoteCompletedEventId), RetainedQuote: retainedQuote, @@ -103,7 +103,7 @@ func (useCase *RefundPegoutUseCase) publishErrorEvent(ctx context.Context, retai return wrappedError } -func (useCase *RefundPegoutUseCase) buildRefundPegoutParams(retainedQuote quote.RetainedPegoutQuote) (blockchain.RefundPegoutParams, error) { +func (useCase *RefundPegoutUseCase) buildRefundPegoutParams(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) (blockchain.RefundPegoutParams, error) { var merkleBranch blockchain.MerkleBranch var block blockchain.BitcoinBlockInformation var err error @@ -111,19 +111,19 @@ func (useCase *RefundPegoutUseCase) buildRefundPegoutParams(retainedQuote quote. var quoteHashFixedBytes [32]byte if merkleBranch, err = useCase.btc.BuildMerkleBranch(retainedQuote.LpBtcTxHash); err != nil { - return blockchain.RefundPegoutParams{}, err + return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } if block, err = useCase.btc.GetTransactionBlockInfo(retainedQuote.LpBtcTxHash); err != nil { - return blockchain.RefundPegoutParams{}, err + return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } if rawTx, err = useCase.btc.GetRawTransaction(retainedQuote.LpBtcTxHash); err != nil { - return blockchain.RefundPegoutParams{}, err + return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } if quoteHashBytes, err = hex.DecodeString(retainedQuote.QuoteHash); err != nil { - return blockchain.RefundPegoutParams{}, err + return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, false) } copy(quoteHashFixedBytes[:], quoteHashBytes) diff --git a/internal/usecases/pegout/refund_pegout_test.go b/internal/usecases/pegout/refund_pegout_test.go new file mode 100644 index 00000000..a912af93 --- /dev/null +++ b/internal/usecases/pegout/refund_pegout_test.go @@ -0,0 +1,420 @@ +package pegout_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "math/big" + "testing" + "time" +) + +var ( + now = uint32(time.Now().Unix()) + refundPegoutTxHash = "0x1f1d1b" + bridgeTxHash = "0x2b2d2f" +) + +var retainedQuote = quote.RetainedPegoutQuote{ + QuoteHash: "1c2d3f", + DepositAddress: "0x654321", + Signature: "0x112a3b", + RequiredLiquidity: entities.NewWei(1000), + State: quote.PegoutStateSendPegoutSucceeded, + UserRskTxHash: "0x3c2b1a", + LpBtcTxHash: "0x3c2b1a", + RefundPegoutTxHash: "", + BridgeRefundTxHash: "", +} + +var pegoutQuote = quote.PegoutQuote{ + LbcAddress: retainedQuote.QuoteHash, + LpRskAddress: "0x1234", + BtcRefundAddress: "any address", + RskRefundAddress: "0x1234", + LpBtcAddress: "0x1234", + CallFee: entities.NewWei(3000), + PenaltyFee: 2, + Nonce: 3, + DepositAddress: "any address", + Value: entities.NewWei(4000), + AgreementTimestamp: now, + DepositDateLimit: now + 60, + DepositConfirmations: 10, + TransferConfirmations: 10, + TransferTime: 60, + ExpireDate: now + 60, + ExpireBlock: 500, + GasFee: entities.NewWei(1000), + ProductFeeAmount: 500, +} + +var btcBlockInfoMock = blockchain.BitcoinBlockInformation{ + Hash: [32]byte{32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + Height: big.NewInt(200), +} + +var merkleBranchMock = blockchain.MerkleBranch{ + Hashes: [][32]byte{ + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + {32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + }, + Path: big.NewInt(1), +} + +var btcTxInfoMock = blockchain.BitcoinTransactionInformation{ + Hash: "0x1c2b3a", + Confirmations: 11, + Outputs: map[string][]*entities.Wei{"any address": {entities.NewWei(1000)}}, +} + +var btcRawTxMock = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32} + +func TestRefundPegoutUseCase_Run(t *testing.T) { + bridgeAddress := "0x1234" + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ + QuoteHash: retainedQuote.QuoteHash, + DepositAddress: retainedQuote.DepositAddress, + Signature: retainedQuote.Signature, + RequiredLiquidity: retainedQuote.RequiredLiquidity, + State: quote.PegoutStateRefundPegOutSucceeded, + UserRskTxHash: retainedQuote.UserRskTxHash, + LpBtcTxHash: retainedQuote.LpBtcTxHash, + RefundPegoutTxHash: refundPegoutTxHash, + BridgeRefundTxHash: "", + }).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ + QuoteHash: retainedQuote.QuoteHash, + DepositAddress: retainedQuote.DepositAddress, + Signature: retainedQuote.Signature, + RequiredLiquidity: retainedQuote.RequiredLiquidity, + State: quote.PegoutStateRefundPegOutSucceeded, + UserRskTxHash: retainedQuote.UserRskTxHash, + LpBtcTxHash: retainedQuote.LpBtcTxHash, + RefundPegoutTxHash: refundPegoutTxHash, + BridgeRefundTxHash: bridgeTxHash, + }).Return(nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + lbc := new(test.LbcMock) + lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { + expected := retainedQuote + expected.RefundPegoutTxHash = refundPegoutTxHash + expected.State = quote.PegoutStateRefundPegOutSucceeded + return assert.Nil(t, event.Error) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) + })).Return().Once() + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil) + btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) + rskWallet := new(test.RskWalletMock) + rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), + blockchain.NewTransactionConfig(entities.NewWei(8000), 100000, entities.NewWei(60000000)), + bridgeAddress). + Return(bridgeTxHash, nil).Once() + bridge := new(test.BridgeMock) + bridge.On("GetAddress").Return(bridgeAddress).Once() + mutex := new(test.MutexMock) + mutex.On("Unlock").Return().Once() + mutex.On("Lock").Return().Once() + + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + + err := useCase.Run(context.Background(), retainedQuote) + + quoteRepository.AssertExpectations(t) + lbc.AssertExpectations(t) + eventBus.AssertExpectations(t) + btc.AssertExpectations(t) + rskWallet.AssertExpectations(t) + bridge.AssertExpectations(t) + mutex.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { + bridge := new(test.BridgeMock) + bridge.On("GetAddress").Return("0x1234").Once() + mutex := new(test.MutexMock) + mutex.On("Unlock").Return() + mutex.On("Lock").Return() + + recoverableSetups := []func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock){ + func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(blockchain.MerkleBranch{}, assert.AnError).Once() + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{}, assert.AnError).Once() + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() + btc.On("GetRawTransaction", mock.Anything).Return(nil, assert.AnError).Once() + + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() + btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil).Once() + lbc.On("RefundPegout", mock.Anything, mock.Anything).Return("", blockchain.WaitingForBridgeError).Once() + }, + } + + for _, setup := range recoverableSetups { + eventBus := new(test.EventBusMock) + quoteRepository := new(test.PegoutQuoteRepositoryMock) + lbc := new(test.LbcMock) + btc := new(test.BtcRpcMock) + rskWallet := new(test.RskWalletMock) + setup(quoteRepository, lbc, btc, rskWallet) + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + err := useCase.Run(context.Background(), retainedQuote) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + rskWallet.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish", mock.Anything) + assert.NotNil(t, err) + } +} + +func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { + bridge := new(test.BridgeMock) + bridge.On("GetAddress").Return("0x1234").Once() + mutex := new(test.MutexMock) + mutex.On("Unlock").Return() + mutex.On("Lock").Return() + + unrecoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock){ + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, nil).Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + retainedQuote.QuoteHash = "no hex" + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() + btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil).Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() + btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil).Once() + lbc.On("RefundPegout", mock.Anything, mock.Anything).Return("", assert.AnError).Once() + }, + } + + for _, setup := range unrecoverableSetups { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + lbc := new(test.LbcMock) + btc := new(test.BtcRpcMock) + rskWallet := new(test.RskWalletMock) + caseQuote := retainedQuote + setup(&caseQuote, quoteRepository, lbc, btc, rskWallet) + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { + return assert.NotNil(t, event.Error) && + assert.Equal(t, caseQuote.LpBtcTxHash, event.RetainedQuote.LpBtcTxHash) && + assert.Equal(t, caseQuote.Signature, event.RetainedQuote.Signature) && + assert.Equal(t, caseQuote.QuoteHash, event.RetainedQuote.QuoteHash) && + assert.Equal(t, caseQuote.DepositAddress, event.RetainedQuote.DepositAddress) && + assert.Equal(t, caseQuote.RequiredLiquidity, event.RetainedQuote.RequiredLiquidity) && + assert.Equal(t, quote.PegoutStateRefundPegOutFailed, event.RetainedQuote.State) && + assert.Equal(t, caseQuote.UserRskTxHash, event.RetainedQuote.UserRskTxHash) && + assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) + })).Return().Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ + QuoteHash: caseQuote.QuoteHash, + DepositAddress: caseQuote.DepositAddress, + Signature: caseQuote.Signature, + RequiredLiquidity: caseQuote.RequiredLiquidity, + State: quote.PegoutStateRefundPegOutFailed, + UserRskTxHash: caseQuote.UserRskTxHash, + LpBtcTxHash: caseQuote.LpBtcTxHash, + RefundPegoutTxHash: caseQuote.RefundPegoutTxHash, + BridgeRefundTxHash: caseQuote.BridgeRefundTxHash, + }).Return(nil).Once() + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + err := useCase.Run(context.Background(), caseQuote) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + rskWallet.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + assert.NotNil(t, err) + } +} + +func TestRefundPegoutUseCase_Run_NoConfirmations(t *testing.T) { + unconfirmedBlockInfo := btcTxInfoMock + unconfirmedBlockInfo.Confirmations = 1 + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + lbc := new(test.LbcMock) + eventBus := new(test.EventBusMock) + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(unconfirmedBlockInfo, nil).Once() + rskWallet := new(test.RskWalletMock) + bridge := new(test.BridgeMock) + mutex := new(test.MutexMock) + + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + + err := useCase.Run(context.Background(), retainedQuote) + + quoteRepository.AssertExpectations(t) + btc.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + rskWallet.AssertNotCalled(t, "SendRbtc") + bridge.AssertNotCalled(t, "GetAddress") + lbc.AssertNotCalled(t, "RefundPegout") + lbc.AssertNotCalled(t, "GetAddress") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + assert.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) +} + +func TestRefundPegoutUseCase_Run_WrongState(t *testing.T) { + wrongStateQuote := retainedQuote + wrongStateQuote.State = quote.PegoutStateSendPegoutFailed + quoteRepository := new(test.PegoutQuoteRepositoryMock) + lbc := new(test.LbcMock) + eventBus := new(test.EventBusMock) + btc := new(test.BtcRpcMock) + rskWallet := new(test.RskWalletMock) + bridge := new(test.BridgeMock) + mutex := new(test.MutexMock) + + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + + err := useCase.Run(context.Background(), wrongStateQuote) + + quoteRepository.AssertNotCalled(t, "UpdateRetainedQuote") + quoteRepository.AssertNotCalled(t, "GetQuote") + quoteRepository.AssertNotCalled(t, "GetRetainedQuote") + btc.AssertNotCalled(t, "GetTransactionInfo") + eventBus.AssertNotCalled(t, "Publish") + rskWallet.AssertNotCalled(t, "SendRbtc") + bridge.AssertNotCalled(t, "GetAddress") + lbc.AssertNotCalled(t, "RefundPegout") + lbc.AssertNotCalled(t, "GetAddress") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + assert.ErrorIs(t, err, usecases.WrongStateError) +} + +func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { + bridgeAddress := "0x1234" + lbc := new(test.LbcMock) + lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil) + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.Anything) + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil) + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil) + btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) + bridge := new(test.BridgeMock) + bridge.On("GetAddress").Return(bridgeAddress) + mutex := new(test.MutexMock) + mutex.On("Unlock") + mutex.On("Lock") + + cases := test.Table[func() quote.PegoutQuote, *entities.Wei]{ + { + func() quote.PegoutQuote { + testQuote := pegoutQuote + testQuote.Value = entities.NewWei(3000) + testQuote.GasFee = entities.NewWei(3000) + testQuote.ProductFeeAmount = 1000 + testQuote.CallFee = entities.NewWei(2000) + return testQuote + }, + entities.NewWei(8000), + }, + { + func() quote.PegoutQuote { + testQuote := pegoutQuote + testQuote.Value = entities.NewWei(3000) + testQuote.GasFee = entities.NewWei(3000) + testQuote.ProductFeeAmount = 1000 + testQuote.CallFee = entities.NewWei(2000) + return testQuote + }, + entities.NewWei(8000), + }, + { + func() quote.PegoutQuote { + testQuote := pegoutQuote + testQuote.Value = entities.NewWei(0) + testQuote.GasFee = entities.NewWei(0) + testQuote.ProductFeeAmount = 1 + testQuote.CallFee = entities.NewWei(0) + return testQuote + }, + entities.NewWei(0), + }, + { + func() quote.PegoutQuote { + testQuote := pegoutQuote + testQuote.Value = entities.NewWei(15000) + testQuote.GasFee = entities.NewWei(1) + testQuote.ProductFeeAmount = 1 + testQuote.CallFee = entities.NewWei(500) + return testQuote + }, + entities.NewWei(15501), + }, + } + + for _, c := range cases { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + q := c.Value() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) + + rskWallet := new(test.RskWalletMock) + rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), + blockchain.NewTransactionConfig(c.Result, 100000, entities.NewWei(60000000)), + bridgeAddress). + Return(bridgeTxHash, nil).Once() + + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + err := useCase.Run(context.Background(), retainedQuote) + quoteRepository.AssertExpectations(t) + rskWallet.AssertExpectations(t) + assert.Nil(t, err) + } +} diff --git a/internal/usecases/pegout/send_pegout.go b/internal/usecases/pegout/send_pegout.go index 28023181..564f1a59 100644 --- a/internal/usecases/pegout/send_pegout.go +++ b/internal/usecases/pegout/send_pegout.go @@ -13,24 +13,21 @@ import ( type SendPegoutUseCase struct { btcWallet blockchain.BitcoinWallet - btc blockchain.BitcoinNetwork quoteRepository quote.PegoutQuoteRepository rsk blockchain.RootstockRpcServer eventBus entities.EventBus - btcWalletMutex *sync.Mutex + btcWalletMutex sync.Locker } func NewSendPegoutUseCase( btcWallet blockchain.BitcoinWallet, - btc blockchain.BitcoinNetwork, quoteRepository quote.PegoutQuoteRepository, rsk blockchain.RootstockRpcServer, eventBus entities.EventBus, - btcWalletMutex *sync.Mutex, + btcWalletMutex sync.Locker, ) *SendPegoutUseCase { return &SendPegoutUseCase{ btcWallet: btcWallet, - btc: btc, quoteRepository: quoteRepository, rsk: rsk, eventBus: eventBus, @@ -55,7 +52,7 @@ func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.R return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.QuoteNotFoundError, false) } - if err = useCase.validateQuote(ctx, retainedQuote, pegoutQuote); err != nil { + if receipt, err = useCase.validateQuote(ctx, retainedQuote, pegoutQuote); err != nil { return err } @@ -66,7 +63,10 @@ func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.R return err } - if retainedQuote, err = useCase.performSendPegout(ctx, retainedQuote, pegoutQuote, receipt); err != nil { + retainedQuote, err = useCase.performSendPegout(ctx, retainedQuote, pegoutQuote, receipt) + // if the error is not nil and the state is not SendPegoutFailed, + // means that an error happened before sending the tx + if err != nil && retainedQuote.State != quote.PegoutStateSendPegoutFailed { return err } @@ -88,10 +88,10 @@ func (useCase *SendPegoutUseCase) publishErrorEvent( ) error { wrappedError := usecases.WrapUseCaseErrorArgs(usecases.SendPegoutId, err, usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) if !recoverable { + retainedQuote.State = quote.PegoutStateSendPegoutFailed if err = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { wrappedError = errors.Join(wrappedError, err) } - retainedQuote.State = quote.PegoutStateSendPegoutFailed useCase.eventBus.Publish(quote.PegoutBtcSentToUserEvent{ Event: entities.NewBaseEvent(quote.PegoutBtcSentEventId), PegoutQuote: pegoutQuote, @@ -106,28 +106,28 @@ func (useCase *SendPegoutUseCase) validateQuote( ctx context.Context, retainedQuote quote.RetainedPegoutQuote, pegoutQuote *quote.PegoutQuote, -) error { +) (blockchain.TransactionReceipt, error) { var err error var chainHeight uint64 var receipt blockchain.TransactionReceipt if pegoutQuote.IsExpired() { - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) } if chainHeight, err = useCase.rsk.GetHeight(ctx); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) } if receipt, err = useCase.rsk.GetTransactionReceipt(ctx, retainedQuote.UserRskTxHash); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) } else if chainHeight-receipt.BlockNumber < uint64(pegoutQuote.DepositConfirmations) { - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoEnoughConfirmationsError, true) + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoEnoughConfirmationsError, true) } else if receipt.Value.Cmp(pegoutQuote.Total()) < 0 { retainedQuote.UserRskTxHash = receipt.TransactionHash - return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.InsufficientAmountError, false) + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.InsufficientAmountError, false) } - return nil + return receipt, nil } func (useCase *SendPegoutUseCase) performSendPegout( @@ -160,7 +160,7 @@ func (useCase *SendPegoutUseCase) performSendPegout( RetainedQuote: retainedQuote, Error: err, }) - return retainedQuote, nil + return retainedQuote, err } func (useCase *SendPegoutUseCase) validateBalance( @@ -171,9 +171,13 @@ func (useCase *SendPegoutUseCase) validateBalance( var err error var balance *entities.Wei + requiredBalance := new(entities.Wei) if balance, err = useCase.btcWallet.GetBalance(); err != nil { return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) - } else if balance.Cmp(pegoutQuote.Value) < 0 { + } + requiredBalance = new(entities.Wei) + requiredBalance.Add(pegoutQuote.Value, pegoutQuote.GasFee) + if balance.Cmp(requiredBalance) < 0 { return useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoLiquidityError, true) } return nil diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go new file mode 100644 index 00000000..8c961c0d --- /dev/null +++ b/internal/usecases/pegout/send_pegout_test.go @@ -0,0 +1,441 @@ +package pegout + +import ( + "context" + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "math/big" + "testing" + "time" +) + +var now = uint32(time.Now().Unix()) + +var retainedQuote = quote.RetainedPegoutQuote{ + QuoteHash: "1c2d3f", + DepositAddress: "0x654321", + Signature: "0x112a3b", + RequiredLiquidity: entities.NewWei(1000), + State: quote.PegoutStateWaitingForDepositConfirmations, + UserRskTxHash: "0x3c2b1a", + LpBtcTxHash: "", + RefundPegoutTxHash: "", + BridgeRefundTxHash: "", +} + +var pegoutQuote = quote.PegoutQuote{ + LbcAddress: retainedQuote.QuoteHash, + LpRskAddress: "0x1234", + BtcRefundAddress: "any address", + RskRefundAddress: "0x1234", + LpBtcAddress: "0x1234", + CallFee: entities.NewWei(3000), + PenaltyFee: 2, + Nonce: 3, + DepositAddress: retainedQuote.DepositAddress, + Value: entities.NewWei(4000), + AgreementTimestamp: now, + DepositDateLimit: now + 60, + DepositConfirmations: 10, + TransferConfirmations: 10, + TransferTime: 60, + ExpireDate: now + 60, + ExpireBlock: 500, + GasFee: entities.NewWei(1000), + ProductFeeAmount: 500, +} + +func TestSendPegoutUseCase_Run(t *testing.T) { + btcTxHash := "0x5b5c5d" + btcWallet := new(test.BtcWalletMock) + btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil).Once() + quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) + btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return(btcTxHash, nil).Once() + rsk := new(test.RskRpcMock) + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := retainedQuote + expected.LpBtcTxHash = btcTxHash + expected.State = quote.PegoutStateSendPegoutSucceeded + return assert.Nil(t, event.Error) && + assert.Equal(t, pegoutQuote, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: "0x5b5c5d", + BlockHash: "0x6e6f6a", + BlockNumber: 440, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + updatedQuote := retainedQuote + updatedQuote.LpBtcTxHash = btcTxHash + updatedQuote.State = quote.PegoutStateSendPegoutSucceeded + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.Nil(t, err) + btcWallet.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + rsk.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { + mutex := new(test.MutexMock) + mutex.On("Lock") + mutex.On("Unlock") + + eventBus := new(test.EventBusMock) + eventBus.On("Publish") + + recoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock){ + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + retainedQuote.State = quote.PegoutStateWaitingForDeposit + }, + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + retainedQuote.UserRskTxHash = "" + }, + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError).Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(blockchain.TransactionReceipt{}, assert.AnError).Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: "0x5b5c5d", + BlockHash: "0x6e6f6a", + BlockNumber: 440, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + btcWallet.On("GetBalance").Return(entities.NewWei(0), assert.AnError).Once() + }, + } + + for _, setup := range recoverableSetups { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + btcWallet := new(test.BtcWalletMock) + rsk := new(test.RskRpcMock) + caseQuote := retainedQuote + setup(&caseQuote, btcWallet, rsk, quoteRepository) + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), caseQuote) + btcWallet.AssertExpectations(t) + rsk.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish", mock.Anything) + assert.NotNil(t, err) + } +} + +func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { + btcWallet := new(test.BtcWalletMock) + rsk := new(test.RskRpcMock) + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := retainedQuote + expected.State = quote.PegoutStateSendPegoutFailed + return assert.ErrorIs(t, event.Error, usecases.InsufficientAmountError) && + assert.Equal(t, pegoutQuote, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + mutex := new(test.MutexMock) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: retainedQuote.UserRskTxHash, + BlockHash: "0x6e6f6a", + BlockNumber: 440, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8000), + }, nil).Once() + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + updatedQuote := retainedQuote + updatedQuote.State = quote.PegoutStateSendPegoutFailed + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.ErrorIs(t, err, usecases.InsufficientAmountError) + quoteRepository.AssertExpectations(t) + rsk.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + btcWallet.AssertNotCalled(t, "GetBalance") + btcWallet.AssertNotCalled(t, "SendWithOpReturn") +} + +func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { + btcWallet := new(test.BtcWalletMock) + rsk := new(test.RskRpcMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: retainedQuote.UserRskTxHash, + BlockHash: "0x6e6f6a", + BlockNumber: 445, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) + quoteRepository.AssertExpectations(t) + rsk.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + quoteRepository.AssertNotCalled(t, "UpdateRetainedQuote") +} + +func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { + btcWallet := new(test.BtcWalletMock) + rsk := new(test.RskRpcMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + expiredQuote := pegoutQuote + expiredQuote.ExpireDate = now - 60 + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&expiredQuote, nil).Once() + updatedQuote := retainedQuote + updatedQuote.State = quote.PegoutStateSendPegoutFailed + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := retainedQuote + expected.State = quote.PegoutStateSendPegoutFailed + return assert.ErrorIs(t, event.Error, usecases.ExpiredQuoteError) && + assert.Equal(t, expiredQuote, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.ErrorIs(t, err, usecases.ExpiredQuoteError) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + rsk.AssertNotCalled(t, "GetTransactionReceipt") + rsk.AssertNotCalled(t, "GetHeight") +} + +func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { + btcWallet := new(test.BtcWalletMock) + btcWallet.On("GetBalance").Return(entities.NewWei(100), nil).Once() + rsk := new(test.RskRpcMock) + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: retainedQuote.UserRskTxHash, + BlockHash: "0x6e6f6a", + BlockNumber: 440, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.ErrorIs(t, err, usecases.NoLiquidityError) + quoteRepository.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + btcWallet.AssertExpectations(t) + rsk.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { + btcWallet := new(test.BtcWalletMock) + rsk := new(test.RskRpcMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, nil).Once() + updatedQuote := retainedQuote + updatedQuote.State = quote.PegoutStateSendPegoutFailed + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := retainedQuote + expected.State = quote.PegoutStateSendPegoutFailed + return assert.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) && + assert.Equal(t, quote.PegoutQuote{}, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.ErrorIs(t, err, usecases.QuoteNotFoundError) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + rsk.AssertNotCalled(t, "GetTransactionReceipt") + rsk.AssertNotCalled(t, "GetHeight") +} + +func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { + btcWallet := new(test.BtcWalletMock) + btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil).Once() + quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) + btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return("", assert.AnError).Once() + rsk := new(test.RskRpcMock) + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := retainedQuote + expected.State = quote.PegoutStateSendPegoutFailed + return assert.NotNil(t, event.Error) && + assert.Equal(t, pegoutQuote, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: "0x5b5c5d", + BlockHash: "0x6e6f6a", + BlockNumber: 440, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + updatedQuote := retainedQuote + updatedQuote.State = quote.PegoutStateSendPegoutFailed + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + assert.NotNil(t, err) + btcWallet.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + rsk.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { + btcTxHash := "0x5b5c5d" + btcWallet := new(test.BtcWalletMock) + btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil) + quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) + btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return(btcTxHash, nil) + rsk := new(test.RskRpcMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil) + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: retainedQuote.UserRskTxHash, + BlockHash: "0x6e6f6a", + BlockNumber: 440, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil) + + setups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock){ + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := *retainedQuote + expected.LpBtcTxHash = btcTxHash + expected.State = quote.PegoutStateSendPegoutSucceeded + return assert.Nil(t, event.Error) && + assert.Equal(t, pegoutQuote, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock) { + retainedQuote.QuoteHash = "no hex" + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { + expected := *retainedQuote + expected.State = quote.PegoutStateSendPegoutFailed + return assert.NotNil(t, event.Error) && + assert.Equal(t, pegoutQuote, event.PegoutQuote) && + assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + })).Return().Once() + }, + } + + for _, setup := range setups { + caseQuote := retainedQuote + quoteRepository := new(test.PegoutQuoteRepositoryMock) + eventBus := new(test.EventBusMock) + setup(&caseQuote, quoteRepository, eventBus) + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + err := useCase.Run(context.Background(), caseQuote) + quoteRepository.AssertExpectations(t) + assert.NotNil(t, err) + btcWallet.AssertExpectations(t) + rsk.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) + } +} diff --git a/internal/usecases/pegout/withdraw_collateral_test.go b/internal/usecases/pegout/withdraw_collateral_test.go new file mode 100644 index 00000000..b9d1e23b --- /dev/null +++ b/internal/usecases/pegout/withdraw_collateral_test.go @@ -0,0 +1,37 @@ +package pegout_test + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestWithdrawCollateralUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + lbc.On("WithdrawPegoutCollateral").Return(nil) + useCase := pegout.NewWithdrawCollateralUseCase(lbc) + err := useCase.Run() + lbc.AssertExpectations(t) + assert.Nil(t, err) +} + +func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { + lbc := new(test.LbcMock) + useCase := pegout.NewWithdrawCollateralUseCase(lbc) + + lbc.On("WithdrawPegoutCollateral").Return(errors.New("LBC021")).Once() + err := useCase.Run() + assert.ErrorIs(t, err, usecases.ProviderNotResignedError) + + lbc.On("WithdrawPegoutCollateral").Return(errors.New("LBC022")).Once() + err = useCase.Run() + assert.ErrorIs(t, err, usecases.ProviderNotResignedError) + + lbc.On("WithdrawPegoutCollateral").Return(assert.AnError).Once() + err = useCase.Run() + assert.NotErrorIs(t, err, usecases.ProviderNotResignedError) + assert.NotNil(t, err) +} diff --git a/test/alert_sender_mock.go b/test/alert_sender_mock.go new file mode 100644 index 00000000..fef0c3ad --- /dev/null +++ b/test/alert_sender_mock.go @@ -0,0 +1,17 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/stretchr/testify/mock" +) + +type AlertSenderMock struct { + entities.AlertSender + mock.Mock +} + +func (m *AlertSenderMock) SendAlert(ctx context.Context, subject, body string, recipients []string) error { + args := m.Called(ctx, subject, body, recipients) + return args.Error(0) +} diff --git a/test/bridge_mock.go b/test/bridge_mock.go new file mode 100644 index 00000000..514230d3 --- /dev/null +++ b/test/bridge_mock.go @@ -0,0 +1,22 @@ +package test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type BridgeMock struct { + blockchain.RootstockBridge + mock.Mock +} + +func (m *BridgeMock) GetMinimumLockTxValue() (*entities.Wei, error) { + args := m.Called() + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *BridgeMock) GetAddress() string { + args := m.Called() + return args.String(0) +} diff --git a/test/btc_rpc_mock.go b/test/btc_rpc_mock.go new file mode 100644 index 00000000..f173f150 --- /dev/null +++ b/test/btc_rpc_mock.go @@ -0,0 +1,34 @@ +package test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type BtcRpcMock struct { + blockchain.BitcoinNetwork + mock.Mock +} + +func (m *BtcRpcMock) GetTransactionInfo(hash string) (blockchain.BitcoinTransactionInformation, error) { + args := m.Called(hash) + return args.Get(0).(blockchain.BitcoinTransactionInformation), args.Error(1) +} + +func (m *BtcRpcMock) GetRawTransaction(hash string) ([]byte, error) { + args := m.Called(hash) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]byte), args.Error(1) +} + +func (m *BtcRpcMock) BuildMerkleBranch(txHash string) (blockchain.MerkleBranch, error) { + args := m.Called(txHash) + return args.Get(0).(blockchain.MerkleBranch), args.Error(1) +} + +func (m *BtcRpcMock) GetTransactionBlockInfo(txHash string) (blockchain.BitcoinBlockInformation, error) { + args := m.Called(txHash) + return args.Get(0).(blockchain.BitcoinBlockInformation), args.Error(1) +} diff --git a/test/btc_wallet_mock.go b/test/btc_wallet_mock.go new file mode 100644 index 00000000..b21de6e8 --- /dev/null +++ b/test/btc_wallet_mock.go @@ -0,0 +1,27 @@ +package test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type BtcWalletMock struct { + mock.Mock + blockchain.BitcoinWallet +} + +func (m *BtcWalletMock) EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) { + args := m.Called(toAddress, value) + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *BtcWalletMock) GetBalance() (*entities.Wei, error) { + args := m.Called() + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *BtcWalletMock) SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (string, error) { + args := m.Called(address, value, opReturnContent) + return args.String(0), args.Error(1) +} diff --git a/test/event_bus_mock.go b/test/event_bus_mock.go new file mode 100644 index 00000000..db85d7b7 --- /dev/null +++ b/test/event_bus_mock.go @@ -0,0 +1,29 @@ +package test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/stretchr/testify/mock" + "sync" +) + +type MutexMock struct { + mock.Mock + sync.Mutex +} + +func (m *MutexMock) Lock() { + m.Called() +} + +func (m *MutexMock) Unlock() { + m.Called() +} + +type EventBusMock struct { + entities.EventBus + mock.Mock +} + +func (m *EventBusMock) Publish(event entities.Event) { + m.Called(event) +} diff --git a/test/fee_collector_mock.go b/test/fee_collector_mock.go new file mode 100644 index 00000000..763d0020 --- /dev/null +++ b/test/fee_collector_mock.go @@ -0,0 +1,16 @@ +package test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type FeeCollectorMock struct { + blockchain.FeeCollector + mock.Mock +} + +func (m *FeeCollectorMock) DaoFeePercentage() (uint64, error) { + args := m.Called() + return args.Get(0).(uint64), args.Error(1) +} diff --git a/test/lbc_mock.go b/test/lbc_mock.go index c1be77ba..b5278df1 100644 --- a/test/lbc_mock.go +++ b/test/lbc_mock.go @@ -4,98 +4,25 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/stretchr/testify/mock" ) -type AlertSenderMock struct { - entities.AlertSender - mock.Mock -} - -func (m *AlertSenderMock) SendAlert(ctx context.Context, subject, body string, recipients []string) error { - args := m.Called(ctx, subject, body, recipients) - return args.Error(0) -} - -type BridgeMock struct { - blockchain.RootstockBridge - mock.Mock -} - -func (m *BridgeMock) GetMinimumLockTxValue() (*entities.Wei, error) { - args := m.Called() - return args.Get(0).(*entities.Wei), args.Error(1) -} - -type ProviderMock struct { - entities.LiquidityProvider - entities.PeginLiquidityProvider - entities.PegoutLiquidityProvider +type LbcMock struct { + blockchain.LiquidityBridgeContract mock.Mock } -func (m *ProviderMock) RskAddress() string { +func (m *LbcMock) GetAddress() string { args := m.Called() return args.String(0) } -func (m *ProviderMock) HasPeginLiquidity(ctx context.Context, amount *entities.Wei) error { - args := m.Called(ctx, amount) - return args.Error(0) -} - -func (m *ProviderMock) HasPegoutLiquidity(ctx context.Context, amount *entities.Wei) error { - args := m.Called(ctx, amount) - return args.Error(0) -} - -func (m *ProviderMock) CallFeePegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MinPegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPeginConfirmations() uint16 { - args := m.Called() - return args.Get(0).(uint16) -} - -func (m *ProviderMock) CallFeePegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MinPegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPegoutConfirmations() uint16 { - args := m.Called() - return args.Get(0).(uint16) -} - -type LbcMock struct { - blockchain.LiquidityBridgeContract - mock.Mock -} - func (m *LbcMock) GetMinimumCollateral() (*entities.Wei, error) { args := m.Called() + if args.Get(0) == nil { + return nil, args.Error(1) + } return args.Get(0).(*entities.Wei), args.Error(1) } @@ -106,6 +33,9 @@ func (m *LbcMock) GetCollateral(providerAddress string) (*entities.Wei, error) { func (m *LbcMock) GetPegoutCollateral(providerAddress string) (*entities.Wei, error) { args := m.Called(providerAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } return args.Get(0).(*entities.Wei), args.Error(1) } @@ -153,3 +83,26 @@ func (m *LbcMock) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64 args := m.Called(ctx, fromBlock, toBlock) return args.Get(0).([]entities.PunishmentEvent), args.Error(1) } + +func (m *LbcMock) HashPegoutQuote(pegoutQuote quote.PegoutQuote) (string, error) { + args := m.Called(pegoutQuote) + return args.String(0), args.Error(1) +} + +func (m *LbcMock) WithdrawPegoutCollateral() error { + args := m.Called() + return args.Error(0) +} + +func (m *LbcMock) GetDepositEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]quote.PegoutDeposit, error) { + args := m.Called(ctx, fromBlock, toBlock) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]quote.PegoutDeposit), args.Error(1) +} + +func (m *LbcMock) RefundPegout(txConfig blockchain.TransactionConfig, params blockchain.RefundPegoutParams) (string, error) { + args := m.Called(txConfig, params) + return args.String(0), args.Error(1) +} diff --git a/test/pegout_quote_repository_mock.go b/test/pegout_quote_repository_mock.go new file mode 100644 index 00000000..20ccc4fc --- /dev/null +++ b/test/pegout_quote_repository_mock.go @@ -0,0 +1,62 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/stretchr/testify/mock" +) + +type PegoutQuoteRepositoryMock struct { + quote.PegoutQuoteRepository + mock.Mock +} + +func (m *PegoutQuoteRepositoryMock) InsertQuote(ctx context.Context, hash string, quote quote.PegoutQuote) error { + args := m.Called(ctx, hash, quote) + return args.Error(0) +} + +func (m *PegoutQuoteRepositoryMock) InsertRetainedQuote(ctx context.Context, quote quote.RetainedPegoutQuote) error { + args := m.Called(ctx, quote) + return args.Error(0) +} + +func (m *PegoutQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PegoutQuote, error) { + args := m.Called(ctx, hash) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.(*quote.PegoutQuote), args.Error(1) + } +} + +func (m *PegoutQuoteRepositoryMock) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPegoutQuote, error) { + args := m.Called(ctx, hash) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.(*quote.RetainedPegoutQuote), args.Error(1) + } +} + +func (m *PegoutQuoteRepositoryMock) UpsertPegoutDeposits(ctx context.Context, deposits []quote.PegoutDeposit) error { + args := m.Called(ctx, deposits) + return args.Error(0) +} + +func (m *PegoutQuoteRepositoryMock) UpdateRetainedQuote(ctx context.Context, quote quote.RetainedPegoutQuote) error { + args := m.Called(ctx, quote) + return args.Error(0) +} + +func (m *PegoutQuoteRepositoryMock) ListPegoutDepositsByAddress(ctx context.Context, address string) ([]quote.PegoutDeposit, error) { + args := m.Called(ctx, address) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.([]quote.PegoutDeposit), args.Error(1) + } +} diff --git a/test/provider_mock.go b/test/provider_mock.go new file mode 100644 index 00000000..26df3d72 --- /dev/null +++ b/test/provider_mock.go @@ -0,0 +1,109 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/stretchr/testify/mock" +) + +type ProviderMock struct { + entities.LiquidityProvider + entities.PeginLiquidityProvider + entities.PegoutLiquidityProvider + mock.Mock +} + +func (m *ProviderMock) RskAddress() string { + args := m.Called() + return args.String(0) +} + +func (m *ProviderMock) BtcAddress() string { + args := m.Called() + return args.String(0) +} + +func (m *ProviderMock) HasPeginLiquidity(ctx context.Context, amount *entities.Wei) error { + args := m.Called(ctx, amount) + return args.Error(0) +} + +func (m *ProviderMock) HasPegoutLiquidity(ctx context.Context, amount *entities.Wei) error { + args := m.Called(ctx, amount) + return args.Error(0) +} + +func (m *ProviderMock) CallFeePegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MinPegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPeginConfirmations() uint16 { + args := m.Called() + return args.Get(0).(uint16) +} + +func (m *ProviderMock) CallFeePegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MinPegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) MaxPegoutConfirmations() uint16 { + args := m.Called() + return args.Get(0).(uint16) +} + +func (m *ProviderMock) ValidateAmountForPegout(amount *entities.Wei) error { + args := m.Called(amount) + return args.Error(0) +} + +func (m *ProviderMock) PenaltyFeePegout() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + +func (m *ProviderMock) GetRootstockConfirmationsForValue(value *entities.Wei) uint16 { + args := m.Called(value) + return args.Get(0).(uint16) +} + +func (m *ProviderMock) GetBitcoinConfirmationsForValue(value *entities.Wei) uint16 { + args := m.Called(value) + return args.Get(0).(uint16) +} + +func (m *ProviderMock) TimeForDepositPegout() uint32 { + args := m.Called() + return args.Get(0).(uint32) +} + +func (m *ProviderMock) ExpireBlocksPegout() uint64 { + args := m.Called() + return args.Get(0).(uint64) +} + +func (m *ProviderMock) SignQuote(quoteHash string) (string, error) { + args := m.Called(quoteHash) + return args.String(0), args.Error(1) +} diff --git a/test/rsk_rpc_mock.go b/test/rsk_rpc_mock.go new file mode 100644 index 00000000..dc26f641 --- /dev/null +++ b/test/rsk_rpc_mock.go @@ -0,0 +1,32 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type RskRpcMock struct { + mock.Mock + blockchain.RootstockRpcServer +} + +func (m *RskRpcMock) GetTransactionReceipt(ctx context.Context, hash string) (blockchain.TransactionReceipt, error) { + args := m.Called(ctx, hash) + return args.Get(0).(blockchain.TransactionReceipt), args.Error(1) +} + +func (m *RskRpcMock) GasPrice(ctx context.Context) (*entities.Wei, error) { + args := m.Called(ctx) + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *RskRpcMock) GetHeight(ctx context.Context) (uint64, error) { + args := m.Called(ctx) + return args.Get(0).(uint64), args.Error(1) +} +func (m *RskRpcMock) EstimateGas(ctx context.Context, addr string, value *entities.Wei, data []byte) (*entities.Wei, error) { + args := m.Called(ctx, addr, value, data) + return args.Get(0).(*entities.Wei), args.Error(1) +} diff --git a/test/rsk_wallet_mock.go b/test/rsk_wallet_mock.go new file mode 100644 index 00000000..645913d2 --- /dev/null +++ b/test/rsk_wallet_mock.go @@ -0,0 +1,17 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type RskWalletMock struct { + blockchain.RootstockWallet + mock.Mock +} + +func (m *RskWalletMock) SendRbtc(ctx context.Context, config blockchain.TransactionConfig, toAddress string) (string, error) { + args := m.Called(ctx, config, toAddress) + return args.String(0), args.Error(1) +} From 8b5317814b3fa00dfbf2553319b9f1474673c17e Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Sat, 10 Feb 2024 12:37:37 -0300 Subject: [PATCH 013/113] test: test for watcher use case --- internal/usecases/pegout/send_pegout.go | 15 +- .../usecases/watcher/clean_exipred_test.go | 108 ++++++++++ internal/usecases/watcher/clean_expired.go | 2 +- .../watcher/get_watched_pegin_quote.go | 12 +- .../watcher/get_watched_pegin_quote_test.go | 105 ++++++++++ .../watcher/get_watched_pegout_quote.go | 8 +- .../watcher/get_watched_pegout_quote_test.go | 116 +++++++++++ .../watcher/update_pegout_deposit_test.go | 187 ++++++++++++++++++ test/pegin_quote_repository_mock.go | 37 ++++ test/pegout_quote_repository_mock.go | 20 ++ 10 files changed, 595 insertions(+), 15 deletions(-) create mode 100644 internal/usecases/watcher/clean_exipred_test.go create mode 100644 internal/usecases/watcher/get_watched_pegin_quote_test.go create mode 100644 internal/usecases/watcher/get_watched_pegout_quote_test.go create mode 100644 internal/usecases/watcher/update_pegout_deposit_test.go create mode 100644 test/pegin_quote_repository_mock.go diff --git a/internal/usecases/pegout/send_pegout.go b/internal/usecases/pegout/send_pegout.go index 564f1a59..15bac1e4 100644 --- a/internal/usecases/pegout/send_pegout.go +++ b/internal/usecases/pegout/send_pegout.go @@ -40,10 +40,8 @@ func (useCase *SendPegoutUseCase) Run(ctx context.Context, retainedQuote quote.R var pegoutQuote *quote.PegoutQuote var receipt blockchain.TransactionReceipt - if retainedQuote.State != quote.PegoutStateWaitingForDepositConfirmations { - return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.WrongStateError, true) - } else if retainedQuote.UserRskTxHash == "" { - return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, errors.New("user rsk tx hash not provided"), true) + if err = useCase.validateRetainedQuote(ctx, retainedQuote); err != nil { + return err } if pegoutQuote, err = useCase.quoteRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { @@ -182,3 +180,12 @@ func (useCase *SendPegoutUseCase) validateBalance( } return nil } + +func (useCase *SendPegoutUseCase) validateRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { + if retainedQuote.State != quote.PegoutStateWaitingForDepositConfirmations { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, usecases.WrongStateError, true) + } else if retainedQuote.UserRskTxHash == "" { + return useCase.publishErrorEvent(ctx, retainedQuote, quote.PegoutQuote{}, errors.New("user rsk tx hash not provided"), true) + } + return nil +} diff --git a/internal/usecases/watcher/clean_exipred_test.go b/internal/usecases/watcher/clean_exipred_test.go new file mode 100644 index 00000000..c55c13b5 --- /dev/null +++ b/internal/usecases/watcher/clean_exipred_test.go @@ -0,0 +1,108 @@ +package watcher_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "testing" +) + +func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { + peginExpiredQuotes := []quote.RetainedPeginQuote{ + {QuoteHash: "peginHash1", State: quote.PeginStateTimeForDepositElapsed}, + {QuoteHash: "peginHash2", State: quote.PeginStateTimeForDepositElapsed}, + {QuoteHash: "peginHash3", State: quote.PeginStateCallForUserSucceeded}, + {QuoteHash: "peginHash4", State: quote.PeginStateTimeForDepositElapsed}, + {QuoteHash: "peginHash5", State: quote.PeginStateRegisterPegInFailed}, + {QuoteHash: "peginHash6", State: quote.PeginStateRegisterPegInSucceeded}, + } + + pegoutExpiredQuotes := []quote.RetainedPegoutQuote{ + {QuoteHash: "pegoutHash1", State: quote.PegoutStateRefundPegOutSucceeded}, + {QuoteHash: "pegoutHash2", State: quote.PegoutStateSendPegoutSucceeded}, + {QuoteHash: "pegoutHash3", State: quote.PegoutStateTimeForDepositElapsed}, + {QuoteHash: "pegoutHash4", State: quote.PegoutStateSendPegoutFailed}, + {QuoteHash: "pegoutHash5", State: quote.PegoutStateTimeForDepositElapsed}, + {QuoteHash: "pegoutHash6", State: quote.PegoutStateTimeForDepositElapsed}, + } + + peginRepository := new(test.PeginQuoteRepositoryMock) + peginRepository.On( + "GetRetainedQuoteByState", + mock.AnythingOfType("context.backgroundCtx"), + []quote.PeginState{quote.PeginStateTimeForDepositElapsed}, + ).Return([]quote.RetainedPeginQuote{peginExpiredQuotes[0], peginExpiredQuotes[1], peginExpiredQuotes[3]}, nil) + peginRepository.On( + "DeleteQuotes", + mock.AnythingOfType("context.backgroundCtx"), + []string{"peginHash1", "peginHash2", "peginHash4"}, + ).Return(uint(3), nil) + + pegoutRepository := new(test.PegoutQuoteRepositoryMock) + pegoutRepository.On( + "GetRetainedQuoteByState", + mock.AnythingOfType("context.backgroundCtx"), + []quote.PegoutState{quote.PegoutStateTimeForDepositElapsed}, + ).Return([]quote.RetainedPegoutQuote{pegoutExpiredQuotes[2], pegoutExpiredQuotes[4], pegoutExpiredQuotes[5]}, nil) + pegoutRepository.On( + "DeleteQuotes", + mock.AnythingOfType("context.backgroundCtx"), + []string{"pegoutHash3", "pegoutHash5", "pegoutHash6"}, + ).Return(uint(3), nil) + + useCase := watcher.NewCleanExpiredQuotesUseCase(peginRepository, pegoutRepository) + hashes, err := useCase.Run(context.Background()) + + peginRepository.AssertExpectations(t) + pegoutRepository.AssertExpectations(t) + assert.Nil(t, err) + assert.True(t, len(hashes) == 6) + assert.Equal(t, []string{"peginHash1", "peginHash2", "peginHash4", "pegoutHash3", "pegoutHash5", "pegoutHash6"}, hashes) +} + +func TestCleanExpiredQuotesUseCase_Run_ErrorHandling(t *testing.T) { + setups := []func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock){ + func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError) + }, + func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedQuotes, nil) + pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError) + }, + func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedQuotes, nil) + pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedPegoutQuotes, nil) + peginRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(uint(0), assert.AnError) + }, + func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedQuotes, nil) + pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedPegoutQuotes, nil) + peginRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(uint(5), nil) + pegoutRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(uint(0), assert.AnError) + }, + } + + for _, setup := range setups { + peginRepository := new(test.PeginQuoteRepositoryMock) + pegoutRepository := new(test.PegoutQuoteRepositoryMock) + setup(peginRepository, pegoutRepository) + useCase := watcher.NewCleanExpiredQuotesUseCase(peginRepository, pegoutRepository) + _, err := useCase.Run(context.Background()) + assert.NotNil(t, err) + peginRepository.AssertExpectations(t) + pegoutRepository.AssertExpectations(t) + } +} diff --git a/internal/usecases/watcher/clean_expired.go b/internal/usecases/watcher/clean_expired.go index ba69cf86..87ba0d65 100644 --- a/internal/usecases/watcher/clean_expired.go +++ b/internal/usecases/watcher/clean_expired.go @@ -33,7 +33,7 @@ func (useCase *CleanExpiredQuotesUseCase) Run(ctx context.Context) ([]string, er return nil, err } for _, pegoutQuote := range pegoutQuotes { - pegoutHashes = append(peginHashes, pegoutQuote.QuoteHash) + pegoutHashes = append(pegoutHashes, pegoutQuote.QuoteHash) } if _, err = useCase.peginRepository.DeleteQuotes(ctx, peginHashes); err != nil { diff --git a/internal/usecases/watcher/get_watched_pegin_quote.go b/internal/usecases/watcher/get_watched_pegin_quote.go index 3550133c..7169bf27 100644 --- a/internal/usecases/watcher/get_watched_pegin_quote.go +++ b/internal/usecases/watcher/get_watched_pegin_quote.go @@ -35,7 +35,7 @@ func (useCase *GetWatchedPeginQuoteUseCase) Run(ctx context.Context, state quote func (useCase *GetWatchedPeginQuoteUseCase) getWatchedQuotes(ctx context.Context, state quote.PeginState) ([]WatchedPeginQuote, error) { var retainedQuotes []quote.RetainedPeginQuote - watchedQuote := make([]WatchedPeginQuote, 0) + watchedQuotes := make([]WatchedPeginQuote, 0) var peginQuote *quote.PeginQuote var err error if retainedQuotes, err = useCase.peginRepository.GetRetainedQuoteByState(ctx, state); err != nil { @@ -46,10 +46,10 @@ func (useCase *GetWatchedPeginQuoteUseCase) getWatchedQuotes(ctx context.Context if peginQuote, err = useCase.peginRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { return nil, usecases.WrapUseCaseError(usecases.GetWatchedPeginQuoteId, err) } - watchedQuote = append(watchedQuote, WatchedPeginQuote{ - PeginQuote: *peginQuote, - RetainedQuote: retainedQuote, - }) + watchedQuotes = append( + watchedQuotes, + NewWatchedPeginQuote(*peginQuote, retainedQuote), + ) } - return watchedQuote, nil + return watchedQuotes, nil } diff --git a/internal/usecases/watcher/get_watched_pegin_quote_test.go b/internal/usecases/watcher/get_watched_pegin_quote_test.go new file mode 100644 index 00000000..768986f4 --- /dev/null +++ b/internal/usecases/watcher/get_watched_pegin_quote_test.go @@ -0,0 +1,105 @@ +package watcher_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "math/big" + "testing" +) + +var okStates = []quote.PeginState{quote.PeginStateWaitingForDeposit, quote.PeginStateCallForUserSucceeded} + +var retainedQuotes = []quote.RetainedPeginQuote{ + {QuoteHash: "01", State: quote.PeginStateWaitingForDeposit}, + {QuoteHash: "04", State: quote.PeginStateCallForUserSucceeded}, + {QuoteHash: "03", State: quote.PeginStateWaitingForDeposit}, + {QuoteHash: "05", State: quote.PeginStateCallForUserFailed}, +} + +var peginQuotes = []quote.PeginQuote{ + {Nonce: 1}, + {Nonce: 2}, + {Nonce: 3}, + {Nonce: 4}, + {Nonce: 5}, +} + +func TestGetWatchedPeginQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PeginState{quote.PeginStateWaitingForDeposit}). + Return([]quote.RetainedPeginQuote{retainedQuotes[0], retainedQuotes[2]}, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[0].QuoteHash).Return(&peginQuotes[0], nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[2].QuoteHash).Return(&peginQuotes[2], nil) + useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) + watchedQuotes, err := useCase.Run(context.Background(), quote.PeginStateWaitingForDeposit) + quoteRepository.AssertExpectations(t) + assert.True(t, len(watchedQuotes) == 2) + assert.Nil(t, err) + var parsedHash big.Int + for _, watchedQuote := range watchedQuotes { + parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) + // this is just to validate that the watched quotes are built with the correct pairs, + // the nonce is not related to the hash in the business logic + assert.True(t, parsedHash.Int64() == watchedQuote.PeginQuote.Nonce) + } +} + +func TestGetWatchedPeginQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PeginState{quote.PeginStateCallForUserSucceeded}). + Return([]quote.RetainedPeginQuote{retainedQuotes[1]}, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[1].QuoteHash).Return(&peginQuotes[3], nil) + useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) + watchedQuotes, err := useCase.Run(context.Background(), quote.PeginStateCallForUserSucceeded) + quoteRepository.AssertExpectations(t) + assert.True(t, len(watchedQuotes) == 1) + assert.Nil(t, err) + var parsedHash big.Int + for _, watchedQuote := range watchedQuotes { + parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) + // this is just to validate that the watched quotes are built with the correct pairs, + // the nonce is not related to the hash in the business logic + assert.True(t, parsedHash.Int64() == watchedQuote.PeginQuote.Nonce) + } +} + +func TestGetWatchedPeginQuoteUseCase_Run_WrongState(t *testing.T) { + wrongStates := []quote.PeginState{ + quote.PeginStateTimeForDepositElapsed, + quote.PeginStateCallForUserFailed, + quote.PeginStateRegisterPegInFailed, + quote.PeginStateRegisterPegInSucceeded, + } + quoteRepository := new(test.PeginQuoteRepositoryMock) + useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) + for _, state := range wrongStates { + _, err := useCase.Run(context.Background(), state) + assert.NotNil(t, err) + } +} + +func TestGetWatchedPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { + setups := []func(quoteRepository *test.PeginQuoteRepositoryMock){ + func(quoteRepository *test.PeginQuoteRepositoryMock) { + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError) + }, + func(quoteRepository *test.PeginQuoteRepositoryMock) { + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedQuotes, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError) + }, + } + for _, setup := range setups { + quoteRepository := new(test.PeginQuoteRepositoryMock) + setup(quoteRepository) + useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) + _, err := useCase.Run(context.Background(), quote.PeginStateWaitingForDeposit) + assert.NotNil(t, err) + } +} diff --git a/internal/usecases/watcher/get_watched_pegout_quote.go b/internal/usecases/watcher/get_watched_pegout_quote.go index 0b82be24..d4a45ce9 100644 --- a/internal/usecases/watcher/get_watched_pegout_quote.go +++ b/internal/usecases/watcher/get_watched_pegout_quote.go @@ -54,10 +54,10 @@ func (useCase *GetWatchedPegoutQuoteUseCase) getWatchedQuotes(ctx context.Contex if pegoutQuote, err = useCase.pegoutRepository.GetQuote(ctx, retainedQuote.QuoteHash); err != nil { return nil, usecases.WrapUseCaseError(usecases.GetWatchedPegoutQuoteId, err) } - watchedQuote = append(watchedQuote, WatchedPegoutQuote{ - PegoutQuote: *pegoutQuote, - RetainedQuote: retainedQuote, - }) + watchedQuote = append( + watchedQuote, + NewWatchedPegoutQuote(*pegoutQuote, retainedQuote), + ) } return watchedQuote, nil } diff --git a/internal/usecases/watcher/get_watched_pegout_quote_test.go b/internal/usecases/watcher/get_watched_pegout_quote_test.go new file mode 100644 index 00000000..bb2efa86 --- /dev/null +++ b/internal/usecases/watcher/get_watched_pegout_quote_test.go @@ -0,0 +1,116 @@ +package watcher_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "math/big" + "testing" +) + +var okPegoutStates = []quote.PegoutState{quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations, quote.PegoutStateSendPegoutSucceeded} + +var retainedPegoutQuotes = []quote.RetainedPegoutQuote{ + {QuoteHash: "01", State: quote.PegoutStateWaitingForDeposit}, + {QuoteHash: "04", State: quote.PegoutStateSendPegoutSucceeded}, + {QuoteHash: "03", State: quote.PegoutStateWaitingForDeposit}, + {QuoteHash: "05", State: quote.PegoutStateSendPegoutFailed}, + {QuoteHash: "06", State: quote.PegoutStateWaitingForDepositConfirmations}, +} + +var pegoutQuotes = []quote.PegoutQuote{ + {Nonce: 1}, + {Nonce: 2}, + {Nonce: 3}, + {Nonce: 4}, + {Nonce: 5}, + {Nonce: 6}, +} + +func TestGetWatchedPegoutQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On( + "GetRetainedQuoteByState", + mock.AnythingOfType("context.backgroundCtx"), + []quote.PegoutState{quote.PegoutStateWaitingForDeposit}, + ).Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[0], retainedPegoutQuotes[2]}, nil) + quoteRepository.On( + "GetRetainedQuoteByState", + mock.AnythingOfType("context.backgroundCtx"), + []quote.PegoutState{quote.PegoutStateWaitingForDepositConfirmations}, + ).Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[4]}, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[0].QuoteHash).Return(&pegoutQuotes[0], nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[2].QuoteHash).Return(&pegoutQuotes[2], nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[4].QuoteHash).Return(&pegoutQuotes[5], nil) + useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) + watchedQuotes, err := useCase.Run(context.Background(), quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations) + quoteRepository.AssertExpectations(t) + assert.True(t, len(watchedQuotes) == 3) + assert.Nil(t, err) + var parsedHash big.Int + for _, watchedQuote := range watchedQuotes { + parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) + // this is just to validate that the watched quotes are built with the correct pairs, + // the nonce is not related to the hash in the business logic + assert.True(t, parsedHash.Int64() == watchedQuote.PegoutQuote.Nonce) + } +} + +func TestGetWatchedPegoutQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PegoutState{quote.PegoutStateSendPegoutSucceeded}). + Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[1]}, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[1].QuoteHash).Return(&pegoutQuotes[3], nil) + useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) + watchedQuotes, err := useCase.Run(context.Background(), quote.PegoutStateSendPegoutSucceeded) + quoteRepository.AssertExpectations(t) + assert.True(t, len(watchedQuotes) == 1) + assert.Nil(t, err) + var parsedHash big.Int + for _, watchedQuote := range watchedQuotes { + parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) + // this is just to validate that the watched quotes are built with the correct pairs, + // the nonce is not related to the hash in the business logic + assert.True(t, parsedHash.Int64() == watchedQuote.PegoutQuote.Nonce) + } +} + +func TestGetWatchedPegoutQuoteUseCase_Run_WrongState(t *testing.T) { + wrongStates := []quote.PegoutState{ + quote.PegoutStateTimeForDepositElapsed, + quote.PegoutStateSendPegoutFailed, + quote.PegoutStateRefundPegOutFailed, + quote.PegoutStateRefundPegOutSucceeded, + } + quoteRepository := new(test.PegoutQuoteRepositoryMock) + useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) + for _, state := range wrongStates { + _, err := useCase.Run(context.Background(), state) + assert.NotNil(t, err) + } +} + +func TestGetWatchedPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { + setups := []func(quoteRepository *test.PegoutQuoteRepositoryMock){ + func(quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError) + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(retainedPegoutQuotes, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(nil, assert.AnError) + }, + } + for _, setup := range setups { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + setup(quoteRepository) + useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) + _, err := useCase.Run(context.Background(), quote.PegoutStateWaitingForDeposit) + assert.NotNil(t, err) + } +} diff --git a/internal/usecases/watcher/update_pegout_deposit_test.go b/internal/usecases/watcher/update_pegout_deposit_test.go new file mode 100644 index 00000000..9563179f --- /dev/null +++ b/internal/usecases/watcher/update_pegout_deposit_test.go @@ -0,0 +1,187 @@ +package watcher_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "strings" + "testing" + "time" +) + +var now = uint32(time.Now().Unix()) + +var depositedRetainedQuote = quote.RetainedPegoutQuote{ + QuoteHash: "02011d", + DepositAddress: "0xabcd", + Signature: "signature", + RequiredLiquidity: entities.NewWei(5500), + State: quote.PegoutStateWaitingForDeposit, +} + +var depositedPegoutQuote = quote.PegoutQuote{ + LbcAddress: depositedRetainedQuote.DepositAddress, + LpRskAddress: "0x1234", + BtcRefundAddress: "0x1234", + RskRefundAddress: "0x1234", + LpBtcAddress: "0x1234", + CallFee: entities.NewWei(1000), + PenaltyFee: 100, + Nonce: 123456, + DepositAddress: "any address", + Value: entities.NewWei(5000), + AgreementTimestamp: now - 60, + DepositDateLimit: now + 60, + DepositConfirmations: 10, + TransferConfirmations: 10, + TransferTime: 600, + ExpireDate: now + 600, + ExpireBlock: 500, + GasFee: entities.NewWei(500), + ProductFeeAmount: 300, +} + +func TestUpdatePegoutQuoteDepositUseCase_Run(t *testing.T) { + deposit := quote.PegoutDeposit{ + TxHash: "user rsk tx hash", + QuoteHash: depositedRetainedQuote.QuoteHash, + Amount: entities.NewWei(6800), + Timestamp: time.Now(), + BlockNumber: 480, + From: "0x1a1b1c", + } + quoteReporitory := new(test.PegoutQuoteRepositoryMock) + quoteReporitory.On( + "UpdateRetainedQuote", + mock.AnythingOfType("context.backgroundCtx"), + mock.MatchedBy(func(q quote.RetainedPegoutQuote) bool { + return q.UserRskTxHash == deposit.TxHash && + q.State == quote.PegoutStateWaitingForDepositConfirmations + }), + ).Return(nil) + quoteReporitory.On("UpsertPegoutDeposit", mock.AnythingOfType("context.backgroundCtx"), deposit).Return(nil) + useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) + watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), deposit) + quoteReporitory.AssertExpectations(t) + assert.Nil(t, err) + assert.Equal(t, quote.PegoutStateWaitingForDepositConfirmations, watchedPegoutQuote.RetainedQuote.State) + assert.Equal(t, deposit.TxHash, watchedPegoutQuote.RetainedQuote.UserRskTxHash) +} + +func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { + cases := []struct { + name string + deposit quote.PegoutDeposit + }{ + { + name: "Should fail by value", + deposit: quote.PegoutDeposit{ + TxHash: "user rsk tx hash", + QuoteHash: depositedRetainedQuote.QuoteHash, + Amount: entities.NewWei(6000), + Timestamp: time.Now(), + BlockNumber: 480, + From: "0x1a1b1c", + }, + }, + { + name: "Should fail by time", + deposit: quote.PegoutDeposit{ + TxHash: "user rsk tx hash", + QuoteHash: depositedRetainedQuote.QuoteHash, + Amount: entities.NewWei(6500), + Timestamp: time.Unix(time.Now().Unix()+660, 0), + BlockNumber: 480, + From: "0x1a1b1c", + }, + }, + { + name: "Should fail by confirmations", + deposit: quote.PegoutDeposit{ + TxHash: "user rsk tx hash", + QuoteHash: depositedRetainedQuote.QuoteHash, + Amount: entities.NewWei(6500), + Timestamp: time.Now(), + BlockNumber: 501, + From: "0x1a1b1c", + }, + }, + } + + for _, testCase := range cases { + t.Run(testCase.name, func(t *testing.T) { + quoteReporitory := new(test.PegoutQuoteRepositoryMock) + useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) + watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), testCase.deposit) + quoteReporitory.AssertNotCalled(t, "UpdateRetainedQuote") + quoteReporitory.AssertNotCalled(t, "UpsertPegoutDeposit") + assert.Equal(t, watcher.WatchedPegoutQuote{}, watchedPegoutQuote) + assert.NotNil(t, err) + assert.True(t, strings.Contains(err.Error(), "deposit not valid for quote")) + }) + } +} + +func TestUpdatePegoutQuoteDepositUseCase_Run_IllegalState(t *testing.T) { + deposit := quote.PegoutDeposit{ + TxHash: "user rsk tx hash", + QuoteHash: "02011d", + Amount: entities.NewWei(6800), + Timestamp: time.Now(), + BlockNumber: 480, + From: "0x1a1b1c", + } + quotes := []quote.RetainedPegoutQuote{ + {State: quote.PegoutStateWaitingForDepositConfirmations}, + {State: quote.PegoutStateSendPegoutSucceeded}, + {State: quote.PegoutStateSendPegoutFailed}, + {State: quote.PegoutStateRefundPegOutSucceeded}, + {State: quote.PegoutStateRefundPegOutFailed}, + {State: quote.PegoutStateTimeForDepositElapsed}, + } + for _, retainedQuote := range quotes { + quoteReporitory := new(test.PegoutQuoteRepositoryMock) + useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) + watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, retainedQuote), deposit) + quoteReporitory.AssertNotCalled(t, "UpdateRetainedQuote") + quoteReporitory.AssertNotCalled(t, "UpsertPegoutDeposit") + assert.Equal(t, watcher.WatchedPegoutQuote{}, watchedPegoutQuote) + assert.NotNil(t, err) + assert.True(t, strings.Contains(err.Error(), "illegal quote state")) + } +} + +func TestUpdatePegoutQuoteDepositUseCase_Run_ErrorHandling(t *testing.T) { + deposit := quote.PegoutDeposit{ + TxHash: "user rsk tx hash", + QuoteHash: depositedRetainedQuote.QuoteHash, + Amount: entities.NewWei(6800), + Timestamp: time.Now(), + BlockNumber: 480, + From: "0x1a1b1c", + } + + setups := []func(quoteRepository *test.PegoutQuoteRepositoryMock){ + func(quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) + }, + func(quoteRepository *test.PegoutQuoteRepositoryMock) { + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) + quoteRepository.On("UpsertPegoutDeposit", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) + }, + } + + for _, setup := range setups { + quoteReporitory := new(test.PegoutQuoteRepositoryMock) + setup(quoteReporitory) + useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) + watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), deposit) + quoteReporitory.AssertExpectations(t) + assert.Equal(t, watcher.WatchedPegoutQuote{}, watchedPegoutQuote) + assert.NotNil(t, err) + } +} diff --git a/test/pegin_quote_repository_mock.go b/test/pegin_quote_repository_mock.go new file mode 100644 index 00000000..65c4b330 --- /dev/null +++ b/test/pegin_quote_repository_mock.go @@ -0,0 +1,37 @@ +package test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/stretchr/testify/mock" +) + +type PeginQuoteRepositoryMock struct { + quote.PeginQuoteRepository + mock.Mock +} + +func (m *PeginQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PeginQuote, error) { + args := m.Called(ctx, hash) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.(*quote.PeginQuote), args.Error(1) + } +} + +func (m *PeginQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PeginState) ([]quote.RetainedPeginQuote, error) { + args := m.Called(ctx, states) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.([]quote.RetainedPeginQuote), args.Error(1) + } +} + +func (m *PeginQuoteRepositoryMock) DeleteQuotes(ctx context.Context, hashes []string) (uint, error) { + args := m.Called(ctx, hashes) + return args.Get(0).(uint), args.Error(1) +} diff --git a/test/pegout_quote_repository_mock.go b/test/pegout_quote_repository_mock.go index 20ccc4fc..d63e9f7d 100644 --- a/test/pegout_quote_repository_mock.go +++ b/test/pegout_quote_repository_mock.go @@ -60,3 +60,23 @@ func (m *PegoutQuoteRepositoryMock) ListPegoutDepositsByAddress(ctx context.Cont return arg.([]quote.PegoutDeposit), args.Error(1) } } + +func (m *PegoutQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PegoutState) ([]quote.RetainedPegoutQuote, error) { + args := m.Called(ctx, states) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.([]quote.RetainedPegoutQuote), args.Error(1) + } +} + +func (m *PegoutQuoteRepositoryMock) DeleteQuotes(ctx context.Context, hashes []string) (uint, error) { + args := m.Called(ctx, hashes) + return args.Get(0).(uint), args.Error(1) +} + +func (m *PegoutQuoteRepositoryMock) UpsertPegoutDeposit(ctx context.Context, deposit quote.PegoutDeposit) error { + args := m.Called(ctx, deposit) + return args.Error(0) +} From 701112b08bd108c791c565373d8b1b6e284d040c Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Sat, 10 Feb 2024 14:46:12 -0300 Subject: [PATCH 014/113] test: enable test linting --- .golangci.yml | 2 +- internal/configuration/registry/usecase.go | 1 + internal/entities/blockchain/bitcoin_test.go | 38 +++--- .../entities/blockchain/rootstock_test.go | 23 ++-- internal/entities/quote/pegin_quote_test.go | 93 +++----------- internal/entities/quote/pegout_quote_test.go | 85 ++----------- internal/entities/wei_test.go | 24 ++-- internal/usecases/common_test.go | 26 ++-- internal/usecases/health_test.go | 3 - .../liquidity_provider/change_status_test.go | 8 +- .../check_liquidity_test.go | 32 ++--- .../liquidity_provider/common_test.go | 7 +- .../liquidity_provider/get_providers_test.go | 5 +- .../penalization_alert_test.go | 5 +- .../provider_detail_test.go | 7 +- .../liquidity_provider/registration_test.go | 46 ++++--- .../liquidity_provider/resign_test.go | 7 +- .../pegout/accept_pegout_quote_test.go | 55 ++++---- .../usecases/pegout/add_collateral_test.go | 7 +- internal/usecases/pegout/expire_qupte_test.go | 5 +- .../usecases/pegout/get_collateral_test.go | 5 +- .../usecases/pegout/get_pegout_quote_test.go | 116 +++++++++-------- .../usecases/pegout/get_user_deposits_test.go | 7 +- .../pegout/init_deposits_cache_test.go | 5 +- .../usecases/pegout/refund_pegout_test.go | 118 ++++++++---------- internal/usecases/pegout/send_pegout_test.go | 51 ++++---- .../pegout/withdraw_collateral_test.go | 11 +- .../usecases/watcher/clean_exipred_test.go | 7 +- .../watcher/get_watched_pegin_quote_test.go | 19 ++- .../watcher/get_watched_pegout_quote_test.go | 19 ++- .../watcher/update_pegout_deposit_test.go | 9 +- test/lbc_mock.go | 3 + test/pegin_quote_repository_mock.go | 5 + 33 files changed, 373 insertions(+), 481 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index a0a58d50..f401c654 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,5 +1,5 @@ run: - tests: false + tests: true skip-dirs: - internal/adapters/dataproviders/rootstock/bindings linters: diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 38a65366..b4cd421f 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -166,6 +166,7 @@ func NewUseCaseRegistry( alertSender, env.Provider.AlertRecipientEmail, ), + addPeginCollateralUseCase: pegin.NewAddCollateralUseCase(rskRegistry.Lbc, liquidityProvider), addPegoutCollateralUseCase: pegout.NewAddCollateralUseCase(rskRegistry.Lbc, liquidityProvider), changeStatusUseCase: liquidity_provider.NewChangeStatusUseCase(rskRegistry.Lbc, liquidityProvider), resignUseCase: liquidity_provider.NewResignUseCase(rskRegistry.Lbc, liquidityProvider), diff --git a/internal/entities/blockchain/bitcoin_test.go b/internal/entities/blockchain/bitcoin_test.go index d52f451f..1126e4c5 100644 --- a/internal/entities/blockchain/bitcoin_test.go +++ b/internal/entities/blockchain/bitcoin_test.go @@ -2,7 +2,7 @@ package blockchain_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" - "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + blockchain "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "testing" @@ -245,16 +245,14 @@ var nativeSegwitMainnetAddresses = []string{ func TestBitcoinTransactionInformation_AmountToAddress(t *testing.T) { address := "2N2Sg8C2uX1YtugYSxEQvRqf9V2EivxcWER" cases := test.Table[blockchain.BitcoinTransactionInformation, *entities.Wei]{ - {blockchain.BitcoinTransactionInformation{ + {Value: blockchain.BitcoinTransactionInformation{ Hash: "0x1234", Confirmations: 1, - Outputs: map[string][]*entities.Wei{ - address: {entities.NewWei(500)}, - }, + Outputs: map[string][]*entities.Wei{address: {entities.NewWei(500)}}, }, - entities.NewWei(500), + Result: entities.NewWei(500), }, - {blockchain.BitcoinTransactionInformation{ + {Value: blockchain.BitcoinTransactionInformation{ Hash: "0x1234", Confirmations: 1, Outputs: map[string][]*entities.Wei{ @@ -263,9 +261,9 @@ func TestBitcoinTransactionInformation_AmountToAddress(t *testing.T) { "2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(300)}, }, }, - entities.NewWei(500), + Result: entities.NewWei(500), }, - {blockchain.BitcoinTransactionInformation{ + {Value: blockchain.BitcoinTransactionInformation{ Hash: "0x1234", Confirmations: 1, Outputs: map[string][]*entities.Wei{ @@ -274,32 +272,28 @@ func TestBitcoinTransactionInformation_AmountToAddress(t *testing.T) { "2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(300)}, }, }, - entities.NewWei(1600), + Result: entities.NewWei(1600), }, - {blockchain.BitcoinTransactionInformation{ + {Value: blockchain.BitcoinTransactionInformation{ Hash: "0x1234", Confirmations: 1, - Outputs: map[string][]*entities.Wei{ - address: {entities.NewWei(400), entities.NewWei(1100)}, - }, + Outputs: map[string][]*entities.Wei{address: {entities.NewWei(400), entities.NewWei(1100)}}, }, - entities.NewWei(1500), + Result: entities.NewWei(1500), }, - {blockchain.BitcoinTransactionInformation{ + {Value: blockchain.BitcoinTransactionInformation{ Hash: "0x1234", Confirmations: 1, Outputs: map[string][]*entities.Wei{}, }, - entities.NewWei(0), + Result: entities.NewWei(0), }, - {blockchain.BitcoinTransactionInformation{ + {Value: blockchain.BitcoinTransactionInformation{ Hash: "0x1234", Confirmations: 1, - Outputs: map[string][]*entities.Wei{ - "2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(400), entities.NewWei(1100)}, - }, + Outputs: map[string][]*entities.Wei{"2MvHto2NWaAtiMeDsy2oAHesnK8Rug3Lavc": {entities.NewWei(400), entities.NewWei(1100)}}, }, - entities.NewWei(0), + Result: entities.NewWei(0), }, } diff --git a/internal/entities/blockchain/rootstock_test.go b/internal/entities/blockchain/rootstock_test.go index 3b3a6d36..73b41d4d 100644 --- a/internal/entities/blockchain/rootstock_test.go +++ b/internal/entities/blockchain/rootstock_test.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -50,16 +51,16 @@ func TestIsRskAddress(t *testing.T) { func TestDecodeStringTrimPrefix(t *testing.T) { cases := test.Table[string, []byte]{ - {"0x7C4890A0f1D4bBf2C669Ac2d1efFa185c505359b", []byte{124, 72, 144, 160, 241, 212, 187, 242, 198, 105, 172, 45, 30, 255, 161, 133, 197, 5, 53, 155}}, - {"0x79568c2989232dCa1840087D73d403602364c0D4", []byte{121, 86, 140, 41, 137, 35, 45, 202, 24, 64, 8, 125, 115, 212, 3, 96, 35, 100, 192, 212}}, - {"0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", []byte{213, 240, 10, 191, 190, 167, 160, 177, 147, 131, 108, 172, 104, 51, 194, 173, 157, 6, 206, 168}}, - {"0x892813507Bf3aBF2890759d2135Ec34f4909Fea5", []byte{137, 40, 19, 80, 123, 243, 171, 242, 137, 7, 89, 210, 19, 94, 195, 79, 73, 9, 254, 165}}, - {"0x5dE07e2BE63595854C396E2da291e0d1EdE15112", []byte{93, 224, 126, 43, 230, 53, 149, 133, 76, 57, 110, 45, 162, 145, 224, 209, 237, 225, 81, 18}}, - {"0x0D8Fb5d32704DB2931e05DB91F64BcA6f76Ce573", []byte{13, 143, 181, 211, 39, 4, 219, 41, 49, 224, 93, 185, 31, 100, 188, 166, 247, 108, 229, 115}}, - {"0x8dccd82443B80DDdE3690af86746bfd9d766F8D2", []byte{141, 204, 216, 36, 67, 184, 13, 221, 227, 105, 10, 248, 103, 70, 191, 217, 215, 102, 248, 210}}, - {"0xa2011668bd246f9Aa10623f3Cfea704E3b6c0C3b", []byte{162, 1, 22, 104, 189, 36, 111, 154, 161, 6, 35, 243, 207, 234, 112, 78, 59, 108, 12, 59}}, - {"0xBb519e5dCB3f98ED0c48238b42BFa3fd4d1a5E45", []byte{187, 81, 158, 93, 203, 63, 152, 237, 12, 72, 35, 139, 66, 191, 163, 253, 77, 26, 94, 69}}, - {"0xe8d8c8f343522fd53c45c71723B93D735b149220", []byte{232, 216, 200, 243, 67, 82, 47, 213, 60, 69, 199, 23, 35, 185, 61, 115, 91, 20, 146, 32}}, + {Value: "0x7C4890A0f1D4bBf2C669Ac2d1efFa185c505359b", Result: []byte{124, 72, 144, 160, 241, 212, 187, 242, 198, 105, 172, 45, 30, 255, 161, 133, 197, 5, 53, 155}}, + {Value: "0x79568c2989232dCa1840087D73d403602364c0D4", Result: []byte{121, 86, 140, 41, 137, 35, 45, 202, 24, 64, 8, 125, 115, 212, 3, 96, 35, 100, 192, 212}}, + {Value: "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", Result: []byte{213, 240, 10, 191, 190, 167, 160, 177, 147, 131, 108, 172, 104, 51, 194, 173, 157, 6, 206, 168}}, + {Value: "0x892813507Bf3aBF2890759d2135Ec34f4909Fea5", Result: []byte{137, 40, 19, 80, 123, 243, 171, 242, 137, 7, 89, 210, 19, 94, 195, 79, 73, 9, 254, 165}}, + {Value: "0x5dE07e2BE63595854C396E2da291e0d1EdE15112", Result: []byte{93, 224, 126, 43, 230, 53, 149, 133, 76, 57, 110, 45, 162, 145, 224, 209, 237, 225, 81, 18}}, + {Value: "0x0D8Fb5d32704DB2931e05DB91F64BcA6f76Ce573", Result: []byte{13, 143, 181, 211, 39, 4, 219, 41, 49, 224, 93, 185, 31, 100, 188, 166, 247, 108, 229, 115}}, + {Value: "0x8dccd82443B80DDdE3690af86746bfd9d766F8D2", Result: []byte{141, 204, 216, 36, 67, 184, 13, 221, 227, 105, 10, 248, 103, 70, 191, 217, 215, 102, 248, 210}}, + {Value: "0xa2011668bd246f9Aa10623f3Cfea704E3b6c0C3b", Result: []byte{162, 1, 22, 104, 189, 36, 111, 154, 161, 6, 35, 243, 207, 234, 112, 78, 59, 108, 12, 59}}, + {Value: "0xBb519e5dCB3f98ED0c48238b42BFa3fd4d1a5E45", Result: []byte{187, 81, 158, 93, 203, 63, 152, 237, 12, 72, 35, 139, 66, 191, 163, 253, 77, 26, 94, 69}}, + {Value: "0xe8d8c8f343522fd53c45c71723B93D735b149220", Result: []byte{232, 216, 200, 243, 67, 82, 47, 213, 60, 69, 199, 23, 35, 185, 61, 115, 91, 20, 146, 32}}, } var bytes []byte test.RunTable(t, cases, func(address string) []byte { @@ -78,6 +79,6 @@ func TestDecodeStringTrim_Fail(t *testing.T) { var err error for _, address := range badAddresses { _, err = blockchain.DecodeStringTrimPrefix(address) - assert.NotNil(t, err) + require.Error(t, err) } } diff --git a/internal/entities/quote/pegin_quote_test.go b/internal/entities/quote/pegin_quote_test.go index aad183ff..95621623 100644 --- a/internal/entities/quote/pegin_quote_test.go +++ b/internal/entities/quote/pegin_quote_test.go @@ -14,98 +14,37 @@ func TestPeginQuote_Total(t *testing.T) { quotes := test.Table[quote.PeginQuote, *entities.Wei]{ { Value: quote.PeginQuote{ - FedBtcAddress: "any addrees", - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - PenaltyFee: entities.NewWei(1), - ContractAddress: "any addrees", - Data: "", - GasLimit: 1, - Nonce: 1, - Value: entities.NewWei(400000000000000000), - AgreementTimestamp: 1, - TimeForDeposit: 1, - LpCallTime: 1, - Confirmations: 1, - CallOnRegister: false, - GasFee: entities.NewWei(100000000000000000), - ProductFeeAmount: 200000000000000000, + CallFee: nil, + Value: entities.NewWei(400000000000000000), + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, }, Result: entities.NewWei(700000000000000000), }, { Value: quote.PeginQuote{ - FedBtcAddress: "any addrees", - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - CallFee: entities.NewWei(300000000000000000), - PenaltyFee: entities.NewWei(1), - ContractAddress: "any addrees", - Data: "", - GasLimit: 1, - Nonce: 1, - AgreementTimestamp: 1, - TimeForDeposit: 1, - LpCallTime: 1, - Confirmations: 1, - CallOnRegister: false, - GasFee: entities.NewWei(100000000000000000), - ProductFeeAmount: 200000000000000000, + CallFee: entities.NewWei(300000000000000000), + Value: nil, + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, }, Result: entities.NewWei(600000000000000000), }, { Value: quote.PeginQuote{ - FedBtcAddress: "any addrees", - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - CallFee: entities.NewWei(300000000000000000), - PenaltyFee: entities.NewWei(1), - ContractAddress: "any addrees", - Data: "", - GasLimit: 1, - Nonce: 1, - Value: entities.NewWei(400000000000000000), - AgreementTimestamp: 1, - TimeForDeposit: 1, - LpCallTime: 1, - Confirmations: 1, - CallOnRegister: false, - GasFee: entities.NewWei(100000000000000000), - ProductFeeAmount: 0, + CallFee: entities.NewWei(300000000000000000), + Value: entities.NewWei(400000000000000000), + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 0, }, Result: entities.NewWei(800000000000000000), }, { Value: quote.PeginQuote{ - FedBtcAddress: "any addrees", - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - CallFee: entities.NewWei(300000000000000000), - PenaltyFee: entities.NewWei(1), - ContractAddress: "any addrees", - Data: "", - GasLimit: 1, - Nonce: 1, - Value: entities.NewWei(400000000000000000), - AgreementTimestamp: 1, - TimeForDeposit: 1, - LpCallTime: 1, - Confirmations: 1, - CallOnRegister: false, - ProductFeeAmount: 200000000000000000, + CallFee: entities.NewWei(300000000000000000), + Value: entities.NewWei(400000000000000000), + ProductFeeAmount: 200000000000000000, + GasFee: nil, }, Result: entities.NewWei(900000000000000000), }, diff --git a/internal/entities/quote/pegout_quote_test.go b/internal/entities/quote/pegout_quote_test.go index 71310a8e..046d40e3 100644 --- a/internal/entities/quote/pegout_quote_test.go +++ b/internal/entities/quote/pegout_quote_test.go @@ -24,94 +24,33 @@ func TestPegoutQuote_Total(t *testing.T) { quotes := test.Table[quote.PegoutQuote, *entities.Wei]{ { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - PenaltyFee: 1, - Nonce: 1, - DepositAddress: "any addrees", - Value: entities.NewWei(400000000000000000), - AgreementTimestamp: 1, - DepositDateLimit: 1, - DepositConfirmations: 1, - TransferTime: 1, - TransferConfirmations: 1, - ExpireDate: 1, - ExpireBlock: 1, - GasFee: entities.NewWei(100000000000000000), - ProductFeeAmount: 200000000000000000, + Value: entities.NewWei(400000000000000000), + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, }, Result: entities.NewWei(700000000000000000), }, { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - CallFee: entities.NewWei(300000000000000000), - PenaltyFee: 1, - Nonce: 1, - DepositAddress: "any addrees", - AgreementTimestamp: 1, - DepositDateLimit: 1, - DepositConfirmations: 1, - TransferTime: 1, - TransferConfirmations: 1, - ExpireDate: 1, - ExpireBlock: 1, - GasFee: entities.NewWei(100000000000000000), - ProductFeeAmount: 200000000000000000, + CallFee: entities.NewWei(300000000000000000), + GasFee: entities.NewWei(100000000000000000), + ProductFeeAmount: 200000000000000000, }, Result: entities.NewWei(600000000000000000), }, { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - CallFee: entities.NewWei(300000000000000000), - PenaltyFee: 1, - Nonce: 1, - DepositAddress: "any addrees", - Value: entities.NewWei(400000000000000000), - AgreementTimestamp: 1, - DepositDateLimit: 1, - DepositConfirmations: 1, - TransferTime: 1, - TransferConfirmations: 1, - ExpireDate: 1, - ExpireBlock: 1, - GasFee: entities.NewWei(100000000000000000), - ProductFeeAmount: 0, + CallFee: entities.NewWei(300000000000000000), + Value: entities.NewWei(400000000000000000), + GasFee: entities.NewWei(100000000000000000), }, Result: entities.NewWei(800000000000000000), }, { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", - CallFee: entities.NewWei(300000000000000000), - PenaltyFee: 1, - Nonce: 1, - DepositAddress: "any addrees", - Value: entities.NewWei(400000000000000000), - AgreementTimestamp: 1, - DepositDateLimit: 1, - DepositConfirmations: 1, - TransferTime: 1, - TransferConfirmations: 1, - ExpireDate: 1, - ExpireBlock: 1, - ProductFeeAmount: 200000000000000000, + CallFee: entities.NewWei(300000000000000000), + Value: entities.NewWei(400000000000000000), + ProductFeeAmount: 200000000000000000, }, Result: entities.NewWei(900000000000000000), }, diff --git a/internal/entities/wei_test.go b/internal/entities/wei_test.go index a71d1dc7..f0101ca3 100644 --- a/internal/entities/wei_test.go +++ b/internal/entities/wei_test.go @@ -2,7 +2,7 @@ package entities_test import ( "database/sql/driver" - "github.com/rsksmart/liquidity-provider-server/internal/entities" + entities "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -435,11 +435,11 @@ func TestWei_UnmarshalJSON(t *testing.T) { func TestWei_UnmarshalBSONValue(t *testing.T) { errorCases := test.Table[bsontype.Type, error]{ - {bson.TypeInt64, nil}, - {bson.TypeString, entities.DeserializationError}, - {bson.TypeDBPointer, entities.DeserializationError}, - {bson.TypeBinary, entities.DeserializationError}, - {bson.TypeDouble, entities.DeserializationError}, + {Value: bson.TypeInt64}, + {Value: bson.TypeString, Result: entities.DeserializationError}, + {Value: bson.TypeDBPointer, Result: entities.DeserializationError}, + {Value: bson.TypeBinary, Result: entities.DeserializationError}, + {Value: bson.TypeDouble, Result: entities.DeserializationError}, } type result struct { @@ -447,12 +447,12 @@ func TestWei_UnmarshalBSONValue(t *testing.T) { bytes []byte } successCases := test.Table[*entities.Wei, result]{ - {nil, result{err: entities.SerializationError, bytes: make([]byte, 0)}}, - {entities.NewWei(5), result{nil, []byte{5, 0, 0, 0, 0, 0, 0, 0}}}, - {entities.NewWei(77), result{nil, []byte{77, 0, 0, 0, 0, 0, 0, 0}}}, - {entities.NewWei(5678), result{nil, []byte{46, 22, 0, 0, 0, 0, 0, 0}}}, - {entities.NewWei(math.MaxInt64 - 500), result{nil, []byte{11, 254, 255, 255, 255, 255, 255, 127}}}, - {entities.NewWei(math.MaxInt64), result{nil, []byte{255, 255, 255, 255, 255, 255, 255, 127}}}, + {Result: result{err: entities.SerializationError, bytes: make([]byte, 0)}}, + {Value: entities.NewWei(5), Result: result{nil, []byte{5, 0, 0, 0, 0, 0, 0, 0}}}, + {Value: entities.NewWei(77), Result: result{nil, []byte{77, 0, 0, 0, 0, 0, 0, 0}}}, + {Value: entities.NewWei(5678), Result: result{nil, []byte{46, 22, 0, 0, 0, 0, 0, 0}}}, + {Value: entities.NewWei(math.MaxInt64 - 500), Result: result{nil, []byte{11, 254, 255, 255, 255, 255, 255, 127}}}, + {Value: entities.NewWei(math.MaxInt64), Result: result{nil, []byte{255, 255, 255, 255, 255, 255, 255, 127}}}, } var nilWei *entities.Wei diff --git a/internal/usecases/common_test.go b/internal/usecases/common_test.go index cea5108b..b876957a 100644 --- a/internal/usecases/common_test.go +++ b/internal/usecases/common_test.go @@ -49,26 +49,26 @@ func TestCalculateDaoAmounts(t *testing.T) { cases := test.Table[testArgs, u.DaoAmounts]{ { - testArgs{entities.NewWei(1000000000000000000), 0}, - u.DaoAmounts{DaoFeeAmount: entities.NewWei(0), DaoGasAmount: entities.NewWei(0)}, + Value: testArgs{entities.NewWei(1000000000000000000), 0}, + Result: u.DaoAmounts{DaoFeeAmount: entities.NewWei(0), DaoGasAmount: entities.NewWei(0)}, }, { - testArgs{entities.NewWei(500000000000000000), 50}, - u.DaoAmounts{ + Value: testArgs{entities.NewWei(500000000000000000), 50}, + Result: u.DaoAmounts{ DaoGasAmount: entities.NewWei(500000000000000), DaoFeeAmount: entities.NewWei(250000000000000000), }, }, { - testArgs{entities.NewWei(6000000000000000000), 1}, - u.DaoAmounts{ + Value: testArgs{entities.NewWei(6000000000000000000), 1}, + Result: u.DaoAmounts{ DaoGasAmount: entities.NewWei(500000000000000), DaoFeeAmount: entities.NewWei(60000000000000000), }, }, { - testArgs{entities.NewWei(7700000000000000000), 17}, - u.DaoAmounts{ + Value: testArgs{entities.NewWei(7700000000000000000), 17}, + Result: u.DaoAmounts{ DaoGasAmount: entities.NewWei(500000000000000), DaoFeeAmount: entities.NewWei(1309000000000000000), }, @@ -89,7 +89,7 @@ func TestCalculateDaoAmounts_Fail(t *testing.T) { Return(entities.NewWei(0), errors.New("some error")) result, err := u.CalculateDaoAmounts(ctx, &rpc, entities.NewUWei(500000000000000), 1, "0x1234") require.Equal(t, u.DaoAmounts{}, result) - require.NotNil(t, err) + require.Error(t, err) } func TestGetRandomInt(t *testing.T) { @@ -100,7 +100,7 @@ func TestGetRandomInt(t *testing.T) { number, err = u.GetRandomInt() assert.Positive(t, number) assert.False(t, slices.Contains(numbers, number)) - assert.Nil(t, err) + require.NoError(t, err) numbers = append(numbers, number) } } @@ -112,13 +112,13 @@ func TestValidateMinLockValue(t *testing.T) { bridge.On("GetMinimumLockTxValue").Return(entities.SatoshiToWei(oneBtcInSatoshi), nil) err := u.ValidateMinLockValue(useCase, bridge, entities.SatoshiToWei(oneBtcInSatoshi)) - assert.Nil(t, err) + require.NoError(t, err) err = u.ValidateMinLockValue(useCase, bridge, entities.SatoshiToWei(oneBtcInSatoshi+1)) - assert.Nil(t, err) + require.NoError(t, err) value := new(entities.Wei).Sub(entities.SatoshiToWei(oneBtcInSatoshi), entities.NewWei(1)) err = u.ValidateMinLockValue(useCase, bridge, value) - assert.NotNil(t, err) + require.Error(t, err) assert.Equal(t, "anyUseCase: requested amount below bridge's min transaction value. Args: {\"minimum\":\"1000000000000000000\",\"value\":\"999999999999999999\"}", err.Error()) } diff --git a/internal/usecases/health_test.go b/internal/usecases/health_test.go index 82f71b5d..14d200aa 100644 --- a/internal/usecases/health_test.go +++ b/internal/usecases/health_test.go @@ -55,7 +55,6 @@ func TestHealthUseCase_Run(t *testing.T) { Db: u.SvcStatusOk, }, }, badHealthRsk) - assert.Equal(t, u.HealthStatus{ Status: u.SvcStatusDegraded, Services: u.Services{ @@ -64,7 +63,6 @@ func TestHealthUseCase_Run(t *testing.T) { Db: u.SvcStatusOk, }, }, badHealthBtc) - assert.Equal(t, u.HealthStatus{ Status: u.SvcStatusDegraded, Services: u.Services{ @@ -73,7 +71,6 @@ func TestHealthUseCase_Run(t *testing.T) { Db: u.SvcStatusUnreachable, }, }, badHealthDb) - assert.Equal(t, u.HealthStatus{ Status: u.SvcStatusOk, Services: u.Services{ diff --git a/internal/usecases/liquidity_provider/change_status_test.go b/internal/usecases/liquidity_provider/change_status_test.go index 9f70b467..ef014eb2 100644 --- a/internal/usecases/liquidity_provider/change_status_test.go +++ b/internal/usecases/liquidity_provider/change_status_test.go @@ -5,8 +5,8 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -34,7 +34,7 @@ func TestChangeStatusUseCase_Run(t *testing.T) { err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) lbc.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestChangeStatusUseCase_Run_Fail(t *testing.T) { @@ -47,7 +47,7 @@ func TestChangeStatusUseCase_Run_Fail(t *testing.T) { ).Once() err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) lbc.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ {Id: 1, Address: "0x01"}, @@ -56,5 +56,5 @@ func TestChangeStatusUseCase_Run_Fail(t *testing.T) { lbc.On("SetProviderStatus", mock.Anything, mock.Anything).Return(errors.New("some error")).Once() err = liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) lbc.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } diff --git a/internal/usecases/liquidity_provider/check_liquidity_test.go b/internal/usecases/liquidity_provider/check_liquidity_test.go index 29a159ee..a1bdb964 100644 --- a/internal/usecases/liquidity_provider/check_liquidity_test.go +++ b/internal/usecases/liquidity_provider/check_liquidity_test.go @@ -10,6 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -25,7 +26,7 @@ func TestCheckLiquidityUseCase_Run(t *testing.T) { bridge.AssertExpectations(t) provider.AssertExpectations(t) alertSender.AssertNotCalled(t, "SendAlert") - assert.Nil(t, err) + require.NoError(t, err) } func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { @@ -47,7 +48,7 @@ func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { bridge.AssertExpectations(t) alertSender.AssertExpectations(t) provider.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { @@ -69,10 +70,10 @@ func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { bridge.AssertExpectations(t) provider.AssertExpectations(t) alertSender.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } -func TestCheckLiquidityUseCase_Run_ErrorHandling(t *testing.T) { +func TestCheckLiquidityUseCase_Run_NoRecoverableErrorHandling(t *testing.T) { recipient := "anything" cases := test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ { @@ -105,21 +106,19 @@ func TestCheckLiquidityUseCase_Run_ErrorHandling(t *testing.T) { provider.AssertExpectations(t) sender.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } +} - cases = test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ +func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { + recipient := "anything" + cases := test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ { Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() - sender.On("SendAlert", - mock.AnythingOfType("context.backgroundCtx"), - mock.Anything, - mock.Anything, - mock.Anything, - ).Return(assert.AnError).Once() + sender.On("SendAlert", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError).Once() }, }, { @@ -127,12 +126,7 @@ func TestCheckLiquidityUseCase_Run_ErrorHandling(t *testing.T) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() - sender.On("SendAlert", - mock.AnythingOfType("context.backgroundCtx"), - mock.Anything, - mock.Anything, - mock.Anything, - ).Return(assert.AnError).Once() + sender.On("SendAlert", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError).Once() }, }, } @@ -150,6 +144,6 @@ func TestCheckLiquidityUseCase_Run_ErrorHandling(t *testing.T) { bridge.AssertExpectations(t) provider.AssertExpectations(t) sender.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } } diff --git a/internal/usecases/liquidity_provider/common_test.go b/internal/usecases/liquidity_provider/common_test.go index 7c015f05..1c717baf 100644 --- a/internal/usecases/liquidity_provider/common_test.go +++ b/internal/usecases/liquidity_provider/common_test.go @@ -7,6 +7,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -44,7 +45,7 @@ func TestValidateConfiguredProvider(t *testing.T) { id, err := liquidity_provider.ValidateConfiguredProvider(provider, lbc) assert.Equal(t, uint64(2), id) - assert.Nil(t, err) + require.NoError(t, err) } func TestValidateConfiguredProvider_Fail(t *testing.T) { @@ -53,7 +54,7 @@ func TestValidateConfiguredProvider_Fail(t *testing.T) { lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{}, errors.New("some error")).Once() id, err := liquidity_provider.ValidateConfiguredProvider(provider, lbc) assert.Equal(t, uint64(0), id) - assert.NotNil(t, err) + require.Error(t, err) provider = &test.ProviderMock{} provider.On("RskAddress").Return("0x02") @@ -69,5 +70,5 @@ func TestValidateConfiguredProvider_Fail(t *testing.T) { }, nil).Once() id, err = liquidity_provider.ValidateConfiguredProvider(provider, lbc) assert.Equal(t, uint64(0), id) - assert.ErrorIs(t, err, usecases.ProviderConfigurationError) + require.ErrorIs(t, err, usecases.ProviderConfigurationError) } diff --git a/internal/usecases/liquidity_provider/get_providers_test.go b/internal/usecases/liquidity_provider/get_providers_test.go index ec48fae3..17c7c60c 100644 --- a/internal/usecases/liquidity_provider/get_providers_test.go +++ b/internal/usecases/liquidity_provider/get_providers_test.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -26,7 +27,7 @@ func TestGetProvidersUseCase_Run(t *testing.T) { result, err := useCase.Run() lbc.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) assert.Equal(t, []entities.RegisteredLiquidityProvider{provider}, result) } @@ -42,6 +43,6 @@ func TestGetProvidersUseCase_Run_Fail(t *testing.T) { result, err := useCase.Run() lbc.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) assert.Equal(t, []entities.RegisteredLiquidityProvider{}, result) } diff --git a/internal/usecases/liquidity_provider/penalization_alert_test.go b/internal/usecases/liquidity_provider/penalization_alert_test.go index 6362cea1..e7c626d4 100644 --- a/internal/usecases/liquidity_provider/penalization_alert_test.go +++ b/internal/usecases/liquidity_provider/penalization_alert_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -53,7 +54,7 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, recipient) err := useCase.Run(context.Background(), 5, 10) - assert.Nil(t, err) + require.NoError(t, err) lbc.AssertExpectations(t) sender.AssertExpectations(t) } @@ -66,5 +67,5 @@ func TestPenalizationAlertUseCase_Run_GetEvents(t *testing.T) { useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, "recipient") err := useCase.Run(context.Background(), 5, 10) lbc.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } diff --git a/internal/usecases/liquidity_provider/provider_detail_test.go b/internal/usecases/liquidity_provider/provider_detail_test.go index b804f4ec..90dd95d6 100644 --- a/internal/usecases/liquidity_provider/provider_detail_test.go +++ b/internal/usecases/liquidity_provider/provider_detail_test.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -21,8 +22,8 @@ func TestGetDetailUseCase_Run(t *testing.T) { captchaKey := "testKey" useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) result, err := useCase.Run() - assert.Nil(t, err) - assert.Equal(t, result, liquidity_provider.FullLiquidityProvider{ + require.NoError(t, err) + assert.Equal(t, liquidity_provider.FullLiquidityProvider{ SiteKey: captchaKey, Pegin: entities.LiquidityProviderDetail{ Fee: entities.NewWei(100), @@ -36,7 +37,7 @@ func TestGetDetailUseCase_Run(t *testing.T) { MaxTransactionValue: entities.NewWei(20000), RequiredConfirmations: 20, }, - }) + }, result) } func TestGetDetailUseCase_Run_InvalidCaptchaKey(t *testing.T) { diff --git a/internal/usecases/liquidity_provider/registration_test.go b/internal/usecases/liquidity_provider/registration_test.go index f1542cca..c26a411d 100644 --- a/internal/usecases/liquidity_provider/registration_test.go +++ b/internal/usecases/liquidity_provider/registration_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -26,7 +27,7 @@ func TestRegistrationUseCase_Run_AlreadyRegistered(t *testing.T) { lbc.AssertExpectations(t) provider.AssertExpectations(t) assert.Equal(t, int64(0), id) - assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) + require.ErrorIs(t, err, usecases.AlreadyRegisteredError) } func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { @@ -45,7 +46,7 @@ func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { for _, c := range cases { id, err = useCase.Run(c) assert.Equal(t, int64(0), id) - assert.NotNil(t, err) + require.Error(t, err) } } @@ -66,7 +67,7 @@ func TestRegistrationUseCase_Run_AddPeginCollateralIfNotOperational(t *testing.T provider.AssertExpectations(t) lbc.AssertNotCalled(t, "AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")) assert.Equal(t, int64(0), id) - assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) + require.ErrorIs(t, err, usecases.AlreadyRegisteredError) } func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing.T) { @@ -86,7 +87,7 @@ func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing. provider.AssertExpectations(t) lbc.AssertNotCalled(t, "AddCollateral", mock.AnythingOfType("*entities.Wei")) assert.Equal(t, int64(0), id) - assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) + require.ErrorIs(t, err, usecases.AlreadyRegisteredError) } func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { @@ -106,7 +107,7 @@ func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { lbc.AssertExpectations(t) provider.AssertExpectations(t) assert.Equal(t, int64(0), id) - assert.ErrorIs(t, err, usecases.AlreadyRegisteredError) + require.ErrorIs(t, err, usecases.AlreadyRegisteredError) } func TestRegistrationUseCase_Run(t *testing.T) { @@ -131,11 +132,29 @@ func TestRegistrationUseCase_Run(t *testing.T) { lbc.AssertNotCalled(t, "AddPegoutCollateral") provider.AssertExpectations(t) assert.Equal(t, int64(1), id) - assert.Nil(t, err) + require.NoError(t, err) } func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { - cases := test.Table[func(mock *test.LbcMock), error]{ + cases := registrationUseCaseUnexpectedErrorSetups() + + for _, testCase := range cases { + lbc := &test.LbcMock{} + testCase.Value(lbc) // setup function + provider := &test.ProviderMock{} + provider.On("RskAddress").Return("rskAddress") + useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + id, err := useCase.Run(params) + lbc.AssertExpectations(t) + assert.Equal(t, int64(0), id) + require.Error(t, err) + } +} + +// nolint:funlen +func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *test.LbcMock), error] { + return test.Table[func(mock *test.LbcMock), error]{ { Value: func(lbc *test.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(0), assert.AnError) @@ -207,17 +226,4 @@ func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { }, }, } - - for _, testCase := range cases { - lbc := &test.LbcMock{} - testCase.Value(lbc) // setup function - provider := &test.ProviderMock{} - provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") - id, err := useCase.Run(params) - lbc.AssertExpectations(t) - assert.Equal(t, int64(0), id) - assert.NotNil(t, err) - } } diff --git a/internal/usecases/liquidity_provider/resign_test.go b/internal/usecases/liquidity_provider/resign_test.go index 571aa3a0..59848748 100644 --- a/internal/usecases/liquidity_provider/resign_test.go +++ b/internal/usecases/liquidity_provider/resign_test.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -23,7 +24,7 @@ func TestResignUseCase_Run(t *testing.T) { useCase := liquidity_provider.NewResignUseCase(lbc, provider) err := useCase.Run() lbc.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestResignUseCase_Run_NotRegistered(t *testing.T) { @@ -39,7 +40,7 @@ func TestResignUseCase_Run_NotRegistered(t *testing.T) { useCase := liquidity_provider.NewResignUseCase(lbc, provider) err := useCase.Run() lbc.AssertExpectations(t) - assert.ErrorIs(t, err, usecases.ProviderConfigurationError) + require.ErrorIs(t, err, usecases.ProviderConfigurationError) } func TestResignUseCase_Run_Error(t *testing.T) { @@ -56,5 +57,5 @@ func TestResignUseCase_Run_Error(t *testing.T) { useCase := liquidity_provider.NewResignUseCase(lbc, provider) err := useCase.Run() lbc.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } diff --git a/internal/usecases/pegout/accept_pegout_quote_test.go b/internal/usecases/pegout/accept_pegout_quote_test.go index 7d1adf99..633610b2 100644 --- a/internal/usecases/pegout/accept_pegout_quote_test.go +++ b/internal/usecases/pegout/accept_pegout_quote_test.go @@ -10,6 +10,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" "time" ) @@ -57,9 +58,7 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() eventBus := new(test.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPegoutQuoteEvent) bool { - return assert.Equal(t, quoteMock, event.Quote) && - assert.Equal(t, retainedQuote, event.RetainedQuote) && - assert.Equal(t, quote.AcceptedPegoutQuoteEventId, event.Event.Id()) + return assert.Equal(t, quoteMock, event.Quote) && assert.Equal(t, retainedQuote, event.RetainedQuote) && assert.Equal(t, quote.AcceptedPegoutQuoteEventId, event.Event.Id()) })).Once() mutex := new(test.MutexMock) @@ -72,7 +71,7 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { lp.AssertExpectations(t) eventBus.AssertExpectations(t) mutex.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) assert.NotEmpty(t, result) assert.Equal(t, quoteMock.LbcAddress, result.DepositAddress) assert.Equal(t, signature, result.Signature) @@ -125,7 +124,7 @@ func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { eventBus.AssertNotCalled(t, "Publish") mutex.AssertNotCalled(t, "Lock") mutex.AssertNotCalled(t, "Unlock") - assert.Nil(t, err) + require.NoError(t, err) assert.NotEmpty(t, result) assert.Equal(t, quoteMock.LbcAddress, result.DepositAddress) assert.Equal(t, "signature", result.Signature) @@ -172,7 +171,7 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { mutex.AssertNotCalled(t, "Lock") mutex.AssertNotCalled(t, "Unlock") assert.Empty(t, result) - assert.ErrorIs(t, err, usecases.ExpiredQuoteError) + require.ErrorIs(t, err, usecases.ExpiredQuoteError) } func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { @@ -194,7 +193,7 @@ func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { mutex.AssertNotCalled(t, "Lock") mutex.AssertNotCalled(t, "Unlock") assert.Empty(t, result) - assert.ErrorIs(t, err, usecases.QuoteNotFoundError) + require.ErrorIs(t, err, usecases.QuoteNotFoundError) } func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { @@ -241,7 +240,7 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { lp.AssertNotCalled(t, "GetAddress") eventBus.AssertNotCalled(t, "Publish") assert.Empty(t, result) - assert.ErrorIs(t, err, usecases.NoLiquidityError) + require.ErrorIs(t, err, usecases.NoLiquidityError) } func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { @@ -289,7 +288,23 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { mutex.On("Lock") mutex.On("Unlock") - cases := test.Table[func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock), error]{ + cases := acceptQuoteUseCaseUnexpectedErrorSetups("eMock, quoteHash, signature) + + for _, c := range cases { + quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + lp := new(test.ProviderMock) + c.Value(quoteRepositoryMock, lp) + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), quoteHash) + quoteRepositoryMock.AssertExpectations(t) + lp.AssertExpectations(t) + require.Error(t, err) + assert.Empty(t, result) + } +} + +func acceptQuoteUseCaseUnexpectedErrorSetups(quoteMock *quote.PegoutQuote, quoteHash, signature string) test.Table[func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock), error] { + return test.Table[func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock), error]{ { Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). @@ -298,21 +313,21 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { }, { Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return("eMock, nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError).Once() }, }, { Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() }, }, { Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() @@ -320,7 +335,7 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { }, { Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() @@ -328,18 +343,6 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { }, }, } - - for _, c := range cases { - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) - lp := new(test.ProviderMock) - c.Value(quoteRepositoryMock, lp) - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) - result, err := useCase.Run(context.Background(), quoteHash) - quoteRepositoryMock.AssertExpectations(t) - lp.AssertExpectations(t) - assert.NotNil(t, err) - assert.Empty(t, result) - } } func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) { @@ -385,6 +388,6 @@ func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) e := &validator.ValidationErrors{} - assert.ErrorAs(t, err, e) + require.ErrorAs(t, err, e) assert.Empty(t, result) } diff --git a/internal/usecases/pegout/add_collateral_test.go b/internal/usecases/pegout/add_collateral_test.go index 668614ec..e143418c 100644 --- a/internal/usecases/pegout/add_collateral_test.go +++ b/internal/usecases/pegout/add_collateral_test.go @@ -7,6 +7,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -22,7 +23,7 @@ func TestAddCollateralUseCase_Run(t *testing.T) { result, err := useCase.Run(value) lp.AssertExpectations(t) lbc.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) assert.Equal(t, entities.NewWei(1100), result) } @@ -38,7 +39,7 @@ func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { lp.AssertExpectations(t) lbc.AssertExpectations(t) lbc.AssertNotCalled(t, "AddPegoutCollateral", mock.Anything) - assert.ErrorIs(t, err, usecases.InsufficientAmountError) + require.ErrorIs(t, err, usecases.InsufficientAmountError) assert.Nil(t, result) } @@ -73,6 +74,6 @@ func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { result, err := useCase.Run(entities.NewWei(100)) lbc.AssertExpectations(t) assert.Nil(t, result) - assert.NotNil(t, err) + require.Error(t, err) } } diff --git a/internal/usecases/pegout/expire_qupte_test.go b/internal/usecases/pegout/expire_qupte_test.go index 96173d24..cdc7b64c 100644 --- a/internal/usecases/pegout/expire_qupte_test.go +++ b/internal/usecases/pegout/expire_qupte_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -27,7 +28,7 @@ func TestExpiredPegoutQuoteUseCase_Run(t *testing.T) { useCase := pegout.NewExpiredPegoutQuoteUseCase(pegoutQuoteRepository) err := useCase.Run(context.Background(), retainedQuote) pegoutQuoteRepository.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestExpiredPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { @@ -43,5 +44,5 @@ func TestExpiredPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { useCase := pegout.NewExpiredPegoutQuoteUseCase(pegoutQuoteRepository) err := useCase.Run(context.Background(), retainedQuote) pegoutQuoteRepository.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } diff --git a/internal/usecases/pegout/get_collateral_test.go b/internal/usecases/pegout/get_collateral_test.go index 8d049f79..66a26c3f 100644 --- a/internal/usecases/pegout/get_collateral_test.go +++ b/internal/usecases/pegout/get_collateral_test.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -17,7 +18,7 @@ func TestGetCollateralUseCase_Run(t *testing.T) { useCase := pegout.NewGetCollateralUseCase(lbc, lp) result, err := useCase.Run() lbc.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) assert.Equal(t, value, result) } @@ -29,6 +30,6 @@ func TestGetCollateralUseCase_Run_Error(t *testing.T) { useCase := pegout.NewGetCollateralUseCase(lbc, lp) result, err := useCase.Run() lbc.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) assert.Nil(t, result) } diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index 600517f4..43c2f175 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -5,10 +5,11 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/usecases" - "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" + pegout "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -54,8 +55,8 @@ func TestGetQuoteUseCase_Run(t *testing.T) { lp.AssertExpectations(t) btcWallet.AssertExpectations(t) assert.NotEmpty(t, result.Hash) - assert.Nil(t, entities.ValidateStruct(result.PegoutQuote)) - assert.Nil(t, err) + require.NoError(t, entities.ValidateStruct(result.PegoutQuote)) + require.NoError(t, err) } func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { @@ -70,48 +71,88 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) cases := test.Table[pegout.QuoteRequest, error]{ { - pegout.NewQuoteRequest("any address", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("any address", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.BtcAddressNotSupportedError, }, { - pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + Result: usecases.BtcAddressNotSupportedError, }, { - pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", nil, "anything", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - usecases.RskAddressNotSupportedError, + Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", nil, "anything", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.RskAddressNotSupportedError, }, { - pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + Result: usecases.BtcAddressNotSupportedError, }, { - pegout.NewQuoteRequest("bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + Result: usecases.BtcAddressNotSupportedError, }, { - pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"), + Result: usecases.BtcAddressNotSupportedError, }, { - pegout.NewQuoteRequest("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + Result: usecases.BtcAddressNotSupportedError, }, { - pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx"), - usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx"), + Result: usecases.BtcAddressNotSupportedError, }, } for _, testCase := range cases { result, err := useCase.Run(context.Background(), testCase.Value) assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) - assert.NotNil(t, err) - assert.ErrorIs(t, err, testCase.Result) + require.Error(t, err) + require.ErrorIs(t, err, testCase.Result) } } func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { - cases := test.Table[func( + cases := getQuoteUseCaseUnexpectedErrorSetups() + + request := pegout.NewQuoteRequest( + "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", + entities.NewWei(1000000000000000000), + "0x79568c2989232dCa1840087D73d403602364c0D4", + "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", + ) + feeCollectorAddress := "feeCollectorAddress" + for _, testCase := range cases { + rsk := new(test.RskRpcMock) + lp := new(test.ProviderMock) + feeCollector := new(test.FeeCollectorMock) + bridge := new(test.BridgeMock) + lbc := new(test.LbcMock) + pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + btcWallet := new(test.BtcWalletMock) + testCase.Value(rsk, feeCollector, bridge, lbc, lp, btcWallet, pegoutQuoteRepository) + lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) + lp.On("CallFeePegout").Return(entities.NewWei(200)) + lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) + lp.On("RskAddress").Return("0x1234") + lp.On("BtcAddress").Return("address") + lp.On("TimeForDepositPegout").Return(uint32(60000)) + lp.On("ExpireBlocksPegout").Return(uint64(60000)) + lbc.On("GetAddress").Return("0x1234") + useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + result, err := useCase.Run(context.Background(), request) + assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) + require.Error(t, err) + } +} + +// nolint:funlen +func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( + rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, + pegoutQuoteRepository *test.PegoutQuoteRepositoryMock, +), error] { + return test.Table[func( rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock, @@ -264,35 +305,4 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { }, }, } - - request := pegout.NewQuoteRequest( - "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", - entities.NewWei(1000000000000000000), - "0x79568c2989232dCa1840087D73d403602364c0D4", - "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", - ) - feeCollectorAddress := "feeCollectorAddress" - for _, testCase := range cases { - rsk := new(test.RskRpcMock) - lp := new(test.ProviderMock) - feeCollector := new(test.FeeCollectorMock) - bridge := new(test.BridgeMock) - lbc := new(test.LbcMock) - pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) - btcWallet := new(test.BtcWalletMock) - testCase.Value(rsk, feeCollector, bridge, lbc, lp, btcWallet, pegoutQuoteRepository) - lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) - lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) - lp.On("CallFeePegout").Return(entities.NewWei(200)) - lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) - lp.On("RskAddress").Return("0x1234") - lp.On("BtcAddress").Return("address") - lp.On("TimeForDepositPegout").Return(uint32(60000)) - lp.On("ExpireBlocksPegout").Return(uint64(60000)) - lbc.On("GetAddress").Return("0x1234") - useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) - result, err := useCase.Run(context.Background(), request) - assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) - assert.NotNil(t, err) - } } diff --git a/internal/usecases/pegout/get_user_deposits_test.go b/internal/usecases/pegout/get_user_deposits_test.go index 0292ec0f..c5bcc23a 100644 --- a/internal/usecases/pegout/get_user_deposits_test.go +++ b/internal/usecases/pegout/get_user_deposits_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" "time" ) @@ -28,8 +29,8 @@ func TestGetUserDepositsUseCase_Run(t *testing.T) { ).Return([]quote.PegoutDeposit{deposit}, nil) useCase := pegout.NewGetUserDepositsUseCase(quoteRepository) result, err := useCase.Run(context.Background(), "0x123456") - assert.Nil(t, err) - assert.Equal(t, len(result), 1) + require.NoError(t, err) + assert.Len(t, result, 1) assert.Equal(t, result[0], deposit) } @@ -42,6 +43,6 @@ func TestGetUserDepositsUseCase_Run_ErrorHandling(t *testing.T) { ).Return(nil, assert.AnError) useCase := pegout.NewGetUserDepositsUseCase(quoteRepository) result, err := useCase.Run(context.Background(), "0x123456") - assert.NotNil(t, err) + require.Error(t, err) assert.Nil(t, result) } diff --git a/internal/usecases/pegout/init_deposits_cache_test.go b/internal/usecases/pegout/init_deposits_cache_test.go index 3aba22d8..c36521e3 100644 --- a/internal/usecases/pegout/init_deposits_cache_test.go +++ b/internal/usecases/pegout/init_deposits_cache_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" "time" ) @@ -43,7 +44,7 @@ func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { rpc.AssertExpectations(t) lbc.AssertExpectations(t) pegoutRepository.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { @@ -78,6 +79,6 @@ func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { lbc.AssertExpectations(t) quoteRepository.AssertExpectations(t) rsk.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } } diff --git a/internal/usecases/pegout/refund_pegout_test.go b/internal/usecases/pegout/refund_pegout_test.go index a912af93..93a91f9d 100644 --- a/internal/usecases/pegout/refund_pegout_test.go +++ b/internal/usecases/pegout/refund_pegout_test.go @@ -10,6 +10,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "math/big" "testing" "time" @@ -88,7 +89,6 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { UserRskTxHash: retainedQuote.UserRskTxHash, LpBtcTxHash: retainedQuote.LpBtcTxHash, RefundPegoutTxHash: refundPegoutTxHash, - BridgeRefundTxHash: "", }).Return(nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ QuoteHash: retainedQuote.QuoteHash, @@ -109,9 +109,8 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { expected := retainedQuote expected.RefundPegoutTxHash = refundPegoutTxHash expected.State = quote.PegoutStateRefundPegOutSucceeded - return assert.Nil(t, event.Error) && - assert.Equal(t, expected, event.RetainedQuote) && - assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) + require.NoError(t, event.Error) + return assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) })).Return().Once() btc := new(test.BtcRpcMock) btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() @@ -121,8 +120,7 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { rskWallet := new(test.RskWalletMock) rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), blockchain.NewTransactionConfig(entities.NewWei(8000), 100000, entities.NewWei(60000000)), - bridgeAddress). - Return(bridgeTxHash, nil).Once() + bridgeAddress).Return(bridgeTxHash, nil).Once() bridge := new(test.BridgeMock) bridge.On("GetAddress").Return(bridgeAddress).Once() mutex := new(test.MutexMock) @@ -130,7 +128,6 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { mutex.On("Lock").Return().Once() useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) - err := useCase.Run(context.Background(), retainedQuote) quoteRepository.AssertExpectations(t) @@ -140,7 +137,7 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { rskWallet.AssertExpectations(t) bridge.AssertExpectations(t) mutex.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { @@ -201,7 +198,7 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { rskWallet.AssertExpectations(t) quoteRepository.AssertExpectations(t) eventBus.AssertNotCalled(t, "Publish", mock.Anything) - assert.NotNil(t, err) + require.Error(t, err) } } @@ -243,27 +240,18 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { setup(&caseQuote, quoteRepository, lbc, btc, rskWallet) eventBus := new(test.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { - return assert.NotNil(t, event.Error) && - assert.Equal(t, caseQuote.LpBtcTxHash, event.RetainedQuote.LpBtcTxHash) && - assert.Equal(t, caseQuote.Signature, event.RetainedQuote.Signature) && - assert.Equal(t, caseQuote.QuoteHash, event.RetainedQuote.QuoteHash) && - assert.Equal(t, caseQuote.DepositAddress, event.RetainedQuote.DepositAddress) && - assert.Equal(t, caseQuote.RequiredLiquidity, event.RetainedQuote.RequiredLiquidity) && - assert.Equal(t, quote.PegoutStateRefundPegOutFailed, event.RetainedQuote.State) && - assert.Equal(t, caseQuote.UserRskTxHash, event.RetainedQuote.UserRskTxHash) && - assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) + require.Error(t, event.Error) + return assert.Equal(t, caseQuote.LpBtcTxHash, event.RetainedQuote.LpBtcTxHash) && assert.Equal(t, caseQuote.Signature, event.RetainedQuote.Signature) && + assert.Equal(t, caseQuote.QuoteHash, event.RetainedQuote.QuoteHash) && assert.Equal(t, caseQuote.DepositAddress, event.RetainedQuote.DepositAddress) && + assert.Equal(t, caseQuote.RequiredLiquidity, event.RetainedQuote.RequiredLiquidity) && assert.Equal(t, quote.PegoutStateRefundPegOutFailed, event.RetainedQuote.State) && + assert.Equal(t, caseQuote.UserRskTxHash, event.RetainedQuote.UserRskTxHash) && assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) })).Return().Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ - QuoteHash: caseQuote.QuoteHash, - DepositAddress: caseQuote.DepositAddress, - Signature: caseQuote.Signature, - RequiredLiquidity: caseQuote.RequiredLiquidity, - State: quote.PegoutStateRefundPegOutFailed, - UserRskTxHash: caseQuote.UserRskTxHash, - LpBtcTxHash: caseQuote.LpBtcTxHash, - RefundPegoutTxHash: caseQuote.RefundPegoutTxHash, - BridgeRefundTxHash: caseQuote.BridgeRefundTxHash, - }).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy( + func(q quote.RetainedPegoutQuote) bool { + expected := caseQuote + expected.State = quote.PegoutStateRefundPegOutFailed + return assert.Equal(t, expected, q) + })).Return(nil).Once() useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) err := useCase.Run(context.Background(), caseQuote) lbc.AssertExpectations(t) @@ -271,7 +259,7 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { rskWallet.AssertExpectations(t) quoteRepository.AssertExpectations(t) eventBus.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) } } @@ -301,7 +289,7 @@ func TestRefundPegoutUseCase_Run_NoConfirmations(t *testing.T) { lbc.AssertNotCalled(t, "GetAddress") mutex.AssertNotCalled(t, "Lock") mutex.AssertNotCalled(t, "Unlock") - assert.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) + require.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) } func TestRefundPegoutUseCase_Run_WrongState(t *testing.T) { @@ -330,10 +318,10 @@ func TestRefundPegoutUseCase_Run_WrongState(t *testing.T) { lbc.AssertNotCalled(t, "GetAddress") mutex.AssertNotCalled(t, "Lock") mutex.AssertNotCalled(t, "Unlock") - assert.ErrorIs(t, err, usecases.WrongStateError) + require.ErrorIs(t, err, usecases.WrongStateError) } -func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { +func TestRefundPegoutUseCase_Run_CorrectBridgeAmount(t *testing.T) { bridgeAddress := "0x1234" lbc := new(test.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil) @@ -350,9 +338,34 @@ func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { mutex.On("Unlock") mutex.On("Lock") - cases := test.Table[func() quote.PegoutQuote, *entities.Wei]{ + cases := getQuotesWithExpectedTotalTable() + + for _, c := range cases { + quoteRepository := new(test.PegoutQuoteRepositoryMock) + q := c.Value() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) + + rskWallet := new(test.RskWalletMock) + rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), + blockchain.NewTransactionConfig(c.Result, 100000, entities.NewWei(60000000)), + bridgeAddress). + Return(bridgeTxHash, nil).Once() + + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + err := useCase.Run(context.Background(), retainedQuote) + quoteRepository.AssertExpectations(t) + rskWallet.AssertExpectations(t) + require.NoError(t, err) + } +} + +func getQuotesWithExpectedTotalTable() test.Table[func() quote.PegoutQuote, *entities.Wei] { + return test.Table[func() quote.PegoutQuote, *entities.Wei]{ { - func() quote.PegoutQuote { + Value: func() quote.PegoutQuote { testQuote := pegoutQuote testQuote.Value = entities.NewWei(3000) testQuote.GasFee = entities.NewWei(3000) @@ -360,10 +373,10 @@ func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { testQuote.CallFee = entities.NewWei(2000) return testQuote }, - entities.NewWei(8000), + Result: entities.NewWei(8000), }, { - func() quote.PegoutQuote { + Value: func() quote.PegoutQuote { testQuote := pegoutQuote testQuote.Value = entities.NewWei(3000) testQuote.GasFee = entities.NewWei(3000) @@ -371,10 +384,10 @@ func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { testQuote.CallFee = entities.NewWei(2000) return testQuote }, - entities.NewWei(8000), + Result: entities.NewWei(8000), }, { - func() quote.PegoutQuote { + Value: func() quote.PegoutQuote { testQuote := pegoutQuote testQuote.Value = entities.NewWei(0) testQuote.GasFee = entities.NewWei(0) @@ -382,10 +395,10 @@ func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { testQuote.CallFee = entities.NewWei(0) return testQuote }, - entities.NewWei(0), + Result: entities.NewWei(0), }, { - func() quote.PegoutQuote { + Value: func() quote.PegoutQuote { testQuote := pegoutQuote testQuote.Value = entities.NewWei(15000) testQuote.GasFee = entities.NewWei(1) @@ -393,28 +406,7 @@ func TestRefundPegoutUseCase_Run_BridgeAmount(t *testing.T) { testQuote.CallFee = entities.NewWei(500) return testQuote }, - entities.NewWei(15501), + Result: entities.NewWei(15501), }, } - - for _, c := range cases { - quoteRepository := new(test.PegoutQuoteRepositoryMock) - q := c.Value() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) - - rskWallet := new(test.RskWalletMock) - rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), - blockchain.NewTransactionConfig(c.Result, 100000, entities.NewWei(60000000)), - bridgeAddress). - Return(bridgeTxHash, nil).Once() - - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) - err := useCase.Run(context.Background(), retainedQuote) - quoteRepository.AssertExpectations(t) - rskWallet.AssertExpectations(t) - assert.Nil(t, err) - } } diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go index 8c961c0d..ec6da74f 100644 --- a/internal/usecases/pegout/send_pegout_test.go +++ b/internal/usecases/pegout/send_pegout_test.go @@ -10,6 +10,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "math/big" "testing" "time" @@ -63,8 +64,8 @@ func TestSendPegoutUseCase_Run(t *testing.T) { expected := retainedQuote expected.LpBtcTxHash = btcTxHash expected.State = quote.PegoutStateSendPegoutSucceeded - return assert.Nil(t, event.Error) && - assert.Equal(t, pegoutQuote, event.PegoutQuote) && + require.NoError(t, event.Error) + return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() @@ -92,7 +93,7 @@ func TestSendPegoutUseCase_Run(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.Nil(t, err) + require.NoError(t, err) btcWallet.AssertExpectations(t) quoteRepository.AssertExpectations(t) rsk.AssertExpectations(t) @@ -156,7 +157,7 @@ func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { rsk.AssertExpectations(t) quoteRepository.AssertExpectations(t) eventBus.AssertNotCalled(t, "Publish", mock.Anything) - assert.NotNil(t, err) + require.Error(t, err) } } @@ -167,8 +168,8 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed - return assert.ErrorIs(t, event.Error, usecases.InsufficientAmountError) && - assert.Equal(t, pegoutQuote, event.PegoutQuote) && + require.ErrorIs(t, event.Error, usecases.InsufficientAmountError) + return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() @@ -193,7 +194,7 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.ErrorIs(t, err, usecases.InsufficientAmountError) + require.ErrorIs(t, err, usecases.InsufficientAmountError) quoteRepository.AssertExpectations(t) rsk.AssertExpectations(t) eventBus.AssertExpectations(t) @@ -225,7 +226,7 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) + require.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) quoteRepository.AssertExpectations(t) rsk.AssertExpectations(t) eventBus.AssertNotCalled(t, "Publish") @@ -247,8 +248,8 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed - return assert.ErrorIs(t, event.Error, usecases.ExpiredQuoteError) && - assert.Equal(t, expiredQuote, event.PegoutQuote) && + require.ErrorIs(t, event.Error, usecases.ExpiredQuoteError) + return assert.Equal(t, expiredQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() @@ -256,7 +257,7 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.ErrorIs(t, err, usecases.ExpiredQuoteError) + require.ErrorIs(t, err, usecases.ExpiredQuoteError) quoteRepository.AssertExpectations(t) eventBus.AssertExpectations(t) rsk.AssertNotCalled(t, "GetTransactionReceipt") @@ -288,7 +289,7 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.ErrorIs(t, err, usecases.NoLiquidityError) + require.ErrorIs(t, err, usecases.NoLiquidityError) quoteRepository.AssertExpectations(t) eventBus.AssertNotCalled(t, "Publish") btcWallet.AssertExpectations(t) @@ -309,8 +310,8 @@ func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed - return assert.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) && - assert.Equal(t, quote.PegoutQuote{}, event.PegoutQuote) && + require.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) + return assert.Equal(t, quote.PegoutQuote{}, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() @@ -318,7 +319,7 @@ func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.ErrorIs(t, err, usecases.QuoteNotFoundError) + require.ErrorIs(t, err, usecases.QuoteNotFoundError) quoteRepository.AssertExpectations(t) eventBus.AssertExpectations(t) mutex.AssertNotCalled(t, "Lock") @@ -337,8 +338,8 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed - return assert.NotNil(t, event.Error) && - assert.Equal(t, pegoutQuote, event.PegoutQuote) && + require.Error(t, event.Error) + return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() @@ -365,7 +366,7 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) - assert.NotNil(t, err) + require.Error(t, err) btcWallet.AssertExpectations(t) quoteRepository.AssertExpectations(t) rsk.AssertExpectations(t) @@ -403,10 +404,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { expected := *retainedQuote expected.LpBtcTxHash = btcTxHash expected.State = quote.PegoutStateSendPegoutSucceeded - return assert.Nil(t, event.Error) && - assert.Equal(t, pegoutQuote, event.PegoutQuote) && - assert.Equal(t, expected, event.RetainedQuote) && - assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + require.NoError(t, event.Error) + return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() }, func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock) { @@ -416,10 +415,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := *retainedQuote expected.State = quote.PegoutStateSendPegoutFailed - return assert.NotNil(t, event.Error) && - assert.Equal(t, pegoutQuote, event.PegoutQuote) && - assert.Equal(t, expected, event.RetainedQuote) && - assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + require.Error(t, event.Error) + return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() }, } @@ -432,7 +429,7 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), caseQuote) quoteRepository.AssertExpectations(t) - assert.NotNil(t, err) + require.Error(t, err) btcWallet.AssertExpectations(t) rsk.AssertExpectations(t) eventBus.AssertExpectations(t) diff --git a/internal/usecases/pegout/withdraw_collateral_test.go b/internal/usecases/pegout/withdraw_collateral_test.go index b9d1e23b..7e4aa857 100644 --- a/internal/usecases/pegout/withdraw_collateral_test.go +++ b/internal/usecases/pegout/withdraw_collateral_test.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "testing" ) @@ -15,7 +16,7 @@ func TestWithdrawCollateralUseCase_Run(t *testing.T) { useCase := pegout.NewWithdrawCollateralUseCase(lbc) err := useCase.Run() lbc.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) } func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { @@ -24,14 +25,14 @@ func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { lbc.On("WithdrawPegoutCollateral").Return(errors.New("LBC021")).Once() err := useCase.Run() - assert.ErrorIs(t, err, usecases.ProviderNotResignedError) + require.ErrorIs(t, err, usecases.ProviderNotResignedError) lbc.On("WithdrawPegoutCollateral").Return(errors.New("LBC022")).Once() err = useCase.Run() - assert.ErrorIs(t, err, usecases.ProviderNotResignedError) + require.ErrorIs(t, err, usecases.ProviderNotResignedError) lbc.On("WithdrawPegoutCollateral").Return(assert.AnError).Once() err = useCase.Run() - assert.NotErrorIs(t, err, usecases.ProviderNotResignedError) - assert.NotNil(t, err) + require.NotErrorIs(t, err, usecases.ProviderNotResignedError) + require.Error(t, err) } diff --git a/internal/usecases/watcher/clean_exipred_test.go b/internal/usecases/watcher/clean_exipred_test.go index c55c13b5..5ada74e0 100644 --- a/internal/usecases/watcher/clean_exipred_test.go +++ b/internal/usecases/watcher/clean_exipred_test.go @@ -7,6 +7,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "testing" ) @@ -58,8 +59,8 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { peginRepository.AssertExpectations(t) pegoutRepository.AssertExpectations(t) - assert.Nil(t, err) - assert.True(t, len(hashes) == 6) + require.NoError(t, err) + assert.Len(t, hashes, 6) assert.Equal(t, []string{"peginHash1", "peginHash2", "peginHash4", "pegoutHash3", "pegoutHash5", "pegoutHash6"}, hashes) } @@ -101,7 +102,7 @@ func TestCleanExpiredQuotesUseCase_Run_ErrorHandling(t *testing.T) { setup(peginRepository, pegoutRepository) useCase := watcher.NewCleanExpiredQuotesUseCase(peginRepository, pegoutRepository) _, err := useCase.Run(context.Background()) - assert.NotNil(t, err) + require.Error(t, err) peginRepository.AssertExpectations(t) pegoutRepository.AssertExpectations(t) } diff --git a/internal/usecases/watcher/get_watched_pegin_quote_test.go b/internal/usecases/watcher/get_watched_pegin_quote_test.go index 768986f4..3f2f380e 100644 --- a/internal/usecases/watcher/get_watched_pegin_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegin_quote_test.go @@ -7,12 +7,11 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "math/big" "testing" ) -var okStates = []quote.PeginState{quote.PeginStateWaitingForDeposit, quote.PeginStateCallForUserSucceeded} - var retainedQuotes = []quote.RetainedPeginQuote{ {QuoteHash: "01", State: quote.PeginStateWaitingForDeposit}, {QuoteHash: "04", State: quote.PeginStateCallForUserSucceeded}, @@ -37,14 +36,14 @@ func TestGetWatchedPeginQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PeginStateWaitingForDeposit) quoteRepository.AssertExpectations(t) - assert.True(t, len(watchedQuotes) == 2) - assert.Nil(t, err) + assert.Len(t, watchedQuotes, 2) + require.NoError(t, err) var parsedHash big.Int for _, watchedQuote := range watchedQuotes { parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) // this is just to validate that the watched quotes are built with the correct pairs, // the nonce is not related to the hash in the business logic - assert.True(t, parsedHash.Int64() == watchedQuote.PeginQuote.Nonce) + assert.Equal(t, parsedHash.Int64(), watchedQuote.PeginQuote.Nonce) } } @@ -56,14 +55,14 @@ func TestGetWatchedPeginQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PeginStateCallForUserSucceeded) quoteRepository.AssertExpectations(t) - assert.True(t, len(watchedQuotes) == 1) - assert.Nil(t, err) + assert.Len(t, watchedQuotes, 1) + require.NoError(t, err) var parsedHash big.Int for _, watchedQuote := range watchedQuotes { parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) // this is just to validate that the watched quotes are built with the correct pairs, // the nonce is not related to the hash in the business logic - assert.True(t, parsedHash.Int64() == watchedQuote.PeginQuote.Nonce) + assert.Equal(t, parsedHash.Int64(), watchedQuote.PeginQuote.Nonce) } } @@ -78,7 +77,7 @@ func TestGetWatchedPeginQuoteUseCase_Run_WrongState(t *testing.T) { useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) for _, state := range wrongStates { _, err := useCase.Run(context.Background(), state) - assert.NotNil(t, err) + require.Error(t, err) } } @@ -100,6 +99,6 @@ func TestGetWatchedPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { setup(quoteRepository) useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) _, err := useCase.Run(context.Background(), quote.PeginStateWaitingForDeposit) - assert.NotNil(t, err) + require.Error(t, err) } } diff --git a/internal/usecases/watcher/get_watched_pegout_quote_test.go b/internal/usecases/watcher/get_watched_pegout_quote_test.go index bb2efa86..242f66a5 100644 --- a/internal/usecases/watcher/get_watched_pegout_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegout_quote_test.go @@ -7,12 +7,11 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "math/big" "testing" ) -var okPegoutStates = []quote.PegoutState{quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations, quote.PegoutStateSendPegoutSucceeded} - var retainedPegoutQuotes = []quote.RetainedPegoutQuote{ {QuoteHash: "01", State: quote.PegoutStateWaitingForDeposit}, {QuoteHash: "04", State: quote.PegoutStateSendPegoutSucceeded}, @@ -48,14 +47,14 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations) quoteRepository.AssertExpectations(t) - assert.True(t, len(watchedQuotes) == 3) - assert.Nil(t, err) + assert.Len(t, watchedQuotes, 3) + require.NoError(t, err) var parsedHash big.Int for _, watchedQuote := range watchedQuotes { parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) // this is just to validate that the watched quotes are built with the correct pairs, // the nonce is not related to the hash in the business logic - assert.True(t, parsedHash.Int64() == watchedQuote.PegoutQuote.Nonce) + assert.Equal(t, parsedHash.Int64(), watchedQuote.PegoutQuote.Nonce) } } @@ -67,14 +66,14 @@ func TestGetWatchedPegoutQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PegoutStateSendPegoutSucceeded) quoteRepository.AssertExpectations(t) - assert.True(t, len(watchedQuotes) == 1) - assert.Nil(t, err) + assert.Len(t, watchedQuotes, 1) + require.NoError(t, err) var parsedHash big.Int for _, watchedQuote := range watchedQuotes { parsedHash.SetString(watchedQuote.RetainedQuote.QuoteHash, 16) // this is just to validate that the watched quotes are built with the correct pairs, // the nonce is not related to the hash in the business logic - assert.True(t, parsedHash.Int64() == watchedQuote.PegoutQuote.Nonce) + assert.Equal(t, parsedHash.Int64(), watchedQuote.PegoutQuote.Nonce) } } @@ -89,7 +88,7 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WrongState(t *testing.T) { useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) for _, state := range wrongStates { _, err := useCase.Run(context.Background(), state) - assert.NotNil(t, err) + require.Error(t, err) } } @@ -111,6 +110,6 @@ func TestGetWatchedPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { setup(quoteRepository) useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) _, err := useCase.Run(context.Background(), quote.PegoutStateWaitingForDeposit) - assert.NotNil(t, err) + require.Error(t, err) } } diff --git a/internal/usecases/watcher/update_pegout_deposit_test.go b/internal/usecases/watcher/update_pegout_deposit_test.go index 9563179f..4defdcce 100644 --- a/internal/usecases/watcher/update_pegout_deposit_test.go +++ b/internal/usecases/watcher/update_pegout_deposit_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "strings" "testing" "time" @@ -67,7 +68,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run(t *testing.T) { useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), deposit) quoteReporitory.AssertExpectations(t) - assert.Nil(t, err) + require.NoError(t, err) assert.Equal(t, quote.PegoutStateWaitingForDepositConfirmations, watchedPegoutQuote.RetainedQuote.State) assert.Equal(t, deposit.TxHash, watchedPegoutQuote.RetainedQuote.UserRskTxHash) } @@ -120,7 +121,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { quoteReporitory.AssertNotCalled(t, "UpdateRetainedQuote") quoteReporitory.AssertNotCalled(t, "UpsertPegoutDeposit") assert.Equal(t, watcher.WatchedPegoutQuote{}, watchedPegoutQuote) - assert.NotNil(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "deposit not valid for quote")) }) } @@ -150,7 +151,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_IllegalState(t *testing.T) { quoteReporitory.AssertNotCalled(t, "UpdateRetainedQuote") quoteReporitory.AssertNotCalled(t, "UpsertPegoutDeposit") assert.Equal(t, watcher.WatchedPegoutQuote{}, watchedPegoutQuote) - assert.NotNil(t, err) + require.Error(t, err) assert.True(t, strings.Contains(err.Error(), "illegal quote state")) } } @@ -182,6 +183,6 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_ErrorHandling(t *testing.T) { watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), deposit) quoteReporitory.AssertExpectations(t) assert.Equal(t, watcher.WatchedPegoutQuote{}, watchedPegoutQuote) - assert.NotNil(t, err) + require.Error(t, err) } } diff --git a/test/lbc_mock.go b/test/lbc_mock.go index b5278df1..a52d0a09 100644 --- a/test/lbc_mock.go +++ b/test/lbc_mock.go @@ -28,6 +28,9 @@ func (m *LbcMock) GetMinimumCollateral() (*entities.Wei, error) { func (m *LbcMock) GetCollateral(providerAddress string) (*entities.Wei, error) { args := m.Called(providerAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } return args.Get(0).(*entities.Wei), args.Error(1) } diff --git a/test/pegin_quote_repository_mock.go b/test/pegin_quote_repository_mock.go index 65c4b330..848cb91f 100644 --- a/test/pegin_quote_repository_mock.go +++ b/test/pegin_quote_repository_mock.go @@ -35,3 +35,8 @@ func (m *PeginQuoteRepositoryMock) DeleteQuotes(ctx context.Context, hashes []st args := m.Called(ctx, hashes) return args.Get(0).(uint), args.Error(1) } + +func (m *PeginQuoteRepositoryMock) UpdateRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { + args := m.Called(ctx, retainedQuote) + return args.Error(0) +} From bda24cb0c4c4d32f4d8b0a2ed72100d479050220 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 14 Feb 2024 20:00:37 -0300 Subject: [PATCH 015/113] test: test for pegin use cases --- internal/configuration/registry/usecase.go | 1 + internal/entities/quote/pegin_quote.go | 2 +- internal/usecases/pegin/accept_pegin_quote.go | 4 +- .../usecases/pegin/accept_pegin_quote_test.go | 405 +++++++++++++ .../usecases/pegin/add_collateral_test.go | 79 +++ internal/usecases/pegin/call_for_user.go | 47 +- internal/usecases/pegin/call_for_user_test.go | 539 ++++++++++++++++++ internal/usecases/pegin/expire_quote_test.go | 48 ++ .../usecases/pegin/get_collateral_test.go | 35 ++ .../usecases/pegin/get_pegin_quote_test.go | 281 +++++++++ internal/usecases/pegin/register_pegin.go | 4 +- .../usecases/pegin/register_pegin_test.go | 478 ++++++++++++++++ .../pegin/withdraw_collateral_test.go | 38 ++ .../usecases/pegout/accept_pegout_quote.go | 6 +- .../pegout/accept_pegout_quote_test.go | 5 +- .../usecases/pegout/get_pegout_quote_test.go | 8 +- test/bridge_mock.go | 22 + test/btc_rpc_mock.go | 13 + test/lbc_mock.go | 28 + test/pegin_quote_repository_mock.go | 20 + test/provider_mock.go | 20 + test/rsk_rpc_mock.go | 14 + 22 files changed, 2072 insertions(+), 25 deletions(-) create mode 100644 internal/usecases/pegin/accept_pegin_quote_test.go create mode 100644 internal/usecases/pegin/add_collateral_test.go create mode 100644 internal/usecases/pegin/call_for_user_test.go create mode 100644 internal/usecases/pegin/expire_quote_test.go create mode 100644 internal/usecases/pegin/get_collateral_test.go create mode 100644 internal/usecases/pegin/get_pegin_quote_test.go create mode 100644 internal/usecases/pegin/register_pegin_test.go create mode 100644 internal/usecases/pegin/withdraw_collateral_test.go diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index b4cd421f..0d9a7326 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -77,6 +77,7 @@ func NewUseCaseRegistry( btcRegistry.RpcServer, liquidityProvider, eventBus, + rskRegistry.RpcServer, mutexes.RskWalletMutex(), ), registerPeginUseCase: pegin.NewRegisterPeginUseCase( diff --git a/internal/entities/quote/pegin_quote.go b/internal/entities/quote/pegin_quote.go index 48c07276..61943c0f 100644 --- a/internal/entities/quote/pegin_quote.go +++ b/internal/entities/quote/pegin_quote.go @@ -54,7 +54,7 @@ type PeginQuote struct { Confirmations uint16 `json:"confirmations" bson:"confirmations" validate:"required"` CallOnRegister bool `json:"callOnRegister" bson:"call_on_register"` GasFee *entities.Wei `json:"gasFee" bson:"gas_fee" validate:"required"` - ProductFeeAmount uint64 `json:"productFeeAmount" bson:"product_fee_amount" validate:"required"` + ProductFeeAmount uint64 `json:"productFeeAmount" bson:"product_fee_amount" validate:""` } func (quote *PeginQuote) ExpireTime() time.Time { diff --git a/internal/usecases/pegin/accept_pegin_quote.go b/internal/usecases/pegin/accept_pegin_quote.go index d3cca804..2e79f143 100644 --- a/internal/usecases/pegin/accept_pegin_quote.go +++ b/internal/usecases/pegin/accept_pegin_quote.go @@ -18,7 +18,7 @@ type AcceptQuoteUseCase struct { lp entities.LiquidityProvider peginLp entities.PeginLiquidityProvider eventBus entities.EventBus - peginLiquidityMutex *sync.Mutex + peginLiquidityMutex sync.Locker } func NewAcceptQuoteUseCase( @@ -29,7 +29,7 @@ func NewAcceptQuoteUseCase( lp entities.LiquidityProvider, peginLp entities.PeginLiquidityProvider, eventBus entities.EventBus, - peginLiquidityMutex *sync.Mutex, + peginLiquidityMutex sync.Locker, ) *AcceptQuoteUseCase { return &AcceptQuoteUseCase{ quoteRepository: quoteRepository, diff --git a/internal/usecases/pegin/accept_pegin_quote_test.go b/internal/usecases/pegin/accept_pegin_quote_test.go new file mode 100644 index 00000000..474c0f63 --- /dev/null +++ b/internal/usecases/pegin/accept_pegin_quote_test.go @@ -0,0 +1,405 @@ +package pegin_test + +import ( + "context" + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "strings" + "testing" + "time" +) + +var acceptPeginSignature = "signature" +var acceptPeginDerivationAddress = "derivation address" +var acceptPeginQuoteHash = "1a1b1c" +var testPeginQuote = quote.PeginQuote{ + FedBtcAddress: "2N4qmbZNDMyHDBEBKTCP218HV1LhxCMRMti", + LbcAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + LpRskAddress: "0x0D8Fb5d32704DB2931e05DB91F64BcA6f76Ce573", + BtcRefundAddress: "2N58BH8rEq9Ku7HuJbZvKX6WRywdNmoVrnA", + RskRefundAddress: "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", + LpBtcAddress: "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6", + CallFee: entities.NewWei(1), + PenaltyFee: entities.NewWei(1), + ContractAddress: "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", + Data: "", + GasLimit: 5000, + Nonce: 654321, + Value: entities.NewWei(30000), + AgreementTimestamp: uint32(time.Now().Unix()), + TimeForDeposit: 600, + LpCallTime: 600, + Confirmations: 10, + CallOnRegister: false, + GasFee: entities.NewWei(1), + ProductFeeAmount: 10, +} + +func TestAcceptQuoteUseCase_Run(t *testing.T) { + requiredLiquidity := entities.NewWei(9280000) + fedInfo := blockchain.FederationInfo{ + FedSize: 1, FedThreshold: 2, PubKeys: []string{"01", "02", "03"}, + FedAddress: "any address", ActiveFedBlockHeight: 500, + IrisActivationHeight: 500, ErpKeys: []string{"04", "05", "06"}, + } + retainedQuote := quote.RetainedPeginQuote{ + QuoteHash: acceptPeginQuoteHash, + DepositAddress: acceptPeginDerivationAddress, + Signature: acceptPeginSignature, + RequiredLiquidity: requiredLiquidity, + State: quote.PeginStateWaitingForDeposit, + } + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) + quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil) + bridge := new(test.BridgeMock) + bridge.On("FetchFederationInfo").Return(fedInfo, nil) + lbcParsedAddress, _ := hex.DecodeString(strings.TrimPrefix(testPeginQuote.LbcAddress, "0x")) + refundParsedAddress := []byte{4, 5, 6} + lpParsedAddress := []byte{7, 8, 9} + parsedHash, _ := hex.DecodeString(acceptPeginQuoteHash) + bridge.On("GetFlyoverDerivationAddress", blockchain.FlyoverDerivationArgs{ + FedInfo: fedInfo, + LbcAdress: lbcParsedAddress, + UserBtcRefundAddress: refundParsedAddress, + LpBtcAddress: lpParsedAddress, + QuoteHash: parsedHash, + }).Return(blockchain.FlyoverDerivation{Address: acceptPeginDerivationAddress, RedeemScript: "any script"}, nil) + btc := new(test.BtcRpcMock) + btc.On("DecodeAddress", testPeginQuote.BtcRefundAddress, true).Return(refundParsedAddress, nil) + btc.On("DecodeAddress", testPeginQuote.LpBtcAddress, true).Return(lpParsedAddress, nil) + lp := new(test.ProviderMock) + lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), requiredLiquidity).Return(nil) + lp.On("SignQuote", acceptPeginQuoteHash).Return(acceptPeginSignature, nil) + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPeginQuoteEvent) bool { + return assert.Equal(t, testPeginQuote, event.Quote) && assert.Equal(t, retainedQuote, event.RetainedQuote) && assert.Equal(t, quote.AcceptedPeginQuoteEventId, event.Event.Id()) + })).Once() + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + rsk := new(test.RskRpcMock) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) + + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) + + rsk.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + bridge.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) + require.NoError(t, err) + assert.NotEmpty(t, result) + assert.Equal(t, acceptPeginDerivationAddress, result.DepositAddress) + assert.Equal(t, acceptPeginSignature, result.Signature) +} + +func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { + retainedQuote := quote.RetainedPeginQuote{ + QuoteHash: acceptPeginQuoteHash, + DepositAddress: acceptPeginDerivationAddress, + Signature: acceptPeginSignature, + RequiredLiquidity: entities.NewWei(9280000), + State: quote.PeginStateWaitingForDeposit, + } + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&retainedQuote, nil) + + bridge := new(test.BridgeMock) + btc := new(test.BtcRpcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + rsk := new(test.RskRpcMock) + + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) + + rsk.AssertNotCalled(t, "GasPrice") + quoteRepository.AssertExpectations(t) + quoteRepository.AssertNotCalled(t, "InsertRetainedQuote") + btc.AssertNotCalled(t, "DecodeAddress") + bridge.AssertNotCalled(t, "GetFlyoverDerivationAddress") + bridge.AssertNotCalled(t, "FetchFederationInfo") + lp.AssertNotCalled(t, "HasPeginLiquidity") + lp.AssertNotCalled(t, "SignQuote") + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertExpectations(t) + require.NoError(t, err) + assert.NotEmpty(t, result) + assert.Equal(t, acceptPeginDerivationAddress, result.DepositAddress) + assert.Equal(t, acceptPeginSignature, result.Signature) +} + +func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) + + bridge := new(test.BridgeMock) + btc := new(test.BtcRpcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + rsk := new(test.RskRpcMock) + + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) + + rsk.AssertNotCalled(t, "GasPrice") + quoteRepository.AssertExpectations(t) + btc.AssertNotCalled(t, "DecodeAddress") + bridge.AssertNotCalled(t, "GetFlyoverDerivationAddress") + bridge.AssertNotCalled(t, "FetchFederationInfo") + lp.AssertNotCalled(t, "HasPeginLiquidity") + lp.AssertNotCalled(t, "SignQuote") + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertNotCalled(t, "Unlock") + mutex.AssertNotCalled(t, "Lock") + require.ErrorIs(t, err, usecases.QuoteNotFoundError) + assert.Empty(t, result) +} + +func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { + expiredQuote := testPeginQuote + expiredQuote.AgreementTimestamp = uint32(time.Now().Unix()) - 1000 + expiredQuote.TimeForDeposit = 500 + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&expiredQuote, nil) + + bridge := new(test.BridgeMock) + btc := new(test.BtcRpcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + rsk := new(test.RskRpcMock) + + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) + + rsk.AssertNotCalled(t, "GasPrice") + quoteRepository.AssertExpectations(t) + btc.AssertNotCalled(t, "DecodeAddress") + bridge.AssertNotCalled(t, "GetFlyoverDerivationAddress") + bridge.AssertNotCalled(t, "FetchFederationInfo") + lp.AssertNotCalled(t, "HasPeginLiquidity") + lp.AssertNotCalled(t, "SignQuote") + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertNotCalled(t, "Unlock") + mutex.AssertNotCalled(t, "Lock") + require.ErrorIs(t, err, usecases.ExpiredQuoteError) + assert.Empty(t, result) +} + +func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { + requiredLiquidity := entities.NewWei(9280000) + fedInfo := blockchain.FederationInfo{ + FedSize: 1, + FedThreshold: 2, + PubKeys: []string{"01", "02", "03"}, + FedAddress: "any address", + ActiveFedBlockHeight: 500, + IrisActivationHeight: 500, + ErpKeys: []string{"04", "05", "06"}, + } + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) + bridge := new(test.BridgeMock) + bridge.On("FetchFederationInfo").Return(fedInfo, nil) + bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{ + Address: "derivation address", + RedeemScript: "any script", + }, nil) + btc := new(test.BtcRpcMock) + btc.On("DecodeAddress", testPeginQuote.BtcRefundAddress, true).Return([]byte{4, 5, 6}, nil) + btc.On("DecodeAddress", testPeginQuote.LpBtcAddress, true).Return([]byte{7, 8, 9}, nil) + lp := new(test.ProviderMock) + lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), requiredLiquidity).Return(assert.AnError) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + rsk := new(test.RskRpcMock) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) + + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) + + rsk.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + btc.AssertExpectations(t) + bridge.AssertExpectations(t) + lp.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertExpectations(t) + require.ErrorIs(t, err, usecases.NoLiquidityError) + assert.Empty(t, result) +} + +func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.Anything).Return() + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + + setups := acceptQuoteUseCaseUnexpectedErrorSetups() + for _, setup := range setups { + quoteRepository := new(test.PeginQuoteRepositoryMock) + bridge := new(test.BridgeMock) + btc := new(test.BtcRpcMock) + lp := new(test.ProviderMock) + rsk := new(test.RskRpcMock) + caseHash := acceptPeginQuoteHash + setup(&caseHash, quoteRepository, bridge, btc, lp, rsk) + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + result, err := useCase.Run(context.Background(), caseHash) + + rsk.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + bridge.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + require.Error(t, err) + assert.Empty(t, result) + } +} + +// nolint:funlen +func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, + bridge *test.BridgeMock, btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + fedInfo := blockchain.FederationInfo{ + FedSize: 1, + FedThreshold: 2, + PubKeys: []string{"01", "02", "03"}, + FedAddress: "any address", + ActiveFedBlockHeight: 500, + IrisActivationHeight: 500, + ErpKeys: []string{"04", "05", "06"}, + } + derivation := blockchain.FlyoverDerivation{Address: "any address", RedeemScript: "any script"} + return []func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock){ + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + *quoteHash = "malformed hash" + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + caseQuote := testPeginQuote + caseQuote.LbcAddress = "malformed address" + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&caseQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + bridge.On("FetchFederationInfo").Return(blockchain.FederationInfo{}, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() + lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() + lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + // set derivation and signature to empty to malform the retained quote + bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, nil).Once() + lp.On("SignQuote", mock.Anything).Return("", nil).Once() + }, + func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, + btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() + btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() + bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() + lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("SignQuote", mock.Anything).Return("signature", nil).Once() + quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + }, + } +} diff --git a/internal/usecases/pegin/add_collateral_test.go b/internal/usecases/pegin/add_collateral_test.go new file mode 100644 index 00000000..fe1d5e67 --- /dev/null +++ b/internal/usecases/pegin/add_collateral_test.go @@ -0,0 +1,79 @@ +package pegin_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +func TestAddCollateralUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + value := entities.NewWei(1000) + lp.On("RskAddress").Return("rskAddress") + lbc.On("AddCollateral", value).Return(nil) + lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(100), nil) + useCase := pegin.NewAddCollateralUseCase(lbc, lp) + result, err := useCase.Run(value) + lp.AssertExpectations(t) + lbc.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(1100), result) +} + +func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + value := entities.NewWei(1000) + lp.On("RskAddress").Return("rskAddress") + lbc.On("GetMinimumCollateral").Return(entities.NewWei(2000), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(100), nil) + useCase := pegin.NewAddCollateralUseCase(lbc, lp) + result, err := useCase.Run(value) + lp.AssertExpectations(t) + lbc.AssertExpectations(t) + lbc.AssertNotCalled(t, "AddCollateral", mock.Anything) + require.ErrorIs(t, err, usecases.InsufficientAmountError) + assert.Nil(t, result) +} + +func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { + lp := new(test.ProviderMock) + lp.On("RskAddress").Return("rskAddress") + cases := test.Table[func(lbc *test.LbcMock), error]{ + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(nil, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) + lbc.On("GetCollateral", mock.Anything).Return(nil, assert.AnError) + }, + }, + { + Value: func(lbc *test.LbcMock) { + lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) + lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(100), nil) + lbc.On("AddCollateral", mock.Anything).Return(assert.AnError) + }, + }, + } + + for _, c := range cases { + lbc := new(test.LbcMock) + c.Value(lbc) + useCase := pegin.NewAddCollateralUseCase(lbc, lp) + result, err := useCase.Run(entities.NewWei(100)) + lbc.AssertExpectations(t) + assert.Nil(t, result) + require.Error(t, err) + } +} diff --git a/internal/usecases/pegin/call_for_user.go b/internal/usecases/pegin/call_for_user.go index 1a159ee3..824b5a5e 100644 --- a/internal/usecases/pegin/call_for_user.go +++ b/internal/usecases/pegin/call_for_user.go @@ -18,7 +18,8 @@ type CallForUserUseCase struct { btc blockchain.BitcoinNetwork peginProvider entities.LiquidityProvider eventBus entities.EventBus - rskWalletMutex *sync.Mutex + rsk blockchain.RootstockRpcServer + rskWalletMutex sync.Locker } func NewCallForUserUseCase( @@ -27,7 +28,8 @@ func NewCallForUserUseCase( btc blockchain.BitcoinNetwork, peginProvider entities.LiquidityProvider, eventBus entities.EventBus, - rskWalletMutex *sync.Mutex, + rsk blockchain.RootstockRpcServer, + rskWalletMutex sync.Locker, ) *CallForUserUseCase { return &CallForUserUseCase{ lbc: lbc, @@ -35,13 +37,13 @@ func NewCallForUserUseCase( btc: btc, peginProvider: peginProvider, eventBus: eventBus, + rsk: rsk, rskWalletMutex: rskWalletMutex, } } func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, retainedQuote quote.RetainedPeginQuote) error { - balance := new(entities.Wei) - valueToSend := new(entities.Wei) + var valueToSend *entities.Wei var peginQuote *quote.PeginQuote var err error @@ -66,12 +68,8 @@ func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, re useCase.rskWalletMutex.Lock() defer useCase.rskWalletMutex.Unlock() - if balance, err = useCase.lbc.GetBalance(useCase.peginProvider.RskAddress()); err != nil { - return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) - } - - if balance.Cmp(peginQuote.Value) < 0 { // lbc balance is not sufficient, calc delta to transfer - valueToSend.Sub(peginQuote.Value, balance) + if valueToSend, err = useCase.calculateValueToSend(ctx, *peginQuote, retainedQuote); err != nil { + return err } retainedQuote, err = useCase.performCallForUser(bitcoinTx, valueToSend, peginQuote, retainedQuote) @@ -110,6 +108,33 @@ func (useCase *CallForUserUseCase) publishErrorEvent( return wrappedError } +func (useCase *CallForUserUseCase) calculateValueToSend( + ctx context.Context, + peginQuote quote.PeginQuote, + retainedQuote quote.RetainedPeginQuote, +) (*entities.Wei, error) { + var contractBalance, networkBalance *entities.Wei + var err error + + if contractBalance, err = useCase.lbc.GetBalance(useCase.peginProvider.RskAddress()); err != nil { + return nil, useCase.publishErrorEvent(ctx, retainedQuote, peginQuote, err, true) + } + + valueToSend := entities.NewWei(0) + if contractBalance.Cmp(peginQuote.Value) < 0 { // lbc balance is not sufficient, calc delta to transfer + valueToSend.Sub(peginQuote.Value, contractBalance) + } else { + return valueToSend, nil + } + + if networkBalance, err = useCase.rsk.GetBalance(ctx, useCase.peginProvider.RskAddress()); err != nil { + return nil, useCase.publishErrorEvent(ctx, retainedQuote, peginQuote, err, true) + } else if networkBalance.Cmp(valueToSend) < 0 { + return nil, useCase.publishErrorEvent(ctx, retainedQuote, peginQuote, usecases.NoLiquidityError, true) + } + return valueToSend, nil +} + func (useCase *CallForUserUseCase) performCallForUser( bitcoinTx string, valueToSend *entities.Wei, @@ -164,7 +189,7 @@ func (useCase *CallForUserUseCase) validateBitcoinTx( ctx, retainedQuote, *peginQuote, - fmt.Errorf("insufficient amount %v < %v", sentAmount, peginQuote.Total()), + fmt.Errorf("%w: %v < %v", usecases.InsufficientAmountError, sentAmount, peginQuote.Total()), false, ) } diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go new file mode 100644 index 00000000..9b27f70e --- /dev/null +++ b/internal/usecases/pegin/call_for_user_test.go @@ -0,0 +1,539 @@ +package pegin_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestCallForUserUseCase_Run(t *testing.T) { + btcTx := "0x121a1b" + callForUser := "0x1a1b1c" + lpRskAddress := testPeginQuote.LpRskAddress + + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + expectedRetainedQuote := retainedPeginQuote + expectedRetainedQuote.State = quote.PeginStateCallForUserSucceeded + expectedRetainedQuote.CallForUserTxHash = callForUser + expectedRetainedQuote.UserBtcTxHash = btcTx + + lp := new(test.ProviderMock) + lp.On("RskAddress").Return(lpRskAddress).Once() + + lbc := new(test.LbcMock) + lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(50000), nil).Once() + txConfig := blockchain.NewTransactionConfig(entities.NewWei(0), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) + lbc.On("CallForUser", txConfig, testPeginQuote).Return(callForUser, nil).Once() + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { + require.NoError(t, event.Error) + return assert.Equal(t, testPeginQuote, event.PeginQuote) && assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && + assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) + })).Return().Once() + + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + return assert.Equal(t, expectedRetainedQuote, q) + })).Return(nil).Once() + rsk := new(test.RskRpcMock) + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) + + require.NoError(t, err) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { + btcTx := "0x121a1b" + callForUser := "0x1a1b1c" + lpRskAddress := testPeginQuote.LpRskAddress + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + expectedRetainedQuote := retainedPeginQuote + expectedRetainedQuote.State = quote.PeginStateCallForUserSucceeded + expectedRetainedQuote.CallForUserTxHash = callForUser + expectedRetainedQuote.UserBtcTxHash = btcTx + + lp := new(test.ProviderMock) + lp.On("RskAddress").Return(lpRskAddress).Twice() + + lbc := new(test.LbcMock) + lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(600), nil).Once() + txConfig := blockchain.NewTransactionConfig(entities.NewWei(29400), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) + lbc.On("CallForUser", txConfig, testPeginQuote).Return(callForUser, nil).Once() + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { + require.NoError(t, event.Error) + return assert.Equal(t, testPeginQuote, event.PeginQuote) && assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) + })).Return().Once() + + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + return assert.Equal(t, expectedRetainedQuote, q) + })).Return(nil).Once() + + rsk := new(test.RskRpcMock) + rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) + + require.NoError(t, err) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "deposit address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + setups := callForUserRecoverableErrorSetups() + + for _, setup := range setups { + lp := new(test.ProviderMock) + lp.On("RskAddress").Return("lp rsk address") + lbc := new(test.LbcMock) + btc := new(test.BtcRpcMock) + eventBus := new(test.EventBusMock) + rsk := new(test.RskRpcMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + quoteRepository := new(test.PeginQuoteRepositoryMock) + caseRetainedQuote := retainedPeginQuote + setup(&caseRetainedQuote, rsk, lbc, btc, quoteRepository) + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), "btc tx hash", caseRetainedQuote) + require.Error(t, err) + + } +} + +func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + now := uint32(time.Now().Unix()) + peginQuote := quote.PeginQuote{ + FedBtcAddress: "fed address", + LbcAddress: "lbc address", + LpRskAddress: "lp rsk address", + BtcRefundAddress: "btc refund address", + RskRefundAddress: "rsk refund address", + LpBtcAddress: "lp btc address", + CallFee: entities.NewWei(100), + PenaltyFee: entities.NewWei(100), + ContractAddress: "contract address", + Data: "0x1a1b", + GasLimit: 500, + Nonce: 123456, + Value: entities.NewWei(1000), + AgreementTimestamp: now, + TimeForDeposit: 600, + LpCallTime: 600, + Confirmations: 10, + CallOnRegister: false, + GasFee: entities.NewWei(500), + ProductFeeAmount: 100, + } + return []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock){ + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + caseRetainedQuote.State = quote.PeginStateCallForUserSucceeded + }, + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + }, + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(&peginQuote, nil).Once() + btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() + }, + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(&peginQuote, nil).Once() + btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ + Hash: "0x1d1e", + Confirmations: 10, + Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, + }, nil).Once() + lbc.On("GetBalance", mock.Anything).Return(nil, assert.AnError).Once() + }, + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + Return(&peginQuote, nil).Once() + btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ + Hash: "0x1d1e", + Confirmations: 10, + Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, + }, nil).Once() + lbc.On("GetBalance", mock.Anything).Return(entities.NewWei(500), nil).Once() + rsk.On("GetBalance", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + }, + } +} + +func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + lp := new(test.ProviderMock) + lbc := new(test.LbcMock) + + btc := new(test.BtcRpcMock) + btcTx := "0x121a1b" + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 5, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(2000)}}, + }, nil).Once() + + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + + rsk := new(test.RskRpcMock) + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) + + require.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertExpectations(t) + lbc.AssertNotCalled(t, "CallForUser") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + lbc.AssertNotCalled(t, "GetBalance") + lp.AssertNotCalled(t, "RskAddress") +} + +func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { + lbc := new(test.LbcMock) + btc := new(test.BtcRpcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + quoteRepository := new(test.PeginQuoteRepositoryMock) + + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + expiredQuote := testPeginQuote + expiredQuote.AgreementTimestamp -= 1000 + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&expiredQuote, nil).Once() + + updatedQuote := retainedPeginQuote + updatedQuote.State = quote.PeginStateCallForUserFailed + + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { + require.ErrorIs(t, event.Error, usecases.ExpiredQuoteError) + return assert.Equal(t, expiredQuote, event.PeginQuote) && + assert.Equal(t, updatedQuote, event.RetainedQuote) && + assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) + })).Return().Once() + + rsk := new(test.RskRpcMock) + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) + require.ErrorIs(t, err, usecases.ExpiredQuoteError) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + lbc.AssertNotCalled(t, "GetBalance") + lbc.AssertNotCalled(t, "CallForUser") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + btc.AssertNotCalled(t, "GetTransactionInfo") +} + +func TestCallForUserUseCase_Run_QuoteNotFound(t *testing.T) { + lbc := new(test.LbcMock) + btc := new(test.BtcRpcMock) + lp := new(test.ProviderMock) + eventBus := new(test.EventBusMock) + mutex := new(test.MutexMock) + quoteRepository := new(test.PeginQuoteRepositoryMock) + + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + updatedQuote := retainedPeginQuote + updatedQuote.State = quote.PeginStateCallForUserFailed + + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(nil, nil).Once() + + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { + require.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) + return assert.Empty(t, event.PeginQuote) && + assert.Equal(t, updatedQuote, event.RetainedQuote) && + assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) + })).Return().Once() + + rsk := new(test.RskRpcMock) + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) + require.ErrorIs(t, err, usecases.QuoteNotFoundError) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + lbc.AssertNotCalled(t, "GetBalance") + lbc.AssertNotCalled(t, "CallForUser") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + btc.AssertNotCalled(t, "GetTransactionInfo") +} + +func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { + btcTx := "0x121a1b" + + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + lp := new(test.ProviderMock) + lbc := new(test.LbcMock) + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(900)}}, + }, nil).Once() + + updatedQuote := retainedPeginQuote + updatedQuote.UserBtcTxHash = btcTx + updatedQuote.State = quote.PeginStateCallForUserFailed + + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { + require.ErrorIs(t, event.Error, usecases.InsufficientAmountError) + return assert.Equal(t, testPeginQuote, event.PeginQuote) && + assert.Equal(t, updatedQuote, event.RetainedQuote) && + assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) + })).Return().Once() + + mutex := new(test.MutexMock) + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote). + Return(nil).Once() + + rsk := new(test.RskRpcMock) + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) + + require.ErrorIs(t, err, usecases.InsufficientAmountError) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) + lbc.AssertNotCalled(t, "CallForUser") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") + lbc.AssertNotCalled(t, "GetBalance") + lp.AssertNotCalled(t, "RskAddress") +} + +func TestCallForUserUseCase_Run_NoLiquidity(t *testing.T) { + btcTx := "0x121a1b" + lpRskAddress := testPeginQuote.LpRskAddress + + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + + lp := new(test.ProviderMock) + lp.On("RskAddress").Return(lpRskAddress).Twice() + + lbc := new(test.LbcMock) + lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(500), nil).Once() + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + + eventBus := new(test.EventBusMock) + + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + + rsk := new(test.RskRpcMock) + rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress). + Return(entities.NewWei(20000), nil).Once() + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) + + require.ErrorIs(t, err, usecases.NoLiquidityError) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + mutex.AssertExpectations(t) +} + +func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { + btcTx := "0x121a1b" + callForUser := "0x1a1b1c" + lpRskAddress := testPeginQuote.LpRskAddress + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "signature", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateWaitingForDeposit, + } + expectedRetainedQuote := retainedPeginQuote + expectedRetainedQuote.State = quote.PeginStateCallForUserFailed + expectedRetainedQuote.CallForUserTxHash = callForUser + expectedRetainedQuote.UserBtcTxHash = btcTx + + lp := new(test.ProviderMock) + lp.On("RskAddress").Return(lpRskAddress).Twice() + + lbc := new(test.LbcMock) + lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(600), nil).Once() + txConfig := blockchain.NewTransactionConfig(entities.NewWei(29400), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) + lbc.On("CallForUser", txConfig, testPeginQuote).Return(callForUser, assert.AnError).Once() + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { + require.Error(t, event.Error) + return assert.Equal(t, testPeginQuote, event.PeginQuote) && assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) + })).Return().Once() + + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + return assert.Equal(t, expectedRetainedQuote, q) + })).Return(nil).Once() + + rsk := new(test.RskRpcMock) + rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() + + useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) + + require.Error(t, err) + lbc.AssertExpectations(t) + btc.AssertExpectations(t) + lp.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + mutex.AssertExpectations(t) +} diff --git a/internal/usecases/pegin/expire_quote_test.go b/internal/usecases/pegin/expire_quote_test.go new file mode 100644 index 00000000..43853534 --- /dev/null +++ b/internal/usecases/pegin/expire_quote_test.go @@ -0,0 +1,48 @@ +package pegin_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +func TestExpiredPeginQuoteUseCase_Run(t *testing.T) { + retainedQuote := quote.RetainedPeginQuote{ + QuoteHash: "0x1234", + DepositAddress: "0xa1b2c3", + Signature: "0x4321", + RequiredLiquidity: entities.NewWei(1), + State: quote.PeginStateWaitingForDeposit, + } + + expectedRetainedQuote := retainedQuote + expectedRetainedQuote.State = quote.PeginStateTimeForDepositElapsed + peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + peginQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetainedQuote).Return(nil) + useCase := pegin.NewExpiredPeginQuoteUseCase(peginQuoteRepository) + err := useCase.Run(context.Background(), retainedQuote) + peginQuoteRepository.AssertExpectations(t) + require.NoError(t, err) +} + +func TestExpiredPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { + retainedQuote := quote.RetainedPeginQuote{ + QuoteHash: "0x1234", + DepositAddress: "0xa1b2c3", + Signature: "0x4321", + RequiredLiquidity: entities.NewWei(1), + State: quote.PeginStateWaitingForDeposit, + } + peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + peginQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) + useCase := pegin.NewExpiredPeginQuoteUseCase(peginQuoteRepository) + err := useCase.Run(context.Background(), retainedQuote) + peginQuoteRepository.AssertExpectations(t) + require.Error(t, err) +} diff --git a/internal/usecases/pegin/get_collateral_test.go b/internal/usecases/pegin/get_collateral_test.go new file mode 100644 index 00000000..592355dc --- /dev/null +++ b/internal/usecases/pegin/get_collateral_test.go @@ -0,0 +1,35 @@ +package pegin_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestGetCollateralUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + value := entities.NewWei(1000) + lp.On("RskAddress").Return("rskAddress") + lbc.On("GetCollateral", "rskAddress").Return(value, nil) + useCase := pegin.NewGetCollateralUseCase(lbc, lp) + result, err := useCase.Run() + lbc.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, value, result) +} + +func TestGetCollateralUseCase_Run_Error(t *testing.T) { + lbc := new(test.LbcMock) + lp := new(test.ProviderMock) + lp.On("RskAddress").Return("rskAddress") + lbc.On("GetCollateral", "rskAddress").Return(entities.NewWei(0), assert.AnError) + useCase := pegin.NewGetCollateralUseCase(lbc, lp) + result, err := useCase.Run() + lbc.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) +} diff --git a/internal/usecases/pegin/get_pegin_quote_test.go b/internal/usecases/pegin/get_pegin_quote_test.go new file mode 100644 index 00000000..8aa0b17b --- /dev/null +++ b/internal/usecases/pegin/get_pegin_quote_test.go @@ -0,0 +1,281 @@ +package pegin_test + +import ( + "context" + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +// nolint:funlen,cyclop +func TestGetQuoteUseCase_Run(t *testing.T) { + quoteHash := "0x9876543210" + fedAddress := "fed address" + lbcAddress := "lbc address" + lpBtcAddress := "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6" + userRskAddress := "0x79568c2989232dCa1840087D73d403602364c0D4" + quoteValue := entities.NewWei(5000) + quoteData := []byte{1} + userBtcAddress := "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6" + lpRskAddress := "0x4b5b6b" + callFee := entities.NewWei(100) + penaltyFee := entities.NewWei(50) + timeForDeposit := uint32(600) + callTime := uint32(600) + confirmations := uint16(10) + gasLimit := entities.NewWei(100) + + request := pegin.NewQuoteRequest(userRskAddress, quoteData, quoteValue, userRskAddress, userBtcAddress) + quoteMatchFunction := mock.MatchedBy(func(q quote.PeginQuote) bool { + return q.FedBtcAddress == fedAddress && q.LbcAddress == lbcAddress && q.LpRskAddress == lpRskAddress && + q.BtcRefundAddress == userBtcAddress && q.RskRefundAddress == userRskAddress && q.LpBtcAddress == lpBtcAddress && + q.CallFee.Cmp(callFee) == 0 && q.PenaltyFee.Cmp(penaltyFee) == 0 && q.ContractAddress == userRskAddress && + q.Data == hex.EncodeToString(quoteData) && q.GasLimit == uint32(gasLimit.Uint64()) && q.Value.Cmp(quoteValue) == 0 && + q.Nonce > 0 && q.TimeForDeposit == timeForDeposit && q.LpCallTime == callTime && q.Confirmations == confirmations && + q.CallOnRegister == false && q.GasFee.Cmp(entities.NewWei(10000)) == 0 && q.ProductFeeAmount == 0 + }) + + rsk := new(test.RskRpcMock) + rsk.On("EstimateGas", mock.Anything, userRskAddress, quoteValue, quoteData).Return(gasLimit, nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(100), nil) + feeCollector := new(test.FeeCollectorMock) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge := new(test.BridgeMock) + bridge.On("GetFedAddress").Return(fedAddress, nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) + lbc := new(test.LbcMock) + lbc.On("GetAddress").Return(lbcAddress) + lbc.On("HashPeginQuote", quoteMatchFunction).Return(quoteHash, nil) + peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + peginQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash, quoteMatchFunction).Return(nil) + lp := new(test.ProviderMock) + lp.On("CallFeePegin").Return(callFee) + lp.On("PenaltyFeePegin").Return(penaltyFee) + lp.On("ValidateAmountForPegin", quoteValue).Return(nil) + lp.On("RskAddress").Return(lpRskAddress) + lp.On("BtcAddress").Return(lpBtcAddress) + lp.On("TimeForDepositPegin").Return(timeForDeposit) + lp.On("CallTime").Return(callTime) + lp.On("GetBitcoinConfirmationsForValue", quoteValue).Return(confirmations) + + useCase := pegin.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") + result, err := useCase.Run(context.Background(), request) + + rsk.AssertExpectations(t) + feeCollector.AssertExpectations(t) + bridge.AssertExpectations(t) + lbc.AssertExpectations(t) + peginQuoteRepository.AssertExpectations(t) + lp.AssertExpectations(t) + + assert.NotEmpty(t, result.Hash) + require.NoError(t, entities.ValidateStruct(result.PeginQuote)) + require.NoError(t, err) +} + +func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { + rsk := new(test.RskRpcMock) + lp := new(test.ProviderMock) + feeCollector := new(test.FeeCollectorMock) + bridge := new(test.BridgeMock) + lbc := new(test.LbcMock) + peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + feeCollectorAddress := "feeCollectorAddress" + useCase := pegin.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, feeCollectorAddress) + cases := test.Table[pegin.QuoteRequest, error]{ + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any address"), + Result: usecases.BtcAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("any", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.RskAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "any", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.RskAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"), + Result: usecases.BtcAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx"), + Result: usecases.BtcAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "AvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.BtcAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.RskAddressNotSupportedError, + }, + { + Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D41", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.RskAddressNotSupportedError, + }, + } + for _, testCase := range cases { + result, err := useCase.Run(context.Background(), testCase.Value) + assert.Equal(t, pegin.GetPeginQuoteResult{}, result) + require.Error(t, err) + require.ErrorIs(t, err, testCase.Result) + } +} + +func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { + userRskAddress := "0x79568c2989232dCa1840087D73d403602364c0D4" + request := pegin.NewQuoteRequest(userRskAddress, []byte{1}, entities.NewWei(5000), userRskAddress, "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") + + setups := getQuoteUseCaseUnexpectedErrorSetups() + + for _, setup := range setups { + rsk := new(test.RskRpcMock) + feeCollector := new(test.FeeCollectorMock) + bridge := new(test.BridgeMock) + lbc := new(test.LbcMock) + peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + lp := new(test.ProviderMock) + + setup(rsk, feeCollector, bridge, lbc, lp, peginQuoteRepository) + + useCase := pegin.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") + result, err := useCase.Run(context.Background(), request) + rsk.AssertExpectations(t) + feeCollector.AssertExpectations(t) + bridge.AssertExpectations(t) + lbc.AssertExpectations(t) + peginQuoteRepository.AssertExpectations(t) + lp.AssertExpectations(t) + assert.Empty(t, result) + require.Error(t, err) + } +} + +// nolint:funlen +func getQuoteUseCaseUnexpectedErrorSetups() []func( + rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock, +) { + return []func( + rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock, + ){ + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(assert.AnError) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), assert.AnError) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetFedAddress").Return("", assert.AnError) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetMinimumLockTxValue").Return(nil, assert.AnError) + lbc.On("GetAddress").Return("lbc address") + lp.On("CallFeePegin").Return(entities.NewWei(100)) + lp.On("PenaltyFeePegin").Return(entities.NewWei(50)) + lp.On("RskAddress").Return("0x4b5b6b") + lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") + lp.On("TimeForDepositPegin").Return(uint32(600)) + lp.On("CallTime").Return(uint32(600)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(10)) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) + lbc.On("HashPeginQuote", mock.Anything).Return("", assert.AnError) + lbc.On("GetAddress").Return("lbc address") + lp.On("CallFeePegin").Return(entities.NewWei(100)) + lp.On("PenaltyFeePegin").Return(entities.NewWei(50)) + lp.On("RskAddress").Return("0x4b5b6b") + lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") + lp.On("TimeForDepositPegin").Return(uint32(600)) + lp.On("CallTime").Return(uint32(600)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(10)) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) + lbc.On("HashPeginQuote", mock.Anything).Return("any hash", nil) + lbc.On("GetAddress").Return("lbc address") + peginQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(assert.AnError) + lp.On("CallFeePegin").Return(entities.NewWei(100)) + lp.On("PenaltyFeePegin").Return(entities.NewWei(50)) + lp.On("RskAddress").Return("0x4b5b6b") + lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") + lp.On("TimeForDepositPegin").Return(uint32(600)) + lp.On("CallTime").Return(uint32(600)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(10)) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil).Once() + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(10), nil) + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + }, + func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, + lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) + rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) + bridge.On("GetFedAddress").Return("fed address", nil) + lbc.On("GetAddress").Return("") + lp.On("CallFeePegin").Return(entities.NewWei(0)) + lp.On("PenaltyFeePegin").Return(entities.NewWei(0)) + lp.On("RskAddress").Return("") + lp.On("BtcAddress").Return("") + lp.On("TimeForDepositPegin").Return(uint32(0)) + lp.On("CallTime").Return(uint32(0)) + lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(0)) + }, + } +} diff --git a/internal/usecases/pegin/register_pegin.go b/internal/usecases/pegin/register_pegin.go index 4ed91c3f..461502a1 100644 --- a/internal/usecases/pegin/register_pegin.go +++ b/internal/usecases/pegin/register_pegin.go @@ -17,7 +17,7 @@ type RegisterPeginUseCase struct { eventBus entities.EventBus bridge blockchain.RootstockBridge btc blockchain.BitcoinNetwork - rskWalletMutex *sync.Mutex + rskWalletMutex sync.Locker } func NewRegisterPeginUseCase( @@ -26,7 +26,7 @@ func NewRegisterPeginUseCase( eventBus entities.EventBus, bridge blockchain.RootstockBridge, btc blockchain.BitcoinNetwork, - rskWalletMutex *sync.Mutex, + rskWalletMutex sync.Locker, ) *RegisterPeginUseCase { return &RegisterPeginUseCase{ lbc: lbc, diff --git a/internal/usecases/pegin/register_pegin_test.go b/internal/usecases/pegin/register_pegin_test.go new file mode 100644 index 00000000..ee68d5ed --- /dev/null +++ b/internal/usecases/pegin/register_pegin_test.go @@ -0,0 +1,478 @@ +package pegin_test + +import ( + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +var btcRawTxMock = []byte{50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60} +var pmtMock = []byte{11, 12, 13, 14, 15, 16, 17, 18, 19, 20} +var btcBlockInfoMock = blockchain.BitcoinBlockInformation{ + Hash: [32]byte{32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + Height: big.NewInt(200), +} + +func TestRegisterPeginUseCase_Run(t *testing.T) { + registerPeginTx := "register tx hash" + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "0102031f1b", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: "btc tx hash", + CallForUserTxHash: "cfu tx hash", + } + expectedRetainedQuote := retainedPeginQuote + expectedRetainedQuote.State = quote.PeginStateRegisterPegInSucceeded + expectedRetainedQuote.RegisterPeginTxHash = registerPeginTx + + lbc := new(test.LbcMock) + lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ + QuoteSignature: []byte{1, 2, 3, 31, 27}, + BitcoinRawTransaction: btcRawTxMock, + PartialMerkleTree: pmtMock, + BlockHeight: btcBlockInfoMock.Height, + Quote: testPeginQuote, + }).Return(registerPeginTx, nil).Once() + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + return assert.Equal(t, expectedRetainedQuote, q) + })).Return(nil).Once() + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { + require.NoError(t, event.Error) + return assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) + })).Return().Once() + bridge := new(test.BridgeMock) + bridge.On("GetRequiredTxConfirmations").Return(uint64(10)).Once() + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: retainedPeginQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetRawTransaction", retainedPeginQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() + btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil).Once() + btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + + useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + err := useCase.Run(context.Background(), retainedPeginQuote) + + require.NoError(t, err) + lbc.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + bridge.AssertExpectations(t) + btc.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestRegisterPeginUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "0102031f1b", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: "btc tx hash", + CallForUserTxHash: "cfu tx hash", + } + + setups := registerPeginRecoverableErrorSetups() + + for _, setup := range setups { + lbc := new(test.LbcMock) + quoteRepository := new(test.PeginQuoteRepositoryMock) + btc := new(test.BtcRpcMock) + eventBus := new(test.EventBusMock) + + bridge := new(test.BridgeMock) + bridge.On("GetRequiredTxConfirmations").Return(uint64(10)) + + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + + caseQuote := retainedPeginQuote + setup(&caseQuote, lbc, quoteRepository, btc) + useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + err := useCase.Run(context.Background(), caseQuote) + + require.Error(t, err) + eventBus.AssertNotCalled(t, "Publish") + lbc.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + btc.AssertExpectations(t) + } +} + +func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + return []func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock){ + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + caseQuote.State = quote.PeginStateWaitingForDeposit + }, + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + Return(nil, assert.AnError).Once() + }, + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash). + Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() + }, + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: caseQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{caseQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + caseQuote.Signature = "malformed signature" + }, + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: caseQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{caseQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetRawTransaction", caseQuote.UserBtcTxHash).Return([]byte{}, assert.AnError).Once() + }, + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: caseQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{caseQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetRawTransaction", caseQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() + btc.On("GetPartialMerkleTree", caseQuote.UserBtcTxHash).Return([]byte{}, assert.AnError).Once() + }, + func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: caseQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{caseQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetRawTransaction", caseQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() + btc.On("GetPartialMerkleTree", caseQuote.UserBtcTxHash).Return(pmtMock, nil).Once() + btc.On("GetTransactionBlockInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinBlockInformation{}, assert.AnError) + }, + } +} + +func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "0102031f1b", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: "btc tx hash", + CallForUserTxHash: "cfu tx hash", + } + + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(nil, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + expected := retainedPeginQuote + expected.State = quote.PeginStateRegisterPegInFailed + return assert.Equal(t, expected, q) + })).Return(nil).Once() + + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { + expected := retainedPeginQuote + expected.State = quote.PeginStateRegisterPegInFailed + require.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) + return assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) + })).Return().Once() + + lbc := new(test.LbcMock) + bridge := new(test.BridgeMock) + btc := new(test.BtcRpcMock) + mutex := new(test.MutexMock) + + useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + + err := useCase.Run(context.Background(), retainedPeginQuote) + + require.ErrorIs(t, err, usecases.QuoteNotFoundError) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + + lbc.AssertNotCalled(t, "RegisterPegin") + bridge.AssertNotCalled(t, "GetRequiredTxConfirmations") + btc.AssertNotCalled(t, "GetTransactionInfo") + btc.AssertNotCalled(t, "GetRawTransaction") + btc.AssertNotCalled(t, "GetPartialMerkleTree") + btc.AssertNotCalled(t, "GetTransactionBlockInfo") + mutex.AssertNotCalled(t, "Lock") + mutex.AssertNotCalled(t, "Unlock") +} + +func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { + registerPeginTx := "register tx hash" + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "0102031f1b", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: "btc tx hash", + CallForUserTxHash: "cfu tx hash", + } + expectedRetainedQuote := retainedPeginQuote + expectedRetainedQuote.State = quote.PeginStateRegisterPegInFailed + expectedRetainedQuote.RegisterPeginTxHash = registerPeginTx + + lbc := new(test.LbcMock) + lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ + QuoteSignature: []byte{1, 2, 3, 31, 27}, + BitcoinRawTransaction: btcRawTxMock, + PartialMerkleTree: pmtMock, + BlockHeight: btcBlockInfoMock.Height, + Quote: testPeginQuote, + }).Return(registerPeginTx, assert.AnError).Once() + + quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + return assert.Equal(t, expectedRetainedQuote, q) + })).Return(nil).Once() + + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { + require.Error(t, event.Error) + return assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) + })).Return().Once() + bridge := new(test.BridgeMock) + bridge.On("GetRequiredTxConfirmations").Return(uint64(10)).Once() + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: retainedPeginQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetRawTransaction", retainedPeginQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() + btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil).Once() + btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) + mutex := new(test.MutexMock) + mutex.On("Lock").Return().Once() + mutex.On("Unlock").Return().Once() + + useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + err := useCase.Run(context.Background(), retainedPeginQuote) + + require.Error(t, err) + lbc.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + bridge.AssertExpectations(t) + btc.AssertExpectations(t) + mutex.AssertExpectations(t) +} + +func TestRegisterPeginUseCase_Run_NotEnoughConfirmations(t *testing.T) { + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "0102031f1b", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: "btc tx hash", + CallForUserTxHash: "cfu tx hash", + } + + setups := registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote) + + for _, testCase := range setups { + t.Run(testCase.description, func(t *testing.T) { + lbc := new(test.LbcMock) + quoteRepository := new(test.PeginQuoteRepositoryMock) + eventBus := new(test.EventBusMock) + btc := new(test.BtcRpcMock) + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + bridge := new(test.BridgeMock) + bridge.On("GetRequiredTxConfirmations").Return(uint64(30)) + + testCase.setup(lbc, quoteRepository, btc) + useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + err := useCase.Run(context.Background(), retainedPeginQuote) + + require.ErrorIs(t, err, testCase.err) + lbc.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + btc.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish") + }) + } +} + +func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.RetainedPeginQuote) []struct { + description string + setup func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) + err error +} { + return []struct { + description string + setup func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) + err error + }{ + { + description: "Should fail when tx has less confirmations than required from bridge", + setup: func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: retainedPeginQuote.UserBtcTxHash, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + }, + err: usecases.NoEnoughConfirmationsError, + }, + { + description: "Should fail when confirmations weren't processed from RSK bridge yet", + setup: func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: retainedPeginQuote.UserBtcTxHash, + Confirmations: 100, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetRawTransaction", retainedPeginQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() + btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil).Once() + btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) + lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ + QuoteSignature: []byte{1, 2, 3, 31, 27}, + BitcoinRawTransaction: btcRawTxMock, + PartialMerkleTree: pmtMock, + BlockHeight: btcBlockInfoMock.Height, + Quote: testPeginQuote, + }).Return("register tx hash", fmt.Errorf("some wrapper: %w", blockchain.WaitingForBridgeError)).Once() + }, + err: blockchain.WaitingForBridgeError, + }, + } +} + +func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { + registerPeginTx := "register tx hash" + retainedPeginQuote := quote.RetainedPeginQuote{ + QuoteHash: "101b1c", + DepositAddress: "any address", + Signature: "0102031f1b", + RequiredLiquidity: entities.NewWei(1500), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: "btc tx hash", + CallForUserTxHash: "cfu tx hash", + } + + setups := registerPeginUpdateErrorSetups(t, registerPeginTx, retainedPeginQuote) + + bridge := new(test.BridgeMock) + bridge.On("GetRequiredTxConfirmations").Return(uint64(10)) + + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ + Hash: retainedPeginQuote.UserBtcTxHash, + Confirmations: 11, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil) + btc.On("GetRawTransaction", retainedPeginQuote.UserBtcTxHash).Return(btcRawTxMock, nil) + btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil) + btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) + + mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() + + lbc := new(test.LbcMock) + lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ + QuoteSignature: []byte{1, 2, 3, 31, 27}, + BitcoinRawTransaction: btcRawTxMock, + PartialMerkleTree: pmtMock, + BlockHeight: btcBlockInfoMock.Height, + Quote: testPeginQuote, + }).Return(registerPeginTx, nil) + + for _, setup := range setups { + quoteRepository := new(test.PeginQuoteRepositoryMock) + eventBus := new(test.EventBusMock) + + setup(quoteRepository, eventBus) + useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + err := useCase.Run(context.Background(), retainedPeginQuote) + + require.Error(t, err) + quoteRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + } +} + +func registerPeginUpdateErrorSetups(t *testing.T, registerPeginTx string, retainedPeginQuote quote.RetainedPeginQuote) []func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock) { + return []func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock){ + func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(nil, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + expected := retainedPeginQuote + expected.State = quote.PeginStateRegisterPegInFailed + return assert.Equal(t, expected, q) + })).Return(assert.AnError).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { + expected := retainedPeginQuote + expected.State = quote.PeginStateRegisterPegInFailed + require.Error(t, event.Error) + return assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) + })).Return().Once() + }, + func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + expected := retainedPeginQuote + expected.State = quote.PeginStateRegisterPegInSucceeded + expected.RegisterPeginTxHash = registerPeginTx + return assert.Equal(t, expected, q) + })).Return(assert.AnError).Once() + eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { + expected := retainedPeginQuote + expected.State = quote.PeginStateRegisterPegInSucceeded + expected.RegisterPeginTxHash = registerPeginTx + require.NoError(t, event.Error) + return assert.Equal(t, expected, event.RetainedQuote) && + assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) + })).Return().Once() + }, + } +} diff --git a/internal/usecases/pegin/withdraw_collateral_test.go b/internal/usecases/pegin/withdraw_collateral_test.go new file mode 100644 index 00000000..b992fb35 --- /dev/null +++ b/internal/usecases/pegin/withdraw_collateral_test.go @@ -0,0 +1,38 @@ +package pegin_test + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestWithdrawCollateralUseCase_Run(t *testing.T) { + lbc := new(test.LbcMock) + lbc.On("WithdrawCollateral").Return(nil) + useCase := pegin.NewWithdrawCollateralUseCase(lbc) + err := useCase.Run() + lbc.AssertExpectations(t) + require.NoError(t, err) +} + +func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { + lbc := new(test.LbcMock) + useCase := pegin.NewWithdrawCollateralUseCase(lbc) + + lbc.On("WithdrawCollateral").Return(errors.New("LBC021")).Once() + err := useCase.Run() + require.ErrorIs(t, err, usecases.ProviderNotResignedError) + + lbc.On("WithdrawCollateral").Return(errors.New("LBC022")).Once() + err = useCase.Run() + require.ErrorIs(t, err, usecases.ProviderNotResignedError) + + lbc.On("WithdrawCollateral").Return(assert.AnError).Once() + err = useCase.Run() + require.NotErrorIs(t, err, usecases.ProviderNotResignedError) + require.Error(t, err) +} diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go index 35427a61..2b96913b 100644 --- a/internal/usecases/pegout/accept_pegout_quote.go +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -56,6 +56,9 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q return quote.AcceptedQuote{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPegoutQuoteId, usecases.ExpiredQuoteError, errorArgs) } + useCase.pegoutLiquidityMutex.Lock() + defer useCase.pegoutLiquidityMutex.Unlock() + if retainedQuote, err = useCase.quoteRepository.GetRetainedQuote(ctx, quoteHash); err != nil { return quote.AcceptedQuote{}, usecases.WrapUseCaseError(usecases.AcceptPegoutQuoteId, err) } else if retainedQuote != nil { @@ -65,9 +68,6 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q }, nil } - useCase.pegoutLiquidityMutex.Lock() - defer useCase.pegoutLiquidityMutex.Unlock() - if requiredLiquidity, err = useCase.calculateAndCheckLiquidity(ctx, *pegoutQuote); err != nil { return quote.AcceptedQuote{}, err } diff --git a/internal/usecases/pegout/accept_pegout_quote_test.go b/internal/usecases/pegout/accept_pegout_quote_test.go index 633610b2..9c0d47bc 100644 --- a/internal/usecases/pegout/accept_pegout_quote_test.go +++ b/internal/usecases/pegout/accept_pegout_quote_test.go @@ -115,6 +115,8 @@ func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { lp := new(test.ProviderMock) eventBus := new(test.EventBusMock) mutex := new(test.MutexMock) + mutex.On("Lock").Return() + mutex.On("Unlock").Return() useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) @@ -122,8 +124,7 @@ func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { lp.AssertNotCalled(t, "SignQuote") lp.AssertNotCalled(t, "HasPegoutLiquidity") eventBus.AssertNotCalled(t, "Publish") - mutex.AssertNotCalled(t, "Lock") - mutex.AssertNotCalled(t, "Unlock") + mutex.AssertExpectations(t) require.NoError(t, err) assert.NotEmpty(t, result) assert.Equal(t, quoteMock.LbcAddress, result.DepositAddress) diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index 43c2f175..e27e1247 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -83,11 +83,11 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { Result: usecases.RskAddressNotSupportedError, }, { - Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), - Result: usecases.BtcAddressNotSupportedError, + Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Result: usecases.RskAddressNotSupportedError, }, { - Value: pegout.NewQuoteRequest("bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + Value: pegout.NewQuoteRequest("bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), Result: usecases.BtcAddressNotSupportedError, }, { @@ -95,7 +95,7 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { Result: usecases.BtcAddressNotSupportedError, }, { - Value: pegout.NewQuoteRequest("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), + Value: pegout.NewQuoteRequest("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), Result: usecases.BtcAddressNotSupportedError, }, { diff --git a/test/bridge_mock.go b/test/bridge_mock.go index 514230d3..05c8b0a8 100644 --- a/test/bridge_mock.go +++ b/test/bridge_mock.go @@ -13,6 +13,9 @@ type BridgeMock struct { func (m *BridgeMock) GetMinimumLockTxValue() (*entities.Wei, error) { args := m.Called() + if args.Get(0) == nil { + return nil, args.Error(1) + } return args.Get(0).(*entities.Wei), args.Error(1) } @@ -20,3 +23,22 @@ func (m *BridgeMock) GetAddress() string { args := m.Called() return args.String(0) } + +func (m *BridgeMock) GetFedAddress() (string, error) { + args := m.Called() + return args.String(0), args.Error(1) +} + +func (m *BridgeMock) GetFlyoverDerivationAddress(args blockchain.FlyoverDerivationArgs) (blockchain.FlyoverDerivation, error) { + a := m.Called(args) + return a.Get(0).(blockchain.FlyoverDerivation), a.Error(1) +} + +func (m *BridgeMock) FetchFederationInfo() (blockchain.FederationInfo, error) { + args := m.Called() + return args.Get(0).(blockchain.FederationInfo), args.Error(1) +} + +func (m *BridgeMock) GetRequiredTxConfirmations() uint64 { + return m.Called().Get(0).(uint64) +} diff --git a/test/btc_rpc_mock.go b/test/btc_rpc_mock.go index f173f150..b8377447 100644 --- a/test/btc_rpc_mock.go +++ b/test/btc_rpc_mock.go @@ -32,3 +32,16 @@ func (m *BtcRpcMock) GetTransactionBlockInfo(txHash string) (blockchain.BitcoinB args := m.Called(txHash) return args.Get(0).(blockchain.BitcoinBlockInformation), args.Error(1) } + +func (m *BtcRpcMock) DecodeAddress(address string, keepVersion bool) ([]byte, error) { + args := m.Called(address, keepVersion) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]byte), args.Error(1) +} + +func (m *BtcRpcMock) GetPartialMerkleTree(hash string) ([]byte, error) { + args := m.Called(hash) + return args.Get(0).([]byte), args.Error(1) +} diff --git a/test/lbc_mock.go b/test/lbc_mock.go index a52d0a09..b31eee55 100644 --- a/test/lbc_mock.go +++ b/test/lbc_mock.go @@ -87,6 +87,11 @@ func (m *LbcMock) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64 return args.Get(0).([]entities.PunishmentEvent), args.Error(1) } +func (m *LbcMock) HashPeginQuote(peginQuote quote.PeginQuote) (string, error) { + args := m.Called(peginQuote) + return args.String(0), args.Error(1) +} + func (m *LbcMock) HashPegoutQuote(pegoutQuote quote.PegoutQuote) (string, error) { args := m.Called(pegoutQuote) return args.String(0), args.Error(1) @@ -97,6 +102,11 @@ func (m *LbcMock) WithdrawPegoutCollateral() error { return args.Error(0) } +func (m *LbcMock) WithdrawCollateral() error { + args := m.Called() + return args.Error(0) +} + func (m *LbcMock) GetDepositEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]quote.PegoutDeposit, error) { args := m.Called(ctx, fromBlock, toBlock) if args.Get(0) == nil { @@ -109,3 +119,21 @@ func (m *LbcMock) RefundPegout(txConfig blockchain.TransactionConfig, params blo args := m.Called(txConfig, params) return args.String(0), args.Error(1) } + +func (m *LbcMock) GetBalance(address string) (*entities.Wei, error) { + args := m.Called(address) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *LbcMock) CallForUser(txConfig blockchain.TransactionConfig, peginQuote quote.PeginQuote) (string, error) { + args := m.Called(txConfig, peginQuote) + return args.String(0), args.Error(1) +} + +func (m *LbcMock) RegisterPegin(params blockchain.RegisterPeginParams) (string, error) { + args := m.Called(params) + return args.String(0), args.Error(1) +} diff --git a/test/pegin_quote_repository_mock.go b/test/pegin_quote_repository_mock.go index 848cb91f..e197010d 100644 --- a/test/pegin_quote_repository_mock.go +++ b/test/pegin_quote_repository_mock.go @@ -11,6 +11,16 @@ type PeginQuoteRepositoryMock struct { mock.Mock } +func (m *PeginQuoteRepositoryMock) InsertQuote(ctx context.Context, hash string, quote quote.PeginQuote) error { + args := m.Called(ctx, hash, quote) + return args.Error(0) +} + +func (m *PeginQuoteRepositoryMock) InsertRetainedQuote(ctx context.Context, q quote.RetainedPeginQuote) error { + args := m.Called(ctx, q) + return args.Error(0) +} + func (m *PeginQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PeginQuote, error) { args := m.Called(ctx, hash) arg := args.Get(0) @@ -21,6 +31,16 @@ func (m *PeginQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (* } } +func (m *PeginQuoteRepositoryMock) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPeginQuote, error) { + args := m.Called(ctx, hash) + arg := args.Get(0) + if arg == nil { + return nil, args.Error(1) + } else { + return arg.(*quote.RetainedPeginQuote), args.Error(1) + } +} + func (m *PeginQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PeginState) ([]quote.RetainedPeginQuote, error) { args := m.Called(ctx, states) arg := args.Get(0) diff --git a/test/provider_mock.go b/test/provider_mock.go index 26df3d72..8e06e898 100644 --- a/test/provider_mock.go +++ b/test/provider_mock.go @@ -73,11 +73,21 @@ func (m *ProviderMock) MaxPegoutConfirmations() uint16 { return args.Get(0).(uint16) } +func (m *ProviderMock) ValidateAmountForPegin(amount *entities.Wei) error { + args := m.Called(amount) + return args.Error(0) +} + func (m *ProviderMock) ValidateAmountForPegout(amount *entities.Wei) error { args := m.Called(amount) return args.Error(0) } +func (m *ProviderMock) PenaltyFeePegin() *entities.Wei { + args := m.Called() + return args.Get(0).(*entities.Wei) +} + func (m *ProviderMock) PenaltyFeePegout() *entities.Wei { args := m.Called() return args.Get(0).(*entities.Wei) @@ -93,6 +103,16 @@ func (m *ProviderMock) GetBitcoinConfirmationsForValue(value *entities.Wei) uint return args.Get(0).(uint16) } +func (m *ProviderMock) TimeForDepositPegin() uint32 { + args := m.Called() + return args.Get(0).(uint32) +} + +func (m *ProviderMock) CallTime() uint32 { + args := m.Called() + return args.Get(0).(uint32) +} + func (m *ProviderMock) TimeForDepositPegout() uint32 { args := m.Called() return args.Get(0).(uint32) diff --git a/test/rsk_rpc_mock.go b/test/rsk_rpc_mock.go index dc26f641..cfd88f09 100644 --- a/test/rsk_rpc_mock.go +++ b/test/rsk_rpc_mock.go @@ -19,6 +19,17 @@ func (m *RskRpcMock) GetTransactionReceipt(ctx context.Context, hash string) (bl func (m *RskRpcMock) GasPrice(ctx context.Context) (*entities.Wei, error) { args := m.Called(ctx) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*entities.Wei), args.Error(1) +} + +func (m *RskRpcMock) GetBalance(ctx context.Context, address string) (*entities.Wei, error) { + args := m.Called(ctx, address) + if args.Get(0) == nil { + return nil, args.Error(1) + } return args.Get(0).(*entities.Wei), args.Error(1) } @@ -28,5 +39,8 @@ func (m *RskRpcMock) GetHeight(ctx context.Context) (uint64, error) { } func (m *RskRpcMock) EstimateGas(ctx context.Context, addr string, value *entities.Wei, data []byte) (*entities.Wei, error) { args := m.Called(ctx, addr, value, data) + if args.Get(0) == nil { + return nil, args.Error(1) + } return args.Get(0).(*entities.Wei), args.Error(1) } From 6a6435d3801e899c6734981774904e1744ababee Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 15 Feb 2024 17:24:59 -0300 Subject: [PATCH 016/113] feat: add localstack integration --- cmd/application/main.go | 5 +++- docker-compose/local/docker-compose.lps.yml | 1 + docker-compose/local/docker-compose.yml | 17 +++++++++++++ docker-compose/local/lps-env.sh | 3 ++- docker-compose/localstack/Dockerfile | 7 ++++++ docker-compose/localstack/local-key.json | 21 ++++++++++++++++ .../localstack/setup/secrets-manager.sh | 9 +++++++ docker-compose/localstack/setup/ses.sh | 5 ++++ internal/configuration/environment/aws.go | 24 +++++++++++++++++++ .../configuration/environment/environment.go | 2 ++ internal/configuration/environment/secrets.go | 3 +-- .../configuration/registry/alert_sender.go | 3 +-- sample-config.env | 16 +++++++------ sonar-project.properties | 13 +++++++--- 14 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 docker-compose/localstack/Dockerfile create mode 100644 docker-compose/localstack/local-key.json create mode 100755 docker-compose/localstack/setup/secrets-manager.sh create mode 100755 docker-compose/localstack/setup/ses.sh create mode 100644 internal/configuration/environment/aws.go diff --git a/cmd/application/main.go b/cmd/application/main.go index caa42c11..7235e006 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -24,7 +24,6 @@ func main() { initCtx, cancel := context.WithTimeout(context.Background(), bootstrapTimeout) env := environment.LoadEnv() - secrets := environment.LoadSecrets(initCtx, *env) logLevel, err := log.ParseLevel(env.LogLevel) if err != nil { @@ -43,6 +42,10 @@ func main() { } } + log.Debugf("Environment loaded: %+v", env) + + secrets := environment.LoadSecrets(initCtx, *env) + log.Info("Initializing application...") app := lps.NewApplication(initCtx, *env, *secrets) log.Info("Application initialized successfully") diff --git a/docker-compose/local/docker-compose.lps.yml b/docker-compose/local/docker-compose.lps.yml index f74ec1eb..f98537a2 100644 --- a/docker-compose/local/docker-compose.lps.yml +++ b/docker-compose/local/docker-compose.lps.yml @@ -66,6 +66,7 @@ services: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_REGION + - AWS_LOCAL_ENDPOINT ports: - "8080:8080" volumes: diff --git a/docker-compose/local/docker-compose.yml b/docker-compose/local/docker-compose.yml index b4553e47..5aa1a658 100644 --- a/docker-compose/local/docker-compose.yml +++ b/docker-compose/local/docker-compose.yml @@ -1,5 +1,22 @@ version: "3" services: + localstack: + build: + context: ../localstack + args: + UID: "${LPS_UID}" + container_name: localstack + image: flyover-localstack + ports: + - "127.0.0.1:4566:4566" # LocalStack Gateway + - "127.0.0.1:4510-4559:4510-4559" # external services port range + environment: + - DEBUG=${DEBUG:-0} + volumes: + - "${LOCALSTACK_HOME:-./volumes/localstack}:/var/lib/localstack" + - "/var/run/docker.sock:/var/run/docker.sock" + networks: + - net_lps powpeg-pegin: build: context: ../powpeg/pegin diff --git a/docker-compose/local/lps-env.sh b/docker-compose/local/lps-env.sh index 9820b280..0f05b641 100755 --- a/docker-compose/local/lps-env.sh +++ b/docker-compose/local/lps-env.sh @@ -80,11 +80,12 @@ MONGO_HOME="${MONGO_HOME:-./volumes/mongo}" [ -d "$RSKJ_HOME" ] || mkdir -p "$RSKJ_HOME/db" && mkdir -p "$RSKJ_HOME/logs" && chown -R "$LPS_UID" "$RSKJ_HOME" [ -d "$LPS_HOME" ] || mkdir -p "$LPS_HOME/db" && mkdir -p "$LPS_HOME/logs" && chown -R "$LPS_UID" "$LPS_HOME" [ -d "$MONGO_HOME" ] || mkdir -p "$MONGO_HOME/db" && chown -R "$LPS_UID" "$MONGO_HOME" +[ -d "$LOCALSTACK_HOME" ] || mkdir -p "$LOCALSTACK_HOME/db" && chown -R "$LPS_UID" "$LOCALSTACK_HOME" echo "LPS_UID: $LPS_UID; BTCD_HOME: '$BTCD_HOME'; RSKJ_HOME: '$RSKJ_HOME'; LPS_HOME: '$LPS_HOME'; MONGO_HOME: '$MONGO_HOME'" # start bitcoind and RSKJ dependant services -docker-compose --env-file "$ENV_FILE" up -d bitcoind rskj mongodb +docker-compose --env-file "$ENV_FILE" up -d bitcoind rskj mongodb localstack # read env vars . ./"$ENV_FILE" diff --git a/docker-compose/localstack/Dockerfile b/docker-compose/localstack/Dockerfile new file mode 100644 index 00000000..c2e5b305 --- /dev/null +++ b/docker-compose/localstack/Dockerfile @@ -0,0 +1,7 @@ +FROM localstack/localstack:3.1.0 + +ARG BTC_WALLET_PASSWORD=test +ARG RSK_ENCRYPTED_JSON_PASSWORD=test + +COPY local-key.json /tmp/local-key.json +COPY setup/ /etc/localstack/init/ready.d/ \ No newline at end of file diff --git a/docker-compose/localstack/local-key.json b/docker-compose/localstack/local-key.json new file mode 100644 index 00000000..3da90b86 --- /dev/null +++ b/docker-compose/localstack/local-key.json @@ -0,0 +1,21 @@ +{ + "address": "9d93929a9099be4355fc2389fbf253982f9df47c", + "crypto": { + "cipher": "aes-128-ctr", + "ciphertext": "2f6b816b46ea7e9917acad870e4acb8fae1ac57535d20d9f7f5bbd6fc9ceea6f", + "cipherparams": { + "iv": "5d57f07627bfab8e840fea6b7cbeb123" + }, + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "5272e0072f0fb5d53171d250729979777abc65f4bd946a995397c26eef33ef92" + }, + "mac": "f7ccbf7492edf922f11d67b5ff864d7d5b5df845586b0669af563626ba1ddad8" + }, + "id": "f344d854-cea8-479c-93ff-0f496e9a4df3", + "version": 3 +} \ No newline at end of file diff --git a/docker-compose/localstack/setup/secrets-manager.sh b/docker-compose/localstack/setup/secrets-manager.sh new file mode 100755 index 00000000..3dea2b31 --- /dev/null +++ b/docker-compose/localstack/setup/secrets-manager.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +BTC_WALLET_PASSWORD=test-password +RSK_ENCRYPTED_JSON_PASSWORD=test + +awslocal secretsmanager create-secret --name FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD --secret-string $BTC_WALLET_PASSWORD +awslocal secretsmanager create-secret --name FlyoverTestEnv/LPS-LOCAL-PASSWORD --secret-string $RSK_ENCRYPTED_JSON_PASSWORD +awslocal secretsmanager create-secret --name FlyoverTestEnv/LPS-LOCAL-KEY --secret-string file:///tmp/local-key.json +rm /tmp/local-key.json \ No newline at end of file diff --git a/docker-compose/localstack/setup/ses.sh b/docker-compose/localstack/setup/ses.sh new file mode 100755 index 00000000..de4470eb --- /dev/null +++ b/docker-compose/localstack/setup/ses.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +MOCK_MAIL_SENDER=no-reply@mail.flyover.rifcomputing.net + +awslocal ses verify-email-identity --email $MOCK_MAIL_SENDER \ No newline at end of file diff --git a/internal/configuration/environment/aws.go b/internal/configuration/environment/aws.go new file mode 100644 index 00000000..8fd2e38a --- /dev/null +++ b/internal/configuration/environment/aws.go @@ -0,0 +1,24 @@ +package environment + +import ( + "context" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + log "github.com/sirupsen/logrus" +) + +func GetAwsConfig(ctx context.Context, env Environment) (aws.Config, error) { + if env.LpsStage != "regtest" { + return config.LoadDefaultConfig(ctx) + } + + log.Debugf("Running in regtest mode. Using localstack endpoint (%s)", env.AwsLocalEndpoint) + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...any) (aws.Endpoint, error) { + return aws.Endpoint{ + PartitionID: "aws", + URL: env.AwsLocalEndpoint, + SigningRegion: region, + }, nil + }) + return config.LoadDefaultConfig(ctx, config.WithEndpointResolverWithOptions(customResolver)) +} diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index 28997936..bfd997dd 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -7,10 +7,12 @@ import ( ) type Environment struct { + LpsStage string `env:"LPS_STAGE" validate:"required,oneof=regtest testnet mainnet"` Port uint `env:"SERVER_PORT" validate:"required"` LogLevel string `env:"LOG_LEVEL" validate:"required"` LogFile string `env:"LOG_FILE"` EnableManagementApi bool `env:"ENABLE_MANAGEMENT_API"` + AwsLocalEndpoint string `env:"AWS_LOCAL_ENDPOINT"` Mongo MongoEnv Rsk RskEnv Btc BtcEnv diff --git a/internal/configuration/environment/secrets.go b/internal/configuration/environment/secrets.go index 7eac87ce..43677b8e 100644 --- a/internal/configuration/environment/secrets.go +++ b/internal/configuration/environment/secrets.go @@ -2,7 +2,6 @@ package environment import ( "context" - awsConfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" log "github.com/sirupsen/logrus" ) @@ -18,7 +17,7 @@ func LoadSecrets(ctx context.Context, environment Environment) *ApplicationSecre } func loadFromSecretsManager(ctx context.Context, env Environment) *ApplicationSecrets { - awsConfiguration, err := awsConfig.LoadDefaultConfig(ctx) + awsConfiguration, err := GetAwsConfig(ctx, env) if err != nil { log.Fatal("error loading secrets: ", err) } diff --git a/internal/configuration/registry/alert_sender.go b/internal/configuration/registry/alert_sender.go index 7591193e..8b174c58 100644 --- a/internal/configuration/registry/alert_sender.go +++ b/internal/configuration/registry/alert_sender.go @@ -2,7 +2,6 @@ package registry import ( "context" - awsConfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ses" "github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" @@ -11,7 +10,7 @@ import ( ) func NewAlertSender(ctx context.Context, env environment.Environment) entities.AlertSender { - awsConfiguration, err := awsConfig.LoadDefaultConfig(ctx) + awsConfiguration, err := environment.GetAwsConfig(ctx, env) if err != nil { log.Fatal("error loading alert sender: ", err) } diff --git a/sample-config.env b/sample-config.env index bef34d69..593a6c59 100755 --- a/sample-config.env +++ b/sample-config.env @@ -1,17 +1,19 @@ # General config +LPS_STAGE=regtest SERVER_PORT=8080 LOG_LEVEL=debug -LOG_FILE=./logs/lps.log +LOG_FILE=/home/lps/logs/lps.log ENABLE_MANAGEMENT_API=false +AWS_LOCAL_ENDPOINT=http://localstack:4566 # MongoDB config MONGODB_USER=root MONGODB_PASSWORD=root -MONGODB_HOST=127.0.0.1 +MONGODB_HOST=mongodb MONGODB_PORT=27017 # Rsk config -RSK_ENDPOINT=http://localhost:4444 +RSK_ENDPOINT=http://rskj:4444 CHAIN_ID=33 LBC_ADDR= RSK_BRIDGE_ADDR=0x0000000000000000000000000000000001000006 @@ -28,7 +30,7 @@ RSK_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "20000000 BTC_NETWORK=regtest BTC_USERNAME=test BTC_PASSWORD=test -BTC_ENDPOINT=127.0.0.1:5555 +BTC_ENDPOINT=bitcoind:5555 BTC_TX_FEE_RATE=0.00025 BTC_ENCRYPTED_WALLET=true BTC_WALLET_PASSWORD=FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD @@ -68,9 +70,9 @@ DISABLE_CAPTCHA=true CAPTCHA_URL="https://www.google.com/recaptcha/api/siteverify" # Aws env -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_REGION= +AWS_ACCESS_KEY_ID=test +AWS_SECRET_ACCESS_KEY=test +AWS_REGION=us-east-1 # Used by local scripts LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c diff --git a/sonar-project.properties b/sonar-project.properties index b879c362..c0592cd0 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,4 +1,11 @@ # relative paths to source directories. More details and properties are described -# in https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/ -sonar.sources=. -sonar.exclusions=connectors/bindings/* +# in https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/ +sonar.projectKey=liquidity-provider-server +sonar.projectVersion=2.0.0 +sonar.sources=internal,cmd,pkg +sonar.exclusions=**/*_test.go,test/*,internal/adapters/dataproviders/rootstock/bindings/* + +sonar.tests=. +sonar.test.inclusions=**/*_test.go + +sonar.branch.name=master,Stable-Test,QA-Test,architecture-migration From 0e4ffda42aee158e845477974bb3fea426cac11e Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 16 Feb 2024 17:18:57 -0300 Subject: [PATCH 017/113] feat: add btc address and network validation in endpoints --- .../adapters/dataproviders/bitcoin/rpc.go | 27 ++++++++ .../rest/handlers/get_pegin_quote.go | 3 +- .../rest/handlers/get_pegout_quote.go | 4 +- internal/configuration/registry/usecase.go | 2 + internal/entities/blockchain/bitcoin.go | 33 +++++++-- internal/entities/blockchain/bitcoin_test.go | 38 +++++++++++ internal/usecases/common.go | 1 - internal/usecases/pegin/get_pegin_quote.go | 19 ++++-- .../usecases/pegin/get_pegin_quote_test.go | 63 ++++++++++------- internal/usecases/pegout/get_pegout_quote.go | 21 +++--- .../usecases/pegout/get_pegout_quote_test.go | 67 ++++++++++++------- test/btc_rpc_mock.go | 5 ++ 12 files changed, 215 insertions(+), 68 deletions(-) diff --git a/internal/adapters/dataproviders/bitcoin/rpc.go b/internal/adapters/dataproviders/bitcoin/rpc.go index 85a2759e..51a402f7 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc.go +++ b/internal/adapters/dataproviders/bitcoin/rpc.go @@ -22,6 +22,33 @@ func NewBitcoindRpc(conn *Connection) blockchain.BitcoinNetwork { return &bitcoindRpc{conn: conn} } +func (rpc *bitcoindRpc) ValidateAddress(address string) error { + if err := rpc.validateNetwork(address); err != nil { + return err + } + if !blockchain.IsSupportedBtcAddress(address) { + return blockchain.BtcAddressNotSupportedError + } + return nil +} + +func (rpc *bitcoindRpc) validateNetwork(address string) error { + switch rpc.conn.NetworkParams.Net { + case wire.MainNet: + if !blockchain.IsMainnetBtcAddress(address) { + return blockchain.BtcAddressInvalidNetworkError + } + return nil + case wire.TestNet, wire.TestNet3: + if !blockchain.IsTestnetBtcAddress(address) { + return blockchain.BtcAddressInvalidNetworkError + } + return nil + default: + return fmt.Errorf("unsupported network: %v", rpc.conn.NetworkParams.Net) + } +} + func (rpc *bitcoindRpc) DecodeAddress(address string, keepVersion bool) ([]byte, error) { return DecodeAddressBase58(address, keepVersion) } diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go index 4c3915dd..634fa5e6 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go @@ -44,7 +44,8 @@ func NewGetPeginQuoteHandler(useCase *pegin.GetQuoteUseCase) http.HandlerFunc { ) result, err = useCase.Run(req.Context(), peginRequest) - if errors.Is(err, usecases.BtcAddressNotSupportedError) || + if errors.Is(err, blockchain.BtcAddressNotSupportedError) || + errors.Is(err, blockchain.BtcAddressInvalidNetworkError) || errors.Is(err, usecases.RskAddressNotSupportedError) || errors.Is(err, usecases.TxBelowMinimumError) || errors.Is(err, usecases.AmountOutOfRangeError) { diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go index de48a61f..750879cb 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go @@ -4,6 +4,7 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/pkg" @@ -35,7 +36,8 @@ func NewGetPegoutQuoteHandler(useCase *pegout.GetQuoteUseCase) http.HandlerFunc ) result, err = useCase.Run(req.Context(), pegoutRequest) - if errors.Is(err, usecases.BtcAddressNotSupportedError) || + if errors.Is(err, blockchain.BtcAddressNotSupportedError) || + errors.Is(err, blockchain.BtcAddressInvalidNetworkError) || errors.Is(err, usecases.RskAddressNotSupportedError) || errors.Is(err, usecases.TxBelowMinimumError) || errors.Is(err, usecases.AmountOutOfRangeError) { diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 0d9a7326..57c5d759 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -59,6 +59,7 @@ func NewUseCaseRegistry( return &UseCaseRegistry{ getPeginQuoteUseCase: pegin.NewGetQuoteUseCase( rskRegistry.RpcServer, + btcRegistry.RpcServer, rskRegistry.FeeCollector, rskRegistry.Bridge, rskRegistry.Lbc, @@ -130,6 +131,7 @@ func NewUseCaseRegistry( ), getPegoutQuoteUseCase: pegout.NewGetQuoteUseCase( rskRegistry.RpcServer, + btcRegistry.RpcServer, rskRegistry.FeeCollector, rskRegistry.Bridge, rskRegistry.Lbc, diff --git a/internal/entities/blockchain/bitcoin.go b/internal/entities/blockchain/bitcoin.go index bd56c944..38901a72 100644 --- a/internal/entities/blockchain/bitcoin.go +++ b/internal/entities/blockchain/bitcoin.go @@ -1,16 +1,26 @@ package blockchain import ( + "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" "math/big" "regexp" ) var ( - btcTestnetP2PKHRegex = regexp.MustCompile("^[mn]([a-km-zA-HJ-NP-Z1-9]{25,34})$") - btcMainnetP2PKHRegex = regexp.MustCompile("^[1]([a-km-zA-HJ-NP-Z1-9]{25,34})$") - btcMainnetP2SHRegex = regexp.MustCompile("^[3]([a-km-zA-HJ-NP-Z1-9]{33,34})$") - btcTestnetP2SHRegex = regexp.MustCompile("^[2]([a-km-zA-HJ-NP-Z1-9]{33,34})$") + btcTestnetP2PKHRegex = regexp.MustCompile("^[mn]([a-km-zA-HJ-NP-Z1-9]{25,34})$") + btcMainnetP2PKHRegex = regexp.MustCompile("^[1]([a-km-zA-HJ-NP-Z1-9]{25,34})$") + btcMainnetP2SHRegex = regexp.MustCompile("^[3]([a-km-zA-HJ-NP-Z1-9]{33,34})$") + btcTestnetP2SHRegex = regexp.MustCompile("^[2]([a-km-zA-HJ-NP-Z1-9]{33,34})$") + btcMainnetP2WPKHRegex = regexp.MustCompile("^(bc1)([ac-hj-np-z02-9]{39})$") + btcTestnetP2WPKHRegex = regexp.MustCompile("^(tb1)([ac-hj-np-z02-9]{39})$") + btcMainnetP2WSHRegex = regexp.MustCompile("^(bc1)([ac-hj-np-z02-9]{59})$") + btcTestnetP2WSHRegex = regexp.MustCompile("^(tb1)([ac-hj-np-z02-9]{59})$") +) + +var ( + BtcAddressInvalidNetworkError = errors.New("address network is not valid") + BtcAddressNotSupportedError = errors.New("btc address not supported") ) // IsSupportedBtcAddress checks if flyover protocol supports the given address @@ -27,6 +37,20 @@ func isP2SH(address string) bool { return btcTestnetP2SHRegex.MatchString(address) || btcMainnetP2SHRegex.MatchString(address) } +func IsTestnetBtcAddress(address string) bool { + return btcTestnetP2PKHRegex.MatchString(address) || + btcTestnetP2SHRegex.MatchString(address) || + btcTestnetP2WPKHRegex.MatchString(address) || + btcTestnetP2WSHRegex.MatchString(address) +} + +func IsMainnetBtcAddress(address string) bool { + return btcMainnetP2PKHRegex.MatchString(address) || + btcMainnetP2SHRegex.MatchString(address) || + btcMainnetP2WPKHRegex.MatchString(address) || + btcMainnetP2WSHRegex.MatchString(address) +} + type BitcoinWallet interface { EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) GetBalance() (*entities.Wei, error) @@ -37,6 +61,7 @@ type BitcoinWallet interface { } type BitcoinNetwork interface { + ValidateAddress(address string) error DecodeAddress(address string, keepVersion bool) ([]byte, error) GetTransactionInfo(hash string) (BitcoinTransactionInformation, error) GetRawTransaction(hash string) ([]byte, error) diff --git a/internal/entities/blockchain/bitcoin_test.go b/internal/entities/blockchain/bitcoin_test.go index 1126e4c5..5ad78db4 100644 --- a/internal/entities/blockchain/bitcoin_test.go +++ b/internal/entities/blockchain/bitcoin_test.go @@ -320,3 +320,41 @@ func TestIsSupportedBtcAddress(t *testing.T) { assert.Truef(t, blockchain.IsSupportedBtcAddress(address), "Address %s should be supported", address) } } + +func TestIsMainnetBtcAddress(t *testing.T) { + var mainnetAddresses []string + mainnetAddresses = append(mainnetAddresses, p2pkhMainnetAddresses...) + mainnetAddresses = append(mainnetAddresses, p2shMainnetAddresses...) + mainnetAddresses = append(mainnetAddresses, nativeSegwitMainnetAddresses...) + + var testnetAddresses []string + testnetAddresses = append(testnetAddresses, p2pkhTestnetAddresses...) + testnetAddresses = append(testnetAddresses, p2shTestnetAddresses...) + testnetAddresses = append(testnetAddresses, nativeSegwitTestnetAddresses...) + + for _, address := range mainnetAddresses { + assert.Truef(t, blockchain.IsMainnetBtcAddress(address), "IsMainnetBtcAddress should return true for address %s", address) + } + for _, address := range testnetAddresses { + assert.Falsef(t, blockchain.IsMainnetBtcAddress(address), "IsMainnetBtcAddress should return false for address %s", address) + } +} + +func TestIsTestnetBtcAddress(t *testing.T) { + var mainnetAddresses []string + mainnetAddresses = append(mainnetAddresses, p2pkhMainnetAddresses...) + mainnetAddresses = append(mainnetAddresses, p2shMainnetAddresses...) + mainnetAddresses = append(mainnetAddresses, nativeSegwitMainnetAddresses...) + + var testnetAddresses []string + testnetAddresses = append(testnetAddresses, p2pkhTestnetAddresses...) + testnetAddresses = append(testnetAddresses, p2shTestnetAddresses...) + testnetAddresses = append(testnetAddresses, nativeSegwitTestnetAddresses...) + + for _, address := range mainnetAddresses { + assert.Falsef(t, blockchain.IsTestnetBtcAddress(address), "IsTestnetBtcAddress should return false for address %s", address) + } + for _, address := range testnetAddresses { + assert.Truef(t, blockchain.IsTestnetBtcAddress(address), "IsTestnetBtcAddress should return true for address %s", address) + } +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go index af17c1e9..3f538c77 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -50,7 +50,6 @@ const ( var ( NonRecoverableError = errors.New("non recoverable") TxBelowMinimumError = errors.New("requested amount below bridge's min transaction value") - BtcAddressNotSupportedError = errors.New("btc address not supported") RskAddressNotSupportedError = errors.New("rsk address not supported") QuoteNotFoundError = errors.New("quote not found") ExpiredQuoteError = errors.New("expired quote") diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index f8649275..6e742d90 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -12,6 +12,7 @@ import ( type GetQuoteUseCase struct { rsk blockchain.RootstockRpcServer + btc blockchain.BitcoinNetwork feeCollector blockchain.FeeCollector bridge blockchain.RootstockBridge lbc blockchain.LiquidityBridgeContract @@ -23,6 +24,7 @@ type GetQuoteUseCase struct { func NewGetQuoteUseCase( rsk blockchain.RootstockRpcServer, + btc blockchain.BitcoinNetwork, feeCollector blockchain.FeeCollector, bridge blockchain.RootstockBridge, lbc blockchain.LiquidityBridgeContract, @@ -33,6 +35,7 @@ func NewGetQuoteUseCase( ) *GetQuoteUseCase { return &GetQuoteUseCase{ rsk: rsk, + btc: btc, feeCollector: feeCollector, bridge: bridge, lbc: lbc, @@ -128,20 +131,22 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { var err error args := usecases.NewErrorArgs() - if !blockchain.IsSupportedBtcAddress(request.bitcoinRefundAddress) { + if err = useCase.btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { args["btcAddress"] = request.bitcoinRefundAddress - return args, usecases.BtcAddressNotSupportedError - } else if !blockchain.IsRskAddress(request.rskRefundAddress) { + return args, err + } + if !blockchain.IsRskAddress(request.rskRefundAddress) { args["rskAddress"] = request.rskRefundAddress return args, usecases.RskAddressNotSupportedError - } else if !blockchain.IsRskAddress(request.callEoaOrContractAddress) { + } + if !blockchain.IsRskAddress(request.callEoaOrContractAddress) { args["rskAddress"] = request.callEoaOrContractAddress return args, usecases.RskAddressNotSupportedError - } else if err = useCase.peginLp.ValidateAmountForPegin(request.valueToTransfer); err != nil { + } + if err = useCase.peginLp.ValidateAmountForPegin(request.valueToTransfer); err != nil { return args, err - } else { - return nil, nil } + return nil, nil } func (useCase *GetQuoteUseCase) buildPeginQuote( diff --git a/internal/usecases/pegin/get_pegin_quote_test.go b/internal/usecases/pegin/get_pegin_quote_test.go index 8aa0b17b..f357c8f5 100644 --- a/internal/usecases/pegin/get_pegin_quote_test.go +++ b/internal/usecases/pegin/get_pegin_quote_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/hex" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" @@ -64,8 +65,9 @@ func TestGetQuoteUseCase_Run(t *testing.T) { lp.On("TimeForDepositPegin").Return(timeForDeposit) lp.On("CallTime").Return(callTime) lp.On("GetBitcoinConfirmationsForValue", quoteValue).Return(confirmations) - - useCase := pegin.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") + btc := new(test.BtcRpcMock) + btc.On("ValidateAddress", mock.Anything).Return(nil) + useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") result, err := useCase.Run(context.Background(), request) rsk.AssertExpectations(t) @@ -88,43 +90,56 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { lbc := new(test.LbcMock) peginQuoteRepository := new(test.PeginQuoteRepositoryMock) feeCollectorAddress := "feeCollectorAddress" - useCase := pegin.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, feeCollectorAddress) - cases := test.Table[pegin.QuoteRequest, error]{ + cases := test.Table[func(btc *test.BtcRpcMock) pegin.QuoteRequest, error]{ { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any address"), - Result: usecases.BtcAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + const anyAddress = "any address" + btc.On("ValidateAddress", anyAddress).Return(blockchain.BtcAddressNotSupportedError) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", anyAddress) + }, + Result: blockchain.BtcAddressNotSupportedError, }, { - Value: pegin.NewQuoteRequest("any", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - Result: usecases.RskAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + const anyAddress = "any address" + btc.On("ValidateAddress", anyAddress).Return(blockchain.BtcAddressInvalidNetworkError) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", anyAddress) + }, + Result: blockchain.BtcAddressInvalidNetworkError, }, { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "any", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegin.NewQuoteRequest("any", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"), - Result: usecases.BtcAddressNotSupportedError, - }, - { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx"), - Result: usecases.BtcAddressNotSupportedError, - }, - { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "AvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - Result: usecases.BtcAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "any", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, + Result: usecases.RskAddressNotSupportedError, }, { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D41", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D41", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, } for _, testCase := range cases { - result, err := useCase.Run(context.Background(), testCase.Value) + btc := new(test.BtcRpcMock) + useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, feeCollectorAddress) + result, err := useCase.Run(context.Background(), testCase.Value(btc)) assert.Equal(t, pegin.GetPeginQuoteResult{}, result) require.Error(t, err) require.ErrorIs(t, err, testCase.Result) @@ -144,10 +159,12 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { lbc := new(test.LbcMock) peginQuoteRepository := new(test.PeginQuoteRepositoryMock) lp := new(test.ProviderMock) + btc := new(test.BtcRpcMock) + btc.On("ValidateAddress", mock.Anything).Return(nil) setup(rsk, feeCollector, bridge, lbc, lp, peginQuoteRepository) - useCase := pegin.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") + useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") result, err := useCase.Run(context.Background(), request) rsk.AssertExpectations(t) feeCollector.AssertExpectations(t) diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index dfaf3159..7fe8998a 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -12,6 +12,7 @@ import ( type GetQuoteUseCase struct { rsk blockchain.RootstockRpcServer + btc blockchain.BitcoinNetwork feeCollector blockchain.FeeCollector bridge blockchain.RootstockBridge lbc blockchain.LiquidityBridgeContract @@ -24,6 +25,7 @@ type GetQuoteUseCase struct { func NewGetQuoteUseCase( rsk blockchain.RootstockRpcServer, + btc blockchain.BitcoinNetwork, feeCollector blockchain.FeeCollector, bridge blockchain.RootstockBridge, lbc blockchain.LiquidityBridgeContract, @@ -35,6 +37,7 @@ func NewGetQuoteUseCase( ) *GetQuoteUseCase { return &GetQuoteUseCase{ rsk: rsk, + btc: btc, feeCollector: feeCollector, bridge: bridge, lbc: lbc, @@ -125,20 +128,22 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { var err error errorArgs := usecases.NewErrorArgs() - if !blockchain.IsSupportedBtcAddress(request.to) { + if err = useCase.btc.ValidateAddress(request.to); err != nil { errorArgs["btcAddress"] = request.to - return errorArgs, usecases.BtcAddressNotSupportedError - } else if !blockchain.IsSupportedBtcAddress(request.bitcoinRefundAddress) { + return errorArgs, err + } + if err = useCase.btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { errorArgs["btcAddress"] = request.bitcoinRefundAddress - return errorArgs, usecases.BtcAddressNotSupportedError - } else if !blockchain.IsRskAddress(request.rskRefundAddress) { + return errorArgs, err + } + if !blockchain.IsRskAddress(request.rskRefundAddress) { errorArgs["rskAddress"] = request.rskRefundAddress return errorArgs, usecases.RskAddressNotSupportedError - } else if err = useCase.pegoutLp.ValidateAmountForPegout(request.valueToTransfer); err != nil { + } + if err = useCase.pegoutLp.ValidateAmountForPegout(request.valueToTransfer); err != nil { return errorArgs, err - } else { - return nil, nil } + return nil, nil } func (useCase *GetQuoteUseCase) buildPegoutQuote(ctx context.Context, request QuoteRequest, fees quote.Fees) (quote.PegoutQuote, error) { diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index e27e1247..4e85196f 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" pegout "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" @@ -38,8 +39,10 @@ func TestGetQuoteUseCase_Run(t *testing.T) { lp.On("ExpireBlocksPegout").Return(uint64(60000)) btcWallet := new(test.BtcWalletMock) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000000000000000), nil) + btc := new(test.BtcRpcMock) + btc.On("ValidateAddress", mock.Anything).Return(nil) feeCollectorAddress := "feeCollectorAddress" - useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) request := pegout.NewQuoteRequest( "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1000000000000000000), @@ -60,6 +63,7 @@ func TestGetQuoteUseCase_Run(t *testing.T) { } func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { + const wrongAddress = "wrong address" rsk := new(test.RskRpcMock) lp := new(test.ProviderMock) feeCollector := new(test.FeeCollectorMock) @@ -68,43 +72,58 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) btcWallet := new(test.BtcWalletMock) feeCollectorAddress := "feeCollectorAddress" - useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) - cases := test.Table[pegout.QuoteRequest, error]{ + cases := test.Table[func(btc *test.BtcRpcMock) pegout.QuoteRequest, error]{ { - Value: pegout.NewQuoteRequest("any address", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - Result: usecases.BtcAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressInvalidNetworkError).Once() + btc.On("ValidateAddress", mock.Anything).Return(nil).Once() + return pegout.NewQuoteRequest(wrongAddress, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, + Result: blockchain.BtcAddressInvalidNetworkError, }, { - Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "any"), - Result: usecases.BtcAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressNotSupportedError).Once() + btc.On("ValidateAddress", mock.Anything).Return(nil).Once() + return pegout.NewQuoteRequest(wrongAddress, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, + Result: blockchain.BtcAddressNotSupportedError, }, { - Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", nil, "anything", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", nil, "anything", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), + Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: pegout.NewQuoteRequest("bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - Result: usecases.BtcAddressNotSupportedError, - }, - { - Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"), - Result: usecases.BtcAddressNotSupportedError, - }, - { - Value: pegout.NewQuoteRequest("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe"), - Result: usecases.BtcAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressInvalidNetworkError).Once() + btc.On("ValidateAddress", mock.Anything).Return(nil).Once() + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", wrongAddress) + }, + Result: blockchain.BtcAddressInvalidNetworkError, }, { - Value: pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx"), - Result: usecases.BtcAddressNotSupportedError, + Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressNotSupportedError).Once() + btc.On("ValidateAddress", mock.Anything).Return(nil).Once() + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", wrongAddress) + }, + Result: blockchain.BtcAddressNotSupportedError, }, } for _, testCase := range cases { - result, err := useCase.Run(context.Background(), testCase.Value) + btc := new(test.BtcRpcMock) + useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + result, err := useCase.Run(context.Background(), testCase.Value(btc)) assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) require.Error(t, err) require.ErrorIs(t, err, testCase.Result) @@ -139,7 +158,9 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { lp.On("TimeForDepositPegout").Return(uint32(60000)) lp.On("ExpireBlocksPegout").Return(uint64(60000)) lbc.On("GetAddress").Return("0x1234") - useCase := pegout.NewGetQuoteUseCase(rsk, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + btc := new(test.BtcRpcMock) + btc.On("ValidateAddress", mock.Anything).Return(nil) + useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) result, err := useCase.Run(context.Background(), request) assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) require.Error(t, err) diff --git a/test/btc_rpc_mock.go b/test/btc_rpc_mock.go index b8377447..ae7b0a81 100644 --- a/test/btc_rpc_mock.go +++ b/test/btc_rpc_mock.go @@ -45,3 +45,8 @@ func (m *BtcRpcMock) GetPartialMerkleTree(hash string) ([]byte, error) { args := m.Called(hash) return args.Get(0).([]byte), args.Error(1) } + +func (m *BtcRpcMock) ValidateAddress(address string) error { + args := m.Called(address) + return args.Error(0) +} From ace6ea044c1dfd0ddc6f3d825c8554dff32114e0 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 16 Feb 2024 17:30:41 -0300 Subject: [PATCH 018/113] test: test update error after sending to the bridge in RefundPegoutUseCase --- internal/usecases/pegout/refund_pegout.go | 4 +- .../usecases/pegout/refund_pegout_test.go | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go index b317d252..c4686d30 100644 --- a/internal/usecases/pegout/refund_pegout.go +++ b/internal/usecases/pegout/refund_pegout.go @@ -150,7 +150,7 @@ func (useCase *RefundPegoutUseCase) sendRbtcToBridge(ctx context.Context, pegout } retainedQuote.BridgeRefundTxHash = txHash - if updateError = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + if updateError = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { return quote.RetainedPegoutQuote{}, usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, errors.Join(updateError, err), usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) } return retainedQuote, err @@ -182,7 +182,7 @@ func (useCase *RefundPegoutUseCase) performRefundPegout( Error: err, }) - if updateError = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); err != nil { + if updateError = useCase.quoteRepository.UpdateRetainedQuote(ctx, retainedQuote); updateError != nil { return quote.RetainedPegoutQuote{}, usecases.WrapUseCaseErrorArgs(usecases.RefundPegoutId, errors.Join(updateError, err), usecases.ErrorArg("quoteHash", retainedQuote.QuoteHash)) } return retainedQuote, err diff --git a/internal/usecases/pegout/refund_pegout_test.go b/internal/usecases/pegout/refund_pegout_test.go index 93a91f9d..497f3cd0 100644 --- a/internal/usecases/pegout/refund_pegout_test.go +++ b/internal/usecases/pegout/refund_pegout_test.go @@ -2,6 +2,7 @@ package pegout_test import ( "context" + "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" @@ -140,6 +141,48 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { require.NoError(t, err) } +func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { + updateError := errors.New("an update error") + quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(updateError).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + lbc := new(test.LbcMock) + lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() + eventBus := new(test.EventBusMock) + eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { + expected := retainedQuote + expected.RefundPegoutTxHash = refundPegoutTxHash + expected.State = quote.PegoutStateRefundPegOutSucceeded + require.NoError(t, event.Error) + return assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) + })).Return().Once() + btc := new(test.BtcRpcMock) + btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() + btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil) + btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) + btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) + rskWallet := new(test.RskWalletMock) + rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(bridgeTxHash, nil).Once() + bridge := new(test.BridgeMock) + bridge.On("GetAddress").Return("an address").Once() + mutex := new(test.MutexMock) + mutex.On("Unlock").Return().Once() + mutex.On("Lock").Return().Once() + + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + err := useCase.Run(context.Background(), retainedQuote) + + quoteRepository.AssertExpectations(t) + lbc.AssertExpectations(t) + eventBus.AssertExpectations(t) + btc.AssertExpectations(t) + rskWallet.AssertExpectations(t) + bridge.AssertExpectations(t) + mutex.AssertExpectations(t) + require.ErrorIs(t, err, updateError) +} + func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { bridge := new(test.BridgeMock) bridge.On("GetAddress").Return("0x1234").Once() From c671471616aa30cbdb38e2166525757c18c50a0a Mon Sep 17 00:00:00 2001 From: Luisfc68 <60527258+Luisfc68@users.noreply.github.com> Date: Thu, 29 Feb 2024 03:59:27 -0300 Subject: [PATCH 019/113] Feature/GBI-1621 - LP parameter configuration endpoints (#380) * feat: add btc address and network validation in endpoints * test: test update error after sending to the bridge in RefundPegoutUseCase * feat: capability of change LP config using management API * test: add test for LP configuration endpoints * test: organize and lint test packages --- .../adapters/dataproviders/configuration.go | 25 +- .../database/mongo/liquidity_provider.go | 119 ++++++++ .../dataproviders/liquidity_provider.go | 165 ++++------- .../dataproviders/rootstock/common.go | 3 +- .../adapters/dataproviders/rootstock/lbc.go | 19 +- .../dataproviders/rootstock/wallet.go | 22 ++ .../rest/handlers/get_configuration.go | 19 ++ .../rest/handlers/get_pegin_quote.go | 3 +- .../rest/handlers/get_pegout_quote.go | 3 +- .../rest/handlers/provider_details.go | 2 +- .../rest/handlers/set_general_config.go | 35 +++ .../rest/handlers/set_pegin_config.go | 35 +++ .../rest/handlers/set_pegout_config.go | 35 +++ .../entrypoints/rest/registry/registry.go | 4 + .../entrypoints/rest/routes/routes.go | 8 + .../entrypoints/watcher/pegout_rsk_watcher.go | 8 +- .../environment/configuration.go | 27 +- .../configuration/environment/environment.go | 71 ++--- internal/configuration/registry/database.go | 15 +- .../registry/liquidity_provider.go | 1 + internal/configuration/registry/usecase.go | 38 +++ internal/entities/blockchain/bitcoin_test.go | 2 +- internal/entities/blockchain/lbc.go | 15 +- internal/entities/blockchain/lbc_test.go | 15 +- internal/entities/common.go | 33 +++ internal/entities/common_test.go | 78 ++++++ .../liquidity_provider/configuration.go | 86 ++++++ .../liquidity_provider/configuration_test.go | 123 +++++++++ .../entities/liquidity_provider/default.go | 72 +++++ .../liquidity_provider/default_test.go | 73 +++++ .../liquidity_provider.go | 47 ++-- .../liquidity_provider_test.go | 36 +-- internal/entities/quote/pegout_quote.go | 5 +- internal/entities/quote/pegout_quote_test.go | 18 +- internal/entities/wei.go | 18 +- internal/entities/wei_test.go | 38 ++- internal/usecases/common.go | 29 +- internal/usecases/common_test.go | 34 +++ .../liquidity_provider/change_status.go | 6 +- .../liquidity_provider/change_status_test.go | 18 +- .../liquidity_provider/check_liquidity.go | 9 +- .../check_liquidity_test.go | 45 +-- .../usecases/liquidity_provider/common.go | 10 +- .../liquidity_provider/common_test.go | 20 +- .../liquidity_provider/get_configuration.go | 38 +++ .../get_configuration_test.go | 26 ++ .../liquidity_provider/get_providers.go | 6 +- .../liquidity_provider/get_providers_test.go | 18 +- .../penalization_alert_test.go | 15 +- .../liquidity_provider/provider_detail.go | 45 +-- .../provider_detail_test.go | 101 +++---- .../liquidity_provider/registration.go | 21 +- .../liquidity_provider/registration_test.go | 49 ++-- .../usecases/liquidity_provider/resign.go | 6 +- .../liquidity_provider/resign_test.go | 22 +- .../liquidity_provider/set_general_config.go | 34 +++ .../set_general_config_test.go | 75 +++++ .../liquidity_provider/set_pegin_config.go | 34 +++ .../set_pegin_config_test.go | 70 +++++ .../liquidity_provider/set_pegout_config.go | 34 +++ .../set_pegout_config_test.go | 71 +++++ internal/usecases/pegin/accept_pegin_quote.go | 9 +- .../usecases/pegin/accept_pegin_quote_test.go | 153 ++++++----- internal/usecases/pegin/add_collateral.go | 5 +- .../usecases/pegin/add_collateral_test.go | 21 +- internal/usecases/pegin/call_for_user.go | 5 +- internal/usecases/pegin/call_for_user_test.go | 157 +++++------ internal/usecases/pegin/expire_quote_test.go | 6 +- internal/usecases/pegin/get_collateral.go | 5 +- .../usecases/pegin/get_collateral_test.go | 10 +- internal/usecases/pegin/get_pegin_quote.go | 31 ++- .../usecases/pegin/get_pegin_quote_test.go | 260 +++++++++--------- .../usecases/pegin/register_pegin_test.go | 119 ++++---- .../pegin/withdraw_collateral_test.go | 6 +- .../usecases/pegout/accept_pegout_quote.go | 9 +- .../pegout/accept_pegout_quote_test.go | 85 +++--- internal/usecases/pegout/add_collateral.go | 5 +- .../usecases/pegout/add_collateral_test.go | 21 +- internal/usecases/pegout/expire_qupte_test.go | 6 +- internal/usecases/pegout/get_collateral.go | 5 +- .../usecases/pegout/get_collateral_test.go | 10 +- internal/usecases/pegout/get_pegout_quote.go | 42 +-- .../usecases/pegout/get_pegout_quote_test.go | 219 ++++++++------- .../usecases/pegout/get_user_deposits_test.go | 6 +- .../pegout/init_deposits_cache_test.go | 21 +- .../usecases/pegout/refund_pegout_test.go | 127 ++++----- internal/usecases/pegout/send_pegout_test.go | 113 ++++---- .../pegout/withdraw_collateral_test.go | 6 +- .../usecases/watcher/clean_exipred_test.go | 20 +- .../watcher/get_watched_pegin_quote_test.go | 16 +- .../watcher/get_watched_pegout_quote_test.go | 16 +- .../watcher/update_pegout_deposit_test.go | 17 +- pkg/liquidity_provider.go | 14 + sample-config.env | 17 -- test/{ => mocks}/alert_sender_mock.go | 2 +- test/{ => mocks}/bridge_mock.go | 2 +- test/{ => mocks}/btc_rpc_mock.go | 2 +- test/{ => mocks}/btc_wallet_mock.go | 2 +- test/{ => mocks}/event_bus_mock.go | 2 +- test/{ => mocks}/fee_collector_mock.go | 2 +- test/{ => mocks}/lbc_mock.go | 11 +- .../liquidity_provider_repository_mock.go | 43 +++ .../pegin_quote_repository_mock.go | 2 +- .../pegout_quote_repository_mock.go | 2 +- test/mocks/provider_mock.go | 55 ++++ test/{ => mocks}/rsk_rpc_mock.go | 2 +- test/mocks/rsk_wallet_mock.go | 41 +++ test/provider_mock.go | 129 --------- test/rsk_wallet_mock.go | 17 -- test/utils.go | 7 + 110 files changed, 2605 insertions(+), 1430 deletions(-) create mode 100644 internal/adapters/dataproviders/database/mongo/liquidity_provider.go create mode 100644 internal/adapters/entrypoints/rest/handlers/get_configuration.go create mode 100644 internal/adapters/entrypoints/rest/handlers/set_general_config.go create mode 100644 internal/adapters/entrypoints/rest/handlers/set_pegin_config.go create mode 100644 internal/adapters/entrypoints/rest/handlers/set_pegout_config.go create mode 100644 internal/entities/common_test.go create mode 100644 internal/entities/liquidity_provider/configuration.go create mode 100644 internal/entities/liquidity_provider/configuration_test.go create mode 100644 internal/entities/liquidity_provider/default.go create mode 100644 internal/entities/liquidity_provider/default_test.go rename internal/entities/{ => liquidity_provider}/liquidity_provider.go (52%) rename internal/entities/{ => liquidity_provider}/liquidity_provider_test.go (53%) create mode 100644 internal/usecases/liquidity_provider/get_configuration.go create mode 100644 internal/usecases/liquidity_provider/get_configuration_test.go create mode 100644 internal/usecases/liquidity_provider/set_general_config.go create mode 100644 internal/usecases/liquidity_provider/set_general_config_test.go create mode 100644 internal/usecases/liquidity_provider/set_pegin_config.go create mode 100644 internal/usecases/liquidity_provider/set_pegin_config_test.go create mode 100644 internal/usecases/liquidity_provider/set_pegout_config.go create mode 100644 internal/usecases/liquidity_provider/set_pegout_config_test.go rename test/{ => mocks}/alert_sender_mock.go (96%) rename test/{ => mocks}/bridge_mock.go (98%) rename test/{ => mocks}/btc_rpc_mock.go (99%) rename test/{ => mocks}/btc_wallet_mock.go (98%) rename test/{ => mocks}/event_bus_mock.go (96%) rename test/{ => mocks}/fee_collector_mock.go (95%) rename test/{ => mocks}/lbc_mock.go (89%) create mode 100644 test/mocks/liquidity_provider_repository_mock.go rename test/{ => mocks}/pegin_quote_repository_mock.go (99%) rename test/{ => mocks}/pegout_quote_repository_mock.go (99%) create mode 100644 test/mocks/provider_mock.go rename test/{ => mocks}/rsk_rpc_mock.go (98%) create mode 100644 test/mocks/rsk_wallet_mock.go delete mode 100644 test/provider_mock.go delete mode 100644 test/rsk_wallet_mock.go diff --git a/internal/adapters/dataproviders/configuration.go b/internal/adapters/dataproviders/configuration.go index 2725c12a..10246cf6 100644 --- a/internal/adapters/dataproviders/configuration.go +++ b/internal/adapters/dataproviders/configuration.go @@ -1,9 +1,5 @@ package dataproviders -import ( - "github.com/rsksmart/liquidity-provider-server/internal/entities" -) - type Configuration struct { RskConfig RskConfig BtcConfig BitcoinConfig @@ -22,21 +18,8 @@ type BitcoinConfig struct { Confirmations map[int]uint16 } -type PeginConfig struct { - TimeForDeposit uint32 - CallTime uint32 - PenaltyFee *entities.Wei - CallFee *entities.Wei - MinTransactionValue *entities.Wei - MaxTransactionValue *entities.Wei -} +// This structures were kept just in case, right now all the parameters are manipulated through management API -type PegoutConfig struct { - TimeForDeposit uint32 - CallTime uint32 - PenaltyFee *entities.Wei - CallFee *entities.Wei - MinTransactionValue *entities.Wei - MaxTransactionValue *entities.Wei - ExpireBlocks uint32 -} +type PeginConfig struct{} + +type PegoutConfig struct{} diff --git a/internal/adapters/dataproviders/database/mongo/liquidity_provider.go b/internal/adapters/dataproviders/database/mongo/liquidity_provider.go new file mode 100644 index 00000000..1056d7fb --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/liquidity_provider.go @@ -0,0 +1,119 @@ +package mongo + +import ( + "context" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +const liquidityProviderCollection = "liquidityProvider" + +type configurationName string + +const ( + peginConfigId configurationName = "pegin" + pegoutConfigId configurationName = "pegout" + generalConfigId configurationName = "general" +) + +type lpMongoRepository struct { + conn *Connection +} + +type storedConfiguration[C liquidity_provider.ConfigurationType] struct { + entities.Signed[C] `bson:",inline"` + Name configurationName `json:"name" bson:"name"` +} + +func NewLiquidityProviderRepository(conn *Connection) liquidity_provider.LiquidityProviderRepository { + return &lpMongoRepository{conn: conn} +} + +func (repo *lpMongoRepository) GetPeginConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.PeginConfiguration], error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + return getConfiguration[liquidity_provider.PeginConfiguration](dbCtx, repo, peginConfigId) +} + +func (repo *lpMongoRepository) GetPegoutConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.PegoutConfiguration], error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + return getConfiguration[liquidity_provider.PegoutConfiguration](dbCtx, repo, pegoutConfigId) +} + +func (repo *lpMongoRepository) GetGeneralConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.GeneralConfiguration], error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + return getConfiguration[liquidity_provider.GeneralConfiguration](dbCtx, repo, generalConfigId) +} + +func (repo *lpMongoRepository) UpsertPeginConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.PeginConfiguration]) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + configToStore := storedConfiguration[liquidity_provider.PeginConfiguration]{ + Signed: signedConfig, + Name: peginConfigId, + } + return upsertConfiguration(dbCtx, repo, configToStore) +} + +func (repo *lpMongoRepository) UpsertPegoutConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.PegoutConfiguration]) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + configToStore := storedConfiguration[liquidity_provider.PegoutConfiguration]{ + Signed: signedConfig, + Name: pegoutConfigId, + } + return upsertConfiguration(dbCtx, repo, configToStore) +} + +func (repo *lpMongoRepository) UpsertGeneralConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.GeneralConfiguration]) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + configToStore := storedConfiguration[liquidity_provider.GeneralConfiguration]{ + Signed: signedConfig, + Name: generalConfigId, + } + return upsertConfiguration(dbCtx, repo, configToStore) +} + +func upsertConfiguration[C liquidity_provider.ConfigurationType]( + ctx context.Context, + repo *lpMongoRepository, + config storedConfiguration[C], +) error { + collection := repo.conn.Collection(liquidityProviderCollection) + options := options.Replace().SetUpsert(true) + filter := bson.D{primitive.E{Key: "name", Value: config.Name}} + _, err := collection.ReplaceOne(ctx, filter, config, options) + if err != nil { + return err + } else { + logDbInteraction(insert, config) + return nil + } +} + +func getConfiguration[C liquidity_provider.ConfigurationType]( + ctx context.Context, + repo *lpMongoRepository, + name configurationName, +) (*entities.Signed[C], error) { + config := &storedConfiguration[C]{} + collection := repo.conn.Collection(liquidityProviderCollection) + filter := bson.D{primitive.E{Key: "name", Value: name}} + + err := collection.FindOne(ctx, filter).Decode(config) + if errors.Is(err, mongo.ErrNoDocuments) { + return nil, nil + } else if err != nil { + return nil, err + } + logDbInteraction(read, config.Signed) + return &config.Signed, nil +} diff --git a/internal/adapters/dataproviders/liquidity_provider.go b/internal/adapters/dataproviders/liquidity_provider.go index e52fed7d..ba69de88 100644 --- a/internal/adapters/dataproviders/liquidity_provider.go +++ b/internal/adapters/dataproviders/liquidity_provider.go @@ -4,21 +4,23 @@ import ( "bytes" "context" "encoding/hex" + "errors" "fmt" "github.com/ethereum/go-ethereum/crypto" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" - "slices" ) type LocalLiquidityProvider struct { env *Configuration peginRepository quote.PeginQuoteRepository pegoutRepository quote.PegoutQuoteRepository + lpRepository liquidity_provider.LiquidityProviderRepository rsk blockchain.RootstockRpcServer signer rootstock.TransactionSigner btc blockchain.BitcoinWallet @@ -29,6 +31,7 @@ func NewLocalLiquidityProvider( env *Configuration, peginRepository quote.PeginQuoteRepository, pegoutRepository quote.PegoutQuoteRepository, + lpRepository liquidity_provider.LiquidityProviderRepository, rsk blockchain.RootstockRpcServer, signer rootstock.TransactionSigner, btc blockchain.BitcoinWallet, @@ -38,6 +41,7 @@ func NewLocalLiquidityProvider( env: env, peginRepository: peginRepository, pegoutRepository: pegoutRepository, + lpRepository: lpRepository, rsk: rsk, signer: signer, btc: btc, @@ -71,30 +75,6 @@ func (lp *LocalLiquidityProvider) SignQuote(quoteHash string) (string, error) { return hex.EncodeToString(signatureBytes), nil } -func (lp *LocalLiquidityProvider) ValidateAmountForPegout(amount *entities.Wei) error { - if amount.Cmp(lp.MaxPegout()) <= 0 && amount.Cmp(lp.MinPegout()) >= 0 { - return nil - } else { - return fmt.Errorf("%w [%v, %v]", usecases.AmountOutOfRangeError, lp.MinPegout(), lp.MaxPegout()) - } -} - -func (lp *LocalLiquidityProvider) GetRootstockConfirmationsForValue(value *entities.Wei) uint16 { - values := make([]int, 0) - for key := range lp.env.RskConfig.Confirmations { - values = append(values, key) - } - slices.Sort(values) - index := slices.IndexFunc(values, func(item int) bool { - return int(value.AsBigInt().Int64()) < item - }) - if index == -1 { - return lp.env.RskConfig.Confirmations[values[len(values)-1]] - } else { - return lp.env.RskConfig.Confirmations[values[index]] - } -} - func (lp *LocalLiquidityProvider) HasPegoutLiquidity(ctx context.Context, requiredLiquidity *entities.Wei) error { lockedLiquidity := new(entities.Wei) log.Debug("Verifying if has liquidity") @@ -124,66 +104,6 @@ func (lp *LocalLiquidityProvider) HasPegoutLiquidity(ctx context.Context, requir } } -func (lp *LocalLiquidityProvider) CallFeePegout() *entities.Wei { - return lp.env.PegoutConfig.CallFee -} - -func (lp *LocalLiquidityProvider) PenaltyFeePegout() *entities.Wei { - return lp.env.PegoutConfig.PenaltyFee -} - -func (lp *LocalLiquidityProvider) TimeForDepositPegout() uint32 { - return lp.env.PegoutConfig.TimeForDeposit -} - -func (lp *LocalLiquidityProvider) ExpireBlocksPegout() uint64 { - return uint64(lp.env.PegoutConfig.ExpireBlocks) -} - -func (lp *LocalLiquidityProvider) MaxPegout() *entities.Wei { - return lp.env.PegoutConfig.MaxTransactionValue -} - -func (lp *LocalLiquidityProvider) MinPegout() *entities.Wei { - return lp.env.PegoutConfig.MinTransactionValue -} - -func (lp *LocalLiquidityProvider) MaxPegoutConfirmations() uint16 { - // TODO replace in go 1.22 with - // return slices.Max(maps.Values(lp.env.RskConfig.Confirmations)) - var maxValue uint16 - for _, value := range lp.env.RskConfig.Confirmations { - if maxValue < value { - maxValue = value - } - } - return maxValue -} - -func (lp *LocalLiquidityProvider) ValidateAmountForPegin(amount *entities.Wei) error { - if amount.Cmp(lp.MaxPegin()) <= 0 && amount.Cmp(lp.MinPegin()) >= 0 { - return nil - } else { - return fmt.Errorf("%w [%v, %v]", usecases.AmountOutOfRangeError, lp.MinPegin(), lp.MaxPegin()) - } -} - -func (lp *LocalLiquidityProvider) GetBitcoinConfirmationsForValue(value *entities.Wei) uint16 { - values := make([]int, 0) - for key := range lp.env.BtcConfig.Confirmations { - values = append(values, key) - } - slices.Sort(values) - index := slices.IndexFunc(values, func(item int) bool { - return int(value.AsBigInt().Int64()) < item - }) - if index == -1 { - return lp.env.BtcConfig.Confirmations[values[len(values)-1]] - } else { - return lp.env.BtcConfig.Confirmations[values[index]] - } -} - func (lp *LocalLiquidityProvider) HasPeginLiquidity(ctx context.Context, requiredLiquidity *entities.Wei) error { liquidity := new(entities.Wei) lockedLiquidity := new(entities.Wei) @@ -218,38 +138,57 @@ func (lp *LocalLiquidityProvider) HasPeginLiquidity(ctx context.Context, require } } -func (lp *LocalLiquidityProvider) CallTime() uint32 { - return lp.env.PeginConfig.CallTime -} - -func (lp *LocalLiquidityProvider) CallFeePegin() *entities.Wei { - return lp.env.PeginConfig.CallFee -} - -func (lp *LocalLiquidityProvider) PenaltyFeePegin() *entities.Wei { - return lp.env.PeginConfig.PenaltyFee -} - -func (lp *LocalLiquidityProvider) TimeForDepositPegin() uint32 { - return lp.env.PeginConfig.TimeForDeposit +func (lp *LocalLiquidityProvider) GeneralConfiguration(ctx context.Context) liquidity_provider.GeneralConfiguration { + configuration, err := validateConfiguration("general", lp, func() (*entities.Signed[liquidity_provider.GeneralConfiguration], error) { + return lp.lpRepository.GetGeneralConfiguration(ctx) + }) + if err != nil { + return liquidity_provider.DefaultGeneralConfiguration() + } + return configuration.Value } -func (lp *LocalLiquidityProvider) MaxPegin() *entities.Wei { - return lp.env.PeginConfig.MaxTransactionValue +func (lp *LocalLiquidityProvider) PegoutConfiguration(ctx context.Context) liquidity_provider.PegoutConfiguration { + configuration, err := validateConfiguration("pegout", lp, func() (*entities.Signed[liquidity_provider.PegoutConfiguration], error) { + return lp.lpRepository.GetPegoutConfiguration(ctx) + }) + if err != nil { + return liquidity_provider.DefaultPegoutConfiguration() + } + return configuration.Value } -func (lp *LocalLiquidityProvider) MinPegin() *entities.Wei { - return lp.env.PeginConfig.MinTransactionValue +func (lp *LocalLiquidityProvider) PeginConfiguration(ctx context.Context) liquidity_provider.PeginConfiguration { + configuration, err := validateConfiguration("pegin", lp, func() (*entities.Signed[liquidity_provider.PeginConfiguration], error) { + return lp.lpRepository.GetPeginConfiguration(ctx) + }) + if err != nil { + return liquidity_provider.DefaultPeginConfiguration() + } + return configuration.Value } -func (lp *LocalLiquidityProvider) MaxPeginConfirmations() uint16 { - // TODO replace in go 1.22 with - // return slices.Max(maps.Values(lp.env.BtcConfig.Confirmations)) - var maxValue uint16 - for _, value := range lp.env.BtcConfig.Confirmations { - if maxValue < value { - maxValue = value - } - } - return maxValue +func validateConfiguration[T liquidity_provider.ConfigurationType]( + displayName string, + lp *LocalLiquidityProvider, + readFunction func() (*entities.Signed[T], error), +) (*entities.Signed[T], error) { + configuration, err := readFunction() + if err != nil { + log.Errorf("Error getting %s configuration, using default configuration. Error: %v", displayName, err) + return nil, err + } + if configuration == nil { + log.Warnf("Custom %s configuration not found. Using default configuration.", displayName) + return nil, errors.New("configuration not found") + } + if err = configuration.CheckIntegrity(crypto.Keccak256); err != nil { + log.Errorf("Tampered %s configuration. Using default configuration. Error: %v", displayName, err) + return nil, err + } + if !lp.signer.Validate(configuration.Signature, configuration.Hash) { + log.Errorf("Invalid %s configuration signature. Using default configuration.", displayName) + return nil, errors.New("invalid signature") + } + return configuration, nil } diff --git a/internal/adapters/dataproviders/rootstock/common.go b/internal/adapters/dataproviders/rootstock/common.go index 068dfd24..1653e084 100644 --- a/internal/adapters/dataproviders/rootstock/common.go +++ b/internal/adapters/dataproviders/rootstock/common.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" geth "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" log "github.com/sirupsen/logrus" "time" @@ -52,9 +53,9 @@ func (c *RskClient) CheckConnection(ctx context.Context) bool { } type TransactionSigner interface { + entities.Signer Address() common.Address Sign(common.Address, *types.Transaction) (*types.Transaction, error) - SignBytes(msg []byte) ([]byte, error) } func ParseAddress(address *common.Address, textAddress string) error { diff --git a/internal/adapters/dataproviders/rootstock/lbc.go b/internal/adapters/dataproviders/rootstock/lbc.go index 368494fb..5d503783 100644 --- a/internal/adapters/dataproviders/rootstock/lbc.go +++ b/internal/adapters/dataproviders/rootstock/lbc.go @@ -13,6 +13,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" log "github.com/sirupsen/logrus" "math/big" @@ -83,9 +84,9 @@ func (lbc *liquidityBridgeContractImpl) HashPegoutQuote(pegoutQuote quote.Pegout return hex.EncodeToString(results[:]), nil } -func (lbc *liquidityBridgeContractImpl) GetProviders() ([]entities.RegisteredLiquidityProvider, error) { +func (lbc *liquidityBridgeContractImpl) GetProviders() ([]liquidity_provider.RegisteredLiquidityProvider, error) { var i, maxProviderId int64 - var providerType entities.ProviderType + var providerType liquidity_provider.ProviderType var providers []bindings.LiquidityBridgeContractLiquidityProvider var provider bindings.LiquidityBridgeContractLiquidityProvider @@ -110,14 +111,14 @@ func (lbc *liquidityBridgeContractImpl) GetProviders() ([]entities.RegisteredLiq if err != nil { return nil, err } - parsedProviders := make([]entities.RegisteredLiquidityProvider, 0) + parsedProviders := make([]liquidity_provider.RegisteredLiquidityProvider, 0) for i = 0; i < maxProviderId+1; i++ { provider = providers[i] - providerType = entities.ProviderType(provider.ProviderType) + providerType = liquidity_provider.ProviderType(provider.ProviderType) if !providerType.IsValid() { - return nil, entities.InvalidProviderTypeError + return nil, liquidity_provider.InvalidProviderTypeError } - parsedProviders = append(parsedProviders, entities.RegisteredLiquidityProvider{ + parsedProviders = append(parsedProviders, liquidity_provider.RegisteredLiquidityProvider{ Id: provider.Id.Uint64(), Address: provider.Provider.String(), Name: provider.Name, @@ -473,9 +474,9 @@ func (lbc *liquidityBridgeContractImpl) GetDepositEvents(ctx context.Context, fr return result, nil } -func (lbc *liquidityBridgeContractImpl) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]entities.PunishmentEvent, error) { +func (lbc *liquidityBridgeContractImpl) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]liquidity_provider.PunishmentEvent, error) { var lbcEvent *bindings.LiquidityBridgeContractPenalized - result := make([]entities.PunishmentEvent, 0) + result := make([]liquidity_provider.PunishmentEvent, 0) iterator, err := lbc.contract.FilterPenalized(&bind.FilterOpts{ Start: fromBlock, @@ -495,7 +496,7 @@ func (lbc *liquidityBridgeContractImpl) GetPeginPunishmentEvents(ctx context.Con for iterator.Next() { lbcEvent = iterator.Event - result = append(result, entities.PunishmentEvent{ + result = append(result, liquidity_provider.PunishmentEvent{ LiquidityProvider: lbcEvent.LiquidityProvider.String(), Penalty: entities.NewBigWei(lbcEvent.Penalty), QuoteHash: hex.EncodeToString(lbcEvent.QuoteHash[:]), diff --git a/internal/adapters/dataproviders/rootstock/wallet.go b/internal/adapters/dataproviders/rootstock/wallet.go index f141ff66..2cbe3b0e 100644 --- a/internal/adapters/dataproviders/rootstock/wallet.go +++ b/internal/adapters/dataproviders/rootstock/wallet.go @@ -3,10 +3,12 @@ package rootstock import ( "bytes" "context" + "encoding/hex" "errors" "fmt" "github.com/ethereum/go-ethereum/common" geth "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" log "github.com/sirupsen/logrus" @@ -40,6 +42,26 @@ func (wallet *RskWalletImpl) SignBytes(msg []byte) ([]byte, error) { return wallet.account.Keystore.SignHash(*wallet.account.Account, msg) } +func (wallet *RskWalletImpl) Validate(signature, hash string) bool { + signatureBytes, err := hex.DecodeString(signature) + if err != nil { + log.Error("Error decoding signature: ", err) + return false + } + hashBytes, err := hex.DecodeString(hash) + if err != nil { + log.Error("Error decoding hash: ", err) + return false + } + pubKey, err := crypto.Ecrecover(hashBytes, signatureBytes) + if err != nil { + log.Error("Error recovering public key: ", err) + return false + } + pubKeyHash := crypto.Keccak256Hash(pubKey[1:]) + return bytes.Equal(wallet.account.Account.Address.Bytes(), pubKeyHash[12:]) // the last 20 bytes of the hash +} + func (wallet *RskWalletImpl) SendRbtc(ctx context.Context, config blockchain.TransactionConfig, toAddress string) (string, error) { var to common.Address var signedTx *geth.Transaction diff --git a/internal/adapters/entrypoints/rest/handlers/get_configuration.go b/internal/adapters/entrypoints/rest/handlers/get_configuration.go new file mode 100644 index 00000000..485f8050 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/get_configuration.go @@ -0,0 +1,19 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "net/http" +) + +// NewGetConfigurationHandler +// @Title Get configurations +// @Description Get all the configurations for the liquidity provider. Included in the management API. +// @Success 200 object +// @Route /configuration [get] +func NewGetConfigurationHandler(useCase *liquidity_provider.GetConfigUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + result := useCase.Run(req.Context()) + rest.JsonResponseWithBody(w, http.StatusOK, &result) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go index 634fa5e6..13dcbeb0 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegin_quote.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/pkg" @@ -48,7 +49,7 @@ func NewGetPeginQuoteHandler(useCase *pegin.GetQuoteUseCase) http.HandlerFunc { errors.Is(err, blockchain.BtcAddressInvalidNetworkError) || errors.Is(err, usecases.RskAddressNotSupportedError) || errors.Is(err, usecases.TxBelowMinimumError) || - errors.Is(err, usecases.AmountOutOfRangeError) { + errors.Is(err, liquidity_provider.AmountOutOfRangeError) { jsonErr := rest.NewErrorResponseWithDetails("invalid request", rest.DetailsFromError(err), true) rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) return diff --git a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go index 750879cb..3bb4aa8f 100644 --- a/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go +++ b/internal/adapters/entrypoints/rest/handlers/get_pegout_quote.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/pkg" @@ -40,7 +41,7 @@ func NewGetPegoutQuoteHandler(useCase *pegout.GetQuoteUseCase) http.HandlerFunc errors.Is(err, blockchain.BtcAddressInvalidNetworkError) || errors.Is(err, usecases.RskAddressNotSupportedError) || errors.Is(err, usecases.TxBelowMinimumError) || - errors.Is(err, usecases.AmountOutOfRangeError) { + errors.Is(err, liquidity_provider.AmountOutOfRangeError) { jsonErr := rest.NewErrorResponseWithDetails("invalid request", rest.DetailsFromError(err), true) rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) return diff --git a/internal/adapters/entrypoints/rest/handlers/provider_details.go b/internal/adapters/entrypoints/rest/handlers/provider_details.go index 64119630..fabc6ef4 100644 --- a/internal/adapters/entrypoints/rest/handlers/provider_details.go +++ b/internal/adapters/entrypoints/rest/handlers/provider_details.go @@ -14,7 +14,7 @@ import ( // @Route /providers/details [get] func NewProviderDetailsHandler(useCase *liquidity_provider.GetDetailUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { - result, err := useCase.Run() + result, err := useCase.Run(req.Context()) if err != nil { jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) diff --git a/internal/adapters/entrypoints/rest/handlers/set_general_config.go b/internal/adapters/entrypoints/rest/handlers/set_general_config.go new file mode 100644 index 00000000..6bd16b1e --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/set_general_config.go @@ -0,0 +1,35 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +// NewSetGeneralConfigHandler +// @Title Set General Config +// @Description Set general configurations of the server. Included in the management API. +// @Param GeneralConfigurationRequest body pkg.GeneralConfigurationRequest true "General parameters for the quote computation" +// @Success 204 object +// @Route /configuration [post] +func NewSetGeneralConfigHandler(useCase *liquidity_provider.SetGeneralConfigUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := &pkg.GeneralConfigurationRequest{} + if err = rest.DecodeRequest(w, req, request); err != nil { + return + } else if err = rest.ValidateRequest(w, request); err != nil { + return + } + + err = useCase.Run(req.Context(), *request.Configuration) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } else { + rest.JsonResponse(w, http.StatusNoContent) + } + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/set_pegin_config.go b/internal/adapters/entrypoints/rest/handlers/set_pegin_config.go new file mode 100644 index 00000000..9fb4065f --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/set_pegin_config.go @@ -0,0 +1,35 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +// NewSetPeginConfigHandler +// @Title Set Pegin Config +// @Description Set the configuration for the Pegin service. Included in the management API. +// @Param PeginConfigurationRequest body pkg.PeginConfigurationRequest true "Specification of the thresholds for the PegIn service" +// @Success 204 object +// @Route /pegin/configuration [post] +func NewSetPeginConfigHandler(useCase *liquidity_provider.SetPeginConfigUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := &pkg.PeginConfigurationRequest{} + if err = rest.DecodeRequest(w, req, request); err != nil { + return + } else if err = rest.ValidateRequest(w, request); err != nil { + return + } + + err = useCase.Run(req.Context(), *request.Configuration) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } else { + rest.JsonResponse(w, http.StatusNoContent) + } + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/set_pegout_config.go b/internal/adapters/entrypoints/rest/handlers/set_pegout_config.go new file mode 100644 index 00000000..02f4bb2a --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/set_pegout_config.go @@ -0,0 +1,35 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +// NewSetPegoutConfigHandler +// @Title Set Pegout Config +// @Description Set the configuration for the Pegout service. Included in the management API. +// @Param PegoutConfigurationRequest body pkg.PegoutConfigurationRequest true "Specification of the thresholds for the PegOut service" +// @Success 204 object +// @Route /pegout/configuration [post] +func NewSetPegoutConfigHandler(useCase *liquidity_provider.SetPegoutConfigUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := &pkg.PegoutConfigurationRequest{} + if err = rest.DecodeRequest(w, req, request); err != nil { + return + } else if err = rest.ValidateRequest(w, request); err != nil { + return + } + + err = useCase.Run(req.Context(), *request.Configuration) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unknown error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } else { + rest.JsonResponse(w, http.StatusNoContent) + } + } +} diff --git a/internal/adapters/entrypoints/rest/registry/registry.go b/internal/adapters/entrypoints/rest/registry/registry.go index 74340a38..6e8032e4 100644 --- a/internal/adapters/entrypoints/rest/registry/registry.go +++ b/internal/adapters/entrypoints/rest/registry/registry.go @@ -24,4 +24,8 @@ type UseCaseRegistry interface { ChangeStatusUseCase() *liquidity_provider.ChangeStatusUseCase AddPeginCollateralUseCase() *pegin.AddCollateralUseCase AddPegoutCollateralUseCase() *pegout.AddCollateralUseCase + SetPeginConfigUseCase() *liquidity_provider.SetPeginConfigUseCase + SetPegoutConfigUseCase() *liquidity_provider.SetPegoutConfigUseCase + SetGeneralConfigUseCase() *liquidity_provider.SetGeneralConfigUseCase + GetConfigurationUseCase() *liquidity_provider.GetConfigUseCase } diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go index 53255f12..31e1a8f8 100644 --- a/internal/adapters/entrypoints/rest/routes/routes.go +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -53,6 +53,14 @@ func ConfigureRoutes(router *mux.Router, env environment.Environment, useCaseReg HandlerFunc(handlers.NewChangeStatusHandler(useCaseRegistry.ChangeStatusUseCase())) router.Path("/providers/resignation").Methods(http.MethodPost). HandlerFunc(handlers.NewResignationHandler(useCaseRegistry.ResignationUseCase())) + router.Path("/configuration").Methods(http.MethodPost). + HandlerFunc(handlers.NewSetGeneralConfigHandler(useCaseRegistry.SetGeneralConfigUseCase())) + router.Path("/configuration").Methods(http.MethodGet). + HandlerFunc(handlers.NewGetConfigurationHandler(useCaseRegistry.GetConfigurationUseCase())) + router.Path("/pegin/configuration").Methods(http.MethodPost). + HandlerFunc(handlers.NewSetPeginConfigHandler(useCaseRegistry.SetPeginConfigUseCase())) + router.Path("/pegout/configuration").Methods(http.MethodPost). + HandlerFunc(handlers.NewSetPegoutConfigHandler(useCaseRegistry.SetPegoutConfigUseCase())) } router.Methods(http.MethodOptions).HandlerFunc(handlers.NewOptionsHandler()) diff --git a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go index 9aad0cee..34f6f3f7 100644 --- a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" @@ -20,7 +21,7 @@ type PegoutRskDepositWatcher struct { sendPegoutUseCase *pegout.SendPegoutUseCase updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase - pegoutLp entities.PegoutLiquidityProvider + pegoutLp liquidity_provider.PegoutLiquidityProvider rskRpc blockchain.RootstockRpcServer lbc blockchain.LiquidityBridgeContract ticker *time.Ticker @@ -36,7 +37,7 @@ func NewPegoutRskDepositWatcher( sendPegoutUseCase *pegout.SendPegoutUseCase, updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase, initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase, - pegoutLp entities.PegoutLiquidityProvider, + pegoutLp liquidity_provider.PegoutLiquidityProvider, rskRpc blockchain.RootstockRpcServer, lbc blockchain.LiquidityBridgeContract, eventBus entities.EventBus, @@ -76,8 +77,9 @@ func (watcher *PegoutRskDepositWatcher) Prepare(ctx context.Context) error { if err != nil { return err } + pegoutConfig := watcher.pegoutLp.PegoutConfiguration(ctx) for _, watchedQuote := range watchedQuotes { - quoteCreationBlock = quote.GetCreationBlock(watcher.pegoutLp, watchedQuote.PegoutQuote) + quoteCreationBlock = quote.GetCreationBlock(pegoutConfig, watchedQuote.PegoutQuote) if watcher.currentBlock == 0 || watcher.currentBlock > quoteCreationBlock { watcher.currentBlock = quoteCreationBlock } diff --git a/internal/configuration/environment/configuration.go b/internal/configuration/environment/configuration.go index 467652d5..6e1197eb 100644 --- a/internal/configuration/environment/configuration.go +++ b/internal/configuration/environment/configuration.go @@ -5,30 +5,13 @@ import "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataprov func ConfigurationFromEnv(env Environment) *dataproviders.Configuration { return &dataproviders.Configuration{ RskConfig: dataproviders.RskConfig{ - ChainId: env.Rsk.ChainId, - Account: uint64(env.Rsk.AccountNumber), - Confirmations: env.Rsk.Confirmations, + ChainId: env.Rsk.ChainId, + Account: uint64(env.Rsk.AccountNumber), }, BtcConfig: dataproviders.BitcoinConfig{ - BtcAddress: env.Provider.BtcAddress, - Confirmations: env.Btc.Confirmations, - }, - PeginConfig: dataproviders.PeginConfig{ - TimeForDeposit: env.Pegin.TimeForDeposit, - CallTime: env.Pegin.CallTime, - PenaltyFee: env.Pegin.PenaltyFee, - CallFee: env.Pegin.CallFee, - MinTransactionValue: env.Pegin.MinTransactionValue, - MaxTransactionValue: env.Pegin.MaxTransactionValue, - }, - PegoutConfig: dataproviders.PegoutConfig{ - TimeForDeposit: env.Pegout.TimeForDeposit, - CallTime: env.Pegout.CallTime, - PenaltyFee: env.Pegout.PenaltyFee, - CallFee: env.Pegout.CallFee, - MinTransactionValue: env.Pegout.MinTransactionValue, - MaxTransactionValue: env.Pegout.MaxTransactionValue, - ExpireBlocks: env.Pegout.ExpireBlocks, + BtcAddress: env.Provider.BtcAddress, }, + PeginConfig: dataproviders.PeginConfig{}, + PegoutConfig: dataproviders.PegoutConfig{}, } } diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index bfd997dd..ce43df9f 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -2,7 +2,7 @@ package environment import ( "github.com/go-playground/validator/v10" - "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" log "github.com/sirupsen/logrus" ) @@ -30,58 +30,43 @@ type MongoEnv struct { } type RskEnv struct { - Endpoint string `env:"RSK_ENDPOINT" validate:"required"` - ChainId uint64 `env:"CHAIN_ID" validate:"required"` - LbcAddress string `env:"LBC_ADDR" validate:"required"` - BridgeAddress string `env:"RSK_BRIDGE_ADDR" validate:"required"` - BridgeRequiredConfirmations uint64 `env:"RSK_REQUIRED_BRIDGE_CONFIRMATIONS" validate:"required"` - IrisActivationHeight int64 `env:"IRIS_ACTIVATION_HEIGHT" validate:"required"` - ErpKeys []string `env:"ERP_KEYS" validate:"required"` - AccountNumber int `env:"ACCOUNT_NUM"` // no validation because 0 works fine - FeeCollectorAddress string `env:"DAO_FEE_COLLECTOR_ADDRESS" validate:"required"` - EncryptedJsonSecret string `env:"KEY_SECRET" validate:"required"` - EncryptedJsonPasswordSecret string `env:"PASSWORD_SECRET" validate:"required"` - Confirmations map[int]uint16 `env:"RSK_CONFIRMATIONS" validate:"required"` + Endpoint string `env:"RSK_ENDPOINT" validate:"required"` + ChainId uint64 `env:"CHAIN_ID" validate:"required"` + LbcAddress string `env:"LBC_ADDR" validate:"required"` + BridgeAddress string `env:"RSK_BRIDGE_ADDR" validate:"required"` + BridgeRequiredConfirmations uint64 `env:"RSK_REQUIRED_BRIDGE_CONFIRMATIONS" validate:"required"` + IrisActivationHeight int64 `env:"IRIS_ACTIVATION_HEIGHT" validate:"required"` + ErpKeys []string `env:"ERP_KEYS" validate:"required"` + AccountNumber int `env:"ACCOUNT_NUM"` // no validation because 0 works fine + FeeCollectorAddress string `env:"DAO_FEE_COLLECTOR_ADDRESS" validate:"required"` + EncryptedJsonSecret string `env:"KEY_SECRET" validate:"required"` + EncryptedJsonPasswordSecret string `env:"PASSWORD_SECRET" validate:"required"` } type BtcEnv struct { - Network string `env:"BTC_NETWORK" validate:"required"` - Username string `env:"BTC_USERNAME" validate:"required"` - Password string `env:"BTC_PASSWORD" validate:"required"` - Endpoint string `env:"BTC_ENDPOINT" validate:"required"` - FixedTxFeeRate float64 `env:"BTC_TX_FEE_RATE" validate:"required"` - WalletEncrypted bool `env:"BTC_ENCRYPTED_WALLET" validate:"required"` - WalletPasswordSecret string `env:"BTC_WALLET_PASSWORD"` - Confirmations map[int]uint16 `env:"BTC_CONFIRMATIONS" validate:"required"` + Network string `env:"BTC_NETWORK" validate:"required"` + Username string `env:"BTC_USERNAME" validate:"required"` + Password string `env:"BTC_PASSWORD" validate:"required"` + Endpoint string `env:"BTC_ENDPOINT" validate:"required"` + FixedTxFeeRate float64 `env:"BTC_TX_FEE_RATE" validate:"required"` + WalletEncrypted bool `env:"BTC_ENCRYPTED_WALLET" validate:"required"` + WalletPasswordSecret string `env:"BTC_WALLET_PASSWORD"` } type ProviderEnv struct { - AlertSenderEmail string `env:"ALERT_SENDER_EMAIL" validate:"required"` - AlertRecipientEmail string `env:"ALERT_RECIPIENT_EMAIL" validate:"required"` - BtcAddress string `env:"BTC_ADDR" validate:"required"` - Name string `env:"PROVIDER_NAME" validate:"required"` - ApiBaseUrl string `env:"BASE_URL" validate:"required"` - ProviderType entities.ProviderType `env:"PROVIDER_TYPE" validate:"required,oneof=pegin pegout both"` + AlertSenderEmail string `env:"ALERT_SENDER_EMAIL" validate:"required"` + AlertRecipientEmail string `env:"ALERT_RECIPIENT_EMAIL" validate:"required"` + BtcAddress string `env:"BTC_ADDR" validate:"required"` + Name string `env:"PROVIDER_NAME" validate:"required"` + ApiBaseUrl string `env:"BASE_URL" validate:"required"` + ProviderType liquidity_provider.ProviderType `env:"PROVIDER_TYPE" validate:"required,oneof=pegin pegout both"` } -type PeginEnv struct { - TimeForDeposit uint32 `env:"PEGIN_TIME_FOR_DEPOSIT" validate:"required"` - CallTime uint32 `env:"PEGIN_CALL_TIME" validate:"required"` - PenaltyFee *entities.Wei `env:"PEGIN_PENALTY_FEE" validate:"required"` - CallFee *entities.Wei `env:"PEGIN_FEE" validate:"required"` - MinTransactionValue *entities.Wei `env:"PEGIN_MIN_TRANSACTION_VALUE" validate:"required"` - MaxTransactionValue *entities.Wei `env:"PEGIN_MAX_TRANSACTION_VALUE" validate:"required"` -} +// PeginEnv This structure was kept just in case, right now all the parameters are manipulated through management API +type PeginEnv struct{} type PegoutEnv struct { - TimeForDeposit uint32 `env:"PEGOUT_TIME_FOR_DEPOSIT" validate:"required"` - CallTime uint32 `env:"PEGOUT_CALL_TIME" validate:"required"` - PenaltyFee *entities.Wei `env:"PEGOUT_PENALTY_FEE" validate:"required"` - CallFee *entities.Wei `env:"PEGOUT_FEE" validate:"required"` - MinTransactionValue *entities.Wei `env:"PEGOUT_MIN_TRANSACTION_VALUE" validate:"required"` - MaxTransactionValue *entities.Wei `env:"PEGOUT_MAX_TRANSACTION_VALUE" validate:"required"` - ExpireBlocks uint32 `env:"PEGOUT_EXPIRE_BLOCKS" validate:"required"` - DepositCacheStartBlock uint64 `env:"PEGOUT_DEPOSIT_CACHE_START_BLOCK"` + DepositCacheStartBlock uint64 `env:"PEGOUT_DEPOSIT_CACHE_START_BLOCK"` } type CaptchaEnv struct { diff --git a/internal/configuration/registry/database.go b/internal/configuration/registry/database.go index db5eb009..049d949a 100644 --- a/internal/configuration/registry/database.go +++ b/internal/configuration/registry/database.go @@ -2,19 +2,22 @@ package registry import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" ) type Database struct { - PeginRepository quote.PeginQuoteRepository - PegoutRepository quote.PegoutQuoteRepository - Connection *mongo.Connection + PeginRepository quote.PeginQuoteRepository + PegoutRepository quote.PegoutQuoteRepository + LiquidityProviderRepository liquidity_provider.LiquidityProviderRepository + Connection *mongo.Connection } func NewDatabaseRegistry(connection *mongo.Connection) *Database { return &Database{ - PeginRepository: mongo.NewPeginMongoRepository(connection), - PegoutRepository: mongo.NewPegoutMongoRepository(connection), - Connection: connection, + PeginRepository: mongo.NewPeginMongoRepository(connection), + PegoutRepository: mongo.NewPegoutMongoRepository(connection), + LiquidityProviderRepository: mongo.NewLiquidityProviderRepository(connection), + Connection: connection, } } diff --git a/internal/configuration/registry/liquidity_provider.go b/internal/configuration/registry/liquidity_provider.go index b0bedf85..f000c84c 100644 --- a/internal/configuration/registry/liquidity_provider.go +++ b/internal/configuration/registry/liquidity_provider.go @@ -12,6 +12,7 @@ func NewLiquidityProvider( config, databaseRegistry.PeginRepository, databaseRegistry.PegoutRepository, + databaseRegistry.LiquidityProviderRepository, rskRegistry.RpcServer, rskRegistry.Wallet, btcRegistry.Wallet, diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 57c5d759..1242716c 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -1,6 +1,7 @@ package registry import ( + "github.com/ethereum/go-ethereum/crypto" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" "github.com/rsksmart/liquidity-provider-server/internal/entities" @@ -42,6 +43,10 @@ type UseCaseRegistry struct { changeStatusUseCase *liquidity_provider.ChangeStatusUseCase addPeginCollateralUseCase *pegin.AddCollateralUseCase addPegoutCollateralUseCase *pegout.AddCollateralUseCase + setPeginConfigUseCase *liquidity_provider.SetPeginConfigUseCase + setPegoutConfigUseCase *liquidity_provider.SetPegoutConfigUseCase + setGeneralConfigUseCase *liquidity_provider.SetGeneralConfigUseCase + getConfigurationUseCase *liquidity_provider.GetConfigUseCase } // NewUseCaseRegistry @@ -109,6 +114,7 @@ func NewUseCaseRegistry( env.Captcha.SiteKey, liquidityProvider, liquidityProvider, + liquidityProvider, ), getWatchedPegoutQuoteUseCase: watcher.NewGetWatchedPegoutQuoteUseCase( databaseRegistry.PegoutRepository, @@ -179,6 +185,22 @@ func NewUseCaseRegistry( withdrawPeginCollateralUseCase: pegin.NewWithdrawCollateralUseCase(rskRegistry.Lbc), withdrawPegoutCollateralUseCase: pegout.NewWithdrawCollateralUseCase(rskRegistry.Lbc), healthUseCase: usecases.NewHealthUseCase(rskRegistry.Client, btcRegistry.Connection, databaseRegistry.Connection), + setGeneralConfigUseCase: liquidity_provider.NewSetGeneralConfigUseCase( + databaseRegistry.LiquidityProviderRepository, + rskRegistry.Wallet, + crypto.Keccak256, + ), + setPeginConfigUseCase: liquidity_provider.NewSetPeginConfigUseCase( + databaseRegistry.LiquidityProviderRepository, + rskRegistry.Wallet, + crypto.Keccak256, + ), + setPegoutConfigUseCase: liquidity_provider.NewSetPegoutConfigUseCase( + databaseRegistry.LiquidityProviderRepository, + rskRegistry.Wallet, + crypto.Keccak256, + ), + getConfigurationUseCase: liquidity_provider.NewGetConfigUseCase(liquidityProvider, liquidityProvider, liquidityProvider), } } @@ -249,3 +271,19 @@ func (registry *UseCaseRegistry) AddPeginCollateralUseCase() *pegin.AddCollatera func (registry *UseCaseRegistry) AddPegoutCollateralUseCase() *pegout.AddCollateralUseCase { return registry.addPegoutCollateralUseCase } + +func (registry *UseCaseRegistry) SetPeginConfigUseCase() *liquidity_provider.SetPeginConfigUseCase { + return registry.setPeginConfigUseCase +} + +func (registry *UseCaseRegistry) SetPegoutConfigUseCase() *liquidity_provider.SetPegoutConfigUseCase { + return registry.setPegoutConfigUseCase +} + +func (registry *UseCaseRegistry) SetGeneralConfigUseCase() *liquidity_provider.SetGeneralConfigUseCase { + return registry.setGeneralConfigUseCase +} + +func (registry *UseCaseRegistry) GetConfigurationUseCase() *liquidity_provider.GetConfigUseCase { + return registry.getConfigurationUseCase +} diff --git a/internal/entities/blockchain/bitcoin_test.go b/internal/entities/blockchain/bitcoin_test.go index 5ad78db4..e03d6b2d 100644 --- a/internal/entities/blockchain/bitcoin_test.go +++ b/internal/entities/blockchain/bitcoin_test.go @@ -2,7 +2,7 @@ package blockchain_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" - blockchain "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "testing" diff --git a/internal/entities/blockchain/lbc.go b/internal/entities/blockchain/lbc.go index 1afbf0e1..93c6f9e4 100644 --- a/internal/entities/blockchain/lbc.go +++ b/internal/entities/blockchain/lbc.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "math/big" ) @@ -50,17 +51,17 @@ func (params RefundPegoutParams) String() string { } type ProviderRegistrationParams struct { - Name string `validate:"required"` - ApiBaseUrl string `validate:"required"` - Status bool `validate:"required"` - Type entities.ProviderType `validate:"required"` + Name string `validate:"required"` + ApiBaseUrl string `validate:"required"` + Status bool `validate:"required"` + Type liquidity_provider.ProviderType `validate:"required"` } func NewProviderRegistrationParams( name string, apiBaseUrl string, status bool, - providerType entities.ProviderType, + providerType liquidity_provider.ProviderType, ) ProviderRegistrationParams { return ProviderRegistrationParams{ Name: name, @@ -74,7 +75,7 @@ type LiquidityBridgeContract interface { GetAddress() string HashPeginQuote(peginQuote quote.PeginQuote) (string, error) HashPegoutQuote(pegoutQuote quote.PegoutQuote) (string, error) - GetProviders() ([]entities.RegisteredLiquidityProvider, error) + GetProviders() ([]liquidity_provider.RegisteredLiquidityProvider, error) ProviderResign() error SetProviderStatus(id uint64, newStatus bool) error GetCollateral(address string) (*entities.Wei, error) @@ -92,7 +93,7 @@ type LiquidityBridgeContract interface { IsOperationalPegout(address string) (bool, error) RegisterProvider(txConfig TransactionConfig, params ProviderRegistrationParams) (int64, error) GetDepositEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]quote.PegoutDeposit, error) - GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]entities.PunishmentEvent, error) + GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]liquidity_provider.PunishmentEvent, error) } type FeeCollector interface { diff --git a/internal/entities/blockchain/lbc_test.go b/internal/entities/blockchain/lbc_test.go index e95a7991..37a7e60d 100644 --- a/internal/entities/blockchain/lbc_test.go +++ b/internal/entities/blockchain/lbc_test.go @@ -3,6 +3,7 @@ package blockchain import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "math/big" "testing" @@ -37,15 +38,15 @@ func TestRegisterPeginParams_String(t *testing.T) { PartialMerkleTree: []byte{0x07, 0x08, 0x09}, BlockHeight: big.NewInt(1), Quote: quote.PeginQuote{ - FedBtcAddress: "any address", - LbcAddress: "any address", - LpRskAddress: "any address", - BtcRefundAddress: "any address", - RskRefundAddress: "any address", - LpBtcAddress: "any address", + FedBtcAddress: test.AnyAddress, + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(3), PenaltyFee: entities.NewWei(4), - ContractAddress: "any address", + ContractAddress: test.AnyAddress, Data: "any data", GasLimit: 5, Nonce: 6, diff --git a/internal/entities/common.go b/internal/entities/common.go index 82a46cd8..8cf58a0d 100644 --- a/internal/entities/common.go +++ b/internal/entities/common.go @@ -1,7 +1,10 @@ package entities import ( + "bytes" "context" + "encoding/hex" + "encoding/json" "errors" "github.com/go-playground/validator/v10" ) @@ -9,6 +12,7 @@ import ( var ( DeserializationError = errors.New("error during value deserialization") SerializationError = errors.New("error during value serialization") + IntegrityError = errors.New("error during value integrity check, stored hash doesn't match actual hash") validate = validator.New(validator.WithRequiredStructEnabled()) ) @@ -23,3 +27,32 @@ type Closeable interface { type Service interface { CheckConnection(ctx context.Context) bool } + +type HashFunction func(...[]byte) []byte + +type Signer interface { + SignBytes(msg []byte) ([]byte, error) + Validate(signature, hash string) bool +} + +type Signed[T any] struct { + Value T `bson:",inline"` + Signature string `json:"signature" bson:"signature"` + Hash string `json:"hash" bson:"hash"` +} + +func (signedValue Signed[T]) CheckIntegrity(hashFunction HashFunction) error { + valueBytes, err := json.Marshal(signedValue.Value) + if err != nil { + return err + } + hash := hashFunction(valueBytes) + storedHash, err := hex.DecodeString(signedValue.Hash) + if err != nil { + return err + } + if !bytes.Equal(hash, storedHash) { + return IntegrityError + } + return nil +} diff --git a/internal/entities/common_test.go b/internal/entities/common_test.go new file mode 100644 index 00000000..db134183 --- /dev/null +++ b/internal/entities/common_test.go @@ -0,0 +1,78 @@ +package entities_test + +import ( + "encoding/hex" + "encoding/json" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/stretchr/testify/require" + "math" + "testing" +) + +func TestSigned_CheckIntegrity(t *testing.T) { + peginConfig := liquidity_provider.PeginConfiguration{ + TimeForDeposit: 3600, + CallTime: 7200, + PenaltyFee: entities.NewUWei(1000000000000000), + CallFee: entities.NewUWei(10000000000000000), + MaxValue: entities.NewUWei(10000000000000000000), + MinValue: entities.NewUWei(600000000000000000), + } + pegoutConfig := liquidity_provider.PegoutConfiguration{ + TimeForDeposit: 3600, + CallTime: 7200, + PenaltyFee: entities.NewUWei(1000000000000000), + CallFee: entities.NewUWei(10000000000000000), + MaxValue: entities.NewUWei(10000000000000000000), + MinValue: entities.NewUWei(600000000000000000), + ExpireBlocks: 500, + } + generalConfig := liquidity_provider.GeneralConfiguration{ + RskConfirmations: map[int]uint16{ + 4000000000000000000: 400, + 8000000000000000000: 800, + 9000000000000000000: 801, + 100000000000000000: 41, + 2000000000000000000: 200, + 400000000000000000: 120, + }, + BtcConfirmations: map[int]uint16{ + 400000000000000000: 6, + 4000000000000000000: 20, + 8000000000000000000: 40, + 9000000000000000001: 45, + 100000000000000000: 3, + 2000000000000000000: 10, + }, + } + + tests := []struct { + signed entities.Signed[any] + err error + }{ + {signed: entities.Signed[any]{Value: peginConfig, Hash: "f3daae424654d2eeb2b50dc00b3e453e24ca1c690d80015f5f54d5f1fefaf900"}}, + {signed: entities.Signed[any]{Value: pegoutConfig, Hash: "3b3e7b075eb60b8c249f44a117f406c64992bafda1173f540277448abd14077e"}}, + {signed: entities.Signed[any]{Value: generalConfig, Hash: "3eecc42296c21a63dff80885f972ea88caf5038e47f014b1c91bb9b80529b757"}}, + {signed: entities.Signed[any]{Value: peginConfig, Hash: "f3daab424654d2eeb2b50dc00b3e453e24ca1c690d80015f5f54d5f1fefaf900"}, err: entities.IntegrityError}, + {signed: entities.Signed[any]{Value: pegoutConfig, Hash: "3b3e7b075eb60b8c249f44a117f406c64992bafda1273f540277448abd14077e"}, err: entities.IntegrityError}, + {signed: entities.Signed[any]{Value: generalConfig, Hash: "3fecc42296c21a63dff80885f972ea88caf5038e47f014b1c91bb9b80529b757"}, err: entities.IntegrityError}, + {signed: entities.Signed[any]{Value: generalConfig, Hash: "not a hash"}, err: hex.InvalidByteError('n')}, + {signed: entities.Signed[any]{Value: map[string]int{"test": 5}, Hash: "17bdb7aeb84082e4f0bf751ba78ee1fea05982f93d01e41016d1aeaaa718e18b"}}, + } + + for _, testCase := range tests { + err := testCase.signed.CheckIntegrity(crypto.Keccak256) + require.ErrorIs(t, err, testCase.err) + } +} + +func TestSigned_CheckIntegrity_encoding(t *testing.T) { + var encodingErr *json.UnsupportedValueError + err := entities.Signed[any]{ + Value: map[string]float64{"test": math.NaN()}, + Hash: "17bdb7aeb84082e4f0bf751ba78ee1fea05982f93d01e41016d1aeaaa718e18b", + }.CheckIntegrity(crypto.Keccak256) + require.ErrorAs(t, err, &encodingErr) +} diff --git a/internal/entities/liquidity_provider/configuration.go b/internal/entities/liquidity_provider/configuration.go new file mode 100644 index 00000000..0bf1b486 --- /dev/null +++ b/internal/entities/liquidity_provider/configuration.go @@ -0,0 +1,86 @@ +package liquidity_provider + +import ( + "errors" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "slices" +) + +var ( + AmountOutOfRangeError = errors.New("amount out of range") +) + +type ConfirmationsPerAmount map[int]uint16 + +type PeginConfiguration struct { + TimeForDeposit uint32 `json:"timeForDeposit" bson:"time_for_deposit" validate:"required"` + CallTime uint32 `json:"callTime" bson:"call_time" validate:"required"` + PenaltyFee *entities.Wei `json:"penaltyFee" bson:"penalty_fee" validate:"required"` + CallFee *entities.Wei `json:"callFee" bson:"call_fee" validate:"required"` + MaxValue *entities.Wei `json:"maxValue" bson:"max_value" validate:"required"` + MinValue *entities.Wei `json:"minValue" bson:"min_value" validate:"required"` +} + +type PegoutConfiguration struct { + TimeForDeposit uint32 `json:"timeForDeposit" bson:"time_for_deposit" validate:"required"` + CallTime uint32 `json:"callTime" bson:"call_time" validate:"required"` + PenaltyFee *entities.Wei `json:"penaltyFee" bson:"penalty_fee" validate:"required"` + CallFee *entities.Wei `json:"callFee" bson:"call_fee" validate:"required"` + MaxValue *entities.Wei `json:"maxValue" bson:"max_value" validate:"required"` + MinValue *entities.Wei `json:"minValue" bson:"min_value" validate:"required"` + ExpireBlocks uint64 `json:"expireBlocks" bson:"expire_blocks" validate:"required"` +} + +type GeneralConfiguration struct { + RskConfirmations ConfirmationsPerAmount `json:"rskConfirmations" bson:"rsk_confirmations" validate:"required"` + BtcConfirmations ConfirmationsPerAmount `json:"btcConfirmations" bson:"btc_confirmations" validate:"required"` +} + +type ConfigurationType interface { + PeginConfiguration | PegoutConfiguration | GeneralConfiguration +} + +func (config PeginConfiguration) ValidateAmount(amount *entities.Wei) error { + return validateRange(config.MinValue, config.MaxValue, amount) +} + +func (config PegoutConfiguration) ValidateAmount(amount *entities.Wei) error { + return validateRange(config.MinValue, config.MaxValue, amount) +} + +func validateRange(min, max, amount *entities.Wei) error { + if amount.Cmp(max) <= 0 && amount.Cmp(min) >= 0 { + return nil + } else { + return fmt.Errorf("%w [%v, %v]", AmountOutOfRangeError, min, max) + } +} + +func (confirmations ConfirmationsPerAmount) Max() uint16 { + // replace with slices.Max(maps.Values(lp.env.BtcConfig.Confirmations)) when its on stable go version + var maxValue uint16 + for _, value := range confirmations { + if maxValue < value { + maxValue = value + } + } + return maxValue +} + +func (confirmations ConfirmationsPerAmount) ForValue(value *entities.Wei) uint16 { + values := make([]int, 0) + for key := range confirmations { + values = append(values, key) + } + slices.Sort(values) + index := slices.IndexFunc(values, func(item int) bool { + bigItem := entities.NewWei(int64(item)) + return value.Cmp(bigItem) <= 0 + }) + if index == -1 { + return confirmations[values[len(values)-1]] + } else { + return confirmations[values[index]] + } +} diff --git a/internal/entities/liquidity_provider/configuration_test.go b/internal/entities/liquidity_provider/configuration_test.go new file mode 100644 index 00000000..4f984e50 --- /dev/null +++ b/internal/entities/liquidity_provider/configuration_test.go @@ -0,0 +1,123 @@ +package liquidity_provider_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/require" + "testing" +) + +func TestConfirmationsPerAmount_ForValue(t *testing.T) { + table := test.Table[*entities.Wei, uint16]{ + {Value: entities.NewWei(1), Result: uint16(40)}, + {Value: entities.NewWei(10000000), Result: uint16(40)}, + {Value: entities.NewWei(100000000000000000), Result: uint16(40)}, + {Value: entities.NewWei(100000000000000001), Result: uint16(120)}, + {Value: entities.NewWei(400000000000000000), Result: uint16(120)}, + {Value: entities.NewWei(400000000000000001), Result: uint16(200)}, + {Value: entities.NewWei(400000000050000000), Result: uint16(200)}, + {Value: entities.NewWei(2000000000000000000), Result: uint16(200)}, + {Value: entities.NewWei(2000000000000000001), Result: uint16(400)}, + {Value: entities.NewWei(4000000000000000000), Result: uint16(400)}, + {Value: entities.NewWei(4000000000000000001), Result: uint16(800)}, + {Value: entities.NewWei(4000000005000000000), Result: uint16(800)}, + {Value: entities.NewWei(8000000000000000000), Result: uint16(800)}, + {Value: entities.NewWei(8000000000000000005), Result: uint16(800)}, + {Value: entities.NewWei(9000000000000000000), Result: uint16(800)}, + } + confirmations := liquidity_provider.DefaultRskConfirmationsPerAmount() + test.RunTable(t, table, confirmations.ForValue) +} + +func TestConfirmationsPerAmount_Max(t *testing.T) { + table := test.Table[liquidity_provider.ConfirmationsPerAmount, uint16]{ + { + Value: liquidity_provider.DefaultRskConfirmationsPerAmount(), + Result: uint16(800), + }, + { + Value: liquidity_provider.DefaultBtcConfirmationsPerAmount(), + Result: uint16(40), + }, + { + Value: liquidity_provider.ConfirmationsPerAmount{}, + Result: uint16(0), + }, + { + Value: liquidity_provider.ConfirmationsPerAmount{100: 10, 200: 20, 300: 30}, + Result: uint16(30), + }, + } + test.RunTable(t, table, func(confirmations liquidity_provider.ConfirmationsPerAmount) uint16 { + return confirmations.Max() + }) +} + +func TestPeginConfiguration_ValidateAmount(t *testing.T) { + config := liquidity_provider.DefaultPeginConfiguration() + table := test.Table[*entities.Wei, error]{ + { + Value: entities.NewWei(1), + Result: liquidity_provider.AmountOutOfRangeError, + }, + { + Value: entities.NewWei(5999999999999999), + Result: liquidity_provider.AmountOutOfRangeError, + }, + { + Value: entities.NewWei(6000000000000000), + Result: nil, + }, + { + Value: entities.NewWei(100000000000000000), + Result: nil, + }, + { + Value: entities.NewWei(100000000000000001), + Result: liquidity_provider.AmountOutOfRangeError, + }, + { + Value: entities.NewWei(1000000000000000000), + Result: liquidity_provider.AmountOutOfRangeError, + }, + } + for _, item := range table { + err := config.ValidateAmount(item.Value) + require.ErrorIs(t, err, item.Result) + } +} + +func TestPegoutConfiguration_ValidateAmount(t *testing.T) { + config := liquidity_provider.DefaultPegoutConfiguration() + table := test.Table[*entities.Wei, error]{ + { + Value: entities.NewWei(1), + Result: liquidity_provider.AmountOutOfRangeError, + }, + { + Value: entities.NewWei(5999999999999999), + Result: liquidity_provider.AmountOutOfRangeError, + }, + { + Value: entities.NewWei(6000000000000000), + Result: nil, + }, + { + Value: entities.NewWei(100000000000000000), + Result: nil, + }, + { + Value: entities.NewWei(100000000000000001), + Result: liquidity_provider.AmountOutOfRangeError, + }, + { + Value: entities.NewWei(1000000000000000000), + Result: liquidity_provider.AmountOutOfRangeError, + }, + } + for _, item := range table { + err := config.ValidateAmount(item.Value) + require.ErrorIs(t, err, item.Result) + } +} diff --git a/internal/entities/liquidity_provider/default.go b/internal/entities/liquidity_provider/default.go new file mode 100644 index 00000000..877a1d9c --- /dev/null +++ b/internal/entities/liquidity_provider/default.go @@ -0,0 +1,72 @@ +package liquidity_provider + +import "github.com/rsksmart/liquidity-provider-server/internal/entities" + +const ( + PeginTimeForDeposit = 3600 + PeginCallTime = 7200 + PeginPenaltyFee = 10000000000000 + PeginCallFee = 100000000000000 + PeginMinValue = 6000000000000000 + PeginMaxValue = 100000000000000000 +) + +const ( + PegoutTimeForDeposit = 3600 + PegoutCallTime = 7200 + PegoutPenaltyFee = 10000000000000 + PegoutCallFee = 100000000000000 + PegoutMinValue = 6000000000000000 + PegoutMaxValue = 100000000000000000 + PegoutExpireBlocks = 500 +) + +func DefaultRskConfirmationsPerAmount() ConfirmationsPerAmount { + return ConfirmationsPerAmount{ + 100000000000000000: 40, + 400000000000000000: 120, + 2000000000000000000: 200, + 4000000000000000000: 400, + 8000000000000000000: 800, + } +} + +func DefaultBtcConfirmationsPerAmount() ConfirmationsPerAmount { + return ConfirmationsPerAmount{ + 100000000000000000: 2, + 400000000000000000: 6, + 2000000000000000000: 10, + 4000000000000000000: 20, + 8000000000000000000: 40, + } +} + +func DefaultPeginConfiguration() PeginConfiguration { + return PeginConfiguration{ + TimeForDeposit: PeginTimeForDeposit, + CallTime: PeginCallTime, + PenaltyFee: entities.NewWei(PeginPenaltyFee), + CallFee: entities.NewWei(PeginCallFee), + MaxValue: entities.NewWei(PeginMaxValue), + MinValue: entities.NewWei(PeginMinValue), + } +} + +func DefaultPegoutConfiguration() PegoutConfiguration { + return PegoutConfiguration{ + TimeForDeposit: PegoutTimeForDeposit, + CallTime: PegoutCallTime, + PenaltyFee: entities.NewWei(PegoutPenaltyFee), + CallFee: entities.NewWei(PegoutCallFee), + MaxValue: entities.NewWei(PegoutMaxValue), + MinValue: entities.NewWei(PegoutMinValue), + ExpireBlocks: PegoutExpireBlocks, + } +} + +func DefaultGeneralConfiguration() GeneralConfiguration { + return GeneralConfiguration{ + RskConfirmations: DefaultRskConfirmationsPerAmount(), + BtcConfirmations: DefaultBtcConfirmationsPerAmount(), + } +} diff --git a/internal/entities/liquidity_provider/default_test.go b/internal/entities/liquidity_provider/default_test.go new file mode 100644 index 00000000..2ef82368 --- /dev/null +++ b/internal/entities/liquidity_provider/default_test.go @@ -0,0 +1,73 @@ +package liquidity_provider_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestDefaultBtcConfirmationsPerAmount(t *testing.T) { + confirmations := liquidity_provider.DefaultBtcConfirmationsPerAmount() + assert.Equal(t, liquidity_provider.ConfirmationsPerAmount{ + 100000000000000000: 2, + 400000000000000000: 6, + 2000000000000000000: 10, + 4000000000000000000: 20, + 8000000000000000000: 40, + }, confirmations) +} + +func TestDefaultRskConfirmationsPerAmount(t *testing.T) { + confirmations := liquidity_provider.DefaultRskConfirmationsPerAmount() + assert.Equal(t, liquidity_provider.ConfirmationsPerAmount{ + 100000000000000000: 40, + 400000000000000000: 120, + 2000000000000000000: 200, + 4000000000000000000: 400, + 8000000000000000000: 800, + }, confirmations) +} + +func TestDefaultPegoutConfiguration(t *testing.T) { + config := liquidity_provider.DefaultPegoutConfiguration() + assert.Equal(t, liquidity_provider.PegoutConfiguration{ + TimeForDeposit: 3600, + CallTime: 7200, + PenaltyFee: entities.NewWei(10000000000000), + CallFee: entities.NewWei(100000000000000), + MaxValue: entities.NewWei(100000000000000000), + MinValue: entities.NewWei(6000000000000000), + ExpireBlocks: 500, + }, config) +} + +func TestDefaultPeginConfiguration(t *testing.T) { + config := liquidity_provider.DefaultPeginConfiguration() + assert.Equal(t, liquidity_provider.PeginConfiguration{ + TimeForDeposit: 3600, + CallTime: 7200, + PenaltyFee: entities.NewWei(10000000000000), + CallFee: entities.NewWei(100000000000000), + MaxValue: entities.NewWei(100000000000000000), + MinValue: entities.NewWei(6000000000000000), + }, config) +} + +func TestDefaultRskConfirmationsPerAmount_Max(t *testing.T) { + confirmations := liquidity_provider.DefaultRskConfirmationsPerAmount() + assert.Equal(t, uint16(800), confirmations.Max()) +} + +func TestDefaultBtcConfirmationsPerAmount_Max(t *testing.T) { + confirmations := liquidity_provider.DefaultBtcConfirmationsPerAmount() + assert.Equal(t, uint16(40), confirmations.Max()) +} + +func TestDefaultGeneralConfiguration(t *testing.T) { + config := liquidity_provider.DefaultGeneralConfiguration() + assert.Equal(t, liquidity_provider.GeneralConfiguration{ + RskConfirmations: liquidity_provider.DefaultRskConfirmationsPerAmount(), + BtcConfirmations: liquidity_provider.DefaultBtcConfirmationsPerAmount(), + }, config) +} diff --git a/internal/entities/liquidity_provider.go b/internal/entities/liquidity_provider/liquidity_provider.go similarity index 52% rename from internal/entities/liquidity_provider.go rename to internal/entities/liquidity_provider/liquidity_provider.go index d908f918..d26700e0 100644 --- a/internal/entities/liquidity_provider.go +++ b/internal/entities/liquidity_provider/liquidity_provider.go @@ -1,8 +1,9 @@ -package entities +package liquidity_provider import ( "context" "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" ) type ProviderType string @@ -45,32 +46,26 @@ type LiquidityProvider interface { RskAddress() string BtcAddress() string SignQuote(quoteHash string) (string, error) - GetBitcoinConfirmationsForValue(value *Wei) uint16 - GetRootstockConfirmationsForValue(value *Wei) uint16 + GeneralConfiguration(ctx context.Context) GeneralConfiguration } type PeginLiquidityProvider interface { - ValidateAmountForPegin(amount *Wei) error - HasPeginLiquidity(ctx context.Context, requiredLiquidity *Wei) error - CallTime() uint32 - CallFeePegin() *Wei - PenaltyFeePegin() *Wei - TimeForDepositPegin() uint32 - MaxPegin() *Wei - MinPegin() *Wei - MaxPeginConfirmations() uint16 + HasPeginLiquidity(ctx context.Context, requiredLiquidity *entities.Wei) error + PeginConfiguration(ctx context.Context) PeginConfiguration } type PegoutLiquidityProvider interface { - ValidateAmountForPegout(amount *Wei) error - HasPegoutLiquidity(ctx context.Context, requiredLiquidity *Wei) error - CallFeePegout() *Wei - PenaltyFeePegout() *Wei - TimeForDepositPegout() uint32 - ExpireBlocksPegout() uint64 - MaxPegout() *Wei - MinPegout() *Wei - MaxPegoutConfirmations() uint16 + HasPegoutLiquidity(ctx context.Context, requiredLiquidity *entities.Wei) error + PegoutConfiguration(ctx context.Context) PegoutConfiguration +} + +type LiquidityProviderRepository interface { + GetPeginConfiguration(ctx context.Context) (*entities.Signed[PeginConfiguration], error) + UpsertPeginConfiguration(ctx context.Context, configuration entities.Signed[PeginConfiguration]) error + GetPegoutConfiguration(ctx context.Context) (*entities.Signed[PegoutConfiguration], error) + UpsertPegoutConfiguration(ctx context.Context, configuration entities.Signed[PegoutConfiguration]) error + GetGeneralConfiguration(ctx context.Context) (*entities.Signed[GeneralConfiguration], error) + UpsertGeneralConfiguration(ctx context.Context, configuration entities.Signed[GeneralConfiguration]) error } type RegisteredLiquidityProvider struct { @@ -83,14 +78,14 @@ type RegisteredLiquidityProvider struct { } type LiquidityProviderDetail struct { - Fee *Wei `json:"fee" validate:"required"` - MinTransactionValue *Wei `json:"minTransactionValue" validate:"required"` - MaxTransactionValue *Wei `json:"maxTransactionValue" validate:"required"` - RequiredConfirmations uint16 `json:"requiredConfirmations" validate:"required"` + Fee *entities.Wei `json:"fee" validate:"required"` + MinTransactionValue *entities.Wei `json:"minTransactionValue" validate:"required"` + MaxTransactionValue *entities.Wei `json:"maxTransactionValue" validate:"required"` + RequiredConfirmations uint16 `json:"requiredConfirmations" validate:"required"` } type PunishmentEvent struct { LiquidityProvider string - Penalty *Wei + Penalty *entities.Wei QuoteHash string } diff --git a/internal/entities/liquidity_provider_test.go b/internal/entities/liquidity_provider/liquidity_provider_test.go similarity index 53% rename from internal/entities/liquidity_provider_test.go rename to internal/entities/liquidity_provider/liquidity_provider_test.go index 13082d1d..3df99065 100644 --- a/internal/entities/liquidity_provider_test.go +++ b/internal/entities/liquidity_provider/liquidity_provider_test.go @@ -1,77 +1,77 @@ -package entities_test +package liquidity_provider_test import ( - "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" "testing" ) func TestProviderType_IsValid(t *testing.T) { - cases := test.Table[entities.ProviderType, bool]{ + cases := test.Table[liquidity_provider.ProviderType, bool]{ {Value: "pegin", Result: true}, {Value: "pegout", Result: true}, {Value: "both", Result: true}, {Value: "", Result: false}, {Value: "any value", Result: false}, } - test.RunTable(t, cases, func(value entities.ProviderType) bool { + test.RunTable(t, cases, func(value liquidity_provider.ProviderType) bool { return value.IsValid() }) } func TestProviderType_AcceptsPegin(t *testing.T) { - cases := test.Table[entities.ProviderType, bool]{ + cases := test.Table[liquidity_provider.ProviderType, bool]{ {Value: "pegin", Result: true}, {Value: "pegout", Result: false}, {Value: "both", Result: true}, {Value: "", Result: false}, {Value: "any value", Result: false}, } - test.RunTable(t, cases, func(value entities.ProviderType) bool { + test.RunTable(t, cases, func(value liquidity_provider.ProviderType) bool { return value.AcceptsPegin() }) } func TestProviderType_AcceptsPegout(t *testing.T) { - cases := test.Table[entities.ProviderType, bool]{ + cases := test.Table[liquidity_provider.ProviderType, bool]{ {Value: "pegin", Result: false}, {Value: "pegout", Result: true}, {Value: "both", Result: true}, {Value: "", Result: false}, {Value: "any value", Result: false}, } - test.RunTable(t, cases, func(value entities.ProviderType) bool { + test.RunTable(t, cases, func(value liquidity_provider.ProviderType) bool { return value.AcceptsPegout() }) } func TestToProviderType(t *testing.T) { var err error - var result entities.ProviderType + var result liquidity_provider.ProviderType errorCases := test.Table[string, error]{ {Value: "pegin", Result: nil}, {Value: "pegout", Result: nil}, {Value: "both", Result: nil}, - {Value: "", Result: entities.InvalidProviderTypeError}, - {Value: "any value", Result: entities.InvalidProviderTypeError}, + {Value: "", Result: liquidity_provider.InvalidProviderTypeError}, + {Value: "any value", Result: liquidity_provider.InvalidProviderTypeError}, } - valueCases := test.Table[string, entities.ProviderType]{ - {Value: "pegin", Result: entities.PeginProvider}, - {Value: "pegout", Result: entities.PegoutProvider}, - {Value: "both", Result: entities.FullProvider}, + valueCases := test.Table[string, liquidity_provider.ProviderType]{ + {Value: "pegin", Result: liquidity_provider.PeginProvider}, + {Value: "pegout", Result: liquidity_provider.PegoutProvider}, + {Value: "both", Result: liquidity_provider.FullProvider}, {Value: "", Result: ""}, {Value: "any value", Result: ""}, } test.RunTable(t, errorCases, func(value string) error { - _, err = entities.ToProviderType(value) + _, err = liquidity_provider.ToProviderType(value) return err }) - test.RunTable(t, valueCases, func(value string) entities.ProviderType { - result, _ = entities.ToProviderType(value) + test.RunTable(t, valueCases, func(value string) liquidity_provider.ProviderType { + result, _ = liquidity_provider.ToProviderType(value) return result }) } diff --git a/internal/entities/quote/pegout_quote.go b/internal/entities/quote/pegout_quote.go index 656fec9e..3800cc91 100644 --- a/internal/entities/quote/pegout_quote.go +++ b/internal/entities/quote/pegout_quote.go @@ -3,6 +3,7 @@ package quote import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "time" ) @@ -69,8 +70,8 @@ func (quote *PegoutQuote) IsExpired() bool { return time.Now().After(quote.ExpireTime()) } -func GetCreationBlock(lp entities.PegoutLiquidityProvider, pegoutQuote PegoutQuote) uint64 { - return utils.SafeSub(uint64(pegoutQuote.ExpireBlock), lp.ExpireBlocksPegout()) +func GetCreationBlock(pegoutConfig liquidity_provider.PegoutConfiguration, pegoutQuote PegoutQuote) uint64 { + return utils.SafeSub(uint64(pegoutQuote.ExpireBlock), pegoutConfig.ExpireBlocks) } func (quote *PegoutQuote) Total() *entities.Wei { diff --git a/internal/entities/quote/pegout_quote_test.go b/internal/entities/quote/pegout_quote_test.go index 046d40e3..a68c3df2 100644 --- a/internal/entities/quote/pegout_quote_test.go +++ b/internal/entities/quote/pegout_quote_test.go @@ -2,6 +2,7 @@ package quote_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" @@ -12,7 +13,7 @@ import ( type LpMock struct { mock.Mock - entities.PegoutLiquidityProvider + liquidity_provider.PegoutLiquidityProvider } func (l *LpMock) ExpireBlocksPegout() uint64 { @@ -123,6 +124,9 @@ func TestPegoutQuote_IsExpired(t *testing.T) { } func TestGetCreationBlock(t *testing.T) { + pegoutConfig := liquidity_provider.PegoutConfiguration{ + ExpireBlocks: 40, + } quotes := test.Table[quote.PegoutQuote, uint64]{ { Value: quote.PegoutQuote{ @@ -173,10 +177,8 @@ func TestGetCreationBlock(t *testing.T) { Result: 340, }, } - - lp := &LpMock{} test.RunTable(t, quotes, func(value quote.PegoutQuote) uint64 { - return quote.GetCreationBlock(lp, value) + return quote.GetCreationBlock(pegoutConfig, value) }) } @@ -198,7 +200,7 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { Amount: entities.NewWei(490000000000000000), Timestamp: now, BlockNumber: 499, - From: "any address", + From: test.AnyAddress, }, Result: false, }, @@ -209,7 +211,7 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { Amount: entities.NewWei(5100000000000000000), Timestamp: time.Unix(now.Unix()+61, 0), BlockNumber: 499, - From: "any address", + From: test.AnyAddress, }, Result: false, }, @@ -220,7 +222,7 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { Amount: entities.NewWei(5100000000000000000), Timestamp: now, BlockNumber: 501, - From: "any address", + From: test.AnyAddress, }, Result: false, }, @@ -231,7 +233,7 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { Amount: entities.NewWei(5100000000000000000), Timestamp: now, BlockNumber: 499, - From: "any address", + From: test.AnyAddress, }, Result: true, }, diff --git a/internal/entities/wei.go b/internal/entities/wei.go index 5596fd2f..a3bb2143 100644 --- a/internal/entities/wei.go +++ b/internal/entities/wei.go @@ -2,12 +2,10 @@ package entities import ( "database/sql/driver" - "encoding/binary" "errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsontype" "math/big" - "slices" ) type Wei big.Int @@ -103,20 +101,18 @@ func (w *Wei) UnmarshalJSON(bytes []byte) error { } func (w *Wei) MarshalBSONValue() (bsontype.Type, []byte, error) { - if w == nil { - return bson.TypeInt64, make([]byte, 0), SerializationError - } - value := make([]byte, 8) - binary.LittleEndian.PutUint64(value, w.Uint64()) - return bson.TypeInt64, value, nil + return bson.MarshalValue(w.AsBigInt().String()) } func (w *Wei) UnmarshalBSONValue(bsonType bsontype.Type, bytes []byte) error { - if w == nil || bsonType != bson.TypeInt64 { + if w == nil || bsonType != bson.TypeString || len(bytes) == 0 { return DeserializationError } - slices.Reverse(bytes) - w.AsBigInt().SetBytes(bytes) + var value string + if err := bson.UnmarshalValue(bsonType, bytes, &value); err != nil { + return errors.Join(DeserializationError, err) + } + w.AsBigInt().SetString(value, 10) return nil } diff --git a/internal/entities/wei_test.go b/internal/entities/wei_test.go index f0101ca3..9a343633 100644 --- a/internal/entities/wei_test.go +++ b/internal/entities/wei_test.go @@ -434,40 +434,36 @@ func TestWei_UnmarshalJSON(t *testing.T) { } func TestWei_UnmarshalBSONValue(t *testing.T) { - errorCases := test.Table[bsontype.Type, error]{ - {Value: bson.TypeInt64}, - {Value: bson.TypeString, Result: entities.DeserializationError}, + dataTypeCases := test.Table[bsontype.Type, error]{ + {Value: bson.TypeInt64, Result: entities.DeserializationError}, + {Value: bson.TypeString}, {Value: bson.TypeDBPointer, Result: entities.DeserializationError}, {Value: bson.TypeBinary, Result: entities.DeserializationError}, {Value: bson.TypeDouble, Result: entities.DeserializationError}, } - type result struct { - err error - bytes []byte - } - successCases := test.Table[*entities.Wei, result]{ - {Result: result{err: entities.SerializationError, bytes: make([]byte, 0)}}, - {Value: entities.NewWei(5), Result: result{nil, []byte{5, 0, 0, 0, 0, 0, 0, 0}}}, - {Value: entities.NewWei(77), Result: result{nil, []byte{77, 0, 0, 0, 0, 0, 0, 0}}}, - {Value: entities.NewWei(5678), Result: result{nil, []byte{46, 22, 0, 0, 0, 0, 0, 0}}}, - {Value: entities.NewWei(math.MaxInt64 - 500), Result: result{nil, []byte{11, 254, 255, 255, 255, 255, 255, 127}}}, - {Value: entities.NewWei(math.MaxInt64), Result: result{nil, []byte{255, 255, 255, 255, 255, 255, 255, 127}}}, + zeroRepresentation := []byte{2, 0, 0, 0, 48, 0} + successCases := test.Table[*entities.Wei, []byte]{ + {Value: entities.NewWei(0), Result: zeroRepresentation}, + {Value: entities.NewWei(5), Result: []byte{2, 0, 0, 0, 53, 0}}, + {Value: entities.NewWei(77), Result: []byte{3, 0, 0, 0, 55, 55, 0}}, + {Value: entities.NewWei(5678), Result: []byte{5, 0, 0, 0, 53, 54, 55, 56, 0}}, + {Value: entities.NewWei(math.MaxInt64 - 500), Result: []byte{20, 0, 0, 0, 57, 50, 50, 51, 51, 55, 50, 48, 51, 54, 56, 53, 52, 55, 55, 53, 51, 48, 55, 0}}, + {Value: entities.NewWei(math.MaxInt64), Result: []byte{20, 0, 0, 0, 57, 50, 50, 51, 51, 55, 50, 48, 51, 54, 56, 53, 52, 55, 55, 53, 56, 48, 55, 0}}, } var nilWei *entities.Wei - var err error var bytes []byte var bsonTypeResult bsontype.Type weiValue := entities.NewWei(1) require.ErrorIs(t, nilWei.UnmarshalBSONValue(bson.TypeInt64, []byte{}), entities.DeserializationError) - test.RunTable(t, errorCases, func(bsonType bsontype.Type) error { - return weiValue.UnmarshalBSONValue(bsonType, []byte{}) + test.RunTable(t, dataTypeCases, func(bsonType bsontype.Type) error { + return weiValue.UnmarshalBSONValue(bsonType, zeroRepresentation) }) - test.RunTable(t, successCases, func(value *entities.Wei) result { - bsonTypeResult, bytes, err = value.MarshalBSONValue() - assert.Equal(t, bson.TypeInt64, bsonTypeResult) - return result{err, bytes} + test.RunTable(t, successCases, func(value *entities.Wei) []byte { + bsonTypeResult, bytes, _ = value.MarshalBSONValue() + assert.Equal(t, bson.TypeString, bsonTypeResult) + return bytes }) } diff --git a/internal/usecases/common.go b/internal/usecases/common.go index 3f538c77..c5922e17 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -3,11 +3,13 @@ package usecases import ( "context" "crypto/rand" + "encoding/hex" "encoding/json" "errors" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "math" "math/big" ) @@ -45,6 +47,9 @@ const ( InitPegoutDepositCacheId UseCaseId = "InitPegoutDepositCache" CheckLiquidityId UseCaseId = "CheckLiquidity" PenalizationId UseCaseId = "Penalization" + SetPeginConfigId UseCaseId = "SetPeginConfigUseCase" + SetPegoutConfigId UseCaseId = "SetPegoutConfigUseCase" + SetGeneralConfigId UseCaseId = "SetGeneralConfigUseCase" ) var ( @@ -60,7 +65,6 @@ var ( NoEnoughConfirmationsError = errors.New("not enough confirmations for transaction") InsufficientAmountError = errors.New("insufficient amount") AlreadyRegisteredError = errors.New("liquidity provider already registered") - AmountOutOfRangeError = errors.New("amount out of range") ProviderNotResignedError = errors.New("provided hasn't completed resignation process") ) @@ -145,3 +149,26 @@ func GetRandomInt() (int64, error) { } return random.Int64(), nil } + +func SignConfiguration[C liquidity_provider.ConfigurationType]( + useCaseId UseCaseId, + signer entities.Signer, + hashFunction entities.HashFunction, + config C, +) (entities.Signed[C], error) { + configBytes, err := json.Marshal(config) + if err != nil { + return entities.Signed[C]{}, WrapUseCaseError(useCaseId, err) + } + hash := hashFunction(configBytes) + signature, err := signer.SignBytes(hash) + if err != nil { + return entities.Signed[C]{}, WrapUseCaseError(useCaseId, err) + } + signedConfig := entities.Signed[C]{ + Value: config, + Hash: hex.EncodeToString(hash), + Signature: hex.EncodeToString(signature), + } + return signedConfig, nil +} diff --git a/internal/usecases/common_test.go b/internal/usecases/common_test.go index b876957a..6b1ca1f6 100644 --- a/internal/usecases/common_test.go +++ b/internal/usecases/common_test.go @@ -6,8 +6,10 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" u "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -15,6 +17,8 @@ import ( "testing" ) +const id = "anyUseCase" + type rpcMock struct { mock.Mock blockchain.RootstockRpcServer @@ -122,3 +126,33 @@ func TestValidateMinLockValue(t *testing.T) { require.Error(t, err) assert.Equal(t, "anyUseCase: requested amount below bridge's min transaction value. Args: {\"minimum\":\"1000000000000000000\",\"value\":\"999999999999999999\"}", err.Error()) } + +func TestSignConfiguration(t *testing.T) { + var ( + signature = []byte{1, 2, 3} + hash = []byte{4, 5, 6} + ) + configuration := liquidity_provider.DefaultPeginConfiguration() + wallet := &mocks.RskWalletMock{} + wallet.On("SignBytes", mock.Anything).Return(signature, nil) + hashFunctionMock := &mocks.HashMock{} + hashFunctionMock.On("Hash", mock.Anything).Return(hash) + signed, err := u.SignConfiguration(id, wallet, hashFunctionMock.Hash, configuration) + require.NoError(t, err) + assert.Equal(t, entities.Signed[liquidity_provider.PeginConfiguration]{ + Value: configuration, + Hash: "040506", + Signature: "010203", + }, signed) +} + +func TestSignConfiguration_SignatureError(t *testing.T) { + wallet := &mocks.RskWalletMock{} + wallet.On("SignBytes", mock.Anything).Return(nil, assert.AnError) + hashFunctionMock := &mocks.HashMock{} + hashFunctionMock.On("Hash", mock.Anything).Return([]byte{1}) + configuration := liquidity_provider.DefaultPeginConfiguration() + signed, err := u.SignConfiguration(id, wallet, hashFunctionMock.Hash, configuration) + require.Equal(t, entities.Signed[liquidity_provider.PeginConfiguration]{}, signed) + require.Error(t, err) +} diff --git a/internal/usecases/liquidity_provider/change_status.go b/internal/usecases/liquidity_provider/change_status.go index 11b48395..52c5b027 100644 --- a/internal/usecases/liquidity_provider/change_status.go +++ b/internal/usecases/liquidity_provider/change_status.go @@ -1,17 +1,17 @@ package liquidity_provider import ( - "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type ChangeStatusUseCase struct { lbc blockchain.LiquidityBridgeContract - provider entities.LiquidityProvider + provider liquidity_provider.LiquidityProvider } -func NewChangeStatusUseCase(lbc blockchain.LiquidityBridgeContract, provider entities.LiquidityProvider) *ChangeStatusUseCase { +func NewChangeStatusUseCase(lbc blockchain.LiquidityBridgeContract, provider liquidity_provider.LiquidityProvider) *ChangeStatusUseCase { return &ChangeStatusUseCase{lbc: lbc, provider: provider} } diff --git a/internal/usecases/liquidity_provider/change_status_test.go b/internal/usecases/liquidity_provider/change_status_test.go index ef014eb2..85ca6cae 100644 --- a/internal/usecases/liquidity_provider/change_status_test.go +++ b/internal/usecases/liquidity_provider/change_status_test.go @@ -2,17 +2,17 @@ package liquidity_provider_test import ( "errors" - "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "testing" ) func TestChangeStatusUseCase_Run(t *testing.T) { - lbc := &test.LbcMock{} - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc := &mocks.LbcMock{} + lbc.On("GetProviders").Return([]lp.RegisteredLiquidityProvider{ { Id: 1, Address: "0x01", @@ -28,7 +28,7 @@ func TestChangeStatusUseCase_Run(t *testing.T) { }, nil).Once() lbc.On("SetProviderStatus", uint64(2), false).Return(nil).Once() - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("0x02") err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) @@ -38,18 +38,18 @@ func TestChangeStatusUseCase_Run(t *testing.T) { } func TestChangeStatusUseCase_Run_Fail(t *testing.T) { - lbc := &test.LbcMock{} - provider := &test.ProviderMock{} + lbc := &mocks.LbcMock{} + provider := &mocks.ProviderMock{} lbc.On("GetProviders").Return( - []entities.RegisteredLiquidityProvider{}, + []lp.RegisteredLiquidityProvider{}, errors.New("some error"), ).Once() err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) lbc.AssertExpectations(t) require.Error(t, err) - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc.On("GetProviders").Return([]lp.RegisteredLiquidityProvider{ {Id: 1, Address: "0x01"}, }, nil).Once() provider.On("RskAddress").Return("0x01") diff --git a/internal/usecases/liquidity_provider/check_liquidity.go b/internal/usecases/liquidity_provider/check_liquidity.go index 31a017e7..d35b32e9 100644 --- a/internal/usecases/liquidity_provider/check_liquidity.go +++ b/internal/usecases/liquidity_provider/check_liquidity.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" ) @@ -20,16 +21,16 @@ const ( ) type CheckLiquidityUseCase struct { - peginProvider entities.PeginLiquidityProvider - pegoutProvider entities.PegoutLiquidityProvider + peginProvider liquidity_provider.PeginLiquidityProvider + pegoutProvider liquidity_provider.PegoutLiquidityProvider bridge blockchain.RootstockBridge alertSender entities.AlertSender recipient string } func NewCheckLiquidityUseCase( - peginProvider entities.PeginLiquidityProvider, - pegoutProvider entities.PegoutLiquidityProvider, + peginProvider liquidity_provider.PeginLiquidityProvider, + pegoutProvider liquidity_provider.PegoutLiquidityProvider, bridge blockchain.RootstockBridge, alertSender entities.AlertSender, recipient string, diff --git a/internal/usecases/liquidity_provider/check_liquidity_test.go b/internal/usecases/liquidity_provider/check_liquidity_test.go index a1bdb964..56559aba 100644 --- a/internal/usecases/liquidity_provider/check_liquidity_test.go +++ b/internal/usecases/liquidity_provider/check_liquidity_test.go @@ -7,6 +7,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -15,9 +16,9 @@ import ( ) func TestCheckLiquidityUseCase_Run(t *testing.T) { - bridge := &test.BridgeMock{} - provider := &test.ProviderMock{} - alertSender := &test.AlertSenderMock{} + bridge := &mocks.BridgeMock{} + provider := &mocks.ProviderMock{} + alertSender := &mocks.AlertSenderMock{} provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() @@ -30,9 +31,9 @@ func TestCheckLiquidityUseCase_Run(t *testing.T) { } func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { - bridge := &test.BridgeMock{} - provider := &test.ProviderMock{} - alertSender := &test.AlertSenderMock{} + bridge := &mocks.BridgeMock{} + provider := &mocks.ProviderMock{} + alertSender := &mocks.AlertSenderMock{} recipient := "recipient@test.com" alertSender.On("SendAlert", mock.AnythingOfType("context.backgroundCtx"), @@ -52,9 +53,9 @@ func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { } func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { - bridge := &test.BridgeMock{} - provider := &test.ProviderMock{} - alertSender := &test.AlertSenderMock{} + bridge := &mocks.BridgeMock{} + provider := &mocks.ProviderMock{} + alertSender := &mocks.AlertSenderMock{} recipient := "recipient@test.com" alertSender.On("SendAlert", mock.AnythingOfType("context.backgroundCtx"), @@ -75,20 +76,20 @@ func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { func TestCheckLiquidityUseCase_Run_NoRecoverableErrorHandling(t *testing.T) { recipient := "anything" - cases := test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ + cases := test.Table[func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock), error]{ { - Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + Value: func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(0), assert.AnError).Once() }, }, { - Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + Value: func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(assert.AnError).Once() }, }, { - Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + Value: func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(assert.AnError).Once() @@ -96,9 +97,9 @@ func TestCheckLiquidityUseCase_Run_NoRecoverableErrorHandling(t *testing.T) { }, } for _, testCase := range cases { - bridge := &test.BridgeMock{} - provider := &test.ProviderMock{} - sender := &test.AlertSenderMock{} + bridge := &mocks.BridgeMock{} + provider := &mocks.ProviderMock{} + sender := &mocks.AlertSenderMock{} testCase.Value(bridge, provider, sender) useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, sender, recipient) err := useCase.Run(context.Background()) @@ -112,9 +113,9 @@ func TestCheckLiquidityUseCase_Run_NoRecoverableErrorHandling(t *testing.T) { func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { recipient := "anything" - cases := test.Table[func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock), error]{ + cases := test.Table[func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock), error]{ { - Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + Value: func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() @@ -122,7 +123,7 @@ func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { }, }, { - Value: func(bridge *test.BridgeMock, provider *test.ProviderMock, sender *test.AlertSenderMock) { + Value: func(bridge *mocks.BridgeMock, provider *mocks.ProviderMock, sender *mocks.AlertSenderMock) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() @@ -132,9 +133,9 @@ func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { } for _, testCase := range cases { - bridge := &test.BridgeMock{} - provider := &test.ProviderMock{} - sender := &test.AlertSenderMock{} + bridge := &mocks.BridgeMock{} + provider := &mocks.ProviderMock{} + sender := &mocks.AlertSenderMock{} buff := new(bytes.Buffer) testCase.Value(bridge, provider, sender) log.SetOutput(buff) diff --git a/internal/usecases/liquidity_provider/common.go b/internal/usecases/liquidity_provider/common.go index 6ae30792..ecdea8cf 100644 --- a/internal/usecases/liquidity_provider/common.go +++ b/internal/usecases/liquidity_provider/common.go @@ -2,18 +2,18 @@ package liquidity_provider import ( "cmp" - "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "slices" ) func ValidateConfiguredProvider( - provider entities.LiquidityProvider, + provider liquidity_provider.LiquidityProvider, lbc blockchain.LiquidityBridgeContract, ) (uint64, error) { var err error - var providers []entities.RegisteredLiquidityProvider + var providers []liquidity_provider.RegisteredLiquidityProvider if providers, err = lbc.GetProviders(); err != nil { return 0, err @@ -21,8 +21,8 @@ func ValidateConfiguredProvider( index, found := slices.BinarySearchFunc( providers, - entities.RegisteredLiquidityProvider{Address: provider.RskAddress()}, - func(a, b entities.RegisteredLiquidityProvider) int { + liquidity_provider.RegisteredLiquidityProvider{Address: provider.RskAddress()}, + func(a, b liquidity_provider.RegisteredLiquidityProvider) int { return cmp.Compare(a.Address, b.Address) }, ) diff --git a/internal/usecases/liquidity_provider/common_test.go b/internal/usecases/liquidity_provider/common_test.go index 1c717baf..1c8c0441 100644 --- a/internal/usecases/liquidity_provider/common_test.go +++ b/internal/usecases/liquidity_provider/common_test.go @@ -2,18 +2,18 @@ package liquidity_provider_test import ( "errors" - "github.com/rsksmart/liquidity-provider-server/internal/entities" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestValidateConfiguredProvider(t *testing.T) { - lbc := &test.LbcMock{} - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc := &mocks.LbcMock{} + lbc.On("GetProviders").Return([]lpEntity.RegisteredLiquidityProvider{ { Id: 1, Address: "0x01", @@ -40,7 +40,7 @@ func TestValidateConfiguredProvider(t *testing.T) { }, }, nil) - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("0x02") id, err := liquidity_provider.ValidateConfiguredProvider(provider, lbc) @@ -49,16 +49,16 @@ func TestValidateConfiguredProvider(t *testing.T) { } func TestValidateConfiguredProvider_Fail(t *testing.T) { - lbc := &test.LbcMock{} - var provider *test.ProviderMock = nil - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{}, errors.New("some error")).Once() + lbc := &mocks.LbcMock{} + var provider *mocks.ProviderMock = nil + lbc.On("GetProviders").Return([]lpEntity.RegisteredLiquidityProvider{}, errors.New("some error")).Once() id, err := liquidity_provider.ValidateConfiguredProvider(provider, lbc) assert.Equal(t, uint64(0), id) require.Error(t, err) - provider = &test.ProviderMock{} + provider = &mocks.ProviderMock{} provider.On("RskAddress").Return("0x02") - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc.On("GetProviders").Return([]lpEntity.RegisteredLiquidityProvider{ { Id: 3, Address: "0x03", diff --git a/internal/usecases/liquidity_provider/get_configuration.go b/internal/usecases/liquidity_provider/get_configuration.go new file mode 100644 index 00000000..237dda1e --- /dev/null +++ b/internal/usecases/liquidity_provider/get_configuration.go @@ -0,0 +1,38 @@ +package liquidity_provider + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" +) + +type GetConfigUseCase struct { + lp liquidity_provider.LiquidityProvider + peginLp liquidity_provider.PeginLiquidityProvider + pegoutLp liquidity_provider.PegoutLiquidityProvider +} + +func NewGetConfigUseCase( + lp liquidity_provider.LiquidityProvider, + peginLp liquidity_provider.PeginLiquidityProvider, + pegoutLp liquidity_provider.PegoutLiquidityProvider, +) *GetConfigUseCase { + return &GetConfigUseCase{lp: lp, peginLp: peginLp, pegoutLp: pegoutLp} +} + +type FullConfiguration struct { + General liquidity_provider.GeneralConfiguration `json:"general"` + Pegin liquidity_provider.PeginConfiguration `json:"pegin"` + Pegout liquidity_provider.PegoutConfiguration `json:"pegout"` +} + +func (useCase *GetConfigUseCase) Run(ctx context.Context) FullConfiguration { + general := useCase.lp.GeneralConfiguration(ctx) + pegin := useCase.peginLp.PeginConfiguration(ctx) + pegout := useCase.pegoutLp.PegoutConfiguration(ctx) + + return FullConfiguration{ + General: general, + Pegin: pegin, + Pegout: pegout, + } +} diff --git a/internal/usecases/liquidity_provider/get_configuration_test.go b/internal/usecases/liquidity_provider/get_configuration_test.go new file mode 100644 index 00000000..34922c4d --- /dev/null +++ b/internal/usecases/liquidity_provider/get_configuration_test.go @@ -0,0 +1,26 @@ +package liquidity_provider_test + +import ( + "context" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/require" + "testing" +) + +func TestGetConfigUseCase_Run(t *testing.T) { + lpMock := &mocks.ProviderMock{} + lpMock.On("GeneralConfiguration", test.AnyCtx).Return(lp.DefaultGeneralConfiguration()) + lpMock.On("PeginConfiguration", test.AnyCtx).Return(lp.DefaultPeginConfiguration()) + lpMock.On("PegoutConfiguration", test.AnyCtx).Return(lp.DefaultPegoutConfiguration()) + useCase := liquidity_provider.NewGetConfigUseCase(lpMock, lpMock, lpMock) + result := useCase.Run(context.Background()) + lpMock.AssertExpectations(t) + require.Equal(t, liquidity_provider.FullConfiguration{ + General: lp.DefaultGeneralConfiguration(), + Pegin: lp.DefaultPeginConfiguration(), + Pegout: lp.DefaultPegoutConfiguration(), + }, result) +} diff --git a/internal/usecases/liquidity_provider/get_providers.go b/internal/usecases/liquidity_provider/get_providers.go index cd5092b9..7bc1a796 100644 --- a/internal/usecases/liquidity_provider/get_providers.go +++ b/internal/usecases/liquidity_provider/get_providers.go @@ -1,8 +1,8 @@ package liquidity_provider import ( - "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) @@ -14,9 +14,9 @@ func NewGetProvidersUseCase(lbc blockchain.LiquidityBridgeContract) *GetProvider return &GetProvidersUseCase{lbc: lbc} } -func (useCase *GetProvidersUseCase) Run() ([]entities.RegisteredLiquidityProvider, error) { +func (useCase *GetProvidersUseCase) Run() ([]liquidity_provider.RegisteredLiquidityProvider, error) { var err error - var providers []entities.RegisteredLiquidityProvider + var providers []liquidity_provider.RegisteredLiquidityProvider if providers, err = useCase.lbc.GetProviders(); err != nil { return providers, usecases.WrapUseCaseError(usecases.GetProvidersId, err) } diff --git a/internal/usecases/liquidity_provider/get_providers_test.go b/internal/usecases/liquidity_provider/get_providers_test.go index 17c7c60c..5650f652 100644 --- a/internal/usecases/liquidity_provider/get_providers_test.go +++ b/internal/usecases/liquidity_provider/get_providers_test.go @@ -2,18 +2,18 @@ package liquidity_provider_test import ( "errors" - "github.com/rsksmart/liquidity-provider-server/internal/entities" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestGetProvidersUseCase_Run(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} - provider := entities.RegisteredLiquidityProvider{ + provider := lpEntity.RegisteredLiquidityProvider{ Id: 1, Address: "0x01", Name: "one", @@ -21,21 +21,21 @@ func TestGetProvidersUseCase_Run(t *testing.T) { Status: true, ProviderType: "both", } - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{provider}, nil).Once() + lbc.On("GetProviders").Return([]lpEntity.RegisteredLiquidityProvider{provider}, nil).Once() useCase := liquidity_provider.NewGetProvidersUseCase(lbc) result, err := useCase.Run() lbc.AssertExpectations(t) require.NoError(t, err) - assert.Equal(t, []entities.RegisteredLiquidityProvider{provider}, result) + assert.Equal(t, []lpEntity.RegisteredLiquidityProvider{provider}, result) } func TestGetProvidersUseCase_Run_Fail(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} lbc.On("GetProviders").Return( - []entities.RegisteredLiquidityProvider{}, + []lpEntity.RegisteredLiquidityProvider{}, errors.New("some error"), ).Once() @@ -44,5 +44,5 @@ func TestGetProvidersUseCase_Run_Fail(t *testing.T) { lbc.AssertExpectations(t) require.Error(t, err) - assert.Equal(t, []entities.RegisteredLiquidityProvider{}, result) + assert.Equal(t, []lpEntity.RegisteredLiquidityProvider{}, result) } diff --git a/internal/usecases/liquidity_provider/penalization_alert_test.go b/internal/usecases/liquidity_provider/penalization_alert_test.go index e7c626d4..38c6f33c 100644 --- a/internal/usecases/liquidity_provider/penalization_alert_test.go +++ b/internal/usecases/liquidity_provider/penalization_alert_test.go @@ -4,8 +4,9 @@ import ( "context" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -13,8 +14,8 @@ import ( ) func TestPenalizationAlertUseCase_Run(t *testing.T) { - lbc := &test.LbcMock{} - events := []entities.PunishmentEvent{ + lbc := &mocks.LbcMock{} + events := []lp.PunishmentEvent{ { LiquidityProvider: "0x01", Penalty: entities.NewWei(100), @@ -39,7 +40,7 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { &toBlock, ).Return(events, nil).Once() - sender := &test.AlertSenderMock{} + sender := &mocks.AlertSenderMock{} recipient := "recipient@test.com" for i := 0; i < 3; i++ { @@ -60,10 +61,10 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { } func TestPenalizationAlertUseCase_Run_GetEvents(t *testing.T) { - lbc := &test.LbcMock{} - sender := &test.AlertSenderMock{} + lbc := &mocks.LbcMock{} + sender := &mocks.AlertSenderMock{} lbc.On("GetPeginPunishmentEvents", mock.AnythingOfType("context.backgroundCtx"), uint64(5), mock.Anything). - Return([]entities.PunishmentEvent{}, assert.AnError).Once() + Return([]lp.PunishmentEvent{}, assert.AnError).Once() useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, "recipient") err := useCase.Run(context.Background(), 5, 10) lbc.AssertExpectations(t) diff --git a/internal/usecases/liquidity_provider/provider_detail.go b/internal/usecases/liquidity_provider/provider_detail.go index 0d4accf4..8db52844 100644 --- a/internal/usecases/liquidity_provider/provider_detail.go +++ b/internal/usecases/liquidity_provider/provider_detail.go @@ -1,51 +1,58 @@ package liquidity_provider import ( + "context" "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type GetDetailUseCase struct { captchaSiteKey string - peginProvider entities.PeginLiquidityProvider - pegoutProvider entities.PegoutLiquidityProvider + provider liquidity_provider.LiquidityProvider + peginProvider liquidity_provider.PeginLiquidityProvider + pegoutProvider liquidity_provider.PegoutLiquidityProvider } func NewGetDetailUseCase( captchaSiteKey string, - peginProvider entities.PeginLiquidityProvider, - pegoutProvider entities.PegoutLiquidityProvider, + provider liquidity_provider.LiquidityProvider, + peginProvider liquidity_provider.PeginLiquidityProvider, + pegoutProvider liquidity_provider.PegoutLiquidityProvider, ) *GetDetailUseCase { return &GetDetailUseCase{ captchaSiteKey: captchaSiteKey, + provider: provider, peginProvider: peginProvider, pegoutProvider: pegoutProvider, } } type FullLiquidityProvider struct { - SiteKey string `json:"siteKey"` - Pegin entities.LiquidityProviderDetail `json:"pegin"` - Pegout entities.LiquidityProviderDetail `json:"pegout"` + SiteKey string `json:"siteKey"` + Pegin liquidity_provider.LiquidityProviderDetail `json:"pegin"` + Pegout liquidity_provider.LiquidityProviderDetail `json:"pegout"` } -func (useCase *GetDetailUseCase) Run() (FullLiquidityProvider, error) { +func (useCase *GetDetailUseCase) Run(ctx context.Context) (FullLiquidityProvider, error) { var err error - + generalConfiguration := useCase.provider.GeneralConfiguration(ctx) + peginConfig := useCase.peginProvider.PeginConfiguration(ctx) + pegoutConfig := useCase.pegoutProvider.PegoutConfiguration(ctx) detail := FullLiquidityProvider{ SiteKey: useCase.captchaSiteKey, - Pegin: entities.LiquidityProviderDetail{ - Fee: useCase.peginProvider.CallFeePegin(), - MinTransactionValue: useCase.peginProvider.MinPegin(), - MaxTransactionValue: useCase.peginProvider.MaxPegin(), - RequiredConfirmations: useCase.peginProvider.MaxPeginConfirmations(), + Pegin: liquidity_provider.LiquidityProviderDetail{ + Fee: peginConfig.CallFee, + MinTransactionValue: peginConfig.MinValue, + MaxTransactionValue: peginConfig.MaxValue, + RequiredConfirmations: generalConfiguration.BtcConfirmations.Max(), }, - Pegout: entities.LiquidityProviderDetail{ - Fee: useCase.pegoutProvider.CallFeePegout(), - MinTransactionValue: useCase.pegoutProvider.MinPegout(), - MaxTransactionValue: useCase.pegoutProvider.MaxPegout(), - RequiredConfirmations: useCase.pegoutProvider.MaxPegoutConfirmations(), + Pegout: liquidity_provider.LiquidityProviderDetail{ + Fee: pegoutConfig.CallFee, + MinTransactionValue: pegoutConfig.MinValue, + MaxTransactionValue: pegoutConfig.MaxValue, + RequiredConfirmations: generalConfiguration.RskConfirmations.Max(), }, } diff --git a/internal/usecases/liquidity_provider/provider_detail_test.go b/internal/usecases/liquidity_provider/provider_detail_test.go index 90dd95d6..791e41d0 100644 --- a/internal/usecases/liquidity_provider/provider_detail_test.go +++ b/internal/usecases/liquidity_provider/provider_detail_test.go @@ -1,37 +1,34 @@ package liquidity_provider_test import ( + "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "testing" ) func TestGetDetailUseCase_Run(t *testing.T) { - provider := &test.ProviderMock{} - provider.On("CallFeePegin").Return(entities.NewWei(100)) - provider.On("MinPegin").Return(entities.NewWei(1000)) - provider.On("MaxPegin").Return(entities.NewWei(10000)) - provider.On("MaxPeginConfirmations").Return(uint16(10)) - provider.On("CallFeePegout").Return(entities.NewWei(200)) - provider.On("MinPegout").Return(entities.NewWei(2000)) - provider.On("MaxPegout").Return(entities.NewWei(20000)) - provider.On("MaxPegoutConfirmations").Return(uint16(20)) + provider := &mocks.ProviderMock{} + prepareDetailMock(provider) captchaKey := "testKey" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) - result, err := useCase.Run() + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + result, err := useCase.Run(context.Background()) require.NoError(t, err) assert.Equal(t, liquidity_provider.FullLiquidityProvider{ SiteKey: captchaKey, - Pegin: entities.LiquidityProviderDetail{ + Pegin: lp.LiquidityProviderDetail{ Fee: entities.NewWei(100), MinTransactionValue: entities.NewWei(1000), MaxTransactionValue: entities.NewWei(10000), RequiredConfirmations: 10, }, - Pegout: entities.LiquidityProviderDetail{ + Pegout: lp.LiquidityProviderDetail{ Fee: entities.NewWei(200), MinTransactionValue: entities.NewWei(2000), MaxTransactionValue: entities.NewWei(20000), @@ -41,53 +38,65 @@ func TestGetDetailUseCase_Run(t *testing.T) { } func TestGetDetailUseCase_Run_InvalidCaptchaKey(t *testing.T) { - provider := &test.ProviderMock{} - provider.On("CallFeePegin").Return(entities.NewWei(100)) - provider.On("MinPegin").Return(entities.NewWei(1000)) - provider.On("MaxPegin").Return(entities.NewWei(10000)) - provider.On("MaxPeginConfirmations").Return(uint16(10)) - provider.On("CallFeePegout").Return(entities.NewWei(200)) - provider.On("MinPegout").Return(entities.NewWei(2000)) - provider.On("MaxPegout").Return(entities.NewWei(20000)) - provider.On("MaxPegoutConfirmations").Return(uint16(20)) + provider := &mocks.ProviderMock{} + prepareDetailMock(provider) captchaKey := "" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) - _, err := useCase.Run() + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + _, err := useCase.Run(context.Background()) assert.Equal(t, "ProviderDetail: missing captcha key", err.Error()) } func TestGetDetailUseCase_Run_InvalidPeginDetail(t *testing.T) { var nilWei *entities.Wei - provider := &test.ProviderMock{} - provider.On("CallFeePegin").Return(entities.NewWei(100)) - provider.On("MinPegin").Return(nilWei) - provider.On("MaxPegin").Return(entities.NewWei(10000)) - provider.On("MaxPeginConfirmations").Return(uint16(10)) - provider.On("CallFeePegout").Return(entities.NewWei(200)) - provider.On("MinPegout").Return(entities.NewWei(2000)) - provider.On("MaxPegout").Return(entities.NewWei(20000)) - provider.On("MaxPegoutConfirmations").Return(uint16(20)) + provider := &mocks.ProviderMock{} + ctx := context.Background() + prepareDetailMock(provider) + config := provider.PeginConfiguration(ctx) + config.MinValue = nilWei + provider.On("PeginConfiguration", mock.AnythingOfType("context.backgroundCtx")).Return(config) captchaKey := "testKey" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) - _, err := useCase.Run() + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + _, err := useCase.Run(ctx) assert.Equal(t, "ProviderDetail: Key: 'LiquidityProviderDetail.MinTransactionValue' "+ "Error:Field validation for 'MinTransactionValue' failed on the 'required' tag", err.Error()) } func TestGetDetailUseCase_Run_InvalidPegoutDetail(t *testing.T) { var nilWei *entities.Wei - provider := &test.ProviderMock{} - provider.On("CallFeePegin").Return(entities.NewWei(100)) - provider.On("MinPegin").Return(entities.NewWei(1000)) - provider.On("MaxPegin").Return(entities.NewWei(10000)) - provider.On("MaxPeginConfirmations").Return(uint16(10)) - provider.On("CallFeePegout").Return(entities.NewWei(200)) - provider.On("MinPegout").Return(nilWei) - provider.On("MaxPegout").Return(entities.NewWei(20000)) - provider.On("MaxPegoutConfirmations").Return(uint16(20)) + provider := &mocks.ProviderMock{} + ctx := context.Background() + prepareDetailMock(provider) + config := provider.PegoutConfiguration(ctx) + config.MinValue = nilWei + provider.On("PegoutConfiguration", mock.AnythingOfType("context.backgroundCtx")).Return(config) captchaKey := "testKey" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider) - _, err := useCase.Run() + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + _, err := useCase.Run(ctx) assert.Equal(t, "ProviderDetail: Key: 'LiquidityProviderDetail.MinTransactionValue' "+ "Error:Field validation for 'MinTransactionValue' failed on the 'required' tag", err.Error()) } + +func prepareDetailMock(provider *mocks.ProviderMock) { + provider.On("PeginConfiguration", test.AnyCtx).Return(lp.PeginConfiguration{ + TimeForDeposit: lp.PeginTimeForDeposit, + CallTime: lp.PeginCallTime, + PenaltyFee: entities.NewWei(lp.PeginPenaltyFee), + CallFee: entities.NewWei(100), + MaxValue: entities.NewWei(10000), + MinValue: entities.NewWei(1000), + }).Once() + provider.On("PegoutConfiguration", test.AnyCtx).Return(lp.PegoutConfiguration{ + TimeForDeposit: lp.PegoutTimeForDeposit, + CallTime: lp.PegoutCallTime, + PenaltyFee: entities.NewWei(lp.PegoutPenaltyFee), + CallFee: entities.NewWei(200), + MaxValue: entities.NewWei(20000), + MinValue: entities.NewWei(2000), + ExpireBlocks: lp.PegoutExpireBlocks, + }).Once() + provider.On("GeneralConfiguration", test.AnyCtx). + Return(lp.GeneralConfiguration{ + RskConfirmations: map[int]uint16{1: 20}, + BtcConfirmations: map[int]uint16{1: 10}, + }).Once() +} diff --git a/internal/usecases/liquidity_provider/registration.go b/internal/usecases/liquidity_provider/registration.go index 20de1905..613e147a 100644 --- a/internal/usecases/liquidity_provider/registration.go +++ b/internal/usecases/liquidity_provider/registration.go @@ -3,16 +3,17 @@ package liquidity_provider import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" ) type RegistrationUseCase struct { lbc blockchain.LiquidityBridgeContract - provider entities.LiquidityProvider + provider liquidity_provider.LiquidityProvider } -func NewRegistrationUseCase(lbc blockchain.LiquidityBridgeContract, provider entities.LiquidityProvider) *RegistrationUseCase { +func NewRegistrationUseCase(lbc blockchain.LiquidityBridgeContract, provider liquidity_provider.LiquidityProvider) *RegistrationUseCase { return &RegistrationUseCase{lbc: lbc, provider: provider} } @@ -75,9 +76,9 @@ func (useCase *RegistrationUseCase) Run(params blockchain.ProviderRegistrationPa } func (useCase *RegistrationUseCase) isProviderReady(addedCollateral addedCollateralInfo, providerParams blockchain.ProviderRegistrationParams) bool { - return (addedCollateral.pegin && providerParams.Type == entities.PeginProvider) || - (addedCollateral.pegout && providerParams.Type == entities.PegoutProvider) || - (addedCollateral.pegin && addedCollateral.pegout && providerParams.Type == entities.FullProvider) + return (addedCollateral.pegin && providerParams.Type == liquidity_provider.PeginProvider) || + (addedCollateral.pegout && providerParams.Type == liquidity_provider.PegoutProvider) || + (addedCollateral.pegin && addedCollateral.pegout && providerParams.Type == liquidity_provider.FullProvider) } func (useCase *RegistrationUseCase) getCollateralInfo() (collateralInfo, error) { @@ -117,10 +118,10 @@ func (useCase *RegistrationUseCase) getOperationalInfo() (operationalInfo, error }, nil } -func (useCase *RegistrationUseCase) isProviderOperational(providerType entities.ProviderType, operational operationalInfo) bool { - return (providerType == entities.FullProvider && operational.operationalForPegin && operational.operationalForPegout) || - (providerType == entities.PeginProvider && operational.operationalForPegin) || - (providerType == entities.PegoutProvider && operational.operationalForPegout) +func (useCase *RegistrationUseCase) isProviderOperational(providerType liquidity_provider.ProviderType, operational operationalInfo) bool { + return (providerType == liquidity_provider.FullProvider && operational.operationalForPegin && operational.operationalForPegout) || + (providerType == liquidity_provider.PeginProvider && operational.operationalForPegin) || + (providerType == liquidity_provider.PegoutProvider && operational.operationalForPegout) } func (useCase *RegistrationUseCase) registerProvider(params blockchain.ProviderRegistrationParams, collateral collateralInfo) (int64, error) { @@ -138,7 +139,7 @@ func (useCase *RegistrationUseCase) validateParams(params blockchain.ProviderReg if err = entities.ValidateStruct(params); err != nil { return usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } else if !params.Type.IsValid() { - return usecases.WrapUseCaseError(usecases.ProviderRegistrationId, entities.InvalidProviderTypeError) + return usecases.WrapUseCaseError(usecases.ProviderRegistrationId, liquidity_provider.InvalidProviderTypeError) } return nil } diff --git a/internal/usecases/liquidity_provider/registration_test.go b/internal/usecases/liquidity_provider/registration_test.go index c26a411d..0159ca37 100644 --- a/internal/usecases/liquidity_provider/registration_test.go +++ b/internal/usecases/liquidity_provider/registration_test.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -13,13 +14,13 @@ import ( ) func TestRegistrationUseCase_Run_AlreadyRegistered(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(true, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(true, nil) - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") @@ -38,8 +39,8 @@ func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { blockchain.NewProviderRegistrationParams("name", "url.com", true, "anything"), blockchain.NewProviderRegistrationParams("", "url.com", true, ""), } - lbc := &test.LbcMock{} - provider := &test.ProviderMock{} + lbc := &mocks.LbcMock{} + provider := &mocks.ProviderMock{} useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) var id int64 var err error @@ -51,14 +52,14 @@ func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { } func TestRegistrationUseCase_Run_AddPeginCollateralIfNotOperational(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegin") @@ -71,14 +72,14 @@ func TestRegistrationUseCase_Run_AddPeginCollateralIfNotOperational(t *testing.T } func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegout") @@ -91,7 +92,7 @@ func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing. } func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(999), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(999), nil) @@ -99,7 +100,7 @@ func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") @@ -111,7 +112,7 @@ func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { } func TestRegistrationUseCase_Run(t *testing.T) { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(0), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(0), nil) @@ -122,7 +123,7 @@ func TestRegistrationUseCase_Run(t *testing.T) { mock.AnythingOfType("blockchain.TransactionConfig"), mock.AnythingOfType("ProviderRegistrationParams")). Return(int64(1), nil) - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") @@ -139,9 +140,9 @@ func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { cases := registrationUseCaseUnexpectedErrorSetups() for _, testCase := range cases { - lbc := &test.LbcMock{} + lbc := &mocks.LbcMock{} testCase.Value(lbc) // setup function - provider := &test.ProviderMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") @@ -153,28 +154,28 @@ func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { } // nolint:funlen -func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *test.LbcMock), error] { - return test.Table[func(mock *test.LbcMock), error]{ +func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *mocks.LbcMock), error] { + return test.Table[func(mock *mocks.LbcMock), error]{ { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(0), assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(0), assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(0), assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) @@ -182,7 +183,7 @@ func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *test.LbcMo }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) @@ -191,7 +192,7 @@ func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *test.LbcMo }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(0), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(0), nil) @@ -205,7 +206,7 @@ func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *test.LbcMo }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(10), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(10), nil) @@ -215,7 +216,7 @@ func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *test.LbcMo }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(1000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(10), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(10), nil) diff --git a/internal/usecases/liquidity_provider/resign.go b/internal/usecases/liquidity_provider/resign.go index 3ec9010a..56e11f32 100644 --- a/internal/usecases/liquidity_provider/resign.go +++ b/internal/usecases/liquidity_provider/resign.go @@ -1,17 +1,17 @@ package liquidity_provider import ( - "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type ResignUseCase struct { lbc blockchain.LiquidityBridgeContract - provider entities.LiquidityProvider + provider liquidity_provider.LiquidityProvider } -func NewResignUseCase(lbc blockchain.LiquidityBridgeContract, provider entities.LiquidityProvider) *ResignUseCase { +func NewResignUseCase(lbc blockchain.LiquidityBridgeContract, provider liquidity_provider.LiquidityProvider) *ResignUseCase { return &ResignUseCase{lbc: lbc, provider: provider} } diff --git a/internal/usecases/liquidity_provider/resign_test.go b/internal/usecases/liquidity_provider/resign_test.go index 59848748..309d53b5 100644 --- a/internal/usecases/liquidity_provider/resign_test.go +++ b/internal/usecases/liquidity_provider/resign_test.go @@ -1,20 +1,20 @@ package liquidity_provider_test import ( - "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestResignUseCase_Run(t *testing.T) { - lbc := &test.LbcMock{} - provider := &test.ProviderMock{} + lbc := &mocks.LbcMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("0x01") - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc.On("GetProviders").Return([]lp.RegisteredLiquidityProvider{ { Id: 1, Address: "0x01", @@ -28,10 +28,10 @@ func TestResignUseCase_Run(t *testing.T) { } func TestResignUseCase_Run_NotRegistered(t *testing.T) { - lbc := &test.LbcMock{} - provider := &test.ProviderMock{} + lbc := &mocks.LbcMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("0x01") - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc.On("GetProviders").Return([]lp.RegisteredLiquidityProvider{ { Id: 2, Address: "0x02", @@ -44,10 +44,10 @@ func TestResignUseCase_Run_NotRegistered(t *testing.T) { } func TestResignUseCase_Run_Error(t *testing.T) { - lbc := &test.LbcMock{} - provider := &test.ProviderMock{} + lbc := &mocks.LbcMock{} + provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("0x01") - lbc.On("GetProviders").Return([]entities.RegisteredLiquidityProvider{ + lbc.On("GetProviders").Return([]lp.RegisteredLiquidityProvider{ { Id: 1, Address: "0x01", diff --git a/internal/usecases/liquidity_provider/set_general_config.go b/internal/usecases/liquidity_provider/set_general_config.go new file mode 100644 index 00000000..71dc696b --- /dev/null +++ b/internal/usecases/liquidity_provider/set_general_config.go @@ -0,0 +1,34 @@ +package liquidity_provider + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type SetGeneralConfigUseCase struct { + lpRepository liquidity_provider.LiquidityProviderRepository + signer entities.Signer + hashFunc entities.HashFunction +} + +func NewSetGeneralConfigUseCase( + lpRepository liquidity_provider.LiquidityProviderRepository, + signer entities.Signer, + hashFunc entities.HashFunction, +) *SetGeneralConfigUseCase { + return &SetGeneralConfigUseCase{lpRepository: lpRepository, signer: signer, hashFunc: hashFunc} +} + +func (useCase *SetGeneralConfigUseCase) Run(ctx context.Context, config liquidity_provider.GeneralConfiguration) error { + signedConfig, err := usecases.SignConfiguration(usecases.SetGeneralConfigId, useCase.signer, useCase.hashFunc, config) + if err != nil { + return err + } + err = useCase.lpRepository.UpsertGeneralConfiguration(ctx, signedConfig) + if err != nil { + return usecases.WrapUseCaseError(usecases.SetGeneralConfigId, err) + } + return nil +} diff --git a/internal/usecases/liquidity_provider/set_general_config_test.go b/internal/usecases/liquidity_provider/set_general_config_test.go new file mode 100644 index 00000000..a6ebf1df --- /dev/null +++ b/internal/usecases/liquidity_provider/set_general_config_test.go @@ -0,0 +1,75 @@ +package liquidity_provider_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +func TestSetGeneralConfigUseCase_Run(t *testing.T) { + config := entities.Signed[lp.GeneralConfiguration]{ + Value: lp.GeneralConfiguration{ + RskConfirmations: map[int]uint16{5: 10}, + BtcConfirmations: map[int]uint16{10: 20}, + }, + Signature: "010203", + Hash: "040506", + } + + lpRepository := &mocks.LpRepositoryMock{} + lpRepository.On("UpsertGeneralConfiguration", test.AnyCtx, config).Return(nil) + walletMock := &mocks.RskWalletMock{} + walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) + + useCase := liquidity_provider.NewSetGeneralConfigUseCase(lpRepository, walletMock, hashMock.Hash) + + err := useCase.Run(context.Background(), config.Value) + require.NoError(t, err) + lpRepository.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) +} + +func TestSetGeneralConfigUseCase_Run_ErrorHandling(t *testing.T) { + config := entities.Signed[lp.GeneralConfiguration]{ + Value: lp.GeneralConfiguration{ + RskConfirmations: map[int]uint16{5: 10}, + BtcConfirmations: map[int]uint16{10: 20}, + }, + Signature: "010203", + Hash: "040506", + } + + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) + + errorSetups := []func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock){ + func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError) + }, + func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) + lpRepository.On("UpsertGeneralConfiguration", test.AnyCtx, config).Return(assert.AnError) + }, + } + + for _, errorSetup := range errorSetups { + lpRepository := &mocks.LpRepositoryMock{} + walletMock := &mocks.RskWalletMock{} + errorSetup(lpRepository, walletMock) + useCase := liquidity_provider.NewSetGeneralConfigUseCase(lpRepository, walletMock, hashMock.Hash) + err := useCase.Run(context.Background(), config.Value) + require.Error(t, err) + lpRepository.AssertExpectations(t) + walletMock.AssertExpectations(t) + } +} diff --git a/internal/usecases/liquidity_provider/set_pegin_config.go b/internal/usecases/liquidity_provider/set_pegin_config.go new file mode 100644 index 00000000..54c6fa65 --- /dev/null +++ b/internal/usecases/liquidity_provider/set_pegin_config.go @@ -0,0 +1,34 @@ +package liquidity_provider + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type SetPeginConfigUseCase struct { + lpRepository liquidity_provider.LiquidityProviderRepository + signer entities.Signer + hashFunc entities.HashFunction +} + +func NewSetPeginConfigUseCase( + lpRepository liquidity_provider.LiquidityProviderRepository, + signer entities.Signer, + hashFunc entities.HashFunction, +) *SetPeginConfigUseCase { + return &SetPeginConfigUseCase{lpRepository: lpRepository, signer: signer, hashFunc: hashFunc} +} + +func (useCase *SetPeginConfigUseCase) Run(ctx context.Context, config liquidity_provider.PeginConfiguration) error { + signedConfig, err := usecases.SignConfiguration(usecases.SetPeginConfigId, useCase.signer, useCase.hashFunc, config) + if err != nil { + return err + } + err = useCase.lpRepository.UpsertPeginConfiguration(ctx, signedConfig) + if err != nil { + return usecases.WrapUseCaseError(usecases.SetPeginConfigId, err) + } + return nil +} diff --git a/internal/usecases/liquidity_provider/set_pegin_config_test.go b/internal/usecases/liquidity_provider/set_pegin_config_test.go new file mode 100644 index 00000000..7f800148 --- /dev/null +++ b/internal/usecases/liquidity_provider/set_pegin_config_test.go @@ -0,0 +1,70 @@ +package liquidity_provider_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +var peginConfigMock = entities.Signed[lp.PeginConfiguration]{ + Value: lp.PeginConfiguration{ + TimeForDeposit: 1, + CallTime: 2, + PenaltyFee: entities.NewWei(3), + CallFee: entities.NewWei(4), + MaxValue: entities.NewWei(5), + MinValue: entities.NewWei(1), + }, + Signature: "010203", + Hash: "040506", +} + +func TestSetPeginConfigUseCase_Run(t *testing.T) { + lpRepository := &mocks.LpRepositoryMock{} + lpRepository.On("UpsertPeginConfiguration", test.AnyCtx, peginConfigMock).Return(nil) + walletMock := &mocks.RskWalletMock{} + walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) + + useCase := liquidity_provider.NewSetPeginConfigUseCase(lpRepository, walletMock, hashMock.Hash) + + err := useCase.Run(context.Background(), peginConfigMock.Value) + require.NoError(t, err) + lpRepository.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) +} + +func TestSetPeginConfigUseCase_Run_ErrorHandling(t *testing.T) { + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) + + errorSetups := []func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock){ + func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError) + }, + func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) + lpRepository.On("UpsertPeginConfiguration", test.AnyCtx, peginConfigMock).Return(assert.AnError) + }, + } + + for _, errorSetup := range errorSetups { + lpRepository := &mocks.LpRepositoryMock{} + walletMock := &mocks.RskWalletMock{} + errorSetup(lpRepository, walletMock) + useCase := liquidity_provider.NewSetPeginConfigUseCase(lpRepository, walletMock, hashMock.Hash) + err := useCase.Run(context.Background(), peginConfigMock.Value) + require.Error(t, err) + lpRepository.AssertExpectations(t) + walletMock.AssertExpectations(t) + } +} diff --git a/internal/usecases/liquidity_provider/set_pegout_config.go b/internal/usecases/liquidity_provider/set_pegout_config.go new file mode 100644 index 00000000..ba261a0d --- /dev/null +++ b/internal/usecases/liquidity_provider/set_pegout_config.go @@ -0,0 +1,34 @@ +package liquidity_provider + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type SetPegoutConfigUseCase struct { + lpRepository liquidity_provider.LiquidityProviderRepository + signer entities.Signer + hashFunc entities.HashFunction +} + +func NewSetPegoutConfigUseCase( + lpRepository liquidity_provider.LiquidityProviderRepository, + signer entities.Signer, + hashFunc entities.HashFunction, +) *SetPegoutConfigUseCase { + return &SetPegoutConfigUseCase{lpRepository: lpRepository, signer: signer, hashFunc: hashFunc} +} + +func (useCase *SetPegoutConfigUseCase) Run(ctx context.Context, config liquidity_provider.PegoutConfiguration) error { + signedConfig, err := usecases.SignConfiguration(usecases.SetPegoutConfigId, useCase.signer, useCase.hashFunc, config) + if err != nil { + return err + } + err = useCase.lpRepository.UpsertPegoutConfiguration(ctx, signedConfig) + if err != nil { + return usecases.WrapUseCaseError(usecases.SetPegoutConfigId, err) + } + return nil +} diff --git a/internal/usecases/liquidity_provider/set_pegout_config_test.go b/internal/usecases/liquidity_provider/set_pegout_config_test.go new file mode 100644 index 00000000..654101f9 --- /dev/null +++ b/internal/usecases/liquidity_provider/set_pegout_config_test.go @@ -0,0 +1,71 @@ +package liquidity_provider_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +var pegoutConfigMock = entities.Signed[lp.PegoutConfiguration]{ + Value: lp.PegoutConfiguration{ + TimeForDeposit: 1, + CallTime: 2, + PenaltyFee: entities.NewWei(3), + CallFee: entities.NewWei(4), + MaxValue: entities.NewWei(5), + MinValue: entities.NewWei(1), + ExpireBlocks: 10, + }, + Signature: "010203", + Hash: "040506", +} + +func TestSetPegoutConfigUseCase_Run(t *testing.T) { + lpRepository := &mocks.LpRepositoryMock{} + lpRepository.On("UpsertPegoutConfiguration", test.AnyCtx, pegoutConfigMock).Return(nil) + walletMock := &mocks.RskWalletMock{} + walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) + + useCase := liquidity_provider.NewSetPegoutConfigUseCase(lpRepository, walletMock, hashMock.Hash) + + err := useCase.Run(context.Background(), pegoutConfigMock.Value) + require.NoError(t, err) + lpRepository.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) +} + +func TestSetPegoutConfigUseCase_Run_ErrorHandling(t *testing.T) { + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) + + errorSetups := []func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock){ + func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError) + }, + func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) + lpRepository.On("UpsertPegoutConfiguration", test.AnyCtx, pegoutConfigMock).Return(assert.AnError) + }, + } + + for _, errorSetup := range errorSetups { + lpRepository := &mocks.LpRepositoryMock{} + walletMock := &mocks.RskWalletMock{} + errorSetup(lpRepository, walletMock) + useCase := liquidity_provider.NewSetPegoutConfigUseCase(lpRepository, walletMock, hashMock.Hash) + err := useCase.Run(context.Background(), pegoutConfigMock.Value) + require.Error(t, err) + lpRepository.AssertExpectations(t) + walletMock.AssertExpectations(t) + } +} diff --git a/internal/usecases/pegin/accept_pegin_quote.go b/internal/usecases/pegin/accept_pegin_quote.go index 2e79f143..4f638f6d 100644 --- a/internal/usecases/pegin/accept_pegin_quote.go +++ b/internal/usecases/pegin/accept_pegin_quote.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "sync" @@ -15,8 +16,8 @@ type AcceptQuoteUseCase struct { bridge blockchain.RootstockBridge btc blockchain.BitcoinNetwork rsk blockchain.RootstockRpcServer - lp entities.LiquidityProvider - peginLp entities.PeginLiquidityProvider + lp liquidity_provider.LiquidityProvider + peginLp liquidity_provider.PeginLiquidityProvider eventBus entities.EventBus peginLiquidityMutex sync.Locker } @@ -26,8 +27,8 @@ func NewAcceptQuoteUseCase( bridge blockchain.RootstockBridge, btc blockchain.BitcoinNetwork, rsk blockchain.RootstockRpcServer, - lp entities.LiquidityProvider, - peginLp entities.PeginLiquidityProvider, + lp liquidity_provider.LiquidityProvider, + peginLp liquidity_provider.PeginLiquidityProvider, eventBus entities.EventBus, peginLiquidityMutex sync.Locker, ) *AcceptQuoteUseCase { diff --git a/internal/usecases/pegin/accept_pegin_quote_test.go b/internal/usecases/pegin/accept_pegin_quote_test.go index 474c0f63..b43dff39 100644 --- a/internal/usecases/pegin/accept_pegin_quote_test.go +++ b/internal/usecases/pegin/accept_pegin_quote_test.go @@ -9,6 +9,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -47,7 +48,7 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { requiredLiquidity := entities.NewWei(9280000) fedInfo := blockchain.FederationInfo{ FedSize: 1, FedThreshold: 2, PubKeys: []string{"01", "02", "03"}, - FedAddress: "any address", ActiveFedBlockHeight: 500, + FedAddress: test.AnyAddress, ActiveFedBlockHeight: 500, IrisActivationHeight: 500, ErpKeys: []string{"04", "05", "06"}, } retainedQuote := quote.RetainedPeginQuote{ @@ -57,11 +58,11 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { RequiredLiquidity: requiredLiquidity, State: quote.PeginStateWaitingForDeposit, } - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("FetchFederationInfo").Return(fedInfo, nil) lbcParsedAddress, _ := hex.DecodeString(strings.TrimPrefix(testPeginQuote.LbcAddress, "0x")) refundParsedAddress := []byte{4, 5, 6} @@ -74,20 +75,20 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { LpBtcAddress: lpParsedAddress, QuoteHash: parsedHash, }).Return(blockchain.FlyoverDerivation{Address: acceptPeginDerivationAddress, RedeemScript: "any script"}, nil) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("DecodeAddress", testPeginQuote.BtcRefundAddress, true).Return(refundParsedAddress, nil) btc.On("DecodeAddress", testPeginQuote.LpBtcAddress, true).Return(lpParsedAddress, nil) - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), requiredLiquidity).Return(nil) lp.On("SignQuote", acceptPeginQuoteHash).Return(acceptPeginSignature, nil) - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPeginQuoteEvent) bool { return assert.Equal(t, testPeginQuote, event.Quote) && assert.Equal(t, retainedQuote, event.RetainedQuote) && assert.Equal(t, quote.AcceptedPeginQuoteEventId, event.Event.Id()) })).Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) @@ -114,18 +115,18 @@ func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { RequiredLiquidity: entities.NewWei(9280000), State: quote.PeginStateWaitingForDeposit, } - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&retainedQuote, nil) - bridge := new(test.BridgeMock) - btc := new(test.BtcRpcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + bridge := new(mocks.BridgeMock) + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) @@ -147,15 +148,15 @@ func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { } func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) - bridge := new(test.BridgeMock) - btc := new(test.BtcRpcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) - rsk := new(test.RskRpcMock) + bridge := new(mocks.BridgeMock) + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) @@ -178,15 +179,15 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { expiredQuote := testPeginQuote expiredQuote.AgreementTimestamp = uint32(time.Now().Unix()) - 1000 expiredQuote.TimeForDeposit = 500 - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&expiredQuote, nil) - bridge := new(test.BridgeMock) - btc := new(test.BtcRpcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) - rsk := new(test.RskRpcMock) + bridge := new(mocks.BridgeMock) + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) @@ -211,30 +212,30 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { FedSize: 1, FedThreshold: 2, PubKeys: []string{"01", "02", "03"}, - FedAddress: "any address", + FedAddress: test.AnyAddress, ActiveFedBlockHeight: 500, IrisActivationHeight: 500, ErpKeys: []string{"04", "05", "06"}, } - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("FetchFederationInfo").Return(fedInfo, nil) bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{ Address: "derivation address", RedeemScript: "any script", }, nil) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("DecodeAddress", testPeginQuote.BtcRefundAddress, true).Return([]byte{4, 5, 6}, nil) btc.On("DecodeAddress", testPeginQuote.LpBtcAddress, true).Return([]byte{7, 8, 9}, nil) - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), requiredLiquidity).Return(assert.AnError) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) @@ -252,19 +253,19 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { } func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.Anything).Return() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() setups := acceptQuoteUseCaseUnexpectedErrorSetups() for _, setup := range setups { - quoteRepository := new(test.PeginQuoteRepositoryMock) - bridge := new(test.BridgeMock) - btc := new(test.BtcRpcMock) - lp := new(test.ProviderMock) - rsk := new(test.RskRpcMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) + bridge := new(mocks.BridgeMock) + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + rsk := new(mocks.RskRpcMock) caseHash := acceptPeginQuoteHash setup(&caseHash, quoteRepository, bridge, btc, lp, rsk) useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) @@ -281,54 +282,54 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { } // nolint:funlen -func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, - bridge *test.BridgeMock, btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { +func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, + bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { fedInfo := blockchain.FederationInfo{ FedSize: 1, FedThreshold: 2, PubKeys: []string{"01", "02", "03"}, - FedAddress: "any address", + FedAddress: test.AnyAddress, ActiveFedBlockHeight: 500, IrisActivationHeight: 500, ErpKeys: []string{"04", "05", "06"}, } - derivation := blockchain.FlyoverDerivation{Address: "any address", RedeemScript: "any script"} - return []func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock){ - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + derivation := blockchain.FlyoverDerivation{Address: test.AnyAddress, RedeemScript: "any script"} + return []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock){ + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() *quoteHash = "malformed hash" }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { caseQuote := testPeginQuote caseQuote.LbcAddress = "malformed address" quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&caseQuote, nil).Once() @@ -336,16 +337,16 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(blockchain.FederationInfo{}, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -353,8 +354,8 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -363,8 +364,8 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -375,8 +376,8 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -388,8 +389,8 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, nil).Once() lp.On("SignQuote", mock.Anything).Return("", nil).Once() }, - func(quoteHash *string, quoteRepository *test.PeginQuoteRepositoryMock, bridge *test.BridgeMock, - btc *test.BtcRpcMock, lp *test.ProviderMock, rsk *test.RskRpcMock) { + func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() diff --git a/internal/usecases/pegin/add_collateral.go b/internal/usecases/pegin/add_collateral.go index 4645aabc..fdd4fc64 100644 --- a/internal/usecases/pegin/add_collateral.go +++ b/internal/usecases/pegin/add_collateral.go @@ -3,15 +3,16 @@ package pegin import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type AddCollateralUseCase struct { lbc blockchain.LiquidityBridgeContract - lp entities.LiquidityProvider + lp liquidity_provider.LiquidityProvider } -func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp entities.LiquidityProvider) *AddCollateralUseCase { +func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp liquidity_provider.LiquidityProvider) *AddCollateralUseCase { return &AddCollateralUseCase{lbc: lbc, lp: lp} } diff --git a/internal/usecases/pegin/add_collateral_test.go b/internal/usecases/pegin/add_collateral_test.go index fe1d5e67..cf2b7cb5 100644 --- a/internal/usecases/pegin/add_collateral_test.go +++ b/internal/usecases/pegin/add_collateral_test.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -12,8 +13,8 @@ import ( ) func TestAddCollateralUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("AddCollateral", value).Return(nil) @@ -28,8 +29,8 @@ func TestAddCollateralUseCase_Run(t *testing.T) { } func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("GetMinimumCollateral").Return(entities.NewWei(2000), nil) @@ -44,22 +45,22 @@ func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { } func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("rskAddress") - cases := test.Table[func(lbc *test.LbcMock), error]{ + cases := test.Table[func(lbc *mocks.LbcMock), error]{ { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(nil, assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) lbc.On("GetCollateral", mock.Anything).Return(nil, assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(100), nil) lbc.On("AddCollateral", mock.Anything).Return(assert.AnError) @@ -68,7 +69,7 @@ func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { } for _, c := range cases { - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) c.Value(lbc) useCase := pegin.NewAddCollateralUseCase(lbc, lp) result, err := useCase.Run(entities.NewWei(100)) diff --git a/internal/usecases/pegin/call_for_user.go b/internal/usecases/pegin/call_for_user.go index 824b5a5e..44747fdc 100644 --- a/internal/usecases/pegin/call_for_user.go +++ b/internal/usecases/pegin/call_for_user.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "math/big" @@ -16,7 +17,7 @@ type CallForUserUseCase struct { lbc blockchain.LiquidityBridgeContract quoteRepository quote.PeginQuoteRepository btc blockchain.BitcoinNetwork - peginProvider entities.LiquidityProvider + peginProvider liquidity_provider.LiquidityProvider eventBus entities.EventBus rsk blockchain.RootstockRpcServer rskWalletMutex sync.Locker @@ -26,7 +27,7 @@ func NewCallForUserUseCase( lbc blockchain.LiquidityBridgeContract, quoteRepository quote.PeginQuoteRepository, btc blockchain.BitcoinNetwork, - peginProvider entities.LiquidityProvider, + peginProvider liquidity_provider.LiquidityProvider, eventBus entities.EventBus, rsk blockchain.RootstockRpcServer, rskWalletMutex sync.Locker, diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go index 9b27f70e..fcbdf72c 100644 --- a/internal/usecases/pegin/call_for_user_test.go +++ b/internal/usecases/pegin/call_for_user_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -22,7 +23,7 @@ func TestCallForUserUseCase_Run(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, @@ -33,38 +34,38 @@ func TestCallForUserUseCase_Run(t *testing.T) { expectedRetainedQuote.CallForUserTxHash = callForUser expectedRetainedQuote.UserBtcTxHash = btcTx - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return(lpRskAddress).Once() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(50000), nil).Once() txConfig := blockchain.NewTransactionConfig(entities.NewWei(0), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) lbc.On("CallForUser", txConfig, testPeginQuote).Return(callForUser, nil).Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { require.NoError(t, event.Error) return assert.Equal(t, testPeginQuote, event.PeginQuote) && assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) @@ -84,7 +85,7 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { lpRskAddress := testPeginQuote.LpRskAddress retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, @@ -94,38 +95,38 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { expectedRetainedQuote.CallForUserTxHash = callForUser expectedRetainedQuote.UserBtcTxHash = btcTx - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return(lpRskAddress).Twice() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(600), nil).Once() txConfig := blockchain.NewTransactionConfig(entities.NewWei(29400), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) lbc.On("CallForUser", txConfig, testPeginQuote).Return(callForUser, nil).Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { require.NoError(t, event.Error) return assert.Equal(t, testPeginQuote, event.PeginQuote) && assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) @@ -152,16 +153,16 @@ func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { setups := callForUserRecoverableErrorSetups() for _, setup := range setups { - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("lp rsk address") - lbc := new(test.LbcMock) - btc := new(test.BtcRpcMock) - eventBus := new(test.EventBusMock) - rsk := new(test.RskRpcMock) - mutex := new(test.MutexMock) + lbc := new(mocks.LbcMock) + btc := new(mocks.BtcRpcMock) + eventBus := new(mocks.EventBusMock) + rsk := new(mocks.RskRpcMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) caseRetainedQuote := retainedPeginQuote setup(&caseRetainedQuote, rsk, lbc, btc, quoteRepository) @@ -172,7 +173,7 @@ func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { } } -func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { +func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { now := uint32(time.Now().Unix()) peginQuote := quote.PeginQuote{ FedBtcAddress: "fed address", @@ -196,19 +197,19 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine GasFee: entities.NewWei(500), ProductFeeAmount: 100, } - return []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock){ - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + return []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock){ + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { caseRetainedQuote.State = quote.PeginStateCallForUserSucceeded }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ @@ -218,7 +219,7 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine }, nil).Once() lbc.On("GetBalance", mock.Anything).Return(nil, assert.AnError).Once() }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *test.RskRpcMock, lbc *test.LbcMock, btc *test.BtcRpcMock, quoteRepository *test.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ @@ -235,16 +236,16 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, } - lp := new(test.ProviderMock) - lbc := new(test.LbcMock) + lp := new(mocks.ProviderMock) + lbc := new(mocks.LbcMock) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btcTx := "0x121a1b" btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, @@ -252,13 +253,13 @@ func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(2000)}}, }, nil).Once() - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) - quoteRepository := new(test.PeginQuoteRepositoryMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) @@ -278,16 +279,16 @@ func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { } func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { - lbc := new(test.LbcMock) - btc := new(test.BtcRpcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) - quoteRepository := new(test.PeginQuoteRepositoryMock) + lbc := new(mocks.LbcMock) + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, @@ -308,7 +309,7 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) @@ -323,16 +324,16 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { } func TestCallForUserUseCase_Run_QuoteNotFound(t *testing.T) { - lbc := new(test.LbcMock) - btc := new(test.BtcRpcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) - quoteRepository := new(test.PeginQuoteRepositoryMock) + lbc := new(mocks.LbcMock) + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, @@ -351,7 +352,7 @@ func TestCallForUserUseCase_Run_QuoteNotFound(t *testing.T) { assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) @@ -370,16 +371,16 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, } - lp := new(test.ProviderMock) - lbc := new(test.LbcMock) + lp := new(mocks.ProviderMock) + lbc := new(mocks.LbcMock) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, Confirmations: 10, @@ -390,7 +391,7 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { updatedQuote.UserBtcTxHash = btcTx updatedQuote.State = quote.PeginStateCallForUserFailed - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { require.ErrorIs(t, event.Error, usecases.InsufficientAmountError) return assert.Equal(t, testPeginQuote, event.PeginQuote) && @@ -398,14 +399,14 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) - quoteRepository := new(test.PeginQuoteRepositoryMock) + mutex := new(mocks.MutexMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote). Return(nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) @@ -430,36 +431,36 @@ func TestCallForUserUseCase_Run_NoLiquidity(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, } - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return(lpRskAddress).Twice() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(500), nil).Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress). Return(entities.NewWei(20000), nil).Once() @@ -481,7 +482,7 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { lpRskAddress := testPeginQuote.LpRskAddress retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, @@ -491,39 +492,39 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { expectedRetainedQuote.CallForUserTxHash = callForUser expectedRetainedQuote.UserBtcTxHash = btcTx - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return(lpRskAddress).Twice() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(600), nil).Once() txConfig := blockchain.NewTransactionConfig(entities.NewWei(29400), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) lbc.On("CallForUser", txConfig, testPeginQuote).Return(callForUser, assert.AnError).Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { require.Error(t, event.Error) return assert.Equal(t, testPeginQuote, event.PeginQuote) && assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) diff --git a/internal/usecases/pegin/expire_quote_test.go b/internal/usecases/pegin/expire_quote_test.go index 43853534..963f87f6 100644 --- a/internal/usecases/pegin/expire_quote_test.go +++ b/internal/usecases/pegin/expire_quote_test.go @@ -5,7 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -23,7 +23,7 @@ func TestExpiredPeginQuoteUseCase_Run(t *testing.T) { expectedRetainedQuote := retainedQuote expectedRetainedQuote.State = quote.PeginStateTimeForDepositElapsed - peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + peginQuoteRepository := new(mocks.PeginQuoteRepositoryMock) peginQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetainedQuote).Return(nil) useCase := pegin.NewExpiredPeginQuoteUseCase(peginQuoteRepository) err := useCase.Run(context.Background(), retainedQuote) @@ -39,7 +39,7 @@ func TestExpiredPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { RequiredLiquidity: entities.NewWei(1), State: quote.PeginStateWaitingForDeposit, } - peginQuoteRepository := new(test.PeginQuoteRepositoryMock) + peginQuoteRepository := new(mocks.PeginQuoteRepositoryMock) peginQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) useCase := pegin.NewExpiredPeginQuoteUseCase(peginQuoteRepository) err := useCase.Run(context.Background(), retainedQuote) diff --git a/internal/usecases/pegin/get_collateral.go b/internal/usecases/pegin/get_collateral.go index 7f6d58d8..7f8af74d 100644 --- a/internal/usecases/pegin/get_collateral.go +++ b/internal/usecases/pegin/get_collateral.go @@ -3,15 +3,16 @@ package pegin import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type GetCollateralUseCase struct { lbc blockchain.LiquidityBridgeContract - peginProvider entities.LiquidityProvider + peginProvider liquidity_provider.LiquidityProvider } -func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, peginProvider entities.LiquidityProvider) *GetCollateralUseCase { +func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, peginProvider liquidity_provider.LiquidityProvider) *GetCollateralUseCase { return &GetCollateralUseCase{lbc: lbc, peginProvider: peginProvider} } diff --git a/internal/usecases/pegin/get_collateral_test.go b/internal/usecases/pegin/get_collateral_test.go index 592355dc..3282807b 100644 --- a/internal/usecases/pegin/get_collateral_test.go +++ b/internal/usecases/pegin/get_collateral_test.go @@ -3,15 +3,15 @@ package pegin_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestGetCollateralUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("GetCollateral", "rskAddress").Return(value, nil) @@ -23,8 +23,8 @@ func TestGetCollateralUseCase_Run(t *testing.T) { } func TestGetCollateralUseCase_Run_Error(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("rskAddress") lbc.On("GetCollateral", "rskAddress").Return(entities.NewWei(0), assert.AnError) useCase := pegin.NewGetCollateralUseCase(lbc, lp) diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index 6e742d90..ebf7d692 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "time" @@ -17,8 +18,8 @@ type GetQuoteUseCase struct { bridge blockchain.RootstockBridge lbc blockchain.LiquidityBridgeContract peginQuoteRepository quote.PeginQuoteRepository - lp entities.LiquidityProvider - peginLp entities.PeginLiquidityProvider + lp liquidity_provider.LiquidityProvider + peginLp liquidity_provider.PeginLiquidityProvider feeCollectorAddress string } @@ -29,8 +30,8 @@ func NewGetQuoteUseCase( bridge blockchain.RootstockBridge, lbc blockchain.LiquidityBridgeContract, peginQuoteRepository quote.PeginQuoteRepository, - lp entities.LiquidityProvider, - peginLp entities.PeginLiquidityProvider, + lp liquidity_provider.LiquidityProvider, + peginLp liquidity_provider.PeginLiquidityProvider, feeCollectorAddress string, ) *GetQuoteUseCase { return &GetQuoteUseCase{ @@ -83,7 +84,8 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( var err error var gasPrice, estimatedCallGas *entities.Wei - if errorArgs, err = useCase.validateRequest(request); err != nil { + peginConfiguration := useCase.peginLp.PeginConfiguration(ctx) + if errorArgs, err = useCase.validateRequest(peginConfiguration, request); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, err, errorArgs) } @@ -104,14 +106,15 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } + generalConfiguration := useCase.lp.GeneralConfiguration(ctx) totalGas := new(entities.Wei).Add(estimatedCallGas, daoTxAmounts.DaoGasAmount) fees := quote.Fees{ - CallFee: useCase.peginLp.CallFeePegin(), + CallFee: peginConfiguration.CallFee, GasFee: new(entities.Wei).Mul(totalGas, gasPrice), - PenaltyFee: useCase.peginLp.PenaltyFeePegin(), + PenaltyFee: peginConfiguration.PenaltyFee, ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), } - if peginQuote, err = useCase.buildPeginQuote(request, fedAddress, totalGas, fees); err != nil { + if peginQuote, err = useCase.buildPeginQuote(generalConfiguration, peginConfiguration, request, fedAddress, totalGas, fees); err != nil { return GetPeginQuoteResult{}, err } @@ -128,7 +131,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPeginQuoteResult{PeginQuote: peginQuote, Hash: hash}, nil } -func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { +func (useCase *GetQuoteUseCase) validateRequest(configuration liquidity_provider.PeginConfiguration, request QuoteRequest) (usecases.ErrorArgs, error) { var err error args := usecases.NewErrorArgs() if err = useCase.btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { @@ -143,13 +146,15 @@ func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases. args["rskAddress"] = request.callEoaOrContractAddress return args, usecases.RskAddressNotSupportedError } - if err = useCase.peginLp.ValidateAmountForPegin(request.valueToTransfer); err != nil { + if err = configuration.ValidateAmount(request.valueToTransfer); err != nil { return args, err } return nil, nil } func (useCase *GetQuoteUseCase) buildPeginQuote( + generalConfig liquidity_provider.GeneralConfiguration, + peginConfig liquidity_provider.PeginConfiguration, request QuoteRequest, fedAddress string, totalGas *entities.Wei, @@ -177,9 +182,9 @@ func (useCase *GetQuoteUseCase) buildPeginQuote( Nonce: nonce, Value: request.valueToTransfer, AgreementTimestamp: uint32(time.Now().Unix()), - TimeForDeposit: useCase.peginLp.TimeForDepositPegin(), - LpCallTime: useCase.peginLp.CallTime(), - Confirmations: useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer), + TimeForDeposit: peginConfig.TimeForDeposit, + LpCallTime: peginConfig.CallTime, + Confirmations: generalConfig.BtcConfirmations.ForValue(request.valueToTransfer), CallOnRegister: false, GasFee: fees.GasFee, ProductFeeAmount: fees.ProductFeeAmount, diff --git a/internal/usecases/pegin/get_pegin_quote_test.go b/internal/usecases/pegin/get_pegin_quote_test.go index f357c8f5..d1d9d77e 100644 --- a/internal/usecases/pegin/get_pegin_quote_test.go +++ b/internal/usecases/pegin/get_pegin_quote_test.go @@ -5,10 +5,12 @@ import ( "encoding/hex" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -26,46 +28,38 @@ func TestGetQuoteUseCase_Run(t *testing.T) { quoteData := []byte{1} userBtcAddress := "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6" lpRskAddress := "0x4b5b6b" - callFee := entities.NewWei(100) - penaltyFee := entities.NewWei(50) - timeForDeposit := uint32(600) - callTime := uint32(600) - confirmations := uint16(10) gasLimit := entities.NewWei(100) + config := getPeginConfiguration() request := pegin.NewQuoteRequest(userRskAddress, quoteData, quoteValue, userRskAddress, userBtcAddress) quoteMatchFunction := mock.MatchedBy(func(q quote.PeginQuote) bool { return q.FedBtcAddress == fedAddress && q.LbcAddress == lbcAddress && q.LpRskAddress == lpRskAddress && q.BtcRefundAddress == userBtcAddress && q.RskRefundAddress == userRskAddress && q.LpBtcAddress == lpBtcAddress && - q.CallFee.Cmp(callFee) == 0 && q.PenaltyFee.Cmp(penaltyFee) == 0 && q.ContractAddress == userRskAddress && + q.CallFee.Cmp(config.CallFee) == 0 && q.PenaltyFee.Cmp(config.PenaltyFee) == 0 && q.ContractAddress == userRskAddress && q.Data == hex.EncodeToString(quoteData) && q.GasLimit == uint32(gasLimit.Uint64()) && q.Value.Cmp(quoteValue) == 0 && - q.Nonce > 0 && q.TimeForDeposit == timeForDeposit && q.LpCallTime == callTime && q.Confirmations == confirmations && + q.Nonce > 0 && q.TimeForDeposit == config.TimeForDeposit && q.LpCallTime == config.CallTime && q.Confirmations == 10 && q.CallOnRegister == false && q.GasFee.Cmp(entities.NewWei(10000)) == 0 && q.ProductFeeAmount == 0 }) - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("EstimateGas", mock.Anything, userRskAddress, quoteValue, quoteData).Return(gasLimit, nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(100), nil) - feeCollector := new(test.FeeCollectorMock) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(100), nil) + feeCollector := new(mocks.FeeCollectorMock) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetFedAddress").Return(fedAddress, nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return(lbcAddress) lbc.On("HashPeginQuote", quoteMatchFunction).Return(quoteHash, nil) - peginQuoteRepository := new(test.PeginQuoteRepositoryMock) - peginQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash, quoteMatchFunction).Return(nil) - lp := new(test.ProviderMock) - lp.On("CallFeePegin").Return(callFee) - lp.On("PenaltyFeePegin").Return(penaltyFee) - lp.On("ValidateAmountForPegin", quoteValue).Return(nil) + peginQuoteRepository := new(mocks.PeginQuoteRepositoryMock) + peginQuoteRepository.On("InsertQuote", test.AnyCtx, quoteHash, quoteMatchFunction).Return(nil) + lp := new(mocks.ProviderMock) + lp.On("PeginConfiguration", test.AnyCtx).Return(config) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) lp.On("RskAddress").Return(lpRskAddress) lp.On("BtcAddress").Return(lpBtcAddress) - lp.On("TimeForDepositPegin").Return(timeForDeposit) - lp.On("CallTime").Return(callTime) - lp.On("GetBitcoinConfirmationsForValue", quoteValue).Return(confirmations) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") result, err := useCase.Run(context.Background(), request) @@ -83,62 +77,61 @@ func TestGetQuoteUseCase_Run(t *testing.T) { } func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { - rsk := new(test.RskRpcMock) - lp := new(test.ProviderMock) - feeCollector := new(test.FeeCollectorMock) - bridge := new(test.BridgeMock) - lbc := new(test.LbcMock) - peginQuoteRepository := new(test.PeginQuoteRepositoryMock) - feeCollectorAddress := "feeCollectorAddress" - cases := test.Table[func(btc *test.BtcRpcMock) pegin.QuoteRequest, error]{ + rsk := new(mocks.RskRpcMock) + lp := new(mocks.ProviderMock) + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) + feeCollector := new(mocks.FeeCollectorMock) + bridge := new(mocks.BridgeMock) + lbc := new(mocks.LbcMock) + peginQuoteRepository := new(mocks.PeginQuoteRepositoryMock) + cases := test.Table[func(btc *mocks.BtcRpcMock) pegin.QuoteRequest, error]{ { - Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { - const anyAddress = "any address" - btc.On("ValidateAddress", anyAddress).Return(blockchain.BtcAddressNotSupportedError) - return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", anyAddress) - }, - Result: blockchain.BtcAddressNotSupportedError, + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", test.AnyAddress).Return(blockchain.BtcAddressNotSupportedError) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1000), "0x79568c2989232dCa1840087D73d403602364c0D4", test.AnyAddress) + }, Result: blockchain.BtcAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { - const anyAddress = "any address" - btc.On("ValidateAddress", anyAddress).Return(blockchain.BtcAddressInvalidNetworkError) - return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", anyAddress) - }, - Result: blockchain.BtcAddressInvalidNetworkError, + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", test.AnyAddress).Return(blockchain.BtcAddressInvalidNetworkError) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1000), "0x79568c2989232dCa1840087D73d403602364c0D4", test.AnyAddress) + }, Result: blockchain.BtcAddressInvalidNetworkError, }, { - Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { btc.On("ValidateAddress", mock.Anything).Return(nil) - return pegin.NewQuoteRequest("any", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: usecases.RskAddressNotSupportedError, + return pegin.NewQuoteRequest("any", []byte{1}, entities.NewWei(1000), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { btc.On("ValidateAddress", mock.Anything).Return(nil) - return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "any", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: usecases.RskAddressNotSupportedError, + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1000), "any", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { btc.On("ValidateAddress", mock.Anything).Return(nil) - return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: usecases.RskAddressNotSupportedError, + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(1000), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegin.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { btc.On("ValidateAddress", mock.Anything).Return(nil) - return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D41", []byte{1}, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: usecases.RskAddressNotSupportedError, + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D41", []byte{1}, entities.NewWei(1000), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, + }, + { + Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil) + return pegin.NewQuoteRequest("0x79568c2989232dCa1840087D73d403602364c0D4", []byte{1}, entities.NewWei(999), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: lpEntity.AmountOutOfRangeError, }, } for _, testCase := range cases { - btc := new(test.BtcRpcMock) - useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, feeCollectorAddress) + btc := new(mocks.BtcRpcMock) + useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") result, err := useCase.Run(context.Background(), testCase.Value(btc)) assert.Equal(t, pegin.GetPeginQuoteResult{}, result) require.Error(t, err) @@ -153,13 +146,13 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { setups := getQuoteUseCaseUnexpectedErrorSetups() for _, setup := range setups { - rsk := new(test.RskRpcMock) - feeCollector := new(test.FeeCollectorMock) - bridge := new(test.BridgeMock) - lbc := new(test.LbcMock) - peginQuoteRepository := new(test.PeginQuoteRepositoryMock) - lp := new(test.ProviderMock) - btc := new(test.BtcRpcMock) + rsk := new(mocks.RskRpcMock) + feeCollector := new(mocks.FeeCollectorMock) + bridge := new(mocks.BridgeMock) + lbc := new(mocks.LbcMock) + peginQuoteRepository := new(mocks.PeginQuoteRepositoryMock) + lp := new(mocks.ProviderMock) + btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) setup(rsk, feeCollector, bridge, lbc, lp, peginQuoteRepository) @@ -179,120 +172,125 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func getQuoteUseCaseUnexpectedErrorSetups() []func( - rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock, + rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock, ) { return []func( - rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock, + rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock, ){ - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(assert.AnError) - }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError) + rsk.On("GasPrice", test.AnyCtx).Return(nil, assert.AnError) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), assert.AnError) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetFedAddress").Return("", assert.AnError) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetFedAddress").Return("fed address", nil) bridge.On("GetMinimumLockTxValue").Return(nil, assert.AnError) lbc.On("GetAddress").Return("lbc address") - lp.On("CallFeePegin").Return(entities.NewWei(100)) - lp.On("PenaltyFeePegin").Return(entities.NewWei(50)) lp.On("RskAddress").Return("0x4b5b6b") lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") - lp.On("TimeForDepositPegin").Return(uint32(600)) - lp.On("CallTime").Return(uint32(600)) - lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetFedAddress").Return("fed address", nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) lbc.On("HashPeginQuote", mock.Anything).Return("", assert.AnError) lbc.On("GetAddress").Return("lbc address") - lp.On("CallFeePegin").Return(entities.NewWei(100)) - lp.On("PenaltyFeePegin").Return(entities.NewWei(50)) + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) lp.On("RskAddress").Return("0x4b5b6b") lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") - lp.On("TimeForDepositPegin").Return(uint32(600)) - lp.On("CallTime").Return(uint32(600)) - lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(10)) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetFedAddress").Return("fed address", nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) lbc.On("HashPeginQuote", mock.Anything).Return("any hash", nil) lbc.On("GetAddress").Return("lbc address") - peginQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(assert.AnError) - lp.On("CallFeePegin").Return(entities.NewWei(100)) - lp.On("PenaltyFeePegin").Return(entities.NewWei(50)) + peginQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(assert.AnError) lp.On("RskAddress").Return("0x4b5b6b") lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") - lp.On("TimeForDepositPegin").Return(uint32(600)) - lp.On("CallTime").Return(uint32(600)) - lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(10)) + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { + lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil).Once() rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(10), nil) - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) }, - func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, peginQuoteRepository *test.PeginQuoteRepositoryMock) { - lp.On("ValidateAmountForPegin", mock.Anything).Return(nil) + func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(10), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetFedAddress").Return("fed address", nil) lbc.On("GetAddress").Return("") - lp.On("CallFeePegin").Return(entities.NewWei(0)) - lp.On("PenaltyFeePegin").Return(entities.NewWei(0)) + peginConfig := getPeginConfiguration() + generalConfig := getGeneralConfiguration() + peginConfig.CallFee = entities.NewWei(0) + peginConfig.PenaltyFee = entities.NewWei(0) + peginConfig.TimeForDeposit = 0 + peginConfig.CallTime = 0 + lp.On("PeginConfiguration", test.AnyCtx).Return(peginConfig) + lp.On("GeneralConfiguration", test.AnyCtx).Return(generalConfig) lp.On("RskAddress").Return("") lp.On("BtcAddress").Return("") - lp.On("TimeForDepositPegin").Return(uint32(0)) - lp.On("CallTime").Return(uint32(0)) - lp.On("GetBitcoinConfirmationsForValue", mock.Anything).Return(uint16(0)) }, } } + +func getPeginConfiguration() lpEntity.PeginConfiguration { + return lpEntity.PeginConfiguration{ + TimeForDeposit: 600, + CallTime: 600, + PenaltyFee: entities.NewWei(50), + CallFee: entities.NewWei(100), + MaxValue: entities.NewWei(10000), + MinValue: entities.NewWei(1000), + } + +} + +func getGeneralConfiguration() lpEntity.GeneralConfiguration { + return lpEntity.GeneralConfiguration{ + RskConfirmations: map[int]uint16{1: 10}, + BtcConfirmations: map[int]uint16{1: 10}, + } +} diff --git a/internal/usecases/pegin/register_pegin_test.go b/internal/usecases/pegin/register_pegin_test.go index ee68d5ed..e5eed7fc 100644 --- a/internal/usecases/pegin/register_pegin_test.go +++ b/internal/usecases/pegin/register_pegin_test.go @@ -9,6 +9,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -27,7 +28,7 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { registerPeginTx := "register tx hash" retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, @@ -38,7 +39,7 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { expectedRetainedQuote.State = quote.PeginStateRegisterPegInSucceeded expectedRetainedQuote.RegisterPeginTxHash = registerPeginTx - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ QuoteSignature: []byte{1, 2, 3, 31, 27}, BitcoinRawTransaction: btcRawTxMock, @@ -46,19 +47,19 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { BlockHeight: btcBlockInfoMock.Height, Quote: testPeginQuote, }).Return(registerPeginTx, nil).Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { require.NoError(t, event.Error) return assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) })).Return().Once() - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetRequiredTxConfirmations").Return(uint64(10)).Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: retainedPeginQuote.UserBtcTxHash, Confirmations: 11, @@ -67,7 +68,7 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { btc.On("GetRawTransaction", retainedPeginQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil).Once() btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() @@ -86,7 +87,7 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { func TestRegisterPeginUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, @@ -97,15 +98,15 @@ func TestRegisterPeginUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { setups := registerPeginRecoverableErrorSetups() for _, setup := range setups { - lbc := new(test.LbcMock) - quoteRepository := new(test.PeginQuoteRepositoryMock) - btc := new(test.BtcRpcMock) - eventBus := new(test.EventBusMock) + lbc := new(mocks.LbcMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) + btc := new(mocks.BtcRpcMock) + eventBus := new(mocks.EventBusMock) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetRequiredTxConfirmations").Return(uint64(10)) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() @@ -122,22 +123,22 @@ func TestRegisterPeginUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { } } -func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { - return []func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock){ - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { +func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { + return []func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock){ + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { caseQuote.State = quote.PeginStateWaitingForDeposit }, - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). Return(nil, assert.AnError).Once() }, - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash). Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ @@ -147,7 +148,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin }, nil).Once() caseQuote.Signature = "malformed signature" }, - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ @@ -157,7 +158,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin }, nil).Once() btc.On("GetRawTransaction", caseQuote.UserBtcTxHash).Return([]byte{}, assert.AnError).Once() }, - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ @@ -168,7 +169,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin btc.On("GetRawTransaction", caseQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() btc.On("GetPartialMerkleTree", caseQuote.UserBtcTxHash).Return([]byte{}, assert.AnError).Once() }, - func(caseQuote *quote.RetainedPeginQuote, lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ @@ -186,7 +187,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, @@ -194,7 +195,7 @@ func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { CallForUserTxHash: "cfu tx hash", } - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(nil, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { expected := retainedPeginQuote @@ -202,7 +203,7 @@ func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { return assert.Equal(t, expected, q) })).Return(nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { expected := retainedPeginQuote expected.State = quote.PeginStateRegisterPegInFailed @@ -211,10 +212,10 @@ func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) })).Return().Once() - lbc := new(test.LbcMock) - bridge := new(test.BridgeMock) - btc := new(test.BtcRpcMock) - mutex := new(test.MutexMock) + lbc := new(mocks.LbcMock) + bridge := new(mocks.BridgeMock) + btc := new(mocks.BtcRpcMock) + mutex := new(mocks.MutexMock) useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) @@ -238,7 +239,7 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { registerPeginTx := "register tx hash" retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, @@ -249,7 +250,7 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { expectedRetainedQuote.State = quote.PeginStateRegisterPegInFailed expectedRetainedQuote.RegisterPeginTxHash = registerPeginTx - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ QuoteSignature: []byte{1, 2, 3, 31, 27}, BitcoinRawTransaction: btcRawTxMock, @@ -258,21 +259,21 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { Quote: testPeginQuote, }).Return(registerPeginTx, assert.AnError).Once() - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { require.Error(t, event.Error) return assert.Equal(t, expectedRetainedQuote, event.RetainedQuote) && assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) })).Return().Once() - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetRequiredTxConfirmations").Return(uint64(10)).Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: retainedPeginQuote.UserBtcTxHash, Confirmations: 11, @@ -281,7 +282,7 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { btc.On("GetRawTransaction", retainedPeginQuote.UserBtcTxHash).Return(btcRawTxMock, nil).Once() btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil).Once() btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() @@ -300,7 +301,7 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { func TestRegisterPeginUseCase_Run_NotEnoughConfirmations(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, @@ -312,14 +313,14 @@ func TestRegisterPeginUseCase_Run_NotEnoughConfirmations(t *testing.T) { for _, testCase := range setups { t.Run(testCase.description, func(t *testing.T) { - lbc := new(test.LbcMock) - quoteRepository := new(test.PeginQuoteRepositoryMock) - eventBus := new(test.EventBusMock) - btc := new(test.BtcRpcMock) - mutex := new(test.MutexMock) + lbc := new(mocks.LbcMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) + eventBus := new(mocks.EventBusMock) + btc := new(mocks.BtcRpcMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetRequiredTxConfirmations").Return(uint64(30)) testCase.setup(lbc, quoteRepository, btc) @@ -337,17 +338,17 @@ func TestRegisterPeginUseCase_Run_NotEnoughConfirmations(t *testing.T) { func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.RetainedPeginQuote) []struct { description string - setup func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) + setup func(lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) err error } { return []struct { description string - setup func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) + setup func(lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) err error }{ { description: "Should fail when tx has less confirmations than required from bridge", - setup: func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + setup: func(lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ @@ -360,7 +361,7 @@ func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.Retained }, { description: "Should fail when confirmations weren't processed from RSK bridge yet", - setup: func(lbc *test.LbcMock, quoteRepository *test.PeginQuoteRepositoryMock, btc *test.BtcRpcMock) { + setup: func(lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ @@ -388,7 +389,7 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { registerPeginTx := "register tx hash" retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, @@ -398,10 +399,10 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { setups := registerPeginUpdateErrorSetups(t, registerPeginTx, retainedPeginQuote) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetRequiredTxConfirmations").Return(uint64(10)) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: retainedPeginQuote.UserBtcTxHash, Confirmations: 11, @@ -411,11 +412,11 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { btc.On("GetPartialMerkleTree", retainedPeginQuote.UserBtcTxHash).Return(pmtMock, nil) btc.On("GetTransactionBlockInfo", retainedPeginQuote.UserBtcTxHash).Return(btcBlockInfoMock, nil) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("RegisterPegin", blockchain.RegisterPeginParams{ QuoteSignature: []byte{1, 2, 3, 31, 27}, BitcoinRawTransaction: btcRawTxMock, @@ -425,8 +426,8 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { }).Return(registerPeginTx, nil) for _, setup := range setups { - quoteRepository := new(test.PeginQuoteRepositoryMock) - eventBus := new(test.EventBusMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) + eventBus := new(mocks.EventBusMock) setup(quoteRepository, eventBus) useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) @@ -438,9 +439,9 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { } } -func registerPeginUpdateErrorSetups(t *testing.T, registerPeginTx string, retainedPeginQuote quote.RetainedPeginQuote) []func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock) { - return []func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock){ - func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock) { +func registerPeginUpdateErrorSetups(t *testing.T, registerPeginTx string, retainedPeginQuote quote.RetainedPeginQuote) []func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock) { + return []func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock){ + func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(nil, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { @@ -456,7 +457,7 @@ func registerPeginUpdateErrorSetups(t *testing.T, registerPeginTx string, retain assert.Equal(t, quote.RegisterPeginCompletedEventId, event.Event.Id()) })).Return().Once() }, - func(quoteRepository *test.PeginQuoteRepositoryMock, eventBus *test.EventBusMock) { + func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { diff --git a/internal/usecases/pegin/withdraw_collateral_test.go b/internal/usecases/pegin/withdraw_collateral_test.go index b992fb35..defb4bc0 100644 --- a/internal/usecases/pegin/withdraw_collateral_test.go +++ b/internal/usecases/pegin/withdraw_collateral_test.go @@ -4,14 +4,14 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestWithdrawCollateralUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("WithdrawCollateral").Return(nil) useCase := pegin.NewWithdrawCollateralUseCase(lbc) err := useCase.Run() @@ -20,7 +20,7 @@ func TestWithdrawCollateralUseCase_Run(t *testing.T) { } func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) useCase := pegin.NewWithdrawCollateralUseCase(lbc) lbc.On("WithdrawCollateral").Return(errors.New("LBC021")).Once() diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go index 2b96913b..52565050 100644 --- a/internal/usecases/pegout/accept_pegout_quote.go +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -4,6 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "sync" @@ -12,8 +13,8 @@ import ( type AcceptQuoteUseCase struct { quoteRepository quote.PegoutQuoteRepository lbc blockchain.LiquidityBridgeContract - lp entities.LiquidityProvider - pegoutLp entities.PegoutLiquidityProvider + lp liquidity_provider.LiquidityProvider + pegoutLp liquidity_provider.PegoutLiquidityProvider eventBus entities.EventBus pegoutLiquidityMutex sync.Locker } @@ -21,8 +22,8 @@ type AcceptQuoteUseCase struct { func NewAcceptQuoteUseCase( quoteRepository quote.PegoutQuoteRepository, lbc blockchain.LiquidityBridgeContract, - lp entities.LiquidityProvider, - pegoutLp entities.PegoutLiquidityProvider, + lp liquidity_provider.LiquidityProvider, + pegoutLp liquidity_provider.PegoutLiquidityProvider, eventBus entities.EventBus, pegoutLiquidityMutex sync.Locker, ) *AcceptQuoteUseCase { diff --git a/internal/usecases/pegout/accept_pegout_quote_test.go b/internal/usecases/pegout/accept_pegout_quote_test.go index 9c0d47bc..5b4f045b 100644 --- a/internal/usecases/pegout/accept_pegout_quote_test.go +++ b/internal/usecases/pegout/accept_pegout_quote_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -47,21 +48,21 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { RequiredLiquidity: entities.NewWei(18), State: quote.PegoutStateWaitingForDeposit, } - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil).Once() quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return("0xabcd01").Once() - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPegoutQuoteEvent) bool { return assert.Equal(t, quoteMock, event.Quote) && assert.Equal(t, retainedQuote, event.RetainedQuote) && assert.Equal(t, quote.AcceptedPegoutQuoteEventId, event.Event.Id()) })).Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Once() mutex.On("Unlock").Once() useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) @@ -108,13 +109,13 @@ func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { RequiredLiquidity: entities.NewWei(1), State: quote.PegoutStateWaitingForDeposit, } - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(&retainedQuote, nil).Once() - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) @@ -155,12 +156,12 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { GasFee: entities.NewWei(1), ProductFeeAmount: 1, } - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) @@ -177,12 +178,12 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { quoteHash := "0x654321" - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) @@ -221,14 +222,14 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { GasFee: entities.NewWei(15), ProductFeeAmount: 8, } - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), entities.NewWei(65)).Return(usecases.NoLiquidityError).Once() - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Once() mutex.On("Unlock").Once() useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) @@ -277,23 +278,23 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { State: quote.PegoutStateWaitingForDeposit, } - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return("0xabcd01") - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPegoutQuoteEvent) bool { return assert.Equal(t, quoteMock, event.Quote) && assert.Equal(t, retainedQuote, event.RetainedQuote) && assert.Equal(t, quote.AcceptedPegoutQuoteEventId, event.Event.Id()) })) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock") mutex.On("Unlock") cases := acceptQuoteUseCaseUnexpectedErrorSetups("eMock, quoteHash, signature) for _, c := range cases { - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) - lp := new(test.ProviderMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) + lp := new(mocks.ProviderMock) c.Value(quoteRepositoryMock, lp) useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) @@ -304,30 +305,30 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { } } -func acceptQuoteUseCaseUnexpectedErrorSetups(quoteMock *quote.PegoutQuote, quoteHash, signature string) test.Table[func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock), error] { - return test.Table[func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock), error]{ +func acceptQuoteUseCaseUnexpectedErrorSetups(quoteMock *quote.PegoutQuote, quoteHash, signature string) test.Table[func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock), error] { + return test.Table[func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock), error]{ { - Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError).Once() }, }, { - Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError).Once() }, }, { - Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() }, }, { - Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() @@ -335,7 +336,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups(quoteMock *quote.PegoutQuote, quote }, }, { - Value: func(quoteRepository *test.PegoutQuoteRepositoryMock, lp *test.ProviderMock) { + Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() @@ -372,17 +373,17 @@ func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) ProductFeeAmount: 2, } - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return("") - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish").Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Once() mutex.On("Unlock").Once() - quoteRepositoryMock := new(test.PegoutQuoteRepositoryMock) + quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) diff --git a/internal/usecases/pegout/add_collateral.go b/internal/usecases/pegout/add_collateral.go index 1c486e39..e3709ae9 100644 --- a/internal/usecases/pegout/add_collateral.go +++ b/internal/usecases/pegout/add_collateral.go @@ -3,15 +3,16 @@ package pegout import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type AddCollateralUseCase struct { lbc blockchain.LiquidityBridgeContract - lp entities.LiquidityProvider + lp liquidity_provider.LiquidityProvider } -func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp entities.LiquidityProvider) *AddCollateralUseCase { +func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp liquidity_provider.LiquidityProvider) *AddCollateralUseCase { return &AddCollateralUseCase{lbc: lbc, lp: lp} } diff --git a/internal/usecases/pegout/add_collateral_test.go b/internal/usecases/pegout/add_collateral_test.go index e143418c..6ddda45b 100644 --- a/internal/usecases/pegout/add_collateral_test.go +++ b/internal/usecases/pegout/add_collateral_test.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -12,8 +13,8 @@ import ( ) func TestAddCollateralUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("AddPegoutCollateral", value).Return(nil) @@ -28,8 +29,8 @@ func TestAddCollateralUseCase_Run(t *testing.T) { } func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("GetMinimumCollateral").Return(entities.NewWei(2000), nil) @@ -44,22 +45,22 @@ func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { } func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { - lp := new(test.ProviderMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("rskAddress") - cases := test.Table[func(lbc *test.LbcMock), error]{ + cases := test.Table[func(lbc *mocks.LbcMock), error]{ { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(nil, assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(nil, assert.AnError) }, }, { - Value: func(lbc *test.LbcMock) { + Value: func(lbc *mocks.LbcMock) { lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(100), nil) lbc.On("AddPegoutCollateral", mock.Anything).Return(assert.AnError) @@ -68,7 +69,7 @@ func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { } for _, c := range cases { - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) c.Value(lbc) useCase := pegout.NewAddCollateralUseCase(lbc, lp) result, err := useCase.Run(entities.NewWei(100)) diff --git a/internal/usecases/pegout/expire_qupte_test.go b/internal/usecases/pegout/expire_qupte_test.go index cdc7b64c..c9d07317 100644 --- a/internal/usecases/pegout/expire_qupte_test.go +++ b/internal/usecases/pegout/expire_qupte_test.go @@ -5,7 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -23,7 +23,7 @@ func TestExpiredPegoutQuoteUseCase_Run(t *testing.T) { expectedRetainedQuote := retainedQuote expectedRetainedQuote.State = quote.PegoutStateTimeForDepositElapsed - pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + pegoutQuoteRepository := new(mocks.PegoutQuoteRepositoryMock) pegoutQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetainedQuote).Return(nil) useCase := pegout.NewExpiredPegoutQuoteUseCase(pegoutQuoteRepository) err := useCase.Run(context.Background(), retainedQuote) @@ -39,7 +39,7 @@ func TestExpiredPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { RequiredLiquidity: entities.NewWei(1), State: quote.PegoutStateWaitingForDeposit, } - pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + pegoutQuoteRepository := new(mocks.PegoutQuoteRepositoryMock) pegoutQuoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) useCase := pegout.NewExpiredPegoutQuoteUseCase(pegoutQuoteRepository) err := useCase.Run(context.Background(), retainedQuote) diff --git a/internal/usecases/pegout/get_collateral.go b/internal/usecases/pegout/get_collateral.go index 804b13d8..19103b96 100644 --- a/internal/usecases/pegout/get_collateral.go +++ b/internal/usecases/pegout/get_collateral.go @@ -3,15 +3,16 @@ package pegout import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) type GetCollateralUseCase struct { lbc blockchain.LiquidityBridgeContract - pegoutProvider entities.LiquidityProvider + pegoutProvider liquidity_provider.LiquidityProvider } -func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, pegoutProvider entities.LiquidityProvider) *GetCollateralUseCase { +func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, pegoutProvider liquidity_provider.LiquidityProvider) *GetCollateralUseCase { return &GetCollateralUseCase{lbc: lbc, pegoutProvider: pegoutProvider} } diff --git a/internal/usecases/pegout/get_collateral_test.go b/internal/usecases/pegout/get_collateral_test.go index 66a26c3f..fe82dec5 100644 --- a/internal/usecases/pegout/get_collateral_test.go +++ b/internal/usecases/pegout/get_collateral_test.go @@ -3,15 +3,15 @@ package pegout_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestGetCollateralUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("GetPegoutCollateral", "rskAddress").Return(value, nil) @@ -23,8 +23,8 @@ func TestGetCollateralUseCase_Run(t *testing.T) { } func TestGetCollateralUseCase_Run_Error(t *testing.T) { - lbc := new(test.LbcMock) - lp := new(test.ProviderMock) + lbc := new(mocks.LbcMock) + lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("rskAddress") lbc.On("GetPegoutCollateral", "rskAddress").Return(entities.NewWei(0), assert.AnError) useCase := pegout.NewGetCollateralUseCase(lbc, lp) diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index 7fe8998a..615fa724 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -4,6 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "strings" @@ -17,8 +18,8 @@ type GetQuoteUseCase struct { bridge blockchain.RootstockBridge lbc blockchain.LiquidityBridgeContract pegoutQuoteRepository quote.PegoutQuoteRepository - lp entities.LiquidityProvider - pegoutLp entities.PegoutLiquidityProvider + lp liquidity_provider.LiquidityProvider + pegoutLp liquidity_provider.PegoutLiquidityProvider btcWallet blockchain.BitcoinWallet feeCollectorAddress string } @@ -30,8 +31,8 @@ func NewGetQuoteUseCase( bridge blockchain.RootstockBridge, lbc blockchain.LiquidityBridgeContract, pegoutQuoteRepository quote.PegoutQuoteRepository, - lp entities.LiquidityProvider, - pegoutLp entities.PegoutLiquidityProvider, + lp liquidity_provider.LiquidityProvider, + pegoutLp liquidity_provider.PegoutLiquidityProvider, btcWallet blockchain.BitcoinWallet, feeCollectorAddress string, ) *GetQuoteUseCase { @@ -84,7 +85,8 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( var err error gasFeeDao := new(entities.Wei) - if errorArgs, err = useCase.validateRequest(request); err != nil { + configuration := useCase.pegoutLp.PegoutConfiguration(ctx) + if errorArgs, err = useCase.validateRequest(configuration, request); err != nil { return GetPegoutQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPegoutQuoteId, err, errorArgs) } @@ -105,12 +107,12 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( gasFeeDao.Mul(daoTxAmounts.DaoGasAmount, gasPrice) fees := quote.Fees{ - CallFee: useCase.pegoutLp.CallFeePegout(), + CallFee: configuration.CallFee, GasFee: new(entities.Wei).Add(feeInWei, gasFeeDao), - PenaltyFee: useCase.pegoutLp.PenaltyFeePegout(), + PenaltyFee: configuration.PenaltyFee, ProductFeeAmount: daoTxAmounts.DaoFeeAmount.Uint64(), } - if pegoutQuote, err = useCase.buildPegoutQuote(ctx, request, fees); err != nil { + if pegoutQuote, err = useCase.buildPegoutQuote(ctx, configuration, request, fees); err != nil { return GetPegoutQuoteResult{}, err } @@ -125,7 +127,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPegoutQuoteResult{PegoutQuote: pegoutQuote, Hash: hash}, nil } -func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases.ErrorArgs, error) { +func (useCase *GetQuoteUseCase) validateRequest(configuration liquidity_provider.PegoutConfiguration, request QuoteRequest) (usecases.ErrorArgs, error) { var err error errorArgs := usecases.NewErrorArgs() if err = useCase.btc.ValidateAddress(request.to); err != nil { @@ -140,13 +142,18 @@ func (useCase *GetQuoteUseCase) validateRequest(request QuoteRequest) (usecases. errorArgs["rskAddress"] = request.rskRefundAddress return errorArgs, usecases.RskAddressNotSupportedError } - if err = useCase.pegoutLp.ValidateAmountForPegout(request.valueToTransfer); err != nil { + if err = configuration.ValidateAmount(request.valueToTransfer); err != nil { return errorArgs, err } return nil, nil } -func (useCase *GetQuoteUseCase) buildPegoutQuote(ctx context.Context, request QuoteRequest, fees quote.Fees) (quote.PegoutQuote, error) { +func (useCase *GetQuoteUseCase) buildPegoutQuote( + ctx context.Context, + configuration liquidity_provider.PegoutConfiguration, + request QuoteRequest, + fees quote.Fees, +) (quote.PegoutQuote, error) { var err error var nonce int64 var blockNumber uint64 @@ -160,8 +167,9 @@ func (useCase *GetQuoteUseCase) buildPegoutQuote(ctx context.Context, request Qu } now := uint32(time.Now().Unix()) - confirmationsForUserTx := useCase.lp.GetRootstockConfirmationsForValue(request.valueToTransfer) - confirmationsForLpTx := useCase.lp.GetBitcoinConfirmationsForValue(request.valueToTransfer) + generalConfiguration := useCase.lp.GeneralConfiguration(ctx) + confirmationsForUserTx := generalConfiguration.RskConfirmations.ForValue(request.valueToTransfer) + confirmationsForLpTx := generalConfiguration.BtcConfirmations.ForValue(request.valueToTransfer) pegoutQuote := quote.PegoutQuote{ LbcAddress: useCase.lbc.GetAddress(), LpRskAddress: useCase.lp.RskAddress(), @@ -174,12 +182,12 @@ func (useCase *GetQuoteUseCase) buildPegoutQuote(ctx context.Context, request Qu DepositAddress: request.to, Value: request.valueToTransfer, AgreementTimestamp: now, - DepositDateLimit: now + useCase.pegoutLp.TimeForDepositPegout(), + DepositDateLimit: now + configuration.TimeForDeposit, DepositConfirmations: confirmationsForUserTx, TransferConfirmations: confirmationsForLpTx, - TransferTime: useCase.pegoutLp.TimeForDepositPegout(), - ExpireDate: now + useCase.pegoutLp.TimeForDepositPegout(), - ExpireBlock: uint32(blockNumber + useCase.pegoutLp.ExpireBlocksPegout()), + TransferTime: configuration.TimeForDeposit, + ExpireDate: now + configuration.TimeForDeposit, + ExpireBlock: uint32(blockNumber + configuration.ExpireBlocks), GasFee: fees.GasFee, ProductFeeAmount: fees.ProductFeeAmount, } diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index 4e85196f..e9d8241a 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -5,9 +5,11 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" pegout "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -15,31 +17,26 @@ import ( ) func TestGetQuoteUseCase_Run(t *testing.T) { - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) - feeCollector := new(test.FeeCollectorMock) + feeCollector := new(mocks.FeeCollectorMock) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return("0x1234") lbc.On("HashPegoutQuote", mock.Anything).Return("0x9876543210", nil) - pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) + pegoutQuoteRepository := new(mocks.PegoutQuoteRepositoryMock) pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) - lp := new(test.ProviderMock) - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) - lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) - lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) - lp.On("CallFeePegout").Return(entities.NewWei(200)) - lp.On("PenaltyFeePegout").Return(entities.NewWei(20)) + lp := new(mocks.ProviderMock) + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) lp.On("RskAddress").Return("0x1234") lp.On("BtcAddress").Return("address") - lp.On("TimeForDepositPegout").Return(uint32(60000)) - lp.On("ExpireBlocksPegout").Return(uint64(60000)) - btcWallet := new(test.BtcWalletMock) + btcWallet := new(mocks.BtcWalletMock) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000000000000000), nil) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) feeCollectorAddress := "feeCollectorAddress" useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) @@ -63,70 +60,83 @@ func TestGetQuoteUseCase_Run(t *testing.T) { } func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { - const wrongAddress = "wrong address" - rsk := new(test.RskRpcMock) - lp := new(test.ProviderMock) - feeCollector := new(test.FeeCollectorMock) - bridge := new(test.BridgeMock) - lbc := new(test.LbcMock) - pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) - btcWallet := new(test.BtcWalletMock) + rsk := new(mocks.RskRpcMock) + feeCollector := new(mocks.FeeCollectorMock) + bridge := new(mocks.BridgeMock) + lbc := new(mocks.LbcMock) + pegoutQuoteRepository := new(mocks.PegoutQuoteRepositoryMock) + btcWallet := new(mocks.BtcWalletMock) feeCollectorAddress := "feeCollectorAddress" - cases := test.Table[func(btc *test.BtcRpcMock) pegout.QuoteRequest, error]{ + cases := getQuoteUseCaseErrorSetups() + for _, testCase := range cases { + btc := new(mocks.BtcRpcMock) + lp := new(mocks.ProviderMock) + useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + result, err := useCase.Run(context.Background(), testCase.Value(btc, lp)) + assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) + require.Error(t, err) + require.ErrorIs(t, err, testCase.Result) + } +} + +func getQuoteUseCaseErrorSetups() test.Table[func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest, error] { + const wrongAddress = "wrong address" + return test.Table[func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest, error]{ { - Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressInvalidNetworkError).Once() btc.On("ValidateAddress", mock.Anything).Return(nil).Once() - return pegout.NewQuoteRequest(wrongAddress, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + return pegout.NewQuoteRequest(wrongAddress, entities.NewWei(100000000000000000), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") }, Result: blockchain.BtcAddressInvalidNetworkError, }, { - Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressNotSupportedError).Once() btc.On("ValidateAddress", mock.Anything).Return(nil).Once() - return pegout.NewQuoteRequest(wrongAddress, entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: blockchain.BtcAddressNotSupportedError, + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + return pegout.NewQuoteRequest(wrongAddress, entities.NewWei(100000000000000000), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: blockchain.BtcAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { btc.On("ValidateAddress", mock.Anything).Return(nil) + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", nil, "anything", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: usecases.RskAddressNotSupportedError, + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { btc.On("ValidateAddress", mock.Anything).Return(nil) - return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") - }, - Result: usecases.RskAddressNotSupportedError, + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(100000000000000000), "0x79568c2989232dCa1840087D73d403602364c0D41", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: usecases.RskAddressNotSupportedError, }, { - Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressInvalidNetworkError).Once() btc.On("ValidateAddress", mock.Anything).Return(nil).Once() - return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", wrongAddress) - }, - Result: blockchain.BtcAddressInvalidNetworkError, + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(100000000000000000), "0x79568c2989232dCa1840087D73d403602364c0D4", wrongAddress) + }, Result: blockchain.BtcAddressInvalidNetworkError, }, { - Value: func(btc *test.BtcRpcMock) pegout.QuoteRequest { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { btc.On("ValidateAddress", wrongAddress).Return(blockchain.BtcAddressNotSupportedError).Once() btc.On("ValidateAddress", mock.Anything).Return(nil).Once() - return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1), "0x79568c2989232dCa1840087D73d403602364c0D4", wrongAddress) - }, - Result: blockchain.BtcAddressNotSupportedError, + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(100000000000000000), "0x79568c2989232dCa1840087D73d403602364c0D4", wrongAddress) + }, Result: blockchain.BtcAddressNotSupportedError, + }, + { + Value: func(btc *mocks.BtcRpcMock, lp *mocks.ProviderMock) pegout.QuoteRequest { + btc.On("ValidateAddress", mock.Anything).Return(nil).Once() + btc.On("ValidateAddress", mock.Anything).Return(nil).Once() + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + return pegout.NewQuoteRequest("mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(99999999999999999), "0x79568c2989232dCa1840087D73d403602364c0D4", "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe") + }, Result: lpEntity.AmountOutOfRangeError, }, - } - for _, testCase := range cases { - btc := new(test.BtcRpcMock) - useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) - result, err := useCase.Run(context.Background(), testCase.Value(btc)) - assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) - require.Error(t, err) - require.ErrorIs(t, err, testCase.Result) } } @@ -141,13 +151,13 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { ) feeCollectorAddress := "feeCollectorAddress" for _, testCase := range cases { - rsk := new(test.RskRpcMock) - lp := new(test.ProviderMock) - feeCollector := new(test.FeeCollectorMock) - bridge := new(test.BridgeMock) - lbc := new(test.LbcMock) - pegoutQuoteRepository := new(test.PegoutQuoteRepositoryMock) - btcWallet := new(test.BtcWalletMock) + rsk := new(mocks.RskRpcMock) + lp := new(mocks.ProviderMock) + feeCollector := new(mocks.FeeCollectorMock) + bridge := new(mocks.BridgeMock) + lbc := new(mocks.LbcMock) + pegoutQuoteRepository := new(mocks.PegoutQuoteRepositoryMock) + btcWallet := new(mocks.BtcWalletMock) testCase.Value(rsk, feeCollector, bridge, lbc, lp, btcWallet, pegoutQuoteRepository) lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) @@ -158,7 +168,9 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { lp.On("TimeForDepositPegout").Return(uint32(60000)) lp.On("ExpireBlocksPegout").Return(uint64(60000)) lbc.On("GetAddress").Return("0x1234") - btc := new(test.BtcRpcMock) + lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) + lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) + btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) result, err := useCase.Run(context.Background(), request) @@ -169,50 +181,40 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( - rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, - pegoutQuoteRepository *test.PegoutQuoteRepositoryMock, + rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, + pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock, ), error] { return test.Table[func( - rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, - pegoutQuoteRepository *test.PegoutQuoteRepositoryMock, + rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, + pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock, ), error]{ { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(assert.AnError) - }, - }, - { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(0), assert.AnError) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(0), assert.AnError) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(0), errors.New("Insufficient funds")) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) @@ -220,9 +222,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), assert.AnError) @@ -230,9 +231,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) @@ -241,9 +241,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) @@ -255,9 +254,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) @@ -278,9 +276,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) @@ -301,9 +298,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *test.RskRpcMock, feeCollector *test.FeeCollectorMock, bridge *test.BridgeMock, - lbc *test.LbcMock, lp *test.ProviderMock, btcWallet *test.BtcWalletMock, pegoutQuoteRepository *test.PegoutQuoteRepositoryMock) { - lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) + Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything). @@ -327,3 +323,20 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, } } + +func getPegoutConfiguration() lpEntity.PegoutConfiguration { + return lpEntity.PegoutConfiguration{ + TimeForDeposit: 60000, + CallTime: 600, + PenaltyFee: entities.NewWei(20), + CallFee: entities.NewWei(200), + MaxValue: entities.NewUWei(10000000000000000000), + MinValue: entities.NewWei(100000000000000000), + ExpireBlocks: 60000, + } + +} + +func getGeneralConfiguration() lpEntity.GeneralConfiguration { + return lpEntity.GeneralConfiguration{RskConfirmations: map[int]uint16{1: 10}, BtcConfirmations: map[int]uint16{1: 10}} +} diff --git a/internal/usecases/pegout/get_user_deposits_test.go b/internal/usecases/pegout/get_user_deposits_test.go index c5bcc23a..587baa1d 100644 --- a/internal/usecases/pegout/get_user_deposits_test.go +++ b/internal/usecases/pegout/get_user_deposits_test.go @@ -5,7 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -14,7 +14,7 @@ import ( ) func TestGetUserDepositsUseCase_Run(t *testing.T) { - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) deposit := quote.PegoutDeposit{ TxHash: "0x123456", QuoteHash: "0x654321", @@ -35,7 +35,7 @@ func TestGetUserDepositsUseCase_Run(t *testing.T) { } func TestGetUserDepositsUseCase_Run_ErrorHandling(t *testing.T) { - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On( "ListPegoutDepositsByAddress", mock.AnythingOfType("context.backgroundCtx"), diff --git a/internal/usecases/pegout/init_deposits_cache_test.go b/internal/usecases/pegout/init_deposits_cache_test.go index c36521e3..dfe3d19a 100644 --- a/internal/usecases/pegout/init_deposits_cache_test.go +++ b/internal/usecases/pegout/init_deposits_cache_test.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -14,9 +15,9 @@ import ( ) func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) - rpc := new(test.RskRpcMock) - pegoutRepository := new(test.PegoutQuoteRepositoryMock) + lbc := new(mocks.LbcMock) + rpc := new(mocks.RskRpcMock) + pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) height := uint64(10) rpc.On("GetHeight", context.Background()).Return(height, nil) events := []quote.PegoutDeposit{ @@ -48,20 +49,20 @@ func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { } func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { - cases := test.Table[func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock), error]{ + cases := test.Table[func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock), error]{ { - Value: func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock) { + Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock) { rpc.On("GetHeight", context.Background()).Return(uint64(0), assert.AnError) }, }, { - Value: func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock) { + Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock) { rpc.On("GetHeight", context.Background()).Return(uint64(10), nil) lbc.On("GetDepositEvents", context.Background(), mock.Anything, mock.Anything).Return(nil, assert.AnError) }, }, { - Value: func(lbc *test.LbcMock, quoteRepository *test.PegoutQuoteRepositoryMock, rpc *test.RskRpcMock) { + Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock) { rpc.On("GetHeight", context.Background()).Return(uint64(10), nil) lbc.On("GetDepositEvents", context.Background(), uint64(5), mock.Anything).Return([]quote.PegoutDeposit{}, nil) quoteRepository.On("UpsertPegoutDeposits", context.Background(), mock.Anything).Return(assert.AnError) @@ -70,9 +71,9 @@ func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { } for _, c := range cases { - lbc := new(test.LbcMock) - quoteRepository := new(test.PegoutQuoteRepositoryMock) - rsk := new(test.RskRpcMock) + lbc := new(mocks.LbcMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + rsk := new(mocks.RskRpcMock) c.Value(lbc, quoteRepository, rsk) useCase := pegout.NewInitPegoutDepositCacheUseCase(quoteRepository, lbc, rsk) err := useCase.Run(context.Background(), 5) diff --git a/internal/usecases/pegout/refund_pegout_test.go b/internal/usecases/pegout/refund_pegout_test.go index 497f3cd0..d7abc4f8 100644 --- a/internal/usecases/pegout/refund_pegout_test.go +++ b/internal/usecases/pegout/refund_pegout_test.go @@ -9,6 +9,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -38,13 +39,13 @@ var retainedQuote = quote.RetainedPegoutQuote{ var pegoutQuote = quote.PegoutQuote{ LbcAddress: retainedQuote.QuoteHash, LpRskAddress: "0x1234", - BtcRefundAddress: "any address", + BtcRefundAddress: test.AnyAddress, RskRefundAddress: "0x1234", LpBtcAddress: "0x1234", CallFee: entities.NewWei(3000), PenaltyFee: 2, Nonce: 3, - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Value: entities.NewWei(4000), AgreementTimestamp: now, DepositDateLimit: now + 60, @@ -73,14 +74,14 @@ var merkleBranchMock = blockchain.MerkleBranch{ var btcTxInfoMock = blockchain.BitcoinTransactionInformation{ Hash: "0x1c2b3a", Confirmations: 11, - Outputs: map[string][]*entities.Wei{"any address": {entities.NewWei(1000)}}, + Outputs: map[string][]*entities.Wei{test.AnyAddress: {entities.NewWei(1000)}}, } var btcRawTxMock = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32} func TestRefundPegoutUseCase_Run(t *testing.T) { bridgeAddress := "0x1234" - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ QuoteHash: retainedQuote.QuoteHash, DepositAddress: retainedQuote.DepositAddress, @@ -103,9 +104,9 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { BridgeRefundTxHash: bridgeTxHash, }).Return(nil).Once() quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { expected := retainedQuote expected.RefundPegoutTxHash = refundPegoutTxHash @@ -113,18 +114,18 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { require.NoError(t, event.Error) return assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) })).Return().Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil) btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) - rskWallet := new(test.RskWalletMock) + rskWallet := new(mocks.RskWalletMock) rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), blockchain.NewTransactionConfig(entities.NewWei(8000), 100000, entities.NewWei(60000000)), bridgeAddress).Return(bridgeTxHash, nil).Once() - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetAddress").Return(bridgeAddress).Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Unlock").Return().Once() mutex.On("Lock").Return().Once() @@ -143,13 +144,13 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { updateError := errors.New("an update error") - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(updateError).Once() quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { expected := retainedQuote expected.RefundPegoutTxHash = refundPegoutTxHash @@ -157,16 +158,16 @@ func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { require.NoError(t, event.Error) return assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) })).Return().Once() - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil) btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) - rskWallet := new(test.RskWalletMock) + rskWallet := new(mocks.RskWalletMock) rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(bridgeTxHash, nil).Once() - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetAddress").Return("an address").Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Unlock").Return().Once() mutex.On("Lock").Return().Once() @@ -184,32 +185,32 @@ func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { } func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetAddress").Return("0x1234").Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Unlock").Return() mutex.On("Lock").Return() - recoverableSetups := []func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock){ - func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + recoverableSetups := []func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock){ + func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() }, - func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, - func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(blockchain.MerkleBranch{}, assert.AnError).Once() }, - func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{}, assert.AnError).Once() }, - func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() @@ -217,7 +218,7 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { btc.On("GetRawTransaction", mock.Anything).Return(nil, assert.AnError).Once() }, - func(quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() @@ -228,11 +229,11 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { } for _, setup := range recoverableSetups { - eventBus := new(test.EventBusMock) - quoteRepository := new(test.PegoutQuoteRepositoryMock) - lbc := new(test.LbcMock) - btc := new(test.BtcRpcMock) - rskWallet := new(test.RskWalletMock) + eventBus := new(mocks.EventBusMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + lbc := new(mocks.LbcMock) + btc := new(mocks.BtcRpcMock) + rskWallet := new(mocks.RskWalletMock) setup(quoteRepository, lbc, btc, rskWallet) useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) err := useCase.Run(context.Background(), retainedQuote) @@ -246,17 +247,17 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { } func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetAddress").Return("0x1234").Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Unlock").Return() mutex.On("Lock").Return() - unrecoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock){ - func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + unrecoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock){ + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, nil).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { retainedQuote.QuoteHash = "no hex" quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() @@ -264,7 +265,7 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, lbc *test.LbcMock, btc *test.BtcRpcMock, rskWallet *test.RskWalletMock) { + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() @@ -275,13 +276,13 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { } for _, setup := range unrecoverableSetups { - quoteRepository := new(test.PegoutQuoteRepositoryMock) - lbc := new(test.LbcMock) - btc := new(test.BtcRpcMock) - rskWallet := new(test.RskWalletMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + lbc := new(mocks.LbcMock) + btc := new(mocks.BtcRpcMock) + rskWallet := new(mocks.RskWalletMock) caseQuote := retainedQuote setup(&caseQuote, quoteRepository, lbc, btc, rskWallet) - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutQuoteCompletedEvent) bool { require.Error(t, event.Error) return assert.Equal(t, caseQuote.LpBtcTxHash, event.RetainedQuote.LpBtcTxHash) && assert.Equal(t, caseQuote.Signature, event.RetainedQuote.Signature) && @@ -309,15 +310,15 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { func TestRefundPegoutUseCase_Run_NoConfirmations(t *testing.T) { unconfirmedBlockInfo := btcTxInfoMock unconfirmedBlockInfo.Confirmations = 1 - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - lbc := new(test.LbcMock) - eventBus := new(test.EventBusMock) - btc := new(test.BtcRpcMock) + lbc := new(mocks.LbcMock) + eventBus := new(mocks.EventBusMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(unconfirmedBlockInfo, nil).Once() - rskWallet := new(test.RskWalletMock) - bridge := new(test.BridgeMock) - mutex := new(test.MutexMock) + rskWallet := new(mocks.RskWalletMock) + bridge := new(mocks.BridgeMock) + mutex := new(mocks.MutexMock) useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) @@ -338,13 +339,13 @@ func TestRefundPegoutUseCase_Run_NoConfirmations(t *testing.T) { func TestRefundPegoutUseCase_Run_WrongState(t *testing.T) { wrongStateQuote := retainedQuote wrongStateQuote.State = quote.PegoutStateSendPegoutFailed - quoteRepository := new(test.PegoutQuoteRepositoryMock) - lbc := new(test.LbcMock) - eventBus := new(test.EventBusMock) - btc := new(test.BtcRpcMock) - rskWallet := new(test.RskWalletMock) - bridge := new(test.BridgeMock) - mutex := new(test.MutexMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + lbc := new(mocks.LbcMock) + eventBus := new(mocks.EventBusMock) + btc := new(mocks.BtcRpcMock) + rskWallet := new(mocks.RskWalletMock) + bridge := new(mocks.BridgeMock) + mutex := new(mocks.MutexMock) useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) @@ -366,32 +367,32 @@ func TestRefundPegoutUseCase_Run_WrongState(t *testing.T) { func TestRefundPegoutUseCase_Run_CorrectBridgeAmount(t *testing.T) { bridgeAddress := "0x1234" - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil) - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.Anything) - btc := new(test.BtcRpcMock) + btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil) btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil) btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) - bridge := new(test.BridgeMock) + bridge := new(mocks.BridgeMock) bridge.On("GetAddress").Return(bridgeAddress) - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Unlock") mutex.On("Lock") cases := getQuotesWithExpectedTotalTable() for _, c := range cases { - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) q := c.Value() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) - rskWallet := new(test.RskWalletMock) + rskWallet := new(mocks.RskWalletMock) rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), blockchain.NewTransactionConfig(c.Result, 100000, entities.NewWei(60000000)), bridgeAddress). diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go index ec6da74f..a358cf67 100644 --- a/internal/usecases/pegout/send_pegout_test.go +++ b/internal/usecases/pegout/send_pegout_test.go @@ -8,6 +8,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -33,7 +34,7 @@ var retainedQuote = quote.RetainedPegoutQuote{ var pegoutQuote = quote.PegoutQuote{ LbcAddress: retainedQuote.QuoteHash, LpRskAddress: "0x1234", - BtcRefundAddress: "any address", + BtcRefundAddress: test.AnyAddress, RskRefundAddress: "0x1234", LpBtcAddress: "0x1234", CallFee: entities.NewWei(3000), @@ -54,12 +55,12 @@ var pegoutQuote = quote.PegoutQuote{ func TestSendPegoutUseCase_Run(t *testing.T) { btcTxHash := "0x5b5c5d" - btcWallet := new(test.BtcWalletMock) + btcWallet := new(mocks.BtcWalletMock) btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil).Once() quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return(btcTxHash, nil).Once() - rsk := new(test.RskRpcMock) - eventBus := new(test.EventBusMock) + rsk := new(mocks.RskRpcMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.LpBtcTxHash = btcTxHash @@ -69,7 +70,7 @@ func TestSendPegoutUseCase_Run(t *testing.T) { assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() @@ -83,7 +84,7 @@ func TestSendPegoutUseCase_Run(t *testing.T) { GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.LpBtcTxHash = btcTxHash @@ -102,33 +103,33 @@ func TestSendPegoutUseCase_Run(t *testing.T) { } func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock") mutex.On("Unlock") - eventBus := new(test.EventBusMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish") - recoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock){ - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + recoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock){ + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { retainedQuote.State = quote.PegoutStateWaitingForDeposit }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { retainedQuote.UserRskTxHash = "" }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(blockchain.TransactionReceipt{}, assert.AnError).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *test.BtcWalletMock, rsk *test.RskRpcMock, quoteRepository *test.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ @@ -146,9 +147,9 @@ func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { } for _, setup := range recoverableSetups { - quoteRepository := new(test.PegoutQuoteRepositoryMock) - btcWallet := new(test.BtcWalletMock) - rsk := new(test.RskRpcMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + btcWallet := new(mocks.BtcWalletMock) + rsk := new(mocks.RskRpcMock) caseQuote := retainedQuote setup(&caseQuote, btcWallet, rsk, quoteRepository) useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) @@ -162,9 +163,9 @@ func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { } func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { - btcWallet := new(test.BtcWalletMock) - rsk := new(test.RskRpcMock) - eventBus := new(test.EventBusMock) + btcWallet := new(mocks.BtcWalletMock) + rsk := new(mocks.RskRpcMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed @@ -173,7 +174,7 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, @@ -185,7 +186,7 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { GasUsed: big.NewInt(500), Value: entities.NewWei(8000), }, nil).Once() - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed @@ -205,10 +206,10 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { } func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { - btcWallet := new(test.BtcWalletMock) - rsk := new(test.RskRpcMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + btcWallet := new(mocks.BtcWalletMock) + rsk := new(mocks.RskRpcMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, @@ -220,7 +221,7 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) @@ -234,13 +235,13 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { } func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { - btcWallet := new(test.BtcWalletMock) - rsk := new(test.RskRpcMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + btcWallet := new(mocks.BtcWalletMock) + rsk := new(mocks.RskRpcMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) expiredQuote := pegoutQuote expiredQuote.ExpireDate = now - 60 - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&expiredQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed @@ -265,9 +266,9 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { } func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { - btcWallet := new(test.BtcWalletMock) + btcWallet := new(mocks.BtcWalletMock) btcWallet.On("GetBalance").Return(entities.NewWei(100), nil).Once() - rsk := new(test.RskRpcMock) + rsk := new(mocks.RskRpcMock) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, @@ -279,11 +280,11 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) @@ -298,11 +299,11 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { } func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { - btcWallet := new(test.BtcWalletMock) - rsk := new(test.RskRpcMock) - eventBus := new(test.EventBusMock) - mutex := new(test.MutexMock) - quoteRepository := new(test.PegoutQuoteRepositoryMock) + btcWallet := new(mocks.BtcWalletMock) + rsk := new(mocks.RskRpcMock) + eventBus := new(mocks.EventBusMock) + mutex := new(mocks.MutexMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed @@ -329,12 +330,12 @@ func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { } func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { - btcWallet := new(test.BtcWalletMock) + btcWallet := new(mocks.BtcWalletMock) btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil).Once() quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return("", assert.AnError).Once() - rsk := new(test.RskRpcMock) - eventBus := new(test.EventBusMock) + rsk := new(mocks.RskRpcMock) + eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed @@ -343,7 +344,7 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() - mutex := new(test.MutexMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() @@ -357,7 +358,7 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed @@ -376,12 +377,12 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { btcTxHash := "0x5b5c5d" - btcWallet := new(test.BtcWalletMock) + btcWallet := new(mocks.BtcWalletMock) btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil) quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return(btcTxHash, nil) - rsk := new(test.RskRpcMock) - mutex := new(test.MutexMock) + rsk := new(mocks.RskRpcMock) + mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil) @@ -396,8 +397,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { Value: entities.NewWei(8500), }, nil) - setups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock){ - func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock) { + setups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock){ + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { @@ -408,7 +409,7 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *test.PegoutQuoteRepositoryMock, eventBus *test.EventBusMock) { + func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock) { retainedQuote.QuoteHash = "no hex" quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() @@ -423,8 +424,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { for _, setup := range setups { caseQuote := retainedQuote - quoteRepository := new(test.PegoutQuoteRepositoryMock) - eventBus := new(test.EventBusMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + eventBus := new(mocks.EventBusMock) setup(&caseQuote, quoteRepository, eventBus) useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) err := useCase.Run(context.Background(), caseQuote) diff --git a/internal/usecases/pegout/withdraw_collateral_test.go b/internal/usecases/pegout/withdraw_collateral_test.go index 7e4aa857..7befb294 100644 --- a/internal/usecases/pegout/withdraw_collateral_test.go +++ b/internal/usecases/pegout/withdraw_collateral_test.go @@ -4,14 +4,14 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) func TestWithdrawCollateralUseCase_Run(t *testing.T) { - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) lbc.On("WithdrawPegoutCollateral").Return(nil) useCase := pegout.NewWithdrawCollateralUseCase(lbc) err := useCase.Run() @@ -20,7 +20,7 @@ func TestWithdrawCollateralUseCase_Run(t *testing.T) { } func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { - lbc := new(test.LbcMock) + lbc := new(mocks.LbcMock) useCase := pegout.NewWithdrawCollateralUseCase(lbc) lbc.On("WithdrawPegoutCollateral").Return(errors.New("LBC021")).Once() diff --git a/internal/usecases/watcher/clean_exipred_test.go b/internal/usecases/watcher/clean_exipred_test.go index 5ada74e0..d2fce8ff 100644 --- a/internal/usecases/watcher/clean_exipred_test.go +++ b/internal/usecases/watcher/clean_exipred_test.go @@ -4,7 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -30,7 +30,7 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { {QuoteHash: "pegoutHash6", State: quote.PegoutStateTimeForDepositElapsed}, } - peginRepository := new(test.PeginQuoteRepositoryMock) + peginRepository := new(mocks.PeginQuoteRepositoryMock) peginRepository.On( "GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), @@ -42,7 +42,7 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { []string{"peginHash1", "peginHash2", "peginHash4"}, ).Return(uint(3), nil) - pegoutRepository := new(test.PegoutQuoteRepositoryMock) + pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) pegoutRepository.On( "GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), @@ -65,18 +65,18 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { } func TestCleanExpiredQuotesUseCase_Run_ErrorHandling(t *testing.T) { - setups := []func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock){ - func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + setups := []func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock){ + func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError) }, - func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(retainedQuotes, nil) pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError) }, - func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(retainedQuotes, nil) pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). @@ -84,7 +84,7 @@ func TestCleanExpiredQuotesUseCase_Run_ErrorHandling(t *testing.T) { peginRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(uint(0), assert.AnError) }, - func(peginRepository *test.PeginQuoteRepositoryMock, pegoutRepository *test.PegoutQuoteRepositoryMock) { + func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(retainedQuotes, nil) pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). @@ -97,8 +97,8 @@ func TestCleanExpiredQuotesUseCase_Run_ErrorHandling(t *testing.T) { } for _, setup := range setups { - peginRepository := new(test.PeginQuoteRepositoryMock) - pegoutRepository := new(test.PegoutQuoteRepositoryMock) + peginRepository := new(mocks.PeginQuoteRepositoryMock) + pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) setup(peginRepository, pegoutRepository) useCase := watcher.NewCleanExpiredQuotesUseCase(peginRepository, pegoutRepository) _, err := useCase.Run(context.Background()) diff --git a/internal/usecases/watcher/get_watched_pegin_quote_test.go b/internal/usecases/watcher/get_watched_pegin_quote_test.go index 3f2f380e..47e76bd2 100644 --- a/internal/usecases/watcher/get_watched_pegin_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegin_quote_test.go @@ -4,7 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -28,7 +28,7 @@ var peginQuotes = []quote.PeginQuote{ } func TestGetWatchedPeginQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PeginState{quote.PeginStateWaitingForDeposit}). Return([]quote.RetainedPeginQuote{retainedQuotes[0], retainedQuotes[2]}, nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[0].QuoteHash).Return(&peginQuotes[0], nil) @@ -48,7 +48,7 @@ func TestGetWatchedPeginQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { } func TestGetWatchedPeginQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PeginState{quote.PeginStateCallForUserSucceeded}). Return([]quote.RetainedPeginQuote{retainedQuotes[1]}, nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[1].QuoteHash).Return(&peginQuotes[3], nil) @@ -73,7 +73,7 @@ func TestGetWatchedPeginQuoteUseCase_Run_WrongState(t *testing.T) { quote.PeginStateRegisterPegInFailed, quote.PeginStateRegisterPegInSucceeded, } - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) for _, state := range wrongStates { _, err := useCase.Run(context.Background(), state) @@ -82,12 +82,12 @@ func TestGetWatchedPeginQuoteUseCase_Run_WrongState(t *testing.T) { } func TestGetWatchedPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { - setups := []func(quoteRepository *test.PeginQuoteRepositoryMock){ - func(quoteRepository *test.PeginQuoteRepositoryMock) { + setups := []func(quoteRepository *mocks.PeginQuoteRepositoryMock){ + func(quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError) }, - func(quoteRepository *test.PeginQuoteRepositoryMock) { + func(quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(retainedQuotes, nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). @@ -95,7 +95,7 @@ func TestGetWatchedPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { }, } for _, setup := range setups { - quoteRepository := new(test.PeginQuoteRepositoryMock) + quoteRepository := new(mocks.PeginQuoteRepositoryMock) setup(quoteRepository) useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) _, err := useCase.Run(context.Background(), quote.PeginStateWaitingForDeposit) diff --git a/internal/usecases/watcher/get_watched_pegout_quote_test.go b/internal/usecases/watcher/get_watched_pegout_quote_test.go index 242f66a5..338b34e7 100644 --- a/internal/usecases/watcher/get_watched_pegout_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegout_quote_test.go @@ -4,7 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" - "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -30,7 +30,7 @@ var pegoutQuotes = []quote.PegoutQuote{ } func TestGetWatchedPegoutQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On( "GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), @@ -59,7 +59,7 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { } func TestGetWatchedPegoutQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PegoutState{quote.PegoutStateSendPegoutSucceeded}). Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[1]}, nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[1].QuoteHash).Return(&pegoutQuotes[3], nil) @@ -84,7 +84,7 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WrongState(t *testing.T) { quote.PegoutStateRefundPegOutFailed, quote.PegoutStateRefundPegOutSucceeded, } - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) for _, state := range wrongStates { _, err := useCase.Run(context.Background(), state) @@ -93,12 +93,12 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WrongState(t *testing.T) { } func TestGetWatchedPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { - setups := []func(quoteRepository *test.PegoutQuoteRepositoryMock){ - func(quoteRepository *test.PegoutQuoteRepositoryMock) { + setups := []func(quoteRepository *mocks.PegoutQuoteRepositoryMock){ + func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(nil, assert.AnError) }, - func(quoteRepository *test.PegoutQuoteRepositoryMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). Return(retainedPegoutQuotes, nil) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). @@ -106,7 +106,7 @@ func TestGetWatchedPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { }, } for _, setup := range setups { - quoteRepository := new(test.PegoutQuoteRepositoryMock) + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) setup(quoteRepository) useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) _, err := useCase.Run(context.Background(), quote.PegoutStateWaitingForDeposit) diff --git a/internal/usecases/watcher/update_pegout_deposit_test.go b/internal/usecases/watcher/update_pegout_deposit_test.go index 4defdcce..eed4f93f 100644 --- a/internal/usecases/watcher/update_pegout_deposit_test.go +++ b/internal/usecases/watcher/update_pegout_deposit_test.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -33,7 +34,7 @@ var depositedPegoutQuote = quote.PegoutQuote{ CallFee: entities.NewWei(1000), PenaltyFee: 100, Nonce: 123456, - DepositAddress: "any address", + DepositAddress: test.AnyAddress, Value: entities.NewWei(5000), AgreementTimestamp: now - 60, DepositDateLimit: now + 60, @@ -55,7 +56,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run(t *testing.T) { BlockNumber: 480, From: "0x1a1b1c", } - quoteReporitory := new(test.PegoutQuoteRepositoryMock) + quoteReporitory := new(mocks.PegoutQuoteRepositoryMock) quoteReporitory.On( "UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), @@ -115,7 +116,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { for _, testCase := range cases { t.Run(testCase.name, func(t *testing.T) { - quoteReporitory := new(test.PegoutQuoteRepositoryMock) + quoteReporitory := new(mocks.PegoutQuoteRepositoryMock) useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), testCase.deposit) quoteReporitory.AssertNotCalled(t, "UpdateRetainedQuote") @@ -145,7 +146,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_IllegalState(t *testing.T) { {State: quote.PegoutStateTimeForDepositElapsed}, } for _, retainedQuote := range quotes { - quoteReporitory := new(test.PegoutQuoteRepositoryMock) + quoteReporitory := new(mocks.PegoutQuoteRepositoryMock) useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, retainedQuote), deposit) quoteReporitory.AssertNotCalled(t, "UpdateRetainedQuote") @@ -166,18 +167,18 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_ErrorHandling(t *testing.T) { From: "0x1a1b1c", } - setups := []func(quoteRepository *test.PegoutQuoteRepositoryMock){ - func(quoteRepository *test.PegoutQuoteRepositoryMock) { + setups := []func(quoteRepository *mocks.PegoutQuoteRepositoryMock){ + func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) }, - func(quoteRepository *test.PegoutQuoteRepositoryMock) { + func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) quoteRepository.On("UpsertPegoutDeposit", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) }, } for _, setup := range setups { - quoteReporitory := new(test.PegoutQuoteRepositoryMock) + quoteReporitory := new(mocks.PegoutQuoteRepositoryMock) setup(quoteReporitory) useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) watchedPegoutQuote, err := useCase.Run(context.Background(), watcher.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), deposit) diff --git a/pkg/liquidity_provider.go b/pkg/liquidity_provider.go index 848cf296..4e715756 100644 --- a/pkg/liquidity_provider.go +++ b/pkg/liquidity_provider.go @@ -1,5 +1,7 @@ package pkg +import "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + type ProviderDetail struct { Fee uint64 `json:"fee" required:""` MinTransactionValue uint64 `json:"minTransactionValue" required:""` @@ -25,3 +27,15 @@ type LiquidityProvider struct { type ChangeStatusRequest struct { Status *bool `json:"status"` } + +type PeginConfigurationRequest struct { + Configuration *liquidity_provider.PeginConfiguration `json:"configuration" validate:"required"` +} + +type PegoutConfigurationRequest struct { + Configuration *liquidity_provider.PegoutConfiguration `json:"configuration" validate:"required"` +} + +type GeneralConfigurationRequest struct { + Configuration *liquidity_provider.GeneralConfiguration `json:"configuration" validate:"required"` +} diff --git a/sample-config.env b/sample-config.env index 593a6c59..a3a4ddd7 100755 --- a/sample-config.env +++ b/sample-config.env @@ -24,7 +24,6 @@ ACCOUNT_NUM=0 DAO_FEE_COLLECTOR_ADDRESS=0x86B6534687A176A476C16083a373fB9Fe4FAb449 KEY_SECRET=FlyoverTestEnv/LPS-LOCAL-KEY PASSWORD_SECRET=FlyoverTestEnv/LPS-LOCAL-PASSWORD -RSK_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' # BTC config BTC_NETWORK=regtest @@ -34,7 +33,6 @@ BTC_ENDPOINT=bitcoind:5555 BTC_TX_FEE_RATE=0.00025 BTC_ENCRYPTED_WALLET=true BTC_WALLET_PASSWORD=FlyoverTestEnv/LPS-LOCAL-BTC-WALLET-PASSWORD -BTC_CONFIRMATIONS='{ "100000000000000000": 2, "400000000000000000": 6, "2000000000000000000": 10, "4000000000000000000": 20, "8000000000000000000": 40 }' # Liquidity Provider config ALERT_SENDER_EMAIL=no-reply@mail.flyover.rifcomputing.net @@ -44,22 +42,7 @@ PROVIDER_NAME="Default Provider" BASE_URL="http://localhost:8080" PROVIDER_TYPE=both -# Pegin config -PEGIN_TIME_FOR_DEPOSIT=3600 -PEGIN_CALL_TIME=7200 -PEGIN_PENALTY_FEE=1000000 -PEGIN_FEE=10000000000000000 -PEGIN_MIN_TRANSACTION_VALUE=600000000000000000 -PEGIN_MAX_TRANSACTION_VALUE=1000000000000000000 - # Pegout config -PEGOUT_TIME_FOR_DEPOSIT=3600 -PEGOUT_CALL_TIME=7200 -PEGOUT_PENALTY_FEE=1000000 -PEGOUT_FEE=10000000000000000 -PEGOUT_MIN_TRANSACTION_VALUE=600000000000000000 -PEGOUT_MAX_TRANSACTION_VALUE=1000000000000000000 -PEGOUT_EXPIRE_BLOCKS=5000 PEGOUT_DEPOSIT_CACHE_START_BLOCK=0 # Captcha env diff --git a/test/alert_sender_mock.go b/test/mocks/alert_sender_mock.go similarity index 96% rename from test/alert_sender_mock.go rename to test/mocks/alert_sender_mock.go index fef0c3ad..a6381fd4 100644 --- a/test/alert_sender_mock.go +++ b/test/mocks/alert_sender_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "context" diff --git a/test/bridge_mock.go b/test/mocks/bridge_mock.go similarity index 98% rename from test/bridge_mock.go rename to test/mocks/bridge_mock.go index 05c8b0a8..f1705b46 100644 --- a/test/bridge_mock.go +++ b/test/mocks/bridge_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" diff --git a/test/btc_rpc_mock.go b/test/mocks/btc_rpc_mock.go similarity index 99% rename from test/btc_rpc_mock.go rename to test/mocks/btc_rpc_mock.go index ae7b0a81..2c319a9e 100644 --- a/test/btc_rpc_mock.go +++ b/test/mocks/btc_rpc_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" diff --git a/test/btc_wallet_mock.go b/test/mocks/btc_wallet_mock.go similarity index 98% rename from test/btc_wallet_mock.go rename to test/mocks/btc_wallet_mock.go index b21de6e8..08037a2b 100644 --- a/test/btc_wallet_mock.go +++ b/test/mocks/btc_wallet_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" diff --git a/test/event_bus_mock.go b/test/mocks/event_bus_mock.go similarity index 96% rename from test/event_bus_mock.go rename to test/mocks/event_bus_mock.go index db85d7b7..31d8c36f 100644 --- a/test/event_bus_mock.go +++ b/test/mocks/event_bus_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" diff --git a/test/fee_collector_mock.go b/test/mocks/fee_collector_mock.go similarity index 95% rename from test/fee_collector_mock.go rename to test/mocks/fee_collector_mock.go index 763d0020..396c59f9 100644 --- a/test/fee_collector_mock.go +++ b/test/mocks/fee_collector_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" diff --git a/test/lbc_mock.go b/test/mocks/lbc_mock.go similarity index 89% rename from test/lbc_mock.go rename to test/mocks/lbc_mock.go index b31eee55..7564bd0e 100644 --- a/test/lbc_mock.go +++ b/test/mocks/lbc_mock.go @@ -1,9 +1,10 @@ -package test +package mocks import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/stretchr/testify/mock" ) @@ -72,9 +73,9 @@ func (m *LbcMock) RegisterProvider(txConfig blockchain.TransactionConfig, params return args.Get(0).(int64), args.Error(1) } -func (m *LbcMock) GetProviders() ([]entities.RegisteredLiquidityProvider, error) { +func (m *LbcMock) GetProviders() ([]liquidity_provider.RegisteredLiquidityProvider, error) { args := m.Called() - return args.Get(0).([]entities.RegisteredLiquidityProvider), args.Error(1) + return args.Get(0).([]liquidity_provider.RegisteredLiquidityProvider), args.Error(1) } func (m *LbcMock) SetProviderStatus(id uint64, status bool) error { @@ -82,9 +83,9 @@ func (m *LbcMock) SetProviderStatus(id uint64, status bool) error { return args.Error(0) } -func (m *LbcMock) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]entities.PunishmentEvent, error) { +func (m *LbcMock) GetPeginPunishmentEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]liquidity_provider.PunishmentEvent, error) { args := m.Called(ctx, fromBlock, toBlock) - return args.Get(0).([]entities.PunishmentEvent), args.Error(1) + return args.Get(0).([]liquidity_provider.PunishmentEvent), args.Error(1) } func (m *LbcMock) HashPeginQuote(peginQuote quote.PeginQuote) (string, error) { diff --git a/test/mocks/liquidity_provider_repository_mock.go b/test/mocks/liquidity_provider_repository_mock.go new file mode 100644 index 00000000..c07a0f1b --- /dev/null +++ b/test/mocks/liquidity_provider_repository_mock.go @@ -0,0 +1,43 @@ +package mocks + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/stretchr/testify/mock" +) + +type LpRepositoryMock struct { + mock.Mock + lp.LiquidityProviderRepository +} + +func (m *LpRepositoryMock) GeneralConfiguration(ctx context.Context) (*entities.Signed[lp.GeneralConfiguration], error) { + args := m.Called(ctx) + return args.Get(0).(*entities.Signed[lp.GeneralConfiguration]), args.Error(1) +} + +func (m *LpRepositoryMock) PeginConfiguration(ctx context.Context) (*entities.Signed[lp.PeginConfiguration], error) { + args := m.Called(ctx) + return args.Get(0).(*entities.Signed[lp.PeginConfiguration]), args.Error(1) +} + +func (m *LpRepositoryMock) PegoutConfiguration(ctx context.Context) (*entities.Signed[lp.PegoutConfiguration], error) { + args := m.Called(ctx) + return args.Get(0).(*entities.Signed[lp.PegoutConfiguration]), args.Error(1) +} + +func (m *LpRepositoryMock) UpsertGeneralConfiguration(ctx context.Context, config entities.Signed[lp.GeneralConfiguration]) error { + args := m.Called(ctx, config) + return args.Error(0) +} + +func (m *LpRepositoryMock) UpsertPeginConfiguration(ctx context.Context, config entities.Signed[lp.PeginConfiguration]) error { + args := m.Called(ctx, config) + return args.Error(0) +} + +func (m *LpRepositoryMock) UpsertPegoutConfiguration(ctx context.Context, config entities.Signed[lp.PegoutConfiguration]) error { + args := m.Called(ctx, config) + return args.Error(0) +} diff --git a/test/pegin_quote_repository_mock.go b/test/mocks/pegin_quote_repository_mock.go similarity index 99% rename from test/pegin_quote_repository_mock.go rename to test/mocks/pegin_quote_repository_mock.go index e197010d..e80e057a 100644 --- a/test/pegin_quote_repository_mock.go +++ b/test/mocks/pegin_quote_repository_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "context" diff --git a/test/pegout_quote_repository_mock.go b/test/mocks/pegout_quote_repository_mock.go similarity index 99% rename from test/pegout_quote_repository_mock.go rename to test/mocks/pegout_quote_repository_mock.go index d63e9f7d..666d3365 100644 --- a/test/pegout_quote_repository_mock.go +++ b/test/mocks/pegout_quote_repository_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "context" diff --git a/test/mocks/provider_mock.go b/test/mocks/provider_mock.go new file mode 100644 index 00000000..1ca00247 --- /dev/null +++ b/test/mocks/provider_mock.go @@ -0,0 +1,55 @@ +package mocks + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/stretchr/testify/mock" +) + +type ProviderMock struct { + liquidity_provider.LiquidityProvider + liquidity_provider.PeginLiquidityProvider + liquidity_provider.PegoutLiquidityProvider + mock.Mock +} + +func (m *ProviderMock) RskAddress() string { + args := m.Called() + return args.String(0) +} + +func (m *ProviderMock) BtcAddress() string { + args := m.Called() + return args.String(0) +} + +func (m *ProviderMock) HasPeginLiquidity(ctx context.Context, amount *entities.Wei) error { + args := m.Called(ctx, amount) + return args.Error(0) +} + +func (m *ProviderMock) HasPegoutLiquidity(ctx context.Context, amount *entities.Wei) error { + args := m.Called(ctx, amount) + return args.Error(0) +} + +func (m *ProviderMock) SignQuote(quoteHash string) (string, error) { + args := m.Called(quoteHash) + return args.String(0), args.Error(1) +} + +func (m *ProviderMock) GeneralConfiguration(ctx context.Context) liquidity_provider.GeneralConfiguration { + args := m.Called(ctx) + return args.Get(0).(liquidity_provider.GeneralConfiguration) +} + +func (m *ProviderMock) PeginConfiguration(ctx context.Context) liquidity_provider.PeginConfiguration { + args := m.Called(ctx) + return args.Get(0).(liquidity_provider.PeginConfiguration) +} + +func (m *ProviderMock) PegoutConfiguration(ctx context.Context) liquidity_provider.PegoutConfiguration { + args := m.Called(ctx) + return args.Get(0).(liquidity_provider.PegoutConfiguration) +} diff --git a/test/rsk_rpc_mock.go b/test/mocks/rsk_rpc_mock.go similarity index 98% rename from test/rsk_rpc_mock.go rename to test/mocks/rsk_rpc_mock.go index cfd88f09..687c374b 100644 --- a/test/rsk_rpc_mock.go +++ b/test/mocks/rsk_rpc_mock.go @@ -1,4 +1,4 @@ -package test +package mocks import ( "context" diff --git a/test/mocks/rsk_wallet_mock.go b/test/mocks/rsk_wallet_mock.go new file mode 100644 index 00000000..1b651d28 --- /dev/null +++ b/test/mocks/rsk_wallet_mock.go @@ -0,0 +1,41 @@ +package mocks + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/mock" +) + +type HashMock struct { + mock.Mock +} + +func (m *HashMock) Hash(bytes ...[]byte) []byte { + args := m.Called(bytes) + return args.Get(0).([]byte) +} + +type RskWalletMock struct { + blockchain.RootstockWallet + entities.Signer + mock.Mock +} + +func (m *RskWalletMock) SendRbtc(ctx context.Context, config blockchain.TransactionConfig, toAddress string) (string, error) { + args := m.Called(ctx, config, toAddress) + return args.String(0), args.Error(1) +} + +func (m *RskWalletMock) SignBytes(msg []byte) ([]byte, error) { + args := m.Called(msg) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]byte), args.Error(1) +} + +func (m *RskWalletMock) Validate(signature, hash string) bool { + args := m.Called(signature, hash) + return args.Bool(0) +} diff --git a/test/provider_mock.go b/test/provider_mock.go deleted file mode 100644 index 8e06e898..00000000 --- a/test/provider_mock.go +++ /dev/null @@ -1,129 +0,0 @@ -package test - -import ( - "context" - "github.com/rsksmart/liquidity-provider-server/internal/entities" - "github.com/stretchr/testify/mock" -) - -type ProviderMock struct { - entities.LiquidityProvider - entities.PeginLiquidityProvider - entities.PegoutLiquidityProvider - mock.Mock -} - -func (m *ProviderMock) RskAddress() string { - args := m.Called() - return args.String(0) -} - -func (m *ProviderMock) BtcAddress() string { - args := m.Called() - return args.String(0) -} - -func (m *ProviderMock) HasPeginLiquidity(ctx context.Context, amount *entities.Wei) error { - args := m.Called(ctx, amount) - return args.Error(0) -} - -func (m *ProviderMock) HasPegoutLiquidity(ctx context.Context, amount *entities.Wei) error { - args := m.Called(ctx, amount) - return args.Error(0) -} - -func (m *ProviderMock) CallFeePegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MinPegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPeginConfirmations() uint16 { - args := m.Called() - return args.Get(0).(uint16) -} - -func (m *ProviderMock) CallFeePegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MinPegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) MaxPegoutConfirmations() uint16 { - args := m.Called() - return args.Get(0).(uint16) -} - -func (m *ProviderMock) ValidateAmountForPegin(amount *entities.Wei) error { - args := m.Called(amount) - return args.Error(0) -} - -func (m *ProviderMock) ValidateAmountForPegout(amount *entities.Wei) error { - args := m.Called(amount) - return args.Error(0) -} - -func (m *ProviderMock) PenaltyFeePegin() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) PenaltyFeePegout() *entities.Wei { - args := m.Called() - return args.Get(0).(*entities.Wei) -} - -func (m *ProviderMock) GetRootstockConfirmationsForValue(value *entities.Wei) uint16 { - args := m.Called(value) - return args.Get(0).(uint16) -} - -func (m *ProviderMock) GetBitcoinConfirmationsForValue(value *entities.Wei) uint16 { - args := m.Called(value) - return args.Get(0).(uint16) -} - -func (m *ProviderMock) TimeForDepositPegin() uint32 { - args := m.Called() - return args.Get(0).(uint32) -} - -func (m *ProviderMock) CallTime() uint32 { - args := m.Called() - return args.Get(0).(uint32) -} - -func (m *ProviderMock) TimeForDepositPegout() uint32 { - args := m.Called() - return args.Get(0).(uint32) -} - -func (m *ProviderMock) ExpireBlocksPegout() uint64 { - args := m.Called() - return args.Get(0).(uint64) -} - -func (m *ProviderMock) SignQuote(quoteHash string) (string, error) { - args := m.Called(quoteHash) - return args.String(0), args.Error(1) -} diff --git a/test/rsk_wallet_mock.go b/test/rsk_wallet_mock.go deleted file mode 100644 index 645913d2..00000000 --- a/test/rsk_wallet_mock.go +++ /dev/null @@ -1,17 +0,0 @@ -package test - -import ( - "context" - "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" - "github.com/stretchr/testify/mock" -) - -type RskWalletMock struct { - blockchain.RootstockWallet - mock.Mock -} - -func (m *RskWalletMock) SendRbtc(ctx context.Context, config blockchain.TransactionConfig, toAddress string) (string, error) { - args := m.Called(ctx, config, toAddress) - return args.String(0), args.Error(1) -} diff --git a/test/utils.go b/test/utils.go index b5a99a2f..788c8707 100644 --- a/test/utils.go +++ b/test/utils.go @@ -2,9 +2,16 @@ package test import ( "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "testing" ) +var AnyCtx = mock.AnythingOfType("context.backgroundCtx") + +const ( + AnyAddress = "any address" +) + type Case[V, R any] struct { Value V Result R From 88781d73a7ce1937e70b16745d351fc5976ab25c Mon Sep 17 00:00:00 2001 From: Luisfc68 <60527258+Luisfc68@users.noreply.github.com> Date: Thu, 29 Feb 2024 10:25:17 -0300 Subject: [PATCH 020/113] docs: add pegin & pegout sequence diagrams (#381) --- diagrams/PegIn.md | 10 ---- diagrams/PegIn.mmd | 101 +++++++++++++++++++++++++++++++++ diagrams/PegIn.png | Bin 0 -> 327921 bytes diagrams/PegOut.md | 14 ----- diagrams/PegOut.mmd | 113 +++++++++++++++++++++++++++++++++++++ diagrams/PegOut.png | Bin 0 -> 355879 bytes diagrams/PegOutProcess.png | Bin 249686 -> 0 bytes 7 files changed, 214 insertions(+), 24 deletions(-) delete mode 100644 diagrams/PegIn.md create mode 100644 diagrams/PegIn.mmd create mode 100644 diagrams/PegIn.png delete mode 100644 diagrams/PegOut.md create mode 100644 diagrams/PegOut.mmd create mode 100644 diagrams/PegOut.png delete mode 100644 diagrams/PegOutProcess.png diff --git a/diagrams/PegIn.md b/diagrams/PegIn.md deleted file mode 100644 index 7ae9be06..00000000 --- a/diagrams/PegIn.md +++ /dev/null @@ -1,10 +0,0 @@ -# PegIn Process -This process consist in the conversion of BTC to RBTC. Meaning that tokens will be transferred from Bitcoin network to RSK network. To achieve that, Liquidity Provider Server makes following steps: - -* Precondition: the user has executed /pegin/getQuote endpoint and selected one of the returned quotes -1. The user executes accept quote with the selected quote's hash and LPS responds with an Bitcoin address to deposit -2. LPS creates a BTC watcher for that particular address to be able to monitor when the deposit is made and whe the required confirmation blocks have been mined -3. The user makes the deposit to the Bitcoin derivation address -4. Once the deposit to the Bitcoin address is done and the required confirmations have passed, the LPS executes the callForUser function of LBC to send the RBTC to its destination. -5. The LPS waits until required bridge confirmations have passed -6. LPS executes the registerPegin function of LBC, refunding LP and paying his fee \ No newline at end of file diff --git a/diagrams/PegIn.mmd b/diagrams/PegIn.mmd new file mode 100644 index 00000000..17681a1d --- /dev/null +++ b/diagrams/PegIn.mmd @@ -0,0 +1,101 @@ +sequenceDiagram + actor usr as User + participant cli as Client (SDK) + participant lbc as Liquidity Bridge Contract + participant lps as Liquidity Provider Server + participant btc as Bitcoin Network + participant rsk as Rootstock Network + participant feeCollector as DAO Fee Collector + participant bridge as Rootstock Bridge + + activate usr + usr->>+cli: Ask to convert BTC to RBTC + cli->>+lbc: GetProviders() + lbc-->>-cli: Providers list + cli-->>-usr: Renders list + usr->>+cli: Selects provider + deactivate cli + + usr->>+cli: Quote request info + cli->>+lps: getQuote(quoteRequest) + lps->>+rsk: estimateGas(destinationAddress, quoteData) + rsk-->>-lps: gasEstimation + lps->>+rsk: gasPrice() + rsk-->>-lps: gasPrice + lps->>+feeCollector: getFeePercentage() + feeCollector-->>-lps: feePercentage + alt is not zero + lps->>lps: Add product fee + end + lps->>+bridge: getFederationAddress() + bridge-->>-lps: federationAddress + lps->>+lbc: hashQuote(quote) + lbc-->>-lps: quoteHash + lps->>lps: storeQuote(quote, quoteHash) + lps-->>-cli: quote + quoteHash + cli->>+lbc: hashQuote(quote) + Note right of cli: Validates quote integrity + lbc-->>-cli: quoteHash + cli-->>-usr: Show quote information + + usr->>+cli: Accepts quote terms + cli->>+lps: acceptQuote(quoteHash) + activate lps + lps->>lps: buildDerivationAddress(quoteHash, quote) + deactivate lps + activate lps + lps->>lps: retainQuote(quoteHash, requiredLiquidity) + deactivate lps + activate lps + lps->>lps: signQuote(quoteHash) + deactivate lps + lps-->>-cli: depositAddress + quoteSignature + + activate cli + cli->>cli: validateSignature(signature) + deactivate cli + cli->>+lbc: validateAddress(depositAddress) + Note right of cli: Validate address belongs to federation + lbc-->>-cli: isValid + + activate lps + loop + activate lps + lps->>lps: Waits for btc transaction + deactivate lps + end + + cli-->>-usr: depositAddress + usr->>+btc: sendToAddress(quoteValue + fees, depositAddress) + + loop + activate lps + lps->>lps: Waits for btc transaction confirmations + deactivate lps + end + + lps->>+lbc: callForUser(value, quote) + lbc->>+rsk: transaction to user + Note left of rsk: Here the user gets the RBTC + rsk-->>-usr: Requested RBTC + lbc-->>-lps: Transaction hash + deactivate usr + + loop + activate lps + lps->>lps: Waits for bridge transaction confirmations + deactivate lps + end + lps->>+btc: getTransaction(btcTxHash) + btc-->>-lps: rawTx + activate lps + lps->>lps: buildPmt(rawTx) + deactivate lps + lps->>+lbc: registerPegIn(signature, rawTx, pmt, blockHeight, quote) + lbc->>+bridge: registerFastBridgeBtcTransaction(rawTx, blockHeight, pmt, depositAddress, userBtcRefundAddress, lbcAddress, lpBtcAddress, shouldTransferToContract) + bridge->>+rsk: Transaction to LP + Note right of rsk: Here the LP gets the RBTC refunded + fee + rsk-->>-bridge: Transaction hash + bridge-->>-lbc: Transaction hash + lbc-->>-lps: Transaction hash + deactivate lps \ No newline at end of file diff --git a/diagrams/PegIn.png b/diagrams/PegIn.png new file mode 100644 index 0000000000000000000000000000000000000000..c769c0ebf0fa972d3f98d6db23fae585da4b5608 GIT binary patch literal 327921 zcma&Nby(BU|L~0kN{9hc0-}U~bhm=EG^0~O8tELM2r6BpL!>u4HpU1Q>5?4X4I>5& z7>wQX_k8c`zWqMWAJ499*LIz~ch2XW&%4g~ykB3nHI*qy=}C!*h$vK5Uh5JOk=hdx zQ4-xICbS%Zo~RH$u6gMy%M(=&KHefCdP1c7`jx(a_U;@|JLO&OKAuvm;*LfV@x$LX zT92{hHFcyVH!)N>WglHY={%Bk;e$#zwrz4&DRG24fx0p|5)&L7qhY21~=%Us6~DX___u{f=+lok|2Bou$y>4i+w_B+h5zBdO;(Zr|1Rt2QO>m&(sOeoX_lC+ z`4(BY8L&MB=3RE&{p^|`{f*<*!oYm9R;^p=zpyXsnd;SZf&wx0e zs-`CFs;@fJ5N@U5`*kWt#=;`?4Z)3n2Y>P6racxehbvQtxd*v_`0;Y9hvP=Qi}5#k zdG^qKu>}>&kf{Qw=>E{ppCffc#5Elf|NQ@l`~CE-k|sn^XD1WfY(8F2Q1GRe40Y+Z zZ)JH9h`oyvjs6aG<3A3t>(Uhh5>rZVaLc=T1^WA*V?F|5LDLaMN1b21C?pKqzCSY@ydVOJNSl=}YSc6@(kxPchss=ayCcuUYx z4uh4)ZPKJ)zphg~d{|greLhG*)Sq3|x;^?X?*!b^q9r3kkXc;9bUz!3qW)mg5Jdu| z$%H~>MZ`{fQG0ss`@tK;(K^}*$CEbK0@pL1L_`kyxmDi_K8p2TQ;WaC8g~A!slG+B zz}LnE^ltUKVf6y$c2ZVUr0jMYym9mD`EwOg3W`5|tq)5%a*cw$s*zQv+Y=QQz@q`e z&(Rq_pD4ce-$?ryz9A*%75(FloEOTZ>gw{{e)o*fP```zde{e$Pk_)Q$v`b(LdJ`gc=OcW0e2s$0S2D=1?v`^;()r;1bv?th z)%V`q($X*cQf~>e$K4uOfy>Pw&U*cvt@?5OsDq}($!!lbwF@+o4qFQ8ui10kstQGo z(pVmI$;zt4%Rv3zesLQHj!#cR@R)^Eq- z!>_Q*WYeT%s_N=hseFI6>s3a&3=7Nr;Sfh|g4^78@&munbM-2Dg%-$jA@;b4L92sQ z%Xk^~PN}e4n@2-ICl&4i%=}NEKRjX)pG1sU+O95Vg|`IM87^Fj61oBs?0ezLH(_sX zXVlR09EnXNm~EmnGH`4TWo|!Zn>knCzy9PFabWmUGhRGa_u5|vkjDf}S$^cTGOS$W z-kLuf5qhznCCg*ZbxZg7dfiiDVQognF%hCipR3yT^cm6B>Xa*%!< z4nN*3KqD}Zo(+ZkLcA#V<7ee^!pLC~?h)KdOU@p|&{*W*RYjFn5^c=y+1s}h0%?%# zCO=Y6PE@Z+OOo|xhK0#)(-TD#<3y}{ZxWA)nX6#2*w@CN;lEFrfxv6!PLZGE{F=kD z4~!hJXC`ky7`d!01A%W(Y5U<}VPT3VGU!_$GD4R5LJ#Ms^7F5GLCFvGv;y4uU^5J~ ze}m@#dHr~+Y*m~`JE?j3m1BMHe#f^b?oUd+<@l-oj|kygSVs)O&^%7}W=ZVtYPdi7 z|NNQXo8d4a0j_b8sNDP^V{XnXi}#;Sh>kuGIw36R{5TgyU-9ko+J}sEfVufm&W(TjUcXD2@alXEd_l9hZuDY-;Nzto|4ZaC zLFCDcendoo*3jje_0|Y{L5cAnnJ~DLRWbAJyQv>PHskRFVqRGof-P6EZY3(Oi<sG)GHuFlj>e2cDld7)1ei*^kv1|MzO|<@yF!)n(BkTmMnfVko zBU6`~JHvxJshY>f$KB05IsRAN=r$oxJR2VVVA3>(a9ZEU8?tzBuQhZqE||uf(@^+d z!rBC3p&{8F^Oo8Q4J^8^)mU|9D0Ghy9Fm5gcl@q4`8QGc5qd9u>)o5;u%ChTLjWfG^3 zsF!n1;}E{KUC;~xE~rho$=iFW z(=!(Y*L1ugce=S#)dF#@G`e59Xw_r;l=j~YA}sNC|L^ojV#}*FzH3;5Uz9nw{gxY? z6!u@~Vdq2f1v(<4{szst^VOIrw8aD_cF3_k^7WKh>$m1kn$ot zk87LWd@7B1_4;10UEmi@kvxB63@XCu{b}23YiZQ73u+eKysL1PyA0+=lRwr4RZuWI z_AO zMAG`a+mo2ruF{*dr?+7RFK1wvM$~m@5$=+h8?I9U`WnfM{u?pA?*5t=&XO0Fjg{y* zzUOt50!DiStX)4hBGd9Q8})VUT2AOcdu){a9)FW>@cS zm6qsa9ukuyH}O;O^Yps37*SZn&XSXu|AoAqLB~rw(LNj^5k>5dcgfQnGs^?{_BIwD z_=R{L1h{rfgV(3}<0)|lR!QmP(wyUK_M+ zZQmbee4P&2T_!IS$*Y98Z2b12g}3)+?mND-$mi;$Z$BZ4dpsp}sj}7@*QSEb zsx3!ldv?*clPsPVOLK^CruO=AIJKu<2MWGYuBcebj`}=Mhd}};TE_qdJ54`B5kmuW z;`J9%V9njpy?z>7SWwk)CyI}|YBMHtHn|Na>y8)+sb0TQf3}fP(-^bOAX^e^8uD$n zte=L5Yjnpn7NF@mi@t%Hmjn4$?R$lL31T7yYTmLFoq>FTo-fpIF!a>eRpJ-cbpF<7ud()!4 zp9qCCbN|^-b-KG}P$py%G~Z|Vwy|(GuNS?I;Hp#^VY!GRf!`#0Bp%KwpJ?AhD;eZS zn^vV;DCCq>>+pg&LP^Onz;+UsHVc?;Yf&rPh_=o8+Mkhhg3YZEWMGXi0aQBsaPeKd zbQhVQ;0tXr^oUfQmm~4%32)S^({g_VfbdAGmTkE|pLon3jsR%HHZ<)%HqPt+mT{H+ zD6olWk>im!!n#~C06I;vt^au^avP$x?Xnc_J#b{osFG6h zl)q=REG}-wsZ_SCx1FwO{rvQ&M`BIy%e*dNv5jc!zPTa5!dr>6E97|}d5)(+)wSyG zPrvv6w5CmP7WNgyLDj*Was{VeeBA+?u-^JX-8tDg%pdtZOTE-<2hOAE4_#!dqU^)v z^$U8jVkr(}3?45_GW+U4rsy(q2+|qYdDr-2!+6J8PPZou03P5P{&4(`9kmhhcZg$= zc1z)oH#Tlo+tNH6`Uw|t+cH|*j<~yarUkb8h-?iX&si7q>KuJ7g%1`oElT^0(}f4; zgXB~=+>KrpelVo30-8z>NCkd_(YtTbFt2laq`Iwc&EFt9orha$_KfnT)wRuC)RB3H zoZ-2=Mu=x=y~2&&|K0w|jTq>C`xRf+cZqwzI1TqTT9NIzYCl|XsOP-+<8qhVTqkw~ zDxJ(e%&R=5Y92jXnEhc;`$z&{p8Nnq#m(WPQee~H#_=ZAC~G)nyQ3(gP4Fy7OY=d0iWjiN6|@z@O0B^kV*3pR9N-W;go7`I*EhQx;ognf?x*`)sY z?tmNp`tegn)x1F|!{tPCYk6vACyO~-Q>6^#gGp3!|cfcx5c|dKx?qYh#ZD^|4%6iyH0+9;&=Sz;_6)eZ`P-YF z-QdLH877lPoO7=r(Use_*GCNyz%vu(WV$Mm11{IeLUk;?G8^dfsb1BiOQzgv0dls7 zq`h4zT>YMQVxXF<*`dj#ZO31cJRnMW3%n7fi3(LdQJcu6jNTjaQ`7B@&YU>@oxQ2A z;FB|5Z;w_G;P}O(s`lpb+1(;8k-)FeHozK%lV(Qj%b$PM;e4J>N0U>L^UnS0mKF1H zq@`i8-8kz$vy9l6h|d-M*M7L08TuGkNE)~S2ETmkSB-_Usgz_w?sB_tkWD*;YBIp^ z4#x&n1ZN4O+DuNRXPm*;LMK~he%Y@-0v8vBl7Uhe9Pt?PoR+QOfjazToBnBnD<;wt zS=PH`;0*?jy|(DC&zm=o#SWwsce{y1{s*P2+v(=ceKNu4yKx<44RC9efV$ znD%xUtB3m{;(VJ&z?M4SNfob3rmuTuScY+iqyLvO2pJuiBYB zWNN<)NCYTi-9!{dC#Z!Y);ikP&%TgxttW)B&V5I}VF{5S@^;9CwGY~?fx*DBK}6nj zZo7(v!$C+Tc><=_9*K+uCjL-+Dc}>d$q$7y;i$h zi?k{BcEDWNMCeRjGVqjc{LE7WTlLcxc>Z;o<%fecDdoxhLOAT~kKp@S59Ys%MTn}X zp+2|2`WLK)hz9Sa$+XtDDFYXPj`3Rk_f9iwCq8eX%dUeiYHzK)w(ImqE{+!T&K_iA zq#`kf#8Bozoq<35UZd8o3kS_nvUK9Un|@OW;QC&8TjI*#A1@8viMT^CDmy}0hQAw= zo|5(dVMb;NaY!CpavJ|r)ma@ldi7Dzi%eg(Q?&LWvzP~db}m@611@(E=St~vWMWn% zmE7#kb*?va3q*r6$}r76N{yJYoVbeGSuu;z6iLGyF`(qM6K$4Vc}q-EH74%{sPqc@ zjq0H4~El=9RmN#9RLGE4jElh3zz_WLQVm&%xi0BkT={e zwjbTS^;q!k%4l$u@Og{qu*@I1iBbGK1;GN@j=Cg`JQQ>9ENrMZ-RMM!b-`&VM__`q zwh6ZUv&^sQ@$-x_7UG~9KCM2S$7^?qBPkIvoRSpknT<&B7qXv?Mgm^<2?t4pG=BfX z(CGLYZXao>&WjAs8?q(!U-TkMkA#we+t@3D9dR+`nj^Zo6|+eUwav$o=(>VcN7<^R zB(pUrXmfI~;gn>>TtqV4Pp8HaUnsMsBiP8h>C!{OHOtI?^wqpJT`vWvu3FVvkvjHF z@?eBZl{g~4A1}ITF zHQ-^s-w;^Bt`)%H#?4alddkB_ddWsZ*JU$6WXv*gIX5E^OT?s$1mva_J=mZJ%IzfR z_N%Wp1#6a|=Tk@7ItI1r?E;LsT>~Mru-c%)C zA??x0fB1O_0<}vP%_520CwTM#hhXs*y`M;DcwD>A0PV)auL6Q6W%M5f)!N6j0$&yQ{=tE2JF`E250g+p(Je~XM5(p*g*CcPPTu%^KJhDRw(pjE8=x>ZNu>LJ2-@ zYO=Bz?RRo@0Vi#^=P-`Pr*Ogo zr};Fp$oI_5|FQQTS54_pFBEu+IR*v)Y8$9~4UNg;hRYgqL=8S)>b~iy zVPGHQN0GWPAu_5evCXFn_1}kQLiCaL`lY<3#Wm)fIEZ+Ia0u5smF5Rn*n2n5Azil~ zSL0T^9%{gZO`!`gp2`ULImGL@|5;IuPWRFIn4Fj8pPFVfi5OF#CkvlRCc@zBaNZJi z(gr2+RFV0R{Qw`f=Hl|phA83sZO^qT@8tn<5&SZ&cgyl;PufbSD`kKaA?C#Kc3tUD zkt9($I)LiV^~U`ayGz+f^S*_moUc|Zb%uvL0R^l@ZApC2jjO&EpsoiZ>qU)vYmAV% z0ZyGb*Y)07)fpDbSH|m(vIQTTh0ujeBl$JZ=fp&gvl6dhE6tDhXzf_5k_2XXvpis6 zrz&pX`;Mg@Cl^ok30t-p7)`B!swm`@PppqqqU-cgP3sB8K6u?Kl9Zt!CDrHU)H<6} znFKiLBRL$6$6XDEKNCiVg5whWi_ZR(2rQtd&2lT|*pPO{c&*;)M{EUzy+|d0 zMl8g3F6eb+dsXT0BfS=w7=WG5mYliKLUscFy-Es_ja*B4H5@+UbTOZob!lN*RDZbl zp}3%zyIgx!JqVPCt0&K$ae|wbq#oR+qY}Nk2v$P|&7PgE(;}_GKuF~W{8q}vAV5Mh zPbZnvSfZzW!=)LHcjt%j3fL!K(vphQ{8tNuz!aUcDv}TKUxX9ODw2 zOx8SA6_j13x5+>or6BI$f)SUM)q#7@AjY0%2o_kb^$(JRhq+ps;N99+s^^N+68zoP zv1wCBwH7=%)4j>b#WgS$DZR+T{InCNo)eFScegF`4-VLLzr0%NGj!nh{Q=d1CYb>M z=ELj#S1&z>ZULlBsNo?64>-8Qa+tT?@r4KrQ&+qRQTXgB8cREN+C4P}PK!(7^4cVA zf5x2SWw_O5(TjBcAV)2N!duI=A_0Z*ICWjM-m|>Xuq>Lj z031xxme~UT0>(V{fkn==zXI&lT+!JFW8EQDh3NwVEySL|HrsCm?fG5m5zh;#{>}cx zXi$;s=oRp3`RLC1dF?69-bAB_pg8{3=bf(5h4Oj^)}B$$cxg|mDsby%sTu=C6cD(Q z@U_finp}1q=3AtcH&(Vy-%v#E!sBNcw@o&(ZLTKj>^-9Z(>FKZLH06AR_}*o{c?&; zI2xY=GkO*dxkmBA=uO`q_fej5xqXlOriGh8fH`FfoD&&N=3AM2oeqi-e5+t+n~$zt zo{PTbTfEP9Q{j5T4ea~S?F39TCDN7)c8B1gTyBE-jix-UKPe?vU2F>6GgvA(S{Y&65Nw zUX%D@PK)XdJZh|+W^zlCMrmyOnEZj+wZ5B{JMi!5=Es1*-CntRbpv8(^%MWqLw`dq zPbt10k7aWSY3F*^qaUeNeis)lrYB2R%y*%DO48KFD|ez!IFj>cyQCkU1e&0vP3MJuO|uc9mttH zKCH*t7wq^s#xQrt##pqlWy4XT%b)11Vc6@V-&$#9GRNLVEl*mZ ze+5jjtO=c+DY~C{YJ7I(VY~BsrQ2FCgIreul0CxuA;S$m*WPu5ypx|U7{wsUXy|BO z@&NN#*EiI3+DYbHTpzwPsg|_m?Tln+qdOuyD!{4af7b#G8gNRhB_=nV7wczWdZk@ghbAh)s7V*hx9>AjSDsRra&HxRu1i*1X}ctw}kOJe>axV4J|A@(^vaA7-1 z%|b)JC&5s@0M#477wWxulzzI`{o~C-S8HZpXp!WpWXsk3fyeJZ&G%Qn=tYtJG@9&v zOvLXq;N!H*&ov=>S*EAHYZBpW4p^y{u`8gG@{Ukf?d*O|H(m+lZE^wX4+$OU62Wlu9#z%LwoqP%mFOG$@N zxvvR5w%Tb35K4zgZrP>zxnZ|S(eJx?w}m-a9oNW@fNrWtX708fZ;X@~9*UU9`7O(rtx7}RC9KmC(o5Jt1ZkO@)VW%mN*8|ECxA!51c`aw= zEoaLMjyn)zE?*TWQawe^bJ-?FG~E3J#l==qkx0+AN?W?PuMcTbjZ!z2!zhsCLYy2@ zpFUKo=ZtZ-3knle^q!vh8ZJnJmNRY}_bO|<(nRI??}X-wsHP?uh*%6;!zdG=Mk2|y^l!`*_*PdMSkxmz{h zIGK@fXct>V$)%a`9b%E(=lUHvHF5q4A>9v*T@Oj&0k2~HSht$Ccig$9MFEbg0%&0a zNYAq#FV#5v_!opc>$DZFnI_e_sZN&+df=P@$=7W6eUV!lYVQCT_&LYr!{)e<-=bzK zPeJxt*|pLl_z)3z*s<^QcRhUAI4@KVae(HFodFOu5us3#z!MNFe9(d>xP}*61|}b0 z`6%*n?@vmIoHhAChPLJbqiYOFYyj0{X^|~>uu%Ysv)#1s>vIf1&m_ZPq}D|Zm5{iO zcp;?1=)*M_q^yxD=51xkMfvS|`dF#NPpNUROTu!}vfX5T>}?Gag8gC zQqt+D-f?t+;v&s7q;EqIUUZn0&EgD_F6U{HuYnX4u9G!kz6F(OHDu?85%!a<-})Gp z*jQ(Zp+tlFJAv3Hq2jB9g;N;vN>eHX6PMZVzWFC#Cj7Kw2nQ!=M#j`I*hM!NCgoik zb*$ZOIGdh25;3>jA8)_sktX3ANxCG7<994Y4-7`QZ~-{ zDkEk+A<#ucdv5uGV6RMh4Ri592K^WctwP)`9uwjIeYMcLnoe#3 z-><&={)YQ$Qz!0H`y>vZ(tojAW_&9!cZ=Zk9{cd@%0dev*~GenPUK#Ck=P@CECQ39 zO{xTbV`Pw}&6#%^5`WlnKT24Yv2w;KnY|x2GsR2yRw);fLopx7&l-Gu9#hO8 zab|K#enf;K9t}kGEO6ERd}6ans>n;pP{%B0ko6OZ^@Y0@EUV4yG_0iVVyK(+4DRLnoCpPKwu?k*d4Wf#ToNsrJJB44hjnDBCsxvOd6&PfhaD&~@{2S=|HkEFI zTYv2}q~G`U6S@I`TBE(t_;L@`sN>7!)rUOy#l ztc|0N#g^iC4b4JvSQ$LDK_$21N z2@**%0hp(ha8)Gvs7wio8{Cs^T5uMQ35?jXKGUS zt|U@<&ducJQ{1qUFW9)5#XYp;nWh|wXRhDEEh$TJ?X1SBCwf>to{|_A_e7ZS##1rn zcdL5dPddT3`^P#}wIPE2u^RTRV0zTHJW9 z_o9SjSM^p&%=lci}}DSQSy?u<*GA zpyz95X9ovM-!C5Ltm5Q$9{tU2fX%FoKV3h@8dwV|%RTFR`M%JuV%bGNcb!|(R5!o= znSw#<$=ZC*@+2~S^;RdUjta+rWdq;`SWq;2gAA?ofF9f5)Pq|AMli5{jzA4_f57E_i9){Z!b zKeP(%tUQS#M`3~tmIkWBQfg;DiMpRfTBSYx0$3H&f}o}}Nh4eL9NYugDionMTZFWU6}ZYe9&x_goNmm-3n`4U(E{ES72 zoLPPM=n+Sf6Y*Qxx6Lh9kRWE~U#(aVi8nGYUaQ@LGLYXFG(}<$5@sD_k+3CBle~jU zQi!upS8m}n7(%My@A|%Pc{qT+Dr8q5dGO`8Bb2k)UcXIbHmeO(rd%%vJSM%(Qe4`j zB{?OMQPL{?2*Flc9%2G+EqYWU407;NDD}wRM?7KRo$2b`(XDRK* zPjRLpTJWc>TT%5pFGIlFWVPN-c%2TW8KJ|QGW^Qq`C5HWC&Un=S`;|+s5FW@Y2STr zQqEwpS*U4Y#}@`sw~i9lSZch(lRVz4OtOm@o6yf6SuWt}cLgmW38&S5XPJ9187h7B z8QdD#YVC0l3$e%JL!@Nh;w(xe#ZA-5*LE3)*JfCb%u?wdqEGrm@`x-X%0DZhJ-BxHMM6|5-<)Q(lzINAqjPDp*CaP_1U(xJ0`#8>+DPK1lzX2o z%p050X*=`j6D@g?G&+Vf*erjw-alZQd$qJow`Cb*pS3>0$U`%}oAm2hi2#d}#WQsk z2t6asXUnwIXeUpK^Qn6U;?dr9A-@-P;o!(V1$?7jlqs%$3|(d-uRNgvv1Rf*>1I=V z19P@RmPi86{G2kreH8Ah)U!n@j>nuyOH%-xyy+SO=}kN0@Di~_=CLPfW7I7=8C!?A zR~bpuZha!cMqSmNK?9G+>D_6*mKBi^`D@oLxEZmld#8+-SE!-qY%KDwvDDz^VAK4Xp3@DY z3e_kIA4uzjKy&4LB)E9^S+WoMW!Sa+b=D3ZOGrNuVe11d{IyJyfGCS@1mf0nqmZ$NIZ)a;=NKpw9MyVMOmm6lARfFo1 z*UEUct;Z|M%xQ^2Y>%_QZ6qIoeUvx@j@SuiMR}2i9$~N8Yx=gGY1$+gXI3&=B;v&2 zv*!!c_0;!a)N%$kxne2rog1-dJzTciZUXnY-nXfLl@^=TDqtP0`^Ie?MAa*Rjc;_1 z?Aua3a#BrV`(4pFP4=+gnt^rb3-wlsHqr)TG!j}_-wom7lNAzQU-k-hQ#+leJ^jIN zU0b-TGq_IcBTT`Fr&|HG7VnIP$(7Agy;Pm8aKebV% zjG-2~_9Om<){vnuF!gSl{pL7Uzle>4Q_u|EXgcnB4t|Q<=-cZ{V(+A~b2BZOV}tji zrt^;rX*0-kw%^ZdE7a*=a`-eo)s_K9 zZXk`-k)MsyS#VcazUvxS32^j?dn$uxH7#6qs??pDf;@{O2)KNb^?i&i(=u@MGW#Sw zNJdyp3AaD9W23Y@!E0O@O<;Wk6Sh(8^PYP};?aH#eeY+KrqoFF1E-%U$hW$*lE3kH zgTSr7txT20rD_2JFfo-8m7_ab&Kv#JOrI5OMA8$s`X(^z%?CDu?jZ_0&VCSaF=d`CR8%Z^vZTqH zOVhWwN%LuG3kmlCjSE3uF4(avYSy@7Z0saT0 zcI+YR=O3{9saFi9<{Hjy=W)r|ZGWJD2-GZy=xG*Ia{?z9^i+B~r_b{E%m;DWZWbBk zpHxi(t|nBeSADiY^{g54(w^psCtAOlrg-!;Xo&bzBPQIci}$r%PNcXvpQl*V^treg zst>4w%yTc@GY);*!_(z~&MK3IR5s9Ft@>U%xW$ym!&`in+Gyy7YgB(dZ3f|4htWB= zggsb8;O+vpqAw-01^|L9gVOxe`HI+j9yh&aLh_h9H?th6BW#bXGd|s^>WMjBTZ*3@ zpc((O*it3USkbg4UZB_DrdW)k4P9$I>;yg_oY1<&szuf5uTJN$f|PuGX0?-r)V8wp zsAS1d`&*_(15;IH_NOFG>toe-1Q&W^4!c@k+&L5kniV-2rn>|o$tTECQ&=Mm4a$^s zT?VHwP9j(oX9Oo4PcPiL`Ho8hIqg6(dl0ZJP~S&wB-e1co>kYI#k85ch1|U46|AZ?eMG6+#HW#Dkx&YM+r7_3;ieNw*cl`Ein@>qcuwxP; zY~ZXoD*um`&+aiG-f!{N6}f1&H!C2!R;a=wU*kuA{n!cLPQ|h`$P^FQ z5_Tby+vv--LOceEcvj2`V=gz*Cu-3$;C2wesRplY-{(A?=A#2=gJV^r&9`=vZSRV8 zkNTRQG%%MH*XY$4+f;CgQMZD6A{&t@AbrTMUoQeg-F14msYy@j`+Sa)=t1SXhn>5z zqIRgc@9WL+`Ul$-Y!$FR``DycD8lLNcCC~JT?Qv<-cQfzl4knk6Scq?&!KfrNfm$7H2_mogW_`6BCI&q%;x z4!9vHfs6J1)Eocx<*CQ6Y&-P{hzaCQ*dg!lp z7)$O5aE&+_c7C`49va9waFkM5W|+Rvg+y_a9ovImagRoMzkL@fVMjOx?0qn9pw?5? z(^`Sq0gqp}Pu#tteL&BqzN>^9m@P_iL~X!ddrYxm6*m!FJVT>dMY@~4{zZ1w+z7NC zh+JaCp%0ngq73ldE+qxeC2=a)rP$82b_8OACT4s7MmQ2<*hY zs*|4k;L9_pL2JF^NX2No>$zn8sW~WH5*&_mC7oFhW>gUe&#fuk&GyZD>(YubrI;|6 z^j>w$kvvHpe3X+`*IsaMbhNh9ZNw?>^h?%RX1|Li)72)r3qgo3H{|G=?eq=43XZIB zJZJ7?I5jRhzI+goD_M!Il^<`M)pbZI-wB<^x1^tAPH)t>05k(5LOd~@2S^~7P$%<+ z;BPi(ABTwTl<%wgKgUw_JLrcX(=D2JYTCOh`Y~@A1(=XuYgf3+n|b0{)Yd08dWQlA zN}lZ1ywJkETN`Wpe*Jo8^}UF;Qlt>q@%F_&_;+F<5Xw*YLT)Vo*?le^nX;tj70;e; zD(Xp4+%ko$X7fVZ$$4YVw8G3&s=dn5sb!&gNoisE;R#!mM71+NEwI@)rD}^y8gMZ$ zw5i{t3P@e;nPQ1h>g-Of@z`~?HiG0_SdOmcFu!r1+4JZXT$pAdYk3j$=Ldi&I-1h! zqpJwG($Cpvz0>1*bZSp(YGKkZQh*3vJ0q2?wh$j3!iZv2u6$8}PEE_#5j0H(o%A7X zJDK95_+{r>c%w3>`DJ#cyKrYAV0OMC`9n6UF zqN`SGlU^%kpY>ixOLWugiT($SQPSYiwJw0!IQXujgWc?-wPR-MsqCuqR6l)#>>_%_ z9_T)78W#NZuQLM)9G3K|fpx66q`+#=4YoZOF1%Xjoo(iBNF?f@g>!XO&ne(dtGG(m z-I4rq8WO+W$NTe#Jaaw!1Bt==rgPdp)~T@Uq{4*T74_wMoqWEWz|7OiAsfp+%dvR{ zCJpEMCp<=_`8{%k1VE4MKoNMeHra#ao2L0gu>?G3 zlz^kDsVz^Do$;kXvo=}_|?`o%5yd>m)1i-d$+W*ksU4ibyx!}Ek5 zKLk?VA(UDJ{?yuJ6VdiRBK(z+5f~LsmbqU}^y9|G5Po;qCjQnY0YGtV4)?wBsO;~x zef|0~a5eFK@DA(NY1{q;dhLTCJ>5*luCps@v?T}_6|X@y?Eq6=~x{j{*{%uQvd{4oeF z)2zFGPD2@?86cyW9b^zSHT9-p&Aa0-1e_GK=IH*M2mMhqk7-iVFQj4oF(5!a25L7D zs!gbM?l&($Z_k*(L;Bho%$DG#*gm(2*Oj!;*e66p>DJNtbN`_#tgfS+%G;i27;q;2 z_)ORCb&DwMbF_7Z;3@MTPi2USbdsF~2l33>aryB2r9RZ}`oX!q)@@^*DGmyXaC)ywoeRk}$OmVr5dGW=)EH;aS& z`ud)LN2bl+2kr}&n)8fz0d#kCygQXT2K=rb-Tw=TQZj~1C~jqKNYNxwu{&>5+U4xK z5QS-(08CTzllqc4C5?^GgY1G-a{Yx~cXm&DT9i1)^-V1$%Eu65A?FGWqF%yn$?bxa z=tuj`lB?K%hE5Oji0F?b1*8~sZ+Sx0iT{Qd9*7a0bhb>v{{yhvkDx0g(QU9nKi+;0b$(_U8tCWU9hSS$ubmf%HKmosUT&H4YF0Za0?g|JOYJoVYjpSX8 zDZKxe%^|{l+>pAF9;y(|O@LpI3EWI_YgbUrDKHeP7hibsGxOi2Ipe-AgfsGkc`wPs z2o%fEkgQb0VsGM40?qY7Fw6K8^*`c^Z3F;D4~5dTv4QQ)B@>97#>OWZZ}cn=(Npij z>%AQbSmuU>dCN2egOSZMnEe-7u@ZPnpk9IJYd=WS2waiOg-i9XU&W!Vo0~6X&?-L? zc!q;+5B~d?Gd9BI^>5^zZr2S3vZ-oG-~UD!@z&4}^ToOAGG7+|g;v5WpYe~z&r)U{ z6YCCoFRpek_V2m5zh8fIGvwcuJ>b8cy-#k1Az-0xc;Km(_BsLa9hi1XCD2JGFkY2c zujYA1`OG#A{7%bRZ~e0bKRzm0tv^Nn-#7l-6^Q3ud=J$(0)BMsmZ}@<|1}GWzXdM@ zxM!50c02PjJq{_$E8%v618xL%wVMC_e<|XD)J=Qdx5&zqQiN&X@|}IsRBLOmtSiE7 zOksf=qW{Ig_17$(4-(mH1qWAGn(qMK^j~%?L`JAC;M}TZ@y&({*hd~e{+U5oN3055 z@rAh25q*k;F!S*6QQm)Ib=lXbSy02+lc!=?z#0?rSF?ry;M;N3k)K-m;)La8K6n+ry9;sn#Z#x^A>wI zq|KU9G<&92`S}ZR5x=BJq!!@m62#%B?$_6K-K+4iGz6xaq_V9|^$t`9Om_jp4&alY z%;e%L2H^vb7R8u?Uc5x12&0~n!4O*Ua)XQaFJ}tk)y&P4x`Y-au01LtXq^m()?Ae+ zIvm!fRR4fKSyHl@(&Hw9+SQ!=FlY6@YXSHd54&z0j~hxiN5YqUPq%8iXtU6M@p4Qm z3}lpyFw>Zd8)Vu>Mq#sV)3xcLC{zo9f$h-Kx=F02o))+xXT|G{$M4R$y5wvGaGbSS z1RKpr2S_>T3dZ{UaqRYmjCy;D3oRYG0UwZ;zI{SW#yoWWt*;g7WYn#v^yZ^K^pEep z7Xt8~&)UF?QntZK=C^+-bM z0Pcx#@w`h<@d@_g+NXgH_z=!)NCW+4_57%nmsJjb?iAH=v9Ysh@6tMY>%E_`F+3p; zf4Qzl&Wt~MHg#YH9QeU=0kWJ*n3@{DJkM(bX#t%^fhTFgvogG9Dk0cW78(J|opWCC8^O`|o3vZ@pfI8PsKU?C)W6vRN zfl{I8X*8i04_U)0-F!}#`6lt$s)a#!Tq<8NqQ@rQwSTIP20dZwzP7@=kTPIFz4+{4 zJ*$Voy%_|XSDT)`Y(DtL4H8|=|17#XbhV30QDb0kH1}wPm6w}c0+o}3v7@3PldgYNWk$h#gu<2F#aNOvRQ)jk(m7qH1=0pLNuSW zEV?`L@~q4KoyXzw(H*}MGMXepr{gZuDbnaKdDwk>N|_XwsagS381^$=W2nn)y0@SE zpmUY^Wq<}*2?9A30?mXiw4UKU5~1cCS2|ahK8vkJTh7|T$`Jhulr0x#NSDA$1f6>u z@GyX*=LRgRi{#{wLJuFlHjl<1DR)Mag*FU5@g-zI^MealsGQ36t6>+5U^gdM>Rcnf z2zhkIkpI<31fZso1;5GcI!GCM<~#4df@*eESU1H)Tb8d6h$W|{Qd}7=-ylrx{5OZ_ zI+^99{{k*?rbMoVg@-3gPz<)cv-7B1U^bJ2At^OA`qd)IVf@)%T?xfRJ0EU2xb9%6bidIj5idL!5I*=gQCm;*i6)j6LoEBoDubd?F0AaLojuP z1vWOa=RG9*X^jWgGRNBJowhyro;?pA#{zCI!euhS+vi;3mTYMk(@c676JiuFD`#Ms z>>hgYw&}_*MA?sb@#o<|J5A`L)$spOviOktOoACu1ndgzbc1BC4k@l0(T{)xABZNX zxI1p5SQ@*TQyGcKv0^t2c!nQpn@_9ByG)}y+pyGnx1$z;1fE z&KzCJ>A5%6?aL1=-3pK5zi2v2I-kCv6RYfM-K;m4C_I8L867O>@TU*Nq4bQ&7he2D zP{}|V1=y{t&Mh(Y1|z)}%olNz48-Qc6MDb>tzm z%mQ-KqIcd6%bg7N9IxY3g)#ad1LU6*pfUPF&yf*6i3>HmXyLf$nBKap6B#=*y&x#Z zF>9m$`jU9}3al?`^5pSDMJ8BZf#pT;9q!fDnH{joa}*cKgu4yrawX(mH@p$kOLVpN zqC&hIs1E<7jZfD+IM?J>Sjm4r%JqWS4{?Uz`sW_VaN2MXfaG0b9n*5Y-zP zts$Tbp|P85a9fRRLbNX^c46lq8+W+s$9CvV5i^L?j4u{tYBLHu&#^L{vWPdd)8^-K z#0jzva+&wl6`^fQOo+aqz$tbW(VA{;Sd%F{khk(&rqUO}i`!jgR9QE@c? zy)eHnPpBoFaWKMYNopDypkSd_54C6iVIy6z{1Gkwll!Z;9*_x0y28A&re;G97In+q zS4AJnM~Vy?jTmObTh{Jh51a}q_yPdb!q`2d2c*xx4g!ru;7))3SEL^L^>5MxRGe%7 zN8KKW{`oigb6#6rpJsnqzkfI%;oASf!@v4X#+~73ze%Ihru&EAr0lt`{Nry>!^(HRNv`vt;Gb%eK@D#d zxi8)a-)5E5ElXCJ4w}Owv3)NJbzd8Z!jZw73wN)`|0QPPCuY^Afp#uhJMk1ATZ5{@ z4v!X0k_%K|z`|+m6|(r0s8|N$31e=gs7p>eV+ttGs?I?ox1$#&v#V_$-f?aKqcAwW zU!1zL;Tz{hPA*clgfy5%<4)<5n~X@>h1D5vN%}ff8{8+iE@EvUazhwSG@P?=*N0v} z%l&@j^6HIzhn;&Ma@|Yzx`&h=1dRam9bHsP?)q4C)%r*`B@T=;t1;o9yG&fG-I6Ox zwM?}xb-XQMeaEwwV8j{^o@|ii$#-*Rdc+*2<2K`cB7LA3U7Mc%w<&q2{t_@Qa6hrq z;TZ{`E=HGHrFcaPD=8Jt>2FhN2NT^a8zQ}f5Sj}6)>u}LWOb8$bI9w=R12Zr&T`O+ zZEMe}!2&tGL>qNU#()cDbI_AUy`=M8VakW9Q|_^(Q;loNL7`w0aBFz9pBCMcy2zT} z4{kV6R53^+gEp}f>1rU5=c7eGtK^hLbXkLJtk;bp|0e!i5;;2_%}{=d;6!U9x3x9m zxRPVK8uow0(rNi!ddU$*-1!~ zRUB4$CjyriHM2_Ym*Lz%Zjk74V{HZNIq|}}l9lq;%v1_rnY5-E!28u?U*vW{gVxf9i<0Tnff3+Nd-`@uQL-h?wW`zhWG(Kx7J6~Q^XwUy z3i8f-A*$+#u!y!zazyLqOs_Q7ZyRUun!a{WDYdgal_0|liZrnGP!84@uij5kHAeGR z5B3M6!7FimC*3P5@JoC?Pl*2hvPAm%0Pi!^SJOPs@l{s8?VZ~5_Z~ZY+^XXGda&RZ zdWGxj2$kWJw(427Q&sAwsrkK3n0mI(T^9_c{YgB!lG`(t#;y5A0&E0Ef%}|onz{L> z(Gxl^4{cduDRQ?1_el!1b~~O6H>+0~h-I3(cMNBOzR^WS|49@?#UYk3 zvfp08VIdg~T_zh7mF(#Gyu@l?(+If4P@sF(6O|8*6RUCc`RI&dh?Z_G&YoH4SxFUhPdidFK$dqh+9?wl&K z4wl`EVy=sc(_q*}u(5TPjaoRikw0QPDkL@6G%K5mZ;CRMks$H?kYBw{)YV%b-4Kla6KB*va4Lp>;PcpDJ504K{+MSu*dK&z%R{u9Utk z3AI3ujr=481So`0RW6wzdwYIh-JFy~+hmoUD~1f+h!*UkvSYP@p0{|^)hEStXp+6v z>;eZCJX0EWcVV_!-;R8~ro6<-pX$!zN3y%^mfsHbebJ1v18>f~XFc}8I#D=-mHGNH z8ca89q_x6O{~<&hlHC%Xj;0c&jEI@|l+KQGxWFUhIh-kz`wSmzvpaK6G^QLIl`ON5p&Der}sQW6?! z>7+Lvu$;^DF{>gU?rBfY?Lnu5v$9W{*;n5HqZLke5$j25N9E(M>4n{uUDg$lyWPW> zBH7rY^#GZjyw~;hIj9GD{WNa*n`{<_ z>*tE5q1iGnaj+{(Sx$^e+omJhOE5e*piFyc@7`>yyMe*bEeRa0dEDH{;InUkn6Iw2))3u3Dy3tP1*~i_$TwV-My;U9I^9u5J!{ZWU|ef%vkje zf0u8BHZE3mbX4(-twfjGr0967P+>NgQI%&Lvc`y)R2`jslt#uKsv0t3&vgQ}V&3xA znKo)l7F0Dn#Obm`;QKu!YalMEY-f02Z=xq(f4Z=pmSBm|&GVBnw-yXsT9U{>p*g}} zhixd>8kwu=8-TrU?k%_HCD|v(=0w+Rn3MGURiRXHaWVRXoEh&<3~*WXl0_2V@pizY z5sFNG$5t!mWBc7DztmDjd}#3S&e9!tM4meZSeXUv=%qt*ZIaK$Luic3$roFT3-760 zU{IF1%7P1QDI1Cq)nS!|ol^?z$M;m&)1+f-(1)JjJbN=J$ z<{p<7QVbk(3{m~@3X!o7uBj7bBX+71g7?JbZ+Gq9#6WK3&!eg~QGuja!{?KLQE`pB z(EDIv&PBrJcEi?*o;U6nJG2-s&FzC7!!r3$+ASiwMuHKQG*la+V*@(lIX5T}%Yp^_ zTq)zm%mqIs-1WP2N{)#Pxja;EoSiUS6Z4X@tnO=Oip|f@?c=y?1URjeGi~vi!G7+4 z#z{(hSD0!d9JHIqoCR<+`GQm_j*y1ZA%eAYCZoR(efN4~^6KYXw zC(W#@Q^t0%EvW#0swf#_V#eM-(Rao40PgY=zpO+6qLgBvV}m;-%dSZ;9sLa0Ga&~D z@0iW@zm$X(OR(i8*_YM4eB77!)SK#tZ2Vn&na{uum_RF-yU!)8xjJj-@=l}EEAP!3 zuh3`8OiwVw`_gHiO~7#GK4A3my5_ ze!L!P^lt_ZQ}#l~?CMH}BmV4K5ge|~3Rc0Z@*&8D5DAMRyS@>06E?kF6sbA1WAjwp9uW;a+*5BKufrAx{W+t{ zMANYXm+9V%3hqrQ(vJ+jS{(nj=YaysMpGwLzgQVYBwb6F(>Wz6vBD%16-2w9g71zN z6l~R=caQ+<4OuQ>TI`&cnFjao2-^=MOY4=bcQS4LXbTHzY57*+Zlj0oVc%77KJ*N) zKTA$lFTIake?DpI{Hlr1IfvsPtlhNV3opeDVCI6sr-=--xxw2Q-iS?8PHJlH!e~Tl zKF6{+|GfG505f*pJP*u3=Qc*fHZ;6s_MC%gR%O;I?-M4ZwhlwMv?m5jnpYc*Vq(rQ z`^PhU8gjHGi8qjjL{^K~PF7&iVyK%i%REecwfh~|G&rbPIZ?*f@S6RiCRjUE<=e*m zMUGu(mz8HJDVMAlSeYXDt8;Y>uO)v{JO7-hwO1qDG^$C@=87T}E1*~^Z;=m2xKBUl zsf&K_BYGmEv`cxzsSHyjb7|{J%BJ6;y;ZVxY2*V7b1Hy5BL2*`P&M;akwYnOyy=VA zIlG724}QR7Zmv#e&n~YgZ@MYpah$*uiP|#b9_rIqb<>9Zn-CEdMg<){PsLx9=tn8e zpFGJQaJLzAGTV7SE2e#g_lGH8Gq1Ivvvn^Py4MvT5kA)}RJ?pc;oD?e`*~I}=|WF; zm4eiTLb`d8I?G1^#2qi#yTen8MA4?Sdb>6TELE(zO}Z}im&V2A?mY6->at3OMTA^a z1?D%ZoE^KjXp>%WxWB>Sw9D$%nVwzr+_|k0 zm#dDUwLf8GcYWhDKJdN&f=oQJ`p}+0#A0H)UX&s^x2=G6u;^JwMaj!sW$JR{((Hz< z>d(u=&g&mSLqoT$B-1ZKA4R5U1f{cmzUtbjTI&cENn2`HB**3Ql0&u5!{P)J;^?wrK{@!S} z-C5B8!k#an2T}k+xtYOgGvEOd!b^aRZrQ|A0bW+m^-Q=Pz43VM7ZLf7F!z7N9{iUB z{Qu--yWO0L2Jp1-XonXfbzJ8fP9c&X&v`f#Gih>#C-jO@l-UQ znr{^6cJnyT+vAfz0*r(_m^*n3$R~Nk>pwTZ>6n8t z!l4r;W}6uj8al}yIDYv9*RNq4Phy1oaDK097dJ$z&EVnNr)L_1W^d67jS7u+5W=4S@`-DQe9x#zZ&C_XFiVkcg|3J1lHbx(ZUds7>n`x=t6>{L8 zj@wv-`;pp-_Eb_*;)Z;dk%OGc;q?2*l@bvN$o(&%hW?Y0^Z9N6B|Oys!OOUJ`c4DZ zd1ld(N$rR)dwJO$-(rw*R3v-D5S0+xNLg6xXqb*{ib$DFZr06Xg*JBHalCLz8!SzQr|AONVlz*H*@K4c_p zhXC>Wv|$?_9!utxC8wq=Me`o$8nt~B=vb9C`<68R2rK?T*TcisyG-7Su2(j!ZoqVv zr?!pWFO_+#u{2(*(lV;$Dn&n!wy)aCe;)iQvtsU?GqJ>Uas6U)*Ia|a|76PgYpHu^@)xG($FnZ<=$ z=@b^F`|cic<>SreVO3rSqk|nzS-4IhkU-s9>y>ZV6@N3*&a=!#>!pQ3B>vK;+D||^ z0KYq7OS^-ix&sE|@`#pfYs)dMp{E)0;If=L0xgSF*+03MF|WY(2jL#gu+DGCse{yc zJ^i8vD%h9qY_gJTH^-M+GMGhryQs9igl2YRhM#36)Vhz=krdH=JxgI;!VrLyn8+?l zb<)({48IeVHty5pDh0sQ>1dZtCqpsG3UIA!Y510j4`6} z$)~C+>U7w~XuGU_Yr5(wH^(D@^uB7@BS`Mi}FSs4XF?b2Q z%U)tB_=wYR-a^v1zyMs(F>LN5=kQHEKFepNPBU~d+J>yY|NIjx(I%(-u`!Hu(RonI zu`yc>w@6rI0~&=2pHeNk-&`L)&)I!wr5?~n?ApP8Z$CuK3WJoqHP^qoM z-M^jgJ~lRvnCxEK2+ks=FCJLZF39(E+g%(Yr)c|A95ju{IhbNoaDA9Ey{sx3<4QX> z{cX>hUQwU9_Ruy71|06h+#lIRR@)4O>`SpS2sQ;Gvlf6*bxeAMma% zR;1d)jV{kHn4yZ!z@x1brRs7_dn+Y4jA03{+}#N+$u_(tlaV-;r>(WQH$1|Bflc;!o)`1V_$&Q{Ar}mpH5l> zMrb16z4);A5vqV0c@M}n%SJe=*$vn>X=aVuOk%hLHl;KxWfdH*N*%3>V(`vu>7->a z%t-wi<(0wx85^o~532249qf%8SiyH= zi&a&1>S&*)Y>@oFeXNIy+~l~;4Q*5gJg;nI`uCS4Y%A?-t*V>vnqTB+r`EZNeHSpE zQM|uAQahlLS=lPX3hhLxqU;QBk~_8mNiX7>Y~)|RuyAxSf8L=k`8El_M*T6D>4o_e zm*T8vwqS4ks@0*%Ve9FH8j19Tj`E$qxzNlJ{$jx~!#`tPtc6da_VS2mS-s47(3wRv zU`$UzZ&$snsL&#&m(QbBy(=pe6WpBw=cJEIZS)?Tf;5aOYhJg9;b-r6^Wb08s9U%h@Y%%CZD_cQu8k$R zE^8P-$W|E2J4+RV6s`=%7+u1$QQaWI!N`txOTjSMs_R6r^u$l@kgayfYFuMFvy81} zYhFgyM(0sU@~I6J$|d}&|Hz43pGN(Rp;wos$jsD$4fTBza$~IRA%>?{Xlp=bmt}#t zr}ZLcxVCaMBP0! ztzNUD8ufxzo#ekxHTN=@3~<_#_}Rs_0q$nlc}9K#rK&&B>(MxdGj$Z;S%qy%!^}Of zN>+ol;FXc(ywJn#O%AuGYAMz8A@o{&N@`{<0x$#88Pr?Vr3wNnzCGoRygco@M%z_2 z9A4WoUyA;WeXF-gRi*UO_$!v@oC{4|vA|c40Lt&9_?p3?T`8ia$6ZnQQBC7Q)C&$F z2j-XNO;eW^m{qa|!#4Km=bbE6NZ}=Lxb-XESLc#Q9KEO;CdU28ZQF+I$7UIs0!={O-ibl-kzt$qocI#@WBo$Xu942`C?<+;Sm zs7RbfOUY1s1RZMl^8;hUX=7YTKxGrS%S{?Ev-&MDuD6SKCOsG5FrQh%owq{*8`>$y zbrdpR10qNiE@_6lzPCbcK8gZ6*VechUe_B>haqeY_nD~ZWm`!NdEu~|Lm1urrbJLW*-rFs-fhuJpDw6Et6BliqWi9QS`Jr}2#iB6FMwt&J~{iNNWJpG%*jBOsgV#q!g6ZxqKW&zt;9wf; zUaQcQ_|vh+LB#7_TWb*!!{%V<+2$NeH5v|`MIqR2Y$h47Rj1i+KDFM=_8)-}^1!ub zWN#pjEmS2RmQD1yA74D%56tA_<9||I{|_wP<0t;#mv{g9W!1kLup$%VjZIBNZ$@eK z5x#f z`lDF=z}0W`^^IMW9}m>H2_&58E0V&2bLIyJ41= zjD$_V1C5WR`8EU7kGlNs`zh6zkt6`0rumHqP101Xk8q4LxDhp3Bn|*gEZsE>)^XX2|H3Z3XI9F%$C6A z+RV@xqSVTYxqrmQMjG2V#g8Y`vss{e%n))R9|;X$ay7N;ozqT>;)eq~7S8F~;}hrRj=g*ePcVc>x=I&%SF*hSVJUp|Ie zJsrc7B(Y?W=MO$=#wk%gu3KW(Zh(4r6*d3%kc}T1xK|EGdR#r(iDNV$jDD1;5uq6y zpCxKXD~V3<`yo_&231=@A{gd*`6G^6eubU-meRf8Zc|@7x40RxeMYOAY;S>|%6k$s zk8W{)wJtU&Ed`mT2-atl5W^=B!LzUSni_4&cS_?PD#E7-<$KZ}Meg#Q_f2@pvwLSl$K#jbAJ^)L|3QEh)&TcZAM%M z)qKNf!C&&m^t8CrJ^%JT!vJ~GmRX(O0G^jJ(0YkLBqBmyr(@*CgFQDrl@_JhO%qZv z5L=uQadbGt1b=CyvRL)&WfJ6_QX4@ws^vU+pV7z$F~-bjP( za5)Apcf23zdL*9pdJqKZ>e{mbl4x98GC7IxsmzpXf_5|T&Nj^Iml^T#QU&Gk4{djA zzj3I(p_5luRuaOG=^;3_X6y&*FJ&!bl4Wm)8H8US3Y4W{%+qgOt1I)?|I~vM+Q3|R zyg%|EgQ8Jpu;2q{6o6Rv#2u8Vw~M)i{VP&PDag9uTWVS7tQMdKr*i3KJq?@W42mCy zx{Jp8`D@wqglZ{kUO#dg!|3Nr?w5O;rJG+OZFg*Pb<z1q?24W3_|Xp%h-+Y; zHoPyZCi}UHqW9zgChQroDg1g|xa))#71_ZF&M~)k=OYi+K}$Or>F#!hSqyKsd9?n@ zwfjtTf$uGJ&#h7#O;OIeWdBvsXVH}9X)D~@K2Hv$rs8G+_s=3DeEpu)x zNjuNc#ca`GC0FHb24ztx!P7(Nf6?13TWtm@|KFqez?1kaV!Y{W0TG3F_3ZC?G0EWn1T zCJbkj5pd1e4|h!pWp497s7h5vzyFqHdQJILAts+)I^k1V2$jy#hp%?^Iw}sXZY6!mg`i+qNv@ z$q~L6yR){P_Rflxy5-O*n{)d{Gx0RX+v%)|505_W<87jpRJ4eQgNn}6jfI}} z!O2_#2afgBN8lY9XQM5`I85~VlYX(YG+b+cL2%WjzS9UaI`>XP+|@0afIhV15;*pO zKGj@Zj#Zm^$^vbmods6)XP3E*Zyzj9yvtt&q>dYDJst{ZwP9QHYb>FbKI}oMK)%N~k94q-<0*YuWZ@?7xcSk=2}S zA88P`k1IYAe4wN*vg;@$KxV=(43DF-eq=`rT z^>}be`rmhTbtNQJDvSPxR#hCcq4hC zZ;_hE{jRJnW`Qm|=rT)pU(cRGO!W5VMb4)bF4e{DBkGFPM24Bm%RYdy*!od2>3MpF zXRw{36PslnJ(qUSONc($K7UeVVyI<@d|JSyr-Nc2*#e%?I|7q0XN;ZxdxROG5i(p- zW+`SV@yNpB!eWB0qSW?}lwl>OpWc0$duHZ`FMJ0&C-U+2zk4Tg#&+i48?L6fcg$5h zRJ%1Rk`A(T&1t+A^MgSn2|>TJXNq_S`esb^7wXptZ1z;wRw5QA=iEYi9s6nXf^-x_F2zjf{W7hIZoW=9wS zgTX|G|EEDBvX=Q#uXttyoY&Sy9UUDVj0pFj;f=@4kqAb!DZKFuk%v#C$QUM*Nug3% zb*+c~hKHMs^GO{A0mm}QV_Y&IO}rpE|4!4{$!TC4to<2Uyh~H_-q?o{9uz~*mv?ouV_;$fzu*yTE@aT}u;aH}tsi}F!#2A=u zyg3ajsjJg5+h{*2zW|usk?AgV!((GkRt37D{`mNl;;*XWwF6vyktwUb{)DO+{Hk{C zPI+hXz4=bk1>DXr(%HVzf<8GFlpAF-c(X8eFHf)VQ%kJ<`>$mTo_&+(c>jKPrE61l zLqlYjoTiSB4$x#7l5P>RwLesS{L?t|e(2u@3J-b;T}~^jtE&Sbb+4bquS?7bkkq%G zpB<@xgqMkbJT4mN;OhtdSeV0C>ko&3vt4Y1SDh?rK(!R2;|>W(Lcz#GMHw0A$ZclH z{R0k|ObT^qSxbO_@+n@c_hya(2U{s3B>Lcyfqa~cH4-^a@+dFImyLw8R-l0kzR;$S z)m>1WV;|rb)^}0#KB}@EAQdOraPfiU#>x-cV`1P%Ax)& zndt~6y1@>`s!sF;84zi03=g#;*E>E6df|;S7eWm~zlcyfBPO;$L4&1aWGu?;%$=Q` z51^kNtHVBuUN5wNqdr~&pqBn00={|grzNd7`B^KpMo;QZiil`2+S+cOIB_DZ@i+if z1Y`4&06jkb1yk+#RsYR1{-25wp{5QG{#l1iE{p-vTWf0RrU_U{;;jXw3@I)i#@Sqa zONbfj5F~GI!$OK;S#3U6XLsO1bADm3Rga%Dqe4XDWJI{oqK#lBx5|?D4@=wtr@9OT z#IQP(#LkdXuj7Uw^(tPv!%cPdk_v_Cd+g*h`8{oOo_iPWLysTRmH}X+3myqJmtuyN zQH6U0LK_E@);Kjj-$F{=ffuowK>&-MBTCgLsxHIn3oZ&fA)mXlEzAV{Hlu``&$X%k zz8u@K8Wa<0IIj@TCfM7q%5-<{MrYL(zP^#=BaEO`YQTd1E*}m}ZQAc^-q1{AlWi6LG zek)JANy=Sb>#0!c>A=#LU8IH#^{=Cdg-DxyA6R0PtwH0iFR(?1u~fwBp_VjnX$`f$c6iRBu@Tj2-0&D?4wAp;{*75?Ive+A~q%00E zxn7Xr!E%wQaf9}7`ui(NLBMChZkG*aq`FYvRQ2cIU+EitcYpi5Oc@>z^Hx!reCxTf zQkd5vD-Xf2dW&SyV|l5!)K^q3AWck+yOV8{fNBZTQa}_yHbzXVb|+P0VTGd&`Ob28tR1Q&!>$vTPDip+bil)Lmo7S1mZ%yF zj-1O2N%x=>3dP20r?o)Gv^?ARZ>(T*-#$V6gr$VI6>FL0oliHPO*vqB#*GowgD$F; zr<_-fXF|z;oKthKSry7*UX3{oUq8j3(#dJ*Wz89|eD*30r>4+0W!fs|ZI(I7w?D@r z1sNr4CU%W>qTdRJ>snBOF)Pl3dEN`pSG78(Q|MljA8S#N?;KE4+{iP(%amArtu}s>_}`JRTU*$(cs>z z;ckC8?t~eoFv?F|_kZAtgJWLjmt-ZZ7ei2$naJ9|UR>E4l8+XV{Z+D@70VSWF79lBR8ADgmCu7MF4&nYDlxv7q7*444oru}sRD%J-;W8v zBmkBKcZXh9aC*u9hogKMNZLF<27RGf^WU59-*&zj87mw|%Qi;d2rn9Z^kVCjSuti0 z7VN59-GAF-|5-=vd0TT<3R{-b;Ek$@sjSAcE6#c~>t-tW!ofxm^tnV+o46&iton4| z%W4BwdzIyx3%wmITgap6D}8D2k)|s za6ix3d27r>Zr@jWQAnHWIjX@K?2F5FA9O!UPOXGT1O+xe$1|JjvryQfkTWkzd5bAp zf#syV;HOQJh`HU_5WfqSP`HgVq=3mht>Q9b4mA31h*d`)umTf+KfrB zKy>)AK3MZB4!J6T@IH7WBOGUii}@L>5>hh2h>hDiZpg>DbYR+>jR9eKn|3X62l!^v zed>46Yj{?_Wh(=PMmJDW>F}81v|DUJrfR&(G=GYfh>lvnp%lNY|i!Zz% z{En6)OWRISYI-_F^Yd1+MIa!tJ_a%=x5jiEZJFU${loEq&J}9FSMCJcj^8eRpOso^ zeqvgd-o7vA;pS&ub`$`6LH7dQRD&9Dja4DE8btXgNBV}Uodb<%UW-#xz@3VW4btQv z6S*QHfQ!=qYJu&;`x}Oah6h)gHns>l8zh2jW7t7tqxjZQ3|FrSqb@jwITOfACcmtiJ#W3%KLcQw8wC$=RnO5o-TW zjIHB-5y|~+_}I^8zol&dTQ5ak9v&VJYy3PDMIvUt0!RJ~oZJ}mC9s-+m|Cm4&+CSW z_yo5g;4$DQG3Io1Ko{!A@pa-d01q!efB)4Gi_f)PYx_NHz)t7HN2uZCc2* zR!xF{Z)$15D0=()T3B0Kr&ZiyQnKDq|*{>W+)O0RKz{$_5^=b4(EtY~JqI}`8QrKGIP=NAg~%{Cpf;%5!(*giZzE59B zkaX*&P%P8?+6lsgLLr~DQb!04J(L+4bDRGt0#z2^I%$KymS+6pxlR&y>#!I&RSzs| zaRQLg`e;_(uxB!Q_B4HJ>$3tjs-o`fye&Tu27n2@OMZkgH5Ilxy6oe-yyXh$Ju-r^ z5e-+pqdw^H23;uNT3QSLYE@`h;Mx?%8o*lAiNOQ>{k@{1bj>P%_Xa3i1pqM>*=%-0 zfMhF)L{c=Xy5Ag-NIos8;nEbl?=&vz{;_byL?XY@^_^sG`vAjGWZZk?nUA-r~#Ut+YO#f>V3W&eY7FzAB2J&dc?W-a)h~2ff z(+du*W4$^p>y{WK7Y#h{0@6s(gN@$v-k3{j; zvjA#^9w_sEVr;B2;NV)@B)|ab%Y9^s>Bd*jMdW-1eqx#iz?~i7zg&x}8OT}N?9vY$ z4h6_-kk)#%(n^y*?3c#^K8#IatIsDu#{)#f8c<_$m&5)6l0+h;ff0Oj;>yp*OsI&6 zwQjrRgOiY-sehU{`ez$?XH?v?5w29YMfr+i+g-W%b=@o^+pD_h9wX%Y#O(KTa11_ zBwJ9)4FOyh|9-UDzPpTwcsH261UA&nIr7mSYI%~JOot09ZToZ(Km4FsY<$Qrw`b^F z%`Yax5eyMtk_7}}nBIQm^XgZ$qj|kGHz{de>fp#3GW`pSU=qa`AJ3aAV)iKvgEUy5 z&=PRUXZq&TuF~M`Fh)Cw1~1Xg>A{}<6&g*ms#Zl6=FzRM4^03RVn^*h=x}k#rH(#; zz9Pp!8tVm)1cw#-{Q;vJxz7ZwL4xae-g5WBot^r~F#SXFp_EZmWL_0d5)lTdT8BfM z+dye=Qw5osUUd%0MqO; z9nQ#LNO2B0gCua*#&ecIDAQ{NNT-ZFW^(I>5AFOm>wQ{(=C}?qEX+_@$uv0D zUzeAhMGO>TDEarh(WG`USLZ;m1x~_tWi-3p$2Y*LGyvuutVp2wd-94#z^(wm8?#x& zrNX@pyw#`azTfu=fM7t9eeY2`VTo0{ojJ~1n>ZdnBGy1mb;RZ8Y`u-JRKE+fg>`w) zM=IKAxFXHL>kd(8DEP$MtMfPqkWovd;Zl|i`xkE0AHQm@AT{euCOFyK4+oODy-YR#8ti}r zu&>cD<`DlBlp0>Krz77;m{fvqau-xXXo2*yXaG0Ao5E7wyw z6M5N<8Cxt?g};%T;Y(42aZ#KkF(lv;J5~i5_<`g*J*7W=pT=ZSOUR)8omwx}Ai7Us zBx8`Su`pp0e&R$_z~o?Wu)TD4Vfo6RD_P{S8vlL41!xkt{bJFvoG0?9XL8`#BGv6p zuMZEQPfb7z3;hoK;i~nJ9SZChJjO}Eu@HHQjL?COd|y5t)xKx4%{GHpg*3z=F0sD~y5WV^Qsa&%xJB`eq0-a?yj7t(y4l635^l-^fU zBz4vnr~txSM9gEp6*)_nfiby$ec5b`p>y}n_-ulj%eSmGnT zJI-6^sOPVY;it!azrQkB^QYtfSB(_6y-}_!kYd4icYtOs>T&)DJU^WIsA*MvBZ!KJSi~iq2M#Ef3!sPujOcXf{ z2!3vw{A+^+0r)nh=(6MIZLRwBHYTg`=R$GTvmE-T6XaGoxddctCXhgb*6~> zc_NTbH4%k`&nE5KAh=gH>^%&hm2%$JFYu0&YFXB4N2uc+Ab36Wtpj}h`o(Up&vwmF z@NBe!oQ~@VdV5&Wn~ve8da@4lotw5aRTO(*(&0Jxrp6qp@83P#JGJ8ISUI^qWlvXU z&25YNCP9elA(>5qqZj!mt7V*3D|?#f`cpShJ|r7@zPHTn%uluUn)L*Ql_XsC?opYV z zU~5pk)+fuBYv{4Moae{s);2fbKNf3~L;1-~e0FXK#a>u2up`uKdf zrna+1)gEk*TO;>yzXiyP0PO7jvg#>bzu1`j^q~vUbSLN96j&>LogN;I&ZizM^j8Eb`UCNhdRh^Jb@#YV zrL17TV8cWx+F~3NkH$70n&WyftUL9!6Jf5Mvhq3^cFAAMVlP$Mw}uD z@06ZU{I(&E*BYmit#Jvt!=+`n)G#JR)_#uutv&yITJ?*^&ihQd1}nolUD9n7MTjMN z;l{tf1pQ~$Je?b4ETS)Ac(A4;7$Veeqy*|`EMbr^-1w8ODeKr^mBQHE=G{3iAR6gS zo_V2L_?tkmJHK^!daw8o&Ok)uPW4BU9CLLw9)0v62-kGHMv096;a@33Fv*NFB5i=2 zC%-h;u@~CavfI%&ZFF!|M;7Es$4nz{7aUujZDc?Ne9(2cUFR%Vc4!6Mnm`ll%_j3U zN9*!J_QlZ8>(&nKGD74+4v=h1=zm0Q73ct=WM+VnG~WQ|V3CXHrWk{g&f}-f7(S~P zS!+80JpX8fxWko$9pTY5kh{qT4utqlTx-ZMr2_WoG2 znel!NH0jLxmeEmHS#ol76QE$eKm$Mq!1>Ml+$KSwaJAJ-c+`H-CESfK2>7fP#KM8V z&$_rRLL zG^|38`nU&)!Zp)h$7kJ_`hN=$g8{e|d-rk)fWiRh$+#RNAa?8y91cI)4m27oI(uCI zpBn&N7cmnc*?nA%$I2-Hwi8dj`I$JjmH`Ce3pvBX_D??V#h5D}<*lnc@($)VH=^KS zfDVgsxdk{({Qc1P|9?l>gz-W|MP4dqYaCur>BQ<`7!MD&FNS_LsCNMG#m90ZV~u*k zO=}r%E$NZeLm&Z=09o`>pXeXA1d6R%d)ah+`(rxb$M{%o2idwqI+)_ctTuZ5^Mo}{ zIc|?OgQ!I=@b$#wV=eNd`^)j6_1mmRH#7dVm)`ImB3Au?BpRB7)7d_Ofl=i#Qr}+a z10qld!y6&o{$nZZI&XfNI>bPKD|H)6(jgBWiP7C2MkOBCp{>||$4W=!1#xcx5N(#K zonCoPKk09txM#isQ}5%^;YXw5)%CkkrOGD<1R}^$7iszqyf+dab#+zzHErJi9}rQm zz~OckQK6uqWB=8o<=v`-At$I?VH9{WA*G~v$#DPkjJ)9RBRZ&c84ivN(I}TYsj01( z)my6ug$f^>fJ*nN66EMr0`t<7@^)GXu*K;m8w+W|2zfM=9(pbwkS4bIe z*{c8`O99g)yKGkFdO6Fr9(lfw`G6d86M%k0n`gwl{5C@D3DnV+m&{q-;*c##D=T&B z1ro^^cczZck$xBazaZ3gE1l3sh6+RNmae}ny*cO?+j3wy18+ekE%))ItIlEOF zwKM!F=xuz7A3hMv+~6p0U*Mmkf4lyceA$&bFp| z^vMaPK16gjCNW)HDNV|5eQW0GM20cj+~I`sl-2C0_{Q*JQ8Ty-ggtMg=IZvt))=^`zLTn#uziFd?2H6bko*V8*de__ zePOM;N-aDVR2-O!Ya(T#7(_^Pg!W3x{`g-vxS^o`OSt>o49WVRp>Z>AeIo^1r&&Ev zaCq{C=P%{jTP%TP!3~T9BdzrUp_KeT*n1D4D7r3e&gkSri5IZ4hr zM^O=xoEgF(k{qJsJV?$AK{5;y1{`3>aR{@GzWTl2*8W?ywOhOUZ*A99O;1nv?R#&Z zzW1Kzob#MrSEEdLd{5RydHL3W3V|0>h=xeKJ%^g5x4A@Q6V_gvU?0-HDFtx?N+h%=A}s6q4wFH0H(Y z=gGA+Hg1rTHc%(WAP<*FZ8=`cY}1 zScU1mSByfk-`7+a8Ha-gPeH8B&%2d1oh&Q;5gi;`iVJ5`jrHyvY>+$ydo`;v?-L(K zl)`G&BNDf@cK^U(7uq0U;q=1c@2C15X?aSq*Bd0fnq zsaC8$2&M4Uv@hPbaFyn%Q_XqzvH5LhSE$*uy{ue$L4gq_17uhh3N1+JI$Ks$bw zAjj3C{J>$v|G;;te$uq8B8ATuG7-N{6ifkepzkm}&3GI9*KpZrqw4w4fy%4?SZn?M zh?W9)9^=Uv>IlAR#Oy&2$=6XKKZu;2JY11m+UwvE!juC~KAv>{Vcj7k$;OPo|Rqd^v8yD5-I+)%RxG<1A zs#{QH0rSXi!R=XDIcVwnkH!kb2iI>F@}iDXdF_jHej82eY??~kALz$d<~KCZ=?cf^ zhR<-8te#EbPLyi1=cdT53EGqBHh)bR^DFU_Da;tddlr#b`W2jrn6Aoao>Iw1@(yl& z_E19unZq*0Iai0E zygsO7YeoTl%TEm{=rvQg_>MLNC7kf~T>B`S-3VU>Dw+uj0pocxgp7dq-48AHO&Hpo zs0O=N`h!p`K-4fKMTgtu8+ceFBGk8b-|gvVYwQIO+K`O4%UBSBCd#y-{4*FQZI@?WE`=A z(m;K!v*xN}0vuSlxN}n&w6UfAr&aW}@v1r_qph%n+oRI6oiYGYF-!~~^V>tD3;8?F zgrSg`-b@`+L?DoOYV1KIpk1l2zbHIpB?$gKUVVRG-#PjPF|K%_DpJ`wc9+Rx6;x3R(O9y@@RerEv3A z6L`8R<9zDC@o>Vn1|BL0_c4P?$?1c4RnP zw>iH)H$iWLH^@|swAK1QU`C`VmfPoma7L^UMDx2Y zV=@LmF};H!&yP3(^O^Y;d=3bL^Q@=1LY)vTG2Oen>$IC#TA8D<;|DOK*h!vF<@)bl zx=c3g0;=tXyXZF}M>pORq#7rnwww%l0mLX`0$Z-72<@!3b9S`4|_9GHWqpAj2 z*#0OAKsE^al-pv?9l;QPuCITCvaVba^Oggm4*qQaw`&Xp{o$O@6m26P1{(kEmVeox z2|_N_y8e6sF2I~fVyy6~MCkvT-M(o)0W>76OWqMcNxqi)r}|=-fgylt`#%&cdK+-$ zEpPwFk23(H^9~Thw&Bk9&1`XPwd3&h$`b#^z#ai+yT@Y{1wWsutfW6c^G?m4Z5)>v z!j?17D>x;7{^bMv0R_~yZS`5!7@x7yzynOK5yk@`f&tleO;2+KVUCxUF;-g_W=qg5 zQJ5q{A8%Q!;u!wjn0(-?c`oA9= zeLPF0xXr?WYaqK2>FB#SO-`eBFAF7Cuq3^g0uxyNo(SxWy=zfX90}O_nH^mogt>Tj z9rT}q4sHgX=?(h<9%j&N1Ob2zn>M~2^ML+^L(*~qrM?tcD_lbA>TAFbg)bW4HZ%G zJ9pHk`_p|nUUb^O9!sTLFNq@4Xg}OW+cU*1G}D3|H&WhL*ayv*uXZ@{K-U!geHE#q zrr8KXJdVowNy*aK6wjtB_ulA@OaP_N6=~3xHTxCH<)NO@baB6=QKnJKFsvTc^iPGD zM}1YSuE{UUuelt%Wu8fLw2y#3l+UzZ|%-k;_( z^HIJs-=(~6$TA(T7>8o<#bN^aFOU@^zZXiZ%N*{1YH6ALrE#Dl*{ZWv{p0A^{iUlP zETGwCML5HxYH+nI#3~a2hZQ}}lXme;fxi$9OL}k*m9ej8soTFF zqYx?f$*iuyT1@HnJ!QMm2>p6EkK2-s$P5uMOe*C0l7ZNqxidZm(E9D^8mcf^Bhwol zEWU4;h(4xjTOK!bjq14=JK~A8W*QUi-d{u?l{xQpo=!?DKT`B72)*ckbpHX_7MdMq z#Qb~!e+QKGKu_;pj+HhHk3saq1Ofy$lKuOlPL~8+4j+nfIas>E{bAJaA5aL#Nj&4Z z)>nrcaj>t+`otd<8xI?C%aa-%UM1ZOSMRYRrIvW2hNO%~k`BnL@v3l&Yu-f%Hb-my z2$i(`(Tq8GdBNH&#ZSmY);yyZe|NF?Iq5*`V`~9o@6{-? z-O=lK^fKy$+{vZ)P*IxAD}#tBO-fO2Wy2YlTc>94*lt=f-tzV=ljWan%y_aft0PeM zLg%wm%KPoe$NF_fA+yc|Fx8hf;(>8)JJ^Y)N&U_QAdN(mT?euEfLM2dEf}3Y?3<)^ zn#4}+@TRZnzUjFu@<_@t0lu0aMu{@3-UTvGNO4%i7!nnC3NrMwGBTMIVOWg@@xU; z9o;)Y04kko6jkbCxQEXh<>?$B0V&WNEPGrTgP9fgoKakB`64U<}N*#P>+={I7; z5AW%^y`3e^PG+qHi#-eKvfbc$K#`L!+7H^XsgKW){fJ9k;K9c)H!)k=y?>0C+qslZ zv0?6^7NNr~i`>3#Sgjr>3!xB>=^O}JI^4;ek^H~YJ)A<-9YbQ z8B6Zk{#7M95#BlN3ucMK`W>4>fp{PEjE7Tg#83Zo%Ok1O&q=}d)1FLJw5wt*|Rh8cNDE(H9l7k?ERG$`ri|PyEej< z>{{eI0nb|er{g!dSW49`LqJ3{&236C9z`!4XKD{k-$|-tVX71$t%mW*%E}Zo)=mS4 zT~bt8B43jF>|OPHJMO*MOGlgI<~z<%WEtEnC@MLtJ$y9A!}b!JfA(-2I|OdT5 z^Uv#nkG>ldpl)8f`bo(`M#}{=iXn1XxCf9DFK-Ts)O)+6l->N`l~)^kig#1`MlH2Q zBShL!W`5sVOjU-ztA7@at6fggleA{-=+IdAnDDi&$N4UJST^06U#)}~&Q-!Z+79RD`YNWEVd;jj}f(*o_zD+DDRuYI2y{GzR`*nC(O-4cc#X+S<(bcb6}$Q%T%T zPh>Y-gq#x%Rw&M%(zcLDxR^ceB)o%#(%p7n)R=~35W2}} zSBX~ToX)9yf6j>q9TXUX(FlwWQ1jRhSzhB6b!L!Xq1bEGJK|H5Cy+Y1Z;2UT2|QI( zesR=wd@y(;`Z`wN=IxIp(DwGe@WwL9?y*0_%~pF6vKw{?ucsF^%ZqLM&oSu)Z;a!bPF z9sDrbz8(icZ)4SnUegEMZ-<7yCIh*XDrOK0zTJjRIDm_{Q<)Wk*hx;%#bad4&O}fX z+OPgC*3oV^U4uacJ<@RDbiTQ>7w27@-*H&xHYPvUYi$=%xtj1kEQ-*?=f4k#w*F0$2RaI zsJQGB&FWAo|2+delS70JhyT(w&Y<;~vyP+I%JWhyvdyNuB8?oxOUdAZuiFEq+glhE zGZ9GlL4n#{2dBgU+q{2bzQ#mb#KtOJ<^|t?e=-Q-!U)~<>t}BqB!ctSTzf6# zeTHv98%sNr@;ZS&Z<1Gz_K@F4DNWcWX5^QN6jRxJpa&z`DJk{e&KBv~n~x>;VrTJ6 z#RAz<$j%hfb!cIN&AT%Z7pItS-}`Wj_^1#y66XZ{?C+4ZJN9qYV(i1+Oj!E%x0X)jKLvo7> zq#DoCR`k#S@T#76B+0_+I%+mvIi2U!G&c5f)6XKzF$jE@c>-dUJkZp3bi}}ql+Ic? z{Zj%?&m<)kxBA&i8*fQ5??azO7itCd69jJG0z3?eM4uW**uK7T<=bIb4v0G1%lAG~Aj;kFRYZ0}r&1c7A3z7{pw@ zH=LMVRv^Xg#PL+-Twkcu?W#JIsan48?+fP;0Dwzg1kkd7cyhD%gnaM5w%b4{st@URMKe5vb>#b49` z>9AAkd--d+{ZafmQNkjOFj@}#W#s`~dEtdcpNY&3&Y5=BdIT4GU>F z@C$XxdG!-I+?alB5U#Bk?hq#{7+-*OaCs{>$iaE`dMdJ*Ga#XgqhSoaMFm(@4f*R z2RT&Fi?skw?LhPY%|9!wVAR)B|LGNK+f&bmD~fT|OJmxcn#C7$m;F}|J7FB!j4mwv zK89MD=EuNO01S*l@LK9biQ!V8@dXbN5fP=hZvvfs6d_KCXM@;3mGqsttR(#9#ZplE zB9QJ8Gl$~&wOHXV2ku#7P}iEsrcFvgVdmljFbrI6`vZ=_tNyv}L{d^(4OTYCAp^i$ zcG~^+_U;`35=Lz)E-vmh8;F|brw-VE4hA6g5hNdgKgfxV^55>C=JvuhFF6P%5bFe@b}pWkx*>Y?Yi?i6uiwnIMIkN1 zn{DyXxm~`dum|^$;R!V^(@CqJg%q`w-|Tl#kq!76L@h)C7}EF|eVn`dArF^C-}&)R zM@P_FC+sBgj~hZ+fe;Qj&r<{cb|^*@KsOL=l`zMj#1p9S;O&1$)8A=en*RI!sX^ZKpe?JaPiHDbw){R$a21}U|E zA(c9r4tRtg`3S={`qMNU-GkY$rUZq7sBju>iM)JBYUl_h2dCUtg}gS|0em#hwkVED z^vUW%V4fgMVxl(BH!h&dMvwBB+q}G1GV8y zA$^qE1?;1TxP<~Ml1>}CUj>6yqPDXf7n3`?4VYurKEfwNZQZ>5E^F&Ze>Zx5dI-Fz zp#7dmTm~=0I>)6vJTIdF0*%~UW)@#sTGlwPX+m8NdpQ{kAO8$JIaDuRx%j5Q2R-A$ zZuCTPpu1Mbi%oQl`ne|KKa0B*=6Y@Yc>3|hzu?bWxJd0e+BI>i#Zyn@y;D_-(cn8f^R@rfByuc&$3hmB%g=9skrqA*X5rnf2pBzt}zL=Au|ZFg^> z1>W;)EmHFr!v+2Jpuh-7A4lb0ENtoGo9b`)CTbad{}EgGDBfX_Q4Pb?lL@K!{`^uu zs#(|p4(eF zj(5x-lulH2drw&T97>1TdVYWzIFV$6Z!&Yir=&jzdA3ztjOxRfpO`B8T|Lv?Sphs) z5wmfC-aG+oF&i}QfE?;B*nNLCpV)6z1%>wt^IWIs;^{Iuovz++!=u;#NeZ9bxEOTP z8MGk%sW=R-m8b?^WvmdCU{7lfugS>V_+&*Z;~0Lv`gWL@DY`~FFdb5-ul8A^wp$^H zAcG18ywVDl`9H}Ty_--c;3(f+aVcr6T5XoTJ}n>8y=-!66o8*k+(MFZ=YIr!JG@MZZpdN z{BWgj&p_|>TX}-JGqyFmeq-%CqxrsMj~NvS@@(*5vfRftuOP&~O59_~N%X^E;G zg6t4d`H_5^@LMbho`?*+J6JW2q#7C zy)PWky9b_QhiYfGG#xrA2KT_J2iYA+mA6W85-j5Cj%2#E5Z6^kB#BWY-7+g3(d^SFVk2%7p{tHH=~0YM#(5 zVPkc;T1m_=$Q7w1mCX2LZ2}{*hF6i%eB4v_=PL93f-Xw!R0&J{!Zv0fwbxW={et=+ zT7Q=vah`HMNo8g1EizWZb7{0U2*dAktQ?^n`yHBEDKdb`cjN4Ue~O z)+IZ+_D=M3ks+s>i*3Y-Z8~)H`fPV@=iCc)bFZJo*QOpS97k?$KA`(-_+CXte)q~p z!f?Wmve-ATNb|`)N-I%EPt#yT%Mr#oPNvQSdkRCcOriO5bul7dZl{1;iK$uU$(m_* z**2C#-bQua&g0P?*=ZjjT+&+o%p*8>EDcx~gql{wqlj|j+pKUX`rCFWJE9|%MNbziS$Fwf9#zVBEr2277j>tcOB3v$e^U2TfCRJ z&hGY#uMP2@&fnu$i(*GdOzx|DO4fo)6g|+A^@iI1{-4Ar?}=Bj8cMM8&G2sR`X5f+ z?p)Qtqpv0uEq06Xy&`JKS2|Lopg&{C~jYBpCI zr+Qx4f!)$CMbGn1asMAXpeUWByk~BdHxHD9`8#p+bM1lnf$OpKknt3Y~$T_@slYe{xswGI2rzqKg+l3vJHCQ($zV#y4+Q61i9e;nj<`DdTktOa9 zE?y8cw53NFheCq(XuA16a6ztAMD_9evP!rG`;i8K`D!Cf$|DcfpUQdXJ-(G(VIH0a zWYQ@diLutNNp;{FS2Ft~E74rpAzh%}bj}MkN^xeEs?wV?T0f$&n%@y+Q4ym2q{rca z4q&{Tdg_DzHTCfJvL)!gT50bB)j3#EvE6@-O+{zSlnOGjcYOzjydqy@i8`Xn7q36) z?6$ipLopGqAE|hA)1~gxsy=+%(lwkoNz3tO<~7*tQq;e#4JW=I3LYw@umT*^U-P(K z+p^-*ql?vZ6)b-cSIiVaAnTOIPW@a0+#L`zB0MVp_b;4MH_hLf+$@mdsuf_Z)^nnz zggRI>sSC-PJXW!4ThDPHArZ@P18*~_jP&7B0Ycxe3jMbpc@ z!?yu!jVFv7xN{d`*z#ZUdwZ4097|m4644*~8xwMs5{F?yaR*LMgOe?jZMMEx>AO8I zk*4i;C_TzpyLD}0=>1FSnq%-d6IuEhD@j*ZN{Ud+!Z6{0!(7fNi)q&5jrljIC7l(URUH z9Wi@TE>zANnlHP({+51TPRVX>Y;E&1PuEbH73g+QRD8Z#+y?+o$r76Cu-b}wrC;jE zZ!+$mzIVN6=B-8WwyobH+Hw)=m8oTtwD!b+wdGf6n9li{$IAGFW<=^6*?Spy^dd+$ zz+O*nxi3qA*fY*==9V(NlGMxQ%$rxE=Ty}wO*THJud7S5f%9&Sc1U6Vgl{L3tWS#S zj-XlziW08uQl4yPrBo>)_^obqKz9A@H_G!KE8W?{u{G}v?%Lh#5eL{?jaZ9ovg_5t zA6oH1_OFk3M%_yd-^B8`(VeT9TQYmP-5&EyoV>tp^*AO9}LDNq@ijsn*@^H9(Upok$qF z?a<(OyEsr4pIW5Pc@;&6{f=VOc?5-1!Ml9hjoIZK*U9A_7|de5ZsyFRXhts^!!z21 zO0S>Daab3HDAnm12H@)#ytrJ=zp$(3`A4m$M@4kr81P_tK+?-6n=LzWF8ihVvD^I| zi6qlcrIF4o^3`AK`3bSFyktG9kar3M+p|cOi$3!kwY`GF%6?yG$HF~4uEedZ2Ta4m@8FuUL-Jp|gRc9|k zEg7hpnO$GD>M22$se(f44$3;MAF0-+GHK(?zcM)R`Y?cMr%dV@1vSmnJ)9i)e4GfL(ai|H(^4$yEE|K%<$3C<@I}%;&HUp(WNJf zBOdgsCJ$vST@K*-;BapukFlE^1EoP9`lftv^b2eYw~%^&tw#-`0h?8rL9MR1rX`*6 z=DDlV51EsD*JlDr+?L0wN$nZQ2)^xssNq$ss z6)?vRHLW(MQ@k>9znU67;uFB%Zz|AdVd^eE@r3CiJP=~josTiU~9W{ zYd#f2kFb+6<%Cw3#o@8OciGQd$H*AvI5g((21{Mv$wNPLYI3*}DSQ2;D{lqyB1)De zE{)8>+fpWuYedD&T}v6o)^{H|Kg%|ZP^S7MWr6uZO7ItB2@{fado5VH{E$jT zow<)7B&7XR*+Gk>p%o64Yt{@8@QFStLHN3)!}JXYYhH{#0=3{Fbl!AYUtjo!6N0KL;9>GG&; z(wzvxe4}-MZ|;?17eU~L@ow1$2^k6%3MVe(BCd#!P`xjdLcTDhl@#2V702MVz_U<& zF{4d(Q#y>er=F_O-`{(gp9`Wq`LyqA@ zTLy9*4PA~n*njWDg+DcRZ%h)BB$+s5o&b47$F}HSBW~^{XF)1-uHYLNzt8uGH(LTihU>|c_Q|mpHSJ;%{3?Z0^C}>B#p|!sz@gvbY7e!_86E; zr`Y<;l3?=VOxV!n_BJ=d@foBZ^++`yV5z6#Hj$l#=Mg#jtZ!Za5Lu$nL2 zN?pv%Zpe0_;19WtmE0YH&!wf8MgArGAvu$W?+;&G6zz_A`ZoxfC9a|S)6&cbiY{nM zyi78y<96ku8|2oip1eYnDnVPV^}aKqFd}jq3sc{Oi{X(0ze?&Ri6;$Qp=Fy-z-)JT zhxf?j3a_?C7E_8yNE_#cm+^P;d)(PJc=aJHi`vqfR#>R#M}~A#^!cOAQ{#&}VUni~ zJTgt`EKiP2BF6WHMoxlY@jLJ6UR1=VgX&cvIKkUbOpCjOlQ%z6f0;Ft zOuSZijZ$pHvrByiU53Z&QV@E3O^9^;Q$uMu#A;&DBt{m^9)QOU4@wD39P{zXTjvY# z5XUPPFNcJ?t+qu(M7ia8MclhePEO>W84y*{UhIW(+%n}F@2lH;-r1Q)O4I$dQp1o+ zU+k%U8&AU61~cri=)&(4hl-3QuS0-M6y--EU0!6%vKt-^jj8trX(naCJ#4`^vFWa< zeZYb<*_gNgpgI0E;)KkV&#kelb3XhRVDxy#4Fw>^4TkTiDd#bPpsk>0m4JY`0f!Lj z7}t}#fh$%8XW!Kf>*~(^=Gk^|o3~#bqWsJSl@j*}eGrKgR{+P58l=nETJ%W^0sKcc zO@Jv=FA${vdcvqdj>9YQI@Td!^yz$J9Q|#hfCDVRlpk^(3*L-$(JqBPEjvDHUsBst zw-}Mh;pzHjmB}#U2`r}o{PHi0QXRBIG>IZFn@QQ$bythfyYOSYdw^%cHZF#s z4F!ehYnn7x#P2xM7}FrXS+BG$P4gd**JuT)9Thg$N6XX9Apo3t3n%C#S^H$Bxv3L? z?~NqR768aOYQN+tG{`%I215$u=Ll#F+LNr0+x}&F`qeo{aVBq;y7XDB1JxW@8R6S#%P>@AfhA%mBdB#31 z*B?y%(gRN|Cw@oLrS91;bg}{VKc6A!vQ3vCh}`Hv}XWM-$K*$)f`V;X^n5J%rc_m6SND{$58 zczOcb>2$H;G%__+HF#v7|q2UCa(rOMFNo0 zO(1}RZDZHxiSxri7VcS zMDdL&H@nl*d75Pz8Z_ioyB4@fj>DcBG4TD*#|CTeag2{loxuVy3N&s7M8jtfkC$qU z^Yxlq34)HZPmM}1FGBs7leXv&BOw3in-=-0X31LQ!QtjyU$0W`ipS;DHak2~r&HQet++S_Cy@FgL!9bUdJj1AL@cLtwB6w9_$ z9EG0xtzy^Bar|}!o*RSy%jOJuKrVT7Z7%Fby+f9@dEY8$RF063N6P$%0PBJAD_IKH zV->#0y>xuWAo^{gjC2*2`^C6I{5xT8*2C68t=~@U)ouT=@cA;oGrJwvQ$wL^U~cId zw#FpjcxfI{?Gi0=@MAU4UuC)5;GkCNma;QQ^;qsweCQqG{}W5#PQxBg1Btz7QW4$u%63D#m^Xd(%Snqo;>0A~6sjP=#$;!q*@gz{piMr@xhBP@c8KiSGA zSLstpaHluLoLzKXK2At@HlA943|oRuR+O_0(azwi5E*QAUbHnxvPR8LD6zQK-N$O+37GxBj zo{+cN&@!nM5*(cTj#uX&o2!v1B}3O!B7xR;c0<>^aa~uAMClu0rVZJ(YhrG`Q47m! zO@1pgLXsKK`!fco{smWC?{I^W8+n5F8>-4z>{Hv-Ka8%%^+!i=^JeDDQel}nxF6-( zM3)%b?Ej92k=Q!>)@;+)w%;#&EN1W2V}k0TVH_@Is%yGiGE6!dQGx5?q`iOj)sVCj zLEdl@JNd9qinL!G=IgtsUxHNTT3=uY{k)Q1hku}MZIUrJU|WpgdBS=?K-BaGr)1H{ zd5KZ^X7$fXQZOfPb?d22xyt$1GdjBGl17}bV^(~?TYLV{Hcsr1{_8$KWYRA>hhGs& zKfh`X!WvV;i0mK|7^TB;zxYm2KNU61-%Wh(;F%1rovw}hDl)bw;?92VSF~IdwM1+{ zXz$5Izq79!cRv2J<)60V@tW~I^^=3swsgwMipci^-1;_EI1`obUdFd6IcNsj`|?LH zXBR44ocTl0n9f}gpHi-S^7>Q|dygOi0&|i*QSP^0GdlLNyF~w;#Eh~$k4skS98Ark zvIc}WK~f5rbFR)a(Xt{+JuhlH z{j2+=toTWIMVsSB1fvjRVQUBzlibv4DN(xl)IRh|*<6*%;CBgML$ZFjTe#1{_o*Ut zp(fovrR)q-5Bdh%#OM|BdY7q+&?sOXcTgZ!b zZTZ8)WDeNeXl579ma?|CYo9p%1TJJNvlq-Zqos9APgl=hSkhiRb4wLfch9wG8JXS# z3Q!gvRVdJoi$15*1WoacnfL%107As<~rZcJGW{#^`0f z1!CeZw;^4C9=rw~Pj#?Xwb0q(Taa6KwoSyrd5{?A$%g79v6$!{1xbp4#0O#{A~#i= zM*K#HmPcXDNj>Nl2R>YuI|di}Wg>CD^H7x_JF(TwAPK+sb}aK>msYHXG<%|Y^Cmhj z5|k7n8V#1KJ)0UqA9WQg0>bM)<|g3utW6i+n(Oai&oETHWz-vWVdvK?>b2ZM@mHBH zuK`2i=Le8W6~Zp2#!#Qilzgu!3s+Zq8n2$m_x)VYE#?$)I$EFIa>6$daJ%?!Z@Eh1 z=4kQQ4i$|CpY=a2%AZmJ*wyY-9kFW@%*r=pPO8n2V*E8(iM?RduN4AZfN5skl?&O?|cvvxn8oa8swmcPc51lbaFny zqvdGsIPaa8EV(2Q-O+;gOl5T$IeN0mCK}(-1`={+EzCT}-@A>K5mYo5Pvo;OWLmyw z5*2_kUKtRa?@x1rCS{0cdLy6h=jf(uG~pk9z&dTRxbys(f+%mJdp#=zz=ah&I=Cm1=`KQiTJLl9wZs>Y9ivn>pUlazbPe5i`4)T=vK zSZRW6k}7CDDEBt3-#=@eYJB-6N9)A@s>bDG-g8S32EH#Pw8K|U9^8LC8%)Xk%+g)n zc$y^1)%H+U3pedBb%R2oZfJ0~)s%cJE1@D45t0ounry@@o%E{>04GALT^X$g4H{(3y@L41T)k4QEP0x~XHq4)qECI}s&e}W1U0^F3`)i2 zqzAh`bULG{IB|gmr7>M7l}`h_g!999n8I0-Pva03x(4vXxkS^{$O@3Czt}3SqRnV+ za4>Ya-QQB}j%7|dv67nAS4?M&g^xMUybynEHW5}_SS*l1X>Fv3GQ)1UCl<7^wq9AzvI&d13HgBo zgpo+)T!|!YOSG#=ql<+)OYSBvNYa<9!fxG$#CJry#BzD;Em?!3V0U6&^4{WXRifC* znHR4lcZxJb5|tY-%yXnQKCPIwZ_X-uxH7ry>>E#iP9|I{iJ4%N--BWDo0Iqb`I}_q zMJfALSj{wjY#cG8cWWql+-Y3v__@~2$FV# zSF>p4TNx-JdeHJ>TQ;hQA(x45ira@ho-PsQ^8-l7d}TZB=kz47tv#ysYur=i-D(_F zadLu9-{Of)+N;hNZ8azPT~5C9oX zov2DL#!BHZv@cupo@jN~%^z}?#KLEbBosbtkkH+BAiBXr*co;@94*m(y2WICzE&;f zyG~>H#DDBJDbQv_r$!P7J)#9#TyjY~^`m;nSp3)c@H$FA71R&;UY@O|8dMf@xTc{x zIB1z$$y*v&>{ZxzIcnGb;gotE#das5+;h=8s=wHxcuqAdpA)gB0Oc(c^r*XJs`??p z_(z-!e11w&AguG(HP2=D@l<#aqgLX6-jQkBAL$F=jdQ zEIwT#KxC%cp|7)34#>m9Y44$XdFr?8(!c4EYdL4xV@`nNLpg~4^a(BgS3fBv56IaAlDHPZQzS>2uU(vbh6BtEx8mbrBpC@3-u zQ1NI9J3pq?^7s5jF011JbFt%iK+U+_9lKdIJ9pO-Kaa@GO$VR-;Y~ZVmNsW7U(k9D zb*~J8q2o+7Y5~xHqy0C~Ku3=MoUR>fCiedE|Ipjmc(Rfv?7MG$G1q+RrF}hhVk>oO zbTq!Bqhsc!fHRFv)g>LmTXzozV@&<|1OCi??i9dLR`DH$jxA5Hx% zSEGk6S}ZOyGE#rj=-2D&-0(+QZvN)P`{DR2{p*!0v)YaihWr5*xaxZL%ct|>YMDdf zZ-T{IDha&bWO=iS|7H~YN%-&dV)*|~FZTcWzkXb;N=GiBrl99-(RyGi>cL?mOaR=# zA+Vl>1Kis_q>i5sojlp)01qy!i!bdJD!Q>~wpDF_bX5!Y*e-`hDu8q1vY)Sr4dIM6 z`Jg7tDE%B*flLd&7rh}EeoWtRP|DJ(WJkwb?tWq)%l!sXgO|MF@=?q7Hhib@=y+3p zqWFWN0jj~-e8}Zvn&kOsu={qsSe;y=wB@eBthDEqqB3>*^Jig~gUsZ$KV=(Qc({lV z(aAs@N&&Xi)ay*iBPld$4(5zB4i9{|m6`H+ghk@Ad>_x)0c$Jz;dxj%9$N-DS8NEDkNO;d7meU`fWagT{4JomS?1e zYmsEfieA!$uLhJycWF7COmd|A#~!DJZ%~jP+a3rEPu{6A6BgE0^a8ki_O);lhhLP6 zK5Q~5&MR$-sbK3-KX7Yo0h;v9f$1L+nq|wZ1l%hVgWBLe@w0vGsKaLK=Qi~N6l0-|)(;=rtu4q%6PLae)kYkXdymV%(fogvG@UrGwF8{2BoxQA! zm-}5s)wH~fZfh6~8xBO}<7RsMctJRGD@SdO0}aWj2jfXpmpg{v3PZgwEYtKE6~{>q z5g;pY4=?QE)nP<)deGb%C-0dThCTc3L=*+-l-s(xWn2+EV%As9bE9aEv_K^;kylr5 zOR>tRDKF@&o}!u`gEE_9s-3RBno>Y6MJZ>J1}nWC$+$$;C7X;%;UxEOx~*E#$~0Xk zrVi*jUF00{vC+i1?ehMH%E|*+uFI>(>nH+Ir4#4OK2r}KCN(WyK|e7!ENEhONbm+_ zTEDVi0dkJ-<*P1bVF4}0EOiy2Ns{L^1o?&Qox4i8X*U>3Coa`JVoAsUg}XNoYbs0k zh3T?OPD>$uT7^as$`(OpCCmh{#1fe;K#*Bw62c^5CL!81a#RK(1PqW+l!S;(G7o{E zQVd}VV=&AJA%-E51cD(1?hZp&opbIz_kQ1V@AEz1-T%POp4MJ_t#`e@cltem8uyp^ z-A@a0DMMn<8P+mrjp3+|;Phsa$!0i?#X7 z`h8pZzxMZ9CC2W~L1OC+U(Vdmq%pp03k#mABDj-3I~u?0zag1!NB@%XwB@4-8u^N5 z)0^#3;;2zMYMGELVX|j@T1>eZz0?)_z-83}s94tq-A|pj z84mPoMQ@xojTQY#*i8`qLw5Q`qX>y2!xt@)+@Q00lWwXmuAZ}_Z!_gJ%JH?(P{n2E zYiNty($XfA;n>?%`P;v$Qr&{_Rkb_o3keR#jI?guArF7B4{0u;T~)W+Dx>W*`EB>m zvMPC>?Lwn7nY$Y~nPZ*HspFO9esvx<5lwqh`{ii9$W(hDK>o0t&*U$k2l7Aa<&hFQ ztkb}l`-BV}vc~0sWahB>!trfn2UN_U#_)wJ!YCDl*8&l;qM9oQ>S64wlGQ-n$M9_c zCZTwJ>QeS{rHk9`!$!q-$RC-HQwsE7tbe!@HO{vWs>D@|_RY;0mq@Ol|61y|(M?Qg zz>=BUcjE|dLPH5qbgO$YtVfy7czkUs+j;n=I?ZN8FDIuulej9^7#t0Bn8?nP!wRa8 z2sf&BEz{umECv<58t-kaEbi0AB(18;^%T-1%uzM*%cwFrZ2x2WQnlx25^`+b+S(4M zpYZur)3c;9S<_qxDN6N>MiD;r`?@M;&Tz4JpHZa|>Z!K@#S}?J))?$`x>5i-*s*DY zulF|NJ$u)OgZ!43!oQ}9IYUaBvQ}hTk3+e$gMRIcj?M=rDh(){yasMsFCU{PnLhoJlXE{ zlS-I8Q1NNjHuLmzuSQy96kh;T%Z&$^7ZH5htZ(0)`@)@+aq%Q(b;+$*)-CfbMZV|p z$g};m!Ea*d{+q+4+8IY7bxvJkwZ!hymZ!)y2oy+HYAp{ZbiZG@A55c4TyNmpf@Kytr zyEe%Y1?WKmqF=rG=F>ovb%iX)`&;9&1YWO~Utpl+RiHPS(0?{D`l_?D^Tb;HBVf)? z(GNQZIOBVv9^2R!e1xt{(xLQSn;97N9`M#okUZ?g4j-|%0w~!4Q4v5N8d527EVtZA z6|s#+~1_8!v$7$tjXVDunng(xq<8=yDl%_T|<2kAn; z%)Q^CdF}cFxoHhTb$Jd7(76iR&$J+$@V)4vf^vF&^LKM5oLxSN&Bg&wZ{rgrLL&_T ztS`TlhzJ|u0$RDy=Vy^QyC;|>11z^|JCx8(pw^mK=vib$q(=grFhh4?AK&({?oZgIS21iN*mbfuX0P+d3#AE|s=R_DE;EXB)ibj`~ssb$v z0{n%c__j7vi|T6jb79r$8J&grIE}rg7J%KL?M2(}IG=T$1gy;XMWv&He9_(I-=O7F zE#l&z3!#?Vz-FmeYr*CwWlaqrgZV1^+c$V*E*HC)Ei5TLw|fXD0C*<~)SdGZR-=9- z`smO&3+OCd0SnKn)VEf_!yB`ptNCs}ryaKhAd#3CS%%butcA^LhdM z<@AC9uhN;ltFC$p&yG-bA-t$lu(;5*HL7KTxFVI4<{w^!o#4iuRIAT?&XJxa8lS@F zj`t0^W67hxV!s=Ml#DG)pG9}C(1D5Y>j|{8JMkKfoHi zT!)L1#<_mWS1)!fSxVAR`t9tvPT=sB((w;z*Pd+-tyX4@<24W;01G!_L-w zBYLL9mO3zIXuYY-nV3-}@K(m5$54Jf@M-65pa7&v&Qe;{s;QGrK(Ij<9uG1Z>LD$} z+wY3cmtDjG%CM{UGI#KS@;Z_S)RnO zh`Q)fvt*OzyYrvjowjeVw?`kSOy@ufRLT~cr0f>IqBCU6romtK$I&@iU!isYj3^mb zRluh)fE>f*eUo9)TuNP!m_Mb-(%8ghMY*o^Rz4rg808Q6Zo4g@4PzBk(~VSiKDc|v zETO@iz8YS8Xd3;C1af=VJ2tXtZ{i_pnri&@PlY7atwHBWRNl#8OfQudwH;_w`46qi zQBP{d;|~D2jRx!!T(~s4^`;#-z23DJPWQzbDRa+Mu6(u)U2m>;x`6lh*J_B-NCg~* zp@@$^S#GwsaVelkHo*W6(^axv?bS<{z(&25q)@F^x5#zGM}rGB(R$D0+t#9j+u ze-d_IwLc0nvhv&jepg#lQ+$b+SVW}Ny+{C4PPjjV0MpY{j3jKPu0t@ppA za`V0l6rW4W=Jxd>{J(G8-ty-R1Ya_>81`s_Njw)bK#c4L2BNNMlxb&%8_-rvwx1V- zISMV=Z)vMX(DK4I2;2-(;`aNo?_NP(u)}{0@nI|mN#-UMZ45O&-t}3Zx;9XDvWPNk zyUF zc_XUG@qvG^ukzYCq_p&Ee?=<+WSXFT>Xek0Vf6*t{b*My=bGx#o3Rmp+njV3)|nps z!;v+@_|+Z6#V(>l4*<%ztyS2pj-FyQ=|NyJiWX6sNYSSr2q~ z)p#!&gXvvQwq_u-sxG-!TBFdqIyUB2>?#;O_vX9C zNp-o`{$AeNvqlEF?9j`0r9wtQz=W&{a3rpU{vjxpLq}v>o1X`7KiE?55-dBj{Nb&r zS>8D}#y4TFgpBDxJDvF&9aSjfWAV0QLu%qOo()oYu!w*_?~#ENN&|r z!UxnU@q^Mq|MROiZAUbeKeBRl0B z7aj(Ge;{fe#m{tos|Bco_08JC-{<~t;b59h)%NL{*Cp4*rh0d!xh!aScyj>Hz*n0Bc}P(I*#bI`2k4TeJoCNJrO|7kz*L#> z#+-tmAVC5SRIg$kkJz52neHU-=}Bqqu$Q~YhyLu<CMPF5lsh38mkZ?6 zcwch+7b*)NHT}?Fq93P)(nz3uoFc}iuKdnNkpNKPhBP;4YQh;40(EBg@B9=)g0CqF z6rJ5=F98{Jc`&*z)cZm#r{4pPcSg38W{gyyY>`FB@Xxy>A_V7 zgY@asr?pGcjpSNa5>Qs|2jJ~05z_!)@AN(I3qa(p#vYcrl@RJC7whv}?3+34fAArk z@0MsQ`A;5%Lu*dsmbiq3|Gj(X`CBaVLb@sTTH)KVi^8uYB5~j8Rj+(x$d*Ng*U_vc+Fmq?$rCk-ZmIarG2(7?c4~p|tS;V{sCbSC z@ygp>yw&3F%JzlWeoY%&^@21 zY~6-4!+K%ymdcJ>OJh}*&2IhfL29(rCZ25EJ!ME`LEq=OH5U%owVyP!uB~WGyK0_T zR$zYQW>5m$3>*IUtFfVS`uRpmdEIncH;wk;4Z%BypE6nsSoPj$YeIG218kD=XsoH=wW3VTUl~M%5mE1v? z5Vnb^1tm$4*6nn-#UDiG-v0(a0L#78f@5)KvO{ICUAamAdLlkNffvIa?F1nna^8)p z4Osh;0q26Nv01z#sHQQOLK{%CVUfP{npzVC?W>bSW1)Z>93A$*wCKb^6g7bh5*Gl# zGFCBaR6tw8zieyBd`$ES4%Tr_Mm*EWDSl#~=WY#+yfU)TUNRmijrE*~5IjyfIqpz8 zW-ots;Pd+t7eODV08n?)xc!xAID1!4e0Ums3(lx|&Fy2N-i~ zAvwIhRu$>cE`3S21{SExS9GeO%)sO}JMvAwT=Vo??$uMoSGP@JIzLz!Z?(Rtb8gE? z+`NxX*d4R>|JwpoK;07vs2N4Kc4{ZR6WBWz!>(A;*RSrmMxE7rcXV)dG}!{|z}M@l zO6jbo=J*909hs)L*;#J{&QZ{v2#BHu;Yz`=Q>nG31Q0LP{uwPib1Z+NK`A-gl4_uf z9tyuwUU$Rk1Z@LB;pL?HznoFWr}%Co4u{qS#*I({)JN(dnG0Ap2ZnF_<{i};d_FTmrbi_Q{&DJ zzb*-%V0CH>;=%u#i-k}Lf8Go5(@uyP5Hi1;PRz>$L|Fmm$OI7-o)DsI8st>7x0xv2 zl*ul2EU2b1HRz?K>C<9KrwIhp>7AyRNv{BU7a7uu!z+M$)Z(H;5(>Qa>8Y$KC^NB+ z386shTrCJ_u~b}su5o4(_bNBd(Ntgz*B^814Pcp~y)Vd5--ZMznv)fcJPoo-RL7M_ zgZ{B(6Ip_1_qd;D|8<(B0EKtZk5<&w!1P-NmYj|s@e;D3;u}l_<1J0C(uVq+q2>~w za28dqr7<6O!@g3X9EU`Es4PNe(WJ#e)YS)d*_QXTXTjC%A;~rJa3Zh0;$5VpT zFuh6FE*h=0=DG46$~P{mTDdgswyfv5l7>Q!^8n)cjVlrQ{w8ZX$roUMBKC`` z`d8P^AOlwp{@bia6e+Xq3Uz-T+!ne8z!R1L$XOHnsCC3LTs8(cACa z*`07{+iq@Z&aQP1|4dyoh-e230_u?wvx5&YN;NA+qFOBm_&b+;zqeQz>6;DoE62FM zj6Xj~56N#0U7Pq9@84WWRc)Gr4v5%}^_HU=E@E1slec0~nDt3~@@)u)DXx0Pa@cYLV3`-wQ!X}2VipNX z{tm3+?*vzmR+x%qi>jBkc`E^mdvLpnYAO^FW-LZ;yH4nogGR~hezQuvLJbH_%M?-WBBUkn5CtX zWKCExy0B0N;EklW{czsGb$snc({C;>`HRYVrKRJtk7u0Aiy}S+CB)RD3%AYd+}%Ab zFYrF=a~`{5nLJLu>A3amEt>bIUjz)zi&m*)i`(Q66M;^XNgFw#nM43jF|Cf4+qa}S zX4R^G8oc-Ih7>68(^%m5;B7Z1AiviH+dw3_6KGVWzK&h(go^rN=}y+`A`wN&wm71vtmBPpblNq_6hI ztngMVB#Ijds3jn%TeTy_`XoL-d>6rGnl@H&S|oO)6e7;MHmV1FU-gG^$zOxIwaq?C zdnkB+kQU1Z`RJaRDlc3;$*BMPgw9aN^}2t3X=7n`W6{q>5%l+oGgRuIv5s?oKibwm zX%IJHJS%CAI|)+D!=pX-~WQRn)AmW;3gnh zem)<&70Vnt|Dy+t#jkMvshc>Tk+L-WC@41O(uIJY<}d`kkgMOtVwivWX$-0>U1y@qADD*+C(X=|fGQV#SYF45h z>DTW&`7;pB)=-+u05)F8-`%=oLbEuXGBj;nikH5gp=(Zf>_e0Fr2bZ1Kg4O?wF|ZebtDnDiZv5f&;(U-`_?5IPCxS?g59#Hc;@7NO z8QCW+=1Jc%-74?HFeU;2G+2c)2J?zTIe=}#cNZt)nschB70N$n_d82sA{%E7O zbMP$!9tid%`J1}s5h`|oFs>uc*Rb2P@6Jivo@LtB+*%4=`}IpkO0lwy&3NoRk9Yvq zMfM~T!tbhCD1t_33kr)XHlq5Cvj8iJ8ko2&G?oAxD0PiYA!d|)zU1p`Wp+Z@KLUZ+ zKIv5bDWf85iD3F>@eVhHid-LtE7xh`@4WVb#UQq$#c{VL@+%C2jAuSJ85^krF*L>* z+9~wwoaP{}SrnytIa&hHIGd0B33rR{LtU3o`h<<|%E}kqyqKgtHJzK*6}6PH3B9@U z@Oj`(s}Y}*Ot@BJR~P6ftTkhWtAp=I!5yc;32rBsqnr{vSQm z@N)sbsi2o`vemS)wS{-rAV(XCxL-K5R{>9N{MN?ChK2!ncpDQ_ntA4orzJ2Em7yUoA@r6aN6jX^V)h7gZu9iLzgqF2if z&AY&D#hidg7vu4Cg1Cs^+xvif6|nz)KaJSaq>U%6IWG~!=X5~^Xc#LV@8E!(LbS=h z5@~qCU@RKV8ekN7J9G%N>l|n5&mwv@C63LjQyUu*%gf8v4~Bl(X>Hrus!kAWpFR=2 zRNi1q8!eG{|7-O2M#PCEM!w-~Bnz=OOv{#$dG6BkF)l%@c)wc008MOwa1pFA0A=f@aM2mFFlSAYA|Vb7cGzlRoIE7VO* z-E_vVDtF(6Uzqsg-Q&Oi8tR@c`bpR3pFOq~2{HcNwPM=<_pba2pKsKDe@C%p1_RBK z6nUBWBWL=kfq-(cb{MC-|I^QwN0UOh`{w$Q-U00V|NKxOov?5I0erq+F8M#W3)$wL zBX!4I+_ZsIN3ysPr%Sa3pRZC(8&xkz*`Bta9nGYSc`#-MQTE=bW#IL{5RZChP7y6T zfmSCx8QvJ=f?JD~OGa@x*TOz&r}Fr}$rwFDs}*#w&nHri8ZQ`|bydf+va^=oc(IbYlK`?NSCat#;7AlxmuZaZ*Kvudb z?Q~D9Y;Pf^)n%5N!R4lvdCcZvk~_6xNwP?T`Zi6O@k$%>_;^D@LXGcSn610n=BGFI zuJ)w$b#@0*>7+j^n;8*Ri*JPoH|vIwcfCQXX?}O%@o~rP7JnVQ8b>f3o}px@Cl90= zT*+#6iyyA5H(py?V|;cmn0Y^B(1%cKk8dc(*IZZ&USr%Ln6w@8N3D=sjJc? zr^yX)>(&_XC_g)BTNm(g=q`t`ZXzL#*%4fm49a_(*ciJj>2S_^#OV{tx(cMHU;=F( z7W`V-i#d($SC5o7ZUn*ec)u_6sG2zYzvvgc26sl-`d}O>q*?56a z)6k&fJW&W^)4Zjv&a0jsD9?5=$uE~M%}q=a9VWEusV;YhKbRv0tr%cer_lpT&&Siw zO=X*#ca2n6=%wqO8EJW=p)B7+N!Fv?b@HEn(ls*iBCG3$y~|JphU2W&!Wjy3X;PeS zg~t}@qca4A;f7K@qg*1ISeNRuIe3cE+qtm{8CWv?m_G(&JV8&L?gVMM=G^vZrM~?| zIjQOxwa(j4HyA>aUtP6cpc>`8w=t$Z4Em9>X_Aq)wD{|n#~WKgq^~jdxep6Wx{ZN# zM<1Y{26_$HLK>S-=jDwI-nw}rNn2YR&)Z4+)GnZIPWd>Q?q08tz^4ACzCOe*_Un7F z!CO-qLkhkLc1a*GD~X>g0asNSchn>fU)Ig9TwNg-iW@;0CuvA@zFLvJ9Qh+Bd3ZMZ z`>s5>#=o*UQwvLC~{hN%Sh6c{BdFGtSB7YuZwq`aSY zMKQtg0=;NILDCD_gjl5)f5+k?Zo_0K4_c0^bL{&(*iPM>;*ciNMs;-Yg@w#jI3#2s zrSF0LICciJCYA2yyp%zgpv?=+wK8ko_mK))8S*NN#7dSmiWxWoBh9but1tqNrAB6zMP4nKA=g-QO>l8H8 z!3YLrx_qTNgw|L0H@ih1-OJXg%%ba}GU<7x*X&NIL$kt{k6GDEMfO;0gYnA3lJh0j z#o^4aK)qOL&00SjKCYx^$zIt8Wamy7e#RJ6r^A4wN3o7_GIlB#sNAIbAj0a{QWgLT zPbvHVO;iuAA*w0kQ1FywMJ|hb5FKZ<>~KkPWN z;QVvKsVD9=uwVzqavGzT@%syFe-!Ks;k-pNrteZoQoosa(GIfKl?^=pQ@TYhUv`4&}rhj1* zLv5_59V45%nORw#RS~W6r`H6m2HBplQPwHHX;qjxpO~!W>YA6G;`?>3V&j~eR~%w; z+;{p}A|P!XauxM_Y^=^NT;Pw)n!*AyRA#+}ny=MA`}wvvg=>uY^sZu++NSCjm5R52 zZRcR6Tq@uE*SkS3|0Aqb+2B)U>{c*?q3k|hovzd2cPeFWKdG&)7--f>f;@-~t~d3_ z*#!v5xxu9Mr$xko9}VRgZw7X1M(eix_+|@KlSXx8(GyLCQq9Cx47CNWU=+pd-qwVv zmxNkEx}JcEHOg*rH~igOwWjUXtmjD>YQrm~c$Lj2LZnTzUbO$0pErMXrSm)QmooeLA0&<=RT znh1u6v#g#@q@uUCl7q@L6lr+OL`_i%$%3;Y0s}MotOnw@Q66jqqK6)cvnFZ;WIW7xS2aTexxh>l>wm$rC06=ofBWpOy$OOZ9$b zNkD&{DcJQeQ_j-GLujxqQ2iJW zIoXETgEj0w6L$0P#tr2H{uW?Dt)tclPr@4ZJ%g~DqXUOp*H}HkUMb8#11QNPfM9fc zHAy<*qVN`TW=9Ed!F?xvD5IlA#l?Qa$^9FcTtDciN8j2V=D*!Oe4H4CcXbKi!bk*S zjtMN8?lMOefcTR9L|jHAe}%n_Fs&SIZ!SOC50r0GbqL54YJ3DGQD;PEpFgiH#BECe=-fyMYr!#_TfIE2M_UYwNQ zZR1q#ZC({-8@AIawpd}9zV3|7;mD9-1PWiU59l)l623Z6LSI4X;jg*vo1m*nc zkxZFioa;&K^O=}e`G8!&S5@tPXc`)7&gy;6d1~j#9!kd&!*)^5og6e7rczh;d={ee z2*Uj!R;gt1tiz~MzrsFN4~SDxDcIdm3ccYbGWEyGHWSSJe2JQeE7G1cE6j`?bDr%h zaX`8>Z&awJ<>eY8fywMr^~;s`EoMKERL7$Ap+V^Ud>C0?V{Ck!K3Hg`_Zl)6rS*G& zyQ%)jt$ibcjbY^r45sO(UU^2$m-HthcmBM)N-hRy7Djla0{1LCc;FDM;h5M=bX&Y3 zi~I!K zf)8`?oQ}dsbZ0bwb}4aOBIx}4`LNb^@_~kDOAOKNU@|BiPKHSe@6i(CtHjnb&a4j7j%=UKfD8&;@hPJipkBmsA&%&dBDlT3Iu4pRi zTqVwycCKz+A+R`IHGJZ2$W#iVQ`nw&bq9fuk5r7{hCHMx+Oi3zJLRN?l^FDhgDsCn z6c=Zv!-^E2OL>7cP6ygM=UCe+qIx!x7D`HLyd^bF;`@0EdAGf3JskmoZ%BiKj+u+k zy}!TZ}ynGK9P?7(S-;DN~R4g;&KMu^)+(v(2dWI!WS-y(0vq} zFo04e&$LT#Ibv zJekRNDqsJBwZ~i7S|&KUs^#xn-Nr2r*6}xG?$`l|gv*$vr5|0Y7w^9=uUhXMC;p_< z*@b6wCr2y-HN=)N5|1eqihDS0w^h?6oSVz(s;l!)C#PF!c%j!X$Q#If=U#h>zN8N& zJ@lB4kkrKXWnPpAy0y=Lo+oVK1c~Y$L4;|qUcm#0(0b>uoc@K66sIz7e z+VYdFx3?e(`oCip&Z!XjR-_>@+<<4d$B1AO;~y@sRGK85k6Eh&xl|V^_U33d7e)dl z-um+mba`?jrr2%K0(cI$qgC%J3IjI4$nS>55hou>EKbgvU_uf64Oqke>=8@* z?<|y8QR;3^$TseHV2J1Y_B{5xiOR(-ucp|GO#=A(^Ex2AA0jlN0o$FhgK0UZ>&Qa} z0}OP!FZJkz3~Jh%wX>Vs#DHLV$|PSwnz_<5v1tSi!cMxqeo|lA8fG^+LGiyEK{OIh z?ne@u2NtW>)kq~gr(NEb>@A7}CW~SCN|Ki5Ycf2q0LXv?BQY{g3Kq|7)B^$o2Rt}a z)Qdgj;)Yjx$xDQE$lJhnCJ=E8iuL2bODc!+XLq>_7=IF9s=aSegvESJ2G9@yW_?d} zg@4&1W|(e|WVC$gS$7IR0%Hn-8R{FM0_&VlroYn(Nw7MK8wE z_e`l12~al#B2u}&tgiR)K>qR^tuh=J$}<3CqaT~w7prbr=W z3s_OY$IhAA9L<+IWh8SGdj|~Z#6s-+*tLY^P~+@2{wW(}*xuFMF^Bl-au#zZ)QiT2=eVa*$p!Vm0cv!IhU-&9(kF(~~3Bd!+BcdignB$R}rT;J5dn zx>4HXzk<=;fKz6i2w1|;*$MqNYaWaQ9}mOal}u~D*R1&sri{f!QgMB~f<=2yG@YuB zb4fA>z1@AkdKNu>>pW!NY2csU)1JtftkW}pl8$$Oa1&x4Eyq~1ggkWGvy<@Y=NMI& z@7=o5g9Go18jVo(SGG@&j5Zs3$jFhl?H5Fw)|?|)thD_b}#7%-?Pb9ixJf?M5RbHJY?Bnd;bRW$}e}>CY=xfe8p@}K2dDD4p7~&%gMtQl4}4-D#7CX8X7aa}%7U#kPZ=~q zyl&(+vp2ZRS_-DTq4jd6rg5{D-ZWv#hDf95^Q8krZR2#li7{pbUkY-j z)wS~kYsS1T#GY8}-8Hh`+C)LWSsUQORcyNv+JB0Ob*Dlh+d8_N)^I%iJrqji{wPetdR;GML%Opbo z6*QOt(}%mYp?Y%rsm)w>DI`!+BJ85g8e||zi~I)SfjN`3o{}Ql=JV`~$BO?yw8)-_ zn8r+k5vA{hmoA;CQ%>qNlRldVX?NyQ+(ryy*`42}2*vSSlyArW8@{f-U!^F|yLskX z3aUMJxnLJ5>&m4C#qF%u!mAB7lNRgtIP>5Qf;?;+@{sKVC~6KaP2mp{R=YxGC=}E6 z*^yb@tl_}`eG~Q9=^(?0sc>KVDpMG9bzgdx|^D{Uj{F$g-uoX?I>p3-atumHpv5bTl4=*Qj3dAH~escqOp_#70%b&ab?G%=-}cde#+k zE{gdpE1-IGDz$l@#61C{Wp^8$Wm$*DM7OM;;N6)_j4fMx4`vJYUYbq`G&vigyMc<> zDP*eY=I&6RYLYHep=0~BgKaE~D~2@qNkeI~W0YJtc`7-|r>k%q7V956;XhM)|2)uJ zOi`@;j~^0`VgW2?w|n)jYietI#D2PVWi!cV^(&3h%l`GcigGb8F#Ut9x?2?I?~THt z7G_k1+OK8gNHt<9Ad$B}ezWbZ$|f19@SdBIX{e_Pr@VQbW0P#7No4~3c({!*t)f6 z9HTE4Ele%|0QI37p%TwuV_18}pJWT*wIG>>6dyW^*=@?)b`5uS*!AN(*DzN4sk@L@ z&Mg~CyM!)Ix+kxEXV+oxQu1&XSDozB+g16OZ~CaWmb`Xpj=S4lm83VfpO@CK>5=hQ z5RIH!|4;Y?-Ck4Px*EazZH*d!dzL99-F`gkV10>d0si#ZIlguEl_G;-q zh`j-D&R8tWjPZd<7gtvgcrDw9#gL1uY7CUMakb%5C&JbE4Qt)dB%Rn_O3yENdrNsL z1E%S!iYpS}YK=r=LiNLi^@!+lTdOJ!q*AArmUeD7GnLT@JKryTwq_|qoVpc;(A|{e zbZ^_|g0S=NF;tz=7dm!jy*(09<}>5Kgg4&$njp+w5^e%ez&N@i-`{< z&dkJ9d9%is7k(Bzm5qs_Jldx0V9LphEO+zrhFKGto*lsX?aO2HzFSc5t^NSvwLhL6 z00CB)XjY@D=`N{&q$%jEq^mlA?A&p!i!eq#-rilE8Yxgu>~a9!5;uxcst;*YP;eQa z$y<|1_2<|~AP5DUZ} z@w=dNeL!5n3Grxr-6)CzxszHO;u{@hI{gAeIL=<|+)cs1C_b}B{W9v!2xX#G=>;~Sgxvrb_< zbDhwi@#>n;M-gP zlEl(6xufGss!nPtx7@1kASd$H1Mc-UZy47oBIzer&bo$N8=9PbBTnF0kMjtw)@CE3 z1sniUDI9><-)`pQ=7z*sk)NE)QFpuJmOC33nHu0i)t~j4idsJFX1_Ms98u!GpIf+e zXy$oScE{Qh*8%vnVc%o#2?y6pnfO8BUqDSa!2q~4qK5|9)RvfwBnGheAJueVg$H8_ z3rkW`tbq=>>~EfK>-(S^Buoww8Sg!CQQY#atJ4wM4m!-1f`v~yKqart@zoIlHv2ttvX9iz1~+_)+JE+3+&{f_ zz}Y`r!p5Y9mjnG*Mrz&Cuni90f43-Bt5f{`m}xo)F?gg>T5glAeyYdk9_PD#j*zXc?0;J z@WGc4qc3jxT4j$eV&f%!Nq=$sp(bn^nl7FrJmId!0TTMThuH#hA-ca#P3k}RF3<(! zzHQ@mb@Yq{AbzdW&C2EeIUUDeyz zC&Fv)hQO-#5zy_Z?FcrYb|~l238!8Xgpdo^1BRsV32OQWZiidGG`0|8YiVie%$C2) zKWA)+Dm+iVEIh|u^I)`GMU7D?K8)eq)6WkYF^t1{2~T(_b|f(GUr|O$lA~q5JdQbR zM9@KA<^P6896Uq#JYdX~U=Cts=AvqXTx^J6f0S?i?Ztl=0wQwjB9Xm6U2aFQ7bAoN zVi>2h-$L83{|E%92H>#He z%o}NG1CX%u#KmoBpNC3#A^USoQZ{}_c)D=L8)Ja(2aFf9n0HgHo7tlKU-@^!;y(`d z=X8Q_w2Rz%aWvWjAxPiee`vXU1h)$hT-N(dHO~4k8*%iBM(}tj&=Wm0MxNKsue(7( zp;qy%8fC98Uz$K>ghD~SKjkc~U#~X}_~zkJ?8J!J_H#4C8TAzy1KmoGERgnK-X>%c zI59hIK;0n1c<n)lek)gQ0*fElzKCkBJsoPBJ{CqcCXNGf zSt26P`J-87#InxT^a6YldFT3M``^Ex*9N~m4|&!u4Za+QTtWO*w)eeR7gT*EDcjs@ zAjWlMY&wI2QXQF?$ow{|w~tMGUJYwXe<5t`TpZ7F->k8}@Z@+JA{V+s*}8*W$7>Kp z=g(nQh9kYqZg5!$a(RnV`Wl&w9f+uHz?HuOO}mML?3Ify$KQ?Bk8g;;*Ss$2(Htoc&}sFoJ```Ws? zRx+2>RoxH`Cl2dnE#9n$7peybpQFabEbaVL-mfJPS7dy8|70slo62$%q|SFhGHWo<61`uFMOK29~J>P+NDw%P%1 zMUT#8(UG>`?_XIsdExSUzEo_al=n1?Pu3I~NE_8^+A(9bjcLAwWPWO|nPA z1GhM0)TK=bURDZz{_5^Z11kkN=@+V^AO#QVgl|ZX?-Z=wCnKH zaDG1l32sz>B>_fZrqwM@1T+Q_zW%?9If?cQkMWO->3(vP;{_K`_PVB3Iv)N0kI7s7F_Ujqe2}k z|1!IboM@Nk*;?>)yNpWBVN#$u_1VLB5-uBy9uI$Dri=mTJWzCy{nt1w!!57#KtF6< zcTb?BP01d6n@CJDc>~Uec8+3_1}diFcDuPGRJEWb9Xyg3771Gy$~8s z6S)-16IsNUA=&));C$J$-4z!|%U#j_@$`;gX%o=B$&XWETu;fok*TR2lbTW7$Eo}$ zPp;WtDk>~A=%*uJ|1Ll!Kd-GWGQOu>Vu|!vKpm_y={LwoByfF;N>uGaS+Q>#q zw@$zVozt%>3deF^svSl6_i$N<{gj&<;(56S7IQgS(aEQO`AJqUEvr}Dr8VxyP6>&n z!KAfHAZR0Ff%J@Dy`5=&&)c%p*Q<8v};XqYYd5(J-j>xR~H{^@QYmOI~A!M znPu-KJuuka#}RL;Z*eAPUfHd2aM8eSV)L6~gS&14|k_q;r9GNa8w+L_vQ zl}$e7NNbaV3+*W2 zN&~4LaA`$kq?0g2D17J1hVJCQ7lMbHmrxb*xqsjAxzu>kotEvd5+Q1$Z8}+&D%4Gs zrqB4r%G4#dWLuwLfA7qvS-n6^$oZN{72VSgH)$UpHo04z5YO52YT20p5;xpUDhglT zS5bCWM2bOTblu%;*ewpGJ=d3^o0|CcL5R30aE+(TJ?4mcxS)E=Xlbx@4bP zj?xSt?raeo1TIPOnUtESUaNM_bEr^2tNFKN%Fb?uO>jL-%tvB)04?D=5^|)Z1aR=Q zK2>cKYMk$a4--1}eG~_JtRimslZ;o`#@*w|CzOrZ*LC~c?_Z(G&NN+&KQ7@{28HK3 z6x_d3lBHyCtMMmWTU$rJU$v0es$MwuD3kkcDO%8mAF@ip523l3;$I8^Cuq_nu`a~jualt1nupnj5g2O1{|zB*@m<@AKR(#S^Ob%@dxV_iihf zM++{Q%?i?Uo?KNT=Fp$a_E#5dQ+HAoniiBC0xdjEv`X#09j$+X_GnK%JzK&KXk;cW+T@Pdg~5`+bdp zQX->^uBf{V*>^t%EWdHwz5;1Ua2mwGw2|N+oqiK zzjTgTP1LdQmW%Q6I36G6yU@A7V7g+m?|UfPrTF?h&{m(88F|RNmU}yTV{#n)b*12y|?*#Sznxwz>GT>j2PyXAt z6fMa!Vr7dGh0h*Kt64Wd{&ehR=Lg5f|4Mj7Bc=U=`ln-RMNxs0w&)*J$lsWJ6UBi2 zSv2E;!bRkrT5SW_$)bxG!Owcj9o5(6S6&WB{^7|+OFq4c+-|C{@Hv_(gkwMV3>4T& zN~yXuRA?lT@5*v5twL>m!V7ia@D4Y-6^$S(gq@Y55)i@^?cY4P%^800vq3YHp5`a2 z>DKyLktj$KV5rmO~Z z|N8M(=d6pht6}vT!SJEW*7Bp+7zC^Q)Ftgoz+ZcS! z8cRV+!-hIgjHN@rbQGtgrTc#Uh~sa7jWeB_B^J@`su~}4U%>g2)rg&|SYE4CW-+B! zs=@y=4iCM{%2TxsBEPc|b@;11Ib)pbAAavjK%kBPEHq~&#A>e_ik3Ebag1z&tPSdg zR;EoqybPjd%?tr$>>|FeJZJo3{+O6c$OB7A{FVR4-g`hby={A=-0j`6w~cd;Y}ryo z4+Coz5BlJyfNOr@4oR~#&E>&Z)>gpT64|$n{)mq3De*o-$Kw(*>(+SX^oxz(sq|B zfa?3Q_Cz&`HMjSAsQ(98kGYA3fZc&vEj#ewTC!eI)a3dMIiM5JZ+I(txYpFb{VQ%z z)@t?`a5-AM4gpHu$7jjR0$y&1`2~c}g>B!koj&Ll-4hX;l^XCMW=`GK_%4$?!O9E) zwB1`xxUdK98ygV{%0qK)|JsD0ERN_IWdwTd$4D(LbWf&}*5`Y(ea9(oNcQ^H8hcmY z#gqNfqo>wu%7IEH)bojN2(a4?{sJgGZUYJrJ;2bH4WuOBK#j2FI(u4ryg1Pg-SdtA?xT&btuw*{y-{OcJ}kjljX8pV{uRz|AcckXG!2@!MI*awzl}D zFo2%%?Lo5-<0u}OU+s5V81yT^;R^jE-@DpW78m+)9rf?U4~i}TYkf#UNcn_QX@wQn zRD7=r#*1@ro~j98D!v3XG!UPXL2T38WIX}z>CX|?D2`FY;}&y3LUiAW)??w#aK8fP zkJR%4wE)65+)ZiV2zepB&z6nVVBA-7zkVXEe4(WElr7i2`}+wtjhaj%>X%VV(z{2T zJ6nomz2iLMRx)Dyk@wCYbf#5t)c?eNW*jqr+^d4pqMnqkZR z?20;r9wzHy7sBctJUwOC*Vii%9y&TYCn7!$ELBuglvPxWm+go7UrBPw3f}}X%QD47SQAz+!2gyDMAZqE# za3gU0SIrI}vBY)aBQ5PfLwtAWK{p%O*=$EOT<&LB?SjCi#@WU_lvZO6;)*--^I7BE zoSYd~R41oh<>f^?nm#^0==Ai?>1hWej5^w+AgOXZSjyDY)S{>Q&%`l6Op;$SM0sw3s}!Vm)byD4kmE=rJ@F74@{@|`2?zSCX{RadLD$A-AYdG{Kq-J zJ4o%`N4#oob@ktudfp9cgq=Eb#u*GcVBYQq(PR*L`Gm_OC69IdK?t1qu`~%I+j|M> z%-q=cgZrlbl{=Rom_wl`Dz%3Hgz9O{d!wVH@;7g$0zH+a}V*`Z|%Z6Bo?0U>?L5Oc21k^4?yV0@vyo zWmLtPvZORX5^0!|f4L1-(D2c3h#wAt7gV+@n z?r5UZ(%!m=1WdO}EUeEaZvHL}4yN$45I}f1yV@$+)752A#O2K8(G)uxBOvhCT7+n( z*X-W-Nrs;JA*vZju-^uqLVr^pznKO8K^M4O{tvqkBoI$kE?J(e ze>+-g-YP0jr*Atu%MRA?Yr?d(K>;i9+R9~S&m{d%LdJ^A^YafvW@>%*Yj2K<|Dq+A z)GbC$^ zI_DxDw}hXmobUTio15(|(SDNru6FI=3$yKs;F==8^PE*VIr&gqM+fh>F!(w)cBm#- ztpW^!k|)3H!JEY%>=b4rk)q=3>jL;Ngq^j`wlABerjVzHNX?d&|hDQS%n>Fn?CAMpA*SY*SQK|s=^ z^{=}CIeOzT7IsYLXuN)xf5*x4g-ZgBsXf4Nw+hIMR*o*SE+PV3a}tul=3p8@kFSS$la8`_ba*F4#{N0D0t z+(=03P$S##T5^ZSr_{z(p~iUc>Wtgj_me}Q-#@~r2g!3}Z?fKy2y*(R1aW8x1w_o- zG2GzMHgVK&J}m<(P0pFMQ&UzkpJrtUWv@;2H12O9GZ4FMLr|N3PFhY5;eLHRoKLfD zsDV*lNGd8SQjX?_R^x1CVb0Ffni=I6a=5^~)z+I}o zB8vjSzQq`y!eZ3neo|8pCKZ2F^JPGjT?N0BTFKe@ ztGqj1nHDm!YY)hwkXj2vxW-~J@hqc~D%s}WVsM<5;8hta&($S3`-?Z-7DPT2Nd;X8 zTgoXuK3cN?v}jd}`w;#m>KSr89F0yyXU*Nzhr zxt6vT3-XhuB?pcKzt@M{!<;U>`SSq}1<;a!_y*dOi)V44U!3AXv@$_L7l^OcHqL2Y z$_HASrLfgcN3j5$zyH%3+iLQm695mB;>fkM^aZdT75b^XzxGckgHrtS96{7S1oTLL z%km-{zXR9R@A^?8&KO9U4o46CKlJh0wg0t-_uWBW{EJ>iGk=|J=#W>D>Q6 z!MS5l`rmVcAF20@smS)8F#j8X$eaJfkSZTW6X7Dgk-WrY>S^x12e}fFAj7HpaA+P{jnEztsNE1v{>=wqL(>>Dar?A?XZ zvW;|=kP2_IhUdFo^R22?#F*t)@{-U3yKa02zjGcMRG|vvLa5}`mt4frY(z)&%5uF$ zd+oA4SW^Nxx|ZMk&Qf)?K1nq6ezoWB;)p&8D4xY6_GGv|$;U?kN3vhosv1y4GCL#J zJE58x6pH?%&k+%k#Uy)MTNIz>wv94*rlkfR5GzGe9z;0pw$y0hwzl7ewQv;J@sMQh z#0@yKnctM&zQhbc!tH=AXTCqen|4Tbid2OyYq2Vv_;@0$9}V zda5ip*bwpz4K2312}*gk_NWQ=5(N;NGYfYCziC7$U~xA<)bqif8`JW&SPuY!mnD+4 zo`TZq0C_iAfM0Qy5dtZ0{C0(Tzu+=RAi^T^cjqlQ8?vJ8ch3~3B($pIpnJb1w2C6H zg755_6&F@BG@}Q+FDO$F(crZkTikS&>xAVF=rh+tt)Khr&7Tj1|G}X{NP_zVY^whs zJ~Y{&q&SvYTwI*Kzi^>rK|hNz-*sd|ZN>;4QhkQvN8wZR54A!z#L;m~ z%SVmC$NE?U1KHf{OX!TNPD5Td+!#;COT6>!!&KlEi(OOfipw4&kp4vY>E)jIrAWMw zPtn3LP@M61ma8g0K&iFSEuFhQ7%4PL9O+wssxySCE-)ZS=g+jTBIu_?7aJt5Bu!+r znN_FSsii|k zJC0|T_Ovk?6>$_Id(Ym&0@&&h1wVlZ>24=i_p8Sc8gq2I?sC)pmOQHGkH!e`*47vD zUr69}(Kj}h+lTva6TQ|c9erm3%Q7ge5>OMeBY#sqer~Np-_Y@Wt=40SP8F3Kp>t{E z5bq6xgtc~I5s{9`ThQQ|+BJ|^1ZQszvF(iP!&vBo_zmO&rLMj%PV|)hg-%Vct9XlI z(m=9?j>WjUq(p3tbI&a}xQs~dLuG!7lvk`=BX?83+zL1@VdT8Ca_{(Vuq?|Um{;ES zO;S2<4ho`pBbhSIP%ob;@Rb$q`E16_!_)WBGER(5DYtAXa{aOMs=n$Jp`LU>y@2J0 zqz=4_YAFOkCeMurZ4*Np=?Hs!O#Z zd)_`fJF2BO{S;c^o8NJGiVw|n9-jWY%PT2(&bLn45aM@rW| zzgAy&7Z<{Gd}+uA$?Z<_Upj*xd1Lb2|Z>q|Lj&7~kwpVuhYLM=DjY==eO$ zPNF8Z{7`fgmDehNGw?FS10?u=aIij?=kvr@Av`3-d;3e%fKgQY?QzZb60KD0wfK*^#*fdSt=UsoCN6(gHU*2pwi9w4HHJ}ufoDO+7rr=a+W_=DiW2p>lmFF&lAb#Ke;Dam-y0n~U{w5gB7|+v;Hh zh+nE9%|fc-6#`K%c9^boh%OxD)2mM&XyHJh2&Q(%v}7lOF^N9qGL?vm3Vy+a+_=GtiXWz$q*6+4 zWob1pUYw5L7fdvWr8UK-lrAw*@?!yW$(fnECK$H4y{4~1ZSZlTIi@T7WdL!fJ3Pn* zb|V^Pq!&QCy@OFnpcD#dB(@*Zk?$MLve;TOpkdGAagW3&0vYAPs^eMlQtJ&U0n@Z4 z5cT{?ve><8csMh=#BHWc%0`JMy5Cx`S4&K17Vh=!nLjcewLal;k62b9;~|P_1MAkT zrDeisDxG(|;|ryx5A9GQc@p%ca|XL{3ObS{ou8VGdf|<|4e6c@|Xg<$8$2$ppLsrgaZ;Y zPp`8zzCo_HkX_Slg+Ucw^SVoRrWyd^Crl{kJ8?q&>MvpyWwkPRV)n762qOcvb@o%PUGdh(D=G$oHeq&VWo#LJl^6L)K7!#E+muhV5| zJWM4ii0R?ysju@1;B-`+RACNsa_2s^^-1t-{OsP^>70S(rmoex`oO4~lNuxT?rpc{ zwkbCzrN(>wHp}wrWvpc7ioPqybbancEBL{CQYhXX6z@`}kXNVSFb9Wbo*gi*5XtV# zMP%i75w~HOVecrFRhRa&Y9Tnj34*Zk+}duPXIo$i#IO@poaIh1W!ac$DkVM7E~(Q* zP+!oP-?w(2w6Zj?wubk(lVjOwlNvg;v~m5m9n*`%pq#CYvHXE)lr2y*rz z$W16KHy{WfTeQ38V=oPR+C2W^_7v4KPPcSgQZ89so@rFNO&H%Bk6x0NkdUv3-OQ}4 z-#Xp1xMuyN8dO_0xjLqrI^sW5Kxt0Gr?%JcuTamVyL3!bexXn^dDmGnFJCwMUzSr} zw`OSV+}+ta)MSfy`Tt@Y! zH>uLtP`jFP}WHD;sYhU}r}5yYOgtrZWaP$MmhN z#1>p)vKxa`k=wMaZCSYa6TM56B)IErRT6~aO*FgLS7g7n`YpBlWxKTcj+wnMy|%%P zvUvB!*8bJAt&zkLav-heUG~)Dp^x6o7>7#K@<76L6ffRwJ(^dD=(|~>oL3ZbQH*>n z$deu@uB`*Ss1G}EVOpOuqbs$>pB509YYyHlHRF^HD`^SC%2R;UcIDUKRb6_0OANnS zf@nR{*?G&oVX)oXMI1ZVJnP!vVfxDEf}yw`+G7;mU|3l<>U6rDDB}OcHoLwyHDxF) zX)YpVBLLZDyQ-ts*Siu90uAwIi*-tAA^xgx+$jyEbA9BIIAxe~B7?r5>N_5fRyMVM za<9kd&Kx;(PByv2gur&yY=1SFcv`n~qg_N0ga;09gx9GAsq2%;L-Vr6PNiiTDVW-K zCF;p93z~fw$CJmWPk-ohFs%^9boIV0NU9Ant(t-PyGXOT-KLg=v#jh(&UxnKsM(~2 z#U;W~eWN6_(0X|#ad_*d8u&3eIy~w$6HZmx*c#jml1Xxqoi`BbB~HQ?v{tPs0Zt#<~^5Zd5MI zbSEXmybwbNdq|r`V9Iji7z9ST+AAf7;}FKdpN_oLbIzYOx3nag1oQR{mDcL0P;V>@ z)Vb6mMKEAr#PUPRSmtmCpPgM*Z^u2$JiTThMj`eS>1M00Mzm8DEl>EqpU|5xb&F|%s; z-StuS2ZKCCjomY_36Xz=BpS|%AQU6+@UD&a9y_o3K92GtudG4Bp)^T zBOu^DPndk3JJ;*56WOvh_W72*{nPUQ^VovivGKeH^-8$-ZYu*e={8}QW{tJ)*z_SQ^{b3;c`k#UU zST)v3C&qOC*>DN0<;MPDnG@931XRywUBEMBJmRDPL^(jIdHV6z8~MqfO3IQzT@#wA z1qzfI+p)P-WN>=Rae0vty1zoG75z3$^sQNfD0_w2*oW9G+zi^D5)|0DXrqdWhpVR( z85ZlT>`t-19^q~be9<^)Ys=>eP&YvQ$3FrG(|3Shas?*DuErYpa5bN1g2 za)oNgRATdM#g=3ua@Erd#CX@jnZRDil?agkMVMZ0h}e~{P>-J*f#`PLCX_9;H9Tkg zTE7R021k|9f!%UvfyzIQZrh#>1o172VD|d^!nUMp@%XEh7TSYLnJl$F^konvlbP;j z3j)Nmln;YiEF^wyhZ!A_ zDgpJM7f@?vVRsIp`}cwXGeUN4Z|?)|$+O+A=BRe)zTXvH;FYtsm~rJPRtaH@W*Pdi z1HYL(v)4UgR$7W&1T>XYgOG`^Bhg@^B-?UsdTG8MSkt`Pi zJ3BjrX5)3%Y#KL#dpknW=-}u>!=0U>eO>luBOB^!cibz>%33dMZ)P3%JR8`4`>($V z)ik@-&W8-t)CJ|e2WeB0Znl5oar$7Gwb=JTDn~u(qAoxHJVz}G%!tFo zsXC$vg*$id0IyvKbbpf?v`<+b%FD?>LW$NZUT10%F~Xw6%Pq} zI1l!k00rOAw#{M!-wbkdI5>agX@VJEO$_<#-(TPV+bJ~vFl7H6HE7j-lCiTxAZ#bN zrf*;%b6i6QvQ;2^Gqbm$cq1n1t=VM0DMnBiy8KYwdAXaFr?X2O7|1F~3|RfG`qRkB zKxXz3N^@>Ls}Ke%c4Qs;Y&oN?67=NeZhi`WsX81`NvNbEfUGJS{A*E%ZH#&!N_1~y zr=F8o>IOG7?bEpWs37TOJ772Lf_eXzWcj!w9Pf!u75;s>By~->CJMhJ`x(1)J?qBedLI|1UfbWr)99Dafu1 z-E9OoB|=n20wPBfva_3;A5R?WM8#&QU_POAG6Dj&@{m0Z!Wu!3`Pv{V96M-S|M8cQ zoh?Uq*Gn!{On=JU%h#tE`IWV5WDUf5VRV~sQ1kbucjoA1lu3}1j*fpG4jclhB}(nY z#f9@i7rJgi;Wf22L^3Js0|EzQc&otjw2AvgsCCBLZFbfwZkCTdDK)~-66sh>UhqFX z`(^P}h|J%Sws|AtiCZtUadykZze>mtle0?Z5>;y8*IB5E$IDHa*M?-*;Sd$mv!+(E zo;{{&7(LqBs)0c={ORb%0Bv-DoY?RI5rpt(o*Syg!)!)}(&^a+Nwhq9)nOEdPTz<& zn%L8<4I!#sPbw*>UQi86F*b6Xc!&(Ht(7H%vcDmW`Y^u?mV^i|&okpYM`CA^-8-5{ z-c{{meyl8Q-1D_Z6llpv=3?V=L)FE4)YIEv^q- z2#R#!bd<$tB)FySgKN_D~JN+UHaqMWaIpt`nU+?R{VZb0A#E}B{HA_ zX8JUsg>j{45dqmJ$LxzWZZ(5~sC?bbX_<*_4wI<3oIxcuJw#i+|K~R1qM5zg3VAWZ zsx3QQYThbL;w*?{@*oiwM=I4Kup@tM9oBHq5nF}k{( ztEooTa8f;vyps09RU&h77tyZ-o)PMR`jEsAG zz?s~V4~gnF-d^O^ep z4mX-07<`IiCIWcwQOo7@0B2uc3Il}I?P#A#$}=4w!Q4KCj7l56r0HDHwYJfuW(Dd; zdQWy^)mNu2UxdiDo(#P7bLvqnfLfGfg$%_eeCB*ey&OP#93nfH)Yd!NlD(W@ua+nV z$eCN?(#eo7{!4Wu2N;q`4;Dd2kcihq6%u_|7RNI5TR}xW(&?b-W|Vx{^!U>Gwn}?U zz4?rY7O8U_O<41Z^m&i`tBG&0G;dg0l1EQt(o{p|Kmc7oXvZdq`K5Pp{`@`CM_cMS zA!13rmPWJwraQ1BdXn8jiBAD5ankRY`UM`CNwAN&%d)QV?kjQxfuEEZ;5<%1Uq+(| zUEZdzG*IE;7QUYPB`(bjA}PoxSfz+el8cm=b6FfqiFpyx)zyW&S$)NLvF=h*5O`UV z3XVZRD#~Xp_Alf6;IM3fA=ToRnZuTg-4!X#N#hv}p2*#^q+(n?Rz~J@rzFZEMp6s? zG6&)^KaP> z%6uZl0p=!e+Rn-~7Ce3& zbc4cg@}zq8mlS?;>X}Z8w6w&!4n}tp-W7T6aL8){y*^^>ub^${`I%#ir@18CLlC_=MC$k zU_^W9pQ1jRMg48~uc^OfKP&#l;}-Anh;O^Xe!LcSDa!Y&_{BcU*13)MMm;4z(0S`q z`_m_`{w&uhdaEgvus$~Ar$tlwcLTQH#M$%08Md@{**JC(Aur7ouo*OAkUHuPR-$soQlOojGw&XCi*X>{@|4Yd%Di zck2N}OD)SffziQMP?n`^Mv>g0_I0TPMZB8x_4Oq6+G~=E=A~vbWU7XHb@#_CLl?;{ zr;Y6oNpJP7Y*|&fV?0f*umg@5p#GP9(Y&5s zyXIWV!{cWRoxGeci(#iWEcA5!B=M$rE4T5Qi;ntdL^Lu+KD3`YT?G4e`POKZVFA>> zvt!zIl=lS@v2Z(0ISFuXXEb*;He}H6?3%ujfrZUG5{e{9Df#Xpsv;5Sy~g#4PGhZo zgNDGl_Pv1p$Gb&RVJTTXz2O3DYwg*uJ%n}PIycG(m>KB3M{kWqyW=sjm8WJYC$+j9 zuASEmtkqpKhQf86^9W9CZ{y%vOwX;>P;ui6`fjXyHKc_34yJ*z92|;X7n>ldxxEzz zaso)zTO>19aC&Il{gFg1msFJyM_Xp2P<8_B?}qMa0|V2mZA8fsJb{T89rEadWj7vDZ3K0^}{$EtiioPa4AGReSn^>5re zKBSyLY%s$xjqHWy>${l&_%t7UlrBY0W!QTcGRnuG%oVJ5*<0$v_t~fFRO3HNokgpt zq(Y*pWho&(z7Em?ys?yUKLxFw`g(lI#%pLM4PD*-+Q7W;szQEweZsLGXzg5cN|Gx~ z9^oy%AQYWjofNYMVG;`OC|BHQ++6^asvuu^41AWv1HI~4{xa}JJAHlq_2|cig@y$K znu&6Vf_S;G)o_hJhq2dP8+HcrO9Pf+{y7gO|7{JQ#k!_zA{|CArYQ<8bLu~ITQsbN zY~{%C(8HlDSBSp8#oBCQ2ned+)G67U7FeDo2P_1wwabld)=61}rI(jO^G%qn-Tw0{ zRd0q8mB$0MLKv5OG~Ey|=TY+jM-vkh3x*a723#f2Mb(nI5#1}P zhZQ(3oLA?IIO42awZ z2R9fDab583O&_ZkdQ4sxv}ql+e!O65$UA?ZA!)FtX+{6($g;XcR zbukD=&+>x$1uD!eT4%xM*A|_^r|XtmJLg%2jXNG}_QXDv?h?IwBQ~*@Q~ zH+OccL6zZJ@1dcf&_n2j4-4Xzm>`-vgt>`BW=dHUkNHJ(1=oiSJ*0}Vr$jw>vss&> z1SCiSXjr|o+uYo|*N5COhG#TxMlu3+u6$y>De-$(q*xJCUfwcTQZZOn4OP7GPLOXM zvh#jm8@9g~USfo)LtO8pSw-`4I>tw$-HMJipP`n}TOq+d*Vlhy3#(sK^t`a}D45&k zobA_dpSndyGSAmrD2CAj6113!|Inu$tKCGcxlRCzAgfnd@Gv~OyL;9riE=F(xP#+i%3jXXU<~GuCeXE z=egXt-K+-k%YreXYbOIVmcfd2_E;J!FbmTHsVPhe4#lE!BhzqxbI0RYT6cFhIxDMD z$L?5cLa;{AO!O8WX1unDAFSlLa4J2WlMA-Fv=3o5YiMF47Cy)b5HHweEn zo-N47Y_FVrR=d+~JPy|U73l8hc<2;etLERgO}Qbgfp0b$4C=&QIudX?#M0U&vJA5C z{|y<-O`BglcR1hUFCJ8TRsZflFg(-gSo$U{TKjS30VVU_SD}mBEijNll_YKm?ce`i zR9Ois0NV~PaYtm5$!=|TTmlyPx`dM3Mg{I!hw=R|J9 zkA~BWcT+k`q{}BgEz7v(KO$PqIL%{_oNQ9`hg}N=&!OFGS<9y7rG;1t~J#R zQMqAixV3WsTC<49LSp&)_cUVJzE_N>URa>_U!t~lUK~iztXJH(s{r{h&0=FZNYjUQQ(vN>ncNnCt#JVfh9*zBT% zt4)hlD!SVy;+V>sNr1KITt#Z}R8CMHvnV6os!GXUgBA%!8mZ)_oQWVUjmpVU7u%W! zWQg1wCY6j}`GPGoJH3`qs;rxf!83zoGcz;i7KOVOH*FmdGV5nQ%`Gn(Sy%)F??ggw zG%`M@yPZU*1FaSgXTTSz-skcn`zHF534~(bt;VbaiJsr6QxYRty%$sNtB4i4&Ojc zc_(1oPt~iVDrm8=y}*zY(VOpNWgN@Rb{@XI939dA+MLgMa{F$~IX5c+qijokIxoYz zIHMt>YmTofi%+WcnH)5uK4>oXMV$;ntU8$Y`I&C7-swLlzw>-}Vv&S-Cw?_$1QYZ$a~MUZb3PX9hvkXf0*=%jzbin4Kxhzfm67Yz+;* z@XKFsaRt*e8!iIf6#nbaU67o|=dVJej8oK1EUnt2q6F{>#Ywo#!9nGemolg&IL44C0!z}O1}=lrdtr2%7EA?sG|rUiljsnZ39&CTH*M3E zXzN+u?TQ}y!Svb>3C*s9iLpO)*=A;TRl8nkMP3J?V{RH|HKkgtAWvs`+Ky2^t|&F7 z!tFWH!3LxNYX11p(3g$A7Ix^JtbIptc1Aea=5dZkL6S{ka`U_X#Q9)F$t06e)gJImAFu?X9!9=q>qC^=wOnDx$r zD^e!M@m%sL_3vJFR|mo7^K6XXIt6)NGsUl0mzfxruYTBx*)87J(GO@LglW<8^S!BE zCF;snU46WNG*8QH7T0JxOBP`rA0sqSiE8iCtn|xA?^)aQ?Zk@*k+ogR zL8)%?=$!%pmODPqNgAJ*TXTen;r615b&;Dy$oGp{c|*;^7O+eMqEG;EB^qOEM&_DsaEbiL7KRdbEa=%P+drF=^R!E#sEc7~U;pA5?M zUdTGxG$F#l$K-3<>d*_*YUbb%X?@lP=26{4|DI~YpKfX(Qy!hJGj@+feLo{Io?u;6 zA|qhsE+roA>RM^wEH)6GYw2FSP`mpxb?v8BZ9&PrmGAH59`vam#-+UqyxI@S0szPv zaef|Wd(ug~x(+ihbLrE#XY@Ynz&vanjUtpMPhwN zTjz`jz2=;{yIx5_T>l^*k-s!xYdb#bsDF)DH6i&V8cNcfUyFzeD!gwrl;S}?8Nq={ z%7a2Iu3%gAQr-e~&`S8eYpvif?rw1X?2?r7B1P4XxvTDuPs1ch+O~Eb*z^isxpS{1 zXRRmKUIeF{v#8iIIm9wZ%Fl6fm>!366=Tt_+xC2XZ4K zqxO0-p7*$ktT>k8J$g-NjR?WfDDfW@j-R1Dtd?mGmO)vdN>k~tH&CXFU+=j&1!>95_Seuio>>M= zrm#lfCAlo&j^UR04S#-9o6H_`yJ+6dMz8RkWY~PQZDnayg7zFbiKInOKd4?gCdakx zR^qOTp6}EjSj{-UH)Ei5LefvTEj#C|3fM&p+-UrI9xl?DZYc;HJ9_T~79lBmGp+Aa zeKpy0Hee`;#mZj~XTczf2wD7DfzpPj9%q*afxmceW)9~rT0ZQfKC>VJ33I+W5$Yrs zVWM-5H>+p6SJe55^TNyI*BO|5yR&A_#%CzWt|p@vgy&Oz=jl@L@9$M$;TwVG+7b}v z^hw>hTQQAF@f8mG!7Whzr@`_tsyIa6$}s0k#vnuQj5<>0yXr1Z+u)by(%K!tC0uTvrqP4#b5`xggJ|SXid18O*625rn%e_7C48Ch6=Th6iR4#}79T%N zd7snf^;xtPBTr~#mS8IQ8XX0SGDX^a5}Sqhd+!D>ry1CF1TLSfzORzGo|C*gFy3mC zE~>j+LfHsIDt+43+6xV|Wc}xXAHiD8_T8Z6`dK$9DP3;t@8lPvcl2wtCDt-wg4HW) zC(mPS$V)HiZ;RkJ5k*nxG;0GyWjfO=1)`ytm3QY8sUikc*a4pl>g)mu@V#=Q91C0Y zO>?G|n%Q-j6lqYVBcbI|X&ox6nkj?KPOBn`-E_^p1YY8NupVzLZJ?o8{Y@n|afqkt zfKGOMJ8iU&td&G3(`Uq?QeCQ$AmyW)gG`>@~nIbaj4`n zbaLCn6KM7ak2=r)ooLI!{r@9qhp$L^A{4@6v5p$W({wr{fWtrjEOwz=d7?`SSC`PZ zQ`o4N(>uJxW%~y=^W*|97X%OB7CcFYt90=2xO20;)K@$O+W0#-Y180y;Vwr6G#y(A zzPJuJ9gta|#LaTd^DgjQAAy=(rB1OczF06s5|s;Uknl^_NasJTP7zb>pewzs*C|UOTZevc9VR-eK~oS8+b@h z?CxJ!rhrO3?V-beu|%?l8ryf5_m$cQ1|V9lx48M&Ap5scqlCoaV~j=JezY7JhM+G3F<;y=$L|AN;8)oXfr&c-4;Y zNyBQ3P%W98y$rf``u_n~@1RZp(L_7!z<QG5;eRg0H!v_eks*s!OwVc{p;M0US(AvgK%Og%!4-YTN9<-i*z?B_n z(2t_YD-EOQ#ROmfE$4^6vYq;UbIXEVixf8r8RJ|WUafLbI4nphJTvorTA_!Utxa0@ z*M}elrv}7#fRKUS47)l_OO2=*)*OPlsUV1>S;AldTkL~W1nw@>hCptrrel|`XtLEU zdSDKY*ID%%bMuP^7RJ!ytpr$kgP&%Uikf`fIK9}{-#@RgR{7YcvsP7ght+X|5ou0QoY?*?xu`3BxjrE%sqMQOxg2|5wYnGe!MRs zSlXa~dH!KU;SBIcd4F$nU+2#>5Xpd{X7(yq@ zSSRGhK$NM93e#JAltEhrCS@mD?M702IsH`ZY1*8F*g*M!G|+3NQ=Y%|QBkpPpAu{J zsVYjHCmM*08&jLhs5&`zE<1MvxQwPef&E-yv+41}AZJwpp=4pC-(`f1MQpN^asGRD zcShB=u6A99Pa;03aMPZVUhS&%az zIAY7?aM7o8$C55nUjJae)-BNE7@RGaV<&o7R9RNIQ(1Pb05!NYK^JY?-X2_zg?X^k z(YCgF9=~cdo8e1G@0AcyckC#I|I+Dw#ZE){H0df8-CJ@h3Agz({oW&|OLDUIU3xVp z?9>1*KLJmm`hhhow(KoiRF~|#LAljAI3rUa{Pmuu?sa^a8VtWHN|acZ^Ish@_A zVgVGAr!361az{+`nr{n6YtQSx8p*nYFoyYi-(;0H2m{(xx_4)h)I%jyUwwJC0@m!> zm2&GvXD*(|Gj>3^p}wYMQg|i8M6x;EUNQyf*@H_>T4p&Z(JccDaC3K0qf02$dYj-9 zbN%x8cRh7+1hfs*vwm*+c8Nyvn#bUqcgYFwJk@-IR^7$(dz_xSC=Nuo@Zt+Yy$I~* zeaxR)-SY@tv!74GyuBwNb3%fIczOljH)+jO8#-#K^T5dEJ4h~$t)ucs>E=|#TbIhX zTTTet)}==m7T!%MMnbRVRmZ(6nn-JS=i#0k?=Y%YS-0`r;Zk>m<3zRvWE{CrnigTQ z;32#7U5W%C>`4?>$CTj7b5Er5B+I)_Z_a+Mc&UUfD%8rcW2rP$#Eq=38e9-ESSlBF zoNc*=b^yT@;M3H)_4xqP8FQ1F`})MtT-I@QZE&XC*4lDB%(W!RL9l>a=HTQJ^mMl- z$Fd(ZkMI69aFs}N!r?_ z4V11t)-e^9wdC2vz96S3*9Q2BqrJ&uxQ3+X#VLG*1wq2_`oQaMOxtAjZN_Fa%pa+r z)^P`15CRGn%4?{mZ$@i#>=BC{lku8~oz^e?ER&X4OxJe*NoGqsI27Zng;d9#iKRuH z9O}7-?JvUszpKFmW#WNbvcWV*#iRnkCFuHR9gr-cR>ZMhovZ8t3CEpL%$!hK_U>;M5SH2ahL9 zHFl4V;!F$n*ogU4fwuh%?LzRnERB!^SXOz%w<`~a#|%JpYhh#l?#|E_6`w_>yx54qi zJ$W8(@rOvPIWKz#99*~Z^{}EnXT94(-0do1dINU+y)*grMk}BAtdnJV4 zku1gJu%$T%2dg6YT9ML+4w%xzGj<(%Fd8ljg5RWZdnI;QMXL(;uL_)QKhqgG*tP@f z>edO`3Ee^y`;5wVjD|&HapBNJ&+5#+&54M@{Z7EMGbe=0RQ0*#@Y8e1$9Pn2bJ@zO% z@a-`QTf!dzhuwudnAzzpT5EX=@X^s7qe;~lz5qvh*T#k~Awwk*xx&YO#2%m6P2^6c zKoF7u-cYy!C+fFK4(Q^E`Iu`SY855%?{ND{S^ImKz3#?p7|G38y+k5CJ-s?J1Yvtx z@xq3nno5eG>zk?dIvYh#8gP1bOt49m(5aK%qD-!}^^CV0(;d5>`16Gz;Jxnz#xRk% z_JOa_;vd|5yUH>9d$fVj%|c_Rq`c&&CBOPwn#UO+`#kAl`E z222zozrI3S6z?gyxiuPL*LJr`Jtl9M;UwU7t6_{q;N2bEIoA~a$Opn)jm5Ds^abcd zI-tKm34Jq}z0#Lu-!6x&M#~|YFG0-t*;?`$^$kGqw6zYZe-1TNC_~?moD}_N%+DFh zXS?(M&wS?k_XU);^K{s)6S05q2>#< zp*UW8(QBl+1mnwyfz5eJ44i`u zl9JgkvFiM>YMf4t9S&`5J>_M?hVeVP{V@~`qWUEZ1xqn~qnqVG@76{hGEg0s57ny< zmKBre0iLa^ZYKr2OICGp_8l7=4rw*9vy;X7@>)x_7u;jl#$J(oX!jTN@_M>x3^y*Z zXw#>kxY7L2bjGaDiNAnwcnJu=2-?hrKfKu&Rqp5~`>9@Tw#z2E&W~EnF;4J4*YQJV z<2K8?j8Ek^R;t-$+Rf3IdRDd#ZK9x(@Hj)6OhlN5AnoTtm4G3@F1s}Pf%0<0&mT5R)yS9Yab8if zc`%gX4B^CJ7rSYkilHt}N9#I2t<$QPYs6^JYzi+d8o*$%;Ffc6Bq9KQTnC0P!`?+a zRl?yasptm1wEscfo5wYk<@=&^+by?6rTb_}p#o)rATlXokhxl_KxPY&c~F@Q^9*4~ zv~1ug0um;flA<6)W|;{PKqr81j3jQlDh+VUiatR_ul8;cR%O7mk<90 z$lh6dueH}&-`{s=5+kgCA!DKdL zeafLNku@Ei$f*hRqLOFwU!<=L)sTbQp`G-m07S(y=&tHJ-Yg) zp_UvwbQ*2kJoL+fL!!=Wu5jLjXTZX7*M!tW{cwA7FaBHrMHKd7c`aP z9Pvy9;^uC1PzTIy>@uv#9kC0A;0 zaP?>Ls}mp3chn({lG42WTl6d%vkH)i{#vnY)(kTZjYffmm+h>uZY}H$dZb8*26?RB ziTQv!yi6K)Gv8gXwY2OgNN+mQ()o-ST@DM~^vu3(92U3mgOdokvPRLnXcit|FZkRk-?PJAX50=P6+^WlJB{Q$1o_)c4YQW8ZtzOm7G5 z>T2H0dbN!e?}WD3ruUFj3-op1gV}16tLvVGM@WL1k1=Ts+8BwEc4WkBkwCZ=iCLsm zgkB1uk>6F$xYbyiX;i*OmXVTs2hm!V_1U&tn~#IVeK#ikl4h!9L0%3GjnhtQORVce zDWR-wfFuK8ThOF5=Kii=z!V^fUc2@Hv$A@<_nZQop6sKF{hTvgZDeOp$=K@%_jgpT z@3>P4$~gz2kCvT}f(7#@uK@*DR)%8Ifh7+KsF>Zk%|x#S7}M(Tn21wm%R$b3#7wt7 zU12B^&6l4R!xw8(OKNDGQH14_qkOH9txM)r8pu~=X7bRra5ssLj@4&cS*Bs-Se4~0 zK&6~!JJMhn))u{xwrwo8@!71X{pj%MjJOn)bF@{7hk-JZ&B`t`pdDOslSVfrgbzpJ z8S_;44by%6qQ+~8cevsinqPe8Kb4}V-%rk_?|m}2%Nc{4PT`9M^Fx>6#}odp?#Lh( zJJAf4Rk`@aI|iziW59*W46KfzY(;3-*C!?a;a|S9^aEHrS*$q-J2O1isg#-PLRjd@ zD#7Z^Fq|)n;mR81f~s6vDLA}>*v79Ml%k?~UCrU+rkcg^Y@dtS8O>Mfqqm_XP1j?j zpc+651{5{2L`#Yv;s*y~;7;X@z-GqU)LGfp-K8~#-$c!9kh=Fa9_gu^!dD66(PG*8 z!X4?I5kxxcXBPr0s~Mi^6Z)&y+7?ik51(H7tO5FpX|y2UaY^E)h;b%f2>!KlpF32IkUMl(vPbmE22L5_ZeCHDH%x7c+adEsf{ zK>^AZfL*3ZRd&GLnWyro`_&02`8D&NC)8j`aL-^cU{L4j?W+xvhUE?1H@+w-PB1&l zYM7?APC6;chnGa-{+RW(FuP>*w%WE;YZSl-lm-SpJ0`RselO5#V3)S)w`Pv6R-x!W z|FL4Ntn}?3CGFn|rhfYwXC!Uk9MEY}i_uDOvD^(zwx{@(X~1`L#YVKk)^Js1C-~E= zDKb;i31#G~CPm?EM+({clsu%Sng+{#)~sVw2jAS@0Pw(WRd>`Rj8tvk0^pJ9NW)Fh zpQj!u^;`~u#O9A!E6QGL^q=14q-i!kjn$&Ds+jlZKULkB$0hrKwBnVM%__syhFlq3$=C$gR{`V%fTP`C1)I^PA`)+8!4-yGDio_X-PCtK%F zxN5(StEO?BXKvRR9qMl!Zn@&0WGk%nuQ?XDo8G258=1gq?1W0RbW+fz(kbu7)zz1p ztoVedc_IUooT{Sk$zDOFm=Wkm{3ndX&$j`n?OR*azE!*0sK)yHc=ba?nG`2qXHtd9 z$TNTDR%%p;bmwfIk)qnN2-1SL2y0jWt>yIcrA!(HLe*BCUnWO|Z6DhDTi$IP4Rn;L zL*N>nMqGxfLPnJ${R1@}fj#`3dFWZ1m_6Y63AFoe`e}6CE32r-p?4Lu+w`Y@`W@^c`|kC}F16R6yNn7x=5_r0 zzyIOKGk&YT!Bxxyp42J*SbWFvyQg>66MFvrhrgl5i&TsXz=@`pz*jbN-9F1F{zy{A zpU<8A%?Fee@@dgvTEt9Ee&99#p*ClmE%Zwd5Vd~DMeJYyOWgsP=@_k*;c*EP8LX5- zy=t*fIl~F=``xElz&NpOc~R&oc&N{v4LdQGj7qyNKLZ4E24k{mgP$mW8@zDAgz@@H zJStSHsxe`xkSgvw{l37$t4jV5x>8G4l4r)=ajf>llx144yq4-Qd)2t`;(A!w3exVqFd&?qC(ws>faxKzI7`4X!cIjzEZQXYNT5tS{vZm)Q*X2sokjnrD zld$wLbg$6`diH{e@5DG1*BjcZeYLK&p}@rvR+jm+=&ngvUb4l&U}zIk#_e`9y3B3> zBckKi?tpn)DD0=8TPeq5N178V9TsU?`v^rw9pT5*q+iK!R7 z!jB%tOr0xJCN7UIHP<&WgD>uKS!Xb2XSyN&8!K-vT=aqbs!4l#qs(n+_5MvV>*3kf zb0$tBVc{}jXVYj2XpYUwn%REG({m~0N?UrE_nwPgerNV2+1J@RT7nbF%{)g|Bo+>a(_X)l+KcyHClnQhp6yLtUimby3;8wkzCg-xNh{|F zvhfg7L0yuYoH8DDQ7o0u8bUgo?|U%7@0GowzKSX}vX~uxADVwJI@@~E-Lh=7pmfq# z*}M?v6sAQRF?O$SeK=t46!wAPArTGe=7ofs|8%lp-guU9-!QvW4%F6~z3XI{=QK4E z@#ROvgm!QHyN>i?$E&$ROC+nCc){-L)nyT-74dlagp~nv3n|>(YRm}t@nD*MPEKM> z^Zn;z?(GWFDuw2Kqv4iTsh-{edSGA6G7s2A$?+>z{wsw3ot1SYVsMCC_6A?+dTvAA zi~4aH1Z|N+Nmz(Zg+1f4ZTm`9NBFc#w0u>7tJXc$Ji13;WO#|czf}J~P9Es4R-ss8 zX!SGq^G(S2z6jTdM9l2&6!ZYOCHQC-8&xXv5m=MDsbu0e|p_&W*0tdSja9ytun;s?y; zQ21L+=BgX3I6)Dub=bBazj^4ij(e3ca3DewH()U;H5k@aMQ{)XbcK|G*S>})K|0$0u= zrQW|qykhT+w!LW^?hRGGBI@1HsUp$5o^%}TtbhGv5Vs^WW*(|Otd9Cd%Cfe?;LNV_ zFH<%iu`y>S*IbWlA?shI9(4IVA5Io8#y-UGa*Q0yGzeQEXqnI|0}*p#0)6~87=0=v zIes^O^PdaoZU3T+$@v$i#=m%py8eqU#_R;@JwBjN&ZNWu*cV4 z=zWqYDipsJiiyim5UdG=Hck!IyCjO7s=UEq@LH#Wf`X%~>kNmp=y+)tHkrKnI=e_=YkHKISew_ z>-DAa7xP=aYaPsiAHXw!GCnv6M8lZUmzM!6{R|-a1Be+3NKli292X>`a)1sjIF3*k zqtZdK6gd9k;v&1)fK#lyJp=+&Uw}bKbWCh))OFbL2d3GlHzm>pH~|a>1MKWs_#h|< z@UhnlU3!puT??L-l@*h7%m$eL(`h%*`~kp>1UVORi`S_Ag3H6>@qm_5+7tyRpF4YM zJJs^ytgtYUIyz8=w67p*+aL2_rXPGgibHH{tRNO;cX#)?R%ppAP4HnM&9}!?1fedA z&$F|LWkjqpu);xGA*-W~t4CcIPJ2~w2B0?*Aku(%ZCClYm$&@=v^jyl0l@=+rw{Wu z0OR?!(;hn~3v>(I>Z)%!*%x~frx7T0GJ>AxKZ}S^2bvA^gs(^Y!+#vj6eS2+h&c($ znf~r;0|tOx7dv}<8|9oe*JG|p@XOQDF#RX8uR0*0G68x4=kRdN_4slJzg(|6E#pMJ z1cF5>tE=hxRIWD=%Yi*9UOZ{> zTvHR!CBv2pv}sHjgqCH`TCsv@3lv?hYY;Xq2c)BuPbQOfIbVv!#l=J7j<5do&97aa zAPPG`3Njy30O4S=%z%Kd15^zJMGeg=1g=oq3aMWxNU<1@PSb_Y z&(DWPMNu2H1-JV-=d`l~UW2jZUKPHG__Iud+o{8Uh9JRZXAI1DT;Escy|BuU2H z0%T2Nz~ch}^dx|?%UnG=hO4HKC*3`G3UGAdYw_2S7Bs-9<3~WRRaaYEyLf9GpgdL) zvTNE|gQ49 zI{Ewjj@g?hzm`AghsST8|8JQq{!1sO|DT>r$}A%CR$<{8Eo^9&y?toRub@K1`mzoB zZvd(115nkeZ;LsR9SDu93wl(StN%^3a16+)EJ|Xx{@!p7?-lLzK?vO1^MZRgx6!DI z#GocGv}`>sJ!}KTMJ}G5j@4B14uq;V$DH`P3kB;OPx7lwynUFr=Xcl{*Om2EOXl1& zf-;i$%xbJDc#-`kJgPJ*ZvJ(04rqp&TkWx}V^ksHqpB*XUQ~w*N+7{9Xa%umx6XS8 z@D4e*{))!NxY!RMU_b&p3j&Msk8Q2^b!=X1Ys`qITHZvDsMM3nz){w`G*T=K8guVR z4>;+%X%zLLEJ0;?J=i|RNV$1?x_@H6I(!dF$dXI4H;NTV*(9vIJ#K#0METga#vX!n zp&GcH<`260^RwvCRpUnPm(fd1MrYU^A7!^ij=+&x)aNObb}8|mN@-|}TKAdw6%5x+ z^g3=Ofzb!AS>pa4d^V7-1qCyP=n7m-Pg!o4)bMAoL8*!;&{SLQ5)Cwa+h8$Izrcb%+F`S)k-ioO_b^D zwP=<MvFWpp5C6`vIBBFH zYseynHk$4M=25~qQM<>FSzw+?GZNJ6-d8kV;WN2gFmQjdoTcYM=v+;4fpwLEmAPFF zY)jpB2$$i*DyF<-cW=FDSY|2djI`|i*xQQ^``~wrk&t~kUj(ow2E;ER&hLWQL!NGK zQ#n4CX(ct8G7>A#%(7#V_?@ArF-cQ3PU^TzE3gII?4~rmL+6#aJuFf~H|Beo#%y7) zLQMt1XLTrTgwvRzb@w5Zxtp4rnd}EyD9cUz91)g37%r>gzcjoo7h1V|`t}#q)>y6ccEMJtN zR!F60PPtiMn4crCK@+=8-VqbA$Di;)pXVQYn7yy)WD{%XLHirH7c9aZS1_Nadk@1M z4rj~JD=W(Axk|;w)5w(?;Y$zq_gt^oY&^3d*w!@+ zBNyyyMd^OTG?(J!FQ(o=Fl;l-q$&kp1-86-E$83fOJK2(;0;@Zqyz5bidGX zlc{1_;UXT$A{?!=tCIb?Px%!pm=~Y7a(ak<1Mzrymt2&B8mv9qwJLAdsal((ZF0`S z0^HwI>Dv6a<(P7^j9CVxefw(scl!ZxKZxP(zeeHw0!uJA9Q^{!%EIyY=!fM3*!})? zmWs<_ZrlTMmhZ^t$dt8w>u09EWM2)qpYTr^w)PbGq;)C`1L~`ZX?*7!aM+WOsjWQ{ z^5{;zmWX|IXKew173Jo_)NvJljx|_=eOCHz0xQ@O2}EK61%f`PX2yj8t>9<(h&#;l zPc_^y7F`>W%h*xHFX(<3VXCl z#oAgK>g~d#8~u#DSrN4joq`;r)|!h+8fwdD@&lmP6G|^zTSOcUicy+dAGlGCG$@*p zvvm#+eEl%3kfj(3CF6b(tyQZx@xIN-=j>vY3+Oo7?|{)Gw6g0G2Xm=z0F!$*N|0 zhS$cQFN)(ZI{N|i^<}1*f>>RvN68H!^2ar{W@<4zD?!m8Io_fIP`4@(NZdl|ntfYt>)#SWl@&M4BeDl+4U{XYQP5@3%qbGR*Bp?dt|rr1DEb|$IyBGE%+bNG zqnB4BwaR^Lre*JFwf&-7e6{29pt-fHy&ac}Iew1SigBB|C(Ua~IJWm6 zCC4-P#vL3gOp_n^uQ27pH?Du1s_UFC$YqzA7pi#uI$e-LHudhc^aA&_XJ5Y;cMD`? zLF*5`k#vZY_f`_|kyUjB6JA^rCP5*-A?}k`y;Whp-)|>usG;9l8_T0!%mUq@024GvVcL5nUu3vxbp4X0%gp<7=uG3%tZ60MpfIz*eOEqYTeWg6ssgG^%= ztAk_e)t*RLrbt7DfBp!kO~aaxlFP% zr@I&8*jY{C-}pJ|8|1$#GxeQ{!~}C3=ye9PJ!_|Ycq0mw>-g-!%EP`sok_`)Ya6I4 zSjYTIm}HUB{GWKUNM3S*w*EUC@Zd`ctX6pVcOWaPfc!B)aV-|6=8>zv_oHQ%99}eX zY52t@tx2_awG7ada3~8!H#fIjPADp?MBNYom^%v~@h`p**wZ4p?&7TLQU)2)R`?Py zwWy##@D zV+i3U?5e3XqvGZU-bnEx6TO?L^*8m3RZw^Ia?4gc#9dsi@}$h!!^^CZhs?u|qnAmV zp=xH*8M$$svJwa^wL>laY0*u+MW!pvH&V4vcFfujh#M{|II@CHM|;W(8zXUpxczbE?Z^d6&9fGWl-Rzp)$ zbItWn&8cJVHT2!F3ILy(yz1;0Xxd|IxLVq$l1ebe%i zyO~rY2q3m{jdH8nvzv`x#Orc5mjjI)g{J>hgKf%9NQesMAH`ZLyKe#ZFaLxg>d($k zG&d)_+1Jm)um%bw0$ksfM%t`9Xn8yhDSq83?m|JJ8OKCre{d+f1_l5S5&g zvJ^{=)d4(c+}W>rSGuYMOf^E(?4kZlPDg|0{*3+dFG4L!+&N+9lAOWBkfG>I2C%(F z#N?c5#xkM%jP_kSR*%XC-lv*xZ~xcMlR(YmZnge@g@)}>+JJw0?sxkXkNeqJLL3o) zvwQa>5Ew9ld+^U$!~gXV+;qCPkIyzxa?<&auO#%mZRmJe+6In{)ByZvCdSA6dwY#e z!3&^0bIJe_y-VUr?05A5CMV!@`udhfIi8F%fC%OV%$qG$t_p84fXVFXCKLE$mn)zi zdp-sK;Z({4K&`(WLs@Z`VOwJSpqQ8#7Lm_3Aoc)q_KptTix)${uG}!`BIDb&_4R2^ z?F_)`Z0dCfV2r9QAeS*P1*r=O_2XvQyG>lB;?XZ;Qj_F@CvJz}wxmPSg; z&qyi1QJ)l@El><-?4Xd!cHhPa@pwv|X;W;FZ;EJVZz0!@5$LjL$$jIrxC&4)iSO0* z53onZ{4YNMMB}P<9)}uubTDAW)2OI`<&Oa=0qZH6lw+5PU>)q1Pcl{! z!0QD2>urJ#Gw$)7`r6vNSS(hjw___M$R#WgfMT7ndk55@62c~eULyGkcDDR0^qZWL2ysNkBkpXl@vvUwTewu*%*)Q%u zePhYpFKSWn_tC5NH6c1MqpGcsOa>6Rn?a1;PHm&Uj!{z~Fw-ki}`}spKcgd?*_PUQBWbQ?Cb1#g$*a+}Zk;GZ-KBd@p z?jn%d-H|OLe_20b2GTg`3|PBp0?}1SvqmSNeikl(6@i8?F`B6ztJgvSm`z{<^Rw5P z4bvhgQJ;cbam- zKosPOqN1b?q03Vr7_S6T{t`DOYdcp`+#CiZLuu=f0H5F4 z7xQn3%5=Id_b;x%W*f0_9^qIPbyLc{5k5Ryy^P89){hY|^NTKqI2H zZL&%ja}NYd(t_{9e@bymP2Xc~p!ipDDuVtn0Ttp1?qyZ@Jwo3b35&RjgN&9Kq zpnhu_Hs`*UVfTzHRasj&wx}$$dl0YpfpR= z>CuA)6_AHgCjdYVTA>hNgC1i5g++ZSwEEn88vjgtEcU5yXT+_oF66$sc*1-7mf?&%m6O*S;EF16I?nz zF8s*RZVOxIeiMtK4{vKiRZL=IVyEhW#o0C-z?Y6+(?-YB;oL^Uod`v;v9PLI%q_g* z!1SntrG!>CJ;(yhACaFk+Mn|hSXNcCXECHNj*_#2#flJw`BINS`#dR;Bp%g2v4++M6x!e zen|%3)q6_^VzT1c95m?QQ|KfzPIl24KuxqWwzj0jU379u-4fs-pl~CF zD)RVFr|E-gzVyq!`iESnM9ViNRUt}dKIpKe{!lwVhE%{M%>Wgqd=?H|g{OV89ccS~=YjHIV7Q|dMkJe6(BS5(|yKWY;7jEkH4iD6u?%8!;+ z5GlKuY3<-VFc@Pvd2t8uXUfOzrB;W#H#*!%OMT=0>!S5iO|jAiGaz(}c0YS0E7i8X zsR^MbM&kY*Gb95(0mGH^obb3|-cVozwE^1MN{!oCTm0+41 zq%&LZfeJ+$LsL7V72|UP$A6y9NhJ4$aX%T4cU#QhP#9EG=2h>y_7-@i!P9@ca@ti^ ze+PoSe{gNkbAlRF=Cq5w_J5CZ!p>sIc(AfsiCu-4w8`t4l_~1mu)af(8dNqbE5*;9 zGMc`T%6NtARnydzBm3$T$fyLt3vg0olBfS)LL_r z@)S-2T&{$w%PeWlZrm-wG(x7{Bts%ri~&?&qI2;{b4hzAqj+P1&hT18;K6|pD0XA| zZdIpW^r5geV008Q>~PEFZt!kFauzAK0IHRhK&z}8vu@*lqSR7)b}Zu*P#}O)67&5_ z&>~oApSC&Ny&@mb_M}MOzA~~WG~sf7K77!WqEYQ?1_#PTrP+Y3lRorY@~*ATxb|Rd z>^DjY_v_s792G27FU%OK5N3}Z&)iLsxn`nd;^EQVG)A$hlD&Y(+cP>pyFBPVwA!Ie z;+kSL)MOh)`%m1?1jUjE05UkSgY6~jNkcp;F=?f~IdF(+W!178Rb~B4jTl)Bt zi7Y?*Lvxj#pN@3eF)*-O-kWv}<4`4Qk)Y;U(*hXaf-TwX46RWpE%^f27rR4E^lWTJ z`0sunU|RHc6o5r!bw1@@TWb^*!@0m}D!$lV+%8?Gv6LztYk*_8bHFD6hR}28L?HS1 zx$_86tCK=WpCRs)7CW?LzHk{}4GQ=CB`k};C`n_L`O$@g2Zx&+{9Q`C@DsHsF0XSPb0I39{GYd zzLPbA`H;$}kS*Hn(#P zn%`~oO_Cl0<}0HPZf^L)3peZu-f_P2s3TgYDIQ#2MgKI4sZ`IgQI7xp&)3>ibz|#Yo;hR#vTuuCskW4GuDu_i}eO^uCf^SFqomE+H&z zjgY_{qz^AW3^Gmd&0eE%yGA&c8(#t#M`)vt8g`8K3)z04<7$iKVSxn$!%SEyj zQR>1|)w=(FEUN+rS)ePhJ_D{%?P2a4DM{SHs12LtpmYHrumWX0bGt4{vSe9e3OGRUQhGy#Zr-xn^~uOL>?HeJqRXhDED!)zOyq90w>RsCC1vU;){FDVXw?j3<@J`RGG>ptriItSsBLPYqeWGbIx5uN z^38SA{iejXj5E>@Z-^qg_be!f5}t-2JgdEn;sG=tAo?jc_YJlkfC&XuD{KAWFC)YA z37Ks;@ICz;HtogvOy#lhoJ(>UTVkak=+cy9&@+6;hM~B)Z~xr*UcXoD#S{bN>bR{D zr?X&J4b@nsAPm?}$E`cq1+BWlJ*Bh4vPPX^!{*ARiKl&Oj?(A@STWYm{uI0xeYEQ< zSl4G~?|b|Whf6856S%B8I*;$A@QUur-vD5Y_U(w)+1cZPN8^n7%D!wyT)Xoc3$IVlB40F{LA3=B4yD#)0`uHM&+INt9`| zD?s+kqV6JpH@aQy;$oC^4C4q^EQOwb07Tvk6+9j0}fI>&7DU{>>NI;bF}TeP!nVuuUT`o z?fS9&^4KN>ZCN;&VWpq@QdqR~;jPi4{{V#z1;~ORK_+cmif4$L^%DAk2ZX|a95W0* zCJ<#d&&DX2gz~s-%wy!gf8_!IdrxVgaqYRZ)7vm@E7%R%B_{GhB%udk04DN0ptY?H zKqH{!1K@a2nmzPp=hn5(^zI~4bbUR@;AkbEy<$aWeqblN%f#+?WO!Nuc~P;EF8mcM z&61*z{JPW5&@4u!0hRPfa^oL!bNX_!p>V7C@*4wmRPB;IOdX(62&A(|vF%5DI^ck# zMlPp@U#Pu)`r*07WBx>Bk1!B-vjZq`Yv^Yz^{K4hYX)t9_~vxwI30al%9R5c1?g5W z4yjY^?TIUuP_X7P(Mvy_3WNd;G5I{E$cdm*Na%PIckmB^mh#urnmy3#RR1S>-SMLS zJsMfVzXRKzL{i$$w|J<}@H?06r4Fd8u4hl1Fs&xIv@;r1i|+Uo$lMq(Mos5ZZCqiX zd}ha^6AlmXuXCk9B+^`UGk_dThY&6$mR0*m7)0A~DpB+va(0jzfVdam(*$O8>>W`tsLml;Dr=z8Bo#uP>W_*?|A&lSNNm^qT6NeMixOW*efh`q_n1 z+(R|~nx43R-`|7*ow^!dg-V>OB`TybOb_k(-|L9B_oN6T`&q=J!|TI56_i9ekhBbeM(f9?brx(9E%DEobgV66 zJO@iIiT5>y9KM#a+Q&*EKL_7CBYNav6vhsJ^tGu{roeUIv>a70jUSfAtO*;6vpErE z1|jngIg(dR=JQlat2UnD`qTD3aZ!6-o4NL(o2YJimq_qrV4J*OM=02rpvLnMEs0>@ z9N9?zn4)`dWfcpz{)G+QfGx1ER}xHTe*4KWV(KP(S{wSGbG`l)TFVh$qD?L$r6R!jJgi^RUuv`=>V*@5HPjG*mZ_f?1b2C_; zrsBR>k+x!CITgGw72xPEhZB1TDq(Y|lJK5irrQ^iSK6VL@NV&zDCbtm=o@623WMgm zCe|EQzyy}_rP~(41IK9aUH3L(wX*I9W)^{CSQQu{iF zC{Hzi51Y3X#Ofg)S-^8K^RP~Na;)S~zfvc%5Ei^rVoc?u^TVdjggGnQD3aho)?k)7U+N=(kS`B+hH5C42qc`JF<6iq=$!22o8ZtuSN)4 zw=clV#^eYQ9flKoRh|8%NOy#@PSC&tyI!@GiJk}@>o_k5&i!0p$_Y)Z$ngdnn_XQd z624qYqgCT!g&VEZq0}k5*Q`3yirMPfGYKni9sE3?u6!uTh4jv{ttErZ>Ohs$>FYdb;vnx13W3dY7fTeoR@4?U!+&h zWYOsC0o#AQRTs7TjI$AYCrTHTy*eFL=dp;JXpD^2SZ|YYUu)5FwI3oJ5R>ZSx7~f% zAdiViW(3&b^E-7|=90VKyLlC!TTGC`&D<<&d6V9{*zUc`qeC-RBca9{&vg{%eUx5t zY||^IZuE23h+IYV`&94cNnvZ4tC{v#ynYXG=4PnDlqNUAln;SqlktO(nrGk$?jvo< z78yU@YBJcw`n_H&Y4w1VR$q(!VjZ)RGeJ2#3XfY0j^wUH^nI#3967=Z z*GC1~v{GCPdndHw+ARZ$T{!{>F0MW^g2e z`e44=0H;T8@^@{%g&Hyq*;qfXyLD6vJwS_dU*?a5|Hj{5iH%ch9CJl#6an?d^cXN#>A22($=YfAZB!k`aK z+R~-4P~~1&yXMp$e(=Itpvf5Xy2u6S)4yM3!D!jD!vlpi{uadES4h}h>9ixXe@v)M z))XD(P-$^AJs~esR;VMl8xa&K!JCzaY@#^RY#)YW>vtx~R-|tRHkn5eP4Ua@25Jb{ z=wds3)oaXq#X^es={m!PxAR-QEk87JW}ol1^Sa634W{_)9gfuSUbdL;>%$>{|7^)x zn)Q!a2o7}EPYJhjNMm^=h2b=%%$TCpmPFl)&n4wBZFrMr~ee@wZ#5BP(Zf8@=Dq?dW{mnPZ#Dz6k=F)gDzOR1n{C<0x25K_5 z%udvYTY1#0y16I@XQzPk?>(#4r?CfK_&{?FP4WU;wM7t9`8vGE_DyR)QS z_=ag-IGDts4e^av1E=?uLXgD!I2*6^VC$B9JsI7Rjbg~Um-9t($o|qpX!eWvVsVLB zY4W02HKfAP&CE-20CdD=Epx1}?O%e+P3ZBfA`@Fa+hKeP76a=>dfCit)<^esL3UpF$>jnfA|Zj}VDl&z&t$Wvs=wOeoGv>?5jOqhCE$J-11 z?Oy+TwAGtsw#3kF@MS+MZ4TFkDRGVXOkL}sYfsG}c$L;VT>O{eK?m!1&as1S$`pd- z4RoS`S(u*{SSKpSd&Pb=j8B&%xjVkw`}ATxhMP4y6CE%Z>8-1VCTr{jJv0 z2FivxUlc)HI8Xb5(Kn*?M655J$@Q|^>B!3_( zRCH+QHbB?oPH}zC|dKi6fll_L+4)UP4Iqy=3CRItt1BztMQualP+`HDhr3kf2@7z z4Ij2w)do}p;Dgbi(k2d0m-GA5%-=+hjtnGqjE>%?cN)AsgVDw5)L7cgtb5G=Zm-In zzLv3}lP9BFuv%j49x#|}3Xt0o^OF#;L-2_4j7i&lS(6aAN!}d2vX!24-aspK;mewd z@2XA5_gb63*Jt?R4^--xa|a^65vjN7A0IB%vAS3AQ4Wc0mmE`k;JTZ$q65|gma;i7 za(qL{XqEWwpG8a>wIPT^E232yC+@6!xgI`@(ou+4B{~+}Q5cwiW93qk#|FEqfrOFb z7M9f>AKOR8d~TNEAKAOWbwQaghF?ib66Vt6YH(AU+oQoj@XRY-D?UD6n?>;}haU|} zLw~ZFtclC9Io;TH{rMAsHEvc9nc^%`uP>sB0ERskazdU%DvFp z;I2;A86usBz)rY7Fb(p^&a-OvW`AQiF}nT3YWWzNQRlgn8$S_A-Oh;gQ*@0q@!j6u zG2q2bc0_~Ec@WXCHABcIMkY)yynUUec7>;Ww66!}P4;G5XCzt;nRN$r=I2ZCDyDbw z!m4r3HiJ2M%U(D9N3>`OtBmNwM*H||>hN#Iv!e&?Gp+6O-{^0XraObYuiA|wTXEiS zPs=ORJp-@9$-a?BsGW8v6k_U8<2l!*=HfpSnHr}GxsLb+1 zVAazx)V2aI2{swDr_kxCYjxZCX(eI13XZ(2G*nTfU9Wr0O+%~H()lJLx=PvcV0Vqg z(iAQAVHgg)t{^!aIweXTw)w{{jCu?aXV%r+?#fMUc{b^WgR==%=fYHopIRMFyiqiT zWNQuun11PvYLSYj-IuFQA}@eBX&gXYy4q~R@MLhV&O71l+6H$J+n~xqp(9Vnoda!x zZO{6b6UZC^P4 zJQBpwfg4TX4+MZGTQzkw4Bj2OU$yd8vF!dWjYgqrar}EG9mQLLc|K-?{N|BQ>0X@~ zsdXWH8q(@9l$IM6AFELlE2HNuWwtMsDi;O=1vJOsjiTtkZ9J3>uWVDkHipe>Ytn~* z!(aGVvIkdlslVk)4IC(KBwBuP$iKN3WVO{{Tu1BZwCoF89GJEqL}Im^b*c%UE*;T5 zSMu^z!^fm2cB&Wy(`jCKWSsPF&!pl+^bU_9st4b|*OWTFH<{u78H{0I$5lXO>>aVX zkco^s(48w1)TR~1;}-cdF)HyGnSeE@!L_y2j^#Wn z*ZiIwy<7${Ua>-7$LE~g=`#a-wL(2xljpcw3&~mS2TyNq)5(Zu*CeY=P^zFD zcQ^brCdsOSzaUo3UXok(p;YFQe!jhV1IXV|kuiDQL%N=&_xDClj9bhKGIW>RsqPiV zFK3Ce(e`^KYWq8}daT*W`VP4$-LQa-!(^h>f3pd#zAbv>r4JjMuRK)Yt1^OoL?~gQ zx2AZz+5TX7^D! zZukPN&UBn|+tQKzMWK5&M_-JSwpS|#8pjAj#s-`#1`mYV%@!927Sp5%Z^VHqY?AuN zdj^0$4WNe&Q%Ug~VfC!^H1n{(3&nk>d$e;6vVoDtum+P=VLV_>b}?@5Xfr7ZkSPuL z=z|o*+_{t^%m+3g>)d>?<0M!Wc?Qbw+DHzX_aeD%>v8mjhIrJLM8dH(7;uT_?$fOF z{vbq%5{6~(Vu|Q24%_iwr$$11_I#408L>NwG#(N#XrnRgkjS4W+ah${24Jm9L-Atu zEE3e^6fAh&+#NJ2I7nkoNzrEg`ZTxxdK_4nJY){$(ZFk5BfI#ck+OU=YkLQ}U9{|z?x|IL$i3IE__?~|9G_`1$0aQ3d?hJL+^v4T4DTzsuT{E;w7f5z); zTbTka*xVmMh;$wzT-g;4%#aPrj@cU$XC^x9rK`+h>-i2f=@K~7^mMMP9P+{}HH$*` zn$XY<=}+I;kMwekb#}^kCQ&*RUG)I{k#2%kyMil2q3-Ahb>Su|9PoZr(~R<5E+S1+ zC$n$jT1Tb~SjvV4Nva<_JX*6=@bD&zT5}UB9ugIK-ZJjjt@F$cljXXbV7~y%FhA#P zMaF}D!chiYxdi^PaE%nQz|Ka;_H|vB%0E@>2uWS6F9m?-=leD&n4w+eh81Js(Zu*n z=Ey-Xr>TZ0acFF#nLnFk`-BcBj%UeYj1kpVPGP4@`NP zT^|T)`m{c86?|JqE&NVT6U~t{`nL7Fj}Ormg9epR8}A16$N(4wCenU2$UOt0enH+= z)H^!ZD$xuzYJNSQSXwFNT0rxQsV{dJ*sQi#!JricpsUY7d(;Q-)7!K;FW8E>{9sh) z=j?8D&E9Lf*9-gru7)ZrdpGQChh`R@*ZQE8zn8k47_?s+J5c*qFB>fyXKQ+-_9nJ% zid0|n4zk<#DYb_)IyTk`;m>9J$As%Dt!-FF9S*(08hwK}8{ZCf1&>fNZH*E^d5Mah5hjD%aL*@sg8}IC z&K6pQQBkyLqXyu66=4Z})L_@cy2oH#?L+$Ap3uOS z^0yuH%?3-Gb2j2iYF;6JA=a@L5ECa;ss(lSqo>JQE>kM{wy=nWkCp2Uef4EBD{od+VUMx?o?F7(}oHf=dV%+?|0065Ij=w_t-i3{D6E zLU0BfGz1I5f;$8c9tH~@oWTYkY~XFa$ocZ>ocr#rx^?QkS9gj(*fXoaLsXydZJCC)P;+9n9Cp;p;3 zJEri#A5bK<;wQ=R?c-&@7q#+X9tja39{M&6^u~S-%f?OP^glIX_#T zKgz0%q97{-ykpUkZdsaE9y%tLxV0=n#_m z+GQ0iOHdIaD`&Z&{S=Dst*s?(kYP{M7$awYbR@wW!XvnOobI-*(&KPHrjK!ilp?>rqaW ziGPoPh`EE2g=$lflaT93^Zq7`;*f&+d#eB7gx(0;{X-#8gJ)!?3sn`b_6gU_p*%Jy zD5#720F39FHm*WNNg{8#^U0+WfI1lR!on68W!By>_P5aMYd6(%nFKHv{!=^!xE+W7 zjejP?TABOtyp3T4z5aBd%gjWqsu|rik*dW(IU1&h@iHwtS(CZ6sU}O!ZV0=QWS>RQ zi9mL)Jug(4e>&|&=xOO;QNIm^F6^+wn7I`_-iW9pZLoTw!7kLeWF|>Qe%s@-y}VmF ztFjsw6CZDOV?8%yX4_)a4U$!RHp*)EN!hVJMzS@4R7STpfv+KR#il^{Bz>(XExMz8 zRFkJ3tm#>Woh3}OraeBCoaTR0&dZn8Sj10C`4ue^tY%Tm7Y-)<&885%?5FVKHFvSC zKEGdGY#N&`yup~2i7#jKaBE6?qkE$H7Ug<^*+R$QRE3$EhPR`ns%}Ei?!3!1V2u~f zh&Z;fj#u-w+a{Nq=|Y5YBj~elFwK5u*AmR}aM13d z4F@2)%{u;UuOW+1ffK_36VK^XM7UE_R?=>|nw=J6D~n1%4rpcY-|5~2n${*7cLotO z+|E8x$8uXtJH<0CPa>4N10ODBPOh8aK~nbrW^NMKk^;H+Lfq5O9M0W$+T{$qOJY3s ztdz@f@W!%KVXz*KV)L!3R>ldxozOw=UFaT<^=L2R(fuQQkHc}|%RVt1Wrz71h6C~( zXtkoold74>(&{f82)iE2(}d;5)Kr3&*e~kBK!F6HRP9Cl@!pDAM_3uk2a&DG1Mat9 zEbU?U@OyU+qu*NmWN@zj#L8*2f@g0qvaucS9tIMASc=RcR%!|`whAzT%&duKbxBaYPamd270^O ziIpLIDM;_J-|NQzLm064pSjbIRY-oi2iT6k;}S<-%1nTu`>)r3i(N>q6DMa@EC2hN zKdxS84FoG?t9He+>F#E8_*mBdEYARZ127A$YwuvZ%2Ul#2QoiUV4wnV&FY6xr^T<) zh@Zs}fN#CJ69%m6)b5N}+=f7jz1~DF+KP&bA^m^KC0|~Lm;}&ovCsX4UsJeDI$RQd z2cN&(xJ*63qwxO?$Yb>_m~-A@P$j|xpf>LGN2 zZlXpD&bV#=={>-M8JC{nwtAuM25gx7xk^TKmJz#7AcZ72UDE$JIg!q>w>~N*@zk4$N zzN!C~ng3s3Oz%|(4}3OxYiaWzv)kEvVj>|s(@Xb|LU?rPTfYmhK(4c8TgzH_CpRYzH9$IA z@;zy*uW;x&{_mUTY^N~m56n}MnbSLY5nN_%0*+_5RCIQ>j%Qt$L#9PTg~P!YMS$<5 z3%D}N<&_m+4^-uTB!vi&l4KvxUzL;ZH}5zZfUvX&92!kGWl=Vt&y1UWw%ScA3ewJz z%3>W}U8OEalCS5fl$QDv$>>hc@C~iB<>meqr+Z$0nmWk|W|P}(G}7?d$vCr3TT75z zftTjM7B)4ee=A&@CVHTDh^5`u*M7;|nx=})RkDM~#e(3_bk$CWN;Yf7 z&VDrMREZd6r?qw|tNtXWlglSL%t}{t%g#fJuUaQt7D@n9al$J?{6M!pSay%1JHy`= zp)(Obx?Jgkid6pe(nuN-PwBTJUk4PKSLu*G%&M~1jxVpwsd1H!cRMs6$bxp_nHhC< zxUd-}(c2bU+S$sV?rv?66x1IGQ%%4kmX}@9_FI?(M9LaXEH6*2xID37Ai}?^GZoK9 zFJ`o8nsla&4XCL<>wS12Qg*S3`fc%H)URwLcHPKH+?{u_5|~QIAtx^@ah4@}2i^iz zXN$y<$LBgPbjNbXG_pa=PS>_#slLaX9Y~*IBUfcQL0Dzmqku~|5|z}g;%2|zw{}0^ z_|ONWUHX}A34SPAyONhx=)Io<&;+Rq6>Tx$0xDfGm6^}5@vs+-GE(AmhNvxl&PWa? z+Ve|G>X@>3=Jst3(?t#=b98FgC<{7e+zJh%aROYAbyiMX_=tGKrqVZ)N6nAFSyb8@ z#0Ldc7L2DX#^aDS9?$Hv+smlRSQ^A!+T!=MMN|@sU2S`lf|9UN2RYz_cVRQ=$D>uL zW{%3w`;3s32!m?Do;uIcPl9O~`pNLJJQm0ZC@PJ9&uOI38a`RgMhV%^cASoIiGxa% zoKMZP*56W|uA+fpN9N3p78T^PeezOn;356VAsw*%I$om|oX%8v!>c6Mp^&~+UdDaS)L6e`Tjw(9Gc4)}t( ztDWWfT?@W`YY-`IJm{+^#GQghWOPi`J1NHV4QFvz^E4!HbyMc`phl}Yt{{F-t?l!> zy^F7TihWExrRs(n%xvvE9Mrl)?fVLQCWqXT-k4XsG~3#;8yHkDR7)BSH{b3_E`_|0 zF*|6_0*cAADQ6#5^wm`5d$VGU#X8mSXKq?M55)VIyBfw-I@vagd}cgV>u;euJv}rn z&j3}$yP1P$jXEZE)S!~2Qz9u6LxoJ~`~!k9`jaQz6V=Sg0_^gwJ4s3JNE^&tPiDG| zv2A*C8Ww8iCL0h2PB!oyr|yG=nrst!Pe@fRSe9#VO

^P%Hi9R)A+nfU>)n2tQ4od^Nr0TJ1JuO{?UFD zlh~d-Qg2?$$gMt=_(h8;H-q>BWM2#cEnl|v$jtsUSEB!1Rw06Q-Tj@Uhr>`m#m726 z)B)?j4#8w{w_+Y?13l!xrl+tlm2rYc<10=BBzMpKeHG#pVcG;#1oP1RQK6+U>X&T+ zj90yU1oz5Sbp;O(`$kkl;qhU&6ZdDPe0$4*-Ee^7p!eNfQfQBXKXy%xSzRrULWI`S zLOG2rU$Lf8)I+nySeGc_4k_h#=-hA?BFO1B7A7}m3|;GZ9m+^e#?uX-l~8=L-4H(RF!taF8VB`CiiVRWd5jVBg2D4|AFrKI$FG&UhCn>XIS zApqRu_al#j6#xz<+up6K*?p1^!sK=t-Ro7(%v;J*vHIoagF$hpDKo8Y9(H|&xwp(1 zWXXD9Thm_u1k`Acwd%+Rvz+sGq<5z^TM?DB`SN(f=<)_| zLX%?%4COnA`Lk_R2l<#r;$q~MHr9U|v=|CPBIZubpI~FL^nj|G9)H5#FH#yi+_JGa zG4Pz6#U>pkRGz5aU1T*hV~rzJV@>7uT)rRLrA2Qd`)+BJ_r7N-7c!mH*BkSDZV$t!L6bA&Xv(VS6iXvsQ)!AE?Q32qPHs&Hk_lC ztj-b_mcCpvTkpr4hilfll3X?yn}6^tO8%}r<$QauN`^me!Ap=!InVuMd!5w!QC7|o z5gxZ#%CxShv)_dpshD6=2?2dV#OB9iehR;_Y&909(b1eJNzy_EE75H8&V=8QtuOod zy>EKuYsz?R@!Ycfemv%;Nj#2s>@>E0mzTxuxf{4c@ku>q!q^IGY9PdhGcwf#;cU%B zld@N4Ee&PQ+C4Ty{wlVfwg|@_C=6VkR%Nk zXXq*EyK?$?F<@bIV!45h%K0@b>a`U!qSW)D0}S>SY`N-`-9IdtaBy&-;%fs`YbmNL zXH+vRk{&Kbtl91P@NqZRSXdS}w^R4?`CQ#jwP8JA1*E}3?VDX>-J$g;x98MW>3;#9 z*!@MM2fS4cx8B98Jc%>?Y^1i2a!X3s589K$B5`xUGciS562kVja(Ub_{;9gV7THk>-=CEHw?Z@x2j00e9bWGC!?`75 z2)|DpUQ%R3I);7QY5It1?x?ja*udwA+%N%-P|d<#G)twat0q@|e4JYPAokWqUyi>j z(X5a4%(5o)pWRCg*uAc*$*D=wOdd|9pQmP$<}(DsU-QOkE^oc4%Gn%#Go@>#@Xv8gqArfSudRM?Qm z(ccr3mWi^Ttzeo?mQrII&M5+np2^u_=iW%+G1N9yUz)B!QO{R>T{wE_lt<%Z-)ko? zVK4ri?Qbuy3F?yRt3jJ{L$!O5siGyxc2OvvHZ!zVExA*$VjXixbx1wicw=e|T#W*SDr(Z^jb#J>|wFkbyE)c5lza^790V*Gmj zcld_Ln&{~00{uF-+MeH+1p+E5Mhr;Uf`2d2A*yG*!3zbTV1GVE)@TECJ8CgnTH50U z@$-d^nFf(E^SgH0|J2C5d=dqLW`&%#8j2UbIbulH zIw7%oXN4uL<-{2w^Zxor&dX;VS=LQQ?ZrUkl=0wzc!`$Uqs#{g@q<&Se+wdKGK_X5 z=HtTa|0#aJN+5BXxMS=w0COnUSuX=J<>utvZUkX%H=|ZFgPo5Y;BamhAmhb;n)(%9 z&R>{J3ku^4;_nE)=gE)`Mo#zt82gkZC&Tyx`=1Ek|5En^NMU267|_tTYOew5!_jnF z*OW}kV{W?K3tK4<{SWo^PQ28B>%13!hg;&6eXLEW)5$U_Cjl1BI{7OhiROw^p>glj z72ZXC4NtV~o#uyQ@-ePD!CQ3bBr{);xX@)%*2-jAa&o`RuzNnl#JYsHPAz{+Lt!@i*;0mPbV?AZ#Afm(3sY51Vobm93xC^o%O&9)6?sT1H>J9_Ep@ zB0B4Q^qs_AY!4JeC;K0NS&EQdQl~l-Tj^cUfC_a% zY<$|WgQ1B>blj+{=1y}t1V^#^4$JT)U+TZlqN8jv%5kCSGn1=Ye|kD(3YWdQbT70* zvS^Z(M<9)sCyEZH5F>{d!|{UJ#2Z#q!irFjF?D*?E8`znF};$b2_sdAN!86173lc! zIOgfYuE*wY<_no8HTju{v1FTklQq`)6Ykx*7jpetAU8&M#l1kiAb-=>PmSw>qFdN- zb^Fmv#cV2H&1C2a=u|CB7w#0iFed@Xn45I!V+>t%s$p!%S?Il*r>~;}8}y~fP9Au3fQEf*QpHp?RjW1n*$RBCbyU$rbn79q6J2eVkfY_ z7`HeO9rWdAc~)9;udtEEpza>+y{RnKBy(nn|ADo07^9?g@f8aVhOVV$%Y7U!Pmofz z!OI*iIsv$;oq5!%KciF^VbR^{Grl7J;F{;Fj0&$*+`Y<$A<x z?jd?;VdrC#=F{07VIC7&by-K>ebG4wJpIR%7IDSgrFU1(SZh4PfRc>8h5~yGyI1g5fW!op z7;fX!j^d2$ulM#ANB4{0d{X(^XR$aesy<;Vv^{eetEppSL-Er!?GLGUTjm~Izxsyu z?v{9wMrP&x_jTfu%#D=o8zJsqt#q!oS&z<7q*itOvr?PQY+(J+RqpJ#4UtyC`}m=`X{IKBE#RPQqTPC)u@euox!cqnUx#CcONDN!Q|pt5#&(MYE83UVdSca{ z%09zQUL0IligSINBl8U6L-FozWJ~J72&mHvt9Ai(HAKX76)AFUOSy`{g0G9TC(@LtR<&r`O5 zrJ1m$P+>MR%-bh@_vFI~5h_?2_~m4-WDYV%yY377xXvb`t`4I3=8()jjZ8sa-!nsrHTZ4CB zO>{J4n3-6I645-IyC#YE=Bmr}AH6l!gjjf$)HrYIBGg8Tj)iaDWjJ4U4e~t1!(0_S zbdk<^8Tnii?;7nhOewO0=_GSwyL0=26H=5IR} zynHcBNj-JV?AS+NDS6h_8KL=Ef~i{3t2^#U(vR_ZZcjs`Q0NW&Aua8Udd9Kp4)`wS zhVZ;7{!I+FBx(LAY&dBTr`UvYwLyj+sJ>`xi(ShwtNxVLm8^ihc(Z|*a7OHdmtkjj zhYk#+hUF#Oe$9rJqZATERz=L>z@TKmA~}j51`WIMU8}g|+~=KC$Qvr6DD211hN!_U zx&}(uQ4Mkz%0v!{6|AqiVvYEqYaShC(>5@-r7evPenaiaCiU^*P(^JS3wsW_%3u~?yqld7Q!7@epF3u>^zDppQ31$ z&J;qAVY2bYwEM14d|dtK)jbTseM%?6!HG?rec9e`=b8oYuBppG72;a=4TT1j7P=+J zz72KN%$;<8DcIiLpfp2T~5iJ%Es03O_JfZzXJy-nvhn~ zu~d^I+PbmjSRF65nE_b1c0J!Ji1ppo9U=-}0^r7*J|&N$i*P?Cz&KvqYU>|D6Q;BL z+ZaV4fbD_O%sC{PMRy+;9C35mHRi;Mx_yjTORI+)&hvOqDhe@=ojp%NuKR6pMA1sn z8M!MR790~cTdic{8B~+!xV*0W?Jfh^`hvHg(EwC3@3~ZFsDgffi9v7#k7Ium3@kX} zagk)itvnYe90)ga61bMqMaYEXde5$xn}=(lL*veOZb7!+Tmaz~m(Kp(j*4i>2(Bi^ zn7MA(M+T`G?g(<58?~#7I9y`)9tf0(IE}Ze>?o2E429wOhOh~*t|>YB)<1T)2@BWP z#PllFYr1RhWEGT8J2ZUj+eoVE>V&l^G*U}anX&o%%`y9@K=FRCd3{@lM(E=s>=O5& z?~)Nt$gYSz9oN_6Arzr5(agQi-(C;FH85ci?OQw(B@ht!ZgpdIb&X+0{AuUlP{p$c z6d5nl7S_%v*Vrn@1_gQ#yp#H+XW9P}EvfU`)^r_2x%MVV1Za7KIg7Rn=hy`X1;Bflc}l2o~2YC)6sI%uy)FL ze^!stqo~f#2GW;@(!~%~`vrT-`u~1x z+5cH5XmMYb_yNN4X;;5b@`h}}l{avxw}=n?#a~80ysSOq|2uBb{;>B>sG+H+XOdK= zBRu=BC!xL#_;Xpg%crv!VoevPO#>VkyBy@-{_XX_J6{71C0xyUZJ4R?0*(B?e;V}9 zr{KqbIf2x~xyrQ|pr#pLuT=5VGQZY49Er#{7g3QbeRU9|(?SQ%W%-66iwd0-F`py^!txxbA{#BAz@F-& z{qOVOSmvB+${Pv32#N%Dv_Og&It0r849>$GEkkj%0cig9t5=j#h1(Mv_vsCM4qo_f zbo!=ftYdirwHFbHlVKQ6i%nNhH{*&MErZDPgA_~nW^8kUWG-=Tz^$H>l+Mo zo6=WG^>jc-p52^kxZ{T&^IExeU5OwRy%?-j^Y4>gyf05y9sy3qEAj`pJ40_I(!E#p z3P-)XkzN=3ygh&Imty!o$EBUv(A(m{U!pzvc0$GZ<0>-|G4~sJpPx!k$o=s`%)FUbVZ&hg(w+1Ssd&b z@^q7$QBlNvM1~wwg0YcJNFS7a=~|wO0;5bg8?{)ys1kE@j+W(~Ny082K|rrMwc8+r z{P7jlntON+3V()3_;T6-N7PJxyMhQkMAQ%C@W8Vkz3TceQiAO)nf3tJjC^qbb?=d~ zqvQ5fXk5n-Taja^H}e3TV8(z&k+WvBb=#Urcv5=|`l3~jUopcQ?pm(Pm^b*+bCd!0 zXhf-&<+x;er!MUFU9vk1+VH&VA*SzK>{8$p{egc&3e+#s3@50P(+#sn zMA|Hbog6ZnNhFVbTgXFuIktMMdfl0yoP6<^cwvr7K-U?MyU~p1qr>{T*a2ff?r++t zvg5}1qWKF)ZQ1GX(cQa+=~j_E<$OWo^^G;5x?!+=Tp{Jh43-)h087v#H)Z{GN6c{`TtMPI#RP0hJ8p=FYh z$S9D=5T_8OfXkVfZt4NC9`4&kuQ1%Z6_dw1jvm7pj!*2xv!e#5Q#^pOI9LzJQ_`i0 z$-6J`-=VIFc>hOVJSUXWU9Manrs+2?V~&^$z~(epBZ58_EAVg~2%AJxEtfvWNQ!$n zJ|(JKQq0XO{4^1>;sA57=tpL!pL+u8{15`GKgT-zK^#QVK*gw6%&Ep2LvG0}z$4?5 zn>b2I)WLoiluU2fOJG${#;I@muYbBmCbv#K+9zOm{0MuvTb=*C z2y`(@Yxz*eORY`Bu2iq+vGB3hX?a7(e}Q4_H#!AAq+ML54fA!56?=gHZmP~NM$axy zYIe{|MZZV|`8IlE2EEAaOe<7m*Cv?WB;m&^)1YeXxyW51+(vDEztd12?48(kRj;~S z;;fGxyYtm!3om=}o-o7euf{(pjwRBzjKZ^F`Fj1fU#951oJ-iq`WXCu_{w#HUFNZe zwTm$keT$@PTMt$0x`x|W6WFDXmrawD__eD=Th!T}HAdwM41X}lS7nzJEcg0Awns43 zHh}m1Yfy%Pd5&QF`Z4|>95AU84j4ip-T}M2WNlu!v9y0C7-joEOKn!>fhiLa$Mb|SQtt=bxZ*jQvGyIx&T!37f8N=>&a-!)`b`mmh#d zrcd2Z3_swkuWbtqygw>CB%69*6{;fIT4QQcmv6zUPHgIMU#?7duVKtY^yDz7y1pAo#T>37P0rnx&6@NLO1 zlFYua^t_6#<>L88!{hl%qk_n-$EgPg;h+Qvs-5}`+m(ktDVssza)A?A29u!ENdYlA z=eQ-gP@X*B!^0P04wd4VknUJ&4L#?$IJwZG#n!|3PZ|av;^UTy=+r(hQo(CmjYNjy zNS&St?j`nE^yqxgsxQSIB+Oeaij?GH6 z4bjy`78jy45*Zl7kP){;2jZ7H!|SdQ8-e3fMwz&jCEE+G(l)lmT!doonjbR*Fp`I< z<2S5%KUNu;oL>z&4rrb9!Z$v3LH=me)y2Q*?4V2Kj3XkpssjKo7^AuFOkA!G)m1es zUbo+TXfr7Z7~^Ys>^dObH^IH9R>rC^`q9n?l*s6Cc+LkJU#}n0H}-T(>mfFW2|CC3 z%A{qen~wDd3YvNZ-@aN-wPW{ZCdr=uj7qpvSI9cmc&t)qb0&Ncx%W^eATat0JCbfh z;)?Lq&mQVJ$ma``PsBXPd|8j1w(E#50UX{s|E8z^q5l4ZnJNN8(Sr7sLmm_>BmM_kjEe98Ya1Ke!G}*5X&65uHwIzO zV~=pD3T(Xa*4|wGX2oZ*`H2<(_T&5~nKi{z8ljjQYemO2g@F;9Q5Hx}fetmS)(rpc z46h5BJ~IY(JyWi;7c#1 zT_hRa87n9qPvxSY@~u?J)@jI_!yv>bmL-t%OEq0%N6K2`>ADC(yvJoV#XT?aR(Kk& zYk*-|f{UzM=7EU$hX+N@*f|oYm0N+8t?#{*s*7HH+z@*S`Yz8*Wn|)UL1sN=Q1AsN z*noO>=la#hq03uSCY(y#L`EhJCsClA1Q9Ne3u{-t9$M4~M`*w%S-b*blb7xvQeB-r zudty$p2?~JwjpO=m!Bi7~%~=;$WKWCShQ zZTM6{i9yl5zKE!aX=6v*B>6xhNrc_&16Lx3TrHgaosQ#F_5>QB7@$#Q+r9)I?9ug> zhW)3npJLt#i|24S-hB|jLdxyK)sg`KAh7o1PAXM`%_H0iPYtJ^3L84(YCr zR$hVbUgh4>MsTh$f||WY#i;fPbJ$xWzFM2yPzrapnpaG4?U`R9B&^FvgUz;SE^-#sIslB&% z!p&~C@vt~hhGW{_Bi@`*`*!wCf`??G_xhHFs@$VP^wO;O6-Dp8?qDE~;|@Q%Ilf5H zMp0KAf~liUl<=_w>#b^Lso*n5N5})$aMg^bwDDOY6VC)cKRZ~)?kQwHF~PIl^Qi87 zF^YUVV1$ZBOZ~ChuhNBjjZ`DIhn)}gvu-;RK78^(qV|YrFwoLmE>uCOx74+` z(7f6{(K>TQR?1C!`!(I(7>U_ySV;nG`t>%91YD*`viX&(@jva0eYZ64Ok4ad(^3Ld8G7ga^UPi1^&Yu8ip-RjS z`B;eJ0H*+7zqijF;g+W+J}Jmqa$-eQnaTi~s6l_WBFCU$1FxIF`Hsv%<1d@909k+ve>6(14SDn<9~v zf%%6t00NfZf0;14{I!wy*-@W(j^H+HF+v-_n;fEG+mGxObGVY2WEqjl7yCXlKE%F< zVDVpBHIcf<2iG#ed=d}}5UXnnhRp@a%;a!(>Q6rFobCp!?> zbdpcKjq>wL;P9Ti0d##P2B0TI4XV(-VZaO7JaBPlDTYP>z}0~8#qgyszQ1$-9hcMQ z?G@o}y*_~@(8g| z$kTPSc)ymor(8pGd?Q4>?q&VzgFu$gTC?w;FxqZVemW(yDL1Zn%1&=yl^uKddyKMH zqJO%6@90Q-8I)_^nS{_`b)~u7rM9FoMzEGZ*(LvM1_NwA1M+D;siZ}IBF^v^qT&w& zdcD22v+|?<`1WG)27-vIe-3~CBgXvy?l8UQTIo3JCCfv(7WKBTU70LUDo*+gDAURZi#|eIxzo99(bka|`0@9;?rPM};AK<`x~>s!zYkc>FK+BsMh`3R ztmPNS$j~WO3;(*&6QfJnrm|vb_NJqUA#KX(z^PgM9;oTMvsUq`C20B^nYK&#(I-|> zS(*Ce7(jCYfRtFs=Y+TE(7LJP$B*|J{~!mz1qb*paio>*0rV8{F(UoE>r!`y8IbkP z335wVKogkUx1HjS@Ff`l1hnwu+yekIZ=mJw)$asfy;oBG7W-41CY?9$aGXU^qX(&X z4=24=L|uV^R)AmoaUjQ;VDo#wgI}7DFg>b*{+1=L^bKxExeju#gGG*Ug z(2NgicCTgtR0~~(G)?{p7O$T?Z~3)TAQJy*B-19##59f6Ukt*v00v6QI%C&k;U1Zn5lcFIG*A$%11^a0r^vRN%=KkR(`3q# zrQ=p80(B?`dvi!@Q^`kvRoJ}{^$4*Y(_)WO!sRX-Jx49I4r`InM1SSh6tOAq(Bpq% zZ0awio33MK&iTa2Catoe!OE^I%w7ho8jyp?FZp$Zcdg0>V3=Vl(x4LSvUT%Z60w?UI9^JzoWL48C zAh>DsS&MnkyOS_7PutvSp4`DMb`R7HE&9p*dFnN*L)kfD8r0miW-?2>AvCZmbkxyC zw-niKPxe!lH-U)PKmTQcpT2Q<8PsJHR@wgJ>fKtX zh`#4DsZVs0>7X)PmG#KczMnLoR1@DwkA26?mMN`x7iQUqu!pHE4*8y()$Um;VH@u8 zTZP;_dvya#cBPdnrltPJIZI`G)~D^P!gUg$AGlvPI=mW_Br4{T0^&7Qx-YE~Yl0)pb7HN3KjA zJGbfd#Kz+aB^`gCm4~hsKBR?Ri3z#h<^N=tr-%3IDZB2mt?!a`Q>&pJn$1u2cy@Od z56#@PJKN9>!LZm7xHv`bPPUTz9%y17jcnwf^;{eb9L;Pwjmi-^kz&S7c7D%=2ZRyY zJr@~u51-7w-F6~GKCbI!YiYk};%qi5Clmvdb(_hV(2IX+{3Z}Rx&L%_oQ!8Yq1wGn zDPOc%^WNmaast)x{#VrDt>Jhu2{kDl&u2Bw_#OB}(X06eq~oPTpFD&aKY*Ip4DjK< zf0A9k4w47BQ!L`mB?!jPsF54Hh&#PAmX6@VrOjEt5Q^+R$t~p^5|Un?8udx?`LGmv z%7E^^NjH(75r`8Kp-W=aKiYussO;}u@=%rZc-Q(eX@uT9w}{)Rq&>Wb6=dsY5C@B< zP#Ymx+0$H&#LUx_Q!t#tWjUmTBw4&`7jDB%$i zM|8d+n7t|A+Snu&R&w`KmY}$2nnQJPk zx$KNYJMKQU2qUQ7_hb%ll<>_hvANpbnK4HG{I#(_Vqv%RaEbQmS7 z(Z>CTl6u##bYwMqJ)x=O>+<6uEKSM_FH2T^2Gq$tN^~n>hw+=_7k~qmsAc`ceKw}@ zJn3T7??mzZ5XRXb^zuinH}%=0o0?kJ z5$qN-<_`s)(2Mo1no{fg3zM&##V4n}!AO$FqqbMqGO)i(`EIDD`0!4`;b^0vNPl~U zaG?V-W461Maz!LGhDnds;n-Tw7S}oRn{pyXhL@M?1}dJYPy@Q`KN`t~8_s86poSFg z{B}$-s1h)8{E&bk;ifA`ROFR7CMg5M2fN*m+6N!`k7AB=bB{Q_?Biu zv4hFfiE|zq^zl&5pwd7sAsart?W?XomU`3&^i8mL+7bsO^f@ofjTD< zEz!)6rBI$;_SD=cD9)F#Xd1;)bR;}wLGPL>>419Z~1Rh z)m;6*NLAkWAFT>YsobH(#8`sd8bk^)2;}^7i(+>lU60t(!osvqag|N&SOz#N;ENl{(6G&kWcRGDo*HLt@jpEREE(*xnYQEt zE8aqzVi;X7;P@lEH;C+tTOO~SyNxpsG*X+j?WDUIwK1n;hZLbj zz0S$F89m)}g=I)#+76EDxZeR!MU85_f9?Ux=edKOjfuqim^uAiSjW0x)aX6h()H(_ z2MPcvYrl4#$HXPyXUdHp`Nq$DA+nCMnoO^JUiA6?+rjjyNjG*fu;WJv1zO7AGQfTml&x`D~dm#GozC%!V9oO4B- zI$)obG$kw_8o1G)qTJMQ+65=;E?Avk4eah+EF~OoY(>tTJ2NAFleA|2 z>M6VHSJFFu-zhht#tM9}R)ytrIKFK509$~3to7-{Qz=zE>f*6Hf*flI)__+BzX zn0=B?RrD=DZQM<3ZYYk|9KYGNs=Rp)eIOw^dSl&e6w;(R$KEoWH7Dc+b(Y`+&5&1Edw zfr49o9(nCB=6~l_Anu*-J`vQX`;Cz^)5f8Yw4#^uY0hhXnA$&>~LEG5`J;-sj>dUXyW~dwD%gb_-64$`s2bkk*!IqZx}6j zO;(YQA7KxmE)3G?Z3bjyzBPNJ_g{woVPasuYP&ndPTUF3cO4C{Dh}L zf!MxuSmv(2mT_i&y26>k+#%Y0J0`=O(zLkU&ye)^?`biTu?&(J3Ol%(nw25nn!zFHW#o2+U!@=C zmr*>(c@0#HVZhWpv9DV(hk?NZq{(=sF=x;T4-Ut=IryQXuD3G}{Wjc=_i(Ed>%2d$ z+v`q6&0TiA!Xeaz;8^kgy-n<^Jz?4GrIn{GD*qWr5NkJ`x(yJlzY5m%TGEDS#>R`5 z$5>w6S>Z%%64$9XKtG8~Su2UsF!`V6$hGh9^@_HRvz|BhS>*?$xx1VOs3hXEk)2As z2(RGwLVA~9V$Gw>RhozW71{4p(%a%xxMr7+jm&VQxM|PHed(z1sHj5vMx7p`o)h=oE^kvZ=7res`m%kKxsk) z6K$5AhThs{l3%+Im2i0tulsC4IFC{B)>ax*gD~o?6laR5V!PJ!C&8@vT;Fj=?4H_K zlWEJlvd}wh2}TU(IP3GKuqxP5esg^+Of_if1S|0Xi%y8|n>>}xB$d_tkag^h@uYU8 zekElEw4x`Gc)aE@kW;B6V}_JDsbzn|4LvAeEwmApoohMlc#&^wSeU7&*><=10ZnOI2JTmM|Fp!-svJ|mM4lbT( zJa_76ZEQ7Ko;^#4AIyjkq~?kRSKu)8;q?Z z?bl^=HOk7p+r4#a)waCB6~uSi37xq1QOjR??e%oe7}B+Aw41C#PDOTSM%6@4oybzJ zjSFZsl5{IL+0p0Qk6*7!ENYAn!*MmYJ!fbPMGiB}o=VVI>K)wJSY^vCEJ-{bsm$N< zk`|UDmrOla$}Y%ZqZEKjTo&8-(U|kIR!UU{Ur$*kDa(eUA4IoQuWvtkC=VhA1vL<7 z%4R!tEAw)T@W8B4jW+hm8ir!gA$b#u#T%3GI!4LV5d})&sKbMXyx5qLb~PAG`>QK4 zuN^CRM}aLo{$O~Z&^%A0FJy>gnS4ARL|}rb8^$cv>S}CQ!lo38nmYiE>m#~HfiET` zsOqws8)b=8Rylc9YLr@^K21wbQ*f-{@xm;!u>L*+i;$q*%gxtjMrG6Xz{EjuAw!z3 zH&|`u!7uqoOrUv0ESBGY9C%W@nZ0k~DH~!`1C1q|L(cT%#%mzp2+G9%uUcHEn8HIEhDx?} z!W^S_kOe+g>$81B=|?*o>E}yl#wHNom#2}-=s>CSwSjZp^HpV?p`nYap^9A**inL^ za_6CwuWL0mSWp;SZL1@Jl)I2sSmjUmF5WJ0>S3Mbw6qhc;4hl3J_n_Ip; z6QN6+2v&-&jp2}36jDLD$BHOl4G0V+;ar>D;bF-sD+3AfCm;y)NmpfV+fKq?)Dj?V zxhN?&yUxbdS0H8(2-iV&84Sb=4P?pD7UzM5=rB#ziKtrHD{5H7Qg!7rydZYmS5uC6 z8b#5^5fo=AX`asqp0xaXGmxyZ%qVDXuCw>4N^PjDt~5k$sR8KI*zWD=A{d@AJwC24 z=h%?uEWekR9W&V6b9aMvlxWCe5@-#XT>noGnW?Iu-FB*7m9b5o>S-Ax6igSt%8lww zmK8$$BB&^Olkc__ZKNJ4tOe)r@E`GL%Ue%~c$InCh}vdmYS%O)ibvuyRv6U;xnbjy ztwN&~ie3=EG#JIe_}sM`&y0nF#ze_OqS_u{}*|09@SK~^@~!+QjUsp zs!%9IugI2*`6D}f1j4Hc$Da7}Xrj}~8TuU^ zQ=Kh{0>xvlo(uZH^wHY(w@l^x`cAKvqcr_hSC>9`e7Wv5NB*$bbT(Z*ilX&rs#~{*wIXXW?Q)6Id_6sa;hRQt z*;L5c7A&1`<-NkI#l^m}=~=BkT3a?iapRUcUY;FI#vOtZYK0ay()>@vI_-A9Ijg3S z+2aa!+79{*k`A0C&W);N?d0>RC~cRdxt;3nuhOW=N^AR2^+q3Z*4RZ7^FS@@V#(MS zw~OMX8j16BL_Ihw0}-Q^nGkXQP+ zO2u$KfjF%I2Z?OseAiP}J);jg)-=o`U(gzIvK51Prc*4 z5JW?S*ac&<@YZA7+T!Mp2y@!UqkEV2T=oRQB0d>Oq(f+xq@ubd8g61Fot zW|(v;W}#}l@-9HQO;;mKHAgVD1GA;L=Kl?YZ-q_K>(T2(7^u|=PWY883BX_$Ci~1O z%RqRH^`-KKh>AqOYj%OQ*bM*f84s~zFZ=l;mIfYC3S1+6r^MvGuQ2?C**2dgmFJa0 zoJ*6y(mazDQ)?rRT&V@<7MHQ7y*hOXE$oaKKhbqIkzlUV1Almar(O}67+Q3r&^=s( z)oN}>PL*!a(R^Ef*c)~ot_cK5li7w>quC6drD;#LDfg4WC}1PAK(`)KMT?=st^lNh z+8MSdht~nOMauG^dkbJTzZkp_Iu@b6;1w~m7nRNi9}2r0aJi3>Cgl+z&0CBqv2?*X zzV=yu(-t~*%Q+|Cm8zITytT)8wIIR9?Zt;|P<+AA*a*u);hmhs88ZWuJ|ZTz7t_?r zsCS0XgCt#tg0GT!SEfE|m~#$12X!7$aM^%C=9`hFs+0WwCUVzHsdqTd_FnLScgstA zAxKfyGvK!cqj?R^ll8YzN`I#q_f)ZcY)#|HhHAQfrTqkBf`Sw|DAyNx{q_orTS^n(AsLsYiAMiZR{{ z_{c^nsHv&RU%&neIDbB}y2*L#NzKHYb{Wn$uCF&ur1*Qr#?aBx(E#l|3w zPikC(g045mp95FfbgZoSeg6Desb=r!`s?Te6`U_N!leKiGY88g#lTr@ixbVt2S3q0 z_=!@>z<@p_(33>OE73wS&pI9M>sG~zsZBD%->$Hg^p zyUF1i%}1ro%ClrY=3@E{AV@QCJxoTB0J37d6VQAIkGwdvmB7^?I?H70|Gr;@Ag+T( z^C$+9ULo}`2Kz*Cl^lLn&XrMMmJbX;=LFg~fzY3DKlzb}m4(F@b0A*f%F2pIfH>!; zH~4;}l@vnEI>deQU0InTaJ>I#f#N*^_QMq{++7XP08l?bw_9M_pJDGTq`U%j_tTgL zBC`Tlt-F+zlw&|ZKndwynN|DOuMhbJ1eTd4WUJ3-InPD@+=RUp!6z0Fi~9~fr)sntg(&Qv46GhmxB{=61cwK0A64LeIS0R zNjBmd{5v;1;Sy_fy)G~qjyJ2BRW!}-%Ty1R>vL1oUE;)m1f&im?lsWYjy>{5F0Ogb z$pt;T2o@&|_E6ZIyDawp702*!4c%fVQmO~Fm{v$J$?x;|_9+_p1GEYTsF-uR8_gV@ zHNyE(X7{RP{^Wti*R4U=BzOmbJtIr+Gl#STF-ns!#onE$wr>M%W#9px?8lF<0h(fI zW7GES+c#RcS^)DN91fR2vuPI?Cd&><8GMLFxcxZ7pM=c{k>JSL)7OXasVY$0tFl_sK{Eri zdaOjT<&1ik>@tLS9d98u1=-1mBQ!$S-rc`437le}*beS#*lX&32Ytfb|NXnSv$OLO zd%Yfh(3wUrOF8XnfqExrc&!1z=8XM__1|UQ{4EIN|2%VG+V;kp&{5VhY%+8#bk4Jx zxcJ%j$`OuWUymH*7&@rU>$w+Bb!>MlA6bFYf@>1$**ofM7WRz;>$UVmfH)zw#`Xf| ztp>pDW$&-XT$j$d4sOlPYWpF8?l;lg4u{R2AlL?~?>%<@p%SjMvjjTAd?t8fJW2+p z24{a4LD`dqg*xL)Ep6a}m?;z!$m-_uE%A37fV{9|_T_Tss)p~oZ=JVGFE?{Sbj zFLCE*phFvO~& z7Q}eBijPX6AiIn!w(zRRnR^h4MqkV7c6m-adhhPH)WevkGHI?^@QhK zJ&6cOS^B3h%}Xo3V#VENEm_adE#r-3XUFyOQ*Oqr-mg7rnS`;{Xjoq4g!YagVdPtv zZK*iI%S_R7iKXJP?j??VZ!v8=YtBLQHXVJ=a&q@|Vc^TzeKDjb1X--AO40|m zUP!1UL+EUaqrZy4nvA3KbT+HErBA^vYNERLax^PzW$lDx z(6&ixp^g3a3?`S{?o=80XY%rKm1~-rPXYdbm6aTrH$*hwJfOh(3zJE5^%%-{CUh%J zpv(`t@TH>^pV<(KytYI!pYG{s|q^2rvqtqcqndr)82X>LLgamBx)+s|k(v3ng&1r_Qr**VL39Qgqvl)V zTXoreSFzrA1-TqUW_IjuFQ01x9JX#`u@GZzpt0bX>d=sGYX-UVi(`k)NS1$9dQ0Mm z<0R@jM^1HYs#kFxXkql0#&O?lLFTLhc%d${G6;WSK^vph_{g^^=e&C|+SaocHnH@* zFL7lp7HbA+jV^k#vc8rRIK9zCFU@++$46BjK37=v7y!He1hlZ!5E-B zBG^2!?M_7x?u}2)_pc%o>wA{r*j01}$r}t_L*SCdfdpx z;Bw-t?()=2bRV}BMp$)!7W}$g)-z#gOI3}u=tE%W>UX-F8RJXC#Ir0jEkr0#u`NG*Mkf=5f6Kwf@&)VUF_+PgBZyoyIog z#S3LIsv3!pva?;chV_qtbW`2aAiApDA-*V!spqq>{CC44a!|KrUHF3a%j&vSRy5BE zGNvdTwsvmb5J$6_qUXpfZu{}0wX%vv9m-SDEt5e@D^E+r;Zx7mdr) zn-~fNI5~!0LP?Ww9cNp78zoy7TUL-s82M#O&pE?|NPYxJr4Dvo$E>;}bkaK@pw!Vn zLZ)Xci?rlsREM*)@vBNj1y6mg^Ml!vm(r^A4S47@T6VBKWZjcYd!dHB8?FJYg1!-S zWIenTk|>3F`QK5%iBtZi3ib!Bb}{zUg!ncUS9?`41G2NqOQWzU^(aS0v8*8^j;43_ zvraL7;LFUCkz3h2&&I)i5@4u8EzJ`J&$)pB^HkcaR;YyaVEx^zD@13PlLbYx48pfY&#GG)4$Xu)i;BwC!ZezpM|u(`yY&pbl& z6>UaG-ZTRoo_kTK*x%f|_gV_Q`G`yw0Wd;`OlheiO3FfxfSMfrFXxND%f`>)!QI_i zYvqofPKv9Ok(8ln8$-i(n$TR$vNfMJa>8zeHeXs0Ar&R+TwD_fseWN?>?WC$@Xp^| z93%OU7a(6_m8xp#t@wDS*ApMlR;wjr*kGu0!1 zW{KYm0|T+1!J6n-C`11R$ITZlADMm~O06nELChC{_SVNF&$atPVT6L3YrEF?dM9^r zPfuyxHwooNjP|R6PJbez52-wMIIq1WQ`bCOmRV4kLxlfHMAl_Uqp1CfCIUz!FvVb7 zilZf8Bb>#3Idhp8czvE(Czq1uh+Fe9J2pbKtdjGx)T^q|uq<#|1SpifK-NVGce4{K z)Jh*Uuf?7xmm3Wpi|w7Q_}BMps$x0?(vilxo0ZF~&EtlMs|5szjpbqjRtKAfGC^}p zhwcZun28tdP4g*gNieCpOkW(dZ1mn6ytMgUkh$BkrL-Ru8vJM_|IyZ(`s3uDf%_nO zoJW0LnM-rWT=3g#X!&L3kTVO8GUhHrY0&t(1Ylo-rd83|@c?0j|2T!f>_}dCJ-814 zen>a_aZ!~sG~k2>XlL@?5gk!qH}Qior>Xwp7*DR{EdEDLu;hTyMrC+ zh4Yd}$}xC+!rh%)Uxa|Fe-g;OAHuIv`g!@c&#%psHkaJGE!upwdXnjdDsNLlF6xpL z)nwGn)v|DD$+&h|Cx3k6XN>T|LxTy2#k?#(a|jl%;pyt=@2?1>9`_BuESazC9yrwQ zU+Lak(tq!TCq=~6!_(kAy*Q-Nuit8B^-_#6%Z1!qR#Sn;Cf+?0J2?~GHyit|Gc_NJ z{$|iIo@aH;lcG|GPr|fMH%(J1gPx_Cstsm-X{bwN z;!_H9D__m3=UMj$_zU!hXynH_I;}BQ+U(TocD|81x1sB)r*r&PkIuT|pwd|0ZB%BR zbC`R7f3gtqcvHEP1@JN5UH;4rqMVeeg|dC$qVXnD)ovwCn!-^FBw zGZn!|j*eHN_cySee$O4;ji%c^2;4QQQ>`#}G1!XjHaosI$_I$FZ7k}kf|^R-W$|ro zE)A>QQzCjMlZ;eGz?Vw;_Q?8LL@L7Tq*?r7Y9Fyg6-c@0yN^Z>R3V+gFjn&osR!;>Z zaN%?z>m=Q$C>4ZaEAFQnHB~%-YUx9tqcndBrTUW2O1!oBuvpXk%tl(=y zy9(fXZ(2iYN(i@nzuK#3B&eM7wM5*ZMqK^(s+R#{f1V!JZ@Oi5yoIkOi~Q+pS&4LM z8DxXVAkRCyc^F*t1ZHxVwE$aUNkaeHWP70fTza5=_}to|D31Q-vJ0Q`cx1G%w3Ofi z3G@}}-SSwbesko_*j}O7<61&qt9xM%hXeOF#5a2US5kZWE!wu-tW{N2mDm!V#0z$& z_xhCs3~dVgmSX*&E^v4?s43IWnHs89iGdS*M9+ME6*Fjv+p@ zV*Y7BgbHk zi8D&lnVK1}Q`J48;$MSEzEy|eOXwvXINPNh{tfNi9B=baC(&4dRlR;SHL5fvME-i6 zEaIacKiwQQS6%TIlQ}wn%ZwkHlusY)N;F#hxZ}<)sX2-wQv0jZpCe~o>vKLEm6u;? z>GumL7mMlZRVvVekV#PfLilKgH=Pa-T@^U?{8DTIgpV!dM8BaDD=%iG5v~d~?r4b1 zKU7Jwv@x^-%^A!`90T;XfvDfSXBtf}#MCNp1=hX-17wufO4ZbAK;nfIUoTh9G7~w~ z0o1#o^HTmEGCg9|a-E5%2Fo$oCVK8}xVp-O*22P5Gskg;=UQ73lj({*um`T*>fG*N zdKLYMd{DrjhlXl;%xu8nRjEBCV!q|0X&T8}h0|-)v^iRNn;BL>i+5qFe$7(;MzxBlDyhx4KQyMdeN1Nga*Ax?kMh)mrs<2~H$Kzsy3{`UPWp z{$6wEy#N&3c1u|K!ZEYV-ZEue;Y?9)hCT=(KZOH*_)>P$$`Etjq0CnRMP_V;8xf&U# zPOnEY%5#L>dzvfL?ySKWNQ-ifRuV7Gnl*@o%lAO+Y8*NprateYduu{_s9jm*AFWai zJ0|tBHPmWg1H~(btY<;L5#H`}j!b}aXqBJA7zvo$Gw{25p2EVe?wK7$EymPA zh~BX|ame;JPdv{%xofF7#@%B>Xam{|`T^ap?Bg3@p9^_x05 zM@sBF{-`4UZ2OlR>lrsohF*~jwi?J&X^_p39J`HG_2v5Qg_cmQSM_D#V0Hy0TphjB zv>WjFzV)D$nVhm>Dxm!AW?Z?oEE{vFyZN$6c}m0a~031Mkf zIlJO6uWmN7#?N_80)$mNOKY$QUq!%#e6HhSyn3x5<{!KX1o+O7Zj!^IhVog8OKs{x z7`<d{t1eZtgW|(MHl&?ow<_`H>$3qHncx>Lr zkhx`X5`U7m;s4Cb+(I+!O}rsyPQD%)T^AZ`D6q{yM~D&XsLb*w1mdy=chD_gqErtZU?`ESEfFlXqNBo$~3Nfv`#H?uikQGFZ1mLZ~Cd| z)L#v_gB+Q>RnhmMtyH*;F1nS`_Z?aD@c$0~bV+9C9cp+s7r(o)#pP7DBrf=FNhjA@!GXBmB z|GCexw>Q+p!e{m%5v0dl`@rP5UsfSzafzftF|7+cWGehjP%AUj&Q@2$nqYY=ZR*O2 zj(4h+R8w!5CAkWNDJYbot*j(wdQsCFYY2AJby}zt=W?*aC+z_55l3!w ziB)Is+`y9jARRs8Gr>XTg|D_yMQn3cMv>rep1U+?V7m_=$Mk^e|jUgAI?%T*>498d~?M(S&K@&Ot$ zTIW4HJl- z)V<1ITv_?b3ZDu~w0N5!kEL>S%hm5XugJe0tQcO$?&MY7JxB?h6fGPp;u`$Ve$dCHhABf0j-tC6a zp1xH_kx*urLH-+n3R_#JgHOy5z@ME10+awy7eJ7y_3-*9`)|Jf3Ausw z*cn{_j=}BWt4q<~unRpsJsJC)Z{FMo5YzBs0Gt9KHc_90nlSks^g7OCAGDg9Q4tS01L3>Jp2j5c>G%rlhhc+3w3h3%zg6g0Mm!_ z_$N*=a7jZ$17Hz^8UtY6%5+z|%pNV2%Rlx(jVA`Z0E!H_LCF0#cx%{dK4gR`x1Z(@ zh}IEEQ#T2~C|#2!Iemu93%L(Ha=!mfv|VZ&VXxWIxm<+RKpicl1(W?O5ULDXx06GU1Sqztka9({f z^#g^w2f(_rbsG+xpjLEV_E+AeFBjt-0jmU1Va79-c6J>t$zr~M-~a~7Y5I3G(w_C< zmxD1#{b~nlD}X&6AE5>92)isxTrmO^tf+Q#CSNy6+PZvrHALpQc7C5*UY}diBo3R^ z3P9(2m~LCbUPDzbAL!@SAmDbtOViqpk_TK`fT^T*X%2v4FUQ`!sJk?>5V2m!EeG^w z08uV^|2_ezEr4#Yw7h(3;@ob~5pM3odyE5Le-YasjD{(i8y}jNyFu_*uyFUwu-e7D z0IcZKc-0wi1_E3mUNn94w5{0p(D3=^ayOa)m`37&K7}>H4fmJrRngXgbAdO+-BWss z0^dP%$O3&?0=o{X1mfD@iDzkmno~U7VKDfRVd_2%8%){(Ypj}RvKQll`R)KY4WTFR zwU@{rKL&|$frxQVYu2Z=w2&t`q2Bl!IJK_FSg8Tyg;S5i)Qjm4$(9VruCc3su8Mms{gr?Fk)tz)SG` z#>~P3xt^uGD+*R$yv=FkgU%L&JWx}>Y2Qd3y}M0c_SIVV6-rguZ(`#gL(nL2f)8N3 z#~gHwAc2GT_VW3kz{X(51L=a)02tNEE|?}O3)h5e0@V>F5)m{}ud&NsAFCX~>~&C& zKM&fyMBLY68h#PZro$0&arFW18@I;CYfR5@vT9H~5GZsIfOH+hiI4lr zmvxguc4~ymVSvhMt!T&7?5TVEwTC}EjMhsj5ctKhExU_N-*`O+?5?P%FTi)VBR%1Z z0&oOx#P_JB>FlI^RCns2T=T)aTHE&`zH^T)mrwNf*KL(Q+AHe(yZj6We-h2izBeIrjS-#OBWCC3Z{D~ISYWoPVhkemP}ITH<~iW>uE9d18DH} zp!pK2T?W|iLf_VlA-d!#W8uzHh%B~#n=-4I12FM8J2UP+>%gdXBU``QcwOh=l&+FP zpAKB};?GZk=EM;%0@vi|d4fV`+OSXoqbmz7UrGS_1?n?u&rtgFDlpXBTMF7SLjB!H z3z67*FRvnK10B9dSq7pZxJ0h8N5WpG`H#F9$|Mop{|1c00`^>9y&?O$@g!7Fd}l&F z?d*&pNx0^7Ri>&!YO*8%r97WVJ1eXYhg?R~v3Y=<(MB8FkC4?i{l>T|ncB9Q)}u01 z*_XXLwml2qffx+Iak%t3L=^Zn2LLH-7x%6L zCIwB+OZ!7mf2?VlmnWXyi*QetMRzb`+=CsyK8&m`jD?r`@i^}`@L7gFR>I0E>#8Rg z>47&1mf)?;)&B)}iFC-C1(*tQc6(%Vx`M88hlF(Z^d#3U4$>wlb!*ShvYIqlpUCU9 ziCq`4<`$g273MkDzO2lizRhl|(0Ya5BZw4dhp2RDLF{}RQXuSD#jS7*^Y;BNC<#g4k;&$FXpGd)-oq8cD*^i z{uV1nDKp(WBM zU0ovw$`@&qR;ixU7G`*u>VJK@3JB5t@J1Z&CI3>+1?Av^5Jj|+Lh1v2iMg0zFs)QZ z9G%u_!F+WLnxlB?YVYHf6r&fCsR3?ZYYxq%I9|&Pp+jN0Yv#$D*!p!_>8-fD1)+KX zYiOSx+nt5u37UcE&+M;)8lnu^Fl4&@&~C~0Is5`kY?EETExc1x&$ti%mQrnFX1XM3 z@F~hP?_OQT=8N@R>3nj$1V4zxWcD>wg4guyl5r`3O+82KqL1Q=S+XTw>4?GQJ~!)% zZ>44=3A2%7>%xd3r`+PJZxV~3iqk7DsxwKY@6yIAKkMDRoOIOx4@FbGJ2ampqP;3e zFJAu(r6=F9SH{#QU0< zms>6pWP?y*dg&SI#?+B)81{nuO%*~I>SUTuoO=Lh%Zb{UtasNI@a<}~CE-GYZXR!{ zRF`QfNHI;;mTC5{E>m+fH$eE@>2Cj39;u*~+I3kcz7F-m>({MXO+osXVam98KD<<>$)YBqe?6iWQlGUQ`MWJIAyCR(`YrUcms3pZ`nq&?($wc}iR&L# zGhVj3BQ6n=QvV%y7TrA=W}*Ew|M4)bDk9u@-m1(aT?%Z1Gua_YT0c_`tF|>J#c=~e7c{I6i z0NZn3J4ZqYYYbbrNj8x!>=zm~A!Mrd(hxGV6iM3&OWnL3-W?VM(jOIu?h>169o{Xf z$H&jZjkVZ|`AMm(Q%g>ByI&hOAC6>eweLQUs3YTd=gfs3JuB=m6!vJUFp+gT4@th* zS;pULWRy}e??iL!Y`|HgIc0m!+>tz#(F4A^~==QKfs&y%qWEVT^~O0tMulc zg9&{Jl;^cIY}ij4+?wO>YkM(D7iaG4PeWGozCQ}EC_(j#nD}fCsVb|y!Qmn_W+KEI1 z5Z2Hs`vH$)7hS~c<*m^W5Zu=?WDdN!vV!&??z~Y(UZ$GVNO_)oRaa({yr%U|y3t_( z<{8zzz9pT5(=(93#lcxUm?#7ZQG+qgNOwsdPev{+5KX24gItc47*0^j4Y;9 zPvr2E4O|=@Z!f;M)06!Muc8}sKI4wnU=mkBYk_Ay_qSLJqGpx9U6qI3k|*DMKfSH0ElB54As|=PA9g+4!o+Wnj8S~+S-F=Os6ZL_ z;Htc}fDEZ~VJ6)|#dAm*h@F{%`9#{5CqH9pNG?A~BsUa_7d7tg^IGVv_=BG+)%~Fn zn)1TKpuvhsQ3J76`E^dmU@(QhT*f~0Q9EJjTm8uo=-bnvUrba zWXIa%tHKK(+mwrIb80)+NCm4(lu;2@!X+828mBZ3U0g2*UqAgK zz%>tkEBd^4w0G1?s|Qt#qwQ&_o1TBdZq-zCN0$CesF(5RH`+)0!)lpw1vz?E1#YtspP|O{N}HOySysQ7_cIEYmo|QSZ6I!u-sv>E^&+n|zU*7c^B&A85+w z6=mAmVnZe^-CYB#90~2NZY!CC+J-IPIxljI^czF2zhy4$NNTJPgI8HtxB=XKEPOMg zTQX!(j4)e7hU=o@Ehbr$6WuZJH%-d#;x%eFHDl^^cDEjB^&ZF8<#i!sC8tv)p8KX} z+6?3v?ciP3rU6v;E@->r07AW%Gj~987jfNJ%63 zj;y~nU)rCb!-^8tUPp>z`&3lk_yy=)WV|q2w=TtH(`WTo{YiZZ4J8r@*Ry|#b@BNw zXdn$*duAv6BCGp}bWY-CYF6%N@}Q!s60T?QsHtOOqwxKOG`<%{3L`Lz3HO&=?zFVM zcPQZ(=E1JO+0P(}wCLQ3-IeB*IT&7OGFrG{!kFL-+_sj>3a}(T zjz#;s0v`A+Z(g>N%KB8+pVNpq zD>G-0dwd9|J}D&?8_nn76S(!9_-n{i{;3r6s7+Nuncm)3lZ&gs-5T)8cJ=>lK*J6` z(mPAYaD!EN+DP)_<=VGa$9X9$-y6-93hTFh?f{XICI%}O*k&om9`Xh=FqBKWk&91f z%k%qWW@D8{`^B_a1E?#w~+wLO%00Kn4EmvZcpq=2yxoR3)U#vVkSHM;oF$T}|uy>S$0Cm&V+U%+cS?xQmvG^%G zWP5ST%J!r;C3LY#vO3Iia|OH3Xm~1A(M*i3pWU-g0CRe_o82QffB4VO31W&+HAo;!2e(*@jkt~fBFcp zWRudU?;@vA$Bqp9P*1c-No0uh9CwP+R6b=Qzy3s__AyG(-z}i-U6YNj@J*=k*qBMY zMm9l13Be-GVW-(^Eq+hGw9LYyvfgDHLiy_UECIkW zY~=dq`k+lS9c#k5~9+e4^02@b?;N7Qd_Z7JVM(?o*-bG@q1l-yiG))xSVdo$!gTfUC|saXxeQ|ns@L+mPWK5b@&(Zl?~?#Vp=v$U@d_Xm>0 zzD0`x)^~ytu6HKsAWMZ`e#}u^F26NiRZviPN257mjBsW@XhvTj{h8B^W849|%ZxcgV8CtH%2g4FT*AO+|6)z89sgIkj-H=&)MK8b~ zjzA#P%*dODD0z8#A^T2FUk1+9O-}EjIKY~P_h%h`EdCWk6hk=i7cXqsH9uQOXI8aVz!aHkD)Ymc zkHEQv1@yGg*ak87{#4m;;8?gG#z>AwJ89BSmF9i@%;5F2agkiKsciD`=l|C4NhuAv z9UT5o-;rdnCXSQ#($>zgBhM-}T@NZ?{?^Y57+zIXgWCcJ$t+LsYGHj?r-6fKo`EC} zcXwl8fN>j}J+B|%d~t6O>*-zpF?!YfZ1VSF>YKURWQ}!MV0PUus#`|Eu_UA{%ypSl z_>a$zC%tQGYKle4Qu-DmEy)v$Uz|%6w?o1y1_!d_?z@Tr|21SSAqd-#G*){Fv+j_s zbp4)QgrxaF14KS*sTiVmFRYKX7#%EOm^c46u(&AIj}bU$&Qiw~D9?B`bAd)PL++tk z07@rv^T#OBkmdMCWF4y=HX{jPy(lnq&)1^k2=;^`>~4Aaz`Bvk2vz)yw_&=_C>vGsJi6GBIkHe0|F z84J01yeDYOQ|91@4Z_+#VCIbE4Sa4Gk^c^S24cupxXoa)N~xI^d2tw-Z4sl*=u{n zNzpu)QRJ@qpw~uJc5B>@)d9XDZ*6jYrh3F_-VP+#l$B;oS*iTkVJ6@!jOh#ZA8Rd% z5o|y8t|K}7%(1>EnZ~Y2XX}2Wm{-fbR=K)w%mfZ53r;VI+H*~QQgh3+$ydCoaU@?y zJy0j*RVLDvn#1U>&Ed{IcKFb-U#m~Yi7A#?;N9;7+kn^8D{p;zp1ttno?Ped6^@hi zFU+0Ep`@{1MmpI0bN7!52zC1vK0Xfey_W4LRWSbq5&^&Q;r{K#Nfku@JUwY-Daxo7 zWYv07e7nunw!n0SNZ3iQ+w22NuGJVz^w)b|%TD{Z?T7pEAETHOZEYUD3apN1Ac`H3 z*t>@fvhb_#rtjZ^ z87qy*p>q}*k)d+X`S0u#y?NGCQ-i4rT4@8Xh8|uo>|(v`xcrY95v#F|;ymBzC)ZJZOFo$edGSfcx6)B_UCKMtIM0W+GOj;WZ{lWGqt1MwuQwW6*;i`)@4Ed z5$1H~yD==?JOA+4=_8O~5f9{BUVWUM)%=~}QvUeYye8i>!Y{>tw}M#PHzmxrLZ{kN02hkGT5NH6$c9Yp(FJ!3R>!)A0XPj6W;7UNKD zafU*ztgyEWhiK(%5-!D@hc+%#ERlsWhtIlVnvW=sL>T=B+3EmXoUtDU-t#k~5ceV{ zmGo&)(cW{iIHMtj`Z7@K$~uWEXsS*X%eFEJxPZZZxJgB$O&sUeqspwzie}6z7jlPX zv=Psb#=g|Zzlqi9d4N=n%QDh?+|+G&A}sI*DoHBRxH@{8nP(08TYD4t*CaJ|y7I}s zd1ux0xTnY>#AP2+1#0TaVZ0X@10*y z=}yc1z3xeYvWjR7P(z4PS50Zzw*!&XJOR-o7weK1G&ut({-vb%9Zt0Bhj3T7ghRZ z3Tbg0{#HqjiLkFVXLwld?!>-uj1p76iIZ+TWB0cXtcsOf3_9-l%DMW z=#K=Q-!zg%dOU(`?CE{MWo2qKKd%V(k=gDU)3IsYv}fX|xSeo=DqdW^SYEcRU72-7 zf2r3sjW^3V;6qR$I^{nw`T8Wc!rTs?=Vhusb}XBmC7sWu3G$~O7aCNH<(cHopC>=j zqh35iqB-5Ql^aAA58;!VF4XkktTk=f;RVV+yD!sj-=fP5==-f`d~6f6yGPRpdSQK@r8ypz_QeJu#d_xbJEOaZa(Nx zz9uSg+^Hq}9_j?6DuAUrGPJgEQfKCtPg0&hSptD0(I2w;6~}2de&y)%?42N*qRNwar{gOO=Z^#G z{~SsoreyRFOcwaC-b#?l@>f}fi_r^>_`<)d;NC9e$w-GoV*3SY&!di}rt-5FJoF&8(#6l1NVoy0?xGQ!m={?l1THeXb`BUazCrgr?V zyN%&itz_EPnuMmeE3;yf8V zX>t{gzavdYy130vZ41W)e8PDo0i{ADr8*{(0*JbGRsNRbnPZIG3fWbOwZ|^E)L_QT z=oMx|5fRcuHtz4Q=UGTe`=7X?BAhbh`bEN6e$ng1SgXqSr1Ch1|L~{3Ytp9&Q+t{O zwN+aRw!hi5ISX_;*%de_!e9jDcRJl~1 zdWkkc6LK762-02sLL+dkVY@16QmfN)Y_pfZaX zo4BO{A3F;ePE>_hl>h=?zf|O_cUl+>$w{xkW9E^Q2egZQmNNULd9#$zVZC z5+N5Z5qd0!?w7oCz&$RqlH%7@G!+tsVIPGER}_!_9NpgMzuyan@qSjNuWty0V;{X7 z$Dzg@tu?n0SL+E&E*AZ^_1|Y4X`;NYp<6JRK1rG`X?c z+ds{*U>T%sxs~N{KDueq)}*iPY_jTP`Ma|3sB0?dO$aThF`;GxmXb!i6iRs=HsmCH z$o{bBPI^YW#1IGbo1pXgS=C6dUR=@)exuY&+7!pEsKfeaTLPcPdp^( zR?*7qBXi*|HZqMa6WVTDT?S3GjErh)Qm3XAu8m-xCRpDs%VkB|x2N<~7JfV$?j>4S zwDI~BFUcLL2Vkd|7}Y;S`o>pdg(*{tYKnOUzopnl+SpOz`f1%&=U2&=lgq)A#Y0XO z28b!B;_59+?$9HIs^vT^)*L0@D6~AQq<^~D)u3a{YPfISuQeyLm@aTyotfBVV-nzS zyTl2{ZVRpHp?-7D?3pvaoInX9109Td9%<{Dr(Vvmm4RVHs?YE~R{Hm$Gv4j4 z9@lej-6@rt{x`jkPH4B0H}XZaIQGRIQ^_{K43og2&f`P`7P;h4>rFN8qvGt z8?uImuIz@% z&SdwvRr&Sa-Q`y@uj5^{Bii{&zKwvCLiGTu;4k`lDI|u|&q)6yp zIu>9+0SP7aNC}~5q=g<7=}jO3>776*p$7sa-vM=W?*CnP-F4TyzI(s#ESCYY&)NIz z{p@G&{rf#7Yfpik)WkP7Ufy|uHyjzl!WO-FLegFA);rByGgo*1@Z}@O)~m{D4erw$ zMK?S!z9x#XM4!8>ZhmqI`XM3&H zfcgsYb)D`*POP<7BzF&gS|myoeVKOha)0^=vPzM;?HU|&3C#;GlE8vr%Pl|Bed+vq z@~Y%8vdDkq1$PXQO$$01FC(lS-LR~`G8fo+OkpI9Q(gD>+pY&o@2$j!F9>2G z-6)yO@~x#REDQ4J7dgNp6RZS#>^ok$1TAgzo(jiowrI$BaJL=}l+Mp?X%SHgzvsdLkmv(!{ch7ZZDb|3`P1Uv5IfZSlv@(9EGdXlYxE`Fc*EPjZI#wGeCR!kVnY60275E87ymB(k-*#b2sWaO|^`ZHU_$iu*U;O9$U&& zJ}~Lil9zK(TQ)T6x%0o!m4o)?6iGz9fx*V7v*h{JCX%hYc%2EU;XHb7&2qjMF^W3Y zPctwG+^!NhP-BlGZ^arn0~DppABT~n4pmznd*e5sjB=k?E0Gw!X7-JisiL+kIt>ZG zA!ng30c=9P;Ydzop=1|B>)4A)S`|h4i8qQkH~5~J>-wG1$jke&b&>w- zkT!7Ya^{uryW6b~e=gac_o@9jmywA=@kJT==&5|`e^l%u>rd$0x4#C~{6jo^FZaL5 zxcoQ6Fg|fMi3Q)$w69GeAJ{DiN;iq9si~^Y&7%+w?!4a{dGJ}@v}o%NC>fF0Hi^op z-o(Vjp4Qf|Lt*>@umI(jZyoGfJZn0hw?j*F%gSyK*p=zSzu8F~J}}Vd6acu_nJgGR zZ!atRk1v@IzYMu^=%8?T1Mr_m-d7k;^ofImf`;sV33Y{urb((^kARjAf{!I++2mp{ zn2E$O(%5!R|IkpC^FDyBvh_DLHHj8RMn*b9uuc;n8#k@Cv}lFE48`VA0aIY&ZZ;Y& z<6*#wvEBcyXiNF>+IB;IYjvX+o8{=Y0IH%&F3*CMIVDL?1Zk#K=XZhcV`R#a3&3d;uocd#My*zZavNCo8)@kGEA($@6LYatG<>>7{9APYeR-vXS;f!S^oj_{u23dgq7BYyIul%>V);+!K!p!203L z(4;5Dl!eVM9ND>Ma6Y5dZ@6$%jS%IOB=R- zxj|-Yk`)G`vt6V^CO~7wNwt$4I8G369|$>GtK)(R&x314FKA_&@hLL3=d7+-OaDE~LZ3hY1nF*8G%xNlh9NRD8VX5O- z>rp`~!A?ybW9tWe6WWA2%(AInUq*c#<>7)@Q2ln`sJE@**zPFesnzW9g8XXCQfI>L zB((v%Ep^|cbmQj$bNl~+9sj$Awq{m1SAfan=K8gk`FmUdM70^`-k*xCG@yH|3hlWx9D=+b~C?8^u-yjy-aQq0}GQ+=VZ0FPXdmpd#M=+l0PEZzZDQjsU`ALgn2 zv)}{Y*Gd2NHAcbrX9A!9+wAUtv#$B6N&la3l#}EQOXl@m7R0T70cJ4!lD?QYn#jlj z{tiShUs=%8YmI>3WYxYo4j<#xyveL(=cK)E>mEOFIjHhUD>KQ$q)Jckb;gH&AV{OjveC^>bM^N@G;Y%p_}r5nggU05>z z$-d1@xIlwOYEKTDDI1d~SEj54UVyT_9uYvbT}~>D_Z$}J@GXCG}A9EVW*)I0X4z}uM^*Fvs`Gu4Ji=lDMz9-F(Z^jU4U=jA6Z* zy?_h=x#z64!xSr7PUXu;iiu<0t<~E4{MjtdGHhRkUP|SfxqcRa%b9=u1;?)R)U7t# zHS}F&hznbRON+ztKM1p3HDxJ<=cq z!0c*#XAasAy;qEHspg&b*AZBu6Ib57Qxicp|l=pWId}A?4+&zKo1N|RH% z_aY*me#f4g+nDFNf%Znp=xs%{7^=0%=EMS?skdAhpKDl>}d@ms_w zZ-VqM_Pc!q<(=B8^etjUfs@@p7fErpiesAi$vNi+6yF-VbWZJ~D&1rQ?`v6aDsI^R z{obA5)9C#R;}D+{%+7|Ev%;+GY~9Y{8-f7~Q*3FUMFaM7?NX#EJ+jYqnM`zq{(ods1a&^Q8a(K;T$M;K$4ZspolesFmsYjwD`ok zpsgN_YTB^-_!i{qUSO1G$&%*~v>Va7B&2H?|GD`~F{_)m2)ldE)EqC8+2F~Jj7!g5r~SqC6H|PA*{RPt29`L)uj#F4gf;XCN&0|qE=SkE`YnJ+R@J%lEr0bX zw$H4$XeIUDyGz^}f%N~pTvV|GE9sXh+r8$VCM}^6V zTn2IUS!dq;u@|!ugjkUB2lmwKwehK+?{%P_>&P)k_K!|4yhZxnuRj@XpE8lDu;9Ps ztQXU98Uz%JDvRzU~4feAo8mg&ITS)sVpeCQ=DK(}8Dqem7wroeru4K%S zj?v8(%Ki{)z1hAP?`tAW3=L+kHoe!|4!xrDcK-m?CKu5EUL$jS7#xI+?^~PQYCFfy zDvd1nrZ`BVery9Aq#>OWttPUGrO>&RJL2DpT%(nm;x zTJ@0jt4-i4ex69wtIjT*E1hOkSu?18(gsR;TlWi`M6HB;L5$s0zWpk_9 zP2Xwjmo0&G0T6LZwa@j1)fJ(t>s#JeFt;iaSe0&1tMX+jz562Pq4S|7{*A=_=+o1X zyF-_UEwE0kzFZ;X6TA$}yiu^rcV$x}FLuO_aUw{&>pMqTy*7Gwd&i@jreLS!I1n1O zpoj1Ek_~6VQJaw5&5zb5Q`VuGW^vnYupkQ!v$#0;f;p#CzAb*)B0PJHE-e zX%Lg2_uWYEQ0~TqKk3iXX*S?5>3kAKFK+LICxH@KWpiK{`S&YGZ%$=_NCOV>T(Km- zo)=c@>)Mati3T%0tQO!Cw`)f>nx8y~?V)FC*WfkqXbXFo8}X37;O(%wX~kY^VA13; zN~37R!o0dlD`T#Yr|xR);vj#QL1U+lhu5MW=69tM?LFqBnnb3> zI%Bs!4F@V#P2z#vj2=&j8Dr zTXCbos5&veodFCA{G+G40iA(jSOYB@MFJ-0ZLV0Acy1CMIY&n?8g)CW$v&*F(TJ3|eba zu2}ne;k|wAB^!S`bYf%Q=mftWO3y?H0@E2P;rU6a)iFK?Pz1;|Twi+Q``^L|d<j)z%khb^11`BjTxRCQbyi|lOl9=+FQ&yLo; zr1q554ND}Gp>xgZJ8TeG7VfNKa~X$sglV)35@A#krco zavB1t7N*>;mR?3%yk`tgTPhd5ZYaH5(+1W2b3AsVWU6m^T!E9{&e> zp9_yp&&O(I+oMszx;gm_?tH)Zse3B97ME4~WB2m>cW_P>`P28bxQy4H_1OmS@;>5y z6cf|dnLm2HN-Se|kAi`Wj@f$8s*UV^p{3V!kb0#(1=;zrTg1eIPDVKw0rh}NX_dR( zuRlg?LDYlP^v9Wu*TlR!Vx-O&#G3h=y@bGg{Sl{7+2*U-8SxBd*YRvj*;2wa)MAq( zhDYYxH{=N*uNkYp>Mv@%vn~=DZzp#%7%0$IEi-J1fJg#THq=!XO z-^D<$Ne*#ThF4NDC&&EGV?@SBTseJ@xHy}~D+oW10}dWV>v|$^7h}gt^x`jduh?zs zW$pQ+MT83$Rg(tgvKBvv+4HAg8t|lUk0Q${q$JRjisC;NEaD!$ljXQh&C_kz3N?s zY?J5ih-n>>(e$Y05?DPwf{V#e8eTGD3&c5yH+lCr12e(Q= zz2NNo=BBF;i}$irVuRAxDqifZzPi$8cFpHHs=6A=WM>}W@vi|sz}Oy!I2t77;~uNA zRpBn?j5ZFTw`%41wov%>Pw}n6#=y)A)kU-y)*EcUjgL5`l#@}f>>i+JS)Z2@rM|hj zq^mJ`PeK?sfZ9jKC{)T6-feoz{W-tP@0i5fP>=~2a&t6qKgd6P!_!9FRGy-MC%CqZ zIjh#Eme4mg;$&~3i=H$uF*ZZzaoU2ak@x)N>UEy9S}F5M!X|8Vn~At6za`M)%2G%X z?3jdArifTyM$JnYs$1K5GBEwvNF^+M1iqIgvxB8MdfPkQ?^^7b>yRYHk6&0nuvl6EevETpLxM`$QX*4TO1WwG`5AJBH%k_&CEk)8fJ>RzvB#z4t(M;2 zj1KUsou)0ZynW(s_#38N>%XrxIkhcdaMjl0_b;VJ>|^%Siphp(P?1@V-@Y=E zOkDL>4Ca2`K<0> zWekMOIKN=>i^C<^-GlQmNrpe5vBaf3|sJ${a>q z+_}usCZ9s8PN=bOHwLD|l}$~Nb{h9bg341l!`sY;(i~5noKlwR7W5fgXI*{-a;588 zKnp^xX8A{4yUrP&3phw(v9P;PCDD&k)u6%XaQ(bM1l9phk{Lk6Xo*&W=3$^ z%HOEMR;hW8nUJ7P8B?Anba(7oTv|I+sP8bNu@K?fhuXIs)#u&RV~tKj61s7!hQa-L z#;%)ut;pV1uP4flzgqsZvk5dlOT(R|bHckEQwj&=TeS%yY?^szMH1CPB%AIi6R-o9 z*H!1B5pmG-`BYAH&XuGa%GZbV)tu<}u02cTd)O zY`TA9uH@qW^{1(N;EA$w``J;BScPDBxBN`lRI`)M4947B;=M+cu^60JNg&`p`)VF` zY=z!3wS`AIq0e_9>J+B>`QKaYL#T51*IDOG?v^&b-2C@eHt~Q4EQeD2I2cR%s=|_@ zK^JsLn)#!aKh;h5uCc7|r_4KtUj-T;2Xx23u0YoR@F&r{`j3tD_oC4M^d|}b#}N8^ zq3nM=X1@Q04*Z{pqryK1-rq~%e*Ir+)DZE&etr{hO6j`LthHJCfkUs1OGd%K#J&kbUM}j;?Z?B`<3@w7<}#zvO3*g>Lxa;hTAPbevfl z!WbB194ZRCHg|l1J^(D~K~1v&r7a^<2soyUj+$1CILKc)1Jsz4lQUo0_cJsTxNz{A zbYSLF^em_7@gpMzcDJk6Y=O#`mX?T%icb_YeZdBj0fe6;$tFtsjt+sM2D{qvpF6 z``03jUyDd$OT8)}eV;#T{#W0>JN@FrJ0QAM8esK7(*EA!gHKJl1KH0$+g7vz1n0t6 zee)~&S_Jp|fuItvT{xu-Q%{l5J8<*+acP1MZ;b}VQAt}zM<)gJ^E=)tIG8W*)B(Dd zOBx8$wD~o<)c4!L_W@lIC=s8Oq$7hc`1AK{&wo*L*_RI-U?A3I_IXuR#ts-`AR-!| zAHUyy@Chy{7zL!*sS3#T(zCZ$4aANTPslPPeRI|LT2xcc4QR#in%z*}r%(55+78Bz zIb0#OivVyM{>NW_@c!;Na9BQ&H3LBJ#^Zo=PVQ^dO42|A0SVXHHwW*IF|r#1vNrX6 z`t+*Iajei9;is>rrskgauQv4`eT1$ zUuPgN2>~Y+VEkg+ER}kIxNmNApDzQ`N8;blI@Dke${ih?xbw9u0mKArs-RL25TtQI z#nh*X-7^~)qUU!W;ho!x`XCD)RR$kpVHQJWYdd?nwgRUgEB9$0bQG<@49|sbFsJyKeT(ihC-yFl#xY1njgS_=D^bopkA+c6`X!- z6o-6t^MS#?l=_21P19mOwv2y%EFgCtFfa}epI;m(&g(=lS?U+t8@sx?=0yPBP_e-5 zEF>1%Bxb$%Fb+=qSzhTJxDLb_^U81c4~CF>${s;haH!0EdAP#8%34|FZd+DX7P#qZ zR5Q5nUnDW65?Hta`*kB5D6|KN2LlGKd3MsXkb?m?`BzZ~;lmo3dqp;pf__Q?drbj1 z;B9*UmRP5x$G~Qzjz1?OLyn!D{ePG?n2XrC~_`}aCY zmvq3zILQI~lU&_P08=>-`vh*5#+# z<=j;+7S~yHY?}hDZkP9RXk_Q)s3Zj08jW-5WqIQVne}~3p2?HdHt*w@***``_v3y1 z7eG9{ELyf2`f&a{vD{}m4_nU0F6e#18(uI-FV&OgF0_bx%^EJ6lT&J-V{o%Z4coGGkH8KhP#3Nh3aa~oi92@u!;3s<6$mSy?iFKaS832v-?X#ySOZ2Hn-C? zT-z)|z4@&cMhW+7Y=6{9hdazq<-mM$ipU_E^Q8RmS)5S|HtM@A!0;VawTV~iUtlHg zhMyu}tMNuxAA^IghBf+#NVx9Q`c%~FgXMMd%7oDE;dy9K?t^kAwW#b#AW$m1T%$bs z94Z)}G^d#lPIuCI81)oVlOWD-&tRe@fKQwI5bcs2O>}?)%XGBSt_z4fBz$qxqXEZy z8gwZ%H%~NUvz1@nO618a{JGb>L`1)Zm9nj9YGJn173BSVy@{;rLB^6Xmr`MV&fQ5V zWA_wHCgSO5?K&*Iaow!?I$~+7K^=XjINTlW)u;D?(%>Ltme<_i)Z7c6O#mgmO!~(cxCZ$f~=zVB}nB{#8b!N$;kNHbp zAb+SXrqAvI_O0>eaNomwehCS$Dz@;)>DudYJF-E&YxALpHQ*u~IR7XnyD2IEomLn8$y z^_6*_2Y!zO-`~iYjX50=X)BPb=`{1{&GqYD&Fo5ZzQ;ZW?NzrwfSkDJ@1>`C9goiV ztwnSc)oexP6O72KTKL#m}EVzu=7>aVQC9wDfFt`jvt+U6unuD)n5hWrwGj=K2OZ!`zhvrtl1RtIYHhe>HJ|;Ery+G=t|3! zvr_Qo$Swnxo5r7~$K%&V<0HroEH3=`A?xYQPdZmwQ^RsZt1sy!C48Q~h&J+uODIx| z(is@DVp;@v{*cBtd1_77NArP~yWiJF%!rvjNPDZeUIm29((BYvH>|jKM=nFUNWUoP zBw0+k1xeyh}GXPB$H1&6X zO6~^i)t2&m=93}zO>WoDm{NRS-CJX}-k5%9G|+h@1#4o7F{0NF1L9-eyR5>v<>0P% z3N&QHJNPGy(91*~Lx~k%GkjtYi*ATVBqQ|7?aX+`3~`fou3kd4%>x)Ox(kJuEED9B zyv5%n@ysfc-GM$h1SM#3{~f^27!A0o-LYQ3|)S^Q>h+C#k?E>?G5a)Y2UZuh0z z5H*_F8e8oS?Ccx{)|qlv@87}p!Z4Ut=-bS9_w=Vf<_(PR{h{NJRb)kI-Mw{i1o?hB zy*|Kz=p6nmoQ=Pd>Sfu~zC4GJ)52O~ook@GUI4)f67@m?a?V1i)zJ zm*8gTX$Udvq-vy8ur9CtN?mJymh~mCdj7T#jWgbI9Sj$^X4cmUf;e3(?e)>WuJ{|5 z*|&Ls^SG|f2yqMAVN6;;aCr4Z99~+mf2D?z zp<LJD_e>B4C{XTr&EBvvxwVh5U^QJL9q? zp5JZaJpHv3hIiDkqQIo8@gP*xLmiE!C+<1uuLIRZ5r573PUT(e4db0m(Id79Y=*1n z{Oye>cT%+^7c*QKUpYLSUiYxNo<=B2gOhND@7C(UG=KA&5g6sKOu~^ z@K=%I=pr6V${#6#v9gzn#BuaJ?22X;ISOQ+g9d~kgBiOdjf^_+X~shy*Xpmj+OOsj zp1>{h@>`YzN^_0p{=l@x=5ne%=`d=3(i(GhC}+;a_IjiSql>P<5DdcBxue`}DU|4b zDTnr(^eC1Bxh>2;6xLk*f?P3QnkTVb!Lx36UIiB2Khc!r_N;?ZW*{On_%DhAqBnG+ zL_wjl)aNs}@!=IdG?b2g* zx-O!3nukMrjML>VxA&w({7I+==@$F@7totr9huA{Rkss8Z5$G^roUJY7^R%Zi%HRY z-!S>~o=;>Pt{Q6~r|8i-HVzX(rZ(#&4$a;AiQH1?2yUtp$y^@5%d)NY+Q#SpX*?s4#cZ*KS`-*41TQB0D4r4!f z$z@#@kKk84Kba70^B{u1DjlDoMo1r2!>D=z(XBH(_4w~|wY(iN-UM9bgiVpUFn%4t zDL4oWDlim|4KsRs8N2(jJAAfUTsSda>S|ZvG2+5Qzp;;@GVICCJhqC=;IGmOe;n`7 z^6OmPYG(dxHax3C!Ssuc|BCVJDVqlLyl$C2Kxh0J^AoIvIaMZff^J;l>>EB-9vg3= zyqp$ZaeY;O>N@wjL;|R-w@4$j8KC1}CO3$!9`_vn;q2t>|7*@}27i?`_;QODvhsI0 z(y95gZ|$Eu`)g(!ZPu07SilJ_O8TlkSK@Bu5e>w$w*FGIzAoIVcdg=H(Oyr&ybVh( zr)dISw^qUfGq7XQm<7fDHE(du`N8fD#h~H#LC>PuYDEr&G2b}>yMBQd$Kx{|R_-p| zo4=l{csIC6b5|VPj-a4M2p9U2j({-!NrNkwEeXQi00Qi z)YKQ=oY59@V{tWo{2;b9*U7??FQdf^Z8Z5FPZ}x0u}0dUqI*ACXc?>>Xa)GhcZSe* zv}&yXU1{DUzAuToj#BT|+P%9fHg?R@c)Wbq3W`g9NN!-#*#pDR@`-KyAH^~1sMtcW zB3PAMnpuX%5kyQ%3QqUdyT7}%9z!9==981%C(Yq!p^44dRzCx23!Zr5Z3}VAJ8v4TPVGp_36*wx!99%pZCvz=Pii}P9f3?phn*;5T_nX}dUF2K z;G59^(tNAq*~;49@O0bo`j;4+#7aXWf5DIEHVd4KX-f*@%2-2S`~C(G3|%#|4!MEQ zZO?LdOV4c7XuuckK>}{%XoPc%#Lq?jaVtnl`<7_#hxad7pB#f4Q~z`jA(XZwAI&^a zm|uNo?%%Q^lKZwL7k5GDMoA}s?YV~hyX>8+xxc@5r1&{_FA3CJxpcUL2EWtoM9sc6lR+Ev&4|SDHvd`*`qTcIe@n89u;s<)Dd$Ij zvIic|Itcg?$oBSU>MjCA!H;@AXaESU)C)QTPI=v7d{M;c0rzbN&OdsiF7vv(JFoc&^|LQsDEy)2RFRNO_4`z_5}TP~*?a6Q|4;g&^3R|}wjUF!MV>wxSz zMoi#QNe#T>)XoGe#ACzAT5 zfT|72$XK=Q5x>>npIbP8j-68jS~DAy9TH}xT~+GY)AQbOgU^@E(Gtkn{W>whONBgK zEFaf^008GY3YCKHn(q)rDsoiFkw>eLqce2n4SIY%uLVx|Z2zU_0nfkeFNqX4fUotrqc#7Alk$lD^QN`BCvHcPI%H3se zgO_aVhe6?RdN0#k)Q>YfVHJC?Niuh;VFsq$dwjLym_7Rs&mFoz<1+_*8{NCnJ$9nx z6}7lo%e?3I1&+r~28AU?^OhFanKAuPd*ynEyi)m*?T_qX{Z+q0L>a4pcuCQfTOP*w zC~q*7=61^+mH%-g0G50)BK-uR9De1%@_#WrRm~4viShB-p5KG*0Bv@X`x*>?-2T12 zv7etGWlmA{XSaen`$O7>E)df&`MX@5$VdiBWnm_onQM8xIR0NmejLY! zx4zb*mJ-8lmJlg!plRtY)uloeisauhLD8l==2m66adq+N&*1;x)V}7i9ikr z46Nl^+D}L|M(PmgZq11F*90Q%CmmqBnwEBUc4{|Wot?D=;3@!at$aNi3Lwdo=^K~; z8~hUGTRTP1rn|pl7WoKvSkIBKDaE zD>v7s4nodpxFoywm+1fKgz|G=?|3#Oz}XC067{eD9LEpmB*C####0PGx^SHGeQEf#nE(fp%DftJP#hrz!98>gRppgiz^f&2No^Iy=a zQTB(3y0?Vq*7@AMHPk^rIXooY^nBW;Z&1_rfX;auF!>+B!KE z=D*g~nmjPxxI+R_zX&V)?+#x_xJ|vs?wH{=zQAL7?VTpnZuY+(n;I(K6JJQlYk7+K zWfyGe9m2A|Zw(X?hA#OVHeiHD8MhJ!H^>}6#?Pt#fVrvDv(cQsN`kpkEK?wYs$u~~ zQ?kA)&m(`C# zYjB0CQ`1s+i)D4q`hBMJCbs*#C}UV#TFp;KO^EFwK%-1$lFd))1hLXOyZVzswa<)- z*K(HX84aXs7xp7<=N{@7q+)btEZYg-ohh~ql|LQSw#XW`gE=#Q5pZ*L<*&t&(U$WBN4n=xwnl~LqX zAkAc~3>B880oQ%DsWvYYd5?4N?dfX(?&lu5YWB=@;-#zs0YS5EV1q{v(B5_9Fd|#~ z{URj0XmVOe38}@iu);lqz+Zi{u&`cOV(LLLVxiZ7Yu@jSG>sMvm++1APw#$y{@@;6 zmt`0kb1cl$PqmvJzLW8CKd~_q`!1BTHmkzG|FWWI8*Q$B5bg_^$bD-#Lo(HejvrS` zr3SS&N|vs_>`<-_NIGT0tUZK-oEOZGGu_>IqBwTI9rev)*b~ zIBUS}W%ui&8N-BB1KucI;?<$s@AdJWyq7JKjY@h8;Vr96$iaj*`n25PrI&nDu>Ql8@QGxc_GIn31KxH`!d-_>-L4#UzOOd_ay3sY7pyQ4#m9)I-#iRU8z#TS*b$l_KX$VEAnN>qI7$% z*6&m>plGH+yUV5wtPXBeZBswPeYx<#Vo!_&Mx}w18crV>Aa63m4IUifS+~!3olzXq z-g6af@!9|eZsXY6MMvl?w)WkJu5cb&0IiF-pHd|N*;6nLp=I(coaO9E)4=K!igrGI z_GjM96C@a|EfQ2--IwsvOrI7>GVn3STp2~pb5Y}g&g7o{ce?KK2w_1{tY z5E026>x<%(^;gPyPQdF?wqaW&P&}B zy(Ao}axlhs%p|uO*5CZOpM~aZSl`59!l0u9)6t$CUtg0R%>R_uWGTUA85y8*H3Tcr zg=oS%=a3Hl(!c8IcUcEJg_YYPzAKLnkDX2Qb-ugWhzzuxXy|Qa3zyjVklPs``B8aO zZ=`%`im!HsQ)K&P`XV=5+zW5E>^+PPBVshmB*X)>6E!nFxXU)vPsq+! zAM^8Uc{^Q8;@HVOY8>R~YjDpHFbST_wWZws#H04Qh}(y_ThW zP33>!N6rLnyr4IeLd_nl!msGk&3mxY?+^+T3@OsHaa}gG@4PA{kI~0Yr*CkTLODNp(w^0n^ZXFdqXl{#UT!SiF@VSp|q|% zNu>KYU7c4!t@vwnQt~o(PFVvsjknu<-LGA~oLGWK%zZQ`zK+%@SZ*8VJ&h;tkDg){ zX#1!UaoPZELXK*`IF;DT>G)?#z`l`CmAL&?Nq%sal%&_HqHN2uPQIuTku8f0pQg*S zRkNTdt0ps;d_3dD(}oyXu*9opgJf?!x9hsrPyl&voO>Pwi3_@VtSBLM4G0s*SrfDT zA=7PyyT`-E@%G*p!eT@;RYk+n4Z|%dn>Bf&czo(A6E16pGLVC&UP}?=vX<(4DccfZ z9V|p3pe6Xq#iT`t-3-@yUe7PGdF@TcpxJ7!*v|L7)@gl2VXEex_nGCMm+gdznu>B? z9m^6Qa4L`AbWY+mCHSguc?CVI%6Hz8X7F5<- z>ITyrDI+*#@|K!n&IaT4Ae9K={_~NwA;Kv?_i0^Kj>XL(N7`8NetaiU=q52dA+B+% zo%BqK6!K<=Y5`Sl$dtGl|6zJ%i-?@m$}{JX?D)3Lt!@H#oZ~lQWd>k^fq5Y93hC5YbDh_+d{9To}ZSL>308_IfqN-{pqa9`Fy~oR}pqXcvg3Rr; z*;Oqq7(hz7ib30*(CTB4(GYwb8f_zU8}g7R;tS0C)dxZm6|vuBhu8@nUfq4&E8*j< z?5;!-U2a3$ag2DnkB{iWwEUP(zo`w;sqH_@!;Au6xoCEbX5JcTO(~cwP?0tP;jlB|AwywSyg?AAJLHxVtOSM z?KkhUiprokQ0E$2A}f0bWY;D=i-F{a(iuL|QCS)t>VBJewHN-6~js30XT50}Puh^OITVN!A}NjlnEG3A+X zq%0-cVk;S95-{l{ZdA|BsuNIM;XjK!J3N)sA)lt1WMM|Hn5Ema&!KKFps^#o*$r}W zUoDW@-FUE*DWu}KxR<}lWFR?( z1rW-7ywwLmFp5g9ERyamdNz}+m4>CL2&&%_L{3$qvzA=pnKxIU61CLxUfZ$PQ168v zji8K*_cBHXN+!}obkQ0^NF`ciYKtFJwFES_T8D$w)7AsoPI8l4c_ zGuv*sLEQ>yr;PdWNSi%X+Udz@sWYDUp)}~qte!Na=1je!7p%Fa7L?{DJ(!ZZP^hdk zs@jj?YzuabJRM!S*Z3j^yIEjYzAp$fE>zN49odko6edf%T9Lg!?od8$?yPlr61J+S z*YJYALMPFcVn|}uz`nMlL~n8_*4dCRVE^H5U)to2?Pq?hf+>lMUbl>?)v`f(G6}QO znS>@?U(um{njz6~ry@pBjS{dTI?a{w^35v6cp=Gau~Pv|C?Pm%FM+S4BiGof!W>Y_&yd2G(?;kY;x~e^39m?|$vx$KW((EB~AJX4}Z& zDx#okTLwzFmCKNdA5(rj^<K_WHANGB8Qn{`sD@%@i-E_4zlmlD!qCJ)3Zs9+udo@#QcgW zeE!(pdBd%?fH-DB^|mfEgk-IRv~7Urr?q&-br&+{b++5f?ZHD>#Pg306%+!xt5T9u zyhT=^KccZ@s*xWrzfc?Bb1ZU(ihXv&RumfxO%q@&CRltpfBL@lNnt_t%@YC9J{&}i z05ETRzD65&z~v+ZlW0RFdJPx<8=In3=UMkzrubU?7_`gWyZ;X@BFf2z=BS4L2&+>j>rh&t=b6Ly`AvNtsIuaNCGm6R+kjpk0* z9Y4A@?26`6QbwLd@97sTcce-?5)y4?q#T}Lb#|(%_j}oM5MJ#P?kmMh4eW+nvi{s^ zSejt*G9^?XICQPm)<-DM*#>%2xDkn+n3w=E^qx$R_R)tz)rUR0QZYh)loKxV$n%kH zU+C&~mH=Tf8}$Yyh&sAhwTrbd{Xu7K<8*Up*^`XSx?ZuWuwYC_2%eaj9vYKbA-f@V zRPD1=6UJZAi3v*WZ)lo&S&A8$it`p*Yb4IOj8~ICo!u?+bX=R)=(idy2`vnEO_2rS zH;FYaTc>JhWT7T{LJz!g4zEr@fBadxaqGc6ua!>rdD^Gp7;Cd+?Z;*m#LnYEQEbdd zcSKtch`Une+YMsagY(UvYEoR5N=VT@TR=hqx;pkbahlm$U89X~jt~*spXr?5_AM?> z;QAW?!mR5mF*m|)?3DQ1q%VAXP~ge>%+Q|>PUH7}b~L%E{xite82S?qS|@f0@qc^F z1@51r#;F4{`R~`GvUaZ*I< zY8TlKlDJa z;EXh-g;2s_Bw(ZyilM3ufdC28LQh0ULQN!rKnO{`JCr%?z24{g{&~Oa`@Z`RF7DiI z@3q%nd#&GEd#w{E(v*vCPO~zbw8d9@o8)>deN7625>*(}gWH!)}~f%7`x5vMHGIvhUX)Uv(7@niQ^SoUwBs%GDzH zl#S*$7Pt&<_#Zs~KvrZsd=d|@cFE>i>dH>`#X-U6U0aPTr<}EbI?)YHYIxR|48{wZ zIY9W_q>pCAZRf2Gw4P_&@pydWO!N7_1xRp=GSdP;zLS|h`V|4`ep7ONsV!#1T2ViH zMnVXETsFpkx|awA_u$5ynqKR$>CI(9OK$>K7j3_p*FD_i^zQL}Q9CNvh)u1IKK2k7 z#~PQS3d^yLElw#$3vK$=h&FS{aySka+XP)DW?o7r;a2;a(mPJMfanj@wIZIyFG&Xy zhg~}JXk~Ug&?YdyY#P(_IQYCPIsEyicv)Ci-%OLwU&MmjFBbHtNw2OAkkVF0CgG!v zsqD4Ggj&ge2INd(qab|C!TyQ{;WH_B^pd%yepSkCZ9o714>W5(SQI!?!zmM3sSKN` z>m8oXndOptPF#NAko1T>n+;Tos>S{D*b1=G3v_t~# zssv4)Qkcwedzt%m4ZD&%=rc4tHaRh5c*SaRqDcW%t}=a|X?@HP69k4WOR3^}U1<#B z@i6)uAE#kbK8ec)7(w`A8j7TygXcVTu(Lo57Ef*}7Y%0?9DL^;LR1&{tW<*VB;wDojKJFdP!CNulf{coLVN+sLI zIZl7h9;YCao0YUe9c z(p*WH+8J|lthU{0t#6DEh)FS@#m64bVB!l=pPVXe_DHR_3&9Z;7kHkS7T;Mv|k-VKVjm8oA&{t8jdo1yd7bUJ{QP|()M`0l;0#nHU8lkPM)BvG$oYXsL=XEnc1c$gsb0*8# zA8$$eFv;!G=gt|-eS>)R?3o_~GT0W)#)+p83iKcjA&Ynav;<9{LnV^43=9p~X0Q#j zUcMv<~j+wS-L&OodG& z7|sMU$qTd4WUc5>Ym+ZeyMTXKrKi3TgdMC-*M+0vl9H0P;s0G|C{pIfJ!-s3m7nLl zjEy7E4vO^p{x=AHc5mO08l5x60X0QMQ&aepKV1p=Lo@?Bo~eKu9zEGq;kX6Nismqa zjy$m`Xqv?o%y#x0GTXwU#s*%UPU#L04{wvYbo8nXkP`R0o7*jfNxLGo9*CcL;>{$N zI8?j>4U!uJE;HM*;#R$~?5@ahnVrBW$9+1QxYhc@r?2#`=f!Qc^6c!hW};qsoIOfB z(ba`-?u`EgE**?3)3qxSSQRIH_Bo!E#3^syO4~wzC%Wm0 zJ-Ep8i29!_b5-#`-K~6`0Fw94#**@>Z_thvC*2N;CmuOs>QxD__1Dyo-~1jTa`nG~ zpG5E2JN{=~8o2F~D`{M>5K57=xz$x_RTQ(Zxv`{!xb{jB(sr#-k0MJPMeF!IdW~;o zD#pk2Bs*;~rQ9cq6|lQ3^H=Wjv-Fbj2E*K4Ate!6*3oXiU#<^od?e3`eU zRMTlvh|kJurkp2!ygNJ&$^!Nfhg?NFN*1oHRpCE=e5#x5u4InVEL51pfTKoNUh#}J zcJ3B4yU*tIg;ZmGL&;HI*EQN|P2nCUOCf(}Bua6>I~)1h+EzqErZ}BT&uFvBq!-J} zy*Av40WMe-IcJf{{N!6P_T{8P*4c}^nf6x3r`66Pg(YTjb~6Q8=r_Uv1HsWXV1hvi z%q-(^_-v2N{NlLTc>Ln#P(*QsSK-=jr#y50zE|5iF2vtI)3Z*ov7<_aM}PWiu42!` zI(y4@@Gfu($Yl`c$REg$_&h#8=YWf%7tQT%lpp^pP0Gz7YiT4Pbm&K&SMG3&8d>Oij1K=!{M% zY?wh$jPS z==eG$`0RO`4*uFvAUg$OaMZUi`_JlsdcyuNVk=3_0VRb|bFwsJIf?7D$E-?~kQ4Cs z*eqLEi|&Zc?$~LORt+3DR*B?TY3nporz^HwgD(0hMS}|5v&#~!QcQ>Ly-Qp{mnRKR>StU0_|-YlHL>68r~zk( zmhzKp+IqHq3;1#pr<2UXs_yj2u$q}c<{>w*OJ!3t;r2nk1FsQ_cEBS?9?blU0h%>+ zV51Z7&Cc?)w6*s>I%KwW$(%+g2propsntaZq=Dm$`{W41ls{FryOcE>-RRt#YUw<@ z6VRCjtABf`dnBlNUd1U6svIB;xq)nh+8YR(G$5zXvFf;b^y0WBnyVq3-)Ss*(UJ5^ z`y$2bQ7|%_!Qg`<*Wabj@J)rm24!)&o$=FE+=dd;W1-fJAr73sH7|Z7fcIV{D`5C8h>c@#c>dh{w>=V|gV^b6& z@MP;dv7Qw47htxB?IF;2->Y*QYiKH+ zq^R15`oh0|gu~hr0tE9}omq`l5zMV1(ff{sWSfhWSl}qENZ6g96F*Ue&uL|Q6tCKt z4Civ;=_c&Crmwjl$!^iC&J)Pnt+xPTWay;(g9%>s$MS|L&~G?wmOy{5Iw9 zr?sl`R^=84uRX@=?bItJTB+oU-kh_l-!k_-jQm=0q)hJQn$cL7aC>#Ed#b!2eER+}o7Jx*<`YU3tr%Lqqoqxe zzwYHyc(OjfvM=tsGGIo9B_&#|oUYDY>Mn~j&FX2cu}+8ud_NbXH`5kI3 z=F9L%0QCC{HG-uzZ0i?8?rP7neLQz=7e9X9cJnz5N!i7=c==DX$6jx5=Y`Eih{PDT z^}9I%ziYA+w&6H_>lQC-)H@`Ea&1j4aY{>kl$EfuDr;eF9SX<-`zu9ldn{cjxvxV$ z5QlUc$FXjEDd&bwgP4S5;jP&79a~LtYiZuNWT5jJ@oFB3Sexj62_U zYoXed(eIL&6c;Ffv&W``iDv2N1Soit=JmXRVvktzaq_X_TeQt_VXVLZZO9RABcnnf zwe0$9FQ9c{n`83CAEm6LO)VG1+qtx-;6O^poWk(lW&+ot#2 zqtK1_2NS8it6S7X=rz zXEm*?#m~pTPFfG;QjdRVl5$hn+YRzAasDf=^PUocqYNPMjMu_bfSeG<0Bt{r{*>q99b@Cp_ z+UC}?vE%xtM#5de=%~Vp6Iq%O%Rhkj4Ep(lB>%WCw1VSJ*NXS>)x1x&^9%XA6{8EU z#QekTM}EuwYMz=XC1K<>QaP z&!x8NkUF&IFBcnOr9G;-1I)6W~D_Q*YLNnI3-`};Bf8||v- z7wQz@mgG!?JIytfXQumVBY%v+W%CH z_$q^8`R(9Y(RHa)|N7Ye*}JoSRDdzQa{U|gU$G9? z37K2kn}vt;J!Er0Pb0^LUFUI5D4`JmT>dkgR?ubsSz5#}pME}og+=QQpw}eXU-@(D z``Cv-n}5GU^8l}X5_S)rJ&^ZP*3`((ChdKAWiVm)lFV?#2D(yTt1n%U4u9NZ=S=#)UgF!9%y?#IV$5hkNE zO!dkGaH;uPQ8-brKg}o}Fwx?Q3{gyDb+DC*B;Jd_wlrQ!>>!47Qcc)_J?R^lq$eg{ zy1gQb`;MoB?Sn3t&xF6}8Z9qDD{rD&F7{l>@Q#>X4llI9_KX!Ik5h7lGt-%4GV;Ag z3&wp2pRwTCmB|>!ipM~e2W)B8@LY4WL9=n|W53*>Rq6OIQN;y+-q>aH20!gl>q%Gv z<<>q+Zg3cbqQTwMXk(UL)CR9;+_9g+U;?1IdIW>01|>r%2bJ*t=TnBzvR5j~&9W_? zpvcv8cOJk0S-W`oFDO#w?2N(kU7sG#YNev34R*M0165I;pOmNvHjn;%6mh)mg;Hck z=JL-Nrr$1Y$(0k>1l{ndU3=Zt!=14z1rxn~J&Xm|GZo7D`|}cOweJwXeVn+itmP|C z|24%%>nh2?23wLJWC-;MF?U(cEN#}3GfvC~%@pn+r|VzMPgVx&pN&~v>Z=yqbUxD{ z`>0@cDX!L7GMG6~jqKO}iTOPWCJ-vdy`3zV-s!Y9`%>wo@{k^{$+x91h$ou8H**;d zS#dssT?KP~4TN|xpdW42sw2aUzM27T&lC7x=uRqYP~G+n=1yCUS`a z1(#s_u9|tZAhaWzQm?Iu4i6$ESxfqYK^|9>Q6)Y%a;x9!^!H&TwuZ35KRIsJ;4fBW zaawh~T|h7kOFbY`KUdb{!qRMR#L6_gSCVH}#Cq>~O~}UjbkoBK0}7^s{=i)iCSi-W zrAWDtgl(rOV0D`Xc=-i+qLp3zB}4h`SG(msop3tGL2HvaR*sIiN1Bb^;GaN-AZ;9= z%yiyxhfi!vOYF$FhjmGbeo+6oH(?lioPt5lGzU6Gs`F!ly27VUmWyM9obnIp;Qs;LL@nI*5jERQNU3vuSnarJJ9nKAu5L4==xD*-ssX zuV8%W#Er`Qf-;3xfU%VbPR=Hofzz|IaJy+%rJtY0t(f|VuALdo6~CD#^`M?Vep(LQ zlwuN-D*O7>(wx`?9j6zicm1u78P+FIcfxZZg#0wI;k%2r9#C+kII(X%G#u0CF(6k^ zLrn5%E{~m?oos8yHA)Mc471dDpZX@+x-b$gIgdvHXx`n?g#bQY0VD)_i@dS_(T9$o>jCO!vBAjHTM z%Qm;@Do`D2fec($Jc{Ex4a%if6L(Zy>kRq}ETmVN=Fk%5H0v}cj6R;uv>5yxi+LPv zpLugxQXH0wJPz`u8pk7I*;P)>Ey@u&45LsAE{>X8y(>5>Q~&6Pvkg+By<@0=fvJZFZ)pFy}{T@W8KK{6_E1 zDnksvsXCma5Y*!oRUho=wY;*DdGo?%TAJC-U)tN3qk~1NzyKxCyEuQK~9pgj=W%qnbb?ioO zj_FJ$&mfD{x&3Tcqqqn`ChKWJgT2&S9`!voI~Rtuv4hSJM@(M-yg5@Q2oImhAy$)1 zeSWCbqE>dqZq9uPw8Um3i7xeP>u&g8n-us<40M@;dwzG-anPM0eo1a}Sf6QPIQ{#pVYTdzz$t|4Tdy#Znto=X(I}x3w{tWee$K2dx#y>)UL40w znZHAuX>EzSdVdnAb)P4=)J#Wmhz(V0@_%-fI2GE3YsI{wetMZ(VL#D$u{nZa1$EXU z<-hid7I67!G+ugNQwU+OR(eI_do>9FW<=Mb0hDB}*AbJcd{5l@q z@V$gqp}Yt!G0b4j6nXD0Xz^GzYo*1S>W&MWXy4kH{6y_0pQWE~p6?8BatxZtCz9Wf zbiftxpQ=|E-}u^0f4Df;fAr`=Qlc6@rD$nY?(y4+`~saMf-?69IfR^IVKoFl)P)S!ANdepA;grC3Fo1FI! znF?W;sHHKqQJX=(BV^#BTWi=A=AHOk@pf_pB||%r;bom4GrNN@Hc_+Y5zOA|r=ER5 z)S(Ku+^PCn*E=wJ`bMged!V^Xe{XKYasLVj2{L6VdM;55wy%)5`gHFZ|7UNZ!ym}7 zr>3+fh;fekRDFD|T&tbm)Jx)1eJ59wv)d{;BaSvC=;{C?6c)KDWgi@561w)l_Pie@ zPff0Mcx1fzDPT$MWZSmBz^P7d-_36#7jus5`BHOF_+8c@R0RYRek~iBh-z`hf3KrF zCg1vp81#Ls3#}ujnh4MvTfQ>Xqwm`6ndi!9GMkSbvx%a*96f6O(6{WgZA4{OPH0<; zN_3=4>{N54HwX&bsWAJH7nbhtbiH9}@mjj87L-df8g0{A+k)WTnrDhP!-9KO1-CxGTw69EVY@CqA)`xVxe17Gqd5H;XUNUm|%29M_wjF;+X<4(v!Q$8z z=}n33=RGr&rC<+};f*EmfoY)M_k2%tzM4d%nJdGUiXU!QDOXW<99p5?ymaD*UIUP1 z#x4s}|Mx2Wr71*FQPGlegZB;Y-L@d;d8byRW{BLK=&|-hEkZM)sf}o z=hR{#(`=FniI0!y%L&59Q{9%X7hRGNL!A;chf(UJ?j1X3XRVyp^H-kDJ)iK`T7Vg) zdDj{sOyS!?J5|Lo@;u7h<4*=5?H$p~NJ7(2{sYLe)h$F=pD- zGUD0f%16ui+?vXPr0VzHA!Z~>sLNC=Z6O6}nr9~Hf4U_s@aTwfkW93@hUS!qD)u|1 zJ6tKtwz$GKD?U5Gu(+h0tGS~)sF)O830MqH2U9Kh5cP7nf)}Zeln$*{!7?fId3Y6`wL^-cT|W7)O^T88O-(R8{3^C;L02qe|a>p*t=G_I55V&}2e z$C2}*{PvV6F4bXDG8~WDPo63&7 zdJKPkV;pWDY*5sS$VqIj?#*?XV&{yZW?Cu>aU10UE4aYr%E1q<5aLW0R5Qsl25_ks zC7$MPT(V~|`fV2m<)c)Of_6uCal1EJHahs^(C*~21!3%G!LAdR7FU@!u>J8K)>}Z} zrsXor;zv4rjUh9I6{auRIINS=O~Nj0bhJx4{IoH{h#;qO&)LG>{?>4#mYiEkSeT`9 z4zg&nUeICWa>oYt@*@}%F-vlAb{?4-eX;Z5`IObsD_-@#$@PLlDwaO?9Xj3C(VBYD4p<{MWblSj>2%Iw~ZXcLM zFAoiFU|l{{QDxlq?moKkYXY9g2o1h0F9!**a0$4@fYs%PuFU+@1969%#f&$D*J=Xs z-WXlO-5IpusH$#;glCm9tZD|B?$p#3zFkgfdFrt_y6i?0AlEl6J!6yYiJl9o6y9y7v)*oKOPir z-?J6{d-fIpB#Y1w0G1`DN;f$tt#cM%9d{J4_Ccfzb)Jd`&xkOsgR|5USESL zBhY9WY-ClwoZ)hPd@F+g;1&O~lwRgHS#B`?u`v-M)QVM<@mI;@Y9TJv~1+@hgB#yX93?LERm8=myW$#zvj0sw%(W zVDh%7{8s>@qDYs3uN--obaLP2_3w>N+I$}g}cAL$FHxiqrT9A z6v()q9?&24M0bsi<%sTj^=e+MvC-*&Nv~5WDL3kZrvHfRxRSu!67Y7(OuqR!8R$%t zIQMpIgpgX&4cRW;*EoXT7k)wF93WM<=QXo*S^O_2l|q341!wpMN+qX>)Up@QJQ0$B z*+ZM}UIY?g?{#TtXvp<#NC}B5qQDWE{R|98NO#pe1~U>GUPzj}CbgW>ts|4ktK@dW zSFc_*s#7huUdgK+jD*1f?5zVNvj*Hqknxti4?H*;SRty33phRher50b=f4dK3Np`Z z2I9DZJj6QHw0`y)gtw207i389XXf>9XAH0>pxnD)!oY4- z{SQyZu2eN=E|lb}X_+T%yh>EKwr6uqI1KEAz<0eMo&3m1CfRLe&uQ@F!~@)(F?Rn} zzzRuK)xlmhAD_Vk0})_AUTqN_Kr40~;kG7No&T7@b$JS3dCizY+BY3-3a`IZDvr|x zB8VE*>6Tz_sHlCq7Y`St1RswjQH;8*pde+lKr z02#XX2OfPm@KMz+5_3(Euhe?q=x3n-Tz??n0U6@oKT@$)5d~P zi-l}9cU-u$>Dt*5GS2Sg%`&Sef`fvrA3vVmxddc-2LwJ5ke^p_`i2ESZ2>D=TgrNe zh+~9_E)t}I_omkib905dLLftnJlf%k z)BXEzgJ=UcOI~zzbf9XfRnqDeW6Q((72uAU_Sh}E5DXy50Wk=)!5j#Mx%^k|*GB8V zKa1lI``GR2CK|D(pj<8C6@#cR58Q#hadGSdiWQL8r>cKW zB69WLAE~NxvAYsvU3Y)QV!Lf>YKo;H=6_+Ksx}+7}fd6&23Cim|}SdX}79XTp5H zYKq2dhbiZkZ$%^Vpi30s4IGjULDNk%$Znb$Xtnk6tNc#EiX@u=(XE~kra|J26MwFi z7u|N(@Ni88WDL+FAUe6(mu_RJHr{tJBam=0qf*@0y))sWaI-T3*Z|ioxSjUK^CD1M zUd;SZ9^Fs*N1WP&XL@oNJb@X$V{X%M(wVv z{Z5ZV`JA7>?0LrYEesjuX?dtK9AMi4dB|!&epLARPi3x62e_RGG+}ncUW|x1T#*iW z8JGs4fY3IK9QENvYJor8=5=cX|4y6VRoh^4W|3h<^u|vj-S#{z?y+*%zOqI**ttXc zIO+iZ;ej{<4n$Ac{VS`yJ9i~#VQ16-+_~j?0%Z6>SNxY7I{#?O;Xpm~{2bFqT|qm% zX;lAO7u8JBJ(zd9Ck{sPzN;%PZd$h=(Z#RzO5UH*w1a3sK>cp~BtBz{8Yca_%(#nI z7_R}1e7p+}O2|4U!+0k7=AQ(DtzcguoIE*hukK-sva53e8&ZPGupJ+Z|Zezbrn(qMic?*kQM z?@8Ui?Vmk3vEPk?spihLegAo&iSM4?z5j)YzX)WdMgNknUVD5IgBb&~Af0Z{s*0xs zk)rpXmc#Gniz2!rLcey&wbjx3+kexyKTfsih>4AzO8Lqw#1sfkCjEzWPq9=HOMTC; z4=Z06h4sGso%sJ>WqPyoXxj3a|M~a^_337qK?*HhE&`Au>hf`S35@|`ffRRmSy@Zm z?qf~kcrQOgu67(}d)~z{kdl8XWOJafnZd1XsM|$qX>9_L-a(UfUh8tMt(-eFdRCEP z4gIBAuxgO$&f?9?>FN7!TSZg%`LY!&?kjSpuY=-Flh>VtX8h?xW{G>r$R>=MMqBnq zKkBZI&KNbz_6>JX$h~c{^E%)A@fm{1Vw5zwKO^|`%wME!l$D+7@|BNo2sLzat>(@` zAr$xcL6_;nCV^^5^cvw#faSE7mJ7>6(0>t8T;oz_Y}mS)9#mP)vk9ssySr^UGq-O9 z%~yO$ANQaCMX71w7bR7%J$Xkvkd$vzJRe{CueU)iv(MLDw04bm9*Gu5m&at*n)hP_ zjT#(O(?PFVbJ>c!KXsomWF{5LkBOM%cs_yj=jKdrZjPy{&X94-EzG0d$#sXZ0He6& zwat$C@OC?&!w}@Qxzdxm??*zn)1|;yB>FhL! zs_L4sqB9@Q6fm0WgQiK&+1~_y2jjwlSmaYF(Bku634*L$nw~rj2zoE@xb1W#?#~JQ z6@MJA8r+lKl5HVq|Mtk81a3cNp-Ylp@6|KTj3IBX=xOR~-mpORbe8r#N$#F;Wl6#6 zUbM6B{>!5BKKTF%XAGbnCdHoM^ddvJfcSa1x{vzO72(0l z?8_-hb+pjmwTktfh%bmd)%?-br=Z)*>X08{o7wA z3)`<}*5NIN0ly-$D|+rOIC9p&r@^$SCq-ZXtsdOAh|oI`?ki?JIl{Htalf87Tup5* z=v(AIEtFRVhsKyBmgQ!*Agw8E-blUnA7~Eh#ZE?G&lp{HBF>1^qBI-d6ZYD{s#*fI zm0^SWGTcc(FmCo89YhH~|3J%|U2w4H<)cTqFwweY;vsZYs30){}2 ziO`Oildq+BkN6Q`uWYNdxu#N4P%PV5*MT2^Bh7^)Y06Cv3fO$TbYr+wzjbtr&^x_p z6dbx>bu8Toju@$-M}e*(WC&=oy|jvP@hdQ=41G0g>6cLT!8MC(+|_^3?-meG?C;HB zJvc^DUO>wi+6b$hE>2te;ory6sd!u4%2e7eH*{IDEpsHkDCKD{i3}w_8w!0=dJMU78A9!6s8~ly5X!<5X2VDwrVME&6{?#he1@?W*Q5wgY|E4 z#D&#@uu0zVlI)6mYEn~kv6auNVRUrJ_2gEGvS{Bc_L#&5#)>(}uMXM7A%@Sk^nm3K zb~qk6a^Aqj-|dJ|Wm&%$LahPpLGQz!cCmKVI&RnLv0rLIO zx-0*tts$~x?icNFMn95k0l;AOU=NE#sHV1dM>q-Ss_IF0O1xcX9E?ZKKF9bNcMFWv zudVk`>}Ptnd_=~(^^ZqEY|!n>h|6G4b@MP#4Cf4s_RF&+nX?wr{=w9E)0OLoQ{~G? zK)oEjgVHQMb0H;t({NN>9`2^*PYAcR zS%*u?4PzK5_5*?nz7CrG9YSlS@37n@Q>9f%8 z&1t{LeKjU|O*6Z$!^>~5onwBj8#kslJ2zD@u1BhwxrfL%rzwSgW=1aj79^!zu322# zp+5_Dx9$HJpbwj~iqQa2+0iU|hDkABZPVQ3pL$XI-vfU=r+i8bA9pDS>)qXu!Dg$# zKdS@9FL2ojA?nG~!L63(@^c{|O?#&Z3m-)-w)w5ckFVf8!>%EU%~6?^R)$1hUtQ%h zP_-O;%5cstpqSHZO~laqr-dwXn#t$q;KfgN{-bXzRqAyd2QVDvcRimMpS-X5%k7j7JPiq)e&kpI=i)^oImU0O+ z2T?4eJG6`Otox2&QwXq`%bcdwy!+R_M@hHABU3;StR*TtSGZwR5T8Nt4u7Pb6T6hv zGd1FzXC57{s-h@fB-?MO6>zHA!V;{U#y%-s;O9D4uIA@Q&Y7mSRt{Ekkg}#N8fjWy zPGf|X>mqe-?=TVvENC4&3O7)qF`c%GzUY^4SXfQ-_WhhDE|FedyZf6bXh#Abx=6ja zR1~W_7~bdu;=5k4&r-HMH8Mge%0*>~AzGqTd&H7QX32S2{9K`Yloq>ckUmK)_^FEn zX76^qY>RrMp#+vJZ*9!$TX^Jd$O9uL*>Ms~k3!nx)em*4-Vlo*H9!A5zKThqk1Jo~ zcC9%DeAkQ1&DADmEHr9CfM}2~yGMOq%w4BGWfaVVEm!@>(iRHTBkIf^s^E>ZlT9WY zHIgL?ZJFI(`lN~CXDFPvuj(y&vgX(e!@pi(eiWjBH5aYN{#-{MkdIO1O%>P|RxB(p z-0xfJt9!PFAC-~5Zu&B}9o5jFUG^}+07UFWAaHgTYX2d5%hZzH^|LInZxZE<^K3ykC^>v359`NY0*R96EtwmE!`t^QY}>OzycRf7<%}5OtWm+-5(33B zkSr#OL7i}I9T-!k;vzi0p3`_XSt&8?cCU40m zXxpU;Y@3~I?_^5PaICIhRAn|&prvmRepLg=EerJ#zVkF~(~Z;ZArieiKE5c+wd0t? zYQ;FuUo3jbMNo>E%3K+-F&{p{C}Qu=S7CsH?2nxymuX?T?b_Ta=mwKuMo$ zTp4*wS@4d(l2gT9qaX+MI_hd0gh1XD#ZF!;r4PVq1Ae+vk;W-!_l8S!CR~8xZ9W`b z(h#!70TA#p&uy@vSg6p+B_wl;C|nvG*dOijvxl%Hzpid&vhI~SDic=o$0L~@0+t@& zc*3qutZ%j=q5PdRE9>|dc1!CTXw6R#uj#>eyFFA(tJS$(rrMofe|hlQF-u+;wca_x ze=i@{e=%e9?O%>`e4D_*tZ>I_-b}W~T6Sz!0S+7>e)L1le5Do(Mqv5HKr(y4Vzu>m`&~L5nSuU{2)zDu&tb9m=ck>n3P3$Iy*)5f)E`OB_f{s&HSudJ(Vu@2DhdS@Aun*cNli>l3~CIkq7E>( z5`qHBy1Fd)sn)+XAaiPj8@HKAZDkzd?Z5mi+ad#Ip7RIE6fAZ@L*RKKA_6ZjDB-F-Iex1#e|NhlMOeg; z6g-%I{^t`%9;lh}CN}}khX`7_MA;z$Q2bGkXj3l!rU_Sp%coFsYbbmW=)Wi}aSs9K z9sqqu&!_3Jwg9@>0w+NA@tAR^%|j|2d7$;}fOprQM7x>yk1w?+fgfg-|Bm%Z$q;RV z+&>B^P0mv9Xb~!ZpBx_t++T;kANgeY@Z7E6&;I{x5G$DDG(XP12elO5ZJ)L0MiM%?vbX46+E_g$-;&_ zg2mXl6K9NFH}A&79s2YqXA#f9I0iane`Nf9T&l!?T~Eht?OS$i%c+iks?p5XQc_0= zmf)dpF;QV)FXxm1x6UMNXwq$8yUPj}Z&77U94+|A9QhC4cyCbQVW{=H>KoeQEqMbu z8FWMXG^c9-S)?6*QkYW}wV-b-J{xwzcJ z0FKP{*0o0S3udgoQP$N%VWTJMZ&*Mj5wl@qgBR6?ZmimP_$kY!6=okay{NA{UMlo8 zApG_v*G!QJfc>Pq>8Bils#u}fqIJ3z($@Mp5sl^C^I3OuRBlOEWruDfI0LETsNJhp zd|mx)_C>%@3AAro$7&_`0lQ4H@nps z-Q)R+n%h&0YhL?Vk3RiDgnWNbxQ9y)t#4N185#}`4I!!-&z20ixaZVN6|YGZWuyb6aynd$*=q1Ax5$dDa)gy^&#b^~Jt9!F(#<=9;!_W{|i-Fbq_bn`ug0Qm3DYpYXDU>D{Q_?e{woYNQLb(S)CmlrgWHm zTlRY0ds){G+3jt_MtC@Nf;#4=olQ%o?%S`jZS zB)WJOPfsA}kf&z{EtXn5%>j0R-p3U!%^f>I{2rpEC~ zT1FlIl>}>_4J(*LBou|gsPH5?^nu0E=hWBZS_0GQot_PF0^C*30s^)@);FKxRTi+` zTH3l5m4pLjOb+hMs3EnuxN>@Uc%%=^7LtA+38pB+8Av{ulc`2JZj@we+*`6uJOls9FG zmd6Y1VU30F;e)hpfv0oQPW{`RHP^nQ?OZ|k#14{5K)nkZ#7mOl>Gd{tA_hhFEFKE79y^NaZTm45FQ*1!;Wcw!>A zOd(6EqnHd=8sV&pNnf8T#QstuE-q`%9KgCRLTux!eYbz`AlgKrgx)aDDY}-H4kA?F zPgRjSFmJC6r&yNo?^^VOrHalGUy@Hs2P7B_^0VM}d@7IoNyzUETj-5NAcb)Or)=F9 zt(pBJez7!e;VQ&D-sd}rI1>Moj$=JDmFpF_sV(VqExu9eD1g(EgB40!sB4L*WFT%r zr}&o*5zz9@Mz*wcdp?8V0tr&>dNty=xH>qzqCVj5S#J^>vlI5VQ8^JUvO61P^@lR$ zkxPOP82{>W(utwb9J*~&IsZ3k=o?m`yYXxm?vxZIh#H!1y2VdDB~c3W%Xy_-(_lN) zX2V8FidfpJZ(dDH^BSafhuR~7>G(=*6Ctag_4MMP4{c*bpM1}Cd|Mc}BCoe1P)EQt zx_Z(}spwlv@{6{0nlIBNopP1Zezg|cKXZU`4Wcdwy1R>j6 zh{xd!+bVWeqdDQnhT-HCg8oj|tI2}WyRJ=9ySKP*^{-J579+cNs;v}wmMelM`zuA< zk_f|oU4=kf5zY*^)F`>3y8me75({q0wRxNW5+kKGG@1pnJ#P^kpV>h7e)t`1mp`r< zg;nY?gmf49j!bCfWhFZY2RD~TbQJQHsu%jaJ*J#99d2u0-*C@In!rbrEmGdU=5WGw z2TOU_l$8SWFTQSYq6D?Q49qG&njETPGvV%U%O8M-`aifj7|u~!E0&eEzgH0dHWxls4UDw}6!d-hbjSC6tZq%AQ4}VP)6lHvyJJWh>|M5_Q}92`9p{cb zR)={`~v}PgPgYNmK>UQHadoM1dn=Ne|r^rjuLgW?N){SNzEz&y*TSJ92 zJYu4YAIE8)%rf_a_CJ3yyWRcX6`?_0ROw-v&b;=m6vQNyk0NKE3GHoMowmfb9elLG z#LleGBXpL9kdR;*Yk^7{2=B~;55h+xDziPq!kz>Be#+2T?s?vK=9VB%Ba*HpMq_15Wk;SHAyHfVR3;Xut*b{TnMH&y2C5TQ@nTZx<>i;mr$)&6 zR*{`~?^EWN7!XSwk$wo|wMu&jK}->S6HpfGQ-}mq&Wa6A7jACgV|obfac~88RdU$Q zMAg<9(k?)gUt}-cc0Cs<;6%U}v~oqQtX$a`UzkN}W~tg5s0TgylW+m(9!yk(& ztdIow%;<1_?uTxxblXe+7j^F))zsF-i{kN9k05vy5JiEbQlv|luAm?t2@qO9dItpp z1PEXO4kEqRh!7y5NeL|kP^4E00qG(&fzXTew<+qm_kQ<|JH~teygeAv?Cibv+N;bt z*KhvToJfN7>7!A$^zB28I0XfUFdUnP3#f*Df4Y4(P%F&V%8E(heaF zZDwKaMh6EIEjh%H+IITSVMUdk4cdaPb7i#Vi3!e!c%e&K)dr4JWLSR0b#Zd#s}J+s zU^!h)_11luor(8~vG^1clh7n2EEO5p2_FzLQ366!ZOp5nmed0S8)b2BI829Hrc|Ub zw7?GgH7$E%*j9R@Q3`5v(0c#d=cyQLh9QHr343l#wyE#(zLFu$+Pu<~mLJUqqUE|d zxMYRw)41HKYGoDOm^Fo8fOJUGF0$ooST4SK$p}D~UO|KXrr%vg6LIpj^w{D;?Pk@j zm5!;n{+j&~U=$b>FV>~CheKME!O<3cix&>@jDj0_0&KHn#$?9mtxE4d_kF(@#OHR6 zW-zR5&lS$B_nUMfYBZJ8iT8b%vJ1zCJtS20r=gWeE3v_uNNz}5A$M7JZ&bC|vU&k~ zB2R5JQOe4Q}*a6CKS^N6+yWrg1 z?l8TIG||qBXmcedYGm=t#D|5Hn~VsTNKI)Q70r{GbgV#1&u!1o zX^3Q1>|>&%x0J1BqQ5gS@`ws&M&wrN3>v}i++JiWS!8Nq$xnOfWO2tF-qhpEj~Q{m z7TH3F8UUXm4M?O=1|yiPY$fC}xi~DtZOka>EksXnpEWXeW@_E)=bQfQS~%5fu7S)h zlnufrF~o1y3@uk$$SA@0R+6khDAs_+M!IO9((3I-GfD(URfSb8!5UnY(5@@Eli2U) zZo&#+zaASYOwCKlAfou)#BpvR+uJzoyb@gDbX!N7bej!JBznLO8|%WEzz9%G(8+TK02U+U3USX=hV3}KY2KeAyo%{}My zkD2@%TUFw@8J7yj^^bClaa9!(2*1 zJG+X;XoQ(SVqtq$RO~^Jg_FB4yr_LZnM)~7(7GXz4x}_yrnENgg3(f9d{a4Rku$dt z!rGyM#KQkRT@Mx<5RT&(QiGwr2l8IK#=DX#7p*gwiPdh~NVhWKY(0c3cnCXTT0vzr!RpwxtF3_RG)exB3os?0yF;jN_5f$~8FqLQda&4GPpQO_Q zU<3++lys#aY_YAo-@lsJd88t+W`-M^)E0gwY!l8YT_{j?j~J*qKxm|#SEr^d=m&PP zk1pFawp}+WP%=>Acp<}lBknMR>nSY+ge)!Y>t@1e-KdqOs%4^V?R^suXq!V|dQX_4 zUp#k|7ci^<@wYPjwH4{Y(X`Tu%L_BC1r)Me7Js;fPs0mTwYXrMlx}MpM2Rco8e^)O zeb@Lrf2@|lK7Q31!UQFvWkL9WwA@}LZycb%q-Ou-Pbv9o6zz@GFEt` zudrhP8swDkywLs;h&IoqYHc>Z(OE_Igu5nPj|O~7meyotdwY=ba5NShBk&rWsYLZaDVsMuojFrsVr=36Z48 z;7k+_DnJL*Kwu5u*ba>$CV~uvB+Kk}`9OE*qS~#UwwlIG_xUO<0hiTkfN*)9Z0B)e z4^65gu~wEf+FZ94TsqH-L?Q*KSMilD`yK7VaawjtQ4sN^U7>3v>ExOk;tkS3a-7-T zVeXSA40H@u<45)3gLx|7Ln-#iq|YwJSIBP(Yc8`=FQ-QpK;`V=d=^&9gD6`pd+PPs zQ8}yf3L*R5S&N=a>DxLl=>w&%FJCr&IxnWKM2v0w(6fYa-FVXs>d(B-el0aB z6`f1cm3Iy?Na;X}r1t!X*sj{4gU&LV7R}LQriQMQ;H8G%Nz@{JNiOzA^6*p=r8s7_ z1=zGB>`u}Tut39RFmHHt)G%P&2nXGbT`RF!f05w4v+?H`^9kbrDvNg3{F(KH~IiBxE0k@3irl%xYCJ;#U%b8CTl@s5xC5)^{uird))V5`tV;`#4}z;8gGAT1e+(HzE^uc08`!~Be(b8qJH~pg>4$IZ@0k)}j4~3~{G0@R z;@-O1YZ%I{6O8G@f}qtUD)k$bh8~){*l5I)CC70Y!Gm%465smUBa!B*S5ZfZO zvk*TKDfC=fQBnh)ImkNz85B%u>x$y+(|l}NS=yF7eq-raQ3Id3hhf7hD2m(eMB*jT zX&c6&jhCb9ISUsbkY#&?g+iaF7b*pXd-jfu06!K>mN#4XHOD`f$=0-LGi4H# z=p_uj59DhpYS315&ED7`ke;&Nj_o5ZUCNfgdbxc-8BP?pO|9qdclT@0@JG^p39gB- zSm^JxKhw$zbMLe9_6XWmf20GMGj?%gd$A|6`&yo9B-Kv*Qgn*(8TWEhM6F6Vv!TIW z+Mqn?xqEI&Ihf3$K(F$3>KV*(A+J{IObMv-)01^52JJ1C^?KxHe3N!ZbUu2Mo^O0z zF7Xs-<8(IN+g?!EZHhw9UhI?qIDJjX`NrlS|D1L82Eu<#fHv z4eSpz1;i&;wlTRFwa&OJ9SaYLDDg~Y#d3*o_gtj2_Ia!dbBTgRSzp)rq1ZkQ$v)DZ z$lrb1qFNVYq{hFgSEY*V`Ivckm1``K*N@r+;5P z-hlBIl~L%0Fp+2j=PUJveYbnut8fU7P;nF-cgxYiL zK&L@vd8cYhBuA8AhY_DH+B0g{*!j_iN(}oD+$Kxr*2HohH!B9WX>!J2Lk#U|3P_rK zvMQ{c1>K1emkaF3DPooqKL=*mD9}byk!p^G#qC4S10JUjP*X1vSij5KisGif)I~qU3YTIdjnS~`z_vxT7+%Nd2 z3CVJBk26_q`!mO^^QotfkF${s#tGXVRlw%K``1M+D*vXat6B;%$y}RGwsjne%l2Mq zX>%8^s{;0^utAAYYjvm33|23J!Tz44Ls+~5M!9F_kQYJdN78YfRTt@!Oh=^+WTaDNrwo}w=6D{6Uh3#hJ2(zi&`DcwL6ZwV=X|V=7lH< zPmdzY1{t>soUi~edwhI2A&EVUzP3W>ZHXrfQsij_Aklf;9q#l$FQQOUIO5#bB|X*l zAUQzGa_@I?qrQxnhzu0`0`V#4^o+}Xm3wmQNv_{t1p)ujyZLX%+R-n%e}4S!N;*2@ zPcL`O^8bD3(}1J2!M{)Ze^gX?%*u)j;QiZuQH8}?>g$%Z9h*(!fxo$Q707!xXdu;| zPo$-#y=K#cPJ9>sIw$+n4l6b6;vkxQIru*(iF!Yfev|6_4X^w>J4jg!q3A1go%ysK zp1r$~@fqrlz>G6m8_aB{W`-=Tg5%f@g^?1F7#b@j zomFoNdhn4nKS2`6jxS_(_1ZEpSLZi@Z06U5CqEC3ZjoZUeBF(xl_u(tpv`3ol1k%9 zRvRqk6e&qj9h^qnO7h`9c91paOAjAILZ%PJzyIY1Vr zzoNWc5%W0HIu681{1i~SvWgsXD(T=+i856^hnVIwsff_!62ZWI_hYA$E5o_Xm3{qQ zy#Jzv+a_hcdE+41;iIo>@ah#R(Nc*rKr1SfNs@A!Cq8y6x8iHovwO(k;I;OZwFJZR zY2v8&s#7A|NP2p01=E;fT;tVFoFWQvu#4LG45zzoM=eyCYXOW1;&7$hh`XWkCa`Z> zKQ8nAEna(;+~+q!$mTes2@LRR&qA#iGxB&$M6aJrBY&d@KgGkfkcV1PJwV>)#u{TT zPW?nLT{D*2ZGyJH9iBZIsIJh1&X+GM+j@4N0XFf2kG+1@wH_M@$)X()u7u8;i-egM!Hw+OF`g%_oQ4a}m4A2C z*%TF+fgYlp#L%OsWX~BUmBngvROV-a628lvF_u$vuUJ%PH-@5x=1lzHMw?@P;gpms zB~Q5g4Tlqjl-Q!R9zA;DgykI~0OKyMd`#Wm#>PpE70B{_S6CP|w(qXRvfZ7(y1P%* z0KLxY^A{WS1T*k`*3mA7eI#q4lpbZwSSA?)GT`Y}7WVmy*y8qI;VQEG&$UF8*Mc>c z4yY*l0^JO}#sg4(**ia)s7g)c=h<^0A$;O7F!!zRBogXzV;+9~7WMZVt4E~< z$Yn^!T_;41@s@&lJ0aC*bB$^5Tj!;*=3_0G;N#XLJu|JLl{@+yJy{5F|)AmO%uJz1KD1U`i748acXO|6Uv+>@NoM5WlKkTSD%^`S7BuNM90M_zSYHF;JB2~E zhx#N&JhsRzHGWvpl!H78galf4OK+mx3pdmKN<#`IySFq&mT^G;z;%)M)tPh-7}Uts zaLh%zla`1GSpk&c@zIA68-2{3sLH?CQFviCeo=fa@(odQ+A{1M{f~bjGk&7)`q?-I z@=EyG+~N;F;7`Ej&GOxgPVu9E5@(z{4R8b5D;K*)3p6*u34=bik7fNVVaPw~l>ZFS zV!WYh`FoH^9Pe18_}iR;FH@v)II(@Kgf2S0V^u=$3i_+5kuOB+Q;&B%YZJM#`sNK9 z`RjCFu!|kWwg_3s7MVsoMsr@vNNXIbvb|mi8mxwipF2$vlANGt6~T1;9&?wOP6k#) z5q7Z?^x%af%z4zI`KHPu&U>Bed1|C-syb!t?&%8g*47mr-8ckbp&cC`lz)r&WKktp+nyD% zo_@P|I-xU-*q?I4a{ld0S&f_@_4HMSQS(DnwPOY4o%{D)t#5^+586Mt#iK5EEmUod zemH9!++}d7zpL{C2}f-VpIq3otUlP+zJn*05`o=unx`sNDa4eX7pXNgv|T7Up0rO# z#^tQh;D%Jx~9mPcorQh+xD^>kQxBP6zrVB}~r^0U(eehjc#0tNo6!H5K1Budp zUl-4U-`w9dl;|dP#~*y|Wn%2-uN^}=9}J_;ZTcB+b})OqLVk_#!t;?V!UsD~q3>w>aD_57FXM3&*r58nIDMcazE~&>QYMsdHKRFeIfD0 zz74X6JwA&%7yS2!e}aQ8&kh`mq7QsOxnTDjm6cc4HilGGtwxPA{5*=M(XjzllHECd z_b1*vdkll~n-DpD6CsYCN?aRar1J;sO}oI*eA9$H$9$)|F*Ia>(f+Y%I>cji>&2t; z5QVNnIg$HTWlkM!?kAfe^d9}R$0Le{oZ}mtN+1nANUfei-`F05skd8NMFc7cn9iZ z<#4}|M#NbcgZ%hWyR7Z#M~XVG^q-tbK`VV*HPy^m z)vQOrz|#AA*lEWL9g3&)zvoZ&s1IAT?X|P%z%{D+`o3iay|a9Mf=^%?`FxA zajPX`kF)Js_v|EO+zC|X5~Gt~7%VmHQK2vBv19BMW$AzDO};w?O4w=Z524a6V=C_0 zKZNr_(KJ7Fj2FO`_~#wmutyJjL56&ODoa^!!*U^f1bYLj|llv>0)OvRPQ8A>Y2WWO}Bh?d)@;CVR_)}2Cd#w|cAk`Ib z#k~IzOg&FceW8oGR{!Q1`SVJqsn;sFO0Qk(S*n24P=W$fhC|0!nx|aa67*>aMOAi~ zfVd~CItpF}z09gPW{alMtL>&35#46^ME&U1xy+=~9h9R>_qjdN`iebsbO_Y&B=772 z%L<4KHgv9fPWKWa7(hBjNg&r5A+PDg+oWL}geKmQFWj{SQIxzOu~|Aoj2W7Us*enP zA2%~xdAMA#_}y!!zuKCIF}3&eLxV?;L>-3{Y#Htq?q1^D|w?7xUyir9 zXj9xB^(POii0qU<9(s3f@(}CWEc;;ahpAXHc|Si_Qy^u zg09A5iEalIc;poxflI#xM2OSuSerqWDW!g#o&QKD4x94PfUKUy7_Gl;`P`Qe1H|9a zD0BJqm%S(u-^Ok$p5D$GsDHDtO875EP-^x=ExnK36-F;8w^Xs!!A_~?8+5MSi4o4* zA5Tc3_w88QxK3?9tb^Q!$iObB)Z>`!oX2k0dmD9t#U8|Hn~9=J)V$of{M$Lga=vi1 zI5p=BFv)gj7TDbHaO@a#Vijf%1sqc;{dS#1%ABGOjt)BWy-bPT%s}Jv4ViKM|9lXtlI|Gq&vWs@99{3{aP5hw*$I2WR2?_ye-i`b>T z?%s0N!6nU&2ihfOTfeaV4O_K8OdJiCJcrIoC_K z5IG5gfPxsQRe;FBP$ru={7`mQ8;5C;w^h2gS4~dXB24>SpwYG}C^rcg_&xGnm^&E+ z@idYSvY$#6e^7{W?qaUwCiV9A-MP*DOW*D2g?Br33~w{)>$7`ur!FI3$4 zoO4Tl@6Ek<*^V9D=H(LtFF&59q<+LUCi2Np zA$V9_-d!o|a`~`O@=jpURY)>xizb?y=t1K^sW-3?XSnf~@QULO4X#KJzjPr-MB_ z7oMh>S*)IRxjdy)uEhxfil!q37s%kI2a(n^BDro7I_|g$>;f!_&qB|1ht?}AL(A1A z6A2~FCg7^UU%u6oD5+b}tFx^)8z=LKPliP{lKm zL}sV%LHqt`yz?`x_$fVy97`_XR7WGBjh?lfFb zEvPYfllau*@rx^~%1`fF^}kBhK(~m&OB~|i6(-?9XX)ZhWHKH))h7&Uq^m5z7`C|j zvD5M4{g_;}d?6025VO-4QSh9H-nBzsQ$CK@`s?J$jLgi@%KYKQU!`3~ytf(Uq)Ckb z%zfmLAZWq1E^MnNE>tkv&g#yz*g>_8E2(JHB$({-D}AJ75}8%xFM8PiZGq}@Y<{C4 z%ok2_*JH8eNv+0S+E0oe6}@;D$QBxKmab@r?rY8cLWz3LY{;8% zj)K|_C@BX$z&H1>#4cG9>SE)N2%-UQlK33VES(|pA5uR6Oy$nv(h*!l6 zS%;3hw?rV9+pfp?nq?cA!?(u{2(<)1#viex5M}+aAsvVK%QO5Y2PV{Z_og)))NA9s z-W2lU=c;}zchJ)C8rfHv)C&Z)`-_(wW?br4#}_PX9`yEp$KQ}SGd;``;8K+mW!aJH z1#h`hHO;p*{hxG|Nw-0^es@Pii5F?rR=?=XrYqUo>Um_kY3LAqkcjX;OVy#QbI+WT z`a*~PBJ6|N!t%WlmqFU%Jd_YHl_)C$3CjUzF-&t{3mAt}7}zA$>nAuO_RGY-CiE6% z+fGFpC!4ypQRhCOalzh(mCO9^Ti8l(b{{>)r8cN=&bJ6QA>sG0vz_|1$Kn9>n~UYo z8DFYsqy>LUFpPVmXggvG?;pxu$iPV~%|5|6!!$+II?xv@gc8c`vA0FdtIzB{OU373 zW}^$y@5#HA+Bw&eDvf|w)sOQ8;v+5#Kt$$^;*ffBE>%uEX`TU~1^WvkS0u6u(r5u$ zA}+e~{pN?hsPh4Xo$~?Y48mL2Z?k`$R5X??`@`rJ^Oi|<6)1`h&nDSN?htcctvRR(zjmK(9`oC=pV1Y{nvxS5|2hdMRP)bG6%lBR^cx@B4zo` zREZ)TC3TM9W5LrU5@)?m3#MjJ2D~J(ylJsaS~2qF^vY8TXZ}-J(h&Nil7%!sP$J>I z5#cTo2MHeDH^4B<6tKv6JYG-x$7@qK$NWxo4V>m$V9bZc84tD_;dZL-;y2o4^@Hu* zBug84TNb)s)-$?`&&QYJ^c5rs-QCEW=JA7Jsl6Aw(g*`3vc3CnwoI#$#aNc^nf-OK z^>!iY?Z#~9e*Um|{Kv)Gn@V1DwY$ig4Zl4-uO^&FHnG;< zNp#hXD`m*gj#Xola9_zx8>j_QmgSz+jONPXSbv-f7nCrO-jz}djqrM?_gUrhF- z%dnk;_5@W&6c0q*ydhTaZ)g44joh+)rBgdOpX3uWx0SQ(E+Dj)(35@5s8cwr&6Y*% zi@M=%e>qn<>r2!Zs@Y)$s?VLuhuGNY5I9J>Mi$tM*Hihn%1Hm^PQ1ex&Bui;*;R!) zZ8M^L=f1sv^H3;Ncc1abX3qC7wY>~}i%|-SpWbk0A%cv1klwlLvn+nv9%H`ZW}6Gi z5(lGsn|t_klb9wt33`L41`b%daQksC=M`uyt8>FAjMHYD+h^ftXupLyUCnH{^WyOR z#O@WZqF(Rmq|G%EPgPLC=Lq%nu93UU5~%J9`625xmNwIz(qjF5sBuH!*=hCbh!;oL z{o}FwCt#+YM#9gSB-f~dKmbURdxX@qrM~aKjdw%kdg!f)w(=zI8KnDMOe#i5WPI3r zK;D2Pat%&ASCT(XNuy&M-xWcBP1D&sTw%WFr4Sff-e$k3vt*O~QsKV(wUr;=B?x^S zZ8P!x6H$0((B#ALZCXC^nx*K)vg|B-gd!%JGkrUWQk;A~G)P`q zTR1n%4K>puWhWIiQVBu!S15?BR;d#h^)mbX zNy(}N3`_TfLWcX|TJwib5~Cw1A$0e?m#g$zbBZ}?vmLWYv>(>48L=CNDFeHfd#~hz zG5rzr=SepGC5&UEIoqx6RY?YWsiZ$Eb;ehl$u5s4Zmw@Uve+c|xZF;A^@>xeCydF5 z?c&kYiJ!WYR$-{e ztWCWcu_%5^Lu~MZB+w*pM3JZrbo-T0ljWJky3l@=46$oTeVl zQvy1x7P%xL@@ty}JMm#o4RHDPV6xjYBNwM-)cdUuN%lTsf2FzRm^p{rDM}Kazk4wL z{Ez_DLEB+>!RS1Semj{^=56E%KiB*0Qvt6C6N#HQa@?5^DQ^sAB7?vxg^m1(lI{EK zGbr``)@RCErr+#IHV$CL&5Z5(jo0()g@0f-Nt&)f%+j%2Uz|oA`t7?|2!1;kX}uPE z&N}X=`k}*poobl}p2xEin&A&xs5ZmXzK!PHWR!l zle-6cN3VQP<1IIPc3A?p*9#WXQ>6>%?J3A0Q%kVL|KZrw>z*GmrG_m~DI|bgA4`Wh zL7B1>Dx=!RHmi1jXm^0CvbY5dU`WkLj!tmsOVMU2N_<=>*1 zL*!mUl%*v=3(?yF&|$!xI>2}An4!ph{o9Ix=aNfkQv)RdN%=x`iDlfqx; z7klB_s@Ez2p;}%&1Y`v)Ew={vj^C3a_g63}L945mQ-Pmt|Ap5^RXd!7C-(=!CJE;Q z=3{R|$T4K=I>WwB%8mYSba*29=a_QYE2kIdT8H`L!kR@E8Y4hBAr@nPkmJwh4u+wJil{bd1z>@U@ zPygR7SqBQvR+u@=J3=a!vW&gSDLidj_in^l>N8%u_Jrq(;S!D}$lQ3zCCO5sGC+>< z?5lpbv#l*k6(7?-7u!F_mKS_&rcghti0)YDd-q@)^ZH7l5wZI54+;tZTKL_q(nwGZq@$z5#m`@x z4mX8+1MsiX&n9v?^OH6O0N7cd63(1?Em%|*6Stp6!?c|>zpUvEWYztW17W15W^?*szU3Fw+gtV{_XPY!w>nD4vGsaH2jS00W3i7CZVqnU0yCWG-Vo_@_*xe`JnAoZs@%+|HZXS znxn8kH!O@sL|E9y!h&@OInI9lM#}GX%x~=cLVXq>#3(5p2KdhCc?>(118gsh-+^!F z+qbiIFHRTpa1U9IvvYAJ{kNL|5<;R?&4t@Tu@rM)C=>&P&8DXbf_|%e;Sm2SxmkGC z^6=e%&A^|&9tsO3;9_R)d4c05;~APd5)lA%?bOdsJQ64P>}Ux;nN+ftKeRAC{Q(d) z0Ce|iyE|uv65#3~tr7nPq~AP_Eeezauy72}A3uKlMdW&V=J)HW3Yh@xh@6VAaX_Jl zFKv^eGE1zxtST=LUjWYAG=;tVd7Hn^Z>n8!``x!cWyGOR=p^?o#lL()RaSp+Kdk~; z!Cgy*mGBN_{!YS&z zS=xzQt9*@W|0$)Pd1?W64#4N*KGg^COl zy<-%WFMd@);6&7aT&va_din9)*|TTYK2h<{?rn|%F0$Sb{+fhX1D>{?L?P=nAixIK zl@Q`8;-DIMtv@ZN{fmote|E*c#dUIP7T<8!} zT>l=j=e68`m<47kYTg|S5b82fce6Ums?sZfhQaNwv>l4ayH|T>XLD}Q1fkJrZ5^FQ ze+!*Ul@tT$uz=5mA0P>y^yTl-39!ik&z+981ppPgy_Da8AME&L+pPKBNmb{Le9UvT z@vTCJ3wDINc+5r^{p?;I@TYkvQ}d4S%zAOLAfdmX`>#LmTEb}lx8ji833~qAAX)TM z>%)x^ShflfwBjHm8?n&0S+j|VRYqPJ-X9NQNh@(knyz-NHZHtS9|6eqpn6whtb~s^ zFl-%xSBW~3>_{PYtG`Z2ht0gdrtKkGAFRpV7su~cY0TUeL?93fECf+10HQFLVp~3> z0|s*_38lBWNl33&S?U8cpZJ;A{7f`K)y9kMF8cZdstNeJ7vvK3djG3x0;DF8d*KF6 zGUboJ^Y+a_GNq6%nVl4x8$SZ~mst*;EPMK>-*bKX^zRVDO)%iHj_Y8jr@v%#>_Tlm zv#WZdoDbJ+086hpZ|(c_)4A<;FTjD|)Y|6e8I)91))Ho&3vbWoWqtgJvOd;Y6fUQK zYk|8C0EH9v&VRvK4{K*{51nkjGy>loY3=Ijau;tl1w43FmM7lZzkZUhPB4skQw!|n zr>4L@mO~Oj7>7%Tft2;n)BQ*?;s>Os{%<59V;& zm>&S-!42rXkHL}Yay+sBC9ZzH8_!Dxz}fy^U*hOFz=uD*Rs{LDt`r~k6RZF)@cl3) z_GrfIAsvR!B^?lTBs&;&>nRcNs^@wh-Q{oesr*H_kGTpSj)hDfCLIs3Xk z@EC#aq^vhIBx6iZe>6S0Zr~(aF$KjnssOED>*cbBF^XaTmoI(b-%h*M$Dw*NeRqba z0HfJ23W@edO2Q>LgF8<^pvqhPL&t{cNtwVu!(2aLCmd8kt0Yx=Y6_J{|0i4Zmp}(v z=>KRcZh?*;5+Ts0Y!CSSEd+U6;>a!(Pt}qW9{-D;@VlS-lM8{1>i-6q=OLWjZHL5y zqvKyJ5`p@NS>R_CkWu^UvG4!y_(@Cb@pTk=vH%qiFj$N89DqdV_9p+c9R7_wmgJQl z84mdOfJw#UV0J6@zflRCJks8T;0H^Axd@Ol=5*N$kGuI_qU~_1N?86;*E8(Re=@rL z4-h!)#e!8J*6acDF{JyJlPb}S>(t<-OHF6X-~82dmh_*;79Z7Bzd}BCUUezU9HJba z|7(CVUG)MKn`y=EQhsZQNj{a*2K%{}K2h7EguZ%2bKteZcg?b(VT(URL@d;Tt3+8P z-#J{mOs2wpdqcNzvF4P|xigpPwzk@z=FC*ih|hSW&5&qjzPGtLvDO?>QJ!|vFeP;Y z5=wp4%RZg^RK*5-6T3L+J?3qlenfxx#&wd<$5m8jUp?$bV&}?KNU<9#R_GMpq{SV4 z+z|^!?CkMNPUjUYWDR@Gxs7hhq^tUe9CM^AijHX*cdap)kVB1X^yZ?^F>Csp!uMk) z;B=nRQR!bYs37O-FpHS}EFj{+n%og%yiVtMol=()8phnVv{V$+2FyQ()nV5r*(2&( zg}~P%)W~0)`%1X8d5uLdx&0KM)s_q5hzuik`DgXgKPvE0#G_HR%W_BhyH02Fy4&F} z`G5QTpG1?xvf88BsE(N}i_&UpAq-Xj@!x!FvPEywa43X^ALsqDSb%(y8oS3Vm}v*k zA9{!Ft0-G_uY9!1CcW)cMb=&m;)a^p)ZsGE|9SxZ3D58FA=ANrX@^@M>QY2Rc#UT- zQ;Z7b9qr9{X8u3qW0E?ir9ACaP#kMb$#VXC;ALN9LUI3{{u??ZnC%mLL8{Hga9)=VKY$K9DYt2eO=uwir6|y0KC8*DU&Orur;; zFY^3s6Wycr+tbd*rm>dD+j#vNpC@sA7#H@sfRqcCgFS~?_P#Y9ues_{2!xTCWaqTb z@p`;cl%X>urr$VOhQ6{m#4zpcU5KYpj{W!&zi~S38LMO<MZ7>PhJ1=VYS34kJGh3(|^-2!99Rmgl8WZ)%bitO|Yqi zu^=2gRy?zW!mZ122IeUPhfh7ML&0Iw=x?seG{$;127Gd(3@8WbK&$uE#MsJ*U3eC~ z$0SR_#yYO{fAU^8f*XhYe0Z10*`sF$KEexa?v4j;wsKEZuPBQHvCOkOLqm0tM#d?U zi+Ph}Lt$wW2YZVell3e$+$wQA#{X!&m>VwXV($2op`_9lHSE$R2R>aFyOP18W^FO4 z7sqcBlf`}%2#{s>8=-o+Q5!hr{?WZD3>Uq;+~3o?h6lLv-xLHyVu36jiX}ErR$4R+ z#{Q@fRn_1y*%@30^0e(vsJN_lP#OJ2v3P!Lf1{{+cg0O+Ej`(#AELV)P`g1;SUrP z2^>H5?cul8Ur-J3p z#1IqN(#e4{`4JbOV%e46cY?asU0@znK&C2bw@z?jO1*c_&}iI3`ZA2{?y2IPB)Kgp zSco$|$f9xTO6m)97%-{vG(T)Pif<`#JV&VA{it3mLf~i~SBDgkrMO;>;3^VRvbfyj z`mQ%NH5Ez)X@^cd^|Kbu=9ly)&A34bt%QMR2bz6OWQ`sCb-Xszl5}LU`p+dE$t@#V z<;rX%ucMfj%yWl3ue`H+R`je%3{`P+tsmz{Jnn!T<6Rwf7_n6@T|)3{!&tr{3A^b^ z(W6RL>>sBD<(pi3=I%sNxAwL-Ff_#X6|v*w%{ffkmpXZgWRj}4p?#9!P|p{PfTUu< zXVGqucm!zq10=w;`D=prgrS08I|QnGjPPJ7MfdKLzzRu!=RB!0oc><+Mzv z&A622>zyG*sUt++T}|BrV+1b_*a8=B1!S_6s&;1$mnOt-T%)=kwm6a!)X1(?TO}6W zcLn63p%Wz@_$YhB(tfk=t#E!<;C@{16?PXJw|hI;b}lXkpxZ#|?9o`4wkn6OeK9?s zAD3;eBeB+8lI4ZsI7%y+@Q~Ps1rLx;-4v>fj74>L1_qj_rWeiix(|e=<`#d?#TI+} zi93?Bokz#vU6c2bH|HdD*_F^)G?otNo2hdws`79F+H+@1px+`L@(dGGA=wHz)u0mV zi9snrqvWnlrtcHqZ0Gil%gHPV?QuF zN={kCHPKKl$$$j9HjEf|u^yaRh97A`3b8+qMAyCWS3^6i?VqK$dhmPtu67~I8`pU4 zdTLO9jfstG1+o#ii=h^tJht{JZ8ovmtw3;`X%4CYx?FVBO3m6u8N~OQ@~Pm_EbY{* zxhRwbEmQd9^2hN~M=4lMl>BX4{q@OcqQ1V!rV>I}AZ@utj!_qyl~42(bhb3NA5<5) zmx4Qu6*L%1YK=h>iRK1Z&35>aGPeX;3|oU*k@hr4HyOZT*gr=&H{IDbH6dy`2?huVSro zv&+diI;|%CLO7x*a%@mfjkOD`fSC8h5kCsEZ?bBb)ZY;L`AdB6QMij}@CQ8va@*r(H zC-R&3!W~tc+S`rNV**(@HL_C7-XMhvQOasX394~I;&a8{=l_~S-s66z7az8t4U#Rr z{YnyuHl53lQA^dYHH8n(!j^6tId)L;(T7)j~eS0pLDkHjz4LcnMV^}kh?5AfspahvG`n#&b=%IQc5OLTcKo& zwqwAjFBi%Qjxti7Ua#)Ti}`NJN7QHL=LiUNH8M#xgKBZc3qfD3ObeHzSy7WKaT`ZK zpa1pbBfXUZg1%|U)Jl6SF0OcQ_1T8QeCzFc?$vKu94k{f_b znyo~CaYO@&4y3-7N1)1fsW4JUhgAN!^|m1fP1W+%lRc{BRdO_~c#0g5h_kblJv0?Z zTr@(|-|n(_YVXHPOnXeg8}{h(WL8DwRU8Db<%?ry>Ao30Bo<9T>r-Mz9NaFoyBgQZ5aY>$P|3;gWb`Gs#=)|a$d3L zOSqPbA8w7+)>0jZkg1OS-(u`X7F?Y;VKOan&|+=i##Pz=xeS=Qryx>i4v%-g6_W@k ziL{lAyMD)Qu88B)tel0p+Ym# zQWCikxIIWY_RCw`vw_`0^iyD`{mX^~g%}br#Nl&SS6qNib9$y*T)Fc?GMd~tGK8Cm} zt{yEF>R@?3&)^F~JCC=$yg&=2$MT$I@=fH$)J?4&ukNZ-|aZ*(U#3+S4{dHvCb%W#=X$7iz z#?d;VNNqJWi^+lX3uNgS?>^_2Jr0J#8)MNmAHVdL3nOc4Vo0s&H?I1K(jv2j2^>ml z3nsM^@*}5-MDdt{&bVHNTtTR(R7SlyYLTQgRH=I)g_PM8rYp9$5H?R_;>ouowxi87 z+}Ab!AM)MyWw7iPvY`addi=IF?g>KqXSDGpU?=IAKW9U>xKrAZAEdI-_+pjQ!) z5_-ZgK#&%MP(umIP(q8eV1NJuA%*~f1QH{Qv8IcYS5uyYBkFcP&lG^Oom* z>fXP-_ir!VT&oDq`S!Hd#6+n{7lpU_ww_ARO=Q1am7mG;KS5I%c!a(k9B6g*V1iMbhj2G55G%qmy|CrE#p;#u`($77{PL=Wer0{h=G!W-2BXyAHDVSqlJVdI#;j4t^l(Ssa~Rp*gHNPsF~@Ft z_36Qm;BciEle23f$6Po=C+wO1S=&54Pa214H6`eBcz0Myxo_4I$l}>ru$F ztq77IZS2sq^0*C&)n9Zwg4@Kk>bkrhet}8Z+6u9%g>l-lfz$v$H97;EQ14yC6N=WQ zH}m%}!|}0W_@qCb^?&V}iw!Xao4zmffbns$y*?U=E8~XxrJPzVmq|~A$)!70R^@Hy zfCNAXz=t4X9KR!bjJ1>g&E{p{?qUWb?H|EuF2(_jKz#-y-5lP z46?q*nO&77@=O)|feiNZWwwh8gF1~Qp4=+m$6eV{Vo8{8Zo1cr6J4I z@`vr@b@2gb56M*9S!+=?d=M)y0O?ib3=w_kqhdX2s@V}pNy~WoQegnV4@bwBSje!h+^IslLimNQO7!4Zdorhe_!CmE0VF@I zY~RA;jm}x^_P=PB3;hF;6xWR$=zth^?XmI(l&5gGaW(JwFNLh#sXYB|m#sJdx z1Cln7?eT_M>&^0s7c}S_2)6*9l;)pp?al*k&m)?yneprla+4HRdTfk1*%2k+MJS7R z(r4m1U(5cf6ZWo&0N2zZn4x6gpD;6#lXk~EPPEbCLZ&5$J5AIPEu?F<0$eG7DU^7H zbiR8XIJCE|r7k1Al)IUz?RTQ*#L`_SHPeX2>H(k#)?kgO$T!T zUVHQnc&zrk5Xjy1Qqg{8_S`>uk?m)uaPP0VfA9Uw(Y4`whls}I-&#iwY!&o_oQ|5m z-j_3N9c_N^8|DsoBS&aOe7oN{8?&nWIAYj@J|>#yRT6yw*h)!ZbMjCBoA1gaX5t^l zVW8^&OVs`iw3BwW-sQ_crT6P9B~`EwOSI7oj{5+Cn}x%KJ!f$s0C64^U-l*LgM(q^ z{j_j^K?DgH`+ef#Ou%69F^|u|e4UySh@#Vg<^Fi^TGDCXk>9T6qS2n8*q@(ZzYla` zU1X1bCJT^qPm-V?kAjBX59I=$1I{g1q~@)2^Wse9jVu~J*UY`~ps^n5eV5cdPA2U@EeCqVBX+_v*PPLka|Y~p3Aa&Dwxk7?yJVVaBf%-r0hRNez@OqBrdbsDubx{N>o z0Xc+e;kyNuexcKiYcI&sQtsxUowt<$Gky61xG6PXw;#~z+`Y9GAzG>Nw5x57An!Ud zb_xM%dj=E?wuFw^CDjGHI05A6+Qz?rHg&vtzyBtcD`dAyXss=+vZf<}+`{=r|8x6c z&l_p&qYh9Yb9EY!&=vzYHvs8u0gsD+wV(PvoH?6ekNtAnFs=U{RDAH_|DQ*MJ`bBO zSXcACms^n-xE%R2clg+2@h`XE^4VN6&Y+X9-3}H2e!|yvDNE;HYxK;lTY4!#W(GZDGZKn?}v1 zG*CA0pVwKBISXWx4+vc!e*aPB*|SmVRIca=O+jHQ$6&2GAasqm-euK)1lL+)L=7?- zl|V9NZWUvVBjgqU> zrY#fFKXw=}VwNbkG)T)IC9sE48GIlt-RA%g^Mm+W{0nYbCf7$+0niEh<&bTSCtKhb z8UNNbg=boTl5ZUyA;&FvZutznztJxnmvV$ZMw!V<=94ZXVlGgJh8Pq$dnIX(>7#KZ zx-fVwuQ3H1JktTvQx4$*zz*Ez>3}z-9Z*04FllWnxAxe?e)NXXn=dApFywfXZ&#y= zOz`jrp+gCw(!%Qd(!8aZze4^_lGy^5YsYmj-UFp7td+N2dinF0DNZ!>@N8AkYrA`b z+~dL2v}Z<>bROT-5n3niPdXE~^KrZ(qSSw2?-ZcALEh+?8Ul7Z#+nN_+sEgudFrY? z^@;pwQ;|htf6>e2RnndE%!-rLQyQRt-bLlXIrml*Z=qMq4Gd zej1DXXS(kvQS{y>8WG(C<}KB^ziU^T-o1%eRvzd-Ldfip22dA8Yp=O32Kqx5s$H)~ zC)JPNgML}6RcTaZUtX`9(04I)VwG^A=J*B-|eb)XIwd{zKF! zjJdJ24(^!I;(d-O*lB1t=#0EvpWaD3%Ene!1R14(H@JvXm01OTLrvSG2nw?8lM<9f z!G1#Mury#^t*&b2?QOkyZg&CucGYdN5Dcy{D;#;}9a~WYCv)}<48wjGp_27rKJ)3Y z0q$xp{pSj;^T_go+SZsAR#2|u%*Bb)TdzypEjrqxYRmOP8c1cVBr2s2is;d9_UBnO z(a0c7#-mRhPhg2oUynRG{#99W{oNi zZ#*6;`Pflk@NGwx*F^ev$h1}EToYbt_NU)?aS@28YL#Q-07iBzW1xVy&>2Ih_ z>(DNe*cGLkPaW8~r0ms^*8Zq`xw%4*L#B1nOLu!t*r88&pI$eu45^K|Ucnih_px(p zT#eU&HOlz)raa?x{`dp0$~Aj-c32>%1!76o){7kc#v)eulk4xZC73nU`3 zO%%lj8w{{RkwDszqVN5)P`AqNpa68ub||Ok8aQx=u3nll$xY=`?3v%*up`G;f`eFXjN+%pUbL^NXI7hpDpq++iG{p#&V z_1otcO8+m?U=c}rg zCww%Csc5l-aVB#29o~UXXm8*9=`U=WVE!4Tu%jw0S`PF|u%W}F&&S4T18Lhda`Am9 z7Psx}%Bx@cutXH;vZp+snBRc7d42cwC2dC=049}7A8Dr;S+ok@wjW_jz=LGEix%#V z^$*BQHNQ!Bi^~PIoZAn%?e;25I0gJHB(5 zTr-t#*~s-7Si(o>p8_jQXDc4^8v5OwiNgx1tT}jx>xwCivr9EU^NEtP6@jVEd?~{k z?8Meq0Z9^sbl8PRy8zdpiP$wEW%5Ht)|Ah}E)~d^Xwg0-I6uQYH9d;Ms(Yk@3f9Yy z;P4^7ffX1>CFOyQ2S1?N70VHmIEhu@k$mcbJU(-CWwa&W>UAS&pZTH&tMc>m=v4>m zF833b(f3rVm@-8$2(s9`;pmay(-;|BPcW2k?OisDE4r24zcFmq!R)rZwXdnVk^S8u zmVxPQ+sDMKkM5)MX+%rJ$jU=X)8V)r|?BAs6mFetSG*jktIcP*S~J!g(rFBc&<>*-#Vn~ysd8CLxSJ?Lq6z`m+>C*O> z(yu35{0q(ViY+s;vd*{AvJ$a}AMIW;H%Ae6l2|lsYhc}jk;Lhay%i>4L(iId*vqf6 ze+VcTi~s8tO38Wv9A9M7{XhP2b0AE4iWQ5zc{^1H6NXg zV^#xM#YCYNoLrKGz_K&a_6v#LyvCjS2S3lobB5Y>m-D~Q14L*=Alvc&t4lS%_!FSo z%GXLqjc^Arw%6Go)-Nk7!@>Dn!7xi;FIopOz`3-?0pRq)m26;M zx~od8L-Toh1_nrv)`ZX6bhE~3E!WKQ@^Vejw#x*LDIsHJWu?jm=T|fUK>XSnl9?Pf zq<$KqK{Dg0wJfIabRyIN4k7Ln<+ePd*_?hhZ9x0O`iI(RT?>(GUS7hUhSTAh3m8l~ zB!Tnbw3fBSt`*_>SIZ7iD94xtU@iW{^z$xlF%NIoc%raa>@BBu9Z1J6_oX4x&PdS) znB(M#6eV-GaG^WN@xo5q*MNHaoKSQC7)ZJM(vSL}XFB2|wrIBY9Y{b;Mg=0m{W+|7 ze?Mg+e>NH_+ViSu%_{{ikp080I}GW5;Z-c&E}U6C0H~f5-|&HcYtl0|jyyjA_yuY| z`GOyGI=zY6TsU?ZAd+~*{MWDFMGa^*EgkdP`Q=BTIcB8(@HxP~0qr~iNjzB}$^Q-@ zDhHh_)wyjC#8*g#D*O+84m4dp^XN&1{*(byA~G#SV}LW*;FA?MP@XR+lDF>}=6>$W zvrc!KT6#I$BTl0uetaR32-%UzGIm7c4-f_YgrApx|fBBkw<~fViQN%0Yuq zg51X9R)j)l27gn=}3XO8Z0K-rPz$~KDzyC6W1-thbqlhXNJn2ITaQ~oki+#W3G zyD}LL&)Z9F<#c95FB8=)^75j`e%?*o67h6O7RB(hA)H&&?)qjMK`vsTBDXNQo1<@! zn>Xml2x&i|cdRX4{r`FH7zi+4*0k$68RwM~C-u1gbNwl(tBg3tBzr5X6%6II@3Os< z%YMl{CtjcP?~T6gBYc`#BJxp=o&{Im!s_a_kp^F^`})#;jJm>!JX|1gb-n>+&^RhuEH0S z7U8KKW=QLMF1O=1h9e^83bCo0?Ms`_2m;b5XQd2Rrgmm#ua_cx=kuaaI8710Z#k3! z)=9VshtKuR$|e+8e-s7?XfRGG$~{`98_!G?jXK^RFOf% z+oYFlQGik1rN`AKTp_K*S6IaOujr*;)gd5#7~i;RTRCl~m%LF)G(PSq;t0>gm22?K z1Zuur5TuyrK%Eh7z1-S zGS?$s$~D^>^;scol$*s_I<2gG>XtDbDt31rO2i{RYv<w zZ%|)S8&?&+BA#!dC&`rP5VF_H<_e_=JVw2W`YoNp5x=j{69XsDkQVf39xg{(>LC>h zd&hlxL~OS+f+@FvomI;*{b%cz;?+{y)3<#ldS|IH0N+w|-RVLaLpzm#BI$}_54gAPEyKO&|Yu~(NoC>uJaqp=HU{e-3A zQ_3PbML-8yu>V5?%c1s_iVfJU)l7}$vrBt!Tat;@nL%M3(`V2~1eL^2)F=n`B_u%Kj1=FmGO#NdmMET>8oc6P~A$xPVEeWwU+BLQqWT)`tdem?_JTLk1mODDJ_2ETtM!3 zx2o+2+M`wVe#vD41k#1#8&m6lvz~(p@)ZR4ZOHL^{*Geo*Z<8~qfF1i|H{)Oce$;M%LW;9xxH-ZpwQ0rKpMR$nktVN+XRv>vR)vExv2Tbu{PO?!ISQ(JU!~xe($qZZ8(mk6c;`f08&|;RwB+)Zz}x-m{sI z4Snd_V_vm&Xsk$-b-dlsUXZ+UChGhFVHdmYY zFRLU?*ns=o%2MVgW^69vXcq}-<__?4rsy~mnP9g(m_;lk4rY|llda$Qt{E8jYRQ6G!^{s4$O@QD%QELw3ut*ZwxtgV3(-p<(@Z{^v~_twe4(XU9UNA z?awq~ae2W*Y+!ePLsu%Y4nY!;|JlK!zgS@W0cR+QR%w!xJEo)~HRC%Wiq9KdsDu z>65Hj*R2Wuy?M{(bvpix(yxS^0ns$ywmsM|weMrM}@Jg(M>#=hT z@k%ys&89}RB{JM|PQ2Z+N@{i7Yr*InsdUW=k(U#B@n=IIqt0W$Vf39kP-RgGrpFM%#*#3Az}=m)p5Z*pLTX3( zlezW&Vr7wUqiB-nLk9&F2yXi>m2M?0u6jXk+xu*^&JC}tA#wyW?0B{;cA>^RiPgVn zDSEgk-Uy;>n0D>HuW8povD&o~U-~U|XOB92W*z}Gs2r<_zXl8n&X)-{^Ionld_WB> z09vh_gfPyJ>d3RcXP+mlHOzK!Cwe}GYzh`&b)q!orI9r+(o+P-IUt6l<4-Tt983?Q zMstqT(bAl8+e97uU#z6%N9mkr!5(WcLfi^BuD4Y%>X}RIuQm>(`i5kCw zLI6$E8Ta3`1fkoVza6aN1~~~zy^K$8&Fm(w@;eE(&YaxMelNv7JRvW~z*HKrGYThf z`wrlFzC@=iby2a`P=@&7&s?+JhE@KkmmkyL5=_kH|GGt*nthk@8kk=6@#NIh)JgoG zF{#;J+H_j>fJ^hnj5t{4_@GsbnW+TMS!+tQOA&vv?1~lhWlK8}qO@GU2@NBe8)enj z`s}jz1`EBIp;E7(Zf;by<e#JMN$RKk=wvq?#c$0YF8Ba3 z^c*y={#Lc2lu-%<&b;Lr{}706(Yu&*dZ;4O^wJ`ncG257R=0&WyEhZZNX4F=jg(+q zQc}PA*_ZGL!jNzn*ma+&G4wx_K68{wO?JKKP}+p0^+NV9UUD|m zcrV*>vJkk(&F{Xb(_!ZNGg;(!97-!^_jtQ*p0!_DzzC3sc{e+DqiNQKxeh$;_2-Z% zK=oC6k%aT(EL4?8Dgy=XU|b+oQlW#RGx?9mKH!I6t-lCjlG2KQ4-@#GT~yKm*wgoq znVFuT{Tkl<9F8O1{*0DuYS`|@sHKhQWZs5 zELjmKANxW!@uS`NpCw!wozf3(SIZwfMDl<0&tImz^J znZ_&ip^KpB5}z*DH|jX>rWzQbUUyo_n0CDys%UiBthHsU2Yfinf4euj1QGu0tEZS{ zO_y1u1J)xWB?}6c30~=YDnvpLC0@zPa~-?wn#NaKR=QJ|B2Dt`uS(Ld&YL3DZmq#J zT6v0nX`-Uz&PUbt4a!0S)Tu#}WkJM(rnvopB0%KbH`#aERo>k5X^gMSyi%IZ4)fxI z+SS}9xBbHCV~ha8x9?z2V&jJJ$G27oFh<0io;D#ogsP0T4hAqk#mu*?QrpkTY@b+q zUS?EQeA)N@*t5FLw21&z#!DdfFic#uO4%>>qx&0`)<=XW!K#9Eb0|&zV6=&A|C9XI zvAC$J_cKw;vb2uX+4mWW?N-w-)~nV+9l#IuX^+nthdlstwivx5eJ2@IQaQu>Gpae@ zyF6>g>Zi-F@m!>GpdG1Kd1$u1oe{ulUTV>MH~)B*RZ~)Zot8gkGWtVqr+cnbNMig} zk&prlgPYv8xAHsfI!gZ8n*aO5-u?(fX@6QViAE9GsW<3YS<=&?V=|}M<9CCsQ7HPb zReB~gY#OurDWt!mH_8u6A4fSjV}k6qYYzO1=C6ES0Bq%tO^=Z?Umlk!GxKepX)?;6 zjP&=lv@|hktqbMMZXrpa$gNKu!7h`i;S^sNG6iXn&!at|2+h$8$TY{iSq~h=@c(V~C&5rUqIypTA$ z7vXgcH8T5zQK|2H&AE5t8Ct0O)gVnd_#WLnd>XBAli?@BsIt6tV>1b$Ct4{Sd3JliKvb*=G zICks38-r=Ra-t0JYx@0i(@K*m(x1Mawqe|fje2f;Y;5$F?e|t)@3QLa3*6v$St(|E zZTd2xc4KO_KRFa)a~N-dqQX)zLBjNsHc%^1baqI2I=7dcIgFh{r(}JMFn^signv5XB9DMkwOWS>Tl*K4qbtf+I>9c2GE9g{S z&4SAQM0=#MZ(W$j7}O!Iiijd;ue1#)E7^ftQn|g_`6*3drLv?2)=ddpIs=``21H-m zJ^r)wl&1;|@jph%C>q_|9CpuoU^>0&uY+yB;ceIUk1Y7#p|3_h01hLHe|LjME)a zSQIwILAL;&Z$!(j$H0l1RD}WBap&|Ra~U5BI*9~P(sr=5DPqhllGIM+zfgDoIGavy zd55zDp*3;Uu{FQ++ z+{~?TrN3j_nQO+m4+bAKPJdjaqLqz0aIFio+uuUN#xzd3jm;*gZcR1@IGw1TPOFBQ z;&A-nikdq&u72;*w(>mK4gPSn=KXjm%h=K0nCNqu{bEIx zSWq8PHN2cMLAe}r3Dy)ckRr`=Okm?E5hIP6C*_9!bTQi^N6jeO^OUMx5yKW!`{C7n z4fRy_@!;zcMxKgB3?uq}fQ*(J{SD1M0w-YeB|{_Y($7@dh&w z9nq+=#;dUkm?H;Izd7#$q>#LCe28Dzzdn1+x<1p<)t!i@PD6ifR~yLB_;`+A7h=i! z#x%&&idsx*^@a4WDFy_E*n{t>93rg_zqN+mt}mp*aJ~UkM`7Xf5lwTJ; zIeXmDopK_Jo;!waU^@GXueR1jvR*)2(^ai}FA3XE*1Ubtf2f_(3Uk<#x2D91k>)+| z3z2Ru51}W_->AdLa5MPD+oeIVZh1$oVtp19gfuuz~_d^V9vU`|i7U*x=Pz zRpq(87$wmAG%Zy3U;v9atmcLbnnbV8wi#VLhdh;cx~zR1#eGhH)D%IlMG+f&qy49! ziqq4sK(nH-L(AwZ_KVUbJk6Ns^1j3BpPxXtq%Y{#SFH^Q!)BO zXZmLq^Kn5jD#$BW^W1D03BgdZy;)CNvo5n~Yk4FDhWq%~Jm3!A&@{S+n10{V5Y(c# z)*3};09X0Ps02K)4&t+C2)|t#`G<9W)bjI%#?=ovb!L=`bdn9jlVC2-!wxS(KGL+J z%yOQABF+}h0z)|q;xPG>A#|rD*n>B-)OO`6bjq5#YfF0K61$l(qZ4w^-w-79$zshS z&5xjojl!<-l2=#2(5b8_|8BQW2SW9H;D1N+dvh;5`0ic%ej25PGi)77fCq;QEJ1R^ z{5isf?QLAph(_2G*m_It%jEL|*^~Yvfot@k9}QlnrqVY)viwJWODwN!-I{Usj5SD3 z=0JNDn>-4a=jGH{Ok$0hE3rps)t2`Txa5-F|8-Sx74p@1&q%Qj=4KAc4br}qC04U9 z80_nNFv~$#3Y|lwW{!7kSA%0WyEkW`q$*8U{Yvs$=Sv>4<|S>3xHJo6LYbu?{4X(+ z|FS6lOWy)U&LfQjQilCuB=tId&(%os)u`hBBv)a*B66Q60Z_#pqP`f!fztoc9sW?} zfb;&#&Ho=4VOs#QDf;6hO0OgTr4xk>O-$my3Uz-bqdcrE-c+WW&h6TJB81znO`mPh zKn*4f?y5RP-#d!~4A^9?1GxkExij+n9IJ`8pU;9N*58BUQ9htmLGmSbG8f zj^joiK^5gecGa~|y1hZ5yZ4GKILOu`C@}fhBz}r-nLIWAdRaI&23-_dH2)kpxCFbE zJT(Uj9LMxTv{;I_9HQyxlv{L^cl+SG#h|?>#7%mkm`U866Rlwb5Q+^|4?ntsha^|Y z)0LdMSoHjcp5&NRGQQ{cLTL+j8lNrTAk2+LmWZt*jFmm*x=<>_gU8Gv@?Oh1dwQD) zEp8SY7CH&15ip48Q|daZ5h#$I+%In+ATZv^;$4KO&{3O!&h`@Vi8ZobW*mda)iMxV z3uwSC?_S&4x@$@6{U9-&kh?Zr*cVjOo@HGce(mkxoLD$lD2TMN8Ca@m#p4|{km){b z!bzy=aIT5?T>~Z$PacP2u$9+C0^I|tMimc>D%%m`ukDfpXFfrWy+mI7~U8bxZHd9;yVJm)Mlt!|{iQ|Nww(}MOb+GL^O}D7>nn(()iVXKuhEL;h;oICTkKVj?x7&U$lZ~eYKZShp z1z>_XA7-oE8a2)N{gcIV`)wVDlC-m=A&r3`c^l?W_BHWmr2)3bTe!LG2%FA~PFZR$rxXXdR>!ZB<46>uYtJ;YpM{uTAwe5N+ zlu@WzZG0Hwgi|{9SdW`CWMF;5AmAW$WIkkH?Rk{D(76{89MaDvVTb1%hbRpMP*;e| zGJ{$<=4z1#Z;hhm&WaQi|7LyOF2JKhLnd_9s`p(vT^3M1h83ndF7joz{Vz+q%yj%c z$Oud7CmZ{#omigdh5$D*5?(!5ek!l7IV1odXXtOou)P_vF~7b#g#*EbPtM3;OWx09 z4I2O~cN#UVMz?BFu~A@k zNdr@hzKac?+pBlbjHohl0CkwdPH_ESJKg|8VHWjqA#wO=(ppt)_atxmsm%H?#sda@ zgSdda0-Z9M^jX|n*UZ%n*KBuS^^fskP@lUOx{z1$rcJ`dd&w?Tiys*58n5&c-B)n8 zC|@45efKROCO4W@D!CT|dgn!g#4rTxr~wD*LjBUi5mAs8;*Ta!aSwlNyk2F<%JFaZ z;?4riHP6C^kRkQs78#0eh5b)0-8l5=R^7BAAUND?YAoB4H)U3bKMzgW_Tw#@vKiam z_3LZIbd^J`Mm}9=pNSqVm$}=vzA=|9WfZMy1FT<%y#{p+Rn~Du-1^f4#&!N~jiJ<6 z_oq9mK=~MjwdpJaCfBD#=3?klKi?TzP$C+6b?WjKf zo&7dAVZLZpr>gIXJZ!WhO#jIdo?mZcq_J+Zo&&eO@Yoa2x7+RIAK?^ybtZo@bWo_( zeVn&Os5T!LFNQq_T$_=sd-#qF?P=U7^mI{gt z7?e6gyEB6#4>!*EQ@en@)%B{Zp@UfPGdBBfe}3uxX!z`A|3b1&tr zH_Te`A}Of26lT-tVC*?+QgG;qk{x93?&xf~&n438hkRxIxk3=^K0M2|L{2R`zzRH8 zP;&DI*v3X1c~#*<>p9Z#?7B^y+bBHhKCJwlO`VDI9PS(`f>oeENN2*p$om%cu{PxT z!jMM5AS8Mc`*R8+-APbB zw;rTh(2=^{S2P=byJ@C5^$p-k1Pmm3YSn?L=bns-e=zh-(V$U2WhV31b+9p{-ni6} z8GEifYxxv-c;i#tC?nf^vFIQL326y}(0L{xA z%e1~u^4vpqB!nnypu|uh#28$Z9=_{1A*rU+BgXJPqw}R=eOj_1SV7S&$J`X%FX|{h z^EWwT*&faKPru}L>wEa=_1q7DqZ9C%=B-iwB#eWPWs%lJGM3a;srJi1X$sUPz|N-x zK(-%`I}cw2$vOyrb05BOJ|Hlm)fAKh_|hM>vuk-!ipkQnJ%8>T&4>Mu#cV={kyCK< z>z-@5qa%;aT7zI*h06eL@bRUsXB^o2)z%~FDo-4E zOOGvOR4y6<7CMBnM6&(Z<=}IzEAyKdiTbC~*&EYTVeR+b_Z`(`yxM|j8+TJmUp;*q zXwKz_6Z^blqsH>$<5)MW%^j9-By=oF1{90P({X3~wPx<0SCII_`*p+|a5UvG_GC(< zn_mq#Fmd5lHZP#*KKfS=U4$T0~{mcwA zKc=bEhXNeRwRYb=78>uV+Q=SFR6)M<)NO6KR7wl65{nf6W+pbZhWlQz27A` zKiX$n)O7mLDl87n^^di-aUGj^b)3fw|`+z+6((@ic&c39p4!&0%&Ih$-mzCcnh9Mvt1CwPitI_ePJWRjHtU*Z8Tn)53 zI;5`U67w^tn#$zV!p$ioICTcY9tPI^z>kPpJ=3?azUDH)zU|dqIg#F&wbYp=G`{>H zD<#YN@QL*Su19;hEhU6AT62J6gcX0@>q7528-_ASTbWuYDz=n$|%cTt0`qB9}KkTFb39Yr_~=jdn!Y0Av_hWn`gi)UBfdfo^CgnNU(s zdr)1_iiu)AXX#`JWpjLX^+UZ{mp>i5X2ua3D>8Akj4nzYZ=?!_dDTswuH#AnlB=Fo z7eMFMuYW+cyTRByVWaiU<^z+g!M%0vfW@P>I9I4R%Tl*F(%BFm;c)$^w2S+SHK|cc z9ShrXZ_SPs?vI*B@@~|fot>EK{JVQGfK2O|&{B|iOkTD3@ZseWcQi^uSjL_1RqX}n z);_k0g-MQHpw`pXUmG>k(eeWy?$pJ{!k0-kkw#Ltx`5l9P!=Ts?#wxOybTFXLpqOr zxD1M(c{sfta6&4_5a7*sW={nb2L!imr*rI4CaAY>7uAvLcze`WMoA+hOO;-VHXa_~ zb8v2x6z19H=8}z<2?vOx7Tkr0wv_fre|70xJkza=y^ypBFm1cI)C1PE>BnbS7ro95 z5HpDFJTjeZgNXQM6T2TVx&MYY&wnvmO8)#z^SECk^}ktBr$IEUowp3=!+jsSo&{0& z*Pc#;&oQFzP&EhizM8u4@%(;&+Y5bg@N%7zKRY{T1Ny7P1s*tz^ba`H=J9|1e4@{G zL+B%he{is7O^1m|Z2Zc&mX%+bqcI{rKECZR^((1MW63WI`l?(avkRc?r8|b9@s|_d z<%)eNEl~OrPr_pz52)f+>1KkBE|)qVt8|~a4tVTxu7A2p84NaWD-2aH)lik7TMM%rgSro5|yH;K@AK1BH3bIho>I4<($QwYp-`=*bW*npaZX6R*buyLEdMP11DpU!Hs2hie+)hKc~BZSUpS=;;|4$8kKLMos&)|V z><$egR~_)SN`-!AOYSsi3Z>#*oAw_R<}p|i`7f{spm97H&HIIqG&V0t6wF8YGtW;F z-@j)JqTI5Vm+>k@9syxu1@IZ-hD}35(a08PMp4mb!Q~$;V&ernF#spProJKB_w6tE zByz#!gkl4=6diZyLd<*B{^9Q zm=skCAPdvPD~_5eo=(ZRY&~>}f!_jL-y^V%Itj8mt$BIuoTQ3+&-VSfJMC6~f4&st zC2vz2zPvL%XCdb6w1w?eq|Eg-+~I^9^z>%5vd{)CL_&4zSM#pBM2DWS$!Lw_ z@cbS?T~7iUtG<3PFMi2nviH*i_C!reDOS6MWx;oo8tdAL0bDmx6eqzG_`pW)M}fMZ-=95zK^6}8@Pj#Och>7cJUxIhr3-viyGdY!d5r_d)|ua5bo+<| z7iEO;oabHx{fGuFu~3ftryoaW+$F0~Uj8@x1i^lC|7k`ZV9m|X6+ss0@YptTh*a2P zSNBN5lFr|TY@Ug2L}P{V8e(B7h=|ysa!+CXJktvV z{}A10DlbD!EOH&p*J>mGPJuO(2|O^{cUAh0|$5!b8;?v85cRf=xdNF@cQS@Km%41q?J@iF2;+3#P%u%5${JoM`)xPfYoExT3Wu=&nit@HTUsP4sMr`u4x z2a@*=>^?~HV^q7hr{@J3de??8T!wh7<*{H8VwUz@v^%xUYK}k0{&W&4 z;MO#jhP44>L^*m1a&!PEGMXmkN3ne*tsXudVpYCWjFq2YjFkZ!M)|Rx;hCm$=hU?G zKnPL6V4iRGKl~bjUFo2IY zJ2ZfbFXcEAiC5fihs5Ys8n$h|Ted(_34Hn#)4``Uam+Xx8im6*()X0n{a)g2d0qswTA~?{ntxR9oVc72 zZw3-FVu01J?(XA95~EP3?ZRRZ@cAhJ1G6TT{`>Qi+FI?>(N))`4267@xS(VMy$3K) zS>V48_3QY*4!cOL!8ny7(0cUVvxz@Zh|LrnRDy4_~m(<|%;8O%3>e@hYQh(`;c=(6( za&%w1AJlKWD!HQhdHZMi;P4R#$wbFoP7n<8IY7@fgi7p!k17wAsj!okH8nQg-X1Tm zwbp)RtHxPI#Uju~B)%SSQm5_W&-)cHs=fci{$?pHrTrdQ?w9>oB*|m+(!NX?Z*QUl z!UP@OLPkklns|QFf40z};C19agz2vJWtV9&11ub11`FiGye*Y;KWrl+4(8wseEip~ zW`)U=2)XxbvB3Utsk;6wLWEP(K>e_v4YEj+m*bu>YQ{T0=F0Z+lUcHN%eBjzCcPeWn$?4au$MSN`u48DL z=}%K2TV7!KwGyhi%?J7N|G3Tw@i`T=W?%z36d>+%ZgSCh_9Cf)VR$yf*fJ4qG%#pH96-2a2U_l{~Z?fQk|IO>duJQhUyIEZwRE+wF%ARXx)hfe4O2m}IH zfDsjxDqV!oLXi#$MPvYJ2?9yzMSAEZl+ex{iaziAy=$F!t#i&-*81*0SllIdxys(Z zz4!0hJ6gEGZDw~{G&j%lD&{Ka?x~2Z`(*M(e9yA~*~1@ji+dhNjJd61Vzd!83L)-E z7IyTs=Xx%OahLC)3?HP$UOTg68$CqEf48pqMIf0;on=+*l@7_l)nKWias2AGN{jsi zFzdqk(o*h!&1?PBZ?@9%i88Rsj^g-~jyPWia}-$#V~rXoL4N1nUG6ZY@%C+iuCITx zc@u)~W7ASqeP#R$I3Y|uHw&!$3o)hB#{eTu*_4aYK#@q~X{eW1(Q)yw&yP=n;M`W_ z0v#RsylfUSO@$~=!O=KTn--P%UE3Sd>CqYOPP%I{wJneU+j~+KJl%f1-IWs?@JW%} z@(4>ZPY*bU82+q}j(#>#YY=J#lcPM^?>E zm4dgFd^7eXQ6>3^V!{V_D8H1@#@xOV`|SQ+;(4^0hacEOGAYGzBv4S=#%FNVCp_l9 zP?#=nVO5nLQhVDn?x>rBI4pUN0%<`a<;9W2E^YH|tEm8{c70#*kA1x#(bcrfskg*r z5+hM%dS!&XkHRhMuKSkeqHB!!^72+#Z`AcuWF---VF7dUQCgqY+G}s@Cwuwc%7LXX_bWc$guER z>S0*L7{KSr5xlz53E|V*Yd}+*nVDa1JI)gyefd9+q1A0H%M!?3CsQUXxNm!5@@Z7; z$KSKs!&T2$YA3uDbXrRN+d*z2x(;8+t6a<=M*lksBbxE#!^5X{G13js6L_4wD(>Vg z#$F?<^+jG2>nD4e1-{kCGIfr)Iy_cYy*rkD(gIz9<`sA1SzdhgXJCFGD8d z$sZrICOBWk$RIt%KBk0^Qo3drlF!p&xs56{#q#d@)$z-u<= z*;{SA#_ar=(~#ePr6(;C8y>i%MhUqHD6szaYtJwvVN~rtUBkVy%>}1Z4$Zgl#G$l} zyLX>Hc{GHG3hO&(*3-7Ad_O(;l$WL;x#B|S^i2)Yd4=9jGe3es9+TZFw zNlQjBlXUN_YQ6k&`5G6Vb*A%)(>)Wi3Cuh_mU5O2(Z&l{!mG{K_ThJ(x*P z*Ja(2_5k93v0p8shTyZ*6ghLM4E91CBEXxN^zBKd&cf3m<6jm?Gku7_ja1Qblc+U4 zXwk!`!!zMG28D^IfisKUm1WQg;sKVOS6DRH&A@&qU_%{}wj3*DJP`OwfO%(LviV}m zcuwc`n%%_8GSiXo_CwD}6`l{T_4HN9B+t5>PT z-LkcdnQ@3U==vy*df`vHE!n>y)g8u_>si2&hmxyEYB|TmbiMn{fH}hTc18$zdM!8o zASJ0{gg7)WKD6W-rK-Uws9bb|?0<(7H<=hVxZWDC%5y34@t4W2;fJxb$rvA<=e3W$ zEK*~a2$f$lC&XkUGyd_ZKrdzX_|GO#8qD?j+`%lYJ#YAg5p(H(_tTtj3!QiFr4iluOlQu^M@$~b2lO3C~+dgJsD~I?v*IDCF_f*>LEkBq< zc`NGGFL2meJtr-uyd8q;NrtLdbqT*w{FAiU0`V`^@he>9+_YBkpp+MIb*-A8pNk!M zJ8c?s)8y4k^y?>aE|eM%zO-J;w&bO~HD-#RS7Kd2+E(2zJ9$B9FGSGmK-A1v zCad{?0uz^|$UDp!G_7k2?nXxMJPp|o4JA zOVUXg4~1?B9*L@$fGK;66eQvD&n}76Zm1f#w72dO5N2zt9!#q&ZYVnWP>(QLa|2gs zBKpfEGtuHOOX72u7vD9O6xEg0hblh~ z2v^j8>(2Uw(~`J^@9hjFg=L9Lo4N@>HN}0$LuB*KNV9dfI1;ryZ+En?MoD_ww0E9kAJOita*v?0luUfW9?sD*l{;Z-gj+xCFospdy&JLVR6e_fE%0A;J} z>+4|8t%Y&k>~?GmGmezc(@$4X?9^R&o^2axwhAv!NHx-0bP8?n$TQNrJ68XU^TS>T zT7n%PlVj9aW^ubjC8U|7fk!!HkPSzW^A<@fttO#+YTb8jw>w7bVOy zC9ZgT>ptgL6R8!>^ZN_R(K8$8K;UJiXu*{D&-isLe46fl?;+VNKIpFXpztmhSzi0M zw4}b##tyC}DnQfVmJ)ppgtydJxXQONd8A9}-3FrRiHWzZZu**r*%pB{ctEntB0$I7 zi&TSoxxl)Rt$1tP17T$dgG)d*f#P%?B%i?h17KbTaj;lgB}QR$2Qy(Y@^}whSsQ>* zOBZD&(aeWevH5FC2rA|n8ar<;p|Yx$D`+80%(^>-a*Hv?61dNv5~V_Uc4=>Cz^}G* zOK;OcVViK8AxSMRe7Z~WSegNMXQDF#BFs9@LY|NTK(92#3axw!vt1mqvc0|`r zDZVhpktY2){Ha1@%>7=0Wd!K8si=Nz#`@G(wjO6VYcsW^)_xh<)tslVhEVZZ#>qjww6M$;-( zH!0E*i^&$5ME&_Wg@iIEFZcyUwg^+ftO-xRL;kg7yBqO5{@l=7hpP#FZFf33$GSDo zxYKD97URN9*z4GKNXQKXYj36-HR1(zy6!=3DR4FY`{yYZ;tVtbr25W`6tvK6`lGl6 z$q0LjUQB@I>35IK&aXQm3SR3loL$Opu5$lf5 zW4QI?1g10htg_zJnRsj^TZf=Z0A2y5;H}qFqGck_r?47{idxQ@Iu4Guh;5R3*(o!$&)-^^Hvv92-eT)s%| zq~yAIcaA(}M|}@>u%ob-*fZQXw^;%$5P$^i=S(>2EWfQ-yQ`F}u&*C4OC5|ouMNi;9u4x^40KH##uu|7UK7i}Glqe8g%ylp@gqj7IC{pa)GV8HWqom~Z zkJN(f|YxBkv@(VdZoGJqj4tSAO0usmQOn0XqxC%yE)+1Do*VToH5k zuG7=69n;gNE=@SuctjTAq{kJV^OKBw!e?u7Ba4fWL`(>|$W@!e>IxcRqjuU(C_9}i z4|NY$6auYLwLLR*BKH6FL+tCD35bi=EPmuQKcg1cWNRk|w&Gd1$X$tlR&X!>UaHs~ zlu?`hmsuhwl;dM`^0&`1a|zxEg^I;N?ay=X9&>UwW7f%ORVv z-qzBbJaGezv!W0iZZ4U0GmlpKMf*E?bJ1Ay>a0i8!4I|6-?iS85#he=7F`Cl8zXb}R(V;!;y zJe)dy4Ncy+(vvRudjIN3x3+1-srf+%@l<0-4QnrQ`CI23m%dGT{lbHpz!5T;|F6R+ zCP*vS@UV;^z|?y!Af&39lE)JRuR(g?&Zyymp)Z~o*>)k9+KVWzp^w>lE;^!MW9hj@*upxo`7Wx4w^Ma|wt{ ze{5--?`jA-;bt4D$OOcG9@k=;R}YU!zD*DIq*^D;$pVv+)Lb*2R% zF1tl{V8Y~t%)uT1)H1eK6(Y$L+Dor_`@ic+pMCF1 z=&5>c9Kd!zhU)`%pY2RCPotIJWprq9X*4m4i~o2XvsTzit!AyJ6nWen;QYYjr6#;n zr8eAi+x54TyA$3Ja~DWe$rkWmAYLQ*-fGW{;;Nylu7xOKypEG}?u$Ob!pJanIv$a| z+{t3vZGRUB04nQrkd{?6h*G|nIl>It$|yCfm5#_#BuT zLvb-Tg~fTjGhl7$eXaC#8X1{CnC^LbCFyNGD1@8+ZSQ~kD<`4 z%X;%I9Ij0w*~bvGwY`ONDr4SOpp@znCJ~E)nhA7HI;3|vj)&7(;!*27qb)qbqR9G7 zs!}yx>rc1(HpO?pSBxCqwUz$2@cx>}=_G&b?+=^L(u+UyXn9Lq8XEYt3e1@fonO(OeXmK2cPl7eari0m z=#nd8NLh3bz3%ga;({{uxrV1~WV-_12~lgVk4(&zg0AU;S;&r~Q13pYUtbarOGg8? z@obqHCif*D2l|qPXMT6Il0)OIbK=%jJ>Jui39y3+$7b= zT*|gL^Be-X6YJZX6k|n?!a>~PCkx114Q-GLUS1a&n;b&|F6iXTIY_vWo>j?sOzGVo zCG>VDwcowhlXD{@anGIh!o}>hr2uX`dXml@pMS3cj=3TPHiH_Z%00SZ@ASc>+k>xH zzQDvK!h=w`s3EH-%_U`KH|biFIp+3AsY4bnv*=Lj{ouJ32Ps*NXWFyP(R)T?1b_P3 z%g}Mi9MSEG{=525iYc}?<23W*7H4g7?$6;JB(x;=^w2%^3!aYr27DFr8II5Q5*BJ7 zcPf8UvGvi~Ou9s?zD{a=J0a~zvc#zepLNZ4yD`HX7!k7MCoUqA_N^AkR8vJR5|fz- zRE~A6^Xm#6HT3n$If#us%|Y6uyb!?}CyOhPUarrz%U64?|K+n2r<)qz2@8=UaHZD1 zg#;?g1!`3+lDX|4iCmN-GWFvF>r^=2JyutQ$Fx2wb4h(hlqS?k_R}v`c*=<6FdN*` z^;^shQNnD{F4yEp>AIcu8fJ_Y7Ww$H=#+Yv=p2zAT_qgH)H57t(KPc`QPB^d-1?}X zL_}z?YcHkql0s-!eLb{krnbfk2XuJulpyU0%)!lG7v`rJ9joJFao1o8@uA@J<5VWW zs$A^^7E<>k>GY%$eV4+Va2W&|{@SLUGbht_Z`)Ky;dp_^hn_pD+p=>XMv*}A2R#A7 zDY9dow;~&z(5X}Y5^P}OZ>?cH{l+;${%O5<5NJ4BQ?7;Ynu(rSvO=cst{}jv9<8(t zdr@GICfBlUP%MCgF{51a+f@N8ukuKw;bF@B_FB^ZP@M^Zp>C_fe0#^*L%E}a4d26( zzIF@rsMQt;a48;M3|$|nQxBv8WhuxB0ad^GA~S%B9V#`A2R)}iEMFo5t8-KL#R_4= zIh}EJrjO@6f+9Dw0?{8Cgff5#g-Xrd25M8ucRc5aw4~Lfub%;c-C~O}_#L^_%dvUU z6VBcYn9CpxzfhrkYFykav*V=w;b8};L+?B2E@R0;_0-gix#`8c`cIixwNSG$&2GGL zrDAd-A1hJnFhLftK3kBhu}D=WmnNa7*Dx*f7M%YGNk?Bkp-A0jblWyniFiX=d|*6l zs)04GsJ0EQ#Y5Hac^vw}f$QBYPx2B(7g6A$!-zP82a}%%hEeq!mIkLrKP4nk>m*Y* zty~`zHLCM(o7;W+(4$?grr6k3fP8+`6`8%0AdrM?K=skfJ({L+5`X}PcEi9=KmF06 zEBBB6{y`%87E7I&rPZ+CKpKge)MChoS48s;lMes+`6uZ|C2yPdawOnqZ5(%O6g&gc z`Xi>*(ZvNw{#VC)#Z#K3e&jM$2Od4?4Ud9vMJ~BL>XP3hBd~+yME|7sSLMWyq4>O50KRfXc^gB{dsK==!|v_(6jn6DwD6wj@}Fu{`XO&6a=zyvf(U5 zBCA&?0zjj>zWe^bYfd+?(HPjYK~c#ZG5L+$niru*_Bw}c*|%uPL~-Q#sv$QMWP zVPG7g3Stuyc*D%jF2@@h8fx8&dS_!~l1jh7xwt1$HRR$eo09L`aC>5H+k3adA;I;N zM|3&`elG2}!!AEO48|YBo1C76TokJZ=66uqx`1H7M=s5M)4)BVypBk`E^kc#mD0h5 zWZ3Y#zpk4M$fatsMJTycnB?fHv{-9z`qSOYWGQ|gDU8>D@bhU~*@a9|2?yx9>j6aklo4lvV*<)40L3MT)((8SuFS2rZ}R z-Q;258w66J{RxtF#-fU`!t=lGcjG4ffjSEi7Z-i*tNoO` z+j-l-{f%OgGO$JN>la8}NL8+D=NqR7;Mb!LBZDB&U7nMgs#;CJu*l2|vy3~H^j^q+ z%voHrPN#?Id_#hy%b=DRlOE6>q|Dj1ZO=J^z%L0tITU#8?PJZSSM7EDpA{cpSBaf( zpEnQ+k*j-F|A9iGtaAmfa#2Q~(?zS@BJb}k@m+rTbt;1HoT0gSpq!8pRlpo>Ec8FV z(RRSsh>-hz1rG!z{1+KR(y&+!b#?VwAT?~l`}bOQc3Ic1T?;c~(nz!RP>(Ikwf4yW zIgfsdiB^?R5{X6RLTuX^Ilhp;vI`3}ffBS8HUs5o3}!azB^Uw$3`22o*~4J?e`saf z>yZvA?{LkIe~y+Ay1G7&js0aK!Z=jvp58k-8tsl@73mNK#@9*oifOp=Na92n#n8|8 zl~mgk&Rtc4LQ4R08E0Fun5?YnyoX!Z|5c9u82*45<#*Iu*@6_Qo@xd9uS;gBI$bG( zjUIC~>Ccvl1mI-LgfVdPu&q8{I*BlWg8md$*IDtY?zK5;M$ny8KY<7kCR?gC;pvvu znb!^~20r9ZWy%;`py7myo3WU<-pmk;58v~TqyOPg0jbAK%^pMDxJ3raUmX>`2E^eN zZKL@kAqUcu1*QQI(#kEs-Xp4g_#5bmo6a!ouWa(>-BDbQ5U0Ekj<*hParfnz^O5lZ z0$uGJ98AKd%3I8f9G(NJ=74^LZGMRJyTY_|bbM?PbI zI-CT_K_^U8gYy4TA~=~)+UiX8obwgrEFKoMoeH1Kl2@OlJ6OhqDIN&fh?HZKq|yO* zoxfb6ru?4n#b!GOml9`_6(7@B8y>a@KBhM+k+oZmLZrlz-OT%G|9Yy%qQVu0^XLy?eY?zCSdp_IWHIAW#S_9!Z_X5mRwqUcN_#*?><|`Td80(f=t# zKX~E^OlXAP-2;*ZA}?@7NO2tyGjZN6^NWkan`;Ka;sR}OW!kdUZGW`S%EyGn#L2bo znb$9g+7?T1b&FP951S426U*4-p^YIB%ip2?a=Xt1ms5ZixHVLFP&X5$Dfex4bu}f( zR!=WxaR^hvWnER3EM(7~sCEnXf)D5=p>8qQZuq}$4M+dCR2yQu?F|##J_1-vj4&D5 z8Q$FR#3jYYzq=WGtvROxFi-(ejK^O(Vq$~1#Y+$A8^GlLH@_tyVUw;m-0m3|K#goC zk33dae*@$;7f_bL{Pj!LP*)da&DY_j?=eDz{FJQ;OrcE7d_a^d;kQ)z`X^c=+gR8- zs*Zy4kWL1G%AH6Gg*+|#!^uPEdYJGY1Zp+(D(mUdtrwZv0z%NTl;`qWr_E~peVZev zK06p#ENSVSl;IB2K3UO7MMRHqDU&t>jRn8@lmNn;+`zv736OZ9<<-^u{^sU_-ke9> zaEJHbB*0p69)P$|M~ExlG|DEQH{O)bo9Fn_KYv`BSKO6`mJYq}9O-dtR4gaQC{T|0 zZ_I<3M!}<>fEul+dV$BA@iSk3UUerfV8f}|ZoArZ>a`Uyz?0#h>E{CrZwER~;Mdg? zDa{QiM(taGsV{nwQLzYhYGc|{zjd-->K>7>O4-JV0`_ZwFK%B?uX^LbtciJSY}^_U z{m4e6sn!E^8|C&XxMNqVU>*B*Z!Kv*#Uax{9Fv7~l?!7}>SYIi_m zq{tfS06^goR2|FV@Suw0tR6>q1^#lq_yOtiYKPNcBa`%(KuHqn>Yj&WCt$GXRpXD8 z&X3>Rx$$!({m=$Cs7eM9#LPc5K?d|#5#;<-1jqOI{CnDQLPr4j6~X{L4?Oxu^>a4QXrBxa{J{P5^n|V$%#J&9Ua@jBQhy zL4aNHZ^OS;C8supdX>as3=3y>ctw!5?&F_|@`U<99dSXwZb}b+ zSQN)Z3ttZaBIn8is|5TDP;IIoPa2TtB%!@l69mEn=vXav+C#t(yk8`*#Qq^896J0*#g$8n?~?z=cFQUdjRR zb^31{y=ZjNG;R&P>!W^*K&~1Z8w1cy;J-8s@-my!nwo$y+4+VRq!C3HjHmZ(J6tpZ z;=cD2nNX#`KOcEPZv8#Pk{3s#@@~%ee3`>X-eoi~dY1xjYXd;Y@1PHztE+$<@~!HP zIeMYd>>q+icmUg0tWO_Nc#TRMdivkRgF)RHM+W^*Q%Uz4=IHLAs}X-a%Jj{oA}VhH z>Um&%<&M$apC_Q@_(}lB{G>1y0rn7JFzFdge*iiz>CXuE!r7K6acXoS=Ox>b2n8Wu z{J(Gtie3l>AVGSoiV_uIUS0O#)deK6I_-~P{nOAnWH7t{jK0#Gg4kTt&z6a$R>cOk zpOmNnt>gZGeQN&HCV&I{r-gXxvqRB|s+9Vz^SGnmhglw{Dhc}TyDwYV96^j$D*(Va zFvgHb^7LAl_P?3#Kb^n8^aNx%uLO`jxdLq~=UdFyB-7Qy_B{|!_?0Seb&8{StS(gYh`!=5QnFsEfd& zYIfdp`9_TNNL^z*B4fD32MyKWa=opizlC`qkBdcya_Z3U-$ixAP!=vJ`Yn`!Pw zUr%G~iuCxw_lM?q{13VF>_=Noortmy?=8EM^nt~N4#c4YW4fZ8_*`KCcq8hI)LFUo zBY<}5u<{6Rh&Y(qShPx+00-zyZza~XklN$vm0fenz16#D^z`x%hG*O7;sSmBcDSdx zWBmM?aF4^*W=fN+fSX7UZXNaQhpSQmmaFZ3IO@6cEkeJn@;$L|ub<&^ zX{3WhfMU!kZic?Rbznut*Ri(&I~B98r$#-$P9v8B10P1No7Cy$R1EWa+yezgE|0Sp zlCtDG=8|E&>ytty*@DaH{dG-)_3y#!b9Lr96&CxX^G}Ysct7M#P}GT#|8Z#a#fg{a z$DunnP9*J*LqD|Vk0U`>{{LG6jq$&st%ADwne;y(9|{O00<}MEY&Qr01 zaQbLqMUz=T_OiF4lNzeU)pklc;qE-rj!|_fG|*GTGs~9b&kSJ_yu2K$8=w;wOD3Cb z(QSL;YUCHs;f1ifSDXReD&1NAL+lS$Tob+t4@t^$b!Sih+$~S(UU(n zeE-91ONJvzupII!`UH|z$38Sl|I4fV+|_?0GS-7twFZim$zHH*@V~VFxULNw$*@dB zX>es;y=e9g2&SZj*Hjd}_Nur=R|To~&(un5g!}A7do~3wjsM1``+*Z+C#oW%XwImr zaEbLZYHdzDvm8f|E;`Q>hjW&*k*u8j#!O2K+T7QvY+ov6^UL#uzJ7mp zvptu8BH63}e_WhnW(l zyy{5%te!QYXw0jG^XKqg!zlYPB$pzd{!~eUU*D#2G@;6j*$xj--Yol)MlgNc2}9or?~!Px?XvsK@z#FZ_<=x z2|RURFtfnz0r7R-cO8YW3&G-}`-bl}&MN;`6fxef!h%gYBG1gwvzx8?FK%(1Mh|fK zW>U&hU}_MOVwQ`EV3`>$s?Cu*QG*<-B71S?h3=K{AyRFk_8QWWMCYex(@b{r z)RHXtXFWgSPl(XXAIct27F9STlQjSF33{ z{9#Gz!Y869grmdN=a~k)%)6syB=h?!dtBH^hh+!>*TuihLqVC`cP*8sBi9MZY*4WO zlqCJ~WY5a}3lS3;K?vObzB?>*aTC^3SDQ{rc1P?{-YeQk_b}Y<8FkNRZ&?01E@f)% z8k!|M=@RZ(X*KN%X5C}r?{(S8q<=FUORuW3zkq;>(AQoe*p@u1bNE5-;^z4`auj@k z21od?QG3rhaKd1#KQFVe*_t!sgGDQq?-gV0N{f;&O->rz?MQ2`4~Mu}n>R^@cnMVt z@2|FrImTQ>WMepDpVdrx+Y68P1lP-uR$TqR%X3ZdzAi8+3FG^t?s6E{O@pr(oXCKb zuh7Wjk*QwF-YP~LzC_7x`WV;4F1xi~LxR&G)65W(?6Wn@ra^hlXi^V6a zm^wWf*9L6hr8{vg2{rOFxP^q=gD8Ep4DDM^Pw6*+i zC{fw$(4s~Kfi$y8k2YjdF>{t`hoOqh9{RfMeVNX^f9y8c139uKx^qg!(;tjYmj#@m zaSh6y@W9+0Ft3x7$@f&8OI;X?9jSvl(XKtiN{Jf(&AHJRIG}7+c&R$aWW)`EUP73$ zD}SA@LTW4x?_teqvvxL@mMC_H75y8Sf+4OxaY@;GUZv9H8SgCkpHan;=LT2ynh1Kg z%Q4}p8b~_WweJ12$2_V6WaR69FtNg_ zvUtwGSg*{F(M?&zo1a*_Z>12T)7l%4*bw4g%P24i`6Zck6#;wXPHa4_P#HoLsta6d zN$SQF&fSJKq<4-suWE!lSo>=YUAa`%anTIptG+P&?3*9H_nJQ`FVZ7adHp!N$9>{1 z0-8WE|H5RcWL%t1!6!!Km~Os~wBJg~pUHj=o*HpGZ(`oFEPac?IFto+W{t^APdH~s zilq;adI_-1{jIn9t2CZrrl(`#^(~G|v_mtohyyD!#Th)m&=sm*BDgu!&01na8NH!Yt@R**7&)Jvla4m5u`qtSBw!H_rDCsTx&=h9cRe<~6>#qK)h)OB%2_16K zLk!lH&F}Fwd+QMNn_?kv_P!Jz^?oYd3C{%tYMvAY*n>6?tz_cXHJYsH3pC7act>Hp z^qP;%3#&2vE7u3oB(ii`lMQ9=nGoiyJ!&tKJrkJgWt3m>AT5R`RFj%N+UBv0D3z(CRiDkJjU(sUvhPV~6$A=z`z;qW zo~M1KhQ#`YxBSx|e3XL{*g=td>SprjNHM3#o0c8{eA5KIFa~ogG5@!9*3uc7kM7LB*U%5uXkoJdu1TPzTMy8zDRGK%vA$)l zGU5%ihj(b#vl*4zbOp6$S{FBVYJ^0#?=(cJ85IZgT0Q<~E)?|Jbo}&=Y^vSVt9Qb_ zYrdHxl&+WjL!WMpV&}o1gz{;cMa0BnrYNcmacPS?p2m61v8n$3Bw z8C&cxRH%Ru-U&UQlLD6#dY#-pKWI8-YvNY>CSF|yVsd-C9Ty`alt&@JgJAtradjjU}*5{K}Q?c$Var zMtoV1I5;`{zJ+vwU5{~>B>Xl_db7uT@N`sW0gJzvtiTdS1EJ`^&D@l+?PWb~qSx3g zp&wnm`Pt_p_JZ~I6eUL$oxR3(7UqtBS|J1yQ`eyJqmggl=9jWHyAlwgbT+eJA1KPn zB;(N`vSu?KoxNjX7i+8kN+PVYgHxJbzEn%S6Di7vQdWRU!|BXvwQJkv++N*wa2$yf z>AU@I<;oSt_^S71=&90c6c10&z_86~9w2{W<9(93TvXThyJw9hWyzivO>`Ag6MR;T z0h5;c%n2o^okkY<-qek`*o^^Dx*{9LI|3X;`m*^%N{9;G|V|nCneeuwd$Ud%ZoBo9SPkR5mp{?@$M& z#z%re@#SP->kxc)Za}imm$R*HZhNblT~oEKyhHGu&x0hepH!R>mzmkX+8CXyw>ZdO ztM*`z+}>f<5~b;)nzp=U3%F}#LBL8|_K7!=xxT9{TrLAktuc}%rRxn>&&vm<@?s32 zjB^M%JG6Pn?7Q#|!4SX4$sIFx7LR;!sO?p^X7FNVi?cv#d#7DQhR0}I{CuEWgh-)& zRAJzrN4c}A+@1rFRDmvpOa^jiV3KZb_hgmZHHWJU{uUJarJ~l069}-tQ+%h2{O7GM z;)6Hm%7}u~UC4OT)!I}nVEer^i!RPkCistG>yuMdX;$&@rQWz2#JrD6md=bWURmoNFn7Fxay zZNe+X=$<9lgo@TmL{&9TW;FU4Ucoo=SIoDK?bmwthFk@1)cgI|<{u8tEYHkKdf(31 z&1Ym}qH3l9HKsvqfA4&H)rP{R{bqKC`EP|8$Lv}#`1C@e8Pyy88FB1kUY0A}cx_#6 zSAwFx8;I>{gtPbI+a2zLOoERC*3{j*Z%(|h)V-dQnj`;*PC1R7c-A4n3UWSRH02Z) z;yOFEHh@rCA1C!CBmO0G9FR9rK_C$N1_mY7)k#1UJu@qd3rMcfKVJ-76{K`RI{C!u zJW#HFm%2c|a_PA7f&`8aq?WrLfB8})5dTFnvh0?02%h!<+{AO zRsn8mZWa|2i>~q8bh%IUQGeDy&YmP29k9X>$aAp8eqfLYa9cpq?%y8}2n3hyK?()V z7Pz~zJEJ7unk7fh0n)dXY*tAFzkY%`E*H$Eg7MxX@>~rFC}{(+-RXJrwJ4V!i+_(aTBei?v9{k>&z?}-oCG@t2jJFdGw>PLs%y6OJ)$znl zRG#(h7AN56ja9tZiVU{n*F0^k0H-2_imw^t$plYnNe$+}B*LVn&kZU~SQPwIBN zU2)(+z*8z`=ZVhA;4x{PnVGST1CD`YzpxFQ^fGn7{68e%VLFMXQBP%`tQMl~1pR;e zR9|i1QAp@>reR9Us9ku5KSoY7P%iL}X!OR89(87E6wsWY z>5iF~x|0M}H(+Kq=`J=RQzyc*)^Vxo(M$Nq@b3dfZ4j?pUdsLF8?Ty3=5tf;$L8^4 zW-rG!s%^mR+-#-VCR;9S(svITwLi*9u$G$4X<%fVQPnJxNgirkzxdi3Qs6=E_fYhc z?uPn|*H7T16~kud=UZl+ycE`)6vL8%JnVIt+|09GLql;zRd1}?ZSo358|&lwYjJwi zaq_9`xYL*K8cDBtm|vHQq709*P`=x5EaYlN@(Y=&S-Jmlt~q>~t~s>3Ouv;+K}kFJ zW=p|U8d@VB+!TDU*jOW{IyNLk1sfw+4X*!E)t)bbMD+$3kV`k%v2M*OnMx6p`A)Xt z&}K!^ny#2J1%yL>Un{jyde5^Qv9&*+wiaNR)-RsM8;JIp*QFus;EK)N&^>ph5W1wc zc!nu$bG0y5GLNTM#-f@OLu}MWvNHKgd=kntqp&bxR+|UPlfltqS(WsPHrR6sJ&<7B z1+%|{+>aBL)^A@)(N@edDA{=x+BM)YjiNr-r}Q}GaL_r`=GuA8jc8v-vU-O@t8uQQ zE7*nK6DdFwFHq-Iy&c>=t?e+7JX{kjR@j~?mU^>|C)GsFOv&IpEakhiK#i2A8%)1W zBnd~W3DjGxXPNKwE##v%?C7N@$FW2^tSJdJJtyjLQ=o1UT-=e>i zS(u#Xk*$fghg3SjyLZKuBKUUMv^3O`W! zwUd$VMk8fnuHKz;nvu8MZW^C2$fv5BQ=M*SQp7>a&?W`VOnTK}HVaXYq|EbrBVERv zGBqq7A*l32{^% zNxQ(HF9H^cU6rX=pn6Y7-vN~@fUV@!X#GZqt9i@nDqL=VrMbJS*tw+b6x$^`oH=%~ zP1%6B0VJ15G@}KvM+0F9FcfOAIuSLX%`IEoHwj3VprwG#bH3wmASwQWBuUxqTC~@iwE&qM2Ov^JIpSI)tr$n~_ zCd+dG%u>(#JotfDAUWDO)^NBqP-o$*RRlPe{a~xv!O3ax5Q_Z7BA+-1dEZt6deaGj z7A2~O?kBbzM<4xJLH&I8V$!gq?dAj!wp-F1ks8EV6Pl|2IZ~d&3(;VG` zgW6A@-cnN^K8mCQAL2k;(F;s7Gt>a6C#$S*#(^9s2vcKRo8wq(hbfdNnk zg#To(0(Ca{wud(fYwe;DlUD40P9<$mLx&v;&9F#SplEy%SX0)0dSABRKb<&hd5k|iGt(EdzEu)M8J9~GJk<#jWWjoo$ozJaShxVFfuX0Xwn~gyQ&-I8mUkH z9J@MS60D}FIjw3z(FUxa_#Qm|_oEwczB$Uz6C{vRQX&dq(;rjgC?^i}_y2br2`8A6 z`sDx92Fd^QS)XG|-nZ;yJtLwa5|&7@gyEF>c7Ahb0OCEdvkTGCUv!%^ZGy{miy8;` zDg)!?&De>KDcIeq^CDL=TU%h$ZK=zoZ1m+Oyhn8oZ` zD{g>q;PFpWDLq=JGJ$hma8WsJr3%Q0)hu=3nCyTUX=#VFa^Y+^S(oe!GdwLtXgUy5 zx`VHEZ6ixF(zm?-E;de9Hj6C3FWgA*V}VSk%nPx#jZRokQ50Q_1rERdKg;Z7 z;X>QNZtFozory_@#X;ZFRK>>Tl)=7@W`Ogk&Ub3l5B)_%CXo>Gwj|!nxX*C{; z_4M|(tBlSN0sL?HQu0RT9%b-V{QMGjwA~}NEsAlGFB4Pp{++gXi$|+Ys3=e=EyWTh zjR7#j^_HH&GSSX9#)Vlm+}LVJnXV2KPi9F8S9%GawxfiR$2$`?j}49HYWd!C7me8w zk*IKgUG()WVE_OtXYddS(HTA$^ZTAXlJK|t^$!2vk zfJ9_Hg2MEyOvhsdtrMefpDuW*wwSF(zGMVGxl z6<*`D6Ome55IZ2Pu&{Dx$SF%pcMTOs4o_#5ctgF6Oi-D|>ID63qA(Zf=3CcRC*)BL9HAxX60M6YZ|^6D4%@#N?lCg_O}Z7-WS~7ACm`*BNMLs zQ=x!gwzn&?34PN+4XUbI(5Mx64G0eq6Uq~>)y2Mo^7R3kWEmlaBb~LP;Pmm?s{Kli zhI81-b{Z&;(5=RB%2l+qHY_uVrcHSVn*kqF!|F+Q5e+&#bE2!RcD=JMGQ~EA+(*NP z7GCv7)+#jckn57Z6Wutsa%^px z=$YJLWfl!_P*0niwRRU=!^1E$VB_~~UyK#bH=@$o9i`FQ_LY-oq&5b*)>(CdC%_Ecfv=sqM5??fzoU&g?_WTUl#5@?{*`GxF*?v>o!vsr~P&SDNN31fY}O zRkVrGnI=dEnGKr}+O&2Plq*C-hoD`PAmRMKU}9A}RCH&GiQ{eZiz8bF&QVbYXp!s4 z&-D449u~<%Xl`jo>Vz2WikW7yO1N8I@61D3iYs<0+Z^wF>%*5n={-+Ku}| zFpIuQZOM&K=UwCy3r+o{cjPRptC~y^d_;mvk?0`>+O4kds1#0lcA3g#ChJu`zL<=H z8?+Vb=k#^VYMKSanVGxZm+9({Z2v zuXk&2mn3}Yj9Z=To`&x4ZYKqLStPj55K}DEr1+qd{OvI!n63nHBjKhqkGHr@kyv6Q zO-a=!LagPOeo^Z{j%@(tkw$*0jllrm9*=MRu8tsR1D;C~6SS>EncC(-J1R#DyvlQ{ zpgbdQ@0zw(K}R%<3t8RGQ=2I03=d&GU!}V3#LKZ2o1RMjBz(Wm)89=6^Qs3P zvX`PWjBEa4Xo)4n_T&rLILx{fSbXhUg(PgSeAOxf%M@lR0oJAD8JU4FR)6)WfyLUm6hy~=8&l&Kv%&3y9jf}XtY9~28F1E? z5JA-#2yfe(6k=;KsoEzZYGE+yX-!Af9dP8k7VTCjlqW7zL_{PCsovLAB<$?m(Gnc5 zmc(!8QjoNbgfI>CcO^AOGc4LFb;g#K-Hf5J6T#@JYqxx#*Hz?dm1Jc!A1RUv=AW2o z2^M46%-A#bOMAbFu1bx%#Enltqi>!;6&$_5B_oNI!9 za&zUttL%KXHy<=hg({sDy>lnw3XP+(pYTuziYHYnPDV-8q-1G1ZQhyRW}+lj%?{=o zk|hLaKer9Bnsi628$+xuB!~|B)q-mUk)as#Hm^X!+Q6L%{*{X_9xRejnCEG;^<;$n zhw~4k+8ZI+GYPd5i8JdP@+xf3I5fc6UpUVJTcX*obmguAYbvpE#I=8&}L;opavGG6Hd+V?$ zyDnZ>MKM4SQIM8Kx;rEU$x%VNYv`eC7(kFvO1eR$M5Lt|x@!caW5_`|24;XE&VWA8 zd*1Jy@B90F*LCjeVwk+|eeb>2-h2JlZ>{AJ_}?Cjj2ag|YJ17667Bv9O3HA@la#*X zBo=r_aWY}m%E(f(p+lqc0mg86EgZ^LX5O-eJ3tOX^*kqk6>2y6H$T7p>*q4XH{8cXXtLOi}KyUwr zXnlUN#w%fi-ij|kF>!q>sVB4FI25O*riLdbJkOk5TwJhO|6&+|WES#PujVa<#6MF& zsRcWipHxMK(Ew^I%79R(Q4d=s=+dB~xDgMN#Mohfh7D=(fo|!3c7Z@76w9$J-#(ty z)Ksi&WK>lNnq0-4dcOY~a;Vpd4S+K}pC>$r#4H!&XDBHvD`O3NFeIeUcA-c278BN- zF2`Ef$H&LmR$gLrxo_4^koNZWYg=0bSdU4`PU)4)+s^(k$dE8JcOG^eD|M`NJ|uNA z0ZGP&_cCH*sh*L93H`vjIkveU^-}MQU zFnG1gMdT(L_8ucwFEIvefEKoP0xLE;RmAo8D^W2qq53Pqn#cJYe6f4Ij$~LRCYBjs ziM>M89z|0$*2iISaegKsrg;^V=*cZ!^%o`=XT=syz@|CwIX%JBnX%5D5jZ>(d#3}O zS0wwdw1032f6UjiG9E7I!5iNTw4W3fzX=QsEYM(0H6Xcc`Ky00rPR+@`?V{I1`vZ! zK;YnfWllXW`fJ|V#h_3qd_qE?iOGWZ%Rewo&EG+=`+~($#IXjv2pF|#`6qwoFaJN| z-OR-H=$?+Y_QaovM}P9ac+rG;dV0EI3^vRJ4jDI~Or9G_iy?^{5|JttDvn2K@ z&drJZxv=Ly7cO_MO#@~^-2bYR&0p4nF)@{dH$N$tp$Z7J^S?Am#B1Li8+3Tif*rue zSIJcUIZQE@e|YY@EGZcogA)_lmokaHUy%D1E%RR=pPpgvo1V!EAU5B7$qEJhNZt^< zRjFEN;p;0|(y*_Dr5t2HP?J~*$t^2$8d<;EC)xa|jdg7zCLtlg8MQfyb@K{h!_{HL z0P*P2(NU~qsulpTXTX97B5vy%*o61k5-VJJO-+94Hdkl(XSdy)u$R7bYJcA5cT|xk zc{Yko=Y0XG0>Lw|I2gU+{>erO9PN!&Ol)nJ_)8fwF`-o~_t=@k-pDlLRo_*y`~yy* z#{JH;uoWr*D;q{qsaPjgSFQ7k^CgPL(37j2SdInZFq(bC!*8%!eyKvvwLTD!!Tbzw z)=Mz$V}~hLRk!sduEy@{Z)pkfUy>(7`IqfjJsdZJt@I`CJZWzrNwBlE1;gq!2VpRv zo0|YOl-~OeQg>PaAaSU13BzGUJQoT*lNh*KZp3~5A~hkpva)8r8`ZvIFv;m;vo2pQ zTU*=e`#=H$g2oLOtP)kv4DIVCA!o5Gi2Acf_pEJgm9t*G1cU3duRI;|M1P%bc6YHJ z!pt58sT1UJ^##f?Au$nKwgfcu=;utCnL;F$SVB-x5H=#7BBP$9QQyd@$$AqjRj52F z!RhJgk)J=GzQ39yX8wxT1h4z{>7uUn}5PSE?<0>{|6+w=Ha|HyyCM1zF0ZIR@yYjPPtK1zDw{7BP^Whn|NjF zIpX{knRlAl43}aaf^$Dnh|~=oor2|6zjGjH-NP&cdq;GPJf`a#TBpBmh>NPFWR3Ew0< zd9i!b{simBL<>SJ71TF32PUXUowCvA$48n2v-G)OsAFH@ARw=)UMK{}mii}8Msq?L z(^pN``I8@ z2E{t{%`G+M3l|YVk=Wz8tRLe(ttb3~ql^Ur^%1b*odFBy^0br1z0KNbb2Bp!`ACnZ zkXoCfl>HtTo!S$dSO$(YmPV@j@0!3ji8)2DRLa~&K6+myD2Y^*CR7a+FVVW}WJc|@ z47VN4HDvnTULWD%{$!Bf$?Ih47m5D({%ZPcFp9hkL90=|g!ia9bIUb)CyYTKXJ^-- z?gSvWXSsU|2WXO!SpyZog<~hy)}um0HOTv383F3V>eV-?y1O+*!uSH$<~$!ERl5ke zEZlvBaiATp9`1P+^~?~Qwq$m#m<}vL2a#lMgeHJ8J-63~1_P68-RaN8;6x#rR2k;W^qYzIU2?LdU)y?Rc3>%o7)#{!u8=P(k?m1j44^eXv@AVK_ z>A~KRYkqw_rfA&3ohLseY>kYgY3Wcby<@TmpRfU1^=>G+AMVJz`@e+})sV@QM|Ot7 zl`)n3(LRXv*V}Em49NplWk`~pzJV^j@kL1}^nb?;@Fulo2mZ+ClL+af=q$|Rf1?5f z0_1^08gJ4EUY7Ae%{)9_9{)cu$UI@;*p7MwLu=vLj-fabfKii{SQwP-NwSjHl0=<& zY|D0Ic;c#yv+Gl+*7&rLaKi8#fxeZ3aQ!Bl6JBA>-r-7RQq9gsV(Pb<$nJ@yV97-mfIlCpC|)Ar(6dqo;i!e zmQePQ22+fPBFDDV!zx^Ktbe~m2XAdVV94j*2q2fZ%zw8l-OH4U!|6!xS+vWG!ne#T zPdQnPfR6W;m^)^1fYCH6ezp)+>{Qkw0{>|-0n@jBei;LqiZP~G{yH8=-@cvmM3Hl&e~XbsnaghNs& zM#>8%6;}vsXW~t>X!Cn3k^u`vvzq?}8DrKbhyFswi?g#7MQ0&=K2=f*@=+GBUyh>d zg~?)qDQoe?l;k_g8&GzK$~byiytOHzv@)EC0?q_p9+Xlri59k|m#lRYD!3RT#z#+Y z4d?q5XjarSoU9VA3N$ZGL-6N;FIvJY$AHKEa*--g%PV7CtDZ*6?j!`}r;hul%BydV z77ImwM&}go%|)6udGacB;vJu!mu-R+6MEG}1ovccFNfz%cM*IbH_d15xIuh8&4`M8 zz;Rm7R?KM=k4#&;XL;{@qh#dt*Q*Ra3m$tg8tCb#OwPuZtY`glqX@S+jt|wU{7hiG z?`Y_}+9#o|5QY ziy;2`4Sm|xSCY?fE|wDF_4>67IOhs9Pfezae?I^8@L5cZcO4Lcyg|-4OIPUYw~j6{ za)V&d^}CP9-MFao-VX3dH3br9m^sb1PJb^??&Ha{DT9hk=M!!`B0=bg+~JKiWLyu) zUdIze@bRZQIx#y}mv_E#Nm(|{P{@;o*2r&Lr!em1FPkn2ZByho^tT1^nvHA;@7Rw% zv*+0Je4e%g3YDzim*h70v7}_9Y@YpUEOys4I|zs9-=p^Vhh(~|Bir+Bhrx`c#87me z`alJ${KZiZYjP}yv1}H*+My&sD6IblaBt-EkGG55!fnj8ld)S(vf3szgWxDHr;cY7 zhq%RD(sa}!7lsV(`|7byP1WhzW+!_XvA#+kx!U5dTKSq`B%FgL5zsAhujyu8l^=ae zag!6J*m^^qHmt*HckqIC1;6=}R!Dns0{Y(vrr$RdB?*Hi3QMSVr?jg;yY}a}BM2SC zg~}8K$%Ky~p`UGu_2$eCX26dsR1?ZS5Vxx%ldR=_S9;_*V4=RDA6ZEZ=PMMz^ySy>b@eJIs3X*-on0iK^^dw}=_k#qp9Nmy7R|td_ePTiD>=_yq{IM0!YeAn=O5s zeM1jh_&R&l%{@?2QmtzmViB}E#^zHx`gGSR`oP*<&nj9LBS{g@TJ)YKN+c3)YkJLW z$@i2#k-z-gK(M_ddg;^)tVbjxAAcW&Z@ z*WTU~dMapM+z|TjagbNk|3dEakmn&WK^S`Esm;!<{=CCOwblQA-z>=IRYgIizh;Ee z=t`u3s#arI7oE756GyE>mS>t+h@Q9_XPJ)V6Ytc?tX{Vl&_T-W-QC+#^S7lu6XA_g zuwLa*&f*I1lmo3oW11+F7xh|esiiXEwE~;u%|sYX$y3in$8qb zdFgPWBiGGquQ|1L+fDT2PkcV&MB)|BI&FoKd&D{NE9Ml(XR{J%^9GA(cAtTJD>(l2 zn@~}CmT-ZiM^vL9kmh@wU75MZPoZsl2XtX&8#&b{cY?4b)x%YYc_T%>j@6%wKdGvF zXm$3^$v7Z%RD`_26FN^_uVqL`PnP<0M!;44{TC9$>W^pN&|2%GkQDjQwU-{KoUV^V zC~C8vbUQCU=d+M}dWhznxC#F=3+jro@J|M?2WxvK^ry5NuuSA>Ysn#DTezEVX(h~X zw1YG`&xOTH#w0*KR(GouNJN17)dSKou+9X^nAFwb(p;CSQQJU3Mr^w3#WZWcZh(=+ zZGT}n>?dRl_G<6={dhkzTxk+0o& za7!u@Z{Be;V68r>cG+a6!5gMMqErF3FRLi)QA6O2g+Co}v6f7$EY^SR^wl|iELQ}n7$iqe{}jh z@Z={o!fIiL>1+Iy+yVLoB3m0%Zj`$I`B;NzfMd10mh3jzmPe~L45ZQQLU2`K!A0{hh(;l%wH0AeXF^0*+6b_b>&1=LN#gp4v9 zRc?nHqm+9gZFY_`J4XbN{ZY=^%8jfNlMP|%U;AYi)4#sGvc?Tnz(#P_erPMcWU3MW5IJkr?%6yxp7=VI3X(dt=LL8 z&rdEf2zp-VMqAL|%->=yn%JvORW6Rjt)DbTwpfLh$)>*PLHs0TqP(`tO?Kbxmti@y zK5D6=rquTAdC@v~as+PH0qaJgwalRaZ|d#vI%P3R)9J%vDUok+1$AaB;ksXa@%>3; zmo3ol`W7Wq$15bG5~*hNp>FwTts4nJu%b8LT+uK4<~kfAdB_N=E}lMNvZ6Fg++>?} zV1LlLAM(LA!OBhM5gXX zpDA)ymt2dQpo$HCs53zz^ggb2e&PTr`GzZdTuy)`4~UP4Qjw4x{)jx_zCQU+2w zxVAI{=9m3kCC?h4{i@h_S}=Z=E_G6TMKa`2&NAt)Xq+ZV_s$gal2~7B=Y7+eN=zs0 zz&Z_PSKXvHX~7q}vJxZ=(#5Wb5$Tn5w-q>a)dFptlJ(bGd2`!PI+>W}(mk@zmgA1l z*!MTaL8AYWC+iVS#GhqQNKlO(P3htiQM5>&T**|-6U=2y|iSo1fy1@R+q zWjE}YfnIfRwH2`Ug@F={Z?9!kQ3QsJ5Wv?%z5=CxxaS@`H80rE9T-1|?C&nCid|SB z_uSE*QRa9EGdRHD1170Qqbq1G19e|~VZwr9)aJ{A^t z=V|b`qjOgVl4=&PTp`{$A}+>;w5v6nxvLthukyyTfybM6ULL~dOR_4|EpCTaK9CM3 z9N?#M>-4%{pR|jOj}V|fNAZRq-_ah)(V{7>DjoM~r^S4SLyWtRRN`l$OmmKL(%G{A zSzU0!t6^9V(4s1-%$x%@MoMbs_isGkv+<@N_{CrEchQW-x>xvzA&e`1RwNnJhH#PI(SV;dV5z(>IQMS~{Gi>T# zqg~r3lna(EX{BxuoqB@x+@)on-o&!6LCD#{i*+SAz2vZ~WxL^Z5o`Q9PcSTGM>TOJ z!m$+nZ5|qUF}8oL>qGwPoiUH@oyZ0n^ys=EiuNW`V;=M^e5sk3k?8D%(IPvd^`FeA8@mQN!YDd%+|;K_tIJJ?>p0ielG+*vai_O%qAhe&V@^GxQJUD zqrCh2#)cs5aS~(wy<7w>!P2-=PC3&0qud?6>!*3|rb{R1CO#w5Ef2THd7OxnUaC(( zMuI#IR7{U~%Y+QV3q9%Bw@Bcw&l*h$CI;<>er%iGI!y{zuFy3%8|W-0QJm5IvM^o? zS`YEeC-q7Q^|>Fb_Q$Hb6v{b#M$3;^?ePELAcsOzA#Av_JAiVg&n7$v!^c4)CT?pu>vWsnOzL;uCaTpJR-k9-7 z_%O6&B_M{*NYU^{BT4R7{v(1^%6eQgLz*lwz%%CKlHW)NhV_nIvTEa+%vA&av;x|I z>>xGr*~`PD1yxI(wq-iI9^7g=-+;I7_^qmvD#$g`8aAG$!K6YQkEVTA#XxoZbaeZ5 zr<0iw>B{5SXqK=`j8hW?)`*#Ebk|1B1O`s05d zFP|k1m%FAFUf)1~5_t`jsCj+xw9Alz)F3+& zHYpM?>r3z-l92cjIq$=_T_xjM)z$s4qczy&EzyUDxm_2hesov{iOc!;MHi%Kb**R+ zu{nAsAs_%)7)$vKX?&R{z8mW<*r_4zf#La{#>5+MUhmWaTu<#+Q;lX7mGJZV6vp?s z=M~xBukpw}g6AI+Mh2E*fIx|lhOxH+0SRo?@EHU`|J=#9=3 ziUQ@ii+ObR-5JsjFc($M@)jdq&UKOd(*CfAVg^aIIly00c1K-ZU2ci2*T~eW!2F8} z<38oVkxpT`oE@voe(yDjDIPJ%ThkYb&MDo$*i#Q<;Y|q`>ARLFAblLDG|(r&!r3nWhQ#1S=xFT&YTX}cOozRARaGP}$D|M=`r&)my965yPp?0r zsPDJ|Z!SHo{if=jl4j;6FlhbJ*p0bu>|IB8?#+A!Zl4ytqQ2?RKryd|qZ`-7^HvYj zC(cO4jo4b@x=TB!^_?4H03*pSYj1Dl?<}S99D?=Phi4_Ux&9(PZhweJZjJksxv$96557L z;)hWLY=rjYnU7worup$^M15@ZA2$s;3p7E@&4@5w<*9b_@}%Le(>=!dLtbn#Fp8kNI8 z5>f5awGu0pHTr^cp#=-;E^es@{F2fPqE0BiY`fCYJH{`v-=FwxuoVNul8JaXN{}f* zG|-vF3v9Gy%PIT}?L};zJWp%<0v2mTeqZo9-y_Cv?csVt&id3kc=a_3$Rg^Z@la(W z;=~>Lz^N~41+O~5AcBn*+#pi7hds?3oO$8>3|22n2YF?_w6_|@>_}LEO4MxVuKBA! zD_fO0omvfjC?cW2t~L=nADB+16!D~j-aK3QP>cWW9t#=cfnd;aHgD#Zv@2&zi~Kto z0mT!00t+MhQJD{I&G;^jHzZ}@zAVJ00aWu9;D61U4YsJe7R z7<{WYvSTK^Pd>{(y(*NYcHOoMUoI3^&Clbx03rDN!I0I#z~l9M)qa_K#2+)@zjcdl z;6C{Ag=&j8pi?k;<)PYd*$k;vi!WyVa!VglNl;2cRLJp>o#SR%mSpq&7m*Relp9Vj ze2Iu^CG9OZ|E`&!52C3RL;fBf4wOfuXv$?sC3>9zv=CmJjH_xQ1hvpilnTrBe?nL$~Gi*y)!0q=ZPkY>r zD^h>K8pXcq%n#$$T$t@}JP75Bkibsb{7vFcgkN-MT+J4yP)gW+ci|oULhz>>0 zE#4VKmKNG0yS(R(4a!`v#vPJ)@AeN)$c6tp>LGG37S>^@2%0j`>k_$rs~maPG&+{U zbg3ezoNC3DfCVw!59|COpBE};+Ml66Zg4V+{^q`3J8K*kXd3y;?mMK>D$U$7);W9J z^NB{2)Jo3ubvBRS}{1Y2jcE2f2a z0u|A-Qgt0IDDk0}0lEA41v%{mSXM{+JF~IwOLsd?p}O^7wj2GL(3kF#zU~qOT#rS* zI`C4g5w*>TcG!Jvx2_+^>(NpJ@A?lcgT;M^+AFn=wnmCL`r0%wS&Cw?fbSJ>v#h`j&p|UL&80|Hw4CODBVLgqh5Y{ z35{Wn56u{*PcPA@CT-IPYs~=PZDYE*?VVnI)je4YIoYl5sr zR2dRF+}9r^#>?${Oc*#BMe#x!#rpv z=UovnvT8)juXO91{Cn_+n|sZ)xiYz30z9WYA>^c50~jlG->^@BHiPrSOgvXr)smD{ zfZiZ=O_RF}V(}x{_VO?&*69ds15yTO4Q`6S4)!$Q$e zcb)P=qPNK;l08+q@posG^sP#GH*`m4Qfn2ui(dV%H99DTvB^f3u$e7B;Bos2b^Zwp z;od!7kgF(HWb%@{t<3qjhCe*G=0d0{Rz)?p=7+2oY_%&)J}e$$Kn4r;9FsirJ@hwq zZ#1J$q%+#Kt1avte~c!3;_EQRC5WHJ=AdB8fJmIEs^_8xyM#cPlEK62ag*x6WI%DQ z>-NFq#xHJkXJOar+e7M8yZdKLXa1`=7Y2*8UmHD-BPJRR(@=s@xE*2!Im zOz)EU0X|IUiiE6JuNEr(sL1=lA8JyoAnQ%A#E+kzy%M`a>eZa%RDivA`(`t=gMIDuhiN;<((0%+0on%^PE<8b zDra+i`#sl;=eKkZT5>yjs?3Y%*HL(a*o3HZ0o&=*shcIaoV$u z_2#DdsaTq(n2UDNSG*{yk$2!2__(9)T;^mIuaj()Wg}tAL(>W57x_M^p}VxICrzPh z<3wGT;K&OK6MDPf97D6S~ z3qGLMlZsfuZxhAt+J2Qpzo(8)ukfm=YPU3xHNTd&e~*nZ$OKQP$KPd3PeJtu*d^UqMWQz9YpS+eF>Y?;mcvrSv{I87$L{ zrEV$z zWIFI}5Ps^GY|}pX&o5FChp8=fG#{XZK}MXF5nbl8=$Dc`#JiNQXXk!T3KgHl{mSa- z4`lCg3bCQ>8p+3_Y~X&%-KOsz>69-|o4K^s`h>VCwuPKk(`hwq*dxgqj=c{V2s_ zG@Pwf5L`BCO+pL;8SkMelLw(pAr7&ksRdqR>$H}`g(|njPkS!j&QD(KM;*D$ml)Zt zZw#t`v(1rYUGyt`>A>T^K>emf^D7v-wI}j>wc0w=Wwe@x@8ZW`dmv#C$BFgmy=7;- zexdP6wUEKSLRj z?11Yq;6Jg%0I|#E@+m=A7CKoktu0J88}VS*V3scAP*%U;NUiIr`TXt!K*>W^_Fc!m zw2QB|yeMv_)QCtWHS7rmoeLu&}ew6EZ7W(3n)M z#|b&xS*We1;6E|4yukFcxKw16nUtbxp3MiZ9ytoUhr7sCmbOft%G$uHbUr3EUw@2w z5TKZMTk@s=3#Yhw?fTN$uZL@&6$=e5ZMW!SDw$F@DpuNTvVfltEyVIhr0kMK{rOS;(CZHQ!CL zt{nj$|1u}3^T@b@ARQc~uF$%xwc0fv?lShg9l7)CMlAX`Eys&K+BH2Cvt z(EQ0mhQ;Vut##V(759?DF#yA=6yMYHK9CNUl6Cs|mzOimLap0aEUDqw+OCPiryJ8` z-wO>@gc$|#N_L@5gEsp=xMbu`RTl|8L?2d@$5km&;sTEtgusTVQo>beSHo}Nhs5mB8D=`OJ7(wTOzyK{Z9}+${qwI&E5sygqX(0H&7UmZ zRMWiisU<99;iuq_ydN-f_X~4657Ea5TjI&gGNSOZSx>6~1&jqX3Hs}hT0f-*TzY(v zEMLXfj0Sn;mXQlMNqdkWAkTMB1Q4?OLbkE#U03egv`5pNNweFQ>63Vw&!^U>nC4u0 zM&aU9`~=sK)#Gk$;(fZ7vAY%5^w=1~!7%NH&Vm44tvtaKf+-Km|~dnU<~fX2lF#XX(Y4^l<0WWKdK#07*5CK{eJz z^^zg9PuawWtvIbKk?@F+%nmYtV0eJlAI zxU`~0xyy9#_>Dq36OZ~%S%b$h(!n@#wBNebDfDM7(6rOYvM_s2qQ#38x=m+lVW(lLy)GnsdnP5&>*z^k+#f*|3R%Ax zlESN}o$1uXYdX|gnCxE+F7}t&4}Y^OuLWUQeQ$@EL9>CJBKo_qG^C-0J@7-Fw@T z0!wC+JsowOZ!v~Vun~;9_|_4!Y+fQmTneCz4#(_yPZ#Qf&(0$~f6jO4zSC+Xlk`fE zG^*Vgc3WDk4RB`zv7W41a(3h}e-#z{XWlBIa- z6_U|2L-nBzp;ftj1ezLDrlVN;Xzy}zPN|;@r$|{^a_u^MdM9LuqoP)wF`D3AMPFy9 zBmxRtPNW0gwH_+YrhM&N7GlfcJWgm#)U;vN`08_tN~XOxc9;F2{0?{DS^goi?Y@MN zYTO3V&8mpA8wmcOl zX|6f5!9o#uhi|S=hn9NtKA_*@md|@x5G|Z}5x(2NJDjxjm^kEPLEv_L_M9^K3F7#A zvp{Wq93z=%`tD60o5$4C;9sE+Opj_;47nITHrt z(W7+ENzhoI^iF4wn>jB*oe+u!sWlFsuQ>edDK&rm^Z`CMg1Qv$KT#SLj0GM@t=L@t zx<0(>-&-cFDOrlO&J{{ORpS4-*JXK!?OKTqW~&2ZBZ%oT(|%njmh4FP(QV};Iq{6L z%3{MyzSO}AJqdDWwkF!X(Q3ohNM)M6?fM<}vlRGt(_UuRMq8Nj#&U!S3-#*Y0!dV? zvRwk9{G3hS9lvfQKym?FvvA=U3G_Mb{!%Lfv#ay8)~h!*MXl$k`0K`}OlNb+n0zmb zgjd^WeB<=^zP2rpB2Kc3q5@{7RJYtR@-l zgycM#K3a@D+o~*ytb@W9l3wr&yKcR^R-tSy6LFu~uT;)!6Ou3--B>7V@XU&6-KPDT z<`KcKLdt_pMC=|>gYr?UUVpP|l9)rhQsphmvZjlB0V8s^8~WS|MW}(jo~s#UDR&O^ z_pJ6?_%fvYd>6(=0eST}4uANzvu+W`WipaqCx4y%Dlixeb0cS-ISy`+-7OwH;~m}T zvaLysnFF=f{1PHoL9eHlJy;ktP4R6o+zqBPC>vZlG+SIenA&s4ZvMv!z*UKlw;Mkx ztVe|%HU~bgeBx3#QHk;jsYexqGq(l`9bG<>9@4_(U!PS&hc@L$ivSSy2m#sZX zPi*Z%-Ef=93=$)}y?bth@jdNfhUpkVWLj-2#8VlJs9v?iiUe>ugPPsH35;!D_|u%u z-#(q6MIRa0h6^2s1ImYD%cF#i>IL^e~HjYVx-;x@c*RfH1|HGM`#m7P938mK?GCpZ^lzKu) ze81JCa?GJ378tyH@EE-&{~w4b^ACnTWJhBac zk(cZWINzII=1(XCWH~yXml0)X1=Cdgt;XMX1&(jr>JpjE z^O?Y0+z+4G4!nOz*|!4RQh!&!z_yw)PGyumFu>Ur{7x6M1>F7}RMiffU3<__UUpl8 z!HC_(Ez>e;VztclJ+x~AOj@N);|iiQpYS&FsiJ0@GwRrAQ;xMniW-p+5m}FX{2P2g zx39_5fCx&&bO{r@(p!QSRQ4Gqi7WEDL^^SU?Nr5rCpUtCAs?1SGjZ|k?6yiz9mC?q zJQQ<=`(K=C*|i9o*Pe_OE&&%5mSfXFy!Sh|(=>A40zK$qYF?QqCb3Huf!?qxGNB^= z>1h%%iquVWN#lV#yb_6sHXYlqZx`_So?9)R3aGL?qFraNKPW_3+*XE{x3g&bkZ{R>hO(?k;VUfni&&SjKFg}W!8Rx)a1j>^{9-DZRM8E; zJUD%Zxd$Y6YqM0_*@6vCoHZ%rNA3b1Z|w}1VO`jwQpB#3@# z+v|fvLE{0oHz4)!|?XewZ=8N$S=!S=1bd$|Bsjc%RdT?sx0O`c2=)h7WMS}I|K$RW@i;3~hD9`uXqz`w4A0$~a#Q?Kh`=n$#~?SX?ZkTI3$$BS?AoAnWG} zJz4IynhUwAqb+-rSjWmO!LzNLcA|Cj$Ow}IZJbG$J-WuV^JFOgv=Cw<7v^=XZPQH} zF3c9oHr;1y>Y8SjbIu(>Js#&3qcT;u-!MC#v6_OOG$fCctZ;JD!OR=f?c8ybWTPPp zi;5a!ikucBIHxf5%~H5qECC>kikUrsKRa+A>mI6UvgF0$@}lWa&9OGrH2-h?K^}sx zI1=BVW^c=RBJ20<8??T2T0gv_#_g1%%tO@r5tnxFx?U~ahk-dZ#EtnMt9Ry2Co`=}8u<0u{hzi?f{oQ^0P34eftcn9$tfN5IY z_&1Z2gfCpX?=88&m-eQ}b3HRWo67NtNOj%c4YLXRRyKo-@QrhCjB4aT7uQ0ucwNL~ z?2ggL53-%Vq|v>paOK-lQa=jEz|<}dN0^Js2&@Jl`b1JK>R>ke0}(0Xl>g|jT4pVH z(+i%VMKeS&Yv^Mr>_F{&Q>)W7f5D$TzWJTDPvB-7zNrqW(b+Z1vQ)+WXo;49@k=UOf>?2FPiV&kP|$rg&$9kKqBVS}rOwubJ#oVJ ziN?1FN_zA{A!e&R@lS=lLZ&+Jby%I-QOv%sVJ;+c%Ya*p8hes$=zK*TIi@3WcZTd7 z-%HOghe4#qJ7ig)Jzt_%7ZjA)L#lg>^68lIUGT%7hQUU(NkcMt%D@{UzyB;e0F{iDfoYu}@6R10o$6eytprlHNN4gwUKc|* zW`W?Zi7XSiW7%&Jb&ad9dVmwGaaQfXy{KPIxHW^hb^En_fMC{NchD>@0otqz>?@9? z^)0=<_X_e_uzm#IM6zAvhNy#4y@A(Vt@J)@r-dEviMk|KZSy}t&gO7m54etl+MtxV z@J^P`6lu*Re0V4L&hfjSbOniM9i1Lxsp(=A3Sn#DUAe{`?t5snV5lvL{(2f9;SrNO z`fCzZvK2*Ln(U=i=J=dff~S=ygoYH7e$bZ=hIJ1ZI*7D^eVy=AQs+=JhjA{}WTqi` zOI54s%x=FWfFf^KUaUQys}C~=*7rI8NL|S$z16E0SL5~Kw8pc9+}*(^XyoWD^OW@B zanp%?Qp$-SHWzHZ)Mh9g#CoZx`W>>|kNipRuiu}4Gb2(o{ki6+Y00ZEUaQnJz{S}Q z7Kb;I;}ajTTFVf@?!egEq9z-IBQJOB)lOW{#p4Bb7JSjMJLn6^5a+b(Jgb6Jkk1R5 zl_uS_2!YP=LqspVuouFC(vVtcaF2(R$(QT-HMV7oLXE|h*8%O1lauq{n@D^w7332Y zm(xmEaENym^^=|3j{5p4;nU~0d9lo&h%f&HP{}QG2t^8b-Ch?wEW7ruImjqqIp!wE z72|(vZmj5aha}~>9kt*4NxP3hjE|iT;?;z;Yu^ zKKmlU=zoejz@(Y@ZxA%)&J3MPhJ@cQd-ImiLk5cZVrbEX%nfA@ef(Yv44$3VueO;O z9jwj~0&N%`u8lHXXL~=6CH2pssLKgZbCM3+(l%qFUQRbDsfHUGj^Lr<;UN#%In`zyIiZZljX9Z2aYdQky+>C{e+;JHeUBjrYN$1VGTn>{9X8?cf7M ztAuuIrJwTa#qcK&g0~lyAHDR?Cbt!K&|DRTjE9OE@O;|A?XjqcUE%rzy4A-{{2YPrRfPHn)~ z9gQ*L=H#i$JR;UV*yir}3fB^u8F-`gdo$^^(&MAus2ixM_6vK?!r{m2zLWc^$4|`Q z)94WUi*>f1&cButEBa-p(PM?nL6zYals9AoK$gg_kGNmh8M8Hg;B*jpd;H6KIz;91 zRi_tsd^2GIxF-Xog^>2leL-`?>U6dyx3yzp-2G@26Y;syaXtO;l(u;7yUuymaWHFk zN6m}N+#M;bYqAGIqdcD-j=0AHoH**1UPv`N3dLDnf2M&dAJ5PYh}IQ~`WnM@#CdHw z$vOC;&w>}7N2~NF^yCgrM!evNaBt9F{)kMr{!3uXdH$A{dDx%^l`B1eG}HqaOH8v_ zJrAA?HXU7yeb-`DNCzv5qB^m-@HA*CSLrnHk6rn?0H>YXsSP&{9<=y;un^H4xZ5r? zAz$^v)qo~}E=ZH-D%1R1Wr5^JLufxe2z5j7=0a!V029SGE_T1sbP8R-!-5@?$ONYd zvE%P{YBj4s)vEKEGhp51Neg9N=eVlbbGdH7*Kq#Kuy0DjMf{$GZIFk@80#e6A(>m45RqM z|Ju;$o8Biif8T84j$@Rfq*M(2+aG59muhYe*uSScFvVXq8ZXr%JzoM@Fyf25e6@#{ zvcF@AvcIF=G0uvEn5Ff^CNk^^ww8mMq3m3m?yJwI{WHhZQbDr;jUmbJidEkUG5Gy* zWqDHOLMQEg$18YFrz*Z%YFeTl+I4y!CaIq11IjyyGfu-|uX~Dm*V;0~#>=Z-ODhvA zMm2@^yh?Sd?jm^hv|mh}FSp&4RMuj-TKi?dup~+g82M3M?Y7m|q>iGXf7E zB34%Dkb+H`LXo!K)kWInu(zR%G*Lyum-R!cO$A%tElz(Byc)Kydfz9jJK_a6Mmc{9 zpiCaQyr$daw^mw$sxHtioO-#1HD25oEn&9VZ?XMNdN|!n^hRSHX1+5l{Q1-{pjDLu4r+r(E4beS$ zWE34(#Y%_j={mD}o}M4#jah$};NES;i5)GA#vkD*X~=ddPeKr15UZAxl_tmv_`ppKfr7qA_rjsY>5RmQW8h#0f~@GNm$k30#=@RlT7z|k8Qc{}6-==kt{+lVyH+K-%(6c!+j)g;_wyyYJ|C<6l+T5+h5~MWEs|a;>T_>kM4Gt z(@&3=-ce?RY@>E}b~@~Ra_`PwNk;}2S;R7>dYAZ=4MMrVYRS{-QD8F0>J8rz4w<;H zFx9*A^!gp|F>JSm9-zv6W#a-w2MnqaPRw`TnO0jbhkXo^gf^D&U#|`WY&O~mTBP2dO2$w3 zo-^3aI#ONEuUnFfVKs)Ap|W$8U;BNVxu#T z$3bXWK|ZDCqRt-669#5_IeUeLlNRZqP$^5p+xd_0=GZps%;akus=NuD(T4hp1B@zk zuztCz0TvpiI{FS^t2VSlCZt$@)TrqJ+kG~6^4e8`ZpRZPQXO}|o=ARk-TlfUSMQy} z#l4(rZFq2Dl1XI*Qhh{kB4=gg4AgHMUy_t?eGPn!Yb9>=f4=#g;z;=$l9Fjz8U61(an2%L$%T6$mEf0A)68nb6Tfz@MiTdXaaJ8+`u611GN^~KBiMW#dO zeexaL<0Bk4gSfEUPU?K-`VO_=zCdBEoe{{w9y@+RhW9jAt;k6%C?qKqlqoMr43v(N zhq$dI1ej*A=H`8r*V^(`kqBCbXU#e!O!}^adIN*Chz~QN`mn-}NE$SZ8jW+%Gsrjf zQO1s4*46Jse#CK&_3hTvNPyVDcKQwK8g&LBGv2D!TWudA9%=*Tc@11jl{{SZ46Ler z#0^n5EwZc;%B89?CaD(sUO`X*H~Fad(Uxa0(ruP6xGH1M-x5&eh}@vQ-J!@z!|#au z9cD9Hcb2Nz;IH~y%|{M=y0}LBniql)C!~IWxKMJTNA;Eg@F{*QgS#f^%(}!81X66^ z7jN6^jmoQi*!FxqHBK%|K1(1-J0?^&D+74^p>7ksy=XvvLO7^Mx z=NRkI>noslK7OkZh9W26@Tf;uN^wfibElS`8E%6;3**$A<=C6xL2U^T6aPk7*cXv5 z^QnS{#8?}>3C?6s+}7bQNCGc5 zPi5vGe##oc^_Knm65{3p@}=CmiwEP_^v+|hqKNY@k%w3lQd&w}SV3PPqro}QuwL$G zXRv)&qQodNvE7IEQ+(V60O9n~hsc&r903-jgq7Sl8wJ2s+t_l*F-|g<tO###9xBI_r&}sSEO&SjtZc#RFR`2KcT-LMvqg#+K%?f9aAFIgo`u+EiAo$0@ zK~D#mjzNZ_b<4FXNa|S+@pITgqe6MTu9Q_^W3jP9@#>_5R6zWVy<~=+s=QW9)bncF zN(yh%mUg2>yoN$Z=%IQlXzGjMlm2?sK^j*+dEA1>S_L9W~+EcfpAT9-*;A`i+BQoVQALxw zD$R(`gu&JA#0F$O`_&3)81MB>7xyV>?4~>`EB{`l1b<#w4)B$Q8_-&su#-Nq~6;Y zOYpfWc4YPjq=52!y1w@N-?;$DuN%OEJ9)K3Q4tt{)be{=-n3<-qbuD>U1Hc+RvOKgZ@I4`Zi&!?go0rhsN7hjNRvO%a9cBsqOE9&-!ErN-R7X!bU_RGZW>2KG^7|s!c4tqnUQ5geOyQlSjt{-;;T#Ll? zRq+{jR-Td#4Js}D>^f6c;~Y%Ok?J^brkH(*`RhE?ZO$5B?cZKl%<=9(f(DACiNTDp zNqq%wzD&#EBvOjZaD&HE0O8)O8W(L94T2`Mf9Kdr5*V~s0YhfpM7BSQ@6JTQdL*T% zL$}svKIE=947=PEJXUBJX>>vWpaH9ku3wG)u4($&L1r8b-sdX^AYVpwzw0%AAJH%c zG8CzliQno@!7f4cOW+y}f>Hj08LY`b++19TH$Ee|P>c4q1hpx|K>A;>f*KFE@%$ic zTX|FP;}y?fKz>kF#*)9{r1j7SwNHGG0^3?tcgn_~zy_t*bv8?**NoO_|!-(rBq<2o6JkH+ZAKwjPNonfRnv_cF*Q z5|9D)->+JgN-n~4@9yvNEeYwx-X4Yuc-;y0Cv!R#tvTMv@i^f~O*-@^ zN6;i}_;kA7Nm!%L7rYJ{H_5}X3`t-GhWJK@-`8gQ_|c?!7zqLeK4k21H%LAjj`Yq* z%}`*ym~0#aKIU;D4+`%Np2o2sD2kc)N0q}W^AO_01_C0->B#MH{7yA=xujcHGq&&j z5l&4SRqugt6x%)>H>%(p$ks|0I?F6|s))K*>yE=P6p39-%D?ALEh}bz&OPAurA`y0 z?1q_NUi48tOMUofrFyDq$pUTEheE;0VRi%Y#Q>TH;Rh>ku1#+-h0a<;B?fYos}yK1?P>M&e&l{CrBIW-z&_UyuO1 zFE_rGkE?ptnmtse$#jOQ+Wc>7$12*6T$6LxEgbIO!TTAEt@U~_Q!TMXn%dF!0x(`| zah&1ZlhM8LCQD&;d+(#|YJa0@e$g!dt$t$C^ass9O96ko_MeA)-Cy-r|8Ah7ddK}^ zUDEIELx1yW{&Uv7l)uOGPm}7^9~r#9H#=n~jp@Czva$qC z?%fW>lh|k6u6+M7(r2>g&uC3UBE`(V_h=@Ztoiu#@3@TAjP!PKZ6OOU$_@JC-b3NvJ&Fp7>gt>5zL8Jjj^c%@q zl1u#kQw=-_@Z8l^U`i-jO_i4|5u5@|X0<;qoACH3`WkFa<=YQT)x6x?&ZOf;DfdRaO zBg8C@;my(gkOL)WGcuRP!xQpuaYu27tw}*RM_+P$N~!zTkncr@{}D2k?<>MD$u@;X zrJ!pV`Qf5f%G0Mv%}p)cX#78Q*fpTFwN>oA=yR|Cw5ICy8Z)6^l9R6fr%hEgP%36? z!k)=~`ajkv|F@heD1-XjjQ@I+%`Sxq`zmpz|LQEJi;*Xtu>M1ZNSR{R>n`Z|(E-NSLJyHrmN8rJzijRn&M%GV!jX zpl3_%eF<3&yzYb2$A75QnP6+PHRo(oe`(X_lsQ9nk^QGR@tG-~tj@WNdX#V!yHepX zU5z|@jVKr^=mW&bpH+Wa6fgyRKe_aRq=zvRS@XD7trFw;T(0e08LTlUH<2z~pvZ9M zQsh~xYurE2d)xOYJ_s^fLgq{Si``)FJ!QL1Nfd>k^mOprxv4rV6LIXGIA7~h0;1rd z#7zAlU+HZKpP)gpZzl4}Is~$zH+v5lhP~a1ud)m@^lvM66Y|@a4KkFkD$C$gk%?>k#|*_=+wn0s$lIYc5+ zl3hc<#x38DomBrV|tl0yDo);o}`9aD3#Q=>5bA8;T)IdlD+q)3`%AEV&qhM72 z>}|`JI;(Hh)2P>}OpKlTSp@Akrnv=OK+Bx`zswo_>e~Gs^N1aw7T(h)< zuJYH4hI*a4Ju=!+^SU_mWOjFnzA~c(z&nXybyfF$zMiSw@T&K@ly`8ir@2MS-+C%K zR7kZbD2nfQ)Vnp5J(|k~xTu01GV}LFl6IIui(Z;#leSvq+A~z!=YG~r(!5t@oP-Nx zZ?dDoWnYq4WXU_@HZmi_KlJdBYYbhfR)e2fk9QEaC3u)JT!5mszdmt{R{?_NRDsv3 zz{=-}Vt>!Z6u!{1F?0pI6BeSJhO(<4wBt3t@}--j)~5+G$;WTQfvE z?XZpcGk3&5obtd{jGCen^>!;J4+J4AT8~?co4s8s#eE_bMbQjObn*+x31We-X z85EEUPs*p+_YVez1lbvDX_b{!7@5h96I?M)&Kkq2E~VpNPT)dAzGix@@Q*Jx=QQF2 z;FQDxxQJi=4MAjpxx)qEmHmUCZ3?vgE z=abCIbr^$e$Tz?R@h~#Kwlp0YcQ5>4WF}frHof*NuC&^^tW(s=!Y#f`@ERYxe&E{F zwe45OsRQQuuCh0F*)1MBx)J7kyPn+Kgx9YSm#n@L(Pajg;q+f3T zMe+XUaC>ZyU9f=SjaZu1k)y+#-+Y~p=yiiE(!;UGaSiW5-o5EEJBJnqcW*&vE%-t# zAE>h$*pLj*-L9D|tJ9)BCExk>lVUehMOWIeHUX~eh+dzh?p5QSGTvOHokI>z@#~Rl z_L1!y_J`I{*Xrydf?o6AfC(h7rOu{UL0j>0{K7hP50a_eJAPic!ZW%?=U-dbB2BQt?X}M&Z`#_U_ryml%-1K zKbEQ_)Q9_1AA-?_3W(gCn{(&Kj_V^91{i9Q(_36)y#ryjvoo8uN{#6Z>Lyc=?aJQk`FT{~KO3e!yO zZ#`}lG7K(SI=a;s>Ww&D29)4IHGPwggMDb=T|#D)(f&*-0YXJZ5RsEBpwNRL($bvm zdcPX^5vMy$8jmarP0-G+5tN{AyPd-KteqJcH?W1*K)Co4hU|9tPxV~)GyC=IsE7=2 zUhV8nDRpKqBEA_s28YUw&Nqs-xPh z@0|PP%rS*5*zS9nNJaeZXW#SpW9!l+3YpBv%uEpmChYY1G4C+fHwqKqUw>3@ca|E3 zcYd4m%662aR)F&T=ji)CI+?C#_0Nf3u=@toct-xoK1BIQIRqa4DoVNDGg9bJt-2Hz zsKdRgrb1iMd`iFl*E<7`HanI}WGJVGI!=_~Y0mFE)Lx?e`a75TpVxZy93UiQC~$3f zzv(oHmX_9>P0$k%Laqvt4ac6L5+!8E2=TMS3PuG4P1||9o1Fs>33y5Xb1wSFu6u5C z1iEXNjw8U9^z<6nFeRLXk$i!uUh|oNVl^lf3J?@DFf~o3)CSvF-NIwkIj_W@7w6~a zck?@@+{N7SzA#~J!m7}`PE}euQq-KTM%^UBJAZuOgCmCh3%0*Ey#VOEcy zKE2x-@C_1~_WRM_YnHRQ9_hW&&|YyWXza273jf=89^~Yo9DY}^_;cdlo?%Z^Te8rf zqWk{W-O232V?#s3@9{R}3AX&a=u*!4pIJ%Q{7)!N5=U5E2xx1#oB~f#xds?VUc%V~ z|2}L-p;){8qY_c60q1p^z-!Z|@2svT3!S5KHHC$TOL*~pQ<&-YAMcZ@NHkgVu*btQ z7en=IYP2nqiBbL(p-CavsSdqn_n)@?Z0cu+k8&gbSAgb!KfC?*O#Uk<%l64n9-M#| zN9QTHaK&ujV0T1bWV1tYHDMVm1~}`H7c7xag7C6wQn^j{oBAR7I zW!=Z2fd&c7T~;@OPIvU6Ct5KdZ4xDVH0&_Og)f8^;StN=Zc!7r;e0}6Qg%wnp_5Et_q`lMSDD`~==aa)%M<+@v3Qz7o5yT#D73bS+cZ<87 zqjE?5#pw4a5e>4T)9g%#tMNUe{q>lq6?K7V%`P2@r%P{ZgAXoZPwR#w zf|qBJ&g;`7?pt-eNEq0~vZ;o>+u7380JNYt7tyBPu4uT3+aH-3%_DkGn6sec?6K=>_M z9xER67)YL&3^MMczTkzs(rx1SPD&4FXjc!O*$xR_k-ZtR(9dYGU*NOR1C>zV#K_#b zc{LpjYtk=H_l7J>S;h??fJ~IXVa~zRq2CPnufzBC&Cr>H!Vf0tga^5{1xEQVR6JEI zn$}aNWpB>o5S-oBonU0kl803_bYRTf{RQ*VX#AB(b< z`5Fyj2`L<}bwF>V>hQX0(hP4O*;GB^=(tPHy7eS}T39jbg*46AKBhOfsVnj)kV^>< z$LilViot9H4lgh&s{ekK%6;`GMAY_=wPVZ9*(1;0jJw52R*9<@Nl0X{rV!@w%iGkT z&z8vM{nH1>&xOv-9_kKCuweIaJd3J!q$dg>%-E@(7LP*WPHqNyJ~fUw6lQ*Eae{bg za$P-dBU2Vzp;*vZt|V$$2x`Hw7;JkKwHJB#Of{$()}^6xW;~e~;>Aha^EB%r`X?MG z4`ZusyZr7cLn)jGH3k7a!i3LB_m(TrnZY`Z;Msw>a#&8~dv>?@BCX*d3za7F)pN5l zgS30gjFZyknGCl%jl-}F0@3Z%Wx+B|= znOb3_Sz4`SHK@}#pW4|9K!N_0GC+A=sEux7q-qe*{wG^p*}Ek$|G)5bx*aqu+a2quLbNK#(r zg4@#co{u>)lKo|a&r5sgxuJaUy`fr%-9z8ZcjkNabsGc;R!4~EvoHB2( zt!TrHKxdaZS8ro-f3u?_Ec%}6VO=;d<|YM5M54MwFv{mN*!$B}(I{q;NBg8_I+B!_ z(?kF+))WIuCIF751%`ZOr_U-m-bDmj#=7-h;p#UZ=*kTG9TTytlnksrG%20UBhDV* z!-Z)yrc=zf`hCW+qT#WWkm@WsB?3VU))sePs*f`POhx2Raau2X9~H8rGmUdUs4p`F zDJ0W-@4%RHBuIcXJ998+e?4jvoUN{~#k3VPA)pa$05qdsHAOGLFgw<}U{HMdQ_jxn zY=c2_C^7)@W>j%M?H4D1ipVZVJ6XhTT<#JPhV^A6;r2pEHU=3c`5(5HK`G@%rB|DD z-;=alu%ZnXn^7f=Y5UdGODo|-xc0I1*56P*mJF6_X1P@Tds>asa+)XojLA`@?LvMD{J%4UD zAMe?cn_O3vfLr>sY0}w!L5haHTM7n2ei4p6Hdf~>PgO^mB%SuhJXJn=(&Lejdf(L- z9|7@Z#((Dmm~Gw(lJs2HNN_QgDWlsKop8Yv3*kZzU&Nu<VyN*9`(|X$lGNpt>o`Ik*8qo4Rxf*hV0W?9n;2BH-n&KKASrj z*E>SuM!_C zh-aju6hd{4h*=Gwu!mA9ItqXw*UBB=P!YmCO$5 z&YaJzAQ z@B?L?!un0B58|Gd{6z!(3UMBCTW@K{jn_PuRl{|H-rv^(x2ix6Q%}KKV2c}=imW5l zWCQ8>h3rQ~!nlGIheXvIKv8z^0YVY%-m%Y6bd<8!Snom1&6Auhj$2NQ3EKT&F1aPZGtRCcF97<`@J*jp_ z854QH>NYQu`LKobj51sk7DiGxx>@av3u#x0!2RTW8uNm{S$-K^=`Fx!Un<~qPIP@5 zS}bQ%LFDu3iC5p8P8zm3LuK^!KZGx0iVuFg`-$TdO#Q~yp0_*VJdt`_~^ogYArU@Mxy84>Y>d2v%wy>g?;ssEN7}w;vvBOOr#^Jap!>?kD zZehlQ>$)ZdV}jLOW-)r?Mho;li!5J2EGuCgI5KxyNIU!Bk$YZ+V-Vs^u};0VO|fzlw0@x*-+D~iOAi;t1_%Xnifs~Oiz!9 zaO_(slGIo3VX4SaSo%k00;Enm(Dv7!H(Y%TH<_imy9V(ct}>T7I1;q-iJv+hJlr4f zK2_~Hc(}US z1&qUxnA$)i*~qhB6pmMI{qiQ7$J5s3B5EVec!meoQ{QZ~1izhy^UPGQt#n=+VOAD5 z7V&In?5?p--tjle`eIXNY2Jd6IVq>-DoiuS|ds*BiWVH^0?GY-ML!3GEPP8=j7nf zMbJ8C_-zpc1C?Elo80FB_SZ&rTXHGu)boUF6Id=`)Qe!-_~30Vl5hP@sG>kPNnbg5 z5|wyW3b^k3rQm ze{>H@T~tx0F`9E~_(o?xz7OxYIC;NXxiO@y^mHyx*6H zw{FlKTM>}t)j!Wv613CmdY ziOP-Y=MdWf&AKKo(%FWsji=xzHp!zQb9@qOZ;^XgdV6!Bor;vMX+`#KVan7K_)c0N#$v(du3 zxzcMq2L}%_<2ag7{Q^2Sncw&k&yr4&1~?t(!It&6i_|?l6eeybDa`8Pc<)w6Q~JGiqeBgfq#BY--;(l`el zl*{bpP_SGc&hpWYJ_VGj`8zG^dtm?UTu-e}{s(dZdikE&;360Ek{!i2N%AppP3TA= ztWeG&%Kc;nM$N4Ka>dPJ$wl9AR z5dyv!=T*gL>YG|7_ASSUs^tA0p?{|?eHYq)lRS2CI#D+}UfUIIAdN)QbI(7G&>)eb>DBpae8qp`CAVW7l)oaRVENGsxfd)#Lb&U z=IoHDUTp+D?b{}&XNQa558C}sPyT(l@9+PpCpUhg8~^|JS2tV%;l3_?OTAL$aY_vd ze%x~UojU{RE_LU{o=`hQbBrhU%AP0c_G*O8q>~?Rs7g>7R(bQ|zDt$zrx}OfG7l2Y zHETGklu2n}(zZWd&eYLy*xY)==h8+m8xn=gP@j#CUAxYvI#xDktsyNaSXeV9#6+d= zZ;iXxTBuVq1l@vG4G&AF<%|zPi;C)`GK}QqG1F@%mu#-qc`gu$VX& zMpICHyw}^K?H#sMO~J16R4E=cbqay5J{iEQSRxqE=iCd{-htZ?CObTL;4Q4O^2y02 zH{prVa-}Gq1{@pMceLIkgpN&>^hrbdXyuQYG!1nZsPhIv#|^wH=(agcXq}J>ltb`1 z0QoC&3Y~lp$+g45Xw~)@y5%pOPy4icZHo+5HB23R_I4e>9nhDqL8oy!?;zaK8~pC^Yk!wIJOk4>y2pw$ z*Nzj=ykxtdVUxT;p^-Zb0IEw2$72&rPqf(sR@yG*NCiZrb5Efs&T2s3U{&`re;IOS zF!$}y!ilNb)aa;-$qGSoN@oK+d=7ORho(wLz!0~kgYy1dZwzsVeLQvkBj{l`wTJC& zV?v|P-8$FA-Za_RmuI1CYlQy3QR^k{Xgl{Wk22IWEGA}aKsG)e+-*fT!UivbOJ7>S zT|{`7yO4)22lX^yUsw%-2rmn9b@JJ#w|6T|$-k<^{4`&ftYL|1u8iUs_?^o4_CJBe zGbkvv{{Uo4$A*J-Z@Dmz`R2NnY_E``_txZPQxH07UABqm#Kbaz`*W<-tQndzLxwE< zl}vq$Js`J9jGDJUz?08mzt1J#Su<|W3shUQo*m?S{(NH7M*q&2Wl?d3*cGBjL~>tO z)`DNTox{lyzOllRLIYgq@xVzPzN?n?4(R0Mng~miQAmjQgzki_->Vho7}q0c2KeAF zc7%D9kq3sJ#*K8>ZEu|rF=NxQ>NP2E`f2e!PbKP1+{&2j3X^#DI68^Zm|mX>xQL%j z|J%$iTN&YvnVLIOd-N6!Z@qHdHj>}UiN$W_=b#oOH!LaW9wDey7@T1^JE+&Qn2hk8 z$Ch_hvcyn-CVI`POZ`2SxEDLE&Um}c_yVN5UOS(c~wJ@51tr` zkvgp0ugkw7FiM;Cw(OI9zONHSSkMs<~izha6UWAm$P8L-}_m2kc5 zZ3RGtQF}V?IOp0gi8gu7!QmQB>0}sZsP$&MlX~3hhYG4`+}gj5dQu>*uLY6W^>yU7 z-%4Ay^lp0T+o&i!R9Jp*a9N;Jeg3 zs81RlH)?Nhgf3SxB&J)cdfv?MJ4Oa5N+OIjA=nxg-`KR&K4%(7*G9=1qw16DDIe6Y z%g);CQ|Zgm{fHs5N2AZmP!K!0yRX75?2ThF5q|6_3 z8h7@LXrAR3&J8lP+}m))9DPdG=JDEakUz5VcQFmAK9OcT&zXY%W|7|3L8S?d)Wvvxf9=@^$9!=1!HV!ZLq< zk+Tbh6GM91P8yz~QW-WK2;i6T+x$NQ$jj_Ew2IR7+OrQvlL!5KHsD_iz zj&pyhL-gXrjER43RSqc6&ecN>Ef_>_)ltWLsH0<9ndP8SvL^8lGyv-?ZeI}7I9Pw? zmtNhC#+)iyHn^?-(c`daEqpAo#o6un_5M0+G^KLXc4tjhTc-+Mj!w)U<`KOsmoZs} zlXUYwrFta&?|BDnzYx8{k<`=D@^WHVrJt);knm-tYx||(M3ut|ETc#lqUCb**g|H{ zehH$MwWBIixz?N2$OiL(nOk-@&%C6Rx0VUZrTAbEIlvSMhRYX3FZ(!6Khy37t!>pWgEgrgexZP#Dk z#zwI_SBquXE0TkM)^E8%?&xb+;8uKQwOH>NDpb2p@RoM)$#y8ESxHKs_%SpxIU`sK z+KnLUIy5&}Tix_qN4JSfaOo&GhFpAPmnOS!NE1rl9#E2s;X0mYTBh)uzoTUT%T^Y$ zQaN?9xS4gDx?#5oIW&+&hlms-8*GE*mwG9|Olc{Fv~N};uA-vCwj-KNEsj7Sq{;btI7Vk=WWdKLS^XNtRc^Bx zqobpoU2m@Ph>D42w*&G^1B>tyiT&vM_FYfG;?jCc2}5ucy8a=yy0l%rXprORk=!hK z#&YRu=3^62OKPXWb`y*2ePGn8ImdvU_X?=eWhyb`Q0Ekppx#7!zTCY2&-+^=Wl86! zzhhU($(bP`j?Tf28JvD!vU0^G%;ooFXG!*y#F;moT}({}ZE%s+gM+6hy-g%3HK9<} z#BgQ>fxNPBc|IIX+&%7G*R$HY$BY!lwr*gSO)M4;Yl`T31nF<)m-<5r@Dj-OC<#N4 zsFTmsvlywy&5+;%iP5bwliN;|@BArTRU#A_ONX2U5}Qs>(qy~=7cVkV7zNsz>Iu^B zVp_ZY4UI!uCAAGFhoL=vquXDy_Yr6`VU&kTyctz2WdG#OM46qrq_YvhmFn>;|Avgx zQVzS}+^Df5d<(VTa{B((*H)ITE}h`{K5=TQf*XpYE?E+(pNY~;kK3uf$RuR%e~1GC zGHaF6&+JEphAyJVt__bQ$dPi61)pKFEOZ)4y=|Ob4vKX`^l~L1Y0s2!*Kf9m*6$k1 zQ)uLZCMpO^bt0_|^XgwcYbf1&ua4qBhF+YgbfKUdI;Z03$+I=?bJh`U)NV4fr0vM$ z^z?oT)m&~2%5IdmN$)QOqNHJEl*zp##hh*`_GO+BGKJR5q$PIuXnZ?Nep0+S`{$aE z8GcgH)zL!C{QQS|+#Iq$wTB#agb2LrV*6o(Q?vO7#`0uKy{cJ$zVRRJrHtXT>kns9 z4gCItfl$%@+vBGC|HxO(IJ*kr^i(N_Z7qe$bq-5{(8k+|s{~x7AX&S2rX{7LoMN;) z8F@3w{@Fo<>3aTf1W{9(BByHTKQZM!CHc{KCd=vANqp7Sjy-&5jrtyOLz}c^lm&MQ zO(7qov8?r7WbPcC*}}H$!YdLm#+GJH)M%m@n6rSS>ExexpJp(cNt_Udi3$0wq_5U z)TEdYV(cfrkw&hXI1LGrzZyTBoQ#4G3?&xfjtLvC{qP1JgvZmdqBO#Z`koLgW}x(Y zc*P6VpO}E1;GoX+z{fsvDwa2TN{8cZ4?+55USyV6oq z)CA!PRnGl0{FzPGRx;VGO44#3GVz{hh6qagTJLil`qB=24@wNZ*vV8zQjG%*ou0C) z`$jwTXR>O}k=*RuRW`f-koL9aRqA*sdPf3glEvkcj+KsJx z2FfkOi@~DTC(}XHQyHTsr@~8Rr&4;msWcB*RM_e$#3#C zdwaOxDnpxp=p2$O;el|dDXxh>S4HgZ-L!ZIZZQ~;o$&OQ{Bh8PVWlZAMXbJwe_=}Q z{YWjg{>GX75rFLQJ_#7SUe(<-%jxGJ>M1xiTwZ<~Z!O^vL%aC7#X;X$HntJ&BIT5P zJ&>C`S!M4#dvEU=lc=9H?^&fF>G3V}CFiLmTS*>^FTDd^;6u6{e5tjd=deCAhmJb< zMO0{wrgmY!4K9e_=%i+KXd6by-c>G~u-*MR8gr(fkoMFEY;j%K&Pm782Nr3Zl-g~Z zl{V_(bV$!d`gk#U^2Fo3FD#w`SPMEiudlLi+pi(!I9nq{eb{YmnckD%`qFQY@FtMd zPhI9>JYFh!0^HNAvqRHEM2G}-Dt>6;eVx_hTy7|Y{>*uSTvp4`{@ zwT0Es$5P!=Hq9JXp1jIrFNz*WBsS>43(b0_ljm4j{e{RTQ=VSFq&?y+p6t2y*&QGo z;PJ?pFPWu(?s=Bn7+90^)NRtunVuqB1ozS;BnmiOpA+P`**T_U3@|NZt*Ws(gI-(|*)fbbdC zmN%3y0N<5n$Mv~j{EcRl8(ZvRSkB)Qr6e!>PNnw8ebC0^{+aS@ze9>Qz62EUv^sJR z>*F-dP)s;0Tg1&%tXW=)_HrazJDHf8Zf7C0nOPN5=a=d6_{MJhBRdrUbg5_ksgN*j z48qA05BcoT_>SkirKVd4J~p}ocsJm$XwvQQ@qtMVk1(rCD`qrf=J3jOT;2_m&OOUZ>UuQLZN;=D5!5%1{bA4jw*a*o( zEEM3jHn%&Uq z!rFq|IgX2{pf!JlKiPAz9Z zl;qPpcpBnwoFbNV7uwVpd3p#kbDnb=8+)VVvZ@qDBbMakKOeyI3DsXi4YC&-3hOP8 z(N<$an61vwCKXl~TgkFoSSZ%K?rw#fXR=MG^*S@l1n_b@+FWz;UfL9UN718*i#5KO zR3Fpg%+yHkYE`mw-Q4VIj~>wAoS%o=huMxLhZ(A|xux$PyAHc$WK~5@;p)Tr+8R78 zt%TcFja3MU7l*7ncg17$KZYapRdOo$dnl00c}x8j4dVW*H6cWFh|UBisv>HaZzsTP zyO#I;KU9A+FZ8_b;)&?uMHThLE(=BOLp95Z$PF;=0L05J0J1Wsz*>;fxs!TE0fVX* z{7H&+d@{wgsjAv>%p}?mG2q3;B{m(Q6OVgdm7bQzf+VgqM!|r5*XXjfHYrvj;-%3D zKZ*oslkE-XXI<-uePIwRRa3pZQHJS2uL3?Rnbf z`~W?x|fLzQjq|ZUwpk+mj?WOnu%^>Jf0*g&`=-}3tmRc*Ze?Puf zcx901d(x4@NxN?S{ZQk|L2EEn`v87A(R4PE1cIDP-Aou57_hLh(e)JPjX1DaPKH{&4W+t7cD2Kn08BFWIc&j~k7P+X#dX^g8OBh)LvJ37yha~b z>VQT%YGl^-=L13Y-%;lq9iU1|w>gnv!^^HHTD>J~%B$79e9-tZ<;8x}Ir~<tGZ*bXajPtbM`JgawD+mM9gO{H=e!V0gBs57NI_Yig|SFSv&N z-q*LgUj#YxI%~jc)RJ7IT)3`oQ=Mj27q~9}yOold^o&u*tYsUGgxUc49#kF4yHHlPP7NJ#!tEqr5 z2oAsR2I$vEVhuy*1ZzlA3Q@)Z{~7 zR<!J}pfrB*b@p7IjPrM`1t@=2Z zHO@sUlu$yE&wd`@A<-G<+4Wl#cbIGCzvy!C^c0a-V<#&*(hOVbP1Y8%16&}AMIG(! zv3gZiRryEQC#@;X{G#B!I*KC5%C(?O9+RMr70YUta>8BqLg(z)EXkI47By7|G?c zLpR;GcFEk(y0x_zp%ZxyXF7CP%Cl)K=e(OwRwUBLRhQP?U>`y=$-!TkV#QJLhX1s1 zRj&XTNb@u+C8blFX^$*e2i--1^|Y5u2cp86#tjX~bUS6iIe9;^f07B0*6& zKw;sST1p+rZQv?SGGMM^ioctG>zC4}IwThr!s~FB@MxX|6k%DBm?j&(n5Tbc$*ET# z@9*z#bt7@#^DI&J?X_!G6EOyhEyN(_0W_yhb^OYTn|hAdDv=A$xYa)hWA zbKce0ed#rF8!$C0fNf*q;DdS4Y2d~8ESM)7vBaSPp1WpmzQ6Xu@89zqpa0Lm z>b3tLUdpe|p`NY~h6^m`OX|0>$(+G{>12v;&Kw6P1LosMzb*8z;I zrTIhSUge(jShX(gN;5l%oroYOs44ytvC9Ht#$KjZ$&|ClBi+c#^Z2B+p#B{5c|cfP z==*HMj#4ioOXKN6L}f>5nj6Gblk@hgELFPR?UD#3B^5K%!dOW~?OIoCR#Tn$T3m(B z|Fu{(x=R{}>>l?UgeAieN(JB56lGzfLs8S4VR@of(+B(B)incwWp;<|DyqGgMwa%- z<{s81%R2{d{lAS$GyN}o4+kTE*XQEZEAejDQcFh6dN(8}Xu2M3Ddh~pVwqSGCXSZg zv}>D+s@jTp11x;b+j21P)Fe$Dw|NBtKBqK~R5ym0O_*3y9{-wIhtpxk|G?2vN;EzK zNLs~8ES;RbHcv&(N|LCPKwE$5>sf^HqE=;=nVD=?n`JL875tYUGIP|G!8>js8lU9m zSi{o$MNx?q*f}g(t!K}ee<8LhssrZ9b91E!W>l~O$pC3bk_OW~kjsblo&ym#xsO%{ z2iQy_v}C3#9r8~zEGbzcx@gZ;htO}jecwB~hD2ECb!RW^eBGME)OPMYP9V`@Liv2m zS+XL(DG=XZ2b?rvj#|7i=$p8^YIgmeb1!Oxt2{0ul?b*J_k*TZ#Q#L8W%BWQam&J{ z;`&F3%;Ky8+Xra*e;r%Jv4g#)rP~XqN6nRaAG?`8Tmt*vye-l3GVHoJOu~UV>H`@9 z;iWJY=w#q_)b-gSFZ6%nXJb!Gk&4(&=dI;>YU6de45tZxn{rn=_)IBwW1%J_tnvF! z&`Nq5f2Xqw5e*W`A-cQ7h0Qoq$aSzt9FA64i;|?z7#^Nv4-|6oddjlIwsJB4*;!wr zIITb7V7=>67~z63HZ@~sqNb7f-Lu7@Gu+ZTv||~K4XYBYmk({mo6y@`=VptjJoD4! zVx(D_05dZpm5jaER#vMUfOuzxqpIGd+X6C^kp_u0nRAj7=F{sb9InIOKe*z7eN~-Z z2G!+TABqgIl9Srki-9y_Y6_P4Il6q~kqQ}JJ#r-#Pukw{RoSn20}%ud<3%~xSOX|f z7HM+eI?fiW#>Ry26qm=Lw74hD!I3;s6u=9L91BTFP#TB9W7qnj3kBL3IU9y77P8pT z>EmOGw^zttuudXFjWtI@y`j_MUs2^a9{}lZ1a(zF!ZL=V@haZt3FiGZY4crOFPDQ) z{29^2<4O+y8LblJ^;+&2^%g&20Z##SKBolz+C4Qk&CHsGvpO-iom$H#wNDSPIQpLBFVMG| z`n^K!b(}z;Dju1oCzhy=qUatSeXn=aZ$#(OwZBlfE@3Z}rQ*%OEectK#oVlhk! z664S;eRAc>O=PNOV+;WCLqZ#p3VOPkpOW?K$mKdUt!{?*u#!b-xoo!UK3mGsq5fgcu9GshzoNE5p8dcq?%S@2EV9h<7yWo;n*@5+>wHPJt&)jhaELP1TdYBOdF6>NfBQPMp1HwA0BHuQgu(DglQ z4NJav0uF2*zPKYT`W_COm35$C<~WeoKt2Vj&d&t$!;o^##Pj%Yr z4SGdI&LscEVz<#+as32t{ojScENa`rW47vd^=N(Er6i6zRVNb`0dEeP1?0g3x;T=g z^*Kz1(z?z5Zc|cif+{SiyJhpu=#>7lE za8h%JZFelkk?h4Xoe8j~f5_4$W8%uvI{a6OHo7_>zXywgfb@a7p}VT*ouK=Ft_*`s zt-n6-W}3di!D!$P{TEl+#?^Uu|CXO|i~e-A4%!QnT-GLOn z<7!?3QSBZs9|wtvstX4JyXmAJsGz=+kE$xN|8R74wEr+wDloR4m`0@hxrBf~<@4!* z0jC}v&2|6)0dQKP@qYx7F+M}@buY0^%}^r{Lq59#S|yk@vx1?+$8@BBPTejx^Aez7 zY+?$b#PX8A8_Ij@=F$}z?=1kN0gya1{Rbe!(F4tIG-Qbxfq3&!2|Ncvu9;R6*g(i( zV9iz|6;RYbTYI8^&9J0;uePFsKOA&^*uS>Wp+lkXV;h;VQ=x(O?CyxW3~OU*Vn?bQ ziTO2DFS}}6ap`zyYTqC3zrs}jys|M4-Pze87IUjXolT*7%p`V+F?CHR*g}enzHm;{ zkMuwYw$Xaj-laY#hxKZ*Tk--1Tndg7p+F@&ME(dJZ23j@CWK}=m6<6FqsaHv1GkX6w$9gZt zL?f%M%@{~2*jQHHP!ojSO_l;Nb&=aVM8gME%(Tpnmib zr>CJQkduvX9w!@$MI!}@K4&9P3{{hZzLwUPt6CUWv^>6#V2X3?IL&LSjiTngkF{gxoXX9E~n#&14Y+No?%%y zIIs(SvRlZav+<0MpO7u^HxKNTr=RFwqYQY!r=g-8y&}awQ%12{(ZCs&F8V%b!9+^l zEr0w@sGS}h=@Xl;{Ycd8H}4}ZX3+Ug+v&R5{-EWvsh;ueX>i;*w)~@%dLren&1zw# zt#1G1WHdm8Vk(fG)V#_qs*O~Ic=BvrT&zz)UcWViZS4p?4h`63A~e0$0lQbn8Jza| ziThH20vlW-Xsk4u##vyMX*GmNRLIDlO~EpHkRj)d8e=8{PXvuDb73##OH?@Og0p6e`b5r=~|Ev!yYP3xXBFsNtcbr0yDbnAOAuP1Hv!_6B{ zOQA4YIx?<ifc+FIb7PWr0EUPl>Og?9-C_t!%k z&wmf7p3LR3zDysXyBO_Bxya|)$r%*1Ev&UzjaNED)8sZuFJ^KzeYrR;venWCFK@y& z`o%oQCsNDGaHBeLAs1tuJ!xir48`xoHd?*JAdn+PVzQr6`M#nnyqNp; ztW(?B39N+m+ijTpZ&h>!FNcW8kD8iqy(+4Zmz~O(K#+6a6ydL5p5JvA1zNTT^~J?u z$BNR6v7n2Zz>C9hPG3K7_frS`(EaX^we>H+r}$M911h&}AzXtpRg8>?1#O*o2Gu3v zdyc(3_i7+0z62HfV&XhauKeropO|uTH=XFRV7I`rTo>(vnM;OStG-By-N|A?d~J6S zTSTfYYICtSnReYZRHke1r08PRw2$E}w##>T?5>GPa=u=Hv3tad{jTXFdiq8$G*z&T z^n9PD<_Iv9lgjSZb7m1a{lmj8ODS$7bVaQJH9s>mp$7-F)&gyIyl1PcwRiA$hxRL* zYjngX>&IS6e=%hDa6Uy{Ooa9J zzBH1uH#R!ja&|J{`ZPjT(kjo4f*>McyOpG|da6tpFJf$eAx@lKFC>!pRc0qT{G@+8 zcj-jh*vH&zZFZ+4hWjyZ%#EAg%bPOY!@cx2HsU}MlkIId0_frXqgz_qbv#ghX3p?f z7TET$4UMxWyd&<%8*j*3!HA#_^O|7gbT0J+zfwSP}?n-&p} zbtAaaIR6VrfIoQ$0RCNL*PFb!0GjwK zUmW=n>VnV~i=f_Bg+2vQ1>ajt^vC`JBfA&jy@y;c; zzddT-B#_ zlfNWD)1RNO?va#z1w=G84`1S<9zQNGu&}UmqbRMVEF6p#<1>-i4dJ?fzqb6J1RBqN zcs_Ca``D~}?;d(Uwa(mnJ+-6+3Oc*{`?pt#miP896@*UT`!+CBUOAO5ZTa{VJ7%Pq zc9H(0GZD8Hfxb+x4*7`fza_4y(4B1B`Ve+{VDrA7JYPfq^wgj;@_b{;c6oVuw&|h{ zw`CdPy`n~^QMhNcGna5d@ZYh-{{f$W77R0+lSS4CC{SR%_MafcZb=y#VXL=vYX<}E zyju9W|C=FzOJ=nyc|2xE1Qr*+nrtHG;1Dmb^gOSg5_fiPHVQwwM}CLw8!_;sDxP7i z^bcC@M|=j(U2Os8MO^xde0_fI>fCe#?e7-v50y%t@&8Rv({_?KZv0aczJ5hKQb3U2 z|6o5}bF%ZQbU@#DB-U)K+CjXR0~u9+@iOa-)uL2=U`oU%I zmamWJh@LR?>V9}z1J-xcPvd5ZX_!c95uVwdCxry`RmnTBQ3)2(Z7+RDnrP}cXJmO= zNHOcg@6|jVx+c$MOLJPgLveJH(vpzW+0lc23c`qK_j3+#dl55Wx*`wZJ=iCS%t39}Xe#Y0!Tx2$~Vx?}MKlWDj ze7asgo^s@h*x04$_LW0=K*#1uDBdX>MnYIgFU`B|A^OuF?9AD+*fcG>`OeE zYH;BxV2hkb^N3jXyo>9ka89YHD#*oT7En$PiyxL~jPSS)*+Cg=z36Q-DSA8bVkM4Y_Z?V3Ns7{u7rf2$ud8{ zdP3~%W!f8!rM0?rq>W!%ET9KijeXvRd%RZ{>u+wr$iQnv8qg!pbT=cb@tc%YpsC;Sw&IfpO@wUigVp zyYuO^s3j}BQSSE&ok7Y^U6nQAdkJQzX|7I({w{}Z-bfTba6TE~kP_vMTBm z5@YV>oY1lGrtjkmmq zyGn^Wy&K|7qjkcV3#hA7mgp*=E%H`4P3EETtqq@p_$WD}5)Q~>+6P)~MwKm%$xXE! zhTgvRsk7*HRSV5k(rYXZa0|10VqS^Qn18tW=AbokW!ZjU^0mU7b8!6|?{6thDZh>_ zYQM992@z9PSxvCt<{526RM_)9wnFTM|GdM^>ie67T}f%JO7|mfr`J4>$`4;H@fM6j zgGY$)Hc65|<#*6(z%mL_J0=4YE-hHQj54F|84 zK8}ub?2S0BkvP1Ej{5uzDXo=~4%fV{0@lXd+tg!vR(H#7-YQ9~_U6f_&n&WY!xrLu z(GXRq(`p6={I;YpDjD;rEJ0iQ8MzQf<1JKV9K^r2)muH5oIA6I6s(kuV&kn!*x-?t z#p-v2eYrDQ5g6W8*uSnLa}SV?>97-}%Gc^=V8Idw&ald0zWI3;dq?d<(sidqjJX!`0mrp` zQ?PKgrcG*n=N4d8lVT7C>J<$n!8z0Rb$Yfl#)Xlw6kGXzB2{*arLYV$E5d05M2|MV|7G$8OEcd{0L> zgjO@jiMq700F}?gw3CpfCL_dwT>Dx+_m&QnBy689>_t2p+uUQvhbG0ovXI((z(&}# z0525RskN~`=|>%?42c^gG<=?XNE%o7A!3=@l@ST)SGD6X@m9bAA|y|{xs2y2h9`2K z3CWrAFqzI5_egB#tY7;n*lOew^G1z-jQ1;?@niae;N-|t#CfV&=Yu7ub%pMq<*7+Y z8#m)9xLCm5a@|sd`g3V)OCAE7B0TQ$YFK`}FhcS6KPK5Yn|aB(16-xg@!br9Yfbt69An#sms7@&CBa_peC>AK&#QHgpvwQa^!b;30weF{YoCM1U^np*?bt`cj4H3h zb5b`FcTr8dIZ{9uBBSkZ=!8FHSRArsTX^In0W+C*v+&K~@3JhDk^@)9Rw*=M5x z{f+U4;=Px>Yf7q&7{Ayt3|{O`7jEhptJPS=BL>e=n6b4P<%=#UHx21JC9Ickl}sJ6 z_i~`*(L|@>BS{7$?Mv|UYP*TgO(sZ8!b!OIi=(N}CzM%* zG_!ohETHb#@^6EoRYWkj624Y9-m~(G=RDh4JlRvu5~_|`%(ofY8AT6Vjj+fmm$**( z6PTHGon696lHq39Zevh1kgr2(eDQUD1L?W?TbIi*z1Sx@s!v7tSNQ1MDec&T5toy2 zU#&GlX#Rdq_auMT=$cn-gIN)8YK;3U~1{+$md8_rs1Pj~T+K?iuop^MsO) zLim67hv1|#u?t*K?Nu#Ha8-1}KGa-&8h6n#Lk zF;2Z;ET)9&GX8xFaDMs8rRmqTbl|h_9+*7e3up9PO+cw>?p_BcOF8k^!|@~DShOQN z@>5fxysv;a)BL4u#5SIdNuT3peOO>{u71kNJNJoYCM${^qXGSy0;q8`G2+h}IF;aeN-s zzsA)hFEuA0)_9L7{tl%D?M@hKeF>aGs-UFDH|= z=B9h7`Fdme!1W5a0y2 zPADuDl(#eg9lJ+~E5-gLpOW>^Dr?ml&(3R}8OT6qee;pLFpo6Z`*qxa9dJA z0DJ?`+#cbR^?vhTPWfaX#D<-V@2{FyOKNzE%j^-U3EVcS^vA+xw6r9X)=xJntrs;c z@unB2+y?HHUpxbYkb>;wUa7O!WA>- zZMmuRx(uMg@$VS-O&Zp#DEYJG6zk-)*Po@+hW{FOOg^2gl2;TI@^*ZYG+Vf!rojdr zL>gUtGmrm_MT6H2o(t_NVp5Tj5{vk+GzNvawP zaaoTA7yDNCgLj%rugVf$6sl=WDM)Uys}K&Q%wWRlE8Xrc1^ANoJ5rTEuq@OHcRL0( z6hEA^@05@*|PS~2kTWOoeR_#E+zc$HGM35!Ql zQuIBtB=(*uPD-Zt3Af&OS`&X5`e>~ntdPs`DWG3{-gGnd2|DFOla~5t zA%%9W>jb#DFi5#ABH$lY}e6>hy~n z(G$bAFT&YdULIqMKY?9ljzj3*t--k6mS9v0)rA(m*?{@TiyqegGQ7JUv-c=+RE>Bk zEvnzVlzPq0%%0YS%tL!tQk{)c&x$FP+YR+$K^xUu!)iXW4E)3HMD4_lW_*~6iRY)= z(_!BHkDS;yl-UYY)QCh&a4Q|t<_Qv3+{`!0#ln_d^uC731tkDRtA8HtBZD&KmvjDg z(Ys5aU*)q*6rDuKYqIlNzB(g^4!Tg!HXYN<*!?DE$SbiO`MR;#;@BT| zrLWUh8Z4Xt%(#scHu_xCG(t~LM)41sfUpcJl+{;`DjHSq4~?PR20&LxI5Gm#BCR7M z06xJHW-uzI;KDdgx0=GJvE+fJV^HoH@_Kl8&3;-VlC(VJ$B%2SO;O6**L*S>ZO+Gh43OBo7zt)V$F|(wsLpUnjZwPtZ?zTr7V+4}(aeMB9Z6zkXG! zN%%^&ir4$vA|E{zLXgxD12*2HR4Qzmm0nohg2q-~Z#M5}Zr;evD4iko7-IgZH^n>C zKKPW!PjjOns`cTLkiMFNlO(F&5&M*@1~2d6zMYZ#`Y##b9wPjXR9)q!VLWBcvG7|`_Z zU;7P9IcO1=b6JlIxw%h=ZQq=DBN|ViI((H|2x>A!2VLiSKe96wB6d(nx6!`2jFynO zWF7s%3(i22lc;YGj?c|}cd)O~ZRj*U?#UOgZ?LlNyfsZ`$a)-xmY-#`-B3>E!3Y=M zdt{QCo$D)NSbWnZ<-Vf=7+UIFYr)jp4Pb3#Ux`_Q@CRZ(%!)=qrQ>uC-CQXu3> zH(Dht;$FPHo_*$N*Ny9PlqKc@FLIRgEcT0dly1!lLaYgolw{323Vo~>@MLgF5Ojc> z?;o)bo7|iePn+dUSjn<)Gu{67w&T!9jG^=gVH1mcI3^M=WI1K_&h4)s{TM?ce|8UA zi+)=Aa5(KS4=-tt;CNraoNf90Hkt`Ild29k95)_8rZjy(Xw~~2IC^{iGdlgCy+0yC z)}n5wYJTw%CeouRj8w{WRn4d4TJ>C-7VhgfJuVqK@EXZo3+CkETp7#NViA1>fhE-#}_7e6F1c)W#e#%PmIrJ{j zUdkHdeYNOUiS)$M&Cnh zls^>qZOdX2 z4fP=&)XgevQF=T1{TCE2^z#Pp=~Q+`X}f{P;CG4?WuDeT%EMmp+jqmh9I)!o2|pM4 zr6*<%de(>=@+DhB*I-*-aO}rm6{g|U%vwiyDNBR{3`$7+9eV+fDIl&gW%iDjA>U=Io4I zB1yx*R?@`^AzFsa_azn`qw)#f3v@*&OPwv7CK9k+{eB}CFHs$Y#6^$_cb$X0qq3D= z@MeP$3&~11m?{wNTej-2qna{vCN_Q4=Ah^D;=`h1`a>^)*#%177)^^E{qBG_re09{ zQ}Mx;cJzzazmal5{BOJkzWuIawAtZ4`+kjqhUXB~sIag5$&>9F)!kqPV|ATdGA?)d zaSU{_>U*0vzwVrFuCZ132}tU9QL9Qu2gT;%;S{_V)3`tkO0Sfh%~!NK93IjSuLUF` z?%SAH08FqEusatJ)l;D_dJ;AmC45%qj;(}t(@1FsY6UR*5bm87)=$|!Pu;N&=6@4$ z#;}sbrM|GyU!X^arR5j2{VX0)?Ep)BZkzP@>^;SBGE1j@fU3FaPlvVAyKVGRJ+8W@ zzLj{6{ivVq=ajOI`+rcZrt#q^#q+aT<zZP+6$ppi;{hJ&f_Keq@_V?07N#zmT`MVy(FuH`R&E~>F`x+#bV!@Zm+| z?kkhYY^$FcX&36^a_bJ@-UOFXVUqh1W4vb$epxho#FUMovLWB5DjVcu;`@T{1??Xj z;R;0Eb(-Ool;mJMK+6PE)Z5re(P)3|_5K!#5fw`AuGW47Csd~nl+o@VATRJPzh_SS zzBZ_h^yTnOM7ZEjp5uZ|4K0!8{XSX&pXaB^^gTCm=lx`pri>@A7V@tSU+=`*+#lUI zYf6JJ3rU7F&4!k3y{V-SY`y!|a#H{ccQHaWsdAswuBM_LuEjWJC+xB7xS%zIGC;bSrwTf!il@TW}m^D)n|tx%$nC zT7!3bCPrS*#yYVOO5xPd9j8*;phA&=o)1#w*gAQ1zy+6)K zg)<{64T{!`tMcxOSPGZ8h_eLPR9HtJ|M4BN49Jzy!SQeP-_`DfhcH^oy)Yswzjj@kneIu=@hitN6vKh$ z7!wg*Bf%sMPCWaqOSr=NXMSa#fM#adyo2yPT|KwfQl3lFuZxm!o|VQhZ~WeOkA(Hr zK8yDMDDO9Tr!Y4^?*HeGwMMoRf2fC)v-D>&1UU>E?^nG-emJW{cH=D7V^sN*>v+g# z!M8myqVwF8?cQHsW(A+0`pG8n&?jZX4LD=S)TiqoE|Di&Ieony!mOHrOVg~ZNEP4n zYe3=vQgsRWlv^{6?Zu1;D}P-3kz}NOusich+Nt^Jl9IHvY4=_SAj<+VWE$;M0@p_1f;yPY0UQB#e{qlS<|H{P=;PB;+u89*>p_y7iUO^@yTN zq3DfSt-?2c99h(sz#rcPjqyZ^QVCO0j?Lj|2v$Y*Yg8IV&|A|?`*S$!PZc`y6PyM( z0ncp-W#e>~4{fm3bj-f`JZU?YYid+fW2RQL9<}CL)&JT5-rB87ssS~IWL%-uNm(al zdJo|&xPsO1y*wkMR+?$rDy{%4O0pJ0vKPi(MIJ-W!6~LDjtm06X(Y)TR{6Dv)9(&& z_7RiCQ39WmvLKQZ6vH!?0IY0o_$%pSf;txW(796W_h_H?)b#C_(8_3&h<9H8j&3)C z78@PrdD);g?m(M7 z1~a-CjYj759b@{tG#*eJiH(B%_sca+2nom++|e6eY~!8@1Z5n)a5;Qn3sLgJbPq zmf)(xuh#Y-%t8nJb3#8q641&HzVDYBP+J6~yj>wOa(D)^OE7jsqOWIp4@{kR1Dc&@ z@uZb3%;ryu$t`6DICsL27IJXA@4X4$Q&CC>V4toMm!{OSLtGW{6T)r2${_9mdaFWlA6-JLvVNCQ#kyF;kV$&#b~yL7(Y>=o_7zcaT*L6 z{t#@&4*zo5np&GAub+L|Q7tjY)2_|jiZZ@I5b`l7y!$JP)bGs)IS&h-nAYM>p3V$W z%EC7zH(t_5RnuE)`%N_ktzxYFkcut*mRdNcQ=~7;X>2u#ju0{&?*wstsxzdEJSiz9 zQt9o@CrHC=2FDn0zE1%b)eaUNp&f0?cJs$JZ`SUtRLiV<-)hNb%dBlfSS$88TT+dJ@c?{VdJ% zPhw5MWOhDHl^5RwLHEv+gJEArp0MUxL$)q_)&>ft-0(p{mu|)*b zTx5($FbtlSRjBu0t*?5z`OQhm%3d03|Bh$_JDpm;F2Wv8&ue~TVpbU>{OJe0fLckp z74R+Q2JlQT?K{Lhs9_*jRmh=sLWqWpX4^}W@Cp_Gk~C2fxjkJ-C)%9tGIne3d(Hc} zF+-y}6*dd6EyZNynLo6-F}oT{8(*jJQT=mxh-XsBJy&J(L`1~&Ps*1^m8H38wkH{G z%XG4ZGm?6&JuL@QT^%)9+2-IxLiw;x(2IGKWb1FCzsBEmhc3?CH~f>4MvJ1ZOTLu{ z4W4B03WR+1QP)uo*VX`2yFvtqOf);H18r^?!9(^)%-2kgN27e&Grw!$IdV#nJMGkh z1XHbSzE~OD!$0_PlX{ZurFKvAPRjl1OIx#6AgkEUL?`Pw^ZM|%gV{8V=?x?O2w=sk zROfT1eq$t0tbCam#{M`}o+4c%)1JYOm`jtnlvN_^`(y4&<>!;xPmHB-RO~XJ^RRrc zccM9Q8jxEXRaVovrJ*irQ>guRD8XTKO6*s{h?uHRbaZm+V^_gEgh55Y6KA>Dv@zP3 zcj9tt$5hm^v(SAyiSnj7LD|c9tcMK{nHoAV{_~IcOHbu--QXhpj+1+QvYN6` z?af=cjBZKmE_t<)a3?kROWu&Smn=<`Xs+Ec>?gYXu~Sf;!o=h^QnF}lggA&m4%pmH^L8_RKjqQ#~bq5yYq2> ze6FTBG_qrzRWM5u%&9wXIwPW|tR>nDm1Q$v;9`Q!?uYjalkHK;zxnmYG5P1Nru}WA zBqeJKs!E&3pj`slQjT9aDm(!;6IRwwCsb9&Us6^I2jP{x&?YHN z%qxGjVKiaBUw`(HXsbp>YZ|&fr7dYVhx5~#%wDjs|Fxo@4Q@`*?7bSO_|6mKh4e_Y zk3XR+{$>C#=Ynpk$B-&qF5dlT`+L-YJ(+cP%a2T73?++v1lc6vLzq=3WG3f*dq7+g zX}v=jV$W4?oHTF<^?Hex#?m<-b zgeKJVQ=Koslg>QLI0WePVBnZW3LJSo!7Y&)JHi!qG9McV&DF{~ zJ|Cypxvc!0GmsZahnsrrBDT(q_qt40ML=TR`PVLMn7(UbsJNIQ%v8{;G#dnY@L?&m z_~kmRVz;Hp0k3FeAYHaVX^Wpj1ksNf4QGkpQr0*FaupfM}l^1pXEDa^L8 zyb~{pKn`2orebD$=Z%qY>Jtbh-B3RJ7|tN+utHU=V{%ueV%QY(xNYUximzP0;|z_q0s#XX8h6{33fk2J-CRC?ALX5DZ*5np z8!5&G-s?DX{ef+n56*5%nccqg^YWG1Pk=tJEcfQDVWYj{ROtBzxFAwbSYrIzva-gN zhi8{;bKC9E^XX}4`b5&BtUZI$O2x=;#g`h-S}SZ^e5=mTLy`4b#5qOMU;U<-!LS+i zc6C>@E#g5(HyxjqLn3FUSg&|TS;?VPZf+4K*Do?yeCB=#4J)&TQYdr0Y|5K=9LKHI ztGqHVY#20YB+?m+ zy>BK-D|W&f&muSWx0Y-5CB1~nxQ)-n3@zDZ%TNAh?-M9hXbU^UlIMd|lF7z5}`6TR%DUM5OR zuEl}}kDfDY_emfv(}|c{d!$9-a#u3GycDM>K4<3Bu52c;Tzb@bi$B`d))HoK^Wc~z#N;73lRs)WTwQ1a+cjEMwT+cR zt5co8(%<&BsB|khEXJ;{ELl+>ErOVWp?2p&UhQJUvbJR?LN&T(=lvX_^dh^LJT8^W z1gi^3r7=_~tvnO%LZ3&2q!m_(x`>$4I+ojy`yMS{t7!|1zs>5jhBLZvEU9?gg!hy% z^33^W24+Q_di@6YiII{+iq+im)*#iOyK^-Pz0Yp)tkfB!)4AEYxx|j?7)8=`mz@H( zZQrt^dfK1~d^c*v=XS6Ax8f9)Z9Ni5g*Cjn4S_BSY^*yokq@@yyQyX9m&D!Y=V@k) z%hf*TQ`;^Oc6eH5(1KuaLswZT=TkxE7EXy>wz4?AhvGr`?dxYls0ma0`$gAeJFqPm zsIADq^4a473RqME&_3By}f(6{;Ri2Wn$jR9?e zGQfc_r}{G4kMkv_y)Yv0Nlv*U8{WqtaWa^uY|^HxCOj*m2K3yAk}~QnaXsBIz;yS0 zH_Z%AVp9N|0cc4_)_Rg78#_K^PFR!cW?pGruC{_qgar6_?Sv_ zonEEN6o>M|sR`%24IW7JCvIo$Pu3;`-PVrPYIURsTL?RY+78H(gb?%am~T~=l|RQT zxBO(8M11tvaAKln+p_{Qm4d4~SteMDb?)sCraWB$h9pra?n0IBfP~Q-JEbRioc7o+ z&pY>MV-wKX7l5|oxI7BkC=<)ETE*y<=I>Uu3FDzE#&gDOkm03|A?il-7-Cbnmw#6} z_HMaBbfp!x@ol=~%_dC3J*6iEYNcXIGtGTU-=cbPv=LTsIZKqHAy1(>Y9n0F@s2Es zDcj9uLx&daZZWIcwE9FSH|!!xoU@q8qC~1?yhduDj8C&g%kc=@WL3jG&n3aWwR1s& zN9Jp)hB5S;x&cL~TKBAbtAGd{;DSoSZu%Q=RN(@u3`a_=BKy`Dh*APr+TiIm2T3-T zFFpx^{q2=Ud})o*ucCJun)0Q%gFPpbH+LSeF0e>4(FSY#V8;Co3!i==<}|KMySL9# z3R1v+XqbwM&Mnh#M6#KYyjdNS7k<*RnTb^uE2+oBODjiXCW!6TXq_#kmQ)AwQy7?(-C}v>n&--8F6!& zgXhGZ3{_QCY5;YCD;{*YYQy0iV|mSl&#RO@ug9X>2y^- z`DM3emHYYtV}XHX1>`V3-m?@{6Y`FKn~~w;*ceh;+VjkX!Prt6=@r6KM#1H3qWYjI z*txCd*o$w1lmQBVidVIc!xI8J1{;n^$(yOTQWWTDEkvWp3ldr(8J)v7Cgr#e%HUy4 zt*%bU6Pq{{?UliS2@RFek&~zb9-6a_N&^GuL?5MO)iyg@vFJ0de~)T(+~18QTR{ zHiSM3HaIrkF)MgbYph9BT-BaAYuWGTjs+sH!H_`?Lh0?FAVBl?z>N7J3%AC+dWIKa z_gPfBBMq(dEP5E;+EjRNhSG`yFL@Ztk35lu_Qk3v%s3(Il<;oXYjAjFAKYMv!^z>9 zi-L>*bBLo1ShF%t4lE{NG%2^h3^=8|1giX&{Q3EV5eBH+Yaf8J@puX?e-iLBO#Ve( z<@toH$ofh-BVnYpn7MKFX+@QbUR#bkSRIQWLH(_F&l2j|Q21;3bf!AUD~%&`+Nek~ zckHsEl)LxRV@7#69I+^Xy!5XPF>wgAIerplrqLO6qleh-dIEubWFIs)#{p1+lbWc- zq;FF{FaK+$(^jPut9|3<&RQEE?x`C9YC*5x*w!*8DA>$DehqwC`foxYfdanxI@g7S z9S%eVmOag)?(Oy6Bi1pRZaHq-WxfKe_FKC1rcsSKt>7~3urRzwc2~#{SwN&^|JKr% z4r^=_s_&s5M`9BNeuoPnfw_zM89fy9B#&0!72tnrCN059wtlRkHf;a`jWTE+zc8L$7aLDHybm$l|p`k=Io zKtV(k`NYul-wz$Is z;#R-NpNiP(f88%AdscgRWJKQHo)L#LyVhvhUa_8SlQ#fB)03 zWos(%&GuYlR|3KN$U}lm6Sg4#v=9`YF^LDoCytITgm-0x8T?*T5awDIb27uDR7FLH zs^K9)#4TP;jbs2F(ytteI`hB~um0#!Pa#P6w;BdVhBVr)$0ey&Mi6XcfFSJiIPG^k>)SptjwLyg`{pcS9LmOU8a z;PYswW-3n%R9|mh!}i}(1Ka)Tx=hbQ)x<#{vgA>bV4*9p@^OUU=DHsst`BUt%FG4i zdcFcfG~dulAS|?@%Vn=LkB&SI^wE}o4gI*4`vqw zQ;m58d({~WK&ab{fjp{js*K(CXM5l7t0ItR&-``h8h818YDf!5!Z#f?_9&|Iav2od z`nkFL{@HV3-~DgK=y3I%s;(}zsc)7>fLbp4qGK6AvFdJ$oHP9E8DHB}H#>psQkia}la@n@zKez+|Fo6~#BV z85^gwGQEi%rf-T|fJ3Kn#l;-)30`NYw7;XIKofDA*8mz;fibN?>lnUnb}`9q*GyjC zr_`t7oUk09_#{9Ue_in7OVZc3yc2F+K?VkI5-cO?-rw^bFYQeSq%+5$0Dqm^7fHIJuA8>jaOxF6|H0*=^WXDU^=gjbo=Yxw4?a{sk z#^;#@vL*B?llx|N?9ylSm}tNB??yuYvzE?$%KcaH;^|BlUy848(|+S*wKHg@u^T=(Ot zhkQvU*Pq*iDY8w>f5JJ5Bumz11<1bL9zL$0EV342FzbT(`f#7<_(X{FKSp`Eof$wd zwLBqZnqx6{%!4Glruq`}G4MVxRlkr{tz2JWU=ueT|Env)%HZ4i7^T=Dei8dq?dKP9 zAqTZ+QqXG=yO5b5ulWY*w&-Vv0u_0>{uc7NI8H(g;U7(<6L3CDI35nI9%das$I@e8hvasMZK0nEP1Yd)tIt4Unpr_|hW8j)@LOca~0 zc)+5XgJlI36n!SzliaypmL+WMdP%XNo%OP9^7#vPQeMB@=`o+*#BIUY(|p{q(}yM+ z!P9A>+cli: Ask to convert RBTC to BTC + cli->>+lbc: GetProviders() + lbc-->>-cli: Providers list + cli-->>-usr: Renders list + usr->>+cli: Selects provider + deactivate cli + + usr->>+cli: Quote request info + cli->>+lps: getPegoutQuote(quoteRequest) + lps->>+btcWallet: estimateFees(destinationAddress, quoteValue) + btcWallet-->>-lps: feeEstimation + lps->>+feeCollector: getFeePercentage() + feeCollector-->>-lps: feePercentage + alt is not zero + Note right of lps: The gas price is to estimate the cost of the tx to the fee collector + lps->>+rsk: gasPrice() + rsk-->>-lps: gasPrice + lps->>lps: Add product fee + end + + lps->>+lbc: hashPegoutQuote(quote) + lbc-->>-lps: quoteHash + lps->>lps: storeQuote(quote, quoteHash) + lps-->>-cli: quote + quoteHash + + cli->>+lbc: hashPegoutQuote(quote) + Note right of cli: Validates quote integrity + lbc-->>-cli: quoteHash + cli-->>-usr: Show quote information + + usr->>+cli: Accepts quote terms + cli->>+lps: acceptPegoutQuote(quoteHash) + activate lps + lps->>lps: retainQuote(quoteHash, requiredLiquidity) + deactivate lps + activate lps + lps->>lps: signQuote(quoteHash) + deactivate lps + lps-->>-cli: lbcAddress + quoteSignature + + activate cli + cli->>cli: validateSignature(signature) + deactivate cli + + + activate lps + loop + activate lps + lps->>lps: Waits for rsk transaction + deactivate lps + end + + cli-->>-usr: lbcAddress + + usr->>+cli: Create deposit transaction + cli->>+lbc: depositPegout(quote, signature, quoteValue + fees) + lbc-)lps: Deposit event + lbc-->>-cli: Transaction hash + cli-->>-usr: Transaction hash + + loop + activate lps + lps->>lps: Waits for rsk transaction confirmations + deactivate lps + end + + lps->>+btcWallet: sendToAddress(quoteValue, depositAddress) + btcWallet->>+btc: Transaction to user + Note left of btcWallet: Here the user gets the BTC + btc-->>-usr: Requested BTC + btcWallet-->>-lps: Transaction hash + deactivate usr + + loop + activate lps + lps->>lps: Waits for bridge transaction confirmations + deactivate lps + end + + lps->>+btc: getTransaction(btcTxHash) + btc-->>-lps: rawTx + activate lps + lps->>lps: buildMerkleBranch(rawTx) + deactivate lps + lps->>+lbc: refundPegout(quoteHash, rawTx, blockHash, merkleBranchPath, merkleBranchHashes) + lbc-->>-lps: Transaction hash + lps->>+rsk: sendTransaction(bridgeAddress, quoteValue + fees) + rsk->>+bridge: Pegout(lpAddress, quoteValue + fees) + + bridge-->>-rsk: Internal transaction hash + rsk-->>-lps: Transaction hash + deactivate lps + activate bridge + bridge->>bridge: Process pegout + loop + bridge->>bridge: Wait pegout confirmations + Note left of bridge: A lot of confirmations + end + bridge-->>+btcWallet: Refunded BTC + fees + deactivate bridge + deactivate btcWallet \ No newline at end of file diff --git a/diagrams/PegOut.png b/diagrams/PegOut.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9c7e343e94f74dfe0cde0e28599f656173f5ca GIT binary patch literal 355879 zcmdSBWmH^Cum%c&KnNBj!6j&LcMB361`F;QB)GdIxCD1eun^qc-Q8ty9TZ^`E`g?A^1wtE;~Hx~h6ds3^-|z9xQ+fPjE0Co83ffPmqPfPjtg3I+ZP zQyG*IenE6mlaWBEm>@kuK%hjBlM>hP%mS?ksAzcPfMN8EVY@S+0urupi#Yw}kn6Ip z_MgkTf_elsjeWjR6QI0wRVGy{n&s}k?j#9Dd7Gq?yprD~-_nNYs7bVnqbK+h%Dco= z+&Wc&E#nJXL+yDyZy?*W-8e!xX&B=l!ae}SGJsQ4k1FwPkRi*y5?Fumz zbar+I9FLp7w{`#@j3lqFwY+`wA@_czS+1+->N>P8#DVkg4Uv0mN2susVtHW-gJHLL;VI&^w1UqM#2{uF&x;h^ueP_}T^;6U-2KNwIyZjl8T63y z@evES>;2j#Hcc()&7o;~4uJ=5D*2Cf`}+@Fd!rs-Y+I4K zW(wbzX>(jf5E})oPg1}Rfm*Jvuf!gvw*>@b{(VX~L=FE4)8O>_LK z_4FGIGY%tPr_9@1{}kqCN&PI%haceB4MSL8v0fv$ma^plyM!nFF>?Pq|J;ah-_*6H z>B(H!+GMs61ga>tUpb}Xxf}nc1JeEj>c0#9SqiIxRCr|Dn2PMHwI-*qp`lOwq$8S9L+frQ@8%Z#qx!cg z`YNQ`WsMb5KFSP|r7)vybv~x{GcTBi!bQOO{n@|C^MY5@NGv`+YVLxCGw4%PUh$yV z9iM;~TAZ+R=cKHZ)LH0i<5s})iaoi5r6Vy-oN=AK_ zOi&Om4dN|ou6ZCBTx{6kivv3nV~O^+scg&@d)(sHw0&h_LfrQrGP&LV3}q7b#fgYO zH&dK8dVT@BbpT#!1-zAzk_x{x5X6rb&Iw246MZ*^1J_vi0&eziVv-(1Bdxz%|urIAJN(MK%zL`Swyh1jrtA+3A zjb7KP0l3Oi!Lu710Byp@^Dy-MUIn-vpXHQlfzNLipB^_+BT1x+W)@LX*?{|<&sr?P zY*aOGp1?4_Fulep$rlzAkCiaDOxP_DpD!@ra~zY_*&C8l_pq^;NwLoH44$a_(oXNH z&RQsRs}lxsxSxdSnDLuG-(8LhF&hvEuRm`FSix31{YEeMqIjmX&RQlW{GTsV{Sy+d z{X|J(Vj8{fOv=-!Tn-jkV0VtG3a2&q+ud=j<`PE!USSTM-_Ormxt5W-Y+h!L!(dt! zha4<5Rem?~WOlrM79(rb%M$0_JO^r0XXLZrHa7f~Zr`LA4Gq2Nc-D<$z{SCdFY&uc zhM_G`an{4_=kVv7j(h2QcAWU{L!C9vmp?c?$`;;qJjgpC-K~-lH_^Kc+ZfbQK9smQ z4Ef>{HM5^pX7X)KkZ~_do}p#3e5^Io1%*DdjjVYe{_LL51Vhq?C~u@$J~rBm z>tzN6&a7vEI6erjh}G7#x993Lo*n;`IxEe|@n<2UcNt-S+>@8uwZ9)VdO*Yc9AaqR zg3${sn$b=BtIWxrkDuLyk`{oW&Xa=J}GKA2ZM2Cf&!xggG3l z00|wF2}R^{5WRz>iX9aCTQ+-0Nb>yl<+b0qHj<2Qen=&T<``dIMd+~RP7QTg9z zOXVU?eNB)@t6)6O2+O@ao?rF2(GGab4|p37yQ3hun3D9kQTdOqK%$KE>W@#GsLyDG zjrQHCMjP336sM;i=l2gfZA$^d|0OpP;=;~AS~^w}I9`IjRd$}`&iZ+{1udQct<+{r zQ<&3d*Q5S*6~ldt|E|qD9K?X9#VABL2>?6Z9A^tGgJVdZd@sHS%>STx`U2+&Ls=lL ze;1O}<6m9zfxBk^Yid|Q90}jUy%_9(*Uyh@brJ40_fi|f=wji}8WkS9VE&)B@;|h| zZ+iN@HnYO-N?3|R2VyRm7YKW%N@2w`x!5iN20$AEYKF9o*0*lIYPT(QIuGT?+0^_8 zF&$cm+bR$)u=B=%)^AK&_J1MX2THcG+HH!q6)z*{LgyB-u%17?_=Sr1pX059{g82)6-AB_j_daYlnjeSFp?xI4gp? zji@T!`al0UxFY!A#Ni%O^Tf2{=^dO69G#sNmzKg2@uAskR*YkJD@-yx{2caIt|`9@ z{(bSn*SP*t`k|*b^;FG9T)HvpHml0{gp z7v^MyA86$P`OJ->X;Dnh-Jg6=WD#X!O35M!#)b9dBG$b?){LL()np&L95AZdP~nrX zT{O*>$wE;x`ou4!tlxL-#b0xSb~#!JC#E|FY|xh{YtYc+AJu2}*)yZxsl_bSyNmU6 zU4;UkHd*iRfpr^vev70297W{bSxR~V-9g)N)~}C=$F8~7N!0uC{~8bHB8oHFeeR6F z78q=3cj6I`w+yH`0UfB@9c&Ff;JYVd?gN7TfUYs)Pr|W2v$G&UM+|@-n3RI4YI8*Z zLTL#uD+Ud*4R3J2$#w9~FhIppU3Land=C#FYFltlDyMdFJ0Z7vDk@%f+x#%kLVc<8 z)oKWM%{@qR_K8do)hXd;%61 z(XdQ@(9tw>QO*G3U-j+;n2QquAy+hd9(zuvb5B)M<9T*0hd!9XsPv5A^%1sO#j&#t+h6V9ve$I%gbaBCBg|IQg6%;LRj z39F%Q1}*JUknr4PtLrZdmV-$Hh@L!uN5?+tm_G~*gvZtT&vM}-i@Y;6Id4pU5f`66 z1R9JV;|8z+-H1ons4lw>3k#W3gA*p%waRH-pme5RP0}`^=Db*UXia-Oh_9BmU+k)$Rc`3NE#)wRFA=dq>ts>Vq(So~uDyU^Bd zv(^R=>N0~?oSIYNzH-dSAXFW7Jn|JJ)|N;!N)vWkwkz9>>e?LX$s~k`wDfHEVluf+ zuKwiJQNyyoKTbS2rB$yuu%A3+J>0mZl>*XnVl~9pG;oXO<2ZI(AVINX1%=@hBNi> z(;qAMy6`g53R2rY6E*3RKG4E;NCgtjNrS7Lui1N^;_$N1CdTfwd*#K)YhGA;jlB-2 zreWu@zd#&IEWK`rSp%&3W859Y-LhRo4l47W5hpYl2P8r#CANqUqP??IQA`$hS9S9S z1x&t}6HCikP}lXa$DFZ}-}RmQTDGZXY3=BJf&XmdSjo?$HR8-AFvqw7^FK$pr4%?UCf|5F0?rqS3NzujiyVy**^o(3! ztBX(N_~hh=TK2ihm8j*N-c=2yPyHut8lUARwoGeG2lx5Cn^jaLtvXTy z*2bm2E^#KLd1&9H|vCZ8)j^Xh4^aiW)Qz{Jt=xD zW0*ziaImSWFCs>GSi|trR-Gx~%IM6tc6!Hw0tpJp5RBv6gSM2ERt$14OpaT}j6D?; zB%Vc^54wQWG+kn@%bE#4a`tb5ZG`A$mG>G*BLXD6NQ5dZb-t}Ya~4suP`p@Hmg{(R8>o2qZoYgHZClA8|&+@mdhWDQ1)VxfO|2<^0r75w_daw(e*hDk-`WExX&Edx=?N;Xlka#>e^t0w z`L3VpLuFmoZqW=RZPbM7X&ux~vqBpBA(HALd&!DOK*7h0g<`6eO}onK@zDq-hl%ok#jl5R!7n_GRo&c zQ9Cy*L6Y7&Vnu3tOC+D%GBc<8-Y`e*$Jsv$=V|wXfq?@_%wjW=bJ_b)cuz^pYA{Re zvs37vo#B9GEs+c-!Kv&$tFCJ&;G>jO@O0DxXiy*1NI}{Dp^o_dPKq_kxu3Gd1>E;s z^V>rb%?U`!+UHDG!$6J)Y8z^k%OR6h!%zGtYk&j;M~um?hpg;*=u*oGjTV$uwPw6i zYPpE|1}{fa{WIpqZ*I;3gg`gNG zykx&j#-4>yiwwORYPT>@J%l5C3|^lpO*&RRa#|jyJz=z0W}^24u6l%Wrw^XOQ&CdL zMN|x>gP<2^DJ^z;pjiC1m&uA&pVg?>Ui>uajWZzn&Br8Exh3$d&`=TJ`$g^~-JkBT zsIcvafnIJ``Clc{??KW*+!HC^mk+B4zzLD6_3y(e*I9;&PES2yq)Rtu3$3WB zGNO{bL)dsyV;@%s@$JS7|BM!#9Ri`LJmaF$=+B&c8*ZTu6W+@B!sFhM9rN5f(!;{? z2SU`V+zYlzkbiJ_>#gd>jK~ABU#_~La1}-k)M>%t>7~pcHh@0XpJLqw9XQk7ea`&g zf6bG*(sr!IvEPb*4FIgB>P^FW=#lF*>n|7hW%+ zr56S}klX&+B(A=EeqRZEz(7^ja9RJ>?HTYCbaCM?d6D?c8!6xviQ5R3iyY*QmS!)~9j6}3+Bmem5$(j>7DPz14uN2uQl}sKEFRaaM>KkZ1T<2_#4(-{y${JI9tdGq$WyerdN0v!$wXS0CplE3O%_7!Z^V*=G+PcaRT-fb`#>E?wOFJ;7qs6sW zY+?ATy1(yCk#OkLV5etU;eQY2+&G)c=&#T_Mwh=lsi-JUfOETJ zl&zxRtE;5dFYFK(XcT|R&w>K)5nq_O6S&WB6UH|G(rneHU7!CB`DCCWBqO%QZ9Pt4 z1OKr;O*!k-mVX2bg14L6$hl_`Zyo-A!G3CSS$r{EtGEI+?b1PbxhZlYl#7&f2_^`^ zvm1G)m0{E?e%v7Y9J&rj$PNgD5}RTQ1z~lr@oHW6Jn8ZSe?>f?~bNn}T-@+0=Hz7NmvD?45!ilHTd}R=bn?+#Z;;k-we!6o4y)(-`bZHB2T@YukpaB%g>;s8x9cgv=y&Hbu zl}0Wl)cCF_ycN_R))p%%sCdaK9jnRXFy$zmx;?<}ys;s)#q1yEg8B394Y!*FNF=)l z9?k1YBM`{R1-!I22d^smdh)S+re_ddktaB+1qQ5!;lFE(;ye0u>6{S3saGPZC2Jiu z+;=i4^P{dkt$p|0#(=Z3{er4GG$7c-%z)#2a&nzTjJ9`OdB!o*yDSoQdN18XG`i=| zy5;ek6dUM4%(5uQ;0~7mSg8Um~#24ok zjN_<>1)K!_Zjik;>#~1R!ju9Y?*@z?wLh9D_yneTdRJ(@`vIHy1QJ^wf4(Nfa1gPe z4f}G<(LqfX$j=!SdGXe+nCf`3Ej2SzobcVKMMvGfin>=khzw0q&toBZw$E(0K*_8y zc0#jFv}%P~rj1{XK+q$l_ziZzi_QqG@(iB$0i z<42nX^_?S1#&M;D?z@S5O0(N;&*hBf%%^6KG#0B548uPIffw$YW1HQFcF%!5D_CXe zYzYK!gGAheCqc5k)*=9l;rFbcvO}=#+knDQAi#<2ux!`ZA94Kl>n?t~ zgvKQ8M9O2RFWY0oVae9;Hr@dE??Ia~lR409t8QJTdP&A+^tAnXuR8dXh zW62rYr)g(VKW6}x199dR=IrNu$%^2RbbvIt)>669i$xej^y?|hU9{q-^qo(4TvI}U zMd4g@!{FhNVUS(nPmtfA@xi5SLy_)xK`y6L3cVMkuNf7ybl7UxI9}A2zOAhGrJUT5 z*XedwcBQSQJz&4kJYVpWI{Hakapym10-^aD(vXNx9!Y(=ybfxVnVR(sO_+IsCEf4j zYc^({`>G6ZQOdF>taV9Om_EEq_ertsNW;k?P}H%O5leY)#?HRWV$&!+52vTMGq0i| z85GoX=Y2)nwq@%$pnRpPNN8n5{=~34p`z_cUL(H*j!k!mwI~*mRW8!Zy^C<$Ox`>W zDuE3k4t~C4WMCDR&a~z8aal0tShcpTC>$k5OY{R9!jgInI)Bo-_EqbXNIIL~U_9UDjDdFE*_M8EriYOd+ZS56 zANkyJq6oL%=?dStTCzZl!cugJeSXO)MF&w{BF);&KCr_1Jpy1(84EmWylnnSCfJmw z5Qjon*`?RQ5wlWvzvRzLD;#A741*(%tUvq!_1lf0YXvr~W7b)M`kcOqM2$^Z`r!wh zoR-laIl}oa=yaWU`dD8I3^PtxX9$wTAHF@+QzLr;01Rnu6J6CAAp3^hj-l82A*D)m z?zW`Wh-UlC3l^7o9PNvTRJbR`-wExA(rTDd?KA7MhIUkxXv9Vt=-5W`X5m{*I;5!Y za)b0JT3UdOGm=vjg4kV^wYJc;MmpOo@u?lz;P4B|C1F4KF5E>xgRFZ64lbuC2IB_; z@kYv80A$;+26WyyW^7`3oRv}$&)fUKsy;50?+JE#`n{rJ`Sb)Hq=F|6bWSCtq&ZiQ zK*+Wl*JXHo``;6@Y@#W5VyJ2odIFJ2Z|yT0JBFK&3FMrxl~>rSn{I2wguFJ>(3V<{ zm)(DbT3#{eOCyi=PzPe!Efg-juy7mK)LrSy;o#(`N{Vim`NG7!xmF7M*#C!n!Sbt_ znY6_Du!$bGrth_@8&a>_w}!|UuWdWJWY^`q1Eq6Kj6$;GzStu*)=X1TaqVAa6&%}e zr#q0**cxvpQZvMM7{ETtt%4vx$6M+Q7F(~c;7L^CY&3pS6VJwXDg>J%p%wxSDhTK) z77Ag=l^7qmu8?4Sb6NH>z1#gR-~C3a3P<)xAQc<@D&Ik#V;mvTa^FkDjqw-(?^ zy2AFFCceWxV@&JrbPF?)&OZdISgw&>-tGFF@zflGRGJ_cd2D<#y4Ndo_1U=v#Cglo zX_YI4f)HjVW}qat2U;d>ARQtUi>EzI`;{Cy<1ConxnKU%MV69bqpS7CO z8mHTsajmrRw-;OSOLqB{9!85+t`#EVtIMS_*@bi} z6TC7B_nH^yyD3T6L8tVr{{%I#GeT<;x%JlC8ej(ngl`lTN!un%`1MZWggh|%d}EPG zw~VT8<}VSzXuYOUeU=E)G^2JQUIpfyvzltE>dKPt!2vH2`OY;Af(x`9m56_&8{e8{ ztb4AC=C|z<#z+(U$SC8cf7m#COqzXb^d|Gk=N8kwLMTD5&b7AwoX{$hb1D9q?zxZS z&q<3M05bT~Qe7aYBDri_)|jfhAGG*e&_LO0o2mDrh8k;U1mJZKA|kH2<>cS5t87mG zz34AvI6`xZ)%!_#+TQp3Apf;KZE+Tn`I8+9kz6mf9GYM;-*kOs#)BYtwup3jbIKFc z1ItyO?uU$s9y&m6;dV|%h*9N{6~3Kza82}vKW9PuVCI}hPMzR@?K+NYh4J`o4ks|k^YnkzO^zfz6rE!zmgZe@;7L1fQS>9b0 zMp*?D9t-VXP6W*6DmhUY_pHL2;Y!0}`t_h~mp? z^x`7w#cEuY8Kq@EPT2AtP1y1A(HbF_bxz~tHw&HCWwqw)nQe%UkMHC+AiDZsJK{qZ zUZM=PghNTebZXa1w5^7xO>+lFsDk=3FCG-=$jn5 zDQ!0ghhKXdN?L~|@u=YeDESL#Lov3J{_7(0S7#2Sd5ZN0y{mX~GrD{XvFye?u?5#Z zxiGHVS2b=C-3D|GS39k~bXls&lY;ITishM>wXgBt>6Qq7{?2x>*wzRx8HUOh=`;kl zFIwt1YNODJ^EOJTVWi!768Ab*C>2)!3Y7+`7wDnTYtceadM8Fou8@$(l+`zEEt&Sd zHz!r+{Cdia_}uGZPZ%$?oL5n5c2_?^{D&AL3;Kk;Ut7=|A>x)08M@97hb4Q#R>knh z_l%pd)Dbnom8E81)^7R~6>B}NZIGo2rB&{;H(fsVwj6;jgLv!{Tp;LYIXSxQUfD%1 z&t|7=D`MP~A{K|@Awj150%fD-{+BnV8SQ~`R_e5cv^+nWe7-!&R9R5|t`Rm_EhDIG zBm-p*%L4{b`UG)9Gc6I}kgTT#SU4l;1{EG@h|unQUJNeV z)prxRSf<^@RIZbAHi3wYqaTEJZUs}2Fk)wXf(O^cj?Ofvb)WozVXRO-|c^3uLpBF^=sm=AmpmE_+n987_F6q*aCRfchX_ zFF+#a>)1JAx{f;iGlnhqJH;_k*dz;P>S1+J0`GjH)89-Mxi&o5d`!tL`qlVFe<0C7 z-_9MY%ib}vla<=>VH1~ZwLM>Hi_LEv!l6dj1(jK3IqRcDY*uUE>~X*o8Q|+(r{`Ir zgpI7#3Ysftm3qI95cy!e87q6i8$PHQ?+=abgPN^Ov~5hg7g zEa?EtS9tC$OYUAXbP{Kz0d-Xa#`z>hfIJVWABWLbV&!Y!PTY9v zbkv;sUr2LSc!m_M==!?O>chc6hVdd%V<6?XEc>|Jq*KA>4u;o{@*!s87LN_@@^DZe zmhv7fm^z1Kc2!kDgvF1^sl}A;`KGIVkJ!!Odwfz#bbV<~iyYpfQxmStzyywVK2_JE zQrD_g(!BXzg;oFj6@KnR*2U4$QD3`RUr~bj={dFps_vhYBiDlXb!i)jst~OaS zyuPA}?jG05PkH>S=asxF+Oqk6e4o73>ndsZ{dh=M&OL;0=77~ESGD*HQZ*MbYR;&u z_TmdjwT$3fSI+I$k`HSW-L>;|$Tx)|Dxrf7IuYGR`f^6IR@^bdu(~<9kx{#m1r5lG z-Ej&}(>CS`972)DLWzlWLTt^5FQi3s1`G+a^pn$$bM0^y{f%WedB6VN%CF{6O=!@# zjJ%C*9^lmT3*^`yF{)%J9+ssQS?D`B8L;xg(6ZypiCo#@U{Ige zr9L5}U`2XV?yuq-v)yM_GY_Z4<4VtF0>!Eg2Su!j_n?txtFW`EuWWDx_Wj-q4WppJ z(^wN4 zI2j>l7E^@x8ca-MQ-r(GVVA3**Z^6~b>W%YSLjHkJm#9vCb!aDcr^#S=84I5Y`_l4 zMrB4Azr;Ls_;t|Sy}P=yn8bU;%WeIRo+or=9H(}Jy6RgTma(O`KHe)ny4RsS+9`EG zWO5`!_Ryq|mz`Tf)8^a7o`QmbUQg(4Qn(~MoJRz5D;v1Z>Vn#PexV+b=uZ6 zWvE|7y=+18=k^g~zYlg{D{!<2{Vdz>i}+z|7WwhuBXWvkNJm9HG}mJ64RO#{ebWmR zObf7cOHEEngS+;O% zdB;UdmRp=aN1fa@tT~6IT_3UN%vD8%^G)Vc?HH%3zKG}sua9q<_A6|P+7g_I{=kL_ zdt;u8`r#z})SU~9A0~6^>Wkxl%3SGkxVW;@$TAe3gWPD%Ak_&I@%hts)A@pHbQaA0 z@zr=T16TTxHs$W_MFCG6O!^uv08=qv$JZLy$djpYH;QW>g7dkSU?(Vm+lNTk#G~iV z03O!ds9wekCzD^G{gFf{x47Ud5Aczlba|Pbn!(-3T@I%?TU)bn^LALUW5gIGKK2t< zGa7pm?I+%7DXkYtb2Eo}$_7ypB1|Tpls~{Oj0(WQvNNi$h7^+4+$R}%ab&((@3A?l z8Dp202w~XOX#8sA)NLme{NCHtHTps!x|k>^JMfg&z`z#Liw(UL*&dFgbUPKF-(sku zB%wPL!#aAsr52UyDXPJ?a}LEgkl0!jtG4eWE#88B5^e@Ux6$S)0>9+AM=rSC6LCH( zm;t!0v0#*K)&^05P7QK;{h4*?Qv~z!#c1y9KWYgc2v@PeG&o%(LiPgyyc|%}JKbFT zda@RG_y3}WUH=NzC1-xOmZaPkQ5AjkpRiyiq*|uYl%%IN$c9;#pj$#hs@N~{PsHg0 zt;5P_ZGX1QPLAWfZ5UWMI5^I|ThU0dWAS(S6O7NID6g(VobH+)CUColQs+AKn*J7f zghyk%=XAa(yS>;;^|*rsboN3zJHsiSRiZk>$Jm@`21qox7p9DhQ1$nD2~*BrRTb4X zep$WSqwmc>=#b#UU{1Tfr^61%fU28Y`AeOacvrB`e~U9Dwy`-vBWpIV&+W%WVIFL^ z;;UzS4Bg(A$Hg{}w*Q#E|1q!N{F9V9FY^}8)U3#voRgm=`=tKiz#`wWyNNc&`F+bE zH-GCz`hK)-UNw=uW^#7%9~1hN7Mlv`!uV9~C-ZWXxZc=^#Z_^~m?v>@f4Zob=yW0- z_R;`Fki}dfW}|Uc!q{T$Cb^cA?h9rdQgcO125^}Znwq}qc1L-D<;B+-pGkXWz9NcR&U*H$a#h{ zQ9xBqF53Y!nyx?|&lIjq8MVm@poFJ~g;2kDwf`{3rPl1r3`*em-hht2Y)o;c ztL!1Kzc5$}0l+q9A0rP+O4Pis_4(aUhNw?jdaGE;Zb2F%Rp zhb$wzs#m z9QcKC0+{-)a6KAw)S1bdVC;~qtt2Nl|CXkOLx-2gXRu~@z=$(fk)+rR{-)0 z_AA2l46M(X_cA?qsYpbK&jZim`8!w0Q#+?9)S-?cau4YPr2d)~wlzLq-QA*C7~Zye z<%AYRO-;p6Grc9j;a6W&@vX>6Nny_zBjikYgxFQx2W?@KZ+4|a;XOKk3v4c?ycFt4-wk}kOO>#-EwM+G>5}Ii^6{4Mo^uej!`mmK z=hJdaA2SLS!3v{Bk)`A-%`hn5DB!G5iw?R#?M@C_PPI?~se|~>@t3o2G*U=^6|fU* zJa-Obxx&U8D#(Av$#UKj)Gj0{_&dF~hz+2!MY&%O+>tG6VGACcg`TvcZ9CR_cy5dR zWdp?X@S2W~;a$n;LG`6s2?@ig5jpa9GsHcutUElWRjY%KnP+&fF<|mUmOz?S?G&^6 zo|^{SL_6duh2lmeyLffco2uC>LE6t`QWkc-Z$Io*ff#Ogi%jOox4-PAnfb8IexgxT z7ma|sAv!aUKAe?3qXG9N%#34QnXd%o_7{A2GFZf1Y_t5werBI)8F>>r28c7HJ0?A> zBO!>Pi2KNZ;ij!XTB`X`VcjbK zmA%5B}InPdJ>|!7V=6OQYPXnJ>cZt^v#JrS34Fh zk_6%`2-9?jgnQ1Qh|QWrfCxY<+#}4N8DDfEzDs`-1BBfF>Sr5PJx@X982>2=Q-|Ao4T3a5EQEZ zqU~2t!7Uu8*hU7lF@Dp1^jN}(6AAL6vw1&@hyhA0qG6eJfdFDOUP}O_)7!dwS7S1Q zD7M`E$+e(Hyq@ysiD8|CYr1xV_W$W za2se?(dedlG9=zlG&=$hB5x71j6ZiQM^KRWeG||$`^*_THLBsGOYf^t#zl0}GKAWHLOMGj3%Y@}@lO zyhz$%q^fFlPsn^LGnwqYg0jK&?BgMDaWQ?(qou~jh&Uy0uukwzko+pOGwAlY>59T^ z!GdYCop-dQKS%LbdB}c-b4I&UQ`U0?Swn#aC_7j6^XIt5+okgxOkOee&spWLG zV0+SyMAD4CCDIG7%7Bsh1mdyJnM?fVlpRHp#1$1o#%9u-a&pwq%?YbnP zz~Nb&+97nY=?9UVWQKRt!C^8l8zA)v4PVZ1w@)`9AIoCFm zk}zIHYTmuU@%l)}(7K%H72gx7pJO{p$;6WUfg~-Ptj^%5>jI>#FD~3L%r48oolry8UpQ5iODd99tf2`l-usp6A=ATOa zqQv=Uv?3NOeiiTd-+kt$`Bc?}>z*eQE)Bmj@3JuSNtioEx%uYs>~CjgZ(d^NIRCL> zGvoJAPfBFJPo$WEB%a(ee5d`MME^WHH9H9({QwCu-vu6mlvKyniuJihoIeA1MqkqW zPD5Q2Zz4{zbb!!mf||}e1knoMsa;P?6tygGaFppuH=Yn0 zpHLt1c^>S1y(#ZplTe*;>M81#JHQ|+u3?9`=l3VL17%xT zi`(;rK}hdATaq045KfQ?9Gj05vo58!Yl3-rgDg;t<)~-x>B5wA`|1iVK^U5I=ou^_ zr#ckXCmQ6aG1=w=GNuimohu4ZsO!UHBn2v7Wf7GS%82I89nx9*tk3|Sv3M=x-n+DB zMrxrC7bnNq;#Cp1Uwg8tFTU%oT|S!CtuCl_rU*NxauVDQkBsbsCvf0JY2Q6))4fWb z9~aA9yc3O32M4kX7VuTlu=Q$Yv@KrNmSzt~<5^8uCR`u#;ozhbcpur7P-I}(x*HS~ zf&6U7`TbLPo~;M`5l#QW$SgQUB1cT{T(@5lX=$~~&ipo}La{RCF3i=ZnrqJK>&CW` zGK&iyXtBvyupclvDk^zUk{4N@^=@%i@e4z|^vNK2*gUjum6h!6GSADg<<`pG)u$JE_KZkOCe|)k~6X%dkO+$gI z+o96y*t?~)hJ^DDtP1WlnzJQ#dxU$t5zV}R2vq>C`6oBprN($ZPtjYAEL92>Rm@PA zJ8}$Bu{Q-4Buk0vz34LN4DQddeq7m#=h<`Ov){dYVhp`o1i#pp{rXjtqP(i>41ui~ zH7H@f&2iT>Z>Ikpkg`3ZSahc%z_ZBrqny`YFnTfI zh%dTzC+|g!rZ?JA~~cRFUCMuSNoP;tg1K&(EvJFc9`@E8TV+Sg&0m zq5^1Kd!IjWV1Hm{$y-_)UeQJ}n)Oo7{YvZF7fIzJ$g8mrKidGu zYGbJ%3D8MWfbeicjr>GP((EkiPk31^-r^31V0i5N(%;A@5!n1b6+d2AV)x`%3(YJg z2#l-i?$hx#=7bbFT-FR4f7-`U1`!JJn=nL_IH{;f=7Sk#SOVQ>Z>QviEe3xdUQQF( zydTN=xRRsR5KWfly+{4p==oLP)VVCEIxfB$vS_DhL?+cs_d@HeQU}_@Dj(;sIJ1Sh z)GVHT!1+_I^2cxHy6_=Sztp<|_FRB;$Gfxr`YY(5n0TKo9VDjrTZc=uI%?yrnN(uh zvvB8%XO7ln?9xO>x}VP~11rmBGr-q4rnmXl>(>2nQr>tRMac#*m%Pyg z(E|s!aEA6lR9niGi<+fc9P)j7iUq!^Ir*>MwfBaiR;C8=BP$>Rr?;>Hm^nQ{kE402 zBmXgB@#w~$Yvz(7t=?8eWJCXE{-5~d`2siu8Ei0q(fwuKJ zGOt`}wp6n|vB|B*0CMAV6GFMwsHHO@siWA=gAeaC`PbkTB~kGK&YoPlr3fY1B!f;Te{s_H5vc(xSJ_o5sXr-)$+1V;hvVF1OW^0eE_wC|i z*{K^NmVNP9g8Z3YKeHb1dFvQ=bjFo7=OS=V?uAJoR$p%+Jl3Kz!!fnMKc;6UxQba! zlB)VCnJwnjOz3hT5|h=ku>f>X&bR$R?X1h4iE?q$A+kSD9{Z~{?FbCHE?$#^2R2HZn!z-+S;ESe(bDu zQ07!fU=Hh` zVQbnG{#-q8w+4B=K~3?a^WNa0CqKeN1hBF3>NPNZB0eO7i*5p3QhM6GRsMj!9M5|nmb86XE!t(Ze(~(dR14Z55+-r(@CK`?46VOW- zEn%%HgA2L%TNVN~LyM5<(8#*tUPWT`vGOarGt4Da@-VLH9{SHFO*7k}kY;A0)ODGo zWFCGz8Lacn6I+foh=KF98EF__G_>Le5hw0a!cNitJjAQmndK9aLP!~E@FNL8qlj19 z)Kl!&^$@D-P1?86%D$}?CDn=Zf*7<;57be|Vbm;9SMo~hH+!=52j^!vr!rNA1Wsw# z{7$zR{qv{SZ-yBUuK4NO5Na9p5YOs$=2=Ym_0d$+6_U8z`kKoIlJSR|BeAk7;zJxm zCb5xibp|SjZ-hsGZcFH2$jIgnD|bXai0-VF3S=QkNU|(}&}i%h#sp|9$jG3>;Y!t#Y*8Q~@}gQUkBi@yZ=55aExe9Q~+b;kE6&UnOyMB&p$vI{1bz zvDravIb=uRMW3ZO9A={#2nU~CE}dYlK#O}JO{O@|8=kQZO5U2*ZVseHnBQgQE;fSvvV!9KRMwBTT5PzjrnX{M^F(ovKeN=lyj4Y6PO?l@%?ikuS z>5&UQXq^;=3NQI>K%cr$H}0=mIv+hCR`;FEdlX_fvZA-K5P!7!r{y~!thepl<5}|g zh|M6%XuCB9%W~(ypNH+KT`cW+=ZG0XAK*-t`!KgQ$A5!_u+g{J;Vw*Z*Oj&AIxDp9 zLJOsMRwN%yy@bZOPqsyYI@$#SAQYrSzkm-m&x7b{J8MIRo+eaaAETKy5EM0Vc^`go zZ0G(^#t+y%&&A0Z|L{FHcJQhj+YmVDzVXY!VFLJs8dh`X(Qzp)yU$2OoY9u^c)R+ zzL4Gt8!hyO0v|Whts9DEXi;H%v2AxhVebPb>oO7e3MfDUjKH#IyXXDw6BbasMyKBg zpijN1$J!Pl3W8&P=0cp-h6XM0E-oOAAmG?VhYExU|Dpr}!r~Y@P#}xI!Dhn1L(zj) z-*(X>3qSB=z@YOnQ%CD?Qh_a+o*-KjN=!mBu>@e7Tqw~eY7%z8 zwYKt{X`Sn&9^_Jw=8JHSWvvWlD^J_NJ=UAOA1$BNLqY(zQIL*+pO0ZV4n^<9=AS$F zri~bi+1GgtB%TZkcg4;oz|UKSbA2XE)Aa+dokpf7jlB}9k{%mIau z2mwKBKD+bU{Ptv=9E4DXO;fBg@BNyuo=PyKN%k}H$T6dtVLJU zivR!K`Fm;liRSxbXE0IhA%Dl~elJ3!6z}iF_e780`SH$G>+hFD{G!xsJ9=6CrWhKET1 zr$bRl*C6I$x|Q(|MXakwh=bW^55FweE+qW+CTLj6z6WL zqB}CwK;u>W8yKk8g70)rX{kg@0)ObS_cv(#G%|K#X@AjpoST<01-x%&HfeVuBjf4v zikLRiVM5Ldx@YL@&+%f$7>tYeaHx+GasdwStJ|dheP?T@ zF9Bh1KRR=s|5#(xp;V|kHCwNLc-D**Zo_Svp^!0IN zC>D)KfK6{L+dm!&Xl_P zn@iO?Qh)`Oq4!CoppI6cj~}{nBu$A1<3RIPHK&jDcI3q6rJGRA!@X9`-MLorq@UuD z(gDx>r|sah`0Vr46egn)C`P^iLJI8FK^3mSJ<)lKCbv- zEA1Mfyha#|g!gQbN;f0CG%dN^XSEn<2;DsP+8YJ6B-5X~4B0`hh9}hg5l=QJ1&o-F zy?iJ_{)p8?*KVL*$GOW-(G)Hrw^u{L{1}ydkyEnuao1lPL4=Rhw%VRZA z8%QQT8{kQGUl@AP)9=jVnDydCE|s&ZVcwSsK9jD5pcJHmW@cPW;I3k0GsGgplTovW zDi7hpi)T7+k;$Z~T^4Ie>)ra8^`iGLoWYwnKY_;wuAd#%cn$i)=Cl`RX4ZA3P3BCu z^$F4knG%DvbKh4HIICDpTs*epAB{p*iRQLhd$&1!LOc!l9;V?|?RUiuPzA$b*$Eyi z4HcCnp`rL!V1?0{qp!bq3PKY`jax6itkAi26T+im?lsk78hi=L(T zjTVo5V-~V^aw1i7B}dEX+nWk4lY2V9Rj@h%}u8MFobdiKz}bdy>sF*cU;)y=f;n_DCm;@n** z2b(1rOm23zL}TL_Dq<3&{_F|}1Wwmjs5;op;QCKxkwKzb>1QMfH9t7UCMG5Y(t}+( z-l#@)WG#H1rlp&pm9coBU7wnDxXcal9G|ES>kjVr-Tc*8KKw^*?fM(6X{L62-@&}L z@nL1WW3GvTX|<9}uz6mAuXMa-IiwwZ%ARZ9N2s#XQC$ReIJtUK%ZemByVaDdW;`fT z+bmpG1_BFC#9+pAf80%$kdW|R86Ou5C!EI)7^+=k&it&kmJOCV57BKPlOMm!yrdO! z0?4bUyVflv~-G#PoK4x**84$MZln266meS`rs>z zVU?@%>7(PVt+9X4bfpUbOX_%xcIJ?6o5S$wuR9)TFP|Z&r`<|N;2?=`58|^YJ9lpx z2l}X}v;yJPga-d_8sPp^pW zPY<0v*=^m)Tvj`19uhc>{lKq~*-;xy2V%|%%cAgXd0sHIY#s}j+19J^~+Yn=}bl1?ZlUN_g!y`X@@;|WzFVNUuIMUDr?keht3D#BK8kjBG*ga2sYQ~dSh~$f#h^=> zQ`gYmv~KHc$zVNUWhz`Nv3{>TY5N84jY{O|-Hv9^=E33)wZU-COR&$;!n%9O9jYn?1$&SBI@Q&wLE}6VQ@e_$bbY{LZsc?=PBAmIUl-G5 zX)&`&xpEVCaayF>ozC!#@clz3qAT+7N2rFSiRtR6a)>&*5y#FH*)QnkbO+>rx__d; zwR7g(DLYQ>mft^PZ|&>aSZ67Cf8}^_v0bT!Ya3QvM7HMPag5#B5r5{PcBTWeUewa5 z)^}_8#B=8dvJ$jd!lY(YB_OzoT7SX{V7$YOA)Z(|+w*6i$^He;mP}J^j z&WLpYIpDH~lgrHQ$|xL7vVN(la1XvYSs`v$5`V2^p&f0@N|l>}lt0LK+%rHnDJ$FP zwH&iy4HkqZ}?`W-dZRQas3#H;_GK#Om|K)Z5s}U>e09XEbL4lck zp7Y#e|3z(o4$6)@9D2jf&|ON+c)8(y7Hq3BT+Y@h7&5%wi%b&NUjG#AvkD#VoHkrE zCYq^l;y{pN9Uj5lY;1AsuFxzH+MN1yY7^1<=^V_&<34-K>BNQyeL<(mSF1v^C=YY6 zlyLa)V4Z4mK5U$K`vsgoaNT%wTsvfn5aPw;Ly1S-ZC{P5I0PS#F6$~Twru9@OM2=_ zwY|K*ySGfJ-jjoK+^ct|m!&3}dKlc-fOai~OkQ4o`S8)3}gUw$ZF4 zH@uJCbeucnq!ihP-YlVpnRh}?VydQ-Sc)oSTmkgR98n*pvN4l=faqVu3rGX|5sN@pKnG5&= zQh5&84~&w7*nWtglIOsmEaz;8t0D37dd)Fq;pVpf^PmqSADr@u#yX}_6Y=L@b%d*( zeNU?p8f9R%ZGTFlT0S&X$5fwxfaE*T=1V@WL@iOn1#R8V7qV{MlRaEnD0I%M^>gz= z?(FzaeH?jkuQ@-7?f?fvWPlSt9@S1;ev!!Y+0+KUzL-x3bD{<(!LK2_byAhKzl@H_ zU7){P$I**dXl`8ppY~bOyFshlybxAp=|1BXTq{-A9GRQuB7HTIJ6tUz{OHs*jmq5J z!tuM^DBZG(8nEBk7%}ej#0W=(wexWw6f{}@8@AD>??{>y8&njXp8G%%Y2;cAW?VCj zYSj?7lxP%f0U{{*F)Kaybxq=WxffVdciry#K%E`oRK(cI3i0ABV<=O63|zJvp}DkmyBV(D zO>%U$ym*p$T8x&>tE+UW?9Pg$fDeWO(+FR;GY*=1tQ^9Db=2h*x2y-BT?Cn^=&saYFj2n4^%{Jq6Y>gjROVmhrJh2(QQ&$yL3MWnBa*I$ z!Zx>VpUg^_XcyM-p1jP}-z+PzkpD8lH^z=ox|g$V8G`-*b6!r*7zqaTCq<_Cz%L2+ zr~AoJy1S@1_y>W8NYb;L0@l8-QX)EGy`02{H8F}|2k*1luvL}{OT)4=`xLJ2eH1_G zEdm;!X{o7Iu8`3u3pEc89vG})kX-Ei1s~CD+rN$8^wfT67d)Ur0sb-ggfY?vjDiT8 zjalPY4JJtnaddV5;3!{?`0N9UG=q`YY?N0gT=}PlR{xgQLP*3(gQvTTxwK7 z*>3-}n1kra-sFp@uIw%~PjmCs9ZK#4WGNU-xKXaAaXJp~(6r;zDC+65)Y;+-8k{IQ z$1j!p`pzeBS7G{rNX@EMC?cp2E3)xLj65FSIBq?j6duYrNHhtez)js|jDmY7i2E%J zX6VchTWwUg88#+6p5r!W{rah&xK1RW(!j?X6En>*{*&1pb}Pd@urM!~U%pK%L1AC0@~a5y;kB*UT%k! zp~H^{J;>sYfpc<1VX@YaPNtX{l>K#$z9C#u&O~9zQfax0L?a*4VYacr+t&?Iv0i(# z@@{m+RJLCc*NTua2O}&cyJlcf;4 zS;uBYDY1c1X(-^t#u}o$Tr&$V4oki!(xh3wdpo)&n2{--a}@+~ySp;k%@#(9N^6m)bbg1GBb-@pj=Fg*4)mkZ{|b(`va>tu1B0yDQ!>kx%Wm+75ZN zzCJO6T6fk?xk`ML^lgC{bdjs93x_uIQC60+BQC*z(f4UV$@WuJ_W5ME>P*MICG4dO zS-5M^0g0BkcCM%6kdvh?y}3DQ;_fh9gs*lvq$Zj|BKYQ)bVbC;Z+l~{x`Q5FCtN-i zCGL01*`qcyS62ljMh`%>eYm~h!NKS>H3gQh4!!-Os|ZJbU*tI?uPoO#BPUEM^aWXG zDr)-5GVe$k8m1nm<;piT6I*<*4Nlz233Oq$toFb*m6KDaN+o-9=gTCwF3_f(7$19l zpIra`i`>)JT>!fnU^>Rj^7##Af&e$^UrW(fkrSCXE4XNM_>riJkC%l#Xf>_dM6fsZ z!6xZ0ccXF@)8qu*Kinp&!F!Qbf2*x3|0HlaKKJc!N)tXNB6wL#Wo_oW2mzz@w{4G4 zM58KbcTG0}eIMVjI~B`#X7s~v@)O107w_?TJ5A5^7IAOotv0Tl{9g4NqzKg7^^SzA^$tQ;Q0v~lYaoP7j)~D* zv=5d;CRYXR&HeO5gT3u2wBRd~;R{_Mz)6d=)cQSpY{+O=p?m_tllii6IDBq??V!Sn z*wnjmb@R81yHU*C>Q)^iJ@HHpxy~Ws&RH&X6-MZycR~(9gppm+lAmT9O#&Btg=k zBJn2l=(m^u`PAno@sSD0Sl+^dm}?@Jn;kZ@{j+q6zKN~D{x<)NunEpZ+77`se`EY? zh6$wRHbL81wa%U!<`jnYh5Luu`j%+_TwfP~t0}obTc1KgJ~awyQmjObjp)CayfJRf z*zf~cq9byQ-aI37x-mdgytn=(yZptIcf@Ie!KHT&}2Y`1xhG}`)n>S;!g3L!g9ATG{c z(^Dznm`7-Z{6;J7oiwX{_dz~Cdg_JBl+BOY32NuK1skRk?Cgrn9ZBEywrqrbyQ*s~Z zKg%yziETP-+SzY$O^EOl>S<|OToxvK%*`$b1P#4NGrnXs+IH9+e+^ddth2Le&R~7S z>7<}#7iH^iMpJU%2DoFbOsS6_Mn$g@H~}?Mkx!wP0|Sh-TnB5!>7oHl%O=v^t_6?X zZcf%e)!K0X9;*Fhh_bxJ>upvdz?_hN@7Yu359c48K*`AB@nEhPsI#Z!AFJft+TUL1 zo!CG;uDv?{!!b|QONR)=c}9MZUq>w7E_33(EKhBh!mXDennsmhts&?QTY-Yogq~6f z*VGF8x#`={G)sn+e4g11?W(I#9tEkRInL)g_cx0nqsA;3aiB~VV z(_DkbX^tC5^K~2km_&Fwt^fwO`QpNG(!2M+ySd>;SGFp!zO-=Z;7x(tN@rzwWdZ?T zcMVU7wqNrCTxfmZ=-6a}g{NKLP9bDzTeCb&=luK-YJn&b`9=oclRP)TP7TE`C=0!m zBBwAaLj2BeYG)b>s^pf{D&Z+z0t*}zH5)B!Js6nCzYPaG?a{f=03T5c+twAD$xCL} zC6PCTp~0kzjT9Kn2HiQ^i+{3SmYk9FX@8KkPSkI6HLs0I7kLTmVPoI#P~D0Oa%+R0 z(Xf?cYZrpdugRqP=aO%Nv{g|N5zFP9^3ZL=T^T|TKM+SPbJ-_s( zwd*6tzOoilX^EspUpY2?;&(;mw1|iKgLId;smGgEm*Ico5r8u=d@t`qF$ufoda zBHTD{HQWb-2;W7QJ2vg`DV0+dgdfctK6%&XHb}iv^vasGWpBNsx{3E>FT|PgJG;!@ zU##G)m0RyA9yAxfVxg&StWueb9bH9qbh)f$`dvNL5sA0}drINN1 z-MRDBw`J|WR66OY&+L#Y%Wf6WjlanhZS0+Ak)1v7HKXq6n6||}%3Wo+8U;>Vg&hnL z=4_DR{^x`o=9AzI&4*5o(s=CJ#vEfGC^Xo-&@q2D|ud zvg7aGIJ4hmo7r&`C0q;-ch@@U^-t1Yxd2-~?Mn3tl~^28tN#=*IQIB|Cf@MhT>UwJ za{I&(ayXRr_KA*kN}F%$F>|MO2?&o6d`JIy5wc!j+nJ}m&vom6d%2``1^C@DHcL$a z_?>({fiP*XltUsZ&GwZD?R^=@b7aF15D!aVYgMZcTu=|&K!huj$sFA;?;P<4!aQETnt%aO@s zPYPE1aJ9=7Ch?_8hdK}mG9VTg%l}!WNg?d!V({=TC)dHyfajRd&4G9bkI+^%ZnwG+ zIEMR&pN>VcMlAon#WV7C{W`o}g?;VIyBkgw`BRSbr92~6{}1C%|I1f5RY$*rWOUd3 zE(u&|0ITwP0>lGIZcK_BOFQIY&;?HQ6@DRk&DD~+92rPKufy)U0@6YIGdEjL3Z>5> ze4^9xVHv_Oc%W~tHAA%q6YcMKSJzloFdh-&1r1V1JM1PdBlD4;ry$M$C{PDvE+F>q zS7^VLhV!A&v<2Bk*z4#!Dt1?Ol>(+8$H&`nPbSzy=>%mr7S^G2N=`bNv{#zqOb?LG z(Itg%7Q2N$ei)7IPhX#JDp39{wm?QT&rCWu+pDvN@^vGt&e`?efSMx|Zaq_WrA{Px z^&^4J9iqxkX-9qT#|`15B#X=(RAh$ehu(LSvg``Ex(Od0A&5*+Nl1$B4k=umo9_KY zXJDXRN>Xp2y9;Ktyt;|lERN*5FSe26L(UEclZy5)BE9h^kPf@Ib<}Zlw^R8Z897|0kUu)xA465?f@H3~?*3%(s?^Y`-SKz^8prKmn0)I)7 zfNIiP~BDJ((s|n7rYw<1cWjBQe=09sVUQUJO54 zJ`f<$i$>%J`b6%~Zi`Hcnep)TvnGWFP(Yad7~Zk0z`0Tt?sW-0crW5dwxBz`ID4T` z>Rh*#tOUqVN5}3Wu&pQ#QLBhuzN3fGPL|PyFx&O%-=Phbf zNQTznpzSjy_G4v?@lf}Pnu;+v%(5(mV&cym@sjX^O`CNs1G_b^u}mPT^+a_;)xu}`u6U+GCooGohM?2eh%I??n{ zs|L)ghx#+_@W3YXuID(&#OfoqH*S1-Z{?OvTm z7eZuyOgvjQ?E~d}7cAb|r2{Ig$jzzqrOmvIJ)dWFp><@$i!qeGP%-|I6Pf3@a)I7} z)d6Js*>Xo2$5R_qIg91*_E%UhRSurQvQMybz z|LC5QB>?NQFHgC;Io;1z$8>cOT|Uq2b5@hU(Y!ieSCL?L2_#4$emL(p4YJWd!nOsNxLwDp z)!e(e-t-<;S@L-3RcG~&l&+zyPFr~gBL{lH;1`qPB#9*%PfsS? zF$u84esKxXm`8LGjnQ9mU5*PqJoqFF_g7#3#ei6pX@c5`MDU5dbbbRp8QVA6sxpx& z_RDpEXuOwjN{URz&!3zvlsRwuA+hyw8;cz$2F0s`2JWN&6L7b7E0XHHmQt$UoJ49i zZM7g{GC?~JFCgvULA~x!<3+F23j@i92_>cnYbD0=qPF`hy2u?n3!lbE6nf(gD-yW zV-+p^6EDxmrA}_xc;Y3?buUrdjqOX8j3k=3RMS&bo6~7gQAnQO;0hBqbm;Y;AZWF` zo+(^Es*c63)NqHwQFlz+iaeFbAN$jpP~^k`l~X8FsAmkX1+|C-Lc^5YItAT_G~m|cn3Q8td`x>awJ^%%_P=b}1$z6n zfV1N%ccF}5`fznAO)&Pe7h!Po@fUKfgw7hkw)Ey^UlWn(L)f+N6oP{u)wF{)@17OD zXaX*W0Lah2(DHt$DRjWxqcsweWSWqyVTtP8ReHcR>f^HRNb`bkJTPo;yX*Ob#b*lh zIV;EUDNrb}kApP#*B)Rn9-WzB6+M()%cP@yE)bv|b9TwcI&bc+=18SNi9}+0u}K7I zCgCvPI+C;9y!)Z4cImxS*d#)qShTM7wN@5I2q0I}VM@wN zE@ZPta&^c@ay3G*$MIkfVC4CVWrnw!UjXRkXRVD=aP`Fb7Ri7DAh*x{2y-5#OCpEo zExu9evfXQH4VluATs_$An~W4I$9ab?zxNJnn)s^r^?{0Rd*-?;*LYs1@F!++oV zJj~+nk2v<{mD9S~JBcHoZG@NMp9FaADF6um`Z;{o@K6m20F=iYyPVDVapB?qR15~g zmH(EfIKBH_0szMLHh_DiDm>U2W`X%sYWQ}l2=8CLcrGKc^i_k(CVMeV(ipN{LZ}ho z3DE87=^0<|v!!os1&D_4Ew8PujT3;Zr-ib=I{19{h-&Y%GVcpdRS4ypo5E-NI=@PT zv`wreZyFmIsJ)1G0Q9!j>XSdwQvVAHRM+2}oF*?otyCAN`|sC={u4 zQ8;$d7r2h_U!_4n{3u&sN!3brdbxRJ91Z7WJ$=T>C`S1D&RL>A6C75EKl2$lze2zL zk}kqI{V#!!Oobmzkv!PyUy$Jl=5I&&5CQz6!E>ct`M)H`lh*X7YYsd*2;W$cRHdy_ zh4xdE73cJB6bh7VoV6-eLVu>!0NY|v!VMRzuzE#M=qs(Tl|lW`|OYIKW2N~gFU$QPbY=z-(H666ox9zy=wh= z++Nug$jHY|0*8W{w-s);oBTUVKDvXAL$tn-@Ydi zKNT|nWc@9s+b)zVqJ?eR?X~9mEq3e|P_L868oBv#_8T+%P)S|Jpc;l1Ja$&zF!45N{fo>SuJL`8EOd8Hu#SdYb<=tn(0Dfpy_4mB->;7u;e z;mWy9=>n$|9EM91eZ#V|KI_Qs{Uhma3B1J9%-ZlW$e<{ewXSh38NR`JsU}&VIumnZF7mN> zcb<@EP>B4QPzVTO-Tr>LbZ#DKK@pWi7BAojgKuU=aP)x?kqMXE&Pn8&x#H$7GJ);^ zzhJrYZf2ICyT|rHw=6mb7+tj=nJLA^`uB{A!^*z+^CQrP)4+m;iyUB>pu5o(6&WW| zIjw&jeNG3hTNiM=SsdOowmaDl$m z#axSvL*(X2@wZ4SJ$rnsJqDr32$T~kLq`F@aT^2wQ&bd0ZeB_#X*KC;;I^47^>EbQ z##zBW@R=6VCrWv^DBE~sucvNO#<69|zF8@GAJG=Lx-|mk9l;LvN!hJ-np2#tdDy7a=ys9Zc6jBb}miyRIyI+@MylA zOxS}_SF;w!H4f*uYrP(;w`e)2MMY%aGpuv}__<86s9 z0Fz#yl?mm_cTDxnjWS#4z#mcNb92ybkHCb1kVyscEC{>uo2!^MHtUxv=f}mEYO*_b zfm+>eqK+)LcQ~**?{U$cD_SKr_l(@au3EIch{kWAEEUW$snX#-*iyRAso31bz zkxdzyv2<~*>^)Z|x9@3`dl+wU*JnU9L{$p#zdrnIyJ4L_`G@dW`mGz8wSKaVgWB)j z2|oFf-nUieG&Bcn)e)5xVNaCH;#%j1W(;!*h}c5MYP`|}BPEgGZR>x2%Ex8Hz$nv( zRzal>De?X?cfX}#e2?qmqDEJ@?c6hrNFc;7_?|~A)|=fYno;I^gErYZ3)w(|+<|#? zcM?7`qXe?`oUUk_{ko7%S^biZs3|`O7_X(jsXRQPWFh+Dk7*~%jZ?WpSXr9U)W^d& z_&o;4tQaqkY2ywuQQ0|3FdKP%eV#84R+$(6Tc#b~@P~+2`?q-zSfS(O2V&1jy>@b0 zuQh1MM_K2L4hVM1z_uFF)KgaVpfjXY`)cSW{3_8X!Lg!BiH$e0#F&?P%{Uq5$?c0Y z(S7Aam2HD{r8?Ue?SlxCQ8dC?OMm;|-Mkn0&wAgG0|gwGk!%;^!;EfcE#<_ko&pFL zu#|@kVoD}v@jENu1x`vuj;{BUmRQz9%B;Pb<9s+I37qzV8wpY`Lr=Q1SsFWzZAl8_ zJ?r@dUm$nw(?+X7=cTs(u8G22u)D~_+(qDEwJABd)}fwvm*AGImf2u;y!TFvZR--G zQgnNMQf4FGzEB+#8M84JRqoKYWzhWXm+1^JP%x3Mw;;`cf_jgI7#Jw(89yKH;7^Qtc~czc_ky4vZ9X7o?{ee=A9 z{{B7Qidu_(x(sY8s;sR=0b56(TEevli@`iRx4k#!CPKD8-D{hW3tZ8w2e8GAE;$G+ z7CJt4cI!&*;X#nRl?7diuIxBi(cJ05Cn~i_4F=cmP28jI&&vgle!pnE1gqQR1Ofe_ zljy3G+`KxWpCCI;3caf&T+x*9uv3Q*JrKL%v@CKwAphUsWqh7#PY3wvwVZ+A}YYMuV8J1nljtrwY?+oAmS%1EKGb=eLQdtrFKW+Ro#`C@U58bfj;W_>MyP( zPgN2CORqKlsv)!LDSF8CVNS-(R@FT~x z>iphk;qvelzXhW8U&{aT5aY{G{wF^E=Rw|KS3<3=xfK6`wcN_^>vl?cKHO|oZ*@C} zHA{oE^}xK2;2(0!Iwi5grY@X2em`jUo)Ua8`PetkBT6aCVDos@O#0T}!b0%kuI;c} zp|ZN1eq1%aQc;PKPU!UTJfnPW&{X;y!({6pe6loqrvRzl_*c2B{PO}|1~3wPdFd;^ zJSq3A6tiN9bJCC+6U$(&-2^eHpDjW<;mK%@1*r8?n`DWt=Bm+TuR66V`b%XV>f={H zH`##JajR9fkfRwcHiI_7f9tt!1LOTuAjpq?&y0XdDygq|(^9B7 zAxT^PV0ZcMGXVUP3Jfk&DC#?Hl}3x`nrErpLcK7#NuDu~I9-?7wK1R0g6pGXMa4Ql zzN=2&hy%7~;g#hcDJea>!L&4?aNfC0N^Bywrd@*WH7hZ?lB33wj$E*bMkNrp7JVAl z{=TbAKtZDBgl#Jpy^$Q-y4{*s81x{GlLu>nukg!)I|lZq3HxkzdiV8h#Hufz<<51)kKVx!hmYRVCYz?KtK%3WgP_HF#X!WA1)3hJ(A`Y}Wlndd zocoL{7T0@PU1)N0*YFW@Tsd3Y9L6q8f#!lRn{pqu>!W%mmBKG`=eX2s7rM+AXz}k2d3~52Mea}}l1q5^e}EE+;)YU-fd4l0 zv&{wUhvk{4kF*;fZjVkLGo^p(4y7BFrBH{h6KNe7GP}pIFo5dndihz2YYxMB7o*yn*cZHwt?(Ab+Wj+^_Wt&7Qjk1a6}+_PS^J~d@=oK4k@R` zs4UrMmCPr$1e=sOiz363qQ}%bAi4h&?~GOVMjeP1dSzEq(%XCL=OB0zZE+DuWl})c zUk43!C(ReN&fxK81qH-7f!w_pXD$qOYd@fsMtY7n*emvTV`U#H`HY*nMCDFc!e)yF z7QmS77uj*LrwJuP*rzTqt2d6+eq17z5o-RQVFFGfYo&F{b@4hra68L@zLxuum3*f? z-p%t+x%AlK2+uo#kepvhS{pT#iw#xryriDhW^t{lmlIddOeX4dgM*fSMn6K`fx_F^ z!K7JJ8i#WjB;j-8OgEpBuf1I7AO*Ofp)*<1_5*SDp&|E@R%YXTQaT2lT$HAQ6#0(Nfd0fLNc`Rz=PaX95QkWJJ)`=M@cZ>oKJ zQVr_twx<3yPeDOzLik>WvdXpL{bB(Ckc41q*t$$X?V1u)%IRE}zQOi}(JrEP^}@ zslPVx)sqFawtmdX$q78zo>Hs%5>x_wN|SyH>(tWp4v;Ff(kOOt<8Y6Dn3Nk$l-^Z;dH@p;N+C{`aP)D!Pc0vvhoov4fw4Y>@SofFlkcXg)F_;AFSVp zA53~4Ove9q%x>~5ZU3+}a%TITVAyNZJfjKo`WGl4tYywzFTLv`EjHuDwWFFV+X zgy7IOg8}=m`b-s?#n{VvSQnb9ap?TcR*aa(I0OGmbKOiQ>~Pbw)(E&cp>OWHWBFmY zJB`uWH3$9b!Ty)s-HjdE(K2H1slLvxX!J>E_kF{Gf!^Xi>)NVJ@9N~}=x75&!wG=Y zS?vD!(Mxy9&d%;C(`7vy$M-<{2*Cy~7EN*UgpYjm4EAZB9z1Yv3a}@^5Q9N2hMAuL z;yzl&2)Ydo=vJ;32PKJHH#4WC63!2ohDb+7MsD{3SKjY!;|>Fl_@E+q zCCBIZobrs20I4b+W1;{SN+BN5zLbneF?fX=>p1k}8G-&Z5=n0w8F|bJ-DG!q95anP z)U$umET1Rr|8Km*=YjoSiU@?9cJXOZ)EdHZ^siY1&hFYN`+zx%Nf+GH`2V6L_-9vs zsW`@2Fug;nP;E=gAuplF4E+OSg@-@y(g%22>(WPI*vwXU$RXa_vJ3^>1e6J`d`*5Y zu~~5|Df<(CPD2$%GxV6Kd?=e@B7K&`N-jL_{oISpc3Q0}7{eJQcO3}0 zIhq28J^#r*WU!m3e*2S~02YxiW913Bf5b#=nOqk)6zmUr>i5ZBBASl@C+0G`aoNjb zVB6q^TJkDbODp++qc5GpSrarKAAdh1qSDeFqx5kwNgt2GQtLn(VBCMA1SE(Pd&{K) z>zf1yz!KF3=>SPFtA{TD+KY%YpgBHM(L1jQ`Iv%DOsd}ZHfss)W@=z( zTog4d_4+=RT2Z*mP-c4EX)ADo{^IR>37x}!<|$3x-5}63l+K)0QddH@Tat1h+>A7+ zyNAS8-a4XLkdjSkL*KEZjYjzGV+6P4QYh^#|7i;e8wj={b*HQ@AochEGgN`h3cReu z7wzp-ni;AfVuW~hlVl2<`jKt<(lY^XVt`sr7Y(}{gH|UYykvI=j;1=dC(+wMaSYUU zpfph%7+|Y@QqQzhs(=~EI&@LdunCchX_te+Z92AlZw^hS0*5lATc+? zN#n_n;{~AnYo5kKLx*>aYSlBF$od<#YkAJj^9I3>l+D(8* zfloe>_ndxLtMNyUf9xS<7O!*quQ`x0NsF?1?&h{_hOKiVsR(txXh8>JtwPBq`MglS z%X#r}4l8?>jKG{i{~%eNT}1av-qrK~Vls0(Cq3;#o0p>^#GK&|Wd#=xnPa4zOT<`0cmqG zTn(@5x|2al43dV%X^}Q!HyJ=#A%$2CED~Mmu(?1RGW6SVqMbudbS~GKH!5TSG=P2S z;zVY(4LNPhRI|>%_)Mfe=c{=DmuO+SN#TNh1^S*%bo8`k9)X)?muSm1FDX` z)qph>e2*H|PBJ{X??k)a`h(LUi`xQ*k4&K`Sw{~Ksi+m2?{M<9FUV=Oa21gcbC%D` z3+bi_7ipB`xXVpVO_ubSO_ebiSsdE#9PL>~@5+L&T3u3C-PLqWa4NI_H~!|1x{QYR zs&o-sqdPIGBg?i9U%YFK9R4oY3Y^$cUgLUCw*x=Bmsho)!14F-_-5+$(D=o-_t z0yDF$1mpCkQsZDDnMD2u*=w zR^x8I@m=sSP4RnwT5Ks$%ENe(Q@XamPVGLk>jUhymykX*Zf+yXGErn7g((edh2duw zf$l1;SwBTu7NH9>KO7XFL25p_UgWTDY3Osa6GxzLP!0CpB-@$BDDKbjgT3Eg1)zCb zEN_-t)Rl!>)yhJi{3&N+r5xpCWXR(|XLHlgz3|ybuH-^|+UUHYDw$w$|2*1NuL3c( z;4J~1N8?tc78>PZltskb85`>(=MgGoW^TVpM^V91O6E`%yZ~Q;&I}&g_N{xidugyN z#HW`)hRAJdhJP8|^B90_&_Wgw=Y$P5OL^0AaQ(KXa^-7LSqcDS=%{xc$w%1ksLnYSAm+-Gktv;jjc=7g%wT zgc{PezyTap4#XVH;|Nc0MrG1Ry}hBo+pn9rxSHP))?*BiG}wH$okW(UKRL54-BOoY zU*KB;Gj-E?%0}i;1bz*O7$4KrN^tQq+_}iM{8ntBXmc+xvU0FC?8k z**f6TyTC-421^IqwmuG&^I>l9W`4AsG{&`e7RX}3DN)IcK;4TI8)vvih);KDnXoE{ zD*s8dd{=j_tnI1vvohRS`P?8ERZ<=;x0jV_z1fD#l@k$>gB8#whdK?JGAeH$oaVasy=c@s2!zGK6xvwolPMTr3vU~;)j)Y2*tS)x784y^rdcJ)#y>TwNsg*^ z!T7%-ga@0$D*c0)|mM3B9+UOjgDBpPBp(#y%n3f8*YvY|j@*s)gB^x6_!@pf6&&fkZejqQj zQ6ajk?|bgw<8S0Hy0y-{CtgYqkTle=ZQrc4m60XXl%U@Co1Io+ns6$Wki)y;dKeQH zNm3;5w1ZoDa$GGWcy*th0=>AMAPe>nhX`z~a z98YBEjsRjal=4HDc>~vT8_7C2$VrvEK@ovBJQoHt+Q@R^mcdE~k4y=t4X38xoq<{E zos@HzLN0a|2h*(E8Zu(Ky`7|W2`%1k&exnhphS{n_iJ?QfLy(T4yL;#!n)l#+d*6P2 z{&;@xdVkNm-m_SXbIzQz&$aiy_TE?R&ov=KL0hbcl5C_+i0)h&@E*W2M~(m)AnOKB zZ(n~PJu2YJEhrVBeN)MZg_aW_kL-^Wp7Cj zVl`(Z;*0Z~@hOs!xWlnU#m90iCsl>8L*3U9VzjC<#brg)Vd`CMwkB0k7l*Mf{crRd z+Bf6>eKlO4jZw;Q#znMfe!J~UBxe=j>g1J%yj63+cW$ej04)W42-iF+iz{Q!j#}!( z6%=+Sx7q=>W&JX8eYE3vyD=cVLw$E4%q{&c+CY%W0Yu=W6+yfG#_{s}K%@Lyf?Z|5V5`Y310#gd7@1A3-}2y59*cz~u1~K2hIWBQLT~?nGgzr}sLKM) zLv;9b>(XUth)JvNa!rf6tLurXs&VV(i5BN75mD%Jf~h3nH>I-uC%y~~Er|8t%fo^|iE-J8oe)QX9$TxBhO2V$!&6Ll)!t0XV#l76d#mzA{p<8fp zTc$_V+;;wV`maw1LaXYZDk&@P&H9o8_;qIwFhKwQ?12aZyfvu(ofc9pT(|YH68g)d zpv&@6#(%$8uY2YB!#Fvb585NW+#vvR>Tb1l^H?q@&dpqtJ|BtJnaO$kprH9 z9f6C~{mdENnEEt_hWWIor5oxK0=w_Ry(yKcWi@a@$tGGELw_x1FA8_h+-Z3Dsx z`AJXPm1_ar)|K@XwdMZl>2KuBznSsEa9)Bf%QIb)UMJmtT%kUbl9@?ccUn~!i;jV_ z5OlE;6iNwfplcA?{LP0!f(wMGO(-iUC?q(}`2lc!=Yt2oTPC)ffGC@pyu6$IIK*7R zpo@9X)bCpBOab{-L%MCD+?WAn*qw3ZUz*Tjg@GpGJ?jUZ_ZyV`TSK&<62M{o+clbp z`cJ^se{TKn2EzT#TjLm{XLZI#<-1!42YOH_ML@t^<7!&@^4i)0?yi67s;7_u=t8Vl zERPjgD@4vuUzk%|4ZAfh%g%mT&I$SPkrBLqXhE9^yV}aecFKGSx9T|0RUfuF-gO2% z|DAyE*fHog+1dkR$5`Xv_x?YrvcEn4Kj7Iz*<{A(&I4|pE7gr2e5F7J=%4KCC~;PC zZt60Ho!5-=LNEGBoik&QA)fn6d9F3S2KWM~&ELqnipK=K>|U!yov9bvH?tfaWyOnw zWmb(mxb%puJSKR}hyync_6bJKIi`wr_do38r(N7D@XnCtyIz_sA3c?qIaNiZO%LIG z#H<#g;$3Ye&B^5bm~!=l;NAPf$c56!Q)zlS?-z;}%-hA|@7!}~E+}>n4i#G^c&hX{^L#6<+GkF8!$HP2=jaTtDUV3cfU$+>aY?xTr5R#?g%lJ)ni z_2M%2FYnh&0H(S`qVVfAo3x0v+l)6W4#$V zMqqsM^NiQfvq;kjO7YO&|5DZUXM`%VZi+bXb@sFuEK zu)Ee*%Ffw5!a#`v6)~+BkW1-YUQ?r3=3?WKe&j*xEZ=1tz?f^PMwFaV5m4JO<|X-1 z)EU{CD$bEEX2{ceAX^{@hT0|jcGhZl4;pY^2(xu{brm0IZob!c{-h!5V@vmjr(YZ) z7Se8)CQrCUHOMV!ocYS#ArknZ)ZOBsiM#oS@j-jg?5_qeS zQ8|@g>0?+iyEm5tgB*F&66bM-e5XS%$1Nm!jV<+cI{0m$UEdL9=Y;&l@lR>EHlcJ+ zMe*AbcwW2k<7sB5uue)2f2Sp{i=c4llCg6Ocdhle5P7`%Ny}xVsb~Q=P~O;x8fErT zOqZC31(MX)Uw@`7{|BzB~O#(>_t)TiaMh>52UlhBMLG6;9*!~^*1wbHeoy8aYcsp+gA8ZUm z&QEqeA0NFmqkbzPb!UmN_33kgDN&w;CD;RNBAgA~7rPA1Bo<^3aX#f`@*d?{I9ENv zqSz6PtL4u*03h==v(LO2%$v& z7^~Hx40Ew~(W{;VN-(fg@Q#90eywQtL=#i=wxArH7B!Dtrd;Ot^&M&>f!duWevK_fK|A3O0h90EAK$@ z$HcfswxmMSSh+!-C8=n_i79{M+O;0rnTIvVfDJ+6x#7hA$_;*xXPD1ImyRFAvs*X@ zR5~{hj58>!Ol?DQm8!nKM|(tPI&NNiVf95(lsPky7@kQMNCFMao5GtvE=7?k7FZ|8 z;@!BBMAXp{ad%l+g=rY`rd?TI_Mh~Ehp#wbERv|mmi@K%3YUW96RjM1V&eCO)xI?w zZG*n&Kngzw#+)D#hE4+7eEyyuL2}zb7_6_-J_06=RpNZVZSY*M0WYn&QsYhVvr#no zF>8op+)-uzh_o*mQRwZ}_B{q4&cjF4Bw*OP>P%0$iu(PDF}5fgi;OxZOr-|KK@N=U zy@yMd=@%Z3m9dQ*cNq`_DugV;k2BsW+YcVSx*@JcB=|7hK*fQUAzmLMAS@)=Fv0$7xLUlCTb;bQEE@sS?;VOsNJUiGxudhtU}O|$7&JgO})w(~D# zBxxKZX?(oRy-7|crt@gMN;t(qg_bWwWiw*U$OTK-+pI1aW?K@Mk^bj{)SrC2U%ccJ zNv^pjctH7NUJrL&fBii(*mie+>PD|sM0*2YKb-5ds$WB&In)#@9aRJxZF{9muz0>v z`~y9M;Vm6LX4zq|`NwCI-=|KPL|mLd*_MTUQlyc_VdElD8&+l?6%;ZLPVzJ+I;6gx z^*jw@S1NaM>Z9~P-3uAF3@M>3Pe-u-dDa-PO7`PwmRERsvkWjc5Cw@Fz zSZsL(QIgwi&;SS#9sSFJtV2aXy(@*>+XFJ~nug@yF$IYJ$?b|ZSV-NNRuP*#x zi%*@H68fW&`ksE92X?v>lvZMz2UtS0g`wxN)(C!HG!?b6ra7HYM*GwQ!^2D^E_+?9 zZF+G}dF{>KWsVC+^tHa`2}1N9b&AW_vQG)N&NXUlr-o7AnvaWKeO@xyWTfu2*R=<1 zXbA;WVZM#e9zfn0!hWh)8rfTdUK22CMd+tOBiG zrZI|#mWBz=@=rN;Oe>`F&Q?wHBPwi`omP_K*GK0s(<3dKIqQx|KqtL7-DU|kXD?3A zk0~d!wp^F_ENh(-WZj*q6VFmX{;3-)0B$uOpcpP6|Dd+tg&`ahS2yP#(VMG9JGQXw zZruCaf(tRq5w-*Ne*Zb(pfrR>!4?v)SRF!jeSze04`KOccKm-nmWrDKRtJ07qWnVJ z?L)^_S^q3XoK)?W0Oe${N(-KQf5G58u|G=a^ZhwN{c#t#TmwG;UkV#Dxa0a~389qc zY``b}Tv0+x3DHUaYq8^BJaPZaqp9Z2^}he5gua)$Gk-EnD5Y^M%Qo46DWSOQF+eVO z7F+A+dZyxM&{-o$&&kOt8(1s<^H~ANRSojCH>m->yEJ1)Yb30{aGv07XbCC zrdfj~Q6EU_PO|Gvw*RE%#N$diC_X=*!H|52wV2B!)Q1l|k5+xQ+u?e?rnT&^bw&<= zu0)lird-O(S^tv|N@QbOy|2Z}!SH2FzB^PeyCb;xZuRMA721`Hmpi}akjSt*ZglSR z9~DT&rA8;MOhUL{umIpO7cEzx#mLCcUdw7>)+nzBLa;khf&|)U8+}1DS%1D8gmd*S zz?3w9k0v|X(9%|503MCB2sBd!@ihS0diqzmF8CgRDsKbObIh?Zb8$MGTQ*~PVE`q) z+?;M2t>{PG`=d6-Y(Lu-srEX^zdNz69@sUhFkyo@@FE7FTyQt_V1KYepKl<*2z~D+ zUAAiYc3UZ2k&;@;wY3*Kj1D<&f0QlmT=!S+_KK1&q5$RJ0&o9M-n32s>yazFLuuuW zKT1GSm@g|4Jp1FWcxdXu|I_^ZC%ylV55NCPuD!Y4wX2R#H8*0CUCMlm&+JB;l_HSv z3^s}IH2bikG-N-X6;5@FkT^d1g?k``Q5X!3)2oa>KV@UTr4F9vQ1oBmt)w;ZdA$0? z(vG9-eazJU>uv_EGXY^RrOez8!)a9!W$9YwbXGfi%~O5``#>w!C*!Lozwvz^xb^AJ z*$GLJ+iq*=v$@m$PBVLc$56&p2-KqRlwXQrvLcJ_0r!}5nk90gqBrHspc>L5sIKnK zWa>B!{S|br2#B5e@Sr8(`7lX3pHq0=CYi*RmY@0z9qMiHT>ZrjoAYB{XX)QsEESj8 z;pdE-8dSK-5XPo2rn%AdB1HJJp3Y*GB9C+&H8=Z95pDMmibq}y`&3;&O#pX&v-_Q# zMI_mYxtiL#MVO?M7=>P*a#cV@xt#Z{Lyt>&zxj)MBipVIZZ~JWOyX(Umh)xkVXi9;yeb8Yj3ey-lbBs#oeqCGTRXVV$=5WBGR9!wV z6p|EpN3@%%h|kGNKR34Oan;E8gDL8-JZx?I5cFK+NF@(l(>-UNaWM|gFq5^fhB;yd zAjvG3IDd-iPGbBt-&Q*VvGf>mIGgR^7rF9*nZqS3#@Bo@A6XZ7Ifhu{;n|jP6?bEM zCLA{NY+SZ8z659@OtfqrSn4#-A(aq#d0U>Bds4Uj38?DgO?hWE0CtRWmI! zhDP9x@W0M-o_=#g|F|0*Bz zp2qzX6ux{sCcR#MPnvXz@*PhgLny!9hePLQ#5b`X8ki0|?`H?=MtxCXZ6gt(eVA?g z!$OBXz}p(fPN2nAmlq>&@l%1YwOO#MG68nFOz-5#t3zQ>gxBfgZ1>2JM#hhr4}@oZ zwiM9z`rkyNQpNMST*5_GHhH>rcF_RJl4=FX(_nUHoPY#L<;d&NToQx*w{_eN z7J15rY=X{|0?%f-29MwF9y3)EYG+X3MBENsxCokF4vZ|Gxe_8s+_(aKl7BBcspf$1guf54HDEdg(43acz@BpVC7^#6s^xwh!}-BX2`6#BGcbvY861X6eDoB#-?k4Y$#Wp}p1(c!MV=2s^*_W>Bo(kd^7_wp zg44LRUc($0IdJkyP?t_z&%6kBy~9qtuZ?5J$LN9d0mstkz1YVYos!@nAgf}~w!bW2 z(|1qufx=x)wk%mNb7FnzVRPFQnUU2`)M<;d?m7)JQ+lY~M&RH2Pez z#@H+pf_d#xyX2rcjm&S-8Z`XZ6r-ONfyI%01F-*OV5_)f$Y<8?65_l}tVj-$s}^~b zSJQtJ?H&op^-FgeUXs;E6~6W{KA{r%v}SIfL=%If&kETC7Rf^q_TM8m8s2`u3vcJ# z`*_arQCIjn4MSu;Kg#>Qq@aA#taS@ zKZTiP&BNy&77Y%ZOp+-vKE#T{=IH6Qsu>*R(tJhfAyEN&6P#Ko=P4IA!!tQ~1f_d$ zTgc971LvOhhwZ`UoNpT0=9s=_IykRi;bj$6Ym9QCM|N-szMizpkBY4rYS&^wYK-`lQ+XJ7+h%zu6W)Z7K02Uc}*?p1!nD>l%%PP^X+N@97M6B;I z9m_iv6$i&86+LTk(G9yrC;Ue1xt+UOy@M?aLiC81VUu?jO65u3!bTy-O+69kEh+T4 zbC!ilL~3FmyII&2)Q0m|*~F8SWXUT+X)>{|XM`);SC?n-$ZEUkS_9Ux6JoJfl@!u? zJ9o}gY&2Nr;kS1iiv~)H`zwjwk4`wU-1l=fDGKY%8UK{}qqCD+(2w#qn&3xIwUSbc z^(S?*_s9>(B7x}x%tJ4eOeSb<|G8nTo37~L(vYmFf(>S9G5bdvnXVi{bQPYC1=mkL zkv~i_W|fw$>;mGs)f(CEEKn=81cXQpDa0n~R$R2#>U{6&Vw>?!xk4^%C~CwZhUu%8avj@Uc1|Ey*CBHGeN4aqz7W*(ZYFtOl>%Pt)4f&}gK ztv#|Ay>2pn`7$5p?3&j3IEK+y*Ukufm4}Pt>6X^g;_%c=%~5)J{w{QC{2UE*&=W9~ z4qjJtjUdp3#v)2CS$76&cytf8SPmMDHREyb`A-SK_sgocMYR^!QSM?Jp6qpdYXKiQ z`F%Z(ye>QG-61h`C(9lulUqAOPx5yLmruA|5SKrco!#Ow8Yh~G(P~=;dg#MJsBt|| znT!7YSq$S77`Mpf{-fIIaI*9Fj{1z3>zCR_CVo9Fn@NX_TW{%VyN9)o)a{`Hug!)H zmTUbdJM#A$hA*)f6J4Sgyhu}agMjZ`?#VixpISa}-7Gss;cnfs-^)C?*?s2@i|U8U zpqdukIxU^rZ90lD%bh*kmI_PlIM>TNfc7nwd!kzla*v!%Qa)OiE!nFw$GulO1iisf zeL{Vf-r!a2P_`2c18h8-pTNa0+_+yaUyik&>G@$W`_PO? zCzp69(i1o>uBBAJIJqCzKfQEXMKV{QC36oKE!p+3$gX;46+2GgoHfi+Sj>ILMws)# z(R%`1zKQl_2j=aQqr{yCN#^ao1@=A5o9ujt9eigqP+%5kO2#eQJ)WGNU&l@-BqGs= zls2ckoxix8-Ok^xH)-{p1j#~VVK9PQgpZGOW$IWZH*8LkGU1K~r-|@$of(Rwhkl92 zqM9yF;j;zepQ}igrqgv^MXRj(pY0};aidPMt9N%LtIyiCcE;A83mlFpAGu#{O~a4V zhor2F<|k2jNG*%6@?4GB>9RH_omvW5BufsLUxT`TK%<7}5BCz2PaML&1SBji7ELcJ zoV;Y#VDPID5I=f9kpjvJI;&rYaNg&AuhzaY|xB$qtQ~%`7uM z*7=OFsioRcR(DRv92CfU(npzp0rs<6*Cv7HgskLsA+c%d-_nr;z-nIh~ks(42as}iZ%PMUNr zN6+5NGsEiL;b{uTa{sA>P7}N(BGf%eDV#goCth_zoBjb40Ebley9Ubx?5F&b{cZ`Q zsvFJ-IlBWEqf!uH5R2U?x0-G6&Ser*pI4uzd#iPMWx8s|81Cz1!Y2?CP5~v=*4k%I z##%;-Q_TxxFe0%o59%V1MiXnU=GW;{O_=+s&8V_9)TDiuopH=mo{&^wlrFW45<1Oz*L8|`S=Pr$UA{!Ba)TH* zJ9O_Y#V#N3r#nnFlb(m!QlIyO;+IJ;X8972e#i*y5pF3=f~$3&0}DA)C|QxA@bTw+ zLFRVPIZJa*0@7ACKvIz7=Qwr;EH%Z0H^I_h%$Owg41xR8QeUCkRHLS=61T&sFI|R=Q8(1I*RI&2}G+&DK(_vpag0 zZUpG@K+FCq3y@=S+5R#-J0vxmky00_gPWEnq)VpGud|-_>y=i1VcdC}Q1#mjCoje- z25#PB7YP7KWZ5Ntxy}s;GS%|%m;AS9(UcgUmqzLgo}k1FS_kMa0I+P z>ti=BH|k(Ny*e)e&>Dw)u2S6=9AI}77}!f?xqStmch;VNhJ}GkvM>)IJK!tQ{A!o| z?=OJ9t(>ntophgpN6A>)5&lI{C3YOhJt3YqpCquhe7*$;SJS%ZCw$ZwRl9#pnfl+? zuY3}f^J8NdhJbncg42G}))!a;fAcn-B*&?$RmUGS{taDtx?fUcKjpcX;6Cn7sg!f(AuP-W3$-Vg%3()uUHy@4p6QHE8 zd3k{tB#s`22~Iw~q;8JCxwgjc|LZ3L_)D^GUvho2YWV9v^TJ8%-$U%G@k;})aPmi1 z@BjL4XsLHR;OqM5@}HBT-`@J?=3gG6Up4-9`@d)Wzxw?r0sr?MSpN@^>revsBQ}ST zq|vE^+X5KB*!E3KxGpNIlX~M8hhp{D5cW;ZGiam_Hi%JoAvM#s9Qogz6q(!NbWQGr zFwq9|3`RcJ%9xtoxLht@HWf*5)d3yeCsXlP>Uq=0d zpn6}g$2*SvAw3xHT8Pg_Wh{;fPvsuSlJb7{dth37!eiv9Wm;Wpl9ZSdb}hc*P64i! z1{%J|O8XLR9`9p3{}#VDA9z{y^vOll5k4al;EyMcagN}lz%Nd14V1cXFyD2vy0tVu zuWWdiU-smafQ;$&&tZo7_xmzlaHxJA>XG2NaC_ur+TbSxL9%*@w&XpT_=}VJCVvX4 zf3wvl&Y&ulVY@Ohjy$)_p+i`CBVt2~m9uSNZo?LjB19%cBKKILxq|JjZ?>uqWaZAH z9B!e8hR!&+%D5xD%uDys+Rpe-iHgw)3|4Oj$j3ys+W1DBd0#9L!Q0q6TZ+~# zGg&!a+IT(X-FK@xIk2aAOQI$2YGtoGm%`elmn70Sr8KuC>sLnhY_K-!WK`Sd&V#=i z^QXu8pN7TI^J@^pjfb%V?$oQGxqj12Ca8DCj%H<{d1_3ou}n$G#=5py9u}OXGI3=| zs-n5mrtW9_-Kg7=N4q0uS0=Fnfy-5&vIrLdL3=F{T1Y8sAYLykf}Dasz8Eggo<6qH z8X%{Ex^Z#6U#P~`L2sy-F!|d_52{ZX7Y1#N%kF}l`5DB-#u~3NY6t)^9lymF?xc}! z=SNbtIym%1N`y!lB3GXn=0U>D@zan9yI}EjBMX_3Zrh&tM77bI?~Q%fZi;P6KhU4& zRvnY?VoztYJqS>!Z1>tN6R`J2)-pU5#U8*H9UYzk{0E;Wgdfp_BG|(=m~-vrDHFx} z+1~18fkZ{eCA7?+a{FMd5u~tk$_NaLzYL=qj3bXnCR-*K6K&J54us6Mj_OBJn~gq~$8-V5i*8 zEs_Ie>(67w1-0Xl*&29~rg?*k>KOdGdjokR1!)ZvDqHR6{c*{RvARZ;*VjJCWUsvh zC$UdS8mfO@QVjHKZz@|l8D5sx{+KYx&GC;1f#gyRwQTTCQfi^9Elqidvp>Qxi~TiI zJQ>Kr8Vg#?VTeprcVF#O8Lm8ag;#M5>tqF(DU<3(S*)yqEv-@zDJ%0X;&OTrA%KfG z#FK`8Oxdo_CA0JmOBw#P?+^ zc7B`aur|z+-Rm}NdjmJMKb7nPNUggIZylH3Bv|HpS-pCgN0LEv*E)mw_34FSn}}&= zzykM$24@r5r?kU8Gxs|Z^9y?|NJ6O>36dH-cGk6md@de`K3v}$2zNy>TAv27^+r*} z2y}{P*%GT#x~$&VIC$mw{N-ENCVXw?VaRlQ2#7eH2P7dd{f3j`j@=K=GAYRi`?gQD zUtX{y_DQLfXj#ME1M}WE7J!QG_mpeL-fT|b{h?yVTydsNB=`t_8Cy!3LfB(<{fbe-hm8ZxQe=jz1nK-^zLYNKT zOG*t?4Ne?6ZQAS)LF3}#_aAsU-GYev1))MT89|B(hGb&>FiE^1MHnf6doKn54ry#SzxK=W#%{(==YS;LLD?~gzG`-E&l?}Ue~yDvTVqhXK=Vzo;3KVG~iV=%lf zAWt+WCrgogYO^qZEusPQ*pp)a2N5Asqe!!fO^T_x&4B3kDqHHxEIjl17;EnV)DHJs zG+%uYb=Z%r=TyEf$i(dLiyfifJ0z8X_24cFtF{@hQy1!gA`Vig9VgemNTC!&M+oc*A}#Q=pW{NGz|2rBF1) z`pfsc6b1&2iTx=i?0Mo<*TCaudmQ49d%AveBhQZWnDAxdldD*sId!dVG$)D*tB=Hb zq=Xr&wi_rnzI~KNg*_016I`pfeIE|t&pjO%|AF4l=0*H;W!9)st0&Pwbe6-MV_GyHUIn?4k5hg_dcr{MZ9#Jyh_}^vOeLdLos~*u1Iq5v8%+53U|Cjxd2s*lpn8%)Ze6%EebdYC_)ER^GaI8%z4AVrM+RfzF#5qyB@V&jc{z5vK2)uL5HBUOMEj85wi*3{(MK^%Owmto^7(b_OoG3UVvZ`btZ0C}^jO7n zb}7MLUQ$~d&r4#=GX?>RGYiB#dssW!(JIj&TyM6T zwx!6$q1+t`jmo1EOSe9!cy)eM=eA}jtF#D~;t*^JyMrUuH=0ORK6Fs(he+|DVRQ+z zvJEYgR4sh_m9-04Yx_O-7d<430}{?+?2J0!#<+$iHSkR+&FJnW(z+1MTcrtSVgx^1x>XELnN}Z7xY#y)0r3j zWnZYq11weO3TP^HVYm0iK?qt_ME2JGLb^|HzADu~gg%wf-85KAn%#-yAoKah`!iIW z8^74fEC4uJNCHvFz40c{w#y&xwf|Y==M2?!f!@Q*#r-N@;To@q{UtFM&rv~gcLK%4v5 z&9k=UElBx=6gtgS=ErM6%h;WRhrv?0(;X=+5h@Oh7Tv2Q<<^s*`uhrf)e2tiIHz0A z?O{F}>yrp24>OEH%aBS;k~2-_fYzLg0nTB$>VPnO9y8V7EQ~WC)uP1JcZbI{%<_hUSB1A7NQh?OMO%2&4+hvI*jit1P% zz(p+$)*e$zAxv z_6SNzRST+I?ED2@7p)5O&uXTO;x-SU5}7y&-N;ovDr(uql|3N0_`ylf*Q4OdHVGQuXN{<2m}sGgurKM_6;yVouJKV{5H_P|@as zg=ugp1n4On-MRFh$i5m*n7EAvPZ51?PQsCPt;5`sE*l#`Kd79yO)bV$dFXg)kaqHH zEVheXL9AjUQrsUNj@6cnI4+B@^pi7NJ;_PkT0knMQL{OjaDn0&^bwvE+%E^hCgEp8 zsAaVxn9^9k)7o|5X|26e69YIbywU<(mO7v+q1MGd96FApnXmsKQB=IImKnpOZKR^i zCKL6F$nZ&90>x-FN=4n3o|>wA;mq5cA-^~;QGMjHo_RGg>gZV_tvFeoe*G0@jfc7T z6<+?;8A2;FT+kkl3fS47I_%gP@3Y=;=?cY+_K#8scCp1RDq zewR-Rs*NsyL%9JQLX1P(G({==^po8)*lC;^9XwnQ5yHtPU&nDScesiPw3=%l6;Yi!bH3Ti53 z5ofdXmMXZ-WK6!6Bf<*N7Xyn=kTgYLJL!HqP0RC7_hqx+G+V-ONRQExXiBXZ>+CxI zXrQE?OHT`@Z-R#_DJjQt%2p4xr@agvSwB!+mvWdEt3357DeC{Sj5A>Z10^qrn} z{tO>wSfC<n~`WqlrgVhj6v%t_BEM#HRE|&d>44O;AFk%``$qmkha4 zeWJb|Hki#T&Sz_i%?+BC7@qyUKa@9E9tm$!Ka{1RYAS}<;3vnZDYKS*3x&8Juqh40 z)N(0uNBvbdR=PHM1-{k71UOCe5A}{lT$ePfgO3*%DkKaG3&Y_hsm=#y?Fo4gyV)TZ zI`ZStjZR6JB?A@G*~n&?P8`cSwd7FlkU}M)E_ktY^Ul-E=?p_-TKe1oG7rJe;%cV3 z;|d`sy9VH6-#j%Jn&b7XZICIL=Kva5_{obG){W@a6f0?zP zE7T;H0t{X(UNW%J&UK@}>#q)OZd!1r%NU5r1GnuTi^SAmvf>$BeKGkkhV=3lfqE!e$yVyK`n03y%TGM!N_$*Nre&RXM+zhcOWZXlx&(z*M zC+JQu=nFyjJ?#fq43&p^OSVmxG19_&l*CN!I5?Xem|jAx=S|%_P-ad}+_|L^JS2|v zlvh1k3e2ci{{cuR_YDllQ4j3S7hF9fq?NNtJS`jsZxX?ms3Bam0Z@|j8`ngLCLiaeps6J|?^yx}I9uw$G2 zJY`X}&^JEgZ%b4p>blr66)MsdnIVEYgOhpTe+6DO=wGPGPRvJ+UyZ z%Cse0LSekMDj{n6k^n!{OF8i~^Wf>OM$4=2JGkjK+j5odT@2k)1}3%J9tV>yo0Q0P zz+=3)Ar+sOF2|TAHx)LSsEr;)N$X&nYHlY`WFtAM%$#1r6_r`Qrb?qH^eQP_LYX_) zMgbPbn64?)4j!D~(Jwf)!Wlkc72u284XGXA34@Pj#vNI+mFS)$-8?46BfGowYQHh3 zOgcD9)s4lXSGmO%u?5^2tn7!b$W?a7x3*e67lM|A4@a`P7_bJ!%8bQN)vBenXd-(3 z7OZO6R81E4Gi{9VU*0=vrOHFVVP9kc?9eLuh(Jgogv`(YzkldJkgg57g;?r*k5gM2 zJ;iCrYI}OfA-?RnKTK_7yK5vODcYw%YoM=971l3FYxadru~K1;E5asB0eM_BW&0>r zmCJ!V%!YFd9kQWD%&R7|=Z&8EP?;6PAJW#8N6ceCbMncdc53s|$rhZMuxz61v^X(N zI}oUU*^Hg8>%fC$*v~cG3eQuM0G82s;*N?%$|pYMsw^d&CRp?7HgmaZKC4ev)d8r9 zf+AI!m+MT0qlj<=rfvW_)FodO$hrz7uduxWk-s{&Z_=dkII>dnQnNap2#a**=y8}M zSF#rCXX)#(>J*vMxj7>W*g90rAN39OMr<|$Nq|l^uT}Mfb|LtpRC}xSqYn>>yW27^ z#z`hF*X`5Y_f;ab;(@tMHg#|)g#VzCTVO0QMfXXioj{as3lX6JOM>U9p#4Fhp|gXF z#3Y5&-U2c%I<9+7R8|lEPRvP}qhx9f>=02defs@Nt!n3jUuGO3Z|ve=s@$fSxt2SQ zS*0v3kf0(?fF&NKtR|im2QE41c7v?6CLQGSrMh+(>~Cdh{=N|T5J46t8T-FNpTIku(-#t z&UO=e?^1B)kS{BXt-feT19TJ7G&9<5`zqV4FIoNb~?nsZyH@#?rE;U6B(bJZ+ zuVgu44KSkw>YQ&(#Q|k=Djyvyc~E~5>!lu#&|f%e`V#lJ9finAliQRy_ttgV*jBl< zv~{6bj3Pm-%&AZ{pX}BshwkR79g>oCg^=PJoV=bYqBMTFYo8L4*LeE!5#5z^GSi{o z0zieIC=q-gazsrw+1j4HPH@x_4F#b1sEevK#9U4-`+BW)73OgTRK#GSwB+)gt~dJMs85-h6Sj17%!>>I5!I6X@IY+Jr=7Y7XRfw&PFTAH zxs-DyB#?HeU2GY$7N72AZoaiQHh2MgEE#y-B8q*>3CrVD*^+Y(R&lQNzh}*NSo-U}NM}Td@>Xxxc_rTV{2#H_n!vef!Ox zETBok*@g7Q`gco1bAj|UqD*3*Q1k|ptH*;V>tyh+PJo0BoN(vBnwQ~7??nv>Lq7U$ zOSlSR#SEIA?YN%9n4dbq8`E1mS@8C1m8wtqB{!mx2*FKcPt04fkde2;3b+O6r00hZ} zi>c{Tmtz3Y!_rhsOADb~yBk5w=lFuT?hFDr5yuJ(3!NqNI{<9VPy-u7f%AQlHQ*89 z1m{%;&~yV(6%S^{Uy=)&2ZpU_&pgWg5*0?-wM6Z7c^+}LxitmMUnu#GnqJ=acs;Pg)P(f(_e&qCM zzh8C_sNWRZPvDL17ykljOteTc*Mx7mU!H!rV(@x`f0+g7JtXKnT^)Q?-gfjT;1vf> z{yD7J{`tbyJ&*r6HoGeR|A0&Xe|_Bp(I#)ug3+(O)jhT8?CfIzL2BQHTJ!O{pbWOm zwV*JyGsb2xU%aPR4WVTYe~ttwOw#i1;(LUZL9DvkPu#+9-U&bq^A%MQV6Z`UXBufNY=)Q?CMG20t12o6_`|~{9Rz;%xg+0I*!5Mh zS0s12%HSRv%nY2iwFj|%bFe(zeA+3s*WO#wRK_YW66G~HiOfS8ytkzyh~*6W1`_}P zMyz=n&-pU}SSg^dRciYFaRryi!hnthJH7*#eP};UR#gjvlPNVtN zXZ{MvHIml-rajo>)voWGH9)C)?_FO?nnpp~bZDR$RYhf02?-Y=oeX*Au8&k*P01V4 zp~y_FHMTgUDYKq6j~D21=V*k|lIHmo5Q$C=VG*}6c;Qmz%j#0bffR_I^6ZsDOjpws zH6HALNkBBgdhhHH_1Bc~9wc0Rk<#i!XCl3-@VBO`3^_j!K0Pp!TOg!;;gzOyRpjs# zUnsw~js%=CYN~y^p1wlPiHup6Skll&Kw&=L;63+oudwV`QJcUpd#tKDy_peBnu=7P zE4{7|b)gDr`$|tjxLSv594IjY!YwZ9JRL2z2Pa^gwB}0>+K?n`3Lgv0nVJRkHnyEU zKij$&(Y+V)OkFZd2MUdZX10`z&N!r7vM#0q=`C7_>_#9TF)AHW61lXiQ<%;vSM zsa#<7%kXZE_OpGxW{g{f`%AHe6X0qkvq(fuObRw2MR6rizzy)zs96Q<*}d~f^~=?& z?ewl%=zZ)}x~-oFNuiF!Mm%j4mUvP)#PIYWxcMyefs@O|D@_;k7YFj8ifo}G&Ve$E zojS6&=wsJxnk3xL`cS*`0SXSp?Xhe^nRyI`P95H&RUTpElD2!&1K15faRkn5qfiuI z6ZD~cuATW&EdX~M9Bw*Vt}T+OA(K=RZNSzBUZRWSRcME(1D4EB|H>mV9{p=o-M(pTPys7ust(;+hc1?;lnjkg zolc1HhgX?oDp{^YriRvrr7OS^Iu|l$&#Vf=`7r_)M&uBNm~P>HN_100YCyj0a-pp! zOmOQHVJZZmnOk#b4-1iiQ9MYT7*%5`c%HmPZt^dK+Zu)>ym*r5$HwAMli7IOzjV;T zHKedkgBH8KkC_vG6s+JEH+=wonK=U6tPQb6-PO0Yr_JVp!rzmZKF52Jx9nynQ?lOg3H4tHV`{|BJl$j%sS_+DAEh zj=oY~3!u_06zL$+n@3bSC=fzN>4e@T5Q3s`5CN&7BT^FxNC`a&ibw}3p@b$~dJRYk z+#S$!^!>j3-GA=y{_Y)jIYx%;z1P~S%r)1X&zgHZ-!YD=Np2p>YwHk6e>e0666eaf z*NKhJcsjM30rjrnaX`fP*cD{^zHY$;0QgOZCJ?5Y0+r_V0rl*BHnX2=sr4vLG%d)@jTR8Mxv3zX z?g#`M{3ocfTs6YKALpP6VNmA8$WicOJV{pX&SI^y{7G8j>EHtXQprBmG zZYT}{yK!FWbW!m2mq>sBl6jP)b#paLT9=5hbkUOgSf?zCxt=NA&DtJ{TbU-5S%Wb= zL79y@tWubavE|Lk+LVT<=2{t7i5K!A9`2~aEtx`e^M7%kI1Ubupr5+Fp<*162>0HJ zkHUOJ+1TK(dC~@=0Mf;|W&vU5?$Lu}PtUT#?Y%ESalMc@Amq$4U+s@_3d@!#g=MQV zs%D2!q`!`K0hM^k;bwNG=6Xf73hN%oBdWyTl#TZz4Cjobya>2_;5>U zr$ViAw;d zII#Y3F`ZnB2AFdx=}R>a@b$@23Pe-B^`F7?o3#SrXbA)Y0WEawAbsKfPM2C|ncZb) z1)RzU{cH(*KrvWssodA!Ur~MQxPXNp7JTCe%$vsUZk?p|nIDJN)p;Kg*8&g9tsgWi z?(pms0inU8l3ztdL|!Az1EgzwRr>6ipRhA-PWUHl7G`iV ziL+U(Q!XY`ITAAVSwT!Jrqs5Rn?j#k1#tJuZ7ne@nEA&ND|+OyY{ZIsY|Y4z--%K3 zW=|^sU#MreX3MMg^%was4Y*D7s|IW&xB5GOT|*4-SAeWvgr3_*T8%+8WEs%=E&Jo#rUW($630 zW3Oxn_$Cr4d=s-xBLEK?KfqVU2b?1?`!A{jG?(H|vx|-ZH^4V>*!IW&00}tS#>dC6 zy8vOH?K>N@8x&%z3UbZ%?k@Cl_@`Mz3Bb94+)`*Sf@9N+mO=sUu!Bxo_8jwrb@x&D zp*s*YnmUMSEtFop0?1O2|7I5y;I89Y@6`=ZcyCJzGdJlt&0*3Z*16awi5s^)>!=Kb zFG?#O?o0!O-yL#$1$(i=%wT~dp;$Hey13Ye2S^TN0NyZo8hn-E;Lm_xwO{ znegZ$`GQcPh}_u_+Yo#n_!5IdT4Vdf+~&4+u8fM?p ze=%}Rn6c?4p!SiXKUOrVK+T$j(9z;po}BJ}-`0!|X|*CyDa?o9atm7p&2DI(c$xKK zYv$ZgYJoVwM7gYy^XXK{JI|Xg^!gjtFK^r$yWFzjvORMnS4^v7stM#7AzNN*Gi_cA4US4KhWNGQ$$)>yBXst{0PHZfe;zf@>)i76!#t7iVqsE`|Z>%g8=H|ksdMX6&mI7`h>~s%| zL<-mFv<-MGJQ5@(iS5`!&+WH4#>>w87FLgEjmRTcjGBkUn3pRkuE=Ut@!!;Vt9Hi8 zogcq+rPwdEMsH63a>=h$Hj*(cBn@F*sI zRrMnqXxRwDiUe}E+a=xeuB#TqJj8Du>H>;n$$V;Jtg3Y&Iq`5=SY*ZAM6CrAs}9bU zRg8X$u+cqGR=T99-%R|F_$rdYN+ef|0Iq_X@$+xQNXyhjyRSsC0#rubaaQ)+%6sPR z{?k>g3f`Q6rN%UCjEpU66IWc*In`N^t#B(TqtJrMmiuOarwBifwrw8NN%9pT1r8Ho zb_j9*_5@BWO{m~*^sulKh)eA1RX3f3Szc>Ln6-H}uB9lH3%|Ia3(=0YNNNphP8+3V zTUJwM^04t208GQVq)Tc5PlL9t>ncg0->hlvI;pIJX}z!4^%OHWI{bb3Ug4a@W#;%E z{UL;!1S+dWzXSPc$3#Q0MsiySurMjpmjdwDu`Ut0E0BwCj26_24|iS( zj((Md&)*$2lYQN9#-f3ZQY|>4Z_mz~#m+3Q!Df;nE+JZ|K9=JeMqqEyI(%RLQ3`SXT zmoFf_v!A#roXpkA?UMAzn0HsdONfxvvdyaTv}EJv76Z$@?&rQ=*cav5UnDqFrIBW+ zGQApkljxWI2I9rZ&z#oT+v`Xl$MsfyqIl*-YaXoR(_ z-&RjdH`mH2SKM>9;?N=Xq>dPNeDL2mIFA|a;2+zgP_?m`pH}YRF>E=_Au!8-Xh~+b zRBYPk-&w1RTf=V$am-|&-x5J-GPMcUq>`ojl4Bt-NLWB_-=$ zNC2W#SN|yFyZ=G;C92O+BBor2=xp!8@1#L!XA9>(bP>~M6fMhjMdC)U zyVZmWgvI;YjaYs|(*xlhmvqiU@;>%c!0VmXLHHtObA>nSfk19)cYud=yG;^$>cfI! z(`dg7n>|=x;*=0k*2AMWBXJs&r6)8}K6x)1Q2yO5d(xzOthCp{`*kBD7Mv45qw`X+ zDxzBo21FULR8>}{5Eg>GO^e*7BgEso`}CW_uSt~VG#f>iPq3LeUF99#dd5#oM9Zd{*vv{e31DPuTok3Sc1`Jn0!mQ{k;JTXO{hr)?a z-xbqO&hnr4rwbvd8V_55_+E93)mQ8~$ykZ+MJ)d|l&&E*Ow}Vh5i_;*S^4h}6z@^! zJ3%%{7(BPBi7cpvjeXyYVU?0dnj{r^#=mUdx1+~B8Q-nUw&*s&Vm|2u5CTk_2JB65 zFX7?v#ui-_udl`%&^Ju+oA=}Y-cATqHnP?R6OW@6YS^RgYyzA`CB4JHYM}d~`W71s zyf4JyC~y2pYqsCkH~7F75~IH$b`zYB@~$I?F|)F6Pn3 zo>|qoDSbn;H~R}_`)XB+9n4WL1_cC|b>?t_YiohjyfbR6GxuF5buN3**b^db^Jeca zwP#Nc4+Ar(Oo(b(7f&*&uqSj2}s0{C|G;v z(;vP#0EqGv_PR?QuGj{L^hkT&@Kb9SNRf?e-bvmAnM*~JXU&>F-**4@K)z-u1_OBf zxB9x}dwsYJK0nmVc9rOf=|Qs3t5LHdmvHcFUs%TW(tF5<HiWuqm-M0F&npp8s(Ar|#Ef^}%nL&T3g%RYqqVz<4W|dJ>Y_ zfUt#2%lMocodv$B;SYC&tha-`>}MwSElO&(?*~vURotWRo)j<*GtmaEpFcV@58UOB zz$NHsTsH+aoBQzbh#ZMc2gQUg$*@E@(Ks*VF_D%h7rTepMLE8-FCLVKWTKPkW{^`SOJbpzV zWrf;lXHHu-7vmFDB0n~kZ?&46bpRj4cSz!^!~iD}IAHOM`gE#~Lc1~tdUj|m;F`Al z^ejMk46yu7`>(#AmfL9S0GR#)nBIGDj)x#NHqy;IdbC&CN;|8ycii0?zV8Z9MP{hm zw+V8yna&N&>pYQ4+DJ53X-SQ150Q_~B0oB{$Df#$yzZ|R}cHGGR9uRMCtPPV5x0oon2{(D#Lin9`JE>3(R| zjBJk55Gu-vyVFvGl6GCRI_2j$zM8F9m}R+Sl4GVA6Bnm%^rGC;(`$A*6ww3T5jg3c zGujU)b&@vWIif(BU&jANxvALQQl+KjqJoS~Pcdlw`J8I35vwG4QC>W22OM4p{O9jf z*Z#L=J-YV)+(s?sb-(VQJtGmon6 zYy?0mzBmAgY}ESL!4Ncnyg=GV<1yFG$*4UV_KzVPW*tPMbpS%s5vYbga(7>kSORA7 z4t8u0yT61dS8Ox_+=k|^AS$`#ALx)W@qm0N(y1_1MX&~%UHnhv!Rl=pIV=4B^mOgv z!LUKb}p-nhOE zFdTCopg)i#ru(ml0`saL|5x{KPoDq48z>!gdzp2!(oJAz0q;ERV7^CQaB_00h+Lb? zMNo3@-ixKFyZ+A}FtETi60y(NS(XN(E`)6d>~HmG_bW!8`|Szs&xNiU3}GC=2Rn*~ zvp#fCsyh9D|Jb9U3`y}8AOrB>`EyiXBq)c!{G6QsnLCur|DS*?>L?-I%F3o=dpLMI zX9um<{WCGT2^n0vy`iT=jZ^FxkbMIjcRR0^`zX6`5v`?`qnB$!*t{=HK27CqO^7;o{c@kY{F%YWTG>1Uhpm6r2T%+9DH_w94% zuDpJXtJ^5nXYyCrAO|R{toY#4UAV_~aQI`)=zEvOTpd5!3HiB)sp_m$ej1G*w?rneX|ENDRDA%f2fz@g#Oth=f^lH$a zYxssN(bS66emcQughA=;h;<+1sv=^)zEbG^*LzL_@05$J#UTP4s_xB-^`RHjrWf>d z=i@A3)IQ5yTWpsI-T4S|dr%nJMJ;etJ_qD?x_i`@_3w6P8eDa%Z^h@)6V6On^Zi=rcX34()HCCYK=~2sE?-kp~ z{M^Psesztd@Hjs7LFzSX$VUAOJ^=xJry(SwrmP01W6gDskB_hG5I1Lt-6&EzpL7wg zVF(H`TfQWdpBw5<4)DG3kkda$sJHL!{JIV!Gb6IH><(r~mXW1Y%fYEwjYWoWVYqO9 z{Tw4>TpmuIM10WM3ds`!+q*@*eEAY&WQI1C?{TcbX`0q7fDH8u-hSwH_o}JBk66%C z_eJ&{h!=iK%hfY5$oud?ZD~Fx>nf>sIFHz(clhF710On%P*_+juR@JM7Naz{?!DmS z69QS2oxL!G{H#hXCrc)ld0#_1&@>+}pUy)!LrB#b%_AM_%Jn$-=iv{uce8hEfQs*= zgLa5QaT4P5p>oNKLaOs!TjFs_-AjRd%);$;2St&Nh?3B;BJ z6WIm5sif*z1F3?)7?OAb-y$K-x7Dk*v|iA&m6To5ECep(9Au=~Rtam>!?p-VLd!BA2T2sTwc=}x z{)oQSi~NKVCq@~d2qX-jYeR2UjiCcX>1E!xwum`DLrk0lDQ)G9{D{GImjYcuIzSKw zmK+5@%h~w3BRMhg=KLO$c`P;>F(YyOE`^%jgVWxAak5DdMS#Jd@kYc;67uC9A@tsS z9D@}`LJn0s@#RKi&;zS+Uq}~T#5ZHX(IOB?ZY_0y&E}L^Jq^45)n)y#wF`g0<4n?p; z35h=Bld|f(Z@u}?QO>D{2d87bOFWB=b z9F#ev^F{`f@2MH)y%~#Y@yS>@wzFm)xBsFpG)&y0e#8P$fy2IxdN-v0#&~+sme0kc z;1B6DZ2MQFNH?p(Fat3Uz_zabe#RU>vEZi`o!^}1Xj_>oU53jmnV5OaAO9hn%WYgOkt{P%p|?>Fk7s*sa!_JhJfWpcD!^Pb##S4cD}{Gq{_tIueOCP=K5O$ zjpFBomcz$x4)?{vPYXZBNmfBdJ?^>rcx@Kvck1`bGMd~3Huf` z0N=n%9xcLNNP1im? zKb1VJTOdI!8TRI73Jq5mNlYvk*3fR%MM2oROOl{y{;k%967^IPpW)7Ef{2NZT+X-W zUgwoUMY#~e-p$_T;pKXNbP$=6Wx>Z&BlOo5C*kVB?WZZS&!~rBd~4bB*P_l!vj#J@ zH7B_zhE4E2s1wHge%&2>LBoTdCX$+|Chpq;`%*aLLP1J|I>hf<@}e4-eTu5kobKM} zn{!XSP(t!O0Rk8L2AY-p!^rN-c3@+~g(gK1i|*_wdurmDkNLOjGVeMdCelhuW9*J9 zRCy=rXDgCQL}{@hzl`reMtfY`%L1c}Yz2e@bk>}(@n^^#$-eoJ7cs(_2I;`LuGZ%I z`6c@s+c6WmgY(lwl3pqwD1#@S`9{A&mcfm@a`tq65TnC&6TxCu1<#S~VZsxNLnlS8%(Uj54`q_q8JZ|7b7* zNnl4!?s*Zr%S@A#edY$mlNnV9raJf^yb*Y_F(dV@rL4F)=To~Nq>!9??M$v*SQrL6 zNLwZ!Vfqxbu=z2AjtHvJku^~Vm1aN8&R@XD=oht5Z!cVujsrhHp>{71@>fI{iocov z6y6~g%7d4%V&kG1MZBI5Xv#bxJZsbZH%B<_A7EIPJIBG&d zNP`IN^`1Ykh{?!6r`D!!@V8!5onL6xmvYo~UVbN+_Hk|+>UW*`cmEOtfkbM?K-HzO zu}t5Mjuhn__iwIu)#JZeVcgk&qk3eg0-X$hJh;>?zx_Ihvb>oTJn?^!?%$nT<>4YV z>mC$zCRHx+Gr9uWS;Yz%$TFCU$UOYmgDbDI2TON49J!yDBNj5y0peJb+}k-pf8J-4 zOX$r|QXTOx1^N2+X@s0KdAPO2(lwjTQoT?pFyeX=pB_jPrE!^v$179(hLqOuR~KcV zw@_T_{sF=Y*n5Dhs=f@doo~99UL9fOL<)hxvu)a6!&YSaP*+zUBV?S4IZNV-{d7_T+>KDyGl@P1U?sL~T zd7+mzg8ypru;vhp#9Z=JHE=T^nYWqUy}NVhVnuA`qnbE$HfC~O;3p! z+mAn}Zs%-nZOzXr9##P{yiTc7Zr6Io|Gt@W|DU>4&af)@8yo_m#-1`=^%lieGDq7AOU7Ee-j|bOl-cZC5?I|4%mr=9@{e_I(Ox=}i9GH99J!>MoPo z(%FgNY_JghBj|k?YWs=YIusk7_25R9tCW9xzmJy}FMFhV^nL)|M5tffoa0}=d$u4g zSB(nsv7$bhzU0S?N$62p%YH{vB72QZp=5o6g73|o<>faerRXHd&bYNFZ4x={4_wMc zoq~5YB1dS@imq>z8Y8&GZ&`uN%pMbW#p|m+I+AQI*4X4r)(@mQ!){#Y1-y73Qns*R z;haY^X7l^~9;76#Qe$M~*L-s?8mhq74|U@CSn~Pn7v?1+*!J3_ycfkL$=li&i*UOy z);eTQ<}Oe!4^$Klsc^?6(lZC1@$!777^y+p*cux7)by{}vs6^H^&+QE(@he?KP4!fUbiMl}l8td)Vuy05*elag!jJCtks-NY#U17LSI69hs$TunTVy!7h~-tq*s=n- z)Wy7FtLg3O))F1kbHZ)t}%9ts-pxBkDO_j^~^q+kfcuKt0p zZVYGh^yR~;rNY8OK-{3%$+X`uQNJkM*)1#-0;Et?Cm`UUGWWe%KIz2^+qApnts$56 zgF}oFoY!(0f(9f++!%Z5Q{mven7ntpiA%63d3S-l`z1(dhith1e1APP4oBlkeI?=>}6BMNV#(&85A{OHnk-Eg&i=J#`EWq4i^C}Bg9BiH5wd8 z3a73u!TCcYx*`Ynd<+lAOE?cp*-wN#z6fz~(Kc=aR#YNkRN?JGfYQ_3@iv_^vSN?8 zf6@EHwWl>2DHYxKQ1Tgx%Vu%@vVGpQ7&yfXIXarLI&nkig0&s=+gI$e~_m9~agyuALq7haH-7Rr0v-AWK1SBo z)&h$UMfXsW>*aqG>6fGmtLAg$WgmR2=f&gOz;Et!GR}eEU#IIr4IJmSL#?Si`qZAPl(aI`F{Ue7CjV z6rm^Jty5pG1v~JKca-4eZ+!qi^qOqxvMbk0snl|=m@N6^gW3n6I?^^vOS7seOHF)h zP*C@Hy(%5Onh^7}?zBdvX=%Lhwt=|cpoZn3!13P{;neTg9AGm(sDO*zx)m!EY+Bg% z$ug(dG2T6=v2d^jP?tS|A$Nkc(lpo>s;a=9V{%|Mpakh2poEbyUidCDBkF8etyvgt z{mms(NJ#dg<8S@7lZ|w+t;DMpLvLAJrVeh@y|O6owM}4gR)N|4UdTCY`eR%JRqtj7 zkHX=10jbqfZv5+D9q|}Ye|a@S`_tv+kIB=*^)jwk7!N}@a@YkfP;(JRQhVzHMKh=0 zzwcEDyIUaRy(q(VE?%`2`TOey+uB1KK_8#omRyt8>8HObjf|+ixD(qLpV`%0d@fvv z-557)Nm#TN3%4$frL^1#Xt}ttbdRNvg>>Sr3)I#MX}WD9@$EW)U$35i|EE&$Rlp7! zJ-A89A<<*d;R)o}wrB|o3XWEteA{=p*^^aWqpWoZqX$;I%`5otpD9sM#r$=jj_X|a zQiW|Z^bf@ndpni+IaMzICs_UIsjRdEnHcMk>jd0TYHUwpY`cwyQJVZ7O{$bAAOX%A z4syD2_$|zu%M`{WO}zDO5v&~w9ebb^r!9X;iX;pSXsf(_yBSa)33Z@8{RKw@8V59s zCmyXIHq);AX;Qj@_Qyz5ZsZz!O9{-cNN#2eXIJ2lGSauW3wipl5sjN5unP<*NZKtB7XTPao^?2|cIex*w+Gqa$6G1b#d`Ah;|e9k_)uN=Wi8V^xzPj?}pD{g85M&~l6;YUg18c*Z3 zH0-f5Y3rCQR++d4d`fb=I_m8&5}bfIj$unMm2&(VqaA&jwat@a0f8lL{>B*VINv@j zq3pZ>QnK^n4rQh$$q!u%2}-2&M)!+Lf8&lKp(!b?K0$Yl$&z~OJ*F}NgHYgYJ^eYv zx4_v*IRR?(L@qicx=@b`RKwWf`2_qDXNnS#E9Gc4hTdcY%muJqQ9lZh7?feD$`(+# z3eP{v6DXWDOdzpZd*UlSd9(Qx>~+TSZ&Y=?Op0AuPDABLdy<7}bn9$P=VY{Cy<4^? zvbf;RPXsL%mQl%tE2nQeoLoMY9Vi)ou2Ng>z8vKB8}>G409%>co4NXe^obW zF*aZ?931L8@cGM|tC1mDfT9odwD<>q)3|myHN!D-a%q>Gle-zi!|{1c2(RAC0W)xb zccC(4gjjoUnhXnY`^C@9jcNUG-YRu2uCWKE3!mF4tBs9`gHseWzYo%-Y`7n1ieb#= z6XMf*{IFQ9g%4CwWBU>#OL$;ZKt%ZU5)IJn(bpK6n2=euMuJPlXIi(A9)78OYGEKf zgRF^ecaUT`->qHIjFoAlxWZwSQt0;Pq7nrV)l)Uyu#mFaIGn25Q2n4c4> z=xx^%;wLSZo0olzHRNj+^d9PDeRvDO%3XHPL*FB0?!CzaAUwNR)9106tx z(a~CcZDs_zwf|o~3zNIM!2DcdX#6!9|KZFD4h57keqLvD>Cia&z!!blWjC`=xHa`% zfjWF6T@ra;vF~up`}ScY{P6UMRg9z7p2qJ$XLJj0l}PBh=xe)S=JT0btb})RWAuWlsiJNwpt7Hhfo95OkchJ zGJ4Ul$cc`tMX>N;Ot2nKqM$@Dx$MLBW`(uVV9sd=P)~ZkkVEA|%KNlFrADPImpzHqt|1nL?#Z5QQ zZ>zQ$=H$-Dr}B<%meE%zydA4$iS1DP_S#XaXvTy`RZDty8qz`g9O!VN7!`x@O5>;9 z(|mmI)LX!RzWG+0-;mnct7l&5ud4I(#PS;=$53YZ8$H(7y%oysHT2DRXzqL~3>im# zg1T~o&$QIgSXN!n^h)T5 zqaOGG9Li>DQY$|Ms;E+aI)6DXt)>2}BiQzuwmKqWsWtamgL6aB3ewgwLA|w+(@*84 z7YeJ)cf$YuZEyJW!thWb%`g`b@O$~gW2JQe=-w}na;^i_tgIIOJ7AEC`)qiJ zM!E9DDm!@|EW5cC@+Vsu_hy3~*-PCvYiC2o?ZX2t`p%RSRA1Itk+t?U{xwO2T8w_A zcum=pK?p$)!8ayOGSWgUrJ(5>EYzB~5FQ_BwoIxVb+o4}x^F*4@`gjq#e`TfQ2uY3NlwGHD*!a6x@w%3EvL0Fk1Vd@kyFFlVYI0ObXS{Tr}E z#$4>S9K%@YZFYg4R$=}R4GV<|6-PbEmpJf5k7DOI^vI>@b1t|f{^Z@V*<1!lkH+u5 z?2QqZb|+|*fT(OkLLNzFmiq%F6BPgKhN;ZF`o3qdhof20BNwTDg*| zFT7Nl%;~r|uPbo1YPd%`ufGp~2YP5=}b34K0&a-p;DaUR6^i zTo)o6Zv`YJMNl~;bxwmjKnVq-^yqJcH7=_10v0faIf2g?l< zrm5Sv;Pw6}S0dK<`12QI{d&_@^R9>_B|b(hs@-tIF`Shj!emsbQ-nuLW&YhB0#(PP zFX9-}Ih(v1q8Q#o-~^pScgaPuOe&JwzwR9>ye8)-vAo->$Dp z!ET}9Z6t?fFX4IM6J<6$?-koxbtn9R%kF}xs=0h4L~_TIjNb0P#!Cf8RVNvqi_NjLaOwI=?+K}vMvGH*rG#0 zC9YMGf$t?A8tXGJc&df?R6!sB7+Upb99m*JPTa2lnK4V`^xqUF2)o1pQuoJ&^WZFKpq-AzZ!FbIFW+JM|TGsv!|hmp?$ z3e>6l+66Tfe(dw&Ad@t!+&-W`u9yl0yES)G*E6CrGnLu3BT7niI4bvcOBm^gVv}VB zB4^wDYp~d}f1FS-6z~^0Ei!sQmQRvgY4f$>3t><$vkKML=ck}8!NFOQqZi{xgho6V zq$&2>Md8chW$?qlsHsb=Fg7wt8w)Fvo{I)L_wFGMOP%Bt^0XD^dWNecQ#`8Pzkd$6 zN?-eoeXAv@zNqyAHkTnlCJ=8V>P3S z5M-L;H!p^Cy)B?DzjYv?H@OuqJ?E8>(IZQ(cDKLU= z8Gw()&LBqFHOxBykF%a|_ZH;q$1_Uidr2S~=9_3aAPj=PA5k={5#rY1(Y(;w>G^K} zvz`AkltmTj`=UM=z~y}9^rcx7BLK(X z%e?hZdwf^8fD9w4dbc1}GQjr(lpMT(;qT?cBQ8=W4q&eTVc3f2hr|tj_Yjc26ff~& zl6aT{1*w?(X&-|-D#r5a;PDtFq%~SbeLODfXIlsGJdgZ~# zwot>LkY1J0`*c9P7{f1rk079Wr1r!7bfp8{btN_7CsRtLeg3hv_b~?Z2x3+Ql9mp( zX`i@E@r`8ufl~rir=|>!JP@D>IkSKWxgC`?^7HrrxCfaWY}3iT_Pt49DMvfk&#xOT zDV~KLkh9RNPXkz`z9$_Z17H^4%ewN&nXAG9A?jJoz zHN!~Ha+&qk)SAJxtCh@UAZI?}KP;{XK)t&1qUIhP=g9eiVNe~5SLn}PUvB}sK4q1o zq?{R&QCy6rU7tYVW8lwUC&qs-s_jX~JMfh3x7DN^^D-^(j=%fq)wJA%F44CJ0zFZ{ z6DGe5!l_fV_cDV|o%%5_GmK%`g^y_&JdVfy=S=~XH7L5JxfrOK`riW(J(iw5{#Z$f z`FpFLABzU?8jTO*uUYAxV=0xQqMDg;SN%S*{&&>&{e@Rk%$F}oN6i6qyNbK zsf7XsnuzWn2+%RGxL5r*l0hFbt=VmtFgy#Jc=O8U-d9 zmFnF;^(d9AeEWNlYQto(a}}4vtsRQ=&OQ2Bvsgc>dvFV4_o%MP^TtunQt7^I(CHTm z4yihp?6$vmngUgi04IZ64osyKrvOMB>wBfQr#Ts4zKK$I#b9KWeLaN8l zRR5wa&V`A?elqsi`z#rm`xnBjWq`ba`7A%F){k|88Fsy&>!`k8tE&aj zK=D`OkB>!L*E{EUdQwW_JyIr2?Mc?nf4A)azqPe7@FRQh?c0!h6%XAih@6-{awc{9 z`~&lxlM-={F@(c(KEsW|JN65ce_iH)YcUQ*WTQ{(N^QpT;m5Lq$@Pg5R-ZnaLCs!_ z4I%*@YH^ti8QH9DIha≪*8zp<&z4I(bsy_t_x2JCfv+Z46i!x@qN*Pq)p5fkU zG@o#p!=-C$mDUS-)y7fQR$@!z)zFq8{PWC7EwsVm^K$uZm^>L>I+o#}eJVl~XiM`i zLfA81okVja%D_)Y{Sl7v7J%Y`q5ktsk%ddZJ)iNS%EGpWpjJeN2 z`SUtH4ktRSWd1eb!GzlP^VQ{vf_dIXD|?-3+`IQtTz5!1v)I;R_!FVW?@swW^|FbD z4X-s`8*m~mYYbpzbOW16m)Rwz+>e*j)E`j4^v&a6?uR<0YSznacB>oJECtH= zg;*y`f*T^`^X6CD;}$k`+%Sh*jN%97#_uQV-32RE`T6jfFN-=Alv{)5cPIIY?*#L{ zbUm(e#;Nk7mg5}M!@S3gk@3np3!fCA;C5q~UT=}Nt6h%=XWIKqT2AYcmxjBNV@?xD z-TY8*;|du+?HiA4%zPzHt=0nQW^hrxYU)h8v1E;JO zl?SEw(z(itl$C6SmMGB56{O0k${RU8=d)>%A)0V2$t_H4%g@ z{zj0OTC?9*?p;q$@1F@$iVn#9fLG~0LD&bzuZpW7!rrHcAL2Xt7kxwNw3&!`D|?N3 zK3;x1MbeLfP3BE|xD##pdKBcs0qGOe)IbSIbo*=i%i(O=VVH1q~5B4uNkuX5Im zAUEBchMWkkK<h12IaU&D2>Amvid5Y{-*3R13 zm+}o?v45}Qv_~Sh;9oDX_|R&O#Dk+XbsXU#^GRDM(idB`fnmOHeOMIIh;u9_X*x1Y&@3j7SLeWNdcXI;#7>s@p$ zTO>Nsbrs7XQj5Q@Hc7TO7m;j6=)<$>tbY5;v4dqAZyAb$EcZU>(I?>k{qPRfXr~<( zUE(=b4H5VETQ71|aw$hXZVkY2> zx41~|k94rjB>e+e$S_D7wdOZDBx}AnJF0j-)pA%ZTF_YLpx6jv-V;%A06J@0R4eNY z29d~oTd(YG+P={@vaJsntK_4W!K$NHvmbmwduSNz>vXb$c%m+KpzFvJiQ zmGL;&k%kXc!)e_8P6obHi}H@htDN6M;iQe_g|Ruo82rPjDjpDQXv+L>le}{eB*7ZJ zlCc7rtZ<2q@OEeno+bGD-^KZL3fRg9Xk5)TX9R6bCyNz)aXHMQ>)iiyH2F}A(YO2a z0eG`F*i5hxdRx;+Do*Mkv3gXFJ9mTCT$U>$Z!NcoZ?y@FGWW%Lt_Dg-V)I%m%SsQn zdQ@3uF6-56Z}WO@n4${ZT3{PlK9Kws(wM_E@lDEDHCQ~dJx+ct5gIXeBhr)^3;z_# z_Bj|+gq%%VLE#`clh6PX>sNiN2#@F&v#3SeNWQHeG*R58svImFt2yXi#f8)!f)n4i zH*S=n<{vY*Mcr{(?wPR-KtI}76^FUJ{5`hmH^RXb1Jvccjy$>a^mI7KL-olplpNpE z@RJ&MLXjzpHv~N44Jv{^2pD?v;j|wi-n9i*_+%o+OCqcMQ!4ccRu8nWf>`=m192YC zpHKgNx(@-;2L?b|JI||?pSatWuD6=344RM6a%_mWpLNd%1)VnWz0ei$2~qYKt$P69 zDWqO!vLEs2CUP98qKvXhW9}*v%JW!-l`T!zh;obQSgEXbx*(&ifs+uE*XX9FFo@lL z5JcX*Z>v!U-7q?gZb?5i9RO4y&)eba7h~Wq2DO=G#4erR7`s|yw6QIW^7!+qK4?rh zed#%Llq23Hf|D-aqelXSyTS+-0u!!mx{u8ZL3oY`f>824cAMdjQHA9+vwJl|{!qvG2UV>2*e zOu1|g%z$bV2WN{bzIJJqkSBdQ;k4gCHgarb$DUbvHSEW(r`!HlOZpsmP?(+Y(l^@C zHew-B@lfhQf`zQ<)`|mR0k7ks6!KDXgturHh-x#Y9$9-Mp>-J{Cp1Z(+x3NnT%Bcn1yGI}Kusi$@C(UP?>y-KHR+_RO^0jFBwW)A0qR3O)d4@Mz|rn5{rn zTH1>*?^CdbzjCe2>d!fY3g9B*vd^=gC1-b31Y~YW?qzdT=`02&`5ff?^MjEGe#jv= z8fW9erl&R-M;Zu-{8lw>Yc!X+;*YpWzbc7BX)h&M+KG(`=vSW9$@nrjxd!rWH_`ol zZ8mWO0qzZW^nlTqz9AwYC&8mojiU+tR6Tlzf0cA^b};X3)w1txQsi{D4W?31JK)~t zgL-4=+UF(IMOZa_;z`jp205glqC)>7GYsn1div!^vB}Upw<>*Q9$D=DTEL4*tv}dn zP487$t0(0@`ND)NrL4ojR$Nts@1&@vW&kIHQJAt~^_$LO8nUWt)$4@o0xadsB z_Y<~mBVTe4e(rE8nkx#07lkjZfY-h%6zUeK^)C}5lq&N1R-RWwm8W1+LUBT>PL>Bw zlE^2Xu)Paw8e9stq4SWHSZyTEWW~o}nnq`?=zu3~EZQjNkrsaIz_n5@7>SM=7U<5n=B8y%a(E_ zD=j05rLt3AL@w)A`9|b$s5Ho4>Tn=;xWfe0JDlIgW8M>tU_!|pyiJOnLE4a)*0uPz zXoeIgHRYXkxzkE#97fiZpm|8+6}l0mMa`|v88dPGqxWw{_ud1_ z3b6;;#D+S_#4g}OF>uE%Q5bN(KqAueNr|MzGa6~`Ybz+AsT2_%FD{L2Q-_-?Uyw^c zlkiXju9(>~C#V8%{nbDVKuDL_XO2;wU;IA+0;t~T5b(vC;P5$u26=S@Ec#25Ewi!b z)-v>V>aKcm4;w+Z2a;_(K<~an8yMIhc3L@ox&v8>qh2Np=s5xDDW zoWZ*CBW^YE#Ahh-UMggN<1C5JwCTPz^2@?TBbVFM=n}&GtQR{gyKc>G>&O)TLCdys zf4}i5$uje{gTx!1MblxYNHrKi)JR`;;lPUm&+;z^uPLVWli`BXgVg?hPlp@*Fcm%} zm|cSJ7qP+Rrv7eGpN<+PK|S0qqnyYMdth?8=I7cc^GV>c%awwdnZMlV1WbOb$O}HB zr09)SBWP zEYa`5dZg?@DdtJD$zTMBF8CX(n~>2hp^hH}`{Ql&jG>WL)(ME{p~SILxjMEa#ay+cg2c-^Zl3^F9gx@VkH zA&LVA){fe+FTq|!GBoW6O?i` zj6v%lKql24Vo>}o%lHj&tQ_mNAlzEJVhRazMO2_U;~9q{a;XAaI3wtXnF%RshBc-d znZodD>p6#{bf*cw>#7osS)r1)Tjs}>o-hfOzb)3FjbEMK*z~?SB&k{6>n4}|WS*P6 zefdzBQ9{eV3*Dr*qIAc-J<(s0wjm_;Gbfo?glOd^?H?|VxVV~-5_xuu1n$9^yxv9m zWZYwnm%rj+7)$LO9UCWdL+rd<)eAA*%;wSe%@?$s(Ab*yS$sBTkAQz414JL9o|%?f z_P1GpH6N9**m?`=aa~1RTG6D2M3+@D#`GFIcKVY~=ceUjF7zA4sNU@tbpxMno)V~z zQcUM#Mw_Si%nqSFjM`UHa?`tZPK164k(lYio5hhM?M)SaIsHl2E zQ%;J?mG=U5Xa_qLRhTv<2o6ZSp;1wg`}b#b1ccO!zrH=g^m#OT#xv`%bFT;9Ugc9h zQ)?ap$4$KCl+IGLx<_U30-Cje=r3>YeGgFZP3FMPw9VgS1+ggg8HRj$H-c;0`Og6o$WWF=x=w~J2 z<9Jvv_bn>F$IwnKU^CqDo3^4~kht*H4px;J+OdS@<*f2u7#ZA&@?dsUYea3JdlMpN zvevt&e1(Ty>|Inn0usj&(J6zVNAvwi4W1Vf{e3rvS82CO=oHUcxK#@T^swZjttVqMMXeBsnQ*t5$O&fy(le6HXftvPBP=9g}v=uqLG|MQq72`JXtZf#~yY! z9QG3H-o|dJ2%>f#9>KuTxfN&785ycn)j-t8I{yZLjYyQg>+oZA0ygAQmPJ6W|0G+~ zBUq1)lkX>R{ysgNo`!N!Blw*j>_lxgEsTVjK9<}5yAG4jY z?HF?=5zApLY!?JKslHjUvQsB+F>TgMWlb^_a;Wi{*r$2Z0h@0a-y8}`%A@2;%WqGM zQP7>iw5FZvzJ85VXcK(R-jYp>G0kX_*QBG6%clBmFIGsT23aoWZ6(uKfm+%9<{YR#|QeytE0$EWD=pUE2H+zgp1O zzeNaU)Kd_{J!f|szlP8g^jyM@Ik~^Ut zJHNtMdcQz-pl!Lv;`D3Pt;W(qT#;tK+!kHZe@J4tjxOgxDz7Q!B1p;!Jv<*Y$qz8N!>ZYogRhJO_XtN z1riw|P@~pFF%|1xL~*psw*5Mij02&Iw>k#&aR%&B^osZ9Z9N%Wd#0Us*MQ8h%VGe& zKciHG*?#+a@w^d1NuZtS>M;LJWiB;UI*xvHcIoisXpNL$*jl7u&J7BBf=@k=!HdPIr+iPJoANdV5zw>qgIQ+CkVI@nTk5MmX z%xMkut=&^$bt%Z-f=p>U7$}S`9$BVIEnnV{j!V97DvDFH(W;etsK0^u211maoQy)F z^K)-r1nHfZDJQr|ZIF$_xOo{`+t{6N5xT2KKyCT2eakt$$=TF)rVNK+mMgM@wqHyv zqldm3p5Iy*b0w^($S)=OI8(C}=4xowFv?I&uFuq?emm(yxJ|?;JIlwFK*P01in*mb zxQ>fKH!Y6MbXX+U&ObJ5Vi^RY7Lx_B-UgdW7I`cMR2+fR@{Mehmp1`3zG<@l_WeST zvtr_`bpN(G+?BMJ*5en;5VB#{qf(G;qqR`-=IAyH*A-NJgT?2A->6>RNXM`qD{{6F zqxGBWf+AQ$KZH(*7Nc}wG_d~{%-4F@S_L?6y<0fs<84t7hxknn9-CcWqp^(&gO9Pc zwN+~Ws4Smyur$@P;ap@rMJXUS+sTZZ)@Ad#ESK?c zF=IR>L(8eQpq#x!!oQ=@XEF)f7rRv^laQ!dc@NSO8$)1=Q5~_S@2?3l+mmt0jWHT& za+}Olru}!7~JPMh=qT+(rpQ&vDnJWi>d+#wUd2nHK(G6UJE+ zD03oJm#@|vTCG0P?#X;2vmW%MZJ3Is zS-~yML0MCs=p#9nwy|&DviXS;#>y_v*{aeOJ=vC_MGmwla?!bF^Lp39`9C&~W*`I4 z58E=wHrua;ZS?m}!1OJWWSClCLrhIO;5ha8q@)>fv7f-gpm(8JIvG~JsUE~dFvdiELm&)h^bSV;N$1`lTz+G$U!P^E_qYsVVKQ(3hwymJ{ zeZ*Uf$J$ej)p%?dxmADydwmoSn+(`F`Ge-hC}Eai%u!7CD6vZt^6^h+&>UlSPiRoP zbm`~reA7V#gZ1KbL_t$+wG5|e8A*G;Sd1KijPG@G#Wwg()-8nMOs|86Y#V5_w_ROk zrsq>YafGFTD;?yWA&_58T zSigu{K)U2@a{kOC)gzGmt+{(guFt<|zo8^9?k9ONImgn!_fN^@?@3`7>vtI8^sNYs z)!AN7H48)Ho|gH<)z?>cdU|le_u8~{E65^Vh;XUgD-`caOL;y!knawx!pdlFh0e=g z|3_m2eCz(k;N)Zq8ts1Q8$Xb|f1z5j>yG>A&#axw8GjY?gA-)wSym zAaic+e&YdwviQf}9=+?~@jQTAiFE&)0Jw^)Yi{b*79NF6_NoN}eydcv>lKj6-P~}K zbm-xkOI$TJvaiOz6U=vYc9w1ZP2d#C!g2-kjRgo*B zArQJ$qMnkI(_mNEF3axI(Ermk{4#%RboZ9Y&0-#}jOOyQ(*KSj{)Pb+J|{{4it7J& zP&#RF@3fVRKF-;xfH4*1!Lqw3Ws>W0jl1_#Rs{}2xMumAvYl5I?-LZCiww>gWS(C{Ns8%Ugf=W6DO6(R(*;V z1fB4U46n7v4)!+^Z9-mizh7%#d{8>Pvr%%m1_8JNg_fv&A zD<|p|fyDU*uYFcBFfj9*H&Z%(ocGTCja&I$ggc)Y&Tt=}s0+49-%6kA8ydPvM-Pv_vH7ci0VDgh>Dx~lQl@}=AQ^aW69HTT61h5OTkkb= z3W!OpczM2=JLXT2+jmVriJ+t7Z>gqvFVHDBdG8FAe2IweFZLTuRl=9KM$z55usLs& zKVV4()tSlPK%;ma?)^3YbbnRbVhH5?JXhG(x-ECvZ2ys0UQQpH2%#2mLi(%knO5;@ zWH=>0u|$6C^_+Z%eZUyViBei|Q)aC~r#_mQ1goj5thrD#-|N>Oh17H<;>&~Q^U>*Q zx47(i|LmtV2g)MpTYBh4e)@QFByRn7)#T4z?=mCHR-1GbR<27|!LvsO6N}f9^iy0f zM+VZnZ_uke=kDqrYOICo8%Hk+wpSb3zv7MpW7jg)FoWLju7U7rfM4^O^o zVH~1w$JAc&YG1S)XFQ4&#b-LDl_3|uF}JNftvbNgRm`R%`p?R%)4&_qY6lGIRwYi2?W8M=bp^LVK`ViEj+DiDf4HbHOrjsdU z{Nr8e`g+qYx9d8yD6NJpIU&C2T-ZvlC#m9eW1~=6LAvwDE6S4_os0cOxmzEl#}^h2 zNfA4qqCskj!&fQGb~gREOcn6WKAhM0q*Ea>gx)rOX!c05I-)12J;_9wNQ`Z16C;#X zGhp21ANc37PYNMg42yqs+|R1fI*%VRRiw@?!i?6{rx$CFWypDdG>E|VIH}XSdwb{n zCwInR-C5y+vMVmkwG96N1DB=J$TVks7^&VB9W!R!lpSMJZNIWHb+Xsw-kv;gj)p zIahP9N6Pn2u=T2=Gc`g;Lkl9ZZx*I0ToRHdA8bsFTdyH z5OPSjFW!V6G3-+&pO~MY?;N5SPL?P~vEtE9Z02aqTIEl&gkxOzu~0r+JX`ZX+r;m)6!HP<9&F^&OiojTpNp2 zSHVoWI1P%_Qo9^un1UB5BP%afSOFLg4caN_BbQU+fBm0{DwNp|{>MZ_47|mF$K$7_ zre=?W>F6BFcV3w>W7NU^3YqHO7noo7AP?9fkM+(b&dvH)U`=g%O>SiRx|&AiAJN{n zToVn|AUlZzZ&3?rJU1wW5mH!6EEXQasql$z7#yR~dPHn!1d7UP`YnU9`5rlED9R%B z@I(I->I9n;afujJW5Kspxl)M+P#3jvfe`mZ=dDK*2C?l}2KaW*f8f+0W*l##q1t@4Pn4&Ffju*LYUM(n3eq z2hP5iD83Z%`sbenB{D#^F<6)!~l1Am0V(lRfCUoqygx4{-~&Fb9)@MvF;PMg$Xu#dWaw z8wej|Qa?+tR44BJ`=>^fEo-&@dUlJaq#?yE*!Sn(s{NBekT6AppC7~8p_v$u>F_D^ z^(7V;`|T8Y>K?+(eY_D78R39qw3j~36~~Cw@hU*+qH3Q46MG!DXq~pxP4)YjDMxP7 z>_}3ti;IOFTSWamtGi^i@#FcE{aRs)kyyc=jizV=e$Ds;^MU**PLQsUOxBy;5SAXae`k5Ekz0DAX*_ZC~nbd8!Df%oevkItEEj zGs!O<0*Ebp__OH$Wp1KI8j%Z!PBqg!H7{eLZ&CdyRfxXo&CDZ>Wd?U%uPuan!`BwJ ze$>(+YT&xo zsB>F;P+yZ&PPcl0`kA@T+(=fA6MaWm;w|j5kk&=f$*jPerdfx_jq2IRfb^sC4hqDI!$;^+$Yr%JJp#qbv-9>zQ z1H5(|1C_MV@z+dsDZWyZaOkke_FQ4WMTq59y_~n!I-n5x!md>ddboc!``uuouv&tg zrdC|<@|>$9-FOzOjE|e5MIjO_BMFnUO^x}=--(?Zywba+86cn zL6(NT4N-O(eqhM;9xmJ=Gd$nEePLByd`a3|aX{@Dm<-wTlUcxR=L)9xQ(XH^s*)N{ zh*nF?+zWxjb07apIoHwNe*&)W9jyNRIM?Rd?-aOHxK8ru)2LhJ-gZvF6n`Ed3?_vi z{rmn;x#s*I$q1}Fhkt9`{cF7sY|t=Zpa}{UxK7r+1yT5$)XNZvep2~QU-Sg|Vw@gB z9~ZbrwQU2DNK{l-b{((sV#7H!QlrzjOyVh0sn=H!+n#hKuCc*;?!)sRJ$ke-S+9cI z9>-xgYor|;u15C#%f4H34;Y#mA@1h@4F=V?RpLvs3DN?{`>xXU&IGH53bOd=~l_MxktFI3J6glN@GG z{SMOXQfQLz>UvJ{#Hqd+y`weRAhv)`Hy9g>8ybqRZhHWq@Cjq44M!;{Dmptl{(aD0 ziF*}Ch9-jXP%iW|5{XRqtj{r-K8pZn4xF6bHx7ZZap~w$=1(^b4Gr&_-1{?Rsd&az zm`96&N7HQ-*oQZ^<|RXO({Qv0HvIESxYkURC#Fau|N4rYI3%0?St;f z4m;p36qvI)=Vi4U8yi9HDQq&x#>VE9kdPm^wRJXT=VOe#l2SZ&dtpFTzdI-AtZH!C z=|sKPg48An3%kLvmc^!xYA@dEzV{IViI<=E3;w}MH`hKCElEw?Fa)>5h9ycDyQykc zg|fF$P-uLzLk3P$Q!~whQ@4EdFo;eBLH8u=zFMhk6gL?QX-=!Ync0RWGBe)V29t4h zQ_}_p22gkR*`w7KQc6uZ>A*Ty-N#>0)@b*lv2pvChv2sjh~F`QQF;n~eozg`C6vzs zICuyK;%EE~)8jHAmpBrQlY`PCPa5G3&8r&16+pbLw9il7u)WtD?>AU8St*l^i{ z8>#s8+=Tjn@`<_3_hsL!1-mgm>X4Fa>tnzNUqLL((q;Df88q=+;SWj?NYPHBUKBSX z;cMkP^a&NYz5Uwr@sqpuVSTwa{qm*c!GZwpMoh@OMXg3!X{q~Akw+H@xq#Rq%QLpG!w#>aU&8r*C|G6x)y0d?29KJ9)uN6 zJi}}%H;7Au5#;?R7P*h_7`WL~>EW@l8RF+bk67^$YJZ>UmZaX>E)hb9K6)2@T zg7D9kq9dN;2}c_n=fIr+Lv}Hgk#CsXwH%Q9gUGxbkqQoBRcS0apN4yr5=HE~RfAV< zu6ZIgvZf#UXV@2?O^nT)nceXu^#`g*DTpi*sK=rdA}Jw z`_Z?rUo|l{Ha6SCls0xVRWA4AoGv|r>FF0D1(FRbA8$sBYNb4oxL!VAypv#W^L==D zH~W>v!Ls*X-x4&9nN$eJ4Q$I^gvqpvEF&`be{A9e(B8AYPK=y2) zUlA1=OYyQ3;K=hN@_@r}uAv8k1aM&ioJwv0{P6-1Ai14?YS;Bz4a`t#sH#qgRDuQ zL;7HEO+=_Fb}vVqv^IL5!V3uz8A;3u_4F(qoj%(-O)BBzMU$FZ6%U2DmaIgTpg;iU zKg$wkxv`&lGhW;~NpX)u0CdY=x|Q#&CT;4bO^IH++9RrlW@I7CIgen`N28p#{FyPd ze*F_6@Y&vygfbN8!4Xg7g#!iN#+-SN5^Vym{lTw4gSpan4OQ)d!~?<0(y^5dFSe#OIwB zh*g{Z3r&*zgl00N%un_WUN3zAK1)XdwviVvsjZMQ*Ej1)8c}dqh|QMQi0k~Cf4r(H6TrrFqp%EjQ_!up!k+ke+QCHWqGn`+`RbET7+52Yl z?_uhUG`-ypx#>sB5E&h8kP)g+GYzKQToV)4^Rq8{d_KEiBv!-ka%AL2S*f(3taiqO zZJl`kjIig72O_GrHJa4=y1rhmj7$kJe7|Ha4sq{=^dV$gKdDiPk6tg=&05JDh&8(& z?V3GZ>`AjhXVlX>7LB!@E!xD(z*k)sJDuleZgi6KSG-9HeYIZNko(nz{{j#9BNc8Q z9_%=UqC#_HT`;rwWd49ll$XY&}Y%s^j{wa}@VXg69v zmlb?|(Q2^#(sIq+vTj#LoSXF$(pPrWq2Zj9Mslm z-I-vDmoq8^5M|3d7Bq+2)AgcvJ9ZlR7$YMoGSc+$r(tE?YD=RegcMu zyqLD>wMy%vA+GkWWl7Q^4Wp_KUx{;OseItcNF&CX3MCtiDE@$#M^V%6rIe$Lwq4zzSZ zTRnodcCvtd3VwB14*%ko+SylEL2~iY)=FL$dziEFiX*0Z=@KSCAMFo!U>-Xg4##1) zoMq*jE+-3lTP9J9nbm)u?g2vykByxw3k?RD zO55|`{iLK5_1276S)0t6cHnHsuSL^VR#2zM>2puOX%174C%#y<&zXo;$7_#U-*PSK zq?*d@`mz$-kR%8Jm(#p4x?e$vf6)ry4gLxyCEWmcaOm_xkbnR-&cj<$Ouz3G6#keg z(a=Z+Hq-0ZexI{FqX~ErgXg6mUuJ)iEh#EGjZap|E-K30%M_ZO?;_YKDxqIX*9uV6Rmk(>@$nrXw;UhO9SX>AzTA!G=l&s&7ZFJ@ z0pZP{pyJPY$uuz3M7>?WuK1kGtE^OVW-}rxDwPI!ZdLOyhaR$PpX8qVLn_p<^mMDE zQ;`#Q7`8Xztg>BqdVPSGe})7&!sNLQBCKpkSJoJuL4z{oCJ=yM^E>|doDf}FvIX8N z;F3YLP8TxOffKT^u~7!66S=uNuqY2(TK+e*lsybC0v={Az2=7o1}YyvemvjYE}Kgl zfvlS;*m^g2`N-c@&YV9fWO6}yNbPML_qI?t8ysO8TKA4i?jXN?a(}WCczh2lO9if8 zMb(g6cV8Coo3c@QXVI7I4y;?d(@ z8}0DI>7HcN@as|=pXpWKg`x4FqL|4Lp^``^*5GoHjdlWV3(qlQYV3ZdDO|s*5teH$ z)_*vP(}4|L5*ha{BI(cHYam9?g?z{TRp>OhO17FDslCNv$Z;42{hY8Jrh|*~j0Ky5 z3iDb>#x>N)-S|#8-4Hk)dO0CK;}3xN#`7ZHGT&G09U6K@#tZFcu=I^kDAdk;$&OT1 z6sS`|>t1`!c9@P5QpsqV934e-?_7O7H}2!wU?znTg>SA_6GA7!5uiaEP59ugK_taC znYx~)IV&5v9CA63x){hEzOp?PO#UtP{RlE3G$=^c!uIFQ-PtX2zZAS>P^pzGa0)e- zGauY0;8b53CYRp^ejmO2dx{V?tzb6EW+%qhulrUWeY3-O7Q_j-;8}3tb8Z-NEg8zquTQ$nJSbyUxC! z>mQwckPH+KvS9D9pv(e?Tg(UiinERMRn}jKFaABY-^U;7{ZtF^Kj6Go-3}AALtwY? zhdtBY?$vD=!~UkWF;kHb2AS%3@k_Rh0 z@zdVQeolLrjy!WLEgibV{gLeRdW2PxI8ZkyL+5#+6;Pa@iUt8s1yw8VP{8~O{zpFC z?JYdK91PVopO?tLt?RL$_qGT13rTW5UzRcaN4;?n!rOo0X-C0`t;C|N3&v@r{b({YU@sI-6D5=ansU`_y6m z@T=)R$>9FE<(eS)^dF9eRhFlOZeTDM?UJ}hOSL-`R8egE=00aDO)}N#jmTWLD~d|?$yuF-7SU#7Q+4|Y>!R{OKVcP2*YJHmUKNX zooI#Dc6P68LMn-g;HvbIy*smh{lQF18l6&;q~}7`5?zHE9R*lYbq#G1IR>u02x0Hmu zhGJ?5e>z+(k{_#E*`T6hua(q$t=>d-BIawrsZ-OEC(MU04wc}*In!XWKTxT5+_?cO z=!K=HUTF=jNz`wnYtA5m-vz#G7LC+qJvK785!o)xF8}9;yd2trx!KBhsckPtG@KJ*--H@ z;#6T&ePL2~nQFp|*;gImqe_>b?R0OCDp#nq5zOO<>MbsY-Tpp2vS;>He)wo*k#<^% z4`OD4oaSoi>hJqKUyr#05=m?x+GfXBTR3bNh-I|nHZUS=3C>4Um-dE)Izyc^PN#6# ztzLZAsXZQ%5eka$u-)4S1WyTeuN%PdcMU{4tGchL!roUgwN=x*w-E|qc$z)_BM~Dg z{LvW2xpELr>+YCy?-4!K+4K6iRYtH9!JC-gowixd0{0~4nJL_Jz8sFgVMh(fA61m0 z%-ILRml4zC!>R#pm#>X)^pkKh*Tl1ey*8?l6L@ZX+ERRQe*V z4fKyza&D}hl!bnH(JR+!?E;sTC2ge@%L8XWp|Nr7o4}$fz#a}JCR;cL?E3MPa7IFFqX}$FL-7st^+&&nmtqtvsbH<(3H{jc)vEF ze>yD?snQl=-_=8rbzTB4Hq%Yt`mnA%=J;lWUxi6e#&%nu#dGJ-g;os}Tf_G({#;H5 z1(3CQ44qn+#AaKA6o;LfdfL1l$Qm8c-%DJa`VoOJRrYk#Lu_sb-E@>Zp4a1CwTbpz zG>VfM)wtIV)#`Yg0|-0~HTb&?uYUi7!^VcSiD0NKg*ZC=FkK@|7H^Y5 zIE>&czoZLn?fi?F5)^fXFS%?2V<#uv{%$p0my{coAL?{D&t5ZG6M0}b?H?DQ?k~=g zwux?4UIr&mp7fjRLv`S^cdTbSIr{d(Z0j%?T?U-VLf9}Y2s?B(5j7F}+F`SDri4?{ z0IEL?5%xVTnN;YIh0(ph^Q2H0_BDsvj%g>=;W{NbVbzoe)c22f9tf2r^$n(;d3Zuk zsC*g8dRB2#Ik%$pY|&jq3kyl15@TC6goe}cho0Jj=hg8=x*L70$%pBj4L5t$a*6G0 zLiD@G00|3ouHFe)bleWP!wk@NS>s>e*HK7?o0i`ltxzJT)n7l+IY)20Ym4a|5Yi`tcWZ# zIsoIZ^!L$a4;@vwNo#-gu)~0~^1fI`y?k*t*vHs~LFtIM+1aGtiJ^uq76fl}%zSu* z>afu@QN97j2FpF9h^mg3G<-G-e4wG5!GZ{-j?PPAbd#mDgQ;A{H_|cR;L~cMM zrADkU70qfqhkfc^nR+3;r&<|Tt)QpRf+f-J^;i#Z1D7gh1s#ybcE{$`SN#&lW|q+XXyG|S2WwL| z!xx7K$FKfr@WKT-2^D#_bn5@ZdSjE$81f^vIvjFBs6P;opVuX7=A_BU$(*H|^`#aM zWvd}JmDtWF4n55F_@0EkYZ2l@3f8$)#JbE4whi?S3{(QO$`~-E_KgOMsU?053B6uK z_SvnwxX+*2*eEHateDe?j1o(z2|br55htS_n1i!5V&`gKtIsgHH)~*Ic;T#MZeE@= z{`j;i&cA_f7%E}XIQLrL^f5 zdH8Aib61$-M(({!$h5k$&>e%G$G$hj0ur-28&uHI*}ymWOJ zlB}h6^{oI%zFX?=Gv4`=X(ktnZJ5($J?Wj!_$1+Zxdv8iQ>G_!Wm6UD{&xg^dyZ5p zt_h8voq9l9n6xq)HaR<867BLKDJn#vqC7o5(xIzKyo2_@#01^`2vqiu#rY#||0Dnl zC1qADh#J5>&Vo$$tbe5hL8F{}pzhYz;?`>@E=hY!0GEaec2=$5$&<@-dJko@+E8-w z7zaFVBQoZUmC;T;=X8D5&JSxMs?V;;)GLfkrjF*D3aVRyuyWnO$!$pihYobz`}_Rxbm+n4s2wpe>-B5&WTUuE-C^BTSgwRbU)}1Jh!DEhE*xcu(v^-v ze6|0)R~+*@k+l|aQG*&`jrBSDqYSO!m~55saLr)y`doU!8uVAVg}qvwuqaZAFCylg zou=Rj@?vDjF<0mL$s)aLax*uML08t_AHkKSN9$BO4?jpY(PDV^gkJechCDf{eKE20 zwKzJ}$|w`6pAmcqbv;D;@|oUc7D_^Hrv#T#n(WYxV?$Ai9$o9l7SD96STNok?`HQUhsynOeMJCO8V4NuvkqI1ei@;C$j-bcdAoS?>kk#x zDlV@hax1D4H@W_io9)9_^JA?Wt3#k#Whkzhi&?-P|EFWAWb22zkYt{_XQ8P{6cK?; zg)QxQd*Eb-R_Cy$q}J9D3vMgE(Ep8vhmB%+p1SO>tX&A_R<<-p$}0uPFqxGgNmb_` zs61E?YEk%-_J^>xmg_n4E@3T@pXZN672LG6tGC1v!C?^1)_a#Q-#-XEX0Y?ef-cV; zH|<3prMwq?0`eNVrp4>Ct!<@t5#k&-}oLT?Cp+2HFI7IWd%>HCQE_nV8AT$JW%D!|Y z;SGra6-O5R_i+FEN_JL?Xo z7^TCZ6B3}3#njZ48`R4&2__8_jlpy1;VboNll%n7(iHH=B)=k8379BX8gEHS(;M#o zWRu1t+222r%u#9P^un_4rVnQ^6ofO+f#@v#AD3w-XKUWa>WJ1l1x*j+n_5{~29btA zjcDKaI1t|SjEszxm6bm~0Ha;HBAJ-lKWe3qsQ<%Sl$Yy{I2}#bU^i~fNTAk05oTV7 zUa4glIEfl_HFL@6`|0U_$b)Sk;E$`TEA0KNhX#g*E}otXm|=A_HTjDdpDm7818=8W zjLHS)Ux|-fbI7@YmP>1U+l~p_ zB4UolO;O~^a$UgS$Hm3&sj1uGE;F#*eYs)j)#16hxsH($%ch;x5-6z&nQvYYkbe}k zuJr=ATLN;$Go9aZePIvXy%I6EzZTeOrUtNr?jJpJ#QFB^@4+fc7^Sxtlr*Kbw6q-I z=ZCgMi>%6Ww`S0E^9Ry&Tpr@h%NLuVm-93#ip-{932)x~cwI+_ zYRAo|g#L;~4=O#~1)QbZHV$-NbO&<(mde*+F`BvfHYk@4F9zN1Lzi2*T~m56tFqi6 z8SOa`A09(1<`i}Fc>TXV@p|bg#$VUg3&(2xpt-rZj1N!bTmc1gO!A3mfjl*DO8t(R z25k3x#b6ABx9&ZNA(V-z2cFRdKc2Vcb~a&ET2mL%J7mrcqKJC#hcRYn-MO}_pI>E2 z@>LAD(=InFOI&;FJwMfs8#rR5ZW=?q_@Jmb1FLn;U{y4vvnVSy&dd$Tur{ z`SKa8)|MN70RZ!#nY(-*NTDuIXs=vLL+1l@O>!(%_3~ORJ_tPg!OwI86Si%ri37ab zsGoVv2&0w=?qet6eYS^uazHc^Kt300|1)Qi@Su_D@1(vJ)i(%efn!LR)5s5KQ#g?;AwR9EC`jm0>qfN<^tnHf#bb^qgh2o zyRofLHCvydPw_9v!b~7gTah3k!H_^PB-n!`VTrA+t)SqL)ieyk`*U1j14z{F!&&oz z1_iA*4TF{;Vy#^UGT=ha6Hl%JnfB2AjcKEZ`&olxb!w9Q|(FW(B_QZgT z*A!J$D2vr3qc}ySNfI>_pbr-y@{BN@uU=iv2>S3ySR?2nDAQx{_64n9mP$;76DxlE z*Zh2Di|o)d1Fn28X9Ey2$jy^;+1?1Svb8lRJH@E^ua)P6?&y>h%W^d!E`W38FI|cS za|Ljh1DNu_fdc@M5XwHp2G=&=k=?HZl`vqVPSRT7E^d69(T|{%?`50BOkWO1uB3s1 za=v?4QWv&3HmDxRd~PNsnW!hWnW7S@4tn6CX;)WQ19RiJu|_Nfi_!wUfP+`WHiH1k zZpr~~`)|C)4L>!`B^NLaJV(A?U%uxx${5@lM{Uv>C7e|zo2iXb(AU?89|;ZJraGV~ z9DvV26KrOvl3}X4pk^`Ay>g?cO**ktCNo+{GQ>i${`dtXOXa`vG>^ekz+zI1C@jPo-{k~=g?tn`kJrEYJs@=Wp@ zn5Cc)m9;>9^XNF2AHWpv>BFOeUUDoA!q-$+TkvtQQxphpr@D`I?~p5385eyv@s9@o z84=nSMy(EX*<34PQ#e~#=$$*KElTW>l**)}q$9_U4V7{?<*l#$Ub+1XJgR&d%$(h7 z5!?EqlMJ)Awl*mkj5~Aq@Zo@BZe&9X`M4FJC|9|B4OzPVJC&cKFO5zs7_3j=Gs(Q! zPT!%?T?rYQV3G0%-P!N?QI_;F(881{)YUcMsMD@F^+i~?t9uZ({9ALI^*F%Nw{2}q zDsG3mYp!S|0&eA^fV4#+S8ecrJzDmRO;1lrN z9t7M4RH3tXF)!S_rz2XQNY}zzc?#mw86v0NxLd@yPV%Z2Bh3GU9Ps*F`j4o|jm)^& zf{K6(vO^%BoCnZn5Jc8%Qukxh?tt~42w2FgSQNk|xdVlptavbNftM zS)fx+;}#uWxhDNP9rfAxv9Jc&Huh_N}9QFM&X&*mJ#|E>k;JhWuOw{Y1TPVzFocz7L-pf@u zygtDZ+>(!YM%uoi>j(${d?IDfzix4-e`@#>mUiFuD1a+LApFI%A-f4DNMR~hH?}4M z#+&Eq&}I=}Q`Q2n%%a%x_3y$DmW%Vfh4s88diVd0MQq{M$ki+0G4JLI!UsK|@IM*r zzvuqXMpI$ns@o9nUH~_@9220pJ?{Ec^9Z`1Yyo!FUwEbdM@xV&!DE7=eJdUq2QI(~ zJ1X=iZP4-kw@M18_z#XUt&V_QwnsL|)qgA93^-u2Fks zI`zL{?Z2@PxLy8Fwg7i7r>uW(h3-QDFv?!>Wa72-$+S2g6L{>884!T$2fjYo!sE|- z|7%;D+vUX1Ic0G`G-2e&JdXWTL8ti7!D7+w-7QT=i~jF{tsi+50$%>!LKbIa1k{F9 zCS7g$gES5$Ra6G=Mglw^UfrYF7orbXDkjWd2B20*^4E~C-?U3V)dB#oU&qu`n%x^y zoMT-CKMRCYd4DA=iU$CS;S;5K3d#Z>wlC(ciYkm{q z#6Y1QRv?gnGA>fA*he$UUrwd7hRE{HilQRvVI#`~FxYXQVaB^_hHPLnwXjtPc`g$- zSg=NJ)7qWuAXrpZ76*!myRGcKH*St&fv^hs41nO0;a#tzp}E^11S+?>NdtX@g9*6R zY7Mb(qMln9ks0Jcx{Z)ZoiW@0(@vyQzyvf6TYfSl$0b1o6K5N?*XjxjZIPtq4AtPI?_3HqUm{3(^OsKi(*155&TUod9*LLfew6tXAY#Is^ zDMst+)ax6niVL8+*TP&TWu|fLv_wFt!L3GI^>Wh?+$nVWJ+`N3u(FiESf3vpjIoj$jH=0N+_pBJ9IeYJfdyVwT>mpq0RdD~C*2Y=I*@I|KUw=QaMw?a@_c=j;q;^A6HBqmLkvJPl^D`6+**s%KAGUi2s&vl! zG}XpQWVrPtHvv-=cAvHUFCvf4ZP1ivzNLFWZ8b+qa19vj(}xdRZR`A19oApHhGVL0 zYSODo_C4{&Niug`+sub`)pFvhl26a6r+WtE?i*La_q_kT&)qKWsffMT zN3ZYsAiJ-BZP_!__dZtqZV!`oU*A6{zGsu|zJ7OmPY>>W{r`uZPxZTQ1O<8%ldc{2 zK>phC^q6^N^ z@VP1kt~+aW&T;Ky@M!$`(;!ZSl;ztR)uO&152SUMir4omY=+ot_J537u<%>!db9Z_ z6)DwwzKWDGCAm;~(6Oi^F23VcoaZ5fg-^B*5PwX@7BlTGhf@6s9f-IKb?ifh;_C1w0KhKgxMXh(OOo}Id59c&#GzS2)L{7ui9xUEa+`t==JMu zKJzc$fzmU1Ew#8zukF!L&8~Z)A4JCj{lReu(r8Qul5$PIzr@Ag8Ctc<%0t~g|2oo$ ze06oG`^9ky*lkMH3X9v4#j%X^u9;ZOoS152S{|{iWXDVJlvYA~yb9qv!h@Y|L9Jk$ zB2bp$$E*@gy%Eu(qN0zwYDa&nyu&`+N`ijS> z`o)x9_*H4K55g}5VDs;m46y>@g2=_mXbCa8aNNo<*QwsohOqgqMS;C_m{Pcd+_mGU z#4R(r(E>WA#8PzvT`H$iKBE+50w2&57&>hcFmdcfgF>Ig6v}b=sOTgIxxOGYcjbbwtgZQWE^oLX^(+V~a+^ef~yKQL`V3 z0{zJOn+FfU^OqU^t}k>gSgVb8VKRIXSUj5sWh{zsn!YfaUH=G|*NETRiESB7%`GH=JgQy3bN+im|I0;&(VRn{`li)BUA`| z`JWvo=X4?!LgfWV{4RApyKE8# zU@!BO%Ht&zltV8kKD??GD)wwH{kvdg9VmWudr_dT`ci&6Qb`9Z)HCqvk+6^yvcd00 zoPQo}BGKYp&+OGsu@4)&F=2?tce~=Om6&82v~lIwqEw020BJax0+nE_W2oM5#JixJ3hCqU02vQIbnPdutS&=aigfIn203kq_=P>76Ox36R zJNKS@`~JT3yZetYWbd`tTKipVul2mo`@FiH{rJuXbe$*zPt(;$mzU2~dS!Lt4O*So zj7-?=9H_AB#@(Q`?U1vqKPs=_O=M-jy*n!9sSwQ8NogPo@GZk6J|QUv>lS#g_n_Yx(uXHKF&rtZ%#h;7gdQVVs!IZ z86GAZL4Bji$DADATb5xrKaT{@Du+UAHUz5)K5ARZNzHdifa^1$bX8X}HWun8t(go_ z=KT3&;wB@JXkcg-Yl?2W$$ z7ZNl+DVa>jQwL+8?ao)>SotoHyQ{p@*$QrJe9-Nn_|YqulX37>t7B-+#*{~ zWdpS}nUql38tMj>=V@hUr-x{pK_Dit5Bkf7p-{zRtaI<2DGBF;yi?-O>xDT|6Q(-1 zY@-D;vx{$0|DtrQYUmZ&)Y&CAFOL_xahCADTP8DFtIktmOt)&t+{^5 z+f~Cxj8jW~Mn!EVM>(r|%dH2V`m)-3&(J<8r_CyZhDspZc zSx#BW3@8<4`B(O6U4~GjTRf4pdaLrJsU`PePUOk3^SFZ{GpLa-Y0J``_VlolPb4SG zT6%a~ZeDT!^XRyPtf_CQXG1bQ_1?8gKIK%Ar4GD&j_?CD!nf>UR(Txfd}mM;@ybD8 zJUyX%2rfN1BV)*!8AAqz-<3C&wH3T0LzY*^G#V~cv1hIf#G;hHdshV(DZ4gN{y4EEp)@?&x=CPkd3uv%a*aejwB*hVE{e&#}9*} zi$Rq1e9r46Rb?!#a*7HiTF7SP2UpqacyuOk1{3_a`cx?*DZ$X3H``kf2P*U}15Y$y zZKL~4jErfhhITV=*!arW#z04dhv1{#EoHB&mk{uiS$gsQ~&ls>Z zfIB0-XI5KL>dDm=l$>?fO%gLUvt2E|s;+rX^ca`*M#h!|eC>!$-kbqdQF^{Vh6IKC zF5E${&GqB*I9!8E;Lbedj0j3@cNqT8dw%~08ZF^`jvXpvl*2#O$a86U0l=?ht^DSVc$-QJwa;A z4udfHOEGbJy5$kbF$@a^^H-Cy7i}Xl!(^m%&0+18D2a+K{rPbhjn9ig@JNmYS0|Em zJ1Is8%!?#X;o!@1^VGli>md3`J6lr7;YruY{{F8^X^*PE(k`iJdTW}Rkln)=Z$#lon44$^V7mtB`} z2hP5dAfdluwRSM9!Q8&+xK? z2Qcx0evdc0bgDycGx>11{I$j3RYv`P!wQsoD=w{@ZZI^f2==>$g#2J9Td|Nnp49p~ zApeW6+!)s*1^f!L-^9)T^yNQxzsi{{#irzpy|niPaKs+ewJ5xY>)&z6HX0u^UE&v^ zYYLtW@sfv!aGsrpFt%fam)7`2!~9!rGcT(2!?}O+yx0Cn&@AX%Y}L)$pITS7(q8wS z_>~b}?k_oNX23HTq5LXl(eLs3tNZ(((l!40(nj+9hsR~)r>5UrG%ggH`X#!#r}%kv z-<{SB;RcsTFRs|6cvdLo(g2iTC-?Nv6RJb=^Sq5+=a8{ubnBEyE?Iy2^lh&68L_6% zk&m1OHDXwdQdR*mcpiHL*Y?G0mhq&VQyQZ66>9O{!II36riUPJohngyh%GHGFHZVe8_G;nwWQSGLjI(0xOGx!q z0tJOy<(!JBj{b;9dug2w_~P1J50r2z!;W5ikJ@p+QaYEc7q0g@?{Fpmw%}kIaTS}z z3KJ)3I%(5o=BTLg&%SBDo%1xYuW$13{Da$D7$2Ga{@-t#{|Uko{znMs>OVm^jtBQV zC`&*f;h*rM*nh&0YgZv3HZ zXHTbczs3o#-tPIh_K)xPP^m8xyCdSemx1S-23Q1kL0q!+arLRypvX(G&Zj4TC-63~ zYdU{CWv7U*G9Su+{(7HWCIH0$E+1SC$oosYP(IJi&5h~>j|!?H?M3xrPuu_zMB~L6 z-nfMAYuN(`N1Tn&G>a;fD;ueiLImlq7XxiVm<3V`<_JU)JTdwD{{_CU&_cEEXb+88uwxJ@Or zngHsm$vL69-UwzO{u>}rA--JA>qcDb%8T6D`_DYq2UgP0j|V}eO0x+o=-1 zjVc0>{rksb}FR zGgdq8IkTrXk*yaR-eBxF*BU^%-+&~aX#CXmAgJ_pW)Q2B*ipT5)_7t&p`adWA}l&( zOwL!v;&)HasuQNV|5QZ0IMW`RX7;&YcAII_CZ?|r^hIFLv`H?aeMC z)p9*)8B*)#-8x})i2La5O^qtQ#5{9pfcE*ikh}Tj@w_(d$mHn81l;H6yMeRM>8D>A+hF<_$sJQ! zY9W+_Fw@RtPAjB~L3Oyf!$IKED>CQ9-_i6Y?ld%>Fe$IhBz@I-p8_L7mvzZ|OtrmZ zPV2zz6k0z~H*(IGW^@+$7ehHqrK1c;gyYczV8a?vL3p-^mw)*H0jSN-cWRWnP4n z;Og<$fKpPxZS9vSZS;@3D|qjm4`t+F*vu2Bx6s)vC(h>8!)>C#pyE-#TICXozwPvA z1*8UKTQqnH60E8u>nYQ{7eE9)ZWF1V-3&Pp zqOd&6wv9*nvQjWvag?moSyB38QIVyEmF`YUz!MtB$BF?($}|RDg~9?ADm49W*Du}i zpJn2`$RN<2qD7nbJ_J*rR=nH?wFSDd&o(||5U=q?hVt4UNzacqLOUMA}BxzStCXhUBUY0lr@{Vxel-k zUhUSmRn40OkdIfOhJG$NPOleRQuCs=ekz#W+QU%1iF>w0{s1pbs1M^<%eu{T+u7<- z84iIOMf&Ivy#vz`m^)NG{c) z@Ksw?nskorSnJ4()~+7D=h*%+$PIs!|HKE&>7ZZfEQyo6{2z=C@V> z`8r8D17YxstvWYnrj@>Q?<}D222MnJLcYcIZ^*QoF*YaJr%^*A<5sGODV_H&F7g#v zc+km`R+7q_I%tXF8P#!lb$|J64zgTd)QyIq8V%54^hgr@Vy`fuh!@6|7 zbv?3qMg#3-m0GFXe(5@AI5lfV)K0I8e8m>49k_W)n|s4X-K|BH$0?GVXfcJFML7<|bi@t)XtEcIuy@RfiOAYj1{8Gs^yRyu^#&~! z6?VK~qLPFzJ*7rYUmxP;6RIdGx|+Rg7yJYe4MEVBr>kk!o!HHBWuc{Kf;L+)r&Q`|T=S`5~rvleU=mYd)0s*S`v-3G{&GI+MKojW;U1s$B)ik9A*U8|7o(U%*2jY^!4Cw4;qO?g^%h#D)j##ZdmZvfY8!MLGRW&!3yI*^kU?1OG?lot_KU-{m$9@_}`W# zgS`jK?%|;1=O%&PA3E+Io_lBXNSpBBA7B2Z74>0Z|HX~}wdMTNjE>&k_$cg*!$z#; zM(oi-{L8(A`CQ-*qp$3VgRD(iv?hO9Q)r)o2F$|k=xY<^hlkpBfgF7H$0+*^ynS=WB+htM;iPOV03`vDW(PcdXH^A>`i&7z0|3n9k|+Uo*!vj_Lw{L z+T(}y)y?dU=bGy~gQ5HkwUsa0%qk2T=jiP%dqPmm0EY?M2DDOG;F2TG5v=36^Yb+m zjWr8la_JQns=CPG+GoLFS4f>`i~ywj`j{*5ypYiRNaeb!0ngF4$MZ@90novUHZ`^Z z4+VXtJfO}xJ=*4PtX#Kl?I*`>y^&vulOQG}w504XQ#fF$A4(@ctbJeyQ}{5;Xm6ko zd#zOSc08@D=W90COL}n=DK*iCi8%Z1dXE=Tp-aZHf4H+ZaO!S(D>)CAJ>mWGWVB(3 zx#;}9zHAZWv~8y3)gQ+LLLkx?_*~K4gNZqyl=*nkh>!bZJ1Q~+0u>v#3f&mt63rXS zJSVp-$=TU_z>g2{W51M>&9spP0ZV6IU;ow>0pw1!fO@BgCfu8Y8M3CsH4rTguR|gQ zYNydx4xcsxk;@N^oxJu2Q#ldB1?TW{ZPZBGXRrYZdGiRC_rC?_WlM~%O| zQOVyCWUmFt)!4M_%XI@mpkyEOW&wfxY%458bF-s9j+VH@=4~blSK_O;Sf>Iqm@beJOkBO_v^EOQ{QAh*( z6|L%>*;5V4Zssx#$ow2_&)$wGDIG|N2t2*9 zPu&C8$o`ib*@MEs=l?d||FvOvSl<7$UG)F(&7Y#PyX%vP7ikN%6w}Qh#(;S<%s|Et|&8#_UHq=4p#FGLke{qc-Sfalg$Z$JN5>(PK=&aXe^j?` z(4*Ta!bJL~fq>2aqBJIj*P3XhiVhCVn2vIGgmZHtQ)hP+Fs^zp8|Bq*#xU>pE?#h( z6>f2Lg2irSGXBH*fJt%jh&#{Dp_&ja-M?f>@x~XZk2C@&Eh1+`TWTp@Op4d{+79p~ z{ILNB(*FksAM3x83DC^noE%%vCP`r4(@) zt4hfn9qcf;Kc8WKun=G$F=5K^-C=5~w{Rc50H{1`XiwJEPBY2s!7aDX8S+Qr%UU}& zXEk~f*=)9_NVc7Ad4TivH0_xvJ_UVE)TTfN5TtFVbhpYMVPXBGBrC>#9*GXXqum> z3hf7viJJrQ@*80qygKa+He;Kc6sHFPYK$Utx<+Ew$6d9+AjunX0unkL|WNgW~SWvaz zW`vY{(SqmQ8#~0ZrC(bkU99KtoNdds4+;soU4=~}TB4ujb$1=uqJf$!8ukG}BQ8EW zJ(r(RjZ%x^flX+sTw1$b)<*FA#x>`6HMr{PYEO|%ZC%6^+0&+psxdD*Qctg#clHj% z>+v5qq}Y~ScuQ@o^8HC4XXU5jU_KxF>~xf7qF;P@g(kj@2E%?GG`=slKlUm`Sch+Q zfwz`zhLPjVCbJteLT8=qUGxb;6DI1tIEq%M9W(ZdW!rG9zHq=ecV<$jv!5i9l`KqK zI0uyuMoKtbv6b#}_6728SEA&`Y745k6$u>{P0awUE?~!tVl;@4FvcpqIdUOLg>x7^ z%VbT`ix(rW#w;?9>o<3Lj>lVfnn+JHl)-W53rjjtN)y%MyEPl3yUw$#eD2!9raP=C^tLhSy7LyG|M-D)A#^6D#fMc+!IYK)&dS9XEuT8k$soy)V5B2nUk*IB!4s{gS2*{J-nj#PD+se9YfOo73r zV0nycg|Fv3R3Jhc%Xt)O*6t|FK@BaI?7y3zqU8?Z(Xy;=83;s@{Bfqw%m{;9SxNU9 z;AC2#;>w)I$z)o18gF&qtJlg9Ole)}!3H|}@X3B$-T%B(uiTE|Zz7zhF-!O>$2_zI zUczn#%F{UNy*)e>+0R?44jx4Y{x1$E40w|B=+>En{V(f_9c53^bmzWbxP=Lpcd-_4 zW1P5~A1=~@Wi=0H$_K8ShM!%{{9Pj(bnf_#-?=1r!N<+vH>0Fr0D)3m|@N8$C2=D9-;s&j*6gw91o0G7kWc#&8yUtV0 z?aU?dvEe4EB~tu!AeU_463Ty(VvXJz+7@Hi)~khHhZ{p&Xn8L3N{=`2v(lLkf#0XV zf?`)bPg^7tTgRx6j+0=~skGm{2BAOn{!Do_02~Ye?UqS{0!7`E(kO~Orr85DAy|W) zY~Q?ohl`L_cd*ppWf>T@IZk}0c%-IIeNB&trNy&9yQ_7xb zH!JEiGa^@xn{3Ql7n0LRROW`n4a+>qFfB}8n?>skl~e4QH<623o`F zIqr1XLFYwJ#iG?VW_d}m^M^PRq&}xLg;q|sRYeXr#ayD!O=lTQkJ)FM>F2U>j|Ns*$|r%KiY}H)>K;RyhiUyXo2zV@lBBwB5#-}a z`2eGpNYo>Kf#EszR(bl)Hhv+2u+`$s<;cGtFVTPYDo-m9=n78CNUU19$7{5QE_at$ z6(Z%0S4fp3R02Xh+p?-S#P%eo^VX^Q>2^yU>k<0b>$hbt0LrtGIiI- zS+I0)_kMOsKiMM``zNn@8_kuwUG636xsONtDUbRQ#$Fuf?7XhRq#(Pdj`o%D$yMVE z=0$l!I;l6TTR0*YKgrN-Lrctx0>%T*imS&=4I&8Ud7|WC&OM(owws&&NROd=PpiHa zaw7TXgI+q=8-U-v)4s4$I$rF~sMxnPKOZIbspHh3$uV=*kZb8*5bZ5`km0E9m*tR?7Aa^oHtPwJjy2h0A(=bI7!`vEV?1C1=#l<(HE^Vs$EJ;*8Cg?tb?v>GV~@vCzZ*@^m-=b%9Rl^PV;2 z@wM0KIC4^AzO9&nl}Y<%>yI$&3M+Y4U!{p&vEglQQi6|eZx6}ZKfbKET8fkB_%H-k zkB}z&*(b;M5}+TjzGg<^EsiDrb(h^;&N?l5BE&8=;oEyk0m;j20}=81hS`KkvVBD% zR9#&(D@7GwG<~)ry2!;|N8cExu8SiSU(L$5n+kaHlQ~t&i?(d(UR6DZ(3{QG{YBcp z*wHD_t*u0woSFS*lS(x070dCL?WV47m2<_WhT3K{bCOr=$=fMIDLyGX72A(zzl!AX z6Ipd4U+x>3)3luFGI=6)Z`9*CCC4CP#g3fvv!W%fWZIyszXKSY<%3-YzY0E^2OOm*i4M$lUuY>*H2Fv zmnYT^)1oTGjjV2?phZ7FrK|EY^sahdS0x#2O(Wg!OJA6kf7YAJH4EyyKrMY zh!j*EmP``0)ddI@3$R<6q|qzq0v}b9Ynt|pm z!pLb((Ez5CU7pbYHJC0FSLmCLTa#d^HWp>8B-LGcZrN9TC5oVGq60bA9ZS@(G{jC< z&sZ`#Q>!W!ZC9HOL^Wdbk~!zigplJ4KRV}aZDZSA(3}_(V`u){Bli@n0=b9N3ZCbf zmbw2-;0n^>*XaK@cwT8nMP{7AeP3_C@9{LtXG@WyTou3DTReiiiiOb=zgy5oDU+(X zmK;`H=o*p#gWS&OGHizvnpiab%{lR=(B*ZhrEWfFXxv`({RFgz0!s|Jol>){$^TkD z&3EQScNx8M91s$cUub>tYHe^#awb?o8{a%b8cbgNl(!OZRiqaBLoDN^o23X(dX+r* zL?QEPW+%VvPPvr_5g^2|)5>u@)yYgtvDVK3@0`16K!sW+5nD!T-jgd`u3_Wz9bC+% zy=a+GzZ@Ka)Kh%EG`(WEV`lJ)THU!iVcS9CE^R)xKFodm)G^^%xhneB;@$el$l}~q z=kb|G6tiEl7*m+k~lF85g7v zFW(GbS`iBG-6~VGMP4P9upEr2k7I1|fFMe!A&Pe{$-T#!kOrdARYV zw%r=5>Op4em8jqmowd`1qP)vm|CfMhsk7Y{<&`EQq4`C#!CW#OQ6(v=j(;U4+;*oO zUsMWYhwL@BKJ6OJW7Qf@Sr<(ZwYf7gP7B;C(qg36j;sO$xm*b^QR!9FLf>Jeuyv{P z@<=Q(D=z~nne|0IE>lo)ODfW3eqkiN58pzsViIEv1|JFX8H;$EfCV8&#q8qth>uuX z&F)%>n^(>D7HmB~^l~iVEPdv$iZ8e9Xr|0X*@y0}h%Sr^A>_ObInEEG^z$EF--;Z| zda(mjD^Lx+@6$Yv4841I%h#3HTH=<=d3C8T7QbU6yzzOYYe1#5TRFM|>$UM!sCVrf zZfh;W#7$K#ChY`Vo|<%CDSo-B`pWb-B4J)>!r60eyLHB6i>R@VMF-(|nRJ&iok)~e z%UD63uxfP@zL=brodicySnkJ4@AoMs6!?N$&J=7<>47Ivy1x_`!>VP6R+Rj z_bsWV+s)zSYGpC!X4@_YXTML|qO| zN9dB`PbG@5upg_S(~;LW6Gs>FEr$^|wRD3(nXHRUx2;Aq1kxM3z$pH*A03Hn}xa z6YUearKPd{@pa((L!R`!EE_}vg5z=gwUt+6+(mdS!`L}szR1!O^*7~i;Era2bM`d{Qn$0t_t+{wn^K%g2nS{qmq-+gN;A~F1*?{10 zYF=#PtQv37*SyBw(z1DQ&<60*jFN80j5bEuWAi}KHnJ`N>GoOg+b_4a>Il~=%ih_{ z=cBn(n_GMX10y46AQuZXA$E3l zK*%1P-D!1D)g#ZOz+>~R68kM7;A25oXE)%DE}Lt8zgGy6*j(VyD6gbM0PP0y3(i1H zWXFLBOR>*Q7c>U!DYiNfBGFvH>%j}=}_QlZ?P}l>fj7Vz4cI=!lEMz<2?4{dZCUJ)a z9uOP=!{-5z*I@#=j$I(kE)Ru5U++t!0O!p&hvqL}_`uUsX74$GtsnuUqL@S;lyUq} z{XxL>uc~MegV>@69z@!{_7w=RHaL8kZ*>9b;i~TV`1r+reH(DgBW+#*!?85+op*L#*NHRS?1(D*+TbUPBHN zRk_~&?W>#0%JI)n2<}OEaOdW{Q6M-M9Cw}{M#2jy^nLyM2&fJ%f6*3n0z~!>&cUq> z?;M$=3m61RYJr8RikCD))PU%cF0P=U0BAOb_Z&DR6e4~bF}130PoCV$G)|!pfiT#y zilH5E;NN%y)Sqfb{aV}FI4^;&+W5o-5Q>ZX<9=|yfWY+8W7{7%;7;;;*9(TO*Hvy# z?R$Loxkr3eGkC5UjmyaNo#`t8qY{WfKu(;!qyzM_8r=^n%@#dE_$xY@ML?)<3(ZIG z?$q$_%Gw1(Zrr$`ivw>Wn`Ga`uk}glm^H6l2TfuA1$G!KA*c>gD*-_$J@T*F z2ZXT4CWqEgYdZlF-sxSH;`3}O18y~wqZ|9*HV$y~${a#MG=TDxudlE9^Q(Z3wXu?^ znY_EZi$bGoW=jsLHt+rSVw6LdO}N|*x#h9g&}cBPfLG}t(i_-pd3m|_Wbx0k@jlcH zGayh962h`5v9jf@r$&hBkrBG)<{%kO`JP_ORsREi+hF$JTP(NJsSOKW=Qq`CfLuqr zb)j!)`f^n$?f59*i{+GtZk0kcHB+o|DRUs(Nwc+B1?WIvPty$=JZd}n-nBoX531_( zr$g%*&g<^!A%t$o@vjYS7=dit=YXEcw3hgue!je#+F&i5dEjtM?S^3oUZVHg64QoH2D07H_%D%Y5Z?o0D=DzzU5Ix762!gSKwy{IJq^rB#inWeWu3$ zDiYgZ@nhmW%c$=pstmp%SzMO`SHF_pC=b$OR{bCUJ-Jvu+A1*X)$h+gitxX8orHTLAE$bC+P2d#h-p?C(y^PWjPN0B zH+W1h|L%|fF#&5244JSIv-{Y?6MF|enspDV=l4%cKKegCp{{>=LMlh=kb|r5xg46t zVOyvEiHMr~kN&&Eo7aA8C_ZC^frm!gO@00RpuAt%k=Hk{UYj-I8CcPHlmsv!YX9Ql zauaN&oX93TzTy>{`Q!15a^J^6)aj$n9d_TZ@Z;nx=anXl3+%avaI}+l?}MxCxhF%i z=Rn#dXX?wppS(XGf2eeZL;Ff4MO6A3Y^pS?LeS+A3ax~iYhglfXM~rgW9#N#**>1` zsE#b=y>j&bdEismsPH5UcScl{JJ}bVM`8&J=aZ-^q!CCWa_HPLQL|8ec6QdyXTG_K z`MdY$V3ie8wj%Vw0oCZnO!k_q4lc~#5*tr4Oy;`I>$sTPhc{l8?_|Wx`NAJxG7N=d zg6=xUvsDz6AhRNcn8imj?<=a(pdyqN=i$W{zNrLe<5m%ubPV>hDk);#(-?!nD9xy7 z)~-xG-lTZyxxnEn%6^&r;ehvn%kR%cK)>`R=M^mvbj7lwj3FnPrpE0x9@;AX0}OV- zWn0#cFwvs8CrnFTHDRPkQ$$pxvs?8|ni0r9ba3RIQIkp@Y_-s zb}QFBfzH#vTpxEa*75oY^orv=N)iMv>s!02z$3)ySoQ9>YRU~!a;Z;$Q3N`D;@M&j zb1?qnD#Y>)$XL%BfNGfN(`I{B`c2QSv16-z@t#$@)MCY}jI@YCUNy;pF5X(5H?H76 z*IF&(NW((8{d^rIWl3oeWcNO;qO)knwS`|PcTCl~@Mhq(W5?9FZ68njxLK|wg#oIO z3B+z;eZ$IKNa5S@t5Dl11GK%hRm&-&TCo&nZrXS`;W^h^_d>(*!kuRYIaO$vwfiku zZH6vi`y4Ooy*v&WmQ8iXvOL)dTObWtl14&mgkU=V+4wfMI#0oFdOz9SUYAxj?wjZb z&-d^M-}N6&%Gc)U1Pa5;3*RGy8X`ty=3y%rwY6bpHYsqiDOI5_?@&3qltFxI6}(fu zOq$$)YzdR7M<$50Hy*!mHv+0)*3y8jC?X>aIti2$6TaJYAa7p?5w#V9pUx2UpU8`d zlKYd|w*S^MM(DLc(g}X>_ad^VbsT?)2#+FD=62QkO1Y@Vsksn*r|I0_Zl7X%;K<~? z@W^;Z2|pE8njB&Q-hsZWc`K*SIH5-KQ0MjCWbwFGvW<7^hMV!k!WRc(_Dt*UZc#~b z#_d}q(y zDkduVW#q<5cx9nH%O12^>6P+a&}hkes0WHaXfZdanlO6GmRsp+dt{Mp`~6wQLdm32 z3Tkf`Pp8!9wq==`Ntpnw|B|IvJ3WS6TE+raRl|u5!Z%Xhz z=XV3-&oOk#8wS3qIIri{4F8eu7+1KV4`y0^QX-hhcFCJt>mc+ToE&<-71s$x+bj9Z z(#Po(1-oLiuwuWQwy)zzUszaw@cR;p-{$Gst)%_;Gc5ybb6*>RTEW3HzfyoY8lokmiSjh%@WWgXV`pL3ni))!qhWb`{ z7S4*@R+l;9r^YR0$fiw-Cp2VB!`-fBUM?}673I!=+QqPZQ~Ow91(hO5r<%Avd4vA#SdpO)G*h_G;f;>d})=4a};mNkAZbF5Cv zwE%>kwj1{s+Ma^m{?U7Gf5}5I%rey*&!*mty_elB%M8tOf3LrZN61QcQ>T6!c{PPn zlrBz3g?+vQPHRaHT!<->LdkS~Sy>A^qeqTI0I?81H~gs*hLm|_%#_WAiJPGQ#1vZa zMMU+rKOrANn)|)Bin5nKMH^n`5VGG*d~?d-7?&9$!D*{lYI;6hm{IU%%ym=6UnaMp z0Ajnd1@NBa4sA@~#0Y87eA{ZxPto4l@vzEIr)e#mJ#y63X>(eC&-w8Nd6j}PKc&&e z48n@XHN4RY(F+$8WeuD?kx%l0{H!9`e_JOK0wX@U-WZvzlbVa8Na$X!mnaEiWcnv{ zTe<1i4LUmi0s-*~!`X{oYSzDYCG>PRf1d2a4L5umbG;h>dksD5I2@Bp{yCD{yeOIZ zv^Xz2T@5V*Z;Y2QY7i5r*-#;P0@ScR{f!mD*|8ttW|(nx0#W^#4rvR7PUN(L;5P$p zczLNG=}#C5B8fi8`6N?6jzSHk%Vds~ zL_sQ=z|T6m{`w)^-oeS%%0pY2t(wr2i;ugIAzzOE9-gh==uv^O_SQt&ugzS`4B~AT zpP!J|kbje!)#J&g?ixHzjU)6R-QnR-RB;j=iSYK)_nqkR%tg6?Y^mcEZ+bZafkqOEw>1x1oIR@^<9=B>Wx6+kuBR=A z@w^$)JKwrVcr+dv<=DR9=>GE8@9HCSnO02Pv)$deQZHRHjHscKR26Dt=;VS{p*!DC z=7F&m2kXyPF6p#n_d59w zRY|W7#b^0e>2WL3-w&*vcAQtYZ#w3tW8&dbj-EA0^_l>JdbT`YH?tMJ`G!^|Lzuv>ME3$tpP%6s-I$IT$i!F+9A^-Y!bmB4^Tc5C-Z>3nZ} zayCxcH&541+umPvDE6Z*dOUvOlytsb{A z@&;3pF!cG{Z*zZ&S(1w1R2Nd{;}YPEWhp4`1e@hr#Yhm7t1d&KVG2ss2^ksv)R4Vg zk$Pmw8)i8cd5C8!tF2HI>c;qT4P162f7e|$Wz$sOEN=z#djTLzHIJR|KL4_LLPP3# zD2#EU!gu1Hz8I|hhPj_>!`3HPe?RZ`t{%;{g$sK$J!N^#P$k_LT>U$!~%d+u@Y|X?s~qy%Y_tU0|Q5ZJOEvbevm5< z#RA#g@xJ-JeSLjYP5b;=fJgv5O&1p)9-d=aG+yqLA5mrPGrRf$J)MiC^5&2fP2M15 z1I~Bt#;pbQRjdx$`C!V$`lr2&d$loDv#T8M|8zx_*qV1$i5!oeTe^R8kDVZzk6v%D2lBGvR zGV|>>$@VJBYvwhZ-M+JX0787#4mxB4O)t@0?K0`Vfj4;x2@%cjUCRWBfz81DHhtbT zKlbm9F9_;q%sXy1$7b$VW8HS?>Tj*)2D#?PSJ}xO^wUABd+YXE&0$xp?zfuVKmBmN z$9JoOiWbMNEC4O^O)fQGDn)Ilq--`TGbG3zi5x#KP>bCBC}^j?n(I@AobuUi;A0|6 z2Y_C2f0hq+8V{m`^C4*I1rh*(GKW$^)}Zso3uXpJq!2lkC!a8X>B{Es4jIog_?z~# zCTz^%ToYkrA!e+pj?c(QX@7q|Q}bb{|5|u!>-o;Ub@zk>_lZq){20crX%#skpd zduDXlNAZ|>S@_l`t);5@s)UIYaeeE7_mVsNJqL_yubWHNZ3Smn3wx)@|GAs@i>MyN zlpb`mHAa1g736K7SCuGXthr;gJMIIp9!q?p_tH@D@1AbnQd+aJ3t`H0>d(+X9w~v!{Jm|}Dv(rT!@dz;82?jn?Es*(P62(jc_%Pq z2K273tc*2FrL?lpL&@LXFdI82zFv!rKf)Kl=>M}zTWl)W{0@ij zE&KLSaDDsDPGtOlnu7i6{&c`UKb%eeh3W6`%Do@|^KzEsdhQl+5Hhvg#D{>HKvJxSQDvS;`X)W>$cZ!K0 z>EO!9puNoH{cf_7ZH2$fpS~{V_AvOSZL+nz+9Eq!^r#6>H}?=Jo1v5V!JVe+8O&JB z%-lc{C9GhE#g4U2>*nOmoVhPPPYd7ecqwP_I-OSv*7+~ot$KLQ6VC<5KPICy5#Q0i ztU;JE{^T&R@92KhxMXY{>+r2L}%pK7uPA(rJvg-V+!62E57|=dyCwNZH=wRS3N`5>S$45VJKYDmQN^r%Q79Lq#TAG>WYf`=y z4yC-)zkCYzBmf;$4xUWN)z(|`iw&0}A9?gpE+7&Uo2h+Tem_K@dFdY7a1|A$^lbF^ zQO33lf}5EDTpPfj5zUP zgA`faDECL-S5Ca}HPjg+N#XVdf+2PO#YQV&zO1dS6_@fH9hI6t>)ef$!sqfbiWYxu zCVNd&a^zB)93t+vzY0}sSG6Bl|7go)qx=m^(|s0PGuqj=6>)4;%yOR%q*1JF6lH7s z9F_>Nl;_d&7#_v0Q=>o+Eh7smGH{`{Ao@jJMW^o?(H1K#me{0Y3@>jN{rE&-M|74e zOte*D9a-~Bk$km?|9dQMg81|v|KlQA)5JrG?7M11x*fdzss6Wl<*5g<4hhtuZQ$;{ zu%(4N*Aq*}cjv~>XGS?sjvV8LzJ-OB=ikU&{!_iFO9rmQmOId&kYT|2QcId){%kZo zQe7-b{BDYdgUW~$GdQiC)*Jhts72y0lP6c`f%b0MR60(CI z6-F;UBdxrWNFMMfm*&Pz0iac^F9wq#)|z%qq_eM3gEy}~SK(odobO#4-V9H-P}wP` zYmjzHTgXZdz>3PCZQYBf1=XTS#4(TOiJfn?!kCzI2ynu~S$q{Q21QTnMlIHHTi62CM#pr$YlH zD09z}G{;gQs--~TMRZg+#R#ac0dHt*v1jx689d|RzX9*HXW7Ef5N^mjOUO9ThIPc{?HpqwGZrX%9>1{APVHSAQm@4?wiJBbR9m_?#C@xS z(`!s{q}dAhVe3*ui~x~M_uFW*{zFqGk&??+a^tCni| zL%Qu5mlE{J5+E(F2oT20^bMFSXua?69Li@}S(zk#XWahmx$r<|N(+&c-CHaXW$5I7 znL2f(=LVjS%>&Nje)P?mcHNMB+(a>2Q zW@q@`mze!6!Y;`)3or<-x=q`}OUgMp+4fvub6}>8NKbjUD(n+LHO?*0xT#Eh@l&Z1 zfd;sP@@T^s7xzqd|FCEQ%b41VcX8pJomT{9H3S|iIh^1*PZksy7_>R=+Wa|vb^DrV z1#+Q75A1HBUwp3}%l0ug2g(7e2}0`c*}St|`XjtQ5P$Xk7tkTH0PWgM>uObpP$@ZR8eK$Tqj@0^O9La9#*%uOjmphC~Yik*N@-FeC~xCV+%7 z%m_&g^AHjsBzX_ERj>Dbzvunl?|Gl+J3oJFPIAuKXYaN5UhBWs`mf*fw5X8e$#cUy zul?;tM=3$5VyuOtVle%cVLguCeD<;d^f8=Ewgw?z(MFr!B3UqFe5xhm1^(>t_1v;k zG3lvg$JjO4?ck`KVi!&mfDlCmp9!8-} z(xqxE&SrZmE2f!+es7YS!`tW>(Hj&#KteOqXLr^qTLN4(h5SP_V!vBtT! z9`&@=`;MOT9vGdZNCAjxa>+yuq(Mh@(fSJBtP3T-)!W*PxSG@2ul zrqp@AgxQr|-8r(_qOB7?<9$?Jze>xHZUvvE<6gxUM>s9iSN&i%HnpZUvMF z#cq4sD#{fN933uWR-J;uwEQTt9I)8&|8+&*t7Y4bWH!vhIl@w@0H5y{s{nf>)hT&}2c0{k+ zEIrP4*uuC%C$|Eir44mfDIH_GE#OnGm92-yE#Q1Mo{fVBGWZt}^`l+3nL5e)_L=90 zaHH|u#gNwYDh>IEmmjQ$kP0-!fCqVLYXROk*9CeHfCe6Q2NFL;p*7*FJVA&`JU*X%ns87zH1yJpu}jkPCmH0JWEDtsB+WsK#PfZ7x5! zOsN4l?=-NL1@ew#n(nULGFHBBFv8o!<<7}LKov5pcJ)FqP+7&OV;JM1KJGB16TSdea9A2fxTJZF7u=c-p{x*;3e82pp)gJ3sTcYTlB#wPagnxI_ehGfF4 zhsoe*@$oz6o-qYgLB8ER%Q4k}=#%-A}`1 z@G8~sRAFDENAP~HaP_mh7s5p3XoCxt_?5}jofXmm9-dAKUAa)RB;GL@PDlhgvS6qu zaAg#Aacc4xP*az-27=s^>%yGUO+@F#lq^ehbY!)q>IAt72+>qsjpT>Hi`@>TiR<$< zmi4C@!#JIEg*H!*iFy?gV8H%7rb}(^>=pGQIsT0_%PcIU46rtAt37{7cKx4&GbJ_^ z&UoXm<_AE%rZjqXui!X7hqzOWkC=xl+u|uJ-<7HM3)jx|>?@^mw#qEis{tpy^f-F? zp+Y5nGBVValqG*Zpi_Tpo zIT}CqpsrurubBbjud)}9p}Ly=GXfRkBq?JP$!jyuo(#I(N8G%nC;XtDQW|7cHA>m$z^cO z)XJV>Ww)HAGDP8B3lfWW4e~r`3(a68It(?F9l9JFa1Bo8*FFF#)8M^;%xPsWV`!*~ z@Pio-h7i8U$z{m6fABHRP|GyAUVFyw(w?}29x})KiuXe zHwN&JzO*08ImC;m{yy&Jpruo}@J=+n;p@L-M<~Rw^!*O^;e?P4033b%B=q#ZBJc&# z4A8*Fj0x0f)|0g_aqVEG!8ow!TV%v#G>j0%6f?j>F>Zg6)7bRFd)dVn+0YG=m zN1$r8=6#H0NbE-ruzR&*06+#5DL_KDJ1+sy?ArU8VDiPi-~sA%y9}>ShW7IQK0J51 zp?_>_0sQyBdZBKQ4z6()a9*fxv?F&7NdUK5qn8tsw+TccN}cyRLF6_NvqdAO_mSQg zJbZuM>Tv*nd8zB$@&Jef+}48ibfxJ}NZsQk01$E~d+)~p9fkFKa=E?C>r%Fz8G83& zz%VRS9zXM7xYFOvqO{D;e9^Oh#q_huXx_M=9e5aM`9Nx^9KnnqU9#AAF zLR#+tfud8LAA&RPao*>M-_yD^_~J$=Z*y2x@=vk?pdBH9Fda<(+OS-IMmK2j?;pRK z{O-Mf9?|@V2V<|W;``$zH#6b4um1W3{QGYKSM>M5V%cCP5gCOyxyQ+W8zd__tb9yuLJ z3Idg@m2+O zlhRgeLvJ;6XN@UTuGS>jD;#wKTEdt@S9I074a){&7hFg-E!FkU>74C_KQd|JL(Hl`2s8q;rqVYBbAcwC?Z~8OJaae;k0BWJ(LP+XO%wNS7?2?m`WF zGU-rpZ)3G8nZ6b|)pdU*r(@2f9Q$T9z=JneNNK>yrctnr>%6`cDkwzB5XjM+YY`ae ztZX}L_Ufgh8AG(Shx$nt^nehqEVX}iVS8huR@pA$FqH>TPAnd<2d!fP#DKYy;C@p8 z5)WU77yS^WQi|CQ3=4;(7;ASvD(vUd5cCm~a{2J%W?ZyfZ5b&K8E7~pXM29ln=KMg z?+|5JD37Psz-%+Z!}XKSWfXxGF5_r0a9TBTmBvEOlR1K&?LZ#)Zjt^@x75z01Kr=n z3b}rmxzr$=dlg}RXb|30Lfue+Zmk+pw#SHBWhg{G1K*oti<^5_cK=|+R;~Z)hN|oE z%L=J*ed-n$W+r$jHXOkm=AIF7g*R3N2?8xg#cM=@k%d3KRpI5P;MdK>32K& zaSaJk1=jfK`fIynALi|?@;!lNp%2L`{VB4<^+#2?OzRM4tEpC1K?5hfDq?HUl+S>W z(82^XJ%L}&bc&?TWMuN&hWkOQ7wwjJ2K89m{*RH7KMD&IlPb3J-L4bQKo(?~JG?35 z%`?L4{u^yli`J$&Yxl z_!V6l@ z3ip8mdJ6<3SnrzsFl};5;GD&Pb*xUiFt-=xyhJ14&YN2l<#tS4N2S-OmXLTvn3+=+ z`Ti?F`-Jvj^w%G05C$d8^iY%K5obUchYW7GUB6AZS^{Kelcf(qzRGIK!o!K#(o@;y z+r!HpJT0;Q^*%XO<>dg>aKlXN?p#X(y+h0C%1V0=<|2qY2Xob{Em*Psi?RlooYOo& zx45@puqKA%gIcAwCqn>M3`4tQrQKDkR5+7S$&Z!Mo?5~Yv+nnziKR>QyV~oy2=_&5 z3NTW$H}u}MKGEChAJE6CiTXeeAKX%?b@gd+Sl;d0q9jjF+hW&+p(=8U5ofz;4+3~c z2}mUaNTZshV0suwgKEj)<$Y?=g3bLd^^YpzU>3P zx1&zfY=K79R@;$pjU*%}Hu}Vx*#v$l`Z+Hl^xZ36imguMN|_$!Do2|1>@dbA@FGbv zR2kbFc~UgeV-wYX#n*^rqTtUUbV|XtF6qQ-5wH?HrBq&U{;VmcO94S1mmex&FFIsJ z31IMHxESvsP!N3F4>cTqw>}D+1L60;TuT_~0MeT4Wa99zkkLaGa^x>%hizyQRV6aMR6JQ+-SouODXP z|NSp(Da6d`7_BT$(YejOE2sC6;IC)?Zfb4@3kUDtbPAl zpUJ_{1t01zwfLKZj^5qn)!0pJrxbq%g^9&?N`-0`MG!XU&2>L0#X^$-K!nH3yLnrk z=J|Ou5ZXJAdw=*wum4;pkuxI)|kayfuNca;^B+<43L&!6n`eIII?56(-LTjHpCF!o%-*=y@F7*e+W6PHaNYRFhHh!ux%oxyoo z@FsEMs=Ln1g7NGFf7N6F=HAL7Kyz|{JTAtq1prfz?RrXo2PYL?loN*$bl^z`dLuw! zSg0ngL6e@uMXGsqY006kObIlSw~He$x5O#Z02B>lO7SB^&J4;I8aJlF( zkx0iOhY-&zEms*|evM6t{4uftlH?Phus$-4ahoOxQg^v%mQ&zwoi9?qHQL0c*mk_V z_PUci>|`?e&NaC)YrFM}hkH7xgYzMO^$pdg^ouPqCm*#w24MDP1|g9Lu5}tHU!8ei zGP%jF&yp}hJK?qu3@;82c$U+a?m~wIqd;hDgl7ATTG!<<)%;Zy%)A|Y7__Giygy!Y zU%!u3oCIs-uWt{fVld?Uh+U0<+8TG>Z>ue2oT_WVj2LACM>iFc?IicA2hVsMvbNZ{ zVu!eTiXe!15t}834%bhKZNt~YClZ~L?Uq=Nj=`&=UT7auZOTMlbg{F7t==G*s1fWj(+f-xb zPzm?lizi4QT?JV&3oXaYHPbg2!bZ zFVp?N-<`L)_+63kueRPl-L%%3Hby|d9|@6qI^e53dj3gH)*`zjV5p_Z(M*=fe)l2hzc+6`aUZ zh)QM~BG0wV3eFDZ$@Bz-bHdIK!qFZ5EBssTu=D7YB_v2#FbFZVh8sSJ;vh|#?}(%| z1g2{dIcYkIRHLZ|!{=&M6O?%Vm8?-2S2hGuV0+tyk=LNUwR>1Rd{LI>#I}Js@h0Zp z%*eRD#gG+!lDmW5Lk}7S#J@pThmild2fiM1A;k7{wi&%qfbyO z+h79g86bxJ1Tqv0@ZW*B-j!9{U1vafx=qw@;e?i@ZE??$YPVkgS{j&3N4S-&BGe-l z3Y#4Qircwe)l(**kuuRpYTr?iZ&*Tt#kZ$uma6ijQ+jd8+4Jz9D^7l2C2JA z8}D~$!|Y(c_ZABC7 z(sIO{brd!;UZlJZfQoA;BQ`EhA_W#N1|P0(_i`aVLQn4wc#5sh%5b&6(*I_qF+h#c z3nPmW>p%@bOXJJ_(@=o%y)IEyzb>^rYV#RTi4q8c@@?X=TN}B{t$OT{9=)CCoF8xh zveFc+hG@F0mY`P&0?Ilt6fr6UmoM(w*B3{hKJFUFsoXNN*ty7@d;ngzw%y`Ey644+ z$*&szO61&I>@oVHh+tr^#~337cTN#_VnzJ6JVoRTNYT55L9P|}^mqr-?1_;HW=}mz zXyeF9^1O_oL29SPbtM+5OA7~m+&134-Ak@mZd1*mP;T^KnF;@ozAzwzw-^>lC#z^YwE9c*L~U2is!Zr{Md zx<>}e-4|0D+mTv{+mQ8-Xxz)_+l(L}4C3SQa`Rsk$?QH$B#ZsmM6%mz@6neJ*DHUP z#n$>h`}DqfZXFcO4o45_;^h3PE7a)X2z4 z=E7LUtG*(#%DFPLR2PGNq05_b-Z`O~U@(};6z^UfO(Vqxpt2>prwM0V+6w~e`M664 zno!7IIF*6;yA>027;^su1@-W89O(ff;rdbf zfhS_tgVnG5G;BnEm^=5liNM5p38rL1((xO);t@Wl4bn(HX`aEF4~YPEUazsH3B4 zo_DP+i2YQn%BrfYX7rk6to;~?xipa`i>p?0I}urXtf|q4bUFMS&)%H;ZX^Yq+f7zc zR0SgDpFP%OX9z9|)g*5T=<%MO1_bFUFmPCru=HRl@FU6S@~XWLLs^?;dFC%MS3 zXV4ng*El*ENt>#%Y%`m?U^@BPeS~C6f`-zuu zB(~Kx?@r|9AB}L--78bgSKG9-v{JmT|I^vHHNRrABMu+mW-P0i3f;|2yi{RhYRn5= z8=P4rRKUU+j(=>z-^u0 zI8Dl0Q>SIjCrzmNW0_tSqk$(BONJ}`e7zRz(vL0-2P++cc3hSimN$^Fec`h-oMwy# zb>rZbBO{~b=+@Q^MavgO4rnDGqpa)<^QF2M4R%J{9e=B_F2xMQ*1NjwxmG*RSdxd; zLy-P8ycGKi#m4sP>`_^r)B8~8>$GwgNVaxOvGyON{N+CKUKldxN(J&K^T2re-0Mrm zF6LMZ&-^HQh%Jt~=JPLQ} z^<=JD>Z~{$e84HDzu2R_@++^p0lLG&R!QsRpdP_1ufH?ByK+TD1VN{|409yInKv~> zfU0Q-X(L<{Xd*IN97zDHHvZ1PMU0O`g_SCU`avjEX16CUvBwzM1^^nr`){Vk*H{{& zd;1xpZb5HRIZAB$wAaJ_!5ckqiVdMU>M67Br$7z$UA?N7f5ieMRRtF~Fnc?u9hFrE zc~I(9W>?a)a#~Ck+}iDg3sksYGi=uw<2-tRqKvdY0-q*uJsbw`RFQzxEeR zKj1gIw^SF%q+pj+{;{-1&)y6S;#(XKyKR{4>a#RcQg)Qmx0VtZq*=Zh&Y9S>ET#cW z8!ipTU)c?aB5iub2&*#-9i;#-(gIL9yo-wOU-(+IAnkC=_KvA`d5?Jkq9OK+sO9<1 zYKJ;Mwbr+A{hFzroy$=)>&MJ@Kk;);1Er6+z1aw-4(?++Y>@?shCdaTV-7T$VfLC=&4ks8s||?F(nD50>kv_D1$_5097DP7yML zrw2{Q*5E&=Vg8t<|Dl#bpIHJT>!+iJ z&jl(W4*CRtC{ZNzvhWcQU-QZFU#|w<7DqH~4t=WG2`TUS*L*naF$7$|=ZQ;8Pb^z} zY~xdTy~c^JgjT1+xJ$JgU1!SY%=vTXl-nBq?*-tao*`uS4`5S*1g|u1nC)@&0}LFR zahF{hNFU~c(7p6MXKHWv;L~;r#X=(Pau6UH6Y?K_aKU60zxS}4TX4Z5h9<+yL#D>W z#CUsqkE<`g(fr zx+;$KfgTO9H^UpZ-NCuJ#MFn!>vyf$!=G4|@C`d4D#Ovd+Kxbj%?clPfb8A^!?v0q zmdn|q#l>cx(|KGK}{tp!Yk8S_|YWRJ(HLYKT+F>%Eh#tx(mMefG zc~mWptVb>fY#S&pQNO8z^KioiI=liE(|LbUGMm)p_@uP=s(Z*&NF+FtDU(T#m_7W{ z8sp{?D};T>G{SS?lQFU*wTw9mjeB_o2&?ZlThybE^=$R$0v0@c+d&z=&|T#de5cfv zcIk4v6%HAsmxj6X!Wp0A|17gvdf4yuLy=q~mz7si$CVTm3mUdSM>iggk(=jIv~9sj zE&F7Sj#(`l;~lOr-}yW^auzkU>vze;S1A$<7T2#>zcow0 zc#0dY9#|5!;jFo!4F;#b;uC;6$?%(jIvbn);wv&8EPQb;9n?3R(nqacXdg;&dk%*c zc-oIjFx0iqWxa~bV2o*Lq%->&{&@1`qXqjxfzQ+F^PPJA{V8ZP;R%LN|4%>%HFa@;us^%#`-HLlSjwTqQ)cifS7eEY?Qpd7+4@GedXD1uBqi% zvbVcOm_{DXNWkxWa^tbbfH`A?bzcvPRGUIiW|RSnSyo}CpC+^Xl#%R#4HLzxTKM*+ z-Oz)2l__MXT6J6xYl?L&_VQ7YI69Dhq^HKWIMpy#Nzlkf^%>Ywe=1mr=R8FpcIln# z2sS!05bYJmxd>hCGiF^S_Dbtn-gb+M>Y`p~wbe$|Ga7@CPt*-*N_s zHI6?h119#EC(FkbO%E8rCVuAYHn z&WZ!JkYWSqyk>6FTRS@3sb}qxK~cnt-+rCseC4>ouuAyZS=kAuDOjOUbWbO)XS6{T zSGqS0Qy6Hy)QAP$&^w55ij}FMe~Mq*Qu*vGXFiDY(P|T_!+ag#H>D_g)$N6TQfG$Y z#^!7|Krago4fBHqi6P#Nyf^v|IvM?HS)YP!g+uLauD+nTE}6Q!_ZEf=g4NGi5-3Gk zo_A#T3C9DG$%H4?I~I!4y;STDO)a~+(aFnX>H@+Ow^4L%e`R@QiITEgbyL>la>T$W z3NS^{U@nX_H~9Ap*sPw-R}mW_8}Y+LZAc0VhdoGOTRbTL^(%lmuU^939f;vRU~XDa zK9Xi(pL_(mIKOrFNdNg1R0>HkAwmHfoiXfCWa`daOwkVV)|c()`p;@kTHtbKiaH(a zDd>yoN6}Y(qRthi_FFApu{J#E<6%-XkQN`W`&?kW|F_T@bdR;UYvoGb4WHEgAZ_hT z|76QEiYm%<)XJ%SQ|PWY%V*9>J9NKIX|JryIdeZDUtKS^tJ?Oo_IY*8_C6C^JEPN% zt%0edK>C_uI;HQM4*rN&!=$id-30`gjFnz5D(% z)9!M|snYT6`Jq|JXuXB6c~;yR_&Ft2_abU8pRj(n<#AI&p`A@Pg<_lx2BHD3L{_9% z%Vk$@4^%27KqfHY7(1tOpHm+BHFY@`tF^SiCAaYD0o{&8Y)52z`!d1UIJjbmHfo`1 z+{7dhAM))k67QG?6yKJOyR;ATjn1Z@>$&=%KI?Mj$ zAGfl5+>FEeb%-BGJn^h|y>CV=;-!y~k~$5FdalB!1|u$1WU?iNeYPidyD!UjAAvSj zK^(`@nlT5`-;1#iIH1LSbx8o%2c7O zqt;|$6RU5>*C4O&$|$0;hHWw0Z|X8T=|eI zAgn*hIgEQoJJ4I7M2b;5M-s1FKA)t_@i=p;2qq%ry;RxP(e4V;AF$~i3OMn&^=)^% zZwXv>NiovlalVb|Nx<kT*Af3k6}p4ijEU-lZf_<*w&3l`iBy~mA%5vOA|Y#mBqkm0wefvnsj z%W}CNy9O;y7HoCE8Q8&Py~%Lx>b~nsS3{f9@pwBclR-;TZN2%qiI_0Dm{plqnQCtL z&Ryl!Bab^ryEec3M;Z;guydDV1+{~bcPaGrq3!{*;Yz0$5jKX;5;e*p)p?~2T4~Lm z>DC7TPD-taz+DHC+`6Tm6@2x;(Tx5Q5qQMYJx=ocipns@r>A1_6Z5I#ja0c|@2QVq z24E`Q2gIs(z(0g#GsIyPSg2qvO(iym1J*|tj8-MZ6@n z(iW03+h1O|v?jK}S}vAu=(ksNWs_0)dO4lN3NESP{bSldSeMZ=gxm!1hQpHwIlXf) z$@fiv0PunF^i3L`OfJh$Ed3^JnPm+CMFTVBC2(dFt)>K%+x^T1$T?#U4{0SQ&0i}} zIAt*kN%gd@R7WZq62`7`b3E8|_jI zKBWMM``7CwmR(e%8RKJyK2e&+Mfa4Zz=CjV|6Q_aPl<0n>f)$w15`Rf5h}~GNBRgf ztK2vveNsz0IkE~OZi}?d{DIub`x)z_06C>M(>k;XG zb)+r9n>n2J$~pnd>j;b|>ZPML^XrPU+A)wY$D4U|2)&f*M^ZZL-e@B@+bp-k(poL; zj2Bw_j$DeuFfNH57-WqL&gaDktt?MC@iT>j4shYKjMh`|-?!5dr$V zDKu$o88aze)AGMUK7_n|PfZE<=9HoI-JNn007JfPV$rk3*7@8Fi&6lmKu!vN`9i2P z&#EC&MljN=xM~!_$c@!T@|_7=t+~`{FGf(tKFn!=OCcs=^%WMV1useqz-;jU7QC=j zt4f~;R;5?82hsZso5X%T6SmS68@f;$3vlt~Zc{S!_R6bEe;PUazvn9Qy~PQkPad0E zKK*gM6B^kM*v+3D|HVEmz?4Cwa&sp>i3=7InkJlBebu`dKE-v4+R#FRREfLmK_A1? zf!1KVeiJ~JyaEJrI{|nr88G!>bPCpF>|+=>@XK*AV4ApS?FWDIj`zZWMSkqm z#}pjkJBZBQ4z4eaj@n`F#v<2L*BMAYLq?MQj>$9vP>T5D;IPuAcYS$d6n%Ad|59F@ z*5sSX{*=#0KZb`1)kT_ZP1o#hAo;x;Z(~*Ixxtg$BQM+cxJ%@WUJTAx*DUQs+`KtG zIt);@jw1XvE5Z`T8tUuIsu2@7VLZUtnmx6N!2Z7?9QON+sO?A`?p#cq0|4Qoy%|Z4E zL-vSZX;-8F0wnNdU))w+A%v?Th>>au`t_g$F#Yd}LUpL_?m2*h-Dq?)878>^$blr6?BHIga z1r6`zF&kr(d!yL6&qN{^5Q#JY_>?PSwG$9Tc;&gRHGqsd^i%K)*opvvjPtsjH(E}E z2^Nq|6K)^7Q|M*nUb^PTLeU(1DbF;@Mu_!6$=f97IG#7_Ym)nVtZ$05FgRiWYow z_3dB2lt~2q2bSriXmREQd3Vv-PSdO+R1Yor9z!`iyGe}_vM9>xH9lH?&sBLUdX54Y@Nt}K|q1cZa} z$4QjImWzKG@PD{RE0{TD2yLVMC?x}+;vBdZ$jXieE--=#E<8|R_%D0b?s&Hm^wXgW z-AaVj>OJHWzUtQ_-`RCh1Xfg9Sg6X|XCR)9?kyGVA0gxMolitqh2_B6=vi$m-3)3U z;UG-+A1?ZbBf;Xijtx<_c{UHi*lsUsus)=nu$>(o;-=~buz6c$;_L7=-y zu$8?vihVWe{Hw0!iYKCulMVd)Gp0E<^}oC;NQxY%P^>H1_B7nKJW;FOK#weQ^2FtmC>MXugH z-I_-3ZOma@mQ;*_t4Fq;;oMfCt>XHN^v@+1CB?gL2gXZ9oy?1y)9v5K{ONyYC0nU; zo9~l-^^?|^(M%PM%6bPR$Fga0wkRz?wCy` z`5kUUG15h^UzkL7&_^+ueNSkY;t!=E>a5iUD_T%px6zIz^uauCzvGqB$38}yxWFyy zliYDr!IouP!m&aV>(Ig3hGu1fJ0F{H0r!`H#R3TN?X-56{@Y4v+lSE`8Y-|&1F|#?ehgy1EpkC zA-PR7IcE1^UaM4QB>2p}Xl6adi#cL?bc{{MwxlqL-@kdcK-4h=7rOW4UyszELQ7m} zj|;XrpN_IqGndNkx>l`hB%dax<W?(8p*zg@7kb*bP%v4=^r@wo|YOu38> z3c7j!U`8zSr|Lq0eL)GEH|uHP3TDiA2ZGO~-uKits%)TS@W;FGIeImj?kgLicXo}N z(u`lUh7tISMY>b3wo&99Ww+Jp4D|?k%j>09{evOuc_5H&h_ia6Pix>0s)eVGvGIWp zWBF<1?wqc$&6`fyb#^Afqdm%QtgS}_4^CM$%|!XMmZgp+=Vv-ww?E`ge2On{o>`#C zJ5&XLT|VM+0S6o6hRMh{5V|(jPYs@pPIG@8F6!?2+<%+Y^{PZgA0@kx*0?ijv!enz z%k))ppL%AOF43YWwh}1#L_v?L2OL;J-o@Q^bSFf9V{MjmUee_})H2`mF&rLH5LMl8 zoZeGb@H-q47OREIt4Os27cDOFu8hbUrHgq{Z)RsBhFZ31k>!>8VrqS(b5ZI=T+(G({4DPiJGAZ)pv>GKvdQV* z4FgFU5>VyRc>d@(fRH6DnNd3C-7S=UC_ms5ao$Ka&iy2oosIoD`Ep*8cTN`$ECUAT zUGsGZ;nfjpORbX2*OUq}-8D5OhQlH)?N7TX`2VJ!f{8y|6S>R7*fKf(FiR#zX|&QI-K>y*2N_X7Wd4~DWdp}LNwu%cwoZDXiCCEY#C ze&u>e{%Gz%#xS)04x-Bu??%R6yOK4G8SNXI$Tq%pj#M0zupEG&O=skddqM90>o^_O z54l;IgCbcx(}G57J^I0NKQ4GUIKZ# zCm_B+Hi0n^&>tF9nN-M0hkBR6@k6F}BhIGrlb%>U3~&w9SdcZx);gF1Mw^ zlB5?!6mtA$FL7lhG%A0W!Rh04gvPgN1wCqeRQqy(b9~{WAkCi8Uby zu9j4u4T>8a`7U{^ruw#Q_QK7b@n6gi8JO4q@IwAnd)f8a3ybWiZz#78TbCUK^@nEl zgrv^D)i9VPX=whU_FK{Mux8)KJl^Y_`fu!Sx%uWKS$q9j7?AHPuWXn6TGl%Ac=oAK zr7x0>HrJe|67ozj$DU?Ll}lZvNR>kEZQTjq7b;*1LbJcCI`vlLM!A|k>QwTR?;lAQ zlvbypU7)O^;ff`!#Bc1sd0t_mSRv)A==ydnhk3`wIn0^^OO`YGmp{jQUOq%$|G~Xn z>3bu`-(1EtzxQ!f|K?O%`R~_ElH%d`vl6#LTyrY;)u)Z12H zA2GlcmmHSu>oX7*x>K(j_r0XJi*v+1=HT7io+r_!{V5ZHomZaZ6>j{^`TodyrW}H)i3^(-S-~;`wAZ&xvYta zTg2YUy8PJGfef;WnZDMMgv+xxI9h6`9a(=#a3yIH|MkPlUkb*uzOmTna6H%5)jKP; z@bYubA76{ee}kKeZ1De^<5&BQc?aWirq3$}ikPX7NF-!AFBZWecnYAl5prUexFcDDY$pu^H(|@_J%^K zYnrl0-1w&DJW!csq}XDLdwMpIsL?vpSIl}Ce&e;?KIUP|FhXZY@PgA1&kD!w5sr+8 zsiq!7NLZqI#M^173|S)z!Lq!?tDN_b+eh>{+Mq39Tq(1xHc8@~A*BB2WBTpF`qM-} zv&iS=S?1vMm^(_%`x)RJWPth*eatUORVcrB{J@ zJ(ANf4B#jW5pNF*Z@)9-*~%>$LUw2F5;k%dBIaa;x91chG4sr~PtrbreWOwM!H6sW zB4m3%Spx0X|F@qevr!CAy^zrbz4o~&2D|Q`NA?9EiS6h9?edo*GXHi*BX0bC(SMa@ z-~suOZ7(1G+k+_jF4G48b_WlP+Um)FyF*p)v8}{^yTkvhw-VnclbjzOu}y-x-@SXc zob>ta(6)P>!3hCO?=8T4FH6`NESK2*{8#LI!23~Z0Ha@;KVQzD4_ckY@R=BP{pXEi zqHY0i7YGAnsZM$~go(}A8XYFMuYUftk%|F${g^O z!?e%GZN+H6KI2D4ICvL73M2hM-}C6Glo9j7(I+Bwv`3X|OVysv{g0I6XTe7^##qYiFI z@PppC;1VL{41g+P(a}h;oz9zeRfp@6C?SUO!pR$L+sbm_L&SIV0|q|3A;Y z|CHvk&RDse!u;0M6ghk5mltPD%FdDlz!X%hs^LC>zqyqD`#{4EHzMT)`ZKYntUA8d|u}t zD;BfU7L~7MpWir9^IA>iNxXWPMrvi>pZnQlp2u*GO@e}bv`~0~^o0Gem&vnIdy$^mbC1TKQnN_y@WnK$d?!|Cs z)&#?3b|IFmV!09-xpdlKA8tU$3k0Qbca2C9}zRLEHR zG1pUJFijqo(@-4!QUcrgMHtR8-$Ie%XzSk^>I*;QX<{l$XD%C0jiWo&{5E^U=hKRh zY)k}VE%GV0VZv~m(Ib}6yXTDVCO}opDN_@_ylBd`wASLK(BixXGG)jVu;p(RI<0H$ zpwThtkuv?8ec^gWKkgsw%01iKGB5NzP1CdPTs%{qHsfotEv~szuMROgnSl@O-5dLq z)SAGT6*0sQWiWWLF@d&AEi;mKEgEBikZ>2()4AF4o0cBD}>-GI$FiX z_HN@f-SdqVyof| zMVg0;H`>jx4^A9I23tR7v*Wa($KU}e>0e(va~0$l?&QXlZZvk=&_Iw9^(|?mznY zx4|Jl-_xNvt2Xr~E=!)k9DIJGOx;PZb*(Fu;I#Ogc4XG|`9O@VeE9bF?RNKWZ=_eW z6D*&G=$J)@K6YN~32-hYUzESNo+cN(e*7H$VVE{Za`yJjm-`<5G`Oze(qvFlBD_ct zy%N(2bk&QKUm5utHw`(@P*ua{FZvAb$NQc>cBIZ(R7x`=}H1tJY z%8}%3=;?D3)e^y4*FC&Jv>ylEtp1^aznC0S(z8DBcLVs2hflVg*h6f^mvHy&P}8{=N2Bu`B*=(g zHIsk6b$F00e$*FM*v#tq;e|9DKaM=}d$OFKl-p+O$u@WY{Q6*tTVLOfKlj}up`V}7 z>Gs8f;pbM8ZzKw7g!Z=oLEU>tHI=sQ;?DSvC@MIjB3-3PSE_UiLvI4oi}Ws?Kmr5{ zBGM!@Llq$)(o5(N5$PrL4xxq6JA?osX9MEQ`+e{E<6GTgbYlB;_kcoIT?A6*4Q6osr6juJ2u5`PewBqGuF%Bdc2@;QctBK5jm> zQTF`JGu!3&8*Z3e@R{5yy^s5TFAceKwc6agjfvrw2a2E(Z|PtM_d<)@Y#XPC@{2z7 zSZ8f$#LaPdx>Rm-|7Cn|P`@1fj(%vvQSjNPj}@D~g{+NB4iOsVvb>C@9v;`H#^@Kx zMOF-8S_3hfoo6U;eCmTW|8CswqLm3_ z>RU%YfJ@DOn00<}+(sxj}Nhbw1oa^UdyMo z^-<%W-uE@6Tzu}9HxC^tHc^q z04bd{1h*yxU-b<5@s;%kC*^}O!_T8Yf#iI8f?Z&N=GlCFh1kxYv-7|JfsX;~714g* zEaF^fL;C|&uj0rUjfiQ&9RbAkg%QSH*}Yu+LpP-}NZLgMRR-qnF96|Pb?NUqgrylQ zo$Nr=;9x8#bDd@zA8(PqqjMJKd(OFY+xnsB+KYu9p*}ghGxM=97=O3;gz_P$OW%c{8{0wn(z| zLudTiU|}kmPa3`t4H4R@{r>gAeBFL()4@-)?DLIalQnK%I6RZRH=pAZ-Bj+!*{B;} zR=yY@wQSeesQ5|+T<{ILi9DJ-^3D$~t(KFxlt9vBVqBY=AI&?Cx(#go~+4V8Fp9yk(pnMh1Gq%Kb6=M~H&?`Q{aM*P zGE0v(S@UukLZOl$|Jv!DKt*}G|~j+ysuTGj7b z%^7gHV5e>YLwuQpik}-9oFNUgfE2s@`{xL`yW0PpmWwD>JbpX+A-Q2`qN*8cg*y@L#$YtM zW_~W4g@?48ZkDt>3Rg=X{~mE(a3Q>Nvus~gH@Bw2)?ea;x;drx6zOW zO;fPNTM>h>ZeMY)g1SXkF?rc>3)7TBOVsdpZiMW`W@qL<{tUQ#S=id>JnYSdFWfpo z^{X}EIUj)Z0pWE+dqxjacJ^*2bjdh<5(<{s~*Qw5Oe;5ol;xq<@=T7KSXwHmuI3o zTvS7@-~GTG`R)<&ab`aNhsl5Fh)~($cUia=QNwL|$u7%M+q|&}5wB3w-54<>a1ES- z(~T>!`jVHU!P%#9z2bsMf1{j@I_Hjnp|os;kfNn$$Q1J2WHWcO0fOb!Qr$%A?Ak zslRd`{1MGn*XEv-F2IPWc+lRt%YRvz)#$U!6wf^&$%a0!xBc=DC1}`fR;IST356w# z$${{{4=w!(E4aID2e-e4aAMa@&4-GWU=rz*sydf0Kbw&_f5&GZO1MivXH zT({O{=s_Tu(xg;&VYyWPSt)<9KrbiBcPVQC=4QV*Ba6eMY#SkTqu!N8vM`k>Bi}j zryCsgvPkJt$hF9OvhgB{*SIxk;pNIzj_f1r9X@pa^-m3wOisbW*2yqD|LUEUu~GmF@J zA(DMq)Lb-6-`-lnZ8#?c*G+HXbGzRae~`zPx%0~{?CcT!x0>(xKKV;F4EoYdunQ(1 zN%ue{?OtJKzOd_A_RLEmF1dK}h&suTFr3ZVxSrR_e$}rF3OK9+aUXS2dNP_*N(sr_ zo!2p=;bs{F!QC-Tmcbo|2E3)XC&7Qr}gkxArto*1gnX{zN%1x96Q;*Hy}9 ziX>Ld&Nod=miCl>=A+LUXX*Y4ai)zu0KlhEI*8Gmod!B5EgM_HEwm))j6V{I(=!U~ z96h+GufLKV0$$AFG`)!fv^ycszNYyu7+}7xO;TbA^ySG+2cKFpq#1A%kEG=QKc<06 zf|d&A+-KMs1RIZ8Oqn^%)7M(bAp0wX;c|uIJtebF)eb z(2)&nW(SQhOzEUbNq-Awj}hGoRd8J=TPo9H+1#L?&qJ#ZI<8I9AcZ4w^|v1o+fDh| z02~rL1spSr1&%9{Xp|!A$nOZv(H*%~y=sJO7s=aP4`-U`OnD74 z3fs~Gv^GsPdXmQ{1d_eO@F+~OT6gN+3Mdb7G#ViMV5ivV3g0V|9}f51ty}cLi4PE( zXQ`-Imqp2=~)Z2Xz;sp*|$>ng*M#aAWQ0XrTj z_};rlzhCq{L#w*&hgZ;Uft1)~$Ukt#G$Sw=nwWiTfl85EYFZb<-~2E*dk0BgM8(|J zPvOR2siv%GkVn%l^~kcQCGOcp>w12uT`BRs zBK40+Q$daH1dm9|(BW29@{L&!*3`Gp)$2+J24+*Ye^0otC)4Z&I zVt`;a`q7^o>3?PkRvi8R0QhE$@mjB^7Im5W7vTMg$5&iCt%@|s?Sr2ihoe%tw~jcW z+JP|kPilzEPQY2iP4Oe(eAb+4f6zGg*M?(@%ldE7bD0akTc7*-CZdQVDC`L4Q1}R# zZjD79So$rN`q}3xMV=1Hd(r>E_;(Nnwc!KCkWlDuAap`Ac`vH=7lW|Xb`NMC@Kgn{#6eFX2!4xJ1q#?aOg!Tf| zYXJ{WY&dB*99rLZT45~2g(F5n(#6QgWX9fPpP!6!7+7eeffd^!qK57l!P#p`HEx8(DXMQI7Kw|KL^jyYonUc|g=eUk4=sYL}n! zty=rO?*t`vh)d(xr3o~ARcmyV604{KrPrWwTZtX;ub#ljeqxbFIkUw8mALohHRCV) zK>z;FySr1=s3t&l*ye9&UUKtqdMeF#Itw`4X&igJjXg@EnD75#ll#?S{-1#7)2!9u zlMdA7>j*jVs+#WyyJxD0c)K$_hc#_0DmE{v#_B?<0;G(i6s@^TTwPGPEIm`Ua(bkeTz~r48>ip9jZo|}3d5P~4E`{|^3&Wjf zx^<8v1VUPSM3@=b0u4H?B=1ZYIX| zEX`|>Kmz9^&xK3jlhbZJdoH-0*1^aMr?c9+Pmi}r7X2;LT+Y_p`_;Ne%%L;i*;B|j zEhC8G7qtudqI^Fx9ac7v*_BHeqz=c8fgNed+e>Fqgv*E_muGJK@AJn z8b<(VTkUC?KC0Zq_O01%IpIjQzN9;e^OkFN0edlvC6Nrd4ms0y0p*jwj~Q_Q7`?j( z^-Vs<1(~OO_dT#GabYvff%pctS6VNVD0CB&tS;5%SOYBK56xKc5(9j}Cpx!jh6xMx!_XZ-`*`g_&49Wf*Z=ePCwhHTu5tNIJ&(pQG zwelY~z;hTpuPXlG?(}|iCdc?+l{9t7zxjsUhZDcKGiV*(yhz&u$kmo=fNIQ-ypDcJTXHZiKY+ z>h<<(RZZ%lCuVwrGX_eGEBIAG5bD>6cBF#FTjf=M@Ru&aitkQ#$(Fslmt23JM z$#p!}0XIqoY~FY_lIO{udbGVjaAoEF)4p#V_m9@ieq{MI`GDMgCjqOQ9evM#_~1-6 z`|La4%!ljl340sY>dpAP*=Sb7sAdCc(qgGD-j0>smzTLkJ8GE2kjYzgHLdwN?1#BW zOvc-rVm)g1BP`{+#06dJL$f5r+D%DoH$lzG1>J~W?O|p9 z#GLph<*yq9pK`o$pviu(*L+x-Cie4omR1c7O-y;triIB`Rgp!h&a;Ty4+xh#K*Em% zKhZp2<|I~I>xQ7dH&6By_qT*lqq{1}F*iFpl>@q`I8{u^;sa5_Ztut4EQiCc-&_gN zG~u`}WuiW03Q4R-wtnRV&9?3c8Q zmu^r{32J9X;W8V{;(4_#cg!NzbSbUfa%6O7Z&p5dL@L*=5skCNh3|IFib|~Dw!G{O z;PV-vFUkkHFE1v#eCA?h3w{!1=K!~_)P}QQAQ64};YF#pbGCtnFEK%1KVSwplJjwF zfMFCbkWsuQ?Y7Xu9lbJ|XwK!<#w*h0B86Pn`;+~8!^gYrMKbaul}xXGPWAIN&ws77 ziW_OU`Q#puw(l5~>Y(%PiFyXudBwF7>4J%o7d|Ulg4x+PJn&S&(DnJuZ;$LZV*>D9 zS})BOI`GXg^hHH~DPn2McXys%_TNrdl_jebxna(J!MrufILXqFru(*fjymhDE-=YW zu+dCL_p?SoV#aTr%Hf77!!A1=UJ6$k!wUDNu9ypmYK-LwHpab^@xLYOwwXxVa>@)G zTHOm^IUCiKKx_RKb{nH%TK@Zb>blD1OEDj5O+IzG#B2r_;2$X5)bd*Y5uJF$uW^{$ zyvGSPw}0+6o#`3aZPR?!+1~S1SYGnxiLS;gD5P~X7rPXi$a%0f>m;>BHbcsgF54tF z9+LU3CA%Kv1(VJ*pw9L^(;hH?15ZtZJ^d7F@v&wxGP%*(XNC?l#XQPWjR628FGYh zlFLUxQW3LB4RvvuUPR$EQHS|=q<@e}pO+>L$?|>hic1Z&uhM^@O4_AY8X2EC-`r~| zoQDoaHoOz;&m0@kn0d))ndQ=zxyv3G&ujB}jxW+>(3l{n+@+4}TBc<4wz87zP|4t}p-$Esa@#*BrT~K#QIoqOz94YRc>9y;n&G%aW zYnX4m8h`sM<)!Dndhld33o{_F8fV|Oc-BT;VBen-7Dy1cYKY!fE}`?Ks~ZK{Io+S& z{eva(r8-$p?PcBxjrn%?r>CC}wRn*w@x!l^m>`&LsvnpLGS?EIPmyuCv%>JE@kKy4i+Ra}fXohz`t}Xt4*jAvyV)(;1M(J;UbvD6YE9*2O`}yw4f_nOxwvv=>w-S&9D9ca9JTZu5OK+#Cs))D>1vU}uT_w2aaq9;4=Q;0aZ9VBw< zVMZNT&Y!;Y7yuZ3@uqv)P`kq5dLDdg%>lmI>)&9)Ca(KRxBn~XNxq=Tu!e!JcM_HdZx?7T@BSgAs`>k4%SB1OkBDBI+cYKPK9f%y^9@M5 zVpyi?Zz%8b_#Mnar>yLRL)6lPSW;!o z0&N}t6S!;r+fJ&@B28LeZ>xMwd`p+P``es<^?r%Uz2}RNNuB1-D59G@_xVjGOT-il zv(6Lp`5Oya7nLs=nO?Uk_wCo_C!{K4gA;B#bjB)N>5YLi(xhJ#Z$Y#*5dIrVPEcf$ zvqG!S1tgi<4#%a`lqhCuu|Jz*3t_yYEc4OG*ebLn^c=mTg&Tu%a%EGd>6}98W8{yS zK_R<8-;L!u2AbQfq^%BKYiuOnlH0I|yuT2w$M$~U9iu3k%dx8U{?f*y>b3ia@pxi# zR37oH6RAJLMxVrZ(S$^KkU=6J1xs)VTx-l?(YP?hbN>r3zmR4M$2$4Ck>OY2$c#n9 zfF&#qd1ai1I2)-K@q7q z9`AoXoPqhi_;+<^!efwpcFp(E-kZRQiRCS#N2yVNb+c!(sAJC4PtnYBPu?>#8)lX` zZ!L{cr8H=i|L&-FmGZ$aSK9a^$GVfH5 z`tdGX^*;YSS&!;RY4cZ_-Cs^V9>~3OH5yAEs!KL6Cx7k8E|*0ANK?BpPshpcdT=oz zH7G_VZuFb&oq&ij>XM$}Lh74V@1}OIR8w7!qwx5!h?03w)xPgYc-D~!_Gks%!HWzT zIz}PuCG@dxO}{+&3%Yv#$JI2*-u!Jfm!22mzR)p89S^4(_7UIN;_)iF_IYlGdQC$m zdgdO_ftSdu1B#cgN-_-oy|&aOdofz(VxAY=3EGP) zDYYhA%{Wy*W4$yDgs*y@rx;zV=DTQcUFu*`Jee84`Ig>1N!Y*qx3@vNd?d?IAjUmuc>wUc#U0GBOHT(-`%S-WJZwb?0?^tyN5^n;AA4n- zv4wXV?yM3F`r>NJ0YxWB)282OZ!zN_!*My71os_j$M$ClSU( z+C68wOV70HPqJo{R0U$rc>t$>#ekn50rA6*P)4=r0TU9dG;#hi5OWOYMcOA4SR}u$ z`r*X@@##ds4g3}p@r!hD8gVXAx~chs#=g;+Uy#t~%YOEz=Q zsQw4o-Luw&{TRSMn$pZW6BsRaznfaMWJSd;6qo#kuSkRZaHGB%(pIRQStpgfnt4q{ z;6d#8B4@F6{}=9Onc7w~T)bE48L)FkDPgC$yRgr|DSYKw_qPXkxPru(id6N$GYNUF z`IS*)>f64^v`Eh^0n)fl~ zHn&uUf7_Y_yqed%X!cUw=Kj}H=f`eHQ*AZx!_yi&%?OKv!9P+uzDoo&^PQZHaK22t zd>j{?%?#OvJ9W#DJS_KLE?tUn@aamt+Wb~z>{5j1g?hTOO13Hk&9Und)NeewoGVxb zjb5tAlrTK*p93~$5s`A3Tf_J29?avXI97p=Je`f<3NNX1EN{;Svf?1ZwivPy}$MMVPjX6wJ{ zoP_SJGC7Ww2RufJ1Xm~N=fq&KSZ*F3OIurx*49?gWl$BBqoddL*mpgvsSP5jS@RRCiB4@dUSzBJKAK z4Z)X3N=;V3J>|ZEaohcD$cyo;GS17;&q>$FOw-Q70+TJ!-10LVr-&t;r ztpQ|Qkw|Q;-+b(w6EV+;+ef0kM^~o>7!2l@luYC?D6zoQ`0DBF56{7lZ~2oc|19yR z3)jg5lvP#P6o8MH*7hCWK0_Jzv&|kxa^47rfBYz)quol_#EDd#=x|N^2I#6EUp8hy zSY`!{tUlqglNfjtkN&;|?vLG#PK*jRNJ;^Zdfk-qfN^^gka6bdkn%;H)AEwfbth?mQ(4&Fdz%CW`ZY5%GtfPc z3azGwe%pVdgCOB02B zLmh&7O==Q=9efsL8X$dC-iAh7`}s*J6#DM(NRSRT=NA_tw{Rzgj*C4tP4(T4Sd)(R zX_6dl2037?0s|7W9m~V00OP{ZnUGi@=Ya78!V@gs2kVWSTRm#l&d&FMk)qQ0B(1gT zQ^^RgyFPn8$<0USUuIiP{6w3_o-hKPRS5*bZ=>tY?k6TDF3!4pdZw%21&lI>4s~Nj z9%z>u-q8q_qp@UVrK3kpIuS70_>-jnVd&FNhwYN{%fx1Yf+EGV#$wtKO0h4*SL1;Q zT(dYFW|Q#Z66i>spt90{`b2 zsQ1Q9g?UU&450j7{KCP*Lr6(UX;JJYOIN{34=CgNIU4&1c92OA#y~gJ4i!`r9zxl2+Z77v03TfwetWME#f~?b>|PA;m}c7jW=>fsc>K6Or=_2uk0%{oHWLy}4PIa733EaZfjOT^2ZGGtk}j zw5AH>XOsA>w_`ERqfd^=T-N6J-q%i590Bs6WVc}&YbB#j@SD051@4a z!wK^L>g@dg&&O+UIoPEi&(8sBoLfec?HV17@l8#g4_kERyEZOcA1G78Mfy z@N%6nTZ2DtfHld}DQBFF+{kEtfjbRb>G29_7Z!R62cK8e7>@1&LJM9*hg<1@n6265 zHp;u;+F%JEjlxMu^;JssmaUQTBel|t__ z&>5YKF;(cfpN4?B7z0F_cX;p`d$_f|ogwicp{tp|ZA1k7RZ06Y3zT~i{lQ-asD>nU zRiQ^=B^q6`HQL+cp`OWQp1qIR$XaQnksk?}1(zrd_4Zpv=_-V?pSilOL>D_UwatC(F_)GT-I&yq)Z>h#2#)u_Y6;# z#}3Qhu;$;Jv6oa;(9$hUefFA+6=TTqSV_aS??I)x9^TFm%r!UlDm*6` zcGRmqy{XkKUELp?B@*ZPC@p6u9KNn1Y#ZtoRq5&5S5jVb4Y)tI87p$NYzYc6sh;&E zVlQ0^wJ_UxD~T*-p+?UR4muyJ*8o&65V8YPCQm+(d8*j@-Jv6!?qoJtA!9gM>3o{! zv7G%@)0Vvq9QQqRFYPTd%$ix!hYYVe|ESlbq7l_n7~l)Tu06c3Cl((`g|;w7MC2}u zbQrb|QOjxaEVm@#KpD(HKb3?tn+J9aLGEE6!>|Fp+WOrFyx9ISIoP#AK;V+T;=@Ji z$Rvo(wz{-*FMPNw8i`O;W%OaY*eYTY4>IGq7|BcnS7?E-^A8)y`>tz+ zsjReW2J_7*MV_56t78<)9sLp#E)jdtC>dR(xv!bcH#0c%GK8C*PwjH|Nob{k1!X5i1B0T2nG|L8iYm$ZKEtx3t*wHFjhb9zG_AIdNh{MqE8lEZ zXmUFSumx*ChuY@prm84V)}W%d*-}*Trj|6#`|OLEMZq%`30jT|L)hgee#Ms5SJI z!L1|xmVEl9F-1sh|NJt-wZHl+W;{Bqw`fl|qdakh8;bTwH-~s`u_4`}N6X(}4{Diw zxWcy&wG&1QVKiskqMF!A;Ffq&f z;j?pH@zA99k`jX(H42d7kw{sh9p8ssSI-wYIFk^`=ymhW%<-K&rD>&5`xi??UB(V- zO6Ee_9z1^yYdWZDYip0^o@^v180UYE-YR)Q)v16S3kX=sHx{i5$aNdjwu}=Y0-b%} z#VxSpwye_d$cu%hE`9lw52FWmeg>0{Fp6a(Tl9Q3cVA@pa;1-+TQvl8Gwn@~ z4KQ^A$z%KNH$D3owgolhCuckVvX>+0X`X5s(-7F^9*ArRz-?&yqQ^EIGhL=v40^_m z6f^NLfU9nvXPX3HbM zVm15`-R(|O)Z`p#5q*8&epEUtreSz_pe8GK+`-XlX3K|lyLQ9z_nX@Z@h0*~gV8w* zrJ{##H}l554jCa#WZ=})J3Twisd%n5j`uhHJESeR?sG+f_H zr;tM2af#+4w{=p{FIhz^r6LS=hP(X+g1sTz1p1raywNMw-iLFOQ59m{alvo~0)f85 z#n}Env5snbPdVWCpgoa2dja?=7lQ(5Q5vhGu9@#uLs1zWGX zk~-w_N(M@_Sy>=yXiAjh7?0jZ>DXYAj!G}K411pW@qP%aPbaLH#Wq_h%YC-dZz<4q zo|1G6LzrXVSPzHZ0lY37dxi)Ffa_p#liUcbSTczc`hXBgT5EJ-=-+8RSTj*JCV(z3 z+8JaesyG@=Of#&cKn%bJ#?9q!!Hap#l8gu)7l$S5ZpSXAbw;~DjyBQ2@E#n5V&^Jt#f56pc_*Bz$; zb<$^3n`z3_XlO~)Gmwg%4xBAan8|?!)6kE>BU2;2XP+}e$SO6z4Dh>Ia7OPW624FL zZR=Nd_W?)&ydyKW_L>1X;iB|`m){oZkZB_ptu`A=8kliQKFsu4dYy-p=JjPp9kwuY zg!-^ak8cER9X6SZZUzFQS3CP=1WPk}(KLz!+ZzFm^VMYPNOHZempSue3*Ku0+gU_b z*GalBHH{mwZ}x8KHWw83{yxDR_Oqy^I*G5VAZBGP#6H-Lna-*SB*jeJt z$Y9p1EK5+dqm5+z!3C_L+iccRVN~ zt4LC>{6l0>ufVunx-W&j^q-ojRTiSK+!#y=p?69n200FiR)}DqkgZe)KYNQgCk0>+0zgmvPp~O2f%_E%%dN5AE~G3b;*oC{BCZ ze&ym*WoX@Pa;4=-oL|8t@<~*R69*zWB!?u|9d59vyFItywo*n?%mXKh?KIpgZQ8g0lm@9XnMN-oT)^;rkM#% zI3Fr1wh`=>*Dil%!c-%(DuT4j#FwE3W|7`~eb{knB?ChuiU2`-oMt1FM-$kS2CKTT z-|$h;O{ejuWa1F^0D;<)m)g1wm8z}WhM@3PHHX_GMV76zfUwOW_baQdb|*k}&3C!| zpdM8wD!pTVD2;^#v!6h?j92Y1;xvpLm8@~qJ1%9_k5_GKoSo%dXUjuEl3Tic^|qz< zn@pNDp+qXeu(Wg%biiwWzRHc-IzwP&FsVA3dgpkT>c4u9lyDMYsfv=Pov|%KU#G-r zQK6s{)}X=49@aJ!&Hk4EX$3S72a2M!T3G9E@g?%CC9y-UYmai%++TBWq+78I?lHl~(bwYBMNZ5Ne6wmLQU zgyY8d6Po8ZDXoirpaWGXMs$f909yXJD!{;Td0Evqwe=*o`1?N>)?Q4UTNJp7`?mu@ zxzbceK<&v)<-aKG!h~ibtuvvPt28pB zR#sL3P|%_^hUf9EV*7aM$ULa8%h(_Q9&6mawgG^f?B!Rx%K(6~D)obG zwJ{LisQS>`+glVsLy`JC>}p9>Qhqs`a^;2{0BWuYunp5;$I1HR>3%lIM9L=MYR?CJ zGTemH_!@b@e&LH_LIG1zP+MEONb==502CiJGqw0dMd8iO%~7pb;J>BO^39swlLqry zJ%z6r#iTa{NYB7vMjxHfq@*OEEQXXXk7yWxktixEf+r`V0nqt~FOY=nNURN?WM;O| zJN2iYwwLbp;QEk|5Q`Ttcun@YV>LLVkC=hU$;kw1s9$R9$#gCJH_{I1LpK9FiQl#k zR0z6b4UI9`LzuM8%*>o3mJU~bLG}RP9t$AN62z?@07bO`G^H!Le#X(FoA`x0`Wu7- z-v=rYIJ$s}0ZIWBHw8LfRd#Y=5m0UnFvMlhYxNyl0{bK0>43lInd zHy<#BaXS9u3r_i(&L05W9LWL@Q*;I=rndI**Nd4zkEAy7xi1b{Q3f~!+1Qinm3a6o zFE%GU!%;yS8XAOu(JH4cUiPTk7(F^V`nKPBW2X5MB_+GUQH9*SCS1&T+_)395cku@ z9kc1L@GIY z31~f^MFUKWdAMYZj)|`j;K$#MAk&ruG65H`cAfeW1X$M*(X=*M2gE<1%s#2BPlQuE zmon51=O;kgGXcP(WfU>du%b8yP*h_E0(~7#U>kdjdF%>D#DpSZ!zjlbC_P|Do0~^; zoD$4osE`#cweN6_jLhSNG(7VQYOezh3c03dknn~zK7gRAZBM!f%C8hKbRa`ooYBDl zfetJMP?rj@l9G~R=4@i(IRK*9WO*D{)ESJyuf)D*NE6`)Ym_7#3Whz1o>2~PP!3Zy zJz7&!;|>DlEf#kH6rx#y*MQsTC{3Dvjxi;OMW@0G=%~Q$jLJ%JAe!u|tH^P>-}Vzv z$&=3Apyb_VdeIH^1|?}SFHL)&R9I5tsT3Fv&Vh>eSk%w1?zfze(UE{bmkX5aq?uR z`_EcG`SVQN-$VO1Vz*6Il9S)&h)9TG2e!3&wmrT-)E9$CO3ihjJiZcin&Xyc=raMKVsU&@d?s!wC8KcF zLTFiBcJtsOp9Lw&hy$5pg#~M5d@$3|dA}U6Z?GZhUAliV{sIgTZ}^Mj<&faZ{cXR) z?}n;;c!0^DnF0KK8X7b!)RdrkUsNw+;n4*NadVhCjTd=fvCY=z&T7U|?dG=mXo-Tw zi*Wkoaw&-iRr_xhjA-H{z^nEcwN+2(X~$BL4FpI5|3G6U{l#Fom^i;+F>^JSH9ur0T?l5FozS$q z_Hb_>!1(Vati$zbc|_1(GsFZU#$IE$@IaV08}7!A{>c9AqS?k)ngm06-$|Kzh}UtW1`7o7C`s2B|bJUUe=fu7{|m$ zz=IdVjU-|wYf5(@h$TBK$}kI?i5BqLx>UHtvv%ZHz9d@ogl6NW;`C!H|w3J)JM7Tnwbh z9xb!u$;K6YQ9)-t$FiRj4$sQ~xkKL9TUgujN4nuOR{2nU4=vVpcS0GPU2UC`r1ceD z9Pej@t66*?QA_Im;-NgBkj2ZLGB2TOc+&UphhOUkw{-n;k`uPO)gue;dq?* z#rXwQ*L9#QNv#37XxvaHk)xm5)nVhIY)oWq#<`vdL>v8JEF76g6F-`~5(AF0k4`YM zSA)QiEfz_l>dpPuc$`h9WN0)(3*Fc4Ignph{S`2b2nkSyqGe1)(M5qhBN5z*00DvyO)CN4kqdkeh|HtAvMqPZv6rg10+tq( zyN6v6aYa-#-d0k}s0T64L?gYd#I~6kd0DqRjc+Sq{W%=5!>$v9GU*kRR%+1o*@Je5 zod<{-yipPwLudJr$w;5HBSd;&>vWdgv_4}>Rsa*Pm zn-#R_b1F^)`Ztm#VAGqB9_hgdBw4tMzSkb#=LyYV?cm z=#DnRZ|&fQ!+3dlGRFH8YinJ>d5k6tOl5U_S-9T0he_ffbNg`XZV<9JCI>x>1@ND9 z4|tP0)_b^yD)0!vm6=#l8r2b<;v$_ES9e~?p>t)cw+y;W7)7|c}p(|guBJsgvAYf zC~j9k%_z^#={?K5#2VH3tQW^qot6uFlXLf$cTPx#@R;0l3g8~3MsuXx ztedIhJ#1FE(dtSwUE!nZA(XY$=KhVs{HU!PtHmhD=1Ni~2=vqQ;EcccP*vB_T%5ly zRvOa}>bM)D0sb6O-vW3j>RaB};Ng zj&9pyM^+vKP?}cRWancJqDWGevC?vMT4|M|(T7jSVjcs77j6seo)$W!(2Km5rlz7i zh~**AI%iXRD7Y|T__3q{=p0BYqMn&~$ahVqgSUTxXXxoL+%d=YE^H3o7yFuUoXsJ#K`NDn4{r!sMc zB6loxqXN*t_qQt5Zk|FMsAztvPuIN zhv=ZM{j`K{M8vTRlP$++LfYN5>JMDCp@u|c&W93l9_MxCSlIJ1Tb^?+EnB`WPO$|xv8Z>;)(rxL`q2X+d`0w@N_Df>%>EjYPrA{7fK9A%qL?c z$5-??({l0;o6CfZ-S0Ddg$SZ8=<;NGqy1Ll{+`Qr(QluOhGnl>s6S=-sz zhFHR)o}(bl9v%*G7(lEIeG?Hb`_M{Hu$R*94>Y}r<8)@`!Ea)DYSb9}A5GjW9-wlLIE@vu%m2R1COc;T8Rr$_qJEGuLYmyyvT z^nI!AkIpXfkLyJ7?sARR?;9#6B{zCd`-CM9p+fb{>d4>6;VT*y1~&wtp0;CaQ{MyP zD?VQ9){y7r%?Wqq?z_?7zBmpHZ#;M#o@mYJ>|%U+uZPDMAzKyZP`W(J6cNOVML`K{ zCpSJ%Z=JWAtG}?Y7*<@0>HTv$M{=i_+p4C}FI?&3#c~2asya9`Aq(+zII*C1oC^pa zxsAY%_WIBC6A>R`N@4`Hbq3Hm+8Vxc^KlSp`f0U|a~=C6$d7b4hp1gEw9XelSy-s% zxXIP1*L0VEQXfxDS&5*>l=AUF0yXT^7FsXry}2&KCXO2fbM^w%k+aMw{ zBZ71R>CKTDkQ${!C@Lk=krp68^mu@yA}9zLT85z+dhY?0p+h3w&=Cj(NFp_agycRU zpw9by@9#bLu6NzF?pim0uz>G3PuG1ogN=y@hmciSrxRyei(T zY7x>ue7z;7q<$ke*MCzjUy(mQz+c55VmUi@gi`k+Rd6w|P$Xqsq@?v<8$WwFcFHCq ze|`!*eZhd0A@lu&R*9_E@gtJk;j*#qDi=1wNW1h zFBZ=V^c4=PugYatJWuW~&3iGCLhT-v>P)WMamvzC6I$vGa-LMT@`)slQ9C@b@a%ed z>+&)wBi^{qmP`^AZRk$RJDqo=95Fj-c=nj9+Z%%bopL1O5`Q69syCo>rcsKZdJBCy zqV3wCMclvO0OXBD_ ziG0GGUtlzzT(4^qZ1ekXvYru3D--pX5s8J}Ws!N&8dYj3@Z;G*T{U^b3f87p3F({5 zrik{u(@XI$8wCkFL#wBU3yqhTwNmSd*UTur6mtDQLzyh5z#s$jgCM-1gQBLCBcJcb zcuJIfliai2ack>@l9Q1o^z3npA#J$b#NkR-X_2CW`7A%7T8%F(KwSx0da2htForkL z*?DZMV4_SjMZCU$(h9ZO9tdM-x4=?oBi`s~+j*8X$%M6dx_aN#*`Z~@7}tH5Mt}4U z3FkGr?`iCe$9aU+yr5Lo8OBiX+9@=bYkCuhf$IZpdM=oY4h3ZBy@!ySP6kEa(-D5_ zEwt=hgrCl{A#1C}4viGb&E;ikXR({{$nKa)eSmu)tpKlmN-x09Z*=7Hp?bu+|3sNb z=m5OIGW&fv)Qz^~OuG&rRw~BrLgRWh>dPAa+)c(_S1AaTV;(rx8C$DoHqK6ZbP_jK zKBVHJo?`54g!4zH(C-rQS+pC*u5Z^oLQ2Fz5&DjzUWB~rOS9qO>=LJd#LIeaCUz>X z(xC7KQt3St>y(Iyv9h~R_%ZWNCr{5d8nuIHmx;P!kyBSBTj*Xj_e^lp`@!_H+woN= z#(W`oq6gVJrTDBwdCB|qBFdJB^%#7oMrLa+rdNZogF?QpH%+T+t16hRkxrO^LijDw zF${QCh&$wBU9rSidt7ov#CX+RXx*5AF@M#M%fp+n-QjfqEpwNDY_NuE`DZXwrn^DKQI++@cJXZg723$fdB2a1XS> z$fzXM2Qj^5>+&LvF^F0_@9l(lf+@c3+c_R~o2BDvOOhU5kdd4K%u?v06yE!%_DGNO zlc`cEmh+DA%awrhc=qOuuMQQhG`?tQn)f?UbMLsA0|O!?sqU}(v(s;928Vj_D}*z8 zaV=2`PW}~gyk{>M*x9Yl)xgsE4Km)pc>46IN#(Iu7-}d?859o?Xwt>a6JYIYrdmTU ztjn1fzj@f%IhQh}o|u<6mnoF+cERZQR@Ux7m@8u~-Crr84%O}St0);wNOE?VOe=yf zsr-p2Y2x?a^MjW#Ex~xiWZ2|`;zpaEZkcm_14i=vlZSa~ly`UA*Wd9Dh@EzUO{&v+ z?udl38K%KIBuwb1$K_={GX*Bqhb$9xg*4L7Ii%tWt8uvcDe~rDrH4*I4Chg>oU)+R zf(G`k{j*;$>`osw1?XbTxKB&LxPN?b*HEiG$GcPWTjbFrayHiJBh*@MSOO1^vZ#HyTMu!D>x_Y|Z^mLYWJXBxqyzGeatXJ|>$fj`dc>r%7%C*iW>6tH`&s*ET zkx7Dry+6xhiaZVd+BHaxnNn+9%PMGefomY0&%&r7PWmU+J>wr3EEOA5)t}%Rl6ZKU zhhP>M0r2YQ&$R!6ahLlq=l>9W(Q{xr<34`%AM7=9e+>P&Zy%P5^x-X00ePyag*D(Z!cASo)+i@4BY3JzlMDIS2Gltsi&U?(dU!ai`kphtmzg++eAX6*rlyc<%kGt$ z0F9E7ks+)H-cL?WE~1C1^i25XC$)@ARfk{}yu_A4LaMjS!X^bq#onW$q_I@#sF2!T zlJA?OF;EP&rsYN3|X8*dm|a|H`q+H zC`+?a^V&7l6Fj%{!QfL^J0r2iLMk68)p{yK)0H)MH;aYRE?(5MU$U6a0|;?+P}t6D zELQXFnCvzGkClt0Tb*T6O{tY>OE;EKKyTsRE1 zu`yP ztuofkPe~7CuA^GY61?Yd;sI(t z=D{0%v%#yar16mDl?KLyJ$l+iWA%5l^k5h9XXo%;psGvdU%LAE!mlQ@3!%GCDD`w1 zDWP(0?f$G;boWm}&10J`k78ly-P>^_kj6z$BW)l&in+jUkYH~%g)4x_k>0*cT?jvo z!+$0*_I#mc=9htwKNav{9vUvSFQ z8prjdsa5|j_~otZ!6omG@?54x$b|mju>J0w{sh-?wAaF`6B7F&HQe*~-@p>N4ekBB zBL9DyAOH7u?qht20o;VX9TkS82UlM%0Fy&DqN|qv%f}h=$hsm|@(XtTch*2A8 zfB$IWe7hmi#wmD3Tlt(PE9eO>d(J8aZOwQRoU@UfFr zW0q7dKlFKb3m8qqX@Z4oseHpyq^)4IR^d*E`Bo1}@ex|00rt?Xq5yG~Q*%b?KR#)cM)@UKN?3hpGztCaNalj9# z$_fS+S(SB4Vc5qcH#b#lE#^({BPJbnW5x~SCSQ*$mlQm$Cni!OM>~&`M^k&@g^;iT zP$s_S#ii%DR0?i<$TH>31kJ_K(Y);lxMUH-_H>q^?dyRX<7v3QISJ@!`S-jgHDsdMWVHsI>d_Ht9-(yO z#DaW-yqz7*xxxpbINq0dxHUt)!7;2ZvOSJydi1RPC;~owQmS*QD1H34e0s(Nw7)#q zQ(T}a4!N;I7YvreTeAJbOV|A{k}=MqQ|vS(O|2<`Cb_fA>}P1cj%5?6bJ;QzFWGDH zP3eVjCbq}OImWOd+BJbIT z2P==Fs)#Q;ooi{6MHNHBdVY#IT4Z;)(})kE?tEONc}kgUP?+N62nrpxNUSKdMUAN? z=91KN-#4vis9Ti(Nb_FOUv_6moz9aV4!7JwtJHjWF_fZ6oD-Y0MLi0G=QMd=V=rck zx+O?CbR^jrhwiSFYXRAd6bI$f+0ut%A#+KSmT61N#dv0|o_H}HQPiZVC-CB9wnNrTooK8Hy zprFxt3+MT@kw3}x_PW}I(~B*WAsgEk_^9N=m6$?96Z4dv!{<)Vph}kmKDwGFMMic- zpWs{Yk-qx#!4(MHLZXw+myYnb*qhsoc^i-i!U$^HHm+GRh)D7BEUdyp&rgzXjKH0! z_2XQGpi7O`cmz$?C8S07nsr`IsbMt+1-fHJgF{6?3@#LInm-}~^mHJ_$ z!_`XqZ7_5S|ek>6NO zQ7&*`ldnt%xHN5C7(2=_JWc_jNaIEc~hp4Vk{ymB46fhS*2May8AejKPBkW>svL= z+J-T)xvvjniZy2ihALIC{+Raj_{AWT(3K*lf43bBeeZ#s%H>9rf%l2#%VTAE?%%5o z2Rbje^@^>KI@ij-m7e8KF?4ftHwm!8iVO`UbfWm5Cnu){Kh5>F>RCS;xbT*};dA8V z?p0lT)sQu{-UW@OXXf#vhjZcTDw>J+(s9~ouTE{)$>KEi2jZ>5=DBEhV0c(z`u;Fh zO}z{N5Ql6j!sy>#rsSVU5YPR_e+@Ccc!ru@Jtg5co zhalvAbUlxRM41d!i5S=;*bFBmM3uT?MDBWC%TB-SYI7?gOJ<_bUH-u%-8Xr8dUC0& zPlS1m>21GnyE1Av9EY;1#4*5)a&bjG_3w%|#of;}kSs8+xFv<|vV1?}PE`CnEL%Fy z#55rq5)G5fb@}^Kv9mHP@^0%RWXjZbKN8P`Fm=M$m00%T4#^!Sl$g$}AyK8dY~Bxz zYrR_lLR#a|5eoa{33`8T67$IpOV=l1AY0#c3e^~}wi*o%5p62=f!O8RpM@IkHNYZ3R z^7t@I=l(ta>C$M6YL`tx&tmM1W@pFEHfiE6h#`&wO9ATjz!d+jyfWLd*nrAWJV=V-H98do1chb=E(;N0q*C$|)X+ z(4dJ!Buiwidt5yo9xZR~XzJ>;n^-%fj6T!)<;zOAJUjykqA0SeLdgRUte0{Y^^y}2 zN|QKysAba9lSdn5q0YFf(bG{hSUb^sr6lLgvZ%7a?j4Uj+xRVDC_O>$ z+?u$A(R8-^C$Fl7x%T;`IJ^4lg_+2$LCfK+jM^W1tEXO$g;4e3ure2CX!2R%_$b|h zDJ|46#azs66K1dw6Ft!&+{qB4D4s_lgqN_b4E-a$S zT}d45R6FZwYrEx(%8l1cFies_Sy@P5 z&)jBR$%4Jn`Sb3kD-$otVU@1=Ms5NrrpUuZmT{-V{A*X{=2)aBp`<{Z zffy#rr%jMZ`JKs96Jn`lDZFYHrWW4Jdx?fyL<$b)zq#QotanxtpL3LIq`P}7(9=Ez zhpV(kOyQ27aW_d5#u&`Lb9w_ugisnK+(#zU(!nk+*C?q`JR!R(GQCUVP4h9=VnDHI ze5h*LvQXFixJ{Ccuj~Ty#wL3WIrj`5guK|~Z5~dUB@;eTS%@`WcmZEkd4Pn6cK z0KN4Wtu7>;thOf5w0SGi9tf$MBiQAB)mk+>_9sWW6#^ErBQSuSS&;E@ev)?$?%7>M zxh%Hj+1pl`MzXD!9Yg4vSR+0j%Py6Q80}kG7ErG>_wZZes+KRLjKa#PeDcw zl8Mq!t`|VuZCxE5rBVN*9*D6^jgGN!dHWAXOuj_=1zL~1quA;596MK@#UqJ(>WDhc z#NGtjToX+aG6eO0@s)*QjsQcx67YJRWL=I!i-i(VEn=t7&g(PX_{aNSLTG2p$P&w@ zH7`!pe}4{%Ejk%bsAj>+1B09cDYj{m;KKdsg1ztG-)d`b zhp=|*faS{2(6C`X{8+?0>sSE+fq@SnUV|hw{M4_Eye^#lESF`Kx049v3+zr1^%Www z_#mhC*}2@D9OB$;f`nzdLQZ3&CTKo)XotaoAR0jak9Y@5OUqmgM(;0QbjXKgz}S6V z4-`-J*OeTxEbAZT5Bywwo5Z~C?IF6uVImuGG z5+nu&2mPJTA7J!=Nk9oCJ84$P&(6LKZk42!m7Yh3j+VixlOUqrnL3HJuJv^uF0huL zm3aQ8_vVPdZSy>A_&e)6At8K~=UAEhND=4#mdF#X0B#(B`0}c)qe}uXe_s&=qqD9L z^lW6#%jDM8siN7;g>o1^-K6>}>QdOVqy21ZY8pr$O&Ig4mx51)!2wj+V1k?QX0P25 z4jNuL7L>+yS^e0`8S?ga5N7Pl8JIrLN#L?@+tf53K;OX*J1yYSvc0$nR!$QS-Tw*p zv>^g)wWNImaI5TQdwm%O_o?ke0LumTa+B&W4L2*?0ERy4>qbUK03rSd1KY@7z@Tb) zw6(RZ8-gBS_RZd$&bXsF_iIy=R>X~rK~K*AxF4VAoMo&o@f@oHgUkX5_`$-1XFNRI zr|TceVGvFcVlDK}U@nMowO9)L@=lEoa2PbJfVBtl8lun6$>2sS-3=zVamRbF?JZVU z7w{EumK4pXMN7Eyfvhl`y*Mu*P!1?HZu0=P2M&0pE5}0g5RhQ#X1+r&lHtvkDsEWQ zj}cT$%+!swU)8kdOIaDMlmJm6gp#}3AWL|05Etja*B{^>*Y%jK4xwsDW;@>;6jU1~ z_MqaQJb5Cl_scK8#ASgq^K?TN_#!~Q6=49{?*Yd#&Z+h38IX&n@g5g7zt>VT3OHA4 z?xlyWJyGADrY=msJ%mz&djZc$+^HX8M;>1+RtsGD;7qy;4Ax-T`Olx%2NVy^U%W79 zAtFx*fYlON{IYx3I{|C-X&n!m{U~X(@ivrJk9-NHlzwJSd8nA#RqO=F9h0B0R%n0a zG!79BmLNVqLb!8r@xG3ZPCxLX4AZ=7=MzJhOwnC==J^~O`4iX|vf+`3OdonEu~d$> zi@z~5Jnn~Y0}yHn@4C45jSYX0OG`7e9Xp>0<(%bf;HZ|C$^tr)ulo#U<>7g)2kfY} z4}|C)ka;EKI*ZxP-o6e>i&LF^eb)+xG&#oKmoHy}*pgHWDwV25ZA?i{HnFn{TYC@| zh81JM)DX9)zP+Tm4=U5^QOASM5AOdr8bHULx{e#CUi{k;S&B@8()U3YCv0=}NhJO_G zWp1yURDa=oJeNVHtn1cqFqqDr&E@q%?=T5)*+<%cP0YV?+WPAA|MA12IBYypS~g%XMhad+E|s>e#+ME7as`;~5en?zbQ^J6jGWBe2=kMZjR_P|F(a zy(S)31DpQdZ#7F`oBMzoF~j^F(xYLWpQlg68QF)*@(XF*RtpbR1#SYIkwLuZ8+_U&vg>%vR`jdMQuEPE2|Ei=!sbqU`zd8Bj z$kE)jaX(Y~7_$CH-m_+NpJqtR-YG+efLQOEyB1z`t`;W+leQ8= zg;bYmxS9sMZfW#&32DY`(@s8tUkK@)moMr!5zxLq7jF*sg+ij)7wK+og6w8-D6N|Zk!o7Xmj;DXOHzMV?$G8mSY73{|#YKN2zPMv` zwsRd1S=e5k1Mw_H?dwGIId7Ir-C$C@d&kR51N1hfnCvEY(7x{TFfRXfdU{|k@qECi zX`iJfB5Z5rsc`3i?j5@c7!k(iaMvKbQ9czEpm{!ZX<==p+>wq!yLA*;hl423Ij6N= z?~4ZJ=Ac@WjsM?yrqh<*XJC%=LFTEf2?EOR47;4V*f;k?G-g4F`FKqY@Hfl#LDQ)9 zbXo(WVHPA?dY$ATP0UGID!v745VT-$TG$+FIu=1dDd9EbU+V#9t66$@h`11QxYQy$Ne=lr6;N-4XF~kRx9&}F}uP&d^`V2O|OQqTTd4BPz*6Xg>SV)>} z-}xeud3Y4p%Twh0>}+qBAKoaT?nKQ}58B~nw!uW>9x*)>{`>7O9G(X#S(-m`Prl2C z3~f`Dz=A=$=Ang-m!u2oLF!vV8^1BX% zX6+9&=H#w5qg!dA1I@Hy5ppJ(i-Urij9ZjOIC65mQ)WILx$Et_;5kI6975ym90VFa zE^xQ1Iiegm>NuaCl3$*=%-1gDNZ;+AVRj0w^v2pWzM85p*AP9saUZAamDjW0v^GZ1 z)WT|1hnH#6Z+nC6w&}R%O*`l^R{RN3#ob#!2o+t#7ms5V*sF-{wI<}^&vZbTElnYi z@XAW!&oh^LG2twjA8jOX9)Y$^;=_{5BT(|l@Lv+80~lQF%eVW!!Rz$b-*v#zMw%5) zo$hyIM{JQ$FUGC4xkoHR;m&x*IyUn;$QP~bxxSQG6&ggje-Rlv_sY%D#w$-{{(+I^ z_;6}1o^QTW$iCCqzZ$9#qJUn2)5cK2J7tuta5^YCRo)+9CO- z>`*PGPCn9nIHyhywcWQZP+6;hDbNhF+6)-N7|O~BhAk)N2u5{j^vsOEd z*rd8Mduw?`WuLEJIX5(fNr(0roSKD&I;x-2eTstG#dirOjF{)jIR>*j_*Y&AUaLF}g8Qz`t1TQ7S4oPCeOL=bnB#g zxZ6V~^`l!S<`xlNxaTA2df;=`N~dAHEr|H0f380?xVE<|Y4LzXer9XyrM7zmxupmI z^=P}7#S;Mzl)9$Zc$T4Ko@nHnD6&Lh3LE|lYY5+PcCIGeT9eVqR$?y*74_zHsjbC& z=NYXMCYh^;VzYcZHRz&Bjiv3iV#IpB@dWlQrkTx@X#$KAC{5^3R;Qn^y&4<^e7bBR`1)xy)H-ZMGLF!t}nOI1^ zrFm~BlRjeCxmClX8)FC*#95S5@jG#@FtJ@P!l^0ljrh~azB(2(csqJ@Q^*>%$#$8C zdRWKv6BKc%SblW0b6|%sJ#G76{N`LtD$*icU@kfx! z4}i1Qs(RDZ)J7Z}!X{;l8%%ogi_hZKBKu!!HGRypyUXPcF3D`!y@h_*eJ4a!B{WF2 zT>o`O5UG_U+!@ObQALKu$O2KEAmE*vhGup?l^EelQ6BF-yfv6Gm#c?d1M-;ElVVx- zeQPQ~l$EZqFs}4xkRe(HoHB{wZ&OEr6jcfO6h!RJznO8hevrJkR@e3R6_sY^Ten{h z4qG_&{r0W&YH5)BN#;PmAQ!gv(BL4jUEZVbH|y*ZA5yQMAeX%v1^Z?xCm z{txFiUEw{R(0p9Y|GqdxLm`1Lv{_%sNA`clneD#1?eaX7bBy4k%U<7ocGjA3NV=6t zKVw}tNS4^^;O2pp;&yi{F!X2cg>jEq*9J{Z>CHzAHoiGG`#+I#i+T@P{71$lQ9dUm;xBuTYxj%5UY=Z^cxuuJ?Qu%>S+tJkHTmIlO zs*!R8H$FGxUtQ%i6eC})95n;%ijyzXS)I=om)}M6QE)rv-2ksdgx8Iv3Qb6h1!}^zd+Z`2#3KHQ8P! z8s^}QoZPax5Z}Uo(I|P$8v^w+P3G;zG>xubWC(R$FCDbAz33h8b%L}=NHijEX5S}e z0qD{?=+gknUX9!0O33-^`?rX$UrYf+PE@W0x$WfIfOI$_p0d6!!HeOi7_d8*r&LlO z?Y3Y%Y~oV#MqA<=^ZI^G)GWEoPIoo z1(*YlX$Rl|lso5qE>cKcdGm$9N~7lvMOeV8H`%Tdu?@q&Oyv}?BI?&~%95s-d;|Uc zaa-vlBQeUUkJ1Fn>-I4j4ha;gFn*QGcjX#$B?|N5F55oHD*u42!b$}}=n=f;t+>Wb zPgg2`$96N0*^S⩔jgKz`Eh_PCr6eBN4_h@L~bww=5E$xQbDCC}`b{2U;%YyHGFK|Q=HuiqTOxhN4ru>u)Ea*N7cK6PmtI(>zRyHr8BpK_Gwb6UEa~&U2zt>(UUHKWY7wsKb@r5661z0*tJy zDHe@>7$t#`>bc+VUmn`XRx9V<)wxU((yz5OteyW^N4(O5EG<$#tD>Qpluq6y>Bm*% zD5|_Hm`ctN#ELnC*hQN2RCyXnL-Q4jFQ}lfsa&fvR}1Z!z2G-j`y9~LQ@hR&tc*~S zlV$h}YB#vC{<7)Ns+qm39%6O(NxdSaBZ+ToJ_4YhYhjIvQy&J?D*`X0dKW+8R@4)Z zYgUTZ?>xg8HKew*;EC&}nqC&4^lp5m);Xsn$K2=}3_fru?L1Wv`RJbRH~kI z^j!8ihc3#wkTubx)eVU86IS(AFWQA@2Xc8|a+Un!wCTk~qeuz_s5=WWR3^gy!)WVa$>+C4cH7J?axo7W*FRE$Pq_{e9WhJ6*Y$5+MIUtD>ls9P}5yo ziJeGTUyzxb+?uOLu8*KtgWB{?r1}e_GCPohrRlCY3b0m>rm81dHtk5zd)Xo0EINBf z3)am@k2gp%TLDP3xYMR9ln}_>yVA3>QuOD=Ct>SDO8%ZW%1nMb5EX{0%-Rb@(W1~v z4WGI&)032m#Kvq<;d$JuSvbqd__^rg`7Dbx!$PbQwCZ?HQxNI3dpeWiF`>q!xF8)O z#YNZY0||ysSHtvl_=LJh!$$NqmIi;rhVSv?jR@9eF76kA$M7rkhgT-f%IGPD z)Y$|#7w;YMxM(zP(boIO(U2m7-T1aumlOcW6xvr-rxrrO{Rx-!)|zwF>FK2xw00a* zOugvk4cpy_H6a$dG?aFzh*p$1SLn^O2`6hAE{L*+iix>G+rN^8lydxLtK7RU3Wb`f zs>RoiR^CgDl= zIm<~cD>=^|HFT=ItF*aOnT5Qwt5EC!gTriyIi~d(GvS5ml9C!2GTdf+; z*ZUR<3B9T7J8BMH5}Bt^_c2ao<*9ECPCP1l9-9r{&W?^AF)519%|^NpJJ4V4MwrE1 z=*T#g5N%}WveR{xtd;e5U%}Q#8Y*i;zM#xV>P(uhJhR!6pnC0<-JucwC#&DMfavw? z*Y_9*ulr>E(#xpVdD!~mY>hM}8{@?#;{^n5f?-M@+NCXM?FvP$RkC-J)^ph`A);tF zE2(T2&B|mh&O0`;9o7@H{ZIx5tSxFITHSv+B6bT$yWFwzd$&pn`@S(&F1-^|Ya6}; zy@6G=Zjcy3)fX)?p_(!P^_3%tpGSG_8Vo4AIjS_Wug9cc?EQUiBcWYy zVaI^|#@SaDsf(Ihplg zjcesp8Qt+;?@c8hKOxlJ&8FW8+%%e7EUzy^uC(F3rOpn-@nVdz3y}m~Os~|LZ;Lc$ z&OWx^%4A%_HGg*<F9~<~%~!qHFd)a4Qd_~k zA)ebVZ#kKsA+<|tyylq!xCMEa&nF?VLIjnPR_~?qYh`|FA)eZGM`XQgJ8Ei7Aw(&s zX?`~=t3T_ZMDQsBDvrOI6iOh0#JU6~<~LI4st$*6&=I(%5ALuSy`} zyu%qy^UsxV3odMt^T<6zd-8dO-JF#-#D0nR96%68nFT$!Q`ikcoV^bZYXbaoF z8`+MDZtvKUzwoY5_5Dz({F{E6`@UFepVAB81%qJhhLvKV9m3R|eWy!G)VB`l*k!4M ztjJ*wPO6)ar5qXymy^lT;M?%-EW+Zm0~QQ~)~*+dQG+y_KJ7GK7~7>^kn-yBb0DBu zIH!&GjTcf~_^o zDD0?GK^S?|&@zTdW6e&@k>QlCT!0hp(qg9&R<*`yZ$+7Kwz?X7zIyGQWgu*-?Gi!$ z6YEEV2kW=C%)sA|a@Xmv%3P^0SFn?}o>4^07U-obDpy~jRaMgxag)bc@BHX%F<}Jy z?X(n{rWXw6mdgj5>gzPbS7u=cQyvL2)_aDtk4`nxY7HBGuBaiGt`kQMthH(`;i;bZ zaz;^Ie0m{$?QPan#gC>vgW;L{DXyZ!z~~{^{+p%@FM5;@_^d5z0@A zB@DatCf|sgdlx}8G_K0Zch}7BuYWu~733&B?+ZB=aU=7$KS>N$H)*_NP!Kd)$0l>g z!Dzl6*&u3U#Bm3#cmQ_*F1Jzv+-UrPxS6&vg5c+vbY6gwMHH>1pn^q_Y?}ANBmz07 zjo*FCN0gJ7PikyjR#4{QNwmx^d-3etGTXQ? z^?PY$b=yzAazXM~-3?9Src{&!g-y;fj$4Pe=vSX#1!w_^8pfP{2mVN(DRrt zdE*L(jZ?IA3?A}Y) zwS$ws@^SLqi8yF3kx&;Pf@m)M58AQFAA)2GlpFUQC5Z&U^i+`HvV5BN`;U%CS5Jbp zFN6qx|I;SY#jgGr_IkU2g(}C@+PH%)xVqn5vmCS<=M+2k6G#oWy}ixYvJ_9?Q*X4D zb|{}18%w!Yx?Sp2Z&zps?U;>49N6R!*lwV_d}oiL27Jn{V*;+EdP0ck8=Pr^u@wul zEna+(4^oi;6hl8~#<#ZMFKavf2zkl_Nc-%a2^1Db$^&&OV(-MoBqQ{lLI9Kz!f;pJUt_HbZ1n< zcXHW!XU|O;*V-D#d3-3DiE6~tCfgC!?v*wmX3+%XX9Tza(Bs_iPfoddd*eZNx%8lq zPn3YTa$&W5fK7m|i?fz5- z-P4QH&+eZV7HT3A!6HlAaG?$F#}~Or%cou};TYiR*Hn*GztjZ;9CIb~^fSF$k9{Nd zy@S1|N1^6EwuZR4oKO4bSSz;}nSkJ|qmourMW9=yjwqL6+e{BA)}l~4$He+(W!;Cx zE8|B%%0>}U(SfnCvBfL@3p4oD1hbd4?{R!6GdU$`*tqom{=g2zeKR@7OgziXW?=EV z@gsmvXV>$X^-_tm@xBButv~$zpIkDv;&6fk>ddzWyrdkjnX5+l@$+deIbwm zlN04Eo}hmb@D$)pz6x@7qJv^|T)pgV)LMV5>K*o3eRKS>b|kaS3zuf za7sLJ&OgW=Y6eIrUKn7~(DxI$n3n^tAdgp%2au_--}o*5aZgq(sZellj5iMmkcxRHwXvI}?QLzK07fym z%E@Q$w@%=9yx7;A_AI89^@ zAb0$LM#A7^s9pw%YT54{t33#y{)-OAEM)5U=YS?X!Z^{sxzgV}{OZ#FrDxs2R(r!O}Z z5y{n4;Zy#x01yN+c}iT4DJ?BcReta>QfRi3L8;IA-nVwVZ)}Xw`0+0z;%6PpxJrTT zZwH*f!$kyz!Yokgd21OIo!l9$<}Qh`w%o+>_FbDR-Gij5Q5*b>NV6Og0ql7_gLXTA zNKR2PQ5dj)`D{m24_&51=T zc)=f-*slk3EdU(A);`{(GiuoKG1!`^-HEAQQ;0?aD3hksUYmIaFti2{EOzo8_e8TR zxq3z-;VWj{`vJ%_<22Qw#qZ!1|Bgg@WS(u2pKD^>vAumGGm}feEuRV4-CcsCLRD3P zXU%#2;|&#oPk(Xe?ozS<_n`53DRIPZKalq|mwJ197mC?C)MA2V@yNj71_gdcN?Mu- z5*_ShWj;9cwXnH;z+;u<<9m7r{b&;r;EZMtjH}q#49^Xq8yAwp{QRg+E-sq1sj1*z z7SSd99|`xvHBsqBFrdCaZPm%$XV;$<48X2IdA?Tl?K`H!h3-3xr>xEbP@StMc8gv# zvK+jS)_VGx=L!AR-Zw-0%IM*Eu8ggjJPG|tnfXCneoj_a{rESDaiu|+f1C7U&!IU{~n?8 z+*kgr*8q(PD3|@i7T}qc`F|-xN|ydB>Gx-gr2pg8@z6Zi%CO6MpM1VOwXfW8`13iL zVR`w1Md6aV9z0O&Yzq6hYW=TYc-z7E!tcB^I!DZ|DWyq&oqVt z)z*6^(on8S@#4UG*zM&aQX5p7jzZ~(J{ofVcZBI3bIi~ZP1Al? zo_IopS^hJiT;=~Kg8Z|7^R-3}SV3*DEBW-ZVJ=|!n$muXqj9eT$^1>eap~(<-TN;H zA6#h4Qc!x*_60DPoIbrf0VuSC4amEk8PDY=v!A&M5Qjj+&9brc;7~ERD}XUZ$I4t& z<+@|9rG7qKfZ?dB9&>e<0M81<{~&h$Gws$Y;A_V6`BL|l7W=3CZYHyT6f<-_jf+A( z5BV&VtSwNqpYh_IGn-NDATby&s0)mzHDF1d2(>E zU2$=V1J{2P%GLi{D?5(%Y+N|JD9ojopwILI?hAk&U@XoFaG21)sV#%e_FL~C6+64H z1l|9lu)Wfcc%={S-G?mF{!=Xp3vSHd7!LH^?ij5UIn(?+8Koy8dXB@EU+M2}IJ_$7 zi{}vPJ>&;&_>&>|lN^d>P9FutxVN`^Q@O8vaKKTVt89;#M?@BA*j2`RzY^};x zx+QIUA2;V@P*+DZ74NlEp*&a0F_ETa-TI`%>r?2BMEppbpi!tVm+ARU$z8GRAV_jD zC+`%20P;?yLfqZgYVjlhFK8}IPEYToub=a!Vrij^59Huid1HzBLMHIyiC6g>C$pO;&OHWIB*~HNJQ^*i2wKXy`_^F?4UgI_z*04PTF%MhT0YRC?i^Oys`&`a&&tsdhbNL=ZxdD1DEr;2hO*WuLfE75Lr0ax|NP9;1e`Q=O+K~DL_qqKHu4I=Q>t>Ct#9`k?qT?f%q zTP1X9=~`v9;8c7XG^r@KrJ3k4(WutmCT(|X(`<{+vpexESfZ;h-b#VEq@cOok$nR@ zXPPBXIWo@Y6j4V`-L`vJ5D!DZ-SaL*t$%!`RxY9I8w7;_BXI{Mltp-1;SH)xR?%_- z0_9GbX1}tT!lpclZjPOZHvF!sAf@cSF?CoTjAt0GP!czR@`)hRt$Nt23ycrd0eaf3XPWd5+x64e!yQv@+eezEdjn5HW$H2q4W(@&jN# zC9g&x=^eo1Dk9FGg7|*^5yjn@EU?%V=-c-EVv?|HXB#@~$B_#vHl2&(hX^&L3wfaS zm%|i_v}!5$GAp0?vtm{FrTS_|w3n;Z`q#Wg=ek2?y ztPEOPnL30GpmEk)CTg@0kDP>jc5f|83z{MiVIanpe@+9LO6LYUuO3T;iiwIjAVAvi zc0uX{xhAEsDvQEwUTQ*W?t2uNrpxQ677NRpO~zXzT>8&=phuAtGD!lFy+yQ@E4^`k z0ZLy7^6ppD`A5dZjMvi9n0dT?N6G&K< z5Mnkje!s^maYC_`-E0~1#)4@!0uk=R19x(vwK)+RMpqdVLpswK@=v?ok&Shc2^ zO`;VN$EyXMHSG1JN2E+JMQe9=BpPpro~Shs#K5V+mY$m)zALkUPPWv~ z-_Aov32*&EihpKFnZ*lewJl=&6|PK2J~~Yuo9Dhj&rZ@dn^C76(w-tmOWXxur-m)} zk(`{NKmu~Sl!k;oU@lmWVSbTZdJt>eVK2=L2@aXYXRvwQI)EeW{-_fV)tWpF-IlOn zWsE4%H#&PBWGQId57FX%JGN7p<~~?Mx;l|0CV{Kp*_|Pi4uVfu^Q;-khusqtR1|dO zI|`CBbjqPygHPbB4kba0?HMxCDh-4ra7kNN6m1~VQ1XZ1$VEI{_;J-H<E`AIUJy(ysXC=15z+_H?D#a_cb?OBuN4IwbkIk&@CYufyFE z2J1;z)G0Y45jf72al9YAmzvRxx`Pp&APaET9TXPRCmqG(0%q&jS0pkf9_&s9xcfSN z$aw+hUdd!4pf2z7eMt|)LtgSf)5G@*{ri=BWx`)Z;Kg^3`{KWQ%)EZVF25dEef^&u z{FPe8!2-bT4TxHaH~vb+`F|dxq5vBHt*r9=?%L$(+VMfsnImu{AH^&1j{~e2V-M~L zm(r;afF|6I)&SHL_z`dX$B5=J`o0#6_gVKprg;oux0@7WA=O9a)vcB%1D3A(-GIxC z76Q1g%F4@Ov;a;GgTa#aPXTli;Cy9(I5|55>OiRdlX>d{*WCVuifZLd0~Z$|NYBJX zBH#!UbUSO$L7?0msFF_6!4KX3o@>8zD(+8t|CHl$Sl4{;;DIpObNpP3D$HfmU#DUV z1^8_i_W`_e80Tj7ea~Q>w`$ZBWw5YV4RzaJ9Turna*=hh;@xv=4C!>Wdg5Y!J+mC!fXUWr&D;RQ<(k~J5Hbosd@aWo3H4A zKH?Fac5a%qiUHk6RTfw*&jO3x5&&e1^r^+la=A&7W$31hFg|Bi+*$b7sVx*7cp4G=UYcXM1^|M`2W`1Su`GpF&a zbK<1FIAU^d!abOaE@@&}1{Ow8sp}Dq*Y#X2+8>(jG!_WRE==QZKqube+n7Vr-5&nLrD z+4QEw{sZs>tuDT@Dd+Sql7CP}U?>88ueFpZu+nqsY;_*D=zeSdBF>v^^CP z%$iq{QI8wpMNKn|gS3rJp1!QfSDWWlD$6cEyCD7ly3tlt>zq?&T|xd!!_MIu%p z&q_&^gu6TV1VO~J*J<8QuF!(V6)p$sm?Ml+H{5;}r)`$Yq1eO`zMc+-8JL;Gs2{y8 zAkZpD#4~_|53t#;{EQ8bmt*Pbl4 z=Y-_c3FNw8FL!<3wep@BdNeE(dur>wDj5pLBy%4?(b40fjm?&+iUzvhOjOIc$I948 zyBJ3>6u2)}fLE?Yc%8g~q&MTt6EbFZ3mM?x2KH|+aDtv%n0U$>ZezEOi~3^^Ig+5&ys)rnQMD*I?7QBZF_Pm^wLb_o@XgF31OZcBKHVp{Y%l#!IP# zOqL>cPT`ldMBKwpe4Xgy2e;h^a(Yb%7ZAcRb3IM6hPvM>oq~t)8k-8fA8$pY>cSWTMNN_-Zvha>XX&`dR}|+=>SJN+;1#Z^N92 zk>PuOb)3mBuySXg)=H6mNG4C9Nz6*-Eo#IYi`{GW_!zHacZfBcUJ%N5NeBMu;qD!z zp^e0*#oH|(YMe59ry%r6P3;r6v!`xWuvaMGxAvaw6_z5l7Y}7au0PJOe5q>s%y(61 z2JMJt^nx)kRL6wN$}v7eNhI?{3i-!7^)QB@nmnt9UCu!Xi@bh^n9b3vx~tE%m=uXg z^p4iGwp`^KN@ZQ=9}JdUBW#W$#EUg!ZGRqHCHL@6lCDJOyWe|GSSoMKJG{zEvE0Pv zw~;9&u!S{&{@p8ki`Mmt+PX1YGY>Yqk7VX&Flb>gZk`D}H@ArHp4*ph%Mm<;CuuPa z3)Z$s`AHQuOA1jEBdP9Pet*4tsUTbY>z<)wAMxDonotY|Wi##l{J}-FEQ998q~6Sa z$4KF2ItPc3(m}h*_VxWuUumc)D&ylitPky?UvO@~+=q zP}p^2%f6+`g75l=8wbsyJq53@AoSuYYL(jXvRlnV1#UWo)v~XR&c^iLD;xNdtlYO3 zpLuHhP0bX)Tu6qeh*#CMnLEaFzVg+?u%n10l4d4lk1?=5*e*AP1LLc|!9bno7(#0b zqN0ctCUgtlTD?ibrIwgD9>m4@7-CVK)QnB_)l?-TYk+8r*Bffx79HTrrVutTf2p{B4M6)a!=L^9VLH^<6eCTI_73l2~-jtTj9m!i;&F4sr@QK~y|yO1AdndSsPo zUnIKIHGN3|i{K5PxX|S_L#!R?KSpb(Swx-B1jeP%#M@?rUogAnMkMNdf(m1AjkwfT zQtaBGjJ75HE00C|*NUDQqF5D&vwDYIBbg)>5-S+~ zkm!+^(l3Eq?CNLg<8+-2A$$AE2cs@C%y#;Adtb@UZuQGfPNIb*=ISE1TNMsR`K0I7 z7A&=bl=Fi#UMy{B+p1pW4$^B%nxcUcuZyk%R+HM_0xvQ24V*$<(-C&nLF|D51?cb2wEte5kwGiBXnV_WIpR(=P*g`t>)7V+nT=L*01JOIOt+?&_(i_-ZE3 zbzotlpVfV5@xIQr@BE8j+i?ALaa*O;|uM%J|K z<4A8_xuZ%liL*Rz%LJ-~r zvtnGeRMnWSmF~y5m@9ddIQ@*?IcB7m$F-DCqu}M*b1~BirmF-Gud$^v=eXS>N2g;6EN1 z1XG90gdWR){#;k0pUvP>IB`AoiH?3-A3;)}>6lv!AEV58dp)+iujFe;%qv>Emfh>! zPsG{TIhBc1zJa88?$dl~w$H9r4oL|K#7C~dp(QQLhdh`u*Vje_wtM}}yx#6oyYb0Y z5Il%#5ek6%d0n1q=4;+-M3h>4))EG2cXSbW4ag-(!Jm~qYTK5==B(3PCezDPrH!nX zq3%g7)-ltZ@vpSA zMjArDJY{>sP+sEP*s+XL&`*e&ab;7|cRZW!K_*q0SN(S5?gtM32jocEyLg~i85K{r ztS^gJrXI?Tu+dOXki6S@sccG=|7IwMMUhG6UDUXNJ`CQBRj9ytI8%v!4y`=)b(*7Y z))t7{8=^$vb=VYXe)@iW_~{km$4u?Q;y#L37y@cu$S+tQI(=9;@~p4B^;McH-1G*U zJPtVp*Po3|=jX!J7gsj#wls&LwyvvNY|?5mRiBt8^^f@)f&?=9m?S+m9x=z)k~PRw;oEd@iS53HVyS~yMEW37Pk)QJsF|~*f&6yaqn5Gb z>#p5YY3tsMogD>yCmx4vAE+x+uZi>J6gF`}ctS&R&| zIsziPiGM>GYROUD?;-iVt%#rAdsaT~N(Qw9bjF2`Oa4ukoM4|cHK;bhlqPkr_u3O$ zQ5)ApFRzKeN$XNWa7JxxGT+YO}I9-A)U}t zjzjPmWYJxBpdWeMcV#-ynIUlL#$_i_4VE^x%@--RlCLi+5+L|hhOk?0xlxyp&HU^2 zP)7EMhXW4Di$WQp5YhC2n!G#CoKbMj`I);r_P!JP-nE+VG`GUP|1pk*rLrfKkb~Wh z_p|)FhW8uYv${u*9#?Helwb@EJH|PIo^l@wIysNZkDhEr-BQTlv#i`1P>c9VV8pg~ zFk$OEYD&im)e5NUb3162-#_RCPm@gYHS$(Fu4lD|(q=Fhsc!&ChG6aM{dI@-sq-l$ zX<&Wb@*v86cv}7pouD{+vRh*AwjIX;b}mhW4iNnm2|Q52-Vlqx(|R7pz6~dy{eP7+>H*w(-T@(b@15%!|_&B(nh;w z;w;JJ28ud^bN=TihQgagp0GeDg!<&!V8UBf_Nkw~G+1hVMRqthNBP zi>RN*4|@3OFp*m%XoczDo=75a_^)6_{@Jbmn?^60&F0KAx5M6~L_4BC3Zf?pnD8Jy z9OdQZ0P)lDE%!|V_tzVLTF(NQ=f-#E&SoRU_KMEg$kd-DXL}9DMKVmz?$Q3{3Cex) z-|nM{D_jSzemOdsAvkO6blVLnnQ&Ukk`A@?7CznAJO6ijn0ppWakk%h@8;FhEnu5w zR_h;04XX;laar3;B8D|4>KA1ONg{Ahy;;*{(#;kfv`Yu4}Vr25Pqz?3H3h_4^b!5S;J zagP_>YtIhAotG)94`lt7me1zL_&xRhh)03pXX&8<6mFwG*DV6j4Uss9Ko4w2pHg4a zIcPyX335Lf+|7I_|3}EfT23GZ0t>;XOToV4De2che>T`kf%B?s9IJ4Iq1?}ofI|D@ z2{hbp9kBOl?I`NV|A@V3_&oMME{63PoTv7WSpL6tGLHWntwPj!AspT{&5xIdb+Gpe zttiNS+y3_bd2!P+_RTQ>2&x81Fp_KyeaBQo4~o_X6_=QM_02h@>8sn~CSdaEEix9q zp$F{+Y)_N=JMQWsx%H$4J5NdhbYmRc=8_Hbf5~WY)ZA{{x8KIi8}$$uFLWKnkU(UZ zHsW-PS4)pG?zI`R^&s%K`bGNxI3Eb$aYpw_9Qg@EfZ~rh>7W0%DKhao_!k@c4 zt>QjP*}iWS)*f>gFDWTI^q;LRmDl^c%a^H!us!01F&xZ+knQ)CR~U+dLS)h<;l29# zG%_9I3)Yqi5kHD@#%t#M)^;S6MkRvRzj2;Nfr&YS$4}a`9-MSnCvZUQW(;l}IGeagfVKby zgY1UN(D_w*S73?QT78h&zq3c)r`>t$H)QR6FaqkkXDEZ^IVm~y_@um(QS?mDgSD-9K8qR3!J3xIPAsZ<{|-*Izg2DF5(-bNb_eX_ zM5*oJ%ER8P%I^|cU`9MdkR{O)HZCO?p{(CtuB~dXqIOFPX@mg?IMtvXSWxO}F4kc_<-qhoV!d z<3qw1aTICpMjumN<~-;@1F)SKtSE!DuJ``P&a)i!Uhia5+Qzr5f-6E_M3xo2mug@R z1JR5)To)LezDZ1b5u-OJEX&Si(sLa2XcEBH^b}cMCbj8D989zDlCR~LTSuIpx*Z-h zsybP}!_*6zpvd$oit_hfReJDnJvS5p(UQjqVXZ~!d+g`UyDu@JtNFNZfkSMaF zPPc!Qq=Lb`Le5*T) zVs7ZRGi}2)0{W*pzKJj$!G}A_jTX5oguJt>&x$%i7US05+#o!*KCn_(K+E8(% z-@ftQFk;?1<~V}5gy3T;<`4@(Y2MxW6H~6S052mm%NN7fyYWd;qTF0Hq^#bSea+*Q zb@SSkq@an741pb|xaXGacQDkIpgCbWW}%ESFC;%?uy#H#OHAh|5uqZw7Mmrzh{(HZ zmGS5q2f1!~S$*3OXW+O8^hl;pwMpl7ai}hO#60Z9khX^YZUdo4Id7`t}a@1F*DP>Gu6WZQsXT71aH3 zG)vQr#rxHDFzpFfNNg&{Cv||-TK{9DQC`zVqT~yoY@B#e+fM(r&@nz{*@5!j!rbvi&zi&&yWZv#ow2l+jBj?7y|4%Aqoto2 z@fHtjPJU*1t9<5#zA6gN_?Cz1nq<)Q&*7C8i9-aebX^&h76^u~Uqf&`&Of7e11N{; z?RT%OV2!*4)C0aeZdx04v>QY+_%l+`&j);$T3B&4MDeU?1>n$u;S=1iY>{esc-D*d)5an+5$m4Qdk;Hv9&y6xe8qh~ zcvyWHdiTUKyInEoie_w_F5mrYVYJ{OgW2)Bd&&)vMS-`i6))1ONT?zzp9&CNJCsc0 zWGF#dx$PF-V0(Z_kk8}2519$PiR#G7?`{bjPD+}SM2ajhHrFpPWe#R4l~55mcgL>C zIH!oC60XwYrM~()-;r3<8{h22_qx&^?Q+LpO5tXj%G*L14Z+n|(=4SCO~Otg?A50} z4b${?Dn8fcuT3I)ufK4PURV7#4 zF7wG!EoFwMB^MTB&!*>Eafb5B2L%EmzAm=XkhEX{jsAsq#jZG-e6}14o)FO;*5cxK zh7nS?!eZXl3EqEtzEa5ExhY$l%66+qgYgZWjxHi!cBR0!;KY|?@(34j3-9gMIP1x% zT(+iYd$c*%zGLEL0$`t*Sb}7~u-eBS**D|Xw)J~_9F~@()A>pl>y_ax7Wy7-$z+#m zQ@s_Q0$7!45}d}Fc=VR>m_#SRZ8AdIXAuz+&gH4xgXGVR zbzVKP8Oh!g_%=+mqW=ZjPDW95_2PdXH|o9o83}oC z%JU2%ByVgM+H>GPck}8NvRC_5_{qZ``(u0=&wVLI>{YTBzeC2+w|APY)TyG=#J^j z*LZ~5U9LQ>y54@MnRBhI*BH`DV<5M&Yo90RF10kImlBKkj|cH6z4e2x6=qh{1FizW z%WKNmi4D($M*%t2gAsf>u4r8+C$AlKyv+NO_c(<>a70UX9*NT3*|GR?StfG2Hr!S{ z@TpBkws5A*GB+1PltEY#R@C}e1lXvD4VHuyE-o$*(^ZlE_M!AiLf zSP+?o&M?}~A|bkzcRrVub#&D9+LPzy->2pX5jy2`=YFwfoKlZi7U*2ESqR5JVUj^ha>?-*wlsDt=Eu`=N?b5lbU zHY;gBPreb1@b#Jbw+w{Nh*B9*OuYWYOYYggGm6y_s3UpXL`hYU+fqv<9{YuYulYblKfJRywHype*9(#A=^gq^E?lKN(=A_+A|fILgU(pLAJ4v7 zwD=flU|j z>RVV~Klr?+?}ZNVWcnL0NvP9LQY_B2+`6gv$cbM}=bpNt9aF>uWbLDj69*r$!i?~b zZG~(wKd+4Ja7K^`tSoZWol!`f$KCITi(jUqc|*aC_X`iC3%Hc1qe@}p&NbznI{J@G zn?!`24~B#w@a6#=jp;5jv2KR!^PL>s&Qb-KC_)C5b? zv`gl>`FU5xjx0y8VqUZD1m&r++-=sOCo)#hKu9=lZ&+@k&{gsa&i@Y2ukZ0uCi-@1 z$D~&fQ{lgpq=v9?wHTRv7|!D$PKhG&#p)VMR?fan&JwnQSxi9awkIY!=+<()k+*j9 zm2*swi|12;Cl$Pxxu#0x|Fst&@YaJUQ#9=agIg`BJtsKf#_l?zs>Os=j0bl#!a!=C z$?DSp{(vS^00WY+UU*SN$$HsfX5a%A?zfE z_a#ed2$Fg|HZChNT`i+-o8YQQX~DtLoZu99&227IvGfvtS)a)#>?Q>T0(EAO8$_6% z2;J3nF!lRk;;T=!iB=x%XI)OdLZIFCn-vdPHav&ZbZ}j1#$w(fd#Hcpsrk}21;}wm zMAN!k4f-tIR&=Nfhc2qcyNS3Gh=yt_VA9}_S7^(7*FJsUKdcd8{&+XX!92)sdcT+c z$=9aw7(R-QHbv6RUR+?n3AS1sxsE*HZKS#L1xWW-R1fY>7m0jmTp6Sa^}(&4jf3Mw zGM|R7+2i^HO+UCCCdCKH!eX?4`*ZDR1M9pRHV~R#0VilzC?mG5o!=rdjWKHLIF)S1 zg|l_(Y2?;Uzo%D7IhTB=nV&Po0wXUaU((D>JED#~u#uf>r-rAu;Ms)6n3v@HchV^` zT5LA1vuXvezI@k*H=$Qw=5)1A^<7rPBvJ@{HlWPQNV|tc8~>TlA#MYWGe2|RUJP)v zNW>5tzp+b5I*0uOjW`+5K#TYTL;z z#!X0bk$pQ>wN8Oo$%J&|b43n&Fp_ud!aNE1(N`MTI2>(Y&BK?$s$+EbAR&(K??+R5 z176A#bp$P>z)&748L*@3QrX*nU7ATyr@Rge!Kd<;@6k&*gVyqi1!Myh=69rIL!5?5 ze_IaF+J*j4xNev-q)&Rm{rkWf{NcSO$mxy_$?@J9`QjLYy9h?Ih21z zS3AnYZ#ClawKIF<+@lueZ~U-XA7;jdb%LbzoGqbIY?=yn<;4TF*36hI z1%umega&su618_`7S;7MmA5f0s=7_=lBX{X?0gzbE&jf-0h&?Vi)pci&ZP9euLj5z z?%>urRGVJY0VdePLVE}I*6QO{T!1J76+g0GQf|br7Wz0HQ5@VjMHM2bI26 zp+cT(_gnCabx?s|0zor#Zpry;I_5*31#w9#UyGi=A238YBfj}mt;S|WqVf_*4JxGn zK+5|V-4lQvdIFz*m}E4mTYB5-#7lmWO#zUN)oY<`=GsR`y-&RTMz2N|FR$LFIgGVD z8-Ci{ksWrTnLBK-z0KssC6jH~QFgP^IChj9AI0@J+IjxT@7w5{`p-f4RLoj*L!C?E zb3?c`wB!~j^h)y>*1ZO<_-Bcfl7>WYU_P$nykG^D8;4Cn=mfj_zb|bN=iZ7Q>6`gn z$E(}p#mSlI`LyU(;4yXv9-+=o@6NK1gR`>nNrP*xh2;NSpaKJ)=J}48-)xAVag!PT z*WGFPZ>jxjU#PIxyLXoWc6W*`z*i{`)%y6)%%-waUbqX&x98{Vv3^v86(=-W#y;CMf)A#HuJYHZ)Zqyu^xc`=7e#=1h(za zA|qB%^4s9k#z%`Ch#$arf0_s>(B9kISDvQ4$k8fq`2HOOaA{F&Q=E0X93G(D@uoKz zDo%LJEGass+}BLq>jCMWrHBF6e-<9H{nbS+3u8%mlFJ`2tDHS4IN(U`DmXghki=jY84fc3_M2M^mV3Z+c#{jKv49wSt^~c&^dL=OD*LgrV1)Z9n$G zD7eJt*mQJFR+%UsKp|}RB)vQHt6=rb5erSA6GZcfl$SD}Lkqu_k&RcsK*j5q|JWP1 z`*-S+jABKn?}i3Ps%e5tTO0q_wTxAg_C=w^@S$*4o;op29Hcj?BcwIzt*T(YhNKN_ zK7+$r%-P)Adpn%m!g|Rf;_62lHBRJdB@cpwKFSnpyWT7zRVpK+e>8}bAv=GUtVv=71j$-jUT$OR@EM}+E-Leg>f7yRpR;JxT{ zpQd@J>NrLIf8-C!P^9_0RV}lfTT|zwdFmije2Wzo+QY;En-lWs|7CY@q6KDt>xgZl z`U0m{4|k^>Qrx57$sO! z4apE2oZgSe)$qYFk-ZbAbSV!TI)_<*Yhaavfz?Xk0jo_3!+cqq&7*#dpF?vkfs zJ=4^eoIj7MGqLG*iHoxLkm(kQ%v~L*0Dr|$yW#JP`v6V-AVE32f*!_70BTcDT8r9zodi~Ddhm)OZh09mmRJ!Ejn(_dtG+SmaI~3RHJ1nv^$<~wdJ6x zQOV8ft&m#L<4W`9<8D_XB4)$239{km#*m(bb<2+V9dtH#Bgms7Fjlm%pclNHdu- zF}4TI59xsr5u>O3=$hw@iVg%_dOIHxEqs@&k-I&dw;TL+*^wkc; zNFT$;6Nwm*a$;8Ln=Gbg9x>(T5PtLH4K{LJEtFYBZTTVmd7O07E@SqulRF+|`E@`4 zbWpKl>Mej|REE>Ww6PaHz#hbTm{u9Bl)0!#0-P-~W=-1} znFUy4W7WUfKomN>E3p)Wxx+$FG`9Lfb(OOw!rR4GdR|u8&t#Xw?UV)#?2abqnwV#a zmX|yFLc3+|IRWwwo7N{bxpRn!Tup~#QAFgyoM=-@^nh;bORy!v;zBA017nZ#LVsrc z>vDH@z@QXzjWG%J@PT4eKDv@SzADI6q9pC)%5^Z%#*j9f033F>v%Izfc8zNy0%X+|Cxdwrs%9ClI?S3l9jE zOC1sndC5wE_d-SrIJhT$f-K{y=^kP0`*kADisH^smZzzlm?VLCbM{lpq7GSPZhSC% zp>2+o!?YxQ8aCseW>k1-%j(K(j11kpKN&;N+>$L-LWBV%tm9=wI4*f>=;nb^8G8fG z0@v=cs-bj*Qp+HDUbHpp6^}f5s|s$Q0jFt?>$n=WF+?G*+S(^@WqetnY#_Te-_wW7 zDHSw}|3m1pD#Es{L&`xNPfouK9{+f-|B$1ImNf&eTz>HUS92r|zK{cPXfkUE4uTJH zCM~y_(Km|QEJf(Wux58GXq`lfk(g(4eLH={gKOE=)h9CWQb0lGu_6o*klHmc8ixa( zPO`R0^B*`_D>8WkiDKn=3ra`JI6K935Ot?(oX>|trdc%Ivfu!>^VTFrvB(F5x(W-Mg917*VcBG!$`KH4*Nw zf@=oZo0?c%8%hYpbk1L!GF#}0-R+Q4#w*n3$O*BYToBR%MNcPB%M9LBQ%1J(@>)uD z!e{MLQE*q|ajy6ic3eY!9!9pzxr}UQb}Y7=@Ox=^hMmQsZ5{mzMp}{U6UnRO>afg~ zvd>j5-v@+TO`y2uj`UdmnfV8T<-Kpl>B&pVf~=Ku*V+IDrq2BILG6MRNq!RTk+`13 z(ACKjR-d%Ruz}t1a%Zlty-hZEfdRwqg*>xiuJ}NSn`#5R@nXMpZh&qQkoE)kI1xN? zt=JvW9~lM5(MiXK0W5*iTp%q;jZrLP%UmsDheNa(Q-n1j!@K;Fsq2&5@oclpx=j>? zgm8<7W&463LyNJ+F5hKf@Uph12iUMvRb8gMXAPl?0Nbw8oUCQhz1y@X12 zyqM>_69J|OW^|lj9E<_F)kK3gZZ$SsP!!Lv*t#`8NVkK5u^yY3XXCgx4lw^nZ*A0R zb9u`5%Db0^D5gKy8q#Z5E6zep%zp>XOMnHU_9isiVDfCuVt9^j??-nQ;;{K$ov4Dr z6994Kj^>rXrL_`*tp*b8gX6`x0vE(lxU>JH>OW2ydR(LVjeDi*)$ekf#BDtngEI#2 zU_x?TBbO5Dmj)Wf6kFcKK=>;<5zmWW{;$}L9{p9+KQG-n*YW-P^Qi_9BmKvRoA6(% zS?d77W)LaA!oS``?EOoi=effVT@HYg@SO9*51(OK>*7SP$oP$4G2Kee%w)#I#5`D5 zsg4EsA)TTw-uPVQS5idkQ~~MYVvF(fy8zj2jl~6f;&)f+Ux_n%xB`qBfM6~c2gmD@ z3zE&LDnO_7XHvQ20m{dDf1P99u%We!xJ%jpdb{!4w|v3i)3<-$L;Wj{w=w_%T7X;A z*xbCb&*4o;Fz;mi7d?ZE{5wos6tc)x@Y(+MaW{o4Vgk4&BBrjXDWj;^3*W7;f12pJ zYkEL%HsjvX5Qu4)h4VA$RL9RUH^N9dkTI<~?01jAqA<&FU<3%9t%Arwv1j`fXR|L| zffJ^Bjx&B|#d7yA@-gQ4vp{Z5)nI{P;KLLsKq{B@GuU%n3Sk$mq1j<*QahlTVJnvy zpP~5jS2`1aRYX_FIVb1ZXo-#q_;i2voI$s&tc;V_p*Seww-*4JsEdh>1(Hm{UXtq%fBKX{3~D{ATTW> zD?494d6M%hpvTdo$;)cz{6B6AN#k{DMl)qwHUDsl=jCD0CoOL*=hFCTdfO zeerI|u$-J6r>KiBU620g4*|d8zqtLss?A@-_TTM{{|jEe7m;Ufnr}Vd5`4Nm9+|Sk zwuKw(X!p=`z`Qwhd7OVTloh0g*nDodj`pM9GpK8MJj`LAF8{Y?uS4U{wra&|w~K0$ z&Rp!|{o0tn=;a9r=WxY2`7a)+3-oAJZwWu!<}X`g=2ztp8DIGr<)rbEj4=wE@&2+Z z@kL&N-&Tr1C4YB?tLCJpyClEJUU)?XagcX%`p6q?hZpM(N@+BNwe*kwNK9T`%aFgI z0z41=J^Q>GOT~9KUJa0{M_`thS-(9BA|;NKGd^*!Hu@IdtRlg=#oNf~rpwt|BswDK z+*9pnb6Cc9Mf^NV-g#)(ba4Mk9sgT>&H_e5H3Rc&ym)CPv$c@4Aj7?l#DE}KLnk(4 zbN2Ld2g*1fr`}LnE3g*=78rEe6Q@sz$l_!k z|0r|-N8F0L);s9Rf5k>$+R|IYL0@Grw4&6Kdp6yKvCtu{#NEdGu*^E8REBDs-|nr1 zc484QQK}8{?PH^fp#+q4vT$Qj62c0JNz=(z?Ew)>Byw)^Lb|#n23&&77JIYXfJubEGxW ztc{Mg`MIlk#OmUD)xH=y>9R;HN;7IPy`qN|tf_&%36BGk&B1~Ci;1km!v`m;+Jlk$ z!g_TiTyMWbz63O1B;e5p!_6`T0tze+(3OcfuiRCcs!i)EMA>6w#xz#Q&WN2HS;zLt zC|7rpaGd=uI1LvOm^*Abkc4XoP{-cTjixS=3AX6m#?R~l^To^lFrmj?>)7a6R9tf5 z*C^A-0d3J0;U5*4pJr@tOKr#Sal5!_AIzI!jlCp0PL@t%l{Ge#|Ny|IGYSAC-+ z)57Y}ky~i=-X7b{%i3>PSOu)5xP%rzJ$z$U?Kcx6X5u=eat0?N#k&rv2FsG-+G9zq zqk>x}m9EC+**bssp)YvAROf;BB95$ebp*8_=&6O^Z0Q;YyYLT%uA7nbh0$~dLtU7V zRfYafe_2xVwPWky(8jHKki^#EaT&U}ZJ}PD6_C5r*Mi5>B9{T3ky-JuRCC#4oLt1% zI&sU~l1jd%8MWGAWLrg8s93rJ`CIR8HtqQaiODe7VoWg9-kijWikjo{3GyKv*i*$^cvITw)+{@(rZ~L++@zDMY@h>wY;XJ~To0(-Q@SZo%%HcHg3JRGMsi#|C zm2$?kQ-JRSac!o|aHTJBoES`@GfL;xH$4{nnzrJE$o>xm&Uodw(_3!N06>U zW}1Nev&|p6IfCQatFdo-9k*iyoE|yvQgjUYA=|X8zGY}0r|D^VS8D*`Dxl$#lbF@X z;h28Rxb47Oq5<(=zhOi1eF- zIA$wylaZDD#}1R7(kJkM>QWAN(%7=?tA7z{h>)Extj5A(0?6VdvwM<~?Z%O%As@cT z$)+FP2p$`#WYgful{;E}+K>*DA#EQrb5_Pfr>BqEQ#o+P`Ng!_s0%P7*<|$5O>;gJ zg(3IC`b-AJ`E&Y0*VlLZv?<#2G9Pfn=rzj0y8y}s2KC|W7;<+|Z#D=y*%y~njC})^ zkA)_@Cr zt1kp;Y!n*sBOTe5T40W_jTr5XMUs*nJV}$5hnIsO$;@kBDx5q5kue=oAN%q7IrF(v zdLbr0#^+a< zkZw+jiNvl{f=TS~L-caEh9Q@mk%KtBV1e8A@;z|P{qmRa-QB{Dz{RG#jI3o=IFBRC zkv)0aQ>v)T3|tcS(9X9K$}a^J+3s`lzIlk%h>av)uE4(kR~>vGKi7M;l2%t3E~JSA zc&MOtD5$e~L6)=DH3u`fR_8N8K=zdq1M>8VQo{+wwkpv4>8)RNCdbES(*awPUM98- zRElL3(jryk%r)foM-!8ew>@nb!v%Ve&=9bz_sOF~RX|tF_K+O@} zQ_bo{3sE^NaixKcis!q|GBaioHchym3`!`D4CpsHsB>}(g@v;EaB4B9R+jUMIs5bs zj&J$p46*72J{B9^J?vPW*quM_MTknZDjTeI<>0Kj)29$LhD&9T17x3A>0BzzsYR7s zAk6aZz^Y)9;)|6hP`Mt?V!bmnGrE=jpM(K^8P2t}r1mg6Sx8t+3_K>0Ej4@1v#?~4 zEl|+ai6=seA0VCHVY+Yh9DKT|FT96n4W^-(&n_|CuE(F}=5;2$GSrk}= zt?J$s6xbZJPqL(CuUV{S1IEQ(6#`Mf?`TaQEVR{it1$tj(Hg^5#GENJJtS z1?YbOB>uE`;MK=m``jn!bZmY*6RKd)K)gX~?1~odn4%jx#l{g;`9tVnE=&j=vdB=X zWm$y?=}jj%m$Y(3zvz6{v`qsndCTJ!Wg5d+AV^fD?A_&i1QdIh<1m{9W0e| zG-D!|RSZ!RmACrckM}pFPXL4V5GL))tdi3fu|9bE?%g|SSK!>*U{XV=14(xEo%M0? zmE65b=k%lMtqAwTvn`#DIe>8=fwntDALKG0b;QS9*s(zRzdw`p2R=J&?+@Ru6*U)@ zxbsLy#=G|d@+Lhp@&r8tyH7?&O`{qTgh6pq@KxCUyOrbpMi`)Q#0Cy>2``z5ZKnwa z_S;o3=T`2jF97_tXbyunZ#aDLC_4K3l)?a>cp5S?GDsMZ>#{uuJ3F{43q9oAS_Fum zC--!Yyx07JJOFkXU}VukiqzWyLw^0}RQ%7ZbOJ&?`0_$;GOCrOfe9!|lu8X@4aq6A zMTT+n9-%A%1K_@m4b*09PKMlZE}0}q(78C03u>ZPRWZx<@*0L!O$>8;zsvfvY> zs9b`2lV0#+=rCuJD>g-Au$wI#ss^qv-Eg8xYs{?~VBK;k{#H;eg2H&x3kC*T4@52mpN( z`}Edp9%Zpf@_>68575qaK}t&leG-_q3V@ZihqK>ztTFz}6jn!9gr|C`HZBFqPkB1W z0O-v6S8GH(7}&zmetL4W-KQu&UxP&vuuAoJBiEFj!t^M67}e^y`Ga745I7L{{vYy7 zR)Ob}kH^tyzCr8Oj6eHAUxwmvk*P{$>))-=!~2yF9tLqO@JPP%-nvuN-?uPsJ^3F4 zYA(|Af1rE+T@e5KU;f=Z*4^$Q2oBP*}EK#b+ym0zKbP28t5YkT(8**n97=rn0Yplo>~HETEzwN>ORjr6`8#U_m+p z0#cRUgLDWG6_GE3^j;Dfnn;sQs3KBANu(31)DTK2fj~$|euttn?|k3)exK()@4bKA z=bk^51Iamiuf5jVd)1FqZlX1U|-JPRMrc#=K!DaspC7|oVIvE+wJ1VPrxRdrjwR0wRb?s z+Op4Yb8!W`x&!8NZ~6J*no{51xl;xFSPG1Fn$=V)5u;8n@iq5)UozxR7k3g&z-!ruSQt*x9M zPedOHsb6ZdMP*}6>2xfJ)J8;8*>`iDSvz4N2yV31tZlSz326eaJ~3MFxZU2EKSZ{# z&=ujZ;+>`^T5f-jQd1k$wiV4O@x5~QNFA=~)7gjnZh(Btl{s^U(<>cOA-KL1%Q(|I z{*>T>OuxX>cTXsPvt3+(0{1Pc?K0Y@RwmhsBfhmEM%v*xIxQ zdu3K8re0)iKbhg=vvawov^*mclN%CNXZp}#&Gl$6Q-3V^mX*H^s5w_(yw*+gjj0f} zpS=#-#G?~T@S_pK5(cfG60-MBb|6z#L|+mr!82!PR07mjf0O=Jk;+wJ{tBL?8qYKW zE9ZFPyWr??^%3zQ6E%-fY!I z3bUJlTzu9B^WIsZ!x8!TiPW*#_|9<7w$;!>Qt)x8-ff8`E0%vA?MpJoih+s$TnE)*>eqz=44E<)w<& zdIJ%utQjFoNK2;{ui5W(BrqLyE66MLYJKCL#u=w#cg@0#y{kJUvr-(6!{IV(uPzSi zqUZ&xYkEuP+JBYqskGRB%j98Y>nMq4yWC;v+Z$);H}NpMJRem!HX;(l>gy{SCK|6T zz-`B$m9c!R#;7yQdgfcMyR$Dy=2om|YF@O;bCE^ZM9l8AgLt3+WOQHjg%nRK+peG( z4=?KgM|D#mR+vO}m0u7l=N3HXW%Xg}txs!VnpeywO2fvtFt)wA9EWpO?uo;ztd!@p z8!MT4E)7Ml2Q7}9BzF$!n;~4r6n1|2&-ZxB?-FoKqoXVcTK01m)(I@Fr4Os{UjU5U zxuOM;$G)PkP^PtE9#y`6zB3&;~^U z6ObQS??k`8&>#cb>(n``o~F;<&=(EZua#voZAy0hKrmG;+q#IE2jp%z*aJBM})aUqI-D~4f^^F@qpwUq|nxv*~n$&Kq zx%F1tz9?eOV6!RQ@S$q-u-|ga%ShB?oJeYWu|-+&2UZs`Ka6}l9wP~8W zA1~blb^U6c%~j{4Dg2o&31zB|PLRq(}MY)tzaKb!UD7-PtgsoAU`Xb|8QdGJl z|EcVvnphIDdx?|!haqgo8iwEbny@_QY*nWdEKv)-l_rUDNC%Xyp6N5A-<{O=>6Qzp4*f2<53d2`9YnUZDEM|NT*#vJ+AK3tg2_OABgt%xe#}1=++1={og~qjbp} z5NO+q1$tE&k3+y>n(_#4M!6Z%@6Llj$JLn)901+v?Z)BX=XO@|&&mnYHUJ)Ch5!en z)@SiLc;NtxzikY3m;M)G9Dfn+XHfCrSO5FR#X!wwpodARER90g6#092Gk`~^!0VUM z5#W#TS)ip2dcBF0dIP}O%k={NH9opk!9TtSj<{NVo8H};(A3e<*^4uqF#qin6qPgE z-!0B={OwmSWB^maXdUPgGGj(tg!=csZyg#khz58-?uYFKG%%jnq%!eoSUNk4DEDA6 zN#@1g6I%er=pwZckEPm|Cx?WDa4S1FH~^75zyOPYpn;AoSRf!xQ)gyL`P)?de18L4 zEt}DH1_5IWnF_Qqek0@SI9es9yuMV5Hr=7FPBxKUXwO#=qEHgF6HI9Vn^ac-rs)%7wd7>i zev6>A7k^Fp`?MVp3pLL7I@{OkP^6w+w_Ez8WQKCN*v2~E+P4~jCS&XwH?5JxZ{RSx z0<(VPkqML;b=E99H$1QFJ$Z- zmyE~#y#P4SXj#f9M%90Y_d6H+R-aSmm9XpMkWim>B#+PhRkWr{4FL0dHAhnvK;2Ct z%xAzt-=D49B`N|-;Zn69-c?xiWRDt%Q z?Az{p?$fPvz#+^HFe!+?`+d&2`~Aoz_-Fbp@rGhQ$GsT(7L7WAbuc3v#*3IFXQ={> z0{*67>Ez{pYh)Sh?zuj@Zb=AO~C zf8ot&I0fOkB}_AA0DLnii-&}!`G^q+?||;$6Y?}46>wd7B)88}F=07|4_yhxdf^+0 zm{Q~hV8eUA=U-k{_o_9?y9q48KrIm#O){gFfL3Ztxq}o7?WJzsv_eJ?n-s02 zc`+04HK9J+li7a6(qWbn0Q(Sty0P@#q0~Ve4%~p>^$tV&S}Zvl!gDi7H-KTYvzdGP zVpC-jAb-lq`OD9*Hqv89004F{&C`uK$yvy7Z&Y)6Yr?EkfzqVN5l{sTN)_)-Ucy*9 z7v4O15({K`C>IRG!fBMj_3wfDm7Ku1v$XNP{=gU$WB6FsWg2?@_*dWiQ+H%n@8|%p z6FI7g&mkh*kkLG6Df?vl9{+P-3S{ZEcj zQ*S!wrT-#J0pNy5N9gdeB+^W<0_6%oy@Y!1Kt{UJ2`Y7kWt{*Q&CXjKr+U3kN(vGZ z8YMTzLAw4YF;k6eR7!!Fc9K^_voo3)IO(=h{);!r6cYT8l$uUjLSyS%24`9aWJP!m z$(Jyb9xSWSxa>>l3QCo)i)`ftqcS3VMP5DFAdZ{_@VA5fsD!R3^`rjnb@-OS>Wo&va~suPt1_fz5@tfpjHAsT4ejgl7b&HO**YF;-vgCnwq%cNMVX5! z%N}I5xHufs89ZF3kzJp7!4SqWZR*wOD9q zB~5v&yz&7dVPY80NeM=FW+f^GY~@lK2X9#|ub7fV7Lq74VA{2boe?e)89u1(otZiT zS-?=%I5+3qf==EYA5JKO?ix_Z3Q%bUS{@4lOl`^qOn8zay3_}c@E|EpHlY|+*8t?d zy__h&)kgEBjs3BF?%IzK?u`bo86jWItr|Z%Hv?x!5ow!2l=sADKc_`i(%b;pa?_?| zy+DC9O_`lQn_ZNI!zpIaR0UGUn(R8g5ur-~!jGn*1=mpxq!RDljPoE8hCe4^yo z90Uekube=weSs#>EEct3j&c)QnlK=SO;wmFqS;H*)>9UHc0#);6SO(q`qc(MQ6uVm zzkqKmdh3vaeoEdlWSvH}^r)xSutXTBI-utqNeOZ1MZ(C6yo4f8ngWS7ZkPZijlgYl zfqEQsvEtGLA9Q6q!0~%mUo)=vB*+WzX{|8}z=RPTI`pydGEjZv^Krb+L#i!HtK-W-^3D#!=EQ z$X#E*Dw;x;jX(DL>hF8eKiA#)8)vND3Ov_OF&DAheK+;^mv`KxPOj!my)I}0PdQCG z!O#%s!EY?_K}*HqY7)6QZly{jds9MKKf=LD-NBwz9 z3qPOcO11lLD!85fMpS3gSwpMnm9^oc-naHGmeS09;ccCX4~za>NUkMzX6k=HL>3s$ zxA2UF40Ii>&ikcCj9cnO8kf+}N#vIkGvl0;t5oKM=&DbvzFjVvyZEhE0*UJV`4EXPvL8fdU{+XjF{bQMli454O>mr?$p_9U!Nl?YFE_>2MNtWii|6?o%jXIOOJAa zKhBYhOb3t_Ry-4$S1T(oxCxh*<`8-n>i9W#B406nFYxfHv?LSb&xg7mr1pZ<8xK}k zeeES9cZ#z;%FRZ8r#rlM?cKD`v)QRxg3n}7!g_s#6S_5e#>R8TVg|aeTw2>l4eJnk@0_ z@1W1GnC)nIQNP@k>5b?1!gtbES*Vqia#6YHx*&SOL_nEb`3f6aVRwqazqIW~?LiyY zwkp;u)QLh?e6K(!vC`UP6d21Hu-1Iu(@!2s%@LI&G6ra&y&53A@a@-T#YIv!s6Mxy zjU?6hf`T+;lEfx(Y)T*o+Sy@J6&r8P3?!$>#KgtBZir zKuMcuvoJGOsc_F(K|`-XX@fg%*k&@s4B{!j@zj}?Kwq+=Dr%MWEeejKjgWx(i#}O_ zOyt=(6~J6EMT3JGhEBrJbv}hor%DrFv;IZo=;#y=e1b+*^!1f?_V|~hOTWEbM~4mJ zp=%6jf3Po3H#I!mUx07t0sQJ{5=jDFXCA$dho)F02n+gEDKu2%C^UGE35Sw~3Y7>! zCK0AII&fdK@GhwwZ3cmg*17X?Ql74_MO2PzbxJBZEIJ_;3mHwl(l~cN#1EPknRu~# zOSuCa2Mp5uQSkwz{TGf)-CbEM8cey|X0NR&=TPoz3f*llk^+y%f}v!0`SqwS(rU2O z#Lo7MtuS-3Zp^_paXITyD`XoO=VLc;zNWtXn9)w@w<`lWs_P3heY97-+w5RL!6t=* zo`@d-H_S%;vLXi9qa`KU=n5xc>|2HXW&1vS{@?)l?R-(aA$q~S#GgFpi0Sz%HI4?O zmNBskyKC{3gsi!sUuw4==WPm!4whEvMQ9wT!rBW*4}Orm@8zXBFtEVSoFa=uIB*A> zU9@vP_4&;w=XH+#_b4#`d{49a)ak9y53a2o5dQd&M>LO)Cgtb%l{y)9Ae6t+tvDTi z^_|wiW_m|Q_vibi#*bWnS-VfoJ6u1XJT@l$#3(PvKoZ9~baCcj|G1R?gHqR-nZQ-_ zx6b(-Ed7J)2N=ok`RC?PmR4CXrx8Px`m1B!;FzubA=|$G!O?#j7TEY8VCCh$wQC$h z$N%lg^LS_Eu%TS@pUUXZEm!_IulvP`-c53!qS_$)kCjyXp>BZkD_%jtO~;V|SLbt* zpCKv#Hlclf-OMlOpMD2W?BAZOxlRExdk%5|elCEz@3C9Q{%wwLo4;PhzkGLZe4l^b zpFMGK(y@JuKuA1!l4~1e{_-30LS(}Z9N=^L>j z?e>Aib#eWjn#;(xr_gr)*$qZK(tVR%{_Dt%x|-Db?%Y&+&nt_V8c%ROQ;q;gQa<&i ztJ%)Zj=1FWYrQq}5;y7tRzh`JTO@8&K}_US2VDt=Lwon|2Z0|6@fuY)wmY5P`covk zvM;SuU)&A(+X^W)zc$uVEDncJl}gH+X*N{C3ww+WT^%0o?e32&tQc@Rspn>ne%g{f zJ{Ptgge?J2tm&#wV`!a?YD?_Ox!XifjAOsWH0zN6pO|O0f`!r*g7|k^@$EBsHt%A& zEd`QVJ*Bg8Y1ff|ncW1p0Q729^4r9IDj!NJEDSGWNj|T4#997;O+K9^c^tT|)&F9L zX!F4PjA?+WlFP1cWqmVn)~)xO=3`gadaf+?pw3j;BvLWVJ53O%OeiJf1%Z*pXg(W(l31tO?C7h%1mW8veR8y}-d!E9`9W`S*?)-jfo z_lObj5lu7DZeSB@N+L>8L|@&CW_zp^Dx;dz@ltautEfnUC0R+=MxxwH^6n9vY1WGz z9bbzv`KGnOxy7+c3^r6<9&+oO9y1XeTiVhEC6#F0*e+{oqO!-FOG_}lwg~)k$AVwD zdYF~>`&0mdDwa$yAs%o&&f%sA=w_N+;Owa|&YJc_Ygb$E8xe91(Q(s^X>y|e86e+< zQIcSU)k2?QHs1q@Au|o14O?cwpPeHvCLf*NNR1`8<2c#6#w`de?>u;!0(UX~j`F?a zR&=u=>hr2Mg9)4Mau$W$q&d@wJ~a~qrxXzcp=(s2Pw+M$sl@@SzwK9E~LG4QjQgIBYQGz z1&;c1pXHPE&G>adBs5J z3tPJ}Dh$gUs5^+%`t>_+T8K6~l%O$o`CP`N zWt4)ScNb1N%^s-uTWp7Ro9$aXJ|57PIzrCXNd=|T|k{mrDA@$@i-Z)xG3*tW0rOOQ;tF`a2#9YxDT zhOpf@Q>?k7%0X3;ZzvVE6Sj6>cHIb3a&`C6Z{g!m_exK0MyP1ySLE!z^$taN%@9CC zySi^UQ@Xx4?vj?|g36d77AtT~*Wv8Vx<;e?Fzq`0yx;dD;0N1$ z(6VUw&Wu@Ck>3oy%zwpzfn%GVw27=CFj9v_(@dT{6Nm_tjY=vs@%i3O-`iguOG+}V z9 zN_oNK5?XrD2L2Lqnp_jD)9XXbwJ9Zs6aqPOftcZbcrYBVvc(1Ouq02D+B0OdZGoka zMqI9KD2dIy1rVJ5A*s{?Bct7!i$lt8F5$x-OGgu_rGurnVw#vVXG6wJaB{M)g-mE8 z*@Qtqh8V$xI8<6G0!Ai$kD11G=615Bb$*?|3SY}J7qNYNV3j2C?G1?Us%x-4<7%Bg2{f#frV>PU;v$%G%3Qrns zg{v9s4t1v}aVDZRxFnLEJoGL4;CS8I0b+C_h`X8SIOZF0Y**VF>wv3;-VVeP$9j!4 zXg9Ap3p=Z02NVr^lZilc89DurnO?;v^o%b=hoh>!C655w zX)_47yiSI*X`ml74kS+v5X)Gi%PMl*76()t3Wcq+iMI8wF7wgmQ3LDVyzSrs{PIQQ z+B8#cr>;cLru8gRWdy}GDw7H;b;#9-E1?xfJ~%%iP07-=3Hg_H@v>!B?j-N}~Ri5y7taizgF;4fx-F75i3@)oBP>z#FhXuD_aU#9VOQBkBuZZYc6-p^gV2E!lDC&o5`M7 zWN{Ayk|SlJ8t1q0+1=EbT@C6WW>o2!naEwxychw}uW4|t_|8>+-b+5Yt_gc=jBLxS z86Zs`?@QQ_u)yMH$KCZct)H6lNc2agHY^Q7MT$1rOlMQsK@b!yz?GudsG2((a|$XQ zLmzHqNqZ{dXtLPeHZBJ;)9;6XuS)Q7s95=m0XVT9&&2vG@TVAvIhEdcis@!LLJTZ= zc(&>O+aVD!J=Qmi;2N862MH621zYj1n#;|)bJ3l!hgri>+PM-op?~=5p8R*W8a#@XqGw=f2-*~K+fLnX5aq7RyN)OhQG3i>;v3g>BFJ8V+#)V! zhMLxl$Z=ox*#xIYvNu#O3Z(rZQd%yz9As!;u9{&dx(OE~-fnm=Xr$AnvbkgsFxf!5 zH*7;2l%-S#NYK_98&WPK+$$$MY}OwL7x60BCnT}30KgeGo}(KVV>;71)e2;GXA4!C zS-eIQw4aGdNStI5URI{@@RcPNus3HK)|EVe7;QPZBc^AgouuhY_A)jUD%q@GT2i0W z&=Xk*c=QlV8dt@q5mChR_JX;$+$Z2}&AT4m&qaKOhI_|NA6Ba(wwXmMDs!~*Ot(l4 z2(0T>2?-lCCTq)C-*c&ouRKY`TI5MBSC*+=|iB zhuB_P^&}h^YL`O~-CUCQ%MH=%u5u0zo1=Y~S0L>;C+ICvRHse77SbHTzl#<4tpZ;q zI>v+sP-K&}twe&x(?=oCN&plJ2F|t_x42G}sP*g@%k@Rw*T#<>d|Mf?E-RM2eDE$V zxO^nBM~lO6qw$pcn3gh7VPROn>(pFkLcMPU8P-x>BBmTmo>YI~17{^kNF6SKhh|%YsL2=+& zGkJm$NkM=Ht|#yn&AlUBb|!5jXg)VX^OTG0ye*DO4t_EOY6r~UCYXI5DBx#~CS`?M z6Iq5)9^O@t`WIUb3bGA>9O>otH0Is`y@yV@@%=N#QlaLGLm<{J~dqm*1- zN_eS6San%>EK^cz&Bj?AvpW?;Yul|xwcQjb(D-v$g3xEn zAyd6NFk;d?fG zO^xj}bNf7;0TBV#L+=uD`zcr&-9;%B5t>`)CnQ|w4&p8!E>}HLL1eJr%8=%|3vC zq66wn>dzz=)ULjhT94AC_WP}4 z_!m_mm7W^i+#l1blk1UL+2_;W<*e4aX(1F}l2H?xgo^=rtgY*yvD?O1$7FnaweCh` zBO0;m$6!sF5_NU#`XCzu$Y(w4yss**4s*juMu)>kmNC{oDYtX1Ph>pc(D>w9TeRGF zHzb=o*Z~zq^b;Dz$O893^z37JQ=uSnfQ+Gcn^XlAC3AbwVaugs!cBS$(^oW8uG>I7u4 ze;>;C?fb1YXVX}HceI8X)MhX_E#ipS^DF$b^{tH7exLH9*z1709!qOivv85ZOg&pw zC4K(85Ki>a&9~>I={eCEy>O%jnK)Aq;S>L~xqj17$M^f1A2G`xR84jRX^%!J!7}f!^2otq}Z&CR5hp+%|?pe;1SFbMnixd&r!i}?z+gyRb?Yd^ZTJm~vc9|DM zhL2OjIN8uzV2ca7%|xQECP#ZcSLl=63q1qfY3oPGgw=0d7kX>C4&8I7Ep+Nki=Y$!8MgyM zM*X+u97ie;m`S?N)n(Pm0K$-ios)V1DWM2!+nuQP_X73wOwm9Jjeysf zM{AH(Q3Lfsz-r*2>!1l|Extlw=aFzxgQ=<}IzpBH)VSb`+>3X4+Mu-ASznc`c)$6( z)MfT@ph|Kesdl3$iL!)tM#*h$d)eE5U7=BNl-1x(%9LouOt=ii?^Vhs0GoyE5QQTv zoKoDj#sZideK%U6z?ipNfJm*TGfGKe0W{khYQ}RI<@x`;;DG>dI}Bos^mIQo*RDsN;-czC$Gr{^vHYXQdp=J5v{(&H{@-$%K+g*y`% z3?@H6U$VBLqM~ABV}o0{x~8VLw>Jjpg<)dQ(!%}EIKqF8kGL#SGN6)4K=+cOC*O+w z$wY1>(0)+6cIntM4ySBnG{V!Nr>7?_BLhK}5bkpUIdCA?nYN(WENz_P**4JU)*=~E<7Th)m|WozdeYyZ|WF#!kuuryr0 zm>tm-LH{E@@ZV9Xa@>q0$e5Xf9q<^KUs_VLvBC1(2U0Rl?lrRj>YTE3atJdqn%NBv z3XHO=FA6zV9{q>`4UH}xgd2tu-!@xz#H%B^@mc}}` zMdsnZMN90>h^sf{L(uOK=HWY;{C2jcJ7cf1*+{w;u{YmelU ze+~pAFnxPp#4Rp%L~$vV081Sf9-jS?=PTsZKY~AW`FF83{@lpl)(I8h>B^u~f#;bHto;Rvec~jjv50zox*+s9P@9pvxrmSQPviSOJ@6he-JK$V*@{z z7|_4g!E}qJz%zhll&4HG<`fkbVJ25^A^#CX`z*cL#uZ`t?AcX%Mh-{M>-*38EDUTA z2Q>R6_E;c?&|g$I8>hd}#c*_Bue4AW$j989A}6ONaFyPjV*kk{hn{4*Xdr)aFa4BM zH$kqWG;&h@0169>Zt{e4DTN!)&#$dEG1|DeeByt8K*6q`@!0Eeh5&K)2833i`2}ow zL4n}yKxK&!VXl_Cv*}DT0Q_rZ*y1TWnuaD>G zC2%WgDjbk&cQ3ESsp6OaWSLLtlpfJILXarMnt{VlfIuMlESC?8@KXSBPJ+SeSA78W z-EY4c?GF^GT0eU>`DF(fX@cLx;NTYi^ud6J&io8I$F<}3g5v%V)e1+1Z^BXUN=mMR zhkpG=mZ%ktx=UJ5Xh@YB_nublZXF&T=2={5Ym~YFL$Rc!99DwdDGht~ZuaxbBY+jD z>RhwD1S#2PIFP`>3x7zya&BL=rr*>pFd_#B5C}+NB*^f`sjyW0eXjZA$5Vd__6uu4 z=1`#enbKt)d>{`lFMkHL4~{w&VDMT6W3F z_f9_w)p%)e?Q`jrx^tntKfe7VWd2<)J&+lC3Y~kr)htMH2)zIM^+1eW&s@f!w%`O z81~aYmfP2}bcW8E|Hqbh=z=-?;3w2imyE7JPHC+%nz#&1#7d{M=@;+8pG1*{h!|yJAUK>*Z}??M@&gBa7eCQ z{Haj>OIxwe(iw;M>W}tC>V=WY5B8D%FDb?O5{LKS&i|d&fsM?CZrtNPQuaU}eir8W zah&;~VGkzqx5fJB($lR-|3}IK>9t)9zkH96{-J#S$HfA6%#Myt$BFT1VWV3&W!PSL zrTs_B9&AG{s{eVhe##OuUN|M0o#AuMVc7ir+5eH6S=y?lcj>CK{__ImrlJ5x>_}zh z-odAff&RM*-+!d${}ZgQwzp9cB>~gT;`wt>^Auo@6EIQ_>xjd1`T1otM>ucCn6GUF zZ30FXXI3fUE~X5blKo1R^C@@W{1Y%a zT%Q8hOp{JaFsZg-(U@ zX6pKM^U}3L$=&_Zpk0X^#$^(uXtuggP_|4(|ReZ2#XKZ3KvK2Rx90cbs2pS}cdSaV`#h{!C0YHEzSEG>RsP~&~GBjIXWkBO4Z zmzIN39ZWO&Q->rX>l;HlN83<8(r#94{{`+1S;DP!v`q$C)4QIQz$i#YM%^uys#o@q zt|60q6aw;Jl4-}#O-uKVk&j7q-?_c=rax(yb%7I=j(JcD@Ejf8%F!Py_x%;n_r*tA zQ^B8zj)4njMTRf=Z6Ku*;6d~kIa4f zTFOF5Zt8~%+A<{L?7{oZy)s4RUfk2Ws!5|>l8fcKduN#!UJ*YSr|SL9w7S{Y4jbA= zg0%KSv9T=b$&Pk8qst?+oo=A|p%n7UO4rmzcYa;R_0Soc>d=@Y0)I;^9P5o{K3smp#wT_ZM=x1AEZ=FN5bho`STVKBs zM=vf}BBNw8kvdu{4HaUtXkxvdpo8aZpC8ZdG~IYWTj(=rZweNdaFc{QIM!>1S4BW? zWI!UUfI^&}9D(3c$o5ik`;jJ$zq?4eVul!eKQ)MTNfS|&N^LyI54u1o*4F{~%BqgZ zNJy4R)TyFv7QQ~_brMZ&qpqc&iY509DkOH-=_EC@-`lzz;_vGPJ;rCPod!x>n|vAD zaRg(8C?kLnYq7H^5oQ* z{c=JABq^KN3Nu5tuK~@61_43nW|O1&d)(52C`m|aX&_`H(~CpcYFq-(ms;3>oJ7^J zJ-nQGxoiqaS>e>wqOA`o4J&g$?z=37G+QFjXF?+i>F$|87WdsK`SUf9y@ZDlc4|Gs zq&_BNGQfbd`tCHy{m*1Uqux}N*;Rb$Vq6E1TZT?&V%dsHM1Fk=_2f)JZ+xA{kpCQo zZYGMnt=XIIWU(4sO5H}P@fI~1_>kEfBAPFE?(2B^sg=CU3U6-s;-adV8ECpyWO(EY z0c6N;-TGbYnCE#32@i?@`wiz+*?bgsXuSKBiDW&lc_v!PfvWYU!y-w#+-1@@RtfDj z=AB2_W(GNX$hY#gh|6kem`xzaz7#D1EW8WWxG_;0i_I~uHGjP)nYEQa&1$-#Aw5AR zpZO3Ky#IDLn^1X9MOh>!#?4L;mJ;W`VBi@cAJ0-FpAx*Kkc?VTV^Eik>fWmdh;Sm; zulUo#rlaL^EK`Dp&+)&wU-tWjOlz$KoS_}EGe0Hu`$IeZESb`hv9`(={bPdCs<=ti zI%hoNncwer(Urf3SWj^nd~wRW@NT$V9DlCd;X-EQCwIrUJsoMWjv4-Ea@jk_JuOeh zY(|iSEsdg~${ObUD8ernk2fgDPi$ccyUD-*3G}f8dDl0@o!q^3B5(=k{N6`DSxr)n zUrNpTDd(8S=~G_!L^)zEJr(J0rZ)Y)AaJxL*moXY_~mVilx~}iG>$FEQlBx`J5hV` z{xJ#2&=c=BSn(0j0bQh+^rLIA;Rhz{W!&PH;Tn(ZRnFDBsKM0ir84@R+&4X$7!wkG zo&$Q5^@{IWiC|%!iWuAqeJ|>v5ewO&>7Iq)lh!8>7?+-v^(ac0CK$Z`I;s|qRC#^; z4(|R=&yn-dcD}tv$Mvz-XZZLZT%+q$o8uqkQx-x&bk{AVw{ECJ7mjaGMq7?y+}_`b zno(h)yy~%JOsnBL4!w0>Q{X{Wtc_3#PkHI*#!2VoFJi+Cn>xdFG2O$vr&gS}??k$s zzVmWYF6~q&@BA<%(c3#dWT|v%QRr+yeQ@@T-!7-vop>i9rgtUot!Y*8w9b9|6eAHK zxA(W39B(TtNoz=IKeNt^sP`Z1yLrlu`lv>Ju<$vLb!#U|9nRIO=a0rXZX6ycE3<5-{?diCxg6i+;@Ej zWds>+of6l!ouxoX{Q{0S>4(1LFGf9U7vn}fiR!brF=w-mwVe)k5gP4G9}f>=>7V{O z{fo8HmRNbuE6wm2b~%mwMIYZ077-53$m0n>^X|`D0Wvs3+7;dhN%_1F!6^|hxKo%m ztXdL>cIJ`Y)8%FCxGeuk9M29!MW1G94kHO8*kcY zu3(H4BCIZ6TKO}#;Ml8ol2Snz;TJO^Rn8t2Ks?WWTP|5??AIkf z6wBM|UR>hsL_a;v>PkAt-hClkT*Tu3P19bON_#-8TAilw-tyW9nJf z^AawJdtP#yU?cYcjx~6hes*I}N&YRqCl+c;U6N~Q9I3eZCbvBU;4mTNcjSk7s(PdIT z*LW^V`}cEQ+#hw=(r)`q)_y5w{TTHidaW7!d@$-^pXg3)`|x54rZ|)RtIB}b0|!;P zpqCobzQIXCvGL)o>OCb{Uk7_-a2%;meUW(a=5w!`ZVJKfPY#`$efVl7nt{6mTcMaG zi}>|x%sW*xY7ypv8=G~uYiyy5K*neS>VxKo_4KB1##$$W0&vntncg}6E;Jm8jw%}H9lB^z zCZ^)2`g*-n>_lkAg9`5W-+cacEBZr$b{jjqNG2i24=KUMT`c!UW}?MMxI|$u}jHQ2{_qv@7GF&g+Q)H7ri%E zs;-2@Tid&_dS;7<%~~Ty0WyZ1`M}K2TvUAP0L-L1cWCl2)!njViM-NJmoZ=Wl zYMF)2nLtS9kkm^mopJAd9XT5apX*gM)O7`2>KXsIa&P-%*9C!CfivN+pX{7mZ+iXZ zrC_RC(jyg~kFS3Zj$b}LaE9Sdde!PRGBV+Ia-Mbpac!u{UzOoBn|}yqfF$w@u$+p| z;u%@Og)SA%6n1m;^pSh#oZOd}%^{M<@7XEHs<}(5dVWaZ zD|uES=~XN>rgGQ2UOqmqqy$l*m3uGu(v@?D0nUk9*YA`YSatWhB=xFl$+zR_!%a&> z&!j0x9si9DK&M9djT@2=oPER1N#-p7`nq7_VRF;d z;*5&1b=s?EUw*j_XZaBORu_c&#>9A|%rER=P;;HIh=0qMPMcg6mc{x`f8O&~@5O1e zUh#g1b;uH!X=zEyXd9H_oLf{SzLSVwyaqd7XwI&po15C^^XxN$; z(E3MJZtx`boMmaCrLrejko;v>vJ#Y`e*eIB&dQ!DtYV!m%z!i4V{GIzn{ij;orn+PafzjeC<}@$$0A8HV6=zxtEN z`~3@32{jY;%Yr7YSGq0Vj$6KsA&Hgvvl2bxKalhoL#~|3&&aI{&L&C*h5WIz!|)Bm z^i+t6@7!w@A3N}?xUOXtl~`s@76v8;UH$}Bp}KCK_GW>XF7qEN71$W=aw8>zrELuY zo_-)sAsT-ZMxL3TW>RalP7)aC?Ww(vkLvh_fTXsCb1=yDKD?`bCh^Kx88+I-6!Ny2 z$3$7rc)I^}(`!Vh^y81QA5|kxYH5z7pK|i(p#S|*&Abkx%+LD%oXVN-AkhK;B(fUf zVbYnXlgJPUSu?>$NHL;z)Q}DQYMuX@+2@$BO}vGlq>^;^J(r-xGpF9X{Ni`rYRx4f z1wEVZ&R(?5E(O)DN{@5Tjw_4-h0BkqT5FyN4~sVR-Vn$-@%YPc`Y`pF{oS@l{b`dS z%axx{NhW*ru~4Wv_jnz_`ab;LpYaQwlC#6tyXSipJo4<%KT;K9PEStxJ~U;lh`Wfu zJwC;l3zEHz=NvcluHA5Ppym8UrB*CD!a3yZ z^|?f2?Iz`QMDuh*|FC{T_{}xF>aANkMyXd7D*eETw&Km>>|*T_pcD80)pzVV3-&f* z{(~UO>EkEMGOgRPoB;;1mF=exNzDmr-!7hvgeMxhp4O=Ux~=xYz``%RM(M>Bt%6Rk zueU|x|HUMLy1`QGPVMF~x%`SdIp*F8rc>-`e;U9oAB_hhC}MMp>hA75EMGW2F9|j0 zSsQ%$?Td@6r`_wPp1jcX-meSxwZmEFUl*SFidS;0X(u7YN^j4f0p^=%VJ+fKC473!f9AMPhP|GsZ6r{tT$cxBM10b)JdDBNaIs3VIuLJ7hk~%5;}xc;@&W54*~! zp1w!CDn_=rq57GX$JdI}!UrzSA|GX|2%6EG8~y9i(`!;SGd)3+VxFxz6}{4M0-q2q z+^C|4_m2_kdF8p=x7>=?5eU%7^yB3>6H>1ofLf&hW%CCpV8Fj+*%}%f5|Kq2VrRK7 z{jLRLwc_Ty0t^4;474QFX`1}d>q{ZK@+JHCuCC$6g^D`W{m zbA;)hK&e`oC9)vrW5!`5%Jo{Kv4MO;fEq>(zUkE zQGEC4bzecZ zbvk~A=6NaxMBTUL`RIfQOxL*@ej&r3lLRjxb5?fmZ6*^7{EXv<1<1G!Vi`=r$w-%C z@9_F2O}9u*WRIAn3f{Q=;`Wc?D>lgFlv5qDdXN{LRpx`;l;tp2{y1X~i+FV+W}3^D za05yC*;W@AV)UN%r(k|IGcs{Az**BvqLC+W4el7dWTs{P-hs2-f^eq6I!=*erkk`T z)nHMnAbf6_y{lL46NMQE3GKF5;CD1d>bzD5zm=Di|4RGzCmUd1&cc?A zJQ2M#ZYw08boY+wxd|2(b!EN9y-j768M2NJ`NbjXW6d$g{u9*j*o41HANU~lYO=ja zu#>RtXA$}CY~QMZq7`}fHaD-3Q%w})0$uJAr2?mz3t6v9S{N?XU6l~)q4a@YD3c_; zc9EqtGXSkknXU{SJfJ>hd7ok0!2m>D>ywP&xx*@Nyl^|%g)RNWTG9l4j&15po@K|bzjV+bj@)_GN`>_jG*r{TkdOV4ksJnTJ zxrd`Dm*C(f^XSr>zhdZ~e&A5f)o1%Fg9D+`orqSuaz<1{9pn%ZsPAvm{jK69%}mr1 zT2cIg@+VIkh~&*hM*T;6E~J(1tzDuWZ4)e0JDWCx_prg-kYEET?)cg1`_Kq;Jn7tW zeA3m=Y<)d7ANkxmT*gQDt_2$4J=Z*#l13$I&x+>Z?t@%i9}ZD6unUBmT6_)YEERZV z6<8m>Xr<@-?xK*WyqK5JT_;Bf<+TcF)%IMOT?pfZd-DnA&7gv0N*Lo%(>65?NM-FE zZP~5>`J(qL;#Z%8*yd&jm9I&E^|+p`V{AHoB_G(_Ql>v(Y-liidv}gSa6n<^LF5A; z7KYJ)`x|`Ox9)q7i=!wgI|S8}Ro)C~znC`ocrWSno1&$urmiz^m)E6M&v)Ingb2Jyk6qHnIBua^?|@q#`kf{<-5VOiTxkuK2K+^t3G{_RiJITM9d z6U-MH&GA6J1M(e0HP@uJKhSyuQa$Gt*^;(h43%tRaQ7a|Xh@KFJf(%qaKct< z`QFm)8a9m@4{m6Z_o8iK%^9M5>Q?fyA@3oD>PCl4?R>eo3a&U;u)lu&Nu} zKf-N%5uJ}V7?82N*h%fT4ZBaU#k-cmtE<_OEeYc@AdmvHBUkb0bUQkwxSP&CerkI) zA6RNfGQY4dURZDyv|U4cFabiXu7+TmNoB^6iOCC_y9?&xjz73@Bl&)9ar^FJ1&jbn zna;sZVmq+Fj;;h}NI=Yw)^TY54F}jY{2{o=g)S_eJE_~+prvh|Rj}bL>rkw{?10?D z9k%w4C&9D9ys_sY$G%hL%=UuGKj7e%JTF#xy>KC+adG}6ENAVJS9K}D9c6u{v#--z zsRIi(yN1!S4p~1DFT2j09|N5p8ydr`_iMK(uJ)CY&#_;4&p!7i`xkbvF4rO6_%9kq zAGj{P+%v}OYJIeR7tV-R=(09=eSCU@@efz-*By#o>c2PetEE2LV~pE>nm#VtrckpZw4Dj*A3gXwyF&m6mX!0!|%TMvAFN<8HRpPREp`0iRF zJbs)t^x5n!r{_|El`q(Q+u@f-ugxo3 z(rNNc8aT0PvC4S{m226}&geCJT?Rkcjvi}1;#OB%^FPclOSc`~A{~L)kLpGPh@I#u z1Z25X`6Sc3myFPZ87L~j9o>}U`O6CX zGTjeu)1+jPGM*=d({`5#@IL{%{eys)g zB{_3f?U4I!jNU7^58s>bx+v5+tK}FS7JK4P3C{$-L;hqyFs^r(P?4zo;1d$y%#d@{`m1)pTaoC_4(#6!8(4iRPFDuRw2Mw+Y@G zN6%qtqrGtQST2tLFQ|&BR~K?6*ARmzfqLch(gTYQEI-^Cuk$UF9JW*yS(Vj*^#$9> zrzz8bdC9xb5zkyC8lJdI4#&lMe6WaW}6p98E*^DC&_HY{Y>w!FCv^>d9PM85G>gn)2;NdV@MWk0xAVg&$ac zN<>+(DOky0Od8vz!hJPG-6KrJs;VzFb*aF0OCXkyr?l&?JFE|_nA+eqXCrB(K`Ncp z%`Lt5?WVxsusp;lcz)!JB$LN;Qbr5r{U1BD@vNW`xd#88!tmw9Cq+(!HPcg&!2?;k z{cdH^MEWIti8SjkOMBN}CJ*Z=inO&SLBx$A9Fl}a7}_O{?&1L1MbEN{8dKr` z#pK<&l<-lFvlI-=%$J`(5j*oAXLHg^m+9P>3VBqwfI!HLM)PiyE&24;_n}QLuxBwf zTeJQ6OK6D73*P zmBps;M1PM_|NOJ|3)4?-<~rELTij|eCcZ?USpXxy4Cj56KHRBh&3sN)t|D;q)558^ zE|b{H2E|1$S69hPy#s?SuBb7xNqWW4X3sRWa>zz~4t#ay)N_Ydv9T-EGjOIR0cxA+ zjv66VvH-T&s~`3q^N1&0Hj16b7p)?K(Tqcvr)e=4uYpSAM!wU3=gYeOcSyVR$`3Jd zHMb41-0Yb-X{N7lIPSk{DOjd`as!#*vIiU2oYl3KY|-AjQTN?2*rgcNPZe?@9@Q-_ zq>^13_kCyXXC@()D<|=AEY2n5{~ojknAGJJ@xivC>ubZ*DHhjP>FQa$=&RSz1*T1< zVP$9htl;X@*M5&9>vy?Nr~_#Ozni^QrU&aP!E;v9K~1warwc~7clPN0c-mN_Os;+s z66w=un`z`59J&9=u5;!IL+6=C%3PnJxp2<4-YZS1v#_@DdRx|$&Xeo;nRNDn)?aKn z8+ypU7YXyuGhZ}OW|jv;bK{3{zi58#@pP0$E9re~JRU2kId#9k!j#dQAVoWm=Zl^6 z-TvauG-hr*RBS6M`* z6;^-v^SUH{jyMcU@@{Cd>wMCF;lS;!_?1nc=CxIzy6MB!asFuiW!=D-mY5uA6_1@K zHCMl#xIv{wdre2P<8gn{qfd|gjoW4FiQ9QW#R#_O>~xm3%Quha-b&#=XC4>NmT%<# zHKWOS)Umj&JP>UXFa0ZTzF~L9^6Z+VCaTINDvoty6TASBjC#`#aA!g=xvwwe`{9-lFaEhxR_ z0JrT`IvsWQVRl7PphFD**TXbO(^UW2zXA1us0OO!#K@vgY;Y9MK_pzvdDCksofc>TgCk59|z zjQxQa6J@Es)I0BNhn~BFT;G2SzPd^o2 zh>3mjDKuI5Tz=^-fk7z;|L5PRRsY=}(OoO+vytm6Ds5dc?;r4}+!_%5rt4LQ4glsUJN6~n_hE~ zU$$j_DEZyPEws;k=*?;6*7ua53A*t_rMp9SB8svv%e&(`6iLBF-_y@(-e^Pd>%7V1 zimW(z&3UNpl8Yn%FbY_+WJB+2@foBTk_<6T6J4L5$V&FYU0kHsozi}K$B*_ksl2%1 zmpj+)_&lS-Q>H1N@>{a>3f}C*tY1NDQ2do{pUmbHy3wIlPZQMH;~XQ`c_J@~wrr*u zh-Gwk$`L&$k?^Xz|B<7`50!MPXz|C&lZKSeh}fkK#v}{C#P?SNGr7_r0W_D^nU{j=ARQ zz&BNOTRnvQ!TH{c)>bT)pznUfb&**-f7#8CH;z9g$xD(dH-G+2STPKS_9nP!3s}e!0ml{Xh2&UWIP(fV?e6>XDDSXNQ?j`ml;m2aULvT)SMa^ zm`dgy)6^dC^yXxYK(JQOi2^{IZgNJdJ-qQ{5~<i>@{^*!fUSt4J3VPKrYlET!9OixR?CFXnwiJ`tz}JpA+PM; zF9DFf%FhqBX_}`73wh;qqceJM5&>HTMS-8H8YZBq@!Cc=_|lnEeI){i6qGssNkNuh zO$~AyC^`zDELa*y0)!A9Q8G>mZ3JM2dxf))W#g%lwp9HOpW=}<5t<_d-Mac8zZhtu>*^bMP-`WwFUys- ztBmT*sqM`iXdBahCsUYGiU+W%rJ>Y$1;AO(iKeHcs6`U+dx`6Im9E50co3`WN}kN(WqDpTk`R zZ*L!k7QFcWbhlY8Reh!f6R#(z(QO>MugUlR`N(M8E@zf;*Iv6e_!$L|CU-vI&{8wkhU{xr^mPkDW&$JUL( zHzP8Zf7<`q(SI!r^e=opYVCjUxc@V1)ure7HdoqcT6XiHp_mIuxMd6FYa7}?5g@jm z(4d%o&r{3E8@2`7KcQE(M>VR~Uv|Y{gB=dK`fLs7c5Byv3f!$%xbmgSY5GU1Z0Jy% zdzeQ-Say4_2Jxg9638wfE7tfwiUk}bYQ|o!k3T4nZt``0ZEU~y;@PI=oni%x?OC5i zCE>6)6>S>F5t1^$-(MdL{V)XyMKlXT}*>7O1C!lwRaO{Qx}-bmZ>EO zKWJQhrYPSaed-K`N10}x+?0>$e$PA>?V(mHW=FX zk9UpzprLZG?|AdXut$aMO?!a@C0g_k7^+G@uF9)nSfktO)$)^;zFo3Wi&)0D7j_1t z#aEh<54OKC++A3(%rF|z$>6`ZeZqTEPRQq(Wr^vQHMGSKo0#f|otcAf6upy_aRu3m znlK*=C6@d5LBCM%oJv@-K&Aayv`p*Y4?l>ul+=CR%>~V zl@rAc;)6hN=ylN73%*-?|@Gy~&FMLmRe0lDAt3v#hS| zb!{BT9csoo%=a3sl-k7)PB0ouXuwA-qxrPC`I%QT_ZO4&6qjt7FCakXTTJXt^uCcJ zfdV7Gq^gN{;w|50-pg)+o#EG=@l1ky>7sK@Dz{uu>Q-$~jYg9hKT=zJMj$gm;@KNA z<31B+eUjDPZ*7@ll9pQtz^bo8L))qb=>7S0d%?|o!44cZ<;ICPI?rV;%5Huf-v$mE zvdTma=aQR6omnMidWKylnUA7!dfW6;&IOuzKl0Mz-Y64Mah@$Swl$5&j;)a|Mr?y& z7YT`qK*^KQZ|8= zl3@?Gd~o|x@Ll6AOljB;u&>f`qR2(vEBPCg#x4hSi#xvX#xy1~Lc;A&?ncX2X)&$dkv^F7U9es9(Ku13wL+~q=zIfJOWftt z0@=4PyZ8Zu=>RT`Pu7a2eGkok#^%%OM8P4PR8lWq5ww0Ix0-VrEmmV9e0LJ2D-t%l zm$R`(Uv4zm`jHQ$0xV|i*ulHM9<;BN-6{sDSrO#!X56a}_Kx%O!LaZ4f>>!0iMV-$ zf1R4qUV{>RPRo!T-^^aLRB5lnKXo&hi34}(4R)`?U+wzwI1;7%eH^(6Zg;wSEF!&U z*6=5D$q3pz0i1cDp}Q^7AUS+rP_@B#(ZnAE(0vg(j89A|n9s%G^T7-6%`pFLMlvN3 zJAMy&X|(hm8r+UFV;( zu2m~6KO?jUuMdnvr?jVxSzl&;cJEaa#Dyo;PKV@AXl$;3^a~le*PVvK62y%a)~GNA{`ONpw;6>CzCE=LQ3yFUW1lo~(M~c*E(G@1pHLTGS%qRB+^MmnIQype7 zJ(~RzF((?mWvSX(&^{IKsT+1FtKB%hrIM8)$F<%ww#Z5`#s_kHRX7dbDb;f$3f_W|eE=O#OwdvWHYb(#4(y*8P z;_OHo7-Tc(Me1k2A2BC>zlYZb?ad^aeR+$>V?wOE_Y4ElXBgIYK5;ph0IY7$$9pYgBKN>K$8aeS*I~?*`*V3fmXM z#!~Ak@>fr`xV^S3_wrz-VwHVW#8=qqHnWxxr`-hE&2+8Y43+~b=%q2I5hoJAN zjtQkC?nN|BTyXRG=-1M=Wo2DFQ4>Arylp>sUP@(Ql#a7Taj6DmIK~&*L_hvVYJhBAs3Lz#0?c?5aw5}&9Cg~zOVM7 zJ3Hb_bDqn#&C#I!+lw`@_}2XD&R?pVRQWkoN?SY3VWc3r^_#jcg%)i-E+{~2tE+0M ze6hv_K0hd!{kkK3HCaJ4AA#BPu9i&v@vL9=M~WG(VP!$+O8iTFPe87n!E}Rz`ixKL ztj{espIzMS&o=ah|Bg+duC1sMtJyj63e}RCG#Ck zIB4La@YdI=tnpHBm%1Y^cyFGPj�G| zB8v8Tk}uz39S0XUO}6ClJ4`-CjEdgQ_2LQx%=2xR{S3*-YIYbT@d*^LsPKf>Ia;FX zP|W_K5(eysX}viEA!UF-6YpSJ=so5ePAx;;)IxojK2{Uj(fg!|o*4HR(DvtEtk$}> zuWn7!vUTXdPb>*6aEWG+89%o4mPul5@Ze*dQD=6wp6u~+KCz|rRqM18&+Nt8$M;?` z+|D4^%k7YOfxlj%C!Z}DmT{$b@IhdYzHO-St%1HX(PoQ0_18Av@bj2W9}ul7-}w=6 zS9Hbear)R!E6#Iwyv}O$?CdDZ@&1g37Y(QBcz9yv63#x*S*;f`So^nK_J2qwbj1stL9D&%nYF-RaiSjp4T^=I1;% zpVVhS<0R7x`^u@aBbg3dy$CC5IxEr2?Wa^riqxun1X%3fPc73DY6F}qtTykGkn&Br zHV=#Ydbci6m5_&rE2gY)yU5?w4}*AE)xl=ahMkV<|z90h=q4p?ZZt`!0|b}2I?VQ z>u;nuH?g^VScc%a{KSOGaghX~F&1|L2x2c}a2O3=1{b7cIS8;2zJlV4$Wxa50NZ{6 zu)BdH2*8>={0$s3P8!`Z&Ps-O!V26%2i!IB2pJr}%4;me*Y_4#$xBfZV*9o6=tjw?SojfH2^I_tzz zTN#3yR(~zQMz3cT!GhlRzTDN<2QOWRA;mAzFo9hKAB9cip%N_BmT7|90;FT$)S zmWN`qByp2de&g?Z&RN=WnYwx2j*==9o0?;q-ue0ZM&gg@wNUYQs@nJ-t*)k?Ns+oX z61=FrdH;2yhsXlt?dJ0GP5Rczgg#KSF{_A+8U45iiR#pzqxzU+`2x#Wq*!Oi?90|7q+h-5!*VK#- z3dV03tdrU)Yq^V0xr>xDHShiSi1=jURInd6ElL=F>H+3rX0-N906j+p4@NlG4FxGf|Az4Rlc%RR>J3n)1su6$d2Vaw7y^MVK5 z?Ec?O7opcA-74ZEqD^hFh5Cq}&owq}?0=-TvM<%rGG?cA^hFhQN6w>Nb;_QBhpN5` z>}M*|(hY)*L1Qs-}6(59dv#Q@dIPp%wW?mp*7>UG1ZAf{}I{ zk9C=Ix@X9Hax+%jxy8SZi=_a7m7j%w>QxVLAqU zRPqida+)vn+0Gf2vFr;nsbHETbqFc4yIBhf9 z9d{7G`!pe>NPQ?zl0~jJ*}G}s#ZM*TaQc@_*mAnMrf?~0;qw-Eei#paE#zy@UQ|+s zQN812hnFv=e_1Hy_kM6+k5jQQ=9v{OLl%45mW1h-D66H5x}SrSy_Vf_WA2!xVw(;& zD!GuIv0Lu1+m_p!5769_>P^mc{b|tNwaN4Z9U1&L9~2{w1r&|zP@h-fEF`B4VJ&?{ zq>#>)U|YC|uH@)Nqm_>VqX6@Ut4AMu1b8+^tO~us72Vp_h&n&$wc?UB5b0ztAjS_X zQs+!rKUff>mcQYa>TKrZU_VtcRzFaUCXc6q-AH|)5=242t8h;g38DCY{(j7itA>~l^GAfy^um|O{mnjk5e0s)duAbtNKX}IxdC!9`+dS6i?NLO?|*=|oP0n}2Hf=AK5l%?*GppbTx zY%U)cL^<6?FI>8gR1o<{NpHb|#2wp+E=bE+-*6l%SHCG0ouKEQx-gDP?m(<9DoaJ* zn_3)kK$Vg|&fA|GrHOB;dvEepU6D;uAd2NBer+kM-86Zh%(Db2r!XH=X<`udILdrI zgU`(2w$bjidurALWmgk^($~s51$m+=$}(4fGK7ZZNcgKaKc;XgYx1@(Qv)39e_=D9 zfOv*0lPWZYh}e(9gEB?TlQr)Tw`K#7Gv=DZv$FG4&Y*7@FBlIM9^=X)c+42~qGK+eGj`x6uL`BwFJ z5sj%f_X$Pkb#`5NvIJ+$S7SLe&>Q#NpdIU4nI`L9Ddr+%Sxa+^hEW_$2JtP85LO-o zoeEQklB9@vL-tG;62e+Y)itE4)c+!zig)6deCX?UPXZMIE8{-MY+;!I$0Y$Skiw}5 zRJQCPr=$_^*=;H)?nk|s^aiTdI&rG1s%~0Qm#ERpNQKD-unQQ=JDaru^R6UOM`(RL z3|Mk+0>BHCGKSWWeom~^>Cb0=sazFq`%Yqhl$=QGiOa@aU~TjLV&ajTD56RyvohUM6>$$b682cXU~}BB$GbOJkdu4sFu_(!#|sA-JdOm8*x^I`IFJ4 z78e(1Z*m|!m;)#nlweZ3vq^BE%9W}SP$8-XPB2oA=9ON@#TELljMW_Ba|>AaefgqW zIG>th)E19N;}9(XdWgPVrSQ%uW+@9VTwVAb_&2#*5j8@-DIeDz^uRt@+=pjguV@c! zX{QE&c&Fm%F&55c7v_Wb-RZK>XPk>W=YvH07YyuQl@42M%Ey!kX&(OBxG5idczc2P z=$Ye|kWtPXTt+%k=^9uSnD+!-+}eC5NEODdv!+mrLxbbf36mV4rtjbH9&Cqbl}8E5 zR$iF4OX{V2x-6nwdBKoWNVgJw)Em%oDf)}jAJg!QGMY@nI`qH@0J8L2_hn~iN8=U%?)Q`VQSu(*b=L}siq2#eqk%X= zH$FHaKK>C>Z9b^y-EPohXbzw7v&8vqw)y$_APxIu!|caCP6F6n_~09#j7%f&ru_Up z1B3ngOi^_{;1aF1-SS)0t}HU5z=wXL$}q2oT3Ysd{Y*5+7ewpvUA9-%=pMY)J8y#a z;^Mp>)~dcF*i=V8!ly7_fbY0V}!uJy188DaRBQA8g%2OXQHB zsR=f5SW!1jt4Nq=XsA&0%iNe?0t1+t>}!EwA@gY!tVZpW#~=D)VjpzsN=XTz!44?^ zG#KhVt?%XAEMEJYffZ}bcb7}kfaMS|Y5GRq4NgtIn_5s|u+-{Zx5a_5cJJxKB5T9E zyXoit86-dzuuI!xd1rlp|4Ko5>?N1m)0GKeAyk&T@^7ac47nv0vT#=;gk1K_XPuhthPl z=w<)(I7zW-XGK6>)mkU02O&HPFLp5x_THd8eb}*nYWk+#PYNs?>UMOtCc^=9){1td z^g5jpB2GaIm-0wVI=M%)fdq6{ZaCj%$02G-AD%5(_e?@5g}j)0Vc^Q){SNsTe(8I( zk+MQrnIy`lXlVgVBGJ{`?W1<%M?HT5)}Q{ftKkEllpLt??tIsUf=JA+^E&}JJhwrg2#mL&;LQ0GFac-E|aF&qqcf5r;w+ek*b z`XFY9!h?q0W~!|VsfHxG^F3TOx7twYg~A!)C7B?);-wb9etC7S0#h?{@pqazs+h$n zR%2RkU+W@Yh!F)neXB!O=oV_3+pto?C%-)#bxUO1Tg2W=0&?>uEl^Zm^QQUguB#=c zO3b=yU)L&qGR#vFMzuDkg^WH3AnC&3?{D#Xh)709qv*{outghydDL9(VCBE%;s%PJ z3gK1q+?_k|ayZZ8A)61FM{RTNU~xb&CX7ljzk=o z@%|9n82NE=v`AReO-q1Z3>HS!ElwE!qF=dfLn#NzPlr0YX^{v@#TFDrclG8^R?Jj| z=2jG0`!JTzt{+WYJuj<&7FAujo^I;U5X;S^beUTxE?`(fotK?f5>^wo#jU;OP^MJ( zesMVVd|bbY+>Co(y8ABNC%_$qcuc$w1YV#~)S0vcrJVb8nkgMSHhnIICSSS|sYA2` zaGkw_>UPSuCO1fN=aUNuoOZA9q*G9`JLB`56wQYOV;J`7@}54{lW@l%i+TyqJhhomgsov!_!_p37xelwgC5kt?>0+aQ;tj*q*& zY$}0MlhUNWFH7g3@d;v}ihUHz%4QX5qkAhN+y7m@n+B(N9tYUoTf&-=Z%R_nOK@L0 z1d%KP8>Pc*_bN&U2Wr;#{Ip zYkRwh0+Sn(Oh%Cj#$@?$+?|*!F|u!5!Tv`fV@<~$Nb@ZEi(rkO@5X@=mtXYt7h|$ z&4n&^uereNQh)k^a^^^Bz^&!%{W$(ePqKS>I6V6q%q3;S2jv*{Z?} zY0n@Q=Z|o4WhE`LZL5kp?fI;`Y$Kk+)CE@|SjA$?qX@X4#=CX3S7=*NZSAHe2SZYY z(+M5&TFuUS0((2>2g|G-%V;X|edT%TNc$%Pr=|+x8MUsaPp-!SL9|@-hQ1Kk(F(cw z4vg*ZjVxq|1Y%9-3aLJKFJ$mW78W!!X>M+6>drW*)%3(mK$1mVOk263_Fb1AZ-Uo+ zd0F>*cEC;3)l1f0?z^wbCBljEn#p#`5koND!dOt@Q^9_N(~eXKz3aDcN7u|lu#aLB*Gf6My28{K24{|{B!8yl`V~HB zitQ^Za__AtNo=21mCVCU`H_e8tf?7(Tp2q}{I0IRuw=b7Fd!Jc0n%tjWyR$$ttzZ- zyhd?r=ShU{&Py;7!@X+x*b}e3|Ukj$noMY7qLYJ`;ZEVNqJ3sst%6`LR@$-h$REP zeAk6;oz1#7OD>%0;Jm5lXBSkb%&g~;2AKbL?uh?D#9tw;j3b24hr8TbTBmeM5`g*Q zn@Wj3Nc_TMG`^bZo?_n?wYZCRUz_|6tYCG1S7Z83!93gOx_>g96Z>gTP11SGu1&t2(#AKasUqsZ`O#rFqp*m=L{__x2HTseK zQ2vvqA1=|Ui4=F~#Y!$#5zSD|_Xw zr6xoTVj~Lnu{nFgUOF^+V&j6Yx?ut9)F@q^ou_pa-?Ad)W9+z}AC*^BT5*JnOBAqD z^G=a1R`Fvdn}1O$eAMwN2g95}6~AN@&b)3{H)_)@Rhyv^)fT62sTacm!4%d8GH%ZIBG{@`^?vu8Y&JZ=P!9Eld-x9W37TCoh(c$=(X7x_9`P zWAlIK2AC3p{dJ1Bp7hxo!Z9PaV(;jgdsP)kfVl@lQ%HHS59*4F9^q_TUNh9vW>I$y z0ck9@xHSt*`ty69gS*_B+3nN!5}PJ0+gh{H+(t+V9_2(CNT|9IVnDqywQV@hwXIlC z-C7ktg5cJ3*uBN53wMna9{lQgk5LhF`3nZIi4DWti0YqAS52`QDd4e=qDa%U0Gs1} zNbSu2aDh&?KvFO6If`mX zAb;;kpPdfesRhqKclewZr&Iy6JABjb#qIzS%D=SaZq^);%Gwmhq9G`y-?%Zy(T(135rJGa+*z2k2EyOmyDTh8w6n3{Fj9^Bg-t3uuoL z^`s;Yz-dx&!i~CDU`sA>Sc&^qM2S0R*Q6~G6S1cM*Uj^P>&|cMoC=!V?B@Wm5H6L@ zAf{X4#t0{$RffZK?62d$ZDJlb@PEm^RjdM5U-y6Q@mw|SR|sL;ul~@`m7=^pn-pTUwK%8<``h7f$+ic|%U4WPO_*gdNqO+oiQ1{a zT4RN|GBvZ*L1|V05-Y%^=0LTbSLHKAyW;I$d9k#P%4dpx8?i0$lAd1P-oEPvp#cD) zH8xq{F=CtM&d#WGRg>lj=Ogcn=CAFNz_yr9H^UfXCnqbkx8Tk|!#TiN-Bj_}-Ox;Q zIEv3!yV?R2dXD?k$T*BZe9m;$$y}LpnrEuN)zjPCOP5aL>bm)^KQ0zljy;H6N4tZ( zJp>v;z-H5}(<5%fgRA~8hD89rKYwQ(Ti{Kc#_)UaYmJk+ddivM#B)j!ktlBho};@9 z1|Y47I{$By`E!kpjrR}12&U{0rtJkpM7FXiC1c~`RZ`S`_~w`yebRT&>;0iMU*(bLmA*Z>oR%H5Wl?f3ia zftB=jrL$?y$3oT<_tU_3(D3BgULD2yiX!)ikv!YSNdzI*zs1L;-@tted@u<{odTt* zz}2x)M^Z|J`s=6fV`qgu1v*&99%Q4lj!(s3|KBH@TY;d}(UsLfA9Yph8#ua$h9c56 z?Dv+88`#5HyHkbPN=u8u2o-q+4nb2Tjkk6B;Y(J9oE%^@jFpzjzIi~~IW`tHY)1#O zFHh%$$J?NCjr)s`ot;f1Ue+2wWJ%nSS={m4mgMjzqCBW*|F-keEO5@#yxTuo|EOoX zlRuN^`h}tx6$<(*?M>l|xdRb;c8X|k=e4pC1Q2Ir=(>DX@Yh-Z236WCSK4!p!+~uq zsgo#4Or=5kdk#gQHi8Dy3JEXH>}^`afDo45vFg0wQublO3Z(|H52}up!}-TuXW!lK zDDOq%2_WdSx?Y4WojD);e>K=R*t{van6mHL9spRaumKzc@Q#8yDo0Kl% z$nk^%{GTcsRu30^n>4nJ$kk z;HB(H{)2f&BKx8F%D9(#U5JyXQi9}(F)N_Ty{1Q=)g|w3-@S=I0Da}I%xd6tYy2F> z>AyQ{mU)lZJC+ft)CS;g1bP*paHzeoarCSuo`E-xMukH!5H-t12vrAQ0coO_oIZIp zKRF2gi~@{hoTmsj_pU%25RG^M;WKc`kAHK;s4qk#HkQ|Radw&7(_%bhaoZr;`7>#NV3T2&rR>_lU`S~rDff<)QpM@g#B1CpSQy?jK~=Sx3r`y;C0@n76& zh(r-d3LMUhF=X6_msGbk{xqHS3u|gt--n1AtR565E}@KkC*~?v5=jJOpDkBmYxYpl z(Wc`*b?f!}dv&%u^+rCDP(t{4&$*>icXaK}nieC911ljtWKmj-b{s$I{m|R4HNYn-hNrHll^9 zq-{kGZ6IfIpnY)|d|{@H!E@`>|M=Ziz@!5J)2Fu76!pS8Z*#|1$i&t( z>$kVx4#Q8kgBZ5Nma<9L$9$T=h8dHK%uN2Ra8cZ&fr*5t>t0UwBn{6!Jv9sqf zrH~`;f?X)zOEEP!GJmyupRoR8_)hD!{B+Q=1pPq<_O?f zSe&N|W|p+vW>Pwx7hZbKrSvC@OJ9iAX6|dt^adCZu zb-KR0T`e=G@B1EfE$?xsjJRV@b3x;`fIVa;8NE#|?s{lq3+}14h=>*~7r!IpZA@Y& zf$M1GWe@4uvxSFi6=8jl#oX&g9^7CVbW|t7_qJ~qKTNBtTpY8jWA1BS_oDlDaIp7s z3)wmo<1kQ${mWEK;)2S;tZWs&t!)Qiet8-U>UTt4AlsQjoY#TkV0$Q}1$fCEgAzrq zI-Ofb#@lcsOMZMz6#+z)y~-V4Ufuh?A&eY-PzSr-l-Q&M7x=x15p_W01gS7j@LEF!Lu)CABI_oo(NWzC=>!t+hotHU=dme?l zYe`H&GY9yzRPBm_DogK6m%;%=T>*FWPA-l?RAkF7qZg{eymEUYKkvxwt!`8PCI5iT z9IMiLHbBWYkpn9>1ry=1?6`**hg22IX4~S?wG&C~z(lKG>+=lQ11Du=jrxXgFmx!V!Ed3qGb!BCDzED&4ULkzM{i6Y z@Mjy=LkME<;9yQm+bm-ijac>j8gH2rVd`_EMu>QogC>w;w~)jB0Fv-1bU8n9v*-wC zyt=L4{`K)#v#R@%{?|P{J-{xK5E0l9+e_q=R&O97lF`@PIu;Ahzr{jAGHzk?WcB&< z-=76r{c}Fc=$#zMZHkxD!KxA2aRZ_?4SWRVzQa~z8GicC4!tBK^&08#({x=m1gZlp z2?rYeT1WlZ$^2RzN7RpemdmLq;A*7-OwlE|Dsj_gM+4O%|L@7s)lK)o)v=@pyx?^A zW5=#1(0%Nvp%SZJE2qT)6E(yacMc-asH16Yz~pDH^8>}tcuI*CG4VwDqk4@jVA=jy zZ2^>!zHmGyMH7Fe0-i4z0cIR4Q2aj~l|VG2ovP|=a5R8RbbezB&yDjd4{t=L_5AeA z=D$li98scQXeBJ}W+T7>?km6aoUR3Ui@?V`wC&N^2c&;njedTsk8Vz+YmP>cuRI+> z5_&eN4=;Hh*Z#M0yP2bHqXbh)7>)DGQ{^xZmjVOzBGa zZLZ5%d^7&b6o2uO{6(sF>-1~Rug{*JKQF}m_HF&M&vsl_4LU7Y3dy?3v}5bu*7SAp z%Fn;E;D7UeH02YFa?8Z$V zH_6z9Hqj!f+jNsbZouSVlVqZ7i7Y_&cre$E0h5GDQZpcAOfuO7fw4^x5|WKbB8Vtt zkwlab0`v}{Jw5l{`QBaYd+*(~-uliTEDoG=cB)-fyXsd}_sKb=_uqu9asO>=vPSJm zU6n$-@q;^9Bo)hwq%Ps?=dT^UNy@ zBObZ6b4Ukox@wz-j!wa=n^!L^q$}j<4G+Hl^FMdwxENKrOVDD;g(NEOX4LzC%T|ZJ zE|Z^-KhGmv%d3r(VSkeD9qEsQWhK%EKNk4#G}ixA=^<_H#JkybCDnOMIk#`5=ero7 zqQd3y66ETQ$_k#6W?I@x%4YuaXfiV!9{t+D0&RUVr}i+Po(;z@+Vic;GjeL#oCTsefB!T&1MeKG-Z_J) zS3jJf2a?CLVGYxhH3neWtDp4Ii*v5 z0RaJ)K6@2TN{GMXHK1VQFV>!1xoD;t8>*ysLV10@^t^=eYdwSEhF-{zg*Zhun}h+> zdO5a$4s=F>XyPA%Q5TbTyVR$q77!Xc@WTMD&`>`!!$}e`Rj;>U0K@cF!!FWB2GY^< zUD^Z9uNAVA9wA!$ocyO_ZF!L|ab zws<>YH!;UKzUMu~e!jye$b#Bas)I#9N`i8tp~hRt82B#(@yb)zR*Ul^v)tPpD0c7S zkSM6rV@UX5NwL``cT6u`p?!Zb{zw5GxqDpp?RMX(gy!H$&+NWDImM;wm(h@GR1HY6 z;r+6VZo6I|r<(Bwjkr!U*-Mr*SCNxlS!~#pk0vbZwFHpo*V)r&HY4z54we8^jPM9= z-xdMg%Q}66efg}vDzQGvgdNYeX1KJa54V3zJ1A#+HakOMxEHE5FkC>fGt;*$U@x$# zs|h)x4u)y9CydzO4O>lN3!C%F+^qXMb%#*&b;LFK69o2^EW0b=IK0rA0&!Szc{g$s z+H9s|mvcR@gHZ{TwE{Wrzc6yZKJK+vmtKTKvI0YlPRKW1M>w%Ea%gO|vvY6j=}(h4 z@h!EPc0xW`NkZxhu1FZWGOAeSv%G9sS|pFFWSl9$_O2(oK5)>Cj=vr^QJ@l@**|FT zoW>;Pb2M-q4EOS|ov}fkz88BwHXHmh&QdWub*q>c1tK9>>vm>l`udggIK@1{77Xe2|FmEUnY>AXFhD$ibxhAq z6s+0ca8I|uF0+(5M)6i!7qv8B>qANha#k1}`B;8&b$BuBJ=sVQGP6{$H%6bx>p1U| zLue`N>zj>+2cS z=O3|`ui$36(f1H-Ij1ES_8d)niR)rwELcQXaS?B6AzIJb(oC2z*8Kv0=P$Un+MFgw z%9DqfFtjBbbS-)~LJ4ud7;L1+LsH*7$*fZIo1Za1856o(v@hKPo5~`dmXKJog77>x z-1CY3eb@3=mMK@k?&KLVfYd*Ko~0GL5%bf+lC7{hsYxKuUmebXG{gxOjwMlYchQ5xz3f~&G^Atb^`at^ z+ohFrnW}(mP_UQKaO&^3Cu3%;C8^2K*oeP`^jVbj<~RrUGQ3I4ove~80c=p_i3&9p za$8o~tg_a2jFr0VB6-i|yNC!`VyP;Qm({e{$~Qfytr#$p_xZd#={^7B z(@h?f+oz}XA)@T>Ofux@{OU-oB=Q{duKgu7Ir^$MNQ;%qa%Xj%Ns+dk?RTJHrHNNh zWL=<~!-us9x~&;8;eV+m;iRvx=LL+@G4l%cysFUouybPhWcRh3DVQrI(E&=?lryaN zbMTeWTkz$XdpoJwwDr74(G_K&96~WZRnm5MjlZHbi#}Jtn(f zPfL4uA_p9<`)HXb_wdHgCzRo;06Mnyxt^_zWl&uI&DXVF{*<$Rw{_`}t9Q?7>*Afw zYr@pDHf(_V??&BD<;cnPRcE{dZ6w(96OFL#ge9-tX>-Q*Ix6Rc#$Hu48#Q|e*rEYx9GM6i5my>6~-Sl0(9h9q? zfspS;?B4Tn)i_hRg30TS`nwkA0pBc#+G_r38?^!?g3?YiyhEL{jWHUfU zt9G`OdKOSzM>^1Q9;yV$l)*;19YYT?b68Z<#qil9GeM1(R?~I;^o&Q{H2Ac$zMKAr z8?3H)Yt>33#4wj5N6*`Nd?Uj6Q>#^albrt?6H!_x+cWjCOS_?dJRfl_+Y6jeC&Wp7 z4a(f1pO%mTWpwOUYnP}2oDSst8eRQy7~%gZY7}+vn+ZKpPcS%(egnF5a*WphIzNrM?n`ZGoIB@VjC*Fu4>q-JOD~*n$X^bMe!oamzABDImNO6c zRn*S0M)}G=%Mw0osx#Iw=(iz{+8ECzAQv_q`IeP9H3Mj`3RSP(e5HC6cEC)Gwry@zwXC5sYTH zcz<<7QnE?}2U1G7WZ^cNR3P^g%;c0o9?kg$WZ`r`Fe6$}B6xx*l7Nk5>v>AG%Dlgf z9!+P!{5R)tn+2aJ6|r6GSvlH-`?~KU|12dJ(8T{Pxt?9)*#pGF%Iyfw6YTv?Wq85so2a1bP6*X&y3qMH$`cANU`i)bO z%Po12dIlWg+5`sj>}El7fro@7yIE^O_j&20(0`wwiq9}av9@?9kZ=nngzs}v`w0rf z;WkICT(*#9{Z#0(USH+EMir_iVFg)X`xSPcQK6uakUkakiYqLg+m_Y>*H{L@@2UDE zDr;WLtJ70Hk9SI43sQbei$>hTQQS6A<0C8ZWjj-9d&ZE-B(<7>&da+};_PhAo6Z1f zeaz|@`%x9Yx>eY!d$U#Ib|8cl3!1zRLSMC-V8?!k@eNqAw)F}i!`k>=1t0nfzL8@a zdH{L^K4pus3zQ2Rxt_J&sLot>=yy@|Wl>57qoqy-F!*Wmo-)K((1rk|3_DjBcll}k z$VkSt8!M{XDB;Ok>t>4uk0Wix=@Wws(wd&4Hp05_aD&y4HzmpDY)Z^%-VU7IZ{B-8 zYqS1>-3a}8*N(#3WI4CV{*k+;RoW%2zTy5z1oo?>PHm^Qoc)g<-5KEg{=UCwXJ;5C zdXjDr_Ynpdxj49!r-TN})ypb^0`A?K%OD6sb;83xGLN+V6Rz*%kD`5U4-O0@XOi@Q zTGnzt>>EGhhI|*`y;j5}W;OW&x1?6h!sJ>3azX2wF2?do&evGWI00iR`X=pfZb3nz z*63{GT@hg_tv_cEd4)gGk*ygPqneS`{k5sT*0pQdJ4OP>7Q1nmXzog!G3h+hdVFtv zLja$;^j6lQzYZUzwRGPeajlb;tz{q2s=T;Z%hThbf=A?Yi0=n>6N6MQ*f%3jWIf4* zrgJF--rvL}xncg0Jr51*Os(qOSndh|IgPI41dwM2vdFRPAB>Cd!#IRHsiM>@jreQP z!i$_q!Mcq+jjUIJw)wn)5l3q~iyH;&1-?=HheQyMi;2_3G|MTD=5~D?r zF_PJ}!&JRxJpX1n*xF|gXj^V(ioqN*UTlS8b&5xBSdYtFA!GazLk#!B&E8XH6=b+HRsIuO?`Vrvs(S zIY9Z&FJvy{KO{mdETvLYRlbBcSbMm~}2#h}AV4PO`3W6`i(}?9&3i@Gla{1eV z@f>XOd?aKqwdr27j^Lau5w^w9$5-NFxxS{8SDQIiSu zF!t*~@~<{3ouCj89}_kZFe63v4V+1I!I+PVCN;t~)t8p77uVVDZ3CI52OcqW9)~=? zJDm-Wjew<`!S=No^{HqpXyK6?eTdYbOiU1#gm)@i=luPb!cyc=I(zT7n!fGNN^CI` z_) zn-p^5<*SS+J8j!oT$vE4S|qw}GEWjhQ`#9=C&@OfJpkMX?ZHo)X4i0fs->5MZ4iZ* za;~E*vn$8lUtdZ-D`wo4`uD<{=5b0|2H0`h4L`Q)6;j#5^!m#eP7%GC^3CIh3(?K! zyQCAba|^O@23E|p&GuN8WYNbPU6H(!5U5Fd^%?XzuxlbVmTc^nPxWrVt(i>cL!75` ztCS-F6NAyrpATiZ;nkt-)6$2(Dr8yKyt>&ZDrdMN>3VQ{FH!gCc@GcL=P|;qHYwiv zZu1Bx5Tw7gtilLvc%_|1I!_8%mN17@^XF|Ata1u+P;YiP{m-<0K_oeP{NJCUDG#MV zA96cO;r_BQXZnDe?!D_-Rub(k-<$Yr8t>aKj3ou2K7~&N?f1SXgp;4*cWvWblc?aC z+}!@r(dW!{=gM)J@fYqE(d(7$8$qsEh>}J&f_hVll+(JHvi*375Kx6B4YSD$7VoxqDAJo*a{>72&Ya#Yy7!HrYtSsY?UbI-bd$N$l53 zE%t*1HT0!IgT2{baN=WFY-mX6jOBboR)6G+4gV2&;!^NDht3ByubS4ne9`4(H&>oG zZM!h8A#=SGJ})(fFo1Gz{<41uBQ9rYf9LR5SZEPlb-rmsBXxny= zSbBkcs&m0kwI0fk0&(hOE!S2mMFWToZ+lxzOZpDMNQGhfCv9yUPDLd()z4e_u#lYQM58)@rb z7Tpzc3uE{Cfl9isuVukFR#xv~l_=PrPu4-_r0KjK2)EsDY^mwY*^BU3Ejr0o_8=5o z+ula7ZpxxSJhx@fs>ob_He{u&WjK)D!SI&M_ScFC)n+2+gRCHvjC|DAmb7u2^!RW( zISUaF#HS9kDAyxaNF66w{osCV2mKLST^Ik%(jVHJb7j-_RSWasE$zkz-?3dW#7;1D zVNA+y^0jh^T-N=&fmZf=029B$at*qc(Cgb}n#vOLYZa1Hb$8mOg`T#;ZL0tn(pX5G zd_kHSkeeI-A#POEE#rb?>fW|ycMgWZ72ipCq4= zJ)N@`iE6O+IC+cp#r74b(ZTk8kldyB?rH8H6P;N}+J)PTal(Gj$sw*d&X|=!3-wC1O35ai%PqxS|&+`gAKwN(lQ!`Vb z=CUz@v=tD@Ay1WdY}SE$Wo9FTEO|Xabi~@$(=)Qv@%08nuO(t+s*EN3{t6kkNRm=c zpOt564xlsxf^As9Su03}@@Albp4*bje80Z-G~XDruSE)ojfZi?q%B!%PMih156`#{ z?LmXF-xNV1{@dfR;KsmZg;BgW{5$AZ*{CXKAuC}NaCSX#&SpP^rOCMAFOR& znV(_LwQpzAMgo`fGVmPMK3$V+2$J-d@P*o+g)$aUS^XE<5D#n z9@kBb!<4DA)HjP87Cu4Th<3D|Sor);K8AArA21K~Y;kLI#C$o4-keTfH+y7r>UgZs z9s~g+6Dm8-c!4nI-%a*Rx|e$ynTdLlrgF03Y_9uR6YcG2dDYGinMDaJ$7k$KT`#9;_8uJ&2vuWJ4kRL@v zhMbyONB>mi9BcbrY>1BCXInC&p^EM6SM%0)H{$V+&DOe6vGSF8-1~ z^~lxfEj}Q?+b|<(tbbthdfcf8-D@i?gQ}`g@rM|LH>PvJs%s23X`a5jQzdXYRAg=! zt@V9-_^lwv%jJ&^bz$P%D8~yx(BKAZV<(}BtN{>|o4sq2=z7=GccVo;{FUq1H-x?n|3i804J0h3UCB}W>j=|D{uO&y(Z z!6ff$Hc8CA(piZh;*uXeLd2k^(Xagu;$eL#*ncFTz&o4Lr!u^O8gQ$BqT&dJSiX~ z#3m@H?2liHF@a#(fkDNVh(8P+u4%CLv5T&pzO-Zs>;QTjLEWukV6a(w`-e&4K4-2Q zyq_^f12hV6p!N-#6U#DCxp1nn1yNUDZ^YFFU`?<@bD-mzAW$^qaxnm_?DW1S;Bg>k zX5G16?`nf$Vicbo4d9Kb!mlKzqX+9vkr@o0xU$qio966KaORS{#@90Db<(yZ`S*3bxpijN!} z4Lo1|>C>mz%D;zCzfE|Woa_gHyNZg6*h@>~k40womoEg`$wAN)E&p~H2`-|0W%7@Q zr}$U?2*jW@q-t(w%hl<35bVmz%G0M$=e&fAsDguGOGrss0lnzz>I(Fbgghv7a?&&+ z*!^dhUPOeVQ&r_0f%mdr{ogRI2{$h7?d|ao;HyJJL(;~v*MVCgmSuz*nNoYG{ ztFP9M-N&!|`}*=~f`&_iCtRHt?WRhH$H((Oegq29$7nO*AbENDdi5ugqxC`mm8UQ$ z@TJu^OJ6LO0(m)VYis!oUR$bh(uGv4FU1F#$9WMH-pZJfDAO$*kd1d~<3Jq5c zH~%@RVUx#$3V}2RTZ2wo1_o}6@D~sNo5KW&o|86Dx3;kXoRoogVq!k`?ihdjCih^; zD?RdR!h<|2tR6yb0l?(}LCNiXGOJflkR176jtGk$8gi5|)_pP2l5nWE{HtZ7mXwy3 z)-^N$j=8`ofYyQa9Qf5o_g&&q!lR*JV2J<^-GO^c%`I%_!Im}%l+)SS36S()^M$}E z#}S`lb?W^?su;QZnat+rZ2*T}ZiQQd(QQI&IOgW&YHDiQ)w;eQu-TvO9MpN&i--K>4Xvsv+8#JA_%9AMyJr6`)h{?$ zb#``^?<8FCViI@^5`db91JTLU)|5s7(pN>`x{6=CxB+YmWq_2i(Ps@^B9_;84?w|y zK52OjAJI7?#tzyn3+zP(O4nt9w;zFf4pMsi(MoLiof`3J3Z-R&U@DVHBpz&YV1tpy z$K5@nrW4MHiQy|MmbEG#Dbs#4UH^&^$}Um&gVlxelkOBINeHWS=Qr}lS;pDGnktlC zN_G1_HLyMx-n3gfc*K3P;7$1eZvn_v(E{KqSPF#_77-C2I5y8l0F$|}5VmtTH6#E2 zdGYD=EI@YF#vwf#fZf$P1Q^5kLP2ebAKo_!|?i> zwOZ_+s*jJ4g=0$?aKOF`SdNE*eD!0rw=(6O|BXd5rawFp2jJkm_8F4`WYhgwQwB=7 zH^vzp9>%w{v^*Z{kOBB+aiuN(*vQlK>&fImG*xj0neE(yig*Z?+2 zNn4xo;KBmG<@Ial+1{y?-%xn!ujDc`-m20P5z-4Jmj_s~tVQ9?9+;2|V|^$zX*7`o z?|e)R^bj9!2pU$JINr&ZC(j+r1RI-hIss|l5L_CrxEd9ML~0ouW4!j6UX|f0_fjWX z^!#|CVD^zL{h>|fP?x&hH$VR}2jfZHS_Cw$p?O|BhZpGayYbooz>t0m8Zc-{Pe=%C zfK`#uYCtbVr*iIJU8)YsX1)Foa@qy4QL;4hQ{Pa0csm zB8RKmv5|}>?vstU>C;R+@umc1s z%c#nuy)EBs*Bj&|a784){A>LI4+;<0k30NC@DKl`;_zwni&vfiCrdvTXa9KYzt?Y( z^2Yx=$-El;ADQ8YW6-QlUV#S@Fn^3S4*QYB3yejENENTTD?Ko?hs*Nn<3Gt*A2S`d z##2a&;lU4CZj=p02X2xPo4xt`za{KyjX&DjH7l(s9{_v*uK%x5Y2pJJ)jmEdK zEfLWv$ES#Y5{$>X&=;>T|4Np;i5Vlf9kJHiMeAp;9WFx9fkwEwX$h?0AupSjnG+l28`$fZ#x=qMgsD*3lN#UR3=HoWYW=$n{-#Vte@LwKP_vhG20uipE^ zz5pp&+;spE)f7({$`UbjJJ_&5*D6Sd|NZ6UXJ82+u?`G|+~sh3&5wAo2V3y}9YX&< z1oJPHkN-n3haCJramIf^F!uIWflM#}5-;#zSL58<(i$h*e)_E4f8I%!xLklw8*l$2 zdB9(&Z*SCp#{N;yiiwF0H-CvagW7T$++}(>ZX{?7;Hp20)x0S>2#SJ4%$ly#u$92M z88Dg*hW$w-D&oSayqZ?`zTH@zgtsNy+T{^@QLKWj;4yBnZTlVy+D_@ci+r5Z#BNCu2%Qj z{wwv*hEJ|!1y*{L&2M0#Ug%xgB98?oMtyuTiXs`lmhM`0?bK-}gO-LABp@yQdIppAJbYG=rX-Wd9x(Lp9U`~6T?FPt49qX8bL z*c5LR%`u`imIUq5B1)QBN=I+cz5`T0!7hKc} z<&8T%#!GW7_bqjeNLbI8I)rvC72Fy+zx>fb)+0Xh6b)Z1hE zdh~A*!#l@X#_>Jo+hdjC_#X20@p$g%xz0Kq$(0VQ}{R< z^sYdLO>p7Fxe+@%?DTi2tkLFM#z&~#s1Mwg=b*7{3dTppX(;5~!Ca2l{R$=)5ebf} zh0?&^W}C1?X&8kB0%)^K%7u^^e+U=bx{6$PGmGg5^2eJO;;Q|bm1Tl%jDkvW6HXD4 zoB#=_&0wXlcGuhTuYXv-d)oLFBX#Je;qzg}rzVgN)=Iu=zMlePjWi~?7-gOf2#v4% zGe$wp=n>m^66=FU!sCCb7&^oP8QOoQjKJVS0Ba~=ljd4TlzrWkHW7^MW`-L6MgKoY}z52l~z%>dUh?(5T7&MFbP`@`WUPRaw{f|2{bPgCP%n@C zo#)jM-{KZ|BW3>;m%b$?O`_GssNn z`nPfJp22->6r@|w0R9qC2Obz{7JyW>^dO|(D+fIN5!d&O^r(rIn9XE&N*r?LA-Y$d z&HhB5>I{l(f9^9O!mJzdg%EpAr|+ien`QA zHBv8bbd{O}R6rz8iH$`ZKp-D$ew(*s5Tz{&;89c+T$<52{1V{)FUx8Pjq~1iD*fl+$eWa{K13mY7gtT+U zkjU?uWIbJmyP3%qgccElIU^fvWA6_Sor_A53$?JmFrLSMlH?bk^ zl7Hy$&-G?ccgF{T#p4lwd3T~h#X$*vCrtZw43(BBh>w7=BjsB*4tVmiZ?Lf zs<*C`I;@B}s`^Do^Gy~D@?I9>SU1nrH57jBa(CCBqR;tGjdWY)1 zXH1?R*d8AwevW!x{kj)QowK}yVqDj~rxpAG<9*+4zQv2Uz1-xFxC1zRFQ(4*6|O8< zr*nt2t!;~iWO^nt(N0wxUwz5ql!`WoOc4dp!m7}~m&TKO1!-XugegkpndGpEoKPt; z83&sWi@w5c3+iH`H)W)3seMx>0?dxJ`@WFgBAmL;5g4z+`uo30sn!Qgz5gQr-}AbD zpNSr0`%MQuq-8B`oC)B4*?9i7-X+6|U%)rQ^#6wc>N@*j=#6g+(z8!@lzcOKnx1oB zXE>c8rIoF9o%VBfz#A#Kk7f0d5pQxNpV^yOo+&o|=2qQ3g>r@U{VB1B?I`DO9A_4F z9;IP4+NeB1GzNO{*<-;xi&Sc(ro^s%ClOw!XqNoOC2fD{jAOlmU;Hg)1l&aG7RiA$>K3Q z8u4?IS5G!Xno53y$%Ji{Q?R`sGpdT~Hp(RATH^;>KBli%Rxe#Q$TUeTv19y18X+=+ zC%`+QFJ@|-JfoDb(bM82_l){a=ED88NHLO!L}>vNc~=WmRQvoQrW31*E1*-Oue$r7xC*s^ zfvUyd{j|{3K>E?j%reAc)>8C|oz9rv@P?Z_)t6dbO7@&|o>4kXKqT)ZX-gjTuNfc8 z2w}D?yTZ?JDW0V4aJ*G?7^8 z<>P~1`R2R($`v6YdQU6J?a!aQQ-*WL-Nmydok%LdO`(7fVQ3N3Hvd;kiR*AfT!tB9 zGr@@8|Ir&r4x9Bctu5@UjJeprZe{qUgIeuIl1p2zGP||;2Eh~J3ag}U++pIz(#@a8JAZ<_m;Y^^i;q6Yd-Ai96WtCeJ5B62vdB&X+3{2 zyQ=MEe}tk$fBO3BnzV*o-^U^iU*1LKen&R7@}mdcF^2c!J-`szyseNN=@oP^XS=JP z^^z4AtDn^@;+im7_k-sycU80yH`2>@<1D`^ z+N*?^TT!6!PYBRG@M3*fapY}P!U_2ttUmgLDA(_9`7`2Lh>Jd#c}C8IIP`Ik?zU`g zR;`#r$A(bzTVi6WovqP}!@hr7aRC}COk*-*Ds74fYFh`)3rAu+R_7xoe)u^c$iflr z6uRr^0~&_?R5eU9ztlOF0CN4=V&2{hC$-Hx%6Qb)O?R1hrGNJ5gztwgQnA}tc4p3I63 zq#*(vPHOc#wO!zv+j%*Y7rGR2eFXs?xs(C2&F{pC6CTLwbPNT^UR{Fd^UDWk&=3h> z+)U1;yC2XE+#Bd@am1`zj?MD;!op%{L5@`sA)j*f`;@$av3?herf;)p_8XBNoo6W! z|H&vdAhQdrr(-&-&(?QoJFc=(GrLwRIgBfYZ-=WarIq{MiD#qn!Iyb{)K5co8hw8L zYo2=L&^z~45>gt*M_>mg#Rmf1yQ5?=B5&eeoLMnvv7bC$R`K(Fr5uvXA4rku8(3)l z&XPS@Z=~FAh%P)c&t7H*-*vHwyQ2^YPTdpX zj<3H*I*p#j+ZlL}_!P^Zx9HX~M$c$TM5D$e=jY_@YFrpMqGW)9RxKbsA@b`Yj0^03 z4ybEXq}k`>R+Us`stzb=#fK?bbPp>2JlL@rd5)Pd(PBR`h_!UH^U5cBkENV()El1} ztOdpktkHw|u4YlY%U`A*SIT@n)N!l+xIarrwLeTvS(X?x$g6&m7Q6Buek!D()YvHZk%5@+-FeyJ zD|NV6QQw^RF{`Z`H!lqL=^adymZhV;(|arT=(i@ZPaaZzyO-Kn5dt0wydsErpl=^KTP}3wd$Um78(^09!0OvJ2n|U zy}u05GLp~ZHE+3D)JG1+RX&{?nX)^V${~Fi2hv^dETuiIv~(YDWq8MQr_43=|B!-_ zreZpo#o<0z9{H$@|7dhNLsZilRqFhF{H(aL5*AEPuNYQ|om(KJ zel$E)`9PJwXRxU5*&21fBIy?pkeMZ+b$30%aP9q0@Mv9p1?dap2fNZ=JTP!`v1r@h zYCK2{w3T@VFj0?JF`0TmRV)lu*?4Uvghk-{%cFMi$%gzn!fqc&1pG8cDG{7;A_4V$ zQf3k@cpALg=GL>;p)r4VY~MP?DIB+5SU$Ie0oeO)iZnRBsv|Setb%LniCp%+l9f8Q z);(Mi4q7c-FW|WMT&;5N!5h~bOX=+(0$*PQsv{dj?`7Av7}tJfb3q{~!;XR%D+LEXTfh7;7Gt%3u7o2+&IR(%Mq=9hEG#tW5o%RR&my zorEX(l`u-}o=1>}OymbUM%Eq@Qrz(RSs45G;qBt$r%G3hp38g{X9rBR2qWmTHHB9M z#HwY{KoOsQK%*rCF1XSd^gO5-IPYP<>&5PZ`r@Fm+dxj8>oSBB67GxN9K3B@{0~Xj z{g`nkmFFK-v3T$w5#!9Es_;Xn)8Q@f!~Ga;eSH55@t^HH+7kb4$5HxcGtmd%&rKbE zAorimJl|#fvlZ#C=I3#Vyvf}mLya>I(taJnl)kh7&9g%Ti&gCh$$-45P_V$I190Lz zApN7M2RghiDcIaWDyH9qfri!3ANjrx`jGp03SirB6jRH89ViE{1>H~02W`x|W`7}K z_+DIGeXdV01Hl?%n#KE0xMrV_`x@4|X3B_~P2L@?+H>7s1MhbOp20|CA)i_m?gD&O z?AL*<7DmjIIliGQlU3moKs#}+E-u98@Wpk5_6>uB(Y-PG@t9L>ADI03^@e=k?xThS z>m%1kgD%>a#ww(OE8mHZ18K0D*xP1+moj$29^0$2*RR2ZqPWnFZd7Y*A8#^d(OWid z)7#N;hzZokp5P51G_;nAT8gUx+Me12Y>fv)KDe~A79Yu4z}LLj1?|E;Ait8D6U*cE zGsFGuPQd@(y!%m(fZPYNryT;zVyBM7wGQ62nfCuab#SP{N;mj2BO)1qHTd3{uIH8g z0L;1QZ_ISg_TY7Sa5~^mcRP9Dmyk96?PBT!&SYJnHq4OUVQ032JPy8nc&*+$f3QJb zr@c9rr-y(2U(v?F12(^D8o2%cjxhgUXq+tnkLhT|2KtO?h6S>R&bv0Uno6rTjbEo9 zv^kaXnZUPiE=rGMSq+u$`Y#~RnXAg_SYaalmYSzz5ZgR@x%a^P@gVQmEeyPAQsMlv zxG{|XizoHTjdVCH2ALG(dX!ITCnf4Q6`>8jPiV+~1X$fi?OU(au>$Az7UQGUTNWYye1oy0y?Mm@-@sGFy&32`^R`~_4^xihA zXE$BwH7czeZ%VK1*rU@y8AYP%3AX9{{E^6SPG_Y(`@B-&#IdQw z{DNGYUJqigbs(TSu9O!?Idx`gUT@H{Kaq&IU85|&RW0rD!guqw*ZV^^o%89>wysyE zr`UY{a^yLO;Ja3Cg=wZf%>FyL^kfnX&UH^$om(1+9lbhMOK|O-*$kV{@D0_kXC?zC znoE@j7Ga8A;4IbmuD5Yk+Q&@`&&hnjgA$OZXgB4FhQ~jtnQ4P0{w26s= zm6Zw5gtHEAAkT8lj?za~X5kV3m1=~+%CK8k0`jnyA(vd9=Me4OfTJ|e@uvVJ>Pj+B z^{X;^^{vrEdaD1-+P|YYmnK6$k-BR>fbv;wJ1syep@WRCqP4hJF+=m4j;>l>dBj~n zoBP?Q6rGV-##W*Dz0}3#04t=+^WQL9_N3CE6qVM8*g|cgGoP#-8Kk7cHju|aR3N7c z%{d>G-8sZKv+}ZJ(UO;%kf2(zvYLi=i0LJchuPXvaU=Ew>7|i;hUFzK`)-84x{8w? zYiIvbqdnLFa{`~f?31`LepkmzxeFdfg(!O=ubSV#+NI%tYt>B?Gu(IWL9jhS=3w_GsW6a`-x9&$Un>< z4ns6#qBH5DMrHV)v=g1Y2+y*;+MX$6oUt}}z7HQDS*$Nb#_7G5>swXr1wcK;QoO9o zA{^iXCxW8+eX+b2*2WWvVZ>N8tc~7--4Bq57)K9dxBpEfiaHp`0jdS4m)P;mWl^z* zlF#{~hEn|~s^>gpyzLPUsA*C2YSlGD_A5brgi6V2`iYPQt@DF9OQ z7;`5Qb$R^Crz3Iy;ps6qcpyfQ0b&#G+?h`KKDDs0P=Q!WHO{N7tW+Q#e0H6rF*&@Q zCT|w%EVv_!Ehy+KG)V-~&FF^ou1vJZ?W`@2HR7wPG%NssZ;n0Q)@XAUOh&G}({CH% zO!!N|9`i!AQuW4=%@SRC(?)w5LS~d_G}Ayue3+RXAF#X_P{Iq-daCyh*+>T-ARx=u zz&zHz_s^YFXnoSfj6va(s%StXTD|k@wv7F>x1B1C+Fu1C2vRoG88aDoIGx*qriS~o zU2>Q;|CgPw@6Ym#<7;7j7w_?HLb7lqHBL3vi2Jc@*2?PQ2B19Ah8omU!TX^Lv$Jx- zk9n2AEUkWDvoce$ukj?2a-i8CX!z$L>zVR?@Dv|g9=s^T~l#Nlu_yQwdaDx$5biZ$s zE9jA5%rML~on5Z0--|Le1+artV*B4J+wMa6JYl>Nc)LR^^vn1|`VrASajd~lnark{ z8K--%6*U%Y(7=RiRAWI_>}C;+r58V|cbL#y6nOK*%Re5zIJNT0;)nzdGci#!Kw`_V z%fekCEnG0*_D;BQr^4#sRCqw3$I#oU!U)CVoT(qIk5K`KPXI}of1~#w{ONyaKOgnx zf2Q%(2R6%W8{P+EK1xG84~!`c*^{WMaF>04pjz#SQ789X>1&(eJil0O?{`KS?+EOb z6-q<3t7B+Pza=FlFOj8;FyoTyF6H~coOld%VK zkB4D+9#^@(!w4$V&bBCxpCJnWG(K-=Fp9OCUeB}}lgU=uN-gHh-Q>zGQi;=IjH7~7 z4@51F4_C%Ly1}H8v=9y*-f0Q5q}hXX20;4&kJm-e-{v0X| zES$@l#n&*Y3J|cMzIC&}^rUdcbtpp4-*(QqLd^|ZRkHmHFO+TG)Hu6vXKXV{b2trN zug65X;`3!r6o8_)@0OhGwvU^-ctrJb(g1TgqNk{@zp6=Z%0OzquF#v9AkcNcO@9Za zR^?vHG9pY!=tu95o@b@{{epDk4u{^4)w;S7eP4KUrwmx&iV{?mp?#9Yw7-3lTMePV zhfXXdO-NT>$CldDR6^;wy*4{Y)qEp#+QT*nB+`Caij0}n8qNpT<8#~Aat5F&P~Y2b zF-VvPf}o3e$OwFFOMx=Qvj?KKBH^*SoOvr$xZD1M7fK(+S#768qVDA(?{#*cQYn6B zCP#?f+UVB&V31GTIGrOYXX#b1M=(*YeWt()0=1#8KiV6!TVA&1H0+;Ag?Q|Eru!<* z#tkk--#4~TG}C;w;38W#ST(i{cm}#P2inyL1VU-(B6Vt;UdDUztk}~ar@Euf3VBPQ zRVVBuS2cg3m0|A^T;(r#`M1sr&f*P%hk`9yL~5$ImC+8#1>jxR6R2ot#5F3I*z=eYeSz2anKFL=D3 zWxth~C^pZRpOsi~>HT;j!=;tI>mAd;Q=s7yeXKPqmRRbFd>L1uw{kB+)x^sfjq5Ye zik~y*ibeQFcwc_k&2s7s^bMH58^Hl(p(|QyA~|<=VD4A0Zgkfo=X`5s@15gj_rqs1 z=XR6$gY8;qp`b!&XdvtW_f{E=Wv34AC+@Cqvv-MG2q~wxD#@zCZrFSyRyfR$XSWlf zsEDm%e*UOl{#p}d>FbF+f&mg|HiZ zW~Ol1)9}!1SG6>(=N6Nx{@Wy!mRtNzwE{|)I`1a2D=M_I)iBPY zK-_cq*!8OY7An)LLZ3Iwl;I;$LU!<#@@8(Ax4&c&e<5w3^nEG`U|^WF5RPnQvhV)p zMMSx7b{S9z4Zb)eO$R@#w9?bdYG@j03)6?P(gPKVe0xyLdRAscyw2<+T%M=BJaK*+ zC~D-{wg87ZmNYW2((3c&RQ=xd#?H@Y^mC<5zSV25l3`B*`N;1yU6rq=Mf*3S`3|(f z!94ibX^@^4*1?i!sRj*HV=pgSEYCRvZnXtpRXVMu?XA;18&Lhni`0*`ZeY=AF&4BH(-)XW2U(+fT^HSO%e? zP)(udik8=bXY>kT_y>vpK{wkmHQN9cZgExPv(ZwmYy%@QYqPW|b7u#LhH)$%)-=iv z3uU`(b?l*oE5k}&X=l?DZXxtS`%>~A8=bOgy3$PRvxvX9I=oSKuY2S=g21=iOJgDO++|L%;0#YhGK7`i>s4|oF0^aT} z_y1z=t%Ks|zIIWfke~?!NPsf0VHxRH6MFZ7qKGm>L4#;JxIjfI} z!a|**3v7;KEB8?Vf9`nhWYpTy&{0M#>Sj}#T8~xuU`){09buTi@YpOOFz0=f&dDC)`84V41E&|T z(BO4eW7A5_EBn$kedo7LlfZsInfD^7O}yJa!`+w)f_Dd!ttJHxOW@r1wjr!=0|zN) z7jR7US_XuQkiscin5KnaY{C_lL`2I`a0iPOq+TpH7s1zA-OAVVj2mzXud;aKlTJV# zh`exp_;LqtG~BZ$+}*J#y5>Z-Ws!)V!StosgoW;9lQCKXl9K*?K@=NbWV#yTleaK-|`k?vI#d=8zRzzo}+l8JzQgn&zX}=6! z_rjnH2To>@0)g;>-W&RFO;`~oQwJ{1*&{7?0Uz+BD%g9^A~*<(k>?kkHlmZ2OYRXi zv8UFUQh2>gB|NG|x?QRS>Rc`-H`U!P#N&1rq?9DQ+7fZKer}va0kO^3p+57e4p&;v z-{7{QkLvd+S#Tlu<%zk+Dqj8mEI^st(^)YiJyh$3;oy23{yYvcJLC+6r?AqtGP-Lr zIT5BM#^`QBq|UXwm5Umc82N%ihLbg7aE%ImU+4X|)vRdinNiuLrN~&kQ3n6nN$w_6E94__>b8_*(H@}Cs7;-5+8{k82cPvS0pckqbyTFND~z+^Rglb?mB!k6o?eEuq0~Gl z-Le$xxsKafX5z2Yg9zRe8Q4y${iwkSr{l?4TZoy%`C(}nSi&@mTiG5hqr7C+3R|1X zx}18QMTz4z70!~ClhNgrRCUT|SXmk1&7JMGmS3{6%LwbfoZXkF_2v$bqUlsWY7~o- z9gAj!&*|u4a~7vBOH*sVPp3#vS0bk{Ry4^;ldg#2U$%BJA%QQ>;&B!6a*k(M&(tp1 zx@xW|DyWDir*2~7tN&K6FE^D)h6OcQTI{xa7GR*xPVvR##KHuXvDiy|?wE!L;4C>M zczad@D1kdED#{7lsKsh#ROQ7{kyOhtirJf`iCJzKuOkZ+Q>i!@uOl%6xqO=}JgvX{ zt!aU{euY}w;aXk=S7d*UvGcdg7RHig1vM^Zu{=8#nTVF6s~y>`w}ge7;|hZ1Zk81Gfp=g z?C^1W8kv$hs!KAU#c_3oeOQ9zTbc!^fMYEjI*({&<6`fY^GVn_osJZ+VA(D94>P07 zGb?rl$i>EGpj{O30I0U(W$Ugu9yjQHCB^mfZmP{5b=ki8{u!(Ko1s1^jAv&taGMjf z7k2rwlFwu`TKyz*eeb1j@M1Z|r9}0W=R#k|mB8hM`ms42Cm(d|c|Pv14>vEs<2l_u zUx<*>T`suPD&zX}%k??_I8&KDi#8_d$%OwR))I7f^2Aj(lDwYv`ujZCF5`9=ZYLwt#a6%Q^I*??Qk%J?0B+>>^SFt z04ouJWQLOi{B@Vi zNym-ucH`F54yj?R((&WAyPJ!} z=T?B(Kk*;_vud-v4iEGwAbOi00HyeO4zdnlzxtA78lcDjJ!n~p6xVlDZBIOXdFbu3 z7qJdsh?vTB`RUN~XLsj<0X*E#E!F=nGq`ol(NE zoaS&sWc)S!;dd{!h>ia^YX0mtJea^ko1o@6peA-fS{NV< z7COii2RT6#VK7)uOF%#X2tYr90A$GoHcQ)c(dFx);Wx@f-N<8gFY z0YWm|-^R0C3=YkFC{%Ef8h(Qv001)8dbtG!+iNxIkK8-EyEEi+bX{DyfN<(8xg6jF zt9Ctemj2`8+^M^H;9NGBd+L`a6%_<7@<9MJYh!Dxit0f_L!$%44+CYYKyh*H09eaJ zPag{AwCCCRE2gEQTRxV9f~}2>j)4JXrX;w%<{0OSBuexZP?xH!ww6!LX*Io+_IHdU zg2MY7hpfc+oSfI!VcuQS=Ur8or|T!m?(62jU|sS${ye7Po5T}*nAbp4mQ3aza?K7h zyXBlfFdlo+@T)&av+>OB`upYO<`k5(qodu`8zkROaraS$w`rL;Gw;+2FP=Ai~)Yj?|~8!{ngzsXEI%V;W5Gh%n{eKLtQg7Aa#eyliy4e0CtZ3>r3DH7zZdeh)LfH zxR%S+*>q282u~dAlmn0m3Mj_R{gY$uz^OZdJz~BkL?7rQFE5YXVMil-XzkvgZ5x6C z&tI*neXs2VXv*aD1?$NY>s1m!8vv5=EQ7DZ_Z7>{Q~>~bldKJJOaV`BYJ>wAF(WH$ z43Lr`fy0(s1el>2TxT1_tLy6nLw|7No2pm@Xh1zJb%3II#f(FzCLW%vT)q|OUaby{ zY-wppI%nv*pBObKDnPkJ!hu8@=k;{w{HLd<{X;_s)qirCAh`UzalD~>*Bp*i#{#*6 zlG;4()x-f@N?Mg)799{kb$~=5RT%?<&d$yp92{nqEeGItK!kgN4`;ZTDp&T95eFwH z{HoZVx6oAg#ACbW^CWTQ6NXqvS+)0gWJ~u4WU)ye(hbryqG)8`NYkZ>VhjUy#rs}T zA-4sju!iGg5J+RuGX#DA5ro90z~9?X(xg@rI3vQxNTWgWCWGze3v|*$1kJY?MhqlR zz4$BI(mKqEVbQr)w3TW3mu?8DwK>+?Ct&Ms_82}ep%e|awuQycTV+y_aI)W@>Mil( z&_9P{A~lSc^X}(03M%LB$AIHSDr@A5mjm4GkI!@00|6xN;{=tgoOH8v(bxB-kV;H& zzL-9PPIDeQ+So)2lWAG`-t<$!h{cN}DOl_U6HZX4Og#>Q$G8v0M4=1tGNoIZZolgNEf!`=NVjx^%tB*xkIH;peI zuWxTJ(*fBGjvIK--(S1I?(D$ylT@u`Z%z>*cM<-3oThG>{Lv2rVdptrA^lo6W9xe> zj{C7Y#5bb3&qp0KcOBPXz=?A68(FOv`t9+}LE6if|MJ(R_kO@FKTQ89(!Fitp}CIE+h`Cj9%IV%S0ce_Z8`z6FU*&q2X@U}^6TH}q>>6eM(~&rwU0&qi=tKDa2iKA@j#Z>%Y7Uv*pUM1!EDOt}DHwBHf zqavKupHa?9rH#~0h3g5i?vVW;9t}Gh{+|QMlSV%ebiA9K?G0ScwSju+zg`kY>NqiW zpLySXSzf?Memi&fEB-F-P;T(UAXPsp7d~n?Ot}XSAGJh~p)oxT&%*jNwX6maw`J@O zQj@AE7SYA&FTgX46f=pKn_W4e%`-D|7tMQFIgDFf{Z(MDjWl4H^-*q#|0`*-)DfJh z`FCUb!%dc{ z;>X{p*#**)Vg*Hr3!wA95*I)a)}JXX#ue5a}RHB2X5hq_DF4GeBjMLMK*WCW5Y z8scOlPwQJ)gckCn{-BS+)5)%~uS#iV#Pp;qkkAJCFQ6=fsXMF@ZBfXDgnO{EnAIN@ zK|V0V>yfdyY8VA(opS_j=_=u95k2v~P*tL9-~OZuCS{5y0f{p*hUq%4M?L05W!aNS zlj+f>{%B|tDiQQ)lwHXpWXx!5M#)n|S{qX*;8`3vwJTA>f=ueb0adn0v*?^bk!WU}pym>NHI}waW}|!u6Ju<~FYBr) z=pL458%>mU45w961Zi64UZk-vYaEO62{R`0=ZZ?>iRXAa7W5)^^Nyr+eM$2D$%UVE z%#6MkE^l^pegb^<_=Z=F!r^sw@4~Yf7-72ELf`JM?3_3yX6?hBBZ%dvl3k1Hi}86< z*PSJ(y{Vd|MZ#rt>s8UyvIy0&n-@kg9o7#g z(;s%!ElDuacl@dY)Uj?3%O9m;3=?ONspd~Yy!%r=nJt1miff~0f`b!`+-x7ukQ4X&x&0=p&}u8 zCAwr?;>rAQg|MLphll8Ml2T#H=2bKpNVQYg9WZ}S_N83M6_vM-wW*d^>_#cYp}6s@ zAd(>{T2Rnkrd86OcK-l%=3umfnxTxsL{g@39eR-N{2*dQo0FZF4oA;0JGzUtF=(T) z&Q&x>H&!`M)yU;Of3hbJXF|l-IujXF4)bBQZ;x!ajis+x(BkVVM2;ZT$1qRhR}oar zBU^IjIetShBWvR+%yU#4~?0oqLW|&ep0~5pH96P9$R)(9=QEo{(aIt(8 z(r9h5#dRRKZ-DI)tn2BhkDu^hQMwe$~c++Cj47=5@u%j+fvT@wX) zXBy^c!t8<;>$zkqcSI}$r;r*lczn za#bCjO1`ozQY_eMg=%RQ=03yy)G!AOgW^*9hKnwYR2Y|aAA)l!V^fx`(pfTTCB4m$ zXBn~7?~OQG#JL123+t?A3G81G?l#mT#a!&3O%2kB*~I>;5j)*&2|Tjwjd5N#VZGbP z>j!6?PVE}5$2wwd2-G7C4|rfW1eE*6HXsPt4v$-(=;)N$Ce%OGj7D-EY=8AwMuwS? zS1*HCKr2Hyk!s6~;@H73P66R-^31Cnmm1IU&sI<2FLK3_2Zmn~d&AbZazocA$eCm`I3|+SXg@0a5+XW% zWbL10a?n51c8=0z7QPGPC7*anao0x4HZB%FU~hxeJaz^QzjfUmIEh=Y=G z?Q8*zwfr@+lM|9GZ~EAC;%E0c-U68h``Q}Q6QeH06WiMFr+YJIr87Tyk=s?!C*HY7 z@9NDtZCZHpLwL{g`Qr#pjvxt9Z^w+W9TClqK!q2%-4mLHQ5t&nfjqSbbs+Oi@u=i*PRqz47v#0k4Nsw%`i`|!x_A!E{0dj2TqV8D2fl_-! zn8c&GADv3-CtSP;>C)-AgEf=#gpLf*bYrQ+F%9x%sB=TX*%%o~`{EvLy#!JHq;gBx zepkO*N9)M!+bn_PDl9GHm_8JQ^aR17NYEDz1j-O9>_jyBGl$>>{~AIA^TpT-W#aP| z#mB{;I1b)E_NLNP&~+qnO4C8)z$3G_8Dn05hAnTrkIGACyFXT$B>k&WkdsC7@LjBh zdt^u8qNkqf9Jd9V)KE&Qc()`bYMH@cg+Rzu^9VlN8P#qa!_Be~c`g_YuJLHArUrp- z%9Yq@R>N&wPO)>FDFKv@i`t)^C+%R91QF)Vk%zrWR!()W4_iQFT3{kRq<%$^*U2EW z>1pw;4e_~Ca2Ffb6i*n*FYIPHI(?<}XD_tMKbeVo z%A@wmUPo6iucS2-tVzI=z^)>IOCc0h=-iR}wmH`Su>a*2fbj8aIyv_!3^}@Wd71U> zT98}*QecuS`Md~idMw4Mo%XdipGM}gDrA423)45??YuuO_|%!pD8a4`4UA@^jA|71 z?6H*6#0#ki1Oszvr5sGaMs(qDvdD7?9v(PSRLiGV#3e2%Z);zoy*D7XkVuyzMdn{N zaIUe~dbb-YA-dS(FX7IAd2)Bv;j4f_QlWD|?x0{Rz--X)6Q;ahg5>MG>RSD)=u>Ln zrZ%%vn)wlnBFuyVs9CP-vU}e(Pkyd4ZA{63bB3Ofx3gLyHeUF!q46vdo3#zA1<9Ml z%M*c^KWr){K$UJFsi#AZaCeH3i-X&*c2k>h9#r4aG}8zI=YE99rw)5Lq%~}9(F#!D z60(a&`n8AzS6OwLMRqo@_xsj0YkwTC7PB=z`tYK{vG7T0&NTA zS>jlV3WOx%-JgueV_n(ongo()lV|Zx{2SDQTm1WGpeJt=nVZ>6C7d#)Q}&s~Pj}xl z`p(mb31b-6^vGs44jTmP{H%-UC*N$m=N8NR+H&EewI?L&LtGYDi2fX261Nf;Q5m}aW;R5chWh_g%tw- ze*O60B--^Owz0>Q5K2aLq@!a`QOtQ6jZd6B3A~{1X`GEaJl>!k-=-^e#hqJh`4r>C zT`R;(LvNL4txofH+vZ2qmSw?HO(&|JQ4sovh=YDiC4WVN9{j0Hhrk)hpsc9R*_hUd z@K=0CGFumyGhx=weiysOu!Aw;d&_z9m!1D|cJ-@V6#-o}H@Opsd4U4MZC zuhX@CgxW*!JhOPitfoinbvJ;`2@`PTHja%4(#U3&G6}r@s0>+|bagmj+JYg2A1*pG z<%VS(TYSA_YJR7043d7^xFVhCFM#2Pd1a84x&2H5mOu`2gUy}JouSZHbFucaHrg=s z6ylLe0*l3y{*(HSkX^T;A&D&$dBf1T5ADLNqU1^QP3x9Ke5UKPL+!MUskORGSsgu( zk_skf(d8t!<74ivGVYd-8rt{=O3~XLR~@!Qq^Us`+{h$&cr9bMUQiI2eY~i{EL#f| zwa7Y28<C6DXQSSfMV()dz!>Qn3hw{-#w7(#xVVS3$`3f){xyJ zvW({(R&30nX-TGQr7QyK6m|2T@65G%Xa`6%gwcC!@ods!cr_1jOzvQ0X;*#_5GFHw zH$SvqdfYd-4Nt|1+155VCq~ypvv2+JIm^~OjNlsqJB6qVQRn5M%!@#b0(sc#6iEbE zwNeEyh^VUQVvo-?UWrwZ{5iKAEwfF$fJVgF?z66f^Z}#3jF{Fi^}=QP>V5y?IWPHa z`P|tZ9&{ab7!^@_Z|@uIj?YGcVO;C`9sA4hhC)jMJ(;T0!41;|i2HE+<@-7dFN{jx zN{{;@foKEv<+WhY!w8V24`x^da&+o@vS3}o z&N9sgZ>7Ypz=p%IKd}~#^!O^@{zChfQ)%<1za=giLpafSD)l(3u%MCbON<^gaPbdr zi=W1|&ksA_DJZvsxP!bKrNzK9{Xy#Pc{MeMKSDy6+~dpZSQ+D)jCn9+lHj z0fd#U0V9(_xj22T?56$}p$LShX)Qg%cx-dW3T{s>9$ZYP9qwx+zTns{wT3aMtInL& z)a;~e?bOnvN9###j=<-6#CWqjQayZDHj(QFSk5fGy+Y($3}Y?W5N7WS`D#+)k@uS7 zZTMkUv{#;OIAbG~WYKnhG$3=_X^@{rZy74j**GE-#-IFLoMH}6y}=#%;uv=W%<`=eD?H}{=O z|2cm%L`j-ScYI0&PjzC{eaK zNr)muNmTKBzSaAHW0OVI=@C?E_B8`uBr=!=XX6#t7s2&x{|A{X305og)vf-=^%SQo zTBb^-NKO0{r`%YN-jz$7C6p${toFp<1TusQCn#u)Pq2sG<+rsB>yM!33{pK*S6NuB zU;fD0vWAWsDcXURF-$p8A;A%^yJYZGd}VRKtOp^-59Z2ntthDhWR3@wO}=bS_2 z1M%I0Ku&&QejC`dxwVoI_$?ZGVkPaS>-WiwNmPt2c5}0peo7nzo8PFhso@@=l`Iy6P}#+@oZo9+ZfHNdntFuGRk+&y zCRj>UlVtZYrjnu&lPpDbs-{>ti&0Q>;b$TrIz{F}K+B#-z-djF*|J7A?@_giU1v-4 ziGy9N1(5({ztF-^p~dR29*h;@eR8#s%zb1&B8-{H%#Ge>QIDU5Qr;i^Ao~~|(5V(EAlp;qeozkxU)$Cxjv}kQN$N8vt zN)!64b<8fPdF!&n@(BT(+E&W)j5K_3aoOu5v*cW3{wMsy`a8k8DJr<`p~s!nIlE8O z`yU@osgorLGjVfvwT6ilEtjw_8Fa;fq)4=}+;G!Xlyn>~(Ox4n_)zGdSdh4F;NySq zco!Y%UGBv6ZSn4GA zYvM%+%cj`5tP4FB8DBtmSW2A+l4QVkBoBwFqCxq92Tq6Pd$0GsW~GjA3sNUd-V?P` ztp}-B2)L_#);^(SN=Iubb|gsCLJTN0b`;#=;#RZ0!iCl24mf{KI0NrOD)BhsXYkPv0TEdbCFDioTDnUFE-_w9LG$@5}-(@xt6VN0j^F+M;4m> zt=1mLC><~a?@lg=H?f>`+lUyUv3zV&h16S?F3)sdvJ~ijn6~TM84cbWoWRh8*06-u z{vR~OKk0j9X=|M{7lP9A@Q+>~r%un2Wn zV1#}jDam#!S%XXQdb1wb>Vyj*G4e#}f$M4vhgb4N7fOOna(+^bp#F$_BtkG81!UpUk z_Mn_J%)YT*d5l~b#8_U^ z{1z&_-3+_ugt1aqP3=fQrw;^<>=EKG%YNX*Se1Uv9?Ze%Dsm_DhL9f+c zI7zP`XFCfH6rvx(T$hOwcRmGe?yNbP7vc=I7twAjD=CF`!%MliI=F)84)p>W|Fo*adLY#zBi6)C@__ew@tw7*d}q; zAgBqVYuD{W!*BVN!C+9?OKK1YLjNd3CP$ir@7H$Vq~Mp4=N_m=rzy)DC|2J^pu=A+ zj?Wu2B*A$~F$zvTHY8TDexu1ShamH3F$tMdKSum&Sb3T!Ht1dRI7%m(0>BoFCu9Js z?O3amBDT4L6ETUe4NDy`9LS|D{;9G&$Nfg~aXLBfCh!7_IIKXIlRQJa^~ zboK?|g-E{^4||g@1Iw14%>G%e^!?|Q!zVqiXLE*@!RJm6>{=3RUyCtnaj zNFSvxNICCg-q5HLodw+yRo(c2i^Z|bA`~zVCrzVq$_>gmOOEVD6(~PC+8&swCm4K} zgve$n<$Riic^V{KCSo5b&Fey1=|Qr7nd#08BjrDavSr)Zm)g7LcRxgsohq3`M`vx8 zu9n0Pwj)QDg;2~j^2RQ)#M4Z?{#pGwRW9!*M@;&l9|I5jxz?^d8FqT+0aZs1qU{zl zXUuxf>qk#Ek>5l4)B7HdG3Vqgh?Z)nXLnd*wZAm^Y(EOiD*B|P9l-NYOMbjS)0nnN zgSut-*@%hn+35xfyzWCEnbl*e8jyHQ;=<`;lk9#kffeKU29m{1uC1ws00~4P} z(X+Sdq)0fL1uq6smnuaC&2d}t8b!o*hN9fvXX0^;@3r%&gnVWxD;v$uEmonF;arS^ zlCtahYBI6*IKdbdh zi3(qt;+!g$s4+b~b>!43dXcNzEU`B9$$3R`KWUj2Hm`=fi`?I*Ozy&yvFCJ@m-h~;hNoo5u4*Zwf4iE9x&uR9(zHd`#4uB52%Xy#KtfZ*SG%wFk?P{)(v z+6y?~IB_=yhnE$(NHgH7rio6Zw9l^47F9fk4jvDUp>dWz?nsw{p`v5dwA(4h#7Z4f zf3Rv|e5w4_&d%;fevCrS13wBaI@*EUAsA{Su3xpsq1cUSu&Od$wT18-MXE`25^Ci| zlU7pEGo5`@d4_>>6o%VQ@3Q4jEKP_Vt48_LVfn0c;JrG{2Xa<1qDqGYwy%$tq6wa= zP)a9MHt@Kj1WHEqm|C;iF9tkGQq-c7PAjPpHp^?`;ofh0iXwGb6?j$m6#X%B`Cz9%Q7HPn~qJUF6}OYIwW_x77)bYhCq=IPvF zoXp{`=QKN~c#)2(&s z48DNvtJvj3JCc!z1xeS;_9lV#FWcO6ZInh=h{K=VxDX^s<5kPhFRX1(eJ=V2X;ReU ztnMkSa3w$*O6nL*`AJ1lThltmwZ74Z{5i)#9IMN*aLrSZK$4dJz-7^nNL<4{s7b|t*e!;y=gnLeP18oJH>V=rP!?~xNT4{Q zRTL84DkHrAnE=y5(YOxwk^-*Ms~9dtvdGR|2g9f)X^_wnwxKO>|4kxkm@W1QD{_hn zaZbAoy}(0Z?`k2`V`H7357$1~GZlqfQ1Mw>g8C;y3~ZfOUJ5g~UUsa!Rbkn3V}zg^ zE{JwYaTC+ixAj~3ba3Mr@E)nO8`o4y;XHS)HCaTQP;a$#{$AVa|MU|%j~Yppf|f43 zkfS}J)2UyxjCe*!%mnb>9E@l{_aLb6V_QXZByXWzgSauCDB3NHiQ`xIJd}>$YCWFR_x-t($d`Zc|se!whYbV01b&Z143Rh4~t_c29| zPRcUY1Qq?E=i@BG{D_Ok^JnQpQ$(D5e!UHZ5n|OrpGQV!)<-j5YGuYQNxto(=)jCo z8KeW(S!T!Q7q&MxKJGiGSdbY>+AXZPvcBBfK0NNWcblKE;=OW=0n&5R)|^##_lJ|M zp33Ib%n)AfKKE~AJ!ZXH0Mn+&;_(^WtLKz3%EfNquMga1TK7+w8%HhO`<<^ zsswn&nlim)&`;Jzcm;8tKYl+;6G=t298s@+zRNy5Qo!lQx^XSR~E&7Pqvl({F!iMEz0sR|6iNxRf?7ZPA{ot~_e-%j6~D1kWk$y>Y@! zWAb1Bp%_kfk&Se~6unxrMR}tf;cn?SJv=+egwv!KaDIEe)>Cw;cvz8odn?yWfLBoG z$vd}(_YGHoY?bXF`q|9_FA{Es`#3&32df_HO{;0OQbshxj#XBBn9mMMu4(~1?<$fvba7lkN>j=wz&t6 zUb&^WUH7yq@B8;p@2?9E>ASjuwF+D5+;))x+F#b9+irmRHI2@-sqeZU){Y*x;l&ZR z%_{`A`HJ_q0Fl${KM-r$%Q=8?R^Yh5@?_F1#vb5tc3J_+^RP@9MXddBMu>Q&g& zwQQeDE>tw!KFZtn0C!|o6vKJT^CNTR2K}M)nfC#i`&+Iqr?2i;iBBMT zqg|c>*|s{Y09N7rG(cdzuBk-;BosM1j;}d+Nxn><&~>zbO!7R2KPLH9ihj?`^yN4Kf3i7PIe%!3_wa<#{~rM2S{tjY zr=WjL4SnE>)h+55L+ZPkKz=%)CfqbJ2GULwj=GAy!ate|G@4@k<7H1%zuRMfek-}_ zbM|xU@Ne0c|1|oar0&^#bY1uj<-=iM!_OU;l?lKRZC-5>Z>? zHF>IFh$)sPELcF7U9P1c(N3Edf{*gF2TQRc5l<8SD%n@6!G)Jlod29 z@1!=NEcxT^W7|n_yefbVlWahn1D8cU>)gGWFYn1wuCX zii7}ASK2Xt%q*VoN63mr^oa+Bc#nC}xVO+Y>K+nO2yJ1Q*hi3a7c6_rvxc8)3Fza;Z}FF#*ep{hqEEon#`%RoA@MhL@aCt5d$8~oHHebW*GTgl$SNjz*Kp4t11#q`$>*hsVVA>#S2DyYL z$2@$Qem4O2AZ6WAT7SvK#xNR(@>L6{P3q|uvjW{Sg-#w0yQvSGo3h9g-~z^-SsF2a z`boJ6@FoX$GARgek~-kT)rYAVEA^dH>F38G!H1RqNNKg=hGm?_nsQe1Zn`CBAzX;* zIY}DaJBD!nLMJDF0+!!T^x+C_T}e-W5xUVj3)#g5uOS@)-V)uE{eG>?zE_MqbqXYp z`P{ig)`TVMbfWq9gg?7JXJJK_H8y4J!`R?Xmc2|^S)jm@6w&kZ;^zyn_!Tq7WW|kO zWc;ekv%%$@z5|{?9)3Z;%ah(D!Pvx*cvS1wLoWunp6!}Nyw+vif40ftOZykEkA|eR zEmQarB;ug6{V;nO8!@Dk+*r6~1`}3C)p(leVm_{`R+K1n-|6_Wg%a#N6-} z!^vDFCSK@qIWCnwqw^xsT(KMFwJS-Iom+trJDu_Onh{0^Tsv%<=deKM)XG7JO}oDx zbvBh?&z=Kn&PipI^pqHrUc zMMxlQLDO!rFb7uys@-cvCeLJc>K0+K8g1B0a%LqB);eC$-m0xg1?|>f(t8?fDl7l- zkoG42a6mw=>4?F`)_|)U7nenq%6H#h2!!O_98*qivsk3)>j`J~Fbk5d{S9W)KBC^= zG@o{kA+V~_8J*GGiQo&cT|6yRz^Pi`rQv|ldrEAQ<92oaFbtdV63(6T5boq!;~}eE zN1XDQR$OmFL8=&R#l)J1cK*QGHbtHUznTfieEolj5$7+;b4U}z_o24i2kT%P-be9EnZ&O zwO9Y*0D%sZo}|HrzN&LlI-2HrvzDg8+aG0TpafxzwE#?1u4ENzOu~?N-$Ml4xBZ2$ z!ANH~5Asoc2`?`B3zJW;aj4#E1@@p}o`z4_J&!TmR!eWydQ<dAe1-kDbt#?QKM)=@(keXQ3PI_$(nRq#)(F`4y6MD-Xz|>k8xpNdzeZ#&cb} zvi1ork1WwI%By!5WuEe^;1gf531@vwVV2h`fBBs*k)$&66@HBsd57^M)f8y5MeN}r zBeHSjhW)+${U%{a>=SzY6H%?(EiEv;*|)iz0qfNkF*$w~$X)mK_h#>`e0s5R+V!ZS zA#7i))lnckE#gHGH(*)QA$eEZnnC1@lYn?R3@B8+X}kU!kE%I8JaX@zzL+GKKIt}3 zP~KYR-QMfDnz#U}OH7ZJ?VU}*%{d=|(m38(P<!}3q}&Y9T4B}NwY#KmUaZ!Yo__DwGQNY{3!p8g zj?SNqJVe_*tRfJXdyg*p7%}QF9rA>ltcSEjw}K?M0k<&1N3Y;YfjP*!#s6eR-=|CM%DQ_hO{1mjbVnl$@{uGkqIA zkTkXYTKxnIsO(jfl!m^J$os1$#LXr|UY)z^b-{6^@R|VcYq2rUwv7lfB0XRy&Qoae*$#y;H!o=T!4SKO+(Y3xi#ExRWGXn_aDm0?cDxv zF7ZF3Tm1Qh5%uN%bg}c8t37qe3ap!(O2a%@jiBYbxtmpwnya&#WuW{v15i%Rz3Dor z^DCfc(~H-8MyU##+ji<4_inc=S*bvz-8V28|8igIDzfG@r)Ez5vctV?8$e0+jB5^! zDOBTb^j??o=3m3NbGUv;pZZti0``lF=t3YQSr{P0O3_Y%`x)jfcvQw!g;g#`9oJ%*QDe5 z<({O>%uK{Di;KEz2d5O5#~T|o=s+gJ-Ps!6tQOAM$<2~^@XnUq*si35J?Du71#|#x zQ8h5ND#zx#3XtcS+il0wxoWT75XhjpFA_t#stu$k6bVnvANsoOeuX2Dx>H&Js=Kyi z(ay$3s+*m+q4o>MKo2JXCeV{pP~E_Zb=f3E|`DzP<~faPt>!U=t!nEeKO7eeJUr+-@+t`P9uvVi zf09iPeyO8l22ZX0ki*Xqqp6esn9rJBO1*+_wLz_*qIN|iSPOEnU>Ere zwsph)!D4Ja!BxUoJ(4Tv(Qx8ucAFKC1V@cH{6uu{&gUg7SDnY{Eg{CH9%0qYCySff zs+*8yI9-Ds2vScE)Tle{_Y9;sOoR(tV$rwQ5f%1hddcQ5Ds)!SV$A$MWvpU9W3 zXck>re^0KSo_`}vs}W>l@2SD$V95wceI#cRj8)<&M++K>>`ctB4|)p9+eCvLl$|e zp`?ov0lhB^lAuLWWvM~RJTr_(h$|aaLP6ePDBj~zu*HX8OtbA@3Un{wie|1zc<)~p zonlKcFeju{GmEvU{xJ;bzWnn#A`?0NQJOtLyY!qud|+fmh$BKbjlSiwbfmPD{c(dL z<0>;~18E-l*a^rm`a=mS>?DMy}X85-lHBY zo*y4O^>EdVrBxF(bm%42D{42%f2!(fGWH0Yg^E{%>}v$O6bfvDj7^ImTy+L!p*HG- zuB-2?Natxxc@%mlQ=FXRcKbAoK+LYID6lZgXcqLm6f?6TW{|!E{d*_#4RSN{LKcv= zL$-Kjb*pzZ4-lO09MJR{tJrlRBL|UIMmau}K74XhhPd}Lz^4NJL4AqyF*K=|=$)303p+pM!^{W7ls>Y}HXLjb3EDQOIi++yNa<}R@Zcn*7 zU%5G?QkPQ*wQUAT(5k1&`nJvrDJpAoBxzd|sHaABnB+?^#)339YZuLAI=2sBgWERC zIEyr(9~=#%1g*ZPn0=9*N9!;SQT(E=tX=Wbxu+WHEEjU$T%)q8_V{vFVJyY<$2~$e z@|G+}S+k9%`Q?6kn~pDf=g{Wf-FfGpDmt(xJ!^ZT)qz1W;g3>I-=nEg@%&m9$B6Vk zW>RGIEom*TNugcI`I)Q`=L{1WMTh+@y`l!J46(sOABVF;HW)H|!qnVi{s0iwDQ<#; zjR%FB4;dp0nLQ<447!`zplGg{01_hOh8~GgZkI$TVK-00e1kW{bGx2+2%>rVkRrs( zUDTV|HC1eb_rL+Z;aTF?$;=_!$vEFIouc4#2<~txEeNTe_4e&KH%uySF@%>m4p`HQ zWkb97;{1Obp8fE%eG!~L*xm0*Ls!`ayDKkW={VnIn13K(Fjz)uF0k_0&V5QHUSnU{ zf0XqxRsorT=^JU9;Bb8p$ZX@(=dnTg>A5{QUeXg1?ROD*>4x8AV*JU>84|}NYzCuS zo`bVPaj7j_iQbjS=_Rv$fIRYVd3NM6CX3V3Hli^z_tr;?+v`s6SjLzilZB<9EXnsm zo{qszHkmeFJ&y5Sw%8_jO^Ubi zk#ZuNsKi}`s~w+5ZSy@5G(Dv|=Fg*+uvc9PmfMc0!sCgM>a99$l$2bZ-B%#sQXk z(T;#s*bP9ee^OTYQ9Ayn{Ps9eJi*S;{JoP+eKqHby~R|-a5=UD>nrTu7ayp-8? zl~-JK<4!IRb)y^xuG%{vSY1amhc(}0v3&I6#k=gi)1fW7{J75@v$dP{`)U_a;kt0Y zw*%7`2@SLaMweHRNmG2V56ze!$8{U?G@ioF)|e1iy=oA5jFbjKL>ZF^}mq&b3EWw|#3kc0NSX&DV+2$#M#} zA)T<))KU$ymfCn{95ee}67fl)!qmn;NH*_Sz6E~y_hY)654n82A{reN_RZ~*GdX() zZv;Xr)8iOUA$SGRz1Z8^Y*qT+&+uwNTPQVNO~RmeD&yXgF$!eOer-IpCA#{K)?0mE zB>|uKjRvc&B;g#aLf*_tWRHaWy$0)sk@Ms%LZqc&xXecCwWphMbNW|iIj`DE)o9TH zGi~WswbMkfci#)rW81`~7^cd`sQ{{nyc}nt-_21^YeZCUT-G z8zES#7KC&{o0bTI>f0xuDw(3+r;zbj)EhPGkWTCD&IAe)=p9{WM0^Dik+Z zQxZZ6kX5Ol(1gQ&A*P=JiSB{Lm?|jWR>yOnwRZR}wQ)0S*8lTFkJ7(#0D5@Y@*FpKx zJgML2T!O!lMeE8=Kx$u4OlS5=bem3pJ2Kc!^V;7 zsR@q^YkBUd9U~79n#bN^kEQwi7)f1#`2LLI9IMD{`ouT?+su1b#mA7)yxmZrzJ8Nz zf_99w7}ecF>94A(>Y1C{>*L!%i=REw!ra>C1F0~u^k7%=RA`8`HSM?@01Zv$F7~RJ z1gxf%nr2*|FZ2qyj(7*Zw|@O>ain?~EG!=XF8bO6$Rp-k}brfK>@-{v63OPCgebnFzxJKfsacs} z>%)p&+gPrPmS({TV3iZEzITS-L}l^O$+~@hT#dt$Z#pr8x*1(qzRBGro)`Bu$&)vJ zJErkPOtxVdM4yzVF7j;k4ETKZCLIW@XP)#Fnu)c=w6{0NsjW?LCgZr=_&EsmbDtPI;Vco=^tG<*km?nbr~e_m>=$T*XQRA zzfZt*uD|v2mno3E!&0ulICA;(E7X^}tijGxi3l-yh*+bmA^mMz1OAll6; z=Et;LRptE}ZZ@i;neqP2$}8fj!f)td4z_o=cJ0^`k6!n_e^?*f!@t@)`?$45IDe!{ zJ871yRiZ7u7T4W{SNJ6Rz;&OiTqzvW$dlz7<|ghPiY#aO1WEjkFS%AG(t^>9L9v~Q zS34=>EGH*_>Uh6{!dUx>yLT>lVUs$ovpcyixy##@M$lGWE4)< zJ^#^9ST`?QgswpIGyLVHfl)aA*4-<~vRWpKtT9}&q|M0_qSQKB-h9>drM99)dBzi{Dc ztVuusz8Is0_LI83US<-p#XyLa#t$%}KPTjhEjeGDt8GdLU{PipebT25h>hjTmuUIl z9(`;-w~lMHBF{acb|^{nL-|=ph$`c(A|{1rv;c)eb#ZR}=aia}E#*h}{Vyg15T3c! zie))q0y;r5j3BL3y06tfx{ANyyu@+dcSCOI)dZW`+F9rPcv^lguuJ@a_r;fydE%|% zQYYwDRJkj*=v*ZG2mRX@lzmhqO(!k;0UO`rB|HV-&hsj_to16N(!Mj!Wt}zr;T)6S zB$L@{b)1eW`cyGUhr+jaR~0Uzlv&*V($#tFsRy4@k>bW#JR1=5|1|p%aW=|XceLNa zFLo_eU~u(Hi=Ej5N=_q&H`9$&H{obAS=WB4a#GLM1p?3Iir<*8S@t>AAVtd4g8m35 zTD(G0y=$FsJ$cvmjp?;ZOMB|H=c4BZpV(k_S5VRHTf;yh;drSQ>o92fwJ9?vyX*nqWJEq0kVO9B+9>=y2i;Vcog$OmFjS#<2*Aa zueILnPRv2ZO_;HTqUYAkF7GrnMZX{I!*=G;AQM(suE9=KC+H>GrL_(H+2AIbHiPw` z3e#wksU?!gO}`W*|L#HF?$m*L#j7Whbw!89B>+lbE?X5`GsTkc`+r`LwZ@}^Rp2RWCnn>fo znU3|9>vwHmo4UpAv?YdwO`o#r_-y#GIp|u8dsnPxM^9P9uu_mJuQ~@bVHDL6PmaQ+ z*$G=r5v-Ag&N1)G8wpsk>3*-#78dD=(;vuLmu?%{rpL3R!HfZ_zxBSI)GQ79PQITL zPb@1OoLWRm>*6KcJ4EZg*U2SjHzUGKIgoD%{U)~19Ob?mo4LETNsEX_bj{6kJZGOv z*cV}B@XpiY)4JfW=dK&Pfse|h;@+1snhbfgPSeeOz5Ub!F`ajfct!<#m=wsL*fsHp!d~)-ej8k)Kc#5Qz?$#PmfGeGJUZ(JRNbJ zS_xbR_JKF5L!`{Qjnk^{$wMRbnLY~Wr8q@ta>IxwRsoIEyk;$u&}=uCmlJ*93tsDy z2uA;5rddu&0-gZc8^tIi0taM)PR4=w5*oiTMiesNJD<}{{1|`uCZ}9raF6}BkrQF( z1l*pM)Om8~2wqKpY-UsA89ZBF>NQzk!n=AU~(Trg1oft+* z0|)oiNfNo{`iJM2p5H1+{FuUe^Qu_R=g}uw-BW5q!|uTc97AXc;y)Qb zz>_d9Tg-0u?edNC7N@B#y64n$r$?*H>#&QLBn9yu_9|~u)h^DkpzA0+-fn#e+qXZ4 zucWWLRJ4;tMJVSd$iEw;m9ond5oIMU-!xy2nGfH%q!Hsad8SWDTiC>FcW&?Z!fU|# zI*V>$v6$VxF*ZX;d)?L*_S{cOqQwXjgP15-r!z}YvuV*Wzab-YID516$_~u+5)$z= zN2-1QygLx}T(CG|^`-8&YtF)bS=V(`35GV6;>V`P6ci zw9+nvp)>dHp0p@hDQEa*?C2Kx>v0JCxvWsIa7E7xqZlkwvRov^vxJeVLu+PGEB|VC zl7RV4JP{Dn;5jeMSTO3E8rl~w=HJxfz4b_0`2}ypRs(fT?H)E7y z^1kLov{A|z`0Hcuii%rDwy6NqplDW3EQ-BE*D^=l0^G)h9 zYH|?w)%6S8C3am4Yg@~NCT*l@AA>I9cvs-vkZI_G) z?@wGRqMp8fS6}u{B;~QuKkc#>MujxBMGW#V%lqw0(h=l=v8QB6tQS#2#z- zu~xio7L4y$dJB<&L_5WrnWDVEqE*id??A(I5YKDM%g~^$olwp5I5)3JW7L4k0x(&2 zOXwgZshs0(N&c`FsgBJ1sXArYJ)frlM88hODUTr5gISg%#Q{j-D^^hBy_?Y%O%|Ra zzTr^Q>2s{#sy(Fn@MwFm4?BLu*s}JvxBKkl#+=u4Yj*>=O8|L90`Lb#_L=)6)V2$% z5!OEz-d@wPwTk7Z7iHd|r#R6xR4JrQ&5%xijTOwg=b}w4d)WTm$u-Gtui%Y1mq_AA zbGb56)$)A>#hn(vuPb`KtD)KE?&b5>1bUk+h;ANl0t2J%Mz&R13AAv}$V%Aq>a?I0qgc-HIHL0PvzT68smlWr8WqKt*jOV@% z*NFznlS2&6tV^y;_};MV|5=Y@rEQ}1FUbSFUw+6D<|+`-&F_1+#le2UX68&=R7;fR zw^P7OE7wN$eob)-Vo)%W96)jwahnAxKpios5KeszXJns)S&xcCXpa7sr;RcHc&j>q zos4p4_!iQ99gEk#4H|o|^|~K%<%FSY3?7>1{+ytZ%`K1pu15ben$^^E^cj)weYTc5?Zvif4<{6_9R-nkpZ;~KKH755 z3P|aySG6_jb5ap_Z?5zoYi2h|bQ`F2^4iX?EGPLk75o zzyDUxqd-zWHy60OgI``B^;s#$*V`%j%md@ie+~$ar_6mXq^^%lJKQG%9)e@jP2r6D zd+@{MpE-mte|!iu5x(J9&EcqVyjzYWY2aK|0Y^95eIR%22q0<#Bo%FaE#u$e&E}5a zD&bbAf{he+1`efX+JD6Y0Oxr5v#Ea?5S*d#bepGU`vHtC$~=RWvcdve9-VBnPyjO9 zQb-`bwTv!@LDFXQWZDka&hzkKi-Cb*;waphv?;U=+^SGOJqVN|&7OQTiXHqZ>nhFZ zo%oeTA%9A`;E{aT{BJFgSQqfFnGsx7Us`)W3T__rSx)=d+q6B*|7JRnj+t0=@GTXW4K?#}i*<4PSjYW2B9I1MwgZ54$ z_!XNu`C_g22w{RQtcNMMn*%lcjW}+}T!FBTL_o5UZtZ$1&>9;+KBv95-CUz4Jfvb< zb$>xB(dQy$mfbL29~;}2F{feooi4#EXkhm}hPP`5w}r}QuL>(4Q09vvk) zTHb<#jXo{9egD&A+Zn>G%TBo1{KYv(ny{I-`sbNl={k}xZr&_|dN-uzqlk{tIy5?@kvC*t zY57&qRbprQ;rrwFk&l>m^_&NXjZ7hVR}FH7W-DY+y(e=Q!tE4=ux^5* zTfUU4mb;*%OL@|q~B(?9Y~Nf`Nb9~!UwJkHs+G{LmyJ88c2_XQk5#Od|fDYvs6 zpZJBqEY(vlDa+=$M}i*|Bc4SgeX`4sY*Q4b4df2IV&Wi3REy+)I3g&TijP*yZqWj> zFw~MqrC2|fKc0pP<5!*}*VHHw5d7?c(yh3IEmp2WMgMTXB%yY4EW$t3w~(wUD=NlE z6BcT*897SU3#;MUdS*IbgruesQsR|9CW zw*%)cVW_zc62I4?>@quT5Aq6*E3>~8ebGeamufNfqbPv77xL2x z`IhKAT~?t_Z=_kdQv}5*Z#s`O*EPBR3)3xD?pO(*buOe@SLs&Dc`S02A0c{fi66{V zU=d^Pou)8%9BAra|I8IU<~JmwJyWhx3Gj9$eithFeuayNBV9i+o5#GptE~LajjO*W zf7Y5VuekoK=5~wc&96|KkhxBq>$1n>X$#D3Zopq6l)pDh7R1g64G!KEHB=cGG#8H?7cTyF0Cwbypv7c$uAWLjS0;e=jrQz>cXodE_(mHlyb-CFJkfy zJ-)F|p1vYCbd~bteZJ=%;~w=+IO+-1Aw=CjrMtmNoTpm6wMRE>J#ayjBVCMF1FN0) z$j*W}?@Z%9XTl)y8j^|os@OngZJmOt`3cP!cH9%l` zDPFN`%uPu`1%+y=%b~Lg8Ij_@3THn%2tMyY?!bquz+L&^LIp!>C|`S>k+{clf0s?c#h{`i{G_% zB3eQwsy{w>d%H7h7iT=9VU>aQF&wUGPzQjmx8ku2XH&SPW%0V@cX)^SN=jNSbLs~Q zVXPa9S1*B?7U5{IX2OV6IgFcObOHXS2-OpS!7$ofC)PGs?wGTjRdaHQ7;vlGLB^g9 ze#G`*p2RF+E+kSbqbx)J@Gs#|mMiDVTs^g+%NJvpE>SUT`Qhf(KO?{lcUaA({XPp* z-x9*2FQyPv7ubF9ybpM=z3DuB5t(JrartghaYaE)%aur7UQq*giqs(IEmHX0Hnm)F z=OAA)Zrz2^7P1|We$ijEH36VcvP9&JmV_o%2U0y&T7L&I`rBvyoRW82Ny~*9iG8bZ z^gnd#&k190br1&FQ5CH96!@o(QD$!GO}`i(>N55EvT-Ly>GQ6K4eSRx%pcP$3LosL z9s(4qXk?Bcha~yd;;}CnbK7h_4z$q6J6p!>O+(HGB`>T?seUpCeK|&iwMf`Xa zhY#g!58@G}@6ak5SL>u;^ZI=5qXGL1(#WUq)4$!A`zC7cSb9%?P)#IQ`}{8cqVl{x zFNV8MH|O$cd}l2Ks9*?ivlF$-Cs@eY^vWV=f%m2*)MG|}j=u3mxZQuxM&j;s;N zxJ2_R*$!%SXLs;;sq4s(-n`}2%^fK-V*W}ssI<&ufsQ8DI3i6^y8Rk+HZI*uRHVGl zWMg$bOO}qE;M!r&RCz~DNcgY23I3k4y@3TyA=2t~^r^cY_dak-txOuA?;Pk?0ne9^G?f zyXX5nerWpn*Zix!OHH#vulIJpXn8#i8i*G`_Q=T6-eYO8Tk4ADja%mXIxLZvR8JAP9ic7kza&wtpJ)ri9U+p$G4>6nFnhcEZ&3)$784wA(p z3rCbV-rPagKi|ynmyWsZ@DQvNHLPLcELd1|)oy(7TYZhB#+BwoBOVvgBof#4bK}ns z6ubLq=iz$+yB@brU-<3VH<7A?_EXitddJOHgK+_){DGDUg(ML^NiN_z+)$}8n zwnETqH^W7okb58(Js#GNKTdEqTrmq5nD1=B-?;l>&)%JFkU6F@f%{%+cwYL&r15xo zL#Yb&8z6&CcjW%I@TH6x;Xy{u*1hJ^^1C~C(vIIWyErH-OC2DIw2|1#Hv3a#DPSqn zfcV9`$!hZsYYg0nHe4lbQjnV$f}Rh8kc;0UBbw{O9d%Ri-yGr+lPn4@FW{GGN}cu0 z$38GeJp7&oZD6^BHh{a?-@0_+DX}A849AXNGfo=_^+*x+PIx}tliDicKRsKO)3;Cz z#8*~EqS)tRoBtyf5u@NZa>A6!#JX5Y{XI0=x&PjsSQ8A^ASyjd>&_O{J%q8KPNXP9 zORSc%y(_=4tOe)S^sAGd<(Vesak7Ahd^^I#>eeS(>kHbpqQyUulIHHtONemJlI&n%gJzY%jd}rFJcja0b zT`rm1+WGYVsn#T6oNV;|YS4abHiglDw^T7}Et_+`@NACMoj}XY;~F7O!>IPPvIFt2 z?{CE9ifV>)-#Q!o%|u*16dgxvpq`|Ckw@@0L^dNTr0Y|Gs3Jy*`Hdn|)3K%?y7Jqg zCvq{|iEleU<%?KU-6IbVRjoc5Pd|O>xshq|H1wv14hLJbdX%?S7$nz_C+utE`?J*} z9fSFLf~BhTL9~lT1Rn)p;){N4>6`uxI;Kr`EX4C{uSVP_hN9CS;}dz>4PLN=2IXQ@ zFE{ ze|fdni4JSDZr~_W3-O~Np{?Oh&gM|jXN#3_%WLd3#btoA>vimJ8kvF&pT%p!)r1WA zH)Vz!9e$Xh%j64hVSl@YhQDbtyS1o1eBypO&c5(MxLGIlYZ>SJV5hYgZ+%|yJken8 zxOInb44Nt6&ELy6aa}8b=A7yM>~quKtiguPX0(?>VpXdY$)PbDU6{t`4ew*WeaHL4 zeNoH4Y41 zO2-H>o2!|~7Lm%$7={2da-0o>3r?HXc%(Fps@_}WWsydF*WrCGWvDHu%fRmNQdl?&OOp;;H@zad(pq1v ztv%gAwvXV?;}CG+fo@nE9%c%dfMUyY4y22UW4!e=2H$3qBS~$~h?&HkOa}$gSQR(h za+KVr1XHjV++74Sr(7q-S=@ktx9)STuPvS&jwF8Tc`$G1I^0Lk^v zv;r21!glSZSfWBH52$1t?pPKN8Us0=a*GGGmU_|SfkuV zcb44hx9PD5J)LBO1oR%`<+;ji7^%eKZuS+)KO#n!7eSfD|GlF-_l$6h+p5~d8yUmK znofH1Z4ea^;T>fYpYs_+f1#a+vn``1;+YT@tpml)J{`;2&!2HMOH`a@k;>I*b0D#{ z_202`t$25S<>6l*cSpOnKZSGPlOSTT`Vm3`Hkqj6VrWM0p;OM{Qp-WR4~N?OT%iCn z#%GqE-^J*CM2v=K1z#w$|LGuk^!pArnZ0JWFYxrrGLTsg6X39}T)Gvy<@%{C%Kke!MczY+{;;#pP_uh}Po`zq?E2e?rdqa#PXND#Jr8Hv2>qI<} zJlC~@vDg!@r)9bRFJH@D0I(_RY5$duzZ~X%9%lTd8|OA~4;E$N6|1kcd`aiIKaPI% z96kYL0x?`$s%&E%IVpF$Jr&fpv)+QIIIk5(${+Rhdk!`>)AMgxbrg22v$C@#D>%37 zeyswv81A%vQx-q>Hs#V|v|-cJnEf7$yiCkSwC}v$an_ZmG9L5Y0<1pdP8A4ce`mh| zzD>JqrLr>dYqiI49L};HsLROs`=<}Rpl(8f&9NY`8CFlnrS-Co^WZFWoZZFIab6w+ z*lwpCS?#UsP+AmQ^35t^IKb7I6hJ7+HY}BfxeBlzdb&}3*RtW>ezzA|xZ#3GiPKJ< zW&hF)o=^6%_l9Ph|k()^saX<=1WjM9Xa7r9g8#%I8mmCzRs__P_gt^P=^qduoK z{)cbh&uV)S1mm0)mXb;WOb$V=TdR?h#KLCR+WB_iro2dn+0F42e;Hi<-2BcxpQ&h- zrEBCDk=OsFt6U!hyd@`%;%|8T+ypT!9(njA00o~2tRQH6>!%(LQ$g9#%C&txti1R%;4=YsbZ zXRP?Hgz}VJB@_#59eb9@GBkVgXM6s9>Ni5t1ajaUTm**KYeKmXZ$UO9Xlruzrpc>V zLCyolk>=ouEGsANzVZ9#T_0*t4a@WS{`2b<7Bsv39HVS>mrAop_gJhOOj_PAfI;3( z2E(Byz}>Vf`lU8`moTxoxTFn(Nyl5|CPqG!=s`rE-Q37970iaciRQI6Cb7W@h$qs+*2QP*a4>Q;(4w?FOQv5-IhR zQH>$;rk$s+1gz4idBBQ&ZpiDF-8^_|TF5=SvQoA>y~k;iHBH0Cl`H<`Xk1%0LoQc~ zrM70It>-(T!$r6^*Wr&wix$JfzI!>SYUpq!>CoAOi#?HbS#T?(6n-mRg+8B|NbU?X zJlQn{o8G0hS?pKpwRok`=OuRUpqeMKZElW)AKwm1DJS)}&aueEcnH{eOc*rPkNA~xtru1%E{ zQC5=;iFm)cs;N5uV+~Qsr=#l@*2$+t*9Lr1|}B#l9Ir> z3YSO?TqjwkCOSG_Nxk7RL)$}hDdSc?YFKtUkAt8Xw=r(`8x4a(RWhp8h?f~>EF}}Y zD&JtNAQh`_xZVTdXJTntu`KfIt68*n(V1(#$xhQXAWA@xDtQ@%=yY@2t$o)T!-`?H zwqHEG($U67u5FuUvV_O{);m-Bn>rEJ@aAQk58!oXm9la>@OfMD6GDQShdqWx=>lr& z@dxw9C}b;YV7hp7xxJ=D>1`sth;ecOupE`eQx+4tDP!q7k+plZnQLpY(h|L~eC(B0 zhZw5?3j|h4htn!PkEc7a=r-(TTV9^wo|6d*Z~2}(AU^*J$WRpS3E!-hirH*Om{$Cj zn-f86v#lyW1YK-5%8BZk4&)cd*tNMdLjxMq2Sm4ZXJld4TQAiIffyH+ED;5$uuMf7ws6OGbAKLT>GIcDyLzc zXK7ctX*V=+lXM-o#%R$>CObpJw`K@F!rT8P%W}H zmmRQkt@12NMh7%%5C?~m(W|3QvQUGfXZsq6{B~~G#cfr{4N{;|%ye;yYx@i%G^e&O zs>IM%#Kb)9mc7nlzh}%8PEu$lZ^i=OK7E)}4e8;};7&E%tkyeh(=ax1(8^gZkE=|M zbU=?stZtoE>;^(llXzPv^{dq3nOSWYr{k=$8 zx%gPz(0c1j_58CK{UyzlHE}sDlME@dZSj0x2u1SL%_jvT(R`V`JNjvgsLShWI&-~5 zBZp;tfB&7giCYVfW~v)IefdMno0BfB1cI(E)Axu`LME{`mv4G>0k5Z1(V#?p(EkB1X<_bSqmLwe3y^O!->7Bbg1zlL+DwOF=J!eY4S(YU#pSf{2R7s-rYK(~hU#Z-4Cji@c=lSnZmU?~_{UDme z?#`d{8+m_dse>9aX_MrW6%~<3cEQRr)M9XX4lbXv%`K|Q>%QXI3!tLBY|q3K6^KSG zP9W1^VbiqF_3c23i^e>p2b-5$l8_&0B6#)fK#GaMQU`pYS2us52y@WBXC^s16Nef? zmCSoW&qosNJ%n>5M{-2vLCYI8$Luu?ep#1|&zuP?9yW5SS$ECFOm{=Lf>F!u?-^O0 z&2YO?${J1!I9ft?%va_jx?GxO5$Wer+@nc&f*auQjYL&LB4IWVpV2Nel6!=<=FCb< zxi8#-Q?XnZOsep&l-;zz*3~1fL~7d1cc`M$c&!&UM+QKE#(hK00PXqX85b?H)&^NO z!7$$p!$;%rxz{nr4l+2l&M^{dlHjEFK79q1UD9E$I*;iVoEC`T5D3iL@<@u~wl^FdLSnqCNBLYDB>(P${{H^PnIsyY`@o8bpAW zHkX@~Wk?_sgUmHCR%|5viq{s}Q}? zG4O_K6EdS?AhFfc0-BaLgGp=_sj-vt+E5MZ6Ovu?2mNM$8!1uohdcGp9?SAXOH1uw z_pxlUY)NLW1JAmK77tyhq^}F*$!Me^{ASN|iSw9v(pry|pdDpVo+Vq_L0f)fH&qfh z@2idN>FQKWq3HT3bjESy?i7H9#wOLk`l^L?Qa&(uYnz(nKn@KE*g7XOrG7*{v4K{N zjvif=kDrOqtw^4M_(CUUf~#{2F@R^bz=mW5(b~n&?*?E`tfptkV^%u2al&14(yYJ> z!gH_})D@dqC2Uc-qfA9B_3N@hZpsm364S%q=W04R(LN~q*1?#Pu8AjSG;`(^$81qqjAC$@%OzE{=624N21p5nH&aR1riw^JMRSmMxd4x2H6p zgBnPMX9$Mzy&YbvnAqu;Eh=N&BE)L0rst&MT~j4V4JF|_hO3$FmPZ|xxtc}AhT;Sc zCZ*kS>r`Y!rAj0Rg{BNXLIH)fqxOnBevBlq$h3wDYJ;M{pg5_&$(PU=8ewHy}a)ux|t9+-@I zw{X#TeySo|VQ-T(G%GQrIH1=7$Lm6Vipx*P*GKK%>$SbmOv*9?3sQ6WI}A~@(5eDthme%_Ib zi|aReDk_Qof4R`xGs(-#OS?^}9zkaBYX3HpcB+iW#-3RvG!p;}fWLfSPeFG@Wo5z8 z*3-P@LCk_92?)`gS3A!l=ZW!O8Ly|#r^wcd#=}>ID3$y31(XBY#ch~qDND(&GJZrk zSMuwy%hWEA!R0XeaMxlCMolJD2alJ{ zA7$-{FMuB`sKt0!qf}VDrm}`GrKJ`JH3bDinYwfG8wI}8e3BzT$qH&ENF>sHOV8fS z-2=+O9%SZfOfx;$`O~?dD6BN2r zo;DQ6omNGG4O&GSE52;n{4d55kC1s?_4@x!!m)G=Dogc(RuAKSW4Q{QpgY&;yW1rR zZ{S~{_%8dx zqV9k0;KTIUqMc)@OG_YlJYREBMW>6u{r?5xgNmxIVXE+-wK@x6j2>ANqe~*_Y|Ot8 zV=~dikE)}boGSF4Nvi8j;@ih$QbQ;Q4yj4)clI!j?~ODIbE2}soz4R7F#ht!-vsN{ z1IS=yYk2}(3YB#a;~wX&E9h!!$ojUcS+p{aY+>m9H{}8RkT&@juJsviQB`NRiKvT2 zs@c4goOS~@eNrn*y4;n{z%r`=E>Br<1E1vW0tkf?FlqK#>xnJ|QZ}ZuzJ?rEskb!O z*3nAz+g`u-qN?lH)gM0o_OI%Y$xouy7x%m3sX7_qa3jVbaHF*T{dZdnv% zbBYoSn6J8IO{(QejyNT2vo>Qn;nda&b7~dad`3MHfKft)G5y0oBzDO@Y;ngxgL4Ps zX83KPzETI((;8OHAFX#QE`PS2=)bQVbdt~qaX{A8M>9!RFZBaxS3<#eXE<^1v!>m_ z95SZ+(?WsIp-;XnP&swgU%pZU|BoJGao!2UtRg$8blyQFx*#vgvN=;FVaACEfcy~= zmS;i>YUnew8vsCL~-acdoRo z5q4%elRvLGs~a#ZFvF?IbUmIgU)skVq4Wjq9*LyM=4QRrT$?XO-{%+KYu0uqTlj6n z>sJV>Xtf$fJW};}A7w3_mxn~}%os;<&`68ym?V^v+H%?b%8QK+)j>!!84%xOWRlkI z?Dgasnv@X7`|GBkLo>T&(&pEjA(jerJR`d%`Ndmy&dzL&ZF?RV!HnH~r#@1jxD+bi zDIGUzhDMBtCYCp5~di1oD<9e4t-)BmcbaTxH^ZR3oCB197*7h(> z{ERzEaCcxhxi`yuexrw@#n(fSFK>u2)Z-h>3{ICwoL3_BpauGDlq3|9B(s+N7RTPw zUXuzs$8!B!wh%|-@_UDQAdSQZ7Q-_n*l07j%P4&1=o{G|rUb z-d+)X_Kd5MT@N867DLQFGf?3N+celE7^?!<2_==%a!*B1zB+C?KG&`_K2Qw6R0Lhs zwmsITy1AJKV0EXqa2y?hK#1FQlh0MlmmAcz_qNC`U-!4uOGRM2oqAHtjao4iP}7Bv za>K^sR$naO*>qBYY4WJ6vCK?~5!srEi*pw#1|Mt`qUu8&$qEDj(NwIwp)?p)23 z^&H@~4BoN+k>~5U<>D1(h)?T@bc6zwf9#r%AdcIjwPUuhJLa=NGcerT>12b}TO}z4 zM?cBdX8w*|aJw9+bi+7jSdzMh;h>ONe>YvC zo7LIrw==j*@-m~gPQqH#eqPB@5w{n7oYMhv?2pINyK;fXk_>M*2?(B~YWO~(d{W5H ztpvK9tIp4Y+a|lov@-LQV7S`AQ!AZ;#qPe+jT{dDDMpRSZwtOfKATl*bt`ytQLSr< z5@!-SNH9$>fmwgCgAjV-ExVkgMLamnWMyKqO5$WB$2wGfc7xK|CMH&^ZX4j2YJdrG zU0Oss+HnEmm0565;M23DG(ixTl12^$qR3Zc8|OR2ba0&IP|AOfWP@4Nj`#`|^M4v) z)Lk;t2=+;K>Ef8;VvkJl@^tf1TH9!KPnc$e zoqY)pXtxdsyUydXuBhN_vu)pRkY&4PuIKLOcJ?u`vgK^}y z@QJ)q!I>k9G=y7XIwxDg#a*`U#P@|$RKo-Fj%&LMidqoJ8dg*UAmdj2^FF8Gw`$=M zk&2X-Ay*j1S6-3wTwX`fPf_6p6V>?4ryd$FVk#z1J#wZi&EGnG=w)Qwvfr|0drEl{ z-p^I9#Ci3w`x)PIjgKI3Tcw-AI%4RM*>A~IJ~vlUOQjhP;Mno{tr;Z!dM}86y;~2t z_U*Di{atqNJyPh-5=>|Y$e$UPohG5<^`*?}7h>uEn+sLXSwFzZK@AQ+1a#Y=qeplSXXa)y7QN!rx%^78!!_(4IzNqGQuMTfhd{<+Dx z%%2^&?w*yatDwc%gm)9M*MK0aE%YLmQ~x4Jp*8+*YR{{qO;(~n00v)G#*3t&w!`OlYp8#_CpJ3vfF zwC)@jY_Ax88^)M7dJ0k+y$~*z4So#YBVl}hT!wGeq`=ZGG_Dtp+CwTX&I6l)4Gvc$ z4c7}JF}5zG*z#12?7{nURJ1RK4rD4YY69z@`a_CJUscfhd zfMXLZfETr8oACggotLiJ$OD`CEt)UXZh&e%Fcc8*e_pb?_UPk0_%xrzBMVUFlDX;f z(>(Y?$ZEPi_;vY^{f2TPRK5FLvcGG z?Xv*C>2?Qx=u`n`xB<9WdgRp6PD(!=R>HS@U>h(p5=_~-{%mW8C{%4Xk7Za!yi#5z zfrU)BWS3f(s~F+Sz!@FR4eIz?E)n`!j6s)Mrelr(=n)X*M)k)5K(rVjHE7ui*r}e` z<>t056da1-a4n*EBln8{AEFA}FiO9c2rvH=5%P^4rav`~WR08)}jsG%by zp|=1bge31_nlSfW?{mL*t@mB)`_`A`(xsCBIsbF^-e>RM{_TBgVsKHQe$>8qd_3|$ zkPobXo~JYQ2ZzPsIK0t`xV|wH4$BatMAqn{CzQ2tw<;j{2;@3!C(XI z$A`w%3d$Xn6V#0M}+zc?9@NFfB!OQcH5ExuC9S}c6Av7 zEgT63wzb5nlu_!yGj-X#-0_3f>KJEI`Ynszyz0=Cp)7ztru(=Na1=yOKH-0;{iSF` za=q3sdigl!cICaE7N$B^GUk+U7i5Q*dkMMov(zU{@~m86%+xnZM9l(a}mxOHql)!kfh&ICJ_ zRk?ubuo8%KiwM2cObO_sOl*zUT=MX+PJB4*olEcILASyXnS)+gTo6_cn z@9c&vin@eqcbpq6SFHLak1seUzfVKp(ob;Z!g0aZCvC8MJ6uKwd<(%eJjQ+G2da?6 z=<&QQi3s@GR(5mSU!i(oB=z90isIwkf2zw~SqTVZ$!1)CG$R6>cEL_(C$la}Kp3w~ zhHhmjTXH`vS4-yP1~e!#bQ}HUQgU&xkdAfZ4cCIx!bw_Jv)5gU(01Rt-4DAo-t1B` zG3F$g(wkwFPxXsBWR&lgZ-%lL?UNC~Moeg!vIe=Magnh^|^}v zKPT^n4bH{86Q_(aR>u;?d1X9^(rissbmIS+IA4oScM2xNPU&B}^(%SNDk58UA!M@HuoJr^G{M@;>Mueo8 zRf~5bX_GB`iuBdRmTU*^#t?l{rF^yp)DI+CY_%kqjR(Bik`qQqhf|UGsfp*7$A1ZP zW^?oU`3VK2foxY**l9)Aoi)!e8JChk73lQbt#-yqD04xrCVLo?Ef6oTVecj<)>fFE zqm}qPFW<&dx`4gFJg21Gq@2`^TH0NB66j-k&g>##_T|kCCr~}f*|rM~YyO`QE$&5A zzL7j=BHrQ$tT7Fl{ebbH9)4v8Ef4LE<0KFIZM5GQam?s^$n-oe4zsY(AUEltFBZ=l zVh<+3jV_;n`z(Zdq9U2gl{jzQbbqN-q4Hh%S?p66!7Hj#^M*r1RvYaC?XbC>m1Ncl z8(Uk$7e~mwc3o6)2xnf3J_+HJbo(W9U+&HGBN97WhLPN9fn5E>z49V%RILPanxFeg z%|*d|?XCW38ivzRmrM_&+Xp{iW=mKM5&}$v(>cM+woj@UnK2Qu9AIjlb1^ zlA6VW1fF80ON?&S{hjQ1wC*ff>vXQ|toT=>T78}Affp)gP6f`qhE-a59Km0I?0vkz z{H@~mx7_aAJ^t$yXX@o!f#%njD=#sbJ^I-+GL6DoQrMn8$#^+gv@y5BQ7Mm93RkP6 ze1GcQk0~}<`AZ2Wi&_xk&rq@!nOIG{4KCt4$=&XGvqVEg*G+@bE=rob)JYLpXc;b< zKzfCdx6eeyo)(-FH8xKpEu?tJF=i9+IvSQD1UrF?(@&W{BM?rGWL6dv@8Hx)N55)r z>GpNZCG~tAgbGYuP*(eh%oCqiEJ8f^E>+PFH#IVns^;pw)}}mqGFAC%<&_*^0n@pM z%U4kMsj8_g<-wn{b9|JMy$#7$DWt2mgvvaIKt>k0seNDLfBV?qzG>whskE4O&b-)5 z--7<`jA9-6UEvAClLiv`DFwskJ#Fu$UzoJH{+QSmnrJAI^8Chy1;y}wOPLhcC4Uhg zNJOX0GwSnKQqsZRL=Mz&etA4AH&HP&8QUpLm_dtH8TXe^x)c7TA7TbOUf$=LG&y4ucWG0Etbh4>o~rd41FcX64$Rz zSTyZ?y(J*hXkKDpwbB#JS3=ohd1~Gt^jZJxZCrghmqZ4%F12io7YNSSt;e( z-`OobX`Ofj_9DpOMcWzWgv!dUZ|!n)3@g)B0;$i728*^n#ViUDSHJUKHViSdR%^B; zaJNRe;@qf?!5-E-oc4xu;+cTS4dSe*BG=fF^%6o*ZseMPtb&LUV>L=rG^%JPMY%1m zE+*ntk&(qxDn+L3xi9#z{Pf6Bd}LIaN%VArjYzSkdrXKtmvQL?ujp@?|2N9sKvf|yII zg7;105%k@VfV}`IZBhEYE@e?sMVdZbZmZnK!_<7JO4|oC0gpSQfFEdDGyXdYl|1r!>Tl@bIRcAs#x|FYwa9ZL`NUnV!X0s2%#< z_KnLK=i@JYz_hJWQcxa1wUzLkDS$F<|}GvJ+F;-U5{i?2@#4EC@w=( zZs*=P#fZAiBjiRmz2ia+BzyJjjfrs$dymfd{E83@>b-g;p+S)k?YXh@A``DG%q?D& zxP}&Iw|>eD3{jOjVeRe%^{ZVPNfmyEpZAn5*!a}CxgumZy)+Je z0;QIkj-+?u~W>Sc4!HaGS8#L{@AioB4abR0irZY6i~u7dGIKPh{+msS;m zfFAb=l2(y3@#;fS&ikG`NCf1uw>x3&*3lO>+SG@8=9B5vT7vgIm^(K*x}YTl zdMfUf+mCmU(cw`FEt__B^bb!B%#m7tEK`pE>d;0Sx+P_-_7a3O9Zyl`lDXM~nMP8N zvn{Upd>ABv_a4h`O?ZCBE|oSdRp$;{#Eu1dj5bMyX9lA}xGUa}tC^MkMU|-J6rly8 zuZ1yfCVV55NZ8!=CRj@yx9J~D;j?QbHKP35$(dEulID`h@uWzn;p~atg8Jg*v+=7M z78f;&;6B0H*RpdO>nPUzuO#^7ZE#^XgUgojsREM|W%X~gM!QF=V2pgYc&rW91rdBD zV(ceRK>RK$75*MOJ=d@*{n(JoQ8&37ty{} zUY^HZ^Unk%>AQ=4(kY&>AqUlgxFbCNj#%vsi=sW9qZKi$5l|T^Q)9|g(d@KuU+!tC z+CTS;^il%1zVtEY^t|YOkY&zatQS#fg#jD0mSC_n)@q32_t+`Gdc3uQr5(wDaK{mn z+zmyi?ife}S7LO_XYoU7@5zQ!%bsm`CpnJXe|% zFZAS)(`RoH{hZybp`?^p`Mdy^C*k9jtIsGT%!RK-T{)0|=lMF3Ago8_Nj2r~O zei(_4iBSeGo{*4mlAj;y?|(JLkdoLjX#{S-v9+^H5|@{k2V^Vo%cjx zSWq?>M%8eZe0I<}`by{LLwbftf6u!|ZwGUO*cnuZS)C5@tT&t5lxbJV}ynK92KyFF+>^7?lDw;;6(oK@7N@Gf5@I4*+xz2yB94~aBfO_v#~Xs+ z944()I9A5|09TRcvBnSgAx}C~0^&oe0`Bfvb7VYFxgPI3yKUW2$Rw3+w9C zORdp_G~A{{lCJM}hkt@MC?o{hnJ7W7ax(&3Tq+!6Q+P=5V0S9-8To*j9|4^8RP{zUi1Xn(Em;(v1M zP6e+l0iF*~*?65(%fK?orUup(L!yeY{na=~I>>MsZh5z(b+w3(OJVt6jizC_I6 z7%#6yiKUXZb~dm8^u;7sAbd8>VL{;G6GM-%TZgvW-)LvENFBV6Q_o;|ON#pB-XqXI zEV5G#37!0g7Kj1``HDGgn{@menaB$dH)|JLpT>rp; zTUeOp*4EZQ+);x=0$2a6rnZ*4-&u~{-Llt>Wp9td0PN|h_r3Tb1%B-_T1zqG%$k9g zdmB;%abF&O3=j3&u?(6sQRyBwMY5B2>2-LF%v5Bl_DFF=`N$=+Iw z1$MCl&V0+8s6L@@nv>b3!|3T=u9E^+We2u*6w&qqycYN5?!7*F%GAxFR3h+eTo)F-NF*iV2AR^{u1x>0iO`waruFu{u}FsHO2c9~ zNWj`ThWkt$?M~^M{J>~If-*93F|j^D!3;x}nI;vr!7-KYpGs8oG4nI z@8BAxyGfau(o(Do=@yW?NuunBntr$pV^c{wbzru?WWK+D?0mO{g({p$DUrK(RWYS2 z5WEm!9!QR71$jdQ-J%=W3JaB0MC$6~3^^eQo7I$z?vU{y_qLyJnSeCS$QYbvndlm! zohFCWbw~qcaXs6h^Is3!%Quta#l~E>PDQLeozK=(&4>|s(>!k^stS~Hf;zTfnw#AP z=&KYCi{{pu2nX)k*yD&ep10vbqGmWIzOSUzNO$|1FgVcaQ}L@i|euEp|o z9v)gscala>*QCW%*bX72FyPbAmbyEwaGUB6Ef()nb_VMt>DCCZ`@pDa0fKSP^~f;Iwg)CuB2m@O z@u#UCT0i#PQ%YvGZjPl)Uk0Q_vh9H!(g8OUmkDrmsQ||K2_@CLSvT%$){U#B)Jrg^^I$U$9;R>QwBP|UMP}AoN8iR4+2{6@SoGP{mTe~*TvyM651jgaqTtUaOr==7 z`@n*{hVAkto*tRg2M$o@)Nus2X>W?xVj%7d|M$Q>FBQH&n11M3zuIx=@0cav_h;*Z zbctD0fH-&iC2M00A=q{A1(ud~mYHJa*R>GyLcp8R?6-^;KyXW$^wl`mA3vt^jt+rT ztV34(SY+^1>ustiJKu##L9qRCT#DlCBA4=W#t*VAXE#J~FMB=1X+rzX%% z_tx(-Jv*=!#s@6WW1&vQDGHt2?E?3GV57_4v4DSCC%RE`C=u&*x>*R;_&Pl+Hgb{9 zoa8VfnVhHm(C*Vtgwu9|R2)Ezhq(>PlNYicHPt!xq=~X_I5O9wz1adzJu^th+~@gR z@s^sIJC0fG(j!xH|ML~Iu34?)P8q>*YtQ#qX2zKh*%?8i%!fuB@tkj>R=f2!yvzbo zx;L4-Y5cUB?a9uTuxeT8v9M~2n5fJwi@S!TFt{`CnR95B9Gy?M7PM;JN6{(f`iU`y z@T)hOF^wDt&Wx-BvxdbPNju?>Pd2O>h`Z`_cnRA5L1pUgfYBH$s@RtDka|&b9q zc1fj2tqlz))JxH3k&+wvm0jVInGFr!Nbp#rfPAXs9%%wI;jnyVDCeN(V)=~;eqiZt z&-hm7uvd!UvsmS*O}3%=6)NEd;f$JZqy7E-#L6M506TWiJADZ>d+tXA5f>M@e46Yl z`-iTsGWQhG8cC<5K|>&hIFsIJO$&ka zs?7ZBS<_&hvepXuwG-3dMbeS!iQ8)vu(-#$rTb_SMMD7V7{O&(Fn2m4&k9b3ZAgFS z>+<}fuEwU06ha8PrxtPd!)oNZ5tE(cgl9+{2P#X5*mjCgC>0G0|4NUoS4(x$>CIM* zf;;Ua9k=qX@z+AKC)rE85!F%c>%Lwey7bg31a7^S7Gm{Q`|()#PxO!tMG=RLMn%mn zMhhgRuPBMq9mywH92WprDl#>JlB-6tqPk+tY!7VD`vq&=6sWaheTBatG|D9$8a1P{ z-OLj6!Yn(XBN?$1nfm7fsp`3*jG3J4*HZW+E&;A}X(Xibiyg0n9xAZHTs9q45Euh1 z%u>60HG>xb2;nOLi@5SuzQVF0$Pju^sP7!Lu;}DRTz44%FSJCFat^ZTS`MfoAjNoj zB_&A}ZPanM_rPhe)N!Of<*>0863OlQ`IdQ!G3|(Gaf#z=xPeJxW~S?eTXaZ&zqly3 z9)0l$Oz#&!qY&e5<8w}~_!EsLw>E!ZC+^;{NK#ShcU}L~ts?Jk)Gem5vnMv71>srM zKj>(=lRvf5-`H*P)PIxmtICf_d|o>q;Ab5+N5T-@lr*Q@t|R>En_u`#bWuRFVbvVB zZcmK!HzqYR_SP#04+8)m9K@-wcAryJBOjUa{LQ-j|3m!;3wY3c^;EUJq)|YDv|mGq zyn85jw>rd|kk|EWu_NA>_-1>%Y*Z_-R|HL+YTpj@)=svb91`5cc;VlaO=|g@Y-|jv zX5(`4HhtuT?d|Pq^dxd44{tM2qZ66Jm}u0ba>9!(-{3nSy4*tKO2VPYqUS}Sx%5lP zU04}n@B6K%9bJMZO2Z*4@0CT*Bd+POlBg6Pn;jhCjOxScylZ$o-s6g;*0`1qGz}M1oXb4qNz`S|bQEoD zbX&lup1=zu#tcCRnZchFDK1Y9^hU`kH|Mo9GgB$3SE=!+y@dvq9Iue3P!&Z}758sT zn31_ZXn2KfyW*J?!#ELXXp=9#aS5iJo;9SQeLcA{nqpH|m<&S)XV$ry>8V=e&`pWt zw$(iB0pF$&xiP(RKozda+Ezt)Toz-q{meGb>t=4~-%PDwvutdy6rt@kTDIOrP`cjcZ3d!=nH7Y<>W~7AmrJm=R&pKf*(QK8b-aT4B<6_|K@RXGY~?FqxC&qs zdH7AHKSet#SR=w3G%?HMyv;3dV{541h?XYC9cGp*+~9w~K<0=>wTsJO*@C`a$D3|H zv_;V4BWvgC|hT+U07q-DWkHjRHM35 zM|hk_eW#p^aT%bX>B>l(B(tb0EyU)CR`W45g$TR^TIVEFlpew%bda!~CWDNNcq|4N zQdr<;2W<$xh<}?WOs=Pnc~$C;@}J7qF-2_qIVQ!jOvUq^@a;gR>ih_Kh8qj5u^y|# zsW=#~&`4I0a29NCV46;h>}Y=~h?~+L#c-CqaGv9}ORMMtCI2gh?rBQzVQPG&ji&jwVzD%};<9J{gK#LBi-$#K-SVDFPXyfe2IDK zqLwNJlePkL-PG0_c7th#CDjr-#4TvVUA+Z!0|flav%wl0+YtBFcXQ6sFLP`r$5W}% z>nBBqGjig6j4T#8Wq!CFdwCmre}$z;q&TmTD3Md%ZK3b*;)LSFN_OSNajeG89Iw7{ zjC7kJ;?&AWPKTPc`B;mNaGSVb7e`(Q6JDQeV#g>bzn+boPy|Gllrt>>!CC8^rI98H zUddEwU!0GJtQ84StZrA!2UW@OL;CLAsV(D19J3p8?@Jo@=qjCu417{ zp^NN0fu>hhut=Ng=cq?QoP0;0?=f>Hd;GY)x1uH~48xl&}7)1#j!-6q?ml8_*V zB&N1fY+A5VSuavfij1Y?=Gd7(WE$4i)D$ePJ9w;&r|ThQDV;^?ZXS6GZ4b<`_GKq2 zYczFe=#OGvbsV;eoVSrhVk?G54u0S^=(lWO5gkxmB;_=$^!n+uhU)TFQ!}H>@Abm^ zFn)HpkHJ^8G+#pFnV!+Ng)jl{N2*l?l*7u@wL<*538`o|>!Fk;_4d9=%rzl?$(*cO zD9r9!N*)wb2Q?BA4Eu_>S=PlIm+T^M&H0a5p@}n~lHHnBwR(b8wM@q|M{+CVdi+mC zMH!unLz{*W2dmG>2nx#4=0a~?n4p#Bh@;Gx&w59?SR8QhdD10JjErnl9$oJ^mUI`j zp3K@!sx6lukT-UN8%b_&QQ86vR3?xC+*_GLbvfJ{kq&wxVVV=VR(3PH7d1#p0SJl3 ztd{~gB?@iN_&lzNmw4&-y$kUU%T^z(mei_68__fJi~6+_@|>3OIGoA+oNfAget4gq zg8Npku#NQ_BT{OuRQtv!sqm`R4~2ncHtAiJ%^IOUUh~Rb>1?RQXc)RGG^8H{9F*bgU1Ke#M? zrtf3*+MZV^`CZ4Lg%JR{FYy@M`o{8S{avYAs%-dR!F*zeZ58MFN}#-PqIs%ma$g-q z{{@m|TZ`0zmz1Zs;`B(?B8Hko-FcAkvLn8!i|-rB$rEeIY^Jmpl+LhQ)E#vaC!R`? zs^(?Ml@-jTwp4SOIFwiS%F?1!%1SN$zJ-0IyqT{8#aOja9-mK%2ncap^Ccr>6C8bT4=~KIWDVIQ64m% zf`P`JyXS-W_@oQ3`S>W;`RcpeG=~qt)C=-1XA~RT+f=u@%mXhTsz*Os`m)=)!1BBS zg1dHfsCTeZMHz}wQBf_pdM#DC$j4x4;akCx=4*=~OT^y1Qg}ro@R>p4V;(dm+q}Ds z5W9BJFLWNPc4d-o#5L_aa1_31h$UsKqA-(lehR4mk68imEAQJl*~Na{)KnNN7P>R{ zWN9Mg3gt<{tGH%%8=ItRXyqhlUtO5q{%Q2v??F=Kl`tWHIYyCO_fb1x9X8r8V1ekY zgw|e>5iA#POZ{||@>pD2?JNlPWM(=g_&KU3dk^JKW3?D#8M7S%kg#VNFVY-m259ny z_oua%BG%!@p&aY_9aO`IosSrD^WxWWxa;W&z0b45>&{r&+f=O^N}QH13|(&l;&yka-~;R4vii1+UP~?u|B|5c$-bN-)318!wEnjLthVGB`VSHFiC~OiedToX@L{ zRw9*J6m;Jq5f>QZ-8rmksAh%T(a#suu=`#=@xcMk!YXY@y>Mkr%_YT1$>bF=TkgAG z84m%E(D_RC2FLNzxJ3rHLpfOWrpfUw15@`UJp)gLs5Nw!$ElJ{3SCIl2lU#e6-#Rl_^kwcAZ--61}$j01@q8 zael75H{ph@;Y-je;t<&(M9qRuO6`wNg#|iOpUBKZ)aV~fJiNSmetxMJ;7xt}ualJF z%G1)-DFj`qwlfPSGR_NiAI;)RR`&lUe|C8>V$q=j{nL&Z^P|rso*TY2>n0M}lHtqq zRL?@hr>Bc=v9Gsj%^U8f@)S)Nn~TJ$+ol$k`+wCD$LH`m@2k<|aNAn@1kHhJ^m7GmsA;JbB+W4e!_e2h_(!CFjXa4@e!`I`(&k4=*%U=4> zo1~AV)WVSTf;;DR0c8G?{Ba=h0Sdw!BK+Zbd&>NZw(>|`1?;9;@*tGa9xFKhlUjGy zO9RTl$*nYtx&S+HwzLs~=54F5@q)f17K{-&c`Kz*SEn$RqPF$u`>d)@A6&>-)a8^I z>q4xr3Y#|s6;dqWRac>H7g%Cck}v-(mrZ7SOONNo3W{o^Mr!dx#SLcMD(GGiZb`)6 z6D^E?Cuz*0e(uXvW+RhV_S9@hE^~Pg=@+5oh3HQlv5+#asCIwfKw|X-9(m|(;xg^u zrPl?oK_x$MyA;{11#=ZQpkrevXyGo?UEa3gm*O{rp?3FSgVn085p(+6TiR(2XU%4( z2W9`J_WJ24KeWlx&Ha0?9VV3^q|k#FlOb1=~6!Mu?`p`Jx- z-Lp$gQ`n7;tV|}<-iYI?c7u1n8YpeRu-kITHS8qjYWs1Id)3;djYwk#PA_0qm}rqk ziteDVJZqBBzC4Y^ z+>xZ{@n&*eNI2kJNNmM=_%8NDtI|wu3>g(tNjZ&GUfp6DS5yj7u$#3NqQv}gXtwY4 zo2AeOg=U@R`SIYZ;E5`=L51OFA%oS;>})xEdT8*;<(`V1#f_Ko5_~TWZ7T2UsYM3C zPB~IFxvLZ9%-fOSYV2;V7_y%B$*ataMdP?}I*C!zW};!5Eo@$h>4E^NIx76Q^=l7; zmu=2+JijYzWo3`_r1H!KTM~0^P#b$6s+Oxb(KN}p?O?0E+L>GEKyF4r)e!epJRWv# zR7lY`3kh;fKRUPd3mn5B7_HgobM%k%*;v{pbT9&GpG1!kiUEr-w<7qj)aZTuf@EX? z&~vy=)h&xN^#QtiJX6iF@lum})cO7a2~k%1DS-Ui8!0wj%>d~FQ-EAGt~6i~`2sxt zE*gw1JvN|XH2?2WF+SZMMCMlL1q4#81N>q1AdUBHoFL{bE_DeW9Bw#7ISB=29629! z7!jA~v=$a|7WBvSVy?xkB8baBWH$XuIsY}ZtB-RuVGiFR4JWpH>OB$qmy^^14CR2z zJ3F3J+}0YyW+Y?kSa(R|3=jmIvFM!2n^@Ac`moVqU05=*UO%0aRe=2kkg3N?9RhWD z{9{!LEAOkY!s?1bT;)zn7u^5O&dPT@3GZ;CRQQzdm4gEPD^BthTOdCklWWFM)v&U# z@)=FJJ2ZRGzr?(xcI5Bwv5g1&PrSY8au_D~BXa&CNtdVM)*+~tbSJ0%fI^GJ+Q`Ms!3PqRbNuP$-GE2kQ;g#aFridAUUSXk-rVJP*0oZJy;hUSA1%UQaS}H4RRiPa zSAVd4Qy%+oipa;iqLlb2}FXN?|)|)8N4< zG#Wj!PAvdAG8%2ZZ@@HweRxs;HZ=s2K0RIHsrLo-UxR~#`&0;`Hr?3P*0$<5W<-i1 zYNVH%+}hd+5f`vz>p`}gmeq%>SIkg#89 zB<2HmWjbeP13}hUi7V-M>u}D@8{{%68?MnYMQ?Ogh|;*_L7GP=+{ z*BGU=pB))DnSg%YjK^47oR((*;LKq`J`=2>FV8;LAgy~K?wZt@mrz}G8nJ~5ft)>* z)KgU(EU2uk9l7>c=oX+nz=%44AO+mqd&}4F4v>`4z+BSl|dx-6_w`9?jGJ0HErz_5U;#{4^oF;j`08vNUFS@)$)1R zyQwKx;2wZn>_A+=_+f!)1TQfbWNoripIzN2Mp41&UxUn&tSVsh*tlagXc_ z=Md%Kh7)7tx557?BBu*R)jSuhlKk4$+<46PzkV9O^o^%W>)-DsO60I&esXy`tW+5o zS2pC;?gE*l4=|Y8L=7V2q7l)~3GlZ^`aoT~o!w=5`DdPKUp9FVb9Jz*IM&7ovG{_b zA}Pq;G=Hgi2iU*>q7Fmcz_)R^R?e=rOeU!R&4WkY6W$N6vuI`qd&H%?qRcO&%p+^M zAA9(LZbk5&>6l;i@k4^x{OT&&P#92M_K8{h7H4yNoBF1-q6;vW04u1}+)RFPuDCS# zZ%K#RDNB;yeyw!%jsXmI8IK>RI93?X;RHmjJrxFMGw;S2jGMf>y9-zVLI#O9@?PJ# z?>(?@Q2vHSffvvUS?SSXj3og=mU!n~YloCk-$wbD0*bk7Y_q$R03{`J123=3d{FpT zpX4CgpZB>K%rYN7{jAsC{~HH|CjZ^N+OXonG{*%zUY+X!C?BzaFD35B2fyg&>^${q zwFPKCFr2`Gbmi)VlSW6g#IZY{UecLFgf5`jVSenm9vBi|fJP^FE0hv@GFBs22$FwP zaD#ELcG}t=_wbS}Kv9-(HiDj=Oj=r%N8iwfD0jwbmXhYwl^~{PI*c|iDFB`DWUVWV z6VJSC3k(cwLJ^;jBv#(hO9bpWm(t)RGDeEcW_JuciaMw0m>m}v2h0%2lOKi7?i9ZK z?>CLMM>k@Q3~^dOJEV|VQO-2(BIxP#PuU3j@a3A0FNG9wI}d98CZlXw9zH%g=l+V_ z9`Uk}I~V^;4CW0wS>qFu+ORW*Q z;Cx@bw>*<-=c_?Ezb|f+y|tn1pOme{q^uOA#KcmnYtNDVQ>DHlY`p(WjRSJqr<^I^ zcpiULpr7*YL=n-iG{%-h#$IPkA`qMnMXr*W&Xy&x>WiiFM0S5}Q@9!sMd!^IsO#H7a!;|@A{>B=@!a)NH_esV`v7^6_$@BQawX3he(g77*HsmQx4S;)dE{aqH zOPn@4(7}mE(#DMVu%Y2LsZZH<*_@{^87z2UP;7yHg=J&%--hlieV zlP1gTOJ2FU)+=J%&qKLO6a$4{I9}SzuAGt_ae^^2}8raFnC1N)eD%X zwZkq*)qhnScVpVW#>n}_{9GvGZURB=KYYuB%@!XU4F0d=R@Jiczy_rI{%#3TcYYD1 z|ITLdqz7nfF1&GgSCFBrcl`5{R3A8BnqMphnl_TcV=PbE7~a#+wqG`sJlI~0=a&uG z7t|tX^$3c`SbBV1Y<}T_0oJ}GSo(BD-pFT7;CUN(=(xO!I`h(n?tb$<8G<-|$mGeU z9G6a6D0MjYHo33&JL~0tNa8m&%s)@9`0q!K?C;}|BLfwGarTr>1Eytq+S6KT{Xknk z9_PfZ%~yp$P{CO=pm5aLa31Ww^^krS#jwUG!=G5# zy_P3uGtDZ9pUk2pWLqBnFme{Pw?rsohd6a6PTC{eTCkTFMc4*vd+XK#H~IR5AG{}5 za?mimyjfAv2!SVFvthS_l3w5rq&}zvsX(V>zo%Sp%yoF5($jD>2+21y0H{#a5uB~&- z-EwMHSvD9^d_#0$)D>x$p7ZUD(h%bAaH_cjd^X?h!o40jhEvtmP?cfNS_Q5DI9%?W zNSpkNW;g$V;s8%GV9Nl1QANQ1PTC2@vaBDPH=!&x#GtPOl39w_e7M5$MWnJ#7yr3b zLVLclbU}0VWb7candM|Q^Nyd^;Kcnplkl;)<#p>*GRwT`;XsPbZXOc(p0dcj-d%cc z@EUQ2u${J1YkQ$;ZWq!;l}Y)_>3vfU%!PfhO{6;^d+KiD8{@;~^>?#mJcaLS9w+bS zQ|+17X_U-%Da-mr^nxnAsr@n9MvN7wZ;|siq`kG1EcoxZ6asB@9{9K zTAeRrzhhLfv94F_=t3hD_PBqrW z$)JnDjkl-AV#!Sn8g}ZssmsLX%)E9%o6YrjH~gDt8I#EuLpM2NRqONG%E_+pg>9NH zOGi>MOb$gV259?{7u zID*|f#^Pu7HMc-``?BL?6^IK1MkI3X#hsXz?$|o6MOaLtB6oT>Lc@UN=Y-@PB6M#D zaW(3iHtgV2aoqudvB|j|A+GOp%utJXm*x6T8)ddZ-)fG==MJdHyHKF8EzBr}@&sAH zN-1Ff=!6d{t-$k%M!^g+TaUo~>65gT)fFR#teA&)PC}d$%ipTpCXw*m*5DZM>wYyV z!rS_XtO4oQ)9`ddeDmaZ#)^%w&DJzEP))&@h1AK3*>*?}qUN+;YBr;#a{Zke6dSbF z5$knIQfTN9H$p{-v(!>VD^+(LXv5FjGh=L!Xd29{2QTczyr+2~sc`W0c%gQ-Lr8>< zY)g`y1Kh_--rE$;T^Xx+w<(S38^8p zyo^?fIzvRllB{l~VkD(0Vwzv{!^byS8*TCGQnBR*+c|6J8BsH%He2QaTd~~%<7I*_ z(=pbGC!5n_5u9c@Y?Q~K(`5FMc<}W}`f}OscXmppV(R5sB}|NCkB$&m*JqTAx11c-4ud2^CQYebFtIAkxLm{TO|rHt~BD-ABuSGO$KxbAQtbP z|A9U2sr`iF9$ibgHe{d4hi8#jzauNsaWl6m>VYXcKwyCY?mq zeC<{jr5M5uy>Epm*1(KH3)017O)~nTK26;SxWpJ|nn`mRh_q3nx-$gYQpPEHV)al|NycNhCvPpS{PN_z0tbwhaawFT-Y*@bm>GeT?y9f<1 zVQGoVM(tVHaCt>TVUSg$)zfxW^C=qGnNrd2#6ofA*P6RXqN>m~)EaI;6-X+O?;eVz z(%whR)m815jAPfIv&mUUZ9evAYm}Q9Tp;O|s$wQ9Cy_`@c~%Hz>g*7eU>BE*;V*#Q zzZu3|d*ThB>XKtVt#xT;*$KGQ8)U1d9=6yh7A=|uLpxxdB!2!P1`6l8Lcy+_rnk56 ze&ns1JuRi7>L2|d`roEKr=s=(MMfZE)=||ul#Q>uD1tV-34&zCcoD{H?CGZ4(28|m zz5n#E%-N0}LW*@Y^dSS+cV4y=2Ck&ZV?gK6`o%)epzpmVv|D4mLMC@QWEcfrh^o2M z0=d_n18iBEibja#o&VBg@}g!jO?{gn$qTgvy-f-VbV!|s#VJDlWrKTb`Y z`g;+-%z<38pgsbTs8T?;IAO8d`yRWV8iQFb!JW)Cm0vrt?{t24JD~8~11^!L+3)Al z8A<2O>A>+8t!B8+1pK@gnkFhoY>Z{>`y)kN|)1{ zW?DfvCB)U69;WNdFN0N@72DcfS6lo3brQUY-Ot!)zs+TM4yCS?dfH~~+P9II6lOZJ7urp`SWg{u&?||GZ~ocgXPm7KWTw z-kHLAvp9?MJDaQSTT*fSqD{FzLZDYDhlVTTtfAw?ih7f`2MhMPzMjZkyuvso8M`bU zrwqU{lX4S}p3-@^MCZD!^GRIp#vOBSNNlTZmPL>LE{iv@NxA&d2um~8!K?!3-Mm#X z#v!5I@tKg$ffJ+V-iF&zY`={RzijHAa=f%!?p!us0XHQ~Oy^JSP=Krl)-s5lHA9NVv>2K&1A5L5NgMB!aknf`q9w{-0siM?Kewp`a`eA>pYtB z*;+9j`uIw2x2Er&;E$n>npDX~kw{%$)6JcXF>6&m9Ju>gkF>63gxP!V<9EzEx(~Cu zRk!VBoT-$Zm!$JW8y36q<8DYU=IJ}bL!9EbZcKcB=q9D4vLdJo2#M$C1$Eww@w;}g#|3ReJt`EM>Ag(R7L~MWzJ${br6rLQYV8BQqlZHr&&T{{q4>KD;T`7?+}14;wm}SIwi)ViKUIFu zQEjY6i&r;@{G4?W9eIBcQKM_8rkg46G@LP!7oB`A*mcV~O12xaNw-UQiQI7=)Y)1d z!!i9}F7C4nqa5)?Bfplr*vlt4Y*8p|KAgN6%Uk6+v)Eb2pmj|;=4x3hTo01>Q)ZoR z$-=``gjzVRzTB14c_NGSs7((>`O8vi7@?c5jvXB4hftA4_=QK?LT3}>BUI|f2ea+e zE)JCkdJL9Lq}61J61rB^T_=hlN#z1{IG5^AF_083?i+BWz}~$<4!Km&Gdm$pwxUP4 zG}X1!Lt(X7SC$+^W0QAD&e0dL%)#x)-F}T~rGAMNeycHcyX(GUcWCnyU&d zMm&`a)l&}fbx^t_CYAf(b5Z;yCad4v*qEX z#X@{I!ecDFFO-XPjiZw9V8mGWNnEde;CBvGJRRnFUD!-lBXP*FbatbA5w?PzKu$G> zZIgSKCLx(G6)U>Ou&3#cDiN~-7bDiQG*;QlQmzrjwMh12X@-q$D(nK$_#~~QXq(bR zcQ44Bo*kMsL+lzVGzYFov%XP<2Ym)!-tJ>@ySpGGRvawBV`22)>rnYG$WaJGA0RvC z3f6BNy8h`^9Q+yO;JG?pU44c$Xa$h^ykElSwok)N-vvmOE)*~!zbo41E_uE(75bRVAvzD#6$=r z^Ja|9ui^2$Af8T)r>;%^J4jb~S7)JY+`VFH-K zKA6m5_JVp{ur3E%b3Hatt9_%FGoZs`+Lx^nl%WA`Fii!sKXZWZ2!00U{>|`_DV-}R z#|;WQ{sct*v2dsNc&-codC3|MgIoB#ns!UY(U|ObfKk;xCZOr;3cqC z0Fo&vU!HA^kA@LU=D!z`L|-lbzG0W@nfCS!Y1FRs?bi}0bB9dgMq1nIP@6$C|J2Dlxxox$dhA6R2qf$Msl`8?{bO3)bRtFNYu}9C> z2rM@L1-Amg-Y-insta-?2k&SBYG^l*PgoG)De@p>H}quN7#MZ`8-|pnfw{Ew#hOU6 z;WP0*7fxB}VYR!cY1z3lE=Fz+7Y75!)ieVP@z}BU-OcThD3G^sp)EZVxb4$|)wz1L zc6`*XGIDIY*K0mjeSwZa<|GX{q0JHjolvWe_ZY#%X>u5=6SmyUw#{A`9l!-kd9sjP zY$6oNW^R)Y!4Pkz)}||kGU8hdSo`w5vo;)TMl4>YAw)t$Iq*@vI(|`+@bb;gVcjU! zT+Qb0;ufePV1>X8`+cc+h5ZadY!) zL1oibTTg(QqEN2^8t+cH$O=hRQ5R71vT^`}fOOKJ)u=L*vo}V__6Vo;+&KR12KaXy z%!0Yxh;D-p%>8m?BpNhw&;Zv4c`ZJ?AS5e&=C}qeyUPx|X_Q#YhO9gj<+RJJVQhOn zdgEu!8p$bMj*fnp#qA*2pzi>7!v5?21l}n(GFSyh8>D=CIUaf}Tlbf@opJ`1r2IuC z(##Kf7v4C4dY$aM!7CR#ff5G>4>tCm;3<~=-#%98M%*86gS%rv-_nU!Dk|A~nS1kQ zPMxSUf{q)cSQ2e|K)4@YIApAO?zkLuka>7K|8!$%?4cV=d5W(c)Jq;7)kFC`o*&x( zdH_A;;pzX=b*cZa9{dnW`^H6YP@ZkSvIuDyPaoW7+5`@4j8%KW&z&`c)gN)dE^hN- z8I>y+jl(tlCbIFeR3tgk><3z|(8jzx9oDfOWTVvUvP^#MHZ++v;ldZ|;iKrrkuVAv zH&Lf#9&MX_J6N{2JlYqO$hO~LuFh7Rg(ZqV)zPX7>i!?hy=PRD-}WwwqM`yKUAi<8 z>Afb1h)9jnJ4i=5p@*WPfYN&hktWil1_&K#(g{8E7D}iALg&8hbM}AlGsf@SFZauR zzhsQJuB^4@Tx&h+na^yf-6=Dgg#DJ01J)$&hA~`;rGGapvB(2LMx={E;uf9bKnFmo z6dOqzjxU6wgDjK%IywmO#4G-*p_9gxbmkI7#;ZBxR_LeCUT-&S9u;AD(HRKGu5;w0 ze7l}0d!Ia3v4Hh{Lp^#WrF`tDhN4}`>G^4q?qD2I0`xna3pZ0G0x!WRHr6taQt$rg|cXMab6_dV~wc0~A#DW#}@;PDeDN2A!>+!k(x zyIu8m9djXdxMv(7Mzv!~%cqyInZPZXE&F8(8FwVFJnW5`=I#?==q{&&uSQ$nf%Xkc z=v7+um(6ZPI=rq!TMP}ed-tq!?{o!KdFI3V-6w0j-6bOp-maura&>5RXN31)YXb|h z^K}}f4#UU>v5PGotM>i=uru4+ct3yqALDUVj(C9o6qKKUgmGMVHr8QN$Ld5xx!j^# zM6dC^9OJZ<_|e3ygC1h>)P7AVh_RNvsm#lTsN3lS-t%~{5aW*eO^;~MOkFs9l>MHy*NUf)4V=Z2`l&O zNrZ0xb^SJHn8=PzT*Z3!LOOZGtd!3jPF7R6kQ17{m^h@!cEgc%XQGZJ1npkCUQH(` z1;frK5KmT~9`(*ugOx)S?*NtaYrt}IP^;GaVv74&0`g+ssP>{{n++RDw@GnG6-)2^ zWbVZ23X<^?@vKlyat!f^R%JNOf`28$y4+#OZ+%NQ!##ZoG}|JLohTuSFX77?qadVRg?M27%z8%T2uME9#?aNn4MgDZd1E&j4c%28{V>P5AaG(kF8rc!FJ=Ip>RH^C2KQCf_*Q|=X_!b7rb2?P zJtDwzi0#=pg*(?eLzVBjHDl%V5=*!dD<#tiPd)8ECP-%BWQFHbXo*3zWjZz%*fi(q z9!5&?;(hQW`_FXQRDZMa?DV{2Mggu5?cOQvUe)S}_;RO?X;Ue{&N{(^G0`f?Pm!0C z*mARE+u{V1c5f?Pd5#E1?~s%^$(euEH{CUBT_-f+Z<)}@t|h>co{o)a=wuiW-|$=i zVl6a%>V%~ugn-8onkj{jXX=g{HbARf&TiW`c`7^B`a6wH*E094rfqBnkhXKzZe{pZ z$SB^aK$jS}!cKzhjYpI7*lg_wjy>mMjSxP_32$f#HzPb)Il)2}kT)!G6>O4@05j-$ zY}HT0Z7m(wPV61^%ea+Sspo2ev`@%?Ybyg|b91HW&J>^3%)W%8H%xTe)k!emEfu|I zlYgzD+UZUYI)azgC9UH`jz&dr`wNfSkE#i;;m)2F*I|8?P1IEAR=ekslzc<*+*1yo z;(YqenaTl^xZ4UyPC}~OiV6@x;!KRHfyeTOyK;vM_?xYhgNn~lo>=$#ODmw&@{d=k ziKyt1aq3jPnE|w{^jd085;Q)mW9J=<26KBh=)rmMGl~kEQBbY*P=fuWtEb~hZ(gM* z??9iOW4{P?;13r*UQ)?__wcclRlcqt^4M7JzbTv5=nfvba)T128sjsH$469K_H5C)0=~y8z}iUC5{&l&_p{``c7&f7>pHh>7|tB%iaL1l6U^Fg zt{KLS1t8y0=&P^2(|N02w(>rn&ljF4$~F<)h$}M7NwhQymWsAkqHZ z!+pz7xoK|%c6pmRKP$jG!*_exJlwz=;&I4UoO=}J6dq-9q}7zkWq`BX-14*>xQEYA z?w}?qrA)Ii8+$n{H87gC=yg^ok18wEVEni}=lo54V&l}{mAPE54z`xtMhH=;wozilk?WBoDhA;p(&%2g^b?nO ziIY)6_g-<$od=9tU1k=0jhCs}^AjKt!-uP8j{^ygma|~+<>;&k-=jLul23ajRwl6` zc8uNOaL2#lnd^V6dP>#M=N&oInX}tQ-NPca3lu%(+`0`SBoUqg9KY8p#L&Nj9s4%o zyH&?|`aVr|&wreCb0@ay-k@B!r-fvKChN8viLUui=j!^%)Xr+@nAxMk@-??i3%n0Y z|26AucCj+4cqTT3U@@8f&E6xWWBnF+UQ}Zaof32Cp7AX18JoS#sfs%ZO<2ua$$w;b z;-J@rJF>6$lLvd)4TDRCbY?2SVgYtq)ftZORMYhkC(5>Ue&(Vj4FVUOD=~IX{ip7c zE6~k|9q|aCf%V>@#8NxRXI?58?5HyOv1y8X8SK9>lTv8*AkpUbIh zbZJ{d#m?Mwd$LmG?7@TZ^vM1~SJdjLguL->y!jje(gFf2S$-1#ACOi}$t&+xaDm;)JB}Jd0Nf3VJm=CJAVoC`Hg0 zSUCT7E~+XiiGubQWKLg4Iey^$PpZ3lqV*l7-V9JfL1`&W8CIs--E^+Z{3R0&0?xwuP>oopD7z20|BW`N_fIxrj5zQlUK)>pd^olNt^zQRZAT{WB1*%cXmcLDiC3*O|SBmEi=yW;CBCOLk%?Giws z$Y`>*A}Z3a2s+ir4o*x`eqVMm4V8&HItoZt$|XzM`0xL)HB|+yxR>t3*v!QQ7#g}a z%X@fXJ$X)W1rOGH|SszI-LOHQE&IQoltab1oKJK8I{r z&69%_8zHL(jS0uMy-<;Nz<|`LL5Ba7p`hMYmGjn^K8(i@(e(N(GGN*r)37!T71~-Q z%T(@VubQ}oHQ^NWYMh74u%d!7L?j%Chl*`3o&#dSBe`$xj#R#ocl#=~1pvR-#xh;& zer+s3)2Ya=lH!S1wX`gs%`pL@eEZRnT>y^NoLmV-zXrg(oQevtgM+^k0iGtHHWJkU zBU!G;_JeGjK7M2cdO!<6V})Il%bonOsRf0FJ%fXTQm25hB0$zx)$Hca1vs+*@Ai8& zv}+7H!`K|{F!i-lk6UgV?#RChHTHE8zB(Vs26WXn_FG8m)ROh<&HjxJ|H>&S;Dk@R zDg$)UjJd0eIf$H`93bacXmrg|e1rdAEmKrmtG9dIKfMV5hfMr|*5${%0`N#x&$UJT zdj3DS-S-Z9Vt=6NWxAFkWsLuK_x+z-Zos{G|DO>DHf zYLEYi3g{dJ5XEx=bC(M~jjSRjX3x%6G&fh*!C@QG87TEH_pcp5!HfSX`#ceV2fgoQ zPdrbBSGv20FISEK+odYSU)P*Qcyp()7=P6HW>bWfm$-!2?-(`-FK1z5VnsPQ0BBD% z1N5~21L@;63$yMD5EGMd03x^9z^+$cbF&mvz{TM;{yaBL3*<%;1W+n!W8KWvRYe}k z>&p4xM;`mfNZVzbLG!E2GD=WPP6;oN^r~MXA3(zD(x7TUB3D6v{uEY)XMoExxSa!s z$IQ+y7<#=ky6kHzP!80&u84mhDv#h>5ORF{Zkfv^Ae_3hdH^H_FyN5G`;I1WJuxQ1 zK>1EfS-n@{%i?7KHYRjEmza}^qu&1CF93d%5^jO>KDtT(oOBhTDL?*eupotlu9CgMJx>91#rvC*WNTkl(TcPHj9E;1tZ1xY#sGoYBFdG1(yWKBdl)o}HKYiOH26H%7p2Y~mS%wUX10jj?}iOi<8rc@J&> z1_`6Md(pqS0L9KDcBSkHfCpQ`dl`Gi`z*c;s-dIvI%|GwrOfBI(-d|8!xS7qKaaK<`od_w z(1Q)P-oKB%t~ebXAjJ;{IztNJgQY=#8NJ=|T8URW!q5Qb#jFsaiAb5!ET9mS+&Gm? z&c;b_8|o%r0Sr8nZyWvCi>sGy%u>P#TmHbBqo6NFIo7wUUqIn&7%GdxKfa+J9z(r9 z<9`apOt*XuXJ(D*w)*|Jy`#lUs zaF5V{G1FFn2o9+;0qPq}`)NSzx$n7>nOOqF$lkHBXD2`=WRzA=Ff095UbT$}pu>4C zpr+D$pN#y_-UIA=d4dObBz{O!Yi2QQMdMWCWd8c~T`ui4dewIR=1m5R(PvkF$&CXE z4~UO-J1)ns>H-G{78aP#4^0LFvc>C%gWGQg;5_xYUnRgV{hbjz52@iXPQK=4%B&=H zrAM9+iQQ^ zba{wZR>s92*3KK=HGG7aBi_%vlIWVdNcVa8HH2G1%;~}4q(n$x^^5ca%l`UVSxG5^ z84V(NE4-OO(+WqW}W*7j8<1D?OmWuqU zH7-lMdwX2o=X(TAYL`1#eu?p1@A_y#e6e4I_~)Avk2}O(=)%?99e7KO=)S`}qpIw5 zY=#w+sngQ~lU5%?zy-eB>RHOL}9>Tf?!fTQ39 zUYN3n#79xydu!Q1C4WM}4`(=my1+FtjhK=|>v=7chC~>*Y@t%9WnaF0X*D(}(fmt` zx#vf0SQn5}LrjjpPqtW^lcii`rV-R7)INtA(-JUhV#B}i+&Gw8OZeA90Ke1X!cx_TkHdb=DQ=e`A zLCTYARh&in<3MM*-k4@W5HPoSczN8}&if^V+uFom;SKNA$;QQK}t&BZpA9r^jZcl$SfX6ul{G6tMs2f@? z$qM-Rfd_}2kIACH2#JR@TEEr`68KuSuQJUMPcViWbViyPP{Z~e|oOB!v-!S=G2 zB00cwCy1Z_d&D$eo_bkC)Fwz6r zb-sV)Mn7izlUYcW?37nK!5&p6Ja103?{i@?i?hqw5^GwQ>E8(`eGUQo!ap1qV4LPn zL1F3L#j?)rf!_+D?N@U$=kKC`Fr*%4`G0r-IF%p*Sgw_i&wM`vKha&{2ANL7TC&zQ zxuA$rE$}}-@^V!PADoaZ<#~?J`$BGKV1uzuyJX}!2~ZpVa73T{xWOdIckNj4RqBn2 z&maE7O~9#SuIqv{UQS)j{pKgG|G(Vj{l*sfi`cd7%d4ZqFVo{oN4PVBB%;y-W}p}S z(}7dN2U{2uk?_+nI{(x4>vPxlBqWF2y=o4foozYunO>j-GkU+|@(uatqc{GJFSk&n z^i8VJtE;B-{Y!dmVQI7QMIr3v%jrz>Z~y!hw>9l<8BzP6^#K|aD14u?b+LG^{9jw@`wgZZO~Yv=?UIAi{e?r`UIAb5uGe`X?7R;M z=tv6u=MRQRe+Iso417@+-Y;`^X|)gGdpLT&eN|XGFV?hI%6Od^?~?*k`rJk6Kfgh` z_qxcTU+*zLdGZFOz8_$Pjy#5Hcn0@^GIUcL==AWM>rP=E;qkc{`3p^d8z)15Q@LY6a+ry)jtsA3U zzjZ&&DFny>k(D0?#O@yJ90Bsc!V_};Y!DXAfZfTlFu%J^O3DljnMS^ivX@IT+h%2- zcPGr50gZt#4{0S&Ko=LgD~W*z2SmWn<+ygq=b9SI^L7&(mq-6x#ON=8>5xPxB|T&e zI4AW#L*4K{Gq`%s0G@j+<`m&*4!nL;Cvdt!>f}Ncb$@YDdpG2L_&?Wh*C+Myi{M_? z$gq;Zg~JE?XLBUGh`I0wySpcM6snDC$pHQ2heczQ(wAN#cYOZ&9U;>k8?9GSKFg$D z=X*ereA(wt6RxV}E`G?Btqc2+ZqjD$pL~{Rr-~_m}8-=j|g0{{$qD-(_Z> zLCpZY)m(qRi-SsA)d`I&;RDwxKf5(zkS6u1%u<)kI1)1*3$gu@idy}A0Z+F;cUV7l zpt&laJYqgGgp{FsDOEC4$)z&$zVB19un10WecP!Ra`(z1PPTc6iUWf|dk)o<{;gZK za4ejpq!qH;x8YaeiC8=%pUTRgsK%brb6zAReD7~*@XtFl&r5o7-6>X4Z%VS~$?NjZ zFIwBH{dL4+&xp=={lRS>j%xO5<|ggVmuwTbzOg^k0~$5epq@t7d}q&tK5W@d!fh}b z{0B1=u9kI#13QsVL8eCu&akx4#bjN%=Ney@!g;_g*_R7)(4HdU#s7JUHH z0bL02Ak!xj%rVo)6u09|ZcYCgKf0G6=^HRD)aR!Fc`IdpY4gorq0M0-dJ1-uRADvi zq2a=k2|}IwWd}7ul?qYThv`eD*-VimLtkY=duRVV+T#>;fJ``9%gzY}EujVi6 zcoDY_?O$$`wdih&sqm@Wa(t`jb3ZcsGa2mBU|W7Jg0rM5Dx)GXaE~-;)}T^!bSeGO z@gIlmr+l%_r)!5E!$WUW+mro9w0C~29UH52Bk8LVDdb<6=G_x^wH?Xs{60HjGkyw- z)kohGWJRBz$iHOdB}COWEOg_hKZKj_o{~g)+3%nERuOo&G$cnpkU|?5ElfvF2I8z(wJ52d@&daeFdTCty_J7NHu(Ds_D&#IGPI&5uq|PL$9dyeC8V zjiEI=q`KX#BCI+KON$7DmhO!{dPNrTGB9PeaQca@Fpw<#wH)2x70q@YIL$UYGe3Lb z{_O6d_##^UXj1?4c}8#H8nMi(0^OKtlHY-k)8HFu!v5lnTm9t@J^e2e!W6qq)5aaY z(^SZwn!6;sp55v@rxq}NB7yc=tS{V#y8C&+4sptR-ZyXS=^#UV;uyn_of=qyhB6lB z>0ervdqQLR;8jN9(YvG5-O3Slt;0KfJy(UnL^I;NoA|QWSM|?`yVF&M{Re zzof)ayWMun-|spLCyL)C&2rUn$*fLf0BQCv<3XH4BbhaQ^i%1w#}nf$ROgxaO!wnJC&JV!4EFlA8++i=DGmd@R83et@-d zWR^Ok_;TA?Li>nKMrzICuK?33Wj_TK(iGLR7nqIa5`dQFmiO5PwxI9rBmVXCPX16@5HD?@P}+7Q%@En^wvO+;ss znObk*h=`l){>`m``&a{#YZtg3{3U|P+=byJF&Qf^)L0rEH1$fw9D7b-XTQzC6RV;? z0Wb~=-x0d<)Q(6g1*A4PvvQ-9@? zVI4z5B4yGThNy~Ev3~T@%4OGUED6^O#R&E{bm*ANN3Fg7Q0|lBhtdNb4EER;XSaKi zDV%Gi(3QyQ4-X!h4311G+MM%}?O5}*$an2@pWlbGM<X zcY6}-_IoAB$ULb6ze-c0)q7PIW^ zAEs&uk69wOMQLJAVg0*Th)URp<>yCn-JQmcs6SeGKeXg zG(3&&?exo$4%6oLxbgBO+atdkKL6gnUE<{x>;8==7Q=#lc#Q)EycfXGlhL~36Exi# zyOb!2IgSFA_&!6?)_NUCRM%#hWp4rlEo6aFKeGaH#4m+QU$MH<`s;C$_!Q;w!{x7F z<;cjw*Z#+LFCN?IZaW0M2=(Lho`lR7U);sTZIaLaIJLP!nHMT2kNV04YqQBIZ=q>F z+)$d@USDHjAt~iV#W{*uM@R#Lr?hlp0jYkunS)2`0@V(@tH>->NnUVgheM}L%5NE5 zbaG5NKe2Dk;bg1*I>p52BHLC&Rk4xquwDK3R~;9NIYvNeoV41gY!EW^ER5 zCe+!Z7c+znzl`=;X{obL-^_ZKjVvLmN*$enJ7-?rkP?#-DbG1<@PD$FRa~CrCzaVz zwZ~b#CDGNMH&DQxbS%;MyDl`pQpn-<`0 zbv;}0O!`}$v3L8xPt9_DP_U~cf1)0HmiDtj)E)FQ-B!;Um>ov9i)o#&+0`}=`I#?u za#f~zQ|T;l$hlysHK}tJB-O(u9G$}B9FUq9;ad}DAoy$PTo!Y1? zHNz4Du>ELp*SrMO6Qa(u)JT;GT&hy$-duK)#vJ+{x48T zVz(pafF&wbG<(<^qOid%kIE&vBYS#BXnuszv*5sDPN;IWOHWvBnd06krP_{fN_N#2 zFcGvEsLr1dk3pqIjnkS}f#Rz!bZi`H9LLXWTus`;1{M+BWo}|4;b5d->F~6b8I+B9 z<;Zbwz1{3S&KJfe21j=VlmDgpyuKJ_yARvP6Keha$nohzZ$DFxRelR?e5Dze)` zmv+{u3XIeiW4Ku7NPc)p{$w>rCbB9s5@C|;wX;;%-&uv0)7J;D{z=*_`Cge4u_q>} z;rEChVbUtgU};$;w0f2w3d{Gub9wc~Kzz@*I1&;G?(6u9ljY%S!|RhSfP8WW4kTV*RE<@KMvyp)krdp!w^@ z5lxe4=jgj}p=B!i>~c$2DJbe9M2ilLasPlSA!X_cVag{Sb+T0TgRD>oJw!y=u8?Cm#Z>Z~}tvgnlfs@uVJRGaPPzGNk~bJ7s5ix3ty|=_ zz<_#u=PiM0UY)cmNC;H`N|$lF5*}G)Jc)WT*Ly)8=unuC*rD5@8db<>iHC(jtdUH zaS9MH_oL80Sm@~&=PU|a2RJ?@zZ zdNzM|#pBzo6oqfEY0qM_i}+D1T@;S+fu(M9$YZkeuWukcmS3oM+nqReOew~WbsrOD z<};9q#o~N#4pnNrJ-V|)p+I`&L=dDliZ(h;{*D!QP=55ca&zIcr1QrNA8wT^ zEA3Hk=RG^^tWV60kbOkeBjRt@mtAstzZMqrs(Rb;XU-Rn?w+J}C5D+TFJIFt`EYNS zUtWmF1f(~G=0_oT$jn#L0}oATS<#0?DJ8F+*Hkom_u?`O^I8(+SDnw_i>jlyStQ%! zzqKp}V`V!qZF}V+Fd6xivLpxUr(8YRQJGi|HOy|yn&ZWX#Z%s*Nj?{T$(sh}6q%D5 zAKQGAH_FY~m}Vh)4!(HpsRx)=B`J6GTu%M*qv`-DN#=ZUHZTL?kejD(E2{cI%_})5Ni{|j)4laldj#nW zNsAy288oudHbH2OJ8fKB&D%c0v1?ElrB;)iAMm2JcSA z%1`+VtbZd{TxM|42t;13*qXTVUfC_dj5$a&&!^c{!nk;9S7FJINCWfyvzMkbec?3U(l4I|>zC1MH0a8}8zB^|1qncM2kGRH@wn(UWD&fcJEVeU~-qH}|l3{9Jvmhn4W{h6QISl>D8 zIQs;FEWe$q%Q%PUA<%)}&!TUUF3JA(K4k>+^r3YfZqe;4b-`)84EUgV-^rYuZqdD} zCKQe2CZPq;;wN==cWPbCP1VkhPd8=pu0c*8pF8NvQV~1t-#+eLX-CW~=1J*po`E8g zR{dY;u*ixuyNJh|`RvO%pKmBmIDjg*ePflY_@Y;787tqJxiJ2CD(1eHq&QI@j*-+* zD6GAgPujAvd-r?j>&<5@_?GT{9#fLd2_m8bzrPj9ajZS%T^_c(dZ}f2htAcbOoWT` zc-h&4NZa?o2lioz?S+CCbGy43|1d6wWbgn@`-=onab9PVNsjgdD4&bg$S*JoR^+u*!aIg=_kJ=Ok9Xj5hl(Pl!PB2VhPG`F=$k3Xc;TQmpbc3)Pva6$%v(;=H`9-c!ynsVjl~25=D>Q4SVxg z`de4m9vU%sMl(a#kM-EDbFnOU0tw{F7?GVwZ8%e#|c zkf^*EIeZQ*B9~>6nl1_2p`qiUjS49@TK@cLIZOK$dU#m_9eC4g4QU0eHN8~pju+%n zLf2Ck;^q)D_hn~B&Uj21$IoAdIhdw;CIC_1+_u>MC>-pUN7f+I-joIgU&1~ zWp>9Ma{DeNvu7>s82C>K6GhMc!tA|r(2b>2Pp_55+bOOO1g6oIO;zb@;{p9GmA2bb zL>%7iXM2>HixY&SX;6!3?2M5`ZkSpOnVXu^FDNAl>upo(_00#0FE0-ZW>k9O67|Z1 zDl_+oIkL-7^ZT(8P!E@DKQ`i<^56GzjV&8d#ADjQmTeSIJ(4-$!l}~}77Yt}^fLA7 z#|t=lz)vPqc<*srr0@FE9yZyOjDK5=_O zpc}Zk`*p}@ay)w6u&swU+%2kG(_EF~{*(SB-X;!`pv{%JcjhN+16f1s%L#E&s zFm!dhpzz)DDh7447W+Rl^g-rwl6_k4!e^qMSm_fPUB#r#EXvJ$cWJXhP5`2H5S%g=hk*xc^%VB4b`PiA;V;}S<@_b;O_nOep^e&5)S!&&)xNvE5l z)YPn=ML(|x*&d8>n_m4fMQyBapLOt`*+}R-FOv$IUShZC6Q1Jh@@H!?qLy7X$XP|rgFr~PBK=46JIqgeA=OVMv_7qYJ``}vSI zxgSt2Iwox!ZVO4gOBAPU-cIT023$XO*1)pf-;^+#xc&V1{7r|YicjL@Mnb*&~amEG3vr?9M)Nc1)l6$iB}BjHhd@=Y1VO7WL}C-y`7PT>g1Wg zL{dX^kZ6c!1jzHiSw~3Zr40u)#e*=yhVR9*@PYY$n)oH<0))Ks@{2d zDf%p8a{1s%dLhj~8;`z$)IHUHdN|p4c7b#+$=X>#(M~GEb6ysfa{eE$W!`KLj5g@> zLqd(&1C_o7ctvgKflX3G;lhQ0KO2h++r#H6DtkE`SSmIs#q!#N?bw=2Y{5g0fg!;y zZSO<$H=&{Lxs8lWph{7|4P>Y-3Wt}mOWs$3P6M3l zH_P}@P|~OUqUVLg6x2w26r{U_X1kP4{KB0cwU4u(I>6aaUP`ySzqP-xl{jg`Im%Y! zLx1g5tCW+$emxn88%b>(StPKXOScf;wD{jogqS zN!jQDtG680P@mJj>w@C1R7cgx5*5LoYM(mr?W{X)<5cRt1;Ir>$d_+bl&cM1y#7?f z`>78}(!QY9dE8B~$WXw_758y_Cqbxqw@jr-pRzR;Qj&(e-nf=^oTYy(>2o{a5)Cy- zUxHk|ECkpiT&&+-6AHs51(FS%F`HW-XO)am;@){3Z&D?!MqsxRcK2@dHZYFgY7H;= zl*O-|Z~qSRm&#QNykN5c5qA-c|3hP?K)~-b*DOb|H)I~`|JH*38LLcjsQ3W1UPC`j zXz$PG2RGX?+ixNNG-2Q&A=88=P9&cdR8q9qe2uNVHruQ}u?w2LI3xeq?#jobKHL@7 z##6ib8?L49Cv@N1e}ibtfMV##ot4C9X{#V-;?!$lMI#N05Eqn2J|caoZ~b25)42+m zsnH+5(6ZHAnB})_v(!QMBb4S}HkjjNI+K`% zKXoa7ZRfN3<&}sX4X<=}8%D{T`?T7S;*ZE&1BENu)*0rD_k6*=DwLl3zaM40SP$Ck zS+M&z*QWUNR;u`Jzt<0Qd!PpY!T5Yy)OcWkWjN%qv}Dj|Lc!uj_g?knX4{_^UdNwR z!=G~BadX4rZ8|%?&Mm4WgY$)QXGhlsF)q3aCj0dE+M9XU@SJgoCa6w#lDkE2g;UW8 zZGS{nhG|Vy9GMOHM5DIFo=TtIQ5Yyjt8CZltsFd=OD#%SkUnrm5nL31v7gcvx4r7N zVq)dOsL?b5)PQN3=xVk_g&23m95#i88NKHx-eSoF>9XkDygr`3XJVpyUdI^os@I5s z!w;(oeEf7J@7Q)|^)E!jEUd}mMv)i;Il0uYJRG)_tWi7AUp;fVKNjvYFfy^)3U8i% zk7T&^5`wIfACHf9uSoV3Cy*Iz(`S%0X)LKke}ioC9sD*IFNz`ZrCsJ5r98?M3rPoR z;{~9RO#Dp3wo8+4)SFH_N~br`T0zihCu>riS~;V_k1rcRuj=409OO8vi!`-S=C4Jc zxrpJSD2*UcCn6e;0FHXS^w1A3)rtzEscuPwOfzcmd!j~BQ0h}QMC1-T&DzhW%NEdE zE_>!yhzI2iNg93}3293*)()ctX-&FaBm?qMNhf3{-l-uZUJM6=TlmW7e_+~oBO~wt zkuhl9exwMzPUNCWG_jgJ>}99VQ>UEK=@(vpAn=(on?j!1lT&(V0 zQ5k;UUBF3P@a$;3PdPw-?L-koZzu~o`KEi-wa|j3-`Y#LkLs-NG$`#IrRtk2&b6%``s491(Cf#$a-BiWKRS-PYzoaw;@4HYl> zkJxACcuW9djmo1tk2#W=*#4pss7k!zKa4UwK_*crNji3-dFO-f*+3S|B zkc4Kr-Tr>;f&g~zJKY^Bl~X??!OI{A^4dwJw*e*5n*bRlJ2J1%$49P{S8vO@?DGvf zXNC#L1xdgQTU(KCh4PNM=gF&YzUS=9zqH`xULYMr3EAe=_zNXTQ2Xp2Lf}S^sPKIo zGwz9{fsR$M8Qag7Dh&T<8Rq5L@+Ac6JHE1Z=C?fR)^AJrKujK)A3E=N6ny(6nVX6` z>EP7okqm!Xq)Wc&^rsebizfe@<2gY{GSjc~kInCg-d0}Iv|MXJi`=W~<)snNz9+R= zQxn+=^|M$_bZ$abZvJvb%OtM9>ER@$h=&LqYO6nYCN=@AyY4 zV8>uZIDvhIvIu1j^ulrzSJ~NM+oRIxr4CXJG^uu086c7}lDkmBExU6D13qvkA!Q5G zX`_r(9J?81b=BKJH$swIpn3eZn{Gp>o;Yg5X1ktoc|NKlp&6#$+E)3f1bF5_(9QmM z<0t*3qT8Mo-(a2hScj7FEW;~3l7wMq=Y?sH-ipT(E6s$vO_UBhs4{r_gEpb0^A&VQ z4fW~PZ>o1V(zsR84S{N^pM|a8PGA%#Zom$Vr}-%M`)m8o?IAH&0}m~v_;II=L6vDN zfN%+N0jzAh4tXk0+R?<&eScT%$dfibjpKtcgyd1#XF3&Znr-U>S`)xP##YCwU*_eQ z3-KXGTyLlN{6^=HE8dDYIE*v?m0QdcMkSO`L~$iTXYX%%5J({Yn?3zJbGsF0FJ`Ug z`+Oe-yWk4xN;{$bWxF0pYxE^|%lubqXOzqL5KI|~FwBlq$|so?M{QwM%p%|o%5u*< zvEIvkHa@Jb96SD4K;qpulL%6N9K}ojPES6G$5+j{gQq_4QO%6Mqlx!ZGT!oUrABsf zV#AQBrNB&p7wEtOqq-eWD2> zy2Z|jr7>Z;8wW#M>z}%Q(pZBq9!;`(s?Q|IF1B{adH=kFB0o-Y_2n&`FJw8JKWieIIMtu zw|M^4G{sNW{`|Ho@%S2KQr=j5xQl223_;iIPhswThHbjQZ%tT#_jwFh{C;x?y8!sx zB@hvo7ygx%ADB3BfNN47%BYb&-WCQnbiqa?1m;hxQ|ayGC5^;?=GRpR)g|0bqZ_6! zVO95)JQ}1ER;jt#712aaGs&6l4-z>ixRul2QFX7X+1%KhG_tsrX3I8_1p2xxzGk!8 zD#=M@A_U2-C4`85HnOoSVNPh(2Ru?XsaSr4 z&7U@PLD6a8{poj&{qkaXzdJay!ZA4TzvWe;%D06xu#Y#IwoITDX&S#Bp)xwB{e6e!`Ii zow@H-+*jsMmK#GqDQ{=QUYv0&?ZH)ZL|2@f{Y>Ut4P*$%e)kae+SZ>8t+SOHEA(ew zOn|H|B!x*$l(iVd#;pJlGCnR&;3^H#RVJsQ$}sah2TB;R zYX|HJd`86{O{-aYvx^n$SqxOx**|Vs_S_aASmrw;{-q?7!!zIZ_i^bu&2403dz4LN z%A#&tUPN-@O9U@Y^?dBYg7z>jQ7f{N2^hCcH(lrJ_xV``DaTtH#Mg7G9DX_^|6(96 zFU}}~+<0ztGa^o80;=3qX0*~fv|fU0-mYa*1VG(m%|$tsi&*#$fj8ptSw>lEpY_}u zJ@v}g;E*o-*4LIJMA=oD&>Q)P35d7XK9?r zH)aN$I^TtUnB{e>7A8yazN<5cgyRiumVMDyci%QAgOW9eFthtF_Hsa?=$+ocE@)?p zuq6Bri00^hu9qD7WK0ZS+Sgi;&dH%#AhuNpnt--N#49@u)&(o3hFLn{TCReErl5rh zh@$cEfsl*^RrJo~gLcby%_mnqT^KanpmgD$YLd?#Jksc3V-D5rsXe|g9Z_l3j>8F5 zXpizA*q`D)NnO)hZ2GXZpP-(T>b<%CXwLONhXKv)LXL|bIc5SV+ou8KxJtcY{$bZ@ zQk^qij!3YqvD!233UVCZT)uY@^d*I5jo?Uj+TN|h!$5-Mhe*-2_~%;g*tNoSti@&adX z7_!g4c|{%^ttXv{CB1FwO}|(FT6>?ib-e{z5na8@gX#X3UQW@{PGL9k8znElkV=t| zf|-r_(C!)jYhOcHq0Y-sE~;RW9uAg@(Mgs zmmz$%JZYg3wAksH7tYl7+M|f05_5B9$+P z2Ve^?ROI+Yvek=-yY_%@9?w`wle(WzS+u8EB#NheXEH)e!sC)Vk3Ai|^G?3uyS!DI z6q@xYU8?J?Ip5^hw@D16hR+JyUh}=%d>!%s^md(5O>Ns6K@mkkj|yTTco2|&Xwu11 zx-_MCkSfhcB0;)}ih?8(nn38iNL3JlM8Hr4g7n@AJpmE|gqF8C@1FZOcZ~b@?LTXb zm6g5cT4U}x_gHIw-zUtdX{yllj{TObzt&K)L`VBXebY*r(<=M{)l%Zb=L#Ry-%K-+ zww*Fp6de3iWMQU&j*%H?&Rq2(TL5EM*ZIpX0(vr>d1R$KoApma4m|Mkb&H*$LCdz? z%clj!o?n;e`e9MO0q-95oNgJ>56=k(!XjTfl2q9gRbQI3b;ak>su6^LZ4BL7!L@th z?O!nx2E<4pD)sl!@vfuq1K!1W*Q<#jW-tE?@r%9R?1Bmd=baA~y^?s<-EFA!dQEm% z+_0>m?^e4zoRF4sow;Sz&3Yj;vuftFo}Oyx3x7zLWk4M46LTwgnEQzjG9OlC5hzO$ zDFGJbJUr?W=Lx|1sr;q90+)1#Ba~9Db%x6B{_YDAkiVits)#Y8e%Q;jd102E;u>YK zJM@5h&G}REIoTcm``(Z=*U3s_6z@cKPEJHiJEtbz$_dK6K9-wDjkHT{{x}blAg}EH zFnCfct3au2A6r`4cQPa8WNa`FK_IR&^{g{Kx9v8>16 z8c?ab^rs3S8n|GYWHmAkI&NWNb+*#x+BGqx=ylDFlg527r!Lnqhjy|bccXH!&GxM~ zM&n`>g7H%U*LBzKFJ%yVG#VmR{Of@CYv8_#je+khGdTh?Uow)DB;+gL0kbyx3@&`) zl56N+g!(pO)nbvXeo${|D|T=SJZfYBhx2c0F;(mekqVIc%jS*X_?1-Ek>7NK=ec2j zMp?|x50J@azC&9Lu1?Mno*@oq47ZY(Sv^h2%BbOGZI0`0*e-|0J$%H?0Zje71{OG^ zgGZq^Y<@@P%)D*6=P`#lzV70-AP4VqMRBIBGNYJ~MBwD%ZQ97U$t7|xwcW`3vhOo~ zwvh{JmVr-uZPQ*{E}sd*gyg>OcN^n&o}OPOQy6!mN2!Z~aHlT{XyTd>mV z58YC`&k`<6veD6vs@L~9u<)O7quLH7y z(O-2G9DUR_vuBpn)i32-!S^Z%LsB)k%Q2mhw zQdsArUI6#+6>@uV_0{AG;~3NF#n<;e&IlrGobY4{09z2b2BNOcJ^=4IKDy{ZOxRo4 z4z^x@K~{O;5YGkGp(I{q)z4CX_a#sx1S)i4UL?Xd$6=pvwy0IxF$MX_ae2yY9libh zC2_SI#I2e^QD@^0Puor&x+eco&T(lkh5L)LoRSQ9DmF14bXU~eOWO%_>!GIUbxo2mKQ6V_!oSs-50fuLd`;srm9uviBkIHy` zUPu1`Ua*zyJUa8retP_Q=l2UwZdz?S>s`jbf7KOKtdDb}JO~a_M$DF7-<#XDey_4C zrbv_6oU!5$GHX$mL=8sGXOO;Z`Q`dE@mUnU^gQ_zC^0k1t<-q=VN(MW5RE^>;kcC__E|Dhr!pwrytqs3+^oIc0j)q zXsL})R(cP>IJ!OjtQqgBimDBxw8p*BpN0|!-xOc9Q{{UMVYEsvGa@xi55DKEeZKS! z4y|nZZBglGz-l&(G^*Jf%L&UL*Z`O4jW?t>ilf|;Mk=uOWW}vSrto%PR9AjXDpt1< zC!4n0B{=q#W{IsPhS^!ML2AGfHtZmG@6i4r422)zp{T zo)a_n0CmB*U{>!sj4kKH(v=HHa0Q%4JWs4BIM*YwdCY>1lGLXj!q57i6L50-J^l=0927XK*Xsmf^5H3 zJlDdC+aMkIB5GWo?gv zwAW`hM*m8JWFRU)Bm) zraN_JJ(wZ?vAl43HfiFOjK{{_9W|$F8lW)77P4FAKYoLfTLC*4al*mzl5F74qD@Ao zDhs<=x#3)Myd4{$>!fw>XXt)i(EbhsfRt=m>f1^Ake!JI1@AA{>@|Xw24PQpea@1T zCeEzIhvYBokdXcTHG9Mf6<{;lA%3=gqt9$@$kkU%H?VXBUabifUech-T&w$4U3VlY zS#@K8c)@zJk9hgTJQEJ!sFE{5oz!n`DHilcdHd${LVXZPgnKt)rN2B0C|J%W4Yx^u zG(aV@4qe%UCm_^rF4%{ zb#b`1Q@ZkCqqaJbO&^Z73#t|wkUyC*wDPs+s*a%fFEAu)zzH{fJ)Yng3_p*8F z+xrAl#I0k>WuX(eNEqpBz6FWEEo$)$JJ|bQ$-jkd@A#4=|FK+)n0E-k(&E9uhn19{ zT~SH<%q$sRX>YY6c?2;i!W#6|fU~<)fl1R^#I*6p$c}_7-Ws>0gn+e*o)DwxF#+h$ zSrv;=sri5itK)47<(0)&qmpmmw(Jks0JJZuzy7@FjRzT_;={`ZofBW+I9N@9Slsij zYT%}{(wpsBVr@zl=dPi6?V&MBftGl~HA_C1?F({bM0824$-m*K!kEmv3=FJe+G=-< z0UVX~<*wVIh;a5iDsZsDKGlDGWr%N<;F7V<-ImJyzktk^TFYcg$=((kCx*Kmm2@kA z^z&f$$4e1GieVGum_Zx>ngYJ71z#4S=q3wEc^25`}13;H5)i3=$oqx7|d53t!g4~mdNvicib!nD2;QumNN%V=NPe?x-qYB8yB-^J4Rc@FI-jUJ0QVQ2)JiaI58h|tso z*=QR@GY9>>F#l{@=o91De>9m)_%YBi3H5LXc3fFK1Sb}Mdc06R99z+izRT@^YPLg(JqX~g)cLY`>RBWBL zNF`y)#a!HChJ_}EVgeNvM6`U5-}NKB9i`untB`KEc8U=)k#W&C72z?D-EatZnE_Q0 zg+kOdsCsoo6^_9^_Eg{~ljWz`{Vl76WUpLneK=8Qeku&IpNW;&C@VdeeniTN!Q7b< zq+Hy!@JgA31JH@nf8yv_wB6L4ZyF7ve?_I=_~&3RVDQQ`4i3=$5`M-yJ-RhiSA%k= zZX(U{pEB|e+y!CjLBf$uKl_eoPcuAa3EaptP_e+D1c_w#-D_%&SQ)p`&W6r6*GX)2 zx%0W=S%Qwt_WQjH+Y5J&&KBT5@>55Kh;FQZXL|kXh*BU!5#tLacegv=Dt6-Mil-t0 zTJB*c&kn9t0C@{+Jiu>n$EPD{w9NwaQF}--z$`NUJ!SmqYmSb%f>hsm{8d$uPD1jf zog>yfSL9pk;>D-h{frfE{dK=Qz?ZLYX-skJ%P&n7TCpm|beWWV^~iYt2iYShN+kjP zP3XbS06|wDF3?y3a|N*UZCqD{v!}5~6xbL@Z#5|aYT2mb*UH5-lCS9H|C4ZJU=Xgq zu%qlUSG7yt#yBR>YOW%kCuVk`E2Cq@r~9$>^}k0%j1|AM?e^pk4IL|HTyPEzRZr}I zSG7I&$sN*VW=3T!04(<3EvvjUch%SQq?3qe*p?nKZDd4V&9wUw-VNFAZi-9}h$}VZ z;Ox0TER_BA4D&35x6uE?#D4mMf*Jb^P zdsVCq=In3Ypgvi((bgKX-y`DMx7)ph!)Lp*3GX9g0cI4?DRUbmBLZ4w?B}F?)b6Ty z`R86@xIGaduc@vkY)~)xZFE7a+Kw^wzW_Yf`SD}<5Sq?>aMZ!=K%4v+zykclK|g*5 zc@@RDU@}q_PtFC4682~W&*3b)A4I|MSxV)1JE0T$9^_w406emAV3)L zkX)CfwDU;NtT+a`?x5I_0VlxA!Ei=7MWxW{3!29s5QnZ|@3&3y3P_sN zeekslkQY}O(V}+Pxf;j}Yz6Eth(pt>1v;HLda3`$Db3K2jEef5 zm$w*T%P+mcd@{Pee*9zId4@@S<3jB(1$M^^AKLTyE!>#teNtg4NZYLXa@JflGxK#= z@Wbms(s=bKO%sUsjaN8bdM+onV}b&tO!QFsy_-rtLA%od0+ivWG6t#JUTnQP(Ynq{ zvaGZ}|L`{6|)~VYHl5dx^xaq^TKY<)(-d)!yk3Rf?8dxv;V4NhPK@e;Kpl=m)JZz;T9;!1 zZ(r5}gPAtzCZ7nZ{}ry*XVf=fguXMKRiK?$%x7X}b ziX*c^%2F1q4CZ~-ga-ezO&2_~7??fO+%4hm54Tfa-lb_itQr!`l zvJWm3S{Ny+8XFcWcXIQ+?L>uwB&umK+HVoq3X$HGlvYVl4zulm?UslhlZ;|2K?8-* z1LU1nyZPRgyOPo=@AB*9KVubFk205$PN>(6J@&0(Ir4M{j4`l!M>_&z|IM3t*!}%K tDCtZ8gTcP&KM3zV{>hL3|NZxN`Z060{%X0LnfOENwbk|2itpOL{2xxjW9|R| literal 0 HcmV?d00001 diff --git a/diagrams/PegOutProcess.png b/diagrams/PegOutProcess.png deleted file mode 100644 index b32451d36098158d7d0c74ea2aca44907362f34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249686 zcmeEP2_RHm8;+(-DN8C^>?xIP#-1g+%92u+5W|cm%V>-(32nBd4V6f{N)jPuNu>yB zBfAiieaXK3=Z?7=w0&Q`N`K$)m$`HAJ?EbDF3YXy(j*XN6THc8LEb>;+h{H)lJpMydNwmRSlBacp@2f$X4%($bijl3BVPXM9{ zEI!c+7$$X$Db7X z9<-PZuo4QUU<$=7pua|szz5W=b^;$}MRZjF4$cA^eIfw^JQev$AdaT+sT0J2V)C#A zy!{r~C_xkFY-vTrY1?DWAdBD(yf3M7sDJjD3Fd4PCld|N6Kg zHGvwToCo;W&+#YxXz`IQkfnwE3HBv;b8`n6(0{KR`PC+zEbo+Jqlo5_SJ-H7&aY^R zv9jX<9~C|s0>UTtCL0U*z^G}^BH*0>&LwE$2tXdDtZ5MaV@$($Kvmd9{|BZ4maxh5 zz<*5xu!7@%CLbV3kZt-@h;T+={8u6z6p9?4e^@9a40}pABoP}AVJ1Hk z5*}wkh2cC1>@cTn;3N4*sm7lv@nWd)VYnEq1F-x}zQ|8(6eUV_fN-NzR_IX^!~GF8 zpa?O3o0QkL9Re8@{b6=qQe<52Neni^u>4KF&`)R+WRyoF18#Hb$~-y5ql}M8@L)>H zJg6g)I{!@!g!-!-Ag2Yv!0(OYM*#U}a?pRWa(qW%Ns;ukhm!N8l((n?kEjwzF4^M< zR-kYIk_5s^cmmN9Z-KYN*l2w^s_@w??}+$nLs@0$b|9^+Ze@;xvcb?j!Hqy#(gEZp zp;~~j5)R`)bjCsDR|Pwqvogq9YQrTOaVW2`(-A69DL{T; zW=i330gfNwtSCi-4uqoz_|`)yPGhoW~FtHbgpCP{u!7*k9>j`^d( zJ2_;f#4V#14;aa@)@^)6`jc^1$3ulUQqh`JJs^`DFpfk#FhmsAo^(fW=BU{dRv??W zkz)0jQaDA}fVanidLO8PV^sjH1>E4Pb-i!He6rMhTaP9U^8B1ygcxjX$qIrNCznSi zO+Ns40Rxrv;Tw|uH-JUoQ#>63L|=qO=yCcj0zb|_16*IczvwuBg%%+X&p*3ADXTg% z5a09Azr315en^UNMGI#EK-4Axav%a14;p|4Aqeu|)&VZc2yhr@6G%1rvC51gSK-Y7 z{RBd5qxE~ZJa21-#ga;j1e}A_E{rLO0t0F8M9?=8tbDejh$0&-G8c+`OK>s#h?7@O z05lshakBc8wTYi>HhzvSqfq4PEv(BUV+1SSRIDosPfU^Gh?d3xhg$(I8BP`BzzcYU zV3a8f)Soc;ukc6{1(Tfc`tcMInR&twc#;zE$ow49k{Bo0=@gs3=5g#7!z19DSYV^HK_p|IT(6odj_O*E{3qv=o4^Y0!_i=oEq2nvQP z-wLN;_XkV*ZxBvTWF7&sDG6}!l7Pl$+)hVQ{zaa2ko<9?^`{VSIB0<3#V9S%0hlWy zOsd5LRT&8t;3K9scr$Boh;$k`G=X?cUv(_sid5jl%Qr%iZ$}tp1)o%RA}L0`D-2v< z9Q||Li{ux?7#7b-4AS9SPDM0?o>)2~sfIQnw_=En1k%EW-v|o*q~ILFf8a;xo2mmB zE+$QN01y)+rvZPCqKpsMMPbT4EY_2#DKO6&HU(tUAU@uA{4n(UPcsCgY?1NZ|7Q{W z7h&r741uT!*_QpY`~SlX!Nl&s0x%`*8d-t=V%GnI3eb4WDgrzIZ(>%mV!@LB>oF@F zp?*znDRR=k`Rc97^NtiV39r;VyS`04xkipbw_kVJ*OHNG)!vK7Ici_?d*H++{1Fi2M4F3gMaI_5P z`9BqI#!w!A_bQI?xGIjg1Ub^Bh@;>n9AzAZg2f*e_un8Q{ti;)U%CB53(o>BkWl*@=T1ijXiF zrv8%HVbt8h^7yY&1B}5w?H~l-aw^6S!sKN>W0F1J+}dTcwi(3|+8f@e!9Wi_vJlntC4-1nK#F)7oHv|9SW(}jFGkNSv zvW1|S3P{_aN1~hw_}I@eB!A#WF7Qr$UlSaPF#Xq-G)4?HAol}7_$>QZc+#8|h1|jA z3re|zkNq6E8x6b3$m=JpNS6?o6p$o41ahmBwELbw2f+vjZJGg~_v2y_X z4nmto{v0Q(IRZh8B|5K8C zil@E7HuNJ_my9Pz*A!7;?a!sXe?NYK$iyn^M1S(T?Bf07PJv>6;JD}aiG@%QIGmdTb|0al6tqCbAMH z_zw%Ptk{0!=w~)=`w6?AjMg5=QJgURiV}+9hO3d3QNr&>0ulL}eE40H51%dWiNNYH z2}NcKVf~zK_zi`1VqM1pyb}pWv0(z(*pXt_rmr%U;EkDVaOTh^mJZ+zI$#xqI_Z-V z*r*HIM-9LV(mTjtX7ysL+qSV6PqbfOo$zm#iC|6s@l?mp z3Gl||!T2GV1`!)34TOFf5q{5ZWFxo|Mwg!w&166e8+W)WOz!+YMVjFJk#2rZmwt6( zMD#lnet!YwA3}2-k8noc=riSEnLSMsHzg_n1yF(#z;^|NFL1J*Z z2L|_3%m=|P^sf*4ejoI=aPzwsZs0uWB$Q}i{=|gM637YXZ}=clc8QJ%Vp ziLA0ej+lN}`$4PJnwt#%OC~U>Z34ig=1dgN2KPXv3zu(RZ@QV^CCI{Z{!W39Pc()7kJ{j-< zg)PvUo~gMj21;n$>`mQmF~q*3XaZ}MEgtJgdKVe#1%58o|eYj??)Ax5a=(evH;b936@sZ74WW zzxlQp@WQ(vM==y~2j^WV4YCxa%?pHL{UOn5AT3v7(> zM=l40o%Yw1;Ft4}Q9^J@f-D4*Fr1>0RXE8;DXZ|Y-zU%#`b?>A4F?sGC zz9m_fVIW2!$}sbXQj}pc_#27xXHs2?XdZb5(wo-EuaX7sbi}lPZxjHg8o$>ZbgrYF z19-DDk=Gn!;{aZFrHHY`JK7PyN)dpU$xnC-9EHP%NzIT)glWvALZ0%c0}4Ou4R5gC z|G0Z5hhJb_9hvz@mZMRM@y~J00H!0?PuMb4c#T+aBE`J9lH`OCS3i4d^e z1%@1YOCc#trr6nJs_n{+5}C5zSDbA9DSCuku8&fL)si^GCH zt-!umLS~kLo;T4OW9*2sF1{Cjv<$>lpVF}T zTK0fvX7UOgVyLlcNfZjka^G-Fa54tA48NYvD={(4;%JY>5dV}tS;&+B%?0+b{{FaI z`bnvb3D{`7Z2gC+j7f-x#6-t?O}J|KpE{ji&61RuxPaeo2A}SEgMzZ0$7^0aaj==lXn)Z|>(8F5$el*}af*w4~ba*_)U$3@|+ z7c6=|tf>?DpySthiHtW6Ba@+px3VLS;Fa&yx?c{sKEvS}|JJ0x?1w)jV=M-*w1QPf z7*-t$4TnXWQo|>_oZ#07<}j6tB4hkFQut#d1z1i;1sC=?-w<3F1i`N1H;`L6-S&xY zHfEvi2;~Os@ojEJuqD+y022qQ=};_6p)kl(HfDhJ_s3&~p9MR{tp^bvPssjZ*zupz zUB~Z>g&N({{d=JbjP=3!-(O$<)%ZqoV*YljFS~_J->5Bwy*h<09F6`cy*R9LzmYK{ zv)w41_&OW`kdA~L9dHEj57@~TA|hH^LBC0+ahxfH7k1j=iQlnQ+7x4E4J~G}!)|mW z+F02^3#w6o2ZaTc$&Jwd=tO8x0kdB8v+F-$(>-~W5)?{wT&Y9|E`?LfCJLT8%Grd) z;5VAhiQ)6#H;euHH;W06UzhQ(gH_lAd?r2~>l`OE`NO{PQx*yy2orJ@vWs$ z6sfPjFBSvyIQav~bPbvnt`NQbz6X1hyIW@zYiIM+b&-15x9T$F;&Ny;%vqyoZ#Z68QA;>r2B;x#;cdD6&6d{u91Lqu-b(&h5jb( zZ#psN9?{xw?$(Hc75*o@MH!@iMIBW`Z^1v&-YYs12mmnHxB@|N zhPVP4@DW%99#D{x1R4qf5^_-uyzd-*7;77#3rM>hQSMd*4w~Z3Fo1Oc{vzGf4oBK7 ziM00-7H1A|1)z2HV83YKIS61IX)~xDA`W8<9k+zGNOHEav4OtDKs_6IZ36TL1+YDq zkd-<3MYM$OL1s3P-l_okEJ&UyxLuU42YN}nDa2O5Vbx6mb|TgAzOfrTz)28D0wLN& zI7NgCfeI5)*GL~Ip%aYtCXeVKIZhWw8KsmC33fh|4hi*3DSV$5Niw1v-;ML)&nYcW;Bd#YjbY^bl#opwaJb zOz{*~e>w>g>oF&N`Z(qWup_1Tn)1@$eUpvx%zsHZ_dzMQWUoXiw!fd$l07+v)Q;hu z5*#2*45Fexhj;ol<(*8FghG+??LP??!6Hb86_W5vhhR7Vo1>!fTX_qU@%>*=^ts(M zJ}bl%BciEJYK843S*9i6*p$M|jzR`XI}4u&%l@ygX2M&`Q5f0@Anz|cfT6<_hX)fA z$fNu2QAjSFbEFhpI28OPg8Nyc@|hz1_~3*h`SF`Cex1a02*pHxEnkwV?@Z!X6x!-G5yp`PHjKMy2Ghv4#!u2nl#JwEL4{Ibk@H4C~Hl zK8`}gf0eB!sR98HZKP`{@T(6Y%OkOAS00Dx*=HL;4nLg|Psy3nYI*zQEiH zDwsj1HmI=qPMgLtZM~BG7MJafVY3RiYWEMfgv?Ria)NUnTKnJ;pG@`4BRN4UUMnO8rJbo?hDxKStYr2Ya8v8jk-_#!QW|XAMtG8xyt$hqn5OHbx6i_ z9&m$(1uSvPFU*$HVP3!uE@%00jks)BXU4rX0Y1>>dZU-?bD1P_Z7xuf2kp<_@~Z5z z(tToo;*JZiuv=X6*{XQ+FgHhp%i(D|4xK*XVfJp$sd=ZNrWJnsrcX7U zJV|TtVaddXC(K$A<22yltgW48l7i2SPVJ(cM{yG1KhWN_ktM3D2qJgV$$?HlV6Tjp%>^-MLqj*y*Eb}%4pKF4#0RqD`r7>+gG2R>>LgRj=y zo`+oGaGKsP@K8*Sf6FFaY#7v%d-zA>s+Jxe>fn$o+m0h6St1#zQs>YH-R6=fL(S1%L>`HkO4KkLpk$VvDWpAd^zqIpe?zrtHQB-{# zdD3P$qhObN(&GZrtEecgLks$n#gM+9S7!yBr`c>1HNVVDAXC~)0j2ZaAy+qu_MEBv zCdusA+S`!x{cb6owU$M)&&oj4Rb1GXxp?HPvO0bLlTQ!pa+%;mp8gG4u%ji2#2)=sdHUsZ`vjehkb~DJ% z^TRDoRgFI)N`1gI>UkZQ<%OsqRy;3b>&>*G*qL(|Zz(YS7>uOO(6sSoIdSOFf{`A8 zhj|*dRrGS9-qmZjK1d(^)JD^Hx3P(f<9x;QbBeZ|?_YEkTi+~dEQ-6a>4Hi@s=Hf5 z!Hv+5^{-UVo8ShSOUnJi3QeUL7A-WOex!HqybKjBTci-;LezA%%mAYpfbaqf&?wVX^B~(B7F; zLp7eW0}T%zYqrm_LbSxkltP0lHZnOxBfDTJf0n78vN#cc05CF=bq@^RVk?f*_k5785v9mn!v=JJi22)cSJA8 z(lmnMjsE1N^Yc~Qfze$pTcsYcozcFpvp%8za%i!0g}ZJi%V}}E-Obd#Yw>nvci&q( z%D2w~HmO(kP(P9+@794ExlBrB*uva19&aE9M*?*x3;oulOx^OmREw{=Rp#1(D8`Yq+{5F2t~RovpoYGx>{>FzF7raZ>YPn5c7$C5K zdA`)GOQz2kD=E(+>1jiD{P|`-M+?wg6b*N^>G~0E?ATgUx-Cj@mBp!D8)(T&PE*N! zPVaH0+ZI}VZY|!&v)!ZnrL7sYi`oiSQ-^yD^@>?MTe?Kr#r}m(m}7x{K@3K5iI9oh zi#H$kzGLEbGF2P$5#76iX{4he)|X@!Rt)(C1oa$N3eE^3KhgE4t_ga^Tb`jmo>(}d z+NbFss4Cn#^sqZ}VJz8Fbh{RCU5>2|Lh9+4pQ^u6=*ur`BJwjrY8d%gFN6XeJDsTBoEM znl+q$y?CKm?T34^HYHaNgdg+DN?W-TyZ0dDhzvJ=hYY9D&0IODuHmDfCo#SywSU`_ z!>l)q)Ap3h81Kwj&{gFxSRA?OLh{W`8AL{;)Qe002UWCZLCR$u9n`v6x*xejs%>dd zl%FtJD_Xu&D~_+&n9$W!QUX*kO3|BchTB;Yt7DEIUT1B0YZA2vCMLb_+7V4^%!<3j z%`YO)FO$nT!0*_^8R&mbh=$@PFbX= z0v8bI=@O6@f%Hjw=uMxP>fT=*gL!DvUFLk#0b%y!aQya^T}4MY6&v5~qd)v+9Zo|T z=tundJNf#L5cBgGr$-Yy+VMfG5zW~f|zMZOM-7H=@=bU*7d<lVHhePd{5bk8Z5 zOD#as+jBYh0makc`d9CAXFTB=zFd-~za*?m^30PA!KG`BSOuy5EPOrN{MP9+&7dl) z+oYx899quB!7|j>Ah=`=F*1NnrkKBb@Z%d}+bo_CV)lW1jt%DSeVw;}L%JAxQl(B= z?)XvWwTMBwvU3;{>n0pxV_}2x%9VLdUm=B+gKFmy&5eM*& z^2I3My`Ie-ypfmhY5029cj5C@u4F~-c%Q!$0ga_xz^3EvEd$Sb`WkK;UG@OJtHZo| zxTiX>;I@^v^QPvCj-(R{5NG%FT@|${e6C}-Q`x}s+yTS*B!{}Y!ve{z4^V#li6_sy z(ABB_bJ*DJ@yunQ?a2*`yzs83#EJr!xV_@pb(|93J zHdf5G*u^*`-p{Yjo{jmR!{XdWftVe3u&L^y( zM6`?q#7RT$2&7D>SquKr>QW`7u24gS2@7Br?RL1gA0fj)DVYsm7bpFMZT8} z+`Hp$$-t8c`F*u>7mGwzUAVXrO||9adb#79)(oD`-?TFPRg-J)n=@L8Pgh+p^kL+# zb?CaYv)aa+)hVW}`bi0B*rFw+JKQ$0%<1tl%+O)`9x&Ls&bj!s!CJbx_nHz)qI7R= z7d^|#77h%zKuN0?4O`3`V~;Xi*I<9eaDs+d(Iea}fw&xW*I;*r!SK*v(>ZUpSkVH# zhxu!(e7GCCD?FSNO5MB5#LOPgxd%omOwP3rk zvAaU1yVOi(SLew*Vc>wS@ZWuZUX1W=U8tnPA*ABEQCN5nhA7hYc_xKoYJ6~)CN0A>g1bG_igWTs6qQ6Stua0+M)t*gSTSN0n zO00LIP&+M%JEA|C5cTTiai#mWUC`#$&$07`y)(~f0Tn#gnlV%r)e|x&1@!ev@b+C+ zB>*HewLYXz4B5Ubi?#4Yl)iAt3srMtyWZ-+wP&=}1#iy|<_}w!`EomY`o6R{T@HP( z`Nc!Mb!UytIg9pY^Cuc^ALgc(?Z^?fa}}&PB>XG}V44RwE?J;U1=qH&HgK&8GP<_} zpM2}OTClM#V{3@Y!>?$%-(DBBmw>M_vPysL{X=PBnhec!ss zAvL`Sk@>n4^o$FGeqB2GCa9p zSTk%*{u<}zMsz2gY>!Ea;~S&0A&-vQTnBw3w(DqEh(YGUQd58a#-zG%hZTLbOjL{| zP8IIX&Wnm%`KGJfUm|R-o|{Hv8%uNsv*?`dl~sFhu&bm@mD$kVD+QqMF5o8a)}*fp zBOa6T#9j*0i4{y6K;J~VJeQ}Dlt0!ExyfJyyZXlp^>1#T?HAPdT*~#p>Iu?EpBH+l z-7EKOI=b~Ar{y>Yy2zF2yUE7mooGt)>#wx&>BaHZ7E;Z3E-<}bzA;?-Y@S4A$XaauEhX`@NFRyJ zJ?`^kn-=P0854;i>JK>;55B(L-S&iCO8ziUD)KLW#%i*UXRm=brTXv!&*ytVgKtV>XkRsiA@*`l+uvcZvD5US>yw2?)NIm(G9*mLf^%Yt#1!=F0ZF!P7glJD)lUJ=^X*aBRr3hzF0;& zcG*&#jQLgU%J2)V*L#%Zx7zA}90^Er#G7s$)Hw`X)ze#=Y8&TKy{gJO8K8K4Q_fN@ z2L&i|@_@PDzoue1$r8j|PK6lnMg5I44m_09TsuhI$CyoIY|l*19(0qXahNviK_yR! z;pUE=Fj{q*s1N@v+mVpjg-*7N^kZ<$9=PwV$Y@lW1H|y zQ6+gv?mA`Qt5yF+b11?=^;sGa?m0J#d-xcIwll7@KF<-+FFpHOy`47KXN~B^fhF7) znJ1our>kV}`{z&k)0#FCUCym}VE~vrn_C$R;|?%yzw_=E^Q&iPBpph#f;tyDu6!IF zlMur=4EfdE)1q;}REyX+_@<>UZad>*Icu?8{D47p@54k^y1||nkKu;q`WTu$N;Tz? zbxG_V120nhKCCvdjn9t)A^WDe7p^twtPa1v<~`a;U=MEpsVgh#X!`~_@@$K6A&wqf z&hwDKnC(+ITh`^6uO`Q3a_iBS3V*pR#~D{B6E-ZPPXR!o zXLrIG;EtRM^eu|a0%gqaHOBgfg!Qh5^p9B=j$4m$@acG-ur?0{&~7U+5n-U@RnJ*wR_Xuj|B#5 zY*Jk55P-Ef>z**!o-G(1#-CXF(k^Y#$r^}XRuch(+U-}*d(Fwg)@N0?|Dr1&R8%=u z4etTKt2wp)_0{7Le(9Jy?bd4NAznw~f#S;Yru^$65K>9_aP4|=fdSsu;>^y2MlO{H zoB)C-_8975mm2D+ZfM$5n{%p}SWy~V=2TKN)Zc;8`o7W~_8$1rbq;p}WV@=_(Z z@%sF{-oX_Dmoh$P9_7BF8pzgRlr!ksnoe`CMZ5V;!_72VeDy%{+ise?%@7m^V^xq} zy(?O3u=7=RpWFG{jLSP#WjLS*bu>V7R_FL0zy8BJ(APF1c31hXXv|u1_BQuni3eaL zQjXOZym>~$zWXg33%yjM5CoeVPiSlIT)VBeMSG(RPO9nlaU-W9T=Q_lYA+;<^lt8j z(qOEjZvcVdYPpo^R3rOtA#LU5P`g-wPKy_d+cmN^8}I4Gbw3Op9tP8A3oP%dgsjtj z8LcZXACD}~jpw}PB4B>z+7ec;$blt3p3?6%&q(Y{rQ*0#_l*70;b<+X9Bps*J$L3V z5z9%5xC4NtO^I!yBYjP%ZNjOPz7N+`YVqzk5Cav&;?%_Hg}MiUXg43A5uD91k8yhT z*7K+9qEouINmcG=igKuXR*>T6?ADgSY}?aXnE-B9e6J23&Gwe{?159;*cyw=WClptu4Sf{smUKLot+U+~*IjkA7wzJe zo-Azja+&kZYx6gPIPL7IJM-Dq4AY&5sA!g&EE71=D!2LZNtBu4-kB9wOP}P)bf3u$ zlS-_;v?NWQH`%4So5o>A-h7|o(hhEwL-uJasE@{oWXHM(RY{f%3F12EQK_A~Y(0CP z4{6epJDy3+Wu#?1EO-S7OJCrqXVO;;IQQ0sI2)h8_&5z96HSh{wj}_2m%3y=%3?J(a%y|n3vw_H^vNyB z9f!e1JHrCcm|Lub}ax!bR9+T-VSAAWq0msjq(0 zbM;F2hYvzJedp*?Tb&CrG$p_bH$jMd?d*h#J#JEUXB|>xS&H%iwa?`YR^K>Kcx~(T8O1jS55}6r?AihhgUnr>pxF#Q zPt!j7dOq4E; zACGLlxI^)_B?V<^IjT!+Zy&vNTxR82&bj4?)Va68Cs*vXov;+o%4dAbb&M07JtC>2CXP1mkR z6BhZ})W4O=(+HO?(v)fv5nq8a7TU;7Y;QlGAOp;uL)Rfzse;_$oPC9PJ(!0BC-K{t zy*k#r_#Wo5+Tz-ecN;5!>L-`XN?r1lwQ5s_LsHWrYqu)h(-zc>Le7^SFEp^JY~Hw? zz(tMrXfyC>aeE4IL{;tlTH0X5OfC+6`BF8cC$bCJlRZ`{^{e=qqPS-g&xSZTAh=BI z9!#&evHK?dVv$S`j=o<^mtaxF7A|V7qhXOwD|u|WOTB8PtIs>1zImJ*;>4tMSBA$` zHxL50aG4~nyB5}qR1#g(D?pcZWk-F&JmyG~hz?|i_dfNAv% zy|>gBLc#Pe=Lg3l)La;;TGst;`&e`Uxo-I~vuCVQUECX5tC#FNF>Fl8;t7km zuPD1V=hpED(+M#aEYv*IGq^bM%?#zd$v0Gy7h4(J-+Iv$GzMgb?0I-_Zdjx*ho6>S zD7}rz{Q0pGAd6$%t##NWQ*pY7Dg!nzBf@xhw&IMM8;RuvH6$UaCH~EJT-uTges!@+ zuFX{AVhHkRV4|`Xtak5wp=t|VZSw3c$aNVGa2E)RbMEK%iFw5_FTMm1|ROFlxey>w;V%j?{pwc=jL4CJvSE{+6;id(noUxX)l zvUetREO21xc4$i4+k2!&$tP62)P7&6TUWUoJ_PmXOvXT+aGntei|jP-@7XRZ4ctPs zU@dKJL2;MR3XJf9BtKLWuqp`;X0N{Eaou`*a_396Fb2l?kDod^7UgAM-rZrH>a@ec zJ9vJwtAO9C@NArMX$fQ6OX>MOo~2K0-aHVaE?r%E0o!+UQ%?4@*=cDfTkbed_X@0F z2H)e;otD|e&ok6Mz4h*fwliyIKDu<)Wd%4vlKq5<# zPl2_Fu=_==-|>${%3^cqpZLt&jp|q!CfFc{c&936T!8J1LCLPY-wJ%*Gl%w9#NYhtIBSfrTKEjC}P05v_P(W?c4_cJ(z^wD~@ zq}^ka>q8bv-{NXh7qSa=XkF3w_rqVy)SY)g&wTboF zJkZzfXn(vluqgQUrdjLM2F$Ax>1VWsS8Vpme3G{FW_x=TFdk08TFmMa_YngQ|~ zLlO)jFPj795K-=;X@mMRbNr@nFyi7k^)dN&wWPNNT~Ip+HbT73g0~$-p5(#n+DC2D zP)X%_JDpzoE#eZCB=Fsmd}_Hc&sii3_T9T|#4@Qsn;;WczD1UN_%=qWtR4eg&{jjI zxoWQ&7#MS1TIrPTb0~+ir@gN9I(`Yo7h37PvpM!usdsf>V^ywHwq=$yrpWF{y${ld zMYYQ`^+AYu)pX-`NbB_Jt2~~_vh8>EspH%=(9>quYjXc^mrG_XMpjp88QtE_p}R`= zOmnCvgA7kBraxrpA(pl?`_h*+Eu54O$t@j!WqYy*jUcOQjk7v8NII1KT zx%Z-}_Sx#m+=ICQNj#R`HBPTrFQcy77QEz@p!dn=vJTAM7BMS09Pgwh<(*pHb0%>p zUFM{e@eBu1YOas_l8*E2xu6md3u;73d{{OF!<>D+Po2Z7Yp4b1?O@(7`zWKh!$K=i zGK85sSqWLYc)Op_#+udgDvr&YEkD%6o$b9I-5Ve6bpFnz^B{p^6JQn!rcjrf@kodR zwxgABVot?dWs~Qt9GKD^7^v^i^p+{kKWpv5q8T<6A&BZB< zK&k7JiSPE*O8U+j;^_4ZZkR_^6z*H+Q+&!(`fSVxA7-0X8BAKz%z1nby6X@*yAVnu zLy^n5jTu{W#Vd&PKI!Yzv9}xVHbiS8u*R$QN59=-+~vaM07BVJ#Z~z8S<^5#CD9Eo z_d6M>WW0c&C1k z-F@{}1Rfq??`<^8d?;JR!Nr-Oicos)$)v#Ue$?xctm%N9T+hRW!D?~FELBvF46F<0iRdR_I5_9q&Jx{w84FGd?#zty^wkaNZMouAJ3$Ytw(U{9;5m% z$6_RGcd{S9%7UFa(|sp<9IIE0w5pTHd7dWJ%?=I)6|QWzETw1}k5~_`s^t$9?HAi0 zvCUGu5H90Z8^(M!JD4H8i!uFVLu?vp>Ypyj8n)&Kk;#JsiG-DVF1cRn3ilj{Ms_Wt z>zY>EJ$?1Gy(xQ&=vgY+P+lR2l4$nD9NRaTaq>w|?yK8YuU^i{?%4{}1!|IK0L5pK zHmey@i3H|abD&l#sAAQ!r7^|c%zjDzh~QVXe77(4OVe%_Xkk%XNaZU0Wb*|M?#N{G ztMM0^0Dzqh(kKT_0`Eq|T=W+_ZX&pHj|kTePEF48HnU?79&%kVo7vPl%~vaPx}_}R z5p`KKGHb7y>#Cvy*noFTRQqTwmH5g{JD#f=r_Z{dl)a6bk%7^_y~yHhe&bEmT2@mN zcPx!NuV{J!XICKDxryKHg4<^=!q91XCY9;|M+8 zNX5pNDRw{Au(>AH1E>_CK?E`jK=lA>!=}>IBSc{gM-gj4`RMhxsfL=u8Am54B>W<(`|}d{x}BA{zww zk$LA7c6%V)j+xS)D(vpVK>EbZ77jr57hEA^DS-@>TLuytiPAkeH8-nmjX_zo8XmFr_uDb8kX zx}LYP=4yxEx?Trqu!^SAy4Q6{`z1LgB89rO9=wdoZrma&fuAJvQT=g6Y3FgdkoFcDu-ekvTlQBG+c+ZI+ZOIK=yNEqIBy%|(o!{QM zgY7TRMY|q#rDqg(VLT?)wYw|irKZ&;gYK=AaY4JUr@T2j4b^i)&I#qf=!-~~enN{x z2k)y;OEU0F23b&18gC)y=ERCUmllOoLV1WVL4iwU^OrU%6O`>LYZeQ(^`<4`}n)YK#a&}v0pIV#bAviMiJ5L=-?X6vsDB>5; zoRveXB7=f_Pb(R z?htz4-8&ey?qp4g0qxrMBLP0Mt4lXW8X5Pu=liQkdoS7-eIr!Pa3FiB;(+jqHpNhz zQ>8SLZT(1am!Obf>v;|dd)_{_xRQN< zJlB$OsjnN6R+rY_EEU42_dapM#~T5OGyLjY`d1t-SOBu(eQh%Z#rp%JJBOjr{k1K5&IQEXeXd9sBflT!|mKSwd zD?qBXS2n5>={Jw6p_oRif4WYwZCi_=-El^>COyLA$8mf?*Og9**`78aWWQV(yp-lj zlg@d3FoIxwY{oh<2Dg2;PHem+LcPmRrnREJ~dpH$q-P+RDHW!?eYeZJ5# zkT*1}4c~yCMe4-nuXiH5Cp&~wuRc98t%m^=EZB`RkF`RX-bIg-X7q|bD?e(RF%Mu4 zHJhQnFPDh%jL$7v)}CEc|M=>Q83>U@D;K_00{NQdcmaupz2apxARlIhdOS{&C(u(HZkPV5OhWH_3B|B87KI`+v1T^5~WHfi{+6)q_ zbDQ6bEW*9%wpyB0B^j`NFb$QJ28!4PDpx?sdFK~P&gSxrF(-0TP0=*30>tkDuH*@$ ziYq(c`PGT++6r>xDW}U`Sf$RcbNliQQn*Y`$_za)47Gb#!~&B3Ha(K7FKm&%Qu3-D ze|Io6{>94hhpvWSuGU{c>K(R8-5iU26(A)Ab%52_0&~%?j_9U8q><K;o(nauD%rurn&wkakmv~rnOquw5 zCelz2amZ9Kjkj1m(csuxKp4&HKBv;^0VJya@XYTLg)~ZB}8!tJuVX+Gr5kfIx=UU?OYxHuy^Yh=doVt{)Xlv z-K^A?O?O=a!6+sVayR$^#;(9&-IqJE)7E#KY`hT&yuRV?FU#{V%JO-HD_=hA+C957 zRJQp>J@lKa!dk-A?gAkAFO;jI^H9-sZB41{&bcE5JX+F1u7_=-REArUw zeBIYzk~c9$+x55O9eb~Lw*#}`UA^*)Dt`ib(r#GCmU#NmwS(JPRpmf!it06s=*r>8 znTyaoB9OB0|Kb#Xk(7czbcRz~0YpjOioAcD9zz59p#jhBRl5I#-J{g0%uzQ~9ACcs zLOF0VQ5vCQP8kbyFNPje(G{aUedy`I&2uw6fnd+n^m&fx6<4^k<8Bq?PL6!pX4NrK zvAcI}Dghi2s9IXLU=greekM9A762+lG{gHm%R1h) zmsUV1cBXg{mI)$OflAS~F3|Hr!2dA=sqZvVkXM3|zzu-f2&x5d03n1{3S^TTW3vU~ zyxDeT7U-D;5ViB)s~vOMRNh2}O_Z0{RxH%UyzMYY>%0 zs``-dnQ1PdNKgVuzfCa@>Ea-M4OFl5=Zp0b1qEhJnU7nf>MtI*slODWDZVv8lPkiM zV=JPw=JYCO0U?&}GM;?f5Qgp_^KBb$Bsvv&0zzsmy=>3@;zT^2RxmlH43H?CKzU2b z6g+2SHWJG&uXG>t@SuKPxXddJ?F-jAfo(}Y^3QBb?QX8O7uO#zeQAX5T`Xp!C)_Sz zbeF}Wue$}GC*5&~)#a@hMAIq;#j73DY3ObTh!tmUOR!0rcD1?eUJ0Naok8{h=19?+ zhN$Cqrx%AQ$z{l`f|#vAcKN%5>=MnLh^KEpNZS5IV=H+U37BVVx5b&~Hr9j~L!_!G z^LJ|e@h6~aWb-?dN68?;QzX@rZ1%>;Ijp2Q(B}SSjnHE5K3v$2b|PaTw49FJ4FKc8_X)79QQ+B^o7=Xq+IQdAUfSeha*JT z`Q9^^)wLbks=sv&AhleI%dQIQ@b#PqC=I~_<$L;@65gNpFNSD|!05&Yt{p1G^#eR! z+MHC!1}bi4Hl=rVCIDDj0!UL$kJ5B*Y%2;7FSisn&xr|hD$aT)+i%lQb}v!sKA%eP zV-V?aeEM-k@;WGEILQa{Ib%GL5`ZPPqSd{p()$?~U8fv_QsV`CmUV!GeM8xQAw;sh z_wJZl)W);2P%X*13{ZILKkT&61m({%Dn=|dR4~yr*}_Q0$jj~p^tl7NP`qLFjT1KL*zJgUa&l|WGre7QikF(pWVr85+R_L>g67mi@lH+&w47|@9fv(p6?~X@cg0N z;^at_k0+A!!w$~x-?^EeF>)rAuV;Qlw5)Q3I-+xViaJL=$OX$?L=@ijJl{mil@awA z=qu^j7J|oMrxnjcGG>Cxd<3;3>F~&x;CF;6qH|uHX=MJq6VAFFwmw7a zIydM&^m7EPreN^8&G0<5^R~<8Y6dSN)AQH}V!!SMCNI-j>kxdwCqMYh#UkIkt<@ho z7GJ~_p?=?{*WiN2BC0_j%~Oh^OBvU#q_SlQ-~42U9+wsuRmvki#xnv;Ui%rIckfYH z$|EeiJ_1YPiPPx;7N+nl&3y~KBp8k$S!e_^XEHK)DIhw9v;eJ{nbaQ!uTJQ~UAwOy zy%;E$#T8-K*g0dL$_Z)eUB?0SD9e;FlZ%R<_UZXIqUNMW@QRuT&exH-xpRdV81Q8- z>&5)Yqf8nIxedtoJmwpgUd4fJWef6R&bvn-{KU%MwabL2$q32>r` zimO#27sG1MI@@aJOcv1JHOTiF=M=!`bA)&TORx`lG1N1)`&E;1fItzDxaB1tv9i^O zPVP0;R1uZ_atcUG_R9Sd8_fOW4nRFQAa{KUW8^#_0J^|qETE#N=JEI3+%5C|njcb0 z9Z)VFdFCer5zt4z$3*b4xL+moGZC3A*C$E#bwe#ZFPk_ZqvRN;%Dd zhB zyrQ%NZ9GP1uF1)joZ3Ql_wM|W38E5St&f;514iNl6Oft@{c<34gPgw{G=5;w)q_Z^ zFPH{CR|B(LE~p1D8WuZjhI-(41$zbgjx&P&#cWz|@iKF_i990RxHt-odqt|Kr4T>_OwR`PTDtOcz+sZfm- zx(8k1Xl5a9Dbfxi#n8^49))1gwbvSQf^-X5$#&@oD`+C`@J-Q|?||^1B#G3BDvbPI z#|K1MJ*okFXGDA+%yRMf;2gJUP8`pMGnm6$GBCd!gb@V%%xm!nuQ3nCyX7@)j z?pL2YO+zoQ0ZJ`XLs!tM#KD8O&Bx1g__dG{r0U69%a80(L6~lktLR5L9?F?VB@7le z2{Cvfn4Sl|M@VhF>@Rl^5}i4c28xiB?DDOrTEA6^BOS74CUsezubDvicQIRgS}o^b z6v{2nFI3`?0lIXA&3MN$axb-ffY3k-bGWo*sOM2#f3jW1U(ON|=Edh0gXfK$26XA# zG^`_RqEVa?ErTZ|6wH0(*r?Ab-CsKdQs73!7rm#qnjfoDA0rq_5dxrBR}0Cb=kf2M`6T8zGJ@V1Hx;8xqz_^}OBJ1VD!K-Uy}pA0*JUDMQ_9!}0a6t{7a`xdBm? z7A$ISNgKB7ya&pUx);+fI-{MN4g236-x#GIXP%IQ&R*s&ajt0?RG3Poi$GTTx$RXd zMjs|Bnfp(&mc%L}j;YG!(Pnj=;#)`((RDOl=Yc*PO|UH~26wOlY#vdBOJQAJ2|mr% zpFiPb?-{N$bh{TTZ$a3leAFqizL{cZ$oYWPAqVBu-;`)j{Wu^jGPcC-Ued5JpuG5t zRYD7rj&iFOzffg2YAt5kDE-2z*lNWa8GX(_w0Vu*pAq#Ixv*#OSIGc^ab@U6u5r>jdKY8fCE+wbiF z&#|eK0{{(kh%?I+*RWdqie^0M8khihk!vawJcfrfGtbDlC2$^GVDR!mJpjBhfLL1S zS{J6vN1e~?RX8tFX2rsJ)8pk`Y>ZYuREk)IIH6&99D|3q*nIz z)Hp4IijDlRD!uM0g0GnVYO1FTi?mBjcBz5&jd+`&tva^=FDav|(2RbGn9WHbtICgK zv&vK4N&vZ_e#j7%{S%6JTrUFX(gb@V1&lxfpw_;zKP`mWYn$@1psOQqZ3(E{+OEEF z``E|EqF3&kwF^w=bG-z-WBeOKhXDSxf%bwc8`--p06!s7*VsM3tJGnm+xv6g?Zq+A z6=;hf3QKf#n#b^9;*y5|zt-)~3g$Psi;BtV0P^DKu9f+=1mn$WQy1p^tfYI9#hFdQ z2>{j<$qx0HNdf*_*}P&S=dyfX^HSB@(-TW=?gOe(8G{h}?pFEg;@xjJ4cT1Z9qj_8 zjv|27ECf?JkM&Qt*0YI8pVjfXm)L+b>xFhYKMw~(=}yo5a8CPptq zYNQ=R7-kA%2w}Jg(f?MQ2i%BVT>$#N0rW1p=D0jrh;kB@M)upj5rC^O; z*+;Ox;4V`Fuk@KcfbOkHlz(qlFX*Pvwx_33%=8g5(HU3wEUYP8FpbD%D!YVE@*P8n zt7<6UL*-7c)eNDQ)_@vLe88T46wr_~0nhGdhrnnwA)W(u zc@;2&>e!sr>(O_g&N|mq4_J(j!=oUxnJLYMdi2vBFh4s@5bxq$*p$A1gSg zNMitwTHCBxg61vlK*oZ#o&+v4J9&sbz{>R zycrUB2RuRqj0~Mhz^qu(u(_B7)bml9ue9Yj!5^E+Ww%IZk%f=<3Gs55hrUMEQMV34 zVF{EicnxY%^R|Gw*l*Tr{any3b`UIE05KDvYp%sZrxM#bB~_(W!9v|1^0Q~{z&_qY zx8^-ZV&k0z)^m&iT&ioVUE5ndi6P_jO(O^_x*fYsu}zGoLMW^N?*b@l1|{!zUo& zX2x7|E{>!1<4(rjQ??0Je?J~Q(hHl!H!n^8V$TBgRlj~Agle?QFG;l>*SFS3Du`~1<#|K+SUK#K-=HZUs&T4`2m z5?0Qaji$GYTxGEp&~2)=kejoVHWcS0^4GtG8lkc5hqV4nY7@AX7L4c!QyID}@h|2W z)&9l$-y#){N;tudOPx*|WWS=R2G>Q>`7FyATKA5mKc8LNKniWZI8-o+wLDX|Si5bl|h}3*)Bq9stlNc6q5-`Hi^^UL#U-I)m zB66PC_3~njT2IIvge1Pb7iZh&cmCeiP5kkW#VV_!rd9k3DU+itbJ8&zn=W)ny*$54 zaj1!g2`eF@JP0N~0v!ez!UoQHINU{YH$A9fr;^PvCzX87RUi6^XTmW|a6%dKE1lV9 zigt8E>f(C$@#ogrdH&TXXq2UPxh?#5-YvVbSk{ndAAhy2a=8aZE;G^P;=O_)EDKt1MPY8Uuag0s3F)iCn#j&Vx2&(e7D^)PJ+># z`;)jEh6KYjKDp9I^W=qK{9U-SnDx2{i`)DAhNV{I+IHK4hP z+e-TI6^_{QekM&Ce@wlaP8Y$*A#X;xZzpXRo>-Q=!WnhZOFdWkyB4OF5Oh#Z{s4_#HwGXQ+9U;TN3(djhFAdpcj&42)3a8v-uOF{)O)7>mRtG zmTOvQr~7+0TxDt@lz2LZ%j>a7qnD44_I>rDywk-5$F4M=%^qqMpIrJ0^w$;)QE{F4 zb^o1HzRbgXhFvky0+>+h*`QvsxgfC{bj{ylwHP&dh+Ox+5v^%|a@3bXXwSp`mZ&Ls zeGhcV?&K6<`xGR=lh)Jl9m-QmtgfXKbg@nOo_n1L;Ua8fzs6=cXo5;T(OI1`)l(V! zQmXWVW$%$iT80Y%B$6!8?+M5XC0M-O_f7r%L1Km|s`kb9un94b$x9WNmanZ@PxRd? z%c`WjDu@?{DvfSV-U6LcboEo^ zUISy*>mtDyhOBL_mn>9$dV!(n*KLl3r1xR#&td7mGdM(G+4b17 zTiGwuvAOm!Kl#-H>*`gbLlgy;tYKGym3i8?O>H1cxD%@#%PZm)p({&@3tz6Po~1#s z9TNO{_r0p;_DZ9tHr5tH5^RSo7O1Wp)&}Wp^TzqI2Yy>vRoOJ1vT0062P zmWzyxR$(6{V$$2|kYq$a=at#e2V<2t0*p;d4x43TOy?J-y$5Qae|BDq=kxKM-(8W6 zYq|Df&o|-7h{QuQwcP-B`G<0K9}k?#NvN^jM6)0``Ja$a3W6*kR0VX;Da?}k;7V5; z(Rv}#ReutxIipC^e&J|HC?;`NIQk)+1U_dcK;(rKI~UlTN+wxY2-mP=rl|$tM@aoi z;kHV2NG=qN;$<)y;$oR~dSu5ksEKj0Kaov;G$FWWEb`Dt=RE0^HUH9G(ZpfGP5!o* zEvxRma#m+RydTv2b5gP9qnTm#b6?MN{7_o(-6I9lXmu8vCWe_Y!N-qREpIvna<_qC z1`EG>wGnqOY8K{vO3-j)qQaS3hY*up&bNHua%v9AcdA}^^)|_?eR<(-u_4pP=R$dW zA4@Tf(GXiS*E7p$qJOagCRX>qCE`igrH;cNKV)y;xdX+3E%OS7&}dq#@;bS~DKx6D zEvi%LJAcld1j{Dc2^QZ6MH%zDoQ`$;ev|b(WdalQk$7wxsw00``m{%hy!3a-ezPMK zMMTk_acX2us*VR#an0lBA!}yIx!U4yBe#g#-YOUddf%(L+)@l~XZ>pT%NbKTgw8L$ z6p#vnIa0$u(R(>Y0r#6UnfyF%C_48npvKjcUxz&3mJN}=NU)g^<=+0;6l*2ne>) zkT+EOJREv^|EPow)G(hg=O5;d=3OJOKy;aP@XYxAd&+cacWPbO%|L?q;iuIvLjl^~ z7ETwXfD#NTc(Ui2v&+B>w>OuonJARD>$1k#dm7@6$k|%uGDL4PR(!_VI*zLqMKPk} zQVRQ_PFX;)Nn3+F8YvTd^wKXpA>blYN57^xAtJ0%ZQ$&!FwP<|Xhk9HNGVX=xhrZG z@VR*RLQcx{Q|Jo*Dkv5QOpL6C4ig#+pKxVffHJK7Z3!)vkg7j*edzM3EXV$l-E%J_ zNLpF=c8z6H1eKM!2$1npCavsFAE-E<4jh6SLQ5z=xN6z7`>7Nwlv;FOWtLj@?xlST z%ZrSokSQc%JKaJp4o!YWIXe6vCGT9X`ln5LZX#CaCi$oY5=735)0-h^BtQ-i+r~#& zod%$!b%a7*xb1vIV?l8hYS_Q9xiy__;&HDEMwwm`Ye1sJh5Hv1wi#~B8k+d$(5-y^ zUOWHVxeQs!0GDOc>w@i5GMNOZPXiR*{}0saF)ZbFWGN5Am%R}vj%{Wy8Z6J!BhVL!j#CFhG(arw=kui zZICMZX2O)+OT4>1Zf(x;?`!|=zHd;kYV@&8C zoydXrJ2Zt8Qs2&eynpl|aF9M5TCb6c^u9Ade5I^0;|~;sFIY+FJcyMbH?bNPPbf3@ zEUGU)K9}Q8KwL>gXVaSp#jRSGVZ+^@$xLURy!bm_gj8Bv>P5 zq%N&E8^EnE*awplEmR6xVUOK$)~l{z!mr}m|lCFAD@Hih0%f- zF80PfPi=xVOs`wtin_E3W~jd}`FGnLltv*Wz(95D6T3vWA9Aq#xN)=3JHsblIq1o0 zK-#tqA{|CNo+<xHY5D6F& z9rj&(;2aTDVHvhtZ#$Zm@r?**HXB{}h-d17v+$fas7Nf~v_7d+8V!9-NZWedSAHop zeKe&mJ#r>|+NSf7#V0oCYH_-K3?<^>^ZQWqfFu`U{tE%1*Y|D>g6l!!)Wk^4v5T9J zJ-XRcB>&%%(&K@_+Z|9CFY=Gs6CYfWow0e;H)6U0ZN0<3Ipmjo5=;J(2LBOFfNuK_ zZlT+7s3JR&;r>0$htXz7>X6x=bIyVHI_7pH>|gil5_vUG!CE$Y=y|YI3ipEtq!+3kL$z?2k1lgN!7e-=io0#XPlU2-@s6kwjgzwOvvdVmJ=%l4Ao}4 z5({BORi8QyPO+GI`Db&!MX$N(18a+Eu7h-Mz_}b|4WO0IAkoX=yAFMu~j$u z*G}XJ9o?FPaTNPOG+s}5Yf&@ekB94Rx={dtaxl0ZI+kAEZBWf`bQ&z7u1 z80aH$?aa-U74S=N5>O5-Mam8PDm+F$+4o-cD*bY}ePAp}1e6@1)2h^%#S_kDk%Op(=8xZ2*8ppP?q%?3j(| zu{7fOo2Bwk-e@kKHR*n0_i^DtIP871$UIWjf*suy763PR8SMRU#qfwBO|?+7^F;vv zH6D_$!vo0$fS(h+kV0ON-F`Md5p>)J;A^c^zv^$<`J}D$^w75cLM1F}ta6=9*|#;0LAvIlek$jeZS2J!c;4+8X7_z3Q?H z^H)fbpAol?95&IH7A}1mLbvS0GK(IQsPyO+~#L0>Xd!OOgF3W%WC<<*5{^Q7lC0&I9#CC*g z_B?d45`yp#mOh~n;(i8T`bXnq#3>0lmQyYl5jP&46mCa&k#c5k*}B@b1sedge_soo zR+7MFW$FsZ_2OP!R`4G0dkVqH)P*DJWl*c!;d)oN>cl^+A0~_!l*5-z9#g>UC<{@+lBJ5AtyPbzNo`DO+S?SLinhPRx$tSBIlB;Gi zr*TyCAv=hYUt;JfcM)(8t7>r~=u%sn%4mj`SNR)- zfO^)v(2vUy(RxDwrVLxlnNHk6PQep_bCUB;@B8QfZOTPF4{0!0HYwWC|mD&*0#Uj~O)A46pT zmb(1+i`y0Nd|%zM!4w|({6Xq$LJyJ@J@wlWcRrmojCtb1v%<})iW7HikaLXPgEnkD zys$@fg_X1PER=3eflGsL+ueYP`f#vd@o$S_U=^H1*TFvU{xP-&3EbECx{23_Jy!!d zloqCIW|aNp3kFa%faL;vdaImajs|oXqHK}qdZ*44O$}ogH}WO&MuA;P8jc*GsLIwT0M4|Z0p z5*$Rr2-k2Dx2O(Km0S|jL>F@!hlUj}L7JCqbti_Eh zr)#U*j78{o;u*>$LzIxZHBGK)0jn^Ms#1=eaQfD-p1rg??ALJotsJ6ltnYpxR0)p* zq`Wj%=qTr$Z@L;TBFX8MmTAekjS=|2rKzru_^<5;^;ypI_}SQ89SzaV#CK}>@7ni6 z8y*NI&(4Qm#EF*C3p3tGlB&E;AeW)ff&MHw@60M!S&~>K5|4+A*b>j|7Q{w-DtY5ht%SMRMQ4tvCRK-x27|E5hHuw5z}X6j3W z^jsDx5|+k-jjStZxv`znRdt`l_U=-+svP7$Wt2~Px29628!XcHGUo6~z>Lhg-E@R5 z2g|f;!B5$iXMgS&DZ?<#iCvG;7@pv>5{KAe7d;Y`)Ux(r1#cQb)S*X!!*_Qf7d2Gs zhN$5_{e-Ce^M8MC+T;PMZ8@?#`}#DL@%q>+(ca^Rai4Jm;}GE$6!K9WFsEIrw-X6G zu2NiL&a6YsLkyWx7UmiafNXw zk6FAx+{e`Zyw#H4ndPMxD?up;Ym16e!0+khlf{kVKp`U+;GlK3oCpcJ zT$>!LNE61d;C{3?P;5n<@h@e16f@d&&LF#|H~CcLXKLA(=D9%T##UqwPP`&xe!oF^qiGDfi^R` zZi$yAXHxd#G_Zc(pvu(0&9ZeH<+kIpWHcX9Sd**QS?afo&@*Pm{Ph#%y|A0D3j31PpDF{NhYPh!U%R4o>ThD&h^@tknPs?A;!khLBVlH|6 zHQAil4Xt`RS@1ZGefBS0Ldq&Grf5*q`gHY>7-^!P9XFI&Yjx9Lg=*m|QuC-1qqjhG zj_gG^|?H#1-69znYZQ5Zvi2(OpjzHCIMD96ggnl_a~c}|TH8QgEbD^e_k@EPsx zo$4#?*fZ2eE-GVgD5!%@S6k?L_G}j0c5gYx1j7d~gk84m2XXZTflvdvYkhMKf@zZh zRH~5|;Q_+bb#VFZq6_~{pBX2MVqi(1yyk0h! zm5##dsx}` zz-_g9|6xuct6-M{V_h(e`N}~LY=Vaoi87=E^a2gl0Yw#SpNf;KeN_-hKsYR_~h?p#TlN=#Y!y1pd zU(uH3)@YWk@65o^I_Qjk9X1yu*+TQ~(;<&4uabk^d~C~PM50d;0?h-y&R!LH;Bo8k zmQDp1bpWu&T%AX!jF7Yd{+MXPs$Z&|e?a1xDZzioCADC7GDhQvIT9QRqv*JHY2$O+ zMtdqtMYEp|;jaBiUz;D)+mPbAQ|fXloF4zQkc(sdtzz`?DLHTolu-3QB^^5dNqYIO zYk@jT(RKSq*#gaAUY_uv`H>GgCxR@e`BQ|s74Hq#N3B~DlgSBWy)JRFf`Ksax)+lk z)JWYM;S1E_N24Qgz6n#ZjUkvkDVw`*)o;3$2>pJ=dQ*fbS}QVfU|M@G&+xQxuf$er zV-DNbhjFXaz3hktj@_q=piS`Gg7XvU2{F!EkxYkKPB`+&8iusmi58h`A@Brclr;;# zfX!nmlq1YICPS0%Wb!WT54xvGv!5PAwsmzY|JB?FNQQ3m&c&~ZZd_iA4!;-j>{d0 zLE@UXKY9JnVSeZaBFaN5`7&my_WJC@9B~ESWQ06rd4Xj)f`{!W>JJ|Bl|ReJL=0FV z3H~{EM+Yd^&Cx3(46a1Z*vN3kWZ~f_t|He%UwBD=%J^^TaA-qPYFc&7>Ys?}Iu4Ll zAQ$8Qe)tZ*530mVOs&6iiXmwPC`9ky$7gAv{^GA{-1BT9W^6;%4qrR{9L;1U{y#*H zs}az5#U{9@C74Xy_5&?)cu74n>)Y-4`_a&IyD)%V!;F$e2krjvMG=HXfXR$VIw6kQ zMF8dlmGLPKL(ztZ5W_fl7ssuK>U(Z_LLfh^3!OIno!v?l^-UChJ^#R`Y|KR@N&NNe zm?zQ16khOzY5zFL!|Ef#-0I=40!2>DQTMK$d!226{;cQc%7=*NJ{SZ!eZVFO zVs9Y+ix4}=XnEc4e6g{va&d48@%sVM@zjr7=_TD?2O>7Ubg2F|LTsTCCH(p2Z(J&{ z`Ai{(N027myj_OuMGLR@KI%!@TXJ&ezKV>i5Z8-6zHlemz-r;%B_^vRTQP4(eqmBl_EK9=8?ph3+INtc=i0g&ESg4M)l5WJ0hyAReyZF*V(ws{JqFZ)Z7_2XCCxb{`7k8hw5t%pEr1xN2Q)?FwBc*#|9YsvF8dH<{D_(d(FYcT z8SVnuHK~*%f%*i*T359Q4bxzWS_w2~vvtMEp>^ZCLd4HM?-lsSJe!Rc0Asx1_xcjO zh*B%Z);|%p_)`mw>_>Vu7zA8;8efD%KBI8As4xmbOtk{S@Si#CD#34+40#wsmV zwU3ClY}1=;lXL5X)O(cj3=}_Y2&llPcCLaQWnt;K{Rw}ra>Z}RM{5xFZ5k0H@_Cg; zv2)-V@ZVavJw6s@wpohqJU!iC4LW=GmH&LaXkpHjs#{k^Pe0-ZI0YFfVyRj)C$B)!M;~fZ_8X>vg?8y0G{DE};zUVJ2R6<{=>dm$#_7)1 zr;X%?E|Tp>4^jxN$kyB&N>iJHzuf)Oz-#{i3tRJpFGVjC$xhg%q)-pF!kcDkq2SHc zPwNE>)~C`S`BIaxMzT=zP^DQ!#6|mqYqP9W0Zd5wjp#(Wlx8f6akvMvxsxz_4-r-_ z7_?$fnUu5n0tWR;`Ey;%UtWV5E%it{1Dr*$q{5p`IuhtBtxWulPx0Yfg^7A+H!k_?pr=II@ZmVGjB!MIM#H?Z^9J}Ne=!# z*6-E!RLzm3I>(*w$=jPs8qx z!YqNi?^CfCABBt3A>fk#o)j6Bni;-v`Jm^R91g!Prk-T=AO*~p2yHidxiS^*CtzC6 zM^KYp=!oJ(BjPd8*LJ1xjoc&<1cN@B8k3IiHgdR?sz3wq&a*bj1@)`>yZYi)#a~uz zV}11^M^i~`m{@ykl;58;FUVl1@^HlZEu?uNY$QTRq5<+G0OUzV@7jMBToa8WwOnih z-W>cwGpCLBv^@f&-^!tQzNg_U{zn)VAmM9Sfx$TuFWlz-~_A(i)3Z&Yq_glUmS}!qEyx8g_zLBrg>lPfrt~ z2QThE+F#Y0K|v#c;R$o02;2&YGle8jGznrTBkjcyY#&qEvhp4B9i)cG?9>NRJc5co z`Q=CMoJYB=5!(G}@?s%8r3e&%gn0cX9@V%LMOdtkCBKSA&aEW?<9~D-9MmQRBfD;} zbfyLzlp7mEQseDHQR_lc2yb__De3{BCC5+#A0OHhK`zG2%F zxbX{0ksd?I+CX9q|8x|0BJMA2zfb8+aoeq~wX-?I>MR_gRA{Pd&x)*MumK4ew`ZOm zL)-RyitfkW>E$j^yq{#EkZav>*Tv9HGUCwQ^Xi$}L>xdBg_Z~fkNF*=^s*uQCv?Gn ziA@3}dD*wfN3iXb5=V?{CDlX2F#?oMwEoAz%WzWX51Q8y?jl(6n!FQXYVNc~9$=U% zr7_{#xvWnLFLtU@MHp#{_GR1gJ`i3Q7v3su7V162FO3Au?uYJ_?BCJtD`0q@{t8N^ zWp(5Lw4jeHIa-SU3%UG*#~vS=rXuu~0bjP|lk#wl&_cgK92XNa_XM#IIu_jdKz+BI zgbb{VkL%7jhzxSJv0i*?RO%%z2kXVi8DQrk5UL@TcPcKAs^zK zkw6F9w^Lj|uTHj{ss>^A)$6a<6QmNy$h$82Zn0Xx=Prxvv*=Fa!bZ*gDn_n;(dwd- zrD3HcG5k;D|0(8n?iTOKaqInCC!I(piZSb0@ zEG*Dmq_Brww}t5+Q?zr7OY#`H=|?4V{(I1Ee-bBuK=>R{*ku1^_#A{#P(LYlFzkV?9k1Lxj%|$-sEEn|tx4a@<{4DT?Z*wk=12DBk z|D4%+`unH*d*Ek{S({7`+@vA(#n$guQYuV@T_Ksu5Cl_q!?4ePz>;dhOeMR(8Lbm<&YVpCgEm;B<9O~mj&P4{ThrRg z?S5G@`Tf5Ji>nb|J4b9bSWxI=cM`Ck*UHY}qRb%cle&~&!VYvX<~P0Mj~H-4djE_vs1P}a)YY+-LK;l zuy5S?ukSDKdTIdg#qw_%jSPMo|BMs2LrsXGb-wEYOq%x4nlq{tniDTpIPo8WK}L^> z46gW&*&I0oKglxuw`{7*OpMza8VySX*idahcRfbb(`Xp`3xi_4P$#&V5Mqg&Ps(U$ z<=ls#fb;@k(V@2+3GltA*e~J=bK#V0VS`b#`c>I<8Oeh4m2*y!i5ZOl4FR2Y3@$3= z-=u3lNw_2_z4AT__rvh@qifmp|925#{i=iX1uT>n!N_uMan9^c|JTI*B|B%9gS`58 zVaNp4vrp-xUn8-7b>agxd?6u9^8B{rZ^MF+R+*t{11_9?e$nZDDTToPulMBf3fmcY z#O=mCZ8aS<{@CpjMV)gr6T=rWLSv4aZ8c?zl~%!Y$Wmn=XSq3R_2Hl zMSI_T0rbeHKZtjHAJAYfz-0v&+^3R{{rl`&zmC!R9)5g=c+0p%Wj;m*#RQU1a@@a~ zI;gTkNNBDHy5bs8VbFHUMvPC(g-^-A zCZDfUeoL4F+lB`i?%aRa6*GJ;;((6SMlfj^sE$a(&!npkr}Y8x3xK}Fs||y&0#UO zkX{U7lVmDn+wZG>?!i;HBUC^fp9_Q;neD<2%iMk z>9&?zQ!yEuOYe;!H88q3F*JtWV9-hy+N6fu?f-ZA*LhfY1tIV~^NJ<(f!F9_VB;hLeNNK<7e!v>veP7A4fLzWL0 zeOTOSj?Sjf=`glPB7a0SqQjO`$>dn{pAk_g?1yr+>rgTraCGXNK5nDsw#r;1yLWvo zwyWfXN)1$^c)?XZe)ar$jtGaq6M|9r>{XtMK>U@^CZwcklyVD7Q~EaTH1ibQ+POWy zKC5oyKt!-p&@Yb>b6s3G0tR$>G1V}OwuD@ti23jI}=?YP^kO@ zRE|zCZ-nl}zrY=MgY{=HBo~%Y1(z?h2r*=ie*EF1ca6%J6?(2Wz1Xw@06G*&@}8|B zPE7GDR81^F9 zzT^mFyWt+L4tJ4$nd(utP|&t{dd12|OLvcX#@y*f;=uWtfq}$_;5mMYT?dgtI)@?b zX*tip;?(DEplMGbES7Wp>8}wR;VQsB3QRPx9_n9qZ=~WYA->58vp1ip2cpqwa(?Po zuEKGP%`pWv%x*B$;fN}Pb0Ot&X&+Y<2K%E~Ki2nC1d7cb54#^D&eknYZ5-ov_4|(jF7Y1p3GQ&|&%x~A5Xj8jDB`5bbX;u*5Z!Y7{++WMdPO zX7~OADWv7%^p`2PHz2_2GlF z3|!Rrf2~LeF8=3=WHqkltNAXy#!S&*qJDTG;wC(p5tUGv;7jQe3LVb8q{B(jYHCprfSS2#_H9T#!oq||OCdB$0rA$hOH6L*!_b7ybj1M zaoU}6l(5}zM_X^<%Wqt;8|U`#PR(ApGZRr+19p1+=_yP=|Fe?40! zZs^xWSqNuc7Kg{@H-il)xI(x&LqbBHy!!G*K*2Y}rr*`~gcpHx$BF)MzYy*}?#m;i zx^KEaJgGSy6mmSoVzHHq9sF8+@q(51C;84RG94|ZU@;H1=4F@8c3ZQ@n${PA)buln zGxn9fc%JArQ%hx?*mm&n5Jv=hWrCg+kn`%`A6fIYC(P|z-jh*P=xUbXdLX&6wM3zI#GYL^r=34)?_AU%rYj+UdCSyR8{6jKsj|E_jo*p3S%d zu)6a<@*=+x32CzY_7VkQ{(;+unfC6Y^P3dz!D|}+kae=G#!zSDYrK&9Qf1DL)dqnC z73Lga*BE96s$-)IO1zy@SJ<&dzZb4exf#QPpM~uGQICw%2wV>|yowXWUe)e-z{z5C zCH67#t|=y99Wb(+n3jBxv z_-e?5K8Z?kn2y8ApWE-7&6Pr_^odvXxbCT#AWo$vdBjq53un z#oh<#K&>*FTn$S1SH2%$$tf~MVKSir)sP!3h&iP3)3`Crhi}%e0d(VTF!fsyMzIB3 z-?!I1ij6t}S4z~w`HB17U}||7?Gi@9^UxcsX=dS>l|~*N!s8rMe8)tkp1$YD50Hvj z6NK~9{MIhT(~I;EeJpw`PLjgvyM2xA9md4cJ9${+aYJQheAFBajT*&nOmgHngcTT@ z)a}q4ozz@!wHsQb-Y&hjukny=MyVFsDL8NRQFrVzonI+MNK%M zr?jnhH}8&OL^Cl2+vt%|SM>-}2}kke^dhUmZ+$z2(v&-V8$1#wSR9#QDhX-w=qu^* zYA#8-|HPYxg0lUU{2$*B!hiGqU+*?;*&BlL=d|-@5t_$W`OXO|6QzerwJPeh78f4`+SO;)_M z4ZKwZwC>{Rl(@1U>u?xpW~t28K5{oI?R-CXWg+iqC%5OPSD%vfQcDp@i2JAFsX*>1 z^O+)+E9Z|k?B}oA9cCvLWs8+WjU{zAiDf`}it(>+o)c^tWM}ky^(*hYJiR!U?OrLJ zBUKx0-&TKCiGfwZ$_$r?Yvjc<;yQhQ;iFSxSZ*+yrWBZBH158Y(LaPsH&}V)-P9Xb z#b&tkdkIqeIQMKX`t>ifhXWwLmQE_j57Arryw12bXyB5cax2eFUAOTVTF+9XrIfQ& z=16{~+hN>6{S33q{kOlCWj~1`H|ol=7%(Pk`>sv_i!%2D?~N3ylGe?#S5wSt?MZtx z3;bA|6)zUgtQCJQYT};b7hZ>5L(qD=qC`n|u&B4j4~Z}V3At(8M!)sw8=n~?_P;D= zT*$xIT7B!G#^W(1(9z{|7FwpX(!*`+Int&jt}@wXEGCaxc@ z%Bqmm^P_B&w(a=f6{KN1Cc^-Fz~bCxzRau@c$*Tttc5zEE|QClsdd>S>;37$e{NuU zSjHE2M+Kre=sx(-veC*}kwbL?)lw`5D77QVJnuWF#(HeqE^G!mcGitQEY|#2Q66(juN=_t31%$XLH&*6YFkSG|Vye44MY z1Ma8coN&W43$I~1Q)0^XSd~UId_g1FTs%-k{aGNdq+}2YX-h$)?>gY|(nd<(F7BrY zFv$LH@GvS=&=nZ0RRQ&f^K-!RRTyXV#b@3h95OQNU~(1Y=h?>46lGWz_%*ftLdIFS zf)UBF)uT%RI(x9ezoZ}bSe)&=abk*(rC<8j!rrKLn7Rv{ExeoiC7dcBHMTk@DA4;j zj2Z(L#v-~(_oSM;qWNA-U_QRJ`U=PT72GTcqvRPAFyU2;q=E~w8>26 zmM`B{jJ-eN`^vS&ezoJk2ctRb^^7_O3;vq|^~6?R9G&0xtn1Wras9u)>*!edXk(o5$rIBi_6%!-ye7BwR$AxQ(diUrcvXWa?7E_m(AWrdzvc!^?e%zODG} zcYgc0T%%^>zcNs1PaIXw|I)f#bT-F)vgp}&hZUqbuc2vAB{q*rI2&3nlKWWiRm{r? ze)sV2_y#gffeRCa zXPKq((IaW)3fPs0oGi~k^QxU7gd*z4lG*}*)oV!M<03i}-n}CxOR+_SfE|Oj1l$8w z%Pn0!nssJ}m^+jBP4Q{%SOd1N7ddScL^U-nDOAdJtrpQMXE=Ww{dEe9rw{ouH4!UH zh~k6=-tpU91hs_|nJErVgX>*iODOJbjnGazDJX1m~HgLqt8*vU5n?trjA=P)_Z|!^81-hxY-IZ@RaHa1F-2Y8klSc5drX$Wt2~@8IdMYhsN#^6QllmE|U0 zrikB(3s}YIi+`8~hc-U>l!3qxhu<+%sR<+LDIXE4gK6*GXTT1<6Ci=Mmf1TgU<1e7 z4JK~fmF+=)-YiEXvX}Or-Gkzs8FFyS7=D;1GA#h-=JWEdj*6YIGVVOtS*9e0)g!pW z0ejeE;+v}Nm7GYlwGm+=^w7k@o*`~I7d?(yy*@usQ8xabZZSKIVyZujjd~@PP!|HE z=BrVmRq0fW-k2ksgRhPdOD!Z2if*;yQaKYviIMq=dYJtk&wfqTrEE_SE~!1m6Qf_K z)isXXLnQtci9A$8W`S}~!sv}_VAH_nk;#RSQuyZ!bW*NBu72hLXP}K3;r{EtZU-`9@s z#heE{xJ|xd3UV#t118=)_xCa*QQ;nUM-Jrk-v97A{8P))GaU$A$s+Jld^g4p{@as} ziEX}>nyDe|V};sv?yaSPzKi(!WUUN&#(k-HU;BeiZ;IgcJH%n=dM8GHh?-o0M ztBxJJHE!(REpP81${&)AI1}Rha#yT;vMA#>$E4KuMZg$Rr=_#_Du(;Zbeb&xc+$>C z%vrs+K#NZ1%CGh}qz>$xE^6xK`9Hg?B{Nb+LaF|-2Yid;)&e-Fnju)5QQk@#@PyMX z**(M05-$7dEZB)>LuK$lJ-<3Q!)+*tk=P7ctDRw!Jn?3ZEx0w$1HcIbCgxR;zB{v_ zo5(4`A{!FVg;%`FwLt=u0oV%b|dUiZ3#gyV$j6Q=L%tviiX=Ng|j&w|%cJXpo- zSB2AeZnYeuBy~4;G0&nq3Q>)&1~;)?cV1-8KQ9OhT}vGpSlmIkczk4{7}N8=Pqvm! za@WuSC6-Tj;jIOU|IIl~i^XH0|ClQUtwaJq94f^X?+xDV3W5DP9%L1JQsiDs4uOz` z3GVzl+TODaFlf`l5txXj0GXLj?M(Orh$I^VYtH7pSQT4WF+N181ZBLUDyTdhLF2s> zZV$5|0bbGoP8dRW^V}}`B4K>{{glK4I1@sLKytAYLZ7oe;8s)*9x=Qvr=9}dlmI2n z`;uPi^7~OBuiZOr*^=^lqZ@#jTFcX*&|?MlPk`5>urxq+oB~&nD^LMw4CYqmvJLy# z{4zlv`IgjPQ|zv<0Jhb`EfajXLQ`Mh;Bf?K0}DWuZY~s2)Pv-ovjYSImIazMm?&WA z-M>t{_v9+|!9?o+Ji;{jXR;2$U!TBOnmrszwN;O>?439JkuCiO^vDMtH^gQJu?VD{ zeEJiF`*Y1_?4LufVQTs4SXIQC65khT%HxIiS46#DJX4QwECtt;#zPOK?o8Me*>4Da zT6)0!f6j0uhx}hR1&i)LJR2qvxtZ=(OB_f)JTDwpNJOL`QswPz4K`2$uqq3fEjLnU z{cx~E>vql3aPlqgCs3yl59iHZet@qXA*@SB^+Djqr~M4_MUtDIb`KeY+&||`k_|ff z9ZE*rSGCmY1L3~Wm$IM+($T>C;WFdWwHxW`v;BtFV3jxmz>7hgh`2!ybITGkfLN72 z4YI}{0JPmVahETC%eIlu4}7mb1mBbV`#fA@Tn`r*bJl_qgcLCrFPS*lYzu;U{xsEJ zEs)F~YOFRzVrof_VgHIhN3OrmyReoRwf5w4iB4B18`^O}c4Zx=e%i`TcW+Kt;MLO? z=|c;Q>ZqrxPO9ASo$;3;Bw4U8wV+hLo*4oE-LoaP_a)Y~gg3uKyRg;5%M9C_A?WNr zSCgl;kDChSYYp07pF=jdU!vDBxe_NnXCr-0hy6o{st_{%a=Gy4al>`E+^xB^7r%)GjrDLG zD>Dj0>4}{sNV*c9W|1uLx?-wdiXQfUdc5E&@5CJH3ky1Jr69wPzZ_#VsUK^Ao`6Oi zVyvT%O( z4U2y}j}%?sD#~8*ptXu8YaU3eIHJBRs_e=I@zfa>aqm^wgiV*mcp1ZmK<+VDYYP@# z!)h_PC#V;E5qE?12S;Gab#q3Pwsa! z!+pErLiJ3S_8J^JzJc zp%6Up4;baVa_93jT!9;`^=yw&bQxLP&WC_o4pVups^Wu76&o_1Z@xInAX9=S3{!$x z*Cvx}gMl^4IT^eMCWh8lVuE^PGzi9O>4~yz-+3SFfCpD8OfS%sTxcXvy{T-E8#&cS z@m~!(7i_?CtieeB4aW&Tsx#))pN8hpgLqswp?)Wd|3*yJ14%%4*r^%z z-N#sZr{%9G!pzZOAl`H}%ayqCni@%>!`h76Qu=NS5((eegiQuf6kCl|au_*Qqu9}o z1KkMwmI9-0_BxiZstQMY!!e`!^B<_8Z&X=NoiOB<89pF942#&9=EDZu>YCgu{0!1WwMB8C!N*Q{}q&5}1-HKX%+cgr-4_dt<>+kJu24aK)r6I=Cs-BysjtXIp1`qjsC%U1r;t zv8!OZY)l%X2tBI(dn%u`lg+j~h5p8cvm@7DJ#6OB-CL~JACvL=d4ug41;VJ`v2C3U zV<}ZhE0uw&6-Pe%4$ExAaaKooa5-LEss1`gG-0c3|4sky(u-{l`_6O-Grm_Ks>hXU zS#dRKUv&vT+qE0D5E0RB)8IRJF44*!^-u%?66LN1(WrLpf#3D{%MM;95aHATNPu7? z>|U-Y3?0Uo>J_&1+c8;-TD}TgTC!|2e*h)H*duuG0ND7@6Svi))5P-+Q9Y|7m)?#w zT$6fAN?dyD#zYmnV66O87D4Txnm^wJ6GUZ--6dg6jy0e$kBAp5=u()}XZ>u1391l< z_^GcwR@^1F+qAn*3YOUCA2ilxuFhNWU! zW_-&{d#+H=uI7hE$yzT+MfYI>`NV}IZOmWI-?OR``q%`Ad?FJr7b)~42}iWBkc5g)3Pb?In# zd~pA6QbcuRMzhsb>Mh%x6bUSY^oc{`gX*JSJzbtri}sdOIk{-W`!e?XdJ&BfwAq81 zp<^S_%_(D*=W`62R}2P7Qt8nJG6U}9SX?!I{0t6`JZXqHdoNbnc9 z7|tpu-#@c-DR1L*qXN=rdk+u?VbOEMG1o6*=*G_RpNoAnl%=Igo*Z%~#ooRMGLnhCTuCKWP_`b)TFT6B1wZjykH_X(!1$E5GzUCGu-t+p&7ZeG~RIdn5Ge# zL%R_ARsL2D)-PjJ5VIe10}S@e0(CQEBYlr(M&fz#Y)}+)1i#8wCWhaR-?{HGR#dvq zz8;Wk~fsF;&O#8@|azJ-oQx9=1!#k(2L4GZ|JG-*MAjT)&*uveCfgbDQ#3L4$}VE%iVg{wUBL3c;}ET422`) zUAaeWjy!ve#hJG)yT*b^f>_+|IZU`%|Kn!_1%lf}uEqngOpJ)Gs{A%Vm2lE`p$l&7 zBr;;8_mk|AYEvWrnG$@f_189IEN0`8HELv)N%f&6o*NCA)T&9`ofUSv z>U17fF+82$W8pLGL?iviCFp$X-#RY3*L5fF5$gO{FC|4*x%#cmF$i<`UHr}D_feck z;KwpInO-5y4JKSq$Jy(nrPSC<1NZUq$b9D*b~5VV`(}mq)T}wXj{jQV5+vTv`{V}E z!SkA1JpGgS^5=Tj@sPi#n*8R)0^p6DH4h*?*k4e2t*~5z{C=DI`?j4<{NID-PrV$9 z!!;}?U?};Q+&t3AeJiTo&kb(f58CH$NjxTejJTS~9o^nZJxglBJ;z_irQn}nBy_hm z&l?Cdro5M@gVy11`&RjV6^!O7v9Jxyk4vBr0?la}%RzMUFW*4}BEd&9%Z=bAY$j4H zJiI7@f@;@r5$h~l^jtd5#g=x5NRW1_U-g?7F3yysrZkb<@vHc4*aRKfgx#n;0hEg) zAr&_1n4Xq1)%I5Mf14lcZB(WGlIr${7VZh+Q`Et6z#YVpCNxh-}eHE4uAPa@^5($ zE>nSoJuIYHmGj1y`#RJc<@l@fZ|J^H@dpY`kS_VRA`ipRGUl>qr9Qt8mbFj9RQEo~ z()(-GX}{h6(-Nwfx$msuvMdyxrjD}_q=@B^Ml-po;g4dY*(MHX)A|e8`^JpUVz zXMBhJ4;>Hqf7pBTcqsq3Z9HRS>@!2znHg)@(=v$0z9zIti9{sP3@z4dgCSdFD+y_} zq(TzWSc`;;7L~D=B}-W%p7W|c-~0aF&+~fj-|P41?|1*zOS4?p^`7@~p2v9{$BF7b zaP#=UP_K1UyyXQA(je&xX^J%$#mOYpx?XXRftCHEIBnr(mhQXWLj!Mq2cK|0WlA4B zm`<5QkT%JCk}w{8ShFP-Y<}#9Q+P;i4gU;)7cA*Z5a4g;_MnH!%*b29EB@-sc zf#YIr#9_u7W5p9XTzh@#w@H1|--OP^JT9@jbuM5BV-F(tQ|}Mng*M6#^t8AhAk#;r zG9#$YOm`2+fHH4CF2h13&;)AzawS;Nd{@C63 z9V->~h_X_qhPzVSLoUBd_3XZJc?`CS7lmWJan=C3jVg^U1YLr(T(@S~+6g6TNtk#5 za7N;lTkNS}=%28w>+L#t*DmIT$qf&oRlp3kV(K5M?b?B~7Bc5X$P-hw|6dPnO zy-SVC%#FMlh7L>#BOTtQ`Z)D(LNaLjC+=KKc%2T}dNtSY<=~ZuG3#f5q%Q>-lcmj!hC>F5)Y|wYu3Dveb zYM-^^x@K9nKM2jPe0Z7mudgRVV~J?Ua}?VEFXF5J3@yo-palo)j}?^}^6;H6>?YBW zBr6~YuEs%ihjXc$-npeVD%S#qWmVlF@$$rj+OcPZU{D%F*Z!I~8M0}15^Se53a21D z?{?OdTwHRWb2GKR6&1NjqB5#Q zlZb1)zht|DVoN}hy$rc>o){a1#;PH!#yM( zWI?_q5W3jv%mfwfy7l`Hhl~6SYQUM&!K-#7Qp=(7gVtffMxhVz90`7MUs#@5H@tP> zTiZ9#G2AAro=Zxdx^*ov&gFUhEM$iQJ)kN&d=3I*tA*wrD>%f?suajfje+s5;BHw& zJ}0ti{+;_}m0l=LyF_rwi)c%c5jzZ;a;f9#H+$;=<`UJ!_lQXk>=@0BWCCO(2&NUk zs1V1-0QF64&p~_t5cpCSvK@rHYKGE06YfwL{2d-qL2chW{v7h~vlO!{F43a>%lx1{ zrUIKM3aLMVJV=lB(b7^gXw%IPx7A+&VD5ff;+O!;rtzo7XP2~*=XHmTZ>jxAp&l+VtTw0)0@ByDmgro@+h@H>3Foy4uZcwoKoh$60)dEw zfs|xR?*%9=A4^7199%Nib=cxyT2qpL6~Hjf8bpi!b5`I%lrJ8!arTC{Q8SF=LEkeuJF^HF_n1!I;@M5W8nJegY?l9X+AID>SUktpVZ#k!k6V%bb13Y< zB~R@^V;T@2i|yPt(167X?7XSKUY@{WHUNz6Ec6Z=yOvi3J0=rvE6wS=1vdqYDY5@8 zSi!6VJM)~;;mgPG+&;2j)uWH-i--d|Yv#HSo@}JPJ5D+PY;x-ay`Q5jpajK52LxYhIx`}0o1 zRjqDr&S(~>=fpll^7M-{y~?L`!K&Lf%ou&WPc;~j6{eV1k?rY2Uf@Ujn7(shtporb z*K{sEp@ovx0^PCcp7efA(}w1P%?}hp*8Gls_Q0NVrD{{+U($$;&7U(yNpWqA3L6(4 z`}?5S8*v~|C3YhMmyHe^?w4^{n^y+-fh9j%(tYUCZ8R@ou)dv)CULiGZ<+$;0&dbh zo7OZcYgnqJHj?dU4O^qi9SCQ;vGaHZLgHg!#%|s^3;H4>PGSVzf zK^*p>^rSwwO9NSGLwVDWZ=tI?+*inbin2SNK8?Ycg<@QR{1~__+1_+C-9cVk*wVPJ zYZ^kxE_>2O(j>8=pQBb7zvvj|_P(#Q?yP4=vGTw1JT+y4+Wx4_xnYFg>dBtm{FHrydMt@qyQn zF`*xT0)Ja{gB?|cR3}F|yqFcnb@{-60s2}(I6G(4*X-Jd00qH1gEF4PS=b^Lbd0px zS%xBp=%URlkX#fWj4saoc3_2@|9_d?MmD)O7l0o%C74Sn5SMHr=<`=!?U#naeX$8We#<49X8u$M+#+ zhq33{YFt8>DepaiW6*emH7eKf;m`|8&6GH$~S25A~W1B}hvrHqd4MW0y7I(j5| zSoD1adWHl+wy?v8Gzt#}In*Oq@1o#PzxF3o9J7tLK8QL5v;*W!4|&;N)3khO%Qe8fH`$NuNV{SHZFIe z*-R#3^X9CzOp@yM=kk|N;Ol*0fM8P|P;6kiUn95?mHR&#b`%Yxi?*l^*NM;?aisGL zjiLdfA5Gf?-VJNIvrrD0qRimWVP zYgY34Brgy26!dnrG)g;!sD5it%;H;+dR;(Qxi_pl+dun{*C`1n1vaj-tACSE&5gC` zv)|2H^v%>*HL&%2pJGphiqMwuzT9i7{95m=4o35e;!`8B5g>Fvkmt=^QdP#$nfQoM zB1dfYyj#3k)xZTOjGN4qIU-B?0GeXa%R}3ZhEZzwr_+6JZ8<05|7LgvM%Og_g8G-P zx#KiMRqE=m3beo5Kp6_MhJEGe4(x)urJO5@t~f9Ke;9s205b7Uy}>+kkcgoyIW-}UhINtV}Gwl%9zW{T+R ztLltL?PTJ5W7A!@D)08<;Emgm5Ta@CY3si+{8q@;k9PY2?&4KMG2Jf`*uW1_FB7j@vNGI;W3HWT5S^>JnrQ*+SU&RTTb|-O_jEp4X9G zPQX6yqH49<40s@{Iv0=jMX$C5S&kPMErKt3z63)kFFI|`zN>pTdOWG1_GKIef}KJQ zp>oOk@bgu^iI0V$_BhAfsMA~`*Vk&^qgpJOO3C8_!ov^yq$CESMDI{ed0GqBSS%R& zSkBH=&(z3ippviN7(Vk-cb*l}6OcL>3yJ#>;)RtXg=JL)MM^dI z-Ng@+u~3~k;I{1}6f1Ubc?jH(wO=#V`)l0ja$_G#KpL01Ahb>MHJA82trn7va)b5C zUN}FwaEkEFuF834Qt8{=(&Lw@D}a)1{^VZrB51|oVUo?Ez>-7h6Fsla6l<<|AhG*W z1vX2oRozRqrtEGPwd7`Etp3-$qldW4(qXUj3ixmty$N~F8)R=Qpw=*u&8|E!c>D6N zZ=p${DJL$8@)di(NdA&CrE`B5P_Q3supd=%QF=jvxO29&4#m@8mEmbg@+DGtLionY zjpXNs!j*lSTOd3*9cqy}?p(&`!kf@9$6>dnz>LBL{R3wKf9FD5lUek)TVmNj9REz@ zPRrXn>x|w&9IWEL-MixA`7lU*&RLzI90>=;i<&az9td&3r{eOtyJ{cRe(jr_;(nng z&}F6OE$#XK>!3COjz`)84^9>>Lzu~gqKfDPp_?_IH@<*lteICp_q$CdR5J^YP?lw$ zP3Zdl!v%0vdw2TT&!wK)l`Tl4<18L(+FB~80iqD|alLE)iF%MjxIhTXw;T-KSeV|s z4(U$s>>V~)zPCfSMc(nYAc(^Xc}Fc<$5j>uE8qL6&rO)mJCJ3P)}wT3AtseSL)^M5 zZQp?nRd2C%0CN|NI>}U@fl4YLa>VXOB3Xzbgpk}J^RyoXHavyJ6$gYKQ9mIH>dqfX zG8P5ehpkf@*4^!ohA$~iv68$X>yhRK69gMF?1=25dJmxmOXkGIq|p0LUG_6

SwM zA?0m%?T?UbvX@xAA9h`Ykd3=?>+i$;t)5rS8wrh#n8{PX0 zyp7D>>+d%rD6V6Bw=v!&X5=TRBWL> z%kI)TlFGzKNNJp(uq|Kgi=efX@aS1bM)vOXT5Yn=XUe1G6u!mh9D zb}n1WpHJlvUmJcB%9FAApQVDvaaXkA62?Li*w@rT!jX?a{$brIEQ#yE^2hr{QJqSR z%MO5sW#A=l6+4aP!*PN&K$K!1%U=g-_}7-e4Y?#X@9yu=ylKHOPX%p8*U#R>I2{~+ z1qO%JuJbMa$Op)hB%_+{HHj&88!tabs0Ag&EJKe>m*}`({1RmKc<_Co>0y#!%uc@r zGm89<*o6uRqoR?lup&x5=2nX%mLJlAHbth!T7zq}K#~!3BC}l)@8qSWM$|P|iVi?5 zAO%JcF?xQ%Ae+j^KFg$OFd3&=pEr!(gV;qaF;b%*@=86%ScIY(h9;*Mi)jf&vH@Gi zr+Jk~9e&#Wz!J!3)Z5wf&H!|fIA+x{2brv}aShA@)kFcQw$yv-H)p0(YSvxY`cCZy z`LQ;ubI-Tg+zT2vC$8CjAe+&;rX>s-KEjmjcN+Sn4F#Wp6|H`TOn*q*69am`lW~!W zzmm#pmKq!NqOZylLpS=EvA)r86&NTIPrx)}fr~>dX&LD8`1!R#IN?t)rGyRVHXtAZ zg2nVdx*|K>cXr5{va%`M3-<-r;J-pJk=Z}+`r59X-9sF<7tTFWpyH6;IJURkdDDh@ zZbE>zb<%ldreAt>!BmKan|im}t1#|7_Y2`1H_mg(XXXwsr)XSv;LKrv9XY+JRauZD zWO9p9NYm2?kt1Baq90(?U$vYO3*4!>bmw+r&3>3wltd(EpnJXgdn7tR{#Ji`vzD>v z=t&YNwRVTDK!*UM45>*?Zs|sb6}j^UWTOjD6Q&~fhmrS-eagz_%4CGmONqHijy7E{ zW;+3tjPu?CVw)9_P}>%3AoLg{K&~yy(xc{Nb?GMz9Q_rE`}w=cEBtm#D{sdQ@g`BvIVE zo6*B~T-k2{g<_KE4;<^*S?H>D{>T1Z4IcDh$K2jk#`E6u5GsY9>gW$XI`KuiN8I|& z?HiXi#w|0BGnNtl0hoW)w0#;BrIVv6FP%*!pqHs_pQ-=wqOH{M%TEIVjhb}raR(#H z@Bz;!-yGMLT}YN(}5OUQDZsepSRiuXRM)KxSY_jjJzCa1*Ot zH(~Ud<{*G1W{-bt?DleZ-ty+2FhUIjLKf+8BGvl6C(kzg`) zztJUosmuzMqlbjg;y z6qoc72|+|~$yWhnSm-21wpbYt+T)iLK)Zs@*sT0$I3<_o{T<3%(| zM{l(7hYpmGMEc_}VU^E%sf4{eoF>#rVFM|S9(?{<5`h(yZE2>Ds69+JKTTsWp!PnV z1!WPGOoST=WesSMp=3mSZ0Rwh9E;$MQS1uYcZzk}HRu^eXu1lkg;9c0dG?a#-#=OZ zE6VI5BkcM>u`FtA7V26Xzt?e|$>##nZo zFE$19V#rX;o_nN$b&EA{rPP7Bj4h?!na)d4Z@C(1L}}RCfYz(VNmkB52ebqd!J5RR zE{YymFI}@d4*Pv<99XdK+( z$1kEvXxNTcDJhhPmI;dvPA;QV)ZqlM4U0n1;q@-sh zI4;aQhU0GKc}5jsXNL5r4~ZHcqp9GqG~S0Ux9gI`g*jb4Z}|M&*)Dwjo9ts%62ahT z`QnT+Jd6Ci)C8?o(}~`Ed{$}K@zcF zIkEaxw7pk$KZMHdczW6?DP8lrjMN;*GYTr~ zlcem^n1JBqS=%^*Nv3qn{6J;>bZYP|()K=8tL!k0apeS-fE~jQVW&Yz<3zh5nRlK% zOzK3#omoQ0b!!0kdM-~-) z+F~9&2j~V#=()5Mi})lkKZ+YTJ@%9@QbVqnH*+u^&wwdY0#k0%Y$et;&hH~u7ANcy zwwsGp@!p?yMsDeP4)uLvD0x|{uIweFY}T_vm+sb}*Ub?wra%ZvR}V7MH#mT+6Fe)} zzODV0YZCF6!u9R?#iC|ASShNl=8)$rPX?Un*cOD=&ty7Wt&9Rp zkN&HF;)6#A3n zvjbUs4*WbAbAWW%^UPu6y0Wv@=YBwG=-=ZtZ`tJ2Id4iFv9lxZxoW_0so@A;(<4!$!=!yVe}=5dOG{1);YO`tl6ELf2!}@sEO%+l z1Q~5lIi=n{Q}kr{$${GJo|s&-%bpg@*n4Tw$~PZXR9j!yO7G57W3FjU-MVM&{OQ|G zH@g>}_ekA~@_RvLyKl{?%^qVUTR!!UHA6k<(zWrfeleb5Qdu!0Mt`B)_`?0F9L9~_ z(ZByOaGM7LGK%C%tlQ@;+k5MGo}Y^G!iHb^pyHU~ zsEmY?`iYxJpHg`Tp^6flH@qyzR;vc4rm6v-sC*IRpsRCK`Q6f{uAcJL?n_JCxbBUJ zuxH=FoQ3t=gE^ZvZ0U>aDEOs4m!^iJB5ISruXXjNkT8 zm~SKd=ZTcMdL_M13f4K8zuh!xf#z-}KN#GVyZ0r&y}n*9rp1z!8_3fy>GH60J8eA8 z-K?2q>6?sHtg3!m@GQlySfnQJ`Fa`KH+aCvG?6pY{gP+CX8D0dK-u%JWd>d!$UFC7 zR%PNr_wv`F%-195>Q%Dnw%guYmyaDNzk6Tm;RL8efF4f4b^IcRqaXsPtUEu_A=lCP z7kp{Fm3;}yo0RTvYI>G|zT!iAp1@9K@NxQNU$M6!oP><@cV&0b3^p+d*84JmPSnH8 zUfwACAtuET2E13&{Ex6f8-FSCxE8`~ZrRD(^w0;oGDrYa`1W( znhUu@tXGv0HeQE#QS1kO`;uc2kjA5sQk)e)8>b&$9^pVd%n|&b3CZu(gWDjCaux9| z>trH0H^e!qrLcUPt=a%SJ>?J8S|(r-IR`(#5u00Gr()_812I1jpi32N?jJHEsG*|S zM~u7AKq=b&uOcJs-kz$8L%-a01wN!wY`G9!(AS_UQQQ<5V(>uyD+p5wlzaNr+ zM_a;)kpmA6(92L(5MK)nV5D?21y!&pgj0$XtyoZZjt~m~klu}?`Je}B!>U4IZwlzn3c*l^)oA-sIgrQ$#%ErY04&y{1+B2)+rEnM zw2c}Nq~Pg6}E<-K;w3h5dVQ_wcdV$;xu+ERH-SF zO+TRyXBs2n(*R(|wsGL(yMSmXf#2|bCX_|%K`D$4jp>8Xp3@{oa#jZltI_Yamd%3A zJ(}(yaTYosI*@_HRu3u=;dbDLPeExi3WSZ@Pn30|>OeaEIJCz4M6o!Ka(XHO}Iq4`cPk z5V6TIKByCRQ!9kI1`S{Xa4da)3pN1RKO4X$3G1t^AO5Z*p)^>?hs)=%D_h?lj#O0j zuKIF=1!jc;(2&Vd=qL6L^&`@p*Vf2zGh)3`k5n-lYmlN-FQ7gyh@zME=y&z@DN?;v zoFnQ1FW%GzAQee5`5>sa8|Cq3Naw!==7XSd3y6!fPXMo(1z-?2Vlht!zlwTjR`gOG z5FfrnOsI{kAX*7qI?_L&zIOH3w}sD`gGlL1s3fx)JYB?$t>~I7m$kaq8^}d;BVsTP z6ZBn3G_{a2*u5Rx5d>llCc#{Pjf^ditI2m)J>z>dQNlku_M@u-L(q+8 zhYB6(4r!FMpXmz7)cJ9oSK)NHq-zt+%mI;zcUh`QLhFdqxQBM#OJ%p_y<`UV{pAC0 zf#c?2{X0nYdBTh8J$*$B5@4&+{mV>oU_bF6Yp(b?KlI#$x#lP0S#TkL&DKVt-9{G# zh&S{XP0a#F)0`qdQ$%-%l1o#3zq=sWP&pe4h%l3_k(>z#AgKSlB6>{FUnf_ zKo>K89{}&;OSB!mftllSb@o>mFn}-f=@*s7gV^2HUk7%mYaP+8Cog&4h-EcG$=KiA zfR8&uoK=s>5o)6I_};#rE_UP4Pv-T9AhT(#z!7LVr0>LGn*3qU$Ba0-bn2GOtu#Sq zEXv*>Yw?h${vNlsN||pU)fsI;HnwZfTG1D%DR;m~Y*bb`a|X7;D8$1c+C^sVzJAS_ z78z4}1(!G9lf*YW^jOTNtlpjCl40XIB?HUd$8qln@Q;u(_%Rtoc;PvAR5$I+kINWL zaA^`CgNBXKMI-jNb&c2@)zVjG!ZKgoDW_x-mT6Gjrg8ZaY@k)nDGNu>%J-OJ;{qA0 zZNS5CE4yA&is0`##m$cb>G3PD*V@|1JpQ(4_s%V^xy(krNL5!r5vlP#eUA14mu~65 zkpssoOiFybIaVKAMn11b!{hDZBfWvplgN6M;RJ17<1taPLgv8WQ+@(O(r*YnK#o2R zBuY~e))Zojln(%hE85oR=}ZIRI;k(kQdJZo)F=|{$m}?c&9qUu)?aY0nkdLQT%fIE zrkrSD}N^V%r6*Nj8}-F?{HG^M|kH6gPv{ z`rBQ81=S!2`sb`L5XpK7y*8VB>NL2lH5t=Y^q|+0vB#XrWpI{DWhfgsmMFgVdYKKF zo_=(J^Q5!EiQBuR=~A#8tlw z7)&UA?6?4Y%beRP76c_2Rfh{@l3ZospwND|mG^}zqKbo&MHuMaim&F**LxsxQV`#S zyfW-#7d6GUXGE<(pvcYPHg2TYH}G(Cs{8wP>KraGrqZT3xi~e+@jk;E=w+UlCm%we zKD}9`tsS z9SdNg^dEg7bxn}s((S};tr_FG3OD{EEFx%?V{_P+Tv)Ike z6dB%buZ@EZ*NpE%H(ZYix?4u=mUi6^Kj8%CZ>sThx~G_H81ZNJ;i|45{R%Y3v(_JZ45* z&e9|-wq7_OHx_c~%#O2$x`L6X>Nje~_#iQFvC>#|U<5)Pz1L=Khl&Cv?CN$rH*P!DyNGX%@pjEHiA0vzhCiI<5yhjo~oD)*apa6fM|Lfzce2N&h^1 z@8uRZ(T_mAi?LQ%95tp894{sXHmv0yi6f#2q$&NKp~2(_a!kDRPfQGmJUmZGvm);4!MT6$BvTe@h%ZKs?!4X>LD?Wq$D;9c z6GvNe5+D!aP!+Yac>LN~?5s)!Wd&h7gC2pNG96R(b-Vmr1CN zr0o?Gj_|l1&|&(;|0Q@4Irc=*_Vnww$P}5WcXH3WcF*rjpEw%w4aOgLh0Hz$F#{J6 zo=)?!7w^LhOZV@2RG&VJGXMHi*EIAxM<@5a6F~DDf344f;Y}&kK zixlZKBH(P?WTY%1PcOtjiO#Lp+Lv7)bvfpun6nzV;n-h(dZHsIiO2d1 zWZEv?g9}!wlf+b|(OVk~+9&(P=o_0DqYRPem>}Qe9ZX49fSYyk>us)zM^niKAXFF6 z-@xQhRp9?+nhmV#UXA@70uuv)28snIE2&ZrBsky=%;*9U()qH%H1}zilcyuNU+Xsp zlsY~0$JyeXW*m94_gwUq8rMN9Hgw7A9PbW#tT<7=Nk^S@I5hEYKGiRK)sz6r0_z(p zm7BD5lCj=Kmdwa?Y_GZs@8*C@!SwwK^Z|2WNF3 z2#FQvo#?^&H$Sc4_LUkY*FQ27ks?V+&Xc6axn8#Y8|nlPkC!aBD`q0!_Q!0lp66#lS`wnJl^ z!Xgu?9|!AJkXm{brq#Hvo?k~f$0Pc%L-9AGJ@v#a*_{-^PHuAw_Ct!@1_|=wM<5u8 zzvOn~Hzy9_&&s<}4i^ymh#h#}{hp3s6tyYI4wpPDIqS$n?>Mj>s|<$Knkw&b$9f*f zJ{Emzr+}wApYFdymWL(e07uaa{P#evvI|I2o_-P`ne6>T$7vNi9Z*YeBPkP2h}#W) zkNv|17$*)=33?+_7pfzs?3sI?aa;JS#tf$>r1~{sI6)QEpx+zdRy(+?%CzBnI%Kuo zAez=k-0Um04kh6+M!T^t@3tGUah+MEm`4OLf+m@d8%f1gHSOT4xh{a`o!Zr_PJgj) zO!%zi5ecR&tDXL{pUyg=+5X%x4C%AcFCoIolr1r0=F<50jfv}PxI93}h~bG>iNm8dD=AyZe_EmnU6uJ4AGo&hTgHPi>eBSnon$4_ zdX$KPbcB$>YoHtVKMIqWO0wj4;l9U-!*WWDe6Yo0Xt}seR{Eoc)%}r@ti&DWo7NbF zXx$Z{@!MkTrTRrtBq9@Yiu@HMaT30gJst9S6_{Ar6~YG0YSC*o1CqygmaHt!ob+1b z2^2hZUkW#mBe$1=Qt(M}`hIn>yPRylC~ zD4YXROJ&QqidmlG8+xzyULFr>Z)(`v_Tbt+RzT#nj8gyhnZa|EDQknlN9$dZgR(qO zQFOwP%X~uo!_>R1qP;oA65cjW3#}aOLOZ!%s!oRHh?YLfcLS79#Io}}_$+nqYnz_K zLjdn|z{fh(1_UJ>~cFCR9f@{Ls3oPE+3d zRd^b2PjpD2k?oH0=;LB!BE(4qj(HjDD&MoV*Pq;WejdFlAHdnJ@4v+^lZRyGn@%v` z4Iw0wgl2ZN3n1-!quZ}#n->RMOxpIc{8j^dc#IZtbT07O&rdJ!AT1lzl>rX2RaXn) zfBnE|+-2nm+cu^C?X3CU*>Y}c=Q){4$KKj!&gvJPBE{2Zw-vay#TuJoAFuzyf2z*cI-6@C-iD2JF=rz8mq zkolBF{c#1lpJVhJ-}C%n7;JD+Hv3Uo-=>XlUR3nl35?H5c6HnfiRCUK3R&=;E$znM zfs)q(B+Y&~e$(O3vFm%^g^#h8VS+WvYFE9glh`m>#J&A^;za17jnh)j} zI}WPh`p94^;D1K3oh8f0J!yEKCKHbUEE?gqi%(=u?a-1B)1$tzO`?(9y0%U_wpSKN z@tbqM6#Po8OYMt37jT2r-rnDRRCL#y;c+B|mhld% z9K~*R2Q`z6D$ApC?ndU3xU!w))l#CFI0dR6G5?LWOz}`;;Wa}eF?xZWOF?35@q2-A z+o=#DFWsmUw%`)f=tZ(lfgn1>jh}mg+c)%>Ii?32A64C z>Fb*soYAs*70^Y|bi1EW56M7kmU3%=*LK+A13AO~fai58AQ{avyqFgXW80W={6{33 z7)h1!mVz9(#9f#ju0yxjfXZw+d}yo+5gZ@Pj$p)R-;A?~U3i{(U(sQ_P`SxP962-Z zBbEkoJ3plSu{1CvR2g7iZd6%T_TEstb>g(=*rH2D`o$lzHoPc@kFOY>m~-^2q!ZJh zWsCBv0V%az=+EBKe#a1FSYXYZ6|}qVfx5wm93@6-29CIU8D0I}xU2X)Yt z%kW_*uuOn*Y8I56_{=gjT#Y5HETBBXmO|If7L3EjVUrkK;_b#DoMVdKLc}a>`w}x_ z3^&na(i5*38DcUqw}na+E^)9P{GJPN!7f#6BYJC5N)>E6aWr8q3pgF^5sKq;3!RrG z5PnkaRSQ#7C@ii$f@~mmFJ2fuZY&+;Y@|R4mp~xslsCGEHlk9d0|Ahf42+gB_oC+G zC(n08r=}Z84qZO6dnru@KaPWJ=TLdJwF&BwA(Ym=(z{~K z2*N0!54gQ?x{dJ%#+Zq%ik34!E@5^7b6(D|LJ(TR=umHCTKoacn)E+M;K-W*JeL<*7`coNuXPm$>tKq)7*&kY{cZy zLx2^JCV^1i83C0~^`xb5X4RR?PZ{MZz2J8Q&c|0=pe0_Cz5^eheY)GhFf~*5SITX% z>BK+;xEGqof`yb;D)worCO24AEM@LNOJ$pyk?@&)RRdP~_#b^Ug>u8Rt)vojd_wYm zAo`f^YO(rs6=QYNr+9e(bE-t+2H(St?$o4!Hr+%J}O7WBQc#42D3x%0AvRhk}b>$cT0 zT+ImQUroUZK_wI4C0O!^7MjmIeH77_^m*V6aFBS1YE!4)BcN8asEkp{mrOKK$jBr+ zMpj+FZJ^i4Ai9;uN8d%TKPhqMQVlrP$WLhdg@h0Mp ziCi)loZVLH?-_q`4+;wYrp!kG-fn?%&|*_c5G4w1lbF#xcroMr34U>*ol(t!C zZ~Y?ZV~h{)cnSD)&d;hc$C+ChBTt^YR#$8Q^pAib|C=us0V;?ffytEPr~trZ$hp5t zEo(0ByGS8ogjhK%Fs5Ko^K4rew?|ai=f+57=98~SmaTUJ@d!Cvtq*(eLlqN}8=I+0 zO`g*5H79W`hUmcnQw&jVXFBUZ!>`h@;$NdDbdrz~!cW-NJ{>(WC?{x zA!W{2TaiL!=YLm-+^mGEK<$0t!`v6&sVCb}jMm#yik zrlSaqu`_N8mNuu?f3e6N<5KKC^$Y*-XvAb;#o>p$f1Ag}g=w)@1pFQRyEwR8tIQz) zfbSN^%%)Ku3fdHXnOo=ca=F)jg5`4;M)nDu#$JKm;#Ncm;VVT#oy8c_@Nvg_M9_F z%oRkeh@CkEBRBuoiY*iYf0NGe$1*87q{H=*GX}rm2;>wv9VE&AJiII|Z0Qbd8K|-k zW-Yh|cY^vHA*UfHg`{=rfDJI#@S{XXzI4mpTJHq`wz>|Ly`#Ed2p&`1)aSp>4rGpk zP&XbXU6M-Wt2D}G7}T-=wyLtA`MnvcMXypQNidVfr}_H6|BY81kePMq7E&TF$0&AJ z?wBF;J$a5Wu_>qt#5HYlU1=!SW_=JU%J&7_M$0CP!-)|y&CcQW7XLRB_5bo&n7xTDN^%`rVVt}T zPd4L^;OV&j@$ucNQ!ZE1(Sg~>xSm{d6OnHS1%>HtY%eWg#r8s=FdW?-ji{{QM6xaV66f7X zOGVt;WdAoSYhR>@{LlP>E7gxy+n{vy31jmaMIXk%vo_@yWavN6-#X6m;J?~n|3Ce# z87S3_5T!b@Sj7W%(kZj(`}{XO&ly!96`{KEx=Hv4y6Ze(e{2{>fkSqBFNnMT&$S~! zjs9QFx~aB%W&{BgqK=k&@%{!PN&nCH!^`QDlcxd${tlU{2r`~~8MCm`wX^UGC}lHX znNMeqG3`5_y*jy3Qw+t$3W zl(`WinJ3ryUYUujggwJef_Pd-C^!@5qA((K+QJ0j9t7uy1OT z_p$tjC@mbM&A*Q*Q6THJt;yeMmU{>t9P1+-u#|?Z8n{F#T;hkGj4TLcPYJ-yB9i4U zB=LECa_1FW0qDteBWC@F+ZMSL^qtr+&zn?~DsahSVm^dg z40jut3aRok+*fM;gLKL~e(KY=PvxiG@nK-Tz66)H%ms7y?mk576T`DR19xx=bP{xg`{K;t zt8mg=wRnLfA}$cS@c@w^lpVE(gD61zj)eJ8Aon{|^9^`4h>4#7WL#$t^*A`d9+^Zr zKvVOsSvEP|`k#JT{HP=fye8v9YaV22AHBf{LvpYEw8nMyh+rGh5+kZ14s=;{E9B;) zh@fNYc>+ERe}eB>3-9N5G6-5xWfe*Ym|QS1=T+tX=h`5Y`novd-eE$ zC6FC!Av9Lqw-mbiZ8ZvKBBGBg6%>A>VV=wOXO@VGL}VaS>_6t-QM9ih+q%_WuL)8Z z#vk%ufzz$JKv}WPT!KiLi71Q^Dg6|1KBIsGt&5l?y8sBtiwF?kg1~`^IMYG**2S=E zd@LWR3dioKMc6xt4KmUoMe!?q{16MA_%I&XG?VOMFcc7_O7#2w0)4&YKCpQjz-==vjMB6{?q-Y;v&M_jDmt#q*`-Be^RGRKxGEBOQ2OJn?fHl z?o)_4_w={2SJo^T9PggF2hI@7(MM;7)C_(qd5-<)Nvs7g;5cJAT^bLlnJR?`!iscM z(-^bNJ&lGw@Zyr|UFys+R1$wz`i|8gqm41+Us3Je}6fne0SQw2dFdyMp$fgrktG8kdw*LQAxSMajxha6^OJO6lFrPoV9C%v?Em3i7X0=Hhz-U5cP)pX^CDbCNQVJpEc7 z7-2?pMZ{jj>|qMPG>)dWVC-H8SF~fp2Sn%2{RHx=lKGyi&FTx;i=PJ+2RpR+e^jd# z;CRM7Usgd>JR&%ywnjTNK_U-*i3ov~`)EKhdPXk!0LZ`N53I89YS2Top(&~1gO8Id zRzlI(V)-2Ze)TT}sZD;v>CkHiA>x_pdx9G1e2MP4Bx(iZ_06;Fxb{R?k)?>Q@J-3n zI5wo|2NjfbG3)m2C!PuWz~?d!Jy32dqS|4D0Gb@vyzy%bIujZ?(X(A*lA{imrnFQ% zT`Rt4T-Zg0i?b=p%wOHLfMA7`s5_@KE+TbgLYcYeUIz>=9)m>@6$l1S^PU^j)cV?}AEhC=_Q0X9yVF<)Tu#c-_O zPq2dOOef!?CNZxDtv*bFZZ~gd8q*Pf^X5FFz}7-r@pfx@vCL#UeBjWZaAI4^_>a`$ zSTtof>F_1tz{WcF^ky${qKy=Pc3HR||AjH&4)Fsus=MO`*S0I*`M`uWAo)S+xD>PD zd*Hv?)bVj}1Z>A2`QnmoT+oenAlmr|P7snUyxZsAx;A@JXIandV;3NyZ0>ji6~JYK zcD@EKGo7@bD$rzGR61br0+QtOU*RFv#~ywra2Mo@B2`xI{Qx4EHj|<>1#umU@v#qh zQjH`l7l9{xLl5qB8tlT}G{uk)DoJGC!&@ilq|9Mmc7fT7VjYOGVr;h?VdNy1U>8lW zuIp+bw4K+2#z@%-C#3I!vw<&|*@ga&4>)8GLwuup$uONF2{A|sd-`6vjw7g@v0*>r z-)N%7@{WFV#{lZ(DHwhNgc<^fWw}rXbq!*zs!=A?$*qF%Ht7 z&U|J#rTrYLrhJ{|yx@xv20i94>|r-0_-N4^XS$rp>a(Q50EClB?8Nw!*~TQLeVA@5 zbOU>_&pe6+*Qga80I9EEvwt!A0D^)2 zHlq7a=ffLJnHBmJmu$yIR5_e4JKzCQ&JV;t_<`|m`~@wRmm2*>skdo*$WbrVSPk8W z^|+L%H!l3jkd?wjX0tOC8yC-!Comq36G-JG8q~_F+COf^5X@?q1v_z_38g&(1<$@8&635oY9l=-Xo4BfsM^v?>{Rlz_=1 zYjD|{d>kn^(RGWrsp?G>GU zUVfj)$1iBImrs7IyjY;B6zduzhR!iCK5!OufIJT5jEDX{gdIwJGA6QyB38`fsai5V zIPJ^XkD6bCKfOfO9If6FWStteoU7JLjJRz3{Ri&+u-vb4wBUkC+-gIXS&K&EBX{ly zh1opkrYwnW=Wh$oM?SYKi14&wmlUtZ>XAPu7rkK6*Z%t6tMAjw?Vmlo}R4CpbrmX9NQeqVxnQA%uJ?DpD(@GrSyVUtu z*#5JYC45{vbOupWD2hSkoL`(dkVZj5=dppK-dtrVu$APheJ^(0xRgS1MtzEeT*fR{ z5xqRB_S{0tnrm1e6FHt%nov}G)%L+i= z-I23TH7&$ESB>qP{#n>6|9r$4I!;<5r8kRQJ(T>~+esPaasb$Y+M&SP8Q+o_rq(IS zUakdUz&02SUnEpllz{At`=J~Ee$;6Qr;B(p(&Reqkj>;t$HP;_<5s8;jK4tD26&Ww z?9{bdMWrFKT=EXc-9}!%m6GkShOGKw>XQ)5+^yj^j3_LCEB*{f_+}W~S2p((|G7Ej zzi0ljv-_Ji^zA}vXME)T*AT*okEtQw<2?G|vHzSZJl*`iGK_zFx@h*E=GOQ4V{*v5 z4TBCm+A}8?{sdjk`ElJp-zJm*$(8Xzjb^3rpO{RM0zIehbczx%Eh|zgLd*%Ss3%4q zyswAh$$BxP%g>NRA{Tn)hHmIh(K^ia8gvS!s*d~8DVAKDBcL={6( z=&i+j7{++61^g8ao6F$H=PQ#ttFWzXt8zFK$=s=y!(nnZ!mxm!OxS$xWdjsmk(+JD&-3@~5_h8(1pz2qiJ#C1Dn6u2zp41g1&>*vg}@*0?=&}q zZC#yDZtOolHmugTu*G}jNB`MDR%CPi-WC6|Fn$l#93H;sd(@Mf^B&)jCl&bT3;zA- z$kdSPB9-uc$h$X}-AuDQ>Wm*nmf4}d>1^`9FEj9w__HIxZ}Xdcvq`?s@>CPW8?xk< zgs}FjzcDv%XoH-=RLNpbryN2y5$4gOTxA#kY$7U$lyp)l(y)p6{Ld!xKby$^CpMA) z**N}ZsbaoXmd0-51tn z)B#~t5S*s+)xj;Y@qe-Q=J8OrZ}@Pgsb(t7Ap0^imIzs*gc$ppXt5R9l0qSCmW+LG zNVZfWX^}lCk?f=%QCX5KDTSm(O3Qm*gX;Nyzn|al^S+<=`Kt#r_kCaYc`fI09_Miw zWCNkb{^YhKuP*`g;FF}-AV`W2$F4tzLl~yk zkKMN~2OT;67ImNugI3?_$J^V7?u9oPN?zwcdQZ2T!(#CF0X4}hnz;NOTAL!FePMke zSbzitz9nM?hgjku>rs=!6Tq2cDtw?q=V5x1XVwnA1zfsVl@WV{V7cp z>fznskL{Pb0;&Kxtp~XuP8~UH0rKucavQ_YEr)0HT7o+7+e;DUM?nYF9tjs6pMsV$ zUZl^+z%_sUGiXIM*y(g)3(Lmv>gtA}jq%m+-+jtQfdQ+5V7t&JpZDP^Yu{B?sYsP| z_#OGaB``4S?YqLF!mFu#uRpyx_qH|W%e(liZQnl!5)oPb`7v)lje{?4PwX`$LX+ZjSNIHrEDub)E#DMQJcO?4A3_iBIIo<*K6^m@bo4sty`Uvl9A;82x zkVR~ub<%SZfL&SoOeN~R^qdAsIUIsPIpUGG8q4FD69}HFf;Zg&l551*NReoC8eqfe z5)gQfM7mYTlH`%@D`YzEuo>CV@F5gU7CH4)qZWp{y_*3Hibg0UsrfnlU>KA~*Xjud zIH8`&JP#$LW;_GkKX1nWL7i!@1)-A^wX)VjL!b4rchG@(ko$!*z?aA{N$)~3kbHJ* zQ(S$rCN>m#1vq^Mz(KcmPV1@2F(^6w90sHS&j4$7=z%DI20mu`eKrEGkn9)I$U)tF zO>>^iGvSIDiOml{Cl+;kG9wCw60~-X{DV4?IBa=F0itIHzM{t*sQfkn2F}^k2f$Q| z<)f2x$d1UYWbAbl=U%D0&rnK_uixkzH`gm-DvDA2WFgW2Z3FEb-e0*yQX4ZSX1CSj z*620ACb3RB&eE;thAn0ryFWClG6aj~b|h>Y5NFaU(Y)iZU#(Ha7PX5sAf5`L;2k^< z^%isv+460K`xAc)z__=7W*3YiSL7umt(6o`s)8ourj8Pj86w3cd=G@l5>qcAT9=># zQ=i#!awVS|LF|0c2U!p+(Ic)dO{xU+GaBq>)C&RSex!@NfpY!T4o*2!&@gG{FH-J- z@OB4FikE1my?U+?h9{ToFpTV+ipg38jkS-GQ${2%W#r~Po=w>FFh;bZ;HyxZfTo8*{wPtEz;jC1O2+XN9=cQ|qo8U;`PR4(+^lvdtk9I0B~>|W z30ocvN)!OL#^;Kw3G-9>$%8Y~2t^J8UE^WY%~&sXpfe%1GtNbSU+ktCjf+j2+i8G! zcDH^5U_WUeQIE)lB(r1z7HuhWuNCG%fn+8g{PXMUyw;dHrFQYWxy`B60{|kJi#=8b zmzkv`hrSCY+g9cT=Nspj@pynkiJem>nICDQ&Cv1M8zLyY^+eX2xMR`$Uiuv?M@g(j zV=7iOB=kBt4?3ILp0PjP5tz1Cgt^^7ZhauYYAv@(Mk4coDhoy<0eqcSL^EkNlY7Xm zpov1{Abw%v6M}*VDqHE0r6pE5ABnh9REdnO&Gbd`=&p0F+X9Ix(t271(7h9_UdQw` z*zef-TJlBm&Xik9Z6c={6Plr{q3CQxc}Nx)g!Xg+wFWkORw7|9;dKnY&l?vo7fZPR zGZNTA$B;9Tqk&>QpvQsp$@ik`3|@)I>GL{11Pne|v|bD&n4p}#{1|g(Etr4JlsWC7 zf=-dnWd5*Fz0}=27~#vHQK~;`K;`4mIlJ} z@lvW0HBKj0BGekSem)O)aRFF z^E<49anU{{t4Lu&nbA%bVu6?sybeO6e(RWIKzuOC*tqclFd0==SCs6SJM~;&SAsHx z_MXvZWzA(b7K`Iob?XksT-Dik;+k%q*AV(gyfzxUu5*+~>%9}AbsjMp9Z!X z)J*jJT!eP+u)XJ@6emC0h@FZ^z~UKCF*n**yR&sf!+C_=<#oizUWH;)K2+%R|S>ESAb&xA9CSBOP0Ber&QVHdvRTVdzZk21Es7oS^jLc9J)u;=k2Tla zop>nb^`W^!gQf5g3?5$}hsXUUUC-aV{MX3|d^1?Zc56Rxdj zz$Gv7u;5zFThf7_$=ROFVFJE&tM=M&|GK&FMCxpPYT@=WwrX}JiD}XJQ$KLT?GimY zmm64n*-nh;sT&4W-^Ys78Z-;dv!&o$2jgSvCarLr=1Pi%t%%Y`K4&9hI0*Dw>^+9eA3FR5!%C|sl6;$)qQ(Ti5v8|2rv zK;MYC(oBe!w(w}7>!=U5;Yz_dWhAdY)AOmtx2VA9Mq*D0oCGuWD1mHPQp%p@dW*8@ z)+lZ4MQBm6kQ1iYu&La%KK60GsJ8T`kfy-TOYW0RE!q6NVb^5^pkS1zkK0j(Wk1oK zWDq52Ob9-;(vR1%r`vLQsz!-AB{9WoB-}s2qy6W})U0R!m)+Pj9lErs=4+x?&?UmF z>cUl6Z-YOfGisTzBz!rUJ{~@yGNq|1 z_VHwyU1KMFPAo0rBacC)UD-`L6?g9=Ajp;@V--9oq@X$A`qz3X(y2tdtxYX+NQt&C zJCUO6%Qki-wL4iZ57+B&$A4h}+iL45q~5;$W50NDeuqEE76>(K+iHEE&Z^0d`m3SNQ*7Z6czRES2JtW_Ez z2bp9uqr%zD!Evh2ATuuX&CoL=Od{L+3%AX}Y=H~*DU#YFt@)O?d|v*15A2g;l%XF+ zw??jPVH-EB^RnxSztZojmcB?4HWxNP=wYr6~w6!Smf13!XZccS@ z*t+HMY#LLk)IhxduP)o44>!`B+27mIo!NbZ@So07Z78HO)8##T{1OxABz($$Q-}ca z{@!5EYdD)sy#+gVn&i3T!n7iQ2W{BdT4iAH>IUVRPQ3`!I=^^PlU+*}y=h!m!8&(n zeqCg|FF@#TaQ@03$|kcZAeUmvvhQ*0A-{FF$D$aot7A~f#64sZ7)p3dI((m ztsd*llhhd4JM{qmQ{{R)#P+z`9`+P?mw(`7Cw=t%-L&~H(?Ydy&_NUd?+n_q)*fId zjK8VlS=n-7ar^^BI-k9%Lp+}!A6ltr{(dWfulmG>rhY|j^9&VL(0sLl`lXQO-H;#k zNH!lG>1Dh0g;yLMkFUg5+-${4t=j1Islo>QIXa&m+|eIMtN0OTWOyIAc-GkC^J|l{ zK%vDAleU~oCB%CF5sXiK=vhw^j`H2-$Y5uB;JtC1THIX7eGAnJ@SmMihlaN^U9+dI z!G|_tYQNlHx1%PRYJm}4JCa4GhTs)MFi*Yi|9bq9&rMoVi0Q@AvG^;3203d%W@vN% zl*LN1Z;-!zKN&h5Y!Qxa2eN0$z|50s2cWe{`F^jc1r67ND|496VEjw4*l#EqTse+EB0!!n2tmD-#gR&Esp&?)9sNp)GwlNHe?LY{VQj(L}6Yehfe=c3;QUK z=ZFYh70w}Inq_4G%j)U1)h6kYp<5muh`ku1pR;dqcs42@2cGrZpdYh-&Hx1OeS!To zlAGZ%9a?rwNSf4nWyQ%Xd!9};0fJWDj%P9jM-Hb!^-&LVj%7g4!&ZzIMkwL0BGI}! z41p_G=+x^2UcGqo-WU`6~;3}OAnL4Z$&Enqk z_~D--3Y17Hp^oCV#&`W`>Sh?Bhf#TXFra;Gm-Vo2(cI}zYu&CWK`hY;?|(MkAkn`AKBCtNtAV&ah?wQ8( zt)g@y)6v{bm^ZTU`YtVuRr(cAa)j@LGdF~i*3)v?-fy#nnR*l31%))@mNr{9msK!q zzNUUAcqeTbw*;zk0^FMfjWN{^9L@&Xs*=DCj1T*J@1fht0W|Dt9eAsnkw%V^y6{#V zn0jm$!?oTH0+g7-CsWkM-kaWE@t#W@c`_sM)HXolJy7c_-b(}5% zcV+CUoPo7Ag3CSq;JXgaVaMMI{O1WAL3Nm1Ce{Q>?3XVvHHp~?%^LsR+KA3 zC~Up#AZ$N?^SbQa(ns?6Plh>GtYtMOZa@+Q#S^f!f^Po(PfN-(zSOUgSqm06&fH*! zk&8pBBaz^WD8k^!!5IXHv|qk|0X?7nH@_m97gBG69^A>!i5o~w3KFVyBSBU-9@hG7 zc?EYYgao8KKm*Cwdn>fHH6Ve0_u>KsA`FME*@y$xq`+4Xh7R4v8XA+Pz-%GJDzDwaR=xpIp=4o{^qAfw(q8yV=GD85<#b5L+(36@ zEr@)0A!C#0ukHfn%*<{cP_Mu{vv4wH22q(K{@@5Z65E0v@3RO7^>-t6^0(t&kInSJ zxWWGd7_(_k06=GU%)~){3Brk7`406by;KGPga{ZzC8QOFFpq2S2$GoFD@9EAz>=^h z@lFUAqP-GxFD9~$M}>|lY-EPuIEn3wb2~JDV9K#4Aeu#h7cm1fZt2bTf?~=#bLdPf zfmhICT!!Sl0Ui*t2NWbJmuo-pPlFiTN_Z$X2A&0UtSERLw;CQJ>nLQEGYs!+4a&qb zfPk+_03T8~b=f0T9#DI6{BDg{b^xQS1JB7s57-2wfPP3p-B?Jr z9*?>NmBvzc)gyn`S-?U31zt!LG(|%Sw`uh$q@wl79$+;*B<*{%!z%#~iUuj^jX&Q3 z`-d69QlyXc!Uo`HN`A|lYrX>>QoavvwP7a>z?fIq2#J#?Wcnxc-97P3ym$B`(qcyJ z!*QA7nO{6%NbsJ^e4l3%_Zq{i|A1NXd%ysq05nx+7#-jF_%ME;H8dN!Ga&~Fz|zvW zPnqfRh^{V)@$EonNG)sCnhP4!GwSGDGm8tVgeNK3`uNSyy}KikFH;Ac@vUT943l2J zsY8pmMNH^e-MZD4MVzR`YFP8qy~SiBh+SXuUH(-1jhi;F8R#W~Qgr0X-V=VIfDumx z%*@S98;nmH+?l-6g??7&hcawy~&E}+k z;V};4^^%V0H6fewgnB^-;SnJ@?GmlVCc$rJN7n8t(&5l16t4RM{7$vFEBmx6*E1iP zn?*)T6Jz84OY5tC&H>mI_D1!`E*^`XkQiIEjO$^W*8;M3RBo{JQJKA|^;pYPE1M$B zY!>5-H208_;=BFnsU2lP0=ern*Nxph%Qu4j5V#^Qf@Y1TV3(Yn>KHPCy-ILI^MIZi{2nh6&?XTy=5w~4SSVt~{pLg!jI z6O_$fo4A9sN*xl*KmYwqp%PZAu{3eZU{wRwFtp9fC_+9$Hlh%qp-s-%u5;jcka16M z>l-9bh=i6{h=k8A3SfVchiP1A<GMLx4i&=~N}*46op_ z^&|>uK!WKKz%qT;&DMF z55qC12>nAJVlJLT+Wj<@3o~^*bTa{s>~XLw0|Ujog@^pkrW@bUHr6cB%s@toqk_Ip z;hrR{gHWz%%7rL;#GH1T;8_0TUcFnA^Sx$K?P`Ik-^!u|ayfE^@~^~L;vB!v!@3;% zQACq_6sbpg7HeR&%igwfIBje{)E7vXw<`OUqNU$TxX90KKZWqq5zcu6#WV!7$d;d>vVu@S%B_p8GBi*${(98{D-v>J#3VcR2`UWTFF)k8 z5s5O&?d^K1MDwlr!gq6k2**MNbY5c?o!8IVhR$mZ&#h1kBb?Xnjg#QK*1ULLD-H16 zp~e!a&zpaVU*z67@6_J1^)JZL{A|e8+23;IDoy(JG=4WA@;NpdS0m(KFk1ugg?;{D z1fIa-7~}rELogU;d1C(A3kP+qCd*wa)@g^D{3|81^bb~zs`9T&SecR%aTgP~H3&@1p7iectsGb~^9gZQ=Y6xv zlaqXEPqX--Ihx~$ftK-s^VIgEejq$3-fQ22bO9sv3B0F>V2E zV8MV?2Fi-$H&4p|mdVz4EapIV*?m8jCqujU@>&Js%wlv6w6tIP$oHp2WuT&6ONVm1 zN1NDQ(8PBTn(Z0=f;(}RZ`6Z1zvh&&yg^HG$#MXK6PrKtJKY-$!v!c{70aF?ub|*u zGL`Z+IXK$Iz(D%gdu6L&8@}RGO-Np`Ma#s+Cit47UsgsCpfaVZ>2B)np{0E4TYHyZ zNZC5!jyh;x;$K`W^%K56aW0`I@wv@FoAFC3ccXQLcoYF)5hvnu$;S;eh!}djaFg!;)eQ^ZE-{WZ1Y-Y-x=7!9ai!OJ|RCYUC$q_`?AIz z`XD?{P|K#2w=~|<#&%S*PL&l`SDkv)W}7tGr=ORd)uAU(bYEHv^>bR$Wai)I4g`F( zhrFaS+B5DJ+7v3vh*l#DdTyYWI<6%3x$3w$$$rqe<@#FptBh5I&3>7%9oH*L%?Gv; zqITt+QlvJM!mj?c%$|iien3Sh#fUAOK2`dQ0?KC_W{~vh;9ZWz zL`Q0s$$#Z4tNMQDD%R(>x1IAjB=$DQMK9~;=h>O^a$ASlbZRB!N=s!w!L=zjV_Z&R ze}Zjq=MxfW`@R>uU3ahB8=sm%^`qGFdKRxc?|MBWuW|T^B3=P{fb1G@0?@#Nnqep2 zyXaNSl|sbnm{;-3){Rn%XpT%!noHvUwkfxkV;ETw=?i!K6u{ny*23 zsR;1S)0W@luIdJO1#kv%t4=|&^Dv5 zVD~Rrge6i>Q#a|GAxp#yD{-#0=wkOwYhD z6s=_>RL~#Iz0N&_8iMoxm2%$FB^H~7t_V~BXjlKGO7C;)eOI8IgC`RxS00T;Z; zjYRmzdU(nzH4)PzFgiQm&AqiLh1bD}kTXxrptc3fqgt#NOdr_-+9N6a%LoYLt@sFM z{Tu_hxii?O_M&tqxTUouMaC5{(XU^j#~lv z_&}s~`0v>UQ9*#|g#=uEv>A{Tv@qK#FvqrICQ8^^q1DfBB|$(F6y0H# zRkx}X1MI{O5!Vw9SmE@+h(-wB4*(%a?U4F>F$jj^KG&{oR|yap8#vr-PE%=ci=5(? zSsQ4Z2{4y7Q~eC_6?AxO(h*a;*)E@g?>}2Nx!52|r~U)qU_)MdXf$#DtSJy2@PkNL z;w;DCAG-6`L^FWbm8MW~dk-@VgN5+J;}W!7h&3te#tKA>2h`d%K;;b98bN&K?0#za zi|b*1J9m1UC|w0!c}g|ig%0Db2?NLTuYm*n;XffkvEPv3{~9=8{EC#YNYd7#H?!;! zS)_9#Cat?7{?14AX5gN@gBLE~Z3iRxUzp?Zg_%Ho2Ood6QG^%tiqIG=ylntMD2r!* zeG;lxXO4Kw{`ox<-boW;ggt?ULYqa1;kJRZd!W%1G5Udfz&0KWVGGd+m7lS?v83X` zg;v_pg3s&L4>k9%+rR9#3@sZF#*RaF3PzZ%WEeIR%mp4c7d9r=m510Yqfb*;!t2=- zI!<77;exZ^Go8TznEL17W^b!O92{3?bke4xGfsfRmGxslPPeShcxx7kgH7my-NaSw zYHiqrsQ0>dgZ3vJ5^gfx-es5*2`BO+WVeD8un7d}FV@*_>8Xyx%N}2i@|uO04-3mr zG&C||){8?Uu0VUIT~}ekETF95ZZZG6bif!m35bhJ*aKVeFO%V!0}|pk!|xA$k=*`_ zVZD6|R*IdBg28RJ68>IAG9XUy_($C;j4?HA0RCEN`@(?tQy0J{caM7#@VH`Z?`vLY zSFuRb_z4gn{8$ZkkxtOlpr$hx;WOiyRXe&xO&t~>V@bIUHm9hf0RI*PaC=)59#9e{ zhBQA+`1(lWaMAbb5Fk~&Fnp>YUmtqDa=&2kVnnofSIwUxGAOL9(Y|EBU zS|>n$9gPPpKV5NwhvpUAjHCZr9_iG47$fry1Imj)uZ!BkdF8>)UY_3r31ey+0zou( zvQ#h)9n(Zvii!+!>K49o9e3mVIAcDxP zs0w-*wwOf(FY(47u=~yliNi0UsPG17$&#IPsz#)f1)UXg-erShVkm1F56zn!_Nt|7 z!s9As?e@agKB{>Ap*eO3n(4A<@DI&3RU%Z7ndUQg?Uoz9MX zu@=F5wEES9e%2P`05B&gwRm9&_)#Yrd<8n_s9aVlz{*n~&(I|a=)zLESbdRKd?V(=Ug33ZXH)0@qa$VL;UsCseLabAMHYNoPoUK0Wh_7n9;aAt|J zcwox;<|qIN2koIb>Tq9>PR8Zar2r+X*CSPZq#hXas^EM`+*oN|;$~~2>7l%(pH2P`oXKt*|e&;Se0DtM{`h7A@OK!Vfy_4CKB!~iHX zM}tg#N#1k>y9vWk+XKPAsKx9FccS;(!$+T%jwiMNPmQ0`)_?dtw6wR(sROP#4F6(9 zvgX1^pyhOFR*fS}rZ{F2Vb>-6N(@|ncP7<3SsD-pt685x1iORPxBwIJTJxX!Lb{9RzID60ZaZ$I97VHkio7ErdgcuAx8O+M`#bZ(?D zvwr^teZKXGSNPlpzOSBX6+ffH+qwFD{7lV>HXUvSP0V&-ScSSfl}oU^@Zx%9HCNH8 z^SDo+H7bKSRmx#CS+N+HSynv(LICJ{0I;shbmZ!lORI4l08YDb1D%g#lz5)lgS-{R z2l%}^HSCeUB`Pvh0Tppn5!td?9W#XejorY93hPB|5%%cBEQ58_?~UFQ`%9^2n{RdPGk>QuFy~$vlpalGAZA8IUbkiI#<_7JKsE}NKDzyY967T9CjFXoa6 zO^V1YeR6p?bQ4O-`vcLY9!j@Dj10Rj2}pwy2+%dFLVnNn2vNO7Qb>8?4|NaS;Td?? z_#nd0uL84T$7EUe5lm(ng2gX}k%GG3AaYbdR(iRXs|ygP@S8W-EIx74yfTG!=*!o{ zGF48)SJ;EgD0j1M+2+8w6+ON!dFE08Zl2q%ss`+!*0)e>iRn98m<%S_y8Ewo_J1BM z#_SDFr3&KwW%UJfbC{ui1exV&AV_XS{vX+ zt#ME{jFf27ann)-kBq)3Pj_&v#X&o2Kn4`O5T)`d`6*e9a{D?k5laWS$bdGyitmeX zq9ZDzJ(AMT6+Cc>VIlF5FiTk9#&&Vv9Oy-_MSNe5-Vo@^b!kBk5lTX{j*=r|9J`E( zn?AYB8Sp3^12NFeAM0NO>oZogF!jSmu%k8mJ{sSA2j_+hNB*%LzN&!mH6T85AE_0! z$9oDk>kR~g9Nfr&2YFN;B+#@mn_*E4k;;5Ek4Uzt1lD?mll@hTki!jlK1QEwAy}CV zLtSaAgo}9EYv7y%t<^eyRrcWrYtAUBT887!6e?mLpx$q1Es8vQdf83D+wMQy^9!N2 z!1Rrc@YNqGhMmb~9hgO8c`C7KuP=wlQ2&yidkV&E9g5=Yjf%Py5t^H<%EA?c2uAO zP%Y57S_Q+PG2Fa^`cfso$*Ck5WHRK=(7o)iyCdY9&pM?TP-NuA+Vr(A8uO0T^-`UM z-ND#n4TO;=$L6*Wk-hW;EnZ+bZ7h!_^@YFBC!R#?N#|X@Ef>>p`e{x(i{eXq_e!-U z6pCUf;=Wss%7+|PCAbkifd1Mo{*a>Yd*Jlv{(tWKpJT~R*LR7=W@*78|CNW&ZoHEQ z9EaD$B`qb|)K!bHP2P1;%sHrynPKzHn&arYQTw`(^Q&cT7D$S|q^9xB51B>9dsu?g zL5J3))__JT<)b^;11Io!re5u86?y5GdTyt$k(lK{BHdW7QK9S&!nc!B%(PpfWEKF< ziQz_s$E~wQyrX93)!^5n&6IGS=X@!`wR;ndb%G`~U?5K>1;Ml_{lrCNPbOYSNl-K? z2O{eZN4y+`G*;{Mru2n?rhOOTJ%}Dh;d*Z%*<(QdgqpSo>GKB7#P968xNjDCwaltc zMJ4sCpUc0I!tA_c^lCrcRPSfbc$iYY+(g-74dd!~9SUZ)*%53f;wYprhm_2(P*K!l zdh#ci%z~jR;n^(!0#7KzFtuMSBIx#=0WC9~uQGk!sdFi9(JoPzdS4~?r`}C@(9D(T zoBH%8A#&tU!<;1LP2wTZ*l>+p!{i@oQBg z#LI@1oWdIv#n0-*JVn9yD3Mg z)QU6Zo4qwM5YG&V(Tq6|a}XEcG?+}**A?IiaFPbWW0K&`!}0W(s;Jf`Kl!KPeff`~ zrL-cbWn8D+l-sl0F6RmH1og(}7>MyXkmlLF#_>I167W^mmoGZMZUwa8v&s=lS&|di zQn6cDYI9fvKY%Tj?lAZlCCu*RMDgb*iGi>@KU2ca(oT9-a^lxdPr>ioh9lS=E>UJ3 z_;N)?-29AtyORs`CUxxc2Kdy@PU#p=N^m-T_i4$i4(NVAl*6I@LZqBci0EduWsl3? z-QDE&Z={BsLzp(d8Fcd%bu>FeH~ge zA`!2zHlkPW5`XdM{Nei$0NthOL!iULS^i4=Y`$j+&aL+(-8>#&>?m{nnt;vJlmzFt zneiiogZ?GcoKXrvGhWP>tNxJ@%#R%&vrU@goK{uEBFo-jIo;m?oOY#!Es_H zl%qZ0^?<>vC$kTI?bQnuckMLMdMvWh$;3QAK-pst<@)(OqA(Hm2p7N50c9)82=S#u zKImpG@*IvYCM$oZ@~E-|;u@f$vw(3N7d16<8og1G_+u)o4}dj;p3=(>l#OJx%$Fir1Y%^|h@G*t*v?OCR*bp0G1c$&S~{zD?2Yaydo2*2tGkWV5~ zH%rawF#_fnr1QX>QUM5X638sSgJ1#T5l6f?&8Y2pe?76G3EcEcrl%k`h6adw4X>~Z z+d*00zq8T2829=waK3dpd|FjogAdWhtW?*2@jNVpe%&dJ5b>ZvGfjP?W9=S0hRv|v zpk+`4BXmgS#KClGIo!>FTYZuYtrlRzNfnjiRO&PQ9O>CC!3Avu;Rp{tI3ts3NbEeY z9^v6X^MM<89REodNY}^zjfcBrz*sR0doP157LP3>fWFd+xX|smG%dp%W^~Er-UX@D zH4y!kgvwn8IVLckKA7@q><2{VQq|Gg3;00cd#anf1KxLeQDQg~vpEYTR!ye5W+m*()S?=^MDcZHfToq)Dzja#orfMm=nW@iEcP z%uqhpyHwJrB`!d`2+TH& zuv&lLuX3_zSJwZ|>o;E9@&&Of!t1}@S60PWt? zEkV-&s{I?ZLt8uG9YEBi}q3=q@iSzgULQfQp05}#Qh*6Qa4a_p_to@4&57irof0+TS(w9m~S>^%oZKwBRFyit6w=&9`)BqF+TPlx>(WFqJ zV}(x3-xC6W`A}2}^2%C5A>%?Bz#eHi&`GnIw4=dJ9^O#)=#Y!`7<`pEAZQCSK!h$0 zkK-1g40O*$R15;93>NeZbdkl!&RIPA{54X4f@deNLzNUasKCM}jl?fBdrd@X7&cfl zLN&Ub@Q+dCDBJbz!AK(n!C}Z`JrusGN`2E51dITlii4pr7lCr$m2fUktV zY>cbMzg{vFBL2rqo=?ZDFxn;BxeA6XIP{e$n+p*hhm+>Zi&qGTsq!G_Z3e8Nzl&Gm zTbOn%5`xo~SFaSI?}rb5O-xK%#0gg;(2{Q7?Xt9Vz=U2R6EBK6b{>Y0To-#6^w(gp zjiY+;biyQ=Hh>_Yn-?C*;&&rKRYvI;wv#V1jO}DKDn@8V?-(^&T;*%L*r7DV*o2^* z3==Cc+t&!tK!_sdg9nqT)hKsoRA7!n^`cirI8dK-6MHB2p}UKMG3GP^)84$FxC65Q z29JS3X~L2&|BU|HR+V?6Lxe+T7HaWpSg5Tp(j#BPiSa z3zzPO&2lsI_2ou6UlHW5=6Ddk^zHfuI(EpKJD_#ax(Qau5Bvh|r>LXoZ?Z24gLEm} z{~4X9o}!%?fSqqHE87Jtk`Ma=!}a+}e;V+fT!FWKOh7R46tw{XsP+*oB-$l3&3Ua? zf%+>tXazMtgus5hV*#)JymttcZK&q}n*ZmRcg1#0BC3e~*Y%)!^XGa9p8tJ4m`_k@ z&jvUQP8p2y`*v7Hdlf2J;H-z1%*$d6Nx_qgm%&!%&$`i?2H{YtDzHd0Fb!D9wl=Wt zUiPm)`>Xf{S6C{(EqrGeET8Q<=+x4*>!?WQX+Up_@c%xyuy+1Fw*Y&6yr*ch_jsr8 z_9+lQQl(X#C!Ssv3%5*h6nDi9Kt;kS>$l7XHbh`kJ^_0!A!{|6j?alz`8T%cIjm{=Z+ z_I8#Nozp3D99Tuqu);#ej zbrGa?U(MhWT^V~8$V6O;r(mnS3{Mr$yLGAv1Cwrpwv~_(kj}HZqRd-FOkFUCgx+`0 z-sjcr4>$;*nFqAgMeA@{T|B~0Kti4c9!NwK*jU1Fu4lDBy~jNE7Xt7m1gD|bj~QIc zd;o0}I9}rmdV;Kyg(aHVGS_^e2{;ORqcfN`r-Z+85kV+#>Qp3Slx&f%Mu>|EZ83E6FU?|D5P3JXdD~<^5O(5A}sd; zfw2K`j*%+lZbyZ#E9Es)aZU2~rPx_OWV8hI{kDw6^(@9F1WyM2#kj;C_+R5W+&}Tmj>G1qm9ircC;1sOPuaG6?qO2eCS2m#S!2Tr_6xe;d5&M zk~zxJH}_CA#uItnbgcc3+S{Q`k9QClz2fbNDDH{M4JuM#!fW5O&SEW65ePaf=L^F;f>4yYxsS4Vmjyp8uzo$VXH_~v`Ep-E_;rJhHMEZwz1}S)f z*G(gK5|)+5N~sxoO6&>-Ks(PrwzvYdM<6R_Gbt@6?aOe3FY1A7&Rzsf^qs((9~YvC zI*b8sBc#)!!)2p@+7OsZ6F%&XFvXf-w`tdb?yyqQJPjt!4g1}?WC4*y#ro++HkWK_wP4O7r&NA%$9`IP`=L>@ zV4n?g{^m#!9~HSTLu6`G64qkXNYWKDJVImw%cPg$++D42&p>&=@m2rfYu7oOB+D== zTO#g)sK&-PFOWq=esTO@=Pf5GlNs-2UPe6SWhei+)zEmh2g(dkDQW;9ONezjdGApW z0g26wa2g}WA)>&~ceGW4kIy z-cd8`M8XlL-CYDWiB(a|6tXI@%f-nGwcL9e%g^9`b)SnF(abz>=npH>SP`>5=ugbmG1I~j2Mg~uGjv}nC zEgv3fV?|t<@5Po`@mkSvkujk$+YEFCtd1W0XPaLK=HgmzqEsJi(puGa$Abv^hYoq| z8CfC|4CrfFC>8M(%ssNg@&hhA&%Z{V==$K96?SqXXG~RU zW5E~SFqRFtQ%jw$)WenS@`zYy$qp{+W) zLz-)(IS2(x5fKT>?X)kjA6kZV?29=x7tY;g>BRM6(@zqqOkF5!UC6LxCUj;*32KUk zQGTAXZ~dp2`c)Pqkr};jN2c7Y+0}tlIQ>c?O>y6Po|%*cwK?HjiY!GREoXA<^x7Mf z4mOWJ2osq~xk^imOZ}nlbok+#VuezF(8$hP_UxJcMyuj!N&>Ch22cl%+ye-n)q;}c^!c|BS`*$LxC*_dB9xl7MLI*cq@ z{XGa&P<;5mmq3A4m$*ib<$^o1FP|SM)gwiFkpyQp1x|PxzI*X=_U1S*W*9Z;K=3qN zG){AEZFbz)zLPivC9*PcLoa{)svV@KW{2a4bl$vyhBCsG*csNlgf*G*x>g(Nq5mHT zj#{_?;RIPt)$H&xd+c3Q{Xu6FGyOZz0pZ{~jEZeg$W5#A6MBJE9NcqDU+hnj`vS#t zZTs@|M0$r($jO-4ll<~wb8WTJ*_Yx^%r*WD#f8r8yT4I>>hM<@uD8$DZPG{zIeKS( zEDPys49g&;%#JCH7xvs4{X+|Zz5O=J(#{TC2}Z}SapJ_QPYzHf5ND~eyLG&w=vlnXJxaEVSTvrZO%A>NhgGxKcm?_O@>|I(Atq3R2GGlRsb1}SOP$)P*OK+D~*Sh3*SJADV|mHolcw-2!Kbvi1u zPbW5TI=dg--=Y;XLSQN5Q`uq|$xbXOcHHt&S)OmJdxpH7iKtk7^4fcpNq*01AB=?in()c?~kM`l`MD;&<65GS}P z_H>##(*OMIP}Cxd*ov`XS0vfQiID1Shfcf1OMlXkKTWBCQ2pnry(C*~>C~R{ba_ab zx=mJWZ}j!d?M%6u-U53uHHZ^D$kV5V(Lsq{a$dpI0Z7O#XK@qf7qOxy?Ck}QG{U&G zoL+pg%GtjmmE!f@V`H2XS8mVRsRLWP#CaYs!xp z>g&y|H_&PkZLQYyBQL%p3ck-(NhKber3v8UB|9He_{?w2G&LK*3Q^XQcY6?f|GzHc zmG%1~h^;+yt6sgY;!^YCHN|$Zs&!b>!Mzivk0hPUt(q@Q8z)WoO;A^>#SW- zfnmA0jB3$5jimz{Jiat?$iTFkEY@x>vn}$n>rIIzhSv=C|Ams50Z^B*&Y&e3GBhVM z&YqR!XTe}Zd@D^#yUu##JjJe!E9u>yD0r09_!~*)sgNnJW4?2QD-52ATz@ecwbG_+ zhE`e;x*jGG0G;<&9=X+<_m1UH#)|&tka2o)ULUFtY*Gd@u6YF6%{%6- zV58UVhdt)@1~^WiLl4YgI0H(xpeq7%Vu8d5UAv1UKDf#3mAd63bauom7a?SkX<`VY z`8Q4t#jvt>!$D4JtM52=!JieSGQz z42RTy3su{(4Xn5ckdKU?-(LbOv8>Zv#XT}4@Zs^9$Y-_wb7 z0en7efpP-J{`59IPxIi}zMi5}!`?ULiUtn=*xP?j@3&idP zlmR_#7?kZ7!6OpQ7-H8suKV6!(IB#D)2AE*bqL56XFdGPVLmKs=KS3#khVPiKdLc& zu1kDaScw0-Q2;PW13Lk8%%T~Q7BVBcgUpCt!!$k)uXy|$0z-c!&@-U!wp2z)MLXJ8 zhpT$)5REf3?D{oSeAKC1z`9o=iHMcsCK5DGw6RB)oHfMwK#8G{J>$1P!EgTe9{}DC zl9mY|dt(0se{a!VP&k)8$n=PR5zv0L02W9pvrhdBVf=Hl;$&lRULk?v zxCH19=fk(VVLF^%1j5-=f=^S|;i}FWtjjGtxd$z~r}K)Z1J-wfVFqi2X!<_+>3tPD zFp(4w;6p}&=%&)A=@)nPs#%rCb3EWQ9tjLoRbxns?Lm`~<&H0)1JTe(E3;NmRcX^* zFyk3}4@!)Yd(5pw%jE?0VgFmXaJ*}JZw(}8S_L*}x!kQu?gd;jTDnm~N7~V1vNy(@lYcQU?Cwb!s)Z7T0hh zKMGk;k17Fva5RvR*CXp1dteyi^OBSgBb`A8{Sw&{F*vf2m2P4vpdvhghhfg-j{rw~ z;Y5y>T5zhV2S$|uGF1tcMhXfH6ND&IF|yJb2L2!(_#nqD0orSTj$UH%g^P2@EeJ_# zAi18AAf$XDB{v8-*ht3QM_|=78f*OwhGx@9U@mTZSiK~Vkf8Q$d>CkX%pgE;>`vN0 zYrZ$WM&e{YJNQ95B*$_gp|y~jzF`iH8;QVl|DuaLnS0TJ3Q6h=V6((98-AV+93HnB z#Ul2j__rS)&;MErS{x^k#d`xln_Q7qpw37^v(Ll}nAliDSHMsw#bdUE762j}$BYPK zo&!qDAU?wxdyTeSk_@i{zi90OFVe0S^4e{nT*~FiudS@D)(C2g$U%i_CFhH@JnVrg z8H*7t4hF2w9@w67vo@e6F$}rU$sSecydH)*!Ro~Gffpm(v+GC@!jXZxsnoDmYu|Ig|t|c}2oP zVwT49PW!L@iwzi9pa)g!HB=mIfCq~u`LyC+cVl+5JbCE>eoBoAN)ZbEz}e(McqVj5 zm(795ZQ*->)0(I6{+Qj%4Y)7^3NFV>tkTtoRB>jc3N_Pq^gaVSs|G}QhbPRMI~q~B zO3#uv0p`8|3HdP@L($$?^QlX2 zQ!<-FgkiIjD%K#P8bU1E*v7+aOKVu z9(QsFu!JT;duvKwvO%=VQ$=?A7uHOl)Sr|)q8NevO2p0Qm=P!IV)r5THM}>WB#2S* zSEBAfNKWYU0dUL061d^Yw)>Hr8EWh|idn$vEI*v-&{#PFaP$BfX67gR+8t5DW&PDxGy3Y`Sl|rnV}uAa|U@q0f2AEW+of#h49MT4pG0bFSl#JzJ8ym zR|B4Z5bVD0`lP!^`?fp#(>3ml7elUAfq2t2qkxS(-hcxhQN0*m^Q~9-C}L*@{vcPF zRT^E9vGND@^%o4V5D7^qmK4#U%zI9_wM@ z<3oCx;+!e5y?d}1D>5dv-M#`#+u

eiYWpXM=WItCzNwOrnQmXoo2*ie3g#Eb`*v zOiZDQAQ@OztuMI3=(ON#nxS4j0N!m$n@zdbQX7anlsy~It@QQfsg~uNS|hZuBGpN5 z>a#P#Dg+HyAo9_dYxN#GxwZ~L|3R?+lrFOQ%vyyV=`)!V5L;_e31?snePT|{|NW4E zXbX~a7z7?Sf{y3To(eBb+__)-E=uB82RLC;R>ah`s6~Au2NE>cXOgAV+JnDR@(6Nh z@kq#T=KuC+5B8-j8;ht$Z{sYgcA(aTJytB=BxpO?Wj_`?9)7ZQ$>+m2jXDgt1LsC3 z-hE`W)krq(wm?=FWv_ZISjkAWk&?a>keasYl28SVM*NN#r_-yOZqt_#-NOnPH%8;q4C!P>e0cD2UO!&Wm_+dDt4;zf=DO zgW>ZQMv#XET|R>HuqE;ZDd$AIe&{fIWW#0QCBN@^j!sa5+bS*Y(ZSSyXr!&e(wk|V~p$Vc} z+CZ(UTsm1VI+DyU-4;5K=L9TBS|7Ew<6rb^F%`r794;|_^q6aDHGom3zh;ecIZd$HIT6c-{H5a7Ff*>pF zV2I_NMSmtJVrqv`+s&oqpS6(|M}&xCD2sif)*Ys#|EsMNR9#J(a(nOfEOmBXgP^I5 ztN6HdSB#<9ybv@t=1UveMe>jk3wZsUTv|QQFS0-kpd`RezzVZ{{g9SVH&F$64-2^s z5AgCt9dlUL)3S*`I$@k#y(tT0Q6!45NQbzX8k?S6`u@i|fI09jGawQhrwxly9H^jN z=Y^Z7yLzu{KmKJRB&rPEaVq9HQTAiY4M?~|AoM(?|F?o&^xK7mj)t4-+|S5VvyAHw z=ZY=&^~YCa0^s7#654G9gkOlf)r2DHrPtfF;NhdTbX#apTm%;e;|v$K-lA1iYHa8U zC8=EspLPCBlbjfIfaF$mPpdnDpEI4>xs=}IxS(P_qx1JOj7622?JP1WT9_n~T4Vdz z<|LWQJ)y;7@e|g1AdJ6ae1>dfzkk$8^K zng#v|l4*gSZtlws27h%fo?TclqFoIzQ=)d8j|6^I`MpVfM*PkYXInCj0(cjlqGPo8 znl9W#$>EYu7MK8GKvf4Rx!WMK@q^Lubcegd!wRzxlpB#R^ndnBUs&jsHYI@)Iv1k} zT#UUW>vCJDfGx%yB|&GF4}D@Ar@^wDgNbkj4%oufUUa(pkLYI%#9g99MWr;v1PZorvR8 zkxr*Rg=i=jd+X2EiVU5CnzUR+fEY^2nLwQaFk=~=0++d&guXEZ4XCWxLNTv^f5D^> zb?ZoR0zpeiX$9iMUDH?j*HD1r)BnTXn}Dxbzj$co!5El;wD3TjzG{_jw9qP5IDi|>E8n^u%=$L#tFUkft8TwDdAlHVT6Q9 z!CFW&40&GOE(OtG6)4KZi7hxaW%1E)$&D2HYD&2QY zt@-Tm5CvN#7Zb@nARv*ptXCrVmIqeDnj1EV213rx1G5@}*1roz=G|EqjO2ou*u^!> zNjLQ~U&2zjN!x{80cUrB;l9u*RN?}N5Ww>2K6d_rt#tqR!TtO0UtWyI{#0+LKdX^~ zPRTMIbM+tq)fDl2!%g2iGyS>(M|As|)fg0s2&LKDd(Q}&@WEPud);y5UI#mJ!T+AL zS)&m33CB+EHfU_LviB`I16KD?WT($JlW|?*dRWDM_N56pW&;SK%-o9Wis;b(a2}t7 z$*E`I0x|6cA6evoKzg-N2Z$$Vevqqix~6aG*H^Xi7f>-i-lmGw{k(tNVH}-AEt6`N6D$bvxA_Z#J@+RQAOA_vM9kiBkb$^4ls;R+fXzATsh?8RsX% zB>axYv!uNWA49U%2N|Zj-b`7x-9VNJUTD-6xyqh}b~iFJ<`d3`Lir%D;ejaR8gTDl zK!nB%er0u}iy=s{X_xvSkb_3X?kk1aLb8rh$1xaU^ToU1ol)lw2`E;>z~h097lCFX zuvh9impv5RhNnKDInw1a3k2UP+kQh0by5LlXX&%K-E$8->w)RSP#9V~lYAJ`q8@vo zC#^$_fTD@!E_>+Avm(cZWN6F|SIV3U;>+KEz4SVe?M%wTS_>9m2ULX857DJ??0lTk zFS%%UfHP6GM$yt6jhP_bn>#4t%V|=M=HSEMUMQX!%*_b(|B@nd7D`nfQXl;3<=JF3 z5V!1rAPK%FA3;m;SisI54+i4B!1F{aE@qkfga-By^(N)@B8VEEn(cy_sIeE9e&7yF_l$idp^+(}g&f zJK9yV55b{(^|1X$kM4Zx*$imZh1mFZ2>lv9yu=LI{8C1pZLrFY7|cKXMNmU{{zC;4z@FN@ zRX|=6j)FJpeYRHf+8G1@p*h(X0f0bN!=r6A0{U9}C=z(bHbZBBYb#8>P>c~m@-Gvy z&ub7c(*UHZk1($pHQ|Azono|{Y7lHCgvdza?!Zl1i_AtW0Y3P&74Q-pWDdG)it$|N zv0L;hI2l^@9>CdRK{MBu9wpDSKa3%olj5(>r=2u;p(`&njHo{`6Y+7n!gj`_J~YmJ zclao%UfMS#-9Yl?@0|7R;VjM+L-D~Nje-C7LA2aKZCp6!gDj9CF!JC(vPrY%Q2z^M zDDmx*VR*4W$HL~6Ih-fXYM4n|zx~no(lOX2wQUFaoMy%?@{o%KKt?L|V|`EKL@H2$ zzZ29lYab66+%=j^Y$L2kT(55ig=JxshaeCg1|_{9JpG1uMIe$_aPv)+3d}KTbHm>G z{VQn8(JYwR5TF+Pej~yBrC`ysmJjSiN|}9~D{b?u_VWEzX#mT9Km%v(b}PprMc83; zhc%LK?8U^Agv@0k7uU}*9F0N4d-Q)}6?*fYg3@n4cu40!@`xWb^V zxgPT|REqHV7@!~u!dQoWtPQqj&}8W>bm5<&8UE)F0DhC6gzmL714)|yF~2JR5HWt+ z!*AJA^(1v$0AJm#5NXoR+_?DD|L;ntk%{ir$V0Er9 zgWS>;+JFkw8povTy7S0OCu}tnKSvxIVY?`qLZA9I*)axLR_my9rLr5dyF@%iW8|WH zbfSdn<2~vRZDYr#W^gwKRXgoxE#z4N)sX~J|ql2A8`Ab`xX$>*HJn+TJH&bq6PONy*A z_HUF+Ymm^asQ6FC?2Wx8(e$c>?GNS#L2;`415hS;K39Pkltx3JX1Rusz^<4RgK$x) zjVYCO25?};7h*M8BQ!Rz>t$cdKFAT2Ah`!;*@?W`h2fxy9;!~>`*dLEx>Bq?6|XBN z(EBn<%Si=L)n~vB+>A`1mc75@F3&z)mvwo(&Pz};HgpHxbJpbcsr496+N_}mA^4+q zYY*HG+`H6XZr7@Ev?*od>t&bX{1HyU*Mz45{OoXT!$)v6r+jCt+me0i{xs5h^a5hy z^8(|Ly}uSA;=9c^DBxRb766hu`YJb)&BpNQP$oy7UZ&gV{rtJ%(&JH-;T)-R=8rn3 z_LYSXA8$c*VGHTb6KzyGC11E6zTN4V>AVt5qH5bmH^|g%!;xz88*?rrQWMvV==cDU zZA*u>UhQV=MhDhtkDXdNrFAfr_#l}*^ynVi76-?8CYT}yjn8Yd{t%pM3wC@l-jWh< zxlQ^w$&8-|PH<6ha#F6*Q4o-c zSBdZow={4Tm`-47pR*%`sJ}Y-h_^Ye{p~@VR+TnBCl2#!>#tM=Vt+hUPtzk<b_JFsrD0w{ovb28OF+cFMX6sTMB z)8wxEbADKxA0q}N^kb3VOBJ_$r|Ca%xh~16ynQe=ZU-M@Yn3!l&6x@|Ysv zJJ-pf<=Va-aE#b@jXnnL<6;2vUj+6N+(jL8WD@C>oihTb+u5k$Yj=R9yL^Z`ZVOHg zr-R#pQ^1jGHS-K0eh=3XKF!#Gi;G4>a=681;Wxl8EwR45w;V8WHKcWIY9|;Rb)pXx z1|*ox@kX;+DPusHMt8B{JcvD&HOrG<4`0xU6-Qu;b#8QLN0dFoCY zI1&q6)}_kN<#W2Q@K;2S3oS%z>H_J7Nmzq-VZ%NL{ZCa)(jN&q?YW~s)Qalg-20NE z8KrTfTHZrQDdy*XY0jnT`%j)r)ipnJ(IQK4WRI?MuF(nECEZ!f{*IGDMw-ArjaD3~ zJM0lV0tRRsw zp?F5>1d*B1dn_$;U*d4n4}x1@I9#5@2PC|!PGhE#2G$9+=Yra` z2IYPGIM3kwcO8twhZU^R(hjlGLP1R?vM_BI=8@HznuPCaT4vwvRrbx>)Vq|MBsJLY z!rw+6n|2T^JTbQUIiJ|Syfh*a`e$1xnIy2p8jPyTeVtS6;bB ztRE#TiDqfz95SBXi4K#{(we6GUTE4=KUj5n!eQgdeOn?`@cY7Topz8;yd!)P-Kc%E z`pyk0){gVvFSI|1%hI{NBgJF(%}fm&PUX&#ijY&M9ffG6F19X4Hj5Y3s<&+RcIDnH z_Eh`(b$+`TU^I`rXqoUju@3~eSqJab)o}tXSBGll?c0_5Wcs-pQdL$%_(5t>UM%h9L9o#NpX=be9yR4nDZPrQ5M(=yZ4(u(vGZqu5A z^!E-x@=+>&vDK2(N%&?U-Kc@H=ixhITlN5wU<>*;OY&M|T0W7b^5mz9)Q01#Utda# zEL>F!<)1BiO&3Ha?!QJK+J3Ho>Fx~g+kNW~F8sE&+hAJt^x9651`NF;c`yD;K?Y_Q zDS3TjnHiT}_FPI`NU{hYs*ui$y1<-j%`->kygDYtw@ z&QCwLIRI;_e5wjyZ*VDs@9P=K@R`54{g~t66zJQQYO8$|0*pmFTeTY(gGH z6FzL&o%=Mcs(7zl`sm5d;C&Ji!TF`F3p!J3lu6Z&--`?KELugG@DTj)YwGpcmxqla@Yv5dg-s!I zbks?XJbhdz11WJvP&1vBEoDq9fT&p9p>N zoZlo7pQpKb@<%!Cs(8z!?E@VP>;@4PtwVxX&q_^qX9r@JYov^3xU4I-O!Xd32s=b4 zSUIHLb?~u0O zh_RBGkXfg>T>+|0&EhBS31MTl$i70#_OuD#@9ia>_b zMR~_K2P2M1hryHSu!K4iSj|=GCsJ~HPdcVOzeRbY$C+ow^ewRJXQvR)j!&9IcbuDz zm1hJ6#s-`eFn-(={u(RE~;x?oPUr*tT6?vd|{AxqK={z;N-YjA2LB#^qj7S6m$Bl0MHQrn#Xwg*`3b77O=&Uidf@aTryiVky< zd8Y3{R%7)hU1bFDj=Lp}FFK)QJ_2)Ix7GoVBRpXK!DFkkk;7JBj{yh2xXfbxT&J+I zQypRd^Pa;?^KB0!DO-#e^{ora{15t%xJ_Lz9FE^|zsLK=Ew$vEV%&o>7ur&8sO|B? zQ$^tjZ@s|Vrjc2K%ZGjYS$A|()1!!+hN-OsDZKk8_vB93dMkQ4#=TX-#q*nRV7dYr zGiNaM?pO9+j$)>M=g2$dsfR=3K&fl)6h2~8owf73^h2GIhl_PgRMvB85!_6UeRz0^ zMJ@iDyhnR65tnqR?T$^bXr3EcHjTCWwndS1E`6KE!+Yy2v38f=f2}O2@GYy6zU%&P z4?GwDd+SGjTsEQ4E>?81d;>OG2%P}tC%r*SA7YT^d{y>-ypqp1J19x+r@`z348PpH zaGKqeslENiyEBm0%s=VxDf?VjFQT1&p8N?fbHa0Q!RP0|OB#$#S$=Iyvs$Oo`vgrU z`33d$U)<3HGr-5_x9|RZ`Uyhz!s6ML~6f;J^n&OFAovasS zgrkzwe89C&Pm)O=iz>!*dfG$Yo$+S!YlD|uE*P;DTgG0u(3$^2&Q7bU^UDF=JFgbz z>ojAUxadIvTa0@aOP%N39k`&p$_21f@>)!362J{<6XWsiS2??JtrD`6^wcl73io<< z#>04WrXtqg)@rJgAqsE#;o7T&Q|WDc(tm1663`BW1HqLFv7%(ccycqT4;_FbqCVCa z$l~|`f6o?o?wuq%@tbZWqXGXwLF{F9{y!&(LZ*jrBu6K1qmjvut6;OVeWWw1n?b1C zMXk6~7;ubU2j>yE=G&B*V&9QF557cJXhE^YmJ01}ftmfItUn*B4!w@}{hN=fKdK(e z330#^>%rLQ`+H2a7e~NMq#e$#XUCwOzkSb9{2FWtq3%;>{)}8-b_50RyIdO}e8|~X zhj?`&cEHgOk4_(#<3naRUEpu>J>Fn@34(~4tQX<^>=n^`;Z4^C14hT&Y|j)H-fPmA z^ZjnAG!U!lJamS)ZO;uSZ>fn3yXio>3^ol`B;)OVV>JWaw+q2~ix7Rx@1ZC9%^JSM6IN5jr&~X=Fzg`5PIdcvJQdSCeW*3@L8xppbX!VYy z0GZ?JHkitqh9a^PPzP7ojw;zk18bYq%QDyr!F0G%J^0L2|7XJv1Ts!iCp|)%5m$i? zY1_`Ii^pI~IO@7O-D>3e-1x>496C>Qs|L=u1Hs1*3Y?M=uyR%Zr3kjT9uTOeq1@|) z5jH!R6$?d<3j8%7Z=>Sj(maZK3<#$gAXIY9SOUR-(xED|{n{Ni5Fq%LEf<lJqj!1PS42d5#W;1v&Ij|4`IJ!RHiKfo~!>3Dp~iD+mQ8+ zr=x)X$TN`ybfSu3<=@RukGS(F`FdQP$#1m=)w1tUbJ4Oi!#X|hf7qZ^Wp%u=WjnxH z#YZeiAAo(p{VQ(MER2`7gRY!$s+{K`0&A{Onj7M%-FEDS3nl9k)cP+Fxb`*|SJUL% z2i_>pgwvwD?L$Z1SOZ0lyx59*nwe-7fD-V;Kd1Xa1P zP{)(LF(02dGo1$KLGJAA7_n9b@bYOm77XK~fZwep^(@OmPP|MIVN3;(vg#c44~W>I zK#Hd)V^UQ)z^uu%HMi$SVUD5%rMsE&T zz-QI&A;xF>%g1FU=7FNram2R^qac%+tS7uG0U@5%92jH}l&TsSK)|C@TH13m_;){l z)!B%!UDwG(G3?g0@m&737syB8kS1=n$571(V?8_1jO=6QG9nW-ah6uUolv^*OJG6L zihBl;785Co<1;X$TmlwG%4T%>l4&xo`v@IhGJ?*fg5{7$gisPbJG1BA>CcH4ogqw| z-{E~SkB;ou{s8@x4+G&^RmdW0>nkA89hZqH0_fX6uW`S5R!uF;_{xVzZ|iC=aeSsO z$ni<=+n`Ml2j=tj9{E|AaZR0X`pBDa)T}ND+0c{o<(8^CR*ttjO&HIAvkBvv7d)qb zRMH$f6dSwV!us7kPrv?}h;Yhdu~73hSiQnP4tfl}Mias|Z(|gedI=oBCJoU->#*4%U}*)cL%vMQk^QcMJ21r+;*Nkj?u}eS2$v zbNxw(NMVL4($6=5yEE~Z|5cpI)VA@GBMF;C?e~$gu4<7Z0^rp@@*TMv{jRk=(vXzZ zW0NIcAsmJN zB;|7%{f_0$*P4`Z1+vsewbD1zx4Z*;wC{>XP&(7My43G_udrKs!(Tb`Q9+DWl}=O6 zaeQ;!a@e)l)Ao%Sdx40)U&o*Cm(pCWI+}fOFfde6&yw+4O~=m$8Kan})w4{8+XA;- zah%T}H};g^a<GC#hU_RIBHbmF-$o&jHN1h^j*sM#d9X1J!G8Sv>-cDd3{ zw5#>CbH?DB3}C%0A3WWKml0V01JsRJLS77=d;Oc++t}X<{CNI!cZ}4pdq3@&-k%+i zx+9vr!#mD-D_&5O609Eou`v(y56QSmlWGR67_krL_&almg4PuBP4onV8o0^3uPzD= z3+zaV5@G#fpnPpJylHkaZf~UWCyh*LSb|qk#T3Yn{EjDA`rg7bix6Y^u?5?LK%8o^ z;HSgO`8osPPZ7cIsh>VJh!S)o>AI*1q&MY+yuI+nr3EC3vCPXEg^l?6Y9_o>I6QcU zq!wB2c7TpT|$dUD^AO zs>WZKf=~YXox|!5-jA=i!uP>>&7FjBDtrLjgE*3%iqU$ZE5EG+w%HE}T}Z<>JMw69 zUByL5FQ&hu`;a z(ZqQe{?f!vekC3=Xx-CYb615om)=Dw$d8Sx54DMP1mQ^-`2;Lkg5#SyLSE#`7H#R< zq)CVMIDFfIRck%w_NIL2_jxTLvTWDhv&{W?>FU75f?Y|2sn+n48_X4%gx{=OqRMwk za(J2ZuzJR_`FK(4ow!8GZ{6Za4!b}UI12o>lvL;viZs{<}lIveXt$R%9Cc@CkR}AQ4U`;4PUoLPiessYP;!^x;R4eX4o&g)QGXR@U916uS-{_ zV~>T@nTwq~FeXCJ{`QUdj--N16;AOAs~HLi@Mu+`BYXnXWzgPQzx6zoycX_(bD&{< z?tp)ZQ{aG5LJem1!cT{7@MZU-nk0#plX9nzuomZl;*6%wzno7a#+W~Mjt8UB-wr4` z1OM>>o#SA0(V>#}0fHka_A`ow`U=)jVpla5d+SeFAc!=Jby!{?f0%&!^8% zVHYzl9>HIKUlLTd{MSo@uB^XZ9&pD0gUbUx*6wl5vlLTeEEk-)zkezO<^T9o|F7S_ zAnPii^%E|+oo_mXXx8jws&@V(C)R}75ef8|)+9b@Qf7v^Ed(+DmxA61gG1;;tP4aD z|HkblpI74b6$u3#J#`a0bKvFs|HXa!FH6G8p!c^Z@t;F_vQD!8g<8DV^7|# z=Dd(G(?it&HwS~;TU+4l4 zu3v&%3!+%{`hV8<|E2Z4M>|TOkh^fs4apc@d^z5$sJ}Xd9Vcx7kybiY zaqA8`*!Wn%6vBjh)tP7C%jy}|XG5TB(ydz9Jy2%g7&VK-;G2yoWrvlN?u3vxK*{IK zZ!l|V1_xC8wX(NM%*t)In@(XZ2JZwK0VnI+ucTCYb72Wy?0r6V8-=5Yu?G>>=`rM0 zK?gYpORSSd10!biS!vsLKC^Hv+oPrW0U2EdTmd1}furHR`B`r@9BIij zBg`!ERgmk2a*my2^&i>tV<-J;Tt&Z=`QQ2DCQ1lhOXIQ7AhJLfeeHteM@Lggzc$ED z)THgk_JkcNviU;Sw-ZA3W^B(J{vsP^>$CBjaY{x@({iIBtJ>b#r_XQ>MwfTQKTAz+_#Q#rFSp{|+;%caK#MK(o^mI;@abp;!Xh$aPt~gW_$&JrMf~ffoH-p}{ zS(;1k1a#8wNSVHsfGy5N)n5|e7kjb^K?-b8=(L3iRFa{;LBMdUC#v$lrCT`>^wu}( z6**=BruC?zU~Z<0G93q6W3gfK&Zj_t6IzA9Tg%+r#*Ul6L2lM^$GQ~&@VyE%o$fay z9|KXDLH&4pvAvvIv#1qtR5dST{63m~4R9P^z__l~$akQ*=#MV>HIHE3R&ntQkIk9< zKsC>@$hPvTwm&pHI>D8}`O}L_Y-(*mynUd(-)eioSVx{V!R*4Sh%^-+|0BrdBLQ~t4X&DqLQG8=(&IwehUFXYBz=Uom ze0>*S*JW425biVpb{&W#g_Dc$fpNT|O8B3w^FI)7j>anSzR-;`B=iZ6>D48O&VUS3 z7iw1k2ly^vWKRzOcXk0fIU@iTGEE~oAz^J9PxzcZ3Xo^B=SA<9z6Vv>nZHizOx(-a^bKLO53W_?p^v;4(|XQ%--YXhya+fQ zhVA8eXjPGMQEPSulZlD|1MXtnqveto%6o6UMRtmoT*PTu=`#e(sr|CRyk?*pjX*cx z9{gJu4BT&g1pN_>vdm7vuN^>X%#ASVvv|-YZT-3J_G9ofEQ^xRj-Y)Efl&3Xaepqn*${J zocc8@kU6~CA5WNpFC4P%S^n&PC6I_50Z^K@jM2Iw^6Tsa@wJHK!M*#06JhvXi$zO7 zXRU;Hu^ChQReXD=uiezGVWd1+{9%UHb&Msu2Nacu`@~?D?I?a=LVR&|jpjeX8nqu_A4%KB2!-o7zr4ny{cb*1 z>;2sV_GHwkRbDhsq_C+>##VxnlrPwab%6@O5j5f8$Cz>M^eeI4cCd5a+(Tauu1f9D zOYuMol;7dlvRFl$2j+S{$=~V$J#4?x46R28ol~AC9X{v(2%LSsgXjC&mS7Hyxme!J zT-otnRS(A2(Rzu>feadRy>p!Q1}3Yh&qd-4Li%pQB_XN zA$^?L()=94t$U_K793-C3ww0&DEoQ&F=p0OMsSKSuzS6_EVi^hE=0GI(_~cga^5U} z`5}e%`L#^+9Tg8nI1t7}EGD2O4 zg{-7eBWa8sTgC|u?vd~19N1`pH`|X^PqI-J;hhz5)~!7?0ey@P7>78D*yVYx62}!A zG}YcSJ$2*2pyr-e=P1Mt&ipxjL#yM^XWLTq;Ah70%xJ}gk>91m?z!XobqPmvnV%d= zHKI>aQ=GiMFCnA!irPINpk2_t`D*@fBJ4Cl_bO#(7s*v^GauXu(SUR|*GAta5*Q&* zR1n?8fEyw&CyKX&4SeEASRr;3t6%U6-x+eoeu>Kcr!(7 z(HB{qTfiL{BE$vVUFy!4AwuYIhIKs$sNQnAbNwYEyC!i9rf?f#{sdtaZ(VD(#CG47 zN!n4VNpwY>BOiuMd{|GYU7dW%M1hs^F)AcFm7u$hnq62ZIv!9o)tTeW(Wm=^X{X31 zJ*jJ}I6KL1-@xXL*hI))4>*Uc!R=eg;0?4*6fo4a?4q5WksL)chl*@MZ!+C+zD9Ra zIvoe~;~#_{cG=&4eZj83>_7SSPfRs|tC7T6A7D@>EH#QSrkd7|BFfIjx|r98S4lr1sPWd{m#-xL*MujP+PoqRG9o^+L9z zWwwuG2Ke|Q)hW9-8>jF7&%wE!<9~s3T%MlV5p8D*+qP@I$64$$Lcfmvxb?q@cK+wT z{a>IUWMJ689PAqku=9d1vqb8?QgYq?d=mZPTmH1tG6GG2oo zjW77&g}S%E*d6x&^;e#GO(r zw2B)#g~CxlnS!=RUm(1#^=TsGnwf`yptvo90)tBFBXGgL4!vA{A9|QwJD&VhIHt>izi~73AoT~%+){eR90r{Y0qpdF5eWHGw;d&}ki6N}t6SLJ71Z_$oBDRBU zGYiT$Aq8y&(Pa@OXpwsY(_tEJ%r42h4f{OHkMS3k#UM_4EYml zp2Ahw05ePbhPxl!wE+jpR+#N`w$FfJH#GUi@X;iZ!hu-=T^Ss^$q0=3fQp9IYg?!v zh&vB-xkX!i@`LkjKCCoN$V-F=I&h-JhVko=pZz*&0Xt-z1xMBfUDSf-(d`g!-OIV$ zSC(E!|CK+MZsmD0X%on*ZW?m)-xe~Eb0i^_i(J6u(cyR3!ve>iG76g(SEzslbXNRw zPIW#*i|n~E3BP<>xm5#2`5DkgINgEP*iz#by%8pro2{WKV)`X8vRb!N!pkTy(u;tN zgUVm0`o(j?QBk-FLi=-0;+rq6biLHxd}G2sCjwQ^%>btigI?dk5Nh2Dp%N?&y$MVU zlY@@H{|WSCv-3X#9*!O`jCN0K|4kgfDfk@kpXvo0M0+U53dPjRYA@m~Igf4EXQGNu zs0#5rRj-4qQR}J~2UZqcjjz9z6R_(5aBKIfSxZNqUx`0MpVmX&qVR{qcwHyD6ir5s zR3NGf!-?C4v{I-EUT-h&!&-q1%LvqI^F_gGI#HYKIXI5Ud-vB6v5!Fv%3k7552hSg zZ_U@XeyA8GvwIre$?-q|>gw!0SA-wX6kJ8AjbgIVmrqxi{u7>Kig%Xn=YoE7CaZTpo6;{8P-Xh;yF{ zA)B8@(&BE_O$%%4dzm%~t>d7BQ94d!)ob{{4^b6QI0$bPl08=WDf7uZr`@sU3^A2e zJTI0P9%1n1nsl<=O#tR^9Lf}sCta%$Lo3NPz;(FeZZ41~&mc~i zm3v{?cTnId11B{`Q)9K!rksm|m5QB;r$0r@hZa`8&oyT23JF`g*&)Au0cI!2|eo<=XCo$k$Vf?5bibS%ll z^~;a<$P9OZlTb&14VTv7i)-!P&0 zCh#Zz&+SS_jf9_;AXWcCdF_&1yfbaPDD0SnVh2THzn)5;>h4op1sUGKgXy^FvJrHn z=yHdJLer@%y2PS>vdVpo0G9T6=cMW$o-t_%$)6oQe^Lj_2I$$D8|e7G_3!V}Bc@4F%o> zQdybdRhgGyLVMtSIk?N}+q{tcS`O5!E+EsnL+zz*^CJ16i@){PlBc&Fhzb@Mmi>6A zSjb(ScDj~ZZ$fE@o-FlC936;qG>A*(B$9dCtSawgHX7p0w7bEY&KXAh&ZD}G2Bkw6 zgojQKWH?5+K|o#M9(_O(gX z?|uwu2d#OZ!ND+Ao*_jBlAVV_*H+O>8M!a_Kc~mv2!n$VaDpmAI11|(yBpFp2x*3) z31P!20~!@JSV@slY?1ZxvA??mv(>IghYsfje#on7-^an&ci+awH+0bP?whj*GCAS z8fo!Z74+w5sEmZD#61tf#M}kld(5?8iI}f__0>?Wqb6YbyX&(sw)-(WN}Whw4QF6( zn$I@1V>|q*GUQ(PTEP~cP!6Q)2ulzfJeu=N)k7|;%}>CHbjUb(NVJ(mi!Igc$-aHo z{pHJvtc3fgenjkM;x=M5IIZ*qA+bij zlEuWzxuq9y33uR*rF;llTJ!}8xUgZN*-98;7FKrxM!!077zlKPdVNpO#$zU33DIB* zLL(H&xO*C^>vrJfIRfHy9`yE`TP+=<``$omwl(BoW15ou6s&TP<(2I==f{M5g{1Y{ ze}O>2hkUi41~iV(AUk$_XN=ZUq-0>G0-V(QA3K3sd4kWv*8hkV#9NttJxRbv{GKa)#dYjDn zI7VQ~_2l~vok>!y1f#1f()t@h>J9~1W)RmL5FP`BK}AeSK0r$nz->MqnP zIjF%T(t`U*VwL$<#%DrZ&d@_Z%bIGVHaj96$M)&l`ZDGdx2pG6r-)DF0~7e>EjJU5 z#H%%y=Bxl=Ol8m>(}b~LynaD_Y~KQ~8=v_)m~-h@T;3#H@&g77*IFG3f|G2r*`f#V zKgCCY2%eA4y?J_b{;m8X*&specF3&xZDr>QM`%M&wt<_XqaNv%%s&vvnX~VWfb!%;lWnykIvW*dd$q zo%y#TpZq*v%OuKf;5eLi2FAZ10=L)A-n~$~TNy@;-ncy)1`4zD-3Doc_Rib-3QYd_ zhq^)QO`|27)}`+wQ3m2;G9E9@TRxC3N;;?nOyUzSaZDeY*fXl>aRZ-MSdDZy6zsIR zf@L>OrK^Lr!d8PsO1_sepfAZk)J?@&?B*QN1)OHn5q1H!>W-7BF!^aS3bS`hmxFv)GGsUXOb2&@D z9Jwx4Fcvp+rPk~*fA&(%oRRkVQpn!tMZsFlGD#t|DV~hm=h{m-Ohy%usza(c=D8l@ zO^@QI4C-_(a)&+LlZxjcUUVR%ap4$61?^GXez)LA_u%{7u6wTU&l7Ln9Lf6}cKn-5zQ^#}tYAPQ9~88-7I{QbAT-|&uI+#rr-*r)_QSa>fOTHtWWv@&h?G>y* z*7jNX@7}w8G^_6(n>}xM5_^rcA&NqNjF|hqb3zY2IKu_8B(jszoF4#VaMaIX!|A77 z61m>rsGZ`hkru-?ME^65!J7a-f8sjVp2$rrl$|CrWmGw6!wQ2TFi9_Zc!Kq|Af&bN zH{P_b7TYpcA+fm5^j;0OMVI2%%}|}=j=x8wDD-7;6qe+Fu}jq9+o`jC@qy%3p_2mX zQ74yHxnR%%{X<=j(<1kLHQl^(0|9uiya%@EU3tv^_8Q&rYc&BF+f(Vc-FofQrf0@1 z^)l>s$7&MRDXb>>e{oExx}b3XqXfFgTl6TY-vRsLu zs(2#n>_j+Fm@XW7h%at@pU74Lklk|TocS0>ilB6hw#aXuWLSO+gF;oO)79h=8_)9Q zMY>^So4G3P)%$7)s2Rn}@MQ@{<`($_-D?kc!CU*y^j4R>m^b6hKvPD2_Caa+{+E6# zt=`J%(#$|CW~!)|(W&W!!7+P;w_)7wn$ zd?^y|_fk%!fBD|Wy;@b6GHG#O9+*Z(W(+R_szeFgY~zHB_&@PUCAVN&{ohF&Rjlk? zssrjr9C#cd=Yq?teZ6w;5g30B-U`E8ZYg9R#ZB%xf8-s!&`&QFW>%SV0JrMJxme@P zgyAU%0(lcLju@&AN1uJpGSm7sQ*qC)UD@g2%-}$@^8eqi62#h4keiVdM%z{@j$Ibl zqzSurasX@m)0i^#<&C!hSdvP4fxF{5m*NoedYt7~^QuTY=CAm%axUy<=+Gup1wT62 zBl3XU6fT_+>yi6Xb3+8b1kUg1luLdbDYKVFlHWuHzVB3n+k^8Tw8~6AZNWQ*0T1?W zf`sxm-jyvpF1(f<>UDysIHm>@^aattiuZ1W-+K6yD!+Qdo3D@s*<-nL=7ocMR;s~D zw6tFtfLh30@564FmMg*M_g6L%2v5~|MWj+4;B&K2wUMb$nT_bYtJE-vw7v4zmFN0? z3;m7%2)nN0&2?!zN#a{wta5=&{PsXih_$V$K{~)>K4_n^9k!d_Pt4aEvikx{1rC-#@0)s>vG+fx@BuUKZf_v zqMkM)b4lC4s*eu@f6)3vnf#X*uSLmQyNPA_)YdVgwd4Jtwfmp7`=5RH|F1LK#eu0* zf%(a2?vXsWA$`gzTZ?NxE4MVnl2`cU8%6)1oHyfgeZEBp@*%ZDe^{0LglOn%ZBe@u zx;jMi0YI?#X?zvIRePCCqU&)~xO(9}Dfq*M3?a*48(tp$Rbg>*X_>oOss}LzF)}v> zqX;|W&*d0TI1<1#Rvh2c-FNUe98yU=l0ZcVBbNPp-kerv!+Lh|2jKE)vTqWzHi;OvP!! zxe-DIW*mK4Eg2jB?Hi7^d>8&1U(Jf`fIN4Zy?Rj{2B5>~Or!KPE-zmbcA=2)t@%S4 z)qu9+7blr>*6UU)%!ezNv;OH5<16j+p*?6R4gT$e{%0v+E5XQ0O9Q4Tw!iGQvxf&i z;R5V3W|cb^R(ILRNC5+Pg%x{%R)7U*7wgqRq63_%YCNp4$(C#{d47>lTzFrS!t3D{+37ddH8ANe1EW^&n#B zZzec70!!+`Tlr^pFo{q;^1ro%J=tVe<-JEK5WkdeUVLIMfN|GBH%ClV@_X$EPJe$Gkk$iCx$61|5{cr zCR}}Oav4z8uO1X__z2;GHr6Ebe&2&rT*@!c}A#+CEa2 zCJE!YQh?e}*C8@ZLPP5sNfA=FA>iD-y8BlsC8Z=S)D@ol1{xRab-z-(X`BfVj5NAO z5pFIo5(&WapwYXmuxDWnaN*fT-2Hz7*FD4K)v{YXtt)G&C4%zXFDe1pZ{f)A!XZ+%XwWZKg~7{Q zh7^=L@=7B=Az~%yX*s-kP6*!%t5k;{ggtu{COTab+U{VsHwmqN%sNulQ{p(~Ypq0m=e&-yEJY)OlJ10LD zc=u$I-HR9=G^cOA?%ZGKe*VzILs3Nt3In9p6C_#6tZm1)L{Pw1G0PKxla-G_JDiJ( z7B6*%w3po>WaWjK?WsBw)K_-fDXX%93;pCilYw=)0I1PF7bMT%$hrAJIHkkgonVdl!21z^K@u# zkL3bzA?MM)6Jhit0OH*P5r|e9+HchE?E+B)4+KVS+P~-t!1^@&_cALI_-6OgK$A_* zxna|AXPNu#4A_G7N~Qq+Fq#K!L=6*z1Lr48K4CVwFP*L<2S@Fr-64Z9@3K%XN0iDM(^1A08S7B` z`EJtVexkWywFiRnSdKoH2NXRKC%hA7d4C=uI$4L1vvKJ##k|}dhNZa=lvYOm+k#kq z!C~l0!Z$xcgWgJ)=^maVKtl5;Jf55YG2HivVwRBU3)Zmh2!#ZrolpeRPXkcfrOBqk zrA7NGT(XzcRYj!-wFn~?(nlcjdVt(64Z!c`z|B-S1OMTHEP)nv8>~S7vAVr8eF2=r zyUM*keFx?x+v4z5&?pf3^#k!tpWg)==}>pnm6W-czeT83PxLIzq(77Eh3-{@Z@WDs zv{zleEgcV9uqwCpPF!{mZU>KP29P*d&^Qe3c1ME1a|2a_kjq4WkXr1(vPcs8=2b@IL6M& z`HwVh5>QnqZo}C^w})7Yq-Z}LH-9<;4G2S0AAA`;tvd+jE|)AZF+YoX^2K6{zYwK# zW_|we1j;mQztnl#BZ=l$FU%wUhi5HV7GHP`R220nPy}e{p6tdrH*4 zCRB56JzO1C1-J-MU6FvOGja7`|9LWv$xkh{!nfllbp~n80Q0UsU~1?HBHXpVx~;}h z1gb|DB};Ylek3T|oNjl#w1(Tf@)mX!aT3**V3$_+D(Y%=o!*E>&}n*WC64FABz-S1 ztT$_Edako|%}M+X8UpLHXuN7;RrEB_$LIvIo&7RW{96fHq#ejA7grUJ7v(oS-wk|~ z_cGUdKIaxb|Lh4Y)OF?o`Sb66otXkbRD@Ny^D6rGT|B3|rS`L%tPcS(h+Cp^50QSpBfqA^U=C@)->$cPTnlQQ6MFb#jj-FatKzSCMo=M>Xb`YfC&R^)!bqsw ziEb4I|8iF9RutYmRm=u9t;tic$Vq2Y)y_D}Tn!zWlwBQU_vNBfVe0uuN8lxbmB7`F3X^@@bm)ta3>S z{enLe?@Qb%C$;MrydSLQ5EuHQ7iA5yGUpZY9@k4?gp`M>5@3%?g@;5MSVb;O4R5qO zx-bUBpN;KS~L389RT0sGH8=+`*nA6S7oXRDGm3`?J8~Ku+4=|w}K(^l&NaW zuY@Q0zuY^xg2hRvbi?mlSEmDtgIRz`=FCF3J7W;!0N$`GxnCru^S|{1 zqYa!Har2@YK+H29B=h1-Y8G(eShom;1t&z_@jrI%*2()&Sk)-OeGA% zKfFTO?_UV&W8Gy075&_DxG0-{dTKRCkx8eZ$8Ynyv>5{}7pTX&yE*+?@t})!VmCgH z0Do*P$MP4D4yU^UAHM-NsjAAOpM9!mhJJ_~N2&}m9u+hD9^k^i4mmt5s?KzNj%FJt z6AjTb;0dn!LXVeGY8b2nl4inanZX`2KMZxA9ko-QxmF_oEAupHb+^I^<9!4)^4kx$ zANvFp{tg%jINo*ak>{pEqwBgs-1Iv%e(&#UR1mmUy8ywf6K<&9e0RlzmbvrCK*ZVm zk?qVl${m0y9BAi-di2mNx0#XpM!@O;ITqF@J|=9O9|ln&1>NACp36`IFA*(;n?PTs z+E{1Hmo*mZFl6tx9)lW;-15h)hqSAP?>uV!@nq>-!qHoZr-9@507?RLbq4M+w9)ck z!{(1hm|Ipmb%z0hcc^=1mJK|979CM`fmK=|qn1t_pI(Z%=V{sH z-?E;~`l{`)%d`7cfSRKn+yV}8e!ob7e8Lr@k3f>IErcg+Tzmo~BCyqA=v?PC?CS?# z(FkyGTWs5I?Q*rRSeUqjV$*qx;DGJ+TVA|!48n*MxAmaSOsNXa80ov>ZhcCfHa9jY z9EVV^;s>~AkXhA{EPo?Vw#<7fA9PurPH`xknbh8V{dXAu@cs;^0(Q4=$T(R=q5LW-t+ZpCD7H%^! z;|=jg6Ajo>K^SC%YBv$c7D575toU$h)T#9q*WueLCJ`E&yPTN+9(7ietsJmf8Tfo2n$fg~cu8tEk) z6}SA8v^14-{h#qsh)}|%B*AHa-4MUZFd1Jc zYBwM!b@dALDsaO?g8DD6wN(PRt&}yVA1gDZ@)UTEt#)5OmF}gp{bCoS_!EK$VIaUC zsPbQR6XGHM+0zH=TxTSS0M+pqP)sELD&E{0p3MJJYq=a;S8>(3F%*9=4{dI_;@A;8 zkMfj9G8iGppbt~LnNVE|0;yvm{tR4mz;415D0YMO%s-`SM(ItZG31OFHgSsa7;R@L zjOW)Kgv6-M10m-pu7Xg(qKp?(QPEHswix^gNLj&VOghMr(EYk;rv&k0WH*=Q`1RlKj^@ z3Y0z%ZFQwU`D*fAM_~wx&+Wc3F*q~A%+`t^O?>P?XMhLK?TP)K1LgB}n@kYBJ~mU* zcChR|#FXYE^YtHTVju=-O9LWwzq6^qWEZpp)jaIu0yj7$JLbR?OrCgJ&=HE7%n6id zx0!Yp67b@XROVrzj>5yDcc8Q=jLD{56d2F7!crk+GYaVW@$_MMp6SE#E+sTJL3zEt zPcY5H2D+0AY$e2_3@9I}Iw6yBN6~K$wkEUGw2`U_{gmkJh+LAa#chAat%x@Q#|quq zb0=MoyEH9A6+Z%j!uI?ahJ_w2lu;Uy%>PiQ#m8lC-^-`XhqHrJjkO$)WeW*w^4U-* z)$%pGCXV3FpxtJyr~b-Fd!^NXT9aLmHA*cR0-l6CLC90tX@E64Y0N?&X(1Rnu)W!^ zx-gwZqKx|J1rxJ=-GgGw38k!=FDc8|BMz(i${GiFW279Rcr`y84+L)wy zBT_Q>kFMxiUN`=SUT!p=J~Mza{#No=N2(aP5z#Q~fNpqkN>w3VN1+w8Oze8&`_oWs zT+Qod=oV#)VLZ^~qZf%HF^l}srpPZas^h8gb)uA`W^U2`JCq`WACL>?HhJ40W@e5TdlU zLb9hVD!uYU?f@PKaYATi^fs}KEe5n@$L8hT1cx;Bjz5y8AI(j10x@u04t5{KmC#tQ z+f+8{(`4B7g?-!`Q(V#rtzg#6;z?8&jOa;sJlU>s?&BD=*N{`UXLE&~;Xm<3pEd42 zC}Xf0pP|pJ8SaM8=-{zMlp43;q?%sDF9A3Gv2D~a@3wB3+`%5CVO*wu(Xb|Y!ALTG z^Jl$nN!6O6k8Vg5oG_*N4$%CEej05c+KO~k z2%%K}9MFPl>J!8sOq6-%NjJ!`sfGA|*){_uPA62ZJ0V91oN0+lf|N6~*m=E(R8GC{ zx#c}6XxRFCBEJuXfoz4K02al)khvVRF5o!(N)0nneanm|TnZIZAS$$!8Be#z&hm*^ z)KYd}+If1ALW#W3u`~!;R5(R;`|FRTl@}VDj~#YCXIPk6q^@~U)6y{Y9K=Ardcg_L z->%i??}Bd#E5-rw?^=dDvzP!rLeHIo5OV=L+~XwwnWt}^qLxC&*)Z(_$wJ4=e&}?1 z?fL*WmvL|h!KylK_$Bo0hl~us)(l7?s;O6y!jE7f5L-#&H9~yHir;}P4ce^$zSXvec+dV))~VtSI3Uj=s8%Q)e7t={es&haJAH)nV5zp(EA*iljS z&eyPn<-x2_v;J~rc(1W7rJhsMVM{C2HI$q5y(`}}+b{70IQ|2tTkR$i{SbL0k;#|fyJSBtlZ)7pLYbr^WeYl*dcnZ z126L$LS;LgqRtw@Rj&qooIer6?JqY1iV8!NhX7I+0Q{hycZyG+g!}`dJglL*-gzzD zVaP>5J;hPop`94CWAMp|1^oN%?bTO)=?0_>0E`Ho!4PTXi=`ehIDSKJ8m+i_b$ikp zCB5UAkeSf;bCA7j2d2i%cTg>b?meKm52jx&=Ry67(s{EqqYmzzDD^azo$XnRA|YL1 zG;>B-M09ri$!pISp^R$#Gls zR67y2NOa!BeYCL%JUa|q`r##b*?z;pXUTvhmOXHoz4lSdV%`V&r2!IkfmybAg(j$r z&qL`NhqQUwUKU)1=S~?4NLuwLBmu6IiG;8yVwLSTItZh{%MfCH6{>An?ITrF_AL#e zMYRi1`(^=*fz-^{q(_HWj;!0FRvQ4850jIe5gq!yCkz_8NNj2Mw^PS(K+uHlLm>OL zJ)xQ#PbgL@R{mDDIJiWc*D}Dy%Xl!}0iN?vhEeDVP)<9Du`hrKc8UilMJPoD6>=Gk zfUr3i&hfVCFFqGmGES|yK5sX(Ve#p|uj))QHpzoy>Xql0tLOiKM%VhtebuG0|5BO{ zuNQFOA6U|0ixBhy0df1fUCwL_B8uULn)b1}S1dFv*5b5Xv_m=beYhQ7gWmvx-5NBC za#NQe!?6QIsy0aE&6Zlz3q^B2L=FoC?szAf<>^}Qj7D|TA*=Ns5lJ@@!w2hFSVFZnjq3_k48JZlBU19=`R$YrhKoX99F-`YJp{&fUw z;(74QwQiQ~57#>}gE}EF<#Sf&1N7W(H1vt|7@I%;@LNdGIw9*btZAL4C5)gzP1D-7blp zCKds4_^Jn1eY=niG}akDVB`wW1( z#?iv_i*VFlV0JDqykEu!=t-Mw`^g{YjGTDd(NU-$jDAFjEF9$5iRY{~68D09+1R|L z&hDjF$Kzi-{y@Whb8ZSu&)73%t%GH6XF6JjS=#_j7=k1r-Sek@t;ZCuZo6527k5LQ z^j|)p;X)5FM=^p3@uXUGxW79f1VIN;6V3Bo{qciFzC0a;8l7V!Te18u<_nNqaHH{| zPzEGGV|xdH&e*8%usRO#>;@DW!L#u*>>BcisdT}I1E}+b^o1ih0aGhCej7l7YQ?V!U>I8S)nLn6Dc%meFh$q zvw)VkvMo=hOAZo(_IULK@R-rCpIW04Q&2R)6b`;!2Ymt4l~SA~-VWXX%PA*lbL=HI z4?OA53DR;Aft-Hvy0}_`sd3F`$hhDaH`TU04-Stuu`3o|fvQnGe6}2Nii4#2%VUEH zv_k7=r4D`$!iAp_K$qV;LkNVuaY(EU=#4VHhv~i!_x7(F*H0u}bhkZ4Hou%=Y3 zumuMr|3K0%!d}Zesy~{ax(+BpJgY)I1TnZh4%_g4*}3No55e}}Ejc@UZk*uLj8|^B z0*&O@Z(H9lvVhGxpce5Mz{}Qx>4>-Sf&a{zl5=fn76qQs_aHhotC-+mR6;tV8~70h z0R9A|W>erDznrz84u8zZhO(cp1=`D9LAxln-oc60aT6nvpeui5v@JDFs1VF5ornVA z-#d9}iZrfS6%$+A>S<%FU)U1NC~Uqm1Pq2z#2TO>0uzdq8S3%(FFqPBZ4Ekx_e{;o zAe3C@45^mIJ9@wQaIA;8m6371<|DKn-J10eI2kLw$gm_OG*u*tFlBKzTj(g|eyY?V zerCeas4p?IsIqr{Z<1>3q(!6_4n{>6*F1)+d2%;)0umsw53@?udp<5Sa@%WT7wS$g zedG@#TzV&N{77Tc*svxes2>HYI0z2N8Q*8P#({13)q+vWa6QUuPJj{N@?M5b3*i+E zwgWDv7w&w8W!atm;V9uT7z@uY|EXBsg+2f718O!);kXc}?><%LeRJdsp=Qd*_*H}W zYi?d$LjJahzHqsNA1tmpSQZXy%z5?{DQUldF7l3-(oV1_yyfW9;&-Y=W;1$%SNfXO z+QbjlS#XSY?>+!muL$SWW~uqYyMjZ{HV{jLDKODO4~YylF=1J}Ddvt675XQ3%_@Zw zoZ$EfP>Gv6MMw<$WAth%;~O-k?Nj>#(iavT7&_n}j*InW%Zao+UAMESB^awrF(8Pw z5KS_Mbu5*PADYdVdq9y>Q{TS#~I7xTJQJXRMbA&Cw8*EZd>O4UKYY zdH;Lh{s>=P7yi`(?7{9SMByscCI>N&!cI>0Xl5Z#5v`*>njUM2`3hu9`?(yKOvW?k z(6^9o-O4x(jA#x!F$!`C{`}x0IJ9+skl*# z0yD2qrHeGArma6|ydiS)*Tz;Gr4-yzAE^x42?Z9VvoGz@8Z_%d3lb+ zo7LQ(PA-M$>g@R+SLeUn|2)Hr9%VYL2X}B_RcHo;MxvLx*~eBTV*z#ggNwW` zHI2{7>?{OWPMPYL#$ju`iT}e-7$tyfu^_CQQtjN~@tnaZB_4&@fYp4~h6KKWSM}JO zqWN$hLjpI6t``0=QnSoQ@A{7`jM|S<2F80eN}HlPT7_6NTbw!)Eus0h(#SO;$1k)< z=^0;iI5q^S)q!4*vtkKllS{>|^9BRS*koiLSP=Q3Zc7bP8*e$rQMj!@a**NQ#Mwt; zcd^qlqNU$fz$eN)R^ArCP-vRU68|v$y>;OMu628a`*qq{V@1YTVXK93$U_2s^2^C_ zG>27@_8BY?oYf-u2i`dktLa5vA$OuP`wW&_Tg@oB9krPnTGpcDMwXW3ec~o1;UT_= z!@4rAZg04`Mxie$NMlYA_LSV#c%i9kleQlxLJ9pEzn_ZSn>g*HFs|lH6{L&wb!3Y? zEF@wWGA68#?eFAZPf&)qDkRzUY;Ay{t$HCP8FqLJRW_^8z15}Wt9kKlL%t#}hP!^3 zql><5j^pkqL`OKY*&NZAnh1&lpSS<$zGjUVR~<)!(JS-FA^;oWyg<+%-p1_#-Y1My z%f=(4lNqv<9gc)0V&Zo>7USBXYv;U86q2=V%CM!9DZ|4z8+0=twJZPZygw?4LTBvn_$MA|zIW)M@6^ke zQ~||d+7*1m-M94%j>7jMmxOW%pNK)~N{i4z?u;I)wi4eeVEnMqdH$;Ao`HI@=m(9l z0z+Eb;O$tfnt;L-~E^v85Q|a|2 zC&D9Aa^~}#<83YjhI~nbN%KuFkK8u?T@deKIbP6uzD}B`um4+4;WBj)g-I!o-*ke* zWRl%xBwbX%3mf1KW`!pL+Vg>O|52_ZH4#K&zqlnme|@);PkNA;OR$k-#Fvq@rc+HH ziJT5TSwc*r&T#IgvKzXrXO&zS_nIEAXS51kAh6acSJJ;W|Cv{j$SBT9TrzS<7wIQ( z)x}}IxU)AlnX)?*A824rjp?n5|MT-4(Vuq@RAr+JAUj6{|26ql?}&c!w$>wCy>EcA zXC;v>G>s(R3j>8rkMhXVPId6b6(KdmMfbcSS&aqzOp8p53S(NTEHY<3)hztSxW!K7 z`YD&?(1HtFBUI+CT)Jg0DvkaAdP4HuTgn|Be0zY&8L1^ZwnD3iHCj7c`-`^1bS| z?BolOo51QE?Zw6cCOiWDYc?|m&6R@w>@1qZY~0pjd)(n8(Fa;N7ns|UH863zt(lo@ z`j>y=B&WuK1#7>ry2k;^ zuwpc7SjxVU2RW+$Tc5Ud2{qBs@?VSt*lPF1N|xU9h-l-w0>1UUefN&0WVq+*CY|(z zaV?erdyN3XQvf+!9SAV-9R(jd#|_X4#${gvNJ-)J?ej3e$`i6iI-n`owZML?{qCwL zt=#JYQ;_Y=QAm@2>xFTXZ9^P=3BTe+Hnp9rp`_&A-p%lsAf+hef37G+`Ph*~9i{PX zwrxf;yp5rUYb&4VWt^u6MK9)dY-AESrpvU)hz3>w@rApu@q;a=7__cCT!le0e zF2(;y*q$PE4Mc2#*NeN{?_>ckHVuBt#p^#4SaY{3&lKzKWUtvMWLIx4U(d4bQp23& z9dmtgVPm_Rpg9!5w>d=GRtLAvXj1addXTO;Ex#(B$)9l@YpB! zpNAGlq))isMWcN{J7-GiJw(XE@agc*lci22tPEo;_(I8NFFCw$bXl@i5&eip zvKp+!k}L}|zcL^yse5upr#&fwtUOn^oAPIpZ;=@ z*vtIg&_Z|ZCFiQMQA14jW0nBzk%Dnmx^J*Xk(N|msC?U5kYlC)-^INN`L@_YDIy(U%oQIatk`~+{D<|Gf z&|9D4yP1$G(DUa^d-3U^01UMAYN7sPf5Iw5My0Z#|K)!G}7|{{hbOlC2F=4uzzDw8eX~ zuRWose4cH%>lMl}I#H_BHwe<60ga5;cXxiRCG1+f2fm?ZemUujE-I7$awb??ivRK5 zM>BK9FYLt6`k76Sn5x{G1+L?8@al35n!P)~_C_=S&im(2|4b%_dB;^3qq&Jl8?jxt zt7Y!0jG=Cy%?a%-V~x@I>StB9d~W1+B=if#%?~}?!&G^4K-5G!zXL{v4K116LgMIt zC8l==!23V)7lC{Hp1)Qg&N&}{R^_XjoY7t~m&sFY^T6lmbI!8&yyWqV|Nc+F0bDhK z<*8V-G_RfsrhISYwLdi4K0hb}hd6#++dDB5RbEpM#SBrq2dIt3+i|=TDRne@PZL~-{zDD%2Qb}YjD(% zH3OBT^-|e`_g43kZwJ3{#-Ck%?*Yz#(%`)VR^NNavlr3-clHZBP*!XqBuxI*_sVz0 z^Lenor!SN*t`Gd@2)wdp^&K}fDr-UE$VE*4jqzwmKDA7?mkHJ@AJ$R;GFZdEKdDq@ z^9x=varo3G|NMV_YX2Q9C%)U(?mU0^gw|Pj7N?%8B%s7D5c7ukaH_ponE(nh@lH@$ zeXnnp4gmQ05marL5HIl}IN-ZOg|agwo}{`Iwc9m(L(-iSZZYcuN(muKJ|{Shbl+vS z2(o4?hjc6Q9K+-($t7-%x9*89@x}Ve9{4jYyjT7>m@{IPD`&2~DL(!5r`;ah;W#-W zW*A>Gb^O{iM788YuJ2(l_Fo`q$pbFz6ACB__5_WMXVs@jOIHU_;b&&$R;^!2HrnN5 zIEZF@{e)W#z3HCpk{1%v{{(4I(T&YA zZ$h6U4INYw3865du~zA;<}XX=*+(Gxs{j!|b5c;fc1DYzwKC}fF~b={ZAltRYhH<< zC1@TvgCc)UAni3$7{gy3^$p)Np)XYm2~Z8E<{(;P7m5*bf*iAJcf{cEez79o0}Y*X zD$OJxk_?;X_;yvy_HEcDaV`X<65Sg^5zSB;GZ1^!u!C%ZQ2K^)7zJ1Jj?_B}wW`~K zD5S+5X@h;=5oDJ|+7Ob5IKY@afhi}4gP^8CK zl6rM*dm;7jJR)S{jB>>Br%@0f$Nb^Md>koReQWbFsZ@RAoxum;N5KX0oN$VA>iOtx z;p|*^JZeI7T60dzqPdUp{^{~J# ze`f&UBXL;dSx=x8919i&Q6(V$)F#(NS-DewYX_!OE4L>*A9KraCWzH2al>`?eXUkB zwA`0gue2yV`s{1`7J>#zPQ#w6mfr24gHIrE7&rJroQzDK?%if&DG_Ma5wF>LFjIfw z+;3=NE`YKzuWq4fnN;bx0GsPdj-5b=#_VJH^L(b&%H4lNJj6wm-aP0R3qLlN%(L~o_t)M;|0fqj>ubQPF*B&5Zgq~{0T=ouS z@{cnr_YOP zSQ)KLQj*P!45#z++Y0Hx=w_(y@6}b_^)(pm2g+;=%cOJ9f?KK>YFcR%0xMFO1X#rQ zcg_6XuK!cyP=Fa<^4OiSdjIj=e|1b!nDResyZy*tgDVEW8s@*(Z}uSy&pxbjS_S%ji+B>e?-HIT!Y-vYJ3j!)L?=YsW-F6aNj% zE|#y~9+2+?;SHl5YFHzaqRtMs`py zajp%(;*ApV^h47`s(J_nOJ{aTUnTTWU-G-@oUhOLX;jq>7xHAURwd+8y``0)-g(rU zw#=wD{nnw5yTc5~q+FKy2EsN-mFmT+;*FRZ@yM4D#G!K$`0m4@nObtR7sCsspvig% zSx*0$e$2dk+`2mwCwOd9b*Dcw_D;im6DRWk^*R%KS4oaMp&n#Z`>0x)w#0BYYtt}` z@K1kmhNk|b^hCl=x_hrWe@r$0QIpo8P}I2U7`1$|)d0T#Nf(`89;SaP213Xs$LTX50M zY_;(Ci~B^*G`j7?Nb~gk`O@Dh%6jlDAC`*`?kk}z6KVB@z(yY+U*Wp zmgd3v@+pbaGlX6uPAE?A_wZ0TVGU_v=;cnKc3P;+j|=b^U9q(+9G8sB|6`=^_nQvxQmZ4;uALYl+5c`k@>Nca#7?IHca;P*P?Ie`Gg(mwUj zx@)mY(&UDrhr|zx!mvS|)$L1GQm5@Tm7-0d8O=KOnJv)!@L!keu-_-J;FABAfAlA3iT@$+Jf9%)PvyG3fR$rtr6KE}TC-O2#EUYRt5=Yv(Lq(T`>JmMq zQi9~k`{oZ%nQrghc&NTd=^bpRT~gq^O41x!8_>o63*8-cyVq=lz-$oz4GNk?uMcR& zI$jfI6-Q-^Ioq$#{qTQOu?_~w#o(3rdZ63Ek(g{=C*Zn>hVSe<%OAposq!3mCPrA#!|P`7dpm>^AsME-t>A)e$p84P)TYP(`)5s#73}G;;lgt9^q^a_%^zWVZ{mjG0$CB@+cz3-NG&|*SzTJLc z!^hrM_FvS@>!Tc5UBnxLfCBA-qm1X<)yF$HRc`rjVR3zYlKLI4(&0G&F`tMF6?UEP zePIco!&0QzMSb9HbY5M;cST8aJbL`Ff|U{hRi?NgHUC`>A^I=*VcgG5+1uj1O2ARr zviB68e&W@)33{ET@8LPkP0{!<^S7UUIjTqKl34YsRYpXI%jz)@rT$N0O8Psf<|9mC#MgB4|ebX%9qzk00&>k3|9Xg-)N%o?B;wAmVW zmxOUoRF&R-=+rGu|6SJq`3q=mC7xDa0d#v!&LW@6wj`!j<&5M=XO4cPLs&Q6+RAh@ z#^U;xle5VP=-r;r#;J)tpei^{fZnx7WrwSC?nVr}Dcad`>JLB}qD-uGstD1qNtb|I zSo_bk6P4WY^@!t+HrfsU)@}&xbA;I)R*ecgd^Xap`%Z1At{FJ|&!z*e@;u+*KI|=D zbicRuH(a#LoX_L`Y5`2JbbecP^d$I>eJfw&N{yJF4ehA$7(lAG38{0uV(5zK->bPB z_4kr^!*g48?N7_0BiH`rR_qV1JnI!IS-L(8DkFW*-P!0{SroTp&H^FvhM5-)-)ZHy z^|r8dF9uww@E%Nqal@<3%sbNRy3(iqvnpB2m3lYjAYkf=YUu$%xXm|knRNxqHQ-m? zd4QXB5L)moT<-NV|LZ5$)5dPp|NnPgpk9244}e?WJ%}L6%XW~(_3{e7s%N*l?=b5L z-Mo5An9}JxoW{OFhgSBF3KjFT6Mm08-K?c?1p=5`L@XaB^6ZH|vOGKphK-ed+p+FC zl~*`MJ4L@86@vj1_R9W_e34jqYUSYml=55f>dy9O&Sl|dL;QJh@D1cnoqMv<5~B-X z!SU*mRF*@>fvsU< z>DGRBq2ktEnA|7FV}|*8I&jmbTk<^O81t^LPoocs+iaxzV5UO+&DW#%Z20|VQKlv! zo}))4>h~Jkli2leAiu~0j0QK9Wzx*0K@DcUsL8X+SwE( z_lVEt>CH;mBQZf^?#X*s@5|)ltB(v*akK8<+q{M+{H94|c?zeKK+dUZc9yvP=+j=k zKj3lI_Al1Tb7FP-9x`XXS$$m4JMrA{@!ftY?d3i3-|9TsxK9Uo+1SOBer(9(?ZKTJ z-?ZyHdV^*-Lh&;rrcNjQAPTYn&YC|_zBL=1cpGs62S&%u>)Ua=vNMt@LBIa>U@VyC zepEbb*#;`mLI6yTPan-K;x0-Dt^UHs+^G+y%ZPDbYcX=RX6^;YB)e4XSmY0I>-67VrwL}tl z9MHl!5g_(}CtN6i?ZV{@nfe~MRtEv0KQcF6ce9BT563A-PvKbT?R)UTZmfdu1pve? zouLg@!9EEA?bMR}p?8NPIHsO^jtp<>EmEok%CH@2rJ_`zlqgC|pm@+Mw)Q z=Zw_Ie6W?i0`2(D73K~w%{-*DMcD-iHz@<*q9+W;=|oOEK!CCnK!L2Im+6cmiW4A} z!V^HIlD%;GerI<>nR`ZdaWZ1)gqi2NDv!vY}P$K z9>g)e!Yl!6slD?7is;aWzbxVlO1N&}AG&SR-#@&{u2}Mpvx{|b21cg{EO&1Qqt9-B zJ<7<;mLTJ%hnimB1B=-=#b!SCU(j#mA|56!$1t z!exUO?YGqJFe=k00c>;~1>&;<5(j8+>Q17QjM7rXs#2HrUI_iQ1s zy-^Uxxt-?CLzCd3D;EzAcRJs z6=~5udjeQHOe|f<&>yDNiE)EW_)Z=)>Sv;^&BEn+o&+v{8!N;tjC)H67wFaQ>jPD= zEh5EG5-*Z5B8_=Z^-;=I0Kejd&z^(@>6*I=CKvapY0CSi{01_uNMKui9EG3_iI2YM0s~{-nWLi1d$xa zjzE9X>CtBG0#oN&!DvWf-WLwlQp7gTs&7DN7u)G`Brn+-<-Z3p_FmM9U^0Si^3DfQ*s@FGoMWc=3BqNckXz z%4C2QU?v{t1!U(j@h2XJY4O$hY6TJY{P*>iFVu;WyMSr}&2KRhfTP@!XXB*)q0(|- zJni||^)MOFGWIv=@qL49c~Tzh3zBPR;J@7z7|&30cx%a}^YCLk|H{B8w;!Kh6lcVn zVV+3vz~}po_uT)(Amuyi(qi)ZF2OcY^5kWag$19@M^rLpnTo*3_)2X4>@5)+?r7j3 zunMb(HCwS5q|K^@z?K{&C$SNW;a@#8oo*(ZNaq5nWmV{kusx0;stD%^Bc+}GLNu4p zRPkr9X1cR(PV9OyZiE3UG`MDXKf>~)4T0Q@7<`?}hWu7!!|5a?X|SU;)4~#{O4&*Nj^`BTvs?9fq+ADl~zIFRu!idn`lLXq@%zpE>j4bdt=&(@*ceST(R6S9ktdMy@(-2GDq)tY= zu=M*^SEL)aV20Rm<0?`2((ghA-%nZX435v;%Yx0<1*#mULn*A-2_2pdd9u|rkrsSC z04IIZ(DPV|4-%H7*fZ}LUUf;u(GSg|2>vVli5;Kv&W-^1;)8S1H#?UwBL*jZgZ)jy9xlY`Th#1lX3ox(sE3z zUO@ap$!T>u^&`0AZk zgv?uFE)n{T(ijgcC?13+A>~TY+t%Zqz+Ul$W9jlcU`F~A^MxM@IeLfRtUd;h-3R4_ zXX%%g0gh1AwT;5opn)uuQ@|hII+mpSZ34mEI(M6|dL#7TXI2IA_G46vAiMT7quKQQ zj?LUhbG0ijuS;%NjtB#0+H*^(-u@hkxfE9a<3J5~-0{!1#(W3#;itv}$x#s4d{%gN zM@cTBf_`Y-lpH%gSxA2Sqc;c1e8VsI3sEAI_dhhemZDYdm=kLk;;)W_P?egi?_Wg_ zR!&fYZ7q4F{94(*J#=)hzzGU@799WV;iAAjPWG4`^BMlWzC6{S!8h1ZRI?BA#4UCd#6^d(UZ}K2)C4C>7Aq)eHwEyY+b*cyb zV;2%F_$|$y?*tpe=d}vWM2TUCDj0L(!Izv*uuN)7_mc_JvyDwG5cVM^4uv(aIoF9= z7c+%2pFKE-j}GQ`5BUt9s8R2P_vuci77nSgkTG5d2Xq5%YPd^j?(roYX>zEWaBM25 zAI9vsRhiufHdc&DH=-0aXgIq>?V*mEtWbC1c~i5oL1gvH6YbCrWb~*9uPlq6lhcmxcQRxsu&{1u+If>2SG*av)|vz?WaS*F4D%mbsw__GeliKndNE4bm&Y-O4wz9e*cMJQ;^c*fJ{pl|y}2r?4s5 za$P3g3W%<~wf!U-#Q->CQ|j|24OYq5n~w+$lHJ1I+ct0qZ*SV5u<~uq!YjY3NaGKC z8y*x8DP1LV(dW)F_dK)(D}?6;Ib3U&)K91iib24XTEh)BV>EK@6oEsh zS#k!V+3ete$`mQ-f3V`Dgd<>NkX~#J6etkWaWT%#UW6g8ZNzQGC`PM#4r;+{M-9s- z;D7f)*=M19Wy??PaBp7*H=R^gJGh`eAue_H8dQRVA9vi|1`;H5s;+kKK0zMJ{?Y_a*o!c>q*x_q0eKu;Y9n%oym5zOvOMO#+)UE) z!fR^Y49b*2sd~sWw@csrGMb=uX>zL7^1b!b`Qc1d?U@vwHUT!K2+SX!fLxZnZykEu z|G&BJPpEW7ho3eyFdj`&f)J~s+flVa^ye%P#7{@XQ#Ld}c#pu+BK&&V&mu?jYa#y2 zALl2VbkSU(X<#^?%cAjhD9Q~=o^QA2E}ap_6>RUlR#SQ4!M0DPThG4hRlbHDww{5f zeO~Jkbf@8m1H4cFQh)#63+-17_Eij&3~eXR!*5_2x@7JGlcmB}RE^N<9b20HIs#wT zbEoxuu|$2MS06r#JOdK2c2q4x0L492-$}I?8MZ_J`E%(6V9+J|L2{>gCw~%!eh8>3 z$DBb7+5d}kM*_*w=P;7uW9T?YV>;ko`GKXw-ur=ESSa}#vFq~}v-nxGQt9wVL#MzM zCav!X;N7`~iVuNHa@GI~0ox^#sD z`w7tCSB%Xefuz|Jsh#dBN|LoS#Eyb0LAxqJLX7+h8ExU4EC)d^Y z6JT#XhxL`(=e>Lz8}^|0<>w&0;14a#yXB=BSritSAc$z{PD9-j157Sbms(di8*yAE zC7~MK!SBhL>YUG^RCeibNcXT!%%6sPZ_AN}e|A_krr`wT_4y){cE8)lG6ap2`xo{2 z2b;K@Ksb3x;WP9p4#=?DB8?_8MM(;{*})j0VsQDrr8Og3=iyHo)Vx*DG6dW}h&d(m z(MiXTDbUX2LmbYi!1Ck0V^3qEloS%y&H`mB-K$~yU|z%OW1;G94{8~p9n(;)7!Se=V=Xk62rQUM97&{76U*S+aT*WEH>xdbhM`wY_$3tXf2?M!;n8v9 z1){IUQIjW!!-9@y>Ea&?iCl-(K$Efa;DP8;xyLTyeWO+Z22k89I=|EUbw0Ml1iPc0>Xo2h>daE-D4 zV|LZWdxLlz_XN-{>j&NqlEw=X$debyY3iT!4DFg7(h~-i(g6c{y>82%pMKd|`^mHW zeRQijV9w8gU-<`>UDE6s7W~PB%{MrR2ZqKVmFn4q4Y|v~m2zX3>$8U(UDTavezCeK z#)Z;EU-bh9le3>%I1-)_i9(%X6N-Gv({nAe2sJSN#yG%wuK`QNnS~bS*HiDOJ&_?Z_y5r~ zkH|kE#2Tr`nSg%=Y;}j*>)qe_9;W$m?IXxMy2QMk)xd9*_Q)^CS(|c+&_JwIcB9u? zv|m|)qavneV3b?m0`xl+Kc<*5C7)?WBhmTCO>Ntu_5G$)-}*yuNptHL_+(w)dT$H% zlp3@bOcU9JIrPk_x1%JE*66$Gr9Ey9S^#+ASo|lE4?0fj1A{G}LKI=VW?{7bHKl>d zeC;;j7luV2-~lxOHogqlc0lCsfc0$%fik z>P6B^RdXxvz?_Eoi0}L#G}~_xGN~>wI!B#U`&=bZr%?KGR(^vKCX>HcZ~2~5rTrcn zP3V;i(ps^tBiAc`+rkvU8xUgp!}7mScMHm^_C53yJ)=92W&4=FS1aal!(=&pt)jPXLsnYRDjT||hY0%_F$fJ_mfY}%S1)lS0Hcj%+{a^K<7x`M?r?zQs(FCsK{!ex5w2-W8DmJ)o9)*4}pBCBn8xY4sX3J5$SG z!d9AgIwyiZvXj8sBOw8sw`&v&eJagwVn67&cMFLdR3)^IqRCPUaJyKAYD2GEZ$jIl z8spz$n<8nnALF=5&B{bYFslpen1KK8BMQ=oV9!H?A!qltDL^dnRJM;&<>8ddXf}HS z@ELK~SfKX;o&%Jx;`^sXQaV9XRgO#*ilXN3lhO!5)KeXiVN+^hy;}1wcgrZ)iYKbIt!nH8>0abMZ^PY#DO`-JR zTZ2(=9&OA))HB5ts1+pVCZBiMbE02?FI1wANOaJl1QGaXl7iv}3iJkv_%pY5#@nZf z(|C`d5J5p!6X~b167Pr$f|lAb{xUamxn%KKS>Fh!6DZH%)Os=T9f&Q*zzB)ExFLFnGNJ-^?1Xyr2KiXkpwZIaa}|EY_{KKzolM#v`la=mlGvj ze=tGGpvL5E!FCqXtcJ6Zc~)x((~b6l{>;cS*n*XLy!q-KkglX#8VYSQO-q-UN;yRG zC`zg|8D#Vg3S$`DC0x76rW%um=0#X{+UYisYB*~WX(3O3Om-ODwIARIGRq}_<$t>_ ze*pN`W!2di1W(F!%v5>LqH3A|bU^{NAlL*j+Nq0>ePAsM`R)EgTI6hIvVjRLzkBi* zmS&?N)>PraAD91*IIUJ-I8BXhU>fo#OSBXH)$M;YXGGLtn%aG3;F&z-frq;|Zi{YtDQ={aGPk6nylN6ko|XhkW! zcoi6D{y5GwCAOCKCcRuHN%zm>cllk+UmxF-6f%s=8uJ!S^ghl^gdcGb92unYVV1)})@?Bl2$2p0{CdJel{2S+ zHrqU6SI_?XWcE!tuD{joVQw2OAf%I^P4rs6KZJI>WVcm>hO0P8xK2sV{4(s(2aKig z=LoUHpUsYh_{qnX#VPy_e^yx=kXT`208R1(-YT^2v15jDUf4@Ug-_A!a2g%gLX1gr}AmP?z_@` zpI#TTLD*i|k5wpN1-Fx9wZ9F&u-Ycir3Fl};UfGcnv9-z$$UMi<&?*W!A`R6B9rFN zy^?A=IJiE-fAzQ$jT2Yp{_|`*#(|A~<@0L-%a4Qun}YxSgKGkES9$!K1G`)Q(wsbO z|9;h?|NX13X@91Td3PAToHdYl`^p!GW8)j(r(f7l71+Ie8-x6huyp%?CS{D0dD*#^ z+wJF93!vv#E1UkIN{66uao!%?PeUKzn0;9FMm!kJJ6SXCR`IA?Imt0OtDxUJc77D-;~8V zl^fY;A9$E^IN>iBfJ!l4(h!yU~lE7o>+%{h<+3}65`%1vGJtgqgJmPKS<%Q zAi+Syw-aY2HUfb=0YDkq;FsHh2{apcaA|&BpQ+9T3O6GEuTx?YB*!{p2X%b5$?Jqs zg6T8!E^!e+VuT5^1ACnNyzl1HU&-1?!fi5<1*paL%E8>k;v67B{Mh$lEud0?*aoh^ zp`bDA4i$+)tKb@tBZ zr@&6SxGGeIh>r#>iaqAxHhi}V6x#idz1#vL6eL@yHTkAGk96`)xrl;|J~SzhD(g=2 z>>glQlzJ)FA(j%N8bOoZedurshH2xo>doA!ZtSE)ud~N1I7zs~&+prei=QFN$3^0Abg(wN5);XS0uhtD>V)E*|H*eKU9DFDANt z;+qC^&?|<`NAbURV%l9T*3w2pfa37dy!NZdqN6&mf?7i;tat-mlTe|NRbX6exeD>U zQB_@ahsxz=j3$7lUhCPg9A7OJbs(WSr-ISTxM5`9TAW|^L>ho}RvP7tdyBW`Fu0!~ zk_Z`uT!=Q}+gn{P`(Is1#%`7<{bj-lEVE<~E3FN-0shbzbdL-FyvOqM!piL6eft^J<7PVK$Umm?%I7j949~ehtw6h@1Ib2X0Fd&z zyV3mFG2TO$s}Z`j)%cU!<)f{6IuaU-r&F)1U92DqanOf($oq%e@wh`kSK`Q&=D-EV zv%)y2q<#>iX*>`$BL2AG!Oy6|3pQ6-K&7|!OkV&+UVm9tryJ}5obKI}hk9Zy7(MlY zQ1tWS>GAF-fB@`8C>*Equ-pu?;YG5&EbrE>>z^4<<$=QP`K66JkE5g1>r{|Jy025b zcWUei;7?V^H3cDw{xPgY#_s2;!T~Pua6q8Pk1sEIFYmfjCpGrkK`gUX1J9mFotXfw z6pgzP!cE0<=m?49us_&xGYf-`+8{E8e&g9|z$esMutC2sGGZV5Y)8jY?=hL@8en{o`fkMd<30L6peR^x$U;7swtNMe?(vj_p z=HPeN@v}&)ioCp#G#AM(LDlI=6U+iisG!m^ZtUu1R>2|fTMlvV&mZ0U662PacZlOp zyJ~KB^y&K#x?tpbppL~#u3W#PihT!a9%%O#VE&)R3Z02*2b zytx+8%?zB(S0thq{3U4JeJB9r7N^dE4s$A2WrMfJqxTSHS_6!_chmQO9+m^d#RFbe zEmDgtBaU{lTZ)YNca);)?l5zzOZW8&(bBKJ0Il6W!kxp98-l`4ZVGNYYgY`VHKpJv{F7I5i%-*uZH&%v3j6&i03`P0Y8XArRh;g5(r;t8~cll}grafAv= z=ir_Jj6W1nREeU&&%PdnPCb1VX?pGhAUBV2XWQ$fF=SM?0n(n0$0|eBBCdWjY=Gme z_}y1pyY4LT3u)P~%VpUK)vp`5Ct*uGoEMiM2%pkq4ENzByQjg_Q8&7 z1^BjHCK8l`Jh^bxDa;*!GNuzkSlC+mUa)N4+p_!{F*THvLMsux8*!=K>>da;vib@p z?-YxggDhq;ajP`gRQH33(35%F3F^e2uNum6q2=uYag~73&jS!{2HI8&&23$2L2e>N zNwY$%&s^Ri-!^B3an5JlZ+M12Rt5E<^S^B=I60it`UOmw}QF zbC()nNBuOHIGJJ(g=K4(1w?xgFD2Li=Wrq`Tmb8;ScT$gwx`*q{5Zm78Eu2N>(UN%fe5 zj)VINX{2vfQPh#V=tsa)>P9w<<{NGl@m~LZ8>nRSAj7yj0W^!ebm;Y@*PtHlN!ol! zH`6+0)u9IoUL;)74UYX4abJpu)EcyZBVyFH>$Q_cW)6H<^&p{L6-Ky3ralc(leKSq z>q*x9*xD^o2-okwS*QMKO!MY)Y-{^S&Cd8gec0f=M9SnImBgSaFDAcL6D zeXW5Tgv!jIiWuJ28b# z97w9xI%X14(GY8DIfckKLn6{yL-@ja3YccrpZcN|by_{QQ!_EOxQICM6CzU1D3^@9PPX-2Fm#{BdW2&ANV9=Y_DHpBf zm9$&v-p8uFpMVDSYfg!Y3}WWO%0J$)SZ?EV_@B6}N1OIAN&nxc{DsvdyzATIcx7q&TB$eSftm2Sway zFX!^(JeB>#hs zb|@lN_Lf0jL8ltf|AIwr67$l&vg+PqoS_1%hAZ{8de9T+j(wYgo)baQd%+2~$P-psl+aM%Hv z$BVVf;aDj|iG(_$sMHJ&tX1fTpmG9@WzRo$V7*tt8{<(&XX8uu1$Yil zWzu?DUFR_oVLQi|{ojr$AT}-nBz^|1lLE}<4jdUWo@Vru zV}&pc4%+O37ohtRVE6tDcJFPX($O=S?POztoX)mg{>H5t?N_arN{hP3Gbvebx40Si zz6Ijv6i|3hI=@Zo&%8P?m~87`>D^YA@bSqCzh-*$YTB{QtGRl|b+UmCI^%VI7n*Kr ztO_6wkEUOdap1?btLOeWm#{MP#w0!C=!d|4x_6`3V-&IV8UIEsrI4A0vRTu>+2^cw!m%U)aNnEqoW&jO`DcL|qu2 z_BWBTt4+VGyxInxf%CtmxK|ACrk^ky!zkNWU%33P3miGh)|$l#=!Rf#L8_U-9R7pd zVVFfn_n+)rkJ`FK&6D8z-C-{Tx5vyvPK4ZZc+<>!86 zB8`nLAIiZMr9;hdr)?R)P@#^;{-YnK3wAU`Bv}P8guVytg2}!p4xKz-B}FC*!0We9 z6?52xYgeJ_p7J{qQ-u6m@}UlLgj`VXXGQ2+3*H@l56bs44$%E@y6?CoSEWp5#RfDd z3;ZgXK9t5mgbA>@!sR6-SFHg(NUv|6zwAAFU5!)ctQqpHEHej+h zba28O4dH_$qmzaBS^$E`Dnh9S5YT4C3xSNBR%px5CT- zdruzwwFX;B*ws9ZD+QE?Et~MwN=y|w1sE90Fa(=V5nw2z-u0BtUH&3uu)xm>TS3E& zf|Tr4z-R}=cOvAFh!6}6?xYS3yORw32ygmQE1csOD1nI zhIWWO6K><-s_1i!F2sq(5)X_eS%(a#2bO<|1%Q?MHX zL$)B#_6CQi-m~J{v8x3jL}_>!0yIcu7<8C$7EEv>T)qbAbGvrak%+`IZ-;%!xVk%Q zNcax8Ju3v?D8chgvD*J>TBK6G63Fvg6kB~$_0eDpxEtL=6xx81dif}VKbw-P0Y6HI zcD_M3;d`FQ%D68D_(P!3OJ-~^X_%{)vg(2*QRn~+xcEIxgJG2QfH796{-aO9%mTzF zHp!z5?Nunu7UCbj*fZp90H_^XJ+|-Y8oZ=3G@ORWdET}=Xz74aY~TS?+oQ{S-Z3UD zH&)87Vw#x*7yP0Bgo_!TPZ{0_>0uigCc-ATEw(l7ClFpTzi0J2p=nC)T6l5Es{y~H zk0R98pST;J)yP-08UsfaUQBl0#T&$93UI|Um(FO^yIWR{vbiXLdkEb6qOQ^&m^pSs z7wO`8S_i+f4Sw4Di}!9^q&|qczB)#S(e9Nf01Y7iA;gq8%L6mc;nXiU=nKe>IU#u8 zcHBvIm}xRsv-r@OFjpK+9(dwKOJ*6+{GlGEfsni-LR;~S2}~QBE7!9>#o*qtN5lAfh>euH2(XGps=JIhYczQf@j39Vza*NJL9YgP zn>?4sg?$De>)Y1ZferR&95)UR&V>P%Uw22~X~IjuIGkV@2sFnTk_}9Nbr;EL`8%ZX zk07=0xf_*|itgOuZm20yXe0ELPZ9gGmC5?h^55Badt9V^CzPLeRq#2=xYck#dMB6w z>4hdauwh4`N^T>3bRCWUh6UA_788#OdU|-ZoASoyMm$k^tZWz;gkg>n?^^yl58)G`VRC~Xmc3$wAlYRS6D1op zO!l>~DWVXl&0-#SJs62^+J{d}0C@Cd>-Jku)u`tJ?u^9TUf`zpm)|%}?I=x{btOJT zngfNGj^z7&4n`ziZ9w5IS&2dl&|^j(b8G}*PBK1KKc#{b`-rd(OH8$ z6%QeKw=w#)!gc!7{cqQ(hMlv4OZ*-?nxWTk1*wtH2PW}@v=t^X8TtYdlUF^l<}qU^ zdXi>0{R~(N=A?HUrr-b=BW>pO<+bwYMR~k?T4gZHPXFUDPznL|cz*WqB4a?2iEA*^ zUmaR7yZ!}~|Cd)qJFc&dUi%tx7$@ztww}op+X`3kualV`g=rTNEKjnzuYMw2<`4fFaX#xREVu?BLxo zW_a$RXxxhJER$hT@ST^S%>8P0Dy*S{Ds|*{wLV|SPs(>#a%d1AHke- zX^aF_19@DZYKma5?^=|Vg2c!v`7@RsY5B{rPvs%Peu{>nqZ|H+_7Xd;U3y0Rr3edq zs}X7rzTqVd)P>>|{^iHq@@O>z8d^>}Qsaq!EC*jYE$ zO7*Z2S^8v{#`NwX_uM(hHdBtTOUDr66OFGLz@MK>R6{oD@)I)K~VQ55i( z(IpB9-5Jn@ya6VX8=TUw{{Zz7vU5OoIMy~OGpi3V^U%p0v<{9^Ktmh=rIY39K~`S% zK5*!HIdT?Z+hc)&U~{4S>QkvB3i3pziPoT)@hB}RtOUA5)3Ps<>TGa<3xF1)} zgVyK`f@vX;PTQ1q2C&ua#)93=k7f~%6@Ie8VQ7Qw7c#;NX-F)>&H#*Sy!3da$pdE1 zC&`LcD!GuCRrgrBdCw@7@{T?`^Ul0~yi(5wCybx?BZ|04O-3(Cw0gb(h;Dyd9Iq#s zCLZ@m2WaUr0VK*xH&Bpp(DDy+LF`RvgL$BC^}zu#Q@jSH`T=js8CXQOr{KnFo7V2? z18lwPCLT$f2Ebsz9??=YRl7N$FrgPOX1;ymulG{KS;W~yxgjVR@4#l#o*wlWPG_L6 zRzpsh>=3~7qos~deuis>d&9kd4#w`~%^C!(q0TMMT?H$<7!riS>r`#&;~LC;&DQ=S26^$n^tXp2^a zqGW=bALjrwL{*Irh^@AkgZJtQD&}ecKzoo;g4{?rZziw+4W=Lt(A)BSyIBU5H*7~U z_f8%Mb2Uh6zP|LJa^}=Cgxa^73*@S{AtXBHYL0d$&8-ufrdDOcffiJSpn>WDR-azx zy98KQ&^*eT1(xe^d(?A4}%YOX|7}3ciBPbsc6(vyG_VFDN@osT#LJvTBqc6Ak z<(jP}V%CjSa(}wFcb;!eHr!P2y|Z4{ZY2eiP(-MOuNYV;VtI(XG!}nMd=5g)LET}V zWW?8Tl!h0CfOsg~)Mf~?oj^uR;O1~Zu2XJC{tcKrW$onr4ww3TXMu>A{@v%Do6!Nc z_}b-4fOuOY5;*mdY1L`vVIW1OfBa@&CIF=MnjyZ|sf_&>Q4;nvxy={6i7@{Rl|uj? zQ!o)+-WtJ3BmYWIdoXCUjLaK$U3G&uUxh>#Nk2+Wkn`L$=!>RbT)hBRE>Dq$Gv#98 zNqcbPVd9@fz_?yMQVZ%7+$TNeJE19LY&HyZUuQ@z%V+yE=d~Qzr7L}BMPwu5qAuN0 z-P6w^9_}BOSJPlj6chw#OeJ&*h{?;&x%{Zv8)(>x6b0 z@RYPP{8^qkf3wBH=Hr7F1KV@J$iBm(T9Fj!_RY|_pQPJk_Z_ly($0X`@1CDzVL%^H z(QW^rkd}Vlukp!>umS$G=com^;K5Gj5q)1H)XLKcS?*{tqQv6@9vuWr%>e=K5+hvw z$9QcIM7aHQzg?0`G3YmrwH)$>*pgNa!S{C7LsCnp^Ez-eSwShEK&5&IT*9{igpbRf z9{;#vX6H-*<4CC?z`dtKDWJaTkc)5=xs_z=Mw)XfYLPuiR5_AW`4dHdBNNmtp^}^l z0E!PnMtKGl@TQ=w=Iz2#yBUM*y9BdAJJ+sdGCzWdwgKjw^Y*eQJru0aJ%8Q9aydJ2 z-qPjDULO7zC6c!*b*wC@{?y09MVTWWe~>}puiKNAv)6QSf4KlpWyMCW=9K)lI@2lH zr6ZQ%1!Xp$4?97%CbneQpdD&*CjSWefm2E)u7@v3i<)FBNoyed6f_6F#bn=4rP& zza_{NMPJvzbq_)t)YNRo?2o`{L?l7)DsvSjK>8j|JK`GY7m%xbHb6@GXyr!hD5{8D za$}K)`u?OPk%SXa>&c$AkJYd@EgS}-xCbDdrECj%Fgd-sW8~D&>#(1+-}GBqna=)* zIFa+oxyXDJ#?~y}$@|L2E7;9SWO>+Gynlp?A`k1r0jJ*ZC7@=+p4mn^GpUJkAug&-vf9OB7c zxuxhvS~%64yCSrtuj{gI{7Iw8P)z5F@tyLOwl&W-MNnB&P)1YIelQ!lHtpI}sr~7( zh{I)EZ@Z|rM0Z-$NI}?*;%KY1OYNM%Z0*nczB*|;N7AaNI}g6J$m8369uAow(XfGY z3ADql*XoNZxwK7L=4V5+so-WE9_2KWEME<2Uw^p<9*_~>@^b7d2Wi4&q%>NNVBUV_ zdI!!#^Lo1>Es;T-mI5J%yD154pM+ZJAFbqYcy88#K?}|0n1$B4Vcu9M?;F~ z-FUkQsz2vfkUEd6YEFITtJf?~@RYrvudDoK`rgcRd*ly;4TR%Jp_XYO%x1Xpr-6W7 zi`q8+?y>g*?c~H8B5^mJtc9^!zvMt-XRBE?38F$+F7M09fxQ-T2(2mrN9N}DFn3x(S&a%|#moQL{DL}qSykOX@~mU{Q2b8yKrzI_3Be@>* zw&;&#OhXAU4biYpI7@tQh!glt|30t@)zAI0LizL4Q^ZfVs^Y9>f|w%%HeKOwTux3x z{2ns)($+0yA>gpt;P9PpHSq+UQWZuH?^6($bi6F^;ixSB<7GH`4qjxrz-=InnZA9R z_X8F$d69mwN+#!SVg&^6@ID|yP%OGA0(Iw);n0i#- zw_vqthaE^6ra={-tVDewuM90bsZE>fOo!1*#!zFnJS#;QrA_!F&qDbGpcog9&?@s9}ZcK9|+b+!K(! zcQCsoK&XT__S8j+7Cd)8F4=(_;JE4AnANL{$p%XBw%h!6l=0)8wBeXu`#TMs_KNk$ z!mQ;+zoU*SvSAgIfUvr|lN1 z@GYA#ymDPKY~_|Lsm%1FDR{^nTkU*Vp&{%aaGD!>mC1M-sQee@A{2p2r z;V%PgbT0#x-|Q!@n!j!P zC4^)S+F0_yOAd!OPjks4Z-Xw;6tOxPL4x7Su5r#b_!b0fM@#QFhXLnJD37?T9XkPJ z2T1_Y3YC&1xDC)Xk!;%XG&mRmG`J1`Xf|Va1E#^X4iF7II-t{Bu|id#_nbHq%unkq z24eKyb8`3QdPa-*Zu7PEO$bzQYC~4DpCua*VYjiGz;~Pi?r4*CM#vov=1?Ac%ELx> zya~OpFuN0w1KQ|69MAwuc82!+A1wKQu;l-1STcfrr!W77eSrzF z^Sh4yuQ5Ntp$b^RilO!ygbdl~6W~9Fey{)<;{w4)IiYeYhNU6PNGJr;(=afX*#pAG ziL~`(trl(9Wcb1~*qYH)9P~q~gwA`$Ld1mIOQxE|Vonu?QkhZ9W}MyFbc#{qN{puI z|Lva4z87Om)<1D|k3TDf$`}}+*##`*k}kk5FNwF)mjDj1w3d3B@uv?q71dBlSqJFm zBf-Xl4ZkE>n*$ikWQ7ZtdjLv*R`VB1hg9S@kRBR%?-kI!h484%gQl(A?JyaOZlsq6 zI106ar2Y+d!M52JAB4eigt~E+-xcz_3i$xcZt;#!G#HQQ4^wonN>l@)QSU5WwGKZD z^O+}USVb`k>d4_x*K4t2G^vvceOsyfB9-B?2;tA+RKF;Wc?Q7D302+~GLTqINv8qH zU%FV<|J@cws=zHgLPa&S&@tiup9@(Vd+2p)`e)LSXCRxyzD>BjXt&1dTX+!`B$(wp zzuN~Yk*#5Es`~VNlKv=Q{e`Mg%N=!CtRFA13~q-zcv+&}_7qD{X3wI!04?KvNuT&a&i=#bXpq1ViGK;G+V>VU_c2M{LTJBg;#)|AO7d&@d%*r zLh9ST=J~>KirQi ze~c0}MwoE}z_oZj{=cbL&A?5>(%{s1#8^0x9L;!);xKrOgVkTw1vlbnugaEF?IEV- zg#bojt_tnJ!(qQtwwkf_O3@pk9~WcED8@j`<5QvK8McI=Av(4?rs{(hJ|9(v+Ab+P zdm%1GA04nE|0QmaX)ywBoCt5v-3$$875eKSt`c_Fsq4=ky-4A~{W8d+SK;ZOiGU4@ zB&(FM5}6nJ-qv6jD||Pd9AUbww=0a3C>OyPL0R%`+bw8*oj4ow@Hb5asN{q%)f@1=HuPDcAOcbOW zTyzDLMxPQ_@7DQ|3{NVIu~|e?iGy8 z-y{yjpn#y5=MkSK?M{+}IzlNdFh(SXy@kP8hhEHO=WTvLoFz9t>sdvzCBJaOI-j#m zel{eqN3hU+FQ(VWhuVDSKxW!%tR;yu`8;01M+LeJOt_6O!}r5*$wJ=0l>O+k#l@## zn8SPgz>zll`>=MKRMUZfP#V}#(I2sNE($h=jW>mHF#Bladh9$Nxcp-(r8(B|WH7#5 zFM~}7NHoo9mb8(L6hgFurG){bk0;~W1$ZDw`OTFdxL{F2xn5QN^Fi2t#NlDXFP#3% zh!5SFl$M&++Fx`A0oYx>xnGg~;D`LSi(%q?72_Pd!f>n00*_*7I;?7e#wB4;T{)mb z(LOPY)tEg{3>>`}p+`I>5?tx&|AvIvXO$IhHBQi%OXagpO6xrl7^3#BW?*7C(AC0;L7`AtQhV3zI9*x`wu^`yh!Y{jB`1Rm%PGs zvL!6q3;NxwBDaF_MB2{=n3`5p~u4WUz(*iV@bZ>G(^k~+DDtPWtzSb_45A>p|w zVsr&+l{Zit8dM{6f7v1@%K`UWH8e?rj>{~~j}boD59IaHAQbGz1?7r+W>YA91c>vu zInIL(NG(*x1|SXmW$g2C>UxI{c@%==;^O-5?H$M_DRwK&bsaDEN#F+fp>>?DwTv^| zldAb%e7SGPGmMILP>%G8!thVu0NeX{s4ETtr`j3md6BY0ZM@mw=#DfY$cYnl9!{sj z*jUStJJ}G$gVpUGVD5#wqE5M&yK%`?pf8ObyB|)=y{f9r_)u-YL7HOLCntdcYR0=- z)kcjvWX z!53M2un~~=;u4e(-yWbQO+oluITG%m8lxbe7Ou>reMJsnS`W}byN0jhv4`&yGQh?( z1g$zPXi+u1&EuFj-5KgHPv-s+HrVYSdAw!jn`Z9Ijkm#nc#F-6;O(bgDBa9F3tiO{ z;|w`6v~)X=ojIaNG!S(JQ@M{LI*)z?Rvgdn&{`Mf%L4r1r*e}2i11KsSQA~SiQyc8L zV5RG*9R{?}S)qAxWehlA=#F4WoJv^!xx6nAZ4Iiwy;d4+bW;8Ar-hGQf42UJn4 zcJA>ru@{WdvhhyH2$}?u*qP7FouHj7sT(xgdO|X7530Gz#r4!{ zEkpjw`U8%8I#ui#MyQnE5vJ$BOBTNQ9RG#rlZ`v1jY%a?`gS zO@05T;^z(nqfKv?=2sleI#?xw^NKknq6iXs;g%1hQ^mP+!-H#ZEcU(EZP<>osu2x4 zB2yc$huaT}2(*-Oh)03L=u+0g56QRt_WS7ND7-JJIl6wXyJTRgq_nGO=-s{2cw3Vj zQ)M@YN-+hFunWJ9tIHWZ^Tk{KJ)DWy6ey|8VDbS_;rCV8C%mzb!VV8f4%bIeHy)ge z1$Q=GS{9darn#l_CRFuz*KJ3#oDGVXbCY)~m4E^Gjcq2s8_>89;1sCbrCe>3(2cyziz4owxPUBq4~jJt_O zO-M`muKyDLIb}^_o(RrJi@M~h#k`?vpFTMe-xjnZEoY}p>IrQ99f1I<_?{Htvxo(D zQNIgdMR=xBpci!QHxiGxIf8^MCJQtSHKWU*@1b!ykd86NYU3x>MyP^oDXFUo~|FZ;3ITv<96BZf!khQMOkOkV<6NEQdV7%o$wUI4W8*SH9sH$x>Y;G zn@OJ}M5;m@to#dL4@n@GoGHXEDXClhiFOt%=RuHkZ>QS!TF*DVFg;7!&1Ei5_FPYS zmbUM4|EWit%=>^BWAZ8+C7;5V%Vmf=gam?#v|e8#L>fYxOC?IQxx}({WS|bDr&Ay& zt%;EuXj7XK7WtNYVZ%w*3yXh%GU9=<-B3D`fZg=n39&a2cBN~W=%z9i^>p{`!I1#b zkG>#^dgJ#w>+?XeKGGMnaf4zBh!9&}{{imH^kP!r*+K6xHe2V6JW1p?CAYcy{?or) z0I0cV=_>HMPrQEo*{wU+XMb@Qa!7$gTBE25ADIatsd2<69{*N!7N5uyTd?u=dfioe z*YQFQdQDajf|fJwUspP7XGl0+LZ;Sw<*%MUWZvm9ay4){u}~yf=QQ6mS~&_9k3*)e z-ifvIvt5U&T4|=|K<`w`{1InF*(Co#HTR4qWF9E!aXSs=Hyu+ZoMO;$k!Sv2~#J9e^(JId8`!6XmNdy|9W767n5e zqrIDMggypQ_QPfCruQf_YP=1ltG+b@ds2TdD@&^fKV+>Rt#x8EWmT}HRVOJo389D- zdGg@d6FX>!b}eFCeE5qOlEc-J)X3a>z(cXAPH(A0iNDZd?^|f0tr5PY`*Vvx=NcZD zha5JsQoSRY^A)>NHi!m$L#&=e!RlR$Gr+*P4XVSgtMPS3_y)wgLiDpOV`esdc&+HJ z8qxrtk;wX={Vq8-G?~rvvj$Ah`F!p?UF+th{7h{VAvE$-qHi&egUtw-!)jc#}wDMmIXrf$V&-#r80e@gktb+a2b)lQIy zl+`G-Ge9f3_tupM-3ZV$5C-HXiAVb$5q}8HY8Q-Te%a7B75%)iNk3a#^D#xpN$EDU z+1)nz2%AVw#16Fi_;zlrD=WNELsIR#aFb3`THZTO5v*3YQFm^r$fk(0$ZepGtI#jG zRiN4k3bSWwvtywSYFo7^#_YD`g1G~xp}8Ag#8Q5OXWX4*brf9pN^m4cVrpUDeHK&p z9&>0KD$JpGze^J_Nyo3744&i}MqZbyci>ESCIcM7TUZa(v5!-5Ce?WxWDRk-p|br2 zEA3!)MtHOgCIBbrh4wFjU(MO&)vhi6wyYuGbe)z3X<}0Dy`m{+cB_;8oVUbL`|k~n zK+P@I25afJLrcs-^aAArpgB^Pxy+TwtcZxo+Dv7Iz(g|fa3xi3BxU}T`?0Tqvp;XV zez7uf-LBNGAX-b@ALfgFF$MT&obBrMEj%jcJj+fTx4@R)j4psmZ7 zD>K%}uC^Nj$kK1UI?dmwn=Rj8aDaK+=@XIjxWu|rlh42-eTpoU1xJwqx7sgQR6IMS zHch=R)}Ywl64LHTnd00NagFodqE^kQQ{WlrshJa<1K}eZaid5%P)4QfMbl3L;x3aF zVG-_pZt=m@A73ukC5-KrZcdC`f(22=P*ZKJctHAAxkjk_Ky^t}`!4fS8eu%&60LT< ze|}pdwfjB)0GqfFtN>w4pLwE0N9M7>VLJ8pq*`8vhw-?N0jK+wTW?SIEP>T!)_u}v zzJ|y{2?DyAsg@mvd6l6C3#G;CIp5%bCwG+O6}WEVb&5%y|A`HcuUu!qlrj83IJP(m ziJv&Ar`O_GumY6aaHgHdtAw$8Uw&7j{@{8plc3AK(Z&C-yoU{sBrf7t8Bk6Qfeclr zN`Y6})E^n|Dw>f^+baghxR0)FLsr2z&snv zz8T*jg36vZulGt<9>1VAz&Ju)_){8zW%XBjpCss{10P3DM!3*5G`|_A7=bEH9ak zKOFkmO!c}i{(IyLZ*-uI^+9Y$jBnrf-z0RSl>LMgiZ=uT7cWu#=>68-O(_@BntX1E zo%au;2xH5hzEUpUvt`KN;i%oVz)Gl$Kvr8 zfLFuC;WyF6fY6K`pzx91d2ir+?P6R$4sZLnw%J6$>(M?B75KZq$DmR}4X2icc(773 zBVFX52tfzMyfz1}9r|ff#&rh7I4Ifca3k(!5`mRmA6E{@x*au#M6?Rbn+9yqS zVt6Fnv z9AX?jw{Q@~jq-w!L}x9Y?+Vk#`!6G@1uYaKzXa)-sw1ou(%Eqz7x;H{&S8VyNW(!^ zx{Gt`gTLXFBdC*~A9jaOPD5*2*{;lO2sXl5q$IIo);($j2w>j=*?<*WHWX=}b<6Po ztYaFCzx#OZ!M7WaCofR=@#23(luoZm(cc9^0^x{=9`yf14;9JS&=CONO@Ox0OsR#o zkVgufu45nE)A6B^xQ|N0x+*acfdD^8WX8PXV#Rz&b(u5V3eVAgqQDgT<#}}8^Xm92 zvmMTRT@rd0gy48sV`CyP!5>+NuWn%#_p2gB1;8%^YF@nl_`9}Dkj?sFNg_1)CBvpx zc@oS&l{trY6tO4>MlgBZ)Z~OHfyO`3nOHHF>&EyS7h_x|>7(+$?|*Q~)_=R?Z!-bi zLytm!gckot;MtYN-xy}C+Ss8ty-lVSejxV08OfkuWJBMpJJaWI0JavQu)})7xv?ym zLLtNcf1{QTc)ru70iNN2A@P+5e_XzgKD+*-a%SHJuY;r8aUx381#?1aHE4Z6(DJiO z{<5q>5fXTEsuQ@l4UhsyVm~=n9xFdbBBa(^MyNI5EFLuEH}!m2;NPZr^Ad#~xpYvWZUXzocN|k=i7qh08GJGET8VtOPb0io*`_7!WjAo|XbU-(*Yvwd? z8)U=OO+z=JdlGH`(LLdk=zqI}KAA-VO1c*;$BrOqW8`7;TnA~mc{h*!QNgntwmHHN zv^lXoLUSv<-WC@LdO)4O`CL${!o&AQpzkd_J6XOBDy*nN=oG`;OCghqBBcMch8)Ktc;m48!sYFL~LKEDm-sR%B}Go(UUvQ3priA3tRNal@Q`?RTHhj}pjXjQ{Cr|D}Pr|3mWtqwtkaZuk8sKZ8D5U+HHK)*{-kn1+o1_G~(U20x=hCjgH_ z1b;I$?AKeLUg(m8aRB{rbw3YPX47-u_eYq((g*fp2T4-Icr}^Jm&jT&l@b@gRL}j0?Moguwvq0WR41l6C>e6Av=WY)`F; zGsD*3YTb8|-uM1?B$!5Ua9B35g|1|V`W-avC1AenJNmBPufengLIeq9J+;Ux56Aze zPZe|pv+7t1yOLob!bkuyTI?Dah^`#`9v!^&74?&M`|v*6)Yz>?{izNS@*4gy^>oQ0 zH8!3v3Wgq|7ecSH`H#KoUuOirpa{kYs>?C^=bE?VCtib|rT>isF5hTy{(^KM#2q z?|m4qU!%8Yeqgk4%Zl5pA}_p&1`a1mdw6+Ob94bzh3B@--j`nJbu3gOi(xyS_-Zu& z-|J6b|12wJNP8W=Z+zi%xIe2Q_ffc`)Znh|(6*Ma0)B;fw} z>qFpP!t4ueKKs2c0%i+D`{hN0wRT~jQ)XFQF<4E(#%0Md-q1ilexer6N%2a(9@lTZ zwU~D{342L>nBYIWjdxXXP6uflqwIEp+gPJ$R3d4(U#ehLSU-&V5i~6i z#@Z8c+d!->fW;XhmA#R?Z)&zB*8fWZtO{fN;$H9S=QwjnPyK>4pHLhGaLTaJV8L9` z<~C5G?`VsM+g?cGKZLDE}OZREjGYV+suUp8zIxr5d#+=f>9-F51eZu@Q#dT=b@7WqSn}h^_gs zq{oA1b5(=aeZIwTUHHilgjn5f-!nGwm1r%)s{nWq&cwRr;A=z@D&7%%z-P1%DHGR; z)!7U2LV;nA^|7lL>)-r>Gr4E*>docFKc6i@iBCt-VfpKs(8$v?dGACp%;#tW!4!N7 zO>VD&N*09f-Ou;=bJd5&`22{*GRrCt&?DVOV18LY;HD2ySlIsab|^WcjrU45NW=Q! zz+~io78HV>OTRu`xdC=fn`W-pT|mmE#h)`?P`b-T)mNOXsC zGGDc&}9 zaEL+8(Y6iq?!!Lme3?X67!F&vY7DjsBJSM5>72m%G*1XA_z_7(G4%Jr@Jp{H9iTqX zyJLk?Zrwr?gLix$33h|t?l@F>_eI2cZy}sV$qrK>aJzc38n`K@v0tP zV15HOQyyVE{EI!SU#d@A5&R%G+J~-)M1qd>pvJ4&${yi$7fA zyp^XwtXU1<;~V70Z4Cm2NjTTnLUv9+Nn7;&;tO|FI*clndmqX+38k!RBuj*7yia+o za-aswTj!iHJ_l(RHyak+Xjn2pgH=Ay558W;eL{ABP-=RsR(<2nXnJpv{!Tdvvdh{D zI+r0IF}H_&ToIjZn+}gAPr&H%^eydUs8*nheILuMGH6ljHS|u6Wd&*)H!sV$?g#*wzVl4a0Vtl@SSPl! z(bfw0dVVx4`Qn(|6(f+$Av_tF3Dxqh>#>Hcuz^;0#!W#djp2>$4f_HKi(LdiR6IqP zvKe66g4=`-8t0{`-a`Rt>HFPBTLcMOqz=AW&APZ$K2{nt00DXt@}6&MYoKQM7Bai) z_*llhO3$H?IH`4zltnlxJ$T{*TLqsG`0l0hd3!_E9enI+GdFhf7QW`Kpx?T$@u%EQofHRSx8=03l^MP{Alrm=l?9(31&mGi1D-+sWgN~ zX&k`78W_6$g?d@zs;UGN(uA2^;Aue}t-h|lUGWv=?0b*(lqNZr9&4uH65CMFp{x=( zgnOM1>4!ub(}YeWca_^vT2%4kS0=;@-t>|{gE7ls7e+s%s71AcsMur3x~pLR9rUSr zU^>WPOt873`d?qvJpk*n?**%(!dmazJh&JX`9tcB2d%`6q8lJhaliDtZ@V@2zXO#0 zt<13<$na7xU=Siy22;oO$Ed_^5G_nssnj>jCj~wVfS6AA!KRNQ(u#qvS^_76fmYbI z8Pgk7+sfue+c1+4qO;OIGmEt_i|7B~k|IceZ55UW-p-7CAW;8z`1cM_5Rw{E)R6M+4u_@*`5;_M5T$AS1E`1+8yVGb#-J1jD9 z9Pvx6Jt{7;P4G>Z=x-wUlOp((wertFN#^YYO6!Aiy7m0b`9E)x5Bs|=!AKqSipU%= zp9M+X37#Vr_~PylC&wB|li*V@vzQnz?4YBdZIO`b*DhRS0aTSteBmmoNVP_4aNdXR zuol@(YT_{LOU2geu?CXF9v#ZWRuo#`5@$=BRk~4ScCZFW6!n1sAx__}(;iHGu=oe1 zV6>Vl2rcRxp61*b5lQ-l75foEeY6}IXwae@cQx{x4On`hbM3NhyV~x}Py+eQ=T@pQ+ry!)S|ADe*vtV#{xMY{*J07gCy_HigLA=_ zwg|KC9*|P z?aq1*@kTsUi5GvAngbSPfnti!8eiL3vlVN9Gx8xjjwZZ5w(u^cFbK zc0}ZoiuhPW?wj*CIm8h;#SO;G=j9T2DjA-O%ol|O9b7{0W>xGO$Ez!eH?OZGirp}= zQhTjg+^w{ew0hIlk~YQ&kg>yWZvn!iNBp(>q6#gq@bxkywnP?!Iif}QvC+lOEM zZr(v#31KZC2dkq-mS8$6>gTHuIPxZ3ydLF9EYCRK8m;12EB>UyaW>4RnBHnv<8v^j zWpNa=-9m_WKAvM63s3OzU%<6qT{GJ~bQf|$d`Thf5k-;~1xao*GHOYhPTeI9i}!fG z@$C?XicKm`z98Ri=Rvj1CsGBuZhvGW&ZEkt_JQ@PjbKij5wtdHe3!DJBI!YQwkk!f zTiDie>={Xczi!jCOR*HZ!H6T{=2FO9L5xQ{JbE4cplf7lmqL`5b+Sg`%F_sH<)PQ( zSM`=Qw%he29TW66yrmh?l`2Bg=egRVk%Xk-5$BJX+40%i^5hQ0uh-hQnM-Y_o1TV= zC_h$2&H9`qRDxoz&mTzq6^*y(zZW|5J=p7hyOs6?ecyw@tLjpJ{wj`mwF8$2C@9DJ zLsr2QQ@qm{msHjUYay)L9(lEj)p1l(5Bnp2Zr!o_q#&4Osm6CpRk#muV6i1HlxN9o?B+Bg$_f?s5`@mx-1-mmJE?7Vd~Tdp29AE<130H5gE5iqN? zC99a-TCK}j9mGL zOSTivMh0}f3p-+B(H+!CQFecxeK3njP24Z_nsQpzOZvXqy}SbXuyt(Mnk%^;7GMhOo+rG{*t6&6 zt1Rb3@3#p}-hQD^D1trYgDRz$FqjPM+$~Ft1qbS7txyOQ8*bHZ@d#CR93DR%Wo>UBEn-3 zW?S3=)oMbltjDz%JMQ1)d0$yBRA5@rcSdbx%uA~xX+7yhNZ>4ArSRHH%>;qN$F+W^ z!*)&%mv8fuo5RhH^@4($r%0th0J?#7la|K0Gl1dXo7#cRU8JXI&9d@Xi?yHVv-z2l8l zd)OClgAd8wW6}j5M4T<+P6JtB_z(UUC=MnbZvHQq9{??WCny^RY8^D?8-RV#1P?|S z4g;Pvy~V^saAb$It1_Z;f41)`+D>?k8_spARE_5pM`7AYn*zt!hLLQq`*o9r3~3h= z>gQ%eT0ieb$f$h%p@ZA18Cz)$Ma|+QBE0r}3QpcP#b^AN?rmv_Zt|Qy2gpr>}s=_q8b~*;S*h?nnZUj-71U z+41g@?^(4=utB_=a7G#;*Y+%VLCW96pe5Vro4;IuJ5{@(ihlS9>{y*ps2wsJuNlt) zGlDZfne45veYl3JPF67UM2PvlM@gNs6Qb_@l?A9wS+im?{X_k9lUf9%N_c&{ks|b2 z9Ly^4y40GToZR3{{}mnX6jeD=jnN{NxwqL9&vyx6mj2C{D+fk7-W<*FoP@N)Z|Od= z`5#f>y_DyGZ_h1loQ+eQn#XWsaG?;*)%LQ?2p);xGllwJgy8!Oj*Q)!q5WVGk1s-v z;WW8#Cj+|cfd;qOK0UWKSOfp@{r@8Dz2m9=-~aKPPIWYFrJ;~5N<$gRIHx$WcV<#i zW@Z@?g(D#|BN8E7R#rmtQjw7@D`l_j`MVzHc)vgI_xJm`eSd!z&Uro`^SbWW{kq=| z7f@~A*$%Pqgfq&(xZ@xrGe6Lu%=iEdJ#4!mm70Kl@@#ObtVHT5BsDGbp5lDQ9MW;B z&%k)`+PUvuLU=+mXD*U`6|rbPRRW>;1Q09=fXZ24e{oUY1-J%>yW5zx^{)e~Eks;& z3F7BMFB-9wR%auJADRmg1-@5*vbr#F*Pz%w=Rc_>1|Q%dava85zjZi(LP|SQQ31F0 zT*hCW1(svuy`Uv>r}H9EVJxQmJ_-$34OIIr0O##mmSNdAoIu%($`Xwa7RJqiY+@lO zKFUDF9Lu|(pV;*yA7z|~M0Cz_4aflXmpaORN8P;^C+UWiOdR>z8R*V&BZs)OlbcM} zbw(WsVs9tWCED4@Vg&V82KUmAd* zd91^mn$e=>=|LrpLqH$SH*2hPKoth=Bq^PX%{2z6y~VF6xGV<*UzUU(NF z4RPuh5eAMg7|S_L%aOr5VuC_EJmf9146LDs7i#X{P%I4`33@LMD#a7_8QwX}S~?$- z=0E}d~6fO?`D7EaKZB_MD!-UY zqx(u12mnpK^*@)nsWYJ2Yx_wm_$9-Gn}0xQ>P4<*kdmES9IfkEQV2$iOwHMbomGJFX6@O z(#ZY1Ym7~W$20w5)tlNv;OjL!Se%?lsO5ab7pBG0hxl0DXP60rU{iieiB4_qg_^f! z=<~FP2a>l7Bq%nTiaE;Wn&qBNZIdM?jVFPh0j>Ui+QUM-+!-JRyAj;dDmu|BHNgCCTUb1 zALGqE5zLdr>x(_X^_9<3yU_*dGo7>k*^QhLc=kfZ1AYOH^i~XYc@42@mYP>E;nn!0 zexi4?d=Wz*r1)BD*b{9L-aJW@#Had*5|Yj1sUV}F!ugEZ-=lL;X{4A|V%o#sRsHNB z?3%lv&Y!CA=SLv^Bte!~apbhA@4NhLIo{A|-d+a}A8(oU@W7Sm1?>|jh`nJcywP5{ z$i~5K(G@S1#4k{(a>?WbIL>or)=By~bbeN*cSS(h;b^t21O6VfGaokBvlOJY9^^EY zh7Abz?l*M4E)H9I0`|N8jn`-U5gVg?hDp{hl=MaepVCzBrmUE`P+TvwNd_}@jUUm{ zc~orD!>x6gEyxXu`5mCfca;YMI%6@U#%Jmy)p{&}`8_w4+-jG+in`ca{70y`lD%jd zN4Pz&1bYydLvs3n4?p&iuO^jkXM8kw{RH{)5|L#Ti~-giXF!9rLavL+wLO*MW9)JoFS_u(|{%ksqTm zQdw-6kWr)P!ae#WMQ!jsL>i{IUnPHM>~#sTE@R@TFa_cQ4JO^~%`Qrq7B2>e zQot2Qs0rm9PnHFhXMo0Lrzbx}61Mfly6axJixjyj%dZy z?Lk$JFLHxC*d_vH{}z{iz6OISiIMowa>e(9EZaKTzMCuq(jr^iH#!89)g&7)Y@KQD zI^BBI?W3eq04wVRAvvycyV#*Ft(G=(G-+NHochwFC0U|qJAFitPDW-5y3SL5{z<#x1UJ_9w`6g19jX}mm)zH^B>Od zK|W?>^a@4VjZ_Tgyt#JB$s@VGK1TFR=s&No1QwtqFqWwl1Y^43HqvSS2@%q7rO_Us z!OG6}+vU(qey6SkIW`l;c?7Kj5>7kTp7UCn(a-_8TO-^$*5@^oNMf@yAbd4Z5hCrz z+nt(nm3W@LX6h7}QBI~A!NzfZA>{0#c1rd1KI#olZmenhN?<;2(#i5Gz^`D2x`djPl3(zfCWlty_TB z4;}cA(x^~eQ7wo6h5cefh?|&y{Mm)d*stlrDfWDM+L*qURCPpbwo8_|d-Mndz4hhL zS5o@%4bz#EZ55d%lXuAEYWR(PlU{ouHCy-iccKxb82TR-7C4XM1GfbqWddB!f}WRa zgNuN5g&TbwNibo$A$Bp(od-_?n}h~Ru*fUoCk)=op?qpnh~8M)f}rB=@0;^0GJ6Dn zajY?225p+lw9U@>l^>0C26P;;)`x|AfSzS_Htq#QwWlft;_zL|*ea zlFb9SNC;Vv7)0e7M%1=v8i*r&K6YPjQfS%w>S7^+dl$N_FF7er{Va>EebYNCYZ8N% zpPxa3fXH{~nA@D{KLyb8qgl7l&@mC{HeMJ5=pXF{8qHY(U+z)P)BF~DP@F1PHy-?>V z-v9S{)f3T6n;WavK>i*ahiEh({=9v%e7-eyOJ#>OlB;{5Y2zuhMUtb# zNkasPl@NL?wF7P6`_5V9>Kh4%Kggw}SVWQuy-)zI$`@v`^a`!u_ArU4K1gkf0#3$E z&Q5vU^F9&KqvBaWrK9?_?KBrEXheU}={fg5o&YL*9(efb0M@T>A6G3%tqn1yLmTfQ zB~?oZtPBHi?fG}LyFm6aHYL&h0Jx7JI5w6}qb?l9i<~O^z(j_cKrWLU36f&f-Cf3-lLHyQgt`m7QX5FcYWsPh6yUC`Db?ttafS%BtDw`TaU-kxf?tYsqUkAZu679E?ma7W7D&?T*2oi)T%S{4 zh0ut&kS5A-s?FKDsQ*c30C0Hmb-`DTnnR$R10}Z>pn;#)gQVklz}NKOQT`=UY?YsR z1|t9X7G3e#*h)ob=l}#D^QxXeo2Lb@@ThD&5lbu!4qtg9m=f_z4%+QVze0+VIOy-> zeA=JZ5u(hOihyjsi+0eJ;NZeSj1l0$7=l>p0%X6%1x&2mw$|V&b#HY|zFqY_T*)!M z2k;o63xAC|Z#_w~8!$r#hf`NX^*DX`ijfqh9Y-+7PPmR!#G$WGQT0AQLw0EW+bT(7 zM+tzlEs5K|oSaWJD}znaOJLyVS5DBGE}R+s9Kj5>ic=SP+EHOA)0$Ao=b#nrF8v_G zTZ154=N^X2O2WK9Z>Vy_bIhB@k-YKL$)wS{ydfal8k(m-e?KXb_s98cZJB;JX2z=J zlQ#G7r+!Er441k_#D-?;l0dEX;+;r=J8CX_cDk?<(|;T(0S_mAjl=~ujp{_a262#j zNpfkm^?wRQ^fK~CkWXVCTvdVLJQ>n#{FG9&?;RGiUEp2DJAZlf?=^-+u=C~ZS2B54 zhsewLLw-)u9iaQ!%}zH2HJ@9k^AITM9*lS#|8q-Fpta+Og+@l&_sGv_y+lLIhJF2B z0WV2uVW$W`X$q2ehhSIYv3-VZn-1TvpZBo>l5u>;doUuKt1xDdHLI9-t$Qx_lFMvALuHRpl)5J3H_<* z*Fd3vP?&IONH6<*Tmt*21kE(9h2G7Lwr{bp;)w6nJ}^_K41ZNyMj&wl*AIUjm6i4_(Rh>7Ryd;z+jcr25jqF(Wqs>2#6yqjMF8r~T7(n_1Py%db)-{E7~pp-wk>%XGu< z{lM`?W%KS%?HPn|Y{K>0rm&Fqp5fGiUDThDi(Z$q8oeiKbdu+7(GT9H7emtD98J6| zObOB0AObV>hkB&mpx=2)Y2_$HP$LHgPJ9#feDY>{L{*r#^$>|5MKF~2etzn8)hT=5 z#|a(wr!Cnq#K>S??pKN?;Z4qvUO>l`RY}J0Q$EPw4JwZg^%n;BI{A95NpMXL$NR6~ zEAABxGa1DmNs~Ph%AeL^;%C6nnAaOavd}*JvdQa9M_SoluCMZuEmV9+Th<@5x9K&P z%0Jf3NlBnB+M>tT8zyq%;}l#Pxp2;PQ2U{N*~Z76f2ZMuvUL#{Eu`U8{q>5pu)2ri z_pOGP6V-Xez)?CKY@IZ&mT16t2}&WI0*6bSrY09OTcm{t_}P^=TP1x4-hmLas1YX} zbYQ(x!s@#(55WlLGoET&nji0IPKr>t@I!~_+H$1P+AlFc)bqlh!sO-d#s63QV9ZeM zJr@t^Y2L^CR0BBiRgISkjX$9+D$0x3-psd2^+yEF zP*93)reN6ys)Y7uoqDX9CGbG0GMQ-n+LdmwCiKav)GwK8H*_qr#zTVmd#g25`xyk7 z8~NgX1#TEhWDczenr4DAFUG9@=fh5AwF!ZNAO5v9TZi{z}V^$V`K; z;9c=64j`WP>ug==Tm`AttE!0~CBx=_{F!n9pqzHO)oaUQ2DmnW__`L??790Fm{zAQ z-3UnL*+Z)hw?ks>vEbj!`?=< zsPS>zuBHv+348cQgBZ5Xi|PH17)U`lF?bx8Ia2WqV~20LS=7Xjt=yup>a6M0f`RsR z+MP2~eo<&kfZZu-D>+bqC=;@i=a(Ux&!hi%6o*&dmUHRBn>?H+FCxOcKII_-SKuYs zKJGCoz;o7!qf{_|EaLV+8pKPTz3@6weoNa3zQWgIBRz%M^DP4#Yth@K5#U#vZKLeU zL*LJ70$+#;B~ClMy!|K}Qy!iCGOlMtd2IM!VO=ksSZ!5EiH?MCGWDQL*v_Cncs)es zWYY$=|GjhF7os`PUmg9aezqwx>H%fCMm_sbBBlc@Blg}0ehy4kTUR$7l&cn=FXa*~J)+%{4H6lxHg!@3?@a~n(gWIYc3#cMb^_Ftd^ciS&KOL5Tsl1wciIaO6wP>+Jte9i#(v)+4{!eiFc$22(~(*VJ2?uJ#NR-Ctfg z)=Lij5Y>~4%!U2F4U@S2{I>mQq~0=+$hZHqs5TyQ{cN)OJHJvlmi9SXdxW8vqr}I{@u5HoQWuq?M zJK%4$z&Y0k(8w@G_bm=uE)k%!^k*mBlaN|O=M}nDJ6R9=zV5x}p2@JyZw=g091V;{ zJ`7y7w};dM_4LuWbr71e-&%NLyI9kj4$l*mVL0jkbebBRo+>&U{tgd{lUIZWa!oon(tI9! zND7{e+&9an0uIdJ^f0FRIfSG#dl_X1LoJ z!GtLQUV@Gn46h`A>Cx714KXeesYg<_Eb3OPa&hP0{Zb2dz=OXT+HQf_hFNf?A5!Jo47z#il3D$eAg6)uP-Ci+#4DlTzr&$ev;2n!m-i8#C?>F8=D zVY$6Selbdvr51!n-LN5s}Z#S!_WB$}rpvrk9jvYryKP-aqQ*O4cxh-T*0VI=O3QJ3LwU zHXRK_Y6MqkM7et_Ci@58;up4-n{EHvhzqVcu511?ZA7GbR<_A;9ChWc1EhD zXK6ey!{Aw*6%+E7nn&#A`On+Xd9zH3CA~lt0m_dOA58B`%L0b3R6y~A%EUO-Ds}(r1#%|;H;SytksDzgFJ0dDuYVt1a@XVv@V;2)V z{y3Jd_5j4qfL6ISR&||ah=j7KAmlaXXUq6S-Yuj(idEW5*`DBPIsb#K%N}%nYus5h z$1^W3{|Z6ey>>ty^wXw*)Y9+-^wR9R8o{(r@`5W} z0&1BiOW=d1#)aN|l;{frnXEO-=mTjr;iB_m=iQSoKv=Q-{q+U&)JXwWNch8ot7*xL zQ0_3QC}Z%QPY%0mJ!cqCpTOjDYg*~2<&pl#8_#k8%fungs!tFEAMk`4+Ene_m%kBp+=;nvs4>(D66cRvAXCQa&Is%9i%~6L~KGmW>%7DdY0dfAj)ya|ul+L5{-vE3clx);k*LfMNP^yo5 zbzh_wGqeJM?mDti0J)J4$e%>odf``ZLeVrFmFb{BC*0-^RG~ZF;@~D6Yxc&s;!J}? z^U(*x?2As+R=`do2<`=m_)JvJkOW2hKUD%*r33CeX^xN^j^)iXIshC--RhYiAlUkb zY&Q@gaRUBm65Zn+s1^h>6t^19L5~#uQG@6N)KAE~L0es@C{6%G>*V$gD#q)ZMw=@U z`BpuhD^OlMSvvj5-}nfi8U8kVfj2@QK41q;o9)$pjIpf8+?QUZp{!E0K8a)j6t)xo z{)P_$6}BksaXdrN4WE4l#r~T{fp^>+AyELD5q)j5i)#}=XxLGJwQAS?&-IGVmZm4f z%2slji`6lbF`x64eEb7op2qeir<5qgigf_J>^4||__8|pd5WNBPOJArG1Evn|AOrp zw7ch?slQMKq|HI^(@E9jf?92eFV9Cy_zWkR7bN)KB>o?2Cak3$ zL52?627{|$C?O_o+g)T^Urx=)eW4dgwueOWzM2KWA-iCEM6*ph;Oj9fyHH2FoaAWg zzp@E6z6qpV0wj?};bMRwW8+iAJaNuI(~S6K2bFR$ajw%=;FPHpWB>_!?6D+L4Y8bW zqOj;{oMew*Fws&g&xG&TuN$Jh)iMbauyH4`I?EwGm46kEUOss2uM%6@)Xe>3+H1;N z#E!&=m_F%Z)X6qEQw1`|VIE{4HR^(V9{`!}80Y8o26|DOskb0u1^HMjrK_2~UgiOHkG8AltI|oP7B0UtEA* z_Y%f=&Y&=bT@a>%|HgO3Z$#8kgSjq*90HTh`5RsBt)wz{*ks7Bq-eMjREiRn=v6i# z7g;WV-B#?_l8HyE1}WUEI;zid)iEh`z@r`K*nrvJ&$Eq)3;X`&b^}6>Ie-1LpU@9@ z8&dn2hXwdU0P~iXFuxB38|IUQ>7y$zuAeo`l_qrGe8<7TRZPV1tAkQZ|9B|wTK%pW zzCY15gu(QUzzYMu?Ta_lTRZCpI*?<)mWCw>zSVWO(L zCvFLKt9~3u@TSAgy)4G?7VEAY#+w`K1|%CgY8E_>Xrpm0GZ2@O*9n|waTkq;sH9eT zO@&h{6D*$>pa_0JkNI06uqwXtV31pDK{bOy5nw^L8AgzgM%!2LfFDS}L1hNXUlEiY zN1Bq}oV4BTT?MKW#Vw}PaVXz2|HSZHBb58Z(FdUQb*k^RhWY$)VQ5xX2zzvdsUs^# zUDZCpRpVOz5>_T@LyH#^{2=Yibl5sO^taX~f~P=j<-I}3?V z3hlb}E$V&V%_RO^gkVeJ#1HB+*(ZB#9k?#sQI_^|XUOBcB_Gqg8Ag+lQx4|b`Yo}U z+8S{Q)Oz`Mh7vfLSyRv6o)Anqdz0EytO75SLR#1s8pPj~ci`29VLC>?AmZn+OT`5$ z*wF7fqz0&ek2F2}k=&Gc?sDgG6&L<+eut#(2S^^oMWG=teA&HnKfm9AA(amQBN~ZO31bLb;37J=1TJuf zR&Yz_*aVhHk+X0E&ev)lT=nM4lKI*?d4aEJeyFHoW4$i|e8|>qo*dgfMp_Ap=cTs+ zl-g?Q5;K9H|GDbON20AEpdbcyfB!aIn&Mc0LVIiyE9rNgRIx`1OQY2P<6ZIsyGG;n zXM?Zm6Z@IoQFYwQm)M}H=TB(lsgzeX=Gc{(IshC-H>vj?FtwVbI zf1j5m2fv6n8M75b{hgbB`L)05Up8>Fkn9{=YE^jY6Yx$B^Ao5p{R>U2V_6?!+LPqY z#c>2H(%Ud>FvV)?Fr_9t?xtNyNmB%xUH{e8@+8DIZReZN=2;C-J1(v4o(?>Pb3P%% zn__ITCMMS#$HeUMyTaw-_mI5LB>k*A%1pr3zr5H5@kqbdCxSqolV3Qw2&F75JloIM zp2$lyIH1Y*M^@I&zwT%!SyW;l=Dtf{*3KI%-cmP^n!=MqZBlIPsG*X5yXQfODg`Ow zb49d1hJhP4-U=bn>tivbCWoe;UVx-Wo79Xn(&NB%2=`ByJKAGQf!vH0_s z-buys8va>aLiY<%B}oxijfY)of>8v>O3G`CkrQ9PxmnkFSLu@K z(3Y;b6x&D2(l5^(?RyNNO0SZ{ z4Bm-h60stbK4#n!1&}`d=9h3s;N8Rd<0cZvhy1=BwMrx)%$@vB6I*vUhABP7|FF8! zrFHwR8-W+cf4WTNqo#{u$BApV&kU{XX-90c0O2YFJD_SuDs68asT9b_Q~SqJq}xWe znYs>iGjuaPM7WeS)+7#B8cPn_M1nbZt092bQ6W)#dT`$Aeh^SzcHNIU6!TLMd4>3g-;^B`-L-xRqa8AcmY9#NYLTv8HJu zmT3mh{)5Pto2s5%+52_mwy}>VDAuLg|m3%D4*~cjDJ4T zg+Wn@*p5QP1GXw2;YMa`ij5Ww@9O50YRi$q5%<+dV-zqlHnha41?__16`fKU04vqc zAp+YYvx3dFKbHysvhOUt|MyO}7(~OC0Db2|39AF*O@m)i9L*X)EI-wjiLXK&lI<5z zIIU;*?c4+e68BU=5=3ivva1Sb;^+dX@X$yu8MjSAiS<{euG{>N45z7|O5^JIgz8-6 zcw<$*d<*i0zcGqH$jcqeEUEW1pH;mCHrh{7?N?}M5xPwZQHRTN+MH2-a`8$APHHA( z`aKj3^?)sRwY+?~a!+PCUaVsQiMedRq^O7YKu}@H^Z}j; zG+EH|vv@uXge<$Dv1PpdMxeuj5;Q54Z9wo=JmU=Us^w=^r@Z7i_s->4zTecc{BOQ0 z8+dyxU>!;iCa57QPYay4%2gdqm;s}y z(!;xc`~cM))w|MsCD04z5W~!z=G%^BBq6XGX)lFPAye;1SjNQ%bG)L-ND1lM-&c^8 zAbw^$$mk8?$12rMV0J!CQ{D^x{ErR`DoU~SV-Kw!jk75{MT<#AlsxEPYze$XlNbY} zQPcwIBXt=doaj1g-2C-mU-o`N!VCN*YIjryt@Od4PU<0^4PM%xcpnOo<&#mMtCVc| zm!uyuJP*xZoluf9JRT({b>c^ap?cmcyvRIHFd-p6p%ax4k$xrP`?+E~!k!^;5tCNL zgyV&%A2OscvGWEin}m3uTbG*-EwY1xVHeWJB(?M3EW|3ub_(>%i8ugvwMNn}kzwFh zS^@(^S#CUcZ0Tp)oQOk1rNdl5NBpX zC8$yT#4X@aZDdN`jHr>83F?G`ZQ0lqkRAE|ne=8<%0}$I{MWsAwCUrbc0ux05DP1= z0CtV|D|O5yVC1c5mBw!D)6I_L2>AjxO=JpfWD=Ws1-_yZV2r}x=Ki}&1{zSyMW;@qZ(WKfBz`V)5C23})I5C!Tzo?2v zyrod$?)o~ak=s=kGLZ($+f+b~U5*>Ph)kdD(UOK>1t&??{BXTwrrkz-07v)iW%A{c z6&aVX!IaPaQJIkNl`BGjphU3xdD#68VLuuZ+0n4ysM-%oUTRCy7Lr&Ds7|J<|M+@=t z%gMtc5Tt?%C*laW>3l`H%uOI^<>GfAB&NK&ys;a(`WI6`0g`6j^Ho5(DciTBbn*_8#6J&QY@rznctv~mm`UDRNnr%v3i{q^$n7W zdS^mEgn=kEHRc!G z(ujX+SBctJ5+Gx?1*NwHhTw4hd-6OS{24l2!^$ENCdnYoH8OIAQ2CN$p{1N-f>UWH z0h7AYe3vA&m*)I3+=}{h(Hsk$KmB4ixEnP`su-?vwT3@1c#3gho=7#rQ@>`A@Jbj~ zTsM-G&u(6-rJ)W_s!7)8j91H72#D@HVVaqLJV%}W8RT%ni*TW*_jAT^%I){}U;q}v z%25F(wiPza() zmt^WsmJ_AU8&w#o0C_V|<;vw0@8IfJmEbJkuTxq#v&OF*1wR`|XR;))k7}62-VtC| zS!H`$OXKH8^a@vbli)_r6`FdHfZ>0e+cNf;BYs0DN5$pv9VNa_CDk{;DREAlX_oXt zspw#4ZH3z4@kWgernrjq(D8eNT5&MsTB?C2>Al2>{l^Gb`B&8F-w@-%c{AJ}+4rfz zbME==<*FslV94CB3-Y>mX{CA{CiMcvg#e?a0m9n|3s3sjV`%WLTbH9xIdAdfQUWO$ z;J^lFo!r_3kPp_!hb$PY=f$XrbE)y3Q_GU)+@0{5^Nv|u9`yPV|7zrgG+pI7#TTYA z5Y~C}M@02$*0oo%EE@I!E6lKt)yzt;2Byez|BDC5L+!skl&xHc_;%fnE!fx_m8-QUCgP;DN++Jc%Kn9!%n>! z1GzJjUe(BJsdGxKwXYbh{rx$x%-=NLnl+qZt$QVVI`pVOPD*y@Xj+Uxu5_ag zQCyJem8*}sBfpy_<|RqZCV$h|AStwmp^7Ph*NC%EZcYs!N$QM{)8HNDy{6Q?U&q)p zDw9);=&cczwU(O2%b;vB02uVhLWcSaK;BmcGv~w9#zVt1Z1j*tY z5`j-KG~-^8Vst6caIe3m(DXlT(D_-RMQ`K^)Clx?o>KcYAKtgTqI#R;uAyPXL>PQi zdx^kJ>{DZc^q<)_vXvu8BjKHriPAlK7Xs!^+*MZJrpN(wf1In?nF(3#0FP9*%>R6` zB&!M-l)?8Njr_m9S6_D@hQ!t!*p&2|pJdT&Uj1QnqeMJaE7&8nj*-q9cI>D3IiH+j zfr69Hs=w9fi~?%FCK zFr!W-yaz=Nf>Mu7qFiMPd^^8Fsqt&~&!ES<`a``2^k`EchZO@&vBVoO*{2_(p)1w> zV_n%t5wk{o)$)d2<@2LsfggaV{|{FmdUY;}zt3*!>^CoHQP_j8Acs8_{-7Ik|9S#Q zyTL_D790?cR(67~@P-oRd+Rcs;%hz#iymQhnwh;7nt?@!%5@_Z?6r1$SPnKQ1YzmS z!4J$gh623)+S$YgpLLiD&Gbo;suAdV!4W)+AFC`Cv0#`{^F?~3=2|IuXEKF2yEJ8K5sT2PHhE zHgHR5=Pe)i{k#<)45OkNJzK(I+_kM+%Ji|vl+XR%2fF=_j?vW~r#xWb-kF0Kb58IG zs!^@_EkTEnk5X=rK!W%MkRzzj8=|?@0!l9z1(k>e5mkR83 zRIv1qd&n`u=>MYdXF1LX?S#5oJLUCq4k}%NpYdX_0^XIMKhdSIz{zj?DLvsjP6{TH z_N!qeKpwd2s}xM+*545tn3y2)BOiEWes)Vs4SW&s72W$pX>R+$93fO$Pq-?u~n*#x%6fA@hk52>Tnf1mk zcN|2Y&OSRN^2ZbD2A&_2xJvH|3;;BjXTfp_6{nueD_H`_AWvCioXbxH;l1u-(#>z} z`VTI_GzV;;|9Pj6&{OgCHxj9#W2elXOtTq894TyYknHGhItv0TFn{;NY;d#syFGCr zt8$16Pqq!>A$Q(wl|!p9lV8vOn~fMO4H!;jUm?Ac%c%{ z1rK?PQsVsIwgtH+Jqe)0Z>w6{3knDpQ+VxnlCG8pco~1o=W}IuDzgP$0v1Jgq2UH@ zU~7xAiJ@7?`VQ}W6uz~>b+^V}tEg`mc2NoqK>-YiG>Nt?*`l;tTm3qz?>Gfe zjlWI-V$P*I-GOJ82X%Y2)&Dtf0jFFYqp{){aU}Zb>+#Q#|FHGkdM8wvG7*WJgzbl; z%pQHzWp$W_9dJen;3D3z(>+4-*X$`9^hXVcmjcKR$JT^wH$^FsUG2U^X&4_7%IjG? zX{Lvtk+yx@{c74)7|VYdmW+;Yni)8!!bEO=cYvE8mcB5h$@PET7HG@e0|%W`PO{Ic zbkXGN9#VAmlyU^b4xOH?r=2mLYxLyPVfG4L;MVEchzS22Quy<9d0Uo9wY#^*zjDVV zHdNt9WjFmU8$Jtk@7CAcyjLCTC)v!Ov8%I4#`cK!0`> zVOTO1Bwa!kod@`{9*rzJrAiH(`vv9H{ol3)3?^HUIL!Y0!}pHVGobc{CbNM(*j!nl z7?fIX#QlOu5gllk9{nqJ^nC`iPDjO2>=_R$g~Gbn8h>V?B`U--LAMu$F99^L z9p*>QS=4W*#Gv;hIhM8v2WBjkcHeztv7NB0o>Pu6`PqGX@LscUoqVOiaUx2^>CZdT zfI9*JZRx+?3AJ@ceoGdI0mApTBU*}Y0OjzD?ze}f;mrXTKd-C)UQZHQGFo5x55f5c6In6-*bkaT zq`p#4-T!S{p!3VK8~I@N1P$7RBQ4YL%Zx^BL9CQa=cdozmq-?od}*%HSA!@%dF<@b ztmEh!_hAKL^`jM@izps2{^>R!X+ai{GX7-N&RMXVk{e99Zg&)&MEBp-S22COvh_Jt zlsds(ov9Xh=I40w38C;DM5kU>faAx_J%V{EArpgd$HC2s~6shZW>5Z z!_=fZbaEV?HKpu4jkFf9Ds#75TndK!_F-oUl;h?=*{}Pn&>hePsl5f1_tTq;5C;Kt zS?=7;e19wBL3!J*13iGKwE}Xg2eijBWBiXS?c1Vn6X#PCyrfqbr>2HP?{=d5k4_vd zh~({`B@OLyU}5WQcT)xiM4pq<0*yZgUHWv>$H@oQ@;otvNM8hCk|ord5pCl<5j$5V zY32%vO99e9LACE8HBtKPSL+WP!e0|TaV$mS$9FQM2fe0#l$Oc?Tls2OGRq#%y$pSx zqF!Dk1v=>PA#+UjvVGiv`xQLz% z+P*}nZD1{5f)b60^RzK)CRdEP&}ay-?{oM4_0)bI*H^#&JtFYOB?t6%h3Q_x^38>t zh?}f5yAK_n`zi@HVFLk02c_blOhtNN2AIMAsa`Yi#OvZ+eE`p)N_2fF$10G4JAuP7 zw2`HuOYMU6V^D*80f5M;AKC(0ut3t)g-X*U%fF*1Uilo&1z__h>N!@wHo5b#g)!>k zwS-@sT!c3oPFTaxs|@Bq*Fw?CiVL)VOdyB{c;$7IWs8P-P;_<;x*heRU; zxB#dpUC?)T3o3$f0f)}jp{@{FADWE!h9bY;P*bg&jz zKOp|cj$4-$!#R-R8s3AC$AY`^!qeIvR6Uy@g7v4}Z6CTHs?k!U6o%v^JfFA@E7$pW zR?B{p!X<`oTl5;-WL(QX-D5`!78VhPU9Ydu9*6}*>;!5vwD>lkwAKM`85t@u z)J>irRz?L5DC*QT07IVS{`zpfMV^Kcr}3e-_gUXMSfoqk4tW|YYRcmFg3zkXbCIy@ zf4MNbQSyVgQ}p{`Jp@qlgLAFVPU!PUUsbgwQiVsNeyI-dtc>+IkhnOy2{nIW01luT z!U}R}5aL&9ldm4@DJf+9arr4rf0HYEIvzGuf!`U{WaE&5mx?Ve>3g)Nm5{8C%ow`VTA3vF2GBWr>Ao^@h(0^?5@}6<3$yX((xz==VA2|Bio6~^zvnL(@z`h= z<9Da^l~(_zg?pA<|Ab#yOA0il|Gw57!6RnMXT?rOe@fSm>Mq-NAY%=R;0}aApd1OO zqz(k#|5y}52*fW%KG@Pc{8G);Qp@+8$oA;sQLc=6L@&z*=IVr?Ucjp?9$T!*ykYkhXR_Hq5?m(eC+?# zcPb`r>BH)1<8xEaLl4O(jgbn}@v(TRiNmO)Uo;pR6h7|X+u5t^OR#? z&2AZEXk*l6$=QinK3);6y-{-{kR8-K$qm2e(+3YjB!;iJ@Y`bn)3V{*nFW&SX3g^D z06&DEGjB?4d^7Cb-|_CYIDL-(GE|qKBmQWsc3wpM0&B}l4{5&A@|a7~27ckW@|Gz} zD+ddDSJnom@~M}~<6ud6SwFY%t1?=V+wUnuuM+-=56ncl?+StB>LGl5x%JSY78Y1R z5I{gh`D16HA^uk5UI;jLP{x{BKVAXS;G^&_Gww2@~~wq(&*xe(J7A+v#fAsCwte^iI;?<#V}c9*!K> z#ezVFfFSk>c>c0p&}F2)I}5e?thE5qqq1!KDB)34-x(2zRFf#5gG48vL&Au5YE>0y z2ZPUtx!@BRfOf-}FtUCg|5W;(qpLke^|N&L{BP&IpaD(Rwo~wGXou4n^oDn_1!-f- zry!;r=!^Wo0A(BC*A?=^tDeB@jN)0=K5St?4hc^;9+Pq~KVRV18IW;hJ`0-{L*Yy7@hm z^%O$a>7%9emqd;JrntVVO8Z(H;Q+XTMioS1J&9+8n*8Ly2({QaWe%Q1`VG$?@RW1B7LT#T}j`u@+2)N17C0qdv;Rq^tpilGlSCOgT#5B!(JsHStj2)%>2{|73TLn-!; z1yW)~tjktVyX4u+Z>g^JJ+2>1mIK7{$AZcTP-~_ZmO^|{nBI=+mjzC$XN|{NGYsxzRey|M z!ejOydOiFB)Q)t}UDmo}^{VFl(#vbxdCsoIe=>26d*UI|n{p|rjI7i4cV z)vz&VZa)*usb&zmGYxXG4kkC)FhH`+EC9ivPSn1=unRdb#nsh69)N;{gF8=ecmJpvX(%A{|h*;J!g{tmtLG zF(i3Jxni!sovHH>x+0l9+kjYd7}yAWor;9yU!Ye*?+&H2g)SFJy~bgEI?Y4CaT0a) zGqwTuvHy^|8+hwor24X)VsDs)71*IY1cgfbk>cF6m~SKy6yY zkS8S)D!x-JD9MrtCB*{h@v}ruL}aPnt1Tat3gknokNaG6!!4UswVyGg_Pih zfSC7%?{fDODQ?OI{=(xCBV8>38{|7vf_x#sMc2t_0~usKS)K05E4O9)J|FA{Xcqnu zj$1;iVjlvIUHVD=5OFmtug#>Ed*V{g8dBes)NHuANA||+ zin~mP4>89k2zX|=tuEw$-HWd<={gCTLOe$ufwBRx|m}UQ1&{(P}L$uC)=d@(Y_L6YvYscHwc8B#V6G5MZO%|CbCbt4!!0zIiT>A ze(Li(*FUo>KTD@NF1~YdytUxO*5@?!GWJF9nLjUIY!7d1H4{=gkeBGwY)PPaQMQ@=cNXi>$1Gl? zIZuTdqMln{TexU-`1py`lU*#g+y8jGa zVA1?}_lT2s7_@g@&US)j?`S#M_Q%=gGh|*pJ*`JJ#WD4uotC+}uQH|$^o@fzfQF$w ztLKsC9>9vBp~k$EsW_rD#U;gNWb9{TxO}Hx%A=wMeAh^?%omg&hqm--A7H$nttrO#0{~NbCZY5sc96PCT&*{oYmj=6W9NQ@YER)nz zwTC?HQXbo=FpAW320DuuGx?5qv1gz1ERXwJ{#o#8gAKI?danexqYMO??)|t@lm&=X1MErLg-sDNntl@gTqF z9qfv``|8oc0MCe)h?p7orK)2}D2Q9>Y%6!HHXqqHaH(p}lh)NZq;Rvr#p>Z|S8_@BkkH7B2G?5)?`tl66p^jyftj&+x?60Q=L>8% zjRa%qEtnZ?w*4Y*M$lL^>XI^uqf1e#_^^w4zhVUSUZ#{8yPs;frGWz z9_9xi_tDaSCrhT{KxyBO9#J939RH+<4{Jjsl8f(^oxa|d{QF`qs;!iJed+V1$(Mbr zB<)fTR=cml2HzK-N0f4w&1YCEMwI^IY92hgSTyI&Bf&ngmkN}yrjkEP{1)b0$P$m+ zSRFd~P}FT$_SopkVb9+XK(*z&eY%JLkeFVT^2p6{wJ6e6P1Z z<0fxO1!l9GIb|&?2jP6f;^aW##8W&Zel~B>P^wT zYrp4K+CE4kgVYh%KjKEkKj$+eelFFVf0JgkK5Fot`J*=0IIWEzTiWr>s&$7seKA4D z5gkGOdfog-sQLx1Z2g5aO6naln|GL7!xJ|*!!!zgU4;WA<{6wzLat9Q1$s=Y20qXr z+0_U){;qF(yJ`DX_SnjIp-73v_YFPyWl;H<4KK9!G>!Soul=5Qz{GHE;DGXnjrpu* zG(h$ZEkwxX~dN;mQ5v<^h{XA ze#*~so0yySxl}rKV@|MUzvacjgAH=@Dwn?>yg|Bjx1ag1qyW}p$g5dKIKY!~7M)O8 zxfO3J?sl9!konZ1FPTGsLdtLW*zDo@m{Bv~jpnnhQZP|~1_Tz`BYx8YkIG$O3HSW4wPiN&ehQ!E z-{e&OH+HfRcig6AwP)(*4(}O~!14g89QreIN@5pbZf+e=xjbC3nm@XU#=?H%Z`_AH z^O??{1l~M^*EJ}a*;tpUU}=V1W>YA;WWv(Ai}jfHF2l)t5vy@;2BtWM{XI_0R4Ev( zG>ybgx!!iVs!w3iUUQrFI(GGZ*@$Av_rG=8<@ZP>nnEreUmPbs{|FT<_4W|dXk^(h zXsli~JbPGzyo^%RDpr!}a!1a3N@J3IERq(pPC9yUN0nuT2-Yh?YPIeI~2ew0{IL=drR2+-~>KJ00%FUnH5c3BTC>?Y`MjLx)A5^!KQ z_70rs3+SO`^Xu|FuJ7M=and$$uA{+y;fQQSk-_=QdVg(f;2+V3`^6hqvYnLJ`;Ki) z`v?vD3s9Z3d+{alisWqYNZFK|b#X00sL9~Rfj?dA*uGeH4R-UOSViAMWvFkCiW%u-sha%{cZc_`+NVa|NMH+ zInRCH*L_{rbLKhclv~AcdB1U_HWsQ?QUArz3}ndm@4c2&(|F>j#n7YNO&JwGnzNlH8q6M`_u+qr89pF zRVaVMl+e*oHvbaOFgR#&2d_t-`BI-~fgX;Qvk2Ej9+-x5tmJ6OQl#v?bwy3y7zmJW z&CNM)TWyc%-MDDF|Ea>`1B-fNda$NzfZrIU_LLsEs}CwK+z)&@eoNoZ%=S%)l67-6 zgVr}btZRPcsA+csNL@_Tt;XyfQ4QS$+edfQc2`d3U9Vnex~((r<7Cedb|Z&;qM!Ed z0ycc>UTYcuF8aw?+riDRLbWFa&&W#}|L> zl&tPjg&8f+&))S5f$-$<*!sypjc{j93{=}{>cx`!SKmj>t{;enr%+?6S{e`7^{TCY z=FE)o_K{0x8^?b%4I*s8I5*9*W9zn^xo_3`b~pUc;JBza72o~DB`GngFr-3TCvfeQ zhB&CJd$!VK%K5?G)EexIK5OB-)DPtj)h`p)iZ!doT!jC*m{V6eFh1Eme$6BciV`fX zGmh^t{b1yPSMRcn|Jf924%@e@;pu#ns6%=Vc$og&BxNP_LxvjlpiI#}-*WWmJ=ajZ z*9^HWXE!W9*fTpWrDs*d^XxeYgB@^^(P&RtJ+z1r7TdDpmsHrmk75hd{Z~f7nj9yo zx>7|7+b~{b`@2-bkzV&}_Xo?Onzo>u2ELD(UDe;HvYP;kw%uwQj^4KRw1XQ@jbH8e z8sQ$Vp2fXz8X7xlr1rqbrnq1ha&4@#eDDJ2$l1xp_JqDyc)u)l4AS;~a6f$h*Z*CZLD>y&uEN6M7(tc&3ltm7z6SIXY~#86Wk7C-mS~jFxyax_^&X-|JG6 zNJMxvv{3s)t3~i_L3gFeDQn+5o^2Uh8S4*`oa(0kzcXVuI83nOjS>~D$vs)I%%4CF{0jCgwYT~TCB=R1r%#G z76vYirB^IF2)iygq7wxXkLHm9yptD1bgW)vOL>D_21uG9CnCUq=)6B{#gbhwx$=I( zn~d}_(fY!D$^p9Mfxv#G`i*T$Vcmt~oN^4zMO{=SC39KrB?L_Z1j=Bp5y}2~=teb; z?RvwygiGo^eJwbJ#{T&I+!=n28+ipxOI;FgHWRBb(w48@)?1oh7tdzaCWE69gAchqDbX3>*Gi~YQQ zkcTRlSj+)8>5Q+d{nq`JzW5cr%gem(Cv}V|4aRG3Df*u#b0O%hFat*nQ|7M4*X^r5 z8B0w*fDZUA^$5@NpUBgLNlZL>HoVW26gxpW0h#B%HVf5* ztl{U6yp7Y6$dN|Q@Fh%xY>T_|6|l*iwQ-@Q{xH;Nk8r|8D37SOc@$qXQx0>)H|D2V z&7zCV(9+;We)Nn#1L0woUCq{?BEn+opNN2o3+IYUnfz&HK5Z55WC6len8*V^v#I%H zg>w~dGc2k`y^&Q6aFFV-v)BNkr_{&sIUS!Udd=6~HvC&5QJm!|W?=54@y zZYpph=ZLohRn>?U5XoWbce>n65p(-jyIYh6dPiZEXR9=N7{7{KTigGx!-~u+QGtmK zLb_sK~2I2alrR0+KMS;qCIs1yh-=nsL+lf z7ZY`xPOm~&`e9-Ak<(dJpU0sQ(+13SXEo*@Y!UyU}98lxapJfVVOrGV>ZI)!RT=k~d=Wy+e)c+p-}7r4bBR6s1I*6<#n zVt2I5%h&D4XtK?|Q-L(nnJq1HUr=O~iD5MTkXFumNLqwN5?-89gBJ zG}U`t?2R59HMhmG3`lfmEIfQ}brbY-&8dLd24pe9pr;G7-Dk;(>*z^S8|B0c>9A{P z;lVSj(QoyHtU6+#_z^u~dU$#M2Ng{pXa*aPO;iYuP&da4EsuOIT>J*(v^9#oF%Y&# z?jZVL`;uc<$eu-Cu*lFyRlUwr5VN4^2)C-W2UB&tA}ST`v>uwrErgth*)Q9$`BW|m zrwTpcqSn93r&Q&rTB*wK<8V4A+_1XvHBtbwmvQ6eJStbXI#}S#DP;!8B6*CqDY3%{ z6bAs*Gs>;Unhl>c?FvdLBW(Z;xd}tR$=xF-2INf<$ji}%{Fu;xv6RnRAY=uGZ;&0H zCVmW*@&Y9UYd~WswcKikbe{S-@I30m0#!+FbA!%L6nTAAKf2gHUm1k$>y@0xgo=q@ zz~(C+&1vW8b=Z>Dh6$-K3uh~9bVC7UZElYk^IC1e9Zi6COlr(fUSf$qOz za`u4>#i0Q#N&M!*z6)|^xhUumn0gk-ja=T z5R3Z-Tq}7hKN4r48{>6bQgKhn=E*0EJ%ni#ku{qlql`axSF-bf)s;FJ?Eb4r&dtP-_|mXh=|(Xf`{)lo=ie^kc;@d{uu*N|wS zo6Brrdp&)<7qi$2Xe?XReF@QK`AbQyYU|q1Wm9Z$2-rZ`PoLskXU1(ts?lL@)^dWz z>Sj7o(j#L@X1*+Vrb!j?8|ZrwOXqzM&scc4lY+9OB#8ghm)T_A%yorR_m=B?c>uRV z9C+;qcqb`Db1oI{t<<6gUuY_+JVtS-ACOW&$(bmobPZ1$8N=idDsHrM`Cez?Qcx*! zU~wS8YmD)FnRtYd=1bA=HA$#4*9i#Jsp%(_p&}_UDP`94G z1PDJ%^Ji%$DDP8g{w&9z<@mE4f0pC_vm9H(ZW=4tE)`ODZw_dW7GbXa{=LWqck!|O z!~fvCs((M57ch&mRswytp+NuHko?~cm$ZMR3n8qI8(8+t4U3DX6F$#JZkuqrCbgKO zJQLUm%@z0{uD8xgP0S)z5Uk0kzLXRD>l~E*@gx>w*n`dFI_1;<$|6j7&8@1eg|ESR z{PSRrBhQcTGDnt(Zv)HKni2OMJgq{o@ZTrEy=ng9|M2oXVV);n%wfTxa{_ Date: Thu, 29 Feb 2024 10:26:03 -0300 Subject: [PATCH 021/113] Feature/GBI-1697 - Commitlint integration (#382) * feat: capability of change LP config using management API * test: add test for LP configuration endpoints * test: organize and lint test packages * chore: add commitlint --- .commitlint/hooks/commit-msg | 12 ++++++++++++ .commitlint/hooks/pre-commit | 4 ++++ Makefile | 1 + 3 files changed, 17 insertions(+) create mode 100755 .commitlint/hooks/commit-msg create mode 100755 .commitlint/hooks/pre-commit diff --git a/.commitlint/hooks/commit-msg b/.commitlint/hooks/commit-msg new file mode 100755 index 00000000..afeb099b --- /dev/null +++ b/.commitlint/hooks/commit-msg @@ -0,0 +1,12 @@ +#!/bin/sh + +if ! type commitlint >/dev/null 2>/dev/null; then + echo "" + echo "commitlint could not be found" + echo "try again after installing commitlint or add commitlint to PATH" + echo "" + exit 2; +fi + +commitlint lint --message $1 + diff --git a/.commitlint/hooks/pre-commit b/.commitlint/hooks/pre-commit new file mode 100755 index 00000000..96d7291b --- /dev/null +++ b/.commitlint/hooks/pre-commit @@ -0,0 +1,4 @@ +#!/bin/bash + +make lint || exit 1 +make test \ No newline at end of file diff --git a/Makefile b/Makefile index cee12cad..0f38023d 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ tools: download go install github.com/parvez3019/go-swagger3@latest go install golang.org/x/vuln/cmd/govulncheck@latest + go install github.com/conventionalcommit/commitlint@latest go env GOPATH curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.55.2 From 16255175f5795afcecb1787f74e1dd686115bf68 Mon Sep 17 00:00:00 2001 From: Luisfc68 <60527258+Luisfc68@users.noreply.github.com> Date: Thu, 29 Feb 2024 12:10:58 -0300 Subject: [PATCH 022/113] feat: log build information on server bootstrap (#383) --- Makefile | 5 +++- cmd/application/main.go | 46 +++++++++++++++++++++++---------- docker-compose/local/lps-env.sh | 2 ++ docker-compose/lps/Dockerfile | 3 +++ 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 0f38023d..ab9e1706 100644 --- a/Makefile +++ b/Makefile @@ -18,9 +18,12 @@ validation: lint go mod verify govulncheck ./... # should fail on non informational vulnerabilities +COMMIT_HASH ?= $(shell git rev-parse HEAD) +SOURCE_VERSION := $(COMMIT_HASH) build: download mkdir -p build && cd build - CGO_ENABLED=0 go build -v -installsuffix 'static' -ldflags="-s" -o ./build/liquidity-provider-server ./cmd/application/main.go + @echo "Building liquidity-provider-server $(SOURCE_VERSION)" + CGO_ENABLED=0 go build -v -installsuffix 'static' -ldflags="-s -X 'main.BuildVersion=$(SOURCE_VERSION)' -X 'main.BuildTime=$(shell date)'" -o ./build/liquidity-provider-server ./cmd/application/main.go api: go-swagger3 --module-path . \ diff --git a/cmd/application/main.go b/cmd/application/main.go index 7235e006..5cf0c6bb 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -16,15 +16,35 @@ import ( // @Server https://lps.testnet.flyover.rif.technology Testnet // @Server https://lps.flyover.rif.technology Mainnet +var ( + BuildVersion string + BuildTime string +) + const bootstrapTimeout = 3 * time.Minute // In case LP needs to register func main() { - var err error - var file *os.File initCtx, cancel := context.WithTimeout(context.Background(), bootstrapTimeout) env := environment.LoadEnv() + logLevel := setUpLogger(*env) + logBuildInfo() + log.Debugf("Environment loaded: %+v", env) + + secrets := environment.LoadSecrets(initCtx, *env) + + log.Info("Initializing application...") + app := lps.NewApplication(initCtx, *env, *secrets) + log.Info("Application initialized successfully") + cancel() + log.Info("Starting application...") + app.Run(*env, logLevel) + app.Shutdown() +} + +func setUpLogger(env environment.Environment) log.Level { + var file *os.File logLevel, err := log.ParseLevel(env.LogLevel) if err != nil { log.Fatal("Error parsing log level:", err) @@ -41,16 +61,16 @@ func main() { log.SetOutput(file) } } + return logLevel +} - log.Debugf("Environment loaded: %+v", env) - - secrets := environment.LoadSecrets(initCtx, *env) - - log.Info("Initializing application...") - app := lps.NewApplication(initCtx, *env, *secrets) - log.Info("Application initialized successfully") - cancel() - log.Info("Starting application...") - app.Run(*env, logLevel) - app.Shutdown() +func logBuildInfo() { + if BuildVersion == "" { + BuildVersion = "No version provided during build" + } + if BuildTime == "" { + BuildTime = "No time provided during build" + } + log.Info("Build version: ", BuildVersion) + log.Info("Build time: ", BuildTime) } diff --git a/docker-compose/local/lps-env.sh b/docker-compose/local/lps-env.sh index 0f05b641..ec150f13 100755 --- a/docker-compose/local/lps-env.sh +++ b/docker-compose/local/lps-env.sh @@ -157,4 +157,6 @@ echo "LBC deployed at $LBC_ADDR" docker-compose --env-file "$ENV_FILE" up -d powpeg-pegin powpeg-pegout # start LPS + +docker-compose --env-file "$ENV_FILE" -f docker-compose.yml -f docker-compose.lps.yml build --build-arg COMMIT_HASH="$(git rev-parse HEAD)" lps docker-compose --env-file "$ENV_FILE" -f docker-compose.yml -f docker-compose.lps.yml up -d lps diff --git a/docker-compose/lps/Dockerfile b/docker-compose/lps/Dockerfile index 53208722..6ed171fd 100644 --- a/docker-compose/lps/Dockerfile +++ b/docker-compose/lps/Dockerfile @@ -3,6 +3,9 @@ ARG ALPINE_VERSION=3.19.1 FROM --platform=linux/amd64 golang:${GO_VERSION} AS builder +ARG COMMIT_HASH +ENV COMMIT_HASH=${COMMIT_HASH} + WORKDIR /code COPY Makefile go.mod go.sum ./ From 85c09bba4c4c0bc1ae0ac448d93dfe71b6325c04 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 1 Mar 2024 10:18:57 -0300 Subject: [PATCH 023/113] fix: dont enforce captcha env when disabled --- .../dataproviders/database/mongo/pegout.go | 2 +- internal/configuration/registry/usecase.go | 1 + .../liquidity_provider/check_liquidity.go | 3 +-- .../liquidity_provider/provider_detail.go | 21 +++++++++++-------- .../provider_detail_test.go | 18 ++++++++++------ 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/internal/adapters/dataproviders/database/mongo/pegout.go b/internal/adapters/dataproviders/database/mongo/pegout.go index 6048604d..691e58ac 100644 --- a/internal/adapters/dataproviders/database/mongo/pegout.go +++ b/internal/adapters/dataproviders/database/mongo/pegout.go @@ -101,7 +101,7 @@ func (repo *pegoutMongoRepository) ListPegoutDepositsByAddress(ctx context.Conte dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - filter := bson.M{"from": address} + filter := bson.M{"from": bson.M{"$regex": address, "$options": "i"}} sort := options.Find().SetSort(bson.M{"timestamp": -1}) cursor, err := repo.conn.Collection(depositEventsCollection).Find(dbCtx, filter, sort) if err != nil { diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 1242716c..c4ada5e5 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -112,6 +112,7 @@ func NewUseCaseRegistry( ), getProviderDetailUseCase: liquidity_provider.NewGetDetailUseCase( env.Captcha.SiteKey, + env.Captcha.Disabled, liquidityProvider, liquidityProvider, liquidityProvider, diff --git a/internal/usecases/liquidity_provider/check_liquidity.go b/internal/usecases/liquidity_provider/check_liquidity.go index d35b32e9..6a7d392e 100644 --- a/internal/usecases/liquidity_provider/check_liquidity.go +++ b/internal/usecases/liquidity_provider/check_liquidity.go @@ -45,11 +45,10 @@ func NewCheckLiquidityUseCase( } func (useCase *CheckLiquidityUseCase) Run(ctx context.Context) error { - minLockTxValueInSatoshi, err := useCase.bridge.GetMinimumLockTxValue() + minLockTxValueInWei, err := useCase.bridge.GetMinimumLockTxValue() if err != nil { return usecases.WrapUseCaseError(usecases.CheckLiquidityId, err) } - minLockTxValueInWei := entities.SatoshiToWei(minLockTxValueInSatoshi.Uint64()) err = useCase.peginProvider.HasPeginLiquidity(ctx, minLockTxValueInWei) if errors.Is(err, usecases.NoLiquidityError) { diff --git a/internal/usecases/liquidity_provider/provider_detail.go b/internal/usecases/liquidity_provider/provider_detail.go index 8db52844..63376c38 100644 --- a/internal/usecases/liquidity_provider/provider_detail.go +++ b/internal/usecases/liquidity_provider/provider_detail.go @@ -9,23 +9,26 @@ import ( ) type GetDetailUseCase struct { - captchaSiteKey string - provider liquidity_provider.LiquidityProvider - peginProvider liquidity_provider.PeginLiquidityProvider - pegoutProvider liquidity_provider.PegoutLiquidityProvider + captchaSiteKey string + captchaDisabled bool + provider liquidity_provider.LiquidityProvider + peginProvider liquidity_provider.PeginLiquidityProvider + pegoutProvider liquidity_provider.PegoutLiquidityProvider } func NewGetDetailUseCase( captchaSiteKey string, + captchaDisabled bool, provider liquidity_provider.LiquidityProvider, peginProvider liquidity_provider.PeginLiquidityProvider, pegoutProvider liquidity_provider.PegoutLiquidityProvider, ) *GetDetailUseCase { return &GetDetailUseCase{ - captchaSiteKey: captchaSiteKey, - provider: provider, - peginProvider: peginProvider, - pegoutProvider: pegoutProvider, + captchaSiteKey: captchaSiteKey, + captchaDisabled: captchaDisabled, + provider: provider, + peginProvider: peginProvider, + pegoutProvider: pegoutProvider, } } @@ -56,7 +59,7 @@ func (useCase *GetDetailUseCase) Run(ctx context.Context) (FullLiquidityProvider }, } - if detail.SiteKey == "" { + if detail.SiteKey == "" && !useCase.captchaDisabled { return FullLiquidityProvider{}, usecases.WrapUseCaseError(usecases.ProviderDetailId, errors.New("missing captcha key")) } else if err = entities.ValidateStruct(detail.Pegin); err != nil { return FullLiquidityProvider{}, usecases.WrapUseCaseError(usecases.ProviderDetailId, err) diff --git a/internal/usecases/liquidity_provider/provider_detail_test.go b/internal/usecases/liquidity_provider/provider_detail_test.go index 791e41d0..71b0037a 100644 --- a/internal/usecases/liquidity_provider/provider_detail_test.go +++ b/internal/usecases/liquidity_provider/provider_detail_test.go @@ -17,7 +17,7 @@ func TestGetDetailUseCase_Run(t *testing.T) { provider := &mocks.ProviderMock{} prepareDetailMock(provider) captchaKey := "testKey" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, false, provider, provider, provider) result, err := useCase.Run(context.Background()) require.NoError(t, err) assert.Equal(t, liquidity_provider.FullLiquidityProvider{ @@ -39,11 +39,17 @@ func TestGetDetailUseCase_Run(t *testing.T) { func TestGetDetailUseCase_Run_InvalidCaptchaKey(t *testing.T) { provider := &mocks.ProviderMock{} - prepareDetailMock(provider) captchaKey := "" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) - _, err := useCase.Run(context.Background()) + + prepareDetailMock(provider) + useCaseCaptchaEnabled := liquidity_provider.NewGetDetailUseCase(captchaKey, false, provider, provider, provider) + _, err := useCaseCaptchaEnabled.Run(context.Background()) assert.Equal(t, "ProviderDetail: missing captcha key", err.Error()) + + prepareDetailMock(provider) + useCaseCaptchaDisabled := liquidity_provider.NewGetDetailUseCase(captchaKey, true, provider, provider, provider) + _, err = useCaseCaptchaDisabled.Run(context.Background()) + require.NoError(t, err) } func TestGetDetailUseCase_Run_InvalidPeginDetail(t *testing.T) { @@ -55,7 +61,7 @@ func TestGetDetailUseCase_Run_InvalidPeginDetail(t *testing.T) { config.MinValue = nilWei provider.On("PeginConfiguration", mock.AnythingOfType("context.backgroundCtx")).Return(config) captchaKey := "testKey" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, false, provider, provider, provider) _, err := useCase.Run(ctx) assert.Equal(t, "ProviderDetail: Key: 'LiquidityProviderDetail.MinTransactionValue' "+ "Error:Field validation for 'MinTransactionValue' failed on the 'required' tag", err.Error()) @@ -70,7 +76,7 @@ func TestGetDetailUseCase_Run_InvalidPegoutDetail(t *testing.T) { config.MinValue = nilWei provider.On("PegoutConfiguration", mock.AnythingOfType("context.backgroundCtx")).Return(config) captchaKey := "testKey" - useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, provider, provider, provider) + useCase := liquidity_provider.NewGetDetailUseCase(captchaKey, false, provider, provider, provider) _, err := useCase.Run(ctx) assert.Equal(t, "ProviderDetail: Key: 'LiquidityProviderDetail.MinTransactionValue' "+ "Error:Field validation for 'MinTransactionValue' failed on the 'required' tag", err.Error()) From 4d85cee51a6fc524a3554097a09a4d822b43417c Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 1 Mar 2024 13:29:08 -0300 Subject: [PATCH 024/113] docs: add documentation for environment variables --- {diagrams => docs/diagrams}/PegIn.mmd | 0 {diagrams => docs/diagrams}/PegIn.png | Bin {diagrams => docs/diagrams}/PegOut.mmd | 0 {diagrams => docs/diagrams}/PegOut.png | Bin .../diagrams}/flyover-ad-basic.png | Bin .../diagrams}/flyover-ad-no-call.png | Bin .../flyover-ad-unsuccessful-call.png | Bin {diagrams => docs/diagrams}/flyover-sd.png | Bin docs/environment.md | 51 ++++++++++++++++++ 9 files changed, 51 insertions(+) rename {diagrams => docs/diagrams}/PegIn.mmd (100%) rename {diagrams => docs/diagrams}/PegIn.png (100%) rename {diagrams => docs/diagrams}/PegOut.mmd (100%) rename {diagrams => docs/diagrams}/PegOut.png (100%) rename {diagrams => docs/diagrams}/flyover-ad-basic.png (100%) rename {diagrams => docs/diagrams}/flyover-ad-no-call.png (100%) rename {diagrams => docs/diagrams}/flyover-ad-unsuccessful-call.png (100%) rename {diagrams => docs/diagrams}/flyover-sd.png (100%) create mode 100644 docs/environment.md diff --git a/diagrams/PegIn.mmd b/docs/diagrams/PegIn.mmd similarity index 100% rename from diagrams/PegIn.mmd rename to docs/diagrams/PegIn.mmd diff --git a/diagrams/PegIn.png b/docs/diagrams/PegIn.png similarity index 100% rename from diagrams/PegIn.png rename to docs/diagrams/PegIn.png diff --git a/diagrams/PegOut.mmd b/docs/diagrams/PegOut.mmd similarity index 100% rename from diagrams/PegOut.mmd rename to docs/diagrams/PegOut.mmd diff --git a/diagrams/PegOut.png b/docs/diagrams/PegOut.png similarity index 100% rename from diagrams/PegOut.png rename to docs/diagrams/PegOut.png diff --git a/diagrams/flyover-ad-basic.png b/docs/diagrams/flyover-ad-basic.png similarity index 100% rename from diagrams/flyover-ad-basic.png rename to docs/diagrams/flyover-ad-basic.png diff --git a/diagrams/flyover-ad-no-call.png b/docs/diagrams/flyover-ad-no-call.png similarity index 100% rename from diagrams/flyover-ad-no-call.png rename to docs/diagrams/flyover-ad-no-call.png diff --git a/diagrams/flyover-ad-unsuccessful-call.png b/docs/diagrams/flyover-ad-unsuccessful-call.png similarity index 100% rename from diagrams/flyover-ad-unsuccessful-call.png rename to docs/diagrams/flyover-ad-unsuccessful-call.png diff --git a/diagrams/flyover-sd.png b/docs/diagrams/flyover-sd.png similarity index 100% rename from diagrams/flyover-sd.png rename to docs/diagrams/flyover-sd.png diff --git a/docs/environment.md b/docs/environment.md new file mode 100644 index 00000000..b11decce --- /dev/null +++ b/docs/environment.md @@ -0,0 +1,51 @@ +# Environment variables +These are the environment variables required by the liquidity provider server (LPS). The following table lists the environment variables and their descriptions and whether it's mandatory or not. + +| **Name** | **Description** | **Example** | **Mandatory** | +|:-----------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------:| +| `LPS_STAGE` | The network where LPS will be running on. | One of the following: `regtest testnet mainnet` | Yes | +| `PORT` | The port number to run the http server of the LPS on. | `8080` | Yes | +| `LOG_LEVEL` | Level for the application logs. | One of the following: `panic fatal error warn info debug trace` | Yes | +| `LOG_FILE` | File to send the logs to. If not provided logs will be sent to standard output. | `/home/lps.log` | No | +| `ENABLE_MANAGEMENT_API` | Whether to enable the management API endpoints or not. To know more read the [Management API Documentation file](#TODO documentation file). If not provided default value will be **false**. | `true` or `false` | No | +| `AWS_LOCAL_ENDPOINT` | Endpoint for the AWS local instance (localstack). Only required if LPS is running in regtest mode. | `http://localhost:4444` | No | +| `MONGODB_USER` | User to connect to MongoDB. | `root` | Yes | +| `MONGODB_PASSWORD` | Password to connect to MongoDB. | `` | Yes | +| `MONGODB_HOST` | Host to connect to MongoDB. | `localhost` | Yes | +| `MONGODB_PORT` | Port to connect to MongoDB. | `27017` | Yes | +| `RSK_ENDPOINT` | URL to connect to the Rootstock node. Must be an http endpoint. | `http://rskj:4444` | Yes | +| `CHAIN_ID` | RSK chain id. | 33 | Yes | +| `LBC_ADDR` | Address of the Liquidity Bridge Contract (LBC). | `0x8901a2Bbf639bFD21A97004BA4D7aE2BD00B8DA8` | Yes | +| `RSK_BRIDGE_ADDR` | Address of the Rootstock bridge. | `0x0000000000000000000000000000000001000006` | Yes | +| `RSK_REQUIRED_BRIDGE_CONFIRMATIONS` | The number of confirmations that need to pass before being able to register a pegin, it changes depending on the network. | 100 | Yes | +| `IRIS_ACTIVATION_HEIGHT` | Block number where the iris updated is activated, depends on the network. | 1500000 | Yes | +| `ERP_KEYS` | Keys that are used as a secondary multisig that would be allowed to spend UTXOs after a year they were created. | 0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3,
0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14,
034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f | Yes | +| `ACCOUNT_NUM` | The keystore account number to use. If not provided default value will be 0. | 2 0 | No | +| `DAO_FEE_COLLECTOR_ADDRESS` | Address of the DAO fee collector. | `0x86B6534687A176A476C16083a373fB9Fe4FAb449` | Yes | +| `KEY_SECRET` | Name of the secret of AWS secrets manager that contains the encrypted json of the liquidity provider RSK account. | `FlyoverTestEnv/LPS-KEY` | Yes | +| `PASSWORD_SECRET` | Name of the secret of AWS secrets manager that contains the password of the encrypted json of the liquidity provider RSK account. | `FlyoverTestEnv/LPS-PASSWORD` | Yes | +| `BTC_NETWORK` | Network to use when connecting to the Bitcoin node. | One of the following: `regtest testnet mainnet` | Yes | +| `BTC_USERNAME` | Username for the bitcoind rpc server. | `user` | Yes | +| `BTC_PASSWORD` | Password for the bitcoind rpc server. | `password` | Yes | +| `BTC_ENDPOINT` | Endpoint of the bitcoind rpc server. Must be an HTTP connection. | `localhost:5555` | Yes | +| `BTC_TX_FEE_RATE` | Bitcoin tx fee rate in BTC/kvB to use when creating transactions. | 0.00025 | Yes | +| `BTC_ENCRYPTED_WALLET` | Whether the wallet to use of the bitcoind node is encrypted or not. Its a boolean value. | true | Yes | +| `BTC_WALLET_PASSWORD` | Password to unlock the wallet of the bitcoind node when it is encrypted. | `password` | No | +| `ALERT_SENDER_EMAIL` | The email that will be used to send alerts. | no-reply@mail.flyover.rifcomputing.net | Yes | +| `ALERT_RECIPIENT_EMAIL` | The email that will receive the alerts. | test@iovlabs.org | Yes | +| `BTC_ADDR` | Bitcoin address of the liquidity provider. | `mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6` | Yes | +| `PROVIDER_NAME` | The liquidity provider name to be registered in the liquidity bridge contract. | `Default provider` | Yes | +| `BASE_URL` | URL of the LPS to register in the liquidity bridge contract. | `http://localhost:8080` | Yes | +| `PROVIDER_TYPE` | Whether the liquidity provider will provide for pegin, pegout or both operations. | One of the following: `pegin pegout both` | Yes | +| `PEGOUT_DEPOSIT_CACHE_START_BLOCK` | If provided, the LPS will upsert into the database all the pegout deposits that were done from this block to the current one. | 500 | No | +| `CAPTCHA_SECRET_KEY` | Captcha key used in the server to validate client requests. | `
` | No | +| `CAPTCHA_SITE_KEY` | Captcha key used by the client to perform the challenge. | `` | No | +| `CAPTCHA_THRESHOLD` | Threshold from zero to one to consider request as valid when using recaptcha v3 (right now we're using v2). | 0.8 | No | +| `DISABLE_CAPTCHA` | Whether to disable captcha validation or not. Its a boolean value. | true | No | +| `CAPTCHA_URL` | Url to make the captcha verification. | `https://www.google.com/recaptcha/api/siteverify` | No | + +## AWS variables +You may notice that in [sample-config.env](../sample-config.env) there are some environment variables that are related to AWS. These variables are required to use AWS services, however, they are not listed in the table as the AWS SDK has the functionality to load them from multiple sources. For that reason, they are not accessed directly from the code and are not listed in the table above. + +## Other variables +You may notice that in [sample-config.env](../sample-config.env) there are variables that aren't in the table and don't belong to AWS. Those variables are used to run scripts or to setup the local environment, they should not be present in a productive environment for this application. \ No newline at end of file From 8957d7aad14931a888e4db5c1fe899bda77815d4 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 1 Mar 2024 14:58:56 -0300 Subject: [PATCH 025/113] docs: document constants in the code --- internal/adapters/dataproviders/rootstock/lbc.go | 1 + internal/adapters/dataproviders/rootstock/rpc.go | 1 + internal/usecases/pegin/common.go | 7 +++++++ internal/usecases/pegout/refund_pegout.go | 5 +++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/internal/adapters/dataproviders/rootstock/lbc.go b/internal/adapters/dataproviders/rootstock/lbc.go index 5d503783..7977f470 100644 --- a/internal/adapters/dataproviders/rootstock/lbc.go +++ b/internal/adapters/dataproviders/rootstock/lbc.go @@ -21,6 +21,7 @@ import ( "time" ) +// registerPeginGasLimit Fixed gas limit for registerPegin function, should change only if the function does const registerPeginGasLimit = 2500000 type liquidityBridgeContractImpl struct { diff --git a/internal/adapters/dataproviders/rootstock/rpc.go b/internal/adapters/dataproviders/rootstock/rpc.go index f5c91a4a..09324858 100644 --- a/internal/adapters/dataproviders/rootstock/rpc.go +++ b/internal/adapters/dataproviders/rootstock/rpc.go @@ -14,6 +14,7 @@ import ( "strings" ) +// newAccountGasCost fixed gas amount to add to the estimation if the destination address is a new account const newAccountGasCost = 25000 type rskjRpcServer struct { diff --git a/internal/usecases/pegin/common.go b/internal/usecases/pegin/common.go index 9d87a25b..583da019 100644 --- a/internal/usecases/pegin/common.go +++ b/internal/usecases/pegin/common.go @@ -1,5 +1,12 @@ package pegin const ( + // CallForUserExtraGas + /** + * The gas spent in the callForUser function can be divided in two parts, + * the first part is the gas spent in the callForUser function itself, call done on behalf + * of the user. This constant represents the first part and needs to be added to the estimation + * done during the get pegin quote process. + */ CallForUserExtraGas = 180000 ) diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go index c4686d30..d78ac07b 100644 --- a/internal/usecases/pegout/refund_pegout.go +++ b/internal/usecases/pegout/refund_pegout.go @@ -13,10 +13,11 @@ import ( ) const ( + // refundPegoutGasLimit Fixed gas limit for refundPegout function, should change only if the function does refundPegoutGasLimit = 2500000 - // BridgeConversionGasLimit see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ + // bridgeConversionGasLimit see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ bridgeConversionGasLimit = 100000 - // BridgeConversionGasPrice see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ + // bridgeConversionGasPrice see https://dev.rootstock.io/rsk/rbtc/conversion/networks/ bridgeConversionGasPrice = 60000000 ) From 3f6fc8968aec690efe28b84b150c20f430fa2ae3 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 4 Mar 2024 17:25:32 -0300 Subject: [PATCH 026/113] test: update integration test after refactor --- .gitignore | 2 +- Makefile | 5 +- cmd/application/lps/application.go | 11 +- cmd/application/main.go | 7 +- integration/integration_suite_test.go | 218 -------------- integration/pegout_test.go | 269 ------------------ integration/setup_test.go | 187 ------------ .../entrypoints/rest/server/server.go | 2 +- {integration => test/integration}/Readme.md | 0 .../integration-test.config.example.json | 3 +- test/integration/integration_suite_test.go | 227 +++++++++++++++ .../integration}/pegin_test.go | 111 ++++---- test/integration/pegout_test.go | 254 +++++++++++++++++ test/integration/setup_test.go | 35 +++ test/integration/utils_test.go | 66 +++++ 15 files changed, 653 insertions(+), 744 deletions(-) delete mode 100644 integration/integration_suite_test.go delete mode 100644 integration/pegout_test.go delete mode 100644 integration/setup_test.go rename {integration => test/integration}/Readme.md (100%) rename {integration => test/integration}/integration-test.config.example.json (84%) create mode 100644 test/integration/integration_suite_test.go rename {integration => test/integration}/pegin_test.go (56%) create mode 100644 test/integration/pegout_test.go create mode 100644 test/integration/setup_test.go create mode 100644 test/integration/utils_test.go diff --git a/.gitignore b/.gitignore index 2420c019..2775adad 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ pwd.txt /docker-compose/volumes /docker-compose/.env.testnet -integration/integration-test.config.json +test/integration/integration-test.config.json integration/geth_keystore /docker-compose/lbc-deployer/liquidity-bridge-contract/ diff --git a/Makefile b/Makefile index ab9e1706..23b59290 100644 --- a/Makefile +++ b/Makefile @@ -35,15 +35,14 @@ api: coverage: clean mkdir coverage - go test -v -race -covermode=atomic -coverpkg=./... -coverprofile=coverage/cover.out ./... + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... go tool cover -func "coverage/cover.out" go tool cover -html="coverage/cover.out" rm coverage/cover.out test: clean mkdir coverage - go test -v -race -covermode=atomic ./... - go test -v -race -covermode=atomic -coverpkg=./... -coverprofile=coverage/cover.out ./... + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... go tool cover -func "coverage/cover.out" rm coverage/cover.out diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 523be267..1d9638b4 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -13,9 +13,12 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" + "os" + "syscall" "time" ) +const BootstrapTimeout = 3 * time.Minute // In case LP needs to register const watcherPreparationTimeout = 3 * time.Second type Application struct { @@ -29,6 +32,7 @@ type Application struct { dbRegistry *registry.Database eventBus entities.EventBus runningServices []entities.Closeable + doneChannel chan os.Signal } func NewApplication(initCtx context.Context, env environment.Environment, secrets environment.ApplicationSecrets) *Application { @@ -112,6 +116,7 @@ func (app *Application) Run(env environment.Environment, logLevel log.Level) { } applicationServer, done := server.NewServer(env, app.useCaseRegistry, logLevel) + app.doneChannel = done app.addRunningService(applicationServer) go applicationServer.Start() <-done @@ -144,7 +149,7 @@ func (app *Application) prepareWatchers() ([]watcher.Watcher, error) { return watchers, nil } -func (app *Application) Shutdown() { +func (app *Application) ShutdownServices() { log.Info("Starting graceful shutdown...") numberOfServices := len(app.runningServices) closeChannel := make(chan bool, numberOfServices) @@ -156,3 +161,7 @@ func (app *Application) Shutdown() { } log.Info("Shutdown completed") } + +func (app *Application) ForceShutdown() { + app.doneChannel <- syscall.SIGINT +} diff --git a/cmd/application/main.go b/cmd/application/main.go index 5cf0c6bb..6ec28d09 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -8,7 +8,6 @@ import ( log "github.com/sirupsen/logrus" "os" "path" - "time" ) // @Version 1.2.1 @@ -21,10 +20,8 @@ var ( BuildTime string ) -const bootstrapTimeout = 3 * time.Minute // In case LP needs to register - func main() { - initCtx, cancel := context.WithTimeout(context.Background(), bootstrapTimeout) + initCtx, cancel := context.WithTimeout(context.Background(), lps.BootstrapTimeout) env := environment.LoadEnv() @@ -40,7 +37,7 @@ func main() { cancel() log.Info("Starting application...") app.Run(*env, logLevel) - app.Shutdown() + app.ShutdownServices() } func setUpLogger(env environment.Environment) log.Level { diff --git a/integration/integration_suite_test.go b/integration/integration_suite_test.go deleted file mode 100644 index 069acf40..00000000 --- a/integration/integration_suite_test.go +++ /dev/null @@ -1,218 +0,0 @@ -package integration_test - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/rpcclient" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - log "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/suite" - "io" - "net/http" - "os" - "syscall" - "testing" - "time" -) - -// TODO this file is very likely to change after LPS refactor - -type IntegrationTestSuite struct { - suite.Suite - SetUpCompletedChannel chan error - ServerDoneChannel chan os.Signal - btc *rpcclient.Client - rsk *ethclient.Client - lbc *bindings.LiquidityBridgeContract - btcParams chaincfg.Params - config SuiteConfig -} - -type SuiteConfig struct { - Lps struct { - Url string `json:"url"` - UseTestInstance bool `json:"useTestInstance"` - } `json:"lps"` - Btc struct { - RpcEndpoint string `json:"rpcEndpoint"` - User string `json:"user"` - Password string `json:"password"` - Network string `json:"network"` - } `json:"btc"` - Rsk struct { - RpcUrl string `json:"rpcUrl"` - LbcAddress string `json:"lbcAddress"` - UserPrivateKey string `json:"userPrivateKey"` - } `json:"rsk"` -} - -func (s *IntegrationTestSuite) SetupSuite() { - log.Debug("Setting up integration tests...") - configFile, err := os.Open("integration-test.config.json") - defer configFile.Close() - if err != nil { - s.FailNow("Error reading configuration file", err) - } - configBytes, err := io.ReadAll(configFile) - if err != nil { - s.FailNow("Error reading configuration", err) - } - err = json.Unmarshal(configBytes, &s.config) - if err != nil { - s.FailNow("Error reading configuration", err) - } - - if s.config.Lps.UseTestInstance { - if err = s.setupLps(); err != nil { - s.FailNow("Error setting up LPS", err) - } - time.Sleep(1 * time.Second) - } - - if err = s.setupBtc(); err != nil { - s.FailNow("Error setting up Bitcoin client", err) - } - - if err = s.setupRsk(); err != nil { - s.FailNow("Error setting up RSK client", err) - } - - log.Debug("Set up completed") -} - -func (s *IntegrationTestSuite) TearDownSuite() { - if s.config.Lps.UseTestInstance { - time.Sleep(3 * time.Second) // to allow LPS to finish updating the database after blockchain calls - s.ServerDoneChannel <- syscall.SIGINT - } -} - -func (s *IntegrationTestSuite) setupLps() error { - s.SetUpCompletedChannel = make(chan error, 1) - s.ServerDoneChannel = make(chan os.Signal, 1) - fatalHook := &FatalHook{suite: s} - go setup(s.SetUpCompletedChannel, s.ServerDoneChannel, fatalHook) - err := <-s.SetUpCompletedChannel - return err -} - -func (s *IntegrationTestSuite) setupBtc() error { - switch s.config.Btc.Network { - case "mainnet": - s.btcParams = chaincfg.MainNetParams - case "testnet": - s.btcParams = chaincfg.TestNet3Params - case "regtest": - s.btcParams = chaincfg.RegressionNetParams - default: - return fmt.Errorf("invalid network name: %v", s.config.Btc.Network) - } - - config := rpcclient.ConnConfig{ - Host: s.config.Btc.RpcEndpoint, - User: s.config.Btc.User, - Pass: s.config.Btc.Password, - Params: s.btcParams.Name, - DisableTLS: true, - HTTPPostMode: true, - } - btc, err := rpcclient.New(&config, nil) - if err != nil { - return err - } - s.btc = btc - return nil -} - -func (s *IntegrationTestSuite) setupRsk() error { - rsk, err := ethclient.Dial(s.config.Rsk.RpcUrl) - if err != nil { - return err - } - if !common.IsHexAddress(s.config.Rsk.LbcAddress) { - return errors.New("invalid LBC address") - } - lbcAddress := common.HexToAddress(s.config.Rsk.LbcAddress) - lbc, err := bindings.NewLiquidityBridgeContract(lbcAddress, rsk) - s.rsk = rsk - s.lbc = lbc - return nil -} - -func (s *IntegrationTestSuite) AssertFields(expectedFields []string, object map[string]any) { - for _, field := range expectedFields { - _, exists := object[field] - assert.True(s.T(), exists, fmt.Sprintf("Field %v is missing", field)) - } -} - -type FatalHook struct { - suite *IntegrationTestSuite -} - -func (h *FatalHook) Levels() []log.Level { - return []log.Level{log.FatalLevel} -} - -func (h *FatalHook) Fire(e *log.Entry) error { - h.suite.SetUpCompletedChannel <- errors.New(e.Message) - h.suite.Fail("Unexpected server error", e.Message) - return nil -} - -type Execution struct { - Body any - Method string - URL string -} - -type Result[responseType any] struct { - Response responseType - RawResponse []byte - StatusCode int -} - -func execute[responseType any](execution Execution) (Result[responseType], error) { - payload, err := json.Marshal(execution.Body) - req, err := http.NewRequest(execution.Method, execution.URL, bytes.NewBuffer(payload)) - if err != nil { - return Result[responseType]{}, err - } - - req.Header.Set("Content-Type", "application/json") - client := http.Client{} - - res, err := client.Do(req) - if err != nil { - return Result[responseType]{}, err - } - defer res.Body.Close() - - bodyBytes, err := io.ReadAll(res.Body) - if err != nil { - return Result[responseType]{}, err - } - - var response responseType - err = json.Unmarshal(bodyBytes, &response) - if err != nil { - return Result[responseType]{}, err - } - - result := Result[responseType]{ - Response: response, - StatusCode: res.StatusCode, - RawResponse: bodyBytes, - } - return result, nil -} - -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/integration/pegout_test.go b/integration/pegout_test.go deleted file mode 100644 index e5630af9..00000000 --- a/integration/pegout_test.go +++ /dev/null @@ -1,269 +0,0 @@ -package integration_test - -import ( - "context" - "encoding/hex" - "encoding/json" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcd/wire" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - lps "github.com/rsksmart/liquidity-provider-server/http" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "math/big" - "net/http" - "strings" - "time" -) - -func (s *IntegrationTestSuite) TestSuccessfulPegOutFlow() { - - var quote lps.QuotePegOutResponse - var acceptedQuote lps.AcceptResPegOut - URL := s.config.Lps.Url - - s.Run("Should be able to get pegout quote", func() { - body := lps.QuotePegOutRequest{ - To: "mi1r1QvaBVxLDLBPoZ3jJMUKCYMh7dBkBv", - ValueToTransfer: 600000000000000000, - RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", - BitcoinRefundAddress: "mi1r1QvaBVxLDLBPoZ3jJMUKCYMh7dBkBv", - } - - result, err := execute[[]lps.QuotePegOutResponse](Execution{ - Method: http.MethodPost, - URL: URL + "/pegout/getQuotes", - Body: body, - }) - - if err != nil { - assert.Fail(s.T(), "Unexpected error: ", err) - } - - expectedFields := []string{ - "lbcAddress", - "liquidityProviderRskAddress", - "btcRefundAddress", - "rskRefundAddress", - "lpBtcAddr", - "callFee", - "penaltyFee", - "nonce", - "depositAddr", - "value", - "agreementTimestamp", - "depositDateLimit", - "depositConfirmations", - "transferConfirmations", - "transferTime", - "expireDate", - "expireBlocks", - "gasFee", - } - - var rawResponse []map[string]any - err = json.Unmarshal(result.RawResponse, &rawResponse) - if err != nil { - assert.Fail(s.T(), "Response does not have required format") - } - assert.Equal(s.T(), http.StatusOK, result.StatusCode) - assert.NotEmpty(s.T(), rawResponse[0]["quoteHash"]) - assert.NotEmpty(s.T(), rawResponse[0]["quote"]) - quoteFields, ok := rawResponse[0]["quote"].(map[string]any) - if !ok { - assert.Fail(s.T(), "Quote is not an object") - } - s.AssertFields(expectedFields, quoteFields) - quote = result.Response[0] - }) - - s.Run("Should be able to accept pegout quote", func() { - body := lps.AcceptReq{QuoteHash: quote.QuoteHash} - result, err := execute[lps.AcceptResPegOut](Execution{ - Method: http.MethodPost, - URL: URL + "/pegout/acceptQuote", - Body: body, - }) - if err != nil { - assert.Fail(s.T(), "Unexpected error: ", err) - } - - expectedFields := []string{ - "signature", - "lbcAddress", - } - - assert.Equal(s.T(), http.StatusOK, result.StatusCode) - var rawResponse map[string]any - err = json.Unmarshal(result.RawResponse, &rawResponse) - if err != nil { - assert.Fail(s.T(), "Response does not have required format") - } - s.AssertFields(expectedFields, rawResponse) - acceptedQuote = result.Response - }) - - s.Run("Should process depositPegOut execution and transfer bitcoin to user", func() { - var err error - ctx := context.Background() - privateKey, err := crypto.HexToECDSA(s.config.Rsk.UserPrivateKey) - if err != nil { - assert.FailNow(s.T(), "Invalid private key") - } - chainId, err := s.rsk.ChainID(ctx) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - opts, err := bind.NewKeyedTransactorWithChainID(privateKey, chainId) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - - value := types.NewWei(int64(quote.Quote.Value)) - callFee := types.NewWei(int64(quote.Quote.CallFee)) - gasFee := types.NewWei(int64(quote.Quote.GasFee)) - productFee := types.NewWei(int64(quote.Quote.ProductFeeAmount)) - totalFees := new(types.Wei).Add(new(types.Wei).Add(callFee, gasFee), productFee) - totalAmount := new(types.Wei).Add(totalFees, value) - opts.Value = totalAmount.AsBigInt() - - gasPrice, err := s.rsk.SuggestGasPrice(ctx) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - opts.GasPrice = gasPrice - - originalQuote := quote.Quote - lpBtcAddress, err := connectors.DecodeBTCAddress(originalQuote.LpBTCAddr) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - btcRefundAddress, err := connectors.DecodeBTCAddress(originalQuote.BtcRefundAddr) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - depositAddress, err := connectors.DecodeBTCAddress(originalQuote.DepositAddr) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - pegoutQuote := bindings.QuotesPegOutQuote{ - LbcAddress: common.HexToAddress(originalQuote.LBCAddr), - LpRskAddress: common.HexToAddress(originalQuote.LPRSKAddr), - BtcRefundAddress: btcRefundAddress, - RskRefundAddress: common.HexToAddress(originalQuote.RSKRefundAddr), - LpBtcAddress: lpBtcAddress, - CallFee: big.NewInt(int64(originalQuote.CallFee)), - PenaltyFee: big.NewInt(int64(originalQuote.PenaltyFee)), - Nonce: originalQuote.Nonce, - DeposityAddress: depositAddress, - Value: big.NewInt(int64(originalQuote.Value)), - AgreementTimestamp: originalQuote.AgreementTimestamp, - DepositDateLimit: originalQuote.DepositDateLimit, - DepositConfirmations: originalQuote.DepositConfirmations, - TransferConfirmations: originalQuote.TransferConfirmations, - TransferTime: originalQuote.TransferTime, - ExpireDate: originalQuote.ExpireDate, - ExpireBlock: originalQuote.ExpireBlock, - ProductFeeAmount: big.NewInt(int64(originalQuote.ProductFeeAmount)), - GasFee: big.NewInt(int64(originalQuote.GasFee)), - } - - signature, err := hex.DecodeString(acceptedQuote.Signature) - if err != nil { - assert.FailNow(s.T(), "invalid signature") - } - - depositTx, err := s.lbc.DepositPegout(opts, pegoutQuote, signature) - if err != nil { - assert.FailNow(s.T(), "error depositing pegout: "+err.Error()) - } - log.Debug("[Integration test] Hash of deposit tx ", depositTx.Hash().String()) - - address, err := btcutil.DecodeAddress(quote.Quote.DepositAddr, &s.btcParams) - if err != nil { - assert.FailNow(s.T(), "invalid btc address") - } - - var latestBlockHash *chainhash.Hash - var block *wire.MsgBlock - info, err := s.btc.GetBlockChainInfo() - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - latestBlockNumber := info.Blocks - latestBlockHash, _ = chainhash.NewHashFromStr(info.BestBlockHash) - block, err = s.btc.GetBlock(latestBlockHash) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - - var txHash string - for txHash == "" { - txHash = lookForTxToAddress(block, address, &s.btcParams) - if txHash == "" { - hash, getBlockError := s.btc.GetBlockHash(int64(latestBlockNumber + 1)) - if getBlockError != nil && !strings.Contains(getBlockError.Error(), "Block height out of range") { - assert.FailNow(s.T(), getBlockError.Error()) - } else if getBlockError == nil { - latestBlockHash = hash - latestBlockNumber++ - block, err = s.btc.GetBlock(latestBlockHash) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - } - } - time.Sleep(10 * time.Second) - } - - txParsedHash, _ := chainhash.NewHashFromStr(txHash) - tx, err := s.btc.GetTransaction(txParsedHash) - if err != nil { - assert.FailNow(s.T(), err.Error()) - } - assert.NotNil(s.T(), tx) - }) - - s.Run("Should refund pegout to liquidity provider", func() { - eventChannel := make(chan *bindings.LiquidityBridgeContractPegOutRefunded) - var quoteHash [32]byte - hashBytes, _ := hex.DecodeString(quote.QuoteHash) - copy(quoteHash[:], hashBytes) - subscription, err := s.lbc.WatchPegOutRefunded( - nil, - eventChannel, - [][32]byte{quoteHash}, - ) - if err != nil { - assert.FailNow(s.T(), "Error listening for refundPegOut") - } - - select { - case refund := <-eventChannel: - subscription.Unsubscribe() - assert.NotNil(s.T(), refund, "refundPegOut failed") - case err = <-subscription.Err(): - assert.FailNow(s.T(), "Error listening for refundPegOut") - } - }) -} - -func lookForTxToAddress(block *wire.MsgBlock, target btcutil.Address, params *chaincfg.Params) string { - for _, tx := range block.Transactions { - for _, output := range tx.TxOut { - _, addresses, _, _ := txscript.ExtractPkScriptAddrs(output.PkScript, params) - if len(addresses) != 0 && addresses[0].EncodeAddress() == target.EncodeAddress() { - return tx.TxHash().String() - } - } - } - return "" -} diff --git a/integration/setup_test.go b/integration/setup_test.go deleted file mode 100644 index 4607c06d..00000000 --- a/integration/setup_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package integration_test - -import ( - "context" - "fmt" - awsConfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/rsksmart/liquidity-provider-server/account" - "github.com/rsksmart/liquidity-provider-server/config" - "github.com/rsksmart/liquidity-provider-server/connectors" - "github.com/rsksmart/liquidity-provider-server/http" - mongoDB "github.com/rsksmart/liquidity-provider-server/mongo" - "github.com/rsksmart/liquidity-provider-server/pegin" - "github.com/rsksmart/liquidity-provider-server/pegout" - "github.com/rsksmart/liquidity-provider-server/secrets" - "github.com/rsksmart/liquidity-provider-server/storage" - "github.com/rsksmart/liquidity-provider/types" - log "github.com/sirupsen/logrus" - "math/big" - "math/rand" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - "time" -) - -// TODO this file is very likely to change after LPS refactor - -var ( - cfg config.Config - srv http.Server - cfgData http.ConfigData -) - -func loadConfig() error { - err := config.LoadEnv(&cfg) - return err -} - -func initLogger(hooks ...log.Hook) { - log.SetLevel(log.DebugLevel) - log.SetOutput(os.Stdout) - for _, hook := range hooks { - log.AddHook(hook) - } -} - -func startServer(rsk *connectors.RSK, btc *connectors.BTC, dbMongo *mongoDB.DB, endChannel chan<- os.Signal, readyChannel chan<- error) { - lpRepository := storage.NewLPRepository(dbMongo, rsk, btc) - - awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) - if err != nil { - log.Fatal("error loading configuration: ", err.Error()) - } - - secretsStorage := secrets.NewSecretsManagerStorage[any](awsConfiguration) - secretNames := &account.AccountSecretNames{ - KeySecretName: cfg.ProviderCredentials.KeySecret, - PasswordSecretName: cfg.ProviderCredentials.PasswordSecret, - } - accountProvider := account.NewRemoteAccountProvider( - cfg.ProviderCredentials.Keydir, - cfg.ProviderCredentials.AccountNum, - secretNames, - secretsStorage, - ) - lp, err := pegin.NewLocalProvider(cfg.Provider, lpRepository, accountProvider, cfg.RSK.ChainId) - if err != nil { - log.Fatal("cannot create local provider: ", err) - } - lpPegOut, err := pegout.NewLocalProvider(&cfg.PegoutProvier, lpRepository, accountProvider, cfg.RSK.ChainId) - if err != nil { - log.Fatal("cannot create local provider: ", err) - } - - srv = http.New(rsk, btc, dbMongo, cfgData, lpRepository, cfg.Provider, cfg.PegoutProvier, accountProvider, awsConfiguration) - log.Debug("registering local provider (this might take a while)") - req := types.ProviderRegisterRequest{ - Name: cfg.ProviderName, - ApiBaseUrl: cfg.BaseURL, - Status: true, - ProviderType: cfg.ProviderType, - } - - err = srv.AddProvider(lp, lpPegOut, req) - if err != nil { - log.Fatalf("error registering local provider: %v", err) - } - port := cfg.Server.Port - - if port == 0 { - port = 8080 - } - go func() { - readyChannel <- nil - err := srv.Start(port) - if err != nil { - log.Error("server error: ", err.Error()) - endChannel <- syscall.SIGTERM - } - }() -} - -func initCfgData() { - cfgData.RSK = cfg.RSK - cfgData.QuoteCacheStartBlock = cfg.QuoteCacheStartBlock - cfgData.CaptchaSecretKey = cfg.CaptchaSecretKey - cfgData.CaptchaThreshold = cfg.CaptchaThreshold - cfgData.CaptchaSiteKey = cfg.CaptchaSiteKey -} - -func setup(readyChannel chan<- error, doneChannel chan os.Signal, logHooks ...log.Hook) { - initLogger(logHooks...) - err := loadConfig() - if err != nil { - readyChannel <- fmt.Errorf("error loading configuration: %v", err) - return - } - initCfgData() - rand.Seed(time.Now().UnixNano()) - - log.Info("starting liquidity provider server") - log.Debugf("loaded config %+v", cfg) - - awsConfiguration, err := awsConfig.LoadDefaultConfig(context.Background()) - if err != nil { - log.Fatal("error loading configuration: ", err.Error()) - } - - secretsStorage := secrets.NewSecretsManagerStorage[any](awsConfiguration) - - dbMongo, err := mongoDB.Connect() - if err != nil { - readyChannel <- fmt.Errorf("error connecting to DB: %v", err) - return - } - - erpKeys := strings.Split(os.Getenv("ERP_KEYS"), ",") - log.Debug("ERP Keys: ", erpKeys) - rsk, err := connectors.NewRSK(cfg.RSK.LBCAddr, cfg.RSK.BridgeAddr, cfg.RSK.RequiredBridgeConfirmations, cfg.IrisActivationHeight, erpKeys) - if err != nil { - readyChannel <- fmt.Errorf("RSK error: %v", err) - return - } - - chainId, err := strconv.ParseInt(os.Getenv("RSK_CHAIN_ID"), 10, 64) - if err != nil { - readyChannel <- fmt.Errorf("Error getting the chain ID: %v", err) - return - } - - err = rsk.Connect(os.Getenv("RSKJ_CONNECTION_STRING"), big.NewInt(chainId)) - if err != nil { - readyChannel <- fmt.Errorf("error connecting to RSK: %v", err) - return - } - - walletPassword, err := secretsStorage.GetTextSecret(cfg.BtcWalletPassword) - if err != nil { - log.Fatal("Error getting BTC wallet password: ", err) - } - - btc, err := connectors.NewBTC(os.Getenv("BTC_NETWORK"), walletPassword, cfg.IsBtcEncryptedWallet) - if err != nil { - readyChannel <- fmt.Errorf("error initializing BTC connector: %v", err) - return - } - - err = btc.Connect(cfg.BTC) - if err != nil { - readyChannel <- fmt.Errorf("error connecting to BTC: %v", err) - return - } - - signal.Notify(doneChannel, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) - - startServer(rsk, btc, dbMongo, doneChannel, readyChannel) - <-doneChannel - srv.Shutdown() - rsk.Close() - btc.Close() - err = dbMongo.Close() - if err != nil { - log.Fatal("error closing DB connection: ", err) - } -} diff --git a/internal/adapters/entrypoints/rest/server/server.go b/internal/adapters/entrypoints/rest/server/server.go index 7ae316b6..3027a412 100644 --- a/internal/adapters/entrypoints/rest/server/server.go +++ b/internal/adapters/entrypoints/rest/server/server.go @@ -27,7 +27,7 @@ type Server struct { useCaseRegistry registry.UseCaseRegistry } -func NewServer(env environment.Environment, useCaseRegistry registry.UseCaseRegistry, logLevel log.Level) (*Server, <-chan os.Signal) { +func NewServer(env environment.Environment, useCaseRegistry registry.UseCaseRegistry, logLevel log.Level) (*Server, chan os.Signal) { done := make(chan os.Signal, 1) signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) return &Server{ diff --git a/integration/Readme.md b/test/integration/Readme.md similarity index 100% rename from integration/Readme.md rename to test/integration/Readme.md diff --git a/integration/integration-test.config.example.json b/test/integration/integration-test.config.example.json similarity index 84% rename from integration/integration-test.config.example.json rename to test/integration/integration-test.config.example.json index dcea41e0..6e1a5391 100644 --- a/integration/integration-test.config.example.json +++ b/test/integration/integration-test.config.example.json @@ -1,4 +1,5 @@ { + "network": "regtest", "lps": { "url": "http://localhost:8080", "useTestInstance": true @@ -7,7 +8,7 @@ "rpcEndpoint": "localhost:5555", "user": "test", "password": "test", - "network": "regtest" + "password": "test-password" }, "rsk": { "rpcUrl": "ws://localhost:4445/websocket", diff --git a/test/integration/integration_suite_test.go b/test/integration/integration_suite_test.go new file mode 100644 index 00000000..2e6f0e68 --- /dev/null +++ b/test/integration/integration_suite_test.go @@ -0,0 +1,227 @@ +package integration_test + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/rpcclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/rsksmart/liquidity-provider-server/cmd/application/lps" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/suite" + "io" + "net/http" + "os" + "testing" + "time" +) + +type IntegrationTestSuite struct { + suite.Suite + btc *rpcclient.Client + rsk *ethclient.Client + lbc *bindings.LiquidityBridgeContract + btcParams chaincfg.Params + config SuiteConfig + app *lps.Application +} + +type SuiteConfig struct { + Network string `json:"network"` + Lps struct { + Url string `json:"url"` + UseTestInstance bool `json:"useTestInstance"` + } `json:"lps"` + Btc struct { + RpcEndpoint string `json:"rpcEndpoint"` + User string `json:"user"` + Password string `json:"password"` + WalletPassword string `json:"walletPassword"` + } `json:"btc"` + Rsk struct { + RpcUrl string `json:"rpcUrl"` + LbcAddress string `json:"lbcAddress"` + UserPrivateKey string `json:"userPrivateKey"` + } `json:"rsk"` +} + +func (s *IntegrationTestSuite) SetupSuite() { + var err error + var configBytes []byte + var configFile *os.File + + log.Debug("Setting up integration tests...") + if configFile, err = os.Open("test/integration/integration-test.config.json"); err != nil { + s.FailNow("Error reading configuration file", err) + } + defer func(configFile *os.File) { + if closingErr := configFile.Close(); closingErr != nil { + s.FailNow("Error closing configuration file", err) + } + }(configFile) + + if configBytes, err = io.ReadAll(configFile); err != nil { + s.FailNow("Error reading configuration", err) + } + + if err = json.Unmarshal(configBytes, &s.config); err != nil { + s.FailNow("Error reading configuration", err) + } + + if err = s.setupBtc(); err != nil { + s.FailNow("Error setting up Bitcoin client", err) + } + + if err = s.setupRsk(); err != nil { + s.FailNow("Error setting up RSK client", err) + } + + if s.config.Lps.UseTestInstance { + s.setupLps() + time.Sleep(1 * time.Second) + } + + if s.config.Network == "regtest" { + log.Warn("Setting limits for regtest operations. This requires the management API enabled.") + if err = s.configureRegtestLimits(); err != nil { + s.FailNow("Error setting regtest limits", err) + } + } + + log.Debug("Set up completed") +} + +func (s *IntegrationTestSuite) TearDownSuite() { + if s.config.Lps.UseTestInstance { + time.Sleep(3 * time.Second) // to allow LPS to finish updating the database after blockchain calls + s.app.ForceShutdown() + } +} + +func (s *IntegrationTestSuite) setupLps() { + fatalHook := &FatalHook{suite: s} + referenceChannel := make(chan *lps.Application) + go setUpLps(referenceChannel, fatalHook) + s.app = <-referenceChannel +} + +func (s *IntegrationTestSuite) setupBtc() error { + switch s.config.Network { + case "mainnet": + s.btcParams = chaincfg.MainNetParams + case "testnet": + s.btcParams = chaincfg.TestNet3Params + case "regtest": + s.btcParams = chaincfg.RegressionNetParams + default: + return fmt.Errorf("invalid network name: %v", s.config.Network) + } + + config := rpcclient.ConnConfig{ + Host: s.config.Btc.RpcEndpoint, + User: s.config.Btc.User, + Pass: s.config.Btc.Password, + Params: s.btcParams.Name, + DisableTLS: true, + HTTPPostMode: true, + } + btc, err := rpcclient.New(&config, nil) + if err != nil { + return err + } + s.btc = btc + return nil +} + +func (s *IntegrationTestSuite) setupRsk() error { + rsk, err := ethclient.Dial(s.config.Rsk.RpcUrl) + if err != nil { + return err + } + if !common.IsHexAddress(s.config.Rsk.LbcAddress) { + return errors.New("invalid LBC address") + } + lbcAddress := common.HexToAddress(s.config.Rsk.LbcAddress) + lbc, err := bindings.NewLiquidityBridgeContract(lbcAddress, rsk) + if err != nil { + return err + } + s.rsk = rsk + s.lbc = lbc + return nil +} + +func (s *IntegrationTestSuite) configureRegtestLimits() error { + url := s.config.Lps.Url + result, err := execute[any](Execution{ + Method: http.MethodPost, + URL: url + "/pegin/configuration", + Body: pkg.PeginConfigurationRequest{ + Configuration: &liquidity_provider.PeginConfiguration{ + TimeForDeposit: 3600, + CallTime: 7200, + PenaltyFee: entities.NewUWei(1000000000000000), + CallFee: entities.NewUWei(10000000000000000), + MaxValue: entities.NewUWei(10000000000000000000), + MinValue: entities.NewUWei(600000000000000000), + }, + }, + }) + if err != nil { + return err + } else if result.StatusCode != 204 { + return fmt.Errorf("unexpected status code: %v", result.StatusCode) + } + result, err = execute[any](Execution{ + Method: http.MethodPost, + URL: url + "/pegout/configuration", + Body: pkg.PegoutConfigurationRequest{ + Configuration: &liquidity_provider.PegoutConfiguration{ + TimeForDeposit: 3600, + CallTime: 7200, + PenaltyFee: entities.NewUWei(1000000000000000), + CallFee: entities.NewUWei(10000000000000000), + MaxValue: entities.NewUWei(10000000000000000000), + MinValue: entities.NewUWei(600000000000000000), + ExpireBlocks: 500, + }, + }, + }) + if err != nil { + return err + } else if result.StatusCode != 204 { + return fmt.Errorf("unexpected status code: %v", result.StatusCode) + } + return nil +} + +func (s *IntegrationTestSuite) AssertFields(expectedFields []string, object map[string]any) { + for _, field := range expectedFields { + _, exists := object[field] + s.Require().True(exists, fmt.Sprintf("Field %v is missing", field)) + } +} + +type FatalHook struct { + suite *IntegrationTestSuite +} + +func (h *FatalHook) Levels() []log.Level { + return []log.Level{log.FatalLevel} +} + +func (h *FatalHook) Fire(e *log.Entry) error { + h.suite.app.ShutdownServices() + h.suite.Fail("Unexpected server error", e.Message) + return nil +} + +func TestIntegrationTestSuite(t *testing.T) { + suite.Run(t, new(IntegrationTestSuite)) +} diff --git a/integration/pegin_test.go b/test/integration/pegin_test.go similarity index 56% rename from integration/pegin_test.go rename to test/integration/pegin_test.go index 1f20bd6e..76bf327f 100644 --- a/integration/pegin_test.go +++ b/test/integration/pegin_test.go @@ -5,37 +5,36 @@ import ( "encoding/json" "github.com/btcsuite/btcd/btcutil" "github.com/ethereum/go-ethereum/common" - "github.com/rsksmart/liquidity-provider-server/connectors/bindings" - lps "github.com/rsksmart/liquidity-provider-server/http" - "github.com/rsksmart/liquidity-provider/types" - "github.com/stretchr/testify/assert" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/pkg" "net/http" + "os" + "os/signal" + "syscall" ) +// nolint:funlen func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { - - var quote lps.QuoteReturn - var acceptedQuote lps.AcceptRes + var quote pkg.GetPeginQuoteResponse + var acceptedQuote pkg.AcceptPeginRespose URL := s.config.Lps.Url s.Run("Should be able to get pegin quote", func() { - body := lps.QuoteRequest{ + body := pkg.PeginQuoteRequest{ CallEoaOrContractAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", CallContractArguments: "", ValueToTransfer: 600000000000000000, RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", - BitcoinRefundAddress: "mxEp7KGqyjFiLnWJoXU6MNXpop8BYe9Gv1", + BitcoinRefundAddress: "n1zjV3WxJgA4dBfS5aMiEHtZsjTUvAL7p7", } - result, err := execute[[]lps.QuoteReturn](Execution{ + result, err := execute[[]pkg.GetPeginQuoteResponse](Execution{ Method: http.MethodPost, URL: URL + "/pegin/getQuote", Body: body, }) - - if err != nil { - assert.Fail(s.T(), "Unexpected error: ", err) - } + s.NoError(err) expectedFields := []string{ "gasFee", @@ -61,68 +60,56 @@ func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { var rawResponse []map[string]any err = json.Unmarshal(result.RawResponse, &rawResponse) - if err != nil { - assert.Fail(s.T(), "Response does not have required format") - } - assert.Equal(s.T(), http.StatusOK, result.StatusCode) - assert.NotEmpty(s.T(), rawResponse[0]["quoteHash"]) - assert.NotEmpty(s.T(), rawResponse[0]["quote"]) + s.NoError(err) + s.Equal(http.StatusOK, result.StatusCode) + s.NotEmpty(rawResponse[0]["quoteHash"]) + s.NotEmpty(rawResponse[0]["quote"]) quoteFields, ok := rawResponse[0]["quote"].(map[string]any) if !ok { - assert.Fail(s.T(), "Quote is not an object") + s.FailNow("Quote is not an object") } s.AssertFields(expectedFields, quoteFields) quote = result.Response[0] }) s.Run("Should be able to accept pegin quote", func() { - body := lps.AcceptReq{QuoteHash: quote.QuoteHash} - result, err := execute[lps.AcceptRes](Execution{ + body := pkg.AcceptQuoteRequest{QuoteHash: quote.QuoteHash} + result, err := execute[pkg.AcceptPeginRespose](Execution{ Method: http.MethodPost, URL: URL + "/pegin/acceptQuote", Body: body, }) - if err != nil { - assert.Fail(s.T(), "Unexpected error: ", err) - } + s.NoError(err) - expectedFields := []string{ - "signature", - "bitcoinDepositAddressHash", - } + expectedFields := []string{"signature", "bitcoinDepositAddressHash"} - assert.Equal(s.T(), http.StatusOK, result.StatusCode) + s.Require().Equal(http.StatusOK, result.StatusCode) var rawResponse map[string]any err = json.Unmarshal(result.RawResponse, &rawResponse) - if err != nil { - assert.Fail(s.T(), "Response does not have required format") - } + s.NoError(err) s.AssertFields(expectedFields, rawResponse) acceptedQuote = result.Response }) s.Run("Should process bitcoin deposit and callForUser", func() { address, err := btcutil.DecodeAddress(acceptedQuote.BitcoinDepositAddressHash, &s.btcParams) - if err != nil { - assert.Fail(s.T(), "Invalid derivation address") - } - value := types.NewWei(int64(quote.Quote.Value)) - callFee := types.NewWei(int64(quote.Quote.CallFee)) - gasFee := types.NewWei(int64(quote.Quote.GasFee)) - productFee := types.NewWei(int64(quote.Quote.ProductFeeAmount)) - totalFees := new(types.Wei).Add(new(types.Wei).Add(callFee, gasFee), productFee) - totalAmount := new(types.Wei).Add(totalFees, value) + s.NoError(err) + value := entities.NewUWei(quote.Quote.Value) + callFee := entities.NewUWei(quote.Quote.CallFee) + gasFee := entities.NewUWei(quote.Quote.GasFee) + productFee := entities.NewUWei(quote.Quote.ProductFeeAmount) + totalFees := new(entities.Wei).Add(new(entities.Wei).Add(callFee, gasFee), productFee) + totalAmount := new(entities.Wei).Add(totalFees, value) floatAmount, _ := totalAmount.ToRbtc().Float64() btcAmount, err := btcutil.NewAmount(floatAmount) - if err != nil { - assert.Fail(s.T(), err.Error()) - } + s.NoError(err) amount, _ := btcutil.NewAmount(0.00025) - _ = s.btc.SetTxFee(amount) + err = s.btc.WalletPassphrase(s.config.Btc.WalletPassword, 60) + s.Require().NoError(err) + err = s.btc.SetTxFee(amount) + s.Require().NoError(err) _, err = s.btc.SendToAddress(address, btcAmount) - if err != nil { - assert.FailNow(s.T(), "Error sending btc transaction") - } + s.Require().NoError(err) eventChannel := make(chan *bindings.LiquidityBridgeContractCallForUser) lpAddress := common.HexToAddress(quote.Quote.LPRSKAddr) @@ -133,16 +120,19 @@ func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { []common.Address{lpAddress}, []common.Address{toAddress}, ) - if err != nil { - assert.FailNow(s.T(), "Error listening for callForUser") - } + s.NoError(err) + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) select { case callForUser := <-eventChannel: subscription.Unsubscribe() - assert.True(s.T(), callForUser.Success, "Call for user failed") + s.True(callForUser.Success, "Call for user failed") case err = <-subscription.Err(): - assert.FailNow(s.T(), "Error listening for callForUser") + s.FailNow("Error listening for callForUser", err) + case <-done: + subscription.Unsubscribe() + s.FailNow("Test cancelled") } }) @@ -157,15 +147,20 @@ func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { [][32]byte{quoteHash}, ) if err != nil { - assert.FailNow(s.T(), "Error listening for callForUser") + s.FailNow("Error listening for registerPegIn") } + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) select { case registerPegIn := <-eventChannel: subscription.Unsubscribe() - assert.Positive(s.T(), registerPegIn.TransferredAmount.Int64(), "Register PegIn failed") + s.Positive(registerPegIn.TransferredAmount.Int64(), "Register PegIn failed") case err = <-subscription.Err(): - assert.FailNow(s.T(), "Error listening for callForUser") + s.FailNow("Error listening for registerPegIn", err) + case <-done: + subscription.Unsubscribe() + s.FailNow("Test cancelled") } }) } diff --git a/test/integration/pegout_test.go b/test/integration/pegout_test.go new file mode 100644 index 00000000..62212b8f --- /dev/null +++ b/test/integration/pegout_test.go @@ -0,0 +1,254 @@ +package integration_test + +import ( + "context" + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/pkg" + log "github.com/sirupsen/logrus" + "math/big" + "net/http" + "os" + "os/signal" + "strings" + "syscall" + "time" +) + +// nolint:funlen +func (s *IntegrationTestSuite) TestSuccessfulPegOutFlow() { + + var quote pkg.GetPegoutQuoteResponse + var acceptedQuote pkg.AcceptPegoutResponse + URL := s.config.Lps.Url + + s.Run("Should be able to get pegout quote", func() { + body := pkg.PegoutQuoteRequest{ + To: "n1zjV3WxJgA4dBfS5aMiEHtZsjTUvAL7p7", + ValueToTransfer: 600000000000000000, + RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + BitcoinRefundAddress: "n1zjV3WxJgA4dBfS5aMiEHtZsjTUvAL7p7", + } + + result, err := execute[[]pkg.GetPegoutQuoteResponse](Execution{ + Method: http.MethodPost, + URL: URL + "/pegout/getQuotes", + Body: body, + }) + s.NoError(err) + + expectedFields := []string{ + "lbcAddress", + "liquidityProviderRskAddress", + "btcRefundAddress", + "rskRefundAddress", + "lpBtcAddr", + "callFee", + "penaltyFee", + "nonce", + "depositAddr", + "value", + "agreementTimestamp", + "depositDateLimit", + "depositConfirmations", + "transferConfirmations", + "transferTime", + "expireDate", + "expireBlocks", + "gasFee", + } + + var rawResponse []map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + if err != nil { + s.FailNow("Response does not have required format") + } + s.Equal(http.StatusOK, result.StatusCode) + s.NotEmpty(rawResponse[0]["quoteHash"]) + s.NotEmpty(rawResponse[0]["quote"]) + quoteFields, ok := rawResponse[0]["quote"].(map[string]any) + if !ok { + s.FailNow("Quote is not an object") + } + s.AssertFields(expectedFields, quoteFields) + quote = result.Response[0] + }) + + s.Run("Should be able to accept pegout quote", func() { + body := pkg.AcceptQuoteRequest{QuoteHash: quote.QuoteHash} + result, err := execute[pkg.AcceptPegoutResponse](Execution{ + Method: http.MethodPost, + URL: URL + "/pegout/acceptQuote", + Body: body, + }) + s.Require().NoError(err) + + expectedFields := []string{ + "signature", + "lbcAddress", + } + + s.Equal(http.StatusOK, result.StatusCode) + var rawResponse map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + if err != nil { + s.FailNow("Response does not have required format") + } + s.AssertFields(expectedFields, rawResponse) + acceptedQuote = result.Response + }) + + s.Run("Should process depositPegOut execution and transfer bitcoin to user", func() { + var err error + ctx := context.Background() + privateKey, err := crypto.HexToECDSA(s.config.Rsk.UserPrivateKey) + s.NoError(err) + chainId, err := s.rsk.ChainID(ctx) + if err != nil { + s.FailNow(err.Error()) + } + opts, err := bind.NewKeyedTransactorWithChainID(privateKey, chainId) + if err != nil { + s.FailNow(err.Error()) + } + + value := entities.NewUWei(quote.Quote.Value) + callFee := entities.NewUWei(quote.Quote.CallFee) + gasFee := entities.NewUWei(quote.Quote.GasFee) + productFee := entities.NewUWei(quote.Quote.ProductFeeAmount) + totalFees := new(entities.Wei).Add(new(entities.Wei).Add(callFee, gasFee), productFee) + totalAmount := new(entities.Wei).Add(totalFees, value) + opts.Value = totalAmount.AsBigInt() + + gasPrice, err := s.rsk.SuggestGasPrice(ctx) + s.NoError(err) + opts.GasPrice = gasPrice + pegoutQuote := parseLbcPegoutQuote(s, quote.Quote) + + signature, err := hex.DecodeString(acceptedQuote.Signature) + s.NoError(err) + + depositTx, err := s.lbc.DepositPegout(opts, pegoutQuote, signature) + s.NoError(err) + log.Debug("[Integration test] Hash of deposit tx ", depositTx.Hash().String()) + + address, err := btcutil.DecodeAddress(quote.Quote.DepositAddr, &s.btcParams) + s.NoError(err) + + txHash := waitForBtcTransactionToAddress(s, address) + + txParsedHash, _ := chainhash.NewHashFromStr(txHash) + tx, err := s.btc.GetTransaction(txParsedHash) + s.NoError(err) + s.NotNil(tx) + }) + + s.Run("Should refund pegout to liquidity provider", func() { + eventChannel := make(chan *bindings.LiquidityBridgeContractPegOutRefunded) + var quoteHash [32]byte + hashBytes, _ := hex.DecodeString(quote.QuoteHash) + copy(quoteHash[:], hashBytes) + subscription, err := s.lbc.WatchPegOutRefunded( + nil, + eventChannel, + [][32]byte{quoteHash}, + ) + s.NoError(err) + + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + select { + case refund := <-eventChannel: + subscription.Unsubscribe() + s.NotNil(refund, "refundPegOut failed") + case err = <-subscription.Err(): + s.FailNow("Error listening for refundPegOut", err) + case <-done: + subscription.Unsubscribe() + s.FailNow("Test cancelled") + } + }) +} + +func lookForTxToAddress(block *wire.MsgBlock, target btcutil.Address, params *chaincfg.Params) string { + for _, tx := range block.Transactions { + for _, output := range tx.TxOut { + _, addresses, _, _ := txscript.ExtractPkScriptAddrs(output.PkScript, params) + if len(addresses) != 0 && addresses[0].EncodeAddress() == target.EncodeAddress() { + return tx.TxHash().String() + } + } + } + return "" +} + +func parseLbcPegoutQuote(s *IntegrationTestSuite, originalQuote pkg.PegoutQuoteDTO) bindings.QuotesPegOutQuote { + lpBtcAddress, err := bitcoin.DecodeAddressBase58OnlyLegacy(originalQuote.LpBTCAddr, true) + s.NoError(err) + btcRefundAddress, err := bitcoin.DecodeAddressBase58OnlyLegacy(originalQuote.BtcRefundAddr, true) + s.NoError(err) + depositAddress, err := bitcoin.DecodeAddressBase58OnlyLegacy(originalQuote.DepositAddr, true) + s.NoError(err) + return bindings.QuotesPegOutQuote{ + LbcAddress: common.HexToAddress(originalQuote.LBCAddr), + LpRskAddress: common.HexToAddress(originalQuote.LPRSKAddr), + BtcRefundAddress: btcRefundAddress, + RskRefundAddress: common.HexToAddress(originalQuote.RSKRefundAddr), + LpBtcAddress: lpBtcAddress, + CallFee: big.NewInt(int64(originalQuote.CallFee)), + PenaltyFee: big.NewInt(int64(originalQuote.PenaltyFee)), + Nonce: originalQuote.Nonce, + DeposityAddress: depositAddress, + Value: big.NewInt(int64(originalQuote.Value)), + AgreementTimestamp: originalQuote.AgreementTimestamp, + DepositDateLimit: originalQuote.DepositDateLimit, + DepositConfirmations: originalQuote.DepositConfirmations, + TransferConfirmations: originalQuote.TransferConfirmations, + TransferTime: originalQuote.TransferTime, + ExpireDate: originalQuote.ExpireDate, + ExpireBlock: originalQuote.ExpireBlock, + ProductFeeAmount: big.NewInt(int64(originalQuote.ProductFeeAmount)), + GasFee: big.NewInt(int64(originalQuote.GasFee)), + } +} + +func waitForBtcTransactionToAddress(s *IntegrationTestSuite, address btcutil.Address) string { + var latestBlockHash *chainhash.Hash + var block *wire.MsgBlock + info, err := s.btc.GetBlockChainInfo() + s.NoError(err) + latestBlockNumber := info.Blocks + latestBlockHash, _ = chainhash.NewHashFromStr(info.BestBlockHash) + block, err = s.btc.GetBlock(latestBlockHash) + s.NoError(err) + + var txHash string + for txHash == "" { + txHash = lookForTxToAddress(block, address, &s.btcParams) + if txHash == "" { + hash, getBlockError := s.btc.GetBlockHash(int64(latestBlockNumber + 1)) + if getBlockError != nil && !strings.Contains(getBlockError.Error(), "Block height out of range") { + s.FailNow(getBlockError.Error()) + } else if getBlockError == nil { + latestBlockHash = hash + latestBlockNumber++ + if block, err = s.btc.GetBlock(latestBlockHash); err != nil { + s.FailNow(err.Error()) + } + } + } + time.Sleep(10 * time.Second) + } + return txHash +} diff --git a/test/integration/setup_test.go b/test/integration/setup_test.go new file mode 100644 index 00000000..a5b5c45a --- /dev/null +++ b/test/integration/setup_test.go @@ -0,0 +1,35 @@ +package integration_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/cmd/application/lps" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" + "os" +) + +const testLogLevel = log.DebugLevel + +func setUpLps(referenceChannel chan<- *lps.Application, hooks ...log.Hook) { + initCtx, cancel := context.WithTimeout(context.Background(), lps.BootstrapTimeout) + + env := environment.LoadEnv() + + log.SetLevel(testLogLevel) + log.SetOutput(os.Stdout) + for _, hook := range hooks { + log.AddHook(hook) + } + log.Debugf("Environment loaded: %+v", env) + + secrets := environment.LoadSecrets(initCtx, *env) + + log.Info("Initializing application...") + app := lps.NewApplication(initCtx, *env, *secrets) + log.Info("Application initialized successfully") + cancel() + log.Info("Starting application...") + referenceChannel <- app + app.Run(*env, testLogLevel) + app.ShutdownServices() +} diff --git a/test/integration/utils_test.go b/test/integration/utils_test.go new file mode 100644 index 00000000..e774c2d3 --- /dev/null +++ b/test/integration/utils_test.go @@ -0,0 +1,66 @@ +package integration_test + +import ( + "bytes" + "context" + "encoding/json" + log "github.com/sirupsen/logrus" + "io" + "net/http" +) + +type Execution struct { + Body any + Method string + URL string +} + +type Result[responseType any] struct { + Response responseType + RawResponse []byte + StatusCode int +} + +func execute[responseType any](execution Execution) (Result[responseType], error) { + payload, err := json.Marshal(execution.Body) + if err != nil { + return Result[responseType]{}, err + } + req, err := http.NewRequestWithContext(context.Background(), execution.Method, execution.URL, bytes.NewBuffer(payload)) + if err != nil { + return Result[responseType]{}, err + } + + req.Header.Set("Content-Type", "application/json") + client := http.Client{} + + res, err := client.Do(req) + if err != nil { + return Result[responseType]{}, err + } + defer func(res *http.Response) { + closingErr := res.Body.Close() + if closingErr != nil { + log.Debug("Error closing response body: ", closingErr) + } + }(res) + + bodyBytes, err := io.ReadAll(res.Body) + if err != nil { + return Result[responseType]{}, err + } + + var response responseType + if len(bodyBytes) > 0 { + if err = json.Unmarshal(bodyBytes, &response); err != nil { + return Result[responseType]{}, err + } + } + + result := Result[responseType]{ + Response: response, + StatusCode: res.StatusCode, + RawResponse: bodyBytes, + } + return result, nil +} From 7b957396bf06e9c19b7f1ddf50d8300a21b3a77d Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 5 Mar 2024 18:52:50 -0300 Subject: [PATCH 027/113] test: add integration test for overpayed pegin --- .../watcher/pegin_btc_deposit_watcher.go | 2 + test/integration/integration_suite_test.go | 2 +- test/integration/pegin_overpay_test.go | 72 ++++++ test/integration/pegin_test.go | 222 ++++++++++-------- test/integration/pegout_test.go | 28 ++- 5 files changed, 210 insertions(+), 116 deletions(-) create mode 100644 test/integration/pegin_overpay_test.go diff --git a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go index cbf85368..83a2d482 100644 --- a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go @@ -144,6 +144,8 @@ func (watcher *PeginDepositAddressWatcher) handleQuote(watchedQuote w.WatchedPeg if watchedQuote.RetainedQuote.State == quote.PeginStateWaitingForDeposit && watchedQuote.PeginQuote.IsExpired() { if err = watcher.expiredUseCase.Run(context.Background(), watchedQuote.RetainedQuote); err != nil { log.Errorf("Error updating expired quote (%s): %v\n", quoteHash, err) + } else { + delete(watcher.quotes, quoteHash) } } } diff --git a/test/integration/integration_suite_test.go b/test/integration/integration_suite_test.go index 2e6f0e68..5af44820 100644 --- a/test/integration/integration_suite_test.go +++ b/test/integration/integration_suite_test.go @@ -84,7 +84,7 @@ func (s *IntegrationTestSuite) SetupSuite() { if s.config.Lps.UseTestInstance { s.setupLps() - time.Sleep(1 * time.Second) + time.Sleep(3 * time.Second) } if s.config.Network == "regtest" { diff --git a/test/integration/pegin_overpay_test.go b/test/integration/pegin_overpay_test.go new file mode 100644 index 00000000..6033de56 --- /dev/null +++ b/test/integration/pegin_overpay_test.go @@ -0,0 +1,72 @@ +package integration_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/pkg" + "math/big" + "os" + "os/signal" + "syscall" +) + +func (s *IntegrationTestSuite) TestPegInOverPayFlow() { + var quote pkg.GetPeginQuoteResponse + var acceptedQuote pkg.AcceptPeginRespose + var extraAmount *big.Int + var value, callFee, gasFee *entities.Wei + URL := s.config.Lps.Url + + s.Run("Should be able to get pegin quote", func() { getPeginQuoteTest(s, URL, "e) }) + value = entities.NewUWei(quote.Quote.Value) + callFee = entities.NewUWei(quote.Quote.CallFee) + gasFee = entities.NewUWei(quote.Quote.GasFee) + s.Run("Should be able to accept pegin quote", func() { acceptPeginQuoteTest(s, URL, quote, &acceptedQuote) }) + s.Run("Should deposit 1.5 of the expected BTC and receive the requested amount in the callForUser", func() { + productFee := entities.NewUWei(quote.Quote.ProductFeeAmount) + totalFees := new(entities.Wei).Add(new(entities.Wei).Add(callFee, gasFee), productFee) + totalAmount := new(entities.Wei).Add(totalFees, value) + extraAmount = new(big.Int).Div(totalAmount.AsBigInt(), big.NewInt(2)) + callForUserTest(s, quote, acceptedQuote, new(entities.Wei).Add(totalAmount, entities.NewBigWei(extraAmount))) + }) + s.Run("Should call registerPegIn and pay the extra 0.5 to the user in RBTC", func() { + balanceIncreaseChannel := make(chan *bindings.LiquidityBridgeContractBalanceIncrease) + balanceIncreaseSubscription, err := s.lbc.WatchBalanceIncrease(nil, balanceIncreaseChannel) + s.Require().NoError(err, "Error listening for balance increase") + + refundChannel := make(chan *bindings.LiquidityBridgeContractRefund) + refundSubscription, err := s.lbc.WatchRefund(nil, refundChannel) + s.Require().NoError(err, "Error listening for refund") + + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + var registered, refunded bool + for !(registered && refunded) { + select { + case refund := <-refundChannel: + refundSubscription.Unsubscribe() + s.Require().Equal(extraAmount, refund.Amount, "User wasn't refunded with the correct amount") + s.Require().Equal(quote.Quote.RSKRefundAddr, refund.Dest.String(), "User wasn't refunded to the correct address") + refunded = true + case balanceIncreaseEvent := <-balanceIncreaseChannel: + balanceIncreaseSubscription.Unsubscribe() + refundedAmount := new(entities.Wei).Add(value, new(entities.Wei).Add(callFee, gasFee)) + s.Require().Equal(quote.Quote.LPRSKAddr, balanceIncreaseEvent.Dest.String()) + s.Require().Equal(refundedAmount.AsBigInt().Int64(), balanceIncreaseEvent.Amount.Int64()) + registered = true + case err = <-balanceIncreaseSubscription.Err(): + if err != nil { + s.FailNow("Error listening for registerPegIn", err) + } + case err = <-refundSubscription.Err(): + if err != nil { + s.FailNow("Error listening for refund", err) + } + case <-done: + balanceIncreaseSubscription.Unsubscribe() + refundSubscription.Unsubscribe() + s.FailNow("Test cancelled") + } + } + }) +} diff --git a/test/integration/pegin_test.go b/test/integration/pegin_test.go index 76bf327f..7cab1651 100644 --- a/test/integration/pegin_test.go +++ b/test/integration/pegin_test.go @@ -14,126 +14,27 @@ import ( "syscall" ) -// nolint:funlen func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { var quote pkg.GetPeginQuoteResponse var acceptedQuote pkg.AcceptPeginRespose URL := s.config.Lps.Url s.Run("Should be able to get pegin quote", func() { - body := pkg.PeginQuoteRequest{ - CallEoaOrContractAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", - CallContractArguments: "", - ValueToTransfer: 600000000000000000, - RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", - BitcoinRefundAddress: "n1zjV3WxJgA4dBfS5aMiEHtZsjTUvAL7p7", - } - - result, err := execute[[]pkg.GetPeginQuoteResponse](Execution{ - Method: http.MethodPost, - URL: URL + "/pegin/getQuote", - Body: body, - }) - s.NoError(err) - - expectedFields := []string{ - "gasFee", - "callOnRegister", - "callFee", - "value", - "gasLimit", - "confirmations", - "btcRefundAddr", - "data", - "lpRSKAddr", - "fedBTCAddr", - "lpBTCAddr", - "contractAddr", - "penaltyFee", - "rskRefundAddr", - "nonce", - "timeForDeposit", - "lpCallTime", - "agreementTimestamp", - "lbcAddr", - } - - var rawResponse []map[string]any - err = json.Unmarshal(result.RawResponse, &rawResponse) - s.NoError(err) - s.Equal(http.StatusOK, result.StatusCode) - s.NotEmpty(rawResponse[0]["quoteHash"]) - s.NotEmpty(rawResponse[0]["quote"]) - quoteFields, ok := rawResponse[0]["quote"].(map[string]any) - if !ok { - s.FailNow("Quote is not an object") - } - s.AssertFields(expectedFields, quoteFields) - quote = result.Response[0] + getPeginQuoteTest(s, URL, "e) }) s.Run("Should be able to accept pegin quote", func() { - body := pkg.AcceptQuoteRequest{QuoteHash: quote.QuoteHash} - result, err := execute[pkg.AcceptPeginRespose](Execution{ - Method: http.MethodPost, - URL: URL + "/pegin/acceptQuote", - Body: body, - }) - s.NoError(err) - - expectedFields := []string{"signature", "bitcoinDepositAddressHash"} - - s.Require().Equal(http.StatusOK, result.StatusCode) - var rawResponse map[string]any - err = json.Unmarshal(result.RawResponse, &rawResponse) - s.NoError(err) - s.AssertFields(expectedFields, rawResponse) - acceptedQuote = result.Response + acceptPeginQuoteTest(s, URL, quote, &acceptedQuote) }) s.Run("Should process bitcoin deposit and callForUser", func() { - address, err := btcutil.DecodeAddress(acceptedQuote.BitcoinDepositAddressHash, &s.btcParams) - s.NoError(err) value := entities.NewUWei(quote.Quote.Value) callFee := entities.NewUWei(quote.Quote.CallFee) gasFee := entities.NewUWei(quote.Quote.GasFee) productFee := entities.NewUWei(quote.Quote.ProductFeeAmount) totalFees := new(entities.Wei).Add(new(entities.Wei).Add(callFee, gasFee), productFee) totalAmount := new(entities.Wei).Add(totalFees, value) - floatAmount, _ := totalAmount.ToRbtc().Float64() - btcAmount, err := btcutil.NewAmount(floatAmount) - s.NoError(err) - amount, _ := btcutil.NewAmount(0.00025) - err = s.btc.WalletPassphrase(s.config.Btc.WalletPassword, 60) - s.Require().NoError(err) - err = s.btc.SetTxFee(amount) - s.Require().NoError(err) - _, err = s.btc.SendToAddress(address, btcAmount) - s.Require().NoError(err) - - eventChannel := make(chan *bindings.LiquidityBridgeContractCallForUser) - lpAddress := common.HexToAddress(quote.Quote.LPRSKAddr) - toAddress := common.HexToAddress(quote.Quote.ContractAddr) - subscription, err := s.lbc.WatchCallForUser( - nil, - eventChannel, - []common.Address{lpAddress}, - []common.Address{toAddress}, - ) - s.NoError(err) - - done := make(chan os.Signal, 1) - signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) - select { - case callForUser := <-eventChannel: - subscription.Unsubscribe() - s.True(callForUser.Success, "Call for user failed") - case err = <-subscription.Err(): - s.FailNow("Error listening for callForUser", err) - case <-done: - subscription.Unsubscribe() - s.FailNow("Test cancelled") - } + callForUserTest(s, quote, acceptedQuote, totalAmount) }) s.Run("Should call registerPegIn after proper confirmations", func() { @@ -157,10 +58,125 @@ func (s *IntegrationTestSuite) TestSuccessfulPegInFlow() { subscription.Unsubscribe() s.Positive(registerPegIn.TransferredAmount.Int64(), "Register PegIn failed") case err = <-subscription.Err(): - s.FailNow("Error listening for registerPegIn", err) + if err != nil { + s.FailNow("Error listening for registerPegIn", err) + } case <-done: subscription.Unsubscribe() s.FailNow("Test cancelled") } }) } + +func getPeginQuoteTest(s *IntegrationTestSuite, url string, quoteResponse *pkg.GetPeginQuoteResponse) { + body := pkg.PeginQuoteRequest{ + CallEoaOrContractAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + CallContractArguments: "", + ValueToTransfer: 600000000000000000, + RskRefundAddress: "0x79568c2989232dCa1840087D73d403602364c0D4", + BitcoinRefundAddress: "n1zjV3WxJgA4dBfS5aMiEHtZsjTUvAL7p7", + } + + result, err := execute[[]pkg.GetPeginQuoteResponse](Execution{ + Method: http.MethodPost, + URL: url + "/pegin/getQuote", + Body: body, + }) + s.NoError(err) + + expectedFields := []string{ + "gasFee", + "callOnRegister", + "callFee", + "value", + "gasLimit", + "confirmations", + "btcRefundAddr", + "data", + "lpRSKAddr", + "fedBTCAddr", + "lpBTCAddr", + "contractAddr", + "penaltyFee", + "rskRefundAddr", + "nonce", + "timeForDeposit", + "lpCallTime", + "agreementTimestamp", + "lbcAddr", + } + + var rawResponse []map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + s.NoError(err) + s.Equal(http.StatusOK, result.StatusCode) + s.NotEmpty(rawResponse[0]["quoteHash"]) + s.NotEmpty(rawResponse[0]["quote"]) + quoteFields, ok := rawResponse[0]["quote"].(map[string]any) + if !ok { + s.FailNow("Quote is not an object") + } + s.AssertFields(expectedFields, quoteFields) + *quoteResponse = result.Response[0] +} + +func acceptPeginQuoteTest(s *IntegrationTestSuite, url string, quote pkg.GetPeginQuoteResponse, acceptedQuote *pkg.AcceptPeginRespose) { + body := pkg.AcceptQuoteRequest{QuoteHash: quote.QuoteHash} + result, err := execute[pkg.AcceptPeginRespose](Execution{ + Method: http.MethodPost, + URL: url + "/pegin/acceptQuote", + Body: body, + }) + s.NoError(err) + + expectedFields := []string{"signature", "bitcoinDepositAddressHash"} + + s.Require().Equal(http.StatusOK, result.StatusCode) + var rawResponse map[string]any + err = json.Unmarshal(result.RawResponse, &rawResponse) + s.NoError(err) + s.AssertFields(expectedFields, rawResponse) + *acceptedQuote = result.Response +} + +func callForUserTest(s *IntegrationTestSuite, quote pkg.GetPeginQuoteResponse, acceptedQuote pkg.AcceptPeginRespose, amountToPay *entities.Wei) { + address, err := btcutil.DecodeAddress(acceptedQuote.BitcoinDepositAddressHash, &s.btcParams) + s.NoError(err) + floatAmount, _ := amountToPay.ToRbtc().Float64() + btcAmount, err := btcutil.NewAmount(floatAmount) + s.NoError(err) + amount, _ := btcutil.NewAmount(0.00025) + err = s.btc.WalletPassphrase(s.config.Btc.WalletPassword, 60) + s.Require().NoError(err) + err = s.btc.SetTxFee(amount) + s.Require().NoError(err) + _, err = s.btc.SendToAddress(address, btcAmount) + s.Require().NoError(err) + + eventChannel := make(chan *bindings.LiquidityBridgeContractCallForUser) + lpAddress := common.HexToAddress(quote.Quote.LPRSKAddr) + toAddress := common.HexToAddress(quote.Quote.ContractAddr) + subscription, err := s.lbc.WatchCallForUser( + nil, + eventChannel, + []common.Address{lpAddress}, + []common.Address{toAddress}, + ) + s.NoError(err) + + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + select { + case callForUser := <-eventChannel: + subscription.Unsubscribe() + s.Require().Equal(quote.Quote.Value, callForUser.Value.Uint64(), "Call for user value does not match") + s.Require().True(callForUser.Success, "Call for user failed") + case err = <-subscription.Err(): + if err != nil { + s.FailNow("Error listening for callForUser", err) + } + case <-done: + subscription.Unsubscribe() + s.FailNow("Test cancelled") + } +} diff --git a/test/integration/pegout_test.go b/test/integration/pegout_test.go index 62212b8f..8f0e0df5 100644 --- a/test/integration/pegout_test.go +++ b/test/integration/pegout_test.go @@ -173,7 +173,9 @@ func (s *IntegrationTestSuite) TestSuccessfulPegOutFlow() { subscription.Unsubscribe() s.NotNil(refund, "refundPegOut failed") case err = <-subscription.Err(): - s.FailNow("Error listening for refundPegOut", err) + if err != nil { + s.FailNow("Error listening for refundPegOut", err) + } case <-done: subscription.Unsubscribe() s.FailNow("Test cancelled") @@ -236,19 +238,21 @@ func waitForBtcTransactionToAddress(s *IntegrationTestSuite, address btcutil.Add var txHash string for txHash == "" { txHash = lookForTxToAddress(block, address, &s.btcParams) - if txHash == "" { - hash, getBlockError := s.btc.GetBlockHash(int64(latestBlockNumber + 1)) - if getBlockError != nil && !strings.Contains(getBlockError.Error(), "Block height out of range") { - s.FailNow(getBlockError.Error()) - } else if getBlockError == nil { - latestBlockHash = hash - latestBlockNumber++ - if block, err = s.btc.GetBlock(latestBlockHash); err != nil { - s.FailNow(err.Error()) - } + if txHash != "" { + return txHash + } + hash, getBlockError := s.btc.GetBlockHash(int64(latestBlockNumber + 1)) + if getBlockError != nil && !strings.Contains(getBlockError.Error(), "Block height out of range") { + s.FailNow(getBlockError.Error()) + } else if getBlockError != nil && strings.Contains(getBlockError.Error(), "Block height out of range") { + time.Sleep(10 * time.Second) + } else if getBlockError == nil { + latestBlockHash = hash + latestBlockNumber++ + if block, err = s.btc.GetBlock(latestBlockHash); err != nil { + s.FailNow(err.Error()) } } - time.Sleep(10 * time.Second) } return txHash } From 38085967114318365f87752bdb9ab07f4ef07816 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 6 Mar 2024 18:25:15 -0300 Subject: [PATCH 028/113] test: add mockery and alerting test --- .mockery.yaml | 9 ++ Makefile | 3 + internal/adapters/alerting/ses.go | 8 +- internal/adapters/alerting/ses_test.go | 46 ++++++++++ test/mocks/ses_client_mock.go | 111 +++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 .mockery.yaml create mode 100644 internal/adapters/alerting/ses_test.go create mode 100644 test/mocks/ses_client_mock.go diff --git a/.mockery.yaml b/.mockery.yaml new file mode 100644 index 00000000..0ce8e991 --- /dev/null +++ b/.mockery.yaml @@ -0,0 +1,9 @@ +with-expecter: true +dir: test/mocks +filename: "{{ .InterfaceName | snakecase }}_mock.go" +mockname: "{{ .InterfaceName | firstUpper }}Mock" +outpkg: mocks +packages: + github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting: + interfaces: + sesClient: \ No newline at end of file diff --git a/Makefile b/Makefile index 23b59290..b097583f 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,9 @@ tools: download go install github.com/conventionalcommit/commitlint@latest go env GOPATH curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.55.2 + # installation with brew is because mockery team doesnt recommend to install with go install, + # if you don't have brew feel free to comment this line and install mockery with other method + brew install mockery && brew upgrade mockery download: go mod download diff --git a/internal/adapters/alerting/ses.go b/internal/adapters/alerting/ses.go index 6af0d4db..156585c2 100644 --- a/internal/adapters/alerting/ses.go +++ b/internal/adapters/alerting/ses.go @@ -8,12 +8,16 @@ import ( log "github.com/sirupsen/logrus" ) +type sesClient interface { + SendEmail(ctx context.Context, params *ses.SendEmailInput, optFns ...func(*ses.Options)) (*ses.SendEmailOutput, error) +} + type SesAlertSender struct { - sesClient *ses.Client + sesClient sesClient from string } -func NewSesAlertSender(sesClient *ses.Client, from string) entities.AlertSender { +func NewSesAlertSender(sesClient sesClient, from string) entities.AlertSender { return &SesAlertSender{sesClient: sesClient, from: from} } diff --git a/internal/adapters/alerting/ses_test.go b/internal/adapters/alerting/ses_test.go new file mode 100644 index 00000000..95282869 --- /dev/null +++ b/internal/adapters/alerting/ses_test.go @@ -0,0 +1,46 @@ +package alerting_test + +import ( + "context" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/ses" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +const ( + fromAddress = "from@email" + toAddress = "to@email" + subject = "any subject" + body = "any body" +) + +func TestSesAlertSender_SendAlert(t *testing.T) { + client := &mocks.SesClientMock{} + client.On("SendEmail", test.AnyCtx, mock.MatchedBy(func(input *ses.SendEmailInput) bool { + return assert.Equal(t, []string{toAddress}, input.Destination.ToAddresses) && + assert.Equal(t, body, *input.Message.Body.Text.Data) && + assert.Equal(t, subject, *input.Message.Subject.Data) && + assert.Equal(t, fromAddress, *input.Source) + })).Return(&ses.SendEmailOutput{MessageId: aws.String("msgId")}, nil) + + sender := alerting.NewSesAlertSender(client, fromAddress) + err := sender.SendAlert(context.Background(), subject, body, []string{toAddress}) + require.NoError(t, err) + client.AssertExpectations(t) +} + +func TestSesAlertSender_SendAlert_ErrorHandling(t *testing.T) { + client := &mocks.SesClientMock{} + + client.On("SendEmail", test.AnyCtx, mock.Anything).Return(nil, assert.AnError) + sender := alerting.NewSesAlertSender(client, fromAddress) + err := sender.SendAlert(context.Background(), subject, body, []string{toAddress}) + require.Error(t, err) + client.AssertExpectations(t) +} diff --git a/test/mocks/ses_client_mock.go b/test/mocks/ses_client_mock.go new file mode 100644 index 00000000..1e7a93f2 --- /dev/null +++ b/test/mocks/ses_client_mock.go @@ -0,0 +1,111 @@ +// Code generated by mockery v2.42.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + ses "github.com/aws/aws-sdk-go-v2/service/ses" + mock "github.com/stretchr/testify/mock" +) + +// SesClientMock is an autogenerated mock type for the sesClient type +type SesClientMock struct { + mock.Mock +} + +type SesClientMock_Expecter struct { + mock *mock.Mock +} + +func (_m *SesClientMock) EXPECT() *SesClientMock_Expecter { + return &SesClientMock_Expecter{mock: &_m.Mock} +} + +// SendEmail provides a mock function with given fields: ctx, params, optFns +func (_m *SesClientMock) SendEmail(ctx context.Context, params *ses.SendEmailInput, optFns ...func(*ses.Options)) (*ses.SendEmailOutput, error) { + _va := make([]interface{}, len(optFns)) + for _i := range optFns { + _va[_i] = optFns[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, params) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for SendEmail") + } + + var r0 *ses.SendEmailOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *ses.SendEmailInput, ...func(*ses.Options)) (*ses.SendEmailOutput, error)); ok { + return rf(ctx, params, optFns...) + } + if rf, ok := ret.Get(0).(func(context.Context, *ses.SendEmailInput, ...func(*ses.Options)) *ses.SendEmailOutput); ok { + r0 = rf(ctx, params, optFns...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*ses.SendEmailOutput) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *ses.SendEmailInput, ...func(*ses.Options)) error); ok { + r1 = rf(ctx, params, optFns...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SesClientMock_SendEmail_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendEmail' +type SesClientMock_SendEmail_Call struct { + *mock.Call +} + +// SendEmail is a helper method to define mock.On call +// - ctx context.Context +// - params *ses.SendEmailInput +// - optFns ...func(*ses.Options) +func (_e *SesClientMock_Expecter) SendEmail(ctx interface{}, params interface{}, optFns ...interface{}) *SesClientMock_SendEmail_Call { + return &SesClientMock_SendEmail_Call{Call: _e.mock.On("SendEmail", + append([]interface{}{ctx, params}, optFns...)...)} +} + +func (_c *SesClientMock_SendEmail_Call) Run(run func(ctx context.Context, params *ses.SendEmailInput, optFns ...func(*ses.Options))) *SesClientMock_SendEmail_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]func(*ses.Options), len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(func(*ses.Options)) + } + } + run(args[0].(context.Context), args[1].(*ses.SendEmailInput), variadicArgs...) + }) + return _c +} + +func (_c *SesClientMock_SendEmail_Call) Return(_a0 *ses.SendEmailOutput, _a1 error) *SesClientMock_SendEmail_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SesClientMock_SendEmail_Call) RunAndReturn(run func(context.Context, *ses.SendEmailInput, ...func(*ses.Options)) (*ses.SendEmailOutput, error)) *SesClientMock_SendEmail_Call { + _c.Call.Return(run) + return _c +} + +// NewSesClientMock creates a new instance of SesClientMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSesClientMock(t interface { + mock.TestingT + Cleanup(func()) +}) *SesClientMock { + mock := &SesClientMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From b940ddf3dc25198907d6db40932a51ead29b17df Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 7 Mar 2024 17:54:31 -0300 Subject: [PATCH 029/113] chore: stop ignoring coverage dir --- .gitignore | 1 - Makefile | 4 + coverage/cover.out | 1854 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1858 insertions(+), 1 deletion(-) create mode 100644 coverage/cover.out diff --git a/.gitignore b/.gitignore index 2775adad..f2120f0c 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,3 @@ integration/geth_keystore keystore/ build/ /**/.env.regtest -coverage/ diff --git a/Makefile b/Makefile index 23b59290..f6c7f6d2 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,10 @@ coverage: clean go tool cover -html="coverage/cover.out" rm coverage/cover.out +coverage-report: clean + mkdir coverage + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... + test: clean mkdir coverage go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... diff --git a/coverage/cover.out b/coverage/cover.out new file mode 100644 index 00000000..755eb858 --- /dev/null +++ b/coverage/cover.out @@ -0,0 +1,1854 @@ +mode: atomic +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:29.90,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.76,50.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.8,52.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.36,54.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.2,55.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.17,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:58.2,59.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.86,63.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:63.48,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:66.2,66.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:69.54,71.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:71.44,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:74.2,74.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:77.110,84.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:84.75,86.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:86.31,89.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:89.9,93.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:94.3,98.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.2,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:107.95,113.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.22,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.2,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.2,127.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.31,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:135.2,136.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,140.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.29,141.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.18,143.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:146.2,146.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:146.69,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.17,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.117,159.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:159.16,161.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.2,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.2,168.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.16,170.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.2,173.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.2,181.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:184.92,186.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:186.16,188.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.2,190.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.16,192.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.2,194.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.2,198.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:31.28,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:40.108,42.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:46.2,60.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:60.16,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.2,63.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.67,69.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:73.2,73.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:73.29,74.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.21,76.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.2,78.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:81.125,83.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.2,92.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:100.2,109.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.24,110.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:110.40,112.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:115.2,117.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:120.2,121.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:124.2,125.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:125.16,127.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:128.2,128.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:131.46,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,136.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.91,139.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.67,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:151.115,156.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:156.16,158.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:159.2,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:164.2,165.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:165.29,167.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:167.10,174.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:175.3,175.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:175.39,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.3,178.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.2,181.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.30,184.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:185.2,185.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:188.46,190.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 100 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 100 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 18 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 29 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 90 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 67 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:34.23,45.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:47.108,53.84 5 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:53.84,55.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:55.8,55.30 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:55.30,58.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:60.2,60.28 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:60.28,63.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:65.2,68.95 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:68.95,70.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:70.8,70.33 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:70.33,75.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:77.2,77.93 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:77.93,79.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.2,81.62 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.62,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:84.2,84.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:84.88,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:88.2,97.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:100.153,106.100 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.100,109.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.8,109.101 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.101,112.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:112.8,112.99 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:112.99,115.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.2,117.69 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.69,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:120.2,126.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:129.136,138.59 5 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:138.59,140.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:141.2,144.81 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:144.81,147.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:148.2,148.31 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:151.159,158.67 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.67,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.2,161.99 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.99,163.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.2,164.95 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.95,166.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:167.2,167.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:167.71,169.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:171.2,177.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:15.133,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:19.87,22.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:25.2,26.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:29.2,31.35 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:31.35,33.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:34.2,35.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:35.16,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:38.2,38.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:34.23,44.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:46.125,51.62 4 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:51.62,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:55.2,55.98 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:55.98,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:57.8,57.30 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:57.30,59.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:61.2,61.28 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:61.28,63.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:65.2,65.92 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:65.92,67.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.2,72.98 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:72.98,74.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:76.2,78.104 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.104,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:81.2,81.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:81.16,84.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:85.2,85.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:94.9,96.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:96.18,98.88 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:98.88,100.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:101.3,106.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:109.2,109.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:116.26,120.99 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:120.99,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.2,125.47 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:125.47,127.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:127.8,129.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:131.2,131.103 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:131.103,133.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.8,133.48 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.48,135.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:136.2,136.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:144.37,150.83 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:150.83,152.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:152.8,154.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:156.2,165.27 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:173.9,178.73 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:178.73,180.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:181.2,182.74 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:182.74,184.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:186.2,187.44 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:187.44,196.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:197.2,197.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:13.104,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:17.110,20.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:20.16,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:23.2,23.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:15.144,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:19.67,21.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:21.16,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:24.2,24.24 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:36.20,48.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:64.16,72.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:79.109,88.87 8 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:88.87,90.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:92.2,93.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.16,95.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.2,97.59 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.59,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.2,101.75 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.75,103.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:105.2,105.66 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:105.66,107.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:109.2,117.138 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.138,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:121.2,121.115 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:121.115,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:125.2,125.68 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:125.68,127.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:128.2,128.87 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:128.87,130.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:131.2,131.69 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:134.152,137.81 3 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.81,140.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.2,141.56 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.56,144.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:145.2,145.64 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:145.64,148.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:149.2,149.77 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:149.77,151.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:152.2,152.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:162.29,166.54 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:166.54,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:170.2,193.59 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:193.59,195.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:196.2,196.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.121,204.81 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:204.81,206.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:207.2,207.156 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:207.156,209.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:210.2,210.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:30.25,39.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:41.109,48.65 6 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:48.65,50.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:52.2,52.98 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:52.98,54.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:54.8,54.30 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:54.30,56.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:58.2,58.71 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:58.71,60.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:62.2,62.92 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:62.92,64.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:66.2,68.116 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:68.116,70.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:70.8,70.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:70.23,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:72.8,74.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:76.2,84.104 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.104,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:87.2,87.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:87.16,90.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:91.2,91.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:94.152,99.18 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:99.18,101.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:101.88,103.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:104.3,108.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:110.2,110.21 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:113.172,118.81 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:118.81,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:122.2,122.92 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:122.92,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:126.2,126.90 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:126.90,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:130.2,130.95 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:130.95,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:134.2,140.8 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:143.125,146.91 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:146.91,148.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.8,148.79 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.79,150.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:151.2,151.12 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:13.102,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:17.55,19.104 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:19.104,21.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 128 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 321 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 112 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.137,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:18.63,23.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:23.16,25.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.68 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.68,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:30.2,30.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:37.26,45.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:47.70,49.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:49.16,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:53.2,54.47 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:54.47,60.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:60.17,62.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.8,63.23 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.23,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:67.2,68.47 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:68.47,74.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:74.17,76.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.8,77.23 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.23,79.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:81.2,81.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:14.19,18.53 3 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:18.53,20.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:22.2,25.65 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:25.65,27.4 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:29.2,29.12 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:29.12,31.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:32.2,32.33 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.90,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.61 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.61,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.147,20.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.2,28.31 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.31,30.109 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:30.109,32.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:34.2,34.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:25.21,33.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:41.90,62.54 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:62.54,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.8,64.68 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.68,66.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.8,66.69 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.69,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:70.2,70.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.137,18.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:36.102,43.54 6 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:43.54,45.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.2,47.63 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.63,49.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.2,50.65 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.65,52.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.2,54.61 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.61,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:58.2,60.54 3 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:60.54,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.8,62.23 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.23,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:66.2,68.54 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:68.54,70.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.8,70.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.23,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:74.2,75.53 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:78.149,82.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.77 3 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.77,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.97 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.97,93.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.104 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.104,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:97.2,101.8 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.106 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.106,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.108 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.108,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:115.2,118.8 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:121.139,125.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.75 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.75,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:132.8,134.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:137.104,139.55 2 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:139.55,141.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.8,141.35 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.35,143.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:144.2,144.12 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:151.17,153.130 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:153.130,155.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.128 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.128,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:160.8,162.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:169.17,171.133 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:171.133,173.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.135 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.135,178.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:178.8,180.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.125,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:18.43,22.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.52 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.52,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:29.2,29.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:20.26,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:24.116,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:20.27,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:24.118,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 230 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 30 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 52 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 926 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 300 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 76 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 39 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 29 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:29.23,38.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:40.108,48.85 7 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:48.85,50.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.8,50.31 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.31,53.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.2,55.29 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.29,58.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:60.2,63.95 3 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:63.95,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.8,65.33 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.33,70.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.2,72.96 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.96,74.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.2,76.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.71,78.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:80.2,88.77 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:88.77,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:92.2,95.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:98.138,104.83 5 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:104.83,107.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:108.2,108.31 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:115.9,117.62 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:117.62,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.2,120.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.88,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:124.2,129.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.133,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:19.87,22.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:25.2,26.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:29.2,31.35 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:31.35,33.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:34.2,35.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:35.16,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:38.2,38.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:13.108,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:17.113,20.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:20.16,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:23.2,23.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.145,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:38.20,51.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:65.16,72.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:79.110,89.82 9 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:89.82,91.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:93.2,94.72 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:94.72,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.8,96.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.23,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,100.75 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.75,102.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:104.2,104.59 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:104.59,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:108.2,115.96 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.96,117.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.117 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.117,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:123.2,123.68 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:123.68,125.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:127.2,127.72 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:130.153,133.63 3 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.63,136.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.81 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.81,140.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:141.2,141.56 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:141.56,144.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:145.2,145.77 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:145.77,147.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.2,148.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:156.30,161.54 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.54,163.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:165.2,165.63 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:165.63,167.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:169.2,195.60 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:195.60,197.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:198.2,198.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:201.121,205.81 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:205.81,207.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:208.2,208.156 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:208.156,210.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:211.2,211.26 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:214.114,217.70 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:217.70,219.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:221.2,221.89 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:221.89,223.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:224.2,224.18 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:23.2,23.22 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.194,18.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.61 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.61,26.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.93 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.93,30.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.2,32.84 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.84,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:35.2,35.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:42.24,52.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:54.109,59.65 4 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:59.65,61.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:63.2,63.99 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:63.99,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:65.8,65.31 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:65.31,67.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:69.2,69.88 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:69.88,71.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,73.83 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.83,75.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:76.2,81.104 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:81.104,83.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.97 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.97,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.2,88.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:91.152,93.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:93.18,95.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.88,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:98.3,102.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.2,104.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:107.162,114.94 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:114.94,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:118.2,118.93 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:118.93,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:122.2,122.87 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:122.87,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,126.81 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.81,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:129.2,137.8 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:140.182,149.16 8 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:149.16,151.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:153.2,154.103 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.103,156.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:157.2,157.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:165.38,170.124 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:170.124,172.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:172.8,172.23 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:172.23,174.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:174.8,176.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:178.2,186.103 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.103,188.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:189.2,189.27 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.9,199.89 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:199.89,201.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.8,201.77 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.77,203.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:204.2,204.12 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:28.22,36.2 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:38.107,43.73 4 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:43.73,45.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.2,47.99 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.99,49.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.8,49.31 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.31,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.2,53.87 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.87,55.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:57.2,60.80 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:60.80,62.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:64.2,67.76 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:67.76,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.2,71.104 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.104,73.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.2,74.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.16,76.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:77.2,77.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:86.9,88.18 2 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:88.18,90.88 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:90.88,92.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:93.3,98.5 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:100.2,100.21 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:107.42,112.29 4 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:112.29,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.2,116.63 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.63,118.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.2,120.100 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.100,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:122.8,122.87 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:122.87,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.8,124.55 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.55,127.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:128.2,128.21 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:136.38,142.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:142.16,145.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:147.2,147.129 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:147.129,149.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:149.8,151.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:153.2,161.27 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:168.9,173.63 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:173.63,175.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:176.2,178.38 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:178.38,180.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:181.2,181.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:184.125,185.76 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:185.76,187.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:187.8,187.46 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:187.46,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:190.2,190.12 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.102,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:17.55,19.104 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:19.104,21.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 From 7e6a874c130b5db4fe675cc873697bfb8022f19c Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 8 Mar 2024 12:50:52 -0300 Subject: [PATCH 030/113] fix: fix code related sonar issues --- cmd/application/lps/application.go | 16 ++-- .../adapters/dataproviders/bitcoin/wallet.go | 7 ++ internal/adapters/dataproviders/event.go | 17 +++- .../dataproviders/liquidity_provider.go | 21 ++--- .../entrypoints/rest/middlewares/captcha.go | 21 +++-- .../watcher/pegin_bridge_watcher.go | 18 ++-- .../watcher/pegin_btc_deposit_watcher.go | 16 ++-- .../entrypoints/watcher/pegout_btc_watcher.go | 10 +-- .../entrypoints/watcher/pegout_rsk_watcher.go | 50 +++++++---- .../entrypoints/watcher/penalization_alert.go | 10 +-- .../environment/configuration.go | 17 ---- .../configuration/environment/environment.go | 2 +- internal/configuration/registry/bitcoin.go | 8 +- .../registry/liquidity_provider.go | 7 +- internal/configuration/registry/messaging.go | 32 +++++++ internal/configuration/registry/rootstock.go | 36 ++++---- internal/configuration/registry/usecase.go | 85 ++++++++----------- internal/configuration/registry/watcher.go | 37 ++++---- internal/entities/blockchain/bitcoin.go | 1 + internal/entities/blockchain/common.go | 6 ++ internal/entities/blockchain/rootstock.go | 6 ++ .../liquidity_provider/change_status.go | 12 +-- .../liquidity_provider/change_status_test.go | 9 +- .../liquidity_provider/check_liquidity.go | 8 +- .../check_liquidity_test.go | 16 ++-- .../liquidity_provider/get_providers.go | 8 +- .../liquidity_provider/get_providers_test.go | 7 +- .../liquidity_provider/penalization_alert.go | 8 +- .../penalization_alert_test.go | 7 +- .../liquidity_provider/registration.go | 24 +++--- .../liquidity_provider/registration_test.go | 21 +++-- .../usecases/liquidity_provider/resign.go | 12 +-- .../liquidity_provider/resign_test.go | 10 ++- internal/usecases/pegin/accept_pegin_quote.go | 25 +++--- .../usecases/pegin/accept_pegin_quote_test.go | 72 ++++++++-------- internal/usecases/pegin/add_collateral.go | 14 +-- .../usecases/pegin/add_collateral_test.go | 10 ++- internal/usecases/pegin/call_for_user.go | 23 +++-- internal/usecases/pegin/call_for_user_test.go | 49 ++++++----- internal/usecases/pegin/get_collateral.go | 8 +- .../usecases/pegin/get_collateral_test.go | 7 +- internal/usecases/pegin/get_pegin_quote.go | 39 ++++----- .../usecases/pegin/get_pegin_quote_test.go | 33 ++++--- internal/usecases/pegin/register_pegin.go | 27 +++--- .../usecases/pegin/register_pegin_test.go | 26 ++++-- .../usecases/pegin/withdraw_collateral.go | 8 +- .../pegin/withdraw_collateral_test.go | 7 +- .../usecases/pegout/accept_pegout_quote.go | 8 +- .../pegout/accept_pegout_quote_test.go | 22 +++-- internal/usecases/pegout/add_collateral.go | 14 +-- .../usecases/pegout/add_collateral_test.go | 10 ++- internal/usecases/pegout/get_collateral.go | 8 +- .../usecases/pegout/get_collateral_test.go | 7 +- internal/usecases/pegout/get_pegout_quote.go | 39 ++++----- .../usecases/pegout/get_pegout_quote_test.go | 12 ++- .../usecases/pegout/init_deposit_cache.go | 12 +-- .../pegout/init_deposits_cache_test.go | 15 ++-- internal/usecases/pegout/refund_pegout.go | 27 +++--- .../usecases/pegout/refund_pegout_test.go | 49 ++++++----- internal/usecases/pegout/send_pegout.go | 10 +-- internal/usecases/pegout/send_pegout_test.go | 36 ++++---- .../usecases/pegout/withdraw_collateral.go | 8 +- .../pegout/withdraw_collateral_test.go | 7 +- 63 files changed, 660 insertions(+), 537 deletions(-) delete mode 100644 internal/configuration/environment/configuration.go create mode 100644 internal/configuration/registry/messaging.go create mode 100644 internal/entities/blockchain/common.go diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 1d9638b4..2f1ec375 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -30,7 +30,7 @@ type Application struct { rskRegistry *registry.Rootstock btcRegistry *registry.Bitcoin dbRegistry *registry.Database - eventBus entities.EventBus + messagingRegistry *registry.Messaging runningServices []entities.Closeable doneChannel chan os.Signal } @@ -68,14 +68,12 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret } log.Debug("Connected to RSK node") - config := environment.ConfigurationFromEnv(env) - liquidityProvider := registry.NewLiquidityProvider(config, dbRegistry, rootstockRegistry, btcRegistry) - alertSender := registry.NewAlertSender(initCtx, env) - eventBus := registry.NewEventBus() + messagingRegistry := registry.NewMessagingRegistry(initCtx, env, rskClient, btcConnection) + liquidityProvider := registry.NewLiquidityProvider(dbRegistry, rootstockRegistry, btcRegistry, messagingRegistry) mutexes := environment.NewApplicationMutexes() - useCaseRegistry := registry.NewUseCaseRegistry(env, rootstockRegistry, btcRegistry, dbRegistry, liquidityProvider, eventBus, alertSender, mutexes) - watcherRegistry := registry.NewWatcherRegistry(env, useCaseRegistry, rootstockRegistry, btcRegistry, liquidityProvider, eventBus) + useCaseRegistry := registry.NewUseCaseRegistry(env, rootstockRegistry, btcRegistry, dbRegistry, liquidityProvider, messagingRegistry, mutexes) + watcherRegistry := registry.NewWatcherRegistry(env, useCaseRegistry, rootstockRegistry, btcRegistry, liquidityProvider, messagingRegistry) return &Application{ env: env, @@ -85,7 +83,7 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret rskRegistry: rootstockRegistry, btcRegistry: btcRegistry, dbRegistry: dbRegistry, - eventBus: eventBus, + messagingRegistry: messagingRegistry, watcherRegistry: watcherRegistry, runningServices: make([]entities.Closeable, 0), } @@ -95,7 +93,7 @@ func (app *Application) Run(env environment.Environment, logLevel log.Level) { app.addRunningService(app.dbRegistry.Connection) app.addRunningService(app.rskRegistry.Client) app.addRunningService(app.btcRegistry.Connection) - app.addRunningService(app.eventBus) + app.addRunningService(app.messagingRegistry.EventBus) registerParams := blockchain.NewProviderRegistrationParams(app.env.Provider.Name, app.env.Provider.ApiBaseUrl, true, app.env.Provider.ProviderType) id, err := app.useCaseRegistry.GetRegistrationUseCase().Run(registerParams) diff --git a/internal/adapters/dataproviders/bitcoin/wallet.go b/internal/adapters/dataproviders/bitcoin/wallet.go index d09639c9..7e12feac 100644 --- a/internal/adapters/dataproviders/bitcoin/wallet.go +++ b/internal/adapters/dataproviders/bitcoin/wallet.go @@ -18,6 +18,7 @@ const ( type bitcoindWallet struct { conn *Connection + address string fixedTxFeeRate float64 isEncrypted bool password string @@ -25,12 +26,14 @@ type bitcoindWallet struct { func NewBitcoindWallet( conn *Connection, + address string, fixedTxFeeRate float64, isEncrypted bool, password string, ) blockchain.BitcoinWallet { return &bitcoindWallet{ conn: conn, + address: address, fixedTxFeeRate: fixedTxFeeRate, isEncrypted: isEncrypted, password: password, @@ -188,3 +191,7 @@ func (wallet *bitcoindWallet) GetTransactions(address string) ([]blockchain.Bitc func (wallet *bitcoindWallet) Unlock() error { return wallet.unlock() } + +func (wallet *bitcoindWallet) Address() string { + return wallet.address +} diff --git a/internal/adapters/dataproviders/event.go b/internal/adapters/dataproviders/event.go index 192be85f..15a11cd4 100644 --- a/internal/adapters/dataproviders/event.go +++ b/internal/adapters/dataproviders/event.go @@ -6,6 +6,11 @@ import ( "sync" ) +var ( + singletonLock = &sync.Mutex{} + eventBusSingleton *localEventBus +) + type localEventBus struct { topics map[entities.EventId][]chan<- entities.Event subscribeMutex sync.Mutex @@ -13,8 +18,16 @@ type localEventBus struct { } func NewLocalEventBus() entities.EventBus { - topics := make(map[entities.EventId][]chan<- entities.Event) - return &localEventBus{topics: topics} + if eventBusSingleton == nil { + singletonLock.Lock() + defer singletonLock.Unlock() + // we need to check if it still not created after the getting into the critical section + if eventBusSingleton == nil { + topics := make(map[entities.EventId][]chan<- entities.Event) + eventBusSingleton = &localEventBus{topics: topics} + } + } + return eventBusSingleton } func (bus *localEventBus) Subscribe(id entities.EventId) <-chan entities.Event { diff --git a/internal/adapters/dataproviders/liquidity_provider.go b/internal/adapters/dataproviders/liquidity_provider.go index ba69de88..646e87df 100644 --- a/internal/adapters/dataproviders/liquidity_provider.go +++ b/internal/adapters/dataproviders/liquidity_provider.go @@ -17,35 +17,32 @@ import ( ) type LocalLiquidityProvider struct { - env *Configuration peginRepository quote.PeginQuoteRepository pegoutRepository quote.PegoutQuoteRepository lpRepository liquidity_provider.LiquidityProviderRepository - rsk blockchain.RootstockRpcServer + rpc blockchain.Rpc signer rootstock.TransactionSigner btc blockchain.BitcoinWallet - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts } func NewLocalLiquidityProvider( - env *Configuration, peginRepository quote.PeginQuoteRepository, pegoutRepository quote.PegoutQuoteRepository, lpRepository liquidity_provider.LiquidityProviderRepository, - rsk blockchain.RootstockRpcServer, + rpc blockchain.Rpc, signer rootstock.TransactionSigner, btc blockchain.BitcoinWallet, - lbc blockchain.LiquidityBridgeContract, + contracts blockchain.RskContracts, ) *LocalLiquidityProvider { return &LocalLiquidityProvider{ - env: env, peginRepository: peginRepository, pegoutRepository: pegoutRepository, lpRepository: lpRepository, - rsk: rsk, + rpc: rpc, signer: signer, btc: btc, - lbc: lbc, + contracts: contracts, } } @@ -54,7 +51,7 @@ func (lp *LocalLiquidityProvider) RskAddress() string { } func (lp *LocalLiquidityProvider) BtcAddress() string { - return lp.env.BtcConfig.BtcAddress + return lp.btc.Address() } func (lp *LocalLiquidityProvider) SignQuote(quoteHash string) (string, error) { @@ -108,11 +105,11 @@ func (lp *LocalLiquidityProvider) HasPeginLiquidity(ctx context.Context, require liquidity := new(entities.Wei) lockedLiquidity := new(entities.Wei) log.Debug("Verifying if has liquidity") - lpRskBalance, err := lp.rsk.GetBalance(ctx, lp.RskAddress()) + lpRskBalance, err := lp.rpc.Rsk.GetBalance(ctx, lp.RskAddress()) if err != nil { return err } - lpLbcBalance, err := lp.lbc.GetBalance(lp.RskAddress()) + lpLbcBalance, err := lp.contracts.Lbc.GetBalance(lp.RskAddress()) if err != nil { return err } diff --git a/internal/adapters/entrypoints/rest/middlewares/captcha.go b/internal/adapters/entrypoints/rest/middlewares/captcha.go index 6761077d..b8821dc1 100644 --- a/internal/adapters/entrypoints/rest/middlewares/captcha.go +++ b/internal/adapters/entrypoints/rest/middlewares/captcha.go @@ -42,21 +42,24 @@ func NewCaptchaMiddleware(captchaUrl string, captchaThreshold float32, disabled return } - validCaptcha := validation.Success - if validation.Score != nil { // if is v3 we also use the score - validCaptcha = validCaptcha && *validation.Score >= captchaThreshold - } - - if validCaptcha { - log.Debugf("Valid captcha solved on %s\n", validation.Hostname) - next.ServeHTTP(w, r) - } else { + validCaptcha := calculateCaptchaValidity(validation, captchaThreshold) + if !validCaptcha { unexpectedCaptchaError(w, err) } + log.Debugf("Valid captcha solved on %s\n", validation.Hostname) + next.ServeHTTP(w, r) }) } } +func calculateCaptchaValidity(validation captchaValidationResponse, captchaThreshold float32) bool { + validCaptcha := validation.Success + if validation.Score != nil { // if is v3 we also use the score + validCaptcha = validCaptcha && *validation.Score >= captchaThreshold + } + return validCaptcha +} + func unexpectedCaptchaError(w http.ResponseWriter, err error) { details := make(rest.ErrorDetails) details["error"] = err.Error() diff --git a/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go b/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go index 5426925d..f41fc033 100644 --- a/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go @@ -18,8 +18,8 @@ type PeginBridgeWatcher struct { quotes map[string]w.WatchedPeginQuote registerPeginUseCase *pegin.RegisterPeginUseCase getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase - bridge blockchain.RootstockBridge - btcRpc blockchain.BitcoinNetwork + contracts blockchain.RskContracts + rpc blockchain.Rpc ticker *time.Ticker eventBus entities.EventBus watcherStopChannel chan bool @@ -29,8 +29,8 @@ type PeginBridgeWatcher struct { func NewPeginBridgeWatcher( registerPeginUseCase *pegin.RegisterPeginUseCase, getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase, - bridge blockchain.RootstockBridge, - btcRpc blockchain.BitcoinNetwork, + contracts blockchain.RskContracts, + rpc blockchain.Rpc, eventBus entities.EventBus, ) *PeginBridgeWatcher { quotes := make(map[string]w.WatchedPeginQuote) @@ -39,8 +39,8 @@ func NewPeginBridgeWatcher( quotes: quotes, registerPeginUseCase: registerPeginUseCase, getWatchedPeginQuoteUseCase: getWatchedPeginQuoteUseCase, - bridge: bridge, - btcRpc: btcRpc, + contracts: contracts, + rpc: rpc, eventBus: eventBus, watcherStopChannel: watcherStopChannel, } @@ -65,7 +65,7 @@ watcherLoop: for { select { case <-watcher.ticker.C: - if height, err := watcher.btcRpc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { + if height, err := watcher.rpc.Btc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { watcher.checkQuotes() watcher.currentBlock = height } else if err != nil { @@ -110,7 +110,7 @@ func (watcher *PeginBridgeWatcher) checkQuotes() { var err error var tx blockchain.BitcoinTransactionInformation for _, watchedQuote := range watcher.quotes { - if tx, err = watcher.btcRpc.GetTransactionInfo(watchedQuote.RetainedQuote.UserBtcTxHash); err != nil { + if tx, err = watcher.rpc.Btc.GetTransactionInfo(watchedQuote.RetainedQuote.UserBtcTxHash); err != nil { log.Errorf("Error getting Bitcoin transaction information %s: %v\n", watchedQuote.RetainedQuote.UserBtcTxHash, err) return } @@ -134,5 +134,5 @@ func (watcher *PeginBridgeWatcher) registerPegin(watchedQuote w.WatchedPeginQuot func (watcher *PeginBridgeWatcher) validateQuote(watchedQuote w.WatchedPeginQuote, tx blockchain.BitcoinTransactionInformation) bool { return watchedQuote.RetainedQuote.State == quote.PeginStateCallForUserSucceeded && - tx.Confirmations >= watcher.bridge.GetRequiredTxConfirmations() + tx.Confirmations >= watcher.contracts.Bridge.GetRequiredTxConfirmations() } diff --git a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go index 83a2d482..1f1838c2 100644 --- a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go @@ -21,19 +21,21 @@ type PeginDepositAddressWatcher struct { callForUserUseCase *pegin.CallForUserUseCase expiredUseCase *pegin.ExpiredPeginQuoteUseCase btcWallet blockchain.BitcoinWallet - btcRpc blockchain.BitcoinNetwork + rpc blockchain.Rpc ticker *time.Ticker eventBus entities.EventBus watcherStopChannel chan bool currentBlock *big.Int } +const callForUserErrorTemplate = "Error executing call for user on quote %s: %v" + func NewPeginDepositAddressWatcher( callForUserUseCase *pegin.CallForUserUseCase, getWatchedPeginQuoteUseCase *w.GetWatchedPeginQuoteUseCase, expiredUseCase *pegin.ExpiredPeginQuoteUseCase, btcWallet blockchain.BitcoinWallet, - btcRpc blockchain.BitcoinNetwork, + rpc blockchain.Rpc, eventBus entities.EventBus, ) *PeginDepositAddressWatcher { quotes := make(map[string]w.WatchedPeginQuote) @@ -46,7 +48,7 @@ func NewPeginDepositAddressWatcher( btcWallet: btcWallet, eventBus: eventBus, watcherStopChannel: watcherStopChannel, - btcRpc: btcRpc, + rpc: rpc, } } @@ -76,7 +78,7 @@ watcherLoop: for { select { case <-watcher.ticker.C: - if height, err := watcher.btcRpc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { + if height, err := watcher.rpc.Btc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { watcher.checkQuotes() watcher.currentBlock = height } else if err != nil { @@ -132,7 +134,7 @@ func (watcher *PeginDepositAddressWatcher) handleQuote(watchedQuote w.WatchedPeg depositAddress := watchedQuote.RetainedQuote.DepositAddress txs, err := watcher.btcWallet.GetTransactions(depositAddress) if err != nil { - log.Errorf("Error executing call for user on quote %s: %v\n", quoteHash, err) + log.Errorf(callForUserErrorTemplate, quoteHash, err) return } for _, tx := range txs { @@ -155,9 +157,9 @@ func (watcher *PeginDepositAddressWatcher) callForUser(watchedQuote w.WatchedPeg quoteHash := watchedQuote.RetainedQuote.QuoteHash if err = watcher.callForUserUseCase.Run(context.Background(), tx.Hash, watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { delete(watcher.quotes, quoteHash) - log.Errorf("Error executing call for user on quote %s: %v\n", quoteHash, err) + log.Errorf(callForUserErrorTemplate, quoteHash, err) } else if err != nil { - log.Errorf("Error executing call for user on quote %s: %v\n", quoteHash, err) + log.Errorf(callForUserErrorTemplate, quoteHash, err) } else { delete(watcher.quotes, quoteHash) } diff --git a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go index 5e02157e..6aa5f660 100644 --- a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go @@ -18,7 +18,7 @@ type PegoutBtcTransferWatcher struct { quotes map[string]w.WatchedPegoutQuote getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase refundPegoutUseCase *pegout.RefundPegoutUseCase - btcRpc blockchain.BitcoinNetwork + rpc blockchain.Rpc ticker *time.Ticker eventBus entities.EventBus watcherStopChannel chan bool @@ -28,7 +28,7 @@ type PegoutBtcTransferWatcher struct { func NewPegoutBtcTransferWatcher( getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase, refundPegoutUseCase *pegout.RefundPegoutUseCase, - btcRpc blockchain.BitcoinNetwork, + rpc blockchain.Rpc, eventBus entities.EventBus, ) *PegoutBtcTransferWatcher { quotes := make(map[string]w.WatchedPegoutQuote) @@ -38,7 +38,7 @@ func NewPegoutBtcTransferWatcher( quotes: quotes, getWatchedPegoutQuoteUseCase: getWatchedPegoutQuoteUseCase, refundPegoutUseCase: refundPegoutUseCase, - btcRpc: btcRpc, + rpc: rpc, eventBus: eventBus, watcherStopChannel: watcherStopChannel, currentBlock: currentBlock, @@ -69,7 +69,7 @@ watcherLoop: for { select { case <-watcher.ticker.C: - if height, err := watcher.btcRpc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { + if height, err := watcher.rpc.Btc.GetHeight(); err == nil && height.Cmp(watcher.currentBlock) > 0 { watcher.checkQuotes() watcher.currentBlock = height } else if err != nil { @@ -91,7 +91,7 @@ func (watcher *PegoutBtcTransferWatcher) checkQuotes() { var err error var tx blockchain.BitcoinTransactionInformation for _, watchedQuote := range watcher.quotes { - if tx, err = watcher.btcRpc.GetTransactionInfo(watchedQuote.RetainedQuote.LpBtcTxHash); err != nil { + if tx, err = watcher.rpc.Btc.GetTransactionInfo(watchedQuote.RetainedQuote.LpBtcTxHash); err != nil { log.Errorf("Error getting Bitcoin transaction information %s: %v\n", watchedQuote.RetainedQuote.LpBtcTxHash, err) return } diff --git a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go index 34f6f3f7..21c32c1e 100644 --- a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go @@ -22,8 +22,8 @@ type PegoutRskDepositWatcher struct { updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase pegoutLp liquidity_provider.PegoutLiquidityProvider - rskRpc blockchain.RootstockRpcServer - lbc blockchain.LiquidityBridgeContract + rpc blockchain.Rpc + contracts blockchain.RskContracts ticker *time.Ticker eventBus entities.EventBus watcherStopChannel chan bool @@ -31,15 +31,35 @@ type PegoutRskDepositWatcher struct { cacheStartBlock uint64 } -func NewPegoutRskDepositWatcher( +type PegoutRskDepositWatcherUseCases struct { + getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase + expiredUseCase *pegout.ExpiredPegoutQuoteUseCase + sendPegoutUseCase *pegout.SendPegoutUseCase + updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase + initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase +} + +func NewPegoutRskDepositWatcherUseCases( getWatchedPegoutQuoteUseCase *w.GetWatchedPegoutQuoteUseCase, expiredUseCase *pegout.ExpiredPegoutQuoteUseCase, sendPegoutUseCase *pegout.SendPegoutUseCase, updatePegoutDepositUseCase *w.UpdatePegoutQuoteDepositUseCase, initDepositCacheUseCase *pegout.InitPegoutDepositCacheUseCase, +) *PegoutRskDepositWatcherUseCases { + return &PegoutRskDepositWatcherUseCases{ + getWatchedPegoutQuoteUseCase: getWatchedPegoutQuoteUseCase, + expiredUseCase: expiredUseCase, + sendPegoutUseCase: sendPegoutUseCase, + updatePegoutDepositUseCase: updatePegoutDepositUseCase, + initDepositCacheUseCase: initDepositCacheUseCase, + } +} + +func NewPegoutRskDepositWatcher( + watcherUseCases *PegoutRskDepositWatcherUseCases, pegoutLp liquidity_provider.PegoutLiquidityProvider, - rskRpc blockchain.RootstockRpcServer, - lbc blockchain.LiquidityBridgeContract, + rpc blockchain.Rpc, + contracts blockchain.RskContracts, eventBus entities.EventBus, cacheStartBlock uint64, ) *PegoutRskDepositWatcher { @@ -48,14 +68,14 @@ func NewPegoutRskDepositWatcher( currentBlock := cacheStartBlock return &PegoutRskDepositWatcher{ quotes: quotes, - getWatchedPegoutQuoteUseCase: getWatchedPegoutQuoteUseCase, - expiredUseCase: expiredUseCase, - sendPegoutUseCase: sendPegoutUseCase, - updatePegoutDepositUseCase: updatePegoutDepositUseCase, - initDepositCacheUseCase: initDepositCacheUseCase, + getWatchedPegoutQuoteUseCase: watcherUseCases.getWatchedPegoutQuoteUseCase, + expiredUseCase: watcherUseCases.expiredUseCase, + sendPegoutUseCase: watcherUseCases.sendPegoutUseCase, + updatePegoutDepositUseCase: watcherUseCases.updatePegoutDepositUseCase, + initDepositCacheUseCase: watcherUseCases.initDepositCacheUseCase, pegoutLp: pegoutLp, - rskRpc: rskRpc, - lbc: lbc, + rpc: rpc, + contracts: contracts, eventBus: eventBus, watcherStopChannel: watcherStopChannel, currentBlock: currentBlock, @@ -101,7 +121,7 @@ watcherLoop: select { case <-watcher.ticker.C: checkContext, checkCancel = context.WithTimeout(context.Background(), 1*time.Minute) - if height, err := watcher.rskRpc.GetHeight(checkContext); err == nil && height > watcher.currentBlock { + if height, err := watcher.rpc.Rsk.GetHeight(checkContext); err == nil && height > watcher.currentBlock { watcher.checkDeposits(checkContext, watcher.currentBlock, height) watcher.checkQuotes(checkContext, height) watcher.currentBlock = height @@ -146,7 +166,7 @@ func (watcher *PegoutRskDepositWatcher) checkDeposits(ctx context.Context, fromB var err error var deposits []quote.PegoutDeposit - deposits, err = watcher.lbc.GetDepositEvents(ctx, fromBlock, &toBlock) + deposits, err = watcher.contracts.Lbc.GetDepositEvents(ctx, fromBlock, &toBlock) if err != nil { log.Errorf("Error executing getting deposits in range [%d, %d] in PegoutRskDepositWatcher\n", fromBlock, toBlock) return @@ -188,7 +208,7 @@ func (watcher *PegoutRskDepositWatcher) checkQuote(ctx context.Context, height u } if watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDepositConfirmations { - if receipt, err = watcher.rskRpc.GetTransactionReceipt(ctx, watchedQuote.RetainedQuote.UserRskTxHash); err != nil { + if receipt, err = watcher.rpc.Rsk.GetTransactionReceipt(ctx, watchedQuote.RetainedQuote.UserRskTxHash); err != nil { log.Errorf("Error getting pegout deposit receipt of quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) return } diff --git a/internal/adapters/entrypoints/watcher/penalization_alert.go b/internal/adapters/entrypoints/watcher/penalization_alert.go index bc1312ce..fd903071 100644 --- a/internal/adapters/entrypoints/watcher/penalization_alert.go +++ b/internal/adapters/entrypoints/watcher/penalization_alert.go @@ -9,22 +9,22 @@ import ( ) type PenalizationAlertWatcher struct { - rskRpc blockchain.RootstockRpcServer + rpc blockchain.Rpc penalizationAlertUseCase *liquidity_provider.PenalizationAlertUseCase currentBlock uint64 ticker *time.Ticker watcherStopChannel chan bool } -func NewPenalizationAlertWatcher(rskRpc blockchain.RootstockRpcServer, penalizationAlertUseCase *liquidity_provider.PenalizationAlertUseCase) *PenalizationAlertWatcher { +func NewPenalizationAlertWatcher(rpc blockchain.Rpc, penalizationAlertUseCase *liquidity_provider.PenalizationAlertUseCase) *PenalizationAlertWatcher { watcherStopChannel := make(chan bool, 1) - return &PenalizationAlertWatcher{rskRpc: rskRpc, penalizationAlertUseCase: penalizationAlertUseCase, watcherStopChannel: watcherStopChannel} + return &PenalizationAlertWatcher{rpc: rpc, penalizationAlertUseCase: penalizationAlertUseCase, watcherStopChannel: watcherStopChannel} } func (watcher *PenalizationAlertWatcher) Prepare(ctx context.Context) error { var err error var height uint64 - if height, err = watcher.rskRpc.GetHeight(ctx); err != nil { + if height, err = watcher.rpc.Rsk.GetHeight(ctx); err != nil { return err } watcher.currentBlock = height @@ -42,7 +42,7 @@ watcherLoop: select { case <-watcher.ticker.C: ctx, cancel = context.WithTimeout(context.Background(), watcherValidationTimeout) - if height, err = watcher.rskRpc.GetHeight(ctx); err != nil { + if height, err = watcher.rpc.Rsk.GetHeight(ctx); err != nil { log.Error("Error checking penalization events inside watcher: ", err) } else { if err = watcher.penalizationAlertUseCase.Run(ctx, watcher.currentBlock, height); err == nil { diff --git a/internal/configuration/environment/configuration.go b/internal/configuration/environment/configuration.go deleted file mode 100644 index 6e1197eb..00000000 --- a/internal/configuration/environment/configuration.go +++ /dev/null @@ -1,17 +0,0 @@ -package environment - -import "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" - -func ConfigurationFromEnv(env Environment) *dataproviders.Configuration { - return &dataproviders.Configuration{ - RskConfig: dataproviders.RskConfig{ - ChainId: env.Rsk.ChainId, - Account: uint64(env.Rsk.AccountNumber), - }, - BtcConfig: dataproviders.BitcoinConfig{ - BtcAddress: env.Provider.BtcAddress, - }, - PeginConfig: dataproviders.PeginConfig{}, - PegoutConfig: dataproviders.PegoutConfig{}, - } -} diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index ce43df9f..84298ed2 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -51,12 +51,12 @@ type BtcEnv struct { FixedTxFeeRate float64 `env:"BTC_TX_FEE_RATE" validate:"required"` WalletEncrypted bool `env:"BTC_ENCRYPTED_WALLET" validate:"required"` WalletPasswordSecret string `env:"BTC_WALLET_PASSWORD"` + BtcAddress string `env:"BTC_ADDR" validate:"required"` } type ProviderEnv struct { AlertSenderEmail string `env:"ALERT_SENDER_EMAIL" validate:"required"` AlertRecipientEmail string `env:"ALERT_RECIPIENT_EMAIL" validate:"required"` - BtcAddress string `env:"BTC_ADDR" validate:"required"` Name string `env:"PROVIDER_NAME" validate:"required"` ApiBaseUrl string `env:"BASE_URL" validate:"required"` ProviderType liquidity_provider.ProviderType `env:"PROVIDER_TYPE" validate:"required,oneof=pegin pegout both"` diff --git a/internal/configuration/registry/bitcoin.go b/internal/configuration/registry/bitcoin.go index 157fe648..250d66c1 100644 --- a/internal/configuration/registry/bitcoin.go +++ b/internal/configuration/registry/bitcoin.go @@ -2,23 +2,21 @@ package registry import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" - environment2 "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" ) type Bitcoin struct { - RpcServer blockchain.BitcoinNetwork Wallet blockchain.BitcoinWallet Connection *bitcoin.Connection } -func NewBitcoinRegistry(env environment2.BtcEnv, secrets environment2.ApplicationSecrets, connection *bitcoin.Connection) (*Bitcoin, error) { - wallet := bitcoin.NewBitcoindWallet(connection, env.FixedTxFeeRate, env.WalletEncrypted, secrets.BtcWalletPassword) +func NewBitcoinRegistry(env environment.BtcEnv, secrets environment.ApplicationSecrets, connection *bitcoin.Connection) (*Bitcoin, error) { + wallet := bitcoin.NewBitcoindWallet(connection, env.BtcAddress, env.FixedTxFeeRate, env.WalletEncrypted, secrets.BtcWalletPassword) if err := wallet.Unlock(); err != nil { return nil, err } return &Bitcoin{ - RpcServer: bitcoin.NewBitcoindRpc(connection), Wallet: wallet, Connection: connection, }, nil diff --git a/internal/configuration/registry/liquidity_provider.go b/internal/configuration/registry/liquidity_provider.go index f000c84c..4733c5e1 100644 --- a/internal/configuration/registry/liquidity_provider.go +++ b/internal/configuration/registry/liquidity_provider.go @@ -3,19 +3,18 @@ package registry import "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" func NewLiquidityProvider( - config *dataproviders.Configuration, databaseRegistry *Database, rskRegistry *Rootstock, btcRegistry *Bitcoin, + messaging *Messaging, ) *dataproviders.LocalLiquidityProvider { return dataproviders.NewLocalLiquidityProvider( - config, databaseRegistry.PeginRepository, databaseRegistry.PegoutRepository, databaseRegistry.LiquidityProviderRepository, - rskRegistry.RpcServer, + messaging.Rpc, rskRegistry.Wallet, btcRegistry.Wallet, - rskRegistry.Lbc, + rskRegistry.Contracts, ) } diff --git a/internal/configuration/registry/messaging.go b/internal/configuration/registry/messaging.go new file mode 100644 index 00000000..75e77870 --- /dev/null +++ b/internal/configuration/registry/messaging.go @@ -0,0 +1,32 @@ +package registry + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" +) + +type Messaging struct { + Rpc blockchain.Rpc + EventBus entities.EventBus + AlertSender entities.AlertSender +} + +func NewMessagingRegistry( + ctx context.Context, + env environment.Environment, + rskClient *rootstock.RskClient, + btcConn *bitcoin.Connection, +) *Messaging { + return &Messaging{ + Rpc: blockchain.Rpc{ + Btc: bitcoin.NewBitcoindRpc(btcConn), + Rsk: rootstock.NewRskjRpcServer(rskClient), + }, + EventBus: NewEventBus(), + AlertSender: NewAlertSender(ctx, env), + } +} diff --git a/internal/configuration/registry/rootstock.go b/internal/configuration/registry/rootstock.go index d0cd5194..f2008ef3 100644 --- a/internal/configuration/registry/rootstock.go +++ b/internal/configuration/registry/rootstock.go @@ -10,12 +10,9 @@ import ( ) type Rootstock struct { - RpcServer blockchain.RootstockRpcServer - FeeCollector blockchain.FeeCollector - Bridge blockchain.RootstockBridge - Lbc blockchain.LiquidityBridgeContract - Wallet *rootstock.RskWalletImpl - Client *rootstock.RskClient + Contracts blockchain.RskContracts + Wallet *rootstock.RskWalletImpl + Client *rootstock.RskClient } func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, account *rootstock.RskAccount, bitcoinConn *bitcoin.Connection) (*Rootstock, error) { @@ -40,19 +37,20 @@ func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, a wallet := rootstock.NewRskWalletImpl(client, account, env.ChainId) return &Rootstock{ - RpcServer: rootstock.NewRskjRpcServer(client), - FeeCollector: rootstock.NewFeeCollectorImpl(lbc), - Wallet: wallet, - Bridge: rootstock.NewRskBridgeImpl( - env.BridgeAddress, - env.BridgeRequiredConfirmations, - env.IrisActivationHeight, - env.ErpKeys, - bridge, - client, - bitcoinConn.NetworkParams, - ), - Lbc: rootstock.NewLiquidityBridgeContractImpl(client, env.LbcAddress, lbc, wallet), + Contracts: blockchain.RskContracts{ + Bridge: rootstock.NewRskBridgeImpl( + env.BridgeAddress, + env.BridgeRequiredConfirmations, + env.IrisActivationHeight, + env.ErpKeys, + bridge, + client, + bitcoinConn.NetworkParams, + ), + Lbc: rootstock.NewLiquidityBridgeContractImpl(client, env.LbcAddress, lbc, wallet), + FeeCollector: rootstock.NewFeeCollectorImpl(lbc), + }, + Wallet: wallet, Client: client, }, nil } diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index c4ada5e5..1f341306 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -57,51 +57,44 @@ func NewUseCaseRegistry( btcRegistry *Bitcoin, databaseRegistry *Database, liquidityProvider *dataproviders.LocalLiquidityProvider, - eventBus entities.EventBus, - alertSender entities.AlertSender, + messaging *Messaging, mutexes entities.ApplicationMutexes, ) *UseCaseRegistry { return &UseCaseRegistry{ getPeginQuoteUseCase: pegin.NewGetQuoteUseCase( - rskRegistry.RpcServer, - btcRegistry.RpcServer, - rskRegistry.FeeCollector, - rskRegistry.Bridge, - rskRegistry.Lbc, + messaging.Rpc, + rskRegistry.Contracts, databaseRegistry.PeginRepository, liquidityProvider, liquidityProvider, env.Rsk.FeeCollectorAddress, ), registerProviderUseCase: liquidity_provider.NewRegistrationUseCase( - rskRegistry.Lbc, + rskRegistry.Contracts, liquidityProvider, ), callForUserUseCase: pegin.NewCallForUserUseCase( - rskRegistry.Lbc, + rskRegistry.Contracts, databaseRegistry.PeginRepository, - btcRegistry.RpcServer, + messaging.Rpc, liquidityProvider, - eventBus, - rskRegistry.RpcServer, + messaging.EventBus, mutexes.RskWalletMutex(), ), registerPeginUseCase: pegin.NewRegisterPeginUseCase( - rskRegistry.Lbc, + rskRegistry.Contracts, databaseRegistry.PeginRepository, - eventBus, - rskRegistry.Bridge, - btcRegistry.RpcServer, + messaging.EventBus, + messaging.Rpc, mutexes.RskWalletMutex(), ), acceptPeginQuoteUseCase: pegin.NewAcceptQuoteUseCase( databaseRegistry.PeginRepository, - rskRegistry.Bridge, - btcRegistry.RpcServer, - rskRegistry.RpcServer, + rskRegistry.Contracts, + messaging.Rpc, liquidityProvider, liquidityProvider, - eventBus, + messaging.EventBus, mutexes.PeginLiquidityMutex(), ), getWatchedPeginQuoteUseCase: watcher.NewGetWatchedPeginQuoteUseCase(databaseRegistry.PeginRepository), @@ -124,24 +117,20 @@ func NewUseCaseRegistry( updatePegoutDepositUseCase: watcher.NewUpdatePegoutQuoteDepositUseCase(databaseRegistry.PegoutRepository), initPegoutDepositCacheUseCase: pegout.NewInitPegoutDepositCacheUseCase( databaseRegistry.PegoutRepository, - rskRegistry.Lbc, - rskRegistry.RpcServer, + rskRegistry.Contracts, + messaging.Rpc, ), refundPegoutUseCase: pegout.NewRefundPegoutUseCase( databaseRegistry.PegoutRepository, - rskRegistry.Lbc, - eventBus, - btcRegistry.RpcServer, + rskRegistry.Contracts, + messaging.EventBus, + messaging.Rpc, rskRegistry.Wallet, - rskRegistry.Bridge, mutexes.RskWalletMutex(), ), getPegoutQuoteUseCase: pegout.NewGetQuoteUseCase( - rskRegistry.RpcServer, - btcRegistry.RpcServer, - rskRegistry.FeeCollector, - rskRegistry.Bridge, - rskRegistry.Lbc, + messaging.Rpc, + rskRegistry.Contracts, databaseRegistry.PegoutRepository, liquidityProvider, liquidityProvider, @@ -150,41 +139,41 @@ func NewUseCaseRegistry( ), acceptPegoutQuoteUseCase: pegout.NewAcceptQuoteUseCase( databaseRegistry.PegoutRepository, - rskRegistry.Lbc, + rskRegistry.Contracts, liquidityProvider, liquidityProvider, - eventBus, + messaging.EventBus, mutexes.PegoutLiquidityMutex(), ), sendPegoutUseCase: pegout.NewSendPegoutUseCase( btcRegistry.Wallet, databaseRegistry.PegoutRepository, - rskRegistry.RpcServer, - eventBus, + messaging.Rpc, + messaging.EventBus, mutexes.BtcWalletMutex(), ), getUserDepositsUseCase: pegout.NewGetUserDepositsUseCase(databaseRegistry.PegoutRepository), liquidityCheckUseCase: liquidity_provider.NewCheckLiquidityUseCase( liquidityProvider, liquidityProvider, - rskRegistry.Bridge, - alertSender, + rskRegistry.Contracts, + messaging.AlertSender, env.Provider.AlertRecipientEmail, ), penalizationAlertUseCase: liquidity_provider.NewPenalizationAlertUseCase( - rskRegistry.Lbc, - alertSender, + rskRegistry.Contracts, + messaging.AlertSender, env.Provider.AlertRecipientEmail, ), - addPeginCollateralUseCase: pegin.NewAddCollateralUseCase(rskRegistry.Lbc, liquidityProvider), - addPegoutCollateralUseCase: pegout.NewAddCollateralUseCase(rskRegistry.Lbc, liquidityProvider), - changeStatusUseCase: liquidity_provider.NewChangeStatusUseCase(rskRegistry.Lbc, liquidityProvider), - resignUseCase: liquidity_provider.NewResignUseCase(rskRegistry.Lbc, liquidityProvider), - getProvidersUseCase: liquidity_provider.NewGetProvidersUseCase(rskRegistry.Lbc), - getPeginCollateralUseCase: pegin.NewGetCollateralUseCase(rskRegistry.Lbc, liquidityProvider), - getPegoutCollateralUseCase: pegout.NewGetCollateralUseCase(rskRegistry.Lbc, liquidityProvider), - withdrawPeginCollateralUseCase: pegin.NewWithdrawCollateralUseCase(rskRegistry.Lbc), - withdrawPegoutCollateralUseCase: pegout.NewWithdrawCollateralUseCase(rskRegistry.Lbc), + addPeginCollateralUseCase: pegin.NewAddCollateralUseCase(rskRegistry.Contracts, liquidityProvider), + addPegoutCollateralUseCase: pegout.NewAddCollateralUseCase(rskRegistry.Contracts, liquidityProvider), + changeStatusUseCase: liquidity_provider.NewChangeStatusUseCase(rskRegistry.Contracts, liquidityProvider), + resignUseCase: liquidity_provider.NewResignUseCase(rskRegistry.Contracts, liquidityProvider), + getProvidersUseCase: liquidity_provider.NewGetProvidersUseCase(rskRegistry.Contracts), + getPeginCollateralUseCase: pegin.NewGetCollateralUseCase(rskRegistry.Contracts, liquidityProvider), + getPegoutCollateralUseCase: pegout.NewGetCollateralUseCase(rskRegistry.Contracts, liquidityProvider), + withdrawPeginCollateralUseCase: pegin.NewWithdrawCollateralUseCase(rskRegistry.Contracts), + withdrawPegoutCollateralUseCase: pegout.NewWithdrawCollateralUseCase(rskRegistry.Contracts), healthUseCase: usecases.NewHealthUseCase(rskRegistry.Client, btcRegistry.Connection, databaseRegistry.Connection), setGeneralConfigUseCase: liquidity_provider.NewSetGeneralConfigUseCase( databaseRegistry.LiquidityProviderRepository, diff --git a/internal/configuration/registry/watcher.go b/internal/configuration/registry/watcher.go index 5091547d..20b1abc8 100644 --- a/internal/configuration/registry/watcher.go +++ b/internal/configuration/registry/watcher.go @@ -4,7 +4,6 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/watcher" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" - "github.com/rsksmart/liquidity-provider-server/internal/entities" ) type WatcherRegistry struct { @@ -23,7 +22,7 @@ func NewWatcherRegistry( rskRegistry *Rootstock, btcRegistry *Bitcoin, liquidityProvider *dataproviders.LocalLiquidityProvider, - eventBus entities.EventBus, + messaging *Messaging, ) *WatcherRegistry { return &WatcherRegistry{ PeginDepositAddressWatcher: watcher.NewPeginDepositAddressWatcher( @@ -31,40 +30,42 @@ func NewWatcherRegistry( useCaseRegistry.getWatchedPeginQuoteUseCase, useCaseRegistry.expiredPeginQuoteUseCase, btcRegistry.Wallet, - btcRegistry.RpcServer, - eventBus, + messaging.Rpc, + messaging.EventBus, ), PeginBridgeWatcher: watcher.NewPeginBridgeWatcher( useCaseRegistry.registerPeginUseCase, useCaseRegistry.getWatchedPeginQuoteUseCase, - rskRegistry.Bridge, - btcRegistry.RpcServer, - eventBus, + rskRegistry.Contracts, + messaging.Rpc, + messaging.EventBus, ), QuoteCleanerWatcher: watcher.NewQuoteCleanerWatcher( useCaseRegistry.cleanExpiredQuotesUseCase, ), PegoutRskDepositWatcher: watcher.NewPegoutRskDepositWatcher( - useCaseRegistry.getWatchedPegoutQuoteUseCase, - useCaseRegistry.expiredPegoutUseCase, - useCaseRegistry.sendPegoutUseCase, - useCaseRegistry.updatePegoutDepositUseCase, - useCaseRegistry.initPegoutDepositCacheUseCase, + watcher.NewPegoutRskDepositWatcherUseCases( + useCaseRegistry.getWatchedPegoutQuoteUseCase, + useCaseRegistry.expiredPegoutUseCase, + useCaseRegistry.sendPegoutUseCase, + useCaseRegistry.updatePegoutDepositUseCase, + useCaseRegistry.initPegoutDepositCacheUseCase, + ), liquidityProvider, - rskRegistry.RpcServer, - rskRegistry.Lbc, - eventBus, + messaging.Rpc, + rskRegistry.Contracts, + messaging.EventBus, env.Pegout.DepositCacheStartBlock, ), PegoutBtcTransferWatcher: watcher.NewPegoutBtcTransferWatcher( useCaseRegistry.getWatchedPegoutQuoteUseCase, useCaseRegistry.refundPegoutUseCase, - btcRegistry.RpcServer, - eventBus, + messaging.Rpc, + messaging.EventBus, ), LiquidityCheckWatcher: watcher.NewLiquidityCheckWatcher(useCaseRegistry.liquidityCheckUseCase), PenalizationAlertWatcher: watcher.NewPenalizationAlertWatcher( - rskRegistry.RpcServer, + messaging.Rpc, useCaseRegistry.penalizationAlertUseCase, ), } diff --git a/internal/entities/blockchain/bitcoin.go b/internal/entities/blockchain/bitcoin.go index 38901a72..f726980a 100644 --- a/internal/entities/blockchain/bitcoin.go +++ b/internal/entities/blockchain/bitcoin.go @@ -57,6 +57,7 @@ type BitcoinWallet interface { SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (string, error) ImportAddress(address string) error GetTransactions(address string) ([]BitcoinTransactionInformation, error) + Address() string Unlock() error } diff --git a/internal/entities/blockchain/common.go b/internal/entities/blockchain/common.go new file mode 100644 index 00000000..2e48ccb3 --- /dev/null +++ b/internal/entities/blockchain/common.go @@ -0,0 +1,6 @@ +package blockchain + +type Rpc struct { + Btc BitcoinNetwork + Rsk RootstockRpcServer +} diff --git a/internal/entities/blockchain/rootstock.go b/internal/entities/blockchain/rootstock.go index 371f861e..a8961563 100644 --- a/internal/entities/blockchain/rootstock.go +++ b/internal/entities/blockchain/rootstock.go @@ -16,6 +16,12 @@ var ( InvalidAddressError = errors.New("invalid rootstock address") ) +type RskContracts struct { + Bridge RootstockBridge + Lbc LiquidityBridgeContract + FeeCollector FeeCollector +} + func DecodeStringTrimPrefix(hexString string) ([]byte, error) { return hex.DecodeString(strings.TrimPrefix(hexString, "0x")) } diff --git a/internal/usecases/liquidity_provider/change_status.go b/internal/usecases/liquidity_provider/change_status.go index 52c5b027..ec088d25 100644 --- a/internal/usecases/liquidity_provider/change_status.go +++ b/internal/usecases/liquidity_provider/change_status.go @@ -7,24 +7,24 @@ import ( ) type ChangeStatusUseCase struct { - lbc blockchain.LiquidityBridgeContract - provider liquidity_provider.LiquidityProvider + contracts blockchain.RskContracts + provider liquidity_provider.LiquidityProvider } -func NewChangeStatusUseCase(lbc blockchain.LiquidityBridgeContract, provider liquidity_provider.LiquidityProvider) *ChangeStatusUseCase { - return &ChangeStatusUseCase{lbc: lbc, provider: provider} +func NewChangeStatusUseCase(contracts blockchain.RskContracts, provider liquidity_provider.LiquidityProvider) *ChangeStatusUseCase { + return &ChangeStatusUseCase{contracts: contracts, provider: provider} } func (useCase *ChangeStatusUseCase) Run(newStatus bool) error { var err error var id uint64 - id, err = ValidateConfiguredProvider(useCase.provider, useCase.lbc) + id, err = ValidateConfiguredProvider(useCase.provider, useCase.contracts.Lbc) if err != nil { return usecases.WrapUseCaseError(usecases.ChangeProviderStatusId, err) } - if err = useCase.lbc.SetProviderStatus(id, newStatus); err != nil { + if err = useCase.contracts.Lbc.SetProviderStatus(id, newStatus); err != nil { return usecases.WrapUseCaseError(usecases.ChangeProviderStatusId, err) } return nil diff --git a/internal/usecases/liquidity_provider/change_status_test.go b/internal/usecases/liquidity_provider/change_status_test.go index 85ca6cae..0d8ef536 100644 --- a/internal/usecases/liquidity_provider/change_status_test.go +++ b/internal/usecases/liquidity_provider/change_status_test.go @@ -2,6 +2,7 @@ package liquidity_provider_test import ( "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test/mocks" @@ -31,7 +32,8 @@ func TestChangeStatusUseCase_Run(t *testing.T) { provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("0x02") - err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) + contracts := blockchain.RskContracts{Lbc: lbc} + err := liquidity_provider.NewChangeStatusUseCase(contracts, provider).Run(false) lbc.AssertExpectations(t) require.NoError(t, err) @@ -45,7 +47,8 @@ func TestChangeStatusUseCase_Run_Fail(t *testing.T) { []lp.RegisteredLiquidityProvider{}, errors.New("some error"), ).Once() - err := liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) + contracts := blockchain.RskContracts{Lbc: lbc} + err := liquidity_provider.NewChangeStatusUseCase(contracts, provider).Run(false) lbc.AssertExpectations(t) require.Error(t, err) @@ -54,7 +57,7 @@ func TestChangeStatusUseCase_Run_Fail(t *testing.T) { }, nil).Once() provider.On("RskAddress").Return("0x01") lbc.On("SetProviderStatus", mock.Anything, mock.Anything).Return(errors.New("some error")).Once() - err = liquidity_provider.NewChangeStatusUseCase(lbc, provider).Run(false) + err = liquidity_provider.NewChangeStatusUseCase(contracts, provider).Run(false) lbc.AssertExpectations(t) require.Error(t, err) } diff --git a/internal/usecases/liquidity_provider/check_liquidity.go b/internal/usecases/liquidity_provider/check_liquidity.go index 6a7d392e..2b6d57fa 100644 --- a/internal/usecases/liquidity_provider/check_liquidity.go +++ b/internal/usecases/liquidity_provider/check_liquidity.go @@ -23,7 +23,7 @@ const ( type CheckLiquidityUseCase struct { peginProvider liquidity_provider.PeginLiquidityProvider pegoutProvider liquidity_provider.PegoutLiquidityProvider - bridge blockchain.RootstockBridge + contracts blockchain.RskContracts alertSender entities.AlertSender recipient string } @@ -31,21 +31,21 @@ type CheckLiquidityUseCase struct { func NewCheckLiquidityUseCase( peginProvider liquidity_provider.PeginLiquidityProvider, pegoutProvider liquidity_provider.PegoutLiquidityProvider, - bridge blockchain.RootstockBridge, + contracts blockchain.RskContracts, alertSender entities.AlertSender, recipient string, ) *CheckLiquidityUseCase { return &CheckLiquidityUseCase{ peginProvider: peginProvider, pegoutProvider: pegoutProvider, - bridge: bridge, + contracts: contracts, alertSender: alertSender, recipient: recipient, } } func (useCase *CheckLiquidityUseCase) Run(ctx context.Context) error { - minLockTxValueInWei, err := useCase.bridge.GetMinimumLockTxValue() + minLockTxValueInWei, err := useCase.contracts.Bridge.GetMinimumLockTxValue() if err != nil { return usecases.WrapUseCaseError(usecases.CheckLiquidityId, err) } diff --git a/internal/usecases/liquidity_provider/check_liquidity_test.go b/internal/usecases/liquidity_provider/check_liquidity_test.go index 56559aba..3503076c 100644 --- a/internal/usecases/liquidity_provider/check_liquidity_test.go +++ b/internal/usecases/liquidity_provider/check_liquidity_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" @@ -22,7 +23,8 @@ func TestCheckLiquidityUseCase_Run(t *testing.T) { provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() - useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, alertSender, "recipient") + contracts := blockchain.RskContracts{Bridge: bridge} + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, contracts, alertSender, "recipient") err := useCase.Run(context.Background()) bridge.AssertExpectations(t) provider.AssertExpectations(t) @@ -44,7 +46,8 @@ func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() - useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, alertSender, recipient) + contracts := blockchain.RskContracts{Bridge: bridge} + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, contracts, alertSender, recipient) err := useCase.Run(context.Background()) bridge.AssertExpectations(t) alertSender.AssertExpectations(t) @@ -66,7 +69,8 @@ func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() - useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, alertSender, recipient) + contracts := blockchain.RskContracts{Bridge: bridge} + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, contracts, alertSender, recipient) err := useCase.Run(context.Background()) bridge.AssertExpectations(t) provider.AssertExpectations(t) @@ -101,7 +105,8 @@ func TestCheckLiquidityUseCase_Run_NoRecoverableErrorHandling(t *testing.T) { provider := &mocks.ProviderMock{} sender := &mocks.AlertSenderMock{} testCase.Value(bridge, provider, sender) - useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, sender, recipient) + contracts := blockchain.RskContracts{Bridge: bridge} + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, contracts, sender, recipient) err := useCase.Run(context.Background()) bridge.AssertExpectations(t) provider.AssertExpectations(t) @@ -139,7 +144,8 @@ func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { buff := new(bytes.Buffer) testCase.Value(bridge, provider, sender) log.SetOutput(buff) - useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, bridge, sender, recipient) + contracts := blockchain.RskContracts{Bridge: bridge} + useCase := liquidity_provider.NewCheckLiquidityUseCase(provider, provider, contracts, sender, recipient) err := useCase.Run(context.Background()) assert.Positive(t, buff.Bytes()) bridge.AssertExpectations(t) diff --git a/internal/usecases/liquidity_provider/get_providers.go b/internal/usecases/liquidity_provider/get_providers.go index 7bc1a796..44e28877 100644 --- a/internal/usecases/liquidity_provider/get_providers.go +++ b/internal/usecases/liquidity_provider/get_providers.go @@ -7,17 +7,17 @@ import ( ) type GetProvidersUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts } -func NewGetProvidersUseCase(lbc blockchain.LiquidityBridgeContract) *GetProvidersUseCase { - return &GetProvidersUseCase{lbc: lbc} +func NewGetProvidersUseCase(contracts blockchain.RskContracts) *GetProvidersUseCase { + return &GetProvidersUseCase{contracts: contracts} } func (useCase *GetProvidersUseCase) Run() ([]liquidity_provider.RegisteredLiquidityProvider, error) { var err error var providers []liquidity_provider.RegisteredLiquidityProvider - if providers, err = useCase.lbc.GetProviders(); err != nil { + if providers, err = useCase.contracts.Lbc.GetProviders(); err != nil { return providers, usecases.WrapUseCaseError(usecases.GetProvidersId, err) } return providers, nil diff --git a/internal/usecases/liquidity_provider/get_providers_test.go b/internal/usecases/liquidity_provider/get_providers_test.go index 5650f652..33d1f3f9 100644 --- a/internal/usecases/liquidity_provider/get_providers_test.go +++ b/internal/usecases/liquidity_provider/get_providers_test.go @@ -2,6 +2,7 @@ package liquidity_provider_test import ( "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test/mocks" @@ -23,7 +24,8 @@ func TestGetProvidersUseCase_Run(t *testing.T) { } lbc.On("GetProviders").Return([]lpEntity.RegisteredLiquidityProvider{provider}, nil).Once() - useCase := liquidity_provider.NewGetProvidersUseCase(lbc) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewGetProvidersUseCase(contracts) result, err := useCase.Run() lbc.AssertExpectations(t) @@ -39,7 +41,8 @@ func TestGetProvidersUseCase_Run_Fail(t *testing.T) { errors.New("some error"), ).Once() - useCase := liquidity_provider.NewGetProvidersUseCase(lbc) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewGetProvidersUseCase(contracts) result, err := useCase.Run() lbc.AssertExpectations(t) diff --git a/internal/usecases/liquidity_provider/penalization_alert.go b/internal/usecases/liquidity_provider/penalization_alert.go index b75e29ee..fcd43368 100644 --- a/internal/usecases/liquidity_provider/penalization_alert.go +++ b/internal/usecases/liquidity_provider/penalization_alert.go @@ -10,18 +10,18 @@ import ( ) type PenalizationAlertUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts sender entities.AlertSender recipient string } -func NewPenalizationAlertUseCase(lbc blockchain.LiquidityBridgeContract, sender entities.AlertSender, recipient string) *PenalizationAlertUseCase { - return &PenalizationAlertUseCase{lbc: lbc, sender: sender, recipient: recipient} +func NewPenalizationAlertUseCase(contracts blockchain.RskContracts, sender entities.AlertSender, recipient string) *PenalizationAlertUseCase { + return &PenalizationAlertUseCase{contracts: contracts, sender: sender, recipient: recipient} } func (useCase *PenalizationAlertUseCase) Run(ctx context.Context, fromBlock, toBlock uint64) error { var body string - events, err := useCase.lbc.GetPeginPunishmentEvents(ctx, fromBlock, &toBlock) + events, err := useCase.contracts.Lbc.GetPeginPunishmentEvents(ctx, fromBlock, &toBlock) if err != nil { return usecases.WrapUseCaseError(usecases.PenalizationId, err) } diff --git a/internal/usecases/liquidity_provider/penalization_alert_test.go b/internal/usecases/liquidity_provider/penalization_alert_test.go index 38c6f33c..20316367 100644 --- a/internal/usecases/liquidity_provider/penalization_alert_test.go +++ b/internal/usecases/liquidity_provider/penalization_alert_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test/mocks" @@ -53,7 +54,8 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { ).Return(nil).Once() } - useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, recipient) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewPenalizationAlertUseCase(contracts, sender, recipient) err := useCase.Run(context.Background(), 5, 10) require.NoError(t, err) lbc.AssertExpectations(t) @@ -65,7 +67,8 @@ func TestPenalizationAlertUseCase_Run_GetEvents(t *testing.T) { sender := &mocks.AlertSenderMock{} lbc.On("GetPeginPunishmentEvents", mock.AnythingOfType("context.backgroundCtx"), uint64(5), mock.Anything). Return([]lp.PunishmentEvent{}, assert.AnError).Once() - useCase := liquidity_provider.NewPenalizationAlertUseCase(lbc, sender, "recipient") + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewPenalizationAlertUseCase(contracts, sender, "recipient") err := useCase.Run(context.Background(), 5, 10) lbc.AssertExpectations(t) require.Error(t, err) diff --git a/internal/usecases/liquidity_provider/registration.go b/internal/usecases/liquidity_provider/registration.go index 613e147a..2016d220 100644 --- a/internal/usecases/liquidity_provider/registration.go +++ b/internal/usecases/liquidity_provider/registration.go @@ -9,12 +9,12 @@ import ( ) type RegistrationUseCase struct { - lbc blockchain.LiquidityBridgeContract - provider liquidity_provider.LiquidityProvider + contracts blockchain.RskContracts + provider liquidity_provider.LiquidityProvider } -func NewRegistrationUseCase(lbc blockchain.LiquidityBridgeContract, provider liquidity_provider.LiquidityProvider) *RegistrationUseCase { - return &RegistrationUseCase{lbc: lbc, provider: provider} +func NewRegistrationUseCase(contracts blockchain.RskContracts, provider liquidity_provider.LiquidityProvider) *RegistrationUseCase { + return &RegistrationUseCase{contracts: contracts, provider: provider} } type collateralInfo struct { @@ -85,13 +85,13 @@ func (useCase *RegistrationUseCase) getCollateralInfo() (collateralInfo, error) var err error var peginCollateral, pegoutCollateral, minimumCollateral *entities.Wei - if minimumCollateral, err = useCase.lbc.GetMinimumCollateral(); err != nil { + if minimumCollateral, err = useCase.contracts.Lbc.GetMinimumCollateral(); err != nil { return collateralInfo{}, err } - if peginCollateral, err = useCase.lbc.GetCollateral(useCase.provider.RskAddress()); err != nil { + if peginCollateral, err = useCase.contracts.Lbc.GetCollateral(useCase.provider.RskAddress()); err != nil { return collateralInfo{}, err } - if pegoutCollateral, err = useCase.lbc.GetPegoutCollateral(useCase.provider.RskAddress()); err != nil { + if pegoutCollateral, err = useCase.contracts.Lbc.GetPegoutCollateral(useCase.provider.RskAddress()); err != nil { return collateralInfo{}, err } return collateralInfo{ @@ -104,11 +104,11 @@ func (useCase *RegistrationUseCase) getCollateralInfo() (collateralInfo, error) func (useCase *RegistrationUseCase) getOperationalInfo() (operationalInfo, error) { var operationalForPegin, operationalForPegout bool var err error - if operationalForPegin, err = useCase.lbc.IsOperationalPegin(useCase.provider.RskAddress()); err != nil { + if operationalForPegin, err = useCase.contracts.Lbc.IsOperationalPegin(useCase.provider.RskAddress()); err != nil { return operationalInfo{}, err } - if operationalForPegout, err = useCase.lbc.IsOperationalPegout(useCase.provider.RskAddress()); err != nil { + if operationalForPegout, err = useCase.contracts.Lbc.IsOperationalPegout(useCase.provider.RskAddress()); err != nil { return operationalInfo{}, err } @@ -127,7 +127,7 @@ func (useCase *RegistrationUseCase) isProviderOperational(providerType liquidity func (useCase *RegistrationUseCase) registerProvider(params blockchain.ProviderRegistrationParams, collateral collateralInfo) (int64, error) { value := new(entities.Wei) txConfig := blockchain.NewTransactionConfig(value.Mul(collateral.minimumCollateral, entities.NewUWei(2)), 0, nil) - if id, err := useCase.lbc.RegisterProvider(txConfig, params); err != nil { + if id, err := useCase.contracts.Lbc.RegisterProvider(txConfig, params); err != nil { return 0, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } else { return id, nil @@ -155,7 +155,7 @@ func (useCase *RegistrationUseCase) addPeginCollateral( } collateralToAdd := new(entities.Wei) log.Debug("Adding pegin collateral...") - if err = useCase.lbc.AddCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.peginCollateral)); err != nil { + if err = useCase.contracts.Lbc.AddCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.peginCollateral)); err != nil { return false, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } else { return true, nil @@ -173,7 +173,7 @@ func (useCase *RegistrationUseCase) addPegoutCollateral( } collateralToAdd := new(entities.Wei) log.Debug("Adding pegout collateral...") - if err = useCase.lbc.AddPegoutCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.pegoutCollateral)); err != nil { + if err = useCase.contracts.Lbc.AddPegoutCollateral(collateralToAdd.Sub(collateral.minimumCollateral, collateral.pegoutCollateral)); err != nil { return false, usecases.WrapUseCaseError(usecases.ProviderRegistrationId, err) } else { return true, nil diff --git a/internal/usecases/liquidity_provider/registration_test.go b/internal/usecases/liquidity_provider/registration_test.go index 0159ca37..a9cb7349 100644 --- a/internal/usecases/liquidity_provider/registration_test.go +++ b/internal/usecases/liquidity_provider/registration_test.go @@ -22,7 +22,8 @@ func TestRegistrationUseCase_Run_AlreadyRegistered(t *testing.T) { lbc.On("IsOperationalPegout", mock.Anything).Return(true, nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) @@ -41,7 +42,8 @@ func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { } lbc := &mocks.LbcMock{} provider := &mocks.ProviderMock{} - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) var id int64 var err error for _, c := range cases { @@ -61,7 +63,8 @@ func TestRegistrationUseCase_Run_AddPeginCollateralIfNotOperational(t *testing.T lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegin") id, err := useCase.Run(params) lbc.AssertExpectations(t) @@ -81,7 +84,8 @@ func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing. lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegout") id, err := useCase.Run(params) lbc.AssertExpectations(t) @@ -102,7 +106,8 @@ func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) @@ -125,7 +130,8 @@ func TestRegistrationUseCase_Run(t *testing.T) { Return(int64(1), nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) @@ -144,7 +150,8 @@ func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { testCase.Value(lbc) // setup function provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") - useCase := liquidity_provider.NewRegistrationUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) diff --git a/internal/usecases/liquidity_provider/resign.go b/internal/usecases/liquidity_provider/resign.go index 56e11f32..db936a48 100644 --- a/internal/usecases/liquidity_provider/resign.go +++ b/internal/usecases/liquidity_provider/resign.go @@ -7,23 +7,23 @@ import ( ) type ResignUseCase struct { - lbc blockchain.LiquidityBridgeContract - provider liquidity_provider.LiquidityProvider + contracts blockchain.RskContracts + provider liquidity_provider.LiquidityProvider } -func NewResignUseCase(lbc blockchain.LiquidityBridgeContract, provider liquidity_provider.LiquidityProvider) *ResignUseCase { - return &ResignUseCase{lbc: lbc, provider: provider} +func NewResignUseCase(contracts blockchain.RskContracts, provider liquidity_provider.LiquidityProvider) *ResignUseCase { + return &ResignUseCase{contracts: contracts, provider: provider} } func (useCase *ResignUseCase) Run() error { var err error - _, err = ValidateConfiguredProvider(useCase.provider, useCase.lbc) + _, err = ValidateConfiguredProvider(useCase.provider, useCase.contracts.Lbc) if err != nil { return usecases.WrapUseCaseError(usecases.ProviderResignId, err) } - if err = useCase.lbc.ProviderResign(); err != nil { + if err = useCase.contracts.Lbc.ProviderResign(); err != nil { return usecases.WrapUseCaseError(usecases.ProviderResignId, err) } return nil diff --git a/internal/usecases/liquidity_provider/resign_test.go b/internal/usecases/liquidity_provider/resign_test.go index 309d53b5..777ef6d1 100644 --- a/internal/usecases/liquidity_provider/resign_test.go +++ b/internal/usecases/liquidity_provider/resign_test.go @@ -1,6 +1,7 @@ package liquidity_provider_test import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" @@ -21,7 +22,8 @@ func TestResignUseCase_Run(t *testing.T) { }, }, nil) lbc.On("ProviderResign").Return(nil).Once() - useCase := liquidity_provider.NewResignUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewResignUseCase(contracts, provider) err := useCase.Run() lbc.AssertExpectations(t) require.NoError(t, err) @@ -37,7 +39,8 @@ func TestResignUseCase_Run_NotRegistered(t *testing.T) { Address: "0x02", }, }, nil) - useCase := liquidity_provider.NewResignUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewResignUseCase(contracts, provider) err := useCase.Run() lbc.AssertExpectations(t) require.ErrorIs(t, err, usecases.ProviderConfigurationError) @@ -54,7 +57,8 @@ func TestResignUseCase_Run_Error(t *testing.T) { }, }, nil) lbc.On("ProviderResign").Return(assert.AnError).Once() - useCase := liquidity_provider.NewResignUseCase(lbc, provider) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := liquidity_provider.NewResignUseCase(contracts, provider) err := useCase.Run() lbc.AssertExpectations(t) require.Error(t, err) diff --git a/internal/usecases/pegin/accept_pegin_quote.go b/internal/usecases/pegin/accept_pegin_quote.go index 4f638f6d..d78ef2bb 100644 --- a/internal/usecases/pegin/accept_pegin_quote.go +++ b/internal/usecases/pegin/accept_pegin_quote.go @@ -13,9 +13,8 @@ import ( type AcceptQuoteUseCase struct { quoteRepository quote.PeginQuoteRepository - bridge blockchain.RootstockBridge - btc blockchain.BitcoinNetwork - rsk blockchain.RootstockRpcServer + contracts blockchain.RskContracts + rpc blockchain.Rpc lp liquidity_provider.LiquidityProvider peginLp liquidity_provider.PeginLiquidityProvider eventBus entities.EventBus @@ -24,9 +23,8 @@ type AcceptQuoteUseCase struct { func NewAcceptQuoteUseCase( quoteRepository quote.PeginQuoteRepository, - bridge blockchain.RootstockBridge, - btc blockchain.BitcoinNetwork, - rsk blockchain.RootstockRpcServer, + contracts blockchain.RskContracts, + rpc blockchain.Rpc, lp liquidity_provider.LiquidityProvider, peginLp liquidity_provider.PeginLiquidityProvider, eventBus entities.EventBus, @@ -34,9 +32,8 @@ func NewAcceptQuoteUseCase( ) *AcceptQuoteUseCase { return &AcceptQuoteUseCase{ quoteRepository: quoteRepository, - bridge: bridge, - btc: btc, - rsk: rsk, + contracts: contracts, + rpc: rpc, lp: lp, peginLp: peginLp, eventBus: eventBus, @@ -103,10 +100,10 @@ func (useCase *AcceptQuoteUseCase) calculateDerivationAddress(quoteHashBytes []b var fedInfo blockchain.FederationInfo var userBtcAddress, lpBtcAddress, lbcAddress []byte - if userBtcAddress, err = useCase.btc.DecodeAddress(peginQuote.BtcRefundAddress, true); err != nil { + if userBtcAddress, err = useCase.rpc.Btc.DecodeAddress(peginQuote.BtcRefundAddress, true); err != nil { errorArgs["btcAddress"] = peginQuote.BtcRefundAddress return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, err, errorArgs) - } else if lpBtcAddress, err = useCase.btc.DecodeAddress(peginQuote.LpBtcAddress, true); err != nil { + } else if lpBtcAddress, err = useCase.rpc.Btc.DecodeAddress(peginQuote.LpBtcAddress, true); err != nil { errorArgs["btcAddress"] = peginQuote.LpBtcAddress return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, err, errorArgs) } else if lbcAddress, err = blockchain.DecodeStringTrimPrefix(peginQuote.LbcAddress); err != nil { @@ -114,10 +111,10 @@ func (useCase *AcceptQuoteUseCase) calculateDerivationAddress(quoteHashBytes []b return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseErrorArgs(usecases.AcceptPeginQuoteId, err, errorArgs) } - if fedInfo, err = useCase.bridge.FetchFederationInfo(); err != nil { + if fedInfo, err = useCase.contracts.Bridge.FetchFederationInfo(); err != nil { return blockchain.FlyoverDerivation{}, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) } - return useCase.bridge.GetFlyoverDerivationAddress(blockchain.FlyoverDerivationArgs{ + return useCase.contracts.Bridge.GetFlyoverDerivationAddress(blockchain.FlyoverDerivationArgs{ FedInfo: fedInfo, LbcAdress: lbcAddress, UserBtcRefundAddress: userBtcAddress, @@ -135,7 +132,7 @@ func (useCase *AcceptQuoteUseCase) calculateAndCheckLiquidity(ctx context.Contex entities.NewUWei(uint64(peginQuote.GasLimit)), entities.NewUWei(CallForUserExtraGas), ) - if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { + if gasPrice, err = useCase.rpc.Rsk.GasPrice(ctx); err != nil { return nil, usecases.WrapUseCaseError(usecases.AcceptPeginQuoteId, err) } gasCost := new(entities.Wei).Mul(gasLimit, gasPrice) diff --git a/internal/usecases/pegin/accept_pegin_quote_test.go b/internal/usecases/pegin/accept_pegin_quote_test.go index b43dff39..9027ffc0 100644 --- a/internal/usecases/pegin/accept_pegin_quote_test.go +++ b/internal/usecases/pegin/accept_pegin_quote_test.go @@ -44,13 +44,18 @@ var testPeginQuote = quote.PeginQuote{ ProductFeeAmount: 10, } +var federationInfo = blockchain.FederationInfo{ + FedSize: 1, + FedThreshold: 2, + PubKeys: []string{"01", "02", "03"}, + FedAddress: test.AnyAddress, + ActiveFedBlockHeight: 500, + IrisActivationHeight: 500, + ErpKeys: []string{"04", "05", "06"}, +} + func TestAcceptQuoteUseCase_Run(t *testing.T) { requiredLiquidity := entities.NewWei(9280000) - fedInfo := blockchain.FederationInfo{ - FedSize: 1, FedThreshold: 2, PubKeys: []string{"01", "02", "03"}, - FedAddress: test.AnyAddress, ActiveFedBlockHeight: 500, - IrisActivationHeight: 500, ErpKeys: []string{"04", "05", "06"}, - } retainedQuote := quote.RetainedPeginQuote{ QuoteHash: acceptPeginQuoteHash, DepositAddress: acceptPeginDerivationAddress, @@ -63,13 +68,13 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil) bridge := new(mocks.BridgeMock) - bridge.On("FetchFederationInfo").Return(fedInfo, nil) + bridge.On("FetchFederationInfo").Return(federationInfo, nil) lbcParsedAddress, _ := hex.DecodeString(strings.TrimPrefix(testPeginQuote.LbcAddress, "0x")) refundParsedAddress := []byte{4, 5, 6} lpParsedAddress := []byte{7, 8, 9} parsedHash, _ := hex.DecodeString(acceptPeginQuoteHash) bridge.On("GetFlyoverDerivationAddress", blockchain.FlyoverDerivationArgs{ - FedInfo: fedInfo, + FedInfo: federationInfo, LbcAdress: lbcParsedAddress, UserBtcRefundAddress: refundParsedAddress, LpBtcAddress: lpParsedAddress, @@ -91,7 +96,8 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { rsk := new(mocks.RskRpcMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) - useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Bridge: bridge} + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, blockchain.Rpc{Rsk: rsk, Btc: btc}, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) rsk.AssertExpectations(t) @@ -128,7 +134,9 @@ func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { mutex.On("Unlock").Return() rsk := new(mocks.RskRpcMock) - useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, rpc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) rsk.AssertNotCalled(t, "GasPrice") @@ -158,7 +166,9 @@ func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { mutex := new(mocks.MutexMock) rsk := new(mocks.RskRpcMock) - useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, rpc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) rsk.AssertNotCalled(t, "GasPrice") @@ -189,7 +199,9 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { mutex := new(mocks.MutexMock) rsk := new(mocks.RskRpcMock) - useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, rpc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) rsk.AssertNotCalled(t, "GasPrice") @@ -208,20 +220,11 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { requiredLiquidity := entities.NewWei(9280000) - fedInfo := blockchain.FederationInfo{ - FedSize: 1, - FedThreshold: 2, - PubKeys: []string{"01", "02", "03"}, - FedAddress: test.AnyAddress, - ActiveFedBlockHeight: 500, - IrisActivationHeight: 500, - ErpKeys: []string{"04", "05", "06"}, - } quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) bridge := new(mocks.BridgeMock) - bridge.On("FetchFederationInfo").Return(fedInfo, nil) + bridge.On("FetchFederationInfo").Return(federationInfo, nil) bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{ Address: "derivation address", RedeemScript: "any script", @@ -238,7 +241,9 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { rsk := new(mocks.RskRpcMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) - useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, rpc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), acceptPeginQuoteHash) rsk.AssertExpectations(t) @@ -268,7 +273,9 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { rsk := new(mocks.RskRpcMock) caseHash := acceptPeginQuoteHash setup(&caseHash, quoteRepository, bridge, btc, lp, rsk) - useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, bridge, btc, rsk, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, rpc, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), caseHash) rsk.AssertExpectations(t) @@ -284,15 +291,6 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { - fedInfo := blockchain.FederationInfo{ - FedSize: 1, - FedThreshold: 2, - PubKeys: []string{"01", "02", "03"}, - FedAddress: test.AnyAddress, - ActiveFedBlockHeight: 500, - IrisActivationHeight: 500, - ErpKeys: []string{"04", "05", "06"}, - } derivation := blockchain.FlyoverDerivation{Address: test.AnyAddress, RedeemScript: "any script"} return []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock){ @@ -351,7 +349,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() - bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, @@ -360,7 +358,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() - bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError).Once() }, @@ -370,7 +368,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() - bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() @@ -382,7 +380,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() - bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() // set derivation and signature to empty to malform the retained quote @@ -395,7 +393,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() - bridge.On("FetchFederationInfo").Return(fedInfo, nil).Once() + bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() diff --git a/internal/usecases/pegin/add_collateral.go b/internal/usecases/pegin/add_collateral.go index fdd4fc64..031176a3 100644 --- a/internal/usecases/pegin/add_collateral.go +++ b/internal/usecases/pegin/add_collateral.go @@ -8,21 +8,21 @@ import ( ) type AddCollateralUseCase struct { - lbc blockchain.LiquidityBridgeContract - lp liquidity_provider.LiquidityProvider + contracts blockchain.RskContracts + lp liquidity_provider.LiquidityProvider } -func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp liquidity_provider.LiquidityProvider) *AddCollateralUseCase { - return &AddCollateralUseCase{lbc: lbc, lp: lp} +func NewAddCollateralUseCase(contracts blockchain.RskContracts, lp liquidity_provider.LiquidityProvider) *AddCollateralUseCase { + return &AddCollateralUseCase{contracts: contracts, lp: lp} } func (useCase *AddCollateralUseCase) Run(amount *entities.Wei) (*entities.Wei, error) { var err error - minCollateral, err := useCase.lbc.GetMinimumCollateral() + minCollateral, err := useCase.contracts.Lbc.GetMinimumCollateral() if err != nil { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) } - collateral, err := useCase.lbc.GetCollateral(useCase.lp.RskAddress()) + collateral, err := useCase.contracts.Lbc.GetCollateral(useCase.lp.RskAddress()) if err != nil { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) } @@ -31,7 +31,7 @@ func (useCase *AddCollateralUseCase) Run(amount *entities.Wei) (*entities.Wei, e if minCollateral.Cmp(result) > 0 { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, usecases.InsufficientAmountError) } - err = useCase.lbc.AddCollateral(amount) + err = useCase.contracts.Lbc.AddCollateral(amount) if err != nil { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) } diff --git a/internal/usecases/pegin/add_collateral_test.go b/internal/usecases/pegin/add_collateral_test.go index cf2b7cb5..74abbfcd 100644 --- a/internal/usecases/pegin/add_collateral_test.go +++ b/internal/usecases/pegin/add_collateral_test.go @@ -2,6 +2,7 @@ package pegin_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test" @@ -20,7 +21,8 @@ func TestAddCollateralUseCase_Run(t *testing.T) { lbc.On("AddCollateral", value).Return(nil) lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(100), nil) - useCase := pegin.NewAddCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewAddCollateralUseCase(contracts, lp) result, err := useCase.Run(value) lp.AssertExpectations(t) lbc.AssertExpectations(t) @@ -35,7 +37,8 @@ func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { lp.On("RskAddress").Return("rskAddress") lbc.On("GetMinimumCollateral").Return(entities.NewWei(2000), nil) lbc.On("GetCollateral", mock.Anything).Return(entities.NewWei(100), nil) - useCase := pegin.NewAddCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewAddCollateralUseCase(contracts, lp) result, err := useCase.Run(value) lp.AssertExpectations(t) lbc.AssertExpectations(t) @@ -71,7 +74,8 @@ func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { for _, c := range cases { lbc := new(mocks.LbcMock) c.Value(lbc) - useCase := pegin.NewAddCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewAddCollateralUseCase(contracts, lp) result, err := useCase.Run(entities.NewWei(100)) lbc.AssertExpectations(t) assert.Nil(t, result) diff --git a/internal/usecases/pegin/call_for_user.go b/internal/usecases/pegin/call_for_user.go index 44747fdc..2c7cf876 100644 --- a/internal/usecases/pegin/call_for_user.go +++ b/internal/usecases/pegin/call_for_user.go @@ -14,31 +14,28 @@ import ( ) type CallForUserUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts quoteRepository quote.PeginQuoteRepository - btc blockchain.BitcoinNetwork + rpc blockchain.Rpc peginProvider liquidity_provider.LiquidityProvider eventBus entities.EventBus - rsk blockchain.RootstockRpcServer rskWalletMutex sync.Locker } func NewCallForUserUseCase( - lbc blockchain.LiquidityBridgeContract, + contracts blockchain.RskContracts, quoteRepository quote.PeginQuoteRepository, - btc blockchain.BitcoinNetwork, + rpc blockchain.Rpc, peginProvider liquidity_provider.LiquidityProvider, eventBus entities.EventBus, - rsk blockchain.RootstockRpcServer, rskWalletMutex sync.Locker, ) *CallForUserUseCase { return &CallForUserUseCase{ - lbc: lbc, + contracts: contracts, quoteRepository: quoteRepository, - btc: btc, + rpc: rpc, peginProvider: peginProvider, eventBus: eventBus, - rsk: rsk, rskWalletMutex: rskWalletMutex, } } @@ -117,7 +114,7 @@ func (useCase *CallForUserUseCase) calculateValueToSend( var contractBalance, networkBalance *entities.Wei var err error - if contractBalance, err = useCase.lbc.GetBalance(useCase.peginProvider.RskAddress()); err != nil { + if contractBalance, err = useCase.contracts.Lbc.GetBalance(useCase.peginProvider.RskAddress()); err != nil { return nil, useCase.publishErrorEvent(ctx, retainedQuote, peginQuote, err, true) } @@ -128,7 +125,7 @@ func (useCase *CallForUserUseCase) calculateValueToSend( return valueToSend, nil } - if networkBalance, err = useCase.rsk.GetBalance(ctx, useCase.peginProvider.RskAddress()); err != nil { + if networkBalance, err = useCase.rpc.Rsk.GetBalance(ctx, useCase.peginProvider.RskAddress()); err != nil { return nil, useCase.publishErrorEvent(ctx, retainedQuote, peginQuote, err, true) } else if networkBalance.Cmp(valueToSend) < 0 { return nil, useCase.publishErrorEvent(ctx, retainedQuote, peginQuote, usecases.NoLiquidityError, true) @@ -147,7 +144,7 @@ func (useCase *CallForUserUseCase) performCallForUser( var err error config := blockchain.NewTransactionConfig(valueToSend, uint64(peginQuote.GasLimit+CallForUserExtraGas), nil) - if callForUserTx, err = useCase.lbc.CallForUser(config, *peginQuote); err != nil { + if callForUserTx, err = useCase.contracts.Lbc.CallForUser(config, *peginQuote); err != nil { quoteState = quote.PeginStateCallForUserFailed } else { quoteState = quote.PeginStateCallForUserSucceeded @@ -175,7 +172,7 @@ func (useCase *CallForUserUseCase) validateBitcoinTx( var txConfirmations big.Int var err error - if txInfo, err = useCase.btc.GetTransactionInfo(bitcoinTx); err != nil { + if txInfo, err = useCase.rpc.Btc.GetTransactionInfo(bitcoinTx); err != nil { return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) } txConfirmations.SetUint64(txInfo.Confirmations) diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go index fcbdf72c..3f7bdb43 100644 --- a/internal/usecases/pegin/call_for_user_test.go +++ b/internal/usecases/pegin/call_for_user_test.go @@ -20,7 +20,6 @@ func TestCallForUserUseCase_Run(t *testing.T) { btcTx := "0x121a1b" callForUser := "0x1a1b1c" lpRskAddress := testPeginQuote.LpRskAddress - retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", DepositAddress: test.AnyAddress, @@ -67,9 +66,10 @@ func TestCallForUserUseCase_Run(t *testing.T) { })).Return(nil).Once() rsk := new(mocks.RskRpcMock) - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) - require.NoError(t, err) lbc.AssertExpectations(t) btc.AssertExpectations(t) @@ -97,7 +97,6 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { lp := new(mocks.ProviderMock) lp.On("RskAddress").Return(lpRskAddress).Twice() - lbc := new(mocks.LbcMock) lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(600), nil).Once() txConfig := blockchain.NewTransactionConfig(entities.NewWei(29400), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) @@ -129,7 +128,9 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { rsk := new(mocks.RskRpcMock) rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) require.NoError(t, err) @@ -166,7 +167,9 @@ func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { caseRetainedQuote := retainedPeginQuote setup(&caseRetainedQuote, rsk, lbc, btc, quoteRepository) - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), "btc tx hash", caseRetainedQuote) require.Error(t, err) @@ -261,7 +264,9 @@ func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { rsk := new(mocks.RskRpcMock) - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) require.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) @@ -311,7 +316,9 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { rsk := new(mocks.RskRpcMock) - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) require.ErrorIs(t, err, usecases.ExpiredQuoteError) quoteRepository.AssertExpectations(t) @@ -354,7 +361,9 @@ func TestCallForUserUseCase_Run_QuoteNotFound(t *testing.T) { rsk := new(mocks.RskRpcMock) - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) require.ErrorIs(t, err, usecases.QuoteNotFoundError) quoteRepository.AssertExpectations(t) @@ -408,7 +417,9 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { rsk := new(mocks.RskRpcMock) - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) require.ErrorIs(t, err, usecases.InsufficientAmountError) @@ -457,14 +468,14 @@ func TestCallForUserUseCase_Run_NoLiquidity(t *testing.T) { mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). - Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() rsk := new(mocks.RskRpcMock) - rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress). - Return(entities.NewWei(20000), nil).Once() + rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(20000), nil).Once() - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) require.ErrorIs(t, err, usecases.NoLiquidityError) @@ -518,16 +529,16 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). - Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() rsk := new(mocks.RskRpcMock) rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() - - useCase := pegin.NewCallForUserUseCase(lbc, quoteRepository, btc, lp, eventBus, rsk, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) require.Error(t, err) diff --git a/internal/usecases/pegin/get_collateral.go b/internal/usecases/pegin/get_collateral.go index 7f8af74d..9445936f 100644 --- a/internal/usecases/pegin/get_collateral.go +++ b/internal/usecases/pegin/get_collateral.go @@ -8,16 +8,16 @@ import ( ) type GetCollateralUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts peginProvider liquidity_provider.LiquidityProvider } -func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, peginProvider liquidity_provider.LiquidityProvider) *GetCollateralUseCase { - return &GetCollateralUseCase{lbc: lbc, peginProvider: peginProvider} +func NewGetCollateralUseCase(contracts blockchain.RskContracts, peginProvider liquidity_provider.LiquidityProvider) *GetCollateralUseCase { + return &GetCollateralUseCase{contracts: contracts, peginProvider: peginProvider} } func (useCase *GetCollateralUseCase) Run() (*entities.Wei, error) { - collateral, err := useCase.lbc.GetCollateral(useCase.peginProvider.RskAddress()) + collateral, err := useCase.contracts.Lbc.GetCollateral(useCase.peginProvider.RskAddress()) if err != nil { return nil, usecases.WrapUseCaseError(usecases.GetCollateralId, err) } diff --git a/internal/usecases/pegin/get_collateral_test.go b/internal/usecases/pegin/get_collateral_test.go index 3282807b..53061c63 100644 --- a/internal/usecases/pegin/get_collateral_test.go +++ b/internal/usecases/pegin/get_collateral_test.go @@ -2,6 +2,7 @@ package pegin_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" @@ -15,7 +16,8 @@ func TestGetCollateralUseCase_Run(t *testing.T) { value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("GetCollateral", "rskAddress").Return(value, nil) - useCase := pegin.NewGetCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewGetCollateralUseCase(contracts, lp) result, err := useCase.Run() lbc.AssertExpectations(t) require.NoError(t, err) @@ -27,7 +29,8 @@ func TestGetCollateralUseCase_Run_Error(t *testing.T) { lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("rskAddress") lbc.On("GetCollateral", "rskAddress").Return(entities.NewWei(0), assert.AnError) - useCase := pegin.NewGetCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewGetCollateralUseCase(contracts, lp) result, err := useCase.Run() lbc.AssertExpectations(t) require.Error(t, err) diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index ebf7d692..8853d196 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -12,11 +12,8 @@ import ( ) type GetQuoteUseCase struct { - rsk blockchain.RootstockRpcServer - btc blockchain.BitcoinNetwork - feeCollector blockchain.FeeCollector - bridge blockchain.RootstockBridge - lbc blockchain.LiquidityBridgeContract + rpc blockchain.Rpc + contracts blockchain.RskContracts peginQuoteRepository quote.PeginQuoteRepository lp liquidity_provider.LiquidityProvider peginLp liquidity_provider.PeginLiquidityProvider @@ -24,22 +21,16 @@ type GetQuoteUseCase struct { } func NewGetQuoteUseCase( - rsk blockchain.RootstockRpcServer, - btc blockchain.BitcoinNetwork, - feeCollector blockchain.FeeCollector, - bridge blockchain.RootstockBridge, - lbc blockchain.LiquidityBridgeContract, + rpc blockchain.Rpc, + contracts blockchain.RskContracts, peginQuoteRepository quote.PeginQuoteRepository, lp liquidity_provider.LiquidityProvider, peginLp liquidity_provider.PeginLiquidityProvider, feeCollectorAddress string, ) *GetQuoteUseCase { return &GetQuoteUseCase{ - rsk: rsk, - btc: btc, - feeCollector: feeCollector, - bridge: bridge, - lbc: lbc, + rpc: rpc, + contracts: contracts, peginQuoteRepository: peginQuoteRepository, lp: lp, peginLp: peginLp, @@ -89,12 +80,12 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPeginQuoteResult{}, usecases.WrapUseCaseErrorArgs(usecases.GetPeginQuoteId, err, errorArgs) } - estimatedCallGas, err = useCase.rsk.EstimateGas(ctx, request.callEoaOrContractAddress, request.valueToTransfer, request.callContractArguments) + estimatedCallGas, err = useCase.rpc.Rsk.EstimateGas(ctx, request.callEoaOrContractAddress, request.valueToTransfer, request.callContractArguments) if err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } - if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { + if gasPrice, err = useCase.rpc.Rsk.GasPrice(ctx); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } @@ -102,7 +93,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPeginQuoteResult{}, err } - if fedAddress, err = useCase.bridge.GetFedAddress(); err != nil { + if fedAddress, err = useCase.contracts.Bridge.GetFedAddress(); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } @@ -118,11 +109,11 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPeginQuoteResult{}, err } - if err = usecases.ValidateMinLockValue(usecases.GetPeginQuoteId, useCase.bridge, peginQuote.Total()); err != nil { + if err = usecases.ValidateMinLockValue(usecases.GetPeginQuoteId, useCase.contracts.Bridge, peginQuote.Total()); err != nil { return GetPeginQuoteResult{}, err } - if hash, err = useCase.lbc.HashPeginQuote(peginQuote); err != nil { + if hash, err = useCase.contracts.Lbc.HashPeginQuote(peginQuote); err != nil { return GetPeginQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } if err = useCase.peginQuoteRepository.InsertQuote(ctx, hash, peginQuote); err != nil { @@ -134,7 +125,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( func (useCase *GetQuoteUseCase) validateRequest(configuration liquidity_provider.PeginConfiguration, request QuoteRequest) (usecases.ErrorArgs, error) { var err error args := usecases.NewErrorArgs() - if err = useCase.btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { + if err = useCase.rpc.Btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { args["btcAddress"] = request.bitcoinRefundAddress return args, err } @@ -169,7 +160,7 @@ func (useCase *GetQuoteUseCase) buildPeginQuote( peginQuote := quote.PeginQuote{ FedBtcAddress: fedAddress, - LbcAddress: useCase.lbc.GetAddress(), + LbcAddress: useCase.contracts.Lbc.GetAddress(), LpRskAddress: useCase.lp.RskAddress(), BtcRefundAddress: request.bitcoinRefundAddress, RskRefundAddress: request.rskRefundAddress, @@ -201,10 +192,10 @@ func (useCase *GetQuoteUseCase) buildDaoAmounts(ctx context.Context, request Quo var daoFeePercentage uint64 var err error - if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { + if daoFeePercentage, err = useCase.contracts.FeeCollector.DaoFeePercentage(); err != nil { return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } - if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rpc.Rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } return daoTxAmounts, nil diff --git a/internal/usecases/pegin/get_pegin_quote_test.go b/internal/usecases/pegin/get_pegin_quote_test.go index d1d9d77e..0c91ade9 100644 --- a/internal/usecases/pegin/get_pegin_quote_test.go +++ b/internal/usecases/pegin/get_pegin_quote_test.go @@ -61,7 +61,9 @@ func TestGetQuoteUseCase_Run(t *testing.T) { lp.On("BtcAddress").Return(lpBtcAddress) btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) - useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") + contracts := blockchain.RskContracts{Lbc: lbc, FeeCollector: feeCollector, Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewGetQuoteUseCase(rpc, contracts, peginQuoteRepository, lp, lp, "feeCollectorAddress") result, err := useCase.Run(context.Background(), request) rsk.AssertExpectations(t) @@ -85,7 +87,21 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { bridge := new(mocks.BridgeMock) lbc := new(mocks.LbcMock) peginQuoteRepository := new(mocks.PeginQuoteRepositoryMock) - cases := test.Table[func(btc *mocks.BtcRpcMock) pegin.QuoteRequest, error]{ + cases := validateRequestTestCases() + for _, testCase := range cases { + btc := new(mocks.BtcRpcMock) + contracts := blockchain.RskContracts{Lbc: lbc, FeeCollector: feeCollector, Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewGetQuoteUseCase(rpc, contracts, peginQuoteRepository, lp, lp, "feeCollectorAddress") + result, err := useCase.Run(context.Background(), testCase.Value(btc)) + assert.Equal(t, pegin.GetPeginQuoteResult{}, result) + require.Error(t, err) + require.ErrorIs(t, err, testCase.Result) + } +} + +func validateRequestTestCases() test.Table[func(btc *mocks.BtcRpcMock) pegin.QuoteRequest, error] { + return test.Table[func(btc *mocks.BtcRpcMock) pegin.QuoteRequest, error]{ { Value: func(btc *mocks.BtcRpcMock) pegin.QuoteRequest { btc.On("ValidateAddress", test.AnyAddress).Return(blockchain.BtcAddressNotSupportedError) @@ -129,14 +145,6 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { }, Result: lpEntity.AmountOutOfRangeError, }, } - for _, testCase := range cases { - btc := new(mocks.BtcRpcMock) - useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") - result, err := useCase.Run(context.Background(), testCase.Value(btc)) - assert.Equal(t, pegin.GetPeginQuoteResult{}, result) - require.Error(t, err) - require.ErrorIs(t, err, testCase.Result) - } } func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { @@ -156,8 +164,9 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { btc.On("ValidateAddress", mock.Anything).Return(nil) setup(rsk, feeCollector, bridge, lbc, lp, peginQuoteRepository) - - useCase := pegin.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, peginQuoteRepository, lp, lp, "feeCollectorAddress") + contracts := blockchain.RskContracts{Lbc: lbc, FeeCollector: feeCollector, Bridge: bridge} + rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} + useCase := pegin.NewGetQuoteUseCase(rpc, contracts, peginQuoteRepository, lp, lp, "feeCollectorAddress") result, err := useCase.Run(context.Background(), request) rsk.AssertExpectations(t) feeCollector.AssertExpectations(t) diff --git a/internal/usecases/pegin/register_pegin.go b/internal/usecases/pegin/register_pegin.go index 461502a1..5ba9700c 100644 --- a/internal/usecases/pegin/register_pegin.go +++ b/internal/usecases/pegin/register_pegin.go @@ -12,28 +12,25 @@ import ( ) type RegisterPeginUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts quoteRepository quote.PeginQuoteRepository eventBus entities.EventBus - bridge blockchain.RootstockBridge - btc blockchain.BitcoinNetwork + rpc blockchain.Rpc rskWalletMutex sync.Locker } func NewRegisterPeginUseCase( - lbc blockchain.LiquidityBridgeContract, + contracts blockchain.RskContracts, quoteRepository quote.PeginQuoteRepository, eventBus entities.EventBus, - bridge blockchain.RootstockBridge, - btc blockchain.BitcoinNetwork, + rpc blockchain.Rpc, rskWalletMutex sync.Locker, ) *RegisterPeginUseCase { return &RegisterPeginUseCase{ - lbc: lbc, + contracts: contracts, quoteRepository: quoteRepository, eventBus: eventBus, - bridge: bridge, - btc: btc, + rpc: rpc, rskWalletMutex: rskWalletMutex, } } @@ -65,7 +62,7 @@ func (useCase *RegisterPeginUseCase) Run(ctx context.Context, retainedQuote quot useCase.rskWalletMutex.Lock() defer useCase.rskWalletMutex.Unlock() - if registerPeginTxHash, err = useCase.lbc.RegisterPegin(params); errors.Is(err, blockchain.WaitingForBridgeError) { + if registerPeginTxHash, err = useCase.contracts.Lbc.RegisterPegin(params); errors.Is(err, blockchain.WaitingForBridgeError) { return useCase.publishErrorEvent(ctx, retainedQuote, err, true) } else if err != nil { newState = quote.PeginStateRegisterPegInFailed @@ -119,15 +116,15 @@ func (useCase *RegisterPeginUseCase) buildRegisterPeginParams(peginQuote quote.P return blockchain.RegisterPeginParams{}, err } - if rawBtcTx, err = useCase.btc.GetRawTransaction(retainedQuote.UserBtcTxHash); err != nil { + if rawBtcTx, err = useCase.rpc.Btc.GetRawTransaction(retainedQuote.UserBtcTxHash); err != nil { return blockchain.RegisterPeginParams{}, err } - if pmt, err = useCase.btc.GetPartialMerkleTree(retainedQuote.UserBtcTxHash); err != nil { + if pmt, err = useCase.rpc.Btc.GetPartialMerkleTree(retainedQuote.UserBtcTxHash); err != nil { return blockchain.RegisterPeginParams{}, err } - if block, err = useCase.btc.GetTransactionBlockInfo(retainedQuote.UserBtcTxHash); err != nil { + if block, err = useCase.rpc.Btc.GetTransactionBlockInfo(retainedQuote.UserBtcTxHash); err != nil { return blockchain.RegisterPeginParams{}, err } @@ -143,9 +140,9 @@ func (useCase *RegisterPeginUseCase) buildRegisterPeginParams(peginQuote quote.P func (useCase *RegisterPeginUseCase) validateTransaction(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { var txInfo blockchain.BitcoinTransactionInformation var err error - if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.UserBtcTxHash); err != nil { + if txInfo, err = useCase.rpc.Btc.GetTransactionInfo(retainedQuote.UserBtcTxHash); err != nil { return useCase.publishErrorEvent(ctx, retainedQuote, err, true) - } else if txInfo.Confirmations < useCase.bridge.GetRequiredTxConfirmations() { + } else if txInfo.Confirmations < useCase.contracts.Bridge.GetRequiredTxConfirmations() { return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) } return nil diff --git a/internal/usecases/pegin/register_pegin_test.go b/internal/usecases/pegin/register_pegin_test.go index e5eed7fc..4336a5f9 100644 --- a/internal/usecases/pegin/register_pegin_test.go +++ b/internal/usecases/pegin/register_pegin_test.go @@ -72,7 +72,9 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegin.NewRegisterPeginUseCase(contracts, quoteRepository, eventBus, rpc, mutex) err := useCase.Run(context.Background(), retainedPeginQuote) require.NoError(t, err) @@ -112,7 +114,9 @@ func TestRegisterPeginUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { caseQuote := retainedPeginQuote setup(&caseQuote, lbc, quoteRepository, btc) - useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegin.NewRegisterPeginUseCase(contracts, quoteRepository, eventBus, rpc, mutex) err := useCase.Run(context.Background(), caseQuote) require.Error(t, err) @@ -217,7 +221,9 @@ func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { btc := new(mocks.BtcRpcMock) mutex := new(mocks.MutexMock) - useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegin.NewRegisterPeginUseCase(contracts, quoteRepository, eventBus, rpc, mutex) err := useCase.Run(context.Background(), retainedPeginQuote) @@ -264,7 +270,6 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.RegisterPeginCompletedEvent) bool { require.Error(t, event.Error) @@ -286,9 +291,10 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegin.NewRegisterPeginUseCase(contracts, quoteRepository, eventBus, rpc, mutex) err := useCase.Run(context.Background(), retainedPeginQuote) - require.Error(t, err) lbc.AssertExpectations(t) quoteRepository.AssertExpectations(t) @@ -324,7 +330,9 @@ func TestRegisterPeginUseCase_Run_NotEnoughConfirmations(t *testing.T) { bridge.On("GetRequiredTxConfirmations").Return(uint64(30)) testCase.setup(lbc, quoteRepository, btc) - useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegin.NewRegisterPeginUseCase(contracts, quoteRepository, eventBus, rpc, mutex) err := useCase.Run(context.Background(), retainedPeginQuote) require.ErrorIs(t, err, testCase.err) @@ -430,7 +438,9 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { eventBus := new(mocks.EventBusMock) setup(quoteRepository, eventBus) - useCase := pegin.NewRegisterPeginUseCase(lbc, quoteRepository, eventBus, bridge, btc, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegin.NewRegisterPeginUseCase(contracts, quoteRepository, eventBus, rpc, mutex) err := useCase.Run(context.Background(), retainedPeginQuote) require.Error(t, err) diff --git a/internal/usecases/pegin/withdraw_collateral.go b/internal/usecases/pegin/withdraw_collateral.go index 077eaec1..91cd0293 100644 --- a/internal/usecases/pegin/withdraw_collateral.go +++ b/internal/usecases/pegin/withdraw_collateral.go @@ -7,15 +7,15 @@ import ( ) type WithdrawCollateralUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts } -func NewWithdrawCollateralUseCase(lbc blockchain.LiquidityBridgeContract) *WithdrawCollateralUseCase { - return &WithdrawCollateralUseCase{lbc: lbc} +func NewWithdrawCollateralUseCase(contracts blockchain.RskContracts) *WithdrawCollateralUseCase { + return &WithdrawCollateralUseCase{contracts: contracts} } func (useCase *WithdrawCollateralUseCase) Run() error { - err := useCase.lbc.WithdrawCollateral() + err := useCase.contracts.Lbc.WithdrawCollateral() if err != nil && (strings.Contains(err.Error(), "LBC021") || strings.Contains(err.Error(), "LBC022")) { return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, usecases.ProviderNotResignedError) } else if err != nil { diff --git a/internal/usecases/pegin/withdraw_collateral_test.go b/internal/usecases/pegin/withdraw_collateral_test.go index defb4bc0..264c7e26 100644 --- a/internal/usecases/pegin/withdraw_collateral_test.go +++ b/internal/usecases/pegin/withdraw_collateral_test.go @@ -2,6 +2,7 @@ package pegin_test import ( "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin" "github.com/rsksmart/liquidity-provider-server/test/mocks" @@ -13,7 +14,8 @@ import ( func TestWithdrawCollateralUseCase_Run(t *testing.T) { lbc := new(mocks.LbcMock) lbc.On("WithdrawCollateral").Return(nil) - useCase := pegin.NewWithdrawCollateralUseCase(lbc) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewWithdrawCollateralUseCase(contracts) err := useCase.Run() lbc.AssertExpectations(t) require.NoError(t, err) @@ -21,7 +23,8 @@ func TestWithdrawCollateralUseCase_Run(t *testing.T) { func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { lbc := new(mocks.LbcMock) - useCase := pegin.NewWithdrawCollateralUseCase(lbc) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegin.NewWithdrawCollateralUseCase(contracts) lbc.On("WithdrawCollateral").Return(errors.New("LBC021")).Once() err := useCase.Run() diff --git a/internal/usecases/pegout/accept_pegout_quote.go b/internal/usecases/pegout/accept_pegout_quote.go index 52565050..854f6e87 100644 --- a/internal/usecases/pegout/accept_pegout_quote.go +++ b/internal/usecases/pegout/accept_pegout_quote.go @@ -12,7 +12,7 @@ import ( type AcceptQuoteUseCase struct { quoteRepository quote.PegoutQuoteRepository - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts lp liquidity_provider.LiquidityProvider pegoutLp liquidity_provider.PegoutLiquidityProvider eventBus entities.EventBus @@ -21,7 +21,7 @@ type AcceptQuoteUseCase struct { func NewAcceptQuoteUseCase( quoteRepository quote.PegoutQuoteRepository, - lbc blockchain.LiquidityBridgeContract, + contracts blockchain.RskContracts, lp liquidity_provider.LiquidityProvider, pegoutLp liquidity_provider.PegoutLiquidityProvider, eventBus entities.EventBus, @@ -29,7 +29,7 @@ func NewAcceptQuoteUseCase( ) *AcceptQuoteUseCase { return &AcceptQuoteUseCase{ quoteRepository: quoteRepository, - lbc: lbc, + contracts: contracts, lp: lp, pegoutLp: pegoutLp, eventBus: eventBus, @@ -79,7 +79,7 @@ func (useCase *AcceptQuoteUseCase) Run(ctx context.Context, quoteHash string) (q retainedQuote = "e.RetainedPegoutQuote{ QuoteHash: quoteHash, - DepositAddress: useCase.lbc.GetAddress(), + DepositAddress: useCase.contracts.Lbc.GetAddress(), Signature: quoteSignature, RequiredLiquidity: requiredLiquidity, State: quote.PegoutStateWaitingForDeposit, diff --git a/internal/usecases/pegout/accept_pegout_quote_test.go b/internal/usecases/pegout/accept_pegout_quote_test.go index 5b4f045b..433af67d 100644 --- a/internal/usecases/pegout/accept_pegout_quote_test.go +++ b/internal/usecases/pegout/accept_pegout_quote_test.go @@ -4,6 +4,7 @@ import ( "context" "github.com/go-playground/validator/v10" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" @@ -65,7 +66,8 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Once() mutex.On("Unlock").Once() - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) lbc.AssertExpectations(t) @@ -118,7 +120,8 @@ func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) lbc.AssertNotCalled(t, "GetAddress") @@ -162,7 +165,8 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) quoteRepositoryMock.AssertNotCalled(t, "GetRetainedQuote") @@ -184,7 +188,8 @@ func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) quoteRepositoryMock.AssertNotCalled(t, "GetRetainedQuote") @@ -232,7 +237,8 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Once() mutex.On("Unlock").Once() - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) lp.AssertExpectations(t) @@ -296,7 +302,8 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) lp := new(mocks.ProviderMock) c.Value(quoteRepositoryMock, lp) - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) lp.AssertExpectations(t) @@ -386,7 +393,8 @@ func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, lbc, lp, lp, eventBus, mutex) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) quoteRepositoryMock.AssertExpectations(t) e := &validator.ValidationErrors{} diff --git a/internal/usecases/pegout/add_collateral.go b/internal/usecases/pegout/add_collateral.go index e3709ae9..f88b84d1 100644 --- a/internal/usecases/pegout/add_collateral.go +++ b/internal/usecases/pegout/add_collateral.go @@ -8,21 +8,21 @@ import ( ) type AddCollateralUseCase struct { - lbc blockchain.LiquidityBridgeContract - lp liquidity_provider.LiquidityProvider + contracts blockchain.RskContracts + lp liquidity_provider.LiquidityProvider } -func NewAddCollateralUseCase(lbc blockchain.LiquidityBridgeContract, lp liquidity_provider.LiquidityProvider) *AddCollateralUseCase { - return &AddCollateralUseCase{lbc: lbc, lp: lp} +func NewAddCollateralUseCase(contracts blockchain.RskContracts, lp liquidity_provider.LiquidityProvider) *AddCollateralUseCase { + return &AddCollateralUseCase{contracts: contracts, lp: lp} } func (useCase *AddCollateralUseCase) Run(amount *entities.Wei) (*entities.Wei, error) { var err error - minCollateral, err := useCase.lbc.GetMinimumCollateral() + minCollateral, err := useCase.contracts.Lbc.GetMinimumCollateral() if err != nil { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) } - collateral, err := useCase.lbc.GetPegoutCollateral(useCase.lp.RskAddress()) + collateral, err := useCase.contracts.Lbc.GetPegoutCollateral(useCase.lp.RskAddress()) if err != nil { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, err) } @@ -31,7 +31,7 @@ func (useCase *AddCollateralUseCase) Run(amount *entities.Wei) (*entities.Wei, e if minCollateral.Cmp(result) > 0 { return nil, usecases.WrapUseCaseError(usecases.AddCollateralId, usecases.InsufficientAmountError) } - err = useCase.lbc.AddPegoutCollateral(amount) + err = useCase.contracts.Lbc.AddPegoutCollateral(amount) if err != nil { return nil, usecases.WrapUseCaseError(usecases.AddPegoutCollateralId, err) } diff --git a/internal/usecases/pegout/add_collateral_test.go b/internal/usecases/pegout/add_collateral_test.go index 6ddda45b..7fa56bbf 100644 --- a/internal/usecases/pegout/add_collateral_test.go +++ b/internal/usecases/pegout/add_collateral_test.go @@ -2,6 +2,7 @@ package pegout_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" @@ -20,7 +21,8 @@ func TestAddCollateralUseCase_Run(t *testing.T) { lbc.On("AddPegoutCollateral", value).Return(nil) lbc.On("GetMinimumCollateral").Return(entities.NewWei(100), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(100), nil) - useCase := pegout.NewAddCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAddCollateralUseCase(contracts, lp) result, err := useCase.Run(value) lp.AssertExpectations(t) lbc.AssertExpectations(t) @@ -35,7 +37,8 @@ func TestAddCollateralUseCase_Run_NotEnough(t *testing.T) { lp.On("RskAddress").Return("rskAddress") lbc.On("GetMinimumCollateral").Return(entities.NewWei(2000), nil) lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(100), nil) - useCase := pegout.NewAddCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAddCollateralUseCase(contracts, lp) result, err := useCase.Run(value) lp.AssertExpectations(t) lbc.AssertExpectations(t) @@ -71,7 +74,8 @@ func TestAddCollateralUseCase_Run_ErrorHandling(t *testing.T) { for _, c := range cases { lbc := new(mocks.LbcMock) c.Value(lbc) - useCase := pegout.NewAddCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewAddCollateralUseCase(contracts, lp) result, err := useCase.Run(entities.NewWei(100)) lbc.AssertExpectations(t) assert.Nil(t, result) diff --git a/internal/usecases/pegout/get_collateral.go b/internal/usecases/pegout/get_collateral.go index 19103b96..414ea596 100644 --- a/internal/usecases/pegout/get_collateral.go +++ b/internal/usecases/pegout/get_collateral.go @@ -8,16 +8,16 @@ import ( ) type GetCollateralUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts pegoutProvider liquidity_provider.LiquidityProvider } -func NewGetCollateralUseCase(lbc blockchain.LiquidityBridgeContract, pegoutProvider liquidity_provider.LiquidityProvider) *GetCollateralUseCase { - return &GetCollateralUseCase{lbc: lbc, pegoutProvider: pegoutProvider} +func NewGetCollateralUseCase(contracts blockchain.RskContracts, pegoutProvider liquidity_provider.LiquidityProvider) *GetCollateralUseCase { + return &GetCollateralUseCase{contracts: contracts, pegoutProvider: pegoutProvider} } func (useCase *GetCollateralUseCase) Run() (*entities.Wei, error) { - collateral, err := useCase.lbc.GetPegoutCollateral(useCase.pegoutProvider.RskAddress()) + collateral, err := useCase.contracts.Lbc.GetPegoutCollateral(useCase.pegoutProvider.RskAddress()) if err != nil { return nil, usecases.WrapUseCaseError(usecases.GetPegoutCollateralId, err) } diff --git a/internal/usecases/pegout/get_collateral_test.go b/internal/usecases/pegout/get_collateral_test.go index fe82dec5..a7b0029e 100644 --- a/internal/usecases/pegout/get_collateral_test.go +++ b/internal/usecases/pegout/get_collateral_test.go @@ -2,6 +2,7 @@ package pegout_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" @@ -15,7 +16,8 @@ func TestGetCollateralUseCase_Run(t *testing.T) { value := entities.NewWei(1000) lp.On("RskAddress").Return("rskAddress") lbc.On("GetPegoutCollateral", "rskAddress").Return(value, nil) - useCase := pegout.NewGetCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewGetCollateralUseCase(contracts, lp) result, err := useCase.Run() lbc.AssertExpectations(t) require.NoError(t, err) @@ -27,7 +29,8 @@ func TestGetCollateralUseCase_Run_Error(t *testing.T) { lp := new(mocks.ProviderMock) lp.On("RskAddress").Return("rskAddress") lbc.On("GetPegoutCollateral", "rskAddress").Return(entities.NewWei(0), assert.AnError) - useCase := pegout.NewGetCollateralUseCase(lbc, lp) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewGetCollateralUseCase(contracts, lp) result, err := useCase.Run() lbc.AssertExpectations(t) require.Error(t, err) diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index 615fa724..e8aa2f34 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -12,11 +12,8 @@ import ( ) type GetQuoteUseCase struct { - rsk blockchain.RootstockRpcServer - btc blockchain.BitcoinNetwork - feeCollector blockchain.FeeCollector - bridge blockchain.RootstockBridge - lbc blockchain.LiquidityBridgeContract + rpc blockchain.Rpc + contracts blockchain.RskContracts pegoutQuoteRepository quote.PegoutQuoteRepository lp liquidity_provider.LiquidityProvider pegoutLp liquidity_provider.PegoutLiquidityProvider @@ -25,11 +22,8 @@ type GetQuoteUseCase struct { } func NewGetQuoteUseCase( - rsk blockchain.RootstockRpcServer, - btc blockchain.BitcoinNetwork, - feeCollector blockchain.FeeCollector, - bridge blockchain.RootstockBridge, - lbc blockchain.LiquidityBridgeContract, + rpc blockchain.Rpc, + contracts blockchain.RskContracts, pegoutQuoteRepository quote.PegoutQuoteRepository, lp liquidity_provider.LiquidityProvider, pegoutLp liquidity_provider.PegoutLiquidityProvider, @@ -37,11 +31,8 @@ func NewGetQuoteUseCase( feeCollectorAddress string, ) *GetQuoteUseCase { return &GetQuoteUseCase{ - rsk: rsk, - btc: btc, - feeCollector: feeCollector, - bridge: bridge, - lbc: lbc, + rpc: rpc, + contracts: contracts, pegoutQuoteRepository: pegoutQuoteRepository, lp: lp, pegoutLp: pegoutLp, @@ -101,7 +92,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPegoutQuoteResult{}, err } - if gasPrice, err = useCase.rsk.GasPrice(ctx); err != nil { + if gasPrice, err = useCase.rpc.Rsk.GasPrice(ctx); err != nil { return GetPegoutQuoteResult{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } @@ -116,7 +107,7 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( return GetPegoutQuoteResult{}, err } - if err = usecases.ValidateMinLockValue(usecases.GetPegoutQuoteId, useCase.bridge, pegoutQuote.Total()); err != nil { + if err = usecases.ValidateMinLockValue(usecases.GetPegoutQuoteId, useCase.contracts.Bridge, pegoutQuote.Total()); err != nil { return GetPegoutQuoteResult{}, err } @@ -130,11 +121,11 @@ func (useCase *GetQuoteUseCase) Run(ctx context.Context, request QuoteRequest) ( func (useCase *GetQuoteUseCase) validateRequest(configuration liquidity_provider.PegoutConfiguration, request QuoteRequest) (usecases.ErrorArgs, error) { var err error errorArgs := usecases.NewErrorArgs() - if err = useCase.btc.ValidateAddress(request.to); err != nil { + if err = useCase.rpc.Btc.ValidateAddress(request.to); err != nil { errorArgs["btcAddress"] = request.to return errorArgs, err } - if err = useCase.btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { + if err = useCase.rpc.Btc.ValidateAddress(request.bitcoinRefundAddress); err != nil { errorArgs["btcAddress"] = request.bitcoinRefundAddress return errorArgs, err } @@ -162,7 +153,7 @@ func (useCase *GetQuoteUseCase) buildPegoutQuote( return quote.PegoutQuote{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } - if blockNumber, err = useCase.rsk.GetHeight(ctx); err != nil { + if blockNumber, err = useCase.rpc.Rsk.GetHeight(ctx); err != nil { return quote.PegoutQuote{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } @@ -171,7 +162,7 @@ func (useCase *GetQuoteUseCase) buildPegoutQuote( confirmationsForUserTx := generalConfiguration.RskConfirmations.ForValue(request.valueToTransfer) confirmationsForLpTx := generalConfiguration.BtcConfirmations.ForValue(request.valueToTransfer) pegoutQuote := quote.PegoutQuote{ - LbcAddress: useCase.lbc.GetAddress(), + LbcAddress: useCase.contracts.Lbc.GetAddress(), LpRskAddress: useCase.lp.RskAddress(), BtcRefundAddress: request.bitcoinRefundAddress, RskRefundAddress: request.rskRefundAddress, @@ -202,10 +193,10 @@ func (useCase *GetQuoteUseCase) buildDaoAmounts(ctx context.Context, request Quo var daoTxAmounts usecases.DaoAmounts var daoFeePercentage uint64 var err error - if daoFeePercentage, err = useCase.feeCollector.DaoFeePercentage(); err != nil { + if daoFeePercentage, err = useCase.contracts.FeeCollector.DaoFeePercentage(); err != nil { return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } - if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { + if daoTxAmounts, err = usecases.CalculateDaoAmounts(ctx, useCase.rpc.Rsk, request.valueToTransfer, daoFeePercentage, useCase.feeCollectorAddress); err != nil { return usecases.DaoAmounts{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } return daoTxAmounts, nil @@ -214,7 +205,7 @@ func (useCase *GetQuoteUseCase) buildDaoAmounts(ctx context.Context, request Quo func (useCase *GetQuoteUseCase) persistQuote(ctx context.Context, pegoutQuote quote.PegoutQuote) (string, error) { var hash string var err error - if hash, err = useCase.lbc.HashPegoutQuote(pegoutQuote); err != nil { + if hash, err = useCase.contracts.Lbc.HashPegoutQuote(pegoutQuote); err != nil { return "", usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index e9d8241a..0fa73230 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -39,7 +39,9 @@ func TestGetQuoteUseCase_Run(t *testing.T) { btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) feeCollectorAddress := "feeCollectorAddress" - useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + contracts := blockchain.RskContracts{Lbc: lbc, FeeCollector: feeCollector, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc, Rsk: rsk} + useCase := pegout.NewGetQuoteUseCase(rpc, contracts, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) request := pegout.NewQuoteRequest( "mvL2bVzGUeC9oqVyQWJ4PxQspFzKgjzAqe", entities.NewWei(1000000000000000000), @@ -71,7 +73,9 @@ func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { for _, testCase := range cases { btc := new(mocks.BtcRpcMock) lp := new(mocks.ProviderMock) - useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + contracts := blockchain.RskContracts{Lbc: lbc, FeeCollector: feeCollector, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc, Rsk: rsk} + useCase := pegout.NewGetQuoteUseCase(rpc, contracts, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) result, err := useCase.Run(context.Background(), testCase.Value(btc, lp)) assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) require.Error(t, err) @@ -172,7 +176,9 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) btc := new(mocks.BtcRpcMock) btc.On("ValidateAddress", mock.Anything).Return(nil) - useCase := pegout.NewGetQuoteUseCase(rsk, btc, feeCollector, bridge, lbc, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) + contracts := blockchain.RskContracts{Lbc: lbc, FeeCollector: feeCollector, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc, Rsk: rsk} + useCase := pegout.NewGetQuoteUseCase(rpc, contracts, pegoutQuoteRepository, lp, lp, btcWallet, feeCollectorAddress) result, err := useCase.Run(context.Background(), request) assert.Equal(t, pegout.GetPegoutQuoteResult{}, result) require.Error(t, err) diff --git a/internal/usecases/pegout/init_deposit_cache.go b/internal/usecases/pegout/init_deposit_cache.go index f27410c7..c1d81354 100644 --- a/internal/usecases/pegout/init_deposit_cache.go +++ b/internal/usecases/pegout/init_deposit_cache.go @@ -9,23 +9,23 @@ import ( type InitPegoutDepositCacheUseCase struct { pegoutRepository quote.PegoutQuoteRepository - lbc blockchain.LiquidityBridgeContract - rskRpc blockchain.RootstockRpcServer + contracts blockchain.RskContracts + rpc blockchain.Rpc } -func NewInitPegoutDepositCacheUseCase(pegoutRepository quote.PegoutQuoteRepository, lbc blockchain.LiquidityBridgeContract, rskRpc blockchain.RootstockRpcServer) *InitPegoutDepositCacheUseCase { - return &InitPegoutDepositCacheUseCase{pegoutRepository: pegoutRepository, lbc: lbc, rskRpc: rskRpc} +func NewInitPegoutDepositCacheUseCase(pegoutRepository quote.PegoutQuoteRepository, contracts blockchain.RskContracts, rpc blockchain.Rpc) *InitPegoutDepositCacheUseCase { + return &InitPegoutDepositCacheUseCase{pegoutRepository: pegoutRepository, contracts: contracts, rpc: rpc} } func (useCase *InitPegoutDepositCacheUseCase) Run(ctx context.Context, cacheStartBlock uint64) error { var deposits []quote.PegoutDeposit var err error var height uint64 - if height, err = useCase.rskRpc.GetHeight(ctx); err != nil { + if height, err = useCase.rpc.Rsk.GetHeight(ctx); err != nil { return usecases.WrapUseCaseError(usecases.InitPegoutDepositCacheId, err) } - if deposits, err = useCase.lbc.GetDepositEvents(ctx, cacheStartBlock, &height); err != nil { + if deposits, err = useCase.contracts.Lbc.GetDepositEvents(ctx, cacheStartBlock, &height); err != nil { return usecases.WrapUseCaseError(usecases.InitPegoutDepositCacheId, err) } diff --git a/internal/usecases/pegout/init_deposits_cache_test.go b/internal/usecases/pegout/init_deposits_cache_test.go index dfe3d19a..d0463e76 100644 --- a/internal/usecases/pegout/init_deposits_cache_test.go +++ b/internal/usecases/pegout/init_deposits_cache_test.go @@ -3,6 +3,7 @@ package pegout_test import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test" @@ -16,10 +17,10 @@ import ( func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { lbc := new(mocks.LbcMock) - rpc := new(mocks.RskRpcMock) + rsk := new(mocks.RskRpcMock) pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) height := uint64(10) - rpc.On("GetHeight", context.Background()).Return(height, nil) + rsk.On("GetHeight", context.Background()).Return(height, nil) events := []quote.PegoutDeposit{ { TxHash: "0x123456", @@ -40,9 +41,11 @@ func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { } lbc.On("GetDepositEvents", context.Background(), uint64(5), &height).Return(events, nil) pegoutRepository.On("UpsertPegoutDeposits", context.Background(), events).Return(nil) - useCase := pegout.NewInitPegoutDepositCacheUseCase(pegoutRepository, lbc, rpc) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk} + useCase := pegout.NewInitPegoutDepositCacheUseCase(pegoutRepository, contracts, rpc) err := useCase.Run(context.Background(), 5) - rpc.AssertExpectations(t) + rsk.AssertExpectations(t) lbc.AssertExpectations(t) pegoutRepository.AssertExpectations(t) require.NoError(t, err) @@ -75,7 +78,9 @@ func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { quoteRepository := new(mocks.PegoutQuoteRepositoryMock) rsk := new(mocks.RskRpcMock) c.Value(lbc, quoteRepository, rsk) - useCase := pegout.NewInitPegoutDepositCacheUseCase(quoteRepository, lbc, rsk) + contracts := blockchain.RskContracts{Lbc: lbc} + rpc := blockchain.Rpc{Rsk: rsk} + useCase := pegout.NewInitPegoutDepositCacheUseCase(quoteRepository, contracts, rpc) err := useCase.Run(context.Background(), 5) lbc.AssertExpectations(t) quoteRepository.AssertExpectations(t) diff --git a/internal/usecases/pegout/refund_pegout.go b/internal/usecases/pegout/refund_pegout.go index d78ac07b..bf64582f 100644 --- a/internal/usecases/pegout/refund_pegout.go +++ b/internal/usecases/pegout/refund_pegout.go @@ -23,30 +23,27 @@ const ( type RefundPegoutUseCase struct { quoteRepository quote.PegoutQuoteRepository - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts eventBus entities.EventBus - btc blockchain.BitcoinNetwork + rpc blockchain.Rpc rskWallet blockchain.RootstockWallet - bridge blockchain.RootstockBridge rskWalletMutex sync.Locker } func NewRefundPegoutUseCase( quoteRepository quote.PegoutQuoteRepository, - lbc blockchain.LiquidityBridgeContract, + contracts blockchain.RskContracts, eventBus entities.EventBus, - btc blockchain.BitcoinNetwork, + rpc blockchain.Rpc, rskWallet blockchain.RootstockWallet, - bridge blockchain.RootstockBridge, rskWalletMutex sync.Locker, ) *RefundPegoutUseCase { return &RefundPegoutUseCase{ quoteRepository: quoteRepository, - lbc: lbc, + contracts: contracts, eventBus: eventBus, - btc: btc, + rpc: rpc, rskWallet: rskWallet, - bridge: bridge, rskWalletMutex: rskWalletMutex, } } @@ -111,15 +108,15 @@ func (useCase *RefundPegoutUseCase) buildRefundPegoutParams(ctx context.Context, var rawTx, quoteHashBytes []byte var quoteHashFixedBytes [32]byte - if merkleBranch, err = useCase.btc.BuildMerkleBranch(retainedQuote.LpBtcTxHash); err != nil { + if merkleBranch, err = useCase.rpc.Btc.BuildMerkleBranch(retainedQuote.LpBtcTxHash); err != nil { return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } - if block, err = useCase.btc.GetTransactionBlockInfo(retainedQuote.LpBtcTxHash); err != nil { + if block, err = useCase.rpc.Btc.GetTransactionBlockInfo(retainedQuote.LpBtcTxHash); err != nil { return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } - if rawTx, err = useCase.btc.GetRawTransaction(retainedQuote.LpBtcTxHash); err != nil { + if rawTx, err = useCase.rpc.Btc.GetRawTransaction(retainedQuote.LpBtcTxHash); err != nil { return blockchain.RefundPegoutParams{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } @@ -145,7 +142,7 @@ func (useCase *RefundPegoutUseCase) sendRbtcToBridge(ctx context.Context, pegout value.Add(pegoutQuote.Value, pegoutQuote.CallFee) value.Add(value, pegoutQuote.GasFee) config := blockchain.NewTransactionConfig(value, bridgeConversionGasLimit, entities.NewWei(bridgeConversionGasPrice)) - txHash, err = useCase.rskWallet.SendRbtc(ctx, config, useCase.bridge.GetAddress()) + txHash, err = useCase.rskWallet.SendRbtc(ctx, config, useCase.contracts.Bridge.GetAddress()) if err == nil { log.Debugf("%s: transaction sent to the bridge successfully (%s)", usecases.RefundPegoutId, txHash) } @@ -167,7 +164,7 @@ func (useCase *RefundPegoutUseCase) performRefundPegout( var refundPegoutTxHash string var err, updateError error - if refundPegoutTxHash, err = useCase.lbc.RefundPegout(txConfig, params); errors.Is(err, blockchain.WaitingForBridgeError) { + if refundPegoutTxHash, err = useCase.contracts.Lbc.RefundPegout(txConfig, params); errors.Is(err, blockchain.WaitingForBridgeError) { return quote.RetainedPegoutQuote{}, useCase.publishErrorEvent(ctx, retainedQuote, err, true) } else if err != nil { newState = quote.PegoutStateRefundPegOutFailed @@ -196,7 +193,7 @@ func (useCase *RefundPegoutUseCase) validateBtcTransaction( ) error { var txInfo blockchain.BitcoinTransactionInformation var err error - if txInfo, err = useCase.btc.GetTransactionInfo(retainedQuote.LpBtcTxHash); err != nil { + if txInfo, err = useCase.rpc.Btc.GetTransactionInfo(retainedQuote.LpBtcTxHash); err != nil { return useCase.publishErrorEvent(ctx, retainedQuote, err, true) } else if txInfo.Confirmations < uint64(pegoutQuote.TransferConfirmations) { return useCase.publishErrorEvent(ctx, retainedQuote, usecases.NoEnoughConfirmationsError, true) diff --git a/internal/usecases/pegout/refund_pegout_test.go b/internal/usecases/pegout/refund_pegout_test.go index d7abc4f8..6b021e00 100644 --- a/internal/usecases/pegout/refund_pegout_test.go +++ b/internal/usecases/pegout/refund_pegout_test.go @@ -82,7 +82,7 @@ var btcRawTxMock = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, func TestRefundPegoutUseCase_Run(t *testing.T) { bridgeAddress := "0x1234" quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ + expectedRetained := quote.RetainedPegoutQuote{ QuoteHash: retainedQuote.QuoteHash, DepositAddress: retainedQuote.DepositAddress, Signature: retainedQuote.Signature, @@ -91,18 +91,10 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { UserRskTxHash: retainedQuote.UserRskTxHash, LpBtcTxHash: retainedQuote.LpBtcTxHash, RefundPegoutTxHash: refundPegoutTxHash, - }).Return(nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quote.RetainedPegoutQuote{ - QuoteHash: retainedQuote.QuoteHash, - DepositAddress: retainedQuote.DepositAddress, - Signature: retainedQuote.Signature, - RequiredLiquidity: retainedQuote.RequiredLiquidity, - State: quote.PegoutStateRefundPegOutSucceeded, - UserRskTxHash: retainedQuote.UserRskTxHash, - LpBtcTxHash: retainedQuote.LpBtcTxHash, - RefundPegoutTxHash: refundPegoutTxHash, - BridgeRefundTxHash: bridgeTxHash, - }).Return(nil).Once() + } + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetained).Return(nil).Once() + expectedRetained.BridgeRefundTxHash = bridgeTxHash + quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetained).Return(nil).Once() quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() lbc := new(mocks.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() @@ -129,9 +121,10 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { mutex.On("Unlock").Return().Once() mutex.On("Lock").Return().Once() - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), retainedQuote) - quoteRepository.AssertExpectations(t) lbc.AssertExpectations(t) eventBus.AssertExpectations(t) @@ -171,7 +164,9 @@ func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { mutex.On("Unlock").Return().Once() mutex.On("Lock").Return().Once() - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), retainedQuote) quoteRepository.AssertExpectations(t) @@ -227,7 +222,6 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { lbc.On("RefundPegout", mock.Anything, mock.Anything).Return("", blockchain.WaitingForBridgeError).Once() }, } - for _, setup := range recoverableSetups { eventBus := new(mocks.EventBusMock) quoteRepository := new(mocks.PegoutQuoteRepositoryMock) @@ -235,7 +229,9 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { btc := new(mocks.BtcRpcMock) rskWallet := new(mocks.RskWalletMock) setup(quoteRepository, lbc, btc, rskWallet) - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), retainedQuote) lbc.AssertExpectations(t) btc.AssertExpectations(t) @@ -296,7 +292,9 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { expected.State = quote.PegoutStateRefundPegOutFailed return assert.Equal(t, expected, q) })).Return(nil).Once() - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), caseQuote) lbc.AssertExpectations(t) btc.AssertExpectations(t) @@ -320,8 +318,9 @@ func TestRefundPegoutUseCase_Run_NoConfirmations(t *testing.T) { bridge := new(mocks.BridgeMock) mutex := new(mocks.MutexMock) - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) - + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), retainedQuote) quoteRepository.AssertExpectations(t) @@ -347,7 +346,9 @@ func TestRefundPegoutUseCase_Run_WrongState(t *testing.T) { bridge := new(mocks.BridgeMock) mutex := new(mocks.MutexMock) - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), wrongStateQuote) @@ -398,7 +399,9 @@ func TestRefundPegoutUseCase_Run_CorrectBridgeAmount(t *testing.T) { bridgeAddress). Return(bridgeTxHash, nil).Once() - useCase := pegout.NewRefundPegoutUseCase(quoteRepository, lbc, eventBus, btc, rskWallet, bridge, mutex) + contracts := blockchain.RskContracts{Lbc: lbc, Bridge: bridge} + rpc := blockchain.Rpc{Btc: btc} + useCase := pegout.NewRefundPegoutUseCase(quoteRepository, contracts, eventBus, rpc, rskWallet, mutex) err := useCase.Run(context.Background(), retainedQuote) quoteRepository.AssertExpectations(t) rskWallet.AssertExpectations(t) diff --git a/internal/usecases/pegout/send_pegout.go b/internal/usecases/pegout/send_pegout.go index 15bac1e4..0aa5c208 100644 --- a/internal/usecases/pegout/send_pegout.go +++ b/internal/usecases/pegout/send_pegout.go @@ -14,7 +14,7 @@ import ( type SendPegoutUseCase struct { btcWallet blockchain.BitcoinWallet quoteRepository quote.PegoutQuoteRepository - rsk blockchain.RootstockRpcServer + rpc blockchain.Rpc eventBus entities.EventBus btcWalletMutex sync.Locker } @@ -22,14 +22,14 @@ type SendPegoutUseCase struct { func NewSendPegoutUseCase( btcWallet blockchain.BitcoinWallet, quoteRepository quote.PegoutQuoteRepository, - rsk blockchain.RootstockRpcServer, + rpc blockchain.Rpc, eventBus entities.EventBus, btcWalletMutex sync.Locker, ) *SendPegoutUseCase { return &SendPegoutUseCase{ btcWallet: btcWallet, quoteRepository: quoteRepository, - rsk: rsk, + rpc: rpc, eventBus: eventBus, btcWalletMutex: btcWalletMutex, } @@ -113,11 +113,11 @@ func (useCase *SendPegoutUseCase) validateQuote( return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) } - if chainHeight, err = useCase.rsk.GetHeight(ctx); err != nil { + if chainHeight, err = useCase.rpc.Rsk.GetHeight(ctx); err != nil { return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) } - if receipt, err = useCase.rsk.GetTransactionReceipt(ctx, retainedQuote.UserRskTxHash); err != nil { + if receipt, err = useCase.rpc.Rsk.GetTransactionReceipt(ctx, retainedQuote.UserRskTxHash); err != nil { return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) } else if chainHeight-receipt.BlockNumber < uint64(pegoutQuote.DepositConfirmations) { return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.NoEnoughConfirmationsError, true) diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go index a358cf67..98dee85e 100644 --- a/internal/usecases/pegout/send_pegout_test.go +++ b/internal/usecases/pegout/send_pegout_test.go @@ -91,7 +91,8 @@ func TestSendPegoutUseCase_Run(t *testing.T) { updatedQuote.State = quote.PegoutStateSendPegoutSucceeded quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.NoError(t, err) @@ -152,7 +153,8 @@ func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { rsk := new(mocks.RskRpcMock) caseQuote := retainedQuote setup(&caseQuote, btcWallet, rsk, quoteRepository) - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), caseQuote) btcWallet.AssertExpectations(t) rsk.AssertExpectations(t) @@ -192,7 +194,8 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { updatedQuote.State = quote.PegoutStateSendPegoutFailed quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.ErrorIs(t, err, usecases.InsufficientAmountError) @@ -224,7 +227,8 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.ErrorIs(t, err, usecases.NoEnoughConfirmationsError) @@ -255,7 +259,8 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.ErrorIs(t, err, usecases.ExpiredQuoteError) @@ -287,7 +292,8 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.ErrorIs(t, err, usecases.NoLiquidityError) @@ -312,12 +318,11 @@ func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed require.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) - return assert.Equal(t, quote.PegoutQuote{}, event.PegoutQuote) && - assert.Equal(t, expected, event.RetainedQuote) && - assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + return assert.Equal(t, quote.PegoutQuote{}, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.ErrorIs(t, err, usecases.QuoteNotFoundError) @@ -340,9 +345,7 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed require.Error(t, event.Error) - return assert.Equal(t, pegoutQuote, event.PegoutQuote) && - assert.Equal(t, expected, event.RetainedQuote) && - assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) + return assert.Equal(t, pegoutQuote, event.PegoutQuote) && assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() @@ -364,7 +367,8 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { updatedQuote.State = quote.PegoutStateSendPegoutFailed quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), retainedQuote) require.Error(t, err) @@ -421,13 +425,13 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { })).Return().Once() }, } - for _, setup := range setups { caseQuote := retainedQuote quoteRepository := new(mocks.PegoutQuoteRepositoryMock) eventBus := new(mocks.EventBusMock) setup(&caseQuote, quoteRepository, eventBus) - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rsk, eventBus, mutex) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) err := useCase.Run(context.Background(), caseQuote) quoteRepository.AssertExpectations(t) require.Error(t, err) diff --git a/internal/usecases/pegout/withdraw_collateral.go b/internal/usecases/pegout/withdraw_collateral.go index 610a0c73..6c05d257 100644 --- a/internal/usecases/pegout/withdraw_collateral.go +++ b/internal/usecases/pegout/withdraw_collateral.go @@ -7,15 +7,15 @@ import ( ) type WithdrawCollateralUseCase struct { - lbc blockchain.LiquidityBridgeContract + contracts blockchain.RskContracts } -func NewWithdrawCollateralUseCase(lbc blockchain.LiquidityBridgeContract) *WithdrawCollateralUseCase { - return &WithdrawCollateralUseCase{lbc: lbc} +func NewWithdrawCollateralUseCase(contracts blockchain.RskContracts) *WithdrawCollateralUseCase { + return &WithdrawCollateralUseCase{contracts: contracts} } func (useCase *WithdrawCollateralUseCase) Run() error { - err := useCase.lbc.WithdrawPegoutCollateral() + err := useCase.contracts.Lbc.WithdrawPegoutCollateral() if err != nil && (strings.Contains(err.Error(), "LBC021") || strings.Contains(err.Error(), "LBC022")) { return usecases.WrapUseCaseError(usecases.WithdrawCollateralId, usecases.ProviderNotResignedError) } else if err != nil { diff --git a/internal/usecases/pegout/withdraw_collateral_test.go b/internal/usecases/pegout/withdraw_collateral_test.go index 7befb294..aa7a21c5 100644 --- a/internal/usecases/pegout/withdraw_collateral_test.go +++ b/internal/usecases/pegout/withdraw_collateral_test.go @@ -2,6 +2,7 @@ package pegout_test import ( "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout" "github.com/rsksmart/liquidity-provider-server/test/mocks" @@ -13,7 +14,8 @@ import ( func TestWithdrawCollateralUseCase_Run(t *testing.T) { lbc := new(mocks.LbcMock) lbc.On("WithdrawPegoutCollateral").Return(nil) - useCase := pegout.NewWithdrawCollateralUseCase(lbc) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewWithdrawCollateralUseCase(contracts) err := useCase.Run() lbc.AssertExpectations(t) require.NoError(t, err) @@ -21,7 +23,8 @@ func TestWithdrawCollateralUseCase_Run(t *testing.T) { func TestWithdrawCollateralUseCase_Run_ErrorHandling(t *testing.T) { lbc := new(mocks.LbcMock) - useCase := pegout.NewWithdrawCollateralUseCase(lbc) + contracts := blockchain.RskContracts{Lbc: lbc} + useCase := pegout.NewWithdrawCollateralUseCase(contracts) lbc.On("WithdrawPegoutCollateral").Return(errors.New("LBC021")).Once() err := useCase.Run() From 9ce24b70aa79d3e43b46e96d9b7bdbb93610dd0c Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 19 Mar 2024 10:41:38 +0100 Subject: [PATCH 031/113] fix: fix docker related sonar issues --- .gitignore | 1 + coverage/cover.out | 1517 +++++++++-------- docker-compose/bitcoind/Dockerfile | 12 +- docker-compose/lbc-deployer/Dockerfile | 14 +- .../local/docker-compose.lbc-deployer.yml | 7 +- docker-compose/local/lps-env.sh | 3 +- docker-compose/localstack/Dockerfile | 4 +- docker-compose/powpeg/pegin/Dockerfile | 11 +- docker-compose/powpeg/pegout/Dockerfile | 11 +- docker-compose/rskj/Dockerfile | 11 +- sonar-project.properties | 7 +- 11 files changed, 804 insertions(+), 794 deletions(-) diff --git a/.gitignore b/.gitignore index f2120f0c..a57b2387 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ integration/geth_keystore keystore/ build/ /**/.env.regtest +/**/gh_token.txt diff --git a/coverage/cover.out b/coverage/cover.out index 755eb858..d250aac2 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -1,122 +1,4 @@ mode: atomic -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:29.90,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.55,37.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:39.64,41.16 2 0 @@ -218,56 +100,57 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.2,194.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.16,196.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.2,198.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:31.28,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:40.108,42.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:42.16,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:46.2,60.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:60.16,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.2,63.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.67,69.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:73.2,73.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:73.29,74.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.21,76.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.2,78.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:81.125,83.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.16,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.2,92.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:100.2,109.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.24,110.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:110.40,112.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:115.2,117.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:120.2,121.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:124.2,125.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:125.16,127.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:128.2,128.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:131.46,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,136.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.91,139.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.67,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:151.115,156.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:156.16,158.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:159.2,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:164.2,165.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:165.29,167.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:167.10,174.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:175.3,175.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:175.39,177.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.3,178.119 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.2,181.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.30,184.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:185.2,185.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:188.46,190.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:69.67,72.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:76.2,76.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:76.29,77.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:77.21,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:81.2,81.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.125,86.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,95.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:103.2,112.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.24,113.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:113.40,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:118.2,120.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:123.2,124.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:124.16,126.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:131.2,131.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:134.46,136.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.16,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:139.2,139.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:139.91,142.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.2,143.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:146.67,148.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.16,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:151.2,151.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:154.115,159.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:159.16,161.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:162.2,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:167.2,168.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:168.29,170.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.10,177.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.3,178.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.39,180.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.3,181.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:184.2,184.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:184.30,187.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:188.2,188.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:191.46,193.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:195.48,197.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -315,19 +198,19 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 @@ -422,77 +305,6 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,4 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 18 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 8 @@ -563,16 +375,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -580,20 +383,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -611,67 +414,147 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 @@ -690,230 +573,106 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 67 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:34.23,45.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:47.108,53.84 5 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:53.84,55.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:55.8,55.30 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:55.30,58.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:60.2,60.28 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:60.28,63.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:65.2,68.95 3 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:68.95,70.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:70.8,70.33 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:70.33,75.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:77.2,77.93 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:77.93,79.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.2,81.62 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.62,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:84.2,84.88 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:84.88,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:88.2,97.8 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:100.153,106.100 5 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.100,109.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.8,109.101 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.101,112.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:112.8,112.99 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:112.99,115.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.2,117.69 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.69,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:120.2,126.4 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:129.136,138.59 5 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:138.59,140.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:141.2,144.81 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:144.81,147.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:148.2,148.31 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:151.159,158.67 6 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.67,160.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.2,161.99 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.99,163.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.2,164.95 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.95,166.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:167.2,167.71 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:167.71,169.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:171.2,177.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:15.133,17.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:19.87,22.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:25.2,26.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:29.2,31.35 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:31.35,33.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:34.2,35.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:35.16,37.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:38.2,38.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:34.23,44.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:46.125,51.62 4 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:51.62,53.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:55.2,55.98 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:55.98,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:57.8,57.30 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:57.30,59.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:61.2,61.28 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:61.28,63.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:65.2,65.92 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:65.92,67.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.2,72.98 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:72.98,74.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:76.2,78.104 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.104,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:81.2,81.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:81.16,84.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:85.2,85.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:94.9,96.18 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:96.18,98.88 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:98.88,100.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:101.3,106.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:109.2,109.21 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:116.26,120.99 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:120.99,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.2,125.47 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:125.47,127.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:127.8,129.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:131.2,131.103 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:131.103,133.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.8,133.48 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.48,135.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:136.2,136.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:144.37,150.83 5 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:150.83,152.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:152.8,154.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:156.2,165.27 5 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:173.9,178.73 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:178.73,180.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:181.2,182.74 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:182.74,184.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:186.2,187.44 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:187.44,196.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:197.2,197.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:13.104,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:17.110,20.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:20.16,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:23.2,23.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:15.144,17.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:19.67,21.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:21.16,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:36.20,48.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:64.16,72.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:79.109,88.87 8 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:88.87,90.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:92.2,93.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.16,95.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.2,97.59 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.59,99.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.2,101.75 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.75,103.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:105.2,105.66 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:105.66,107.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:109.2,117.138 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.138,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:121.2,121.115 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:121.115,123.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:125.2,125.68 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:125.68,127.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:128.2,128.87 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:128.87,130.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:131.2,131.69 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:134.152,137.81 3 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.81,140.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.2,141.56 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.56,144.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:145.2,145.64 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:145.64,148.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:149.2,149.77 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:149.77,151.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:152.2,152.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:162.29,166.54 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:166.54,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:170.2,193.59 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:193.59,195.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:196.2,196.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.121,204.81 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:204.81,206.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:207.2,207.156 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:207.156,209.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:210.2,210.26 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:30.25,39.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:41.109,48.65 6 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:48.65,50.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:52.2,52.98 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:52.98,54.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:54.8,54.30 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:54.30,56.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:58.2,58.71 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:58.71,60.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:62.2,62.92 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:62.92,64.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:66.2,68.116 3 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:68.116,70.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:70.8,70.23 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:70.23,72.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:72.8,74.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:76.2,84.104 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.104,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:87.2,87.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:87.16,90.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:91.2,91.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:94.152,99.18 5 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:99.18,101.88 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:101.88,103.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:104.3,108.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:110.2,110.21 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:113.172,118.81 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:118.81,120.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:122.2,122.92 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:122.92,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:126.2,126.90 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:126.90,128.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:130.2,130.95 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:130.95,132.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:134.2,140.8 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:143.125,146.91 3 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:146.91,148.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.8,148.79 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.79,150.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:151.2,151.12 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:13.102,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:17.55,19.104 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:19.104,21.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -961,19 +720,19 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 @@ -1067,11 +826,11 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.137,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.132,16.2 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:18.63,23.16 4 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:23.16,25.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.68 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.68,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.78 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.78,29.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:30.2,30.12 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:37.26,45.2 1 8 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:47.70,49.16 2 8 @@ -1096,11 +855,11 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:32.2,32.33 1 5 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.90,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.61 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.61,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.85,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.71 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.71,22.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.147,20.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.2,28.31 1 1 @@ -1115,7 +874,7 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.8,66.69 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.69,68.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:70.2,70.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.137,18.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.132,18.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:36.102,43.54 6 18 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:43.54,45.3 1 5 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.2,47.63 1 13 @@ -1134,21 +893,21 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.23,72.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:74.2,75.53 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:78.149,82.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.77 3 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.77,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.97 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.97,93.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.104 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.104,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.87 3 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.87,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.107 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.107,93.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.114 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.114,96.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:97.2,101.8 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.106 3 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.106,109.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.108 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.108,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.116 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.116,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.118 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.118,113.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:115.2,118.8 1 8 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:121.139,125.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.75 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.75,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.85 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.85,132.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:132.8,134.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:137.104,139.55 2 18 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:139.55,141.3 1 4 @@ -1157,19 +916,19 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:144.2,144.12 1 13 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:151.17,153.130 2 7 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:153.130,155.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.128 3 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.128,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.138 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.138,160.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:160.8,162.3 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:169.17,171.133 2 5 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:171.133,173.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.135 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.135,178.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.145 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.145,178.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:178.8,180.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.125,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.120,16.2 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:18.43,22.16 3 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.52 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.52,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.62 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.62,28.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:29.2,29.12 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 @@ -1189,7 +948,7 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -1197,20 +956,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -1228,24 +987,42 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 11 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -1260,35 +1037,259 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 67 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:32.23,42.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:44.108,50.84 5 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:50.84,52.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:52.8,52.30 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:52.30,55.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:57.2,57.28 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:57.28,60.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:62.2,65.95 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:65.95,67.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:67.8,67.33 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:67.33,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:74.2,74.93 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:74.93,76.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:78.2,78.62 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:78.62,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.2,81.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.88,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:85.2,94.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:97.153,103.104 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:103.104,106.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.8,106.105 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.105,109.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.8,109.99 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.99,112.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:114.2,114.79 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:114.79,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.2,123.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:126.136,135.63 5 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:135.63,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:138.2,141.81 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:141.81,144.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:145.2,145.31 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:148.159,155.67 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:155.67,157.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.2,158.99 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.99,160.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.2,161.95 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.95,163.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.2,164.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.71,166.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:168.2,174.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:15.128,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:19.87,22.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:25.2,26.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:29.2,31.35 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:31.35,33.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:34.2,35.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:35.16,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:38.2,38.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:32.23,41.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:43.125,48.62 4 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:48.62,50.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.2,52.98 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.98,54.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.8,54.30 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.30,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.2,58.28 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.28,60.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.2,62.92 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.92,64.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:66.2,69.98 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.98,71.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:73.2,75.104 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:75.104,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.2,78.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.16,81.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:82.2,82.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:91.9,93.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:93.18,95.88 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:95.88,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:98.3,103.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:106.2,106.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:113.26,117.109 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:117.109,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:121.2,122.47 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:122.47,124.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.8,126.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.2,128.107 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.107,130.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.8,130.48 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.48,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.2,133.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:141.37,147.93 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:147.93,149.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:149.8,151.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:153.2,162.27 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:170.9,175.77 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:175.77,177.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:178.2,179.74 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:179.74,181.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:183.2,184.44 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:184.44,193.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:194.2,194.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:13.104,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:17.110,20.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:20.16,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:23.2,23.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:15.139,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:19.67,21.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:21.16,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:24.2,24.24 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:30.20,39.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:55.16,63.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:70.109,79.87 8 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:79.87,81.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:83.2,84.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:84.16,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:88.2,88.63 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:88.63,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:92.2,92.75 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:92.75,94.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:96.2,96.76 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:96.76,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:100.2,108.138 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:108.138,110.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:112.2,112.125 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:112.125,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:116.2,116.78 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:116.78,118.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:119.2,119.87 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:119.87,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:122.2,122.69 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:125.152,128.85 3 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:128.85,131.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:132.2,132.56 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:132.56,135.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:136.2,136.64 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:136.64,139.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:140.2,140.77 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:140.77,142.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:143.2,143.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:153.29,157.54 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:157.54,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:161.2,184.59 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:184.59,186.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:187.2,187.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:190.121,195.91 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:195.91,197.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:198.2,198.160 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:198.160,200.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:201.2,201.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:28.25,36.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:38.109,45.65 6 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:45.65,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:49.2,49.98 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:49.98,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:51.8,51.30 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:51.30,53.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:55.2,55.71 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:55.71,57.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:59.2,59.92 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:59.92,61.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:63.2,65.126 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:65.126,67.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:67.8,67.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:67.23,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:69.8,71.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:73.2,81.104 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:81.104,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.2,84.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.16,87.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:88.2,88.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:91.152,96.18 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:96.18,98.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:98.88,100.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:101.3,105.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:107.2,107.21 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:110.172,115.81 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:115.81,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:119.2,119.96 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:119.96,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:123.2,123.94 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:123.94,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:127.2,127.99 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:127.99,129.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:131.2,137.8 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:140.125,143.95 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:143.95,145.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:145.8,145.89 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:145.89,147.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.2,148.12 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:13.97,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:17.55,19.104 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:19.104,21.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -1336,19 +1337,19 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 19 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 @@ -1468,7 +1469,7 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pe github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.2,120.88 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.88,122.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:124.2,129.12 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.133,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.128,17.2 1 5 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:19.87,22.16 3 5 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:22.16,24.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:25.2,26.16 2 4 @@ -1482,115 +1483,115 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_qu github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:17.113,20.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:20.16,22.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:23.2,23.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.145,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.140,17.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:38.20,51.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:65.16,72.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:79.110,89.82 9 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:89.82,91.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:93.2,94.72 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:94.72,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.8,96.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.23,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,100.75 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.75,102.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:104.2,104.59 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:104.59,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:108.2,115.96 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.96,117.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.117 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.117,121.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:123.2,123.68 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:123.68,125.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:127.2,127.72 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:130.153,133.63 3 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.63,136.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.81 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.81,140.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:141.2,141.56 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:141.56,144.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:145.2,145.77 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:145.77,147.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.2,148.17 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:156.30,161.54 4 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.54,163.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:165.2,165.63 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:165.63,167.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:169.2,195.60 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:195.60,197.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:198.2,198.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:201.121,205.81 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:205.81,207.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:208.2,208.156 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:208.156,210.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:211.2,211.26 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:214.114,217.70 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:217.70,219.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:221.2,221.89 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:221.89,223.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:224.2,224.18 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:32.20,42.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:56.16,63.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:70.110,80.82 9 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:80.82,82.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:84.2,85.72 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.72,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:87.8,87.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:87.23,89.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:91.2,91.75 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:91.75,93.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:95.2,95.63 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:95.63,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:99.2,106.96 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:106.96,108.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:110.2,110.127 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:110.127,112.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:114.2,114.68 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:114.68,116.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:118.2,118.72 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:121.153,124.67 3 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:124.67,127.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:128.2,128.85 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:128.85,131.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:132.2,132.56 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:132.56,135.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:136.2,136.77 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:136.77,138.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:139.2,139.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:147.30,152.54 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:152.54,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:156.2,156.67 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:156.67,158.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:160.2,186.60 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:186.60,188.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:189.2,189.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:192.121,196.91 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:196.91,198.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:199.2,199.160 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:199.160,201.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:202.2,202.26 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:205.114,208.80 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:208.80,210.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:212.2,212.89 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:212.89,214.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:215.2,215.18 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:23.2,23.22 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.194,18.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.61 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.61,26.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.93 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.93,30.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.171,18.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.62 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.62,26.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.103 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.103,30.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.2,32.84 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.84,34.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:35.2,35.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:42.24,52.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:54.109,59.65 4 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:59.65,61.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:63.2,63.99 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:63.99,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:65.8,65.31 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:65.31,67.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:69.2,69.88 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:69.88,71.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,73.83 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.83,75.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:76.2,81.104 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:81.104,83.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.97 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.97,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.2,88.12 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:91.152,93.18 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:93.18,95.88 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.88,97.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:98.3,102.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.2,104.21 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:107.162,114.94 6 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:114.94,116.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:118.2,118.93 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:118.93,120.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:122.2,122.87 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:122.87,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,126.81 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.81,128.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:129.2,137.8 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:140.182,149.16 8 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:149.16,151.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:153.2,154.103 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.103,156.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:157.2,157.27 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:165.38,170.124 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:170.124,172.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:172.8,172.23 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:172.23,174.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:174.8,176.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:178.2,186.103 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.103,188.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:189.2,189.27 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.9,199.89 3 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:199.89,201.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.8,201.77 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.77,203.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:204.2,204.12 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:40.24,49.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:51.109,56.65 4 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:56.65,58.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.2,60.99 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.99,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.8,62.31 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.31,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.2,66.88 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.88,68.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.2,70.83 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.83,72.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,78.104 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:78.104,80.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.2,82.97 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.97,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.152,90.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:90.18,92.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:92.88,94.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.3,99.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:101.2,101.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.162,111.98 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:111.98,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.2,115.97 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.97,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.2,119.91 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.91,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.2,123.81 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.81,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,134.8 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:137.182,146.16 8 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:146.16,148.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:150.2,151.103 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:151.103,153.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.2,154.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:162.38,167.134 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:167.134,169.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.8,169.23 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.23,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:171.8,173.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:175.2,183.103 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:183.103,185.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.2,186.27 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:193.9,196.93 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.93,198.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.8,198.77 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.77,200.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.2,201.12 1 12 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:28.22,36.2 1 15 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:38.107,43.73 4 15 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:43.73,45.3 1 2 @@ -1616,10 +1617,10 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pego github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:100.2,100.21 1 12 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:107.42,112.29 4 11 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:112.29,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.2,116.63 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.63,118.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.2,120.100 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.100,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.2,116.67 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.67,118.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.2,120.104 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.104,122.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:122.8,122.87 1 8 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:122.87,124.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.8,124.55 1 7 @@ -1641,7 +1642,7 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pego github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:187.8,187.46 1 14 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:187.46,189.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:190.2,190.12 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.102,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.97,15.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:17.55,19.104 2 4 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:19.104,21.3 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 @@ -1694,19 +1695,19 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:80.88,83.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:83.9,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.2,86.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.29,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.2,89.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:19.63,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:22.40,24.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:43.107,45.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:45.19,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:48.2,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 diff --git a/docker-compose/bitcoind/Dockerfile b/docker-compose/bitcoind/Dockerfile index fc17aec6..5bf6a444 100644 --- a/docker-compose/bitcoind/Dockerfile +++ b/docker-compose/bitcoind/Dockerfile @@ -6,15 +6,15 @@ ARG BITCOIN_DOWNLOAD_FILENAME=bitcoin-${BITCOIN_VERSION}-x86_64-linux-gnu.tar.gz ENV BITCOIN_VERSION=$BITCOIN_VERSION ENV BITCOIN_DOWNLOAD_FILENAME=$BITCOIN_DOWNLOAD_FILENAME -RUN apt-get update && apt-get install -y wget gnupg2 curl +RUN apt-get update && apt-get install --no-install-recommends -y ca-certificates wget gnupg2 curl && apt-get clean -RUN wget https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/SHA256SUMS.asc \ - && wget https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/$BITCOIN_DOWNLOAD_FILENAME \ - && tar -xzvf $BITCOIN_DOWNLOAD_FILENAME \ - && cd bitcoin-$BITCOIN_VERSION/bin \ +RUN wget "https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/SHA256SUMS.asc" \ + && wget "https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/$BITCOIN_DOWNLOAD_FILENAME" \ + && tar -xzvf "$BITCOIN_DOWNLOAD_FILENAME" \ + && cd "bitcoin-$BITCOIN_VERSION/bin" \ && mv bitcoin-cli bitcoin-tx bitcoind /usr/local/bin \ && cd / \ - && rm -Rfv bitcoin-* *.asc + && rm -Rfv ./bitcoin-* ./*.asc ARG HOME="/home/bitcoin" RUN useradd -m -u 1000 --home="$HOME" bitcoin diff --git a/docker-compose/lbc-deployer/Dockerfile b/docker-compose/lbc-deployer/Dockerfile index 6b0495e4..395b8ff6 100644 --- a/docker-compose/lbc-deployer/Dockerfile +++ b/docker-compose/lbc-deployer/Dockerfile @@ -1,9 +1,8 @@ FROM --platform=linux/amd64 node:16 -ARG GITHUB_TOKEN -RUN apt-get update -y && apt-get install -qq --no-install-recommends jq +RUN apt-get update -y && apt-get install -y -qq --no-install-recommends jq && apt-get clean -RUN npm install -g truffle +RUN npm install --ignore-scripts -g truffle USER node @@ -17,14 +16,13 @@ RUN gitBranch=${LBC_GIT_BRANCH} && \ git fetch --depth 1 origin "$gitBranch" && \ git checkout "$gitBranch" -COPY --chown=node truffle-config.patch ./ +COPY --chown=root:root --chmod=444 truffle-config.patch ./ RUN git apply truffle-config.patch +RUN --mount=type=secret,id=gh_token,required=true,uid=1000 echo "//npm.pkg.github.com/:_authToken=$(cat /run/secrets/gh_token)" >> .npmrc -RUN echo "//npm.pkg.github.com/:_authToken=$GITHUB_TOKEN" >> .npmrc - -RUN npm ci +RUN npm ci --ignore-scripts RUN npx truffle compile -COPY --chown=node deploy-lbc.sh ./ +COPY --chown=root:root --chmod=555 deploy-lbc.sh ./ diff --git a/docker-compose/local/docker-compose.lbc-deployer.yml b/docker-compose/local/docker-compose.lbc-deployer.yml index 25af7431..1b590381 100644 --- a/docker-compose/local/docker-compose.lbc-deployer.yml +++ b/docker-compose/local/docker-compose.lbc-deployer.yml @@ -1,14 +1,17 @@ -version: "3" services: lbc-deployer: build: context: ../lbc-deployer + secrets: + - gh_token args: LBC_GIT_BRANCH: "${LBC_GIT_BRANCH:-QA-Test}" - GITHUB_TOKEN: "${GITHUB_TOKEN}" image: lbc-deployer:latest container_name: lbc-deployer01 environment: - LPS_STAGE networks: - net_lps +secrets: + gh_token: + file: ./gh_token.txt diff --git a/docker-compose/local/lps-env.sh b/docker-compose/local/lps-env.sh index ec150f13..a7adeba0 100755 --- a/docker-compose/local/lps-env.sh +++ b/docker-compose/local/lps-env.sh @@ -141,8 +141,9 @@ if [ "$LPS_STAGE" = "regtest" ]; then if [ -z "${LBC_ADDR}" ]; then echo "LBC_ADDR is not set. Deploying LBC contract..." + (grep GITHUB_TOKEN | head -n 1 | tr -d '\r' > gh_token.txt) < $ENV_FILE # deploy LBC contracts to RSKJ - LBC_ADDR_LINE=$(docker-compose --env-file "$ENV_FILE" -f docker-compose.yml -f docker-compose.lbc-deployer.yml run --rm lbc-deployer bash deploy-lbc.sh | grep LBC_ADDR | head -n 1 | tr -d '\r') + LBC_ADDR_LINE=$(docker compose --env-file "$ENV_FILE" -f docker-compose.yml -f docker-compose.lbc-deployer.yml run --rm lbc-deployer bash deploy-lbc.sh | grep LBC_ADDR | head -n 1 | tr -d '\r') export LBC_ADDR="${LBC_ADDR_LINE#"LBC_ADDR="}" fi fi diff --git a/docker-compose/localstack/Dockerfile b/docker-compose/localstack/Dockerfile index c2e5b305..50cc8c15 100644 --- a/docker-compose/localstack/Dockerfile +++ b/docker-compose/localstack/Dockerfile @@ -4,4 +4,6 @@ ARG BTC_WALLET_PASSWORD=test ARG RSK_ENCRYPTED_JSON_PASSWORD=test COPY local-key.json /tmp/local-key.json -COPY setup/ /etc/localstack/init/ready.d/ \ No newline at end of file +COPY setup/ /etc/localstack/init/ready.d/ + +USER localstack \ No newline at end of file diff --git a/docker-compose/powpeg/pegin/Dockerfile b/docker-compose/powpeg/pegin/Dockerfile index 8bb1c996..60460604 100644 --- a/docker-compose/powpeg/pegin/Dockerfile +++ b/docker-compose/powpeg/pegin/Dockerfile @@ -1,7 +1,8 @@ FROM openjdk:8-jdk-slim-buster AS builder RUN apt-get update -y && \ - apt-get install -qq --no-install-recommends git curl gnupg + apt-get install -y -qq --no-install-recommends git curl gnupg && \ + apt-get clean WORKDIR /code/powpeg @@ -26,11 +27,11 @@ FROM --platform=linux/amd64 openjdk:8-jdk AS runner ARG HOME="/home/powpeg" RUN useradd -m -u 1000 --home="$HOME" powpeg -COPY --from=builder --chown=1000 --chmod=555 "/code/powpeg/build/libs/federate-node-*-all.jar" "$HOME/powpeg.jar" +COPY --from=builder --chown=root:root --chmod=555 "/code/powpeg/build/libs/federate-node-*-all.jar" "$HOME/powpeg.jar" -COPY --chown=1000 reg1.key "$HOME/reg1.key" -COPY --chown=1000 regtest-fed.conf "$HOME/regtest-fed.conf" -COPY --chown=1000 regtest-fed.conf "/etc/rsk/node.conf" +COPY --chown=root:root --chmod=444 reg1.key "$HOME/reg1.key" +COPY --chown=root:root --chmod=444 regtest-fed.conf "$HOME/regtest-fed.conf" +COPY --chown=root:root --chmod=444 regtest-fed.conf "/etc/rsk/node.conf" RUN chmod 400 "$HOME/reg1.key" diff --git a/docker-compose/powpeg/pegout/Dockerfile b/docker-compose/powpeg/pegout/Dockerfile index 80d323a2..8600d668 100644 --- a/docker-compose/powpeg/pegout/Dockerfile +++ b/docker-compose/powpeg/pegout/Dockerfile @@ -1,7 +1,8 @@ FROM openjdk:8-jdk-slim-buster AS builder RUN apt-get update -y && \ - apt-get install -qq --no-install-recommends git curl gnupg + apt-get install -y -qq --no-install-recommends git curl gnupg && \ + apt-get clean WORKDIR /code/powpeg @@ -26,11 +27,11 @@ FROM --platform=linux/amd64 openjdk:8-jdk AS runner ARG HOME="/home/powpeg" RUN useradd -m -u 1000 --home="$HOME" powpeg -COPY --from=builder --chown=1000 --chmod=555 "/code/powpeg/build/libs/federate-node-*-all.jar" "$HOME/powpeg.jar" +COPY --from=builder --chown=root:root --chmod=555 "/code/powpeg/build/libs/federate-node-*-all.jar" "$HOME/powpeg.jar" -COPY --chown=1000 reg2.key "$HOME/reg2.key" -COPY --chown=1000 regtest-fed.conf "$HOME/regtest-fed.conf" -COPY --chown=1000 regtest-fed.conf "/etc/rsk/node.conf" +COPY --chown=root:root --chmod=444 reg2.key "$HOME/reg2.key" +COPY --chown=root:root --chmod=444 regtest-fed.conf "$HOME/regtest-fed.conf" +COPY --chown=root:root --chmod=444 regtest-fed.conf "/etc/rsk/node.conf" RUN chmod 400 "$HOME/reg2.key" diff --git a/docker-compose/rskj/Dockerfile b/docker-compose/rskj/Dockerfile index 74b7a7ff..4f03ba90 100644 --- a/docker-compose/rskj/Dockerfile +++ b/docker-compose/rskj/Dockerfile @@ -1,7 +1,8 @@ -FROM openjdk:8-jdk-slim-buster as builder +FROM openjdk:8-jdk-slim-buster AS builder RUN apt-get update -y && \ - apt-get install -qq --no-install-recommends git curl gnupg + apt-get install -y -qq --no-install-recommends git curl gnupg && \ + apt-get clean WORKDIR /code/rskj @@ -24,14 +25,14 @@ RUN gpg --keyserver https://secchannel.rsk.co/SUPPORT.asc --recv-keys 1DC9157991 modifier=$(sed -n 's/^modifier=//p' "$file" | tr -d "\"'") && \ cp "rskj-core/build/libs/rskj-core-$version_number-$modifier-all.jar" rsk.jar -FROM --platform=linux/amd64 openjdk:8-jdk as runner +FROM --platform=linux/amd64 openjdk:8-jdk AS runner ARG UID=1000 ARG HOME="/home/rsk" RUN useradd -m -u "$UID" --home="$HOME" rsk -COPY --from=builder --chown="$UID" "/code/rskj/rskj-core/build/libs/rskj-core-*-all.jar" "$HOME/rskj-core.jar" -COPY --chown="$UID" rsk.conf $HOME +COPY --from=builder --chown=root:root --chmod=555 "/code/rskj/rskj-core/build/libs/rskj-core-*-all.jar" "$HOME/rskj-core.jar" +COPY --chown=root:root --chmod=444 rsk.conf $HOME RUN mkdir -p "$HOME/.rsk"; chown "$UID" "$HOME/.rsk" RUN mkdir -p "$HOME/logs"; chown -R "$UID" "$HOME/logs" diff --git a/sonar-project.properties b/sonar-project.properties index c0592cd0..72041238 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,10 +2,11 @@ # in https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/ sonar.projectKey=liquidity-provider-server sonar.projectVersion=2.0.0 -sonar.sources=internal,cmd,pkg -sonar.exclusions=**/*_test.go,test/*,internal/adapters/dataproviders/rootstock/bindings/* +sonar.sources=internal,cmd,pkg,docker-compose +sonar.exclusions=internal/adapters/dataproviders/rootstock/bindings/*,test/mocks/* sonar.tests=. sonar.test.inclusions=**/*_test.go +sonar.go.coverage.reportPaths=coverage/cover.out -sonar.branch.name=master,Stable-Test,QA-Test,architecture-migration +sonar.branch.name=master,Stable-Test,QA-Test From 50d13d5f87f0bc75154ad6cc514389b4696ec808 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 19 Mar 2024 12:00:53 +0100 Subject: [PATCH 032/113] fix: replace constant in tests --- internal/usecases/pegin/call_for_user_test.go | 42 ++++++++-------- .../usecases/pegout/refund_pegout_test.go | 48 +++++++++---------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go index 3f7bdb43..666ffe86 100644 --- a/internal/usecases/pegin/call_for_user_test.go +++ b/internal/usecases/pegin/call_for_user_test.go @@ -60,8 +60,8 @@ func TestCallForUserUseCase_Run(t *testing.T) { mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() rsk := new(mocks.RskRpcMock) @@ -120,13 +120,13 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() rsk := new(mocks.RskRpcMock) - rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() + rsk.On("GetBalance", test.AnyCtx, lpRskAddress).Return(entities.NewWei(80000), nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -205,15 +205,15 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine caseRetainedQuote.State = quote.PeginStateCallForUserSucceeded }, func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(nil, assert.AnError).Once() }, func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ Hash: "0x1d1e", @@ -223,7 +223,7 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine lbc.On("GetBalance", mock.Anything).Return(nil, assert.AnError).Once() }, func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ Hash: "0x1d1e", @@ -259,7 +259,7 @@ func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() rsk := new(mocks.RskRpcMock) @@ -301,12 +301,12 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { expiredQuote := testPeginQuote expiredQuote.AgreementTimestamp -= 1000 - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&expiredQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&expiredQuote, nil).Once() updatedQuote := retainedPeginQuote updatedQuote.State = quote.PeginStateCallForUserFailed - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { require.ErrorIs(t, event.Error, usecases.ExpiredQuoteError) return assert.Equal(t, expiredQuote, event.PeginQuote) && @@ -349,9 +349,9 @@ func TestCallForUserUseCase_Run_QuoteNotFound(t *testing.T) { updatedQuote := retainedPeginQuote updatedQuote.State = quote.PeginStateCallForUserFailed - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(nil, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { require.ErrorIs(t, event.Error, usecases.QuoteNotFoundError) return assert.Empty(t, event.PeginQuote) && @@ -410,9 +410,9 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { mutex := new(mocks.MutexMock) quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote). + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote). Return(nil).Once() rsk := new(mocks.RskRpcMock) @@ -468,10 +468,10 @@ func TestCallForUserUseCase_Run_NoLiquidity(t *testing.T) { mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() rsk := new(mocks.RskRpcMock) - rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(20000), nil).Once() + rsk.On("GetBalance", test.AnyCtx, lpRskAddress).Return(entities.NewWei(20000), nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -529,13 +529,13 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() rsk := new(mocks.RskRpcMock) - rsk.On("GetBalance", mock.AnythingOfType("context.backgroundCtx"), lpRskAddress).Return(entities.NewWei(80000), nil).Once() + rsk.On("GetBalance", test.AnyCtx, lpRskAddress).Return(entities.NewWei(80000), nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) diff --git a/internal/usecases/pegout/refund_pegout_test.go b/internal/usecases/pegout/refund_pegout_test.go index 6b021e00..962ebecb 100644 --- a/internal/usecases/pegout/refund_pegout_test.go +++ b/internal/usecases/pegout/refund_pegout_test.go @@ -92,10 +92,10 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { LpBtcTxHash: retainedQuote.LpBtcTxHash, RefundPegoutTxHash: refundPegoutTxHash, } - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetained).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, expectedRetained).Return(nil).Once() expectedRetained.BridgeRefundTxHash = bridgeTxHash - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), expectedRetained).Return(nil).Once() - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, expectedRetained).Return(nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() lbc := new(mocks.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() eventBus := new(mocks.EventBusMock) @@ -112,7 +112,7 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) rskWallet := new(mocks.RskWalletMock) - rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), + rskWallet.On("SendRbtc", test.AnyCtx, blockchain.NewTransactionConfig(entities.NewWei(8000), 100000, entities.NewWei(60000000)), bridgeAddress).Return(bridgeTxHash, nil).Once() bridge := new(mocks.BridgeMock) @@ -138,9 +138,9 @@ func TestRefundPegoutUseCase_Run(t *testing.T) { func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { updateError := errors.New("an update error") quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(updateError).Once() - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(updateError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() lbc := new(mocks.LbcMock) lbc.On("RefundPegout", mock.Anything, mock.Anything).Return(refundPegoutTxHash, nil).Once() eventBus := new(mocks.EventBusMock) @@ -157,7 +157,7 @@ func TestRefundPegoutUseCase_Run_UpdateError(t *testing.T) { btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil) btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil) rskWallet := new(mocks.RskWalletMock) - rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(bridgeTxHash, nil).Once() + rskWallet.On("SendRbtc", test.AnyCtx, mock.Anything, mock.Anything).Return(bridgeTxHash, nil).Once() bridge := new(mocks.BridgeMock) bridge.On("GetAddress").Return("an address").Once() mutex := new(mocks.MutexMock) @@ -188,25 +188,25 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { recoverableSetups := []func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock){ func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(blockchain.MerkleBranch{}, assert.AnError).Once() }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{}, assert.AnError).Once() }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() @@ -214,7 +214,7 @@ func TestRefundPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() @@ -251,18 +251,18 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { unrecoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock){ func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(nil, nil).Once() }, func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { retainedQuote.QuoteHash = "no hex" - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() btc.On("GetRawTransaction", mock.Anything).Return(btcRawTxMock, nil).Once() }, func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, rskWallet *mocks.RskWalletMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() btc.On("GetTransactionInfo", retainedQuote.LpBtcTxHash).Return(btcTxInfoMock, nil).Once() btc.On("BuildMerkleBranch", mock.Anything).Return(merkleBranchMock, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(btcBlockInfoMock, nil).Once() @@ -286,7 +286,7 @@ func TestRefundPegoutUseCase_Run_PublishUnrecoverableError(t *testing.T) { assert.Equal(t, caseQuote.RequiredLiquidity, event.RetainedQuote.RequiredLiquidity) && assert.Equal(t, quote.PegoutStateRefundPegOutFailed, event.RetainedQuote.State) && assert.Equal(t, caseQuote.UserRskTxHash, event.RetainedQuote.UserRskTxHash) && assert.Equal(t, quote.PegoutQuoteCompletedEventId, event.Event.Id()) })).Return().Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy( + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy( func(q quote.RetainedPegoutQuote) bool { expected := caseQuote expected.State = quote.PegoutStateRefundPegOutFailed @@ -309,7 +309,7 @@ func TestRefundPegoutUseCase_Run_NoConfirmations(t *testing.T) { unconfirmedBlockInfo := btcTxInfoMock unconfirmedBlockInfo.Confirmations = 1 quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() lbc := new(mocks.LbcMock) eventBus := new(mocks.EventBusMock) btc := new(mocks.BtcRpcMock) @@ -388,13 +388,13 @@ func TestRefundPegoutUseCase_Run_CorrectBridgeAmount(t *testing.T) { for _, c := range cases { quoteRepository := new(mocks.PegoutQuoteRepositoryMock) q := c.Value() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&q, nil) + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(nil) + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&q, nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&q, nil) rskWallet := new(mocks.RskWalletMock) - rskWallet.On("SendRbtc", mock.AnythingOfType("context.backgroundCtx"), + rskWallet.On("SendRbtc", test.AnyCtx, blockchain.NewTransactionConfig(c.Result, 100000, entities.NewWei(60000000)), bridgeAddress). Return(bridgeTxHash, nil).Once() From 64595da512b55734c0a19e59a7fddcc3b943613a Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 19 Mar 2024 14:31:19 +0100 Subject: [PATCH 033/113] fix: move error templates to variables --- .../entrypoints/watcher/pegout_btc_watcher.go | 22 +++++++++------ .../entrypoints/watcher/pegout_rsk_watcher.go | 28 +++++++++++-------- internal/entities/blockchain/bitcoin.go | 5 ++++ internal/entities/blockchain/lbc.go | 4 +++ internal/entities/blockchain/rootstock.go | 4 +++ 5 files changed, 44 insertions(+), 19 deletions(-) diff --git a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go index 6aa5f660..3b602bac 100644 --- a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go @@ -3,6 +3,7 @@ package watcher import ( "context" "errors" + "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" @@ -48,7 +49,7 @@ func NewPegoutBtcTransferWatcher( func (watcher *PegoutBtcTransferWatcher) Shutdown(closeChannel chan<- bool) { watcher.watcherStopChannel <- true closeChannel <- true - log.Debug("PegoutBtcTransferWatcher shut down") + log.Debug(pegoutBtcWatcherLog("shut down")) } func (watcher *PegoutBtcTransferWatcher) Prepare(ctx context.Context) error { @@ -73,7 +74,7 @@ watcherLoop: watcher.checkQuotes() watcher.currentBlock = height } else if err != nil { - log.Error("PegoutBtcTransferWatcher: error getting Bitcoin chain height: ", err) + log.Error(pegoutBtcWatcherLog(blockchain.BtcChainHeightErrorTemplate, err)) } case event := <-eventChannel: if event != nil { @@ -92,7 +93,7 @@ func (watcher *PegoutBtcTransferWatcher) checkQuotes() { var tx blockchain.BitcoinTransactionInformation for _, watchedQuote := range watcher.quotes { if tx, err = watcher.rpc.Btc.GetTransactionInfo(watchedQuote.RetainedQuote.LpBtcTxHash); err != nil { - log.Errorf("Error getting Bitcoin transaction information %s: %v\n", watchedQuote.RetainedQuote.LpBtcTxHash, err) + log.Error(pegoutBtcWatcherLog(blockchain.BtcTxInfoErrorTemplate, watchedQuote.RetainedQuote.LpBtcTxHash, err)) return } if watcher.validateQuote(watchedQuote, tx) { @@ -103,11 +104,12 @@ func (watcher *PegoutBtcTransferWatcher) checkQuotes() { func (watcher *PegoutBtcTransferWatcher) refundPegout(watchedQuote w.WatchedPegoutQuote) { var err error + const refundPegoutErrorMsgTemplate = "Error executing refund pegout on quote %s: %v" if err = watcher.refundPegoutUseCase.Run(context.Background(), watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) - log.Errorf("Error executing refund pegout on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutBtcWatcherLog(refundPegoutErrorMsgTemplate, watchedQuote.RetainedQuote.QuoteHash, err)) } else if err != nil { - log.Errorf("Error executing refund pegout on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutBtcWatcherLog(refundPegoutErrorMsgTemplate, watchedQuote.RetainedQuote.QuoteHash, err)) } else { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) } @@ -117,16 +119,16 @@ func (watcher *PegoutBtcTransferWatcher) handleBtcSentToUserCompleted(event enti parsedEvent, ok := event.(quote.PegoutBtcSentToUserEvent) quoteHash := parsedEvent.RetainedQuote.QuoteHash if !ok { - log.Error("Trying to parse wrong event in Pegin Bridge watcher") + log.Error(pegoutBtcWatcherLog("Trying to parse wrong event in Pegin Bridge watcher")) return } if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { - log.Infof("Quote %s is already watched\n", quoteHash) + log.Info(pegoutBtcWatcherLog("Quote %s is already watched", quoteHash)) return } if parsedEvent.RetainedQuote.State != quote.PegoutStateSendPegoutSucceeded || parsedEvent.RetainedQuote.LpBtcTxHash == "" { - log.Infof("Quote %s doesn't have btc tx hash to watch\n", quoteHash) + log.Info(pegoutBtcWatcherLog("Quote %s doesn't have btc tx hash to watch", quoteHash)) return } watcher.quotes[quoteHash] = w.NewWatchedPegoutQuote(parsedEvent.PegoutQuote, parsedEvent.RetainedQuote) @@ -136,3 +138,7 @@ func (watcher *PegoutBtcTransferWatcher) validateQuote(watchedQuote w.WatchedPeg return watchedQuote.RetainedQuote.State == quote.PegoutStateSendPegoutSucceeded && tx.Confirmations >= uint64(watchedQuote.PegoutQuote.TransferConfirmations) } + +func pegoutBtcWatcherLog(format string, args ...any) string { + return fmt.Sprintf("PegoutBtcTransferWatcher: "+format, args...) +} diff --git a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go index 21c32c1e..4808dac7 100644 --- a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go @@ -3,6 +3,7 @@ package watcher import ( "context" "errors" + "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" @@ -106,7 +107,7 @@ func (watcher *PegoutRskDepositWatcher) Prepare(ctx context.Context) error { watcher.quotes[watchedQuote.RetainedQuote.QuoteHash] = watchedQuote } - log.Info("Starting to watch pegout deposits from block ", watcher.currentBlock) + log.Info(pegoutRskWatcherLog("Starting to watch pegout deposits from block %d", watcher.currentBlock)) return nil } @@ -126,7 +127,7 @@ watcherLoop: watcher.checkQuotes(checkContext, height) watcher.currentBlock = height } else if err != nil { - log.Error("PegoutRskDepositWatcher: error getting RSK chain height: ", err) + log.Error(pegoutRskWatcherLog(blockchain.RskChainHeightErrorTemplate, err)) } checkCancel() case event := <-eventChannel: @@ -144,19 +145,19 @@ watcherLoop: func (watcher *PegoutRskDepositWatcher) Shutdown(closeChannel chan<- bool) { watcher.watcherStopChannel <- true closeChannel <- true - log.Debug("PegoutRskDepositWatcher shut down") + log.Debug(pegoutRskWatcherLog("shut down")) } func (watcher *PegoutRskDepositWatcher) handleAcceptedPegoutQuote(event entities.Event) { parsedEvent, ok := event.(quote.AcceptedPegoutQuoteEvent) quoteHash := parsedEvent.RetainedQuote.QuoteHash if !ok { - log.Error("Trying to parse wrong event in Pegout Rsk deposit watcher") + log.Error(pegoutRskWatcherLog("Trying to parse wrong event in Pegout Rsk deposit watcher")) return } if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { - log.Infof("Quote %s is already watched\n", quoteHash) + log.Info(pegoutRskWatcherLog("Quote %s is already watched", quoteHash)) return } watcher.quotes[quoteHash] = w.NewWatchedPegoutQuote(parsedEvent.Quote, parsedEvent.RetainedQuote) @@ -168,7 +169,7 @@ func (watcher *PegoutRskDepositWatcher) checkDeposits(ctx context.Context, fromB deposits, err = watcher.contracts.Lbc.GetDepositEvents(ctx, fromBlock, &toBlock) if err != nil { - log.Errorf("Error executing getting deposits in range [%d, %d] in PegoutRskDepositWatcher\n", fromBlock, toBlock) + log.Error(pegoutRskWatcherLog(blockchain.GetPegoutDepositsErrorTemplate, fromBlock, toBlock)) return } for _, deposit := range deposits { @@ -184,7 +185,7 @@ func (watcher *PegoutRskDepositWatcher) checkDeposit(ctx context.Context, deposi if newWatchedQuote, err = watcher.updatePegoutDepositUseCase.Run(ctx, watchedQuote, deposit); err == nil { watcher.quotes[deposit.QuoteHash] = newWatchedQuote } else { - log.Errorf("Error updating pegout deposit quote (%s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutRskWatcherLog("Error updating pegout deposit quote (%s): %v", watchedQuote.RetainedQuote.QuoteHash, err)) } } } @@ -200,7 +201,7 @@ func (watcher *PegoutRskDepositWatcher) checkQuote(ctx context.Context, height u var receipt blockchain.TransactionReceipt if watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDeposit && watchedQuote.PegoutQuote.IsExpired() { if err = watcher.expiredUseCase.Run(ctx, watchedQuote.RetainedQuote); err != nil { - log.Errorf("Error updating expired quote (%s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutRskWatcherLog("Error updating expired quote (%s): %v", watchedQuote.RetainedQuote.QuoteHash, err)) return } else { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) @@ -209,7 +210,7 @@ func (watcher *PegoutRskDepositWatcher) checkQuote(ctx context.Context, height u if watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDepositConfirmations { if receipt, err = watcher.rpc.Rsk.GetTransactionReceipt(ctx, watchedQuote.RetainedQuote.UserRskTxHash); err != nil { - log.Errorf("Error getting pegout deposit receipt of quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutRskWatcherLog("Error getting pegout deposit receipt of quote %s: %v", watchedQuote.RetainedQuote.QuoteHash, err)) return } if validateDepositedPegoutQuote(watchedQuote, receipt, height) { @@ -220,11 +221,12 @@ func (watcher *PegoutRskDepositWatcher) checkQuote(ctx context.Context, height u func (watcher *PegoutRskDepositWatcher) sendPegout(ctx context.Context, watchedQuote w.WatchedPegoutQuote) { var err error + const sendPegoutErrorMsgTemplate = "Error sending pegout to the user (quote %s): %v" if err = watcher.sendPegoutUseCase.Run(ctx, watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { - log.Errorf("Error sending pegout to the user (quote %s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutRskWatcherLog(sendPegoutErrorMsgTemplate, watchedQuote.RetainedQuote.QuoteHash, err)) delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) } else if err != nil { - log.Errorf("Error sending pegout to the user (quote %s): %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(pegoutRskWatcherLog(sendPegoutErrorMsgTemplate, watchedQuote.RetainedQuote.QuoteHash, err)) } else { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) } @@ -236,3 +238,7 @@ func validateDepositedPegoutQuote(watchedQuote w.WatchedPegoutQuote, receipt blo !watchedQuote.PegoutQuote.IsExpired() && receipt.Value.Cmp(watchedQuote.PegoutQuote.Total()) >= 0 } + +func pegoutRskWatcherLog(format string, args ...any) string { + return fmt.Sprintf("PegoutRskDepositWatcher: "+format, args...) +} diff --git a/internal/entities/blockchain/bitcoin.go b/internal/entities/blockchain/bitcoin.go index f726980a..8c226c6b 100644 --- a/internal/entities/blockchain/bitcoin.go +++ b/internal/entities/blockchain/bitcoin.go @@ -23,6 +23,11 @@ var ( BtcAddressNotSupportedError = errors.New("btc address not supported") ) +const ( + BtcChainHeightErrorTemplate = "error getting Bitcoin chain height: %v" + BtcTxInfoErrorTemplate = "error getting Bitcoin transaction information (%s): %v" +) + // IsSupportedBtcAddress checks if flyover protocol supports the given address // Currently the supported address types are P2PKH and P2SH func IsSupportedBtcAddress(address string) bool { diff --git a/internal/entities/blockchain/lbc.go b/internal/entities/blockchain/lbc.go index 93c6f9e4..8af7f0e0 100644 --- a/internal/entities/blockchain/lbc.go +++ b/internal/entities/blockchain/lbc.go @@ -10,6 +10,10 @@ import ( "math/big" ) +const ( + GetPegoutDepositsErrorTemplate = "error executing getting deposits in range [%d, %d]" +) + type RegisterPeginParams struct { QuoteSignature []byte BitcoinRawTransaction []byte diff --git a/internal/entities/blockchain/rootstock.go b/internal/entities/blockchain/rootstock.go index a8961563..328fb4b1 100644 --- a/internal/entities/blockchain/rootstock.go +++ b/internal/entities/blockchain/rootstock.go @@ -10,6 +10,10 @@ import ( "strings" ) +const ( + RskChainHeightErrorTemplate = "error getting Rootstock chain height: %v" +) + var ( rskAddressRegex = regexp.MustCompile("^0x[a-fA-F0-9]{40}$") WaitingForBridgeError = errors.New("waiting for rootstock bridge") From 3054fabf0a29083e6cadff54af7f8950c78e9963 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 19 Mar 2024 14:52:38 +0100 Subject: [PATCH 034/113] fix: use error templates in other watchers --- .../watcher/pegin_bridge_watcher.go | 20 +++++++++++------ .../watcher/pegin_btc_deposit_watcher.go | 22 +++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go b/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go index f41fc033..852e64d4 100644 --- a/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_bridge_watcher.go @@ -3,6 +3,7 @@ package watcher import ( "context" "errors" + "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" @@ -69,7 +70,7 @@ watcherLoop: watcher.checkQuotes() watcher.currentBlock = height } else if err != nil { - log.Error("PeginBridgeWatcher: error getting Bitcoin chain height: ", err) + log.Error(peginBridgeWatcherLog(blockchain.BtcChainHeightErrorTemplate, err)) } case event := <-eventChannel: if event != nil { @@ -86,19 +87,19 @@ watcherLoop: func (watcher *PeginBridgeWatcher) Shutdown(closeChannel chan<- bool) { watcher.watcherStopChannel <- true closeChannel <- true - log.Debug("PeginBridgeWatcher shut down") + log.Debug(peginBridgeWatcherLog("shut down")) } func (watcher *PeginBridgeWatcher) handleCallForUserCompleted(event entities.Event) { parsedEvent, ok := event.(quote.CallForUserCompletedEvent) quoteHash := parsedEvent.RetainedQuote.QuoteHash if !ok { - log.Error("Trying to parse wrong event in Pegin Bridge watcher") + log.Error(peginBridgeWatcherLog("Trying to parse wrong event")) return } if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { - log.Infof("Quote %s is already watched\n", quoteHash) + log.Info(peginBridgeWatcherLog("Quote %s is already watched", quoteHash)) return } if parsedEvent.RetainedQuote.State == quote.PeginStateCallForUserSucceeded { @@ -111,7 +112,7 @@ func (watcher *PeginBridgeWatcher) checkQuotes() { var tx blockchain.BitcoinTransactionInformation for _, watchedQuote := range watcher.quotes { if tx, err = watcher.rpc.Btc.GetTransactionInfo(watchedQuote.RetainedQuote.UserBtcTxHash); err != nil { - log.Errorf("Error getting Bitcoin transaction information %s: %v\n", watchedQuote.RetainedQuote.UserBtcTxHash, err) + log.Error(peginBridgeWatcherLog(blockchain.BtcTxInfoErrorTemplate, watchedQuote.RetainedQuote.UserBtcTxHash, err)) return } if watcher.validateQuote(watchedQuote, tx) { @@ -122,11 +123,12 @@ func (watcher *PeginBridgeWatcher) checkQuotes() { func (watcher *PeginBridgeWatcher) registerPegin(watchedQuote w.WatchedPeginQuote) { var err error + const registerPeginErrorMsgTemplate = "Error executing register pegin on quote %s: %v" if err = watcher.registerPeginUseCase.Run(context.Background(), watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) - log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(peginBridgeWatcherLog(registerPeginErrorMsgTemplate, watchedQuote.RetainedQuote.QuoteHash, err)) } else if err != nil { - log.Errorf("Error executing register pegin on quote %s: %v\n", watchedQuote.RetainedQuote.QuoteHash, err) + log.Error(peginBridgeWatcherLog(registerPeginErrorMsgTemplate, watchedQuote.RetainedQuote.QuoteHash, err)) } else { delete(watcher.quotes, watchedQuote.RetainedQuote.QuoteHash) } @@ -136,3 +138,7 @@ func (watcher *PeginBridgeWatcher) validateQuote(watchedQuote w.WatchedPeginQuot return watchedQuote.RetainedQuote.State == quote.PeginStateCallForUserSucceeded && tx.Confirmations >= watcher.contracts.Bridge.GetRequiredTxConfirmations() } + +func peginBridgeWatcherLog(msg string, args ...any) string { + return fmt.Sprintf("Pegin Bridge watcher: "+msg, args...) +} diff --git a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go index 1f1838c2..c782ca32 100644 --- a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go @@ -82,7 +82,7 @@ watcherLoop: watcher.checkQuotes() watcher.currentBlock = height } else if err != nil { - log.Error("PeginDepositAddressWatcher: error getting Bitcoin chain height: ", err) + log.Error(peginBtcDepositWatcherLog("error getting Bitcoin chain height: %v", err)) } case event := <-eventChannel: if event != nil { @@ -99,25 +99,25 @@ watcherLoop: func (watcher *PeginDepositAddressWatcher) Shutdown(closeChannel chan<- bool) { watcher.watcherStopChannel <- true closeChannel <- true - log.Debug("PeginDepositAddressWatcher shut down") + log.Debug(peginBtcDepositWatcherLog("shut down")) } func (watcher *PeginDepositAddressWatcher) handleAcceptedPeginQuote(event entities.Event) { parsedEvent, ok := event.(quote.AcceptedPeginQuoteEvent) quoteHash := parsedEvent.RetainedQuote.QuoteHash if !ok { - log.Error("Trying to parse wrong event in Pegin Btc deposit watcher") + log.Error(peginBtcDepositWatcherLog("trying to parse wrong event")) return } if _, alreadyHaveQuote := watcher.quotes[quoteHash]; alreadyHaveQuote { - log.Infof("Quote %s is already watched\n", quoteHash) + log.Info(peginBtcDepositWatcherLog("Quote %s is already watched", quoteHash)) return } err := watcher.btcWallet.ImportAddress(parsedEvent.RetainedQuote.DepositAddress) if err != nil { - log.Errorf("error while importing deposit address (%s): %v\n", parsedEvent.RetainedQuote.DepositAddress, err) + log.Error(peginBtcDepositWatcherLog("error while importing deposit address (%s): %v", parsedEvent.RetainedQuote.DepositAddress, err)) return } watcher.quotes[quoteHash] = w.NewWatchedPeginQuote(parsedEvent.Quote, parsedEvent.RetainedQuote) @@ -134,7 +134,7 @@ func (watcher *PeginDepositAddressWatcher) handleQuote(watchedQuote w.WatchedPeg depositAddress := watchedQuote.RetainedQuote.DepositAddress txs, err := watcher.btcWallet.GetTransactions(depositAddress) if err != nil { - log.Errorf(callForUserErrorTemplate, quoteHash, err) + log.Error(peginBtcDepositWatcherLog(callForUserErrorTemplate, quoteHash, err)) return } for _, tx := range txs { @@ -145,7 +145,7 @@ func (watcher *PeginDepositAddressWatcher) handleQuote(watchedQuote w.WatchedPeg } if watchedQuote.RetainedQuote.State == quote.PeginStateWaitingForDeposit && watchedQuote.PeginQuote.IsExpired() { if err = watcher.expiredUseCase.Run(context.Background(), watchedQuote.RetainedQuote); err != nil { - log.Errorf("Error updating expired quote (%s): %v\n", quoteHash, err) + log.Error(peginBtcDepositWatcherLog("Error updating expired quote (%s): %v", quoteHash, err)) } else { delete(watcher.quotes, quoteHash) } @@ -157,9 +157,9 @@ func (watcher *PeginDepositAddressWatcher) callForUser(watchedQuote w.WatchedPeg quoteHash := watchedQuote.RetainedQuote.QuoteHash if err = watcher.callForUserUseCase.Run(context.Background(), tx.Hash, watchedQuote.RetainedQuote); errors.Is(err, usecases.NonRecoverableError) { delete(watcher.quotes, quoteHash) - log.Errorf(callForUserErrorTemplate, quoteHash, err) + log.Error(peginBtcDepositWatcherLog(callForUserErrorTemplate, quoteHash, err)) } else if err != nil { - log.Errorf(callForUserErrorTemplate, quoteHash, err) + log.Error(peginBtcDepositWatcherLog(callForUserErrorTemplate, quoteHash, err)) } else { delete(watcher.quotes, quoteHash) } @@ -171,3 +171,7 @@ func validatePeginQuote(watchedQuote w.WatchedPeginQuote, tx blockchain.BitcoinT !watchedQuote.PeginQuote.IsExpired() && tx.AmountToAddress(watchedQuote.RetainedQuote.DepositAddress).Cmp(watchedQuote.PeginQuote.Total()) >= 0 } + +func peginBtcDepositWatcherLog(msg string, args ...any) string { + return fmt.Sprintf("PeginDepositAddressWatcher: "+msg, args...) +} From f031c638c9238ccdabb779a8f693caac0da645f8 Mon Sep 17 00:00:00 2001 From: rafaelortiz Date: Tue, 19 Mar 2024 10:26:09 -0500 Subject: [PATCH 035/113] Adding loki-dev file --- docker-compose/loki-dev.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 docker-compose/loki-dev.yml diff --git a/docker-compose/loki-dev.yml b/docker-compose/loki-dev.yml new file mode 100644 index 00000000..e689c8ad --- /dev/null +++ b/docker-compose/loki-dev.yml @@ -0,0 +1,8 @@ +version: "3.7" +services: + lps: + logging: + driver: loki + options: + loki-url: $LOKI_ENDPOINT + loki-external-labels: job=docker,container=lps,host=flyover-01-dev.aws-us-east-1.flyover.rif.technology From 1faa3b93a7d08d2177e00f3153146e34e1ce7bf6 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 25 Mar 2024 11:46:26 +0100 Subject: [PATCH 036/113] test: bitcoind adapter tests --- .mockery.yaml | 5 +- .../adapters/dataproviders/bitcoin/client.go | 32 + .../adapters/dataproviders/bitcoin/common.go | 5 +- .../dataproviders/bitcoin/common_test.go | 121 +++ .../adapters/dataproviders/bitcoin/rpc.go | 1 + .../dataproviders/bitcoin/rpc_test.go | 496 +++++++++ .../adapters/dataproviders/bitcoin/wallet.go | 27 +- .../dataproviders/bitcoin/wallet_test.go | 414 ++++++++ internal/usecases/pegout/send_pegout_test.go | 4 +- test/mocks/block-2582756-testnet.txt | 1 + test/mocks/block-696394-mainnet.txt | 1 + test/mocks/listUnspent.json | 92 ++ test/mocks/listUnspentByAddress.json | 92 ++ test/mocks/rpc_client_mock.go | 982 ++++++++++++++++++ 14 files changed, 2261 insertions(+), 12 deletions(-) create mode 100644 internal/adapters/dataproviders/bitcoin/client.go create mode 100644 internal/adapters/dataproviders/bitcoin/common_test.go create mode 100644 internal/adapters/dataproviders/bitcoin/rpc_test.go create mode 100644 internal/adapters/dataproviders/bitcoin/wallet_test.go create mode 100644 test/mocks/block-2582756-testnet.txt create mode 100644 test/mocks/block-696394-mainnet.txt create mode 100644 test/mocks/listUnspent.json create mode 100644 test/mocks/listUnspentByAddress.json create mode 100644 test/mocks/rpc_client_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index 0ce8e991..6b2b572c 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -6,4 +6,7 @@ outpkg: mocks packages: github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting: interfaces: - sesClient: \ No newline at end of file + sesClient: + github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin: + interfaces: + rpcClient: \ No newline at end of file diff --git a/internal/adapters/dataproviders/bitcoin/client.go b/internal/adapters/dataproviders/bitcoin/client.go new file mode 100644 index 00000000..783a665a --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/client.go @@ -0,0 +1,32 @@ +package bitcoin + +import ( + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +type rpcWallet interface { + WalletCreateFundedPsbt(inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool) (*btcjson.WalletCreateFundedPsbtResult, error) + ListUnspent() ([]btcjson.ListUnspentResult, error) + CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) + FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) + SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) + SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) + GetWalletInfo() (*btcjson.GetWalletInfoResult, error) + WalletPassphrase(passphrase string, timeoutSecs int64) error + ImportAddressRescan(address string, account string, rescan bool) error + ListUnspentMinMaxAddresses(minConf int, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) +} + +type rpcClient interface { + rpcWallet + Ping() error + Disconnect() + GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) + GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) + GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) + GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) + GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) +} diff --git a/internal/adapters/dataproviders/bitcoin/common.go b/internal/adapters/dataproviders/bitcoin/common.go index 3481ddd1..1c1282c6 100644 --- a/internal/adapters/dataproviders/bitcoin/common.go +++ b/internal/adapters/dataproviders/bitcoin/common.go @@ -10,7 +10,6 @@ import ( "github.com/btcsuite/btcd/btcutil/bloom" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" log "github.com/sirupsen/logrus" @@ -23,10 +22,10 @@ const ( type Connection struct { NetworkParams *chaincfg.Params - client *rpcclient.Client + client rpcClient } -func NewConnection(networkParams *chaincfg.Params, client *rpcclient.Client) *Connection { +func NewConnection(networkParams *chaincfg.Params, client rpcClient) *Connection { return &Connection{NetworkParams: networkParams, client: client} } diff --git a/internal/adapters/dataproviders/bitcoin/common_test.go b/internal/adapters/dataproviders/bitcoin/common_test.go new file mode 100644 index 00000000..1d2680d8 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/common_test.go @@ -0,0 +1,121 @@ +package bitcoin_test + +import ( + "context" + "github.com/btcsuite/btcd/chaincfg" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestConnection_CheckConnection(t *testing.T) { + networkParams := &chaincfg.Params{} + client := &mocks.RpcClientMock{} + client.On("Ping").Return(assert.AnError).Once() + client.On("Ping").Return(nil).Once() + conn := bitcoin.NewConnection(networkParams, client) + conn.CheckConnection(context.Background()) + conn.CheckConnection(context.Background()) + client.AssertExpectations(t) +} + +func TestConnection_Shutdown(t *testing.T) { + endChannel := make(chan bool) + client := &mocks.RpcClientMock{} + client.On("Disconnect").Once() + conn := bitcoin.NewConnection(&chaincfg.Params{}, client) + go conn.Shutdown(endChannel) + <-endChannel + client.AssertExpectations(t) +} + +var decodedAddresses = []struct { + address string + expected []byte +}{ + {"n1BE7ioVukYS2GC88hT2K6cUvRiKwMwio7", []byte{111, 215, 167, 103, 99, 62, 208, 72, 131, 184, 122, 185, 112, 220, 93, 130, 94, 43, 74, 67, 67}}, + {"n2aSettzgmgwxMoaNQfNL58BqQtEAqCRp1", []byte{111, 231, 3, 144, 1, 201, 195, 77, 230, 3, 157, 153, 171, 189, 171, 215, 212, 180, 203, 182, 41}}, + {"mugStBVzw3ZRafzrYqzSrq5Qq9HH9cZJst", []byte{111, 155, 93, 94, 120, 235, 41, 106, 157, 161, 118, 38, 245, 188, 189, 62, 16, 242, 77, 50, 225}}, + {"mfng2KVQdxd1wmSEk5TRKVLwMarsX9sD7D", []byte{111, 2, 249, 18, 163, 98, 241, 57, 132, 12, 133, 190, 167, 51, 135, 39, 8, 238, 37, 238, 22}}, + {"miba3yyWiomi5HMXboKZ4YmEnj1T6m3RLx", []byte{111, 33, 199, 227, 213, 45, 69, 31, 199, 87, 161, 249, 199, 169, 25, 147, 105, 219, 96, 219, 46}}, + {"1Ab1Jfe6xQHzL8RHoHDukDQBEks35KFWHC", []byte{0, 105, 39, 135, 109, 109, 187, 191, 255, 241, 12, 238, 207, 1, 71, 119, 140, 83, 84, 176, 148}}, + {"19hiJTQpZyT3C7Hu29dJE2YYToCeKp6cGu", []byte{0, 95, 116, 30, 252, 161, 93, 178, 87, 245, 15, 180, 19, 235, 18, 247, 75, 185, 227, 86, 164}}, + {"1LQdpgVCY2nYzsoRNRHWhuCLxMpYzb6zzg", []byte{0, 212, 226, 177, 205, 89, 105, 145, 127, 135, 118, 204, 8, 84, 231, 158, 29, 254, 239, 62, 150}}, + {"17oKLsbZsd2BZdCDn1dbrbk2TT9HSzw2aM", []byte{0, 74, 147, 51, 90, 109, 233, 79, 47, 123, 200, 20, 172, 19, 242, 57, 107, 24, 145, 19, 190}}, + {"1NbJonAytRKfCFkvGcQNEUCXAFnf17bYQG", []byte{0, 236, 215, 165, 247, 66, 139, 143, 251, 27, 232, 167, 211, 106, 236, 65, 215, 144, 67, 50, 188}}, + {"1MwygkmvJHwwG934EbtkjhRUFyfMHLEPi9", []byte{0, 229, 200, 75, 213, 72, 142, 34, 190, 217, 45, 198, 157, 186, 72, 245, 47, 208, 252, 113, 119}}, + {"2MyKtiQcyAgQQdPDmBJcT4UMn6jyVdKVwxg", []byte{196, 66, 178, 190, 224, 218, 119, 248, 26, 82, 40, 48, 190, 49, 159, 125, 114, 243, 42, 175, 30}}, + {"2N9TujzoGXb4LkzCQscMuuRSwaTVPhFfYSy", []byte{196, 177, 232, 48, 84, 2, 170, 51, 48, 251, 57, 152, 125, 51, 230, 130, 144, 98, 27, 231, 156}}, + {"2NAvNk9t8fKwFRhMJGgY2wMLRboN8DHXeBB", []byte{196, 193, 225, 171, 152, 53, 142, 203, 39, 152, 199, 170, 199, 208, 233, 205, 65, 249, 239, 208, 91}}, + {"2MzqFJDg3QcbzeWX87XpxRpHZm6SSNoGdoF", []byte{196, 83, 56, 29, 183, 70, 201, 79, 21, 103, 129, 237, 73, 8, 214, 82, 67, 212, 124, 164, 213}}, + {"2MuBrh282woZkhycbpKAZ8zEptTAEtRSM62", []byte{196, 21, 77, 57, 173, 29, 183, 149, 178, 0, 34, 217, 55, 64, 184, 30, 90, 13, 91, 214, 241}}, + {"33BTakydSPnJfSfR13foniEsPCB2nuHiCb", []byte{5, 16, 89, 49, 17, 100, 144, 216, 162, 233, 218, 176, 118, 166, 174, 244, 82, 223, 195, 106, 191}}, + {"3Fi3ywSD7eBEtnoUuiW7zFSBmpATd3YDLs", []byte{5, 153, 195, 229, 51, 197, 179, 77, 218, 70, 180, 220, 57, 200, 231, 161, 90, 119, 51, 54, 31}}, + {"3DCT2YtzwZZYdr3pPEhqVjA1Amak89YrHf", []byte{5, 126, 58, 102, 228, 17, 153, 252, 64, 101, 122, 39, 140, 215, 39, 222, 50, 192, 152, 23, 248}}, + {"3EuQdJ651cN7Cv9jJk2EJPdRhKT9JJFpt8", []byte{5, 144, 241, 147, 242, 132, 35, 204, 174, 111, 172, 89, 117, 131, 75, 45, 4, 128, 176, 86, 42}}, + {"3BcLTSd24JRtJhLcKqkeF83rFmFxxY5qH9", []byte{5, 108, 206, 165, 252, 49, 214, 45, 206, 182, 122, 231, 101, 130, 27, 245, 51, 13, 14, 60, 174}}, +} + +func TestDecodeAddressBase58(t *testing.T) { + cases := decodedAddresses + for _, c := range cases { + withVersion, err := bitcoin.DecodeAddressBase58(c.address, true) + require.NoError(t, err) + withoutVersion, err := bitcoin.DecodeAddressBase58(c.address, false) + require.NoError(t, err) + assert.Equal(t, c.expected, withVersion) + assert.Equal(t, c.expected[1:], withoutVersion) + } +} + +func TestDecodeAddressBase58_ErrorHandling(t *testing.T) { + var errorCases []string = []string{ + "5Hwgr3u458GLafKBgxtssHSPqJnYoGrSzgQsPwLFhLNYskDPyyA", + "not in bas58", + "A", + "0x79568c2989232dCa1840087D73d403602364c0D4", + } + var result []byte + var err error + for _, c := range errorCases { + result, err = bitcoin.DecodeAddressBase58(c, true) + require.Error(t, err) + assert.Nil(t, result) + result, err = bitcoin.DecodeAddressBase58(c, false) + require.Error(t, err) + assert.Nil(t, result) + } +} + +func TestDecodeAddressBase58OnlyLegacy(t *testing.T) { + cases := decodedAddresses + for _, c := range cases { + withVersion, err := bitcoin.DecodeAddressBase58OnlyLegacy(c.address, true) + require.NoError(t, err) + withoutVersion, err := bitcoin.DecodeAddressBase58OnlyLegacy(c.address, false) + require.NoError(t, err) + assert.Equal(t, c.expected, withVersion) + assert.Equal(t, c.expected[1:], withoutVersion) + } + bech32Addresses := []string{"tb1q2hxr4x5g4grwwrerf3y4tge776hmuw0wnh5vrd", + "tb1qj9g0zjrj5r872hkkvxcedr3l504z50ayy5ercl", + "tb1qpkv0lra0nz68ge5lzjjt6urdz2ejx8x4e9ell3", + "tb1qqgzlw8yhyj6tmutat0u5n3dnxm3y6xnjp53wy9", + "tb1qcc4j0tdu3lwfl05her3crlnvtqvltt90n5s5m0", + "bc1qg5d579rlqmfekwx3m85a2sr8gy2s5dwfjj2lun", + "bc1qtqxd29s9k3tj3rq9fzj7mnjknvlqzy8hsuzs5x", + "bc1qv245zr29zw5urv5fy00c6km09l302fmlftf0aj", + "bc1qw4z64jjvuxyddjdcm88yt0ln7fntkyw0w6wqhp", + "bc1q8d7e3jrhsf8tj9q28x3msf8c644hdaetpqy7t4", + } + for _, c := range bech32Addresses { + _, err := bitcoin.DecodeAddressBase58OnlyLegacy(c, true) + require.Error(t, err) + assert.Contains(t, err.Error(), "only legacy address allowed") + _, err = bitcoin.DecodeAddressBase58OnlyLegacy(c, false) + require.Error(t, err) + assert.Contains(t, err.Error(), "only legacy address allowed") + } +} diff --git a/internal/adapters/dataproviders/bitcoin/rpc.go b/internal/adapters/dataproviders/bitcoin/rpc.go index 51a402f7..6ce91192 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc.go +++ b/internal/adapters/dataproviders/bitcoin/rpc.go @@ -136,6 +136,7 @@ func (rpc *bitcoindRpc) BuildMerkleBranch(txHash string) (blockchain.MerkleBranc } var cleanStore []*chainhash.Hash + // TODO we should change this to support witness when we support non legacy LP wallets store := merkle.BuildMerkleTreeStore(txs, false) for _, node := range store { if node != nil { diff --git a/internal/adapters/dataproviders/bitcoin/rpc_test.go b/internal/adapters/dataproviders/bitcoin/rpc_test.go new file mode 100644 index 00000000..d321d111 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/rpc_test.go @@ -0,0 +1,496 @@ +package bitcoin_test + +import ( + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "os" + "path/filepath" + "testing" +) + +const ( + testnetTestBlockHash = "00000000001e94d85c3e736aa4071d36d26547713820a27af9edbe97489c696f" + testnetTestTxHash = "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29" +) + +func TestBitcoindRpc_ValidateAddress(t *testing.T) { + client := &mocks.RpcClientMock{} + mainnet := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + testnet := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) + regtest := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.RegressionNetParams, client)) + invalid := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.SigNetParams, client)) + + p2pkhMainnet := "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" + p2shMainnet := "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy" + p2pkhTestnet := "mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn" + p2shTestnet := "2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc" + p2wpkhMainnet := "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" + p2wpkhTestnet := "tb1qg9stx3w3xj0t5j8d5q2g4yvz5gj8v3tjxjxw5v" + + require.NoError(t, mainnet.ValidateAddress(p2pkhMainnet)) + require.NoError(t, mainnet.ValidateAddress(p2shMainnet)) + require.ErrorIs(t, mainnet.ValidateAddress(p2pkhTestnet), blockchain.BtcAddressInvalidNetworkError) + require.ErrorIs(t, mainnet.ValidateAddress(p2shTestnet), blockchain.BtcAddressInvalidNetworkError) + require.ErrorIs(t, mainnet.ValidateAddress(p2wpkhMainnet), blockchain.BtcAddressNotSupportedError) + require.ErrorIs(t, mainnet.ValidateAddress(p2wpkhTestnet), blockchain.BtcAddressInvalidNetworkError) + + require.ErrorIs(t, testnet.ValidateAddress(p2pkhMainnet), blockchain.BtcAddressInvalidNetworkError) + require.ErrorIs(t, testnet.ValidateAddress(p2shMainnet), blockchain.BtcAddressInvalidNetworkError) + require.NoError(t, testnet.ValidateAddress(p2pkhTestnet)) + require.NoError(t, testnet.ValidateAddress(p2shTestnet)) + require.ErrorIs(t, testnet.ValidateAddress(p2wpkhMainnet), blockchain.BtcAddressInvalidNetworkError) + require.ErrorIs(t, testnet.ValidateAddress(p2wpkhTestnet), blockchain.BtcAddressNotSupportedError) + + require.ErrorIs(t, regtest.ValidateAddress(p2pkhMainnet), blockchain.BtcAddressInvalidNetworkError) + require.ErrorIs(t, regtest.ValidateAddress(p2shMainnet), blockchain.BtcAddressInvalidNetworkError) + require.NoError(t, regtest.ValidateAddress(p2pkhTestnet)) + require.NoError(t, regtest.ValidateAddress(p2shTestnet)) + require.ErrorIs(t, regtest.ValidateAddress(p2wpkhMainnet), blockchain.BtcAddressInvalidNetworkError) + require.ErrorIs(t, regtest.ValidateAddress(p2wpkhTestnet), blockchain.BtcAddressNotSupportedError) + + const unsupportedNetwork = "unsupported network" + require.Contains(t, invalid.ValidateAddress(p2pkhMainnet).Error(), unsupportedNetwork) + require.Contains(t, invalid.ValidateAddress(p2shMainnet).Error(), unsupportedNetwork) + require.Contains(t, invalid.ValidateAddress(p2pkhTestnet).Error(), unsupportedNetwork) + require.Contains(t, invalid.ValidateAddress(p2shTestnet).Error(), unsupportedNetwork) + require.Contains(t, invalid.ValidateAddress(p2wpkhMainnet).Error(), unsupportedNetwork) + require.Contains(t, invalid.ValidateAddress(p2wpkhTestnet).Error(), unsupportedNetwork) +} + +func TestBitcoindRpc_GetHeight(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + + client.On("GetBlockChainInfo").Return(&btcjson.GetBlockChainInfoResult{Blocks: 123}, nil).Once() + client.On("GetBlockChainInfo").Return(&btcjson.GetBlockChainInfoResult{}, assert.AnError).Once() + + height, err := rpc.GetHeight() + require.NoError(t, err) + require.Equal(t, big.NewInt(123), height) + + height, err = rpc.GetHeight() + require.Error(t, err) + require.Nil(t, height) +} + +func TestBitcoindRpc_DecodeAddress(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + cases := decodedAddresses + for _, c := range cases { + withVersion, err := rpc.DecodeAddress(c.address, true) + require.NoError(t, err) + withoutVersion, err := rpc.DecodeAddress(c.address, false) + require.NoError(t, err) + assert.Equal(t, c.expected, withVersion) + assert.Equal(t, c.expected[1:], withoutVersion) + } +} + +func TestBitcoindRpc_GetRawTransaction(t *testing.T) { + client := &mocks.RpcClientMock{} + txBytes, _ := hex.DecodeString("0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700") + client.On("GetRawTransaction", mock.Anything).Return(btcutil.NewTxFromBytes(txBytes)).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err := rpc.GetRawTransaction(testnetTestTxHash) + require.NoError(t, err) + require.Equal(t, txBytes, result) +} + +func TestBitcoindRpc_GetRawTransaction_FromBlock(t *testing.T) { + mainnetBlock := getTestBlock(t, "block-696394-mainnet.txt") + tx, err := mainnetBlock.Tx(0) + require.NoError(t, err) + client := &mocks.RpcClientMock{} + client.On("GetRawTransaction", mock.Anything).Return(tx, nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err := rpc.GetRawTransaction(tx.Hash().String()) + require.NoError(t, err) + expectedBytes, err := hex.DecodeString( + "01000000010000000000000000000000000000000000000000000000000000000000000000" + + "ffffffff5f034aa00a1c2f5669614254432f4d696e656420627920797a33313936303538372f2cfabe" + + "6d6dc0a3751203a336deb817199448996ebcb2a0e537b1ce9254fa3e9c3295ca196b10000000000000" + + "0010c56e6700d262d24bd851bb829f9f0000ffffffff0401b3cc25000000001976a914536ffa992491" + + "508dca0354e52f32a3a7a679a53a88ac00000000000000002b6a2952534b424c4f434b3a040c866ad2" + + "fdb8b59b32dd17059edaeef11d295e279a74ab97125d2500371ce90000000000000000266a24b9e11b" + + "6dab3e2ca50c1a6b01cf80eccb9d291aab8b095d653e348aa9d94a73964ff5cf1b0000000000000000" + + "266a24aa21a9ed04f0bac0104f4fa47bec8058f2ebddd292dd85027ab0d6d95288d31f12c5a4b800000000", + ) + require.NoError(t, err) + require.Equal(t, expectedBytes, result) +} + +func TestBitcoindRpc_GetRawTransaction_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + txBytes, _ := hex.DecodeString("0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700") + client.On("GetRawTransaction", mock.Anything).Return(btcutil.NewTxFromBytes(txBytes)).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + + _, err := rpc.GetRawTransaction("invalidHash") + require.Error(t, err) + + client = &mocks.RpcClientMock{} + client.On("GetRawTransaction", mock.Anything).Return(nil, assert.AnError).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + _, err = rpc.GetRawTransaction(testnetTestTxHash) + require.Error(t, err) + + client = &mocks.RpcClientMock{} + client.On("GetRawTransaction", mock.Anything).Return(btcutil.NewTxFromBytes([]byte{01, 02, 03})).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + _, err = rpc.GetRawTransaction(testnetTestTxHash) + require.Error(t, err) +} + +func TestBitcoindRpc_GetTransactionBlockInfo(t *testing.T) { + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlockVerbose", mock.Anything).Return(&btcjson.GetBlockVerboseResult{Height: 123}, nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err := rpc.GetTransactionBlockInfo(testnetTestTxHash) + require.NoError(t, err) + assert.Equal(t, [32]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x94, 0xd8, 0x5c, 0x3e, 0x73, 0x6a, 0xa4, 0x7, 0x1d, 0x36, 0xd2, 0x65, 0x47, 0x71, 0x38, 0x20, 0xa2, 0x7a, 0xf9, 0xed, 0xbe, 0x97, 0x48, 0x9c, 0x69, 0x6f}, result.Hash) + assert.Equal(t, big.NewInt(123), result.Height) +} + +func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err := rpc.GetTransactionBlockInfo("txhash") + assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) + require.Error(t, err) + + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(nil, assert.AnError).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) + assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) + require.Error(t, err) + + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlockVerbose", mock.Anything).Return(nil, assert.AnError).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) + assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) + require.Error(t, err) + + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: "blk"}, nil).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) + assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) + require.Error(t, err) +} + +func TestBitcoindRpc_BuildMerkleBranch(t *testing.T) { + block := getTestBlock(t, "block-2582756-testnet.txt") + + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + branch, err := rpc.BuildMerkleBranch(testnetTestTxHash) + require.NoError(t, err) + assert.Equal(t, blockchain.MerkleBranch{ + Hashes: [][32]byte{ + {155, 80, 207, 191, 224, 254, 254, 207, 78, 62, 249, 222, 89, 87, 171, 35, 220, 207, 189, 31, 70, 82, 141, 48, 198, 32, 160, 219, 132, 222, 4, 8}, + {71, 170, 231, 32, 77, 30, 186, 115, 142, 85, 108, 168, 0, 13, 46, 49, 84, 233, 136, 89, 60, 43, 243, 202, 144, 62, 255, 213, 141, 194, 189, 179}, + {59, 162, 140, 60, 248, 2, 245, 106, 154, 191, 234, 177, 48, 236, 162, 182, 251, 183, 83, 235, 29, 21, 107, 125, 34, 114, 26, 64, 162, 84, 126, 120}, + {93, 7, 146, 22, 74, 120, 71, 158, 154, 141, 202, 163, 154, 161, 141, 251, 221, 203, 104, 72, 74, 252, 21, 254, 64, 150, 96, 172, 63, 160, 41, 97}, + {234, 116, 222, 241, 199, 162, 201, 219, 87, 174, 86, 69, 151, 193, 247, 143, 142, 205, 242, 138, 20, 53, 19, 208, 210, 50, 150, 113, 181, 67, 117, 177}, + {141, 182, 8, 250, 221, 182, 182, 192, 127, 135, 114, 87, 57, 169, 102, 200, 136, 177, 0, 83, 135, 209, 203, 85, 237, 80, 109, 235, 151, 92, 88, 192}, + {23, 44, 34, 196, 81, 13, 32, 151, 5, 75, 11, 104, 32, 13, 151, 201, 99, 35, 250, 136, 32, 246, 156, 232, 196, 199, 28, 210, 227, 241, 116, 67}, + {56, 133, 146, 188, 185, 209, 23, 73, 20, 41, 218, 247, 211, 165, 219, 89, 80, 135, 219, 133, 198, 55, 47, 72, 23, 8, 219, 209, 63, 211, 217, 117}, + {95, 15, 80, 149, 169, 116, 91, 201, 28, 85, 231, 232, 222, 112, 145, 6, 33, 235, 81, 88, 148, 191, 165, 186, 206, 116, 16, 165, 252, 48, 10, 29}, + {13, 139, 52, 219, 135, 232, 179, 145, 111, 223, 227, 136, 201, 12, 147, 249, 30, 34, 41, 128, 144, 62, 214, 57, 252, 196, 229, 128, 136, 98, 83, 183}, + {22, 85, 158, 56, 49, 196, 24, 106, 225, 109, 143, 164, 106, 193, 100, 188, 171, 81, 231, 70, 160, 3, 7, 147, 226, 80, 59, 114, 2, 254, 137, 138}, + }, + Path: big.NewInt(406), + }, branch) +} + +func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, &mocks.RpcClientMock{})) + branch, err := rpc.BuildMerkleBranch("txhash") + require.Error(t, err) + require.Equal(t, blockchain.MerkleBranch{}, branch) + + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(nil, assert.AnError).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) + require.Error(t, err) + require.Equal(t, blockchain.MerkleBranch{}, branch) + + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlock", mock.Anything).Return(&wire.MsgBlock{}, assert.AnError).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) + require.Error(t, err) + require.Equal(t, blockchain.MerkleBranch{}, branch) + + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: "blkhash"}, nil).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) + require.Error(t, err) + require.Equal(t, blockchain.MerkleBranch{}, branch) +} + +func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { + block := getTestBlock(t, "block-2582756-testnet.txt") + + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + branch, err := rpc.BuildMerkleBranch("9dd8911176857dff8244f75f7c95782b3495048ad75632f0a58c8e942cefb223") + require.Error(t, err) + assert.Equal(t, "transaction 9dd8911176857dff8244f75f7c95782b3495048ad75632f0a58c8e942cefb223 not found in merkle tree", err.Error()) + assert.Equal(t, blockchain.MerkleBranch{}, branch) +} + +func TestBitcoindRpc_GetPartialMerkleTree(t *testing.T) { + block := getTestBlock(t, "block-2582756-testnet.txt") + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + pmt, err := rpc.GetPartialMerkleTree(testnetTestTxHash) + require.NoError(t, err) + assert.Equal(t, + []byte{ + 6, 4, 0, 0, 12, 29, 10, 48, 252, 165, 16, 116, 206, 186, 165, 191, 148, 88, 81, 235, 33, 6, 145, 112, 222, + 232, 231, 85, 28, 201, 91, 116, 169, 149, 80, 15, 95, 117, 217, 211, 63, 209, 219, 8, 23, 72, 47, 55, 198, 133, + 219, 135, 80, 89, 219, 165, 211, 247, 218, 41, 20, 73, 23, 209, 185, 188, 146, 133, 56, 177, 117, 67, 181, 113, + 150, 50, 210, 208, 19, 53, 20, 138, 242, 205, 142, 143, 247, 193, 151, 69, 86, 174, 87, 219, 201, 162, 199, 241, + 222, 116, 234, 120, 126, 84, 162, 64, 26, 114, 34, 125, 107, 21, 29, 235, 83, 183, 251, 182, 162, 236, 48, 177, + 234, 191, 154, 106, 245, 2, 248, 60, 140, 162, 59, 179, 189, 194, 141, 213, 255, 62, 144, 202, 243, 43, 60, 89, + 136, 233, 84, 49, 46, 13, 0, 168, 108, 85, 142, 115, 186, 30, 77, 32, 231, 170, 71, 41, 139, 79, 137, 234, 184, + 202, 172, 176, 219, 45, 144, 54, 141, 203, 222, 167, 51, 57, 34, 164, 37, 242, 240, 123, 199, 127, 113, 194, 6, + 7, 159, 8, 4, 222, 132, 219, 160, 32, 198, 48, 141, 82, 70, 31, 189, 207, 220, 35, 171, 87, 89, 222, 249, 62, 78, + 207, 254, 254, 224, 191, 207, 80, 155, 97, 41, 160, 63, 172, 96, 150, 64, 254, 21, 252, 74, 72, 104, 203, 221, 251, + 141, 161, 154, 163, 202, 141, 154, 158, 71, 120, 74, 22, 146, 7, 93, 192, 88, 92, 151, 235, 109, 80, 237, 85, 203, + 209, 135, 83, 0, 177, 136, 200, 102, 169, 57, 87, 114, 135, 127, 192, 182, 182, 221, 250, 8, 182, 141, 67, 116, 241, + 227, 210, 28, 199, 196, 232, 156, 246, 32, 136, 250, 35, 99, 201, 151, 13, 32, 104, 11, 75, 5, 151, 32, 13, 81, 196, + 34, 44, 23, 183, 83, 98, 136, 128, 229, 196, 252, 57, 214, 62, 144, 128, 41, 34, 30, 249, 147, 12, 201, 136, 227, 223, + 111, 145, 179, 232, 135, 219, 52, 139, 13, 138, 137, 254, 2, 114, 59, 80, 226, 147, 7, 3, 160, 70, 231, 81, 171, 188, + 100, 193, 106, 164, 143, 109, 225, 106, 24, 196, 49, 56, 158, 85, 22, 3, 215, 173, 1, + }, + pmt) +} + +func TestBitcoindRpc_BuildMerkleBranch_MainnetBlock(t *testing.T) { + cases := [2]struct { + tx string + pmt string + }{ + { + tx: "07f8b22fa9a3b32e20b59bb90727de05fb634749519ebcb6a887aeaf2c7eb041", + pmt: "f30800000d" + + "41b07e2cafae87a8b6bc9e51494763fb05de2707b99bb5202eb3a3a92fb2f807" + + "731c671fafb5d234834c726657f29c9af030ccf7068f1ef732af4efd8e146da0" + + "a9d6075f4758821ceeef2c230cfd2497df2d1d1d02dd19e653d22b3dc271b393" + + "94c2d2e51eae99af800c39575a11f3b4eb0fdf5d5deff0b9f5ff592566f4f173" + + "2b3f6d41bded4344899a348d3053ccd68e922626e589da71d9a583ccfe9e3be6" + + "393a24e14d18006b54a967963c56da58b18ce770cdb3b32e56d88c138c473a1a" + + "37acc29a7788a88404fb9a05c416c2ad8f340a61c1ea331528a91ae6210db4f0" + + "e22d21c55b3f6806387ca34aba54522a7fe15e593ab0d0ff89c6d826cf4e7455" + + "99bdfed66a4ef1a366f056363158b2907388a5bd4013643d83a016469d392aab" + + "2319910a0ac801d2c9793c661f1bb02863f672288ce3b4c5e365cff81932fbe4" + + "3d1eba4b027f80b1240ab5b8c677167602ee63c5a6dad213777b6fbbd3dd9778" + + "71f30b975d1a8f6cd62535985ea4d11f5c7f80549eab1b18a5cc011872b5403d" + + "ee666302831a3c64d1604c5c0bec9c796d8dcace974ae97e5837ff0d446d060c" + + "04ff1f0000", + }, + { + tx: "ddf5061f9707f0c959bf24278d557b264716672c1b601ec50112d6dfe160d9d3", + pmt: "f30800000d" + + "c0746a357444e9948a18a612e02df5a99240e77f1ff75dd949d5b4038dcf3667" + + "3a03c716cf722cff7d264c763088ceeb1665f26c6fdd5835d841eeee2f3ece4a" + + "203a24db8b7a51e4ab0e35a6b4151f6d7f1eef96f32e4fceaac6127521911618" + + "6efb7fdb763e821f99bd6af8d044cc6feadd7b4716e6938335a3e08548f5a077" + + "5dd364971faab5cd089cd1fa713e8be658a67a704d39952218f6518e5045d269" + + "d3d960e1dfd61201c51e601b2c671647267b558d2724bf59c9f007971f06f5dd" + + "0eab2677f52c996a3f941bef3ec57ebdf22429c37dee5ae68892df30f8acfc22" + + "5c6fed56bdff34686135e68fda4b716713e60258b6971c03091f25115c008eec" + + "48a828c75ad7340fadbc368636b4014f6e8386c3990a35620cbddca933a72b02" + + "d990fb8a602fcda9e1e41120c25f4981362a9dfc7f7ed1f5188482b8ee3f532f" + + "0ee6234e44af99351ee430f4ac0fa7b71fe9c601c78480b9a97fea305d3abca2" + + "35a6668846093803e07c48dc9a75be90ed6edd4debb0b7b49bc057e093ad395e" + + "ee666302831a3c64d1604c5c0bec9c796d8dcace974ae97e5837ff0d446d060c" + + "04dbd50300", + }, + } + mainnetBlock := getTestBlock(t, "block-696394-mainnet.txt") + for _, c := range cases { + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlock", mock.Anything).Return(mainnetBlock.MsgBlock(), nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + serializedPMT, err := rpc.GetPartialMerkleTree(c.tx) + require.NoError(t, err) + result := hex.EncodeToString(serializedPMT) + assert.Equal(t, c.pmt, result) + } +} + +func TestBitcoindRpc_GetPartialMerkleTree_ErrorHandling(t *testing.T) { + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, &mocks.RpcClientMock{})) + pmt, err := rpc.GetPartialMerkleTree("txhash") + require.Error(t, err) + require.Nil(t, pmt) + + client := &mocks.RpcClientMock{} + block := getTestBlock(t, "block-2582756-testnet.txt") + msgBlock := block.MsgBlock() + msgBlock.Transactions = append(msgBlock.Transactions, msgBlock.Transactions...) + client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetBlock", mock.Anything).Return(msgBlock, nil).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err := rpc.GetPartialMerkleTree(testnetTestTxHash) + require.Error(t, err) + assert.Contains(t, err.Error(), "block matches more than one transaction") + assert.Nil(t, result) +} + +var rpcServerReceiveTx = ` + { + "amount": 0.00500000, + "confirmations": 163, + "blockhash": "00000000001e94d85c3e736aa4071d36d26547713820a27af9edbe97489c696f", + "blockheight": 2582756, + "blockindex": 406, + "blocktime": 1710931198, + "txid": "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29", + "wtxid": "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29", + "walletconflicts": [], + "time": 1710930012, + "timereceived": 1710930012, + "bip125-replaceable": "no", + "details": [ + { + "address": "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5", + "parent_descs": [], + "category": "receive", + "amount": 0.00500000, + "label": "dev", + "vout": 1 + } + ], + "hex": "0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700" + } + ` + +var rpcServerSendTx = ` + { + "amount": -0.00500000, + "fee": -0.00006700, + "confirmations": 1649, + "blockhash": "0000000000002d82f47f76d9b877af8f264504d6e0f89b82e89d2d84f64f269a", + "blockheight": 2581763, + "blockindex": 9, + "blocktime": 1710330877, + "txid": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", + "wtxid": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", + "walletconflicts": [], + "time": 1710330592, + "timereceived": 1710330592, + "bip125-replaceable": "no", + "details": [ + { + "address": "mqbKtarYKnoEdPheFFDGRjksvEpb2vJGNh", + "category": "send", + "amount": -0.00500000, + "vout": 0, + "fee": -0.00006700, + "abandoned": false + }, + { + "category": "send", + "amount": 0.00000000, + "vout": 1, + "fee": -0.00006700, + "abandoned": false + } + ], + "hex": "020000000187bc0ecbe7c384a5c9ed76ed212395718f2e305e805151067a27fc056f27a242020000006a47304402204992bb143d814f6b560198300ae0e4b0b1223c57a525cedd1a8d71238d8efd7802202f928d3a53f8a263528e7131c0cd5cb25715aad87769d5e47e99ee4876ee181a0121029e17dc44ad33f0f6f54d404d87441ef108873b451d4f236833ea9bb03ea2b04cfdffffff0320a10700000000001976a9146e84f2d601c6742a94bf9ba32bea7e3f3e377fbb88ac0000000000000000226a20ef4f66bcf4f55bc72c2c8e01894fe944a5fa3be3a8b2a2a474f0447838ddc1c2f8da1d00000000001976a9145c6dbcd0321aadc2b51b564825aa444c886030b988ac00000000" + } + ` + +func TestBitcoindRpc_GetTransactionInfo(t *testing.T) { + txReceiveDetails := btcjson.GetTransactionResult{} + err := json.Unmarshal([]byte(rpcServerReceiveTx), &txReceiveDetails) + require.NoError(t, err) + client := &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&txReceiveDetails, nil).Once() + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) + result, err := rpc.GetTransactionInfo(testnetTestTxHash) + require.NoError(t, err) + assert.Equal(t, blockchain.BitcoinTransactionInformation{ + Hash: testnetTestTxHash, + Confirmations: uint64(163), + Outputs: map[string][]*entities.Wei{ + "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5": {entities.NewWei(0.005 * 1e18)}, + }, + }, result) + + const sendTxHash = "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21" + txSendDetails := btcjson.GetTransactionResult{} + err = json.Unmarshal([]byte(rpcServerSendTx), &txSendDetails) + require.NoError(t, err) + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(&txSendDetails, nil).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) + result, err = rpc.GetTransactionInfo(sendTxHash) + require.NoError(t, err) + assert.Equal(t, blockchain.BitcoinTransactionInformation{ + Hash: sendTxHash, + Confirmations: uint64(1649), + Outputs: map[string][]*entities.Wei{ + "mqbKtarYKnoEdPheFFDGRjksvEpb2vJGNh": {entities.NewWei(0.005 * 1e18)}, + "": {entities.NewWei(0)}, // Null data script output + }, + }, result) +} + +func TestBitcoindRpc_GetTransactionInfo_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err := rpc.GetTransactionInfo("txhash") + assert.Equal(t, blockchain.BitcoinTransactionInformation{}, result) + require.Error(t, err) + + client = &mocks.RpcClientMock{} + client.On("GetTransaction", mock.Anything).Return(nil, assert.AnError).Once() + rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) + result, err = rpc.GetTransactionInfo(testnetTestTxHash) + assert.Equal(t, blockchain.BitcoinTransactionInformation{}, result) + require.Error(t, err) +} + +func getTestBlock(t *testing.T, filename string) *btcutil.Block { + absolutePath, err := filepath.Abs("../../../../test/mocks/" + filename) + require.NoError(t, err) + blockFile, err := os.ReadFile(absolutePath) + require.NoError(t, err) + blockBytes, err := hex.DecodeString(string(blockFile)) + require.NoError(t, err) + block, err := btcutil.NewBlockFromBytes(blockBytes) + require.NoError(t, err) + return block +} diff --git a/internal/adapters/dataproviders/bitcoin/wallet.go b/internal/adapters/dataproviders/bitcoin/wallet.go index d09639c9..4fe90bc1 100644 --- a/internal/adapters/dataproviders/bitcoin/wallet.go +++ b/internal/adapters/dataproviders/bitcoin/wallet.go @@ -60,10 +60,16 @@ func (wallet *bitcoindWallet) EstimateTxFees(toAddress string, value *entities.W if err != nil { return nil, err } - return entities.SatoshiToWei(uint64(simulatedTx.Fee * BtcToSatoshi)), nil + btcFee, err := btcutil.NewAmount(simulatedTx.Fee) + if err != nil { + return nil, err + } + satoshiFee := btcFee.ToUnit(btcutil.AmountSatoshi) + return entities.SatoshiToWei(uint64(satoshiFee)), nil } func (wallet *bitcoindWallet) GetBalance() (*entities.Wei, error) { + var amount btcutil.Amount balance := new(entities.Wei) utxos, err := wallet.conn.client.ListUnspent() if err != nil { @@ -72,7 +78,10 @@ func (wallet *bitcoindWallet) GetBalance() (*entities.Wei, error) { for _, utxo := range utxos { if utxo.Spendable { - balance.Add(balance, entities.SatoshiToWei(uint64(utxo.Amount*BtcToSatoshi))) + if amount, err = btcutil.NewAmount(utxo.Amount); err != nil { + return nil, err + } + balance.Add(balance, entities.SatoshiToWei(uint64(amount.ToUnit(btcutil.AmountSatoshi)))) } } return balance, nil @@ -151,12 +160,14 @@ func (wallet *bitcoindWallet) ImportAddress(address string) error { func (wallet *bitcoindWallet) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { var ok bool var tx blockchain.BitcoinTransactionInformation + var btcAmount btcutil.Amount + const maxConfirmationsForUtxos = 9999999 result := make([]blockchain.BitcoinTransactionInformation, 0) parsedAddress, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) if err != nil { return nil, err } - utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses(0, 9999, []btcutil.Address{parsedAddress}) + utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses(0, maxConfirmationsForUtxos, []btcutil.Address{parsedAddress}) if err != nil { return nil, err } @@ -172,10 +183,14 @@ func (wallet *bitcoindWallet) GetTransactions(address string) ([]blockchain.Bitc } txs[utxo.TxID] = tx } - if _, ok = tx.Outputs[address]; !ok { - tx.Outputs[address] = make([]*entities.Wei, 0) + if _, ok = tx.Outputs[utxo.Address]; !ok { + tx.Outputs[utxo.Address] = make([]*entities.Wei, 0) + } + btcAmount, err = btcutil.NewAmount(utxo.Amount) + if err != nil { + return nil, err } - tx.Outputs[utxo.Address] = append(tx.Outputs[utxo.Address], entities.SatoshiToWei(uint64(utxo.Amount*BtcToSatoshi))) + tx.Outputs[utxo.Address] = append(tx.Outputs[utxo.Address], entities.SatoshiToWei(uint64(btcAmount.ToUnit(btcutil.AmountSatoshi)))) } for key, value := range txs { diff --git a/internal/adapters/dataproviders/bitcoin/wallet_test.go b/internal/adapters/dataproviders/bitcoin/wallet_test.go new file mode 100644 index 00000000..352e32dd --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/wallet_test.go @@ -0,0 +1,414 @@ +package bitcoin_test + +import ( + "cmp" + "encoding/json" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math" + "os" + "path/filepath" + "slices" + "testing" +) + +const ( + mockPassword = "pwd" + mockFeeRate = 0.0001 + testnetAddress = "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5" + mainnetAddress = "141dsd6YZxdKcmTZckG4Q9qGzJbR1Jc9kv" + expiredTime = 1711098457 // 2024-03-22 + unexpiredTime = 1900400857 // 2030-03-22 +) + +func TestBitcoindWallet_Unlock(t *testing.T) { + expiredLockUntil := expiredTime + nonExpiredLockUntil := unexpiredTime + client := &mocks.RpcClientMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + UnlockedUntil: &expiredLockUntil, + }, nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + UnlockedUntil: &nonExpiredLockUntil, + }, nil).Once() + client.On("WalletPassphrase", mockPassword, int64(bitcoin.WalletUnlockSeconds)).Return(nil).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(nil, client), mockFeeRate, true, mockPassword) + err := rpc.Unlock() + require.NoError(t, err) + err = rpc.Unlock() + require.NoError(t, err) + client.AssertExpectations(t) +} + +func TestBitcoindWallet_Unlock_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + client.On("GetWalletInfo").Return(nil, assert.AnError).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(nil, client), mockFeeRate, true, mockPassword) + err := rpc.Unlock() + require.Error(t, err) +} + +func TestBitcoindWallet_ImportAddress(t *testing.T) { + client := &mocks.RpcClientMock{} + client.On("ImportAddressRescan", testnetAddress, "", false).Return(nil).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + err := rpc.ImportAddress(testnetAddress) + require.NoError(t, err) + client.AssertExpectations(t) + + client = &mocks.RpcClientMock{} + client.On("ImportAddressRescan", mainnetAddress, "", false).Return(nil).Once() + rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.MainNetParams, client), mockFeeRate, true, mockPassword) + err = rpc.ImportAddress(mainnetAddress) + require.NoError(t, err) + client.AssertExpectations(t) +} + +func TestBitcoindWallet_ImportAddress_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.MainNetParams, client), mockFeeRate, true, mockPassword) + err := rpc.ImportAddress(testnetAddress) + require.Error(t, err) + + rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + err = rpc.ImportAddress(mainnetAddress) + require.Error(t, err) +} + +func TestBitcoindWallet_EstimateTxFees(t *testing.T) { + client := &mocks.RpcClientMock{} + amount := entities.NewWei(5000000000000000) + var changePosition int64 = 2 + var input []btcjson.PsbtInput + var lockTime *uint32 + var bip32Derivs *bool + feeRate := mockFeeRate + floatAmount, _ := amount.ToRbtc().Float64() + client.On("WalletCreateFundedPsbt", + input, + []btcjson.PsbtOutput{ + {testnetAddress: floatAmount}, + {"data": "0000000000000000000000000000000000000000000000000000000000000000"}, + }, + lockTime, + &btcjson.WalletCreateFundedPsbtOpts{ + ChangePosition: &changePosition, + FeeRate: &feeRate, + }, + bip32Derivs, + ).Return(&btcjson.WalletCreateFundedPsbtResult{ + Fee: 0.0006, + }, nil).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + fee, err := rpc.EstimateTxFees(testnetAddress, amount) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(600000000000000), fee) + client.AssertExpectations(t) +} + +func TestBitcoindWallet_EstimateTxFees_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + fee, err := rpc.EstimateTxFees(mainnetAddress, entities.NewWei(1)) + require.Error(t, err) + assert.Nil(t, fee) + + client.On("WalletCreateFundedPsbt", + mock.Anything, + mock.Anything, + mock.Anything, + mock.Anything, + mock.Anything, + ).Return(nil, assert.AnError).Once() + rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + fee, err = rpc.EstimateTxFees(testnetAddress, entities.NewWei(1)) + require.Error(t, err) + assert.Nil(t, fee) + + client.On("WalletCreateFundedPsbt", + mock.Anything, + mock.Anything, + mock.Anything, + mock.Anything, + mock.Anything, + ).Return(&btcjson.WalletCreateFundedPsbtResult{Fee: math.NaN()}, nil).Once() + rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + fee, err = rpc.EstimateTxFees(testnetAddress, entities.NewWei(1)) + require.Error(t, err) + assert.Nil(t, fee) +} + +func TestBitcoindWallet_GetBalance(t *testing.T) { + absolutePath, err := filepath.Abs("../../../../test/mocks/listUnspent.json") + require.NoError(t, err) + rpcResponse, err := os.ReadFile(absolutePath) + require.NoError(t, err) + var result []btcjson.ListUnspentResult + err = json.Unmarshal(rpcResponse, &result) + require.NoError(t, err) + client := &mocks.RpcClientMock{} + client.On("ListUnspent").Return(result, nil).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + balance, err := rpc.GetBalance() + require.NoError(t, err) + assert.Equal(t, entities.NewWei(57962080000000000), balance) + client.AssertExpectations(t) +} + +func TestBitcoindWallet_GetBalance_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + client.On("ListUnspent").Return(nil, assert.AnError).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + balance, err := rpc.GetBalance() + require.Error(t, err) + assert.Nil(t, balance) + + client.On("ListUnspent").Return([]btcjson.ListUnspentResult{{Amount: math.NaN(), Spendable: true}}, nil).Once() + rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + balance, err = rpc.GetBalance() + require.Error(t, err) + assert.Nil(t, balance) +} + +func setupSendWithOpReturnTest(t *testing.T, client *mocks.RpcClientMock, encrypted bool) { + var input []btcjson.TransactionInput + var lockTime *int64 + satoshis := 50000000 + + address, err := btcutil.DecodeAddress(testnetAddress, &chaincfg.TestNet3Params) + require.NoError(t, err) + client.On("CreateRawTransaction", + input, + mock.MatchedBy(func(outputs map[btcutil.Address]btcutil.Amount) bool { + for k, v := range outputs { + require.Equal(t, address, k) + require.Equal(t, btcutil.Amount(satoshis), v) + } + return len(outputs) == 1 + }), + lockTime, + ).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(satoshis), PkScript: []byte("a payment script")}}, + LockTime: 0, + }, nil).Once() + + if encrypted { + nonExpiredLockUntil := unexpiredTime + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + UnlockedUntil: &nonExpiredLockUntil, + }, nil).Once() + } + + tx := &wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{ + {Value: int64(satoshis), PkScript: []byte("a payment script")}, + {Value: int64(0), PkScript: []byte{0x6a, 0x08, 0x02, 0x01, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00}}, + }, + LockTime: 0, + } + + changePos := 2 + feeRate := mockFeeRate + var isWitness *bool + client.On("FundRawTransaction", tx, btcjson.FundRawTransactionOpts{ + ChangePosition: &changePos, + FeeRate: &feeRate, + }, isWitness).Return(&btcjson.FundRawTransactionResult{Transaction: tx, Fee: 0, ChangePosition: 2}, nil).Once() + client.On("SignRawTransactionWithWallet", tx).Return(tx, true, nil).Once() + client.On("SendRawTransaction", tx, false).Return(chainhash.NewHashFromStr(testnetTestTxHash)).Once() +} + +func TestBitcoindWallet_SendWithOpReturn(t *testing.T) { + data := []byte{2, 1, 0, 7, 2, 0, 0, 0} + params := &chaincfg.TestNet3Params + + client := &mocks.RpcClientMock{} + setupSendWithOpReturnTest(t, client, true) + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(params, client), mockFeeRate, true, mockPassword) + txHash, err := rpc.SendWithOpReturn(testnetAddress, entities.NewWei(500000000000000000), data) + require.NoError(t, err) + assert.NotEmpty(t, txHash) + assert.Equal(t, testnetTestTxHash, txHash) + client.AssertExpectations(t) + + client = &mocks.RpcClientMock{} + setupSendWithOpReturnTest(t, client, false) + rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(params, client), mockFeeRate, false, mockPassword) + txHash, err = rpc.SendWithOpReturn(testnetAddress, entities.NewWei(500000000000000000), data) + require.NoError(t, err) + assert.NotEmpty(t, txHash) + assert.Equal(t, testnetTestTxHash, txHash) + client.AssertExpectations(t) +} + +func TestBitcoindWallet_SendWithOpReturn_ErrorHandling(t *testing.T) { + setups := sendWithOpReturnErrorSetups() + for _, setup := range setups { + client := &mocks.RpcClientMock{} + data := []byte{2, 1, 0, 7, 2, 0, 0, 0} + setup(client, &data) + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + txHash, err := rpc.SendWithOpReturn(testnetAddress, entities.NewWei(500000000000000000), data) + require.Error(t, err) + assert.Empty(t, txHash) + client.AssertExpectations(t) + } +} + +// nolint:funlen +func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]byte) { + return []func(client *mocks.RpcClientMock, data *[]byte){ + func(client *mocks.RpcClientMock, data *[]byte) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + }, + func(client *mocks.RpcClientMock, data *[]byte) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + LockTime: 0, + }, nil).Once() + client.On("GetWalletInfo").Return(nil, assert.AnError).Once() + }, + func(client *mocks.RpcClientMock, data *[]byte) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + LockTime: 0, + }, nil).Once() + for i := 0; i < txscript.MaxDataCarrierSize; i++ { + *data = append(*data, byte(i)) + } + }, + func(client *mocks.RpcClientMock, data *[]byte) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + LockTime: 0, + }, nil).Once() + nonExpiredLockUntil := unexpiredTime + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + UnlockedUntil: &nonExpiredLockUntil, + }, nil).Once() + var isWitness *bool + client.On("FundRawTransaction", mock.Anything, mock.Anything, isWitness).Return(nil, assert.AnError).Once() + }, + func(client *mocks.RpcClientMock, data *[]byte) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + LockTime: 0, + }, nil).Once() + nonExpiredLockUntil := unexpiredTime + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + UnlockedUntil: &nonExpiredLockUntil, + }, nil).Once() + var isWitness *bool + client.On("FundRawTransaction", mock.Anything, mock.Anything, isWitness).Return(&btcjson.FundRawTransactionResult{}, nil).Once() + client.On("SignRawTransactionWithWallet", mock.Anything).Return(nil, false, assert.AnError).Once() + }, + func(client *mocks.RpcClientMock, data *[]byte) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + LockTime: 0, + }, nil).Once() + nonExpiredLockUntil := unexpiredTime + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + UnlockedUntil: &nonExpiredLockUntil, + }, nil).Once() + var isWitness *bool + client.On("FundRawTransaction", mock.Anything, mock.Anything, isWitness).Return(&btcjson.FundRawTransactionResult{}, nil).Once() + client.On("SignRawTransactionWithWallet", mock.Anything).Return(&wire.MsgTx{}, false, nil).Once() + client.On("SendRawTransaction", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + }, + } +} + +func TestBitcoindWallet_GetTransactions(t *testing.T) { + absolutePath, err := filepath.Abs("../../../../test/mocks/listUnspentByAddress.json") + require.NoError(t, err) + rpcResponse, err := os.ReadFile(absolutePath) + require.NoError(t, err) + var result []btcjson.ListUnspentResult + err = json.Unmarshal(rpcResponse, &result) + require.NoError(t, err) + client := &mocks.RpcClientMock{} + parsedAddress, err := btcutil.DecodeAddress(testnetAddress, &chaincfg.TestNet3Params) + require.NoError(t, err) + client.On("ListUnspentMinMaxAddresses", 0, 9999999, []btcutil.Address{parsedAddress}).Return(result, nil).Once() + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + transactions, err := rpc.GetTransactions(testnetAddress) + require.NoError(t, err) + slices.SortFunc(transactions, func(i, j blockchain.BitcoinTransactionInformation) int { + return cmp.Compare(i.Hash, j.Hash) + }) + assert.Equal(t, []blockchain.BitcoinTransactionInformation{ + { + Hash: "2ba6da53badd14349c5d6379e88c345e88193598aad714815d4b57c691a9fbdf", + Confirmations: 2439, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(2531000000000000)}, + }, + }, + { + Hash: "586c51dc94452aed9a373b0f52936c3e343c0db90f1155e985fd60e3c2e5c2b2", + Confirmations: 6, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(2000000000000000)}, + }, + }, + { + Hash: "da28401c76d618e8c3b1c3e15dfe1c10d4b24875f23768f30bcc26c99b9c82d4", + Confirmations: 2, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(200000000000000), entities.NewWei(1000000000000000), entities.NewWei(1000000000000000)}, + }, + }, + { + Hash: "fda421ccdff7324a382067d1746f6a387132435de6af336a0ebbf3f720eaae4d", + Confirmations: 6, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(20000000000000000)}, + }, + }, + }, transactions) + client.AssertExpectations(t) +} + +func TestBitcoindWallet_GetTransactions_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientMock{} + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockFeeRate, true, mockPassword) + transactions, err := rpc.GetTransactions("invalidAddress") + require.Error(t, err) + assert.Nil(t, transactions) + + client.On("ListUnspentMinMaxAddresses", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + transactions, err = rpc.GetTransactions(testnetAddress) + require.Error(t, err) + assert.Nil(t, transactions) + + client.On("ListUnspentMinMaxAddresses", mock.Anything, mock.Anything, mock.Anything).Return([]btcjson.ListUnspentResult{{Amount: math.NaN()}}, nil).Once() + transactions, err = rpc.GetTransactions(testnetAddress) + require.Error(t, err) + assert.Nil(t, transactions) +} diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go index a358cf67..2ee7115c 100644 --- a/internal/usecases/pegout/send_pegout_test.go +++ b/internal/usecases/pegout/send_pegout_test.go @@ -20,7 +20,7 @@ import ( var now = uint32(time.Now().Unix()) var retainedQuote = quote.RetainedPegoutQuote{ - QuoteHash: "1c2d3f", + QuoteHash: "e64215867af36cad04e8c2e3e8336618b358f68923529f2a1e5dbc6dd4af4df1", DepositAddress: "0x654321", Signature: "0x112a3b", RequiredLiquidity: entities.NewWei(1000), @@ -32,7 +32,7 @@ var retainedQuote = quote.RetainedPegoutQuote{ } var pegoutQuote = quote.PegoutQuote{ - LbcAddress: retainedQuote.QuoteHash, + LbcAddress: "0x5678", LpRskAddress: "0x1234", BtcRefundAddress: test.AnyAddress, RskRefundAddress: "0x1234", diff --git a/test/mocks/block-2582756-testnet.txt b/test/mocks/block-2582756-testnet.txt new file mode 100644 index 00000000..3e1158c7 --- /dev/null +++ b/test/mocks/block-2582756-testnet.txt @@ -0,0 +1 @@ +00000020d8b0d22f570df065562874461372d2d7957025b063bdd3f91400000000000000dfa343c3e55ca2ef4f0b3e8f35218c4adcd2fb2997cc8a7777f98fcc25145c70febcfa65ffff001d4004191dfd0604040000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1203e4682704eebcfa650843f719b701000000000000000377781d00000000001600143758d475313d557dbe8b1d90406c5b3b4dbbc00df79900000000000017a914a775ee7e3118ac67f181faca330f1d5c7658d205870000000000000000266a24aa21a9ed3dccc6b158d03b681f5cd8c71653097d0e6a51ac3e19de0add0a2a43419622a5012000000000000000000000000000000000000000000000000000000000000000000000000002000000000101c280864a2647fd23014ad1080ed858b096e35a447056ab94beb8e06e03953696020000001716001483b3b0bf2864338e157d6afa74c9382e2f155ae6ffffffff02a8c3020000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887f8ad33c400000000017a914bddb82c3cb6ca521f79edbf47206265e3c24f7c4870247304402207d7ff596eb3abc15e383a58b5f232284c0c4a03f4ed1d4355194b71bdada1c7702202d59cb1795bd068da783f71c59c619dee3d957a1f7bb5050267350b9ccfe005201210307bf5747e92385958eafaa1da8d6649adc452b9f69fb3cf1fac6407a73a149d70000000002000000000101ed018e20e419923fa29585d93161cae0a1a9ebb5095ca055e9888a8c0b956f460000000000ffffffff0a2202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee7a637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887fa637000000000000225120588ed22ff366c2629c1adce54315bfc78297eac4b0816a81092775b0ae08887f0340682a2cc738c375362ca02bb30e809266da1e611917c984dfab213f6626ca39a9c08c5a91fe619a00f8933b5fd836041e75a3e5b5fe2003fc989df6a34324352a4520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0300000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee703401b90195746fd0423b733cb15c22355a67a0e95d7adab90e92bf8b0912d22cd7af4524176253b8696965d94e5b164fcaebf77be0f18d486c26f6471f92cd4c0974520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0100000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee70340ef99098c52e5350f81f9530bedb250e55ebb3bdb7861d77f2daa81cbde34c85823dae97756870d5cafbd678341c03c702304448e102eb205a0cfa51d1a7c72484520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0600000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee70340e0d84956c5dfd6a5724ddfdeb194e49419176de5cd333c9eddd61d5a8731983166c7fdd35a8b5b8d10aa6c962aa7f5677b7d6834d14db11dfc637eb0ba671c884520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0800000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee7034010becd691738af9398083c03a275ad1f303e2368cc7cff8241e73bdec073c4cf323fb79721cad45b2132f31138f23111e4133fc8c46357bbdd198c77fe2cf50e4520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0400000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee70340ce257aabd6518a0266c5432dd51061fc0190fbb0d4b51eaca9d2c00ba7f64dd40778a9f1f8343f7fc149aabdc64c9001cde845802801ada77e6c7f4f6b2abead4520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0200000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee7034028dd2b6d47d56e1df3622a35ca5debf0d6e77267cf73c1851b8b1f3f3b998255115a00bc6ffba40d311c5ec6e0d808610e8a124704ebfafa4b600daf807821454520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0900000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee70340f8401ca3c860f2b2be1c07a2d399ba7af78a9c363f65964d4b90e7b86265348306abed3152767f60a9cea4e66affde75db0583651762499444f81d1010a050e84520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0700000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee70340881b79ef50067a758bd097077acd5df935cef7fb7bc670c24d537a2d4d72c0c0c65762e6dd4c240bf589f7e8928d413c3a3020f7f4d6f0080c54e012336b09f34520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d5550000000002000000000101ba3e1b6a07022ea27822e337f48d0de66bc04263b3d5936266948d6a5116c61a0500000000ffffffff012202000000000000225120f790a969c43abc0ecd34ccc1a2244c7feed623b70583930824b581fae6885ee7034065aaf8fce66cf61f6d5e455e4f5b238a36234bae71937da5beb9d4f8bc63d2303e594f4fb5a092032f0012689f13b9d1c6b0ea8c9c45f462248f2fe0f194a9cd4520d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d555ac0063036f726401010a746578742f706c61696e000d656c7261756c69746f2e6274636821c0d90ef3f63c98d07f0458251f147d987b7b918ba54c92807513064271f028d55500000000010000000001028ab7122ec1bfb98c04701c47b219d4e9704f59ee9d2d52b13d307297be26401b0000000000ffffffff8ab7122ec1bfb98c04701c47b219d4e9704f59ee9d2d52b13d307297be26401b0100000000ffffffff02ebc2000000000000160014a2e12c105e36f2b7f8865f37db2fd129291be16bb324310000000000160014ae9e1975f3782cfebf62fbfbb6e69fd84bd9d1d802473044022025182309094bd616f3780f1a90095c3b1ae18fbf941699f759c292058c87a08a02206275a870dec4aa296578927552733e643c6eb621443c986541c4390b269390b901210371f8deb4872e62048c3f997d640b9a3e55a893415d868b5a474d8258e8532da90247304402206c31cf2118248bebcf7d41d977dffe0dca124fd07b884bc25750e94ac64c4b100220709c8373977a4a93b33841a9b865be4cb83c172a8ce86a07461104011e275b3801210371f8deb4872e62048c3f997d640b9a3e55a893415d868b5a474d8258e8532da9000000000100000001a3ebe65e799f02cc4bd56cc8120fd28d50df6e0de7b7dfd16fd37f4310f97460010000006a4730440220008b8c72bf32532c83948eec00bebdb47bc2647e8a9328855575a9109dd3787402206fac73661eb30cb7ea12a91c78102cc6cfd3a211e00cbc7a23dc31e74e919272012103d2ddf1614013e0b9e2422e74a3bfb51de3a4443173cad4b9c30a1803057439b4ffffffff021e020800000000001976a914ea0fd2c0711f85c1eae572b83b7300f820b6741988acdc0500000000000017a914b0ad986d4b5e240f1e18d2d59a1dcb36b82b8795870000000001000000000103059ec1481e44df83667aea938ffbac7277d00e8b4c5e88a4b459f55d0c07605d0100000000ffffffff17c24cf29e712097a9fb43b3ab361f9bcd0090a9d845ea3979079df7a92ffe320100000000ffffffff0f6c052699ef6f61661e7ab377e3c9ee2eb24b5177451dd6fdff4afc99900b400000000000ffffffff02608f0000000000001600146c2d298054d9b4fa3f41cb44daa48f6b165c39f6d0590000000000001600141873719dc70b48f574ec9f9d77bb182047e9f0eb02473044022029e1e6a9b6fcb7261d53b43d93831f55d98c7949bc1e5b7a307fa9be7df03af5022005c6901ac1618edcf410a4b158593d2a7bce14be09b6372bdc13eb52e2bc0885012103ae1993992f232611e6b1a090bef2d9bf3ada3055021f92b5447ffe5d18a097b00247304402207a7ce130a4a3c8bacd2c560e2b8d94dfde7c4c80af8c835d9e743f80386c0c0502203bcf30d0b0645798de5953183790a2dcf42463d190e21f83b814aa3ed03bbf00012103ae1993992f232611e6b1a090bef2d9bf3ada3055021f92b5447ffe5d18a097b00248304502210081375f0c2b2d59fe34abd995c051a40a64083f8c7759aedf5a44de8b06db131302200528e93336f74fc2b95a19a37cd51f33b434c6e03af3dee3377e8b6ab8ae58b0012103ae1993992f232611e6b1a090bef2d9bf3ada3055021f92b5447ffe5d18a097b00000000001000000000102d68f88617b988a8c6a00d7ac58767163cadf5af59ed82e329656b1c0a176e2eb0000000000ffffffffe3247e9f4bb3ced874ecd554fc084c5bb04b430e6c015f74351c5a66c035c9080000000000ffffffff02209c0000000000001600141873719dc70b48f574ec9f9d77bb182047e9f0ebb0810000000000001600146c2d298054d9b4fa3f41cb44daa48f6b165c39f602483045022100a860b2121796a114e58c34390041e9b216c009ebbb9133a825e08a7adc7c3d470220692dda6693ce79a7baf31a3db4d94abf653a88193eb7588b8af0a2b17b4e9e8d012103041502bcd0d3acaf66c0125ddd99a00787f6899097ef65b0567e775a47854ab10247304402207f40de5e4b5431c3bebc1e4d1a2dbc0f4d4373e941de8ec46bbd2d6ed8656ff8022065a890e9ca2409ede83525fed91ed1ebfe07b5af094a1064de41659cbe832737012103041502bcd0d3acaf66c0125ddd99a00787f6899097ef65b0567e775a47854ab100000000010000000001030f6c052699ef6f61661e7ab377e3c9ee2eb24b5177451dd6fdff4afc99900b400100000000ffffffff17c24cf29e712097a9fb43b3ab361f9bcd0090a9d845ea3979079df7a92ffe320000000000ffffffff059ec1481e44df83667aea938ffbac7277d00e8b4c5e88a4b459f55d0c07605d0000000000ffffffff02608f0000000000001600141873719dc70b48f574ec9f9d77bb182047e9f0eb508e0000000000001600146c2d298054d9b4fa3f41cb44daa48f6b165c39f602483045022100b3cf767d3d92497b5b20a664173084e982c860e01704f3a0f9eee4284c205ed102207bcd6c42184393ebbe11a5fcd48037416026272fa1071ec7711a352dc399662a012103041502bcd0d3acaf66c0125ddd99a00787f6899097ef65b0567e775a47854ab1024830450221008220d15704244542d3aba3392f10d3c4792a3cf83f7df79948dc5e1c3be3cb1902206fa3f5bb98e1b8a63e483a8c39ee4ae6eb04975056b8c90365e85d92a48b56e2012103041502bcd0d3acaf66c0125ddd99a00787f6899097ef65b0567e775a47854ab102483045022100866641780901ab0894778f78e42a2665c80a3044047fb81e8c5092fc31bbeb3a022043b1dd8a21d0ebefb8ca94363ab55880a0c6be753e5d0279b11818bb8a676789012103041502bcd0d3acaf66c0125ddd99a00787f6899097ef65b0567e775a47854ab10000000001000000000102ba1643cee60bd7d468855b42f8638c653308fd1a76fec66458ae62363d82bbc20000000000ffffffff67ab4316accb383603e2009458b9250b7fb52e7b1d136a653882df9805d1c1780100000000ffffffff02209c0000000000001600146c2d298054d9b4fa3f41cb44daa48f6b165c39f6a0320000000000001600141873719dc70b48f574ec9f9d77bb182047e9f0eb02483045022100b05a0c53bd675333be96f2a559a6a7fe7ed7b8fd4840d68ca2bc6d3ebbc2f7ac022039f10448ca2cafdbc6e0a9880ba5bf58a20517ef74f1aca684cc1d38c8ad80e4012103ae1993992f232611e6b1a090bef2d9bf3ada3055021f92b5447ffe5d18a097b002483045022100f32307f86168be79056bdbebfc17383371646f3c00806a9e9238acd3b5aa0c0c02207bf8c4d2ed1a9c94367d464ee6ccf50925cfd6c60b9564f25365c1209167e2f7012103ae1993992f232611e6b1a090bef2d9bf3ada3055021f92b5447ffe5d18a097b0000000000200000001a43cd6d09ccb2e5c3d2ff148ae6411ce010069d0a3581d0ec2aa76d3ee36ae1a000000006a473044022072a9eeef2b23a7453cb86175f22f9815507886ac4ff1270fc10bf77aad6aa39c02205e8876940367434f3db30dc331e628897cb34e671e28634173c2f517b508faa7012103f236951565eb0bc3e2d9522b72b44704760e836ae505462780be430da01add48ffffffff02c0efb800000000001976a9149164be989d905af7f642c4da3c2cf0240e41cb8588ac0000000000000000226a204c810ecc2fbdc8420d8848fd7f3a134a367ed0313c9725e4ca5be19a6914a92800000000010000000001011ceaca2df504caa41e84664a5ee0b1ffdfa50f1c764611239def15b64562029e0000000000ffffffff0171180000000000002251206ff2fb6ea8e2ef1a10977be25d489fb824aac64cdfe2a9212656b8b009db577101406e26583baf2e7230f51322c9927e36dc5e295cefe8b99a3f45eb11fb13df9261571e6dcbe294ced462092224cbee8968bb4faf2867861479aaf3a5a1bee1980f0000000002000000000102f5d2df69d9fb5944be37b789093442a03abc50890d6f2e12cc333cc4bf5dec1d0100000017160014477f4e0f80e72b12c61a5ff4b4129e70cc54e2eafdffffff779a9cea1ecb95d39f911fd38cc6ae51d6565d58c6c7a4b3d8842710aec5395501000000171600140562c88a3f4cc24b665f5a19d80d9af63916a153fdffffff02a41f00000000000017a914bfb7432d6730c56285c7008eb86431427e00c861874a7f07000000000017a914035812f916efe4bb8754c72ad831bf38477b9b1b87024730440220018667b38e2079b05a293ea76168bcd2b2793a0894cb19f782c903dcb881bfcb02201cf7f564af99a5eeb0c76dd5c6933aa7781c1385597954b77928642849bcb15301210214c98e47c3726d0f2c0ba3634bc53d4e6f105cd921e18ca32d4c1444ed9151b6024730440220190ca3d1cbf4e51f54fb28b85227dbccaecf4fb4a629b0fe0bf426c9c8c4fbca022030669a5d664db43a68536c633b28547d78e34c2fbbc05e04b39b6735f17c23bb01210369c1a642acfc75737b881468160f845206788a899220664e07194adbd3f96763e3682700020000000001024b1994aca9dbb386644f02b772b512e8e3ca2eb5324dd1cb16b33a90c9900a5b0200000000fdfffffffda7b1526a368ab26853ca73cfa836a130955e7165fd2570caf2d5b255d21ed80100000000fdffffff01c48e0000000000001600146c92346acc48c0d6d9579af4378f720905ade442024730440220683e0538480a8d46a4f73d323c8540d17492b29ab2843fad74f6c3548f3978640220405740bd13a46a4208b4c55899f6af300d5d051faf0d2a0ff50a849e26f392200121030d2fa425327572e810621c9d9729c57ea7ba6442684728c4054752263389050002473044022078705520e97c39ebd8c9e834d96dd31e1ba3b73884e4d12fcc0fb2f7f8eeec1602207e4105a1ab4319f276b23b1f2a4473e4beafa969101e08cb00b739f2ae5f4a400121026e08c0aa24371c3f6a79ef2f660a11fc3b1e378653f33319aa564601666974ce0000000002000000000102088d1dcd3e8f580761ef5e111bde84c82fa528794cb186a0edde5df046274fcc0100000000ffffffff680ee25550f21b7e7e467be489c256edaf188ace144c1fb39d58a69a6ed0fef20100000000ffffffff0220a1070000000000225120f1644d16c5f272ac61e1b2a71f9436bf1743743857fc1abdc7fe5284f00cf91798460100000000002251205c6ba8b51a7157857b2ec167b46316dff814965192a51940e9b664bcb85938f50140bf04e9694da93c487f3afcf31daf7748a58ae5cb9fc7b29a52d0e250f58bf8368d931e86a29d1b6b1c2a02c1526ccadb8a6038339a776e1bd3862b769561c36c01402bb33730ff7c9c488e2bacc9e2b8093c8ba9001ddc19656d6152652be8eca0b85802a2889a00e0537ab604214f27353ec5c230d8b70208aaa225adf3d07e5e670000000002000000000101ae959eb64dfe1e63e6617e12812cdf78d27e50f752ffc53625c7dd161980561e0000000000ffffffff020003000000000000225120555290e5f7b764046cb27a2a66518a43f74e142e19bf85786c6bfb9ac1a4d244761b000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb02483045022100c56130f0bd7aea1a29c3d6500b26fc3b7a933e291dee78234ff7da75c9fd6cb70220432a7309d2a3f44af6d492147943b178c4013c05c2d69bafd8f30c0d4d1c7d2601210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be6000000000200000000010156eb766fc45feac586e536e847be730542977600fee911bc232775a02dfad1080200000000ffffffff020003000000000000225120181172794e342967d79e0b2d9282f6967741cbf400a90e8061fc62dd28b2d63569370500000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a0140fb1ffe56ff8296bed2c8c98276f1aa9b95479fda37df834aba02b237942391eae31579eaf4103a32f046cf5e99882fc634f44c8b110680b3d3d9eda14c65d82f000000000200000000010116084d8278374451686c3ca91bd0e2e730ba46df477d319d7955ee62ca104c400000000000ffffffff020003000000000000225120108c666c06524842111b37c1e65ae58891d47bfba5e9f1856cec8ca6837457d6af9c0000000000001600144fd15bc95fe622874fbf3ca958e8520afbe812a502473044022023763788374d63bdf2503d84b18f8e4469492517ef496c15ea19a3c478d1cb86022030552d068c5e71828c3a844fda5a4070f809a69418df1087e996c532401fce020121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f00000000020000000001012aa9b6b9aebb3f4e35cc5a31dc534835294627afe5c0acbc02cc35bab572e8020100000000ffffffff020003000000000000225120d6dac04e97afb2ee53681e5a20143f0fb0b33b076a4f52bd7634e3e1a27b6c4969560100000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf602260140f383e919f2adebe71756e095cf8e8af39fedc7590f50b4a55687cb0a77fed4df490e2b3f216e4e5d2605492c2a3f2a1ccfd27623fd784769011b3fe6aa3512fa0000000002000000000101fd2fec950df6519f9a08016e2651aac4c6d58d966238201b154abd141a4865aa0000000000ffffffff020003000000000000225120975c973792dd6a144239a193df7bc6058961486110aaa3234e4fe93927e08b0d3cd10000000000002251202e9b8b195fd59ad0425c72cc016ec285e4835567e7b91f4f50c7b1c7c57766250140710dd0b9df23d8d384ff79a45a0d69f8296ebcc8d044049fef3fdb8c389bcf2d40babbd1116bf9e5fca8fecc2765fea9ee370f61d6f7899c21fcfe493d625ba800000000020000000001011365605de09dfb1b6b450ecd15837dc2091bdef9b957f6c46b775b227f442f100000000000ffffffff02000300000000000022512039e309bb5105f457658de83ca1fd040949acd92bf9053ad60d1ab99ddef45cd3c2b80000000000002251202e9b8b195fd59ad0425c72cc016ec285e4835567e7b91f4f50c7b1c7c577662501404565c74fc269ac1300f0a0d34afd30dbcc40ff1f5e1da5e333470a5f0fdd62112c1fc6f5be897882e9e4d9181c819fddc094d326459012acf1af7634bf2a2b7d00000000020000000001019780938a342dd5270b748ff2556a9a81b86289ccce53f5ca6ae646fe12286dff0300000000ffffffff02000300000000000022512086efda03aeec5a2fcade98994821d1450bf794346447cae55494a77031495da71a3c010000000000225120f57d4e15ee4f8a75cf85ef07f492018e9116abfbbb5ce4871ab0fe40f4a45baa0140c104c61048851a2a41bd422ec68ddbc55f6f2e13b60640076b122aae1d328176ceeaac899445cba4ee8ab14ac400565a62ad83fce7831f9ff80e52eacf5361f70000000002000000000101244602128a4144a5c57813f81d4e3636e2c84446bc15a552ac207e9ed7b4a8690100000000ffffffff0200030000000000002251206f3aae0f81ee3ffca5fd8cb957ef7ac7736ca5d07e82f408fdb9a0727c1d9d8763560100000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc874901407dd574bf80e0dc74b3610b9a6ba0b03c452f97faae46912f7f7fe1b36269fedea4bf0a486f08402402737e9accca5c0c51696862435ec405c9633cd32664a4e90000000002000000000102b2c3349d067a368e6c42e9af5c01662e6cfda4a3bdc1673b47e7492eceb856cb0000000000fdffffff4210b0ac005ff8160335fe79d0a3b5512a82158e9cb35b38bb691ad22e5aa21b0200000000fdffffff03b0ad0100000000001600146e3b96b5669bd5e27873ce95c1f02b64a979de6f58020000000000002251204a46a5e21c4b6ef670b4f04c64046b3bb03bcb03a67333c0986d2bf55db4b6518311000000000000160014ab89fc9481dfd49bb149edfa83944aaff2eac9ef0247304402205bbe460a4a0d61b2d4ec6ae0ee98027cdd3e6b53afa774396757f130600703b202201c8ccbb20134595458f55d2b0078742773f871ba036f187927d8315e88e022b60121038ec13ed35c7c892917d1794481c8131c08aaf84ca2f3a69d6a2d86b7ae22564c02483045022100ce4d2daf1c8c9d008e1b2ab8da25610d60e07011c94a8652877ebfe939cf7d31022035775ea3956e9d8ff9d8da52df0eab34c56c4aefdd46deb4fa23460c8cfb71880121038ec13ed35c7c892917d1794481c8131c08aaf84ca2f3a69d6a2d86b7ae22564c0000000002000000000101f6d4b7c9b809e42aeb26ebd5d4aff3e6438f27880e2b2729fe8e56ea66e1655d0100000000ffffffff02d0070000000000001600146de634c18c3ec2dddd76182ed00f85175097334f75b7f60000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd080140e82a9609e987e6f398903ba60318b9a305d417d9dacd7c894ca4cd683f9536bd1e899615257192b7c6213d01baffad0b230ba13f8dc4e04e6985f74081c8961c00000000020000000001019ef1612a8baf32203b8ae90150d58ef1cbe4c0c6039d4656a34849e310374d840100000000ffffffff0273110000000000002251205913cae0ecbb98368a2e62d7ef48a4a976c2009049e17104df3f7668b4f1b129c79e0e0000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd08014003da6c32a5297c63a4cb3a588918e8107415758d559a73a466e2a2a9f0540f4b82d2285fbe5da52d65cd096a2da76968555fb44a91f9701cc00b2b2d9b60ab8d00000000020000000001019b9b716f03635dde9f40c6368975ce3a22a6082f77a0db62de4782b0bf5b3a8e0100000000ffffffff027311000000000000225120195ec3bc324089f4b22d6d618adedd23c67578e500ad518b2649627c61c3b4ffe0451e0000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd080140f4804d3daf94fdce3363395da7fc77f7d54ff3ab71b0a385161f30d136d1facf08d839619afe9d0b306f5dc719ea69b9590902cc91eaf46ed126fb2c5e56ac7600000000020000000001018041f4ab14896b9f1803b6e997c0dabc8ebd3038e5758f93ca198e52982e61310100000000ffffffff02d0070000000000002251209325290238c58c0fc829469b9dd91c5b2e17dac2cc2c5a157bde598c623b3c3cd71c0f0000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd0801400b0ed6532ce36d1985e609f01d13eb75373a83073173339c737138c94f79fae37dc3de35bd2230425726f684fc491feff738cf4a0c90f636b1f7c4554db789c000000000020000000001014884c4999d4770b4e6e186c8c631a4c5c4da390b9ef19543b98110257f97f08c0000000000fdffffff022202000000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd082b0800000000000016001485f1b224d0efe6c3af434513b3dd935f3ed8d3430340e5d34d6b322bae2d660dec3eb10645d5e658e65ce563958fb338a8cf81f1bd4a22aff985304d811eff488cd877332cf3e860be99d9ab0edbfc39a7972f648d197e20a11922b314bbf6d01f75de5adac727ba1cd847762e380df53d69f9d3dd45f6a5ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800387b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2254534e54222c22616d74223a22313030227d6821c0d354433729f5634b8b588394dcb31ccc3440a0138350ea7d550c7f1e45b5f6ae0000000002000000000102ef30c6727d3f00692063acd8281d1125c69fc3ad633731c2ee8c0585d6f45a9b0000000000ffffffffdc9653cbdef7fc1bee0b56d4ac928c0864b49b40681a04d454eb1932381632b00100000000ffffffff0222020000000000002251209325290238c58c0fc829469b9dd91c5b2e17dac2cc2c5a157bde598c623b3c3c23aff60000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd080140b322a0110de055a6e52206b40c09cd645470972d777ab21138ba367023c0cd6652f23dcf9e9497e75bfafd6d742b51978991170643087b6d70822549012f771b0140a0a4c6387a0e13c9f36a37404f0c6ff224823250591fefe668a6a5e00261836438df6c8f0d5674d9fdb0be7c405a819be183566b2a561fa5e3235138eadf1899000000000200000000010140f6d5bbe402caaf1777030bbb7d90ede731449347a4488fdbf5570879a0d38f0100000000ffffffff02d0070000000000001600146de634c18c3ec2dddd76182ed00f85175097334fb8a1f60000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd0801406aa113358d46b6bfe0da759c461eb83fb6b3f26cd759851abbfc42ae5c1d5dd163ebdd8c8d9f11ed44865d227b73d766bbfd2f969163012fefb439311e5a393f00000000020000000001017d2c76b64e6b4644b5c6b7bb102210ea18001df246272c5049846ecf29e6f5800100000000ffffffff027311000000000000225120806f49490d9d007150a50f6c18b3ed2fe06c01f6d001db3ea1a560dff9f9db5b328af60000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd0801406f7f193511e5db6ff9f4c2b5444eb2f4aa19bea49c086da3372d7e83becdfe6d95a43704d662dfa84e9ab3373170bd249f3af8d39b9c9a527f16edc283fb2c68000000000200000000010111f2eb4630974edca2de511c0f8003962fd632d240f42377f6bf000daa7a2a4c0100000000ffffffff02e8030000000000002251209325290238c58c0fc829469b9dd91c5b2e17dac2cc2c5a157bde598c623b3c3c3780f60000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd0801407c68bcab2ff84fe0b68c7f898d2f7501413c868ee19e48783e9ed0fa33ec9fd308bd070c93dfd98c6f4674dd16b3d456d0fa12d4c68098256cfd075a52f1d864000000000200000000010111f2eb4630974edca2de511c0f8003962fd632d240f42377f6bf000daa7a2a4c0000000000fdffffff022202000000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd082b0800000000000016001469fa4895fab5dc39ea85a11c51fc85e20e79f1180340b38d1f03e597b21be2f35a5d372493adf022ed99246d59503a1e5f9801faaf5345574f3f70579a9af6c88577b87c1319e8d14a421a65a24ea4a99753850134f77e20c0862c35d422533ecf92aef9f39a2fc148bbdba249c0cd2ff47115db51496262ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800387b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2254534e54222c22616d74223a22313030227d6821c169b804eb54f996afc7f56cb84555cfa2dc851ee07cfb776db34bc12ed46a0bbf00000000020000000001020f109023c02ef4c7c795273b3d4ffbb1b7210703d8f8239a42433e4792d2272e0000000000ffffffff19ce71126ba870fb9ff63f6f6cae727d2da3982c4b366fc272663424a2cace900100000000ffffffff0222020000000000001600146de634c18c3ec2dddd76182ed00f85175097334f5d78f60000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd080140d8be8f63ef4748bbe37e4e60fd433a3c46d88dac54f55caa36d4769e72255914b06500f8116c78a544b957c7f1d9ada1796f3b479f4a0cf8d763dea184a4a021014030b139dedfa6ab5ab35f5979d290f6996684724a8283593e697eeec45e87f17a5fcc2ad99b6a97398a9d4e1244d9908b4064e6a435e9361ba098e0907954301b000000000200000000010198e587d992d6d157da51b1caea8388bcf588575543dccb36fa030df76939e2f20000000000fdffffff022202000000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd082b08000000000000160014e1a8a6da9139e1a6ac8d793d4a767677975af33a0340158a5579dad9c79104091d93c1ff0f562fac98a97c1d145625122ee2ac388ad4bcedad0d064d5563c8c3e13f28291e3f3960ba1ca2c1488e43fc710a825074cc7e2084080fe7413122122985e1cad19f8f054762bcdcf76a9579065e8327ea630353ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800387b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2254534e54222c22616d74223a22313030227d6821c1282e9db9a48eef6bfcf8cad7183b0073fac5e7743c111298d4f49bd3957f9e7b000000000200000000010260e43fe4f0b7ffcf821b830e4424b090ceae895322fa315e764e1ab53c0d9eb20100000000ffffffffcfcb80c9868a029ff7f0a9786dc8d616cbb470bd158174c918aa7df24118e6cd0000000000ffffffff03a0860100000000001600144c7e20854fa354082b0416fd55d89e479192601100000000000000003d6a104252494447455f544f5f47454c494f532a3078626234384133386364453035333632414265413838363834653162433563453231313941323538371503000000000000160014bbcfebf6f31d0b8061d4ef392401e29aba6fb5e802483045022100ca5f9a3df31da91f015546f98d3ec864837f495e39bbfc881d66f2cb28d926f702202b6f3c84a34350908ceb2d5975573349bb9c4f134e1709196247362139500db501210378b195286e80f1e7171d5368d4ffa554f629c46c3cfb99a9e027a7e7f937c5f7024730440220230176d4c10e5c1cad25ce0770ff927942663294127c5190389b587b3cebef7d02207cda0cc3ec634f80b29a654830dbba53ee7e9e418bd68f523c88b432826757cb01210378b195286e80f1e7171d5368d4ffa554f629c46c3cfb99a9e027a7e7f937c5f700000000020000000001024a25a38fc2307ec66aba7556300c46f5c0522973c315ffebe352fba75c9d3d8b0000000000ffffffffe52d770abac5ad04a898a9331e828196e8fc9cf3c4386c3f73691aa5e943c6f30000000000ffffffff03a0860100000000001600144c7e20854fa354082b0416fd55d89e479192601100000000000000003d6a104252494447455f544f5f47454c494f532a307839633466346161353361654538343337666638466462644234373036644645634230393264666430603d0000000000001600140d34fad2d2116c9154ec555ea99c15858155575c02483045022100fe7e918286fe6f7511bbd513208036a89e873a2fb534c7cd6c523a3ed56e6ed102207a5c680e3412b9af98b78277d6e1584530af56105dd88bba230bed8aa6b66ee1012102f0ce48a527e57bacf8b702ba5fbb60cc3ad187de86e1010506bcfbab06bbff180247304402202819a061569c18ed384e07f90436d0abe0369ee7809bae009ce92de1d65426ee02207437a342ad38ed90c079a1a1c2ec653b13a74794d4c8f9ea03c6739488e58eb8012102f0ce48a527e57bacf8b702ba5fbb60cc3ad187de86e1010506bcfbab06bbff1800000000020000000001013761fb65a1b24515023b8910a0c96abcc9049668c0b9c5dd6d272d51def6a2f90200000000ffffffff01000300000000000022512078cbf3b1f6c68c954beb40552bedad5dce4d80cb8788e9a9ddde24bcc307a36901408ee5041eb8bdd1b68967adc43fda94c0f4e74a03a932b6629d7816f2c3a9419d0e802e665fd7fdb5b7a251709d7394d8ba30be4efda1b32cc83b5a725deb9f750000000001000000000101b715555cb061728514209b527ea812bedb1cc2a4c73049d3a2cbb360c97f91b00100000000ffffffff02760400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6f5d30000000000001600145f7c005618017aff230e4c59931a0b72ad97274002483045022100fcf166c66cf41258e032370cc1020b93cf683a205255eda7e59c800cd1fa323202207bd2e855436a46bfa7635a1f36c01bcb1624385565e47dad8ef925584b486653012102a07e21ca9c8b7728d8b8a4069ce13100b87cee453c6a0a58a6214a9b48a0eeb500000000010000000001015844ca75493bffbf00a32b940e23028f74d19752b06df6ba11ff3ea92c54c21b0100000000ffffffff02840400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6f80f0100000000001600148e8ed5165ec225c3ec78bec87d590b89121d719202473044022047483f9e9049c92de56a500c7006a6288080eadf8abedf856003e982f6615e1e022013102b1a5f4a4be46cd338007be88ac32f78e69033dcc8b9064bb993253f92500121038a714fcfbc809f631f64ae62c22bc0e33c323c57fbef9e2a1fb6c6c4bfc76cff00000000010000000001014d243b7c726d0016e6150c63b3dab924607190205ca25c93f84187a7aa44f1bc0100000000ffffffff028c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6b048010000000000160014340a1c93860b5b0e959174d0809cdb6b6cfa96d402483045022100e1ca30e47dfb699b86ec8ad814776f430b5ffcf03db3a05690cd71f68fbbb2b402205728f9945db351a6acf7b457b91d8c8b3f6db5620471f6687c37134ea7e03256012102ef27a70b604a9c0b4a2c22af58781b0ce67256f4a0080af778f97b339728aae4000000000100000000010152466385b9eda47067849d65128a4b92337ac0146460cb61131016d5fdd9ba190100000000ffffffff028d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6746f01000000000016001474640da9e310bdff32358e4407672006ba9518db02473044022063c99d386a81e4c0d43095f74865d69b93426cfaf572d9cf81976a3b0b887db0022069b33ac72e41b824280801963a7bdbff89c3ba12fdf77f798f11ddbf286d057a012103d1f36e8761a018f6c5410f405bc1320e718c5962b44624445918bf348bda585a00000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b310400000000ffffffff02a00400000000000016001460426faa653c536502e0a0d35658d0ba259a63b630030000000000001600146d5f02124d715b3f49f515be14c870dae6ae97230248304502210098feb9b3184029007c802c812edbe62c0bf3d452a360909dc00a5d1bc554042702204ea8a2d91284bf4fb53c9bbf6db16f185d2599ff51feb2170ff44d5c111e24aa012103dc36e85fbb61ba521facbc4b14b1c19ec9588cc4cbe69baf6cf76abdd4f55cf000000000010000000001013841b7c2163558696f23c4d7dd8869f00eb865a25692fd7e15886e094cf3ffca0100000000ffffffff02670400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6a323010000000000160014df75a11cef6dfd356155e084943d9cb7ed16d24c02483045022100ce1a2cb35aeff46083a32aacdf73e9a03470e7b879767d26290ff4b94956826502204a6374c45ec06363ee9d820e264c74eb61af417b6b892a173702e37a12a0ac9e01210332d520bfb148cb6586d7fe958ff491f14046601984dc78b165d218bc3a2faa3b00000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b311e00000000ffffffff02540400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67c030000000000001600141ac55e7ed1149a058a132f9cc570b4ce5a991f700248304502210092651d010f164773988c42e64555f14bb702d1748b695c38bff7153c4e0809ea022042416eadcb35d8551e7c70e28c0881313fe8c46da37b75ad326a4ac275d253d80121025dc3a0cc4fd2dba3fbad2500ecc657a226d591d2f6a7f5107fba0080bdf6bf990000000001000000000101c7789ef114805460d42334c97158f1d61fa2a76ba02f3861d6d2d37548f55f380100000000ffffffff02760400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6a099010000000000160014bf5b873757ee3626fba8d1a630f48b2465b28c8b0248304502210085ba0bd380e5b993b52ae09c69e560a8f906fe36015dd0aed759d15ea290054b02203d96ee3ba1785984c3f45679cf6d3176a296089d568482c9a817469d4b4b20ba012102b7b790baf49462773511a3795a3e7b0515c32831a2ba45691fe28e1005c80ab6000000000100000000010163e347d467ce617e301b15412c133a295710e5a72410274364943a473883458e0000000000ffffffff029c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b682780100000000001600147786fc1f5daa999e300975ade3d4ca8db06c8db402483045022100fe90fd0a190b08437ecf71a11fc792e012873adbed86fc069ce6e3c07963cd7f0220352233a5b5f81d8507bac24b40c840d3b81843d4c61ea6b0c365037160a803ff012103b63090486f14001f1e38cd977c845e8b5be8ecd247c34e890ad9a47cf57b1625000000000100000000010107be22aec5af005fdf7c422365004075d5049d9e5f120e95a6c9a378161561ff2900000000ffffffff027c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6540300000000000016001453bfa39cda804ef30bc5d1773dbe158ffd95210602483045022100a0ecfc903aae41ac6a2cda654536499e05074c3f4d06545d7d3aa6e44e59f0cb02204c680c3b69b36027afc7451702eedd8471d6300110debb1261ae77a0d2d4223d0121022bd433a441e737a899b922aea51d746099990b70a706165af122126cf121a8c900000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b312800000000ffffffff027f0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65103000000000000160014991ac24964c1de310d399ec2f27440bc69956c8a0247304402202f341f6d5396d225ad70955b619eaa261a5ea91fe7ae2345319f6ac5b3a7ebab02205ec53712b5f541e4f8940070612215ac8608f665a3dea03f5f0b13b05c0923ac0121026193e6a248a5ef47202248d49206a3431ad09258c6b16299e9021eba54b605350000000001000000000101f1448778c52c84ab7e0230e4a5174b153ecc91063c7b49455df133796d8e87f70100000000ffffffff026d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6570d010000000000160014024138b1f8de39346ce4c2236473a2b80556969c0247304402200e8d90930eccf8e1ceadb867ba972a3e5331bfc89e799ee860f62a1f3400e7f402202aba85e15614fb065155eb7af646eb718b6f373a00b03268f15fd7c149fbdb53012103d71db93d51ea087d40796ecbce84e45fed6bb7a500eaee0b4dcb0bd32123fd2600000000010000000001012adf284dab836b0f07bac2a13606863093f0e9e1b8485e575ca4464e92e8b3dd0000000000ffffffff02730400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6e92f0100000000001600144e73a7b3d2d83ed84d3f56b71c5c767be3e012d202483045022100a6e494009c4b7815d0995aa1b366be16bf7bdbef56d5ee2eca584e7f5c82dbe702206bca033158712acf5ea9cdee5459787abfe808baf0931197daf88e7f3fb695f40121037ae742872bdb26af75fe085c906e70164242a3b18893e3cc879b3a92d4628048000000000100000000010107be22aec5af005fdf7c422365004075d5049d9e5f120e95a6c9a378161561ff5f00000000ffffffff028b0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6450300000000000016001488f3775d0bd135f5a71302617da050eb236991f4024730440220716c2da52ebfa61d174126f088715a0e8f752730cfd4d42593a89cdfaa080d06022020bc63581d200d89a72846b70823b076d3eed175d48f52e3300fffa6447978f00121031249a22e07ee601809274cdcf4fcd1112e2f9b9334a0c2455456595f14ada8840000000001000000000101d932a5d56d60a19d5f1be3d3dd4042b12c39e416d0b71ff49e3e6c59faaa41a90100000000ffffffff026a0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b690d30000000000001600146baf990912cfd85bb9ec0718ec23f4cee2f24ac902483045022100e0847bf679814c3d8f46b10f24eedb9921f7b52262c5853130dcc65fff41974702207439ba35163296dd25af123cb3d8bad2351adee6c57869cf2ab8cbaf85bf00fa012103df3431d7d38819a6332401914029d896407785bb9978a95f30ec2f383af1ab3800000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b315700000000ffffffff029e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b632030000000000001600140f81abf73de3172e1d39927e7ed172be972fc3dd02483045022100ca1a26d7eb7b66e12e5c804adbaee085b07705d4ff66955c853fb9c6766ced1e022078d2e479df50ad1f7b4fdca7e0d1cd51682c42710018dee32bbbb521bb2e4622012102b29020a2aa862f3883e44152ccd7b29ca8aa62fa4ed057a19972c4fff95fd52600000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b312200000000ffffffff02880400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64803000000000000160014d3b5ebc3ad343cda1207c927165e33e0aa7626f502483045022100d32d1d9b6460114820d810a02dcb086bcd8465e18a96681862b0dc2a0d61d14e0220109ff1f79a6bebdd3ac7e2af9d3fae8b3369db3e771fb29def62cef3dc6ea8ec0121024412368672ca59cb7f818910a55a52cf1c8fd32275bbf57e3d7ee0b849b4e8f4000000000100000000010185b1b8e2d26e6048e015b77ce1285ca739e0156cc05db22d0f70a79563f89fa30100000000ffffffff02880400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6703e0100000000001600148d103495df557b31d197085c2de3044ab5ef63f20247304402203a3549bdf812135c1e8e1ee6a7a6ac4428c18d9deb8ece54e1604b2460c90d1902204d8598d2a6fe01ede3c69a57b6dd72de1b6783d1b405a4ea0b44a141e906a0b40121035c557de89cb3f6c39ffeffa668febadf331693ae109af3add6e9ac9426cbb885000000000100000000010166d7ad535c412c5a1e5703fecedae3ea91ebf9979d4f83375f419d8512b1bbb10100000000ffffffff024e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b61834010000000000160014281ff45592a61f61aca6db1085bac0e51b67f04c0247304402204bfe2c00f641083c70e746811f3e912263f8909301bf36b2e2d695eac6722e9e02204bf23ac5c6b8df0b31725d64a1228607f0aea65bb3caf3e45129d5d212466c89012102f35005a58a482e4f8f07221200b17c604875ce49e2816bf5fae16f2457021ba90000000001000000000101a96403f3882f204990b359acbaa4b885688c3b00331a166c0020c108e108ebf81d00000000ffffffff02870400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64903000000000000160014245bcb3bba4167f9770d4736b8f4a62fdf0671240248304502210093183e7b9f0cd00b0e7309ae6abcf2ce163a68d1802f0dbb6c5e072c75cadaa502202d5fb765d623d486e2de780b99c9153061ebcb92d9cfd477de4e80c79df4b9df0121033ba03067ffbf110ae133119ce585b987a5d084b00653fce908f6f06467456ddc00000000010000000001013f5471183bb41576689e07f5f950687683be5253cb9fcda4df80e4f7af2af97f0700000000ffffffff026e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b662030000000000001600142531dfc4bdc2fa6a2747f02ccd29c51c0a821566024730440220762bcb929657f22dfbfbb0b62b5fb0ad028d211def84443290151cf3863bdeaf022060e2ea122f5b5b917c8de98249d444a3c97ef467e321a97cd090cf4c7b032332012103a0e8e5a69444582f9c9675edce96c9c256c0f3eb88f6837a51377f2ebb43e5180000000001000000000101a96403f3882f204990b359acbaa4b885688c3b00331a166c0020c108e108ebf80f00000000ffffffff02910400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63f030000000000001600149a20f39f11e2600541dce9077415d87f1cc3dfc90247304402203e64131dc0078c522fddd5174b74bc005380200440e75149e9ffaec5e05dd38602203321148ac78268b4becccf3dc707016862ac6f09ddc52da22cd35782aaa790c00121030c7bb6661aea0d48f3b9258f99654843437ed899295b83ee6de726f4f73c0fe800000000010000000001018d09762f126ecfe3f8877f3f4787880b928fb1d0f6cb61f6f3c3bae436599b7d0100000000ffffffff02520400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67e040100000000001600141541cce9cb5ef0ccf83330f9b615a2e5aae7a28a0247304402200f3fb5708887cbeb495fba63e88e743b9a14e74a43e73192e653f73bae40b1460220653783e71b3e2bcf0b8e330d0998a6218a2ceb57abd3b8afddbfd7f31d7eb920012103ebc39bc71ce749c9507e44f3604709ca013f8d9b0e07bce10d5f21ddd128aad80000000001000000000101850630aaa57aa76d89f11aec9fd4456477b7aeaf6fddaa942b6f550cad3e8c072200000000ffffffff02a60400000000000016001460426faa653c536502e0a0d35658d0ba259a63b62a03000000000000160014b3cc916380e979574aa39888a4c58391de999dc902483045022100e94d07f2a7336158127ce0ed053a2fc4300a0a2625e22f8f1ab3eeb79983fa2e022067541f0d660c3feaa9ee2dfdd897aafcdeeb6509c0921c2c515194199341672301210385408a837f3d70679a1aeaa142f913e46ba29262eaf738b97bb938419269896a0000000001000000000101c24042e074debe85006c7bddecb92e8e5a3ac225a260e23a48865b12d25f6a730100000000ffffffff02670400000000000016001460426faa653c536502e0a0d35658d0ba259a63b620d8000000000000160014067c079fa69a1e6d255449e2ea09874a937179a50247304402201047d14ea2cac91f1c8ba441b8339df6cbc6262d96398be62c177afd861d6fc6022022ff90508890afa4139669b01cb9714651d14c3a80382050b4148f3ab449575c0121020b838f7fd9d751332282b9ae16d7ee36b41986e6e4ea20f6dc8c9f94b855a35e0000000001000000000101fd2b2e0ce48785252ffa14ef79f4451723bd641db23ecbbba2edf9591eba53b10100000000ffffffff026f0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6dcde0000000000001600140c240a539abad033aee16d8595ad383b7c7cd36e024730440220773d7c778f74b70b28629953bfc4bf5dce93bc152ac5ba615d60db6b22885201022061b02e0391e4c6016aa8e70633d796895ab31ca6f0b126e7b698a47d02ca70040121022d9e1f42caf86100dcf1d7fd7d5339a63a81c06528c3bd12f93e7b9bce0c56e600000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b315f00000000ffffffff029e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6320300000000000016001449b037668b00127c1878aa38276b2bb4ec03ccf50247304402203a2567807b777c410eef25ced8b8a85caa85a97fcec1db54c5b426995344bc1902203b831d29c7d3c212aed174c6a1b9fc7b000fcfec421f70dcef156ef911bf5f6301210283b2db4e07ac4e933ffb48d4cc1ef6aaff6692ff7b06fca96930076f52309c370000000001000000000101deabe8cfb03500adbd69a272e5671fd5d9829c67784aff9412ae6adadd96777e0100000000ffffffff02750400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6d25e01000000000016001423f019f1f15c44e8eae3129796918e110a1daf9302483045022100bf6e579247183073b45075647b11ca0c8d6339e038a7725a624cc59c3aef542e022009b302bec468a27e42c330518867180e8a89cf6fdc5a33f76f9f0d662e7c19c30121030380837d8a644567831ccd9ce52074a789714d48696411c0d016b2a3134f8e4e000000000100000000010125a9ed75f8c3c91b4c4524c5cf1565b91263e35b43850ad8d323a1379cac903c0100000000ffffffff02990400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6d3df0000000000001600145dcbb04c940c3fccb475dceb963f01c7e5df518302483045022100d5a0a41026b32fb16ad52ffdc36f660a1d3542f376674b1293f727e67b0d1189022028eee86be5947fcee2bbd5acf288a5d27032524313f073bc907abf88c1ac12f3012103b714b181c37b24d286254b94ca5de2aef16ac5df5984330c25f31b2e0f96552100000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b310f00000000ffffffff025d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67303000000000000160014d3c9100afaca06d32978587a001f2fbf6d26023f02483045022100ff822a5f58f8ca00bf556448c8034822df2844bde8eb9aa064cd54eb4ccb3db002201ef82c326b7d2fbe4b8f970c6e1feb0d5a6a7636938fb1be5aa0100c833f93520121021744e62658bb11f3f9e22a07074c038e2781dfc9e348926603f730825a816bcd0000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c17500000000ffffffff027b0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b655030000000000001600146a4dfb827badc4aed5b4fc42fe8869977e940852024730440220045716076272922ade9479f2b69ecacedeff806775fa6ebd5298677b155f92d10220739e53926c5f0fe8496176df8bc7a0a4147d56ff466baacf670a934e9c8a38c6012102fcddb39ea8cb8be16a036d7cbf9229dbfaa20d273fc4c3a643181d48765b40140000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c11a00000000ffffffff02840400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64c03000000000000160014bfad00dcb022a5483c944c4b8e3089634961dae4024830450221008f78562e45e804e5ea8f1b9f5fd58fa4e906003aaba13bf7e5448022042c94450220173c48b8b46a30cce0276d5bb306b0824ee6f566bfa7cc8c6d807cb005e1a5680121035bd371d0fcee7c7d9ddd13476d2e6d7475e7ec143d63db7b5751f79b06e98c380000000001000000000101dbe3f776deb3c4b075889676acffc643c9d2b4a5dfc1737b7dac4146cb5c8f744400000000ffffffff025d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67303000000000000160014382db670e2502d8b4b1581695fb253b194652fdf024830450221008f2751fc1f81e1c7229d39147229a55cd9097c1053fc1be27054c8259a54604d02202f9e88a74785c5459d57e62c62cc8e0535b59c14b3d4964448888fa1f8754e8b012102ebc6a042983f8dfdf29f026e18f73a04ddbde94ae2d6f9e538da2c96332a6bf5000000000100000000010115b70553fa67165df8c1dded103eaae0bb629dbae51bb43f8bac19dd2a4918100000000000ffffffff02600400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6634b010000000000160014f9f662bf03a956f9b6ed3379a6f15de5993aefd2024730440220749656ad684f3384acb5ec7f29ae0fd9833d0c2964dc7ad21456e41d627461ad0220198cd5298e6d8b5506f7930ecbdc0d5fd721c77ed64988e9fbbf02ed41d96a35012102af8168836befbcd42020cbaf6b0394cd7b9b5213f9266ac4e4385e0437a3ac5c0000000001000000000101a3972659dcf6b63caf8c84a4d400f9dd5ea14d91c8abea9f599d02ca5f355a690100000000ffffffff02760400000000000016001460426faa653c536502e0a0d35658d0ba259a63b665e9000000000000160014dc5f2d455d31573cc341fc74e9ecb06d5f22706002473044022031c210ab3d46724546d1fdfaca8e0a609b72c7d95578f9d40303222295b93b1602200190919071fd7ad1258a3323751831f8d1abf3a1fb3557de04235d65a9d62dd101210270b536b988b4b3eadc4a4ba70bcdba336ad7d90e2ad7de8314fe0a845812fb7b00000000010000000001013f5471183bb41576689e07f5f950687683be5253cb9fcda4df80e4f7af2af97f2a00000000ffffffff02500400000000000016001460426faa653c536502e0a0d35658d0ba259a63b68003000000000000160014fa560d919e9972b359b563054eeb62f56714dbc302473044022065343013b3a8d9094f176bb188797c4cee64d799ed59b5de5cfb7ae4017e5bde0220721e4a37acc8923be6c8eea73e674472742fdec46774de14a0209d8258a9a154012103a9b9c2b44352ed0e8371018fae62146e26f145f396cd7d87add79b07a3b6964e0000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c15b00000000ffffffff02650400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66b0300000000000016001436287607a016fe74aa237ec5e481f7888f5ff4a302473044022048ffdf10a8f712609cc7024904c170eb6e225552349a787c9d80259f5a847f090220754bd6a4d81671da667285c1b6c4df5150f63cd24928880e37fd2a78b73bf80e012103eaac4fbc2dffa2b2efe6c20c6b3ad0d13c278cb31e7725083dbf353ae726df95000000000100000000010126373d1e18fb8d13eae66bd3d0729e23968c3ba408f74863eb6ee79f0d28f3730100000000ffffffff02690400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64cfd000000000000160014f245a060cd05767b67762a86568dab139d2d72dc0247304402207459f1ecdbb5f4e2b64b6ae4a3d961861f2941cb01b0a3266d53eae5caba085302205f97d54711f6b5e5d39763540063a0b765179d547083123c09508eae6ae593730121020a373a1a23a787bea1e86f97a2246dcd5dc4baf5ec4aaf7afbb310682a76733200000000010000000001018668d7939e6f02741a2377cc89233a6f0e0fd02e8f993f8ca485cddee77446c50100000000ffffffff028f0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66b6b01000000000016001472c26f53cda3400546b78041f96812af0d016f000247304402206a99f8b6fc94597f9a5780e6e51b9c33db389d63a65a6a5e54fa6ba50b0f237302201e9107ef8ec575fa2d920f5ddaf67dd9fc9c98847d8ebf98af531d7899f33a71012102d2d5af17d77ca63df21bdf5aa43d8efea4947790200b2593fc2f58d051f218340000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c16f00000000ffffffff028e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b642030000000000001600146f656ef63eb32f3649ab1074713bb6430849714402483045022100e15cd4a9f92c92ecafc507291edf4c0695dfc2b7484d876f5935265337408a6c022057d7ba641c70f485f39dbc93d8d814611a122a9ab1ff85e6bf15b312f3963ce7012103e7a5052b42e8179c1174aa3979edd12ab28b6d92fcebb9fc0b5ab3453dd98639000000000100000000010107be22aec5af005fdf7c422365004075d5049d9e5f120e95a6c9a378161561ff5000000000ffffffff028b0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64503000000000000160014ea0f463a8a5fd2fd7724be0b59b876022696271f0248304502210084c0a8fdaa1126a9c97476a7b3adfd86ec8f83874eb342da54fb58706ef9fdea02207e6c4a6a18fc4ad9c1ec95c993199e1b04c3675c5e09c928e01567ed87fc285c012103a131213ca9311eed2970acb9293122b61b3c98a500351c3ed1f1cc46fb6142b0000000000100000000010126855c4b11ab5f187099fbce61cd6464db4f12600036ecd0e9e23f6283e96b4c0100000000ffffffff02940400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6fcf50000000000001600145b89d407313676cb2e6689adf284548259fff46802483045022100c3983f5b8da29d0990cd5ba32a36f404b29ceb83bfb21fc241c0f154ffa24aac02202b733647fb85b45bfc9aa510f3264ec82b58f50eecf298be1355257a15024c13012102e634438a0383c32998fc6054e635f6d3e085dbefa120900669634bbadc24a7410000000001000000000101d7487a27f887bdd445f07fcb47268ed8f38f7272333003a7c11bb4c815590d530000000000ffffffff028e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63a050100000000001600144a36676328a693865c45cde9bc4440f111595d350247304402203302fe5ca4bd73f3781d0b6d32aceac903b58808fc00bd59fff221044887b4b00220716762d82e3272825c8c207bb8df2e47108e9cdd61be81deeb441620e97eeaf3012102e7b2bca3d08a634dcfc4451eaa4fe4175660ed3eb548a1b637c8290f493ee1c500000000010000000001013f5471183bb41576689e07f5f950687683be5253cb9fcda4df80e4f7af2af97f4f00000000ffffffff02780400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65803000000000000160014c1433f9e63c53ce3132c27c2ba645aa7df3c4d8e02483045022100b80c68e34c57e45c84ee276f8f3eb517923d1dc74cab4a2b50d1ee63c1bfea4702205112825be95004d365ea7193317c486c4d531692d057f32119ec4b645d35dac7012103a3ca94ae780a032f92962c417d80a40d02165a6b84880f94997b7891b367ba7d000000000100000000010131018795292f9f3773d220fdda72bb19b4a82c8f1016cac8b966902e034746920100000000ffffffff02650400000000000016001460426faa653c536502e0a0d35658d0ba259a63b60fc30000000000001600149a51a2178d2c8bf9eafacee4891c5a6923ed1ff00248304502210096bee52844351154b142e5e07557637be64ea33dce56cf77791c245ea2ccff4702205ec51b379e9f7f186c5344568e69c05c8288646ed19ce82cabc3253569ddcea201210358aba53030a7dbc0e4472918a5563f2f046cbbef013b9a52cef11f7f56b38f290000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c12a00000000ffffffff029c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63403000000000000160014b6f7440c4b9d14d483ae27315915df5d4709fb9402483045022100c153aaf3753876d43ef2efa24ce4de5e35d54befb1e48465f6bf5ce11ad0cb8b022047d96a717d4d118275b7cb7214e5f9dee0e6024562752142f40872130c0f6920012102c8b4c63403c8c5905867d18b2dc6edd7aea8923167e0415b944d2828e6acded70000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c15300000000ffffffff025b0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67503000000000000160014d03626aa43d25f0bd2963e64d331118eda63b86002483045022100a3dd4a163b50429f47b4ff352dff8d0aa2d195189cdf6d83846abe5e46bef61c0220469b4dfaff288f5037601c4e8e9e5a2aa24f6446bbb6f78438f6a7be28064149012102b1dba4970a66c2f1c408f029afad851515a8b69899a47ed140174d3a844ea0550000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c17200000000ffffffff02910400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63f0300000000000016001439bbbf0df8045177240984f7f4b15c717ea7652002473044022066a32b5be7de30bc0917638e8224b4a2cf6f5ba64be0f8397a509448bc5edf5a022068249842a0d27288e1f24358714b08a1f06f940680bdb2fe0ce23f61ae46cbc501210287a596b2ab6a3a02cc70612dfe2fdc3257cc44eee7a743ecb27b643b4b1201bc0000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c16200000000ffffffff02720400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65e030000000000001600144007fc8b6776c14c361398d2235e1e4280a9c08002483045022100cad0b82bfa12c8a5ad7a93a88f32b940a67cc27a9040a9e6fc8b44afa02593a702205a92305e6a1c08e9b1cbf7da65188ac3a08b7ac51c6d172ded11e5f0478fedc701210393135f4aab2ae5ba040be82dab1d58eb62905fb086fe652bc787719c76e87c5800000000010000000001014ed7b3dee14f7c33cae72d4b6fcaa9c595a0943e346bebb06c6ff2d2ca5b7b319c00000000ffffffff02760400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65a030000000000001600149e4c64eff72706916fce5b23967a0cce4887206302483045022100bc8e78235722910ee94f9122afca055359b3792063ff8663287043b1a041395302202e3573d01717de9609420e3cefb8106a931382a5f04fb76fd4e8f6f726a1f41901210386e76ed6530f12794aad5402630a67332cb94dabac00a2d77cfeb6924627778000000000010000000001017f6f30e3e14af9f36826705a62a266c3f4368d98db1d3eab03cf485bf89ab2370100000000ffffffff027c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63f35010000000000160014c7a6f2a650085ec4326a76d14da9772c059fd22b0247304402207e26fd941221ca668441e597255d915fe1bc731f216e6aa9927f8cd6a6222ab4022035e29942fb609d7f24ec344497ffd70aa5403107dd9454d3b642abd783dbf493012103ec78fb597cb677b37fff61d5aca2dc43642bb1c76e12382c728d857fee9fe9e10000000001000000000101dbe3f776deb3c4b075889676acffc643c9d2b4a5dfc1737b7dac4146cb5c8f745600000000ffffffff025d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b673030000000000001600144afc1d1afb8592514b3fddc68dfbff5f70746bdb02483045022100c83646c61daee98f113f5cd1de2cf7f56b9ff7a12250da83166c90eb14dca0ad02205b85d2719781c66daa12129efd91180599f1b42a489b99c521ba8aa24e41050b012102343fb81fd84a1888f682ebcab7684b90558a5a5efe3a3a7d399c9ee190536fb10000000001000000000101310cc02806793b3eb784de9696802021c7783588af573f61afe8c4200b26138d0100000000ffffffff02680400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6e3d200000000000016001428f964afdc379a5081f4e9352ca8f50686151bcc024730440220359a5cc806f18619dcb1352e9590ff00da1cd9b0be25f91735b22b95dd35fc9102201af0ca5fbb8046a4b1c6e88c3c218afeaa5b6113578ada34adf456dfa779d8cb0121032f799113c6789ed49f3cdc13cc9980a22e313836ddef52deeb7e0f65e0e55cf00000000001000000000101669be3a06770c5f5c6f0b18cbcc6b0409e028098b39514999b7d1a4364a597c14500000000ffffffff02600400000000000016001460426faa653c536502e0a0d35658d0ba259a63b670030000000000001600146cd84c844708e0c527fd2030c3a67167e8acb6dc0247304402202e2f9a2237d0bc6f5a3353a13c852f724beb88a75105ab6910f8c1f5849a44da022058389358384beeb0c928482da3310ecf7a1ba4dde829b4fe2c46346c90e923a201210364e7befadafe5b14336499e69b113a9c6fc35f4af8022e41b7ca3f46402bf35100000000010000000001019c688a597fb3541c3a8617e810d03ae4e913d9be85853e12483e4c953eafdba10100000000ffffffff02930400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6d4f500000000000016001480f930d20c98d775ada36f7bd242613f8471118402483045022100e726ccac68f0df72a74b87e160f836ffe46ac97bd46df092bf2077945d9dc1ab02200917f70b4b1e033cfe45abe92b7b4641b870770914408ef55cabe623c01735650121020f41b4bb03aacb19a4bb83865dc7d508a19e283e7f7408214189f6021fea40e30000000002000000000101d62139e50bcedd7b0b53755065c4b2f8e843907975a3c1b5a2f395901866aa210200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48953900000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab402473044022033b1fcc2d6f241860444a7bacb991fb31fabffe684085c1d37f25a7ebf3b99c60220299f6783bf3317f2607daf8121161507b2abc6abce5881e2434e87d69ed6e92e0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000101f47e226efae4dcf1b9b6f743c5767df6baaec28e86576b05c3181296a31407320200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48572e00000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40247304402205e43056190b55d01666533ab1376cf7c1f752fed45f7f97a913e12a1cc578fd30220292a85d6a80158cedff880a03596ab72a5b60f317b5cf5aae28ca0a197b5c9010121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc300000000020000000001013ae18dfe9c86d587448f88bc099b8464e95dc541e66cc3e541a164aa5975b3ef0200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48c73a00000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab402483045022100b740e9dffc4f59589e7cb95f1eee6033e4824e58396047618081f07e098f00a80220550dec384b8af701b72d679dc20a0d83d3a06ded3c93e1416501f5fe17390a2e0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000101843fb7728e7f3b88c448fce12feba1cefb95d5a699699d92503d074df4c6f0480200000000ffffffff021027000000000000225120169b887aacfd4298b2e8a34c2d06611bb492829128cd50cae87a3b9bc883dd08e3f44600000000002251209325290238c58c0fc829469b9dd91c5b2e17dac2cc2c5a157bde598c623b3c3c0141e5bfce9a5847a9893ccaf45cd5ae7a087326c2445bcd4629acb0a65954d86d0c070c6e8682bd7484aab8fdedc0a43616b8286c7ae0da18c61a6414e6a78f89c8010000000001000000000102757763c7821b42ac50fd7f157f2b412ed56bf46ba76aa7e8536942a319b357d50100000000ffffffff49712ddca69061586b0642d6fa0092f6777bcb691207946e48daf05923ad95b00100000000ffffffff021027000000000000160014d8e7073b7e1c959b209ea3dc6c21c0a80b4ac35ab71a000000000000160014965be90e5f42b0061668bbb599b50098f7b991d802483045022100a5f6cc2d669d53eed3668e82093ae50bc27c1c98bd7880f98a85527fcdc30910022013060f9b2d69b5e8ace8dadb5dfc6d95a7e7ac377f99fdbb81de4cb94d88ac3801210240438212d33ddf143e9d8f2829b8358a29ce9c98b027f2cdcf70f4964b3e0a2302483045022100ec8ceae45302071f9eb3e6dbff8c7be4fbcc70abae6aa634a4f31cff9c2b666202200734215ce2bddf410a6ff841037090dc06e26ca532476b6651d9a8e75049a7bc012102ebda84d7e73f04d106097d8a6b25f86a3214c714b03183b2002b7df40c53ee2400000000010000000001016fc2fb3fe59be4dd0bc834250cd06e81f513b6bfcafa24c9e6d0c3834152aff00100000000ffffffff0240420f000000000017a91472eb16beba5209ff6533bc7f90e797c3d9ba11378734660d000000000016001425d6e4b60197566a1a9222a827622bb01f80783502473044022014a95390578fba0afc4d1625b977b005d7828f08db924f5fc2523b28850a2a830220150a58898310b5cb9b9eabeb270454ba551943cb1bce3eb922306ff0ff267d390121026a361326fbd19356e552c6c9caff12f03d541f259107bdf91dbf9e6ac79c395a0000000001000000000101fbde58c9f619fbeebe14dcd5a3504da7bfcc51db9ac3f0d6d5ffcd1e253990380000000000ffffffff025c35000000000000160014fc7bb8971bcaaaf2614f4aa9bfeabf7db9f0f760ad1b0000000000001600141582c49f93f07ccf3d6e68ee9a374302bd3aa3080248304502210091c5492185abf984681075b2452aae9de32eed1eb8b2ad057fdde2e55d2291bd02203867f84ff99616fa5fb19e489303ef2b49a37668b5cb842b974d2befcb91098f0121021faca26876e20d67ecb5868bc99c831de74c4df66442846716bf550c544e37640000000001000000000101649bbe8317f516567898467138e72ba41add157f9f7ccd8d50519084c51dd7a90000000000ffffffff02d19a000000000000160014c07abcd9b5f044d7f9ea8cf173eec675abc885458b480700000000001600140d760e8fcd4540a48bd449fc91a8033aca572df10247304402205dd490111976e834247b7d5f3c7699dcb97b2d378222224a9266cab4e162b60302202beeffa5f66549de8eb6ecd3c255f50be1278a5ede48e385d704b57a21f001dc012102214da743a9501d586e1ec7c8f4ecd96dac57f4065224c392ca24ab8190e561b30000000001000000000101336942ad42a20912399ba5b8cf86004f90222a687af11209d83d29ce115163090100000000ffffffff028b480700000000001976a9145f97cfc007fb586f66b7f8f75008a6b610d356a388ac2d9b000000000000160014bfe8e7e3d151d7263ef239d55b5d937c74037ce202473044022029bcbdeecfc3fb60164dbc55ffaed9ff524d845cf4370543b356610d9d727e6b02205e40c85c29f0683ba0638a265663f4df196e5e5b5af433495248a7a5d698ab8b0121039bd53f6e718ab326fa3733910d6a1815e3a4d4bbfbe998b70c0461986743a5ae000000000200000000010135e6b4926b18f3ba4820cd2bf5b19ab0cedb237813a5bb31dfe75931206fef980100000000fdffffff03e8030000000000001600146e3b96b5669bd5e27873ce95c1f02b64a979de6f58020000000000002251204a46a5e21c4b6ef670b4f04c64046b3bb03bcb03a67333c0986d2bf55db4b651524b0000000000001600145d29ccce5415f26163f24934263625ce5d146f51024730440220091b5ee1d8945f37388ad8cd7fc7cd82ef4d726dac4a4b9233120519748bd9920220124bc682879c994e5d30dfbd420e9f2e6ab827a93105257b71bd33bc9b8f33e601210336f8a4c984fe4c668a411c5e0ccee1c7ec561c2dd353b20f752b7e42e031ebd30000000002000000000102a521f17f9fab5d6e79d080982baba03210376e35a92a2ecdeaa3b01c35c33b0a0000000000ffffffffde6220c07a8662f7a7a0dd7c114f3e5c8c35d5d0d4a7b86193a01072b59c7ce90100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa07050000000000002251209ae2617e18470fb922a252ab8b607e834a1e8387446e12e5b8939d3173e5e6ca0703000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa282c010000000000225120eefc4bd03489dfb8843b31f7eaba72d569962cdb604fe3e223c9e3ce79fccb8c07050000000000002251209ae2617e18470fb922a252ab8b607e834a1e8387446e12e5b8939d3173e5e6ca01402e8030a6328702ae23a27eab8cd08b4a8d7d1b5b2d6bcd82af8f2ba086c7376dce8ebceabd83c0ba62326f34702ce1c40c8a1b47b86c8731213c7b3da839b0f301403ea8e2651cbe576f282a67a4a9ef9859ab159e189658ccf70fadea9cea4c55875fe66f1052f1c0b448d7b37a019a446cf71c9d60471f967fff5aa2e71e0e02730000000002000000000102f3aac11e143c0ea7128ee9059640f8c46357718c34913e0313076f266181941c0000000000ffffffffe40626390393fc760d57bc6af3d2d17f8b9f60414fb5ed33f7320a88aa47f9cd0100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aac937010000000000225120a86733a81f9db1cd8da8bf4a3bcd74140839cbc23fd22d5d1bbcb2c2e53d54560705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad01403479e17117acd8b63386888b889596552ac068a8cc7965763a58661690ed927ca4044e490ee16ca1d4cbfc2607c55a5237776068ac776dded7abaa180d816b5801405b829861584bd4650a8f935b22c57e5a60c97a17b50c10af83885d0c790e73d266bc68cb4e5a5a903d49ed1323078e85d8df492c754d195046b6636eeaf1017b0000000002000000000102b59f8005e88e4789601fcfce70ca59dc17f7cb92ac1bdd520a00695f5ddba1e00000000000ffffffffcdab8f4c63b585048ed616716b276902ee85d24bb2c87a59d23669e3752b00f90100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aab537010000000000225120f2ed8e3e8c53d370d580e91d42513249261654575635db47490053207de9ab310705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad0140f95ef4aead6b0ef2133b15223d5409f6ad4e89aa61883d74682463dcfd8d0e10d0114e79b69317e707a8b4e30210ce6e53f80436e64b36f68b4201c9ca74306e01409ddd7c1c7f05102413092a30b1e919be28a4da534a9e8d5c8e93570c242423a329dbb2ca3e7fd774301fcdef591c82afc7acc74d360f0fecff12197ca18af7f50000000002000000000101899f4661508a7e445de21f9192979d60800ca129d7b9647965f7384a397de3250100000000fdffffff024d9e000000000000225120201011fe9dbb3393171478db90633abcfa45cdb849ad5d964f3b1efca845f8ddab8e0400000000002251203eec4debc7fad0d237b4fd9af6016020614dfd77b0739d02b1bdc1bcb24610880140f07e9fd6686555630bf19ec3e6867affeb56f300b2f56d88f11c6b18008def780231d52d2aa85b16854af7937d4d91802d750a6b527472804d2bc315154044840000000002000000000101f0edbc2b4cd38f35d868013aa8df1c13fd9c6ebea086f205b05a16845f00a1c401000000000000000002204e00000000000016001490428002f16fc9e1719f1fa00c5ea2251d2f926f6968020000000000160014262c30dffc279b4d1be22630d5cdb047de380e0e02473044022069460a41c5f064cee75b02c1068900392a8fe1bc1e2757bcbf082be46001da9902207395024775cdf21ff4cdbb36c66e32980e404da99e918b1eb80ec5038bbc56390121027186faf93ed3b9ae3c4ddf2f44e7f6c58d3cf78f85e629a4ba3c433bc6f35e4a00000000020000000001019df277c504fb3b2b4bf5fea396e7cf16c126799ff59cac2c58b94cb87f8429a201000000000000000002204e0000000000001600148989a3730c94d9298fb1204669bd3c406078f6d38a17020000000000160014262c30dffc279b4d1be22630d5cdb047de380e0e02483045022100c8a7b68eac162f3e11abf6f000791f20e2f5bcaa8a231f85082827b53a23a23a02200a489673796347d1c9e930a690af16dcff89a50650a69b317a4a532ff059f77d0121027186faf93ed3b9ae3c4ddf2f44e7f6c58d3cf78f85e629a4ba3c433bc6f35e4a000000000200000000010186ad69a137555c3c24704ff2d3bab4c08e2656c888a79bfcb56708801720be2001000000000000000002204e0000000000001600144c5f94677ca865345bec13f4022efec39ba10aafabc6010000000000160014262c30dffc279b4d1be22630d5cdb047de380e0e0247304402203404989441ce391e5b19e8f7fc8755e077eb6bb4e46a680d6211bf71a0c8d18b02202fe7261fb673f93dd51105212ec972fc3142996776cda3544a6ed7b13c7a3f900121027186faf93ed3b9ae3c4ddf2f44e7f6c58d3cf78f85e629a4ba3c433bc6f35e4a0000000002000000000101866fb24cadb1993c54225292fb947daf9b7c515277f1e2148f7f4a1c0510d27d0100000000fdffffff012202000000000000225120a86733a81f9db1cd8da8bf4a3bcd74140839cbc23fd22d5d1bbcb2c2e53d54560340e2a49898c7ab88d406b7cc909320ca129ae5dd720b498d4698e65786f994e4e6a9146960f392f0d44c0eb49d5763cb4d641d25e837b6e1d49e84eb87c1dbcffd83208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101f231b1bed70180b09234f358933cc15d20f103179f4f53894dcad7d30c2a796d0100000000fdffffff012202000000000000225120f2ed8e3e8c53d370d580e91d42513249261654575635db47490053207de9ab3103405d19139f7f4d19d8fd4bfc3062641211d574d9815507119ad83a420a50dc55c4535fb18f589967ddc8ae815b75028943984adc0627cc0c8b069521fdeb15cebc83208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010185888dfdd3ff73d2e7576ac68e98af6fb3be979e181e6ae183ef1e9c3a38ce790100000000fdffffff012202000000000000225120eefc4bd03489dfb8843b31f7eaba72d569962cdb604fe3e223c9e3ce79fccb8c03404e2cfa3eae19beb48a4b4c497dc9eb557e331209aa14d4cdaca3b16d78d5a545beff965e91aa24abe5e9fe2016da4a28ad61bdd750bfd5ecc3f727c7db088bab85208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003f7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e30303030303737352c22747631223a3535333237307d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000001000000000102218569632bb9ab8120f8dae5cf19d0086b763fa52dd6e66d548c1c4dc8983c212000000000ffffffffd920f7fe78eae2cfe8561c54ee639b26eabc9e8216823e09b50865ec8959be8a0100000000ffffffff028d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b69d06000000000000160014052e2ee38fb0242806830ba70c2b89dc3f59b4c002473044022067b157839c926e205d51715b3d23e61af226ee75d81f2a3337363b759c9b3b0f022050771ab8741a6e6fe43f42e414b9b87cce6267f28af57ebda1c989ebed7a9ff801210309e74a6427fc5bc92cc32fe211ac402560aa4e86423a9eaee235a55c7caf20cc02473044022029c61b49538d88c19d1b5473784a8cdcc600ef0cfae98f29bfc7a642a425143302204d9ea26f5444487a3360bc82b5f9bafa4f9a84c887898e573a9f3f3864aa716501210309e74a6427fc5bc92cc32fe211ac402560aa4e86423a9eaee235a55c7caf20cc0000000001000000000102a23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290aa100000000ffffffff7869065442c541471e59b66b192b3d56b1b64f9b03f5ffdffc9f61daa2c669170100000000ffffffff02530400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6e10600000000000016001431953eaa7ff2e21d4bbdb98adb431fd44d70475602483045022100b3a3c4fbda472874b471f108a8972a60966ba59609849f76045149037291f3d802207307f1077dd08296fc8eebdea8ab1883842c9349e9efdde5d8391d0d5df72c9f01210361bf5265ad48b9904ca9cbd95977ddbd172591bb9a95554463cb846d34e1c9e502483045022100f92877edd670f9d22aaf8124a25edf367d6562b2d5e95dfc4b1c8009fbad7f44022020aa456da6d8773ca151ab0ca0be1c74bfb95036651352545ec8ac59f382bae701210361bf5265ad48b9904ca9cbd95977ddbd172591bb9a95554463cb846d34e1c9e50000000001000000000102a23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a4a01000000ffffffff67279af351ff49c5ed7da98f799b55ede58e6aa91c512a7b88353f75078f16bb0600000000ffffffff02820400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64e0300000000000016001492abdcc3b8f1f9e7aefc575bbbc01734421ce73c024730440220152b8a078431ad021bef8ba7357d193e341d288ebaab0d50125d8de117f28d6b02201beca8a17ae290effb4b16d127d0451304057efef2808ef554c3e520c0a60887012103a7eb3178dd3c0d09608ed28f8fc06141b20514fec84120e4ca354fe06c50422602483045022100bcc325c3db7dffdaf78ffb1f69443a1434950c0040af1ed29821aaa3f6d2eedd02204c81f5bff36a83795345f066e04bdf0e798229b7f96b6f4fd3b3aca961b5c4a3012103a7eb3178dd3c0d09608ed28f8fc06141b20514fec84120e4ca354fe06c5042260000000002000000000101325c033ed9ea1812fde021be4da23f2c250d7d741fade66581b24b26c5b58a2e0000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa034012331f3aad3152f80829553e96d848a1a9ccd0c1e13b0f0692998f2a6835260ebe753837a57d3810cb8fb966933ae4e10684885a7c81a8f3204bf57446e532b881208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22313338333133227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001029b38dcac13cd33dcd2f9a9aca4aa098642b9204e48d23421f1b2c8450f5a0c7f0000000000ffffffff325c033ed9ea1812fde021be4da23f2c250d7d741fade66581b24b26c5b58a2e0100000000ffffffff0322020000000000002251202e9b8b195fd59ad0425c72cc016ec285e4835567e7b91f4f50c7b1c7c5776625e803000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aabdcb0000000000002251202e9b8b195fd59ad0425c72cc016ec285e4835567e7b91f4f50c7b1c7c577662501407d80ec4033e9a0810f5f0802f5f7eceddf8c0492f81031fa5b0c4d10fb48ae6c3794fdaa7419baba3b38a4fd9cd7558b4f9d6daabc40867a879d9e42a2957dde0140e632d140249d9756156bb7c6568956cf4f544462ec9ecf7d1b9d4bace2c014135cf0dbd726b9bd787c3b567b747e6e6cda1537ee3f28f483d5f9755af839acff0000000002000000000101887b1536931ed367336be89c4811279a26e0a8448143c47c77cb91342d453aad0200000000ffffffff020003000000000000225120975c973792dd6a144239a193df7bc6058961486110aaa3234e4fe93927e08b0d2fc10000000000002251202e9b8b195fd59ad0425c72cc016ec285e4835567e7b91f4f50c7b1c7c577662501401ded49c61f54c92c357151e708f4b7f60822db993238493c8cdfeae7028de0cd3262ce5b318cbbcce332c0d1bc7dc57deedd28779aaae4954b9daf2ede2785630000000002000000000101866fb24cadb1993c54225292fb947daf9b7c515277f1e2148f7f4a1c0510d27d0300000000ffffffff02000300000000000022512010aba1f36963ea797b69f0f85b65859d928c9b02b56fe5cb26e89d473386c4d21632010000000000225120a86733a81f9db1cd8da8bf4a3bcd74140839cbc23fd22d5d1bbcb2c2e53d54560140466396b6cced7a18ede789544d74cd451362b1ba1f6eee26c48321d8133cf1c0c1395bbfea203dd2dc229fd1cad552ba461c78a171903bc776f14200473f443b000000000200000000010185888dfdd3ff73d2e7576ac68e98af6fb3be979e181e6ae183ef1e9c3a38ce790300000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05e7526010000000000225120eefc4bd03489dfb8843b31f7eaba72d569962cdb604fe3e223c9e3ce79fccb8c0140ded482e38b0c8304cc814e2fc10baedad3823bb29c518e46f2331b1de03f97a4d6b2064cec981f32b526dbb99186ec17e078b4f728beac0562d3a31a18e1970b0000000002000000000101c201edcf2789650e816314a663ff331f6f4b6632a01e745ab9a89a5bb71658ba0200000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05ef5d500000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd90140e38974d17492cad10d54b03dcc9c5605601cc0240564b00002383bc386493d19e0a1704a94580cbc58c25b5f1259df9d7756c916ed15524b152929e6826e26200000000002000000000101f231b1bed70180b09234f358933cc15d20f103179f4f53894dcad7d30c2a796d0300000000ffffffff0200030000000000002251204c6d344edd051c7612d1ebc5d8e1d08f7ac68a9c5ee9d17bc4dc80979d4c12d50232010000000000225120f2ed8e3e8c53d370d580e91d42513249261654575635db47490053207de9ab310140ae480c08aa65548c431025e0c8c0a1dcc93fe74910e775cbb4e034eadc1b564c55aae46b98ff7f9af2859fd02f1bfc74f583e38e9a3a7add8b2c9a696b7db10d00000000020000000001012f0525109aa4c61ab9561377b1b17c2441a422a9f19f17bb4cec204d191192030200000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05ea9ae000000000000225120073d22132e859187e7f0a77b452205168b35a7618f7edb9860aec67daca43adf0140ff41ab66710a64e3b54274aa591b0b74be87ef46ea7d241ae792a798aa2fcbff3447cc5983ab61f10c40fb24087d9cc661255ce3aaa9aea660ad32076cdf275a0000000002000000000101bd24f587dc88ed6ed2eb85bf93c4bf7a8a75c4ffd77b47b7455b6d623ef7685b0100000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05ef6a8000000000000225120073d22132e859187e7f0a77b452205168b35a7618f7edb9860aec67daca43adf0140260d916257a5dce51c9a8529650fd30558971b4a21ca6ee9f9df988a20c4c4710829a1b2470fb61dbc5e81edf05fe501be7f95a2bf2731039ec767ced94c4f6f000000000200000000010101c030738201a826ec9fb92d8362fc0c880799d5803e59ce034cd43cb01bc34a0200000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05eb74a0100000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d501405e77acd8bdd8c360f4c8d5d9a5d5709d89f242f3d06a6016729b2e614006b2251d75e1f15771007bfdb4a844e72287b35b5dcade346c87943554e0c3831d8d2d0000000001000000000102df84e6925e4ec8cd8c5e538387939807be6a5079a72e656973f02c161a9f68c40000000017160014796a603dd6b2fb2d6b612055ece747bcd2a9692cffffffff71223594c64837dcf31c9205f514f69bc14be5013549ddcb5fbcbc288ef450570000000017160014e871910f87dfedffd99b0d6c36443a25c5eae93affffffff01dc0500000000000017a914ef137959ffd4fa9032c2df758779f2912b0c2e20870247304402200f3c407a565561e294131d23f0fd66c519271a0538df9840036ac40b0bdb887f0220043bf2fadb249529706305ebda96128bd8f25418af344ff111e2d5c694d341d10121032f252919338b596127cb27c81403ec6d053335e0d7d868a520e30f6a5d5d21470247304402201ddb1ff760d700d61382e1dea5028772be670a39fae58276f68bb2c414749293022068dbea3e19534b1de67e62a0f0311461fd06cbb78af033aecc057b9ca2e31feb01210280cd51b856e56f04463c1c8622a83b77d7e2e01643ced394a00dbd0eff8e94210000000002000000000101641bee81f744db4be315828036e19d82408eb3315a37eff3858f37653340076d0100000000fdffffff02b902000000000000225120f94962764e1c242782b544b07fe83a54231bdb69886f3cd8afae799549658d7d046d01000000000022512026996a89237e9b36b2b25dd3dd5ecbd590626f0dfa94b92258005a9b859c07ad014051eb24484133d00eda5b8e7d9f3183d88ad20017f26a90d604baa767a0941ee0afa63984ca206242a946a3d67a28565800b440f865ca1960f2fcced476604e8100000000020000000001011f70af0ce78a9f2d86e439ae643ce21b72f79db86c1e7e2e60d9ee3fcac9dd710000000000fdffffff01220200000000000022512026996a89237e9b36b2b25dd3dd5ecbd590626f0dfa94b92258005a9b859c07ad0340b4ed75bb0fc7cdf48b385a1a1e14ff45397afc5fae12826ed8dc8d877ecacd719f71c40ca6e77dbfa13ddf931c34c2f06fe3bb7b0489fcd4d4e515d4b97511997c201a6bdba0a61bccc9acf4ed27c2a069e4d3c25e73c5b763b319480f4f5478a296ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a2231227d6821c01a6bdba0a61bccc9acf4ed27c2a069e4d3c25e73c5b763b319480f4f5478a2960000000002000000000102fdbe5b6cc1d2e256c283701534c4663784c3431d6711831dfbbd05950f45bb850000000000ffffffff1f70af0ce78a9f2d86e439ae643ce21b72f79db86c1e7e2e60d9ee3fcac9dd710100000000ffffffff022202000000000000225120be01a37ea2132cde5c22ff7d7bb518d972531641f378f20555ac7e75fd128665346501000000000022512026996a89237e9b36b2b25dd3dd5ecbd590626f0dfa94b92258005a9b859c07ad014016b693cbbdc34f1111212a15954dc17715ffd489f240fa6f6b831f1ea1e85636e0d14e15b7ad4ee971e6d87a34d585168f6dbf35b8749754ddea495111ef041101400d8c458d61e630fc2bcb76407777b96792eb73230122de81934cf14b15d9ea87394690e2b57a3d8d4ab4c9e4d000dae3f6413b52b3ccfe7f77ad1a20a73ab57c000000000100000001070f48697b211dcc3db998a53cda7edfaa368d06ea0a89570b9cc86a84d3e3e5000000006b483045022100c69c1ad50f204dd7fe0f75b93e8d1f6856b4083f9a2add9e09cacddfdead974002202b695e46586e47751dfbce183b182b945cbdb8094db0e09df241bd1fbfbe5e84012102ae59d8c56c07566ec8d88cea9071b529ba36a1e0be4defac871595919932e5d8ffffffff023f250000000000001976a91495d3df6c59e5d21c2b0c1ff1a5f501267fe0614688aca7050000000000001976a9143bd3f92e6a9f8509dab4b9d0b71d65f7bbfd20a188ac0000000002000000000101a1bfc39002f63d7211f05b246fb5607370e8fd744bd1927012b8c629baf7ba8e0000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa03404fdfd87b17e9f40dbc603a64ca7f0a604357a97a8eeb0622e03abcb59cb6c11abe3d3af04dd03062c4bd927b96bbd56bf3c04e6f34e2adb8f4c3df0ca8bd019481208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353130333737227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102743dd660b568450be9d07561fa93e4d181d46b2871261edaec0b8b07fbba61f50000000000ffffffffa1bfc39002f63d7211f05b246fb5607370e8fd744bd1927012b8c629baf7ba8e0100000000ffffffff0322020000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf56a0e000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aad2820000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf50140df88da60cc0bbefa6c353f62dfb181b0b0fcf4d20bc50a240512f03d4bff8942b631568fa010be5447a6eb2a399c6dac7b29ca009c7c23c8d9cead7adea740b20140828bc66198de439fddb4081293a27dd2301695c816a3c2f512ea8efcd59da7ac4d5db5c8647dc3d78944b9255c48a6c0f97824ed435a80ef35cf7b4c542aa0be0000000002000000000101b52273af06987ad2ba31e9ef0484cc2c1012ec39fa8cff472001b42d443b44b10200000000ffffffff02000300000000000022512002ce301d3382a858e2152897ad757a1d6fbb5fdb97769d9f98ba1cfe06760bb21f7d0000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf50140b6b25fd2a6bc17cf5e2b0767dd43270913ecfcff91b7d625ccac96eeec2a516b61c41b962a3b3cb9a5e2335980c8ef8f7bd3674f79b10d59acec404407d39f910000000002000000000101c2b7e05d0405291af85e4159f76c2a7ea9b0a89058212d4b0cbc9f702a98c6910000000000fdffffff0122020000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf5034009439ff58b1c9a3e82a0bf8135d46d87b62d709b89ecf3a147b03f574ea82c83d4af6dae3f809873349ee87da4a4ecfbf3ae1411a70feba484cc4a032228367181208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353037313433227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102921328e2c73b8eeaf264a152c6445accf052b0f6cfb52833643c48b87ee957d60000000000ffffffffc2b7e05d0405291af85e4159f76c2a7ea9b0a89058212d4b0cbc9f702a98c6910100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120215bb3c6eb969dc583400b75357e7512f7f86e9c42c736a0faf0d87fec582e85c602000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa55690000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf50705000000000000225120215bb3c6eb969dc583400b75357e7512f7f86e9c42c736a0faf0d87fec582e85014079720c12bbb97c7c98893876264787f2a3fc72af937516e710ae6c1e7ea200dc59b0f6c053bab4e0fbd50dbb1149f7c8c90c9ee0f71e53d3667b608bb50e698d0140cbef983cc3d7e2994a58d360466e3dda5d0421dce567a493a2b3970a945e6f49afd07a3474d57b6c5e6225516d262797525a940242d4468de7e9c437d5bc5df600000000020000000001015fb4ee158205a466527eadc81d54386a03d82b54ef698b41b1a1ce7b99a7d4c00300000000ffffffff020003000000000000225120c50cb6ebdc1507d1c377545238745d732c99e451ab874a120cdc574f9fbba805c75e0000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf50140a4d68a50cd530ad1629d90e2c4bb9d5e6d1b1a5502ec1ba29f043c678feca2d045cf843f84f7b48009a273bb33bddb833cd428a3950e338730ffe543db439a7100000000020000000001015fb4ee158205a466527eadc81d54386a03d82b54ef698b41b1a1ce7b99a7d4c00100000000fdffffff0122020000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf5034071696ea4fa4b5fe0987f47030d52515cf6f7e31146ec661a43e6d2696a7072bb1a5bb68e07bc317839058fc176492ac78ce4923871a2e72de953a8beae48afee84208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003e7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e303030303037312c22747631223a3530373134337d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001012b0d1c6d9f58865f79e3feea07af858a926a2a8f5caeb2ddf88fd257bdca38fa0000000000fdffffff012202000000000000225120a86733a81f9db1cd8da8bf4a3bcd74140839cbc23fd22d5d1bbcb2c2e53d54560340bb2bed1520ecaac2c450b30ec55060b902fca95ce265f4f1ab8b0376c56d7bbfd909943ca2312b20e9135d592308654d8acb103353c2e1e58cdd02f4a32e5d4a81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030373135227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001027312f20828ba30c5edc250b0506971b9ef81e817bfdd105a991c5102571c057e0000000000ffffffff2b0d1c6d9f58865f79e3feea07af858a926a2a8f5caeb2ddf88fd257bdca38fa0100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa07050000000000002251206a890c9803a2408721df1f6e6e89fccf94260d0c9bd7059fa0db0c2e3778de99bd02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa551e010000000000225120a86733a81f9db1cd8da8bf4a3bcd74140839cbc23fd22d5d1bbcb2c2e53d545607050000000000002251206a890c9803a2408721df1f6e6e89fccf94260d0c9bd7059fa0db0c2e3778de99014092347dbc496343edc57f43750286f57203429aefb4bf490ba33e1c27bfedd43a196d67057bca5e3ff83a2a642541277ac6a94ef45f1c3a608459aeb6ee4f43fc014097ea3014a6477008068f526cf1b7f870e0606a98f0d05bcca9785caf7e985f5c06a8a50693243fb5344cbfbd2ed2cdffec732e7723d8e47289ca1cd112ffca8c0000000002000000000101f5d2fd45acc4c742a7a9b75862e339651d7e9e7b43836473e6913c95e5e483800100000000fdffffff012202000000000000225120a86733a81f9db1cd8da8bf4a3bcd74140839cbc23fd22d5d1bbcb2c2e53d545603402b6566057120a6d4c777ce622fd7fc0f9ec321bcd09b475881ba8223e16c8c8f556b67dbd8040b6e5fce7dd306c48f3b5baf3b407ea493e39582f57cb8c6268585208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003f7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e30303030303730312c22747631223a3530303731357d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101abadae5cb64b7dc615732f40ac487f0b83f0e1974c1f2d9fae523a658f3faa550000000000fdffffff012202000000000000225120073d22132e859187e7f0a77b452205168b35a7618f7edb9860aec67daca43adf034055b89163e26b7313239c3777ab8f91e9b3f1bcd044f570e8d180423c4feb41e530ba651ec1c0038aebc92746c904bac6b3e49acd8c0e9335659dd4f6be80652881208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001023136dc88464947bdb309c8b2535eb6e560cc67f9d22f46318b775bc5a044d3070000000000ffffffffabadae5cb64b7dc615732f40ac487f0b83f0e1974c1f2d9fae523a658f3faa550100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa3695000000000000225120073d22132e859187e7f0a77b452205168b35a7618f7edb9860aec67daca43adf0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad01402759ab385a617232f0d9e9379d16f7123644f2dc07b1045e28979e55ffcc18011a974c11be98d7087e46f3164616fa289eb59a35e6f9cdf1e91f1f0110b42d08014099ee04d55dd45eec94a50e14bc136718bb3680142a225e065d8a4ee4b9e8be56b8393768c296e1ce29e08f0e27997b0ca421c4931a02436956f704f42ab8a281000000000200000000010182617866d153ea7ef4e6e2d7aaef34a6b3f9ef9f68bbf2f29ce86b24ee703fb20100000000fdffffff012202000000000000225120073d22132e859187e7f0a77b452205168b35a7618f7edb9860aec67daca43adf0340cfd2f711d932f9e3296bbac76eba7492f12800e7567e25e68b963403af8984e79380c46b7c705002f7206a4f0d6524a5ecbf62f3396d8b240105a316d11a09d483208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001014e4ac0556f7b093644a6bda39f6b50e78b64b19524fe3e403d03cc312febcb600000000000fdffffff012202000000000000225120eefc4bd03489dfb8843b31f7eaba72d569962cdb604fe3e223c9e3ce79fccb8c0340c72aafdfaa1c44a3b273c47d87c8fff096cc2598df8bee8e8df939eb95cc6df7c1f4cbff79d647854099185056618ae81a24433df8a22e68a6106b033f24df4981208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001024ec839915887877078b19e117cb54900662abda8c31268359173d068b06469560000000000ffffffff4e4ac0556f7b093644a6bda39f6b50e78b64b19524fe3e403d03cc312febcb600100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aab512010000000000225120eefc4bd03489dfb8843b31f7eaba72d569962cdb604fe3e223c9e3ce79fccb8c0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad0140d8823f8635306db1c5d76db8e91ce0666fc8770dc03bd7307ebd7638ae9914110fc37351c39ab1410fb43a470f28000618ca5c38727da581e5ad0678bba28d8401404a7b2b34fb730765bba4ef1ca083ee7b4e497af0641f89e69088c720c870b53e32d0e92f2f1e66d85beaef7d3b19f0eeb885601406ecb6a379a5bad3fccd7e500000000002000000000101b32fba5368de9ddeaf4d5904b13f4dc1eca9d62f439815bf11213ce4dc32cff90100000000fdffffff012202000000000000225120eefc4bd03489dfb8843b31f7eaba72d569962cdb604fe3e223c9e3ce79fccb8c0340e8157541542c0cbb221e53b20ea2c4b48ba4ae186add95137a2cab2ffb9dd3fc09a1b9993cc5ef38fb6d908e6e098ac6d7bf52da1d020859c47553bfd06ff5ef83208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101553c7ce1cd24dce5ae9f77be0407ddbffc3915eb471d0552d42602c9830350570000000000fdffffff01220200000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd90340dc6a1cf81cf1412856c49161d0ba66623ca291f411eb45e8f61cded07b2b4e34ae57ae4bfbe5c507528e2ce366b24e56de9ff7bf1759f11f6a9cee8fcfe713fd81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102c4be2ac873eb6b0700340f6abeda44905cca32a04e93a44df84af5f5b45799ab0000000000ffffffff553c7ce1cd24dce5ae9f77be0407ddbffc3915eb471d0552d42602c9830350570100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa35c200000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd90705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad01409affccc7372a8a3bda7ce03d3aa51e478d161369a64d37e44929314e60cce7e69ada78bf88e4afe8d18132f3ce59344d2aa82cf97068a98efc8cfc414460e4b2014089741f7f1b669fa5b208b7d8a08b41fd218379a82cf11057826f8af16c4ba5c0093d3f846da869572a5822080f4ace0ff89374ead727a2b8de5e3565735d11b60000000002000000000101f80099d9ca9bae2b7a240a53077a30661c1544fcb2c4dd30cd8778f84492ed6d0100000000fdffffff01220200000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd9034048bd66c54fb3e07803bce6aff3a3141427857aff7cb5f03c8a0f7f15e71455d6e57a1466c8ff00417dac80cdff9639eb0edd7697fc8bc4be50920c44aef4e99183208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101f80099d9ca9bae2b7a240a53077a30661c1544fcb2c4dd30cd8778f84492ed6d0300000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05e82bc00000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd90140be7cd25c2e22353ce0c6d82499e6bc2085f381c55183b166aa4e9dc2a5ad4e480757f3a82668d6d03e0cce75c970118c9a9ce20d8eab263b926f3d3d9fa59e97000000000200000000010170d6c0d4ebf81eeb75082fc7dfcc81ae3f439a87731f57265c472241792b42e30000000000fdffffff01220200000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd903401593cecdd8a1cf189a61d80ef437b57d31f5dad985b778cec2b5ac525d97748982dadbbf5c965cb19990057fbe4023653908c9b7c212ee8e78e37981eea00ace81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102fc9ef2ec4180055de34d71d606b576de8f81a4a598ed405ed6b3548ddc0e6ce50000000000ffffffff70d6c0d4ebf81eeb75082fc7dfcc81ae3f439a87731f57265c472241792b42e30100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aac2a800000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd90705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad01406b31fa0c71fbc70d578b05dc08275fca46a303393f7a883778408288a4f64f767ffa995132c054f2502adb0ba930bf09b8ca97ece8a0e4f39f69dca32224fb4b01401fb6a80620ada0fdb8a33fdf24ad03bcafa481ebfc0bac637769da5c9bc6ac41ed85506a9a15ad423e3888261f9527a5794a805281b2e5bb1d433a3d543f857100000000020000000001012a85cb754aa4d4579e23c936735ab846a5db319a58bde50efd43edb311da9b820100000000fdffffff01220200000000000022512013c4ac2a7727f5335c5995511b2c81037d38e57b6e50f7c7d6fb0c9ded7f0dd9034049dff72128ab0b979ac0368d69dfe466cd5904602af9ed8eb77c956c7cd03b6f277ba81801c7dfcc3847320a7355e3fb9878c22bb8ff97fca66fb2ee95eb8c3b83208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101b26a605da237340e784d30876da81079089f8a3034eb02c14a787a916b4c35700000000000fdffffff0122020000000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d50340a2f93b374e2d3e7dc8e39ed02da4076a1d8cc6818bb5d9785704dcd5470d3eb400c050b8021499347d9b4953482aff1eb68633fa3a6c3a020f0067c86b09bd6681208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001029f32c8aea00ceb9f49ab26ea496711c11e228e3045653aee95a148586ae76fa60000000000ffffffffb26a605da237340e784d30876da81079089f8a3034eb02c14a787a916b4c35700100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aaf7360100000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d50705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad01407d33330554af90938e779b0c3902ae5e8b63bdd683b2e2e6e230ba1b1249c1b04bfb867ce4ce61b4bcea9275c70de315ba5b7c96f853c17796256655de3873df0140f9839839eb18ad5b1b307b1ae5aa621706686b3f09cf28d0939aa00989d30d1ef5ead3b915cb48b6518ac5073facae6692649c682fc8651162c7e6c1fcd5ac60000000000200000000010192fcab8f8546b5a29e709abf02135a11f300ba0d116bc1a131d0417d09a9ca870100000000fdffffff0122020000000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d50340564f5371f3e39cd93b4a24465abf916a88a3eaf63e72dc20c98195c273856ee492fc1ccf32cdd95795c9d7d20955ea3b2a4e05c4f06565e6b7ba993d6743b5f583208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010192fcab8f8546b5a29e709abf02135a11f300ba0d116bc1a131d0417d09a9ca870300000000ffffffff02000300000000000022512089356bb4e1018c1dad9027d3e5457838b2f62d5cf39864601d2aea2b47dcc05e44310100000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d5014076717af59f230a88f5555582112d3d970d01340f0b8a01ad24c12e522e95c4a7152d3d97670c7cd7a08db0f7f8bf96a97c9f23511a3a2ad851a80d048b0d17a700000000020000000001013221392c0b5dbbda1ed8770ffd35bef177d05b526d8144b15f4c65ba9aed61b40000000000fdffffff0122020000000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d503404a6be04180cbed68c80a1c9fee92c95eaaebc97811d935ace634f9394034e7cf7d657bea19de56b71a5b7478bc9f619653b9ffd6538a75e64fb813f1b698af5b81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353030303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001025d83e3cb7be386b6aabce7a225fdc64ec118f482e93758210e99f460eac7d4000000000000ffffffff3221392c0b5dbbda1ed8770ffd35bef177d05b526d8144b15f4c65ba9aed61b40100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667adbc02000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa841d0100000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d50705000000000000225120b109869983d42ba535006c421bed3457a0f25e61dcdedba62a1daf1f815667ad0140dff9e2a1c490f910e4add7c82ace9f31eb4669224d80859610ef91bcb000769f24cd2333d0b7077cb205f21d391b971f39863abb6c5df337b860a10cbc7240220140eb7f1c690eec306c1a039322050f7a7c531c74a2af25bc2b2098d509065bc6113d383b8efbac7552b9228b7fdc35ffb1f07048dee5735650362983f33d80b4b8000000000200000000010126f3eecac0def4bb3d975644ee1164a0055cad371cfa2c3b5736372589dd86350100000000fdffffff0122020000000000002251207c6409dfb70f7d2e1de274b234fa8b3fc4cf7d0f98f61f259559bea1005a02d5034065364c35bab91a6f961758e1708cd5ef4e22dc336ea4bd6ef819eec65308194d70131bcb629382ab52507b1405391931d74f82c3f4e013a079c2b3d6fd4e049583208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e3030303030372c22747631223a3530303030307d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010156bcee3c713e4e4b4e5414b5adc7a47506e60b31dc63f4fef1e6bc3057df26880000000000fdffffff012202000000000000225120f2ed8e3e8c53d370d580e91d42513249261654575635db47490053207de9ab3103405ecc1f70cf7db926092afe47771da2f36eecbeebc68128152a159a8d0ef3cf6f68c7b923065f9ac2623abd5da229e18b54eebf533215f61d78209347b9cf338e81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353134323836227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102cd79f41d719e7549fea8ee9e7bc4ef165f49159b05ac1dfbfecd6429a44091440000000000ffffffff56bcee3c713e4e4b4e5414b5adc7a47506e60b31dc63f4fef1e6bc3057df26880100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa07050000000000002251203260cb81fcf6340dfb024f22cbb7d0de3f4074f323ccb259738591e63f530b46d002000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa2e1e010000000000225120f2ed8e3e8c53d370d580e91d42513249261654575635db47490053207de9ab3107050000000000002251203260cb81fcf6340dfb024f22cbb7d0de3f4074f323ccb259738591e63f530b460140cbb5fe104ff1c4af410a8aefb3f109acb1a0953fe37df9ab13c75b9c653df8139e5ab14fef2f299d876f2561d8561155c90943be0cf4c1c6f316979416d472590140a00bf6a85a726cc4074219b6c2d299b056e4c6da67d3382ac35bc10f252a88e261d0e94f469f70913c2f1c60f80755541779c82a1953b0c03a919b9ac5a9b755000000000200000000010145d1c8acca1b1381641148a98016d2e1e6b3148881d9ad6625d8d86a005e174f0100000000fdffffff012202000000000000225120f2ed8e3e8c53d370d580e91d42513249261654575635db47490053207de9ab31034045b8354a8c429df5bdc1de07d0fac38d711e67fa31c4d75040dff8e819d0f32af64ab6e4c95fc4a71157cb3c22b26b81e1051925a4dfe2e8b89a09ccb16f6fd284208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003e7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e303030303037322c22747631223a3531343238367d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101e024eba8e928685bff47890ffb6f8b7296a770012896fd344885816a29f316930000000000fdffffff012202000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb0340d0ed15f1358a407c3987e9f7119390797b5ffc9ab9196dd45b581077d40f5f1412a486b139668831bd88c7041a03bacfc9487575487c9f6360b0d3c98025c85082208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003c7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a2231333833393931227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000103e52c8db40ba76adf6a4fdbb429b9a827bf289d013d82305436d33ccf289766cb0100000000ffffffffd48397b2ec71fccd976bb0ab9fe9167e4eaef48c94115dc79c67939ecdcdc6a70000000000ffffffffafe6c55fac05338dfbb1906c817f31e2efd146408eb62632df0027fab24808650000000000ffffffff045126000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb71f1a40600000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa2202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aab324000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb0140581eddbe9df6ba1f571fcd0b96074143b6e74d1c8ee565df6109bb842b031da9e38c459b0189a4c2c2383f37b315c9ec9c197b58b8c323ffc79c3b81338182a102483045022100b93600dc0e5755af9bdf8adb836169dd5b915d03e3e0e69a14fc424538f477ff022072e2218fc4967ccc87ce3bbc9b6924bc88c790a68c786e658fd872541e6aa21001210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be60247304402204d94b471ddf42a7ad1f7acb68737b792d49687c2b586e4b3b90b4e1fb82fe7fd022051cc7ad24ba373b6fa1c5ea7fbe9dbccc32815868c86c38bdc0a368f0e9c474e01210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be6000000000200000000010117a6c3cb2ce8fc4fb1d4a9ed18325757758ada7ffbaf718cd1e325ccc2d81aac0000000000ffffffff020003000000000000225120555290e5f7b764046cb27a2a66518a43f74e142e19bf85786c6bfb9ac1a4d2447d1b000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb0247304402200bad0d7a3f7ad96b7d8f35efad2f0f032d2525aecee2ed2d7c2d8014b1329295022071204ab76e255d73ba8dce8ef37531cbbe18bdccfeba937d4c114122782f56b201210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be600000000020000000001017fa1d7576948158802660fbe569aee48e3ca5efe1ea804d5c8ddd5e1b39d376b0000000000fdffffff012202000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb03408955a419abc3983b362f5820eda0d10af1f7ff267a964862f692ab21f25cdf8684d54230aea16b4f7aed097e515f3b6a2aaf8e36c0b038e5b5347c7ef9687bb282208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003c7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a2231333833393931227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010317a6c3cb2ce8fc4fb1d4a9ed18325757758ada7ffbaf718cd1e325ccc2d81aac0100000000ffffffff7e8de0ac384854f0b1891102d674073add789f904855de362b2cad7ee3de73e90000000000ffffffff3411a372726af7c8db591f62ee9c3a07cec44cbe621538dc5547266d27c752040000000000ffffffff045126000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb20cba40600000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa2202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aab324000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb01401a67f74c629ed2aef63d7b6c901be63ae119bf390810a6251cd7866eba1e7c6edf276dadf8e095d9801a792c108f873ae45a63f728f0fc714e7bb53c5fb8af3302473044022013703682e7b3a4b887d1459bc3c7e18be0e7b59d6a637566a16bd8ba6df3e3370220156aa0d9ca6c6bd1a172ed4220edf77738f77a79ad5269823a2c3457a9f053a301210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be60247304402202e8dec0ca485e59c22efaaa057da4ab519d3e34bdfada9f240a1b1e572502ac002207200011a3c2fbdd3f307560fa9eac34a6c979c426f77a9d2c4baefa73834bcbf01210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be600000000020000000001017395a5caf44f07a7388750519aaeeae8a979e18eeab70ccaf8b66db07efc4a070000000000ffffffff0200030000000000002251206b76f89d31d4b79e79d105c92859241cb515ed3da88eb50d58809c29c8a075327d1b000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb02483045022100d708f78aa018cd9e83c8f035a7b5a971dc4a410bb9404e89eeb0f43cd8ffe37402201ebd4c00f54d0dafa33e6063ae83b1b340e34646868cc97cdf00e5c6080200fb01210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be60000000002000000000101223b7a03b767b74cce27564b0ade71c29cb4a071395469fd153a76c6b158a1320100000000ffffffff02204e000000000000160014afc8265804fef39c0af91c51db217c496615edfd8f5f000000000000225120f7316b19848b95b09e67e18d72d11e5a34ea8c09b3e90f30bfd8cd523ac2d2de0140bf07feb6241fd95c034815d32910f5f8c75bfef823e8edf5749e37bb70bc844f8d7dde995a15837aa3ddddbb81768a50e65da055a517dc12efa9c1c21417aa53000000000100000001843345ac7fc79bfe673e717c483de5ebd32472606525bd400be7b3b746b4ab18010000006a47304402203371a9a395e03e2ffdbc1fe5ebbc7019a06e421b8b99edd9aa6dd4de3347ee2602207b9a0b944afb82b43c03ef7251a6426d3b8e22b32903762f866ac7fd98c3590d012102ffb50c171a06fdcf8a8cd1190e53951557bc68932669a038d95e8d863baeb871ffffffff020000000000000000426a4036616666383035303237323261393430653563623431383965613831353466306630306365343264623762633864333735666566613430336231313464303831b7fef21c000000001976a91481b5d8b82799bcd127904e665f1f217a16cd635188ac000000000100000000010342652cf7c31e733117fec26370cef684f0ded32e55e2ef856bbcba6e8a41c7250800000000ffffffffa70cb8fd312a6f91dc2e1de5b8943efc505058af3292e587b6fa0d555105e17cfd00000000ffffffff4f0840f418a22122a179e5f8790134e8cf2acd3103a6d842d6a5ddcfab5b31a01100000000ffffffff02820400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64e0300000000000016001471519007f77b0da429f9c17d5e98bd6b208f0a3a02473044022047cdd423a7160c654245882d92f383ad9333cc38036f1723f70a3dbfbd2f6b7f02201d620926ac977ef09f0e53736df4597acec797eb32a6a1ee4749a7a4aafbdd28012102e6498ac3be9268b941504f09bdeba7a53df0a537e29b5fea5cf5ecfaa4f25c0002483045022100bdf133a8c47d8cb33213facbf7a1bfa5012d4af8bb62076dc2181b0c77ac885f02207cd4db858ea0ef5bf489b20f3b77c2d0d7d1427e09f00bdd48395b7b07087bd8012102e6498ac3be9268b941504f09bdeba7a53df0a537e29b5fea5cf5ecfaa4f25c00024730440220379ed0591ca5b6236e9a804f7d190d16f49d441775f6d2dcbbbd880828535d9d0220562d30eadeef10415ac0cf59ef5ac33cd456167d1b0f4d5d482af1c4b2e37281012102e6498ac3be9268b941504f09bdeba7a53df0a537e29b5fea5cf5ecfaa4f25c000000000001000000000103aff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f40f02000000ffffffff2fca50377af0503096bcf55df842c2566e690553fe5941a7a42a09a5e5c3c4a80800000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c9b00000000ffffffff02670400000000000016001460426faa653c536502e0a0d35658d0ba259a63b669030000000000001600149c6385c198e1d3fe529f4c02e8dd9fc5e2fc53a50247304402203cc02b8cee21fb1d2f9de9d6d7e01302968870f9316e0d881e0c99d48fe4e37d0220266b9e1fe7e2d13932570576bb93842d3ca8c5c9196d0c9cbbd930832871fd4d012103d49258a2cfd280be36cb6e9ff185ce554811ca534d9ea0f3fe842fbfba0d2285024730440220555d41904d7030f186c6a9f11afb8cd238051fe2beeca062406882f1aee1420d022063b6afd5dd20f60d8561e6df03a6101af08c0f6f6ae087316dabb5648c380bcf012103d49258a2cfd280be36cb6e9ff185ce554811ca534d9ea0f3fe842fbfba0d228502483045022100d20e1a0c2a11f3c05f573dfbc27d32fb05d795dc063821ab55244f4bc424e5b902203ba36814f9ce7838805f48bd573ee3baa61b596688516fd0dc8a970106d9fb01012103d49258a2cfd280be36cb6e9ff185ce554811ca534d9ea0f3fe842fbfba0d22850000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154bf01000000ffffffffd89bf2d9a7a69c0953d29538dfd11824d9a75672821ac9d9573b3f4d70326455b402000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706eb802000000ffffffff02510400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67f03000000000000160014448d7a38a10732588426d921cb497a5087e0fb09024730440220773dcb5b7e9020615160b7e0b4ccb99d21964044aa8b1cd92f882542e9ee39ec02200ea02d1c1b19cf3a22e7421621b2518a3375346bb973893c18ffb88f98a4b66d01210375153f4e674e3dc2cdab04677d626405533461cf55205fc23f817c8de126e743024830450221009709876ac76fa5964366e93a344d31723c88a6c1d5f2a585a32f4363f0bd537902202643f3125f55b744d9a3b75aad0af94632039dc785887bfc74abd47ac5d4f39001210375153f4e674e3dc2cdab04677d626405533461cf55205fc23f817c8de126e74302473044022046605bf46fd084ee36f24fba5ee3160941630dcadd88dc85f3794f16b759075002204231cb562316108fe0222522f1cb3c06cccf96fd7ba15a50a5f6800b06b3cb8f01210375153f4e674e3dc2cdab04677d626405533461cf55205fc23f817c8de126e74300000000010000000001030aa16b43baa38a83227d2030960530c8bb306f3ffbf32bb7512f877dea53bd120d00000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154fe01000000ffffffff1ce2b419db9a6c117f8137395d4ff8c73d493447aee6ecac23bbed701061ac370c00000000ffffffff02930400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63d030000000000001600140ebfaeb9fb8f123eab4b048d9c5136620727c48e02473044022077f281c2a445981c6685355ce4fc1f44e79e66c803791ac294237f40da3417080220060357713ea7291d81771799fd76f290fd5eadd6c9aa1d740c470337e3704ffe0121038390f09aad000c276206c015143c9c935980026ab6cb7390f14197f5b4ce31e902473044022032beb4de7968513f3b852280dba2a6714ed05c40188342d5446ef13376fdc0a802203c03e2ae7b4fc84f6877e68813bed6a234a234ac083895dec2371dac6e091ae10121038390f09aad000c276206c015143c9c935980026ab6cb7390f14197f5b4ce31e902483045022100a89fe8234a3a00b78c230f4f2840d3c45f955473d4e0e5661ef04eb83e30286302206d83ac03bac010c8e6088b4053638c172d73f93c9183002ad1747ac8c4d574280121038390f09aad000c276206c015143c9c935980026ab6cb7390f14197f5b4ce31e900000000010000000001039d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b45919c00000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597ce1101000000ffffffffd15f7523002191f411ce452532255742278379f232e51a6cc52b0297672cd2a30400000000ffffffff02830400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64d030000000000001600143a6756e700a9d16f177926b682b9d3e5daa4543402483045022100cf7c238aa29e22ae6d02590533df90392b2da92278be3a8240122c6f3cb647b7022015d1d98a183f22adf9c204c09f0a7be58cbaf7859843d494096ee3f1ba775881012102ba6a535fe4611c87a427dda594f91253ee27b172732d7cd39a12c5927b1de9eb024730440220744d74994faacb995bd43b707e02209f267d298dd5f4d9ca7da66dd931f6a2f8022065bd2c9d5bfa6a7377ff204b8db8e602b3fa6b11eee16b600f1ca19c0efc05db012102ba6a535fe4611c87a427dda594f91253ee27b172732d7cd39a12c5927b1de9eb02473044022034e639529af0128f1185e375f4ceb05728581b5f77d3100e4e2020e6a454967a022041aed542ef6d2fbd29664c54c8867c3bdda218d606481f97078262ad085a29ff012102ba6a535fe4611c87a427dda594f91253ee27b172732d7cd39a12c5927b1de9eb00000000010000000001039688caea343f9c99a898401c9ea2f4000830a145ade036ce57f5176cd98e85dd7400000000ffffffffaff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f41902000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23ca401000000ffffffff02930400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63d03000000000000160014075b06994a667b433198082b781345241729b47c02483045022100f230f85c6ff75bc2fbcff405b71b6bf3fd75cc69a4d872e5ff21435e15d8690402204558fb19b4cde843b3cdbb198733ed3289572fa26fa0633c8ef8216d1e9c20280121020bbd76a6da9546162b15f2e54ad8f3e13641135b99c71ef17cd97c2c8fee3bfa0247304402207ddee128088cab51166c9b099e6da7b78361240f91e0fd519bdd6ce3f6b2ba1d02205c6dce8d47e3a8c60017ff2d237be0a623dcbae09e326a13e290db38cb70e6e10121020bbd76a6da9546162b15f2e54ad8f3e13641135b99c71ef17cd97c2c8fee3bfa0247304402205657e0e5d023b2f547c85ecdfc508a0cd76e57be25b5320d2eec7e6285f29a0802202efc1c7fc3a14b6667e201d7ab0757f44fb6d066bebe1ee86309bbd862abc4110121020bbd76a6da9546162b15f2e54ad8f3e13641135b99c71ef17cd97c2c8fee3bfa0000000001000000000103d39f74a64c8465b7817ece5948596427216cffd12fe76bb68a435fcd2caec27b1200000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c6501000000ffffffffd15f7523002191f411ce452532255742278379f232e51a6cc52b0297672cd2a31300000000ffffffff02800400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6500300000000000016001444cbad53dc2b81d638e404aed0ca6cb19561386d02483045022100c6e977294e03864aca4fd9be217bbaaff05c37a31843eb256bbc23c55a6ac29502200ab76969755135af59b321ba7947127d7ed645510471aa95f21f210e7d81e9ab012102a60fa2ec1532ebd8fc90aa1dac2ce1b785bd4e346d68c1dbacf4edd1cd3803470247304402203749e92ec40d43e6a8bd8cdd8094e84d56cba4a6f67b3433437ddf73c86f6618022005adb311ef75200dd3fae7aa108f0f686a6aba532e41c46e9afb9cdaabe0b602012102a60fa2ec1532ebd8fc90aa1dac2ce1b785bd4e346d68c1dbacf4edd1cd3803470247304402200284d438eaad1b8d3795ab711ff60c0a8d1b58d44df856475b7546ef5d02c8b4022078fcd45b213cee37f14e00ad825272a0c1e3cbe49115c0a45ba023a430116f16012102a60fa2ec1532ebd8fc90aa1dac2ce1b785bd4e346d68c1dbacf4edd1cd3803470000000001000000000103aff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f41300000000ffffffff53b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d14f02000000ffffffffd89bf2d9a7a69c0953d29538dfd11824d9a75672821ac9d9573b3f4d703264554601000000ffffffff026e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66203000000000000160014179aca968ef7c57611b7bddf64ad3f97c4a3b9b802473044022035e1cde4d147a3864b6311d67fa38ba150bfbfecc4687520e868806765744a6e022039bcc8dd6fa4284ad0ba05d9cf142e7b3df97963934c10e4dcd901be6c09f819012103953385c8d82917bb2ae50300d85cbeebf6f8a0eb35270e0808fa4a76fdbd415402483045022100b89f14b335da4c6aa9c14cbe3800eb0429b0773b01a87935ea0fd55e0f4978ff022078bd9812ed77ac7fc8e52f5266b006c0d9cbfbd2a06bbb3b665ee89f63ecf50e012103953385c8d82917bb2ae50300d85cbeebf6f8a0eb35270e0808fa4a76fdbd4154024730440220380fd3d483b228a461b596eb1ad0f20acc73348b2f125ca337b21da629e6b63f022011166c596e1d25a9832da0e9f4714fb5f17953e0f43dbad2a7267fd6fc5b2f83012103953385c8d82917bb2ae50300d85cbeebf6f8a0eb35270e0808fa4a76fdbd41540000000001000000000103ddbf5720276f6d1e3f8eee9443483cfc42da4151e168f773446b879f0e92b96e2f02000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597cef801000000ffffffffaff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f49802000000ffffffff02540400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67c03000000000000160014cd70bf96208f7c99f2a3f68fd2d590568afc46f00247304402206e7b92beb194100638a32c15134f56f9efa8ede487943ce7dfca46105305779b022002635f69543e450ac97c841ed3ffbf0c45d189695a2ed1e761127316a8fdbba101210332a24215a884b3fae54659abc5fe95260cde818ae03b2a4476d2df99937b0b5602483045022100ea49ef15cf0bd9f5e136673bdd19368939e3e891ad143530bb66d996b0ad1e5c022052c8ea1420f2d40b727fd87fbe450c2b547651cb21ca39d7d4b7d438ff4e0e6601210332a24215a884b3fae54659abc5fe95260cde818ae03b2a4476d2df99937b0b56024730440220486e7f2abbceb0cbf90c4ac4021070e633224d13e75adb6bf33c0c98155192990220580ee8e1c022228a2091db607955804ec3a306dfa2d4029f921d75210ad8fcfa01210332a24215a884b3fae54659abc5fe95260cde818ae03b2a4476d2df99937b0b56000000000100000000010312de6c89c49e41033f0e35bd5607054f850ed266f607b23b91ba8c87a47787e30c00000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23cab00000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597ce6c01000000ffffffff024e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6820300000000000016001433719fc13b17d1521150e68d1ab4d79b06fbb6f7024730440220028a95d3e5403289e241369650ac98f31c42f143ca935388d9d28c8496217d1402204f42f3e89c14d31df342ebed00e8c8baaddedc52934e757e5b7cd5762f58945e012102b6f05b67816bc80a514e7251a17149c9194cca251bf972a8b8bd94e1b4d2fadd02483045022100cd61707f75230c6d8807ffd90fc2fde729dcd1dbb5baac9d68c0b98254acf2c90220283f771d8e9a3040cdccb39258ebc22fac6bdb65b14facc6ae58e82d2a1558e1012102b6f05b67816bc80a514e7251a17149c9194cca251bf972a8b8bd94e1b4d2fadd0247304402204a32ff7e990a7e35e19420e2c045a86a50282f7307e3d2560a814b3e3a2e1fca02203b67fc5d835a00e2c1b3b7ff9c205cf82f1695a5148ce68fd73f71205b44e59e012102b6f05b67816bc80a514e7251a17149c9194cca251bf972a8b8bd94e1b4d2fadd0000000001000000000103d342583daf96e7c104ec7bc4448249a31699c69ffb9fd35f6e1b84e3dab706aaaf00000000ffffffff41001491691f9e47dac8f25720c54ca77d74ab4b55918d849bf75b9d1570654ed901000000ffffffffc807d4c57490333e114b167fcd9c7db17fcc069bb57317ff9693738790d1f9a40100000000ffffffff02520400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67e03000000000000160014609e665ad53808b1415db7c23cc2c47b95b9902f02483045022100849ade49f6c2f269bd2f629ccddcc9c99b4657b811284b569d94679701cd75f702204f2475dac47368cc80a596dc3325e768df211a2867e15d832f5373040bd6d6900121036c6b7862feb0e7732741eda8790bd6a069a55fe3e2876c833f64a384644952d50247304402203bde8cb608920b4e065a8043f62fce10347048effdaac3e4180de3e9ec40b7d2022047969d048c4b6b66761eb9eeb168e5048e1b75c255eec8a829073c9461984d870121036c6b7862feb0e7732741eda8790bd6a069a55fe3e2876c833f64a384644952d50247304402200f7a58dd9b15ab667e2b441c16efe3684598f7afc8e93535f287e4f94956e588022019bce68fa90ca9eb0e7e12779e528d7cdf73686f6b3c447d71348d997fe484510121036c6b7862feb0e7732741eda8790bd6a069a55fe3e2876c833f64a384644952d500000000010000000001033518695f3f760ca983cf58c89e0531033d6521bc92e7719b0ca372b99ea36c481a00000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1547703000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e1803000000ffffffff028d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b643030000000000001600141c63a2cce7df1ec1c6391078c048fe708c9e7c700247304402203f8fde28645c2a7a564ce143b7bac2018a732ff0f3f3aa650d31b52d3074cd7202201c159b8ea733407cae21d844ed0e5898569b460dddb9e7aa2b5e99774c072ca0012102c904d7974b18e4513d74d0e14527216529cf2390efb0fd5290c87977c0149b1f0247304402206f47c15f5be44dc0e9856a723bc33f0dc4296e5638b8d3d2b7c784949e5e9ca3022031cee40e44bc44d6e924822835ed76c6c6caef5be6d8f79aad03d0cb4fc20ee8012102c904d7974b18e4513d74d0e14527216529cf2390efb0fd5290c87977c0149b1f02483045022100e42f00d86af51de1ff37e6188af7d212ce119ab373a1c0b5fb854b561c2146920220154eae31577baf737de8ed6108a96bd08cc914523747bd2717a108b1bbb77353012102c904d7974b18e4513d74d0e14527216529cf2390efb0fd5290c87977c0149b1f00000000010000000001034f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a76800000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c7902000000ffffffff0f16693531013137ee7462076c26880541f4adacd0ffd020632cb17de3c8b4801600000000ffffffff02680400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66803000000000000160014b2f4a702c71b582110a58d71f9cd86e5a78a429f0247304402205d8e63eb6dd141597c69522bc3bebed9b99f9ad89b9a1e87a2909b247e6e20ad022066846a4e7e39b0049641b896d876b2c2135cc97a2db33691c904c5537b1380870121029568181c85298524c16ddebf3d7d51fbd670645f20689a402536655afedb9e770248304502210090aed25970559b386a4c24435f2457bd7d527bd4547cafd97287c2475510fdff02207ddfc742c3c56b66c1874aee2ec720b212abdd64d3b713623bfe3db53ad9b3730121029568181c85298524c16ddebf3d7d51fbd670645f20689a402536655afedb9e770247304402200bd276fbbae571d2aaca0717a9362b63b3be57ccd8208e383428d137cc59b5c40220770deb23839d6909fe6a174ee58cb6d31738f07483425a23a8b2373bf847436a0121029568181c85298524c16ddebf3d7d51fbd670645f20689a402536655afedb9e7700000000010000000001033ac2d963cefc265c2882aa7f1315c9bd331e528a6b00c1cdc00fc11ae5f9c3b72300000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e8e00000000ffffffff4a250280cd7c6a46c6abf6e968ed0fba45cdc27af9b2a7e42d8a44a17eb9b22a1600000000ffffffff02570400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6790300000000000016001482f23994a22b0b2dc911309cd99e73d93fd164ce024730440220356330c771651d6717a448d5e9052042efab87c75e7cb565a7efb602af55104c02201c58e2392c9a62c7af127e670221ec91116e3bb0d39c7341957d21b86d0f285d01210276d84aa794d32261b236e314bc9e4cf8d7cb7323c54ee5557e91304b8b3f3d6a02483045022100cd1d560c73ffaf71353172edd9101a5e49c19872fdfe071bcd041b8d7ed31db702206ec3109cc8d61e9c25458159bcd75bffadda3e89b0b754d0cac22d0886d3517c01210276d84aa794d32261b236e314bc9e4cf8d7cb7323c54ee5557e91304b8b3f3d6a024730440220017f2d9585c5fb94a2c26323e1ea817ac7924825a56650b3eedcbec3cba8765a02201e23079c4d216c71cf6a918cb59b996fbdfce6c728ed9f091172ab41fbafdebb01210276d84aa794d32261b236e314bc9e4cf8d7cb7323c54ee5557e91304b8b3f3d6a0000000001000000000103ddbf5720276f6d1e3f8eee9443483cfc42da4151e168f773446b879f0e92b96ea901000000ffffffffd15f7523002191f411ce452532255742278379f232e51a6cc52b0297672cd2a30000000000ffffffff68c1ded12880b44fc61f2edfb1ae34b0b0920d96d87f208ac2197b8bfb64f68f1100000000ffffffff029c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b634030000000000001600142bc7ac4fa86a3056ae8adc0ff66e7cdf735d163002473044022032aeeae4c03b6714202e1219d1c6c57bf31281b928f673b40c6b5266610155ad022015ab84db62f831b2e99200524673de2a0bd945c2a3494f9b3f6612969bb1bbe70121039fc6c188b0adeb68dc034279fe957017a23579f7de0d4a5312c0f9e204ab40400247304402207b16725894e8ff9217334fc0a408b8e8e7706b5deb2fa7647a599ac740720ede022025b6e717c6282aebcba0d3d087693b46590d685b2d6db38cd6a71f90474b3e400121039fc6c188b0adeb68dc034279fe957017a23579f7de0d4a5312c0f9e204ab4040024730440220051070f047e003a80be7cd1e4ece4df90ef2909b84bb64817341d5a7538bfe15022045f5ed4515e02d38c0dce8a43ca67c48e0e47ffbb76715874f99d2104df458cf0121039fc6c188b0adeb68dc034279fe957017a23579f7de0d4a5312c0f9e204ab40400000000001000000000103c807d4c57490333e114b167fcd9c7db17fcc069bb57317ff9693738790d1f9a40400000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c8501000000ffffffff68c1ded12880b44fc61f2edfb1ae34b0b0920d96d87f208ac2197b8bfb64f68f0c00000000ffffffff02970400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63903000000000000160014c17d7c959c6414c37940b00774b7b71b2c2893d80248304502210089b9f18170b24765a9264929a478e64fab0d43c4032a13462ae0a18043348a3102206edf5c987aa4acfcee279a80648ff10239c0b996d9c051a0627bdbb4614c9d1501210205fbef8475fd452564efbbf220ffb6fdb80c14accc3b8c3c437edfbc1ac9a8120247304402200a02c7aab87f42fc99df017eb640d5a32d2e9c9c92f3fb2003f8f18f18b904e70220395556a55501f81bb7b060f9669fe3c6384e5a9cfd07516b83d757d7e481c02501210205fbef8475fd452564efbbf220ffb6fdb80c14accc3b8c3c437edfbc1ac9a8120247304402206058e89f3f8547e69e73ebc3159d58f46a4a2a3dce14dafd4fbf629daace8a9f0220534f833882f8758425945013c795894751edd345dbb910d4d652688a5f60fcd801210205fbef8475fd452564efbbf220ffb6fdb80c14accc3b8c3c437edfbc1ac9a8120000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1542301000000ffffffff1ce2b419db9a6c117f8137395d4ff8c73d493447aee6ecac23bbed701061ac370700000000ffffffff4f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a70d00000000ffffffff028e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64203000000000000160014895e32b5bda3ddbd4f966fd06485cb1a2e8e0c5d0247304402201aa254cffb1cb7e13adbe090aa154eaa65d26233392808211dc708455b6507d802201b78d1459d372f87186b1496c84f78ad0ae6b0bb3a43551e87fb3dd576444051012103f7251b01ec7173c9ed50647bb42314f1237604a0258355c3efebd07e658c90f10248304502210096941d13a54e1fc1db6bb7670bb4361237305e831e2e1d3de97ca182f32bd51a022059f2643620f97fea25cb17240764a889e98cfc59eab5865ded2321ab9126d4e4012103f7251b01ec7173c9ed50647bb42314f1237604a0258355c3efebd07e658c90f102473044022037046bc0d765ce1057a858a342d6977d5369e4eb870a9d6868af7825c631ff210220740bdb1e1c40ac9445a95af1423f431294f4ca0d3cbb57bd8bb71be0f883bb74012103f7251b01ec7173c9ed50647bb42314f1237604a0258355c3efebd07e658c90f10000000001000000000103a756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e0102000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b45911102000000ffffffffddbf5720276f6d1e3f8eee9443483cfc42da4151e168f773446b879f0e92b96ed902000000ffffffff02a50400000000000016001460426faa653c536502e0a0d35658d0ba259a63b62b03000000000000160014ce1a32b9a86c5bc03ddf535c0e4a72ef3ecf2e060247304402200fca5874ec6a512df41f58ccbf16b4592551e4e29d1cd4021e03bbc5007b929d02200bf0df0c7ad38e708be15c64a5277096593281e41aeab69007a211a48bf730c70121022e2b29a2dbc5aa6d55b48479b0c43a0f9b803aa4cc77ee8d2501eef13497566902473044022004e8ac28b00f66db851b43fbfe0e43a9e165f87f1124f20ef7b2f3d573152dd20220702b0a6f414adcc66e567216e6f46c9547826ce896367395c8f5d1efcb37cc000121022e2b29a2dbc5aa6d55b48479b0c43a0f9b803aa4cc77ee8d2501eef1349756690248304502210082fbaa985e618163e3a44edd33762733993b70b7b8404ffe156fea78e1c94a6f02201ec76cc770cb0c4ecab215369a2919517624157eb8f990384f69588b51c1300b0121022e2b29a2dbc5aa6d55b48479b0c43a0f9b803aa4cc77ee8d2501eef13497566900000000010000000001039a9c7000b110bea353e27bafe7177546abf635803a853fb03876e95728a130760900000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b4591d402000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597cea501000000ffffffff02950400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63b03000000000000160014ef8b93510d3ee07ce9f38b41aa1048ee53a7859d0248304502210099a0bb8a2e5e4ef3bd6cdc1e26bd05f211f5baf071721738ed384d9bfd2f4707022022e92a038840b0fbbae71556f711c33c0aa0a89119be090a05a0e47c59a7cb49012102b979c9db7195cdc409302a54cd98b25e2072e5db282294146c2b9d2ad8cdf6d102473044022046629bd5c8f037acc6d050c3af258cf1b5ca2a518de9a771dddddaa86709cb0a02205276242dba3baeb978b28ee534550ac5296abaea4720b7b513e99585b493514c012102b979c9db7195cdc409302a54cd98b25e2072e5db282294146c2b9d2ad8cdf6d10247304402206085a62da42cc539b25ad55aecce73d297fe9304806ef47ba312c1888c3056f402207cac02159287063c4e292df46d427f5b0208129bfe23030b4176630f34ac6e1d012102b979c9db7195cdc409302a54cd98b25e2072e5db282294146c2b9d2ad8cdf6d10000000001000000000103d9d1bf9077c66d20cfe0cfefbbe6c119f33c11bfe6f02d6253f7b7e6ef22727b0300000000ffffffffa23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a6e01000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1544c03000000ffffffff02730400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65d03000000000000160014acb700a24b52b582d1ed695bf2899512c4af615002483045022100f9bb815e5340335d89207b9639536baf9ed0d04d6a28e2d0a1ea42e09bfb45a0022011dc4924b8878bd40ff5aace4650f030b4a5f60569be97feaa9490a7e4e222390121024c81b23b5e87bfb362b8fd3d2be9a54723af9f0a4e27d2efafcaa73dd4923ef20247304402201dc90f085185e71fa2e9dc0a327ef3226dcfe8d728c393cb3e6e4fa86fbdbc2f02202aed2fe0fa2cb0cac397a49986f762d9aca563edff89a4e5489517a718f47c4f0121024c81b23b5e87bfb362b8fd3d2be9a54723af9f0a4e27d2efafcaa73dd4923ef202473044022076725d470cd18d2c7fd4286568e62bca356e0e7d0219205e6174ba5cdb5e01a50220574578952649e1f52f79ec3d3c3075771ee78ae4f7233e6abdfe1811e8037d360121024c81b23b5e87bfb362b8fd3d2be9a54723af9f0a4e27d2efafcaa73dd4923ef200000000010000000001030a43a5c9c73ea24c928072d4fb4190c6e1a9da5c77408cb250017f741b14eaf50100000000ffffffffd342583daf96e7c104ec7bc4448249a31699c69ffb9fd35f6e1b84e3dab706aab401000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b45916a01000000ffffffff02560400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67a03000000000000160014550ac11600eaae5417cf7b8c4ef078f9dddf99e70247304402200d67dc69b513b06bd8885f8f39325ac714e2410f2697dc98063cd820034107cc02206fe74ca91446a97e01290f24a72f48ea4905aa518c400f40cf8448f70e3a68040121028cda93f14ee5fa30cdfcf15abf4e09662b4290ed63bc83cccb92ef685fab90330247304402200b41ecad5ac2b9b7766875dd69932bf0640636724458fae4280bcfcb3be02a6f02205857d98f53f98bee454539152ec602d82afe079768da68b0c93cb215b5015d860121028cda93f14ee5fa30cdfcf15abf4e09662b4290ed63bc83cccb92ef685fab903302483045022100b99335817c0890a66fef91ace831f02bcece74f41dd6c97f57484736e99f10630220210b52ef5980748712c6327a83fe1c8b2a7ca0a42ff90af0f9184d0f7c514dd00121028cda93f14ee5fa30cdfcf15abf4e09662b4290ed63bc83cccb92ef685fab90330000000001000000000103a23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a8c00000000ffffffff3470d6da0bfd12c0dd73e274ac193feb04a5befb1556003248c9e2bdb034d4370200000000ffffffff9688caea343f9c99a898401c9ea2f4000830a145ade036ce57f5176cd98e85dd3e02000000ffffffff02a00400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63003000000000000160014cacef31526b79dc9b5db522738ec2f92e31505f302483045022100f6e41b9f26bd6454d6596c59c0ae4a0b96004041b31a5201e837fe2519b7dcad022064ae0f11fccb630558f89843ca53fe43d9d5a3534bd619507b46b87308be7cc3012102ea52da27cd371b2fa1df69d0794f00b243869673e41de984bedb83bd9a40e6af0247304402203be2732365939e4ee9cf792ad103461b0b8a4f5063d60d2e5ee460cc09a22ccf022017a448a9d0cc54acf7acac7fc171443a89ab3a768833c7a578617040a290eba4012102ea52da27cd371b2fa1df69d0794f00b243869673e41de984bedb83bd9a40e6af0247304402203a55d0fdbe1e4302f7a55d0229210ddcbce5e4dc4c14fef65f06359f741e573402206c49da04a2696c4560a4a5a04ae1acf5e7249d8df92fc93eb7cb55535f0c1210012102ea52da27cd371b2fa1df69d0794f00b243869673e41de984bedb83bd9a40e6af0000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1543101000000ffffffffd42bf50c1022bed1322cf13a90c7d3dac77ce1d4078c30cbbcf1539b3bc69f150800000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706ed802000000ffffffff02770400000000000016001460426faa653c536502e0a0d35658d0ba259a63b659030000000000001600146466ea99df5b6e108ae5921b3fa6861dc82f313402483045022100ac045d16fea085f8cb04c29b511e56036c27344734978ba631a15685165e51260220595f174b610d75d75bab727aa98c2cf100926bff35523c8b43727754e5ff1ee50121023efb6bad9bd85605eb630b8c6b1b01cf70f80e7351795a766989bfe5822a0de8024730440220231985495ceab72bea8d997e5c9d57efe5ec274e8026c0f07b68b0f9ab3d94d2022055d08b6080d0a590a2b8781ade94d3d684029985eb97da108b6b795e68197a700121023efb6bad9bd85605eb630b8c6b1b01cf70f80e7351795a766989bfe5822a0de80247304402203646df0a8c9d6b78b7dc1b617724d22cc1a1d60e30f23d18f58e740e242a830a02203ad9e3a55725142bb60ec771b88a4ab7c50656c2944fc040691e3921c39f96960121023efb6bad9bd85605eb630b8c6b1b01cf70f80e7351795a766989bfe5822a0de800000000010000000001039d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b4591c102000000ffffffff53b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d1c102000000ffffffffaff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f44500000000ffffffff02580400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67803000000000000160014748d5157f2c851949debcf9c1064f0302f71abbc0247304402206c363f14631fd9347b57a41532b8ad521788dfa98dfeeee752f0b2994c82a51902207462a498caa481bcc06ba8489632b1351aca605e6171f2b2d014ed06dcae0ecc01210335e4fd9c2efccf687d1030c51fd4c34b5ea7aeebb30c0c32a646ec7e49e83a670247304402207ed0d88b251fe091e7431bc6605c0a388693b0cf30a6b8c64bd7e12a46c5840102207953c8ae80dbc8dadc9c5e27104f25cde4b8b032600606c57dbd06050706461101210335e4fd9c2efccf687d1030c51fd4c34b5ea7aeebb30c0c32a646ec7e49e83a67024830450221009cfd63bbf77011517e5cdb2b0e265eb65adc46b81306af47e0a66ffc5f42b1f902203641ae5cdb34248c2eb9c9059445fb1b6d91f56ea68d8109645e70797c12e00701210335e4fd9c2efccf687d1030c51fd4c34b5ea7aeebb30c0c32a646ec7e49e83a670000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154d202000000ffffffffb91886b7934bc805e80669359ec2674be73a58717ce71b719dd4d344b4f02d2b0300000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597cea200000000ffffffff029f0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b631030000000000001600147e283efe9ea2131d7a86b084d49a98e0c0c78226024730440220600b07907b21ef01d133b035c4f63d49ad095fddd37f779e7aee46036cb65aa30220734fc881b3c2db49fd5a068441203ce7df618778a3545e79de65fd3aa426e117012103bc1c6021c19eae4f5f6bfde9e01966214906d933e43a7cb17a3f8e8f49c9b72c02473044022077c7a70b13a0ea608fb3e131c5d9ae39b16718eff8420ea8f183a9dfc7d306f50220710daa53046b83bad39fde32ef8ceb8ae6e74ba0027703f0eb59fad672625cef012103bc1c6021c19eae4f5f6bfde9e01966214906d933e43a7cb17a3f8e8f49c9b72c0247304402201ea14753476cfe85de06b5510be301d130b3e93d45266184833c0576b46f6969022013c22cd5402501c0a47adb21503839d8e90d265d2d60cd4db8ebf0c12cb2ca4f012103bc1c6021c19eae4f5f6bfde9e01966214906d933e43a7cb17a3f8e8f49c9b72c000000000100000000010353b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d11b01000000ffffffffddbf5720276f6d1e3f8eee9443483cfc42da4151e168f773446b879f0e92b96e0000000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c7602000000ffffffff02680400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66803000000000000160014ed23baf6872a98fa215e52d0866075bd853c7815024830450221009046b580d3adeb01d94353132e9c1ed6dd5674b95ffe214ca641329ad72f240802203ac6dcfa52b4df42837aee8b27655688c17abba7da98f8d1db2b346243b1e159012103c415cb50ee5573dedc38aa671dedaf88118613123451e355a0fbe2f672fbb4ed024730440220379b390e7d17158562c9a4716a26ea9a7cca6eea7cbd4ec52222e00aef156bc602206ee393def2b2d27d42cf1a746ecc91bcd615fe4209f1b446d74b0b364756c263012103c415cb50ee5573dedc38aa671dedaf88118613123451e355a0fbe2f672fbb4ed0247304402200af15ee8514afb2bddd8693d8cb82f74104863b3cf3fb76caf66c70ed4c10b3e022039b66b57fe715d284600410ded77c358ceabe0f35b5e38d654b20cdbcf3cc898012103c415cb50ee5573dedc38aa671dedaf88118613123451e355a0fbe2f672fbb4ed0000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154a001000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597ce2f02000000ffffffff9688caea343f9c99a898401c9ea2f4000830a145ade036ce57f5176cd98e85dd7900000000ffffffff02920400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63e030000000000001600144fb22e7d880d2cd7b81f1f8a2a0fd0ad7b60832b02473044022010b9be4b487d506efdb4c57a351cf992f9f227d150be16e743fdf6bd7eb8761202207aa4ed8705838b4021ab6568241b9004506d9628a38a65e37f2ec2900f0e38fc012102316d611406cd0d40f3f3ba735c8d7677f4b259b013923fde172b15154973ac7d02473044022013a71cf5bdc286a6fb859707fab459332128b06edd80d31a0dec19147a36a5c002204879218cd617efaef632dce2514fff09d332199f71e0de601beee47b89371a04012102316d611406cd0d40f3f3ba735c8d7677f4b259b013923fde172b15154973ac7d02483045022100af4e22a7948ce40abf979ec93bde9e15b83093f76c9a7d727701bd7c8abd827c0220443fae054d2b5593923b870e0889e7887da71d23960b50cf4a3e6ce473362089012102316d611406cd0d40f3f3ba735c8d7677f4b259b013923fde172b15154973ac7d00000000010000000001033bbebe9e66aeb4b5957e15e7129b1f13fbb5c832d322d3bce41ac2296f0248d41300000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c1a02000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597cee601000000ffffffff025f0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b671030000000000001600145d90f8bf768f62597f4a732f1bf61f101c5fe7f00247304402204a31865de5423295c29f327fa8d5ed794c4d2ea6cd0053f01635e09204c91ebc02203418786426aba480c3f60578bb13f417ac0cffb01ad3eb7226b7c3d70829049901210258a7b739336741807c2750b2f64dc637e42b4137761466d30bccd58c8afea68b02473044022037a70c4f1c8f80ec2f4ab88956e27cfa3345661b9e759c9d90767b137427f12602206046385ffc298e94c17381b99e814f42ad55cc5a13823050dddd9e0a3c6b2c3b01210258a7b739336741807c2750b2f64dc637e42b4137761466d30bccd58c8afea68b02473044022053b9d325dc9cc8a5e2f6d90eee9e28ca7d1a8d6ad4448b157d9c017f334267980220049bbfcfcbefaaaa7b183871ea0ddda7233b4d4af2a55b2e6dfc974102ff0fae01210258a7b739336741807c2750b2f64dc637e42b4137761466d30bccd58c8afea68b00000000010000000001033dc7b2d95d2399dbb74d022a05eb17a96b437f667e595a0c8c1379e8d590e1d35000000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e0302000000ffffffffd39f74a64c8465b7817ece5948596427216cffd12fe76bb68a435fcd2caec27b0e00000000ffffffff02700400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66003000000000000160014bec871e07dd8e09f5c38e56c6810c6267bba5e820247304402201734a0ac5d2c95b87bebd1de02f94ff3827ba20d1df62bac0204676ea9d23be002200c3a8f9c8df80bd2267c6165074ceb4c6988774539e7d88772efbf7c4cbc03da012102819e22c43f58cf5ed12a78f0840a26da7eee56a8d88138f971c08ba3ca12c8db02483045022100d6cdbaf6e226fc2336cc120cc5c57608412239b2be2903039731fd8a415f057f022055675ccc8a7a60074d8820df0b5f588146670d931ee527de1a7400b0cf11444c012102819e22c43f58cf5ed12a78f0840a26da7eee56a8d88138f971c08ba3ca12c8db024730440220748d7621165ca5bd05a56aaee381675bb5728fcdacb5111e6d846e81259bc39b02202a3312f65c899756ff33117ea09d5f86b74b377489139926b679362250339571012102819e22c43f58cf5ed12a78f0840a26da7eee56a8d88138f971c08ba3ca12c8db000000000100000000010353b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d10e02000000ffffffffd342583daf96e7c104ec7bc4448249a31699c69ffb9fd35f6e1b84e3dab706aa8d00000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597ce0c02000000ffffffff02680400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66803000000000000160014b2f6fac4a121d6e44bfb7ac5132e7ccba13ed8f30247304402206aea8c0b97570e6fa7d4a9818a20ad6b4edc6c0845ad692c6d6464c20766528902205a80dfa5d332eea73fe82110c5a65c2a37ec38f54ae9f8af2d9dbfdccd8ae3870121024a87ca8c46cae4deb79e96fd26041266cb0985c3bda44e3c8a4c26050f26bb950247304402207af3637f2bcccae6a0579b0466af9fc1597fd527f2957237d883c54a33f4f58602201ba0d6d9833f9375433c6b0db6a8315d178bcb8cdb9d340baccc1e6b9653b9320121024a87ca8c46cae4deb79e96fd26041266cb0985c3bda44e3c8a4c26050f26bb95024830450221009321752b0306cc4d43302915f88d26673e87eddae9b6c8ea787b29eb60548253022003fca21b25b59d4ccb6bbc800bf8a060a608266ff7cba779b1c5d6427de732c10121024a87ca8c46cae4deb79e96fd26041266cb0985c3bda44e3c8a4c26050f26bb950000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154cb02000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e4c02000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c7e01000000ffffffff02720400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65e030000000000001600149f8e927648d40c08a7520d0b2b6db1cd8ff37b9802473044022059e4b9f02b7f75e35f2ad79cd035b7e4440a69f678d6fb89eb797a7cc97b58d302206945caf774f16583305497d1ce1df74e87bbe4a948dd8930ecf85141f90d16090121025eec822492581de5b29cca4cf4741f6707a4b716de877f7055b50e4c6d8887600247304402201ea42001bd1fe696500a18daa144f84feab6698730ce76e326d2b2464002abd202203d0ca722981be7c888960cfebaa9fb3d86593578a6b2442a6befcc172b427b3f0121025eec822492581de5b29cca4cf4741f6707a4b716de877f7055b50e4c6d888760024730440220686aa6f04776249d7ea0f3c0b4632fb4a2149a16c7dcd8c37afe95ce9991459402204eddfaabfae48aaa81e64f75d47c7615f9c60e175b66ab69ad8a033afba3dd600121025eec822492581de5b29cca4cf4741f6707a4b716de877f7055b50e4c6d8887600000000001000000000103d9d1bf9077c66d20cfe0cfefbbe6c119f33c11bfe6f02d6253f7b7e6ef22727b0400000000ffffffffa23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a4c00000000ffffffff84a3d3b355d8eba532895d6698e9cf5e01546a62306deaddbd06685aa005c34f6400000000ffffffff029b0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63503000000000000160014172b55fe987fc7df24b0324dc032c289fb8bccb5024730440220128bafdf140c577e4aac86a4148af84d75bbeb6403f8f363ed244a4d863f5c9602207cb311d16dce2c95b07e85d2c5f21869468f6807bd4bf33355b38fa3750e1c5e01210317d1fd49eaf61e081f620f904dc93bcd85a6fa73500f14e474414e0420bfbc7a02473044022056339daaf50838d53d9bd8242a00128b34c43004980f4111973dc0fa0076558c022007ffb347ee622a9fce6ba062f48e7d6fe199eb96b8627a69824173d604c64ffa01210317d1fd49eaf61e081f620f904dc93bcd85a6fa73500f14e474414e0420bfbc7a0247304402203287262c1c5a7d3ac04b8e03dc8247b8bdd533fbfd739322b4754f3114d73a94022003ba0402e8e5c930ee405d2a88da8e29806e9283b6e2bbf67208cf053803c2cb01210317d1fd49eaf61e081f620f904dc93bcd85a6fa73500f14e474414e0420bfbc7a0000000001000000000103d9d1bf9077c66d20cfe0cfefbbe6c119f33c11bfe6f02d6253f7b7e6ef22727b0100000000ffffffff4f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a74b00000000ffffffff2977b0fa32d9133d9a1193498285aa148f2f1106c8c535d28aa6695005c3fbea0a00000000ffffffff024e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6820300000000000016001457490f3f867f426d7995a2734c07d46bbb1c006d0247304402204a95ac21e84fefcae14a8f65607b1cd5b58aae099114a101ee520fb2dde299a902200c5f817c4fed0fc867138c2a786c3c033277c03a688934d3453f4000c7443d55012102ee726d64b790abe01d0d58eb78c94f6706144a10d14325ddb92ea636c2cd16cf0247304402200786e497a8073d8849a598e3429eb622ae6ea41ec88d29fcc15e36ac1ca44e4002204f1344efa13ffac3f212ebabfeed274dcebd4a73183042eafd45ff6e5ac1bbdd012102ee726d64b790abe01d0d58eb78c94f6706144a10d14325ddb92ea636c2cd16cf02483045022100868335e1a369ea05430bd63ad93e54f0b07997e517f97b3f133fb6e7f1efa10d02200b26db20d8cca47022ac760dafb4c05050a31082b2e62d9682c808dce74355b1012102ee726d64b790abe01d0d58eb78c94f6706144a10d14325ddb92ea636c2cd16cf0000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154c502000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597ce3201000000ffffffff0d376adf787a5b1352f9bdb422927546605781df342217b9d26fa534b126b34f8700000000ffffffff02510400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67f03000000000000160014dfa2bf20637206d2e6ec727bf6b0b3c3cd32aa7a024730440220372ab007fdd506ea4c30e2124b2d9ab292aef52a7be9c4b459ce1635af3608e9022079042632b45f4387cbfe0beb461bf0f53fbd3b109cdb2824aa98b0be4257e4800121024cc1e6454df8a82563178a61535de86e7e415600b7d23bb01877c768f9d62f8c02483045022100ec4639cad70ff1f2c6a55e9ff23bdb6c273a1b62d715926abce62c36831a31ba022074bce7eb8fdd39c8adc0d45ecd73c0d71fe6bfcf8306e59beabfea2a40ceba9a0121024cc1e6454df8a82563178a61535de86e7e415600b7d23bb01877c768f9d62f8c02473044022059b409b6ec2c5a02859d212460763bd940057e2a6d50aefd0570047d2c3d9c3202202301c1a90ee8a939ff4fc1583a0cf5dc21636702397ce2e6bd43ec0b945d2f910121024cc1e6454df8a82563178a61535de86e7e415600b7d23bb01877c768f9d62f8c0000000001000000000103dc564524574f3858cbaf1e717cd0be131d4432e19094c63739531b905761a0da0900000000ffffffff3edc68d2e6263d146314a827f5082724e722bb0f7abb299f86c5a10f0338a23c3e01000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b45916d02000000ffffffff02780400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65803000000000000160014af8b3fd9f1d6843a69aac1aa172e0a58896977780248304502210081574af997e7760c20288179738b64f88e145f874c9ef01902fc82587bf0d5190220236c1712177b2cd2d4dafad66d7b164c4ed8ac4bfa63ad2fcae558870865ba4b012103f5930fea5cc98c12788419a20e9759e6f04be07b54b2e1a8801af92fdd7cd5b202473044022016da26dccdd3a4c9561d08ead43e1efe4faa16ee1262029c7402e53abdabd37002203c2c185b7095c26bf0bc21e958171f53e5b804c7560d42095eebf43a6b6fdf4b012103f5930fea5cc98c12788419a20e9759e6f04be07b54b2e1a8801af92fdd7cd5b202483045022100a3840314f08b5c95f4999369d4d606e9dc7a911f0dbdcd8add7ffb7dc591668d0220289879ccdc2c88ee5c86a95fa7f15ba0ed433a97c0d035adc0dffc15e91403f7012103f5930fea5cc98c12788419a20e9759e6f04be07b54b2e1a8801af92fdd7cd5b20000000001000000000103a23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a3e00000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1543000000000ffffffff4f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a7cc00000000ffffffff02570400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67903000000000000160014df799ebae24e36d98dae98ad095c0ad1101b44a402483045022100cedb5eb1c6af260cea066ff34dcee1ddf8916c5aef3dfa60f577cff31dd69f2a02207d19b9f67a72ba84a0f7c73c8b1b1cbfbc3f176705d3b61f96be7b49b6bd85a40121033ba6aca43da435da91161b3c0f1d878fdcfaf56eb4e274e27b7ebfb0c993385802473044022027dbaf17328ca41095f8fd3d0451e52d2c18cc81bd44454d7d489815a60d796c022021259957d67253c5c1c8ae41fb0e1dec04cb2a7621f5e3a268c5092d51484f2d0121033ba6aca43da435da91161b3c0f1d878fdcfaf56eb4e274e27b7ebfb0c993385802483045022100f70f283be4e761df48f68dafddc67b6d83695df3767b915fdcf447b47da6d7ea022020fd7cc50a25f9bdb44cbfe8b9a66007f23985cc871d06e6d3989c64843216480121033ba6aca43da435da91161b3c0f1d878fdcfaf56eb4e274e27b7ebfb0c99338580000000001000000000103a23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290afc00000000ffffffffd6794e60f1a8336690c279448d879fa85cb126bca210e986d860ecbdbb5aba5d0800000000ffffffff3ac2d963cefc265c2882aa7f1315c9bd331e528a6b00c1cdc00fc11ae5f9c3b74300000000ffffffff02650400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66b03000000000000160014b236ca73f9acf0baa406f973bd9fade08ec62c3902483045022100b540402644976dfb7e9dfd1e4642d66dc8f36074ec038688ef01548c59dce52402203d22305cabef12640b5192e09dd2b22e8d30739d9028b10d07a0bfafa1f98b70012103189454168a6ff30fd278fe7dab90c7843f2891b8e284b926fc416ec0208367570248304502210091fb28baa418f7c3bc7a2e87ce578189f83ed68e3404d89c64d93a9e045a60c0022034dbb8cdff318d5a554f3bf305b73142907ec952dd8ddcfaf336126a40475f8c012103189454168a6ff30fd278fe7dab90c7843f2891b8e284b926fc416ec02083675702483045022100a2c0d29c57cd1f9987f22a255a5a94fdf048c5be253e1f514a424766411fead302207202100c44df8ef61c1f900d0b54988525066febef9c54c291cf3c8b030f6460012103189454168a6ff30fd278fe7dab90c7843f2891b8e284b926fc416ec0208367570000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1546c00000000ffffffffd39f74a64c8465b7817ece5948596427216cffd12fe76bb68a435fcd2caec27b0200000000ffffffff4f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a70b00000000ffffffff029c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63403000000000000160014aba0c43d0f640de711ae88fb512ea1431f8791b102483045022100d33b632a44e3c7da3a24e95e212d1891cd1b44de7f0b856d21b3f115c01f4a2002201fa791b3cc400205cd8b6ea4ff179020b2ec7a35e7b9ad6e201ec7060375609701210218c4ce40be845e96a7000c3372009ff80da1f0ce3d7e32ead8e1d3253a61b18a02483045022100a6060c3e581c7f2a38112193c91eb4ecccc47391b646ec757d8142f42504240102201826187062ed0a96d52d1e3ba7bd11765e542edde3dad2eb885b2ec7b52f0e5001210218c4ce40be845e96a7000c3372009ff80da1f0ce3d7e32ead8e1d3253a61b18a02483045022100fbbb6ed89a0024bc86cf142def70190eccb0da730c8bee15b4cad1cd21a59d1b02204102dfe0ab351e243cf73970c04e74d5be081728379b421c9a2492f7a710155901210218c4ce40be845e96a7000c3372009ff80da1f0ce3d7e32ead8e1d3253a61b18a0000000001000000000103460d57ffa68b1ad5cb3436c83edf7574db2714dd8e8a7861a078d9789603782b0d00000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1546003000000ffffffff3324422054feb3bb1425f76a6b31111269ee53c6a5da8873736bb06043be4e9a0400000000ffffffff02740400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65c03000000000000160014384e1f3baa29d96291120979a827c65dc1d6dee50247304402200aa036d6f94cb791701250e918632c28e5fec2a8ffab02959412c20234c63ba402207dfe78f2d254acbb095d8899787d75a62e5b5c4b17892be5c9910e4c04af6532012102bbbbd012dc270aa2b9784730c9be197f7611fb16e607da3d369d2fa7776ebbdb0248304502210085be73ec7f437f048a001df272710408edca72226ab658cc8be059be323b2a11022021d2d21855ab130c888fda8e04c07185444383a8d63e2bbd76affe4975001f25012102bbbbd012dc270aa2b9784730c9be197f7611fb16e607da3d369d2fa7776ebbdb02483045022100d7dbcffc455746ffec4d2741f6a7e7b2a7655ce8e72a532d0b11bd6ef127ecf502201b0e78eedf65bd1086d06237ea6fe4dd17f9f0f940b9c3aa7267fd03b879d82b012102bbbbd012dc270aa2b9784730c9be197f7611fb16e607da3d369d2fa7776ebbdb00000000010000000001030aa16b43baa38a83227d2030960530c8bb306f3ffbf32bb7512f877dea53bd120b00000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597cec200000000ffffffffd89bf2d9a7a69c0953d29538dfd11824d9a75672821ac9d9573b3f4d703264559e02000000ffffffff029d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b633030000000000001600142237fd4b5852d2241adc7b6d1564bb8a904904850248304502210084cf3c5b23ed2fc5a10e92738eb0740da3113d056d5b3840c0505e67714175f502201b77edd0eb140e5efcfe91b670629e978ea88ace6bee847557ff06eea61eb47101210306e2eb7fe9cb8b00e023526462718bac5061d51d184eaa7c186110a12af6c4c502483045022100f3d9a65ad16d007383dbd0a93bd4d158ca867b715fa58a1f14c3b011960dba85022017d59ffbcd957a7007d1ad1a82772a025a97a579fa46c2e6e1f481e8766f29f901210306e2eb7fe9cb8b00e023526462718bac5061d51d184eaa7c186110a12af6c4c50248304502210092a260387e646e1b759b6a15dd56b0e4b12035e0b354f372b6aa9adb0fb09eef02201af14d84c7110837a9182d47b965260e1499e3b9f1f9b280e8823aad7d86e78301210306e2eb7fe9cb8b00e023526462718bac5061d51d184eaa7c186110a12af6c4c500000000010000000001030d376adf787a5b1352f9bdb422927546605781df342217b9d26fa534b126b34f9100000000ffffffff5befadd9bb40c4080cfc96debd0f96a1fc0e20993bafb9fc4f609b649b01da4d1300000000fffffffff36304ca174719d307a37ff91aee8216a76b814e3fcb2033069f003ece09fe8a0e00000000ffffffff02930400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63d030000000000001600148e20783f191a8136c11cecbc69f060c71f7c7cdd0247304402207bc1a2db9df66e2ab776726b0dfa5dbf164626102011b0a619260079eae00f8e022054ce33fdf1becd687360222263beb18ee35c7139998a1b65a1939ebc30feff370121029306cb1ab6d1458cb328f487bbafcb68882d306b159b07d0f51fa47f928cd8fb02483045022100eb38580cc80122e85a10d253decdcac90fd43147ec456f56314114bde8bfe6160220445e4e697f6a07cc303bcac2cbbad5c4725c21f5c450578890a6a932046277510121029306cb1ab6d1458cb328f487bbafcb68882d306b159b07d0f51fa47f928cd8fb024830450221008967f69c85151e8b741e48e2f84f044e79fed9ef7baa3e459b0841ff236abe9202204ed3e4568e04593532be73c2e930347aadfba2b8c2948e0f3267e79f9f0464080121029306cb1ab6d1458cb328f487bbafcb68882d306b159b07d0f51fa47f928cd8fb00000000010000000001030aa16b43baa38a83227d2030960530c8bb306f3ffbf32bb7512f877dea53bd120f00000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1545402000000ffffffff53b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d10102000000ffffffff02670400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66903000000000000160014b07d4457f5636d8c02825f401103517e658cad0302483045022100a9f436ae6253d10c38496e0c37aa73ff3395e3b3a21d6366d7dc18bdd4835e56022015dee5ca2bd223946206e415930fc0553e942d112689be343c4c22e3d70275730121026eb00753e1893e4727a399fcf2687ddeacb4ab6a40f5b99ea855da80bdf4b7d902483045022100aa41ac1813a13f3093a51288ce854904f44c75e2e02c1b3670f9e416d434ca410220568b40af87f021b0925d0bf6207b6ea480cc736d703762626c2d70085009db390121026eb00753e1893e4727a399fcf2687ddeacb4ab6a40f5b99ea855da80bdf4b7d9024730440220299ee61af8e5155dfac662977022b18fe4a337ab1b6e841986c50897632d75ca02203c2a3d70ee7ce80c2f25f2cacf8140790afa3a204f72db2c110d8f83635d5d5f0121026eb00753e1893e4727a399fcf2687ddeacb4ab6a40f5b99ea855da80bdf4b7d90000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1546601000000ffffffff3ac2d963cefc265c2882aa7f1315c9bd331e528a6b00c1cdc00fc11ae5f9c3b71901000000ffffffff0d376adf787a5b1352f9bdb422927546605781df342217b9d26fa534b126b34f9a01000000ffffffff02810400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64f030000000000001600148fe50014cc141003570507febabc40d7b1f23fd50247304402206d896b2cbbb3baff3ef57a86324e5c84266a2a0fee24e646d7f0d9ed897828b4022038736179e2a7073543f6df7e7fa1da5fac456cf9d35666a6b150e1e307c8e4d70121024883d1a5d98adb3ae846a8403b69f9dd2feec289410fd2605764a341712b9ce7024830450221009c13e9932de92f4d2c02971cc55428c8b1395f8915a88aca53d960e6d5f4d49502204b4322bccaa3fa863ef0c10ff402c763427a669fee2d7596bc41b3cb804d108d0121024883d1a5d98adb3ae846a8403b69f9dd2feec289410fd2605764a341712b9ce702483045022100dd01368a899a4590c0f5a63a5018fe5d85a697cef5efd4ce518c7e73e7bbe758022063e5d22d6f6ab5ce2f82f45383ddf387f9c572b50a50de560efd254327c640960121024883d1a5d98adb3ae846a8403b69f9dd2feec289410fd2605764a341712b9ce700000000010000000001033470d6da0bfd12c0dd73e274ac193feb04a5befb1556003248c9e2bdb034d4370000000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c154b301000000ffffffff4f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a72900000000ffffffff029a0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63603000000000000160014456a141e25b435e97093c8ab6246c333cc58e2010248304502210081e39f86cab930726db3e4ba76ed41dc52fd98f29d98524061929b264b4d8f2e02205ea37d0a4e7cf23247b28c2322a8e9ff63bb1edc28f639656386adfc9ccad7e8012103fdf4a8ab55fccf48cce1f722955b4d9e8487d29084f5222da80a886ba8fa4d8802483045022100b1c80d4e3f449d780acc1267c846f03c8034a2948f05c9b7b54fc011888e1a5802201b961d317c90f9a784293430451c70e51c98c46f69e82292cd273af46e9433fe012103fdf4a8ab55fccf48cce1f722955b4d9e8487d29084f5222da80a886ba8fa4d8802483045022100de0b3ad955f4a031e40c42b721ad9df5bed09ebd0df5e479d79e2f60e01ef5c402205a18ebdc28cd0c7bb6bcd7181c5d9da28da43f1b42cea696869cc783af04f98a012103fdf4a8ab55fccf48cce1f722955b4d9e8487d29084f5222da80a886ba8fa4d880000000001000000000103a70cb8fd312a6f91dc2e1de5b8943efc505058af3292e587b6fa0d555105e17cce00000000ffffffff2f169582a1292488fe1b328def3eaf08d7dc04c0bd9c72251f46c33c525750580600000000ffffffffbc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597ce9801000000ffffffff02960400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63a0300000000000016001442777d76f4dada0f2700c8c2c7dd3338364d8fff02483045022100a53bb5709ba0ba8d42f7103016c5e1aaaade89cbc239e8a177f727909180282e02203b31a2d4f4e276175b16375cb82c7abcdde8997081e7934852176719f9619e78012103420858fb6c3e54c72472cc01c4c8b02d742503d0ede4e132f5e7eddf7f0909d9024830450221009bb030f425d24d49ae7995ca86a91810b3832793d0202c18dff0c434d79bc1af02202b0de278c1ad5949fd8a5e1792b6e47b7551302acdb862044d1d3adb7e11ef02012103420858fb6c3e54c72472cc01c4c8b02d742503d0ede4e132f5e7eddf7f0909d90247304402202e7bed458076a8d8e7a7618285045813543b31f3e213af621841d017b76ad36302201d6d346fd6879989c56da1e212ed78886c04e4b5a56838bc48865795bbd595fa012103420858fb6c3e54c72472cc01c4c8b02d742503d0ede4e132f5e7eddf7f0909d90000000001000000000103a23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a9a00000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e1403000000ffffffff53b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d1ee00000000ffffffff02510400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67f03000000000000160014e567de81bd77ee387cea6cb203181b4f5fbeb9ba02483045022100f4eb88fdaeb9cd6cb41dacb2d6d03b112ae119579958f7665e34b98684bd6cdf02201fd99aaf2fd7b9bb460415157a1f8677f7fcc1e07636b5f784654869a16941ec012103b6f202e9eafb676cb0a02a2fb088b2f790750899c19363ca74bd690a06689726024730440220247e0988865188ea853b905a329171e78b9af70566855d2111568cceb442b9c5022007ec05ab130c31a6277ef47ae844254c53df84e379b8a3a7b845f0b6e2a80c2c012103b6f202e9eafb676cb0a02a2fb088b2f790750899c19363ca74bd690a0668972602483045022100d4367b303eb157e9ee08872293fd1c2de114834729650838dd4a424b7d3431f002204669102e3865912b020e9b11ef61b93b2e635fa022cf8c805e4fd977bafcb2a3012103b6f202e9eafb676cb0a02a2fb088b2f790750899c19363ca74bd690a06689726000000000100000000010353b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d18602000000ffffffffaff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f49301000000ffffffff9688caea343f9c99a898401c9ea2f4000830a145ade036ce57f5176cd98e85dd8e02000000ffffffff02630400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66d030000000000001600147d67f8643918bc1ba5a7654f7cb7a7d0ceace5d502483045022100febb952c445ec8df2a89be9c458a986118f192b60104dbd5fb4374987b840ce502202d99ea30aa1dbc89b3625e2ee7e3ddd9222584c6747a3cfc09cceed40b1b605e012103e24b0c38798395fb68f96d8837c7e5915a07da692f124ac78e32f84c0cfc04e902473044022016c679a15b619865303eff9ce3ffaba71f0472dbcceb537f006fc0dc4768f1f902207485c4a0ddaaec9acbf1f6d14cd32bb61c24287dd01b43494ecfaeae87171424012103e24b0c38798395fb68f96d8837c7e5915a07da692f124ac78e32f84c0cfc04e902483045022100fea4af1849c1bd7b15711582993c86d593150cb801afd1bb64b67730e6c7ca22022029f3f56d931544f29f53d5901efcde584c203a75cbcbd521a6448b2eb46674bc012103e24b0c38798395fb68f96d8837c7e5915a07da692f124ac78e32f84c0cfc04e90000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1541e02000000ffffffffd6794e60f1a8336690c279448d879fa85cb126bca210e986d860ecbdbb5aba5d0700000000ffffffff3ac2d963cefc265c2882aa7f1315c9bd331e528a6b00c1cdc00fc11ae5f9c3b71b01000000ffffffff02a10400000000000016001460426faa653c536502e0a0d35658d0ba259a63b62f030000000000001600148a5bfcb35027e1db4fcfd31c592454ceff46b5be02473044022077c0f95515f38389792dbe85509844c4bd7e3360c759551b2bddf84d97ebbceb022002a72a38a2a88debe85ba4cd6ff872261c02e0cdacd7f4dd2a15bae15b90f7f9012102bc6e230e2da55ecd852dae3968cb75a712a4f2f075e8a24e4fd9cc4948d4f70602483045022100defd11ec809098f9a7247dc292f70745fc14726b659340643d2d07a0bde12ed60220725717ae5793a002a44084ec77ce0066b2a3ebe46de990a72cfa04d9053e3750012102bc6e230e2da55ecd852dae3968cb75a712a4f2f075e8a24e4fd9cc4948d4f70602483045022100f4b805c85be7b93c73c39a0e9285ba172d15902f3a084722ab3766a0305ee9eb0220192e49b9b2bfe92f713ad19090604f1c32699707db56fbbc920350b623cf7a03012102bc6e230e2da55ecd852dae3968cb75a712a4f2f075e8a24e4fd9cc4948d4f7060000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1541703000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e2c03000000ffffffff3bbebe9e66aeb4b5957e15e7129b1f13fbb5c832d322d3bce41ac2296f0248d40400000000ffffffff02890400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6470300000000000016001470a9cbb936a93b71ea3b764e6c813388aa589df802483045022100fa8fa3868fa0972295ff80f90717657479a350aab64f732b1375d9ee1f6f0b910220191bdc3e6032827b589f497aad4382d7ca9013195354162d1da92cb7804daa1c0121023fe8f25c6cbb82ae7a3cf91d771597282e2329818b070683c207673b757ab0ac02483045022100b8f2b1f2bd8adf2743a5d5760979fc6d31f4e423d8a47b17e4aaa6b1c4b871c402205dcaef5e3708a5b2d40158dbfaa4bc7eb3564c9567f21032950851a1f2db2f6f0121023fe8f25c6cbb82ae7a3cf91d771597282e2329818b070683c207673b757ab0ac02483045022100c1bdcdb42c6c5092be78b38936e037202d323182b6121428ed859d529de604de0220699ead6b09152d8449b860aaf3f74e3363e426c2fee0a71e279be2a11b9fdba30121023fe8f25c6cbb82ae7a3cf91d771597282e2329818b070683c207673b757ab0ac00000000010000000001030aa16b43baa38a83227d2030960530c8bb306f3ffbf32bb7512f877dea53bd120e00000000ffffffffb82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1545f00000000ffffffffc0ec04439c99b7ad1d23dbf2dc2c6fe7498ae4a4376646ff620cae05422dda370900000000ffffffff024c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b68403000000000000160014c672941229cb1ad29e39292612d8f60950a6a418024830450221008c992f12bc0a196e1028a6ce9800b34c706939dc0ffd66a6735202ba8c78b38002200d30ea541828075f92bee7f2cf271ac0762209e2c82cb0d6cbbc14e3315d76f40121039d301c0049eb52d328b084117c0befdd9be290171bff442a84e071e308805a8402483045022100e246584f4f0de17095eca6b9822d0e9b3b5007391cd1e38e1a6b497faa585a190220448bd933b6510547a65848aec8379266d920af0f9b60e4998a679f2abf04e0c50121039d301c0049eb52d328b084117c0befdd9be290171bff442a84e071e308805a840247304402200aa3b3d4f54d4ca0378bbb1a5df0757e1dc266e8d9486af0471df7f5de8471c5022052a46a434d17a5ac1172813c335fdc58dadff6a1a816eb4513daeefcc857d2d00121039d301c0049eb52d328b084117c0befdd9be290171bff442a84e071e308805a840000000001000000000103a756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706efc00000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b4591d200000000ffffffff53b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d16e01000000ffffffff029e0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b6320300000000000016001473fcaad1d6dceddae282e97b1f07427de3b6848c02473044022052c70b4ff400ce9227dfc3ba257fd45208598e5385005b3310057c1662b681fd02206f23a4d3d82f32d19c11450fb7e948b9e31ad8b4e134cbc991879ce030ee8fbc012102ebd1873612febef92dd962018e1bbaa9fc0f1b2e93bbb6f23c6619b9c645f6e502483045022100cfc82c1fe10f9705dffd5b5a42f75736851272c13195e0b14570f6012eb3ca9a022069ce6cf2cdcd456b9d0a94c339f7701a44849cec9588d70a9f7950037868eeeb012102ebd1873612febef92dd962018e1bbaa9fc0f1b2e93bbb6f23c6619b9c645f6e502483045022100c830cd7590016e641db8bc984e1ba15ebb2dcac835d70de050ab2a0cf5a0b4a30220645da1d6e6c2fb03a93bbf5ebea3207d7fd2ae9df83fa0cd7d5167479d980998012102ebd1873612febef92dd962018e1bbaa9fc0f1b2e93bbb6f23c6619b9c645f6e50000000001000000000103b82fe0af5ac414ca7396905f36d6a21bacff6434990a3c63f8d0b9e17248c1542a03000000ffffffff4f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a72d00000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706ef801000000ffffffff02750400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65b03000000000000160014b94b94fa4cc75984199947603cba1b6ac72430a502483045022100cc2bfa6fd58b2f118363bf7f4ece84fa58fce5177ab3b46c1197b24110d0d7d302201cd4f59b810b4a9fc951dbacb29121224be8d65d5e1d8750601ecb1b105ff196012102408061da9e40b58458055a78025dd381bb3965ee0b0e4fcd414d5e861db9ff53024730440220650c60b95e3d965359f949ec6ff5d1cae167bee5ee34452f5e37f9f60e7fa467022052cbfa928f80169a9b1dbef617e13202a1dc1071f8744e4bc9b037ce19188fc7012102408061da9e40b58458055a78025dd381bb3965ee0b0e4fcd414d5e861db9ff5302483045022100ba6f2c61ddd7da0cc7cb7090ad2188e70d96189edd86dba1ad9bccc27b7389e80220348d511dc9203542203ce889a82702b71503e1b4497b9ae73a5fd63f540b85ea012102408061da9e40b58458055a78025dd381bb3965ee0b0e4fcd414d5e861db9ff530000000001000000000103aff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f48601000000ffffffff9688caea343f9c99a898401c9ea2f4000830a145ade036ce57f5176cd98e85dd4002000000ffffffffa70cb8fd312a6f91dc2e1de5b8943efc505058af3292e587b6fa0d555105e17ccf00000000ffffffff025d0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b673030000000000001600143717f32d3a1f025fcfd3890585ce7301128d628b02483045022100ff96541f79d3c447135ecf1e0b3677734fcd9b5dcb7f70e448e12b092a4f8bdf02201ff8d5a8f1140e4e1d3ce2d5bbac5226d427bd12de175df7deaf29f4abfe72a40121031233cd53686b4b462bac536a1c9a103106858b42c63d2884b05a06b4963dc7ad02483045022100e032d7eb503da80e6347ad9e674031c97f7fffd94b7e8bba5a6bfa147300cec0022044c4cb3c61418a50aaa133fe81456cea357243d167289a64540d64b4053700ef0121031233cd53686b4b462bac536a1c9a103106858b42c63d2884b05a06b4963dc7ad0247304402200b1b38ee9b2427aac24680556eef4b170907b645224fc17f3a979ba2c84b81d3022028a0e696b6ee972a2f5b2f6c28f24588fc5be6ecaf1ba7163b9f651ebe21c4150121031233cd53686b4b462bac536a1c9a103106858b42c63d2884b05a06b4963dc7ad00000000010000000001039d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b4591bf01000000ffffffff53b171fa16f2809b30584754642f67672675f9593aa68a86e367e80d4288e2d19a02000000ffffffff91136b33bfe1091bb8769e6c975c3fb21537b8abb627f3db8ee0ef852a4fcc560c00000000ffffffff02a60400000000000016001460426faa653c536502e0a0d35658d0ba259a63b62a030000000000001600146ba7b82272b449b79b505911168d17700482ab2602483045022100c7087f6394d9725ac7ef53e68202ea9800e23a70de6ee2eb45a9732b1ba9ba3a022015fcbd4c0a58f6ca68cbbc1f98e90af365b266d9a4fb73661789743ad82afa57012102881eb2f9ecc71c522332f8b4c12e70acfd6cb863fd7dc75fd7859df101e3bfbd02473044022019638639fca10e642ac31b1a3acd954a17e0d92f52683eda2c021a8fc677b73d0220071a14bf67a1ad0c44a8fe606d39302aeeb5fef268cc17698beea4def3f36100012102881eb2f9ecc71c522332f8b4c12e70acfd6cb863fd7dc75fd7859df101e3bfbd02483045022100ac5ddb5d5c42ae652205dceb6e7f40c9c988411b9b581b5c109f2c93313294aa02201ee8e483604941732fb87ada68929079f90331bd01a21be748a0c00df3a854b3012102881eb2f9ecc71c522332f8b4c12e70acfd6cb863fd7dc75fd7859df101e3bfbd00000000010000000001034f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a7ca00000000ffffffff5befadd9bb40c4080cfc96debd0f96a1fc0e20993bafb9fc4f609b649b01da4d0200000000ffffffff9a9c7000b110bea353e27bafe7177546abf635803a853fb03876e95728a130760400000000ffffffff02540400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67c03000000000000160014ba9b1eb3a01b30035c863015cb5ba109b36f49ed02483045022100de5a35b3055615fb706835cab66fb05f8083d0879b54003e25f5a8c0fe432d5f022019176f0476d67df4b9d35295a57623eda7f18915a640f611c34cbd34e44b87cb0121039e87953783f62c767ec5f9e15f62d9d80db8beabc60147e3c196d91a844d534f02483045022100ee96a869106ac4837c012f56b295f976556610579c4932c83bde98ff428f53c402205d32a4ecb0a2717687ee76caef4b4c286befad65ce630c0003089494765ba5970121039e87953783f62c767ec5f9e15f62d9d80db8beabc60147e3c196d91a844d534f02483045022100e4c8dfbd2caba87643e0ef93d3ba142b6e33313113d15d6a1eacaa5a0bcf4d8702202a250c4d8b1683febc73e178c8c32f86a9f1a6d62a13cab7a301e556e8743c010121039e87953783f62c767ec5f9e15f62d9d80db8beabc60147e3c196d91a844d534f000000000100000000010384a3d3b355d8eba532895d6698e9cf5e01546a62306deaddbd06685aa005c34fb400000000ffffffffd89bf2d9a7a69c0953d29538dfd11824d9a75672821ac9d9573b3f4d703264551f02000000ffffffffa23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a4800000000ffffffff02680400000000000016001460426faa653c536502e0a0d35658d0ba259a63b668030000000000001600143952c567d4f958e4ac91d17899be15388b96d6b102483045022100cee93f6ff1ffe5af272d04f2f62ebeb0de43c9f1974299ef17ad82f0b7f854c202202aad4ecdb6eef17be44bf83c909ee758bb34218128cd4259f58c41cd48908cda012102f631bf99d9edc9857b6dfe52094c47217e25e9acf76503b901e938eea08312da02483045022100a3ad4d3b0d0a692b37bc989d497937bbae5a9f6cd99618218e9df4b7ba016ff00220182be58741923ca858d9c41bf14908f643452c782bd39f08bdde8f85a0e9a3cb012102f631bf99d9edc9857b6dfe52094c47217e25e9acf76503b901e938eea08312da0247304402201d85af263afb10db8e92abf43fb6ca82fa922922928a40a09cdac0bc02d64594022030d7ffdcd006759bf2c8d643e1d4f5c2445015a404a5848c8668a6b5f2fe44e1012102f631bf99d9edc9857b6dfe52094c47217e25e9acf76503b901e938eea08312da0000000001000000000103a756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e4301000000ffffffff9688caea343f9c99a898401c9ea2f4000830a145ade036ce57f5176cd98e85ddac00000000ffffffffaff5ca4ad5d217ada0f7f945cd6603259ac59c3be0bf2b23f3edd962b554d6f4f402000000ffffffff02740400000000000016001460426faa653c536502e0a0d35658d0ba259a63b65c03000000000000160014386501f89f86dbe7d07f6e6cc7ef4592f652aa5102483045022100b724bacd471b05b79944c7889d2c6ba4cd581cdce959015299c34f2d2161f2fb02202aedeac30ed1857bff497d2ec717f4ed096d4f4e856df148d4978cbdf0794d190121022c8ef907dcbcb184105d2bf49227f939a3824005038f5aa1c68ecf22f762570002483045022100aea4d038127660400ce9d13db1a3a110b8baa9090e451060a04e85865a619ff802207bff78a795f15390083a92697905c61429ec159220e827a2deaeed36487fe0220121022c8ef907dcbcb184105d2bf49227f939a3824005038f5aa1c68ecf22f76257000247304402205308e420d3bb0c818a3cbc8a70f21910a4f65db17798cf7b0921d6553ce0449202205e43d1772dc1c1df1477d24c2643bad6066f417c2346a332367b0613b6f919d90121022c8ef907dcbcb184105d2bf49227f939a3824005038f5aa1c68ecf22f762570000000000010000000001032412fe8f23cdf862b0ae4ac79a7314a9d7d5e505a5278941679f8029a984de531500000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706ee202000000ffffffff2f169582a1292488fe1b328def3eaf08d7dc04c0bd9c72251f46c33c525750580c00000000ffffffff025a0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67603000000000000160014bfcf613cf3cff814c2be981ac3ccd9008333105502473044022006439016977796e75f8190d8995a0d74c70071a9f8e17d2e2a139c45526ff42f02203ec0d0662bfdf6155d575f77426fd05117c2ba92475dd9b991b1a6838cefad16012103b976392694227b275a87e523763b93e09476f931502938bc0876b64b291b14f7024830450221009e5cea5440af984c791de350ec699474ab292173d229042a8b03d6c78b0a9d6b02207c21284beb897b9dd64ee0af46265b8211b534e18cbe3a0911f6b9888394154c012103b976392694227b275a87e523763b93e09476f931502938bc0876b64b291b14f702483045022100dc813c0410e592c87c5e0e914acb17d6ba79f83b3629919cf25b467b21978359022073e925698d16fec7dab8af91548ac7b0afe6254676f82cc3b7ee8007007c484e012103b976392694227b275a87e523763b93e09476f931502938bc0876b64b291b14f7000000000100000000010385747799e94109fc41e2bf6dfd36b7e1a5d27b4c90d89eb39eb0dff4b0de4d540c00000000ffffffffd89bf2d9a7a69c0953d29538dfd11824d9a75672821ac9d9573b3f4d703264550700000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b4591f302000000ffffffff02570400000000000016001460426faa653c536502e0a0d35658d0ba259a63b679030000000000001600140af61253c9e1fe3fee7c6dcc7c03b0bd40c7f6cc02483045022100e7f5f47c42ba205bdc11d95fbb2468b437913256c448a83b70931454d6cce7cb02201df7c1782e5be62b8592012cc66ceb9eb727e2285cfcf3f1011b24d05b535ef201210218e7a3e31d19ea6a09455e9fb841ada2f44ee720c683f336e426f45c45a7e6be02483045022100a2b8e4320b7b417e0764660aa5848e7ef7a99c5ffb659c96b12ebc3d7f9d4ab802205a13f67ecac73269ccf937ba33d95f4eec203a0f0a7788c1fcff3176e3c1cca201210218e7a3e31d19ea6a09455e9fb841ada2f44ee720c683f336e426f45c45a7e6be02483045022100b094009ffbf3156dbb8970ee6ef8573836156005a8d7d282af1fd3937a3de9cf022068ceaa09a598dd5251a63856f92289f98eec1ea229df840b955bdad02d77391101210218e7a3e31d19ea6a09455e9fb841ada2f44ee720c683f336e426f45c45a7e6be0000000001000000000103ddbf5720276f6d1e3f8eee9443483cfc42da4151e168f773446b879f0e92b96ef800000000ffffffff9d0ce5c34bc868a4ff38dd39ea846d790da8da0eacbe8e883070fa89f22b45919800000000ffffffffd42bf50c1022bed1322cf13a90c7d3dac77ce1d4078c30cbbcf1539b3bc69f150100000000ffffffff02620400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66e0300000000000016001414df4ccd99a25e66af6d1944d5ef02bbe5c920da02483045022100b4e71169be2e057f619d5f760555a76120d5ceecd11f304feac54ac428d3be1a02207c34f4970033aeeef6300faffe3dfa37000b90a572fd892d65d970b4d50d07bb012103a7eae0c80ffbdff245817e8d6caadb21bbb02742f6733f074fe14372bc306d54024730440220484f59063057774e04c1041f144f76a85ca28dce888ef7eb0ee3d2f6298b1d8b02203c12817e7eb3b873e55242cf57cf6038cf5d9637e2f1b126428c3f8a1b080351012103a7eae0c80ffbdff245817e8d6caadb21bbb02742f6733f074fe14372bc306d540248304502210092a59967f1b810d8c422a8dcc0bc828ca0ff5ca30bb31d45fe20a0d63d6ea48802205738fd749426f7b0b32b3f92ad317b41a4645afa4bf1ad72d3f3bd15e5577008012103a7eae0c80ffbdff245817e8d6caadb21bbb02742f6733f074fe14372bc306d540000000001000000000103bc6fe986bcee446c3f721f55f2d413598b3f6b223b13bd0521281242e16597cef101000000ffffffff2412fe8f23cdf862b0ae4ac79a7314a9d7d5e505a5278941679f8029a984de530200000000ffffffffd89bf2d9a7a69c0953d29538dfd11824d9a75672821ac9d9573b3f4d70326455bf02000000ffffffff02810400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64f03000000000000160014bec963016c3858f61e64097d236d1a5198cda5b902483045022100c358cd275f31df4aa776c63e106aa54f6ab6881fcd9cbd093afda43314702f9802202f16367064e5df9dbb100f9aa730983b5d720c2fd44d7acdb813cf6cd846738d0121038329a947d39c138a4ae132268ecaaf5f548d3121e458a5613fd39b22a1b0607b0247304402207e4999feb435395d3695f966b9668eca01a694a05205de9171379595a70ccc45022059892d24bbf23395ced063958eb4c7993fcdb24f417087643eeba7f5d1ec51550121038329a947d39c138a4ae132268ecaaf5f548d3121e458a5613fd39b22a1b0607b02483045022100bddbf9e1b30258a9e4035e3faf18cfa81627915a28f15e1095a14ec78128b427022075327dbecc65d728fa3aa1b7bca9d731622e31e3e6398b329be70706d75decbd0121038329a947d39c138a4ae132268ecaaf5f548d3121e458a5613fd39b22a1b0607b000000000100000000010384a3d3b355d8eba532895d6698e9cf5e01546a62306deaddbd06685aa005c34f6300000000ffffffffd42bf50c1022bed1322cf13a90c7d3dac77ce1d4078c30cbbcf1539b3bc69f150700000000ffffffffd342583daf96e7c104ec7bc4448249a31699c69ffb9fd35f6e1b84e3dab706aa2201000000ffffffff029b0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b63503000000000000160014a15b03ac39a61b3ee69a9b2abfdbb177b686dffa0248304502210081230f28be74566733b84a134e494e6807683374ef42a3f860a0aa73dc90105f02202cc34a8e18acb5fe3aff8b9d4f547aa39ddfc99523494e3a13c80e1607c3d2e9012102a8b0d1a2a96d78452e89ad2ada63d746c956dc9cd550ad7da63af6ed82d1fc3a02473044022057c49c26909ba5470c2f4be57fedf2bf6056afc560796072b39fa0445d20d41a02200cb5a2e299490f0a62f81fb4cdfd6348186611f148ecb16ef07b294db8542422012102a8b0d1a2a96d78452e89ad2ada63d746c956dc9cd550ad7da63af6ed82d1fc3a0248304502210083ed5b6b4b59e6c8dd2526466f9036dad305e1007f95f4bad5f4ffac9f1f3b96022043bd3cf427393efb9e6817ee4a258e70e5e4d0807169a1a6768e96d42826c262012102a8b0d1a2a96d78452e89ad2ada63d746c956dc9cd550ad7da63af6ed82d1fc3a00000000010000000001033dc7b2d95d2399dbb74d022a05eb17a96b437f667e595a0c8c1379e8d590e1d31700000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e3301000000fffffffff7f7b9ec360af2852f5b456366747f9a9b60cec5ef892adce82cb8908acb788a1300000000ffffffff02630400000000000016001460426faa653c536502e0a0d35658d0ba259a63b66d03000000000000160014c0cc2e45a89482522ea6b4b3e0ffcac4c2f5a97002483045022100bc879bca99c28c7fddca95c96739df882ab6aa3003bd89185f9f6b098ddb27a002202ac7cb7c96c928df1a8a0695744fd1a7c9590ab86dcbf53cc10a2ba37c92396b0121035cea9a0fcf1881d392b7ce9dd376bacb71518a6b71b0b9f181c1acaff49d78cb02483045022100843b8d30e86e2e45578f5df685cef7aece2c20d8c89a3a97fd51c9d7e817df66022008cf6598b86ffe821c4d672658f55269de71942aeb1f0d96b85f68cdcbe9ad200121035cea9a0fcf1881d392b7ce9dd376bacb71518a6b71b0b9f181c1acaff49d78cb02473044022021d8ff4710fc56bf27329276c417bb3112aae82058c4191603b8efd283446861022037f8e0c096095b22f51bdbc23b500e055c9a083fd227224a2bcf9b815a1e09ba0121035cea9a0fcf1881d392b7ce9dd376bacb71518a6b71b0b9f181c1acaff49d78cb00000000010000000001034f0ebcfe0828e187596754f9373ba5355c2be208da72e666c7d8e8ce892620a74e00000000ffffffff3dc7b2d95d2399dbb74d022a05eb17a96b437f667e595a0c8c1379e8d590e1d32b00000000ffffffff3ac2d963cefc265c2882aa7f1315c9bd331e528a6b00c1cdc00fc11ae5f9c3b71700000000ffffffff02510400000000000016001460426faa653c536502e0a0d35658d0ba259a63b67f03000000000000160014f726a0bd0e72b4a46b2a3c6ff9c5537d72379c110247304402203ba3965a41441063aca61f398e5675286e39c099e864b355f93f13210c27d52102200ce6c05f7ca5eb579cc3aeb4cdd3f1a1eed620322cd6c4d98e0a22e54670b8440121022baf3e2484ccc841ec8ac57f49f3ac36c5f765cd82b86bc5358f7123001a151802483045022100eb4d8a859fecd12394716113634bc5b4a2895b3e6b36f4ce9bc95ef478fa453002202500b8011514208c541cfa778fbdc9a6d20cea2df400fc0d5b700cac852ad7870121022baf3e2484ccc841ec8ac57f49f3ac36c5f765cd82b86bc5358f7123001a151802483045022100fc29f236176eaa9927bc127f4c38e6b61fa29433e2c93504aef606df4d29a83b02205d02cf105b327aee6d56f3e123c27def7ad735b7570acabefbdc37167f8f42950121022baf3e2484ccc841ec8ac57f49f3ac36c5f765cd82b86bc5358f7123001a1518000000000100000000010311566e2e2ad568d608a75828a859e00f714f3f3c743908522a2764100db7cbae1400000000ffffffff84a3d3b355d8eba532895d6698e9cf5e01546a62306deaddbd06685aa005c34f7700000000ffffffffa756803cab17dc0019758f5ff8144e2bcbcd85b5532036748da000be7fa8706e9102000000ffffffff02870400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64903000000000000160014ba2be283aa70fa123f15d95317fbc91f5686f36c02483045022100a82d59551ba6412082c4b86069a54a3548e5700c706706ad8cab8732b983159b0220421d97e65629e205741c80f6c9a932e894048c687809f2e477c75ec6200850100121029d7bf17f908d53d6858a5bb4b4453d7085bc3b2649e2bcdd3a18e0b0e41777ca02483045022100f427fc145f8ad9f39c12ce77ae5e149684f83973f425df42efd8d5605708518202207b9d909641964e588abddb7c6273e10927e07aa6a8fa23d644096e40d138665d0121029d7bf17f908d53d6858a5bb4b4453d7085bc3b2649e2bcdd3a18e0b0e41777ca02483045022100d760970e68082f8be05cb0bf407be8ee784ea2be443f1fdfb7d8d27d50d36c7002202561d43d67b70af26cb96a694f0092290b58fbcc7891fea03a0afdec61c310880121029d7bf17f908d53d6858a5bb4b4453d7085bc3b2649e2bcdd3a18e0b0e41777ca0000000001000000000103b91886b7934bc805e80669359ec2674be73a58717ce71b719dd4d344b4f02d2b0b00000000ffffffffa23081ef17a7c66699418037baae3ca67d75d9282e780d7409bce85af8eb290a6100000000ffffffff2412fe8f23cdf862b0ae4ac79a7314a9d7d5e505a5278941679f8029a984de531400000000ffffffff02860400000000000016001460426faa653c536502e0a0d35658d0ba259a63b64a03000000000000160014f50cdff9d98fd81899c3542002643fe4d91a4e0602483045022100e765f8f6fbe8d8781fcf515fd08c4fb835cd62374616ccfff25405cc9169200a02206ae380d90e8b90658ebb98586f24c1bcbe3a748a14c6985dbc112ea1216f1575012102aff37ba9b212029fd44693616fe3fe5714002a38fbf994db2b716957ed0ebba2024830450221009553499598f1691a37c143fe2565a46a64364c90525ff6ff9da236033587f0500220582f329c8ccc9ebbdf78169afcb2e09cc10d67f1c6894577d22ff6ac1ed0dd55012102aff37ba9b212029fd44693616fe3fe5714002a38fbf994db2b716957ed0ebba202473044022023622a611f8ca6e2d518efe67e7e091d97b7574f885e367c95fa78a081e549e70220037022b556ec9c1163e1b4462dd7d3b9fb7f32684bd9814681b78044ffe8215d012102aff37ba9b212029fd44693616fe3fe5714002a38fbf994db2b716957ed0ebba20000000002000000000101fae3a92b752f6157aa6ed0685f1b61b30c355d268a1e5504ac0d529869a3e3120100000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0340a337f12d35843b244e7ea4386b88a145019a36ece15ff9cd927f230bd2e7afef0594b6fe0042e199e3548cf1a913064e101fbd7628a3d89572b08084dff32d5e7c208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2233227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101fae3a92b752f6157aa6ed0685f1b61b30c355d268a1e5504ac0d529869a3e3120000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40340e6069301f849515c267fc4ff4d4abd35063f9f19841f6cd8f006abb134454029d3af330b586227e721be7042805c84f580d6e048c777a05d65bcf628729e582181208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010350ebaa4094ce8729ab5662b316c3f9f72e42ef15dd4447759f1c834467b9af420000000000ffffffff5a725b713e4736a598f73e1174caae579c6ab0dc503539f73a061d04704cd7ed0000000000ffffffff417c61522a1e2262adbd70ccc31de5c5569182e9c2570f295cc520039084242f0200000000ffffffff03220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab42202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aab44300000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40140652b9412458a63b1b7aae698e7dd15e05f9c369ce003c4fc35cd4d9c34f2084b4016b65cc84f713433bb9650cdc9fbf6b44d2b42109a1c487dbfafc3295daca5024830450221009e30399224016beff5ce33a563da81ef04b5456b55709597d537e9599370a604022050e7421f1c5bf40ea8e131863ed41b9a296a47d4c67dd7878797fb237350ea760121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc302483045022100bc757bc0892bfcbc40097951d3e99f71630821bd9665c693b96774ce24b6d6d602204a442603f8ca6a83090bd884b3c908e8b2db10e455ee3dc3391404409c48e4f70121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000101795239342a8f1f8eb60356fbd00decfd62f07edbc873d17ee6fc51766165ef710200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48763800000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab402483045022100bcd974824a5b6078277a2b652bba31f7f26f9d62d218d7091825b523ff68c62202202688f156f7ac6dd9fee13cbe5edab7c764939defc562fe507bf8ad0a107621f30121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc300000000020000000001019150624129cf093e2a6087afab74753e6d3a1339d04f3f1212424fd1eb4be03e0200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48382d00000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40247304402205013aacaf66afd9160042c389886a4535e6274b703a3cc0e5c8a77a6f60b1ac002200afb0493383551c55599345699239cd909a997940157acc31099809373193c930121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc300000000020000000001011c0270083ae858655d89fe28f75b483458b46a55717860b1e6a16502a21abaf40000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0340d9a4c6836652b151d6019efe44c11832bfb950e3d54f47830b12c859f9e38e930f42ad98c15c772836b00e61ef81e8bcdcd70b799340eeba10813307d092427f81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353039353932227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001020a0293b6ffbcc1d85e545dfdeab7c21e85fbbd2182d207696d4ecfc492d195770000000000ffffffff1c0270083ae858655d89fe28f75b483458b46a55717860b1e6a16502a21abaf40100000000ffffffff0322020000000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf60226650e000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa6d460100000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf602260140b3da381e24c9a3009ddbc5720cea91d1e6cd59cf0f5e8cf864f913639abc544d22fed562675d87bea8f1e42d424111728eb07bf069966370cf5044ee7831d9db0140823f1e848c8607e35d9f8e9d85d5f360b567ef310aa5e58bdd8ca01760f2649f881670876a2fdb4b7a100a8ebdb4e0b4d72e985d4583efce718a3c29211005c300000000020000000001018d6e9f0bd0ed9ee007c72e14eadee41a0ac04513418635388fa72095c5ff3b9d0200000000ffffffff02000300000000000022512002ce301d3382a858e2152897ad757a1d6fbb5fdb97769d9f98ba1cfe06760bb2ba400100000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf602260140bfe882d510a4666af813862660715309dba04aa3249fa66d95a75a95c77bb452777982165a72ee196483549b1660700c4cf95e9e698a41040e8dd1d9e74457cc0000000002000000000101a487c4235b5775f75b9ad23e7ae0645aa5f560c27e0cad0c4b3c049152f1a2780000000000fdffffff0122020000000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf6022603406824427b175b555f77a2fa06add5b0d08572e4cd6d7f239eae9bb24c306e8e5c9e0b8dd12239aa8326f4d999081055eaec4cd4c0ff36a9b6c13cc807521756d781208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353037313433227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102518ad183fe6a19799e8454e1fcbecbb792b0f42fb173eff0be4ef6feea98f66a0000000000ffffffffa487c4235b5775f75b9ad23e7ae0645aa5f560c27e0cad0c4b3c049152f1a2780100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120215bb3c6eb969dc583400b75357e7512f7f86e9c42c736a0faf0d87fec582e85c602000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aaf02c0100000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf602260705000000000000225120215bb3c6eb969dc583400b75357e7512f7f86e9c42c736a0faf0d87fec582e850140c647fa40089209a3f5585e0d49a50c2832b50bf8d7a9aaa47cd8eb45a721ca2f92c103db592f1b5293d64098bf2986a648e1cee681426a1819bd1e44af3db68d01405daa32c688af7a5ba6e21148e92333440ece72d2fb56136d5b1162205e58b91f20f7e9864dca4a5ead02e4291ac5773633137875bc3e6d9e4af1641dbaa1421a00000000020000000001012d25ff23881d61d3a192c6a3b0b04b149a26626c9936b50b7331f73c01b7cc000100000000fdffffff0122020000000000002251201db69dbce7495ed9a5932eec83d26b9e83b571e121a0f03e152dc51abaf602260340d186a949aab6f2140e359147ba3cc1bfae2f88d72e5db0d54e9827c470966ce9dd270ef9f58c6e666e41aba2fcbd77353b9dbfd94a1ee74b69c2a5b549fb71e484208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003e7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e303030303037312c22747631223a3530373134337d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001014e96e8aeb54249fa250a05db2def31466a4d88b88eb1ca1fe57c92929d292f150000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa034038338217990e19446b3011851a8cb087308cc72965d26a794d480873d5990b656ce6c61f0beb41861729ab60d262c2a58c548fde29ad7892c991cf84a2ec2e0280208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003a7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a223532353539227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102560ec124c02bfb98a34f53d3e17cf7bf0e32879b26eaaf029db5e7696accbea30000000000ffffffff4e96e8aeb54249fa250a05db2def31466a4d88b88eb1ca1fe57c92929d292f150100000000ffffffff0322020000000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc87497c01000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa50530100000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc8749014034d41cf5a4f4cf72b3afaa870e6598e9bf904ea26853c702a09c9c3a5315f56abdb52fcd22af5919bbc6ee0ac72299da44ec455584cd3c2d06e0c69ffc1043430140f345115c612ce1c215cd8aca7085ff66438c4d56cb02d514f6d4d8b8a86aafaa66e34c231cdcb3304420c67d54e34c9ed593d3a72a488d4b7f3342b6483af71c000000000200000000010152968fd1e7c4d78c612f3a61f66e73d5a6c98d25a2222071d78185d0ca76b0840200000000ffffffff02000300000000000022512002ce301d3382a858e2152897ad757a1d6fbb5fdb97769d9f98ba1cfe06760bb29d4d0100000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc874901400682a994fa15e524a140cb2b63aa06a59b6ad2a8b9750e179c74bb55a8fe791177af524f8e10bac3a7d70803b56b520792c2c1e3f4f90d70d2fb078ce7807a010000000002000000000101397d7142bbbc16c80f93cc8ec5610e30b6d2f59b9186649787f42537de2cf7440000000000fdffffff0122020000000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc8749034083d48397f6b16b5db93e59c958c4e981a150eea7457c65ef5e72ede4f31a9c69263813e977ce9414ad878c5df7df0ca061679f1c95be102a2be688da644bbe0181208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22353037313433227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102898f92c2be72c0cad42f5df7a578871046ac9bd14fe63d7cf9b5f8de90f9ad0f0000000000ffffffff397d7142bbbc16c80f93cc8ec5610e30b6d2f59b9186649787f42537de2cf7440100000000ffffffff052202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0705000000000000225120215bb3c6eb969dc583400b75357e7512f7f86e9c42c736a0faf0d87fec582e85c602000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aad3390100000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc87490705000000000000225120215bb3c6eb969dc583400b75357e7512f7f86e9c42c736a0faf0d87fec582e850140ae310c53a1cdc5b60051a0b3231cd50241173a364d52efe0bcf26eb5d6b70b60da7c2392ff7c2d10bd6846efb0aca0946d82ab990aa8a8364a351c644b539c87014048c36489c2a461546c7f1605e54f457508daddc58808049dec02a01c67a86cfd9f5e9ecf0970e04acabf1f95d2c9fb3581dbb1304e8ec6e02cb7bda84f7481d00000000002000000000101504442bf174958cf5ce7287b917df2df8cc409833e9d636facc79a85718837af0100000000fdffffff0122020000000000002251209bb9b327ab7e91f63753d56d4551f775fd8cb4306cdedb93b8032e2745dc8749034070b18c9fce0be9b88489e56d24d83c8698fc649670fafd25a4ef6d6bbea7a383e5866725e48cf8c56bdba4e2ca6291eb1b892b6ae87cd9017918cbf434a482c884208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003e7b2270223a226c70222c227430223a22627463222c227431223a225f736174222c22747630223a302e303030303037312c22747631223a3530373134337d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101d06749449f525040d235f5ffd30a28b4de27b1f9ea6cc669be2290313f04436c0000000000fdffffff0122020000000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a0340bb2f6798a19484230bc0bf3551497680f0d55c3e355d354a62f96b96a67608fb021f183182cfc520aaa78e4eedd147a5eb22767b332cc44378cf06738f5b679581208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22313338363333227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101885a2a202d2a02f401909b1b3986a2b9081d38542619b1e308c18a66833a57830000000000fdffffff012202000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb03406e26a16a2f0ddbbb054a27311c548fa0d214afcba1a1391ccd3bc5c1825fcb8f28a82f6db1ec5ede7e15ad7ae8f09616f41267d653b6cd0b6054bdadb9836d7e82208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003c7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a2231333831343732227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001033bb164f11c1b331af74c059b55440b43030d1609d81ee0f7a7020f795fc7b3d30100000000ffffffff19f30aa426d46f5a7468ae058851efae69b99d86c8c33cfcdd1060a638d229140000000000ffffffff21a3528def162513cd49b944d9789bd3d5b73a2bd2c8aed2b9a3adc481c93b2f0000000000ffffffff043f26000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb6dcfa00600000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa2202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aab324000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb014020033df61fd12562d11babc4dae834fee513b9f2e49d81208cdefdb77d576bcf6b50794f85a2dd9673140b32cae61017d8a0d4a91581040111f137c697694a76024830450221009dc6b8bc2b59986b3ab69ff97f06616d4c0559dbc8c8a628b67dd6235ea710e802205dfcb43f27ad4372cd2593bc175c2e9d566d8e4f5dab34fb825f242ea4e3abfc01210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be6024730440220491d7a999d327a392fefd4f3b20f05a1b45af370a31a8e0badaad871000202d3022004d2da832762fe4f795a9373ab16a9a3cf838e03d0d2016de36fa29d4079a94801210344cc2c2330e9c64110732d0e8fe7b1db9a3b71d2a2b9d7541fd86bc4a9f83be600000000020000000001036e0b8a588b092c292680217177a54da0686bc690ae505f5e114d74080705bdc60100000000ffffffff2b41d2f79964602056b9605dfbef09fba43796f13e4b8212d8ce15cd32160cee0000000000ffffffffd06749449f525040d235f5ffd30a28b4de27b1f9ea6cc669be2290313f04436c0100000000ffffffff04d7030000000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a96cba00600000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa2202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aad3350500000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a01405159d66e68c8ecc2eda0bd37e62287e4b3b486e911af4550c13e741eeb3ada2becce6a8d8f1ba5e9a6fbdacd9aa853d0a946db6ba775169c1987fa1b6c1092ae0140236eea5da8ab65ed37455aa01f8428d03f556ebaa9206b7b9eb5aca740f427ebfa129cd8f9a9dc6cc8205600efda9d9e256d3f494276e13b38cec9c62ab2ac67014014ce587ecc21ea1ffa5db02244a711cbad16463dcb40db8c232012bf30d52b6d1047866996299f282881e9b330db8f7a4cabd7a82a1bd440c37e34606f85732c00000000020000000001016cfa59b7cb20d47b56b6be134286374c28a6e10339f4be5a390e35deec9128090300000000ffffffff0200030000000000002251202f52ad4742b0ad10a2fc7a08c9d5c2b69e5500d7695df29d8f220b9b6c3f0918492b0500000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a0140da56d3accddf6fc86b95c91ad072fa11b24e98e276e87ad91904db0f65ada389a618f9b595cc25a70c328326fdf14f8bb0492deeec385418ad5e41654861e9a90000000002000000000101f5929e0d11f735b3ecf1ba383af0e12700d95fad68bf2988404af77a50ddc1250000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa034057410b56b35de8f6a742f923a9448ca6157fe9fb82c7dba5847284b30802cbefb6a0e31554cff22a4d683d4adf7d151e7043e258be79311ec3ec9ba03c75fb2b7f208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800397b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2235343330227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102f38e1e2a8bc8bc06c66350b20ed630b03033a19f9e3265d2f88085f61a6b98810000000000fffffffff5929e0d11f735b3ecf1ba383af0e12700d95fad68bf2988404af77a50ddc1250100000000ffffffff0322020000000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a1027000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aaa2020500000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a0140136388c11030a499d33f5603df3b5d0114ea3697e622724572dbb341ab31badce54842cae19a47367e167ec938a39184130e4d60ecfca9cae70155dc55ec19b901403d4d1e941f87f16677cc6fbfd935c1c9d1e9bc04b1fd3b1c12926e1ade28af140f5fbf3e309332b09196ef0a71ef2a9b09ca150310522672d025042f11e42abe0000000002000000000101a69fe6c2905444b2d4690ef962075872918c4f70f17d1d60b10981aa99e845530200000000ffffffff020003000000000000225120d1b0129de73a0c8576b4ef4f8f70b542f5f344adeffb06da50c974055d9f340e12f80400000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a01404e3d535455234f75a74f819e5343a0f5b17c9e2cf73145a714c0febea9a05f8ffedc20baa224d2ea043d2d40cb5b2686cfd0009ddfffb67d11964e37de013c02000000000200000000010214bdbb6a2dfb9e0b1f73139bfdbdee06fa504a50423d4d23d416f5e1ea9749ae0000000000ffffffff14bdbb6a2dfb9e0b1f73139bfdbdee06fa504a50423d4d23d416f5e1ea9749ae0100000000ffffffff02e803000000000000160014850b19f05ab79daf9f1600715afc85ac91dbb023610e000000000000160014135d36b6d5431ce5586b7d62bb249203aa1b33fa0247304402200da5bd24e06c4ee907ba7ac2d3696a89e6ccab8a711b34d74b92f8818dae1cd8022039c21da404733ed6aafde455d9c96533a01a42614330167887a16879c9e3c44301210340c95b50b01d9b022f9ea6867d9e20bc55bcaa31e92a2d6dafdddc05bb1a1c3e02473044022012a65fa0672a5152d9a70ba1b7b785fca499086db2a9650c414fa0c40d38b8d102204ee1f90879c0cb4e987829d8b665a5fba8126d3bfce2315aa894250085f00f840121021dea0b8261fff7090435782a95e9b1cc516dd2b47d6f1a37884d2dc5222bd82c0000000002000000000102819390ab15c324e0000aea9bb8e98d8794833b4efe736b7ff8db513c4374623d0000000000ffffffff819390ab15c324e0000aea9bb8e98d8794833b4efe736b7ff8db513c4374623d0100000000ffffffff02e803000000000000160014850b19f05ab79daf9f1600715afc85ac91dbb023b1ae0000000000001600148dd48d0f67b3c145d630f24ecc9d28213bf820f502473044022030f829cd7ba5516eac542ddf0c38ee01eb5d561d3d574f6adf49ea25d3214ad8022079d8ee4812849dbba107bab8dccc639c4c84bddfffb1c657b87caee8c5932b2b01210340c95b50b01d9b022f9ea6867d9e20bc55bcaa31e92a2d6dafdddc05bb1a1c3e0247304402205678d0b4d2030997f3c5d67dd6981e4a478259d86c84a8861d7e1d40194fc7e9022023916755c8eb89f637177257b7f9ef9e6884aa9edbb44783f14d5a73531cad61012103a94da4afbbdf39e869a5613260b5fac7a86f54ddaeb5e5a4e41aff1372e0e6320000000002000000000101ef3d0de46e2ff52b9b34d92c440ee99bc6f5678e4deb715802e69cfa3afa4e1c0100000000ffffffff021027000000000000160014dd88ed8cbcaf415e395ad04388f1d5d325f6f40cf3ba3e00000000001600141f8de200a822f289cd33d1025858a8359704f8ab02483045022100da9829f1c4e2a346a8754fecc24bd4c32cf34f6f71997d838e880cc3f08e00fc0220491afe573d180eb4b62f707491c070b12a382092f8735d0e0f983649f70bc7d4012103cd16b7408fb30cbce026b7dab56c6991c9fa42a477e72cae43da3d3f53474bfd00000000020000000001019150624129cf093e2a6087afab74753e6d3a1339d04f3f1212424fd1eb4be03e0000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab4034012787f1a269df82effdf33bd1807ba0084c58377646f169d6767e403cc5c72b328fa5207fd58c9d7b789d928fa1901941686c2fcdb571ce1fef938dc5d3ce2e181208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001019150624129cf093e2a6087afab74753e6d3a1339d04f3f1212424fd1eb4be03e0100000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0340d26f23bfac58426cdd7a068a777ba571f29115b8aa34df1652229e45d51cda4aaf67c194a3500e6b1695267f788e69bc420659d3f36983a729012e668cda41437c208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2233227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000103fb71fa9a1535915e8413436c1c37ba65b013742dcb07e3123fd05b87500db0de0000000000ffffffff7f869a8cb8addec282e2ee2465adf7f675af68c174f2f56a8650a61619f682890000000000ffffffff5f1c93860908790348099647f2e48ce703d6cd58b88a6fc22554835be9d4a6e70200000000ffffffff03220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab42202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aadf4000000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab401402a210a4ff1129f588bce4f1f9801ac108de1a494c0446d137bdbc8c8675eb6dcc7e44f5c4e7664783c5bb2b759d81022d0afb942205e26414d0349defaf09b7f0247304402200abe5627e0068cc0974dc6724e3e82b6fa801bc26abe11d61b5fe5e8f7afc95a02203c43a4c4d17f2889e9a7c61be82b558c9999ace0d5d911ec6bfe645eaa94ff0e0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30247304402207d8a0b635c76f8997c9d7c1aba6f0fcaaf7c762eb1fee643500201e87029e74d02205b3c13d39d8eaf117cd730f413037786856c9d8b12410ff0126400fa7fda86110121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc300000000020000000001014f03f91175e4bf1d04ab955a859277fc028bd0a1c60f815b798551777f44f5550200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48a13500000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab402473044022056ce78c32015dc2afd97fc2a16c3c616d5d29534c41558168f0638dca78acbf702200de6e1613799d4de98f5fa07d6dd22fdd25d9b5ffb38455c39519fda2b2ee7c60121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000101793bd3a5518945cbe5835de1599280a342f9eb7ae3ed94cbccfd1b8130d0c8620000000000ffffffff020c89010000000000160014479b8f5a4b5070cc6a3c61812a15581b33b40d7e77a15f050000000016001456e58a86f38b4f27443fe88b7b5766242741b1ad02473044022035e0f5ca5f86144bc6f47789f2f6c8a7a6e601830123f66c89eefaba93c83996022014225b3fc5138887005207511f85701133c7a4f5fb5632536143dfd16c17b260012102120b363e7502f980a8201de94f0c875a9f64c76a16a050ebbc39190caa797a3c00000000020000000001010311a02242f8cc0ba6ee12152d88c671f0006d68d06b62103c11a27b32d39afb0100000000ffffffff02c8590f030000000016001448bc4af42a38a53b168c1bfa4316ae9fe8f1833b18890100000000001600145bf0b04024b75a9680fe04442fc21e6dd8aa9c31024730440220695ab565a87c5964f02aeb2fdc4938a93bda58c6b648765e4bffc778ef3cb31b02202c4ffe3ac8442dab984e8572e17e513222b124b02d10fac164d4cfa0a973562d012103ffe671b087b1c1916d5e30df7ac255759aee2242b35e728386f7d3205b4e25ba0000000002000000000101a5c3e19099086417257dd753b6a241cf1ae2b61105e9b82f05b872fc60e4b1e60100000000ffffffff029a730100000000001600145be478e68507edbdcbc7de380ebd842b9b9f95f97e22030300000000160014b37be7cb3375e63c04e12bd107f79730533f37d402473044022013221924c7e62f703ec03be16c1914292ee397d3fa3a34f4173c276e1e705ac002204cd8412eb9f22581a6ca339fabd4fd072f1b883d4daf0343e0798898118aa30e0121022b307f97bcfe837ad4874da835bce6b93628263711e820ec9dbcb523eddf9d61000000000200000000010149509c11e722e09cb1e4db82a9af041edd745fc4e32ee4b46fcaf4cb821b6c170100000000ffffffff029ac5990500000000160014f52abed9035f2af49c034697bceb35b935665da6168901000000000016001450d432e7f89716df50ea564f605a10d72d894ab3024730440220599b2a689009b1aa7a8b19edaed86e7e949351a56f02f60354400f3f02d630ac022024f3c20d9ed7d5efc6e829336de0081b249dbcff1fb17afe10c207231a65352a0121032bbbeb0f02d577b7caf9eece227b6af0f77892b6b02f9d577fb57a8284eb0656000000000200000000010123dde471acaedd3dc85b6f271f35e074d675c63066c96745d3854465229232680100000000ffffffff02148901000000000016001450d432e7f89716df50ea564f605a10d72d894ab3b4fd6405000000001600144128783a08e8a4fe27fc03565ba23845cbe8fe250247304402205fe58619bdbb2527de487dcf97404e9b7617a81888a628662d813d8befe8b5df02200d5718b0557868a85ed92a8ec24033c7947f39052c97b92fe86817613f5605030121021d9c892d86820164215951b5b45241035b0630286d2bf73d5a458a192c57407a0000000002000000000101f67f2f3f7054d448ffcf182ae837612c502eb2d6e64f16ad57e872d09ed5c36a0100000000ffffffff020e6601000000000016001401b5e94fc1217cd027f0db138b05de6ee410573dafa7f10200000000160014c65d82b07a68230854b9c676b8ee7399904c6557024730440220128dd3ed822e6a60146fe9b8bedda8017e08db12e20573a4e53a0282e6cc4f7f02200b2444ffc4c5847bd71fb87158645a22809ef9f1edc3ea0b1c84d156b965f3990121030966ce124d56d294d8a54ba44cc5f2f33b765a36525cead9455a1397bd558463000000000200000000010117b5ddff0390eb48d0e1a8fdaec98fdf434a424e1ffde25b496ebe1be6e7b9f00000000000ffffffff020e8901000000000016001422caf3e7dea165d8d4fa430b31f66cfa7efa69409146f504000000001600147beb69cf3757a0395ba16d966ddc4618973ed0df0247304402207e8a6fd1c92f052e8bc90ae1a92c5a2b0bcba4a50df62660aa11ce1a37188c69022059ef1971c7304644ffb88be323a905e3134e82e620cafb83e619a4f810c468a4012103b88c0429ca4a97f032385ceca707479b2d89e25bde735d7c00a93abdadc86f9f0000000002000000000101fcf499312f722204a57c3d0a7723baa2742f1e12a99aa21e5c05f8d500d2507d0100000000ffffffff02e070e60200000000160014d7ba8d299587c44b053c0e11542f265b059676ae1089010000000000160014222de25041e5a9c1f0caf36433dd62b0813f72ea0247304402204d87332d056b82413c3ca2cb0df9e3dc3a5f0ba68fb378ca3014e7ddbb5072470220284a9bee4a8bbbe8504e132b38fe496d57332c844a1f8708ed8fbced476d541101210282efbf730ff91b7d472c0ef829cb0bfec5076eb31cffd341ccce589f1622dc4e00000000020000000001018b6e565ba0099f3894f38e9c2a27cc3921b2e5e300c1e083ec4e8fb4e97df5920000000000ffffffff020a89010000000000160014479b8f5a4b5070cc6a3c61812a15581b33b40d7e9060c40200000000160014e7e230ec49fe79ca13d24e850ebcd279e21d8cee02473044022066100bc0c4cd37925143cd08b0f2c0649476546fb0f7c0366d867dd49798891802205bdf7e73e3dc0ff8221f816df163b43b2e7ca1a1efc2ca55e9a22371e14a7cda012102ac3794cbef5db6711476e3d0a824d9b1cf56a90c1b7b8bc8b3ef5871172e0a850000000002000000000101086691cf17daed39923bc03e152bf33f7b4740d2e42b678fc4039fccb1337d530000000000ffffffff02ac3702030000000016001483a876a9658e2ec1c42607cd1a06d6eae03122e51a8901000000000016001464b6ada87eb0aea590505db344ede2c7eb0896fd02473044022003d31a54e957e15d5973d74e30a27f4538a5fcd687d1d83d1a347df0329203ea02207c945d320b077c2cd6816a8d1f0010634e613c3a321799c9df0b681a957ea5ab012103ffd50058c0507e126889654a53114f07716e8e853049242cf839eb3e7734ae960000000002000000000103f54bd191520b1de01985844ad837979f62546458326c1f05cbd9f944a1a8c5b60400000000ffffffff87d2250dee127de08bbb30fbab844f0140997370594afedbd52a76d17c5ce2f00100000000ffffffff830609d5779c19d06164a6dd76fbf8ac57441d4f598e636e2c774a398179dfdf0400000000ffffffff01c40900000000000017a914ba971f513fdf0dcbad7ffb3273bb69f816f411b7870140b699772fac7de9adf1e3ebe2f70b01dfc948f19288388df85ee86917d2b961c9a396a27a1aa08d77be1ed46721c7a49f6e4af6671a9dadd59a6ccabb6b9bf63a0140fa329c8806fcc9c60d28818122db424048a0135f123273b16bad76db0897c65137123aaa788ce659daa07d3f6848873749d8e4abceb1866bc945af27bd81738d0140373a6ef54d22f468df9b74b4938bb54c68400f022d8d2be12dbb1a185fa2a52fb8c99d4eb7a09c181f20e7829eed01d199ea5fe81539560853d0dbd36a07edd500000000020000000001025471fc5a174f1c30b9cf04f73ac60a83743cfcdf28ea37806244e67f6eb6e21f0000000000fdffffff3e215bf7e4ac1cf3f401b43df9fd00b9be1126b33d35daea31e19cbdbbe8e92c02000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68eba00b00000000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b6870140373409af05021a945e5c2a32618f45f623cd903f39176747150a267b045cae1c49c57025bb2324bfb602f798435ab47192d68f24f066371933d7f29edaabad5c02473044022019ad94520b11d651f4ee1d2be8b676946d86fc2d5e8530c1529856c511885ba40220638f4f33b589636b6b57373c34851057d9d301dc418814829f30f905d263b9f40121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e00000000020000000001023570a196e6072ea8d1e0c968d2bf314447af5207e806cbe65b2e422b663e808e0000000000fdffffff3232191ec7d371a33f309636d40b40e6fa852e139aabdddade5eb5d21e34c7fe0000000000fdffffff03204e0000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b0000000000000000266a2400000a58000000000000000000000000baa7d429cf7a3cce3f89499fed2739eddcea98dda90e00000000000022512073ba8fcac5ba6972a2ea543dc869e398895ca31b966f24c49de9aa6c4ac9f7af01400f9aba638abf9e630c29964ec1cd6a8a3f50f1182db001752d8455acd54cda3b2fdfd4b625a5e9a4689a73427d869fca85e64ce8418f5efc1eaff3fd8898660c014055dcb6033c8e7f433f3dff8e9d64fad31eace8fa282891f237c395303023bfe00a12ed7d9b6289e773bd39465bd6d4feb30005e263fee699381664ed1def6a960000000002000000000102378fe4b3cd8e88c11d8036f0af281945706a044726874cefd5a4b4010b725b9f0000000000fdffffff4250a2c31cd18a64ccc726712d787897e83a821b8a9dfbedfdd3c29938ef1bf90200000000fdffffff02983a0000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b0000000000000000266a2400000a58000000000000000000000000baa7d429cf7a3cce3f89499fed2739eddcea98dd01408942830246b87605c90db5d6718f016f99b4b2df25f9c4e6452229da4df9f6065b08e08e00ded112e0d349fdd1f8474639817aae11d199ac1506f05601677a2f01409010591ec1647b583b45211eb539bae5f4d35463531d033344442e696290f03c9c72dee4c07de34cfdc37796ca3bd83597f839f9e0694f48b383a64fe263283a000000000200000000010277bc04eb60889874508d38d61b930776104990f71450dfa4d986227dffb0f80f0000000000fdffffff32e5138072486e60a0834dbce63f16ee4d2a5e8d3a8bd999e006b3cc52457aed01000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68eb11bce80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b6870140c14230af1658db9410860ebad15cb772dfbb1f0103c453ae73ae707ce850b678a6bb34d0f505c98164ee3c2b1b30a7f96ee169d2c2e2f7018d941f9efc6d476902483045022100a91276db7dc3c912e16642dda3a010ee748d5bd4ca431d95a3627363ecdccdc3022036795220f8f6359011283e626bf457d94e1bfab05a84648a5d34d15239b54bcc0121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e0000000002000000000102c30cdec137b95ca1d3139b51b851787eac74ff3247d4268b3d6f449199db17530000000000fdffffffadbcac86890e4e0fbb8d1facb912f22e86f799bc2b4befb0b57b67a63d93414501000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68ebf9b9e80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68701408a3d234fc966f76050d545aec9d1caf3d8a9e716db7e8df8b7be58a0795940fa26161622d838568abec020a854bafd3eb6928d6b59f2b7247e27921aaf19566e02483045022100982759e6efb8f513ccf1cda2a27b136feba09fa2c15492993bb88fdd6e3256940220025d32e63201571ced0eda9f4bcd2cbdbde22b0c40c9a06bd32b8b4bfdd62b3d0121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e00000000020000000001028f3390fd32898299cab3ea913f3b98cf6cdc852618d976fdb0d239197f0f577e0000000000fdffffff2bd9e98f078d6a4dc93dad8ae92b2bd22d1005370dc2e96573e8cd7588d0cb3101000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68ebe1b7e80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b6870140bfe16235142ce5ee96f96104ac157ef00cf775d226cafbe54138de23e475dba6c6d3bd301ad1c744068deca74c9aa0c00ac744e380292d1f72a2980646aa22260247304402200e64a1c2dd855bd48bcd5c5f8166a165616f5f84a7391590a0f02a446420056f0220086a13e2fa09f6b8a26dd28e775f4fa309810812f712c1ba06d30549e9aff1e90121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e00000000020000000001027ddeec0915d8b64f1e011e16cd6b2bf09f31e881ee487d1175ebe2dbdcf76d8b0000000000fdffffff1270aefbd32328b7ebd03ff20738d5b889e7df2c940bea4f329623a49be9598601000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68ebc9b5e80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68701409bc7845fb15664160355aab290bf99e01f42a9940931e786ecd376ace95b522e7bb7fbc2e7127abf5f9234e43c109f82eb76833782cb6418fd4a9f92bf30ade40247304402207e3b4f72086637535f33d1dacfd610178196ed7e0efad438ea76e6b38ee9b1a10220680b9a19ad63268f105866dd1cae0381b208dcaf4ee9f38adbca9475012ce4490121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e0000000002000000000102d207d708b589c034901d495f0eb9ecb3bd0b73b6eff14a866e73b109afee37ab0000000000fdffffff72c788828e142d111c02cce44944bdad707a42306486c6fd42816c60fed6563001000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68ebb1b3e80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68701401f17576e48da353d3a5e3324311215bcf6222ee71e8b8d68dfe73007355afbe0564c4b251044c095469bed0bc5c0154213f81cceb1115b6e65cf3314e8ca926902483045022100ecf2512f8bdd509b6c3e019d4209687c41726921e6ed33aa26f2a4ef2cb73a72022059d797af830b78ccab7211a1604fd8e439ba0ee0c732be74651f5b867b89a1540121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e0000000002000000000102d8e77d3b8d08358c30b334bf12d17c1961b4e860768709c182445778f49781b60000000000fdffffff4141adec05c9208cf54b4c8adb17b2b7a72b9952f65243ed4dc5c54d90aa3dcc01000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68eb9bb1e80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68701402171b4108bf4a8fd9bd8dee728335fa61316dbffbb5278963480a50729dd6426d98a4e2451dfb46d75788c9b3f33c5037e2d308c5037459c86ab97a0144ab78a02483045022100abb059b822368656c87590ad047c9cfc096ef63df70da77e2013297de3dbe8ed02206ee2f4be468ab24dbcc37f0dd0db625eeecf2da7d124171924450923e8ecae790121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e000000000200000000010238e765aeae53f63dde7b80491b58a4771754a95b0a48336e2be010d5529657e40000000000fdffffff5e59735d1c59fb2d66eb2b94d6b792a15e27ba03b2602d5aeacaf53c1e207a6601000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68eb83afe80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b6870140e2c97c6855b5c57e88c81ae02938a0abe49b127f79028b738479bdc741e38f504bc67d8f0aeccc49569ca39752ac2d2473da5d308fa81ee8d84d605e9570865f02483045022100f4252279a099b880db8fe855993baff75b52473c578c93ad35207284c95dac7c02204df45988ec5018efaeea67b503205ab4da26f61c7d3872366c47aef0d282df780121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e0000000002000000000102a5be15ee72c1a7ab3ce0c6429cfd37d08c0a55a407ddfa67c9615989397856f00000000000fdffffff54674cefa6bbccc68ddd4177b8347f9e9a64d1dbddae85f5e77f08cc920467c501000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68eb6bade80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68701401b91f4f416ec2f1adabf6373c0b43c9f3716c3f62c0d84bdafd7178901258f3e2c2647d2d02fb99faf13ebb938b16d2acb46c808152db9e8c265af580a13f5a102483045022100e739f76f8a1cfca3ef5b865aa0845c12db8400afcd33315f7c84512379a176be022079dcf3c4a90a424d26929a02b39c0e004d1339f5fbfdfea45593b546174eb88d0121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e000000000200000000010200d5311efb4e442821c898a36652eebc4cbc1960bf648c4f3a86804ce63c81ff0000000000fdffffff1ff3ab85a7e20e8dca21c0bec24101c785022aee880df03f92b8dc7502ebed7701000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff022202000000000000225120463791273eb8fae709a3c5d7156f79f6fe92c38519d8d1f25eed72da241e68eb53abe80b0000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68701408a7b0524eed7bdc43f77f70a647928c8442fea6b48c777161c02afbb1578ad7f08e7455f578069c9129d3ed17eed8cb6b6c595473e9eefcfb48654f60edf925002483045022100e766fc31f153f95ad5ca184535959437ccdd0413db745a2508c6ea07c431d688022025b17f83e187d7ca4bafc21dc981a415f15f4d3a078b00ea93d536dde63f746b0121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e00000000020000000001010bfabdfd333e2c4f46917cc9701cda328c5d0f320024bacc78b656e0763ef81b0100000000fdffffff0204290000000000001600147e4067694c7941b3a2ce0bb9a3681058d5a9d751c832000000000000160014860fbc91c1923f0c32f512c928771b40924cfe2e024730440220607e43eb6675c15687055130c5f0c96a6765a1ecde496a947a65ccd31ffdb51c022073e284f7f33a13cd3fc8412f104cfb7395af6b989663b0529262bfdb4aeefafb0121021be85e17131621765a9a26780adcf1c21f08bfe5762eb8bee78339c177168686e36827000200000001ef25f6a85b32b590277d966f3c6ba0d0494182552e9dea1fc0630e86230b768d010000006b483045022100e6391ab6ccdbd30edf31026d91dd9bce7d51588e5327c653b2315db439d69aaa02200b70f7108930b93dd22662d111196745c0b2168b204e9eefbb7b470eec0048f801210308c395207abca09b6cb7d8526599b655964f4a754148cbd7456c395567481a27ffffffff0210270000000000001976a914c16b419643f116f9c06b3054e242b77ada697e2488ac000a0000000000001976a914634c7eb3e53034013b99ca7062bdfa1b3199bd9588ac00000000010000000127d10553c116999b913033e3ce7a19710038beeb35bebaa1af786d1e0759c6ac000000006a473044022068a9bb494b735ed395ea6785bf6845568d3aa2dd86e89ccdf82c5955888c646102205491935c2fc1c20c89ef07b802f2680a1e05c9c94fa5a360cf55184d3ae86d070121029e812f497b20cb98f0205bd3dda6ea2d5aa9aa050fea22a2704e63af0f55bcbd010000000190250000000000001976a9147195b99a447cd55e59b983e261b1e16cff53ba3588ac0000000002000000000101c3176f2a9584489419d8c620d8dfd45a619c88449f169b37b3985cf0d441cd3c01000000171600149b3a082fc53a5bf465f83c84f6c43cec1d444a69fdffffff0280d1f0080000000017a91451a2eb80166617372ad579ae5c094f1a24f637ad8787d8f7020000000017a914ba7bf9120f30d7a03ba598e72c996921478f53b68702483045022100d6a53da316075137627fa53ecd385e6c265dfb6886313fcde7bd8bc25c93bc9d02200c2262968d98ca100f8913f3c76fc18b5545921132f3eecaf6ac15c138d92cc40121035a99c71780945305f3a20356d55bcc7e8b681c3ef84c537cee5ee7e7da23163e0000000002000000000101f3d1d75833ae2a98f518d3fe823bf4fb196c9de139c810d648f3891e4c1c88570100000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa03400f98dccbdf1ebe281b507471e72d993c186be760882d0586e4adb07bc80f22a0f45d78fa97fcb44058a407f27612770ff916f5422dcaa3e1e93bca9ca1b325267c208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2233227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101f3d1d75833ae2a98f518d3fe823bf4fb196c9de139c810d648f3891e4c1c88570000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40340a9a5d8fe54211beee2cdb89d30bf046bc68d1be14be061507ebfb571cf0b8581a40f78f922f49f33a24f750b99284a5cc86ee91588069df1b14a701cd92b7e4481208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101a999ed0904e0722897fb67a2fbef123337eac79f0851dcf2b20166ea982ed4d60100000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0340424403ea21ade12417ea796a7e7a8d19b610251f0174337de1b26fd985efdf030c7d33ff33872d02dba1aef30331b8f08829bb4ec54bf24cf3e0760f27f84f107c208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2233227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101a999ed0904e0722897fb67a2fbef123337eac79f0851dcf2b20166ea982ed4d60000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab403402dfe22be523d9fcd4a5b0f2738a52effd54b67b4e11b6fe3fd137e4bc917a314f82d6931eac45b412b82201128284c3107db98a6ddd3b85c362f78effc87d7eb81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101364cc8f9923d2c250c6e99ac802c5a9ee68e65644046d1b0ad66f702d90ef36d0000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab4034052f9de5963ffd3971695b28cc0d167a47846803934dfb267fd9a7d7b27ccfec479f0e26819e10e0cf9e94d1dbf95a925a28b06b7be9bafdd39c39d134721ff6c81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101364cc8f9923d2c250c6e99ac802c5a9ee68e65644046d1b0ad66f702d90ef36d0100000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa034011a7555af62d4b86f885eb1d0e340ced8f4eb46bef4a1be011f455d5bde18a0afbc7bfa412598e275492577ccd18936c83f4d1db3fb93630c03c63663109fb507c208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2233227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000103ee0f81726e6e5b020dd3f28b4ee1e86db986f7b8637d6b397f2fc4bb76cd4f4e0000000000ffffffff95ad0de43d31dfd0963763f6851a368919d2aee75f927b1e286aedc8ab327bd30000000000fffffffffae3a92b752f6157aa6ed0685f1b61b30c355d268a1e5504ac0d529869a3e3120200000000ffffffff03220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab42202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa313900000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab401403dff6c665b932790b9b2f388e3178abbc155f133063ed8e8fee6c343303ec12c388f781d64d5522242851f926f44797b6e44daba8e2f9d8a470419fb8ed36e42024730440220304159f2bdb8b95a96a40a9e6543e8d5be76d9c90bd09d0934d010304aca3da40220235c0f7e255e300842f7418170fba085cd0ed9649d32d73404738bd71dcecfe90121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30247304402206398a9d7d65326df3f62471c1a960f4bb3a02196ca9d99531beab48b673c5c73022008955158f31fefcafe03f80a5174c593464fb4bf198354fe797e2f3032a4e7f90121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000103748dd0a47dab6fc80ea171b4d336e9ae599485ae6d03c1571429ad8e670673030000000000ffffffff99084259124fdcba82fa5e3c1b03c82cf061126c8ef0c424ff67fb63b869a8e20000000000ffffffff919719f106ccf8d91a4dd26262b8555b016c811ecf2d11cd95dc07f316507c9b0200000000ffffffff03220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab42202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa9b3700000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40140b875f171380ea611594b2a72a24ea6da436a0634eee5c31e7bfa2d2a33e7a1d6ad6453017a9e97f023c498d8ff2cf780f2c694fd77d90ab81fa7fcc5c5925a8202483045022100c2878605d7f964880ec572fc4aba2843f310024ad6a787ef82bb87bb8a896bd8022043bc81ae6ad23f05918eeae658f2d125e2e20816ec9711f500e204ffe69f425b0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30247304402206dc30acad6970c426c8036e55df9132e998f716998aa93b0ef79419e37096a8002207172a22cd3bff20267c9ff33f52eeb2a46b76ee240c75e86e3055410f9fd78170121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc3000000000200000000010362616c722416c01611502539bae2359f4392b331c889954def5ab84c94087f1d0000000000ffffffffb6a364803477b79c2ec53e79c3a1a74aa5827afb4cafa7a80ddfea1415cb77900000000000ffffffffccfb11d830b6f9b03f8aa07f501c47a2967a103c6fcf2427b0037d940cc905ab0200000000ffffffff03220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab42202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa053600000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab4014075dfd9b085e9f83ff902630af1cc720732d3679c22fa8a08fd6ea63b684a7435a74db06c1795c693a18e00a938efe396afcf79f6f2b5e00cf37eecd58d8e2014024730440220158c9f9bffc03482482237080604215ef6283559c5ecc6e71ee5b132b9785e54022000b66f813c0c49b9ddce5bd147a555a876e471c8b9a7a9b6b518561ece604bbf0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc3024730440220422c4ca9b9e60fef7eca18e806a3c37892cd66f6f0eedf26a78d76f7fd53c89502205755deecc34a1090585e1608bf92f4ee4bcd81e49d16316c980f028d569a1a3d0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc300000000020000000001013c93ffd5de95068188cec61f77563b324bad702b85f1d9c9e2f95156980732f60200000000ffffffff03000300000000000022512045b87c7c65c527f4b23c31297fc8653ee556a248b4a5e63d044c06516a403f06000300000000000022512083e79a3aa2e05e74c4af980b569e12d5a18a58445a9d6bac5ca310811c37dc48c72a00000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab402483045022100a00c6bf9969e1611f27b6796b76110d80bb8e0df94ddbfd4695914cc157867cb022031a367325fd3d6d9e567a1e2fba617f77eba22ac02480592496b2853d2145ca40121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000102e9a1f1afbc67dd8946dcc0b861133dcc12f7cfc56ee59051f56ccbf92dcca206010000001716001439aa07167e27c49eb0d0e5685ae08b9398631e59fdffffffd7dc4023c0ff316f0100ea48fd4d9c6139e8fc3865e6146c285f3defac2e2058010000001716001439aa07167e27c49eb0d0e5685ae08b9398631e59fdffffff01340800000000000017a9140ddaeb894ffc5a650a35956d6f1cfa3f30bb7382870247304402205afb4083889fd161a8bb2a2075532a67243e7ee4c6e980c6e167c14b33ecc00302206706db7aefab37a6d242727ac33110e6c2cc81715e6a09bbd4e159582debec4b012102da5b3d218e980e14460cdcb5b4351b0d885cd02c24d0f2b0f51d74304d9a8aeb02483045022100ef4310b803952dc5c7f8bba8f79029d990cf006a7af5e647c5a42a6f8d6ee3fc02204213d57536b2ab34f0e033fb6b43ba91c3d53656df308215091bb7894c91d14d012102da5b3d218e980e14460cdcb5b4351b0d885cd02c24d0f2b0f51d74304d9a8aeb000000000200000000010124488ff05ce8bdbd35bccf39e5fe28f57a1b7e5c09c543787e8e358465387b360200000000ffffffff02d0070000000000001600141a8b9ff30fbb879411c1ed588b1aac141a5bb09966e61000000000001600142ae923216be2fa1b83669e04f5794f79a71fdec902473044022013ecaa2a0b82954562f58ee95283282353ab9caa7e6598abd00de7c5aeb41441022028dcd0ca9d800c6812e2f38c64b7644d2c89c131af8eb2e6e5c848beb30ae0e30121035899a5a1c1b948442aa4ea31b509aab788ba3b578132d1c1dcc12aafb2eff6880000000002000000000101f898b0f5d6a8879ffa5beba09468a3e47a917a5d93a1741f79ee55e63c78adf40300000000ffffffff02d007000000000000160014b1281edc08c61a71058a6ce51958ce617fa34ac0d1381000000000001600142ae923216be2fa1b83669e04f5794f79a71fdec90247304402204558c716dca044526891e06a80c90a6e9d4fe0b8930e87ffb470c4a4a234681b0220260dc96eb8b9c7cb0c0a97b6b0e5f32e1c5292b47e7ffc2ccf062c73feebaa350121035899a5a1c1b948442aa4ea31b509aab788ba3b578132d1c1dcc12aafb2eff688000000000200000000010145518102ec56ff3ecae91898c658efb0218fd489b42c716415c612f6617e87db0500000000ffffffff02d00700000000000017a914130088a3eb590933f095016eb167095ecf9827098740cf1000000000001600142ae923216be2fa1b83669e04f5794f79a71fdec902483045022100e1af8ea959af94a21d8581533138f0694473f41cf5592b686809b3a145fa57a70220075e730c7afbda07d356eb0bacccef441792d5933e4e2e49cfbc308faa29a3a30121035899a5a1c1b948442aa4ea31b509aab788ba3b578132d1c1dcc12aafb2eff6880000000002000000000101196e72bfd1e8320ddc82860b1f8e5e30b31453e195ba3700e332917e32b71a2901000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673323f00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100db44015074269dc5d72ce7fcecb6dfd9569bed0ffd69c36e40a1196f71497e9e02205bb65ef9ab1b03936a1dfa0e6df92d819c8a705735e9bf3f861760979ffb7c708121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101f4748a8205e861d2599965afeb96879f3f2aeb9ff137d192d008fe7843f077c601000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673ae3b00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402205abd3fe2f637b4097516290aead8fae67f4d1de0ca26d9c5a833b109ddc9b9cb022033373d2d3090724f9504cbbbec4559e3dde7b7349990eb255f93f3fa9c3c22dd8121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101c01978f228c1cdd85daf354e6ebf7bf0cb895a851c487790e7667d855c9d17d301000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6732a3800000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402206807f2d0c9bb9f0e973a1b6c0a7ecb6500c233842c660631ade3bea21c0a8b95022019d166dc8926be4f77d34238a2c63afa45e15fd0229690109e6676b63b8b6cc98121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101dabab4c81fbbdb3327c9bdc12159eba02f04f4a055a55016ea4545c02e018ff501000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673a63400000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5b0eaff14024730440220312c22e1cfeecb990c6911712cde5d3e19addc2e9a2cad8ab7bdf0d5221f8a0502207b247c77457b0e19ea050b5a6529ced33e9d2d334b8de996130b7f7626e64c0f8121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d20900000000020000000001014c407e818ee158f7a77753963e7b14028387ff6882029e24b93f1ab963c6b17a01000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673223100000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220611a99987f2bfe9a7d118524897bb75bc2ea1ba762c82ec15479e57c8130f535022006095676679c8343559cc59b1f95ce44979aa9cba245429c6776a0ec5970cac98121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d209000000000200000000010101799b80e83921ccb237dcd7e70f99b62d6e6b1b073cd61a7eccd88107e60aab01000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6739e2d00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100c821d88aa66c0dc98adfd934e17243a977a07fbaa04201f8b137ecd840015be502207162746d1ac9f94cab07e70cd975d6e9537b9e5c07d6b83a965da775b321565f8121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101388be3dbf0cf9e0eb1ba76cbd67de4b479700db2f4a3353bad10f8e06221032001000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6731a2a00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100fd8a7374f486be7ae90c039703d58b0ca5d45113a718db98bdacfc973c0be7210220590cf1fa728fb89ee28754ecf6b358b11c2ba2bc1272ba6c898bf4f59dab852f8121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101824d6d924e713ec0d11753557ce71f5fd00a26ef759bd6e9ffe02db1045c8e6f01000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673962600000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402200f278048e483371a48c76ad5abc9c3747ad8ed7180d3cf7d0321ac01d24fa3cb02202e3e06041566cd2d51bc10e432256c6c6e1454413b81cdff7bedc3b8e9774a598121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d20900000000020000000001012796a7bdaa28ef2a215b12a5fee7dc7f591fb3c6d13e579ddca920263790258001000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673122300000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100cb3a30ded62a4127b20324959e53ae05bfdb9725d4d48ea97942e7806235b87802206d63668f43d14602403d77719124d61fc257db8fef032df7510935fe49ffb6498121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101037aa3b9209a2619acb175baa0084b01d123194d12736ef2f6b7fff28b92b67401000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6738e1f00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5b0eaff1402473044022063402dcd264f4e0c88a6949d5122b2fc91b7a152ad74f2d8b0d7fc095bafefd7022020809e3adb87d89567c9b93170f11501fce83ed00c9bb45103a72cf73c538f178121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d20900000000020000000001017059cdcb0e5b4ed2fad5f306fb52ddda28216517f9f91aaf599832f8e1d58a0901000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6730a1c00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220498d748e2719f71fb3883a38056c0e1b693661a246a517823db5d6869c4b53aa02202327410d520b1e58c39a3cedc6aa804e450dbf78e108ee0151ecff4ce047f3f68121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101425f3632fa896dba9b5e3dc993d2ae4f49d9d7f5cf6b7289b7cf264d3844720701000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673861800000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402205c53eca764210ba44b4e15666ee07abadab739f1404454f605911c980e24bf9f02203b3aaa48ef434bf8192dda6af57963a5908bd591c6e7bb67fd71a526037644c68121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d20900000000020000000001011187c36280e6679db4cbb8b76d8c51193695830a47d00c928b80f5f1c8cdadd501000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673021500000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402206d037aea82ad137cd16e02ac9ed320c4e888e92b802b5c9ffbe448b2af2100cd022077ee1753ef9ecc32f0af7bc03f3be1f6b69e501f4a2bbf4c55c586d9010365118121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d209000000000200000000010178609a42be74456d64e976cff285003d90cc1326f32def6e6135b8b5c238ede101000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6737e1100000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220484fd23b4598aa36df85566a9372382bd25044749f2ff3f93587f5f555b7259a02204afc07b72fcdcce5435f435638fefa3996b5eb3b6d42b646b4a0104a8b0379cb8121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101d4023277009c2f2627501adbd307b6585640263581bf86ed061201cbd482c33601000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673fa0d00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e0248304502210096d3f945f60948d5f46183c8ea5e12e84a622d7f7a502e2dcc772573bcc5453c02203a33b29f02e9a1b54b2f66f70b73c81dfa8450c1f78c8d730d53b3bf65e21f728121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d20900000000020000000001019b7b6dd4f93845551538f6ff78c1ec4e3feed546aaed5d545c8c635ede0c19c501000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673760a00000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100feb86eeb21b15538011f70f2ab68825bb4ca00636a9a8ca584617fd47b3abc4a022019307b78e772ee6de89c7c4054de69c8abd84d01acf4e03d3bf4fdff8dbdc2848121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d209000000000200000000010133527a2de45559a4baceff4559d18f3a99fe33f4bb74e43ecfce8297de200d9f01000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b673f20600000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402207668384c16cc6234701a2f47a86dd852a7db17c469c3689aa98803506b7dbe20022023aeda73e868c688acc1e32e12be64c2a341d0b11552222c8fbbd5169496ddaa8121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d209000000000200000000010176713a8d73e12faf54320bca183875602f5092bbfb42a3986d110e71a880d25b01000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff032202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6736e0300000000000017a914122893907a948d009868e4ac2584d68747ecc38e870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100d4df533c1a4a46f2199acd8e916b127593325f99f167b33e5fb2430f1e0efb7e02207d5af4a59cfc318b8e7851cb659df4e3051bc108534cdc1ce88074cc19e8f0978121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d20900000000020000000001014e4abb0cd9c3e10d48d0a8cbbc89ebd792149138aa818361c1c185c310ca691301000000171600146159f3f8a3509bd53c1634f7cdae35750e9395d3ffffffff022202000000000000225120d49ffb81938e303469fcc2161a82956697fdae2945e7753eff95b01e8305b6730000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022016ab58a3a5d3df82a82c53ed1863ea7b96ad86d94a58d62de5c8b45ace44283502206c67ec5eb9f390c6fea8f956e77e7f4c25403a0ba270dd197b71714dfb3b94498121038e778da427ccf56a5334855a9c5cc09b44802d95f0cd76c1c08e34336d50d2090000000002000000000101072f355605f2e1a15372c33b143ab08856bead61214eb7b434bc893e981a747e0000000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90b79700000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402201b19ddfd2fd8ee6e93d8156fef47b699c88813c57ac28792ad8da61e7a9910bb0220506ddac768d52ffe292d68f5435c5a1e943f8b97091b7c3aa7cb4b3162172ef081210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d300000000020000000001012e7c77898c242323f1126fef8c739c91c9b80489bb3287ac0f5381a5a542aad50100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90339400000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100d3c10bed976342a8b72ebd0e673f999a033d4824485132d4912296ff2a2d3ea902200917e561da2080f71c4ca0512337c0e6e35df3160a5e1c41be1ee0c3574d5e5081210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d300000000020000000001012393f4960e1cc30c1ab8beeecb19c4f325800adb6990e4d69712ad70e06d185e0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90af9000000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402202dc12e6d45a19e81e2fafebf5a4899a81d82cbea9a851069b2e22ad34289593b02200d09828147747b8b4b079899ba2e20e399926a6e32c6750eb551e617d22a0da581210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d300000000020000000001010570b068d577a35a5244c7fc448f52729987ef8b8262bc721145d76c3d1630e50100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b902b8d00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022066284467c767ced3d7b155505ba1a4b9a2891c397d7f0ed65f80e74234f019c602204dd990402b787c515308e13a821b9f4ddee5b5e1c501b25c69d16a1fb83e300c81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101443aeaa0ac5f5281cd9a8d9c1add99e4a37f0a3158f1d29e61f27ba9f72ba9740100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90a78900000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402200d13a4cda25d6ad70123a33dd15cbe3844ca9d3c15ce83d3df008cf7d6d792030220758b8d5e65cb6d376089321528f75185858d71dd86bf8ab906ac9892f28ccd2381210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d3000000000200000000010135b467acfa842069c31c7127e9f374ca1c23d68a0d2054bcdc3ead1fc370b07a0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90238600000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100e555cb67829b7e3a2f9109163d6985a0941582308f05e542f5cfaf4eb9c782030220393a5e548cfdab6012e5cbd92b8aef3448c142d287d1698726630b0d121e953e81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101263ce38c62b10e7daa78db7cc6a4679dc25583918fc3b79de7cad0489852775e0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b909f8200000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e02463043021f57088075dd71c060326ed1ac299c46dbeadaa035907f800ccc4e190f2bc84602200430a99413b45f281b0c3821da5ef86bd791d36049f9a9e7e306f726ff42a0a281210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101a892cd584cb8edc7bc27b42001625e13d324c072991653d86baec655ea664708010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7cac7c00000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402207e2f209904656f6d352b9d970def719b8fd284ddce85889b6cfb71a29cc4cc4a02206acba920f489e433e6bd3b256e9d4092dc81b7697fdf4a98bca50d97ea48f63c8121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b0000000002000000000101daaac9b1699791a88f31c47e27f72176d67932e0782c8f1883e60d79b3b7ba3e010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c287900000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5acbaff0e024830450221009a01ac420f737b0b8f93774920a519f533f51faa5c495cc9dda936017bc23fff02206afb72c40d8ea855c5537f7f25b07da1806b9ab25421276423fe715d491799198121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b0000000002000000000101eab72cf4d688ae289c21d7880995c1034829f6aa7ff6007082cd424d06da6d97010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7ca47500000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402203716c7943d06f6ef45a1eb477d039fe7cd5e427e25e60d23fe6d52f6dd7af73702200a3ab8b971cdabe727420f22b7d5a6fe0c817118988eeda0fd5c9110482c8e938121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b00000000020000000001012f2fbd248a62e95a6dc47543bc0a078ab8ce83526c6c60c2d1ae4fd569fe61d1010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c207200000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100af0e77fbe1acb17025915e5231b0f0ecf1b11555d722df5ac9b7002631baafc7022061a6388d224fa00e9359c349170b1cfbea6bc4813869378e6b977003c925d4438121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b00000000020000000001018ac87031d5a7c5903b1394f1ae9624e04c8fc151c3c3a908127a45f596a9b6f8010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c9c6e00000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220390faf014246fb0c5369c83e296fe883d58e628a0428281ba3b7f05458e6b18e022042a914b862d5fc4ee0881ac00f345f6a9aedb5682e5cb6cc4135c87cb6ed389d8121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b00000000020000000001010502215edf80839620f6cc496efc2f99f570916fb8d925c0d806ff77184b2cd6010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c186b00000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100bc8c0361c7e1dd73c910c52405c92d9d2afa9517c5d9c272265b7bcdf812e2cb02201c91c040d5cc64647c46aa8a47ccbe44127482dc77584e4ce81a4db061b2c6d88121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b000000000200000000010136c55fef7fd065033ec44fbe712df49e2c5a0d368c162468ff3276018058acd60100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90076500000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022041d0453f4c35dde15c88675687956232318fc019f909f16b57ce6c47fa683b550220475a5703c8b90f5ca41f77304f0adfb186b6a678f44c28e5ee8bc1c5c4eaabaa81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101dcc06559a90e53a0997704fa84cf0394b9dd0bdd6d7720f213cf49ed6322b5c3010000001716001402e564dfa1bdf28ceb3129b105b9f20b921da05effffffff032202000000000000225120f673e830c451c493d404248343d394ace5cfb3a5e74d680147c6816924022d45867500000000000017a9145d5c70ceffa4de0f755a62c17be4ac136bc724bd870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402200ba494f7a2bdcfdd5f56a96db22226badcc74ba6f77d23b9181a0e823598e217022063c408c32ad292488f9baf5beca74bca2876e7ca9d7cb348f65e9af25bad8307812103d5614db50640f9ebf52bd13da0580b02935a09e1252c2eec7a67f4626a5bb60600000000020000000001017dfb1b010efc41528b03ee09e6a3d8a36e65a157f2a4ced1682b32a7303f3b6d010000001716001402e564dfa1bdf28ceb3129b105b9f20b921da05effffffff032202000000000000225120f673e830c451c493d404248343d394ace5cfb3a5e74d680147c6816924022d45027200000000000017a9145d5c70ceffa4de0f755a62c17be4ac136bc724bd870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100909b55578968a410f51fea3a8261722fcd55d3a16790c44e9d0f5a01a81d91ef02204c2491de6612e0c20ede956b82eb81a33a70ace45475860021129223e62177c7812103d5614db50640f9ebf52bd13da0580b02935a09e1252c2eec7a67f4626a5bb606000000000200000000010100c5f6c9846bafb6c0dda09a2cfebf58980a0cc5b2130d4078bf1e2f962e1fde010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c946700000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5ada6ff12024830450221008bcea016619b371f3444ee34337fd74109dce75eff7b9778c66740564589444002204efa1a0fa048d055d9424b293ecfca54ced74e68f16bad2ccaa6c1396dd391078121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b0000000002000000000101dd757252e332706e1c9ae3e0230f1fefa59f8930a2a5809a409e7e11236057870100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b901b7f00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022037733e3c3be06062f7fa3df73d07c537e1c94c3ee5fdda5637c769a294b382440220436729cb0e00eb09a20301699cf2fd0849cb4739c849b1334e2e256ed90c53b781210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101bed866d9b79c1ff7096248989320101ee1d43e39dffcfc906086ec3a317652e90100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90977b00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff1402473044022042371729dcb5283e31ff5f540a6627e1268926bb6091a6c174ea08930449778002202163ebb9fc9e551b3b89dee36c0a308a1692462a58a29384d0e77fc2a47a381481210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d3000000000200000000010160f46c7018a2c48bf2dc74aeaa8ccb9567c8950a084a1fa935d761848272834f0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90137800000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100d38a4e68c0b17cda685b53a2ad6ba344b95a2b498ac451655e7e8bb0b99cbe9102206f68c00aec99b7238c939be2e94fd522e36105ce6c77d81a02c47cbcf4ecf81b81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101e0e830bc586c253cd66a6f6b7125e1fa4a5397282e2b2b174901988314130e940100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b908f7400000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022056aa681472e6419a1aaa793a98dd57195bdec04b45deb6fe5aac887a1f62135c022066a789d7ab29ef5c4d367abbc69c67c775462ce539afe249ebc15713c88bd29781210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101612296bd61f4ea7a9fa20419ae7b4ac8ca1c86e129a2d6135c573fe73fcc68e00100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b900b7100000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402202f4ddd311b251f9ed955a738f64aedc2ee4a6dd4cfb9f8a886bb8160286c3a7102207b5bae731a3adb397733e9a7ff14ce3f803a8d7cbbfdae597d0c3097de911f8d81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d300000000020000000001017558a27b5e2b7c044a31ed7e5cab0c96a1f1c862720b2d6c99e71a37eda3baff0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90876d00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e0248304502210083bd7a0945e892976d2f4fbad04aa8caa3ac0473d8b0e0dee32bf0f368c6a2eb02203a708411622e14edea5c115c318f5a1542fb9b3daf6c052f06c816c8d60964dd81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d3000000000200000000010151caf40186c75fb79074761bd3941de5730c506ffef1cf3d9e49e628d7d628130100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90036a00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402202dee5af7b87245bdfd639f3bffcdc3220125e8a3b9079196aa830e98309032e602206dc343d97b1e3353b2641bd1c0bdc314a6a89dc45bcae260d0a57b836db7f03f81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101dac0c91b6839a9588a1d17157ab112d215254753d301ff9d8e188c81c4ea71700100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b907f6600000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff1402473044022042fb50f3e8c3a8e041e4bd4554a074c2e948857eb443e4beb3193cda1dc82f0102204993286a27d02da95eddb0281e15eb85f6ee05eb607fa3a7f9d02eaf3c0caf6181210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101857c46c5fe47b8aa718f84d33cbffb7a3d62557b888668174581ca1cba6e045d0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90fb6200000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022079f97b78becbe8070b74d208167db9808abb65bc5efebb724d07e6b4df9518a902201fb5f68da64e0f3d32fe42d07d60790bd23146d79ca427f2f9394ef6fb0781bf81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101774b03d519b34cbb77e768e0fa7cea926ae63e3916b4103f4593c71400a0693b0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90775f00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100b7f1c3210535fad39570503d152401e541444b3df828a887740d768618ff4cef022062e9cd2f26bc7843bd28df75819718c24e71bfa0e6c4df398f6827bea369cdea81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d3000000000200000000010100b00a97a92ed805dc4611c7eb6394466555f947fa5ff90b154d26faacbd23a101000000171600149494b32a85b646920b8dd05c461df38a193f302dffffffff032202000000000000225120701f4bf75311918f006b4d6c88780f8c9b6d9d797fa9a7f59756fccc44dca77ed5d600000000000017a914448bc3461f399a1353523f382704ed283e81688e870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100fb63c0c519f2dc64658241fda25ce1c44d1ceeb11e7d01526417af48dd1e17ad0220510184ba7bd32e238acee6da4305a4a4393f9197bfb85637a3ca4842420abc3f812103646d6a3f39a3fb4588ab6cff961e691aecd8d9da0b22acbd251dccc95d93297800000000020000000001018d1046ff23847d1a0abd944f3b7204f8affc31f39cfc4c7c614ddda788dc1cab0000000017160014e24744f53230af56fc7ad183c3849d28f2ec82c9ffffffff032202000000000000225120ef69bc3bdc04d13005f3f9e90a38ace23180ce127f4a474340db590146fdd7f6ae8800000000000017a9149fca4cd4855311f38dcb2d5cddac46c9296697f2870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022000bf930f5eea271342c869a0eb807b2f7b410880db111b8da69159eb740cb0af022074a545b3ffb016372c96b657c178011e9ad68334f1b3541d8ffe0f22e1dca6a7812102cf677a150ea8afd7c111a111c7529361117fec07ebe004d02424bd82c7eecda7000000000200000000010183d205e5425597ce42c36087b655e49cc7771a163f1a512780301d255b666ec301000000171600145777bfc0a8d2015b2846d057f8ced06b1da493c7ffffffff032202000000000000225120787c3502a96c16e8363680ae19a15db0bd4d214bd8734dc5a97ba77e22b920088eca00000000000017a9141ec42cdb43d0e7052e3bb7084bed28784487c5d0870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100da8f9db60abfdb6081d9a833ceb3cab8e7f57f08243087dd027fa3ecc95aee8a02203eda203a9b8a6a1bcb1afc9ca8a8a177d8b2160e462c1070d25f8f509d6d403381210352c406c461db29f2a8435d19830653d10028fec2e0a9b43cd38a48fefa7243e700000000020000000001019b7c6bab5e95e2a16f2ea8013df5564268c355558a1823630e6880daac6d3a8b01000000171600145777bfc0a8d2015b2846d057f8ced06b1da493c7ffffffff032202000000000000225120787c3502a96c16e8363680ae19a15db0bd4d214bd8734dc5a97ba77e22b920080ac700000000000017a9141ec42cdb43d0e7052e3bb7084bed28784487c5d0870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100b38cdbba9c9c6a6290939919ec1d2b904e0d213ec9824764824aa8c49c9c929d02201f0483d96112a610fb99197117e84cceb35fc9618cefbd893c7be6f7d888c73f81210352c406c461db29f2a8435d19830653d10028fec2e0a9b43cd38a48fefa7243e70000000002000000000101e4b091707ca111ea8a99a3a5c2d74e230508b587626412100252d9335451863600000000171600142c7ed564cec32848ba845a86d7cde35a6cd67750ffffffff032202000000000000225120b63004f4696d79d3f98db7d8abc55b6f7bb29cff808e603c467900bb05717f41d7da00000000000017a914ec259bc4b8857a445ad069118a056791c0cc5b9f870000000000000000136a0952554e455f54455354070e83f5acbaff0e024830450221009075209deac216872235b948fa1900e1b89fe386bb0b8b20c01d0d59b298adb802202655d8cd87e655bad038d124965b9e75c27b5e6a9f09b5ec36341a482ee70c338121023f3f720524e83cdb6f8828e4a9e2aec064fd9e7eabf008ca5ff0a59aea9478e90000000002000000000101cfd5b7bb84ce81da1ef251f8b64857b29f495f272798317037f7866653423a8f01000000171600142c7ed564cec32848ba845a86d7cde35a6cd67750ffffffff032202000000000000225120b63004f4696d79d3f98db7d8abc55b6f7bb29cff808e603c467900bb05717f4153d700000000000017a914ec259bc4b8857a445ad069118a056791c0cc5b9f870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100ef0c48ed2b8a7a67291338db7df02c0ad41169b7f30086f74a61612a7e7d034e02205deb51cc8f95023ab5b598ad502a67973329fda6224d79ff852cd8b7dc1f29248121023f3f720524e83cdb6f8828e4a9e2aec064fd9e7eabf008ca5ff0a59aea9478e90000000002000000000101b6ebb93df614aaa38fc8ec8fc001042c70fdd3cd40b2c41863183a49f251f7840000000017160014c3052dcda535ba0d9b73d48a81b20a1bbd8f33f0ffffffff032202000000000000225120b17b60b0e5d7a011048319b952528d0e89117798524a4f7cb47ef488d9b77efee6af00000000000017a91445fbea5bfedb8ff642ee7922684eb4f8116abd4a870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100fde67e6376d51db4c2b0f4c67163db5f1b35d2c7fa8a55ded08c504d565308e202202bc7ae3a58e3e5e920e727e234c406ec60618b0605f7cd735c84f93fecdc67628121037210e02243e3e0bdebfff4f06afb5075ffb567f06de398eff18e3ca0c0b1ce71000000000200000000010150bda7a9837bc045ca0ce0aad4bc041c18f6dbae48f91c3dc09a878c955b1ce30100000017160014c3052dcda535ba0d9b73d48a81b20a1bbd8f33f0ffffffff032202000000000000225120b17b60b0e5d7a011048319b952528d0e89117798524a4f7cb47ef488d9b77efe62ac00000000000017a91445fbea5bfedb8ff642ee7922684eb4f8116abd4a870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402203f5f3b224d4f953bd73f647b1c4fc3a3fbf9a3b076b1486a5e14d3f04f01fcf30220052141cde76980d8fd64951ef13ddfd26a93ab9c7ff2749cb9fa59e1c34e304c8121037210e02243e3e0bdebfff4f06afb5075ffb567f06de398eff18e3ca0c0b1ce710000000002000000000101b719083f783ed6e44dee43ac080a1b340ac236f51f0fd4e1705b1152e4c3242501000000171600140395e2a2c91be17d66b690be236f2b4118373719ffffffff0322020000000000002251200002672037f77ddfe06266959068733365c6a6e5c747c497076228776ebdccbae91f01000000000017a914d56525607f1b449e65fb7611ca0a5e806a3a0540870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100bfbc047f92771eb98a6266f3ad65871ce47ce87b996a0d212922e27821af6ef5022026b890ed525c17602945c671c010af9fdb32ea924531cb22891da699d4540602812103e3cc1400bc1c53c78c2d8f7d4b5ec6f18a7a092418c2958b35e70deb4b69a0080000000002000000000101b04361fb17c94955a534acfbf4ef48dff5dd98c20237bd944cb290eb03fed7770100000017160014347f0ba1f7465aebf3b7aff265442e8707a7c4adffffffff0322020000000000002251203c62b86f3fc064d966bdeda50989a627e430142ccfc566c83d24873eb974d0026b9200000000000017a9149cf5d993b4aa7a82e675a821c6848229c45d3d30870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100f6c632aac09e269504b0e16cb0ed6ff3d0c93dd6f77f323f4f20679cdbb67b2e02204746f21605a290117c93c8c09d5a216b313aa193e630aeddb179fff8bdf75bb8812102ee333c2cc72ca862e7c2ce533fc661c911f945f7b4921ea4165d22cac2b428b70000000002000000000101ce46a259dec21953e5e1de8d858a5c4523c093ae243568dfa41f716977c336400100000017160014f0b66ae659caee3ac506e7885e2a56b471545ea4ffffffff032202000000000000225120ec6d97fbf2f34a71dc97cca698503898cf2fe4102e20a99fc15c60b789c807a57d7c00000000000017a914f69be209b1d6859e9ae261e62905dd5f22fff04b870000000000000000136a0952554e455f54455354070e83f5ada6ff12024730440220719bf76f0333d289973fe7bdae75c0c7e1ac86a6983ed27241f1f959d4b0ee0802207186ca87ae947faa62491fa8ad1dfffb9a4b5d0faf8a0b94b2cf20a2126fe47581210300748d2fdc724be8b4bd918711f4233f2ecde154bb0ee951b308996d70afee2b000000000200000000010149e51427b92d6bb59376f29177eaccaaae44ab60f973aaf952cba30f9d5e8f340100000017160014f0b66ae659caee3ac506e7885e2a56b471545ea4ffffffff032202000000000000225120ec6d97fbf2f34a71dc97cca698503898cf2fe4102e20a99fc15c60b789c807a5f97800000000000017a914f69be209b1d6859e9ae261e62905dd5f22fff04b870000000000000000136a0952554e455f54455354070e83f5b0eaff14024830450221009f226f2a2b9dfe2c1e25caf9ea373967dea4455fa0813c6a1698359c67187c2a02205ecec631d5e70b3b414a4637a561817c0cf15c1f2121ef8be14da66ea9a2fc1981210300748d2fdc724be8b4bd918711f4233f2ecde154bb0ee951b308996d70afee2b000000000200000000010114233c46edc41eb6a502b1fd11109257b26896175c6656ee35e9a6df0c06924d0100000017160014db2a70e4b9ef765f2f7ddc092d9634215d83aff2ffffffff0322020000000000002251209d7ad69808b1dc5abaf70706b9982ead19719212f8b336295ec611a6c96bfe8a36bb00000000000017a9145c70be56694d28ddfd4f678e0575e957a8012b86870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402201c90a6d1ee656a845b4d6a96a926b5f0de8f452737f520fe490bb11652e7db9a022064d2da6536245bd84db151419bc7f724e4b94cdc2c8fb31fceb0f3af70ab5220812103069cbc4e1b4a7fb4e787d9f5c435eb34362f549cb0cc885fa970d10da0a0487c0000000002000000000101c6da44474284143c260250fc6da0b11e07f8238c3a44dea622709f7de0465e6401000000171600141e0f8bef9411950c7d5258d0584cd2cb1a71f9c1ffffffff0322020000000000002251202e3eb557a3957b74efb2c655f64c1098a8644809c4fa727c19cdb564ad941be339c100000000000017a91406add2d4a8f1882f9045ba34579c6d2d05a98b85870000000000000000136a0952554e455f54455354070e83f5ada6ff12024830450221009b8135bccca9df7b266d6f39abae3e33c4362ccc1b9df1ba93f40b72162978100220459cef4639af59caa457fda4b58b01f2facc13b51ad472cf10d28fe859c247bb812102925d3cfadf4b133265ff0391d14e7171cfd4a7efa4df38eb2eec333aa801dc9d000000000200000000010110604a5be2da59b53a557cdcff588248c464e5406bf63895fcdf954bcc1a8fd20100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90f35b00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff14024830450221009ecaec75f098eb01ce87d3422149ac93e109008de7fc04d096eb9055bdbe316b02205c9383223748b180c94c6c182118784c7ea5dc5b275db09ab19e98d863e3c5f781210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d30000000002000000000101086573a44718be4b8a43a229667db531afbce73c04453d8231511b409f9e6aa30100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90836100000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100dd64dfc294b1cef650ab819acfdf7bf027a87317ed44164fe53ac4b14692529f02207d73ebdf069ec8abfb3ad1fc74e84a545ef5159c9be71336e9e3280514a2139181210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d300000000020000000001016c99e185c44695241d63137527c56a22619fe44e72f858e99bc963daacd783bb0100000017160014a59526002d6c0273fdc6edc254fa7f9b73be695cffffffff0322020000000000002251202cc3273ac7e8b28cd2e050e963e1d09a90488a80638dca4cd3c5c22faa217b90ff5d00000000000017a914fe3fd09dd80db8319de01abd6aff056db12aa379870000000000000000136a0952554e455f54455354070e83f5ada6ff12024730440220596d894b49e380ccdcc7cce326ad34b288c079f692921f968a83a2ee205785120220340abbdd49ffd95c3b074c0c552fa276340ff3e3f2962ed2111d6b1af65209dc81210270454441e5c1d6fd123abd820253592d9a1fd2dafb7cf224c0494b7b0f8311d300000000020000000001011f63af90c20b8c008992d2a3347c681526dc02768c705d9a1d1c2dbb9fd5a82b0100000017160014e24744f53230af56fc7ad183c3849d28f2ec82c9ffffffff032202000000000000225120ef69bc3bdc04d13005f3f9e90a38ace23180ce127f4a474340db590146fdd7f62a8500000000000017a9149fca4cd4855311f38dcb2d5cddac46c9296697f2870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402204ad981836881f0d3837a68a2faf4d6a208707b66aaa8c99ea5c5a758a09222840220522e4e50d9db14f3d7d16e8f91447180eab12963d92d8a71d257a16a70917a75812102cf677a150ea8afd7c111a111c7529361117fec07ebe004d02424bd82c7eecda70000000002000000000101ea424a2cf6d5f1bae926ea4461e7b342b0f998f7ff47a2642b06d9eb59273f220100000017160014e24744f53230af56fc7ad183c3849d28f2ec82c9ffffffff032202000000000000225120ef69bc3bdc04d13005f3f9e90a38ace23180ce127f4a474340db590146fdd7f6a68100000000000017a9149fca4cd4855311f38dcb2d5cddac46c9296697f2870000000000000000136a0952554e455f54455354070e83f5b0eaff14024730440220754bba3c8acd6b88c3727f0bd7c381fdf892f92c6f79b6403ca4cab590a02211022007cde85f037966478a96f644e0e8cf9302849d6492e98a62fa8a223b2e7db47e812102cf677a150ea8afd7c111a111c7529361117fec07ebe004d02424bd82c7eecda70000000002000000000101019d00b64183160c38d9c638675477e2f9cb2c3a764886011048d8a1ca7ceae40000000017160014192e7539bb90fa2d289ee7ba1f349b627ba3824bffffffff032202000000000000225120f5a0367b2c376bbdb99f07a16bae43bc37488bf034c51017a79e848b599188c4458500000000000017a914c88ed043cd19bd6d2f567d8f802cda6ff1f38320870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100eecdfabc9cb589a3c1ee64fa084e68cc7a6bbd44947c0d108aebe65d947a8fce0220640fff3b2d32bea2f20b2a405c34d2533a430bcacea273ba93d3ff6b4ab90dc881210205da6e8e3c0dfbc6c12b21c66a5513712c7995ac6674876cd8266e3162da82ff0000000002000000000101aa1211b273aa4930e97b01942c696a9c0ab7499b2663c0725c66276d88a2111601000000171600140d92b8f6281c2685b3b6f429d6eeb7278fa51857ffffffff032202000000000000225120d9837a231151c12d3a20d3a76f6401f80c78c63839a30e8cc13cb3086ffe2359001900000000000017a9149dab8a846d59eb33dc7c5ee8cf4de9be4eac4924870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100f9b6b1e126bc2b3819414b09170d9b055770508a2e95d297d378c158c22456740220012e9ee02ec9f20d3fdff102555ef729a50d4448341007b26f4029f07beecc85812103a8d64b2dfb15ca07937375db8d8fba095c4b3a428784a4b0147bc4a3c92e46dc0000000002000000000101d3804fe7b3ae82f71cbbc77808140a844c32c79bdf59e891428fd03043e8041d01000000171600140d92b8f6281c2685b3b6f429d6eeb7278fa51857ffffffff032202000000000000225120d9837a231151c12d3a20d3a76f6401f80c78c63839a30e8cc13cb3086ffe23597c1500000000000017a9149dab8a846d59eb33dc7c5ee8cf4de9be4eac4924870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402201ba82683854c79904480768e1521dc7ff185dbeaf2a4e99abd8338067cc0490202204af64cc17fe67c0bdcdd6a1cb900a1481621760d005a403d2aa1717ac34207e4812103a8d64b2dfb15ca07937375db8d8fba095c4b3a428784a4b0147bc4a3c92e46dc0000000002000000000101cef891f8114f48a843ff72ce4609b552c157a3fe8edcd36da815e91aea612b2c01000000171600140d92b8f6281c2685b3b6f429d6eeb7278fa51857ffffffff032202000000000000225120d9837a231151c12d3a20d3a76f6401f80c78c63839a30e8cc13cb3086ffe2359f81100000000000017a9149dab8a846d59eb33dc7c5ee8cf4de9be4eac4924870000000000000000136a0952554e455f54455354070e83f5b0eaff14024730440220360ee19ef433fa0033060dc02d01fcdf0eb6f6db85ebbec7d3dd3ad6b4a3f79202207a7f1c685c18e37653dd2333e24466acb48f32dca1b7c1699f13dfa802245784812103a8d64b2dfb15ca07937375db8d8fba095c4b3a428784a4b0147bc4a3c92e46dc0000000002000000000101e99060472bdf56b88953c9d8ebe4206fbe400bc9e140fd42c04c7d88ab14df9101000000171600140d92b8f6281c2685b3b6f429d6eeb7278fa51857ffffffff032202000000000000225120d9837a231151c12d3a20d3a76f6401f80c78c63839a30e8cc13cb3086ffe2359740e00000000000017a9149dab8a846d59eb33dc7c5ee8cf4de9be4eac4924870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100e9a2b4ca0db88e946d2286477bca35554abca7f82a21dbbe5af4a49eba4ccc15022002a21a56d2729baa9fb14e69cec318422c7458e742606c8225d7e9f65a688142812103a8d64b2dfb15ca07937375db8d8fba095c4b3a428784a4b0147bc4a3c92e46dc0000000002000000000101b06b2e47b93886efb5abb0a47731887e3cf0200a44b387d5a96afd5930b6d21401000000171600140d92b8f6281c2685b3b6f429d6eeb7278fa51857ffffffff032202000000000000225120d9837a231151c12d3a20d3a76f6401f80c78c63839a30e8cc13cb3086ffe2359f00a00000000000017a9149dab8a846d59eb33dc7c5ee8cf4de9be4eac4924870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402206a64c8db8189a7238e5dd696709687e31a5d611bd1c2d429f8d17af5fc9799b002203a5e43281fd4850ece920e8d780abdac23d6e44f7a460bc9748a322c78c08089812103a8d64b2dfb15ca07937375db8d8fba095c4b3a428784a4b0147bc4a3c92e46dc00000000020000000001019e42bf6873b2b322863692c3c059338a8421fbd40a0cc3440b32789ac5dc6ced01000000171600140d92b8f6281c2685b3b6f429d6eeb7278fa51857ffffffff032202000000000000225120d9837a231151c12d3a20d3a76f6401f80c78c63839a30e8cc13cb3086ffe23596c0700000000000017a9149dab8a846d59eb33dc7c5ee8cf4de9be4eac4924870000000000000000136a0952554e455f54455354070e83f5b0eaff14024730440220697669700e9abfb4ddc130a7c53e25dc19ea3df7c8c50721cde7a846a769882d022048c0a951d4d453e56b74d6559258c85ba646aa452bec24b008b45078100e2910812103a8d64b2dfb15ca07937375db8d8fba095c4b3a428784a4b0147bc4a3c92e46dc0000000002000000000101686fd3609d623a8ff1ebd5e8fab8a873b866b372d57bf5fa28f0540e68353b840100000017160014164d0d2e04a943fc1f2ec32ab4f4387624dbea16ffffffff032202000000000000225120580d77269ce4c9937bcd189a5fdd8bed681917a912a0920c3412daf1d78029db2d8900000000000017a9147f7976ae2581a8a7b7d6ebc75a183c30c94dfece870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100dd5877007e896eba888181c2aa8da3a5754972faa13e30bc64fac49e6f9b609602201e1ca10a3de725f2eb9877f40f7f0e3e299b10502ee6700930f2952dcbded0718121024b69bc6ee1395896d051a498e9a6f4a94b643b3ad656cdac37cd1e23bcb653ca00000000020000000001010f4626065e0f9b6a3f01ce426d07bfd0709d4f87c03bc32c2adbbaad4fb1d9a9010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c106400000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402200be58f718df174db72d4e06a161bef61cf8d18b4a17d39333c3e7871c00bedbf02206007512158aaf870cc30d3b42b457e7c8c0d6589926a0332ca26908bec41d7368121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b0000000002000000000101dbe089e2856e16f2a31a2c5227c07fef0438f678d47c4ea8b347b49c7ed888e6010000001716001458b058218664a71d9eb585c4b7f8a9b32aba525cffffffff032202000000000000225120f555577a68a7bdb4de629db08ffb23994f2bb80e54aaf64731bc294397623e7c8c6000000000000017a914253876dfdc95e968d1223e14ccd5617cf691025d870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100fae10d3a7008f52508bf67a21e2ce0bfdaac99014e3603e79343ddd0ed321b5f02207d2a6b9722510357995ae4700e40648c5211115beef10d6c1c911035d7b490c58121037bc44ad15063c94487f86a8567d9e8fd907596a958d6af658e565efa26d4ec7b00000000020000000001010c294bc3ce8de39e937cdf42d38ea5b4d54d2d627326c93085aab82d5a02982c010000001716001477b6b3b6b93d93b13d39f642d657c53bd148bf29ffffffff032202000000000000225120d65f35dd9de49624b3b566fef192b94b187a2175fd3f0dc0bf9daed8673fdcee04b300000000000017a914909c733568d29744249174b47630c95df2465893870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100bbe73452f487c9aa597e7926b512c6a41f52dab768e137776db7d56cf5e1b29802201806db0404711cd7f0288e0df1b7c62cfc4b19aef8cb45fb7dec9234ca4290b581210393313b4d1b1443a15efab7f3fb70766f9f4e5b66d61e91eb1b3caab4390d0ffb000000000200000000010127c27fee4f5c19cfb20f941b693baddb190e81ac8b2b5f2c495f80539ca02f2501000000171600142c7ed564cec32848ba845a86d7cde35a6cd67750ffffffff032202000000000000225120b63004f4696d79d3f98db7d8abc55b6f7bb29cff808e603c467900bb05717f41cfd300000000000017a914ec259bc4b8857a445ad069118a056791c0cc5b9f870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100b473208bb2d9c4d7991660920273bcec6daadb98eb4de19ef15e808978a14b49022025d76bc370347f9077cdf11272a66630cea80bc6bb806da37fb1249fd745a22a8121023f3f720524e83cdb6f8828e4a9e2aec064fd9e7eabf008ca5ff0a59aea9478e90000000002000000000101ac15f594a591c81328d7475618174a0e3a81bbbca7b1f4cd841745de00cae52b0100000017160014e87132563092eceb73117f3e25dd3865f9441ed0ffffffff032202000000000000225120b49d24eb918d220c092c23a44b59a43be238e7d1e4b74a54b5274df538394bd3a4d800000000000017a914e8156e12ac11ceb86f051514d10c788aae67f2c5870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100d31c4fd965cb845994a08e76b269a3782ab40dd16323e13237a2e3d455bda12f02204d0f9ad391cc92f954e5399a53fb8cc85d5dc2d18727287f1304d289d8c230548121023ef536f1365446f8c490c5cf16384b0a3dfe84b220a14678a9867c0d83b2834b0000000002000000000101769213beb5f6bc82cca8bfa071021a03d090a35970653868c908611860dc140f0000000017160014d67a88171ff29bbe2f7071178442e02e4071b78afdffffff02cceb6fce000000001600141d0b2bbea739d983e3840cc5d911e04e12f8890015870000000000001600144fd15bc95fe622874fbf3ca958e8520afbe812a50247304402206a1d51cff5b7b2b6f6da16151aa880150286ae904e529d166795f6b044df14fd02207e0cf361cf185449e672cdb8ba0d7f2720d55a7e55fa23449a6a2a0aa8b8edf30121026f6131f6efd6aef8fb64418d5291b5e65ea56bdcc8d85d9bc3f8d2076c14c0ffe368270002000000000101f180a1bf850e6532d7d58889356c527246e0b383eea91702cd531eafb659db610000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0340eb939ab72f05ba91a351cbf4fffef7c9e0b38b780a7445d298da65a680ab52b62020da72c7135806531641e3d1a7f0f5614d815fe1cd5ae35c3743f24613174083208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003d7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a223237363630323036227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010771cea01a04d1fa6fe51a8521c68706c965d27f59bbb94c4c49ba3417564a53330000000000fffffffff0cf95e28f3ec6d2173fe90bacee89aebd037e00d092a14574a50edde031eddb0000000000fffffffff180a1bf850e6532d7d58889356c527246e0b383eea91702cd531eafb659db610100000000ffffffff10700c55d41bd8390509e32761f14d747a83b5fedeceea3a431af444249285830200000000ffffffff7f918861829a8bd4c8339c3503c82384970a206b66e9040b3c7c448273ee94960100000000ffffffff62f6252774e68a14082ac7c680593fc6877568ff7d54307683296e3dc12101d00300000000ffffffff48c27c690ee42dfca042cfbab44274bc01c1b2a743139e45fbd9e4f48611edf50000000000ffffffff0322020000000000001600144fd15bc95fe622874fbf3ca958e8520afbe812a5400d030000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa3f3d0000000000001600144fd15bc95fe622874fbf3ca958e8520afbe812a50140787e1aab16d68de63d0ce430ac1072056c7fd6550703de4bc67fda6de9817512da683e2b7a261a2799d8e2bdb82f7f4fdca159e225b238927b3f5d916b77f1ab0247304402206ece016c7a942d637de30ae1ac98b80c312254b481ae28805330ca835f2f4107022036754eb2a06e81ebbef613d48d8c9756c4c6e3dab3bf550e75203f989c3db2940121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f0247304402205446ba8928deff7651a65cd92d65392daa74e5a53c9c8e73f2b48519d04d93350220115eada82d8028a25af9f6fe815b394bfb896f1df8483c241c49b8bffa510d310121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f0247304402205f4d58af566fe0b43dc03514b359f69178ebffc0f68903a6c7f2516ee82bca0c022024dc71e2153f213275c053a7c3de489b71fdb3a29ce258300d412df270809db30121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f02483045022100e1ac594992979ab4a9d4e3bc00cdeaeebedc3e3e53bf8adf45f98d543d5d04b7022048f56dbb5353f16f57a90468f1dbe08e793294fa6f51c2bb3a3ff53c1e657bb00121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f024730440220404d2e90e3011c163229e16c7f7a5bc7a949d2fa11b96076db84182cf67491a702207c6db08c0bf2658d562889a75c5986494a4041bed4a0457df8014df98b18d0220121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f024730440220420d06aa027370119166846564719d88f8d9bb8ed6dfb493ec73a32263a5396e022076f1e37d1a6c11e11aed9c25c60a4d1f2924d1bc01720a9237aada22cac1991b0121022a6d28269b27441c224038bc9b345195d7059f95e8efaa81fec3e0a57204377f0000000002000000000101742bf80ebf51c480b73da52f32e639a592f2ed403920618e9a3475a8d92ba3fc0100000000fdffffff02a0b500000000000017a914a3781953353f3d6130bbb33c7b93a43a068b5cad87f5d469330100000017a914c9264831c7ae80c7a3ea16f4eda0f0a253524bac870247304402200151b94536072f3548c46d632442a3b2134956c033049d5b275ba60a047460cd02202260d554ac416849977de24688bff0fd5f94edf954e0b252c4d1c3ed33ea2db7012102bd708bae8696eefdd4b3953522875fbd712363477a165848e8f305287ce696eee3682700020000000001011f4ca32c80da48ca33a5325fd4833b1cf518a04d6850f9e60f53a1a53a8f71b40000000017160014b2fa82420d156394a25afff1530bd2bbc70dac1effffffff0322020000000000002251200881fde74cc5830c324d4d5c1c26d1c71cc0a431d5cd07655a10911a3b0f1a881cb200000000000017a914a3781953353f3d6130bbb33c7b93a43a068b5cad870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100a22996e63839af19a7586f19ffeaabba6bbfb2194f162df96099604c20d577b902206a51dfab48055612b851122b4531e6ad3eac25df7301183fae97aa3fba6778bf8121029a8e5175fb8d888bd7ca02198e3ae271d411dba22664e128d03b75bcaa76c2dc0000000002000000000101d81fe992c70c6b712d067dd1b888d663f16f76ce482c016d73df841b804e28520100000017160014b2fa82420d156394a25afff1530bd2bbc70dac1effffffff0322020000000000002251200881fde74cc5830c324d4d5c1c26d1c71cc0a431d5cd07655a10911a3b0f1a8898ae00000000000017a914a3781953353f3d6130bbb33c7b93a43a068b5cad870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022066b58c1040b5c3a28ac5a87dc4e973b8a2fbab8eca91252b6d2b4238f6bc56dd0220516ede725dd3fd739c78cf327bf8571cdc8778fff673eb407a4062f16186806a8121029a8e5175fb8d888bd7ca02198e3ae271d411dba22664e128d03b75bcaa76c2dc0000000002000000000101eab20fa7e50182fa0ab84aa631d149621061341177e414af833ee46e69ba27680100000017160014b2fa82420d156394a25afff1530bd2bbc70dac1effffffff0322020000000000002251200881fde74cc5830c324d4d5c1c26d1c71cc0a431d5cd07655a10911a3b0f1a8814ab00000000000017a914a3781953353f3d6130bbb33c7b93a43a068b5cad870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100d8ccba52dba8efe48548d7d68e1e554c5034e066276984e64a9006cc94b7bab602206a0f116602472bae58f3816c12d7fb60c38ceaad34effb5119f2669b7bb3233c8121029a8e5175fb8d888bd7ca02198e3ae271d411dba22664e128d03b75bcaa76c2dc00000000020000000001017b370b35df3175d9554e42b38274a59fb78ba7315d23c89b62abf1d9d99a9ac40100000017160014b2fa82420d156394a25afff1530bd2bbc70dac1effffffff0322020000000000002251200881fde74cc5830c324d4d5c1c26d1c71cc0a431d5cd07655a10911a3b0f1a8890a700000000000017a914a3781953353f3d6130bbb33c7b93a43a068b5cad870000000000000000136a0952554e455f54455354070e83f5b0eaff140248304502210087563424ab244ed54f9ff8f96fc12acb59a07ad29ed56f1683c3fefe1151bc6902206c76e1273d1a2fdb49bdbaf5f39b8f2ee303ff5c761362a363b9105f6ec1e7428121029a8e5175fb8d888bd7ca02198e3ae271d411dba22664e128d03b75bcaa76c2dc000000000200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700020000000001013d9a7758cc6bcec5f83aa6a63734c65031548d10c08f447cce23cea0ade171a50000000017160014c257d2b8056f40bde55d0acd8339af3d11baa3fffdffffff02958e8fd10000000017a9144504a25c218ffb203d67e718663a1fc34e3eb72887facc00000000000017a914a9b52b2e36edfa66fee14ac9aaf5e5c37398799687024730440220525604f273830b8ca601dc4fd9814d11eadf7b053cac3fec63970ac7be1c7372022056989432db22c8019304b953aafc3b0e057eef0c7edc8db9c7f47c52ecbbc08a012103be3a408c6a5a51e58bb3cc3559c4ccc23a5ee03664e92bf028e0283d09a1c8c4e3682700020000000001010804de84dba020c6308d52461fbdcfdc23ab5759def93e4ecffefee0bfcf509b0100000017160014f304b6b4ab53b7b59e7f4f1a5fb96a9ea2a9f34fffffffff03220200000000000022512059a516554b15d2c5813282bab92a8db8b6b2f40c04f245e462180085ee82440e76c900000000000017a914a9b52b2e36edfa66fee14ac9aaf5e5c373987996870000000000000000136a0952554e455f54455354070e83f5b0eaff14024730440220674d65e873d9eb47feb7a57517ec67c2f3c99b89e84d49c00ff6f2a52f754a480220257196252a2e1ad93546e48393a5402ab016a725df3f096b64887b08436bd9be812102ab42a224330adc5a43841b5ba7ee94eb4e9195621ac76c6f655ea717138baf1800000000020000000001010926455c97bf9aae83db049798e30cc6505f6a394fea9d8e8dd17a1cdd7b1e710100000017160014f304b6b4ab53b7b59e7f4f1a5fb96a9ea2a9f34fffffffff03220200000000000022512059a516554b15d2c5813282bab92a8db8b6b2f40c04f245e462180085ee82440ef2c500000000000017a914a9b52b2e36edfa66fee14ac9aaf5e5c373987996870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100ad53ba3e383c8b366c720331ba75cf1f384d6bc1257b17e1717e52ff106b6bb0022066c2dd5b61d90b239e95b63d7bf2fc52e9c8032ac7495094ab47e823ad9af0a2812102ab42a224330adc5a43841b5ba7ee94eb4e9195621ac76c6f655ea717138baf180000000002000000000101076d7f34884641c06e6a6e3c8e1e124dbaab13845945ac798f41b266e03f14fe0100000017160014f304b6b4ab53b7b59e7f4f1a5fb96a9ea2a9f34fffffffff03220200000000000022512059a516554b15d2c5813282bab92a8db8b6b2f40c04f245e462180085ee82440e6ec200000000000017a914a9b52b2e36edfa66fee14ac9aaf5e5c373987996870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100a2c9f541abfb8d03d0f3a9671bdd23c941fac7ea345e73fd8ffeb8bcb6c43581022000e22598a2af73b0ca5ed7feef88ef92405c1dcfa97abce962ae063550abcc33812102ab42a224330adc5a43841b5ba7ee94eb4e9195621ac76c6f655ea717138baf180000000002000000000101300c55525321f142b63c30dfdbdcf1258bd8a775b05ffb6b48ec9cd91a26cfda0100000017160014f304b6b4ab53b7b59e7f4f1a5fb96a9ea2a9f34fffffffff03220200000000000022512059a516554b15d2c5813282bab92a8db8b6b2f40c04f245e462180085ee82440eeabe00000000000017a914a9b52b2e36edfa66fee14ac9aaf5e5c373987996870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402204d121700253e6af18a297569deb2630e56962a270f42f41f6a6313e0e1db7710022078596dcfc2d0ac437d109c567ecc9a93e6b88a9aab0aa68f3a56b15bf6e4bb62812102ab42a224330adc5a43841b5ba7ee94eb4e9195621ac76c6f655ea717138baf1800000000020000000001019a32ef0d323a1b26b04fa974c79d6b73506149ae900e109776b16d96e2d30d690100000000fdffffff02bfca00000000000017a9149b6fd0c98459c7e00db11922e20b276519b0819587e835182c0100000017a914d7b3202e03a1be2ca55e2586336de3fd6f04f51b870140719e6e8e88e92da7f6e615986f3c1698679f202b959ddb787aeb85dea7af62b796c58762f853f04a15c587caa9107be36d28837ab95b5ad02e54fa1232df8ab0e368270002000000000101f171ac959aeb17526373384ee1971f7f304678e897cb0b099b5cd967eee109f2000000001716001423fcd84bddf79c032834520cb804ad5aa175979fffffffff03220200000000000022512094c8f17d419e254fa03644343e61ca0fc1504543aae8de6db1fed1d5761e3f533bc700000000000017a9149b6fd0c98459c7e00db11922e20b276519b08195870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402200289a23710d5b297d5faf0aee3e7175ba5611bff4c2da14378ff1f61493d2323022071c52a75ce117f8f7dc9ddda97e4a6e65f93e6941f14f9933d40b38700223d9f812103711a307d4d9208911b1e6dbe57a715700af8807f6416bf18fbffe6bf34a616b00000000002000000000101d9e7f5fa4775651c2ca7dd6e66ec7401a9023d363c374eb75fc25a214a1f1d04010000001716001423fcd84bddf79c032834520cb804ad5aa175979fffffffff03220200000000000022512094c8f17d419e254fa03644343e61ca0fc1504543aae8de6db1fed1d5761e3f53b7c300000000000017a9149b6fd0c98459c7e00db11922e20b276519b08195870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100891e94386c9c9caf266a44ccbe593d049551287a20d62f73d063c3269721ad43022054d19dd100638269544c6d7226a1eefa4b36166bc8b37570a229b21d438d4dfc812103711a307d4d9208911b1e6dbe57a715700af8807f6416bf18fbffe6bf34a616b00000000002000000000101a9bc14969aeb41f1af2e89e749331804279085c13460260fc1ecd7369c92de40010000001716001423fcd84bddf79c032834520cb804ad5aa175979fffffffff03220200000000000022512094c8f17d419e254fa03644343e61ca0fc1504543aae8de6db1fed1d5761e3f5333c000000000000017a9149b6fd0c98459c7e00db11922e20b276519b08195870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402201e14f76f1dd099fc149f3e3c62f5f2263c76605eb6010981de6d7360d4b2f1ae0220483f22e801895398de5c2b274e2752a34f620db3332ac9e587b4fb1c012100ed812103711a307d4d9208911b1e6dbe57a715700af8807f6416bf18fbffe6bf34a616b00000000002000000000101f082da578c39b87e8b808c160268de92aed13e3482b197966cd5ca9f1e959f050100000000fdffffff02d696f4b10000000017a9144f91891a6b886af1a3af47b42c1411a8ec8090cf87fba400000000000017a91479b86373e0a9f6d2d16a592f4b07876be3f1bc60870140e497654697adf86caf72b4110b52bb78eb7870ad236ea554dab60a557e2896e4ab72b8a4d6372c9247c49571ef65a207a7e974ae75ab1f95207ef4bae1618ec9e368270002000000000101ec4319be947a15a42313932d3c090187145288e079c3e17a09f553b15e60076101000000171600147a8f5245042209caab9481ac2ae3bca9b45f3b21ffffffff032202000000000000225120541f21bc9d4a90a937267cb2b8f13783603c89c583d507555720ec7cc957441b77a100000000000017a91479b86373e0a9f6d2d16a592f4b07876be3f1bc60870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402200c92663db6fe12e92f7162d01d91c41645aca73219a79382edc0fddca50a19a60220395779bc810636539af9fd9f2afb4634691a4a0b8ae33e2a1cf6389185703dee8121030e0b4193159eb96fcd49eb6d521599f664510175028f429c7604bfa0b642daa500000000020000000001012baf22d1ab440752948fe952fd6ee5eea27c84010e3b0c854d0537092cfbc1fb01000000171600147a8f5245042209caab9481ac2ae3bca9b45f3b21ffffffff032202000000000000225120541f21bc9d4a90a937267cb2b8f13783603c89c583d507555720ec7cc957441bf39d00000000000017a91479b86373e0a9f6d2d16a592f4b07876be3f1bc60870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402202ebfafe705318ba422ac25c63d54dd28f92d47aafc1857f3c705557b05877017022006a65fc9459724006e4b511433d4fe4fba4dcb41f6b868044268a2ea475afb548121030e0b4193159eb96fcd49eb6d521599f664510175028f429c7604bfa0b642daa50000000002000000000101a3b012a3e265b181128ec44d3fd6fc8b6ddc31380268f454c8ee5b88ff9121a801000000171600147a8f5245042209caab9481ac2ae3bca9b45f3b21ffffffff032202000000000000225120541f21bc9d4a90a937267cb2b8f13783603c89c583d507555720ec7cc957441b6f9a00000000000017a91479b86373e0a9f6d2d16a592f4b07876be3f1bc60870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402203bc98d8ebd920eb56b71e7bc4df5b9566c1d5df7203a205c77981c42527497ff02200871ce397eba88939f0b156b5c337586d010093dfd10ca74ed2fb70bc4b0b0098121030e0b4193159eb96fcd49eb6d521599f664510175028f429c7604bfa0b642daa5000000000200000000010139b5c2a51992d22f2d1f10a6a2aeb92e27b0dba52b41a4569c36f9dbfb3e2c770000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40340afd5c6b148e6be48c8e1799380083e00d92f63092a41a16dfeccc039668200bb1293022e875e59d3d7fc80b9a610d71149eec39f4dd0a784ca6c015f774237d481208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101f47e226efae4dcf1b9b6f743c5767df6baaec28e86576b05c3181296a31407320000000000fdffffff01220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40340d75500560a578df1794e921ffb826e88a11412331bb175625b59d85408c0ae52d4bb0454511c220b1a66555169e6bf65c1a3bedc9aa54e6851924fc365f686ab81208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22323530303030227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101e08370f84f1bc91aa041c853c62f8b7c8e0b6401b203585440654ab892eae0f000000000171600148dfc109216f045ef97fbcbd9858dccb7c3e4f700fdffffff02d97f00000000000017a9144fe518dd7ac3c604309b1984b53340b2ec51128987c84131ac0000000017a91436e16b60a64d3a18407e6d7000699c94b70c98c987024730440220427bb628f05d982eaf723ae8836c416edeaf4e5aaa5a275cce0deed7a5f08ee6022061b9291d59be91850775ac8d464ef9b823236bde60ca7681191003e4411c86ec012103d57d6530ef6589acaed3977055c0fd4f6d06fdabcb171b70c8dbe7177d12bed9e368270002000000000101ca0e61351241bd566894932241c5161db29141b96727a7a2e96ac870b3622af900000000171600147aff61b4765cba08530cdb8b2f0f5fcb9ae45df1ffffffff032202000000000000225120db5745c5afb3deda455b7b08c16c77577f1ecfc15827d8e71f40f63b459aeebb557c00000000000017a9144fe518dd7ac3c604309b1984b53340b2ec511289870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022038a0e978b8244b2439616c2bb5e138c2a9bd6db2c6b8f80e51ac0f1a998fe24802206c85bf08b0a5cc73f77fa33eb3f11af73028202c5ce873df251269c29d9dd24b812102910b2ee32cc4ea555d7557d5e103c76c1ea58f678d47c0c83ebf370b12762b010000000002000000000101731ed75345a217a7c0434695c832f3531c6bc9925ed29d27a6179450021a0b8301000000171600147aff61b4765cba08530cdb8b2f0f5fcb9ae45df1ffffffff032202000000000000225120db5745c5afb3deda455b7b08c16c77577f1ecfc15827d8e71f40f63b459aeebbd17800000000000017a9144fe518dd7ac3c604309b1984b53340b2ec511289870000000000000000136a0952554e455f54455354070e83f5ada6ff12024730440220028e57c3157393f4090e78c3ab31beda67fa491f6e51a70c7154fcdf1c7a947602206e03a5476e6f071b4904025063d7301f2d9183a406aeb740210d6f7471b2280d812102910b2ee32cc4ea555d7557d5e103c76c1ea58f678d47c0c83ebf370b12762b010000000002000000000101da16c55e56307da87100f67571ee706ae266bc99eac08b00bec82f3a859fff5d01000000171600147aff61b4765cba08530cdb8b2f0f5fcb9ae45df1ffffffff032202000000000000225120db5745c5afb3deda455b7b08c16c77577f1ecfc15827d8e71f40f63b459aeebb4d7500000000000017a9144fe518dd7ac3c604309b1984b53340b2ec511289870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100ca1ea8d3ab1f90e8fbe9f72ea615736fb6867780deeb25ae2047f627f7c23ef60220786cc16f5a25f33862ac0507c21972ee5138ab10ea9b8ae89df88c7f5eb8015a812102910b2ee32cc4ea555d7557d5e103c76c1ea58f678d47c0c83ebf370b12762b01000000000200000000010171126bf4631102eef191d997feed278f417ee646783cdeb051c03e9775ed1132010000001716001479a3a5cbb3144c7c57a9ed1fb3f2858a690d36eefdffffff0238ab00000000000017a9140bdc7e1177bfb29bcf457cfe829ca9f071bad89387f06e0fe70000000017a914eefadc9436bb56e5b679e30f1c0057e69461a89b87024730440220684ea9574d341042e0e94499c6fa032311addac7ea8e647a3f6f0035bf518e0c022079bbfa6c5906cc80c5aa632df507f54affbbeffccd5334d2ca5d9d15be69749e012103ad0cf0574032b125e55077a0074700f42e3fd983f559272bf23ae503c859547fe368270002000000000101f7452cd4378fc768eb9f78f4264c1df1bc39e9f09ec482f32875e7d87808872c00000000171600148c454be8dfde4b52a104a60ab11aa56e7f904b0bffffffff0322020000000000002251203dfe75da9edb81860fcaa1721d231c0efdf0db8c0e495f51f5b4ce216a205052b4a700000000000017a9140bdc7e1177bfb29bcf457cfe829ca9f071bad893870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220245308bdee07f97a5aee0abb726f41989a4a191c84dfbbf22b319423d5b17a7a0220653be3f84a4c40c39b3b3d2ee2bcd8a6cbf020e7f7959165233e0726df5554cd812102c988a998f979e0d3a8f369504d9455d80ec0469763d161b5e00a4c1bb267bed90000000002000000000101819b7181a9ef331f558acab4d0980b84835a00c78bb8df2e12ad75ccb791a99f01000000171600148c454be8dfde4b52a104a60ab11aa56e7f904b0bffffffff0322020000000000002251203dfe75da9edb81860fcaa1721d231c0efdf0db8c0e495f51f5b4ce216a20505230a400000000000017a9140bdc7e1177bfb29bcf457cfe829ca9f071bad893870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100ea21a65fb5de0076fe2f2ed23859cc3fd014d8737e8fdbb60c5799421ee8bc84022020ad300fdc372a866a01d580678485a368704595c05fa39c21a355cc171b3530812102c988a998f979e0d3a8f369504d9455d80ec0469763d161b5e00a4c1bb267bed900000000020000000001017c02d03ea8104448507fc0bc41f5c14b4ad926e9c7c590dba6e0affe36a4236901000000171600148c454be8dfde4b52a104a60ab11aa56e7f904b0bffffffff0322020000000000002251203dfe75da9edb81860fcaa1721d231c0efdf0db8c0e495f51f5b4ce216a205052aca000000000000017a9140bdc7e1177bfb29bcf457cfe829ca9f071bad893870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402206e2719cee2995e535188fe961bf2fd6185aefe8beb211b4c235577e98e10308402207847b0678ce03ac9461c9b63aaa0f3f18e950f6bca9466764ee5e0c08af88913812102c988a998f979e0d3a8f369504d9455d80ec0469763d161b5e00a4c1bb267bed900000000020000000001010f90c75c3d392efc769cb29b54853398572488abe139eff175cef1db2be2629a0000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa034032c2147000befab11e164c8fe05f5d8f3d5a9e5aa535844203fca160d03282594f405883742e3f0d1df75c370b3b515bcf09b152e2d47704703c2567c75cfce481208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003b7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a22363336313436227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000102249146ca8107a6be0c8612095b0fdaddb6fd186e2cf09f8086c777cb3bfe5de00000000000ffffffff0f90c75c3d392efc769cb29b54853398572488abe139eff175cef1db2be2629a0100000000ffffffff0322020000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf5f811000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa384b0000000000002251203ede90aaeea35293438ee59b139cca287c9ce999c2ea7c6df48a6151e6eebaf5014044f9466fc91d636b2c4f05d70a0746d758d07a5a12cc171bad113aa486c160341b0b97773524c9888eded839c6e7995c81e9d188f9583bfef579acd033780a9d0140acadc032cf4736c82e790aab6ba60244dc41e5a6cb62875f2cd6f64ac09890fc867bb9ee247da6091f400e5586fa11f0bb57ad33d6c60a19b58b86013f2556670000000002000000000101bb6fba837af4da0e47b67bfc1b56d729604d9c9a68a6760083cb5dc93ca3b9ed0000000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa034025513cb7d9f4fa59bec036cf59011396b3b577a7c4e15e1f050c859fcc008159d87a62836c0129fb2086c1302cd7957200c940c8d0aff6a5f022741b4890832282208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003c7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a2231333832393138227d6821c08942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1000000000200000000010216d9740ee06c657317e18956d4b3a945a3b2d7cdbd1659fe9ae36b856b2e86860000000000ffffffffbb6fba837af4da0e47b67bfc1b56d729604d9c9a68a6760083cb5dc93ca3b9ed0100000000ffffffff0322020000000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a1027000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa6bcf0400000000002251206ad340c4a1b7bc95d0e695122ece10796a9f8bfd697533f4f442176e7d6ce28a0140d10071a8e41469d3f92f9a34f7173575b265b4f2e31b8e335c7717c732e8c38706e2aea1b6e9c65cff93311ccfa967a4ad25cd6428d593a227a4f84a58aba3d70140911b4f825caf681501e3b2fc98a5cf649cbfd2bf79e366ccdf862c24e29f4f89e43597f185ec0d44dd852c4f234cf493aa65fbb36a5a731ae6e54399b4e556560000000002000000028f28d037551763088defc85debf2ecfa2bb3a39d8a2fcb77c7e73e21dfcc320b000000006a47304402200a6cfa4b1e606724f9c66fa2c65b12e81344827379638d0fbfd339b496f80194022058e73db01d5657cdf0146b0c55072e7360f439c1ca3353e0405bd5ae5dcd88280121029ce0785d952f35b0f4aaaa48c2ba6fe72130484ee91ed98b6950ce26ef17f805fdffffffe0409aa9dd8d6889676309571f570e03fa1d760869f1d2a4a2d1366e7d72a15c000000006a47304402205b767851e3c14f933f094fc3784b215d5ea1e2b7c965e4f0755b51933ba30f0c022072607e7beecc4c40182f675249e1ee64dd34cf28c93b841f84fd40bbc389ac9701210394e39fcbf3521e67b43f403d5b7dba04fdd141d582057a1ed2186fd720b8b7f3fdffffff02ad190000000000001976a914ad4fce526ea6da31fcae6719849437ca19ff243d88ac10270000000000001976a914175d58bcd962b08ea2877e729b88232d038c692c88ace368270002000000000101b3698d6219bac6522fd2a560f2c1f40cd7fbbc8d9b64c2391f0ba04c78512be70000000000fdffffff0252530100000000001600146b6be048c0dc9143741f78d91a7746d0a46184565c528d14010000001600143a386f5ba914111ecfba71254b5cb8df147f388801409f2678eb843e2195f4e8fb7c7c032ef9f55b34a6dbb1249af135eb10d16111b4537ee44cf37f95f4c1ce806739a8e5b44644f57bc9c7e286aae5cf52116a24d09168270002000000000101837c6f6e92f223bd10c44a5c851da27cf48be1b8e5cab0cdaa67bfc52dd95fde0100000000fdffffff027fce8c140100000017a914895ba3f31a41f2135b31f1014af742e922fe2485874e8300000000000017a914415f2c60394b7b0a66305aaa51a7270a2d6f0e2f870247304402202b6b5a2ef1324efcc672deddee1989bc605cd84f29697d376593e5f4c526d69c02202273bf7cef0a62453c85343d72803b4815c31813d6f572967ce3c526dfc1f638012103bd20bfa2f0431b1db25680dac4e967f2345a237bcfe37e3b5aa979215d23f0f8e368270002000000000101ba881c38899591ae988e48c160d9bda8372a2c7b4eb032d1f6918f44d01f8f1101000000171600141c4bf225ad4fc3ab299a2a0d26b349436164706bffffffff032202000000000000225120ca9bc4356900a880ba44d8721ed9ea59c147a9415abb3209a612aaa04967b71dca7f00000000000017a914415f2c60394b7b0a66305aaa51a7270a2d6f0e2f870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022034c483fb0202159deb0276ffeaa1bfce8a92232e347d7649391daa398374225d02200dc339972da3539da1b24a6f8112cef5c5755ec02102640d5ab0d4a30fbcea3c812102a6d5a340b217cdc3f6a51afe38527a54794cc42555da5bbee59d36b7f4880e6c0000000002000000000101ed244a0582a9bc57f84b22c30821b0d6035da757c738c68c74cda35457728eb501000000171600141c4bf225ad4fc3ab299a2a0d26b349436164706bffffffff032202000000000000225120ca9bc4356900a880ba44d8721ed9ea59c147a9415abb3209a612aaa04967b71d467c00000000000017a914415f2c60394b7b0a66305aaa51a7270a2d6f0e2f870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100a7c63394fce9571f6b5d69fcb52f4d73202cc309d19795fb05ca0012881ca3e102202e6d7dfc70c05cbe4b9c852b287a49099e48de7a807539c570a6f69875d82db3812102a6d5a340b217cdc3f6a51afe38527a54794cc42555da5bbee59d36b7f4880e6c0000000002000000000101ffffac9f9885932ac2aa99c8cd0f7813c641f82a4c5c615c8a2d41b7fcd61ba401000000171600141c4bf225ad4fc3ab299a2a0d26b349436164706bffffffff032202000000000000225120ca9bc4356900a880ba44d8721ed9ea59c147a9415abb3209a612aaa04967b71dc27800000000000017a914415f2c60394b7b0a66305aaa51a7270a2d6f0e2f870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100bc65b84d52acfaa6c23f87fd7af345700c65fef23890d0afef0e9cb10572e1fc02207d6c9ac2c29985866a9b0ba2a01965daa347285d6fd025600182380e23d32331812102a6d5a340b217cdc3f6a51afe38527a54794cc42555da5bbee59d36b7f4880e6c0000000002000000000101e066bfc9d575f07e20ca784c7d598f9c4bd64460a01525f6ec1216eabb4f16860100000000fdffffff02ceb0deb80000000016001444612bd6a9f8dc27ed1a175d347142b52ae7808c8fb30000000000001600141f06a2c60a6652ca0d57e4c56ee0281d3acf363b014096ecafbd72fe9fb2c6b6d4927b68f5880ae515fc714b5b489ceb67fd9f0612cd87d0f7256fc88c0bd2d894924ab959a19ef42988b8d2a8f3cfd239600f98b071e36827000200000000010143ae1dd79eea1b659503f696f7c88c6b16c8a82d986dd74ba1414236ce8328280000000000fdffffff02b1e9ddb80000000017a91446d50cc7674cbc670d997a2829af3d936b2a809e878ec600000000000017a9146b4b765038f39d56dc107c88450b694e891ea25e87024730440220756b5520408633f2c4f74a578cdb6e87ea61b752b7348ce5235c2edd0ba000d402206849f884f28848aa9b6efd8a0b05e6d73cf96f5f9e2e4009847972348198d6700121039487e40c865ba13256cd5671ba766227b5c073d83cdaae3efce92f2dc8021b36e3682700020000000001016e1fccc6bbd45e1f58c3e7dda87b5929df2023b2f68d7524755ffd7580dc934d0100000017160014cd692e641a3621b38db07d3402fcb697af3475b3ffffffff03220200000000000022512045bae9bada44a966c971d5f725a6c12a647bbb048240d852375ce316f508b72d0ac300000000000017a9146b4b765038f39d56dc107c88450b694e891ea25e870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022024bf304cbef3a9fecb4ff28057d1e6b6df246b3fd7595dbe4855bf8e954123ee02205215e7e4509ee54e321e1ef9495db6f3b5de645c22a527677e3e420db6607854812102660f16f4eae0234c11fa5f001c2737257c35d426e0daed068fcbd745084927a20000000002000000000101f5a68d3ba282003afc30ad0b26d35c9265d05dd9dd2015fae5239b026ee7afb80100000017160014cd692e641a3621b38db07d3402fcb697af3475b3ffffffff03220200000000000022512045bae9bada44a966c971d5f725a6c12a647bbb048240d852375ce316f508b72d86bf00000000000017a9146b4b765038f39d56dc107c88450b694e891ea25e870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022047408cbaf7fb29ca91c094f3b50865c887038cfad5cc5f62317942313a5f3395022075b685e06fd7977e9fdaf420b4fbed4e6605f47b91345983262d2d0b9a27f607812102660f16f4eae0234c11fa5f001c2737257c35d426e0daed068fcbd745084927a20000000002000000000101b1afa928d5e08ec02bf6b97bec03464a8ccbbabf62534f4ddc42b4771d4906c70100000017160014cd692e641a3621b38db07d3402fcb697af3475b3ffffffff03220200000000000022512045bae9bada44a966c971d5f725a6c12a647bbb048240d852375ce316f508b72d02bc00000000000017a9146b4b765038f39d56dc107c88450b694e891ea25e870000000000000000136a0952554e455f54455354070e83f5b0eaff1402473044022007efb13f243fd12d8042f8a11e8317b58a9d487bd39ae95ae2d896b1881856a202200dcd17690871fbe3df573b64e5c59f2babedc5029880aaedd5948c3247422675812102660f16f4eae0234c11fa5f001c2737257c35d426e0daed068fcbd745084927a20000000002000000000101af91669b31ca771315a97bc140657620caec11c3138b58edcd0b626a84732e910000000000fdffffff02079200000000000017a9142cb49bc69cb71622d723019802472b8a3ced0def8709aa85e60000000017a914282fa5b55c3c540d82ba9feb7f169752de72409a870140ccbff22748f7ff818561ed338cb345dac10dcae3186bdcc04b656d08a563b91cdf68d4678c7007bac030b08e356955a4992dbe3ab6b883ec531883a746c43b52e3682700020000000001015ce444e1db47c4f6649c594e5c3d2382ec630467bb2c33ebd9ecd7246a478f7901000000171600149a413b7548cac375af7b60e6c3fc6cf3dc306d2efdffffff02bbd684e60000000017a9144a8ab12b0c4a291cc21da60b268e5832761b3eea87a8d200000000000017a914b31941299e810d384c6662dcc8cb480d156a61d5870247304402200e8f44e209ec4c21844fcc91f26443647658b2aaa52df19c5df5e5b64e12089f02207025937ab08234c9a5a69312fae7a8466170470542bfb6e755a5aa4a43746d2e0121037d5dcb4ee32676fc268a5142fa380bc42f372362cdf0a1b516eb29fc067a485ce368270002000000000101dad84494059ba4237ffadebdad38c7189db3580b5cd6d0583c6c2f922723ba6601000000171600141a136b797ebc24292f95d768382565e455530097ffffffff0322020000000000002251200ee2fdb5a585ce70d2a74ae98d958779f35c38dfb74ea4c07d9dcb55e6f7b7eb24cf00000000000017a914b31941299e810d384c6662dcc8cb480d156a61d5870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100a025ca331ded5722edca6b938843512ba763bf82ffaac816cca98b01c88d04d30220656bbd958f035aaa0a56311ff76d9c451d840d7377825adb15e3376bea569d9481210259dfeb8e794f5e4f76288232f4dd283cd693924681a469a51b482cac07e180dc00000000020000000001012c6d2d7809181a6b7504abba69ac346ea924a5ec082d4762de61129edf6867f301000000171600141a136b797ebc24292f95d768382565e455530097ffffffff0322020000000000002251200ee2fdb5a585ce70d2a74ae98d958779f35c38dfb74ea4c07d9dcb55e6f7b7eba0cb00000000000017a914b31941299e810d384c6662dcc8cb480d156a61d5870000000000000000136a0952554e455f54455354070e83f5ada6ff12024730440220026c0532f49971d603bc974f17702f56b2b83df6422a54842fb54b94ed0f7850022043662daaf32ee1c4957e42e115610cca6a69216f0cdda8beccdee5e0daf4429981210259dfeb8e794f5e4f76288232f4dd283cd693924681a469a51b482cac07e180dc0000000002000000000101b6fe311be78bf38f7ee46a16798acfab58a7bb3bc790663be55785ab9ca2d0ba01000000171600141a136b797ebc24292f95d768382565e455530097ffffffff0322020000000000002251200ee2fdb5a585ce70d2a74ae98d958779f35c38dfb74ea4c07d9dcb55e6f7b7eb1cc800000000000017a914b31941299e810d384c6662dcc8cb480d156a61d5870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100883c7092f4a83541f25c9fe0d57b74855051dacda4a54437c32cad92078956ec0220189f68e63f58249afac6c1d98d1ac1aae98d1fc5ecac10324c6fc81a5a53807d81210259dfeb8e794f5e4f76288232f4dd283cd693924681a469a51b482cac07e180dc0000000002000000000101b56c74f0eb4a5f79407c43e4c178c34a5b4a49b5d41e0f61f5847d76043e905d0100000000fdffffff02710d3d270100000017a914a867eb8e9862dd7e2a33ef392445bfabc7a0743687cda400000000000017a914d18a7e1d14ff24855a96b29126b732d07daf5ef28701400de8312d868418e6839e2573dee1045de4e1d7453b07636d35d67587fcfab050038d12f759157a3ed8fd6779175cc8b9c9628b4040bdc4001f588fbbe33eaed2e3682700020000000001017bc4be7caaf72cc81a1d4ba238c6aba3434e2ce1e3c63c250c7524d76fdf96110000000017160014cab51437515bf16d8c24ecd42ce3c94f8ef57787fdffffff02f5c600000000000017a91418633823ecc35e134b18de09be97284086a93bfb87d6453c270100000017a91480633d0f9b52a08a587aa9b2459d5d1788f4a5778702473044022070e68b2e71dd570ce42cdc384d645940c1362db98fed90f29f682986672e8d6b02206e2b4c125c358db303e944f7102e448629b92ee81f1b4783c9173412e26a06be0121022879b647747448311ed206de83547f383856be07422c27d3eb834aa483298307e368270002000000000101967fae1310387a7a72870af03c01d024910e92d56bea8a2106e67cb4e65e776400000000171600146ccc69218dc8805e28b71e8f4f906f92fa475a02ffffffff032202000000000000225120615046e59cc4b12374eff7f2f6603058228c7e7ad8163b35569943b007c217eb71c300000000000017a91418633823ecc35e134b18de09be97284086a93bfb870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100f8bcd04b8bd3ffd7bdc692aee66099df1be2d29496aa9b312e933db35f140c09022034dad33929f55e09fa1c82844d60ec325f172f357556372c1e29608a7b831a21812102f06835016d4292cb52e5df166c4a9185fe6799044e19ff78be21c276413fee630000000002000000000101dd95012229312a7579e80d6e5dc51335be366ab4631a89c84a00404c2b50149701000000171600146ccc69218dc8805e28b71e8f4f906f92fa475a02ffffffff032202000000000000225120615046e59cc4b12374eff7f2f6603058228c7e7ad8163b35569943b007c217ebedbf00000000000017a91418633823ecc35e134b18de09be97284086a93bfb870000000000000000136a0952554e455f54455354070e83f5acbaff0e0248304502210081489c8adcbf59763512c70d2f3f5e1924ca50e15d3910224f90e1c4ec17e747022020edce8e3ae0bf0480b5bcb8f1d500271334c2ece267aba803359c85978fd6ac812102f06835016d4292cb52e5df166c4a9185fe6799044e19ff78be21c276413fee6300000000020000000001015423e2c2d0a1f2994a2cb21a9848dfb10f2bde53db67fcc3c2075966eec6635b01000000171600146ccc69218dc8805e28b71e8f4f906f92fa475a02ffffffff032202000000000000225120615046e59cc4b12374eff7f2f6603058228c7e7ad8163b35569943b007c217eb69bc00000000000017a91418633823ecc35e134b18de09be97284086a93bfb870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402204320e40e17565559b4961d4dcb1dc12733f7199a5c9db3f1418c234a42179d4d02204aa197673e3197275076bbefa2d447ed021725742375f320fc8e0e0ee7767d3f812102f06835016d4292cb52e5df166c4a9185fe6799044e19ff78be21c276413fee630000000002000000000101ce70f3f8e6cb83b2df39eb83036cea1c13815c30f14e801b68860849dd4cad1c0000000000fdffffff02ceb28ff40000000017a914315a3681cc7b3a8fef97728a1ef6b011f8294c24876aa900000000000017a9148d59a711cd2eabb75163d08d0e1cfb91fd2d69d4870247304402207f8a1e6bf0e493eaad085e97f7d249a051e3e9fff9cdc348cfa611868f83a68b02206675cd1a0c071b8eecab933c0b919945a419d5a85828bb46abb17dead2e8c9eb012102d0eee8191e8302baa99dde499bce320a9130457f8a8f085539e9e69f61e5d9b5e3682700020000000001016219aa49c175843abe309581b483b99cc1af90d3a5b456440cee4e17e84ebea4000000001716001454dc3273b5eb41c631b61aff6a42dabf653e530dfdffffff02d4178ff40000000017a914249a43da19346ea4eb34ee64cd6027ee9836df4987549a00000000000017a914168536a3f0b5cc268a38105f9119c6421248c1498702473044022027f53f25b6b43b6b9c88d3932be3006d0e8a192fedefad44a9f2adeee36c830e022044391ec02ca966402eba832eb0007fd0c8f101668f898453c8cd5bf814e0adfe012102d50b5c240178cda3b8182351370dc17f69c5425120b550cc46d2f0120cb6dc59e268270002000000000101e012d707331cd98d48c17e6eabac4395eb532821c053ee4335165448181d93200100000017160014d38a9c5713180519792552ba44cc3fd3c82060baffffffff0322020000000000002251202443e9c0792b8096a5a667c943f8f87fbd9b2c66c8220f7a0f6a158ce9f04843d09600000000000017a914168536a3f0b5cc268a38105f9119c6421248c149870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022018f4fb53b4d8e91f51388cdc13a542576586f975b55c279ccb507cc1329042b40220587a2cc45635d0169ed1d15c9ced40d4ea152a632693b1e9485932b4d1f4a2fb8121026353ce47c6b84aa26613820d7cb7766aeaee389ecd89a1fd0347f6f9db6097c20000000002000000000101258bd1fc389b2c9c098f5f71df8ac53abbcc7916307126daba4eba0c410c5deb0100000017160014d38a9c5713180519792552ba44cc3fd3c82060baffffffff0322020000000000002251202443e9c0792b8096a5a667c943f8f87fbd9b2c66c8220f7a0f6a158ce9f048434c9300000000000017a914168536a3f0b5cc268a38105f9119c6421248c149870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022021803b8f27d7af8b4e1fe45349c07ea5c148881a3f7879401f8ebc0a7122a76e02200a83b59863a446cbd2ad4010bd1f8d4d247d6c43eb2a0199673e3921fe2f261b8121026353ce47c6b84aa26613820d7cb7766aeaee389ecd89a1fd0347f6f9db6097c20000000002000000000101277c31a71497b78d0c74f48dd004f97084c790ed85ec02071e0b4af1816055520100000017160014d38a9c5713180519792552ba44cc3fd3c82060baffffffff0322020000000000002251202443e9c0792b8096a5a667c943f8f87fbd9b2c66c8220f7a0f6a158ce9f04843c88f00000000000017a914168536a3f0b5cc268a38105f9119c6421248c149870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402201b6b6193edaa59d7f6689627acc9dc9f4a8747cc27434edfb681a54b9dfa7ed602202bc5ce86a68f62f636cd5f14f555ff746326c60ca80992faf9e05c8e65ed085f8121026353ce47c6b84aa26613820d7cb7766aeaee389ecd89a1fd0347f6f9db6097c200000000010000000119385e43e5d69ce6dd8aa465cdfc897c80782d1b44fcc07239bf17e000fdf7db000000006a47304402201cb7eda9f17db1dc5d63d71b394642fc6e1816c1cd81aaa28fbf3c73482814df0220617742da6363bb73e2d90117380562095272db58b986444839029a73c08fbf7c012102ce96cbb4508b6555c0968a90cc2e24e511e7431e78e69a04144f5017390c9612ffffffff0150dc0000000000001976a914655b68715774105f48b475dc2a15026ade9e013e88ac000000000200000000010139b5c2a51992d22f2d1f10a6a2aeb92e27b0dba52b41a4569c36f9dbfb3e2c770100000000fdffffff012202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa03405f9ce3cc8484cb24309c1b81074697d8e70a8c38bfed7ca2df41d8cf4a47ed63b3aa1d7abc1d25ab293bd371195daa18c43f0c9cd02e3fb798949bb6467f6ad87c208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2230786274222c22616d74223a2233227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e10000000002000000000101e929da9b15ab38d0adc761cdf44bd062545e320726e1f6b8e0ff4076d8932bb60000000000fdffffff01220200000000000022512031bd4fb361630926043c768619f483f25ca4c10d50950ff0f3828fa4f54bb6e203403e11919a39ddbf63990e46c69750300a653df54bfce58b85d05038a33a415a345abd62019ba796115f45ff5b73ebcdded0a4da790be4d415e46dbaeba4dd651982208942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003c7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a225f736174222c22616d74223a2235383137303638227d6821c18942754610ef4746a100ac0202a8cec161274a125cc7c919645aa98be38322e100000000020000000001013486e91a04d3a82f49afca8beac0ddef71fcad1ca9ea804fade6ae68bfbb767700000000171600141b0a00d4353610efa628b6d3f91a4de87d378618fdffffff025854359c000000001976a914890ea047f979620cd92fd471537cf16f76b55bc788ac888b0000000000001976a91464474e316c7263da7d417ab3c51a62ec570b8b6e88ac024730440220568a1f2ba48c5fcc13b7e1568ee9be10bad9842c881364b4be08920fae2412450220247a62d2bfeab832d3236c51a1dc56164bce750ccef9880b77371741b30d950e012102b5b1cb6d255ff8cc2c3e220a861d719fbd08699c5f4fcda0aed34ab46d23e28ade682700020000000163f6965dd92b25327ce27aa94ad82662692033c70077f96f5914bc82b294a0d4000000006a4730440220123f8ab163527ac7439cbb84eefb6d79ddf1fb0f8f2dcb80cf21fb085efa00800220416abe844cd94a517860484be06fe0777fc1122b7d761349931403aba741922f01210293e37f2936a2b4735db82189e12c9ae6f6c76b4a6c68dceac666f6ec10d7e877fdffffff02ae84349c000000002251204e0a21b84cdaba0dcc5f68cc772fbf1c6f60b188c5e9b72792feacbe8f43833eb7ce000000000000225120a180be2973b95d8505b0497334d0c4b4451423f82da0f0b5f45d2b2a3c3a7aece3682700020000000001015965cbf2afa485e20945c33e24e38dd08317850fa3005465d6cc4eab6ba6f93b0000000000fdffffff02d9f3339c0000000017a914c2b2aec6aeec8b6ee000d482dff63b6a66a2fdb687519000000000000017a914e798197993ec93c022b34f20d4b1d518307eda62870140bd1af7d5956c6dc6a179cb4aaff575a94123a8bb158af6592f1882becf214ac6067253d32425a97ac12994638755fc7c070b571e6e9f3be83387ea2db046af72e3682700020000000001010c9828e46bb1051a8dd83ad0c56e1920f925cea3f7b948e1ab2b81d4596eb6810100000017160014fedbb9b9090823417cbe9eb3583a5074c1af4ad4ffffffff032202000000000000225120b57a1432fc4a57eb3efa6559884d886e3d5d8d81c72097f225d966713802eb67cd8c00000000000017a914e798197993ec93c022b34f20d4b1d518307eda62870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022026346b7af4c55584c683113d0ffe21e34f40946ad243dca27adb5f161edace7a022002f00c26861ebd7d3107bc55c4c3e619d72888bc4d342706053b819a14cb2711812102fd0bbfc659ec690225d4933d7549b6c2dfb4337c8cfc7ace7a8c188fa5c60cc90000000002000000000101b9a784afdc0e9be41332652b69ef216a14532b3e4e7f9c291e4fdbb377a906150100000017160014fedbb9b9090823417cbe9eb3583a5074c1af4ad4ffffffff032202000000000000225120b57a1432fc4a57eb3efa6559884d886e3d5d8d81c72097f225d966713802eb67498900000000000017a914e798197993ec93c022b34f20d4b1d518307eda62870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100ef233a624cb4270b783dd1e10373072dfd2a0a5b6db5149b5d638f0beb5deacd02207843bd824d5f2c734a2d49e6acf91db6f686e3e8f4746ecc8c51f3cdb274475a812102fd0bbfc659ec690225d4933d7549b6c2dfb4337c8cfc7ace7a8c188fa5c60cc90000000002000000000101719567b66153f6f370731df1da46e834f3addff29154a7f38f681c0025939a5d0100000017160014fedbb9b9090823417cbe9eb3583a5074c1af4ad4ffffffff032202000000000000225120b57a1432fc4a57eb3efa6559884d886e3d5d8d81c72097f225d966713802eb67c58500000000000017a914e798197993ec93c022b34f20d4b1d518307eda62870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402204134c49bcf37697777de9d3eb9622d3d2147bca08bc09d74f5808f969a4d4038022053e0fd93b4b5a5f9c375fe85ca6315b9d84e83c627a472620d70961419ff7597812102fd0bbfc659ec690225d4933d7549b6c2dfb4337c8cfc7ace7a8c188fa5c60cc90000000002000000000101ec3c47a84fc20fcf1dcba5e8de3d371776036a0e73be175ec5766f8065e25f1b0100000017160014fedbb9b9090823417cbe9eb3583a5074c1af4ad4ffffffff032202000000000000225120b57a1432fc4a57eb3efa6559884d886e3d5d8d81c72097f225d966713802eb67418200000000000017a914e798197993ec93c022b34f20d4b1d518307eda62870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402205c14ebe01a6958e90d7c9242f706cd2270b61b3926560389b482e2865b163f29022058e213cef0f990ccd0ba51ded4d876784c87302559328b8c469c622f3227a66a812102fd0bbfc659ec690225d4933d7549b6c2dfb4337c8cfc7ace7a8c188fa5c60cc90000000002000000000101a6194fd957a7154683cd6dfefc4013816e4df7e09d04fcfcef4d5f14b94b45890000000000fdffffff02a1e48292000000002251203860e0e2359da668e7d3db958d2ece4c6acb8a9e197039897eeb960e4757fab09080000000000000225120b6d16e25aac297ba7ec4a254d03719685c77dca9e7e49a292f1cc9b47003bd3801404a843e2635653cdfed2819cf62e77aaf7c9e2055dbe05f6a96b43da1ddd6407efcfa8cf5959f21295e0d89d4d72689a3c51b6d910387ff65503e1ec2b3b715b9e3682700020000000001019adaab1b1487482ab3b6b8a54a5c99a3e630712fde42725151adbaf31bc7b0d60000000000fdffffff02d21682920000000016001440dc4be122eb120230969d874166fa96d3b5d3ca4dcd000000000000160014657f6330aae4c0739dd29b60c6b2d526893a4a04014084019b1603431131c6644a02240a8c02ddffc01c9a4a0faf1f328629ee4400ef81eb1ed657a74f77aeba2dc9929ba446f5f74d08da94f79f4f803779e353c2ece3682700020000000001017e63fd54ab759d1acf5d57d95f412b07e682bf87f3295be95c8c422e9eb41b6c0000000000fdffffff02303481920000000017a914b8c882813b20a70e96cacc1eb42fa56e22c6ddce8713e200000000000017a9145f59beb7b125aac2bcb9e50e2add1deebb604220870247304402203bc93ca93fba7d9346eee551cb1df82b7a49982bd554191c0b2f2149c3ea99d302202b642dfd23d142c3e3ebeb34b29d55ac97ee85abc1f2257afcfb313ae280ae47012102b10678cbb77a7948dcc13f5876e2dd98e99732b2785b99f5bea4c744d75f373be3682700020000000001010b978d93918730de206c65a57d921314049d4e9aad00f12b2334fc42dd431a720100000017160014a02928b19cbc3bd651721d4d224155650f30d0ebffffffff0322020000000000002251206799d7e433f7af089de68323cea9d0137e211035be9952f67fd5fbed12b62d308fde00000000000017a9145f59beb7b125aac2bcb9e50e2add1deebb604220870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100961c54c967a081f3d2ea45360bb506fd0beed8669f0860f7d82588fb9f2f4e6102204ef7faee270a859b184c9edfda55cb54b6ed0fff23fa7fc5d3e335297b0a32798121033591cea742e3b77338d509c5f01b100eca16f6225d466e0a78263b905a06330b000000000200000000010197cd8b0d4e86dd08e017eebcef5e1318699e1a673c6e43d6023d1f45c4eef08e0100000017160014a02928b19cbc3bd651721d4d224155650f30d0ebffffffff0322020000000000002251206799d7e433f7af089de68323cea9d0137e211035be9952f67fd5fbed12b62d300bdb00000000000017a9145f59beb7b125aac2bcb9e50e2add1deebb604220870000000000000000136a0952554e455f54455354070e83f5ada6ff12024830450221008b011f3020517f4bc6ebbfff28c42bd27c3a5e48ac875f800a474f0a834fb4c202200ae65a065506de1b52dc838141df181eda6a81e2a3e70992d05c9b35605746ec8121033591cea742e3b77338d509c5f01b100eca16f6225d466e0a78263b905a06330b0000000002000000000101411e04aaa64678c96cbc39a2d7f5514098d42cb344227ab47f8421c5712c2b1b0100000017160014a02928b19cbc3bd651721d4d224155650f30d0ebffffffff0322020000000000002251206799d7e433f7af089de68323cea9d0137e211035be9952f67fd5fbed12b62d3087d700000000000017a9145f59beb7b125aac2bcb9e50e2add1deebb604220870000000000000000136a0952554e455f54455354070e83f5b0eaff1402473044022014f15a035b52baac2647e7a973fbfa06774a279e480b3f30eede84f03c64a07202201a8626f37b953bd22677a0f4ef688c3af0fed8bb7f535ab0bdab6cbe2f938caa8121033591cea742e3b77338d509c5f01b100eca16f6225d466e0a78263b905a06330b0000000002000000000101b5464bcfe61d6d1edf944b11b7b60c5eb33ba5e2252690155be87ccd0625d5c00100000000fdffffff02d5a900000000000017a914955ca286d2aa9ac1eb345dce35a04b196bd0741487ab3d0ea00000000017a91401422873029b42553b8472d88f3df04642204f5f870247304402201869fb9d6b9b57a3292696a702d76ce23a874f522e17c7d386be41b190f8ea2602200c9d33b11733014a63b022edd1fa2e78a9a160daf7fb0d14dc274586b09b62be012102174537ff537673e0ecd92f1974c5c6626b8fc912c4b38aa985471413c2cee908e3682700020000000001017086bf3c4f9dc04bab6d5a645fcaa1ce3a784d50e08cd1062d57b82856e8530e00000000171600143ed292807c198de2e62c923b195750cf1f454544ffffffff032202000000000000225120149b17958068a39e891e4fbea24814feb956d305c3eaa08ffaf1804cd884465051a600000000000017a914955ca286d2aa9ac1eb345dce35a04b196bd07414870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220124fea200232fd5e7169cd82908b02d12c144928e58de812ab99fb5bcb5ea37402205b9a98d8b40a3f06fd3ff761d5d0b4335bd4faec1fbe9f3b661647a7f0bbe8588121033d6ad0ea10bb4459f3ca6c966ce7d4f01a6b0c0333bebaf60c18613ad258ce1c0000000002000000000101bcdec7866e97552d92b06b31e8d0fd945c59779a3a0f23dccad88be0d31ed0350200000000ffffffff04d0070000000000002251208e23bff399b8c7127e6cd6067c94ab2635654a885a7feedbbd9ba09edb6903bad0070000000000002251201dd25989bd9bbf1a2c894c40c3c742ce6285a891515dcb0ed50775202fa08538d007000000000000160014d1a869bd943b85ec581d0c1f0c1ddf36da7a5836bc8b1000000000001600142ae923216be2fa1b83669e04f5794f79a71fdec90247304402207fc43cdd4a470a500d85cd266927c8058bbcea1b157eec841fed065851a652ce02205f8c38232939aa537b4968f09fb6b5bb4390b10f0c6e6d2bed374d7b9389f3080121035899a5a1c1b948442aa4ea31b509aab788ba3b578132d1c1dcc12aafb2eff688000000000200000000010161b94a73685cf4f214516f0066151c0cf5905659016bdfad594e19ab368ea8af0100000000fdffffff02d5c100000000000016001450ebd505e5933a0bcea779ca7db9000e60dc3178852cf7db00000000160014d6f64d21aa98518d57fbd59c61cfbdb8277addc6024730440220654b753dbecb131af0d4f0ebdb8268176ff596b8677a236c99f60e97bc5b698202207ad1afc274b782d0b117adef21d06276199f2bd86cf79c55ceaa067bc21a9b90012103a624ebcdf4cc3d3dc12306125bce66750acf3f5431556c5d3830f4c2b62acb91e36827000200000000010197411c8824804f073e38dd0f9d225d95c61f827b4fad00cfbf0177daddf466890100000000fdffffff0271b2f6db00000000225120df96840750328a604aa9251c7c9f3343679ff0ccbc449d9e3b50a801073836786f79000000000000225120a6dc4113e6b96ea8f05dac04eefe75b87341bcec992a96b99110a77b75dcd0da0247304402204aa53ad27706b45930928112c171d78707b7e20a9b893b8f1f6ce269e4246ccf0220288f277e12f7d4f0d7c696f4dcc8bfcbf6a4d60a11a93c1f679b9a6cb9fc088101210352a1876223b0062ab5515cf1cb3df04a9862020dadf71f5bab5982362f91058de36827000200000000010180c2b577f45d1e85885599df962560c4ed93e1a46830fe340adb27893704bb360000000000fdffffff026e8c00000000000017a91424dbcb52b1b23172f148e86220ecdcd8855a9660877f25f6db0000000017a9143dc6c479462c4d77eeef2d0afd33dfb0d67475cf8701401f094ab8cdca8bce6022ed13d5e6a1df5d01a805ad2708757d22933d776751e03f04276e501af2ef81f3203761fbabf32d08c77c4e7f7b388b3fcc333b891c71e3682700020000000001019e1bb37a16f0321eb273916feb2effdc6879fad9c1687bbc0746465e5866ac250000000017160014b52211d69c4eb9dafeb0f9294e1eeb7f1c36c733ffffffff032202000000000000225120bca0e07524181285cc87394b9933c09681049f94e1ce769d269dce9ef6b70a6dea8800000000000017a91424dbcb52b1b23172f148e86220ecdcd8855a9660870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220536a8d2575270a4340211b4a182788fd6a412d28cb81bf313be7c4c86f8a31c50220430215726bd8eb77a73d431889046b62966874483013da56a3a973505b75ab6381210364463c2fc65d06ae54ca01d4ad728a1208edaff09c06ae7feaafb7cfd39c72f40000000002000000000101d8645f34dba9c8663c6b0c2312ecd6e18fe2890f53cee32edad5931eefd4800b0100000017160014b52211d69c4eb9dafeb0f9294e1eeb7f1c36c733ffffffff032202000000000000225120bca0e07524181285cc87394b9933c09681049f94e1ce769d269dce9ef6b70a6d668500000000000017a91424dbcb52b1b23172f148e86220ecdcd8855a9660870000000000000000136a0952554e455f54455354070e83f5ada6ff1202483045022100ea9fc1a362e896563737e5bd1e62f6e1cf519f9309e9eeaee9b97d41a22def6702201b9d605bf70a74622f77c3564bb9014b55846604c3163c06ff7cf69d3dafd98c81210364463c2fc65d06ae54ca01d4ad728a1208edaff09c06ae7feaafb7cfd39c72f400000000020000000001017851e4baa6be00751036d5968be48489a7c1ab03e5c2c9e8c1d0d53e312ef7440100000017160014b52211d69c4eb9dafeb0f9294e1eeb7f1c36c733ffffffff032202000000000000225120bca0e07524181285cc87394b9933c09681049f94e1ce769d269dce9ef6b70a6de28100000000000017a91424dbcb52b1b23172f148e86220ecdcd8855a9660870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100fc3deb3b989287b05eaf819c9573ba4f84738a39e968faa891c793483e26335c02202a90a96d07ca460f44f5761af5f934be68ead977170d67fc3002e51d8d6316aa81210364463c2fc65d06ae54ca01d4ad728a1208edaff09c06ae7feaafb7cfd39c72f400000000020000000001010046162bd139c4fd13971a109e26e746971ae0a6af892165a8217b9353ecced70100000000ffffffff02ae0a00000000000022512085e782a372cae0386e3b51ad6e070e0509488033867cac0131ad9d44176278225f44170000000000160014ebd3e4b0d67a1fb18cd43ab9e96aefb06c631e5902483045022100d099dde13a685bcb2bad7fd722e959caff25257ae5bab616559509eaf245b5e1022023b130b2169fc9b4e129a5e189ddeea66bad82e78d3665721b8d9f68dca9644e012103231eb2c45a56c3603b7d46b006dadced8da9e464e696a9a0001a7b50214eb5e80000000002000000000101c968d1f9569749d9151d94b8690c611d2890e7a3fbbab4aeeb212d03d03067970000000000ffffffff01d00900000000000022512004d214d3819fbd3ca8404c0807389ac3825dfa6b53bd434647fa41b1d841d5410140259a7acf3b988cc7efd16a57a11f43526e79a5eebbbb1bd12b28f4f26e60c8f34e7e660139e1599052e2a2f87270b4dea03f23fd8342d2c521a3e4b7ab1ae80000000000010000000001011afddc0c314043c4f9c5f84d9a177c4f3b5926820a7d70ebae7c76e7061b24ed3b00000000ffffffff02d00700000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be200300000000000016001400d1527ad1abb69486db5e58910bb23c8ac28de402483045022100a3c5d0972751424a45c114199c72df4273a6282831c37bd41249cecd61ff215a02205e76a8f40a74a6143272d93f7998c03c8a1faae94fcc11c3a0917a57d4c04b5c012102019d4c74f03f1813329c940823f3d4c5bac2e667fd8eb7f2c06e6049e4cac3570000000002000000000101849c0cad4729ff592309a764b08554896f1f2fc0c88f94936f6c120839b373240000000017160014b6eb3f86dcc15cc756c9b22f95eb3c6fe2e49f29fdffffff027781000000000000160014cb9773cdf53741016878905a707e85633354f11af4345fae00000000160014327a0f9bb2c664032a8df344959af4f31659e53f0247304402202cf8609850415339bbc8ffe01a5ebacf5c4467ddf1937bb3d0b336110a7683b402207979758c7f0e95c49e43fa5aef1d5bcf3774961f3b36e005e58abe77ee0e289f01210337af593635ef8597b0809d00ac8565952d745e6494f2de15ca49a97d30dbb3f9e3682700020000000001012baf801d7d93e5ddb0eb4692f0217235b6f75e7ca0c10891fcba75234b48a3630100000000fdffffff02c7665eae0000000022512071c9fcece1b8d27efe4e3306225a3020bbc6a049069ecd3e54b40fd812cff0b888cd00000000000022512009730319d4108663c7bad3ef02f24de7e5e6fbb9d6cd1af929e0d1141e3440e40247304402205cb8667f2dafa7b6906f417929ab5a2941c99deea42756be600c93098cdc1c6f02206d9164be03edbd0ba403b5b2c164f94ad74398d7e3e536dece4424bd6e8aa9bc0121021c3838c0dbc36d74a75afe1f488b1514b28f1aa839b534b7d63810dad5d80fe6996827000200000000010156202f6ecf7224bec334ead74272a9035d20d226ad46c46e16c36afacc743e9c0000000000fdffffff02efac5dae0000000017a91408427fa2d0102dfa93f09cb8de93c3b3d55dc3628754b900000000000017a914e617249f27332f57daa04a938eb0887f6256d54287014083eacb3e730430118c97a8a5a6f049dbdba3e09827fc672868f52aadae62e371dd19d42f647aa175d95e050ed464255d5e9cb7570c639b9bd0dd81c5ae84795ea6682700020000000001019ee883ce39c5dde9d529d69ff7fc862c2bed1d8137f6415c404ddd02c5d5b22601000000171600143f2c56ca41392c61a62874fe625a616ec7363f14ffffffff032202000000000000225120ed52e97f441e1441e95ffab919429895154b81bb05b70d5e8ec5b084ca184553d0b500000000000017a914e617249f27332f57daa04a938eb0887f6256d542870000000000000000136a0952554e455f54455354070e83f5acbaff0e0247304402203d2c0a06fec6f7117f18ec3cfc3738d907080f0195e7840ff0fb8a8e2f8e767d0220117db55f75049fb21769bb22fde7b4b30d0143b826f873da1d760faa249e55c7812103df1067d54b1b2f43f7407aef386054543153c28cfd9496d7b36022fa5640f4b4000000000200000000010110a12fa471e62b1d9c9be46f8509a48e33ddde1938ba67d072862188bf7ce22101000000171600143f2c56ca41392c61a62874fe625a616ec7363f14ffffffff032202000000000000225120ed52e97f441e1441e95ffab919429895154b81bb05b70d5e8ec5b084ca1845534cb200000000000017a914e617249f27332f57daa04a938eb0887f6256d542870000000000000000136a0952554e455f54455354070e83f5ada6ff1202473044022033bf8dab528cb2df3bc2ddd36e0e304adf7757176e7d7303bc6a7ebafc6280a5022059f7433c620d819125a107ebf03fdcc1d86d5495dc058b13f26c21f326be963a812103df1067d54b1b2f43f7407aef386054543153c28cfd9496d7b36022fa5640f4b40000000002000000000101f40e59a7e9c3ea13d0622dc338f8a4dbc9d281d19e91193bf8addbe6f4df617501000000171600143f2c56ca41392c61a62874fe625a616ec7363f14ffffffff032202000000000000225120ed52e97f441e1441e95ffab919429895154b81bb05b70d5e8ec5b084ca184553c8ae00000000000017a914e617249f27332f57daa04a938eb0887f6256d542870000000000000000136a0952554e455f54455354070e83f5b0eaff1402483045022100dfc6851e3e815748a54efa28835d4abe376a76686fe0040f0399fffde2a99e6102204d1633005d3e579056261936ba3368b2dcac9cd03e687af80902eac8bccf4403812103df1067d54b1b2f43f7407aef386054543153c28cfd9496d7b36022fa5640f4b400000000020000000001014dd8c4c9244b7ef292c7648af6ab59402fc7798e53eb4ee777406c024b2f2f2900000000171600144a0329754a8ecf2b6e350865839756c866f68041fdffffff029df030ed000000001600146ea61d3e53779408a9e5ddf6141d87567e05229c824b030000000000160014e02680db479fac4d9a078aca081c25905501eb10024730440220274c47117f4b70789d10334abfde5283db7970073359e50cf2fc2bae284cde4702203554831a1ec0522946b260303ab2363725fc926eaea8e80e6125d1c9d9c756100121025e5252b900d80be98e892f8a8cb1d95f8b05bfa35c0a4e955eab68464e4cf300e368270002000000000101b359e72aae0f2d62fa6079ea9c46ef2e3b23cf41203b7eb8a862a09e2b8661970000000000fdffffff028a2501000000000017a914d36fdb707d4cfe0866f7cb373968c73ac4dbf0798784ca2fed0000000017a914d8dd03a5c3b292b30a870f2f173becc19240a1468702473044022077ae5d9426ae59673a37073338cd84818017561677bf665d67d61fcc515d1a0c022062beb31204cd7f5066a13f64ca78c4044d20f7b0633e6f22e741c5da39c8ec7f012102af282ec82d9bc8aba81dd97e373a6036333b720bd409b6986531bca9de543a3bc768270002000000000101685b0bcbb8b55b1cdf1d5372a939f75b32f9102f445a1c32cd7db05e475f73670100000017160014ebf6f65cba6e534092adcf2f089cf11d3a5bf919fdffffff024a272fed0000000017a914867cf3e66a567da681bb20c2ab98831281744ebf8794a200000000000017a914a5d4578ffa92713e303ed94267d2ab469ea5c541870247304402206aa1fc68ad9ba38bbde635489769625567644f7202d6fdcb4b27ccf44346fcc102207bb299551d25e1915d9dd7eb03726c641e3f8a017eb1288c02cb0c75c651b283012103daa8ba1d99e096a3c59f504b137b20d8757c327bf348db4f2a551f435fee8ba6e3682700020000000001018d5fa276ff2604fcb6fe37740b0f04c4755ca3c191cf61510d163c5d60bc32ea0100000017160014a784e398165ad43f19cf9791ea2376a58f59d8c8ffffffff0322020000000000002251208032997cedab4dbb1bd73fa02848737e0bf4efaf47a23915d1435ab9e8007b9f109f00000000000017a914a5d4578ffa92713e303ed94267d2ab469ea5c541870000000000000000136a0952554e455f54455354070e83f5ada6ff120247304402207bc9bad2fc5a1f298f6bbd60d65ed32e1a62672833d2b877d655b98f2ef6802202202cfa5f8b12feb3f3345b9b32487d37aa45f3c65e310f749a6b0c26cefc445ade81210325bf6cbfa7dbc16b71acf748d506211189e25c45512c6481269b32f59a60f14b00000000020000000001010672a31450f97baf38f6d6ee9041b7c0b78d3e68c66f3093582b10e62fc915830100000017160014a784e398165ad43f19cf9791ea2376a58f59d8c8ffffffff0322020000000000002251208032997cedab4dbb1bd73fa02848737e0bf4efaf47a23915d1435ab9e8007b9f8c9b00000000000017a914a5d4578ffa92713e303ed94267d2ab469ea5c541870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100ca9ed8f32cf7a2ec6fc1d009f9be07e9d50a28aa3a35427c6ce1f3c3a89139a60220240ce373ae6482377940cba952ccca9e02b6f5fd377b32adfb46154e9680eec081210325bf6cbfa7dbc16b71acf748d506211189e25c45512c6481269b32f59a60f14b00000000020000000001018016a8efb7ed4ad6b23a133b5478f4ed047d00d7aac3743f9acf780f4fce81770100000017160014a784e398165ad43f19cf9791ea2376a58f59d8c8ffffffff0322020000000000002251208032997cedab4dbb1bd73fa02848737e0bf4efaf47a23915d1435ab9e8007b9f089800000000000017a914a5d4578ffa92713e303ed94267d2ab469ea5c541870000000000000000136a0952554e455f54455354070e83f5b0eaff140247304402202299c7bc88babd2b038c663bff1dbd3d194ddf3ce710da1d93d6172f15d668aa02206a7a3e6b7767e42ef7fb54f23310fd582cceb1bc64aace519a9b20557c1e83c581210325bf6cbfa7dbc16b71acf748d506211189e25c45512c6481269b32f59a60f14b00000000020000000001013a09bb192ffb6a608e91649d93f09fba65a1a0c023d1bca2610dd762e65ac7080100000000ffffffff06d007000000000000225120f2ba989f753ecb92b6e626d8c5a38fb704030d2e0265a570a737c8cc4a55bbf1d007000000000000160014fef2f389ea2cbdedcbbc2ef6c4202413d8c81975d00700000000000022512051de72a681174eefebba0cff38b509c404c28bd7d21079bd659bafe9cc457562d007000000000000160014ab606dbaabf22db67240c601d048ec69cd1b85d9d007000000000000160014499333977e3fdc8dd5c90d836e2c0ba5bb8a2d8784581000000000001600142ae923216be2fa1b83669e04f5794f79a71fdec902483045022100e79b86d9a67b473e75fca80d13c7ca2a38f0e90906f018bd376e455a24dac444022002bd6b5bf393b9f1855ca823d0fd8e09ca6dd332822856791abfc576655877580121035899a5a1c1b948442aa4ea31b509aab788ba3b578132d1c1dcc12aafb2eff688000000000200000000010164d59143315019dd41e2725a92134651a7b41e7f6882d5e36d862834ee2283b10100000000fdffffff02323bb81d010000001600146cf5ab321d17a7ae9d521a079e14e24215613891bee800000000000016001446494ae23547e77167e604db5c2ead0af913efae024730440220717c36ac5e0ed38bb34cfa803d2bb757014fb06074d84f899390d78b40ecf3aa022044b507f1903b7e74647a50f8ec3bfa886630ef1f2312cf8ba6df6bca34c02a8a012103ddc63d0d4b203197ced4a28f1c147a4002e0796a22d50ba2b79f65cba716ade1e36827000200000000010360c548ef8ff605163f83269a0ec6662af90a68f8da21dfc9bf1e3e806eb1b1140100000000fdffffffebb7fcf68dd44872f03cdd0f9a84f6496f18c7fa51041d14ed242329cbde0d120300000000fdffffff01f285483e020adceb0c6a67aea803daad2af873df0bf030504ed1c98028c6540300000000fdffffff0360ea000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c26000000000000000000000000b471e11956fd3128555fd624b1a5c920688e7a9502483045022100c2dfbb3dc26adfabca6aaf9261edff41dfa9e8d5d7e73f75e7029db605b35ebc02201a1dd159700ca50366c3b381979e1f3c58a9a8edcde1dcd22e16a59f147b158e012103cdb37485e86ceaffb8238c24edf6dc7e17f6b95763c5b0bbbe88f01908648ad40247304402203864535590aff8c82c9ef73286d6750adbe47e7a64654ef4d5fc430cb7afe9e3022075d76b085c03858bcf6a2209463c62d3f79aefc40a4d9874f84f5db9b247132b012103cdb37485e86ceaffb8238c24edf6dc7e17f6b95763c5b0bbbe88f01908648ad402483045022100f93a18b5edb39bedbffaac136d9ebd80186948580f396c6b402173db2cced9300220724dd0b67c2afc51f3105cf19dc68ce41252f2b3b1f36d69d4263a31231eb7ad012103cdb37485e86ceaffb8238c24edf6dc7e17f6b95763c5b0bbbe88f01908648ad400000000020000000001030b2ff682919008d77c6dc2a31bd81bb53ba43592b7d57b741911661c58288b0d0000000000ffffffff1309be39f0daf9dd0d0d35f31647d87166bcd193c7b802473d9849f5ad90011e0000000000ffffffff364cc8f9923d2c250c6e99ac802c5a9ee68e65644046d1b0ad66f702d90ef36d0200000000ffffffff03220200000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab42202000000000000225120ed58240ea1017f72a39dddec3815f85268ab282207e83a1ba8c27a2baeab87aa0b3400000000000016001499ada90c4daea45a508045c9650fe3b8ba9d5ab40140da6b769edcc5f81b694d557d1a172b992ef8dfc9dc03ee6cc0d324a89e87674bba182d031b05cd704548ee7158bc0980275093e9ade46bad8e36eb00134a6e8502483045022100b89b97e0c1597f6c2d5ffbe5d6258f178ca8a6b387fbd32c650fc571557fc18c02201474311e997f323874c59419338bb4c21049b09b693e067baa1d4fc26242c7ea0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc302473044022044dfc8e702fd12512aa8cdfc21a2fc615f6cf600689f1fb1d6a24ce3cc2babb50220323ab17329942cd7534b170602fde8fbeb5aa5af20a9a4a58571f9cdbd92f34c0121021523461cb87192c45d8efc5303e8474c5a4e725420f7ae0d958af54cef5d2fc30000000002000000000101d1fe0db1991885a50bde7f160c6b4a3953982c79a11111a1557a79c532877b270100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120c4ba6394b7da18f6a6211ea52e6dfee5d1b1f3a0df6134c5313a450a86debc53de8300000000000016001490871e3a372d8ddb783d775f450933aba0df0f7f02483045022100eb569a7120f447d1f6664d5813e0e51850c71383bb8edd127663ca9f7f277a0102204e189df1308597d9bbdbb19b01517a19a6ec21d01541671423dd2063e8977538012102ce22d7ab2b44db123037b8cff40afcc5f07434a1f1c7288be63dbcc32f37476300000000020000000001018c90530321e74051bfc736bd0990bf019573153c1fccf4821305d53ee29585360100000000fdffffff01bc0200000000000016001490871e3a372d8ddb783d775f450933aba0df0f7f0340aece4678412257df66644476f11d6a325b8c4196eef16931588752c5c9a8a439701658ac25163b13cd7dee670806e9c544bcbf205e28d0877a60e7dd79cd56bdb0203471a3e4ac331b942415d04703de1212aab6d8a0c149b442284e385200910f7dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c03471a3e4ac331b942415d04703de1212aab6d8a0c149b442284e385200910f7d0000000002000000000101e6ec1214757455a5f7495c979d9ab0a60f3ca7e6ecef86a582dd0c4f633bd68f0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251201d4ca36703d5f47c58517270b4fabcb40b7234b02d5dcb44513a7452e22f7e4982770000000000001600145fa6d652e03052fe705519e0b987f4d030a2d7ba02483045022100800c2e47b37160f6ec1310a9bebf66a1dc77553664499609ccf8ea9beeb41eb002203faae9527f57fc3965735629fdc855c95f2fe2fde04ea2cafdc62bf7c3bc7bc9012103e98d03c4744f148b9e1e85fb6a683c7a957f5e97c7827a83b1bba502c0fad05e0000000002000000000101754d858d0066ec20d843ec984cf17be1c91d70ce85fbc6dc4c25a8fc149f9a1f0100000000fdffffff01bc020000000000001600145fa6d652e03052fe705519e0b987f4d030a2d7ba0340303ffaff3e2d1f082b1ddf5d625f9d9b1e1fd10f8be78459772bc870a6b1e418190dc220e41da1396dbefe4e5337d435665ed8721fafbcb409c3ac413f8f51edb020d56717eaeff8ce9195a4b59a0d62e9824719d4a4e540a06a8eb25f75a317af72ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c1d56717eaeff8ce9195a4b59a0d62e9824719d4a4e540a06a8eb25f75a317af720000000002000000000101582ba395910f10e9b60ed36aed61820ce0eb6b6ce27d7263fc87a5ecb5aeed2d0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120eeed5662d113bfd41666d0cc8c9f0cbb59697ee37acc50058bd3d159f74a20fb827700000000000016001457b96b69a0766c74b92f181e14216e7d22b4cd950248304502210084ec9df14dee6cc8fc07d0dc9deacb96ccb0cfc186d78217ee2a8d41d83602f202203f3c72a3530aaedd79e0be5ce186b112ab9e690f1852fcfed403401505380513012103a026031a1f6a88b02ce19f5c9172b536a05449b06ea3fa1af8fd85772ee36772000000000200000000010122493f7e0f01a3336c986b6d3cec9c59386daef95f9844e8a4bdb2d7956048cc0100000000fdffffff01bc0200000000000016001457b96b69a0766c74b92f181e14216e7d22b4cd950340322a046a626faace93a13c9ffe0c439d1b87b1ead0eff627a62a9d956983c1b5172ed643616413aa717c769717b962b564db3d88ae6d3c07226be08725a19f19b0208c4e84e6c599d7cc5d17a65565461ead4ef84e93be32a8d0822f4774977a6848ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343930222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c08c4e84e6c599d7cc5d17a65565461ead4ef84e93be32a8d0822f4774977a684800000000020000000001013c36d343ad8eb9e6ed9d65c8251b608578ed2a56fe22727a059bc5d1949533510100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251206c953cf024dbf3771132e2c504115de3da6f5527f20cdd1a47bf73d32b89a82882770000000000001600146ae563c35fdb846c12071c42e80e52af9b5bc750024730440220168fdb8ccaafaeadf368a5fac754ba37c55b4ff57316a823e9a7b249464d142a02201b384987bf06c54c1c895ef8cb45864c12e76970a020b89fdcd4537d8d43d05501210310d22b9558c30da9195aa6b1e9f5c99102544316d63b4908606e598e740b4b0e0000000002000000000101f67627c0073396abd13505b9da4913710372bfc756b3c2b69fdbf467d36d8e7c0100000000fdffffff01bc020000000000001600146ae563c35fdb846c12071c42e80e52af9b5bc75003408908907138bae93d5a5653072331dd1250d786ab67346d311a37196d1f1c3edf7f18dcd3a984991480b8f20d322504d90b994fa75d1426b4ca1447ebf80d83a0b02027e3ec1116508a9cf67d0395368075fc62adf0aa268b68dc618646a5b7540affac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343033222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c027e3ec1116508a9cf67d0395368075fc62adf0aa268b68dc618646a5b7540aff0000000002000000000101f2223cc7e5552f29f9e2daf7bdcb0e02d475add5b06ca42818d131868a03b47d0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120d76c29034c861bf59f9a32d65dad3796fca81125d1f9cd78b5f3b7925dc62de4de83000000000000160014b96d8b6c30ddbd22824f77e214553d85ca60411302473044022001411c3ab27423cdabd7830e30921dcf8b48cf22b8ec28e48fd68cf927bcfbcf0220554d48c1c471d542fe1d340935d9dabed24a8239c2c6855283d59a073794c23a0121022fb4a834f40a9b9cb6955bcb41e36d7bda40467fc6a4d5f12d2c476b40a081360000000002000000000101da938410a2fae48074f35ed0b523aade6ba0b1a2fb68ae305fdefaa56fac58fd0100000000fdffffff01bc02000000000000160014b96d8b6c30ddbd22824f77e214553d85ca60411303403a949222ce6ab216ee38b3b6b86a103f3c154f761897a95948f9af133e66ad098f91e7d12444960ce2048475a74589a008693816370f863ad36a74623e542b4ab0201abea82a450398c2f8f5af9475e08cbe3ab659c3f38721e81c5f107775b25c69ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c11abea82a450398c2f8f5af9475e08cbe3ab659c3f38721e81c5f107775b25c6900000000020000000001011d2e7d978fb3313bb9c10d752bb2aada35234761bae96d535feea1ea601ee11b0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120aef1afd40db1aadf4a860daa743a88002f6185d05f93188ead105e103dff0878827700000000000016001460d801094461c0712ad80312cca6b3770c69760102483045022100e4ad06d6f0707707fd5feb9500e1f8fbaa704c9565bc2734562816843fbc8eb902202d6263008a18e708d7b866bc362ab25f76d7e1c2420fba48f0790c6f49366ce201210293e4488f693961f81912439e6fc91cf689fe7e584fcede28d3e4d8c57403f2970000000002000000000101508e7cdc00667702e26ca172faeb854476acbfde562a0c5cba663e7bac1cdce50100000000fdffffff01bc0200000000000016001460d801094461c0712ad80312cca6b3770c6976010340685614b2487b3ee53480e8d7d22b150ad32b5aede53f8f5a38dd9cc5e52c4a24a5d758d8bdbf793f7d8f16d5cb43cf61020b91c0cfadf6a0c5893cc317f5a2d6b020dccb80705fe8935a94d270258362fc7e6b24838da85523cef5b9a727f5e6f8e2ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22353337222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0dccb80705fe8935a94d270258362fc7e6b24838da85523cef5b9a727f5e6f8e20000000002000000000101bc4680fe778884e3b2c1007222ca9a78a257ea159a130fa24f105f1e5d302bad0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512098828d5c0ed5829bca9d5e4ae8caa7b0fcbdf4e65986ef9b4caafa63d6be3808df83000000000000160014d804eddbb589ce7cf2229e67dbc9d5cf84e8d95702473044022057543939a86d40f0de7a0689a3332296adfef3712932607badfea64c5f66506902205d1a4281d0044b3f45735822e278c0f9fa32ca73af5406b8f7b4c47f0c787b220121037093a6e80a302b2d6a2abf48161c87d1ff9c168a83454b2a34eb4f03780d29e2000000000200000000010166f864b1862d0ac5fb681d6dc2d8e6b46414b76826a5793be953026ce5933ad90100000000fdffffff01bc02000000000000160014d804eddbb589ce7cf2229e67dbc9d5cf84e8d95703409d57d4398338a037f821a1f9748e0019be95a4d7af7523ca12d9f2ab95e2f04d73638d745115feb280ae70bb1c9170f977bdfef52c3fa82bee6557440d846dd5b020ee908ce0104d200abfeb6d07bddbab766df0aab55064885d1b62dcb0aa06a22eac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c1ee908ce0104d200abfeb6d07bddbab766df0aab55064885d1b62dcb0aa06a22e0000000002000000000101a4494da2feebdce37039d88afb52f21669533bd4f16b823bc0e1812250cbe25c0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512031c3ef6b4c70ebbf990e236bd88d5d7258a36f25b5605325207ff357252c7af0de83000000000000160014ceac157f79c2e3fb1a818d25d8c03b820a1048290247304402205d6ae2d493568bb177348a2dcd6e0e6e685e72eb4653a194b78351889f17f8de022014665fbc658826a365435d08a5fd7e9fd3a8f3c2bbea051ebbb12422d99a6cda012102f247b128cfb20cedd14a5fb6d9779e1a62800a90c11c292df1855eb7326cd5fa00000000020000000001011410c857fce23371e5d6ceeba5a03181c6716d6c47701bad5e5f1e49dad011bf0100000000fdffffff01bc02000000000000160014ceac157f79c2e3fb1a818d25d8c03b820a104829034046c57911e05d072eabb4818bb3c9007c99c67591b4f6580a2e6db56d0a8f186dbd58f86b3f956abcc026b298a0930eba329f9a6acc49d01551cd92270593034ab020ec19d60ff991ec55845cdc08473c95eaed09654be24e45a317f7668c010d38e0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c1ec19d60ff991ec55845cdc08473c95eaed09654be24e45a317f7668c010d38e00000000002000000000101e60c0ae0ada8272215a987c5e2715ee34c5b52b588dbcaedf1051b16ef6c630a0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120c7cff17b01b8308beec0d3800ce727fdb10349188e25e26c451d47d8aa1f08a282770000000000001600145ed85943ad8d4bb4c899050caff0400fcc889f4302483045022100cec4a148b59ee34e744ac76d57f8134f476cf20649d482444c1fb75c634d75df02200139ccd419cabef6fb8baccdd1d44b92e134ce02a7257be89e01fab5fdd8cc7001210279771d4a04264f61dc06636b24dcc8beda0a9936d6f332f17b43cc2b3cfa8a9200000000020000000001017ab6ba891fbd1ec70bd3bf8dcd404698bf01e74c270633064be98742bb594bf40100000000fdffffff01bc020000000000001600145ed85943ad8d4bb4c899050caff0400fcc889f4303403d92ad2921de7289200f986524c83a1e058551573287e31452082bee8dbefabd0b029ed370ee7196d3236783fd0e97fd48c48d3c5a6fefe055c42f6a880b4ea7b0200d18bac7c27da3ef66778646a876cbd3943c26eaf595df2d41486596670e1161ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c00d18bac7c27da3ef66778646a876cbd3943c26eaf595df2d41486596670e116100000000020000000001017852a1683a325508b501674fbe48b7d8e96db31d199e749ea9fada37e23ec5ba0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120f8a86cdf6754ef8d739e8aeb77494803dc09c628bf9887c47343e3074d858cd08477000000000000160014e74b5603751fa77a03a7fc72c364f8312a950e8d0247304402207a68dfd02264fe11122e85f897626e03f02c67775b8e532f7ec15d4f5828f2cf0220094f5222ad5a6827a8b387792c9cde8ecc705880f4f398c93878cdc5f4ec832c01210224e7ea0c0878fb685b49c0696a7a9e8f1ef4745e440fbdad19eccb5b4d80fe5d000000000200000000010130888dff5551805b2c1bb167eeef60ffd5e9842caf94269bf2eca35d71037ea10100000000fdffffff01bc02000000000000160014e74b5603751fa77a03a7fc72c364f8312a950e8d034021cfe4f83c9981710319074992b20140a18f25a3d863a5bdb58a3e8734599015c92d1689e05e6da74762c20238f5d7ba37f63151e24f4c577bed1f2ccd925f14b020f411dbad7e76b633643c7fc8a5a60941e86cd186aa6b0959ba7bded1bbaf879bac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0f411dbad7e76b633643c7fc8a5a60941e86cd186aa6b0959ba7bded1bbaf879b000000000200000000010173d0c59fe5be3b038b8a421e47198463a632ed875e3829ae44779a2d02dcca560100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512082be762091cfb44273ef930896ffdb13f3f4852f209558f4b5e91cb4a6d5a55c8277000000000000160014d8cd9c01e21fb321a34f3df9dad5b16ab8d4205602483045022100b940dff78b601d323714d1b796b7d4d0b3890e2a33b5c29f7b5f72f84a4088e002201ccd9b69560d8ca7f32ca4b263c168882e35597abf34902a42fc8b67e63e5cbe012103b7a7c531e8ca760510c9b3cdd0771751536dffa40ed86f1dbbceecd80f6f1e850000000002000000000101237579c7a3ed718fd69f2d7c8cd32db0ebb937e4846e2b45097509b0d99295650100000000fdffffff01bc02000000000000160014d8cd9c01e21fb321a34f3df9dad5b16ab8d4205603403cc50a4dfb7afb12bdf146caa7e387443e691657f7f5d0b209407aa0b75c12fe16e9521fedc6dea88012d7d458a1ea9fcfd3cf4a98a348900160f13489e9079bb0200a5bb43be25a81ce4c45ddb24f0d30239f21c1f4c1a756240ab8acbbf70bca17ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343833222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c10a5bb43be25a81ce4c45ddb24f0d30239f21c1f4c1a756240ab8acbbf70bca17000000000200000000010135c36349f1c1333da3e65748a19c98794a7c72507c34fd7306ed5768ed4f18ca0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120ea74c66cc83ae992ea093b067d62512883e8b50c98697b4c5e17fce4180193988377000000000000160014f9a11bbd1789d6e3731cc81d0549322816ec555302483045022100a4b51f5e95a9e8fae13256ea9dfbd294245c37d3331b7da8dbaab1992bd2771702206ae94a3adc3a8e5f30ad544c8b72bce6890e273d463924e26f9fa6b467a4fc22012102e2434203fb9c2a25844e5f2039f724b34d90318f3c435013401f26da929fd36e000000000200000000010109de5b6498a612b22ad30fa2a0409bccca6f3a949c4f86706ca858b89d96fb360100000000fdffffff01bc02000000000000160014f9a11bbd1789d6e3731cc81d0549322816ec55530340540d46de0ba977acbe8eb026f53c6290071fda0fafc89ef1f44e6fdf4e201298b53059b487374b0f9c8c5f5f05e11f15becfb184f969c203cf40bbc440d3b24ab02061008ea960a856456291e169ff653ca43c65af0f179ee2edf7936b601072f1d9ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c161008ea960a856456291e169ff653ca43c65af0f179ee2edf7936b601072f1d9000000000200000000010183ea1dea83cefd32706270a134c1428fdf09c2e9d9fb64d15b320d9d22b0b11d0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120b5917f62223eee19e6718cca0eab11a078d3a6c208f50207f44a04468fc8f5d8de83000000000000160014c06e48a94eaf12249dd0a70c67a3c018c9d9753e02483045022100a15a751b424110d27b32ad4e03fd489da0459f98f35fd84dcbbea75d9e59ffb7022004a3b5516e607e077852264d98390acdd4e3c8978cc469f0df409dde84bee90a012103b0227d276e3a9efac32d3d00b9587dc634d7305f343b6c2bcffec189f99e3036000000000200000000010105506675de84746fafc0ed8a6fb3c89209736b4fa77afa42b5b434a37ad817210100000000fdffffff01bc02000000000000160014c06e48a94eaf12249dd0a70c67a3c018c9d9753e034085b6a565624371c792340fb03682f612e83011f2782018e9b1900d93e47fa6d6ebc1a0b2c8489e05e0071907270d14960fe5e2a57e01d0a26617aaa85f6c157bb020e45ff1bbe8076b3edfae50af7e02f03297b7ee5c118492bc62a47f189d8b7cdaac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c1e45ff1bbe8076b3edfae50af7e02f03297b7ee5c118492bc62a47f189d8b7cda0000000002000000000101cee4af11d46eee81741438da3ae84e8d544b93f78c6b1ae950ab4a1e813fe2f40100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120635deac1ccb8779d86cb817621e33f5f9979015d8d2ec00836d9bd54c3a5938fde830000000000001600145e04ed45601662f318ee95d7638ef17f610fc9b302483045022100ce05e951c794ae8e376f337c4a2820059e7a7a2950951a8402c29f3591ff9d720220096af2a655c79050fcf91db5748e4ea708655255df34547cbdfe6512305d85f00121036c2ffdd675e20a3044adc32c6f0a9c653012d9ae4e948005402a02486975dac400000000020000000001019a3b73bb5479de242c98fee23472905218bdaf4c66d4bf7620c7866521d83c180100000000fdffffff01bc020000000000001600145e04ed45601662f318ee95d7638ef17f610fc9b303404317130e268d5bc4811c8a0a1872f898a7c24d27cd290db1386a9fe3824e30fdbf4731ecbe43dbe697c570ba173f1bc798902a088e9cfef8b98c878ca4ea83b4b0201d9157691511105f1365af79dc4dcfbcaaeeeafb05049f79ae4c6f9b3f58b80dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c11d9157691511105f1365af79dc4dcfbcaaeeeafb05049f79ae4c6f9b3f58b80d0000000002000000000101a1185ec31a57195844a04013888de62c341451cff41041c771826cdc457dfa9f0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120c7a53194bd38d87ba4a2e264df182c31f2e445090e3da9398b84e25be92415b9827700000000000016001452213afc4ade97a8f63652a5bf867dbb9929142602483045022100e5f9341f175d8af13518f40a632bd0f2d848705d3033441bd8a5ca95e2d23ae70220077140d4ada9d0c6e92330aba06460f1dfd8b3ab49cc730910611254751413b301210203338c2082151dc8b6773234ef796f5928992f9934f6fdfddec5babdf6df9d6b0000000002000000000101f05c8624801f07fa2abfbd81ed4be568f1c68a153ae8adf5149d6a86e917cd000100000000fdffffff01bc0200000000000016001452213afc4ade97a8f63652a5bf867dbb992914260340dd56845ef1e6c86139046a0dba6b36ef2c06e82cdf8112a28f65a83633c60c7c12a05a3e15810e6c5ea6eb68b0fbb32a2bb53cba99c34dc6a9d554cbe4b398f6b02056a89c8806db03320ce9a61c7a285a0d8361706fc4f8cb0c9d56c4f8e6e94e7bac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c156a89c8806db03320ce9a61c7a285a0d8361706fc4f8cb0c9d56c4f8e6e94e7b000000000200000000010107f7a26b8b668918ed1c48081e330a4f6a682c585cdc734edd3a8990fe45b1c50100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120a89190d7b38390c38d6e8ae6b1602b400c32ff003583ba9e98431526ed33e0d9827700000000000016001433dc4676a897c65261f6579afcc6bdf78a5b2a400248304502210086ec31ff06fda89b23da8566160fd9ca320e5f63dec2476522d43cb4dc1fd35c02204f6abb3990619c18488e96185d540bc7526e3112c97069491aa65a4b7e373f0a012102f8bd2d3e98f600e845e527f0c689573619ea7f7bfc5595dabc0494cbe846a7220000000002000000000101d2cd2da06f6edff7ef32c4aa12a942b7298232d10b52504ae750db4ffae5d68c0100000000fdffffff01bc0200000000000016001433dc4676a897c65261f6579afcc6bdf78a5b2a400340959b078d9e6cddf855b482e21df6e1e7f3d70c7d68246d30b4d658539ce4f297cca6910ca4502a01a976004c29ee9c909fc4f3ba225182110c3b5c8c78584e7cb02063c2ba3310e437b04e1ba30cac96d2d72504bc9616cbb2a83fa3a4a0ce147b90ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c063c2ba3310e437b04e1ba30cac96d2d72504bc9616cbb2a83fa3a4a0ce147b900000000002000000000101199de9468482b4682d8bace15dbb810f89bb59093a6cead29dbcab5bb259c67a0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512045a7aff315a9d4671b821cc6c5c8c4a865e4a5a802363567dd286fb0f7efba0ade83000000000000160014885e0875c87bf1ad7b9a99c2a36f26a32af61b8b0247304402200f425055c852f417bebc14e048347be1ae178be6749445b58b2bd19cc18f1b500220491158ff01c7567a0bb7955a551dc938fe2bf9999b95105b45d062076f5ca86b012103cc13d69b38de945f7051f68077e83e7a9217a3fe9c45807d2c4d8e3b994378be00000000020000000001014f2c7f471ae3e0a9bcc2606193c086d88ed3abccc5b73971f5d0a42e3a70ad780100000000fdffffff01bc02000000000000160014885e0875c87bf1ad7b9a99c2a36f26a32af61b8b0340b3218179b9ae77170d9647137aa8df485f59c601c1923b660bd6951f743233db00b5609b67906067c210a18dfbda9d06f8d5cfd621a8d321f2614d738eb35236b020f2017be586cf55822697c209fcc8208c586f7a4c664c446709de5be6ab0d7c25ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0f2017be586cf55822697c209fcc8208c586f7a4c664c446709de5be6ab0d7c250000000002000000000101ba352ded992f840b6d2be29c316942c084abf75b40f56a292674dcd3a50e2f300100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120c2bc6502ea00c393760b02af34556a36ef0c8b3cd81f4888ecd7a30e322a3dbbde83000000000000160014ef8af2513c24cc8aacb57d9fda9630f1a2b6378802483045022100a4db26b05ce659df4a005c66c59c79434d5978acf33392fdf123036931d99337022056b332bfdac95ed6dc3a76fa45817e1e91b30a12c9d1426a394ba2d15d2cf86401210302897a0626e3fde18cf35b1e1b55e3acd7198c66b3871ed4cfb3561bdf102f510000000002000000000101718fa3e2dd5349e4e40db734c37dcd3c7515e4063ea9c5afa7cb38646c3046a30100000000fdffffff01bc02000000000000160014ef8af2513c24cc8aacb57d9fda9630f1a2b637880340cb57befab051d163d677580c0e2286b1c5eceb239089550e83c4fccff88a8c78a48354be6e42d13eb5ecfd8665602d35cdcd5e4510401c116f75f8a9dce78912b020cc3a7705b51663031b262d41e14fdfdc6d7326faa4bd9063b2a481c59bbfd430ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0cc3a7705b51663031b262d41e14fdfdc6d7326faa4bd9063b2a481c59bbfd4300000000002000000000101ffc5c7fd79617bcf644865e5740403cc72ec0172a90a21e0c22b60e9aa9f98a90100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251200f0087febddd02f2b91a88d96a3053ca195849d655b2b947199a56ee77cdb4b88277000000000000160014b814b0eb674eeefd6389641ade55097f414ef12c02483045022100c627a769b6d610e5a72fcb87ac0e0fbd27a6670fcf1c7cb09709ee875627ca4f02200a466856b7e335092c3e32f0f1a965f046e90b11934ac4e752ce4723b6ee3541012103fc19925b96ccbb74cfea132db533be5420e5b21999d86117a225cc0a83c9c9570000000002000000000101832e541a3bcf24dd199cb9a6a318846498d1a583b1454bfde5cbd3b3290eb4460100000000fdffffff01bc02000000000000160014b814b0eb674eeefd6389641ade55097f414ef12c03406e198df890d46c69c7b3b38aa38eb94a8803b275529a48b3e190998b90d348883e4ed765bec4b5a562497884b4889330dc1d6b84e77ee6ec111fd4009ba5869bb02012d898ffe624e61a25358948f93bdc3db12b24b3582fc2c6b6dcbe3de8be14e5ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c012d898ffe624e61a25358948f93bdc3db12b24b3582fc2c6b6dcbe3de8be14e50000000002000000000101ba63b99123ce480454229c56e7abca277b3527a97a2417abb9692a16e4e65e860100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120a9c3d2a7a88e649b2cc0a710e18c6d44e50e57353872bc599066010c14b054178277000000000000160014615806849b39c77769350368c8963532396b1e3702483045022100f37188cfd844de2397fad1193066ba64f5d84b8b97e61be64b33debec8816e06022073c43b6512f0b358b72ad568c4a86a7cec5a4e2fe13977da6f652f0e5970eef00121037e6b387fba8eec0cd7ba0529ea68a8f4563004fb4108213b62af3e3660007eeb0000000002000000000101cb9af041e8051a934ddc0b17eaffa04358186ecda306d579173fdf590cb13fac0100000000fdffffff01bc02000000000000160014615806849b39c77769350368c8963532396b1e37034014c8340a1fc85ac659bbbd30833cce5b90c7c9e173d946926d0f589d8524a15574afb072917036d29d1516a6dc8083d50921e013a826cc7a9cd13baaaf47094ab02069352c3d8d74fe78ea574dbfd9cd76df75a81e99af5548347f7b73e80c0e662dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c069352c3d8d74fe78ea574dbfd9cd76df75a81e99af5548347f7b73e80c0e662d00000000020000000001014c56a30d9d15a8b0d081308c250cf3e94cce0e988e765f47adcaed17e5c253110100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251205f838dc2e5b5853604d3204cce22e28f9206d3e14eda3269a87fde2e86810505de83000000000000160014f4f8149a1ab69133c7155a6685dd4cab8aae37f1024730440220750634741750cab7e6bce9f98deff02ecdd34a866a9bcfad74fca78f60cf7d48022040ac18b4d1f568da62d0544d86a105a0bed43a1f55a4fbbb830a2dc6b78ec4d0012102024d414cd1c34dd8716994480a90cf47a289642317a4e38e24ce563b36ba6d820000000002000000000101464f7c8420364dae7a7855ae0f54b553f833fa562745ba1e51ac7cee79a6417b0100000000fdffffff01bc02000000000000160014f4f8149a1ab69133c7155a6685dd4cab8aae37f103402aabdc6e81719c6f54faa660c7f5b90d41d7ad6ce9e2bbb99bf6253f2d592943a5d9a9b25cd5ea601fdd60bb849ba9345421fbd890572865a44ed39cab0f9bb5b020b4165c3443d4edad3e60890c05a03957c989489c28ea4d81ad55c45027c30754ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0b4165c3443d4edad3e60890c05a03957c989489c28ea4d81ad55c45027c30754000000000200000000010129008761223f4d314a9b6b1b129ac60da4e1f3fb84392548fd10272981822f430100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120e836b4f6bd161e38ed4012ebae09abcff68c009aa4ac146fbe10376b3fc7b7c5de83000000000000160014f8ec2c4034fca29288737eb96379a6a6a5eff43702483045022100e023e7c487d0757da0497b3969a61af27fcab068e9da3852b6b5ea8b08b7932502202236e704b2710aa1e301d4c18ef1e66f27afbeb8a72ff2eff09e361c4b8a6ada0121026a25686c66da1905389a87e59df44d3973f39b19570fab6f4edf5dc7b8ba4609000000000200000000010132ccd92fed2ad53b0656eb8e1646d84b40ab5a407817f4b3120641f9338682b90100000000fdffffff01bc02000000000000160014f8ec2c4034fca29288737eb96379a6a6a5eff43703405f3f60bb041ba0a16147559831242e38661fda4692d7a2653ebd6ecf1d4e6b66a3ad97531c130b283d6c09317dff6c301bf43665b2eb0380d804cf1623b8996fb02082a3e203d3c8c511f6f872550f3aed9f8e6715bf0017c39f4a79b6dd6678f25fac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c182a3e203d3c8c511f6f872550f3aed9f8e6715bf0017c39f4a79b6dd6678f25f00000000020000000001016410cf80d332557bbbdeeb28cdd506507444a18a7cd09b3cfd7a48a1b38575270100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251201775ff3d967f789cd71b2d7fb193ee2538b3ad21390bee271e967380cca3c1f9de83000000000000160014c176cf4af9c4bcb844c9c245dab91defb1b3083d02483045022100e365c9eef04b2c01ec441af42ec193b0ea5fa667e4872a867cf9dc50bddcc0a20220506ac2f137e92239571094ac610727d867fdcd88c49c4b5ed5f50e85fa39dfa2012102f7d5fa605695ed4360fd67351c1d3235b5ee8b23354797f73df6043192d43b830000000002000000000101742ed7f5d2b2dd6f6272bc5a348561ab1de11f9a22d2784725e8aa4d3b0230370100000000fdffffff01bc02000000000000160014c176cf4af9c4bcb844c9c245dab91defb1b3083d0340a8b8fc54b22cdf0d421aaa87b475939030110ed7f42df01eecec3c493b2219ea10da6cf768d1888cd53d35b687260c8ae3487c5e57dd06f8e76d9d6d0bb5bde2b020323d000986a8872ba45ba81561df1903ea151461e7fd78b091c62705a883e7feac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0323d000986a8872ba45ba81561df1903ea151461e7fd78b091c62705a883e7fe0000000002000000000101574143578aa63c515ec0191d06eae89c603782e12ad43acf37a71ab603ba878e0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251203c92926c30b0a56f6c1477e63dccf558a36bd0a36f536417ebd9c4d06943e01582770000000000001600145ef9b3083545be8e3b3023e642b25f64f6a78ce502483045022100e925d5b7a8c37bf2eb933c1c41280367f38a7e3e233e45b05e5acdcd655b5c83022037d2f65e6b1db02ebfecb1800a02b28d756c8fb7496898e0e2f93c9c6dca4f45012102b1f91c624e05f338cbe3273e111b81bde76ba0aa2b04d3f6650e664a335939b20000000002000000000101ef6daae2e234b4ecd1ef46a6fc8e37e93125489f0edf896ab8183842dfaa80c70100000000fdffffff01bc020000000000001600145ef9b3083545be8e3b3023e642b25f64f6a78ce50340d6fbdfcd04967107e4ad047150b1ed96052b1f7dc65e33f1a23ee708cecfeb61fffc03711ad728b2857e1cfb0030b8d2e0f56d17de36111c90d9e463be07cc58b020114f41d1ca9457d644ab552bd92bac12b212b378ee56c5f0fae2c31d7fbb2ec8ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0114f41d1ca9457d644ab552bd92bac12b212b378ee56c5f0fae2c31d7fbb2ec800000000020000000001012934fe9b19584123b23f0d451318567b9207097b638c39c3d5728930d83cced80100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251207d5cce56e41e2911902d2338c34b58aaf620fe7eb405f3876f8cc485278c05d4827700000000000016001406b5b09014d06241d494b783e93a3659bca402fa02483045022100eff79c13512f044e99899daeba53f4f9764f83e03d451bd3f9b3c7014caf6f4402200533173863918f5468e91a17f7a02c2bd790f51ad7fec309a7329fb2c75aaac0012103308394f3592091520f42e71c7b49859eced346a60512b4b47a46f5671be00d5c0000000002000000000101990df4ac7c4ecfc38053865ee6789439975129eea6b0a714678a47edd91b11de0100000000fdffffff01bc0200000000000016001406b5b09014d06241d494b783e93a3659bca402fa03401694caa38107ed94cc71967ef33c3c8fa621f0c53a97f66d1e445a830ebbcda17a3f2ad9d297b79ff0bd16b90fe74fc34a002392f64477fb66cefd96b2196fe4b02093e3e28f92f58532f8ed16e7a19ed84190b33bfe9c979ca1149bb0c2e24bcfadac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c093e3e28f92f58532f8ed16e7a19ed84190b33bfe9c979ca1149bb0c2e24bcfad0000000002000000000101914e0ba6c3e29c5f662cf7f52f682e1d4678d87ba7d0bf5f97f2d5b77a2ee30d0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251205d2481df0b87cc91f1f98b8b485b96f429ba2419645ef865ed067d26a799c25a8277000000000000160014e84d3d9b9ef4c69d62510099cf6a865759fe985b02483045022100ac89e9d48db85cc64bdfcc309dc7627cb5f9c0cfece901c9d976d53913e9f4ad0220039b50a7ff697d8497e51afd636947e1911b2a2e7a565b6ac9bdb593e1205b250121036dbb9e67affe4defaa8f5bf75ba9c8f49108d8fc19a687b8e5de1e24859e05a80000000002000000000101633744b6fe4e6597889db252d1482b55f18042c2087735b102fccbb270ceb3390100000000fdffffff01bc02000000000000160014e84d3d9b9ef4c69d62510099cf6a865759fe985b03406e2a094de7046eaae1ab11497f963f81611c5bda1525110bace0134cea6110c2d8a025ffa27f856d918a75b58c5b1f110f2dc3b31e421c96926e2e43fbe1ce13b020054e6f418b16853c29ee39d11f6f1f487681e8f26557504ac0f55cbbe896e055ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0054e6f418b16853c29ee39d11f6f1f487681e8f26557504ac0f55cbbe896e0550000000002000000000101e156c380690909c7063ef735ccf059b0e6033b206926faefafd00f2110faf98d0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120685e47b58a0c74767f9ff16aa5f68778699ac03efc79c58138ca78b98c837f59de830000000000001600147228bd7bd04897d4edce859de92899cdfcbb21ba02483045022100a2ed79fe6234d08b37dd0b75579775131d1b9fb6fe0df860d72be098c72797f10220549e29b03425a6c516de12c9b1ffd0e44455c354cd476097778895ed95fe177a01210203cf4afe592da496893c182f56a5a9dcdc3c1709e18156f46303f605042aac71000000000200000000010176c285c87d18917814256ef56c4e8e22e6923febcdae730de35f9d8226e18eb70100000000fdffffff01bc020000000000001600147228bd7bd04897d4edce859de92899cdfcbb21ba0340617947f44bf964cb2a1320c960455b8243830bb6349df482f1af9cc71be7ed935e0a2fcb09ebd61f9318a90fd5f1f82603e4e7ecd547d8533a9fc884b0cb0087b020b7a3ebb1f52722aa78717a63768681fe9341ca7bf1fcc963b686e20d4e53b253ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0b7a3ebb1f52722aa78717a63768681fe9341ca7bf1fcc963b686e20d4e53b253000000000200000000010157cf5266e2caa34a89731814bab4ffdcd3a373c74ede6b214e424398056150a80100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251202c78160b2386fb2d4381aa2a9195aece8e4b218b60373ac3a8da472589991ce48377000000000000160014d2b627698449fc4b519f032352020004ec8f4b9902483045022100ad165795cb33be52ad74d709f6b65fdafa184fe146d05f3b314c9c7269cbd904022056e617e6f6027820fcd54ac261d9e9542039191d8c569ef62f494fcb522f21570121026cae138674612b3fbb60fee1f4a09850b910d57875c6b333829250b35c496fd500000000020000000001018cc1a97319ba98fdba08da8fba63daa8a9cac18947ea27e0ed39e461e8fa6fc30100000000fdffffff01bc02000000000000160014d2b627698449fc4b519f032352020004ec8f4b99034021a7af032a632619d29bab1fea4b5917e2938a0303ca595d23a76437d7ab9ad7028b79ca9eec0d0d8abb15cbb50b54dfbad778dbcf1969422b65720d5cf05d86b02094bd543007814aa4c6001964ad17900ec05f77a72bdf4107140eda4aebab3055ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c094bd543007814aa4c6001964ad17900ec05f77a72bdf4107140eda4aebab305500000000020000000001014e60f0d0cdf6cf8e3b4b429964027ad1e7f7e8b56c3685ad75acd4bd5fda30ca0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120f8fd33ad4a7008f20dd1056f8160e1217052bf6bfc6df20877505186e2574dd38377000000000000160014f5f91a724f022d4bca0265060aa45692eb5bb45d024830450221009ea0819733c969d3d3f415407703377a5bda6a1e5e7b22e2c83790527efec611022058921354544af442107eb115a9d987da6a7d61b2261d6de24e0b64eda421c9230121022b25ca5076747a001fc0a609adbe2011e022d34e800f0c6d556dedb900b494450000000002000000000101e6ec3bbb0915191a529ccdb3bc6a3e910961eddc5bfeee658ee1dcf0b03b79900100000000fdffffff01bc02000000000000160014f5f91a724f022d4bca0265060aa45692eb5bb45d034005a5ecd3b479c31573ec4eb6491f8ca594c7d489429b2452d91d81b4609d2768914b423c770fe18787fe9d92ecdcbdf4bac9de11483f2fdeae17c9fe594cc616b02016eacaf96e5750196b0d9ffe479e8a7bd2d2115f14fa2d53d78ca1c322f99f39ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c016eacaf96e5750196b0d9ffe479e8a7bd2d2115f14fa2d53d78ca1c322f99f390000000002000000000101bf935cb2a176c0f7a3712626a91a147d13ea011e72086262fcfeac62edb6ce0d0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251209682bdc7f13a940eec81554d859a8bf8ea584699621630873b8caebf7e64e6b2837700000000000016001491b02f84d4bc559604eebd3679abfdeb8562ed5f02483045022100ab1b26a11d480ace48acf7eb3d6c45dafd5286af29fde5d03fdf88c27f2559cb022004784f97518e44f76cfd7a1e45704b78983e3f5bad3c4e491f3f1c13717a443a012103f8857a5d99e7fa32e5049df2acbb9ec1a4ebe23152b40abd9253460d89e9b6a9000000000200000000010150d497d3a33d4379e89869c25aa952cf2437c4ace9dc1af3864bc5c91168243d0100000000fdffffff01bc0200000000000016001491b02f84d4bc559604eebd3679abfdeb8562ed5f0340f5ca4ad1442fc266ad70ab4d2c67a58eeca1828972ed3a90c77cdee8ee9701a072872aaec8b688392b2008a4d1efd6680d48db1aa94599220a1dc27dd51685d9b020fb86f1784cd4613fb0e0f5b054fa8efd6b9ad6ebff5ceb8ba0729a8324b042c0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c1fb86f1784cd4613fb0e0f5b054fa8efd6b9ad6ebff5ceb8ba0729a8324b042c00000000002000000000101870462df4aa4bc38ab9706dd3dc1afe7cdf97c844bfadf880da209173a2a972b0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512035eac6cf96bfc6ba3e85025fbd491dfff12d905f21615d1f86e58259b898f60c82770000000000001600141872dfe66db9ae404307bbbe4272aa2bf86987d502473044022046258e238324a6d1c6d7abd9713dbe74f6f60685204e6b952f14dcd9628c2b83022062fd780d8658a121c5f20591b2a994dcd829901a9273849cac54566844c138ce012102f227457090d81ef5696514767ca46964decbd6c72273f8128c7b5020a2100115000000000200000000010131fc87fd2eaea6e15ad83f63d98cbf29abb588219d93e97cfc510334353180f20100000000fdffffff01bc020000000000001600141872dfe66db9ae404307bbbe4272aa2bf86987d50340719763375562d6b0fd28c3d12e1c505fd08aaee945b3afcbdd6b921d2392e95a34c0c7a2ccb87cfd3129399842dfe8711728cfab6d6deae8d34a202fe727d008b020525e6aa3212ad94fd6e7d07a25177f1cc7e8124adf6922e3ad5b149df8246ab1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22353034222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0525e6aa3212ad94fd6e7d07a25177f1cc7e8124adf6922e3ad5b149df8246ab10000000002000000000101bee411636842dd3074a6a6c6d54fa72f14654eaa081f7c376bc95e20cd8abacc0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512061c3ab262ca7902b49fca4831af83fda667d977660b747a08e1d207f4f6cf00fde83000000000000160014e070b0cfbd1cfe398c9018ad7af19b87d0c501110247304402203dd939e79906463444151f0ca0646e698bc85daf24b787ccee17b3854aa4f39802204a9ae077bd7a8bff15b1296716f0ba48f67474fd029c28ce76d5554cf5f160c401210221bf74de18d07f21f2868ca4c3f9aebfb142ac9eed7ef1c72027db52a748844d000000000200000000010106345698f5a02a6121039712b540045a86ad5e01a315eb59f345d7098925f9c30100000000fdffffff01bc02000000000000160014e070b0cfbd1cfe398c9018ad7af19b87d0c501110340fe2ac74723ad8a777f8ae44d86f57c330bcef302cc1b21730eecc2dfef4cea4bae28bfcae0205faede12ce6cfb3a519c3c7b53c3c64ea092ae3cc3383cd08dffb0201cedc7e23acae97dfc25b150b12038cd91a899988b8621c6fc15b120394cdb07ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c11cedc7e23acae97dfc25b150b12038cd91a899988b8621c6fc15b120394cdb07000000000200000000010116876a3d700cc4f165b088ca44db1acf5c0108be65a569314b64a1dce9b7c9e60100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512095a82ee5d368013995e51fc5b845506eb0aa7d6ff807c4cb442ab2247b0555da80770000000000001600149cef0252426033e0cc45e4c812448760863994d90247304402207edb2b53487b9b4d2955aec53246272ed870f9498b1704868d5eabbaffa54b2902205f1767fa312a6a5666d77f8ef1a166a95b0550d152d79c65ee3bb07ad59e8779012102e9905bd3b6ebe73b1855693718eb5aeec7655585db1dadbb80b599c74e682ed00000000002000000000101864f434f6f48bab7c458ff891aad46fb550f8cdd6e64d72bba66de66c67508ca0100000000fdffffff01bc020000000000001600149cef0252426033e0cc45e4c812448760863994d9034029b781a0f9552a03873a3cf16562b52fb1d926df80102181a14ca67ef2ad8c1a91252927db27f7fbf28bad42052e7b91c14dc21f8c444c1019ca695db0ccf496b02046f5dd76be5044483c241fbbefca96c5a572c4822a495168ae41eb1986e908d6ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c046f5dd76be5044483c241fbbefca96c5a572c4822a495168ae41eb1986e908d60000000002000000000101162f8e432097b2e8e84e97b057bfc4f5b2e9a08753cd641ad5a2540bbafefc830100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120aa60b0737c6728daf214161171dee1866ad40c60e63ad33679e5f9a706c4ccecde83000000000000160014bf6ecc863092a434d2cbeeb8cf54462d1b5e248002483045022100f132a7d7943167c71cead2a531f2b99349da8c6b4b0487f7eca55914a850b13202205bf2ad4419c529bb11e0a4f7aaa8d2dba316eb708b9a33c233b529936dc51095012103a5d3225d6d2fe07fb79bf98eb1999945405e7b588d4931662a954749b5ad8f980000000002000000000101b554f0569a075ff82f279c63f261ecb9042743a9be77fe0d6aa27580fef5eb310100000000fdffffff01bc02000000000000160014bf6ecc863092a434d2cbeeb8cf54462d1b5e24800340ebfec0463f1bbb3062c6ec3e1b15083508651492e25b58ac9d4b6106762dceb5040b4556180e29996bb3b9efa93fe7bb4976ebef09e3dd90a0f4f1ee94d9009ab020d266ec339d21c80f16d2eb819d4e68286ad7d8523b9b8db5a33736cb56c59315ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0d266ec339d21c80f16d2eb819d4e68286ad7d8523b9b8db5a33736cb56c593150000000002000000000101fc3e97555d919b9991d7bb67e12999988587c1c10b600a9e28a6edb0ce6ac6dc0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251201276e3a3cb2e2c17693103783b5231470bc546c79747a2658e00cf107451cf26827700000000000016001450a924bd9ed84260823035dc17439cddbbd1f1b20247304402203f1ca4876bb50c7a99d320ebb38d549cfdf43aeb22c64360ed82ae9505fa31f00220591bbf4f6e09f25bcd3ba509b836553fb0e23fc775b27f1c116605661c1c10ab01210231b8bde5b9a89903c30f3fb086d8972a0029134f2d18ced579e0ea3b3404cd7a0000000002000000000101c5efd98f18053853fd1d1e03a77176a5fd342fe9fe88088b787c27c8858b093d0100000000fdffffff01bc0200000000000016001450a924bd9ed84260823035dc17439cddbbd1f1b20340860bdf5e0c150ae94a54d1ea1da46a45a5debbb9dbcca6e668c6b3a212c1591bd7370cc2267d54892fb83f48c67472e0d3eea44b39543521881208d5c7f6505bb020e0d46fe7c6f9f42c845902a278d25bcc832ac7caf78444048dbe50bf4e7bd3b4ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22343730222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0e0d46fe7c6f9f42c845902a278d25bcc832ac7caf78444048dbe50bf4e7bd3b4000000000200000000010151032e3df79151f6c4e74877a5b1b5da8cfa9e5cd5bb5963fe1417ab24a3fdf40100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251201966c33b3d644b7183fc79675ce02ef7b80b7715582ca4cb5e1a6996cd8e6a1bde83000000000000160014b1d8ca7ff765a0053f84b93f07f8dbb3dccd763e024730440220330647c22c379a4e5fc668a4babd54c42dee1dece7b7bdd5f71600bec2af634902206db88550a2dde105c99cfd83bed0ceefc0b86bbff9f30d1bdc78b42f69b7b0a001210354b7f161a27979e97a7baeb3a67f9b1b47d16e1f754fa3f77f9a2be82348c3700000000002000000000101564e5cbb95f88b7555ccd7bf6c7f62a05297d3b5a08e068a796597d4ffd9111b0100000000fdffffff01bc02000000000000160014b1d8ca7ff765a0053f84b93f07f8dbb3dccd763e03407db3d6b0d217e2df73e2dfd5cf72f47fac33a5ef5efd50a838a60acdc06e305c7a7f98631838de64cb26a1a5967e59b1f743d686e00d6d650c34b1cbb4c21b0fb020086a76e6e100544ae9d440e521a0c68c4dae40333fd39cecd4761c1c0317a7a9ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c0086a76e6e100544ae9d440e521a0c68c4dae40333fd39cecd4761c1c0317a7a900000000020000000001018355ffbd9c162b394cc159f5a8c2387226646a857821682d46f751bbd4f256af0100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120ab443134b423521562b6a2c555b4ae5026c8d31b6974e4e5e8bfeef08b2f3791de83000000000000160014a2535b819fbd923dd65136d2fc461d08e20775790247304402207518921b98eecd5794fa97351bacd5ba0fa308c5a98b783c526af6c049d194a40220144751b2de8c29b2d0698da26b477a059973e483c957e615777d5bee849681420121022317012184aea038f671f9ffd437ac571822dd9df19cf8421f9c853dc8bf13a70000000002000000000101d99a236ad1be0922a3ea03b701ea3db7b42f30c2041d41e5b02774557eca0a710100000000fdffffff01bc02000000000000160014a2535b819fbd923dd65136d2fc461d08e20775790340c6d9cf15c205acbfecaa43f22bdc6ce20cb3d6c5a4836d3e4bde9859ed4801caf2f495c787e874ad590bd6f44d6c7a92f84889c9c221494a0d704fc42482de0cb02086448a9e0ba086a62fc6b4c1d0fc289b05e8f42bc2fd342095d09d3536ecbffbac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333030222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c086448a9e0ba086a62fc6b4c1d0fc289b05e8f42bc2fd342095d09d3536ecbffb0000000002000000000101c6c89de1fb1ec0fa441dbc09f66b94c5ffafcb6cd32ace9c7904b74da80d35060100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd98030000000000002251203c9eb64ee771e7b11127544e883f91ecd8a73c066a394c0c5f71e7ac72a4a020df830000000000001600140eb594721b07b8c504c8c0637322234b1664696b0247304402207966830e1cce71fdcd71c531cf59eedc561aecce9a58535e1b30c7f0767d4914022021f2f9340c27b0d95c5e8a808ca7a5bb557f0cc205845cb7f02914885352cb8901210305d24c2d3a97accf57c05555e9cf2d878a5a33590b7cf93e18dda6b8516bfc8e00000000020000000001013c8900879e5d8f0b2dd9858073ca8340490f0f22bc259e322cadebe4ad8728040100000000fdffffff01bc020000000000001600140eb594721b07b8c504c8c0637322234b1664696b03405e6d2adda7d6f107b227f11a5d09bded5553458d67b4fb659548dc67fb69e437a39da9b616f44ed682b0ae4725b4ae6dcf94dfb195a7df702aaeb24476931210b02016ef4d6e58b16d18d38ce8c292645ea1eba2e59dec71a8a26a284f0b6fe5b8a1ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c016ef4d6e58b16d18d38ce8c292645ea1eba2e59dec71a8a26a284f0b6fe5b8a100000000020000000001018ce22e52c7cf9b33761ccef72ef8c13fac82c25bb0f0ade2717eed1edd93c4550100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd980300000000000022512074779ccc8373fb26ce76ea8b5efc123b6b2703088b037f36817916be3f939c65de830000000000001600140fa2b4566960ecc199025ab3189919c38d55143e02483045022100f505c50df356bed4899c854dd4d6601be47e53adaad10491dfdca573b9fd6a4702206b6df68c15d42ec39e1c4349fbe475095640010ee974ef82ce2ee5227c72a1d0012102fb94846b5389351a0fd072b53134098986f5dacca55e1295ac3d1eb7b35fb88c0000000002000000000101e195bc7bf2927c4a2ea8f158da69a32ddd392f636778dc834d1bb72f56a214230100000000fdffffff01bc020000000000001600140fa2b4566960ecc199025ab3189919c38d55143e034016db750f60268dec38ba8a2ee1eb3f282abc80426796a5eca0118dbfd39632ade03e7edb7215b9780db05604c489ead8dbaba7d635010dbd3406330c84e2042eb020cf1e78122f4f6d857c2c140b6ba28cf8053ee105184c3eb71adbbeb14b5a8b49ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c697b2270223a224252432d313032222c226f70223a226d696e7432222c227469636b223a22626f733a6c705f6272633130305f626f73222c22616d74223a22333032222c22636f70223a227732222c2266726f6d223a22626f733a6c705f6272633130305f626f73227d6821c1cf1e78122f4f6d857c2c140b6ba28cf8053ee105184c3eb71adbbeb14b5a8b490000000002000000000101b1510d570802537dbbfc945ff84a58625effe0bf3581349d96f5b97a297eaff70100000000ffffffff03d90700000000000022512097ac262b9d0af9200ccf4c2482474d15b75175583809593f1ad80c72b46e78dd9803000000000000225120ac1115a90103dfee5107b615af28602c981639ad18d8862514fb886bcbf1c7ac10b10000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d02483045022100ee2ec054ba74463a95c62afdf34ad59c188c0d700d17e65fb0072881e38e085202200f34b0fb7b053bc000892a6c0b924475e79578bf1ef9ea0824100ff05ca0ccc90121029389641585b84247a9e34834192d25bebc465dfba8cc2380e11e526265db3a190000000002000000000101b233a94fe600b9ae1302659f91f9e1161b15d1ae78baedc056db8e6f621799740100000000fdffffff01bc020000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d034015b34d5182d8f178d1e86eddd64d8cc2ff3b30586c81177ea4c32b908bdb6dddd33307ef30edb051d1abb4a0f86e88890bdaf65b6532281abcdd2d2e3e7319bbdb20b2111e71e974cd71e2826a33fd8ffe476412178e71091492a5e6ed3a357c118eac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c947b2270223a224252432d313030222c226f70223a226275726e33222c227469636b223a22626f73222c22616d74223a2231303030222c22636f70223a227377222c22746f223a22626f733a6c705f6272633130305f626f73222c22657874223a7b22616f6d223a22313434342e303936303636353230373937323737383032222c22646c223a2231373132373330383736227d7d6821c1b2111e71e974cd71e2826a33fd8ffe476412178e71091492a5e6ed3a357c118e0000000002000000000101b233a94fe600b9ae1302659f91f9e1161b15d1ae78baedc056db8e6f621799740200000000ffffffff0358020000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d58020000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d84ab0000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d0247304402205fe56b0cf47ed4428407d4ab5dcf861a81643b4363f206218afedeebe76e208f02207077a56668cd97eb37d66b05b85af2a296641c2d49bc7eaaa253fb3cd653a04b0121029389641585b84247a9e34834192d25bebc465dfba8cc2380e11e526265db3a190000000002000000000102c5124174a33c5441faf0514270d75c581b84891ef845f21b6ee4c2f414f9b6cf0000000000ffffffff4b8e145f028ae967fdeccc890eb70957642444acf857ab1af9851f457e19437d0200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b19029020000000000160014ace5b7638d0c78df2cbe136a2672afe24ebacfa702473044022074c438b156766b4920aa802d86ed4a44880eedb7cf6b112d928e7be742df4e77022077d49815b5473a3ca47ae2aa3f3c5aa36ea66464c56edfc759447df4a72e621801210228867bea243eda9c26460622bab69532126636c44f0aaa3b3195bb0d7e0e7b2502473044022019ba11f5238869b4b43fdf4dccce71553e4907874a21e45cfcff5bf005fe71d502205be322f28aaed3e4b89d51309d75c21bc246f810cc62c49ac553ba49bbc0143001210228867bea243eda9c26460622bab69532126636c44f0aaa3b3195bb0d7e0e7b250000000002000000000101fcc65cc2dcc4b6119c8bdc173df1a55af653f26da861e7cdc934c28f4a839d10000000001716001463cbb8dbbc15ff53194a7b7e5a38eb3097c77f5ffdffffff012c9700000000000017a914ecacb3106cc72fc5a258a01304a802b9b823b83e8702483045022100bce5d71124f52fa3f72bbbd266acc77baf5ae8bd14e5cfc93cc1c35d6899df10022045fac120c3bfbfd359a5bd83e2516e10f71bbbae2f7bcc0091c90c4f100fb64f01210322b0576c8607f5ae7a254ce697adcc222af867877012ae07201cc3adbf2f6cd70000000002000000000101de0abbcbb00a0394920968b5d9af0f812cd772a5518db1ac87e6776eccb050ed0000000000fdffffff0280e2000000000000160014cda3452eafdd5a46a04ca6e20ca0b59752db00cab1e0a1dd0000000016001451035f6405d50b8477ac0e66e9d72420a9c6a6280140bed9275c6b3bed9f0efa79f4b2c0feadd72d8a739c88be4beb1ea35aa724d269c2cb4637f63126bb3078b0a631790ef89c5ccf5067e9cc87ecfc0b5903687d16e368270002000000000101be8b5e369c4cab80dd90fb8442c3f911a2582be9bb9938d6d73e7d8fa58d80e20100000000fdffffff02ddf5a0dd00000000160014f96fbc283f11706a2016ccf1cf4ab2deae1eed7847ea0000000000001600147b640dc150ed3c24a5cd4b8576fee033bb372da80247304402202743bbed99e1d28c8a9b0298a149b60a556f4c0ae1a90188bf4a1483d849f429022027b2536eaebcfbc72f6e084b7f4b7c6d4ad8efcca1734f20d12c18bd5dead1b1012103d573e920183ea8c0b47f89b41394b1d5c4fb674bed2573a00b035e6f4d7352b0e368270002000000000101f52c11da8c8d5414e91d6ab83069fbd5f3dea241203d7357ab3442d72381b7380000000000fdffffff02837c00000000000017a91419f0803aba6ff6a2515af3d2b6d1d85b1771f41887cb78a0dd0000000017a9148e49cae2c8d867316288d22840a63b80e0d36b5087024730440220632b411804c148b79ec6203ab4de412370f2c150648c4c3ae64c0a019ac56a0c022046da6e0178b206cfcabecd508a92ff585974eb57466ffb7919904fb658dddd8a012103a983e10acc7b4e1b5a51d026330a1b3c08b03f962f53448da348dfd7c199dd1de368270002000000000101ec2d678c8691c73d13cacd15d04b1f05b3a7c20341c224c6dd66866ef11edee6000000001716001472e373ab8dbdd7d25b05dfb1f782ad4e55c30f66ffffffff032202000000000000225120b014c63b2f66737498be359cbdf099f712123f2230a05220c65db3a0663a4b9cff7800000000000017a91419f0803aba6ff6a2515af3d2b6d1d85b1771f418870000000000000000136a0952554e455f54455354070e83f5acbaff0e024730440220461c6bd6419fbefeb9122144a250ae303b00b199c0c662db637f88bed8aed666022041f6d4ea5c68a9fe15c3c457d0b24e22d51179a30ab824485b016443ae3ccd6a81210342d85b5040a90e89d13c9d4abbb214b0de290e89ffa82f3f8adcecfe57edfd85000000000200000000010102baf96a5c6216fca306eb4ce4eaafc3d7ad95c3f783104cdbacae1ee8769834000000001716001479827da7191020c469bd8b9ad975647e834b96f8fdffffff02688f00000000000016001436c0d4df3ce96394ae88029962ec8b27057578d6cb637e9a000000001600141c63d917163a4c76eead78b37f22b14a21b7a3b90247304402207706bf9dd92ae4893de99d9811fb69be8c8e4a21ae15e7b6f6248db7aef4fbe00220257de137af1a5a0333d5a9d7be97cc116eb13fac5ac811c8575c8eeb1243eee0012103d5ec9cfe95ac6f77dddcf6cd72ee1ed91a4b9b1c42f09347c1943a72867f50e5e368270002000000000101f4e5d8fcb97439ec4f58f8af0599511b200f0a57a3db21f8190fb188fa20631f0100000000fdffffff0278df7d9a00000000225120d5c3f4274267db10f85f73505f08a798e021f3b7a36f835c901c38f861f23114ae8300000000000022512067e201ad9f2ae5bf5b74f6622d9b6a63fb30f770b326b1e3e76d94900368439e0247304402206f23ea3bd68ff08474eda5a2d3114bc2cfae4882431c5d2c0daf921e6b489c0502201640120e787b5f60dcd2caf5b215ed8c626264b6f3aedd9f359e3f03b5164012012102281ce4bb1096e580bd63d16d9bdb007d4029bbf4ddf98c672c0b907f53c85dace368270002000000000101f64f79ff13e7ae3f1de7475b1246c27e5ca4416ed98db6c12b5c3ecd2bb61f7f0000000000fdffffff0299257d9a0000000017a91413ef574514e77bde9e9e2bed47e974a2fa6d3511875bb900000000000017a914ba00462b3c8452cb402231ca9f3244fffe40d2db87014079027a60ee1f18cfe6dbe46046f1a8448c4b5b84ab323610d802e0348351d9690c03e7e68c3531c68a149beb89c0095a2673b7d2b0e89219d364feebb00ae4f4e368270002000000000101d5871179790f4df107d15cd3f724ac361ef9d1ff057e0e077c008f77ed9dbb3e01000000171600148436b0bc076166172c0559b3eea318243992c294ffffffff0322020000000000002251204295cc8c8405c30ab6a1f8eb8df4c6cf036de534a36b35446ed23161869e86a3d7b500000000000017a914ba00462b3c8452cb402231ca9f3244fffe40d2db870000000000000000136a0952554e455f54455354070e83f5acbaff0e02473044022023bcc57737c2eaa1c3420c6a7298c15a51031940fd9be0efe6ab51fee0b28a5d02206696b868e2f9e72b3fc281e411a3504824cfb947d3390ccb64dbeaf64c06767f81210202362b8cc524bf506cd90292ce6133b5caea1914a48a66272181983cfad49d110000000002000000000101f4054f849c9aa855f41b2a008a72737cd5bfa2df038a36ac557240de3d34d52b0000000000fdffffff02901201000000000017a9147c13d2718ff82c5bb57afa223d74221a855b6f808751b6b89b0000000017a914e05eedd65e4d1f869e7f4c537c96454d50b6f8e18702473044022025329b1df5bb64413f54772e5dc21007f9af3047b97e5108b1c4d41e23ef5c9d02207cdedabc9f4a61e0fb4dc28800687ff36d62934c31f4b6ae918128c669936af00121024c5c7c088b41d549d9e1f424dfa354ac9d3f9fe73c98f689b11517ad1699c7c2e36827000200000000010164f4c69f1ae04aeb3420cdbc78a3d558556609b71c8441e80978374477b7fe5001000000171600140525b909d008e2c0a3d6c7872af0ea72f35fa3aafdffffff02cb76b79b0000000017a9145600edd72d4da39fc89cd27da6072c17ddf4d30a87e03e01000000000017a91438e8d48a1b6d2a7a2bf2c2a9f99205b1b74170f1870247304402205a5acc05b8a0bba72578eb6afe23b44a0936157009f2487740d95a7d68025227022023edaf3e6f1c3206457a523f7cfef29df4195458e42706a2fe9197d97ea091e701210230fa9a0c4aa9bff439ad831c91b2d3625de17dcc09666a776dd38cb7eacb0262e3682700020000000001012595c3a48f46f19d63cb52fdf8692998ad3db3fdeae6edac15dfe0be3ec48ef0000000001716001418d8f60a10de536f409fcb56e6b9828e8fdee557fdffffff02c7dab69b0000000017a9148e39c7c49c324b71fdd72bde243e9dda5bcc103d875e9b00000000000017a914eea7049926fe8c72bb4e10f8160d4729d732d86a870247304402203c485dcb2bf97f47ec33f6c1478b5f382d85bfdf469dadb5768aaa615d8f70b802205a30e70bf03eb90e98206b8c190c89fcb28b88ec35907f88daa528b53f3c0d9e0121031edd3834a796af0eaeb468294a157b192837103a45afccc76449707f5befdd4ce368270002000000000101e7dd765d11a2dc5276e567da9b088f00b0a526ed7e99d1cc6744e179792fe7660100000017160014bc9e67c22370802b2df88692adc5d8a281cbf1d1ffffffff03220200000000000022512036672cb2fe44c108495adbe8c774c1e3746cfa285d7a335b9927257c44fc9be2da9700000000000017a914eea7049926fe8c72bb4e10f8160d4729d732d86a870000000000000000136a0952554e455f54455354070e83f5acbaff0e02483045022100e9dabd548d82006a1d6040aed901e00762d631689e83fbad4edaab04eb0d7b1702202d5cc2ec159191a1b7c81df03442407cbed582410fad19050c8a2b2d3015424c812102f4a9f6a5e0e990779542cc8954235a8364b71d07f1e98c48f689bc35229d825400000000020000000199909c0e6f540543f90a36eae7bf93ac38a8d6bc72ec29d72836c336d2c9a2bf010000006b483045022100aeceae39502572bdbf322c8683c0586467ea92c8f47dc841179faf1b90c64ff602206c8545fb2f693b3d7f7bd4b1a57b259b1eb1b97a27d213cfb88d285f07135acd0121022469d05aa46b9bfa81efb52073e6253906ad87b48b6d14925d0e669c2e9ceaeaffffffff02a0860100000000001976a914455f50575407ce9d6956493b3da2dd7858edd05488ac40a70700000000001976a9149bdb64f18b1bd016dfcb74d072babd3027862cf088ac0000000002000000000101445730099ad22b7cc94a4832aebe9fb8336021807928c60a3601d9f5facd802c1400000000ffffffff15e8030000000000002251202dc56c653cba340fea80866944bca684bbbfba66dc605301c6ab7e444ce5e40ae803000000000000225120ae5729cda0188243cf81af2e33d9dbe0029ab3e2948fc6bc5df027b7244c1117840300000000000016001412338b689ef0dca250dab3517d6fc2d9a47d21d98403000000000000160014381e9a712556847da4bac390c1a965e1a7e8329584030000000000001600147eb789fd87796699141fc80df33d2058b8fc578ae803000000000000160014685ee87b844f4f0cd26a7e7fb1eb600c41ec6e618403000000000000160014212807cf3d3461f1ef7d567617ee060fa8a355e18403000000000000160014bc19f6555547818b86f7aa351cca136179be5fcc840300000000000016001409845a66f50e0922fa9e7fb89d159e1f6567c186840300000000000016001436f9f3d331716fe5ed5be40a085d0b8fd0d530cf8403000000000000160014e1eb5e3fd2a3ae38ae8609c490fe74ead91ea13284030000000000001600142fee8704c1f82b8a4d7ea50332b0d30d5fb0e6048403000000000000160014dfc8c0fb2e12b0d6515b3b6c9dfa8a57a23c2fea8403000000000000160014f669e5782a11e4be0e7ebf805c2bc9070742bc988403000000000000160014a5beec81f6b47836ea75ebf0a9ede4bcf34ca716ac2600000000000022512062fc359a6858dc270d740c921dc468f6c19818bf9b5ef522842231dc37247980ac260000000000002251209ac5913512ef448a217e2c4c05572fc95c3cce5cba9798a5d045610d9468acd4ac26000000000000225120a0c22abcaa7f6320215f19ee48f42c46727d6533763f81203a2b8e6c06c009c8ca0c000000000000160014a8dc7072e885e4ca4fa4309edb1fbf6a1067bfc9ac260000000000002251209ac5913512ef448a217e2c4c05572fc95c3cce5cba9798a5d045610d9468acd4982f3f0000000000160014ae7143a12a9aef897fec2f96c5eb6ad65405134f024730440220042809637622695697c8da8bf30945acda56ce92c12c96498211f08108cfc64e022035918a5a8b2f39701932f596f4fc425f153ecc0dc02a07e17b1ad0a967eca212012103da2d59330c5936a3d7a59398e572db4a19e08a84c469904f5b9f8d4eee0e8426000000000200000001e32ee71a1361def4694ea7f7567c115db51d509138b1df90fc5843f416e7b2fc010000006b483045022100a6b0f704a1202258957821b296de520af3308ab500aa076818df064ca0d2f747022063134fc29f12933647917f445a352b111f2ff4b32c863df537b16c12f18e7a39012103dffcf1fb26c73617ef21823a7f2ed4d62bb8052db20fbe9e0dfab984b9526364ffffffff01ae250400000000001976a9145387f023a776c835002ac5171df22e52bbd5280c88ac00000000020000000001011a0dfdeb5011fbd22b2e7667e0c9f46bf0143432776d513b17ff6355dbbed86a3700000000ffffffff15ac260000000000002251208bd57730bbaf5be0f36ecb9ed38cc473055a72c0082bdb987449f77b84525fc2ac26000000000000225120a0c22abcaa7f6320215f19ee48f42c46727d6533763f81203a2b8e6c06c009c8ac2600000000000022512062fc359a6858dc270d740c921dc468f6c19818bf9b5ef522842231dc37247980ac260000000000002251208c9bfd23a77349c320cd0a22e5f510a1431bc20a0d74b006794c51d106802405ac260000000000002251209ac5913512ef448a217e2c4c05572fc95c3cce5cba9798a5d045610d9468acd4b004000000000000160014f9a40c66f7c9079899aefa9d7e5a31068dc0e7de1405000000000000160014362804ac15b3383fc186f9d52a2988bf775757aaac2600000000000022512062fc359a6858dc270d740c921dc468f6c19818bf9b5ef522842231dc37247980ac260000000000002251209ac5913512ef448a217e2c4c05572fc95c3cce5cba9798a5d045610d9468acd4ac2600000000000022512062fc359a6858dc270d740c921dc468f6c19818bf9b5ef522842231dc37247980ac26000000000000225120a0c22abcaa7f6320215f19ee48f42c46727d6533763f81203a2b8e6c06c009c8ac260000000000002251208c9bfd23a77349c320cd0a22e5f510a1431bc20a0d74b006794c51d106802405d408000000000000225120315be8e70f5146b3ee09c606ba52ead6dc8e4448dbce4a5d4732f4e4878da7a3ac260000000000002251209ac5913512ef448a217e2c4c05572fc95c3cce5cba9798a5d045610d9468acd4ac2600000000000022512062fc359a6858dc270d740c921dc468f6c19818bf9b5ef522842231dc37247980ac260000000000002251208c9bfd23a77349c320cd0a22e5f510a1431bc20a0d74b006794c51d106802405ac260000000000002251209ac5913512ef448a217e2c4c05572fc95c3cce5cba9798a5d045610d9468acd44c0400000000000016001454523491d656063895a6c5630faea5ccfa16038aac260000000000002251208bd57730bbaf5be0f36ecb9ed38cc473055a72c0082bdb987449f77b84525fc2ac2600000000000022512062fc359a6858dc270d740c921dc468f6c19818bf9b5ef522842231dc37247980a4c54900000000001600148b4b1c5c893fb0596ca8a5fd6efa232a90e3ef4b02473044022033d88fa9fa4421efd2023845a1fa85aa5df2a370d296d10c0580e9eebcb1385602206ea0698a32c522fd37a3a179e5c266069aa951460a994e732666f50401a3a7770121039c3a54cb4179e57cd09250518245b652e28ce86199f8f66772c9f98bf014bdf5000000000200000000010462d37196f67ccc3711ee49daf7a26424129998907aafb09d6da1dc8560b1e1170000000000ffffffff62d37196f67ccc3711ee49daf7a26424129998907aafb09d6da1dc8560b1e1170100000000ffffffff85d8eb41bceb177559b387de5302e4af52e0a77daf15203d0b1abe81c3b2b7c60000000000ffffffff62d37196f67ccc3711ee49daf7a26424129998907aafb09d6da1dc8560b1e1170200000000ffffffff07b0040000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1dbc020000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d7c920000000000001600145f9b16938f236a1f2f3134d6643f18004d77a6c8ee020000000000002251208104c1447aff78c59547bcaa3ee05529f8ee8f3bb8b6b4517e7ea65aa83d2b6258020000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d58020000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d510f0000000000001600143e01c572cdef204f35cb822eb97b49f620c4cf1d02473044022005ed9f8e372ec81d0c2cf4beb95c5f3d42e6b6234472eb197f1b96fd81945cd9022022ea70ecaec3ae2050e36eee20dc96c2f27c4d7e0b0f2c841b7fe9f3e438971d0121029389641585b84247a9e34834192d25bebc465dfba8cc2380e11e526265db3a19024730440220259b73199b9c0788288024f5e258259d1b7287fb37c31697af4a8f0af6b63e8802200db8e2d1ab15d86e49997b9dad1dcad347b586c50f7cfb58ea33d3a994f5fedf0121029389641585b84247a9e34834192d25bebc465dfba8cc2380e11e526265db3a190247304402205ba3ae88f467bcd1b1dacd0b45070006747ede8388c71d47155cce77fe889bef0220413cfe3a304b1f9a75f8ba8c6f0ff42331807885a3d44336a3081f2438d962408321027443e1e18a1ee2eae7c1e22e14db9966bfc00aad9ecdf11b939cda94532a197e02473044022071509188e7729d1bfbe6e570bd7b346be88bb2ce1844fe203906c4ac03befec50220481014d614cbf6c074718fc9a6b39e06794d898f427abc72d956e96d5fe988310121029389641585b84247a9e34834192d25bebc465dfba8cc2380e11e526265db3a1900000000020000000001019a832e5c1c58877442ad7efebbec8bf49d1e1cd54831466ca95a05f3cb5950020100000000ffffffff03e3270000000000001976a9143fda920e686292be324b438d6509123ecd8e1e9f88acfcb2000000000000220020ea1b6f683372648bcf9c11a150ae55a3cb41d410f0fb5c86b28389318166c9520000000000000000226a20acbcf45bd2556866e8b3cd82d0ccea420edec0dc108908d5719972ef0d7e29eb040048304502210083d0af5610fa295e14c6aa6fed7f107f111b15009340b5ce3ff34002ebea169b0220119362dd68302b5c2d47fa24b2c93ac5c171650b94c0ca3115b38d4d32101da401473044022000a70f3a8bf95e30ceca56c9454b2bd564b300f55e0b078b250fe3315166987c022023af587aa0de24f7b025d9278911ad989a60d1c51f9d008ad6e0d994bf3ea96901695221024173f84acb3de56b3ef99894fa3b9a1fe4c48c1bdc39163c37c274cd0334ba752102c0a82ba398612daa4133a891b3f52832114e0d3d6210348543f1872020556ded2103b77df3d540817d20d3414f920ccec61b3395e1dc1ef298194e5ff696e038edd953ae0000000002000000000102c27d756838ee546e33a46b3145ecc38ae863b3c9cf96c58a8e766ba3b96b8df20000000000ffffffffc27d756838ee546e33a46b3145ecc38ae863b3c9cf96c58a8e766ba3b96b8df20100000000ffffffff029b020000000000001600149b3f05288b557e655d681c694e28e4d2b8255308541f010000000000160014dbf7627ed6527d9fcdfcd55dddc4fc3954dcc07902473044022013a8f774e8dbb78a1aa3f2f0bedb6dccd24033e2a081f848be6a1ec0b0961c1a022014871a05815d60d14e18adc7d00a886a365cdef6da3d8712ac890d4fcf4cc8d501210260922939d0a3c10503023aca7e05199131fb5bc7c391d240c9df6de381f674a702483045022100da7d2b025d473462f9d098742b66b6478579890e9545f8feed201c934ca5376b022066221caa796408c556fa3c405961785e8241dbaae5e508f032dcae3a326ef9ce012103a69d884e3dec340171134450e57e9b968d9d3101ec0f27e65934468749b66d2700000000020000000001019191b7f58d874269ee00ddb65679bd25dab9016ff77c0288049260f389bb9a7e0000000000fdffffff02e6ff170000000000160014e54155e4d33bfe2a50d33565d8fb16b94d582c57e8030000000000001600149a84e5fdcd74e17b757c8a0fca0d0701287cf13b014016cc3d391e8ccc8c4e4c69cfe18551a433560cdd20e5e0dfbea98328ae4f4221ec29ff4314a259a062562990ba904992c6337e8181deebf438d0b310391902c2e36827000200000001830c64b763f561ef25d60f17455186bc9823340a869d815af2959093d793bfc3000000006a47304402206ec03dc53df695e5af5e5041a31f7e6fd2b4c69449da3513dcc15bae0d8ba1150220796237f36a2fa70e0567379011526a23a81f2e0a68f5722e6a76ec6694707d6d012102ad697279bf857417821e309f55bb7277952e7d8a89b9a31b9af0fab0b1df42fbffffffff0286a62300000000001976a914913a815a07a36c1f89c599342954f8718db0bcb588ac0000000000000000536a4c5048454d4901005448c3000395c6892c5a79634c68b89f29512c505ddf12653a4e15afa1b6311791be3f5fe1d1316fdbec762c6b445041c048e5933467d6e07cb7d611ae09cafea53f2da214c675d73c21e3682700020000000124f6ec41993a7e4aa15eb2983a95c3999fb588bee5bedfc5b6035de056dfeffb000000006a4730440220667588f29f1c5cd1d87dcdcb32b8ebad1c3f9df06a37f4aebbdd7f0a8f579aec02201e2dea6034e51392254347e5d0c51c572068f59eec78af867a5f15af225ccfec012102ad697279bf857417821e309f55bb7277952e7d8a89b9a31b9af0fab0b1df42fbffffffff0269a52300000000001976a914913a815a07a36c1f89c599342954f8718db0bcb588ac0000000000000000536a4c5048454d4901005448dc000395df7cd7db3fb803ae902737a3cafea53f2da214c675d73c21dde00bb48f9279378674eaf2a13f246e37619fa7ff13e042ecbf1c536144dc88464ce861c4bd1d66fdab7d1fe368270002000000000101291277e38df69092f16b994341193cabb739805bc9d57bcd147a8f7e2a032f700900000000fdffffff028b481d3000000000225120dc465cb3ddb389752a9e4326aa834105c5df0b0e25afe2a3f6aabff4a53bff38c6070000000000002251201dccb31f0f82f40ad7db1fffaa94bc444e4c3e24720d0bee8724dd5e707b2aac0140d6d7f8ce9042053b26f342ae2e800c652197976c97b8ae46f76fa7932302c761d1b3c44baf853c7c66ce9e4b491b83ae835b9a17d3c72d4a45295917fd34d10ee368270002000000000101e3b1260f829ed8d841e2aaf02a9eeb274747433a4c14225de2e7c53795c471570000000000fdffffff02e80300000000000022512044c31bbb7a79a223ad5de2d2489b014752d2415035d8414945a1c5e2a2fb380c08441d30000000002251208871c295a3cf31faa60aafcffddbd2cce8a69d1090027506a9e70f500f19843b0140f6f5d0d132ea374c60ba96f40a321ea03da84877fde74bf07e2b14a23d03ef6b96541a85ac85dfc299d344280a1ff227c35db12f673c6efb0c62760e1b319ecce3682700020000000001010b00aca966b8c18561fc8fa4426dac835d6bdbe363463fe60f893c8916a168e50100000000fdffffff02960f000000000000160014555154c233dbc5ffae20719896167045074cca56ef331d300000000016001425ae1a5b9eb836f7ae060ee97f19a03a2a611f4a0140585c49bea2843957de6e20f2866cbd576c8fe107811b74d55a0b36c2ae756e2b2ceb7ad3890b952b097031ac2cca972f1ecc2d7cbe16282f6faf09e43b43900ae368270002000000000101ae22f0b0e23bd4aced78e90c681a4d59592384ebc6f81d9f7f5a4be1d42f7a750000000000fdffffff02e803000000000000225120e7dd45724d6aeb8574c37d0e4afadc4667f2dd3ef6d2aff0eef5e0a148de00e5a60a409300000000225120402f4bcb1abffee5f4ccc818d3db09ccd7c1b70a53647e4ed27a790d82e983f00140ec973d0a48b7d497ba9bdafe7332a2daaaeb475c824d17e8a29c01c5752f8d8f68dc09dad2819b4bb3e78fa1a85987e53adfea82228b7b1eeecc969ad5bab3ece368270002000000000101403fdd01e3a5fa62561107399896c217f4e2999aaf4d35f0e628a8350eb8c7ee0100000000fdffffff02e8030000000000002251209b73dc8b9c6c780c62882348e18a5b5729e086160d0ceee80fc62e2656359cdc230640930000000022512025c16615e57324f11f35190098dbc9079e80183f1d6057a0d2469f9b247cf013014024457bc7d0035db5b72fa3a9a1df12130bb5f364542c65a71932ec680e140334db2d2866599eec696e76ecee971694df1882ec14eca35bc074e026ebc5e52754e3682700020000000001013f174eddfd5e17245e850e157069d2e7287e60bb2203933ff43f3846efb2b6790100000000fdffffff02a00140930000000022512018a1dba88df08da0a263cb9d42a5866680fda5a4d6c5d0d6ebfad62326c277d9e8030000000000002251209b73dc8b9c6c780c62882348e18a5b5729e086160d0ceee80fc62e2656359cdc0140022f0dee62c193ba8b3c32214b26b70806999ca0b42153bdbe7b76f84ee82ed4bcb589fbbe1ff8720499744572f769b971aa397d337c1baf50f937411674f827e36827000200000000010178c6fa3436a34927ff893b3983ea889eec15bc5fbe11bfdd96d86aefc63d226c0000000000fdffffff02e803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4381dfd3f930000000022512090aaafd0735b930c8e74ea88bf5848132a1614e6ab15675bfb12f00675beb6bb0140fd18c6fe14ccca45ed17a12f1a9ef49044b2364f5580b1dbfe5f1d14afed4a4a79972b7dd7353566c972c2abeed26ca0a13b5596966bb68f31f1a0998dea1e20e368270002000000000101bf7cabb4cdd3d1bedf8eccb425271a6d18cd910bd3525b488aeb9e9bdc2971900100000000fdffffff02e2ec3f9300000000225120042a908e005480de0281ba18457fdc8f2efb5bcc6dffb47f6f1d2138fc2255a1a00f000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b43801406b8f0c9d6a1f0b48e65f5d86d3398518f05bba7cfa977ee933742ab5a74357597416ba76118259c7f20b54611758c7a79680694a1fb0e163b60ea9d40dc3c4cae3682700020000000001011ded5a7b04d36c230e007dcf0d29e1c7a3c408374ea5c0f9fc66363389a2bf0f01000000000000000002801a060000000000220020b1e549fd6cf733a7d063eb424fbba902366b8dc8b16f7ad135eeddf946349129248c0c01000000002251205a97f32f9247e9f19edab10007746bd9c8e40a634c68cf2c2923e7ef789f353a014019a0df2be961da92e1ea9bdc14a2bb306d45f68a8c3b51230159fe722383704984488a287c0c4796cde94f7c3adeae82410aa10979e4493316a8417707aba4750000000002000000000101a5334c3bdedb4f90c55908e11af74a3089e5e9f23fc7d94607cdada3347519630000000000fdffffff022ca800000000000017a914fb6216601d558f5ac56a948d7c326bca159520f5875e375fce0000000017a9146ab59c3cdf6e5ba74e72a8ed2d32a95f7c18094c8702473044022034762bc926c0232b3129b3359b47b5de169c41039f71cb9d67b2a5ac6cf66b4102203b951bf2e1e0cbb08860b3ae2b8ce297214be39ef56db695650c271bf03525b4012102d08797d2ce0869be1d406885efceaa3f04ca13b7d0ea1b0453cbe6fb7f7a127ce368270002000000000101dafcb613feb57975a68d42ab4a7716f74d3f4f92f0ed8951d2763c30562085dd00000000171600145b306d5bfdd789c1ab77f573bc12e9f83cc62b61ffffffff02f82a00000000000022512054e38e7bb085643a6ebff29ce19ad200bf6be0fe0f77ede15528306faa8d0aa0817c00000000000017a914fb6216601d558f5ac56a948d7c326bca159520f5870247304402200df3bda7cf90430a2598b3e5554793c5f3d2596a609e168b4e72879fbdde73cf02202cd58a9e04db5d46cada87dd02228f9811a9ce98ffe186e0be3df6e73597903101210214b0314810640234a862b97fbea9f7d95eec84f09ba05676348983a20bfeb0c8000000000200000000010200045d10fddb3f6665553b0658ceed6d0f3e40598ea5573ffa30e44c5a0d98e20100000000ffffffff65dbf3905457f685f4b94487e34cf152dffed058c4c9a0b8c870862f318bbf1a0100000000ffffffff01ccf21700000000001600147c528c37d8c5a79679f13eeb2f1419644a21e5010247304402203ebbf24f9c4a060620945aedbd98dce6c95b4cafa7c9703889d9ccf584cc0f6902204495f4e4244c0961766f2cd05a3a87a172c15b3048f128cfdc708902b9c279060121039b2b3ce4e83ed02b92fb28e52b72fc57b974c5d56e873b7dc5ea1dd21d538de30247304402204db05fa9bd50d7ebcf8f44e37634a61de8166218bd183dedb2d242d3b0603a830220627d3d5f6481442c66bd0cee4c47e83351a6b991fe5161978fff90ae6d407e830121039b2b3ce4e83ed02b92fb28e52b72fc57b974c5d56e873b7dc5ea1dd21d538de30000000002000000000101b788451049494f1e0a2d108c91e44661167bfff9026da18c6cd4694cb06964780100000000fdffffff06e8030000000000001600149bf381e5b9e72d82ce384515ec82978bf0513adde80300000000000016001449b26b175a83424c32efcdb77acda106bbbdf642e92e093600000000225120b46093aea9e8a8899fb7e12af3c6d01e93ae58ddf5bf528e4bd3fc8802dd8989e803000000000000225120d2690e22b430b38d656af36cebe78e5d04a8ac23ecae0b4d483a2723e2b5c24be803000000000000160014cda3452eafdd5a46a04ca6e20ca0b59752db00cad00700000000000016001466132bef9db5eecfb53b5679f5241873176177bd0140b54b2c86c64353c3eba8edcf1b19cf1678f9bccf76aa20a1137259cdf3b18a2a45af38dbeec3136ca8ed4b37bfe4a4408a95864cca13149f1927872b9e0ef522e3682700020000000001012986099f63b2f0681c63d722be2987ed5cd336a2937c4470d8e946598b11e17f0200000000fdffffff02662a093600000000225120954b5421b96ccf0c8f997d082565c80fe5be831cec02b3bdc95aa6388bfcc1e7e803000000000000225120018533a377928ab61602c140456d43f49b0c73b799d3d2219fe94bea63f9a0170140b913cd3b963a88c8f4cfd8e4f31cdd6bb177d9a619ab106b7c7f40f4d2aa45e58df01c6774062fbcd1df08349d96c748ff9b598b9f4979d93cd61ecb01f66898e368270002000000000101b54fbca208cc3e8255d631b35ee694b0b02ec7ff837a4374ead0729d9dad8b400000000000fdffffff03e803000000000000225120018533a377928ab61602c140456d43f49b0c73b799d3d2219fe94bea63f9a0170c1a0936000000002251207caee67f19a95075b3b5eae81b3e09969c27e50e764f7c26b5f5acbd40524d3eb80b000000000000160014878fcf1c359d161ebcfa2d9f588365821077ceaf01403f87fca572d6ee2645614ea50b24b1288da9530a19da7eacd950a9e6205c487fd0e1fb5967848b7501dbae839e636c15fd41d23c1bed23e5961e88bfbaa088cde368270002000000000101a6618bfe766f25aa6bb7c2f92060c5eacd0c67a85e5228195ddb97be7ebf94be0100000000fdffffff02a1150936000000001600142236a62a9e06b91be089b9eb8cc74520c3790d37e803000000000000160014cda3452eafdd5a46a04ca6e20ca0b59752db00ca01404a623d7c5aa7536cdce869bacbaf679778194ef7591e36d5910d71f98bb5d337a571b7a0f2229a41d9c8ac2e3ffa8be5bef3b427e6dc1fcf7d090e8cfb685416e368270002000000000101d1e9817d3b0e4d916c0912a59a314356b98d88431a4edfeb67282e367109695c0200000000fdffffff05676db390000000002251208c582be0d7b23510755a538cd7e5dd6e49f89ed4fbb3d147adb8b853eac1980ae80300000000000016001449b26b175a83424c32efcdb77acda106bbbdf642d00700000000000016001483a9f8c43ca0bfd55694aeeaa48b54977eea153ce80300000000000016001466132bef9db5eecfb53b5679f5241873176177bde803000000000000225120e7dd45724d6aeb8574c37d0e4afadc4667f2dd3ef6d2aff0eef5e0a148de00e501401cc5c7813fa1a698c9b22c52a5d5250a62b42933b535c27a50b01fd4a0fa9a2f0fb827a856f1336e5f91ddafd999a78a6089c5175b567443a61bbb254384db90e3682700020000000001013e20b0a9337bf647a77fa99d8457c325b543b6d607a02ae71e35705628fff4c10000000000fdffffff02fc68b39000000000160014a96acc716c0ee35fe172d452f8ad8bd4715c6c27e80300000000000016001444b7e0ca7d93851fc2b5a4fe4947fe28eecf7a8401403acc366dbb5e1b0359ffa6a8c5a7e6bdb0fb3a0afdcad9b301c88e58b9b0813ce2569bd619123191c1cafed6c1f2af2c23eb32e4a12645b513df1c17c7a68bf99268270002000000015017830885e8ab39fd1725a77bf4562b64922605e7e98bec41d92ef38e0178fe000000006b483045022100b90fc4b4bd3e7196f039dfc62a5052e27e35a16f0f1711f3cde06f8f9381bd3302203d324ec8a25f30ed4d09d6d51f65900bba70389f3464165e911acb99b0f11242012102ad697279bf857417821e309f55bb7277952e7d8a89b9a31b9af0fab0b1df42fbffffffff024ca42300000000001976a914913a815a07a36c1f89c599342954f8718db0bcb588ac0000000000000000536a4c5048454d4901005448f4000395f8a9650076cc1da0930aecfe464ce861c4bd1d66fdab7d1ffbf37336194acbd3ec0cad7dc0d4c5122cf4f933971627f68a597c4646fed283756bd30b02db8bd15753a216e36827000200000001410bf95149e8fbb0cab9af760e2995d1ed0797b5e90fa895b1189e1ab26723b1000000006a47304402202c81721e798e8933a9eff0a8c7b698aaecc77445b56ddedd240560e2088e6f4102207a555e01368120f3f0f7af0fd5efb1f8163b8656ac21bb9e6b17cf00205ad4e9012102ad697279bf857417821e309f55bb7277952e7d8a89b9a31b9af0fab0b1df42fbffffffff022fa32300000000001976a914913a815a07a36c1f89c599342954f8718db0bcb588ac0000000000000000536a4c5048454d49010054490d000396117a2c9bd94bb45238e77d93756bd30b02db8bd15753a216b5996f06025ec3e769e56c2488a0db413b77c9c6aa3af7ecf9b258a463517c5a7737bc6108d3111030ad8a5fe36827000200000000010107d1d449b01ca7244bbe177bc0618408f7debd60aa7d58a84ca88f093c8a06330000000000fdffffff04e8030000000000001600149a84e5fdcd74e17b757c8a0fca0d0701287cf13be8030000000000001600148a53f1f4fb979f2b4177407a32ac6c4f51ce0963b80b0000000000001600145042586a12cfdf0f74d1dceafc7bfd5afe69e6b88ca2322000000000160014cadccaebe26ec27e4d29bbc306afe712c96fcf430140756fc2fab59b323207568ffdfa93bd66f9b37c8ab3ddaadd5e23d511bb8e2ebe973e85006a458492ddc9a60216d5ab4b36f459d29a5283c9ed0ff8a9685ff1989f6827000200000000010182f5fbf222d93b4f90f58c1a46be836ca67774d9c0ef46d5b4caa0337b367d720100000000fdffffff04e803000000000000160014ab606dbaabf22db67240c601d048ec69cd1b85d925eefc340000000016001429f79ecb7ef23b42ee1a25bf04fe1523194c1af6e80300000000000016001449b26b175a83424c32efcdb77acda106bbbdf642e8030000000000001600149bf381e5b9e72d82ce384515ec82978bf0513add01401ba300274538f99c859935b397434c6a8c361689a539d4b63fca8a2d260c0b2c3cdda4eaae91189763b2cf036b3c1117c980d9cc200a4d5b23b04a163925e5ede3682700020000000001020dc7a23833257a4b46050b12a435c20e458285ba7accc2f670f8bbd32a919f7d0000000000ffffffff17e89d8fe2a7dcbb032f361e0e298dfe0f38fa9baa867d6dc4cc092d7d3972a90200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b1b476000000000000160014c37559404111e69b860fb0845b90dbbf02a3933102473044022046ed7c4365e4917580ca3ce66fb08fab55daf491dda9de51c6c08c8175b9852502207e4ef8cf3d1df6e8c50fa326284528adf41ae6586b7d678afe7f80dba6579dac012103602e925ad39565006450bb4bd8da236ac45f0a2735b2818935dffec12cdb9c8e02473044022031ea7daaed134fb9a5ff230cfe3c5c6aef99e5bb686669d69710e6616b3b4084022029969568765ce2561fb76e39e0be5084121566162449eafb41f92072df8e1ad9012103602e925ad39565006450bb4bd8da236ac45f0a2735b2818935dffec12cdb9c8e0000000002000000000102c252f33b33e6156058b382aef901d6f9041def40a8cd61c1e46690c49664a76e1300000000ffffffffc4467d24da9f0f30a79fc1a1aaa646030ad22729e84c4d647c81a6c899b51f721400000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b617030000000000001600146a22e7a41ced835b5c05060978f033766691f7ec02473044022057729b43bdc4f42f73053ede7754122498eef5dd350e0bd844eae8c18a261ebe022015903c75ea1ea64bd5ccd3cd865aaf86d423c218f1c0fb6321ea39cbee9759370121024608c1379535396b07218d50d75c794ea62f8df468a2a8636cf564a4f1a661d90247304402204840a49f2337a76e23bb200a96722b9c54b66e5ae4f124d1f280079c4eaa137002200462370c32ffe277e3ca331a6a174fc0c4504e58ad4760821cc86d3868f0663c0121024608c1379535396b07218d50d75c794ea62f8df468a2a8636cf564a4f1a661d90000000002000000000102ea2e6410481e32f4e3e8abf5a61ad42b584c49e130630b8c521c9a114c73183f0000000000ffffffff3b26ce2c6474d15a873c2b9d1b0793e2e6ada8917e4a6a235a0bfe19677574460200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b1440801000000000016001410bd408c459e9c06b3977acb74877fb5660d982d0247304402204f98c06cfb6d41d23c249bc79865b8c41363000f1e1a6332a1a82a08b6812bfd02205e0c7dcbadde9c3ca924ef21ed9a7b040b55499d228ae93737baca9468f256aa01210364f4fbef1ce46d8de80824286e3f50fa0042af64d09f0b4682f86adfb4e10487024730440220710938d97a316259c4f100ac2f30a82b246bb115914e27043206c119e481d0d802205e7e371f5b5e6bb5ca6e69c46196ae95e7ec8b90c3f53c41208d36cc3f2e653901210364f4fbef1ce46d8de80824286e3f50fa0042af64d09f0b4682f86adfb4e10487000000000200000000010292fb1edb3cb0ac0b19910d906b9f1bb119250627887b9951f3f0926bcd0cc0800000000000fffffffff0ba794ec465b2c35c880f955f0aa29a915717e98cf147645a96bb776684c49b0200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b10abe000000000000160014c0de515b7b9af23b2c092829d450e7c39435fda402473044022045a8405fe33a5bf20274fc1d4b2c9db3d5e500b24c202d10e460f9809154420202206732056700e3ec30a6ff85640b14417d3b9d9314b0d0b2696652d3a0e99a5c780121023823a9a71aba53a0cb10523d0d3535d4b11e214f9e851ab76003858c2348a5350247304402200d19c0aa1a16e926d62368c59a8ff967a16d3a6bd9795201e5e279f173ad4fff0220680bd6255cc3e12e2ab94648062ba656bb08d84ed186af72466462f59b6e9f8c0121023823a9a71aba53a0cb10523d0d3535d4b11e214f9e851ab76003858c2348a5350000000002000000000101eb8f96064531904675857494bac7600be6ac3ac93bd77d649a213fb210bc16850100000000fdffffff02c8e1fc3400000000225120f2ea4986e4f6719a25f6d41c7e05dbca2a3b761e19c7401ec075337900e81e81b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b43802473044022074cc7aeb3fc311febae033c22bcd3658b2701028db560ef2a883955d953a150b022058e7ee7e33b779076c82536b2d04b5e8dce0b009449b27cbd36345e06ddfe308012102569f4993c4ec0cf2b8bc64a3ff4cb02d9b3af06d003b1066cd735c4e3ded285fe368270002000000000101b4017fad24413ead48510e5d7f371384a5728321a5f0d9b6bc2adbbe56e8f6490000000000fdffffff03b80b0000000000001600147ec1cd3e870038b01084b4c5e04307910f40e20cd007000000000000225120cdf8dc839e48faa5c7f16391d488a6ec8be3f3d2f474c01c2852cd1b848804d586cdfc34000000002251206db9d7cb7d304512409412b51d8b8151fc5ed2773110b25ef28517ac137dc4940140bda607ef10703dbfd943b451dbda7e5abfe6e5e366b004c1003671275cdb563efd2b4a9dd60b5ad71d212061155719bfc19dcf9e0c338f9ab91563c90ca2219ce36827000200000000010153f8f7741db1c9d16ce6dd65433837d18ff893b70d3b058d7f926ac9e22e7aee0200000000fdffffff03b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b438e803000000000000160014d7c479ba137c14ec58be7ae5840b7537980288732cbdfc3400000000225120bc0066a2bcfa203503ae1f348a68f58bf12808380b690cf45497bb9563b2941e01404f8e483144dfb631a9eec38bf2876bf8622f604e254a0e057ace9a64e8ca69b406db59a2f8d4950ef25efc3e2ce429ba49f0a641ce3efe619c09f956fa5c5350e3682700020000000001015cd3ea9aa4d8d442fc11c31c87f83d0025ccd7925c77671dc8f5a9f0fd69f2c80200000000fdffffff02e803000000000000160014cda3452eafdd5a46a04ca6e20ca0b59752db00cac1b8fc3400000000160014d6348a7d763fa02716aeff5f78672a5fb0ad2bd50140836f103b77261415b823e8647bb5773e94d849888d835f310a0d935a8069f52ceb467a0dbe630b17c30a197e2620c1d985e77b5749bc4428328703abb98adc26e368270002000000000101353f3233c7dacee43b8d0b6682155dbb639d6e9be819ed1cc552f26dca8b1cc40000000000fdffffff05e80300000000000016001418f78e6f1e1d18f957e4e842ceb747a68d10dc92e8030000000000001600149a84e5fdcd74e17b757c8a0fca0d0701287cf13b4ccaba33000000001600142b7a38a714a5089f3d981474a432fd34b53598f0e8030000000000001600149bf381e5b9e72d82ce384515ec82978bf0513addb80b0000000000001600147d19c06bfee9aaa285e7a4daadf6f978721a6af1014075a725fab81be7037de81dd74588d17fa983a7ae62ab9e07183947944e2edcca9dbf3484e6d157ce78671d27073e18b46ce8bf3895c2cd31208f9a328ee4591dbd68270002000000000101cf0b15a9c9c509d00a879068f3871d4c71cb23372f9eec135a28903b19c4bf280200000000fdffffff02e803000000000000225120d2690e22b430b38d656af36cebe78e5d04a8ac23ecae0b4d483a2723e2b5c24bbfc5ba33000000002251207eb3e19e92f1e866dcdaf0f8011752abe5c6c209ab0af9d151cb198ca9ac4158024730440220674bfae7df36c3de23d65e52b757f5fac38019976150dfe764f1a55bbd9f767a022051277533c53f82c9cef442b1e3316bbc77f8fe07a4af4d9f9127c2690e93b7e00121036cabe650ee700dfe57b2b71c1e2e1e7d0632d5765781556a7ce2bd459f387b13e36827000200000000010114720ec24607ef5ec2de889619f29b112736c15e5d7e433f6ca8241bf2a8c2ed0100000000fdffffff04c6070000000000001600140c463dad6b9a23d7a07bc6235a97f1937d4928a55cb1ba3300000000225120d0609acf29d517c5537d302d4bf8f19c50ce2c3b40ac670abc0b1d16191a0d68d007000000000000225120052b00884986d9f36dbb732456a8ac78c8c9b79950b3a4428ada538b7def48e3e803000000000000225120cdf8dc839e48faa5c7f16391d488a6ec8be3f3d2f474c01c2852cd1b848804d5014075eee41be4172e5f7b2612c53b3d0f14ddcdc63c3de4022d806bf19e935931af8294d45d55d3fa503bec70de6884b68ed55a9d61b753ef8bbe67dd5b2c436b15e368270002000000000101963ef85a0b6168d0960f5e934e55b05291dea83921eb692067fcf6527d723c580100000000fdffffff02e803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b438d9acba3300000000225120cc0cc991753e7b3191f7a2fbba4b8b485d9dbfd00e5995dbc4189060ce54fdb50140fb6fb4deebcdc6d4fb533883eaac9d2751be494da463000e9e6ba0d4661d693141d3d0075639505d3caad347a1f151fcc1085559be07b40a391235ab07868adbe368270002000000000101ac57278c32ffdfcbe15cbea02aa927ab5ee52f9be3cc7d7ae422d728b0fdc0280100000000fdffffff0286a0ba33000000002251205de38abd5b5b6974c794e898f12d10541c93b537ca83eccbc1411fdef8a4ce55b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380140d4ceea6ecc3d4457026400b6c40156e2335635190f5b7b5d29f1e656f6711792831683ab05641e05f90b2f6722e9c637cb90778884585ec25c2e1cd7421501c0d2682700020000000001015122f41a07b3c385ea5643718ec46692be23bd0565f1b4d13a650d916f2829850000000000fdffffff029f5cb39000000000225120a2b5d677158311cb681bbb2482202f397e19a6fb2424c73c2c9bd93f3cf2c513b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380247304402202609fe3cffb195e99d32def6e50be5e03600cfcdc8b4499aa0893f403f218810022046d4d3a3b9c83fa6a2cc0097c680ba078bf5e9cf6114483db26ae03c33b2aea5012103c70372021586d91a369a71f797f194ea2a0f6ac3adf43c5aacca9d3e2395a20ce3682700020000000001011b5a775f8df8fe3a1c5072befa497b07a0742ee9be268758bab0c428c67ee5510000000000fdffffff03d007000000000000160014d8c22c59d6f3539a635c0135eb1af15f77507c722d50b3900000000022512005688b2ed960f80c6237fa85e7d8f0f0ac554b5213cf142a81d91ffb3f3d34d1e803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380140eae22b92904ca136ff6109e4de0e9549c6ac4ac126a4653a91f413125868c0736aa5bdd25c634bb89946af0223fa683b03dd773a6a65511a2f4f2907da8076d1e368270002000000000101e0e790f09c68ad58102c0c43065d08d3eccd075237375622094225e38bf63a620100000000fdffffff02c24bb3900000000016001460c0def8a72413281b06e0c8afbc0e1bda4652c0e803000000000000160014137deb81c7a9b337310e447540b76167efa6c25401409f7409ef0db0023f09ef1c823f84f796c5ae0168d45b3541a27cc7a5ba38af883d129eaccae1009c9d953a6b4d6e3b7e579ecdd7fb075927ee34ec2c7b96cacee368270002000000000103cdfc320c6f73b7578721053bc1b845263b48421220f87b5d273c3e3f9b5a17430100000000ffffffff92134a1d0a94c870c4e7135d75adbf4262eadba69fbd97acdeac6b4fdc5ecf4c1500000000ffffffffa1723ef25c30d29c505b845da411a9126457378a9d2b4d74c0ca6db7cfda8a3e0400000000ffffffff016b560000000000001600148cdf2e9e451456626f2bb4b3d808cfcd4e85044302473044022054cd4442eebfda1c87d9e860d0537072d6e6552909608257694095b84a1ad4f602202eee3d008f76ded05c417239457ee848bb241ba4d02bbba71b0681982b07283f012103d32774d8bb0182637668f4222c0f4c4c6ee3b0a560dce3d628ad848011f066b202483045022100d27ec2bb9d67c341e78d45c05e828ec0ad0dc49f816ca29e4253cb0c2ec0023102203eaaa169b69d25b6640156fdcb1e20aa4c551c238d848e5c7d514fc189bafe6e012103d32774d8bb0182637668f4222c0f4c4c6ee3b0a560dce3d628ad848011f066b202473044022075d8a9bdd893f1bd9e94139c8f6398391d637ecbdf43a428638e9783c6132b4702200d2a43a70ce713e02b95fe44f9dd4e840c3471f8b80cb530115bf1862462e801012103d32774d8bb0182637668f4222c0f4c4c6ee3b0a560dce3d628ad848011f066b200000000020000000001019ade6270a17484e06a4221beff7cd7edaa0b6026522f3a0d91d36a9a2829c74c0300000000fdffffff022f9632200000000022512000658c87d50f1687822cd531f4e190ca3b083a4d7c979e046c38d70a768ff90ab80b00000000000022512032efc4ae508d2b9b3cdbe0b45f31c9690d5dab79ad7352b7f5789ebbad94233d024730440220437d399e0cf17997a6f7fc5e917ec40c39ef4ec1305de0a43329f6d02c9bd2d00220682d4dda245b964eebd06f8a06775e5d307ed54ea88e4675234df24ad53ce93e01210373085f211b700c1e396c9e8d09ab6494a168e32737d88c03a48a4c77b5ff4879e3682700020000000001013b7985af5fd82a87366146618e948c5ce12f5609162d7076f77d5b9bb82370c80000000000fdffffff04e803000000000000160014cda3452eafdd5a46a04ca6e20ca0b59752db00ca9e89322000000000225120f62eaf8fe84e84403a54b2259dc5b0493754ff839b2ce23182a4449f0bd97b2ae803000000000000225120d2690e22b430b38d656af36cebe78e5d04a8ac23ecae0b4d483a2723e2b5c24be8030000000000001600140c463dad6b9a23d7a07bc6235a97f1937d4928a501407adeba629b61b0e409c07fb49de4b965564a2f73c5e7a8f1c44b3b50e4157aa7fb53f6b2e7f29cda7319f263df6128b1b3b86430aecee33c261ea2cacbdd71c7e36827000200000000010170e67d3a42970af278bdd232b2dbe464d54ed7f392f6e50b6caa4650aaf090710100000000fdffffff02b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4384b7d3220000000002251200123e4c42540816279fae663d96591e94c2c63f938ab1d835e5e58f6e97d1a2901403938e05687c09be9535805722035fdbc50e9356995dad44290c665f2c5d725fc36a64dbe3a341f234ccf32a4dd4c3e8cefe891a1eccab97ae0862ac1f735b5a7e368270002000000000101a52157227d4fa93baa427590a866b3576d90de5dba80201d1a1e5956df597ba70100000000fdffffff05b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b438e8030000000000001600149bc7d623cf0a83559582aaa7a088ff6597ecf3f1e8030000000000001600144ebca39309a73d28f34e271ad33f3eae4ee5a326e80300000000000016001434c0e80c22eaf16997712dc8d13e59e83f224c64e364322000000000225120cdd70d415f43531e3b362296895f9965e894385993d80eabd20040bc166afe890140ec63bcc0fc0bf944afc565185b869b89b433c6b5da17ea84e85b5416485a8781f99c1349c71ca26f34c416bc9662afd4ba4f00e64bb895bf7ef321c52114f45ade682700020000000001017c21909e37af7989e551b24a46271c0cf59606576ff7a26c842232326029cb7f0000000000fdffffff03e803000000000000225120e7dd45724d6aeb8574c37d0e4afadc4667f2dd3ef6d2aff0eef5e0a148de00e5b80b000000000000160014b0fc9c741360710819aa2dad88c22a044a156adc82ef17000000000022512035fc6b074ba9e9ecadbc17834f6b1675537bd05daf4c7e5a123a8ad10c5f052202473044022012fb8e64472acf5197a1d78f0939df5724d7f02444c74435d63d4d3a8ef9468d02204c684ad3c65bb8541e376adf3b7c5a7fcc41429cc5d82208a5e5640358c6346e0121035213adb150f3c150117f16f987e1ee8401165e11a1b3a57b4e5fa757de931612d368270002000000000101ab3ad379e8c8c24f54d99529d47381bbc47699ce64e026aa273952250b7c125d0200000000fdffffff03d007000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b43804e3170000000000225120ab05c14694ea0374b2317b4280c075a6a13ed132e53080201564323d939371f6e803000000000000225120d2690e22b430b38d656af36cebe78e5d04a8ac23ecae0b4d483a2723e2b5c24b0140641273364bbfa566f9350735cfe7be27d373cc1a5f6aeb727ae42ebed7cf4272205eb350d3cb1861c26b038d95a2ab029389af7ccd396f82b5c1602e0a5b9ac4e36827000200000000010136f817f649173cfcef8e4fee2a7ff33a00a6a91fded26d90ffa44bc0767cde330100000000fdffffff0299de170000000000160014f252b2352faf517ad3a6093d2d802842cb7a97cde8030000000000001600140c463dad6b9a23d7a07bc6235a97f1937d4928a50140410316a77a57cf5f6bb7ab7852bd4e2a94c6f1472ab2029e79e4f52755c7cf42621ff9b9450b44773e73f4a6bb26a03666779592948a571c0fe57584b16201f4e368270002000000000101be3bcf7087d3aac271fdd87f07bfa8f1f89268118677a2cf7433ac01a104b3360000000000fdffffff03b80b000000000000225120c1fb9231f8cbb4ad7e7775cc2e56e044bf97942e866e58e28b7d2b6206613c8856083536000000002251202a455ba9cfdbfcce9087eb5628eed481dfb9da00d8947d0a450decdf3bcabc09e8030000000000001600149b9bccbbf16e435a4b1cc67beb65eeaa6844fd2002473044022069dca1f68cdb17b7e9ce8e4e0486abd3b36d93d0474690cb17965273a89aaeb5022075ecd36875c0bc3ff69893845331dc0c14b409e8062ca9ca3c46610cc05de68c012103ab6dec53d60ab834ab4766aa75d79b8b3860c164bd5dadecbac4d6de737a5293e368270002000000000101f5c5e0cb0ed0c396cec811f6e85436c1c7a383a4395a5ee6739b4e451e8171970100000000fdffffff02eb03353600000000160014bc6342ba2f61024b98ad45b1791155f2c14f8948e80300000000000016001438d55a629aefb0f616b2741ddbc21ea4396a270c0140a3eb35a4e8708437fad1cb46da749331c9d0281415166b00bff8c9f67d4cb2bf2efbf463f6bfb1a5bd3e3db55807a0243f6ca00f7aa2ff5102a2604b2b20d79ce36827000200000000010186cbc042aabb968904bbb20f504f449430baeb9e57192286cf2f5276faefda8d0000000000fdffffff02e8030000000000002251207ebcafed0448c6a4339050330900940fb56ed48ffb146c760e4b2fd7ecaef2245eff343600000000225120c0cfa7dd1aef169e20fd519185aa57a2b751df82f8d299cc1ffdf0ffac59fc350247304402207216b4ad363d5c153c4bfaa67f6f1fe64d1676d861fb10fe8b0e574bdd65852d02206c4993b5591a33fa13e9b559ea2bc5f03c612f909b349e31a264e5c93d64fed30121037189e0c2d35bc220664acd5b634795242d226571800cc921896638e52f40497ae368270002000000000101f47496be57fb6cb8e7b849c9365a23bc1e8bb8d7cc3ce579302deba9627de13d0100000000fdffffff03a00f000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b43828e73436000000002251206e80c15dca1839c41942eeb99047835fec4c7c9094450c820a62c13abba72dfdd00700000000000022512093a5c7eaf46eb597f4b80d3ce0b7931d37a925cc17935add9148126ee3ad817c014063fbc0f8254053bb59eb910f70606939b71c99a8d618417615aa4b42b0bd85a59345908d8d8babe6936ea4644d6ad03b21efe84d599f3b5f29253a24bf5ffb4de368270002000000000101403e1c583b06d3ed3dca95d1687a742fe1db7e8e8d0c827dbba544ee69c2358e0100000000fdffffff02e80300000000000016001456217664b6c2d80b5f3a80cedfdb1510d2dff390bde234360000000016001463b0bed310d65f45ff85b244563c791f2427948e01407055ac85a3ffb69f62776989766a15283358d943189b2d8b980f4f1d36050027c9f4b11ac19e9dbf8916822f14b2b91101d45a08a21f7c14e80332c2d5a54518e368270002000000000103d95389160d7c66cf03c19aea34ee7625560b06144d1be629265cd4e77256f9540700000000ffffffffceaf8cc277428f14fb306085ecb1692171af0229b40d5aff4a5817d217f61f4c0100000000ffffffff385514212a2ef9ce78a251ec7ba2346457a0c614f6048feb63a7e45a3821663b0100000000ffffffff02204e00000000000017a914130088a3eb590933f095016eb167095ecf982709875b0d0000000000001600146e90d055ca4f9dd39d5bf01bd0bf53054ae43c0e024830450221008d679900b5752bbaa1024beef056f8fb46e46de3cf470a9699c7eaee2b6c6fba02205ff6f8c71edc4dccf0c81218d7507a7752ed01cf6af5c5661a343c1984ad297b0121022a6794e572e90b0d8e81c1e485aad02b7d22d22a9662ff76c15da10ade33657c0247304402205238aa15546c1b6623265776addca67972005e6138e8105c1a86d168c4eab34b0220555194d658ce01ffe3555b3df42d6303ab354439ae4212b7ea865d695725bca40121022a6794e572e90b0d8e81c1e485aad02b7d22d22a9662ff76c15da10ade33657c0247304402204d359589496c00d4707c31edbbac238fc1bb240fb7217d35907ff4c8e867088202205bd8f314d06f4b3a0d2e64d5310b84946a2783e6cbaca4d85b4ffc6816b72d200121022a6794e572e90b0d8e81c1e485aad02b7d22d22a9662ff76c15da10ade33657c0000000002000000000102bfdf30ff94c284ea2e26f7c1180b0619c9d9f605494b2e40198d3edc6525771d0100000000fdffffffdb48b66aef0968340fb088e38ded25413ae1c3eb89b6790d908324bc8d43280d0100000000fdffffff04a086010000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000006a51687c41b8a1b7913b7c05a9592ea9f7abe64de89700000000000016001475a9ed2b068c41c75aed0d53c2ce24526012e4f00247304402201f9cd34eb08b7d3492101a41883d390f0f9576bdf6a7723df39c67cfe80239f3022025d436561ce8f291f6dcaa40cf48ae3b4e47c7b6aa426621721b6e9effe3bb51012102543a4f96cab11597586a5ee849553e9d6cff38e7396fd0a84b772c9161e477a502473044022075c4a12562f125aaa7d52c118aa6ef00e28af51d80180c8adcb31fce547bb4eb02207ae0aefe3a3651b167b91508d2a1722973babaf5b8ca9179f4ff064aef3d9a6f012102543a4f96cab11597586a5ee849553e9d6cff38e7396fd0a84b772c9161e477a50000000001000000000103053262c3fc6dc6ece26720c0a25c70a623bdabee69750690431410fa9d490ac40000000000fdffffffadb737b5c3cd59fb251acc953e3fb41825b24573bcbaada33bb3dbbeae6818890000000000fdffffff62041e3ab3b3cd05053da5311e96b368be0a148a5774f5b503a0fdc0b42cf6cd0000000000fdffffff03102700000000000016001455c6fe4801130a284c1aa2bd92223d8c5c45f2db0000000000000000226a20430d99bdee2e907ce0abfba9570d39bca3bded1afd5cbcd2e12a27ad08887360b829000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce02463043021f24b130633fa85ea672d327486450eb916529f87bb9fa38a46f3c73509d0ea9022046b653047df735e9d4377e0a6103e802381474b60ab651b350506964d0a51492012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100c5c51c5f6fa718c7814c7dcdceea0a04b48e44e0a4ec19f0dd6e8d83ab58910f022062bc17e671391bc9bc3b2cd5149ba3a4fd84278bd931be993123b473d43c0e58012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100cce56b97f9a383d6a303a32f038b5dad22df54c29074e076692b6c54405dd7a5022010e116597aa7b03cf2cf6fd38afc82aa249b3c036b87ccd4b2265365e4a69b54012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0000000002000000000101679a9b5f26e2398634cf130d153c8f1e3906d734c5a20ec86072e985f71451680100000000fdffffff0282fe8b350000000022512069dab39fdab3e219d22c1f6dc811fd0e5f5c087c217246c68f144919212349fae803000000000000225120339598fd8fe24098b4a654625b366ea1d23122df06095ba57cda341333e6cae102473044022005d428fb13a4e0ef7659811991cb586b2bd1df2fecd6297ffa194978baa92724022024c03861800c9c34cd3783eba55bafbd6d1d1cb3e6f63f4f44f371026ec21d520121028d0e5f40e26c82dd9a039e50c2abe2e138e18c91511686ee906d7c6844807b98e36827000200000000010101479b2c169980fd8c97782157a1db4e5653bb1fb46099aa1533efa8cc19ed1c0000000000fdffffff0310f68b35000000001600141b2dcd4a259539df46ed651038765875bb2cced3e8030000000000001600145ef4634eed6ea527aa9cb8602eb0549c57317b22e803000000000000160014b66119bbc087b59e3cc3027bb079ae3560be3b2a014006f3a8a3409fc5aaaf8eb8fb3f903b18a8b4190428d174afc4fbd7730e095d53a89a05f62706218f721c505c80db20f7c0b4be672c9e678cdd197d73311f43b7e368270001000000000103246137bbea6c2ffe9bceb06088f9b0f28d265d31047eac39b35f58e0e330cef10000000000fdfffffff93ca3ecd2b9f755245d7b0b6c0a85aa327abbcaaeaf44fb0630322c4110143c0000000000fdffffff2cf4c0d1ab1cf6c8b5b6baec974184bd255bfb9bbf039551d8d9a16052a1c88d0000000000fdffffff0310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20c5b9d6f1b2ae1e5ef3e7bdd77c9896e0ffec45ef207c8640bc70fd6ea2c621e0942d0000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02483045022100aebdb6d78f9c570b589bc497c479b6eb563f87899570673d92f7735cc503d4b902201493b4e45b99ae331267fa72a655980b20f6d42f99b0928b7bae416829394afa01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402206fae882479d02e84032b4683d09c580da7a5ac37d1d60cc68935e1346ed52e0c02204fd1e4fd6810245f7408603cb35ec0694d46a4784117c0d4e91f896e8fba59d901210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022046da3f46f93ac4ef00bf8681e1f1076749a8f44098d7e0f56eeb4c82bd5cf175022071327868c664bbc84f0dd545689e239c48a7ca3b4b68152f3f0a0a382420e0ae01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c00000000020000000001018d9dd3cd20c786ecf805276bd82ca50e1769f31129b24c1f68554a94f62a76b10000000000fdffffff02d0070000000000001600141b5a6849b3e79d5269c24b59e472197773166e570519ad6607000000160014c9028d1b498567957617b499fd8a133cc5de49660247304402203dc5c112664ff18519fdb8ca8a7197bcfa0edaac303d8cd0fb25087c992ed35702201d6b8033f6f7824bfbf89aaa95973f5eb865ce2546382a7e55dda34dcd2e37bb012102bf03687ddc56e0f4878193253ab4a4e5bfac11e5b7767bd2f8b101bcea313fa4dc68270002000000000101872ba0fcf40297ff79cf1d447e83918be2800df84a337305e7835ca0f7d932750100000000fdffffff037110ad6607000000225120a7804ad9f806b3de9ab4f5be9fd1fc5d5d032545df5fe2c21473ab8a997e0d08e803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b438e80300000000000016001486baa93efaf1c16ab474ee51c6365ed6111007c50247304402207ea3231167f564601e6be29620f27b7842d9ea79bb43bc75d8aa4d21cdad8580022009c90c0a680b2b5bf5e987762ce552f2e8d6526f9cc4415843ab7383a4d16990012102899623d9d144ab897fa0e315e9e3bfed873c00844709070f999e2c7413721d74e368270002000000000101bb87dcda41234c2361822e9926333d6dfadcb26f338cb4be7332d9693bdddf900000000000fdffffff02060cad66070000001600142cdbad34b0637405c2710d530c1e1f023ab85205e80300000000000016001475dfad64998380d6ff2a10650fd53857ee1978f40140ff6e713fadceb6680866baa33117bf9d82a9e31edb64da413fc88a8704204190d3ea8d5f86645ded74a6f06bf7b704655cb014dc19d1dd7e9defa81234edff4e866827000200000000010164c1955533d77dbca45b6dbb2245d57edb654482c47302c7a93e7b8cb4f7eff00000000000fdffffff027907ad6607000000225120e5819e4c5710a85ec5c2c5c1d20bac4d0d52687890ae0f893441cc74ba251fc1e803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380247304402204224b50b209f288cee5c18420024c6db00729f50fe31253ea6c9d0c02d4803510220017f36cf6132ef03a0bb4e9776f79c9797e8c59dd2c16c08866888373b4e825b012103d6a7bdfece31f19927dd2565a785255097345988ba7f7547165b27c11c39aa4de368270002000000000101647a526a452b1d5d9e091df24842024975f05b13f4e439d51978106418e3f2660000000000fdffffff03a00f000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b438e8030000000000001600140a65330e276b0d4ab8ad8bd3bc4ce60f910f178b37f3ac66070000002251206b78e63d8ebd1af2e428d1b997303a39e7ee66888badab8cbdd37284889740610140777cd728c05e859c3df6722921b6b0c04fdb9226cf7ba610720ea1ea6b1878deffe8b7940876ad521f47f22ffc0fd6aabbd61d916af1032a60ae8702d0ef9a8be368270002000000000101a60075e0fed4e30b87820025e4bcac7cf518ac4bfd325ec9e877f27903191b140000000000fdffffff02e803000000000000160014b2433f45e10e2e7a53938980babb17c9905362fb9bf18b3500000000160014b2a60fa8cf8a76c8025de7403fc7a83abb9e375402473044022072ef5cf9b713c4cc8cdd2faa3d943d77b82b811d66caaf4ff87942edbc60c2ff02200e3ae0aaa42be5e335b925d701a34a94b80b3c7aa189d5403f228295f00adc65012102b6d4975066642b4b45c6ffbe57716440e7d0faa76032e5822efd262c80a837f2e368270002000000000101aa51c72b8e912007bf2781f7681ed79bc61390c4d6349de45382ed3f8976a1160100000000fdffffff02e803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380eed8b3500000000225120c4dce96b54b1848c421655182aec7534bc5e77e3f7bb1804b756996a4ee5ba3e024730440220261142d1044891d132a4970ce478663cc8b922ac19572aac76cfa84a597d548a0220502897016d439eb1df5f0051d0c9684c600ac38502a4adaa112823f48dacb827012103a02b2a92568d139db6e738eb5fec687a7cdcff570e8822c23be2cb99ed01aa22d968270002000000000101c7ee83c7a63e4f8d3e3d886fefcc44180322231f3b217af3d84a51f4e2da9be00100000000fdffffff02a3e88b35000000001600149118cee0da3ea13fbcf58c2c8d4f750d118ee8b7e803000000000000160014cda3452eafdd5a46a04ca6e20ca0b59752db00ca0140d51345a3226660f619b285ec7d2807ccfec670ab13209fa8e104ad348922f463b5ee68832455a66489edcd393a869332a1d1829b391e07fc65946ea271b002f1e3682700020000000001018d1046ff23847d1a0abd944f3b7204f8affc31f39cfc4c7c614ddda788dc1cab0100000017160014d069d14a68822bead5797f5b08dfe08fdaab8af9fdffffff022afccee900000000160014ed5301d6f8c9f0cfeff2673e8a1d49d8685be595df8f00000000000016001488e2e6eedb5c989c85e4e4bad574763689b7ca29024730440220193f7981bb1f0753275b717b56015f8ae87bdefc809cda67463f8d2813a5205602202fa039af8c1727d1ca94455ee1daeeae05b52c952d9d2c1d5c568042e1099256012103bb6723e8541a9542b64acd908cc1fa01f9cbfeb31053953828acadf310ab1389e368270002000000000101ffcf8d2a2c698106b9e4214f32855d45e652fbf4d99cf7afbebc724bcea9bb330000000000fdffffff029a20c5e9000000001976a91443ca3e7082a0e5b1193d913975082e59fc41a25588acfdda0900000000001976a91447a9af6206df0acf9bffb49bc9e1ceedb0d6730a88ac0247304402206efde8c0be4aa999c569c19b99d6bb80ce0a53d088388b132e5a42efd7b7f18102206f7fddf8efae5a034318e92a079c698139ae12050f76e258a97b37c8769b25860121029e404a57b2215c7188e3544721563958efd838fb97216800febdc5219ce625f4e36827000200000001c1c101d4420205e1963c5321e0901a1c52577538f0c6eab4959bf75d56d1e211010000006a47304402205244591d02705f68cbad87f47abc3091ceb0fee0c995fb271336008fb4be03aa0220247e798900915241f72e7c256266fb34753850cd8c776cfc7bb8eef6ec4a2cb201210241dedb264ddc728ece84c8489c90206e5f1ccdc27cabdb01f00d14559fbbe672ffffffff0220a107000000000017a914d0aeeb91c754b3640387ab73511407d52099e12287fd380200000000001976a91447a9af6206df0acf9bffb49bc9e1ceedb0d6730a88ac000000000100000000010cacb5e7ee5123e065b7e606e6916dd47ed301917253e81ed5e6d45645a45bd9eb0200000000fdffffff5dc9e11f3fc952d243df4c0ac39317cd5518691d2f9fe5605d34664adf7782520000000000fdfffffff6c863ca5d1b09f99c6365f5602ca19cca2f12945a8d39243600a0c3d61907390000000000fdffffffa3953425aee089fcce4a4fa0af9f68e328b870783b8fb24d23f7b334caad7c610200000000fdffffff0b5dcb02c56b1363385072baae19c4cc40fae79c91fb5879b342e9d1545b6abb0000000000fdffffffaff74940e9f346156a55ec76f36e17ae67fd24536eb58241861cda3e6f2d540d0000000000fdfffffff45753f7a92ac6593c8df812d980e687ad8a44bcb63cdcf8e7f48cf0ae91d2c10200000000fdffffffcc60c5b140453660b39b0c7ec4e267c1382f8f741d8de22dbcdfe20c14fca6b90000000000fdffffff32005ca26f69283a28511ffe478cd343457537349106d8df6a87a957637915b40000000000fdffffffbcce033dcd11cf072e0534a8c8c4e6f04c92272d1527252483ee85e807a8211a0000000000fdffffffc44f2a87c3813679369de806431bb258b20c0e175c904d390e836c95a547c0770000000000fdffffff1f41560f773855477c0b2b2f088e49eac7e6793c4d971fae92b41e270dd118940000000000fdffffff0610270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20b35373ab57a8b43355b30204e6359424c9f614f118c169afd33ad3ced300706702080100000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02473044022062d889e857dda2856e212cad3aadf3106b226bf0cf14b1cd747643801a6e056e02203d09b818f1631b6dd3906a84111e52d1eeede78a9006461e5f8725d5aee0436a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0248304502210097a9bb19d09b8a90cb115b77368b90082a524c747d128a41bc5924ee7735aa170220489d285d2d10a190163f56939823c0dbe0409d36079133323c3ce9214d89cfba01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100cf4b96da0e9850c27360b7a9a7a818ee19884e8061fab00067e2826b5cf5385502204cb40c029c3cec0cff44fd6efe905814ebd7e041bc16171c3ee2b8b1a29cb10b01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022053681ca88bc01b44dc6fde8d1ca2bd9c803ca54109704b40216beb80e53a8b9602203a92900456d5b5ce4380955f536365c223b987572f877d3d11f1d132a2e5b6ee01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0248304502210087d0af4167178bc5881e7e8fd6d251d9ca594048b19a6e796b5dce9fe88e1efe02201650cca01d024e133665791f6e88a25d83d8afe156aac1ba6fa04868324e19cf01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100e4cb69376bfd25e3dc9a51ae89bf163ee32727a76aab0553aaafd8378626e28e0220472f8175e267328445110f03d5e09ed754a32536377aa6406012edf685a1f36701210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220033d90d91208dcaf57eeeda040a6bd804a0ab006936291b81682b24291df703a022017e2ddafdca84c109efb712b753919f282ba001cf70017a7519da3b9cc12dd8401210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100fef72a8987040c3f3f386910b53399b8f300f2598700a9bc127cd18d835a4161022035c2fde50338ac6bbaad4820e7b0a722b815615f9626065d45c94fab91c5ff2501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402204bce019c4a5018dfb1b1f0cdb60b3d13fce870322870800fa962f8ae7ea80c650220305d53762c10a1f177a4770d635a75b93bb6a1237ff7448b0254e4d5b998ca8301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402200c0f084f74b0fafed53eec6e4f56a0523b9492823100dc821e5da557a057d1e2022001252f8b0229b36fd6fbf39f5976716afd19c4de73d041b084e16c050d1dcd7501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100b2e60b4622e00ff8e2b1a7a597449332626284784c260596709f47b51ac6b1150220541fbc6c32cc383d632aeb922b11d92f233907f47f76645be9b6d51674a4a46201210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022009b90ef941a47a9019048f33591555aa5647e9f478f8f235dc169af9fb4386e302207818d10156a4ee572deb94c30c119f15f91b15e20d478d5018e6f147792bfac001210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c000000000100000000010cfe9405fffd34c3097af8243f4ee835a2f6b3e53138f2446920183abbdc814def0200000000fdffffffcbde73effe2cd622715ac0157d5b209f0e7dd4e57171e5737112b6f6aeaee7800000000000fdfffffff6024f88564f0689c435e176fb3a19cdc12755f3a48dc72b76afd82252d3c4d20000000000fdffffffa1442c2fe335656ef2ab595b72c1a39dc9bcb741ffd5f33532fbefe0a1e99bab0200000000fdfffffff92832cfa0e2a04b3e744c960714ee0dfa7c2636b2268a5e47f47405f6508f440000000000fdffffff43652973ade2e3dc519e62ab55e04f5f38737b8ca7a46c45f6bec38bb3a014ca0000000000fdffffffbd24242781a1f16d6f6c03f8e3b4732c99e58373a7c0562e240c5c0b24319f410200000000fdffffff15ded7fbaf2f71fd53466f518d419b457f612bc0fab02f2474d3c902b9cfe2ae0000000000fdffffff55b5b174b5cd433f1a9845a28d63a0d7bb83274882641dc20d6659c3e52d3f8d0200000000fdffffff7b9187205067607e27b433c10be8b0bc31d72d52cb14c729782884f07b0b57b60200000000fdffffffd50b8666c72826d2d45c5f4094d9f256e54d57e15009be98d0a3f48486bfe2cd0000000000fdffffff694b996d9f203891a6a8966a12667a169bc29eb5d4a6b7e7766a29efe786b8040000000000fdffffff0610270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34138813000000000000225120f4c906026f0194704e00411dbe89b61f43371a931eed084799e1e4a9dbea412010270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a2004e1411bc0b393f8e03a3e660783931ddccdcfcfeea3afe415bf29999b59c56aa1fa0000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b024730440220274f66f08667382c9266451cf43366234086e427eafb364d67842043b228390c02206d0de211f111ebcc1e6581b02fc68a5f5ae846deeae86947e9cc2fe8032d573001210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220483d3cd8c9d758f26ba1bfc40fb368dd14b29e6bd24d96ce55f0c4e39bcddb310220410f2faaa17d7445b365d08a3fb89046effa3db47ec7ae8f4de20de561a9225a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220557250d635b4e87d3610ed0c73e878c9a4fd635aca52bb030faf658e2610522302206d9d1a0829102551320d953074db2112bfc6ad8cb9abf1f654dddcd948c5350f01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221009429dfa9d4b5549672cc4620639e61714fe51429b06ca57bfd2e96216b211da902201e6270c487cd1161ae5107f5adf56385e19c6807f19dd140105e8e5e4cfe7c6e01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221009f40fb497e881bf34146a0cbb33aaa97a78b433d4a3ae1cb09806cb328bd986502207bac260c674da4bcb1b687d1403f1d7fd9303c0a867b4a55cb560b824d36e1cd01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022020be3e2af1dc222cd54d44bfdfe4a22f793eacaf48fef584932a2243fefe9ff6022025703d4aae5c49089cbd3d0d477d7c0f800aaf89ae0a83d5f4bbb4b68292416101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100f4a18a649baa0266db0612d9e196babb6a85c0d876127498aca341e6e9d7d45702207877ae6fe70de3bec68e42fd2cc935d91f23b4e833cb22f7cb6285c7e4fe2efa01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100c6f1f05be4b2753371bb9efb8384b572398acbf6f922223ee683dd5a5f88a89c022034f098fdc57fba6794332fa670c084c52ec0d306a5f045cd14be4daf78eb1c0c01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402206ff95f76fcaf516a7217643e4e9f619de2d3ca955fe0711cc96ea78fdf20570e02201081e5632e98c52658f5a663e6308b15b7278f41931601a1ce49bd43eb95e17a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402207f27df74914beacaa08ad6078c90b719a9bd7abe09b3d097957a0f59097cd89a02203f9cee60dc32d4d400ee4339fff2ad10829572b2db92345c91a72ebe39bcab0101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022004ee89458743f013d6f6b7c4f0ec90c50c0a6de3445d5e51d29151cb23ad041202204e0a75fb80602ceadebcbf7a3df562f692ccaaa5971a6846e8b96dd6afd28eaa01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221009d81cae1978f3f5864066bb6bbd782ac953f675f46b2a48291985a4fecdf180702205771f5e0154bc431ee52a2b4df2599995c7a109324cc27ee5df4f83204dc428701210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c000000000100000000010699775db74858711963731ef8900553ff38a8f2a5d25fd8f562a516654322485d0000000000fdffffff6c01440a92a9d3fdd2ff72d293f03d4676e8050d36c0bc4ac2c533abf11a8c1f1f00000000fdffffff5c3b070e396888eb1419e006ea41fe405739ed05cb977052039153dc7b3f79e01f00000000fdffffff03b54b3675a88042072a839e1e3c13f92f676b00da6a9f8dff10f0ff94729c440000000000fdffffff425466e853c76e1b0a527dec25de3627a655fab4ad76eb6b19c646e7d286f8180000000000fdffffff13faa37932e29c1ad0bdb0ce5019d595d16bac68e7ee8054e2a76d5247f690ac0000000000fdffffff04001bb700000000001600147b6b20bf863e27cc47c2bd73b666613a8ca7c4ef1027000000000000160014555154c233dbc5ffae20719896167045074cca560000000000000000226a20d22e79bb0d6bb725397fc695e155426b8519048e3222583811091401052f57f7384ab80000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce02483045022100e493c464ca6fc3c1a4d72667287877ac1bf9bc3d6a5f0f501b1d026859ca9b44022039452cc5405c7bec62ccc700b1c0126c6eb1b6601aa5ecc4f7e98658a79a30f5012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100ce41a757cb2aa3438223024da5330de499d4b565f8a30eda424ed030f3e6fe1302201460f666bf426181a961a6697fcc83e6558e67857bc4632c883c810d059b6c8b012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100d7c05fdd1c8c5f70c573bce2786fb33cba80b84186a7826ce4db19d0ee6099bd02204c2a088b2d1b1226dcc48aef863f3cf6ee958af118b65821358f34c283c732cc012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100c6c4bbe1bf75cef6e453fb6b29da483b9ff9c45a38eb92396e06b52e606e1b9502200414b9cc8a25a36bb9955dc960d578a228e42221d0da7b43ce4f12961c7f9391012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae024730440220258793be8443b8aa260eed9125cb8459839c9ac8739aa1979ff0a254197a008e02205a51eb8338394b75d6bb994e3451a7ffd0bab64136961d8bb8d0546f1776cdea012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02473044022018c5b41d280b8247dbee4e0e97416ca0273607a9d85b1722dd7c644c1688fb5f02202f120218c3fda475532a6987a64eb0e6e8429893a2571c246e8a9635ec86d00a012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0000000001000000000106622a623e3ae616dd07d3a002e27062021a91e93cc0164ebabd6088b21cd08efd0000000000fdffffff32a99a320cbae1378aa7fe3d4d4fe73f61701a414b3b9caa2be92498ae090caa0000000000fdffffff4b46efa8fefa15e5f86ed37bfc5230f39b229f7db1f79a595eef42ad8d98de350000000000fdffffff9bc768be29ab88faccc565194e6abf466674f912ae41f2ab0537c2a5e79146660000000000fdffffff969a43bd21cd65957dc7c02272a66320453980870f4d8f29d655b58783aa0d760000000000fdffffff39c02a86112dd6c8fb18929c844cd5e36b85a97cb072775f9f758d6991c847680000000000fdffffff041027000000000000160014555154c233dbc5ffae20719896167045074cca561027000000000000160014555154c233dbc5ffae20719896167045074cca560000000000000000226a203731f06ef33dce7cce5eceae5a60fd25690b84719cd26a8b16bfa80fd31d3d54c553000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce02483045022100f7c93e7bc5256c0e8f143c05a9c200f1434a9828493029799001cf4ef6ae24f5022031214f9194ad01b35228e58bb95c6be3cfb737f7af12cb1479eb7cb4d6a1c115012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02473044022049fbd48cdb651088dbbee1e8c010685710e3f9921500d14461430976110ccdbd022070e4cfea406016c699e6aaca23a4ef1f31e6ab8cacde72df61fb8aad72503b2b012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02473044022046b914f5f6dde5422500c2e019f9ff762fae230f30b76d01fde5d2d7ccf575a8022023cb144e16f13d5f3423cc9199d5d3c4df20eecd4c693fe5d97755df21d9251a012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100c5f5868dc72d3287d86c674f8cc217101a39471c3abb432e950524f8d25e4ebf02203dbb36c0541aa3f5cd715821784e6f7c793a55b9a9f4128f591ebe62bbb2c782012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0247304402205ddba03c2e3badabe88174e725481c6236c7db961d612413d83c22150fd7fc08022017fa2588acfa339db66ebdd6c8f1b1ef5c7812af757a0243c44c43f21c90b115012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100cd8d4d1433c0351d5b159d14a11ba226f31d45c0298975de7a2b7cbc74d5f717022022dbe4f0a004c515715bb3f938c50f8d620e66d612c2f8ee5860c7473c3dfeaf012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae00000000010000000001060b8cacc51fd6d57568ef1e6f8003cc51b6a63304e30df6887edd8d7a3a22ccb20000000000fdffffffbd7fb841152e536a5d1b5c656c2c93dcfea12b6945537bc8fd3f3be26914f0130000000000fdffffff1d7251b6496db949ef94b37ad6c2cfecb7cc8b871bd673f5c17abef96bc0691f0000000000fdffffff1390e77c173b4fa168593d47790defc8cfcfd74252a1602c75ec54b2b13906730000000000fdfffffffc72280937e42c3d31cf8b870dc5520d2a91d3bbb7d32c04da3893832acad30d0000000000fdffffff2bbfbcc20c2746db4ee8a23ca1187db15d69ac0e80c149a1169cecd78dcf353e0000000000fdffffff0410270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20d063a0b5df5b7bc1de3eda7e9e5833d26f5129482f52eb756bbf6dcf22b022157d5b0000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b0247304402207d0323be8c0f70009c92fa2909c2cc3f99d116c93aa109ff17285cb41755bf40022070c04372793404e22cb730c8574ec7a559fa3a6f788d272aefa7013b519ee46501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220544831a0fe9b7534331514b62bdae821e66435581dd0a0e673d88c58240928ea0220391e42c0baaf5cfb2ec754a7b7c2783efe5ceb8542966cb9cb4357bb29ab88bb01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221009d7fb3d0ba2071571d6a7ac1b44724c0eb72e964c988f63096e867b53cbd3e90022009877eed8dce70eb02d1a4f73676ee9b2471546318b3fa04a0975e86aa2472f101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100acd32f4c10cbd24630ad30fe71fcbf790c029a3e89cc869c6aa13733a290d4b102203eb7c8554a799052d45854b068aae29854223184f9a9319b2e42cf1207dad78401210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100eb5fc83fba90049eb44522f776b358b0e1b56ba32a462705263080f417bf252202203674319221667ea3a93329fe8eaef2ac36485cdc447cd8b1cec51b40ae39ee6d01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221008bf9520d8479c1635dece460b2bee3feef34fc02a69f8f3809841a0312f940230220061f9f566b04410101b0576a4dd082f56836f8a6ebd4450591d2463c812039e601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c00000000010000000001068700fcf9439e2cfc346fd08a27d6c61f2693a75ef5065fc7f48f7925179d38c30200000000fdffffff025cde85cf7015f37a4454b77601aeb01fb7b9bf1e49e473b0756161ae8885c20000000000fdffffffeccfc6bf86e21dd142722e18dc805de740113d8ee5e40b5b60764eefb7a4841e0000000000fdffffff77e3bb35323762242747e1a8ca274ef101a087ec4ecbb4465d375fa54c15b8690200000000fdffffff01eeb6bfec921fd2e926ab70fbcc8ac36ce55e8ad932a48d4f93ff0864f806670000000000fdffffffe1385f900f6359a8c2bb732a4625e3136e3bc4acd359462349720589203fe04a0000000000fdffffff0410270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20e5a6fafb476b6c21c04c870939bc9b6ba7c833aa7d144a99fbb061ae44e5b93f0d800000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02473044022057375fb18098d89afd103bb1a3fbd872ccc6f8e5ce8dbdf7773c4c4f4cd51730022030b32415ae8bcf552c74f246184e1e0946893c317703f5de004412615ab80be301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100eb626992e75ad1e0f81976d296f24d4f38a556dfd67d519785e59821076883f30220233aeecca7b07ceb6de6d991173adeb4108010d74234f3ea4f685641de57bd9501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022013eba90f973e12cd7007a491448e673ffb973ce93225a5fed3ab877cb790bdf30220307990e824becd6581f4107f135b828c7b1808792668bd0fd16fa8ae1658209401210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022075dbd38ce8e20b3c77ff75a6977aacbf47e41c620651859e48739619d9405b5d02204750850b2342811fb501eb782acb30b12d770cc257e0f75902901d70c2789a5c01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100afd160a962f7a00263c70f62b99eac7d0ea6233268324fd4157ae9053a3f3e0a02205ebca05b91291684529af5b381d61a244e854e0f75eeb07f4c44a8740515dfb601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100e4a3f1ebb136ae28121073478bf57b026dc79107de59b3cc9ae4e60c9349de7302205c7184671a043b5f0ffd365108e7f5c7d874144bdeb371f79670757917fd949a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0000000002000000000102762a983332405b5c358bda70d2952202081dddc441270e737f61b4460dc163e10000000000fdffffff1f7db958ff6d2d4d334aa5933f196e5a7f3e1c25a71baab235c15b58974d58180000000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100953073df243a80eb291781df9d504eb88ada774ca29419c964ebd35647e323a6022057d7eeb1770e0e3eda2416c034c166911073a746ad31c76fddad5df6da673971012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100f73540dd46614e02c91aacb6ba2ce5825d4abcba39a52be9699945d24f38b76e02206b03ebfac0fb85fee719db22cb809c34c21c43ed37d079cccfcf5ac6471b5530012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000102d73f2c37c7f495c98b1c16cf88390b68b1afbf4215c0bbec153b6964e02edfa30300000000fdffffff3e3a3a59268d326d27ddfbab4e8d27d477522a514eaa5e962c959ab7b29d457a0300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb6f5200000000000016001438f18670d5ed88eb94929c5582a79b05f954c068024730440220768b6840b85f95701079bb53cedcd7fc7db8edada94e04ff2f81d665645f9aef022059b80bfd0c1f8cd4fe6d17811fa5e1c3799ab448cd2fb8d2f7ff5fdf74e5dff1012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a024730440220552d8ec55531b9793b2f6f31066eda9aa28c25146d49cb25edb85577e20f9dc602201990a9b7c1e723ebb57d71c5345aabd176adc6d4fb15a04a915d9620d31f45b4012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000101da9bebdbeef2bf5e80f34c5e67c2880054963612c2bca9be7624744154da0d670000000000fdffffff24d00700000000000022512028b149c6b1f242fc80a2120ee3bfd8c7d8b322671b4fc85733df77765dc561bee80300000000000016001425a2c4672e1c8b69a5c67872754afd8170c64547e8030000000000002251200f43ca52fa3d55587974a0fb55112329a0f0ed553163c5f146231a63af9d45b5d007000000000000160014d39028673bfc7beefa68fa3817162c37ce66bdeab80b0000000000002251207c001ad88f1b45a53f9a7f23a734a1a4ad6aeb8e4396d4188c4fb1ee991e73c3b80b0000000000002251209f561495012171646acd8cb6f021f28308d6f77b287076729179a05ee7ae726cb80b0000000000002251209f5cfee8dbb63e296afe02526e00ed3e61cdb32e53c82ae0af66ee416d34a6adb80b000000000000225120b322bb2e9261b286d5ccbdbec2e7e91bf81ffb478fc34e4cfa0c018b34e52f5cb80b000000000000225120bfff70202cb6993bca24e9ad8f49d02425cbe4c9c5a5c19167a702677ba39140b80b00000000000022512089046b202b6bbda41f1f08de8a299f2019868d1fa8837f769b651167060a202cb80b000000000000225120c98ed8d6f20c2e8fca59e8bccff512bd18f2e2714fbfaf0b1e291d792612f0c3e8030000000000002251201a8c58c5881d7a3a3f8e672f0d6b31acd885ae35dd37edcdd53cff86c056eb9db80b000000000000225120094330b212cb4e4d25c5d284fbada8b0245c0ead4a8c5705c8529efd357c6e61d007000000000000225120f4c906026f0194704e00411dbe89b61f43371a931eed084799e1e4a9dbea4120e80300000000000016001431adbfce16172876cc33ba423b945f1efdb7e25cd007000000000000225120d2690e22b430b38d656af36cebe78e5d04a8ac23ecae0b4d483a2723e2b5c24bb80b0000000000002251204f58e7186e4714ba922e3b1e3cf5147212fdf68a00025c22539d7e7f9b6db706b80b000000000000225120d425452a6c935ce368a00179dcac3751a489ec88e11732035d81c4d6be28ef67e80300000000000016001456217664b6c2d80b5f3a80cedfdb1510d2dff390a00f0000000000002251207627445727f216d9678eebaa950c7d6f35a1e86b4ea6a66e377cd960c8d89c9be803000000000000225120104cb567396357d8c41e3562a234046526c576a49b8494f633e7bfd175bd2218e803000000000000160014fdfeae962ad54aaabf37c5db481a31e57fd44cebb80b00000000000022512009804aa795cd1f473aace11a57aaacf1aae269eb6cb573a7b50bd219d6fc6584e803000000000000225120f7316b19848b95b09e67e18d72d11e5a34ea8c09b3e90f30bfd8cd523ac2d2ded007000000000000160014d8c22c59d6f3539a635c0135eb1af15f77507c728813000000000000225120895982bc7f220454fb7c45ebcffde6f23dbc9ef47039b26db7d2a169dac5c22ae803000000000000225120ccbeadb9aeb3962b1f895b7a0770ba52e322d8f15e053b4c80327eaeb4057099a5b54233000000002251206d199568773451e9c455b92f71e11dfc502e3b08461c4664f2c523aac63c1393e803000000000000160014e85896d1937ffb2502da211b06ca2b7f1e6592b6b80b000000000000225120a1620f805ed89fb26ed8edfa8785a2aa790f71ffcfb8969d7e139514244871e0e803000000000000160014d9eefabcc294a5b720b21c2135aedc08ce6623d5d007000000000000225120162e178707751e8a44d3825e8145f09c75253ad3312f5bdbeaaf973fdba0e042d0070000000000002251201ea52e22c730e16a2a2c6ea3a36587d18cf905e55e071d9f7040a41354ddf82cb80b000000000000225120d522ef3eb28184d2d2a2ee98fbb869efe278a1eb3a4f90c62dcd128e22e33487b80b0000000000002251202d8963d64ad2ff6c38040e407d49b46ea2453ca06bbfee936b1d3665d8026d066617000000000000225120dac370aaab0aac178e3a41adee34331e72680fa77ab6c892e2ec1eb9b7ccaabf024730440220338124fefde619d9c8417d5ab71feb6b142c6face657daaef27990334a074b820220425d957f5e8e4ba03aff2745a78756547511ea51791e7542b6af6ff34231c9e6012102b7055f89aec6ae843b031cc2b2010ac611a1739f4c5662b8442abe8519fd902fe36827000200000000010174f47bcf34350cbbca5ec71a5ec57bd0cad51280d655388246886c35cd02e4cf1b00000000fdffffff02e80300000000000016001477feeb947a22b2346dbc5ec940a035e99fcb3a093ab142330000000016001483d215ab65f222593d4466c9dbf1b708d0eb44ce014021e601681be3ba4ad1876004034cc3f95e2863dc005725fc539134bf6656ee40af31bcdec3e5d209efb7b2f5c3dc1bc0fbd160238fe844b71a0bb1c4896c2486e368270002000000000101037ca517a64e3891ace070816af2abf9a57355dcce55724cc9aa64f8e19a36660100000000fdffffff02e80300000000000022512093a5c7eaf46eb597f4b80d3ce0b7931d37a925cc17935add9148126ee3ad817cadac423300000000225120523e869702a00e002e0bc2cfbf043d41cfc4ca02b8bb4321c99cb1a52b2f54c90247304402200a6fa6aab199fec129a20ef617606b41f4d2b3ddf40d0163e1cf594c6d822912022060bc1bfec4b1604b48e0e5fc9dc6325f99b4b49ac30d3ec4dcdc1ce314be69250121027ebdcadeddb660d379d0db6f1c5e10c8efe029dc6065f64e0d4ae2265ebdf417e368270002000000000101c01ab0d4dd00e13b4189b913f2e05be5d27742013326b8ba004b2359a8083e180100000000fdffffff03539c423300000000225120317a724c76a1636f227e2dd8046c65032f39700478c3a5b92ad2184bd9e22cf4b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b438e8030000000000001600144ebca39309a73d28f34e271ad33f3eae4ee5a3260140aafe580c0d0482ff0131a4e2aa0664eff1e22e813dc1c38734133720b865f0d46a1d161fe52ec9c26c4f23996f49f5e7f2b8625a0d0907d35a50936c0dff6015e36827000200000000010148cf9e76ec319d0b626b2503b8c261ebed4eff0440d132058940bbeb0a99e5650000000000fdffffff02e893423300000000225120a690d5dcc38ad92b3d89c98dde0e23cda97488dcf83714ae0977532ae07e5a93d007000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380140bb364c15bc222b7febddedbae798e6993d47f7a50bf69ed6579b81c2d1f7e43fffd975e6b66c4732efaafb96c9813a60a25a9afbede21485f002f2ee307538b9e368270001000000000109f374953e616b0c7f1c402e1dde6246598b3f2afca09b66ee5403538f48cb29610000000000fdffffff7b0507355e732cc2a47f867c66b116a7d20532319c3005eaa493d343569e6fba0000000000fdffffff6e2d5c6cd39e517d90b45dcd95526a6e26198ec0d5e0140c19aed261810a3e850000000000fdffffff13ea5919788075132e232228515a8ae7503d8d62c6c574069b41ee23d4fecd390000000000fdffffff605763c90438ea419f0d8373e435e3ddebdec1164e1af229169b23e77155e8110000000000fdffffff619859195924f302b57b7dcee5356c331e58d6fb0f2558acb74c24f1a2e9a4be0000000000fdffffffed0ea7166042d8f9772a6b9918463b3fa7e84ffc19668b35321c5db297fba6290000000000fdffffff2d0cb7867cdaa4cd4e531dd3458a675effedeeb4b42a9ceea4ec5d5cc62931030000000000fdffffff61e25dba635fca95e9bfea2ffc9860d7ccf662606ff6c30f565e37a10a7bdb9e0000000000fdffffff051027000000000000160014555154c233dbc5ffae20719896167045074cca561027000000000000160014555154c233dbc5ffae20719896167045074cca561027000000000000160014555154c233dbc5ffae20719896167045074cca560000000000000000226a20684c2a877c5afaba66a3fac80aee3ed2df39bcb0ced70c2da28e36bb0f5493a8d27d000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce0247304402207f30973090fb7f4c6da42659c93007fabdc7ee09c2e2d81db930bc9f61639a8202201acf6525df63533ed23bd83b00b31d4de3db51af413c444fc7a42da6f0efb8db012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100d128d79a6e82ae6c1f2ea536dd9496bd76b8c8d89ef150a41c1ab12ef744426a02204e67fb587b10e73b71a84abda2a80dc9a3d8c5db4ed51f8de80da08e9e8cad5e012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02473044022004464367eb374131c816ec5bcae893fd77bf90eb0b7d17def6713d4a2a5684ac022050fbdcafec5146347d446821dd5a0f63a7d2940f46ada43232ba2cb1ce4758e1012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae024730440220691632b238c80405aabadb61b49f18a8e525b2fce75da319fff804c277e5405a022064ae7336be8bd6044c5fc799c95c584d2e92d05de0659714190338c48e393685012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100d9ebb0742270b9c9562f4f36338388775ee7eb2b8548c6e98dfc233a4342ff1b0220264d2adbfddf3e4b59d6713c533586cc365d858ccd495ee7050b6430ccd16bf7012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0247304402201dedee4c1144c9caa8adf3997f55dffe2f35c81b9c1420808c0b555925031c120220034d77969e3fe37d90883275cddc7da3e200567e5b3beec8e20c25bc34a3f368012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0247304402202d1e4294b4b20bf9c90c8b3f20649a4b1bc73e05d7663a032e3f2cd7f9de44f802202f9b32f99276780e78b93e3ba6980175fbe06d7cb8ca19b981e6c7fc33cb39cd012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100a76b599dfbeed0a4191e27d64bffde904649f9fc6c3c8ff37bd36c72e255500b02207c15db0ba4b729f9cd6abe9cb6c12cc7a7ed83e3dfa08635d6ffa4812df385df012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0248304502210092ebdb7c376681d9ff539153cd69b3f3c142c1f3ce5b9fa5466781f65b53c44902203082090b5641997d03c58b77d5d2f6f97e6e38a91a6ad8c9f2c9f96f4db372e7012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0000000001000000000109fb6169a43b062c1957bb91037449276d678a358d6c34f49f28ba751baeab24e40000000000fdffffff59ec28ca76baadf33210190087fed5a7df10cf393179fad222c302052faed4510000000000fdffffff6a48b2593ca71fac5a441bb09326fbbbe1429dfd78b8198c9c64c385757e55cc0000000000fdffffff1ca4bec164d791338c1c8ecc348e09879644fad8872124d4b5a7bb7af56e8faf0000000000fdffffff7b9f156525b5d62c39876ba8f2f1ca79f026efce2bff799ce66f79b5a97bdc450000000000fdffffff9846e4205916c21b48beacb4e79db55fe77d4ae8b266fbda701eef467181ea9f0000000000fdffffff82041afbc8b5b2190010170e86bf6f419f5ec0ba68a22465ac97837785928a3c0000000000fdffffff132f2c0ac3c142d1d898e3840ec179d17ae2ec21e8de50f17ea24b77d4e96a7f0000000000fdffffffd8fdaefc37428895ba7717d6314fba3d27f2cdcbda57f676f3314268f437002b0000000000fdffffff0510270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20ce45d8aa444dbad70dc88f9a415994a3312baf2eb0e2b70b1d5fafc1d4aada78fec30000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02483045022100b00683cc9c3cb2e5f900b84ffe931cf90a83c913ef17e2026086167ae2e53da20220513ab9aa90e1fa10dcc3a13716c361ae28bed4348f557fcec62b454ca1e1b6b901210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402205da1f3168589412c553aa7e25ec7fb3f4340d8e361c59d79857e76410faf75a40220162b938dd340497e4f27b06c2670ed9306f05ff8543d0062fa44627dbeb251b601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220456ee5d363f0f76f423c2568e89279937a83cd019858667634c87f87372a485302203e6ca93c62aa115e82d9da6b58d1997d3f978eee10626f522c036e608967cc3b01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402201bec131e46cbb64f996352ea3ce5e98db033f31d98dc2a9b3bf430e0d8751a5602201942b72ef64f8326d045fa2200da633a797554f4e37eb83fde79d16a8f7c14b301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100bbc32fcf4764b7da2171df841a919f808f35f48fdd1e9f8f675b495f653c77a602205cadf9e79a3771a7af9cdce3642ed1f07d3cbefa7e4c326bc01696f22e3d839801210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100be18a4a6e0272288aeeb63adf277537c83c7b24f8cc774e409da8a6478c216500220598bcf18376c6ad2101e4762cde0efdb1773e5709cd05f75c75e761cc8afb3cb01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100d5a95ef47f744423159ca36c9582c97fa17b0fc0d0d3114082f953d123539454022018e554ff6c8ec015bab19074127fd115acf9ceb2e03c797775c0da69c806f9e201210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100d8ad106df942f4183989e28351537a523ebff9e8234d7c062984922cf56967a40220561bc1ac855976758b924e33864c63630ba068884008e6a8101a0e2a76376b9201210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100faf625e61ad82b9f960f0ade5cc3d2be28e6d306661a3840a64d9f1b93e8497d0220014f2c819d0eb2f8e174afb5bb44bff10543280488a311e66c0f0a3539def97101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0000000001000000000109642d75c255be3ff6776e3ef34f680811008dcf9df8ecca6677304f889c6bcb780200000000fdffffff524ed4290e6bc853f4fc589a1dd1deed95d2c88c02595ff307fe97abe2f52bc30000000000fdffffffbff35f8dbe56707658809ee8b4e17314a51315bceb47f93f65c16e6001963ca40000000000fdffffff85d2a2b71e762d023d09d726c1f3126bf277ac0916194b68b0b31c0d01e6594a0200000000fdffffffca5edb0ad7749d1c594449d2af4a8884f1204c45d3e84c6d637f3fcfe6cd17520000000000fdffffffae959d7b5d0a8adcd3cc6cdaf614085d8c684c9e5bb8e56b5f6903f19646fdf70000000000fdffffff4f3d184550db34b33f055642ab3c07e25b79667cec4f8e116390ff60f33795550200000000fdffffffbcbdfd1bfe235e12e2dfa702e49e02addecb3fe5252639788bb8355c2b3b25f70000000000fdffffff3e4939e27cdc7db0c690cc747840dd059260c09f4211b5f029f2e6f3b76071a40000000000fdffffff0510270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a2062c68cd4985abb544e18a405d30335a3576603d8edda77fc9a048f8f66e5bb783ec00000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b024830450221008a0364bb9269b9eb691531ef3abaa0af140461bc8a663cbfcff6207879597d2202203455789f1a0fac73f030898b7d7679b2cbaa44660763e66ec9cceec2926d042601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100c05eaaae436d23e03e86e5f374f19e46e01eebc649762e6731cc06b71dce5cf902206f38304794ab5cceaa5350cb43450e0c2ee54b403a9297aaefad2288b598c77301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100cf463fa60af99fc24e4f42b00e66fad97b5a9734906024104de9c5ec810d845102205373db416e0adad0023ae009597ef1b64882632360b8f0a7fb0301de548a29cc01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100a650d182e0212ed79451c10f3088e0876830cde024d15b44d21c0afab4c01dc102200617dbe445b4aa76e370e60b2ae77d3d239d32e74ee78c0a193eb47c4bcda1d501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402200a1110f86e03f68945efd051bd687838afaf51ab0c01d0d994907edcb6feca9d022037387819a916b1f4fb41cd1069123b86e5c43789b41939e5d7e242ed0a5ab0e401210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022069f14f5329b1fec7490ebfe72f9b5bd1b28f154266af0d59b89638d483aa1bab02200de2a0cfe86bfeb07c2cd287163d4b02cc2f2ff7ef2438839c7e78a9a43e08bc01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221009c417707ad98ab52bc4ea7b605b168ed47921375e3b0a6f799fdd93119d6828002200b28ed90762b8b8da8557d31fb54ef36017175e7f4fc5c013526d80390e969df01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100be289a2a6204c8fedf1dc585249a4c3bd4dd5ece2278fcdb9a4c85d171661d1502206763d4012bd6c889b6cca1be060fe7a8edcd7aa5d2bb6623c141917fd49dfba601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022069244fbbd09d4c335c184b198fe2250a591c97c8da7473e8c86b614e4a2b049f02205ba5da3719bb7e401864883668d500315340ca8f4e4f76bb22008a5f4634643b01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c000000000100000000010c9d534878deff20bd626e82d3ac58742ce204729ee9eed3489ca48b1072d3064f0200000000fdffffffaf054cf38f4d3fcc807fbf242dbfcebf40c9276cb46616bc23c7c70e5869479b0000000000fdffffff7612b0198df57d9924e8a9214c0d035b73945530c61193eb82b0e54e6725a62f0000000000fdffffff6ed5ced562e995f4c0155402b6221d7eb5d1cc216e91ab377a09d7b7a6f8bdac0200000000fdffffff77584574badf47e121736be9d0814f260969e3f4322938918a41280c3f479fb10000000000fdffffffc944b8fe0689e3dd042e466ec9ffdc367265bec895404fd0a6f77b43ce97c5b70000000000fdffffffe6535907b9d09148478bac93396a0aaaafd6c78ebedbf0bd2146aeedd00d1d710000000000fdffffffe589c2e96a0120dc86cc14b85cd167b0bf1da954be48ee8b6b9157be054dc2290000000000fdffffff807cf9ffe8a41080fff41bac242acabd9044cfeda3e264c3d2ede5440c0908b50000000000fdffffff2e723139deb959961d915c39344809d7cbbbf101bbafed8d04a2a2bbaa52c5870000000000fdffffff0853027e2f57028051bb34757fb604c1b026c61c9cf0e8371177cbf871bd2f960000000000fdffffff4b8af8ca206b10899d2681e92b44cc4be71099b55286ac6a58a69b19c9e5fd590000000000fdffffff0610270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a207e81ded1355c8e3ca2cfe0c2cc9bab3f1372d48dbca0b56be9f6ae17e0eefe2a20040100000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02483045022100fc827449438f579006bce6d1116b95dc8cf5589a1928515f5a54e278504775e50220124bb503af1f2d68b64742d30378330cf74e728d2d78ac7d6eeabc7bafc489b901210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402207aa6c604bf93a14d6a30dd394d6d378f56f66996f66b63e302018c4fb2a03c0302205c432e41d0a15d28fb33102fc0f082d1422df3c7cb64114cb120418fdb0b6e8701210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022076dbefff4018d0e521d18eeb7b3a8f7d8ff29165d035a68e878316572b274f67022050706b2543576f3654ff8372ac01f1d316a3c6529e821cb5412cfbeb3df79b4501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100be2b572a6a15b7a4c0fcca860a17ac66e3d2dca309bf8a2e99a2d66b8b359eb402205c623b9533b01fc213a084dd84f762c623836739072cd1fc5c9e9f57bad1f07101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100fed8a940d686de9d9caafb7a7c28ddeb728f1e45a1672044ff8398e60cf5f9d302203ba2002febeff71dcabf507d2608e652fa3c5e177204d0e2aee1628df0c07add01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402201f03ef5cc5b489c1fd80582d940e27c1a068e16b24200c82c64a24359ba26aee022076c3925bde8fd6672492725db27435dc096dea320341e6577c4ab2364960550801210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402200bacc0ed0b8c8ef8cf3f7c52cb6c0adb013db8075f4ae19856a754eca9477b180220354c3ab5a17c11082f970525daaa325746c6ce0794e3f1fd81c18b149cdf450101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100db387b9568e0a6e9350915c33dc1d8dcd0461834583050936c23bc160de2e29902206594fdb6bc8ea1a9756c05e0c8024ad2dbfd8e2ab3c52828d11c7eb23579656a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402207046750d53f86af2a04a34c795f12adbc24e1c472f96a1e0d58cc0f7312bfa930220332c5261dd6d66b7d9d1283b53da52f65db07c1539942871fb3f03bc4022ae3a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100f5600b9fe767c3238857ddba668c0831ef781b3d680986b7dd0c5bffb246a79c022047285d79f1a7632a7d3228f4c6e5a5637d5f3ab8336586283dcd8c67a70f18bc01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100c67288dd178a8f748d4756261f98b071e306dc08ebc5f729c90d5560a3f6459902204c11232b3d037b69e15ed421db98d3a52d2e5ea85dd6d4b4f554bfc02c7cdde401210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100fdd50832ba5de4ca1824f23f08f2fb2ad4faf490489c318f368e739f0f03c460022077818a51006de0118ee3058157c4d5a62b6503caccbe317615ec62b2f78b36cc01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c000000000100000000010c5cf72f9f5da356aba9c38a3a9eed199c405ec20a786d73016e421a0023bec6280000000000fdffffff6d69366e8a1a0c4baa368bb8f06c4395843da0a5437402fdb9bb04fe4364a1f50000000000fdffffffe3e28fc7d2d536da7773e08496447ced8f6e5597e54bda7ca5d5e4543cedbc2a0000000000fdfffffff5c4452b5cf092a33c9857a1f887e1cb2f869d4c85873e4678ef27779923cfd60200000000fdffffff6bc074d9c0dbf821f149d7cb55626f24aebe58b081439d7cac58551898e47e190000000000fdffffffa11c3edb494e752c36abb0aeb8562cdf6f8eea7a063f9265f25af489f083ab0b0000000000fdffffff491222032712756da85df03fe68bfa3bf46da4e82fdf7d659dd4cd783e3e852d0200000000fdffffffc69185c316729c0b89db2defe8297c50ed9ec6a40c6875859c965fc062de16c50000000000fdffffff7b9688e50545b95687c15ac8da9505a645b91ce77df9c71f9642c907c3535c2c0000000000fdffffff6ac2ef8215caa07876224eb26ced416b97f0a1cbbd0a82cf2758e3d1b5a6e6c70200000000fdffffff77560d48b531cb6dee128fdb29eea5baf4aacdb60b7d190eb0c19c7ae1d745b00000000000fdffffff729f0fbefc0cfa9b475ec5f65d3c73285f348d41e5853613bf4ee3ddd932465b0000000000fdffffff0610270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20a49bb31c9219d05747d27136d63bf28fd78b3ce14a121e16cf2d5d2969029e9157e20000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02483045022100a86d3e96a8f08b73d5c023dc5396119e0532e99f6606c05e71857f38051b3c5a0220778cc080c3f63829addc5b957a2b63b9a35623c7d5acc6d99a3197521512f8eb01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100fe8aacd55cc127d7bc839fd87a9a1ac968b7c4b5d89c786be414678a51236758022033cc350fa5eca1a9b1b49f4eb8157b237084ce3c69bb71737e2565963613a86301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402206ffe9ab5bba6b48a2f71b34be94658fbd349c657c34ac36c759a7094d5335aef02205b034200b59b4cca1ba7d4eac5668eeb27efa22024eaa04072da652c2d77741e01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100df2e5bd12861d1b6b40cb0c767e367e162077b8abe7ba19ee3e88c5ee30de37c02201a28617ecfbeed13a8a58c77fa05513a1d87cb8ef1db62fa598ed7e7471e925901210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402207960159a53cc63938eebf33686fe54422b8d140a4861601db20d36c7b135cc5e022032af06f8212d39f8cc2322692b56cbd8aaba2beaea3369f8d3a9e79cac74b48a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100b24dfa54a8dfebe9be898323985c13c5b843ab52727b50cc24244dc87880cdff02204642af3a445f52608413af6c3bcfad452097b7dcabe17b1b469101ce87b953d301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402205680fd250be1a1d676967a51e89f384de0a9dafd1a84c88378605290e5cebb47022012ae0cd6ad9f4cc6f18f31da08f96e141f962ff636cafa04c08fbaef597893e501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221008ae159ab9c6779d457b96cc4b466ffe92dc17d34f3e72ef294439706f95449b7022069afc6bb8114ad1a5df8304a3236e0f0071a6e1162e9ef02f15b8091c5826d8c01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022064bdd7a4c605b4c002eaf3ea22bdd41e00edbc111f9a1a9cc96720e87676980202201cbc42356c25f84b346b2973e688ea0cb4233eaa5062cbfbfbd314d713e6ff2501210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221008f5442667b900589c6e346cab5251efe130cf480962539342db7a134f108419102204d18723eb9fd3fa193ecf51f359bd27af87000d284127c8739ba9b8c7a7cb8f101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0248304502210093a11978bcc6431502b5d88404281c815302a0a2e95608083ba49597a6d157e002203f3e9d7566cf70cb7ea978ddfcf871037d35573aaa838f3f83f3237a57cc7b0a01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100dc5d63e92ce306abfd2f86fbb23b2c0401d2a0716358f6f377e6b21234d925b902207760a5c2637167ddfd7f9545714da66d5163314f027d77f726a35696aa4d039201210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c000000000100000000010c70e5831b7632ee4f7352a32506e78fb9c30aa63e2557beabaf0c27e37964798b0200000000fdffffffe168af98d5b44084f3594323fa4ae959593f5ee3ae8985f3f4830b02005b29340000000000fdffffffee3ac76451fd6acaf799c226450602a04c9e04ae0dd2400d858d42205c0f7cf80000000000fdffffff735ae1372ae88e4ae7989120fbf8aedffca0c59573c0eef59ba10deba343bc220200000000fdffffff65cf7e0cc02fd12ff649673655cde83d2e8ad4de2d9944ebf3b9c3d5f67440940000000000fdffffff88af8b79dcc42ef1ef4da9c65ff74b23edd830b2cd2e2cb5d86da7d1d8d09cf70000000000fdffffffa22c6f54cd6a57e533ca3c111273312157b59bff3db9993e8b89350545c706f40200000000fdfffffff524fde09a1fb52ec64c5279c474f9f7df2f99924d4addad84aeacb8dee78c560000000000fdffffff94132f533843ab085e577c86be4864c9d6f00d6cf6429ac8d0aa2e51bbe9c9430000000000fdfffffffcc08631ac081d2368bf24fb32db9eb49bb1b30b94a926cd2e9427b77a8610a30200000000fdffffff47840cbf4ec111986a71ca936368fe5657c1fc85c4ea2311f1de3876ec3550470000000000fdffffff4c49cb754ac818ff9f8849be7d841308f9ff714ccbdad2bd71f78a2b54fca4710000000000fdffffff0610270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab341310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab3413204e00000000000022512004ca4e3935f37fa02797016da8afd658693507c45b617a297acef2f6d60caf730000000000000000226a206796947e5f74ac84703ff22111370fea88a793e8e5998c4712b5116ffb0c077c5a270100000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02483045022100c49e345cc06ccbb0aad400d5e6b80d66fdbcef4119bf1b94c906fbecd7f70ab2022058ec6fc452e1fda5f5ff8b55889777ce3ebece6e6976be750b30b8dd8035ed8101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100f19a63d5c109b3be6927abcbbae2a48092161e2b8c0f3f282aac8b06c2e63839022023f264399cfb455318472dcdbabc5b7997f7b1697d9bea24e5a39e882aab168e01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0247304402205ea365f1790492eb5760ad345ff2e317d9972b9fb03ace16e06eddaf8f1d24f002207bf0516505709451eaa84cbed52bc63742ac2d5442490661779b9acf2da6047201210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220435572bdfbabdb1ef7dff79a452c49df53ebae3ac4b1f14dcea77ddef06855b102205c75bd35815cbf7ee275131b61c31b8ed2f83b45abe07f2eddfa164e3672717801210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220464589c6f63d51c0de2a444e171e77b5d75b16ca787f69cb1cc7aee6f0ba145b022022f6a528f4da5440f3a356650d5241d7a2a66fb5330a677183191a1090d9c36001210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100d03e7550debfe03cc803b97096b1d266d823b3307332b22144153f652e90a39e0220483a658e8511e3149b5b538be4a8b51c9cc6d1cf5e1df228701a916e2f0c9ec601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100dbba24970eb62cfbc38f38e279201f5ea9cbd25851c6d68831b3951d108aa2740220621b836c177770a582efb4eaaae81c1bf04d8a424c61be1f0106c0bea935efd401210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100c6952f52f08d2942ab7446f98d7262359b09ded10ba15569d7120930d22f5822022041d9d419e814b065ab8538e8e8316ac80814e4c512264453e8a62c5f87ea709301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024830450221008524673bf9316114198c5be6f1bfab532e1bed235bbd21e7ff2d079f00c3453202205added877554561efefd05ee039b0941f94c5696413d92a83ede4ba21fddf6ae01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02473044022046492d18bc9f97e7584043e1b8a2b4ebebfb9a6a5a1c6292eaca97f8c7b114cd0220463db28579985ba1202fefe28e0009b7408c76efbb8590a8d96f2548b4df504101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100d7f3fe51dd190fe9902860f2c8e80af303be15978bde8d0c89ac17f99bd3643802205c6d44d77e3278c868b6579efb71e2037aad05ed1666f409c472b2948c3fbb4601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0248304502210096780977cdcfa07d1016820e2c1e60164c2ef6c45ae2d7b1ba821410affc2edd022047db1304ef26928cd82004924ace1b6269ee7e24d514734a8a17b17ac9ed679b01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0000000002000000000101bb4811b41dfdc55220a998d66c41dbda59e1d3ef33f5cfc654919c6671e2d3d10100000000ffffffff02d007000000000000225120e3b2e752d4bf31d4ef056a90206b89af739d9007c58b13da827b46f81de4ce0b805c000000000000225120e805a23f96209c781335e3771a5e90c2a8dab32505eaf5007e05b6be10d275b40140640eab1a4abc7e0bf345cd77194a7480510679f3859b3634194d1197dd4656ade66c5fa013a83830d6ef9532bef213d91c487da90d3b18efbe0ace8c01d4dbd0000000000200000000010178a41f0ef5a71ec49747feb620e0490781ceb24542c4c77591f60e4d88a3556f0000000000fdffffff024a01000000000000225120e805a23f96209c781335e3771a5e90c2a8dab32505eaf5007e05b6be10d275b4d0050000000000001600149248b3b9574b17ff9d2200e465abdad6990449c2034013b4778eab31e5be1a4f5478ee6f401967511d6130966c8b16977736d53d579868c30d4c783a8ecedb0af524da16edb691ae7d324d6466e122c31b93f96726f47c20f3b9334919ff07061479b5cba7781f693744aa308f51a971243bf61008893354ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a2237227d6821c1e9899c3815e4bfb6b94470637691f63b2f0e4ecd8ecec49c7421bfcabfd37c6e0000000002000000000101fb15813870351e8943351884091e7c0590e3a9b3da9edcf5a21f7119ed86ec460000000000fdffffff041027000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c26000000000000000000000000a9ed39accb984118f9b66a42f7e71b077cc24c355e4c000000000000160014dc433bb7bba989816a53a92cfb04d1f28806fe250247304402201a20e6253ffc2ed5c5c3dca592a2e6fb684baad3fb110898514e1bf154ab37d60220765501e6cba85385f73b8678aaf3c8b0af86c40f5505612f904f3efd13decaaa0121038d5f326f557f7933dacd785337086099ce381fbb563e0e147cf26a58e1f57fd30000000002000000000101832ca5c42be1d8f48e2d8d38b18241f026b2de9c8f16d789b94b4bf0dd4858340000000000fdffffff025d7b0000000000001976a91413ae0d30aac7c63158465aaf2edf8bc38787868b88ac5ae25b51010000001976a9142036d10689053a9fd224eaec6af0cbb6b618716888ac0247304402204ecf56d19601d1ebb6c1ee50089a3e7a69968fc968ba683bc347b120250b5295022047aaa481dcd48ad62304020387b23f643da5278ca01eaba2699469a6ea92cb02012103950f5c291191cca7676577c184d34fa69681a132523c1c27835f0bc97af9dba6e3682700020000000001014c6b97de015ea3bbb1c4f5bc0e1e70026684da84a1157d4fe7b19a18e0ee97f00000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740befe1d0000000000001600141031ea79cc2322db98b46c9a460ab471b812021302473044022028d6faa54ebbe70a235164122d1cc4f1279e30f8048a2084564a8f31436274c102202d18e33098bcfb0af9c311e57bf2cd2a8c35559e5950c398c5452dc0134d04ed012102bb8dc967628fb842b464e4d18868a9d2c744f3c547faeab83af7948bb9c8f0cc000000000200000000010186aeac18ac9c6ce69ad23b4cb1f39dc5118d8803d516081b2cdfe9a9834160020000000000fdffffff028886000000000000160014555154c233dbc5ffae20719896167045074cca5643c77e3101000000160014902f5d0d1058230d4a9625b70a9381df8ab619a40247304402205ac7e46ed50f074f8e4bc1f8b7788091179c5b14d8955b7f9341f62d2551f54d022060c88b33d4f5f19c4955fc171f2eb731c86435257dca6001771d24c4a3efa4d20121023a7ba352379158d648922889b0a118de64644dc2655fffa5664abab07a65607ce36827000200000000010157c167be120f3d344cac25cf2537afc63419d55f14b04210f54afa56614ddb130000000000ffffffff02384a000000000000225120bd27d3823b4e6bbf650ae58fd3c8aabd55431c23617ab2abe197cfc93d191a49b73b000000000000160014555154c233dbc5ffae20719896167045074cca5602483045022100c4a7ed44f7d63316a9da1a597b3213b592d42426377f3ce1e9a50eb49ed13b3a022057f54b3d4ecd865232ab30d3dba4d99c8bc9457913167d7dfd1e669bd5c30faf01210319fb38786b6f39594960fe18a83afcf4913f6807b16d20f0c27ab787d4776a6b0000000002000000000101e29637892c5f7b692d731b8d5b806522cdb1267518cce757f197290a2dcf2e700000000000fdffffff082202000000000000160014555154c233dbc5ffae20719896167045074cca56ac020000000000002251203971ce43535a87ba2267c2c6933cb5a01f628e8282609aa773540c7a2281f841ac020000000000002251201ea8915867729fe7822f30a04fc231fd9eb38a19be03365c088b14bc171394a8ac020000000000002251202056cb6b1069e94121cd33ec2fa955a329b13b32fc736362a2f791310e15dbd4ac02000000000000225120ba5c2036fd470028818223fd8c5b0c894d29f8667853d50469019508858a7c6eac020000000000002251200e8f9dffff5fa7e59ae4843f7fca5e6a35890e26b76bcc1a03337737925ac18cac02000000000000225120a88348fb605169ad09d87128ddfaa92981cc3379923410ddb2076620ede73296633600000000000016001407550d9f9170cda9e38be1707daf2a6b6bf015750340bd9a83434d0b476014cf5d59822d849675f323cfb0ec1ccec1e7bda132e9b9af92811126bc59aaede9987bda40c4bf91143d5cc738ff36bc355bd08b07af1b9f79203b4f4b8ae037c76a03e24da1a36804e7c0feb443e63af10ed776592801ef90e7ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c1d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc400000000020000000001014c8ec55a2c8df73180e2c8ce1ff0d0db076992bc7a2d288bce8b1c8741ccb2d40200000000ffffffff012202000000000000160014555154c233dbc5ffae20719896167045074cca56034021d0b0b8576cec09b1c26f8df9109f124c0e0aa8bf89122de4a07759c91912123409b3a4974c0400b397beb09fe11f1de21d4de836626dff13dd5e466c0d3ad679205ef4a15b6a4a779f83da29105a4bf3b48cd147b4f34646f6a451f48315f2ba2cac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c0d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc4000000000200000000010158fe3d9582bb9e4e6780713de1062b3be1394b4148cae25bca42ab89fcf79e140300000000ffffffff02627500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be740c02000000000016001425dc390e30cfa56737d358163f9470fe5fa94d140247304402200e6482486e4ecc2965b8218c696da25b6d86ac1eb73dc194dec844fb2c574a5f02204cf4161a54467efd97f6a7c18684e815c6f04ea5b27adb52aa93885bfcd1c2840121024680fdd0217684cfae2e2bd01d371b764a4ba6fae07484a29343f850ae958d0e0000000002000000000101b6631879ff6d88d82da28fe33d3a205e5efb7901572da48ca35074cabc0821f00300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000068f9ffc356a20645f1b4e71724c7c606f3c2d503147d00000000000016001455c6fe4801130a284c1aa2bd92223d8c5c45f2db02473044022067487b78141723d3972558667c78bb504ac35bea00586ea8bb8d51ba8d574cbc022048d65707c30a0753717a8b2a1db773cc7607d305a76c077d6ac1a828ca405878012102ff17ec3ccbb0944da8d43a85f04f19128bd400d9ef583ae8b51c0919976cf6890000000002000000000101da28cc4157bfc27151b65b1cbd21b714eb7039896842d20b83cd619f7bc783250000000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be9b22000000000000160014c0145842741373bae649b345f671810099a2acbd02483045022100d943bf3f279ad3851b65ac66f7f2238d7326de82f517a2145fa01f725732243602206ec3702210c6d5cdedfe9d554db7916380d25bae8ceae1e397b035d0de0ea1c0012102b874667a325ccc21445f42e3fd444b7f75e4d2947cd9b7cff271e25f8d2a727600000000020000000001017f7a09997554f0f0b16c33d9b543b4280db573e48ed1bfad968a23040c8d2ad10100000000fdffffff021561e7e40000000017a91418705a35a23a2c98f42b96d8bd0f92d5fe8ea26087687a00000000000017a914a5defd2568c6eace29191a7e9b346db68b8065aa8701401980180d9dd6651820b575a7824afa0ba7831e0e4638f548bb6374c5e3185b1a778b19d72ef744a2ad2c3fe98f30bd3b332240dacbb0f25ec66c58d2ec5f600ae368270002000000000101c228c2cb7eb155c0dd892b7d79fa16ffc790d3cbb0e0652812ca8846fdde4354000000001716001430481cf30697df6106bf0d4d51e357adcaca73e3fdffffff02d2900000000000001600140e59df46b72096649e0600471e1ce5740ecb630e9fcfe6e400000000160014906b673df8e7e5356c3e134245c155b9ca49137f0247304402207ada09c51eb2f28d33b38f7635554b6f4dbc2a8bab682b0b35b47cffbae6278702204c667f511636fab76200a826039bf4a9cb1571194dc8f09627383f10d132a0d901210212d1acb565af3bf2bd41c2b1eb6cf4b44605b134f5d1acdef660a6ec11022f8ae368270002000000000101181615715499922ee678cd5689ba7defc9aaea03f6370d6e4b7aebf691ffcfee0100000000fdffffff026b4ae6e40000000016001467a1f4ee056b81392ebbe4ce2b6e9579510016d2a784000000000000160014b750aa34120cc29536c58921dc276207313a45cb02473044022017bd0060e10e647cd0809784fe125c5899aaf8734e0dcc80b4e2cceea94c1dcb0220011a986f6a211e8aa145f7ef18c707a66854e0101cb8c441e2226e0d36b7cfa001210310c779081fb68873d46a3f3adbeddadbe1b555e92505d3aa2a39f9fe31eee600e3682700020000000001014c8ec55a2c8df73180e2c8ce1ff0d0db076992bc7a2d288bce8b1c8741ccb2d40400000000ffffffff012202000000000000160014555154c233dbc5ffae20719896167045074cca56034015d0b3115de41dde909b9f3ce1a1e0bdbb198b7a98dc094b8e66595901a115debd2f27ddbda24d5ab2e1cf034b65cfd9c7f0d6fb427fcdbcf90c16321169e676792015b1584676e03d62a3904ca46ba88f28e7346becee5b20ce2b706df5ce9a9b97ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c1d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc400000000020000000001016f30ec296cd70624344ab011ab4e539ede464406578ae2d1d45e287a10fb5ade0000000000fdffffff0299d60000000000001600148aa9be6d4dd3c3e2d114487a3e1ed5be013c1b98342918b500000000160014e1454e46a8552a713b158485ebca9826ca1faa180247304402202ce9cb1c9c7781565d60a3e06b71b3dfbf0aa0352be0b6a4048fb18fb7df585402202a5917b4e685a50865cf2ad317140d264a43794edf8d089431dea07c3be5a9cd012103e2af70347808ae8555432adac89bded9891b4324fde8eca68f12c7a9c15fdb87d368270002000000000101ca195ab6eea53415cdc5a5e986e4afd8176e7832b17c49e68f8298259d943af20100000000fdffffff020c8a17b500000000225120d38404663d60d82a3ef45d516077885b1389b9f602a67068f93ced3c5a8b2adb839e000000000000225120f62cdc66f4f02f751827fb73c36af1a640a2c0d98ed478706c2767b326e515540247304402200ac373065ca2d216510c5f010d299624a1494d15afe27012a587c1e274089dc70220061d444222eb4788c772096bff31ba28fb7ea4ee33bd5f4d7aca9ce5f91a84ac01210259554802dc4e5be0b51c9328a53aa812e460056f094ffc179c4b7eb6f5cdf946e368270002000000000101c88ddcea0fd2068321e01b7ecdb8714cd86fa84c9de867a6b8edab8033c108930300000000ffffffff026c7500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bedac4000000000000160014e37276d881b81efd2440f9424b7a7700baa9d63d02483045022100a4fa4f0bb225e67cc69eee42af7defd994fcaacfcd8c5828186fed6ee43a869702201d43caf134191a62a4802d7b60dfdfa0dd0ca15c290b7211913907c3351eb187012102d6a53211b88ef5ecfdb3dfca188729b8d06b05808db147144e0285ec402eae7000000000020000000001012512484422d903743b08af8f9d92e3280706122c21b24f8a2324ec32a1e05cb60000000000fdffffff0218db00000000000017a914e6353453a79740c63b378e341c6cef5cf2f7690c873d52f8e40000000017a914083d6f539bbc457b3ee5141777ed2608e5d7673a870247304402206ece2340d7c131795dddfd4b275cc0444f59c2b515c85a99ddb9e9325206fb9d0220638152463b2da87e44f83edfe90c632c7c9eabade21dc95bd9ebdbd9058887f50121036bbfe4fe6f7e0e5ab129b4bb6aed973ff233b9b76c65bcdaf93aa9666e2ce9b6e3682700020000000001011d281138d2b92a5bd01b03e110d72a15f0dcc3ad4169660eb4f75acb499ce1be0100000017160014b21ca0304dd26a6a172de9497da17a2703d18381fdffffff0264aaf7e400000000225120988087b3a58acfa40a7de08774c23f29e6682d58ce8c86f1d023e01bc813dda51da7000000000000225120491e047949fab531c395687cce92fb1e4e238c57ff239d9df0c22ce303d358ab0247304402205104c12540bf71bc2c195b7aea35a2dcef66a162833c405133977033a1f4e2bb022047c38da07f1103db1cc71c1dd930c4bb933800fdc4a9abb568a820013ee2253f0121036aa56c929ad5c03ce62320468298b696af848bd1591142510a8ee0ec6e6893c5e3682700020000000001013139fefc4434780b9e830435dd71ee1e950507313d189b91874bc7c553912b1c0100000000ffffffff02d007000000000000225120204d04e714238be584909192329b04fbfd33f356db0422da4c54eb2327f699deb41102000000000016001415b4dccd93043af54c19f55844e0a017a0be263302473044022007fe1e4c5c60f3954f8495da0871ad00a1a0356a74cd49520baef7f8b6ce01cd02200fc38072abc8adb79ddd5e6a13fc42e66db5104d0aad9ac360576887a7dc2e2c0121026f9fb86cc520f129bd72ae5560af39716964ae9ff4c975993c4608c75651424d0000000002000000000101543a35afeca80f31b5aa14df37a9c2510f2e4af4725a1d05c019c2fa05ea070c0000000000fdffffff02260100000000000016001415b4dccd93043af54c19f55844e0a017a0be2633ff0500000000000016001466f4300ecda2799026eb670ee649bd1d839fbf820340e391158e6079aecf7372d2efbc80f9611be573e196b7b2e45e33070005730d27183c602187f28c4f0eb26f1d9a86fe70c9071aa183950380d92a469763ac467680201a73c14770cbfb23671a39be9b3492b6ce90fcdd802301e8eaaba746295a595aac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003a7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2264667265222c22616d74223a22302e303031227d6821c0df189c73ade05687b66aa1c1eb8ed68287abd3785245b1ee0bf81d8b77d9727e0000000002000000000101562afd81429c2f6d2afba226058ed1b4672f52bbd91bc75cf42a9526168e38760000000000fdffffff0222020000000000001600142884efb5c992f5250e576516af53efeed408de1fc108000000000000160014497ca040a80e2f96a4e185606fc68899d5c28a1003405b3257dbe7aebeb3d899f26101bd57cfe4f979bcf8b8fd28ffe2d58771cb23d69bf025a55fa432f468f4dda208d8d6c8226379b0c24a5dcc27ce15f1babf321dfd277e20c539bd8e754b5c3482b60f0807edcb562108d7d12d33717b90f1a7234d5cc6c9ac0063036f7264010109696d6167652f706e67004d080289504e470d0a1a0a0000000d49484452000001000000010008060000005c72a86600000006624b474400ff00ff00ffa0bda7930000200049444154785eedbdf9979c47721d5ae770030134800640ec8d8d00b1101b09120b0910c40e1000497003407246a391469ad136d28c96b1fc64cbb62c4bb6dec87ad6933596f5f42c5b9637792cc9b29efccfe53b9191f7cbc8c8c8fcf2abaa6e7403f5439e5eabaa1be87be3c68d2547a3d1c8cdceecdf60f637f0d4fe0d3cb5bff88cf866e43ffb1b9831ff8c00677f034ff5dfc053fdcbcf22c04c053ced7f0333029845c0d9dfc053fc3730fbcf5ff9fff9cfbad1489fe7dc6884f3bc1b8dfacf8eb939573adbe7e61cceb6b56b9d3f6bd63cedd1f349f8fd6704b0320840027c18b05bc0bfb07ebdb3ceae75eb9d3f73ebbab3736eced1d16441043123871587a715f7033f09acdbf33b68b0f747ef1690cbefd9bb7edeb59eddebd73b7d24594882d0c4302385658faf65ff033e4580a7c83e7db0979ef3e5f979d77af6cfcf3b793479488200394862906a214d57667f7f8f5981cefe031ecf7f0045f96901fe05371ad159d57c0e6ddaece47965d32627cfc18d9b9c3e07e637393a2fcf6f0c271248891c400c92145242a27f03289ed9dfe263f85b9cfda32fcd3f3afec82701fd30909708e1c8e6979c7d36bb239b37bb239bec73b8401a208a480e39314031102194558e2403faf79afd6d2e4d0802c1bfc1ec1f79b1fe91c910a31c98e42fe5c6c3e4fd74c06e91c0b12d5b5cdf79f5a52d4e9ea39bb7383a197108b2d08a82884193022985b67f8719192cd6dfa57ade19014cfb1f5a829edc73c8dffa1f7ebb7c2f4bfd17dd68d4764e6edde6face89ad5bddf12d5bcc0302014964e4108841aa06fcdc440a6d24003f6496264cfb6f543cdf8c00a6f18f4bd11e46972f99ade3b21a495ec85f8a7e30dd86e6ec11f43580af76a351db797ddb76573aaf6ddbe6704e6ddbe6f4d1c4a14982c8c12486400aa414521223b5d36a7ecec8601a7faf330298527e69457b185f047c097a32cf481693d94620a0e8e8f3ed9093531425e0d4c1de06f03e227863c70ed77a4e6fdfe15edfa60f130811852408490e9218400a5229d84a660819ccccc32990c14c010cff477c3689f688f488f670c439daa7a0ef0cb6cd2ff99c9a004fe09060018808587d401ee7eb6777ec722de7cc8e9d0ee7cd1d3b9d3c9a3c2241e4c480df4713427fd5a2950c66aa60f8df7087fb1901b4ffe3c5d21d727b5be20f03bd043c819ea22acbf31d8ea26f3fc8a92597cfd99dbbbaf7f139f9f6ad5d0bae76ceef5a70a543cf9d9c40244412163944e5902a054908ec59b4f81f2d64302382f6bfe519010c2833e5357b19ed91d793b945129fe4bd15e91101c95c2310403a4bc023b24a4011c0980422d035a8dfdeb5e0fc595850dfb7d68d466bdd85853d83cedb0bbb1d4d08021f7eceee84d721129144716e9720871dbbbc72b0488195424a08a971d942067d7ec18c080610c14c0194feb160ec590655cced8d686fc87b097a1de109f4000b01c7cbf3106d25c80072809f00aa817d71f71ef7ce1e3e047c7a7b69cfdeb10e9e076fe9b9f5eb252411c841fecc9d6250a440bfb3540851e54893b38f0cfa54c18c081a88604600fa1f09c0a7da3ddc7c4d02c8ed75b4d7393d227d2dca5b80a7088b884ed157024f0213e07e77cf3e679dcb7bf7b92b631e7a6ce979f1baf267913fa3540c522d484200e91119d8694e2b19cc88a001e825c53b2300f98f87a61dcaf109f452ea33097054ea801f1c7c023e24be94f7c8e5a5b497511ed132057c8cec009805740deeab7bf7bbeeecdbefae4de95cdd279e77effe8450344968620029744a217810f8bd3d21047550f63a5a8980fe6f6ae90114c1ec6f7e560654654094f3b4b907a99fe5f741e64b073f8df62c7121ef2dd05b115e025e465f44f122c0f7ef77d7f7bfdc9d1bfb0fb8dab9f9f201274fdff7cbe7beb63f25174910f839e5cf4ea480df2b1242f0158497c0a94d5f991364d0971ed48860563e9c1140208049812f1d7c19ed216f21ef11f122e839ca23672790003488ec26d803d0256009c8b7f43970c0dd2a9cdb070e3aeb94bedf7f5e3d3fbda6fc19882024316852904a0184004f41aa03fa778a06678d0c5a55c18c087ad283a7570e75727f5decd8d3e64d08021ebad6a85947e6f73ab7cfa2fdce5d8e9c71fa83d6a0b7a23c454e00be93ee0aec09d005b83598df3b70d0dd39f04a76ee1e3ce45a8ef5587a4efd3a0961048290c49091424851e87705d96975406460573b4a64d04204358fe0a94f0b9e3e0228457dd9b823737c6ad881d4d7325fe6f632dacb9c9e22bd067d12e591ab2bc0775137805d0250825482fade2b879c75de3f74c80d39a5e791af257f06f9b375c41048014a41120214029101d4812403aa600c23022288bef4a046044f6d5af0f41000dcfd5a9e4f6dba68cfed03be25f311ed91eba20c878887488f284fa000404a8007d0003e094e09ea0f0e1d721f1e3a9c9cfb870ebbfc1c71f70f5927ff5efd7cf41af235e5cf829f0f3f2f48a14a0881fc48fd6865c02480a37b205ad283924f504a0b9ecab2e1d3410014f5e110cb99748afa96c1578bf8047c6fea19321fd15ee6f4bda057115e025e835d839cc11dc07cf888bbafce47878f3a3a1f1f1976f038fd7cfee38e3c52b201396852a81142a20e14198c46f47f264960882a68490d4a44f054a981279f0028d747592f2d13c5997b447d94f3d0b8c3f57be5e6efe4dc3ee6f76ce8c968df49fcf0479d457a017ae4ec1441011e445944e018c523c835b83f3972d4c9f3e9d157dd68b4a13b9f1d3de6861e7a0efdbc20938c243c31b08ac0cf8ddf03bf17fd8e4408f014a43a9064c0e0d7a78f0c2c55306e5af0d478034f324d080201109397583e97873aea93ab2fcd3dcaf153632f02bf4fe27b792f406f4579024b0af814ec001e0049e02c01fac1d163eee1d1631df8e97d9c47af1e77d691df23dfa7e72abd8e2408490c9d7208a42009419301fd5b50ba20c9c0260010428d08faccc2a169c113af069e540228adde2a6ddae14841fdf9ba9c27cd3dcef17b80bf7fbfcfeb3bd7fec001ff075e8af411f439e06b60ef05f5b1e3ee91389f1f3bee5a8e7c8c7fdf200cf9da9a1c3429905290845023032883d1885687592a407e6eda445032099f6835f024124009fc25f6874ce4e881e69da1c087ccb7a2bd96f704822e7f0f793b4550005e83ca8adea3d146474783fa8be3271c1dfada97c74ffaf39581078fa3b7783efd3a1d510882c0cfa97f7efc5ef43b5aea80d48f56064c0274a82bb346064389a02f2db054e3134b024f12010c93fcb16c94ca46187cb2868f1cdf92fa1af856b44fe53d477a9873040e2de733c087480e101228099c2001fdf62b274ebaaf86f323274eb9710e1e4fcfd51d41242009fa59f0736952b008010a81c8a05307878e24be01914124807188a0a56a502382a7c6207c5208a004febae4b75b4fd7f899790ce148734f3afa16f0299f95d11eaebd8ff62ad24bd02367efe4b690eb007b12c54f94c04ffbf636b9af9d38e5be76f294fbd153af4d74e839fc7385a3898448c2938322868c14824a2042909e822483a80cd844cc09605222584d0802eda72e49e191b18b6d4634c3316c3bd113e50b3c09043044f2a7723f25801835d0a68b72de10e05bd1de92f725d0678057915c0292c06e1d02fed7c3f9b153afbb710e1e5f23118b1c3429208d2095203d054d06324d88d50b80bef4b63f35a0ff4bf26e48d151e916bb0a9808b67bdf871abccacb499ee89460a513c034c0afe522e79424f7a99c474d2ad4b8d317f1017c2bdacb9c98fef075a44f405f00bc054402291100015c12c18fbf76da59e71baf9f76747e421d7cbef438f9799009bdb6f53369b52009a14606f83792a5cbf4fd1209d81e013a0c49c17912a0c5268208b41a201228ab81279604562a018c23f9ad129104bf3493e67c671ab5acd2900bb9fa30f728c797525f039ff25a6de60d013d00a4c105e0592025404b02f8c9d36f38eb7cf3f41bae764a8fd38461fd0cf8f9f4cf2d09a1850cca04809e867e22a0ff33fabf437721da8c41045a0df07212a9062cc3b8542558d129c14a248021e06f93fcb1e38c25a58cfabe9c274a79c8f14bc097b97d07fc90d39722bd95b35b8097d15b8295403d1a6d76df3afda6fbd6e933d9f9a937ceb821c77a0e7eee373d81c8d70639d0cf6629054908f014c84bb0c8209a997481486c62b2dfb78980feafe8ffcccf1e845d0692083235b06357e20d20252035408d613408163d82278e04561a0194c06f317609fce5a84fe02fc9fd56e027b9bd00be37ca84bc27d04b7090a4264d0802d04b10015c001ca2b704ba06f64fbf71c6c9f3336f9e75e31cfd3cfa75224930294862c0cfad0941a70df46f20c920af6a0c2782aea9288c2c4b22a0b42e5103ca1b90062152026a104b49a0b47864452a8195440043c1df2af97323a924f7c9d5478e0fa98f884fc0d7b97d57833f71d2ffa16b79df077a029505f65680ffec9b671dcecf9d39eb5a8e7c4c8d38e4cf0072d0a440c4d54206324db04b9b44047532a0ff1b2a1fa2dd5813815603d21ba0aa0fb613913720530252024402341c96560b2c5f60c591c04a218069823fcdf5ad2613d4f2f3a8cf357c72f55b804f3217c097d1de8af432ca03480016c0660192000b607ffbec39b79807af43af69fd2cf83935216875a09501fe6da28fc14d4eb622c88900434a543e445311fddf7533074a0dc894801693f8a5245003494a107d0122027fb149b824953640d330d9be0df37e755c6c3b5f5124b012086052f0d7257f4a00eb7cdb2e997c144d749e8f721e1c6b9de323e25bc0a768afe53d40afa37c09f000bb05f29f3f7bcee1fcc2d9f3ee3be7deaa9eef9e7bcbd1e9fb3e7a2ef9dcd66b133158a4200941aa03fcdea40ef06f6297346b44c01e01fd5f90e9da75198661241041326b50f0063a3550a812e4be005faf0e12a04532440274490c2d93a5e9d3ad6be8ef6ed9e36bb9ff80ade01f92ef976ac76c2a21ea5b727f1ce0cb682f737a96f76cd851c4b4405f8aec04480d4d080272009adfbe6d9e5f3cffb6ab9dd2e3e4734bc200396852c0cf2d558245065006ba8a9193814d0494721109e3ff85882076171e763a2dc07a33aaea589502ab4a005fc032079f001258ce04b054e0a73a72749463d4cfe5fe9088af814f514fe6f416e8ad088fe80be0594007a87fe9fcdb8ece2f1be757ce5f702dc77a2c9e17af13898255845412f879252968859093011b8954c9283537f1e7231190da92cd4520024acda21ae016634b0de84a010c4290007c01340ea17b10e6202a042b9c04962b014c0bfc7df97e5e4a82c9a7e53e0c3efaa3ab49fd32f063298e0020a3230144024646f808788eea04420df204d86f5d70bfa2cef7debae0861cfd78ffb120104912f4b3d0cfa4498108cb5208f4bb6a65203d839a2a20af20a91c8461274f04a1dd58aa019916483550320865f390e50b9448802e7a5da1e9c0722480c7077eca29c95092033a32ea531d1fe53c6deef501bf05f46994b701df015180dc83fb6d3e7fefc2c5e4fcea858b6e9ca39f07cf4faf951044200690824508f8bd88d8b432b0c880d2224904f009e8df1886218800b308f47f835663a906e8ff529a8459a52018843e2510abc9325f2098835421a03902ad044a24400b6996b127b0dc0860dae0b7f2fd54f247f9cfa612fdc15014e9ca7aa1968fa8df027c987a90f9f823d7129f0061815e46780d78801d004dc1fd8efbd50bf1fcfd8befb8498e7c2e7e3f92094d08025edf138324058310a43ab0c8c04a11e8df8e3d92377de391340c4d22906a2028020c1e496fa09412902f403d03b283b04402728e40360cd5488076526e597ec6e072228049c06f39fdade04f3bce08fc88fa242db3a81fa6eca4ab4f7f9c31c78fa69e04be96f8040469d865a00fa09280b7c02e01fe7f5c7cc7fddac54be1bceb7eede2340e3f1f3db77cad480e2929588420d5812603ad0a643581541388c05204682ca20e432266a9069016d8de406a10ca94008d432815ca7e01b410c739022e134a12909e004a8474c51c2981654802cb8900acc60adde167b9fdade0b75a47ad76d3792f25bb5cdfa8e543ee0f017e9ed773ee0c70f8480fd00b29cfa0e7a80e005a40ff07efbcebe4f987efbcebacf3ebef5c76d6297dbf7ede482a39314852900aa14b19ce5fe87edfe81b702952fb05ad44504a0bb44928bd012b25a09e015409340950f7a0ae10b492c0def55c229424b08cca83cb8500aca9bec7037e38cd32d747de69e5f9b28c67457cc87c69e621da5ba08f513e823e029e233a4029419b80fad265f7ebeafca34b975dcbd18ff31f0bd290af899f439202948256084408a40e3419d0bf05ab82584d90aaa04404b5b440ab017803594a1016915095001d8449a930cc12e80a81a5046ad5818e04e6d6b112583ea9c0722080e5077e9080ecd7871185a82ff3fc7ee0a7ee3d804ff23ecde57594b701df0152801ce0fec7972ebb4d08027f72e94a727ee3dd2b6ec8d18fa7e7c4f32704118801a4a00941a60df0103a6500df20a882d43c64555022829a3f909984aa52809440360f99be00ccc14612c88d416e16a2b5f3d431a8496099340a3d6e02b0f2fec58cfca50933abd1242edb00f86b793e4a7969c4b7653edc7a2def39d247d003581af00023809a82fbaafb8d77e3f9a797afba718e7c0e7e3f92085e3723058310f0fb58ca20510595f40044204b88963fa0ab05b252205382922f90f50b0c2001b33a10da868904a85b904880ba05694dfd32a90c3c4e02b0c06fadf0a2bc5f0ff620ef479ddf32fc74ce6fe7fb76cf79be6987c04f515f3bfbb2868fee3cd4eb29bf972ebe063ee5f452de53044d401f223c010d91dd02bb04f86f5ebeead273cdfde6e5714efa3cf2352239a4a400a5d0a984772e77bf0ffd6e4c06d15094aaa04b0f4415013e013c0218a93611a4d502e90d741387aa7928f705a239d8b510b790402811ea3e01393bf0f2fcc68404a865781998828f9300b4e9b71cc06fafd8e20e353ea8e7536e8a3f481df5758e5f067e9acffb482f409f46788eea00a205f27f76e59a93e7b7ae5c73931cfd7c91482239e0e791a420158226039926a4aa80fb17241110814a8fa094166835204b865da5208c1e93b7237b06a42fc0e6e0e42420db86410274ed1c48007303a80c3c4653f07111406bdebf9491df027f043e13002d8778c94fdf11f8c7013e97e9184d0802f814eda5bca7485f027d043c4773805302fcb7af5c77ddb97addfdb671fef9d51bce3ad6f7facf89e794af85d7d7a4408450250391264855406aa8a4086a44a0d580d53b0035d0a504155f602c12509384a4044002d8274053847a82905281c76c0a3e0e025889e067e08f463413bec583bf28f743571e4533e4f8f4c76d023f986ba9bc8f915e825e03de02ba04f6bfb87ac3e9f33bd76eb8dab11e239f332189400c208594105821586490a4092145184204a5b400d502a90664a5a02301d133d0f90262a8a86b1a0a1502ea1caca503ba59886607e40011f609d05211d923b04c4cc1a5268056d36f3945fe14fc4400b2898724aa76f55b814fd13ee6f40c18067d8cf20098063c8009d0a6c0bee97ee75a7afecf6b375dcbd18fe38f2371e0f5f0fa1d29188420d5412403fe9de97727c5833223a9a12a1188aa41292d906a403610c994005502940a272181ac59486c1e2e750ba232204d418c103f864ec1a52680bebcbfd6e8336dc3af5df223f2e32d997c3acf1f12f123f0754ecfd23e017d90f112f016d825b8bf7ffda6fbfe8d9bcebff5e7d6c0131e179e433e77248894142c4290ea80c920febea82c0c25020c26c9b4407b0328cb921a907305a812c85221ba0775e7a054021824b2948024011a20c214a16c144a7a0442656099f8014b4900e348ff962ebf71dcfe3ef0e7515f924012f543d71e45fde8eaab1c3f487d0d7c2bda4d0802fb482f409f46788eea0064047804f9efdeb8e5e4f997376ebb718e7e9e48229158f0734852900a41aa03220322b7922aa81141340b73a350ab0118b3794ac055022c2f95e6a05f508a0a81990ed8c6a0d5364cebc765a3902e0fc2145c267ec05211c06249ffa506ff56dfca0ac96f45fdc4dceb01be15ed29929640af233a402a01fe7b376ebbeedcbced7e6f92239e4bbe065e5793021142950cae5cefd44d2403e915d452834b9e60a55128d5007b036903115282e80ba4a5c25612b08c41d9362c0788929661511ed4a6a0f6031e537fc05210c09303fed168ab6f6545075f31ea3702df8af62cef63a497a0d780b780fe7fdd7ccfe1fcab9bef39ebfcfeadf79c3ca5ef93cf951049200690424a08ac102c3220722bab823211487f205303c11b28a504962f20cdc1a124209b851212d8bbdf5f24d3cd0d88ca803605e53211dd2484d2e04bab9764a5d852108096fe5cef5ff5ec06b7ea39eac01b27efd723bd2d4d3e93c8fead8ec04f87ead4dae42b47fdd4d843c407f0ad684fc0d1a007d034e035d05360df71bf7f2b3dfff7ad3bae76f4f7f3c7912c401478dd8e140c426075a0c920aa9b8e0c822ab01441392d48d580ec1d902901556a9012c0178039685608705f41211d8012c0ec000688ba15637bf7fb1ba52409e03a329882da0fd0fd014b5c1a5c6c021827faf775f959f3fc9a006873ac6cef9d0ef841022443d1b6db81bf4d080218f5a3b1a7811fcd3c8e9830ec64a4f7a00f325e023e0233825c82fb0f6edf71e9b9ebfee076cb491f279f332508260622058b1088b4b43288aa800d444a754a4420ab069208b41a487a07c2e62252031830228370da2480d9011a20c228b12701313740e5416d0a6a3f804a83b23f40960697a85578b10940bbfe699fffaae736393af6259d25d7bf2fef9f16f863d407f047a36d3e0f454dbf6be409adba5cd22b44fdabd7fd1f3bfdd143e6a7661e9b77041c19e9095c88bc0c7a063c806981fc5fdfbeebe4f9c3f7eeb921473f3e12472407bc7e2485f873d2cfec494b2803fadda00a52f3302582d42c4cd302ea21906543b416c31bf09d848204a42fd04202321da0ea802c11a263106bc68804b05dc893806819466580578e075350f901ba3fa0940a2c7297e06212802dfde3e50ae348ffc5003f37f7a4c7063f11001d29f9d1bd07f0c3d92fc97db8f896cc47b4cf237d047d043c4773805502fc07efdd73ddb973cffde1c0f3833be2f18a3cf07a9a148810341924ca205423241148afa0a606e8df342b1baa26226910222520256091002a04563a5023019a1de8968e161a85e45621ed07c42621b54864d366574a0516796a70b1086031a4ff50f0530aa0a5bf6ced8d9d7d43c04f04809e7d02bf15f5298ad9723f97fa5dc4bf79db4b698af63ad24bd06bc003e800f90feebcefe4f93777de77e31cfd3cddf3077201e1a484c00a4d0802a144065005480fa42240c3914504b2870044209b88d04044691952024902f00564bf400b09c86621ec14c03d047efdf8a123ddea71ea11c0bd84d82f487e80ec14243f00fd01727cd84a05e41d038bd820b458045097fe6cfcc96e3f5defd7d37d2da69f1ee95d1cf07b02083dfbb5a86fc97d99e3d7804f002a81be047880fc8feebeefe2f9c0fdd15dfbfcdbbb1f383aa5aff3e7e373e1f9410c1621d4c920fa058388c03009a51ad0298124014a09502a1c4a0249c7a0182092fb04b429a8fd80b44928ed0fc0bc40291548b6082dde0291c52080bee8bf18d27f28f8ade85f97fd90ffa3d1764787c08ff747a31dbebe9d47fd61113f023f95f61ef441c6038004480be80036bdfde37b1ffaf36fef7dd09d3fbe479fcf4ffa3de171812472a2e0d7a69f411202520752079a0ca22a6827827e3520fa06424a90fa02dc38542301ab3a806621bf861cb3036294589380e507c82621bd524ca602a80ae806a1253204178300c68dfe8b65fa69d93f39f823f0890c76f843e0b7a3be32f70ca9af814f0092919e409647788ee0003a01b8046e7cfeff79ff43573b7d8fe7d7f8b07b5da912a4422075d0fdfc810cd83390e9419d0864c5a02382440d4483b0ab1224be004a856512b08d416e16926dc3728a102dc3255310a9009982de0f28940671092952014c0dea2d42940a2ce2d8f0b409a0c5f8ab0dfa0c95fe7d8effb4c0cf51df023e084d080220823f8ffad2dc93397e09f81e4021bac648cf72bd067809ee3f79ff43573cf73e747f224fe57be5736a829084105309431904239154410b11e88a01f903520dc84a812c17c21788a5c2c949408e1253cbb0ac0cc0142cf9017669b05c15f00d424b6b084e9300faa43f95004bb97f4bf4efabf5d74cbf526f7f8becef073f48203afc79d41f027c2def4ba0073813a0dffbd0fdbfefdf4fcebf7bffbe1b72f4e33d590892c0eb4a42c8c9204d13a00a901e9488c0f207a41a907d03b279489b836d24c0adc35209a06d98d690638a10245033054d3f4095066b5501a40235439036084db943709a043034faf735fcf4b9fead79ffd2807f34da9934f25851bf2fe2cb68dfe5f24ada13f84a8007c8fff483fb2e9e8fdc9f7e10cfbffbe023671df93dfc7e7c0e3c2f88c122044d06a9c91855419d08f2b440aa015929c0b2125203a8120c2101ab44286707304508124079d09340c514841f202707652a80aa809c1a84217862eb562753013931880ec1299705a7450076f4e776df79dfec536ff8596ce93faccecf865f7be427f0e34877df8afa248391e343ea6be0b3791773fa04f422c2133035d009dc12ccfffec38fdd38479346fc985f935edb2204fa59d354813d03f805300e7322c8fd815c0d60c640340f055f4093009a866a4a409200da863509c896617937a19c1e243f40f607607c386915deb7df951a84749bb06508a22c3865154d0802302d02d0d19f3bfe18fc1b3df85f7c8ef271e4ff43a27f9ff49f46b98f1b7cb4d35fcbf959f647e0e37dfaa395f57c33ea871cbf19f83da0277002e4ffe1c38f9d3cfffe43fa5a3cffe1fec7ce3ad9f765cfc344922a853219b41281af6e984661aa0664ef005282ba3978c52f52a532a14502b24f006dc3d83e6cf508902928fd00dd2988fe80522a8006213d3084de00d926ac0d415a1e22cb82535401d320807aeecf91bf96fbebe8bfd4d27f7ae01f8d7679f0a39107e02f47fd68ea49a7be93f801f831d2b37c2f019e402cc1fd67f73f76931cf95cfeb905298070e86789aa232a039926a464101541ab1a90adc548093212b8caa3c6ec0ba04210b70e4912489a85c23a722201d928949607df2cfa0158308ad2a06e15ae3508c936613d31b8442a601a046047ffb4e5d76afab18cbfbe869f56d7bf35ef9f2ef88900007e6ee4e17abeef9a2b467d96fa52e6435a4be05ba09780974027a0fed9fd4f92f31fef7fe25a8e7e1c3f573c20054908920ce01f242942f02d241194d202ad06309148e9145202cb1780392849c0f204a84f20e9180cb303b251489b82da0fd04d42280da65581c30e53835683909e18d41d824ba4022625803ee7bfb4d3bfc5f527e5f4b74800002000494441542520e57f2bf8b1bdb72fefd7e0b7f27eaef1a72797fd047c79007e9deb73e34ea8df1b393e015f1a7932da23fa02f425c003e47f7eff53d79d4d08028f3e757f3ee488c7e2f9400c1621683288aa20fe3ef4bb91b24948801a94843f40a54fe90da495024e09a42f8056629883bd24209a854002728088492056062c3f40f7072015d0adc2940a941a84d01b808941bf41c81816425910db8370b108ee14984245605202582ed1bfafc75f97fb160ffc440452f2a38907e097065f17f595d4d7c0b7400f4012402da0ffa78f3e7538fff9e3cf1c9dfff4f1a7d5d37d9f786c421c8118e835a35248d501c8007e01ff2e796aa0d3026d125223515403d120c4f8315559c817a89180591d102420a708a95b509a82b61f109b8492d220aa02629d984f05c4ac40c910f41b84762db873bb76397408969a833a2f20ac139f82173009010c8dfe4b61fc4d4bfa8f17f947a305a70f1b7d69d41f1ff80c3c0d7a097402f97f9ef2e1e7fcac23144f0a1532a034612811f856e4a006a437205302b413379180511d901d8318206212881792609780f603acfe00b355f8d5e3aec9100c1d82890a08c342724ea0e4054c6973d0240430bceebfe6798abce3e4feb5e51e9346ff7a875fc9edd7b2df02ff68b45b74efa5b93ee43e97f1a2b147123b8ff865d05b80ff2f9f70c4a7f35fc63cdde3fd73a5a4e2954450093619b02ab088407b04595a504809d045d84202ba3a404a001d83440218206212b81427080b7e402915b0aa02940af41982e8104459102a8052819a0a5884be804908a0d6f3af077e38faaf4d0802797ebb3f6b5fa0082bdd7fe9fc8f5bf66be9f1ef33fda617f909fc3870f8bdbb9fc8fd32f061e475d15ec8f21cf405b07ff2992332c0f9af9f7ce66a477eaf7f5f91074841128245064811e01794880046212a06b17fe0c3a46f00bec0b824808e4126011e204279509a82f9e0d05bfe02183205d3d260ac0ae806a1264350cd094ca402269b141c9700b4fcd7f7fa45f36ff573044c02ffb606f06be38fc8a025fa2f96f4ef37fc4a915f1200bd0ff0c3d9479edf95d692929d88f801f80c3e19895380d2d734d0ffdbc70f5c723e79e0fe5beda8ef0759e079fd6b0852b07e2652065005d12b888a00bfaf360a4102f006624ac05d844348409608d131689607333f200e0ed55201aa0a580d429815902a80ee17908620ca822515405e40ad22a05500ad0e9b605fc0b804d03ef1b7fab9ad6ef5f364c2ad6d208021d1ff7148ffd4ed6f05ff68b4c7d191653d32c920f7a3a35f073ea47d07c210dd09a81ed8046001f0bf48de7fe8fee293fe83c7cbc7cae7a6d7ea944220039f6a24a902fb052522d0fe4062128a4a8126013f20259a86ac7420ed13e08e4122816279f09dcbe146a23838e49b84ce5fe82e26c5bc005201b949483608a14d584e0c5287200f0ba9b2604d05ecd815ae17dbeefa660426bc5b701c026837ff28fa13f865ee4ff27fee050212a500b5ba7f6bd9cf8afe7daeff3879ff64e00709d05b809fa4b1cf953ffc381a4d08027b66c48fd11e91de831e11fb93070e8005c8fffba70f1d9dbff8f4c158a77b7c200d22818e14c2eb820ca4324855414e04322d600294dd85dc5e5cf205bafd030512d07d02ac04e2e2513d37205301f2036469103b04b0520c5501d920240786d0262c55c0236508ca3901da1e545201b23b90ee13a0a521e9a4e0bcc3be80094b82e310c024a5bf5ad7df5245ffa5023f47fdf4ec75a3d15e6ff259519fa2a606908cf690e488f412f41aecfffdb387ce9f4f1fba1f0e3c1efce1f19240fc6b7cf2d0ab0c490649aa2054414c590211dcffd4131d971099fca41a40c9d093409840842fa02b0425259092002e2a0924202a03f00364bb30f901a80ac00f90a90079017d86e0e42a208e0beb19015c308a05a2be3d78b292e03804d067fe4da3eb6f48f41fdaf0d347003aef1f27f297c14f0440c78afa30f712032e1877b9bc4f23bc06fbfff8f491a3f3c3cff2f33f3e7be4e431bf078f0fe4015200214832e8d28e8f1f789351fffc4404300b655a60a901d937502301db1388cd4271768049405606e007249d82562a9054056c43709a2ac0ea0e9425c15263d00469c050026837ff78f047d6fea71dfd73e9ffd2da936ecbda53dd251ee9804f4ba75f1ff8890c74ad3fbafd6cfcf5839f0800ee7e31ea2be053c4ed72f820eb09f488ee1eec02f004f01f7ef63001ba07fd83c2c948811fdb91832684cf447ad1790bc183504460a6054a0d4d0802f816e32425e0e6219b042c6310cd427c4f012901340a695370682ad062084ee205e825a298111852121cd30c1c4a0035f96f97fe16afee9f96fd00fe3201f4457e6bbaaf2ffa8f07fed1689f37c87c2dbd73f685ab0ff007a94dc097121fb25e46f824aa07901378e5e7fff2b3cf5ded6855d09185781e1002134efe733149311168350022906a40a604e39280ec18c4ec802781703909750b267e80910ac86d423215281982a5b2a0e505947608eaee40392968ed0b202f4036064d614a700801b49b7f79f4a7e69f52dd7f48cf3f9cffc530fefaa2ff74223f811f6980cc917dae6fc87d0f2844fc20c701fc0cf401a80cf247eeaf1ee4e72f1f3c72d631bff7b3479e30bad7216251646011017c02540f24114835202b05f005d03310cdc15c09c8ea00e6078804303b4024900f0fd55381bc4b901b84a417601982b8821c7b04758bb0ec0b2895046fbeccb70ae9c62094046954b866064eb02b60120228d7fe2793ffad75ff21b97f5ff49f14fc96f4e75c3f3d11fcf8bc34f9d2125e0e7c487c0b901af004f2bf7af0f944879f231e7a0debb5bd2a30144142049f3c48bc01497ef0055a4840f609607e00e54190009707533f20aa00f603501ab4ba046974d85201da10942aa0cf0b48ba03c38c4077b5184a82fbf86e416e0cb2cdc0dac6a031d2802104d027ff5bcdbfdabc7fcdfc6b8bfe5bd6bea6967be8dcbfa5db6f52e9df027e224d0802033e5d492fe4f990fb31c7472e1ef3720222456700d402fc5f3ff8c2d1f9ab879f0f3adde3148148428032409a417e434204c12348ccc2e00da06c18d5c0675dcf408d04f21221770ce6e541e507545201dd25e8530161084a1540bd018ba5026449b0cf0caccd070c1c106a258049e4ff10f36ff2e8bf3510c0d6b56f7822d836f766759b6fbed56769c14f04400e7f67f27dfac097e028bfd6521f6043b4d7a0f76027d006c0fff5c3cf1d9dfff9f08bfc3cfac2fd4f3ac6d7f0b88e381e7cce4422080164005520fd06ff3e1401cc427803458330960a2509c0184c4a84b259480c10f9cb4aba1e01beaaac960a580d42ba4d38191652cb43748bb0a502685cd85c1ad2d418c42a409a81b437d0ea0918330d1897005ae4ffd0a19f96e86fcdfadb4d3f44005b05f8b7cd9d71dbe7ce66f3fd3bd6bd25567b2d3df83d017cf2a033f9baa86fc86d0bf812f409d81f7de1fefa211f80bc4806fefb2251748f1304415ff784a0c8401381370ec3cfce8a807b0ac8c720358034c7f2053a73f0fea75daf8034063509a43d027c49094880fc807a2a903708a137a0a602ac91616a0ed25e406d46407b01da0c8c69c06e4f00b42ba0d41330616b702b012cb5fc2fedf91b3af0c3b93f817fdbdc59830086e4fe7d8eff30d90ff93f1aedefc02fa3be2fe1053041eacb880f69af81ab23fadf3cfac2fdcd4379be747ff3d03ae27b0c65a08984c8404d0802aa824804c1347cc06548a90634091019a067a02f1d9025425d1e245350fb013c38544a05fa0d41392ca455001687588342551530a03370681a30e6cec0560218b7f96769e57fbdeedfb7d967dad15f1b7e31e797e02702206000fc327ad2fbd18413d157487b00134410019f83fc7f3dfad2d1f1df234ef7f912310442c06bc8d7d444809f173d049d69185202904067107e3c8c04e43831f508c4c522d10fa8a5027dbd01ad2a003b04657720cf08c449c15a49100b4392b561e67cc0b034606053500b018cd3fcb318f27f68e96f12e77f68c9afcfed2f839f08c037f318357b021345569f9307334f839022be09fa00f03ab81b482221057ead9852f0fb480fbc79f8f073ff33fb9f5d9610d1542452821612907d02bcb918b303f9dc00b70be3be42f603642a90f606c415e37e95d895ebdd4251ea10ecf302a002e48cc0344a823003a92740af0c936940ad1a306075780b012c86fcaff5fd8f2bffed597fe4fedbe7ce89fc7f88f4273290f2dfeeef8fe5bef6c89f81bf93fc88fcb18c5706be00f1a32f38c207d032f8e9735fb8bf7df46577400a789b7e8dbf5f3f0f934cfa5a26112495032281e00984df4dfb02b254a8d301f4091009746dc3a15bd05f6e12ee26a0e121f203900a5855016908ea55627659306c140e15013d28549a112015d09706e01e014c09de7be590b3c6845bd280c39b36bb0966035a08e071caffdac86f79e24d08028f9c7f3e6db9ffce7517dccef5742eba9debdf51edbe4372ffbcce1fe53e54c07e47c0e7439fe3f791ef23ea77669be1e44b30ea082f01ffbf3effd27527c8ff08faafb8bf7df4150ff4e488c71031e0f95252b18940ab01fa1da006d0861ccb85d11c0409a4c620ef3ef024d0b50d873b0dc40421fc80ae3fc0a80a4c5d05841981969220cc406b57404b1a707177ec09c085a2ba29482f0d1d9006f411c0b4ca7fe38efdb6d5feaddc9fc1cfce3f45ffedeb4a0a609700ff45b72b218021e0a734a02ffadbe0070958e0675045d9cd865e046d7c9fa33c01fe6f09c43ee233c0e9e3f47cc5fdede7f2a45fd78ff5cfd99101833f259e3c2d90de401f09e8ea40ec13104344a232800942f801e80fb0aa02716a302d0ba65e40ba372036070d53015635604867a0ac065cad3405594b435f9ee711e181e5c0a104c037fed83bff6b4b3f5b9b7fa623ff63f48f0410577bdbf21fd1bf9d0086e6fd75f03309bcdc1d2df9017c1f89831c67a006300ad047b007903fe2684fe7fffbdc3ef8ba7fdb914320062885ee358299287e165608f00484371052821a0924d501f409849d86dc31c88d42562ae0370b85a1a19a215853019816ccbb03c3ed4285c6a05a1a6099815d4fc0abc71dd280be6d414803d2d980745108ae14975b831bbb02fb086029f2ff52f3cf78f29fcb7ea9fc4f15802480e8fc130110f8f95c72bbd6bf3b20f79f2cf26bf0334d080211ecefccb60efc2237479eee257e2001063e031c60a7cf95405f2483f098f81c440a2255e8de8f6a24a62569739137080b24d04d1b86c525dc35c89b8d4c3fa0980af4188285e620ad0216cb0ca434e06b274fb92169809c10c4d2502c0a296d0d1e6338a88f00163bff6f69fee9abfde7e69f25ffb7af3b6fdce527094082ff925b48086052e34fe6fc31ef8f5e408cfc9a0c3ae3ad8bfa51ea6be05b11feefbe20422012f8d2fd5d21fa1311f0d7c2f7f9c7a4272a839408901a486542ef77fd08be212936116925e0bd015122b44dc1722a405501cb10a4fb17d0266c3507e98a404d05c8c6a03e3390e60326a906f85b841aca8153f2016a04304efe3fbcfcb761f54137bffa15371a4d26ffb7ce51eb6f39fa130194bafeace8bfb0e15d47c79ef197f27fd2e85f063f520238f23eea1b119fc129233d03598298c9e1abd5931348fa3c5e617429825604420da05a80922148c05202a8127cfaa8eb184c4cc1422a80b5e3541d487a03b236e150165c041580cb444a3d017dd500797f40695d58a91cd8e70334de1b3084006aedbfadf97f2cff6d78f18023f0d3d9b8fa903f29094803504efee5ee3fb7fdbe11a43fcb7f69fe31f8990076ac7bdb1fecf597b93f4b7f8efe2080850d97ddee0d97c5a28f5aeeafebfd7d79bf047ff9fd2ed7ef00c852df06be4c01beea23bb3f5f349e4e0d7c5579069150341178b3b1330a9541582101394d08025d28cb839d292852012c1d455500f302e80d582c1530694fc04fbc7edad1b2905a53905c1a5a2b07f6f900ba2db8a11f60080194cc3fbdf9a736fbcf04b061d57e0702a0e8cf0470581040d9fda7851f34f14767ebdad7c3e1be7fcbfc23f7df22002efd51d92fcffd23f84901eca910406bf4ef93fd9cf34b1330be7fc07f3e82cecae9e5e718f4ffbb033c47fdbff3d19fc9419341f7f9a010feee8baffaeff1cfe11f131fab9585f71b2431a9b2225203398f105b88b95988978c609a308c4187dd837969303504312b304e4560da69005a835bab017a445877050ef101ac7e800623b04600e31a80fdedbf1b56bd6c120091c0a63547dca63547dda635afbacd6b8eb9cd6b8e8773d2c5ad3f9200f2e88fbe7f987f90ff50003bd7bd9d94fe68cd9734ffa2f48f73fe0b1baeb8850d57ddeef92b6ef7fcd530e72f096092e85f073fc8208ffa39f019dc11f000fbfffee2ab8e0e118175baaf07e2605f808880c9a04404520d643d05683d969ec0431e4f9624d0ad2a0b7e00868792c121910af4a900d9229c74074e310dd0cb42fad28021e5c03e1fa0a51f60d7baf58ed2809ef1e01a014cc300ccebffeb29fa170980c04fe755450027dce6b5440014fd5901d0d82f2b80120170edbf1cfdd3c69f54fe5f0af93f9b7fbb3df8afb8857922009c6bc6b28f7ab34f8be9a723bffc38cdd101fe20f3bd7117c0eda3b7007c22ff016afd56284d080283cff9b19e303cf8838ac88840a405c11bb0480046a6ec69c06461620a8a7661bf05498c10c7aa405a16b4bc00d91720bb03c73303e936a14a6bb0d11494de1f90cf06c872609f0f60f503e85d81a5f1e08686a012014ccb00ccaffc92f25fe6ff14fd37ae8ed17f938ffe50004c000c7e10c078f25f47fff6d2dfde2efaef9ebfe6e8a4edbf5201d45cff7ed36f3462d99f92017d8e3f1fdd7c02698cf82cdb2309400d7830fbb400a04ec18fcfe37bbaa81fc02f8980be46af89b44056166010ca1663ab6188c78dc370937f1be606d02e4c8620ee3490a940830ab0fa02da55409c12b47a02ac6a40ba33f02d579b0d28f900f2f290beb6606b3c389d0b880d410d46602b014cc700e4e86fe7ff5efe1709a024ff4f070590b7feb6caff28fdeba5bfa58bfe75f07b3fe05134f67cd4cf801f22b8cff723e813a01321e0a8eff18f0984115380a808f09a047e5d399024c0e941681bee6609d2fd04592aa05480dd1b304c05c892e00feedcf3d7b7d3a8b0351fa09787ca15e2fe0e81c6a6a0161f20bb48542d0991bb02edb980bc21481a810d9786b41240ab0158cfffebf23f25805afedf2fff63fbaf76ff75dfbf2680850d978cd21f457f29fd5b727f2b1de88bfefde0671570a093e61df88312e840eee57b0ae4920f209501d4028823550d41610465006fa04402a80e50f952f609c89d053215a0aa406708565440a9222077064c9a064d08020c690ab2ca817a5fe0375e3fed6a3e00e6023e3874c8c95d81ad4660e9d2901e23b04400d3370009fc6df9bf610036e5ff79efffa4ee7fdcf1cfa5bf68fee93e8092fc9765c092d1572b0546d9cfe9003e0ea980046288e21901885c5e7ecd7a1f64c2923ffa009a04d81c4445813d089b04c23c82ef5d901386b165b81b75f63d02f93621780158338ed6603928542a09b69a8143aa01e6a210e503e81d01663fc0f193aeb631b86604625b706f4760ffad418b4900a901981200d7ff650990f37f18807df9bf3400fbca7f54fbe7fa7f5ffe2f6bff30ff9804b4022811c024b97f29fa832052f07b1500f91fa4be8cf8c8dbfb405ffaba24034a07381560450163901ecb65c54802f004d098140793542a20f60a582a001d82f002b0625c9a81b4420c33027d6620a701c39a82da7c808baedf07583c23b0d611d850092811405b050037ffae797e7b77f32f5dfc39f7c2829b5b45678f5bb76a8f5bbf6a5f88fe31ffd706602dff8f06a02cff4d9affe7adbf24ff9904b8f987dd7fedfc47f9bf67febadbb3f186dbbbf14632da2bc77c6de75f47fde1e0871a90e69e3400c705be7e9c04bbf410506a8c248052215a8a4343d2e761e438a8004c12a25d1886609f1750ea0ed425c19806c4f900bd2bc0aa06e43709c5fb04a30f904e07fedac5fcee80ef9e8b5788593e409f11386e4760ad125029054e93007638dcfccb04b03b10c0de1e024d080220f77f4c035075ff95ebffdcfd57ceff65e71f08e08a2000aefdc3fdf7c0f7e0bfeec1cfe7a66fe6a1b77be76f89997f2dfdad54a0460032f2e3fbe2e7b4c33f2de0179f07d5842ef2c75221a705681ae21221ba157579503708a52ae0f36e3f02cd09e0dec37c5028ee0bd06940570d305a83dbca811601e872a045006f3b5c27deb72cf4cbe3279d34025b3b026b958057366d727234b8a714681180bd026cd573f36ed5731bddaae7a8677fb593577fb302c80980a2ffba553601a4f27f9a06605ffdbfbffb8f15805dfb2712d8e34f4a00a4043c01ccdf6212d8c824b06fe36db7379c7d1bdf73fb36dd364a7c56c9af2cfd532fe04057de5b74f0c3174848000d430c7e5922ecba04850a405500f30de80d68f102c64903a6e703d4fb01fa8cc0dacd41b58e40ab128096e0da8ab0c6dd00e311c08bcfbd941100457fad00720218b703b0af01a8df00ace5ff56ef7f890038fa830062f42702d813a23f0860dfc65b8a006ebb7d9bde1b400079deafc12f3f5e0a02e8bc0145025daf40f003b8bd78a00ae8d689f59b8174a35277d760d81a44f2bfde1acc1382b849a85c0eacf703f419815000b2210846604b25c06a09d6d786c9d1e0935bb739ba3710958001a5c09c009e7d867afba507b0caad7a76836305b0c99f3201ec74d103d89de4ff6d1580a11d80931a8072f8a73fffe7e85f22008afa2cff230150f4a78f5905901a2002c84d080255808ef656f4d7a980fdf1529080ae34c4d981d88424e707b0a7c0a701c20bc012112c3fd1666077c7804e033e79e0d7856902e82e1411b70cf79703ebfd007d46a05e192ed784d53a027fe4c429f7954225409702afef7fd95dddcbd786d57603d44a812fada681bd0cef36013cf70c0df480041e3f018cdf0158aa005806207c0096ffd100eccfff63f4270260f99f477f063e08c0a7031bef143afef2929f2e013e6e25a07b07600ac207881d82b90ad0cd41bd6980e809b0d2006c0c6af1016a3b02fa8c406b6538f603d42a01a575e1d4123cb414881d81a5e520038782ea0ae0f967d6b9e79f593fa602482b0051018c5b021cb702309e0168f5fedbf9ff4d5f096895ff4400fb49057802902450abf9b745ffae3260d4f01743195019326d314e5b91d329c2b89e0c2aa0db3c2c4b828d69404b391023c2251fa0b6367cdc8ec0daba703d1adc3713e07704569683d050504b2f40a519c8f2006213504a006c00d2f106e0735bdceae7b7ba35cf6feb4a806b2b25404f002f92079013c0b82dc0d6f65fb400d73a0075ffbf1cff8de5bf7cf8272580befc9f25bf25ff3501d0c731a2f745ff3632580cc05b25c22c1d08bd09e80d905e403405b93128ae198fedc14803e47c007605e8a6205ca94ee980dc1968f900e9d6e0b41f005788590d41b58ec07fe06f11b62b01b5d1609402f58ec0d2f5e17457406928c8ba3a1c5b821b6e0b2a4d080213c0f3cfccb9a104b0183d00834780e504e0fab800a46dfe5fd6ff2501f0f0cf44f9bf21ffa1003c216c92e9401bc86b69007d6d2948a0440a5e1d7c810ec1b634802e2b6df101d0156819819406d48cc0da6050420037522350ce04e84b436aa3c1a552a0b5239086826a4b42f5d5e1980a9ca019c82680e79f59eb4a04f0e2739b9502b09a80d003d0d70454ea01187707805d021cb70220fbff3501c8fabf97ffa60108f3cfceffc903d8bf890f11009dfd9bee4e550d2c360974fb074497a06c0eaaa70171c371c907c06c40a91fa06604da4b42fa2b01bf7be396fbfe75ab12502e05febd0b175da91458ba38d45a125abb2c44af072bdd1a6cdd13506806b23d803602d81a5200bb07a0ad0b3027807187806a2bc06c0228afff1adb000cf57fbbfcc706a025ff9900e86b4c00fb3d31dc556430be2a586c12403312da85d1a22cd300220aab1a207d80beaec06a5b7028055a46607a6f405c165a9f0c2c97024bd786d57a01be75fa8cb37a014acd40b5b1e0b717d25b83b11f10dd80532580179ed9104c40f600a202682180a568021ab707a054021cb70220cb7f76fd9faa001601c4e81f09006a0044902a83e164b02424209788740b4ab05d58a5018501215202d207d0578d930f306e25a0dc126c97026b9b824bbd00faae003915586a062a8d05d7f603ca6ec06441e8a6cdceea061c5b013001c42ec0ae07e0b93a012c5d1760894d080200869400650fc05210c09dae0280fc9f011fcec6bb5d3a2009c07f7da34c118611c1629140290d8012e049c18a0f202e156921003f1790dc1d90ef07901789fa8b438cfb03654b70693740eddec07fe84dc0775dd70b10a6024bebc1dabb010f3b3403dd3a70c0e1c2506a06c25e80723bb04d00dbd634f601a0fe0f0fa04600a8002c6e1bf0b85d808b4100ba05b85402ecab00940880643f83dc5200d350038b4502693580cb815840caabcae2b6623d21c869006f09d204801b866b95003f1aac26032d02a04a406d45d8bfbaf99eb37a014acd402502a066a0523760692f40da0edc4f00be1d78c72e97b7034f89006423907d1518b601af5de4398012018cdb05d8df04141780c62520c37a00ca1d809c02b41240f4025225c0fec0b869c16293805e4a9a1b81b8bb30de33282f13b106838612005502e4a521a400500a2c35039508804a81bf75e59ab3ee0cb414c03804f0e8d5e38ef6035a17865a0aa04c002f9929c06005d04a00531904aa6e025e8e0470c3dd7af3dbdef9b79b80ca0480d25f2c01a61500280006381340aa066c52e82b092ef600119a82722350af15e786a0645760e809c0a6a0d264e00f8b7b0273059011c0bd7e02f8fd5bb6029826015033d0d07980e24090a9005e72745760e344a055066cdb05401381a311e5155350002502a86e029a9202083700c53d00610a50ed01900ae0d6999ff30470ebccb7dded334d08023f6f74012a0228f4005825c07e0288d1df52054388609a4a602801e0e6e26c5558d60b104783a74500d40bf06feebcef86ec0518aa00682f406933d01345008baa00961901dc78e367dccd377fd66902b875e6e7bb21a0f7ce7ec7d149868096900086a4053302b8e7743b70691e604600fe5af017fd2e00de0710db8027360197790a70e38d9f7604fe1a01dc3ef30beebdb3740c021053808b95028cab06a645024315c02c0578cd5913819607b0ac520059067cbc558029a500d93d803105b8fec64f3906bf228037d31480148027004f024c0077fcdbefba3be7beebee9efb457f621f806d02de3bffcbeede5bbfe2de3fff2bdddb92f9d7faf99694605a24202704711559ba25086bc2662620cd03b412c0b23201970f01e032d0c5e903b876fa5beefae9e104701b0470eebb0901dc092470f7fc2f9955000f7e017c4f046f7dcfdd7beb7bfe6d2be027a9161bf47a2c00002000494441544c8b08b0346456063ce7f45290155d064c96818cd908f4cac25beed0c285ee4250bd0f70782bf0f409e0eae96f39104054019402fc2c7b006ffe9cbb4926e09b6c024a05d04700770c0240e49704f0be2280f7cf3319508fc0b864d0a706c625805923d03bee572f5c74df7b921a81741910fb00276d053eb86ba908205e07de3f0b103b01afbefe4d97118057022502a06a404c014000ef9dfbaebb23520028002280bbe77fb93b1cf959fa134d08020110f0631a101500a98095a2047021a96c00ca3a0167adc05d0ab0ac5a81d375605412e45b81c62380741af0e0cef3ae95004ebe7ccb9d3a703bb911b87623d0b48681aebefe930502601f205700b11c481e804500e403b017f04b2e238073bfc404105280480001fc9214822a1857010c691e1aac06c4dd01b361a0d80988598015330c341ad9b702e504808520c3c681410087162ebac3bb2fb923bbdf35ee043cee4000a70ebcd75d08cab7020fbf1178c838b02780d7bfe9ae9dfea6f7007c0a70faa7dccd6004de7c934920a6009c06dc3ecb2ae0b6af04fc82930a2012009b81e40310e0490944f08bf7a511287c00a401f4761235d0970a0cd925301b07e6598027661cb88f006a1b815a16825804f0eadecb6ed39aa3eed8be6beef8beebeec4fe1b0901bc76f0ae7bede0bd702d788d00cea657828fb9100404e07d800201e85e0010802c05269580f301fc8100480d6802e08f430ae0a37d6a04220de0b7fcb57189609a2460cd01cc16827023d08a5c08626f059e7c25d8c19de7dcc19d6fb95716de76ac00def10a8008e0d5bd5732023879e0b62305901300df0ab4582bc12c024029100ac06a06ca4a81854a804f03320260e0a73e409a062404105480fcdc90d4a08500fa9440727d58b83acc92ffc8ff672bc1de703ffeda69b7cc5782e98b41c6dd0a6c2f05b508e0e85e26015200c78402e808e0c01daf004ebff2be7be3954d08020fdcd6b543ae051bbe14948d404a03820228f402f83420b403d78dc0ef78e9cf46a0e10358a94048036c1510d541aa0a86950b5b49a04404b3a5a0f94ec0276029e8b408c0be17808c402e054605d011c0deab9e049002a40470d79d3e78cf13c01baf7ce8de3cf4917bf3d0c7eecce14fdcb6b9699402e35af0f12a01c10bf07e003703f5f900561a50aa0650735027fb8de8bfd84aa04802dd1290f44e80d95af0735d0ab0a2d6828f464b450017dce1858b3e05c8088054c0cb375d24004e038800a00224019c3dc224905702fa6e06b6b702952a01b911481d8164fea54660d107e854c02f723520a4013ef74faa01b1342881cf4d41f00838ff2f9dd67460880ab048a09bfefba2bc127c7631c819f7add3e90dc1cbf662909c005e10f702602dd8f857834505c004409580a37b420a107c80132080500a7c2df800af270470df6d9d7bc39d39fcb12b13405f2f00ed06b8e44a57835125608811384e1ac0d5005515287901b222208dc08222585412985d0d666e03aaed0218671498ee05b8b67fbf5bb2abc12c02e03e00632d98b81760e8401075036a028011e809a05009880ae0be4f038800d80ca434e0acc3bd00dbd711f82301c4db81875f0e5a9b0990e540f603782660681a5055015d59f07b614e4046fe580d18d70f18ac026697833abd0de809be1cd46a060a0aa0a71d983703db8b412501d42a01d40c242b012080375e49094d0802e0ecd14f03016812d077035c703bd71309c8cd40f6f5e0764760b92148f603f4a701d10c942aa0d619c8f29f49409601d3f7d3b460d154c0ec7af0e2a520cbf17af0cd2f36ef04a42521e5a520e5cdc0dbd5edc00bae6f35f838a5404d003002390d20f05b04c02490360459abc1644b301a827828a8b51fa0af2dd86a0aaa7b01ba3d3844fc8c04007c9a261cde2730540560ed97dcfda78d3f2efb85ed3fe252d071ae06f78b403f79e0feeb279fb9d285207f76ff63473704d32ab03ffde0beebbf18f4aec3ad407df702fee665ba13e08afb47972ebb5f7fe7b22bdf0af4966bb91548df09409782d09d001f1e3aecac95e0fa4e00ec03d42bc1076c04a6cb42ad8d40f439bb1b90538109af075b15af072b5702620a6055029804d24ac0f84620fb00bbd458b0ec086c2a07fac1a058168cfb017844588f07a725c1425f806811f6d5019f0a506f4024014c0be26b891a18d031d84f00e99565dce883c59fbcf493b6fcd0dbd1e8657f0700eafe04787d21e8dfc8fb001f7eeefeeac1e7ee2f1f3c727ff9d92347fbfffc3af09e4b41f522d0feabc1d32bc1fee0f6643703f3c5a0175ded6250be14243500bf4637039f38e9be387ec26117e038d782d142d0096e051a8f006829c8b4ae08f7694068068a95006e084a8dc0f75cc908840fd062040ef101ae8496e0ae1f40a800dd1474b3b21fa0c50b280e087543426260489000d20154074d0802b407908c1227538472afa0be8da875d5f8cb61eb2f839f0924bdd6dcbbff8fbed25d09de5d02f290ef02ecbb08c45a0156bb161c9b80fb2e05fdc17bf7dcbfbe7dd78100ac3b014bebc04bf701fccaf90b0e5783975681254d4085abc1a1006e572e063db76b976bbd1874c7dc9c2bdc09502380bc142837038f4700fb5cbc21f880dbb0faa01f0bae5602061881678e7ce22c1fa0764968ea03a01ac069c0d5d77ec2b59603f3ae40d913103705d92a20ce0724a9806c0ef255014d02480d58fa9b24205281eed6a1b04db87f8390bea4541243fc1a22bf063f0801370167bbff0209e8bb007115d80f45f4d7f29f6e06f6abc0d56d4051fe7f3448fe0fbd1474a801f8cdd36fb8d21e00bd0df8834387dcdd83871c08802a0057f7ee77742fe085853dee6d5a07be332780239b7919e881f94d6efffcbcf31783cead73959b818710c00bdd5420d2005a0ce257832d5225a0361360fa008100ce1dfdcc9d3bfac09d7ff5a1980b18d20fc0866047006130c84e03acfd00e51d01ba3128760786be00dd222c7b034a24e0670742fedfbd1f2b034817a667065ac490467e02bf97fd5e01f0ea6f92fc7c1b70bc0998ee01f8eb075f78f94fb7015bb700f9ebc03e79d07b1148bffce745a0f5ebc06eb971af05d737025933007a1968690c180460ad024b0960bb3bb9759b3bbe658b0301bc3cbfb123809d73736edbdab5eea5d5a60138840062254d0802809540dc0d88edc0a5e5a0438c404e03380528b704973b02290d2015402470fed5079e00de3af62829074a23f09d935f73974efea8e3ebc2531f800820a6016a4188311d5853014945a0db13f01d3f222c578621154826054d1210c6604809ba0a41a812102968550012c05564f242d2fe51e19222c8c14f6a00797fb2fb4f497f023e9180bc0a9c48a016fd4b97816617818835e0b51b81d3bb00caf7016a0390f3ff771af2ff78272066004a06e0fd8201d8762350611df8521100ad08271258fbc20eb7f6855d6eee05aa02e495803c0da8b404173a027543107c00a40120005601a57e800b0e0470e9d4d703015c72974ffdb8bb42e7b56f2ca20a48f705964920ec0ae821012c104179b053048a0cc653017da980fe3a1302801ff3fe2fbbbc5fdefe43c65f29fa93f49f34fad76e02a27b00faf3fff28dc0720b10f2ff9f3f9bae015b4c03b0a5024017826c7e9116f99a867fa90a50af04580a0077048c46736eed0b3b5d1c0db6670236bcc83ec0fcea579a3b02ad7e80370fc57e004900ad698056014400974f7da323809a19a85b835315102a02614f805401b55400fb02302a8c2e41b3559824fff95feeda832311c496e1a804303a2cee2094f7110a6fc0cee7b5076047fef4b14c04f2d61f803f93fe480128f7ffeca1eb2e016d28fd8d6bfed56e02faed2bd7dd3ff3b701d90440d1bfb40340ef01eceb00d415809a01487702924d080201787afbc415805a0a4004503702b11e3c5e10c29784f099ebcedc2a268052439045002da3c1d107c8cb813a0da875058200de3df575f7eec91ff30a0004505501ddc2507b55983d25280c41b1320c0a00a5c19c04f4e290600a76be8041049826242330f40c58921f370fc9b4a05c1204e8eda8afc14f1f23ffc7ad3f3aefa7bbff3ae3cfcb7f067f62fc75b5fff4125032fdeab9ff07ae26fffba3ff35f74f8dfa3fe4bf26805afddfba0c24bd0ff0487721e85003f0e8e62deef07003702801a44660aa0208fc3901701ab03b3404d91d81a40236ae3e9497031b7c00ab2dd84a03c80778ebd8e76ec73abb2b907c004a038800def5044069405401e809b04a82990a481686aa2121d9229cf406b01f70f77c1c19b648a0b641a8db2aac1441ec1fe075e37ea968f5dc0925bd96882f4b7f521144a2e8eafd8ff8f24f36fc62cd5f1b7f14fdc9f8d35780979c7f1dfd65f3cf1fdffbd095ee016c93ffd7dc6fbc7bd5fd934b579c59fe7bfb82a3f2df9011609dffd37d80d40044f93fdd085cbb12dcdf07d85500ea062055007a0cc0a104d06f046a05d0ea037815d0d40f60b705f7a501e75f650278fbd8171d09c00c7ce7e48f745e80a5026435205b1492ec09e08a807d73d0b7bb9561940aa4bd01f0036c12e87a04e4e460657a301241540598202432e8ae204fe4bf4c0b70e9a88cf635e75fab02fd38fe58835fe6fd5dd34f90febaec4d0802371aed73a3d1deeefcc7fb9f38dff5173afffef4838f7ce71fae01c725a0ede65fddfd2f1180d5ff6fc9ffd21210027fad01e8dabefdaeaf03f058520198777bd7cfbb85f5eb1dd5ff1f030140050cf7014805d08a704c065a6940792ea09e0690190815402470e1f897eec2f1afb88b27beea2e9e880430a90ac89786d2caf0b42ca86f10623f209a82a912e01e012681747cb85303c66a31027a540bbc6508a76e04462228fb0036c0d34620fd3dfb9dacf777e01779bf96fe0c7a9c087e900111c0b8d17f34dad560fe0d93ffe8ffa725a0dcfd17ddffda5d8043f3ff333b76fa2bc16b1d801d01d40dc03e05308911b8d634024b3e00d20090805c11d6570eec4b0360064a15f0b627802fddc5134c024d2a008d41c5be000c09c5fb03f5e2d0f406a1788b504a02410988dd010909d0f870a706c45e41b55d3859361ada88e973ba04687ffc5e4f1ad016f547a3fda23bf065dfeaabc12faffd46cd3f057f1afd4100a5dcbf2ffa13f871fee58ddbeefbd7c78bfefdedbf9100be7eea35f7b593a79c25ffadabc03002dcd20044f9ff914d9bddc18da201681d2b804a0720aa02b52a409f11a8fb01521f80ca81b21260f703c4b9004a0340001b571fe11561d810a4f603d4a603fd7010f503a89e8069a8805a5f40bc3ecc4805c29c407e89480b09c4abc5b41a40bf805707a50dc3eaf32d044069423da2cb94a0a40852f093a290e0ffe14d0802670fd9fc0ba69fccfbfba23fa503e8fa1b8df6b0f41775ff69e4fe30fffe71eff04f5c012ee57f5ff9efc1d1638e0680ee1f3e920d0049133da6d58c2f6e01cef37f7400c6413e32f1e954313e94005a7c009906b4f703a40470b8b828745a69c0501550ac08189382692a20ef11b44cc11209c426216e188a5b85bb9420a8814804c6aa71b56968ffa6f70c1f803e979e980294bc8012f0e9f339f8e9733ed77f40c33e11fc89e9174a7e35e92fbd0002bf9efafbe37b75e7bf54fa2bf5fecbe9bf92fb5f1bff1d22ff47a3f56e345a9754d19800105cf9625ed4ff75fe9f4ef12e0b02c8fb01fad380c3de0be84f03784d584b539099060cf002ecbe00ea0eb41687aa54405405a21f204cc1ee2e01b94790a607990064b7602401f203843780b4401885f2f621ad0ef66d8cb93ebd6f9d9c002cc73fcff54be0e7cfefcfc05f2af9a540270f40a7027b1c11001d19fdd9f8e3b6df3fbc935fffad4b7fb5d6dfa2fb1fae0093cd3fb515e0d401d827ff19fc7462099ddfcf0940e7ffdc9dab47f8a7420093fa00e3a701f5e9c0d292906166608b0a8865c1bc3bb03629c82a40df24244dc194049246212a11863e01be6158fa02520d4422d0aa807c02ad0c400a7c4579fdc45e805aa4975fb3a23ed40083dfb7f906d98f661f38fe54f6a3521f66fd5302d0e027428804c0efef76b2ebef07d4f7afa6fe74f4fffef572ebef68b43d99fdef8b4d0802fe43dc7fc87f2aff8d461b02f02d02405f4daa00b8f7e64547f97f1cd2930440e3fcbdf2bfc504b47c805a3f00fd60693f40edb210dd162cd3805a35a0bc23e00337a424d85b1138f5635973902f0b5a86a0312ecc9789e6a66049092425c26eab70490de444005510c940dc4348ea209c52d4e7cf33319453002bea5b24c1a0d78772fe0cfc1fa7e0a749bf48006de02702a0f34777c3ccff98d19f803f69edff274ff3feff16f91f237f49fe4301b0fc07f823f029fa132625013445ff710960980f403246b705f7a701a12488fb02c635030ff79b813515502b0b7686a0aa0ae8cd417d24208d419408b94f2078034803cec6ebc6d3b4808940a707be9128a40944082005caf575f4d7f9bfff9e4db77b48a014f1d3a81f09605f62f875917f8ae0671258e8a4bf9cf9b773ff9b4ee7fe44003afaffdac54b7ef0a7a5f5d732ff4af2bf1efd6df96f13c058f2bf9500264b033401e86a4055057404209684841d0193ab80d81c64f505d82dc2e9a090ae0a2423c3626210d78aa34988cb8348078c3e01ed0b2835c06941ea0ff068b12603be880464406f09d8fd8708c0520188e835e73f8dfa7ebbcfa786db4f23be4af6f7477e5bfa23fa83008804007eacfc2ab5fdfef3ab371cfafe017e7adbd2f987d65f5c004afbff69f69f7aff6bcd3f0c7c2dfd75fe5f97ffa902184bfe0f21003d17b0346900cc40dc1b68f704c4abc36afb02e57c4d08020095046b7d01667350cf9c40e6075097604202b854f4671d0d0da14780d3014102181ea2edc2b26b30b96c84d3824804f96831b71583245821d02160f71f26094e03fa405f8af8c1f41392bf2bf561c047eff70b4b3e72c30f8d4079de6f819f0880cf2e472dbfd5a19fabd7dd6f5db9e646a31d3ef2e3d4f6fe0d31ffe4feffd1683e00df2200cbfd5f54f93f09010c4b03ace9c05a1aa07b0236ad39e28ec93b03cc4d41fae290da94202f0cb1bb03f3e6209d0ac8aa40d22a8caa00fc808c04842720ab03499f403407e35d83681fce4b86be5a502003bd6f60dfc6dbae3b5002f273c9fb2d3e809de7336970179fccf731daeb177b2af0d39c3f6df89926f8890000fedfbb71dbfdee8d5bce32fe68eaaf35faebc51fadd17f34daa8c05f33ff9644fe0f2580f2a2d0fa78307505d6ab01b534409704e5a6207d7390bc3f106bc3e5d660a8805a77a06e11d6a9407958285e2bee53816612087d02e29ec1ce17c095e3677e3edc356013013a092519e83481c860efc6db838e6d04d6401f810fe5c0dd7d71b887c04f525f6ef625f0ff7958ef9597ffda65bf8cfce8f64ba5bfddf5d71afde5de3f9afb2f95feb4f9c7e0af45ff69cbffa60ac0100218b71ac01581b824048d417247007605ee77d811a05b83cd92e0982a40a70252056843304b059291e1821f204dc14612882981f60568a7005d3d46e717fc5bba74c44c0d824fe0c920cc4d0802178010a01088148691c02d9506f4477c8ee0f1fbfc549fcaf719fc34da1bc77bfffcfea7eecfc2908f6ef6494b7eecf6f7497f1040beee3b35fe32f05fba9c5dfa81b6dfa1d19fcc3f06ff6245ffb1ddffd65660d929a87d80f6348009607c15d05612ecf702ac8521ec055886602515907e80d81e6456068a2410fb045273900c42ac178737a089806f1f021174d385f009845f4084d09142470cdf717b37de4a4e921ea8b4c02ae749773f76ee19c0ff38ecf2cf247f58eaa9167bd6c1cff5fe56f03309eccca4bf34fe68e1c734737f19fd23f89722fa131e9bcb7fe312405f1a207705c6d980fcdab0d2aa305b05142f10d52ac05f235ef1020a6541cb104c5381f2c4a05e1ed24202716e809689087390d68b170c424e0b0a44502403e119687238fb9de8077480bfe5f66de42309c2260039ad972a039feb2ba32fb9cc031b7d3ffad4f1686f3adecb24a00dbfe1e08f797f2efdc9f8fbcdcb3cf12709406ffc4d877e62dfbfccfd75e96f34da24227f5ff4af997f842159fb277c51dd1fc772ff9be5ffd01460fc3420ee0a6c690da601a1b82e8c9785c40b44cbdb82faba03f91ec15405f0f2506d08965281921f308404d027c024c06dc3b257c0ab016510ca4a4142049d4740e98148113a4260cf401e7f6db93a5a0df0c73793934fe8d9e9001679d8461f4b7eacf3b6c0cfb7fa7c6476fa0d8bfc1cfde3b45f5ef3c7baaf4800dbfc4d08028d3fb5ae3f2bf71f8d363b063d0e64bf95fb4fcbfc9b58fe4f8300dad2007b6370ffc250e905a42aa0bf2f40ce08b41b823a158823c3891f70f2471d9687c014ac91004a84e8139024808d424c04153510d2823a19c02b00218454215c58ead386400edc6814ce995fc800bf77fe969347e7f6a92a886a40029fa27eb7c947447dcaf709fc34d127177b10f8e9520f1af0a9e7fd28f3c9b771cc17d29f0880ceef5c63f06be94f1d7fb4ed970980c14f4d3f7f1f37fe849e7f6cfc41dd7f34a2165c5a8b4fc0d7e0d7d17fdcd29f8cfedcfa5b8efe63c9ff7108a0af29a8b4327c9bd818dcaa020e764b434bcb42d01770e2e59bee64b84a5c8f0a17f70518e3c24805b03d283608197e4033097075202101e50bf4a981242df04d44d2238897902045f0c621a903af10725260b5108f06fbdef918fdf76cbce9e8f4a7014c021ef4dee44b8d3e2bea63a907467b017ebfd6ebde87ee4fdeffd0d1749f8cfc34e413ddfe58ef9773fe007e7cbba303bf94fe047e3fee6b187fb5aebf14fc8f23faebe19fe6de7f3d1edc370e6c7d7d9819282f0ec9cdc0612ac06f0c6aea0eb40c410c0ad55381b21f301e09f03e41908098200c24505603b16700690113816822aa9001033ffa06440aa50390db6f6fb83d1bf9c8fa7e9e12300198c00f465f29eaf34a2f8efcd8e987c51e18ef2512e08b3d78c84797fc50ef2f823f34fc50de6f6dfab5a4bf554d0802f663f03f11d17f5c05d04700a90a589d5c218e7b035a5540ea051001e4a3c2fa1ec1e0051886607f2a50f603a229986e10a285a2663a20ef1610c34372afa0d52f406a204d0b522248c9e0dbb1a3905a8b459a105385d8690852c05b00db7aab3d80bd9e00a4f167bdcf1d7b5d9e2f800fa34f477db9cf4f839fa6fbb0d7af06fe18fd59f2cbc82f7bfde59a6feba6df4efa27cb3ea3f1974bff6947ff96cebfb1477fade520e32880763370f5732f397fc4f561e394044b7d01430c419d0ad41b84d22e419882939280ac10704a10f609483510ba07cb44a07c82ae72c0caa06b31863a906fc3edc59c2a7c3bcffb37de7004f4d2b10940eeeb4b77f749934fe6fa24f909f890fcd8e84392bf5be9a5c04fb3fd56e42f811f79ff6f5fbddef5fa53e4d76bbeb5ebafa53f811ec6dfb0e88f76df69f7fd4fc5fc1ba70c38ac27405f20ca24b07d9817e0af12afa900b536ac3028947608522aa0da848d7b05757fc0782410d78b63a31093409e124835d0a505e1ee016d14ca5d03d844dc29834008f00d400a1631d4c04e5f8bcae0badbb3f17a6149a72680749127804f0b3ce5e59d9e00de0f925fe4fb24f9b1d28b467bb1d823cdfb73c30ffbfd64ab6f6afac5259f58f441c6dfaf5dcc5d7fb9ea9b08803afe2633fe5a9cff7cf1071b7f8b62fe4d4a009619180784563db7315c21be9915c0735b7a54405b5f406d5f40d1100ca940b92a104d08024b83f6c050ac0c0c2281ae59c8b86844a504574f476f2023824c11a074c855834806511998a4e0af300fe7cccf097013d019e0c999bfeef6a863b7e98200ac0dbe7bfde65e0d7cacf02ee5fbb4d10773fd7d919f6afd35f0a7a65fdcf14fc33e4400f16c75df0baeff68b4d57df7dcdb01f4e4f86bd7bfcff9af45ffd6babfe5fcebe83fb6f9370d02287b01ab9e9bf70430a90a28cf081c725659309f1350bd0107efb9522a50ea0fd095811612e88687c44523be4ca87c81440d7495024e0b8a4490a8024d063fab082127050deaf2c7d7dc9e79794801d4a3bd4510a8eb4bb98f355eb6e4c72dbe71a5178df662ba4fbbfd1afcbf732d96fb007e69fac91d7f14fd9900b6aa03d04bf08f6bfc8d1bfd17adf427bd80713d00f80076672013c0a42a40cd08bc989605b3e620b934244b05acaa40dc1e64fb01b149680809c80b477373304f09e22dc4212de821029f1e40150832b0d20428046a3462a06b50e720d784b07bfe9ac3296feb2df9007b923c9f223eeafbd2e5d7921f4eff1f8a955e34d72fc14f91df72fca9b79ff27e0d7e69faa5797fbae883c9c02200d4fc2731fe2689fea5d2dfa0cebf699401fbbd8055cf6ee808205101cd15813d6efd2a2600ad0270a128f5064815905c2b6ead11375381e807944d41ae0cd44920bd64c424019d120435d06d1bd6694189088461989141775f2157129814582548208ffb7e3d059024104d0802db7829cfef72fdf73ff4357dcef33ff03bfcb0c4534b7e02ff1fdcbeebfee0f61d87a51e72b49722bf76fc79b06787077fc9f107f865b79f94fec3c03fa4e9a7b4f0d372fe9724fa8f5b06d40490ab0026004b05a415017b46a07099a86108920ae84d056483500f09f85661352fc0a3c3434940cc0ec87b079394a0e60d08a3d01341ea1174e9812203931088144effd4040470d5ed9ee7d34f0079ffbe8cfa68e889abbb39d747890f5b7c799b0f83fff76fd1894b3d647f3f197e4c020c7c1c13fca2d907e097d77b53b79f0dfe6949ff6517fda741005649f079f7fc33eb5d2401e505742aa0dc1d68af0d4b0785ec5b856b5501e907a40343b13f203409f59240c918944a8049a0a4069216e2701169a2065efb09977b04df0a1d85d12748fc028310881400e0c9de52cbac25f5ada19dfae61eb9ba9be43e8c3e2df9017e3fd37ff3b6cb877b880052f0d3c759b92f801fadbeb4dfcf833fd4fb69cc7732f0f70dfcb4adfb8efbfe16d5f99f960700254039c8e42a60ed0bb42b20dd1720b70659a9c0a1858bf152d13defaabb04428390f203925661610a6624a06e17ca95804502727620de3bd89100d440d8361c4920a8014104920c2211089f20510639214895b07bfe8a8b2746f49410e4f7d0fb57dd823c1ba0005a009f4fee519e2fe57ed7d813b6f7caa82f253fc04f929f37fa60b28ffbfb7302d8ded5fa659b6fd6e74fe07feb4d080282c38cff74a5ff348dbf45c9fda75105a87b01c35580dc17a0cb82d2108cbd0187162eb8c39204429b70c90f286d10ca77098a76e1a447401b838204ba8b4670f1e8386aa04e04a961989301a50ab1c128361a2d6cb8ea869f2b6e61433cbb3790026801bfb5b083d675e7729f1a7b4a515fe7fb58e7858b3ce4704f2401dee9a77bfc35f865b30ff6fbd1a04f240129fbfb4a7e7ad847835f4bffbe755f4b16fda79502d815819400b822a0cb826b9ee734a0342edc920a4412a8fb01d9c0d081b4325024812c1d9024103b06314094960941023535f0757ff780b963356500001cc8494441543fa7880070bee164e99014814e11a8a1a8a40e08b0d4764c6fe591a0d600d7dfab3f2e13800d7a3dc463cbfddce8b3243f1a7ca8cc87f65edae66b2df4f4a53e25fbd1e66b811f577bc57a7f6bde3faef4b79a7e86d4fd2772fea79d02c85420dd4f6e91c08b680f56cd419921f802a980dc102c55055809c8bd01e407f0d870d21f609882e8141c420271af60ad42d0a006bab4a04404421588ca414606a18a200961f786cb8e4f4a02fd1fe371fc76219c4800fd808fe0e789bd3ccf97c0cf8d3e4bf27735fea4bd375de829577a9722bfecf403f8b9db6fc8a04f79d67fdd2a524a7dae7fdfb8ef547bfe4b97844ed207a01f9b7a01cf3fb3ce9b812f3cb3211882860ae8350417dc9eadafb97ddb5e0f6541910a88aa0095068b7e80d51f304d08022109a4cb456585204d09ea6a409984161164aaa04c06162100b893bd7dd72d6ca08699e1a047fb6e2af56de05b51df9ce70f357e76fad38d3e2d913f823f0ef960b9677dccb7afe417a53f29d7fc92cf9af47f2cd17f9a2940ae029e7f66ce8104869605b1467cf7d6136ecfd6939e048855d3de00aa0aa4b302a402ccfe80299000fa04d031d84702794aa0d500d2820a118425a4480fd21481c980d384d8658854016f09bcd338fd04602de95810397e3ff075d447894fe6fbb2c6cf833ddcde8b0e3faaf3f747fe1cfc3ff3e65947177b8cb7e4a3ef920f80bf55fa2f49f45f0c028865c1e79f59eb6c12d065c1744e204d0576392281980a5824c0c342b2414892c0a6d5475c3405adca403a3e6ca7033c3c949040d11c444a505203038840aa02540e0cbf6061fdbb0e07a4006260f05f12a74408f5efb109c006bd1cdc499b79a2d497115f029f727d36fac4169f20f965771fa6fa34f8a9bd576ef541ceaf23bf5ced350cfc8b91f72fa9f1b7581e405401cf3eb3da3de709800ea7025a05d87302b237405705dafd006c10e2fd01440097272401dd311806881409944a859d1a38f6858b69413f1124e5c3840c845f70f2c7dcaef597c4795718893fde11832409ff3e9481200ffd3dbbd6bfeb70f22d3c7de0df25baf886011f461fa6f962d48fcb3cc8e9c7541f0df6e80e3faaf3f7813f5dec79c6d1a59ef25a2fbad63b6ef62dadf74d08021eeafa2f8bdc7fda65c0d40f6002581308609c54c05e1c925605fa5b85b140646c1248fa040c121015829812a4550239563c9c08627a20c960d7fa771c1d3f7474eaebfefd94042ef9aa82fedc241fb711403aa62bbbf85a227e02fc62d4e73d7ec8f7e3155e71acb76bf209757edee9c7b21f91bf06feaf9f7acdd9e0ef2bf9ad08e36fb115402c0b6a15503704ed544037085924b061d57eb7419982e9f5620d4a20310645893021013940544f09523550480b7a1581f4097ec4ed5c7f519c77dcce40042004fbad540743de6792c12913809ecd4f3fae01bf4feec3e8c3341fa27e9eefbf1b16798a0ebf007ed4f9a5dbdf077eb9ddf7cbe3b8dc6331c0afa57f69dc776a65bf690f03d5aa08cf3a5202652fa0b52a205281a434583705534f805789619f60d1133049e0ae4b77097ce0b86b50fa02694a20d540535a6010016f1f8a7d043bd75f707c2409e8f75b492105779d40f839ed71dc3af8e1e25b393ef27c1df5b5dc87d1279b7ba4e48ff93e4ff561b0873afc2cf053be8f9cff5ba753d98fc8ffb513a7dc574e9c7404fecf8f1d37aef59ad4f4b35cff2533fe9642013031a45ec0b452815a7f409817c8b6081df204d0e4090812886dc3910462af804c09e20c81af12046fc0ae14a46a80d282726ac03ec1ce756f8773c1ed5c07226821845c311098eb2727987406bf0ff4bc8f1f07edbb32da13e84b725f96f7b0b6bb33fa924d0802e69e54f26bf093e4ffeeb9b7bceca7321f4a7d25f0e3461f023f5de9f59541e02f75fb2d3bd77f291540de21d8d61b504a05e422d1d82a9ccf0b8004f2ca0048a04509a06dd893409822f415029512c81902ae12f044615e2efccc95d302ae18244470ec0bb763dd5b6ec7bab7b3532784a1c4505314f4357ebe3a09e8659cf1630d7c2ae975653d91e74bb99f95f7a8b32f187d69892f95fcd2e927f0638fffb8e07ff42a457fbddda7d5f4ab81ffb14bffc5350129fac7133707d57a03ecbd016815e6bb05f535e3f003869280bd47209608d136cc2490970991128ca7062c22b0550113803c391910414442a0f7834ac89482560e0d1f87e7cac15f06bc5ed241e5bc2cdaf7003fc9f58da82fdb7abde4af987d3f7786257f8bec97919fc0fff0e831f7d9d1638a04c8e893876afcf210f04be05f36d27fa909607212c036e11653306917569b8470d5584602a159086dc33609c01cbcebf27e017803640ec220146a204b0b2411a09b501201ab821debce87a3c9c056075231a4c4a089a2ff637aae7ceb4e2bf8794cd78af6b53c5fcafd5ad497253e9defc3e907f87ffa8d33bec987eef093a53e99f32f3ff02f9af1b7741e40aa02f4c8707aad58be428c978794578ac7d1e1def2a04102663a204980b60a619458fb02464a505203595a6012412483ed73e7c206a2876efbba736efbbaf3dda9930108c25609562ad1f2b9610490cfe6634d08022d770a7aaee74b83af0c7ccef593a81f4679b5e4b79c7e0dfe6fbc7edafdf86ba75d0bf83f3972d47d74f86850004323ff38f57e2cf95c12f02f562760a932602d118d9b84f9deb317d3894175a7409c1acc2b034348409708134f200c10f92dc38a04ec94a0a6065029a82b029885dbe7ce3a3ee7e2f124204f240422872229acb714c3b0cfe93bf64a2bb8aca51cf97aae08fa56e04b875f37f650d4b7eafb32df27f093d3ffcdd36ff8c84fc0a743357e3a70fb61f849d90ff0df3f7444497eabd6dfd2eadb97f78f7dbf5f69d0a7e5f3d31c066a79aeb65b85523f409b8268121a9f04ac1221350b51dbf0a63547ba29429a2404095829813608736f40970c23116c9b7bd3f139d3550de8fd6d1d09186440c4d043082929540822f317400ef131f2869d1ac86b5fc3555c12f43ac74fa5be6ce56593af73f893cb3aa3cbaf25bfccf709fce8ee93e0ff1155ea2b81ffc34387ddbd570e0912d0397f1ff8975ddeff385280daf6207dc370bc5aac3c3a6c740a861e81b212484b847a760029014860d39aa36ed39a57c339e636afa1735c9c936ef39a93eea5b5744eb92ddd79cd6d59fb9a5f3fbe75ed6b6eebdad7fd91bd035be7de705b3b0278d3570ce83001c873760c420049a44a41a612adef8f0bfa78dd362de7e0811d809eb6f4c82ebe38bc5300be90fb31d7e7ae3ee9f2a3b9274afeb4c6df95f94e9e7243c17fe7c02b85f1de694d0802817fc9a5ff529a80f5b1e1d1083b0408f8f2e87420f5033034945406a644025e0daca16391802482139e04367b1238294880088189800e11c11baf901a6045b075ed1b7c0211483290caa09f0c54ba504d1d2cf550ffdc3002e06d3cfa506eaff3fba688af800fb98fdabe15f521f9b5d9276bfc1efcc763938f8efcf70f1f71f70f1d761f1c3ae423ff130cfea5f600fad6896b3f6055be4548ed0f189f04e218714909c894a05f0db41101ab0256047c021108328804801481d384923ac85306a40e157290445178bf0e7e1bec1601604187043dd7f2a5b927a47e23f029d7b7a2be96fcd2ec03f8bf387ec23d3a76dc11f81f84521fe5fc16f86f1f38a8ca7c4801c629f7e956dfc792f73fce14603c1278f1b9cd2ea603535202c5d901d93578b8f305fad500a507a5b420570429119ceec8804a883a454849c122833c6d2062a89383248afc7d3cbe04eab6cff3d55b5ae64757df063eb9fb35b92f6bfba5121fa23e997d04fca4cc17c04f357e3a35f0df7af98041004f04f81fa7024097609b2948d501220179dbb02c0fb62801b359489140bf1aa09460585a90fa036522e0f480db8bd31481fd023b4d8846a2ad12fac8a2edeb6d60275520efda8befe7d1be1cf125f0fbe43ed7f673973f93fca2af9f223f1a7c3e3dfaaafb5844fef785eca7c84fe0bfb1ff80bbb66fbf20010d7eabdca71dff5a9fff9295fcacaa408b73bf98df634d0802ad142f9982f48f4a8eeaeaeecaf14949206d18b2178bc81902db207c351884da244cd3821a11c0348c3ec107798ad0a5092d8420d387520a5103bf7e3c7f9c13810d784d045cc38fa0d7ae3e4a7a3cbc93bbfb52ee4b875fe7fabac4d797ef03fce4f4d7c07f752f08605ae07f6ca6df52cf02b490c7e32201b94f205d2f0625908f14f35871bd52502602cb2ca48e423963403e01bc022284982ac4342157089114ea4ac106b6ed3bc4ef8502a1b7a5285ffefcd658ca437e1fca79b2964fd15e477c0dfc92c34fc0d7929fa6f9c8ec2be5fbd4e043357e80ffee4136fc6e1d3890447e02ffbb7bf6b94b7be85214d9e23b6ee45f36e07fdc29409f1f30a912409f40de31187bb93788fb07f39d02e594407b037d6901f903411188aa01a982d70e5223114e990c52cf800c4422048314920a032a0df22da713f9b1be579894e179db0820bd6d977af5fd09b9bd25f3a9a40767bf067c34f5a0b62f814f8d3d5989af98ef33f8c9e927f0bf47923f80fffafe97bdecbfb2775f07fe0b0bb4e893408fc36ab47c9b8f25fb1fbbe9b71c154079ad389708f3f22079025d2a10ba05d374206d168ac31a34b6a95b3a0b2410468a7335908e16a76aa08508041984f261da50c46440690129036a2e92e544ee2d88fd05838941561e9ade07d1c8eac5eb4209e8abb5f38f09f069b4b765fe10e027edbca2b68fa84f73fcb2c4a7f37d94f908fc3edf2f4d080280ff9d3d7b1c81ffed055a81f644817f3929809a29582681581978c9adce4a844c02e9a4169570721290db86d917c853829a1a28a705d4488426229d1a4422c0c42111019dd854943718c9fe02f418f493420ade9c345abf0ef2e1fe06be4abbff705e1f412f577311e8c9d547498f727c29f5ad3cdf8cfab2b66f94f8bce43f1c253f6afc003f997d14f9af8ac8df817fd7823bbf6bc19ddd41bb0e268dfc8fd5f45bce0a605c1210d5018304386fb3da37a312882bc7952f802a41931ab0fc015b11d09011b516a79d85568aa0bb0cfb09a14e1011c09134eccfe9e7b13eae837f4b77d516015e831ec0c7a8ae06be96fa3acf97725fe7fad2e58f25be54f253be9f38fdfbf73bcaf721fb2df0bfb963a73bbd7d877b6d1b999fa4425bdc7e29fb9715f8979b02885b84d2a5a2d82c4c919bd30179f538cf0dd87d020c7e9c320910015824d0a9818e0878c948ae06d2de815c11482278d5df54c4adc5568b71ee17c03cccdb8e2521e0fdd881d802e2f6efc95f2b258008787dd12636f2d440af4b7ab27fdf8af8a8eb636d17c97d3ab2b62f4b7c25c98f321f81ff72c8f909fc6f2fec766f8bc84fe07f7d1b83ffe4d66deef816fa7d757a9ade8cc5292c811ea7c5145fd2ef59d2176b994eea56899548a0bc625c92000f10c59cad4602ebfcbd03f972917e35302911507a504f114006a93a2042d0a49097192d7298ec73f41a7cb8f5997e4d080286fc56dd9c082c89af657e6bc4cf805fcdf5cb92ffe6cb2cf9c9ec934e3ff2fdb748f2efdce5ceecd8e92cf0bffa9226801507fee5a900b04380086028095853842d2430a76608dad440ec1b18460498314855414e0696678061244108a1fb10a49012038695e2d0520431c02cdfeaef8f40ef9e1fafd7bd3d512101be6b0ff23e057d6ce0a1683f38e22be0a3a30fb9beece7374b7c24f90da79fcc3e9fef07f0bfb163878ffca744e427f01fd9fc923bb469b33bb891ae0c5b91e05fde0480a5a2bd24f0ecbce36522d69661fa0394a59b724ac024c00b476b6a204f0b8611415f7ac013885a19945205399d48a480c32dc9d5132278eff7f9e791cf2d5f93df4fafd5c6059bf1a24dc87beada83a92737f3604e1f7dfb98d5972dbc9dd42f005fca7db3b147b9fcd57c7fe72e1ff5cbe0dfdc81ffe5f979b77f7edeed5e4f9e12886059cbfee5320bd0967ed84a406d187e7683e10b506580fe08e1da82086c12987b21f40b186a20b6115b6941182c0a5b87da3c026118269387bad5388e23a7a942cd3fc8019a9a8dd3fa7afc19e2adbaf25aedcddd3d7b90f716e8657edf027c39c09396f652b98fdabe34faacfafec5dd76becfe0df9e44fea39bb7b8239b52f0efdbc0e05fe80860c5807ff92b009d0ec47b068c7b070791009141f405b285a3a61ac03d04910452350022c81541ec2824b3501b86161994d2849410caa4d0a2185a88404d0802124dfa3e540abd8d176a46d0cb4b36a5bc879bafa3bd76f575c4d7c0ef36f6a8f15dc87d59db97465fe6f22f2c38e4fb54e683d30ff093d9776ccb1627c17f607e93a3c8bf777d04ff8eb939b77d6ece6d5d437f5bcbceed2ff96f6d5138ddf2fb781e032550bd6bc02401faa394b5db3c25c88789b41ac0bd84542dd89b5c554e24303d22603248d30449062585006288e943398d28835a562624c0f97df91ae9fb3901505e9c1e8af412f459b417adbbbe8947487d8cec52c4d7c097725f37f5a0b6af8dbeacc4a7f27de9f413f829df47e4d7e0dfb56ebd93e0dffc22fd7d3d1e8c8cf1ba2be6074daa03251288578fc117e09b88e9a4244084c044b0e679bd7a5cae1f471bb1f606fa8840b4158b1e02991ee4aac052068a10ba7461282994c15b03b6fd359010bfd5402f7dec017ff294dfc3d7e5f601f414eda9675f031f25bd16e0532b2fa2be76f8754b2f197dbac45733fb08fcaf6ca2a8bfd1e7fb88fc00ffb6b56b7de4dffc22fd5dad284cada81f3690c08bbe3a502281bc4cc8e6604e00abb3adc3b47434aa0122022200a906da89c0340b27260383101252909b8c52a0f218f3b807cf1bde62202aa89516126801bd6cdd85abdf17f1bb861e39c46338fcb2a557bafc5af2a3c6af9dfe0cfc73eb7ce427f06f5999e05f391e8066d5679fa99180b88e3ca404d8388c1982f25831d4409c25882bc7a64004b2b3509986f6cc013c4d080283923ac075679118baf44180d4cf2bc8e3d79d8953fbde0072a426713c3abeb64d00b84e3bbeb522bd063d80dfb9fa21c7d752df02beacebcba61ed4f6bba8af5c7e2df92db30f919fccbe5d4f06f8572e01e4bd02640ae2d81502490269bf00550bb871480f14a56a005793e5fe402c1bead420350c8b5e41850cec54a164264a42588af7f9e76002c801af3f87bc1ea0476e2fa37d2ce7b1ab3f14f852ee93c3efc18f8e3ed1d863b9fc88fa3adf974e7f07fe356bdc4bab5754bebf1c17824c9e82f495094b2941de42ac078aa21ae827022b359055831211c02b101504234d90ea8008a14e0a4354431f49c8e7b2df6f01fe6844576bcffb4d3c12f4c8edad688fd65d8cebf6457c097c29f7c9e1c7208faced53d4a7e61e72f9e9f4497e8afc3b85d3ff04807fe52b00ab4cf85ca604f29440360df5ab012b2d308c42553a1cae0a02192469c201b7a14008da5004310c23887e80ebe7c5c7787d9b0018f0d6c59a12f4b16baf1ceda5b987155d52ea03f8b4b44302df8afa34c8a36bfbdae5a7ce3e34f774669f90fc64f63d21e07f720880bb062d5f20ed17c8ab04b27b50ce12443590a705d21fe82302d955c803476919315706314da8108291320090d6db1288fbc05d7bce480000bb0d784d027ef3aecfeb79fdb694f866b417e65e3ff0c500cfce5d7e7c57477d987c32eac3e54789cf94fc2bdbec5bf97d00ade5152b25408b26a54d0802035d4a60f40c400d587b06c62282aeab90892055056d64601282a5124829f873904f985a9cf82d9eaf7b7ebc0ebfb5afcfb6aed4c6e7d61741afa33d95f37c13cffefdddd08e1df1ebc06f8bfa69890f92df3bfd4f56d45f59adc0adc0d75792cb52a11cd678fe194e09523590f70da42430ae22b02a07ad6460ab83b4f1282c2f214290e745e52914c0cb84d177d473fbd7e1d76d077fba854946fa24b737a23d9a78fa807f6e571af14b72df3bfca1b1876afb88fa96cb8fcebe2748f22ff78520939b82d1178829414a00b14ad0ed1748d4402d2d88d5024b11a466a1ec2310449078056532c8530522843a29801c52d5009218efad7c4ef97e1dfc7aed5afe71d7aa2b409f74ee85493d94f3682967ccf163c4d7357d34f4a0b47762ebd6c4e44b7bf9f3a89f97f856bcd35f6b4e9a1ee0c68bd48bfffaa404b837db1ad9ccd78de9652376b5c0228252d540fb043532281182952e801086114309d016b8edefe5d76302e807bafd3db4dc65cecb7b097a2bdaa7c08f1d7c3ee267653d5ed82147772d934f477d1ae601f029ea3fc192ffe951003a256012a095ccfd44c02460a505da28b452034904bab3b0870c327550230426051c5607c34e2d8a979e0baf370cfc0c78ebf481de6ae281b96795f560f275033c15b98f293e19f59f3097bfaf3579f123f0f25106724cb34402f17ec2555d5a300911f493416c37566dc7440626214452c84d08024d45ae341038b1e60c950749167d204e1f8bea45fab64e0065c06b12d0125f97f2ba3abe72f5a5d4d7115fe6f958da41adbc7a82cf8afa2bb09fbf0fe44f770a90131088a0a6062c2248978ed8a941da55187d024d04b63248db8e0b84d091029a8f8810e291c044e5c1228a1280e563d2f7add721a0b7835d831ff23ec9edc5a08e25f361ee59525f77f2714d9f81af8778a8a907bdfc4f59d47f1aaa002dca0644505203d11ff06aa0a208ecf2619a1e0c23034e15f88008e4dba00ea012c45b061980393c479764c21b92f2d72ac9f9fecfcb652c6bc3befddd7ee73e1a7760ea59325f96f34a521f11dfcaf3651fff53e0f0b7288316a03cc9dfd392163011e4fd03f92ab2aa2a082bcbd3990352062dea8008a18f149820fa4168e7e2f4389f72982725a1f6d748011f97b0c49d0c0478097a2ce12489cfd13e37f692251d62569f227e0bf0c9e4e309be27dae19f1140bbffd09f16a07fa09508caaa604b7789491b1970ba909718410a911cda816993008f3ea787144854233b7b08a604787da75e24008af412f4c8ed11ed657e9f74ef0d00fe4cee1783f8931cddc7f9ddea44c024c08d44091114fa08b08c04f716e4cd45799a20538574610911813e911826053f1ecf4aa37cd2bb16fa237cba9435bf5a8b002f41af737b447b99dfeb5abecef1bdd45fc7c33bb33cbf8a837140f2a43f46a605a951c823c768248a44d07515663e414d08026c2a6a2383541d58e0e194214d1bda40598bcef16b501b39d930f9e4af2557ac95de972bd9f2f725e8d1b843653c02bd76f4a97baf64eed580ff94b9fb2df2ffc91a066a97fbad04661341be77a04f15d85e418d10aced459a0c64fa604759b9f8b40dfc0077043fc886df965fa7746b6e0a76cae7e5ef06790fd043e24bd0cb688ffcde8cf873ebcc883f03fe4c01b4b261e1fb52224857914111f4a88206656083be1e39f9312d1178f8f78060e4dbf2f5d82d3fe76adfa1873bf530876f457a80be14ede5365ed4f2b5d49f01bf29d0357dd384007a525e231241be93506f234a55419222186490ae2cc3a5936da01a9f38fa9fdf6f4af247deafd0ff38fb06dd17bbe51b43412f6bf8ba7b6f06fc89f035d1839f5262b088608d8b8b488693417ec9245d3a0922906f87826ffcef27d0e39079d94634d6cf1c2fd0eca47d70f00f874b3674a4d7125f821ec61e7af6d1c4338bf8636179ac073da5c0b7fead9eed36144b55909201a507324588e62155126cf0eb5b67f1b105b0c5510c54b9b057aad77e86d2cfcd9f87b44f9b75b8534f823e91f8ebe2a00ea23deaf84ff098ee52616c4600d3310fdb5441cb20d230429080ab0173f8d7007e5ea92e1f5f0779ede7978d3a00bc25efd1b1578ef64f7d03cfb408624600d32100f9ef68a9024e11e8944940b624c75984f109617ca04ef735e977e1df8dc00ec023ca77f23e44fa04f4e1c24d4f010deada9b45fb45c1eaa23ce9b4d869853f0f11415c4ac27b096a0348b59904fada4a208508764d741af088f2d2c5f779bd02fd2cb75f548c2eea93af70004ff3df469612fbdb8edb5402088340b738e4607b1478bd3ec24abf8e261d023ca2bccce9c9cc43a49f817e9a7f7bb33e806548448b4908c380398c6cc67f6e023b2ed1a4284f461e1cfc99bc5f32c03fad1b811edb3f7003f95864306d95303e70c727084a77e2ef06c0cfa2fcb2fa5b5c563f4c03589e869fb74608586b368997306d32a09f2505bb043ede9fc9fa65f9b7bb2c7fa8191164574cf79182fe3a40390951c8e718fafaf4fdb3bfad15f06f30fb4f5a01ff493d601a079cd37accecef6785fffdccfe0357f87fe02cd2ce94c6247f0333029811c0ec6fe029fe1b98fde73fc5fff993448ed9639f0ce53123801901ccfe069ed6bf81ff1f4c1b1835edf404ae0000000049454e44ae4260826821c07150ac0c02c0cf23e2171b435addb6811f52e0eb0cc946f296f14f75c298ed1400000000020000000001012886d3bad4bfe2e1a34e78a105eaf530793389abfd7894b6c434dcc58cdc63540100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6d32c0000000000001600142ec714e7f6fa5f0eec7befdafa8878dcba0697b60247304402200d0d457995cf831e1da5066b2d7f354d1c2ecd1709566cd943420cb3dbd130400220633c423aa0f06d85cab5a80ab7d6ec27629f5c479d8396fb0862269f8a7dd4ed01210270c48f61f01bff57f6c2cdca7c3c9f221f13d088943043add5f237c5ac4cce7f0000000002000000000101a37d0f5895a862a31c6439337b2827b465212e1cc75d4063798f3c3a95befbab0100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b65e280000000000001600142ec714e7f6fa5f0eec7befdafa8878dcba0697b60247304402207d33de47268eeea2c5d4b8763d68bd4de3f5c79d5c20636a1497a2fec891189502202dfa6791f0837fb41625d7e3f86e825ec87c05068b42cd61d44088b01942393b01210270c48f61f01bff57f6c2cdca7c3c9f221f13d088943043add5f237c5ac4cce7f0000000002000000000101808295f43684a169449847f698487219f780fedcaffd5a5ff28b855ea1f844680100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6e9230000000000001600142ec714e7f6fa5f0eec7befdafa8878dcba0697b602483045022100b5accfaed35285ed423306f3e5692877ad2647b8b9b8031c4e9d1ec84a7d1cf4022006eb089bd52c9735d467a76538d1c79275da82d0e56c950a95e37d69d839e2b701210270c48f61f01bff57f6c2cdca7c3c9f221f13d088943043add5f237c5ac4cce7f000000000200000000010163300e815c9d0a39dadacb7a4170820bc2f92d963edbeb82101d2006b70ba5030300000000ffffffff02587500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740befa490000000000001600143ee896ad7beeec1737747acf9af908300a8123c002473044022052a23bb1ddc704f001ab99308edb4c27f9506982567d104407bd1fb86aebdc2e02200815441b7180e3a53ba05d21ec572bc3a54ea199d322ee00547705ea61ff42b501210358ec9f1c868c4ffb302f4c61f280bf53502018e1c27ec2991be330532ac94e9400000000020000000001020643475265fac93f310b96d25b6741d7ed6c8e701a153e849e17c770b47cd3fb0000000000ffffffff2e0c0ddc84eabb9d3257d356a76592f27bf09023b3d12d2785e93eb0d8cfac160200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b18ea3010000000000160014a96602fd7f84f4153eb60329dadd530fb091805f02483045022100fde9c1cf281318e2fef9a5424f68531dbcb8ea072ea3f7c4138769497e88d8080220316222c2753d619758ef1bb484cdd09397458c05bee1696594c70750607b0fe4012102e269f787e735eb2367fb534f83d44835bf62643e440100ec3f84b2129175f8ca024830450221008946249e30591ed577c3f029ba4171a64ef378506da32ac8df80cf85c51264f3022044186a0e9c90cd1e2618b090b0765caae1715d20f81f6f369c813b8856834602012102e269f787e735eb2367fb534f83d44835bf62643e440100ec3f84b2129175f8ca0000000002000000000101ba881c38899591ae988e48c160d9bda8372a2c7b4eb032d1f6918f44d01f8f1100000000171600148e0b251e519c47c8b144c3c1dca9193770d21b32fdffffff028fd28b140100000016001442fdae26235615fa3a55d4fa536ea1cb6ffc15ee4cfb00000000000016001419af0dc8854a2c5c1233ff6ad8b9f20d8b65eddd024730440220636bc904a98ccacdf04b6e1871702da9e861cf87603e76786128fe803fa012e702206128869324c185f2cbcbf74112b8c1809f4982c885bf19dc50860ee5791207b0012103c0f20af6b233f12f75f3e5d1ef49d55d635b573a5fb32ac55cd45c1b8a85db64e368270002000000000101223b7a03b767b74cce27564b0ade71c29cb4a071395469fd153a76c6b158a1320000000000fdffffff02f685cae9000000002251200f9c8c71963f3d0be633aab0bc94b6951a32a27fced5d3e0af698fb21d503098feb9000000000000225120d2690e22b430b38d656af36cebe78e5d04a8ac23ecae0b4d483a2723e2b5c24b0140a0e991262610afd59634f71cba46625e5397646741bbe6027f0ec17d590bf46529e976820d4cc5a62747ca603df78959939724820fe3229e41215b88377b2a03e36827000200000000010293d2ea4a44670fb1abaa96d63827febc19478fafc76b79d61154fe79c89457ff2f00000000fdffffff310f59cf5914e335cf57885b939b2cfc884de13a019b8cb789863306de24c91b0b00000000fdffffff03d0070000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b0000000000000000266a2400000a58000000000000000000000000e575e2961420f981807985f9473a1533eaee584dd0060000000000001600145f415336cd29659152d9d32ecec65f2dcb36ebad02473044022073f50e143e317e7a69f1cd59fc35f7e8af444d8e3ad83a5d0ad74fbe4af075c10220334fef1a2be678fa98193f1e3540f4eb364b27b5564c5a957ff71671eff6d34e012102c9298b14b3d136f41e00dde467e0c705d078aa521269a4acc58fc2d36670c413024830450221008536002c7c5fb56a3b11b4c01dc2ca97c54664c01abdd7af30b9eec0751a52120220522d45a1af653abfca52763abc6af1c851916cd98825192fdb2c801e885fb524012102c9298b14b3d136f41e00dde467e0c705d078aa521269a4acc58fc2d36670c413000000000200000000010109bcece47c325f4ce8fa1770995c842b20f341f42f3f396dc22e102264eeeffc0000000000fdffffff020b8463480100000017a91431f172388bfd4fc1bc96a94d821fc6e3b5e8cf99879c9b00000000000017a9144c018f52bd198e15ff38cf4bec48fbf303d0380e870140d4200e6a6deb30f69b9f998b3ce583b1d648991387c9d70757a5f4bb49d9bf1920edd192d0d2d12c9c59544c2c6f942ee245eea0a4a3d1ab373b3170136c1ad4e368270002000000000101d53045585fb724e0aca3a7c6521c8756fbe40536cd7e083143a981cd0d74c79600000000171600148b022d61fd7abbbd6f9c88f7baf160fa87c7857ffdffffff029bf56248010000002251209c6afb4b0899d1dc8aaa59c17df5434eefda0031070302aa1f8d3522c9bbe671b48d000000000000225120b42ad6ec0770894aa4456cdf2a51f5042ab4ae34f08e9c648543b9768fe5011d0247304402202bb5dbaed0858fc40dd7881f3e4ecbf2bde4110f8024b4b66c889c25db32c56e022044757dde5fb64a55d25a6b5978c6687248c439b7bf7e858dd25dac82729e0ac201210381254a944092f08b6646495fcba37728f95445e4264fa4a52c0fbeb81d19be98e368270002000000000101b55b6b544b680da4813da4ba43370715777c531fa69d1aab0d062e222abda5e60100000000fdffffff025eca00000000000016001462529ceb37b1ff796b17d4dce620f9637574064e874d540001000000160014f2ae3a015daa3ddb156ff91c851a7c0950a0a2a102473044022012e50ca60f43efbecb11d8670c909c4ce5c68f5fc87c4ddb4b4239ef7f54afbb0220139097f51dc063179ce94e9fcc13eac1e84579cdc79efef7ec594da9c43798d80121039948782c155f6e993a84b347ce58d972a2d690707d3b6cf2f8aa376900e139e5e368270002000000000101a020170e6ff08c8e6c866a5a89ad0f64b8620bdde8087377c53850adcaae2a0d0100000000fdffffff029d5703000000000017a914064acb6b7dc0fc078b75ac0f0e9bbfd718eff718875bf550000100000017a91452f62cce2ac7bd5254580f65d0a0660d1289aa26870247304402207eb62548ad021b454ad65148a413467547ad4080706436bcfaa037d019310a740220513f1d5b54106dc3f1fbdd203787fffbe5ff28060e2e585a2dd2c2a769545365012102a47b209d4be9d34be8ed5a8ec4a0ac21608d8a657659675f03c9f87259518577e368270002000000000102decb903286e2e29ded99bea62460526fe9b3c48afadad073d1cc287e14e0b4080000000000ffffffff4ee9fa696dfbb6a0a9d3fc38172933a411bde59620dc652a3f4e94cd2268dd2c0100000000ffffffff02f0d2000000000000225120601d28a3d763730dc48f21b921446418f945324d5af9f52b1cfc7597c5507dd30628000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e01404d58efaf3719b9a371a93a27a6cce6797437070c3c2e8401245b9f948082ac1314bb1801caa980ebf663c0b0c9b55a526c31584f64e413e95d151813daa3056e014012b6f669173f1d77aa9f30335fe427e9063b77b7451a28073b3b6fc11caed9d11c34adf9d1b11e9fb1ee63a9f122309acfd05ad7705d8888a7127fd3ac8375f000000000020000000001019a8590873f67137d5cd59e281365aded75702bd6b3f573cad26f5618765c84390000000000fdffffff152202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431eb802000000000000225120830f950887a54c9120e09040105fec8c50480e93b7f1f4356063cefa2c28f880b802000000000000225120810a002fa9ed9d3979e69e30b9b290220668967dbc7b1a4c54ffbf43997e985cb80200000000000022512000aed9b0cb8cc4d576b6fb298d4db0f3318e586766ec2d13572efe9624c5d1f0b8020000000000002251200f9a6e5c96f9933ab8c966b2a98ef8d33612dee2884f302bf7131b2c6b5c643db8020000000000002251202cdda9679b0f267737caf670d2b9f34d9018b1b5b1ed66fc200aec9642bc7ca8b802000000000000225120e6e003016a6d313b4276f62c56f540fc41615771ea9e06aa0fa0be97c52b25e1b802000000000000225120ba4d8baadd9578e3a4315e6a6080802ff7abd5b7f478b781adcdb52062765f8bb802000000000000225120a845265980d89b90549f41d93f3f0d84eb4ee2b5cf9b4122f28cbc63a41193afb802000000000000225120745506e1654dff2bba412a09d25248113b7a9a85a93fa073bc2b54162e3f214fb802000000000000225120e4851149b4efda0865f545810708fc01e5166e9dd7ce8674b4af830a806f2dcfb802000000000000225120945884397345439da3a900dbf7bccee2a3a5ac1f9e5587c7542f4efbb077f738b802000000000000225120eb20abde6f1ca2fd7311f84c9e194d4ab7495b9623a67a046d0b93d3e3da130fb802000000000000225120746540b3cbcd590ee8d0cd25466eeb01a4b8afde010bdf73f4b828beb7f36cd3b802000000000000225120ea84d68870b5a0b593cfea73f14c3c96e03e75e9952fd99fd4bc511f84839aedb802000000000000225120a1076cc3a236be66d5caeddd444f41297dfe428dd6d0552803261dc35324aa47b802000000000000225120ee5efbe537a3053fa3f7bf5949189613708b48296ae020c580c94def7db2c83fb8020000000000002251203ffbd175420f8bc0e1cd6fc11aaec1d3973f2cdb9586c9f970d5d5e2ca50c597b8020000000000002251203a9ace0d806476d7c7e7d5c56ef5cca74ff2a54c6913aee60054407ee91d5f20b802000000000000225120ab8aa8881b5157c4303bb93055460cbf3e991f78763795cd9c6209a88b64248340990000000000001600144113ab31ea30c56351edbc905f1a13f34d4395c603402a4f714a197099d83fb05513972242e30d391cbb4d61602078b3abc90d317f4310f6de0b6733fd1ea89a96391308331d3be8b95ca57c0c72717154ebed01c3607920a60badb1122a2985a083f321ed9fe0975dc065790b90c4d5d7d8985860cce2a0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e6000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0a00000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340004a274aa716d906673e5d833c3f0fa779954e9146a64628a4c69f84db31a59aa2d1bbb5780e83506af35ea3eaf46fc96b6f6fb894cfaee45fc8c87cb8d0d39479209c87311e074d850a82a54d2185f011e0104b7b26dd815b12fbc481f59d53c733ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e6000000000200000000010192cd8be7674e5fa217b96dd6e312832e3a13b69595791538398dc57af97debfd0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beac04000000000000160014f80a8200a3faeda688550ee7cc954193cad051a802473044022058bfd106f99b5af42b80f0b4402c8949204a339829d22c4e94e3c76bf7a7e02a022073c102c3e7a2dc7b63ecf77a68715ccee03e1d0e0e678e2bbfe9bfb1936f93c30121029eb0614c548da7de161e5ec00e8fe527f30bee4f02e5a05f18bf049b4773e30e0000000002000000000102a38f4018d1381f29e8b937a93243154dbe2a3fd748fb2b4069d48a13cddebd5d000000001716001487803d3b1e93edc0f925833fe65e68d53ab2ae77fdffffffe1868d73b6fbe965a1e93fdf484f44d987e962a04058776bb75a3c419d184a860100000017160014c4dd2c9360e5017e08e93b5ce8838dcd08cc41aafdffffff02dca207000000000017a914a211e633f5ee5cbe12c912dab18500553762ea8787400d03000000000017a914e6b3f58d33cd0fa4e880a191fabb7938664af82087024730440220355f4b5c64196e9e989447c6ad1bad0207461c82a619ff97d313de86c1342bf602204fd62627380ef9715374e4e0840e27d7bba222f6a6a79665899c1c32a2c3b318012103de20827088c66c475417f894c63ad38303776287562034cebee591f7732981e20247304402205190ca27a9ab075da2615de110d5637fc5958a6aa95efa9c2a6c357cd1f3db0702204bf4e0a6bed5544ded07cbc23f17e4c95d80180e82fbd486d9a5f54336fd0ad5012103a31f44306b0e8a0d4ee2470ec8925b06b90bbf00cd8c57965eec725481a9c2dbae6827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0c00000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340413cd39906eef88ab297227239573c7970fa375c7f6dd393676b41fef5c18c2bc8dc790b89699a710690afc56085e4f770d447fafb8d11da1c942e3179bf70b07920771aed5c7d5028b6f791d872d2fb25c4800ea241727f45981aa1516b40ecb601ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000101dae18037474227d162b131277419b32d6c049aaa1bd5f23642545791cfec54240000000000fdffffff0298d1000000000000160014251c37cc03f67debcbdc69142fe10406d4a5cc3742d8ca220100000016001442ce64be463a31542bbfca263803d198ec3679040140c0f6b6b842df4a621549e3624be78cbfdb2e18210de08f05d74d25ede61dab7801464e85dbeff02611d92ca3d2e3027e9d1173d63a504c3b2e480116bbef2297e36827000200000000010167e3fc547bcc2d2b63ab8602f0ea5c6433c4ca415b65540b15a5b0e29e33e1230100000000fdffffff0267df0000000000001600141a142d174ce0916bbfd9ef6aec6a82dce5ea93ca4ef8c92201000000160014e637bd23411b456e6b6e7ec1be8be17c3b8c5fbe02473044022079b3c9d64e430cd23d0035a9206d691c820a83e9fee9670f71e97f13d46e166f02204f7655d367594a474205957d76ee337a4cbfc254ae10b56257bd72b9e8662130012103c5e4e9e334d3be6bae8dd8b2e650fd48685be8975b105a304a8f54997abbabd9e36827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0600000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340999c4b8e1f0bd10d41187438baa6cecdb9932529de350bf479a7eeb25e453ca4c7f65b875becbb96957770ed3cc35eadfe8677776bf3cb6c2fb6f13969606f047920ae35da2bf054ed6a04c1f5fd17cb845c192e05f9a57a719c95eb49ff7be65b44ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000001000000000103e959daf70d65629e5539fd9416de1117d9dbef1c786c86a571ba446d642247fa0000000000fdffffff19550b87c827db140b6a7ef01b7b3e68404f8fc0f4507d01906f4df231122d490000000000fdffffffa017191468bbb96f2659e1804fe8ed90ac6e7348ed885b01000c3ab6dde01c1f0000000000fdffffff03102700000000000016001455c6fe4801130a284c1aa2bd92223d8c5c45f2db0000000000000000226a208b647829d322e36a49a624a3b2008c0c0e06bcbeecc31bd59dc0a81534acbac3b829000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce024730440220176b2739d60b09ed87bbf54e397aa17343d25379b623fd6703cb095c4ff36362022035ce57ddcddad0619c5cd600bcdcf98336826650cf473c71c869f1d11447a0f7012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100ecf24e5e01c5ef397e18cadbeaf6e3e684405ba006517e296c5bb43f8238f80f02207d3c2721a201c14e246e377b7a5e0f449f02cfb25fa753f2c251fd8953ab39e6012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100b75764d88d25fa0e422418d41313ffacacc75db719725d6b449012f6744eb7c30220185ad95494fe4b837cf964e082cbeb45612a5b73a389260857717a42843c3b8b012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae000000000200000000010177d6d09386dedf5a0639e9ba834cf2890d038fd7f4afd98a959dc4e5cb67d3950000000000fdffffff02b57d00000000000016001409f98ccdf95769c51faf2cebe5bd8584c29c830a20a579d400000000160014b6d80226990b4171abb845a260c6f58bb68a18b00247304402200508aaa05653a851aabffe24f1efdcecab47e9bbb23921c9bc67a91187389c680220514ece85bc3c28d4301ef9ce037c6bc18d9547c80c4799b1cb2d8d9070170b480121038f20bd1f98c499058a65104a4180b92a7839352d10b5c68ecdaf1dfdaa7d44e3e368270002000000000101470ac27490dd3e881a013cb85a00cd4fa72881adf87ad12cb6feb3252d2498a90100000000fdffffff02052c79d400000000225120182928fb2a24dbb78ebb02a86d79653694b19e2e85517285fe21f4ba5e0618347678000000000000225120f038f7fbfc4eae087e55d9e2f84bcb9536f74998997c769f18f6526632a49ebe024730440220383fa05bac601ae96a1589ab936dbbf5a1e42731a0313a2ad22724a6758476870220499d91036c3493a61a1592882eff92265d21e7fe2323ff612f874ea8df3c892701210286ac87f4847e2c7390debddec62e1ee908a6d52819feadb2d70914544586ca4de3682700020000000001059a8590873f67137d5cd59e281365aded75702bd6b3f573cad26f5618765c84390100000000fffffffff0336145f7267a94491e141457fe101d2500e7cfe3b24bb0f2421303e42284130000000000ffffffff291277e38df69092f16b994341193cabb739805bc9d57bcd147a8f7e2a032f701800000000ffffffff6fb4f52de5ebc9f8d019a97431c5d4ab3b6be4361f35dcf5b59536d8fededb9d1000000000fffffffface2b89b54fa64951fb7fcef7f2a0bcba6d959866c8317dc36a31d34c88f80b00300000000ffffffff027869000000000000225120e2fde7b7e6eff58ada790a41e9d7eb3293724e8a61c2d2e3c5419fd14390f5e77c02000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0140efe944efe748f129ccca74d4cb0bb50912301f142792075c82e017b2b702e6d8741ef7915627a5feea3cc64d91218f3ed08accf42d5d0e1584508ee2c1bade580140ece02779ff97116fad4655ace4cb40835d66fe16685bd3757ea82d0067bac9d7559d6b1da086c052fc69ca20c83d3027ef54b4d99c66c38e44569b6a7f0097a10140efc3a83acce2f38736536db01cec59c6ae6797650733d8833ce7b9d48adb6c6746e1de290ff3800bf1eed6363075faa7ff2893986374c3d012f0c6eb94bf8ee50140f18000890c7c8483487a6630e527a498ecfcfa9ff2197188cb33261ff3f1f4f61189c3f9adb2bfb90c6201d53d9487a8137b62d68f2ecf12f00eb64fa11ffc9c01407653e6859412714eaca5671ecf2de85aa78e88cdafe72ce0ce6e009a9aec90227768f635e9ff6575e5a2486e29b1603edfb5f6b55a14f93dceff320f673d9dac0000000002000000000101a3550652a0e3e67b304fe7e73304c0d308a62e659da9273a04691800822587340000000000fdffffff0b2202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431eb802000000000000225120d55d0e44d1c91d769ccc7e8cd93787c10e9255955d6b829de7cd7cedf14e41e0b802000000000000225120bdccb9f5c9b920fdc4384acabfaae4350f70270ed9a70b005f4812954d46b440b802000000000000225120da9eaa7f33d8d67a885122f472fa12c195733ef797e8b9966ad9784432ba3d59b802000000000000225120f49f50a86b09ba366480289d4ff540b6f73de70aca29f8c40446ed416e98e2bab802000000000000225120f255c6eb441ec1763b03f6820f962d7c027f85b254006ed64548b31f2d02bda1b802000000000000225120b8359d419047f97b0aa92d236b4e06bced832c32bb4aa521289a99e877b5f4c3b8020000000000002251206217a723cca329c58dfff8ad7230e98fe1444252d59e2a6a9040540952720a99b80200000000000022512013ccf9d8ebd16f71949687ac8853601c64ff2ef5100492454f7e747b6df952d8b80200000000000022512070cc7861d3de0b6ffb142ca49eac8075893df2fe043255b36b97107e1a0028c5a64c000000000000160014626f32b70b8eec0fd583d811bf39c9637bb576a50340081a4ba6e43c9ebae274cac904a7930e0e653bcaa3590fb3b8a9f43a8ba2e0ce2efd89f8ef3c5f13e963e09df9fcebe9163d45c1265598cea0bdaf85d9847c4d79202cfb33a269df0d411156f483e8f270ee38126bac8076215d2bebae035ca5258fac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c1c4aa6ae80b9f2a6ec56de12ec04c754a0958f183cd936cb7891ffd8bea44eacf000000000200000000010129b21f7d003d6b810d84d18d6bb4571c05134173016b3c24707f46590be81b460000000000fdffffff0224c700000000000017a9149b83f1cab3683d49f7dd5f57c2f00b665b2ebe20875888cb110100000017a9149b4c0b332249182ed4cd8473d58773373cc3d8c387014067338d5c7a6022fab067876ae66ee10b862dc035f565cb0a3bf674f65c7a7a3c8f5128875a89ae2917041656437953ddb120333eef21f4b184bb2b2717b75b44e3682700020000000101f85d1f647ceacb6588325a3c24a11d1f9d1c8c04d97f2ad8ddc6d001a7caaa010000006a47304402202d9fb292db37e75c49f77651b2f1b33d2fecc5458dfb92175da281054583cb57022026754f20de645b143f7f639668a87796549183ad5d5a60edbbe61cf694fe9a25012102d26a742e6ba2719fc3507ecde5b8bcdcbb152802d3f5816f3f05555963567246fdffffff020e97000000000000160014b66119bbc087b59e3cc3027bb079ae3560be3b2a714a5b51010000001600146952b329e68f869498a93042097606b4489f212de3682700020000000001011b5047406c103fc11c1ef38f2fdd63c2d2704848932bcdc6c3e4eac48bf0be2b0100000000fdffffff02cfc700000000000016001462f4f9944b3130160c64b88ea88397c7ffc84a8115825a5101000000160014fd485e2435ef167c795e53144d3e331ec471e1bd0247304402206cdf9825afaa1928b2a23b80a181345c8b7da98a33e114b566cf6eb58efcf9720220051f2083a087124df3592777a5949517d3d90773af2ca8039ffb51647bb336f50121026f2eafef17f9990b602ef2da1659770e797788885d4c725b9031575640169474e368270002000000000101df8041a3f2c5452f510a7104b99cc2d858512ec1ca41252f4e0fe71ecb7c92e00000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be1bfa000000000000160014078669541aac7c964077d3e532d363a1bbefaa070248304502210098a300faa230e9a9610396e8848fb368cc41966f55216bc0e153c1ebbc10683702205a3cd72a35805d8a091936dc8f31b1bb793b3905599a320a63fdb2f7de5f06cf0121034f862bd4cc09f517f36938a3c2a997b9aac33d40dd763213a19d42c5170c65f8000000000200000000010155b84f4ac23d9702626af4d5cc2b85f5fa07b034c56c23fd53068c0f704e80c00100000000fdffffff023e4e934101000000160014a29d372d15cdf62ec3f0dcfd509dd1ac3792dccb06af0000000000001600149bc7d623cf0a83559582aaa7a088ff6597ecf3f101401cc13373040cfe1b15da111548cd4d9a8c93242f031cf40835d81e4ba77af95660dea908e18f5a58eda76e7c496490f300f278d67393308cef422d2ee16e9d13e368270002000000000101ab908822e9a4f42b2d4bc816201b179b388fe0e746f6c4e821cccac240555c9c0000000000fdffffff02407c0000000000002251205fa2b0100e66b2f9c279d0f48b4aa0c31044c09820dfc9ac2ef10c3f4072c49859d192410100000022512069584aaea38fc04ac9d2d394f6ab92afc4059cb9a29a7116b7e5afffa54e6a7302473044022027dbae561f9e659dfb9ded984eaadc8bd96ddc67e954bf0e038b8c5b197e6af0022049d4704f3efb3b5718e727d433e7841b0341835abf9ee2772e934bbd30a89238012102124a11a2adab2fed24e865562e8d2cb627ff33e4531a413aa6b89b01b31063a8e3682700020000000001010f0bd6cc8525d6a4d2fd2e98050b63fc1385d5eecbea5ff533bea08276f5d1750000000000fdffffff028defc9e900000000160014888ea1ac865341d74cd3a3c73de63cfd227844a3e7950000000000001600145424eba0c8c7539973123e41fd204a2e583fe9850140304b88ab85d7a6f023f44ae59b3f1cc38643b1e8208410e7222b4244e8732d04b116ca0a2f71c471a87a6e6b022f07d96d41f4bb4ff6c20cbba254ceb631de648368270002000000000101fd71d9818968e80c7bf604b39c4ab4a6184a3eda13b436d5eae908afea86612f0000000000fdffffff024b8000000000000017a9142f696052463f6ae07a957fca1c5c1d00e3282c0f87b36ec9e90000000017a91413fdf669055a193fb4b1c1f95d8021704f344d5f870247304402206053139d39ad5d90fe041749c55f0306cbe7ebd1ef52c7acd0a8f307d812add50220664e3292086e759b784918abfff3a90f58de415a7c0e98b33575f34e958bd08f012103062a6ded89d2cdb47f0661e2c3fc895437e4d27c7a3d6aea077b18f978d46e2fe368270002000000017d55b978c68ca2ea6df9a72301215ab11930fbbd32a0dba3ee448350b9a63e79010000006a473044022070b5a47e79f8c061ce0868d96891754d56d8d305db694036b1e3561c3d7b32920220558e89b95739b300142fa85e78ecbe9d34346bd9186d25dd8f6d56c1415ca0da012102ee22f163d631711c06a6c7047101dd41cd439d7266aa79447107723e627db45afdffffff02b0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588acb1010100000000001976a914b3167eb0312c2960abefadfa29dabf8799cc570c88ace3682700020000000001015d86a03e09e95cb36ecb54230402fcabc99f89c0578febba940c3a38dc13a9270300000000ffffffff02807500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be9578000000000000160014c254d52f61d06f4111cce1dce87c237a87ca53c1024730440220144ebbcb91372ad0e823c56bdb2361ede1bd0097a66354d22aac379822fb943102202a40cdefe4960ca03c73bc7ca9c8e404c1ed068d070b51dfbebade429ef03a30012102f1b079b831fc04ca0279ff3679f0fffe33a801e2eeff3aecf6fe6f6a71cf3aa10000000002000000000101533e86443e72045e6b0f5c03259180a244a2bde44001e3ff9a10169cd89e09550000000000ffffffff02d007000000000000225120b1e40f590cf86733d4394201ea2ddc9c7616ec7390971b1a6437141bcf9c84c7c587000000000000160014e89f7b007c1c44b47047fc1a821ef2da17caa34e0248304502210088b61291da329b34ba6e9484df47e24429c1ac2fa64e0a3f64322477722004c802203ae5d203bef902e5614767d3e6b98832920731dde66de444cb8940702d217d8d0121021d69018e1505d08ced756db53672534aac61d67af78133fa97cfafbc686478d2000000000200000000010115890823ec189d05d0642a7c072b1d0499105034e14420f81b2696b31d1854ce0100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b69854010000000000225120c56d6477fbeae1bb9b220ae4b93bf3f079f52a6bb327edb7eb1af9bd15872f370140132c2d6cb28deeeddbde1e03de7bb561fab22f36b8caffb9651b66cc81d5b91c7e13dbbaa48b98dce727c65f07662ad160ca331bf005e12f9c02046b2d5389a5000000000200000000010173e34957dd2e3fb4e2916ffbdff0940243a6ad3fb167b814322f4fc631a82ee90000000000fdffffff022da7000000000000160014d2727f3bc0910c7bb36ad7788898b4a595624abbeff4304701000000160014b4f4edcf06fc2cc7c80d78b2ddb142959e5f005302473044022076fea217cb8880c33e8cc33d57be69e5f826f67e4c444a493594b5b1bc227091022067a9fe39047e23b759e9fcb00d848119712c43fa0b150e1d04e483213823c68a0121038323417a24b97488208e38139c20180058b2fd9fd93ad1f517a6815a1c53e585e36827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f1200000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e03401988e0f0e6c0df44e1fdc503de2152a4a5d886722e464df50ec84f22ac20f9cb68c664b0a97432df7ef066f09a58663174c8c7f397cf0fbbde58a41eac9bfd847920fa132f7b109190dd6d312d3745f5fb62e7336089d653479ef9c9e89ee06c23edac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e600000000020000000001013151a00c56bc8d662ad376ef330ec63d471d89cd4db0c8cf0d7906a58679c5a80100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beda4d000000000000160014fd074d5991c04f5ee784d1fa79cc490aac15c9a902473044022030b1f9ca5f4f964c106782ada7fa55ed13617708c94b58d7328ca3b1a7f790e0022054d94ceb1b21df9659df84fc871f9b7687c7da850c94e7fee590dfc2ea7548310121030c600b8fdacde18612b816f5463b1b28b4131644aa2304e7debf3823760190c600000000020000000001018a9373ae9381b371c4eff4252aee7de76529ed149fb02b680785b0ad30abbb5a0300000000ffffffff024e7500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740becd3d00000000000016001473ca84e185e941861abe996f0907d308080e2136024830450221009f2e0c34f729c34cbb40bdbc6aac8d3a2a59ef83bea9254c3fcb73cf78fe0efc0220246e10a4b87e7dc7ae6380f6e8e10cb5c741a0f2b1e6db7f3c5d8c6570676c490121029168747f6b5a0365f74512ddc28b689079ae18e0209eb0b390968ec625b2892b00000000020000000001017086bf3c4f9dc04bab6d5a645fcaa1ce3a784d50e08cd1062d57b82856e8530e0100000017160014256428cd6642fc5fbd41663e44b2177ee6b7c903fdffffff02e6c00da00000000016001463a369f336a786fc36552c0f2b13519ab9bb10ab217c0000000000001600147c528c37d8c5a79679f13eeb2f1419644a21e5010247304402203869dcc0f3ad2526ee1988d7f6c9213c633ec24fbc0e34fdba7d537f53230c480220019bc62a2d054782f61603a87f1049d92a97c87b7ab840c5a0d70c61de64900d0121039651b143701aa38471d74b31d0fce14e170ac370f1c878bcd9d8330c79710e7fe36827000200000000010141edc2ebc6257bab10ed8c0899193badfafb41177a25ca32c895f9bd2d02342e01000000171600147c4966a0928d30fb4c5d2ea4312e5eedb04354b8fdffffff0237c3000000000000160014956e664496925e6d5e5c63bef09e2d0c8c81f65ba213083501000000160014a6820f4b9ebe3a503ffd7b6e58591da70d6b2d790247304402200541f338394b365e89bdf69aaf5d15c9ae7fc047e2781ed37990aa21ee12d56e02202311abbac61daae1df339c000106215f6118e363302765ae9f3225f9546b1f6701210329fe843040ae06907dc6ff24b1a7d0a076869462b7bffd33b9cb4e45fb2b3de0e3682700020000000001018f811b374dc0093f8c1434de082ab3384a26bef45f7413049ed157d592afd8930100000000fdffffff029cc1000000000000225120f32ca88ea69be98e1f4cb7b3fa9457f8c3095ea8f8e3588063d92bc576f9a2f1615107350100000022512075739b01031975f57dbc87945b1c2a304163a2e7bad029ebc7ec740c65fe9e6802473044022029cf5556f3546c3df03ccd3ed84513574e2857fe23b046a7f0bdac4bc674abc50220072c258ed04e4334b8309d3239b730704ea6f1cd92c8cd0576b8acdb54ae5c2b01210341ffe20be020436f3cc5bca789066f9106f61de3a984da5f3ffb2c825a0eccaae36827000200000000010129bdffba6b912c40e558cac943c77381ed74241ec561f738d87dacef8cf2cd7a0000000000fdffffff0310270000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b0000000000000000266a2400000a58000000000000000000000000f07c1ae860d6394360b87dac03818ef0560f473ecf99000000000000225120f32ca88ea69be98e1f4cb7b3fa9457f8c3095ea8f8e3588063d92bc576f9a2f1014053813d7ca3f86074f450da5760f5e33f0e546d81ff94112489a43d516cda69c175260fee344f29313f471396a5049585bd9b2686a6204730a9168b85908d731f00000000020000000001011737c7426dedb7349633ec096545f884173c55d83c94a43bb898540b03d70c440000000000ffffffff02307500000000000016001460426faa653c536502e0a0d35658d0ba259a63b6e4770000000000001600147d021d368ecd2b9332a2930410e8974ca396f98202483045022100b82206df15ef95972eeee5ef458ba5d547c8a4b609d0f08bdd341564e90a0c8402207fa96bda917efe413e6a78d95b23e77ec235dadddfe072da32bdec42cac87e1a012102816b4f8ca41e3d595f1885859e0b30f6aec1d74f4bac9b8b86d11f6f2fb01e0a0000000002000000000101069cbd4f6d3c9cde8d3969545a25b4690cf71993d086d13c1ce0ab77f5bf745a0100000000ffffffff02606701000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be06ab020000000000160014906b6d409f17bacae9d012889588d709912e753c02483045022100bd6014974906a9cf6eee243777c6110026cf8792c42b9f835da2c17c9a7a06df02204a713472721951342e22aa97ed7672ba5e17695a7b3c3a932a3448b4fe3e39ef012102ceaf24b7074674e46f453f1d8798ad09e636b490fb77b7ad3491f8e9b4bf1a490000000002000000000101138f560bc272c2d83a644aaa863d73afd9609905bc7a0f2525250ded36c881f40100000000fdffffff023de1000000000000160014d1a869bd943b85ec581d0c1f0c1ddf36da7a5836265c805b010000001600146644fd5c383c52241bf370dcf3a3ee3f25b675cc0140d048c8cf8ad22845908327425e6509459d9f5d9dba10b3861e63041002fb66ea750ed70dd821722b6f5c1303fea69eebd4b57e58381ccf46a149afd4d870186ee368270002000000000101cb95d6f07345d08df0bdda568ce10f0f726b343fd83aef97224209d21c1d31010100000000fdffffff0253d47f5b01000000225120099ce644f3d8526476eb1c616094535148dba44e606d5d0eff4216b4145fcb4f2e87000000000000225120e7af400622d43b384cb5b12aca8c7b5cee1eb77f400f5c6a39d9ce32834fde5002473044022040a1dfd4b0fce08cea564bb3cbebdba5de127baab7b44b9b6c12a688599edc0202207c18be5cf0a09d95a0ee0a4fa21e51e785ef649520a9cf4c52fe9ddaaa50baf40121032a6b20616a5b78c3a68deaa6ca045bdc3ce6275a5e3c2a63ea22e2e65c582df2e368270002000000000101d76fc99b6d2dfa6136ff7645f3aa281c1fbd98dd435787a540de4cb29a4660f70800000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b62b0b000000000000160014f1b3d76b13ef6a36dc045d24c268beac60e1774202483045022100870eca0ca7e8d945ab6d60762d1dfa6f46ef7ea0679e3c4cc3386cb8b7cbd14802205635de0725869dc6906089a360e20c25f1740585e0cd3ae9785e898004be30cb012102a7292d42dc6a5619100df81ac070cf85963ab58e01142a04bd4cabdb1014aa5e0000000002000000000101c146afc21624cfe1d40dba0b0e58a8d7e076008459866607a00a48b851b33f710300000000ffffffff026c7500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be6aae010000000000160014b97a02a4e4f79adb49fd274b6eabb5de786c32a502473044022053f7c4b21d0ad12cbecd6639b7de2d1b1e6938efaa1f94a7c3b9c88f210daa3a02204e646a92d7d2f590fdfcaa3d4f0818343d00f017a8f2a547252b8eaa009cb4d701210253915363c0a9c0006016896b277c96cddc265c6b929a6610692f05b1203cae850000000002000000000101112e5a0add5392a175d1036c2161a19ea8062f3d15ac53a7199ea48f35d64a190100000017160014c9de8f7caaa68323fa0ec018dac12f51d9ae8108fdffffff02146c500001000000225120e24ae66f5474ff41ab7e285623ebc32bcaac032e4c9684e843d038fd92aa293f8b8800000000000022512086b0bc6cbfd6cc3aed4a6b8c812b3bf68df84085fe6c80022aec4bc3b223c6ef0247304402203c8330176d39acba61214779b5ccda05088ce63d364a53b0279293e409098b67022013edf188f3aa3f0e2729bcd5bb43c65d5bddef743b240249317a2b224ac3fdd30121023211ce277370250ec784c798e96fbe4986095720e1a33b3ce63348e4462ea959e36827000200000000010131b841f92b4a8a3b2713bd8959d859ac854b3ce90919c4b0039e28fb6a8e8a120100000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740becb1a000000000000160014b32fe4c04f0061de4ebf375b293e05e27964c1dd024730440220027c80d4c36d820a7c39cf7d532fb74ee7d087e808192f3805c51546dd984c2802201a76156dd5c05940f1aef5bffed5c141c68666a8dcdea48925e84e408a91e3b901210397f126619bae0fe30cfcc7328084b3146fd2cdf3cb803620958b4306ef2ae8e50000000002000000000101112fec4c6522600ce6435824de962d2b2acc60fa157f1978115b392c0c961e0d0100000000fdffffff02580200000000000022512062f29c4e96cf6f095fb21ef4657056870b8cc8fb6e965b990be9dc52fdac615fcb0b8100000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0140717e871797e94b35c9948d7619199903e71c67ca84dc80f0c6abb1129205f752929f40388224cfbb71102ad2a5bbcbe011b773dcca3ae5353746498dce383fa5000000000200000000010153e3fa050d6d839107c14b233d5e8c3fca4bd0d2084b4a49a363fd2c99f8c5db0100000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c26000000000000000000000000a7d2843f051a314553e8d0611dd8eef412f6801a234c000000000000160014565108b5805421296475fd9009584c2b889ea6b8024830450221009ff890a0c9c2ee69937e18d28aab5e43d76af1adb9bea8b501eaba4c6ef7d10f02205713ab4666808ba937233621598ee71b894f5d7a18930fbc97f160f1a0f399e6012102c5a59ef10182ab18f19d1c2aa0886ae7d6ca59e17a4d6f09dc24997bfb8a98ba0000000002000000000101543a35afeca80f31b5aa14df37a9c2510f2e4af4725a1d05c019c2fa05ea070c0100000000ffffffff02d007000000000000225120ef9dc44d8ab946fe575f0f130f935f8ba696a42d883bd25ae221ee45e0b32a744b0902000000000016001415b4dccd93043af54c19f55844e0a017a0be263302473044022073565ca4e1d517bfdba4f0ddcd9ee7c7ac1a089ab8e47a62d3c78e604ceaac70022074803932383b97d4d820a128011d2f079c55dc53abcd22364b1cf5b6511de03a0121026f9fb86cc520f129bd72ae5560af39716964ae9ff4c975993c4608c75651424d00000000020000000001010684a1a3e17e4721750e16fdda3a81b4de453286fd27ed6e33fa02c6b3a0ceb60100000000ffffffff0240420f000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be161a0f000000000016001479d87ae1f1d1d87f249954e3e25b83a430d018c902483045022100cfc165ea96da7a60ff869ebaea6c3eece1a5c21de988782ff01303e8920f375002204bd795af57b73da6c935038ba97a11048cb10f62fe0c41f9cc63a11e9599ed75012103d4d29473015e04f1fac0ac99bb294cbc2ecc76193607bc1e2be7073a0058ad830000000002000000000101134be5e942eed1ab5be99986eb22515978454719933cecb02c33d9edfb6fa13d0100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6860e0000000000001600142854fa1f09c06635644e9d9bd2825d69a5b7135f02483045022100d6d174fded00d0632899b0fa1dd6bf773a63715a9cef07dcd7e3b67c1612042d022041e7c926fb5d03ab90881a47748db1ebe31cabbf008d3fcf0f19f8722f77bad0012102f23c90174b290eff22b22639a09e8f9ff136ef7048da324fa430d5149f55a1e300000000020000000001010b5e50c7ea97ce50b96a8b1b0d270b10f47fd1b8ecbf1dd7079fec8d120c6cd40100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6860e000000000000160014aa2887fd299c84715fd7f6accd1341004f9499210248304502210097481fcf6b2cdbf624b61b108ae21d2e762644b0fca916011af8fb90f44e8e7502205ec73ddf4b9736d5009ee907e860851fb722e933460ed67943ee7805c6d3f0bb0121037bce73745638c0babac72ec71b578e846dacb984a419b0dbe223a3fcdffb93a000000000020000000001011a273cb65cf7ce638749caed0e5731abec35ca21c92d31773686027d03d2276d0100000000ffffffff0230750000000000001600147e201850e6c65be9544da39f09b39faa39cd4f3e010300000000000016001440838d0ea57e9cb69c1b7f97d97997259bd64987024830450221009b27e547db3ad0e5c74f941f6191949491813c091bf7e44e9a36db0eecaf8f520220122edad1aa471a03e5b85df688e9774c99d5ff17b3fc35b5bd9ce96ad97f294c0121033a040613d33116434a0e9ff16168d635a62ca6953d0d5276aeb902082e1682d000000000020000000001017ddbd83b46055c290cc297b66205536dda35c9c686383aff1d2a7e6d76bde5fe0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be85f4000000000000160014ff0a9bed3e184c27acae16ff9a5776b6a226555f02483045022100ecd251854da1f1d5624bb0f8da3e29fd9cdfd0a7fbc92430216dc017b340fd5a022073dae18827887fd5ecf3d21d2217c12f4afe5b72f3129fffdf842ddef2e39c01012102cddbf62c7d65367beafbe4886ada47396513b8e45aa9a6b5c5956fec220369e4000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0200000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e034078f48a3dfdd58f47278896f41ffee2d50c93819fddbe7dc629aefa15ac4528bfb79ab016a5e56d867654d194a6b317f155630771d39c989149f0b5bdac76aa68792039bb208b90231d73b6ba9942d339d8a859ca41a00e8777b7e6626677ce9ab8c6ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000001000000000103f86ff2401e06a2ae30e215c5f7c58475922905175784017be96a9e2aec56d62c0000000000fdfffffff500918f287eb1da512dc26a42a88e8196f71345e6ce0783d9bd2a34a397900d0000000000fdffffff2300e5841d41c67735315daf9aeba7b67feb0233dd44844eab6cfe92dace30380000000000fdffffff031027000000000000160014555154c233dbc5ffae20719896167045074cca560000000000000000226a2098ac812d86e9baaf222bafb0daba16c1a729794955a31bedf82d8cc8efb87babb829000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce02483045022100a757de24319b70eb42783ea789387377bef16887f1b0f6ae4a14f6a362d0c206022021970bae424c22b7335b4992d41a7f04b3d1bf2a42071d6ced3e3b1b0185f727012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae024730440220079b0a172425ffe3ad882c1185207790010b756a886785a139d1a36b92b85779022035ac57323d00d03145beb9c91c3e7574de7bf603884f93caca4eb1e0f6558027012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100b2daea3a62ff80710c223d24af127ffd5f1ee514a5650e3f05c6efdb3f28f1d902200f998cab7d9a31078fedecec68369c30716b927d73b875fdbd0f76b7a086b0d7012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae0000000002000000000101da82189018b04ffe9c5be4d28deb5085f245a64e7145ec7576ff681e3426c3f20100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be44f00000000000001600145ca487101a5246fbbb07339637771c43adecdb3602473044022042c894d344b3b058604ff3e39a5dc0b02697454fc34988d3fb73f7ead83e08a602201826649567147a883a4de337fecc384518bad245eb272ab6f661862e06d2b1e10121037f12c193a953819fad6081a3905b1f642818eb6a735f1ff3701f0d1cd23d7f1000000000020000000001017c0ab6b137eb42e10118b1f69e7fa5dc8a53766ae742b1d1eb3d53ccaa115c190300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000001bd775fc7598e9ef9f88789330f4405492b8d510e057000000000000160014a118c686754eecb89ea23b5a501b3b7bd4ce67c202473044022071aefa22c2931fb92bec99c109b17350100724ba892912a9cca532e9ed35e10d022052df63a398841a92fc87799a33a713823abf91ff79311312b0a182f589afd4bd012103a84d8d0474b2dbf2f960669529fc09da81533442e324446eb3459a6048dc799b000000000200000000010186006e812e78cd00e0b30c10430a09dcff51c02081fa4c64c5a792b8c413affd0300000000ffffffff02767500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bee94200000000000016001418cb9a8e43a8cdaa4f3906e2a8e77153aef5202c02483045022100cb937714ea28d990e5ef151e7b8239726575ac5006a973847028830901f8dd6302202ac0e7d677f81d3c165449c4da7a7ee18ad2fcecbaec00cb9e8f7106f1d0182c0121034a7fb31570fe5ebbd9033f4208ef50d34ac1dd6ca2e4f910394b14c298f0dc6500000000020000000001016588f5c89ded03ad17b2bf596ad4db213aef2898a648f3a963dc53a318b22e860100000000fdffffff02c4fd9c5a0100000017a9143cedbe75fd91020440db4756b6eb36c5619fa5ae874fcf00000000000017a914b64b9cb9057476e6eeb91abcc7f0f3468a099491870247304402202149a01528c5daa86293d8d37dc883c963705e3d2097337f565bc3b3b407f1e9022005fe94583812fdcacac7e20595303c3209c5ec5ce0a4992d6d78b3cef5a5b018012103635aa980b4ac14ea1738f36d79e4e40ebbe11b27a78f393ab72bd043c8b678c3e368270002000000000101ac165f0f3267ba7ea612e5c2ad19c14a5cbfd4747d483cff3a693494b59be9e50000000017160014c4ba645807eb361d3ef78da77f7eae4dfc2e0b36fdffffff0298c3000000000000160014ac0cbf14f29ac9292141e3c8668e100e02418ba988399c5a01000000160014328cfed5234dc54866720458e2a30f66765c5a3c02473044022017cfa78d28c45a6c9c56aa9db82d4a281a46463ed360795e8c82c08591da81c20220203d6c99b9f86344e6469ccb61b48755f54ac88adbd9e311d6c82975e88d4cec012103bc1b1fd711626207fe690a7e247b2d12f52ab6010dcef692b76415d12cdaecfae3682700020000000001010af93d7f09971d5786d9448ffdc3acfc9f1dfd246300eca7b75cba51b750d7ea0100000000fdffffff0258020000000000002251203af5ad9839dc81545011adbb98ebafc32861d59df63f17cfa4be199c01be1808879c0500000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d01409cc18268e25bdc9b878cf7972a8b09109acd1f2ca8a72d6c2b2bbe2081c2ee22dd30e939a6eef54f7f036f7402f83a0672bddfa29d73d14bdb954188888e0d9e0000000002000000000101d6e3704f74584c6f639d71fbb592d4ecb012822c5e5df5b7b6cbb7d433c6ae890100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be75c70000000000001600144fd94c83cfb6805526202ec9507a114031775a3d0248304502210081ceecd649bc619584a42f58dcac941314399435ed1023723a35dcc169ebfcf302203c87a438e2f9587a0248ed03228d0fa61304b339117a111f1bd15312887e7f58012102e371696db6fd0dc0c74042966e6168910fea6905ce58bf62adb91cc1012511d1000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0700000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340d1afbcb5e9cc8383a3c876f7fee0046e13a96b810b16cb23cff9b26a6b3e3bee43cf534b170fb9e6c352d5f1696f890e32e30e454f0844699821d1cb88ba01ae79207a2ee737ab58c3a1f8e28f3739480c9b9fc6227835478f5848380bad0092b3f3ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e600000000020000000001015328230fc5daefbd80f037ba1671f8c8b59ada879ed7b580f7cd5f274c2fe3f60100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be6a1500000000000022512067add3740e30f9fa7e06439a92f651ed51b5d1faf1181903cd4c35df34d5cfe20140dfd9df89163edb8199a820b8ed3165ef6260783cb3bd36aaf02d965fdc9eedd3f9ac2070abcafd31bb3f859df490111e04d69d16bbec9574e1b4a1d1edd7298a00000000020000000001018a83e5ed9afeeedded65aa6cb54f1b548ce1196ffd37ea5d1f0ca8779b2004600000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bedd4b0000000000001600143dc58515bba2aacb287550c4b6a3644ec6ab2f2d0248304502210080adabcc662fe035d354cfa6346e76a2106e5fda00f206b4c2457682a4b5791e0220616101e457ec2ec1589d85c200d7af01d0f6b134314a740e7f4412aeda05be3e01210246b83c41153293c428124a57fbf8a7ba033fba789bb7c28aa56ae47e071482320000000002000000000101831e6049b8d48141497de4c1eda62b9a0de86cda5299d7484b849f4a9adc06970300000000ffffffff02767500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be363b000000000000160014e6ae3f704b5340a090026dfdc4975f45ac08dc5202483045022100859a123c56b535e607b677871a12f3a8a95ad98ce1e4455ccaedb31b8ba2a56602203fe1a89066e9152d08428b1ee496bae1e14ef9c5f584b623fd402c7a36967bd2012103938d9205ee51c0e13adb697cd76f0c61258705570d24dff30f641cd4afab55fc00000000020000000001011d6a5d52e73785b1b856695139baf5cc26c9db7c7b3e4bfbf5ec237bcb1972390300000000ffffffff028a7500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bee9780000000000001600141039017073b2005a9a4396e711ce8f6de0ca0c4502483045022100d43b7e8e1afdb8ea0fc940b62286b1b99d39b1c074044e8efaa38427be18270b0220077c7a558872d9b3144f1a9945995c713401f9878aeb94dd86c084d99d09165d0121035dc108cfef0cb78c93340c064715b2287d6d0631131d93dd32abf5b7ecf12bd200000000020000000001012c653b24c67baf45e7ef9780299ce5cb7bbdc40637325192df210c36b5beff340100000000fdffffff02209f3ee30000000017a914633d159e4df339b202bc9d68b89095c5e6f2b49587cabd00000000000017a914130088a3eb590933f095016eb167095ecf98270987024730440220010c5db9cfb9fe1f73e7e228dc10dd70403f406e6bc8ebd802f61bec4c284a1202201cdfbdab312e1b0c71dd0509bbb2d915f9d9f3daf7e799be1ac980e1679b2299012102948d5f3b42f445167fdf9bacf9281e1e0f8041918c80f7b6e06265816456e755e36827000200000000010163986d622e099d9d01bdabd100516b4b9f02399858eafa15af9b9035c53f83f4000000001716001401f56375f3ee146b6c6ac25a4f4fc4331699b474fdffffff026d063ee300000000160014ce545bce24e19b7aa315de3548c78d07471f5a970f980000000000001600141a8b9ff30fbb879411c1ed588b1aac141a5bb09902473044022027fe6739ecab3a0b68148e8f3de0974b82ddf655d193fcba0c5fc3fc9d0abbaa02203ecce40ee60eb0ad7c6198905fa82cfa97ddb383aad000e0d9df8d23ff164af6012102d27e3036a620a96811cda94f6f57f48fa07c646c02b7edfe0be37cef02127065e368270002000000000101a7e4dc62a20382cd9af6cae67310cd12552e529575f117ea5c689a129c4888750000000000fdffffff0293afcffe0000000017a91463817672ca1f4cefdb9eab0f0452f58f0d8afc3c87fb5a01000000000017a91483b5cc869532058478700e4fa76f77068f1a3b6287014079aa4fb5148c61cec7576e44b3e5098bcea8ff3fc876df0dfa14a29dfaf9b0e185ff8a1322e0c576b483dd9dc179b7d00997207812df401f3a7256efe77ca40de268270002000000000101d76fc99b6d2dfa6136ff7645f3aa281c1fbd98dd435787a540de4cb29a4660f72700000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b62b0b00000000000016001429ea1cfe83f6162377dae11531814dcdfe3954d60247304402203dffcc8a5382cd53ec936d1e04a4230bf358582bfd15939e7a5e9055b3d4e63502201f548099da6d80394705ccb655aeef2421368160613f2a10d19806781c696f8c012102e6407be080427d437dbebc06e63b95ae3951a408af121e8f0f8c6dad35717c380000000002000000000101d327ed573eef397c213bf6b845949f6564fb9d0d61928bff88a3ceb3b43319970000000000fdffffff0226df389f000000002251203273866f8e5a507f95b561836a46c78c759d8909753e15429efb93842f27fb17e6a9000000000000225120e7dd45724d6aeb8574c37d0e4afadc4667f2dd3ef6d2aff0eef5e0a148de00e502473044022052afe0c677cc7d89355f1a1f8eb73e55e0ce64666b88436b9224e9aa5f36325302201735d73629eee0bba35cda312ac46b8896c78143b0266a44c15005813f4e2fd1012103da4d8becc1b1964bdd8a09f0d28ec897821b7e6aba65d257c2d53400addb4a26e368270002000000000101f545184aa926640ab3d3b1df7c2e5a8ae5142ac2ac5bb8268dfde1d472a838a90100000000fdffffff02fa0200000000000022512040e2ebea840b1438294549582ad30e6b7069467d0f78a7486563e92e54b691cd3c670100000000002251206bbb3e0bd930c04ae9b22c90c2c2ed50d69bc688be4edaad75ac98c566b9c13301408cd2a085614dba4e8b0fc7f3e2cd0d622f54fa563f55bfe1c1db4791fea93f4bf49f7eb99e4bdabb7b68a487fc1b477f4746e0d7394de2443b913619fccce50a00000000020000000001011abaef0711dec6667c52c4295caa4d17a62f7108b8876c1d0db09951cc5b0ae70000000000fdffffff022601000000000000160014e89f7b007c1c44b47047fc1a821ef2da17caa34eff050000000000001600147fc8c941f1bbb05943624fd8807d904bf95dc76103400f9edc72054a96097288780ee0f06b9be392f7701f2183f46b4f9d24d1aff9be5c7d18361a324581b896b59365f6694ad68fab5b16e571f2ece37c18ec77a1b67e205767f76b93cefa24bb9d259705053b7943a6f9f3772bbb52937c3d79ac603805ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800387b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a22313530227d6821c08dbd1c8ca2a1da9da0f28f9c5c29790f5b4260ddc76941639d18dee18d9d03900000000002000000000101fcc65cc2dcc4b6119c8bdc173df1a55af653f26da861e7cdc934c28f4a839d10010000001716001479c9419f8bd75a3609b662d33e800d0ffa8961a9fdffffff02fba2000000000000160014dd88ed8cbcaf415e395ad04388f1d5d325f6f40cd83244a50000000016001460601ae673a7d68bf1ab378625bdb3c408f8b6aa0247304402200b0703103d3ab6b439795de37eb99d25546bc25ceadc9714143fc0284cff71d5022054b9b217dd69bcca389ec103b701e36c2297e337ca807f72634486be5a5624be0121025e3122b2663001c9ada9a8a9513d3f399a438182548195e9d034469b4ae2ff29e3682700020000000001013158aaa2383721fd6c8835aa571e0f7691acda96dd597610094ab507a5fa26680000000000fdffffff02ea0a389f00000000225120c0408f35cfb06346185cecfbf275d3ae44dbdbd46070868bc6eb070d444affb6a2d30000000000002251203048207065377118a951c68bbaaf91d49162c35aa02fe80c8a181379d815e7e4014006661b86694a772915eea3b9340c8e44946222824a810ea47979681fa332a0339781c6ce962037646f3040cd219077179b8e5d8f9d4b98aa04d0eae16da087dc8568270002000000000101ffc4324a41396ef45bd508537cceab16a769b394ad0e9fc779c186a083636ef80000000000fdffffff02b95f379f000000001600145d66409d7bdc8031c875c0fa4de4bf42cca6505aafaa0000000000001600144feb74f673d563124f4a83920f4f8ecd055928c7014001a146eaa1b6c971fe754c41808fb2a11b5370bd23543a368148a9a6475a1f814c09d5d3f0ac315e0950ecfbbf9c36e2f81343c7c708b57677bcb73fdee85dc7e36827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0900000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e034055d6b41c75ba3372701e7a88e11a313b138f11ee2d65a71f73fbe64686aebd4b47206384f77ae03e76fe56ebeaeae85554041c0b864bc7a1587eee4f9a80d1407920e0dc228dfd599cc434b5710752a36b2f48711b393c895c802dfb1e7a625ec38dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000101af7d48681edd1e3b562627d45af5507b4c95ad175e0cf729f11f0f603a9693450000000000fdffffff02a172c41b010000001600148cc7c9b1ee3e17f71f52678962f8224edbcf72351f82000000000000160014e4264fc9b2788f3a3540f2c960873c0f06581e910140b95906a36560908547e88c0ca839338c9422750d049ced83fff4e6d2dbfb1f9497cb26c90efd68fccc37603ddf4c1aa0e13a79d4a2dad24fc30cfe7682f0bce4e368270002000000000101f61b9386bfb6bee9c8887722f70c025490ce16c7c253a19a906b537901cd06850000000000fdffffff02a794000000000000225120470a5b0c2a85e0d4123343280d3824141e93baa4dacfb0cce94dc2b7b6b6a8da55ddc31b0100000022512081708c4be79e6a6eaf4e81fe46c8a13334d4b6accbe1411a3923eef50de0150d02473044022071c3c8b0d4f3e878f244055b7412f95a6d777a1f69fe9eae007057f48297370b02203beffd20e1098d9579b0c3d435c7e1876c3d718fc5f2bae1297a986ae2fbd7c301210375b600acd5cabba34d74798c865481bde78bb88fe7549750b122cbfcbf1cc55ce368270002000000000101bc0a0b86589bb7eaf4a8833ebf0f5968990965d28f4ca797916a87b079cb1ec90100000000fdffffff02af9b000000000000160014601975a86a8202d0fbb113569f5c29428d453f2c2441c31b01000000160014f9da8598fd45452545cbfaa8ce659a2fbdd6129601407a19663128cbc44395b9d339d36ff0e3c9275a730cff192a8a5136857e1fb6fd9f6d6f00264888dbb54672a68f3cbc41f8fad3e34fd97cdc322c54886e05910a9368270002000000000101a49f01057ccdcc7958362b5b71206dcb908492fd4d5890aa2d9a9bd207e81aef0100000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be5616000000000000160014be180cafb3061701c8aedd396b754e1803bab9f102483045022100f9554c0d074170a744b0f9d12a2a26c7ec9d9c22858cf49d0cef45655fe7087a02203b44970d9668c16585e40bd1e3e74ec7cfba6d6429cc244c0e3773dcf52602a3012103be44e5fd9f598c3dec3c565eb6ec94c9e79f6ce7a7ac2dee72ad85737bdd9cd60000000002000000000101a4331e21e531e79d1e7377cc3223a7507658d97c9ebf784e06ada6f3c667d0880300000000ffffffff02807500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be7e98000000000000160014d1beff06c05cdc6d3e6e0a625747592dbbe2c89302483045022100eab145f70f00705c9ad29269afb3c89628c274346bc9b1e747603ed0d92fc03602207e5a5dcf0926b49d0bbb34a7a5f61ce7011619306e83bd44bc6923272b5f58860121033a6cedff3aab8e085c46e1b991df6caafefb91bb386425bcde39ac944b30bd5f0000000002000000000102c0e770b28dbcc76f8a83f40ab9e1bb471b336a2f781b6811afd2dcdabc3133500100000000fdffffff762a983332405b5c358bda70d2952202081dddc441270e737f61b4460dc163e10200000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100f3b61da564c02a6443e67a9e7a606155724bda0748bf75e4b5ccdd97dc8c2bce0220113bba2dd5708b6a90e800a461769c19c86ef465e9970e35069f6965da7715b2012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02473044022052f26266b145c33862acb041d78a6472c7dec01755393272d5e2d37e0a5de77002201aefda08db18b3c2485ec60693a8d2c5f0ed8c423416889b7d3fe78609d87aad012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a00000000020000000001010aeb0c9178e161eaf50b44ec181974a23b6c06ddaaa50e64a677afedb0e272df0100000000fdffffff0242be000000000000225120a347647968732e115e581ddf73f0bb4d0c441d6b4b86258eface3a4abbb3fe6139b23826010000002251209b7f1776e789475c158d041675edcf68a3917ec7a51a47f85ad2d18ea9f70d880140e9bf02b8eeb8c39496b929b54acb348d9e4d01d05e950595efed4ec820c0422f154beff151e0776c370528422b2ac24b20d0db68bc1298728a3c276e15a3a8cbe368270002000000000102ad49d9aa34cdd3f85aee3754cac36515cac48c7abb855868eb26f9ed5d7ed2c60000000000fdffffff78644ce885e272d0643c4fe8a1aead57a58483eacae28fa3a2b9c9582d11f85f0000000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c0680247304402203b6615bb3957177cb501e701fe9b565dc0b7a22b5cc8be66fda45624cab30fca022034d37f7cfac976922e3cc6a0826f0f7234c0e0a143f455cdd298f2da4386bdf9012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0248304502210083b8cf490e70dea6d59b770f461c697f895f2c4032072f5f31bb76c43d40fd9a02203d5c7adfa4e5875b409f842812de07c4de0a6e40c7d25de90774b3b30e6a29d1012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000102b73f5045803995fa185952290b192892a25271bb7b22dbc97926f732566a36970000000000fdffffff7002eabf1b0ce1c3ccb759aa1a0fe72c8e496c131d3988a23e3c4141c7a4d25d0000000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100f99b1a12b175ba7592fea5f4026a5aae0082accac148660b7e69f3e35f52474502207abf679b777048589f685fd38b8b56f3c6393082633c88ba8b1cf580f69776a6012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0247304402205983aa0b72245c577d8d5cb5c1f6c68f09d0ef975d1cf7d61a457965b2811b7b022029a9cc7cd22959fc56d9d32a543600eb7b7226c7bb2b14245f392e91bd583245012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000102c0f215721437eaf0ed661831002d1c0f0c5f8f3b731b61249703eea9c446d4630300000000fdffffffa43d338a4f37dcf04bb92f766f14b5f6f9823aec88f83fb97689b714361f84e10300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb6f5200000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100a2d3a9a19fde5aee61d701ac648d9644b35ff116537cc133aa62be9befae136902205c2d226002fabf4d98d6eb3e4ad935805a8b64b6667406a1db77fe3f47023c70012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100be0a1a0d5bcabb4392b7ab9207ae826371bf281265d9e46d835130e793ebb01f02206360921ea190926222ae6b34c57488abd76bfbcc0f98520df523e720cf2c9b72012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a000000000200000000010131db3d95828cb75619c2210a81088d2f9114d3ee237f3fbe41a7abeb27806df00100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beb7fb0000000000001600143cbb0721a84a20e3fcd726cc1d8ff95709cc6e1002473044022042219035d96009a65a678f1a5f8e5623a101fa18b222488d6398016128b32bbd022013c041be78b729fffdf0fd6a4a7ecb5324a16125ea702e69000a55bb3d60ccd20121027cb2475250878b83c9f8d1760f1bce2966377f622163b87ab3befaa6a4a29b2b0000000002000000000101e012d707331cd98d48c17e6eabac4395eb532821c053ee4335165448181d932000000000171600146ea3237fa25299869975ffddde7edb245cd04eebfdffffff029ca4000000000000225120d4863cdfb524e1335afd36199b9d68f769b817ad5ecf2652932b04b3e01056627c728ef400000000225120adcaf86a605f6d456c066efe2b3dba27cf742472f317ee1070f12a9da53ae93602473044022002a58916981497e83caa3ba6bf458b9211d119bd015cda24c91f5c7cfe06ad0b0220475b35dd2925b2caeb15ef34e8b5653cd9c0f5466b6adbebdc0391eccc31f589012102085cb005fc15e5d590c473929a158ee37b999084eb52931561b10d95b371c587e3682700020000000001010b20892e00370969f957d37d6a08765b07b8be722db7aa19e75fb83ad10b9ea601000000171600146672ee7308ebac1f2c92f1d335486e8038e560e2fdffffff024f8b5d090100000016001445f3b53a39a70898671c75550e3d0c218828f1a07ad2000000000000160014b1daf647aacd41aa9fc7a44f038f2d16d2588c27024730440220091f59cbd2f1f846f6c876e9100270468b65f43808db807f9fdda67606453d3e0220590a81525508b69cf41102af60f1067977dbefed51d8178e8e9f6289fc8cce65012103ee1ebc6bce2527cc6aca0e5f15684a891e7eb4e3f539bd500272239dd5c1c269e3682700020000000001017a846e0b163fc6985092c3c4f0ae83b78343e5721b04bddb523618f9717dda570000000000fdffffff02e2c4000000000000160014dc4a0c745b7420621e41b87cf378b82984953b13e0c55c0901000000160014d1102e4ee4c8706935298ef48c2df8e6f541884e0247304402201c7723448e03ac4c5f774cd0cd27f48809970122e00a1af5931fb7110a223b7802205ab066493c7f3872d5747cbde7006cd88a81cc169fed104ddcbeab2b485849cf0121020ee54e0fe098deb9bac9d440ff223b90920c2b615e474206da59fec24497e96be368270002000000015b7c1d9cd509dbbc431784cede36779459f2ddd8115dbf19eb1a14a28c1fa0c0000000006a47304402204203db69990bee87878daaf70d001feab1f762bd1e793b0cca8a2bf7dcc32932022055d7c40b56c8f0ff9f0eb2e744db7cc9576c0a568e5d5b42b14bd79d512c1b49012103556824ab7f08e5d6c159faf5a4f403d1caed9917292cc0bbcbf9db90885decd5fdffffff0211390100000000001976a9147249655e41dde47bc99a96aa0ad6365103ca021888acb0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588ace368270002000000000101188d04fb5a6c08b8d04e56cc17535a7ff4b1492a68eb076bf793e014ae30211300000000171600145897f4d8d715763d3da3b1021e51cf6c491b2fe0fdffffff02e698831500000000225120d8b4d2edd0881b6a7ee256d8b9940deebd458038b6372fe4324e61d944c1483abdb6000000000000225120a39527bd2753fe2ff76e3216028ce3e905e0bc259825425f538b66fbf10ba1ca02473044022073ee8689656b3fc41c5a202b02741085af60a3b3308fe534a58bad7883151fc202200f633793e16fd56f05cdbcc93fd4bc4347bb52309f4a80e356b4a023081790f4012102921d4260496469da7d24090a3b2be9f855edae0497f0e9d39a244252100b8532e3682700020000000001017bfd9900889b6bd302a66a205f7e398b71851c82c5102a6559b396af19dcf2370000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be267d000000000000160014d5bc4779d68e8dd3cb9b8c6497fc96c37320a9470247304402203c09affa8eb96811cd84fae14f294599dd6c7d5864b331d6dfd9b6d1eba8a358022035ddb4e693d14c8a19acc796e002f0d7a6ece191c4bd9ee7878fb83c62ec4ac8012103a8fcdd502d054a6b287bc1c190b3893d08e99fad896d4cc7c5f67321e2929b5300000000020000000001018c8989eec5e2c15c669e583cd404e88541229cb36100ff47c357356cd3b02aa00300000000ffffffff02627500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be324e000000000000160014d911166d1eba729cd4d8af70979913c09ce1604d02483045022100832c60f0edd007409120baa3587c60bdc396cbaf11108ad49bfd0116dc0305e5022005a4aed061f7e1fe9836a88649527982bd632ed347932b997fba62433cfb61fd012103fcebf167c11b3e7165ccbbab1c55f4983575578d8af450f6435caf576d19114a00000000020000000001025f9c0a87eb1d9ea3db47d461770be72b665a1d21bd825482a0cd765594c952e40300000000fdfffffffb26e89d059ae5be75f1ddea7bcb930f649632bf3b07137764fed0e9ab0b62d30300000000fdffffff0450c3000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c26000000000000000000000000739ce4e62c73263996b4c031b323e7fd9c9b6bbfcb9f0000000000001600149777e4489327cc39122890a6ee33ab4724f0d4d102483045022100c8d741f54a619deaa23891c20a4570f8aea5d65b24086da856d1ef1456e8a56f022012278cf1b9f0949209ccbc7b7c37005368ce96b2fed6937e5798ac31d8380b45012103120aea8c827a2836812ee32a35d32979609275a9e8074800e6547a69b49cb69a02483045022100da29d766fd9ff72962df2a4f9770258d6591f5ca7027f61609dd834b8e589de6022061b647704ecb2c2246a603c93c01e2e71e21a08582b01a38c10c6e484bc794ae012103120aea8c827a2836812ee32a35d32979609275a9e8074800e6547a69b49cb69a00000000020000000001013e829c8228f7d93d372e55af95173ef04a15d55869f4246f89fd90415f39864f0300000000ffffffff02807500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bef8700000000000001600143337584e6d2ec6dc4a78fbb205a4367167a1779502483045022100865f31f903ba4072193b1727a8f1516b7e83b6057cd0a96ee46ca9fdfbb78fa50220524a0ecea9018dad8f659fee9b64ce94c5af3e538b5a936afc33f355ac1a35000121030e02dca25e71f3b2f156950040c95b2a89701b09c0a8d3f25c51c48871c48bb50000000002000000000101f7b37790b75087bdbd8c65d27ef7503c931772a13fe2fe5c4c8be968f5a7156d0100000000ffffffff02409c00000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bedd210000000000001600143168e90db2286b8cabafe700f6a77000fdb36a0f02483045022100ebf7b81e077ad952e563567860604baf09fdd13552771f0e6ebdd156383214ca02201d7ee042dc7ec913523363db6aaf94f70dd2e3397d30008ecd2024f75f249a8a012103df6e0e5871b40ea106f7e5c2e25be9e5ef98fa8feea93e4545af3b7a5824c1f80000000002000000000101d145dac11698425de353f1947cde63234b916108703102ef6b150c9700ed5d820100000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bea80f00000000000016001470bfd6836f9bf669f05ee352424b9bff10ec431702483045022100899309168470b4905904f84e31de185b8981f0f299d8f73bb540723794d8f42c0220184da46f78fc3294bfae43447406aa34d66628009874dea206b2080a80b0988e012102d58d2dc7c3ca13683b8599e75c384f1b73bcd076f7248988621acdc692a0729b0000000002000000000106c34c0459a26e5b54f89facf3f55bfeeaddb2d9384fbd740fb7c64a4babfa61350200000000ffffffff42cf6510e7299b89dbcc7d3a3f1a76692659b2a1c4c3f82402a400ca829996f40900000000ffffffffb3e5734ba30d1e24a4b28e567833bbb5765d7966a6c2c79a244746043e950ca50100000000ffffffffc6232821172eb6be1202b66407fd9d15bc750e6fc9fd4ed893daa1829db437b80300000000ffffffffd4e7adbb242676d2c4758505cf8747f774fd3093ebf518c99f3c35bb063afa8f0100000000ffffffffe6a4d23164b88f04284f3aaa89eb7e329c00b4bb03d2f8c3d5272fdd6ff608520100000000ffffffff01ec260000000000001600148cdf2e9e451456626f2bb4b3d808cfcd4e85044302473044022033c14ba51e98a13d5fe4aad1a1823c597bc4daaea1eae080c950b10a3a5bc0fd0220223bc4bc259c071008a77521396628cfe851d419b87e42376c67fd9c7165f2d4012103a9f7136a357216f3aff7156eccb3f7b1c8990e254e318fb021c82c182db4f5f70247304402201c6d2b429cb8109a5157475b4798cee5481cec18556dd0a97b860b976411cafb022046c332157b5020ee694dee7c634524f3728da84aa9309737b9bc5906e43877a2012103a9f7136a357216f3aff7156eccb3f7b1c8990e254e318fb021c82c182db4f5f7024730440220675662c58db26cb7161b52abfd5db91f682bf9bfbdbbb0eaf7e1f9df10d12662022035831e6ca7991840cf57bd7e97573313d195e6d5584349ac087d3cdcaef13854012103a9f7136a357216f3aff7156eccb3f7b1c8990e254e318fb021c82c182db4f5f702473044022049a57ddd45cd4bc5d5bce5cc007acb03ad33b7dda694a688fa38526db5fd83cb022060c26e51aacc7ca6891b256a57d8f6618da78b439ba1948e7c0d73c21a239f26012103a9f7136a357216f3aff7156eccb3f7b1c8990e254e318fb021c82c182db4f5f702473044022038fea3e9f2fd89f7002b35222338c4c146c802978a64bdbb0df5ed7a4e0f8923022028749a8e4a588a39f7aacf9f367907aa3679de2eced04126c75ea2b8ecb4c576012103a9f7136a357216f3aff7156eccb3f7b1c8990e254e318fb021c82c182db4f5f702483045022100df0291eddf055551e13e69b73982cf99e63b61bc148cf1e9a0af8f7892a8674e022075b62e95e012751f71cdba8f1278c2812cebb6f861454afeb3f9aeac8de4b5b1012103a9f7136a357216f3aff7156eccb3f7b1c8990e254e318fb021c82c182db4f5f7000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0e00000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340239f0bf7afbf5a24c99620d53696edeb405c0cbed8eef198f21c37eb75cc8a359b4ceacb41542876407ca2b978d575f70a7aad3f89f797bc7463eec2d8485f697920469896f75535f4863121aec04ba4be55f6f70232931eee3ca0745795820cf5d5ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e600000000020000000001014c8ec55a2c8df73180e2c8ce1ff0d0db076992bc7a2d288bce8b1c8741ccb2d40500000000ffffffff012202000000000000160014555154c233dbc5ffae20719896167045074cca5603408bea72c13013861e9a51e0647500bd375fa2546d1fd1ce82c69586323057908261ccb116a4f99ad9f50b26d51b56d6703bf8ad2aea82e7a35e426a8fd646b8297920510c022b8c5184d0ae8cd71672a1dbe7bd705ef2335fa325606bb2c4843cdfcdac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c1d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc40000000002000000000102388b1b45fe190b49c51d7f90a04742fd1cb3fdde8c25f5ae108d96983ce734c50100000000ffffffff9cdda9989b3a7189f46f4da827f565321601dc080aff3da68b0d4e2e74501dbb0800000000ffffffff012adf00000000000017a91407da60ec34b284351d91273ff764166b628edd92870140d9b18d5f48b3d72f5fe9e6cebbc2c4e692f854d60d5c3d71efabf2be4d752fb8d728c996dc80cb66b0ab2c204475868a59af5c0fd59f4a29b60900fe9ce961d901404153ab484ad9ac3c883483b7cf27f5ed1009362512eb7da709bf3b6f1241ce4adbccf6d4b0b3acceaa1e91c749a5d2f19f410f9f79baf37fdf7928883b6ff5eb0000000002000000000102bae282963ae2d1efb2477dac1960d5a938cdb2e1958ef94096c0e08417da9b860100000000fdffffffbae282963ae2d1efb2477dac1960d5a938cdb2e1958ef94096c0e08417da9b860000000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100aad56bf9b1747b7381dbff8f874137c96d9874e2ad1c9a9faf0066544c84c16f02206889de9f10f298c36ad5d5c6e83e9ca8e6694cf59ef55bbbd4eb7dc1468a1b9a012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0247304402206dc5edc9c55514c120a76f2e51f8dd4b534751cedbbccff4ace26cc80148d11e02207ec981343b881b6dad73256224c2f2e8b2b6c0818be33ea2a3ce8e0799f718b3012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a00000000020000000001024c263cee9903929ba2d8a64d1606e5f4bf11f6d9460ada0449c049db9ade61fa0000000000fdffffff0529be6b959afa674b00019c4c231dbaff56f1682e6f4537c999cfb7fe788ab50000000000fdffffff02970500000000000016001422d7a098e9050ae28958807151c4b4532dbf59aeb8120000000000001600142502477d1691819b880acf898760066f3d56974b024730440220682f7f531dec3c8c010e6fca637c7c4edb99742bffee82e668cac0f4ade117e202203a62fe37b31d7da47dbcd20c05ca497b3282fa4d99e5b25890b6ab0d2b57533401210387cd47b68cb4744861dcaaad329b4e52359b2fcbbb9c28ba03e258826fc35b4302473044022029a8e60ce0b34602c4aa76bfa17b1c1ccb5f1c4d1faca7d25227bedc5e96e09502200fc8e49db0431fd7ea74f4d4f36d940678d19acad4b72d5c50160908aa3a034701210387cd47b68cb4744861dcaaad329b4e52359b2fcbbb9c28ba03e258826fc35b43e368270002000000000101e069f34f11dc094415671d52e050cb97b7ec57f48c830acc011dd181115d2d590000000000ffffffff02d0070000000000002251202a877c9aa9e7e051722b0ed8ec457b554cefc6862068916a1bd2c15e1b50e756b745000000000000160014d0d77709602d89f0b70b55e1b5dcaf548c4b399002473044022008e459fddab206c84f354da5d8c1ac7c8e141931a81a8e3aa315c820e8a852a9022043c5b4abcab963a52cfd015745b3f6793f79c7c96f02af93c89c980a6fb8a364012102a9fbdbbbb17af2bb5590fe75e7a9e5cbe0249b97960347a68b11b8a6291efc51000000000200000000010163499b86ea1412de19668d0c6513bad01f43ce11a17eabf84052c20dd8d7dced0000000000fdffffff022601000000000000160014d0d77709602d89f0b70b55e1b5dcaf548c4b399000060000000000001600149248b3b9574b17ff9d2200e465abdad6990449c203409459d743888afe324d369fa3d94e4b989faded82ca19bbffe8ac88d52ead86b855ff3f017be617001f14096614f26489a00660cc904690b19f53811af24c95a87d20157d87712a2b94a5261010394fc7532d0a2ef62904767c6b34060b5f530ff585ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800377b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a223232227d6821c063507dc5b30dba535ae79d193bd822f8d8b77334c2975898e2a93fb7d02c9fc30000000002000000000102c2ae0fa4262a2670428a138e59b0e339c21fb766f60fde459cb466bc5a62e2a90000000000ffffffffe4d54e98b774aa51228ed9e74689ecd2c457b733c93b0402900303d3bfaa99100200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b10250000000000000160014698654312e55e4ca1561525096dec3e5418cbfc70247304402204f4d019e49ac780a76d476231a074654577c128a57a062d6567e459036e1052f0220209e3edcd7c261519aeaa1780afed210c4eb2fd1fd1669a2af2f9cf2c0121aad012103cea91b97168d8846e1450e25b74c01b47b52aff71e5ad940ad5863d0df62e2a402483045022100e6f0033c1ffc52ca35ca8b7628bb3e28d436e55210462e7c0f6a1d0827551aa3022019fd940889bcab05447eab55270ff797a04516ebb44ae111ab417b5ba38679f5012103cea91b97168d8846e1450e25b74c01b47b52aff71e5ad940ad5863d0df62e2a40000000002000000000101d5f314d767d5d44b367228534af286b93ae5cdfd8b6233474ba47b4055c050460100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be1d580000000000001600142f2963e744e263cdeb739d4ba9ea86c442e3b49e0247304402204ac226ace6aedbce6e1ea3e1c6a31cebe3c28317ecefbc569fe3042a8e49efc0022051f0be6718783f4a901bbe2a856687e954c012bfb1dda07c79e5fa199b4d59230121037beb1a291c2c08369e5e85b1ab41972a67bca862e674cdbdc151d5863ed5d9b0000000000200000001c1c101d4420205e1963c5321e0901a1c52577538f0c6eab4959bf75d56d1e211000000006a473044022076e3c90e1d0f4dbd6ae9bcd18b581e5bfac5139e1c8a8f4f567465e925b794e302205d6b7b48928e5afe7abcdc762726d3644a2dbf04d57b298df2eebbcadc2d719b012103eaceda48eea91563004853ba625304d96337a6da562b2f001b70c400dbeed6c1fdffffff02ac6bc4e900000000160014d28d088d04b5a3417814f0508fe709a0eadb5bd113b40000000000001600145b96447c5faa178b66705faa9dff5a2c6e6efbd5e3682700020000000001015e3caafe854fc5a85cab9b04cde6eab48c7b97e619469c45738ca772e719b62c0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be990c000000000000160014db5889079160923e82abd3d75d1e75adb3fa5aee02483045022100cb6b877e9376a6cf89b4880e45030226d92ffe985820cf80f0eb7984d74cab4f02200ab659e71013658ff2c588446dcf1e74959a7adaab53980bf6bde7d38f71b35a0121038ac1487e49ff7d7d68fc15e45a33fa4c65d313ea25ac8c515395526e4bdcdccb00000000020000000001013552069ea159c40587c2f2b93b27c38abb3cd5320117ffd4ebef56b51d0d64240100000000fdffffff02209000000000000017a9144644fee66d220d7ea8d57f0451ad43596e4ef95b8729a243a50000000017a914d4aa42413db7d4cd76ac329f9259c7bdfdaa2066870247304402200781e101f90dfe9955bf981729bb7906756b72ed119daf92f2d3123abd43f506022078c04dd482cab08edbe3182bc93a2a787b9c7627f3af5de1ab5f9086b0385e7a01210329670a34dfc89be93b3a4838068e626d6443f4553298ee367a04badcf079e3158868270002000000000101760761a1fb176ac7ad44f836cf0a93d514d37550fc0d993bb274f857697e28bf0000000000fdffffff021cb2e9a50000000016001465258eafaee210481fc0edd25bb4877925a94b33cd8a0000000000001600147e6e4a6569d7c46dcb47c20cfb55652eca362853024730440220096f49cff6d2fb8216c6968447e69eb59450ad14889676ddb2a5e007cc811ed702203dd7e643f14da64d0f2f482f4ff5ccc3f57417d0a4640217f712adb03ae0e345012102877bf97520672cc56f4fa2a80f9fd195f0a26f884ee06503da58a78edd170fede368270002000000000101b53c2278c41b634b00c157368b006524c1ceb2eefa23f2423a5c9e1c7b5bd4020000000000fdffffff0216f4e8a5000000002251205b166417617084c667f441765c5632ebdccfe292c5ffc75c00bedfb21a21fec461bd000000000000225120e9d58b9368e00e08968cfbb88c3198a9ccf0d66f9b5836553ed8f39e84e6de4c02473044022003c9c960b7611a2191ccdfe36b77e782891937c70e035770a00f72d41662648f02203e88268116f3662b5d45a07aaad4b9039425ce6a109dc29ebeaeb6119eecd4620121020d7b20909b103d7934b566a02ba5cbe277b50ad59636e1f95945ec4fdfabd0e8e368270002000000000101a0424d66c6bf6b434d59f8b955d19826ee1ed218eb1a22f6763d9740e16c5d520100000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be0c14000000000000160014447d90fb9c3fc342371fff3d8594f3d54b041dca02483045022100e0759bc0fc34ac09c0fc7d5d4dc5fa455677f2b1148e0460d241b9f68584ed9002206caf8011db51a246121db3c193772b34197b8423a1f871d615596cd58ef3a2060121024e23fed5ea86867a9c05920dc3d6c1fe3132ebe626e2dc91c423629dc3b13542000000000200000000010227be1f4c289408057b58f155c69efa73a290aafe552b52ec32f73485a643731f0100000000fdffffff27be1f4c289408057b58f155c69efa73a290aafe552b52ec32f73485a643731f0000000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100f28daa2a12f69fe06a975140b2d277951a2cd2cb266345a037f962682680fa6b02200755694b1a3e0b2ea817026def9daf242abab7e3d94a59d9d3f525dc520dc269012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a024830450221009ce38d0c72b3633ca206fe82cd1d03095eeb96b8e644d23a3079000ab0d027bd02203e70e102bb0f46ff05e044005948f3cad8720784a1c33fe0414eabb714e55730012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a000000000200000000010227be1f4c289408057b58f155c69efa73a290aafe552b52ec32f73485a643731f0400000000fdffffff27be1f4c289408057b58f155c69efa73a290aafe552b52ec32f73485a643731f0300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c0680248304502210084ebdc12f74ea3cfaafcec08188940af38098204488e39b3eb85af1dffaead700220484881b6248594147961565414201d0aec134a5a7b9bce84a234cb2e41893c18012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0247304402205190a7b3f8ab4aa7838903cf71b3bef7badd72f4df18edf6352c7a49a762ff0b02201d810f09d1ac8df4eed63ab5ec5a233d5b77bc59f404b383cdd6fdf0d16d45f0012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000102491ee2753004a376c3af4d8ff112a9e80c4ef615d7e679b03b2929fdf2f0bd220300000000fdffffff7dd4e946f05cd343a6505237dd1750d30b90b3c1c556549e2212b42f448bf09a0300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb6f5200000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100b7e81d97ce81533821e247d0c820788a6d4720dbf3c4ccb77bc43f77d03f493b02201869127b16c8fb9769e5973f5880d550016eb15d0d9a287da40285e0d7014e1d012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02473044022038d5c0cd6951b705bbd165c3f6062b07cd694be6b55fad198d7268f148e919fe022070c77c57c3fe42541623af6fbc06548345da8ad4a8fa4e3ade38512cbd571bb4012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a00000000020000000001028e75ecf092fe13f1ee995e26a9613bb7a12afca2758f129630dad8927aa687580300000000fdffffffb77c542893e3b9ba0a946594a3c366b10c99ac892fd0b1874dff7a31620347540300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb494800000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100da92603fb60caedeb491436a1f957daf71e47b06ee1688985a7233e1352538e002203001d96aa53211179ffe2c7cc1b0155104bb1dc432a741af1cf889b52c7bb41d012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100c317835d67553826d566491f7d1631ab5dc75ece7182ce7d5676c1517daa1334022030bc1f6a136f14e44f7b78b9988f93ca9dc6095be6c844650a61eb724bcf0777012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a000000000200000000010130e3bdcad85d672205f60f982b2c63b18c635a4f3f89109e2ef38059f6ed614400000000171600148b0d856698ed751ef87650ae130c30d1653dfa60fdffffff02e8f7cefe000000001600149ba67c8fff2448b70554fd19ba007f5bb61650bf07b7000000000000160014bdfe8a74cb3f1bf0ec09af6ec18a442c644cfac002473044022034bf4d46b6e876a9e3abbfa4b38719ccc35aee381c6d63e20091112827d140da02200d1ef9fe834d3a74770dc153791c737b96d3c60c9cb315d61c52cb69b2614aab01210232a732b267b95e33d4adec70e0d085f9d2a2735eeb7c0e4943abc9169724edd5e368270002000000000101dd629cbf0565228da8c9f6d5118f5ee2204b7a56c4013eb4cc3e9815b9f188e10000000000fdffffff026e42cefe0000000017a9141a3e741ba094174ae82e0c4f67311a6a21b1a74387ebb400000000000017a914795640835ad4a5d26f4b5ca5f89f3874c57c75998702473044022060f6239f442ec858513f5969424ea3e7a161cbd1e2733dcc8d513c29f3c99e8c0220148803714b91c684bab63d8cea7e1a62346fa66cd8b3b7aa5292daab49e27b22012103f0f5f78c750b0201453fc3cfb0229d9036368fc639c0b99bca61041c3d614673e36827000200000001577dc8cced720464d768569ca95ed0d48aa08f2cf18bb309843bfaa3481b1ba6000000006a4730440220779aa72d1f01ee8d17b013ecf98a93f183f93e056d25506b50b6b4167ad26c3b022002a04092edded3edb89b1c8d1e07f3197ca2d62fd26703edf1f6c0015a62f8a5012103c104ce385d34aa2bd032e24a074e3fbe82e876a0dc37c951782cb0bd97a1adfefdffffff02a08601000000000017a9142445f744fd24823cdaa80be945faa8c93151e965876e500e00000000001976a91479a1d34ecc728f93ba5351fc0adade91c14a2d5c88ace3682700020000000001010a4bb3d83913f055d9bd4a539770b54f7c900d789fac8ce671335daaf1d9924e0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beec8a000000000000160014efad4841c7959d88b53f68665c709a50dad923100247304402203020367fc472fdd4c3ceeafe8777970d2ec5073e40aa785a092bcbe48da4473102201546406544cd3c9f5fb4cd222461d39bd1ba92b37b23c470cb6ab700edcf48330121031f032d9647c5a5f79745b89fb16837b287f98dad8458db3cbaf66525e051508000000000010000000001012263c4e4c7c07af2d1b94483065fd86cda9c705e75eef8fee6a83e4feb0d605f0000000000fdffffff01c1010000000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d034006079eef1e59eadd0dd25dd9739c5ea49dc3b2bb7712854e8bae2abb91d7ebbbfa98ac7f8b0718fb4f89b247a90c2a73871d3fff9be4bad8e57d4faf33bb91ec7d207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800377b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a223130227d6821c17e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0000000002000000011ebccad34162ddc6074920c35e5f9e1f05f1f1ffa74d44f174cce1d1068ab9ca000000006a47304402200b039a796f1e1492499950f053fb94ea4c8e6f971321d8862b46fc71210783e8022057a436254976830301d55a498d380d30290f364451053c7005cf442c7e7092aa01210262153fcd0e7d61d3c63d1d696618fc4cd1ca472778dec054fe68e9e7d963fb9ffdffffff02b0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588ac984f0100000000001976a9144ee00fc359d4dba0d13d8d135ddc4ea9929a84e388aca0682700020000000001014c8ec55a2c8df73180e2c8ce1ff0d0db076992bc7a2d288bce8b1c8741ccb2d40600000000ffffffff012202000000000000160014555154c233dbc5ffae20719896167045074cca560340f472164b43bdfdc64fd1d80ff26080ed59a998c32f95dc216d5a8492343765ae765b568d495f6262e1a43bd0bdc609e235053760a06b6b6a85b3f18a6c4369c479205e903ae05a8ee3fe8f66e2ae74b50a1c051b3d9d8f9a0ec58bf4b2f81c370d55ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c1d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc40000000002000000000101196307662391e4e4226e07b33e93d67e01679312599a16fd9711c6cca32674a30100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bece02010000000000160014dbddd4a76fbb7c97cd74116066e016ba8bce7d1f024730440220481a3c691d183cb6911ac1dd0416a30ae577422d657f043135ef3f70a2ba6124022028ad5dbd06387baf83f73be38733f53ad7d849cd6c68b6947fc3ef71e462487b0121036f5e22890e5253adac05870cfd2bf1866076a6ef92e7b09dfc02c790ba75285f00000000010000000001012aa3c08487b020188f32eb5ef6c6aae5c9e77a3c0c317423a0ea235f58ca223b0000000000fdffffff01c1010000000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d03401d1c96af7f6b0adb5517dee5e71b89f728f002c66cd3f476986fed0d590c0d4a40f1f86b7a338531587a87f098bb9fd4372375ad1433a4959c0b7858a28e57617c207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800367b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a2235227d6821c07e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0000000002000000000101eb608f0be8a11713ab7c1b979894249c39989b10e45fa6c5bce558073c7743200000000000fdffffff023301000000000000160014caa8a4e89d17b8f944fa555512c2aa95c3f2cddb0000000000000000226a2024d1818b40bd5041b55bf3c70614f63e854d11522efd9f745b3f0dc79d8b5957014009e2ed9c360c2a759d95f029fb5118614a5b4b2e89f520f0edc5fd3e6e8e70fb270926dc2bd52adc009c6b3351442bfa12a8f79a22fbcd5022161c343baebd5300000000020000000001016c8cf2021d291dc79f5cf6fb4b61857be3d62842c9e885b7969242953c54dccd0200000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be9d47000000000000225120ac8adfb521292af127a931fd40fda0c955c724d9d377d9ef2ca731d7b6efb8ea0140b723dadc1f41933308f1815c010e4b3132834f72a641741449e7569a34ac2b189fad53bd6ee9935493a0fbdaea8576edf4421b4c053d028d52030d30b55beb480000000002000000000102b044eb5474ead913234d3ea42ca302ddbb2ac5d48728c7dc533983609b3eec590000000000ffffffffff889f94261b90e2a0c43ea842a4a87152d5a566fddf5ad7875faf2574e2d8d60200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b1c88a000000000000160014a971c23bafde2e79cca1ad66861f5ddd0e90b9be024730440220635f8d8361b6236dc78d801cdcd3c678d1f0d46334644cc88c6f56516260c957022043dae18d29514438311419bcdcbafe33525d81d515a2f620407d506ac43e5e2e012102112c6912661e064817e77ff261a3324680444acf57dd3caa9aff861a1d16e32002483045022100d5d4e7faec62150ed65e6c9b9c7b6db4f96d702e0b4f5fc040433f848eab818902205a57a7558585594886ad343327d49f458363983e233aeeb0153d1a2fddc3ff2f012102112c6912661e064817e77ff261a3324680444acf57dd3caa9aff861a1d16e320000000000200000000010147bf3b0670ea738fae90bbb731be1bf16affb84d99254d9cdb7b3ec6e439b3ff00000000171600141f6a34c13ce4df586c046ff4a7b976867ef7a3ecffffffff024c0400000000000016001460426faa653c536502e0a0d35658d0ba259a63b639da00000000000017a91407da60ec34b284351d91273ff764166b628edd92870247304402206b7fe3099e8c8044099c54d37dcf5c0c442d61abefb931f126728c768e47e99d02204268f722bbc3b55a8c8f1f6c467bfa8650a058e06efc26bc4e86548b355affa7012103d23db7f497a69442e1a0c87bff4ab7c662ac1fc608acc033b3114cc031816fcb00000000020000000001013bb3c1777b95f52b83c2826a1e62b5039d2465481fd289ce3a587d60d94dd36c0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bef7ae000000000000160014854be78594803ff2884a73bc45e8e70107d1bdad02483045022100ecd2e6ad17001ec85440fb925c6713f51cc902f7d2dce589209d355805e7e58902205fe28d93a09cdad1801afc67f23bf2298de2d43e99f220d155fcd3981ded5a230121038f404d5b9725b6d46201194a87ce08edbd2f888eb4b6ffaf58445e2665cc91d700000000020000000001016099314e475dfccbbe721c586b86ba58ae2d16fb36412e368150765d92945aa20100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be212d0100000000001600148ceb8bc91da58457c1f2cfb198ac251db4198e2602473044022041d3fa546bb7fce10c67b8fcf58291c89e3cc853eadfce96369dbebecdb03f4f02201daef30eb3fe2df83f0c1252a59d48bb156f94efa864bab572e46ab6c3698eab01210250a548b23876221fe1cee54567eb11ad10d028dffbe49c23b25465c348dacb810000000002000000000101fe5300962b65969e47d630e838a1b0e566cba65b70acfe80d4d86a7518344adb0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be46a1000000000000160014d6814d798e3c809e3db5b1f47a614f7d2d5f061602483045022100cde3236e6ba8d15179b49e5c9059dee29041af8c3682e74cc35c2ac90477440a02201878caba3a2f3f9e8147bbfa9d97e60a5b4a353d39a76d31962b9ff44e70bdbe012103af0fb5eae3432a7725349e1e93117033eee8c0966ad28b70bd603bb0af1607ac000000000200000000010123a55880e1f0169c5712c8d7d5651f802c478a286e0bb15a94c4561ed1331f8b0000000000fdffffff02260100000000000016001415b4dccd93043af54c19f55844e0a017a0be2633ff05000000000000160014fdd2d97d4fb60c879770204a5047d7bbe314577d0340a61a864fca5ac53a24f5677fb8a90b6792f1c19fd280443d60f9e872de8e6a3a935099fe8b77ce6c7f25bb871605fc10edfa7fa69a19b1ff324c7bf13c3c742880208f320859314192b9c2a1322a0f4372ee14780ba27519e54d18b02df80a9a74a4ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38003a7b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2264667265222c22616d74223a22302e303031227d6821c03e65c93834f8c238805697fc1804e884f04c1b47079b3aa288672d9b5b6a157d00000000020000000001016bbc51d1bd0683b3d9a76d1c40c1d6195c6a24bad8931e7c5a830db806de50150100000000fdffffff02e9e900000000000016001460fa56c65ee6a082464c8f5661d6438b8a660e3ee2fac8e8000000001600142bf1250bc1c530f7f1e85c881bb0d70f45d0ae1e0247304402205c083a5a3fafef7ae440748fd3b0f3749446c357f4da285eb9fb48d808f718a102207102db4c774627e0099bf618bd6947d4498dcc15de2e2c6892f88af9db9367fe0121022d1055a38f6deed5bc6b794026efb40caebdf44a0bab75f3ab749f36211862ade368270002000000000101b6bdbc4cb99d3eb34970575ecefb199d931e6df79f38abe7cec976922f619da00100000000fdffffff02695ac8e8000000002251202c5f498ceb12cfc80c585b1f001ce586d635844984259bd5c430b71120a7649dd49f000000000000225120352f165cecef2b1531e66d999ef67425bccb4e29f558eaedd12dced0c5698ff902473044022077591385244ed5e61a26f43067714a75448e97c330015c499da79b56fdc77a5302206dd1d7bd6d01df8dbf464aa2b83b290770d0f58f5f97fc47427eb504e90ca60d01210295f8e316c49fa087bbea420b2b472891d9aafac3edbb76d125d82cfd7d8fb8a1e36827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0400000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e034042f8b7ca744c3be05892bc9d2fc0c8d2ac3d7577c0331a210010d01b6fdba227a3a669fd11f1dccbb96a3ef2c6007654512f8408638b32d19783e3fa47fbd5de792016f2554d6c947f18b9df12480fe6bdb55033fadb568404ef8c484689c3b65cf6ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e600000000020000000001013f909138b7099d4218075d924c59feb08bf02f34bebfe60de3d79bfe4d3538310100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be1b86010000000000160014e8bb40a70c40ee516ce13137cf6822f395ebe6a102483045022100f1ccc213f4a97b60b57bda61ec53805ed0ea071436e752a16b195bbe33ad78790220620cddc52ffd548b58b373de08037496524d79f3bd6011615b4fad9ff93987c8012102c519c87c6a018cf3439886384a68ee8ac972a2c48f0c903ea06d6e82e288e18800000000020000000001010899785c8585c964197ff5089b6f678ad9df6c741f417d73cc0cedfcdec7ceb00000000000fdffffff029608f7e400000000160014cfe3387f7bd92d236a7551f5c2de380a510894d04ca100000000000016001411a43008498d747a5badcee410ed5813d8cfa9fe0140617f62251ce9fb12837a770713bcf269e32d30a2e1b1284d0a3fbea79c74996dcd154dbf5e24b46aac43e155c714b31098f037acd6b873adbf364d725f70ffe6e368270002000000000101a1a96cb643a67ff5df8a92e6d6db986114513487886e2f0384b7ca8978c7892c0200000000ffffffff01569304000000000016001446dc5bfbf8332c7b18647798cfd4bc037ce65916040047304402205fe1e7cf9da92fe24edc931a28c21766a3515158974f058a0d2e362c5069024002203357a4352a4b98e3562c7579272c1fbcda0083372d27ae97445a615fdc8aae08014830450221008640e969ca06d64fe3c9a3991432359382bace7bf886ae74ced8749b7b26e5c302203466bd2ca3a1ffcfde898f2794e292b7f627d9e38da30743b64b485e58a8708401475221024ee2b0956ecec1a5acf53067ee653b5593bdd8cf25d7eba15c82b8d07ec3c9a92103e57534c7637a3bb3b27fdb412506808ee5d780a00295b605019ac02e9707f33a52ae000000000100000000010351f1bdd2c8133f6b99089d467630d96d92958861b2bcb057b6df0efb92df61ce0200000000fdffffff55a3ee544727ad96997bd32600b82b5148250ec1af37f1417862f95dc730fa9b0000000000fdffffff28949d2efe38b2832d12e5f40ddd14ad4a5395762365f28be09edd6dfeefb1db0000000000fdffffff0310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a202be7614aad1b4013c285aa2f957e7bedde64707355e1e945656feb29bb24daf5ef410000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02483045022100a9125877c6d6f25597cdf79225d84142b5c01dd787a0df3d2b345a94259cc28202202031eec643b5cded44d89fa73e07b09b5abae4c79aaeaa92ec5b13041861d23201210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100afa270c8bb810839711605e6b019cd7d75295e67fabd502d941a95ee4c433f05022031d99ebb87bc754b5def69b388aa346a27425a5dc77788dacde7607d7f27cd9101210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c024730440220163adb271b2a8b8c6205c5b594916fc29ad9f5fd0cde9f03b29b3fc62d733a9702205466790ffe7087fe003ed481dc6862e1e1d48456343f3f353d6657d2c1b1439c01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0500000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340be0d58dca541326e4f3db1b9af72781a0dc50131340a25dc84276c4c67fb6aa6a463e872c64b4ed4a24ea5c256c55b1f8f5eadfdce9a1ccff470690f65f14d437920e8b7b38d049fe3a93cf872892ccc69bc8ff5e7735087bd68abac00b2526a1428ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e6000000000200000000010104b9089ba802523fd76d226321e0a41a78a000a1589a41136f312f6eb24916f40300000000ffffffff02767500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bed39f0000000000001600148452a5a46a1c1cf72f91a4360d7939fd6c2e5e4f02483045022100e95c7c8c14d14a1eadf354fbca365c621beb9e1c84a5b3214da9dffade4c0270022057d9a348741243c83a25f51b0d1fae745abfa8af530516c86e95bac4e5c0fe41012103254847fa9e145f845d0d80a90ef7371891977fc8106a2e9ed6b62150dc4099590000000002000000000102d1801d7573b36cac843fd512b8f95d4c2225a9c6e29bad03edda48bc1146fc8a0100000000fdffffffd1801d7573b36cac843fd512b8f95d4c2225a9c6e29bad03edda48bc1146fc8a0000000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb955c00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802483045022100ae46c83bd25121a3ed429b5059e35457857ed5cc24a77891bf379774f4c4b3330220311a57efa808bbb62b8c13187e36041ed4f001a6f8d2c256dd4a2bb7428233c9012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100c3d61651e4b95f1890cf2c6162a68d9327509bd1e270b68c60576e321c3944e902200ef462084f700e9b710d44397ce57862515c406814cf4baaedbd108e4795fd0f012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a00000000020000000001023ad2e809a34c0515f9d9cb4bbb89283f0d2eed64655963fa302505882f5a61e20300000000fdffffffcc68f24e4c1a3eb78a1389774834f3d51407bbbe5be79dff3d352aa9f408b73e0300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb6f5200000000000016001438f18670d5ed88eb94929c5582a79b05f954c0680247304402205d2c5432d4ef2ff4dc46d39ce52d7a3104fad8822aa2b4e78e686fc0ab9e364802204640fb9c886d82efbf98b90e08cb9384bc37c9b9b609ad19bbef75aeec195bef012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100fcffa360b89570d1b2e8585db7c45c04159d367e369f92ab9a25f6b0caff6c740220359545435186d6379efd11c4c95872aab408d44c852041d8633a8cc9da5b2c28012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a00000000020000000001023bf3731a78adf50585afa424c56b8ee76955807c382347fc9a58428d4c0feadf0300000000fdffffffcb7322612e662b5c55037eaaf1721e5aa4b522c5199c865f2775da7b8c7c1b9e0300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb233e00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802473044022066841093df3a65355fa173474944e9bb0d26c07b0902ee6c632e9274ebfd20c202202dd40348c978116c755979812001f78e1384fad8cbc05cbddee8346a65514d51012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100f15860fe84daba0861951097b47567703f169a265dbe469bf3a5fbfcc351c8de02203ef9ecf4870c670b8eeaa475c8dc66ea06cbfbcf38a28f3a86ced759d8fc2087012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000102c9602447ee7024ae85ec69b8e128f05ad9cfea0269cfa2ce092bc672650c02010300000000fdffffff523d50a12ce742919bb6d4cf9bccbdd8b2f6feb5b3182eaf50e785e7b909fa3a0300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cbfd3300000000000016001438f18670d5ed88eb94929c5582a79b05f954c068024830450221008e05dd5b39c480d4e8652495598b39c9c7206ddce987ce077ee51af42a284fe202202c14c0bc99db8ad75163bf6667596d2e2cda10cdee1f5c3f1c7fe266d4c66aac012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100e279955cd80b3a2488aa8951297043981a80b0085f2d96dd2fb85447535ae59a022004c03926944ef247a5c8875d5a5febccfc1ea16990ab7176a7d698e9098d45e2012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000102af68415959043457f9c7b5b2ee3d20762c36c25e9c58615353eff1e2e5e0eabf0300000000fdfffffff9b4a763c76e63a4736428bd5fb80152b27a87d699dd2a2c7421420d335f70b50300000000fdffffff04a861000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000092af7a78ddf1585226e09f65de39822a561218cb650b00000000000016001438f18670d5ed88eb94929c5582a79b05f954c06802473044022032fdb816e5019b7176f909d1d67531fbd6f4e4eba75fa8167fd01bfdfa35995602203686dd0b63499e94f31eb937422ab6ff65cef96fc39610fd9f67591f3419c4d9012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a02483045022100ec7934efa0295e66903020786c58600a0eda6c49271bd33d01abde3a2d2e4cca02207c4b2d429d8924c4c9d236e6559670b9c73f564b8fba7b06b1494eb9b4196e7e012103c4d12a3d1853cf20f95809ad3451a59445c6063ab1b6a426861355efc07fd09a0000000002000000000101d50e9d84de7db2096bb36e99d990039d3799afcbedd0a2e989498fdc2d0020960300000000ffffffff02627500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beec210000000000001600140b02dc1a3a64104d9e0d0433c24de4a62940bf6d02473044022024f3089fda2f6ebd8f99be8d26d4ec47a5d75ff2cbabdfc3f678ec6dfb4147fe02200294a440a89bb8ff2bf06c2cb1e845a88db6bdc6a96e0ae9f9881a1595c1c414012102eecd9f7f444ce5681f50b7f806f89380667740693d95fda083acb03991997db200000000020000000001018d042079c92de99754ee6652d4207ac3eb471009068fcb385ba46c9c2e6e83470100000000ffffffff02910100000000000016001460426faa653c536502e0a0d35658d0ba259a63b65c08000000000000160014f684b5587f1628d12845414a098b96c6f07756a30247304402201cd7a7a1c6b0461ff786d2f52948ebfc4c51d530a38438d399c205ebb24fa4890220533853cbb310d5a909410703568e0ec4ee679f07dd96d8d146e30d1d6f252ff60121032867ce11224e8596ee7ad6d8cd7cbe8ec4e3b8a62e44e4f5eb5c67c68b4a47b60000000002000000000101ec66de86ac4d8fc7ec7fa440054f784ca0ae070e6f654e5d880037b43db4fd870100000000fdffffff020e910000000000001600146bee867ffac10298cd593bfaf7a7ae647690468af50402f300000000160014005f4aa68438a3eaf539a89b5b36ec5ce0d0da90014011e641c970b0d389eba2de4181b18926863387319424a54deb1da6c97fdad7570c988981eb89586d503f501f913a4e39e495262469aa4ea39bd85a2567e97e9be368270002000000000101e39fd8d597b152acaed0c3e64b4e21410b74c08d632a7bdebf73c81d58fea99b0100000000fdffffff02744300f300000000160014ca845a41f9d0bf18061a31530518ee43a75d1c8af4c001000000000016001475dfad64998380d6ff2a10650fd53857ee1978f40247304402205e778c40ae9935b34b311a3f65511140dff27225c97b374aaef3ba7f2854bac90220719bf2079fff545891a7bbbfd10d213d97405ec48547f5452614a81893846649012103f537b9133fba7fb6eb909919969d71b58082aff51b493b6d94916228cf90ceade3682700020000000001018c4ca7170c38f536b4b3bb02aac11cb9f8bb8236dfe17af3c450cf1b66eb37400000000000fdffffff03e803000000000000225120052b00884986d9f36dbb732456a8ac78c8c9b79950b3a4428ada538b7def48e3310509360000000022512046c67e1ab8a1b643ad97b349e0d8178c65a7bc63977cba3b65e183b239cf5821b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380247304402207c52d9f3753a1f084f285f4be0df76ba07a4bb513fdcfd950d58929f3af447bc02201cb92431a32508de7b999fff4cc838567e7053426a2f11ef11b89382f423f360012103404ef644cf7bf05fec304b00dd43f5d0f5198d4b04f5b3c96aadb4c50872382be3682700020000000001016e1fccc6bbd45e1f58c3e7dda87b5929df2023b2f68d7524755ffd7580dc934d0000000017160014b79955ed04aafaefe39654b226dc0841aa7ab28ffdffffff02b6bb000000000000160014affeec8ba816c922df46dbc883f24ac618e1c97d572dddb8000000001600140d4e227b21fb784d2b699c57a61822542b92bc320247304402201ca9bca0831a83532a68162524b28ec4c294b8b7dd19a4a46c9bcb3daaa09ab6022047ef8f49552190a576ea12f2b84ac3e67296eaacaf34acf10d795351d28a95380121032c64c9d62c964f773133d5b28d1f2d7eac1b8ebb370dd7d16e1a2916c016b2e8e368270002000000000101653ab3576c81ba8731831b7c066ed3c17970b59e963229f7c1381859a5a2be870100000000ffffffff01659f000000000000225120ed035ef7922f4d38ece1f47315b91128c2fca91d0e96649c410b28919df58bcb01404e62f3c5bfe6ae3d6ac0140f4e0fee14ef43dc3f048e686a88c7d2753c835f41fd72eb2ca5ee0dcd898c478c50a9007528912aa3d61a2f29bae0c0983193afe000000000020000000001014c5db29b1d57b8ccb533c1189675375f5e0cb7096fe4b272a0b88d6b2b698ee00100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bec02f000000000000160014e367d42f5ec20f0abcb629740ba106cb5c1db0a402483045022100c84aea85df7827ace6033a6c435ed31a38fdf54cdad7142649584d70ef57e32002206fb98a7ece94852cdd251c38614adcfda208f12465f446e8320c13b8780b05e6012102095aa3493649ff861c37784a07c719b33044ce85e2bac3cd3df62743f3a6e65e00000000020000000001015c26d1acabab97e0d3247065a414f20d41dc8eeb8dfc8e1be89f9f4d1af263cf0000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beee96000000000000160014dc5c0af909204938eed267e2f009037a444f921102483045022100d205b8dc5babcea2d41302cbc23f02addab2b7d90332931f7a76a5a270d1359002203c90cf1ff8f0385ac1389df30e730968a21258a58e57360678ec37fd84c16cf1012102591291abb6a22b0e22821ce861031f95e84e4c3ed771780d57ff79eff2105a8f000000000200000000010193a790b92ac4b84840d718c3a05ff61e940f1b423a1c1608284867d8d734b5800100000000ffffffff0210270000000000001600149b3f05288b557e655d681c694e28e4d2b8255308b7f7000000000000160014dbf7627ed6527d9fcdfcd55dddc4fc3954dcc0790247304402206d49a6344c3309d59f79cb534a0876633136d7c462c724c3bc9fe0456461cd010220271b4e2ab4aa4cb6a07de226564947fe272bf12e88dea6bcb1563cd3114ce4d3012103a69d884e3dec340171134450e57e9b968d9d3101ec0f27e65934468749b66d270000000002000000000101c29d67f0ce090e5c47553bfac76cd4ca971aa8491456c10f0dfe9130bbe4df070300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000068f9ffc356a20645f1b4e71724c7c606f3c2d503308100000000000016001455c6fe4801130a284c1aa2bd92223d8c5c45f2db02483045022100dbd8aa28e554c7beae211500bb6ec1b2f29069a8230e5e90a540c236316f786102204a8f2192986475d904eeef149166d88d5b59c4e6aaaab80af6220549d5f2ac8a012102ff17ec3ccbb0944da8d43a85f04f19128bd400d9ef583ae8b51c0919976cf68900000000020000000001017f918861829a8bd4c8339c3503c82384970a206b66e9040b3c7c448273ee94960000000000fdffffff02e22b6fce00000000160014e401a8a7b29448c09485846c70ce8bb3d00d600e5dbf0000000000001600140494e9ff8e54aad44360e57f0fd37f61374c746602473044022046bea13caf0554f1df613b74a83c3356a061e80beaa27b4ac3609d8a327bf04b02207a209b7f4ae49b91fb5505ca7375d2827d119b94fbc834e1df0acffa6ee14ff80121029a8f6bfd536d817d6fbfc6c4f5a84164bbbd2d7c10140570484ba049f572db3de368270002000000000101d76fc99b6d2dfa6136ff7645f3aa281c1fbd98dd435787a540de4cb29a4660f72a00000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b62b0b000000000000160014b32a6dca7464bdda3f88c2dc2e93cdf4ad452e4f02483045022100f2abb3cd64134e7a51165517312028b285dece49e6d63363ec55d2cf0c9f2bb402203398ab51d0153e465d99d4eee66343b2a5b9cfe0f73caaffa7e3e5b5b73860150121022d6e0500f014bcd7f7164ddacc5163d652d225a45e404e26ecc8ba0b6d67e9ca0000000002000000000101137a667aee99e48d51eee8c2581655be2ca2969f43a37c46f98b9b2f03313d95010000001716001464dc211477a705c9c2ef65c6929a79a6a496007dfdffffff02b3a9ca1101000000160014b9f5257caa65866b598aa4eff2f63115a7ddb46101de0000000000001600149aad71bcf6159135ef7461569fe62829d1e5115702473044022022023756350bf9433faf8e41397bb6abcabb24d53e9f8208f533d81cd67b311902201d0e5ab06a98c9ff71365b72fb2af4b56b55a764f35a9e3fda5d59b3f7ac1062012102f844dc5ff42439073176ef89779f5563e3b7028a5c053c660f86eeb336cc59bde368270002000000000101a9e4de65a7e3507fc22461be89522be71a604656ceee63c22455a0ee2c88f2570000000000fdffffff02b28f00000000000016001495cb10fb010b81b78a5d26055467b11c7ed6d2347419ca11010000001600144e3e2ee88a751447c7c7f166085addb3debdb0a302473044022044558852dc174cfb12eaffccd90b120b828e0f727c96cf6738152523dc064aa902206d075efe7b314a77aacd46a6dfa7dbc1963f26a8fda3457f07ae00a253f3e8c9012103a2b1670404ab122066e7ab170cca6dd356a1e5797b5e063b41cb37a1ac6aa82ae368270002000000000101a5df93bf83dac3fa461536a4f62575cb32d6364a7cb806fa308131bd7d7e1f730100000000ffffffff02d007000000000000225120d10cc8324db9e319eef2cd2a4e19723e5442305f513cf0a56f56d6b66ddbc581b20800000000000016001445415affc06cb9bd0832424b4b385686696401310248304502210094cc83faebdb3a6c468494208997c563f134be581720c421596f7cda8bb8f7f502202b81d98eb527b05bbe91374e092ef28540f92d2022f7d392ab947f8962d51d04012102b752ae46732dc746b15cc1d1ee8b993dd519ca532dba352a59bf36596ab6652b0000000002000000000101f074129cb0097c270e7772cef5d76ffb0c469849a70062eb1f5fa4c3feb301d30100000000ffffffff02e80300000000000022512044c31bbb7a79a223ad5de2d2489b014752d2415035d8414945a1c5e2a2fb380c6c0e000000000000225120ff6997d587873dafb34e4e791dba1055abd8456edafec336acaa0e7fb2145e7a014042b253ef957d4dfff0bf65c2bc5bf4db150d3dec67a02d580b97fd167b709adac382fa6fed4e4194ec6eabc02f58b755404875017468445a52cc0c2e865a4d710000000002000000000101fb847b8270a2d1a8ae3bb3e159f275fbb54a3c84c403d9b2ded3c23101b404da0100000000fdffffff03e803000000000000160014d9c1c8c1c168e73d859d5eaf8874da0fed3edcd4e80300000000000016001475dfad64998380d6ff2a10650fd53857ee1978f4732b1d3000000000160014de2aef4b172f208668a68b817a6f4f14be3305b702473044022037f6bc3864a5c45e8446eb2b0ddf0a3198b334418443aeec6a27530cbf61ffaf022060553fdfb1295e0213ec892da4e38e096b265097d4f702cee4dc46051f4373f20121024d3bab2784162b3d906e52b27a2619c3a8f95858b0f14aedf874563f6bde4ea2e3682700020000000001012512484422d903743b08af8f9d92e3280706122c21b24f8a2324ec32a1e05cb60100000000fdffffff04204e000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000009bfdc2463af50caed388a7b9611c88fa1758734da748000000000000160014cd5fbf71dedb2f861c9f1ae8a8d193ffc0918570024730440220027bf7127d4ba82c00ff09379d7ee6893786192b062f1c955e2da4b1873061e702204af0717cfabe55d4de78e4f7cdf1942a9cbddc3d914847b95da1f4a3a5dd79120121039ea0dc1c811e5fde3c8de6d98557dd028d10b70e84a979e8a24d4d5d76fc366e0000000002000000000101e29637892c5f7b692d731b8d5b806522cdb1267518cce757f197290a2dcf2e700100000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000002fd6a81deace66a4f035bd1c3ca41ca9374304140033000000000000160014555154c233dbc5ffae20719896167045074cca5602483045022100ce3a763578f9ae9047c9e09b6475524f6e062703cf5f74e81cdea84f7cb6a2e802204e2ecc46a46b6c71caf6f79d88d99051aae87eeb219f644b8ff7297973dc725801210319fb38786b6f39594960fe18a83afcf4913f6807b16d20f0c27ab787d4776a6b000000000200000000010196ad4b600137b54c8edc1c32bc56ed594cda3f73cf9aa3b87e1e256f596810fc0300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000002fd6a81deace66a4f035bd1c3ca41ca937430414492a000000000000160014555154c233dbc5ffae20719896167045074cca5602483045022100b40e40012c04fc7de39b71285ec488ea4ed3855e7639c23431151d8e967be0ca02203daf533a222b308a15c11d4bfe528732925d12a96602a372a30daf95dd31e19901210319fb38786b6f39594960fe18a83afcf4913f6807b16d20f0c27ab787d4776a6b0000000002000000000101864da2c6746764d20fdea0251fd0bfe198e8d5c945e013a0237a748149f6849c0300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000002fd6a81deace66a4f035bd1c3ca41ca9374304149221000000000000160014555154c233dbc5ffae20719896167045074cca560247304402206ebe244668f4a2618443d74293c37bb75a2cd3e3692f1982ac54c2305c1403c50220311c1de08d8765ba04f343b21898cca786dba40da0745afbae5188c1b69f039a01210319fb38786b6f39594960fe18a83afcf4913f6807b16d20f0c27ab787d4776a6b00000000020000000001018d8bca3616181f102faf97bdad928e1559bc10ef895a8ef350273154de2724df0300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000002fd6a81deace66a4f035bd1c3ca41ca937430414db18000000000000160014555154c233dbc5ffae20719896167045074cca5602483045022100eaeace919c8b4c360dbc1509423efe864abfffa6c9517c22a3785ddf657a850d022059604d064bc3267293e452e1090b2e4155bd779cd4c12cfed4445319d3fd05d101210319fb38786b6f39594960fe18a83afcf4913f6807b16d20f0c27ab787d4776a6b0000000002000000000101291277e38df69092f16b994341193cabb739805bc9d57bcd147a8f7e2a032f700f00000000ffffffff022c0100000000000016001460426faa653c536502e0a0d35658d0ba259a63b62f020000000000001600142ff532266f23b7178421ac7b96da8813f9faa9110247304402202d0eaea66af1e0acd144c8b582167b0565df67aa73b72807ccfe826066c317e102206142180fac368706b35a1fdb9ba6ead3bd4dc4efef2b9223f49b00d93497a965012102988a24779713849c2a88b3ac780c7c2e6dddbaf460a7cbe9288319adc8d861f00000000002000000000101f2220b4e90004f733e477e4daf59e20e03fa0bfc2377efd064dd0d5f751db78f0100000000fdffffff02580200000000000022512062f29c4e96cf6f095fb21ef4657056870b8cc8fb6e965b990be9dc52fdac615f6b1b8200000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d01406b8004a8711a09c55925bd44cab06584c8d7f9f0bce9c7c1563d7478b3a0dac523e3fe44cd25353fc2ca322fdb6839e4275276b7648d28ec315a17a5d0cbdf960000000001000000000101886c71102a7f61060167c1d133d0d583f05e120c9cdc10c978902c2cfd9a54820000000000fdffffff01c1010000000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0340f94c6c3053aa35d325069f69eae812c37b39cfc641f0b01733e7a13f550a82e1b9b1cd3ae85badf2fef04282af9766db254ddc993a14f7cded40cc239409e4907d207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800377b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a223130227d6821c17e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0000000002000000000101b273a9fa15afc63197fb042b8c5b749f4289fc7afeee49516505edcc9a01de150000000000fdffffff023301000000000000160014510255e0fe95337302bece2f86c80ca0a0f65f860000000000000000226a207f70258cf5a7d5c699d50169c569c769990444af6e22647d83d690f2b1c3881601407d8bcf8eb31d0f7dc0644a3f9a66f3d93749329e1d37457ac95c771941d6c71cdb3f6499cba5b66a879a0f59e16bca85d38f5353146ef1f0272064c7517ce48c00000000020000000001010235421c5f7afe18c41365697fe82aadf953bec1a48c48506d43a736c3b69ec90100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beebfd000000000000160014df16c3fbc2cea96a433a83d9733190064f56bcc702473044022066a9cdf3fb6b210e90032e349724022d1b19e47acf9ec323f7ee2535938690c002203b35f4e303483a2840f63b5e5084df778c8d676461c94507a052057f90fe0384012103cfa7c9572d51cb2406b8e75324bf37dc104e25399f4caa79e718a066ba31f5a2000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0300000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340385b0520e0380b7eddc28ece3f22d52c2044b85edd77b610af335704a1f7268c5b47913b527719f4e5c7f213e664467f7d1ed02ffdec9ba69ca5edd39537c1cc79208cf5e7f3b0edb0d8dac3264c5d560389adb00d2e3a6ebdfaa130699aa9e2bf03ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e6000000000200000000010154fb57f9bf09066ab012512a180861e0c69b83034868a0847061e8b61bdb65bf0000000000fdffffff041027000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c26000000000000000000000000eb68ca5c712c8e812343f0d3b765a0e27e957f0f819900000000000016001423938fe51689ac1c10bd20db38285e1b0be78d5602473044022045653274cf472374c49fd0873b3473c6c9a7960dffcb1e77aae3150bbee10957022048602f88a7742cf7e3a6da7bf71013029e0a0661cd0dff772808c5136fbc0d480121022fb149ca35e7e8583f15c41215f94700cbfcce6c10892bd5ac60222a2d400b260000000002000000000101d412e585b6b51087db664d1c14b8fd8d8bc323cd4477f06a2e7a087e36aeeb470300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000005582f3ecb831f2ce8d5f745b394e34b3a321a7c4798d000000000000160014f8da05b96bf8d352c0f1f0fd4ea384af8073e4b202483045022100ea1178971bbc5dbc88a880511f738eb4d681c23874b14e7b4a7cd686682d000b022054968db769719fb997e54a820dd680b7689a0d91288284bf74d1d54b77f800ea012103d8d2cc3426cf6a920f4a0640af2891ad84499986ef282309b0642789c4c6e39f000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0f00000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e03401002991b9e22c44decbcbfe306a569880c02431c9d8778a10b15b46266a5b3b688cf21dc5260b2b5dddd50d4f2b8bcac8ba44ffabb9a67ca0bdf861261a61caf79209ba64393010459807f7526abbb2d593223b3eb0041ba415bb315ddf5e166e47eac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e600000000020000000001027084cc6b1dc9067bf91f4862ab44741a8c72a560565680a0fd2f0d48849b1fd9010000001716001426fab74673a42ff72ed3202e2f80bba480c51524fdffffffa71ea3e1c5932a255bd3c3f676d1c2c032a72297b12c310a063d05650a1e50620000000017160014c5c1b64c90de255defbd447b02ea7202bfe96e47fdffffff02708103000000000017a914775c7855310da0f47344cc9481aff511349b396187e09304000000000017a9148b6db478ad702c4a9c8b8a463d0b4bc3d0014dd4870247304402203f0ad39b3cf80c5b7df20dfb9a84390bfb64cc7b13f9c4fafaac132d437fe0ce02203b8d24330fb587d8875460dd2b3bd95708b4548a2b92f273bcabe50730b612a9012103f59715326e1ffc330b9557cee3faa2f0fe384e20aa4a9c63cad53b9f26a1c34602473044022002670d15bb68c9b1fff004095c8312027f6ed71f6885d548b7181fbbfe570c2d02204e8f8f567e62c20ada28aa8494063500c37280ef8a5efa0b211baa77b0502e93012103244880eb304dc6dac7d8db8675d947808ae6fd4b77938eb033e66439ad5d10d3e36827000200000000010175e8ea98e7410de09b561c1e9899cca657a8d140a9c422f7994933b9161eb5880000000000fdffffff02260100000000000016001445415affc06cb9bd0832424b4b38568669640131ff05000000000000160014e08734278361519e8c9bd1d5a363c6cb92b28ad9034072fc50e3baf6812d3c5ef8a02aab439ef6be0d5bb504fcf6ce3bccf0661e30aca8f8b6b5c5ae6f4098cbc3ffe251a4bccdb6b5b4b811c3b7348e172b283c18257e2044761999b99d5676d43fd0039a9be790d7755bd22298f18cffb73a7dd6e1d648ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800387b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a22323030227d6821c021f66572225066deea621cba17c0241206179e36688aa6a8a87a9ec479c5f30d0000000002000000000102ea461473fa1213fb2e372d9388e61caf62a6dd6eea4ef17361eed3b7612270850000000000ffffffff2b168cd95b05b46c3c0daef5d9adf5c327c8ed59c53c6689e2d8beef2529ee120200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b14d66010000000000160014c87b80d57886c46d3f63e47214ee8a86ebd0b4bb02483045022100ef0c3a110c608ffad284b060db04e3c8d195141fb0a33c6bfcc06983e786ccaf02202003b1842cadfb48564faf0dff9c1653332b31db11dd4883fd82b925b8a95c1901210296cedf09cdc70a274038a83ca8fff3bf4abb6395be09e76fa2b4ddac9ae544b6024830450221009682269e158bf6578339244aa518bde7ef8ca16068f322789c38086fd8f7813e02202a84c6f7581855923e20b2cb05785780622caec9e2c1f3315bd02eb969a6aa0201210296cedf09cdc70a274038a83ca8fff3bf4abb6395be09e76fa2b4ddac9ae544b60000000002000000000101d5193c1a5342103a9fa4bfb32394ce3fa94822c01997a682362f467aff605f7f0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be8a1c0000000000001600141370e0569b988fd795d317935168eaf221ff041e024730440220708c788558548395b7ab677e1406c65cbd8e11ff99ba353d4194685ec82b036602203f6d1bd04a0d874f8d8314637fdceb4c5152e9b08a7012d8c413025b380fda2d012103e13da247607d3733848a97c83933a3d4320dc4ea934f2b649c3cae836c37dabf0000000002000000000101b53c2278c41b634b00c157368b006524c1ceb2eefa23f2423a5c9e1c7b5bd4020100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b658860000000000001600147e6e4a6569d7c46dcb47c20cfb55652eca362853024730440220103775521d7853c8036e13cfdb14571d14c227a120e6457ac036607e76a53e520220386d1367663ba6ed41bb4f6fb1cf242402c5c38a5f5e3cbeaa8dbe77bd5a1bf2012102b89daded562b9cbc74ef6523924281fcd34a5c0d453504af393badaf6f7f9bd4000000000200000000010222987c773978963b11aa2b3fb9f1361419aae0d44ba5bf5d5ce4a927f018b5190000000000ffffffff8779c727d52d3b2cf765baae4f3ea3e40baaa4b7dc6a6d4fe1cc7d13069799e60200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b19f4f0000000000001600143d8652ff63e5534891c122fc1f06325c8fd0086c02483045022100a5de803716e9378974fb0cd76022ab1392be8c461f0beec93b701106f7c5ecd20220408af4c6d13b1884a5a239badf2e302757301b203673975929c91a4029610293012102efc78dbdbf3db2a6f09dace0557f26770319f855b6287a3a6fd1b7e895aeca610247304402200adbd9c396565186e36e71557ddc77a6b3f1e041e43f4b0b6e381c83545b13b5022019e9611d50c239eea78986f1f49bf634b8df88a3a58156e48ba3a3037c291fd3012102efc78dbdbf3db2a6f09dace0557f26770319f855b6287a3a6fd1b7e895aeca610000000002000000000101d917adc96990ce5ec1eb683362c722ddb7be477ff2f076f9eeba66167b9989810300000000ffffffff02947500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be0852000000000000160014639e8b4ba3b4549744bc84839d566f83a9698573024730440220342d2308290521473c05e811a2b7a4d2a707b4346697f4938313d814d7b2dd6d02205e9a73022f85f6f5aa383faab4f1b231e82c96590856a02995c19a814807bcab0121020454689562030076ee886c7dc64f48b6ef045ea95445bfc59ca253c81266494f0000000002000000012263f2eb3c9434a2c7be7a44663d712a7136bbf7cdbae3be035e5feb8262e484000000006a47304402205eb29cfa9c727d2998cb75b13c606dbce7b5aaf84f466ffa7e5a1f0d83051d5a02201cfa96614181ab8c3bde028ed3bc11d4c722561457d6d6462fab718af51f25db012103564c9910f0cfdc4434662d1684c968e71dda6e0dcb76b9918434ad7a9c6622fbfdffffff02b0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588ac1cc40000000000001976a9147f403b929835628a3b372dc2684b97ca6702fc4b88ace368270002000000000101bc4551734344f984c136aec585fe2bb405a321f25cf15150217a507f4528934d0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be044d0000000000002251204476bf758d08bf9be1a445183e1061c68d92bd130c55447098da4375fab44b750140ef42eaa9b62408e7a354ffb2b9b13b8c204e9d0030908095c12332f0bf271a5f6a7ede15a82a5e2d064d661c6c9a368fc7ebba4b3a85841e809707b70124fe9e00000000010000000001033100b0de2100c86f4642c92b66b8eb226e64c4952d32935cb4c16d48d8212c360000000000fdffffff914f51ec0f93fb7107f3f511c73fbd65c7864dba2c2fc57664b1584c2f2916840000000000fdffffff72225db6f98ab616f7bac353200eb116fe1499b520e2ca1cf27da390094c43190000000000fdffffff03307500000000000016001409f98ccdf95769c51faf2cebe5bd8584c29c830a0000000000000000226a20779f9559dbb094fd35f718fad0f8357345289fe62369f81ef616053753852ed9d877000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9cce02483045022100c889acc26c4113671dfc31857ede584767294acd5fbf1cf55b5efb1c2805858d0220112a6cc2b030b5d7bd1c81347f754048da3a5dc5687f950be1979934fc71bba7012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100c855e33f5616e8427547aab186a3c74d0bacfcee029c729b6145b3f187eb88e002203f819ac7c81216bc3acf16dd3e4544fc0944357f8e5581099df9624dfc024d2f012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae02483045022100ad162a29685de77d235ddd0b4f3929545951dbf358c0f99cc449cdf33b98713f022056730aff13404cd86166f629ac5501d88aae4f66e3f336ce11eaa2ace5b36431012103f6a6b50529912a326df4051ef1cb916b6e45dbb2bc2a070069830ea0a72745ae000000000200000001fde650d5a32847931c05c10e4617c1326b101c7027acfe8906fe860fb32aa856010000006a47304402201418c1a2c49e7626b25f7e9b98f48060baab2bd37c3877b5d84be80006b242bc0220734ee224073f440deff4758bfc455bf20ec99c54a2ebc20dc3bcc60359e8cc9901210215e3ca32fa7012f1e15a4da22a7cdab8339445d70a3b56a30172f06671f930a3fdffffff022b200100000000001976a914ea231232c17e4ad762cb29e8953546de0290e8eb88acb0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588ace368270002000000000101e015ce250046b221e60efbbd7f7f5eb97491a6773fa1b3326285c3b62c1d02990000000000fdffffff02f1c8dfee00000000225120a63ce767e9725f6c3ec591d8212b86a92e9473cb6a361724b20e914a2a48f1c12ecc000000000000225120185cdfa5f33dd39013b89fc805ff11472b7039086e74ef82c83f9e9de906b9af024730440220060d95931f384b75af264d8db26ec4633fe8f024676a5f2b5bb08b7ca86afe770220653d25ad1ceb48207e362b4ecb4f27c71a061f05e128f63e3257dff238d9f2a5012102488b56a29e2a2625a75c19bece063cc0cf9ce97953be9a36e85f988c68318bb4e368270002000000000101a512fa82bea9635d412399552bde2347ed92f6be8df95264033b6e4a8b4b909a0000000000fdffffff022c4bdfee0000000017a9142c23f8d73cc020a540faea32e5628746957dcb2a87417d00000000000017a9140152a3da76a78126a2a88cd99cb87b490a5c4bf48701400a8a58dde026660169c1fc87bcd023500c00706e322627c460c082a10f12cd8889e2dea8fd00e64a1deb701bd6f766bb6c7a2d5f0f91ab953041bfc31a4e0d87e368270002000000000101937dcb1298d9736ffe7a4fe3fd8a5e63cf368fecd32497c5dc0789d9733e47270000000017160014b321c5ae0542d432fdf95ab9e1ca82f0963187d9fdffffff0272e600000000000017a9142bab1cc1e568d5a91d9d56ffc22edcc74432cd28871464deee0000000017a914fd1da0ff3811d819149569631812fbadf75067098702473044022057e7846523007c349d2cfdeb600dd08033be2ef332120cc53f1d8fbb19c380d302200f1736d7ca82d486894b36a2cd8b843c6911801f290fc4c537d1216ef2153284012102c96d424ac04a18c877a8fa71f55a2d0eea74953ee6770ba0654021db2fc7ac3ae36827000200000000010232fbda347e70b6ac659009e1d25c62d1cf74f566eae5601382bcbc7ab100cdd90000000000ffffffff5248bd7aa7337961104bc9ad273d29abbf53647d2e909df18ef50370837859820100000000ffffffff022202000000000000225120e805a23f96209c781335e3771a5e90c2a8dab32505eaf5007e05b6be10d275b4dcd5000000000000225120e805a23f96209c781335e3771a5e90c2a8dab32505eaf5007e05b6be10d275b40140d72d92eaa550f9c929a3d7960d777d6901145d80df8d9c9425b3e1b0f2330719bb15b9db998fa83a8273cc64bbe8797132d834696a36692351de0163a156a3da0140db850db7278ae301fc7eb30e384ef06635cc0c8f37e63e28dc0b632aebd9067ebe159dcecb480cd9ecf7f667ff31175e5c764624f54da19e0a190918b113c54d0000000002000000000101f0f7981b00ae41b4df4241ebfce34630d7dbdbc8a65ffd2ffcffeab6f96d24b60100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be673600000000000016001407f839e4a1decbba7498540da52399dd713eba4c0247304402202490a984b4b72877f78c2453b15186147b5d57f7e4db52ac70da3c01d1f467e4022062e49937656594a468202f1a0afa1770aa5497030bf894e37a1c373d0f6ba9e001210359a8b62b4097edf6ab7168f14d831cd1d1c8adca5e31e5e5f1078a4ac0a07e7c00000000020000000001014e3898b4cedac9e90f8a584d76654fd86ec8e4210a0325d81e8407da4be61e560100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bec21e0000000000001600146fc14dc6a058c7ffbd3d86d4a6c9fe1841b20297024730440220320dda29e67f4734cc4562f0812cf396bbfdf01d01f2678864b3b28429b19e0f022044e81c0691ffc4516ab6b6a498e2f1fad82a7aa6338ec1e858deceb35018250e012103241519b087410bf29c71e09f973e49fe17c4659160dcf2a754303d4b85823718000000000200000000010172b9101ad8803a8537a539d45f484cf8586d8cd3f8a2d09713898d1a27bf6e4e010000001716001495c857e8bdb60492123b6eaec95291c0b4654376fdffffff0202b8f79c0000000017a914ad21407d7d0a08c98cb68586dd4ee739bdfaf1d3874f9d00000000000017a9146924a51976aa1e86a50de23d69e0f0bc38843a018702473044022033ce26b4cb91da0825ea5e067e13098639e583a99eb674b21c5a82c2c0ffcfa802204e7ec574223d5f517f2d56c4a1ee71a1a6396e84bca8e71f1f318e98de178f8b012103499b88f45cb37c3c03917ba99aa62cbf96b58636be87762725d9a1f694e65f3be368270002000000000101e49227931ccca269fa72b052db6ffee7394de4ca5004c646abb4959c7430635900000000171600145d24692f1dc50823208fcc2f1538997478eaab23fdffffff02dd0bf79c000000002251201a319ce06c8f050565a14e6059386457dadf33f4c2f19d5063d887ea4970f9b869ab0000000000002251201cdd404d8c97acbfac07910da754d3fe390abab1bb7519db9854763b01b4d51a024730440220199b09131de72f6ff5dd075bacff0e8479447211ec4e0751486f5613798cb5c0022078a93d61b36c050b19b6afe904674bb5729bb92afe71f3018f57d98c6922020001210209559f9a14bfa993da5ecd4f715433d084bc6a5e2bf7568366581c82f93c4064e168270002000000000101640eb157a063c520fe2109f8ba806ad16a4e4992716dfe71c72de26a51e3ecd80000000000fdffffff0249840000000000001600146eff82db3978f0e6d536e16bed581766723c960849f56855010000001600147ecadc4e46f245d5bff0dd5cc915739dad61fd280140ce59b76d9438775714b1439a2320eb04667f408d9112806ad139136bfd7bd472e6195ad496871911fb45e44a9f257c4d8b9cdab82a3197a73120bb8a37b845aee368270002000000000101a422d272fee5febeb3d2a7c0b88e133273520b7f7097e9a0dfb9501af1696e120100000000fdffffff02ca26685501000000160014b46dfd91c08649980837ed601534c2a8f4c4cf6af2cd0000000000001600147672636b36ac64b061d9c17d3420ea493d3e22da024730440220625fe5aca9c60f91b7027372fad3da2424357fc5d04a1f7bf5f480873ec031390220315b8146079cc36427120f9bf588ecf368a9ad02e72099c329b65eb6ee8fe95001210351daa8ea238287470f0e823307df916c55e0a964f5352c930f83b73c99b85b61e3682700020000000001011c118ec96dca363eda7783440b5ec3120d81c5c99c59f3500ac972827509d6af0100000000fdffffff02580200000000000022512062f29c4e96cf6f095fb21ef4657056870b8cc8fb6e965b990be9dc52fdac615fdc6a8200000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0140ccad9082e512741468d18382c3b5f334bfd3c340f9a0e0bc31a6128e3c01206a3ff56d1de00f2b42d947950f204f99d66a625370ee4fc624a2d51a3dd325912800000000020000000001014e715dd1590917e43e47e5e86492f17020a1b42b7bc06ecdd6ff965eba2110e80100000017160014ce229a714ed5048c8fe2e67c1744874385a396befdffffff02730c43a50000000017a914da6d56b08fa6a75e762158ce29135d6891f1ff4f87109500000000000017a9140cd5e5e18722621b6f2c9dd6806eca1ec2d64001870247304402206ddbcce613024e1379d2a3d63b63598b309b68d45af66bf4d4a131e09e5d397902201fb233035e6eb891b3a9f04718da20ceb950693184bae3fff9d1828269d44fc5012102d3f4785ba705e70b6985306d6ae47070a2b27b3abafd80efab9b881be314e60ce3682700020000000001011b8ec5524cf6a6553e5f19caa7128a5011f554266a815b1bbbac0c9195be01570100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b62250010000000000225120c56d6477fbeae1bb9b220ae4b93bf3f079f52a6bb327edb7eb1af9bd15872f3701404bb5431b38d20cc40e2eca328647ec6abf92882d28dd8a9528dfc310ce8a19ebd4795144ba98702e1f34a36505470df5354ab98f82cbf8ac096a0c59f020f0120000000002000000000101d6c4b8fb2ec880b05e82f5effd36d227b00149b03a8b4c580a45abf57c979a130300000000ffffffff023a7500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bede49000000000000160014f45fb7d44b719f65df465df18cdf7950ded3b05e0247304402207ee4c9574746a96a1dbd9bb8e30d4910603cfc318dbf27f4dfabea7c02ed2ac702200e0fc4a65c80c79791691b580ffee7cabad8213d0c909e3fab109e05767673d2012102535edf62aa6fdac6f62d63b823fc3a463fcbe94ff39b2720cfe7c456c5bb01a20000000002000000000101757c0a57da6f3fb3b4d27f2f4348fd73bbbe65c05dc1e0e9ee24248697dfcdc90200000000ffffffff02411f00000000000022512017da1c34430216833b534068996ca05cc57446bcbb9a65ab90109f522c16552a8714060000000000160014b8e7186628846067c0af3a3754185d8b3a8c21870248304502210094d4d9963d162ebb9ad474ddf0c03e680620897d5ae41a6fe3bc4fff4ded26e0022050113c3e9dc8e5cba22d90af6d1ff0cf6a27a5ecbd527dee34bfaaa7d82e8376012103150e6cd89c06288b180ac9c8b69428fc9e9b2d6bd14040022145f67fd79e272b0000000002000000000101e7b3d66bb153fa11d3326c097ad3216f95531d56c37aad62ef3a5e06030d9cd10100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be6da6000000000000160014c50e15871f8b6360c3a1a1b581c0574557ee54f202483045022100f4ef929a552d8bf84dfe2aea492dfa49b7fa9cf7c7ecf91f274c71c4dc6ccd470220368901e9ed55ea779b28544e2c505f0861d9fc70bd9921061a9a905229abff4b012102611b1b809de9b833e97f5de4b5d28debc5431636b15b17877db402d113981bbe000000000200000000010130342caac857ac955faa199969df961f444fc507df883c13c8ccbeae31f020d40000000000fdffffff02758b000000000000160014e89f7b007c1c44b47047fc1a821ef2da17caa34e6b7a3de3000000001600143b71301680c0e8bf7a27a301af3338a425e7181b02473044022007390ac74f1bb81c242a2db80e0e145b145dddacc28c8fad80a6d3cd32bc5dc202205410c6d6d3bba0145e789e9e18479ab60e2a74387ff04e39c3892268d0f00e06012103cb03b926fd63f2ad593a646c27a2c0086eefac707b8d659d08d9c182ff26e582e368270002000000000101950952ad4b572d3947aee0aac048d612efeaa5fb4cfb3a6d8751340c5868739a0000000000fdffffff02f13f675501000000160014cf5fe2d2c30ca30204508f5130382e7a126bf3b74ce600000000000016001493ac6c703e4a6c5bc06386c4333a7319c618ceae0247304402201f597948247f21a2588fdc807063cd6fb994ff19cff9c46db4b5a8077772dd99022050c0e259e8b27657b155262ab836284cd2ab32b7bc90844265472a0a64a2553b01210210fd51a1beba5abddc39405b29b85f058e333abf2552f37330875ebf270c46fae36827000200000000010160c548ef8ff605163f83269a0ec6662af90a68f8da21dfc9bf1e3e806eb1b1140000000000fdffffff0228beb71d0100000017a914c66c1acdc4f89fc616cb3139e17354b509970bab877b7c00000000000017a914792fd10093bb26a11fa703e7caa3a8f150483b16870247304402206a4e3a32364d4d8db7a7c57101a0c41e60629b9df01d6ba8146719fd553eeb85022033cc58ed49622f33927e2f3501e1d7a2dbf3d9e198d152d9519e0a034c2df72701210351cb328d7ddd73f27b7f0b57bad052d8638caf9e7ba8d8c0ce2cd720542bc37ab26827000200000000010122d5f239abf0b6bb6f97fa73ba86c90923e4324caf59551fae059b3d644da79d0000000000fdffffff023cd217000000000022512096af44b71fc1585f86adb3a1a4e70f0b66dad72785ca3260858bf19b58785fc0b80b000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380247304402201ac249f76ef36a3190501de18e5a7745ec5dac3513fd73759f0733663071a46c0220273ecb11d40496ef62d2285c98171bee11bb9440f708a3fa7b6083d1b97497ab012103cb555413a931fcfadc042d7e38d51744f1670b5019af3edf28e109180234f7c1e368270002000000000101160923c1db20f8b9611c6e7b78b612aea2e49bd95bed36d3d16779b760ae5bf30000000000ffffffff01d17b000000000000225120ed035ef7922f4d38ece1f47315b91128c2fca91d0e96649c410b28919df58bcb014019e04a96ab7459c44e17bf2c04bcf5b0c55d1e75ba36416d2a19b8336f589eae91c995c7275feb04d8240db91759c76d6025b64fd4c58a77100b6044fa12aa8700000000020000000001017b629b94d9cad05e0467809c0549873d69a5ce131d4a7f462dbbeb55bae4f6360200000000fdffffff02e6261d3000000000225120a3d8d4fdd4d7745735fdaabbce5ce561f69e8f89e337efaa4bc8e1645b1cc0cee803000000000000225120ea6d1401e6c024902660af633bd1d07b2395042b00d4ad77055a8f521d84b4380247304402206fe259315488bb8e83853dfefefb9bc4e8f88b4968fe9cb0e24a06e9d40816940220779ea1565107e4bd43846574c10892ec728b9beb9e9ef34cc2b5ff3111fed8b6012103e04b48fd1dd6efe269958fec3848ac21364ce7d6bf37aeb7e3df24eafc30b87fe3682700020000000001013e1735b8c19c2c78589e66cd3cee6283a466a3cfd4a1542c14ecf0224cba91e80100000017160014f064a97987296bb6c45e35f7a87f165efc3a4396fdffffff02d309fddb000000002251202356402356e09677936c923d0fd418463d088a7f9bb404c7612c40016bec705c507c0000000000002251203666e52cf2d54f1f85d4cfa44fc93bbc72b5b06f0c6d4957007117bc5a6fdff302473044022065e03c2e112685a86fc32ae02bb9337ffd393f910bab1b78a37c73239cfde986022002f5f074cfd4b111ad181aedd5fc71f88fbea49fb141fa97b982bec96477ca290121032696d588bda220a0b988e43c3609a4faf48a0539cd15fc3d3bd39207982fad11e368270002000000000101fa0c941f16287519249810cb882ba6415a677ec6fffae0200717f2de1c2390b00000000000fdffffff02037b0000000000002251205c03aeb4a71ee0242a3d0400faac47527ef084ece645f0956a798ab6dbebbabe368efcdb0000000022512029128a3c4d5e97b63c7851d4971e3acc8c49b3584786b9b75eb743735d7b34190140904df089b7ea32bb9e26fcd37f02d0a111f0dbbc068f8b45b8ce4f4a50d2127286199bac94a94f6c3ee36ab4903efb51009a34e140a68eeea9b78c66b4daaec9e3682700020000000001020e34f869b7df72d05753233396782006c26a5265978a9e69e330e979bafad3780000000000fdffffff32400876ff0b1d2cf5e0dd3895cae199da9216dfaf586c287a95e98fbb70a3630000000000fdffffff021027000000000000225120c67818df037c4607ef757b9c582349fc125eb0f5c235e0a93bbc22a52a84e2d9f4010000000000002251209755831bb176dc1de335905bbbb23cf9af92dd530351f6334512b14d67f2bb8b0140f74ea71183fce1ed4877a9829112a0850c269e70b8256976778b77a319ac4724a7e6e5c8745f70b5133ad15acb45f3088d8a3c34db7f2ed5e2ab702e4cee45bc0340965c8ac09b15b1d9bdd2067c3ac69d4d2b4b3f26f7e54825a4cabb11513bae1662d6a47de6c48650e13855cc27a9b10bd76f2af96474142b8920146de61cf840a6200c69723642ac4f172417d84b2dc94e35a1b043f10d0a73d446db096eafd8cfdfac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3801032061bd232d192f0d8c3403120c7981fd706133fb0d9fde54ac87e7f84a3f59739e010b2015be62b3c44b9464ac10b37ec497418f7f70c31316881a58ff9323f1e50e433c0102021027001564656c656761746520696e736372697074696f6e0a6821c10c69723642ac4f172417d84b2dc94e35a1b043f10d0a73d446db096eafd8cfdf00000000020000000001015591e19d0a4d2c191bd73cb4fa592559273f7bd27bda6b7cd639f995aeaddfa00200000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bebbd6000000000000225120549d43598bf2507264d81ce6bf8978989ddbe8793cf8816194cc328138462c820140d1a2b53c670b0821513e4a195992c2b2d757d537c2621122a523a58fce6424bd170f2b0e4c55c7941291f50d2e3b4205d036b3a44b67a68bab0299176e92a86e0000000002000000000101143e3a614b4422362433eaabccaaf25d7bc4a8848e6f197cad4e1a4a92dc9f6b0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be63c80000000000001600143b774d1cef441ebf4d29336993a4985424cff01202483045022100ca110ec8735219beef68679059e46ed5bd91367df5909090a933d8f557c8af810220017532de3c9a245e4a688852ab484e49d9345d7753e4a87d987e8f94be6925dd01210328b996830b32461ce89f5196096f7ac9dccef97712dcb0cfeb5a974447ea009500000000020000000001013e8e4903bf9db25c3a5e1c4a56b37f9d7e015457232cc142ad6ae688ee6fb60c0000000000fdffffff02220d831500000000160014719f30c90d543eae949738ee87ff9d9e58009633428b000000000000160014c457e5ea8158f8b6823eccf00393ab7a25d6c37701401e1fd3cf34da14e87f7caf7364131f264964d4c7a7be460af1faea5812cc3c0e3bdeae80c2553c166a1b27dbdfb389c60ea34458ccdba92478bea6b3545c1ceae368270002000000000101b6ebb93df614aaa38fc8ec8fc001042c70fdd3cd40b2c41863183a49f251f7840100000017160014f6a5233e4807641abd66ba4a257d9b4f959b241efdffffff02c9c300000000000017a914b3b9e80453e8366defd9d68f1a44a6c97e7892b1877c3dabf00000000017a914dc3cf63d2491d68b525808f039b52da9c1980d11870247304402206d436b9e3466f54b5d00ba970eed02bc56692dbbcf267f65f743a2cf43e697ce02204c86ebfcf62ed4b7dcc8f69aa04cd194d2d57b6575cae8fc10ca3af1c9cd8915012102c4bfac634fed0538df877879cb43520848b8b2ab999371c55269e0c959211a17e3682700020000000001015c07cade8307c6904abc67986153a65b5d912f41a6a51252c51a1b1d3ff014c20000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740becb5b000000000000160014173098d96a063d8939afecad0d5422f28ca26737024730440220289864692d011b4283e51c605fa4c6df8b6b3d8d0867d8e5d17c8fb5983b0e4002203171f62cde45c8f92ab380e2717a6bd41ffe74d61f2e15270381d5bdb3d60706012102210d52da7f3bada1989b620399ff718ca04a690663b33696a113a3113d0a81c900000000020000000001013e8e4903bf9db25c3a5e1c4a56b37f9d7e015457232cc142ad6ae688ee6fb60c0100000000ffffffff014eb6000000000000225120ed035ef7922f4d38ece1f47315b91128c2fca91d0e96649c410b28919df58bcb0140159eb54f61615d23202bec283a95d48534d64792f2d45983e02ba6fe41a8b450efdee873d74d925eb2206991e743f45c1f8293899d63bc50d927c2402f2e5a0100000000020000000001016d513530f1fb11a503427ed23b4e29bf51dd7e379d9c190f22ed0206daba5db70000000000fdffffff02e6ca000000000000225120a45bd99cdebccdb64ce4516bf0919153c5cbc45a270fb078cecdf83ed76a1cd3e977fff20000000022512029cd2ef141be8be3f3d1d8a79ebaeb95cf5c9c66377f6c924bb2da1f588b1ccc0247304402203f092b82b7935ae4bbf0b8ec5978b6d2b2262c0da75728e63f66ce0dfe906f28022078b281fa47405af160a5ae0b49397014e3034d333a82e546494d0641ade95b9d01210294fbac4d9baa785f30f38ee0c9e8bab58c5a3bfd6ae87957484733b06e73099ee368270002000000000101949602bdf9ddc21b70dcc602464309dbc947fafb5369aa48c07d2b8de70822cf0000000000fdffffff02e557f69c00000000160014341084821f49e849f2527cddf9a916a07620648d76b3000000000000160014fa0ea487b7655267144686f9d3cef5f72becee890140b8bbe06ed890b6772748ab4f4afa5a616c69d22aebccae33140c64256f747979c458e1329fb551bde03b531e269443827260c5216b565309d713b98651ff6f6be368270002000000000101133d6871d9c3a3c07101116cac8d6d77618ec42664d34b76aa24ce5e504654430000000000fdffffff02f46f78d40000000017a914432959209497082c8cb9fcc801f7fc80fb025edc878dbb00000000000017a91498a6bc2c28508d9a51b4758a6c61ee9290745e5d8701402c98b5b68c7f2a7957ec6e205cb41142ae70152908fbadad4ebc0ad6e0fa79092f1bae91ab4a5dac6093adff8679950978ca0ebdb0f052576db46816ba9af413e3682700020000000001012b23293ce2fb429f3061827c9a7230668d3b4eab7c96ca95eccac89b199198620100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be8ff01000000000001600140b846469432657640ddd37a8ce16c6161dd5a36302483045022100b1af5b9164802cfeeeecc20e743866482235dcf8889d1c7ae01b7798abde666402200d72015b78f12374a012d925a7a222cb9777e56e3d394f07bfbbad83a7ba29ee01210296a042dbc40be1f3eb8b0384abf1e03e6cb384cacb3e2cba72259b7f5c2d652f000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0100000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340d187b661d76919d85e6faa989b23aa226efeecee88ada72957aefb91788b8216e41f70e17775036ee9ff9db8a4a811579380aa85315806b881289a1e3c2224bd792044759f8b7d5e91ca4dd7405c2fe0523b7c5415140eb9ec77184ca1cff3255ec5ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e600000000020000000001017f477c704dad79196b12d494a78aba1a1fc0c68bd6613817e392de89a22766290100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bef24a0000000000001600143a761a1e47669317f757d86543da687b528b42d2024730440220433e9241a2c1f3b2f67ad0205cd119159cc7f8498e0e18d7ab46bc428a5ddf91022021a26adf81bbaba975f5505efcaaa6a92331d293af699cec16e3d7505948420301210246f2e3c13b102de1f0564e0f7cdddb24dec1184a427e9d806065e5cea0d326880000000002000000000101df1a3f1faec9cbc0af107ba30a8ff62305578bb0bbaec963f1799a2525b5e89a0100000000fdffffff024de50000000000001600149eaf9e937569c9f506e03203d03729df78a2438025d9120a0100000016001463213bf0e901a229cc17ca7151566c4335d536d80140a473f8e6854a0855725e054ac1d496063ae8c534d36c5bf739b36c6537cd39c0b1dda760b95b7ff425dda0b7bb52450ac53f47d2179c0f4c81c2fa6f79f5123fe26827000200000001bc3c9b692f6b8276560491d5f3043f9e8176893ff581acf430b06e85e7ce3b70000000006a47304402202c001ea590b52ca818706e0a9b1f267696ff3659ceaa21be3b53df2e14e92e3902204696ce9d5d5c406dcdafbb1fd87c9f508ef81f54ba639f2eb5bd80221b28077e0121039258ed44d3fc81c4848b521bc252f3f5981de0efd10d12a5c36d3e804f830b39fdffffff0233440100000000001976a914b901537319f837b0837653f61df62d526d84897a88acb0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588ace368270002000000000101e3b1260f829ed8d841e2aaf02a9eeb274747433a4c14225de2e7c53795c471570100000000ffffffff01630700000000000016001460426faa653c536502e0a0d35658d0ba259a63b60140b084de54a07d0a648f0df10a06550963f8c723d8a7847f3bb8a4277e39707e24f4857b1be6634cdad7f758cc5584ef56abe8ed274212b3ec8b69349f92354b2a00000000020000000001011bcc107556e995fcaab6114f4b4bab96041cff8585f4bab3415f0f5a55c9d3be0100000000fdffffff027cab00000000000016001482cd198da5247b202dea09264ad251d86cbe9668e648304701000000160014b5ed5ca3cafe0a3a974ffb6a33808101a1b783ed0247304402200997ffea2b13d606742ca080ed476a0d4ce929a091d1c21d9252d1495d8156050220175628ef8e651fe93d1bd2f25430f2a100b9d6a176bd14fec837cda1c36c2f0f0121025299418ca8d035c9584e622c671722466ff69c24926c26f8420d83afdc8403dfe368270002000000000101bbd9884a81d3162d01918c0d04828c6c96ba1e46b23ccb6001a6ecbf8bef7c5c0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bee593000000000000160014eee5e71f9a154d36324be79f7b8477b2a3cf3fae0247304402201a34ee1d80f86e0dd990456c071192f877ae7957934ae7ec4ad5af8f498481d902207aa22de47d22e97b2cf3b1892cf747e822ff7dc49847da31ed338fb5be7a326201210265dbb041c739896bdfa602ce607a2f7a80b1c8036fbacadfa5fe86c62f9e6c8400000000020000000001011344993f99fa03dd5ee74fa33655bd695f6292b26fcccb076148bd09cd6d74630100000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340324d2f4a099dd0badc795d8ab4c15741e67d65753d02aaf1207275048d941fc692deb707a3a460ac18088a4187bcc2ae8c6284b66b43fec28d55c2579de92d9e792074ed17a4b8620a11651c0dee7209bb86e4c27434444a1287f86b200f9edbad27ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c1c4aa6ae80b9f2a6ec56de12ec04c754a0958f183cd936cb7891ffd8bea44eacf0000000002000000000101b54d20bb063beedd6aff9ad1e5f927003e05e8ac8b186b7c3ea55332aea3c8dd0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bece060100000000001600145ee5b914f952269259e933175fad8778731f2dbd02473044022029bb82b8b8d977056c363d28fe2516b5df978a58ec3196da2b49ebbb5b3232030220417a56e0feca8a8a4d186bd0556257c9cc025c56715467868d4ebbc66fd5fd7d012103a34a9e34ac3fcd42c366b9baf3752a091f34f18060dcbd5d49aa0be8ad01f9ac0000000002000000000101fbf9cd6a2fe94f9531a4a95820982bec8af8a34eacef2ae3d23dc5b0e0594aca0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be0b3d000000000000160014d2606b7c86628e18d04ede110a5c67345c1dfe8e02473044022026c88afdc241c3ee6f95be016227145a96b5892f3c4ee73e62931e5c9ea3c6340220289c49feb5b08c821dc6da6a908c476edf421d3f523b0eb57a83494bea088db9012103dde7d6c0dc5baaf65ea74b2b7a7fbd34bd2a379bb541b52a5dadbcaf63a1acc100000000020000000001013225d95a873113c572c736792277dee690d0bf2cea3039c36ca6be9e64a989530000000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b62de20000000000001600142e875b658205ae783657253e8bd6750015a8ac1602483045022100f6aebc901de538340212eff936100ea1390a2aeca4383533fd744091375ce2ca02202fb0bca0bfec18611b664de8bbb54cb932a12810f4dd9292067901c6ffc2314b01210213238154c29c26cb1e39d7c3bb638881065085ea9365aecf72209a36b4ffc6200000000002000000000101967fae1310387a7a72870af03c01d024910e92d56bea8a2106e67cb4e65e776401000000171600140c7decc9de487b4408f4c6c461b96de75fcb19e9fdffffff02719f00000000000016001413ef23b2ae1de6237f745c03561eded671b07ddec1a53b2701000000160014991f11f3f3b80d99bd90bb4fc568e5465ac5761c02473044022016a687be1e97001f0e9f8d138e556953f33a91d244b21d06f1932f8fc7a7a353022078be138db11d2276c603363fef7d997e1affcd24d9719c3bca957031b70d57ab0121029ffe3c2a904105297af018bc4deb4a7fc91e56285c36591defece6ab5a7dfa42e3682700020000000001019852246fe0355e93ef0d3f6dae0800db841da5ec7075601e97b8d31e75fed70c0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be6d8d0200000000001600146b5e9a4686c682f4c9a79441b65e25dccfd052da0247304402203ccb56fc650264ff56453a6ba04747136076f0185dddb4df8ab2cfe5ffe60d5302201b36d29cf79453526e99aea1a992eba050fd82ae346190d0d1d75098379ef40d012103dd5ff214687d8b60f0b12db30fc30c53c722cdbbd77011b21296e45615ccc2a600000000020000000001014c8ec55a2c8df73180e2c8ce1ff0d0db076992bc7a2d288bce8b1c8741ccb2d40300000000ffffffff012202000000000000160014555154c233dbc5ffae20719896167045074cca56034064ee5d0db86fc18018e84c75dbdb7ba5c16e51fd8885f536f2a30e521c54889bd13e771852dd0868cdb1754d07a62b184647070333f36c89495746b8430f98e4792064e04119920b27b96a7ea8ab6561346586d68fe239380b77e9285041a7fcf78eac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c0d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc40000000002000000000101c3a9bc56a1b96fd590bf9a4be4d3710625c74aceef2a945f8af91e7586e3a5f80100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6860e000000000000160014634117339bd4efffd32dc5b18f15dc2dd6184d9a02473044022004cc2c83989be56d587d9970388a3ee132ea38047e642b8747a37ac989d9d0e602202d0bcb4d2457ddd8b360f30dc053bf0e08f8836ea46a441db450483585710c3d0121032769fd206b9866a456cf10238c870439afa54e499515c1d5bebc7d9fbe78f3bf000000000200000000010235cbe4d590e1faa7ce90e9cd8fc6c3122a3f2e35675133bd9e7d5762447164430000000000fdffffff35cbe4d590e1faa7ce90e9cd8fc6c3122a3f2e35675133bd9e7d5762447164430100000000fdffffff0145130000000000001600142502477d1691819b880acf898760066f3d56974b02473044022048b916f67bbdde3270a57e26cb6b30f97f6d585dd1baaff947b69704edf6d15c02203ee651632db778b756f8d5e8225d7aef25dd4c080249c522addd55b4d1bb28c101210387cd47b68cb4744861dcaaad329b4e52359b2fcbbb9c28ba03e258826fc35b430247304402202468fec97abc5e0770378c557de8c6ab348bf637ef1749dc1403eff9065d791c02204b710d7f17741c2222b02822dbf0e6a98624e1f22e8616ac932e00bab892527a01210286fec73f77b638515852de255d6fd0038befe634ee9e578260ba4a771644fce6e3682700020000000001011b5e2286f6197d775ae156d996968e5aa1ffc5668543be28f9330e5ab0b215ee0100000000fdffffff02529c00000000000017a9141af78b17c6999c5e4b4d202e0e7f2f07917b2b0e879940d60b0100000017a91404776eb8ff6470c2f300104c397374bce2884db68701403fc7fa466be17b71c80a6f2a5d72d0bb1a808117730c7ff897aaa8cfacd45033b30bef04ec29ff829da65813e6cceccc6bc14e6586890f7c91d7ba2b65505a8de368270002000000000101fbb573065d407c3f0fa505545ccb31361b6d88c1a88c5a3aba5112118bba8a8b010000001716001496011f91a8dcffa37d77b7dd127d2b26b53007b0fdffffff022463d50b0100000022512024fed84546aa14bfadf1e600a7652fb54c12aa864f5bdfd45b3bf1dd9ca7bbc8b9dc0000000000002251202cbb8dbd6144b1442b31d3d852647c2c8550d39f339fda4ec080a831ff17b64302473044022079b87d140235ccf20a08b1cf8e54af63e14b13b07c4b77ba4288c762dc0c0a3f0220313b0b6e6fb356046f6457cbc84606d96daffe6051ab8b62ef25697c0f063e2e0121027de78ca38e61ae056e1ccc5137acc68b7acf1f8dc9ed181e1335a2a2c99e2e0de368270002000000000101e70e241125184ffe0108538ab2cd2a4bf118866188528ec46b7ea3ee1d7e5ebe0100000000ffffffff014adc000000000000225120ed035ef7922f4d38ece1f47315b91128c2fca91d0e96649c410b28919df58bcb0140e1de947513f90d20faf04eb4e1811e589006189c79053f4bdcc7912f3b7f8198f4641533a29528e69b01cee495228db5eec0fc0f2907f55ac6589a6eee6c582500000000020000000001016d93c96f6a90ddfc56b545696091f6bcde554c9397a1887e7d87169633263bca0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bededa000000000000160014fbb104f53478b5d2d05225805d8dc98eca503afc0247304402201169d5383de38c0c89b27ab3097b38b6d7510e39b97e08984be8766c68aad4b602203472f4d4e726d143364deabebdb43cffb62029f2a218598a1b442b53ce7c3f4a01210380c81b972359659cdbd39bbb859231b33955692d9064243896212ea25acd7f4a000000000200000000010174523c4a854ca4e85d6523dd17111f566faaeea9e738b33f82d858c233098b150000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be953c00000000000016001438d05e6974919a3de476561e6ad09e56bb6062ce02473044022024424db52ac9f27747ac7485cdcfe1bd3a7a2a57e7838382b9d567b78565ad0e022016e6a336c3d78e2c6870fc5faea30f706d12961e044cbc82403d34ca8f588806012102cfd18b478df3edbf6fe0dfb59b329313bc6056c43a093e000bc789bf40b8609500000000020000000001012a9039c1b04c395a1d86641408317c696f808ad4421ce4678b759ea8307a669e0100000000fdffffff02f76b9b5a01000000160014df2c9b8006e4a7a3e734392f7921932a6a3aaf2404cd000000000000160014d041a3e6b9ee8d356279ac53ace7d979c3f1e7ed0247304402205e5700020775e8d91000ea4ff13ec9b4c4eb4c426a7efc66f1780d32df9f2fa602204f9246208466d9a38d84e15b256b9961c7a453cb2d96e2a15af53784fca173f20121021d7593f99ca1a19a56a5e44a41d9f3e9b6736f03e78f3817fc1ed3a8df16a9e6e36827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0d00000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e03408f2ff90bf49f6532fc1767fe6b930488ec28b186e6e2fc400b2fbffd2de3d02d59082595543305ea0c46928bf7af13b5a1d2bef061c1131a5c7359dbceb231627920a1b09f144bc1e63af26802d6ee399ea3689248136375cfb53c2018501c197b56ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000101c532fcfc02e5fd8a7caa20629706664962e46cf0a507a9f3339c97ef8c8bf41e0100000000ffffffff02102700000000000016001460426faa653c536502e0a0d35658d0ba259a63b63216000000000000160014e61d6af6a55a3535275b4acb0186777869f6eaa20247304402201609da170da37e9485d2e5a13739eedcf3ac2b7ee80702a5bd040a496617ce200220334648350a8bd650dbaf48b7fe7645e4d3f8fc99b450636eaf429126aea6d1010121033692701cad291af0156ef8b3c33562a6437e44fd303a17e9626ebc3c95665edf0000000002000000000101ad7da7440e6c0cec0de65e06dfe04c10283468fa747fcaded096057526e1ea21010000001716001483045afd057775ed0c8baa870179b248b6176802fdffffff0255a400000000000017a9142705ab6b6fab1950e8800367d2fd563ecf1ec893878198aaf00000000017a9140eeb15b583cdaff82ad381d11faf4e359cf935f48702473044022073f1d46bf1d242db098cc5b42fe3a58d303955ebe1991e4b8024ebdd56003713022014cf52e2258f73afb88184431aa79d6cce6d5a505f61019d709fe5e7b18de67001210329c91e2d19db4c479625f2e996d2b08f32f8e75ef3b5c45376d0adbe7b1c3cb2e368270002000000000101f4353d81a411ef45fbf17ced45e57ffb80a55b568bba2f5baf7d1f2ac515aaec01000000171600148f546c204ea36fef02f9ee093b171c4646cbae7ffdffffff021bc90000000000001600140ca82cc8e83783336ea951085182d2c7618ad66ec2cea9f000000000160014beb7c3dcf36e7af1c3eee719fa9ed06f249c35c2024730440220698b76f7c45563d0fccfddcfd534af2f05208494ecec1a730a14bfc06a1a8e480220786d312ade1de806e96d6a1f7774b8654b72b450bb8786e3075946354288c3f9012102e7e956d44266e34cd0ddbb7371fe1e2aa05f7d831aeb70961e717371b5177b2ee368270002000000000101169efd0a6e43d1034c1d8ac5cb2b4b5fe24186dafc58611f2eea96e54a0a57b00000000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6f3d800000000000016001422ae80daf7ecae753564c317bc32ae5f0894480d02483045022100fe33c255dfce61510db2d34dd5284ca4cf532df62e543badd3c3a5adb42091950220028f996f5e13e2568e2b69ebec35cf27188546a36eba9b454c8c670fe50d0c46012103981aafb7b2b055dc2b1387eb4cf4d1410310f71628a0711f2cd4e399552b65e7000000000100000000010195c99f0e7711e88c2ec9fb22bdb77c32f8ff01cde504bef427d85635db86d5350000000000fdffffff01c1010000000000002251207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d034075f9c8dd7dffb95e5b3a01b7b1cba26c9253c6e446c4607b86963005cb64e1a8aab1e9050044d1d519b7a9629fe7118e953e05a6401daca73265d2e09673533c7d207e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800377b2270223a226272632d3230222c226f70223a227472616e73666572222c227469636b223a2273617473222c22616d74223a223130227d6821c17e95a10448c199672d0af43fc85ee42f8956ed728ba9fe4ecc4d909a0162575d0000000002000000000101c14b5abc1a1eb9d130294903485617ca79bd734388c707c76d61596a6dbb0e4b0000000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bebc7b020000000000160014a9f059f06fc756055266c7aefb0ac478506e448802483045022100b61dd7f5cda1f0d8ba89e9bccffc75ca66c56e24c787e74cc2841ae2ae13f05402207e473de1f5d51a25e20376c4a25089549ede7ebd804ab9bb29fcc0a55d62ed040121037bd10e0c2bb1e7c28554d1098a98a21e423e55fae6a725e84e8cb8601e91f1f10000000002000000000101cca0d28e693f25ae1b1446a50af0aca89668a4ba4cdd354e4586678726c3f8380100000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be561600000000000016001475581935517d1e8e8e46ed26363c6ce99367f8d202483045022100dd87a03d308c11903aa35552314d45e4a56cea7144ee4c2d795f8c1c3aa4e04f022041af5307b330450bdbb2ea6d5b86df43e882608cd7b876a4848116294370c1ca0121032329493b3e73e8bb37d0a3674db0d665963b8c7cebf4076a117c41603ef8ccaa000000000200000000010198bb9b138617441fb4ca2b2c24cda545c4a082d6a33ad597384cd059b6a939d10200000000fdffffff041027000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c260000000000000000000000001c22cbf5e0920bdaf27103817fe18e32369efe7cea1e0000000000001600140847ee1c713de96e68d0b837c57a5b07fa9768890247304402203835eb3f837cf887669562cdb4690b08651cfa334766dc6c45393d16862943b402205f4fb98544d0d22f3ad3a1120279877839aae4f8487112f19e51597512c97afe012103111f2633d838ed27a3b1a2def045bd441acf261b44a0a1f11a871e203ff9604f000000000200000000010147fc2f2459789f42e35aea33328aacecd575883317cd5497a5b1b0f036d356d70100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be0b0c010000000000160014515f7a9348ce7e04523a3e448e39d6da49c2e289024730440220213b1b68055da3db59012732a7f812e746ee0456198964158fca319df5f6c7000220034726fbddfdc0626b54665f308faa152e7c45e39f5c3e703c9e0f2d31d5ab2a012103ee265cc697e1d978307fc180b9e7fa8d0127afe949a2c2f0c4af3210d1601a1b000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f1000000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340a65cf7b233696f5e8ebf9d53d54fd557b70b0b86113ef445cbdfe8fef4c91b70aefbf48191624b9946e18e4d042e580b1c4b37c893cc0de3c0f7bdbbc12d5fe97920262f82f8bded65999260db3c3942f909794b50ad1cc58d62a45ea7b8ccadb313ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000101f160b076df7d94c444038cc603a073020938631a9dbf0ad1c484ee31eb4d7eca0300000000ffffffff02807500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bee63d0000000000001600143ec4b370330b4f1ebddc4ee002470251f55b70960247304402200f156a2824e9b4332d056a6d65708ee90347e81e483569ae13748285dd89152e02202f344d3fa885e38efcff3904de99795501aba0a0868206d590e58b909cdf8bc701210298e7c114a3d9755f93957408bfda69d68cbc1f394dd1bc30ebcdabea5bdfbb1a0000000002000000000102e4e097fee2cf1c64e06b8aa912e10e0bfa6f6f1de0d05254aa983709c4e543ca0000000000ffffffffc814c68cae39d230f377f678bdbbb9257974a7d697ea54a5a1535751158a43210200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b1a65b0000000000001600140ce868025cb1b245d83ee56920b1b4f2068f7f0a024730440220082b877fa629d52604e6e061d032a6388c87d6396766743375e3013f7df6cb9b022068da6961b7c8fc285da82419fa84515af7a4f73e1c1459ae5e58c26af9ffbff4012103f86f81c208c9f38208c9881817aa2922455b0c76f5828a8b85529afdc1429714024830450221008e4a130244db6d96278f3fcec28ef639fe4e0f0acead19873077c5ed0d957d62022009e2d73b1515cb080c43d77990366d7cea61a8e016866ef790451a0522ab58d4012103f86f81c208c9f38208c9881817aa2922455b0c76f5828a8b85529afdc14297140000000002000000000101dad84494059ba4237ffadebdad38c7189db3580b5cd6d0583c6c2f922723ba6600000000171600141986ff48258b1f81674574e7a218582325f99b05fdffffff02d19a000000000000160014cb6f8de944933fbd955cbb3554bbc55e6a24ccdc463b84e60000000016001427a32e0ff8bbd48d6fdf6bac055f0f09e8ec97ec02473044022076e1af264cfa3cb9909d62ae8f378513761eea3daa777c61291d0239da9fd54302205d3d408564284c5b347ac767922d9338ad6356adceb1a496affb66637328ddb3012103f0d0268489d9a134fd349f32bbc883ac328769c179803aad4500b31a4eb58e94e36827000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0b00000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e034080bbf44e8b67a0305c105e33be7273890270f0228bd9c05a53a31d1582bdfaaaac0abb8076debbe1bbbc3991d47c500b23d8fbe42d20098df61e8e2222b89fd77920fa11ccf615a287f9bbc1887c2ea5b2cc6a4e9f7393e0dfb6d15f155af8b30693ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000101626fe6061edefb8cb6c2831455a7472f6c40ee848554725739e05f7a29fd7e7c0100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6860e0000000000001600147b53cc4eedc36dbc1473fba7eadd4c66b4a7ca030247304402206956d96858bc72998d8da459284c2a0a1de3a6afb481a52f3ccd0f6b05e58e2902200655c213e9bac3268c4797993227fee9d61f00fe5b1e231a632814a69eab7172012102376f8f583809052432aa669adad861c324b9ce02d93cbd59e4ebaf338fcc7fbf00000000020000000001013673e716c2ccd9451a47e67bb906c70ac8b57b69a8151b27f7d996ccb1c0e5200100000000ffffffff0253d900000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be3026000000000000225120f2ba989f753ecb92b6e626d8c5a38fb704030d2e0265a570a737c8cc4a55bbf101403a6cbc60bfd8a9d72f681d3bbc4e5ec1f62524179f219811344b7ba9edcd65d9ac71bc08d87120e6f9f911c99752627dcf5c122d44504b62aa2b188f8ac9c34500000000020000000001018fd55c7bfae2ec6a01dcaca2ad6aae546af897a4485cb03d72ef4102f9dc5c400300000000ffffffff02767500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beae3a000000000000160014ae522c03efd95c575e2f27545ad02e2e307280c502473044022032cbb4f2f18c6dc20bb9c721ff9d72aedbee6c2a923cf79a17b70904a09b0e0402206d229d82d3583e4f051b5523c84f6d362d92043436b769d21b6fa50003cae9bd01210309b246dedd5e4b6311591f792cca7f585ed9b51c687ca0e403a37d82d07b7c7a000000000200000000010181250601da05a605799ea8b6cc8492d29e9237783bdf358129893909b32fd9a50100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be4158000000000000160014f56a4e5150b097921964741863754130792d94b902483045022100af8617b9ddbf3098f8b5847b361115ec230ccd49415797b107555665ba50853302206461253bb39e7989167d684ea10152ae491e484800e671aa7311602589f53d1e0121033d30ef23878f4082af9cc579997477a644ad8e55d6aba9ad96efe6bb50a5a95a00000000020000000001017d7e6d349c55bf17a9664a7595df003d4040bc3ae2f6b94f438af81869d057330300000000ffffffff02447500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bed464000000000000160014acadb3877c78a6cf077fe3d05dba243efc291fea02483045022100e009c40d9a8f51a02881e1107449208bdc012afb6d5b4b2215631991d3fd75620220495f3830b4eb65705461397793828a4392c26d9baea69f2bee2f87e6b6957e58012102ec987f6a8667aeb934e722d711d6804577a7d71d67f013d5114c38917de566c00000000002000000000101b45465d95f9051f78a856f45d9ab29451a79e103583fb6df3cb23f5afc87ede50100000000fdffffff02b6af00000000000016001455c6fe4801130a284c1aa2bd92223d8c5c45f2dbe228120a010000001600146aea2ca09dd53b306ef5f7cca79cbc2a1bd997820247304402203fff8314d89d6a1d652bf8a5eddcfaa4a7546df85ef06494ab4abb2c69754e1702201ce47023879d744ba476d984d79c4d4bd2a8917d9ebf01dd661cfe7ceb3447b60121034c78825370e00b7ad685cd8a7c506db35ebe24314f43fe39775546d18c34b4c5e3682700020000000001015a521830d9f09cfaf084722d0f319a5afb731b70e79036b477a3d1d6a6999fcb0000000000fdffffff023301000000000000160014510255e0fe95337302bece2f86c80ca0a0f65f860000000000000000226a209ba93fe45acb8db01ad214a809296eac6b56bbd19e7976af523cb3aabbd40d38014001218a52a9134ddc0ba7da393fb8560a5d73622db24ff71c6787786d806d75e9e655a29aba2e9195c0c40b9ffe37f596c672d7f4dfca4f2a1a6ec82a25a87660000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f1300000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e03401239d675da34833f4fbef62f4b06aec1cafe1ea304d45fd39bcdafbf892de492f88add4838ca61838272b561329da6176474f67967dff871c02e61f368de4ae37920dc95b6690227da7bc0f26bd346262f435445f986c4f5bc9dc7c8f9efd50fb4c6ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c070d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000102105b331fe716044ec22bdeb932a2606c16427bd02ec8f4d18b5cb63a1d38f49f0000000000fdffffff01813d0fea75e365ff83cc5eb54c233ce79d6365cb61fbfdc32463d31e6e0e2e0000000000fdffffff02b8120000000000001600142502477d1691819b880acf898760066f3d56974bac120000000000001600144411a000e17daa963cc3c12ad553df9e149f69180247304402200de6cbe68d790337242b6d3e8fb92b7e70f0cd8c30d3e4f07d03671c610d54e902207d133486cefe56a817e53fdfa453df16160b69ebf213f7df9344b96539c556ff01210387cd47b68cb4744861dcaaad329b4e52359b2fcbbb9c28ba03e258826fc35b4302473044022059cdd2eafc603d0900861d4555da3e9c7d17a312789a7702773e4aa990de9272022023956a9c1b16583ee146af8f524179b0c26f698a1bd505e62076f4b57d533d3a01210387cd47b68cb4744861dcaaad329b4e52359b2fcbbb9c28ba03e258826fc35b43e3682700010000000001016538737c27ec920d7c19b5a911e963c323a9462f713efcf764e61537be9f3a780000000017160014c2815c686296d1c29d0b6437e167c7083d1272b4ffffffff02a68c0f000000000017a9144636b28bf7fc31ad1f070aabfaa2bdb4d7eeed0987580200000000000017a914d62f7789bea9be9b0c0195adfde7f9c1ff9fde41870247304402205e1d2fbcf35ad14d42c503b499cfa939cc2af1f047f8ca69b691fb7eb830d659022016d4f97c2265a8ec289e062a8926c95ef27675bfb32bdf6e888e424ca2cf754d012103d9767351ef66272bc3074c86365c1fe4b18dd2b6dc32f0d037b63c478c7408980000000002000000000102c8460dc739656508b8ddbd34fb1b0b293de0011fd2a4c5371cea5646b81cec9f0800000000fdfffffff913587385ffb2e471b6c6ce4408ed52edb823b6f8b615936dd2955366f773930100000000fdffffff0271195f0a510000001976a91440f41178fc365d70eeb6ed6017775cee053d64c388ac583e0f00000000001976a91404a18ffc907e320b3f777434f2449da0bdd35ad588ac02473044022036fccad914d0577e02e8302729e92ff87fcf99b463a0ef2337dfa78c422144e102202e523d7c0cbf490a9f2a007bc424fc4f3dbbffed7a36552077b305b99e031ffc012103bcdbcc737364081cf53e768d7ae33edb7a9639413cd0840358ba902f7bd8515a0247304402207f03b371f1b5cbccf3879a1838efb5976787bab55ca381544873456a86559aa7022021b7cb571cba17b136ff9c4e08b1cf7654564d4e215ea0a41ac0d77cfe70ae8101210230570bd9862e8690400ab73e025b4c0d47251226ba110590018bca6158736c6ee368270001000000023a4fe38e6fed91e3599b6ead4aab95c23fcedf9d65262ce040c6b0744dde6ef6000000006b4830450221008516d99e9fda967749be108a3d741c1b6830239d358b39d78c338daef975764d02200e48f726520d1cf68fbace2a2582ad96ca93582398c9ce5310524e39d2f7b36a012103f83cdc753b5bbc7b1b6268f9d46ac567b943d7f7243ec949a6cc769c762f344affffffff9673e5c68f2a5d04f8493230a1e51cf754573d181fdfc3618407fe2223265ab2000000006b48304502210084a96d1f8fb7893e2365fa04852a80e70c58788d91ca5af73b1e9a75ca25ddaa0220333d5cbab0be954eec302156277817887e3218d1a72b781b0f3fc16391b86831012103f83cdc753b5bbc7b1b6268f9d46ac567b943d7f7243ec949a6cc769c762f344affffffff02db9a0000000000001976a9143bd3f92e6a9f8509dab4b9d0b71d65f7bbfd20a188aca9150000000000001976a9145d58e47f34af272fa93fec29c1f1c8ae6fd4831988ac0000000002000000000101cb44ce09746b6c080bcaf12d43252bdb70c91e49a9844d381a5acc0597c56cd00000000000fdffffff023301000000000000160014510255e0fe95337302bece2f86c80ca0a0f65f860000000000000000226a20925cccaa38e00905fed4460ecf990169de61db326300f0d63abd4ff373c911280140949ec2c9bb4c39dd34cf88481e8da237ef0f81d2ef69bad45e2e6094a89d88e7a7d2b7336fc830be190f27538cd855cf0238f5d3f31dcc560e6fda12c47f3d2f0000000002000000000101de8f937deb755f94e8dfbd058f8966b4922abaef7112b7d7b2098858747688f60100000000fdffffff02e1bd0000000000001600142e875b658205ae783657253e8bd6750015a8ac16746a110a01000000160014eb02505294c646477f92cb576ffd502722c54170024730440220587a7cc03f0ae6b88814c52aa61712ae8dc9a7a3c668cad6cc399dd46dd42e9902206733cf0cc9f68aab11b335b963bb44ea98a3ca866f218eb2e3f35461ee78e98801210321b97bb6a99d980c2f5a589260276299ad3d50c3e31986a4489098ef196454d5e36827000200000000010112baef09fb8abbf284b3215d8ccf773feedd1c567c9ff1fc16bdb1a918a3f1f20100000000fdffffff029e26c92201000000160014318462bfed7debdc71b8e7a5b52804870559751123d100000000000016001411a4e990995b461e7b9229f85a2e8198f521b51b0247304402205d848f648d53d9fade03eae0f39de20e020285f6a08424996c240c3a8c0f6e2d02201d65d8182a6f1f016aea7b6212d1352d6b2f6c3702f82c98c1f15484814b6eba0121038d4a2685ee9070b13d0712f0147a2a68a353b8216379abfcad792b15d1647940e368270002000000000101cdaded13e06156dbb89a2cad1399d83413784d0bc6deb6ef3f1c86416bd83ac00100000000ffffffff02e80300000000000016001460426faa653c536502e0a0d35658d0ba259a63b6c01d000000000000225120b444d93944624cdd11e3ae2270cb8d606e8a16122a12cac114b58b47329cc1ea01403763c9a218b283c13513745cff25d0a3f1564f93fc1050beecfeec625979115e911e2661ea77d45fae072575858992303759792a1d93cfcb4b5e6dc25b8f0a1500000000020000000001014c8ec55a2c8df73180e2c8ce1ff0d0db076992bc7a2d288bce8b1c8741ccb2d40100000000ffffffff012202000000000000160014555154c233dbc5ffae20719896167045074cca560340bca7d4ba2979fb2fe3a5e0da7a179a2fa20a0df52dfc10bbd313d6fe29dd04dbc4bc35cef7d274f43fcf98b8df12aaaeba4378661d66b712c062d7cd6c32a214792055e74ab1e315c02adf806096a1c3608f5660d4f7be6ac7b00ec33d3fdd491f89ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2273617473222c22616d74223a223130227d6821c0d2547f88c05be9201bc91ebff833cd50aba85b95ce5420608dfbe84d040b0dc4000000000200000000010107593a5c389d629da36eef761098b2bbc6a389ebeba6d6f1d6ed76253d53e1a20000000000fdffffff02787f0100000000002251206487f10e8973b088f655ebfd78afe704183813f0e6a73c772bc1057f090fa2b2fa0916b50000000022512050904e8cc31075ab851f81a2fe75738f5983d0efb36ed22ffd08016b00e43a1d0140d6efa994be47916987f2f73d85f1f0258200937955894769cf4373455bae39b72228edd4798e48294acb95a250c20b6f5f35207e5f9af33caaf74112f1758ffee368270002000000000101f8a94f3e6f12bc8a5537e4ff2b1e89363d646d1e0018d28e1636d99f9c0c17ff0100000000ffffffff02e80300000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be5616000000000000160014c52ff32d2723ec0e1540c9b31e08f141125407be02483045022100b07962afd2a1ada886916b1f0048fb3bd22d24f9bdb30c643a9288b2635297020220155ed76694cd63048c32cff9c036f9f483128b0feb5b458bd46955e953afb4b90121039edb6a38684d8ae5bb1eb03c516f60608aa56f142e20b8c5926e45928a2a4471000000000200000001d524bd63c4adecfb708d2cc4404e66b69ea05bc92890bce5dced421a4d9b5029010000006a47304402205a247bef4c5287958097b4b0d81c20e1f905e39c331867a509a881e2e1632db602204c550ece2348864e8c1b5d565fe02de08fcbfb8127eda2d420e879378341e98201210201b082fd926f379783a7235c02dc81f78dc6b80b221ce8590b58b91f131de44bfdffffff02545b0100000000001976a914781715d4f8ad9513e82405e9549eb53c3fe5acb188acb0040000000000001976a91433660443a2fc9e745e3803f709e9f97d1a78280588ace36827000200000000010187dc69707af76aaa0f065963ace4def931ad35097715eda61dafbe614c2f047a0100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be3db90000000000001600149c78774d7e3c182f060b057cefd54b3357e2e51f0247304402207fdd2287616f4fc080b0e222f2069b815e4f79ff6463a9d709d748c6e2fa4ed4022076784f8e266c0bdd9c21c6ac4f465adabb571b060f0f835e86e6859e54656493012102b223717252f7888cfbf6cd80c80cf868373be67903ace0d740a933a0352aa0170000000002000000000101a84cd58c1c7c92fc3149ae9af057b960c18abfdd527e3451888711a4c94e283f0100000000fdffffff029be4fbdb000000001600147e853f3c41d99c4409bdb5163e972be9d8f3c19b19a90000000000001600143230dcc84c8c0ab891bff59f3bbd35c1032df3970140108a5621dd699efce8ab12010cd3d5a292cbc7954a557f302a30d17cf6d3bc0d38100761dc6927bcded5014f1ce710e5a72e2754509c21a0edc1175faf4df623e368270002000000000101b6f36c45418f576194a2a4a4d7bd0a19b6cd1fb04725b156df3202b693839d420000000000ffffffff02204e00000000000016001460426faa653c536502e0a0d35658d0ba259a63b6cf5c00000000000016001482cd198da5247b202dea09264ad251d86cbe96680247304402207507cf047ceed00a5259a0b50418ba528fdb5ca5497f5cb4847b12a76e4197ed02201695b1b4172f0fa84d11ba23aaf1e0ef9294be5ee16795c95a1bb98d97b6536a012103289d6a5b5c3bdae6d600e0e471f2314e6380d21a6bf4a48907a3418884147dfb0000000001000000000103397bda68228efde0b396f6531173f94857c61da0585352bec9a60f61243a5d9f0000000000fdffffffcac9aaf73df2d9040ef11ea6b7e170233fdfbc64a7058cd6bfc39e32f70ce60a0000000000fdffffffb38b583a2eed8c33eefb6b72e2e7e80e337605b14716857bf9e73840d87344df0000000000fdffffff0310270000000000002251204fd6cc8f60cd137cce1acf557186416ce57b1a13b5a10ea41666781c1fab34130000000000000000226a20c1356cebd6213554228765ce488a95daff785c3aea052a5cb2c5d0e442112e97942d0000000000001600146d074ff28b21f075e6f5282958a69a15e7fd8f8b02473044022021a7eee9a513a904dd39a77138aa44a8f1b3efb13893c2089198f74c36d7534102204ff61f48dc4fc30acd4889425c0fe6f87ce57a6118e85b6e9c0478b1e0f184d601210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100ac0de677c51f22abd15eb416592648e41d6b7cf42b0a9d7c64edbbc5f27876a402204525e16681e198a6539605cd1bddbc8a6863379119e6ed616960b38c6cf0760e01210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c02483045022100a2720d944889c4bd09602fe10d74fd85155a0104f1f3d470007a2ae0cdca2bf9022058265e34598477b6e487d127f93392f3e3816166f80973363aa77ed7cd21925301210266ea61321bfed41afc7da178683c73d69f4db898abb4f999f96c31382ff5913c0000000002000000000101b6f36c45418f576194a2a4a4d7bd0a19b6cd1fb04725b156df3202b693839d420100000000fdffffff026dfe0000000000002251209a538a07af041bf9f410a424fcbc5848f7d7b0a42cecef45ca0bddeb1bc03823d4492f4701000000225120514a73e8940e7373cbf9cc809156c97384e4930320fedebeb0172607a2b71a940247304402202e72f8f5af8cf0464a2256e454403de78fa3217eb494d7c3647cd546acfc12dc02202a6cb2bb1f90e3a41d9a4c391267eb1f7868fd06a1c661b819679d2327217c180121024c483aedac1c427e96d9d38bc4cda2f5e2f3664f7805168105adc51bc21d7df2e368270002000000000101ccdc443edcae2d23304028eda793a39fc2a4bb1fcc8b32436970aa5ea157c0090300000000fdffffff04e803000000000000160014f12b9a5792044c0fb368bbb7deb735381bdd9ccee8030000000000002251203e5591bee4fdabca6b2d8e4de38152eecd1d0509379ed8a9ef72be4e58345d0f0000000000000000266a2400000c2600000000000000000000000068f9ffc356a20645f1b4e71724c7c606f3c2d503977a00000000000016001455c6fe4801130a284c1aa2bd92223d8c5c45f2db02483045022100daf2d21ad12d1c2435f764641ed4a7fe519c57953fda281f5b61ee731d98f5b702201ae75acddb1958a299fa7f221c99bff5c9a021908a8394b1a51d154b0efcad9c012102ff17ec3ccbb0944da8d43a85f04f19128bd400d9ef583ae8b51c0919976cf68900000000020000000001011344993f99fa03dd5ee74fa33655bd695f6292b26fcccb076148bd09cd6d74630200000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340a9e14157c91a23890485c56697efc68f9a6b391607c174a07391c6e315f7ad1ecd406b0e2ba27b12c8b1477e0d593653d8fe9366e57115410c34a23f18b73d927920ea90dc6288f857d1fa7b0971638e785ed37c2527ca0752b51479ce52a195f528ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c1c4aa6ae80b9f2a6ec56de12ec04c754a0958f183cd936cb7891ffd8bea44eacf00000000020000000001013d2acf16e575acd77dad7d794edbf9db03ebead12ddf0b3879cfd461cd134b220100000000fdffffff02341a5c0901000000160014114e89b91897d5a682713232508b203244c2c8c91fab0000000000001600142f4603d4a1156fd834c713a6721bf54d7115582e024730440220781e926c35d560f13bef0da39300c57e57fa76b1e01e69fa332c9c6220827f4302201f0a008c05cca0821813aa6d0305af2f3a9014a5e848e4cd46cf5afa376201a7012102653f11a06ed0e6368ba56589f5c528992ad29906dc48039101c066a41370ee4dda68270002000000000101d97960dfc8b21b1042a8c4c63497abec76d45cd5b355701add4ec3d0109892b80100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740bef8e90000000000001600141a5618a57d8ddd0551a9d6b8735ff490dd6ec990024830450221008ee82fea6ee7b9bca8fe950614112a890291bd40ffdfcdfb694ae55f74a02402022052cb47004f920cf4c877d560e53916636c14c37e6985afacd7a72b06c6094a44012102059cbef68717df783ec7bdecacbd976d5b4f269126a2e87ecf03c4a5d483e210000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f0800000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340b81b87383d7bacac3c7a201f65e9709757935672e6ebb9f1cbf86b1b3fa5eefbeeaa89421d3570cf2c8cb1d0d63d4eff816799e9089deff0e553b795e2b1eb987920e3aeee7138b2585fd3eae3a8a3b97192ff1d124a8cfb612a066e8f10975f875dac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e6000000000200000000010172f5e62969ec6b926fa5cbc8fb1ba242c5b4fc846dbc7e74ab5a6f0c2b7212900100000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740beda2f00000000000016001485b3d9faca47eeffd02fbd7b30953e31b2571ec80248304502210097e93ceafe5cabb0c471e24b5bf5626b76d585aad28bb99baf8150358b573ddc022011b8446baa7cf66319b0da117274ecddde53b9e762d0e306532ab4d5d160aab90121021624e7285cee8a27544ad36b7099823a9c296085bff953459086c9e9f17f5f72000000000200000000010181146c24263db4586c4bc5c5acd6dfccf07e032cce3f202eadbcc3bb7eb8878f1100000000ffffffff012202000000000000225120723f0cedafb1c329e0e9d1626563751c2b000951aac8b67e7d7ea785a151431e0340f56f425423252798ae2d1961c6bc59b6566a83259269d9db27130ec0d610b7da5fb19aa3a58184897cda4e328de59128d8429515f59c9261db2944824197d23179207cbe6bf7acd027e259573da7aaebfe764b882628104b8f50392560be22e49aadac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800337b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a2241494e4e222c22616d74223a223130227d6821c170d3bcfafada600bb4cde5a8beb46610b55baa37e2783ff8507bbb1603c651e60000000002000000000102f1cc0435b11eca59389d7916bd6856ad8122d7472e5ff1712025ad42aef1289e0000000000ffffffff618a5e162efef957976714af36778bc7de3cb62acea0669a97cf71b79f7ad96b0200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b1c88800000000000016001418d62c216951b2d261bbedb51dd2a501ab648e78024730440220144e5323a47f5f452223c455cd5b9a989776b48aa7c2ed369263856237b997b3022019c4499f2f1c99b981bdccb9d9c2b0755feb94356f29f10fa84aae9384dbd7810121031418efd6590e49e9a587e30128b7407c52e54c1bee8751036a4aca6405d7fa6802473044022057afe3302a941d55d4d07b631dbc3304494b643ab69ed74996ebc19aa3a059a502200bab716e4d074c90c77df62f6d0bc477fe5099623eb82520c67ac9af5f9e44dc0121031418efd6590e49e9a587e30128b7407c52e54c1bee8751036a4aca6405d7fa680000000002000000000102a2b47d2c80f6afac1002861c0f5444e98ae889670b6a40df9af973ea5148ab7f0000000000ffffffff5402266e13a0e2f107cf47289246ad72c4cf9a3ba1b44e1aa7f911e8563624710200000000ffffffff02bc02000000000000160014b5c0b5155db4ae6edff976a7ad118252583640b169b6000000000000160014195456c8b4b6223c1eb50a3e3d063f9a44043fe10247304402207bfd9e330f819c26ff9408904cfda20215549bafbf4269b21ad1bb2a48ca10b3022045e40c14a35848aced61c11350a2fac5c46c47512f8297cb3ed58f749dfa800a0121036555c852c943aaee9271e214d33994149cc88324436eba2307b932e02550743b02483045022100db7227e9e87e5fa10e7674af51d61d0ed7285f26c3b6914dfbee22a77da313dc02202bc4e27a723a3879097aec54a494d86f0de8c6d01ea81237404bd7208cdba8600121036555c852c943aaee9271e214d33994149cc88324436eba2307b932e02550743b000000000200000000010192d2348b4ad8c56b330d643da6a81ffe4547584c5535d35076554adbdb79ecc90200000000ffffffff02307500000000000016001498ae3c1f820bb58e48ab0d73495a473e052740be9d470000000000002251202b1159042551a4becdaa163f94a0fd3ccb5ecf79624557ebc96cbdd1d564fe1101400ddff729fdb0d3c4c13d5a8b3a5a3c84cea70f618b691cde0401a6ba3897a3ee8b9764d80848301d630c76b6f1b74e1fbae798dd73ab1d78b1884ab1a4cd675b00000000 \ No newline at end of file diff --git a/test/mocks/block-696394-mainnet.txt b/test/mocks/block-696394-mainnet.txt new file mode 100644 index 00000000..d7b532fc --- /dev/null +++ b/test/mocks/block-696394-mainnet.txt @@ -0,0 +1 @@ +040000204377031a167a880d496cdba116a48dc4e00302471c010c000000000000000000c281054148a5f6ae2dbd5ffbe47bacd01b4963d7b21721a098de432c685c86906c251d610b1812174112b421fdf308010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff5f034aa00a1c2f5669614254432f4d696e656420627920797a33313936303538372f2cfabe6d6dc0a3751203a336deb817199448996ebcb2a0e537b1ce9254fa3e9c3295ca196b100000000000000010c56e6700d262d24bd851bb829f9f0000ffffffff0401b3cc25000000001976a914536ffa992491508dca0354e52f32a3a7a679a53a88ac00000000000000002b6a2952534b424c4f434b3a040c866ad2fdb8b59b32dd17059edaeef11d295e279a74ab97125d2500371ce90000000000000000266a24b9e11b6dab3e2ca50c1a6b01cf80eccb9d291aab8b095d653e348aa9d94a73964ff5cf1b0000000000000000266a24aa21a9ed04f0bac0104f4fa47bec8058f2ebddd292dd85027ab0d6d95288d31f12c5a4b801200000000000000000000000000000000000000000000000000000000000000000000000000200000001c48719db38d7286213202ef512b180e389ed8f863bd5116b658b7b1913dd9fd7080000006a4730440220753eed9c595e55d95bbdeb3dd7ed1fe2f3a6838f68c840304db5e7b8d99616b902204a3143b47ee93f1f75b79dea9919eea9d211b08fd53578fd676bad73971d2f23012102380b75bccbe06860dd573c1a6278690b6efb4ec7c14795d1ee4858bf8c718dd6ffffffff055b552e000000000017a9142e62d87b097cee76ede80d01671036795898a392878d320200000000001600143932ea911f6f00b168a2c094c07cdb120ae5f31bf2cf27000000000017a91484910e6a662c1c114b45af3bef8bdb5c3cb7e302876e043300000000001976a914f1ebdd044ba61d8c8575cc52556cba834dde727388ace3d54208000000001976a9142287780623e361a71cfaaece32e34e29c43b09f388ac00000000020000000144231bd11a49b738a40a9d61797cae2e0a7bf5fed17cac4a17c6f5d5901cd6ee040000006a47304402207355b1200170b1ad5686a8e69f1c90dd0a79a20995d32636205ac5c5d5f10cab02206f7d52f9506763e88efaff1912e6c8e7b2143b4f7e973f3c0891dac75f6bfe03012103ef1c91b0b16de91c9e329ec6e3978306f6f1be0fe17c268142c464e9d5c5e086ffffffff05b42002000000000017a9146429d4937585cd797e3487c2ec1e1b1a4b5643c38730852700000000001976a914a2d02198fb8a8864e46b288978bc0bd06281a8a588acacf6040000000000160014039030cb16169370df8ff6efb61510f31117f110415d03000000000016001417ded7f0cc4b8d7c78a02077a95c0f5e359006e51f93b302000000001976a9143fce6c0d0a796108473972a6aafed1f862d59cdf88ac000000000200000001ee3e9e1e39829cdc480a34f2cd1bf84020dd59a1089a476bb9ef4acd03cc6d1c010000006a473044022005a43ef8adfda21e62c8f7e9b53b34881cdfb244df83f00076124a22eaef1f00022078660b79dbd81e9ef758c67852837f5d7fc88a7e484c1c911791cbe1fe0a273b012103ed257a5abeb7c227b6f93452ceb69a740b95bec7347af0089e9828eb3099c553ffffffff041423020000000000160014567c0c20d77d2555cb1c575cd77ae4beffe6ebfe40420f000000000017a91446d0923d870ccfb78a517eab7d29ee04cdf946008726f90c000000000017a914b424501f9884de1a64c51716f5ab6fbd3778bcfd8706179e12000000001976a91425d5e52ffe76d7731939f90860e24ac0580b0e6d88ac0000000002000000015515f4b8eb0f0940262681ce22e28781485c8ddf72b7d497e09b2b5d9c91f7da040000006a473044022075ffdcb605e5f6ca1ffae66e8be441baa365e35529c0e78e4aa14ca9f5d1d60302205e08cd99b61d28d98d3b7870420bbc61153b31f92c3c65ccdde33aa0659dcb2e012102b179b59f68f39f2b565ce9fcbd20a31a540f3e666aede58aeeaee0dd3afaa50cffffffff041a550300000000001976a914838d383a8599bbb92be892d66f9d89b20bef891488acb0ad01000000000017a9145d91b7e2b7d131ffe9d58186968f2b1b77e5327987ee6c040000000000160014679d3278c89996cb03a6d5846d123fab30692c6d9ee80136000000001976a91485707c088ee68b434d07fb27297d988c106e0e6488ac000000000200000001b10b77e9ca96107c9c914e9da63b7311b32906e47d50208de2d86a06cf583c42030000006a473044022048b97c56659f17000080dee87e71d8403cb8ac1f107aa4fd22826ac7e2d3af7902200fa074caea0a6b3beea7cf6a26bc019dff3f2edd94bf5e7b5e68f9d947026cf00121029ae2ea972c2772f64b39dc35d4fbe51fda2873ff61fa6749a01d95c89adfbb98ffffffff031cf1010000000000160014a2657e98bbecb510a77764d13dd560765f7ea96bfea02000000000001976a9148f90a05af9cf4c556428fdbd7a7dda15cc4329e588ac41f49c14000000001976a914e4d78524f78f7c125b5f7cfeb35ef784dd89a97288ac000000000200000001e1dc5596cbdf67cb858d46c241aaf88100b42d1fc38d09ff8055f550ffc04222000000006a473044022050d1625b1667a3720f12b78d4e8f51b1c3bcacd00e6990beae7ed4f3a5befc03022024fcf01ad035d2501be68609ebfb90a0421646cde00d9cc4f17f6e280ccfd5150121033a02b1359eb4f0707aac1b3959a6f3a603d9a08b5523a8efd170b953da905499ffffffff036ac00a000000000016001475558910bc0e253a3af80ea2f401f540bf60dabc68d401000000000017a91475cc0cea90123e5b6e4dfed46718f471f7fff76f8754a3e83d000000001976a91424bb97a4b1753bc83fdfc33e9c1cbdf01febd33888ac00000000020000000001015cc3af292dd2e81c21582b0666879869112ebc97ebb4a3a6bd2cfe8a30f92b940100000000fdffffff02a0cd8700000000001976a91409e6abdfa8852101e9b9ba77efa6f4a9617cb5ec88ac1cf8df0d000000001600144b6cf6cf48ec8aa8dfa1e10395f829c8a504dcb80247304402207acaf018536ce71f69b3e964a19337779eff9e8921b7c99a1cb26e0001329c3e02201cfd03cdf29fa3625c7b77d82d0950f3f3b6ba1d5a6fcae0633899741a14cafd012103414dfd31acabbbe2135534bd359a6b120d02ddfac80847da0946d1f58850311c47a00a0001000000000101467d68009e32e59ce4d1922e2eda72db0f8fd81063e86c368dd86d1f20544bcfa60f000000fdffffff0230630300000000001976a914465fc9aefbae49573a92647478ffb04aa1b2aca788ac744a040000000000160014c0eddf5ac90463b323390dc432f60f2e11f0ff670247304402201a4b51d8b0bcb124eb85a84c0137d206f2c6135ab6abeda8bab6359d4522c0d5022054a00169d0b1295fb1bdda4b4f02b8f9045b19bfa381daf956e6f296bbf1f79e0121021f578eeff40a062a8af418c375cc75c115842b3a50c1a124794e3290b3c4be6a0000000001000000000101318c7a4a66f8e8095761f0102179cc68d199de397ac929b8e8101e5a0496b568cf01000017160014e3b458d319ffe728af37308041e2d27d1b8cf63afdffffff02b0ad0100000000001976a914d28a787ee9fe430a506943c5d430fe1bd29aea9488ac0b4f07000000000017a9140d29074709794b7581582f5c50650e1cf99dedee8702483045022100bbf75d7ba3a9461dbd80a3dc2eae0ca082143c84953b8c884ed09f36ce7aa8bb02204cf7d39af03016912e0df09e090e3668efe8d8778e9c1a690579ace5625e94780121023ece002dd29da8b8ad778bd7eabb66cbb089e35702320c245ec7aa31375bbfec000000000100000000010941f81db4753d862d074accc2e48db7ae4b009cdb593300d78d9bec928657c4c4180b0000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffffc23eef8c4020da4e8d14d672910d0cbceeeccb58ccc20751654253e27f9ab0348e010000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffff2b8c3570c73853100543603964f2520bcf74eba018ec98508ea481684d250f0c8e010000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffff2b8bbf3a64b575fc7fd41f8c375358ee5ad8f2eaad0e41405066b67a316340e80a0f0000171600145480361b138303f792c7a71cf47aeadd87d8d7c4ffffffffc23eef8c4020da4e8d14d672910d0cbceeeccb58ccc20751654253e27f9ab0344000000000ffffffff6017293709631f38f270f44901255056f554e66586ef01e5625d4d5af4906ace0000000000ffffffffc23eef8c4020da4e8d14d672910d0cbceeeccb58ccc20751654253e27f9ab0345001000000ffffffff2b8c3570c73853100543603964f2520bcf74eba018ec98508ea481684d250f0c4000000000ffffffff2b8c3570c73853100543603964f2520bcf74eba018ec98508ea481684d250f0c5001000000ffffffff018c601200000000001976a9147917d1a60100b1644eed7470416846b3d47e6ca188ac0247304402200c3bf77fdcdf6812e87842aecd29330ef0f92df21855218a753d35a6bd46835e0220012abb12401a9553d6a277c430ac291f48c982272618d0001c7ab2982104d2bf012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f802483045022100ffc33ce99acb1ad30e86e68e3064de14cbf812603e146f25e122939b1c7d55b602206a4af41eac36ec11f287750db8f8968bcb2441bb544d184795cb2d7d7d45d177012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f80247304402200c1a6de620d53fa7f903601290d4e3f5dd99140dabddcbc0cf5897dd2a50e8a6022000f74a90aed9f29caa55cd295a60b0616f37d7500cb8cf3a47fa5f4c3dab01f4012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f802473044022022157e5de4b4aa1f27558e4a84d4b6405685ac88c77d6b80c8b59a59f4c242e402201c80f0245cf80bfa65aeae463ebeccd4f703177d58f00182c622bdbb62e5c4d7012102f3495f4e61365ad3f7dde244cf2f1770fb1b4aaec3088880acc33980bedf82f802483045022100c9743358125ad077458539ab9dd8645523f8895dc3a7e318391d8ff254cb1a1b02206fe5f365b19012b2ae544a28b725c3bbdf4efd4480aca0b0134091639a561f40012103539cb2e3deaad8081837a0eb3f712f783c037a644ad2c48a7b13a705a51ce9920247304402205fe2414680dd3568c0e90fa9887e1e8769f797ceea5d60dc8eeb1d282053e748022077b2b98f21e4864f4650cb0bf94b36b41b6545bb78720940aa2b1df42cb28517012103539cb2e3deaad8081837a0eb3f712f783c037a644ad2c48a7b13a705a51ce9920247304402207551784a84c900e4de9ecee8392667dddfc9cd520760fb1eef9a9d116d06b91302207518fc5752f350417b6e33b384a9d73a1e6fa3f639b186acc0a6c101b1ff5f51012102b3840bc0926d368e800f3a74cd55116fe2bf0b5a8a034026b637a8ccf714bb2102473044022029de33d48afcf2bd7628d6f5d9c59475225b325e9f4b9fda998170ca47eabc97022020a996c2a9cfd5413dbfee004d7f7d6f789ccfa09f6d9a4a3c70a28647bc17b4012103539cb2e3deaad8081837a0eb3f712f783c037a644ad2c48a7b13a705a51ce9920247304402202903511a054dbe7d7159bd355e8aa38e8584eb6db5f11d5303f01e058dfdcccb022042bc1d520d938d1b1b5d9f4555f1bc50de4ae7cd03ca9ce3ff9aba8505f39ca0012102b3840bc0926d368e800f3a74cd55116fe2bf0b5a8a034026b637a8ccf714bb21000000000200000001a91f2f32e9cffc2d4165f1780b8e45cec44663bcd61ebf8e1242bc25d7df6de6010000006a47304402202ce40308f2e5534b37911e1185249e728233451240df45f34e6eb895f2b844570220623cdca1c6ec25982dabc72c0fe9b6dc4ceded99d6316a29beaebb82dd4cb49201210219eef11a43b8ca76241b958626afcf114ce0a291e6bdc2ec42de93fdeb4590adffffffff04eecc110000000000160014cf6b227568706787baa3d39518dd2a187d836bf5e1a1cd04000000001976a9142a5bdc3b25f9513d11b72ecd37bcde3d60718cac88ac4e4101000000000017a914a1ac7830689664abb600b8c05078a8a812f20a378700dd6d00000000001976a914835f7dbec77a6a584be6bd3053ab336fff9f818588ac000000000100000000010192cd5ab7a567c570e863dd605de72a4c0d38815b541f6ad3c7d110a58cf897e61500000000ffffffff3af607030000000000160014878e773f8fb136a1e0eb1b407f3360e28658eaa3d8d600000000000017a9140b40d034963495770b77977dca13a76a308ab22187632e0100000000001976a9143e2a505f252f1b516a6c25d7becc83a7ea7b2b2c88ac519b01000000000017a9145070698ad66778f5c069d372789abdbc49d9f58a8767af0100000000001976a914e5faf29258d2656ebd036a75ecb1e4387ce4e9fb88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76709400000000000017a914bc010b2c67f9d04277a0dfa6647b7ab72a2a333b8755af0100000000001600144aab55ed56edf45f161ff1e84537254b3c3050ab671608000000000017a91448c93e1b5c12b68b6f51f0ca5cd9f3010b49146a87bf626b0600000000160014a1fdc4483881c7fd28ff02cad38e4656afb28930c5ed10000000000017a9149bc3ed660657359a980d6c144f470eed7035e97887f2950600000000001976a914d0eca241ed8f550aaabd628900abb67550e9f0e188ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76637a0300000000001976a914732cf229d3dc3b9b8a0803ffc07d4e364e54aba388ac946b0000000000001976a91417c3aa0fb2437db9348b60e85c22f3744a91438488ac141803000000000016001491748ba80fe88709c9a3eb16beaee2d628243dd557c10100000000001976a914d0afd5e72ede8f8b0f701336bc2f88499f8ffe2288ac4c5e010000000000160014de92737bed2e8cb490010eb83e46c88fcdc565e29aa86d01000000001976a914e141c50832e6bfa8384d3049d47ec6ca405ad3d788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a0ef0000000000001976a91433c9ddef2c79adf7532ed0dbacd79c9267eb63c988ace47000000000000017a914b267081381a2ba5e7441249ccafeb12c1ae98c41879dbd01000000000017a9140b43f90ed0bd3cfab4c78467b4ccc393617eb02e87ac0f150000000000160014faf48b24e1ee588c35d157c7fa98f90934a3fad7712e0100000000001976a914ca9f2dcd78449441204cf460bfe3f30beb9fc25b88ac1e60030000000000160014c2a71757ccd13ec9e3a66c165139819bb3ef8011a00821000000000017a9143be02bba28dcd0ef37959d50182374752087e5e587343900000000000017a914cb0c56a8ec46e2d33052d610ca7c593d20effca987ead07201000000001600147fb80fc252f990bbd9676baba5f8a4c4230e34b6393c20000000000017a914c1f9bd54fe774fb21450825264c2c8d670f3549987f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d72a00000000000017a9148d0f5432e7ef17c1b35d98fe9b828ef9054b0d54875aa60d00000000001976a9140f31c380dae5318610cb8599250915087cbb916288ac281001000000000017a9142a014b8d49f25a11a3639ea1dd4dfb83df03895887d0e60200000000001976a9146b61da254add7ea82140f4c56ae53756c7e0d6fe88acbf720d000000000017a914332b614a9e2f8a97a9ee8d39cde3da1e50fdf8bc87712e010000000000160014401a97f069b722dc7736c0618a5d2a31bb7464a708e50300000000001976a9143f668107024590e569cc12beef3ba49df001deb488ac973101000000000016001453719bf12736321104dc0558407eeaa87bba0aa04456000000000000160014d927e4af6169b360f3eb05b05edd587c850d33dfe09304000000000017a914d2db333f750bd098423622791653b2785b174b218789c503000000000017a914936ccf5362527f43b0a62e3bbfedb33212e4e19087e5510300000000001976a9147dd40ce086cc9e4b02c9c92f9a2ddf62deaf60b188ac1eb503000000000017a914cb46bd4de1f1d89a21c19bc65e7d1792491cde0e87ab5e0300000000001976a914fd5c539d4f8d04d37046c4c89df1a30bd62bd13588acece800000000000017a9149656a497ada4d3ae313f35555584e80f3a5d85d78790d003000000000017a914b7d7b8a1c1d75ddb97467b3a5594918967284846878bda01000000000017a91432a1cd03157ac09bd9955077066dd1b3caee4843878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b0ad01000000000017a9142a58ba1d306252d5dc28b27f41313089eff122a1878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d70201000000000017a914df1367dfd411aa9a3e44b9f187445b60ac3ff56f87a7d101000000000017a9140d02f72b2d9837ad41b5d6413e888cb8f34d31f58711590100000000001976a9142efa71d2debe7b8bf5e39270e801b3032b91a37c88ac093803000000000017a914682d7b9eca107a06034d47a5aa33e265881a7270878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a00e0100000000001976a914d39abcda422721fda1a5ad1ef420d464cbb18a1988ac8c3e02000000000017a914d18e46a2f17a74dd1adff54d7691248a2a9c17e78702483045022100aec961fe7c3b4b014d3f4ebfb38582bb8baf8d728c6c25a81158d684c4b051df022049c5517a2e06729cb469b72d6829185f750c6ab4c03ac66ee3a32f2ba17a20be0121034ef89c73c80b4b5bb4ff63f793a260667aaf55e1aaf1e249d8a7350ec0dd74120000000002000000000101b775f79af732ffb6bcb399dc2d5bab2bb32acb6f2d47c6b9b2dbe878eea8dbef0100000000fdfffffffd7406200500000000000017a91440551ec071a676a5242176afea59234f8c5dffbd8794050000000000001976a91461de983303bb4b29135f2afb2554088bfb80088488ace90500000000000017a914c70ccd678373090c4fb510e187c42b4956198b5387770600000000000017a914f218cb8a8b492a18ba40c90f2a9f39b90b9e4f1d87be06000000000000160014d68a39e77647763b336c5697d9ef8239497abb66ec060000000000001976a914192d10e7356180448e09f6e7e8aaa5858fe6bb6a88ac8a070000000000001976a914519fc403c0a482c43e8cce60f24b933b652d99ab88acbf070000000000001976a914d1bfedb5e0f0df5cf444de99fc257c1a69a6d99e88ac6a080000000000001976a914ddbdb79bfebd6a82e888d8738aaf51bc491c03e088ac6f0800000000000017a914d314a06215fe69c6aba3ec8accf87fbac973c894879e08000000000000160014c691dac92a2380241f00a7c7aef9690985053ba305090000000000001976a914bf1516ebc58c006e2b192cf79c3f4e1b2b4c52e588ac68090000000000001600145eca9847302f39ce4568b57c475b8efcaf1adaefad0a00000000000017a914151bed39843f0a6e0a288c85f404f294a893fbba876c0b0000000000001976a914591232005edb6aa356617f454efcc5118dda189b88acfe0b0000000000001976a914622c83d787c9969cf562443acc2a8af83c64d43a88ac540c00000000000017a914af286cf699e720244c53d41c61dbf792407e06ba87610c0000000000001976a9140033b172e1a2332976c76752bb172a522d5ac76788ace10c00000000000017a9146ad9601fc89fdfffd9cc20a6bc027bce5093e132873f0d0000000000001600147d59317ac4286cde136f30eccea6a0bc50146fbca60d00000000000017a914fbccadbc1f7ce548b94ea79e571ae314a484740387fd0d000000000000160014c8d1cb2c630c5ff65439940a67d0a59fa344ffab0a0e0000000000001600144ce0503ec85d684b4e9784b5e180d16104cb81564d0e0000000000001976a914b851fe4771e8b2ceb93eeb6fb6f7ccce343a4d0d88ac890e0000000000001976a9144fe34f687dd6f25edf33d5b44974a10abbfd09ed88acaa0e000000000000160014e3309892f00508b4a311c92b9a706a575bb03429a10f0000000000001976a914d981072c8d8732297e6c51924246fd881f8e59e288aca90f000000000000220020fb2bfbc06103c16ea3cf4540311ed70a5a81c6d18cd216c1be726e046010023862100000000000001976a91493481ac6df0d9faeca6e629af3d57a4a8c879aef88ac621000000000000017a9146dfb8c767571806aabb2702ae377bac1b62069c08782100000000000001976a9149a9ba913761c9340d73f7acac36f3fb89706c33888ac28110000000000001600148726af7688ae5b92f3c221b77774a7f9bff695f3e2120000000000001600148abba4cd3cdaae9773061055c3e0afa629b2446b4f130000000000001600144bdcea84d19ff94bf70f0cbcbf75b5c060897ed1c4130000000000001600140f72ae1ce0d3ed1edd39360dbcaf94cf1561b8cf2d140000000000001976a914a25632cfe4425d215bb1d0f9ed23854d0e027ea288ac44140000000000001976a9144b0f12ca0971445cacb95e0df04204e6b6ac041d88ac82140000000000001976a9147092bfe23092820add6b9865823b6a12f2f9756b88ace71400000000000017a914e6896517457166dc7183124153a0658639084f9c8762150000000000001976a91485bb8926255b0fe1df5d6d09286892f0a834a42e88ac6f1500000000000017a914a07bbdd5f847e8e289b0106acf970d0ac0a56e8f87b9150000000000001976a91449634d2366f59b2b8073cc3f2d2c5d2a7e80330188acd6150000000000001976a9145224fcc88a2c75b6dfa76a3e16edecfd27b949df88aca8160000000000001976a91452ec2d97305f51a6a6b48fc43464389e8c8f6e8588ace1160000000000001976a914b81b3d627c3fbcbf86533e2cfc7e3e74817a79e288acf5160000000000001976a914055e5d96285cca45bfc5b166f42f74cb6c8c41b488ac941700000000000017a91479c4ad38a190741abb01c72aa5c38e97fc5756b387b7170000000000001976a91402bd2adb41f359d3a82fc5f40661c458db2dd76d88ac3218000000000000160014ecb35017d2b5acde1cbdb76c59b35cb3c02565c964180000000000001976a914244cbb98c291300947574955b8323d0eb861ae8888aca6180000000000001976a91452b1f178e0cab70be38d1d72c7bf07dff3278a8d88ace218000000000000160014377171a216b6e23f6838cde49b94a9c7aefe717deb1800000000000017a9143a6a57f387205c75878426be1358833fb493d1f18748190000000000001976a914b78d32f66b1e2f77574202e8223847e6dd59b3e488aca31900000000000017a914bba428cd80c02b07a338db61fb82acc988b8ffd987c719000000000000160014e650553734548c910dd4d017f33114ac718bc3a6e619000000000000160014d1fb69338896608be965c5131c4d3af1583640541b1a0000000000001976a91441b50113f17858d4cd870ba17107312d4f7200cf88ac541a0000000000001976a914697f330bfae67976366df6d37d50671a4f2080b388ac571a0000000000001600140e6606c7087f64a7f68141ef296e435b0019fcadcd1a00000000000017a914e4916ac4e52202063cef3507cbc4a24b83783a1187021b0000000000001976a914f2ba6f2e347269673d9840a5b5a30a3bb48c88d488ac211b0000000000001976a914768ea5af09891d8558c229e4e75878d3c4715f8d88ac341b000000000000160014e1a4d4d5b5ade088a902d204113bb3e43f228811ec1b00000000000017a91428db0e155fc2545722271a3aea0d6607049fac13873b1c0000000000001976a914a98b32b984b23f9e52be187824458c49e5eaf5fa88ac6d1c00000000000017a9141d1e3ce398b36898385004e6b53cb47f3cd45ce787761c0000000000001976a9143569a911c0879accb94768fb962fe4339e54245a88ac7e1c0000000000001976a9142df173bf416ea90cfb33df2a97637c2df819802788ac8e1c0000000000001976a9148cd4b786ab8a15cc93474a1fa8000675b9857cd288ac8e1c00000000000017a9145fb650a2020f37568e5596e70bf03a09342c336b87951c0000000000001976a9141bb1f576082370608e5aaf329d71f065dee655e388accf1c0000000000001976a914842a08907d68b4ab9a86b24de6284fb060efe5d688acf11c0000000000001976a914d792f586d0cefb4b63d858731b3620b9535b5edc88ac211d0000000000001600149dd6b22630adf23e14d44338a6262a63eab1d39a341d000000000000160014f89eb83e0d871715d1f7acca94485fa5d552e75daa1d000000000000160014c6b23a13f7feb83f4404faf7292f8373ad7b203bae1d00000000000017a91434425cb8949df0671723cb99d70c6a661927252d87e21d00000000000017a9146c1e467ff40f1a12e444f97860763415f9adb651870e1e0000000000001976a9143b6829a77f9b09deb44368e8b17fb1f0c1ff503e88ac181e000000000000160014bf75522f08e6ca0eeee4f73d26fe88ee02941253201e0000000000001976a914698d5ae6a447f10856fb7bf6a1fed3bfdf50a7b888ac2f1e0000000000001976a914af15d1e40dba6babe81f3cf20c43ec8092b195ef88ac531e0000000000001976a914225b1366a72a1dc31d0dca0b0193fb25c9ccba4088ac6c1e00000000000017a91439911d1964774ad3438263eec3e2c816a772b52187e51e0000000000001976a914881f652f84157302a5b090c3c04e627dc7561c8588ac0c1f00000000000017a914b23cfe34782b074c6f1e007292f2d069e9bbddd887a81f0000000000001976a914e7f4ca8e8692e1ff04d8c63b99966f0429d1647f88acaa1f0000000000001976a914e060272377047034d6820d4673145524b93ef94288acb71f0000000000001976a9145ecf5903c50f8d32688353fe98319d86c941247c88acc51f0000000000001976a914a37a31bf153f2ed7d4d3b7fd418c50f8ea66986588acd71f0000000000001976a9142c1bd8855631568825dcf46a75b81d7a9f9cd41c88ac232000000000000017a9140c27f89be8687938fb1a4fdb22d3a9fc8ac34b2d872e2000000000000017a914f7adfd2196ecdd43a12aac1ec3c05713453854618744200000000000001976a9141119d9a4df57eebb32ba00c70f70f82a711c5f0288ac47200000000000001976a914ac7b96bf5c6a73647124540675e15dee56ee56bc88ac4b200000000000001600141c10dd765e7e561f4b46e399b22706a5983deac97d2000000000000017a914bae59ccd91f8d0efb0063f557bb9a5a0ae72ce9b877e200000000000001976a914ad0a611649b4d623cf41c677c4c1eb6305df84c188ac91200000000000001976a9147bf76e94058d051a899923b55ba358960ee0f10a88aca32000000000000017a91448231b172dbaeceec72aee93dc6d0ffec9badb1a87b12000000000000017a9144e89d9ac0a89acae97da42bfac485e6b0952f0d787ba20000000000000160014f737244aab147ff6da1c919107b0c341cadfd20bf1200000000000001976a914e4e6a2413dd9f544b228ad8e8a81e705f95473bf88acbb210000000000001976a914c7cc8eda7e1af7b52f1c785c50374c2ef813559688ac08220000000000001976a914c3887492af9ef4bb092481f541519902effdc37788aca92200000000000016001454c6caf119422e95ccd7af15a55e4bd37c94ae6ddc220000000000001976a914579bde0c55cf0c7c5fdaa67ac1c2dac8d0043fe388acf1220000000000001976a9145a09935be0fe2b60ef6fb891aca23877e110dec188ac6c230000000000001976a914b91d204c5a056e5dd7a3d05a65718dcf923008d688ac71230000000000001976a914418b8fcfc4f9b354aca12e4c2a72916f9950ac2388ac742300000000000016001432de979d6ac0cd493ce164f851828e13ca2b96e382230000000000001976a914dea9761c78478d6877c5f2e6c6b484a3614d38b988ac872300000000000017a91437dea00bcea743e335642694b9e64470c00ccc0a87b823000000000000160014600e0512c721d6dab0deecba65acaa32f2849f82dd230000000000001976a9144a81b7df24248c37cb2402713370b5de11613aa388ace2230000000000001976a91438f9e3554aa08ab56a127a5a29a63be89e2a417c88acf92300000000000017a914c97734b7c2c808865a8044aed8764c6ecf4762ef87062400000000000017a914d46a0c62cc5ee71fc0649222da2b44d26a75c89a871f240000000000001976a9147381bdd76d2951687b42862133a5907b1a0bbb1988ac2e240000000000001976a914305a6d276e99aa164aa0d5f600b7ee718529ac8a88ac382400000000000017a914a1d9baa43a8ce1a18202719354aea81d16adbac88739240000000000001976a91433d6d341b1b31ae4479d601ab682b86fc9dbc7e288ac41240000000000001976a914dec9a75e8942f734fe3ce13e045dd460a636c2b488ac422400000000000017a914688ea6b4390d759f88d5820ec023cb12fa4dc3458747240000000000001976a9145fd6d9eb9bfc5a09f347cd949f77a14076701c8488ac6b24000000000000160014c5173de4501500e77b2cf8e2fbb4e44021d195757c240000000000001976a91499c5cfc64cc08c17cf70ff58e4337005af2981aa88aca12400000000000017a914d4e0a9ef6f5448dbdd572e94aabe48688a1c6ada87dd240000000000001976a914fcd6020e94ed832f218580988e9554317eedd61e88aced240000000000001976a9142f7914fa5f736f61f7b9aae3a0859b888aec400e88acf42400000000000017a91422bf803226155f84cef2266170db76a87f1b58e2874b250000000000001976a914d4839e4f12860f78f48cf30e5c320701559aafa888ac5a250000000000001976a9146ccd7cd0690fb101dc557041d7c4329757afd93188ac782500000000000017a91438b78fe59f1897d58d6b488b26aaec0d9d814a6087962500000000000017a914c7e54d154e5c20ca4cb10c55b5f60ee72091910f87c32500000000000017a914a4c6b8ba1dc702aa926ecac4c639d253b7ca0c0887d9250000000000001976a914b13039c35001f4240f35939b1fbdcf21f25e1b3088ace4250000000000001976a9146aabc132373f4b7c69acce89e0690d3084af105a88ac0b2600000000000016001444f45d6af4f619ffc562fb8a5fe663512914c5c41f2600000000000017a91480735ed6bf4eea1944550da32db131473ef47a238739260000000000001976a914e074fb1b867e7ec04d40b0c96a6d011281155eec88ac412600000000000017a914b05052be661336fc407e47d6e171db9a3ca537ad8743260000000000001976a914c9c53a687eb44aea184277304161c95d9134abdf88ac452600000000000016001483d83ba0116cd25f0dce8979c6260f54610af2da462600000000000017a9143b6a8e24e529b95500af6da0555ee79a72cef61d8749260000000000001976a91420f74d640903ceb72da3103f74d8cd682ceaf3b088ac5526000000000000160014a0bf3125164c1534345419e544b7d3f9e33d65745d26000000000000160014e771ba842572fa785485bcf32ba17a1526626ea479260000000000001976a9147d1e1f5249020a7e8e45f19aedb9a92622409e4988ac832600000000000017a914d78f98ab422579718c58dccd54a13747009baec887a9260000000000001976a914a876a6bb52fc1ef0c48e0eaa22fe3fb6244c961388acd9260000000000001976a914ebd0904afc4c1354982c7609b20b18708c10240488acdc260000000000001976a914a30d04aa86ddd93c9a8a0f6971ea9b9cb8bf6bf788ac0c2700000000000017a914c127dd1178b08e6508e21c27dc7cc8553c8f45ce87302700000000000017a914d1f54f6a40f19e72b670f7c9b7d17e3fd6140a9d873a2700000000000017a914fcd46093ccd7196d643644a063d6fc6d00ff17bd87512700000000000017a91438913709b0220caabc1c0dcf65085154f16030ac8754270000000000001976a914b2d1be8c18c810840a3fba0af64b705c58f8feec88ac5a270000000000001976a914dfede222d2f77efcb638c133b5b3cbf01a13a41288acb0270000000000001976a9141e578dfebd183eae49cb5407ca1c6f45c0edf72388acb2270000000000001976a914e132c9a367ffb52e9e1eef2daded7ee6a3a0001388acc4270000000000001976a9148aea8154cdc405933564a31e402412d026b1c09f88acd6270000000000001976a91445e6232c4a847d932618856aca13ed4021425eed88ace7270000000000001976a914633a8dd8607a0d6622c32f39118248abf64547f588ac1e280000000000001976a9148fba5a7497e65a25f7ca9f3c6e276e81a66e7af888ac2a280000000000001976a914589e8348330d326e7a644f1aadf5ad9397eb261d88ac2a280000000000001976a914cb73716d8d599154d7c6951f1ef44424452b212788ac50280000000000001976a9148f8a2c53578a85cb5daf3881403aef854e2d8c3288ac89280000000000001976a914ebad3d5c0f0609e3d8e2659b1b7fba72217065df88ac95280000000000001976a914308c5118772bb93fadc2e7670a1fc540c691b1ca88aca0280000000000001600140d1bb5e6411be0a125daae7c2432c1aff663fc53a1280000000000001976a9147240d887ae505097ae8b5ff5ba4d9ab0fe43b54d88aca7280000000000001976a9145fdcc2220cf8f12db3fcbd8129a150dede9f4e2088acb1280000000000001976a9148c57a5685b8989dfeff1db38c585dea34edf35ec88acdb280000000000001976a914c461ff51a13df932e2c81aebeca06c5845513ee288ace2280000000000001976a91438c4614f67cb2fc67624e48c7ffe6d03361ec80d88ac4a290000000000001600144dd2c9a69863fbff991cef321efe02a3ad9527046b290000000000001600143e38a8a7c97f882540578e3c64caacbf1ebced2a71290000000000001976a914469f9b4c7066107eaa70d84a94a0247b8fc7129888ac95290000000000001976a91436fb5fbc26335df935bde172fbb84bba7df59b3688acb229000000000000160014905d86742702bc990c0c907c17417833e536243eba2900000000000017a9140ebd997861dc70365029ef011c5be55b6ac2643987cf2900000000000016001446019701f5b7af18276bb9477df182041fee024cf8290000000000001976a914fac6797c1d8b5cd38ca6fa6de9291b24c5c62eb588ac0b2a00000000000017a9148e5061bedf2826e3c4068d52b4960122ce6ebc58870c2a000000000000160014cb9b9dc898387701902e4dcbac5bf4a06e481c23192a0000000000001976a9142c37b8d98a1fd7b140eeecf36d4856435f223a4e88ac3a2a00000000000016001407df706abdd7eec89b80b5ee1818d8b993812c4c462a0000000000001976a9149337d8caa7d5e8ffe0e2556e508e47e4e913c68888ac4b2a0000000000001976a91454b8902a913de04b6d5d3fcf35d8e7249745291088ac712a00000000000017a914e33c30daa00e762533827573a4ac2638af8daf1b878b2a0000000000001976a914809c392c93e54e49f08b4f8e77f7588929987e4688ac912a00000000000017a91404df4435f3e63436107669af13602b990765daa987952a0000000000001976a9140b7e7ca02d967bab417edc4d4dab3093a476ff7e88ac982a0000000000001976a914baa60c4f2bb0d5f5857ce8077bfc009789a07c2788aca22a0000000000001976a91425289513296a7e72b9b393ce4f8b3fad0e3b855288acc22a0000000000001976a9140e7e90397bb087128ada6c72fc11ee8222287b5088acd92a0000000000001976a9143228dd84e4097bae87072b6ce05f34a1c087ef0c88acf92a00000000000016001473c68bd973fa464b3b0e3a486e0845555db9cf0c0b2b0000000000001976a914ca80554156d29e5d18acfdd4e39d3985e42ef92388ac102b0000000000001976a914d7215c322e188ee3f20da1513aab2398a982e0e888ac242b0000000000001976a914549f95ab3bbc5420f69c0046c21ffb1bdeef729c88ac5e2b0000000000001976a9142242dba4653ef07f068de783c6c31a31f4d4487588ac7a2b0000000000001976a91440ed65e3d72241cbb294d81b03cf8c4ed22cbeeb88aca92b00000000000017a914a359774d4caab3b0877afdf0520bc1681570362d87b02b00000000000017a91474e0441ed7a0e45a23481581c4e6e635d6b34f0a87b32b00000000000017a914eaa365a0fe6d86665d9e01b1b4b983e09c1abbdb87cc2b000000000000160014320448dc6f95c1ca8e7e5793502cda9a815c9f08fc2b00000000000017a914642b8f19652d547d80e36636f80346c9c20f82f3870c2c0000000000001976a91403feed381b0fda1c1193841e37e6c19b08b4727d88ac392c0000000000001976a914dd8b0e9f8a17f006d29f120afe959d2abf8e61c588ac682c0000000000001976a914c6b8de59bc37777159b3e282ddb23f66933b75b788ac752c0000000000001976a91491f80ccee8b2da2f476c15a1078cfa8f28f37abe88ac772c0000000000001976a91467f0af24e538da8ff9564dd77fcf7026a4a3dbe588ac872c0000000000001976a914ebbcd7be0b7e366277d1d24f0229eb662d31aaf988ac8a2c0000000000001976a9147ec2925c5c82e1eb3839d138cb4400977fa0917188ac9c2c0000000000001976a914f5317f4547a243cb23ecf5656380c9462251ccc488acb72c00000000000017a914d28af71d098d0fde82ce22e80ce593f3b3466d2187ba2c0000000000001976a914793b28ce47a6c46484b59e6da9c1aad3c373ec5988acbf2c0000000000001976a9142461750d440aaf27e6b682908094ba7eaa153fde88ac022d000000000000160014736632060bcf1d27a28d938a25bdfc76e68fd6be152d0000000000001976a91494d051e6ee9701cd24ea7502a412f80a8a94e61e88ac1d2d0000000000001976a9141cef2cabbdb99e7e58be83410dfea85d8ac3d3dc88ac242d0000000000001600149124f4c3843baa14394a05a5259aa87afa009da72c2d000000000000160014dbd1df33e4f143889c4f186ebcfa2dea6000e6954c2d0000000000001976a91451617b114d7d19eb73b6cecb614248cb3858d35f88ac912d00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87942d0000000000001976a914e6e98a21f2781ca9c454eabe4e11df42869ab64488ac9c2d000000000000160014e2a32571ae1e5e92f2fa5cd6517fb91f01e621c29d2d00000000000017a914da468e04da3e2bb4aa316bcb4803b75af00f3b8a87a72d0000000000001976a9146845853278db9559d68bb7b791114d676a9d995d88acc12d00000000000017a914c98b94084551bf1a94614158e93800bc0962e52f87ca2d00000000000017a9146a14d1711d0533db176ec08790e77e33765f180287d72d0000000000001976a914f458c59ef1407e91790dcad3ac0fbc21927a644c88ace22d0000000000001976a914388ef178afb9382a334375180f54df325c0abc6988ac1b2e0000000000001976a9146c3a0530ff2f104d093ff0f52dbce60114759ab788ac622e0000000000001976a914513c6b8ce104b83755d6bf9f8226f4ea0f163f7788ac802e0000000000001976a9140227337458356af8a24ce51dd887eebd703e80ae88ac912e00000000000017a914d2b54edcca71ab9242c316ffe85741ba9fe6d85087962e00000000000017a91484e3a393a214b12ea4703ed4016bc8772b46905e87bf2e0000000000001976a9145c72b4d592f10b5bb1e360305b48c464feec9a4c88acc22e00000000000017a914ad7c402f93172d8e997d62b585f1d671c3d48a1187cf2e0000000000001976a914fa71485bae3d640b27edd4dbf9f628ba774fc8a288ac012f0000000000001976a914afb6bc8e1736706be10889972d73b3289ce0efb588ac122f0000000000001976a9146244a4b1bf8bd836a4c0b7797df9ba9920c777b088ac602f00000000000017a914c584bb0903e1beaf3f83b45c270b6bd6567f73c4879b2f000000000000160014b07c42c9edd158c73545d31459f08983ca6afba0af2f0000000000001976a9142d5838ac9014cea2e0d5a39caa740491b978c45388accc2f0000000000001976a914c140e9067aa9ef74ac3d57b585f5b591dd3e293688acee2f00000000000017a9148c6bd3b65b87bfab541c761194cb9cd3926714fc872b3000000000000017a914cfbab77fe19cee24ca06cb0fa3f5896cb26da4b387373000000000000017a9147654ec61c9a0615b6243e0db5e66cc1f7d0c6753873e300000000000001976a91407f36e5cee6dfe94578dc83c578ec992286bc00188ac3e300000000000001976a914b02ebc90187ddaa813152d4555b731f21a60fe9388acaf3000000000000017a914f45bbfc1c133219884b07ee03a73dfdc6196936987143100000000000017a914967b524b66934c01d4ec81d6c44dd52c0d4ad9e8871b31000000000000160014a800e1a8e2d4279a01324886e0c8123ff10784c762310000000000001600142c58b09fabfced799479f48d97642eb0bdcd69607c31000000000000160014019242aa351e0b0e9c9f409bdb3962693861dc2885310000000000001976a91460b6536db197bd6961277d620f83a7c1b407319988accf3100000000000017a9148c9ad4b09bffdad60c28a90a85c1a2dd8d47966c87b932000000000000160014366e1a229337f492254d60368ecfc3cd26d7b2bacf320000000000001976a914e06a3b9f3c07e31d82b359c2d2e4d59609da924588ace8320000000000001976a91427fee6ceb429898bb26a553646039924712a3cc288acee320000000000001976a91467de5c8472f7cf79650ad41e3c8729c9ba4543a488acf33200000000000017a914bcf3a0213099ad2cf25b7896def319583cd3299387683300000000000017a914d79e9732770ece573bea76b515c793265d5db86e877e330000000000001976a9148d4dae3c798e2d7887476fbeab06f8787cbbe22988ac933300000000000017a914288fe1aee811ed1c113ac0af051d5286f6997dd087a3330000000000001600149ca647cfc92e5b6e8e3afa6799b34c5a09a62cfbaf330000000000001976a914ccb3fb1e376af0ecb8f8ca97fd073b6fbc8c585088acbf330000000000001976a914539bacca5728d8a93d67283e5ec63a87f4f59fa488accc330000000000001976a914f2c5a4d4de5ca58491e317142a8ea581abf076b988acd1330000000000001976a914a1219aad2ddbdcaf6cb610c940cd9f936efead8188acfd330000000000001976a914ebba8abac2c79217adf6eea0b60a46752f8341bb88ac6334000000000000160014a641972d98c6501c385fafe7918344a42b6451156e340000000000001976a91414a4b5beb9716d130dd20dfc772348eaea87045e88ac8a340000000000001976a914f48920129754fb0151e956286754a201b9c50fab88ac9b340000000000001976a914ea8a954113129b48c594f3c226a6ed3f18689bf388acd4340000000000001976a9142129bbc934eae13c7f1ef3c9a46f3e649ee6b38288ac4b350000000000001976a9149d92e246d72d64ceb02fce286dff00c6c4e18bed88ac4c350000000000001976a914c82bd9c996072f7c53c298c8dc22a7d19513bd4d88ac5b350000000000001976a914dae6a4342773b56ed56a526b574a1295e1a2687488ac643500000000000017a914b06cbf5059fc199bea8d2a43e30290ea6d3e54af87653500000000000016001467fcd1f9bc00cad291fc39f5b88cd2f01a3ee10c70350000000000001600149dd6b22630adf23e14d44338a6262a63eab1d39a85350000000000001976a91431222b3848adc7975c0a7b43667ff7afb1f0c92c88acab3500000000000017a914f048c6858ee91dc90e8590a95fe3b98872a3ceb887d535000000000000160014fca7b20d066479444afdf0c9e7a00868c5fb5046e0350000000000001976a914cb4ffae6adcfab1eff242364bf1d0ab30c73f92c88ace4350000000000001976a914aee9530da7b015bf0d5030098404d4237f820de888acee350000000000001976a914073fa22788e45dc7d7deb96b32e8e6a78e85f59b88ac34360000000000001976a914141b1dfcc107972829efb9c44009ddbd6c38b02c88ac363600000000000017a914150f79af92be2fafe225c4a6845520e7fb16c46887403600000000000017a91440c6492c670cf503fd4498b9642bb3e67ecf74128780360000000000001976a914b9ef8f05c425394dae8d730e03a77160d3cab38288acf3360000000000001976a914dcf956888463f4c6238a2207dc00fa278216122f88acf6360000000000001976a9146837e1e4f9a22c971d8d483aaefe9711749beab188ac0c370000000000001600148e9178734894ecb0e6077518650aeb5f1f8c8ccc0e370000000000001976a914f73fc4a64cbe9a2448e2ffaa4b7c4ce9cc1f82cd88ac27370000000000001976a914efb3223aa0d22267903e5e2633fde65c85706de988ac553700000000000017a9143d8703bc627cb701f0425e9542f047930a32f68f87b1370000000000001976a914cf46389744b04a4d2d77ba8d47a06cd189fb4e6588acd9370000000000001600144f2874731d8119ce84e01a077b8f764a71a11b99e8370000000000001976a9143e92964bba687cbb545b1313646c11560758bf8488ac4b380000000000001976a914c01e78bbafe72f3e09d09b52af8ddd785d58b80788ac4c3800000000000017a914abdab7355ef92e674337458f4973e3ad953f9d6887893800000000000017a914f97acfd93ea64f2d4f623864afe8d82278d2eb5687fa380000000000001976a914db9224988d3e3b10d61d2811a86a85e5e292be5a88ac073900000000000017a9149dff18a208c788f94b94240b17e799811ad6a330871e390000000000001976a914a61a6c44b656939802a449006ffcc80af33f180188ac243900000000000017a9140d3d04d974c67b2fd7dc6d80a6f57ad6ef71ba5987333900000000000016001485aed4e91d195c395ffc49d425c80f4c16255c44643900000000000017a91417471e82384af7f31d87a699d31dbb0d627c5df1877e3900000000000017a914edb7aa8447e073351c0d90bedee9ef4df5f0bfd5878f3900000000000017a9144e45b01b901dd57b94a6bed260ad18adb0cd6e8987a039000000000000160014d571f5d0bd3b7844a39f635409be5c9096bbb8542a3a00000000000017a91482f54dffa73e242c1b3117ea132e73177665f37b872e3a0000000000001976a914349b5bd273c46ebeeec16cc416e53de8ce286cbd88ac853a00000000000017a914ccf515f7da53fa22d194f003b396983361c6560d87c33a00000000000017a914ca8899d81ac14ef4f15f48a716ff041426ac2c0d87093b00000000000017a9143327fbcee1e867a262dc7de0ff3870386705bb04870a3b0000000000001976a9140c39cfa51eb0fc5c059b025edd8fc98a9e330b1288ac1b3b00000000000017a9142dbb5aab2dc35eec1ca1eab699c8dd3472f58a16873f3b0000000000001976a914c51db1ad2c1c126cddc8f4afdf34d0195e54b4da88ac4e3b0000000000001976a9147fa0c00b6373a87557602e5df1d06bdce3dc1c5b88ac743b0000000000001976a914c4b9a0445a47004e1d2519af3c4893f1d24ec33988aca33b0000000000001976a9140109554282fbfe0f1650fd70bac1c5e470bc823a88acb73b0000000000001976a914072a93d1445e342110cfc467ea6e5b184b58d13f88acdd3b000000000000160014af45dca3dc41fb1bda242c716456b8107bf0a85f193c0000000000001976a91460c89fd86a6512f6fd68f8c67a31ad4e132e580c88ac493c0000000000001976a9143bb74933344dfed667ab9be3c8ffa7ea5c548f0388ac4e3c0000000000001976a914d83bc49c09884fe312ecd72dad4b6849ceb355fa88acd63c00000000000017a9142c4dcacb8baa9d136865caf418b89878cec55a6687df3c0000000000001976a9141ba87689679142d2194eb4dca0e3ba82c21024c188acf33c000000000000160014950395d507feaa5256f707c6e90d873b3c9d41baff3c0000000000001600142bbff2693914040101db22c82f997a4c4e014da8ff3c0000000000001976a914478d2a65e59af497dd02cb5f886aaeae60cde70488ac133d0000000000001600144ffd2b9d917a0ee0e9fc205378814944eb61ea8f393d0000000000001976a9141119d9a4df57eebb32ba00c70f70f82a711c5f0288ac4c3d0000000000001976a9141937c7bdcc7b347ad36235ed20a50ef5b8efbcba88ac583d0000000000001976a91458df19b5ecbbb611475366b5d6e917f2b8bfda1d88ac5e3d0000000000001976a91407706e5ccb0f178e20d3791093daec41bdaeb89088ac6c3d000000000000160014815be32da397ea7b7a20de05444d9907605f932fc53d00000000000017a91459bf9e8de31319181b65788a042eabb4e03eb1c287da3d0000000000001976a91416f378c939244e6969726cdca75f1baa3e29aee388ac0b3e0000000000001976a914d748cdbff86b3bd23e5309eb8601beb53593e76688ac403e00000000000017a9142677e305e74b306a5a6efd162be1dc8801dd3c7587593e0000000000001976a914946fa3c6dd635cd142d1bf2e1fce440a25bbd20688ac953e000000000000160014050dba114a792124eb70069f1f10aacd16edffb1b03e00000000000017a914da6b553bbc2ed2d34b1755f684293a1d31e0904d87ea3e00000000000016001455bdc1d2fec01cb74b3f8f6bfb2ccf99bc18259d063f0000000000001976a91493d55ec0e69a43e30d9027bc5c06f7c5e6bfd5c488ac3d3f00000000000016001472603c99c47d2b7d974555911ce06d784ca8009bd23f0000000000001976a914558ea1795999f72cf6afe106269616bcc39d2aa688acea3f00000000000017a91453c83aa98857624af619cc5ed92d2ab8dfcd71af8712400000000000001976a9140fe30d27db7bd35b1232cce9f26cc55d037d3cb288ac35400000000000001976a9145f4b7a1a7a87157950a0292a0f145f09a093805488ac354000000000000017a914ca6bb6c6d5d7d4277b8e1682a423cbf7d3bcdc7c8738400000000000001976a9147198961e150a9224421f6ab06917440590af3e6088ac7f400000000000001976a914ac3279c7f64953ca7a62e44ec7d75910fb330fb688ac89400000000000001976a91450955fbda0f08c176458a4dc63b872c383694a0688acb2400000000000001976a914cc8b048675f5f3e4811237fa7dcd1db646a2939688acb44000000000000017a91417471e82384af7f31d87a699d31dbb0d627c5df187bb40000000000000160014d71fab9ede81c10f6d0535f7207655632039750fd2400000000000001976a91451ddb2dae3eef61c811548e09f35d1f54e11181888ac144100000000000017a9143edd418beefe51ed38bddbe4f53fe2a7b61403c6873041000000000000160014eeb24a10661a6e451e37a76a9ba34dfed2dfd88e3c410000000000001976a914cd57f7d934387f1ad3a299e43e8548a61349e40088ac47410000000000001976a9141f1f9a5923dfe499fd5f70d06a3970663ce5059d88ac5e41000000000000160014c3c7c3bece6c329343f167b0de25396d785595c06e410000000000001976a91482d61e58e8cee360e39fcec5ad658a9cd5467f1988ac8b410000000000001976a914285250bb3453e43839186aa32a1a7caa5cc4d75088aca241000000000000160014faabd05bbf73cbba0ca95e43c83c823d3a419262cf4100000000000017a914919b88c99537c05fc26b5fdf434aa25f535b8ca487fe410000000000001976a91421c2c94365e0581f4c28ba02428fb39b6ee25c2688ac08420000000000001976a9149d11041d9d8011bc7cbbc46471626fccde061fa988ac30420000000000001976a91473243a43beca32a976fa813c1811484a424711d188ac4f4200000000000017a91466af56d7af0fad1c91426dfbcd7e19fc2a3cfc42877d420000000000001976a914855debcbd8b7c126120d9b5252b15cb846872c2888acaf420000000000001976a914d0a0821084ab16f3e1e6b7e6aca355931404873188acdb420000000000001976a914eb0f93264b20f1ebd7e9f3da15c2921e1ea1cada88ac05430000000000001976a914e0638658dc7f6e231b987361c792249d245bb3aa88ac214300000000000016001418aa061bca749065bae6a984cb76f17518ac7c704043000000000000160014983a9871a4e94fb6a05f51afb9ce00a19034e7f2424300000000000016001452100d53ccb3baca913a6112f6cd641402d772cf614300000000000017a914da0bf7c778a6f4e2006abcc65d1b219d0aa7584b8795430000000000001976a91472a64fa653695b7983edd9925c8f9233aed1619288acb7430000000000001976a914475a9f35f53070752403653a1f8d9f2e20e315ab88acc24300000000000017a914360b9d3d4418f44dc0352959380f774e6e21461087de430000000000001976a914958a89d3e99a9afff91fbe1854ebfaacaf437f2988ac02440000000000001976a914b80b2246ddb5fd524234b941b695ab148b0a3c1c88ac07440000000000001976a914be5c3b05ae52db9bb14e78d11b148a466f02e2f888ac124400000000000017a914bd918a9ffb168a771ed5edd8341987dc3da09c6d8728440000000000001976a914c20c3465353cf2bedab5b3af582c8ef937f606e288ac3e440000000000001976a9145212516b5a534310805154107358d9b579d8526188ac654400000000000017a91490e72eb3e6a543b63178542510bb0bd7fd8a5d8e8776440000000000001600149eebfd7a07bc5c1da092d2d7af611f6a825e24f587440000000000001976a9148e8b72b6917589b820b9c78fe457d8c009d2704988ac9c440000000000001976a91463b0af7e2ffe9a0c1f7685b702bcc61e0befd98488ac9d4400000000000017a91422f169cfff6a0727caacd7fc84eaf98d8b6e782287c1440000000000001600146bb4e6315f633415082be2ca469c54691a7de3a0e44400000000000017a914622e938a839561c35928305ec416880d18da1f4a87f94400000000000016001445b5ff6af4e613255648286da4386043776ea18c2445000000000000160014e130807b2871a9e20f0ebe5cfd1586783274c10840450000000000001976a9146916bf1f4cd9396285e29d38dcf0a9cf68e76df088ac6a4500000000000017a9145eea54e7affb2833ed3d3f3046d9652b4995c7308775450000000000001976a91406b02b783cb390f72056f51ec8ab7e9776f72e0588ac874500000000000017a91477b55aa5f340e1a1bfe4495e88eb77754a0f571487c04500000000000017a9141bb822a30cae0148544728cf811c467198a4138087d345000000000000160014755ba7bf91acd29f546e6e0266592d542e47515bd74500000000000016001418aa061bca749065bae6a984cb76f17518ac7c70da450000000000001600144d88d157f0491e01dd316839f8486270e2009508f94500000000000017a9144af2a5b1e7d5b32ba10721bb07fbab33c32c8f6f87124600000000000017a9142dc425db8a163568f1375b35c105b4fe49c9f4338716460000000000001976a914fdb1be9f5ded0ab726aaa2c2760ddd66501f968a88ac3d460000000000001976a914c19ae70f501c9118229f990963e91f67b7b1d9d888ac5a460000000000001976a914d8709bfa6f242fa265bdfc75cefe916bcf00132688ac7d460000000000001976a914f3d75001b4f3bc5335677c4f690340474cd049ef88ace3460000000000001976a914ed670fecc4ff6c940aff5ef0a787386321f7b4bd88acf0460000000000001976a91454334730df0be6f91943ae6747c3fa701410caf688acf4460000000000001976a914001487d31c8423fc61b1830835e605f8ac3af62588acfb4600000000000017a9147831848a8f877c4467ea4b0f22177efae2a2322c87014700000000000017a914684f3622f35ac44a45bf38a806b70cf8623985cb87024700000000000016001445a44f5e0900df7f2e205449908b9ef51dcf3adf23470000000000001976a91476200b3603109ec9717b53cfee7bc86c07c1d7d188ac334700000000000017a914b713bb4a2380d237476fea88805636c8635e78f787b9470000000000001976a914081eb4fea44af169887a73fcd9ed4ed21e8f886888accb470000000000001976a9142e81717b0f9bcbb16ddba83abe6a67d76a0b75e788accb470000000000001976a9143e60d581e58d8a5474897ab1e4d0b6fb2a62074288accf4700000000000017a914002b0cd4925e45f2f6a3630a9a6ba64f15c5fd4a87d94700000000000017a914a46b82101083b6260a9842ea06169c56368bd7b787eb4700000000000017a914457ba50ac7cb221f51811d91be6377261bbe7c1287ed470000000000001976a914c30e8c83bf2502642f4e557a02e9ede2b809757288ac024800000000000017a914336f8ea716213f63a597029632191e88eb8ac60587254800000000000017a9149246aa5b2bdd7c37678a45ce74b504dda0f9815c872b480000000000001976a914eb1921e6ed17d4661b2eec7bb8f24c7ff21e9fd988ac5a4800000000000017a9147bfba6505cb1c5f730bfa81914dbb5397c7ea12b8767480000000000001976a91468cf533adaace4aaaa5362604daa4dbc9528379d88ac69480000000000001976a9141a68a5fecc15144f3572c3a00615eec6d3b2c79688ac6f480000000000001976a9144774dd18e125febc01b90c6bc926a3a46cebb8fc88ac7e4800000000000017a9148afcc4d84d1c7d67c5ab209445c7343b7471b564878b480000000000001976a9143f6ed8a80c70e70ffb1b8e5603b23c9e4444b5a188ac92480000000000001976a9147cfbefed3e173652699f9685bafa8d77e43085c888acc1480000000000001976a914449494649aa14d362fc91b159739890b6a1dbb9188acda4800000000000017a91402e59d406377e2c83d975d604b3f3871b98e970a87f0480000000000001976a9146761b197015810304892f8de7120969043a53ab888acfc480000000000001976a914a82dff405441011bea0f4c972032ffd8eae1d16188acff480000000000001976a9142b08282aec3fcdadcf558c321122f87b708e47d288ac0b490000000000001976a914bc32bf5ec4f5315686b670f6aa7df48b8005853588ac14490000000000001976a914d72c77eb404bc8cc5312e61903db093ad45abca388ac32490000000000001976a9148df29d0c9e304e8879058fc43389b1862862ff4288ac65490000000000001976a914683c36685893ab4e69df45a40fdc1be6a06e663988ac6a4900000000000017a91418095dc2a23ae31dabf2958e69566c83712f9421876e490000000000001976a914d698b04a4c9e606b35e31b66abc2d1e1f7ad348a88ac7c490000000000001976a91486846cccfa68776b05855f62f53b48485a3cbd4788ac7c490000000000001976a914b0dd46cde6a2e04033e09e2526fd8557fabcaa5888acb1490000000000001976a91432b1ed68c836d96a385b320b3186df5763cd8ecc88acb44900000000000017a91426361f5e3e009664ea79fc924e97c778cb2a49cb87d7490000000000001976a914de49f35edab32fbb8e25b5b2cb85ac8ddb45490388ac154a0000000000001600145aa2f474ee211ef65608602073be0ce02e68ad09174a000000000000160014297c144bd65322e13590be02e41efce5d185c5b5374a0000000000001976a914472e83121646886c594e3ad6d864d81d9bee30f388ac3b4a00000000000017a91468a14fc7e4172822086fd194b3af6affaba9946d87a34a0000000000001976a91401c2e7c283e0893a51a67d56680cfd1a5284ca2288acb54a0000000000001976a91418cc4a827c8f34b60ceb258e0f09c1120785639088acbc4a0000000000001976a91450754787820ea1c030943a5e364fd5d4f78e1acb88accb4a0000000000001976a914996cd1bea57842797f1e23ef69ee9a63fcc72c3488ac0f4b00000000000016001499d5ae75179034557de9c832753517bdd1cd170b334b00000000000017a914bf2fdc11bac40d8bd2c2182ab399f5e08bd3edc9879b4b000000000000160014927ee1489b3a31f6909ba965326afc966430c16ce84b0000000000001976a9144f87be1e078cd12b01a5d07a368522958ffed8c888acf04b0000000000001976a914b57620d6c554dc02e7f105bda90b2d09bb17ade588ac004c0000000000001976a9149e08da73577624b5b2df298d18dd2d55d23e038388ac244c0000000000001976a91481f6eda72c8b5495eadf093f21e2ae233a8f09ee88ac2f4c0000000000001976a914acaeff5fae378baaa3f661c46eb0121a0c2f6c9888ac794c0000000000001976a914a021bd69997f2d002c3bd88a17254cd27fdcf7cf88aca84c0000000000001976a9140109554282fbfe0f1650fd70bac1c5e470bc823a88aca84c0000000000001976a914435012f46d1638ea89e44fdb1e2e2b19241ae44c88acdb4c0000000000001976a914784d560194d3f855eade0b221ed6dbb1c1faec7488acf34c00000000000016001491eeca820af45acd97ee96da3cc58906fdea455ffd4c000000000000160014035e11339cb1c20fa1c662812f4ac8bf66b698a3394d0000000000001976a914eef316be2c1cd528dfbd053290322a7f8f7021e088ac624d00000000000017a914c9f9b47b0722e87c5ac8f27050953437b24186a287794d00000000000017a914f73af1527e0ada0d02f28403ee431bbeba35c41787834d0000000000001976a9148bd86861f7898051ff68edc03dd2ee3c80ac9c8488acab4d0000000000001976a914253eb1af8643b61d440f89f07eadc9191184f80988acc54d0000000000001976a914aec2ab787221bf634deb30398b4f69dcd6bd258d88acd74d00000000000017a91450af52415ca45b0afa22b5eda00de4418a47f5f187da4d0000000000001976a9140a737b0235567a7ccfb66898fcc50066cc9b34c788ac194e00000000000017a9148e991a47aa4353164949e5c7028681c79ab9801e87264e0000000000001976a9141e2229f4e70b23b5ea5aa628290dbf9941cc881b88ac284e00000000000017a9149f3d3295b50d1722c84bd0197c0b506e058c7edf872d4e00000000000017a914b68de39d9e5e67cc063e82fb9a5b83b076c84bf987494e0000000000001976a91422522ae9b3e3140c9be86257a74d101c95a5e59e88ac4c4e000000000000160014ff11e76efc547b4db23cd8de6394918c0e6bc119634e0000000000001976a914f5fa9e54bed9d5f030e3559c548fb6dfbb2d93e488ac654e00000000000017a914b52e82e8f668cc109784fb1029ffffdad1b91e4987784e00000000000017a91401760ef3c8fd1013559fdf4356c98ac6aeb0b510877d4e00000000000017a9140a49cbe3c793137bfa5564ab49a5f3c46997870787824e00000000000017a914a1d104e1d6beedd1cda6c09c430633a4fa77cb1e87994e0000000000001976a914ed5ff75ac8c1e4c94ff878a25bbaf77e63000c1288ac9a4e0000000000001976a91461c89d8aa6a8ea41f27795b7ae98266cc6c78eca88aca94e0000000000001976a914b7af56725de92d33f79f42c2c5b2faa8297aee1588acfc4e0000000000001976a91458dd90941df5b2bc1c1083348784ed09cf1a5ca788ac3a4f0000000000001976a914ced1152fb6e3ae79c2f6002b68813a9292e9d94188ac3d4f00000000000017a914d3ec89a8ef94b6310d6701992cffa8b663a8956f87404f0000000000001976a9142bfdcd181b706aa767327df33749898c8bbd52a888ac464f0000000000001976a9149bcdc3fc1e6fed48b19a385f103307b2b6a5926488ac604f0000000000001976a9147a6976bf3bce30977d6d5fd320108b04a89256da88ac634f00000000000017a9149dfdc9cfae649494b6eb8178f534766d31cca88987964f00000000000017a9144e0a24de61e7f5d642ba4cb406badd6ef4406d7087b34f0000000000001976a914ee74dc92af31c372aa2bfd31d9d910c1ecc2212b88acc04f0000000000001976a9144efacdfb05a860ba8bdc14cc0e9747acdfd9708e88acec4f0000000000001976a914d0e13f56c61370e3838aef8fd3e115bdf933d15288ac0c500000000000001976a9144ae784bd215af591b9d231a414f69184a3f28d3a88ac105000000000000017a9147a40f3d9034288cab3606f8d2db0214ee1e199b6872a5000000000000017a9145269f5db69330145389df4bff0a5d8621d4eecfb87305000000000000016001414632caf3711d4cf2b8e33e52e06b7e4153ad4d142500000000000001976a914047ed7f121c101a7beba870ef6ecd9c221617c7188ac96500000000000001976a914a41c4e39f9b800b7a2bcdd96061af7af56bd06df88acf6500000000000001976a9142e66cc842b0ff434e026f803331ce5286a78814488ac16510000000000001976a91462b963f8be88db652cb405148e3af4299e35d01d88ac3d510000000000001600142e28323435b741a7b613d347d7f4aa5e36e68c1644510000000000001976a91441c1eb0674e624e107f198395ee9717b0c0281c388ac8c510000000000001976a9146af9ca24938bfc13d109dc687a88862d0d9e620488aca4510000000000001976a914f332bb09ace36b4d98ce1acf5373abe16a933cb988aca65100000000000016001483bf902878145796fd0623dae9ebb40e7539cd6f07520000000000001976a9147ed9b20f910443bce0dceb19015d22df95802c7a88ac1c5200000000000017a914780951dadf309ac53521d6b9b213b7145764f59c8726520000000000001976a914766e3082e881527e01bf93fca8f5e89ab3ff8fd988ac4e520000000000001976a9146c54e5924a12cbe4fc1f8f06d916706888d4a4b288ac59520000000000001976a914baee7f830c53d4143059bc6fecc769e35190ba2888ac78520000000000001976a91433b4519644d203591fabe1bddb03a6762f874b8b88ac7a5200000000000017a91414b7dd996cac7659038bf24c50abf5d24f5b11548789520000000000001976a91449398ce57d1e4382e09605954e37b6eba77af72488aca2520000000000001976a91471312113e2b585b4b17280c8da2538f81d0ddb2a88acb652000000000000160014da9cf16f6ddded60897de0fd3d895d22b87ae100c35200000000000017a914cdeeef29d2f67fa736f62762895cc0de626d0a3a87d45200000000000017a914fcbbca6ccb4cca3e94ae1875abd53c5f919e94dc87de520000000000001976a914e63c568332a6884ff1d8a4a1e649809628ad907688ace8520000000000001976a91407aec6492cac4654053b8e4fe2db95a2277540cc88acf35200000000000016001433148fa05cf624eeb2572af13273bd06127eb7ff22530000000000001976a91464b4341a05dc418613e787766450d227cd7fd4f888ac40530000000000001976a914db9efc428c5c576d3d2751bc972cf9815dbf321388ac5e5300000000000017a9144ed6911a31b86c89c6ae142d2810dc5966b845d487d2530000000000001976a914b0a2400251dc9ebbf4b5e92b0a9dbe79c232645688acfb530000000000001976a91484a30d870db78f39bda13d377759ffc69341603b88ac095400000000000017a914b1176f3a5a8a2a830cb876cbba1a90bb9f31e7168715540000000000001976a9147320de6fc5990866aa46b9c0e1eb9b01621523ae88ac6f5400000000000017a9146e4ad46e255955abacfde3aa20e0c85fc08963198798540000000000001976a9146d0710619297b326b8607bdfd482582032b144a288ac9f54000000000000160014617bf38ae56dd98ef9ca4a8f07862e3f296a24e1aa540000000000001976a914c6474536cd2b13ea64d9558ceb7566345835d8a288acb6540000000000001976a9147985a202c9135f2b23f4cd60c4770db3219aee3588acc25400000000000017a91443276d0b69d135f59ed1dc1d6f7feedf8936a33487ef540000000000001976a914fe8d5bcd9e996210109bd5698ab7e4984d1947a888ac375500000000000017a914c86c07f49bf803b5808d26194bd2b644f136368f8762550000000000001976a914eaabe1288f9a00df425465f87cc8edb845662b7288ac75550000000000001600140c3433c5a2e59bca86cdfed6b69b8add95f9f30c0b560000000000001976a9140dc8d54296a613ef83926075e9a3dbffe792596888ac0e56000000000000160014aad3adbd1bd19eb2a4366b906627bf4083519a3c10560000000000001976a9147b19d0f1318332466d39e714c7e78f956b1401d288ac6b560000000000001976a914ab743b88566aacbcbb28d1968355f9b40bc76b9588ac90560000000000001976a9145f99a547736ee0742dcbeb8671e2026f5a88ea3388aca4560000000000001976a914a67f176a1d45790d336d9f8239cc7a28e0aa08f888aca9560000000000001976a914d3dead57f182e19fdf26ed9cb104278ad8ca9bea88acd75600000000000017a9144420a73c42a11f553db1bf4b9777afae3a444eb387e2560000000000001976a9142e529835c6d9be750771eb5d76c2365c70b79e5788ace75600000000000017a914672612aacdd6393f39807eea5f203acded00e1f587f156000000000000160014ed421e3a8b5fe0f90191143379fb2a6914c7d8c012570000000000001976a9141a12ad5d2cd9e4e0d89d54554d7862ae95989e8e88ac13570000000000001976a91432a2c0a23769269813f1233a074450d64090a9b188ac19570000000000001976a9147c91794469d61f81acfe43d4a4bb7b25772e2fe888ac2357000000000000160014f1d88a1055de3423e416df2f57ce6947f34d441729570000000000001976a914d10a62a622b13f08a190b197c29cc4c8f13370de88ac3d5700000000000017a91423da5835bf2767130a32220e9759881b6d2a5d13875b570000000000001976a9147cf9137a8e5dc4388e91e78045b720e5dd42b0f788ac63570000000000001976a914d0837af5d140815c15a83554f85315d366fbc52988ac715700000000000017a914322b6ae831614e9619db5e0f066e4fd29b712ef287ab570000000000001976a91465b3d4540bb1264128852a47c23d22e3ac12c4b588acb2570000000000001600149b068d62276d383c202844b896bad8bf995c318fb8570000000000001976a91424d91edc080fceed79cd5c5aaa5013228906aa2288acc757000000000000160014e89bf17fd266f259f0a2eac06bb2878b3595ec9ace5700000000000017a91400b6be70991d6a1cf148c60b06ec6b1a0bffccf587ef570000000000001976a914551a11b07add15dd2d17b6fa45bc2c51a442203b88ac8f580000000000001976a91410b5bd6f355d6aeb7b609ffd754899f0c792ee3088acc65800000000000017a914d5e46d94ed669feb8625b5014a1ac25cf9080f7287e8580000000000001976a914f19e046931008ec5a041ebfc3ffab043ede8dc6788ac1d590000000000001976a914755940dabf32104ba7ff3aa11006a02716a8a96e88ac3e590000000000001976a91496dd6081eead9fec140be8bb9199202d2294d17088ac405900000000000016001413d4d4fa5ea18a6159aeaa9c4b9a985a3fb61dad51590000000000001600144f5a439d8c1263272c93acd86bd97a767ad164fb645900000000000017a9140c4a13f5c0d2da1797ea9a91592022ca39b050e687b6590000000000001976a914c5acb4e9b98c30606dc67571c1b79e7e0e7349b288acb75900000000000017a914dd095bbc59bbf4d7cb942cf8c0466a7d22469eb187fa590000000000001976a914d818699225620fd8cd641da1cf278b22ffc0784a88ac0c5a0000000000001976a91441bf1348f594c85243f1afa18a603e5f8641bf5088ac375a0000000000001976a91488a60b05715a6487cc67a954bd5e2abe1860217d88ac4a5a0000000000001600140c02f96be13093547f3ed534f4afd02051a926b9695a0000000000001976a914e608217de3990ae2929d74e41522cfa27f1e16ce88ac715a0000000000001976a91461559230751c37785c1b884b32fc0ddf6759bce988ac7c5a0000000000001976a914b46960034a3dbd089aa676b792dcefe9bd9289b988ac915a00000000000017a914998a4a230c3a9e56f5168179599611a10f5802fa879d5a0000000000001976a91451cba11d567744b9b2616f4fb8cb03dfb43dd26788aca25a0000000000001976a914ea6aa48e1baf5a8116d5233efaa95dc755b4724b88acf15a00000000000017a914167c505c7e06ec0e86eaf63a565daf8483d590df872e5b00000000000017a91485f248403a9f4b2b06c89902b6b2729aca0d813087345b00000000000017a9145e7fc3a2c525440741307a013c566d013631d53b87555b0000000000001976a914b2f8af026f47a1fc5592cd56fad40f6d4c9054ff88ac605b00000000000017a914ab1de3f59d465ae010b10ee92e61a11f78b274e9876b5b0000000000001976a914047ed7f121c101a7beba870ef6ecd9c221617c7188aca15b0000000000001976a9140345d5ea342615447486cf5f4b57e4c1aa73928488acc35b0000000000001976a9147f05a63c0b3aa3b6a1647a82e3ca8d1e6d76aa4e88ac345c0000000000001976a914a5f9faae5a746eb921277dba23765c93e31ebcba88ac3c5c0000000000001600142ec4a3f85ca90bc42f38e1cd639bcb943854dde64c5c0000000000001976a91444bfe8863074d3a95ea3dd727a17f6df372d61c488ac705c0000000000001976a914ae60e975ceedf7732fe23ad636503f9aa2564b0a88acc55c0000000000001976a914701d4f71dbeef7f6bc421fbb04fb03307d5d17d588acc65c00000000000017a91410182260c56b4419d61c76df6c6bc17284d917ca87d85c0000000000001976a91404b69431a5ee8473844e81ef492ea6443e476f3c88acf55c0000000000001976a914f120d847f1ed18129f1ec9bb20cc510813af541a88ac5b5d000000000000160014f7ee45f42ad3196eb743f25691fd15e4306a09605c5e00000000000017a914a9d0ac1777fedcc17de7805dd685781283ed2ff087615e0000000000001976a914104c06f6d39e28035c5fa9729c3a93885fba4a0888ac635e0000000000001600144ef542f8d5c1967932c67e8529a6b4c87aa6bc22685e0000000000001976a91485e4691dd45bd9ac85be0c156a600426eb683c8b88ac6c5e00000000000017a9142ddcd2640d8e1c1f3eae667cb9d814600eec9d24877f5e0000000000001976a91438a33bb0be8de95f9d70c8cfd79c704a3443e46288ace15e0000000000001976a914b308fa7ec14425c953809f7764e1fceaaeb42e7288ac185f0000000000001976a914cf280299568191313e64821186de4514e430074d88ac1e5f0000000000001976a914051658769e9687c4f823b6a127b1ad128c43670988ac255f000000000000160014481efc2978532f855e2a81484482340c3e139f503b5f0000000000001976a914b01873999bb7b09c18ce182166fa5179dc184c8b88ac435f00000000000016001438f6f02c80e73f3de8ee8b5a9c16b0b6a151c34e445f0000000000001976a91455a0d2af63c1f4bea47e7f9cf6d5736177e64d5388ac4d5f0000000000001976a914001eea1267afe9bcf00c294ee9793a824b8bd36688ac835f00000000000017a91490944353d0ace2e853740dddd8629d630a7530a787a95f00000000000017a914b25c7d98de8c4175447681fdcde8b7bf030e34cf87aa5f00000000000017a91487808264366d25aedddc84f077e0e040a635c4c387ad5f00000000000016001431e8ede27a97cd0b936774300be4fdc82619afffc25f0000000000001976a9144a75ace445f4971fb4046ace48add8430dcde30388acd25f0000000000001600140e574fa425ddbd45b8f5fb41e4f9f02113a7abf1d55f00000000000016001407ee83201b50ab12879a2d4be6d1955080e618282c600000000000001976a91476a3a16865cbefe0324611f4092ff7da9352f6eb88ac576000000000000017a9145e7f028349f0a5821271347cd030373cf4c4502d8774600000000000001976a914d32c03b4c402a3f53726a10ce82daa1d524f3acc88ac7f600000000000001976a914166576f3c870704cc3b01f86026b996b5717f55488ac966000000000000017a91492327dac81c1b44e363c422c14b626f963e19f9187c2600000000000001976a91414719d098c00bd1c41ddf0da5798b15f67e8818b88acdf6000000000000017a914589c2458b1ea09830b21983e0232ceecb03e9dd28705610000000000001976a9145ebaec5cb899c02b81728c89db0a0c3ef08befd488ac376100000000000017a914ddbca878ed25b8ccfcca4150d3a14fb7d9b843ba873d6100000000000017a914de2446925a4b745f9cdb90fa499934f708095bf1878f610000000000001976a914e40957eb73de9eaf88612f6c63d9c0ac4b0ee1bf88ace46100000000000016001476552e191e14120f56f9a13a222cba1ff8c5dee646620000000000001976a91414d93c042229ad418b489f138e9e06e644f465cc88ac52620000000000001976a914e0ad66f04fb15e5c362ebb82b87fa9e5ac8a428588ac95620000000000001976a9143d4eef65a30ddbeca0d8238387294edc78a09bcb88ace56300000000000017a9145762c7be5f5e300a9bdca759d6225231d8b69dd387166400000000000017a914f9f8f02dc369bd5e2e3f3bbd25fde67f0ef541748722640000000000001976a9148d692b98dd5aa14cb9e3e7f457dc61447925e7fc88acc66400000000000017a914aa11d0e222cd42e047abc9e9d276f54e43031b5187c7640000000000001600145ecf723b29e01aab91d1ce977e9f1886a98ae379d064000000000000160014d7cc61aa52a3211f9ed7189cef3f56404f022060dc640000000000001976a914caed8c8675140cff8a2fad15ef19a37e5b1d8a0c88acf16400000000000017a91486e622d8238c73a979b07c9ede2f6d93c5d22b0e874a650000000000001976a9144baeb18998016a2f298f2bece0d9b28874b17a6588ac63650000000000001976a914bffdeb01a1ef20ed1f45bacb1cb39f83866f023288ac74650000000000001976a914d2fb38a1774a8f4f2fcc4cae434e32e0a06b053588accb65000000000000160014a5114b51efa4d1ce55741c582f3b856d54458da9d5650000000000001976a914a63ff76ad89496770d98b9e28d0a8c82d5eb283b88acf6650000000000001976a914c66ea8c54d1a21a4920a7fab4392b06ee44e8e4588ac65660000000000001976a914f2e6bb3a08530cacc3c42611654763ca81aaf4b688ac7a6600000000000017a91480e13a0361f2800567b38627ebcb5e780a82b90487ba660000000000001976a914a5028aa2b4278e4cf1c7f487b387ee79c68114ed88accc6600000000000017a9141844ded9db029c1a7333f2f7f2119e0062403dd287326700000000000017a914fce3ad6a362426064ae2be24bf1f893023c9c3a5873a670000000000001976a91429924694298bbf4c53b77626673e3049c2be134788ac5f6700000000000017a91491ad629f4d8546bc8368ede3f391e392cf740621879c670000000000001976a914fa965fcaaf24fd7ef951525ba71702a610ef309a88acc86700000000000017a91434b68357a83d65cc1c74c108b2e81fb4f1517fcc87e0670000000000001976a914e0e48d413bdeb32b72d6ed7c6513340f0310733788ac076800000000000017a9147776d6eef5fe33ee34bd70d6448a8485724784048738680000000000001976a91425e25529bdeacb17b531e9afc9f7b4d85947249688ac446800000000000017a914489bc96330a8166ee8f04fa1f83948286880e664874d6800000000000017a9143be3288851ff4b278f75cb6e718fa3e3e83038bf87846800000000000017a914e6b886a190e387a2eba2ead60dd2c856594f7d12870c6900000000000017a914b7a69ac97c9f2837d78b0ea51c679c357877d1c9876a6900000000000017a9141aef6fa880d0c776cc53b6f43c0848f5afe0dd2d8778690000000000001976a9140cfadac61a6e837c09ae7442586badf3c8bd4e1e88acbd690000000000001976a914f12072fc0e90272716a947fdf06a8668168f48e588acc4690000000000001976a91487ade0ee099e12bcf125b4ae88351518adcdb67c88ac006a0000000000001976a914cf6029d35a87b6dee6c868059fc3ae2cb25fe14a88ac0f6a0000000000001976a9144175c6564640b48f79cf0183e508833c9f578e6088ac496a0000000000001976a9141c7ff58a080bf6b4ac19835bdebdf106bd9dc80c88ac506a00000000000017a914f5b7b6ab494d788d158ea69f85e096a88f4ab68d87686b0000000000001600145e8ae6ce95ba3afec6b954e0a4814f0bbafdadb0a36b00000000000017a914d0e8b8f2d87f58c2bd19bc678cc3c897c0d6462c87ac6b0000000000001976a914f3f594aef6aac9349fb84d32e5f11764841bf93088acc76b00000000000016001475124368faa6be133dd0613c7ec97905cde300c3c86b00000000000017a914e9f6dfef4951b9112a8cc87580f578bfb2fd384787d06b000000000000160014f05cc2e214be9807cfa103a1ce86607a82052fa30f6c0000000000001976a914b63b7008c83968def17dc7cd48e84076ff8c174c88ac8a6c00000000000017a914f9b134ee8b76b94c6d43f9387c00a15aed4f4d9587b26c0000000000001976a914504028f7ef08c182c4a0386c04764f38b661804488acd26c000000000000160014a3c7b482bdacd86b4d878b2bdfa2f3da348feea5e06c0000000000001976a9146e1df0b29e463d74265c8f1e28103a4c67d6050d88ac1a6d0000000000001976a91428dd908696ab2946281eadf7b33c5fbb321f91e188ac316d0000000000001976a91462a9e75496aa8c5d259e79522bf7102b22ce6deb88ac406d0000000000001976a9143cd909b98ffb8e22a67e409a961b49c921f1f31f88ac836d0000000000001976a91471a96c6cf897e528ad50c1843fb64866af53fde688ac906d00000000000017a914b79f2b722f19f521a25e581751b8f155d5a0e35887bc6d0000000000001976a914ed97b09edfa31b34d9c6aed954daa24bfcbd34b488ac096e0000000000001600143f9eb05273bef10d9a581c5b59190b866fa7f202d66e0000000000001976a91425d18979d34e80dca0864326ffea68a1967760a088ac086f0000000000001600149cb18216aeaf3a12ab6ced7f22f6a41d06097fd7256f00000000000017a914814250abe45175e0a84cef36201995dff9418fa487286f0000000000001976a9145ba22ec957268267530c752716965518580fe0bf88ac556f0000000000001976a914545bcdc816b3db86f2a660fed7bd5e345ed3788588ac866f0000000000001976a914fc0ffa042c35a095c618d378e65c35ad057e8ef088ac936f00000000000017a914fc4e2ebe244c524ab4f588b9ab830679c41f7d7987457000000000000017a9141d5fabc5ddabc6d299cd1f343b85227340534f4a874d7000000000000017a9142d1b28f201e1a31f2674fc421fcba3a54c76b95a87cf700000000000001976a9149524c189fe55812fd6f6131db4ff96c3f668cf0c88acd5700000000000001600149be0621d136053e1b71e15a7ed332f56dce000da8f710000000000001976a914ef94f39f43fbc6241a9ff31bb36e8085eebf2efc88ac90710000000000001976a914c018c580b9faaf0ee6fcf5ecd2b3a9530e83f24788ace9710000000000001976a91437a210d9613755a0946d44407a1dd172ca526f3188ac7d72000000000000160014f8d59c998e39c1841766880597f6880b73325cb07f720000000000001976a914c9434dc06bfb7738fdd98ecdde306c6c19f1596c88ac3d7300000000000017a914b6c3d5efbb8951d50b4fe982f67be4ea73f4ae23875f7300000000000017a9141441df6dacfeddda175c545575148fc72577af41878d7300000000000017a91449b8f1dbaea9065f30c17adc8a3dffb7fb882d0287a17300000000000017a9145247183ffd068d0b80d5b5b0e07a70f65ff2277287cb730000000000001976a914b3379da8d4072fc96635f6724903c3350c28571288ac26740000000000001976a9147d56657f89e2957caadf946657a37b8588eb8b9088ac51740000000000001976a91469ec02ab6531c0b82af4ece574e9b68e3fa7b9de88ac55740000000000001600148794413107080cb92c509300986b1d4a232e114960740000000000001976a91413b7093632a38ba4b6a3d995ef6cdc82296d3d9c88ac777400000000000017a914d18b8e6f8d96327df3fa0a23351b135c5711f09b879e7400000000000017a9143be5c3e5d34b37590384795bb0fd0ac885e8c8a087ce7400000000000017a91429530cb585faa63e1ced20f8672f2f58022ff42a870b750000000000001976a9148b0515accd7eb3b8087c55ae4e56898cc2d9040588ac17750000000000001976a914979b5643b1b77d6f1122411fcd0d62a66922cd2988ac62750000000000001976a914139a70e52006bfe969ac0d6780820645b1bc02cb88acaa750000000000001976a914fd960c76817245bb882ca901bebc5636473ac4b388acfd7500000000000016001438c9f996a15cae4f89f51be984d8b640fd84d55434760000000000001976a914a9e18e00291c8fda8e81fc988bdcdfe46304c6e988ac46760000000000001976a9149fce549a7d890f91428c95f128d39befa017d8ba88ac63760000000000001976a914ddf333d5dc07d226209c21cacd43d83ab01cec1c88aca67600000000000017a9144f2be55bc3680a600aa38bbd5a9e1848443890eb87e27600000000000017a91427e1c438a15755e8c9ee84ed51b3503a4397b6b5871f7700000000000017a9146f55be8a7796e7a1d998043010b2a7ef416c824c874c770000000000001976a9145515f81ff77fa195d7deb57d078d19fba72894a688ac7a770000000000001976a91480e064bc732ce188297a7821bd7ae3ce65612d3f88ac8c770000000000001976a9148e04aaf1f52be1201acb88021536a0d9a8c595a488ac927700000000000017a9143ae8e90ac4e499b93a05e989f0d333c407cff91687e9770000000000001600141f51a250fd3e7cbeb27427cd079b4d66c79fbb9419780000000000001600145b8a5b1860278b0f1cdb5f4719995ddca474aa0e55780000000000001976a914d408afe0cd3708fe65111737e7612e009077040c88ac6a780000000000001976a914a9d4fb048a2db70465624c24a273fa1cdee1f2c388ac7f780000000000001976a914f400590f47d98c9bdeeb6764985a02414e1e7a5f88ac7f7800000000000017a914d67ee3602ea9b539ca7db46add7467464640771f8795780000000000001976a91422f8ff98ed0123065528fb28f332f4f3e9888bf788acba7800000000000017a914e7a54e888c881d153d886c01e9af03cb1d06ae4d8724790000000000001976a9148f603d9cdc23b4a56be1f9ffc4c6169f3854cde988ac86790000000000001976a914356be08014ffc7bf2ce9b880a27dcf5ef948edab88ac91790000000000001976a914770259dbae711940009fb1c292c9e00d59f324f988acd57900000000000017a914e7ecbf024d65a9746012013b8ae5c7fd7a384100873e7a00000000000017a91492299a32c179f884b85e35e1f4aea27084b831b487417a00000000000017a914502ba6b8318358c7458c417e56987d95ef98ca6e87457a0000000000001976a914f681733874fe1dce651ff2cfcfd505fac1bd3a7488ac517a0000000000001976a914c708f3e8b385ecc8e4e61266287c2592d76cbdb688ac5b7a000000000000160014fad6c0189af135c7b5b0bdb7e3b29a762b54a2f06b7a00000000000017a91425e8996ed63f518476d53453477745cfd0c9853087bb7a0000000000001976a9143d1b8bcc9e4cb6a9e0c959074748f48ae4c05c8f88ace77a0000000000001976a9144e0638ed113bdc3fdc62a485897d5367bef8c57488acea7a0000000000001976a914dfd5afc7824bbd23036640abd32df9819b5d906b88acfc7a0000000000001976a9142b2da7ca31c07e3927d234f1a3444a876b4321d288ac177b00000000000017a9144541aa33c9e1cdf64518b67c1cedafa5732d0c7687307b0000000000001976a914ad604fe90ae05f5b1f1e961c6338afb6f4329cfb88ac5f7b0000000000001976a91485b5fc37bf281ff53f5ebcce8ebf18f684ba320288ac647c00000000000017a9140c3d6f2283ca2c2686f10b3c1316241cfacc12af87997c000000000000160014b01e7d56f56c331737531a6f8ab3c1ab9c247a06dd7c00000000000017a914a401544345a8e05a4b34f794f5148b9856d1cc63870c7d00000000000017a914ec523090da09d63b23515012ee100f9fb1a3059987857d0000000000001976a9141d044fe1e5ef9961788d84ae4f0a2707139e516288ac9a7d00000000000017a91482a01cd60faa18f8b6fd09e5f9104748958f34d787cb7d0000000000001976a91432dd95dd00b93777c0c3166902b3e34177899ff788acf37d0000000000001976a914ffcf7d8ad00d077eeaa786da1ba1b504588c643088acaf7e0000000000001976a914a3cef1506f769fc1bf42fe1b17a239719a2bd2d288acf97e0000000000001976a914ad3621168b5815d041deee590cbfabdba4c2460e88ac017f0000000000001976a914b8cf8ec255195b4b0eecc9994564b6414d1c88b188ac857f000000000000160014adc1d8685182eba8377099d5fc32fbad52511686967f0000000000001976a914554d305937328fa6439021eda8db1a3ad922707088acb67f00000000000017a914493ef01e509752412254e0ba7eaa25b2e4e37f9a87de7f00000000000017a9143f12e2ba46100950def95eed9439630b34e80a5d87e87f0000000000001976a9142b1882a2575c3616c36c940728e08ecefa7f588688acee7f0000000000001976a914af8a247a665859f83bb001aa68c31e75454582cb88acf47f0000000000001976a914ab285a478de7db5929abf5564042361c258345fa88ac2f800000000000001976a91495ee6bd1cf7b4a76f07856b5357aa300ea9048e788ac6e800000000000001976a9146e1e30b77f08c4dc2bdd4a014f19c2f4740a190588ac89800000000000001976a9141a8a5c50d109579366ef3df34108cc5a5287934388ac9c800000000000001976a9144b767b62e676ea44121e096aeb9a58f42683020688acab800000000000001976a9140abcff28e3c0eea51b01e046e50cd3f09fdd695e88acca8000000000000017a914c7a7c74cfb14cee419eb98280a808ef4abc619f987cf8000000000000017a914d053577cc5360264dc473998d09d63c29c4b98df87d08000000000000017a914dc8e2e6652fc2f0bfdb8595ba57015d6d3120ac2871a810000000000001976a914c0fd7216a9ebd0b98fd8e72f18000e7bb45a2eab88ac28810000000000001976a91486f5b96ad241cc45ae3c43115ac8cfe65c84925388ac9b810000000000001976a91418f94f3f346b4fa2c9741ae0d8080013a8915ca588ac9f810000000000001976a91494576f8b2a0b035ee493c6b467ab5d5bd9390be388accb8100000000000017a914e35b712f7910d245c55f334fc664e4b505c3c40487ef81000000000000160014f43e6b528b44078e882f2eb4e430f6e9d0a262fef9810000000000001976a9141c95ca234c404b0cf467f861aeda287a5313134c88ace18200000000000017a9143edd418beefe51ed38bddbe4f53fe2a7b61403c6875b8300000000000017a9144a6087a43306ffc8d02ebd42f3df07eebb716eae876a830000000000001976a914b87b7db9af4bd8623141889649f2154f43660f1988ac74830000000000001976a914bfa1550c02c5feb7da44245b9dfa104cabe50e9a88ac758300000000000017a9145d0cb2f4c2bd9d618d34439ba3c124aec9c74c46879c8300000000000017a9144b343852b65dfe5adeafded0f4239796ebd8916287e9830000000000001976a91429182f9e7770565955d739233375423453a1dfc188ac26840000000000001976a91423bbf3598b48d1ba76443fbf99ecfce805469e2688ac3d8400000000000017a9144ff6ea40cfdc98a8c181c3d40f2dcc2d665a93928772840000000000001976a914aa7c77afc2fdb7322bfab50f193d95e6ae79d92988acd9840000000000001976a91430a36156c5eded5f10a78dcd61ccd8167f1a007788ac13850000000000001976a914d9b74c3fd6dfe6611ceb1adc38d083f0c81e3b0188ac3d850000000000001976a9146fcee968d0ba9b67916d82287a1aabaf4088601188ac49850000000000001976a914a0516b25b0c07d7a31c069e76fd630e51bd2678588ac5e850000000000001976a9140186dd75b0d867278258742f474b875f3590742b88ac86850000000000001976a914bd6c6244f3d4754b0f4eccb5ac510241f902cd0788ac8d850000000000001976a914b41fdff7a0adfc8167e7a8f88f4b829a0d4386d088ac2d860000000000001600142bbb2b20efca03d46f736496a84d128536a1d9896a8600000000000017a914c544063589f21583d501b4e307dc361053caca4d87ac860000000000001976a9147c23e04c2fe7d5125757933691965adc6c5cb1dd88ac33870000000000001976a914cecc015d47f86b6b4863c9f9dbd75a4b77562af888ac608700000000000016001455e33c8e9adba640aea712cf4f0aecd5064c0684b3870000000000001976a914b0c80b85da7236b580e7728f4e55ccd54d956d3388acc0870000000000001600146d774c5cbd9359ccd424b849bd27c3ac0d0449f7e08700000000000017a9140656f64d0bb3b153613dc2fd57f31b62506e77c987f88700000000000017a914c7051bc265ea6f3b3a07e3bdaa5974be2f2aa56c873f8800000000000017a914217efb23d8971d42768f735c4ff0fa7e73904b76875d8800000000000017a914ce8c9228f85d133212a2c857ac25a2cd19f309d28783880000000000001976a914f2a9ea6e52765c62a1797bca15831d297a0e10d288ac98880000000000001976a91408051db571377d5fe3362e2b60523635512f80e988acc888000000000000160014aa9bfdacede0fc6fd770b89f94288cf28692fa65d2880000000000001976a91480e3844036e2351276da4949cdcf13458eda65a088ac52890000000000001976a9149fd79e414f271bdc065a4675837feb60b28d343f88ac84890000000000001600141b07deb51687d44fcdfcb2029344245a5b5f576a9e890000000000001976a9148aede7cd460699faec5629a18654bbb2355c616588ace5890000000000001976a914208237c8176735755976a2a92d31d026abbffbed88acf28900000000000017a9146e0cc2bb07befd8fd3adf98c339871c6fbd51179874c8a00000000000017a9141e32536c1db54052afdde4e6d78081450247508f87c88a00000000000017a914ccc6fa0dbf74edc8ad6d368eb9281282905c4e6d87d78a0000000000001976a914d15061d7b8d23aa5309d1f923a522ad7cc2aa8d288ace08a0000000000001600146b24a38827b81be4a0432a1abf2495f4f11039093e8b00000000000016001452100d53ccb3baca913a6112f6cd641402d772cfd38b00000000000017a914c8242e7076f0c7d49c55c20d2da75d44d23aa9d087e08b0000000000001976a9142f917b1bcd5c0236e088f1c1750d843104ea45cf88acfe8b00000000000017a914e2cbfa089645963a9be32ddeb155572034056ac3870e8c0000000000001976a9143c645f52fab1f3865e6c70d9bbad8c79c17c3eae88ac5f8c0000000000001976a91470a45c2d40a298d6b81349448203924e674bc9af88ac688c000000000000160014990e7b3c62e1f843c94e2888437e8bbf48e543bc708c0000000000001600146ac03818d0004dd16db9f4c4b643a2b939ef09b5038d0000000000001976a914f02ac7df1d6678f1f2830ca1b10957ff9c14fa1388ac3d8d0000000000001600140177603cc352eb95a4f3cfdc7e4bb99ad04f5dff648d0000000000001976a914bdbbba1d605b6c2292fd43312977b01a8c062b4f88ac848d0000000000001600145a05f86d483f3e88dad8eec74020a0b0130ef43a128e0000000000001976a914db5b32f8e1de6f5e1f80e0bf248bc3c5c1fa251f88ac688e0000000000001976a9146c29ab128eb6afa514bd4abbf9ecfa5eef25832188acbe8e00000000000017a9149028fff12a7fd15202fb0dc930071376d8e4448787018f00000000000017a914ce27bdbfa1b6d8299d5dadcb547c7f8307a913f8876a8f0000000000001976a9147d64c6cfef12180ca3d606b02d9d9ac927f47a6b88aca18f00000000000017a9142580b1e182083f967e6be1bb1c594ad7025c11da87e28f00000000000017a9148c718e272f123a18089830fd22a5991d27352a688747900000000000001976a9141edb4025ae2dc89798ce51c32bf8ddd432d6512888ac8d900000000000001976a9148faea69bec7e1c3ba59e0c906c52827228fdfb6988acfa900000000000001976a914741b6fa42b775e0b71fc7e216d22c5a92d7f42d188acbe9100000000000017a914bd245a4162c5e0ac81171be7637448fe40cff80687e0910000000000001976a9143b454d7dc85ea6a520cb5c4cb99c29db1a1d815d88ac0c920000000000001976a9146c2f8f9f734d53034ab9f13201d262377e009d8188ac699200000000000017a91467d00861e07723b7781d72f7b84b4819ddca8b8e87ca9200000000000017a914c7756f7dd2b4c719bdf62e059fa506ab89b446c587d2920000000000001976a9144c28feb67a684a339d65d15bb99a8ff4b939f1fa88ac599300000000000016001408b08ad4549639df594b6fa98845de4f5ab5bd6f61930000000000001976a9149976d9cec2a9fc37b69a757ee1d3bdc5e6277fb088ac069400000000000017a914da2b79b67632417a1376cd2e236c5f5dd0e70683872e940000000000001600143fbbc86b268dafafe369b3f31cf2cee8b2a0c356ae940000000000001600149a6cc388c41e71aa48faff5d26cfbde3f07ae127ef9400000000000017a914de86bdfc3ce8c09c2048b76947e590a8c839b0e287b0950000000000001976a914464b0a979511db0c7b9db32e000521cffc9d961688ace0950000000000001976a914267be7a1d62a83330216115b273cb88ad16073f688ac26960000000000001976a9145ceb10d36de5ac329d3e59628caa4216b0b70a3788ac41960000000000001976a914946ac82f32fa6388f733d4aa4b100a14105c669988ac919600000000000017a9147a077cdeeb01cd6f863a7a81fe65f7104cecfe718797960000000000001976a9148b3dee488acc752da8a65d30afb972bbee3e1cbf88ac409700000000000017a914d7b835fb65394734b538a2485c9c4fca71b965e987699700000000000017a91481cc4d8cfe5dac407c0ec00b0b1a766244d9f74a878b9700000000000017a91434b4895acf198d1d0ad6756f5abcc1f950855e5f87bf970000000000001976a9144264326a36d05f991feda5dc62834f82fcb484a288ac03980000000000001976a914c54a65cc6eb50b46b152b42639db63aeebfdb4c288ac21980000000000001600141eb5a3ae26e27d7a28121d5ca15515be1bb0b0ab2e9800000000000017a914e89a9e2b62e718071f2371230576571aef2f983087379800000000000017a914e1864574d5171635550f79f90f0d577c0616454587c99800000000000017a914a9a2440e3a1aacf12e24e8bf2c429a6c7dcfa73a87329900000000000017a91436b9ef672a5816200e84dbfb157776a32030614a879d9900000000000017a914cde7c01e7c0e6feac58e1c82fa59dd1daed7276e87eb9900000000000017a914de192df58fbe150b16a5291dde4d3fbb47726a6c872f9a0000000000001976a9149e16eff05417021b7ff04012ee5611182f24748388ac7e9a0000000000001976a914ee2a40a2e992ae7a4fbd416b25ff26417a8e13b588ac849a00000000000017a9148b96a51776b3d718d3289a114de53de4ef32abb787889a00000000000017a914b281dcc6d6dec099b1f78f068bcececb4738622287e09a0000000000001976a9146bba25c4794742c8c39785cad79010e0119814c588ac3c9b0000000000001976a91474e4c9e5d7808eef4e77c08fedd2bdef36ed62d288ac639b00000000000017a91425a256efbe3503d17a8f8ae86146d2c727eb5e6c87919c0000000000001976a914f24234bee1092ae186712f2aac14f7f99699ef0c88acd29c0000000000001976a9141c860dc22f5114147c6a463678155bfe6061251f88acf29c0000000000001976a914f6f658d98154338de4751b80829c89415c77e3ec88acff9c0000000000001976a91456c8db8530565118db62e08903654a4fb518d43688ac129d00000000000017a9142c33d31c74fc0508d1286126cd29865b7aaa031e87a79d000000000000160014cf487d6712c368904cec32ad4c4b108385e71813cd9d0000000000001976a914e924a9588ef64be7be466c66daf46e4f7f07886888acd79d0000000000001976a91447d5c10a0206063c2d2b06cfe91cf6d8846e65a688ac079e0000000000001976a914a9bd9cc35e463f42f8713843a6affe9b836c06bf88ac979f00000000000017a914caebf266126fb533934ac9c79d33a7543310504387f69f0000000000001976a9146ac2b2bd640804b462119b7bac24c4a212c76b1288ac16a00000000000001976a914835fc556c765abfb191a522062bab9c8c9e0a0a688ac1ea00000000000001976a914579b79a5f22d517774628fc3024fb523418e25ac88ac25a00000000000001976a9148caedb6b16939b0d00f3c7083724716e2dbf633288ac41a00000000000001976a9147f0b5493be71e95e892f670242d011f2ce92ec1c88ac75a00000000000001976a914d903812dfa5bd7ea21f48540bd51e9749cf6297088ac3aa10000000000001600144eeb6734766403844bc678bb463dfe60dfe6fa9a74a10000000000001976a914075dba2f352aeec52aba89111c93923efa01691588acb0a100000000000017a914db84db54a4bdaf3abba4aa7e7fe6ceab26c4a0b187eaa1000000000000160014997c59dc4a116b6d2050baf9dfd04bc0c3d3631f14a20000000000001976a914bfcbdaeee6a8e422ba2bf82ddc61f86d1232b70188ac19a200000000000017a9141b395adef857c3c705ce5686090b12aed93f07ad872ba20000000000001976a91483e0c40f4b6739893adad96cb0559a173c6fbb9188ac6fa20000000000001600147b4ca3dcc573d52e4e92d37e1f114cd2c1c08c768ea200000000000016001438e4a42abe5f6f3a77b7503a79c92eecb4ee1b0742a30000000000001976a9145975788b2da23f942fd42dd0be70048413463f9f88aca8a30000000000001976a9142d4c422edfbf4d67f42591e7ef1cf2533dde223988ace4a30000000000001976a91484d508cffc566da42a4b21cecbad1288bd7a6a4e88ac13a40000000000001976a9147881f35dc9a4a6a9c0e6758f68796fa58040179688ac35a40000000000001976a914532f5c4ed8970ee1c7f7148c960aeffb3d27af5688ac56a40000000000001976a914afd066ba4c2c63b97cc05dafcb7f5a6d5f0ef1f288ac86a40000000000001976a914e1a7a1110e68db454e7ed874cd02c60cbf31d1df88acc4a40000000000001976a914d3d8d0de31cbe5274680d07c2df4a6be5c432d1788accca40000000000001976a9148e968a044478d0f600b9382c886eaeee45c6c0f888ac44a50000000000001976a914b831f6c03ea03678e8da74fdd1c1581b04bd6e7b88ac65a500000000000017a914ad8f92e62616b325a21e46ed2caccd1083511a87877ba500000000000017a91421d382ad19ab8909ce479659cdeb4d66cf0eb547879da50000000000001976a914eebaddc4db3ebddfeefd3d4235a19df79c52aa2a88ac3aa6000000000000160014303a9b63e9ea5ca52035b913ac176cbdedf6ab27b0a600000000000017a914941416216fe6bec921b88f194d4382d4e46f1d0787cfa600000000000017a914ecef07c7b46ed1c4283824a764c14159f356406d87d2a60000000000001976a9149e107c1e8d02b2e79bd5a8d37dccd796b31ab30488ac26a70000000000001976a9142691ad3413cf9cbca3103a265a5cf9aa1271eeea88ac34a7000000000000160014755baf865f89e3104c31552de1fbf3bff3a3ac2298a70000000000001976a91485a26841088cd7df1e9819af6c39c52ba2294d4988ace5a70000000000001976a914a31141ac31ec6619d8ae71dc539767fb4400d2a088acf3a70000000000001976a91470c3d6f41e1ac40e40056d517e966a5847b74dc188ac1ca80000000000001976a914e145c8628a543bf449b5538983daa4497199e2c988ac2ca80000000000001976a914b966fd1e6126ecb24dfae422ed80fd777301686c88ac43a80000000000001976a91468d7f1e2cc3e3bfaf75b90c8d3809106584d671b88ac4aa800000000000017a914c3908ce91b151cdec5604a2b930f4087add4eb218765a800000000000017a9141c1c103aa1e0cd5b23cd5bad6e0a1c0c57c2243087dba90000000000001600147d2908a3a897c7f4f91b6be1b6d040825b9808b5f8a90000000000001976a9141d457c2d5229d7521b08685b60bf4000f2145e7588ac05aa00000000000017a9145ec26a6930953bef33eea8722459d5af739d392b870aaa00000000000017a914d03418e4b60f444bde7e2aae4d34e964c79d1300874baa0000000000001976a914bcebf952db239a2d927a42c910c1b58ec4b1422688ac6dab0000000000001976a914f7701a462cb150c971ebffd5ea3386bf927efa6b88aca4ab00000000000017a9146ff135eeb71ecdb0089afc4015fd3dc5881257a487b2ab0000000000001976a91431ed73fdb4a4469b0270df67342f72a7b2c90f8b88acbbab00000000000017a91460e1bd9cf83f739cecbd32888f8df328f99d565887d7ab0000000000001600144476e4a319d1541dfcaf5d20ec155111f9d5f20d09ac000000000000160014dde2c5fbacf0c0843cf9e9ae442a08c03e98a56bb3ac00000000000017a91491c903f0f53f5490544bcea7afff52bd2b23c3b687d5ac0000000000001976a9145dfc3b7409002b402e2b1934f0f6a01135b3cc8588ace1ac0000000000001976a914977263fd2e142abf02b2fc47bf21709ceb11012188ac0fad0000000000001600149d6353fe7b727fb7aa7637775805150dba47fa5d2cad0000000000001976a914805ddd284714e435e14d81d11211c75e720dc52688ac3aad0000000000001976a91412f1315394e0d94d325810c9f59103c4777a283a88ac79ad0000000000001976a91475b6bcd1cb5530c8e0005230a7de6152837c203c88acc9ad00000000000017a9149ffe819ae1b9170fa519f2c8a8eba1c40e9599a787dcae00000000000017a914eb201603fac302faee0a5340c02cf6483f876f1487e8ae0000000000001976a9147881f35dc9a4a6a9c0e6758f68796fa58040179688acf2ae0000000000001976a9147dd77555cf8b3fdf575efc07622a36b3221b3ce888ac55af0000000000001976a914c6a43c1124b111cbeb83f6f711747db884d69bca88ac86af00000000000017a914e738399cbcb365ff5f4a05d41a9c584bbeb92a42878daf0000000000001976a91487106557cba3b8ef8072bf2ca8d34d18bb400e8088acaaaf0000000000001976a914271f6f1c16fa6a7a782707b41729f503031c1df488ac82b000000000000016001483de3f9c0994b81acbdd64fedb477cdd3f6e4d1455b100000000000017a914b45da0a9f35966e05a05dcff779a443f81c717498796b10000000000001976a914382c918ce74eb1ad0aa61f9d3248ed7037a884ac88ace7b10000000000001976a91414f25e5864abd42d8e2b07c4f37c6f0628c60dbe88ac76b200000000000017a9148a1f6ed340bdeceb56bb1d6d2e6cab76af6b03c8878eb20000000000001976a9143142bfacb1ce64ecf2f67fcf28bc3c6ecb1aa7b688ac5cb30000000000001976a91453ac18d14b93f0b3bd45049e0ff14d41ffcfebfd88ac6ab30000000000001976a91458d8e6349285a92038d73f9013d78aedd00ff2e388ac8eb30000000000001600144c91073030256bf73e4c574aa9694e0e6c5f142000b40000000000001976a914cfce69627214958e90c536783202d2dfd296e68688ac4cb4000000000000160014f5d8463b189eae24760d39006a56c299bb0b9fdb5fb400000000000017a9148b6083071808e0c933faa074638794f551679c2687abb40000000000001976a9146e0e5666892487545f3d1d72d6bb5a05f78804fe88ac6db500000000000017a9145c3d46c1edca5ecea49f60fcba8994022779fd528777b500000000000017a91451c7db701035480457579cd7747959a744e7b41287bab50000000000001976a9140cb021dda514ba65d47d18a97bb95e31ba4cf11888ace6b500000000000017a914b76fc8b56da376a5a77deeb36aa3441a98db0931873fb60000000000001600148c1821389f02b31bbc68adc4916576c112c52c37eab60000000000001976a91436f1a610f37540e02b723e02d28c1035bc33698888acfbb600000000000017a9141ffffae6e7675cf7e3f57bc856759e9a0345383b8712b70000000000001976a9140e731a088dfbf1a7e746278cc130bfe02ff3f2ee88ac27b700000000000017a9141e810f1806d79f95d80f896eb327fe0c332b9e2f8796b70000000000001976a914d93efab8264bb57c21ef5a088edc722e26fceee388acb9b700000000000016001414178e1a6d6445d7445ac8412d2b44e28b5f5d2fbfb70000000000001976a914097855b627cdfee4abafe31bb326285e6a79d07188ac41b800000000000017a9143fd59ff35eed9586011b8a5b77305e749274ac798734b900000000000017a914d8f5229b5da850144ac4d44ae43b6111d1fbebc387aeba0000000000001976a91428ea56941cd4f2d6459f8436555ee6726db5934788acbeba00000000000017a9143c12aa9986b7dd3aadd465b690287ce9364438398720bb00000000000017a91456c39fcbdafd9d8f5a952ba85ada664618341f7087a7bb00000000000017a914dc520447068c716691663c796b9faec940b9606b87d1bb0000000000001976a9142e7609773df205391e2791398036d1386aba32cd88ac68bc00000000000017a9146168d5b973d955c8486cd0a32d12d3de0f5ce7ba87e3bc0000000000001976a9143be3135bcbdb26a75b77adffd345d0b1391c357e88ace5bd0000000000001976a91412221ec66ca099eb0962449f15ec9f2ad32fd72d88ac6abe0000000000001976a91457f883ffbc0d0e1dfaf7c9ca73e5a3045edd6cb588ac6fbe0000000000001976a914eb4bfad180fafcdf20e4f2967bbb9c06e8c20d8488ac2fbf0000000000001976a914b19ec91bee33585ff9a112d3bd3a7c0479a738e488ac68bf000000000000160014653063642a3d2ac4c0f3c66222be98680a56449169c00000000000001976a9141f1076970c8679ac65b912f4f7644d145cecf77688aca6c00000000000001976a91453776e0807b0caf6b4c836dfa09ada9ca081ae5888ac61c100000000000017a9145ec5b9eb887ecce4c4c5d66cbff5ad9155b6741087b7c10000000000001976a914f4adbef27bd1cda22b00cacb50662c2405231d1888ac35c200000000000017a914ba1d75b1e93f9f9847815ffd3ca49befdd9aecf08777c200000000000016001457f0834bb47e0c981cee5ea5120cd4233aa12185b6c20000000000001976a91413a111370db75586e8b3b46280e166373d822fdb88ac1fc300000000000017a914d83f8289f4bac0bf12e156af36e07a7dc4f5d2e5876ec30000000000001976a9146d7e71d52279e8392a87ad8821ebdeb44cef221c88acc9c30000000000001976a91416cccbac5da08c768bf5c0d2ecf9704abcc9b8a088acd5c40000000000001976a9149789b52ab9d33d07a0401af714d7d57ea203607f88ac9ac50000000000001976a9143b6923ad0b6fb0495c2e06e1099c0d81e5f54ff188acaac50000000000001600145ee5b18e304bef1166d7d7d9041880fe57edc955cdc5000000000000160014405bf306d6b1114cf5a9a8cb25cd76bd2efe7a23d8c600000000000017a91416605fe17f278551a373bc612e99496c9ef91fb88724c80000000000001976a914027a11c72d432f6f840240bbfb7c823f6ca7037188ac35c800000000000017a9148199211cfcfdb2d0af46f97251ce4b419db1343887ffc90000000000001976a914cd2e316c4cd3c3570cf624bf1fb26a7ebee886e088ac02ca00000000000017a91422a44734df5307562902de2936ee5c7d4d3235228782ca00000000000017a9141e3e3654aff5f8a85efac46156aa90fcb567349987d8ca0000000000001976a9146680ba8c703252f193974e85ea6ecea33c22a2fb88ac1ccb00000000000017a91424b551513569eb814e0c834ca00ced42f3918b1d8750cb00000000000017a914431c3479da8d2ed9dcf74f7868a0100f89754998875fcb00000000000017a914f3f0faac1ff08ef3142311160fcf43d652dc98f8878acb00000000000016001427fd798dafe83e7dd3cf2bb8e5013b7a99da00daf1cb00000000000017a91424d0f10f7d46f061e3e45865719d6bf9e9cd43d48711cc0000000000001976a914475c494754e58befe5766e2a285015b5bd297e6488ac1ccc0000000000001976a914e8252c4c761b7c542c01c272d5e01dcfd8699f5488ac8ecc00000000000017a914a210a769050be473c471b43eef34406113228bd187d5cc00000000000017a914b5b6e4f9250fe2a7cb4c2c1edc7185f97822d06c87dbcc0000000000001600143220613ca0a2f0dc728a76b38a1f3bbacd5ce15a16cd000000000000160014059976ee2ce1e6de2c77323b6903d28a6c560e8b2dcd00000000000017a9147b5f8eecd4af2cc8b1732bd929e5a3c69d0c1aa7872ecd0000000000001976a9147307a9926203e36c6f104bba6f9c3fa797a5305c88ac30cd00000000000016001479c0ddd631e8f2a7dc9ed1f26eca25c8a5c298ee3ace0000000000001976a91475205d026a83382ac999422882f348439ce19b9688ac7bcf0000000000001976a9145b25fa4bc7db202b755c33a3d49d74da57afc9ba88aca5cf0000000000001976a914110ba351d196f46f3814e718505a44ea72009ca588ac15d0000000000000160014fc2b2eeaab1821ac42beaeaf26dd779c2b76f18e40d00000000000001976a914f6c6f58f0bd2365766d544bc50148f6d7779a1dc88ac74d00000000000001976a914962338be73ad790d932bde720a260dad4a64585988acf7d00000000000001976a91426bf0e12c7e1483c34218b1d7d393489fa95f51988ac17d10000000000001976a91445819f80703a7496658bca6154869ca3109d358288ac6ed1000000000000160014527411e9460903a5ca532121620a1886696f5e7b84d10000000000001976a9149e6693d3d511150630bc7f0ce802810e89043d9488acd2d10000000000001976a9143a6e39e3b989e1ea84e174a65343c55502addfe488acedd100000000000017a914ba7516769d5a2f9cde19d7053c2a6904c18a2788876bd20000000000001976a914285afd5f5d3a957a997777d2afbf3229152b0a4288ac6fd20000000000001976a914501f01422f9b1d6b07c56449943e14945c538a5188ac67d30000000000001976a914ac0b83e4efb6e2786b41c5953c84465c46c78c6d88aca4d3000000000000160014c0993f10e9a575d022f047f17d4f522e0f1c7f5b3dd4000000000000220020909fee89f90c020bcc725bf46f731ce9eb81d7cf3a959c5ddfe2309c820dc069fad40000000000001976a9141d2610961a1be5cd3fb4e94a83f4e04403d47dab88ac59d50000000000001976a914f60fe91ee57ba73d0c52a1e1d24db46cda6d866e88acc7d50000000000001976a91496f7c327ab163a1d12838b3b8c1956ef16a8dd8b88acd4d50000000000001976a91413529327b42f9232da06717b581c3590de17a05a88ace1d50000000000001976a914c8f129c3ee1836a52d2ec8ca846a5a383f6b5b6688acf9d50000000000001976a914acf557e32cd25f1abf6bd580a8aed4627aeeba5888acb8d600000000000017a914bc61774bfaa7789c5151a1a29beffe804066aa4787ecd60000000000001976a91438387702c8daf67192db3c4eb3562f15f7152a1f88ac33d70000000000001976a9146b22913351a6990c7c1bcfeeee0f557daf2e580188ac9dd70000000000001976a914e9519e29cc1f7165ba43be7f7e380164bf4cdc9188acd9d80000000000001976a9149a3a167fbaae45b5127cd89ab9976375c0e3003b88acecd800000000000017a9144eba3456a3580300ca318a909cc5a5a9c89f06ac87f3d8000000000000160014aca4dd4d7aa85f0042ceb5dc6adc0b29dd4ee3d315d900000000000017a9143c2940cedf6e5adaa14f663244a13f44d946454d875ed90000000000001976a91496dafe837c5ec4faee7e30fa10296af2d824602d88ac68d900000000000017a914edad7061fddfa5702e877af1c0178b1e946a49c6879fd90000000000001976a914aae3d3b38f446c7053707a4476dbc14f714d173588ac3bda0000000000001976a9143cda198b62bc3127bafc679586ad78cea36f5cc288acc9da00000000000017a9144d2ff3968e3a6e324a3d857846270a6dc097eb1087cddb0000000000001976a91404d872ca9c426629e6c8e353e4be8f15ddcec02f88ac1bdc0000000000001976a914bb28711339a6b5c1ba570ccf3679f8c32cfb54c888ac46dc00000000000017a9146bece365e62018a5c123e037cfd6bba6cfb75f9e8750dc0000000000001976a91439d8541c8cc1acd814e668b16a6bff7ee9e34c4788ac4cdd00000000000017a91485ebb3949b1f5c8f0a63434f370af66bf2799cc08739de0000000000001976a9140ee5b727ac5afa6c4510abb3d1d61d0a10055dd688ac84de0000000000001976a914e12d6ac4f3a22d4f72b4e1ddd7ab479792b9a96a88ac72df0000000000001976a9146c7508936358dfef9bd1bba6dbfcaa9fd14d9c8788ac7edf0000000000001976a914d6e35034f5a6c8f73617f4c4682c6c0c9ff7ed0588ac76e000000000000016001440ea2a91cc8593bb3f573c5f8e2a6794d56b2a3171e20000000000001976a914b38f30729d0bdb7148107c767546b9671110211e88ace4e30000000000001976a9148bb18e7e2994b5ca268e81295fc9260c6fd1444288acf3e30000000000001976a91409a4f7b75090301841f8cc98309f08e5f55885b988acfde30000000000001976a914193c83e6e18cbc5913531e7fa968f70aba06064488ace9e40000000000001976a914a1ed17bf31fd6832028e04caffcd04af403c1d9a88acf2e500000000000017a914e77b05d55fb3d1e6c3da7b8aa9e370e75d4ca7ad8706e600000000000017a91449c90e390823a7439dbed2405fe23a5760e748b687f3e600000000000017a91450ffc46b29f5be5709cebef9090b0499d407396687dbe700000000000016001433a8eefa562f2ed498038c7c5012f149618cee71ebe800000000000017a914b53f553e94451f6ed1b99a7cfb635ed74924e2b68704e90000000000001976a9147620a87e3eaf9c796ea08fc9ce7a44ce4ea13e8288ac4fe90000000000001976a914aab512fdaf66b3bf2c96cf958507d348d0eb3aa988acd0e900000000000017a914a212545a8d53d03975b8f5c1192dd9c8a4190e15875feb0000000000001976a914eb8b4ed36bdf9fed34219c68c20281fe4f3ee33988acdeec00000000000017a914c12779a87cb51c389127618d08c0f64d1e274600871eed0000000000001976a9149fe51b23386e1a952bd5e40a7552d2653712642388ac74ee0000000000001976a9148d092f3bc4adeb0d307511ea442d1ba8bd26c1db88ac16f00000000000001976a914d89e9ad9dac23864a67375cacdc5e953d0f42b5a88acc2f00000000000001976a9142477827d5032999a08d29bd44a1057388591bd4288acc0f10000000000001976a914c6f7961884e6eb78f1342167e72684587bb2592288acc9f100000000000017a91440b72d5662457657466532ecb12deaa0681c0f98872cf20000000000001976a914f1cf954062f2009a8913d38fe2b498752432218688ac98f20000000000001976a9149da00a038f16c269615bdc3aa2dc8289ada48bc588acbaf200000000000017a914ea539da0169bd08e6ec4c72d511ffb21a0e8fb198782f30000000000001976a914e652d1296478a730eb98cd6cd8d786491aec808f88ac98f30000000000001976a914c503a3771c2973a4cc30fc735326ff34566b909088acc9f300000000000017a914da3700bdcd6a6e2a65a878a1a8682053527f9ecf8729f40000000000001976a914ed983ca14ddb72a1bbaf95201502920ce80b260688ac5cf500000000000017a914028fada267a4467076748d2594b7dd705ffe2eb887fcf60000000000001976a9140478317e487a6537f0301dade267c20a2bc2e39388ac26f70000000000001976a91462c3d97233b7607f628e94c095369a2ac998f60888ac2af70000000000001976a914afb71af6ac29280b22030624ad43783d406d46b588accbf70000000000001976a914361afc16234f0e335bb7a4f652a422da19686dbc88acedf80000000000001976a91434f1696db96cc64f60c918e107b3feaf832a0ea988ac44f90000000000001976a914438261b94f18dcf4aa196b445c0e0d39d66d3c4f88ac43fa0000000000001976a914ceada64a0405ac52797916280ecd4b84ef6d694688ac54fa00000000000016001466280c3302ed40b47be568bcaf9dcc94f44d818ab7fa000000000000160014f3fe69cd10be6182f3f339a17de62917c6bceddfd3fa0000000000001976a9144e3ccca53eb6e634c36e2ae6dc1fd02d140f356688acdbfa00000000000017a91447facaa512073cc2b86cc5f26a0bb0b1fb26e2b987f7fa0000000000001976a914a4832c93d5420d9786e0a53a66934c00c2a01df488ac2efb0000000000001976a914509328fb40d39d5f7378694edbcb85b60bf017a988ac4ffb0000000000001976a914ced5a0b696b0d3c3681e4f8238b09994d55bc9e588acf6fb0000000000001976a9144d36991aa4b7304f41b5fe932067b1f73d72d56788ac43fc00000000000017a914c473a30355d64bc984699f534dfd9c25b2d07d2487affc0000000000001976a9142dfc5190c86c217d88d31e0dd6b3da9d409fb58388acc2fc00000000000017a9140a5d42b522c036ed365f99ad672e7a0dc6ff5b7487e4fc0000000000001976a9148df84122b17decfb332a280bf302e0b006c0926788acd9fe00000000000017a914c28bdf0913db1a89dea2f67d0c415bccc738e6638701ff0000000000001976a9142d2b4de94345323b7fba12e21e5ac38c1a024f4188ac9700010000000000160014c79a22957716d4cd48f98d5d5dfc8c75dd468f6d2d01010000000000160014094622ed16b815904097c1df28f9f8c03b70d7434c0201000000000017a9140c9ade4654497de3110def8043baab6e959ede6f87820201000000000017a9140b882f4752555fa595b62c017ff87f641150c34587a20201000000000017a914f7e7814852ad957001a04915bc5a3086c510d762875b0301000000000017a914ebd3d5789e19cf861fc9b14f08520227261df12487dc030100000000001976a914343d3b653e4c284369e923279ac1928b3c679bc288ace80301000000000016001495c39c3fd9acbacbc5d1781b26ca56daaa1ee9d825040100000000001976a91403bb9f160b045bc30b3140a3c0f7088035e4facd88ac4804010000000000220020f8ca6408bca4d72aa1f9d0bb64db208bc826f72e872e63953c07e157d31ea3d4ae040100000000001976a91451ac1b086b8546e3660104c697a88412e0d8594f88ac0a0501000000000017a9145afee9926a85926164b096ed14694ea50aaf041b87c80501000000000017a9144533dc262ad83f5192733f784153b942bcd77226870b070100000000001976a91489bc28d319db3ae3e888cd75336c54f04ba5b0ad88ac740801000000000017a9148401ced724c0cf3705763d71302632b89147b1b7878e080100000000001976a9147ce38391cb81f081f5616b6c752d2a14f55f1c5d88ac91080100000000001976a91410c7f6d564152702bd67d4cb38290f92a392fea688acf90801000000000017a9141ec24ed1a94c575703cf0bd068f74811e697d4798713090100000000001976a9145bc1accfdb6fa14b1e4b2c5062f141c055c5f4c188ac5b090100000000001600146cba22d5c096872d43b711ea465f6810205ab9b0e80a0100000000001976a914d0454c13256d046a715b59b7f816d113749f122588acf60a01000000000017a9143bc8eda252d6b7ce0a41ddbc4cb166f42a0fb14f877a0c0100000000001976a91404606feb711e8bb81403279db68b112e16050d9188ac840d01000000000017a9147fcae71c6681c69c6517868be210a2e525b0d660878a0d010000000000160014bf79a4654f20645ab3791b14aeb3f6f1072e111afa1001000000000017a914e97d42ccbbaf32374096bccb8bf71d865858222e8737110100000000001976a91467b2daf0e25312fbec4e30f67e06164a805ab4c888acf71101000000000017a914089145c4a523b2a7e41e2d90adb26c12e529945b87cf1201000000000017a9145cf0bbc107cf84959ae9c887ae24a866bfd276f687f01201000000000017a914be3faf1b4c9945c9b6855c6b049dc55452d94263879d130100000000001976a91484f4b772976659c9df91c8ce6f16696858e6999188aceb130100000000001976a9147e406e6e3ac215cbe334026b5c14931e6552c03888acac140100000000001976a9140f475d3e8d96ca88382e6a3147a26a5010e9b18688acc0150100000000001976a91449c7e5cb6b7270e0ef6f14f1a1ff984fb470a45d88ac2c1601000000000017a91428544df95dac588281afc00c18e0a94b7528fdfe8747170100000000001976a914a33c5ef31d479f2cd8e2617be76560e1f7497f4e88ac4d170100000000001976a9148739a24e801dfecf45b6d7ef67069792acb9c6b588ace918010000000000160014e2fd61d8678b3de2989a00b1262332bddd9cb01fb01a0100000000001976a914c874b611ba889f851fba747d87ab8b2c7c7dbbb388ac471e0100000000001976a91413e2a33a569ab517643e1ba35ca1289abaa2842c88ace11e0100000000001976a914c998e7ff04a2c054b397a7fab3c8ec5bafdc4df888ace71e0100000000001976a914710af1ce2e9685dafe6365e74ff79f5ff7e6327588ac9c1f01000000000017a91459b62d778769a35fdb52a3ccef1071edee86a8e9870f2001000000000017a9142c5eb08ea369931ae55efaec149476527f7e252b8715200100000000001976a9149784fc2586842eb46fc935932b6507768172da3c88ac87240100000000001600144ac6974592ce2e0f45bb5c4cf6118d4deadcbdd2d72401000000000017a914d79a3c96b74051286adb9000f9deb8f7e65fc977871f2501000000000017a914b238c7d021bea9310d006e885319ad82de603ede87a7270100000000001976a9147a50c5c0b06d136dd4b02c78488799f8c12cfe4988acfd27010000000000160014ef536b959bb4cf2f619c09f00c98eadc86f542d4a52801000000000017a914eda52fe8517efe6e7303d28af9fb0d37d10267998743290100000000001976a914c7d865b11ca00eb842d472d42470e114e76f094988acf3290100000000001976a91464ffbb42d7eb3f355a427a010a4c1c335bfe14b588ac102a01000000000017a9142dc64590541522b070d03e5e9c81d4b9326a484a87412a0100000000001976a9146b7de9aa6785f3ecbfa6b6cc51b4c99b719d5dda88ac432a01000000000017a914dc3d933a45b1185136d0dd944420484c1cb57d76877d2a01000000000017a9144ac908b4690d72d79704d6a051b8b1e4ce33d0b7877c2b0100000000001976a9143d09552977f682999a70c127d7118010e8699fcb88aca32b01000000000017a9147fcae71c6681c69c6517868be210a2e525b0d66087d52b0100000000001976a914837b4621d20a610fc9827a273c2fde6ad71c970688ac592d0100000000001976a914d15fa275c0ae6dd9391eaf802c426b831c7d2aa088ac682e01000000000017a914f3961c4a1d5b19a9018aff67271d51c4e392e3b587872e0100000000001976a9142be22ceb4382faef46a3a7e5b84526c81cc8c2e588acf32e0100000000001976a91411f3ad7243d31a2888faa79c7434698df2107bd588acde2f0100000000001976a914308fa701ceb8de82e638377722107780b37c5bfe88ac9e300100000000001976a914fb248d991ed504a79f6771f0f8bb8c711aa10cfa88ac24310100000000001976a9147c11bd7052759631398aa25365d6514fb14d9e5b88aca53101000000000017a914cd18ac10e6adecdfcdabb9f46836417a74bb4a568773320100000000001976a914c00811d9952bb8f4e0ca3604904990bc6bc9b20d88acee320100000000001976a91459346ba91ff328581571904482c7ae2653a7e8f188ac98330100000000001976a9140050225c06636c3ef9d0b43102bce46542f25a0888ac0f3401000000000017a914626940e1c97607c2dd2adace8137c06a39592b4a87f53701000000000017a914a9305724726db15a9d5141471a4dd385ec69baf6874d3a0100000000001976a914fdcb73a48683c7b38aaa6dcbd0e3b038dd188bf788accd3c0100000000001976a914c8d69ce1112d5753de16bebd559f806aa95fc8ed88ac2d3d010000000000160014c5065d248adec5bcbf91f8224b0f95b1f90f05cba53d01000000000017a914a6ab01b3684c6503e0b25bc3a811ecd9b36c0a8d87423e01000000000017a914aa9838f4b856b689501f383dc3d21449b263154587d33e01000000000017a914f5dd9d69c5fd71d9b419e365e8be564f42d2233087963f01000000000017a91478448c2eee280f8470cb6ded458c7b7da461480e87b73f010000000000160014a9130a896352af3c4a2583bfb547811c07af3ef26d420100000000001976a914067f514e39fd8d57dc4fb272c1b2d48166e5a89d88acea4201000000000017a914a8c318e0cd533d6f406d7986a997da11d93c2e9087a4430100000000001976a91455209b14b751789e3d3a37a5a500a41e5a1096ab88acf84301000000000017a914dee604a395751ced7df57aeec9d24ad6444cfb4587a2450100000000001976a9147442d125da4400c242e1d68ff3c75719b184def488acc5450100000000001976a9144535c7c2dc1fb473c39c5b7387e04577272d757088acf94501000000000017a914d92ce2490f3e5d4194e236ea96749da8af74946187054601000000000017a91464bfb3254fdde7550b780b77fb6ab419c0a9286387f9460100000000001976a9141244a6aa33f69d0afbe7b0862d72f0632d15686388ac924a0100000000001976a914aaf5aff7222cdbd99b43cc74185bc8ab910f564d88acba4b010000000000160014eaad60f405348074c52135ef3b28045d5fcfefc02d4c0100000000001976a91477ef004db3b7e7494cdb7b62d8bbd0ed9e29c6ad88ac394c0100000000001976a9145853a3afb7490993308f86969cb0332c144d1a4888ac814c0100000000001600145fcbc769660a5a647122c338207c4a150dfca40d4e4d0100000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac484f0100000000001976a91485d1ca3e8d663ec0cc55009622e60526c5ea559b88acac510100000000001976a914bbf5fb7628d5cb34aa54dc8cb336d2352299e7ee88acc65101000000000017a914c937b4d3a6bd2df8879be06d820c18f13d275c19873d5301000000000017a9140d11282e14369b00eac8297ea2b85bf9fdaae4e687d7530100000000001976a9149945a25fc1024adcb54eb6e60477e1ec68225fab88ac79540100000000001976a9146c011e04e62d64c77b4c647d5ed7bfb49be95d0d88ac64560100000000001976a914962cb207fe3b6188babc93da44539d3b17d71a0e88ac93560100000000001976a914f5888a257e78abaa5c142034f22f86eb698f372388acd457010000000000160014a6f2e0afa2087abd8c126458849e4db4445c957ed75901000000000017a9143436b167504bbacf1db9aef602e1848bc64bfee387285a0100000000001976a914d517dedc7f4237e7d1b57cba6fa708be79909eca88acaf5b01000000000017a914f04c87f0d99d01ca33e0ca0f5b907346346570fd87cc5b01000000000017a914cdeb95851d02649f6576f589d4c67b5a1ffcf969878d5e01000000000016001412ee817b96c9525641b00150860d22511a573a6b095f01000000000017a914d85891317afc09e8b1a515dfd88d64f3b81caa3087e55f01000000000017a91421c6a7f2b82e8a13bfe3c6f1cdc9db9db067fc6387ac600100000000001976a914d536f123197cf5732eda370a2fab1f719e0c461c88ac2e6101000000000017a9149d2342b5c1258fe0fdb0456e5e6455d50366580287ff620100000000001976a91401b3845fc255f4b9b4cdca076b0e2fceb1e4b6fd88ac2b63010000000000160014da54b9d61b1ec9703fc2c1b3fa14aa2614cbebde46630100000000001976a914ae65a5c74080fd69f15367617c1ef61ad7dac2b588acd96401000000000017a91456428528ac48208a565b31a468d1b81f353f58b687f8640100000000001976a914c8e8d39ced4af0100c94137b8d863b412b4fd44a88ace4650100000000001600149c35d810dd0469d30ee8288cd962d6a8f08ad4b4f2660100000000001976a9148b2f3597d0f5b463afc086355bf6c92ab602e3fe88ac816801000000000017a9145cff5671a5efc148ae1b6bd29a8bb712aea08a17875b690100000000001976a91496c764ca3d2993daadb5762b86a13fb6a1fc104a88aca4690100000000001976a914b0b0d43845941b4087acc072335affdc0403b70988acbc6901000000000017a914fd8c8728db8d34c2dc90f107f5eca935d724be0287236a010000000000160014e19114140beb00f30627532536659160968d7eec9d6a01000000000017a914cc01666116148f2f2be08b774bea9a525a164075874a710100000000001976a914a28fbb5d8562e8c0d9348a861c3f52fa18696b0a88acdd710100000000001976a914f3013b592619a355315aba1b1dfa1c2b33414d6d88acbd720100000000001976a91493eb87cd7590caf21f0dd86886fb3867d98940b688acfd7201000000000016001451be1c0a5d29add07a6b984bfc3f73ede5a33dc213730100000000001976a91419028a636934d8de5b61f71da8f46a721c02575588ac1c7301000000000017a914d92ce2490f3e5d4194e236ea96749da8af749461870d7501000000000017a91459973c9e1c6c94e1019bfd91c9eb22e88838eb958778750100000000001976a9140e6a4746c47cc440798839c27ea15187f3ad21ba88ac59770100000000001976a914e4498c9802c38fe0f2d39d9d3320b9de195b648d88ac8578010000000000160014c2e7bc4b68922cea46165d11f10a5c146e906f2a657901000000000017a914df5a31d89d9c58e48478ede33dcc55ea28b8006287437a01000000000017a9144f459ea4ff5f8815ebc66556fe215199127654be87fd7a01000000000017a9144e8a7405d35ecc4626a1e5739992e9c9d19ab51387407b0100000000001976a9149263f93fe930966bf068856834d9163fed8c3af488ac387c01000000000017a91482ea82c9f2bf1931c90397621e74bed4483127d1873c7d01000000000016001433b7e656e7b462cc62fe14dd0a9ceddf8c88864a267e0100000000001976a91480a0f06c8686666f84fa79567926cbbc40e8623a88acb5800100000000001976a914b1696c0c5f8094ce1ec2f4cc92657d21ea0cf94288acfc8101000000000017a914f612d0321fe41ee855eacf66e1001a27e21356b8872d840100000000001976a91498e76458a7e7840c95d291fc5c93ed256fdda94288ac8b8501000000000017a9149519046f2fd11fd22674ce62d52670fc194fd38587b285010000000000160014e8525ceddb2f5ed329c0693f9cb38e614eecab9c5d860100000000001976a914ae248d3c8908082e3a2ea3c14753681cf300479488ac74860100000000001976a91470a6ff7c6fc549b1f537ff400be982b4d21b41dc88ac60880100000000001976a914cbb90c539161a674670a6d517b8dc81a450c560b88ac7e890100000000001976a914e7636df0743368603592ee7cbb8056f2aca1481888ac2d8b0100000000001976a91494689d9c675d129da09b0ca50b7b5cfee7442b7188ac378d0100000000001976a9144e229bdc13c46727960313059a353242a1d4750c88ac6d8f01000000000017a9142dd415c44a32418739d91f5932298072b122a43f8727910100000000001976a914c0b3c980eec4075a12148335243076c29a43941088ac3d9101000000000017a9143c576bea1faab049959e2c588586c3276d7c9dbf8707920100000000001976a914a06a971f762f7702dba17717c1f18cfd0268cebb88ac7a920100000000001976a91475855a3fd02b4a757d92a24776c100dce2441bc388ac67940100000000001976a9143b6e03328b2e7e35a6ce096a9aaea008116f600388ac21950100000000001976a914699fe9728762e0296ea5c8f91ee32fdbf72d7fd788aced950100000000001976a9142bb99dc1faa2fdb65a4d21901b9d8a2e9dd4588188ac28960100000000001976a914b10e6e84856056c72bb42b86b14e92815d162d2a88acb8960100000000001976a9140b4cf557284b5d043bd23c7fc26be21a189e871488acd5960100000000001976a9147bce38bc9cb4493b04a5c84c36af98d530d67ec388acb897010000000000160014c9e5c0243c9baf01cf6c1ff1de2cdc5bc69e711cde970100000000001976a914f0a426b3180fb5492325c48f8f953be7632a695e88acfa9801000000000016001427fd51e0a302a9dc7ae2dcf163f6af192fad6888ef9b01000000000017a9145b4da45046385f682de0459bae663e6c98008a2e87919e0100000000001976a9140ab34693016479eefd0e8bfaaf8562b2d8a04eba88ac5fa00100000000001976a914c026518cbcc5c9ae703ccaef47804b41037985b488ac68a0010000000000160014a63c1df6d8b48314f2ea4b6e70734970d58942613da10100000000001976a9142e7780d735fd0c705a5cd840f4a6c94a4235b16288ac6ba20100000000001976a914cae6067c8d06beafd605d8275f0f68ee81bd6f3588ac72a201000000000017a91422aaaa36467a4eed46a0d1edb4842bdb5f9d76bc874ea301000000000017a91493cdd4e58cc2d0f2dbbc1d553b25a00d1d7fd430875fa301000000000017a914dd0251b1717a400aad2ca0f43bf09759c02de16a87a2a30100000000001976a914aafc8a3f9af70a85e2d100b5f908d939fa2920e288acf9a30100000000001600143623a290e4138915da472c371381e230cd5d39e72ea40100000000001976a91484eee8e1a660fc8aaf9da17cd1222a03b36c9d9b88ac79a40100000000001976a9143c438de8cd957dee818c680cae86299a4483b35788acd7a50100000000001976a914779a183318b9116c413e87f33cd47c056698af6588acf3a50100000000001976a914e8059382fd90142f63554891bea187877f23dd2e88ac74a60100000000001976a914b8b05947b2e88d9dbf06e2592fc91215d1afdd9c88ac8da60100000000001976a914872dbb366e1bc5bda8f2a0bc81ebd470ee615b5c88acc3a70100000000001976a91478869a4017735d72431a7a785da2e988453fe43188ac7dac0100000000001976a9140de726fe243eba0c96969487ccc3aac46c6a64b988aca5ac010000000000160014d6a2e6a9d625477f39041520e67980555661faf5eead0100000000001976a91438b5a97c3b6b357627d568ddb9492d822d8ce93988ac35af01000000000016001406191b195b944f2abebf5a5b45b04ab5a29158dcf9b00100000000001976a914791755213b60ae77c28be28d2a3e509d7063f9e788acc6b101000000000017a91438b445671ae12e3af828dca9862626afa87284cb8700b30100000000001976a914d3ceb67325533369717de445ad262394f261cd9688ac94b401000000000017a914b4e1af873091d8b7692458b1201de65f13a0c09e8744b5010000000000160014d0f4abf36ef879cf99147803cab4ff3109f29a3e8eb601000000000017a914bc8fcf44a22ee4fb141fff6aba36a2ac95bfc09587d7b70100000000001976a91469932e4311579a73656bc97ba136ec12aefb939988ac49bb0100000000001976a9146d30cd28179937237a8937db485c38a2bd79d17388ac02bc0100000000001976a914617cbe7b7024f266ec819d28f4919676b963604b88ac9fbc0100000000001976a914270f079d32726c6412b1c8e04699644f0d5f3ac488acc1bc0100000000001976a9142769d723fe53046e2c9ae6cfc9cc361e61808d4e88ace6bd0100000000001976a91486c72905a544c7948185ee58b3f6ee257972e25e88ac1bbe0100000000001976a9149e420429fe79f09226dd6f69bd8ca7a0fa04796a88acf1be0100000000001976a9143b1f50d54c729c6089ee413f5916538e51fa98a288acadbf010000000000160014db249e7b0e6d20c9536c7bd6a170e27b63aea386b1bf0100000000001976a914e7e6986fd955e6d52b5a42e1aeaea529ad099e5888ac4bc00100000000001976a9143d2a8bcd3bdf95965776883b18f9b81a8c3c52eb88ac3fc10100000000001976a914985693ba84f172de410d0588fa2b4fced1699e1388ac81c401000000000017a914b744cb881c414a91f5cc2cae9c6510437e9bbfa787cfc701000000000017a91455cc10a97138b0f29b5016664fe638d30e9d51ac875dc901000000000017a914fc12d6ea0f111d1275fce0dad78e848c6814f4a58778ca0100000000001976a914f932a38402f30257e462ed19d6cea7c600c3052488aca6cb0100000000001976a914084239d2c7ca99fc14fa6e05f851f6ad9beacd4a88ac28cd01000000000017a91448d4532a1227da586e9e0f824b9ba5e8568178e187b1d00100000000001976a91441244485adf00778bba098e70c313e97f01cfe4488acd9d00100000000001976a9146dce91060c47fb617b65b8c67eac67d75832ea9a88ac58d10100000000001976a914d41545c679917d268c398a53689d9cbfc78c3b0488ac61d1010000000000160014a2166e58d056cdd3313e1df94bfa4527f466135c16d301000000000017a914901d2b045eddfbbcd932a8dc58121b1f238181aa8736d301000000000017a91426f9b253d5838e7c11174e402fded3ee07bd537d8783d30100000000001976a914001587869cfd94d1ec52b01d4abc8587fe09469d88acacd30100000000001976a91412dfb0150938921642594349aabe0dc30bc26f6388acd5d30100000000001976a914cd581efd38b4143901a89fc7ce3be6ced3ca429588ac0fd40100000000001976a914260d719fef7d7d6c053ede5d55595a91ace8960288ac71d701000000000017a91482633dc487efb5bad97b98aa186e9578c24066428736d80100000000001976a91455352d7f6efd7eaab9e593d4fb806abf45a539ce88acfed80100000000001976a91484c34ef6a3adaae1d21105c176d82736c577fa6188acc2da0100000000001976a914018d4ffbd343ff731a2f8fcf601210d8af4cf86988acc1db0100000000001976a9143df3b4b299ff0be93b7bd6083251b8642546781288ace8db0100000000001976a91437b687d773cdac3b7c3398c15344a28f0eff717788ace7dd0100000000001976a914ae387e5a751864d80bf1c45545b56d24c8972e4088ace8dd0100000000001976a914fcfe920a5707be7a11ca9c4ca576b8431115a77088ac75e00100000000001976a914704bd07dfcc8c037e2c805b2b97e5fc902f04e8c88ac20e10100000000001976a914f81e809f20e4defbfaaf2290891162788358793c88ac6be30100000000001976a914dc87e9192adf09a0fe1161a6bbab521fcb69c52788ac85e401000000000017a914e8eaf4f2fce01a3e60b7bf28d80976d174fc5cc887c3e501000000000017a9146ba8db90cb32bf9de2801d1f5e7ed451059dfe328758e60100000000001976a914bb93327dcfd7f340bb4010b70c114300447a004688acc0e70100000000001976a91452ea228b711d28e820773df6dc14cd2a57e96ce288ac4ee80100000000001976a9143396219def845125938940d0e7dc4ca42b3b0dd888ac00ea0100000000001976a914a9f8c95693aaa01b9e7253938cc8d4756da8be0b88ac5dea010000000000160014a8f0d62a7854786a78c7e84ed58ee0851ddd3e8067ec010000000000160014e20d5335061a5338ddbf8f9170b7134b38775a64d7ec0100000000001976a91452f4d309e171520ff0bbc11a4a0fd0d3eb50cb5888ac58ee01000000000017a914138bcd84e3b1ff2a4021c19218a15374081740a087b3f00100000000001976a9141a6e5fadededa830edd193ec87fb902e3a05bb5688ace2f001000000000017a9146dc574cd728c945efaae76d832378bd2233fa3d487d7f101000000000017a914a1e66c16dcede12e6550439d3eb5e535a1975eaf87a2f30100000000001976a9148bf4937738adc66be4ebdba5c8adfc1d811e103688aca3f30100000000001976a91409077b362d0c69566ccb2c3e2327b60e19d5f5eb88acd4f30100000000001976a9147c11bd7052759631398aa25365d6514fb14d9e5b88ac06f70100000000001976a914838f577f79eb0b9798f2174f40659344c30e37e688aceaf9010000000000160014564f48cd3bb5b9ab24e0a771e915dc4903e4949f3dfe01000000000017a914667392ca7ee35cf6475ed24ef31012f5e0993543879bfe01000000000017a91420762a35251e627d9ec9ef57471004821e1e5d6287dafe0100000000001976a914fedb18a9f8dd815c3b9a197184679bec81f529cc88ac02000200000000001600141db52430177978398aa1118ef4aec9537a3505cdf70002000000000017a9146712036b228fb3691432ed2696704ba52eda12a98784030200000000001976a9146dea4f06ab7388170eff8bbfe13527072f67ddc588ac91040200000000001976a9144ea68ce01bd8a7f40000b07242c620803cc9089d88aca70a0200000000001976a914438c1ee2e331d38a34d94fde0c97c9143f2db4e888acdf0b02000000000017a914af4b5fd4ef40a887f4e2c7b579b64a58ed8062b687140c0200000000001976a91489b35427e712d36ffba15c9d548178e6b20b728488ac450e02000000000017a914f057c91c7be465a492556a982b2944adc280e54b878f0f0200000000001976a914bff5847ba715545b12a3d3ef0b2169f51998ac7c88acf7100200000000001976a914f6bff1b488b03f89f4dab68fcd1dadd81d5550b988acc9150200000000001976a914d465b643a1c1b54542e628c19cc73cbadd65a16688ac421602000000000017a91412a34004e28b32d0afd5805af9fde867ba3e59f987e2160200000000001976a914c42e1179997a76f900e8bc36cdb3c47658e53b8b88ac651702000000000016001436785830191992f4deae2991a30acd0c70e458dfd0170200000000001600148acfdcb0d77d272d7958594876150e0883d0c1591b1f0200000000001976a914f187808d0edeabea8434251f0e48a765271e2a4588acb31f020000000000160014c80f05b1eeba4458a0be5587ebd2539af5f9cd040c2502000000000016001406cce39ef8760199c54bc0f31be3233a330dd86601260200000000001976a91434c53968e7656c73ec1ba799a1177415f8f0acd188ac11270200000000001976a9147d89b8ea953195daee58454bbaf2c585794b1c3088ac84270200000000001976a914e9f1e6d83710e956d08a1b6f0ab59509b3c7342f88acba2c0200000000001976a9142ef0e04b9f745d6eb986921be30adf8e80027c2b88acea2e02000000000017a91479aa325dc36e1875359bf28a2b9f5d3c6606bda68701300200000000001976a91442b9cc85e1b107d96d759189ce2d06238c52ee7388ac42310200000000001976a914ce05aeccd99bce516d3e174048930f916c42ec5d88ac5a310200000000001976a914fef975a9284c15a93da559fcf81d8c9c60ae981988ac223702000000000017a914e9086345a7570f786cedf3a796232d80a47787b5875b3b02000000000016001452985b91795208cff39db9ca760ee2ec03be2ccc8e3b0200000000001976a9140668c62d294aa165b8865d1c2c591045237943f788ac174102000000000017a91405ea22751aabc05737db828e24198bd61c3c1bb58749410200000000001976a91456b4d69be3a3acaf4ba265d7021b6a9c26cd8d1688ac084202000000000017a914b8ef2edd2e61420fc38bc3fba59787160e3c1b5a8777430200000000001976a914243ee20f16993995cc7c0a972471cdd267006b5b88acf0470200000000001976a91493e57ab912891208d76c81668d2744f1ecba53b388acd648020000000000160014dfffb08185daf476282140c0715c974c3800d1b1f0490200000000001976a9140d98c3f1629f9c891d500cca778b4a5c3dca866c88ac784a02000000000017a914bffa143056604c2e9dafdd7cf5ac153a8af1ec8b87734d0200000000001976a9146cfa9c3ebad13ec79df3d7cc87b277dd253e9eee88ac42500200000000001976a914de4379c160c99ddd8911ef3d0e99f3806257595588ac7b500200000000001976a914a07c8918c38cd44c22a33c882937d2b521eb23b688acaa5102000000000017a914382d8d966a2a61460199bee71a4962e5f79a954c87ec5a0200000000001976a9149d7312a54e4d344c13881d6860e8b4976f6e049c88ac665d02000000000017a914a58883af9df675f965e3bd547827f405fe894c40872e640200000000001976a9149012a6473bfc3945fb42926756d2b3478e39c42788ac6a6702000000000017a9146998acc0869628712b9c64857664fa4f30c57efd8758690200000000001976a914dbf9931f1ab912985b38df81b39957f0560945be88acd06e02000000000017a914d7fd348cedf9bec32901f5379f5c8ffcdf26b26f87fd6e0200000000001976a914c0578d91c7efcaf46fb2c2612369f3d734b17ed888ac956f0200000000001976a9141ab260390cb5372524cf7e3c8fde88cfe857d12888ac027102000000000017a914ff203c6f46138a0352595d1ebb645bfaa6e19e5887f57302000000000017a914272f49b41e5642c742c2ea71bc6358284e14bd5b87d8750200000000001976a91488e74ded7b672280b0f6992463d98945b188516a88ac86770200000000001976a9144dda4539dabd5daa0752ce31e2f204e235b2dfc888ac037d02000000000017a914b33385b722aedc85f44336f08f761ff3fac8fcc887e88202000000000017a9141ea2ba2e97d14b59d1ef2417060254b3432927ff877a8802000000000017a91405914f53c76942b43d46edb4af669d63c32bd0cb87458d02000000000017a9147c6b685b5297fd37536ae9fa9bb55ffb1a00710e87db8d0200000000001976a9142828cb6a8967f2ef7c9e14241350d33a91c5f18c88acd4910200000000001976a9149405ad4f09c53a3da0c0b9bc1159973d042df88f88ac8d930200000000001976a9144866f62d536bbe98aeb74fbe1238ee5cec1d535a88acf9980200000000001976a9146cf97973ef1ea6e6b261fdaf05eff7c3719589ed88ac199902000000000017a9142bc900b8a875ceb54714c8a97c1161599a7724bc87ae9a0200000000001976a9148c794bae4f5ab23f2aee6969b4bbecbddd5ac93388acbb9a0200000000001976a9144f1d2afa4a189cd82e5a46d02ce2b2ca4725b14e88ac179b0200000000001976a914d5b740b074d159a6c7c0d6ab24dcb45ec7ef780388acde9c0200000000001976a91489f8cbb9ff445260e15e725626ea0741aeac872488acf5a102000000000017a914898f046c35fcb1b92454e9cef2b3a7ee07b609fe8703a30200000000001976a9148efbe9eb106f23f5328cd59105aee80a37748eea88ac34a50200000000001976a914dd30ca1ce1d83a93313efcc2a23e82bd016a3c4088ac7fac0200000000001976a9149b99af58161a1900928a64e3879a28f3919a408788ac57ad0200000000001976a91459d6f556c54d1c7d1f4da2babd4512c8db22c72488ac3bae02000000000016001406b1dd7a7d9dde59e273e2378a226ac956f5777378af0200000000001976a9147a2e8ef7dc2b85b526c7302f386963d7e7a0023988acd3b202000000000017a9142bb6b5facad96e1c568a3d801ad86811d581485487aab70200000000001976a9145124a34970aea3cd3f46bbff8f4441337c7a71f988ace6b9020000000000160014b1cdc26e3ef28b68d513035522692ac33f67857da2ba0200000000001976a914e19f9f48819149d723356736b07632492685d44e88acacc002000000000017a91428a0f73c96d7ab69b9f5b7dab8cf34381123fba68729c502000000000017a914ae7fd4c2e740a18f2523edcf316803335a2c6e148771cf0200000000001976a914c082e15a0497180fdde6439c600d96104e7634f188ac82d30200000000001976a914328bec1a12afbf7abc366fc16c4af759850b74bf88ac9ed50200000000001976a914b38bc4fd6a59b6386af710e8d8dab474be11731a88acacd60200000000001976a91448efa96c7df554b9738aac223f5758a09a4e159988ac15db02000000000017a9140c6183b17dcb3ebe2a681f24ab483f899b60d0d087a8fc02000000000017a9145468f64445fe06a080d1a7d86e82c607db00659d87fbfc0200000000001976a914277eb27c684a5977f52f05bdcdabe4ca26e4ef8088aca8fe02000000000017a9149ffc9f5536a696ed0acee169387ad216bf4c81d68771ff0200000000001976a91450a064a5cd46059b808d9ff0e68447705d5709ee88ac3d050300000000001976a914fa0607163d5400e9fd9d2d10987ceab83148ee3388ac56090300000000001976a91496061728fb0ec771271418dba4f3740f53cb2d7088acdf0a03000000000017a9142437b244deee9a80a58f262b6ea42040e4c6c90e87bd0b0300000000001976a914548c63de8352d0fb7a46962313da04eca2163b6c88ac000e0300000000001976a914156c3ab19b39cdc4ad69836165cf083020aebe0088acac180300000000001976a91426241a90cc96451051f94590c082a877f985997f88acab2103000000000017a914f5989a46bfbd0049dbfb3ecc3afe551d11e331a8871c280300000000001976a9143feaaf79dd28ea3849c5ad0659aedf59f3769ea288ac462903000000000017a914728339b9457b0f2a4f61f9dfebd3444c6343f6bf8714320300000000001976a91483d3ae24cd3c534402258058770262d5a8203ead88acb73803000000000017a9146eec68c61e1fbd7effcf44432c8ee81f11337f5b87733a030000000000160014eeab1b3fc632ccc740d8756c2692b99d3a5e543f2d3b030000000000160014f997400f085b491afae4d77caf8ff0503ed4bd81133d0300000000001976a91414d305837d8934e3596aa9efc95631af7dee203188acd6420300000000001976a914c65be3de0a050b9ee5d80b4b8eac077da6bcb3b388acb2490300000000001976a914f714b1a08ca5cf614ba7ddcb3ec29b4b0b084cba88ac6e4f0300000000001976a914b10ad4285e690408f43a9fc9148a5af765e7be0788ac84540300000000001976a9145f0025c6c0586d695ce1338061dd5d0240f7d0ca88ac30590300000000001976a914dfd68f261df491ce0297f7f7d3a88dbd17dac1ff88acb65a0300000000001976a914179f6e5342612e23244b69666c4e05fe6ce19d1488acdc5a030000000000160014737b77f9997682f291fc617069d650e883ce7ccbfe5a03000000000017a9142bc0bbabdd7c90014d19c5f7c8989fea9cb2bc8087946203000000000017a914c04525433f5549bff9595a739e3ed42a8be9dbc8873c780300000000001976a914c3e08423cf9897be91251a7c62307df2b061037f88ac497b0300000000001976a91415748d52335f9a2b89ec5f3937cbd764ae1c284e88acec800300000000001976a914da78bf7eff5d2283376301812f9c3f1d12bebf0f88ac948a0300000000001976a914c3ebceff0f98c53df4ddf4aef0eda321e8b88e5188ac7d8f0300000000001976a914dc1f0eccfb483c4726e1127dba5f4b500db4056688ac7da70300000000001976a91421ff61718888c185919fb858418bdb6997b5eca988ac8ca90300000000001976a9141f921d3d08d7f654f6ee5d04be0affd3ec5e2f2088acc3b8030000000000160014830a99b0282564df9ef493a4887394531babe6659cbc030000000000160014c5976d831a621cf2db20fbe633be53e7ccbf788fd5c30300000000001976a9143fbc44ec3fbd073a9ae5d8faa2f40073250b1fd688acddca0300000000001976a914bec9c9d451130f85d40a5f79cf2bc021019c726388ac25d003000000000017a914bbd6d90436f808c0fe2183c7ddfb8df23752f0a88730e00300000000001976a914f866cffc52128fa993e992d968fa30cbb9fd5d3388ac52ea03000000000017a914b91c0ba947d8523efcd058363192017acd90965e87dbea03000000000017a9143b79fa65a7ef02faecaabdc5cd91b99b847cf4e287b6ee030000000000160014852f523fdf109d11c3628154380d7e8711113b48abff030000000000160014d5a535fe825a2955c959ecc708766e7d6f8d7089e2ff0300000000001976a914011a631bf291b5beaf9042a8337db034962e9fac88ac540004000000000017a9143d60f61126c4b16b29cb31478c622bc971bc976787f00a0400000000001976a91409939320cd7b7b43be65d4fac1316045ea930da388acd41604000000000017a914a6f0e7bf1c645b89b1f7d6513fc7a07930a6aa7e8791240400000000001976a9147fc574760575fac10dc2a8e42718792ec42cb59888ace12504000000000017a914bbc3ab2001aff61c418572e21aa41060a6ef324f87744c0400000000001976a9148016e9d35309e360de653e4fa346d1e9bc2e102788acb56604000000000017a91404f6d1eebc7d55fe02a4793c597a8986ab767bb5879c720400000000001976a914f94ba3c14070fbffa9b810172679329dcdb7580188ac1c7804000000000017a91435a7d442d0d786720c304f5d447417e44ed3a50f872c810400000000001976a9145f2bdefe678aee8ce8b1d7a57044853d5d6f3a7088ac29820400000000001976a914014dd31a761d93e0396b2bd32251c7436161962488acea840400000000001976a914b6b17e83657087281c4cc05b669c655ca765b76c88ac3d8504000000000017a91412a67eb2239b150cbf1fc8debd945fdd40e5e034879b8a040000000000160014243c0fa3c4154226756f65ef1aa05184ae99834e4d8f0400000000001600141b4eacf8985bef5808c105c8e33a4873befc2019dd9a0400000000001976a914be71ae6e512849ffd3159620696cc20148e179d488ace5cd0400000000001976a914035db681a595ee1b6c833e461bf258670a6262c388ac5ace0400000000001976a9147530c2b33a2c9abaf1ef5784a6c2e65698f902e288acfbd304000000000017a914d6ea34bec9cde86508f9ee8dacc09d6329153b5887f8e20400000000001600145d8104aec70f5e0f768cacba97fffdd2e79c8b4368f10400000000001976a914ab4912ada425abb3c8ed086515a89226bd58456288ace8f80400000000001976a914d6b5b1bf0c474e95339fdebeec015353dde6db3a88ace0fd0400000000001976a91436b2c5da46ecd1a6bacc0dad3cd90a754a5e71f788ac52130500000000001976a914dd3598d4ebc0e18a9a43045e12668be449025c7188ac472105000000000017a9146d418cf29ce8b8b231e4305ff4cbbd1d549046f587548005000000000016001458f876020d1d90a930ff4003a64c7c2f511a08066c990500000000001976a9142de37486ffcbba21b15677c54d2ffa0d736252ff88ace49e0500000000001976a9140d98c3f1629f9c891d500cca778b4a5c3dca866c88ac07a105000000000016001449677a59dcef4a0d20ff1799f9b4c170b9dcaf8b1da90500000000001976a9146b266346063f959338baf10c7216cee90b66506b88ac73f005000000000017a9143800a54dc4cb97feee583b9dda70aef77338100287c7020600000000001976a914db9ea2c5745e0f49f8f0b82894c35156267cb45588acee4f0600000000001976a9140f77d7e30cc13338d33a6d374dfbc60d7cf6f0b388acb8660600000000001976a9141943e339ce1ccd50ea7a78305622358343a2c20e88ac9c770600000000001600143225a8c235458cab6eb42546965fb71820d05638ba790600000000001976a9145568fcc163b5589fde89b6772a96d2105a5ef37188ace37b06000000000017a914fafcb55bc93a6dd4da7f2b69fa068bbbfd11bb948703ab060000000000160014f9366cdaea59ae4567123fbeb1d527fcc78e0fae7bbe0600000000001976a914fa0607163d5400e9fd9d2d10987ceab83148ee3388ac48c30600000000001976a914b94d02b5850686d5759e799c78c83f1db7c66bfb88ac69c30600000000001976a914b0474a12b0ae84340df4b3751a321622f8259e8388ac24e70600000000001976a9143b9f9e64bad394b6ddc05db770c35803a8b30fd688ac82f50600000000001976a91475e5cb19fcf4ddc61e50c3c294cd8939ed2f4cf588acc3f50600000000001976a91481b4dec1075c0177ad08599eddcca14e4bbb342688ac63350700000000001976a9143366bd5404973b9956f0f365e670bf043c58333588ac7f650700000000001976a914311e1846f5916505d33171723518ee6916d0b77488ac9e8f0700000000001976a914d45dd71dc63a43c111697e58b4251b18022cc58b88ac84ab07000000000017a9140f6e754b2f64f7a5e2db55d0bc42f668d855aac287f1ce07000000000017a9142580b1e182083f967e6be1bb1c594ad7025c11da8769e70700000000001976a914293c4d5d94423829d7497e8de133fda3806997db88ac7bed0700000000001976a914af8e532ac98dc93fe702f98230d5694f2b3da05488ac310d08000000000016001438efa0a1ce785c54c2f8e13d58e2d5d4e7a56a1868cd0800000000001976a91461dbe287b0a7f41ac38e80b1d11e0afffabdb6ba88ac62ec08000000000017a9144f51fe6a9fee90159130dc61ffa7c3f68b88bcb487b7120900000000001976a914ac871813a78e678361b74b9a5810a0992f93532888ac283109000000000017a914e71f5b38fc147d85ddf3c76c19b5999c9f03650b8775320900000000001976a914c47b3351bc43d33315c693d099b7d1ed69122db688ac286a0900000000001976a914b962ad80b57c8863fec10811291f88f9a056698f88ac277709000000000016001465f9c103569f40c721146c02a24cbd07f2db8efe80a20900000000001976a914eab766de137f0029e5c9a0165cd08963ec6a601e88ac47de0900000000001976a9145204166dc560334e4b3b57a22c7f44cd774f7ee388ac26df0900000000001976a9145a20dd9b08f9a49de6c0dba6a404e6a7bb266d2d88acc9040b00000000001976a914f5262ec36f2ee03f1216010e628cd4b4565d6cba88ac860f0b000000000017a91421d651a4df9abe8052e90508b330f3dedc340e338733750b000000000017a9149de48dab22c4430e184dd6b8374531c2e573c7f2879bc10b00000000001976a9146ebdded8e46e439be4a1c9d7a15c048e1e3dff7788ac68d00b000000000017a914ed136601455da489436b41d36b0afad7d87c70598739f50b000000000017a9141b555a787f7d7cb0c6681ba110242fdbb0f7e48f8798250c000000000017a914271b071f89f6710e3f21f75e30e1e518b2d3c198879fdb0c00000000002200201e34b17de522228be75066e3a49f972e76fd8dd97403a5575121401f516f08d55f250e00000000001976a91459754c30f906fc7ef084ffac78284c544181caa688ac813c0e000000000017a91440cd0b1a65c9ec8fed2b5753545171ca06083ecd87117a0e00000000001976a91449c4663ae62ba546fde0ea44b11154b33c27acc988ac1f0e0f000000000017a91463d02fe1195a37a461206f16d5e9c760f66d569987b41c0f000000000017a9146d61c1b21ed5b332fe4edf7985530adc1bbfe47a87b4630f0000000000160014490cb71ab2ce1353d04c5b7c94280e38e353b8763f650f00000000001976a9147f085ab32de6d9903520142a01d31cb80a90ebf088aca1311100000000002200209b691f0cf11777a090f63456076a73e652eeb26e9fc5c378d31c168d58e7d894e95d1100000000001976a9142da366510fa4e9adbfe15b24a48975d1b4c7472d88ac0ff712000000000017a914aa2ad2efd97be2fc4e6230e19e43ca24c049ad60878a0313000000000017a914df099fa2b3e26d47b06922371f6140b4cc642db2872a081500000000001976a91416d2f21a5bd2f9c5a1c3fb2fb976b9b163935ab988ac45dc1600000000001976a914764c41a29b8603c471119a7825a2bcbc7adf8fab88ac964918000000000017a9141588eebfb3c312126df0e82c07ffeae851949b768705d91900000000001976a914a633b7d27d14e22c53317773c179d55af342b70488acba821a0000000000160014ee5712553d01a2093957f16f670368bd6ad1e98db37b1e0000000000160014d1506c62142bceaf86cb7628c779d8998430f8c396d42400000000001600145a28a4dba3bc533bf01ad3cabf9f943e0edc46d6f3152900000000001976a91486ac1e79d3dff0ec87a9399f83fe324a30bf1c6288ac95ed2900000000001976a9141fc2e16ce0c1ce9de1275e0e533e6287e8d3a9ec88ac23953000000000001976a9145f43fbd265b19f127228926e864e24212a6b2b1b88ac657f310000000000160014bea4bdd2a6d9705652da0f1e66d27b76308955a7e11d3900000000001976a914f9db67527b49c2fc68fba751cca640ca92e0369f88ac45663a000000000017a914a243088489dc49bd7aa227804dbd9d9f05112766871bb13b00000000001976a91402a76cbac539b9e441a4140a60f54e1992eeb49e88ac68ff4900000000001600142cc0c162a6168db904a22efd423b6e67631df6dd6dfa61000000000017a914a92eafffc9a4c180156daaf475dcfef0c946556c8721219600000000001976a914cb65e578f14d6112cdf436ba1fe2925111d4119a88ac05c2ae000000000017a914f31f493f534510b1a7298dd4d13c309faa37a0258727d0ba000000000017a914087fd5432684e7d41a7c3ed0b23e2441a376f8a3874e421001000000001600149f3d5527dcb06c8edc85a02df0a0dcadf6934020024730440220133ef36f21cd86d1d48a53f4e376fcb77babe9575e13930c93df8d8452f1de8002204f0e253a33e3f80b997abe70aaa4c64de5a3956225c9317cfcd076b924951d42012103c7f8938c7434eac38932a3829a08291474bdc6b98469beb27c60f9af503de3ee43a00a0002000000000102ac084a2db8ad32f6c7bc18bcfe59f743059a15a74fcd80b42e73c9d0747561b5880b000000fdffffffb775f79af732ffb6bcb399dc2d5bab2bb32acb6f2d47c6b9b2dbe878eea8dbef0300000000fdfffffffd640bf1030000000000001976a914ff5addecd2dcdc7a33b6ea0926a6d555947376e288ac0504000000000000160014d54f15e2c6d03cfb2be8febc27e779edda1ad85208040000000000001976a914611240795819ee7b5f18f650aea2d484347b6afa88ac2a0400000000000017a91407c04e7f48892b468e694a0bc1533bc5938f1232878d040000000000001976a9140022c3e274c9d57b9536f1164b7ee48408d0eac488acb9040000000000001600140de4b2227c33815f22d36786549f15532ebc3b61f6040000000000001976a9148ee231ebb1ce581d5a8cf52df47c5e93869ca0c988ac14050000000000001976a91486b79b7b041c28e4b85c18c680ec5c0790e8e59f88ac20050000000000001976a914551e15ae9efa4c4b89d46c18877303b08d10da4388ac3a05000000000000160014414b2c49c29d7fc3ae2d86ead5c54b22c8eae05a4e050000000000001976a9144471418f08d6056d6f66d3d043b6bc252a436a9d88acfa0500000000000017a9147a0c18eb0c4682664f74a50ee6caee5de5e8f1e387060600000000000017a91443eb7dac51ad53e3174e38b46a704f310f5ec390876b060000000000001976a9143b95997d8e08c9e015b79f32bf315e36d992552e88acbd06000000000000160014eb738395db31726ea9b82a4a0a2f7b19fee1fb0202070000000000001976a91454308a0c33ccf01a93a6ef49c1b069392e172c1988ac04070000000000001976a914fe6330003120f90c9b7fe03ca1d043b4d7f2330f88ac530700000000000017a914fc8241c2e9596a711972b03d4b1106a66091face87bf0700000000000017a914f537729c9eca254d2e3d474bb3ca4ae8d98a08b387cd070000000000001976a91451fb9a8b012e5499bbc25dac51344378e031cb7788acdc070000000000001976a9141182185dee4ed42e1cbfc937f796497071ef10cd88ac330800000000000016001486de3f6a32b45a96ccbd17ea8673e1ecd92e661a59080000000000001976a91449db76113889daa24fc8041f0b0dc329f9ceacda88acd00800000000000017a9149b856aca435b8abf478dfbaf6aea31f66fec29ad87950a00000000000017a9142103653a155aa38141501616732d7b33a35a3169879c0a00000000000016001495f1341194d25068cc6e5db84f4b59e7642ff4a52f0b00000000000017a91464c3ceb127f9057e0f03b912eabcc5c876ca757e878d0b00000000000016001430171732b3beaa10793fc09e9e96438f45cb1b5a960b0000000000001976a9148626e0011571052cf1221fd596f1f587a37330d088aca30b0000000000001976a91493922495fc36bdd646af62b7819aeea5ae6a9df288aca70b00000000000017a91405bf2cad8a08447e337b4718a8106525b0fce9e487ce0b00000000000017a9146d9d85aefcb74c6e65b06e7e7b88b922e657f088870b0c0000000000001976a914848933097ef676ec47a53d625c24e3d4b0a1a0c188ac790c00000000000017a914bb1c174192e9bfa62111ea69ef3273b8d5ac7ead878d0c0000000000001976a9145af87dba10a94f9e170c9e0916554293be8e2a3888acec0c0000000000001976a9140072ade014500bdb2c5340eb1395e46a234361c788ac060d0000000000001976a914fd8a7b9548da0fd6e8e9c3742fb8433e0f54814588ac470d0000000000001976a91467e20bc87c6a0f0e01536c2e71fca918ce44273e88acbd0d0000000000001976a9143da2de9bf82762d60be65d6b4817829efd40717e88ac400e0000000000001976a9146cf97973ef1ea6e6b261fdaf05eff7c3719589ed88ac750e0000000000001976a9144498121ea3b3aaa4b5d5d478816e919d040b9c9f88ac760e0000000000001976a91458101249648c1ddd114e809e98276ab2ab57072b88ac780e0000000000001976a914a502eeb18f9938e53d2d6be8f17290f3be7020c188ac810e0000000000001976a91423c39c0de553a1097a44009ee071b957ff938b6888acd10e0000000000001976a91451f56ec3cb6c499900f9711e3c087089a4e60bb588ac070f0000000000001976a9147ebcad1de54baa4ceb2ac048858e5323baba844e88ac13100000000000001976a91479097ab1a373c117f04e7a871133f6d025281f1a88ac4d100000000000001976a914d34868f2574b39788ee2cf4e3721adef717cf9e388acb6100000000000001976a9148c3203bf42c3b1cbe6c87afe25339e2daf48cc3888acb41100000000000017a9148af67aa14d2dc84a0c7949a272ebfc71f1bb443287cb1100000000000017a91461212bede2ce70e78cb7c4ab2501f48981e2bdd88722120000000000001976a9149f30543da32293c6b90fdb377491fbb6b1af37b088ac6c120000000000001976a91493157288cd0a1e0491ff6c072d9b3a28507f535c88acfe120000000000001976a914e602e88c81bf57ce35e98739d408791ebb58d4e688ac561300000000000016001400e098ab5a4e2e8cbbb9d8fdcf5580143e911678a81300000000000017a9147ba75825ae540ef9246f02f9b4c6940c917e035287dd130000000000001976a91416a13bd5145ef4b233f27ca8c595ce96b12f2a1a88ac6c140000000000001976a9140b46556e9991ed61f87185ca2996094bdae5c24688acc1140000000000001976a914615554745c2813f2d781b4224428e88a671e2f5888ac31150000000000001976a914d36dd7c32836de74f67c9849f51be513b70b348a88ac6c1500000000000016001449515efd5903b1e547804936d0c322cd8a6fe575ff1500000000000017a9141b2af35842395cb74d5fe6f0ee8ff8d3abe6e51a87731600000000000017a914bc4bb6fea0a619ec3e3c1217a298c142538d049e87e81600000000000017a914f6afaf37b0a4aa7c7da783cf5dff48e1ed10c0418710170000000000001976a9149dd06dd37b7db83e052935d3b548d6733094231c88ac421700000000000017a9147c471669d2de0acc878592133e2504ed7d2ca0188752170000000000001976a9145ef6998ed318b939ef8f6c79a55911243eafb4cb88ac12180000000000001976a9142f6a570a8253162b05fd3046e38de08e29a5604888ac2e180000000000001976a9149fdac9e45d51d62963f79e212589d12b8e26036088ace9180000000000001976a914f13ce3a1e3e29fa5e302a097c14a827755ef255288ac5f190000000000001976a9148493a390460f3eb3ca68788d2d8636c9de2c1b8988aca2190000000000001976a914ee48ffc05827a2d01c7d20e094f23e48db90137d88acfd190000000000001976a91473831afed5f047f89e7939461a89014944b4e02c88ac231a0000000000001976a91457c2cd67fc876b246efb4122bc0f593a6ceff2f288ac3b1a0000000000001976a914a36470b065aa42e066eb84fa35b58017ced5daee88ac711a0000000000001976a91498742ba51a99a8f7146a87e02a7c4e97c628c29a88ac751a0000000000001600141c8e89107e850e8fb129e98494d52a78d3b041f3e71a0000000000001976a914442f13fd0f9d97e894cafa384351f128f12188d588ac031b0000000000001976a914bf3f58bf7e7c7e2f0c66fe518cfd3ec913306fda88ac0d1b0000000000001976a91413d2b3974a11bfa0d916baab24f37b4aa95d0c1588ac0e1b0000000000001976a914d89bf9913b6e391d843b24c5b3ea62ceee3279d888ac291b0000000000001976a9142f84492976eb571a74c4a37451236a09976dd83f88ac441b0000000000001976a9148ca449f2ec396b9c7c4473b5fca9badcb3aaf12e88ac661b0000000000001976a914f24acf9e3d12a9a560272d21cb046c6a4d321b7288ac781b0000000000001976a9144b5c9c63270070a9fd945fdd4140f235abfa2fcb88acd51b00000000000016001403a751dddb89cdfd5ddfa64462c01dc0cc760cc1ec1b00000000000017a91433bd261ba6780c136154db06bfbbe22bdf5579ac87481c0000000000001976a914f4e6aea32957ba902a86183109aa19797cbebd2f88ac521c0000000000001976a914e339d301964b02bc5fcc9ed0dcea51b1bba3fbb488ac881c0000000000001976a914735f87e29f59af0f63dc813e59e29f8e4a5f10e088ac271d0000000000001976a914ea8de5df038ab6031bdf191193d9cf92c969008288ac4f1d0000000000001976a914652e2c43cebbd6389e02b1ce001842d03c32411d88ac501d00000000000017a9140832a8d1cd050a367b4639b6910f82bc82f825b287631d00000000000017a9148ba149dbd9c4698919e690964c9736b78413a54587b31d0000000000001976a914a1088423ac6c1e0f07bf2a92cb4839649dc38e3c88ac101e00000000000017a9142f316bbdc56d8ad225f5cab53db5dbf965a7d08b871c1e0000000000001976a9146f6ad84b9064f4ea8447bf91323cff9c3030bc8588ac301e00000000000017a9144a48c3bea72a656f2586e6479482c51cb42ad29887321e00000000000017a914a0ce8433e60e3fd90be75b31ce91d9ce0cb3f258874b1e0000000000001976a91402bd2adb41f359d3a82fc5f40661c458db2dd76d88acdf1e0000000000001976a914cfc02753507f45da244b3fdccb13f098ff3c8d6688acf21e00000000000017a914cd7d558f6248fa8cc273d8fc8a4bde1603ba12aa87091f00000000000017a914cce4f70078826083265f3f8afa0730c637c6e1fe87201f0000000000001976a9145f5e3068e5f9c3f3dbe58977c1edfee83bdcf67e88ac811f00000000000017a9140bce0626b374e59bf92c70824e19a9976443d827879a1f0000000000001976a914af9d8de3d6cce9968ff017540312ddea93a2e62288ac9c1f00000000000017a914f7d99bc2eeb5ec6adaa2415f6fb44756d31e955187de1f0000000000001976a9144efedddf0662bbd99a21b89c28b881630b79338b88acec1f0000000000001976a91456c492e9a67f225c7416faf5b8fe47e621ae20fb88ac10200000000000001976a914a1377d4414f280c1f4bd8791f8173feeaa0bda2888ac15200000000000001976a91417834bc83cc237420fc23fddc46703b8753e18c988ac2c200000000000001976a914436e97ce6b7abd39079327370632e525310ae8ac88ac44200000000000001976a914f7b30d35ff62ce08a3701219e46ace704732bf2188ac4d2000000000000017a914036e5cfe9101427be5ed0024d4b1b98b730e0e7487552000000000000017a9148be5dd073bd9860c427752911186edb0376d3c568771200000000000001976a914d93d44ce9186f892fff1dbac74fe93036642d6f888ac95200000000000001976a91455a34face86c4e989462ae4465794efa1252cef388acb2200000000000001976a914c45c9a69d0fadfb1a329c4fdbd25db1735f5372288acb52000000000000017a91430083d92aca5b18e8592d99e483d6e7c6e73ba5687da20000000000000160014ea24a16a3054ab4bab6aff8c45f90f120bf2e59021210000000000001976a914b24e2ba59af9d85e2d81b1b32bc3dfc127083dbd88ac26210000000000001976a91493123b940cf3c86b00ce45514f4bde5f0920c45c88ac6a210000000000001976a914db6f6e5950e34a04e5726f2d20ad930c0223fdf288ac2f220000000000001976a914933fb6fdde163b254fd2c147727f7e05aaec594c88ac622200000000000017a9144699947879044f95b04a934c99ea4a73320455ab87af220000000000001976a91489b1da2f9d0de819cadf2c60cbb53ec15192063288acd9220000000000001976a914ecbf4cfd087d30f6b104f1b3f408e5b3d6d218ec88ac06230000000000001976a914b8b7f3d85355c2e99eccc05d7416c15cd00b4c0c88ac6b230000000000001976a914f17dcfe4a6198c233363f6f0192cbccfd3b19f5f88acac230000000000001976a9144b2a8b410faf41884d50ca4bae87defdb55f0ece88acd2230000000000001976a914f4c8ad650d95e4b5be40aeb022b677b4a1c90e8688ac14240000000000001976a9148131904a3412c721d70a5b0c231afa833be7a46b88ac1c2400000000000017a914ab5de341e2fafffa023bfc025b51ec8055362f3c876f2400000000000017a914484b6b714be6209a1f578f5e20d6b3c5f26d3cad8770240000000000001976a91452cf04ab90cfe3ad540e8ffd85c0dcb57c1cb72f88acc1240000000000001976a91461c04525b548532efff6544cc799ba18b97c127f88acc22400000000000016001469b210f005e3c6097bf36b4e2429b21b4b79751dc9240000000000001976a914f59b73b36a78cd082df2fbf740fff9fbbd87a2e588ac03250000000000001976a914105701830682ba242023cbb63b88730b5494da4688ac7a250000000000001976a914c8f9d44f42af971b3cd184e84b15a8bc26cc6c4988ace7250000000000001976a914d2d92b27f521cd3569d4f90d445da572b7cb3d2e88ac0a2600000000000017a914eb5766f80ef5fd9e4209b1db9d24e9ce85398651870d26000000000000160014df0085520d05e336f5d6bac8c4236e8b12729e6013260000000000001976a914173d9c4b58a15f52541dc6fa2bb93ea5b4bff1ff88ac15260000000000001976a9147c868d44940749cf6adb5f3620c0d5e85a108d3588ac77260000000000001976a9144c635e0997727725d1056ab724b7ed82cd50798a88ac772600000000000017a91481c7984a58f671b218b065610b5dcb5d6cec359e877a260000000000001976a914c76891968d6496fbb12325baa55e47e6950739a588acb1260000000000001976a91451dced991f6beb1e2e9da707f3e729a902f8a36188ace92600000000000017a91465180a6bb860935d8a97c506c28ace9b34e6d3f087062700000000000017a914cdcb2d3cf9389dace1fbf35258ac395a95ca86048755270000000000001976a91485e437c40022f76791d6500a47fd38bcc07ea4a988ac71270000000000001976a9149055930e92ea4dba485850583abfad970ae6cb7588ac732700000000000017a9147e5a3aba141e863a39075ff559e4c2e799d0fafd8785280000000000001976a914ccd8c3a3b88264a4525e07bf4b21d78287f27f3588ac952800000000000017a914aaadb4ceb0eb739d7cc30174f2bcd7c670a7595187a12800000000000017a91467a16e9c2b5a68e81de9ee1534cefde613e866b687c7280000000000001976a91453556d82344cfa1363eb837c882ce4cada61c07588accf280000000000001976a914e34b4534e68389b471c0b58f422dec9fe01b1b9788acd1280000000000001976a91489b06d4a8aa7fe728f58d26e224d0292096f16f488ac78290000000000001976a914b81fcdbf72321b7a9c2ff5253defbcde2bfab81a88ac84290000000000001976a914fde0ca36260b41b717788d4956de56d91310c51a88ac9f290000000000001976a914beebfbcc97dd855c6e0c7f6adc3e5bf9a61ac61f88acb8290000000000001976a914e4f3e28591d7422b13d5c5e3ebc417670f76175e88acbb2900000000000017a91442563fe5a61450db6c1ff9b19ba4820823b2baba87cf290000000000001976a9146d0b7017ee6db5401097a080a58f9fd71825398188acd42900000000000016001474900160c1fefceac16c09930dbc9d0d1b04d9c7dd290000000000001976a9140884a3504f523bde6d27cf14372cd83accd4e5cb88ace729000000000000160014857f4f23ed9097065cb4b81a68e9eac1b54f0f92f82900000000000017a91425cf1fff3a9b88d824dcefb873390419fbed839087002a000000000000160014a6b4fb4f9d9f6822a12d6eebdbf8bd0c0409701f032a0000000000001976a91416a13bd5145ef4b233f27ca8c595ce96b12f2a1a88ac0b2a000000000000160014f9e9fc66c843d8165175c037cb819a6a15196f051d2a00000000000017a914c0db114d77fea5cf0efed8020a535ea610939775872d2a0000000000001976a91498ff1759ff3de9072dc9580021620f89318c6fbe88ac6d2a0000000000001976a914c9c5ba908ee7e533532382a5cfcda4ec678679ee88ac7b2a0000000000001976a9146105ae8c545a6ad2ae0d1895379eba1566ca909188ac872a0000000000001976a914fa8b279cdbad6c4c4164e56b07e306ec15f6e13988aca62a00000000000017a91463f415883f61129f5045b2b36f2d7d22f425a6bf87bd2a0000000000001976a91426b3e9a5b535e7a65b1aec50b205a237a80af2f488acc82a0000000000001976a9141570bf4a66be558f6f229153810060528248d89e88acd02a00000000000017a9140eb7043b071ac455990a2df438c76684b97852b787e12a0000000000001600141983afd7150249438a00e88f6f99a720bcfd20a0e42a0000000000001976a914d1502c24da60c2909e31dd30a896a8cb0ace06a388ac102b0000000000001976a91403d46b937c9362f43b6454fa02783b93c55c50c888aca62b0000000000001600143684e048230cfad681c766ff13a8533d46aafa88d22b0000000000001976a91464f9710ed9cc8d80ec1d6ab517b7b30f54ba2dca88ace32b0000000000001976a9149657fb15f83f22440d7f31673a85ec6076062c9888ac0d2c00000000000017a9149e6eb3e34b26619c4aa1518204df726c12b6f0e9870f2c0000000000001976a914388bd491ff8b6fbf6353f3046cbb0322c190de7c88ac652c0000000000001976a914d93efab8264bb57c21ef5a088edc722e26fceee388ac6f2c0000000000001976a91400e3a857b88698779a2c5f8b358eedefe9a447eb88ac7d2c0000000000001976a91439ff542c3a5ea885c5ca49d11080fc66d354bac188ac992c0000000000001976a91442d84d1b3cf5556a082fee1b2b49574f4765f51988ac9c2c00000000000017a9144a022517efdfa1b5e817b66efc3e09180209930d87a72c0000000000001976a91455ddcec6bea8909e39f414f52b7f21fc632c20f088ac112d0000000000001976a9141e8f81d57ca50968787e06dd2d3cb15f519b0b2a88ac272d0000000000001976a914cbd256f0606e5619805cd5660d25ead675145f7c88ac3d2d0000000000001976a9148ff8719cf47d13dd833acb3ae469f0ad95062ab088ac482d0000000000001976a91482fcbad80961d335b544414601665894b2a76c7c88ac522d0000000000001976a9140df6390ecfea5f8b0bc2f795ec37a6d0de410c0488ac5e2d000000000000160014f2aea5838484ae552ea69fbad7a8b4c4547bb3ce792d00000000000017a914de5a64855104c7d13c68b51f2b8ac86acf94678787a32d00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87a92d0000000000001976a914e92acf40ab239bbe9cf563bc7dc1475f0f231da888acaa2d00000000000017a914c36bac2059ca96ac1b5fbe3e1b3e3a7693b67bf587b32d0000000000001976a91410fcfb737ef76959aea93ee9a5f6905a86d7bbf788acfa2d0000000000001976a9147cc7ce483385821a86445d4befa2487c947f429088ac122e00000000000017a9140e76ab4edb9958d9d57808536b9406dc3935652687142e00000000000017a914aba1f31340c6911b86073ac904d35bceef55d9af871a2e0000000000001976a9144cfe5db1055a9e9c202de4fe6a25a8b71b0ebb9b88ac1f2e0000000000001976a914a5d9e801ff53661ea3497bc18691442143df864c88ac202e0000000000001976a9142ad4a5ee681010a6042dd36fd388806a3e14bb3588ac202e0000000000001976a9149d7b4f320e2e964af476f806fd426ad0ca1d636a88ac472e00000000000017a9140c3ff053f88ef412fcb4e1707063515a33a56965875b2e0000000000001976a9145a81cc59ac2439fcd5ca75b72358452be3fbf6eb88ac5f2e00000000000017a914f6e1bfcc264a4e3369473d5ff9a7a858cb6899a187742e00000000000017a9147a86fe2234ee9623804783f0dd0bb9ce09e7189987892e00000000000017a9147778de20e942f257317ab216b7455ddf4adb2da3879a2e0000000000001976a914d09bec2f3da99580fa36b49eb61934b600530af888acc02e00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d870a2f0000000000001976a91468ab3a8092ebc62bc7955f357cfc195bdc1836eb88ac2b2f00000000000016001481ef07f388948693682e70f3d9c6a8a417d4ee292b2f0000000000001976a91432203e6b169afd81dbe37cbf2713ada7e674b35488ac2b2f0000000000001976a9144725f45b88a37d069e805773552a955e247f454e88ac2b2f0000000000001976a914ce11bc6353e6752f2eff068f541996cd1e841dbf88ac2b2f00000000000017a9140d828e9b555b3f958c064e6e3e12fdb5cff05845872b2f00000000000017a9140d828e9b555b3f958c064e6e3e12fdb5cff05845872b2f00000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63872b2f00000000000017a9143525f1b8b4476a4fd51b764687afd4942ed1d62e872b2f00000000000017a91450acbe488410164b8602335ed8ffbbdb92c8c717872b2f00000000000017a91464137b86c173e3cf43965d6b14fa2c448e17d739872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9146cf0af1356fe59d6a458e43be25c3d0a20697904872b2f00000000000017a9149500925faad39c792031811609ef90fdc7ecb19587312f000000000000160014f394109e6131d1e94844aff5a1208330984c20e1392f0000000000001976a914a5255bbe37362a7d6cc6687b8a4fadba1e6e538688ac712f0000000000001976a914f9810ea97675dfd6f4ff215110caa776f706f63c88acc02f000000000000160014a6b0a6fdca452e72f6c9de7c1aa0380ff7e5a822f22f0000000000001976a914a046e31b5198030b52e75126d2491204046a186f88ac3a300000000000001976a914245d554c5ca8653dd04a687f98dda5f8ba517e2188ac463000000000000017a914941de6b4a7698af3e62c2e895459e985673073f38747300000000000001976a9141065004bffa3a85549fa0cb65e2e2286f0d34da288ac483000000000000017a9141d7003a7f8fa53215cfa3232ae03f873994d79bb8782300000000000001976a9143a3a498d3379bcdaec13ddf79ed0d01bf65f458a88acb530000000000000160014a754d186fe20a9e09c3da49376328e3976114144d1300000000000001976a914d7efb11de745be0ae84e35b6f2e39e63f664a10388acd1300000000000001976a914fbce2cecd4a2688124fac650255be9e59af2b81f88acf03000000000000017a9144463b0eaa399885edcb95e519b70fad0123b2c2087373100000000000017a9145ca9ee62ba287a7e17ca73bbe06f326feadaa1038758310000000000001976a914f0ea942d86453475aa155fa88daafced373158f488ac7e310000000000001976a914b0454fec336c521f6bf1c7d059d316aa1bcfdeea88acd2310000000000001976a914991d9e52b0f54d0c5676105d762d5721fe8e9adc88ac52320000000000001976a9144b4a07ee9019a5d33328c87850a9194b6eef710588ac6a320000000000001976a91475d683fa3b728aeeebc86dd0ef31b9756b379fc988ac6d320000000000001976a914d422a63a660457ae6f3f219b642d4ba16709b4ef88ac793200000000000017a914394cb09d7c1db9b753698a02d64175495ef9845e87a53200000000000016001479157a1511b90a6d9d8979fd5c69ed76a40887a5f83200000000000017a91414760f04aaad127cfe9e6eecc14c37dfa8e32c0c8722330000000000001976a914bad60c5f60b22e67cc96b7f0808db8b2e12574c788ac263300000000000017a914a7439e5405b885d5f6308ab720411901719f7bd8873c330000000000001976a9142b62f45fea89e7811db1b46027913d57070c2b7988ac50330000000000001976a914616cdc1bc3398cc50ff3371f9b80dc7d6ee66e2788ac77330000000000001976a91432d55192facfdd59770886239d554abede21bc7388ac893300000000000017a91417f9a77c4f30e584c00e66e6af41ff2564af11688795330000000000001976a914b4e192efe57f0f46decc8af3202c896dd670eff188aced3300000000000017a914cd1969d8da08c1f6af01f47b693cee8ca6bf53d7873c340000000000001976a914e9f2cfff24315dd68997fba64288db8f9ad6104488ac68340000000000001976a914d404156fe24c8ac84b6976a0719533e35af4d70088ac7a340000000000001976a914d201b2988c6011dce5ed874dce334ad3ec1cdece88acd8340000000000001976a914fa92ef18e9567f8715e8c74ef0c1f4c48857c67888ac403500000000000017a9144773b1cda72b1df5af90e8d88a37bfc2dab57161874b350000000000001976a9149adffd6979690486fc206660f32a5ebd047cf23488ac543500000000000017a914d35ae78bd1f4bb8fc9a47264e106f8af2156150e8768350000000000001976a914f26ee18eb519d0d5daa977aa9f433819510017e988ac7e350000000000001976a9148ca73aba60341fbf6d437fa19a2137b76105742f88acec350000000000001976a91405fe39d6adc21c77a8cfbedd33244fc3072412ac88acfa3500000000000017a9141a33b9b3359a6398fa87e37c2b86fe5bec0e8caa87003600000000000017a914cd35dbb543d1bcf1acd3eb81d2407a4691fb0e06877a360000000000001976a914e6bb3ae380df63cc947034d9be05747099de9b7d88ac8d3600000000000017a914e23f796551e1de1dfbe5e39bca0aa1e716509977879d36000000000000160014763421cc18ef451fcf126927cb639cdfeea7438cd23600000000000017a91443c32a5387bd3a04e072fbc8ff70698a6ef2552387db3600000000000017a914a166b19df1ee8985c61d38eabcdd53dee54ecd2d870b370000000000001976a9143e83d26f4922b520a5197899d8429649ab22284188ac3d3700000000000017a9143bfa5978914deedeac02078140a21694cc7d99d88741370000000000001976a914220129011185c7650e82f588296c951bf212f3b988ac7d3700000000000017a91414d654e131f35c4062f0c18dc0a9d0b3b8a5e38687e2370000000000001976a914be0632e4b596bea35cc8b96b1ac314d4ba56f9e588ac3e380000000000001976a91489d6554c5dd1e98ca5b6d214b9e23ff262c661ba88ac733800000000000017a914a686ed77c558c67437cc6babb32b2cd594219cbc8789380000000000001976a914612fb63de7f9bd6b6da3a9b760ab700b7c1ea16588acaa3800000000000017a914e95d373e2822b28bdf5fe7effcccd2e1d8d0048787c738000000000000160014f7eb5dc81d1de4ffd9588f83cc16845b02d759ccd2380000000000001976a914bb7405a375e78c3bc349f56c23f240ba3d885fa088acdf380000000000001976a9148cc50035e333aad22159b70729694b73719c2a8388ac123900000000000017a91472ad31e66d2f94d36140e02bb6ab7ce2cef579018734390000000000001976a914de67f761b0e03a7c6fcdf5475abbe78e4f817c0188ac42390000000000001976a914f499691d68314a95fa6597f1366748ed149afbea88ac953900000000000017a9149a42baac5ef52feb3457b44ed493da5b672f455087ee390000000000001976a914f2b7d66ebcf19d9e67b672f530d2a45fa66db42d88ac063a0000000000001976a914cdfa5e35b6ad8a8a6a46b7d3eb5056383236192988ac183a0000000000001976a9141862985ce4fb68bcdc24cc125620bbedc096bffe88ac243a0000000000001976a9146c604c3174105f26c6243e5f925355afe146a9db88ac8b3a0000000000001976a91401d6691ee52cb40ff70090b303955bda5c353f2888ac0d3b00000000000017a9141cf28498044064edec3a6ebd60a9d79307f5fc71872e3b0000000000001976a914923a0313070fbaf89cb350cab5eba6fe56e56ce288ac3f3b0000000000001976a9149ba9b6f8623cd19a845a686207185dbfa02c914b88ac4b3b0000000000001976a9142a2668d50fb16cced5d7e1d83d1eb5ff8eb764f288ac6f3b0000000000001976a914a378a438c67a57c67d2d7ae0cae2433057c4cfcc88ac723b0000000000001976a914f914325052601e6e0c7889bf69bbe5e902917fac88ac793b0000000000001600143b342fafa887d28173f713485840f6fbd4831156e33b0000000000001976a914397d406491465f0fdf9322e4d593e666a65fce6788acf33b00000000000017a914583df007e677749deee3657148901ac8b5fda7e487313c00000000000017a91435292dcf923a135cbc5d72f4a01c6a9f7faff6fc877d3c0000000000001976a91434b57d65a303bbe7a96f1d7a3ebd041c3de3284188ac9b3c0000000000001600147e2ac498ac3589b82161c22b5bb72e09cc899117c83c0000000000001976a91462d8c7910c70d511d042380a3a141b4f9bd1176288acda3c00000000000017a9145233b54eaa558cce434e9133689a3e3e71ec907787f93c00000000000016001447aa499d3d6b2ac1141ab290d8fe0ba3b6080f491c3d000000000000160014a89da59ab36834ca760cbaf88727b6c9acb5471b453d0000000000001976a914409dedf9aaaf57ecf66968e2738eebf94587621f88ac5f3d0000000000001976a914aadbcb0ef8b3cd8d40a24fce7d331b136d98559888ac603d0000000000001976a914d250acf0f61e8db213ae4469a993c01f972062dd88ac753d00000000000017a914803b1b270e595be74b91b951f593e03f0682ba1787763d00000000000017a914891c487ee00e65809a3816f4e34a67f83781ae7687813d00000000000017a914c83e08519ca9c9a31c455c32f215fafe907d4f9687c13d0000000000001976a9149541595740ddb3691ee7d2d46794f67d2870d7ac88acdd3d00000000000016001443f070e38a519fab053b30556ac09283ff4c1221df3d0000000000001976a9149d996e43e36ca6cf6f87a071c9bbd0fc4fa0a11888aced3d0000000000001976a9145fb80ea6f940f822b150c0d8ef58cf0aeecede3a88acff3d0000000000001976a91464221e485c9cb480735c5eb4491310630538a79288ac1d3e0000000000001976a914c771b9920c47612e44caa7234f4ac47da621caa388ac3a3e00000000000017a91445a2b3fd0477aa882b4caed9ba93d986680d0cd887553e0000000000001976a914e36561c9363ef03777672cfbdb2258e27f37bf6888ac683e00000000000017a914cdf07b4f1a7f48942b70ad490d6e2ca91053660287823e0000000000001976a91472cac3f4050534829862d77e760a74eca76cdfc388ace53e0000000000001976a9149b6438995fe15c925eb45f3c534e4979ae7d4eb588ace53e0000000000001976a914bc801b53ab73f1630fc1806b4e7cbd6865e8944e88ace53e0000000000001976a914bc801b53ab73f1630fc1806b4e7cbd6865e8944e88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e0000000000001976a914cf3cf96aa26222c48b29f2d64e77c934177e354a88ace53e00000000000017a9140aaa81f9456191ce5f381257938bab98d1c6ef8f87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87e53e00000000000017a9146a27cb640902159237797df66c01de82227a94b887e53e00000000000017a914a2b8605b9ba4f79cac8b9a139a531b5d359129d287e83e0000000000001976a9140f95f4a9c95cc4915450bfe7d37a1072909a2e5888ac173f0000000000001976a9141c3f418b19b547776ea6a4ed47c95416038ef48988ac1d3f0000000000001600141fa22cc0aef5907245992a80a2fd9611b559d4e64a3f0000000000001976a914fe5ba3581c22a2b566e429d580c1ff5c62cacae088ac883f00000000000017a9146bf46f151cc4351ba4be378ef4212a002098add487e23f0000000000001976a9147d1c07df253272ed0435e466276a6e8a93ebf5ee88ac1c400000000000001976a914bc8e6fdcbb0ee4a195e84f4979abb5c7f54a85d788ac2440000000000000160014f29c779c6a1cb8a7a652513b151666cdd739266d37400000000000001976a9141fc65fdc66e536c51fabdb3a61f5efe41b0984f888ac3e400000000000001976a91461c58844f0c8fc7daa563ddc82035f1a54a6f9ea88ac4c4000000000000017a9149a3dcf9d9bc1e6f303c5eaa19da82370ef0a61518751400000000000001976a9147776e798aade9ab083beb436ed9dcda59fe6fd6688ac6a4000000000000017a914d1979aeec8b40e674c34dea3b5f7e52dd28f31c0876e4000000000000017a914876f0097fbd309dd5ccbf9ffa80fa40780a3d3d9878f4000000000000017a9143b1db5dde963fbe001c2eb5222f4cd5c22fd20e58799400000000000001976a914703733043743dcf3759ed43f2822d52b26dcacff88acbc400000000000001976a914d4a0ea27c04a41f77fd280b7cbf9eefce7413e7588ace84000000000000017a9147c2ba9e7e42f3773b0198718349ec3558b58f45d8715410000000000001600148ed300a8c251f79293a86f78a1b6fba8da20820d4b410000000000001976a914d1ee579d270e19c6791ce654b2cb593d659039d388ac73410000000000001976a9140077f5aefb760d77893c6e3ee78360c4044587e288ac77410000000000001976a9140e94e6a52aa0eb915ab712234b3345342257556188acae41000000000000160014a011fc62a76016bf6c69910460066f12b62af3ceb541000000000000160014de3146a7b64f430145d310b9abeb92316d6b3dbf03420000000000001976a914464934c830dcabf4e0e0dec09a387ff99ffa71a988ac06420000000000001976a9143268dab7e762a3f04bf40edb6bdacd8b9a6c3ec188ac0e420000000000001600147ea617355b31d8241496f10815db951b9ef172da204200000000000017a9143c506432fe3c3c5c78a3e33fe796b0e80406a49c874c4200000000000017a91419d32b0ef79aefb593f7878fd2f20139b43116ac87504200000000000017a91411e7dc07b06901f1135e6ff22d7245210fb847ad8757420000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688ac68420000000000001976a914b85aac1ddc710869891e035579181ed9506b8b1a88ac734200000000000017a914f8e14f7be07d91b02561d3b856c62a1c90242e06877f420000000000001976a91422f3a6ca004785cc6a356afaa508f4241dd027c888ac85420000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688ac9e4200000000000017a9141d38ada4c6c7b6f22eb37b32ee1275576471df7887b04200000000000017a914cfa529e5cd00c69589c9db73e7764f64695c76e287d5420000000000001976a91490e9a296d910d8ce31048bf6205bd4aacc59c98488acec4200000000000017a9143dd71e8b4ed322824a9df35b769e8d26547b7e00870f430000000000001976a9144105b139c2f1806dad2b5f521c6c0e3a95de7fb488ac1c43000000000000160014a4aedbf4ebb157f2fd31e6625ec89710e9e6e9a63d430000000000001976a9146c6ce4d60610e29991c4d5cf1a9c6b2027fa420788ac3f4300000000000017a9147b096001307f55ca0301ec3fbd67017312a52c59874c430000000000001976a914420e75f58c6d5e73aeb82026f20822a58776d1d188ac51430000000000001976a9143480408870114fcec51461cffa23346ccae70f4088ac6c430000000000001976a914060cf9b0868c290a075b4818d3cc19e825bbeb5b88ac6e430000000000001976a91425a2bfb12502c1859a314c32976cf9c0a777ee3a88acb0430000000000001976a9148c570947aa7ea50723c1f7847f6f9acd0aaa348188acb6430000000000001976a91444a7b7f671095433b412e4b1dd4d5b68a58b6e1788acce430000000000001976a914daf97bb64fa400040303ccfd01907070b04c98ac88acfb430000000000001976a914de22a2567b38d468eabd30d1fe6cbad85bad859b88acff43000000000000160014d978ee9271cc3a6b814d32f5c81d2834448c3a64594400000000000017a91466e931d9c3ca0ffdd21fdbdacdd8607eff81a1998764440000000000001976a91486b79b7b041c28e4b85c18c680ec5c0790e8e59f88ac98440000000000001976a914f9211038993d4d48db96e628030cacb53859293288acd2440000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688acd3440000000000001976a9144eaa55e15451b1ca5cde84faa72eb0ec34447c1288ac83450000000000001976a9147f647e1a2f621a05e8fec6645f2cc564c366170888ac19460000000000001976a914ed17c78f214f275ac307982243308eee48e329c888ac43460000000000001976a91422692a07fb98e32b568d4271361b6cf60edb32d588ac43460000000000001976a914e42e078f0a1ed246e26f3f49dbdc038272f5100a88ac48460000000000001976a9141532152d7566d5f57fc45d6ccfc3855a1e45ace988ac804600000000000017a914e7067fb544e78d827920dedc501f255ccd248ddc8783460000000000001976a9149176fbf003d4b7a7c9f643f659af9781d871acfd88ac864600000000000017a9147d1fa1b1a948191861418fa9f5c828443c47f5fd87a3460000000000001976a914202950b826e22035e1b02e265cb082e40b0ee12688acd34600000000000017a9148cc2259d4e2ab9e4034e60dc68af630506ac0e2087d6460000000000001976a914b376377f5c5a810e001c3d1f4ab8dd3eb262028188acef460000000000001976a91442f5d3eed615ae4de3fa7274ac3d997e5caecff388ac07470000000000001976a914334e32dcd3ba2387c383bbdadf90edf0d75895e088ac154700000000000017a914f7d9c1a6ec244bca8f20ffdcf8a119916e0ee9cf87df470000000000001976a91421a547c49bbafe18486672dca2375f0786b893a688ace24700000000000017a914bedcec95f0658c5669cd6bbba16d853136a1cbbc87f4470000000000001976a9141275ddd7d23f1286dfa635470a40a7166ea744aa88ac184800000000000017a914cf7b1b4aaf6c56c809df110f28b35ef8326aa767873b480000000000001976a914f5a14e7731829d8c11991c987f9ca4b2eb8c9c1e88ac6c480000000000001976a9142d9840ea9e1707ccc9bac8bf33f10f7de38c102b88ac75480000000000001976a914384254137068aea8dc5c62bdd2f7baffa57a64df88acb34800000000000017a91459f2f6ad86704d3207be72995e9b8e1f7e2e22ce87e34800000000000017a9142bc6864de8a41294b2c712fe78dd7659ac2735e8870549000000000000160014a92fb26f7ba598f4a6c5d1420837297b6b3d66422a490000000000001976a914b627c8e4defe2a7e574728e514300e90cd3eb16688ac474900000000000017a914b36cd93815f439f06e9cc86d1d14565b35c53744874c490000000000001976a9149c48226acdef348cebd96d9d90a799c551d1c3e288ac56490000000000001976a914e74721a600ad5dadf53a6e6e50398658f5a7dbc088ac824900000000000017a91436ffcf0e51ee999f57a19ce90a4436a48089c50b8793490000000000001976a91488c1f5da66e33fefdd2d3c07a83f5394acc9526788ac94490000000000001976a9142c2429af6d12e16b52c9176258ca3ccb2960102388ace14900000000000017a9144863f6362c4b38d9e158a49fff5dba86749ea27387f64900000000000017a9148f314d43a2471ad931c7e2abf555a2cd0018e6c887fb49000000000000160014c6bdbcc06cfe76970cbd3ad43521939152379c45494a000000000000160014ff880109735d3c6fab746bcc76a4523f92ee60a14b4a00000000000017a914dfe6ebb944f9565d2094c841ece54d8dc5ec548487584a0000000000001976a914895cf0ec9321bca9c992bd493359e9be6a7d473e88ac804a0000000000001976a914ee93e44ad4e9ffe498adb3ad2775175064331a5c88aca44a0000000000001976a91438f5d3f22a1c80c115a69c112284d2c9e2280bba88acbc4a00000000000017a91431c52165f4648895f53e4b5914dd4ccf386a689f87d84a000000000000160014b0e213099e71f8ca3ec45ee9069b723eb5f97bd1e24a000000000000160014baae22aa4e76e7794a494a6f6ea2da40f19e54cce74a0000000000001976a914c60bcf7263145f4751b4487a069f0f2d0c28f4bd88acf04a0000000000001976a914ee939a4e0065c4d6563084f4f5b33ac3cd27e85c88ac0e4b00000000000017a9148143d96908373e3f6959b4ccdde7c522dbfe648e87474b000000000000160014fef6f1551a2d21f7caba47409f95caae4228d881c64b0000000000001976a9141647b0b317c0dd47c173572d5a37ee7c46f6212e88acc74b00000000000017a9143473d2b29f01d6fd1b6c5d6b6dd9f2517a5c6e0b87f84b0000000000001976a9144b73fadbb8e2f96f688d268285b0073f759630df88ac784c0000000000001976a91432e0529aa444572b062916634bf42f19c382191a88ac7c4c00000000000017a9143ced6d98cfc43f580ea5a0b93b4a19cc66d11625877c4d0000000000001976a914e2e9855c4db6482a44c98a33ccf2731e734c4e0e88ac894d00000000000017a914fa5de3aef34947447d1b99c6b3b1dca520bd3a4987b24d0000000000001976a914e51c7fc57017ce6b98f14e7eba3a2205b5ccfb0888accd4d0000000000001976a9143d1d59d3a04ee92735077cb674e42beda34083f988ac0b4e0000000000001976a9149c18ed3a0a03ffd3b99c24e8d695e4422dd82b5a88ac674e00000000000017a9142e60d5da365e0d5970a5f5ef20625391fc39b3dd87964e0000000000001976a9149932ef36def2a8ec6757cc8abac0a6d18c38fdf188aca14e00000000000016001447efbe835d74df518b38efcd894a38e1bddaebcba54e0000000000001976a914b50c6dcee9edebadf9d299a43b7d2d56f948154588acb44e000000000000160014d276ad2dc4b5b270bc8a1db2398b093fe3f180e0bc4e0000000000001976a914b4587a24ff8738771731f4a9aa7be575d12f0abd88acd94e0000000000001976a914d73c6eccf6f7fb44138f877942ee05c28f35b25c88ace04e00000000000017a9143245ca02c8e048850b064c0ed293b283c128a38787724f0000000000001600148e71a511adca2b026011d1a2934ef2b64b7ba632b44f0000000000001976a914526955723c980e0a2c29fa90724ee4b98afcebd288acdd4f0000000000001976a914f90d78fddd2f2e93d96b8f9b79de4c7e532c01a788acff4f0000000000001976a914dcf0af8d00f50f43a2e5c4f9a66982dd628575e888ac1c500000000000001976a9147eddf87ff7b5b0cce7e2dcda0d7097348307730c88acdb500000000000001976a91452687ab0080b2987f17d463e8c6c68575aec462f88ac095100000000000017a9142082d6f6d225379f12e7e32947329516323e74f18737510000000000001976a914a728d5b38405bdea0213bfb10d1d27d2068c3dfa88ac8d510000000000001976a91444f579230b67eb0de1aec86bccd0d8453f5af1ab88acb8510000000000001976a914832141d07bae4995ef910d7f4a4699bce21ccb6788acd35100000000000017a914c2ffef21f93900532efb5e20fa766b3f840b5c7687e3510000000000001976a914a385b824a39094e1658cfaeaac81b9ac5c8eac2c88ac06520000000000001976a914ed3d528dcdeade6f206780ac731882ca44a91c8588ac17520000000000001976a9149d5965e826c672535ab6374caf3772fe3c03217088ac34520000000000001976a9141003a8da4e50d20e8441527cb13a212023bb393a88ac6a520000000000001976a914dbcb9688869a84c07caecf1f3cf103f90fdb4b4688ac70520000000000001976a9146fbd497aa6d89188b97339f3ad0d7c40bae2a3c288ac73520000000000001976a914cbffd0d61b4638b9b650711c261a3bf2a299dcd688acdd520000000000001976a914dd891bc13e56b8d9ff6f10df04414f6698763baa88acf5520000000000001976a914082dc8f96ab0821bd407ab9a0db93b8d1d0e730d88ac1b5300000000000017a9144ed413360d7b2bfa1351341c5c13e99c3638f5c28729530000000000001976a914dc8ad11e159fed326a2e3aa51274970d1a2e6c7a88ac405300000000000017a9146617c5dff0cd9527ca2f781f423df13a103fdfc3874a530000000000001976a914b26ccc1f310e90e4e6d12a49e4fa9cc497bb13d288ac4c530000000000001976a91479bdbf2629782d03da84c293935b32981338465388ac6e530000000000001976a914968554f356609a8b80c47ea6cac829639e02523888ac7b530000000000001976a914cd3b03ebbf1193fb4ef0377f60f0de1fe34aa25c88ac84530000000000001976a9141e9adedc9d472b9c73de8555762d5e0df92357cb88ac865300000000000017a914bd59ba2daff5c46ee1ecf965b2c626191b87c6b7878c530000000000001976a91468cc147434ed78222151394fd7757f749eb41f9088acfd530000000000001976a9145e4df062854dd068d5d1b77dcbfcf8e44654d20c88ac375400000000000017a9148efe7b00f16421a5e547a1432b623bd51653a32c87415400000000000017a91486f644297a2e36371c33c359ab649385d05362a087a654000000000000160014ba4c136c7389924a1a46890d95ada425089fa10bd85400000000000017a9142c4887dd0dd0b089b8148863d632c3fe65810e4387f3540000000000001976a914855598d392a758ef51d6e1576f07597b568fa98c88ac0f5500000000000017a9147e41c9fe85bbfef2bfcf2bed10523d131a0d6cf8872c550000000000001976a9142094390ad709ac28928a4637a76984df5828047988ac4d550000000000001976a91412eb03c0bfb24f8d4def63c6f7043e827e024f8688ac51550000000000001976a914e54b74239be0e7b97d1a462c06fcdcbf23f88fcc88ac5e550000000000001976a914d1afe4d690a635302a26979c610bfe5bb84a8b7f88ac81550000000000001976a914e1ecd1a738ba90d178fbb7910d5bbd48bc47aa6288acb4550000000000001976a9146b829067b73c46623be9884d0f3896d9bee5adec88ace3550000000000001976a914f27406230e4f9ede480429eac41a8994b772108088acfa5500000000000017a914f1662b44ed2ac36643104f757c97ff022db68e5287085600000000000017a91424a3a12134918241c13e4b75624ec99fadcd3695870d560000000000001976a9142050a1fa0cf334d046f410b953fffe5a1106c3d088ac12560000000000001976a914e979bc5a2edf1f62b9946c2676b53c770cff392088ac415600000000000017a9141e493a0c29d84f733e1eeccb312b67b06aa7474f87425600000000000017a91446b2ea92771e97ca979a83ed290eef616aeae58a8745560000000000001976a91452982f020a0eb613eb6f57eea00952e253a14e5788ac895600000000000017a914dbcf7b82c724fbdac5b405d78e16378231f29d1487be560000000000001976a914d9b467d813ead2618ffaa131b83f8a31f3f5430288acd35600000000000017a91454cad422d3ae7ce9dd5431ad8caf997ee28b6aa887e456000000000000160014ae76ed30813f21ed76dbf906a3a3acff67666968ef560000000000001976a91485fd6e15fc9bb0bee844cf10afc498137ffffb1188ac335700000000000017a9140a8e1ab94af59eec0bb976719a2aa7af34aeaa378741570000000000001976a9144ff24e56ce7f9af93ca75bc3084f8853298d869e88ac655700000000000017a914b85563a51be96b3c4baaf7b7a4af83c416ba3fc38787570000000000001976a91484ee7ae2621f487496e1b3b232953bafb0aa057c88aca0570000000000001976a91494fbd153370451b983b5aff1a0a2c8477477742c88aca4570000000000001976a914d9be3faf90877ee47a4e72a1119053530d674d9f88acb95700000000000017a9143f332c043efce0e24ca0f919b5b4003a620c221f87c95700000000000017a914feaae20d170e9291c876d1ae3147dbaee74fc6d987dd570000000000001976a91486c06640cbe72b397255a1a84c70815fc67258c288acf15700000000000017a9146f1efb45c7b784262defc3e4320fca16141a1dbd8724580000000000001976a914d6d58d7544fbd975b04b3f854b7c1852fada090a88ac385800000000000017a914f36df06705a4795a6d286de05d46f2c1a496bc25873f5800000000000017a914db4d3b6258a5c98d350c2aa8c6bafda0764e9e19875d5800000000000017a914b233989f2d156c602870a05c924743a9c132f1e787745800000000000017a9148c523b49580911919c17b3ed97717f329a5a1f6b877d5800000000000017a914d8e03b84d4126d70d44560db4eef8a7ace1731f98789580000000000001976a9144be64c006580ae32cca718b76e4428980e7fa9ea88aca258000000000000160014f9776da08419b47fe964c945e56f983e07d4e4187a590000000000001976a914ecb77c3233fd0a37852f77c8ea4efa745118ddd488ac7f590000000000001976a9147f1a34956a418ab45b09bd33ea4643131738167588ac86590000000000001976a9144e83e249870d166c4178019daf7cf76a0e3e207888ac905900000000000017a91466db14c8eed50648f180be5610c31444dd5790b98793590000000000001976a9143c82b37f788f10fa34d331177242eba11f64379288ac9b590000000000001976a91474fa228fec2f7d54a4efd8ebb597ef3185b071b188aca85900000000000017a914ce68d707eefec94ff905c0938cca47cc1ae09b5b87c25900000000000017a91421a385ca4adf7d780c129ac906c80cd0d9f15f8287c75900000000000017a914466f20fd0f1492885aa3be5ae30acb8dd5a263c087df5900000000000016001496d6c686cbba9817aa33abb861a03bdff4db78d5e0590000000000001976a9146359f4c250f7f894f4cbb683df3c441adb83805c88ac295a0000000000001976a914400f975a02b3bc43f2bee9a9edeb58b06ede5aec88ac425a0000000000001976a914392acc6846142699a4674ab5c048ebc4d3c92b0e88ac495a0000000000001976a9149fc23d1eb2bc405a1d46e434ce2fcbda8f1f747688ac615a00000000000017a91462995348d9cb854b65f0f5c64b69ea4a30046e3e87625a0000000000001976a91409f6b90cc790481a25e25bf000ccc00033a3fec288ac8a5a0000000000001976a9141f548772ed34d83ad083aef6348ab0b4a4470e9b88acc55a0000000000001976a914e639b0093c3d6a051d201b82b698a3c19489d12988ac095b0000000000001976a91404ce825a9890487dcea8d045f94e393f3a64675388ac235b0000000000001976a9146b57dc9593f5513929cc6bc16a53cd04be1a799688ac285b0000000000001976a91462bbc84d9a54ca133700367a3ca171115e86d27f88ac485b00000000000017a914f9de056be09adf9ca581e5cd8f454c5a4651d5d787645b00000000000017a914cfcb1e45c0786e9fcd59c3e5d6f46a2322ffccb2879a5b0000000000001976a914a0727a3e9c517d846c260c1127863e075c8fe80988accb5b0000000000001976a914eaf4d459bfb210de76a7d438916782e94e7e834388acf55b0000000000001976a914c4fc27cb1e12203be8517a4a3061a81c6db086be88ac215c00000000000017a9140ae3e8f69fc12a517f148d6508d946aa26467b39875b5c0000000000001976a9145b07c429e4083d949cac66634f9729ec29a4273488ac8a5c00000000000017a9143f969da61ead77ad1d6ac0b1a99e9c12f2579c9c87aa5c00000000000016001463ae5ac131b007e6363063e8cc7b6c6c92fabaafc85c0000000000001976a914870106dfe3f4db00c7120607b1bc30ef43ae314388acee5c00000000000017a9145394badfe876219de8549c1a9f7ac2ea0271a15e87215d0000000000001976a91413e34036c6a48568f7217c3dc311815bdbae11b288ac965d0000000000001976a914fcc58643a712ef293a39246a9111c84a53be64c388acc75d0000000000001976a9149f5c3e3110d675e7109ebec7b723acae247ff2f388acc95d0000000000001976a9145ae827ecc3180f08db7571e89ad9aed6bbce441188ac4c5e0000000000001976a914ea1f90a83f923a055c26508cda0e838a15f06f1288acb95e0000000000001976a914a2b82599fa1720d4349de8464a32a5a9c5e891ac88acc35e0000000000001976a9145b37fa4d10a5322b8bf2fe3d75cde22f9265867a88acc85e0000000000001600147fea5560d37df232abb701b5882412f15ff1d4b3315f00000000000017a9141e885c375fb48e1ffb94dd19b652678d35d9391487355f0000000000001976a91438d9a72ba2bc63f7c6dfff84f09dfd384986a81488ac445f0000000000001976a914ef675d345e4be97c975f8ca5a5e1457ce1ba826e88ac665f0000000000001976a914ee397dff6e964b5cfc5c47c80e1f01ebdb7b2b9888ac995f0000000000001976a914c7ea5c89ddebcfd4cb568400d23587f9dbb5b0bf88acbf5f0000000000001600147e2ac498ac3589b82161c22b5bb72e09cc899117df5f0000000000001976a9149514ed8699aa289650691bc99bcb33b011298ccd88acfa5f0000000000001976a9149c8329ca7517381cd883c7b6f798ccc0c712753288ac09600000000000001976a9140fa603fc02c87bd4811f2cecd2b2b73045ab429788ac58600000000000001976a91407eebce2aa41a1b79e2f759660f39d8033629e9f88ac67600000000000001976a91460bdc741deef69e1678173731947587f06d8542488ac9d6000000000000017a9145867b2080fc275e6ea133ad7dd5ba4d89fd461eb87ec600000000000001976a9145035254c855d1ee1f0cf18e3c4f07b7fcefa60e488ac05610000000000001976a914740cbc037a90c64622bcfbe5d758e165af79c4d788ac08610000000000001976a914f0f611e336142d2af5ffa724e5087ff0d0e0f20d88ac77610000000000001976a914df3393b54f3360083780d99197e9df6d3005b99288ac7a610000000000001976a914bf53510ae14080acaf203f3138c9d5dbbc20bd6488acd26100000000000017a914f582f68cd263a7685eb02af08bbd710fd8e2c3c987e06100000000000017a9141f4f8c6015307debfef7c2d3cf5adf1f92b50c0a8701620000000000001976a914bfbb7c1e8078ce366eba58dec7c9b33e6701d93388ac0d6200000000000017a914cbea53be21e1176eb44104ecd60ba05eaa5f19a387346200000000000017a914883f55a6f9421ea246200718c54872af57af4671878f620000000000001976a9145e3d51dcbeb599e31d3a004cdf3e571d8797b23a88ac9f620000000000001976a91434277b991ac13e4480eedcbf5abcdd730304066e88ac02630000000000001976a91471b39eeaf377ed5c1ab4db760512a36a78df933a88ac5e630000000000001976a9145d70f2ab1526ed80213b8fdaa309f6343358b9e588ac65630000000000001600147ab38496d808c3cc7b0442d5dc006f50c0876fc4a76300000000000017a914d93961738df923fa12e66e5eec4a0764ee0f16ef87b66300000000000017a914aea9a02309eca4940131008f4105be9fb2b866bc87f86300000000000017a914ac5060de751aa658b3145ed30287a86844d7864c87fc630000000000001976a9140733ccda5d67e7855def597e6fa8b5c089250e5e88ac76640000000000001976a914201cc5c854770d6de2fdfb3b2c15317cad99bad288ac986400000000000017a9149d2e44692715a4c696e30f8e9ecc158dc5d65248879f640000000000001976a914065efdad84a546c89ca226d125d2b209c48f046988aceb640000000000001976a9144559ca764557be659024cc9fea8df130b5b6bde688ac0f650000000000001976a914bb6c6affb9e10576ea35a07bfa99c5cfcc50293488ac5765000000000000160014b8d51150aadf79dd7f70280064e33431ea6a768581650000000000001976a914ef6c4d05ba7dd1252f34d4507053122e0bbb9b8c88ac92650000000000001976a914207be215c47c9bab0cd838a21dad0f185e74dc1188acb2650000000000001976a914b380cafb448974656b912c33b7c18ced0914946188acba650000000000001976a914e0709b1797d28f1d5d786cba704390e22b9e302b88acc1650000000000001976a9146804c65bedfad65cb4a3280ed6fe5b5713e5bb4088acfc650000000000001976a9148cad34e21991c3154012d74abe9a7a8db342fbfc88ac0c660000000000001976a91438ffbd0c42a252ad3dd9389254c987f537c8583388ac156600000000000016001464831a8f32882cef5ce6f3471017dda8ce76c62484660000000000001976a91401dc48681149dd416be9d44c38820c0d25c2eb9888aca0660000000000001976a914ddd9609e01d3ace6053ae47d02ba00fb481f062488acaf660000000000001976a9147eebf5924495937e27238c964c2e64d0dc1434ae88acb666000000000000160014f55c86a1d16345c3dc72a3992e32ef19bf661830f5660000000000001976a9147aff37b929c2b4cc8d36064570504b716a57ac0d88ac1b670000000000001976a91477cfde8971f6be00d7cf16c09eaf159326a7360088ac596700000000000017a914d558c41eb5fe7626bf174a74884d61209cf101e0876267000000000000160014f7398f40f0ffac904fa02b2fbfe277b6018b976a75670000000000001976a914c5a85b20feb42a58a7c620722e80cd4018db25e388ac776700000000000017a914e4242797605a21693c2ad5ca0b8aa135fae9296287c36700000000000017a914e897c146cb6455abd2335193a8698a64765a0e3487d16700000000000017a9140a86c7a2e232cdfb4163bbfda3dec17453644903874c68000000000000160014857ed15c4d8df21f573942b9515797ae48fee0105c680000000000001976a9144e4924178dd1ca1c0f0be37979172925bcadfc1e88acb7680000000000001976a9141a4e5b3b4158c6618b74a9022c401f408c6f080d88acb8680000000000001976a9148ea63dd9419581c06f963368a59b5b167539940988acfc680000000000001976a91446240d4aceaac971cd67d03d59b554610d22218988ac196900000000000017a914ba3111b9dee11cc5258b295b0a14c75f80767bfb8735690000000000001976a914dc7e68b9cb60cd20ddeb21dc4d637723c2a995a988acb6690000000000001976a914d822518ca79c913c87688c7e4ceed32775347e0088acbe6900000000000017a914312e772c097caa1fef54309430e42ad0bdd8980987c0690000000000001976a914dea9761c78478d6877c5f2e6c6b484a3614d38b988acd3690000000000001976a9149bcbcc2e66c84b04d577d51c6a14497683ae871188ac046a00000000000017a914a9bd42a20ec269b6341517da0b712f0de9b00b9e87066a0000000000001976a914ffa7c6a764f85e7328d5da689c2c84142db8fd3088ac556a0000000000001976a914b637f8da95a44fee6325e00cbdd25c4eb5f04aba88ac636a00000000000017a914d67619919be51f841fe6678f9f655c3a0742dd8d87846a00000000000017a9148c4699f81abc52daa34a24890bf622b798649ade878b6a0000000000001976a91407868a644a42951ff06d8a7a9d2b55b951d3805e88acd86a00000000000017a914f5c0e1f8d42f8416c7bb46dd4a1ba82d4c149a6c87316b0000000000001976a914d9e40f7cb18b5fbe34a1546f9ef5d2c6e45df4d488ac696b00000000000017a914e1d480cce19a4bd46e252de294633e9577f229a887986b0000000000001976a9140cc011474916a0ec7d33fe943e8b91334a54272188acb46b000000000000160014c522f6d47f15bef379f0d6e6ac3bbbfd4d139a0bba6b0000000000001976a914a41f281fa4b05a22613542063828acf81752110c88ac3f6c0000000000001976a9143e9920c2ebfa821be1f34b3a2f5a6714b2c4615588ac516c0000000000001976a914e99495a76e4b572281603f074bbd7ee6ba7e759888ac9d6c00000000000017a91492ce31b6d9eb9f5a9171759550da462a60106b2687096d000000000000160014a0a0e623e5425fd5dc59bc562dab9d403dd0a46d296d0000000000001976a91421a272f3ddcb0c41c89d2805e38a71c090404a7388ac2b6d00000000000017a9148f6af68894a09965f5c6fd205b14de4599fb943d87356d0000000000001976a9143b5d57df00154baaeaaa0259ec8b7e7c96c45f3288ac666d0000000000001976a914ac5ade92e151860244ae25e0477d32d50ed2bf0788acdb6d00000000000017a914e3c438d4eb2563346659ee5aa7abc0c9b6fd347687dd6d00000000000017a914cdf40c37113ee0dee4460c05fb115daee09b5e0a871d6e0000000000001976a9144844a5ccbd27c1c95397cfbbe9196832a20a0d2c88ac216e00000000000017a9144c0dd64ac1a9b2a711ff2da4715d978f3c26c6f687696e00000000000017a9143336d540a800acd9fb13f941aec6c9bb86f8a8ea87f86e0000000000001976a914f6a29740390c84fbce6b006c77d8a3e29e586bef88acfd6e0000000000001976a914568f42373c593c1021157474cd1fc96effbfe9ee88ac0c6f00000000000017a914948232170913af2675869eeeec15f438701d29df87356f00000000000017a914ddba3dfc4b35ec8705fa05b756424923098e4a8187ef6f0000000000001976a9144ba050839717e47edf9c4f60b00f91e71cd376b288ac12700000000000001976a914c9aa72ff52fd355636b3b291a6dc52f866ada5fa88ac29700000000000001976a914733588f08e19dbeddf9701181bf5619977ba81b088ac56700000000000001976a914e31fa758c34fc5cb8b1d6d19ec6c417627a93f1888ac74700000000000001976a91496187c31a47720c290cb5a13dcca8da533d4ed4588ac8e700000000000001976a9146178377cbf01ae926a357edce31bbf70e8fb807588aca670000000000000160014b18910404ba8f35db3d0abfc306d04a9eb6ea5abae700000000000001976a91461d42bcaaf832d3f62e6472659c684e2d001569388acbd700000000000001976a9148ff9e34d378e10c09a708b74ab4af26acadf344288acdc7000000000000017a914ab4a99566207594c734d60043c36537fac39168c87e7700000000000001976a9149ce290307ae0df444dbf049b223ff51d703f476588ac0b7100000000000017a9141e6a88517e8e73b3af3ed1eb2d367c32537381f38766710000000000001976a914250d04919fc6bae56569ae0e018d09058608ce2888ac6e7100000000000017a914cba99ab1fa77cf4e1c2740a2c0ab6988cc2914f9878b710000000000001976a914066de2171da24384a3f22a66be9bfee7a9617bd488ac977100000000000016001450c7909006c1088103ab00c2eadc8454958f25dad0710000000000001976a91465376e6dee13a6a51a24f65ce2ce97dbd263222d88ac35720000000000001976a9143a89c380420b2181f19f2a4ce017d344db4bdda588ac7d7200000000000017a914c1195fb567d88d28daf1d1be864d6e83aae76e2a878c72000000000000160014b9c5845a45d45c05081a81849d068f9a8e9bd413a0720000000000001976a91496213e7552737ad3e007c2459145b0fbe7addfd388acee720000000000001976a914fd89f4bdf8620740f7f025d88919520f07d5b08b88ac05730000000000001976a9141a1dcd6df8e663f2636b0ba43b1ac0f2f522682688ac537300000000000017a9149db3d63ded8a6c11ae407b43248ddc6b9b487c398770730000000000001976a914f9490be92356aeecd4ab5f9d33aa3fa75d20e23388acbc730000000000001976a91466b1589741333152376041011626973ce5a1a67488accc7300000000000017a914337567d728c458431ce1d3cb86ed4896dd9787308730740000000000001976a914a25866ce07884a0e38e5dfdc00b81b1111d4559888ac46740000000000001976a91472d3236548673d183a88e97b30d679e39e63bd8b88ac60740000000000001976a9146d94cb3446fae9a86a62e4b000b1b07ad2838c1888ac89740000000000001976a914e34175a5f40ce84677f67f2a76d80add580317bf88aca9740000000000001976a91441a035964cdf58bdadf811558b412feaf4464beb88acbb740000000000001976a9148bcf428ca9f98d6333d1662d79a17380427a686988acc47400000000000017a914da546d8ee35f285596a6bdc7b508461960189a9887ce740000000000001976a91454b08e551bfdd06123219850fd45e890132c13d388ac46750000000000001976a9145099286acdbb193bdffb697228f6cdefdac7617588aca9750000000000001976a914dc2b08573be930aaa03d9ed494976ecf935c043488aceb7500000000000017a914d61d5775d8ddeb4731848152af7462a9b4e8d47887f17500000000000017a91489b25216045e8770f5a72cb3be85253b47b2f6c28720760000000000001976a91408a95366b4ed1fbecd60f33227b44ea887fc8c6088ac3e760000000000001976a914f0c1859c53b3b2b5cfa8b520826c5c250bf29dd188ac8e7600000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987fb760000000000001976a9149a62289a61a004a86f534774c076e8c69bbfc83a88ac4d770000000000001976a914eb269ffa6b7ba805faea41c38c46afec2a5c0d5488ac4e7700000000000017a914dcc0d64c28a8122718ea955c2d45eeb209f550e887557700000000000017a9149c1085ea88bd7342dd3759ee106dd50850d7e82987e9770000000000001976a914ef562d9b853c6236a93536d4fa0d4f1a398866b088ac2c7800000000000017a9149cf2922838f03d1f1864667aec9fa976eca5b6bd878a780000000000001976a91409c755adf2a65a304ab5f3cc32b01de8c587845088acdb780000000000001976a914ae78e1c7febee7d4f5844975b7970e8d8c7a253188acdf780000000000001976a914decf5ed84abc8cab3baa9e49cc88e37f8f8946d688ac1a7900000000000017a914d2ecdbcabc6a2e8b9984b8e99bcadc25ffdbe0ba8727790000000000001976a914a46b719935de9acc728a6600622720d061ee47af88acb67900000000000017a9147f70277918e01ca315a9c2a7f10421756247885e87de790000000000001976a91429405cf02f6f7b722a251f13220a26a85212f44188acee7900000000000017a9149846208e48729f2161b43564b3ec3e42f8fbf06387487a0000000000001976a914cffcac675902a01166a7eab0243ca4c8828f0ff888acba7a00000000000017a9146974e061f2a56115bc12ee728e689662afee529987197b0000000000001976a9142c44be13bd8f6d66449ed396e0678814729e20cc88ac247b0000000000001976a9143f59a17e6ade8052bac174e247eb00e559b43c9c88ac267b0000000000001976a91406d66f9dfb52282d9511d133db667f3876789a6888ac3a7b00000000000017a914db76a1ebe42a3f8a0194522bdaf2a51be2329efe874b7b00000000000016001477d26881cf61e494c56ced53947836be651251ee6e7b0000000000001976a914ba679039360ac2a1868007b332a039eed8a5a99588ac797b00000000000017a914fb855b07392b315b581c3625571d87841530b2bd87bc7b0000000000001976a914d27f1b28336d4634b02f1b926ea14f0b8ef98b6e88acf67b0000000000001976a914fd2ed26079773b9baf306cfbc63cc342313a686e88acf87b0000000000001976a914686578501243fae4680042963811488e2a35b4a888ac577c0000000000001976a914a5e069f8447f33f17d59e63c198bf8c08852672088ac8b7c0000000000001976a914bcbd032fa7822a2fc96162fa8bd830c6568b1b2788ac9c7c0000000000001976a914b8f81d1e1fb0d11a66f28743850fa896bce7855688aca17c0000000000001976a9144a13fe8c75c092327c4717b96ad8d03b7e96133e88acb67c0000000000001976a914d4cb9a683aa7e62a7eaea7d639bf12f2977d9bcc88acfd7c0000000000001976a9144aa6719c2f902d58114e498d8d95b4bcd83041ef88ac117d00000000000017a9144476f06425735bb8ef0e083808e146ac90eb35db87307d0000000000001976a914d518f80dc461b1e3a5aca2ebe434766e27dfb1da88ac737d000000000000160014e6a5e63371e8ac663996ec80b4e4d1ea5f619f80937d00000000000017a9146ef14a389893a6e3e7c9979a8772576c1304c43387b07d00000000000017a914841b77bd5283866d537e39d829559b300a8d1f0c87c17d0000000000001976a914993078654865431ba70b236ae7289726fa8a7f0e88acc27d0000000000001976a91490a7989e8016ff8350ee3c6bf37bf2d1ca9c9d1c88acd37d00000000000017a914a356a410ea0781abe70e62486aec8ce3617e5cb687e47d0000000000001976a914fce228060aa565d02f3a1c570b1f353c31be42c488acf37d00000000000017a9145eb09c606b55eaa46a19ec4eb0b45a532e3844c287f57d0000000000001976a9140dcc3f48352e7a55da7e9816be25e83026847f8788acfc7d000000000000160014ff97d78ec0c5b45992a0508efe7780bcf730fea2497e0000000000001976a9140d93654641e6fc537208ea458761d9d4fc3b294088ac4a7e0000000000001976a91415eb9d6e215d492ded418e7fb2d081bc96235fd588ac627e0000000000001976a91407d6109752ed6db9d376bfd27331ac45544f4f7288ac6a7e00000000000017a9144e53d2d89411b903ad83323e82efc2cfc908f1f087747e0000000000001976a9143ce518e50062258a427f2d2fc5833ccd8ca5e5f588ac987e0000000000001976a914ebca207536d108fd02c09e702e2d811f2cd6dd7488ac947f0000000000001976a914c6d003980125ab4dc68dd333af375c257c709fd788acb37f00000000000017a91412f48751917a8b0bfccd8efde2509144b433d4fd87d07f0000000000001976a9141fa7ac872f6d48713b240014d1033362f0d0edeb88ac12800000000000001976a914d71b8a627f2c05272ebf665309447977faef637b88ac148000000000000017a9143b1b0070686d3abb636dfbe6da9759d06a696dd8872e800000000000001976a91448d0d435272177bda749772c00d50e7a44e5355a88ac4f8000000000000017a9144e9c1d89abc1f0b63cbf1c5a0c7e1829230baafb8753800000000000001976a9147e542a6579131c4b11498446fc2797fc7a1b05b788ac568000000000000017a9149031d6eecebfab065063f93c977aa7b24accb13b8758800000000000001976a9142de1d8b4154df925fa4990fcc2f9d63f816d873f88ac64800000000000001976a914a2f5560188de5fef7b3e45f210e93b3a7fac853b88ac7e800000000000001976a914ea7a9bff1e98b98d055c5f8baa6f331f7a842d9f88ac9b8000000000000017a91424c61e2d9294d91bc80c8fdf733abf6934fb34b487ff8000000000000017a9147e392193026017920075d9d037c70e988ded0712870d8100000000000017a914d1470471dc92ee9431d1cfed7f72dec880bf29838754810000000000001976a9144f5695721051410c6c2f0dda37ae141a3dc1c61a88ac72810000000000001976a91477ccaaf0a6e96a6ba9173323eab62c8214beede888ac7f810000000000001976a914723408d8d6e23a03d7121d74b0c13cec00d5bb0188acb781000000000000160014f44e24c031c1ef09715f81fec45c0de18720bd7bcd8100000000000017a914e68549845d7ef5fbb21c3d0a335e1844a1ff45fb87fb810000000000001976a91456716c5f4f0acec607297f777a4bb8d0bdda947288ac02820000000000001976a9147bba526f670298c464a030a763ee2e09cf56845d88ac33820000000000001976a914a16dfdcc9d0a63e4f4e9edfee6833f60035abfde88ac8282000000000000160014a91f798a2a37e0b2d2a50b22450c93cf6cdb14aa8c820000000000001976a914def9ec61fed512cb255ed09781f7206cd841924f88acae820000000000001976a9140982879ccb4a08b0d5a6d6e50a021948f4352f3e88acc4820000000000001976a914233e1acb1f8f8e53a04e6307dba30f6380e2517588ace6820000000000001976a914c922971e981fda0b2981f727e67c8b5714e7b12588acfd820000000000001976a9142fd3a38822af991a84743b2b8352beab336bc18c88ac47830000000000001976a914f950a1847394e330a28792460b1ea25f9c5f65c688ac6a830000000000001976a91402ad90a084d6a6759b4c26ae161133dec6b04d1588ac868300000000000017a9149795225ccefb773a4e2737c3fef36387280a4b9f87c0830000000000001976a914eb8d77b87d2ac04c3a4071f4808606ea8487ef6788acca830000000000001976a9143cd7e464d48e7965b5534682e25106e32dbf773688ac218400000000000017a914064ca1f04230f3d81f1916bc995465b7ea76d2b68742840000000000001976a914fa16bf5d1536fdd0fc4747131cd4bb5ed0ce5c2488ac4e8400000000000017a91408baa93abfef7ef28b7c10fa3a0aad32184c791b878b84000000000000160014863d02d231aaad2ec34ac7c0fbdf6c76d2eb4fe594840000000000001600142763b18c534e8aa6f112a759f535010886a596bdd9840000000000001976a914ee4d0570c7726e4de21c5c17d741248469c535b688ace58400000000000017a9146dcecae1d12915d241143953c6dbd00c33015bd1870c850000000000001976a914a4a03545561b32f2bc2d903fb13ec082cba230c188ac7d85000000000000160014e9d0413261b3023f78a29fdc86e1bcc158fe1eb2e58500000000000017a9142cc6eebaf13ad30d423d88af29e97616cd03e6738703860000000000001976a9145761b1da84255e87f8885f8023fe7219820d860e88ac6a86000000000000160014d8e098c4271a4ea9a9bdcfdbba888e53b59a6c329b860000000000001976a914ec27d47c4758dec759f46969f4ddbcdf2904467488accf860000000000001976a914c38caf0f80b17ca3e345d055777c11a6ae57b43988ace4860000000000001976a9142bde2f0a9b6f02e234e5c0e6af4d504ebeb6153b88acf78600000000000017a9149a7f89f0d56cc35a3bc38f9282698c45b37e897c8701870000000000001976a914647dc482657d85be40899ba5c1dc5f10a231081088ac7e870000000000001976a914b3a4c6522f31afd55921a9ab6c3818d81a5ceed088acb087000000000000160014b7f577ac2dcd71dceb58d8bc82b2c9b1708e5ed4ba8700000000000017a914563f42799c452740a92cf308f9c33e7d09f6254987d7870000000000001976a9141c372601886f62e4131c47f7f6b6d98c82e6e6c988ac018800000000000017a9140d0f8bf8950e2403bace410a21340c868b7a0a9d8705880000000000001976a914bdf60038fc18e63645cf94ea657bb947ee3ac2c088ac478800000000000017a9146f45cca6176d2378f289f2a4cf621d655d8c62d3876d880000000000001976a914b169b7d2820de46ba0fdcfa7a6a2048143a9675a88acec880000000000001600144be61994a8035e6a7a97d383451bc749675738b1ff880000000000001976a914f2a33079cfee4f4cde6eb74331b0f551c82a20ae88ac39890000000000001976a91470b44a190502db3ef96a1b6a6b8f8f85abba522988ac458900000000000017a9144e53778af8980c6428e8c5644d258b8e8e94eb348754890000000000001976a91478ee25f5b3accaa64b6184fa43a5788d909c813e88ac6b8900000000000017a914e2bb12e39444775e8dbfc52516d398a289c51be58772890000000000001976a9141d85c742e0b94326bd07d461d961e76f8df3cfb988ac8f890000000000001976a914b94055b030b029f50b5ce5973faf0d94970242b188acf2890000000000001976a914f20c0e0bdbca1354c51c8ba30fdbcd7f28fad59688acfc8900000000000017a9142021847f09daba132b315722ad23794cc05e9a2a873f8a0000000000001976a914341e4663a7fe27abe0f921e51a5d44746254feed88ac778a0000000000001976a914daedc120b9ea56a00170ee749a9267e97e91d71288ac9b8a0000000000001976a914bfad2a872613be3c7e1693c74ad5b964b88c12ef88aca48a0000000000001976a914c87f49a34b815a8962d751dcd49c882786e7af7d88acf98a0000000000001976a914fc9ad69294de511cd0fdb311c51dcf5d78717b0d88ac478b0000000000001976a914d68c2eb65a33b97beed91bd47417c03db8c84ed188ac248c00000000000017a9143025b21e856b2d47b20d8115f5c2ea580264dfed87278c0000000000001976a91450e76122a6202bdf3d2ecc48e002b86d19558cca88ac308c0000000000001976a9149514ece017062496a2a13b45d9a144ac67be5be488ac988c000000000000160014eafe747916af7651de299b0035cf5b08b4946d3bb78c0000000000001976a914e8c213fa8fd05cd2c890c61b75e2d9cf02cd01f188ac018d0000000000001976a91457a02406e6ed7cfb72341e91f19d08efc8e4698488ac098d0000000000001976a914e05f7848566feb43ebbcd323ce231c29be24514088ac3f8d0000000000001976a91423dd903344c5bd12c533826f1367b46eb9865e0788ac828d0000000000001976a91411f8727b571a1f577bdf2a2cba80a3db16ea299088acbc8d000000000000160014cf8d23c9782f7f923cb3f18736d63fb7f1e44b73d58d0000000000001976a9140c11a9275223c956cd77d0c4f548a4c591f8164a88acd68d0000000000001976a9141d4e5ddc088e653fc9a1f0415d45b9a348ac9bd188acd98d0000000000001976a914a13d18532e2b4db52cf69166d46a59a085148f9788ace48d00000000000017a914005f46fa96d930b89b7f3eb4d40e70722e7515b087ff8d0000000000001976a914a467fd0353c58ecca816034c061849025a0ab3f588ac3d8e000000000000160014cf8d23c9782f7f923cb3f18736d63fb7f1e44b73478e00000000000017a914e14e5494d4bd03a24fccc64716f5a94488cdfae3875d8e0000000000001976a9145b02303ad2a8b2b87e449aaab3f983ff0568fa4888acd98e0000000000001976a91466b3796035ad1d5d1782d238863e581a173a104788acda8e00000000000017a91445c9602a9b1083cbdf3abf9c979a878187b4622887398f0000000000001976a9145ce2290c3816d205fbe5a64b3a37b400115b41c188ac448f00000000000017a91411118838f598f7bf9f909c14e44c65341872cae587648f0000000000001976a914fe4d323d98f9006ad42f2fdb245d4ed462ed6f1088ac658f0000000000001976a91474cda2a782a49b95dbf9ec089db45d2d05984fcf88ac688f00000000000017a9148c98f4b6f57ecb289d96f67d17c7b5a0a21b31a987958f00000000000017a914aa6a82d1f686e801facde73127fae4f2c5cf19e287b58f00000000000017a9145e383e13ce9f797ffd4de660e9b5a36a8390b9ad87c48f00000000000017a914de7e4e027da98d238aa223df9dcca164d53047ab87ee8f0000000000001976a91414eecf2a474e7d5e13cd478c6fe4a6ee1dc18af588ac23900000000000001976a9147df4496940492c00454e63a2e3429f7237ef368c88acd2900000000000001976a914a0b8839c23367b2b2835a7563676361c7f5f2d1388acfe9000000000000017a914c38b7c1ee3d8d7f147c1ca43f47373a50327360c87b0920000000000001976a914cb0cb0a72a5ec610929e84b93d4701281bed0a1288acf0920000000000001976a914bbafdbc79624038c2f2f883feee594f1fe27ee8388ac10930000000000001976a914aaf444f0386f0a12ae4fe310bbcacd8453389b8288ac1c930000000000001976a9149207f53896f49fda3415738e63d0b2588ce5a09688acd89300000000000017a91406a8acb9e64f7282232549d3badbb246b723985d87fb9300000000000017a914c9c8b9a9e6aac4e093f1a9010a0d212faf9f88f28743940000000000001976a9143966048c71599ac5822f894c7be668b2a154268288ac65940000000000001976a914cac7a8876cd6fe3091e803243fa277416b6ce67388acac9400000000000017a914d8d67aa0eb72949c784f562c84bd5aef919178b887b6940000000000001976a914afc95ccaf32935194b6796746240aeb1eddf9ab488acd39400000000000017a9147dc8e53d46524422849fc0055d2c77b5bd5693aa879a950000000000001976a914c5812b02b3fa87777b04b88d9ec397b66de72ff188ac07960000000000001976a9145b2f26132af1e3698120636967945165ab5375c988ac1b960000000000001976a9149ddaa04c5657956a079ae9f8173a32e7468f3c9288ac5b9600000000000017a91407b785c47a03fb347ccdfd7a822af397362aff2287609600000000000017a9146690d039916bc5f93ad21d272bc258ccade0beef87659600000000000017a914c38a722c242902564ffd0967785aa66c58f6f99b87e8960000000000001976a9149410c52da94a2de571e7487517854ca59bd5390e88ac749700000000000017a914463b9ff221eea410938361e30d158b89b6b731fa8792970000000000001976a91426fc1c5d2f9992551db72337ae14826e464301a588acf49700000000000017a914c7ad70b0370c3562d6f84c5e1a7844421cebf3ac8702980000000000001976a914b8443320d054dfd540244bf098ef14ba1ec47c6b88ac0a980000000000001976a914a855ca14192e27f500710d493ccac26192828f2288ac11980000000000001976a914985c51248e13d26bfc0517d714a617c3e11e3e8288ac1d980000000000001976a9144c92fca7631ad4c870239228e091ad85bccf445e88ac42980000000000001976a914ce3cd649f1fd91c63d8c56af28d824eb8c356f7288ac499800000000000017a9140f19ef9a7339c1bea335ee103d630698846555ed87589800000000000017a914130e8cdd353e98080072a6294fe0b5e0a5ef894d8771980000000000001600144f4e9d597e6dd47552c6cdebb0ddfe23c48b1d2e72980000000000001976a9148a84efdda90dc9cd1f547f39a30ee9a0bbfef3f988ac88980000000000001976a914143c103a8006b0755bf967f1bb065b3600837b0988aca9980000000000001976a914da58ba5bdcf7b470da8af49a15c049b9c902417488acf0980000000000001976a914c547bb42f12196336469a4ff2fb2d59c8dbe2fa988ac2c990000000000001976a9145dabd63d6ae392a9df2071329bc666b9a3d07fa088ac3f990000000000001976a914be1fb4f9c2ff8e618453fad75934253ac335008988ac61990000000000001976a914cc84bb01dbb049a466b747f285c0f09b7873e07488ac8f990000000000001976a9147c20a7d931f9878e02287ea386236884f7526a4788ac979900000000000017a9145049708a1aa34eaf09c195bf04ac9f51b96bb0fa87b79900000000000017a91451822c32c2f2c635a0bd6e8eea884f9d9995b22b87de9900000000000017a914962ba3adea398628f038d63e0d9a79b7258ad4c087e59900000000000017a9149e51273e737e110a8f0863e6b5e5df331b7d20eb876d9a0000000000001976a9147c5e00c964423fd229aa771f398708362de8dfa288acea9a00000000000017a9140981ca9a80dd46d8b86d16d68aabc7ec1f1e587687ec9a0000000000001976a91469b161d87a9a40acb5fa02e574d2c981c737dbc388acee9a0000000000001976a91475754a1343b69b8df11aee3ade8cd4be3b2db93f88acfc9a00000000000017a914fd323bbaaf29b2a0ae2e2aac8ce7a572fc417c2487db9b0000000000001976a914cfe94ee14805a9a594496aa770ac057064b8c1d888acdb9b00000000000017a914f7a00f9d19912f642830db9a674318f104bead27870e9c00000000000017a914ccf683d63de3dc722030db3c6fac2d2bcd227cbb87319c00000000000017a9143c8873325e0386b37b9e9a1c0f540a0067411fd1878c9c00000000000017a9148cbea851b27efe2958e284463bba8fcca0b7cb7187a19c00000000000017a914916726ff27093a6f1d3b755e68dbde24809220fb87b59c0000000000001976a91447e610cefc2c34a1a075a18b4c857a68605d31db88acce9c00000000000017a9146503b07b5c7a22ba2daac1f2c7a5dc02530100a987e39c0000000000001976a9141e474d3ec52f961a306be991ee1fb32ad2c372c188aced9c0000000000001976a914117fc29b0ef54ecc505d884b72f731aba5941dab88ac3b9d0000000000001976a91455aa76e4a291dca5cf3f810b2fabf69703b7133688ac3b9d0000000000001976a914cca45693b5f5fdd64ca4f349994a60a37eb0732c88ac3b9d00000000000017a9141855b9a508e61b94d71af6d4c34e17a4c1f8e032873b9d00000000000017a91463203a3d0a2c0c3b16888f04e7c5435de92017f887839d00000000000017a91445d2743b5b0c11c9255aadbead7843b0cc0cd16a87f09d0000000000001976a91400e508cf9722119fe98bc93e63390307b8e16c2b88acf59d00000000000017a9145c98460fd08f453d3452d81a73f8ba72cc4ac49787069e0000000000001976a914dff99b0c831a5e60f6b6ced14279e4c7d735648d88ac5e9e00000000000017a914f91c86140067786f8210c6381650df4fb762edd5876e9e0000000000001976a914ffb4fbe651c4b7e2c2a4a7594383a6de0009f2fa88ac749e00000000000017a9140a9f25c06f4886eab86691efa1ae48e42d76015187819e00000000000017a91407ba5a1afdf85b78249235bd5b321400c47677b387e19e0000000000001976a914b7aad8d13c2d25a9f093fe4b192e5e68422d2d2c88ac179f00000000000017a91405a5b4a3d3ee7ff5d75efd5580cc6c103b5d0754874c9f0000000000001976a9149420d45738153a83cbfac5a686c84863f2b36d3788ac5f9f0000000000001976a914a1286909f6a5a080751776e546b6aa8043a8b4ff88ac789f00000000000017a91497130f90cfc5bb350e1cf773731f257a4f793b1d87a69f0000000000001976a9141622a44bd374b0683e5e59f8ed66f0b66ebba9cc88acbb9f0000000000001976a914485cd8a37b0cc0b12bca7dffd8fa4a7f0d15e34488accd9f0000000000001600144fca61956e1aea60cfb77e3d0aa70410bfebd8473aa00000000000001976a91489c96b99b2d450cac420770776ceaed56dbc519588ac42a00000000000001976a914c967ec912ecb634c53d5e5d8eec9c80c0f00e41088ac59a00000000000001976a91404def86f05babb86f6b219cd56da9c0eda70a08a88ac74a000000000000017a914fbbeaa79ae5119d6d32bcf6998b5d72e2a4d11668796a000000000000017a91499957d4ed3ceb9e5753d3c3febd3fc9afca8fe05879ea00000000000001976a914629fc124891e059dccfd9c9db4832cf3c52fd8c688acc4a00000000000001976a91408210f16224272089dd4948dfa8bad32f009bff288acf8a000000000000017a9149e136ae7f59b13f892b06981d8b826b07dd3d2218704a10000000000001976a914b5ae3559229ff5100229216ffb3f803ad40e025888ac85a10000000000001976a914cb30e1f4fdc47ea8d2a29880fc26343804b28a0f88ac92a10000000000001976a914b64dc8d08f63091ea9cd14d6a3896290dd0d531988acbfa10000000000001976a9145e354525e87cd5dfc9cd1c56647d1c31ad04ecab88acc6a10000000000001976a91462544242f4abca17be73cea2e0a8ba3b6dcaccfe88acf1a100000000000017a9149fa1e9074dc0c61186de4eafa5034cbbd8a5459087f5a10000000000001976a91428aac85168deb26fef11a89a290bc596e598c91e88acfda10000000000001976a914f9cbbf2d8bf215020bbb0807f24d465d364dd22888ac27a200000000000017a914831f74c2fbbabef7e5941867840d8fb9a0ec7e398751a20000000000001600146c411ebbf3388e0d1dca1a90d81f43f5fa2f4a677ea20000000000001976a9141d000a0046043f86caf707b3764133d3f8712ca088aceba20000000000001976a91434c4cce829008fe87f6d67e956ca59cdd989f25588acfaa200000000000017a914270281c65cd6a563b55c693cd6ea42be1c74d71f8710a300000000000017a91469197bd94fb5783e5f35f11d4489ae2b4eb538ed871ba3000000000000160014021ac898d99af36ad47be0c458251b2c0b184b1221a30000000000001976a914e7eed98bf37449e52027946e4234d98708fb142088ac64a300000000000017a914a4460c5e5413c09142f8fe64de6eb6c79911d23b876da30000000000001976a914cc68c969adc72ef45cdcdcf3674d547375fec0af88ac92a30000000000001976a9145da53bccf0a5b595a5cb9fe505f3370b1bfbba9a88ac17a40000000000001976a914ff3823955ea84e415ad6e944e900df962c73cd3e88ac60a400000000000017a914822d9286f8cc90fc08e68d74649c3bd6b4fd912c8761a40000000000001600142ecc3367494fb90ca24dfeab5b906ef1bfe470876ca40000000000001976a91492d11b6c3969a738cf90365a9e0596658891a6d588ac8fa400000000000017a914334fa045200b820e0fd8eb1a1d0be6ddfc0b3c17879ca40000000000001976a914a50b71c4b68d8eb7857a7e7f7566eaaaa6d9102388acc9a40000000000001976a9145ce15c08b711bd9fbcb07f6f4bfe4c94f8486aff88acfea40000000000001976a9142a0213e8b2c467037b14f697add62a31e6bc9e6688ac18a50000000000001976a9145b253754b6e0f791cdcecac7aa2a2e0eb26e003288acbda500000000000016001479f8f055eb7e9c0db9483bbeeab4d4ff056ba63cc4a50000000000001976a9149eddd6d1c6b41366f4419b3714f52b922c06b5a288ac1aa600000000000017a91428e922a26f6193c139a5a452e6b7f949dba4d876874aa60000000000001976a91469c6b8564e2d013676076a949cc81fc0787a73e288ac62a60000000000001600143485e7ff4a4b7d666ec5f0f85ce57987ab6a25566fa600000000000017a9149458a0dd00ddb9b7cebe64ad12eac6ed4d316e838787a60000000000001976a9142d99d49b87475659d9cf5e05a4d796fc9b923a3788ace6a60000000000001976a9141a4e5b3b4158c6618b74a9022c401f408c6f080d88aceea60000000000001976a914c6d1a89322fef6f4d3aa6c775f6990633901246f88ac02a700000000000017a914a6fe38f07c986d7b926a5686565e8240bebe0a89878aa70000000000001976a914c122e1005590dea2a0a31d004c47c3d420c0b9a588acbba700000000000017a9142e425b6072b10d72893a54673ac117579f05f71887c9a70000000000001600149957e51be8ec248f9a41345dfcc8b8a868e069c9dba7000000000000160014dd1bbc37d394ad6579427fdc9d45a6bd2868a534e8a70000000000001976a914ab0cc0052bdfe0eb3b307653c835e85caaab369d88ac5ba8000000000000160014d07c021c910fec83f5a42df47d9c3ed598dc3f10b7a80000000000001976a914f23d36ef509ba6133ede6afa5c508c3bb6ec604288acc2a80000000000001976a9149a3066829253d067b4ba2c7b0f9335c882347a0b88ac0da900000000000017a9143d89b6aac11694a9d371ebd6b04bd4017f30bcbf877fa900000000000017a91473d1fc375bc5c2e89f818ae6c51e3efa4b6ecde3878ea90000000000001976a9149246391280bebce430a6896245ff926298e6675d88acf8a90000000000001976a9141d73abf68255c8316233f4a9d93b396533e17e9088acfea90000000000001976a914bd2ab191c3927dce7d4384253bb0360dc521fc7188ac38aa0000000000001976a914a6f21d445757d057e37fbf5bfab960f46d93b4a088ac4baa00000000000017a91490b01afe654af48efc8bbe0f7f1e864ce18a69788783aa0000000000001976a914d497eb8c6ce81061527f76eec89be5d37f8f470588ac89aa0000000000001976a914d5f360c61698fb47d226f6782457176805dcc08888ac9daa00000000000017a91439d48d7c4ac4b233851d0ff0f47b10ccac9b150587e3aa0000000000001976a91472d67aae9a6791aa421b3cee0ed9a33a814b898988ac4aab0000000000001976a914bb32d3524adde7349f7001c4195155270f53312688ac71ab0000000000001976a914e3b7f74c7c895a42f5b992108fdf531ab177db1188aca4ab0000000000001976a91407bc214a8107cec4fc75ac4849ef985e4bb2586188ace9ab00000000000017a914709fe6aa179cf90eb56b1e49d26cd6909aaa3fb98727ac000000000000160014b4d9e7f9a27c6ec72825a300b0bcb80783f40e5ca6ac00000000000017a914f52446cb2b93c06f457fec8acb723285f54fd57787b4ac000000000000160014c9854502bf2e07dd3f86a602ec06d57df30c93c512ad0000000000001976a914289bb01b0f92c38faaa51768c485aff73de4573c88ac1dad0000000000001976a9148f153a1bef9c039a44975ed7608781692e47af2088ac1ead0000000000001976a914b79bb108a8567e3685e268bc90f037dfddbd4bf188ac6dad00000000000017a9143bf3d5f095f0862d8269d950851058508b5616ce87c2ad0000000000001976a914b87f1b53a09cdba436f2bdc955a365f86f92d69288acdead0000000000001976a914bc1ffdd44d6e0e06a63e015a9af93d8c541f96c988ac21ae00000000000017a9144a4cba25b68299f7baf13efc2d10f0680a762dd18733ae00000000000017a914f2777f2abfec8acef32e9a75d871607c111553468744ae000000000000160014f7664aa6b1279bc7f05a20156a890fb33bfee91748ae00000000000017a914b68f6e0fabf2c4d5af14a20cff19e5bebd27f82e8760ae0000000000001976a914183d4b299f8eac843346373d3e651148c8ef2a8a88acbdae000000000000160014be594c33eb93d581f986a836ab7532777ceee60ce3ae0000000000001976a9148a76901acef0922c04aa86d9b0fbbbebc98840ff88acf6ae000000000000160014106ac8111da0e5aa11aee6cc42c1532e1ac8265f13af0000000000001976a914365bb7ee05dd12165955f178d95953d89e37010688ac3aaf0000000000001976a914471884de589d110bb11433a08d84b9fb740303d888ac59af0000000000001976a91416fbc1d3e5de7df1bf8b6d0c437be75f4b19fb4c88ac7eaf0000000000001976a914ca0bdcb339cd0154f29b4f3a14a207ada557599588ac9eaf0000000000001976a9142c0dbd232588bda1b49c1e738620f0abebe47f3c88acb3af00000000000017a914acb3ae882e326b940bf7f6847826cf20f16bffd587b7af00000000000017a914d1e04e9cbe9221674e8b3cdca117358e32fa5f0787e2af0000000000001600142007140af5fce511d9df56d00188e25f7e3190ea01b000000000000016001412980f42d6950a55c1306b46c75c1b9d1561f2f758b00000000000001976a91421704405246f7d14d7677139ad1f03c4d9ca45c888ac5cb00000000000001976a914a2aa28152ba12509c0e278fa14e0d2adfae21dca88ac5db00000000000001976a91448ebfb181ff3ed4ce51a87e9191c8e0f4937543888ac7fb00000000000001976a91442803a19aa86adf7943d8986f14409cd48f180be88ac81b00000000000001976a9149ddd8dca2998a27ad9ca44230290cf5fd5b8973f88acc2b00000000000001976a9142167abaa9219dc4d9344d645e1f662992d341eeb88acefb00000000000001976a9146813951813dc5bbce24c4055046b97af4b3b853288ac15b10000000000001976a91431e8d17bec46a41b31a6608ef05b0b6e98627daa88ac6eb100000000000017a9149d0aa3eda1fe42ecb7c64902854b44aedc87bd078797b100000000000017a9141635a83874887ffd1e5372251c2b7a4f151d4c0887a0b10000000000001976a9147de7bd1592f17724222d04937d218a2f0728558e88acddb10000000000001976a91426a7021b6e08601ba03d1396334c48f25341b46a88ace8b10000000000001976a914fde8ed48d3046e799028a372606d67bc6ebc671988ac21b20000000000001976a91412c5fb02fd1288c06167d8c77dc52eb1558acc7f88ac22b200000000000017a9143fd17278bbac9e62c4c69f403bb50c9fa979e447874fb20000000000001976a914db3e372c0a4aa4ec118c01c044e44c3bfb9429f788ac53b20000000000001976a91419d96564856b428093c94117a461cfbd44879df088acd7b200000000000017a914ee6050c6be5414b7c2755c7bf650a3f4bfdff07087d9b200000000000017a91490ee7d6c425362cc9411e37c4d347e982156a88d873ab300000000000017a914a3d9f78d9b71db677803e74e2edc676f5359101a878cb30000000000001976a914859fe0fb2f0f1861f5f32a9539797be62058d1dc88ac9ab3000000000000160014b647578fab1eb4fba85e9796444db7b7a708dbd0b3b30000000000001976a914a0562a2326372591a25a9c021328063d0e662dee88acccb30000000000001976a9141be913b01b54762efd3ca34ed28dabc8ec67840a88acd1b30000000000001976a914610d7bf4f8550f54ed83fbd37c92ff88e550d85488acc1b400000000000017a91455dd1585e01cf8399f6773441c2ea6943e6ef05587d3b400000000000017a914ff7dde956b7b2ba021d8f8ea4dc18e8f6a37558087f8b40000000000001976a9144fc35f066ebcdefeeebef2f1522bfcf98707113188ac43b50000000000001976a914e7399f3f8b47707e087c4c6faa53184db2d2586888ac90b50000000000001976a91483bb2c0c28da600c6f1ecd308faa7c70552945f588ac93b500000000000017a91419887aa06cbf87e4d51e6d88e31bb3803342715687bdb500000000000017a914a38b26f492427abb28f6ca21a1239bb0c457b203873cb600000000000017a914a9120411ba0a7d380555a1286ae26034bddc2107875eb600000000000017a91453a3402218b5f94123aff33cc3c17f30e34b1ecd8769b600000000000017a914dc5c3f142bbebba6503ea25ee97ee9abffeb208f876bb6000000000000160014d17f5753c3983a752644ae8358e63114e7a602836cb60000000000001976a9147cac4cbac4e4c5714724a40ea3a546f0c57c076d88ac71b600000000000017a914c29e66227d66fde0c2439daba999627eb009646087a3b60000000000001976a914c7fb57d4a8ddab83fbb108d8c9fd99fd310b6b8688acb2b600000000000017a914ac50037dc202e57fa0440242722b74a8654c589f87d5b600000000000017a9145ccd0c29536f568c6ccf8637ce78742267f64e2f87d8b600000000000017a9149d80941af8ab283537f3201f13e86355485e6a048727b70000000000001976a914747a164b2401ee87357ef5d0e03b3e6f5bb0d47588ac39b70000000000001976a91446dd388788073261cffdce773dbf619b9ca5861288ac3eb70000000000001976a9142087a9ffcd3b0ea577d4b1663dd02488e4d12f2c88acdbb700000000000017a914a3957dd075badb971b24530bdfea8ffa0db58a648724b800000000000017a914b63effaed249a8e331dd25664db2e0ff0d1ebd3f8772b800000000000017a9148c8be314d2299c19c24a54a15c8b6f66522eed2187c7b800000000000017a9140d6caef832b37cf7cebb410af13bfe9fc2d4deb287ccb80000000000001976a914c38e000c340b6f045e8898c43b6d73f13862db8788acf7b80000000000001976a9140b62ebaec2ec5c5367954ff1c35dde0d4e3cc29988ac16b90000000000001976a91440c29c00bc94aeeb89c54ba40efb698ac20ff57388ac6cb90000000000001976a91400ddec7cac21f95fbc46cbac58d0b86f94e0098288ac8cb90000000000001976a9143ebd487aee2bc67cff3afec931f64183c878b20288ac40ba00000000000017a914c46037fa979b77d2e571ca3f7fe60ceb8c5cb4be878cba0000000000001976a9141c7356e0dfdb3b79956ed84387910789fd207e8588aceaba00000000000017a91441d7f361d55392e745fe55fc33a10cc098d9e7db8708bb00000000000017a914da6303f0d12aeaca47b9d3e01b07f6a262543b3a871ebb0000000000001976a914f6afde03295799a31297f564eb1ab9479a516b0888acc0bb0000000000001976a914a826b36b42ccdb9aeb5ba131c939dc7774eeb5d988ac3abc000000000000160014bb47587fa1f226d48710d255621880bb7b73ea585cbd00000000000017a91437068e2f3ec246883edfe24f774064d3aa75aea287ccbd0000000000001976a914d1a434080e89ae70e7fa696d4dc598cb21354bfe88acf6bd0000000000001976a9145d0ce4d750989fd99e68e5c57101909002f8ff4888ac30be00000000000016001496974b4d3326f7d22c3bca069133fc539a3d2ac290be0000000000001600144b98779687f2dbdaed2c576ef5fa86344e64df4f9bbe00000000000017a914e738fec014727866200f3bf899f1d68ee214356d87ccbe0000000000001976a914e8615220e65b1b4442c1862d5e91eb066608a0f288acfebe00000000000017a914ae5179a1df8e2790d584c2bc68ba7efbe8f400068720bf0000000000001976a91471dfed591c13bf92903533c03fe9543355357aea88ac75bf0000000000001976a91458887e6b015fbc757407a049676eedd3d470527788ac2bc000000000000017a914758f5d680ce46e69fb201bd1a9c9881bc966c5d18799c00000000000001600148918ad3df5e7125b71a4f4a759994910e422d801d0c000000000000016001454a905a9ed904fed57ddf5df1ccaf53683b70a9834c10000000000001976a914fc5d902f3841f6af17038ba2e7f38c39b964cddc88acc0c100000000000017a9149973a4767b4332d75b1cc510301d45c447735e6f87cfc10000000000001976a914171552c6738b5168b33b3253a9fde280e4345e2088ac92c20000000000001976a9148517b991d2cc5671dd9140805b743a93c8df670688ac41c300000000000017a914a1f67c628a1774dbd9df34834f8b9d9043fe2ead87e6c300000000000017a91407ffea31f6c94ab878fdf08d289826103c31ee418720c40000000000001976a91472f8a39ba0f6b96d37d9a6c8068e38250acec0ff88ac4bc400000000000017a9145bd3ecb82ebc2916f7159efa62590618574850848750c400000000000017a91482c019dee3f3cb56e3568e046ccccd2563ee0101875dc40000000000001976a9146fae0d8aee286c967d71b7d0a4056d0256e3487b88ac63c400000000000017a9147ecdadeb4c286b8b0661b720b9783b1303f8498387bbc400000000000017a914d013f9e185b37db1b0de15e137d5c620843b8042874bc50000000000001976a91404e6dfa88f1ce7fa29b71205d26803796df1cdc188ac6bc50000000000001976a9141c687ca5fec90d0779ddc42699dbf62ec8552e5388acb2c50000000000001976a91435b804628f5f1f62b66b9dcd0118bc41ebeb686e88acddc50000000000001976a914c565a9073348408370166a5267f14504914d25fc88ace3c5000000000000160014cdece310f25da665ba0b669fa472e9fed68ff61f31c60000000000001976a914ce8fa8c2d373a2411581745d861946a5600d27ac88ac9fc60000000000001976a91414544202ccfac092101301d3635882f01e3916ec88accdc60000000000001600141d087fcb4eedc4272a73e6e5e1e79b324652618dd3c60000000000001600149b7324e9c1f8fc5ad4ddb049a53d10657c14b3e8dec60000000000001976a9147b83ad050b924ccebd68b0fa69aa5730fabeb6eb88ace4c60000000000001976a91482b8a3ac14539823497d521e4ef59616954e058d88ac3ac700000000000017a91498c96dec4d5cc490d1ca350d0121169fefc1a4938768c70000000000001976a914388db35f5bea9e62966960ca61b22a033bf1896e88acd8c70000000000001976a914dc042fab8a1cc109899783b6d2dd6c87bba9b9b888ac2ec8000000000000160014f34e567cb128fa2a004d45f8b7aca0e58d7ed91c55c80000000000001976a9145dad3f10763c91c4b6557fed00125f9d085bb55e88acd5c80000000000001976a9148f85a065084921a964a878a5e544d8506c9b66a688ac13c900000000000017a914f0e4faee8ad010988cffe7e8fb5622778e40f35c8789c90000000000001976a9140d5eaaadc3fd65604a8d8cc8b1b4be233274a2f088ac8ec90000000000001976a9145f93138d3fb6a2614990e23b3e6c9035a085eb3288acabc900000000000017a914e0dce71c45229224b139ead83fe78d560c40e172872dca0000000000001976a914bc6d604ecbc13b8c8f2998dbf601ff7c11b7ffc988acc1ca0000000000001976a9143da73a40b836bacc53f6a78220ebfee4e1d0900988acc6ca00000000000017a914d41086325ee31a70a8930c43c3af1de24c76d0e987ccca00000000000017a914da7fa8c073d3c29778c54710572bc9b3136f66c387d6ca0000000000001976a914631e78f0b6851e1414670636fdac682980bbe1c688ac8dcb0000000000001976a914fe1b1bc242781df65304c2ba2e76b6c909d4e37688acfccb0000000000001976a914f616858ed237bebe26be5a2d833a18050fa9b36688ac04cc0000000000001976a91474c515b0e105b37b8dd79bf136a33f04439ee9b988ac59cc0000000000001976a91447e2145406b0e90a16e65bbe1561d68661511a1488ace0cc0000000000001976a914db11a0c284501965898b062bc91f55a25e9310ce88ac07ce00000000000017a914b7da455cd6538d2c665cccc90faf5a0cd70b42b78733ce00000000000017a914d0c57ae7c004cc7d144e17f0ee37142358caaf388760ce0000000000001976a91407fb2be760b7cf9c47860052d07c36813c52b64188ac92ce0000000000001976a914ad497f9334d67d4100c9ab765f2a8d6a4ff9bd3e88ac99ce0000000000001976a914da9d71a18de023eb993a84de0150c1d3f35248c088acdcce00000000000017a9140fe728efc5a4c1a6a50e8966dae7a8c139e35b288740cf00000000000017a914a292461a920cd2e01ba45bc3bc0372b7b70ed2478758cf0000000000001976a91455b24d73872346d9c801ba4e9dd26de4f54bcda688ac6ecf0000000000001600147487508c159daaea09e69df39e268c7856ea1de68bcf00000000000016001444b6e5521d497952f4ec0cae510dc77ae6009bc39fcf0000000000001976a914f7f1fac8e54abe21373d6c63ef77236b3435cb3688acc1cf0000000000001976a9146d9e91f8983bb0a312328341ca45d96ae071d9f288acedcf0000000000001976a914cb227479612e030ba287eb479c9d44aa2ead9b0188acf1cf00000000000017a914ca31386e2cc980f7f1c3ac856a3bf6028f9918278701d00000000000001976a91493883ae8724ee9abe62de14a6c1e4b9e6d76d96788ac18d00000000000001976a9141e396705b73ae4d2c7fed3855a1390e5b83224c388ac31d00000000000001976a914230e1c36fe4d326baf0cb94853636243dd955b4788ac4cd10000000000001976a91477474705c5e46d4e985e0386d5d0b58d90a6f81088ac8cd10000000000001976a91487f09654ddf59bb832a258deb199a4fc6fe3c78288aceed10000000000001976a914a5034a4f5f7573371e83d51fe2acc087d6cd565f88ac32d200000000000017a914897f46e949dbee0d7d373588edbd898876e4115f8763d20000000000001976a91474eff999a0bcc132cf256a589a66b32af861f3c788ac86d200000000000016001487f748762c5997a3de72fbade73b7aeeb706f8c3d1d20000000000001600142a9d119799bfc39e19cf1d7f0c422eba2dbaacaefcd20000000000001976a914583ce93c4cead8699f1c0084c639a8bdadda205888ac35d30000000000001976a914830376af8a44f6c10b8a80cbf256a6ee8554ff8b88ac3ed30000000000001976a91485570038e11aaf2191c1ec46b12bdf056cf3efdb88ac4cd300000000000017a91406fc0cee86b3e2e7ce1f10902a4f6c358096608e8754d30000000000001976a914fc5aaa94688fa6dc212459ae3f2e84c331c4140488ac69d300000000000017a9146fe7f9e289807b942a4dc3781e5a6e9d04d10832877ed30000000000001976a914ad679ff72093405bcbc43f592a718eca12dc64a188acd8d300000000000017a914818477c06c70c8c845abbdd75ba58c9da062102787e3d30000000000001976a914ff2d5c593425385116c152996a7dc44640cc473588ac5fd40000000000001976a91403f084d9d57e3053f07112e54f2e8e9f8380977788acadd400000000000017a9144b6408059669000416c0db79fb3b1e08f932dc8b87ded40000000000001976a9144b2634b069d2e0a381a0667f1c22c39d186d253388acfdd400000000000017a914fc0306b79cda9a085f808477675e49d026dc473b8745d50000000000001976a914bb84254772e05db2eb0dca8d316604bb7361784488ac46d50000000000001976a9148be526f5bef73f9ba94acc1dfc7dc94baaa83bf088ac6ed50000000000001976a914a722a385a39fa60914019ac287a34885d90c3d2588acb7d50000000000001976a9146d9edcb2f828bc882fd23a5fc66c95d725946b6388acd4d50000000000001976a91438b63386cbf36e813499f30c9d1a3b18d34d026888acedd50000000000001976a9143ea88b6c56c54aab646c6a1f6571ab34dc4e438388ac05d600000000000017a914684c79ac5ed6876b724b8943d12067c0a886a1e78710d600000000000017a914c8855e62cdb67b59150a3b0d4156d164c854b067873dd600000000000017a9141e0af32f5915731127b6960bf4df5a1f293ae8be8767d60000000000001976a91447234769748b281f91c6905a4e69c2a62771db9588accad600000000000017a914644a1b0d0d09535076d18ee9ad06d1a7db7900cf87e2d60000000000001600143297b525a31018a84a37a329d40b4e6db71e367bf0d6000000000000160014f34e567cb128fa2a004d45f8b7aca0e58d7ed91c1fd70000000000001976a9147c3bd8a4199f45bd2566ac38d18b04c8a3c6983288ac45d7000000000000160014686de65592a5599558b44600127cf58a4adbf37873d70000000000001976a9140b3551555f35dd576cd55d0531eaf41df1d4a01288aca6d700000000000017a914171f9f67345a69a52ee216182ec943f8adbddc408702d800000000000017a91403d6cb2e54fdbe8b84f2444ce68f131680b93843873cd80000000000001976a91417f5b527c725a9e3b2043b550fa393798619719488ac41d800000000000017a9147422d519d0357479d221b9a2ba5e83d65aa39e3c87a0d80000000000001976a91446600a61d4b3470545ff1f069b37ab23b6adef3c88aca2d800000000000017a914f8b12313be3ac7dcfefbb8538192e95e0e9b993887f4d80000000000001976a9146a62fd1c5cb4a16ed844d99d11cb2632b8ca90a288acf9d80000000000001976a914f0f42ebba924a0eb8a89b77f0addeef407be54d488ac4dd90000000000001600143723f3ce5b160c190ce9db48a7846c453d2bd28351d90000000000001976a91424ac50b39e2c6cec4beed4aa6d6bb7953d46b9a088acbdd90000000000001976a9145160187aaec8a9ecd89826c4f675e82b3780544c88accfd90000000000001976a91406ab0e41176b2c0b810dbc33424c8345c777aa6188acf4d900000000000017a914bdbe12ba1474dfc6fb12cc800e923c04edbd15c687f5d900000000000017a91400fa3e6519ce910e724ca466b9854f71717f8adc874eda0000000000001976a914a672274da17faa452be7abfa46a7fb77f0b0b54588aca7da0000000000001976a91425f69038a4d523348d253b5b861f09067fa3139f88acddda0000000000001976a914f6c6f58f0bd2365766d544bc50148f6d7779a1dc88ace3da0000000000001976a914db4ce0da9ca7cdd75a5714cb7d113b79ed549f4188acf9da0000000000001976a914b5fb381b5b3583bff99c54d6a7d743ee766120bd88ac84db0000000000001976a9140a7c55cdd24cc31968103b9e05b47f564f7df32488ace6db0000000000001600145ea0e425721cb3e3b31ae4a5409bbcc3c7ef4ab4ecdb000000000000160014a28822e4bf1e7106b078a8ce52a88bb0e37bb8e841dc0000000000001976a914a2a4c5f53d88b520535ed2e7dba31e51ca86a0e488ac93dc00000000000017a9147b75036a3722345d45fc89458c18c8be450afb818747dd0000000000001976a914e1a06bfe5f97a6f24da2f11a12c58c54f4268d5088ac7ddd0000000000001976a91446098ed9729739f45fce939be74f366f283d841c88ac9ddd0000000000001976a914d72d141fee4f901fea6c4f8c5728db258e19241888aca1dd0000000000001976a91446e3401b88716ba52c32763aae4fec09f41e18f388acb3dd0000000000001976a914e7c8795fd43948709c49c0676737652a622a41ce88acdcdd0000000000001976a9145b57ed0b272b2d81a71f744a689690ff5bfda34c88ac82de000000000000160014ce9f1bf3fde6444745c1242a4c659d92200f3599dede0000000000001976a9146f24120a7d91afe4112581dd3b9a2675a0c4e05888acfcde000000000000160014d4bd4350796dcb3f48ebccbcd580b1b65f642b8a18df00000000000017a9142edf326229443ff44114fa3c1f3c2178c5d90bfa8752df0000000000001976a9145e22dd246cdbc9b926f5426a09c54fe3f60be06288ac53df0000000000001976a914fc314e1d4368b54d4a843b40a915536ea3fa91fe88ac57df00000000000017a914aa42fa0f7c99955e99b57d67248fff19cb7f7f9687fddf00000000000017a914c81c605110912c0e58826b17841ac8d0763de1ea879ee00000000000001600148dd270366bc3278ee0fe95729948a5c11a2a39b2bbe00000000000001976a914b345e8e4764d3601515171da5f5c3bdb9e96ca7188ac36e10000000000001976a914a797a754231eef25d99a61b0172965c4140db7d088ac47e100000000000016001437fd2bf5fc41146fa53dc5c623f8d530466a9a8c70e10000000000001976a9141f3216cbe77896be6684cc06a7ce4e7fc2d95b8488acb9e10000000000001976a91469eb11f63aadb544c7829b83736a23dd9d0cc41188ac50e20000000000001976a91447b0137098369507949019397c2621cfb840e74488ac6ae200000000000016001406660164942bc3b9c63b7ddc82c034a7115ebddf6ae200000000000016001406c23c0320fa35fbc9009db251b588c1883683916ae20000000000001600146e6029ab605386f92d935a80153c4f95bf2397256ae20000000000001976a9140ee08cdccb11409c904fe654e70b62a5c0d7491588ac6ae20000000000001976a91432203e6b169afd81dbe37cbf2713ada7e674b35488ac6ae20000000000001976a9144725f45b88a37d069e805773552a955e247f454e88ac6ae20000000000001976a9144725f45b88a37d069e805773552a955e247f454e88ac6ae20000000000001976a91456429d1fd35b619cc4981c48e18c17a8bc9f55fb88ac6ae20000000000001976a914566f2fc9cef162313e09ea4fea278994286ea83088ac6ae20000000000001976a9149ea42c58bdfc4310dedd1866622b513b0210ee0e88ac6ae20000000000001976a914bc801b53ab73f1630fc1806b4e7cbd6865e8944e88ac6ae20000000000001976a914e5ee9cc939c9a84d5b9c2436dd0849bb5ad31de388ac6ae200000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63876ae200000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63876ae200000000000017a91418d2942f9d3208b40850e6a5156fca81f8ed9b63876ae200000000000017a914243bd59bec7bef27121a11572469d898568557c0876ae200000000000017a914328e85a257baf4b1a653c52136cfc7757e2e35f5876ae200000000000017a9143a4ef6f3a4f568136da34dc3c081de09a16ed122876ae200000000000017a9143a4ef6f3a4f568136da34dc3c081de09a16ed122876ae200000000000017a9145194d87ba7fccdf97322430661a9edffcd02f7c9876ae200000000000017a9147a97082e95674f2774c7fdd27208591bb84f7b31876ae200000000000017a91489181e84e1944fbf9ce43b8355bfa27b358b6c47876ae200000000000017a914a587cd0522b7c6460e2fa508783410f59decae7f876ae200000000000017a914cbcc0d5616690cc98df8e8b139d38c8e0ab11aa9876ae200000000000017a914d5a1d9d6ddba094bffdce7b04fd718ef631a56aa876ae200000000000017a914e35abcf470a513000a1e345d7bb8ae65dda0eb5a876ae200000000000017a914ea285af8a3658a44194af741bd51448674d9799d87e5e20000000000001976a91457d8f29b0c65fc6e07bda8b4306f37e23ac2324a88ac45e30000000000001976a914e4fab4148dbeec70cc4a2c94b7543c7e8a21c74a88ac8de30000000000001976a914828211b81294c0d814610f99f56aab1442c9e63688ac95e30000000000001976a9146bca339ba52defda45ad728535831a8f57426bf288ac3ae400000000000017a9147f393812ef1189d7eeb932f03ab878e1ff7bddd48779e400000000000017a914ac1b8d8c5625d1d3c8607643f278522d9344f790877ce400000000000017a9145060e685bfb584d1f1c75d22d84cfe05a11ad61c879be50000000000001976a914d49c28f43cc2b57eac37a1a7895611c00317146988aca0e50000000000001976a914c7bfefee748ae91f3ab02ef37920e45a1f177cd288aca6e50000000000001976a914d3f9e58515350df8baca09b86ea57cbca83ba34b88ac2ce60000000000001976a914d305ea80ad6405b95fe354f480552906f48f493788ac63e600000000000017a91487e7c6254eaaef5800700c175726be01f7be7d9e87afe600000000000017a914ba6d13b0400a087ddad0dc326d44a4baed12413987fae60000000000001976a9141ee75eec610aac5b54934723d0ec75ea189ffd1488ac0de70000000000001976a9143bc2924602951b815f5b04ae1910061d8db0574288ac60e700000000000017a9149bfe6ca19089ea8c0f38128464e7132b8df09e3d8766e70000000000001976a9146695ff00e49bf621ec48f4e773f987ec8f5c609d88ac75e70000000000001976a9149d615bd3c3d3dc2206504a7ccc909f1689b09a2788ac8fe70000000000001976a9145eb50b8b1b927242870e972ed7e37cbf150664c588acc4e70000000000001976a9149a804abae95fe74c21018e0c7d6a53944f7d20b388ace9e70000000000001976a91414a90f98bfa6f31d4049343f4f9a7f344ff6466788ac11e80000000000001976a914a9db7ad28fad84bae3b700c8a6b5fb4baf2e448988ac6fe80000000000001976a914e3d3167b970bc22eec8e4d18da0cb8205086161988aca3e80000000000001976a9148856bada18b7f08af2cc03d58fa7339d918f5f5b88ace2e80000000000001976a9140348dab9911094bddd4cbefa4e9c3485ac2de3a888ac2ae900000000000017a91447429beec9ec2c84f9cfe9a536c003f3f37d13f28731ea0000000000001976a914e13d10856b7a1b718df197172118aecee52528da88ac39ea0000000000001976a9142ee5b9f2181a3c0654520591af061e3afa92fe0a88ac57ea0000000000001976a914b55a32baf5d7be01dca0855692adb6745c18d7e188ac65ea00000000000017a914aa1c56c6cb42f275e7ee4e5299aab51642d902878786ea000000000000160014dfb59beda80bfc2e2a6022ddf36e88457c8ea501e7ea0000000000001976a914a712e4657b68725db0801623b59076bc652a878988ac1deb0000000000001976a914f81b573a5ecb0b8fa2e4b2e4cac376105b1cd10f88ac21eb0000000000001976a91406070ba99e2ea8515c67660df3d1237951fa84ec88ac51eb0000000000001600147a7d9b899e3ad6e43acf78f681952aae9cd0157ca9eb0000000000001976a9149af8dab43914f2a56d141d1fd8760632373a756188acdeeb0000000000001976a91407cc2e291eb3e86f4db4de09f03a6d966e6b435a88ac0aec0000000000001976a914ba674a5265ad849562a0a2fb1576c7e83428da9d88ac37ec0000000000001976a914a5bf10cb70e2be350f69ca097e65cd6eed49157d88acaeec000000000000160014c684d55387e1b7810ff06aa01511a7062c4ab988c1ec0000000000001976a9141fc797499c7a549d7c945ad77232cd4d4f9f62d488ac0aed0000000000001976a914e1b9d781f17a3b32a14906a08ecb23bfd9f2d85488ac92ed0000000000001976a9146f79b3c4128fe58792866a07abbeda3e6ba715da88ac97ed0000000000001976a914b7db9a517c1650ef31a26d8c2b4603c26bee33ec88accded0000000000001976a9148857add0c985576fdc6c3da5589f791928b9977d88ac5aee0000000000001976a914650517c99af7da3f0f2b31668e23bae676fa027488ac8aee0000000000001976a914dbbf80be35623fe2ea41bdc94eab1ce32ad22c6988acc1ee0000000000001976a914c56d6fc65846165bd2a6115d1c4dca250d8f5d3188ac37ef00000000000017a914611e5c12a409b2127ef6e27beb127a6455b8f8568792ef00000000000017a914c27d71b2de45760070bcf7dd875e83778ed309c58716f000000000000017a91478d62c978c169fea2521a3c5451fe27d40a1712b876ff00000000000001976a914fcce2e45311e0dc1cfede4a8d0c57444a5a3be1088ac1bf100000000000017a914964fb1221659a7aa19c62fd30f1d8a0d3e5f435a87adf100000000000017a91481b319b670859f6a5c7738b55a6420852aa3b0ef87c7f10000000000001976a914e515a9e94f2723e3d9c839a92b9744e20899f60c88acddf10000000000001976a914bf15cf1ebe5a74b991fcecfd38e877009ef0d4b688aceef10000000000001976a9145fa84ccdcbabccc6742482a184dac1e117116a5588ac5cf200000000000017a9144e193c72c886529df60cf6a0c60eb555169fb9aa87f9f20000000000001976a914987c7418683d1c9ce23cbea338672b60a5a75b8e88ac09f30000000000001976a9149d498ec6de18ada30aee12d37f5b0df4e6ba830f88ac2df300000000000017a914e89b53555e402cc570cbe5b70045f18261439d32878ff30000000000001976a9142d9626051e190dd93baf9e3615a6305417b2807388ac22f40000000000001976a914215f601f6e0ab22d413d9a94545caf7de26409d088ac12f500000000000017a914346a11128b94c2c7b60fa02d82999da7fde7a6af873af500000000000017a91439f49f20a6f6140b5fd879093b5b9a9957f570088752f50000000000001976a914f3c9caea193580aca51e4492d6a83a67a923bbe188ac5df500000000000017a91482fd163a322ee193324b8f64c6a5589a0b2f81e387c4f50000000000001976a91407a9d1edc30858741875c04562c7f50e3c26d06c88ace9f50000000000001976a91466643c17709a5ef5238a36d688f8b7bb1f7bc4c888ac2af600000000000017a91463482652c5b678251c2aae80ff6eb6b24f8760e0876ff60000000000001976a914d8064d7210c11936aa0124e49b87bc5e5b357bc188accdf60000000000001976a914a3fd093e967bc5b17c0201a35b40b701d0e78a8488acd2f600000000000017a9140b0776e37416d93081447b1307aaa9af0ebdb2448769f70000000000001976a914ec130703682f2bd6e1c124486d4fe8131cdd092788acaaf70000000000001976a9142e47c3a261296ecbf99b43a5d37754ba03ba3c1c88acbbf70000000000001976a914ab403db2537dfd2b533d0c28b2697c2c721dfbae88accaf70000000000001976a914a26810facce1f266dfa107b5c7646a7db23f204e88ac1ff90000000000001976a9146d977b3537fb5093a3b323c6b1fce7777a4025e788ac69f900000000000016001457a956b6cf6a8a1abb4e04bd7ab5c326b831d64770f900000000000017a9146d7c5b7b9b10a399263f0c0f1669e6e5f711c48f878ef90000000000001976a914e6e1dcf150b0516020af001b287e2b6b3ab25e7e88ac9df900000000000017a914eb66ae360fbb2092c43c79acb94e96e2520d6d5687c5f90000000000001976a91411695414504aee8e4bc7b966d27652784ffd7a5a88acc6f90000000000001976a914e109c120c7dcaa7d98fd5e90cd6cb57b29bd624988ac46fa0000000000001976a9143e8669a69f422a6941479bef0e80efa3c6c1cc1688ac77fa00000000000017a9140a1f890051786b58abff7aa2298a82218ca47c2d878efa0000000000001976a914fe773cacbc4faa956bf58c0405a2213631bb272588ac96fa0000000000001976a914662b3d14fe0ae1c3d21a34eb519fa78914c9db2388acabfa0000000000001976a9143b9f604a4584e71767aec88356e28f54e302bf5988ac13fb0000000000001976a91488ddb1fecb0023821a2abc8bf2c2fb16066ac52088ac58fb00000000000017a9148f6a50fdac13d12992cfac0d25dcdca9356d1ce38769fb00000000000017a914c3ab9623078a8d4e856dade6e4f836b832e01ebc87a1fb00000000000017a9148702a51346a38d0a8fb9c15e85c998d77b38ec7e8715fc0000000000001976a9141e4813bb311dac379153f228de93d75642c1ae3d88ac54fc0000000000001976a9143d38001c6a3c5805ebfb0bbde1cebfdad9b09b3088ac57fc0000000000001976a914ad1ad5e30d15914028492eab71541c6032ded27a88acd7fc00000000000017a914bf41e1323c2370876f7f80e6461126769f7dd62d87dbfc0000000000001976a9147f3796bb22c8fa6ca75a11746dcd50171d9115bc88ac2efd00000000000017a91424404da4d94710568ab8700dfa8e5bc4a01e59d18793fd00000000000017a914a20b8d9d4256fa9e551503106c33577cff8d539387d2fd0000000000001976a9148d726c6aeb23fdf1bbffe3cfddd3ae050121e48f88ac6afe00000000000017a9144d0c6d8f49a83fed1d66dfa61849cee4e837a6b5879efe0000000000001976a914ceed76e4ac75a49b78d148521c96d4a155b9efa488ac37000100000000001976a91407bf9b2ee4f4e476273c7a2d447e823987bb76ab88aca90001000000000017a91442dfe81b5d2b8a95e11918d8b68a7909dd092d5387f50001000000000017a914f3955ce91ac37eaceba5792a15b0dcb9746171a687fc000100000000001976a9141c1d49f089bc1c96ff1c578fede10932c34f433688acb201010000000000160014a2d0f20ba8633252aba5427621e1f58584f9eaa8e501010000000000160014cc5d7c3ae826d80f15af54c7208124813ed34cbefe0101000000000017a9141b9dc49710352fd51033138ee21dc28162f07b0f87170201000000000017a914e4304fcbcd52792cef363ec6f57d80f5e2f1bf6e8769020100000000001976a9146834a6cc0fc76a6fc1f82be1a3edfb42fe238a9188ace60201000000000017a91473f2ab94f1ce73896e20d40b9b99e1d47de2b3f8872d0301000000000016001461c2e19791230b9e605cf06665b9d3d9f9902b2e92030100000000001976a914a830ec034301e449451a5e929d4d83593c7e5b6d88acc2040100000000001976a914f21f76fd69e9b5b0799cd5bcb0c29f32da277cfb88aca1050100000000001976a914c940ce9950133f63bd8ea514083199d3c5760e1b88ace9050100000000001976a9147d04066d2abbd9c9576811b7973434141c5f7c5e88ac0a060100000000001976a91477a5e99cc6381a7e00275b9e302bc0278a71581288ac19060100000000001976a914fa671b0750962906f2dea9f0596291b233baf77888ac6b060100000000001600147ba9ad1f7f116a5be276bc70dcb25f2244dca240eb060100000000001976a9148fca6dd2d207f9f81bfa131afc1b781f2c5b297388ac7b0701000000000017a9149ffdfe50d3e9f29b701d8b71e0cb360859fda5cc87e6070100000000001976a9149574aabf72f591ff927fc43b145f58c01e6b6d4688ac01080100000000001976a9140f52b4159dddbf1f84c6106907784bda7a323dde88ac190801000000000017a9143421fe674cf4495cf7fc8794a0c3a2b0fdb0626c8766080100000000001976a914e1cbc42ed4679ae137ba0e0300407905550394f688aca40801000000000017a914f2bf3b42f27b17af5863f132a1a24b0f97daa780874d090100000000001976a9140262bd68d1484c464a0c7830144bc39e1ce5bf0788ac8d090100000000001976a914e1a9da7e4b6f9251353d4c5a39683f962755121188acb1090100000000001976a914524d5b40d757d9dbdeffa713520b70dd4fa17aa188ac2b0a01000000000017a9140221f1137629177de4ed420dc4f0dba2bad64c6c87320a0100000000001976a914cd9ad99ab0b822468fa43af6bc0ef2b13a3bce5588ac740a0100000000001976a914d3bb0b3ed5c7abfadf52649161591fcacb3980e388ac850a0100000000001976a914495646fc999573400872354860b77e51abde992188ac9b0b01000000000017a9141f36db8ec5c0c72d7b4f143d63d1de06a8405a6987ae0b0100000000001976a91417c33c5303e4fce3c3614b1f99f597e4821a4b8688acef0b0100000000001976a9142e132fcaebf54553c39254b98e46e2f7a5c28ef788ac070c0100000000001976a9144eacb5ffb01fd5680271360d9a11ffc9b750ccf188ac1a0c0100000000001976a914eba559822a304d05e77cb24723e0a54e6c3e20de88ac480d0100000000001976a914d7d3207c196454c6705e3fd68bc7a463435da7d988ac510d0100000000001976a9140edec3b151f5a1cbcad3facde19255741a1623cb88ac8a0d01000000000017a914596910a2d1768505187b1865610da688ec42acc687c30d01000000000017a9140d491c9f4d07fe35dc5835186ad3673fb6f8644587080e01000000000017a914cdd96ad3dcba2496ab6f64f1d0e8ce0752f1ed9987290e0100000000001976a9144ac2960451d68cc3795ead36d7f2f6f10d77234988ac400e01000000000017a91462de2629c451686ee92a0a08b81094e650e9052287b80e01000000000016001439b8b045ec16e7cd558c270276767ab79cb28ee4bb0e0100000000001976a914ed6c908be2afa6c5068ee140dd6f84cc8114a15d88acf50e0100000000001976a91414426a37e07cc8a5f9fd4303510fcabe384c6fea88ac3e100100000000001976a9141d50e452af21b4309a72c8132eb36d28e4039b3488acc41001000000000017a914c245b07cd0bf753d25b9982e771cd4694b8f789c875d110100000000001976a9141045acebd98e10140922512f2847572b5a54f28088acda110100000000001976a9144ef4e843e5a614f277c2411e50cddf63e2848ce488acf111010000000000160014600a089c3ea55c4e53cf0dafb1113eee1180c1a137120100000000001976a914199a575b4a6e279395302687d0e7c2381ff22fb288acea120100000000001976a914dd145b0a7ecfa756ba6f9f19d2ff487a5ee8805d88ac491301000000000017a914320e493854a6ce6256c59dcbf85f9ae3b6d1f34687731301000000000017a914e861738f4b042613fc9f400d303e3010065892108764140100000000001976a9147d198f1d68b9fb0f36f1723d53ac6ea01281923a88acb5140100000000001976a9145b3ce57d7eaaf32d0caefcb3ed2c71bd8055343988ac55150100000000001976a9145c289c4718d171931e78fe8de5ae72ecccbacd8a88ac96150100000000001976a91472073b2c105be2bfc87fa4f198950f735fcdb09788acd2150100000000001976a9142011a3eaad4b3863a97818239e3d28526550255688ac98160100000000001976a9148c22c33dd80811894234cdc61a532f9ab73c273088acb4160100000000001976a9149ee1482d5cdacc849dd588560388fd09aa4e674a88ac231701000000000017a9147c5d680b3311167b8d63932d82c263f7e83695d98743170100000000001976a914e82ea9e1b0b9b13e1e509fc88f5d9a0b2440423388ac7f170100000000001976a91479281afe2c8faebbc5c219ab3ed8defae3cd48b688ac8417010000000000160014f934f024448d99b8674edbcb63fc84af89ac414616180100000000001976a9140a5231a4a8f09b19366631b1362bae97082bde7588acd1180100000000001976a914d9b68f104de666e4ce8e8b7fb6771e209b3728d388acdf190100000000001976a914e4e8091a7a8d6e4665ca369d937aca718b3afa6788acfb1901000000000017a914fd2e537cfaada5cd8670a047c838f32258d8a09d87c41a01000000000017a91475563ff0a972729a6d25fea0c171a0270bf6a95487e11a0100000000001976a9149113da9cb2d7b86de0d3221ec7d41076cca65e7988acc01b01000000000017a914b7ffafc12b57a88a17c81bf833eceeb43e30a61787371c0100000000001976a9145726f5a5c4ee8e900d1f3264bd5ea64ca26e222f88aca21c01000000000017a914976e612eed6b45587b6dc7a8034ec13c310ed9c187091d0100000000001600145956ebe07a307ca03de6d2dc9cb829e9a2c143f3851d0100000000001976a9148a0f6cf0abb9da362aa6c0b304eb0c46b7dbf49988acff1d01000000000017a91430a0f5ea8b7385b97938f42b7f1036d15b40bef387191f01000000000017a9143856acef16baba6cabfd8869726e0f8a5f5b8f0987591f0100000000001976a914f8c9c2714a912ce0dfb2a547ab1cb835bee6aa5d88ac691f01000000000017a914e4c662dec4756fdf4b3dfc292224a28d6e4bf1e8870d200100000000001976a914adf3855372d4cadcb3e91b764dad90bd16af73b188ac17200100000000001976a914da7f51784f55453c99340076d2b5ce788c6d216888ac62200100000000001976a914536568c58e5592bea431635b1e135c2d4384fb1d88acae200100000000001976a91450edb242d12eeea114971cc532d1b4332684980f88acf3200100000000001976a91443565fe252eb4c01af8b1a92e6cc67c95bf6ca5788ac2f210100000000001976a914dfdff3c5d8cc0cb178274f356a2e6ca78ba8a56e88ac81210100000000001976a91445b398da1ff63db103444891d8fca20ce547fc8b88acb7210100000000001976a91462544242f4abca17be73cea2e0a8ba3b6dcaccfe88acde210100000000001976a914546cae817892fb2d05a1814b7199421455671bef88acfc210100000000001976a91441f7d706d9a0e1e57abd74b6e3203488b6296f3888acaa2201000000000017a91439740e6eb9f6d231543267d1e61804f8ff7822e187e92201000000000017a9143b3d9a0752b94d3c7821fb3af91279dfcfc0bdc3873c2301000000000017a914d9565baeb55c73c2a5b9b6a2ad67627505f3349d8792230100000000001976a914dee381757a6f0e9e9373ac9a338b9c0636d5919488acbd230100000000001976a9149b0717351f16074b54e332bac49237c170d5c8f788ac282401000000000017a914afcb4134e4328bdb81d5c6cde1a1c494bd2ca2f88734240100000000001976a914bc49a9bba0525487c457713d24cac64c0741a4b588ac412401000000000017a9146297e37f123591595d48d9f9568ae7a088abd63c8782240100000000001976a91471073c62186d46b5f823ca79ee7ae3e5494b336188acb424010000000000160014e64d7936f1285604506cef227553d0bdacc0b4120e250100000000001976a9149c76216c2ec5132beeb899ed9c2d4147d53dafac88ac13250100000000001976a914dd23f0a206458cb9e0a40c33351995163b7b9b5f88ac9a250100000000001976a914536cbade16c128c9d7160418608140340f84d0ca88ace62501000000000017a914ebd6dad1f1a6c95ec87e1d33736aa01c44eddbaa87f5250100000000001976a914b95c69a65e5afa0b868459b487b85eb0175c68ba88ac3e260100000000001976a91470112627832336814b4b09f2d0770f517087369688ac54260100000000001976a9144a6d76037fc5cb40e93975173b80159980d7c3d988ac5a260100000000001976a914be915eb1c23e7faf1396801a7a2cf437d649294a88ac9a260100000000001976a9143127c92249ef7ac25447d9631626af703e316bc388acb9260100000000001976a9142a3992decee30a668de4eaef5171a8426bec97e188ac1127010000000000160014460bb46f7892502e7f12b288950a5f383e09c900842801000000000017a9146a0d88790d995ee56b801f8773851847ec9917ea8789280100000000001976a914c9600e92d977dce398b53c18289595c590f6e8dc88ac41290100000000001976a91402245fd3f00c288b46e2a92a27ff760717659fe188ac502901000000000017a9143af166ca7b7fe407656cee7be1c6635f69a7c62d87142a01000000000017a9146600fe0bc582c46c447499aeaba7db97f1c6c03e874f2b0100000000001976a91427c334e7a407c8f7919e4b2decd1176a8e36a52a88ac722b01000000000017a914c419e561119d0f724ffa55c81fb8e9e0ab46b77287812b01000000000017a91407b588de0ff28d12d057a57b767ec6c08ed2f765879f2b0100000000001976a91490af824152381e776c64a0f00fc9dce5a25e155788aca82b0100000000001976a9140838835b53da43345d7c97f0c636d340ac46004d88acc42b01000000000017a914bdf8ff17371432e325f93cf97c402fe53bea1a5687012c0100000000001976a914c59a0e65b9aeda8f290f498597eafb055772787d88ac982c0100000000001600147a58bd53d7af5381c816e0fe7d9e6f0e8a313639c52c01000000000017a91430059e593c77525b7fc8663be495481264385bfc87162d0100000000001976a91489a70e86ce7226e3c57ea9b3870d4325e5fc67e888acd82d0100000000001976a9141696340a26cf3c75f921d998db024d8b70c0d64b88ac072e01000000000017a914b3000286349644af79417e3175c4f5f1f6c399cd87cc2e0100000000001976a91462a9e75496aa8c5d259e79522bf7102b22ce6deb88acb4300100000000001976a914910e9f86511a391d661bf6ccf078bebd57ab004a88acc93001000000000017a91444a494dbac89177a18c0782266d4d6077df05b37877a3101000000000017a9147f0695edaa2f92c4b685c94155ef5a30cc3b19d48702320100000000001976a9142717e0efaf219dd4340c670aaf80b525c2c6842788acc4320100000000001976a914a22cd25dbd630d3bed02afc8d205ba889033423e88ac253301000000000017a914e1e056fcfe1825ea24b42db873c1167bfaecaed4876d330100000000001976a914e8e5aa35a1c4e62a5024c940fa6a397f894c4ce088acd3330100000000001976a914acad1540381c6ac21cfc8b56c5d576f69bd9c05988acd7330100000000001976a914442f13fd0f9d97e894cafa384351f128f12188d588ac9c340100000000001976a9149783e2fdd4fa48a0887eeafa3a27675e415b90b188acb8340100000000001976a9141e8700d3792f8130ea25ecad3ac5f6c246e7fabd88accc3501000000000017a914e0938acf3716c470bbab5c945e6906a3b0ed79668729360100000000001976a914c815a18e3ed39a52fa01e6112822a2d69f8020fc88acf8360100000000001600146267fe8951a7c7d48c0e25e6128d590f93b0a51e5837010000000000160014bd5eefb872a61b0166de086158c8125d213a8bc9a9370100000000001976a914ce872f6ef75d49d0a19049509a23a92664a0a9f188ace7370100000000001976a9143e86071947170607c25a7f8a890ecd7e973bbbdf88ac5f380100000000001976a9144dba7ba213dd44952da3c1c5556f50a87f8dee9f88acbb380100000000001976a914778eef971218f992fe20203187fb0879f3572f9d88ac6a390100000000001976a9147d0a84c8940e3fb9c8340b557ff178b90f928f7288acaf3901000000000017a9146500c632449759e9c31874fdfdcbdc14a89c393c87773a0100000000001976a9142fa38129db3e92054dd2e7a5a57e1c9deaa14c7988ac773a0100000000001976a9149d4e8a54dfb531c18395693ac923c8530077af9688ac773a0100000000001976a914a76c26d13ec658cc70ffe97b05c630e640dceb9288ac773a0100000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac773a0100000000001976a914f3685d0b5764ec36b36b4225dc8ce4823cbb5a1e88ac773a01000000000017a9141855b9a508e61b94d71af6d4c34e17a4c1f8e03287773a01000000000017a91426fd76ffb144eb6ba89703cac57aa1f8a6102d0f87773a01000000000017a914497c8b57eb2d1e821fa531a22dae72553c702d0c87773a01000000000017a9149a3037ed694a228703308f3c1e87f1c07c6b9b0b87773a01000000000017a914f542c479d6e99a7424c6509a14f216fe6e7b43f187cb3a01000000000017a9142a832e914d875ffddad7c50f25b71bec0b9b358d87523b0100000000001976a91458887e6b015fbc757407a049676eedd3d470527788accf3b0100000000001976a914367dcbf3992e22bfc326a16e9f1e880b5b67561288acdf3b0100000000001976a914339b5ab0452c58877e860a83d807727c7dd1199588ace13b0100000000001976a91490869e24918a390b870f38afa8b8db3135334bef88ac693c0100000000001976a9146d33d353e82ba5cf151acc43e4ea3977a47cf09f88ac7d3c0100000000001976a9148d51c6ca50d037325cb4edae35e125370498e36688ac053d0100000000001976a9144ab4b59bc5a9a8cadbfcc6992a27345779040ace88ac0d3d010000000000160014edcb5985298f84c36feefc81b77c53948428969b533d0100000000001976a914041a262c5c4cd314d0c85198387c3b3a6498887b88ac8e3d0100000000001976a9141c1b44b8ded2ec37e8be8b8a00a2ba2fa0db266088aca93d0100000000001976a91426c4dae9b2fe094c509aa9ad2f86fdcf469ec70688acf33d01000000000017a91493e4065b58463d89758ffbe235633de2b87798d9871c3e0100000000001976a9146dd0c79a695e460a354c7e9513af751dcafaadf788ac3b3e01000000000016001480af194532d205c82adc9474e4904ef832588b1d7d3e01000000000017a9147489ec9c23e55be7029d32713d380f0ed541e40987953e0100000000001976a914e28aadd90d087bc2ec351b3a551b99aa2a1fd25988ac9d3e0100000000001976a91409602a4de16f8e0c462fd87348c9587b4eee750788acd73f0100000000001976a91493958d04e5b356dc2e84add3552b434d8a573a6e88ac894001000000000017a914ce59e37e87fb7c2626370c756b6e9047d4a0dc6387c9400100000000001976a9142f5085ac793b487a5cda7ce75eddc4a7b8582cf288ac804101000000000017a9143ef2c8f4296d6d628dd6f9be466e36a8663ea19f87ac4101000000000017a91472703d17357ca12794847081b3715af9ac5ef00487d8410100000000001976a91435555f0424374bfd94b59f1c5a3e472d33c51a8488ac144201000000000017a914bf97f2370b8fe62564f4220b83d646d1d91db7188765430100000000001976a9143271302e05c689c318bb88a039a63df6a3e598fe88ac1b440100000000001976a9142295defa5cf44ed64ce533fe42f1cf9b932b0f7f88ac7a440100000000001976a91401bd8e329b63fe851bfac390d11f76589addc14c88ac9c440100000000001976a914538f71d04d90553974b8729b3d6dff95d762c43588aceb440100000000001976a9142ee1ab117f8b8e808d7047296552579087971a7388ac1b450100000000001976a9146c23c20bdb2d7befc672f13cbacaa1ae61541bb188ac354501000000000017a91483951b5a13668adbd2a27d7fedc819d29f6b67658738450100000000001976a914578650c561b61ee540e7da604b2404ebd587fd2288acad450100000000001976a9144f9f7d68e8dbec80f34f62d22929ea9d55403c8988ac2d4601000000000017a914bc79946a90e66e1aad5ab85aed84591f3db730bc877b460100000000001976a914efb6eb55fa5e5376c6754c370826139a3798e54f88acee460100000000001976a914f87eac12b546790b71590ff8128e33e25cbccc6988ac614701000000000017a9145cf8a8864b26aa81332823bdbc5bfe91753e111c8795470100000000001976a91473b136ca8df1d1e51d189235d4e8e28172026bf888ac5b4801000000000017a9143e5a7bc6b061123c4e81dcbee7e445c3e21857d687604801000000000017a914e1a4169afe968edd3d54081cdd14e5870858922e87a8480100000000001976a91487eb800d10b4f521a47c577a6bb024343aa371ca88ac284b0100000000001976a914db6d9fdf2a4308a65b2cbda2705b8dc6240e3e6b88ac2e4b010000000000160014739114c84429c8da020afc8a695caae46c4877fdff4b01000000000017a914b7af3ac1d44c86f74985eda2a0aed0fc27328cab874a4c0100000000001976a914b9cbf6bc8415c1a0f8a2dd4157ad00389d602bd588ac604c0100000000001976a914485577dd6a037b8e839444ab98ddcef149656d6e88ac834c01000000000017a91462989ecaeea4a124ed2908bcc6c98bebef09641387e44c0100000000001976a9148caefdec6e35e97c96294c9071f49845ecbb1bb088acf74c0100000000001976a9141e7915c6f15f7b785b1e887dea2a3a3d236cd3a388ac4b4d0100000000001976a914326aeb7728e2c0beb560cc36c16441b6a4b5420288ac4f4d0100000000001600144d661445f64496eb92e79f0ffd3e152cb887c80b024e01000000000017a914e133a0cc524b75da88b3b2222b280581fcb471d2870a4e01000000000017a914327ca050127458cb86421536361cf8127aa5335f87694e0100000000001976a9140e84a87b0236af22fadf6a76d794dd8dfedcd19088ac914e01000000000017a91438667f1f5bbfb3282c3b58347659155d9c456a8287b74e0100000000001976a914e4e21870c1af1e55bd6ba7a90af717b0219fc1aa88ac644f01000000000017a914409559b240c4703ba90ffaafc6daa94633b63ca387934f01000000000017a914fadbc0023c623d593e224600be0295236c10fde987c44f0100000000001976a91419a7ca92ace15885bf51e16719a6478bc96e5afd88acf54f0100000000001600140bf076a228c4d4992830b074434480099baf0ba96f500100000000001600142f474218cb3920473ae4e224b9324bff613493308a500100000000001976a914b8f54bab327a67aaa3f84faf44a703433cbecb3388ac9e500100000000001976a914f00ea67ded054d93953d902c46515094cbfdad0088ac615101000000000017a914334fbee3f2e72ddeb02e0bdca1bdb114db1d8eba8794510100000000001976a91483791cfd613173c023e2efdeabd82ec3235d819988acd65101000000000017a914cb9a582d13e07602da55838cd61304465db2504687f4510100000000001976a914c4d8bfa87eeb7ca1dc38685b2a1a7b234e991e2188ac475201000000000017a91447afeeb5a52dfbeeacccfb954c8b84ea436a4a738783530100000000001976a91464be29e2662d67b775f3e53fbb946ffaddc9c5e388acdd530100000000001976a9142d2e303f8a758e75799d5c7cdb97686efaf7527588acea540100000000001976a914511c23ee68b35ba2008fab9fd517f1fb44a7a7fd88ac06550100000000001976a91478b66398842e013f5a06a49d6880021d742b3cc088ac155501000000000017a914f8970f40f13cc34983d344feb6c5331de471e7ae879e550100000000001976a91403c6af42ba2040da1b1cfc7fc21005488c0e542088ac50560100000000001976a914c61a891288fd5e980efbbfccd99baf1c51b5d63888acf6560100000000001976a914bed730889eddebd5bff437ad4ae897e3cccb896188ac295701000000000017a9149f60b3f8af7f54d207800b10db3f4ee21a1a514987a4570100000000001976a914c2defb0bfa7ea98e1e5ee200d2c87c0762219dfe88ac005801000000000017a914a0d98940d6b3199b93205c48016c0c1de5834d4f871a5801000000000017a91473ccda57740a74b7ebe52900529311c77f5b52728710590100000000001976a914413cbda5e10a02f8c481f96b292c7fcd486dde1188ac905901000000000017a9145369504291bf0ea0b66cfdc1526374a69944fe1c879d590100000000001976a9146c4e92676578f44489a6e287d9bedeae713e651988acbb590100000000001976a9144d1799cdf7cd8237f4ee421cc2cf4aa7284d3f7888acbf5a0100000000001976a914a7f3183b8af7098b2c66a8ff2540a10b198ee61d88acc95a01000000000017a9149bbff2a58516d0a1e82d5e0edb443418bf7ff9ff87355b0100000000001976a91490c67aa694a7ea5381a93062b9387e6380cdf19288ac3c5b0100000000001976a9141c3249aa03b9ae955e065fc58a72072ab3c1949588acd55c0100000000001976a91414abd6ada0bf272c1c9f7b1bfca0ec0261affdb688ace85c0100000000001976a914f252d057d0b0912b1c77c8ea21f135aae7b6560388acfa5c0100000000001976a914108629240cbb8ed66dbea678913f9f8d27ced3c388ac225d0100000000001600149b121fde6cd6f213e63eac55d5742d4e05ff05f9745d01000000000017a914c3aa4c46a3d4397d3b9c5f8de4bbd04e7d46515487e85d0100000000001976a9148fb12cd2a5e9514c47257508faa138f40bf67cff88ac205e01000000000017a914d7356fd9d3172cd7335e5e7517fdcc1de1f587be875e5f0100000000001976a9146984709c145a4a6d03fd4c1ad5c91e675522c88e88acb35f0100000000001976a9143d7030a7ad3c06ff3304c647860f5b6f20582fce88acf65f010000000000160014f1f92906f96fc689c1a62f500458ec0fed3411ec67600100000000001976a9140c35c710112ec549b5e7fda0d069f7938ff43d4688ac1561010000000000160014b0f3e4a36a82007c9c18870a1b123540f4773e82586101000000000017a9145b091b7fd825492bae55edfd828e27ea3c5d3af28759610100000000001976a91440b2cdf654b1a714c8caf3b5106ce67e0149bbef88ac606101000000000017a914f39e45dfcb9ba301878eed6f4bd04c69ac92dd858734620100000000001976a9143b556b98fda377ec0fdcebd2ee394986f5ac2dc388ac366201000000000016001474768eae5d492980f09282695fdbbe5873d88d7377620100000000001976a9143b9243c94beb7cbb93d7ce7573f58cee5d23a17c88ac8c620100000000001976a914766bafc6e059cd02608f8f7b957d4db3827a168d88aca3620100000000001976a914b15b1219ad2f659f685c281ef8442cc790e2398588acec620100000000001976a914e718a43d0df3499dcd2d209fd9fc08bba23509f388ac5d630100000000001976a914a240f845586816f028e09d4c2f25c96b76ec491088acbc630100000000001976a9149525c05246ad4826a840a72902ed6b090901378588accc630100000000001976a9148948413f51076678c2f2f5f513aa6acaa2687ea988ac2c6401000000000017a91452c46452d0dec14e90d4bfe48f54e8fef76d26908721650100000000001976a91494a186bd293d499237201268c868db35962a630c88ac9f650100000000001976a914442c78d4ad1fe166274653b5fd7f80494add80c288ac49670100000000001976a914509a67b58034ca3a5bc1369caa1b19748c9e817688ac49670100000000001976a914d62fc88be1af9c35791a48de1fa3c9a51262822188aca7670100000000001976a9148b207e19d5e4c8c7cc39160757d018d94324ff6788ac17690100000000001976a9143cca8a377df977a2fc329c17d9a05d9b0536413888ac9b6901000000000017a9149380d3d596132ac1becd356db7e0511801fcaf9987d7690100000000001976a914dc021cc5588dda3d792a45fadb103597ae9ae20788ac1b6a0100000000001976a914fd30434db4d38f1955f3cbae5a4048e3d8649bd488ac3d6b01000000000017a9147757af62e635cdd0a9850c334da44ed1df6f2e6087496b0100000000001976a914cbff1749b1701f1da89b5aaf9ab50d813116d60788acf46c0100000000001976a914eda2b420c5298ad27471cd331416cc118d75aba088ac306d0100000000001976a914a8f0afcb0aa52b70c9439952b414a5cbd371028088ac7b6d0100000000001976a9147bd696c7b781e750d0a292d79650811c5b21bf7c88ac136e01000000000017a914a61a985d933f37ad37e791ef4598d5849e82b29987d36e01000000000017a914ff42ff62dc3424e46f811148b48ba9bff4bf1e5187d66e0100000000001976a914d1f70f4995e22bda3e6e342eccc7053acd73e43e88aca16f010000000000160014d97ef8222a2ec5660195575968f2e30da6568426bd6f0100000000001976a914a922253382bb364f3f9319262124272dcf019bc288acc96f01000000000016001455a31e77199412036b2fc7d187caa0ed27f72bad09700100000000001976a91402b004fac6ce2018954ca1f4c3cd7f312296226788ac7970010000000000160014f91142dba0d31cb70ae441063116fc52d72df8d9bd700100000000001976a9142e49bedfc5411facb4819ecacbfedeae1cf2e18e88ac5f710100000000001976a914ba6c5f2be8744e09777755a5ac7cc815ed150ab588acd7710100000000001976a914d143d9b14ea2fba62d02822c427ac57510850c3388acaf7201000000000017a9143b9978d07ced8f248146afb4b0689c45137b2eee87f47201000000000017a914971cd4b4047b7efe42418a58bf9b3570014adacd87247301000000000017a914194ac2ffce8c1d6896dbe8dc143fa9d4c4b525d8877d730100000000001976a914368e0aa8b65310603856e349983c71cb28a2d7c988acd3730100000000001976a914d486a5bda95ad2f3db3056d5f854b5ac337c1da188ac09740100000000001976a9149f68a2f438152067fd7bb1bdcd8910ff5671081d88ac17740100000000001976a914318477c11b76bac36a41911f7d673483c134c28888ac6b740100000000001976a914f161efbc847f84f5b2a623705c6772facfad0cce88ac057501000000000017a914904798cd2c73f6d7d7fafca985d57dbdf2485180870f750100000000001976a914ecf52a4e0067d51636646d52d13cae6bd81c0fb588ac5f7501000000000017a91405c51d9d3f105bc584b1e37d47a033cd9146f4f78777750100000000001976a91407d9855a17d5bbdb88018fb3714a4063cb97a24088ac9b7601000000000017a9146c0a3437d8928a0ebd8e4e80117f656ebef74a3487c9760100000000001976a91497b4201b22c98d87cca4eb30982d53c31efcb2c888ac20770100000000001976a914efa137a1327995e760d30a384bbada75f09bcb1788ac3e770100000000001976a914add137d1c9531288bbf9e781f43870b48a78fb0588acd0770100000000001976a914a14db24fa724a9b698ef10fd4b12575b835a8b7688ac90780100000000001976a914a91a4b522a1e90bc387ad81f88f441a8411dbcb088ac9a780100000000001976a9141f0182b1b8c4c763c6164ca54f473c0c9d4e0bb588acc3780100000000001976a914a6c026100e08519165cd10d11fa3b92464d85f6588ac78790100000000001976a9144d0c3a48c7a1e6a06eb0871d39adc0d9f269dbcc88acb7790100000000001600142fd9e6388a587716e6b49b1c6d6c904e63d058452e7c010000000000160014c532fdc00843108fec897880fff326a1681f80536a7c0100000000001976a914f4fd989e8dd6e37273cec152b938c72f054eba7988aca07c0100000000001976a914956d4651c3e2b080c8cb330ec32e119cba6131ba88acdb7c0100000000001976a914db14eac334fb6f078c92bc6309f775a58650cfbc88ac637e0100000000001976a91475309f097756fd42023281307def0aff09b3c35388ac797e0100000000001976a91415ed0860119770e2de8c41be79a84bd3ab986e2188acd07e0100000000001976a9146af7f8774194cfba27b5283f87f4b8f1b67b8ede88ac867f01000000000017a914725f64fd09df9547d093e9f6452c896a53cadd5287be7f0100000000001976a9145f67028f0f0b58be1c00d33aa81eeb150c5e44e088ace37f0100000000001976a9145d53ec56119fdc5c25a8fde59684529756e2336388acf47f0100000000001976a9142b6d18fbb82e0b8d1bfcdf135a4b06314f23255288ac998001000000000017a914aa2d12073dc248d193e75bdd0c9de98fc569df5987c7810100000000001976a914149309aaf9701da5208ccf8876c3b2a3887473a488acfa810100000000001976a914f68daf3aa6dc393f96ea9607ad17b982e1e67ae688ac57830100000000001600142ba4128be0a6bb03d4ebc29d378ce87de2c4046d458401000000000016001484ffbbdb16475e5b4c25a4178823d7736de2a3766285010000000000160014674c5f9624a91766c62b0d71917a7c636d10da6e83850100000000001976a914a44fd097a146357e016049ae16481328118e634e88ac1a860100000000001600143b508d8c72ea7ac81322b6776bcf4ded766fa2346e86010000000000160014eea800b8575eb7f8a7e4ae91f0a9a358a6d3a387c086010000000000160014997e5190d9b347d18e79d34a58ae2de7cf34c87f8e870100000000001976a91464f674ead230243c09d82fca20ba31f94efc311288ac72880100000000001976a9144904e1cf86f2a0c5b2fc712b611c6b134126962d88acb8880100000000001976a9143da65e0204e045148c092e7bd5688c8f55a333f188ac42890100000000001976a914e71c5e0f23ffd1b39c439a8d2847d395e1d7830288acee890100000000001976a9148bb2f88f4c870808b653825f98f2b887d48f2a1e88ac028a0100000000001976a914be8d26f30ae9d7ab03cc3d1e77b1f7b52e77459c88acaf8a0100000000001976a914d6bc8b07d0cdaf53f9754d708b416e5d15c89a8988ac528b01000000000017a9146445e5e4508da43c709190d085706dee68b48fbc87e58b01000000000017a914ab9c63aa1d3ad51cf6b35f35b9891a59daf4337287f68b01000000000017a914a133a3f6d4052a3253164c0a8cc8720484267ff5872b8c01000000000017a9145d16d90eefc7395a06dc94ee570aef2225a78491875a8c0100000000001976a914204f62f220fe623bcdc7148ca1952c1b03e89ca088acd68c01000000000017a91449feda050996d1f04018daf93217c927fd14c7c487de8c0100000000001976a91426b0fd73c24b0bdc195b97218f270b5b9ef7c27b88ace88c0100000000001976a914ee0a3041bee4ed4497f60f30c1ccba63c8cba0fa88ac6b8d01000000000017a914d8f00f93f825b5cdcecbc91ee25e0f61ded03ed587f18d0100000000001976a914b2219eee6a39a5fea6afc5f571a224a775e8eb0f88ac008e0100000000001976a9143e36119eb89c180d7f702969c231c8977a63c31b88ac1b8e01000000000017a914bc439a9f5845f69e0805261a0f24911dc2e8a8dd871c8e0100000000001976a9142c3f39b55475d0272d40d73dc77808f410dc700b88ac428e010000000000160014faed4d65e9ce5e2c70f7297f32dfb4e580a8d6a34a8e0100000000001976a914477860dfde8dd227a9a22011b147c6fb5e31d5d488ac508e010000000000160014b0b9eb7d3cec19d5af71941169a5f0b48709a2ad658e0100000000001976a914c65a3883a3172a761e2f33468e7f1af5e9031f1e88acdd8e01000000000017a9144de3d676f299057929d06c5cef807994b5ae70cc879d8f0100000000001976a9144eb93709429b62e741dc4b662ddfb25f20f44d2888acb68f0100000000001976a9141d13ad7d238766e1447eca4e35a124ee68bca0e288ace78f0100000000001976a91422e0094354a077753c892d07197e2748ec36e7fe88ac0f900100000000001976a914bbd1b687647522d473aff7fbf4b2a32aacbfe8b888ac119001000000000017a914260154ac71eba81f80ba07ec010a288e8eb5ff4b8737900100000000001976a914620fb1c1cd0a0deb9a500ca13ba09d8936c4d35788ac8591010000000000160014e79f09b102101ca987f0b6a2e05f8d1a247583eca7910100000000001600149f7c358a9141e367d1432f61e6d5e55c963c29bead91010000000000160014b2129b6d3bcb3b83d9172e5ef549cfd3c8ce69071a92010000000000160014faed4d65e9ce5e2c70f7297f32dfb4e580a8d6a3549201000000000017a914957f72f55f1673b10ce5100e1a01c5ea9f3ab3b2872c93010000000000160014a80d2900b9c8c10f558ea586742068365811a5fded930100000000001976a914015e1c8b7e77c9b588186d814ed9a6791abf963b88ac1c940100000000001976a9146405556b5b6400436ca2d08617dd09a6f37afd1988ac2d9401000000000017a91486e033ba0713af9324834fb0013a3985289f558c873a940100000000001600148c1821389f02b31bbc68adc4916576c112c52c3765940100000000001976a914bc9e4a6e134917cbd1c85ca41b5a7a96a7a4e95f88ac979401000000000017a914c64ca5ad50953c5028b30ef3981ea17aeb79343687889501000000000017a914ac9461d8e9832dfb8023dc93d66c86b79cbf70cc87989501000000000017a914dc4d019678c00c157cb809a24fa2a7c977a261b8878e9601000000000017a91429b0958826da0f93925eb6a77eff7b7ae6ff330e87ea960100000000001976a914bee145bdcd52584f3266ff0b512b3e1114086ed088acef9601000000000017a91488554e5adafec4c541786e7d2c20ee7d72be8681876f970100000000001600145c17807712d7c6ca61151a7a2d72294fffcfb3d9889701000000000017a9143137c984a2b783673aea51e9c46ac68706388bbe87c0970100000000001976a914c70f33f2f5503e7f9587c4c44a57847f7fdbe6da88acf1970100000000001976a914169415e444b3db39674e75166e51dece5e747b7a88ac639801000000000017a91453c49a7c2fe661497b1dae5ba9b5d907a15d446c879a9801000000000017a9143be7126a107f641d56395446778ee6a4bd8625f487fe980100000000001976a914583f767b89cde68911136a4f6d83e3aa2785f20788ac0c990100000000001976a91470af200180c62e6927ae149b45da4d3ba548572088ac14990100000000001976a9148516940c2d3b2ae3f0b5ed862575cb5cb072ce6088ac39990100000000001976a914fd683a9738a31564780ad7316db36793d876fe6288ac47990100000000001976a9140e3c3b8431ff591d16df565c33828018788e3f8c88ac9d990100000000001976a9148bf96b039bbd08705e74811a0fbfdb872b99af2a88ac009a0100000000001976a914d27832eb5b01d64c61f94ab61ca9c247ea3dbdda88ac689a01000000000017a914afca55ebf040511ae2a65645581c9f06a03d321787979a0100000000001976a9140ec5bfc8009359ec97360c0666d885fab2a65e9a88ac0d9b01000000000017a914c0745c4b98b0dd42743604e953266cbb96c1af7587149b0100000000001976a914c615e1bd95bf7ab8b27bbd8fa6075b74f9b0eab088ac939b0100000000001976a9141f68172d0d314f477a8f78655dc53981861cb4a788acab9b01000000000017a914d3ef4b23f7b9f40b516dac2f446e8b9c2daebbf287629c0100000000001600144e08337ce7f923ccf0413d9e1c4c0b73e80454fe739c0100000000001976a914823407e04a9d77149aa737c8cbdb60d366a290f688ac049d01000000000017a91465b92036eb6d2523b0dc0e8695cd3c1c5cfb99b987149d01000000000017a914e2113727bb720fdeeffc86dfeeb7c2c61c469c30872b9d0100000000001976a914be64d0e126686b5df21c5a3126567c891e11bef788ac659d01000000000017a914803520a29969442d3ea27df45dfcffd6cb8af38c87689d0100000000001976a9144fecceb3da66dae61cbc3eb1275e6cb1de13a64e88ac6c9d0100000000001976a914645314b3b2a1a935da42de623748957b824563a488ac329e01000000000017a91453709e9bf4cd5a384631b9375841246f3870561a87b49e01000000000017a9148ee14681c32fe84fddad616eb01873c94f88bca487859f0100000000001976a9143bc99db42875ef6e706a4cff0adfed561e10e40b88ac899f01000000000017a9142008cf03a28a544c142b3ffb40bd067ffe3dd8bf87b79f0100000000001976a914c6034d53d1171afebfa6bebf76117f175081f5de88ac70a00100000000001976a91403ebd819eb3887942f4b9c3f13f348963ec672ea88acbea001000000000017a914a13ee7ea14da3f1222d84d764c1981dbc67acbac87bfa00100000000001976a914bb6f74d7c12275732040ee4a1c38f52a4d7ad87288ace7a00100000000001976a914c5d9dd56551762d67372c594b244b262b90f419588ac0aa101000000000017a914256ee72af13cbb984e71858f7a42519cf4b90b79873ea101000000000016001451107b56ba9e9f6fe6b892b719c193bc086cc7c55ba10100000000001976a914a27b0187fa03a8f3d5a5ca2c79fa42d0bd5c101088acefa10100000000001976a91415ec35c4a80d97ad6006907c92a152f161733f6088acf4a10100000000001976a9146a5bafb11e55038f460025c319ec32e9670ec96488ac04a20100000000001976a9148c9fdb0d302006f20c3222ed8c652f41f9ae86a488ac04a20100000000001976a914fd0de3061dc7d5e4f20cd5e3cf265c700fc1178c88ac11a20100000000001976a914a981c925c40251d4cf15cd9a127f48e71d51628d88acc2a301000000000017a9146ea5701f41b1b572eaa80ffbd7c46b25a59c4be187dea301000000000017a914e3fe76563c1a9a2bef96e330e702f2275f9e123887f3a301000000000017a91473f85d344a2bf4493ee7d6f5f007f2321d7313778709a401000000000017a914e5b44e8bbe60b9972980d820d8adc7fb5806467d87bba40100000000001976a914c3923e328f0e5635face96f67948b336d4f4ddef88ac21a501000000000017a914657dc6a2fa976ab1ce67617eb2e5bcb421574f598774a60100000000001976a914cae78a06e8754cce98728367c9e82cda53387e7e88ac19a801000000000017a91452a40a82292c6865604fa668438ad7ab2e3426c4871da80100000000001976a9141330ccd5751781c18d1fa6c9c01a219b48725d8288ac2ca901000000000017a914b07018e2b156c00fc77ea705251e4b327ce523ef875fa901000000000017a914242cce8972e60c7bcfc6515d1165d854747d4fb687f6a90100000000001976a914e05625449a18cfe026eea65d247f15cbdb4c5a6588ac26aa0100000000001976a914bee145bdcd52584f3266ff0b512b3e1114086ed088acb9aa0100000000001976a9141babd268a8ff5ed8e659c53f73477b326949401b88acd0aa0100000000001976a914defaf9c3df3b9bc3c623a8d00814a6767d2d77c088ac85ab0100000000001976a914c725b50c022e2e0ee704822a450fa453d249d64d88ace1ab0100000000001976a914ef59eb784d0f8998adbbf09265f7d868fe5f307e88ace9ac0100000000001976a9140956b779d1c9faa654a244866fff58eb9eed1d0d88ac2fad01000000000016001437832298f2dfe0c7b0290ec0c3c732b24f2b480d37ad0100000000001976a914d0eefa24bba7dfd0bd0347eedd8b648e512ea34688ac92ad01000000000017a9145f76ddc811dfbb3e8fdee580cd3954693c0bcec0879aad010000000000160014901f1cd8f6c83e35e97684551f068ca4265cc315a2ad01000000000017a914bc8f63dec5323f6936c1cb19b3c94a9cf8e686be87b1ad0100000000001976a9146cbaee475ab32e6f1637c93745a2e0a4c48cb70688ac8fae0100000000001976a914c6f6fdd0499a9aaec3e82696f12d1ef2c81a55c388acd1ae0100000000001976a914c23fcd25777f42c52363d8dfc3c2a53d7265bde888ac29af01000000000017a914125e3cc59d8e4460c8464029958e4e2fb317acb2874baf01000000000017a914345822a2685c991d91e3b8a24b6c2bb1904b421f8766b00100000000001976a9142b06486cf85dd031307b7a64d9c158ccadfd87a088acc9b00100000000001976a9142c27ed7d3ca4c3041cdabded18c0c4985178224088acfab00100000000001976a91405f028f0a938a4211f169e19d8a91625cb6e789188aca2b10100000000001976a914078dde1ab944f133bb509ab52f1ef2b58569f7d088ac35b20100000000001976a91447f04e2aef5423f8744a9b75fc00f43f86fad3b388ac3bb20100000000001600147dca2d60d87413f7c5de037ac93bb8ba2896936459b201000000000017a9145038883ebc5d2dceb5e27e42ad9b3a62b34b995187d1b20100000000001976a914f3dda34b4c1cc8a04a077daa083e843e4b66a7a888ace5b20100000000001976a914f4c62903ef96d24be2694920f744fd76e056cfb288ac0eb40100000000001976a914b7f25751f7d2cf656d77063a9e94516af41e673288ac6eb40100000000001976a914fd49ed57a8ea72dd91c88b24a40ea54799580b3388ac00b501000000000017a9143f63f93ea5df0b884e191350803e858750b027a9871cb50100000000001976a914ff65f3f9ed15482be3a87fc3a4bb0ffeac9c512a88ac37b80100000000001976a9142e352d3af35b60ccc187fa120bf11213845f338e88ac4ab80100000000001976a914b7cb9bd2de80b777840f79b08935108114d6891688ac99b80100000000001976a914adfb6e0db92548f45ebfa74d96e4ef9a8a83d6e788acd2b801000000000017a914c874dcfa87a44b5404e75b2b7545f232ab50dcca87f7b8010000000000160014f5249787b9bb02e736a49fecc83d34857ec20a5808b90100000000001976a91402b004fac6ce2018954ca1f4c3cd7f312296226788acc6ba0100000000001976a9145f7c5924d1502bbe6ac8f3e21c1ae27a2aabe1c488ac20bb01000000000016001443679eba686f7113b47bb767cc70d7be66673ae4c4bb0100000000001976a914a2f2e18bc2a918b1a0610c9001335dfd2fcdbf5b88ac16bc01000000000017a91404ce8df1b68ab4cf8fdeed0acf44c8301e517c698725bc0100000000001976a9149f76793e87d5abb602c31005607b18d1dbc578f188ac38bc01000000000017a9149c0e2e380a0165e58771a9b22ccce6bba68cf249875cbc0100000000001976a91490277bfe105a1ce8348f88a025408e7d584c74a488ac7ebc01000000000017a9141bda27fdb1b61ff80111b3c381d925dbe21300c287f1bc0100000000001976a9141e3c2605f502299117d9786bc9e90b9da21098ef88acf7bc0100000000001976a9146a8747b93d5f2503adc6a42692c71f5f9bec56a988ac34bd0100000000001976a9143061f34390da9866ef8c5dcbde76cc0d055f251588acb8bd01000000000017a9142098f8e0698b382fc02380868013093f29fccc028763be01000000000017a91461abedb53003e39b04968b02d93e85f5a8d942d28770be0100000000001976a914e23047686806be677f11339c73c1cd78e263720388ac66bf0100000000001600144092c2e9a4d856b87545bc715e58521cc46c15807bbf0100000000001976a9146a159e93bb0cbc5dda78775da8aa2f3c6688ef3a88ac2ac001000000000017a914de2b2a371086392a78383f6753962f0c507e395b87bcc00100000000001976a91416a9d45ab28b83b1732b03a126971c9b79f7cc3f88ace1c00100000000001976a91454c96e0abde2d154a7ecf856116d996608513bdf88ac61c10100000000001976a91446332e3bd5101230b426e6048e5aab0c39fe511a88ac76c10100000000001976a9146fa6151482db08ce5993524a1090388a07ed962888ac9dc101000000000017a9147b60f148ab2a96c25030d3dbefadf66f26346d0c877fc201000000000017a9143e621a19985e963d009ec3decdcf9f8722f0cea88700c50100000000001976a914c6ccfc4909566da68506c101bfebc8dfc4577ddc88ac7fc501000000000017a914ea11f72fe1c740e26e5b25e767d2297e14c714c787adc60100000000001976a914e5b9f88d081113ab8362f05737c074b662147d8188ac23c90100000000001976a914fc2d762e178f12bb3dbb55e9cca2a0d4ea32a6a788ac9dc90100000000001976a914d92e65e172598122bbcc88c729ff954085d4eeac88acc0c90100000000001976a914ff344150cc4e9b2df7430f4ab3aad7fb75529f5088acd3c901000000000017a914e828d6c770f685bbefe49c3e662fc919296d4b4587a7ca01000000000017a9142a04240a0507889c64cd66694b73d9fdd039319987adca01000000000017a91417141e7855644e7519919d48e9f27005a62070128785cb01000000000017a914216db5fda624219f8e079e124d2f93c27f69f44087facb0100000000001976a9148486b38b0f518f3dfb0188922d1bb9843ef8cb6d88ac0acc0100000000001976a914b5f476998ea86f44e9f31382da042a7bd98d91d888ac86cc0100000000001976a91447979e19a8c1e5e6acfc809ce2ce42ee397f046188accccc0100000000001976a914a0674360b1e6922a92f7ca1839b5a3bd122f4bb788ac95cd0100000000001976a914e8f4dfc93016145f9e21eaeaf665abbc4eb33c5688acddcd0100000000001976a914c478c07dbd6fc9fe6778c334c110d116b84a97ef88ac03ce01000000000017a9144f74d72c1e548d03d0501a14c2d201a5b9929fd18708ce0100000000001976a91451c9014ddcc83553f03d91c961c2214ac005721f88ac47ce0100000000001976a914641bbf6b014fe7d510cc7f50b5d409fa04cfc3ee88ac57ce0100000000001976a914b503c7daaa28fb254c8ab185ae16337ba65f412688ac97ce0100000000001976a914f5140c591d4e86820df782c2b2788503f563ef3a88acd8ce01000000000017a9145038883ebc5d2dceb5e27e42ad9b3a62b34b99518718d001000000000017a9145038883ebc5d2dceb5e27e42ad9b3a62b34b995187b1d001000000000017a9148165df417c74e26ff8d33286085be2b07a51eedc87cdd001000000000017a9140f929642f06284e5c4b9b8a3f5a236d4e35de34e87dad00100000000001976a91402436056aa88a1fbe68a56662308e989a345eb9088acf0d001000000000017a91477f8f80b94f4b8124e7c36f6e7c6aada9a273052870bd101000000000017a914d2418504175d8ab5844cdb5b00e929130b0edbf08742d10100000000001976a914035cb231cf8ea084f4c1b3542557c71fb552ee9788ac52d101000000000017a91463845c534f85cdf774e83175101aaa93f30f14078754d20100000000001976a9148fc682bb2a846f1f8e1888b6b5a47800f244451b88ac8ed20100000000001976a91486c07faaf3c076712a95e063d6e368c05677567888acb8d20100000000001976a9146453fd96282a895cf36dc2f0cbf6a8345fd3314688accfd30100000000001976a9146d1995c16202b88435d41a48fcdef72113c79b7e88acd3d30100000000001976a914900a7f7853d241a3a391e5c7d3be1f1b6e1a0eef88ac04d501000000000017a914d41a33357e1e070ec73e03acb75871be0a9546b38742d501000000000017a91487f78eb684504d8d3b658e93bf9e914c7054954a876bd50100000000001976a9146f934ec9784c873d0f11d81bb669ff11bac044b988acd0d701000000000017a9149f86e939f1096b885b2356d1e63178c95574002387f4d70100000000001976a9142bb71038917d0c163aa2a54f6e6aaf71055b588f88ac1dd80100000000001976a91489c78bd8962cd9085fe0af07e42226d565c84f8f88ac3fda01000000000017a91405a7a25f86445a6a3aa3de719bfa154bb1b7aea787dcda01000000000017a914f22c842808465a54b2f47f3741dc905db7b6fbbe8711dc0100000000001976a9142651ad7c5c248fed6b8e5393539222dce71c08b188ac23dc0100000000001976a914c11aed4b37bbfdfe6bdbd753f3e631d134f98b1d88ac5edc01000000000017a9143777ffd91f7e186c52d2bb32a40cc3f9ec5dcbb88760dc0100000000001976a914a10931e4cb4e25816d7778ba42a45c325f4baaa888acb6dd0100000000001976a91413cb4c3caf8fb3e7ca513138cc5f610053136aff88ac77de0100000000001976a9141e7ffd35e4af721b5dd638e55168061610dd629c88ace0de01000000000017a914c6b47414d3b465d077eb24b9b387b48784aad0b987e2de0100000000001976a9147728cb2633e0456ae3eb0c5b81dbb3cfbd1cd25888ac2adf01000000000017a9143fd783e07f9cb42e2ed51f14d6b095ef0cf6c884874bdf01000000000017a9141df97c7c4beacd0855e3eccb966f12cbc842857987e4df0100000000001976a9144d96937236284d98e63f972e2db187cdd9d81aca88acf4df01000000000017a914d1ce3dfaa68aa8b1dc64861dc1d518be6973ea4a8718e00100000000001976a914f1cfdf79c09b905ff6ed1f8102bb893302a393fd88acb6e00100000000001976a914b9468364c9db366df1e6c6cc023af8a5a73a8f7e88ac26e101000000000017a914da14a2dabec5d67bbd0f107dba3414e11ec978f887d7e10100000000001976a9142ebe2c6e40976b9b489debffeb1258886c1efc1688ac0ce201000000000017a914555138aa619676a3ba072c41fa7b4960e128e4f8870fe201000000000017a914716cbd35ca3315df8da9a93d444171239de3106a872be201000000000017a914b5add8aaba82ab034c70f79e5348dca597dc9aee87d2e20100000000001976a9141f0ef4b1db821069d26f47b99e28032009a819e788acdae201000000000017a914113a23784c64fb7bbc58f06796b47096d10b6d0987ebe301000000000017a91432969448eb80938a6afea404365d40a36f6ca99887d5e50100000000001976a91445f5a010997f5b38230555176009185645b35aa488ace9e501000000000017a914472bafcd6835eaf02c5f018da82c223f0f2e208e8713e60100000000001976a91462816c08cc83f9311c7b298a8c3ffd38a4de34ae88acb7e601000000000017a914262d8ced455c40ecb517bca7701a0469f4f253a8871de701000000000017a914e8b37120061131d1954e9e3428aacb349e1348328756e701000000000017a9141fca865503716db11b8b8cb3f5e4b80e14321def877ee701000000000017a9146ec06d7e608ebc8643efaddc4542bd4fc08f1f6287bfe70100000000001976a9146c9d259ee80163a6f0af25eeeba33f1b727b00d588acf7e7010000000000160014a16d8943e86ea6e17d659b19675ca85d6bdb1b5913e901000000000017a91438cfa2b4ee1fd9993d95cf6ab2ee8e5d5f4c1b47871ce901000000000017a9148d3768a0637a31046e9d1a8e00992f89ffb53c8f87b9e901000000000017a914a72e9631443a24133ad54516ca268688d170355c87f0e90100000000001976a9146130330e383452f2384daf97c0c9a175842dcbbc88aca1eb0100000000001976a9143f45f60286b4d5c2a16229bcf923d34f4eac34f088acbfeb0100000000001976a914b3c46aa513dcc038d2be52ea88fe1f036475ed9788ac22ec0100000000001976a914a336f5484c70565a68c660f2a9de07fc4a60054288ac60ec0100000000001976a9148b0bb3baf6ebcd2a131d18b076014e10b90f1a9e88ac65ec0100000000001976a91467147720315780d581192a6c5dce6a9cf443f86988accdec0100000000001976a9149302376ac1401e8a09a4e83a54afc61aae8d98c688ac20ed01000000000017a91440a54fbcc5a72507f6f3a616a26d20e7f9af9ecd87cded0100000000001976a914b10ec17b24385c15b26f9132beb682e5ca679d7a88ac5eee01000000000017a914fdca1e178fd56b78292bf979a08f1e691516168e8769ee0100000000001976a914a2f8913866eaee66166c5639e8f7a5a6157ca5d788acebee0100000000001976a91431e358e58138d0f8653fe8118c7ddf0c00293ac288ac24ef0100000000001976a91490670e7083c827777cbd74718b6b2508a8c1cb9488ac61ef0100000000001600141d3af16d7b974bd52a68efa75ad4a3f333fd7b651cf00100000000001976a914b49027dff1679325862079c2a35700095a8dd2cf88acd0f001000000000017a914920b3727ecbcbd2be72ee21e0ebf9b2828eb333f87f2f00100000000001976a9149ac25a229d0e6b29c5eacf44c53cf5cc2755afa488ac0bf10100000000001976a914d8b1a750e7aaf17bd88e6eb658c30c6104383fb388acbbf20100000000001976a9147d85b2b272db43a0515cad22ce23e8057c8a3dd188ac81f301000000000017a9148ce704bac789811c1bf70091ce79da6f22bb7d608716f40100000000001976a91479372c61ef4603f08511424ba50ee4eaecd0342288ac45f50100000000001976a9149dc277e2c8d9569689cfe6d914ca2c7938ee457288acaff50100000000001976a914d119c839711d43a420b93608c29c013712f6267188ac7cf601000000000017a91469a3700022967b80b31c07f1b15d0188bed3e51c8780f601000000000017a9140b6838e8085bfbe338ba7c0ff0fd190bde4695f787d3f60100000000001976a914c3038ef48fe2767081f472dab20a3d05434429c088ac99f701000000000017a9145355ed4e650b8d771dd5e469276b312ac5e4e6be8728f80100000000001976a9146b910272639d33637c77444c26016eb1b027ff1f88ac9ff80100000000001976a9142e529835c6d9be750771eb5d76c2365c70b79e5788ac51fa0100000000001976a9143c61c1115f21682b46ad3e317d7f72bd8329625188ac8ffb01000000000017a9146ebf343ef1b76523ee4d029ec9dcd866ecd4b938879cfb01000000000017a914d62f3309773e48878c867764e48d5842cfa5ddb187b2fb01000000000017a91419b77d35d96415ea9d2f1318f6ff68a9320300548768fc01000000000017a914611bb1fea9d243717bcd52e439d81e4246caf47187a3fc0100000000001976a914185ff543be2ad44426017f7e02b4095415ecc04b88acb6fc0100000000001976a9143b00d45e4b6432ccc1e8307058a7521cca62949788ac3afd0100000000001976a9141b3487b70651974d160a59dc28b59dbb4534123e88ac60fd0100000000001976a91442a5370d62ea8d66773878fbd16124704741b52588ac27fe0100000000001976a914c7a53579f6129defe719ecea071e3afebdc3ada688ac84fe0100000000001976a9148b3b50047f550afe2d04d821b5514a37817ed6df88ac1a0102000000000017a91417932a4d06ce1488761e411fb7f424f1ed9ff0ce878b010200000000001976a9144c8ee1018f6510868c27b2583d8594e0629e9d6788ac4a020200000000001976a91427fb6e79455bac871549af918c72e3f0150dc20388aceb020200000000001976a914c19c92ffede1086729c56482d2afd34e6c19ea9988ac28030200000000001976a9147e62272e59014c026d35fa517974158f1735b59e88ac3b030200000000001976a914fcc9fc2a8aa80c984fc8c92c52cb00e8938044e288ac88060200000000001976a914ff03985a3ec0100c25006819a626be97f382de7f88acd9070200000000001976a91434e56a791dc742a40a994596d580b4efd2bd6fb888acf50702000000000017a914c722de8c8d702d281f13c68cd33e324bff07bef787530a0200000000001976a9141e79d5834be4a7f7c837c224c862dae8f9da49a488ac340c0200000000001976a9149056c9715de80a2de2560f8630a8db121113a6f088ac110d0200000000001976a914bb81c4d7025e20017379746c5a335df67912641e88ac4e0d02000000000017a91439c01d036ace4094139387e97047de8f6e9f152887270e0200000000001976a914f643419c3e1ba3ea7141263dd38f2ca4788d5ea388acb00f02000000000017a91482f5ebce1d81ab88d66369f9c51f3367a9abf27787cb0f0200000000001976a9144fe29d72165fcccbf1898087a1b163c7a950f06188ac56100200000000001976a91430d6247ddafb929f32021d5252ec8ae9115f28f188ac0b11020000000000160014e0f1c7d833eac753b42d50b23c4a8fd3de67c753b2110200000000001976a9144a32dd8337e1f5f5c6430530166cc0a269e588d888ac1b120200000000001976a9140c96c6d19de990449b79cc8281899555e3a82d8088ac54120200000000001976a914993eaa90345b38828acd4e489cda23e83b94534488aca1130200000000001976a91400e0fbcd554616f94da489f894491878653884f088acdf140200000000001976a914c5d67ae236d95bafb2a2bdb843c94f5815a40d1c88ac9d150200000000001976a91429c26cc2d77928910939ae5043a49602da4113ed88ac2d160200000000001976a9142aeb6aef213df9591f0a7c0b82935b820f44273688ac661802000000000017a914e6253fda120f1aa75c3aad1088c6766e6849747987721802000000000017a9148ef47aa15aad01d6e13471eb64cc199ff1b14ee2874f1902000000000017a914860f1abb2b7193df28c837177f5c0e5f967a2553874d1a0200000000001976a914baf444434c9d7e13ff600a7291ed1c7cd728f69a88acad1a0200000000001976a914fbc429be603a1eee5bdea4d77f039ee8759de99388ac831b0200000000001976a91436e1187d3731b3dfa73502eaecff251108ce167388ac6a1c0200000000001976a91416d3feeeb76958396df2ab5e09face42e6d9612488acc41c0200000000001976a914dfd096a6ecd485931e8c61f5f7259018f0dc433e88acda1d0200000000001976a914d5a3dd6aff130e4e48c64860ca1ea677899c9fe788acdd1e02000000000017a9141a0ec4548d47458a4a898760aa51c9f2b634c18087331f02000000000017a914b12576832c3180280866848e20320fd06a4cd6e68723200200000000001976a9143c61c1115f21682b46ad3e317d7f72bd8329625188ac692102000000000017a91461b345bb5696638ff966b169489c132b9e3a76de87de2202000000000017a914dbc4a3a20358b993f7bbafafdbd9d2911bfb1afd8736230200000000001976a914182c22fa50c2602ecf4a0a109dccd87f14d5f3f388ac902502000000000017a914e58eff45b7521f8e3a7697cab3007532f12324dd879b250200000000001976a9142a6aed53f0e78dc3ebf4800b04673fe4db229d5c88ac072602000000000017a914a78f1172d317e93fd9e44ece21bb1e37674ec84b871a2802000000000017a9143ef4a480223e03dd26827bdec36430bf49367b5f879e280200000000001976a914092e56ecdf7cdabdd7fd10e8487e92d6f7afd11588ac0f2a02000000000017a914b4e3ad4561fd91efe2b33dc9805dc6a674d7512987af2c02000000000017a914ed4495716c378bc9d0b5cd2de2dba5bb38cca88187ed2c02000000000017a914412eb0a5ce1de4f70ddf71f9790c8622008cbcfc87132d0200000000001976a914afb0d9584fef27c674a40e1a385e536dbe9180b988ac4d2d02000000000017a914a3e62429a5443f4cf14d8fe0aaad2c7f183ea4ee87562e0200000000001976a91452332c0ede338e04bd4a0d52afdf2c64d2c2a0e788ac752e0200000000001976a91478f6252f0c5913271a8789e18a0d3f31abff755b88acf02e02000000000017a9146d5c1fa7965e442efdc503052a6e1c9bf46d4e3c879f300200000000001976a914aa69c4cdaa7a8ab9202488e5a7407d39cf82885f88ac39310200000000001976a914f759030d1ff2de0a56f454c33444b1c213b8f7c688ac6d310200000000001976a914c4fbe509c4d73d752ba4ad52a4738cdeeebd14c088ac5932020000000000160014295c00ba4a250fdfb5f1e9ec3f3a4b47ac29b738bf3302000000000017a914156b5385772cde2b1eb7071fa5f463d620a2bca1874c3402000000000017a91443be386a5354ed3ff6286a1c8798b40a2e434029875b340200000000001976a9146d3c7c0e9b468c64f4418122d3b5899934d5960688aca93402000000000017a914e77ded1439355555470616ea2cdc679a5aee96a18779360200000000001976a914bdf8ea2f9ed07a9f51475e478f8ad668a032d6bc88ac7c370200000000001600143f619b74f74e4a172700e3faddd23ec1a732af28c7370200000000001976a91416535d2b0f025d6bc155278597447cf10440348b88acd7370200000000001976a914c070340f7b024ae6f6a71838e2c119ff0400c87588ac1e3a0200000000001976a9140c893ced849c7300d89c2a67a19ee6ff3d53d6c088ac533a0200000000001976a914512c836670c0512852061b482da107ef74471e3888ac9c3a0200000000001976a91499d0caabfadec4dfdcb9fbbc9e207abc7a6caadc88ac653b02000000000017a91460fc0f2a8c86fe2c75ef8c64b6681a2bf0ffc157875f3c02000000000017a914e36ba8cd7d89f21c6f2d40605fecb2285590a361876a3c0200000000001976a914cc2b4e87c0a8640974d33dab2113b4dbde33ae0a88ac853c02000000000017a914e8ab1bf3460d44585c21cb356ce6255b73ce804787733d020000000000160014a47eb7484afb6453a7ee4102c2866d5bb677d471f33e02000000000017a91475196dd686eadef16f3b12fe49ec5891aa1a211b874b3f0200000000001976a91499daf4bb16f23d88cc705a319e48c5c15be371c688acc04102000000000017a914d502bf823b04e99f5d66419af819e85c9384729d87f2410200000000001976a914d4b807dd9ccd3faa1d288b66ff6742cbae7c377788ac0c4302000000000017a914c372b75aabf7680e254c4f418e6fc6f189ac3a7287304302000000000017a9140a971cf99ece58c22394875e76d7b8847f2dcfea87eb4402000000000017a9145c1b672d78ad002e7b415019a8552b0025ed4ac087d9450200000000001976a914a1536e9b868953d7f8491818076fd66ba743a19088acdf450200000000001976a9149b627e44bea442dfbdb07d375e5996e2c37783f288ac55460200000000001976a9146cdb29b1d454d1dd690f8b9a4b18b04cf8685a8188acdb490200000000001976a9142920ebca65b5f25b0b91a9dcaad155bb28e27bba88ac5f4a0200000000001976a914e68b9b138b59b8afdf29d481048b7878c70eeb5f88ac734a02000000000017a9145a7faaa205f656788413bcbbd520835c9ee1a3fc87d44a02000000000017a914681cee548af9fd9d6fd67f0d506dc84e2dd209e887a14c0200000000001976a914dde1c12bf2dad790e7b21e8ff8772d089c5f7d2388acba4d0200000000001976a9143aaa9ae8e3689668fea9a353967d7fe7af14c3a188acd14d0200000000001976a91482f07eff36a270a537848dc4ad77546b07e6998088ac66500200000000001976a914a27b0187fa03a8f3d5a5ca2c79fa42d0bd5c101088aca2500200000000001976a9145c71c95bb2ea9c5a12ec05491df94071a05c70fa88aca2500200000000001976a914a44dc63cc20487d5fd9a95e1f17917fb4a43648f88aca4520200000000001976a914706cbca84a57b26de52b7a92a191419e7b31d05588acc6520200000000001976a914a840f942915c92ea9b71be4bcb40b31d8bf5d9b288ac04530200000000001976a9146b0ea25ca2cecaecee5967c97352b2197ac6f43688ac31530200000000001976a914b60b7a011b2b56854dcaf75817465234dffbf4d088ac895302000000000017a9148b244f02820e03e3e2b066b7bde82784889aa7f287d15302000000000017a914451f9284cee648fc65310ea838c4697fe0cafe07871c5502000000000017a9140a91cb3e64b78d646a340ac670d9408bf528e4fc8773550200000000001976a914777afc5da6313dcfbbd39d91c31cbe880b98245888ac75550200000000001976a9145a7a2e2e8334e8e2b6a1715b18bb4dd8cd3e76fd88acf0550200000000001976a9148ec8046c87b6dce5b9ad26eac190a9e79aa1078088ac26560200000000001976a914b8372f536019bd0735703253ff75cfd915ef4bbe88ac3f5602000000000017a9149e43ebc0b8a03c06d44d700a0aadc0f9cc40f10a87cb560200000000001976a9145633074481383b62829c555b778394853c162ee788ac715702000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd83487de570200000000001976a91448e4bf5f2890500c08e661cc6e6539c4f3df88d888ac4d580200000000001976a914b53a0ba8de47728ca788c5ddb5f445c46eafd3e588acbb5802000000000017a9149c0ae0ba4a49a2008dc5077305e2e95896add842876b5a02000000000017a914dbf7cff6a004f87c618cbd70a44bb86e0afb509f87615b02000000000017a9149b82870ef71897d7d6fe9d96eb1c39a7b9837a9487155c0200000000001976a914b353e60653c32980989624e979672dd6cf49997688ac575e02000000000016001483ccb80b62017d875cbd0e8c809c993de5e756916d5e02000000000017a914f0bacd605b5086a6014cfe84a95ecb1452f111ee874661020000000000160014e2fadda3953776808cf2895b6c6980ac12c86fa85f610200000000001976a91473585e113b94c5696a209c028ea45663a90ffe5388acfc620200000000001600144b6bbdeac50278f086e5088dae12e3350ebd39b6f1630200000000001976a9148ce263e926abb336b8b1285ce244fc20c39f654188ac44640200000000001976a9141eac4ed9b04b647af87b538831d46e62e519aa5788ac656402000000000017a91446dd4a9dea5c0d66a3f31aba97a55365fb44e3ea8705650200000000001976a914fd5e773fe1ea142ac9059a757d52fdb2a635dec688ac42650200000000001976a9142efbfa10f71b7204c052e21edd128526aa86c67488ac9b670200000000001976a914754a023782878342ca910111a403b89396f5428a88acf8670200000000001976a9141fb9404f9f3c321ffc13d1f01ba0228774d3098d88ac736a02000000000017a9144ed2d2ce24efdfadc8384ea8c6e8940509cbdb9b87ef6a020000000000160014b5775a4863432a6a8807ab39a9775717b53cc089cc6b0200000000001976a9144fdef61433408359aa275ccd77f1f5f0841b2d7388acee6b02000000000017a914172a5758d2ed30c6af11e555695ccf11f26aa11a873e6c0200000000001976a9142faba7790b91a73ebb8698ca695d5dc8391a730a88acc06c0200000000001976a91433724e968784a47bed4079fdf58cd980336a8b4888ac246e0200000000001976a9146987f48726e23758e6d55c264efb519f263ae66988ac326e0200000000001976a9143ab96b0900709571d786e2cb4596b7f7fe7e539d88aca96f0200000000001976a91487e3cc2565765d2e17bc483fffbfedc3084cd33088ac367202000000000017a914efda5f0bf1497169807569404818945992e282de87967302000000000017a91443266f056d1167f52668205996eac0b3dcf6376a87a57302000000000017a914d6df9019c541aedcc4348d9091687580ae24c50c878d740200000000001976a914e680edbad5461c420215cb2dbe66afcb925d26bd88ac5b7602000000000017a914b875348cb45dc15c5ffb34730a592342723ec94587627602000000000017a9145f1f45e8572921f731f89fe3bb84bcb8318dc4ce872b770200000000001976a91451ffbfbd1f8fb9116b7085b77c5edc08aca5294f88ac10780200000000001976a914f87f3429292ea8dfb05d1e8f5c26e6416b88803d88ac48780200000000001976a9146ef14aa6f4c610dce2c3636a13f04e132ce1251188acff7802000000000017a914b51c44e64f733f46955aae8df613c93a4aac439e87287a0200000000001976a914d7b86d199710da0154913a15095da5851e436d2888acc27a0200000000001976a914b565035b4a78cf04ed6ace6a59bc6b06ae4e724688acc37a0200000000001976a914fa99a3845b06882d9f3a0802786f17e70e17416688ac877b02000000000017a91421e7d3d21e781ca68fafc0ebd7b42ce1222459aa87c97b0200000000001976a914d54b282f20610856bd4b47de4e6d6d4f6ecbc7db88ac117c02000000000017a9144a1df36ebefdd3f44d8b2d93a645469eba71071f87917d0200000000001976a9143d7193c7f632c67fa89a4c5ec0bdfc09cc9b23fc88acde7d0200000000001976a914ff79f9aeab6cf25adc61e1af9bf06d7f9170ac5888acea7e02000000000017a914f9ebaf6eb2d53d6546818f5949e0e06cec4129d2876f800200000000001976a91478b66398842e013f5a06a49d6880021d742b3cc088ac8a8202000000000016001430f485ae56d7aa33f685a42029b4feeb3520893e658302000000000017a914198ab089c68b00a4c97b35fbf14648c198a9da43879c860200000000001976a914e3de7069b6c7a88a365930704a433a707a07d10288acf5860200000000001976a9143eacd8bc403b606876d94a65584a085de521c6ba88ace1870200000000001976a914ee108cc0529e3394662fe2c39313fc9e72ade7de88ac14880200000000001976a914186b205bb8c0d67167d5687c9d8ce3d7da3851ba88acc78e0200000000001976a914c73493736e7b03dc382335764bbc7126914f0bca88ac7a9002000000000017a9142fd1d4793e3ef9d851ca4958fd7f3e477402b32e8745910200000000001976a9149f91e01b3336bcdfa42eee5962c9f85e542d8e7488ac6892020000000000160014790aa7427f34cb3c3ec38ca3bc0106d8305594b309940200000000001976a91479e343f63005528118afe3f0354b0277c701e55588ac17940200000000001600147eb2d21ad606daed81d21631408ad7767ffd8d71189502000000000017a9148c34003717aeec0a2211bc099797a83354d7552a876e960200000000001976a914d0d741d6ddba76bc69b7753dbaffe71e8af48b7988acd59602000000000017a91491129eb1191f059ec068ea3991755291333cfa82877f9a02000000000017a914edf0a57ab7fe362734924ad3532da09994e3987187929b0200000000001976a91480789fb82245d69ab0fc27d6c2702a00517b32fa88acbb9b0200000000001976a9145ecd0618f830028532fc796c09cade0050a3b65488ac4e9c02000000000017a914c324094454ce42c3f8f294840a54591bbc75e34f87de9c0200000000001976a914b413fc60bc456f92dbd03a0e2bfe77be1d7e37ee88ac149d0200000000001976a914d64c240461e19a7e41ed9e240270649aa0d6f73088ac4a9d02000000000017a914c8cf288556adc4dd72b8fb5822335cd44c0a13bc87179e0200000000001976a9147a80088d7b79c21c53a89b8372a563c859299b3288ac359e0200000000001976a914f84e7cceb211075c0b246ebfda1740376878ff3688aceaa002000000000017a914ab8c836a8708028e076f80bffc83ffd39a2d748f8710a102000000000017a914664b193337513f6cd96cb0aa478b9bad9f487aaf8707a202000000000017a914121e91b267dc2d1c03d2ba0ecbbd165a93dfc3ce87bba202000000000017a9145982195a8f7125814476a7b3908ca93a8f946479871fa60200000000001976a9144e5a52c974c95adb38e05827ba3475888fc0016488acaea6020000000000160014974d1b3667f16421ede4b01610ca5a6a035e45b43ea70200000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac3ea70200000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac3ea70200000000001976a914d4ff6aafacc722ac30ad4d2e8eb02f3c7022281d88ac3ea702000000000017a9140c451b32fca4dd278cddceee7b10f05e17a223e5873ea702000000000017a914243bd59bec7bef27121a11572469d898568557c0873ea702000000000017a91426fd76ffb144eb6ba89703cac57aa1f8a6102d0f876fa80200000000001976a9147f1a28672342a16ad8bfe489915b702eada46b3d88acf2a802000000000017a914028189e37e2f7b7f7d75b70ff757dd5e36c788a08722a90200000000001976a9144fbfde9dd3da76676a6941e44c1f00cb7ae845e188ac25aa0200000000001976a914b70ab9d40c6e6cd525320d29adf30acab3d1e80388ac6aaa0200000000001976a914c03bd5554225e3572a8be9a8ac0b3ec14b5b097788ac78aa0200000000001976a9143c936cf5b51499204d4224f7c96d3ef9025958b388ac96aa0200000000001976a914365aef8c3fc89314f3a31c132b24f882adc02d9288ac4eab0200000000001976a914306f9880942d760dd4ac9b89cc69fc98afd3d76488aca8ab0200000000001976a9149d458393d9b20ed9dbf72763b6f74da608ee37d288accbab020000000000160014362c0ec1b3bfbf2e5add08aa93d6d4b23799239d3eac0200000000001976a914d01ac5f6558e4b4831762c54b9ec900ceeadf42e88ac39ad02000000000017a9141a4c299056ebbf0b1041b9d4553c1ac9db4645b587cab00200000000001976a91446085e29fcb95737c4cf0d765a0cb2ff78756f5888ac45b30200000000001976a9143fc03525e1af51696124df0ea2226bee04cf7b2c88aca4b302000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387e8b30200000000001976a91439b7e597adc1f0e80d06879ff2947227e98dce4588ac86b402000000000017a9145c67e048518cf61af97bd3c7ab59ebefad080c898738b702000000000017a9146691189e3896d57240f514db91b68d11c510a7208739b70200000000001976a91401bf227c56dfd7b2585cefbdcbc5d578bd3aadd088aceaba02000000000017a914d82d14994bfd9415f6915edb0b9054d7285c55e58781bb0200000000001976a914ef04cd9b107f4f8b347e5e5ebf99a4c4db98e08488ac82bc02000000000017a914f48ba37f2a95acfbcd438ce5e411cc963407d69387a0bf0200000000001976a91402066d3f01f6064ea5834de91b8cdfccc0c86a2088acb7c10200000000001976a914af849f7d04c203861a1a875044a2aa38030bbe2988acc0c10200000000001976a914caaa88ebb383d0926880ba89b2eedf175e5662c688acc2c10200000000001976a9149166d3db82194cd388be7e8754bdda19be1a274588ac74c30200000000001976a914cf6047555d1f762dae33c8d6e559fb9f15fe6f4a88ac32c40200000000001976a914f06747739e2a3689ad1cda7e9c285f52e1d4172888acaec40200000000001976a914f6fcf00976bf98e838cc3b92389fc58470049a1988ac46c50200000000001976a914abb61c3d6fa31c2f01fe79d9ec292b92b369bcd488ac1ac802000000000017a91478fa886ab4f8685f43e494dfad1467cafdedaef28764c80200000000001976a9140aee6019307ef0371a13807af26a6f757c09269888ace7ca02000000000017a9144195539492338f7f5aa4e30ed4ce2a8e214d01788748cb0200000000001976a9141d37297d77484a1e21024bcf8f11c48a5c3532e688acb9cb0200000000001976a9145abfd8fc6d0a19ed2bcc12bf21d28399a260b23388ac62cd0200000000001600140c19cf67cb822c85b4ed19c0ec02de671523b9b491ce020000000000160014012138daeede73ce858360acefbddb4a586cf33c6bd1020000000000160014e4b2153a37906672d31809843f7c0328b3d5a229aed10200000000001976a91422865d02c00ef46e72e22953cf63a45cd14d38c688ac0bd20200000000001976a914ca08e8ef1a51355670e0bb8c2bde3363220b2c4588ac3ad202000000000017a9141cb716143458f81b42ae955af651386810db8c348708d402000000000017a914e3a0463974b3b021077a2040f9a05363ee4e036087f7d40200000000001976a9149c69e0782a9c0be54f09b417152eb8873cc88d2d88ac55d502000000000017a914e6fb411105a71f00f9250d2dfc065b51e85515be8763d50200000000001976a914d6a88a042743b1776a807a2ad9f5302311330bac88ac96d602000000000017a9148210a000fe45c83e35fa7250e41853858abad2db87fbd602000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd8348739d70200000000001976a9140d83d6013285d05e843fba7e1a4128a258d8d3a188ac78d802000000000017a91473646ef0883f133032cf7fce8471a9b3910dd7b48725d902000000000017a91435f225985653cb16968ff82b99840f2af8bbf6df8746d90200000000001976a9146ff4cf515a6f0af46b7e443774cb1a2d21736e0a88ac52d90200000000001976a914a046e31b5198030b52e75126d2491204046a186f88acb5d90200000000001976a914ac533dc00c09b146c1f8b60e5428548dd8b075b188acc7d902000000000017a914149cd6e46f01edb2ba7941b6e196af551727f4bf878cda02000000000017a914f92cc7642e73596f6ffa735620ce933aaeea639b87d3db0200000000001976a914d151d133e4d8555c37d21b391eda3a3b80077ca988accadc0200000000001976a9144cb1e804cca9bc6708b036a5ced6b7e26a6fb00e88ac01dd0200000000001976a9144f74ee3e75a0553d8d0dc3c5f3ae451563f1536088ac3bdd0200000000001976a914ede9d0b46db942de0be23b388ccb0615a68bf57388acd2de02000000000017a9149e0e77ff67483849d29bb16da867aacc696c1b118757df02000000000017a9143e49447b029dea5191ec27778b14ca8828d6adc08727e10200000000001976a91466d3cfe67a8bd78c6e687acaa296da3ba2ee3d0b88ac57e10200000000001976a914d1975c087080021d6fea22910f2c5496fc560f6188ac73e30200000000001976a914e0d747d377eb4d3b93eaee05630215f34d938d4788aca2e70200000000001976a914941f4b11b3167aef498ab20c020207ea609fef7288ac2ce80200000000001976a914e7eed98bf37449e52027946e4234d98708fb142088ac24ea02000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd8348737eb02000000000017a914ce6c15b703564d3d0a9e83ba1eab06636fd085fc879ceb0200000000001976a91424c85d5767c3633910a974d908c21ebdd58dbd0488ac08ec0200000000001976a9145933fbed9ff9845217adbed5b0771c805f41297588ac76ec0200000000001976a9140bbe780551f54b3c63015e30479aa2da089c79cf88acefed0200000000001976a91449c4663ae62ba546fde0ea44b11154b33c27acc988ac77ee0200000000001976a9141c59b9049af1acc48a18acc89924888a9651d91788acdcef02000000000017a9144024885124f481cc6984d3cfcf0215a6ed416c9a8785f00200000000001976a9148e6272748e8cef96a52ff6644a14cdd6ee306d3b88acd1f60200000000001976a914a1932f10b219cd00811f56978a988b0bfe078e6588acfcf60200000000001976a9140a5714f957e44ffc534e200dd1ae3affd052d08288acf6f70200000000001976a91408e483249deecaa0b783fa3a1cfcb2e48b2b1cab88ac2df802000000000017a91489387068e89a28ef2f6b21efe4343ffbde7bb781878efa02000000000017a914e74993b48488a864756081f73978c2ff0828eb8787f1fd0200000000001976a914624a823127a1e93a47078ba653154ededa54f50088acf8fd0200000000001976a9145fceac40a6fb11cdd5019dbeb5b61dadf4ed251788aca0fe0200000000001976a9140b46028aceccced413ff53127ab44634aa40c29b88acc6fe02000000000017a91455beec78935355f438546d81ac7b7812bcf3478a8794ff0200000000001976a914cd0d1aa1841718744f473052a30e4f6d3548f66888aca6ff02000000000017a914a646436123f14d194fcaf689b44211e0a4c54f6487ab000300000000001976a9141e878148877502e50d4c735c27c057aba5b8e26188ac59010300000000001976a9140df91bdf25504de4cb426717f45afd7a1b6673c188acc8010300000000001976a91418c2789793be3d6e04bf16e4b9a781dc02b0ed2788ac030403000000000017a914e8838cf2c7cc087db58fbb2e2886400cc801e0f187380603000000000017a9142aa3584f8300dc419cdd5e363d50627734210ae087f90603000000000017a914ce3fe61a92bf2ad6fd3aaad155d2f5432690bc0e87bb0703000000000017a91438b86fc614c8bc821eaa1053e0ce0e578eb79d0487f50703000000000017a914770040c8c8622f85c53c4bbad2028cef153268528751080300000000001976a914f9d084b79158b9d1c5a91a911650a42500852eb188ac8d080300000000001976a91424b562a42c7eeeee19377b5f6c77fa3670add10d88acf4080300000000001600146c1afacefba3f86e4b10a820ba08d660bf1c2d1fbb090300000000001976a91420e5b67c9ff6c62d9b5c2e2246acfeb067836f0488acbb0903000000000017a9143b1f21d252cb973151176e782cbf36a8f938ec1587390c0300000000001976a91412e1fa9b83282b2059a291a2b0e2a3abeda8728788acff0d03000000000017a914c0910bf1e3ed817989966127f48a3677813547cd87ec100300000000001976a914d14a682aadf61ab3e180ed7857cbe74a5b60ff7d88acf11503000000000017a91448340435b8f33f6141b55758062203441d12893e87bc1703000000000017a9146d9d384158fe343bb62b777c26a5b4489b60dc1487d61c0300000000001976a914f01dad6074fabb261ed7e7a1726ef4d6c380687b88ac711d0300000000001976a914d504641a239127340eb8ab85b861d73d8926b61088acd61d0300000000001976a914aab1480c09c391632aff9b92248f4e4001cfd53f88ac951f03000000000017a914f6b5c2b862f154380106db0f17ec176be8f5b66787cc1f03000000000017a91482abb009e348bdd5093db7e2015c937300ee8dd487ed1f0300000000001600147595999958288b1e487a0ac2a16d1f81770bd3be11200300000000001976a9141c85ff46b923de7a57723a2798894fd752b8115c88acd52003000000000017a914a8c245a0b582a4aadbf5806c2923c6b866b7c7f2870c2203000000000017a914c110674de7d59737494974e75aa526915bc6a4bb87c1220300000000001976a914c391c3df03c1fdebf80966cbf9a6525163da94a288ac41250300000000001976a914b2ec90d87f3577175d4647a9adea6683b6d7edff88aca7250300000000001976a914599aa352458cb3f5ba8da40e452342cd538182cb88acf8250300000000001976a914975c42eb120708acfadc7e1f219322cf07a66aab88ac83260300000000001976a914dcb2a320acd1d43cfbe01bb24cde1769260ffdfd88ac9a2603000000000016001407de1a32ce1c7fbde8352a666629eaacf007e647062803000000000017a914937c926f49f50bcdd5238f23781938cb8a18df3787662e0300000000001976a9149433e430ee391de9af78b0a42ffff32d507cfc1288ace12f0300000000001600148736f7db130e3dba234abf1102901a96daa9b32b293003000000000017a91497c1bdc7522534598449069fab807ce0649275f38789310300000000001976a9148c4f986908988021a48cc78283b6ab604d55fd8c88acd63103000000000017a914cf7f99449f4c7c7d1dcbff5df3167228234c8fb98782330300000000001976a91416eb5315a0374b7c6be488546d084482970715e088ac22360300000000001976a9143c164f4f916e89ef3b8978c2e72b90f49ca624c088ac5b3a0300000000001976a914806fc82aa76a38582df2c8c5967aadc9c5a30d8f88ac033b0300000000001976a9140b2fbfb3228223befe64ae17def5b924ab571a2788ace33b03000000000017a9149a4e70aa2ca2df5911cdfa402b826afcfdf064c887c43c0300000000001976a914232681c2787bc446b5a8a5d7e872cef5ee9e4eac88acf93f0300000000001976a914918663f42cee9933d75b2c01649276faa802197e88ac19410300000000001976a914441ba570081749fbaeb5b90585953853cba2063788aca94103000000000017a91454e8019bd9e275152f4d317abd0cb66e77e5ea058751430300000000001976a9146b92df763d79f09d30c8c2f752a584aceea1d26988ac524303000000000017a914c54683811ff7b7b2286004a7ef80107e6e6d32d087a54403000000000017a9146ce551baa7bf58e02402b868d956c1a09bc340058702470300000000001976a9145bf9368bc56ff48a7acc9823fd018f84f44d53f688ac92470300000000001976a914173d9c4b58a15f52541dc6fa2bb93ea5b4bff1ff88accd470300000000001976a9143fd4b8d5bd2b2f32ff5ee4d363a8b1f795752e4a88ac394a0300000000001976a9147549dcad043b1d49713c27604dbf0b233f0eaa9c88ac954d0300000000001976a91455c05338bc8ce58c7b3fd9cb098577490724475e88ac594f0300000000001976a9146fde64649c6beca4755bfc721737165ccf59720688ac614f03000000000017a9146cf098f27c59a08f54fb2b908987a0d39e3a531c87dd510300000000001976a914e2af15273f8e835cb6b5b782c7b3105049c3653088ac695303000000000017a914224f16b259d8b9a0ff47ec35ecd8e3dfd1a92666878856030000000000160014273c0ddc8ab394b862fd2492c2382b43559c6bab13570300000000001600144e0f0e0950f2b96eac093bc98a580d4eb92f32d35f580300000000001976a914639bfd8fa86f896c557c618c350af592502f703088ac80580300000000001976a9145a38ad4d471e9e62c1248d808ac11d8d8388187988ac01590300000000001976a914224aef56853094df3cdab47b3120f210939d880b88ac305b0300000000001976a914d07f0ef4523f7d832838ade95349580c2eab78e888ac886003000000000017a91459e569dcce8df11f5b97877c904b61ff6c2779e987fe640300000000001976a914bc9785979c4adb2c82cdd53bfccde862afae2d8788ac8e670300000000001976a914bc2be1af83f53315dc199a05f5962c6d8e24dcfc88ac536a030000000000160014e22fc57de9745083f0e9ce91f183ecf923f97946366d030000000000160014d0e9c0a7df5aee8b3758ec6a54e839a888293afc2e6e03000000000017a914f9f736ea75624e2fbc3d62836a2ce0c952e09ed187716e0300000000001976a9145ff25838c58508f26cc2e3fd299add9f4cbbbd5388ace66e03000000000017a914ffb386c07629c0791e69572dcf133175d03b391687426f030000000000160014d8c22c38edb1393ef7e81ae1e3ffc4e66ef56d5e9a7003000000000017a9145f7b0ac856fecc31429ad55990ea0b93a64154cf8770720300000000001976a914a0f09f6a64c4ec63233e8b2d17c1d33d7e8a9b9688ac5073030000000000160014a7f1ccd3f3f0a74ab36afab8c4bc347ad61add1b8f7403000000000017a914cbe40c512cbfc2e5fad6eaee2493134ff6f889f987167503000000000017a914ead5398a27d812b49458e0eda8601ec8b1c18ccb874e750300000000001976a914bc331943675378ac99b346a70ffb4ac41c6d5ca788acdc7503000000000017a914d45f5052e10f8998833b5bf515c0d705cea0b04787007603000000000017a9142f03768b2c22b16c94d815c807c4281f47cd9ddc87e3760300000000001976a914cbdca275f5ff3b621a88d88261a9a5b754011fbc88acc57703000000000017a914a7d4cae8191b7fbfffc884e52b866980c03e538c87587803000000000017a9145f8becbcede0f4e87652de2834904b0e50ad3fe087597a0300000000001976a914883fcac2d946db5b4b5230317013dc9b19962d4188acef7d0300000000001976a914610d7bf4f8550f54ed83fbd37c92ff88e550d85488ac04800300000000001976a91425c09987738c250d73b859239674dc5e7f2aa2f388ac2a810300000000001976a9140c5f92b68645197837cdd48919eb14d3932c3ecb88ac7e8103000000000017a9142db486d20d91f3485310dd004e1eaadd7a3fea8b87f2810300000000001976a91480dc6ea5ef7d4f430f800a1860558df8bbafbb2d88acc08203000000000017a914516383e897817005e9af8f6298c583cc5c5d832e875d8303000000000017a9141b22bfdfb0aa6b4c9cdf922214d8a81c2e8ef179878e830300000000001976a914cf93893fc4dd2b80bece2e2bfe7be5903e1af96b88ac41840300000000001976a914f60b7f79f9fa392aac68f948470c66a0e0f822a588aca5870300000000001976a91411fe279c2bf87e8163354a95ef2f31558a82dcdf88acc28a0300000000001976a9147f35392170c04cbe7e84d25f89628165e2cb388f88ac658c0300000000001976a914739f4e1c289ba0678b31adc26b77d60e4ea03c5a88ac228d03000000000017a914379eea157ebdaffa88f8abb878c7b9a50f63aba287998d03000000000017a9149ff3e1d7f7235f5745a7d1b926dc530f547bffc6879e8d0300000000001976a9146fe250f952c83f9f512c9945af69d8490c5fd15a88ac3a8e0300000000001976a9144dd8523539fe6aa5538896bce477eefcf721b2e788ac84930300000000001976a91468783821b30766f37538cc2189e510a1a81c023d88ac76960300000000001976a914797679eb388798f976bfee22d01af1170607a7b888ac45970300000000001976a914efb367fe1bdf5976055137e4776304f9949f29ad88ac6c9903000000000016001447c9726d6452469465f053f83b181d3ec4ccdab5329d0300000000001976a914444dbcec63a65d7675891ab0b43ed43e4709286188ac6f9d0300000000001600144446bb89c87d72377df4740452229482d7c232f8a29d03000000000017a9148cd4fcf224f13deafcaf7d9411d1f238032fa67e87c4a103000000000016001495cfbc56835067caacd14b66f3a3e2a25eac59738aa603000000000017a91475ffae2f5ddb3ce45d289a6f8d7e370a5a113b2887cba60300000000001976a914972db7bee6009812c46f4a0ef7be6230ea83f93088ac3ba903000000000017a914a84472197e007abc01c912357d5d6a32c673cc5f8700ab0300000000001976a9143e8492991173931ba76e0f79a3c9cb439e9360cc88ac51ac0300000000001976a914e7a7375d3700ef7ad0304e7eece6033dc661c97788acf4af030000000000160014b04d78aeb2dd61e3d54474fd430450bd6890f7e094b00300000000001976a914c30b5732d30b861f91ddf751cba284826844552588ac6bb20300000000001976a914ec38714b205b79432e4ea1de0b3b6975348724fd88ac5bb303000000000017a914fba63dfd0ac6f893bb58839af7214e7c4c5c83f2878bb40300000000001976a9148f7524db0220ea411a745b42fbbd4af8dd66686f88ac84b50300000000001600145cec117de9245c4c191f2f36f61fd686dd43a0c904b60300000000001976a9142b33329b1d89e12640f4cefc76a2217baef0e95388ac5cb70300000000001976a9145fafa2766766b69e3d449c9dd05c4a7f81950b9f88acabb70300000000001976a9142ee1ab117f8b8e808d7047296552579087971a7388acf9b703000000000017a914c7de9a49334809b7f29bcafe55d7be84d7cbb5e88760b90300000000001976a914215c4c34ebdb752d6760df84efd2593a1c8e2fc188ac50ba03000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987d5ba0300000000001976a91484fa5ae2f9eaa1200dde8204b3a36a30b777797488acabc00300000000001976a9143bd7358f83692ddf97d5b6aa4af8d7e1a79af3c388acaec00300000000001976a914b9458406b119a3e55e4c6107f4cdcde3f7f67f4b88acb0c10300000000001976a914d575ff15229a78f1fcf863e7ba0336aa400f5feb88acc5c10300000000001976a9141e0099a9937804c3dfe1e25b1667d342ceb1baad88ac12cb0300000000001976a9142bcc649d566cc70e7affd42d0e3b85ca34b9489388ac54cf0300000000001976a9145e6fc90183bf24834b239dabe14b76fedaeb34fc88ac75d20300000000001976a91447c4c2aa07d92772d432455c680a693ad0c7107688ac3eda0300000000001976a914cfe2dc1e71d8dd20a4266bc6659df4e4ac616cdd88ac9fda0300000000001976a914146d9f6b5e7ba4fd67dc805b85d4d5d4bc85abd188ac61dd0300000000001976a9144eb52a53309e7c4bf0e2585defbdeede6169d28588ace6e00300000000001976a9145cd79ff5cda0c239fb68eed43ea7e812aad5c77f88ac68e80300000000001976a914c2938769aefc9bff1b98717fd3c663c160ea2ea388ac33ec030000000000160014b1eb1c9d3706e4006c2cdc6abfb900cf6ae11f688ced03000000000017a914bdb365a57d5e518feca2c5f76f67c8cee75fb10887edee0300000000001976a914de29e936b72b9a09412d3c993439a64cc962b2a688aca8f00300000000001976a9148dc1d53e8db1989c94549e4d74d36915f4ec3eed88ac8df10300000000001976a91404db713e23b89c8874d16eff94c1fc6847045e2788ace4f10300000000001976a914c641e7ab95ff6226a5d20b85a141e731866bc5cb88ac3af20300000000001976a914dec5d254e70811e61f4400d1884cda78b6e739af88ac3efb0300000000001600147f44842111dfe472fc079360f437bd30cb39de40b2fc03000000000017a914375dc64be148215b86ad6eafca6b7d93b6d522b18705fe0300000000001976a9140f25dc693d2aea1ccc2725524426627480bea6ed88ac2a000400000000001976a91480025d289f67844720f5d67c16cac011c20ffcf588ac39020400000000001976a914d1ce0c78463d129b02335a67da7b9c0b8e1305ea88ac780204000000000017a914c7937173ee9048b7eaec5158a57f47610bf4c14587be030400000000001976a914f372469df8f12d8a883ffc192b6636a26b585e3f88acd70304000000000017a914687951f3422bb29381006d6225bdf32dbd6f848d87ca050400000000001976a914e5b31e89dd38f6b5d7b0ceb24769722acbfd4c9288ac380604000000000017a914a3de77081b8e1d42f25e3da74bb6f51b4c8286da875c070400000000001600147da92159ddb5837644b91d188872033d32f62b76f20e0400000000001976a9148361b45e4d9e913464a19e54c9064edd243b982c88ac951304000000000017a9143438acf7e4c191791623f41ed5fbf283fcc7239a87b31904000000000017a914dcc0eb399dd3703cb48e94396eab11c20e7142d2871d1c0400000000001976a914c06d5402f944f45109795fc3dc187566b9d0135588ac661c0400000000001976a914ca02ef5fd0bfb64280c8e385195dbf01ad6f91a188ac23200400000000001976a914dc41b212503fff312bbcecdb6137fe38419fce7b88accc2004000000000017a9147ecd20897e8edc19f5b13eb45025269501f3aef887cc2304000000000017a914760373228539c58d6de489c98dc6a3cc3e011a6a87ba2404000000000017a914c5878e176cbfde571ade3ce5e25f5e7c5d10e031879827040000000000160014a79d50a52022e5195e9f7c0ffd4033bf631c4503292804000000000016001424e85c80a1759dcc4a18ab93ddd41d9d9da96839c5280400000000001976a91491675fc341026194c1127276030d97784958907c88ac362a04000000000017a914d27ef66c8f8bceeafa4f3d373f4d1203b6fe6abb87c02c0400000000001976a9141d4a5ee32ac0f8d459363fdab0bbd6a429e9d1b988ace12c040000000000160014ba0e6e0a08f2b4f39666c508cf724468e4154cea032f0400000000001976a914f2badb82dbf057521419ccca6dde72369493319a88ac27310400000000001976a9148bc7dcde732f3910b52e5196bd0c39a13dee2e7788ac403104000000000016001487c4133f5cd69aef3722924104f08c3e308a391e5932040000000000160014948ad43f7a30a0305a581a6c3d06879386cf172bdb380400000000001976a914ee88e273fa0394ee251aafc6a3fe55df75d73c8888acb93a0400000000001976a91461130cc2024a6dfea95eff65280181d17b5e757f88ac613d04000000000017a914e0f95bcf34fa30506d6ee484a9446901197c0f0e87143f040000000000160014873cd95549b892dd9daa051888120d6d383758f9983f0400000000001976a914f65015f4433b6448c2f7fdbfb890ab9700f2767488aced4304000000000016001469e36acccc6447a1a85b30f9ab7cb3f0728bec38c7440400000000001976a914cb75c4ce6a23d4912e9913bc7228944232e058be88ac02480400000000001976a9140a3630608029920e3490a29ce077f06c108d43b488ac16510400000000001976a914387cfea2a54da3da33d4c011c8ff335f45c9eb6588ac45510400000000001976a91461fc8e6950d30cdb6ed2168b5a98e8d70356e6cc88ac97530400000000001976a9149012a6473bfc3945fb42926756d2b3478e39c42788aca5590400000000001976a91484a30e4dc4e9249b5ccde2e69ef9b3917bdd01c188ac2b5c0400000000001976a914f84bde8a5934c4e5484f2309c620de2be8801b6b88aca5680400000000002200205c395c1d4def7dd18abb60e118a52ad4d65a6334c61b9f6bf9d6b5b677458eb9cb690400000000001976a9140229b478650a08788609e87c348cb6347de4864188ac576c0400000000001976a914d502db009af64de7a08babf9a1807fafe1664ad188ac9e740400000000001976a914e6a03fa12af37326212a7eea54066d0d08ed91c188acd07a0400000000001976a914883278a74a78711ef18802dd3c72d032d56a113788acd47c04000000000017a914b2c2a28980f37cc5bd7dca7e1a5f8ee328ffe53387ea7d0400000000001976a914e0f60c73730f31f98710acb08307eb25efde041188ac7b8004000000000017a914686603fe3f26507b36df961d7686103f9de1baec8703840400000000001976a914e20a65967efcd4b655e2d7de9f9338c954752f8d88ac73850400000000001976a9148a3314eb096bdf71c7b9043d3dc3c24f7d3ab27088ac9e870400000000001976a9141501a0f7700bdda29518dee0490c98b786fd66b188aca7880400000000001976a914934a87425fcba6a16aaa75617c6ee01064406bdd88ac008a0400000000001976a9148d3ba35ec390ef48b5d861838e3be21d34578a1488ac138b0400000000001976a91465fa56882652d479452cace8e57a9571a213a06288ac188e04000000000017a914b7e6e176c9c0cef2a638139fb36d05ab56430112871f8e0400000000001976a914ffbc4dc5cff5fc3df445c4224595273378572e1b88ac7e8f0400000000001976a914d86ce5c0157185487c2cf2c78d16051b1727bea288ac4793040000000000160014dc45875a3b5d0fcf36a4bf29f95f88e664fb48f30f940400000000001976a914d39498fbae4e8208d682f5911472567d937d484c88ac13980400000000001976a914f4b47762bdaef56c87c3da9d188de3a3f02856a888ac84980400000000001976a91439092f1c9175992cf024ccf3d1b03496aa98c34788ac899b04000000000017a9145fca01dbaeda3089181bb64e38fec115f0d8e7a58752af0400000000001976a91475186ac29d05294a623cda2c0daf5f747828362988ac31b30400000000001976a914cd8be0466b90857e56487407590d9f075910a80788ac44c00400000000001976a914d00b319a3e8b20010216fd38551c90d7ab65555488acaac00400000000001976a9143f16369c5dbb00df8269705eb7e8773724b4dfda88accec20400000000001976a914e3672814e3fea226ef1a2a342f0024cfb6300f1988ac10c60400000000001976a9140def774cad304b9119f5f9ccf1c4ab713e0524e488acf9c70400000000001976a914764b90a9e38b7b42b301922972c919bb49ff350788acb5cb0400000000001976a914a8a75b8c7cee618a26fb954fa32ad182146fd7b288ac89cc04000000000017a9144f24759f91e5d18af82df98909028725a5f102c7878dd30400000000001976a914353b1fb9c2e82e4ab881f4c9c486af28f03bcb7d88ac06d70400000000001976a9148ab8c74d8a27af778d3f76bc906e064f454bbe9e88ac6adb040000000000160014ed6467af4a999b8fff3d45491c78bf4afbb005b48fdd040000000000160014b8d2d9127f1be94d9975e4ccb4a5f57c0efaf34e97dd04000000000017a9149a8b67dd936da102046953e8af8b2dd44b10a0f28736df0400000000001976a914cdb5abdad645289e0956694cbcab43f5fc4728ed88ac59e10400000000001976a9143612b2a5da213afb187d2b33159cbba81c1fcb6f88ac3ae404000000000016001463452db1c003366f4f39a09e676ab478a6e0667b5be40400000000001976a914770625185098f65d9546c13aff01a84da814e50f88ac60e60400000000001600142f10a8f898ce5433eed8a2a9cdd7d8c8c5522a4acbe60400000000001976a914a005e2379f94c1d12f34cf5c5607d62b6ffac0b988ac4af104000000000017a91473ecc30a6b7a595c100b730ca56ca9c6b57fab628743f304000000000017a9142b0b0f69c39a4ffee43083d9433e9412f24de95087bef60400000000001976a91495d7eef0151f50146fd61356ea9f459001a3e91588ac1bfb04000000000017a914a179eddbc9e6368194d031aa2e88d5d11a4816fb87a902050000000000160014d5603869182befecaf6234384dba7d38d31b36320b080500000000001976a91408b977203f18b3b9805244cbe95687793ed6294588ac680c0500000000001976a914a2db73b7906464f0974043268933b8386405f94c88acfe0c0500000000001976a914f060a13d2073af3cfa399ba2b5a2779a75937b0b88ac151905000000000017a914f63b874c4fe1d4b863099790e62b1bed1caf3a9b87881f05000000000017a914507af974050376f72eb8d4ad9b3818b13c7a1271879f1f0500000000001976a914fd1add4193983ac5a34d707019e68106186e814e88ac02200500000000001976a9148b7c63a4e8804390f31ef3afd48575f9683cb2c188aca1200500000000001976a914f1a1a4da66a975c7719fecaf5296929a40f86bb188ac9a260500000000001976a914748d8aa2f3e8d6fd1004e3989b8b672a3c75859c88acd22f050000000000160014c7c7b2e27d250ffb4c74d3f838c37379bc598a6613300500000000001976a9148172e4e4ea3b371c73f6bf244a20d89bb0c6920988acfe370500000000001976a914b1018763a12d1e1688b7d3445fe6dafc9bc92f0988ac153a05000000000017a914763468c4ccb8d5a1ce4e892fb9cc3064ce56d23f879d3c0500000000001976a9147be63c55ea18b14def1c1398b8b0a2c780c3850788ac7c3d05000000000017a91414a107ec76e29e6867d2dc9f95911632d3f3979887e33d05000000000016001475721fbb099797d287cdd2b408c5974df868bc3bcc3e05000000000017a914a1612d993ce3a9b2ebda6dae582a11dbbbd95e9687b93f0500000000001976a91482521b2239cf093f98266554727843e7a19138a288acbe3f050000000000160014c9b76d54ffe3e15a73aa483ddb3875121ca885b70f400500000000001976a91416451c0184fd9825a7cf8d3b7794583a879e4c4288ac11410500000000001976a91458c6e510ce6f57517ed2f0eaa2780b88112d69b188acb04705000000000017a9144cd7b8e4aac81bb39593f122df3b9788b6e7aa7c87cd590500000000001976a9146c688a2234570128975e713e1d57751c0b7f33b288acae5a0500000000001976a9145090fab5b160bc2c8b255a6fe056039f4f5a534a88acf65d05000000000017a914036e5cfe9101427be5ed0024d4b1b98b730e0e7487ce640500000000001976a9144268e9a5c6f62232e51c64a1acfc3048e669546b88ac5b6605000000000017a9145b6f66eaf9acf68437e282882cd7b144b5e3ae1a87b3660500000000001976a9148c35defc5ca40e985d9c008e482375884a4eea3988ac8d690500000000001600149823fc422f661e9d16b783dbd65efbb34205df23446b0500000000001976a9149eceea714203840ed8b39749d46eb7db94793c9f88acf96b050000000000160014f322bfa5f4175a68f7cd058703a05bedf432f27a607705000000000017a9145f3e870f0f8f4bbca3a61fccf826c0a32c97a12687827a05000000000017a914b85f9b781724c1fd2d74328e1bb53fe43cd9242c87d97c0500000000001976a9149d1ebc6cc397e284f67f34a4ea9cbb9003ed598e88ac08860500000000001976a914183a066a415c7eb58f47b75eb1e007d9f56597a088aced860500000000001976a91471df6e214968ae4aff588bbb760c360a4ebe6aa688ac80870500000000001976a914ffe2b93ba0e698af28b8d11f5ba10be916327e3c88ac49890500000000001976a9147f91d9e9c32623a5f559378fd923323d1c4e6cc288ac66890500000000001976a91421ff61718888c185919fb858418bdb6997b5eca988ac74890500000000001976a914d720ec0e756463d46b5c1ea70635e23e6edd032488ac848b0500000000001976a914f4d1790847e20b6fafe4de90363f377ff270524f88ac778d0500000000001976a914a0cae7746399bd94dd856e5b847c7f70acc608e688ace48d0500000000001976a9142e68e0e06befcf1bb9ab274bfdccaa64882bba2188ac159205000000000017a914cccd8215f55e2fc3315da5548650cb50e6011cb98743920500000000001976a9148fe0b3a37d6a29bd367436d00f8383af4d6daa2888ace6a50500000000001976a9140d4ed3258489b39232c68204ea7b2279db7d1bdc88aceca60500000000001976a91446a95819446dab77176819e1b9b2cfebbec91cd988ac0ba705000000000017a914b1874525c94ba7f570128d83fc9aa678ea071742876fa80500000000001976a914ff6feaeb6c8dbaaa5ea86ce2ea37283dc246ff8288ac9cab0500000000001976a914a5242a12ec1457cfc919552b132014271709bb5488ac3dad0500000000001976a91411d66cf9fe2196cc951f48b029cbb2b10df0f29d88ac9ab00500000000001976a9140cacc2cf43eae3d3b84b9072fb7ba7c8e0dee42988acffb505000000000017a91447d2f723056ad6338b23280b3411ab9d49c6b57b879bc00500000000001976a914af7e37c7ce92e17c61b02db5c176ff08c8c9a0ed88ac72c2050000000000160014aeb844de22cbc3cc8adef99c661ad16276a4dffad0c50500000000001976a914e765d722963df4b4b4307b0cf4be8166ab72d3ad88acacc705000000000017a914a066e4f692dda3e3bd31cb33a14af9592c324cf487edcc0500000000001976a9149ffdcb982e50af2022f2e13080e96667025dc4bc88acebcf0500000000001976a9146486b00cb6712a755e77d133a64ff081ed23f14d88ac95d90500000000001976a9145b1d18ce375bed852492a91a9c02688b981a159388ac92db0500000000001976a914cb1038515d2705b051e5dc0f051c3972b99814e188acdbdd05000000000017a914a6c728388c3afca7b9e26aced0f92ddea585ed798753df05000000000017a914cc8379615b2bdf736920145b9dec7ae055f86f788752ea05000000000017a9140a91cb3e64b78d646a340ac670d9408bf528e4fc87d3ef0500000000001976a9142afffa95a87d5a8d7fccaa2ce4949681ea9b048388ac80f40500000000001976a9147ffb8104b1dc2100231be97daf0aff9a544394d388acd0f90500000000001976a91413ec2b4156c5fe9bdf83a2c33b84f812f75105fb88acccfa05000000000017a914aadf7d45375e843c7c92c7d651d0f9b200b79932877b0e0600000000001976a91487ce46124a73e8dfc69089ed6b9379539a57272488ac7c0e0600000000001976a9149e23e1b0923e9354f266081d1cb655b13a7d3f1388ac900e0600000000001976a914d3a138c15b46ea7682eea2d2617632318cc91a5788ac02180600000000001976a914bbbd97721c3f809f36cf0260977b45b048e553c088acd4180600000000001976a9149e05b3bced46e316648a51e01db621a8dcf4fc5188ac9b20060000000000160014403b54cdef4969a04606f7641b4d9a6143077aca70210600000000001976a91493e35953a9ca019f36beffb5ea2e8589c3cd6bc488acf4280600000000001976a914dfd78b79bf1fcf62e55d8c5af297db9b464b2d3e88ac142a0600000000001976a9149a7d5506f9b466788f44c1c520f51145249c39fe88ac572b0600000000001976a91427067a7adf3832d390f7c6cd52f5624406029f9f88aca62c0600000000001976a91483527642d8b9cb9edb4a3e4b3c68c322c4f070d488ace4300600000000001976a914dbaa35c0860ce00fd537ebb965b575b00883ee7688ace730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de730060000000000160014565d51675c9151889b94116eec812155f5464b2de7300600000000001976a9143d008acd87f0de3c22b7d6b46749e4ca45c6ce2588ace73006000000000017a9143a4ef6f3a4f568136da34dc3c081de09a16ed122871b3306000000000017a914077ee7f370ef05fc180702673074a1ea7e9dabe787873f0600000000001976a914f541f3c3aba659968f319a898aa1ffcea3eebb9a88ac3a430600000000001976a9149543406f8ae3f3e5858284c7aece098fb6ced3ad88ac46440600000000001976a9148875f12d58f7bf38359c673daeda6c5d48d11b2388ac84520600000000001976a914db60bc77a4e1315b949867b75672a9bb93d68d0388ac47650600000000001976a91477eadf63eba5a84e82b25832df9716ac19e2da4c88acf7690600000000001976a9147994cb2d3879a66fadda67754eafc115cb91ed8b88ace46c06000000000017a9144cf6e6834864a100e77b6e2a39832cd489bcc5c187176f06000000000017a91430d484ef2679faa9e8daa806c4a06576795c400f87f07b06000000000017a9149fd59375cdee3073441c0fbae8e7ebdc36e6be82879b7e06000000000017a9143e4ed1874fcffa88f961604a7037fbbc4c434a4787838006000000000017a914b42067c0a7005f8468345a965addc3164f8f66de876e810600000000001976a91469ebdfaa024cc264dcea8bfbe61dffec5a73345188acb6880600000000001976a914f20c0e0bdbca1354c51c8ba30fdbcd7f28fad59688ac15900600000000001976a9145ab856fc3c5d17e8ed1693fdf90a77f2069fb4f588ace9ad0600000000001976a9144167a996ea1bf54bb50c8c6246be755068052ec288ac7db00600000000001976a914ffef1f614acf1f6a5a857f7e463da6c6582a603788acd8b20600000000001976a914faf162f46a39e297bb9bf4119d5bd5b950eae8a888ac52b70600000000001976a914c6ade0db0eb2a05feca258338bc557328f655af088ac58b70600000000001976a9146e74981815565695cbcb84fc2f3d977d206241ea88accbb70600000000001976a914b73000310e5de0189255d2df20272b9f3a91347288ac05b90600000000001976a91455fb594e1e0dd5fea1d5add8c1569cb735eef7a888ac82c5060000000000160014b21e561c3126a540684f6bc08ea3138560fb95e4b6df06000000000022002001e22eedad6deb7f4bfe6dae800b8e67afc80da07d00411ff2ea10afc90f72c1f1e10600000000001976a9146ba3c4af0ed60971e88f54a082e10ac48a8a4a1d88ac44f30600000000001976a914d2a2ea72d8081d4eea128cc065e20c8034a2315188ac8bf60600000000001976a91432d8c1ffc1ae1838ad65de0ffe0a481032e4039b88acd4000700000000001976a91479c2155e7f891a320647869bd8bf61973880ce9988ac470807000000000017a914d17107f2734c9091d5fdb9d07992c75706568f8b87ae0c07000000000017a91414a107ec76e29e6867d2dc9f95911632d3f3979887962107000000000017a914619b3d03207cf6a510968cb6b1ca414cc81576e38782230700000000001976a914502d37702813288ef5428d0ccb5879eba679b5e788ac7f2e0700000000001976a9141b0864ef484b68ab249fac3f457ba0b2df63ce6288ac1c30070000000000220020882aa82ce9cd9ca4c5fe13b0dcdec4000fb44baef34d4547bd6c2c1730ff7e0b8a380700000000001976a91455aaea3170a4e7686d2185aa627d18fd53ebe34288ac5c490700000000001976a914412f245d9e7700e9fa369fe3d37e6a4b040aad2688ac2f4f07000000000017a91447f082b06c925fe64bf62344f8afe87a9ef3cd99872d540700000000001976a914e0afc3e3d36168a8f6e527cb2bc2ebae6c6342c488ac1b610700000000001976a914ccea08e4b90cbf78e41c80f16adf199ad7b011ac88ac2c630700000000001976a914a1bd1ed342418732dc10f29527b4d275bf76321088ac4f7007000000000017a91488c1f0eb15cc37656b326f8fc0e442dcd71789c387778007000000000017a9147b5a4a967c37125ee6fd897553a260ca0f9724ef87188407000000000017a914fcd9e764ed44ca0cd5586552277324168d9349ff87f687070000000000160014f574157ed1fe87515a1d1477570bd86da75b5d4ca38d07000000000017a91494b3bac023038f1892028287a7c5ce262f30f6be878f970700000000001600140603bbe3cd7ecb720198b018bf2e281a9ff4fd7f909d0700000000001976a914ca02560de383418f89c5b4425fb8f976529d68f188ac149f0700000000001976a914298048c59ac5c75f05df4e69a2deaa9197d47a6788ac70ad070000000000160014942e3bb4838c57300025181fe861a6f3e3bbb3c404b107000000000017a91421405bd201e777a0bdbdbf42389805e6919c93888727b7070000000000160014822c53fdf1b96ef1eb09d248483c4d751d1ae85dd4b70700000000001976a914ea2851744905d959f782952ba94aeabeee2ecf9688acd7ba07000000000017a914872d013a4f3d532806e65807573872517799c74b8752be0700000000001976a914b1cad0df7704dad6ec4d334eb2ff4c2fd0239c4c88acacd807000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f7789873cd90700000000001976a9141ff4a6e7ef0e33054d27acf135a74f4f2a381d3388ac28db070000000000160014a4fa671f8a7a3b297e4a02582e105d75752793b6bce007000000000017a9144cb728c00c5870252f6175096e450a892694eb31877fe207000000000017a914dbc42ff142ec04585187b05999b637c2254229a287fce50700000000001976a91424da56687487fa47add619e9be7884ab6bee9c7d88acabe70700000000001976a9140da3d949c84948b3b134c104c7caaa00244346eb88ac70f907000000000017a914df56b30dffe1c47a2b74e1b6eb4f714c7b39da8b87d51d0800000000001976a9145cbd47bc062ea04e7c857b9bca615a1b8ca9988988ac24260800000000001976a914244978cb0a49b184c68031b6314f1263e826293188ac6b280800000000001976a914e2abbe93e0592766bf0ffa03ecda78f91be34fb388ac14290800000000001976a914a85d670024e6c60ce1d4b98b75a6bd0274ac018a88ac062b08000000000017a9144cc5e22fac905c88f03a3f05bad8ddb910922b2e87a95508000000000017a9142ff1a08b815f854699e13e6c981ea96c1853a8a887c15808000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987205c08000000000017a914de337ea35a312b00f5a3337b51b8a322948c8e5e87ed6208000000000017a91449783f25011f5e059983f4c900a1bbc9d7e76a5b873a69080000000000160014d11f5d85916f423e05eb61a223989872655094d0546d0800000000001976a9149c2cd4f8857c960fdd8352dac8f6ad013451016188ac797008000000000017a9146a1ccc04118400e669648aa1ce758d04e2fb3a0f87b87608000000000017a91499c17eb9284ccc73341684e09ecaeb8a80d58e218780880800000000001976a914597439ef2a57781a278baf24000117af9a1c7d2a88ace8900800000000001976a914c131793bb7858746e00bd4cc09a6fba39928b94788acaa95080000000000160014a347362baa8ab8995176481905bdc2f30d08dad0fca008000000000017a914bfa73128aa66aecb5f4b49585779adfbb26a3e118704a80800000000001976a91449bb7003d53d6c113bc6c17b2e358cd4dbdead1488ac31c40800000000001976a9149a1f70cdbec92a729d24f2c4c88035e40bbd8cbd88acf7cb08000000000017a91463da45492320d23f8e6818e3fe4bf60e46bbb0d687d1d108000000000017a914ab21d54ffe573f70eb8519e8025c9a3dd81821f78724e308000000000017a914228b43d8067fa5f4eb28becba804a0065a0b5c0587b71909000000000017a914eb2a804bb8759cee0aa519f4667873cb5009b3fb87ca3e0900000000001600144d992efd8f580b6f9ade39af7c04c5bf687b2f3e5d420900000000001976a9144f635ed445fb0075a22dc4576497b5b90c51bc5e88acfa450900000000001976a914d27832eb5b01d64c61f94ab61ca9c247ea3dbdda88acee5a0900000000001976a914cb1b228610eadbf6efe4388342d37fb4534b00da88aca85c0900000000001976a914827a37a09fcf44d2d37461c0d4b883f5707502a488acd06c0900000000001976a9144e1552c1176115eb25c877489032c575b973702088acbe740900000000001976a914c3e21f75f46c4158a3903b5c95b5627dca4c48f488ac51980900000000001976a914b5bdc69df2fc104b74760fae882e88559c9b1f7e88acf39809000000000017a914dc1ecfb127fcf82d2e8c599e8e1aed69a8993365870da809000000000017a9141bc719f40b9211a5e468da9696b363146492eea5878fc609000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987bccf0900000000001976a9146f6e640a17f716589adb51bde3a6ac303022b82688ac2ed90900000000001976a9142e22942c10986f54486fd8a61c12b12e30884d0e88ac23e209000000000017a9143c5d7702d77d448af890a7d99e660b90bf20f1c387abe90900000000001976a9145f6a99db3f4f8d380f654fdc4b8ab09b97f744c088ac60fa09000000000017a9141b7a472d4ecdc3b1acbcfe80a712439a766328f6875a060a000000000017a9142d13cd8e110f7483c0b87e31c37e0ae317ead18487b0280a00000000001976a9145fbfd247d357ad2b3d0cdb3dbbb138e4285f8c1688ac1b320a000000000017a9147f106e41f647fa01e9d036687950a0672582dfba87973b0a00000000001976a9144ff94cdbfa8fcb2fdf421dbd2c6e2f4f213b71c288ac9c480a000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987a09a0a00000000001976a914e289798dfe356590962d01c25f92901486f2d02288ac68a40a00000000001976a9146e495417f8a07e20d8257e69d35b10dcab1023d488acf8b10a000000000017a9148d5f829361fe1bf91f1241c212eee743801285d4873fee0a00000000001976a9145dbec4207354ef4d62b8dfebde2bdb969cfefc5088ac70ee0a00000000001976a914992ebc8602a6a0d65fb5c10b36c68b034a78595688ac33f80a000000000017a914b2a1e87efccf3f5075bea72a0e16db90417735a787c5000b000000000017a914bfafbbf103548e233b18c3ceee5fbb6f8953560d87267a0b00000000001976a914103f69aef3cdc33161c9c447abd8ca4134ff24d988ac04890b00000000001976a9144a8833693e13b47cb924ccfd7ba44e128d354f6b88ac12be0b000000000017a914dc6bbab0306ed60b9d9b912aa717b265e5e0697b87a2d00b00000000001976a9142e3f99e1740478e483661382c9642b477024829688ac4dda0b00000000001976a9146c5e9138f23be719ff7d8fddca9a99a9433845aa88ac59f40b0000000000160014ec733585eebb5b7af3ddb9ccb8994e561aff3792cd010c00000000001976a9146d0ec8ecf8a1afdfc4e9fda8508754f470838a6f88ace0080c00000000001976a914d3c330cebe42af23530b1c523d4182643fc9c84188acb8190c00000000001976a914bd522d6a87fa37b4dde0f14464289ccca79c91a888ac962c0c00000000001976a914080546deba1c49c46697356309e1dd9245566ed588ac13300c000000000017a9147f25767b761924b1b8c5e2e66d6566157c5b73ff875b550c00000000001976a914a0c502606e56e3cc9a367e1775cad2fd2819e86f88ac6d670c00000000001976a91444fe9b6fd3f59f9b3478f6a2de1aff7d357b0aaa88acb76c0c0000000000160014ddef362010854c6d3420e0083769c085220c1808cc800c0000000000160014969c39ef71a3c4f38ae25bf2372563d25a4f2e1ea7a60c00000000001976a914c81cc1d34c8da4b3a4de9031bf1919bb0142ddff88ac85ce0c00000000001976a9142ac679e0780db05c8fef623818a113dce902a2ca88acb7df0c00000000001976a91418570668343995210d3e126818d43ce8d5b3826e88acb8e50c000000000017a914f2cadce92502bc6e3ce821dfc5e6a7df1d10415c8700f70c000000000017a914bd4525cb5b6dd0daf7043cf86abf13494037339c87ef1e0d00000000001976a914a29c4a96967127527f99338064c17f85ab8e9b7888ac41560d00000000001976a91408d3e20d0b91147377b8d76bf44647dbeafb450588acbf7c0d000000000017a9145251779cef7b0607ea12203dbec724259ea41a7087b2ae0d00000000001600141e409f4960027c6a1406c5bc47a1c838cde03799d9cc0d00000000001976a91414dcf0db71b67a869094c3bd19c66a26d30261ac88acf0d70d00000000001976a91426d789290943d9c153b847e374ab7042d2e9ee0088ac3cdb0d000000000017a914391fabc3e7c9bfe3af20dda3fc2c3155f391dcce8733e10d00000000001976a91481faa0b73554856d40a18ad5f11215223b1494a288ac15f10d00000000001976a914689d791198020cd45ddd0fa4213b5a449427b97a88ac49040e00000000001976a9142d964680c33ee9a2796520c5d218f2f37d32f80088ace6060e00000000001976a91497f49dd3b411593153e9b2c8eaa585cec1f1c9ec88ace30c0e0000000000160014e82d20ebc4776244fc9d54a28c976dee5d13a713aa220e00000000001976a9142309ab0833360f7ed7e1d0612ac1cf69c502de8388ac88490e0000000000160014293e90b17ac01552471f40a79b4817bb7ca9a906eb490e000000000017a914927a3dc2367db89fe2b2a21a397551ecc528355e8779760e00000000001976a91402a76cbac539b9e441a4140a60f54e1992eeb49e88acf5f70e00000000001976a914042df0ab60458930bc949b76418cbafc75658c0488ac95fa0e000000000017a914bb66f43f1b70c4848e45a4fc95e4f4426a81518f87bd260f00000000001976a91453ade31d24445df97da9861a73462a9ef03fd7ef88acda3e0f000000000017a914c840c9102f1e57198a3791b3ab6649c80e9bdc7e8791480f00000000001976a91493883ae8724ee9abe62de14a6c1e4b9e6d76d96788acfc4d0f00000000001600149a22d440513becd2eb7c0b45b000c1c1bc59e0aacf530f000000000016001430f8b104595e01f91999cb46802c2b9a565352f2125a0f0000000000160014fc10932421bc43fe253aa29b8f5e3aad369ca798a5670f00000000001976a914016c509531de44657c9688616318adae6a628a4a88ac26780f00000000001976a914ce201d566cb1d7bcd5d111bdecb41f853ff9957188ac107e0f00000000001976a914ebc67c51afddbcbe9deab2952136153aab0abdad88accd980f000000000017a9142d874da3aac67a69c80181ecf75ce90994357429877faa0f00000000001976a914831f213dba5239dc9985dcf76b9b94da10494ab388ac93b30f000000000017a91435c0d756ae0e7224a30b8c336e5b0b50a6e05d8e87e4be0f00000000001976a914664d9758a1f6d4763d3d5e45bb340bb576be27a788ac5fce0f00000000001976a914f86d1fa243fa7323ebc65f27ead0a519216fda5d88ac76d60f000000000017a914d02771771ec0462acc8156057c805c99954d88d187efee0f00000000001976a9148e0317b4571f54ece294ca8ffbae480a7278783b88ac5f271000000000001600142dc93b39fafbfaf36f4f52a693eaf8665a98263c1e3c1000000000001976a914e4227d1fad1ac5c17b70b18c8b5b6e5cc5fee09588ac5d811000000000001976a91480ec466d6904aa8c67cb5534cec1c11ccc0cad1f88ac6c831000000000001976a914a6e2a3c37b82576ae223efabcc5bad0e20e1e7d688ac168a1000000000001976a914c6864c257c2c919ec694c354f2f991d21661ff3e88accd8d1000000000001976a914ae64c130b749df465f1be247f9108cd1bbdc621488ac05d3100000000000160014a7e7f980e32db28a315eb45dbcc22f3999c817458ae310000000000016001496587328b28180dd09fe85d73db2719e808af3c25216110000000000160014ab659cc84ca27803b995115daaffdbecad0186b2f0191100000000001976a9148262cbe02b868130a7fe6da537ec0443d3f0db5a88ac174611000000000017a914706fb9e2744d979dff0f6bf1d213e4fb7e20a98f87524611000000000017a91426d4210bf180e02cd3ecf9b6a6d788dfde9b3ec187a18e1100000000001600140290b6fcfe76a63a9e1771ec99849b03a32f1f954e981100000000001976a91467b42f4443d02da9298fb9436e37ef8f07e8ec2888ac25e41100000000001976a91445ba6da2a0d8b8ff6170ec9399725765886839a788acea5b1200000000001976a91422e89231594e0169acb6e71144b0bc946ac4ffce88acfc8c1200000000001976a914f8887f55ec10011a7bea0eb45a24949d208ff7f688ac10a01200000000001976a91408809ddd185ae76298a5b7339b3a4556412073eb88aca6af12000000000017a914cbde969b65f6ff5f2ee7ae6a5be67d1fc71bff5187691613000000000017a914b117a5a71d89da227f1852d573fba8e614041e8b87c6e31300000000001976a91416f1b607788a0c5ee757d977ea3abfe49cfe4baa88accbeb1300000000001976a91454c96e0abde2d154a7ecf856116d996608513bdf88ac66f81300000000001976a9146caeb68bb288ce7e76831610daecf1ed18db61b788ac862c140000000000160014d097902bc396e8232e44d2672707bf945443c41222341400000000001600145c4c729a639f13c669236805fa07df94560435e18d691500000000001976a9142ef5b1b566cff21c636e6c23dddca8bdeec6741b88ac259f1500000000001976a9146a13b433b2e406c59cc2ec5041e782b84d5a7d0288ac1acc1500000000001976a914dfa316e51d264f7de4033777338caa9e024b356d88acca0116000000000017a914380a2239a213c02376550a40277e31831f6710f5871c3b1600000000001976a9143c61c1115f21682b46ad3e317d7f72bd8329625188ac645e160000000000160014acb03e006eedfc40b02a044c0fe02237828a7b829b951600000000001976a9147af6900f61ac9a5d35791ddd14d2b8dec1ad651588acfda71600000000001976a9143c113c33e8b95db26331c99f60e7d0e11f3c5d0b88accf281700000000001976a914a61b8a1eb1e5e7b822833990b383f8e977896e8a88acf22b17000000000017a91432a21838feb16ab48cedcab5995caea3bbc2cbcf8715911700000000001976a9147aa5b35b5718de6bfbf1b5df0004c412e9f428b788ac899318000000000017a914a847d071350b0bd5e22d779014b7b6bb281736138703291900000000001976a914e8b657d5bd8d53fa0f806cb7a4d97139e9c1e95e88ac324e1900000000001976a91435c879b9f2a349d157cce03341b1802a3e5f684388ac48ad1900000000001976a91428202178c32d041ff6486ff6a2bffd2b3a87b8b088ac9cb81900000000001976a914032751b42d1f1ca3519af033a0ef6f434573da6988ac92ce1900000000001976a9149c36cf23c9f6fb14638e082a5ac3a26c1888bd8588ac21061a000000000017a914f7c6ab5fc76f5cdf9388dc1a9bc3cde1d3b7a136873d291a00000000001976a9148ec04c7862b3f0c588373456472e5c6b8e2d9f4188ace0801a000000000017a914406c86165d9957638695f31f83c709c9461270158727b31a000000000017a914a3a4b08d094ee4527d40da5bf89d8970428faf3f87a9bd1a00000000001600146f9cf0f340b5eded2e21767a8e40ff4e162f8918ccf21a000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687262d1b00000000001976a914e6334d07c1d1e525d1106b4ade0c5ed68e78869088ac1a561b000000000016001466786a64b4ab69c526b271c8f4fd64ed4aada6c922821b000000000016001413cef2fcd733a5d264aeccde6228e9cc690e400556b91b000000000017a9146cf8194d0a25c1d0c2e1253494d26e41aad1c1c28727e81d000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987a98c1e000000000016001437fd2739e5c1799fecffaa4a6f2c0eb837572824a44b1f000000000017a914a82a34d3182a923af48305d9fe18696708de89ca8716681f000000000016001413cef2fcd733a5d264aeccde6228e9cc690e4005f12d2000000000001976a9142070d1c4ca941693222d12b7da8c9d3eabf5217488ac506b2000000000001976a914a633b7d27d14e22c53317773c179d55af342b70488acb06d2000000000001976a914aa222d43f129ffd59c5aa50876f49863139fae6988ac48a92000000000001600140171eb1a3541cfda29c673629b5ef57c89f1d38547c221000000000017a914c161560a3945c3aa8a9aaaaf017251bdae6bff6f879dd32100000000001976a914007ff262e4925d844a46e347fc53036b3ae8d13288ac414d22000000000017a9140b66732c90e61a64b810dbaa262acc65cef6630787661a2300000000001600143aaa9499b184fc72d126ab86acdea7c5d5509bdd7df423000000000017a914cae36ed15c068a3428c9d6e0b493b3efdabca6dc878ec32600000000001976a914d22b37281de6bd30bdbed64b9f46ebfb35b34d3188ace0b72700000000001976a914de0b8a81f11f186e7a307a7f20444d90de02b82c88ac74d327000000000017a914eeb5aa4e77f745ab6a697297acf293e0180934498739e82800000000001976a914769a54345e0664855e06a73355e82b1b86c1049488ac25ef2800000000001976a9147fee44c9746c37dac8d176f505270fce94f5747488ac55022900000000001976a91449c4663ae62ba546fde0ea44b11154b33c27acc988ace03729000000000017a9142c8e929bd1d81d9424973c5f378d16038b19b41c871f8f2e00000000001976a914fdd38b0a3eefb6fab97bad3448a8ad1b160a610d88ac73093100000000001976a914474dff9bad94c42e348cd20a229cf6c6fe3849fb88acb6063200000000001976a9143b1669b9d992ac2c3f3a252f64fbc8e6632f0c2688ace04d32000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687e5203400000000001976a91443f06deca7dffbec30dfa261b360d7e95713bb1c88acc12d3600000000001976a9144640436725b226d471beb95f02f93b9ad7310ca388ac40a43b0000000000160014aabdec5ce60f14496acf95339b90b9deeaaccdd724143e00000000001976a91401b9544341a27f437bd6f3cb52d0e2342d27f33c88acce1a3f00000000001600148c285e464df7ee48bf84384e64ec5fae75a4cd3052d44600000000001976a9146eac1f5ff74c026524501e43269206d4997141e188ac87a84800000000001976a91411c4a02e4a843fb2efeb4dd7d288dd5b101cd5db88ac005a4e00000000001976a914d07e98f1181c7867de37645b5421589a9ef0d97a88ac093c5000000000001976a914f9db67527b49c2fc68fba751cca640ca92e0369f88ac796f5800000000001976a91491715d11e269cb628713fb0c0ad75ab6c0ef402688ac72ea59000000000017a914c6fdb1b6a14e52339fcf6d6727bf956da3a4f8d787140c5a000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687e19564000000000017a91451da3796757bf1af21e873a6c4127bed0af8ee1a8779cf660000000000160014c7c96e291640dbfe7fca2465426fa79d07a9bc0a6b5f670000000000220020cf042a83cff7ff40df6165438cbe9dcd265da3ad522a4bfb2c764740265ad223ac946b000000000017a9143393b9515bd173270b3635bdcd43275263fd16d7878c547900000000001976a914b9a58d6c94daa50c9b7882563a3d4d5ce4bd8e7488aceb8679000000000017a914f6b7b147b321805384dfbf9677476e92ce366cfe87ee108700000000001976a914eb6ab75bec48c411e819db460fe09a2fc63f3f2388ac6aab9d00000000001976a914a1fb1086c25d30128220eb39f68ad1ae8b66bfd388ac7c6ea30000000000160014ee302f90b2f3b64e84a8996de0a96e724a2e1da0ab29a6000000000017a9141588eebfb3c312126df0e82c07ffeae851949b7687b1f5a7000000000017a914c8bbd80af9f09f0a9a62bd14780658afe614517287f95c86010000000017a9141588eebfb3c312126df0e82c07ffeae851949b76876bb7ef01000000001600149da1c3281a3b471d8bd3aea248bf4ccb0518c04d50327d02000000001976a914d4ddaa6ee4397874c9b080e28fdec849df43ff7588ac02473044022079225d137cb4a9fb1f96c8668a5ba7b664ed3fcb2e509a06073d8fc4d21343a702203cb0e5ec38f945a7051f3e614cdc41f6d4f7dd93b6a9a493915acd0ceb756a4901210240362258aea90f1287ea3404b96310d5ac45a218e1f408fd840123906b41134e024730440220569e66cba3a98c99e1bdad85c05b87bbccce34cd4b78349d3a8438dd4d40e502022037065805c5aeb734498a53babe2b241802cccf413889a18464967856233438a60121038da4c845a0ec467f39a6c3950467654b9d844854c8be3bbe95173555819734f643a00a0002000000000102377ea3bd3b8789ac86968831a58f2fe212e5569ab29ea424ec74859fea1d13625809000000fdffffffb775f79af732ffb6bcb399dc2d5bab2bb32acb6f2d47c6b9b2dbe878eea8dbef0200000000fdfffffffdf7080a040000000000001976a914f4f34ac12cc4ee947108dcdbe627812f23d217da88ac3d0400000000000017a9145e475155a3a3e46a4e5a38a24f8d145fde117e94875d0400000000000017a914bc1009ff81c998337fa476fefff28605d711ae8a877904000000000000160014455c08ca3246eb506eb4caa720768fd1ba138506de040000000000001976a9140f829cc525d0d07c60579b9bd0b4414435a495da88ac220500000000000017a914dec396dba71b0398d13a8ed401f320150ef40e758799050000000000001976a914baa4a2abd2771611d150b96bce199fc95fdccbea88ac12060000000000001976a9142bb769b5d0035a1a7ab04379b9b4d86f251ed95488ac51060000000000001976a9142f76c2eec6fbcf0ae5013df7525360f7fbb4421088ac87060000000000001976a9146bc2c101c27aa80c1b643274e417b3f0609a0a1688acfc060000000000001976a914e9edd2a8a9fd555f60a06948678bd3a45971669888ac040700000000000017a91496fa6df1285420c7ee9080a5b02ab592d74df5fc874d0700000000000017a9141533d3a10c354cdf356e364fa46f285f79aea56e87630700000000000017a914452e5c26b2599e3ea76636710621404255fefde2876b070000000000001976a914289467455ccc56f3a23e1003b83b708277b0c4fd88ac530800000000000017a914fa4afc597b543e750354a651bc57044a93abae1887150900000000000017a9147dc479bc7862cdea6d5e11e44f955f554e2f4761871f090000000000001976a914e30c55227c04f4effe17d81a7c1a12a3734ae47588acf10900000000000017a9147dc479bc7862cdea6d5e11e44f955f554e2f476187f50900000000000017a914dc6ceb4e180d20896ffa173c2ee84a263b87a8bf87560a0000000000001976a9146d688bf7d82e42e3e6bdb8d5a4c20c7b9b0586ed88ac840a00000000000017a914be6a8890422069e79db5bd020a576eb9269369bc878b0a0000000000001976a91415bc97100fcc59d3d1bd5d749614f468ff2c095788ace60a0000000000001976a914d36a8dbf6eddbdf913db3783662f163a945b5b4388ac400b0000000000001976a9147b2960900eee9cbf30d66cf945bd40a6872acc4d88ac470b0000000000001976a9147189082114d3c3e1e1c0327e6796169a180e697988ac5e0b0000000000001976a914028365ea29fcbb316a4d40c95e047ce891b5c2d488acc00b0000000000001976a914f39e67431c29faeed7b9135dd0ca72e7a87238df88ac060c00000000000017a9143099190a449aa3e11f488db76889e2dc9f165dd287130c00000000000017a914ff8e38a0d0d74d00a893935a5657e5271b32034f871d0c0000000000001976a914cf4464c202ddb1cdbd8fb939a4f6ee04528f36b488ac000d00000000000017a9144781ab0077cfb3e62e5bb57048ed929280b823ed873b0d00000000000017a914f8764ca72cc7a2018967b99f802b5363448f60cc873f0d00000000000016001402735f6643d5f1ebecea0be8517abc837d1ee57e5f0d0000000000001976a914a698ea6edeabc8c245ceeb6ba1116ddad4b4216a88ac620d0000000000001976a914cad40e80e6e0ec763310f8424ad9526d8aa19dc788ac8a0d0000000000001600143223e14a4f0280ec28b81bff15f06cd026642a0ff40d00000000000017a9142ddd3d54001f713dd3f786d08091bdf3d3dd88bc87770e0000000000001976a914015b5f3056af756e4d9b5389a3762d5dc160170488ac820f0000000000001976a9148cf23cc765b84719bf0dbe6b9a81651322dea66d88ac8c0f0000000000001976a914d1b10cbda276f431b4636126d4261785163b81cf88acf90f00000000000017a9149eb7507a678916308b0b164d3366d440997193328797100000000000001976a9149db00341cb81d796db0d969a9ff5fc29db2c349888ac9e100000000000001976a9144afd13dfa80f4f3fc03a2f6abe64327bfa64f59688acb91100000000000017a914591ebd26fc8ab950ebebc6a58ab24ca9f5cea51787df1100000000000017a914a5a3d1cbbe84c9a97d58b374f884607dc6e595fc87061300000000000017a914d86b439c7acc01e63f7e4ca5f18c18023e936d6e870c1300000000000017a9147999101a6ecf2c2a34fe9161c15e1ca50e10d1438742130000000000001976a9145d7f21709874209475ef97e9e636e57848beb05388ac7e130000000000001976a914a65508aa2861cf396383f648e271f7a98344066e88acc2130000000000001976a9142baa31a20503dbf2b28996925d00e6f07a2b208388ac14140000000000001976a914ab90a20f9134c42fe50815fbfa4b22c32c330c3d88ac651400000000000017a914c945e94ebd884b0c7b0b21c72cd1e6c76e72fd85878e1400000000000017a914ede74c3acaf3799722a1fd2ea6948426907815c787b11400000000000017a914a3b11828080c68cce8d9e49b773c444583b27e0d87cc1400000000000017a914919a33a74c234c1dc0ff056215fdb47858c166b187ce1400000000000017a914aa3e066c297811a2662f86d068bea62f8815b15087cf1400000000000017a91455d8e10c0978072105170203ebe39082b8669af387ea140000000000001976a9147672a49949afda6b5723a0127fba85a5f2c762d988ac0d150000000000001976a914e9ea45e137279829f204cd6dc5a5103b65c3dcce88ac31150000000000001976a914d5cefa24b8e683ab3fc4921dc69a74c2ba58c60c88ac8f150000000000001600144cfcb5eb1c51fe8dd687a136cb0458ee77b1b584ba150000000000001976a914c8a4ba489c0b1d0272563f8facac43089ecf26bb88ac1a160000000000001976a914dc7e68b9cb60cd20ddeb21dc4d637723c2a995a988ac3c160000000000001976a914826709846d91e5fbde2a2e04c0434e6fc765cba188acb61600000000000017a9144d4c3e95cab77ff9159fd18763ad8e47df8514a187c9160000000000001976a9145026728f7d6a1b450d687eb4765f3d7365c56f3488acf2160000000000001600146094001efafb35aebdef39f3b5e35646d4068317f2160000000000001976a914e4d3e1dd2c8260837cadd12a095e28ff0dbccbc288ac4e170000000000001976a914bf514f552f43f6caa70c2d2c03ec64559f26b7af88ac64170000000000001976a914bb4981e7d29df45ee88e8ed6a4bb6c24de841c9d88ac9c170000000000001976a9149fb69f5a0d9758e5aa5d4b6a8426b3fd6daeef3d88aca3170000000000001976a9146d3c5718a855eaa8c8dbe8ef06518934a5c54a8788acad1700000000000017a91476269905cbc7cf05933a263f1d893b5ec0a80a1787c7170000000000001976a91483d059f5acdeb0c11c32171c839342af87bc948388acca170000000000001976a9140368ae7abd1332a52a3a7d20e151b66723047eb788ac241800000000000017a9146843b38290d1160d64b64adf2bd707b16c0c1c8c875e180000000000001976a9146983e0ebfcf1dadb4b81641c5657b9fd316b412d88ac6c180000000000001976a914a9bb9cdcffad9af7ec9f02ecdf9f14844be0683588acbd180000000000001976a914ea4a375ebff3245fbfea114b8b7eb8e9184a605888ac341900000000000017a9144340fa4a4caeb942e4f62650d8640840f223aae18776190000000000001976a914d7668591de1505557d5f6257a30b6f1d743c0d1188aca4190000000000001976a91455e724b6c4289f80a26a8d35b80e39dfb1e34c1088acc11900000000000017a914900ba0ee66a12bdc6cea113419670a3e36c753ca87c9190000000000001600144a80bba86041e8be6c0e46a778227d726cb6067be3190000000000001976a9143d52754f883b3e09c55c9d3ee07084b05a43722588ac341a0000000000001976a9145a64380d5313657f26ad52bb086f1d4b0adc5fc188ac4c1a00000000000017a91463641e74e3294ae507593277907437b106883f8b87601a0000000000001976a914291194a6d3a874d7194f245225ef497738fce26588ac811a00000000000016001406be7370910b52f31c3f5adf18d975136a94bd4fa31a0000000000001976a914aba5d3e53b1e24dd1bbb07decb99c222211df82588ac0a1b00000000000017a914755939ce5de97480d3e5dd75971545528e9eae3a871a1b00000000000017a914b829b0cecdc981d00babcf7ddb23de4f401bb26887451b00000000000017a914f37fcb344e74b825a7d1abd5a1bf3be4c976ac9b877d1b0000000000001976a914a315015838ab8d9eecd1a4d864a7e44632880c5088ac831b00000000000017a9144e2187dd932000da777aae9e709ca5967c109d7287861b00000000000017a91485fd49ea3e914009933ca5e3b00efd0d81796ad787a51b000000000000160014864a4b4f1bc4ce7256b4f847e3a812b58d0c53f8041c0000000000001976a91498991a91fc4d152103d0a96d758ab4d83dfada0088ac371c00000000000017a914ec4e9c5ea1edc168bedad2142546c7b6b3dc9f7e875e1c00000000000017a91408b540f88424396f678ad0577d11843a2fa26cf4876d1c0000000000001976a91429196bd1c9e7d863f5adae957668f97c0be1ef4788ac701c0000000000001976a9149ee838c3958079781c97350810a681a9ad75095688ac7f1c0000000000001976a914e98e8e772a76d74a8026a139a1c8df3e52bc27de88acbd1c0000000000001976a91439b15623fe66db39103944670eaf233feb9ac3d888acbd1c00000000000017a91465b0085c67b59ef6e2ce25bf9a9269a0f7a7333287c61c0000000000001976a914ed341d5c87294f235c0ff30fb006b5ff4b869d2b88acd61c0000000000001976a9141cf45ff071b17b6a03c30e4300ec289ee5254a3288acdb1c000000000000160014647e14743604a262ca7f40fbb3f62a40cca077d5fe1c00000000000017a91477ee808ea932a9f0bcc24e2c60c4da8073521e7187141d00000000000017a914149f5c9347ee6e73a57e6eab6db0e7d59bc4963e871a1d0000000000001976a914f927326b5819f4c8c607a05651e62566ceedebad88ac251d0000000000001976a91488dcfe6753a44280ad05e806c2628db58978f93288ac921d0000000000001600144737e9fe412e1d1e93f36d7f2c7a4cb4d6389476951d00000000000017a914c71b9e89da1a7d46b2107481e31aebb2d309c5c287981d0000000000001976a914a8c252e03d07219314be5408b20c53fa5baa8eb088ac9d1d0000000000001976a914982c0ea37ac34b431bf7a2eb2bd806eafea6d30688aca11d0000000000001976a914606dd733e9950554a89382dcfe1fb7d979f6f47188aca21d000000000000160014e5db9294c540741b11edad93141af638ed5c306fd61d0000000000001600142151cde7b3c3334d84b3e43ee8402e587d92c115f01d00000000000017a914dd28acc413a97126f4bc9533b5820432d35dc86787fb1d0000000000001976a9143926eb427cf76f5bd2650b905e2ed54d9300d5d988ac171e000000000000160014f0849e139bebf3afdb56a737222f9ad724ef4198271e00000000000017a914a04cba20915b907ba67d997e79ae8668782515e987341e0000000000001976a9145656bc26f7766c41434faef75522b28cec94e89088ac501e00000000000017a914dc4db56801203f92ca83ba32a53775e317c07d6a876f1e0000000000001976a914c68af71242d2ea94025d078dbf71d932e4c2a29188ac8c1e000000000000160014e82f3b91f339550b52d17bb924da519a3e927f50c61e00000000000017a914710585359d956da31a9ab4fa0c91e55d06494db587eb1e0000000000001600143595554ddaea95815fa0e851a2b88f34909fb8460f1f0000000000001600141b06dde710494eef1cea749f935a046b5b37615b311f0000000000001976a914f3a2f91d667159bbbd08d2b274071306eba03b3388ac431f0000000000001976a91400f3516629dbffdebc8db8aab44ebf71d2bd7c2888ac471f0000000000001976a914fa126c82122dec1972561d35615cf7eac054e0d188ac621f0000000000001976a914bc9d488a37086a7aff55026f0397b2e64299a87d88ac751f0000000000001976a914c7bbde3cba36ab9224e57c83349ef24a5920a33c88ac911f0000000000001976a914d8d8303d1d3f2dcfcc9e2ae8fac9118aaebaea3188ac9f1f0000000000001600146dc1c99970c7c8d8f795ca5f96ac0425bd536e419f1f00000000000017a9148047f51f1f5d61620a5c60f100695912826bb3c087f31f0000000000001976a91426577c9ee264c3cba4a206370fc5774779b38bc488ac0c200000000000001976a914b927f115471f295d362ea0cbfcd7302a9aeac49488ac252000000000000017a9148bba40848d789fb42aada47e449c9b4d04a0417b874c200000000000001976a914615eab02881bcd2d58a2fa060680bd7f87573b4f88ac63200000000000001976a91415810e03890e95287c73f912366a956948b5689888ac6c2000000000000017a914135de527fec42b5469777091aa8f1fa928799f5487732000000000000017a91457feae19f0fde7375258bda742ea85d5df90a44387bc200000000000001976a914c51152e05d486e0b9079457d54a6ee446110395788acbc200000000000001976a914e3d18bbd6acfaeefef9b46aa087e209784b005a788acfc200000000000001976a914190bd80b07f48b9689e0f32b89c0f2a4da1ace1788ac3d210000000000001976a914e43c773e06639b3e8e72aabf103f92e18fab8e2288ac472100000000000017a914261d0afa3399f806e54fb6a10cb069f0d8fb280187812100000000000017a91480a972a9e834d6477bbcfcb7d970d1b21adae3e88791210000000000001976a914d2736c3088a9bf81f21994f2b3b34d7009aca99788acb5210000000000001976a9144fbb9313447c046c0ca63662c3df66b5780f8fb388acb6210000000000001976a914dd0f6f1eef0f68d66766c27553ec68763e64152c88accc210000000000001976a9145c5273199ef0352c42d2d9bc50c0b9bc92d1560f88acf9210000000000001976a914e04d0565c948013b4f8f6072ac99d8d7b0aeefa688ac00220000000000001976a91486fdaf75966bd920cfab34942e63bcf52df2bb2488ac18220000000000001976a914e34ecc4cff88e1aede59091c476c3e7be02153ff88ac43220000000000001976a91448da971f8dbf44e64d66641fb2c34eaf15ae453e88ac77220000000000001976a9140ffafa7ec57eaea0e08376840a33ce61f8a4925d88ac9222000000000000160014ed9c596fd728197fbf3da4f9f445b3b61bbd4c08ab220000000000001976a914130b94cddf20f4f2c4860a99bfa6d973bf3e756888acb62200000000000017a914277989c6c95673bd21b5a459bf5a316602f7789d87c12200000000000017a91447a591e4651444090372056986f8632edfb28d9987ca2200000000000017a9149b6d91924c93fa7a710dfe507d729be9766aa4af87d522000000000000160014da1e1f3bd431911eb98e341ff9a550d5969c108382230000000000001976a914dda5da8da49dc2cafac1dc55d0a626b77355e84788ac84230000000000001976a9141cd3d24b2dca0277277c71c60ed2b0e49cf69bae88aca023000000000000160014d51356087096c6b885f444fcb19f21e54937e629a0230000000000001976a914030947612e1e8f5267e9a715cf69c614004fcb4f88acb0230000000000001976a91428639efe11d2680c33945af5b581434657d466fc88acb42300000000000017a914f093a02413fe239e990a95a7104a7b766c474f4d87b9230000000000001976a9142c291261c9ef34a973731c1a3b521df7fbe2e05788ac25240000000000001976a914840e35c16b9543155890dab3e93bd75025cb0daf88ac7f2400000000000017a914f9876aff5ed4fca1224929018165b49d7d17ed09879a240000000000001976a9149445f8781ef011750970ce2a61ded5686d265aeb88acdb24000000000000160014f103e49f13cae558eb37f9904f214d41c3d8d2d7152500000000000017a91498ff39c230e71c5592339a7d270a8ed48cd36aff87162500000000000017a914ebb44189b022c8d40e1fbabc66a8fb540058b1cd87442500000000000017a91418c76348cfa5a7bdea2eb3357af4d484f837dca5875c2500000000000017a914e39c8b155d65d1a97926762040f096274454a4ab8773250000000000001976a91405b222aaaf2fe3c02c1d6ee10d59ffcad6614d0088ac792500000000000016001457f055ce9b84017571370aff914a6c617099d93cab2500000000000017a914cd5c7ca97fdd86599eb0b8b61b43f74089f2bc3d87b5250000000000001976a914671001fca36f10b8f765d72237618947e128571288acbd250000000000001976a9146b2e0f300c3d6be15c12ace892d873eb75e32ae788ac09260000000000001976a9141fd3fe6ce98b35f0aade9393eea13f52bd3d10c888ac0c2600000000000017a91426ab5002e552d963e8d51a3221dcbd142f48f44d873c2600000000000017a91401f53588f63784be6a1ce4456e98e043531c16ca8750260000000000001976a914ca68ee260f831a9e60a7cf72973354cb3965ebfd88ac90260000000000001976a91468bafaf844468734f75451115078d5e8c507a64d88ac962600000000000017a914d267bc07b28b98d999a8eb0d2fa27372d816bf03879c2600000000000017a914418bbde5a7586aae409770b34288f3e573e358fd87a1260000000000001976a9144fcd6065efbd27dc8f1f710690dd5e01a393918e88acc8260000000000001976a914c99c5e9020ad7f47af6b2100fded36e5ca1b3daa88ac0e2700000000000017a9146fe2007cdf52de7e3ceb8b8d9bd59f3cac278ffe874d270000000000001976a914559fcc7e34e10b3fa0c2e05094fb56d350b0511d88ac61270000000000001976a914d15d53d6e6b194d6a4b2ee5db90bc0b9f058694e88ac6827000000000000160014462ca4ed9e4566ebd9509ddfa5bbdb5a5584906596270000000000001976a91449f75439130b12ac2afb6a6012e6cebff48b812a88acb027000000000000220020bef894ee62832ade0757e2a36713903dcb450a2fc0a28dadc071c67571125c76b9270000000000001976a914fcac7e0e0f055e3a5873c91a24fab0f2630531f188acc92700000000000017a914645f5d2d05bfedbb5acecde8500a0baadf04767987db270000000000001976a914243a8263f59a5c4f8709c833c942906c47dbeea188acf52700000000000017a9143e404ac7a52593ccef2367b5568f120ec9e9774887f6270000000000001976a914e9dfbd3c2f8f2565b3c0f6e62b7c0d556fc8867888acf7270000000000001976a9142f88dc7f901e817e7275f43191da709cfd1fcb4188acff270000000000001976a914614720c5517acf57594ceb0ab3b08ab4d2d31def88ac5d280000000000001976a914b3251259f5bbe1425b2fb3f2ee9c84003962adb888ac69280000000000001976a914dba81acd054bd2415bd9b506ed38bbd87a33d10188ac7d280000000000001976a9142e15084514d9f256871f33d070f4ff5515e162e088aca3280000000000001976a914283f752db00017b0eea9297ce86a5ffa4c5704b388acb1280000000000001976a91497159d94490b688420968e38488ec097ba86277a88acdb280000000000001976a914b155e9ee25e043a19318c0456b89a7c2a0b31e1988acf22800000000000017a914c914afd350e1a7a105d5a20493500b8b0d638bf087fc2800000000000017a914e0b58babe2390c8b2429c882b07d150119ab22928704290000000000001600149847a1c8d6b6c411c46f8ba90cc4ff222001312c66290000000000001976a91437354687127ab9e93a471746eb34f64f500c88cc88ac8a2900000000000017a9141732e90b9e79f9107aef2cd06bcb42141c522b93878d290000000000001976a9141102f1b595b939c6f497e8d070b80b7db0520ae088ac94290000000000001976a9145f4e92de3160208d6bf59e8bd43c6c916160891e88acbe290000000000001976a914d7336248eaf8153cccb74d5a7e3b547af443e85688acc9290000000000001976a914b449aca213195475b3d77ec7d79dcf001fb3b4af88acdd2900000000000017a914571ee56e762de59774e5fc30d4ed34170af0d2b787ee290000000000001976a914e98e025600afceba6b25744073be1ccdaedaa30b88acf12900000000000017a91457e264ecb11f8d3ad7d7509a65b4860f45aefa1a87142a0000000000001976a91474462645d4a4c7bfc6d617d41dfa900447cad22a88ac292a0000000000001600143c674a8d74e09c418bffd2377626a718fa3e7d4d2f2a0000000000001600142151cde7b3c3334d84b3e43ee8402e587d92c115352a0000000000001976a914969cf9c1438797ab5d2f728144931b83290b722988ac3c2a00000000000017a91414c41838387fb77f1f5351976c3bee85b6da839a87492a0000000000001976a9145501facef697410c1671810ff1aa04fd76b07e3388ac4c2a0000000000001976a914003253904b38aff857fb561800421f84ebc563eb88ac652a0000000000001976a914b3251259f5bbe1425b2fb3f2ee9c84003962adb888ac772a00000000000017a914f3ace4aebb979bb443476ada026417934fcd3d7d87832a0000000000001976a9144fdb2acfb0dad67d7197abe066483fdebefcd4cb88ac932a0000000000001976a9144d5963bf938ddfaa19458af186fd91d7dad7bd0988ac992a00000000000017a9143039c877dc0446154989e2471de5e6a69eae697587a22a00000000000017a91421977fabaedf20a1b3dd25c58020b9007fabe17487ac2a0000000000001976a91418306a2b9fe6eb1e0add165761000ad2989e9b7688acb32a0000000000001976a914b5ccd3a7a1ad067d862e8f7eac9e4d685be4dc3688acbd2a0000000000001976a9148cc6bcd2b24e1ccc2294f1a4f2e75467abb5610688acd22a0000000000001976a914422b9744891d233d6a140ddbae9fff8a7bf3935388acd22a0000000000001976a91476f2a3347f5711b8f7d9a5dffd8b68088da2d32788acd62a000000000000160014fcd6a72cd9f2710fc97bcaf330d1ab183062ab2dd62a0000000000001976a91475d0df1f826ad3166c305e02a0fe144c34144f3988ace22a0000000000001976a9145b0e419d7dc105a81a5a14b867c7a10d2590544d88ac0d2b0000000000001976a914d7b5187109d2c76ed10a7b837a697bb736da3df388ac172b0000000000001976a914d55ba22a808c82c5159bee8ff06816f40876cbbc88ac222b0000000000001976a9149337d8caa7d5e8ffe0e2556e508e47e4e913c68888ac2e2b0000000000001976a9140f8d7bbef363da484dfd480ca61b23608059d79588ac3f2b0000000000001976a914b3ac2d4bdaff437b06098c053e4cd56fb47bf5c688ac442b00000000000017a9143857ceb7702de45881c2cd98c27ad0392d01afe587452b0000000000001976a9147fb0c167195685b2b5ea7d37fa0089ddf606c7c188ac4b2b00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d875d2b0000000000001976a914adcab620b9c7a9b46c14d2a77280e55cd23d04d188ac862b00000000000017a914951d79a23f8246a830f5ad6de4d5c94e422f6268878f2b0000000000001976a91438cf2aa0a1f4ba03221892feb51bcb2998a0256088acae2b00000000000017a9141fabda88adadf504c1ae73727aaabdc79750dd6d87be2b0000000000001976a9143e49351bbd8646c9253a85ff238c4478c954653588acc32b0000000000001976a9148672727f11d5fd0e16882f124e00cda8fdba9d0888acd92b0000000000001976a9142541200cf1665894665c91c595ce58a2c919522988acdb2b0000000000001976a91402aa8cebcdb0df5afb525af7170b781f56cbdf2c88acdd2b0000000000001976a91486045c918faecb350b16d3743366e69420366eb488ace62b00000000000017a914b5ff1fdae53e26eeb438c4c76d439073dba3a3ef87e72b00000000000017a91442717e4a961f25c3a5e3304bd3e0335df22987c787f22b00000000000016001479e951dcbe43520116841cd39c6faab85d206297f22b00000000000017a914af46967eb53ff2a73d3885820879cab226af4a8587f62b0000000000001976a9141a1a9b24823eab0293d9308b6bc72aafadf26d4c88acf62b0000000000001976a914ce4656584fa4ec4f73babecec721ecb1620d6eeb88ac002c0000000000001976a914873c99e82f6a3620ad7cd8e26d45175d4ce9ecd488ac122c00000000000017a9140a60741c1db01d5e4e940b5139d39fe0cf7857cd87202c00000000000017a914c845114b8fd87d264fccc537434496d35325d9c187232c000000000000160014aa1e9ccb3ff461b868cff656f14bcbf95da46710382c0000000000001976a9140d17de3c008453b3b529a6cf4389c84c6829ecd788ac562c0000000000001976a91486a2e045cad1f432dddf215954f7414b738d6cbf88ac572c0000000000001976a914b29d54b0626922947e622f8271f30317c2a4734288ac5a2c0000000000001976a91460e700ee89ba49d8000788194a974ce6de63848588ac732c0000000000001976a9145fbd589586fd378f14c5bae593e0bf325f3a907788ac7c2c0000000000001976a914f42bc78d5de5271dd82beea301c322e14bcb407788ac832c0000000000001976a9145e8c906d95fa56b65b3d6d1946c857fd5b33a66f88ace32c00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87e32c00000000000017a9143fbc14a2e4ee9ab5e9979657a27a6c3c0e6a853b87ec2c0000000000001976a914a877fb7bb2160b3d65fc7855ba9a1e33d857860a88ac132d0000000000001976a914984620e93b1cbd684c6cd1070da33f28d2e0515188ac3e2d0000000000001976a914058938c96e867fbfab78bc1988ecb87040a6158188ac432d0000000000001976a9145185d91f310bded57d52a26679de0d756b906ccb88ac432d0000000000001976a914d49baa180502f3c7cb6836d8c3dd4618e754ec4a88ac4c2d00000000000016001423776d4d421feed024fcd332f7c8dbddaaf9f07a4d2d0000000000001976a914c6fd82b4591d667050a1f02d21dfb4142ffaf4e888ac712d0000000000001976a914bc886f74c805618c5e7e65d6ed5051e43d5bb16f88ac992d0000000000001976a914143822b0bfdfb1252631c790d72b8d13435c813188acae2d00000000000017a9149907e146f01130a349c0f1af30ba0916427c762c87c42d0000000000001976a914a2d62932d13765051e38bc771a130e95897c08fb88acd92d00000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d87e12d0000000000001976a914c8e7c09f49e8a8d88c1254fc3f37fbbdcce0784888acfa2d0000000000001976a914de69b3e18f15c57352c69ef0f64c37bbdd75767c88ac1b2e0000000000001976a914397a64ef3ad3aab765b266ad45c7540a9003ee9488ac2c2e00000000000017a914c0ae84faeddcc4540b84b97cb9107ae25e84af7487312e0000000000001976a914c66d3ca4f366dbb4c533a0f39c91b655c6d95f5688ac7e2e00000000000017a914517085e13d17c3d9a8c20e95dea35a7c74be57d6878b2e0000000000001976a914105f9b091bb0adce0575e1412b5a97e0249bc3fd88acdf2e0000000000001600148d1a5cc8f0138df8d65eb4104a9503556b276619e32e00000000000017a91428f9b9a29378451c041415addd13df199bbfef4487fa2e0000000000001976a91401111c3107b6d41b48bf0f10ae5f5f2ccf3e7c8a88ac072f0000000000001976a91408f5e476a4b3ab8172e1111ef559d2b0f03b938188ac162f0000000000001976a91431b1af10aaec5556a6f501f771df2a6ad51efcbb88ac2f2f0000000000001976a914e593361a7141cd61c45879b89563239b2b4cb44888ac552f0000000000001976a914143822b0bfdfb1252631c790d72b8d13435c813188ac6f2f00000000000017a91432027d944ab604819dcc88f094256b846273a8d387722f0000000000001976a91426bdfb6c38e54f31bf3f34f22c686b6166c26ad288ac742f0000000000001976a9149d34530050ec7796b8d53016bb53ada818f7b05488ac8f2f0000000000001976a914d55995f20ad44d4a8b9f68eba2761e7974f17ba288ac9f2f0000000000001976a9145d8f79818c7062efb41ce26bd69efe492a4a3e5988aca62f0000000000001976a914f0522e3432c32d879437b88b5509d3a81b24324988acb02f0000000000001976a91427c10f459c9dac1e04e9b9e5e2c092df96e82bfa88ace62f00000000000017a914c0539f2acc3c9923a4acfbd776a82bfa6759d50187f52f0000000000001976a914aed8c6c93809d0426a63fe17c62d560b486191be88ac01300000000000001976a9147322a61f9705f2133b0962ad05fe073d1bdd7bc488ac053000000000000017a9144833854a7b7018045795afa13bdf8e343f725ab58740300000000000001976a914c0f66568e8c6ba003c5ce27c27ade8aa1a9b504588ac5f300000000000001976a91493ad361b992e2d6e61aab7e10eadc1b1433fa58588ac613000000000000017a9149c83bb299e411d8de7de4dc719fb97cf397e658a876f3000000000000017a9145e75dc1fd8bdfc20505353a1d67d880fe67ff1a78789300000000000001976a914f3ab2051d16ff72aff966b64337ea3560f10c28488ac973000000000000017a9141cb482ca459824d1dcb8e24fa0f49b530c3f937d87a4300000000000001976a914ebfa7a2109115dbea23b1aa791f07888d191ae6388acc33000000000000017a914813f5a9e46c4f544e2c292b3f98d203533fbf7d887e530000000000000160014d2fc508573511466f5897c5ebfc0a07aeb744f41f43000000000000017a9141942b040ee150dc030d03291559b70954913d51887033100000000000017a91467b13ba2fb87ec9497dfd34c2fdbbc78fd1144c8871a3100000000000017a9146f258cdff519e5b3e43795fe322755dd171826e287443100000000000017a91416771086da143ae5532d456be23ce2948ecf4cf58785310000000000001976a9147eea180ccffc7f9e7bdc81c3223f31c9cd80ee3888ac9c310000000000001976a914731676fd57454726b2b2ce4a80c2032abf1dda1e88aca1310000000000001976a9142feff3e8f1446bf11e3de41b97c541c30f843a6b88acb6310000000000001976a9148340513bb1dbb03419dd9b2e2f9b266963c0672d88acb7310000000000001976a914025e14ab45eab24d15518298e4ea0bf7aa39aca388acbd310000000000001976a9148a2d4ea063716c2cc64b166dc3f584c1afb1bee288acd13100000000000017a9143aa5043ef97c7f4169e6bb6435872fa401cec69f87d6310000000000001976a914e6952a35b7025d23759b6f4d04807b699a0147b188acf6310000000000001976a9148e3b6ce10fa46d95d3aeb5f7bb5f2acf047e978988acf7310000000000001600142ae47d399166b723485a14d706a6beb21af0c84b06320000000000001976a914110b082e1b18927edf17fb7cabf05f10c11867ba88ac07320000000000001976a914395be6b670ba38e5a01ecebd24bcb35833a4c12888ac12320000000000001976a914eed051c0d501943e346564a84b1f8ab644b503fb88ac5c320000000000001976a914fe9b52237b43f219858eb57b8e764e29363cd57688ac6d3200000000000017a9145e01b93325cf352c777a2d73faf5689fc1294bb08780320000000000001976a914c52198ddc029255db8b8e4728b700071b7b6d04f88ac81320000000000001976a914eeb7c8e1afcb31c8b655fa9edfc05c9c8d07dea388ac8a320000000000001976a91473ad8bbe8495f16f52657df96002f399e899ba4888ac8b3200000000000017a9144fd14e53f87a1f1d63b4f64d484eed5e20e6a54b878e3200000000000017a9140fc4c9e70ad2d135f442300aa9de30e7a0ed43aa87993200000000000017a914157023e8ea6905da2e7397a82a4c74a678fdb94c87a4320000000000001976a9146336a525a77680abc764ae4994e8fa7f77bb592f88acec320000000000001976a9143f55f0856f7c90cc16d399a4e5d6014b790346e988ac3b33000000000000160014a369262738a87970ede73552ddb2507a670c5e645d330000000000001976a914b5a5c004e05874d3834c067b00b638132c200a3288ac6a3300000000000017a914b2cef6d81664a366384481633b8ac2c5205ddaab8777330000000000001976a9146c799cdbdf10b66cc09652aa00d824b4beded69d88acba330000000000001600145cb319766defea349202944260091b8dbade2e8dfe33000000000000160014e517d000d1bbbe67661034e67406a79b4664c0ea983400000000000017a914b9e1d3763ebcf48657f738dff0c1083956f63e5787c5340000000000001976a914922461fa6728d3654d6ceacb7de51db8952eae7588aceb340000000000001976a91458dd90941df5b2bc1c1083348784ed09cf1a5ca788ac0f3500000000000017a914a5b741231c818d912a08235bc2f9e14f828f6f8787123500000000000016001429b75c49886ce5a480d45617a6e5e2de621fe5f9173500000000000017a9144345ebe2012abddf3ed05d2eacc1dd47a9ef59658756350000000000001976a9148b34f7d774eec99ed282f948ffb6d8518628bd1288ac63350000000000001976a9144d28e28f4e8c500d70296be93fd299a607c4f38c88acb3350000000000001976a914b7a50ea48a1822b8ec4c9af55efe7b115037483188ac623600000000000017a9147dc271a0c993b28d4767cbaaca41522da7b7b180876f360000000000001976a914133d8f908dcf3bd59371d8119d7296012d4627a388acc0360000000000001976a914f42abf34d6af7d434f3533f8b8679806fcf28fa688acc83600000000000017a9140b9aac64d32d77eb00d42f2d7291a09c33c3857d87d0360000000000001976a914913cb8abc1ccd82abf4ee26d971dc8d67bcbea0788acd5360000000000001976a9147c3ba934d56f6da7b3fd8e53dfd66d8f474d823a88acfb3600000000000017a9145ad4339c0186df2fbdec4fb23108669574fc440c8722370000000000001976a91435f0cf35c73f2e724b5d018b52f64453fe9e964888ac253700000000000017a914a7383eac61c6ccee74935834f19525f180e85d9e872d370000000000001976a914e38211c666b7b6e728af5b37860339596cd4723588ac3c370000000000001976a91427230ee8f662fa28f1416a17f45a5bf3a40d814988ac403700000000000017a9142bd54df3938d9a2631c9f163431d1020434377ef8771370000000000001976a9149184b4e558768d53f8c3c75fda34e87ed3f1c67288ac753700000000000017a914eaa8d57d48834248ebb920e3ae92edddd7c00f3087943700000000000017a9141ddaa1208d3367f13129ce64ef82553e76b2359a879b37000000000000160014c6ecf0999cefceec8437205baebc80dfcbc1faf5ee370000000000001976a9141e55fa16f3c3d58386316058ab6a3281a9b87c3d88ac233800000000000016001458024ec64c48a459ad61aef5b0d02c7ded3b14a32a380000000000001976a914261fbdb3a9a99d5ef822cb0df479c9cf3775930c88ac38380000000000001600148ab3e84b056c37b0e08257bc98fb2dbaa5dfa496553800000000000017a9149436765a72a87efb7d40a9bcdc7f31a327ecdac387a23800000000000017a914b49886c23578bd7531c7afbefc57b113680f3b7087b93800000000000017a914ebdfcbd912940ca4f42c18b391408262c1ca35ab87dc380000000000001976a914b7c5be4a103ab17fbc8502217a52b9df04ef650288acf6380000000000001976a9141e10e1509c09225acc5f5f59a9d133d273f0fc9288ac12390000000000001976a914303510f3c145ee9900c5fe2ea83d9e39f26c4b4088ac57390000000000001976a91403623e89bf9174b6efbfb866c34180ae8dc695a588ac793900000000000017a914135c9139ce710148b3b90b4c396678728dbb77a4878e3900000000000017a914d31bf38b1235bcc53798435207d075aecedb73df87cd390000000000001976a9147e9ac5d55d814c313f9845d085ff9bd942c9cf2688acfd390000000000001976a9141e24bb6375a872f584478a0c64503370ffece7aa88ac023a0000000000001976a91441e3657abde75a3b90851952fdd51b7465169fc788ac033a0000000000001976a914695a2ad31368be09c7b95c69cd92da70c0c7d98288ac103a0000000000001976a91464d6d23afcb156cff96bb26a91752857d866518288ac1e3a00000000000017a914c5b4ccb576850844c851bc135098a957dc97fc7a871f3a0000000000001976a9143d098057f565f23596b671041a0f337611e32e3c88aca83a00000000000017a914ad10fa01e5fc5208dfa7e5f37f908f1a7a0bc18c87ac3a0000000000001976a914cf6e9439e9a51a36ccb95f8093b04114f441b9c088acc23a00000000000017a9147992ed335ad5150cb9edf3cf5c0a42916024447c87cd3a0000000000001976a9141ed372f5c48e12cdc764ed3cb746acbdef9ee92988ace43a0000000000001976a914aebb2cc7b385df1bed1ba0f9eda603ca3164783388aceb3a00000000000017a9141df7576a949af6fc9346fe8313c0c5a5e542840487eb3a00000000000017a914d11b00cfe8dc4f7a9dbf5770af0d6ac35dece23d87f93a0000000000001976a914da6ce9bc431f5a2b2b9214b9c418c64abdf8d4ec88ac343b0000000000001976a91468f66fb20fefc612247d4029462e7c0aad0b4a9f88ac3d3b0000000000001976a914b27f345487bc691fb6cf52b09500e0a5abb22dec88ac783b0000000000001976a91442e4ad276319531d32c2f656e5a387f8bb34086e88ac7f3b00000000000017a914caa3df490590784ef39fe632269b617310586a3287923b00000000000017a91459cc6bf779935eb0f33dda6d237f1c95f1197e7f87993b00000000000017a914af173ba04fa1d7a0084d5070d287402b03273c34879e3b0000000000001976a91477433c6356cb9f2ace67501565e831af8979cb9088aca63b0000000000001976a91490419ae82d4b8ccb2eb5480a5578cbc8a8f6921d88acb43b00000000000017a9145d1dd32695de8c1ce43b115dfdb0befef0d174da87d03b0000000000001976a91406782adb311bc0122b48c39ef6376f309585bf4c88acd73b0000000000001976a91458dd90941df5b2bc1c1083348784ed09cf1a5ca788ac293c00000000000017a914e7b564ecf5aff1564c4005f4d4d87daad3b62818876b3c0000000000001976a91485cbfb3ede76a1dc4a37b55531300fc4596691aa88ac773c0000000000001976a914f3d75001b4f3bc5335677c4f690340474cd049ef88ac863c00000000000017a914adb85343e31cba7a3e9aac9b77ec962d580596ea879f3c00000000000017a9143667346182e7a5794162cb4f348a32eac71cd00f87ac3c0000000000001976a914f049a9e97404dec533123d2fd5b2d4a41cb7918388acaf3c0000000000001976a91439a2ccadc436f4952f3c7ecd7303c330e5b10c5688acb43c0000000000001976a91466e14cae4ce275ce8e8b0a03e9cf062ce915f17588acc33c00000000000017a914fcc426071f0a30cd2802aec97af05519c2a94e8a87fb3c00000000000017a914c0177950f067227cd6dc37a750214bc8ffbb9f35871a3d0000000000001976a914be8d26f30ae9d7ab03cc3d1e77b1f7b52e77459c88ac433d00000000000017a914a538d5c1df07427b06800b39276ffb265b604b1987533d0000000000001976a914b027041ddf2a869d4e34a2a3c678b921b667083088ac833d0000000000001976a9146c0df0b86009226d0b609cc7c2771f646a75fb9e88aca63d0000000000001976a9146e8268bb36c8154660c95dbdcfc116997f906ed088aca93d0000000000001976a9140df2d2b5315ba2c52b4e1470fd43ecf8149dc04188acc33d00000000000017a914093d741ce030c8600375fd002c20362e051dda3a87d33d0000000000001976a914ff1f9967923316876ce5002dedcb698b8a4b876f88ac063e0000000000001976a9142fa2011841db9e2d64eaa72cfafcbd9fcff8de7888ac293e0000000000001976a91488f26a9126d5decd6305b630737f2b61ec12271188ac2a3e0000000000001600141f7d542629744a93d4a639fd0a45b5249d57d182603e00000000000017a914da50f309365ee2330fd137ed8915e45c8054ff9887893e0000000000001976a91483587909be3c07eddfee26370951bb955112755388ac993e00000000000017a914ac62a7bac5c85af52968dc16bb48cfded168755487c33e00000000000017a9142d8615b1d107876fc0a84025813b3e8e7a179e8487c53e0000000000001976a9142173d73e3c12d5b1938283bc5386c23ac7cd6e1988ace33e0000000000001976a9146281665f4412899febd2ace863f4bf20b05b0a5e88ac233f0000000000001976a9140a0c16c83e2c5d97de3fc86ef7ebc3e6d0d3cb7e88ac503f0000000000001976a91443faab85a5cda89d0ce9e91c251e0245f14d69f988ac523f0000000000001976a914e1f55e865cba5c0163e4240fedc95b5744414e8788ac5e3f00000000000017a914010d693c1c552c830efea1a0a9a094321f96d79687673f00000000000017a9144f5cf3aa57a958184b75ddbf53f773f51ce9d88487823f0000000000001976a914d15c80f10d6c1e73f9d296ae5898c2e29f73e3b188acb03f00000000000017a91477024053ebb5a274ab60390fafdad5b2903d93e78716400000000000001976a9148ac36abc15ecf70585cf77c48e0212c15e29d4f688ac2d400000000000001976a9141b9d1d0285af9df2330f394133ebff45e900475488ac57400000000000001976a91482c2a1ce65387e56c2484a0ad3c5b9a15cee575e88ac764000000000000017a914f6252c95fe40fccc4a20a19a8ba42a9e125fccc2879b400000000000001976a914cf33c16330d54ed65674c447f18689f3dada033b88acee4000000000000017a9140f7a88c124bd844e298e0b2905886c4a78390c0a873d4100000000000017a914e0bf080cb2b4a153a367bb33c632b42442027eaf877d4100000000000017a914a28f61f5a96a42b8e18808134dcb47f89c6048a2878d410000000000001976a914740ca8d177ee47f464613d0e35706eb5966c72ec88ac904100000000000017a91402df95f230c9150b64e68ebac46ceec2383d9416879d4100000000000017a914fdd1dee976d4b8b39fe65480f006229a86a0801587b54100000000000017a914db47fee92a242751c36c4dd31b8c96801cd0e07887c64100000000000017a9149d519134d01d71bb16642fc62e11926d827dfafc87c7410000000000001976a9148fb4798a1c2513e1ec676a0df10a52fad73d17a088acd54100000000000017a914caf8fc0aee6bc6063a9f90b0faf6e764894450468701420000000000001976a9142b746d6d6dc428cf38640ed7f2c52706a3cc70a288ac0c420000000000001976a9141500f8c2b588dcce79d052e0a37b4760e900ea0788ac264200000000000017a9149e63c032746c69b3f8a87ddb326ff1dca65179c48759420000000000001976a914cde86aa5dd1c13fe2472bf11ac6eb807c84c24c288ac66420000000000001976a914a5033332699f6569a6ba04077a81a921c032267288ac70420000000000001976a9140ffafa7ec57eaea0e08376840a33ce61f8a4925d88ac74420000000000001976a914d0364d4ee80cbc38e4ec4c81a5b4e1ca47483cda88ac91420000000000001976a91444e007c0f69182acd711e29564232f5ea918abc988ac944200000000000016001407a1ec578372d4b7b82eec8cd9b1a48c7b8e7547b1420000000000001976a914987b125862badf2be4cd639c93208e9ee1ea309d88acd44200000000000017a914a6c723073425f71f2adf1e180298ba6477956e83870d430000000000001976a914f9595ca2bae8e9fa964563e00475ea18968bdbea88ac1e4300000000000017a914c022047a9044a2b213cdd39e711bb50340327e328729430000000000001600145902c25cfff5beed8af911bc98a69a6481acc02f31430000000000001976a9142ace547f598a63a7baf974a4bdd03f564c7b619788ac5243000000000000160014a5dacabe4b7e584216e73d257f28d497cb550769624300000000000017a914676037116ff8a3e03377098a4f8e287e50f1259d8768430000000000001976a914c5b69c481d333ce83d40929b9f7e6e5e408faae488ac834300000000000017a914f8ea091b3de683404b802b825736a8d1e7234726878d430000000000001976a914b5d4e4fa85dbd36918d2b3a5b47c4bd70cefc75088ac96430000000000001976a914c37c551540a4d8628e208aef36f5301c1b2250b888ac9b4300000000000016001421a4fa7fbc49086176ee200579e55b8f340347a79c430000000000001976a9143b9a7696e6439baa1b65ca89b278bce1a7b690bf88ac9d430000000000001976a914de571652d9978e30962ef4d562cdf70490c00ccb88aca0430000000000001976a914828194ef44c349337e15e312c48015382fb2bab688acb24300000000000017a9144b1a17243237affdda52c19332f6ab0956a4cb7487f64300000000000017a91408f9f2f0c6d809bc4594f2354e21c02a736c18ae87fc43000000000000160014171f3e3257ece82b49c53ea2b7faa22f8bd02c0dfc4300000000000016001482056de04dd84dd0f9504d212364202414008e8c06440000000000001976a91455dc8e9e6165100619f288bb9c056231361a696b88ac50440000000000001976a914ba2050381ed14349113460204401051f5f40e61688ac5c440000000000001600142b773dba9cb0f60525b428cd63428cf06d08388a5e4400000000000017a914a2fd752a05f0d60938996cfc1c33fb09b0dd539487b94400000000000017a914d015f312fcea55e440b5b052304d2538de26b1628704450000000000001976a9147421b48a61e7a0af770f5f9ee3e39dae2f0828d388ac09450000000000001600149ee2ba20f18a87c61ee8ea33ecce4eda83cb44f00a450000000000001976a914152e6dd42064541d70eab5687cb5fc8b84f5c01e88ac214500000000000017a9149a311ede97a79f86b80acfaee106d9e545bf9af68736450000000000001976a91472158d1b9c2241b10e71c629802fb9b2681c1c5e88ac3e450000000000001976a9142695aabb711d2c110b64fa56a20a3226be669f3988ac6e450000000000001976a914e266aac644073c5d085343eac82f60c23ee1604788ac6f4500000000000017a9147a3397bd684abcb79e6b407b6c77deef697d3b94879c4500000000000017a914ed41f4adb9522b2edc98332b6d1b829d0235106b87c2450000000000001976a914f180be6e8ff3a7101c0168eaa9769e24d68e542b88accd450000000000001976a9142edaf466f4e25ca8eb241256aa4507bfb9acda5e88acd54500000000000017a91480643c3efcdeb6934cf9857b78cde325b7b4078387e2450000000000001976a914170a2d9bb7dfbff50a11ed0fc7847e0fcd3d2f4588acf34500000000000016001489bfc8f5b6f804f6b05719a06e8e7fe1cc811b76034600000000000017a91455e324b03d88894fb7b18e30d3b894dff2c33dca871b460000000000001976a9148c94f62bb6e270cf2d5e4d36ba944698194c770f88ac3a460000000000001976a91458f482148aaf5a22b467052efa1225e4fc1ab30c88ac42460000000000001976a9145f8f5ec735126e09b6d7ec0806d66806de7b506188ac58460000000000001976a91482f38ff0ddd3fbe7ae83bd5ac112fc851d218b6588ac5c4600000000000017a914321904b77d1a22a667920174087fd8178d4062ee8760460000000000001976a914ddaa9415d8da0771d1fbb8762b7950e8a1afca7288ac67460000000000001976a9148ef30238fe72221bf1a1c062926827ec10d5ff8588ac72460000000000001600142342e1dda3f1fe99e22741e644d28bfaa6bf9f757f460000000000001976a914b4963640a0685b7bfdf229b4b8aeeb2eddb53aa388ac84460000000000001976a9144bbc91a6f8ea12a59c7c629aa6b72a9737cdc18a88acc74600000000000017a914da577e470e2ccf9971481a8f83846d036740c15d87c94600000000000017a914cb19930a3591d3b521ea3d8f031cf7b80106462a87d9460000000000001976a914bc3043dcae5a2411c7fbd25b854b642ac9ddddbe88acdb4600000000000017a914549c7a3f02a755101a7d153f48588cfcd5bfc29f87054700000000000017a91458ae26cce59a0786ce5b0df4328f9cd83846ff0b87104700000000000017a91475437df2bcbd84ceda1067e708c2d15cda86e124871a4700000000000017a9143aa96bb4b6b666316ad7edf00d193894e4a66cc8871b470000000000001976a9147e8ec39cf3b7ee256a0546a23295bf08d161466888ac2a470000000000001976a914539b3703be31f28f4eb278142a9c60c0bb120f3788ac2b4700000000000017a91472062ae0b2076713d284aaa9b951f1a13eb59534872d470000000000001976a9140837563ab5ab789cbdf5fa0b82dde2151af150a988ac41470000000000001976a914b5b08e6ee4906bcc1543fb83ffa0a8b804c49f4388ac554700000000000017a9141952ec5ca9018c2611e9d01e7acafa8fe758ba0987554700000000000017a914df9f7a6bb9bbe1bf396108c75390ace3f583abb78756470000000000001976a91436e726307f733a9e73f9ab0edac11fcb3fef745f88ac564700000000000017a914b9ff6d89f08d5389b3d377632110644a02de734e8783470000000000001976a91444a0d86be3633f9840ed44ebc9aeee3ab294f3ce88ac8b470000000000001976a914d54203d7ad9ef151cf392b3a3fbacb81bdc1a31388ac92470000000000001976a9149d418e03834db3bc87bbe24a3dbd1b0de509e91288ac95470000000000001976a9144d43ce7e63864817bd9ce34b367882890806b93388aca2470000000000001976a91449ddf5c6b223d87de47be5e4421f3c4853042e6f88acd44700000000000017a91472083e06a2d3c67b121cf4923b078f1f64f23a4b87de470000000000001976a9148d1480733e0ea46e8a9ff381240faea4a0f48a9588acf84700000000000017a9141a68ae0698c22104e47bce245412594ffd1336498726480000000000001976a91452b32d875f2233298b28002d3c3fc685422fb9f588ac28480000000000001976a914cc038ca22f9fe0fc36d46cd7251fd14eec0f570088ac2d480000000000001976a914777fe8a4e4200b524ea5cde98e61c8809fbefea488ac36480000000000001976a914069d19be14a73901f2dda76c6f6062c2f929368888ac4f480000000000001976a914465faad2b9ea5066fc13cc65de929a17e7f03d1388ac4f4800000000000017a914e8ad1a1898704cf889115419fec64dcd15cfc5a8876e480000000000001976a914428e13459b77d675f940adbb26d0174455b64d3d88ac76480000000000001600141fcd3656713f38395a27b596c82911c5a158bc94c2480000000000001976a914d26d482f2d3c457826f326b4f7e83705928dd9f088acf6480000000000001976a91435f8e96e86438b7c2c022c43a7569f24e8ebebae88ac254900000000000017a914334e0808f8f5dac67a1eca03862d0febf8aa1bde873b490000000000001976a914a0d4097e95d4933fa4fe0a603f7c2f8053ca25ad88ac53490000000000001976a914b3f7af4ffbf9aa72327a9e1d8d358c63d5f252f388ac754900000000000017a9149395967c1f8d006496674354bf45c77bc58de1b2877d490000000000001976a9142064e456f5df02980c85c6d895eceedec27c6d0a88ac82490000000000001976a914e8a031f450599e6e57f7072b4541329b53b7a77a88ac8a490000000000001976a914a953cac8d1e5d77c446ed58bce14c31c50cda6fe88aca7490000000000001976a91447e507cbdc295eeae957c3a119eadeca00f5c03d88aca9490000000000001976a9145921f7e4f9064cebc8d233dd6bbb0f1a4e6cd3d188acae490000000000001976a914c44166dc6f070ae3ae8fcd9fe7d5bb46a1c4dae388acdc490000000000001976a91492bc97ff39c43e28058fc97386a468f7bf7d2b6988ace2490000000000001976a9147c11bd7052759631398aa25365d6514fb14d9e5b88acf34900000000000017a914e1012695d3049fab7db5002f5332552066669f5187224a00000000000017a914dd6fd54b4a7b29a5e133a7c915eef47b8bae067d872d4a0000000000001976a91412c07719da343c1c0b196fa1dc739da730216cc588ac534a0000000000001976a9147bb9b791ac40051ac18333478c923dd922ef539588ac884a00000000000017a9144fe751bfa9633cdf37a4bc2bc01791944bca2a7487904a00000000000017a914a4167394b518c98a9a46d33bbd2d1baabe45292687a24a0000000000001976a9146658e25c0a70b5c61748fc26d5ed7e95e8be510988aca94a00000000000016001436a5063d8e6c4db4409bfbd6e90df5bc4024bd85aa4a000000000000160014d3c4eb6ab8bd640ee129b9b63b28ca15a24806a5df4a00000000000017a91486c8378d0f3e877e7aa134beb3469d526d12106687ea4a0000000000001976a914f84cb6906d74cff9ec567a0f640e4e5635e3b53388acf24a0000000000001976a914b547d0983bed7bc048def659cb1b5a6de8f885dd88acf84a0000000000001976a91446deb628ec6a67dc3305bd5b7083d796a5bdd76e88ac0b4b0000000000001600142b0242cc3ecd9f9f4ae0d69881e602c4b72a852f1d4b00000000000017a914291e1ea8eb66d2585769b82c12a47d36f84c350b87204b00000000000017a914e6aacecf7e6475d2fe2360aa60d66a405f8f58c4875c4b0000000000001976a914465c59eb14bc663549afb3af17b0dd2538c4136a88ac644b0000000000001600141b19a6111e0135731df9fcb31c1aecfd64f74ec8894b0000000000001976a91463d009c6ac9499d8d82ca51a48567e62d53f4cd088ac9d4b00000000000017a914489ebcda7e73c91c302ff8650324cc17dc084b5f87b34b0000000000001976a9142ba493b5466d95ab7d282a7b90d0522f957747f288acb84b0000000000001976a9144631dcd2482e4b9bb1f9ed8bead45ab632fb9ae588acfe4b0000000000001976a914b118de307d1257d904272e3aa78d4fcd91a99dfc88acff4b00000000000017a914c210018ace1a1d79201c9a4575accfba09e10a3687224c00000000000017a91491ebb2e6debe5a99df615694ecf8e7269363226287294c0000000000001600145ab6801b1d063b40592b9cdcece0c4061f2d85ac2e4c00000000000017a9143dc010d281b81a447ee9fb9ffcf9a60a0db8bcc187764c0000000000001976a9141b13fee059aef456c8adacc9131a1475e24b2e5688aca84c00000000000017a914075a27de4c391f49a5472bd14e590921d4b5a1e687eb4c00000000000017a914befbcfe7c724b55ae6106ac783ac71740d2061d587044d00000000000017a9142ab1827226a7a3221caf00a4814f342c99f86d2f87104d0000000000001976a914f75febd0b806637a00cdbfa5124f7e4c8318d1bc88ac194d0000000000001976a9145a37724acb4a97c02f113de3e02fa15d3bb1020388ac1e4d0000000000001976a91474ac3870458be669fe4682b9ff28cb749261018688ac3f4d0000000000001976a914e986a8dfc8be1280d14a64ffbb23b0b89f4023e888ac454d0000000000001976a914674ba976c749f54bd5d23eb076da4fe391a54f8788ac584d0000000000001976a914337dba1c4548428b172e9ce164f218bd070bf1b088ac5c4d0000000000001976a9149130d6f0506b2d7b558b9861c38fa59558f108af88ac704d0000000000001976a914f2f1c2f3eb27834f890e2453daf91caa35d94a4688ac914d0000000000001976a914e656cdd5e1935b47927253fb0911108c3a7557ef88ac9b4d0000000000001976a914b2d20db236b7e06ebdee16e87e0931708e8eca5a88ac9f4d0000000000001976a9149f4c38a7b2d0cf55853a12fe35376e67d0141eed88acb24d0000000000001976a9140f9106310ef31800dbd4a8ae842e53bdd967454588acfd4d0000000000001976a9142f8890dc4e93a02a91e534541b65a0c5e3f04fbe88ac2e4e0000000000001976a91454f12634bd95987046de0c25ec6690cff5257cce88ac414e000000000000160014d8e3d42bf0784f8b68a74a225c4d1abc43873c4d4c4e0000000000001976a914c4c97a3c04af03fac941b81d7e4445e86f76557788ac4f4e00000000000017a9142aa4adfc81f456ee2e41400032e757369b5786d287564e0000000000001976a9148568ef5e2094b5a63b67a2230252307ec2d7301c88ac644e0000000000001976a9148fe9d2ec36746a5a1cce4fee7e6de5b71849612988ac834e0000000000001976a9142214118f2cdaae81adff16a6e1df5d9a2e013cc888ac9a4e0000000000001976a914c2557b10e93f821406bc7905049a4926b185410f88ac9f4e0000000000001976a9144ddea6deb63ea95645efef282f1aae83d4b272f888acda4e0000000000001976a914794acf5ba9399195d871b58b9a4e9d014b54382588ace74e0000000000001976a91458ecb818689bc66f915f73d682074e123759a5d988ace84e000000000000160014726b4fd234fbeab52be12571db09a54dc1d0bb722c4f0000000000001976a91472b1cfcd40b305308cfb5e781b25358ed410a40d88ac394f0000000000001976a91464f81fb9aeab7d58c64f3ba3ed95e0455def4c4888ac5d4f00000000000017a914c9233e29cd6da9e47cdcb18d07f1ba778c5c6bc0875e4f0000000000001976a914363d2d542ccf8fc2c64e24a5a6a030a769fa5d6588ac774f0000000000001976a9147072970c43eb5fde390c230ac41280db3610f09c88ac7d4f00000000000016001477ff313f9d8711573fae5ce9169e9c696543fac2804f00000000000017a914cfbd363009f9a5710226e830c81d169dee41987787964f00000000000017a91486cf2ed904738f30673ebbff81aab34fcb92441c87974f0000000000001976a9146ca8dd12d34d4e1f11004225b0e2b1274a9821b688aca74f00000000000017a914a07095c0af12db515009d113618a5087fb69ba3587b44f00000000000017a91493717c1a13864f5df78e122e816926126ea205f187ba4f0000000000001976a914cf07196d75a57e328b3b3c4b86b00ac6cbbd8f5d88acc74f0000000000001976a914a5a21f33022d5fbcc81fbb6e731d2c9e6abd6b5388ace34f0000000000001976a914452b1c61aeaba7a3cec1daee0c1bf6ef1a362da288ac0d500000000000001976a914049e598c90be67d3194902f51e58fd91169a76fa88ac0e500000000000001976a91430311e0c3a5f73beef70d479584da32f3584844388ac2250000000000000160014a3e3ba5ff475b760f934dc0ccca0f2179eddd9483e500000000000001976a914f96fe0b4cec6fce4c2c9ad25dbdbd2a9277c862a88ac41500000000000001976a9142fd0c9339e97ea83ed7b0dd3d691e8d9608ea2ac88ac4c500000000000001976a91467dd5c91c5486b655439af4094cfa77dfe3e8c6d88ac87500000000000001976a9140ae5751cee8ec98138782f46e1eb0f797003719288ac965000000000000017a914a6d5bc955e77cd0c45da4567d53244c1acd0fa2187d25000000000000017a914c24b2c62eb426e2b4f49c4e6300f6c64b0b7e30787e8500000000000001976a914411047497b7dfff43613e4efe2bf355c6c95b6e188aced500000000000001976a914a120483cf6261b1e3bc5c2e9b8f31214bfbc36db88acfd500000000000001976a914505f10b4a85bcdd1669c5b0e5c57b8a32528178688ac10510000000000001976a9144213f87d07f76b3d25a27d991f7c27f3b5ec5c3e88ac2c510000000000001976a914bf4b7f809e8f2ec0406e0623b35f717cded163a388ac46510000000000001976a914d77d9b7446d4aa6239679130b3bf1f43a5ac64fb88ac4a5100000000000017a914a64dce9dfcffc52c49d59e9b8e01a90b3792727f876d51000000000000160014fece17f0e0c11554d19e98761e201097790c068971510000000000001976a914b93324503d6d378f6b42bce19f670a0f8faf6c2288ac7c510000000000001976a914849d479d6e3d607b1e757c9469c80a448562a8be88ac7e5100000000000017a9142246e90856040e4f8dc06e6dbcdd20e28348bdd087c15100000000000017a914254adca98363dae6df17f38315b3e4a92ee4dba187115200000000000017a914e7e541c5c556855cfbb63524a57e736e436edc87872f520000000000001976a914f80e9530e81b0920178064d3ce41700236148ef888ac33520000000000001976a9142438f4b5776e514d49ba7f2d34edaacea56772e188ac4c520000000000001976a914274a6975159392746069c52264f9bee036f404b088acb1520000000000001976a914b24fa3b09785596bb0023c24c170632f672f787588acc0520000000000001976a914f225d530f88802df1f9bfbce96699c9e2606161788acdc520000000000001976a91473bb106718b3a35dd821ef821529e5886e19d06488ac0d530000000000001976a914f057b8fcd16858de2f7ee2ad83735cd9154ec78488ac0f53000000000000160014567efe0013a91b03a21a50ef8fd33fd2f94d95c315530000000000001976a9143d767f26ecd9e8eda26453df0f95d704e97aa8da88ac4e530000000000001976a914b1cf081499ad19ade5f48ef4908a8e4da69d545988ac95530000000000001976a9148aca49429d38d1b9f03d89401cb87648d566998688acc1530000000000001976a9148a60d966a8ab5805b46c78021f2da09ef61905d388acca530000000000001976a914adb14404460a81f22d350626d41cf00373f7f13c88acdb5300000000000017a9145acf24dc0970f4380b8d01abfb1d716ae6b3d9be87e35300000000000017a914e73b3f1fd5a5f92296d57dfcf0d3e19e45eda52a8728540000000000001976a914c77e81403a51ff250a888d42e56945ca87f02b6788ac60540000000000001976a9145b0c9428d7f7dce63f48f9f94cdaab19605382b688ac65540000000000001976a9147a9f0a34cd1b1fa9f72c093352f97a83f6eefe4688ac715400000000000017a914e66ead1c09960542473df9f7c7900b0a98079cf487895400000000000017a91473e4612e99d1eececa22b60928e80e5650606bbc879f540000000000001976a91452c56885d6814d59d999b113ba9fb7905b8f8e1588acb55400000000000017a914378110a4a889b8d420dfddf8f2f3cfeba8dafc4087c5540000000000001976a914a6f3a80a91ec37fddc7cb1d427c2970c56ff9e2d88accb540000000000001976a9143263aaa3edb93d92fcb6f5f2b538a4f4e3f53f7b88acd5540000000000001976a914f5d9845a7eaef040e5f887f59e2a6264d31dbf5b88acd65400000000000017a914b10c3fab39e29838afce1b13dadf32bd92b09dc287df540000000000001976a9146069c9bc559736be49d037e6d6454c31f3c96e2688ac22550000000000001976a9144a1da0210c4a0d9e43f1096699a633acdeeed86488ac33550000000000001976a9146bed3d245afad49e707923a8528aa113f3cab07e88ac37550000000000001976a914eec129adf5ee18933a5013cf31c4e0c9dcace8a488ac39550000000000001976a9148d8ae0c6bf3901d814815066b4d5f6406466bff388ac48550000000000001976a9145a42c8a0c544d9efe8efe10cc0e5459729577ec588ac74550000000000001976a914b13e521c1586d98c884716f3c066ce97c4ac19eb88ac76550000000000001976a9144053dcf5589d3bf7f54600d27392b1e7e8dedf7b88ac78550000000000001976a914d6dfeb336f3f6263f1fa355940f9c88435ab651b88ac855500000000000017a9144805f403f962b620f21a71ab1a4219005a605c10879d55000000000000160014df8c5e8a6d30bcaafa0079fb0c536097974f25b7a15500000000000017a9143d46dc20954f76b0044248b0ffd5e8601311482f87a655000000000000160014d53622308400621a0fa2b02b612604651acc6c3fbe550000000000001976a914b4b9ee92d11dc273f2a9074820ce46f865ab77e788acbf550000000000001976a91467cff2fa20bb996294b8470996afc39626ebfdba88acc85500000000000017a91451f7cadaea9c542b99f6d7af44f7126ffdd72afc87d4550000000000001976a9143738e77cd18273300317c39ca2c852d8a93e666088acff5500000000000017a91435856235ff6f839397d60f4dd17dfce7ca401df6871c560000000000001976a9140938f3dfd1b3980ee009cbae08af148a65a0aed088ac2a560000000000001976a914ba263931740043e99cabc8d385410275810e01a388ac665600000000000017a91431d115447d7549cad7d1195a42e172e1bad36d2d8768560000000000001976a9140a50538995f7bb124e7c8173c848615e188beacb88ac69560000000000001976a91469d394ba176ce7743d4784d4b96766eded5bb16a88ac9e5600000000000017a91428f678d83c14f3e220ef55bef6b5aa0996c680ee879f560000000000001976a914b690f996900a8d8a29d71c03ddada7652c51cc7e88aca4560000000000001976a91480a73f16f35caabdf6d7a2d71bedc0daf337e49e88accd560000000000001976a914b89e0240265517b031636116a22df0704c4b10d188acd25600000000000017a914332a6691c5bde4a2d7c810beb534ba2ea0eae51f87d5560000000000001976a914d0d9d216dfe5f26af5d366030c08faa15632ce5788ace2560000000000001976a914be6e20a7348800f3641e6341aa6604cb5f6438f788ac10570000000000001976a914300c65a5450d85dfe9a931dafcc24b8c509e236288ac25570000000000001976a9147c881140186a22f3519936f32a6d4a3ad9c4d6f488ac265700000000000017a91435385230c37e8c8cb3976e20607e06ee82113dad87435700000000000017a914e4e953e9ad8a0b27c0f251cd3d94f881576c868d874f570000000000001976a9141e0fffb603c22a5845ded584c4c82c4f47a3090c88ac5b570000000000001976a9146f602813c66f3d50ff8ac73e7b7d8503a299872388ac7d570000000000001976a9149e3a7d0995f8ce3b63d9476faa1fd267ecebffc788aca2570000000000001976a91497f8ff0889dd9e544e748913c95319b68f92ae1b88acb5570000000000001976a9142e6da04c5ee51ab84db1594a48f6a66481554edd88acea570000000000001976a914176eab980659caa43958d4bd183134d28679d9ca88aced570000000000001976a9141f661cb2f6d20a34fed80d5ad58dc486c19a135c88acf1570000000000001976a914407a416e4a2414a63c6af6cf9ba2891e11b5115988ac32580000000000001976a914bb5e72a2429a0428c94947f08d6d1481d6cb085788ac68580000000000001976a914e9891965b2b05521cd0007153cec594e7d8db16c88acab580000000000001976a914fa85367941c1894b4079712d2a4652544c15d5a088acc1580000000000001976a914c796b4bbbdd47799944213e4d7ee56191f992b8088accd580000000000001976a9148d2b4f3d440ceb4911123fa65afc7c3906eadfae88acdf580000000000001976a9148422a438deb9ff8a7576b66b84b78115d2bdec2488ace0580000000000001976a914f8feb6e8ff1b3c9a23f10379737bc68c5080345788aced580000000000001976a9141c9a5c32356bcbaedae6afe6e9920cdd83fb290388acf85800000000000017a91419f93003e5933639b7094f0c656999f1f21841308711590000000000001976a914dfa0f8b93a222d91c0e0ffcaf902b6fcee4dab6d88ac25590000000000001976a914b76c716efe05ce150ee5d3f1318a15b42597393c88ac265900000000000017a9143b1ac46daeca9947a2cff221149515a961f309a48728590000000000001976a91444bfd50507a0d7af1d19589f8403fb569c098dc488ac2e590000000000001976a9144a37a88412105101d093f62e70e5d981706f624c88ac365900000000000017a9147fd99b0f3268990371a008963859952c4be77858876c5900000000000017a914168e80c33b1fba74134ab974e8ee6ebb7b3141fe877e590000000000001976a91476843c5a98617da76ae13ba7a25434ec35a7e45b88acbe590000000000001976a9142ecb2b8b104b2a84ae3868105aa7a8aabf0d984b88acc25900000000000017a914d2d5d34ab67b6aa36b3937af393020437daebbcd87cb590000000000001976a914bac67de247d4dd659443cab503336bbad252d9d388acd7590000000000001976a9140dbd52dabdbd9e8c4fd03968ba04e53560f6280488ace3590000000000001976a914a876a6bb52fc1ef0c48e0eaa22fe3fb6244c961388acf5590000000000001976a9142d7f21b2647dbd1a5787d501f99c32fb2b2671a788ac075a0000000000001976a9147e026de6450beecaa00bdcf8db1f9481fb36e78688ac085a0000000000001976a914fa4fb27ca9c3d9544f15bba3db026dd4085c6bba88ac1a5a0000000000001976a914155cb8935224283781e0062f0a9890406a018fd888ac1e5a0000000000001976a914ddc11c1a98cd8d3071084beca21e482d1481efe188ac205a0000000000001976a914bd99fd68ade9249e0b14076d2cc174ddf941ffca88ac3f5a0000000000001976a914338126ba9403956278ccf7515320bca679e7860c88ac4a5a0000000000001976a914e982c6b399c458cad97529c4a6a2626c7578c0aa88ac515a0000000000001976a9148124ada3e217b08d67a0cdf1e94ce4ebdd4030ee88ac8b5a0000000000001976a914efd82eca10f077f2a517fea017193024c49acfe488ac975a0000000000001976a9149d6f40373f86977e6f47234a5d0986b5fc4abb7c88aca45a00000000000017a9144fb05981da14df86331c4cc9b1b76d5e4efa49db87ac5a0000000000001976a914d4fbe8aa2a6d0927d69a77a88c095c6fa719a27088acb25a00000000000017a91416ebcff70c9104501f014b6e839b6de2378091b887d05a00000000000017a914663a2c72d3502db4e8a4975ee7f6cf3bf2097bca87f75a000000000000160014f6686bf10d2b6146d59e6ec1bc495b373c477382075b000000000000160014ffe71bc714f17154654c9c57e8f9eeb87b507a7b0c5b0000000000001976a914457b2a80bad158e7520de35af54ade79994a623c88ac0c5b00000000000017a9140c8e54f3d65f739ccc6601963c9bb84cc757b54a872d5b00000000000017a9140a6559ed20c56f09f3ba5ceb863f10215491c7b687365b0000000000001976a914731bf7fddbf5c2bd2a82cd592a77b298af37b92888ac3f5b00000000000017a91462a54be1acec4ec5531514eb692f10357b9ba20987685b0000000000001976a9148422a438deb9ff8a7576b66b84b78115d2bdec2488ac865b0000000000001976a914d92e0c699c4d06e8f62f0f5252f1305ff7be3ef088ac895b0000000000001976a9149e64e0767d521aa3a82e1a52b7df15ca9fe269c888acbe5b00000000000017a914fd043adb7605a964a17bc6f4eb15e60ebd9f93c487c75b0000000000001976a914fe36f47717d7f907adb9526ea70b6cd41c9bc9e988accb5b0000000000001976a914884c412c7e6fb7d91d4fdde072f27ef31da3f1da88ac045c00000000000017a9149e06efd49052a7f456c1062b066cbd27ad0f9e98871e5c0000000000001976a9142e9d8b1890d1ca04d070002e0bf2fde97888af4388ac395c0000000000001976a914d639756f59564a17400cc0a92ace1c7040d9813e88ac4e5c0000000000001976a91494796e5e4ab52ce307327a49f57825a5a7e448cd88acb05c0000000000001976a91475c24ca3f1d53d199f7b0242b6ed5ba5eef4678b88acfb5c0000000000001976a91416e89036e1da9e1dde9227e4c013e8c88586bf0d88ac085d0000000000001976a9144d13c6acc48ceea08c04e174ac59091e923bee2488ac6e5d0000000000001976a914aaedee80f7b4a4af9931d6dbc27fb876ed2e30d688acc25d0000000000001976a9148879739b149bb59b5448fd9204be4ab47021094d88acda5d0000000000001976a91454db872ae80438d1c8e50a7353e387333e062fcb88ac045e00000000000017a9140747fb508db23eb410ef8aee89989f0ff8c5257687805e0000000000001976a914660c726f1e7d67876980923d8edaa45473aa775a88ac015f0000000000001976a91449d176bad932d8452e94de01e598776449d9055f88ac135f0000000000001976a91462d09a8867480063c7acbaaf78fb6de7bd3c375688ac1a5f00000000000017a9145793742d544752de1a3c03707a7e0dd5d4f3c6cc871f5f00000000000017a914e5af0fbe695fc9efa7aa7ea9a5be3b261334af3787225f00000000000017a914954bd6c8d7daf90d791d9bc2511adfbaec45679b872f5f00000000000017a914d25a86ba1f6b1cc4ca7c827dd5662a932f133eb9873d5f00000000000017a914305a91c4b40b27b5e7823e8cdaef1e04a575c1f3874e5f00000000000017a914fce1e2d9efd40abff4b1614b0162993f8036a730875e5f0000000000001976a9149265c2134572ae3d68fac36909fccebce5dc397188ac6a5f00000000000017a9141695366a2cb00f0132d91a3277676891c1f7d08387cd5f0000000000001976a91456e21434bc99b26dfb0dc217786b78758de8479688ac38600000000000001976a914b252d5e0f3c0b1f38a636a81a4b297db85cfedd788ac6a600000000000001976a914c9f4bf66c98e5401c1727b720b838036956fba7988ac7c600000000000001976a914f61e304ffa6ac0c8f234cad45e06a53cc7ac8e5a88ac98600000000000001976a9141499604a291c89b12a44f5623c9f807e1b33bede88acb5600000000000001976a9145b4d2def816a96c7ddb66826bef4e02a8ed745a988acb76000000000000017a914d91da9688e79a539b17b9876f385b3e28ac0d40587bb600000000000001976a914d48b850b751ad5ed50fc4e5be114b3916451f02688acd6600000000000001976a9149f234a23f7e194798b6a5c2ab97cf5e669a6499488acd9600000000000001976a9140c9d123b244f2ba2ed75c6d57a7be7749593359c88ace1600000000000001976a9148fcc4f9f9c6986f837cea11a72ff55289e58abe588ac036100000000000017a9148774d0848a52f9e40a69cc2f52e4aa8f73db06c0870f610000000000001976a914e4050146c0b594c118af1c9367dd3266e6ac87ec88ac3c610000000000001976a914f714aac8be259f075b16927d651197f114285bcb88ac5d6100000000000017a914aa01743b9cf7d6504393d069724dec511b90598f8779610000000000001976a9145e8b8fa0c53a966931bd36368d65b10a879a9cbe88acb0610000000000001976a9146631a3e99c14a9d739f079c6c9458e233e70d78f88acb36100000000000017a9148dcdc406243b98c905915132f2d95f501a68b7d587d56100000000000017a9141cbadc4a0cea3043723694009bf421b53af0468d87e3610000000000001976a9144b96a7fd2b87dfd67c7145f4753930b93d0c343b88acf0610000000000001976a914818830ff70b7620af1ce2c7c27c07e677364356988acfc610000000000001600143c0bf944598a0e1a86c37c228b948130819237588c620000000000001976a914ea3ce55c30cbeda89405f301c0b0667c852ce4ba88aca26200000000000017a91488b124e77f6d1055c3a0eed4158dd130df8d859e871f630000000000001976a914f116f9c055a05a32a67a55dbc361b8a42d465a8988ac2a6300000000000017a9147cf96c85334d17d0a3bcc8b7a9b93d42c42a5ec8874d6300000000000017a914775475a7eb7c1c6a1db892dec051e795db1c17a987526300000000000017a9149c6a352c865a3c394a460b1a8faae216f22547b5873d6400000000000017a91449c9d975bea1ad78ca79734cce4d3f2fc45455bd8741640000000000001976a9142ccbce9946a707a67afa43fc4a1202d68e95921b88ac57640000000000001976a91486dbacc63a8eca08ce7178830494fb2972c2b96b88ac90640000000000001976a9140cef8b671a409a188041a29d0fc60e07f51b8da288acaa640000000000001976a9149215d219e522f4951d5d2c8f78714ada462d19c288ac0a6500000000000017a914e4583362263b7abd573bf94a56d093a6ed0a116187476500000000000017a914596762bf089d50218d64124d6697f946094d66e88755650000000000001976a914cc7f8510ea7973508c31566c63bcd596a92c953588ac5f6500000000000017a914bb24c17c8d312823b0d4af7edfb423f6126460c8876f650000000000001976a914193c940d3d546ba5113dafbb1db3326a88cdb9b088ac7065000000000000160014528bc58f0e788f3940a2eec381c3274bbc5dba478c650000000000001600145dd11a03f6e1db56f023c722287eaf2bf927dcd0936500000000000017a91474f0aad68afb91527c7e892b57427ae55af456aa87b3650000000000001976a914684f3f12b10ab3af58f8bb9936c351f5400e752b88acb5650000000000001976a9145e0185696267d13c2eed17585bca0cfbc21743bf88acd4650000000000001976a91432dfff98e176d88ef1f86f46dac8a7519a252d4188ac58660000000000001976a914b74ffcce914f18aa5e961318b3863109ae190b7388ac8b6600000000000017a914022744edcf8d067d896a6b0f912373ff0b769e79870a670000000000001976a9142f50413f745a5f9ad308b158ab356c9f3849631288ac27670000000000001976a9143ada6d76a9acefac48a9c9f4fba3fbfed53b0cfa88ac3b670000000000001976a9143af18071748830e198fce9eba7e226e0bb9428c188ac90670000000000001976a9141b1e84de7b330d4a12ab8cc1c9d111c26998e5d888ac07680000000000001976a91431d63d1f237329e8f8b6dba235c82d78f9c9e39588ac11680000000000001976a914300442dba5e8012c648905c9316bb2b2d8391a7b88ac26680000000000001976a914b4e6929ea5ba270cfc0d4076d1289b1dbf7af19788ac43680000000000001976a914b0db446368fac8ce5bc7eb9256735cd2161bd16d88ac5a680000000000001976a914ab8c97c51eb443b719914265cbfae8b97de893bb88ac8a680000000000001976a914a1809dfce00d22ee9a1b30f78d1139a64350aac388acc7680000000000001976a914f36467330a2f2bb8a8d1dd54646563e79dcbeed588acd06800000000000017a91470316120e7b74578cb4d1193fabb683be26945178706690000000000001976a914040f4beb150cf05164e787c9b0af9e7aa082a83888acb6690000000000001976a91412a59ee0df1c58f037eb667550236fa92932d51088acc9690000000000001976a914bba73844c328b973f0da040ab964dc171d6a038488ac076a00000000000017a914dddb55809ca698a00bc91e9a122e768c0ea9e974873f6a0000000000001976a914b94cdd38cc7f8410cd9f7d47525fc49d3ab6d65988ac5e6a00000000000017a91483480c7c147809799d5d424bd37598fc1d7d990587806a0000000000001976a914fb77bba6458af22b4f20a277df3e901121f62ff488aca66a0000000000001976a914f015123737a240aeb7b01b4580b1da5a4ff3ba2988acb66a0000000000001976a914f94015356cb1c08f1cb30233da8db7d9293fcd7588acce6a0000000000001976a914b644877e5d4afe180c904801e10ff6375fff5dde88acd06a0000000000001976a914c100b9037fe131d2b2049fc9d4bdc46f120bd88988acef6a00000000000017a914a26c7f017f3e3202852a0485d1f3b097ea68dd35872a6b0000000000001976a914679bdd7e3332e54d72349d28d557d2ccca5f13d788ac356b0000000000001976a9148fde30e5c3b83e032a3bc57d25e6ca4c51b7423888ac3d6b0000000000001976a914bd94e0ad845ac1800616789a18ce6a794877982488ac456b0000000000001976a914a77d78d54beccf83b1ab2b8b916e812ebe06680088ac6e6b0000000000001976a9140319ca1e833e4990d373df7bc57ef0c8d85a89c988ac7a6b0000000000001976a914a5e6ea57013b432f19272726b1c131858536c10a88ac8c6b00000000000017a9145ee7c978d4ce5e280ac7e043ad6abb21fa4788d587966b0000000000001976a914f500064a5d3b07bd4249e694f02a782951582fb188acfc6b0000000000001976a914946f1bae66f9a84a39196ee6de9f6758c337c24a88acfd6b0000000000001976a914816e2247fc6ef9d152dbb25099a27fc47d18b0ed88ac326c0000000000001600148635c4c33d92d9fbf62fbadcbf9653750cb5bb1d4a6c00000000000017a9149e5e655ee8e3d6ce2bdae2536b5bfb443596f744875e6c0000000000001976a914bdca4c82a863a94bcfe4b49e1513d038a019571688ac646c0000000000001600144b5e0541a60916cf8c359b4d9cfbdb482467fc69d96c0000000000001976a914ad22641bdc7e3a3b35946b35dd5d4edfdaf99e8688acf76c0000000000001976a9148dff650cc614bec07880d8ab8f7634a041df8ba888acbc6d0000000000001976a9143c29c5c9f00d0e0831916d1563ab2d9e3b53ac8888acbf6d00000000000017a91424169546860f14d3ed4d508a2e4fccc9381e388b87ef6d0000000000001600143dd5fc17d58380c098525ed3b735c84860b5ada3ef6d00000000000017a91419eb8144de266587d2962e0e135a27fa495df46e87fb6d00000000000017a91484aca025a03fe237d362956f2e95fbee7226137487036e0000000000001976a9143fe3173d7537588bcc6c967d866fe351d813c71a88ac166e0000000000001976a914acab3a11775c5a48c303c81e6d61e7d590f3f6e688ac9d6e0000000000001976a914a20993837562f3d8e9f7085cec5fb231f4008d3788acad6e0000000000001976a914dbd8a01a863912a0d1d7c6389b8df62c392059fc88acd16e0000000000001976a914c4b425e95acfc2f81fb435cb138dd7c036d5346a88acfc6e0000000000001976a91402f6bd7b6c217bc3b8cd2d6ce9df11161e4dddca88ac066f0000000000001976a914a67f1e34c8998846abdb63a4efa63b2f87e7e6b188ac096f0000000000001976a9149f8786760e8d0fea93bf273fbaa984999145fe4b88ac446f0000000000001976a9146291756ee1c9ecfa3765442ccb65767feac18b6688ac566f00000000000017a914851c7542873d4852d5ea27cbf8f670d45364cce987746f0000000000001976a914dd93251998140b52a278191b75fc17c3c0fbdf2488ac856f0000000000001976a9146d8b3c46c00fbe8143ace8ed3448e68246d2204588aca56f0000000000001976a914427a45a26594e08607dac9c3365b9ed49051f5d988aca66f00000000000017a914edc8a1b906e62a543e38eefd2a7318d422f3348287a76f00000000000017a9147934558c834e54a1fe5471873dffbb6de8b83a6887b46f0000000000001976a91495503c2d025f04eed9ebfe4182249450ee7035ab88acb96f0000000000001976a914da1cb430fe4780a05aa27c8be75fbf47fcf2d61288ace56f0000000000001976a914bc68da3c7dc5c09b5ad13d83a4ca203543e0bd7a88ac03700000000000001600140131d8d351e0cab00b7fd4e0f1e0dfbbd87bae6d1d700000000000001976a914a4b03dcb8afd7a51052df7b50d9f1da5ba06434c88ac287000000000000017a914520e28d32d67414978dfceb4ad81e4ac2b060f678731700000000000001976a91444a3b55d471ad50f1e4d4b99d14a6cadbbae5c9488ac367000000000000017a914833ade8292fc94aaa28984692a01c23fa6bfefd3876c7000000000000017a914b82d3247d3291f30aff8631a85ddbc4b0e21f3e787987000000000000017a914523b567aa8faa3cd8075fcda622f861e5c996a0087e0700000000000001976a914087552f7a463264f56d783013c084aa62a6e13f488acf3700000000000001976a914c83c25cc39a778146a77bccc98414a731748181388ac1c710000000000001976a9145529e1217ed9b97492b6081fb35fd0ff8cb52e3588ac3b710000000000001976a91405a41f46cec94ce8009dc42ce5cd5b42cd237cf688ac49710000000000001976a91434c42a8562502309dca025559c3f509dfef2522f88ac4b710000000000001600144401ba2b7e17b753c493d9ebadac212bef82cd7b4f7100000000000017a9149ffa0d2cb04f4e4f50cc65c893455bb5ab207ac68774710000000000001976a91475fcf7fa040321398cade96c67b15f9063eeefcb88ac1a720000000000001976a914b0440dd3675eef5b8d11d030bb227955a98d192788ac27720000000000001976a9148b70af9b672af9fd3b12d11b444f005cb1a4d1d988ac39720000000000001976a914af44c80527f8877e9cf9a7cceab5a96d46a17f1d88ac65720000000000001976a914501a968a09e7bdc51bcc30ec6f7bdfe75611617f88acc1720000000000001976a9148a402232225b2639f7bc9d6a6eea4e28dc302b7488acc27200000000000017a91486cd98dcac80d0de37b128992b113d3fb79ac6cd87ff720000000000001976a914466e8c8728b621569b5fe3842083ec189014a4db88ac547300000000000017a91420b2db3c3edd8d1098ca30c9a6910e1af828758f8770730000000000001976a914340c276e0383156d69e80c51863537ae239de37988ac757300000000000017a9146409c70a52c79a63fd60acaa296f5c459ec8be8287a57300000000000017a9143299ffb35027dc1d4d3916c4d095288b47e6a5f187a7730000000000001976a914110c3beb4547e1bb8b99bdf446308f8255b6450a88accc7300000000000017a914eeaf28184de74361ca9771cc0764549f95fbae8887e8730000000000001976a91415156896b39f6d15256a636cda4051bea30e775a88ac2a7400000000000017a914e39017c3982bc323cb4261c45cffe0a218299e8d8731740000000000001976a914d51279d88c327edddbb1cf50d16ecc73d6e6bb6c88acc9740000000000001976a914defa9daf1f42e17c16c5c57a5095cdf6bb7a9da288ac1575000000000000160014552219e4078a8700b703b9cbfe9a281b981b8be2227500000000000017a914a46b29607ea9da021c893e2260129684d87667828728750000000000001976a91466f53e5a04e138e57935fdc8eea035e93fa20e7c88acd97500000000000017a914496feebf48a2515c53aa0b50498f9d2d25eafe5a87e5750000000000001976a914452776521dafbfdff0969ca2123d4ccc8892299788ac15760000000000001976a91492b7cf318e9f6d6950cb49628fa84562b4f3571888ac4a760000000000001976a9149e4e0e91a7376bbe663f5e501c9187ee4284d11488ac4e760000000000001976a914e7420a5a2a73c0b1233eae81482a082860eeeeee88ac877600000000000017a914e62524dee9b194d44907d5a3e822a8c0249733c8879c760000000000001976a914da4b2a4190df5f8391545b32ca2c90a435a42fe188acc7760000000000001976a914e19f9f48819149d723356736b07632492685d44e88accd7600000000000017a914edb836ec11d60f3dcdc0625301dab66b6be97e3e87027700000000000016001459ddd9cdf3d430a0c8e747e31d0880b21bf110f34e7700000000000017a914a0ff0e9ee6cfe9d6ac5e3571b24c7243d2288a5387677700000000000017a914105fb6e9e654fcc8806a45981cefd72abb33d4668769770000000000001976a91458085dde977466c94bbbde5dbb5fe0dc8825569888acb27700000000000017a914f27cdd1763b9c760f0516d59af2ced7dafe55e0787c0770000000000001976a914958be4361c37ca946050fc4f0bb658b314b4a74388acc97700000000000017a9140782d0309298d392d2ebb34bcdb479ae506cae4787037800000000000017a91444366c180febae6aa0e7225bf8025b778bf5808c8747780000000000001976a91439bb1880d19084dc5def33ccd429841a171b8b0688ac547800000000000017a9141a4533f7245d44c19e79fcdd11bafae42c48491a87807800000000000017a9146cfa1bbe6c88f53c715f2c3df3de38a34f6cd7d687d1780000000000001976a9144bff8ae926323adb5fdfe0130cd66cb636488b5d88acfc780000000000001976a91453fb114dc1a0795ce79ea26c169b59625e75fbd988ac0a7900000000000017a914d3523edf9fae4a6433e2facc9402c06c0aa33fc58726790000000000001976a9147d9ca3ac0a29cf5e60b8991ab1eab8534204782f88ac1d7a0000000000001976a914c893b06b95509782fabad33b79289abd1a3d4e7488ace77a0000000000001976a914aaf5631a99032b548ce32f307a7b2ad7852dae4488ac387b0000000000001976a9140bb5385a3e8783be37ff9f018e2f95b1da61bcdf88ac3e7b0000000000001976a9145cf3c03a7ffc6e4884df28e41469a277a75be42688ac437b00000000000017a914a4e673b07194246217a530f6f495283a64d9407c87497b0000000000001976a914d337a775728b2e423586cf70accae3b00b5d449c88ac967b0000000000001976a91494341fc1bd45a0a469bbb1132115deb1b1fceec188acdf7b0000000000001976a914520d8359a95ec54ba03ca26da411019f8be5bd7b88ac4a7c00000000000017a9148172621b62f3bd3faf28c6bdc43845c9f4a1860187587c0000000000001976a91464e3c6943d5bb8cf336c9c7bdbd1544340c58ec788ac6b7c00000000000017a9145e94367b592c0688551c29e2e29bb116a85355ac877f7c0000000000001976a914d3233c2436b60611809d462619ef73b3f751265788acbe7c0000000000001976a91470e65f1a571874decc85262a831e4c0ff79ed41288acc97c00000000000017a91445193a35747b4f5fc0759401557a257e09ad75a287e67c0000000000001976a914cb9682428471378c9f5a4dd64d4d1100a63862b588acea7c00000000000017a9142351e688ca28c4e008e579aec07e0d19fc9c7ca987357d00000000000017a914a8648c5925cf16ff64b7791fd2b340184e67238d874f7d0000000000001976a9145e03d1c86c30e739199aaf6dff3dcf83c288fef488ac6a7d0000000000001976a91488f6ed6b3e799cff7e1292ca4f73dbeca9c0a65588ac707d00000000000017a914f14c0fe47db1dcaa8e26f2f97ab963f7ec9b1f0587cb7d000000000000160014cd8b51c8468eeec94b4a578d663a116ef600a8cad67d000000000000160014186f7bed2ae7ef39e30111775a80b97c31e088cffe7d0000000000001600146a0be7d9366bcd73ddf6a13f068bbc10c391430b237e0000000000001976a9140625d713231a2b5989c000d78a70dcb181f4f0d088ac377e0000000000001976a914a241559e762617f189ff9b4cbebe1ea718637a2888ac4c7e0000000000001976a914ecbf600bf8392d7953286805423d638b3a342de788ac697e00000000000017a9145b5bd83c2b73520770d4209763709548c98b1dc9878c7e000000000000160014bd7bb404d751f09cacecc9c6c16b19c30dd605bc927e00000000000017a9147d5cd2819903c9c5a6f5484a83e0e74df408914187947e00000000000017a914f0f9ae76a973a781b4859d3995be0d8d555ab46887cb7e0000000000001976a9143767f6b6321e660aa9cf81e69d88c1a4d2ef126088ace67e00000000000017a9145efa474c603787fb74310e422c67a82f0403b36b87417f0000000000001976a91445a1d672564234cc376c425307d016b94a07637e88ac497f0000000000001976a914826a0bceaaa7559c028035f1ac1aead3ec982ae188ac4d7f00000000000017a9148403549f9724653e8ab608b75f50ebae63ff878f87817f0000000000001976a91415311066470b63632c2dafb05fff11da56da11b288ac8d7f00000000000017a9148d8e17ca36e41bff07dc9caba5f7d1a9174494bb87cb7f0000000000001976a914ad9b286589e35a280d491e89550bf83a9acbe99388ac36800000000000001976a914829faa545dca645714de1261417f94d34acfd2c288ac6a8000000000000017a91461898b35cee678584c05114e3685e69ed4708e88876b800000000000001976a914c57daef11712dfd40e20a38d39ba7984301e4df188ac21810000000000001976a9149eb2869058247987ee3bf889be3537cf28d6ced388ac5d810000000000001976a91473b9e0ae02f1ccfefa79811fc96c0ec07148a5eb88ac69810000000000001976a9143202facc12c24e26371768ebd5f25771c8aa3a9188ac82810000000000001976a91421420c8e057334046e3fbc3a5133002ec56c734f88ac858100000000000017a914de6165b820897f59d19a51dd4fa3f501272e2c7e87c2810000000000001976a914a5629164243b568498bf14de497020696527d61f88ac05820000000000001600144fb84877443f90483b2511a5efa6a4cf77afad7420820000000000001976a9143142053f9da52d77e174e5e9fa359bc231e65fa488ac4d820000000000001976a914adc69a7c2d260bcb3da8f06557011ea08166ec8e88ac68820000000000001976a914721b0ff382b9635a747248da6261b091280572c188ac798200000000000017a91434fb4fd8f50a73cc102774dfdf08c37461d11e92877b820000000000001976a914c175e41ff4af12491b91a3e1078cdfdd721c320a88acaa820000000000001976a914a5890aea8b0855dd65aa410c2fd2da3af4ae973b88acb78200000000000017a91444e9474d83a8e66b70a71bc8674c76a17c0a7ce887c3820000000000001600144e7bd891995b0558c7841f133fc57596477dfa7405830000000000001976a9147f435dd6684e0c1eca39af354b1b3183d27e709c88ac15830000000000001976a9144cc2d396c7367374fbd0f0c0a5a08b425b830d8d88ac2a8300000000000017a9142f1a8247bd6ad0f16f818f7d723aaf0ad00d0bd48743830000000000001976a914cb3a25a0bcb216f72b5c639ad4c5011fa29ddc4888ac508300000000000017a914447439e888a0f9ccc65de82779130929af0953db87c68300000000000017a914080622299d014843a44ce5282f30c3999509158687d0830000000000001976a91441e844d53a379a5295e4f1171a0bacfccf61b21488acfa8300000000000016001412857fd39ed3f1a55bc00bf2ccc4c9ce705a1c4302840000000000001976a914a76464d4862dccd34c8659c9ae5a38f9953f943e88ac07840000000000001976a914c1e3a1e10c1ba097b3266a83ce8c78b2215f8bfd88ac398400000000000017a9149160d3d2a8200830550dd9622384db4e317cb85a873f840000000000001976a9144a84e877dc8d92d03e90e6b47e913a9c93c556b188ac4b840000000000001976a914531f5eb64f3f94e42d6993a3273d18aa5c25bed888ac84840000000000001976a914df921d92af400fa00e3ef8dee54207b33550b6cd88aca9840000000000001976a914b20822524187a204febda4668d5a47d82270431888acbe840000000000001976a914871de426959c3f68167842bbc09aaff5300274e388ac58850000000000001976a91477e91bcf608486c0b41bd24d07d91acced29c84688ac6f850000000000001976a914dac02a5ef54d9e2fed5f36885f307ec1162949b188ac97850000000000001976a914ce61cc68a93937d0681193f2b86b583cb75f271b88ac9c8500000000000017a91498170af86b353414bda4f9602e18372836476e8187dc850000000000001976a914e21cea9b77ba0aa7c95aa014af58fc38a3a2dbaa88ace78500000000000017a9147f947131f85914844acdd9bd522454187e01b0f8873c8600000000000017a914ae85bd35a1566b802012097688547f00885fabb287588600000000000017a91495dabe7912b1194ee645698b8daf25de441eb16487a98600000000000017a914e29be1e4e8d140e7885606970d875226258545c487c3860000000000001976a914375968426a4fd43e3e427244407102619e052a0088ac138700000000000017a9149c1085ea88bd7342dd3759ee106dd50850d7e8298749870000000000001976a914dcb982a6c7782b92b9c68fdab81141de6ab3487e88ac4c8700000000000017a9149d63b91d5eb99e9e1b6f4d0cfa36148bb07f317f87938700000000000017a9144d7bc00de916bb10e60ea16c83d341c1466b1c7487988700000000000017a9144cbce642f703e1344c3704d642a862fb998e3d7b87d2870000000000001976a9141adbce7ede9c97e391d6efd04499329763ecfff688ac05880000000000001976a914f8bd39e7f96c588364d09e9c7db46331d3d9109888ac628800000000000017a9147fcd6c5ce282220eda05f41d0b999360a608ae3d8780880000000000001976a9141f5bf844ddbe9e2550a05bb3d3d5c4e8ca23888988acca880000000000001976a914aba46dc56fd69ea1f3fe2dab4f094096ae202caf88acff880000000000001976a914cd47b7ea37dfde003d016656b3073c737edce12488ac2f890000000000001600141d057e18232c8897651d952d979d0a668e2ee8bb668900000000000017a914b18a1df6cc61512794cc03e36550776b5dc09fcb876e8900000000000017a91437e7cf4786799751cc5fae8caa5c3a1622d27c19870d8a0000000000001976a9142ac1ea3528bce9188f22f0fc137db2fa057757ad88ac148a0000000000001976a914557610d36de2ef54b4d9a56391fe43825a0ee78388ac2c8a00000000000017a914fe722e10c57dad9f747a1d9ea688ca070685da6887618a0000000000001600142c3839dac061a8e61a0f60e341daaab0cb3d866b6c8a00000000000017a914e8975dc466f39302ded05252236d8e0fff544615876f8a00000000000017a9148d5af1e25159b6246f98206de882ebd98bf2831387eb8a0000000000001976a9148d7eeb4bc1e6870ecd68f43bd738288cf9461ed788ac7e8b0000000000001976a914eb4df583ce002f0612764527f0ee8b5d894e4b0f88ac968b00000000000017a91406baa34e009fa5e7ed7221a02451c952352ae8fa87cc8b0000000000001976a914c84648388b225b63da873e2331f1a5cd3ec9ec9288ace48b00000000000017a91431702a3087238524704b5561227912081bab6306871d8c0000000000001976a9146ac22387e402305ba3b486bf35a9e2c4aabb30b888ac1e8c000000000000160014dc6f9c99c1a604baa28f20278dd2cb91faf750d6298c00000000000017a9141499be162afbbc40e2ebb6be88f05822e2f8dfdc87328c00000000000017a91468c1c3dfeb6b94d35d55c99c7cdfda1add6220a8875d8c0000000000001976a91471c2c90eaa7b4f970ff7b0e436d28ffb36d80d7188ac718c0000000000001976a914897e799f6d25932f74f7e050178cedbd1680916f88ac728c0000000000001976a91422f6050c5f0a53aada0caab255e884dc0d38237c88ac808c00000000000016001435b402fb911e82c9540d15013c8aa5809c83215c9d8c0000000000001976a91470b7c3aee0a5173ebfaf5dd8bb982414c0ce2cae88ac198d00000000000017a9144262e996aeaf884b6e9a2b39498f825d813ddf2f876d8d00000000000017a9141d5405d007d6cf560a3ac93573ddb5ca4413e92487768d0000000000001976a9147c6f1f3d56b1b030b8b9bc96f5c749f0bca653df88ac798d0000000000001976a9145212f95d5ab728ee14ecd3967518c5b569876c8188ace58d00000000000017a914900d592a0af1f623152cf16715160f88d1699252873c8e00000000000017a9149f5fe8d62cdad608fe9bd961b56cfcb51f24ad8c87758e0000000000001976a9140f114c95e059343449d92ea1ced23a9d908281c988acd78e0000000000001976a914b8ceff7cb24f787c815c975f0576162e2360744688acf78e0000000000001976a914249b1b9bcc5a1cf7a987980edf66efed2e1a179388ac2e8f00000000000017a9144af1fdb9a9c12ea4bffa84d31faa3ac8c0cb0d2c875a8f0000000000001976a914b4ed5ccc4b1982fff7a7559381c0d0724303626988ac6a8f00000000000017a914d3888094523b20152fbf818c70bde834ba55e25087898f00000000000017a914c3ab464f863b891157b3c61b364a518e87b9e76d87b28f00000000000017a914c3b35dc3007de74fcfee711e0b63d2ba295e82c787c48f00000000000016001405b60f7190c802acab4fc07535c60cd68d06228ad38f0000000000001976a9144673ded2e5e990e0fbf65b8ad9b93427cb41103788acfb8f00000000000017a91402583b990eb3fda55e5a6c1903aa6ffca87f659b87279000000000000017a914774b8a82377ea157ba832fd39d4dd592cd6a82a88757900000000000001600149a476f5e7bf644105e342191e4020e907851737f5f9000000000000017a914b567bfa4a14988ecb708d22edad74e5c023bcc2a8767900000000000001976a914112b20ea852522511df8df7a963926dd6711911688ace4900000000000001976a914fe8fd22b82cb7c57b93e0586221f29fe3cb1933988ac199100000000000017a914f7cfb97e86fca0c03165b1499d05cc5bcd18574287229100000000000017a91430e02ca40c322f2847506ac71a351a05dc0b747e87a59100000000000016001406f4bfcd2bd26c56b856baa51cfa268a1b7596bfcb9100000000000017a914ab11927f5c11de4b20781e63171c6bfe46687d0f87d69100000000000017a91402f25f30cd33a305e3c7333e3341a0c3ef29751487fb910000000000001976a914fea066c1742ea68b5f107d726d455cf2273c856688ac3b920000000000001976a914c9ae0a39d2d6ee8955c8f9d7988b8f1127e7e14788acfa9200000000000017a9148510a3e9ccf5bc2388ae9314741acf5c973ed91587fb920000000000001976a9148aab2114d51ac98e03de63d9cf01375d15f439c288ac30930000000000001976a91472281c739b5646c7f2e69b2cc473f7078aa59d4b88ac3d930000000000001976a914cabca9c879bee19af78c20e985fa9095cd708bb988ac9c930000000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac9d93000000000000160014c241f8f01ef168272948fcaf18ff296707055c14d893000000000000160014ddf4d692d43e462b7deff82bb9c3a62fe21c6e032d940000000000001976a914e25b70007e143b7ca886bf8b0a7cdaae94de90a388ac5294000000000000160014e1345de3f9e96d537e0e4850b083c7212eee37bfaf9400000000000017a914e1750fe67ad040293375c03c39d90fd0dd92eea787fd940000000000001976a91410512e00fffec5ed16a2234cf77466ea906e325a88ac19950000000000001976a914c61a891288fd5e980efbbfccd99baf1c51b5d63888ac2f950000000000001976a9142178aec7090f4abc5c5b6f8756389799e27fb0f188ac539500000000000017a914c3ce2c0ee5aac89bb84eadc70cfe0cbaa464736d879e9500000000000017a914c7d90981cb4504cdf1626a308003527e03f722d087a09500000000000017a9140c6fc940fc34af5d853295c5ba8645234e8fb7c087bd950000000000001976a914565b55aca767fbfa9011ab724d9675b16b96263c88acc3950000000000001976a914dc51ab3a518c5afc39078945dd9557b5d64db03188accf950000000000001976a9147b9793d260c3099e2ce32f77caa769d6cccb55d488acf095000000000000160014575fac6530f51d2226cf3fbe5f9d796f324a2f30f2950000000000001976a91475ee273e2ebb13fb05146b0705fb4f7bd70c1b5688ac10960000000000001976a9144320593c93ebbb4d8b28092ece19e686aee77b9088ac12960000000000001976a91466a8b2d9fc4c931741925f78906dc956c277caaf88ac309600000000000017a9148dbfa265dfc5a2ae3fdb403fb5a02167d4c968438734960000000000001976a914b12cc51271381e2e62f60c0e7ffd1f0117da132988acbc970000000000001976a914a918625207324b20c7567ce88b865ae71a8dade388acd3970000000000001976a9140d36fdace8450f054b08d96b88984f151542db4388acdc970000000000001976a9140def6058abd49073cdcce66dea40132fb621294b88ac21980000000000001976a914454f7599325fad9c38bac1a065d27e90157b22ed88ac37980000000000001976a9143d5f058911d6016d7f7003d2d7db5d5d0275452288ac439800000000000017a91475ac2254754883a9179d4fb6eb4f56eaf4426186874c9800000000000017a914a683e52816e422ff6816f3eea0e9601b332205898769980000000000001976a914e384911eec9d966933a2723eee159fef83c85bf788ac89980000000000001976a914a5dc5ecb7061e66f27b8eab91590c9b4c0cb072f88ac999800000000000017a914163a426459e9378cbeb95d2b3fccab3d9156bd8087a698000000000000160014fe3453e318f4cad4b308282d10408cb1ee882849f0980000000000001976a914ebd494fefa639881c310fd4e60b5012891f77e0f88ac149900000000000017a9147d254bc5053dc871a3068c702aa1941e3f81379b8718990000000000001976a914c37f3149aaa58f3a80dcbc18f993cbbe24592f5c88ac4999000000000000160014c7f5c8ed0bc91bffaf7b8b279c78f20ece73747a52990000000000001976a9141ccba85b29a95c187fba66c84242978d7943b66688acfe990000000000001976a914adbae214398cfa2f7dc6bdbc7cd02da6258acf8d88ac319a0000000000001976a9146e297579b15ab6d0edae189f749082d30b07dfba88acaf9a0000000000001976a914085c502294fc1dad587928b4e01d566426fe2ceb88acbb9a00000000000017a914ac0788e88c0720d1d297e0a65137321b9a3d94a387c59a0000000000001976a9146c17ba87914c0af6384abc6f06bf59ea7160a2ac88acf39a0000000000001600149f8ddffdfb4d5618052183a1c1eabfb449288f57169b00000000000017a9142bea9652a81c82f3442eade3c1dee11f5d247eb8873c9b00000000000017a914b12c1a38d9f0162fe869ea62c3b83d57e3379cbc87979c0000000000001976a9143ebb919fa87930ac9ddf8f48dd15fbc0ba17461d88ac9c9c0000000000001976a91430c5508f00700acc271a2de7cd1c0244d70b5e4c88acdd9c00000000000017a9140c069c7cf4f3530e1e23d3fdf18cd015678a898e87059d0000000000001976a91437cf35cbbbce3d6bb9c02ab9e458230c9664014c88ac2e9d0000000000001976a914bba9b3cc9a8b1a82291c530c302c4c5c56ad4cfc88ac459d00000000000017a914aee5503544173c8cef84f74219d1404751e4ca28875d9d0000000000001976a914102b7f38cadcfcda444ba0d89a6c47e647450a0888ac769d00000000000017a91432d7472f7cad8419d557af4389f27a118e8bf24387829d0000000000001976a914bf8099c3902695829a45116e381903b048cf355388ac8e9d0000000000001976a914eb12354a58fdb77a2bfb712816766ca55cf9801988accc9d0000000000001976a9142521f7e239533a43c8b6c1c64ee06cf75221c0ce88ace29d0000000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88aced9d0000000000001976a91495f9f0dd099a40c5eeee18f2d9ec79dda5e1871388acf49d0000000000001976a9147e16a1a2ef1511e22cbe42ef723e9d81ff4d9e1c88ac879e0000000000001976a91420b4745fc4c573a175b682196c6b6c1942a63a2288ac949e000000000000160014188e505a378408ef9fe5b3d64cea4878cd217854949e0000000000001976a9147dd0916f5ae58d4d5bc8822c1481efa5836b9a1e88acf19e0000000000001976a91480b75193dfb4604d86e9b6b920b547075e78e3c888ac0b9f00000000000017a91463b1fcd2b767814abbb79c92412c788de00dded987209f0000000000001976a914e650b417cc3eb0cd262f1737e4c60a76ede7407688ac3b9f0000000000001976a91465b62b8b714ff252772d2a464c3cc82a0f6bf28488ac8c9f0000000000001976a914c3cfc65be5a8c79ec1a37da7ceac361cdbe2f3cd88ac919f00000000000017a914fd5fe80b68c7a6cea143471fe07435a442b0f21d87a69f0000000000001976a9140f05f7bce59d40c4320df50ffd2d8aac7fdd069e88acc59f00000000000016001459a1944d9a52a71621f4b3a03bcebc1972b91ccade9f000000000000160014b12a2944821e4351fe93dcd6556b3e7d5cd346ebf29f00000000000017a914806d57b6814d6cb18c6864b204881944e796d01b8739a00000000000001976a9147264936c5659c9d7e4e733e79366ae4bfe9683bf88ac5ca00000000000001976a9149f98f3276650f22c2ff443c2df17ae0d5c8a38dc88ac71a00000000000001976a9142ea7a98a6c6407f652a16bc734fa7ed6e668093888ac77a10000000000001976a9146cc614be0b5cc1e23df4aa39dd975b4aac5f2b0e88ac82a10000000000001976a914928acd59e92715456f775106e2406b11c807110088ac87a100000000000017a91411351ec55ecc4acddb25a50bf968405cd4b72dd787a3a100000000000017a914f4aaf1e26cde36b31ca3580dd080e684c851d6f287b2a10000000000001976a91457e09f4799a255cffda3d7f304ce647b1622e8f588acc5a10000000000001976a9145e2c6132410e7e86c6dcc1a937122ad45390e7b888ac1ea200000000000017a91485b78985ce4025e4ce7b471e2d152063e2d7741a8757a20000000000001976a914ac3cffe422c9f9258713f32a511ae908b7d18d4788ac7aa20000000000001976a914f847ea37af90b6a56f6d8b0af8f7f51681fecba988acafa20000000000001976a914c634cb2c6409d07b38237666865f58a7e2d5df5088acc0a2000000000000160014267f4372478f360d514f747435671288422a7c4de6a20000000000001976a914a706da4bf875501c4e9a2061d0761b3abeb9d83e88ac51a30000000000001976a9140deae404089bee547c29588fe5746eaf0dd7fba888ac59a300000000000017a9149b351aeca91e84a300dfcb04e83f42450076589f8781a30000000000001976a9145d58c830be6dcf9e3f0d19a5e2798aa5f199541e88acf2a300000000000017a914353a96e5a950191dc99137bf388b65ff28b256f387f7a30000000000001976a9140b2dbbc1a7e657d3986f2f389d988707871e230b88ac3ca40000000000001976a914adff2bb54d43af28c924758b87b1b5156798f5b388ac3da40000000000001976a91442384a5878c1325f1b90e709085feb3dee4f159f88ac44a40000000000001976a91478790f6367534b3aad1ae06e331c9c4189b5223c88ac45a40000000000001976a9146a190cd955b19ad850c5144db8b63c21b5883b9588ac48a400000000000017a9145af56ada1659d75f36f3387ffe89edeb0e5d39c5870da500000000000017a91474a96ab775c3abc9f52e06b74e04252e8889b375871ba50000000000001976a91494c262c9181c33ecbade34873978d98f2af90b8588ac93a50000000000001976a914c902a91803cfe2758ea582391c222e6b58a1934488acc7a50000000000001976a91422ef7d7779a1afc9d6b681d875d10c4f882f6e7288ac62a600000000000017a91467c3cc3a9bdceb912f419515a3b8183d5fc03eeb878ea60000000000001976a91410cf67390cc9a6968bee88f88c3dba2373ee30e088ac61a70000000000001976a91436b879fd4436df8d97c0fd5bce0d05f18737f60988aca7a70000000000001976a914b10e3be6e2f63fddba546ca1b8be36804384431c88ac4fa80000000000001976a914fb7dd9fbf4317aeb308af097a1bd839160cb155088ace1a80000000000001976a914caf136e171073362b4f1b1df644a126debf9d03088aceca80000000000001976a91414c03a358b685001526ac34644abb28cc68d424c88ac29a900000000000017a914bc081ec93222e339aa0568f9f9208501054370ae873da90000000000001976a9143e9e7503085206eebe6ab2461865e5c27065685288ac61a90000000000001976a91486a854ac2ce9cffa73be3079a6627751c74c31cb88ac31aa0000000000001976a914668cbaa16d5e44ceb8790c7c0c3c75302307b14488ac39aa00000000000017a914c3da49d9c7e55ad7ac709b0edd25d9fa19812ff78751aa0000000000001976a9143ff4ae6c7fbfca62b1f19c6aa73e7d505c05d28a88ace3aa0000000000001976a914fde3f440dd86cc33cdbffdc8420ba1d7ea96cf9a88ace5aa00000000000017a9141aba48706a4459cca9ab1643bc0bd540257c649487fbaa0000000000001976a9141c2dbc5d4e0b5d49e30fcd4e3cb83c7349b5ab8b88ac6cab0000000000001976a9146e154b7fdfb12ccb022ee64c80a8b7a060e6a2c288acc4ab0000000000001976a914543cf9fc1176359fdb84944ee26d19f7fefe472188acd6ab0000000000001976a914f40e4d2767500d9bf017e22a939d95dd7633150888acf4ab0000000000001976a914962513fb32cb738ccdbdcd332c07931a8e8d2fc488ac16ac0000000000001976a914486ea03cf175b90a0f73e872b87750374105a32b88ac60ac00000000000017a9146cde1edd1a5a69c0b315e93d260fdae18cb740d6877cac00000000000017a914b610b3e210f8811356f3461d840b99aaed79f25787c8ac0000000000001976a9147606939f1838e21f760edabbbf19580a4ff83de088ac76ad0000000000001976a914ba1d9db2b8c803a62169b7b4b5e764c6a4207ea388ac77ad0000000000001976a914dc98be6be835cb52dbfc19dcd5f0f774638517e988ac7aad0000000000001976a9145326bf0eeea6a4db9c1e1db0c0b9cf2521f5afea88ac83ad0000000000001600143a74b574a4171226b1c760dfbdc622a5ab9c34eec6ad0000000000001976a914f82d2de0dc50fd21ca0cb310ed38ec1b5d86a10688acffad0000000000001976a9144085c8d32aa8af6d67291869481ff8d2dbf7de1a88ac53ae0000000000001976a914cd0fcd62fc029580c23e9e36bc70bce02471ef3a88ac59ae0000000000001976a914b15a2741fbb367460511a8a921010d1cbb3a757988ac9fae0000000000001976a9144401ed59bd3dba016ef1cf4c7a934de42ae42e7f88ac02af00000000000017a914d7b588777fed0205c1f895a3d667304ad70cfce88723af0000000000001976a9147928a3c9956143dbdee895a8573173808960b7a588ac33af0000000000001600146c9d2cf4abde78d1ad6def0a0eecb4d35d7fd7865aaf0000000000001976a914091b0a1341a6c9df136fcbafb7c47a97b4a9518688ac60af0000000000001976a91461b17acfb6eb4539ee99e50550736791541b3be288ac67af0000000000001976a9143d72bf0cc2e2306c2d2deb9ca60d8221411dc9c488acfeaf0000000000001976a914ae3c2934ca5fea152a549e3cd1cfa06249baa55888ac05b00000000000001976a914ad4c4eac76afdf117c78d63ad2e0183fd97559dd88ac0db000000000000017a914f3cf5992d577de6481a7177e5519a8425d489b178715b000000000000017a914c4ac46dcae2bcbc9d64e60692d5da348e89c26d3873eb00000000000001976a91412ef0416607d6e0efd82fe2e39c87118eefedb3a88ac4db00000000000001976a9148247078173e47c584c88b8073cfedc8a6af2533188ac00b100000000000017a914959aee78ac6470a6e9a505c6843ec15ac58e0c938764b100000000000016001455d05dfba4c4dbd0ee15bd49f0efed8c47028685ecb10000000000001976a9148553b7cd7d3d8b58ffb3720ae4d074297f57e2e888acf4b100000000000017a91411c15e4396d7aa28085eb8c628329d4e154bf5ed87f5b100000000000017a91403e58b06bf34395ab313316f18c6f8f5afb8ee0b871db200000000000017a914c6a35053115c68871d628813c27663315279f7d68765b200000000000017a914882de28c241eaff3b21bb94740f7223de780cb3d8766b20000000000001976a91485201d66459534c7bea52a49f8169a3fbb417f3088ac7cb20000000000001976a91406cf2b3625e07d01ff1b4e14b643360d9db9369d88aca5b20000000000001976a91465e732aa0e59a6c0ec5c15319aa92c319878128488acf4b200000000000017a914d9416000dd4a5a2ce535a1bf09cfffe2e80a82548740b300000000000017a914cd6b7f624c10bd5bceef4e1fe537062ae5545371875eb30000000000001976a9148e044fd42f49695a1f722358c5609d4da15a0f3988ac6db300000000000017a914e859699895c7b97f1cde143e4149f899d7d8a9968705b40000000000001976a9140c59b74ff02c22233070f017fb2ed010954bfe7888ac06b40000000000001976a914694101ecd996ae94bd8479dadcd7160ff3db3cbc88ac18b40000000000001976a91469b82c13ed52b036d233fa0c3717067a0ede02f788ac54b40000000000001976a91427a881cb41bcd96eedd1c402a10e10b65f188e8688aca3b40000000000001976a9144dccbc4b32b762decee1fb111fc3cf445b86cd6288acd2b4000000000000160014cd016a2d61523c75f790e0350fed8eed279c34c520b500000000000017a9142555c46ade2d16d6169c5ed0d7d8ee3974d4bdb18731b50000000000001976a91462063fdf2cb0cc9391e91176b6185702524f56e388ac38b500000000000017a91448b12fc3a0235af48a33ef9a5940ec0452d10f708769b50000000000001976a91499271e8103d2eeca7bb2d6726d74a550a51fa0fe88ac7db500000000000017a9149f4c505f4147ac216edc97ca88229742d9af950b873ab60000000000001976a914259aec9816f5117fb4ddaa12f4df5c885a6fd96988ac64b6000000000000160014f65a31ff0f094175126ffed2262e0b41d07104efabb60000000000001976a914d7a920fe227f7443bad47a6aede45269c7c9192488acd1b60000000000001976a9145833daa862e1be4797a95fa25af460d1ac64fbaf88ace3b60000000000001976a9148feb756c4dc975eee282e66e367028f0fa8e6ac688acfeb60000000000001976a91408d7d1cc0bcbf651a73aa0ad5baa9f76bf7bceb188ac81b700000000000017a914f9d98a0d194485152a45c9f5a2b2f6757c03a5788795b70000000000001976a914bfc5f8525871c3c240d360539f9051651078a26688aca0b700000000000017a914b9a11a2ebd9eb2665fecf216a0ea277cdba959c587d0b700000000000017a91435d2eed9afd85deeaecab5d7e861da0e111f27588704b80000000000001976a9140be0472e8d04c071f74341f0fc00bf5a2968b09d88ac29b80000000000001976a914c9d2732c4191e2b77238a82ac9945af0a546ce2588ac44b80000000000001976a91462d552218b354cf2d6b445919e67a524638fd2bb88acaeb80000000000001976a914b954101a0e856dae7ea1a16e742b660120ddb99088accdb800000000000017a914a184ce93120b888061a008b6345bf99304eb77108712b900000000000017a9148a62f88104c9a83b9d45d2bc96cbcbfc75b698718717b90000000000001976a914cc1ec4ecb05913af12bad65ec577adc5edbee9c488ac39b90000000000001976a914aa600aaf67616a4ad6e36d23dd89dc21bae55f6c88ac4eb90000000000001976a91462ba8111b98dfb8e9826517280510e39fa07cac088ac53b9000000000000160014446b77af8d10e11d0fcdc8d99637884615bef7cc8fb90000000000001976a91489dfd8622c85aa6aa8e6b03e4ab4e31c5f8233fb88aceab900000000000016001416c5d4652bb5cfc59fbb6d5cf7efe17c7acdb4200aba00000000000017a914e54bb9324c77469261afbfd0b157030a27fba1c58721ba00000000000017a914d3b051fbdbe512a6225dc094a0b16d7d6ecccfee8769ba00000000000017a9149b7d11299efa258edae4b8b12e70bd35404956c5878eba0000000000001976a914ef55bf4dd68adad75354e05dd17a12b2b6fa6a8d88ac82bb0000000000001600140bc92d0c3ed2cbf925a025110189d0f19d430955dcbb0000000000001976a914df05878d653e0674db18962c9b3940afa646f37688ac03bc0000000000001976a91423ba9cf7779ca1c49d7448b8bd5ee472dd2f8e8a88ac3abc00000000000017a9140f255e9f8949a5d7814443007081c93fcd9fdb88874bbc0000000000001976a9144bf213424f53ff16f709e1d8e1a2be97414a542e88ac53bc00000000000017a9143f438fc47a2177d5eaa1b46924cb207bdc380db587c4bc0000000000001976a91408a0c49c10e88f16f5a66409e7e5e3f35992e5aa88acc4bc00000000000017a9145b3e4ec3ae5a87743fe7774f3fc4e4ca07e2d0ae8738bd0000000000001976a91436a574e42c4a3833a350e6bc3930474b9a65b86988ac55bd00000000000017a9143317a73d7c529fda28e3620b171635589c00506687dbbd000000000000160014ee6c3b3568e424d00ad02ea3e169330bd6fa7e9203be00000000000017a914c7aeb2f976dd180d5940a670bed434fe23696ae28715be0000000000001976a914fcea55508d267c403e4d06280711fca5f83276a488ac68be00000000000017a9144e406e799f85f4d42f524446a22a6fdca8f410048788be0000000000001976a914221d51069f66e6f81d3101e7f2a08651842a340c88ac18bf0000000000001976a914d3efa76b9ec059e7d41ee0403ea214c12952a59688ac2bbf0000000000001976a9144afe291baa4df9de6461c450d984e469a6e6064288ac3abf00000000000017a914a7011fc75e2a9a48dc339b3e4d3d4853360b2b42874bbf0000000000001976a91406c0e02e9163cf3d3712b6341af71ff3b156e16088ac4ebf00000000000017a91441333bcc5b9ee098cfef39b6249ca8b64e074498877fbf00000000000017a91473ae90c6625c82dff484a606b1527c49f52c70bb87fabf0000000000001600149534b6be68993b8a2a65ac114a1e2f6850c7adf209c00000000000001976a914efe951739e0e1cd3ac411472c5ad53455e6954ac88ac79c00000000000001976a9149603e3afaeabb96db8817bd8b5363ff7a9ba84e088ac7ac00000000000001976a914befb507ea2ed1a98dfab732d2f4d5bc150812e4588ac9ec000000000000017a9149c1833113cbe592fb20b80d86c4963f6562876ad87bec00000000000001976a9142d2a260570d42c62abf4debe23fca425a044e22388ac08c10000000000001976a9141acd60063537b9a939027386068e5933a143a82088ac38c10000000000001976a914fac570b50458e8b43aff8821d1e610494ef56f1a88ac59c100000000000017a914452149cdc1a8d98b84d8579408fff9c5de2917478776c100000000000017a9143e9ef76d9d88b7cef6a2746e005ca82bd6456d9187a7c10000000000001976a9142d0067f11e01e48e01a09b3982efd988b755a3d988ac32c200000000000017a9147f130aeec67a451a4016f781ff8b7fe46fa135108756c20000000000001976a914ca65840dfcff617cbbaa6c8fa437ac02bc9b457388ac68c20000000000001976a914e57c40a746dcafc9c971ab53685ba1e4b6f422c788acaac20000000000001976a9147ae3c78e19a087f1b277091b7a09e8003de9e33788acfcc2000000000000160014da2c1d52507de16adf6f82d38dd9b8abbb32192a59c30000000000001976a91485b66e76d59d4293cc8dfaf59c83de31f1d0d29a88ac61c30000000000001976a91493c742d387cf1c73da3ca6d4cdb4b103b35a9f7288ac94c300000000000017a914808341d66b2ea7532997d84d7a3e56d4a977f77e87a4c30000000000001976a9144fa442097a8aa560032ef776ef56d53eda396bec88acc1c300000000000017a9140eceee6882b5cb2adcdb34b731ebcabaaf4bd8348704c40000000000001976a9143edd8de3546c5bdde1816ce4dbe2a70a7112977988ac2ac400000000000017a9148624bd76e5866d8c00e42a3d58c65e982240c88787f8c400000000000017a914135d2bc8077f5492a06ca7d0eea8d563494367cd8713c50000000000001600141e26fc8a26b4bf3a613f9d483eec53a6437660233bc500000000000017a91435ff959648387223a39d5c0666b3b2baba9023a78750c500000000000017a914b1edf4997becb9215e6e1fa3a73a60a47c3858138760c50000000000001976a9146f4570e8e26be4ecbc21a12851c170164d051b2988acb1c50000000000001976a914fcd6351bf3efbf6d5ea206d88074ab50756d801388acc5c50000000000001976a9144d1ad68b8e52b7389a3228044ca7792dd386790c88aceec500000000000017a91468b68d08f47c98d99f429106493ba94922b9b8c8876dc60000000000001976a914c39ab309648cc007132cbd49981e301b311f936088ac03c700000000000017a9149ea710ee3998b8072167f05138b1ed1bd33bb6d08714c70000000000001976a9147fc6f865fc6f2f369abb22bfb528c1ec4532cc8288ac60c7000000000000160014f3403d11ce45ba90e319960216029ef3a76e27596ac70000000000001976a9149bd10f588655680266852f2f54e46c6a5e46243f88ac7bc700000000000017a9140ca8aa8ceeb3756c73251bcacf1bcd052f2d15d2879ac700000000000017a914fce552145f64b56cfe7afeb140b9d5d3cdf1791f87a0c70000000000001976a9147889deeb98b9fccc018b75f6910e03cad29f521b88acaec70000000000001976a91443093e7ff7f365de25bba55b35be80d939650b3a88acbbc80000000000001976a91439c35adeabe25a8499682ea550c266e2d2384c7388ac58c90000000000001600148fedae7378bfda037cfa2d470053f4035bc69faef4c900000000000017a914a4a8a17815e93a3bfdb291faaff4efb509ad0666871dca0000000000001976a914e1ff84c9bfb7cd3fa7a64414ced6a8d058baf23488acf5ca00000000000017a914774e04706e71552b83ee5c069dff52ae38e803c08704cb0000000000001976a9144a4403bfd29e214c58994a896cfe894b31654ec688ac77cb0000000000001976a914e2e29a188c9985332d3b84d9d0af7af265fe2a4388acc8cb0000000000001976a9149dd3a26ff043bcc94e94498a8c7992e016a8e77188ac06cc000000000000160014e48ded954551dce1dd5fcc1def3214be20beb57071cc0000000000001976a9143c19e3f28b42cf7bef5cc7681d4b20e3b20a849f88ac80cc0000000000001976a9140a6e4bf1680c550490d0800f5970e4e2c3f374fa88ac95cc00000000000017a914b3c22f50c37ada142dd757dcccf355a57a29137187f7cc0000000000001976a914c88cd8402387967139d5c045058c028e5d2ac1f988ac06cd0000000000001976a9147dfdc7a2f988ee9bbe510e5a99410aeb8cc97bed88ac17cd0000000000001976a9148eda8f0c38524c6730e411719bd6cc4a55e65d5c88ace1cd0000000000001976a914ccb8cb8dfb0478debb4e5a75fa3775e851a5607188aca4ce0000000000001976a9141d6abfe539a25522110e44c72c5fcdccf95809da88acabce0000000000001976a914cf4d20cdf9f2b0deb6fe45f9389472193a1b6efc88acb5ce00000000000017a914660787006a89f7574037ebde3543ee00833435e987f0ce0000000000001976a914e1762313437092dc9a36680e8a5630a73306989188ac32cf00000000000017a91440e0023a08de4b1604cb4cb6ff5fe07cf0a4933a87e2cf0000000000001976a914ab94ac34819863c85eb8fb30bdfd8c79ef31034888acf4cf00000000000017a914831acdf55caf44d25aa69fac8a16b2101923fe8a8700d000000000000017a9142519ab30ad0ca5fb5b51b25f1e01ecf7b8756f098722d00000000000001976a914f810c313b24211906dbece309abc1e08f32ae7e788ac29d000000000000017a9141b38d0bad1f02aa554f86928b3344018e43b42988742d000000000000017a914adf95d376058faceaf7ad2cfe904c43b097811b78753d000000000000017a914c7ee0a185a0870720ccbf7310031d300361dfe04877ed00000000000001976a914831c57e6b8d3220dccca6245803d1a433f5ac78288aca0d00000000000001600143c0f75fd643731ce11d583ba278a44b67db23dadb3d000000000000017a914b9e8852f96fb4bf47ceb471c3ed01ea7c989f10c87e0d00000000000001976a914bac6704ab7d47fc8cfc06f8dabc273bbad33053e88ac10d100000000000017a91471737783d7da90f384d59a2ccb6116a2d9df08248729d10000000000001976a9148aa63a943cdb81e2a47205a4244473685786ac4f88ac4bd10000000000001976a91486d03205bfd68c545d64cd241af85f967916a16388ac8dd10000000000001976a91436edc3e1972897ddf07d6ab23e555e62410b25e488acc4d10000000000001976a9141e8f81d57ca50968787e06dd2d3cb15f519b0b2a88ac05d200000000000017a91406f271ac3fc0b073c21f99e7e60a5f5227a5c05b8717d2000000000000160014ed993ee07e94a5d7540f476b4ee819bef4ca32e649d20000000000001976a9146ad1906bcc374ed99a6343f619f046ab7875f4d988ac67d200000000000017a9141359883ee5c18e44c9c0784915a6fccdddca3cda870cd3000000000000160014567c90fea1692da047d829ade26c3c0f4a58a40b4bd30000000000001976a914b2470667950e46774324382d25ef03be3c0f6e9c88acaed300000000000017a914ece99c81fee759e465bf823c660d6f834d4f613d870bd500000000000017a914994e73789f3caca8640ec430114ef21848c786838729d50000000000001976a91460ffa67b7f3b706c4a558037078a7ddfed65f8f988ac48d500000000000017a914a9a43c96caa9baa370093ed3f9c30aad3629afae876dd50000000000001976a9145b20fa502cf954af3b1e694f2cc46848814d2e2688ac8fd50000000000001976a914ad86dc64628c314c614f46826c15d7d9354934b088acb0d50000000000001976a9149e9d3889369eafbf999d68c3241bcdf933679f4388acc6d500000000000017a914ed4b21c9801a641202b8d22effb5118de82b0384870fd60000000000001976a91473c38c93f4f59e6d8baa6b99977108fca6178a8188ac15d60000000000001976a914966c5e31eb36c1046370224126d257cdda32db2488ac7ed60000000000001976a914b8dcb8b16d012ad370d6c64293c8d137c6e085fb88ac8dd60000000000001976a914a0d69f4194b0e89c770331dff31e83b8a62523e488ace2d6000000000000160014e274c650d831800cafb67238df76d912fcf3120e63d7000000000000160014ba90588e273c08580446dcbb7559fc887d0fd0ea99d70000000000001976a9144057000ab2c5be72f72b979658841ce79bfbfee888acf3d70000000000001976a9145db9870e4c23961f55e32d788fa55fd50a0181e688ac03d800000000000017a914455e7366d341fb0e38dcab989aeae982b5b9f690874fd800000000000017a914dc7b606dd2f3de66000960ab58c71c09c2154d9b8758d80000000000001976a914fff4055c3229c0343c8eb50e6e1f5870cb72d2dc88acb3d80000000000001976a914aea9309af40766fb41c5e2f2252a141614502a7c88acccd80000000000001976a9148a6ea0f94d7b56768094971ed36be0e0427762e088ac28d90000000000001976a914d712d829362cd90ceaaa0bc1b59d3c80f1c94e8188ac43d90000000000001976a91432a9670be0b1fbb5ac0147ac4a0bd67211dbeb9888ac5cd90000000000001976a914428988e809729d278e302a8e684bac6198190c0988ac97d900000000000017a914c84e5b2debb4e9ecbf9987346af9b840741211b187edd900000000000017a914bde4edade74940805c643325e6a5a35f82ed98778712da000000000000160014ff6416765984d0cdf874911828130938a2797e8119da0000000000001976a9142bf0b8f3b1192790c6a2877395511d54c98fc9c388ac1bda00000000000017a91496dbcbbac83eb4c53cf621ae72f61182e770dd4f872fda00000000000017a914e62a79397767f62ebd1ed431b7a8cab47772fce18769da0000000000001976a9141012d405303432a64adeda3f9787fca5b26e4ea988ac85da00000000000017a91490374d86496db1e8fceb9125a70314fc1ff38dc98790da00000000000017a914eb5a2234a06e5177608791d58754a45212bac4b687aada0000000000001976a9144c93f5495ab6952474ef55e5dfdb03e2318b42b588acfdda0000000000001976a91440438654fd0bb4e9b248f9d14cbae8eedb33ff8988ac11db0000000000001976a9140df9738ca16afb169ea1cc003a9403dc8df99a1388ac67db0000000000001976a914c4ba4ab6649f70bd219b6c0ebb51e6b4e4f131d588ac6cdb00000000000017a914a8dd90f62e175600581688cb9c5e4443961a5bf787d2db00000000000017a914dff5d82b01f56af8c5ddabbbc60497cfb46b12e28718dc00000000000017a914c10a1365bafe2e207154fb58ff28f21ab163f120877edd00000000000017a9149c77d10558d6c3614e5c59af49acb0fdc18b82588701de0000000000001976a91445de6a58ad629f1acb70b53e605b3e94f01431f388ac04de00000000000017a914df0a44139d2850b8034e9d4e81c9382f9f3b146d8720de0000000000001976a91483bc6aec5bdab0db0ce78f93d686dde24467127988ac6dde00000000000017a9145ae2a67dce7e4fcbbbc8f4d25d297f6b9209e96c878bde00000000000017a9145f3dca4c3338bc4fcae51d37d0b21a4f545797e7874bdf0000000000001976a914bb0a49a2ff1d92bbda55d3d5790a70f05567157188acaedf0000000000001976a914adf67e488c284ee4b8dfd41d0bc52acbbb1c48f588ac01e00000000000001976a9143c60d3dfb0a896eb5e973f4030ca85b059e3825e88ac68e00000000000001976a914ba895ae5e3fa948398f4e64dd15284b22bc6f57788ac7ae000000000000017a9148c53fa7ee323d7d7100a4ac28313d5376948a4ec87cbe000000000000017a914a4be0ed0b774609492e27ff1ceb168b1bbc7bece870ae100000000000017a914b56a6955ecdb8aaebdb31a8bda26b188d3cc937f8768e10000000000001976a9146aaaa9208be5d39f16a5f58e2ee03ef6486cfa5488ac8ce200000000000017a914dc334d944a6c8e02674c1d838b2e44c8e2ca316287f3e20000000000001976a91497354fb85f00b13911add500d2a77422e6abcf9988ac29e30000000000001976a914a75ac45dd37c0138e15ef97d1486e510c9f45b3f88ac30e3000000000000160014e4b00350b453601ec745683d95f5adfd5605d5ac99e300000000000017a91447d8c9ee3f201905d26905b17693d9e39adecc668705e400000000000017a914da5873db25b8cd5b3def780de512760b7d1f7956874fe40000000000001976a914fe38a433c931f22cf3fca8d4a874b42c64f1407788ac9ee40000000000001976a91451960ebde871de24e3547ba01184146329fa925488acd5e40000000000001976a9142a855870f402e950951e585415fe1ac498c33d2688acf8e40000000000001976a9149d5113c938bf5bdc0a55e528aeb53b8155cd72bb88ac0ee50000000000001976a914ec02bcbf80b99dc5b86ccdce4335bfcddb22352a88ac62e500000000000017a91446fa91d07b62bf4ba001c695981bc506e21545b58772e50000000000001976a914d633cdc29b9999d54652f9e303e94b67bed6017988acabe50000000000001976a91496f82661b02d8a58eb6a1aff238a74d82acdedb588acafe50000000000001976a91485348a972abb4ec32d25406dd96d49bfd7f7162988ac76e60000000000001976a91478542bd99269aa5e8ff6943c6e1809951fa007f688ac7be60000000000001976a914ea2c1d0e003ab89e9e6686e0ec7f2f0f1ef42ee488ac86e60000000000001976a9143a49aa90e368df7a77dc1f352ccf2e5ef31ee62588accde6000000000000160014384533eaa4cd65ed72a15a08af89be2da0947f453de70000000000001976a91426e27cdcb7c631a937deaa8c2c3fdfca1de84b0588aca0e70000000000001976a91431288040427f7cef128adf460ebc6b06343daa6288ac53e800000000000017a9140d63f3ae7a66d5104bf9b79330a8ed9094ad37c987f2e800000000000017a914f5bad72c4ce2b21237043d0a55fd0867ebdc296387f7e80000000000001976a91461043c0f13c1b16043da8f55ecdb0895a40c1b2688ac38e90000000000001976a91423f34acb8599e82074c1c55f0a4c719577ee181288ac3fe90000000000001976a914b108a5322f715e7c0310fd10086d2812ed342b1588accae900000000000017a91495e3ebdb3db8564661fb51b37338f149f5e9ed658703ea0000000000001976a914361839692e1fe3684afc9a81353650b055b00d1188ac05ea0000000000001976a914207a3e316892b07ecc7739585ef765972b4d2d4488ac33ea0000000000001976a9141c3072e9c25c13c328eac9639df0bf74d943d0d588acb7ea0000000000001976a91420a4cc3800e520972d0f83423b67b4969a3a327488aceeea0000000000001976a91436ff9c5a9d100a734058951c0c2aa3fe67f08bca88ac1feb0000000000001976a91487fe2644cbf533297af4fb52f7587dabca1cfe0588acf3eb000000000000160014d8f06cff550ee1b846f26d3e7ab6c66165f620112cec00000000000017a9144eb4d10baf1c2a7b430b9bf6a0c11a419587d5148740ec0000000000001976a91402f5faaeeb0146fe872761e6847fe81e648f8ca988acadec0000000000001976a914ec0da55575473dbae219dffbcc4f6c36a06efaa788acaeec0000000000001976a9144b97a8fa96c8628946260fb0c4b41387152835bb88acbdec00000000000017a914add9403070b820c75dafedb01f84b07642f955cc8767ed00000000000017a9149b86eb2c38781d0632df3e32d636a82464c9dda28799ed00000000000017a9143c674dea91151f9c3bb4043b9308992edd5b644187b0ed000000000000160014685cc85eb46288391a43e817780cfc7e6f57c27cffed0000000000001976a91497d4b2af2b8df110a48b48435876f245526b262f88ac5cee00000000000017a91463de9c35cc9a3ddf84875fcc1669494f0509bbb38771ee0000000000001976a914614cf0d65a7cdf8dcabf5eb6cd93052fa405455b88acbfee0000000000001976a914776baba6f81ff2ad9385c89ca5be691a5bb52e6f88acd2ee0000000000001976a914bf43cb28c4639f9291ec1e1f677ec08d7d94e75c88ac1aef0000000000001976a914609d233e94d6c05bb2fdd056ec45c51699bbc45288ac1fef0000000000001976a9149aa3e150d256bee1885bb8ed502846a8023b6d0888ac98ef0000000000001976a914c3c29ce939e009b9b12c15f2dd29e82ed0f9c57a88acc0ef00000000000017a91422ae03a1c4ddc0a6f95b9f9c0e7792bf80e948868783f00000000000001976a914da249a4c5bea016e1d9fb48ddcf018a00648f4d988acf9f00000000000001976a914f0020e190f59f399c31f47fb78c8a60208f2d2d188ac50f100000000000017a914069c3dbd28fb279da0273e1346c5308852e87bea8766f10000000000001976a914fcce2e45311e0dc1cfede4a8d0c57444a5a3be1088aca9f10000000000001976a9144b994784f0cf8173291fcf3c64ef8c6051e0a26488acc4f10000000000001976a914135cae6f0261a358659d7d58416e346814f7bc5c88accbf10000000000001976a9144fa7e9d3542034edf35bab992f303efe254902b588ac06f200000000000017a9140fd835708eddfe36855aa95e7536e24df8ac08488731f20000000000001976a914daf93a0353d1679b8e0861f021732a36c9d7501488ac39f20000000000001976a91405d5f5c54e7f2d601eda5ad7a5582c1bc7c35f3188ac8ff20000000000001976a9141b8259b9b1a7511b1ba3fa9c10902383996802c588acf5f20000000000001976a914883db1ebbd5ed574c71cf4ea1f14474a5c476d1188ac29f30000000000001976a914c3ad0dad3325fe0156ccf89d03d17c26fd5fefe588ac56f30000000000001976a914fc936292eabf9b25b29311b58eba22804e9cd2d488acc1f30000000000001976a914ec7dd8533220aa557cf88480dd8f3024dbfebeb088acddf30000000000001976a914acec62f91a6a98185bfa2648c518df1fc0cacff888ace4f3000000000000160014248622b1fc05f78cf52980bdb63bf5f6dc7c0f7f27f40000000000001976a9148ae95e5a4d38eb68c2a47277b35d395d6b2c2aff88ac3af40000000000001976a914c9567af44a5c0c0751b320080253b0690c2bf60188ac96f40000000000001976a91466f3e8680046f34721e288fe88037424806416ed88ac15f50000000000001976a914ddac780c9f32f230bd8a273d10244eeea70c0f1988ac20f50000000000001976a91495608ab4b8920b035e6f044784548d603d80d60488ac65f500000000000017a914dc889d1633a6b16035c5330c5b0fa7b550d863788769f50000000000001976a914ac36deff2f8c961a18580f563f42ce53a20fd13a88acd4f50000000000001976a91433367082df328b5894b84f945bece23b2691fabd88acf2f60000000000001976a9140faca7f71b09632394b9291d40bc224097b7fd9288ac31f70000000000001976a914b40b1e6a6a0d3b65eb4d749902e3f01239276d4488ac25f8000000000000160014543dbd6130cdb419064d5f09d25093299100bf136bf80000000000001976a914e22e18e366237775da913315c7a73960685e789a88acf4f8000000000000160014268aa7cb58541d69e460e42de76bf6ad8a5d9de633f90000000000001976a914e293bf0e413152bd729105b4d9ee6521f963a92a88ac3ef900000000000017a914744d1317aa781952d4ddd022ae982f9eed6b2d648790f90000000000001976a914177ff77bb98f692350575119ece3319186fd624d88acdcfa00000000000017a914b4541e25ff786332986b0a5b5a9da3d82666371a87fefa0000000000001976a91401cff6452b4db7a3edb5d020a862dd9c6467ea9888acbbfb0000000000001976a914cb09ab647cdc929f5477050f91ff5940af4af23588acc5fb0000000000001976a9143ec2e74a5b495206e2fd54b31c11a41054e96ca488accffb0000000000001600143dbe1198f9a8bbe944a3a462e25057e16f6a26f8bcfe0000000000001976a91431457e94e37b43a8f064e5a7ecafcc479c43b6d988ac2cff0000000000001976a914a225663cbb4ffe3d1430f59e9bc77ecc15eb011988ac3cff0000000000001976a9148aed858d4cd9fc3a7301f029de7a9b7c9d23adca88ace2ff0000000000001976a9143d7bb26662bfbebb8a0465949747511f7134baed88ac21000100000000001976a9148c5a3a8d9b5cd36b751c37c691c04960f4f5ddc788ac960001000000000017a914103aa6d6e4eafb96478439f4452cb10395eea6b187ae000100000000001976a91448564565f44a0daf54c5e30bb0fcb978bc8b5ed388ac07010100000000001976a91475e519b137f9af283b6c47aaed0ccecce061e4e788ac41020100000000001976a914ef47f1d53a2c3d61fe0135ae0362d4034b51fd8688ac94020100000000001976a914f5b1ed4972998931d2d97c08bb14d5dfac7b604888ac58030100000000001976a914c0d2f9a1a3adb45aef5578fd50cfba45e49dcd1288acb9030100000000001976a91415dbdfa53c421205c2dd6f7d71683a0ef804b5fd88ac34040100000000001976a9141540db7fbf4f46f3140b2d6437ebc7ed020ca45388ac86040100000000001976a914f39e66dd988a3cbfc4a0664862f77f75d233d20088ac0a050100000000001976a914be96d9a7d8145527d086a1fa8680249b43ce454f88acb50501000000000017a91429a835fb57e1906ceaee82bcae764f162270b09687dc060100000000001976a91438bbdfc372cdc3876d2653d5d8dbf4bf5fdf4a9188acde060100000000001976a91404ce809cce277a148f12aa04459dc5c1cdf9b43d88ac58070100000000001976a91492a8e76d6ad41e961068416d100626d425da63f388acc5070100000000001976a914fa0607163d5400e9fd9d2d10987ceab83148ee3388aca4080100000000001976a9147a4ca8350fbdd72c2ee98af5edd531f2ed9a09a588ac05090100000000001976a9142acabc8664571e5c9533477f97b48e65b56d3b1b88ac780901000000000017a91482ce1bd27179c0a193573caf1e1e14e7576253ad87de09010000000000160014e268c85b8035fff2ba6d4ac2cb822204f603ad47fb0901000000000017a914a564aa42463b36687ef04422fdd1e8021cab4c4d871b0a01000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387210b01000000000017a91420fca17794dad10ea8ba05846e685ed3bdd8314a87c20b0100000000001976a9144d7162e769e6d9acb5c5c7863e5871d8143a8eaf88acd70b01000000000017a91423fd200bf3a0540447cdb18bbb3cbe11e9a5e49187ec0b0100000000001976a91473852daee28eb65c70e44e515617725baf98c2c488ace90c01000000000017a9147ad9c4fbd141df794f39982a492df5ef4d05788687fb0d0100000000001976a91451d3433e1518f0f79612166f5bc9b1f6180193be88ac400e01000000000017a914632f2347fbf48b1b5d43e3c4cc714ddcb111755a87ab0e01000000000017a9145b465865cfaffc9643e8d82c350d5fed6a50ba39875d0f01000000000017a9147a86cf654ec4cf3dd0bef3ba440701a1a5f0023287710f0100000000001976a91455ff19240e6441ef1e17b6c78e5830e588467f2188acda0f01000000000017a91449991334a71d145e47e60c1f104ad04278984cdb872f100100000000001976a914d3e29cfbc4eea42a004e632abde1d672a336804788ac46100100000000001976a914081941f1872c2dc1dfaa18d90af704a656bd503f88ac9e1001000000000017a914fe7122452d6761a5dc8293d4aa6d4849c02c5d7e87e1100100000000001976a914aaf4e982bf317456b79515e973f563426338a7f388acd2110100000000001600149e30ac0f044631c9195984bb2f67eecb2647a044e3120100000000001976a914f3cd73c7322bca138e3a36798d1737b2dbf35f2b88ac1f130100000000001976a914c5a7b2c97e5a07fabcb6cd9bacf0eb59d2ceb43b88ac621301000000000017a914d49bce032a5a163faca71bd04708faddbb9ee4f98763130100000000001976a914d6af6e96574c3c97a53b6437781d9ec5d92746ee88ac8b130100000000001976a9148cf23cc765b84719bf0dbe6b9a81651322dea66d88ac971301000000000017a91445d5a22f48ee804a949d58981a89114427509fa887b91301000000000017a914c7259985453f45c12d2c07046733a5e825cfd39e87131401000000000017a9140d8628c77ff1e31059b4f852deaba82cd65badda873215010000000000160014c09e1d38a6e3d0f0063c8f90721a40270c14cf2db7150100000000001600143150dd91dd364e892822f3a3e2b6aca47d9af9bbe7150100000000001976a914baa692c3e58349488f86b53d3f513133e6a7a9db88ac9b160100000000001976a914c478fdf798472a7d2e77797214501223e60e62fc88ace0160100000000001976a91443d243c1cc475313796262e763e56fad11d6315288ac17180100000000001976a914d19e7a2490b3477cd7248b8980237349ccbc13bb88ac24180100000000001976a9145f775cc002ca775c91f46f803cc7dd093e64201088acfa180100000000001976a914bfc8eef362a954cdf77aafe14c3c95ede52e471d88ac2c190100000000001976a914d84572dab6113c63ad91b0c9da9b577ba4d19fe388ac60190100000000001976a914dd3f36c4a920eb24f76231efa0fdbd66f99db8c088ac6d1901000000000017a914ea8536150946f98769d96a81be1e5aa9681a4bdc87d0190100000000001976a914f73f60ba4b3ab870931d86efa14e90e6beb2097e88acfd1a0100000000001976a91496291b4838120fa4f991750966b577b1ed6e6d8f88ac3b1c0100000000001976a9142ff9aef3aace17569668eb9834fe83c1fb8c474388ac321d01000000000017a9140c4e06a551a21703f8e2e7c59efce86d1f1e078d87361d010000000000160014f75c80af2652ef8b43332e41ee3e5316b8edacd7811d0100000000001976a914243bcb3c83914f94a2bf893428f8f67b5d96aac788acd21d0100000000001976a914aa8e3bdd37f4462962f41fc10a8eef1023aaabbd88ac1c1e0100000000001976a9147f64d0051cc960c179f67b6ae2252c540cfe798688ac761e0100000000001976a9142e529835c6d9be750771eb5d76c2365c70b79e5788ac9b1e0100000000001976a914f3cf396f2964b9dff572cf40036b0cfeab1667fb88acad1e01000000000016001455ec384021fec84ac7e0503c4626be6a1c191f5cc21e0100000000001976a914423818b1f19efbdff3deea59bbe593015888b24488acde1e0100000000001976a914eda7c5bc3f7bf3931da0b6c16d9ad58fa5cf37fc88ac0b1f01000000000017a9148264d7b0dd87be936fe763ccf1e914317b63da6e873e1f0100000000001976a914e67d05cee0b003c4c4beb0aad28dba8aabd3118588ac951f0100000000001976a914eabd785b94a88a765609def80e794d31dede9d5f88ace51f0100000000001976a9142bbb9c27dac0a32a9fb3ff34e6907da5124f37a588acf5210100000000001976a9142c4ee600cff5a433a788b9ae9226c5407d35012888ac54220100000000001976a91456e627a591824f9c48ac649d0d60aa3b23c4101a88ac66220100000000001976a914d88f523f852e6fde382d9f0ee5114376080b422388ac7a220100000000001976a9147fc00b9b68b2ddf6c3e3bd7447f7e02a5bb5135888ac722301000000000017a9140ce1edafb1bc3fb9b78b8ff5c7327ee3a84b8e17876f2501000000000017a914749f57c81b25a7d0336127d6b64b906002badbcb87722701000000000017a91446b0afcd8fd8f726c9a0412cf382e97e81ad4fe387dd270100000000001976a914b83309c40ef28ae109a388a97de443502c4f486888ac762801000000000017a9146af8a8efafe9b5d1d6a9603b5123cc7057cbdde7875f2901000000000016001449a2f4db931e7a927edd89683fcfa31f8f77e009a0290100000000001976a914da85596336f321732f4b634ebc39ead075cb948d88aca1290100000000001976a9146429778ecb18acdc83d5adcd5bb4917a7a3a6a4188aca5290100000000001976a91429c372be87a14301e222a1c219ae45e639f9055788acb42901000000000017a914df0b3d062a4aea1071bd0c228fb0dc3ff0eeff9187d62901000000000017a9144717c201dfd12c317481883ceeb13d7b1b9fa31b87662a0100000000001976a914e79208f590417d6c060cb319b70169f3f1dcb62e88ac822a01000000000017a914b38944b2ec0ce5192d124051d470fd543c54389087892a01000000000017a91498ffd7119b2ff1e4ed0f8e99ec41005af8bd2ab487a62a01000000000017a91491351abc141638bf974c78905b8b3594cbdf445787812c01000000000017a9148f532e660b5ff68bab98ed5f0a70eaacdb45a072873c2d0100000000001976a91451fa95e4a5efd05c9f2ca2c75f802dc435a43cdf88ac9f2d0100000000001976a9149175fec72155876f64a74e130051b20b3ae5eee788acb42f010000000000160014d98ee375e903d8102c05bc37052fa6dff7f49bcaec2f01000000000017a914b32dfe775da9d29874b0aee1a9f1d6aa3b29c6168798300100000000001976a914e38ac088bea0619739906fad0936b068375b780488ac9b3001000000000017a91481605bc105c6583cb26a626187f4413bdb9756218705310100000000001976a914449432eab349bb12a8bd11578446718d129bf49f88acc8320100000000001976a914741cf93d375381d5dc67114bc93d6f99666ad94388acef320100000000001976a9148064510dc2447ab56c534b27c9219bc97aaa50bf88ace83301000000000017a91452f83fbd333e09c98fd22687be3cb0eea50268388724340100000000001976a914f3c018ce0fbf27f9bcb65fe151c1cb5d4261ea3e88aca1340100000000001976a914bf4e85d5c5c54cb8e8f523d758cd8eaaa24ecd6d88ac20360100000000001976a914b7605458f2dd26ed947bf1ddd9a0af8c06dd853d88ac54370100000000001976a91491cbe19d00083f5baccd45bc658bb7b856b433fd88ac8f370100000000001976a914c317d71da5e9e9d10f4c597b434ec101efa2ddf688ac123901000000000017a9149905823decba1ff164f009eaa8cd64918fcbbe12876a3a01000000000017a914923a9f206d37b45da8789f2707d44eab5e93526d875c3b0100000000001976a914cab08fb4c7c7ce131a3e74b1ea0b8c2ff41c564188ac7a3b0100000000001976a914b87452b6885f5ddc6ff47d6d0eda1c9df61da6c488acfc3b0100000000001976a914e32c529a3e492bd42e5adcf8094890aac0978b0c88ac683c0100000000001976a914f87290f3007d38176c8562610b51d4f63c782e1588ac643d0100000000001976a9142e07a0905fc78850d5a1ef7bcb62fcb17e962a0688ac8d3d0100000000001976a914e46a4f47ebb4c099cedc6630213e51ecdfabbaed88ac433e01000000000017a914706ead5303a17bff8050493be043fc1d1c85ac8c874a3e0100000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac973e0100000000001976a91470e59c1a79a7d657f66dbc79630416500ee0be9588ac803f01000000000017a9148c44d75eefbff178c22f537e17d081ca6b070e538795400100000000001976a9143ad98ddccc086bd52c34a33f74212829f9e7106b88acac410100000000001976a91441229faf9b59d4be56b3d9387b6fbe7e1df9a15588ac144201000000000017a91484d858f2802efdc98c6207c3638697f7de8c463187d4440100000000001976a914c6d14dbcb5428ae58f529e5cace7f8e30e6f10fe88acd94501000000000017a914c52268b520b36cd96c9933b8d327978a8d5ecade8756460100000000001976a914bce15e43d25222e6d3112db9771209c3e8d62f6d88ac14470100000000001976a9143ca6005539c6a96f439212b344ca593e7e97323e88ac61480100000000001976a914cde8d5df834bd4e3dfdc60215c9acd03503634bb88aca34a01000000000017a91477cc516722923cde62d203728b0e6ff59c3cc41387df4a0100000000001976a914c52dcb6e8b1e0d42104598eeb46940976b093d7088acdf4a01000000000017a914fd89c350380aa412e791e973f2738e666ff16034871a4b0100000000001976a914caf683898275c30a78841282238ebf7f63beb00b88ac534b01000000000017a91450493804cb07d13fa48571107029d6a1362b6116877e4b0100000000001976a9144208b0a40d92225de7b47074c2fa9d8eba2638a788ac8c4b0100000000001976a914ecee8cbf819ea866553b7246af13f38293112d1288acec4b0100000000001976a9140232d99a92c85121fab208ed324e71fed2ebd7e388ace34c0100000000001976a91403354ce4bab4115b85d04bcabfa85d308cb8684d88acfc4c0100000000001976a914e1127df5fa9aacb9eb56c5dace07585d0667d13988ac004d01000000000017a91493b0280407f7e08a2356d474ff09acae9c3cecf387714d01000000000017a91492e9366702239a7d63263bbb55fe3b5649c88ce187ce4d01000000000017a91494736747946e629933eebd0c53787049b73de6bb871c4e01000000000017a91406af2f177a52874b257926ca6098ffacb15f2ab9874e4e0100000000001976a9140dc2d5c0f183bf20a376d29fd7554473bf1dd82188ac854f0100000000001976a9141ea5b03c5e43bcb9244db1ab1b0a1b65879e961288aca74f0100000000001976a9149528f1fb56b814bc5063fc6a8e15c5127d62d53f88acb54f0100000000001976a914e228197d540cfe8b98e95f21120515cbe449466788acc25001000000000017a91490af3fb5f25b58ad0f886dfab846456734c0dc5c8745510100000000001976a914d2f2856cd367bfaa3ac34f35b299cc7c65975ba688ac82510100000000001976a91408034c20e55a83057be6c7cc4be8c8112959c40488acb2510100000000001976a914efa762dfdb11775a2b8c18b2ac15512f3985370488acea510100000000001976a9140f5adef39af9a5fcaf375b192ff0851f4824ae6d88ace25201000000000017a914eae5a43c82cee04fcc95f1295244e7c3709fcd688704540100000000001976a9145770d1eb57527c503183a1fead7b272806c06b7088acdf560100000000001976a9144d979893bb8e497bce634cfc59322dd3b5d728fd88ac84570100000000001976a9146d6d827b314fb61e1445bd1edbbb7fdba1d27ba488acfa570100000000001976a91410b296f6bc799a666da204f3df026e9266826fd288ac8b580100000000001976a914a1f3322643512e1396f0dce154588e00574911c288ac72590100000000001976a914ddac014d0af485db9d6ea9f7344d0fd09384d14f88ac97590100000000001976a91478e363da44984b2c05cbe1be5efda67c15da40ae88ac1b5b0100000000001976a91427ef6866d11f2ae9d92a85207cfeee4adb87a86f88ac925b0100000000001976a914af7e37c7ce92e17c61b02db5c176ff08c8c9a0ed88accd5b0100000000001976a914f7ddaecaaa8a13e9ba4e0ceeb5f3e9f6f87155a788ac635c01000000000017a9143e7dd27fce29b04346d4e00490f0f03df25bf2a587135e0100000000001976a91421cab93c4f4026d950354d3c9401ae6bee4b4b3f88ac105f010000000000160014b82415b559eb2a92e5dbae01f0f70a4910b8d044805f0100000000001976a914443a4e4910d25b249c607ad68e5121ff736415cc88ac1d6001000000000017a914399d1acd83317ede95351e696f7c18c3bf2eb9fc8763600100000000001976a9148c2d7f5d9ccee2ed0cbc50a18f066f7d793d402288ac65610100000000001976a9148729a496373265e0b355339c74f770b7b409090088ac79610100000000001976a914a33f7274a1b6d83769cad9d54c4d50bb06fb541288acf6610100000000001976a9146f801d9a36c4d82ba7fc1c6c4fdba61bc971e5c788ac57630100000000001976a914008fc9c0c3910b264a4ced3a1790f8d51003e29388acd9630100000000001976a914771ff1edb32233619c66fc8bbf126f63b26a6c0c88ac6b640100000000001976a914ac6086abb29989897bf67d808620851c11818a7488ac3d660100000000001976a914b89a8c2705a8385f462f25cd26e9a8a3d8b5693a88ac4e670100000000001600149e9440eca1567fed8b30cc503b84471d13f71f06646701000000000016001481d6b41f2ae82767e6c17647b4c3fb03dcea263881670100000000001600149a9197d3b6c10f1be8e7ecf64f9b4167053edda82d680100000000001976a91476d2377718b7e844ffc6551375bc49a08a10124b88ac69690100000000001976a914b556e10afd7965f0386a15ac115636286f2c9f2888acc26a0100000000001976a9142d08ddeaae0b026d7406b0240ab5950e486c3fe988ac936b01000000000016001446ab2821c22099e89c5b5c06840b91d2bcdcb8a9d16d01000000000017a9144f537f82b0e580c1b49ea5e9e063c4506a34905487d06e01000000000017a914d471ee61406f5fd14e4f9eb464da96f484bf125587856f0100000000001976a914dbb347a250592582207645878dfcb3446f38749e88ac457001000000000017a914e508ca331d2ec94e3b95c72fec2f271c2f51c5da87607001000000000017a914473d1db4cb69d27d5a58641139d967c92649844f87d7700100000000001976a914a8128a2dec5f150aaa2db555dc4ae4ececd62b4e88ac65710100000000001976a9148d7b571c91bd3a3e90b9c21bdeae121c8e12f94e88ac0f7201000000000017a914dc938eec048aad520e06dfd1c5a67f193c430acb8744730100000000001976a914368f5888601dd96ada7f14d4e08d7c9ca0941bc988ac54730100000000001976a914a3289c7d84823b6d2011268e72b932828422cd2288aca37301000000000017a914d059ac4f5f31a880e0c869adcd112d088d28cebd87d2770100000000001976a9142f73809498bbc0b23edce756ecadd0f73cfa8ed588ac3678010000000000160014f639614ef9b2ed7396cb3ab13407aa5789b6a259de7801000000000017a91451c4802e594fc2e2a270b6ef656b2319ea0bef7f87047901000000000017a91487f202fce3255b46b76f689e24a2df646a7a796f8780790100000000001976a914e72bc5fb44781cd6821b0e9573edb0e901b176a988ac987901000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387fe7901000000000017a91424b5a2b785834494a5c3263da34d21a3052bfd8c876f7e0100000000001976a914f3bceeaceca1a6a937d4e86b076dbbd72916bf3588ac837e01000000000017a914c8861226f3032cd91194ba4d539634b3bf27c1eb87287f01000000000017a9145fb77860fa6fff0def5e2c1ca5b011a940e948028767810100000000001600145b78fb1a7f2bb28e80c5ebfac75e2384ba5261bfa5810100000000001976a9143cce26416c9b0388a05baad7c8cac2042d1c177c88ac34830100000000001976a9147e53b720bac17defe7d675e76c55400ee4e13a9b88ac67830100000000001976a914f5a9e655e2f35191aed53b3ac6db24e24eac2dd488ac61840100000000001976a914243fd71d72c576ee9a8124489646fa0b7cbe0e8688ac6b8501000000000017a9148991a703f963de1ff9894e14dc1cce008763b1948732860100000000001976a914f39d1f1ffbbc79b46fa668d3bcab9bd51319262e88acba860100000000001976a914076b20c2ae886080d4cf7efad6a7f003e807886d88ac5e870100000000001976a9140fc57c3c51e1fbfa049d8dca2d93ae37644e417a88accb870100000000001976a914b992aabaffaa5fdd0aa51d8852e71d831ca5529f88ac138801000000000017a914f38aa7499a147d620a84552c85b83c797883fd6d87158801000000000017a91491507792ab99b89c5a9492dcfc18b43d23511b4c8743890100000000001600147426dfb88a63f38e5957b8129777c41336e4a63c4f8901000000000017a9148a7883fdbe7c68e6d2703123126692a7ac2757be87758c01000000000017a9140179a830c7f23db90f54761830b218ed775a6c1287a28c0100000000001976a9149d1c4f81a089cf75b5198470838f6da6b66d5e5088acb78c0100000000001976a9140d410b6d9636aacf656b30242f689040f87129fc88ac1f8d0100000000001976a9149e562d99467af694c11c66ea9fd93de646ca923788ac238d0100000000001976a914c5fff20aca099745abb8dba107d58e477e15c19088ac6f8d0100000000001976a914943dbc710cef4cee012d0918b226e04165d15a1588ac878d0100000000001976a9143b2dd084de358dc2fb7238933f116db71e795a7f88ac048e01000000000017a9144b3b51187c8652cac2615d40e15f868ed885056487078e0100000000001976a9142a12949ebe58fad142159b28593cf9f285f746bb88ac268e010000000000160014d8212b0f197c4a70f90a1a01026a46d5f74a20f03b8e0100000000001976a914ae09b505c4dbba89fe22b033bc2d201004eb340088acaa8e0100000000001976a914e624df70e3898c8fc28826950b9fe4041827dbb388ac868f0100000000001976a914e9b377f5c6aa306609deba080b42f9058574fe9588acae8f01000000000017a914fbeaa7bc273735669ef0d1ced515a66b38e3f7f8876a910100000000001600146c0ffadd2bc161970c9b53576acc93b1d14bf72b73910100000000001976a914f1172e6d34e8455711aeae69b1fce8b630b82e9388ace5910100000000001976a91455e12a49d7967524950bfb268dbd23a544d64bed88ac709201000000000017a91408d970e6491195e5f196d185b0eb1362903118d287bc920100000000001976a9142a11d47b1c061bdedf72f184ebc93f9db12a54af88ac69940100000000001976a914796d34f496a45b7d3b7424abc6a2fa1f4f243e8e88acc9940100000000001976a914ce1b4c3aeea60cefc1461f3171b00f44e454c56088ac3a950100000000001600148fa6f8385998382a6173e1a3e631fc7f206f24f1509501000000000017a914b793c4c36d248838d955d6bbf3660e950ad42c2b878a9501000000000017a9149aa681c56006b298efbb119ef39624c5cc0b663e8730970100000000001976a914422b9744891d233d6a140ddbae9fff8a7bf3935388ac5e970100000000001976a914bdff899f1d64aa8e0fa135f2a541fcde1507ee4988ac7d970100000000001976a914c7049607d1569c4acc80386dad4a4749a66f751b88ac949701000000000017a91400fa027c3dda90bc49542bbb5a75308c0c01450087919801000000000017a91412b96448989f2d516cde6d43328ae8d15d32022987cb980100000000001976a9146d86d0bd93376cbc47d0e5fe6fd1f4e09b3c2d0788ac3d9901000000000017a9143447a5b75271e5fb94874660cc5d532ead356160874b990100000000001976a914ac5bd96ad4170bd4676b72bf4cc04bb3a42efaee88ac189a01000000000017a914d3b5e4d54ab1ac8419a8869d7f9ff5ab30f8e6fc872e9a01000000000017a914a6c71dc397edc3df649abba17cd8410cd47c4e29875d9a0100000000001976a9140c61b370c105e538c8ce9205f5870971e36a09cc88acc59a01000000000017a9140f40d2a90b9f48a39b2f55b0dcb504c0b5a629b087159d0100000000001976a91461f5741cd846b0604ba0b4e767fc3d4db292629e88acb89d0100000000001976a91407b4d4eeb8ccdf756acd91548643507765078eb688ac2f9e01000000000017a9146a2ae4beb9adf106291994aa5a4e43cb5fddb8d987919f01000000000017a914071d329e003015b755eb2ead4250367c5b0e7887870ba00100000000001976a9141e485676edbaed5de4987e8d9d057dbfbb9a6d7188ac9ea00100000000001976a9141a6179454f0e1f0ba4421bdb225295658c5d247388acc5a001000000000017a914ae226956afb90b643b251c26b4e9a48574c9ce2b8778a10100000000001976a914ad65a425e3f46ae7ceb70b52bf1f864013b1007488ac1ca20100000000001976a9140331631d81e6e894b2065a542a4ffdcb4a05d39588acc5a20100000000001976a914b4fc82286b3f63e95146c3ae6b39e78ac1c2c14188accda20100000000001976a9146e499fb2cd67b6037eb01e3c7acf25cf5c25db4f88ac5fa30100000000001976a914c6eb63f91896fd164c8a514553dcaea677a43acf88ac6ea30100000000001976a914cc63e82d9e701bc6139ffe1451d480d25dc5108e88acb3a301000000000017a9141f8e8f52bf7f061dd89481c94e8aba0c5b96ee8687b7a30100000000001976a91417b66af445b1a4f660c569dbe8bdc74789fcd8f388ac0fa501000000000017a914d992e23082ab9b3d7284a06705a85eb878d0e39a8763a50100000000001976a9147ba4421bcc88475aa4708ca1eef5739172c5df9d88acb6a50100000000001976a914546cef1a8094be50a5bbf77e588d2d5aa822b0c788ac4aa70100000000001976a914f540c1eef0f339e32932d3eff48f17ce77de4f1088ac6ea70100000000001976a914c47f92eceab7be0cc26af9d6d8228691e6fe17b388accaa801000000000016001416f0f29223ccc8965b5e80540ae2eb6481992fde01a90100000000001976a914d05f14099b90e75da40ca808d3015edb7c4d571f88ace0aa0100000000001976a914ddc5f20f73c057c64e0d9d3c233b1524b6ca381088ac20ab0100000000001976a914d21070f8639a529905d32249d678941a5109e0b588ac3aab0100000000001976a914980978dd4df1b0d7500f9433bc34616ebf408a5c88ac67ad01000000000017a9148da18dc092c04d22dfa67301b5f7920aa8aa269687d9ad01000000000017a9141e74699defa3046d5cae1f9ca93f36796bb7e460871bae0100000000001976a914d91f034bc05ed39c1921563ce2d6f0da23e2732388ac94ae0100000000001976a914521fba79b675e875aefcd334009bdf865d32b87c88ac31af01000000000017a914d17d8ab42c515f7b5a635c3c7d261731701185a58794af0100000000001976a9140ffafa7ec57eaea0e08376840a33ce61f8a4925d88ac90b001000000000017a914ef1bcc19de4bee850b2b76c3ef889557fdd6bffa8765b10100000000001976a9148f42f2621136f1a1a7a472d19a35bc1a99ad009488ac60b20100000000001976a914ba9813ed20968e160080ef00f97e750b2e49da3088ac66b20100000000001976a914e0366e5b3becb389ef3168efc1852cc04faa8ce888ac2db30100000000001976a9146a8ec340ea3b03eecf2558427af55726cc316bd188acbeb301000000000017a9142051a285ee783a681fd28708591e4c70fe4e6a5487efb30100000000001976a914513652bf14ecba92471d45c42575e30df32174e588ac5eb501000000000017a914095d3f7a9c405a89db9466ea890f40932a8112b587ddb50100000000001976a9146d567a36e98df1dd82cfd4523e43ba40043c4d6b88ace4b601000000000017a914edac349bc115d2d2c7d8b722cc38452ab78b550e87cbb70100000000001976a9146d3fb825baa3a4b9c6e61a928dc6d6f494f7c95c88ac40b80100000000001976a914e281f1ea6c0425fd874af7ff5699e9a86578be6388ace3b801000000000017a914d43c5ea3e7f2c30335cd80a3b2ee8e43a85f3d24879ab901000000000017a914d2cb37aaa805ea95ccc48ea1b0e6c481fa9eeaad8719ba01000000000017a91481ce9c2aba496e56a9e3e0176294ed45db844b8d87bfbb0100000000001976a9144e999c4148fe29f5f4c1d35fcc48a464b2e9b53a88ac1bbd0100000000001976a9146756e97bc9588d66a8f94164301ec3b55e2869dd88ac1dbd010000000000160014e15e4e6c349be63e508e51d35044ab6d69a6a15647bd0100000000001600144240b5d5e2ac208029b3623d1535effef7db5f34b3bd01000000000017a914f629324c026de353e660aa060f93dc7c20dc3bf58717be0100000000001976a91490a76898c6facb910a6e42078607e3708ec80f6a88ac3dbe0100000000001976a91454c96e0abde2d154a7ecf856116d996608513bdf88acaec10100000000001976a9148a06f1cd84ce6ccf0f541e8e3b7729d5cb0f90a388acc1c301000000000017a914dd284ab4a1914e84d2f6212636f9c42a28724f0787d0c40100000000001976a9145a35d53702fc3cae296112efad89eac0f068a46488ac40c50100000000001976a91471bed327fdeb983d68194c63d45fbd8f62e0fc4f88ac83c50100000000001976a914bc98d4922c175f2da41f018ffe4c0d38294fb3d488acbdc501000000000017a91418de4765b9a462dacb3cadf4c6af269bce603d55871bc70100000000001976a914e6f83588b65d1da51e744f3b3baf23362c7ed1f888ac2ac701000000000017a914ef58aadccd4425ceae9af02ff9ea3399fe462e9f8736c7010000000000160014944b6ad39d52f466a85cc6119936a6987a5c8c60a7c701000000000017a914252809c8fb3254053e45f9ab65f02f74ac8bd9a687d7c70100000000001976a914b61d0a20135c74c9dca493cc48f000e5900f899488ac16c80100000000001976a914334af37bbb75ce05ae4bbaeec35959893893908088ac2dc90100000000001976a914f111426ac4dd8e60a21b320f9519aa58121c8ed188ac5cc901000000000017a9149bf0a6671704603d5259fc8efb6c21095ff74f3f878fc901000000000017a9142d31bae82e75136b858191e705fb67e2d9265191875eca01000000000017a9141b1e0f25c117d5f6bae1cccce0e906f0b7fb962a87deca01000000000017a914bac066b6fd55cd2b58abc1dc7300b0f9cb0c308087e4ca0100000000001976a914b2e54459e3f834ee57724d1bf8a2b018a9e994fe88ac38cd010000000000160014d5a9c9444434b0fb8b3522a89ef9ba155dca4a0d3ccd01000000000017a9143e1ae418e3b8997c8a829f2fa23a452118d10ba787c5cf01000000000017a9147e9ecf9356730215aee0184ecb7ed5ee3829b75687c9cf010000000000160014828ef3731c81d823130c03c3c55ae8810ed5d5ad96d001000000000017a914c110674de7d59737494974e75aa526915bc6a4bb8709d101000000000017a9149804da1e264990bef1a09e17f4109cdd2940d86e8740d10100000000001976a91476c756da352a52d310847a5cdd6c1c68c779a0f788acb9d30100000000001976a914f791f9555802f4540c32b0dee7888fbb540248ab88acd1d30100000000001976a9141b134efd15f2ed73ca3134dd9f2fe942f61b001a88ac06d40100000000001976a914c77b4186aa04b0b06c7d29647be6998ee472f33688ac18d401000000000017a9149e21f0e1d247ade41160f31c98856bebe0f4a762879fd50100000000001976a914a459d5fcdd19ad57c3999d93a7ec3804b90f32d188ac94d80100000000001976a91409390434b1c475d5e9f5bddccbeb84f18aac1db188ac73da01000000000017a914f7d9de1198cd061f84cc380ef1233d3f1180c70987b1da0100000000001976a914301df0e2476dbee2a21a09ae6867c00e0f9096b788ac84db0100000000001976a914a7f4d359fd0d35be6bc986fa0772ada0d99745f988ac96dc01000000000017a91419a331b0e535fd159e7e5a4ab9e64aea4b69a51e8748df01000000000017a9141696ad20a3bb59a4e7402c65787fe69441fbca1e874bdf01000000000017a9144322741dc3f8751f057e013529c7dc148ab645d387e8df0100000000001976a91456ce2fc8c7c81fc0c1beb316d8c5b3abf6068f0d88ac62e101000000000017a9141c4122bb3050a3d68f73f6904b6f4d4dbc3ca2d1876ae20100000000001976a91409883015c549dcbbcc9e46320d9394d12b8e8adf88ac7ee20100000000001976a9148a20fd87e518822193ab6cbe992f4ab2e1c3c04a88acbbe201000000000017a9145fb8af3d322da6140ad8ec16e38f65db0a933e7087c4e301000000000017a914be045d853b7b64ba5521404faa6376635d88ed7e876fe40100000000001976a914aeb2ea437fcefd7fd348831d5874a7223c1fb2f988ac71e60100000000001976a9140cd6c8d617c71399410b4b82f904d0b33bfeb15c88ac91e60100000000001976a914fe21c8175cea48da212f8a56c7821a484ed0d4a088ac85e90100000000001976a91496061728fb0ec771271418dba4f3740f53cb2d7088ac3cea01000000000017a9148e15eee5ed778857f99a3949477677946be993968723eb0100000000001976a914347728504b6c012dd6a30c26a7360ad2494540a288ac5dec01000000000017a914e821e1847711c7d9c0b4c06ded6a64415a93afe98737ed0100000000001976a914944203f463b792d7f166f42a317e4abc614df5ad88acd5f00100000000001976a914c2ba56a62fe08b146d553760d29bbd199647eb0c88acc1f10100000000001976a914af884c6ec67cc9dbf69465a416e8251ace53c34f88ac0bf20100000000001976a91487fa02456c3cace499924575883694ae3f9d210688ac0cf20100000000001976a9141fd4facc8cf5e9e4aeb427661c0846625363864a88ac00f30100000000001976a91421ad6ca46c249afc8048a07674852479e8aeeec088ac1cf301000000000017a9143539f53638dcffad1e15a76be00fe249e7e385a08747f401000000000017a914e84358421ce4c751b7a98b391c279e2ca979d4828756f40100000000001976a914d129c45ea703d91954813ec15e67d94a9c1789c288ac7bf401000000000017a9147d6af54e43cab2c5f48998ec8cf5e442926b063a87aff40100000000001976a9141fd4facc8cf5e9e4aeb427661c0846625363864a88ac34f50100000000001976a91474bfd126eda206696e6d77f2b161f593c97d2e9788ac50f80100000000001976a914a90ad58a38b35bbf425af2cd5668a3067130d8de88ac79f80100000000001976a914345a9acd48d29d8bd9052ad631578b6312933d7488ac8df80100000000001976a914bd5a60c7f8bca5452c363040c974ce23c93b519688ac81f90100000000001976a914b9026e9e0fb042c4636ef87c953efa6ee468dfd288ac86fb01000000000017a91460bdf826853f85436490ef168580ea132a0a550487d2000200000000001976a914fe8accecb2d24fd5094e70cf3132d5e7af19f53988ac83010200000000001976a9142bb99dc1faa2fdb65a4d21901b9d8a2e9dd4588188ac9901020000000000160014cb00417f3ae21bdf5ffef1fb3976fb1454648ea47a0202000000000017a914885f1c81400f6d7a669536ce6867730c2f0ebd42873f040200000000001976a914b3f90695a27b7c80d995a1b4d02be8c94753f74988ac0f060200000000001976a9145382840bbfd0247d9f5dd6ec7d9de18fd96448ac88ac8207020000000000160014446b77af8d10e11d0fcdc8d99637884615bef7cc430802000000000017a914eace730e5a6e558d2bc99c875446cf9e185c610d8770080200000000001976a9148ccef230bd331e2e9a8f876c87331e9d254f013988acac08020000000000160014ed453ae3232e68cae6b634a1bc8b95f81380aac2e5080200000000001976a9149ff0733bcd42f4d8f3414e48cda4f40589ce90f488ac6c0a0200000000001976a914ad4eddd2e898280d237b7df87fcd298a87a968f588acd10a02000000000017a9143332f4064e5ec953d6c8bf06a180607e493526b687540c0200000000001976a914df0e156e1790ef2da6bb40cf0d2b8595045f816f88ac550d0200000000001976a9141bc7a03e0ee6a1a2f0e65a302e6952b2713c60c788ac061302000000000017a9140aac27043931ae77d0f7ddfe0da321531fe642ac87d2130200000000001976a91469bf37730871c274ab5c7ffb71e933fd1a9a81da88ac7b150200000000001976a914042bce5f590a331b6e5827b7d6cf40f3e691095988acf2160200000000001976a914d956033c6f828c2b574941b7d1d3039546b90fed88ac2c1702000000000017a914ed1648c522cd3d818ccbc64d3a29bf1369772d9e87f0170200000000001976a91469c02554f29eee0eb4b12b9083bc5d5b382fcb7688ac56180200000000001976a914d9de68df8b24248469b9d073dd6e25cfcf391eb788ace1190200000000001976a914c17ae39e26dfab4936a1915daf243d94b2117c7d88ac9a1c0200000000001976a91475fee18258a39cde0bcfba71e5dfa6be5d91e79088acab200200000000001976a914a027ff48ec484ae59d7df94cdd8ea6b7c96256f988acb2220200000000001976a914ecb64e075d6cb82da47c14f7168652ce37e779b388accd220200000000001976a9149e325053581d0d158e764bf91ba1cdb631b990af88ac11250200000000001976a914df45c8a9782258c36487f20fc2239cca38dbcb7c88ac1b2502000000000017a914d9f8b42273fde9a8f91a8b421aafcf789e2f778987c2270200000000001976a9142a034fd85b5836c584cce6e6ac8855b2dd83dadd88acab290200000000001976a9140d56372ff5aaad5d129ffea4561fd9e5a8c8d38b88acd62902000000000017a914cea55674caf0b6c4f4b52820b9487b28f6d0bac487132c0200000000001976a914a2ea28507fa79112b95490bda9e5f5a115ecfff188ac812c0200000000001976a91462b5de0a4c777865156dc3338f39eae3f35b6cd488acc0300200000000001976a9141623a370c9ca157be684450afc9740711e4e744788ac1b3702000000000017a9142f4725a1e1a1ed7a15d3e5f52c19ea7bb920b498870f3d0200000000001976a9147a8d89446521ff5d7e19e60ca9859098a72a902488ac3e3f0200000000001976a9145361d7a294fbc7d2e076fa763422ef079f92aa6788ac563f0200000000001976a91469deebbb1e4b594f91f01e65278b85c67616b91788acbb400200000000001976a914ccd48f6b9a43d638fdda9c3aee442b6e60c8811288ac0c430200000000001600145c6c27f2332c4c5921ef801729acaed3ff69524593430200000000001976a91427b786cf4d211faf8d830923f5204ec3cb41d70588acff460200000000001976a9142f9cf8ea4170e87a5c83ecbcff550b62908626ab88ac034802000000000017a9146e5280b8988b683b71a14c8e3480661de3dd9add87054802000000000017a9141483433051a8d1044a7a1bd9215d5d505b782d0e879a4b02000000000017a91433192aeddeda151809cf975d083845ed6e5ceee087d74c0200000000001976a914450908c49112b1494b356bdfbb4ad31e1302f54188acf74e0200000000001976a914b03e25c4a542084b3ede62e37ffd92c43d1618fa88ac3a4f0200000000001976a91447cb62569e8cad086a7ac5e56a871bdc42a5014588ac1355020000000000160014df6d00def95407997d7fa2adb37cb81bf8382d3f185a0200000000001976a914391ac1ce8b041d2d8431b6c0c2c766f0dbf870fe88ac915a0200000000001976a914a4272a1f6e34dfe0967b43bd41162c753f33e62488ace65a02000000000017a9146b9170c2a4590d4eebc2ee85dfa6b16c18e00a79870b600200000000001976a9142b7e4438d90c2db1824f5481f76060a8ec0f5fa788acc0610200000000001976a9143b1af21171373576596abec606bb4260af3ab19088acd9610200000000001976a914633d3ee5a01335511d76456bb9c087083090b10888ac7d670200000000001976a9141e516cbd21f0fa210994224830248256a326932c88ac316c0200000000001976a914e93986a8817f2d65da7c210ea44c60724868101688ac8d6c0200000000001976a9140931f4b726166358700ed1908a4aa41baa9c70cc88acb16c0200000000001976a9149c46060ba2760015173ba1020a51ff434d2140a788ac036d0200000000001976a9141f37a4a1b56a33294d646ad2dfda60441652aee388ac9e6f02000000000017a914ec4f7bca23ca5337a5dbe13189169380a878fcf98759710200000000001976a91432834f0e47e1c93a51a4989c6f4b2bec0ebcb6e888ac8d730200000000001976a91463a616dbc2cb69f0932d811630279a85ac1fe28c88ac057402000000000017a914ebaadf407a63d91ae7be219896ebedfc5d214f75878b770200000000001976a9148704e3a1a87aec06ac37fc4ce4a12219d1b2677f88acf8770200000000001976a914a297cda49216d49bc541fd71e3aa4cdd65e9603388ac817802000000000017a914f981c719149b44935f8b6b9a4625611905cc13ff879e7e0200000000001600142ed0ed37021ad84d43bc04afbbe2ff0693730f493b8002000000000017a914b955a4bd1dd5054b8a613c4ee4702e9e53547541878e820200000000001976a914f754aac4e5c791922de5f69a450a459243af3bbd88ac98820200000000001976a91463195ed8ebab6a24faee0dbf1b42b053c0b5c74d88ac8a8402000000000017a9145042a0c9741e58a034f85730750f09e1ebc41bc687ae860200000000001976a914edc5f28afabcf79196f71c4f4dd8b11138098e2188acd7880200000000001976a91457d54be58fb924a5534b3ed9ba28de4f85b9427488ac208a0200000000001976a91422554911ded86b80d4a72db244887f5d0483e38d88ac6a8c0200000000001976a91452f1ee4f00d764d40ccba93b01b44717ac8a81da88ac9e8c02000000000017a9140b2e3b65edce77b0b9be309f5a77cb79472aac7a87588d02000000000017a914533e46c28871062e3b3d6872bf2064a93736fa6687d98e0200000000001976a914fd9da1c83fa8f344669ae86a1c8af47ec300de9288ac7c8f0200000000001976a914719e93aec6fcb0f81d942100c8f976359a4dab5188ac28910200000000001976a91455c05338bc8ce58c7b3fd9cb098577490724475e88acc79302000000000017a91454ac9a8bde5c4a6e252e6b00b34286811d771cf58701940200000000001976a9149315a5a8437b7fe6cae4a694f5a0f4746bab625088ac8c9402000000000017a914c94f98c88216393d475237f5b8118ad10c18d54887f19702000000000017a9142432eba0ccf5b89bd795f6412516560a1397a5e9872f980200000000001976a91460b1c09ff20a1822971de40c02e67a87bcbae2dd88ac3f9a02000000000017a9143294f4611de1ec2287ea373f3d9abc41ce0e091a87a29a020000000000160014b94d1c7ae3b66e5167b9ee3404fd507b2db14eedc59e0200000000001976a9143eb2db735b1a766a28de7b534a5e60dc34bff72288ac68a00200000000001976a914a865cf25df1c6375160f1736490c03aa99ceb29688ac8aa002000000000017a914b91c0ba947d8523efcd058363192017acd90965e878da00200000000001976a914ae5ba3e1796af95112c4a18ac5c82834078174f988ac52a402000000000017a9149d57699a140d02346ead14dc50103b7b74e035d18784a60200000000001976a9148e6ae62977236ee49dd5d9f4332bb8ff60f2f88d88ace5a60200000000001976a9144da3059db3b631133921fc65bfe5177d93b7baae88ac4da70200000000001976a91412732210aeb88fb834b7c45dc0d05f33b1ce827488acb2a70200000000001976a914c1ec181a99f5bd919aeb8a15855e27977e199a6788ac64ab02000000000017a914f264699303661cc7bf4b38bf07856e696ac626ae87fbb00200000000001600140d0520c73fd170fc251c2017590ec7baa48866ea6ab10200000000001976a914d98255bf6835f65577fbda477575bfc083e492fe88ac38b3020000000000160014bcb7eb897cf95c49dd766253500cbeda8d2f9cdd65b30200000000001976a9146bd4c7565e2ceffe140f6e277b4a4073a441541888ac19b40200000000001976a914ffe80b3cb3e4cfb6d16841f8b76b43b86ab06cab88ac8cb40200000000001976a9148f0a8882e1dba3d4485dd5da0d7abb41cb94cda588ac98b50200000000001600148060e5b5e1fb65d9d30d2a1e1d98ab29bdc0771dc0b5020000000000160014e403b5232706a7d37ed6847d01eb5c4a3d52793d37b60200000000001976a914758fb7d5f0015275c19550726f18b95f2f105e9788ac7fb80200000000001976a9140d131050381c9d218b25db6701fde44541da15e888ac24bb0200000000001976a914c3727efd8810a7c42ee62f3dbd9a0266a62907e788ac53bb02000000000017a9147e2cd924375d7ea5764a7da3d5827512e8a0493e87a6c00200000000001976a9148d523b4aeb8588b3fd0cb2d70bd905546a6683c388ace8c00200000000001976a91437a2cce4264de8106ed6bf56d2e3804b0e4493ff88acb9c50200000000001976a9148c400a1e1db1ada6deea0645056aa090ffdd670588acd2c502000000000017a914e9f5e8f4f40c964950a7f49e60a7bc846b86b55a8715c60200000000001976a9144b14162ccc67b11ccfcd9726ca18d6f9be2c2ee388ac19c60200000000001976a914a59bafbca6ffb492fd225a45b5a8ee817cc6894188acf2cd0200000000001976a914d470b5e5d42499e007c830c30da9c55a6d5e928c88ac74d802000000000017a914ec1263fb3cf746f7fd8a6945ef8663b68c908c168791d802000000000017a9142e647b003ba14bf35f1f883d88517e0aaed45f2987aedb0200000000001976a9148077f24f5d910976dc2c94835bf5675710a859d888ac98de0200000000001976a914070f365f9fdd81df695d6acdd5674f9210e3b0e088acd0de0200000000001976a914f639b3e11f6dc0967489b8d1d6223a8afb4f631288ac67e40200000000001976a914ed4b985f709d84ef0b36dc43baf5a50d219088d388ac23e70200000000001976a91462f84d81169073e7fd299eacd582d24b61268c7388ac56e90200000000001976a914da87c0efdb4c4edb0d7011ef11ce8a9f8b86d34a88ac60eb020000000000160014d575ebbf32d728390b393102b18691f8c72e2ee14cec0200000000001976a914e8c213fa8fd05cd2c890c61b75e2d9cf02cd01f188ac34ef02000000000017a914242a66253d2bfe305963862f2c93de1100e13dde873af10200000000001976a914f83ee9d9c4dfb3b36e344f90a4883db3253257f688ac14f40200000000001976a914cf9fc0094b1849a5749fe266f7501401fa92daee88ac46f50200000000001976a91472497d601a17704e81e4361960ab568853b4495288acbcfa0200000000001976a9146b652e785f3eaeebbdbb3daaa4ddfef09bbe9a3f88ac49ff0200000000001976a91483a94b34970c40f80f43f3806ded3da9c3170d0088acd5070300000000001976a914522fcde76245e90b7b8dae21053cc8a7693863ac88ac83090300000000001976a914885419ee2cec945cfd28dc629e1d46dd0022bfc388ac990b0300000000001976a9148792cd64f5ae3c4149bd538a524e7c5907c8067588ac540c030000000000160014bd7bb404d751f09cacecc9c6c16b19c30dd605bc3d110300000000001976a914c9c887ff7a2e98eca9392a012c32765b0febb15188ac7a110300000000001976a9142a05fff92f00d08db09ce7de73d026528c65572a88ac38150300000000001976a914a3b601bcca4658ac338bef977d9319bee59e803888acd51903000000000017a914a1aa8a7bd780df88dc0480d0a205d847fb71179687bf1a03000000000017a9144ed0faad7de3a0a2825e555c1db5ef3cca7906928720200300000000001976a91467a8226b132a5617339ba45340ee13f856ad29a188aca7220300000000001976a914dcc652ebbc12d73b2e800ac6d267bd6359d50f3d88ac2d2603000000000017a9142f81994c03ece74f52403b5456dc0fd037aa0495876e2e0300000000001976a914d61b6c662034796e56f20b57e1494e03936ede6188ac812f0300000000001976a914ac56e456a558379e732e79d9d22b3e0c2dd99ee588acba2f0300000000001976a914775ff3da016924e625ba54878d3656649724e48188acc8300300000000001976a914f5fc87ee5340bb6577e0b8aaa5b4df9dcb48bf0f88acb4320300000000001976a914cb2619ef7fc85974224147d7776ccc1b83cb5c0f88acc4330300000000001976a914d8630bfdc1da51853fdcb5914beadf4cc872158e88acc73803000000000017a9148158493326c8260759702e26f61049ba9dbd1929875f3c03000000000017a914f3101542d45fa7593f7ec3c26919d3da7ebd4e728754440300000000001976a914cfe2dc1e71d8dd20a4266bc6659df4e4ac616cdd88acda4a030000000000160014b8a6be7fa70626a1238736b34be245d90cc71b8bef4a0300000000001976a9140766c11266a290a46a12bca6ea5bc5cc9e42ad7d88ac9d4e0300000000001976a914160e6632de19a46b193b1fa54a9533e6c1a9f8fc88aced640300000000001976a91415736c665282bfebb899a4896d272989b43a17b088ac2f660300000000001976a914438216a00290fbc1a428d2758d870c8b4e7caf8e88ac8f670300000000001976a91407758be64daf0149e091593d71eb5da4dc80769a88ac636b0300000000001976a9140d5e4d1a0aee07d8bbca7f68751762a8d29bd5ad88ac716d0300000000001976a91448d3a336c129a9e94038aeb52181c20eb957e0c788ac187c0300000000001976a91477192350f195524974741f403c8ca4cb96f7e9b388aca97c030000000000160014f15acbe078d77589de18b6a48401c838a7d2e4046c7f0300000000001976a91422d140c8d047092ed83938d7a0c6c0f15b3b9d7588ac69800300000000001976a914b5fa622b392d44594e217d13b0bdc7465047c28488ac41940300000000001976a9144a1fb3b043225a478eee6eb1e57d7973d65353fb88acd5940300000000001976a914304a33b2c43c2f6c61cc4be3bb86ab9f601d72fb88ac24960300000000001976a914347c3e9b595d2f04f75d03ae5bd2930182e9cdd588ac02970300000000001976a91486d9d5d445dee1a3a6605b40dbe0a014eabbb61c88acef990300000000001976a91490c8282063ebd78e2ffc5b3604ea46be5a327d5588ace1a00300000000001976a9149ca63e14af1899e089d4b08cfad961e7a89cbf0d88aceba10300000000001976a9146eba5973ad9ba60c5b16079dccc811f7734952a088ac5da703000000000017a914287e8f2631882b282f0a08c5ca9883693b11fdec87a5ad0300000000001976a91499e8d77d3dfd8479dba104bd019686b329468f8088ac18ae0300000000001976a9140f330aad8a17fc04ebf4a605def339089187e4d788acb5ae0300000000001976a914843a1a8a24fee092723d4c274f9e6b7268fd62de88acf7ae03000000000017a91413f7cbb3797b3e57176f3662940af8f8c72f24fb87cbbb03000000000017a914d6275d476ef342891987d6403f32df44a5a9818c8756cf03000000000017a914e11956a7bd3bfe9e44221f0aa6fbbb21c5e2e8e68760cf0300000000001976a9149b3f1c7f33baf52a66c4adc9f62e0beb7c896da088ac75cf0300000000001976a914f72479df6bfd0fabb86f90024b4ec3662e660f3e88ac01d10300000000001976a91430d6247ddafb929f32021d5252ec8ae9115f28f188ac54de0300000000001976a9142c706329cda979d79086c1262495babb8042c1c088ac5bdf0300000000001976a914fb1b9c83aaeeb8943b667c64b35e94e357998e8f88acf2e90300000000001976a914e5af0b4dc5968802eef8bf4f6af25e3fe955b3c088ac19ea0300000000001976a9145703474f1c31f327aafe1d8cec829af7f5468e4988ac3ff203000000000017a914855590cf09fa4e2bef92c86948b20405125ed2538766f3030000000000160014ed7f1287353dc523864e20ee8349420fb3fc6d0a91fe0300000000001976a91482146b50880c04c7f6ab6d52170345f4a2bc6c2688ac96fe03000000000017a9146da82990d06d27a337666b5787ad09737d32421087ca0c0400000000001976a914550298d2acb844a336aa72ba559b8d04a6df099788ace70e0400000000001976a914d6f35d7c21fcc36339182f55903d058c9bf7258e88ac58280400000000001976a914bb74352a96e5a5b4a5be17078056504ae358a13188ac03300400000000001976a9141e3460cbc485a3bafe9dc014b36a9ea86eb2398588ac28380400000000001976a914a93a73808485e63a73705c64997f07b828d867a388ac913b0400000000001976a914384d7ab4a6094a08ff4e8b6ebc8abbc3ac3f9f1688ac9e4904000000000017a9143286d556229112051fcc04d80a0f618ba9a67c5387334b0400000000001976a914b96e3ecff27f685fde2e9e2a4b124c73aec20d7188ac9b5304000000000017a914bee9ecf418ab3438d18c46686e5a056ec298f3b887e1550400000000001976a914933bf65f347bfa0067434800984889f5d564c1ba88acee5504000000000017a9147b76766a143b0842fce5d3a171f853f949c974f387eb5c040000000000160014927195c120ff94bdd0548e58bad3d55b3b17428def8c0400000000001976a914b2c8a3f1492b231c89a16c44be784950ef261b4e88ac499004000000000017a914084146a7cc767aa5411b458a3043e857099450a7871d9b0400000000001600142684f8270751469a456567a008f93d6d317ceffb4fa60400000000001976a914e2407a73e0aa0150d7c115bfcf0263a629d3843e88ace5aa0400000000001600149e103352e0930accab881fab09c70a2f6c033d6bf5aa0400000000001976a9140d86ae712ce39049b4413c1f1a743b9280aca11c88aca3ad04000000000017a914ffd869a9622354e14063acca6c620dcd4480a5f1874cb404000000000017a914f4c9d1bd61200a83a28ffaddc3df2e98421b477a879fbb0400000000001976a914c31731ce018ddd59a9acf8ce7137ad0d9e38a6d588ac00c50400000000001976a91480e324969281013f25046041028de5e27e1bfb1e88ac23c90400000000001976a91409ac7d2e5e351a7bb9f1e6f533483d1ac5eca21388acdcca0400000000001976a914e84942c04ef278dc29bd7ce3ea350c60fb696b8488ace5d30400000000001976a914fccf60a317c612c607818b1be3b07d250c7af49b88acb9d80400000000001976a9149c8afae145054e20d89befeac45065e98a709a7088acbfdb0400000000001976a914573014db8d76afd65ccd43e710cf96c64ee861e288ac42dc0400000000001976a914188e0c73d7a5ebea83b38d5dc2857c238b8a745588ac62e20400000000001976a91405cce8a0a13d8bcbdd405d7a36fb6fa28eeb6fd588acd1f50400000000001976a914f10e258487af3448c26c07641b08ab53cbc1887e88ac12fd0400000000001976a9143e9ba32aa0688ea476f8d6e62fdea6fafd0c68db88ac5d0b0500000000001976a91421a42fd58d4c789411f75203d997e1575365d3c588ac560d0500000000001600143569727b8de40b245413fb66c41028f50c8bb4b6ef1805000000000017a914ec60ca994dea35f0138a0747b135b9679755e550876c1c0500000000001976a9147302b052e46e02a0bfa5c1956971b8b65cefe28988ac2a210500000000001976a914e2df08fab5867b25e34a8c9162ca5548d334fe4588ac3e250500000000001976a914168477b97b3f80f53afd668ba450c42c00bb979488ac442f05000000000017a914f80b21e5c3b245002ade430e55898c043201d5d587843b050000000000160014ed65f3b0fd08eeeba208d9ff4c4b5b56326251d5c64505000000000017a9147623d4e7c45588731da2a94c48ecc012f3aa4f5987a54705000000000017a9143287c565427890baf73e1a65113b8f4648a7d252874c4c0500000000001976a91424922347111cc21b8fd3d4254ff612735ede17bb88ac176005000000000017a91437cadf6147122703b7778b867be438fcd3cc0b8687e7630500000000001976a9141742f01848d8265a6765a4bf36bda01fe52f620588ac4a6505000000000017a914d8f32d50c18e6c5ef8ddc3761c22f3c817d8d64487e56705000000000017a91472a9603124bd54b43e882bcf897bb55655a166d7877d6c05000000000017a914a955d8d50ced025827f31c38d0ab93484f3de91a8737730500000000001976a9144688d5217dd2f0bfe626d48248e7875e2402684c88aca29a0500000000001976a914eb9f95583401d3ac5eeef6e25edd9701fa71cad288ac15a40500000000001976a914ba5f0ebcc553e7ac6fcec0b8c11bcdb3940e428b88ac5ec70500000000001976a914b695c33d427716ba065b65189b91e69153cf744288ac7dd50500000000001976a914982ce5da3544933500611b961f4f403162782ccd88ac8aec0500000000001976a914f7a6e8db78fa608ff63ef41a58e55e6f86dee3bf88ace1f705000000000017a9142db486d20d91f3485310dd004e1eaadd7a3fea8b874bff0500000000001976a914ac5f9c581c64f5230b58c0d466363481d322a48488ac0b010600000000001976a914033783d3f3c67e9db805be4c3b3ce2f8c4df4c5988ac2f0406000000000017a9142cff67e152c3c082406162d694b5902d6be80052875e0806000000000017a914378dab1343ed01e949461ea4a6575b88381f4d3087150b0600000000001976a914bd3fab32c88888339fc2aa0c80d82d1a9f40332288ace1300600000000001976a914a0dfd840e9411e574d7576c8e8928d78812903d488ac175c0600000000001976a9143fdc86a707ce04e92d426469ee3fb62646b1845f88ac0d6806000000000017a914c05eea8d916e7bf87657f2277e6e108c495439ad87686b0600000000001976a91400dd4878f29f1cd4c9511a664b60bff209d40e2c88ac37700600000000001976a914bf815f1ae72fee15a6d03fa7dd8e2feeaade22a788ac0b7806000000000017a914f0c7db27b4b4e787fcf6ae41d127b63846019d9e87a78106000000000017a9144f7a14d676ed75a520704440225c11109bceab6787f8b50600000000001976a914e22c5a7f3f3b1f3244f56ab113842cf0ec54b2d088ac22c00600000000001976a914352d5ec31fc5bc97c4c4fe49cffbdf9e03d1bff488ac1fc906000000000017a914440781b5e968ee881a32d0e6b09382e9918752a78749cd0600000000001976a91409a5b67f3eb507bd0d9f7c235710c24feafbe11088acb5d806000000000017a9143a0980621f69d101869a9433707598cf393da20e874a2607000000000017a914fcfaabd3eaaf20863fe93bec2efc6d72375feb1387e13307000000000017a914c156879c50eab1a6f651c50eca3708a56a57b86d87c16d0700000000001976a9141392a00f28cf60c96fdcd90a6a85388a952f901d88acac720700000000001976a91459754c30f906fc7ef084ffac78284c544181caa688ac3cb60700000000001976a9142c0190e32e3e62f05bdabc0e24847e22468f76ab88aca1b807000000000017a9145b0dde6b478304b224f6279b1e30b157e966c1df87ccbf0700000000001976a914588ca945856004ba04ee03d53c6f07c8c5286c1388ac4fd107000000000016001494163da16d468eebbf970a0334e44307c3bcc030afd107000000000017a914a9d0ac1777fedcc17de7805dd685781283ed2ff0875bd80700000000001976a914d4ba62d61b3bfc9b4f694722c0ee2f62d5ed2caa88ac9e3c0800000000001976a914ba769d9656e8065e7c6e8e520c8b8bbd2045882f88ac5e4108000000000017a91435ef0d5761f8384ddf7730d7c13f90799ee8e0e28734440800000000001976a9141a2251821ef48b758035838d03f40031fbfdd83d88acaa610800000000001976a9149788e6445b419637e14537df891ef237d2e6d74988ac088b0800000000001976a91428e9b642c43ed1a44cd13b86d6e1bc3eea5dd37e88ac189a0800000000001976a914f05aebef28c410f9c61fe24c9598ac6f89c0781288ac83b908000000000017a91451cea55be2d84d64c9e80ef0be4340aac5fdecac87c5c70800000000001976a9142edda198075a20e676b6685b047cd6c566a75c6288acc3de08000000000017a914ca8ab7cff91a46d27e80aa9a2c6d26bfd540901787ef120900000000001976a91429172597da212243d1207e75cb71262d2c8583a788ac0428090000000000220020de1a575cfdcc1df6845a7f8cc9d05f3d1394d276debeef67f6e6375dfbf8da4b6a460900000000001976a914af81afc4e49aa17b2ee7b9249edb243adcfc374988acde9209000000000017a9144b3adff7d75f348f0a582c88751e0784fe8f7ff28779ab09000000000017a914062615af41b8be3a34f83d00f30252c3a392c8b18702f60900000000001976a91429777c9539ccd996dd2e2d0cad09da79d21be89488acd91e0a00000000001976a91404111690d82ede20d5a67340be4e91e43569f61188ac8a2b0a00000000001976a91457cafe2e06de1cf598f67ede6d979c003bb29d7688ac61440a000000000017a91462767af7dd80c549dc07589b905956dc1018596687905f0a00000000001976a914e4f72c35fafaa1eec533d7601761199a34ef0c9c88ac2d680a00000000001976a9143c84dd0881e380e300220bebda83e4ed31e3c6cc88ac9dbd0a00000000001976a914fa25c8a1914445919864bf7f95685d0caeb2a5d288aca22d0b00000000001976a9149995dce4861988e2495f473601ad08c07498b05288ac37760b00000000001976a914c878d2b1b13cc2f3fcea363eb6dc3ff3bc75c4e488acd4940b00000000001976a914f084726ee42fd7b4422a5916e1b0795b2799ba2688aca1c60b000000000017a91409335363e0e7a699b7f379ac75473869bc270497870ee60b000000000017a91420b7cae94a681fa31df3e45e67e4ea25377261e987ec3c0c00000000001976a914ac5f9c581c64f5230b58c0d466363481d322a48488ac91530c00000000001976a914bbd61d329a30e7fd9043a5dbfa27531070ecd3a988ac42b20c00000000001976a9142a6589fc2d18a192be7c61b55a9c1dca0211827888ac2dc70c00000000001976a9140d8c661f5d5b84e7693ecb78065afb2ee283806f88ac90cf0c00000000001976a91408adfd83244f21046b0c0e9c15a2489839722ac288acaaf00c00000000001976a91410ac814160df89b0c8a54258c3711eae24ad159288ac1b110d00000000001976a914d72d4045b75964fa36520ea51483ff048c3af78e88ac4ccf0d0000000000160014a1297780871f8aa0c6fd9f5103c3f8e53901796a9edb0d000000000017a914c0142fe1cc79201654a7f3cc83c0cae52336be4e87271c0e000000000017a914514d267a5e66f9f4fe31e169a9d49e4d1484d7bd876a630e00000000001976a914b1cad0df7704dad6ec4d334eb2ff4c2fd0239c4c88ac0ad60e00000000001976a914ab9108624e8afad19e40b0e27d7615bb02c6dca888aca3da0e00000000001976a9147b9f51af1936a5bd87b4b9240e3db7ed7ebdab3388accb710f00000000001600147030f1d25372deec353b883307b87f7b387ff05d7e800f0000000000160014dda2ea0d53345ca0c653002f8b6ab5e020f6f556698a0f00000000001976a914833b0d36ba81b4160d39b78ed65f94b2923cf85488ac21d20f000000000017a914661ecdb980a1ee5b291ef40f4fbe971fe1e602f487c9f110000000000017a9141b6213d953fc753c6718b4a567dc10e5e444180d87284511000000000016001413d351099d471ab1397ef0f52e5146e11584bd9a0048130000000000160014492bc129c96d02138271e00467501bf19adcaf5266b4140000000000160014eb0fa223124bfcd58f743260c798e94113d8c370ad08160000000000160014e24e6273a9e1eefc213bf6159fa1b3a30b0213d5dd2f16000000000017a9143f56432b5cc18a22616013a424cff5ad8726273b870030170000000000160014998130ac4d11fa427c6e4e340b729ae27aab22a946411800000000001976a914975a98cae731ba48b0293b688842cab33b9f3a2e88ac11241900000000001976a9148305ac7e7346e8b518267f9f8a35d2472a09ec6088aca9df1a000000000016001484e8191ae9cfd13045043ff3640c33727cf3819011251c000000000017a91499f56161002842e2b838fdd80fcf03039208d6828794b42000000000001600142e0863d3f876f90d021aea2dcd3f2e8f7c4f861caee5200000000000160014742208935ecddbee5f11fc422bdb805a9b94735707152400000000001976a914a2f8913866eaee66166c5639e8f7a5a6157ca5d788ac13432800000000001976a91492581d67054e8c201d47924e2597040c505657ad88acdb732c00000000001976a91411ee1ffc63af4153235905ebbcf5edabc11fecf888acab272e00000000001976a914eb9605c3a31acbf2a434ac2b259d1f6d2f0f6e7b88ac1d213000000000001976a914fadb60a91c15f64ba46f4db3e98ee17b003e60d488ac34783600000000001976a914ba1cb96786e14da3d0664df4d962771fbfa8925188aca9c43e00000000001600145e8fd79376f2ecfd9b8eca788356fc2c35dd1294d6a04d0000000000160014d0352b5774529578b32ad5c6e60496c0f9ba0f67b4b06900000000001976a9143a1ab9a4bf7db8fc34fac76d6983a846be7230a888ac87c39a00000000001600147e6f8b2cbf01f820eda5091836df5d00d4c604273994ae000000000016001479530dd98be990592b4c57fda9cbf81c3f909b5688aeaf00000000001976a914ddf446d96561df32c98c5c3db80394f283cf982388ac2c03b300000000001976a9143ca04c1f1316d83f7be59af6dcad815ff4c4608f88ac28de0c0100000000160014ddad130bc46a31da741e208985de5a92ab3b60ef02473044022063049ec2c175acfa0fa302e84f11eda715d30de89b06e3cc8f504e2b65ee73680220052d77d9a58637c52f27314bafcc10f5c0dcd254b5054033703b94f4964ba9ca012103f2282e87c0f8ef233dd3db5c49d1561e0706f693b3d0fcce209ad632720d024f02473044022019b0a378d9aaea7cfc1758ca261c5e7ea32a24db07acf405ad17443491d542bf02202181349194911de20abeb43243be422f725549473e2851b6dacf848f41661fd40121038b3ca1b153c88971329374e3617ebaec458548832e666e4d563655557c9638f543a00a000200000000010436578f27848739a57f9e2b3ca8cc51c672789da34934dc9983728ad138a149fe010000006a4730440220441eb3b67a076ab7974a51cefe2ceb6232a945d585271904eaa3b7cc6b3633ab02201d76c8ffb43b819f6cf0bdfb2b9e6c6c7c4554f14f81e8264f9078b4d239f40c012102679a681d9b5bf5c672e0413997762664a17009038674b806bf27dd6b368d9b67feffffff3fb3a4bb1c04cde3f5a8ef6c86e37f97ba49a73991cbcdd2d5cace2216f62fe8010000006a47304402204c54c1e7ddd79477a3d079b6f250a17dbb6f23b6b665fcd635d28847584e617c02203eb0904b473d926b8a7b0561131aa1772822073465ebcfab7210e5bfd501fe30012102679a681d9b5bf5c672e0413997762664a17009038674b806bf27dd6b368d9b67feffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d14300000000feffffffd78042a0463e1a3026b7ab40df0b253b2c8d5b42ecb308753fc7b56795156252000000006b4830450221008e52dd18e2c2767be042e9ae198cc6924a4d65ac1c73987f847e7f5365ddda9c02200e1a03a99f43bd5ae9f5d261f1b888c578041b63ece4051248f144506154e2fe012102679a681d9b5bf5c672e0413997762664a17009038674b806bf27dd6b368d9b67feffffff5052930c00000000001600147aee2735150fc358e7c33307c4935dc604f92d16e1cf00000000000017a914a2a3b79d52b7b8863382017e964ab4c5e6fd45d88708cf00000000000017a914fe3632ed07b200a3674ef5b0674182e63dbcb4ff87b0100200000000001976a914ced0682e5730224787380cf98db7760a88be6af488acd8b797000000000017a914caf0df881198d0585a95aa2a5d382c7659b62b2687979c0a000000000017a91417bb1339a77f9c538f4322ebb1934c1791d01c458798d41000000000001976a914d54370ef64d956155fddf1786861b9e06b329d1d88acd8b797000000000017a914e20c3ee193484d1fd2c8a0dfe1f1dc4d671c696a87d0a108000000000017a91467b33eb974d52c0b4afbe55443801e16fd960cdd87c36f0200000000001976a9141e2c5f7608da8fc3e3703bd201a35b9eb87dc92488ac9edc050000000000160014e199cdc887c0c511e7998aa94ea8d86e4162d21f64d00000000000001976a914be52995e33b6e500fa7a73b9410899b7fea3b1d988ac00e40700000000001976a9141d0f309fb10d1842f83e3cabc2bf732d87257cee88ac0eb20200000000001976a914da636a757c5c12e12c54ef85699c253d4fb352af88ac608222000000000017a9141707c480137a1533b15e14ec0048be953c25dd618784990200000000001976a9141ffc54c47588f1663f2e9112969f2ad5c0c7954688ac8863bd01000000001976a914c7080a2bf93f9f2b98c8aa02856876aee2d0503488acf59218000000000016001444a86f735769e7fa2279c5c18307627736af6ba75a2b0c000000000017a9142612c4bc7af333984a557e52bb843dedb098643487f79c0c00000000001976a914011ed96d6418f83952e1c2598e3d708d770f8a3688ac4adf54000000000016001450fe741e664a8d70f74bf3abada197d16628606ee8fd00000000000017a9141324d21325ed67d9a4f0ce46bdc29ce56024c0948770e90a0000000000160014748bc44fcadf5720941ee6ce5c03a7935a1fdd90443e0a00000000001600142eb465132747f420b8912618aa21d7c0901ba90e02726200000000001600148190856e47d9760e9e766784510a2026b0fcf076bd6d42000000000017a914c992e22be4e24770d0fd7fe023993a5159ec86c28787b9fe020000000017a9146fe721a30d7ca19932a82190914f634982225c5887551508000000000017a9147aebb87fadb1ec83139780844ce30b1b267a114e87e7e61f00000000001600149ba5aca6c4820e57eb07191ebc9c2b13a4bed1ff48ebaa000000000017a914d55f6794216ff1946b55979cbf60b5c270a5c94187288e03000000000016001470f53374f86e8cd4b05b2fb3ac96dd80549fb59a44b49500000000001600147a064fb2f9c35d74f356b731b72c260dff79a5e4402414000000000017a914963e54afc9d373f8770100765efcd937d300212e876a781200000000001600148912549bfa001309efbe4303c58d80ae5e507e26ab200c00000000001976a9141007d860b88bb0709f32987a1786cddad1fbd35188ac33ab09000000000017a914d910283423a68c19d8f49c2a0c9129f1f84aa947876dae030000000000160014854e516735b7b0b80a6f53d1f23267643ff5cd8f86e1bf000000000017a914ffbe424a5f4310ae1ac8bf3a051642c617673a80878a6707000000000017a914aa7c744fadcd76ac9a0d2d54161769d38a7a07a8872998580000000000160014d876986da098d531894072e0115f68efb7eca14afef118000000000017a91427b2e4fb0cace2d3a1b39da3d6ce7c71622d23fe87e6ea2400000000001976a9143e4bd4e4f686c3b41b6dbd27dbc509b1cfd0097a88ac6b475300000000001976a914388fb0634f8f56d4f6602b40fac1494d5a9ac32d88ac8edb06000000000016001434447058bbe0369b5ac43374d10eaba6499095aa98e405000000000017a914656b83f60c62dfebb3da783360975ef93ba4ec5987c5240300000000001600143505890ed97dfc6db5cfd3865ce8cdcee75e10e51d56460000000000160014d24ce9bc709783453c34114b57cc76e53b2eca94acdb0500000000001976a914a0935d65f0e04467be242371441dc23770419c2c88ac989f040000000000160014597d1a8ac8c2f9fa78822a351fc08b39e85e39d17944020000000000160014397aa673aa15e1a05b3c727247151574b7874e8a7837c6110000000017a914a8a628ceccb5286b6cd746e7a71e95f3ad4fb5d8875a29030000000000160014a2354e6060b0ee9f52ff32a2eff702dbe3c009d333d00000000000001976a914843c557d1b5bb3f0b5e37bb1d56d0b59d75167c888ac0e640600000000001600144b26ddafd5c98532a2ca20c70f41130ef5b9fe33b6d00000000000001976a914b3aa4a8d87d4a1ec7ce4fefecdf88150b5663a3a88acc3c91300000000001600142c810c4be90e7ad02875ebe7ae94f3c7e21901b3e0f411000000000017a914754b953ba7300d92c7340edadaac5451ee35f66787a4c72400000000001976a91497e406ab683dbcc7d35cf1569ce36946a8fc4f5d88ac9cedd702000000001976a91452523a7a5c408ec5ee8c1599463a0c40900feac688ac402306000000000017a914993a2b812b913a0033b8f909f70d4de86b06881c87091f3a000000000017a91490be4aaee21030bdd63336f9527446da32f6188487fed504000000000017a914cc431a0e78988213432443945654aa4d89a2201887982e0200000000001600140eeb18875dfba340a1355718b4f215180ee33158664a08000000000017a914c8f767feb7ba630ce54da94740c4319d143aad9a8710be04000000000017a914f8c4eedeb635bdeea2d9c46a8c8893947f723db287dc4d0e000000000017a91434511bdc680b1500238fc2a453ba65be77265a618771581100000000001976a914d439c22e12f8c89f99916d4c75c7365f146e4b4188ac3072ae00000000001976a914ff392751dece9a3d0f51c02d38a492afd912e8b488ac158a0700000000001976a914fbf971d7a4b151d5501af508d611fd62f16d4b9e88acd8187f000000000017a914e647d8cf5fd32c6b3965641c29d309c2c0b1172c871b8305000000000017a9141dfd48b808174de759d0a02a4bdc7ac974b1acb98798630e0000000000160014273556fd519eddb24e405802ad963aedbd47b97f58050b540200000017a9140b70dd85f1cf00691113ee0de7a891da5fd6302587d4d1210000000000160014190ead80682d51021a6fa33f1993013394ea533509601a00000000001976a9148d76d6e58e8efbaa2f2c2164df33f867ca3c8c8e88ac9dd2ff000000000017a914149a1f4a58da75ade497ef33f2d97cab4f7273e48777b43d000000000017a9142a916f580a3992f7c5973c2ac2f9adb2e9505eae87f9ce35000000000016001422a286f55b66fa9af4195efdd972e4aace19cd4698630e00000000001600145714819d85c7d3f7064e2a5aefb3615aac35369d20d910000000000017a914a13e2ffdd028eb81e4e77bdc6b4d47136ec3f3d787000002483045022100a6ae5f1533d1c85c08a0c4c11244468be6a986e0cb42818b52420e5944fc00f3022074f7416c0606fe81dd659ef65642e5cdc173311f925170470f9c3c9cf5b42985012103900be0ceb28a6cf773a6a4f3e82251278738dcb19c67897fd804ea868527473d0049a00a0001000000000101bf9f7c57f599367be30cf3fa614a8cbe7f6455c7ecb86b987515704e7eaba8010100000000ffffffff02c0d8a70000000000160014e36c9ce406d8e91f49e4549c7f39a591a8bbc1700c06080000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220389b9a07d85daf1170572a9a479690d3fa215086d9e4d6a7b3b701b6ed325be002201a5d45277c7530872cacce773f11c6f92b1ec453c02772843710f8df358e303a014730440220335025cd4fe8268a33530d5561893dca632f5e4d343c156416835ea809489bc10220378834f16e6384fadef5c47b254fe8992e587338228ae46bbcd2ecd6f0fba36b016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae000000000100000000010180ecada3c77c63ae434576250692d12524a45cfb0389d03844641673da0bd179010000002322002037205ff40fd9d18e22f545a39dacef8513bebfac0a3e3039165c28f9d4d12496ffffffff027129080000000000160014ae8cde8eb0da5b67dbb63b833be4b8425c12448b0f0a27090000000017a9145382e9cfff425e046ad5c70427f1b152b63c621e870400483045022100874e7a27febfb52169f9d34bb02fd6d09a54e9be7e97455b6dfde8ea73cf9397022010ed7c143b98f40d8fec9f66322105e0d71dd8f5c87b1b67d63f0b29712047e9014730440220370cd6c3e583183bd1cf115987ebd6e144fa401fd4fa384abd6c15cdf5dc83b20220538989cbcd3d95641ff6f0e6f279129fef2c83ec749d52ed677f9d001e9172b701695221038e143e5cdfe85dfa2201eb0a38f09aa700024a8a9711808ead07fc779103d3bf210320d0ef8ab1c32b1fa8170a71185621495c9cb72d461191b05cd3afb46515f8c32102c434d73bfc1e1c027ddde70ef22ed46d3e1d1ce3e8582ba786d27409f0aacc9853ae49a00a0002000000000101b2354b2c6bbe721d035a167fc0f853bf7a67ebe36e32143f964063e1ca8ff5c70000000000ffffffff01d1a20600000000001976a9141e2b8b4a148085251494456a8c4e9dcc8f6c0fbd88ac0247304402206d028579fb306bcee05a44a7c5bb6caea1d7e7b2195771d0a37f7465659701d402205c30877d86426cf5694127009ea5198718c6e04e058794a855816a405beb1c3a012103fa97076a04428b96f746da3a124af796ddad747726d3d8471c4010615f32e8a3000000000100000000010153107d1e3a7efcbb3c04da98a8fed511a28fd7637d9d57fd28c403b1519ed54a0f00000023220020a9b3e204932baded1d27edb2ad78d504f3b6572d22056564f89c135ef1ea298effffffff0118610400000000001976a9147dd3ba90f69799efd83e20a33ee3fd64005bd08b88ac0400483045022100f5ea944c97c7fe05bd0e4acda0fb7d6620909214fcd00222210a01a2a975ebad0220117e2ed8bd5c459366526441887920a1ce592d1af566e0e21ce974d1874f40520147304402201be379ada68c34e5c058882cfeabf9b8134fe949edc6cccf9c2485ee1c09337b022028b18653e5531310b6f12ead6e7e0231e3faa8c82ef7557c7b9cbc16aa4aab700169522102fb8ddda90946cb071f6a4bc6a2747bbb206a7367bd305153baf5f78e87f6b5e02102656d2c55f4e93367619663f3a3583aa93fc96f748419f61ad4eb8793d9db3c342103e4d88ea6d24a595f0e8bed60a0b8464f560ef2c352078ad4f1d448c31ae1b73153ae49a00a000200000000010166af80a61e2a8b5921c7ac1735e58aef025588742b327050dde5b43934c1f65c0100000017160014f2276c0c90849a0194ad8e7aca1ffd93cbf59276ffffffff02c4a40f000000000017a91404d712ec9d063d487540c66a4c7c8f80f482a99287f478fa040000000017a914e13c7ce6c3abac39a15eb96dd18eada1e9ea713b8702473044022017db9a51932b578530ff509fc0d5575db560e951c7cc4d4b4f7efb32600cdb6802205569cd2281f0163f7e6868127914335243a73132d63ba6ba3169ff672bff152f012102f7a3f8538447a3d72275e483e832c112dd89642a2e801bb6d8bcd1e67d7c35800000000001000000000101ec4d035b67ffcd934f53798f6f6ba10f7663ff73189231481011409bcf0c2f3b0100000000ffffffff02de5f02000000000017a91448aae9a0efe8c626a0e129874ccbafbb8c67535887e6d6030000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d040047304402201c4113f15e83f98495f42dad29258e53582295fad29a5f3528db58115ca0efd302202aabb520a892a7ab61a8beee181b7abf80c64088644121c25e4be663aee409090147304402201cc6899edd3527f2f98dcfd1ff4dc51273772d76ac3aa9f0d54549ed6268fdab02205e0004effbc3346bb28a6a736a74e9f64921c8c41bbccd44d9aca0f9d14d37f3016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000010000000001011dac062bd305d19d98d3a25753aea7339e5c27ef0d81204969b8ff7b7451576b0100000000ffffffff0218ad21000000000017a914ee71a6e7acd610232dc08b1d5fab31a0819cb172874915090000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d040047304402206678d8b10c12c17adfb373a8552f1c5b85a6cd8284ab90dc376482ec933b9a9c022040a428a76d45e6708f669c5dda0616254c778da929660ddec13ed1057a8680f60147304402202153c9e48f7c40c7042989a711b4ca4f48b0442c2a4c86f66e03d314f0da6c65022002406ed09e33c28aa1e08472a7e3971b50783f4c025043ec679065a66c53813e016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae0000000002000000000101cd5d3f255252bd379ddee9a09e4f0fc1986f983c7b3db19a1c2f3760bd88b7960100000000ffffffff02ec0e0500000000001976a914e7dbbcc7935c5973f0a9fde4140f92a71843068c88acd2bb2900000000001600143bae0dcbf64a70df21dc733120a770f8bc2ac3a6024730440220175ad894c98bbb5fafb537554536b1a375aa4188472f0be36f64c84b2bd2a4b7022038fb530de50b1fa04937df574c2f1d021caf86ce75dd0970187e0f6570a508b9012103f952d6d96898fca520170a850e921bb9d7b65a7c8ed65749dbc2453513c1904a00000000010000000001016e8f122d4fae4be30fb63806836274f4cd8396cb051457e3d85dea88fc737bc90100000000ffffffff0230570500000000001976a91441cf11cf47063228c4b3b381ec4f021d2f6c1b2288acd11f0e0000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d0400473044022063ee072e7073ad7c3a56000135ea0d43154fc80138e5bb1153c22b9d5e3cbdd902207a1406de083c2d21b8b1c7f6c936567167417b66bf0c739b4270db158ff7c0670147304402206997bda9457181d3c18e634b3cd4c0c9a10dc4b5018dab977c025290dd22a4f902201542c3093a54e11b2573fad5d86dfd0ccfd81912d8e0e00d38ba446a6bcf85d4016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae0000000002000000000104bcedbf2c663f1a8bb27bd47acc1da0b92c2e958f0c0cf3143c9c2aa3717d399d010000006a4730440220380d89e87d84ab1a4b6f991dc76ccd0680f0c651f2087dc41ec6f67cc05cbbae02206a481566a705e700d34f91f06a406829a1c184fe54792b4309efde76dbf069e401210354a717387ef727da545b75b9b8c68706275d0fd52f4465ce8b98533b10a94652ffffffffcd5758c17002025bf2513831e734b17645504881bc94f54f59b6a7b7b87937e9020000006a4730440220122c32557d8c43f6bd2bc488d43f53afc4f0c43bca9c72fcd3ca176cc29fc07f02204d19b40c834a55f2d9ea6dbf7da9f435843d1961630f30aab990fd70226f7cf7012103786af4b32017ec640dba2d2a7e1fd5aa4a231a658e4cbc114d51c031576e19bcffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be412c000000171600144d5d47964bc0e2f9c5528541346ecb93ff371b9affffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be4128000000171600148c329b7b32e5daeea901515703a977b43140057effffffff0256443d0000000000160014eaaf77394221a5f22e733cc7017a2d9200ebe975dbd3bbaa000000001976a914cebb2851a9c7cfe2582c12ecaf7f3ff4383d1dc088ac00000247304402202a0e6afd246e00704257d7bd18ffffa45dd06ea5fcd60274471a858079b1672a02201b342393ace6403eeaf937b66fffb514c11182758480589176fabb84c92257af01210330d84ba8d5edadeee4c6034874de1eeae0a15f28d2d32755e78b8a548aa10fd50247304402203dfac08358b218ab6c7b91a0ff1b5ef04e13e9f542237cb7b840d4bc90a286aa02206666f486fb8086c087db1d552068555564df99ab691397528a30811f174f3fbd012102864954fc14ec43ab44b5fe483170bc3227e2d5eb668f3fe8e128952a0d6a07b400000000020000000001051d7d4e00009cd166963457c0740cdcb9ef70fa3f74a15cfd0e4f1e37065af7940100000017160014caa2f7ea37330035bb15809178342a933278a9e7feffffff6f3344e334640447ced6f09110e438ee24235dc91fe71797427d102eb2977e950100000017160014afcf6b05a16ed251417313263e15286a2d740b8dfeffffff53bb5d5629cda95ede300e6552b8a078eb0b63a242ed98812cbea48b32ff31020000000017160014417c3c266cc1e383221106e5623e777799463872fefffffffe52ae9be2158c922bb9f969488ebde62f809c36a7bd75725d7d41f6705ecfc31600000017160014734eefb20e1992f4e22ebac1e3864104d579054afeffffff7707dc07b6f1268b3889234066e8dc25e1cdb47b9ed5c4a523cafb1b6a3baee00000000000feffffff0190b0ea0b00000000160014704989c7095ffdf66886f4d42c0507461a7121a80247304402203a2e8c725ba0fd90b41d9a9b3c1ec64906d80d24468140a799817dd8b1e9aa50022025d9762ca723da13eb20ad687321df72dc503822ff3b4c30f3d5f68bd3ec1cef0121031c0523297d8d7f5d4584b50c2b0ea38f2b3fb68e496c31b25a215c781561bbf502473044022004e2503469ba1d14c36a9fcb3205de52bbab98ff527247f240d07dcf5682a1250220237ca27e19148fd16c6e3a48b85c1f85e97f5829c12925a554b23cba6b202438012102fd1d41eabf4603be13c28bbeaab6263b162e84c24540c89251c2ebb385d498190247304402204fb221ecef10755b0da1de32614596b49da1d5479392b125ec0615da3978816a022021e5d268ea305d81757974cebd0866667df7e13a3ca559667384ebd008c6d425012102014446cb9817e0d17399490e22192bb50f42aea4de65cffcb35f2fb2fd23e01b0247304402204ef18dfc55f321367ba3ad33c80798bb8dc5a1a7fc64e6dce07ff7e9ee0249300220653738ec6e28a6191bb9e2b65f62caad842b82f8170ac1d127a34241edc7fc8e0121028ba43a00095018151765a6a71b19d1bc63bcde905c7a3a8b037916eaaadb1c3b0247304402201f9fc093d8658c104f3c1918439ec2827d30441dfdf4008382ba2e7fd7471b9c022065a68b37e0c5c636d8d3072dce5b9d8a0511108ac9312114ad8504a3d2724b8901210394d6effc2802d0d0f37b0cc5fcaf5191318c386a90d36ee15c4303aacc5f96b433a00a0002000000000101bdbde8ab5b3bdd52961749999f1990825824e0da02391334f34a7d67b7608de2040000001716001484e8faadbe077334141913e58e0f958620c2cd37ffffffff02b69e2100000000001600142298c629632a36ed177fce910179b419f2e2cde23b570d00000000001600143bae0dcbf64a70df21dc733120a770f8bc2ac3a602473044022005817f92051c757e2a1fcdec738d3c6917cae75fbbed32f8fe3d34fd13b4d98002205fef57722b266b5036d8e82984f123180b1d11ba95bbd561f0b466be7fc876bf012103cf444cec43c6d0a025825ac2875aabccb14acde4af658fc249549a14f03112b6000000000200000000010142430ea75922e3bf46d072ddad883b1d840dbcb71cb3056634194ed3065f5b910300000017160014a2ccc4b8e58c2134bc199ddd31e9df9cb7a7c485ffffffff02586808000000000017a9149c2da6da05cc08f95e5cc232a8fc17cfe311da9f87998d2600000000001600143bae0dcbf64a70df21dc733120a770f8bc2ac3a602473044022062cc3cafeede967cfcab231b06b839b778b14f1048f77ec9ff34be6ab41d33d502207bea1cdf85d343bd3f083077a16c6cdfd52bedf18a81f76931ae9c6f2a39db1d012102db44d6c264582e8d85717bc70db34cecb17703c596a2c43e8a0646f18edc02a900000000010000000001012af8a917584cd42407fe8fb2d335402f0632e8d196145d7ca18af20902a57f7b0100000000ffffffff03089d320000000000160014c934d9ea8a2c7bfae2483ff8f36bb5b3edc7c43a4e0def0b000000001976a914c7b82ffeea2f53231133e358a82d6fe4e46de41788ac32b4b00300000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d0400473044022023cdda12deeb5c80a33d4df1a21069ef94923714c48e6df58564a874f05e399e0220437da16d791189bb3c1364a70a37f5999890672aa1337a2dcf09e68ff31ac21101473044022056652a673de1cdfb7768df16a55fe6586ba374cd8bb135798545d2903545112502204d3d355fdf3b9885bb521ae5f7f1dce06d5e89a6206a3a7ac0ddc713869c0ea6016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae0000000002000000000101d8aaf85d723870fcc2f76c2b73c08508cdb3facf29974e4e652ec7995e86c70c0500000000fdffffff04900f0600000000001976a914fe336f7979270e99b7ddc4ec457ce9c18376ca7988ac003e0d00000000001976a914de24b2f53f78cd5f0bfd90c61a801b4e5ecbc8e588ac09d520000000000017a9148f6ac613d5d2b899c8da3ec4e8fd01a115902f6787272b6c1f00000000160014f60834ef165253c571b11ce9fa74e46692fc5ec102483045022100e0359a557e57e31d3316435959b52b6683079f5a175f59c02fbc7db07a0f238702207897ad4d66e20b17199a6599a1bfe9aafdca1498ea58491726182fcf75542e820121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea28600000000020000000001015d755b0ee0a8d0d108e1f4bf349dc929d56e21390197736683b94615e46252ed0400000000fdffffff0520e63a0000000000160014a16fa4063ef239f55e8ace54a38542ebe697b518b01e0400000000001976a914bb7bbde09fab28ca44859444f2ee20942c86ed0c88acba5c1300000000001976a914d302c6beac9f5930bf1c7a0549d0e8ffcd47c88088ac80f52000000000001976a914c6f57031b8bd6d36c00f1dc45065db73ee623c5a88ac68b7882800000000160014f60834ef165253c571b11ce9fa74e46692fc5ec102483045022100c7556a49dad20b3ce46ce192efcc842771497731b4da035db798f50940fe00c902204dc9857d207d80192c54be5ca343c5cbe53dad3e9c08f06dfc30c37cc8e78b280121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea28600000000020000000001016e7c0b3093af46d3b149c0d829f57d2efc1a5d8ecc0f5443983a5da44c983a160400000000fdffffff0640f15a00000000001976a9140832ce694ca91765bb6624fdfe42507f024461c288ac98bd2c00000000001976a91475e44ead420603ee8eb2fb3129837bc1529f968188ace88a2800000000001976a914d2a1e068a2a5acb9a2b4e1d23f9b6642c9958cbd88acb0c412000000000017a9148e52d561db36bd51ee2434f02d1d16b8ce42c06487808b0800000000001976a91487a6de414400cc444dd3ab08a5d4c998ea59145888ac49a2a30100000000160014f60834ef165253c571b11ce9fa74e46692fc5ec1024830450221008e46816b571d95391756a52cb7cf0ecee79b75943448ebaad4ccb85f30baad740220648e91ccc7549800dd4d3c32a77fdf6eedca34d3949a4af2828351c0e872396c0121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea2860000000002000000000101d3184ed3998de34567e10f62706e792be3cab457b9e510462a401aa0884010110300000000fdffffff09a2c70400000000001976a914304a7363f95a740acd8b38f35388f238c5cdf04f88ac81cf26000000000017a914760bc9dcd34eec2a4e03eb67119f6f33fb3115b68793110800000000001976a914568db02e9c77c63c599d5dcd6600f31a56c3504a88ac900204000000000017a9147658974ccd812cbc09ed9f970dd214c1e89c61e987b01e0400000000001976a91495e71d625dc9510eca1f7a966ebf5195202da2c488acd06c0400000000001976a914ed79233c393abb845b2ff3b13b333fa7f19e946d88ace1ff0e000000000017a9145ce377bf850a5e4e00b38f1a834d127d6762705e8740d10c00000000001976a914be1d05cca46461a7e16986245797584bee0857b088ac433d4f3500000000160014f60834ef165253c571b11ce9fa74e46692fc5ec10248304502210095d448d56e703933bf7f6dc74675210f9c843561a47ebb15e60661dc07e7e4cc022054c7ddc4c40c2ae2f46a96fb9d51209fa8f7c47396c13023f3b3d9c6e03305990121026e5628506ecd33242e5ceb5fdafe4d3066b5c0f159b3c05a621ef65f177ea286000000000100000001922cbbdaa76e21edb496639686e49918f17493fea03de85c1808ca414330bc2e010000008a473044022060d8c134818d1da83a299ada1bd4658905eca2cc7c095571f12f08551374d82602203fd3fa1b7861ae6eac07e1bc777d6a64153d00ebe581690a9db9bf8db79677a601410471a501557ead06cdf048f80dc80e0516bf1bdd7b91d5d5e04b857a62d32a330d575d9fd0bfd7a8458ee4e9e00490077f2b7d4c4fe061dd4c17c4e4ad982ba91fffffffff02538326000000000017a91451e23c289b0254c8e0b33944307b48c096df91a787b1c49f0e000000001976a914746729443d0a2f44baa00d7332e864f9a57cff3688ac000000000100000001867d8c4288eb21b506b8467705fc9b3a0e90bbfc5287082bd5e4e98aa566f63d010000008b483045022100c5686858676387ac5e6fa971ecc16657749820152300237537b5a043a8e4838a0220066d93513f8d75442d13bf75fd9ea8e023e050c7afeea318bc68c45b2ac3ff3c0141049ed7987c82d4d685165b19d546e11bec20a503278deac4947a7c9bf77aa53e6b83572170d8fe901b90ffd3c58a1cf70db09f450f6c95d9c5dfb1c4f460feb252ffffffff029253a603000000001600142e4696cb4efd9af304eaa76d0ec04ae6268c8e35e356d21a010000001976a914e73caa467bfbec57ea9d32d21fd2fc73e5b144db88ac0000000002000000018aae0104e5e67f65f3f0475903d157b9aa2e96f8ecaa58db59c9a5ca1e5598cb000000006b483045022100d254d4f58ef5b790551ded1bdfe466b3e27187b2cd9c8449dc29c846ce4471da0220397f29e666f44c9338b036530ef4db4c48d8f981b76be34d36ba187869f6413f01210399e27865c2d146e8d91aa21bde2ad7e35f7efb9a5ae479552bd6c6382e60ce69fdffffff013d925501000000001976a9146945a4368f2c24025ae9a23534e0f4aa4a6dda4088ac0000000001000000000102ad59ca550eefd52178783d29b327f64b455cd684eaf65fd400b86096f398a6cf010000002322002096fcf6f954ca062a60390d53cc000f301592c8c3298686d679d9ba6df0b97113ffffffff3b29a6cdd8cca3c89716612d6a8e5d460994382b834e0cef0f3b420a9c51b27b0100000023220020af51c28dd0564e18c2a41e8d61c33d213398e5ec8dac1a7392d6424d8e040184ffffffff028d150c010000000017a9140553485d8abc3c7801e5304c4974b6d85934412a872087b200000000001976a91434bfea8eecc14529c9b2ebaebd9e18d54e9ac96088ac04004730440220776e4a5476fbf14c2f74bf8dbad1c9795c3195aba9448a2eb7d3c373e5db7ab40220046b31188f6460726daca647f1dbd1d14cf1fc82eb7278257ecbdeb503502e220147304402200ab0ee3b57838c6a80aa278335d4a31f3bdcc8fa8c26fb71caa038e10ed8ae6702200c2c77da3c06af6fc81ed39065cc08ae4383a9ca2c722d06b9de025cf7cd18540169522103a7d5a04da4c3edc97d82a6f7807477f9eca741b3891c4fdf48b60590d58fb81b210234f27d9db08db9e7d795482fd62a9721e18db8eccb3a86103f2f904afc18fdbc21026391ea987f2d9df99cb950568957430ef2c5d7c214c2f97828e08390f42c2af253ae0400473044022053c4ccff1fa30b3ddcc6bc4227e8f16c7851bc481c57024f0fef841ee4c4a3200220741724e89cee0e38736b77a529d5cb5efe37dd4ccd95c601c16f3cf8e6183b0a014730440220269b15db3913dd2d492e12bcef77405f9acb56fc39f98effbeffe690a2f3b9c802200dfd87d64a8dfd7a3be2723e263ce5669ad0c73ed91259539ece6edf2ede79e4016952210323956004a1a066f5d82ee6bd9529afb8a8e665788d12d4983884e159806ed4b12102875506ac7145e4f478b6b49a798b8de21b9ad9ae864fcefc897343f0932b72b821038d05931d4b0d4686a9f9dd6c3d1f72e6764d4fc9d0332a90ce3e9fd36eee0be553ae000000000200000000010144f62bc350ec06328f2d9cc495d504b2c30909002c0f2a007353f6fa1c27762f0000000000fdffffff02e8a2060000000000160014c2da901a7482e87d1a1bc680822a60449e9aaae7eb6400000000000017a9146fec08d6a8187e8b6e11d2dd7950392b0917f8f88702473044022005ef3bcd5a49788d5fdce3c59f0cdf9204cda4b20fb765e46a93872011b09bf3022028670dbb3593604e6735eea9fd57cb6b6e286d2e775188277b4327d9e497be6901210356b5fb8f3981c180ef83f4427e99156b52580daf7ebd3a86189738075ed1e8180000000001000000000102e303de16a21875091a01c0a2a27f4274db52f87b00e59b5ec4ffeb961ef4b3280000000000ffffffffcdf534788eeae0f52d8460fcd8c22c8a006e73c26ad8798a600265940e99d7b80000000000ffffffff0187a5010d0000000016001408162a8ea44f38cc706229bcbdab22504a28c9fa02483045022100a859a42b8944abb7b87f7fd8081cefbd517dc72578bc12edc5e6a488d0c0823002207677b04725d57506fb0a60197f3801983a388d48149d8340f86006897c7846c50121028e52958648ee79f16a181be180ddbe92433e218cb1953db67f217021b56a46120248304502210089ade5be538d126cddc2b7033b711cd5250cff17591cbbcf4240989d1e99c83a02207f40aed0db2186b6b4c28d49706f21ba8ac3228ea289f5314ab3465e2825f2f40121028e52958648ee79f16a181be180ddbe92433e218cb1953db67f217021b56a4612000000000200000001e2e07959f32c6df94bc3440f790c31d5961816132c3e897930eb639e54f229df000000006b4830450221009e8956a94960accee69aa8448973d95c29f869f41665dd43f58d889c4b74ffc2022001c56184fb7b4ac2906a736b48e822ea80714aa84c81aef2d70f2261213ba191012102b5898dfd2f24c7516ad2db78f116a93e1c278f06f683cb84a51da2a532efbe65ffffffff02801a0600000000001976a914678649609ce22070769ef28bea4979d2c03a8b7d88acead80000000000001976a914e3c82ac4f166bd5078cb89e8f9c61c6297cf5d9288ac000000000100000001864dfa44a2e12eb6b97800fd7a1f73d55104eda6323cc73d1f4978064798fce7030000006b483045022100d9f4e57cc658cd0dd3edbaa290c912d86341f572feafa89be4d801b52dce8b1a02200d5701bb1d9ae728a24ababeeb01dfe3dc03f1091906563915a7b3ff8918a50101210229701969946ca7ac28d36dc19df6995e0921005a85afb9683b8e0a19857bc2c9fdffffff040000000000000000536a4c5058325bb74a32f7722cbd9208d8f52faf216e2fcd3414758a67ff88faa902612495275292bff891b294d6004d49ba49402ba98549a565beadb0df28bbb901782214d83f000aa04900dc000a89f3005803400d03000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87400d03000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d870ab4280e000000001976a914e93c2d0a87c2fd559255b8e08da7c114d431add688ac0000000001000000013c19a4c875c4bab3ac4eed79f9a9431ddfbe12943ca8da783ad036c3adbd7726000000006a473044022005d2b49ac5446bdef62401c45270ed2283699a9ee5c0d19bfcd4c30c9e23eb4f0220152bbe382662995e2ca5c98683e90aac51e4d0c33066b480104b2aa48e0284c601210292e041b7e52685bf5bf8ac33b3dbfdd8a398bda81a3d0361559e5e8b83faf58ff0ffffff02a5e3700100000000160014e3d2de18214c300d91367fd4eb3cacbc386fabf41e300c000000000017a9147623a6508a8f6008e6bb818d27f49d0430932b1087000000000100000002228b6c478784a2f4dbe586bf9d9aeb1d4aba4a9ebe4fa84f07d0de866c4abe94070000006a473044022017e256695e47cca574c337e340415e50ee09c319ef86ed3bf607a631daa3adda02202bf38d6894a663de72866dedff0d8c5859b59ac7557eb24194b258e3a93be120012102000f662a978242d43afd72cb31b0397d34103909fcb3c53559cfd231336ddb30f0ffffff254af9bdf9b30abbd1a447f304ff372b87daa582a8ac5eb3bc12b2b23dbfbafa040000006a47304402200dadb611072504488190132eb3c3951125fe679df765765ce0a3d32f7d5cadf202204a4f4f8ac02fa45c10534501b5dd2ae72c9703a898ccef9d5c5eb55952bea6c6012102f3e3f09effeab69ed4e3ffab8889933adfa93c76bfa8304f02b91f8e19091a11f0ffffff0264a6790100000000160014e3d2de18214c300d91367fd4eb3cacbc386fabf46cd415010000000017a9147623a6508a8f6008e6bb818d27f49d0430932b1087000000000100000001202c247df5053b4e91b618e940b4b61a809547b01f8279577003d528f64a7b3f010000008a47304402207e39ed649bab16490ed0e8256af7e3951f3735dd9030c29554aec281c8e2ab7302206f6b9884eef21165b3331a1a701c7f8de17b0b6ca1efd98db0586f163dd3e195014104872b3e9bb3bb84b2e3dc96393f7ba7cb4f58e6ade33ca46e043b8790e914485a5981c41f9209cf02567bec8539eea5423d8d608d88d2afa9e7361ecc545a0e2fffffffff075fc6010000000000160014e6652f92a2292c2b0061d89ab6f49fdd7cf56372196a22000000000017a9149b14dc90412178d626084ddc1a62a6a8333ad20f87734d01000000000017a914e9f82639ade638c1d89f74f0200ad3fab2cedfd887fd281d00000000001976a914cdf56fc93e0bccb763c7a09606e8b8a1d136d38e88ac48ac0000000000001976a9140c86c7de59ccb4262a32f89550c224eb24b723dc88acb5700900000000001976a9144e9c294e8007c197c376e4c33bf2286c6c9ed95e88aca241921c000000001976a9147e82a3aab30a85909b7eac3277a59f9dcc87bafa88ac000000000100000000010145a2911f44264cffbdfc5888a6d084d2f9bbe3065115039ffd106799e01935c70100000000ffffffff0248ee00000000000017a9140020763448eb6ae7d5c414bb832caf0d73e062728746db020000000000160014c7e8f8d7709b1fe8a288a9ff990a1f6a9e6e5b960247304402200b3247d61de1e71fc8c2c8522e7b3fe8f03782db30fc1c6d401a6c98cfdb45cc02202ef8f4bd820f1895435da8bde71648d204774a8c17f734b7de236a293e2a0242012103436a7574f3fd3a497717483dc8e672cdd38b4d9964f5b9989043173859767f1600000000010000000001010b5645e32fe6af894537405e0361e48f73527999b3b5208d1eadf0d828c73f470700000000ffffffff0280fc0a000000000017a9141e9e40508f813cde964a0eed9dbe1407a036374d87ac980c000000000016001491bc1921f90ee35749672454a87c6e9cd1599b8202483045022100c9cc16d844f2f1d8853f630062fe0d7e415b72f2d2a5b7f4b38aec97afda2aa8022007a27198bfbd40598126d9f85ed1345d5769a73fa181eeed10636606708f272301210236275d73c8fb27f3b2e78f25b4399c2a3fb483fd37d464db5587857787371971000000000200000001105fff9587b91d20eeea71c2857bc7bc49a34002ccebae17f40c3070e3db3ba1010000006b483045022100a54f0e753da1fe738d543ed18c291310f117ee42b6127c623404a5986f297e94022043b174bcacde62f5c479a17aef95467504e007099d0d885ca812a55243c53d4b01210325e4e07ca7ba1c8a7b0279277d81675bb07d9c62c69fa019ed0f57781a179e8cffffffff01a7a77802000000001976a91426f2477dcced3a202dffddf23ffac6a3d31d472988ac000000000100000000010b5bb15d52da481b2cf5e5bbca59549d0df79debabbb8e1a3fb1200c74841898a00b00000000ffffffffcad31a3edb37b3a27e0dfef5792be38292ad7f5fe2a4d11be6b9c6c34b7813030000000000ffffffff098a6ba0dc6293c048a657a290d6c04f616ade41c7fa48cfa365de7294fbf3610200000000ffffffffd4e28be769347473714b24c48bced7048a1b75c055831fabe528d185886acef40100000000ffffffff0b871cf6c272bff09313570731789285206ae67f6e43bbcac319817b3e5bbad00300000000ffffffff0fcc569d324d26e6ef02cfbc07c77470a70d6db578402d3ed5aa0c2a6e0532460000000000ffffffff7d65f370af4045bcc37f20a964b42a906f0c6bf9ef85d5e88af49563f6c499ae0100000000ffffffff5ebbf62171116eafcdf284adac75ed560b97f8859216b8e7271fd9351be40dd82d00000000ffffffff59e85bcadefb1afda1a1461e21e694f71c77b7afe5a3632cc504ad4c4523c512340000008b483045022100e5b9b7ef3e361c6e85fae333ada3756b068b55b1e2ea68a123fe382513f666e602203557bff37082511054cd28a8f9f42253191f65c9fcaebd9dfc30e992320cae1e0141040152b1c8752e261ec48fb288f26f41ba1f1c043fbba1ffba5debff1ad86f7734633b9c1c5c480d657b386298f524ba57576770fc170ef9b1824c0baea63a38b9ffffffff4c93bdb3ffc519769a8d93edca0bf2133796a0916daec91f361d64163b0011a40200000000ffffffff457ea8014ae8619eacfec5d540cd48646da162513bea7e451bd10be3cbb051f53f0000008b483045022100e55e0aaef69f75d0009bc0c0b09bbc9fc9ce6b677692ce1e345e8679909f835902202d10f7445a4dd232735e060f65dc9b7527e5f44fc64e5655bcc42b55fba53716014104d1daeb9e4d6d1c8ce70a98ecbce50107bf883dbc70728432de13d4a19171ae139b92af40c2a66f8635f6b7ba3f558e03d3db372b9d5066ddcb59394a043af455ffffffff0b5b0d3800000000002200209a69dea6032c8fbfbabc07d25d735a0ab689dabadf01db20ceed1b952d8b55fcc5bd05000000000022002021af57980932ae0a701265f35210af8114e227269c76fef2d22519197b506773017b430200000000220020416677e0ddcd8d45589207a9d4aa72d3f536380ca546d7faefd7db9ea22b5ce2d8d600000000000017a914e52653056dc45f261b0cc9812afb6fcb2f0810238739480200000000002200206ad0218e54a75526b34f820894b701211bf200914c0adf75d2937dbaf802175d74b44a02000000001600145066af51e71bb49962df50d3c612ac8b2bada998aed2390000000000220020846e369f4f2a4f5f0163fedda69ba0d0a5c6de073845c25989f2cbe60f4a7b0bcc8f600000000000220020a3857b6eb8e5ff500844dd56b497b1ef4f59cfd04f932bddc57991629d5c585b49c7b2000000000017a914cf91fdc57a28cbf9d8c072ca674284ca6cd42a5587f6dc020000000000220020b3a90dc2869ed5a3fdf89f9eb5240070ad285d874289efa3c56017d9bb30b1c27c942649000000001600141e893ddb34dc33de3dca09252fa33f93b0b9e7c902483045022100e0ed663b27e8368ca16fd0b2810b1c85d27f2e6807dc4d2f48a44c2d2724b894022073f097ccb72bfa54679b64d8d443d463be4708b32cff45b5334bfe6186ef9043012102c14161a23c67f14f00a59f5906c7bf084bfa634abf744f76c876986257b9729f02483045022100a2f424b17c7bbf4675be2f8da1deced2a018d2a027063023bd090f5c1d3c41e6022005223d7a6c9c35565604285d800070d49856dec1bb7bc5b2c63dfb94bbd391f4012102c2e772281e6d40f4f8d9b7ce787123b8a0be77223c7f84b2eed0d5ec1ab4421302473044022019c7dda34a6c5357292fef3c90adc4ecf7a9ee177e0a48241f42b933b9b2247b02207bfefb229cd32bea028e4e5d7dd2b4f780f0e5e85fa8e1b435612b93a13de153012103c09f17b1836e14207310f51f85580a587ab136703be6ff51fcf47e20390322e80247304402201cabab50290ff7e88f7338c740e9b56bc56643cbfc8a77bbbb8d90adcf75e87202206b1b05bdd66b2f99f3689da105e552e6c3309411a3f48d71c180d4eb910df1bf012102987a0b137b532d060b5ac564dbd4cb31fb20d3eff43cfb1040962dd80b88ca9702473044022041483c59abf10e69c9b993b8b1cfafdef772463eb65b1aa913628889d6c8506802203364866107b5fd0aed225cca141e0d90019961aec992184151293358744287750121036625c2dfbaa93390bf9edebf7fc261c643c2e5091ef068980e0f8c290b02ad3002473044022032bb505e11066e0e8d479d0879958319b46afab6a37f347f8278d29d7ec7923a022003e0e07063e058fadd51ee3ab5269d9ce87bb77d25bb6bf0c5fb2c6218d081cb0121033953191c66ccde7caaafcdad8ee7f5802f8b9bc64e1ff939d0445c484a14646202483045022100d78964ab0ebc06986671a1d7f731a997f39d9663c86c369934ef93444521410e022037bba4adaa31a9f429a93fd2d6a3f7d899007a26e4465a2a9ac28f0d186834c70121028eb31cad74116ec99d0bd6909919cdd2152a12c658e46e92a90189efdc8433e1024730440220674420eed2c239617072d2fb254d5cc9892b375b6bc60433d01b30494360afa90220035e4262177ef4d19a4b602c6e39c69afa92ac5fac6489ae00527d96215332c5012103c5f22d4e6f787456992bd77ce1572dd65834f75543ef97d4b0d720aafe5e156d00024730440220345ced683a23aded7c12215666355df2769a7aa5988fbabefab96250b73f6f6b0220694e43eeeac7642e9865c59cdfc3a63186c7e57b04f2ccd80809e61852f5aa2d012102e5a978bdb61750f4687776f55238fc9002b294255d3db2ea4fa4cbc32c0e9e00000000000002000000000106429298991ef14a84c0f16687d62dc07a374ca4a021144643cd63ca7b4d85ab840000000017160014ecb7103f6e364b2c376a15d458d60aa22825009bfeffffff993522974f209f4e5c1594a9041e5066e9ef4790d7bdf03892ad8a5766a3a7280000000017160014f25649b67bde932bf3bd27635c506ded6d1bd7c0feffffffbc698551f5c01f1dab329a1a822809a78e74dcf2c91f7dbecd552ef273f7e50d0100000017160014e77ff4b24a2673b8788fe9e2f01013ceb82df04dfeffffffbfbb4612165d4169d4174129587256c3d52782b9c5e635e52b4e720e29dacab2000000001716001412d323467484a46bcfc4555e80ceda8322915aaafeffffffd3113749e9d76dcbea04d373c1feb4184fe4a5c29790fcdcf3ba1324e574da2236000000171600141a10470c7c58d15e434ed37329031a172dfa269efeffffffd996259874f91878866f6afe9fa36f516ebeca7dc90d5e7764beb50f2ca8d0ea1f00000017160014dd4f0ce688d77454ab26266113e8f8e83161145cfeffffff0390ee0e000000000017a9145473b28c52dbfee78d204f19b76925238f6a5cd28780f0fa02000000001976a91452e12577ad1efdc13e6fbdfbd69651b2530805a588ace082c031000000001976a9140126b8777b1f86a5fc4fea98e0a10f31a13cc2fd88ac024730440220214818bfc67e8c02b5fbd5e1c6fbc5837a8f0f3cb493e11f2a102fc011588bec0220561ba4445bae2c27490c25994b97a93a32711270185ab4317c6150a67aaf63d00121032ad42c1c7ab38e02703a3b1f2ede8aa528ea3a58b0f44bb8849797c4e47889b202473044022019eef1e180c127c4f8747368f765d5cddc248e13d189f73d376d370a1ade2adf0220797fa47ecb5bd42c7a7e14a003b79caaef699e89846160d155af48e01e05dd10012103f049c2b8341aff64e32f21a90670315e1db3687adb729973d8e8ec8046d2a09302483045022100ed2a44cc433bed664532d78994680358b5aa7133970a9458bb7fac6ce5e19c1c0220058cdb4185fe72f097059b7893f04dc3402436ba8ccc64a88a3d8bbcf6f4492801210328390e127cbb9668ec01b3820ea4bd66a3848dedf67ef1835acc6a0106af59140247304402206433264188f44ec56f501b0044191fd7936b9f70b5f17aa57fc4cf41b408c91d02203cccdce383a91d6c8e52d7fcb92f8ccf8df906267872dc0ab3df5f17c23059500121025a017ab2eb3d342ba4676b319b2a241b5689685638fcdae7dc0d2cdc0a61b30902483045022100c55769e3f2f1d7c238848a42e92795ef2af58b3256244606f206277e4341e73e02204eb4684086c5ed13a68304e4c16a3b2c78ef06b40c6bb7f38acbba922e62f772012102dbf391aed76c47eac244a9c1e17c4d8cfa1117d0146aff288b31c9ff051b30cc0247304402201fc932d52000053e1fd57420f479df915994e4e8af02f64febc40445577aaa7602206c562cbb4814ce02be7724ce924682f4cf0af2a232d2db7101ca702973f0efdb01210212954b36d059ac9dbb453113fdb1ad4e11bb79c2deb0aa7e34db5cc556466f6749a00a0002000000000101144340b1d1e050b753de59158b9872ae98d078d19b9a0f82f12019e6eed74faf00000000171600140e3860a1013576a9614c1e194e4a997d15e1ca12feffffff025708d3020000000017a914dc5eb206ea09c96491b62a0091ef03138b28fd7787138b74010000000017a91471043a1c9aa1e328a95c656cec8fd73216cc738c870247304402200ed8985f49b5d0d825d4e110d8632f3bfc120389d68173f13881c8f1b76f67cc02205c75b2b7832cd36bdfb6b3fc8eab394969fc032c296b072cdf3417559976dccf012103d3f2ba36a0973465c30155bf06d87d4d3ff974438e4349b7d186055a1e66189449a00a000200000000010148dfc9770a7f2aba20dbbb20f29613a1a3cfb7b42da507d721a755e75ef6b3280100000000feffffff026960fc50000000001600143700539bdb3fc5e9d3d09cb443de6dffda7ae57c50bd010000000000160014b6430a008961d1b530f094aebea91e89fc142f520247304402202e842aaa34dc0160e938440d2f043f2f2ac1fa5b30fa18e6ee3ac3699d83684402200eec2c3f2fea05f97e7d69e830965ffe6d7834e9f266f5cfb4d23eae8fe6c5ae012102cd10e987133cb0847fb126f9e4c83bcf78869e9149f44e5c615ea32ee0d3df7649a00a0001000000000102cb59dc6ec9599a709f624abb018e0c8c9d35ba02ccab2eebbfa62d31b18ad7fd0100000000ffffffff4774805915e6ca27fb897927fff7c65b4afe1b239fbcbbd1850a76d1638d94e0030000006b483045022100db304fa0a4ab7d84e18fade72f3139077bc2b20dafa14732dfd216c7684aef690220320469edd1ddba1dad73d84582621609cb218f9c3ae7f0b93215d200c344eedd012103b48a59afd5f770972514dc1b646acb0ee0d53d9d0b38882c3751d19f96991902ffffffff0108310a000000000017a914ffdfa3423864fc36a62e5d1058919dcc4aad1fe3870247304402202713ead9fc95c52776110c08be856ff0126089c9cfd26582a85608a00c4d4904022054bc71da5ac15968b5fb86325d6b8cfb653ec97f6809135ccaf6d134b60037b0012103db733315b01df8320164142b33d5507335af2cfd95abafd26007c3d435087e84000000000001000000011e1776a5d288c68830d888df9a2e59e8ef8f792aa33147589f2902b4df52a306000000008a47304402207a337db50604f81f5f97b66eb41706c366141e46e2b6fa923077ba582c12f51b02200150302413ebc340e79da2b96289b560f733a3ab16319653e4f8396ddbe23d29014104e0ff1a13cbe450814cbe07ca0eb17161d7622c7548e28fe722d91bd75d1a3c743891eb60a6c4cf80fc29fc39e5352d83d528ca11a6d73e0a94d80674af15a503ffffffff02ae3e0100000000001976a91453dce6052e05d0296ebc4c83bd24d0b108affc7988aca2180000000000001976a914f5604765461a2d4710f29ef162dee0b94703dff788ac0000000001000000016da536663ac07e1c221d0b8b4610c18aca776ee7f3fc9887688c13d15f3dc0ff030000006b483045022100871c172d59ba1b0de5ba4715f66abe502dac3e3da252340d381431f64c5df25a02206efad9424469ee8421b4e3127f0c1dc0206e6ea0c49eff16830fe1b4694ff4ab0121022a0160b2ed13b803ddca6f6f04606f56dfadee571d683725c7a58d0ed199de79fdffffff040000000000000000536a4c5058325bf7bc38b0a8c2585d9bb11d419e528b37f175128252f8fd2dd7a070b3b322ef48b94f539b0855bde4c3e2bcb8dd96f5f59b29b0347884e213e0db3bc5d0f28c9b000aa04900dc000a9a73003d03ac7803000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87ac7803000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d876ebc3904000000001976a91470774e661a57865243c066c0e287a018f074992a88ac000000000100000001de11caad92b2dedcc4cccd5afe5932ce30615d1e8aa0d85f7aa62de93ab838c0030000006b483045022100ce3face6704fbba9345da4964d47cbe487291cb957a447189707e5ddfb24cb7e02201960dbffc89b876d3061dd95ad047ba767fc16930911700586f0b88f0f620c0101210215414ea5886d7be87d14e70efd29f5ce91664535e859c715bb07542c3476a345ffffffff02e599790a000000001976a914a43631cc13ad0af2426b3d78c8de20770e58160488ac78720c35000000001976a914ca53b087008b4bcd75e2a7b7fc3d0bd810d777cb88ac000000000100000001e4260e645b19ab296693891814f095d418e89291a080fd917c2082139f409e2a010000006b483045022100cee187bc4c789d575fefcf6eeeb31c3b5a2dd58cc77dda52f0a29c8e91d0481602207436c93e9de2dd09b56869a11bc92d5e276b01345c65827422fea6f4345fe93001210247d208883b268795c11439fa52738404a368d90be27233152115d9808e865650ffffffff02965e0300000000001976a91440d6d7cd7b7471602f71e92cbd5a6624895e4d6188ac11d50300000000001976a914d5c352551e80fdae0e2a7cd29b5063839e32688488ac000000000100000001be36e9737b44f09797f53be23fa2a121659d32981be89b68a83782a19f5c0ced030000006a473044022072762221c4e7dbae12a32df0ff6064c413adbdfa53cb3187d265b6c0528c07920220025dc043761f4e4e3a2408dd74fe128808ebfa5a56852969af8221e798202d32012103e356007964fc225a44c38352899c41e6293a97f8d8115998ae7e97184704c092fdffffff040000000000000000536a4c5058325be2823ba3ea668e45e8ec47b03f855df9d0678fcbf0e5d3e77a9285a3ef272ee664298447bf523b6b9984569446305c47c0fdc9745fb06ac2b4e413e3b858632d000aa04900dc000a99d400cf0344b303000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e8744b303000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d8752092b05000000001976a914b00de0cc7b5e518f7d1e43d6e5ecbd52e0cd0c2f88ac0000000001000000000101e5dc046e2d96bb11d5efafac8b560952355456f2cdf6570a2110b067f3d270440000000000ffffffff03d9c90b00000000001600147c6085316a8bbe19056513e28638f6f4a7b85693d7f2010000000000160014b4ad7476fa61500454e5a877b54dcc77a2c00473ea32130000000000160014208cde5426ac88743af891d420b3c015d987a59c0247304402201216316863430268cda894ce1ade7e8eeb8a46ad767dc8fbaa70d15daf407ce802202f477ec56c54293af824098bc2b80ba682508668b883d0513f21ffe20bd9b48e0121020083b438ba636d30c3da6bbd73e6279438d4f987b6ebac9b32893f8e550f78db0000000001000000000101bb3bd1fa722e16d79b5fbd5351cd0341a15a49b6fc092bba065043c0666975070200000023220020108e3f3fffcaad61d587a4c42ab1463d75d98b644d1cd7d4611cd38f647fbfedffffffff02895d1c00000000001976a91420321b5afb0614a370eb2c008443bc4d449f20b988ac7021980e0000000017a9144debbb48393beb2510923d3b7513a2a78416d68587040047304402204ad74d67f53738cf68507ec222d00a84f1b0f85bf1337daf7c080c09634a976f02202d47d4cc2ba13e280660cf372a837bd21c5d8258f31a04d69cf78df611917f2d0147304402201a64d2089ed2c77bf638684ca74b05fa0bf203e3542981a429c4a59388e0cd3e022035471e8d07bff4eb1b2c606a7004c328e7177f1fb27315563faca3a833d66f4901475221039bf2f9fbc41885880d451d8eacdad290e003285ec2a8977c16fb7c7bbc9335552103591a8174c64eafe308f89ef561420e6433ebc5865cd258047b26d930ac15baea52ae000000000100000000010186d717312c7e818ecd1ee094c8368001996921c1eddcbadd225d4e9b979e72520200000023220020108e3f3fffcaad61d587a4c42ab1463d75d98b644d1cd7d4611cd38f647fbfedffffffff0299a27800000000001976a91487b3baa9cd4bb3108383dbeac990c961a1af2df888acb25b11050000000017a9144debbb48393beb2510923d3b7513a2a78416d6858704004730440220738d6fee06ff81561cb8fc909c4b5735583fee9ae901b1de4f641686c4159f4e022013e92bfc2148ebfe5ded21a8e1a603aaf3a91fdc6cf07ea89e44b836a980642801483045022100e1a5da0e315b538ea9fd42f1d3a855f83efdca80f0f0508ac27251a73606b88e022051221030edbb5efff0a3948296bbead166c4dc6e90e876eea30f93f59c441e3b01475221039bf2f9fbc41885880d451d8eacdad290e003285ec2a8977c16fb7c7bbc9335552103591a8174c64eafe308f89ef561420e6433ebc5865cd258047b26d930ac15baea52ae000000000100000000010129deca7984b32b3f2cd0968b0790491c87ce50790a5cf8fd7e1c1bf04e819fea0100000000ffffffff02503403000000000017a9147f855afdd9d204f498c8538e19a84ff924fc356d870234350d000000001600143fc7891da6b56c02a994e493a2d59b6200e68d9e02473044022022b065cf7135e8458a9437ce9f1d0fde504608c9ef94da0375074e6c937558f00220183e86e0f42980c4fce151df4da71d382e9c37e4a7ced4fd3d82046d71df94dc012102604ec25f33232cdd026f693142b745b327dc60fd62278587da001b00caeed06e00000000010000000001012f0ffd94e3738bc4f167d96f57e964da0fdd378d3b5ca5891198aabd1b27c7d10100000000ffffffff0210cecf00000000001600142e5adbc1a0697dacf261ce1d060cb506cef02366e23e650c000000001600143fc7891da6b56c02a994e493a2d59b6200e68d9e02483045022100dbdcababe30b37415a775d29f8e58a86b1b4b23bba4981907cf71b9b84ea8ad8022003d5d95f26523c1a3ffa08b6a2fe8aeb8bd683d7acae99887cc9ad237baf2c72012102604ec25f33232cdd026f693142b745b327dc60fd62278587da001b00caeed06e0000000001000000000101e16d46d7242b7b2b5ccbe7679e9ca6bc80d86ad69e27b9d7d0a21c817dd122a00100000000ffffffff027bdf0c000000000017a914d3af391b4ef828e96ed43d5644a47ae1addaed1b875738580c000000001600143fc7891da6b56c02a994e493a2d59b6200e68d9e02483045022100fba2f00c9bb8a17a1440053ee8ae0941ef5ae6a4e121bbb2d96d9a5dcc475c9b0220138e36d0423c7f8ec15d49dc29086971d8fdfd23516efae8d4ec28249c741ef5012102604ec25f33232cdd026f693142b745b327dc60fd62278587da001b00caeed06e00000000010000000107290c5bb689b961597d794eead29950824fc75f36d0b9c8befe3197591ebb8f030000006b483045022100b3ce3bd0d10220ff70f0fabd83aa25ed5917f25d337ca6e6259ec6e984d0fd1b02205435dee9043496ed70f67356c0b88f6980b3f82891bf374d9b771cdb5af601c601210382014c3eae02b96c6550bf7d39e96b632a14aa19677b6ccab346862ebeb35a16fdffffff040000000000000000536a4c5058325b58a1402e4b0742caa919b45b1f3713f42cbf688461fa2e3481f2f3e237299a22943618088c4a68a721973b7113462ad4e2b1725fda3459f5323a49b2b5433d44000aa04900dc000a9a8e002703d84703000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87d84703000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d8702ee2304000000001976a914017ecc206ade573154183bb70dd2521b5fbc7b7088ac0000000001000000000102058e365f131a15d7967daf6244a07bcf7e9d08b71574168b34462fd5078e3fb20100000000ffffffff3166a5232d61462627a86bd73e6e74f1b302c3874a5138d4733602745a621ae9010000006b483045022100f4fc589932ba924f8017398029cb4c542018e7940aa2a92520a4dab9bb02848f02203f6ee6b4a30c42ca04a4b7c41d2c3218cf8b5407ec6bee888e238326b7adf8bc012103c6304a6440e5d0dcc8b5d40bb8337b85de3f7ca935e9f5d5cb20d4413b2418cbffffffff02a1b050010000000017a9147f36fd406882bc1b6b0f0093bce323719ea4f20c87aa0700000000000016001472783e4be129d2dd0c13dde2a98670391b81fd2802483045022100ddae54b700b30148b55378023e64a881a75c3f1fa0d1b379b1db828659499059022052f320a11cdd8307ca4c4b4ee6f1c5275ea77985d9cb8c509349656eeef3aa7401210397f94dd42d27a025dfd8c0cbb5efbc771556b0220c73980f54cdaa56f7465b980000000000010000000001018f3900f866e9277b51eff56c4ae3f5fa6e0c5c76a30d7cbccdf47b3321cc465901000000000000000002d31207000000000017a914af3470d629eaf466e32341a62b8d2a43c72941db87deb9040000000000160014141b7f89898760463f34aec12538cf440354e63f0247304402207a1fd4c6f43177ec9d599da15c169a84208b87ac06094e08b673445c2492cf0f02207fa4f4d9c52139ce65b8a7eaea4678df48f2e231e205effbbc1fca5f90a875b1012103458e230728cbc8e1f30be734d72327632adcf00076a61f4f09baa317dbfdd32400000000020000000001017bf95daa75a427324f9f96e5ee966e3ce502ecc7c27b2e2e08a1badae6d03ca30100000017160014a7020bd48de60d443c2a39b4cfb6541d98b9b9e0ffffffff026d4e13000000000017a9140a7c50aff41eadc303328001eef22d82715052b087ec172f410000000017a914e53342806c9ab022499f131b727e57b070c813eb870247304402203644af560a7633da791197d6d299e7548749e751068932faa31d5fdc41896aeb022039bfde67597769ac13dc03628e917377f21a0d1e566d9a0772c9b86e02fec86a01210303bcb5ac76066c50212d6b657cd1fddc5a088a711b96e1292571ac731dd94af0000000000200000001030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee1020000006b483045022100b63f0375eb19e024920ed8c44b4865549e591247e574f55be403f5ceceb4a50202202e3c7fffbf9cc457b4528b6ec43d82ea633303139966aeaf58e815a7ffb37d5b01210278953a08a144fca8942eb907f9f22159b209c4175869a5dee6b0b503cdfaf9cbffffffff01600b02000000000017a9144a0700f66486a13c3821c38903c3af0d7bbb82898700000000020000000132d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223f0000006a47304402200b2b5cea3a847f3d29a3e34ea93a00365971ce535cfbdcd669298d42816647eb022021a9697817fdbe620bb25f94142ed456617aeb5b7192fcc798d415216c974e87012102255e014e041c089aa7b4554bcd230db86b8b63a089c2d9c2fe8829303bbb0b7affffffff0190c90000000000001976a914e389e904f0e68838479ebfed594eac60c486b76488ac00000000020000000001028aeacfbf3132f956d022f765c7b8020a0af81e45c8cb7dd58b4ba67e50e2fc4e0100000017160014be81b1080b9ccfedb1be0582d9d84c695851388cfefffffff1ff27510d5f43fb51b933ecd68cc92cf3925a73b0aca4a48e71a037ca3b431f01000000171600146bd2b0134aaaabce2dbe798972e4a2530388639afeffffff017e9210000000000017a914d8c4d222ce7127babd94efaf521971754bff6ebc8702473044022051ed7d8332fac1f499f6263d3bae37b880b576380405813f430be87d52797fdc02206a2c73c765381ae17092617e7e1481324cb7d47ce9e40452b5e220527aa4bcda012103e58a37e6664c7ffe497dbf0eb1b475a2bed45c76b2f9e2a04a6f0959f509aff0024730440220015c159bf0bea366f55974771097dc292801f4e74f20d1904f81f6fc25d8daec0220481a89afe1abd1739407e4b72f3c7e8cda3fd6cee547cb525d2f2c9787534d93012103ebaf7f65434003ddee4a4a0f7b33ef5320b8b78285524dcc8f83d168b92160ac48a00a0001000000000101d0e9c4fa359a49a6b6ca71ba6c131fda0a49a8c107bd3660ab7ce59e673c25ca010000002322002061f85fbbb807e177ba7d899465242bd1652e6ea04f2cba1ff7df565e975a94caffffffff02c9556400000000001976a91493f0a07d1bb90a33dcc9a7623a7cd12964972ffb88ac456335000000000017a914f9bba19d98bf753d61c5d5a12783541787dd1d92870400473044022024951d0daf1f869692214ed41314510e146095528f06cf4e2db4fa77a762331102206db867794df78711c9bfc5656fbca85d112917ce38c39fbcdc93acc6fe73903c014730440220020e7ac7264df57f1295c09c401cb5fc7659271bd85daa9130725825acd8aef5022046e674218a529aa6e9f6c720560f402025c92490f55212ea5646091e84dfe63a01475221032199236c3efb9bb36b73f3bb1a141068f35d0ae8dad8ee0257e88caac0f3943a2103a3af0f49a21d29106ebeef9b3c3d69fc375c856a7153d97156a5b7a161ca6c2552ae000000000200000000010676fb923eae5b157547c66422bb3e15f400aa48d19f8080c501e5138e0c30aab800000000171600149b3d427e3d6a1b55a55b5f79b91197affe6219b9feffffff7adcb6c842ea4eac2c0c0aac1848d897398a815581c912f98d2860b4132411c40700000017160014a0f1909f73a9f92b433cd4be7e00538acde389bdfeffffffe6b7ba7c0118818908256e0ab0ee67b3826fbe60af614813dec43c84f66152f00100000017160014f19ec93ececd8fe8c80983d8b44f78d631fe4930feffffff2b22bf14b00b402b8f6a6336ff813b6a56c865ec07e4494c689e26f666aeeb630100000017160014421e8c5e748d3809482804cd2944c9de78a6eb25feffffff6bb1d6eb9dcae8a431cc90bed2458163edd67ff06d33744607beb585ffe3d00000000000171600142d321217de798aef2622a4ad378380af9d1646b7feffffff7fcca7236bc17c80c14811074b16ebfc00737908ae3a9e0272734bd59987ded30100000017160014dfc85ab48c5765c5d78cac39643cc1e0a24f627dfeffffff01429c6800000000001976a914293b2cc361e765b3f61baf901ddb4335d3eff49188ac02473044022066b11a74247c54cf75a97a9714a2e0c669af8ab5f20a88e8361c80f31c0116da02202d51c94dee065dacade23b3b150807c587b0223b87508c978caf0f94deb364a301210267ef389806d0e4342d5544b2fb2c6280544956c7af88bb30f346bf0ef70fb26d02473044022067348305f48b763e8400360edda4f72b5f74cf764af2ea3f37dc8bc6d7215c76022037f9d6c8680832db908cd557fc7c3ce4816e507f17e121d2d1935a956df19de301210289c863cd5c496283b925ccbbdc5f2053aadfa040906d313433c24dddf2a96fac024730440220194a7691108ce72b527abb1de2a390dc3a4fc30decf9f7568dfd3288c75912c502204c947288002f74082de1bc779b04b5c7ffcfe34f02a641f14fbaccdfcd3e1fdf012102927f89ead713437dcd31d8d48e0f611e7e4cb68a9b6e0a94d680dc44aa2a58f602473044022002f8c70e3933abd2574fa00d54598becac4bdbb9add4ce6895ca972cad01988102206a1fe767b8e1ffed6d37199b5e89cc9a390df6814deb86f700b19058f1d0b6ee012102649e35b84a45e23456b5629601ea0a63733fa4b4f6f58d9fd2df6f67174bee2e0247304402202beadfced2aafb52bbb939ea51297d620b0de2c45eb1c67c91cb193ba1362787022054ce4248839ce705274d9bc26f2b61b39019d04fb3835c3b86d96b1f948a866e01210392b28de51d20879cfa092818471be85367369310ae2daecd41027df6e8cb52ac0247304402202a79c4abd7d40f9ee360e42c03fdeee04a2972c483c323ca672e16477eb85d8602203175a653cf1ba35b1490b0be2b8b15041fb3c878828245675e137e2710a76f3e01210399a277d253a2651490fcb3b7bfca44831a397955593db413dd6e3d0c76ffe2f648a00a0001000000011aebc9c39dd69f3ffce2deb56ea198da7a5c24995fa501fa4820a283d77702ef000000006b483045022100d7a643f5c4b1692bd48fc471c53c326a6e8138475a0b86537c1219172c66b068022067a8deb705c0529b75de132af828f1c55a354ecec612f71c254499bb4d6a7770812103a0a3366223098257fe99718a5ca6fc96558eedc3e99b8fcfd81ead4ace25421dffffffff01c9d80700000000001976a91443eedc666a629137d7ab93f4978806ff4359aba188ac000000000100000000010167969eff9d6fdf0eba187b6639173b9436cf6fdcd0ccd3adb76a27039b789fa30000000000ffffffff01eb39050000000000160014208cde5426ac88743af891d420b3c015d987a59c0247304402204589d310c3aee04920f336d9d712b00489388720049ebb61dbf8785aa542b8fb022069f3d9ed8146c427a17920df18d2ad4e663a9c964a0d667201694a2e17a28144012102914cf318535f2300ded3f82a090e77ae825c31b8739069e3ee20cfd89dafd007000000000100000000010168e325c9c7d299ef4a74c1a8ef3b42a247927df72132f5838d11958b54d4e330010000002322002069ca16a8a73c9519b3009f6d79cf24c40babfcf1119b78f7df2a4791a3b0b57fffffffff01c2fb02000000000017a91419e8f3ab2e4f11526b08f170b381924a327248988704004730440220011ad8cbd188089ca4c916468cd6e8a006339dbeb850c65638afb55a30308e740220476378e8f6647a0241016b672d74243f36084f91f8c4081abbe6d0d9361d68c40147304402204bf58744150c6c14d24bb28696cba8c5a80ae8d4df50a9764ed2928830bd998602206dee8100f7ed23a8c1f83bca95eb030f5b023c4bac2308c3a8d2ab1d14141b530147522103fc6bdda539afef6677b641783ab40fc7bac3e8d6a9529e76ba82413fb17ccb9321022ce1aad322a2a6012996ff109aabdc16ec611b3d454426d3799bca6cb6af4ea052ae000000000200000001f287f2a497a0a4cef21f6fe7e1fa90360c75cd73fbbfa93b61690d561fd21472070000006b4830450221009182548138287f61da4ac2efc5c7beb36fd3fed9f1041e0fc2871600143a9f2d022077670f70d5ec67a5410f01d2f74c4cff6e24ecae81863cf287b2836ca01032b5012102e80f2944482f1677336a91bed2cdd9ee2a6280e6a6feeedd095a2b151d325f5dffffffff07346d04000000000017a914d6a8c209d6b0b9bbed25bb62ce40faf6da72277787d40607000000000017a9143f0cee58c9627195a0e0f09a02fdf82cfe3542cb87d0df0e00000000001976a91477b88cb85d0d6c24f7f055a5d9ae31cb2c3f559188acaced4700000000001600146cf74949f436347b5a4a420d2fe2c6b6199b431400409c00000000001976a9148819912eed2801afbca0526b1d399521445c5c7c88ac642c01000000000017a91435205f123fbec8ce4d72e517c093b8c41c22d37387ac903555010000001976a914638d5db6dc2fec5d6d2c160c5439c08c952ba1c688ac000000000100000000010850b7580fae7eb4902a21be12b9ec44e14f5b905ae8bc8dff60dcbf4940c2fac74c00000000ffffffff3fdc5cca72b7b95c9ef5192f9427512628fdb9bed88b3b22a4939351c4833a1d4300000000ffffffffa4ef9d9d2d5f41b5a3d9ce09796a619b89042282f2440f1f462ea5c8d00f4f7a2f00000000ffffffff2b08b620735a15726b902afe00ca4513f89cc80a03c342578e31dc4a886626961000000000fffffffffacdbd7756d391c267c23a39ca090bb9cc774548a911972b123b838df5cfb5950400000000fffffffff3ec04534e3917cb5c96b6f68e7daf63c7d7f077305659af49f4f77f6285bcb01a00000000ffffffff3c76a169672d596fe968ec44bce1e8386fe7d1c921e8dcd4e2b5e43603c0b82d0400000000ffffffff2f15543b68e0dc9935594c8eb7b5cba0d90d0e3b81d19fcda1c0ed3bbef5ffad0200000000ffffffff017aa35401000000001976a914803853e8950b611979ed4512fa83678c428e1fda88ac02483045022100f5e09d277dcb680c3d6d70242731046b5fa12a1d20d04280a527fcf701d6fa8002203bdb75df33faf9c11441f91ee2e59de5bd58c31c4f89d575de1b76f3d5431e4d012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a5024830450221008031b293cbefb2edd93a67c3bffdf72a9826d15c091083502284e74c096b46be02203021a3a52b002aa0ed0dafd9dfca1ab23374466570d892b5f4d3cf800d3c3f88012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502483045022100e3e06383936e9f67c4e2d5054c1d178e40d23c4a7e2e501bbdbe42abc23e93e40220744cc4c2aa34d369f36c860d03ab9da379142bec6f6d681221398c1d89dc233a012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502473044022041ad828de5347717f6a03c1593ede454a4f2bbf0ee0479448a0477ba66014c2802205cdc652f3d3e1a8ded515aec0ad0dc5b2347219283bb38bfa079a9c864a075d7012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502483045022100a2cf57d14de6fb454554ab799c0a2619e946de95c1b4a9f8573ebc1303229d6702207ab04459b6432d6e9462888e7b30e77e802b4df9be62063996920986cf2b2b50012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a502473044022060de3e63f03391ab6ded3cd77252a15b99446934be66f2fb91230ee820952d0402203417e323ff8b3f2fdacbf1d5d6aaef06313ed0cd777a5ad3b5ce652d214e627f012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a50247304402204faf1fa008cb21f6fa9fdc6a5d32ec6e1e5d106cbf894ece4a0f117afc6a1ebf02207140bbc6f67f4171c1364c9077f01e0362b21491b297a5359101736e03b5b6b5012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a50247304402207b36faf0e2609244039d586b429215befdfec46e58584a215ee8a874a3cdc29e0220159b64cde21eb1af2693e315635e1783d03bc502ef8de2278ccc5dd162a56734012103739d6684c187c2f2d42d7baeb40771c0ba85ac7eaba81576a970eba4b4c891a500000000020000000001019fb118ad396b0cbf024e810d5809d43d6c56b9ef3ca2ebc0f8e63153f46f534c0000000017160014ae6d1d284bda51f47c416d521da24ee647c889b3ffffffff03f8a101000000000017a914b032afa5e57aaa74cd4e8c4dd1a68f3363d1e160871c8900000000000017a9141ffab88fb2486e22cabcd5b3ee4396e60a289d8c873c190000000000001976a9145589ea1339e5b5eb5c991d20a1b65fc2ae29690988ac024830450221009919279c1b3a67257177e905927af14cd7f0b409b58c2f91152ef7c64ec1e8170220076eabb338f67db1708b6b8e1fdb4c44e560139bfbc836890dbec6f81453f32b01210351e703da110a5f83fb5ebb3ba2d9025c69f26ea5e4a7b58ec878ff8771a070ba0000000002000000000102eacf617b758a56d94287d96df5097c9432330501fa338a4ffd20ef8af46b21130100000000fdffffffe674b0e6461ceb64d18b150099fc121bb9ccf2b1e77d49e6e2a55543affb39880000000000fdffffff02abfa1000000000001976a91465b1fad6c794317fdf4a9fe416d0ae2b9cbecbdb88ac0cda010000000000160014beef5f4cabea388349f41033321128497c461022024730440220436a0f3ffea925b42cb5bc4359bcecc46446cd2575fbfb73a6a8d7b6dcc062ca022063519377b0c85868168ac620b410f1f0ea86d96c2bf04ca9ed988a4c63fa2945012103ee3f9f7e39762c203faf0de38ec3b5ae0ccfa75c8120c2a80bb3473ff5bce8e002473044022050dae63c287abdb4e92cf72db33ce13af8b7b900892320a3a89e11fb01f81a39022035d4713c723b089bacf0ce67bd4c5fdaaee55d2b475c9657172004fffb0c05e9012103562577266744de124734ece230037b0bc30355a5f64c922bf360fab1f998658f0000000002000000000101e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1564400000000fdffffff01191bf20300000000160014e604f9078b3845171f43f3e9613315c33d884dc90247304402204fe2e3ad3317eeed5e0358c9ffaa1a0a72a293dad0b18cd524f88ae7134f19ac02201fbde9949ca4d2df60c4ef1588a00ccaa575e6a7f3e3c08b83837285e5ea1233012102c1bbe9c1f74553fc67eb36a52556db96ff2a98b1ebe29edb8732c12578c3e53200000000020000000001018ab60725d32971d6e0053e481ac7ca61e8fe931768194a6356e4080f51969c600000000000ffffffff01107a07000000000017a914e5cc89959f1601fcb6f05874580bdc0241a7041d8702483045022100be7a85306eb9eb8f847a4286a7c9415219d4c0ab79cfd5d5a3aaffd6063af9fa0220264ba2d0a844d4dc84ce8de37c1d4a4efb967bdeaa31e1e2819dc8f3f709c010012103f6fef207814855ff1f21490075dee22d7ea24286109ba7900f3a585c23360b18000000000200000001aeb2c3edda73556e0bccdb2d73163dc2ae72bc3e66806c2ad30e5a6494e2d8c4000000006a4730440220464671b762943344852d7c0370c1fb04e98b712ada0efbe4bba2695a8364ad75022075cf0d22a08c7ac34606d4a9d353a200f183b457819d5a1d3a9bb230a52d144a0121022852ed258fb5b9004b13851b4d09bfe499ea49b6b81f0b82268a1fd1d13ea1b7e6ffffff01067b5001000000001976a914d098ab47385c466879796a915635e38ffebe822088ac0000000002000000019a6594649010087ef8151f68c4fb5d245491f38aa857820c102602fc90a9e6fb020000006a4730440220703b903060bf81dd27519df6c15bde6b3cfffc5762a7924bca9ef88da3f4a1be0220042eaed4a729b010e126f1939e9a94859423a086442c7616d52f896d5fa4eb0e012102b7323adbe7d3d30537c3c9cebbbf6c6629011c0c0ad57a9559281191f0cd0b03e6ffffff01b0de0700000000001976a914d098ab47385c466879796a915635e38ffebe822088ac000000000200000001b24f781a1c3b72a75f935e098d0d4701391da40fc760bfaa8782df7b51e9cacc000000006a47304402206d525ee04df93a2b267c712ec16080fc58a39b936d08d6f5c0c9fab33dabb95902204a6f85ac547b351bfe2a001e862a2140d437260de46c7763b35d197c2154ba7d0121021dc193c6aba2814b24a66bb4c11cd013aa5bb65cc62085e21a7866eee1b58f8de6ffffff01245a3420000000001976a914d098ab47385c466879796a915635e38ffebe822088ac000000000100000000010165468ff90c4c2e241f4935bce7f76da350ceed5b95a1f1c6ff67c1d39ff8915b0100000023220020108e3f3fffcaad61d587a4c42ab1463d75d98b644d1cd7d4611cd38f647fbfedffffffff0333070300000000001976a914dd202d30af6591552b5b330bf1557686b336833988ac67145f0000000000160014aa782aa48e87f86f8048d5cdfef567f86b2fcd3e37273f050000000017a9144debbb48393beb2510923d3b7513a2a78416d685870400473044022074e77272a7eb9627b9a7282878e31405491ffe85bcb77c9a3a316b7786b7e74b022042e32ccc876d0d8359b9044ed11cff3a293167ae1fcf531d77b43845145879320147304402205a1a5dd32606d43fb698e7e56d3048ae716232cf6e483f4295cc22262950edae022035127706449917b5743ec9288316c6f84dc13b7321d4b12c83fcb4743af4938d01475221039bf2f9fbc41885880d451d8eacdad290e003285ec2a8977c16fb7c7bbc9335552103591a8174c64eafe308f89ef561420e6433ebc5865cd258047b26d930ac15baea52ae0000000002000000000101fb9164ee667a37a7dc62ca901b261d48f8ddd0d730b7e3d9dc97ea82564a1ab8000000001716001402e15f376ae0e51e30fad3b8295c90f7d83758cdfdffffff028e5a0200000000001976a9149e31622a8443c7627ff4cb62ff78ef8ecae39cdb88acc105af000000000017a91431b91da350514ac3380082f62d7ca2550fbe4625870247304402204b31f5f3cccf3cb83aedcfde224c82ed9716dbaadb9c0433381abc56e1ea51d102203e7403d5d536e9eadad5f37dd40312246c841eefd149399bc773ec2eb840a59a012102888424dd5dd27d8644a54471f04823131328b18ca566a5dc4d2ec9b4daff2a4c49a00a00010000000161ec1a37490c662882620e29127e1b6f736b8c7f5d2b5afe4dfb044436550d32000000006a4730440220122b939fdb2cd2e612d6204e9ba261352d1d44a272b4e0ea20758758a6b76b60022013784ad0bb07557b84905cebbf44e41dde91e1d2e0cee76f6cd6535a4b44bf140121038cabec01653d134ba3f5f01bab0ddeb4e2451802dd5bcdacbec4c36a78c45659ffffffff02c0ce0200000000001976a9147d2041e665bb4e4e5afcec1d65fffdd3cc45eb2088acc2790100000000001976a914532f646590e181a4241e91194bd0a60c532e119588ac0000000002000000013efa35e0084780a9bcb4fca45d58a446856510129caf22be1b267b1e3be9341d010000006a4730440220335eba455b3e518326e47e6ba26d8860901bfbaed31964fdf6095beee0d39f50022077a6175d59a39eda0fead62f1f4141d0f130a7fb88c75f703e6389af4b44b49901210381c16409b20b5760b73285005244ec9d9b59016680a6dfcd65984ba8cda4feabfdffffff01dce803000000000017a91418da6fdcd2c981f90032c079bd6210bec4398aaa8700000000020000000001013cbdd31c549db408388650977bca3ea5d4499747b26a7c9f8550fe5550af90b50100000017160014c7adc8699e78beec8f164370456de9e3adea1097feffffff0220a107000000000017a9149562e7dd1a5090dee27960815ccfe52e43ca9785873eb41d000000000017a91433008bd89526a279077329ad28acb72546623a6f8702483045022100c9ee8718428d130568e9a3f0ce3b7cdf96917c7991951fe5993522acdf4815c602205413865e76e780f6cbaa8fc839691adc879b233e0968115626a9f345c33f8b7f012102616b898f6f1357b95f2378b579a411696e7a0c5a97d22fafef6e5e24a029b1010000000002000000000101938edea624d22d168b823d3fbf245aec70d792f4081896d78913c7ad171a26f60100000000feffffff04c0c62d000000000017a914e260c59a74bd682723072eb03071c8c36646e0ed87207d0d000000000017a91470210822feda540b59f70bf729fc290a46b9eedf8753352b000000000017a9145af0d4abec672fbcb8d2d1300e69cba142e2023787c675f00000000000160014bb78ee1b9a15d58e8904bed91f4395e7fee0207d024730440220043b685f6af0d1cb8318a03ac5bb23a707aaba3d00942a09621c76a2d5769e5d0220747b43483f09d47f58b51ae89cdf6c000c9532244a8941662493db4ace364c33012103344c7f099fd478dac4e62eaa6b839c8591fdbd010d542f96b2d572baf1f2d95c49a00a0002000000000102daa2970046686c02560109ac01dd0f3ffb3d952cb7ccc251fcbcbc1e74c857310100000000fdffffffb30d0bb9eea0d3dfff4207b7c25b4382c145dee59c99b00482510e936e46d33b000000006a473044022010259016a86f782bb135d349e07fb639bbecb5b6230e81a7448e7f3ae2ed171f02202b34c1e7506e69d706fa348455ada95d64444f2786d1eec879aa7fa41f0d94eb0121039bc08e28db5de24e9af8884e8317ca461f9c881cb293c04ef47e6d3edb9dcb2dfdffffff026281bd01000000001600140657dfa84726a480596abb44c9dfc6d0847e18550f7e32000000000017a91417ca19043f4072c563f2a5b293f377bd4eb4a8788702473044022059461ca44da830397a2303b2a5d6ce8ff768e397c41a62e3d4891bec35ae5a0e0220169a22b1a84a064ef6fd800ad39a9d948340174d02c8922adf4647be194f03bb0121032fa46369edbdba428321cae44aa77d82d495a3a92ae9227a8919f0cee85a91790000000000020000000001065bb395aaf787beb20cdd615bfe59572f0b65074135b469e2441a3d4dae4371450100000000fdffffff8f8baea0608bfed31e6503a854de63252a893785e001557944571c87ddddd65e0b00000000fdffffff862e9061d7ed5dc82e2bc110cce59ab54942eeb3c4b01223e8239ba74b0dc0bd1300000000fdffffff2f40a103c97c6c9ab0f472d4d344921d3246e9957d919b5d2cb5bffbe2dbc1d40600000000fdffffff6a0e3117598cbb547491115c57c5ea3a1eed50784672b95a3f72709a7d26fed60d00000000fdffffff84b8c5167cdaa599bb92864dab811da7ae1f161fc5c3c6ea6402f452d32092ef1100000000fdffffff01971236070000000017a914ff72090e4720f79c443aeddd3d2b4bdf0ef4268287024730440220779e85b37560aa6d6c74c8bf0e399f581c91c92b1b640f74f63adcf7fdb6f0ae0220090f3d79ab5e1288f6c119fd063ef0598cf5e3c9a734ea7d7ec1d6caea58f8ef012103a0ba4ed22d7b445c7b3e2c474038d5664f02bc559d74f1a6a32f05ad5367187e0247304402201a8568f5ecff642a809b599815b3a348e932489205774e1f28d9f351fe4e09d40220131863d2d1e0eed3b9f0ba937d6592b2ca2430e38e783a5065e13301409abfec012102bbc32c7c2777ff54e584094795bfdffed061491012b69545c665c3f050ffadb40247304402204cab620ba1bf48e773f95f8c3a1ee0fbd19c709d8c78f01f6069de56b9f814120220110777dc5d38f437f1f610a99687d465d6a31c5e65795510aa0dc99bda80574e012103e8f17a9940652f29e512097485abbf32a74affb623f83c68a89fdebf584e17fd0247304402206356c4b0843497d523d6bbec1e731ab0738d6e260da0f41ce77d2a6ff39b0109022039bb7d0c274d74ccc59615404ae5b3b29ff74ffc9f529dbc108ca8be990d3bf50121037f5ca33ac43dbe5cf686663133bef2d4a78cec57a056f24719145efb3fe6aec602473044022016f46a834048ef7cd0ae2e815566f0a290f9fa19e76de9a037b4a431ead9686b02204af7088ccd75f8b010782cac071514833627435a77097ce6c72d4827ac3e255f012103e7f31db3e7d95e6e12a0710b568efd0ec6342ea46edca56adb45bf48ab2b61b40247304402205db113974039077ff5920718893daecb7d011b53afc8c537e466589c72f83e2d0220065991418d37637781210f460e16ada817565018e3a949ef1414bcee69cec83b012102ba95604019a3d3c2f24177bd4e6c695000241c78df13f27874186473d79cad3549a00a00010000000279749b90552eca9da984a8de587faa05c4f0083b9f336b636ff9ae2967016c68010000006b483045022100e1428de84663f1e318e296c2ce2c63666fb07b497f72bc672753c73ddaca90ce02202a61661c581ad28620a237d98ae90f7972e97fa88f00e14820bda59477a9d6db0121038386c5c32fd81d955ed3fdba7cfcb17ee39e3a8c0e2c7aed5fb4f454189953cfffffffffaf5f9eb4fe1d27698da4ddc5a3272af893caceb06e0d412e64ac59462375b9b0010000006a47304402204459fc6a96df6f505931794c22684f3c95cadb70c2a6ffc9c726710d04c9085202200c2145585525443bf1184d5b32607340ce9341f8f3e395a6da09ce7fdda50095012102dc5e3c541a4d3e92c0bfa7e51cfccea9054f76109c4e6a66c7b07369ce59c520ffffffff02fc2803000000000017a9143e83e781f440c253dde63930e0af407d8447a52b87a11a0100000000001976a9140249d914d28899ffedf0709d61873d48adb053f988ac0000000002000000012adf4d2f0fa989a3442c08632c8b29188a32a31edb7951b251f7cd8c58e43e0d010000006a47304402201489d42b427362db36289c5d1e6f7f6f4bda34157dbf5440d83ee92fee9c116302202f40af3b96913105459f53836e80112889533d1312102020695b54d64b34d7c0012102707609cb67157d949d9628f020fa2f01aa98e771291fc64d05110225ae51364afdffffff02974c13000000000017a9142033a95b014f33a2dfc782af875a868b054d86b787268b3f00000000001976a9140b331c7623caa7f127064c264489c6e5585e274888ac49a00a000100000000010138f00ad55adc851ec4c6172bdb1483fdc4196e1d4c09c46a7ca930464d1d63030100000000ffffffff0240771b000000000017a914d7195394bf56c403b2cfb140544476ae9c3c658d877d610000000000001600142b33a5dae5f527751d7dbf05158eaafd20cdb09e0247304402200501bbca9993fce41bff318d0697479a0c6f051f7ed9128fe9f52cef2fba060002205821018e2a741fba528f3fa065d5bd8937ce6f367c06f7e08720865b1acb8b6901210230f9ac7e119f3d16d6420f325f7240a91ef95dff1ee78beb320495a0cdda96ba0000000002000000000101e08a83c3883c5aede5ffc5e6a2f9036b0dc99b981770400126bc9c9d44758c820100000017160014211fa9d76c0917aa65a2dd3317d53ace712a11a3fdffffff02be7e0d000000000017a9142139d3322decb3fea092c8848823fa1916573acb87dedd00000000000017a914ec9ec5268a4863adad02f79cff204a746fcd2930870247304402205670ef47b98422f38751a4eae973737d7d844fd2708101a1cf08d1e58021e528022038a5949af9d9e977363142c3605abe3d9f633b39f38b08301591a8f8cb9a5d47012103056eeea31698e5d72469c359b9356d02f5d94a44af240f6b36ce6998efbfbf6649a00a00010000000001012dd8d0389f719c1506f74dc27b186d1c85fd272b0eb2e40bea56408f271c6ed40100000000ffffffff02e8030000000000001976a91414f501136dafae0508f49d1d29613bc122a7f93388acef5a870200000000160014382d2b655721d7b076d901ddc601c1bfb147eee002473044022035bd1ce6d71901d663a12d283222575b6ef87b449c6cfb2c84f1cd2c691b32c202202f6908c8dfa8eef85af62400e622a1ccfefa2bdbc5e3be1de5dfa6da1b314633012103c09d34fc49bd281425d1dd66c6e8f07533e1be82304031d96c6e8721b15a5aca00000000010000000001019df7a38d5630e19e2d524c7e9be34deb97b70105b1ce6a8e3c12249783de9a3d0100000000ffffffff0170120500000000001976a914725d2ffa309d9b0f71c32313c8976fcf5770cb2088ac02483045022100af78251c316e6bfed85d674945a4baad367f5b8fbf267dcb7b22c9578475436a022002e5a790a369116e04613d40892558ec61451eec1e14c19cc0727e1df5586e3f0121025fd5be5697d29a890937b00545787137231fa3ee7fa9e49226285628d0022bd10000000002000000013193118d43b9e0d87ec23696792d323f18077eb15fad3459e4dcb9b6160b8898000000006a47304402207186f3959a6db85e677071c658b697a6ee4d02dd151840db20d4875c1d7dbb7602204b0aba49cfe7c626cb133c90fd4f67319570013245b400eb7c763840b7dadc51012103bd51a553d863e03c404fde56dc3cc6b780bd51b9fbc69888be44074e55175436ffffffff01f2b41e000000000017a91403d929117720d408505efb77d34f2f46857dc0e5870000000001000000015a3e029373ed18ce152339a6984c4fdc656028bf4f9293229d6d783c789f1c8e030000006b4830450221009b79a6154edc478e0e9c2ba54d2884d636a66b4ba0c9b95ed163b3b40b0e313e02206f9321be7a288773f405abf08c8f465a176e36c37f733de1794fa0de0aabafc301210233d1029f521017882ed8d52497bcd463a2f2122dddfd888877927959d3ff6477fdffffff040000000000000000536a4c5058325b094965b629dfaab2cba5bd428cc4031736563b96dd9f72937211c5d6ba8d5ec7e697cf22ddbc751acb4545fb99d92c0319a9d7c6d9b84872e3a3c59f5208b94d000aa04900dc000a982b0041031df103000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e871df103000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d87da8c2602000000001976a91446820196a34b0bb6a79ad209838c02a09a1af9d488ac00000000010000000174637d798018e7a358ca5e8cf471739f1157243c5b988714fd3e62fbd6a30ae2010000006a47304402201f095582120d8b3cb984a022871f4b3aaf25730987abab075e8fbf3cec1b755402205011ec17c4b687c1e7be07fca2c122184ad3f92f4a8ebfd03def5c1b73cd7180012102be663c1fea475efed16ae0d53f47fd8302098c9235ee2fd0e0fbc6347c945f16ffffffff0202590100000000001976a91444c2a6c50eb9044e6d90c06f3927f252527299d788ace3180000000000001976a914b477b858171a06c79b1e25e3ca9574d492fbfb2388ac0000000001000000016f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9220000006b483045022100a17c72c10d720bdabc07f04f36de1cde4f34e40e1258eaac76230006c872e3f9022026d3e54e2f3d06b63b984d5054457226749d5f8d8707d70c847d36788467cf9d012103a1663c254bf2aa597baaf7f2a193d586f5c99aca5adff38601d6dde3b17deba7ffffffff0140e60500000000001976a9144b6c7ce64635900dbed30671a1dc4d22bac4095288ac00000000010000000001023c65c722c71a48e9bb9d55807d67cf4bedea57369baf20f6fe1ebe5ec99ad7230200000017160014e46a6229af480d94dcb2c444650b6ea2e87bd85afdffffff3c65c722c71a48e9bb9d55807d67cf4bedea57369baf20f6fe1ebe5ec99ad723030000001716001445173b8abaa7589f70e1d3b1b32f110ab39f59e4fdffffff02eb113f0c0000000016001492c2b5533ba1d51155af64e4ff02ceb08c9057405f755c010000000017a9149460a68a0c6d581ed6d12f2293172322efb9da8387024730440220275e1b4e0fa167b41c98340dffb24faefe67349ba3c6aebadc68d04646748e44022073b7e55ffeddfca2c10aca608b5b5fab1a77b1c3a066f5e070fd5240e5fe07ee012102219f8a49fc39e59628ad54bb6858b08f014ad2269830fa2f78747d6902026c080247304402207fa7733c4abb67fab217a000e222fdf2425f50ef9bf190e0d749248b0073ffd202203037f29555f6f7941c05427690895b1891a8126df0e59f16f28725766c1fbbc6012103ab95394463367dc9ee3ce20ca9b1fd22c5466e5774afaed247d10d7b2710c81800000000010000000001022f17879a3bf926a6cdad43da4743fbf4024db32c4dce205a12550e37542978870300000017160014cb8be98441a20f23c9c5ab768f3e2a03057209fcfdffffff2f17879a3bf926a6cdad43da4743fbf4024db32c4dce205a12550e37542978870400000017160014792b062aa47f5c246faecbc4d88e30554d2056acfdffffff02cee5da0900000000160014c14a9537e4e5434abd6a3860b6e4ff170a1476bb5d1100000000000017a9149ccaa5304b6a51d91f4005a42d84dd6d51d78f88870247304402201044a77764afb91981fbcada6cfc65f42550473f4bcce47bdeb642e94dfe02bd022036b7fca5e640c8e6e10cfd9afef7144939a321468c931ee7bedaef9378b11f2b012102141c4786c1dd01ab38f432decc28c6146c6c8d872fe9a6be411f3e2b7392b6020248304502210087791c3355db1745caef21b44ee15e546e4a2f7b9135f7e955169d137e096eba022032906a644d9481b4e16811d8420c4668b4789e3cac119ba1ecea62752528a71d0121024ee95fc8c43672da9a776c72f361a48f002e7916fd2a6630682cfb583cbadd28000000000200000001d63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b39370000006a47304402204be937e6863710e32681b1ed44c16234192b16262a92a78f9043f3993c25e9fa022064450abed054a7de2832242ca4954e6c782bd4c03611c201a269b264bd207c9e012103dd819e4303b276f947410fd49b81311ef295fdfbd36dc5138ef1d554d007f2b4ffffffff0164592b000000000017a914fd2ebfdeccdb993e26a26284045d4ae69e63bdf9870000000002000000016590e18935ea0b3b2db191a0a70b18afbce24c7bd3e7610a423951a4f9367765010000006a473044022056b447fae46cddafc7193bf37aa1cb9c79b588bd0ebce20891e69c8630aaa4e502207e3c165f381e8091ffe858a58d815684cd106be899bb9a2c0311a3a3e03c5b2b0121037b4e13a2577c409076106815545039c7cc26aa4fa138676abd6a6c1f69ae25b2ffffffff0279580100000000001976a914a8283c6c438ccfb6e143df06a66fffc7d03bb5f388ac39220000000000001976a9140d426a33b0b144369e984afe48178dab281fc64088ac000000000200000001dc66b97f1a84984b9042f2864095f2de6a5cf4add87290dfabea39f5d1e1c253230000006a47304402202940f61ca0ed3c2cf0193ec4ab08ca4226ce4904d52a0e3a482a3f8edd3ca8fe02204b8ab7869026d3c787ecf2ba01b1f4aee30923c72b5242b09e877293f9b4a45401210389955d6e4bffd977f88fd99605b8d19e4d3b0ae312ba6337e71b2d9aba4cd6daffffffff0208971c00000000001976a91448b0d1e7e281166678824613ed192ba8e92179fc88acc8470000000000001976a914ce3861ccded2f76a1cd26f173139d44916e897a288ac00000000020000000346f1c48597553060c4370d0fb903859bb4b8cf1e72b513c6cacdff6fa9bd6ed2070000006b483045022100e25af5df9454a3c95a519ce0b2ab0dcc13272bd9e98cb746bc330d64c6d90767022069e3037d80c1edcbdd48750fd3438f14599011ef0108de234836c90300c106190121031b8e3ea70009100238798bcb3f968513818dac7a3f759fc5d889f72f035db88cffffffff8fecad6fab642c59f46e05e73b65f1886afdc1286b7f37c4af2ca48da64d3c80010000006a4730440220712700cc0ecabf0c485267745df686eb16d0a5e81149588ba7a6c882c8c4861702205370d05c2809cf719fca6f5451a3511bffd0691b1fdd090fa93b834f3d41eccf012103d109df3d0fc35cc56ece49f2a0d79da7173ae746d394990c2c8593adb8db6dcaffffffff39241356bc5d802450d89536dbd9d4c0aff24e0e3fb9ce6f2cd0bcadf2d1f63d040000006a47304402205b19b5ee8627b86f71e041ea6d00d94b4edcf9255e7041eb0669de27cab9bf9b0220513fe8f3fb12fbf788a1c0576b4022209131269b0f5bf32a977a1a475074401a0121031b8e3ea70009100238798bcb3f968513818dac7a3f759fc5d889f72f035db88cffffffff02fb5f6800000000001976a914db851fe8ec4006dfe13f94fad7325b6d086b709888ac6f1f1a00000000001976a9147495a775b079a744ab266b78d7c03f50f84ff4f588ac000000000200000001ec5a6f45154bc307606adadc20166b9bcfd776b390632b7aff3b932eda2e24b8000000006a473044022027b391a0715f6c29d9028b84224ef43cd05b28c9a1af25033fa4a99793cf26dd0220091c5045c492f9f2cb4e469789fda1472bd0fcba589f989fbc80376a49d09499012103a2c493a8812448a59448a69784cf756c1663ef8c4a1126a5fa95facc10f83425fdffffff0164db0500000000001976a91464fa9a26dd87df139b508356524ba4f34441034f88ac0000000002000000038624c7692508a7390164122ee1958929322e419e46b3ee1f6de87fdb3b60726b1a0000006b483045022100c7302832036fc51a272cfa990030e04bb4daeedff7289e3a1a0adc57218b5abe0220141ffdc06796529ff4c06811abbf9cc675a8af2c0acf98755dbdbb47cb42db4b0121026a11b94c1ed2068a62e154ebbe8714788beb6be40234137112a1d6907dfb90b2ffffffff1c24fbdb6e5a37592b2600ba8f5e72d56a1bddcaf5e6b7208c97b934e21b36d2010000006b483045022100e401fbac76b8104044545cc870de64e146962842d787ff89ecb1ef4ff0e81fd2022050baf3a983c6bf2cfb9e4f9e7993cbb8b864697191b370200396f8f7612047ac012103c0299f6b00bd653777908203942c49ecd1979cfeb67a83768d402dcc4d9084c9ffffffff1794c293e8cf2b67c94897c28d9ca1f49a755a01a43569d2117505944334b2d90c0000006b483045022100888fccc8fc072e46ded89c40bcfe16c27c8a4fe5f508712b0b39a9a45fa74b4f022002b7fcd89dbe5f1c5339309a15b1f41aac499b516d1468458804a86d186d76e40121026a11b94c1ed2068a62e154ebbe8714788beb6be40234137112a1d6907dfb90b2ffffffff02c1c52b00000000001976a914e083d3af5cf13b001b9c43ff732b70acb90f058088ac2bc60600000000001976a914f46cac7f0660d6302a6692e2fe0f8377c15f4d3c88ac0000000001000000014f62c058f3545b82eb8fac9584321fa0eda68c26924ff1c475324ee33e383507010000006a47304402205bc56c08f404d8d277940e2c1944883f3a0acfd073f7f2927e8052611cc88eb002202359bdc501567daae1e8a8e81a7beb2f83db610fdffa41eeeba4b290b855287e0121031101685a453a70f76d964c9272ea2929482b1d8fc89ffe47e7f8c1dd4ee266e4ffffffff0131cb1a00000000001976a914b46751ca594d064da6ab6c0651a32816f5e287da88ac0000000001000000012562c8cfbcb50d4ab9fe44032edc22554b4fa78fffbec9a9cfeb0679b42fc485000000008a4730440220130d845c08e186b5e50b89919a342a3f8c74e51b522440786cd3ac6e3b60eb93022013244eeaba6d8480b0fbe02783d3da86543e0539f16f1222d2f8fcee0fcf1f4f014104d66cec1b1558b367dde4501204306c7da71ae48e0acb132ac531e830e54c2cdaaf4ffa5aca3390fab824c1e0b0173740a864ed51b1b4ed155e7579f651dba78affffffff01a1cc0600000000001976a914d21b5199a5351ffa3a0637ef499d4ac639a1141288ac0000000001000000023db938d6d4e869e0e36a1a8d41f064d8f580613327ccaaa4f78aa21e842a2f17010000006b483045022100f38445f8b5d0702e2d3a6a7bd61cb3af00bbdf341de0be47792f3940db0d691f02206056fd91be5e73e154370360a6fdbd77c630681dedfb271d7f7ef435902918440121024b5ec919b84e45cc255f54ebbbdb35b3d5a68305a47127294f6cba59e4ae025affffffff8fd310452b8bb16f03ca4d20b1963bcdff863b37df4367d18ae78e5d61b61a35010000006b483045022100c469a6654231d5fcc929827389ce900ffb7db0620b7b6a4c2279cd85d017e25402200f093af090e52e0043b056f26411b14a45e2a3f188a24f821a4a38906164fedd01210332e7a67d31b31f68000fe8f0065cbc7d0d15f3cc84daeb75bafd1a119d695a0fffffffff0258ed1a00000000001976a914083198f86ceb900d73d894855e61af4889ea17f488acc20c0300000000001976a91466c47fe6ab7dba6722bdae7bb5176bcf0d9247b888ac0000000001000000011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d4180000006b483045022100a820b9f5bec918a24d6c2d541671d247c4587f8a2a3c142ef8c8b6e58f39acbc02200e6c7d87553eddd881e30d9a56edbc9218ef3efecd20f0b8a486b7e3baa9560101210361690799519988f50fe5b98ee58d8511fa7922b4bd2656dd8e2bf8a73f72937cffffffff0114b905000000000017a9148f5a19948e95635c222154d8ad2fb4afa2a342b9870000000001000000000101c3ff07f76d5b05404b80f86e0abf35c1a82d99a2300180468d69cd30019897fe03000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff05d1a40d00000000001976a91401e1d8141b66a50e9153bad9602b62548b75346988ac7d753801000000001600146734dac0b3fb153e3b02887ec930d5358344768a77a25600000000001600145bb86ba87d5eadec26b60ef43f90f41b538ab2ad318d000000000000160014822daf0504c44ad437d62844763e72d7f25bea9acc20aa000000000017a914c9003dd968df7175c44163ea9b933e785a39dc8e8702483045022100ed78cd808259075eb90938180c43af4bebd9b7690b1b5b0c67010e6b582c8547022009247c22019c6a2cb0696ef63491ef586e4cc87bdf80156552cb36b5448f0b0c01210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b7926000000000100000001649a335d378d2cdcfc54e3b2517c00ec02e36447825dc52d9bf88c747a346482010000006a473044022014a4565e70cae10a94c2b216b42d75d8df93c655260be9728691a172962f2de602200cb344aa4091530993489ce831df870b11c779e5f8b3267b42c89d1cc32ddd4e012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02e0391300000000001600145384b29c9549509e031b5c900e08dfc38c525111b6c1cc0f000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac0000000001000000017b17293cbcd822c4098a2e4e812198deceaa3c0d810bfaa56742607a58396b4d010000006a473044022024cb778c5a80a536ca5577adbeed3e6593af5da6f460e294ae9d96935574cebc02202530cad4acb8effc46709ea240a5d2b45c6f6fe8a6ecf193d973faae6d7b24b4012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02a7a721000000000017a9145b3f686108f5004aa0b0e8d2124b697d250d1237879a07ab0f000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac000000000100000001ecec567afc263ae173a14937d0238da2bc57c930bb1e87c0dbaa2607e25ec2e9010000006a47304402204e58bf596c5a4ad8fb0bd2a4296cbafc9baa2ac312f499d3b2cdcde92f5337290220152ab8505eb8644a90dbab4b6814526afdf8b855e08e42af8c35f5a74d38c542012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02d3c55000000000001600146671ed76fb5d6baaa18165afaa57ee4527d8ca8ac7255a0f000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac0000000001000000017de359114fbd0c2b20c54d34aedc17ffb4c3688a88f88ff70008e7c8c2bd28c9000000006b483045022100a169e796ae6495596512bbdc4b6904ee09ce4e1e0a3b6b8c3c06dafef6eae47e02206fa27d80b6a3f6bb0b307916bb49065cca164934049dbe9a55e59b84dda4cc0b0121034f4df99498481a0b668864089518ffec0690be98a12f3aefd6852419101a6e34ffffffff011e4c02000000000017a914fe782093a8ef2e66db953ee436a41f931911d74987000000000200000001eea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41550000006a4730440220250464f4d1511feb0b19fd6043991d70a5a72be601588cc32e67339c6b90ebe202202af2ca35d246423f9ad70fef55162ad3cf092dc032b66a2f79c2d8202c1243c7012102ab3636ede5667b74d1d3680338d47859d5e8072960f9e47eac1e7263e1fe8525ffffffff01305705000000000017a9145f7f7e058181bee55c062cc84f411290b1a9050e87000000000100000000010110b743a977313a4f7e7b41e4c86408db0fb4455bcfb5acf8331233598ff0706f00000000171600144b6d880516982598308a8d73014e67d28cb38f1cffffffff02d53950000000000017a914398b8121e1c8a476109d273757e7fadc1a01752287b4b94c040000000017a914b60b23924dd720be48f619c2f539b5fb0d2be4468702473044022026611d928108fa46da184597a6ffb0a3ca72bc1c854e88245faad853fbe93d8802202e51862730178bdf181557a29c9719feea95b107754d2851377f62d664a42c76012102519a39af5722330eb1a61e4eed4dede261fb6ea9bb170a0ebd9e6ffccc6550ef000000000100000000010112548b01aea1ae1d3e7774474cc59d19f9ea1d81fa61a4b1eff59b17f4db263f0200000000ffffffff044fdd1b00000000001976a914a0699f44f36fef79fc72334628b17ba560510f8488ac508ce806000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe348701000000000017a9141a9a2c2dbbbae4339ef6fc990e69d11192683bab87a8a40b000000000017a914665e43caf2d7d353604c99806b887fd858f2f962870400483045022100a07ebda7b5dbdc8096cb16b830a806f6e5fd2e7a7277b4e00968861bbe6165d70220148997b45cd365cf0edc3b864c10eab2b9641e6c1a4ca79d388329b5ba4c60fd0147304402206c38f9f324ae59d7f87902157871cdf0a5e34d18bb5f0ecddcc457d8ea1c0d0a02207574200cc8cc616fd86912ce78e0fc39abd95ac21b4348bf0e02816d8871e3c201695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae000000000200000001959f47048b99cff7f34909cd400ee441c1b77d05f5afeb617e56257d7f537c18000000006b483045022100d91cf95eda47d853fa638604b07ab466e18d60fd53a6da7a16a356c894bb00b102204be04e20fd4a88e37fc5ca928b0bb4519d6af69d1ea9767629c43cae3d1fa113012102b6ce7532851e710c65d0ec5a6df71c58e44798cd22cff642e3cae93fe6458f2cfdffffff0206591100000000001976a9142d7a334c9a924dc3407255b6ab4ed423e33b3dee88ac1c5c0a000000000016001407520778482a23624b248f5cc416dc84f90feb52000000000200000000010232d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223800000017160014f6edfb677413c79be9866ba83c50aa2590138496fefffffff87c36472c2318e93dc3f0b85d71cf3df46da97f0ef36881271cce04aa5a357604000000171600142339e07828b13ac6863f248ea250cf38220bc49cfeffffff012a0d0500000000001976a914aa1cead14fc772cf9c7984faedfa2a85315523f588ac0247304402204ef6ae6abbaa8ca16e4461bcce9e51bd7b6ea4f616bb52cc1d77869398b0369e022028387704702e527dd663dd7fce10e55999b0bb1ad9bec10770e943d90017c0b1012102d12251e71c8dd55ed81d78be61754c35bc5b85254bcb01296f299e71a588cca202473044022044ad15564ba66bc79e9211432a02793f559cde2af5c20141c746f26358355117022058aab33475b0868183ecb82830008e6e649b9bf33c1f553367616eb0a6ac1a53012102b23aa86c96383716f3532c4e81578c02be9df888443fb229113d4769851dd0a149a00a00020000000001029921342199caa50bac9b2e57ea9cd66ad4f35dfbe19be48ccecb7c290c76bac30000000000ffffffff8d2b5e409b220eca10312077cc2c05105fa69a876d07cd826b925d86acdcf6a60000000000ffffffff015caf0000000000001976a914d9d2b3f9a9f18bb644c13baad5c744da1aed70dd88ac024830450221009cb141a04da976af751f9002949ca4e0164a7063ff5e778b9049d3a164de308e02206723d1fa7b9759e707d7e05663857bf20e7e30cd1aeaa530fd6d13277d12611a0121034bb9e5fa8c20c933df8f4b3c04ecbe41a7a11fdd19e6bc6eedc7fe29c38c9513024730440220659360ef8640d352d2a61a2b6cbded4ff43b51d2fe789c71c5fc314cf5ceff95022045dfeb9bd5ea888491a236f395115d58b9ce4b01fde01a85e38e6be3a81f17b50121034bb9e5fa8c20c933df8f4b3c04ecbe41a7a11fdd19e6bc6eedc7fe29c38c95130000000002000000000102c7f06254eb119196963785262fe28dc796b8810de68ffd779f13184d1c79455f0100000000ffffffff3a4217dc5802d61df2ab0a47c81cf3f5e20ea64528831f1cbbb548a148b9c462000000006b483045022100e373307149b292f6362a79c9804261f21c9496c46e958339716d18cf4bc8194802200bb1db0a0ee62125099e592d26fccf7c7a7da254b205f68d113dffe606971c0b0121024353f1a82f8a1810892b731c895671ab9729b909465ed8bbfadbf1d8fb864ddcffffffff0126d20d00000000001600140c92b4b9c5a3108888a546502fa53be01cbc9236024730440220074e9eac985da6c183b1e1919f67f13013a557f244d262b77943d63f1e86293b02207e264940b2b3ad637dfacb0edf28cfa532f0af42261374a148c3adffcc515f0e012103b9460c4f5c104d7c6fa3f16b2d6dd2a1deba7452feef2dc65b92f9cf14c205320000000000010000000154bbb7a4167b426407a76bdf1996892ad92cbce74e9ef9b10820ef4048d1958a000000006a473044022042eee271333434ed8f2b19590198a839afeb5f9e13f1ad3f5e3746d0b6b925610220196a8ade41cbee4181e335d9fc0a8489de02b00bfe453b427f607dd5c91aa1a40121034d84596543b6b78ace73c07f8c51b7a7a995d9d8f8b3d403a3a0b4b4ec27d2b7ffffffff012c335600000000001976a914eb05a7b152b608411f7f39bf9aa635bc0b665d1988ac0000000002000000028fd77ba9639847e00f0cf952cee27817f9bdff9ab3e04963ea07cc4b2cc9c437000000006a473044022013df768c8ca58c346cbb5af0245cc4d40c4ca486480fa1446de1b9f4cb240c3002200cce7151a9b95240e782b97a8871831f14f0fd306d0d09d05192b83aa191f09d012102deb8953a4ba580b66113bbfb32d109c5c07599ef942f59b17dbfa41eda65f713fdffffffc20eae03f12891f44cc4a541abf6303c3e40f137df686ecbad8917c7465bbe30010000006b4830450221008e81fefb95d76e19ac643371fa4aa2325c2036aa5341ab6781cf02ebfeb80f1b022038bc741f4971e263433bb8c0c9608228de23fff8f18bf81a4b3ca21b0aa03c7e012103f617f3a55018eec833fbd276070f6f1148a2a56bb33eedd8599231173b9b01f2fdffffff0181d90300000000001976a9141d9caf00af4a42d1d0aebbd628170f9dfe4f27a688ac000000000200000001d6dba4979ad80b8cb40058e2140bcd4d6ef208c5f36731f0b65347400915b945010000006a47304402204f39a5106b2964ba8e45c7994a83c3eb6dfe3f562c32157f837d58c40bb2638102202835cc4b26cff9fd80d5a46d6f06f66dc10dcf022987aa83cbd424287b24c1fc0121037fea7b6dc9801ff86b2adc2e079631de3adcb938673eb19d5f8700e07e6fa448ffffffff02d0660500000000001976a914c67b091f86ba5b097c91a0f7c76476472eb3aa9288ac7b190100000000001600141b0db7dbd78cc096d7666d7986fd62662e85336d0000000002000000058b501be8f9657fe902f6a6bde0a717fc8ea23e9329d7cb65026da47569c6ce54cf0000006a473044022061002accb5944892d6e4e66a10d158f55857821de37e988a9a01bf67ebd02191022040ef28d6836ed75f39287fbe9ea3cb52fe466fbff05fa2943562c39ad67b495c0121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffffeabd6ae05487b878b879dd831cc42a88f071113d60ce5069b39003644501dd24000000006b48304502210092b38d8bf6089574336309663888d8ef67ea550cbc19284564df36af90894d9502201abc989addd1724be7e8579f94462952dcd7f6817fe99eda9b48a8522790d39a0121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff0844682f3e05b7c7077680c88cae79b6e7191a70289adacb02d9e77001fb801a8c0000006b483045022100fc6de717a90903e9a7c2528f2ad97bb1d2279478b5198ddeae5510267fcd92b202207f66e70852f1582b5cc9ce802cdff0ad10e71ea72f441ed8fc1227ef1fa55e270121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff8f8054ca8fe98b531c6b8fb014f28d1fbe9756a323e4c3d3cc338cf5a74ff7c8000000006b483045022100ebf5cfb7444cb68175b759b9590be2c422ba25a8b4b11379f9d5ea216f8d860f02204ea5ca52c0cf7b4fa9ede1cf1d1f2de86d0b10601676d48bd57c5c50ef36cbb20121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff1339afc8b62c8e4718a797d19b6d480debd90d8ecd8cf6461f0f9d48be6b44d10d0000006a473044022003de714e6ce322a7f11702bd5e9d0eef35c0e94c2d437378847f122e29ab276c0220503768ee9878d95a275f4f8cb5ac8c1ef6570653d0a565db9628cc667216bc190121021f6dafc76d7a11336625ee3a9e00c15cad79565b8ca06a84ed1347ae79bbf3d8ffffffff01b4c61000000000001976a914132ae44bf69e071b9262aa444c9f943b65573ec288ac00000000010000000001011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40500000000ffffffff0220120000000000001600142af5ec8f6c9d197d5920bb19133994178d8284f5c82c0100000000001976a914d3bb8a9cb47bf482416ddf4439c86e46cfa692ea88ac02483045022100ae007d65036fb98dff74159ac742637c81ec7fbda536db3ab0b81c4f596289c2022069db7f01cd7198c9c187a24bd620c43af1dc4efbb6653f93cb515750c565ca1b012102ebb043a8dbe108f42cf7768d73962db7c7dd901220345c2e19856389bfdc42b7000000000200000001484b2dbc08fc84cf4019b5a6ad8df6ef2c05576d166406a70c593723da1dfd07000000006a4730440220526e0138a2fd5180680245fefc8ed5ff87427d3ee8f4d2617b0a9838326f965902201b1b22dc56aedb1fab18ffa2fe4a7ce0892ee2e5e269a703f7b34167e5c0ccda0121028b3c568e6201ddc0f78de7f87277282853fbbb32f2d0735d66e7251f63909cb6ffffffff02a0300200000000001976a914adf892ec454a9732d7806c9a71f25bebf7c4a44788ac0922010000000000160014e7e53ea078e79777e138a38df68ec9b9952df10a0000000002000000000101d3f6f9271b60c1cd6a5f70c09bbd09508db058a0fa67026547f39b0fd56f9d740100000000ffffffff0228fc44000000000017a9149ed93115e87d23692f1b8bf0a43d6b82e2d830f687ffff2a0200000000160014b2adcf0eddcf8555d8d1624b9d9a727c94c0aa9b02483045022100a04b4c785eeeaef1ce1e84c889bc41fc18172f633b49f7b3f59757bda9a9cac902207f385565659e9a211d2f9cb93154c8a7b2955e2b061d7095cf4ddf89cb2a66bf012102524a123fb6e9b93ee68373189dd72c215fdf90d2ea905e2aa19ea939527af1e7000000000200000000010153756dd54fd59b6da4b903b674c6441a6acfa934d992214ff67bb7fabab4816e1b00000000fdffffff0b400d0300000000001976a9143ce7dd291a14f80a16dafce5f40d6c24bc1289c688ac18ae01000000000017a9140bf816e2b39243305f8e854accd0a779151f30e887497a4300000000001976a9144ddbecd5e07cd071cadd0142790cd25c5e62f32188ac5ff50700000000001976a914bdfcc8484e6d478282fa0841a1f9c8b8d43c2bc088ac4f3302000000000017a9146d666813fd7b9a886a31d95534fcde6488702777876e2f0a00000000001976a914f4458b6d6aa2060ebc1884f659fb47dfc6314fd088ac5c49010000000000160014f760eb72a1f440a9f7e8dec94cf26832cbf2af148e459b000000000016001467d06a0bd17a3436c7e0ea3377c5e4c90f0334c8f69a01000000000017a9144657b503169e3e2ecfed73eed1b0a6074f90bd7a876ada06000000000017a9141cab2ce846908fdbbc8a0e8beef92d83e24ff6bf87eb96d30300000000160014e9c5b9b8f14984869ee3cb0ab346bded395b060902473044022039a8443df7ad09085ac2a4f428ea1ffd53877a4a7d34c4ed3d978252599627bb022078061974ca4bb6020f07d7ec70aeda2c2df53187695f6e460947dcca5b6da2390121021fcae3c61916b9650a534dd85b5be77144187c50aa78806671511bf7a2efd6720000000002000000000101d074cef3d5eb44fbba1d3911ae701bb21ff1dc35f083fc4a2a5d48ff9bdbcfc90100000000ffffffff026563010000000000160014572903b65688fa34ac995982126f8a655da4909049bc06000000000017a91436045bb1952e78c45385b70b3f12fb5852888d418702483045022100fb624ac40694081b2a546204b327e226071ba492992bb182664a2e84b656607c022035caee6fd0c7a217ecb4ed348b9ef1ece17efea42f8e8342a3794ec5ebab3322012103b9c5a8636157e43fca970d9a4b29927fed895349e41d3a8028533a7630298df80000000002000000000101222146404365abceb27dd1593f43ff7f3050efbbf1e533b48cc983bb386524690100000000ffffffff0225cc0c000000000017a914db193f249c4e8411fb5f9dde53944a9410321f1387097707000000000016001412301daaf8f852910be8eb5db4f9a4a9f909a39a024830450221009998bfbaacbaf9ee2925582e69c2d8b812808e4afef526e2b6ab121aab047f7a0220097b73540b7ea4e8817f25e389d43d50e757df601b7c6b8623695310c1f348e901210267ac84e7f5ae232650f2e76828a8c59ed37251c566979ba88452529e951d0a880000000002000000000101ee287514ff03bab6114212e932fc57f35db8285554d042377786acae937a49170000000000ffffffff0272de0900000000001976a91462d512e5057bb07db57b6ed5bbfcec01f0bc50e188acddab8b00000000001600141f5245ebe7f5ff415112e2fd0dc16875d490313002473044022029d6ac8ee13680409a4a76c31fdce445400fa9cfe820bba37701037947356b97022049fb8f7a74442a9fa5e4b5b0c9365a4db1c308092e761a9c27a99e2dc9640a500121023591038122ab5e401f2aba080c021862971f516cc98f8f1bf4de098b473afb8e0000000001000000000101a95b21f9827f36a3ba8f0b8d276bde10ed1b0de048087378ea2de1a1e0083c540100000017160014ce814f3ee635dd92bf7a06237f307a2740ab9c71ffffffff3dacc001000000000017a91448ecdb8812750deeaada86c1527081e98ee5162d8750c30000000000001976a914bfd81bd260cc4e87825de60920cf9cf201708fa188ac79bc040000000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f95cda00000000000017a9148548f00f87880256a176ddf44705c5c14f65c0648775c60000000000001976a9146f33b0c01d2fa1c7ded7eb37cfe3acacc857160188acc4bd06000000000017a9149dcf651aa19e78fadbcae7549b6f4ac10fcb1bce87261a2600000000001976a91485f75ad424b51ba1d882329e1ddb47d83f8549db88ac028d0000000000001976a9144a2a3d0f2e927ad42a389b630dd5235c9627ab3788ac35b50000000000001976a914963fb7974abff2160d1b181fadba7c6b23683d2488ac3c3400000000000017a91451d40aeb690c8b685a86cfaa778f570adf84612d87530e05000000000017a9147c12c698cc559c97409fab14ff516fff3ea14af38779c70200000000001600147350e3745b34f6ed46ddc8b1a2ffba3ef970ca123f0201000000000017a914aaca1eaa69e2bc133d96ec8bae918fd70f700ce987a0d700000000000017a9147e08d7f46b5c4d2d85c32d8d70e921968b21c94787fe1701000000000017a9143146ba983a7a93ede8e72f245cb5358cfaa25018879c422000000000001976a9142091ec52d6c6aebf6a65c1b08fb7ef041052f24588acef422b000000000017a914cc997f710467f7d091f9629779018c473b9f1da787b7c800000000000017a914d81ee6704407ea2dd471f845952781b04a5d618287463300000000000017a914c44a2621fd88d6352dad6123133e435dadde9419871c590100000000001976a91466ff4df61e7cdaedcc97401ed8e74e934cec6c8488acfc9a01000000000017a9147b8fde8a190f188d413db80e2fbc2bfdff0fe82e87d0bc0600000000001976a914279412184b0706b9897e50d1573f025fc0cdfa4b88acc0190300000000001976a9144d3b3ecd6e58e22b1196125384770a893679589e88ac5a3900000000000017a914fec87a6903a65ec0637aee6773110d2a7f62307f8759e106000000000017a91454a2fa3178440310fc4f174f450b90f2e2f9ffee87539b01000000000017a9145623153c0d1ffa5c3f0822433eaa4eb8d832e0c88729af0100000000001600141e5f94426e057c93ae9270accb33ca484488d6cd519b00000000000017a91440f08e20c84970936ac4ee32fcd78752580e532087f82001000000000017a91497cb91a081707a216ae6a47b2c1599462fe4aaa587a9590b00000000001976a91487fc1857031d614ba670c80317bafc0b1e87967988ac864f03000000000017a91485ecf9353d217ebc795edaf7e287f68813e4bf8687bc0d0800000000001600144c92aee9c2bf5022b6db531e78c9c55b81ece2ff1027000000000000160014f4e89aa342454af268efb0965111e1f524707e6f06450000000000001976a914e3820757292ca3c2c778d7da76fe270fef0bd7aa88acbc7b814a000000001976a9142008ec6b939ab8cdf40eb03dfe0196b7fe531d2a88ac6e0b0c00000000001600140bd4c27f29337dbb205c382c8f9789d6ee3b6f5eda380300000000001976a914444516eb3a7b0cf58008e6e4185dc003201e001288acbe8c0400000000001976a91493b9505f8d6887644890f7ae0abcf821e986a27b88ac35380300000000001976a914cb77b4ee3461b68035e67e99d828886a40a1f4ee88acf05500000000000017a914322dc9190de3e240cc752c16928aea5745c39883873bc600000000000017a914fb0424513c3d27bdcbfc1d0ffe6321778d7c588287540802000000000017a9142bcfa4a1e187a61d4ba1f306ba6e11e8758eca4687c1a82100000000001976a91471eb0f4697641308f6dd33f87b747595457de53d88acde66c1000000000016001438e20c11c921216d5f9e57d14f38db3b232541467d580100000000001976a91489e451720f0475e8e00071a47b9880d45409911b88ac50c3000000000000160014cbb60e7903b275b3157e686f10c28639c8450f5afca301000000000017a9148d8eac7d7e211c88f7bb5401bb374f04f237feca87102700000000000017a914e9d30d95d6d205183d1fca3925d54bdcade78fc58763af0100000000001976a9144d3b3ecd6e58e22b1196125384770a893679589e88acd8d600000000000017a91423c7fcd3c6161e2476d5483acf961c16e14af63587a14b0800000000001976a91449b1a4cc09546f436a5e353b3841f3b836c934cd88ac72ad46000000000017a9146281531776ed5df30ce6a36f95617bc9bb1cc16187bb610400000000001976a914a1fb6332761a2d47a3aca8951d3d623cf5b6a81a88ac3c838e12000000001600148c5ebb5cecd111731c2203c7df5cdfacad62166d54bc01000000000017a91481d45001027f7734b2743de5c8e811f671c1c52e87a56e09000000000017a914738bdd9a800ee89ab41875fc640f104c12e5600487c01c01000000000017a9149cc2a1e68b362ded8d4900807225adfa79c01bd2875a411b00000000001976a91434a75b61bace13879385a04f41e7be8a83f14f6e88ac6bf902000000000017a914f81880a23d01cf0d3a652fba5c7b669d592dd322872cb50300000000001976a914943a07b53822026cee4fa96456d5b153ca03644588ac381b0a000000000017a914250ce92c02a9fda26891b3d8375347a6f7188b8487024730440220577b4f6996f33d61129d49a24472b46fe27371ca2f639ec827ca7d0e4136db870220398e788b47796c0b9cb2b95243d8d1f483f566ab0c329dd3f65da171cf798ce0012102cc2ad3ee2972ef682d1b7ed3e2bd54c2b1fae6eb2af865bc8b76610789458192000000000200000000010240e155f5032797e4e77c1bf5d6d0c78660fcd18b83529e895644edce4c23be960000000000ffffffff155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d2b00000000ffffffff02ef23c1000000000017a914f72cb2365ae93c9891cd0d6de913ac3fe403d403872d4f01000000000016001423bdda07e816e040d675dc36e21a434f8de620250248304502210080f8b9bdb87c62001d2410b7eac228d065d2d98a0ceaff2b86a563c68c66fa8702204837d20e4100def94d2fcd5fb1da4ca1c3eb6a75ad52b22be66c853b7409c37c01210278793d925b560f68f96cae543c5077d3c28db37a22e7456893246dfdbf51dad202483045022100958312b577cbe7f17d26a2e761ca4a01bde33a1c6be9be433d1835ff6efebdd802200463adf7d281f34975f56d4e8022aae00a2a5bbd3ef322cf8a7febb186fcdd2601210223d8ec50e69c063b6e94ff0ed5aaa50f41304db654fc08d5a7dad82c64a4770c000000000200000001155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d2a0000006a4730440220548a6b0bb8d0514c1f4891affa8e351d7474f142f75a66a162ccd31b63c6af9902200ad31d39d77f72067f8faf21dc941fe327ceb455c7e6bbc548f3fcfb2b27aac70121024088421cd0760dd1b4034aafeeeb0bd2443623c85d781f521a14fb9c658b6959ffffffff01e58d21000000000017a91409610e4bb3137fb30308c05c7f3f2c5aa666ead5870000000002000000000101aa14a5bb654552acda512a757de99cdc516b7cb4b0f80c7e3ff3233123139fc10100000000ffffffff012d68020000000000160014529bf39e59969c998b60dd445fa5edb924512be00248304502210088c70b694cfb099ce7cf2298e9de3ab1ddfd2b183140d7a8815b5a48a739a6dd02202699fc5908644714e5eaa44b53698c941dd7247586167ae34baf1d1f83a8db71012102a69359404c142b3de26aae978dc410a0dda87234623832581f007b9e8b40521c00000000020000000001022e1d88779ac3fa00429e1b8a53f935d063ff597f85c79f11dec06d513765682a0000000000ffffffffa10cf5fe456edf97b5e7c5c91d31ba7bc1a8e139697a67a9809a6e9cd42ece8e0200000000ffffffff026ae107000000000017a91432f2d1dfbb4791630a093e53fe3dc27a6e43d714879c240500000000001600142fb5a2063d24b71190176d708414f324e71b64ac02473044022007723385d7a9736b7345979e66870afb03946c6094f773092422a0a91b31fb3902201a6c863014fead8100843488406c5c46a17573ad2fed2a1cd81e926fb6048e3e012102bbdc125ce01ca3f8ed8a488367ea67e425bb6490f4c99a57e65d7dcb52333b2a02483045022100afef8cfcc432da2d89ebd2233a35b7a88e6eb0b4d7cc40b643e1fb2df90bece60220447bd3b1858bdc3db04d7876772fedd473e261f928454de4adb864ab6caa3d3e012103ec12b60a80b2c510e8df713d7fc7c7ba17e90242f83c02751bc74ca44f3c5edc0000000001000000000101a95db62bff506a01d509b47bfa337546993cd27e0bf85ffe6622b9c815b0b3970b00000000ffffffff02ff430500000000001976a9145b84e64e52473fc5b7873de48f71dbf643ed813088ac0041f40700000000220020956609b12032a75cf5c65ef8f3fab5986e7fa233a769750a935fcb5c5953165a040047304402201780e67b7630463a00bfe16a539f6aa1efb64c7019b050d12170e49d035778a002205f9b65dd2dac05dcecd801fd5b73c7d37ab86eead4d4eafc0b6a3beef0dc74c80147304402203d47c8863106886693054d02e0a902e3a6bb244097be23dc95fc78c987e5747702206687332d54065b1e798f7799238c7d3182b0a528b64306a5e91e3e82d7ae36a70169522102363efacd7222151f035a393dda68811d38e2669564aae5a2d81cba433c4a12e221020c1191bc07ccf7f2380acdb40cf6aa036304ec36054fc1447e7311ffe9f7abcd2103e7a98752d9e0670629091a5a37d2d3d63bbf0bbd64a3e17e286f5c5a8a83545c53ae48a00a000100000000010130e21e722652262dcff03d556c457991a88da23588fedc97b4e285a93a225c3d0c00000000ffffffff0e92470000000000001600148df00a846369d5b6acce4b1d744df96da7ed30c508cf0000000000001976a9146c4fb8f1c00639a94ef0a46a4681d41f74aae36988ac204801000000000017a9148f3d4351abd4faba36df0ec845d4d6b73fb59da387a85b0100000000001976a9149c98ef927890cf7ba691c97f3297272c4eee2f3488ace0930400000000001976a9149a75009e644c48df3d15a8d9bbc0eeb4e09e07e588ac901005000000000017a9140cc63fd87d5cb154ef2ad5fc432b85c52066b6bb87c9b107000000000017a9141e762f5ec6a613e3af527d0c0f31e02ac591e3c1871f0408000000000017a9149a9f3b926f810eccc2ac05e408f247a7e240716c872d380b00000000001976a9149c2b0683df51a724948eba2341fbf82b907d8e6788ac9c0a1000000000001976a914726b3cb79bb953f74af4590977dfeac6df27fe0388acd58c4200000000001976a914c748c3dd96ec1cdbf8d1993d3e7c6b31f5d7d80d88acf1064f000000000017a914a5ce70788294c38a88bcfd5be04f8c2448e46ed087ecf469000000000017a91417ea6ecf5ea9ea10ab69f2cdc22a6967ff4a3a1f878d66290200000000220020b4eda6de0189e99554ed63de11654759e9f2bd81b7407b5f54253770b6a026bb040047304402206d6127efe662739879182d9d7b2e5fb9f45a4a589c22aa9a5536ff797ee1028b02204914a2023ef5745bf9abacf02f1ebe1b43b9ce61ae00efe4c8df747dd8da85400147304402205d32406bccec2d3e385dbb3805df27f6e6d24c3928fbc5be8e37dc04661bd4ba02203c5ff106fa49bce60b25807d2002f77133aa884c5c71c566b2c57c5a7f345ce6016952210225dcc70b0332784d7de31dd664c2cb53b0623b3bbfbe551747e3cf63cdbfe45f2103e7b85752a99087d34da45027561bc78724565b62f37dafa84c31394ff36b6b6421029b5f0640870e6c9e47234932ad542302e12b844a317a4238cbf87db9bb6a0cdf53ae48a00a000200000000010116a809c3e50cc5d26f0865d92eca0876860f3324151c70d46743694ba888bb4c0100000000000000800162a800000000000017a91414faa50dafca7c1fb6a20ecae14a1a554f5d7bbd8702483045022100cee457bfd0ab9a127e1a193b2994fc4af20b57f40186efceae406d6c456dcf3a02204ce1db0539bc8544faac7a76b013237f4b12b5bf85e3c0ce321a1e0be8ead6000121037b7b82ebcced822eee2571cbfde6916b2583f0aa9f203ad06e219048249aab9f00000000020000000001012462ba04c8798c60897de129c1e2701646486bb9561be866af59104aac6a39b00300000000ffffffff0179580400000000001976a91433e9e74b137797d3836e9766da3341fe83dfb44788ac0247304402203fef16fd0cc02c033a8249599b7f532df17b7fe9a29b40031bb6a644d907c5a002206e328863f4da81b54056878ac7d0279da8dbecb406ad05c2a01af03de1a96a3a01210272faa6611354e69f2399978766ea593dff9afe4244b0ed9f84a8b12a5a9b7af50000000001000000014652f161cd5f0ea838804316b0d5a8be484421995714574a5b62975e9599ddc8010000006b483045022100c249b7c1f2dc49a4222626185c65269b9737732c2d48d87bc7fe62a9a6e3409d02200434793810a56e142b0bb6694bec489e3732085583be39facf2e645303375b21012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff02f37c67000000000017a914361337806ef662cafd5db21a772967c6164cf44a877e95f20e000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac00000000020000000001014dc50ae5361c8fec3662b22d22c51ad2561db27b0be28a1672125d42b0f005fe0000000000ffffffff02e4a31400000000001600146fca1a4f94cac11028fd054da6af7c93850a76ec6dac00000000000017a9148f174a60aebfde07c17f27549c21c7208fc95699870247304402202a0124b7360c732abd44c957e75e590318155ba2d8035395faa6cbd2a9a53b2b02200f4871e609f48916f8a5703424f459ed6ada3170cf657bfdb174fa9702be6f8c0121024e9ba508389219443215945719ca2a091a2641e34c127ee37c17479eff56af42000000000200000000010891469531c7dfd0fc9aa2cb3b1833e1f289f80aaadedee8f248dc62f96fcfce5a00000000171600147a21299f175487c88318984f51549240d6a89d8efeffffff590e3894d07f44d99296b0e9d893a1e5bc2f19dac92c14a6a8cc1a51eff95117000000001716001414557d1e0ddaa25cca47b4c7efeedc0c036e276efeffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c70000000000171600148dd462dfc8c72418176f66a2a488bed1412e167cfeffffffced968625ed8e16dba54cf14599828fedb7fa869b0808ce9a8a4d298102eb1cf0400000017160014e834dda6cc7ff98129abb5fa04abc13b46225dd0feffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9160000001716001471207bdf722c315ed7ad6242f7b39516ab14c36afeffffff29e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec1180000001716001425f0168e1f258494c288e4dca66c6ab20360af9ffeffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da1400000017160014d0c1317c00d78d9f3b70847ad8e2afb4484103dffeffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e26000000171600149eda1213e1b06992500fd4b9910eaa098e6c7ab8feffffff0148a521000000000017a9141eee4c999d4cc0025dd86b7176c75f94b554cfda870247304402200dbf62b0bad49007c9d164908974cd3fa71cd187dba2fd380de10e172367830702206839caf806cf6e8f010bbb7017f513a45dcc3314d0ffbb4681c09a2d5812ce6e01210212ab446226ce7ca8a43ffc80e0d5dc8c7dcf9813c57a5a73f45c6cb46f555120024730440220522a25d0c213a41ff0aeac15fb86002609feace221db95bb06cfe0215f6bd847022040275bffbb4eeb77d1d7b5713c74543eb94bb973e7d3996e43b462315c193c660121022e3153a6d2e6fe3cf98206ad9ec6917c03e035db3bf654e6b2d89a5a76d88a7a0247304402203605f30d7975a1f9a46ae6ace1bd34fb74afa629cd0fee311f93707382f739d102207340b213920056ed8f3e6a90b729630865971cc79585caa76b6ecdab1d39857d0121030a01ded7803612b89f2b952260671107d79b1c9d49924419acad024a5f2a4c5f024730440220211bf94034f26823f8024fb10dbab563f0370a6551bc999437519a8a6d59e77b022028a2daf34edefdfc85c47ce278fcff46c4d84935586b3ec810b92f6538c8bd25012102b1ed209c3da41cdcb1412c45b63d74a524b071c7b59f7aa4139b56718e3aeaeb0247304402201d3b77c9a21d4fdc0dbcc647679c4f296b811f166c2cf1f6e4eb565c8f72f3f0022055e5be28ba4b9d15493657e2f35539265fb50c18b6bb9f356eafdf711b84591801210355e2d6eec221e41fcb66a608f99870bcf3496042be9f198f9e804cc346f02fa80247304402201d3fcf9da83931ff6005dc486e5d89013dc7c40238988ecc60c88154d941cba102206839dd8f68bf6f4ff28e1b619b80f3b8069bf7e85f897cd0d7afa53a934c627e012102d27da139b52511246685576f4cc9518c2f74a11b334682419e9344996ba47af60247304402207c093aad9e505e4a7c80f8c5de7f5c37a5690c75b63dcf6051e1f845d4a072440220289edc906774d5670966b89a5ce338e2baff456e52e0e212162c0ef9964ff2570121037bdf97324104e7eafde484b9b634644d29f257a78c8abc0868c37bd5311e94e902473044022026678c6a631a604662908daffcdd1ffd4aa1c1543f279d570e71065367a25e94022020f896d3ab9229291040490ceb4dfb63a5245d0bec318a62c2defc1109ae8dc00121029e7728e98fb2f5db14cb75a659477d50592aee2405c50afce465e7d3ccf8551349a00a00020000000001020075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c97837000000171600140cfb0df39023f50e3b562ce988eed61b2cce8d3bfeffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac0d000000171600146db26475c6b90555a4075d03c77d60c62a2cf0dffeffffff01ec960200000000001976a914b64301dc970ea425b7745b1f43a543e6b6e497a388ac02473044022049e36fb2b9fab898f775af548e0483a39aa04e0f20854f17525e97b39f66567c02206c25a142f01840130944876b09ebb58ccea29677500586b5a889e6659d9de7990121031e24114acb4547a55edacba61f2f78864ecbb2a9cd97d5b7eca8984202f9ee29024730440220091d9c438f0bb2ea1f1afb18ce7ddbff9db584b07a66c9c9d158c778dad1988e022057e87de950fa0ebc973ee67d123bbe6c6352c5a1576a5f499a570b98a0cd54f4012102715b32f2bb02fc763214f1ecbe8e655935c6bbd431c1ee843f2692061dc30c5049a00a0001000000000101d09eaa4794eaace392188eeb5290323afca8a5cc4b716ef1742ac2fb7e10b2880100000000ffffffff0240e000000000000017a9140f76b2e0ca0b1048bc6e8287b3047a50f88515ee8730921b0000000000160014d654de25c1982a56fc9b4d6f613db44894fa304b0247304402206a958cc2f80dd7602741d1c6f081790f4e87af4c5c8cf80ec08eb1b67d06fd1902200e7e09247c7f5233c94ed6fb666e0a30d5ac0cf043ad524b4e051577caa2c5430121033fccd63cee44cfed16068ae0b73b00a82991c409ad2c9541fe4e260980be9aab0000000001000000000101ff7b8c179571988418b547e6d4c6d3bce9ed8aceaa68d4f3d7eae4762fa36a500100000000ffffffff0240e000000000000017a914cca1aeee6ab32cae8060a44f446e8424659f486987e8a51a00000000001600141f0044c700daa71b45eb410b36c9c95393c61da40247304402207b71115bf3a8f164df1b9a603b7bd2e5c0700c9236e69502c8f8610c9ecdd12602202b21d8de1be2d8eac7b6db337dd173b01845ca21fea9d61988af4e224077f30c01210373ce3552446e42aae497ab850a1c185f453b4c9ad05bfe9a845f0cc5fb1ad6f000000000020000000001041eeb43af781c5904759d58fa0bcbe19ec077b444058fb252fafe957481afb7661800000017160014a6303aba81c456ba145564ca6be56f2044d907e6feffffffdd616f0b57fe66e8e519c5f320fb519c058f2034e971e2b9add94302cb0248781f000000171600144b6edd35800d762620faca1dfb8a23d8276bbf19feffffffbf23221e1a7540397fd9ab48ace68a6d766f6012f9ef95f931c57b4dc0834a9c170000001716001446ef6fef12789d6cfdefc929f9bb0dc32c932f67feffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb3f000000171600147929a749b4a0d6555e55454599f617ccc2c04dbffeffffff01a0d700000000000017a914f7e3dc4d8bd2e86e287f0bf563efcd97a8dddd22870247304402205b4f4d897d6f4dd22c6c46845138417212c9600fe37cc104ba973f46e06818e702207a4212e1998ff79ba42a30c0d2237ca938561228061c71671db517dae9feca20012103e46b2e47f98257339331f7f39bedfd062e258440bc42bf472c5453a54aa525ab024730440220256109ad64e0dd8cb9297a9758168c5fa808baaa8b2d2ca04f1626759c694a2e02206ef724752778affac467b4b1cbd134e23404dade9a01e668be4bdacd4d98f016012103a9bbdc37a6ce2d196eac75096cb564971685432ced96a14cb28e87bc0d643a950247304402201a220d664cc86df21c186f5bcd9a1e1db2502c48ebb03f521193c34e9bd1f656022073748ce331fa22055c96c1f35d5229267244c0339dc847d0ae26da247c5e663001210269959753a9faa965b85514b144a1071bd7c02be67f382d130d41b67fab53700402473044022027ad618b59c03ea982265af04db088348adbaa9b80adfdc737a72be98217d80f02201f370e21c4c5ca2ccb3ccaf18542ba824d842cac54c82f3036978bb0786d777701210261a00dfb40352de361b8fc5cc07f1e4059db1523af1eb28881fea7861c8e7d2749a00a000200000000010187f80ffd343196908903ac2dc877f8c699230df7190f0a67440fc02172c11f890100000000fdffffff0295d40500000000001976a914a305a24094f4c664df079c0824949adb473aee2888ac884e0200000000002200207bb8f5802ae446be4e5f7dde387ca1624faee09a8643a8c16ff87df4235e2584040047304402204d89b4ada9376c65fe3cc740747313b6271b60d0d5eed91a85193f8c492d838702207ca23fbaf1e76a91df0c13c46c8994c2bc064cee64dd0a80bfa3a48f4f29bc1b01473044022042a1a2005f9dd99162246bcef532573d5818e2602d38415d354c270f3648edca02206735e1f5369abddaffcb74e2111603ff5c83a816cabcece86672d5fe71a20d6d01695221026f1787876e7c4be3414fe4c5455a3aa4dd20e2bfb21acd0d7fbf24f15770d07f2102827d1757c652484f9ee5f14dd8fd4cea674a4bffbef8a19d24bff6f7c0e63955210374f3e239bf6a0b988d6bbd1798fa32829ceec30f4d345b4be172190d9e805ece53ae0000000002000000000101ca59b4d30b5f9a0af5681ffd877542cf86c551deda55db0c8e125c2b8a2141240300000000ffffffff01c5a802000000000017a9147fd61c0c34d29dc236a28e4bbfebdbe036cf965c8702483045022100a7251a956273e3bf36a54aeddc62b66ec941c70bd592b2f165e14e251b93e28902206c4c2c5f4c58837fa10d326509781ce67a4858f3318569043f98b75bf5be4db6012103028a40a4bbe799eecd1f10f4aa149143d31e3c1056f5c4d05216cd36413c12530000000002000000000117d63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b390800000017160014b4ed6484f3a860e8bb069f354d0e220b25f9d109feffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b390600000017160014ce48cd22632fb31c6bfc63fc010e5036abd1dd03feffffff73ac59473b478a7476aa99f12ccf7c5e8906bbe9d2c53b34d96c70a7ef39b683000000001716001478577154d02643fb2d3438a90ccec7e3e6abed41feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40b00000017160014e6e4e24387c4305530f6c9731f5817e4e492b243feffffff5f8b572adff521bfa0cc35b0d4d8ef613978d302344373ed96d0c75e96fe665b0800000017160014a23d39c734d65824307914922c945aa53112a325feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40c0000001716001441343f59ac45c3dc2c455ccd9dc24c65e6a76e06feffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b3904000000171600143b74d1e91cc9c79b507b9972dad558edd667e243feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40100000017160014a68dd4b33256ada059aa224f5e2e0d3afcfc25e2feffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53220b000000171600148f479c9ff83c30f893ab078bb635ae835da8db4dfeffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1565700000017160014aa486e64426b212b8c33b83134e061707b46b7c6feffffff92289cf4892dd407fa20413ead67de7390f080f0148791d80d98b02e699bd5740000000017160014cbdbee87445f5d380e8454a9794c622acfe2c18bfeffffffeab3ce080eccb5ab8dbb2d8322fff5f9ba220f9d2c6d58e351ef12db602c95570300000017160014277199ed373d517c20ad77b044cec8ee954592c0fefffffffd86aaf41a8dbbc61827fece848d539d296602bdbb1dcad85e95679351985a5b0000000017160014706fccfd9db231e216704b8b6444cdb30544b06bfeffffffd83daf03521784f2e7788ce457b0236a92952d9aee8a2cd9a0307031eea816f00100000017160014f5b098ef0a2d7efc4df25858d7dd9a29408cd063feffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d10c00000017160014b0128a2ba61e910aa629178dbfa6958ca69bc052feffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b90600000017160014e50f25c7489022d6d157d06dc83c9271333a151ffeffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e24b000000171600144cb0ed09f12c4c3a2710d87ccf5577742f7b1c38feffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b90d000000171600144a215a093a8e4f0e7045dd4f8c61d99c6391dc55feffffffceaea910df2354c7f203fb93fb3226fc05020d6170a7e019511c4d425b76bfe12e000000171600149deb11a97d414899d2b66f8fde985b818cbbeea7feffffff764bd0d090190ac77fe746f712ec428c01d56ff530503323da78c1dc430ca35d0000000017160014814517fe1639fb7b8fca1058495fb846463ecfaafeffffffec135c14537181c8c014b726ec3a59ac12b8eb5308dcb8e53b3e18280e0a6ff20000000017160014dcc1413be42ad960b39065eaf7e01ce8fdb19d6efeffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40200000017160014893ca92b2bed65ed2c98d7815e83d3f38b830d99feffffff5f8b572adff521bfa0cc35b0d4d8ef613978d302344373ed96d0c75e96fe665b0c000000171600143ba5cbe98233bf8e6bc54b4f93a5789779974711feffffff0100b12100000000001976a91423be41fd1936e60d1da0d81a0f5ec0ca86508f3e88ac0247304402205a10b90fd2fd3a64bcea34e8262041885c36f9b17b4ca4139e8f85aac8fecf9102207c51dbe3d3023ebba2edaa02ce7482e4a0cbcc092bc0e58b0f88a51d209fa0b30121023a0a3e5b2eadb74eb7f984b068d0ce78e43ac8cf01d47058e602eea0e4e1e2d30247304402207a5f1516acf9e0cf6794b137ca0ca2ff114b71ad57887e1177142aedc3c7e1b202202ece0f8af36eb5b91173227e63b9e8e71bc54c48df6e621eab5e9134cd4a6ca0012103c7841fc35556964320fba2bb0cfd3395fa41c66790a50e3b82fabef3ab5342650247304402204f366985f3788876d9f867ec05ec57d3fe406ed241b39d274658022021f44fed022070db07957d285f400ffa97476adc8f9459901ba3fc59c1dc7bf3ac36c876c4030121037318759ded45e1f850b1e4bf5fda3846797ae931333f34be80fc82ea41176a400247304402207f029d39a9fcde5f623d0fa263d120f4260045efdd701301124b0ebbb355838502203c87fb237e7af73e1d2b7d8ec1681274b634c1cf33b5dd928585825920410c9b012102e3d974d152e39c401b7719c2ccf43c445b8d74747cdd69a48856d1d771c9f4480247304402202887c211ac7726f8d20753c187115509e61532644b1ba62f5d7ccf7a5f9e70ae022020683ba4312b309de2becc4f6fe91894282885477823706f0bf02e7e664c78a1012102286fd5fb9f3359809bc4d9b73e178c6191767d0c8aae87767b90a64222f68c3102473044022059f7def4b4f3d7005ad8f4d76c280d92f25a8243a5c904735cd96bbfdf999089022065675ba052cf9ca8274d985f8df1567c44680a3dce018faf3e66a8ee8a3216f90121023fc25120c6c799b1a9f3f45e23a2e7819640ac2640eb127712174898583a96f6024730440220179b71949d5abab22fee1193b660c661f99e67ab8f8561eb46088f27ad46e61102201bbad5f51343c49227b9e6319f368b48556fb7648db88b833c2d728d463024b1012103c37d336ca9099a60696f9fe78c97799358eaa7d1584e56fc3b25b081eac3990a0247304402205c74d13b41ff770d13487df739646fcb18fac5c5140cd2b7e076f3b5585d24c30220783d25ee09df11566932a058caaf692bd48969e8fdbe87f33d71e2037b39696a01210276416971d3fec560b8e803c06d5e898971775d3a366d632794c6f46acf0fe1cf024730440220094f6907eaa5269333cc0f57048622eee8d161e0d51039d0ad8083ebcd04698a0220267256002877f598a6a476c8c1c237b37b4cadae41c1a9b28e5ff090a4e7ffd101210318834251efa6c3a61b200c9fcea8dc8e1fde605d4b0d3b0de15852325fbb5be702473044022002544670ae0b87456debcc6adc60887201bd6857c890d1b9ce244d155cdbbd3e02206cf55f90be78852421e1512fb122ddd293e00999931bb8b73c63276a859e2862012102479c47f4bf13d24a083a5b9095ad233b3373bc9e4ffcaf2e439dc6e73511fc8402473044022051c33f406ac4bbc4046393fe56c03da58fd8aff5ef6b8418ecc55a3297a4c76402204bb7a57483baab516eb96aaa259aab8dca6c0bda1abce59d2b444a72a5a41573012102bb6da26b9cc7c99c745d1cadb81a32abc50065c744500f196f626d2b32ec127702473044022008477bca418c899fa9eb03be408d370df2c84d77844c1a7c5be72b951c4c6442022079034464a9f40624d0db254b22d83ee54d843fd75bc5ae1e9f5a8ee7689590eb0121023e99537471a8168e91f36b5c174116b4b317b0aa7ace7085ff951e46f85cd13702473044022073fe73d5dcbbcf9bd04ae4c18e50bb4f8a36be5e40bf228d779a27428cded5b802202bedbbbb0b297913ca820289c7f02aa77f5e0afd4fbe99c050af54fc1933c4e9012102a2b8b45672f81b51d98145d8c630ed855b1e9dba6c998a8355a430d57573132b02473044022037cc3d270a3d16e295ba4762d73edd3a7332a828acb235b891ededa0fe21784302206737fbd5e901338e60d3555e6ff846c600a277e447a1eb37b729e2308ec6f412012103107ce0f80df699a56603ce145bd5f8cd24274c7367116afe80b4ad5fa83586e9024730440220034b10332d41480fafd1fe7a6daa5238a82ec5136999129af1de6a58730cf416022016ca6cf9866e400345b0de6c3f2195c02c91b773abd616907be6c90fd839755b012103eeefbb7f2995cc12e1b1be8328fedf2252b6ab61a184847d687c3b90fb992517024730440220190a24ce5f271cafbd9e7f1aca2a958915607af8fcb6604e9c203ea38122fcae0220021e3be583ddb8a9246d770cfd2d337f8cc71b5ed376b46e5ab70dff9f111644012103599f4ba4166684a5e884b82a7a2849e895f3d8968b93ecb1eaf7b168e5f13e6d02473044022042733b91bd0c5d61d6f0f92115b40f4c5f769b073001bd36a1b378ca3ed1d7a602204859c7dcbce086cb65b7f057ab1509c2d8a4640371fa4fb3bd7439b43bd647740121025753601947d701de7a6c5dccc5685a08c1c3f744626902781ab7f1fee426d1240247304402203c050e6b42dafe47841a0d210bf85b0321854d450203ab5f9542702c71c48f8d022014e82ede4f653ad153e1db5e52d2e2feadd4152b01983350d64981abe7192ac50121027535db8717932b6924992efb84d7edeed37be7d302d8b9e9e177355e5fbe2d6a0247304402200799d8c1cfc0d6a5012c5eb6f4a4d49501a4916c8565c6a64cdad7988ea73b38022015b7f435dfe5be37edd3da3377139ccba29df80ce49a88464c37957c8c62c820012103a965b3dae07189171018f3f15dd70de0f59fae4acb34830a96a99f4e86bbfed3024730440220139463e8dc03a4c3a19f6ab357037baedb0bcf7cf0965de3a6a0cd408f1c37b502203b7a67f6b35761ec501ae4c42060e861d5b1064664c93779ac02809a22273bb30121036236bbb27f0700648db439bf7f7534a8f8d0a81b4bb735e1724f1d703378bc20024730440220734ded1992e0251d0150d16debc0747f5d3f3674524f245e0501b7bbfda18b9d022009e34620d3eaa6b2ab0e8abd32758d6d0a4c1620059813f6b3fb7451693a3f7f0121027644a5a67ba0776b9a5cd8ad958cf192c4e904466d4d94411c57ec7ee619cdab0247304402206853c186b98df3c7738a89bdea80061fdac3aa1ea14d2ec4f63062189274208b02202f7a9de0c6a0dd5912a17a914d8e653342329f452a18041044c267a3bf2ea96a012102c3e49745dfeb7e6a639937ffd4b72a63b60f0c518b6b1542f796157ccb48145c0247304402203b70556a008fa2bff724b01f3606b43b4ca625674a8e7f82fb68278a1f3f2df002207d897b05c430ac600657d8ff67f7f9d3a049081fb9d4968bbf376ae1a5d89621012103818bd5d4e2c8d4353deb1ceda2281cae9ce1449297a92be26ac6b998fbc9d1b949a00a00020000000001024e9cea8f165fe996e98d082ac92d94bbbd5edeec5ce286c3cce76e7474c015950000000000fdffffff0d956e9e073676e8606a55d1d8377cbc5f3efe19d2642b1cf3555906ba8c477801000000171600148be2fad4c8cf292f2230a49db0991727001a3accfdffffff02305502000000000017a914360fef116dc533ab94aadd99e330bff663f51c5c879f2ed5000000000017a9147c3b60fe16c16f5d7647b49b591fc41e486d6855870247304402205ab3e999bea2511cb2451439ae1f53e1d4f9acb1afe5377f7e6c244d846fe60d02207618fb89a7ee6950e98889b98cfdde83abb2d8ff59cf45df0d7296858a83177a0121023b7361cfbdb28aa9e307750c6f1413b07d1606c421eb54e7a927dc14930de9900247304402207df57e4ea68b9cba0c3f9d4922eec4d3eabadd3d98100ae118aa6e16f79785d4022038158ac6fd371f18f44193d6212cefe25298dd5282eb082224b9ce09256663fc012103b42e4a715fe71a84e132e3b0eddef924695879f3e3ca71728db00c3ce60a5e9c0000000002000000000104ce33e03547dd00a379d9c6205c07835d5c50618c2f209fad56ada22b08db2b410000000017160014e055f7256ffc92e2598aa7eac3a81a5b3de94b75feffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac45000000171600141cd2b5f7cba27f08cc09ec54b464f7e37450cbb7feffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7000b000000171600145d9c3d8393ec7d1cadbbd7c15be534ce1de671cffeffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a5419000000171600149fa1901c34c96799183ffb6340c5f1cd2f698c97feffffff0114fc3f000000000017a9144271ab6bd1a8e66881cd55d264eec5ff5f6f9f01870247304402205bcfb3c885344dda2ef2114d80d9f095210f7dab30f0512962e1b65928be566c02206598be4e6ee60acf0afd5ac41087d780a393a407409987f80ce38b792d30a76f0121023714913ce34ed8f7170ea46cf4bf61e0319f359ca8f7bc2daacbd0bc299d026e0247304402206234cde261b84fc5836a7729845fe14c80eb2952961aa24bfe8d1f2f2a22e68902204863bed7d40ab1e23cfe2a52df697b3e23db368e2fabec54b0e5f0bdb932bc5e012103bafd64fffe543001817030447d4495e77e10c1fe7ecd8bb03a055846b1f68d30024730440220250e695ba8c4330026d7f6e389697463ad77332f71dbee85725c4fdb5dde314d02200a514e3864e3088f619bc3d9c607f9425e4f4b43ffaef26ec7d4984ac686af2301210388ed7da5ce685dc707c80326fabc0aa2e7725b6b1eda4f1db15b05a0fe373810024730440220543b2a38db3c30c6c45f1983dbaeaddf2e0ba36a55726779ee8b7256fb617df402201ca9c6fd396c06eb214134a1269c7de59a664bb70eb46e298881550a582fb5a80121029828f30558f5d76ab9542ab94d0ff8b242def153b2298f022ab8b007ba8161ea49a00a0001000000000101f54ee0e6be79a9f9c5ddbae0511d7b5c88ef59c6342672330f6ae14d142582ce01000000171600146af2deebc3cf4f7b086c844370e6bc725007a08dfdffffff021e9217000000000017a9149454449622df7f9695840c71c433b1f90836d99e8750f6dc010000000017a914fdf1365089f8ff4b521326a1101d6fba9abd832a870247304402207f3264283e3a4a9c110920f51dc0ab98e3473f421149b132bc2801fe07d5ba200220331ea8457e8bcea2eeb15ec553fef830ff051fae57f42ca47d5c9b5bc046c13801210318f67c9456816a455778195e05198977b2d37b3dbeb0aba5ad6b408994b609bc0000000001000000000101756e8def43f8257d3c00a51fb043f74aeb68c1d5f4a236b594aa246d532f9d2d0100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff020d9305000000000016001446c0ccd82012b4886712ecdabd0d9e27707b687fee8170000000000017a9145290348d19c3565b98672e436b4a04434f3ccd95870400473044022071e25b94e117f9cfb32f14a5cf98fb5cdfb5c08ab6196b2bdb32d3635370aa610220510d78a2653feb80af8538a47ca3f6ae13d174634c34daba3b0ddaf88a19bb80014730440220088f83c7345904de642708b501ee398bee9c0fd2996967d1f8c7c27030bc0d080220474c36b560c51e45d8ea1879eb7c5f620d0eba6f02bfc9bd45b817a395770bd10147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001013e50cc673303b9a7943b0c675701731dc5d6217acbd65497262055b652356dac010000002322002051a5833a12af0f568af8ee9bd0f1c31eecce69ab7eb840e8a6780efa32b714c1ffffffff02677dcf0000000000160014e332051861be6cf18f30106b2fd6001e9b387b1abb3012010000000017a914c63333c7f132ea991576161fbc436537ddad1dae870400473044022015a072d7db0a3dab8258010a167ad0eb7e5b54c4547d4a676d9a42595b3be6d002204b1b55d9f43058d98c7cd2a58606b66ec7f9b148662016873643dd3512562db401473044022065eda96840a618ff261902e2f2d9e2441aa7ec2fd230e3bb8d8e694d79a8437502200e4957ee9fd3dbd64af564f9fa1a6e53913baeea0f2d727781819becb1dc314501475221022ecc72e0ace9fa82c2577732083f188e83cf7fdd4c1831bff86c57401abf321f2102c503fd7d247c39bc2aab204111491e5c214e6f9a0fb782d77bc4ee265296f0cd52ae000000000100000000010103095eeb708820b0011e545a2d6d92a92f73c99106133627700435ee6bc1b6990100000023220020111e0d8063cb4329123938187726b93c0cc087659640d3a580b99c8f8577651affffffff02ddf803000000000017a9145f54a9016d4c90e14a018f79963543e52f677a6387f3db34030000000017a914977ca6f69e1b4ccdecfc9691402e7e46ddd6c2dd870400473044022000ffc37c0f5ba52eac3cbbd4536bbf48c46efe0bc56a8e647d964c0e4f54d96502204fbc3505415322f3b8409149c7091365c2c4465e29c69108ba16ebac6ef2803301473044022074e25c534f6c844b922e027c208b8a2b7033db30d969fbb70ce143b28436df6d02207b98148151660baae79839ef98a4f24126bb905a59a88439f964dc4b14131b97014752210298bcaf731d4449a434add3a19b71232149d35dbe3a27718b2bf3140ef272755921039ab11fd9be1ef1d2daf6f63d779e9c6d438c2cb4a51d464fd6d3b4f26a9a429e52ae000000000100000000010140760e709fde4011e008a2b7cc404d02af965f268331883cf518b0ec3ec8f693010000002322002080e7a30f49972bb0e3318d99b7d517cbb53c309d7579d90a1ee562e37ebec24dffffffff02400d03000000000017a9145f64c7064400430d8faccd4babfb4c3197d2f59a87963b63000000000017a914c947496f86cba7f3ecba5631f1abf12d9064b3e1870400473044022013ade7c93c8b6c2bc2eb53849a6930079804fe49bdf2fa3ad8b853fb4915c4a702205be843c09b9e766694ec5095c88876a46604a4503c7414c2e34f0a2f2e1f43d50147304402206fb48c5e7aaf3480cd550577fc0ea0ad50a5f7443103547fe4621947a9cd60cc02207261ee8f0f72186d6749fba1e7a27bd5385591cece4d8158ed4761cea9463b0f0147522102a41b0a5ae68a51f19ee66b1204f455800b0384cec6d77e2f60d079e0ecbd24712103f2f74933455dfcaa18d4c73fab3d443cb52bc203a219c7c2863c3f9b7c7154f352ae0000000001000000000101573a726c532fd4898ee77fc79e4ee3974173a38d184b0fe76af73e69ab2c4507010000002322002006544193f6c89c7fbab1b34c7c2ac3358487c7845ae2f4d78d4490e371ef6ebeffffffff027ede03000000000017a91437adcd2ce0bafaa51d4890b209c902a2c640615d87d45262040000000017a9147e2786ec081635e568a73f33f3a85f404915059b870400473044022054b628a3e7722d17b217279ceb07dc55a4096c7eaf38c8a93d32349a08055344022033fc324945f20da2d72a47d9642eaa0a8dff07abbb6cd72bb568a907c4bf16270147304402206d882bdd78654b55425f3946426ab918ce46db11a0f281668088b9b0b5fbd5b6022075cccebc37fe4af6414f578c7edac24f3847a33ae9cea73f572d810f40c70a50014752210329d8b7f6ee14041ab00b0ef66db8bdf79c7c0392c68bf7eb0ba94d77cca8ddc021036f7c395d03558d385dadbf739697ec8cc2dad4e266ff9b7bc78d641eb13ee31c52ae00000000010000000001014db4e14df64bf9ca1243ad25f21a3ee22826e1f9e86d22ff198aee89f4ed79500100000023220020d468a22a2f9d645a40bb4ab227b2dc4f3918d60507b7ffe7538604828f530ddfffffffff02abf700000000000017a9140e9988d7cff75b7ba8f342c09ac2ca2e23524ede877b5c02000000000017a9149bf37c5c9b05786cdf78127a9eaf21874b3cd79487040047304402206d274ebfd505f907ca045c6f6dcd9943940aeade6cd2dd0cbf6cb6af8ec1532c02201bb648bae5f54132babb3392b7c5665ca4f0050b5a81dde033c08985c3c7232401473044022016983f5fd68403e4ecdaab92c606ded663cf2de35c336ccf979fe7921a0b14cc02204398186682e955de5dd709a71bb0ce0c45494ef76f5dcacd5283a39722b613ec0147522102c1440f31e72577cd4742e189a1d8d41b1714ebf6dac5cd35df72e8abdcb5ac1d21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae00000000010000000001016dc00c1074b83d0686e3a532fee0c9dcfcc6b07cf8734be533cb6eb5a3ed90630100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff023bfc1800000000001976a914523fb7206a765b023813213707c99c9f30737a7a88aca37457000000000017a9145290348d19c3565b98672e436b4a04434f3ccd9587040047304402202d67ae0dde57eb26945739c2243d40dd0844643cf5047f1df191861bea4cc16102206cc12d1083db20ea04dc98ccc1e4cdb3205921dccca7a5e99b8c01618ab839f301473044022062fef4fbe96eb190f135ba76de15a8b8caf177976ef912a19e4fc802a4e9d09c022035852edead4dd18352be0d6df47f9963144f83d95da2a4193ec378805d7aea1d0147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001016d9cf01c756aee420994d8c47a65145ae56fd45164499bc2917060a06be6ec2b0100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff026f9608000000000017a914e9734ba1ccbd26bc42a537c6df6bebd299453235874ecd4e000000000017a9145290348d19c3565b98672e436b4a04434f3ccd958704004730440220619de13dd8b5087f480af8330fb62a0c297a4a5272fc78a900797a39c6e7a11b02203860e719a1db8f52525fc974fd5003d1b33a12b75cea1963c5a653f5bb064d9301473044022012344e76ca817801f76fbf8aaa0924725869081a0b70db756f06bf32d10ea0ae022054f7742c8090605ec2c1199c47ac95796549cf958a08783ba2c073cffdbbc4390147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101736c49e5c9dcbdbc6647635b262fd89622d17a09822810f21eabdc7f487218d00100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff02f5870200000000001976a9145d4f1d35b6409ea87bbacd7b0a589f6f87ae437188ac49344c000000000017a9145290348d19c3565b98672e436b4a04434f3ccd9587040047304402207cca9c1e0ce1e56fb5ba74c5d38e76656639f8cae46ab62bde83b0ba7b00b076022009ef34c3e1b560215cb46d589c4562dc121bd91a9481ef47b8da48089435fb9601473044022006865ed4963a5f349a5e7346402df476f6443ac55d475aa4a5cbb945d5b0493702201ee8b043d03bf5677709eb2bdde14f93f291c3459a256ff52deb53837044fb050147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101ef464a92557c4e20d5868301e4ec80aab165b13b2ab1eac1120bbad4eaaec0100100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff021e910100000000001976a9143678a2eb62e5c17696806d803038379f639f22a988ac1b924a000000000017a9145290348d19c3565b98672e436b4a04434f3ccd95870400473044022006dee0aecb12e8a4bb2fa7dc5de6dbb98272d2c1e52b8f11775a2bec45636e63022010cc4158b4500475e1b48b9aa94902929028d0274148a3960d75e223d4ef75ba014730440220454303a5f707554d91fcf3a579bfe1a4c494fc5d879553ee453810fc3e78533902206d13c297e8f78782cea6f1f5281395165236795b997e3b8487fc5660a65f84f20147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001010ee74bd1eb2f6907792ea7aaabe0f73aa70ddfbe42c8a4c1019d2844968b56fd01000000232200203ebfdc401bc2c56fdd940f3ebba984920116af8534c6da480c30f4280d44e757ffffffff02d14e0900000000001976a91465ad331c43390444a7fec5de979bc713f298ee9288ac49e86a000000000017a914488cfd3e7b4152b6cad1d0095be895330b3a199d87040047304402201c084b35255fd9e2cbb12152b5cd6623542d2e182197cd450ba6289c0894445402200bde154816a12040c6925551a1c4793d703d017eb5810b0f2ab8be2b4a8d36410147304402202bbde5616500855497f78068286cb5441617dc714527780120a55cafe80ad389022016e265236e101cb5b836debf8af567aab4211de8fe2b420cb9a480fede20beb90147522103a14c1c17d9d622b28906c4b532d4ce14df0444a52731bde612ee3cff7058ca2f2103982481ffd6c2aa1ba6b45c0874cb14e2ebcbfe494f93697c3d40857517fc280b52ae00000000010000000001012aa0682db14c1d2f970cf6c42ebc6e89e902bacef44c6045bd1451db488c8aa60100000023220020203ccbff45620fcdff9803b88545e1ff704e297f706168f6f057566c65cfb358ffffffff0296830100000000001976a914612fc24f0c3cec06406093fc7dc5623ad868a85588ac29aa03000000000017a9142fc2efb2161e09c3c913488394460c44de690b15870400473044022067ad1d3b92afb990975830f016777fe42401e6c2e597b64815ec58bf34b991720220506e44806da85bd53565c0185dcecc04dd13c7b94a7563d83cc1240e320b5ee301473044022058f8dd4987d7ec431ca378f57400b41ba44715e63fff3461477b0cf562408197022035d3603c88e5bdd3d9e8bfe2592f6c5fa4c3c477f6012669bc80350ec8d29f5401475221028c99e05ad0d42a287a52d281aae2d2c348b7061cbd596095fbf98f15aa2d408421030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000000107a021f886ccbb1fad818f0af128eef725c8259fc02550dc5b299d95049a298ff901000000232200208a24cd44516e9cf8380b046d94c13b07496a36d28d88490b6d923125e497f27dffffffff3cd8ad7b7be6a67b21d212bb8d4e75107c756da757795af06b07c9ec214f6c0401000000232200206e4583d94630d39106261e1a5c5d91ae93e4935f01173c3968278d23ae3b07dcffffffffae21ab5ee21fd2c332eb8bde91b57ac84d0b66d5e424498cec2e917db9be6e070100000023220020cb162dd884e20b6f8728b3126403abd8c28f3b41a1fd39ef3a77db1a34bd9e8fffffffff7d8f86963672f7c96bb131b2487155fa71540cdc8bddb096dc32eac105fddb730100000023220020e3bf6eb9ee51639312e7bb4833a629833f97b13323a9144b41eeb42d1cb2f0c5ffffffff35414545c368a8aee0716bbe503f3b487e3bfb38467913afcac3e909d12a28700100000023220020e7b1a3fe81323cc579622cf5c09e726f5ae9e4bc63143dd9945c17104a302f6bffffffff49a87aa946fb66ae12f26be82fb6d0a847fe72ce54d8e562916fc7cdcd924de5010000002322002074a39b44113b8db0fb2f7ad498bd23324b54a7ed53ed6d8eff2411c957729ad1ffffffffddbda4dca625106cfd8e8aa139e7b20c23565334a38ec06b365f0a846a0e304c0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02867b83000000000017a914b2378048bc0f5816aa5bb1aac48a6d0382073bb187fd6b6f000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402202a41f320044d43919a65bd20e3f7d427a58ba1d678655c4757a485d00d10d4bf02201400639b2234d53063d00048576fd04fea9c77a9f65e33d2855bde65ecb82f8501473044022073fc288e99840ca72b8f619597fa197d0d5e2fcb8203e1221cd38f5f68d062f602207f389578bb668a6b08fa316c148652c98e6378529167bdf1cdc6179acfe1d5e20147522103d9f95fcfc776af75364a94c795071838f44d7f7186c49c636917b43911d406bb21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0400473044022012b48088574314debf44806f6ac64a2ff37c797425e8343a5c98d1b1dc5b6c9602203252b84c822c629b01eaa8bdf60c5e12fb388288d43b9cc25cc0947eb4bac7650147304402200f4672e797e0c42d8bed1b27feadd536427605a527aa32e04396d4acea7a06f6022015df97875a7b534c7495d887793731662e0aad1701b8ff4bb9c69a78603ed31f014752210345bdf432071106c243274f6d3c73782427d2d69e53916b5445121c7efd4bfeee21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402205c06380804fd37af05ecc5ce6c8367c004039d2b71203b3182991cb2b21e735c022014734b848f62c9c08b4668ab940d94d99cccae319c3a632549979d795fb321770147304402204fd64d5f3dc421af6b725ee904db621e01b9911987454182cd9bd159756838b0022058e56345a173ede938a5a988257e54e44575a9cb025a7f241d5670f8152718310147522103378253394417af8f6e2882243ccab1db7e6d9aac3d4f3f3489e7ecc30a5c8a7621031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402206d1bbaacd9cc3fe5a2e607722a1192c5b49e7cf12f6f729cd82ff64e5a75bd7602204685973b923a29880376f08f0ef7900d6faeae3399b994d7176eea5cada861430147304402204bf95a280ae184bbbf60c28c23e1b81e0fe78cce1e2c5ef714f9184a04af3c6d02206383bb59b0f62b471dfae283f90b61f84c38c70e68f2638f5e3e73cf72791f040147522103c11d7ba7e66c4bb4746dd10f7f4bc0f9b915106c8a7142959cae4259f9fee18f21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae04004730440220025863960d68169adf1df08a7c32753fa514fb33a29165484de98f4cfa2541ce022078114457c857631e499dec00d4a2f77926e1f4e361e84bd9c4b57a955f85313d014730440220210e9feab2e375d36b785e5b9a21962065a7c2191f0c7a5b6b8b8885160150510220162e6b38ac003099f3f4cae43231fe9b5032f2c98deb829a40a7e7b13544194f0147522103eb8b04a3158a3a894adabab8eef9bcaaccd9ac8bcef8810cc1a2bd8ff4cf006e21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402200493963025e4c0c898716730c68d8e01fb595a54e35a5e36b47d3614db058d020220626e7ef91022eee6a96d81ba0cd1e22aabd45c4169502c54b5f69c6a7fc70b7b0147304402206e3efe69c030b99b75a700157d0be75131886f8c7824042fb4ed0c27b1b4c05502203be7f0935cd56e41f224680135d2a4c52685d150d90962d6500b0bd97693f1660147522102b03d72535edf5c748d83f8c6694edc66913a167889671969478b82a54f49fc9c21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402206aaf13bedbb4547e98e77720634c7aff9f342b77126c31813fb8abcb0fa22495022005f73a1a97c7369a9829eea7cc3aedcd78e95dcc83df7637687dbdd8fbceddba0147304402200bbed8271aa1fe957de0bd324f3379d73a5bca2a628e3700fa9598679739f555022013ada5b5090be5fae6af01f2f6f6217df3131bdcf61190643850311b3f5caa9d014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001015e4b98aec4cdfe29db243e0a12a411afb346fa465a479ea5b7a7bc95e588cc540100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02a53f0400000000001600144cf2575e1208ca97d2e696361a1f138b3bb4b678871b6b000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402204808c2baf00d2b4147a34d4d0d5fdd9a068359500cb7377bef51c538697cf16b022023a81ae204f26f2769a53ef4da83a2c2b6ee12afe2e3900cb3f4eb8e5b0c3a1201473044022051ba1df657e66bb06f6aeb0d85c332f2fa2708166567d735247d6caaf2003103022009979fd1a21e6e4ea9e4c6ce7ab0940096d5a8159afc8af4aff42d62b976ee48014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001010019daa662dfaf9341256fe7d654e208db608f4dd1edc9afc9c76f1c7185a4140100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02ec640300000000001600146ba2069bc655063a9fe8b72004caae8f1f692632caa567000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee8704004730440220577cf2ab777dc899a367f8b391c23babbaeeed17c056eda05aafcbf7584f5263022079afa7f96cf62477c8a4625177f51eb925ebc69be73b8ddf2e4891fcaaeab585014730440220733d0c24ab22e35e7ed120bdae1ee51be78b74a0ea6a84fbf17b885145b9f3b30220264d2639433726abd398155b6d459b241e3ac2f3048865cb964479ec6834598d014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101b9173c7bf0246994f620400ba37782a33b184aea33d451fc8139fbb09bf9a7670100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff028dc20100000000001976a914a19494d0df3a768183e32286969087613f58fd7088ac2dd265000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402207785e5f508be8ec5645aa31c97225fbf9a874b55d6e7d1c202f91428b96f69f4022024da56ad3aea1d7b6f55de0d55f36ef1f5182716fe164c99a5b00cb17197face014730440220403a4a6c52f80bb9fcabd8683e6e99c4db47908ec2ffeb9faa56650298d4f83402200327308ff4c76a264f32cb86ed7c5e19dbedff0ef2035ededd07d9c008d2a648014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101d3a7091668fd16922073662f1244659ca9cc8dd9fd75aeea340098300d8d6fdb0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02f1420e000000000017a914234a97f65e59d623996a401ec7792d2e2fd2730c87567e57000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402204bc551b143f7a48856b9dd0b0177440df80bbec836554b302a9efe03ec65b4f50220590c57babba0fcaaab8b993838c51c5c226193fe81e498becd62157cd6eb5c5801473044022021cefbc99881d260272c7ad53e07a45f4e3bcda8237812910ec79f1772d2deb002205ea036c8627e59c4b1225633de79f3b7964f447c16eca9ed47921093b04b1826014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101f5de985de0c0a1256dfaa128efb32003dc87ed7787daa9dcd77593794ae0e79f0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff028bd601000000000017a9141f6a8a43ad3b892509a4263190cc10c5a1641edf87e59655000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022027607e9e53388177525963a0e24c4b829367c34b5b64b62d271dd047f1d161e4022044b8eb01c1c185eab763ec73d698c9f65bd370a39b8eb060f0f45ed54945cb1301473044022073f73db030b9ecf6c88e38dbd1aa0e10f644e4aa3ecee7833ee59244749ab0e002206c9cac990bcb41ef5d320e1bbd52936d8258ff79c55dd54f7814aa5d69ef6a15014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101e69bfc8ae53ca3ac5806917bbda1c537f9f1e2adb93f62bef9c0c008cd4a42410100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff025c470400000000001976a9145157f5ed4a3a8bbe400051bdc872300245f14b3b88ac793e51000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402201252911c7994e24efea838717cbb65b32351d7928f0a69cfaa9ed9526737469e0220409bb6e66c0ff1f75b2e08becd3acec5b51e3afb009165cf62bbf2c227b6273d01473044022046bfca52218009903883bd0311a8105a2ee1c67c81671fd605df376b9d84cfa702206c7de2dadff41f58203cc92f61def2dfdc0fe0689bbb51185ced84ce3e9a34fb014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001013dea5f7c21489e843a3f36fa9008bed462cb545c8b09d729a63d2c8be1628c470100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02048102000000000017a9146bbecd5a68ff2e16f5c512b235f3fb249924bd53878fac4e000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402205d3af63ef098909dd2629ad04258c3feb0f4e464ff5a19b3ca7f7bb9ff7d87c0022046ec3b0b29eba6e7b5a60b9d99d407b41c5229fb0c63226b14f2fd4513671b0a01473044022005ff0391ab65fbf6beb8a54e0c244876529bbc1db8ad7966691601e9e5c31b310220111fe79338f4d28e9b51fbe83460d80044ddb63181a5ae6bc2212f013bde0810014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101651a46da3be8ec04e15ab486b800d6f53cf3d228e091c6d099d582584944578e0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02f0110200000000001976a9143b77deeba17967597e2511d5da74f134ad600b1b88ac8f894c000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402202772b9d0fb49f7dd22492288ca80c34f63ce9411d776f11df20c6ef8823f9b2c022003fbbed7971429ce5ed1bdc8d9167e47e168cb65381b363cf4ee2114fada02100147304402207fe27170bb849fd97ae47b3446992c7b1279a960553e35033e107f2e36d171db022035ecdba6ae462f7158d2d5d0764e2d078f27069e51195fb43d99433952326987014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000001e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1565f0000006a47304402202e78cef322e24d80d7b711659e86a15e443666d7159ddf281ab4788f55be9e5c022020f3ce2e499a6a83c11d778ec2155c992df15ee771d431519c65cbdae526778f012102b8a41040371bcadd1ec7efc609a07a1c3893c34a7d23f6d749c30fe752273e41ffffffff020e8300000000000017a914104da039bf3a639597005c9e4a9a6d421613f2388754650000000000001976a914237b3cb44cba77afcd04e849924642f17d3e5fe288ac00000000010000000001075d27832fc87c12a67b48f2da2c9030a99af3b8f46cec911e9e43ff37e5bac9140100000023220020a41748400be80692392defd675e3f896c08f81f4047dd4846d4f20a911875d80ffffffff64cc3d24a1599e78cc1d5bfe684d47d9a3bebec425ff7e9f897591bbf0c1897d0100000023220020317985d627feb14b6fb71ac5b5eea27801d683cbf7f8b3f4324b086b20d52702ffffffff73b400f87ec9c488cbbeba288d4a37be9351db399e5fa47ced92e778f5086cff0100000023220020a98f2883944bdbd5d6971d5d082002dbdd3a152fd224272e53fcd50433eec073ffffffff6280fe3a8189cdc61d1c9c2d1b1112769efc9567f78247db674bcfa08c7cf7940100000023220020c731bad9b467efcd2fb47d7776502d5ef0e52f9178686cab8d8d471c9ad544feffffffffdf06439088fe1336bc17e3fb87a9485b9b775e17350b0b4f8166109fd66fe14a010000002322002030741d0ac44e459b8f99a5d1500fb730a45669b017fd2e901e6fcef27b4737a2ffffffff9cfac58a6feb7aa75092bc43c99e65336e40d49961bbac86b91d5cee579908160100000023220020980329b7a70341857b9f89da815b6e8215a379bfca50564f4826d3556ee29c38ffffffff7a316184912f2201b1cd73b66fca6217e4f46dff415d95de2f9ab782b1d10226010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff027c7a5e000000000017a914d38d0f61c70b1ebaf29c1c723e180f4ee118b0a58726be25000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402206e8557f9ebe547f72a01aae2c038d3d056a8bd27a504b043239c964e9092ac48022064477b85584ed62ffdea6524282aecc89716148fffa072b6c2ba8fa93b3db61a01473044022068d8f93bff84c74670e917e79f1dfa2362c14045bb3013e9cceaaab5d6d72129022027b77d35fcbb845a2c52133a78e02ba686b8d98de68c1b1ac9e6edfee74ff71d0147522102930b12048526a220502395258f1506a82759a36b2d185fc811feb0cb539e57de21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae04004730440220058e6f9321665c76a34c14d1c6bd5bb83686db9e743488b48716b603be9a2f2e022078042a5aad89c5a5212fe7cab92a644516c13f51ae280d004d2b8e74636c8226014730440220219a159fb05db8fd246976d916f104e92f50034242c287c3a0fd97ea2077e436022063746fae573f631e4af68cc6f9b9097ba5d2af126f7a22c2379bec826e98de400147522102705685d6a2c23dd260c056b43e4476559d20fafcbfb8534a7e8689aa140d92a921031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402203ad02232701580f4644733a50a12f7a78e0376f062aa47020758bae20657a54c02204e6f1824518ab719e9c847601fec6831df873772c171f50160f28636b4f0b3c0014730440220197ce6e6b51fea1e9a93d2d6f6d4a3e63dad78784b224cf73442fbeba72951a002202054e34d111761726ba064f39dcf2f342897b336e2606e82e94de47cb42db17701475221028af5218108a8d499a225a5c3c462958793b260ee0fe77781d7e4e35cccdf978021031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0400473044022064b6ea3f8aab9006f62d65bdd884ab2a4c7cc42eedee351e75624a0d0dded4af02201abc2f5a677adc9d72ea241d6c97d1fd7d3fefd7d3cb248ef2398b0ebc1e42620147304402205f24cae0b9b637b3ff3607ec01e1cf571bad08d1e0ece7cef9e445bbdb81812c0220035be21e8d978218542c23aa572f364651225dc91719e6e8f89ba4ae965fb0d5014752210217989ac1624f7ce3a63a1d4c8f74743246e65e1330194e1fa5675d236366df6821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402201ff6d959aa0779c451e8cd4e03a468f7023c0189bc5036eaf9bf8d7749c540930220766f0388ce1f17a1281c41488230ef5c457c1670df4b2229c592add2bd30edaf014730440220626a1c6461c8ec24aa63e1be3d67a59837976d1200aa4746a7523f8815e8cd5502207c7158ad37fc27c22a5b56bea10b3f257c9d1769b39e76ffcb580087feeeb9b60147522102f64499da192bfc5bc9194221f199f41247cde97bc00d874260d63901e9556a5821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402206609b577280431d98a0d4c36fc25125044d15a28fa1af88cd00e5a6fd3158f12022056f46bf7ad7192f974e66875c282af0dda4b2d57a1d05c4c9b2e750a58fc5dbd01473044022061a4a703c71d361be0a11b175012656d54a20d60e3c65f6497885b42bcd9f04002202f34c1864351ca2f262fc1a70979bd5d8f6f9b3fd5cc431836fdede766ecef70014752210379ebbddc0048cc60a64266da7068573864058b97f457d96ffc3b40f2e4a97f3621031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402200799da34e85c1b219d8c34403c6a01b5b77613fed365465c0a68a903168f25dd022022e01684e353644a2cd7b03907518dd8f8fa26b87db7e666d7cf69c8b6a324c0014730440220715dc70d3a3a3f07659b6fcbdcea24c9d3c1b7472bbec0c6ead8e1b38a58acbb02202636df5045e20e9fdb7e5bd8fe3bc537968a1c7eb4666f9a2d04f4310a5840fc01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010150c9e588a93fa22c8012587a7ede08f4f95d1d8738e54e21e5400f8b197f493e010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff0281440400000000001600144930a49fecbc28d03c7fa77c1ff1df2c0ff85830d46821000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402201d521f004a63edf989add4d67dda14a690f273a3944f8a61961e586225fa2343022002977b50c82ea92254bd6fb9521a6e90db2c1fc46695ef69594b1c983972e8f801473044022043ce22666beb7e6f74729c74583833608491a140d41cbc5f631076b629ea0fa0022001d296fc7dd4bc9cd12c16ee10ca964d82050423652ecf152f4fdc0eca0f5ae601475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000102ad981e1313a5bddc4f4a29fea06ff6a9fddcd1fd33ba01feaa3622c928275bb90100000023220020163a89df2ba6a67f86a7bc502613bef4d5174892cc5303201e3c652246ae46ebffffffffbfd22fa2df7bbdfe01f32e2e0968ece0a29b277987056f551b93d3004e58c39f010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff02303b0d000000000017a9147d2e8decbed3facdfe5b14f0445f50aa11afee0087cea220000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c3888576870400473044022045ad30ba7f9bbb9bd33e8afbdaba789993cbf1b61f3cd83a623da98363225f2a02204e7b6a9629e285ffd6913c0d9a30ef2fb934cd81a291567ff34dff1c10d8caab014730440220261cc124197946e2e07c97b557d83e4e48d23bc57adf3b21a5c63d32d0faba0602203ca8acc7170cf7365ba1995850ec3d8ce34e9963dafe2b023a903d7976063fcc0147522102decec262b5c893e14a881849053148691ab4bbc0e137d9f2020745d12a00fc1121031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae04004730440220254fdebe31509260e2abf77d5d8cb8788a369cf2fe579336f735876e4689ee9802202876599ca63944d20f44943c9f2bb45fda629fb41d9906e61f183737e46f6e1701473044022058756a4467368c8cfaaca912b56f478e68b3fad5ea8fc990c5973e5f48088a33022045f302b6c062d0cbf08e8abac99747305c08669332b0e8cae346f3855ee0985901475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101160fb2a0f9f77ae1b98b1e5e67b102868b87e2ebb63b135a2fbfffd40d62aa9a010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff028ca00100000000001600141f8cfb2b0367480240453d737484dd739fd30df371f11e000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402204d7a440824d40ce84af28a6d45b02c278975a450a3eeb230eb8f69da0b0761ee0220189283151bb48a50716bd54f5d627220d49fea073b809032a954eb1610a91a92014730440220270d4b6ff8d9f8be7a562159b082b7f20f84edda394940ab159838eaa8b960fa022025ff256efb3d38f18916e86b4cc49269fd92dc3619485269a77fceb4e5a157c401475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101797404b188b968d894f67d248bc26200f43c8e57e081906902e5758bd6a3dcb9010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff023f0906000000000017a914b2378048bc0f5816aa5bb1aac48a6d0382073bb1874cd718000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c3888576870400473044022060d23235641883022f372dcd294ddf1d3e633551655819bf6f4c2ac20199a07302200c4f9b8bb8bcaadd07df3c9d95a6bf9a1d0712d5a043d331146837ec7cad5a540147304402201cd251e37c5ec3764f1a9c48eb17d4b5f38d30e379937b977a42c3d4350e6474022003ce28597d834283a11bb5837517368268097168f5b76b1fe7847f8484a7198001475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001013fc336e4c0f92996eca8a6d91fe16be7d8e667b23eea99b037acff4b16719962010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff02404a02000000000017a914f8a15730e1135cc997cb290469785e1c963cade687267c16000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402200b085bbc05d753285a35c931e834dae7fc671dec3d4f5c17c086a1eecd50c802022046de7f0cab05958e4ed1360794c50c50397d4b511b15c9623396f00158de8981014730440220497a9072f29b533899f585104dec48fdfc0277564adc423afc69068fab0c491402200de575260dc08cedb657b40d225e72a63860f298ececb0400784b986e5df7d2501475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010188dbcebea4b3542f2f53837d67d810381ef2f5d22a5d31742136150a1502f75f010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff023f090600000000001600146df9ed8feb7f2402c44660fbd7297177364c39df166210000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c388857687040047304402201aec39c8a53b1a7ff71a98f234f5824071b1183ab77545bd1d184d80238bd95a022052c3363d90b25908b91f63e3e6630420474fd97315ae31346e9b1612cb79e4990147304402203384d93c2007de91db3bf4764212f72a1db6146199cbaa233eb85c4c8cf2a3af022036de05c00f590cff6e58b8150d9b449ecefb7530a3e9ad8deb9a749af6d4aa2f01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101615f201f047302b3037fec97cefe1baa5b7ed11fdcd05140e544e761adcd1b5d010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff02f1b406000000000017a914216005484ee2dceb05bbe11fd4bc58a2cecf1e17873f9c09000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c3888576870400473044022055999d24de5b083feb6961c430b45673a59dd3305e843d7fb5a8c35edfa47e2a02203076a71895529b8ded98b2ce8e8bc5ab9658d0026817c33d7813f039b43911ef014730440220569c002b91a111ca8ebfdaa274150ff8278af7196489ddcbe2bf1a9cb31838a502206982e8ec1ad3ddc4a14857feb89a72c33477b45975ad1123deb9ae8002db18aa01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101bd4895f8d44d129119754cf1ab35b0a68cad5426978d685c788bba8d35dc56e1010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff0241140200000000001976a91491700783b24670142085015edd97cbb946e3ca6c88acee7607000000000017a914fa4c636b0f29205e77f63b6c7a03ba11c38885768704004730440220696343a14b30d262def8579e8eb2b278aaafae6417381a62e29d5ca8c0c25ef602202dff84e03ba9d70aaa8f8701d802e824eb87c6ad5222a78aa1df9cc5e24c2ff40147304402207d891f04da0d928282e5153f6cf9b737a5cdbb05c2fec35cb3b3971e65c934fe022017fc7f7f7c12b2a91bb624e578f53dc9c3ac58b6e16e3bbcd192cce477bb20e701475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000103623c65af62afa51103cfb510d23a312df507c772a5ce6f5d68bbb8b22315f4b701000000232200204172a91d73f29bb52410deace5fa73bd6f7a5686eea896b86642c8a298649c12ffffffffd27bd7f20278213caaecb622b280d649ea46f2fe6ddca093fffd449b9bc45e40010000002322002044a0f6a5d1c7d9addfa2803890b05425d44d18b75265a422e5dd88fc763516b5ffffffff719751e86fab1bdb32dc1ed79d939e8e870ae23cd5f1d89f60c983fe32f0b71e0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02fac05000000000001976a914523fb7206a765b023813213707c99c9f30737a7a88ac934d39000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402203c23a84fac84b92c9b6ceeccd0ffa82c2badc5351da3097472a9b51c5f9afdaa02204e030f9d224fb588935d57bcb40d606efe596d9774e871979be5966085b2b2c0014730440220595d30bb12218aebfb04644ca1ef3dcaa4c5e4841cccde18fb216e01ea2e5ad402202587a143bcccc7c7f0696dd0fca9ce109e4105a1853b794c7ae09c66f1f05db10147522102f8a59c760a88b11ea058eb76ecd196724465ea899ff79c87351227d922bc65ee21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402207e21fd62a7cf2a5ef0fd9663bca2f7df63ab566b90fb6e7a073469f13aa0b4e602207f9c236bfdd04b9adbb0bab913ab14a882123a96841636f254a0de7de8c58e5d0147304402204072edc05330c33d6bdaeba3abc589cda9e23938609e515301a190122a6e774102200c287ac1d2728912bc78686170ca9163524cac03215acccbf9cd97ef7b6c9f9c01475221033f85a543ca08f61a33646222fbe2194c08d5099d5aace6d0c30b9f8bfbbb0ce821031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0400473044022030ec54df8b2d683f2992e44bce7d65d35aaf634782a9777adbd7deed63295c510220530c0c47fee60af79819242536b57bd4f854afd0ec7b4c4ea983d98129daad090147304402207d88311f189c847c7445641a2ac76db3538125854612c7be3a4131064f88abf0022073098a431a27e4c1a7adc94660907cda8227158fd6024387a62a148a49f0fb66014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001014cd65ca311b4f60a44520d23fc91a95f9caa3eec4938303808e3d39a50ec3e4c0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02c2dd01000000000017a914216005484ee2dceb05bbe11fd4bc58a2cecf1e1787eb5e37000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022070c72c5137c8bcc4362023c82a4fbf982d4450c5cdc3afdc00a50a5ff261672e02206b8e26048df425fe6906af581efab713cd04afc2cd083b18b5169ce8cf11efeb0147304402204522723ac66bfe9fe581675b500e27d71e02c100d1dfe80dcfb2c7492e9ed4ed02201c2992fdb6b67dd5076e48736b77cc6dd42977fedb588e0aba8455f5d2b81331014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101bee76bca9cc8ceb6f7cea0f8a0a8c83c551c2a2a811536136c9f2ad209511ae30100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff0247920100000000001976a91457a2e92eebf2303075b3b2d7bf6e09cca8812fe288ac94bb35000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022025e5bc80d43abae38afefa55c80f21d06fa19baaf5a8a57550c81d582753e36702207b4ebc182e7ba1ca930b6a7ff77ddb05843a4a8100c644d4b416f89e5345205e01473044022025f1401cd0ef9d76d78755016ba75f4e39bd12870f4842e96005a350862afa3102207148b22d994475c5125258aa0f053ec1776117f6c59da29c7bea160db08ce4e2014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101fd1d7ca372f6b54acad56838cc87dbdc402820076a801ade34d4c0f1b1c2f26a0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff0270ca0500000000001976a9140f8d515f067b16253a5481a61524419aa4ef345688ac14e02f000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402202285e3ca5c02c4001200aeb2b70d9c06234712d1b8b638ed2f9459c89c28919802204123545d8fcdfbfa237e78a1986ad6e1ad78481f08d12c0fd23e626f6e3cc4e80147304402202256210eeabdd9ad135424a836b15d9aa7343520b6602bd1aef68660573ca89202204b6e22c9935feea52fc270c487cb6ee5789d21709d4d1fdfa3f42e7a72b00db5014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010129e5d7181794f06f00d6af584722b452d9a2088e8793833691bfd52953075b9b0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02afed01000000000017a914d09ec6c91bf98f97b5e60bbb1c1037c89c306bc2877fe12d000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022049b10e018e683d4828a6e1ef0e3b2f5113500cff4128f124a3f6e4d89023f23402201be77893bab66a267cf28eee773a78dd7aa916d613b52d4e4c7ead42b236262e01473044022030ecb4a31c8f012cf0c121f062b6c6a1a3adaf5cff946be78592a904dfd9e7fd022021a4ec0a98f6dbf50683a2e157b61c0577fcef9dae7fd677312fb19a84f460ed014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010113f1bc16f9bb45992e66f8229d31adc6e356f2933f46ca0851e7d03e060eb32e0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff027c000a000000000017a914d166883bd522ac40d639347a325d6e71cf678c24871dd023000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee870400473044022066062eb310f6c2ecf533dc6ecf72a49ce38dc40463e70ac904dd25c9a9f154430220644c3bc9c23d21e1350ed3fdea802954147f5abcad7f96554e37987168c0a47a01473044022030596b535a76c2f99037d258c113498fa531e75e5cfa37e84086e70621e0c77802207c596b24a374a3c2fd5311b17afd02dc8ea70a152b0bd5453a1330657e484195014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010165484c2e993efdeb6e965f6e56c1c4b916cfa8408bcc334f94985e850e48cfca0100000023220020625799f0e96d303dc7e9d9d49e593a4ae58ff0daac1baee75e04631be31f0080ffffffff02f63306000000000017a91469168e7ecedc34bb1cdc950156c20891ed8cf39287418b1d000000000017a914d14ddb5a247bde4d7acae74dc7ff616cdfd152ee87040047304402206eae9936a9161906b50abb238f3b78121de966e269e68577d19a765acf8bf9af02200e01427effc8c42b9fd6912d98f894cca341f4c629f5b1dababa383768a7ca5c0147304402204389c281f3a59b44ab9b3c18b10f53e62cc4970f6851c6b86592f17b8c3fbf1702201d163ed9062ba36ee7329faf975bf7be7b0ccfc8db8380665b8effcd85a406ec014752210361459652638a67e7e9e69912de3dcd0a7837ffd15c7d679d2d86cdb0460b36a421031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001023fb823e0d355b2a172bbc3e0a781f81dae51398b06d9f3c13cd95bf034a505930100000023220020075ff861e7d81f5d17bcc84f713275ea9da534b6262fa10cbab9b3cc45a3395effffffff4b855c4ff56435876d55e85a27a04711aff3bc2de889984468320627d71b4d900100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff0278ce4c00000000001976a914eadc694ed43eba75e02d9633ae7fe01a6d0fe60388ac3da680490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402201aa1567ae2712e35170ce8fe810fd10aad3810c82956bdf585d93f37caf0fe94022006e6c0164003d4584363b07f755e58cd77f09ec6284c47281007e803a36a783901473044022021b62611318209f5857f5ff67483ec0aa85fd6e0a53c1ab52b53339c9b5b491702204ddce8871bf64fbc2c3568d5fa9648f33124efa988bf738112a7c08687adc0ab0147522103a6d250e9a6f9f0169c7013e80cfe14f13a07d5c5a26654c94db2b0c72ae57c9b21031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae040047304402201bbc003291d0d0f9b5b90bdee011b3cc203bbf92dfcebb701f01efb15354876702200415a2e0013662564c1c60efd41c734a72985ef278832954c5bf6d8083ee9c79014730440220644de04c1950d9971a98f646a8461895dee1e4536045b8dbedaaba57ee105b690220177633a82feac2009a074a663fbe103c68aadcaf61dedef81aa901ed0f66aec101475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001014ce736d309b74c4a4ef5bb334f6265194a8c2d52ebe3c1a10ebba577a4a25e480100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff02851a0300000000001976a9145e91db82e090731988bc81b40df0da65efb5c44688aca87a7d490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402203f4b9e195fe0a8c0c7d42755cfadb39cf52c4f24ffe59137996a54454ba45d15022001a04f9b805d3035a4cabf46cd0debe02ff57ee6606aac9bb25ec3546829be6801473044022078dc695a26cf4b723a21f24a9a5f93c8a7862498c0d4ce0102171f3d61422f9002207783dfa55f7c69f68b15248a6d6071d50a220e201265433a40f11f9cf047fbce01475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101289c76edf7ca1c2a0cbeba7f40ea596d80847eaf311d38751dd0b70608aaac810100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff02b1810100000000001976a914d3b3372789a363571eeea8ab9257d4ec8ebd462388ace7e77b490000000017a9149ded08be3ed45651f4a568824ae553c72180d763870400473044022020542e060f00b29fbe3b2446d4ccbab178bca9f7e23d62b12c60ca3f46f9f60002203323dbfdf6e79323e2831be1ff1da8241c43c570cbf751275fd31b781a766a5801473044022048d3e01c9dd1b250b1240e1e8e8ccd88ecacace487ee1914b9be68b3be2dd12602204568fd5cc4303f48b357ac5f3fc8dda05874926c9c86b9a76528351468c5ada001475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae000000000100000000010118af66401be7f7033c10fd5a7438c023991682a8985e3d7a184d17d8073c4f8c0100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff028bd601000000000017a9145b974bafab8d92a170eb7ef79f0dd6b48f390a6b8776007a490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402200127f14a890ce82ddcd2a8edf4672968d0bf3bc752e4d9c73ac6bab6155a6ec102204879c713f35a3470d3aabb9009859d7f60fae58346481302426fa55eaae5a7da0147304402204b8d561acddcbf586d54e8a1eeab8d43ddf63d5f0705a6d171ea1e9f535651dd022012439baa985a8870e0efe49ea2a42468dcef30f27dccd855a6eebd70f4f5831001475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae00000000010000000001015910f90e69bbcdaa2be42760b226ae45aa1e257afd27133b3126b3ef7426bf7d0100000023220020f870e7309e4a9b49559d2a22fc5768625d755dd2a22cc86d633076b90435e6acffffffff0231330200000000001976a9141566c079c6c2bff50b26d30540ebd25253df564988ac35bc77490000000017a9149ded08be3ed45651f4a568824ae553c72180d76387040047304402203a02d950ad20b000aa26960adf48a8de649b740bb23bfec1a177ece4b7e7da5802200ff1620570fb05bd63f6267009be0b589f218a473e2622c7f1ad9906a74b759a0147304402204aded3a343b1aafa2a41a5d4cde461ee94960bdd94a6eb7a64b3507d4f02629d022064ba9490844202b8b46aaeedee3ba21713e493c12d32326d8efc22b9645739f801475221029936ad3858031f198d94445d3d2f4afad237f46a3a2558792fef335b106a905221031605be5ced2f1b0130bdc7eb871aa5990057b744387b283ba329a2280035f58c52ae0000000001000000000101d418a10586d3bca72b29ec8fd4ff84e3c4bd7698c5adc1c30c86b60b4855b4040300000023220020b2d5449aaad66e228f656dac84d4710e437761fba1a079383e1ba7d32f856a41ffffffff03de30290000000000160014eb25457fb78c0ae4294a73dca37bf881066b707febbb0400000000001976a914d84c25ca5cd50815b7cc77e7b0902f558119a73788ac2dbcff030000000017a9143dd037a2e8f90568a21f7ee633d93a66e970cd2c8704004730440220043a8f80494be712b45e3b844570db3f409c00cd5b9eb1231553d7f316296c28022066bacc8f0f15ac041396b2c7956d5fc7d48258cb07ea6120928320efb777c02b01473044022028179000e829f81f9b5154c6674ef7b75d5e36de2c0a38394d1c936a4bfaafc80220593a94e9d66207736eff954fda3960eeb908d737905e3a539434842e7bf9f81f014752210240df048fd9e78aaba1acf33fb7bfe0d6d641d892fc9e48bf01d1d488947f9c6121038a7ce7d9e2dc91a89a97abae71946b28083a75edea864618f997391c35351fb452ae0000000002000000000103b9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e201000000171600140311fc83c9d8c185e8b7f8d8bc8d46c1fb53b5e7feffffff5c1aa5337584c46586ccc0ef61e54a435ca9d2c4eecddab00acc32d13c014ed1160000001716001464bb7a4c489d31afb8b2ff55371b30fb49f74b25feffffff2d7be6d797768e90c650be12cd8188b1b8c0e3c0149365ef659dde2e81e5a68b0100000017160014da6ffa108a7a27563420462a80831341cc23639ffeffffff014110e70000000000160014c603e42e5645aa5c4eafd39dd3989f1384b210380247304402200735de7b1661eaaaaf251d141ab4d53c13fb904f460a74261c3571a313b4529202200b2512de5c97be006e1a496cf51d7e166d20ea4e8748241526fadf25797867360121031eac17c65d8c03c6a827a94f71472d4a2da5e83a558df4d56301745b75bf6b1d0247304402206840816a3209ebc8d26e90932e53cd56e39afe284afc44c78f4156d77db7beb602201355943342e4e57d0f0442445128f0fdaddf85d3a6566320ce6b6bf5ad786351012102d6b54555dd8d4655da9a01caff4e6a3ade6265f49f920ac8198e533a56d8b1a402473044022052e81eca80e7b39b119e1cbe7523346b4699faeeacc04f3fd6107d7f701532bb02206a694c081795d340fd19959a2039129b58a717c49d51bbce788141aa684b695f0121038b46f34f2ce025cf800e25359793df27fe193f37f73f77c7ff4b4761fbe284a749a00a0001000000000105e3fdc98875ece788a210099dae1eb05e54e1c36aa7ab0206db9dfa7916d6e40d010000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffffc15eb6908822e48a6509baf5719ec6bf3f79b4bb9a1dbfa4261d283dac1a69f4000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffff2ddb79166a07798803540f3ec8a3b6997c53b82c4fdeb08913dee140d34fe00a000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffff6a534212d54f08af89b267211356a6a865162968684395b3628902d50cea25ca000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffffe26e79d528ab4192ab4907b6d10387a8464ee806e74b73edfe824b1049cfe686000000002322002026f7a926c9b029a660e3c5f7cbcd83540356f432fecf0fce71aa3475939d8318ffffffff03601823000000000017a9144be03cbc2025fdd094092172951fd4d528ad078087d859000000000000220020ca74f0118ed61fbcf2d78186026f522b3041e9aa802e8cb857f1cdc669396cb6410b00000000000017a91463ce934158796f1e97b728b8bfb33075f94e270287040047304402203204c2f850b849589c49003351f24e10aaa7d4cc2057d64d2e282a7f6bbda1fb02205b768d0792077e2dee004f92ff62eb7f33d11170875611b8e853d68a0e42baaf0147304402203300c761fd17ed826469f0902f8834014f73106f800fee047bd725c9df7a33d902205a654c74eea467803361f9fa1af895350e727d8a2f748b765eb415989fc10af8014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae040047304402207282d1afae486b61e27c6615468e81e160ee8a5229b0c111cb575ffe7d401ac702203c8b71eb6b22ad2a396631a13e680561ee95d15a1abaf45265dac7c5ccd21137014730440220043d698393f25ae91e00875c64f466b64f66166478c8ca04bb840881c73bd805022002b981b1a190cefbdd1b839318ebfc37551ec43c1ddb6825efddcb73a75c588d014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae040047304402206a4e95d566b8945e2ed9cd2c8a6414bdbd660cd690dbb6fb75c6905dafaac55c022008b370205682cae5cef2333af75743fc84a1c0c4317f2e96802d6a79f825b3da01473044022036d43292e30eacf61e432eb006710097536b68fa58c41d05286c02813fb20608022027cf7c2005fc5ecf6af6d2e1629f0b77acc2b3e745f1c2a0b093e0d1bf22b7c2014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae0400473044022037edcbecc90cf3a0f7476debc36ea8a4d03c9473cddd82cda2d331479f02aef802201193689046a0192f16c666fc71e997e6ecd2809bba2a75accb0fd657e3128bc80147304402201d84ef38de3577948ce902eb11bb780253837a67247aa8c5ed9c9c12b91500ca022065eb17a6d9420dfe38ff441765eb91de46a0c03b4142d11e5396157a229540d2014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae0400473044022068185b7bda9223110240c8e8d0a8b9237bda239c9dc034137ef8f808394b50da0220338b924c29e667f397eb384555b17c34367e112cf81a5135beb6f403c54fcf8101473044022006e29459e76b81649cb6330177dbfade0008a64c8b2c4443c5629d9ff6db7f110220583fd3d2ffd7cfc2c6d18262d4b5c84024c6b2b90cae6001b7c7cca908b4d9e1014752210304a882e00f92b1e55c4ed35703ac9d95e8dcf0e3dea52e8b770e7c37defa0d932103e925d4c0667ffd27d10a59ef79f314148d9ae2066fe009fa56c13efa3465938e52ae00000000010000000001044a8b56e1962a0b2c94c3800fe71ec04c329635e43bbcb17839634d642f032fbc0100000023220020a59b84aca1f4d9a51d4595388da7d22e121d7bb7ffcb67da98cb40fa91f4d243fffffffff692f2426c2f584162a0136c67773c373354e2ba13f4ffe119a2666f155cfeb9010000002322002063fa000bec1d11f89377390e994772356c37fd559aa49d886d763703515933e0fffffffff1fe961180d2ec7bf4e2414a095ef41c78d06897aa5e6f51878613f320a113632d000000232200200f32685b92100028eb8f4ce8c77f7d7ea9508a9ba710684d2f4e33ea1f3fbe89ffffffff1779e5074c3f65729ab4a79cb3d5fec1562bfb0b9ba7724b049f4589a5f1c9b00100000023220020de087b3b14ef11e58571e096594d53a4bde8a7e20ee08473ffc53cb253cd3e0dffffffff028c2d05000000000016001491c4a6dab43ce68c4f89abe65faf4d9e95f3241dc19600000000000017a914ef0f351aab590671e6f5a09e8482fd0e298eb9f387040047304402200acd2d2013d84cb6b7d40ca908714c116fde1bb1c74f2f8a6ffe0aecee3ad68602204f738d98f5c66d8a72853a1670c09d60a9321ab92f8b983eedc0a12044ff5f600147304402206c286cedb25644f0d487bfbd237ee4dfb2b2828e5d30da9317b5e7a1170ac34702203f300944989271aefd0764cf822ebedfa44f72eeb7199b934fb09e55f82af3d101475221036e15878f73ee6ba6e52ca9127b5ce680aee620637d4c081fe1bdaba85cf434fb21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae040047304402204215d55844067f8f91c79bfe725139d77799eeb75845a42982ba77acd4ceecd20220063f3752539b89a677ed3cf0c0b2adba9a62089e0f58a82a3364a59035392fc001473044022050b86215e2a3a8d44e29526eae4d22fd580477ec9b38d8b8139d29c450b8765f022053b4b58383a5bf6729fffc30c49d3003c32264b109195d723594edec108b41930147522102f1ac4d154be5e2bce2433bdacf2a8af4f6f63a3e1c181ba633e6df3f6eaa823421030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae04004730440220725469242e22e57824f492aa146232e38a912e1c690e45c5b399ce6b7382b16402205e4ba850ceff50fb45f4a023d1da01a9842d519dcce1f95dc310fd8600f61d1d0147304402207d7fc299303a905fecf1b5f50fdab84604aec8f5a4cbf433e5a5da2ea281bba2022062510bcf49055cae783348d6396de273e1bda0eb73bd3326126d898ac1a550b501475221037372b30e368ec833e7e4b6bd921ff8749b6550ef151582e72df7e04f80d73f3d21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0400473044022075da9e6f9bea42ebe09040cdae396fce8559c0f48622273cdf8fd00d6feba71e02203b1aff237787b7b6d015e9ce5d671b8cf8c7643d27e588fb13f883e2c661a2640147304402205a95bf6ac91584a2f91ea0056cdb298c39cd1a861772aa15fa3affd0094c7e43022036517032a729962846a767abebc9606bb97b6d041aee9e19cb97424ea8ed18c70147522102d37a2950c3b40b1a8524b652e98c07ecf11c0e534443fe1c9530af7cea47416f21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000000101a93fd58bdd92f729f35681568f309bc085dc58729131252295fbec4feda9b94c0a0000002322002028cdcdad4c4a07bb6ec5925f2196c4e293898127650b3044fbdb6bab317a7099ffffffff05e47b14000000000017a914f18c71b4c05d47f9d0937c523f868b1609788df48705231c0000000000160014c54b937eb1c23acd2871c9483db135618e6230addfe00500000000001976a91465ff8034faf804a96168dfc8b0a278c4cac1b20188acf4ad2a00000000001976a914dd8cee99729f48d8654ad3cf9d3c03a27f58d32288ac48da474d0000000017a914ba695f1c0d90e1b0fbcc0f1f4623b815848a51f2870400473044022076d0322cbef9e3d8507be6c4fa57111fa7282b5bd7398b7e859d7363ff213ad7022014f899b590ee65228d8a4ebd697783646450dde95e22cad6a0d5a341def1d0ca01473044022072f4baddd2f6b0137849de112306e9611e0b132376f6f9567e63aaf9959cae000220532c9bd7b1ef34e4c301ce4ff8fa661ec45a02b0373e59ae097acb49dfe6a3910147522102ce06807bdaf64c3f40d3e4fe990910c82e8b8c3ac8df0c3cf373fa72823f958321039332e240be260cc87f6b1bae52aac5e37fcd61dd89849a8113f14d977e5f39dd52ae0000000001000000000102ccd56efad6aa114233becee4e04144a59facfe17354561796546242479dcaba80100000023220020bea1f056faf72a9113141e719b4c3a6b1d81b85ea96d60ae9c7349575a32392bffffffff1820028816f44c87b40c923ba2e48c8f5bff4c034f0a80a8b2c6b6a6b753cb4f0400000023220020935a5e103cb999a96341619d65bf0c9a9bfe21fc3635af8921d558acdd386236ffffffff0290ba0200000000001976a914c2fb9f54d651dbf0d47dbddb59297ad13bb71ba988ac7c7f02000000000017a9146f8c0a0e1f5241f4f489b5a79227b211dc71f9cc870400473044022022675cc6a29324fee056d2f96bcd4ca9b0e1afd067496571ddd21963d4dc7aaa0220787dd099ddbd2eb75089b0a7f71cff678ec14a14893f58b428a08bb583080011014730440220051cdea99331a41fc92144060e7ef518bc9d3f33926da22347cae9f1e8b9236e022054e25df218205e5fe2db4eb5e2c8ffb852e87b12a5d03fdec3986c56394cac0a0147522103434c38cba705717e6d7a816a5fed21e968ea518f7d17fd7335597584d57b70a321030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae040047304402206ffb69ef3f87706e66aeb750f43ff17dbd9ffd8ac8dedc21ebec08985890380d0220097da5d541c03fa68d05ada9d13329462a4b74cc305fe0f21c255ccb07151ac20147304402206c4dd521fd9415e60e297fb480c022c4d30353b385a043e258cadb8ea1a7e084022019251e377f292630e45b5ba48564a037886d5e314dcbc8bdbac9cad94efdcbe80147522102a020ff50287b268998ea713405b8fd01b0095f7d2029c79f4cdedfe442d4377521030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000000102c2eb5bf3574c9b573ce06d49316bf8d6b24195082744cfd54ea4f640414384010100000023220020644dadb488bd7ce9bb6b648b71fb66a5116c05a27d4d6064228833852067d34effffffff3d3859feefd3a36cef5271750b317acf756ee3c853a2af83307841328100a4f2000000002322002063fa000bec1d11f89377390e994772356c37fd559aa49d886d763703515933e0ffffffff02a8b90200000000001976a914c2fb9f54d651dbf0d47dbddb59297ad13bb71ba988acd5bfc1000000000017a914aaae0681f36d79489bef41e5da5978a3a8c9607e870400473044022020cf8647ac61f9012ebd3a924efa4f14e0877c1534b4bba4a3118d5fa8ecbc890220341ec29f0c700366a2ecb14c5e9253573e42a6350b5d69270ff89fa915b1fd910147304402207e37c87bf76d6f6edd3174ea4145f8d621e20ea5f48baf35ad6254dd842bb87402203bb92600c254714708a91643220d44b79e211230bb916c80e61ad162b50f8dea0147522103a2658911a3e1cb0f28e3a277f069ff76821bb16b518fe8bf181eb5f38b91898b21030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae040047304402205747334cd99152b0cab90b6e8e3f5640c84f6ac4888ed9a343d8588db6f8d12202204c303883ce52acd00fe2c00f17a148f8a70cc216d6633e05c665a5d8bf1397d70147304402202bf4e42c057aae193e990906cfb190fb976e13415b130187e9b0a1afd6bf11e70220450d7cab0f4dc187f144193674e3061e1f06aa0f83b2623e11652b025997337e0147522102f1ac4d154be5e2bce2433bdacf2a8af4f6f63a3e1c181ba633e6df3f6eaa823421030a656220f6aad0545ef039c919d6e957b614e93c441061e99a33dd7095773bdc52ae0000000001000000021f9fbf49e4f0e991b1930ca85ee9ca25a89418002aa574bf22a8cb8f05ecd64d010000006a47304402207c6d3ecf87ad81a32a208c2986c0968a61f15ec53d939efd6023b86b410dd51c02207db841a6db26bb66ee9eccb8aa2e2483e50a0eb890b779386149b9d7652733540121027b01dbc8c1809501aabc042b1784cc0ed89be050e5add704276f2ade0cf252dcffffffff1e11d45502179bf4dc321d7a22fbbd9ab6e5a08dac8d70d020d07ff8180ca06d010000006b483045022100b4c84de2862eb781699f23e9eab69e60a1b3f6298bd06853e054547f6899a7d302206b384381631f06dc7dbad145b0467d5872f0bbbd0043f02da3c2bbe0340cac47012103bd58e86768a83193f704d8afc962003e1b96b855eb11e618be917fdaad7beedaffffffff01122b0000000000001600146656b8588518b4567960fd1bc01a759d1408ce5a00000000010000000001013a0909aee850cbfdaf62f2ff02a9d6aa53abbbea8bd7c7da56cd30dcedfecce90100000023220020290542e6827510f19c75e46b0d9b4129ce39b5df5d83fd320d66fb811dc84f3cffffffff024a9b00000000000017a9147c7ba11a9fd28e72eaf877a2b4ac126062523b8c87248fd8030000000017a914919174b02fe93c89e7cea6728719da9a021a59b787040047304402204909886e91fae2b84a60b3183cb83399e7b8359f50470d902a628c0471aa568702202b0d02570f77f255ee89c539876ea774d97ae0640aa77cc4c289bf9c46ceaa9701483045022100af31ea01d6f109938b8ef98f7e626b9b341e6268b85c9194b25843038d81956102200edfe4f31b1974fc094295cafe4b96b59165daecb858978a82d718d92513272201475221027b09d6ba4498bb3240fc0231755311df0b00452f0907634d4a205054504e994e2102259dd307b62bb668d004dfa23363ffe17c0ee48e8c13993f0b25d38f0567c16c52ae00000000010000000001013b8e6412a39df1734828a924d1025281447a07b153afbcc5b556d9ffed89f9940100000000ffffffff020bbc07000000000017a9146805907146ef47c18dc3c2218219f67f81493b3d872400de0c00000000220020bbe2c54242f02d7e9b8716ad86f1bcabeab7861e0b280f7422d051f2f0539f0a0400483045022100e1e47736ac0c9597a11a62d7e3677b3e73866075cc6b0917fc94571af72edc9a02201e9bc17f6628beb57b3a93bd93776d33462db3623a95ddc83acdaa99e54e91850147304402205663e9a1a2a1e85a7e3b5e112d8d8c826caa78a4d035ba72e8a13e069116b6a402206b22657c2671645156fd3f6b0b2432f9258b92f933480f7fe3dda772683ed6a00147522102fa6dbba257ad59e4311b4004e99450c46a21e9f60a37870d0b9dfc585df74b122103016519f248fd1c7330d522a50e4cbb642c607e1270112ac9d5c9307652dbe38052ae00000000010000000001011ca1b80ba6f907e1b62fdbacf53b544d87f43a8e903603466c1b094cd3bbc10601000000232200203162adba37249d06ccafd769dcd1a0101fd8f4aed06aa46b6e6c488d98c3503effffffff02928e0000000000001976a914a917ad38e81ba81bf29127574d240b4ec61753d588ac26a0d2020000000017a914855ce15fa5152ab3e4dfd1989cf63a5abe8edaf48704004730440220294665f398f0c6974efce5421814d9342458cb87a041dee4aad100dcdaced230022052dd4e3252668b47024666ab456b4dc1656e4f9bf33a08048e789366571ddea1014830450221009bfa36ad0f8a55b6c0b0680dce44f2fd1e05a409688900df9fb964d358e4fe5a02207e929a074f80cda19122986d71b5b6ecf235d8c92230528417d3a63993d30fd0014752210343030c6b53ff495baab4b3cb65e974e5ba4d025a053fcf9888fc411eb175c4f62103efa70e806c0f9951d8e4b55d6ff3f189c9225342db12d2112cd473539a9e853852ae000000000200000000010118b801e4a7fb04eec7a9b81e685ed2305157dd2613dec44ec378755b2444ce430100000000ffffffff026fc34f0000000000160014d878934ce2df135f11b04c492c372f01dbc94355765c060500000000160014a5eac350090592f112ffb58c17cb29623c6ea3af0247304402205b4895b31ad5be75895934d711a9f9e7ba51cb5a83af5872bd3a3ef21730f79b02203a074b91a56a8ec550711bb9793b43777d3465c7579b86080e0f35dc522b733901210305ff687062ec3b7dc7852a3761c53a3a342d5917f03c0bb5688b4c5e8b10eaea000000000200000002d2a9dd3294f4250432506cbefe061cb930bb10e3f05d20733c48f25f52fda2966a0000006b483045022100cb0279910976e73095f15e07e0189d8b7b8e86552baa6857a1b014c746f8344b02204db43405c7d345b409f092536d8d049766d8c87e82270edf052b94033362465f012102bb01180dad4649e010ce72677d7272148004197eeeef39864a901e04843af9d4ffffffff49ffb3daca4ff92868d61e0f5e706284c9956944bc42cb54fbb80b3506c55a54010000006a47304402205325f4288462a59c14e9de290f39e80e758d0bc2201037a917b756187e683ba102205e03a9c2e70fd35bdeee05e3362073372276d3ed1c1ec452c6bda3048ee3973a012102bb01180dad4649e010ce72677d7272148004197eeeef39864a901e04843af9d4ffffffff0200bd06000000000017a9147b0bbf2e7c07eceae5628f78bfd54e59f5c16d9887f5583301000000001976a914e1da2d02b2feaef5329cce5d92e1a5abb793a51788ac00000000020000000001060691bc8c20941dc0773a04e214bc44fce922158ec44a31f904c25e8edc16038801000000171600142339e07828b13ac6863f248ea250cf38220bc49cfeffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41080000001716001494abe8e499b3391d50d1e897ae47623b7464d13cfeffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d424000000171600149fa1901c34c96799183ffb6340c5f1cd2f698c97feffffff3644628c48663f29ae873979eda02ed935050bcb1443e750b5f68a2bc0f732980000000017160014251b8d91f0644ceaa3e9a1c4b609e4b3b244bb08feffffff9cd3eec1b35bb776401dbd4a5c393e387d012cd65eed539b8728e8adf1fffbee0b000000171600141a89ae5888ff2edb949a4ee1054b25bdce9f7270feffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4872a00000017160014fd39b29b7725b6d698f35dcc7934d1819ae02517feffffff01728b41000000000017a914bd9cde0d5659dc0b9194133659e510c6790df9c58702473044022008ebb6d61b01cd6ab43713d5ea2e050ecb18af7cd26f7a94f9345500e573c4690220500d0b1e47da61dbbbfb72f38f82a765fad4d325741ecdccc3bf92a5e11ea29e012102b23aa86c96383716f3532c4e81578c02be9df888443fb229113d4769851dd0a102473044022042fd4a005c3f657d55e684ea789d15de78079e6dc7bf581f09169b12c6ecdf7c0220397aa7b6bab5ff012a13d013ffd31c6f28712340fee47b5922d1a5e916b551cc012102b69f73ca4fef5998fa3798ee6963fde13fd2aad99159b13acf1de6616cfc37760247304402201920985a054d57e11ddc47560de2f91e378c98653fa57c9ce6f18023cd98b8c302205a75aed77fcfca883242e435963a8aca8f05002ee0a0253fefb8ffe425e4e6a20121029828f30558f5d76ab9542ab94d0ff8b242def153b2298f022ab8b007ba8161ea0247304402207310349d1f51c0a6657accddda73d4b0b3992837daff576c8275ecb575b16cbc02205b9132cbad520a529b5351a9565793c7ee02776bd19a58296303a144d44221d901210323ab817414c45df19154487d60b2a52bb1a75a90a452744026b84d79debbffab0247304402204a619abbfb172b63a9986558a39925d1b9a6bd5e50282e51c1bd2b79b48133d402200d9e629409c2303ae333e11e19a9d1c618568c5bb67291063614b849a330a02d0121036a9853fff7b65a9d38ab927d53da4b6a750b88a49b275a61c0c0098a122e66f40247304402201188c41f979df55fdf86689287d9cd1bd92184038410b9e0ccfd28ef84d5f071022070d28c3f747848e9a97d59bd1be967cc4404c2204d4b2eb736db1de40c42f5f3012102194904e5dc2ef647dba30d6561fc0249b4370d3bb2cbce53039b388719a3133349a00a0002000000000101b4d3d24e95ed788fdc94154e0017d55932a228103d134b8d538e43382145cb1601000000171600149dea825c31ed948dcef91e084b64cd480f05146bffffffff02c0450400000000001976a9142f0b8a4adec1a54363b221e42d7eb38307e1cc0a88ac67ecb1230000000017a91406f19824aff9b90bb52b859f64f27c9837ee3fa98702483045022100ed02934f1e0251d9efc411a8757a68e00f5a5a6368d898cf891331367291cdf502201dcb36610a008886130135f4e2034465f59230df1a011bf0cfe81be7be39fb0c012102bb67812146516b1bdeef5d54adabe66bb87a86fb29a410650ed898c060b87a390000000002000000000101e42b8728bee10262f0e98d3ad6bdffedc6cbf2d83997cef401a1243e83b9f26b0100000017160014a275e7990a2a2d7ffda637613b29e680b2cc7048ffffffff02b0ad0100000000001976a9142116f8bdd248da90f2320996bff1856903ab650588acb730b0230000000017a9145dd6c0c595c2ca99628919476cdba074c61e5e1d8702483045022100f361dafcec3f6327f554962c85bab9bb510367f436b86c7751527986996d15f402207a5fb822c921e670f392575e1893925fc154a57192fd41fe6720ac7a3365235a012103cf303d741b4abfcc977a868961e5f3c790c8830bf4a018fd480cbe2077d0d4ec00000000020000000001015d0dda4f37bff1acc602a39064ba95a84383b30c397289510f2f36ff7762db170800000000feffffff13193d01000000000017a914929173ba8ac45441e7b624084a05fd18adcd47598753690300000000001976a914caedf1a3b394c3580f7dd7373b090dee657effad88ac876100000000000017a914c077e94bb730827a1f2ecd9d43baa8a46859ce95872db400000000000017a91437fe3bbf05305553b2f1dad3658356886ad7e93987a44e800300000000160014a99b23b28260e667be568e2ae681dd1db11a0d83167301000000000017a914dbf8883cd3d12d8bfccc77ff66f8ca89a087eb9a873352030000000000160014d59b4e18e119bcbb5b160060508f094432fd37e12bed1a00000000001976a91426b24df497d1ff443f0fdee0a616bc38f7cee15e88ac8ea815000000000017a9144be03cbc2025fdd094092172951fd4d528ad078087f1890100000000001976a914b286743ca3722bcc3d1ddfb62833c0825273012088ac24db000000000000160014f26f160c38cdfaaf3a99122d035b33773bff0f6488c30000000000001600149c154adc7296e985c1496df950ad559b41f94259b8880000000000001976a9147280d4626ce4c47349e8fe3b3f64cf5fe3f9536388ac2c9101000000000017a914148e5339904209167ca11e79fa0ad6770e3d2384870dc9010000000000160014bed5609781ad77744359f57e0751596b2ffa5594886d1300000000001976a914e7ffcee6842409de251fbd2c6cc3c4628153258188ac907800000000000017a91428d30648bf12155a60e07ccaeebb08ef293f7f90878dc567000000000017a9149f5c6827825feb1c3f9288b1d166681c7af58439876cae0100000000001976a914b0321b47f25c1b7a7e188ae12099929b7443176588ac0247304402207304f3a7bb95e0bfa3977b35fba0037bd2c8ac3d2c2c110f27ed301e48537e3a02200937eb3ad40e9c98c9cce3bc4062fc9379809e90db9f2b4b7510fa89dc4715000121025c054f01164557d7ddfadd12112069f8b74144738aff79b07992f70cd3daf93949a00a0002000000000101f2590ac7b6ef49a0788238d53b162c7d9c94d8b64a8a6b4ba94d83106c46954b0700000000feffffff10c9af00000000000017a914c077e94bb730827a1f2ecd9d43baa8a46859ce958764c30000000000001600149c154adc7296e985c1496df950ad559b41f94259c1110500000000001600142cc830a0ed745fb99e0fc2dde0689e953fc954ab3fea00000000000017a914929173ba8ac45441e7b624084a05fd18adcd47598773a75a000000000017a91460fbcf4ce834c2d868941c23d9e2e9ad27788c748789420300000000001976a914b31ba4f0d1b98e83d36b01ce105dd526d70e018388ac1ea80200000000001600148bb2dc0c0e85003d37da850e95aa87de0464bb05db7eaa14000000001600145731ea6d9db98def692a66c9af12b4f1f7b9627990b805000000000017a91498f51cb03c0f296250ed3ca10a1f2694b2a671b68760f801000000000017a9145e9054278e373813d69f7ffa0216a076b1ccda8e87a487010000000000160014b2d290761d47f426f7871ff6889bc2b4d38f6dfdbaae30000000000017a914d8772c11461650580f255793bbe17c82b175c2e787125d03000000000017a91466c0f605bd803756de73beccb864269a9c5609058777e601000000000017a914acec067607dccddab1a2d61a875df8a8195cf059873b4603000000000017a9142edf2081100a4f740752ad988d69b2f0b646cf4d87daa101000000000017a914f7c1452550ddb2c4cdfeb15e0b7855b8d1a5d8e1870247304402202fb5e45e4b10afe706a90f60cf58884d9b7a39324ba102765bc468d194082f620220640056e74acdb9791f374802d740122ee1d5e2fe6bc12b1accf304a06431efe9012102d3765c5d7c90a4fa00f2cbe36c7ab535336f9d5412e65e947560197349bb0ba349a00a0002000000000101f5e9e7d2b3c26138fa334fa7cf72ccec2c9c291db5865dfd56953f7ed182c4b20700000000feffffff0cbbaf00000000000017a914c077e94bb730827a1f2ecd9d43baa8a46859ce9587aac30000000000001600149c154adc7296e985c1496df950ad559b41f94259b198020000000000160014e4e0517d3e681b9012f266a2f16a20392d906fe246350800000000001976a914e3107e925d111cb5aebba2917283a180dc0499d188ac03f9b10700000000160014d5936a055fcf42d46c1e4b6c00d5e91f99feff1de8ca1b000000000017a9140c13f185002fb10626a9dc9180772318c41e703787861b1600000000001976a9145c01907f3db32036450ca97b9d14ac70ffe05da888ac0f3406000000000017a914c0293c44cd61080841f9889a12e5ea26ceb06060871ae405000000000017a91438266e6a2c14fdc3a5e5d5234ae32778263d72478733e60700000000001976a9142bb13f48cad31138bf275e57e4f82939e1a7e75288acb85e00000000000017a914009a7e141f8588a73542655e5d90570ca1e8b474870e6e03000000000017a9141543f600a7eb5cffaa624670afe6fc3e109ca13d8702483045022100bc6ad853a772ceb9017f679dace1e57ed43718f0495b6fc386b888eea3eeeb1a0220158315735a648e703305fbbbe22dc61d0a50612db18de638d1d48c949ce0b00d0121034e6f4dc0cd5169b63544abb8aa5818051af481dca82eb64616f6f0cf3f4d6d7649a00a00010000000001021474f6397708e3ec58f72fa8d4aa52543fe64f99cb4b33ae37f532b5f9f7c291000000000000000000442b8ccd60549e7456130b3747dd5e9fb0aa462457d78527ab6dfdd2d64f60ae000000000000000000013e870e00000000001600143e06e2a98c4aae3b6fb45115a5853e0940b881cb02473044022064ff2227276295bf86acb2e7880de6e3678b4db87e51d57d7fecddc62831941702202934c9a534b929d641479a28551d77bfc79c5f27e3b3408be9ab10313d43d27f0121037ec5a6d31ef8ea174dbdd272e41e987530c0b9715f84bcfe9acff5aa25c535e002473044022032dcc2ea4c0035c1d493cdbe25b109f1cc54d384cd494c3527e487ce0e250b6002204b5353e4e3f86e6a4eab6d378d3479a5531e7e1023a244ac3de1e5a60428a0ff0121037ec5a6d31ef8ea174dbdd272e41e987530c0b9715f84bcfe9acff5aa25c535e000000000010000000177f31613188f1b214380720fa8686ad9780370a339a18659032380f56d38e9f5010000006b483045022100b12a51472ebe3723a804c68eb60de3bd5395c8e689d9a1aa3d72ba90412f6006022071d385e521fba48a080ed5a45393df3aded86c13775b48b118d32af1bd32a3090121035dc75274decb82edaa89947daef2fb8e7a0a816ca7cd0c14ae375a7eeddd1383ffffffff02f79e4a0000000000160014a43cc0a92468f124cf728ab364f06bf38629e20f47608015000000001976a914a984ce7add2748095fbede0663ab6a67424e4fa588ac00000000010000000001027d0482728fec9c787db7aa0ccc67059d5f423d392d589a99bed1d1ff60b5a68d000000000000000000dda1593f49b509a327cd8e394190497039811156f8c5a05532bb2948bfe2de0a00000000000000000001419ea20000000000160014a251a7fdf8f1ba01df9cf19509f3c63ec116262502483045022100edca2a35b7b7be640461e88492cc02436d254d8a9fcb856b1c02de8b8f88275f022042d13eadef97c1af454cb653e73b562a48cb5eb2b8747c41cc288f80c786441a0121034ed9dc941e405d5c9ce4dae9265ac097fd719f42cc4920a9581e6867f83ca9c50247304402207551f7e3c6a11fce403be74c18195c05a70301f19352d973e0e73f48d9258cc5022060225fd04b29fb1f0025d95ad401552b51d434a2d4dd35dccb9b9c18c907d4c20121034ed9dc941e405d5c9ce4dae9265ac097fd719f42cc4920a9581e6867f83ca9c50000000001000000000101a8e7b17e58f51e14d3a99443ade3a772d4dfdf648af3497e71aac46b821833c00100000000ffffffff029f080000000000001600146ff94b8c1bdf6bd7c7480f821570194d5a9d7143ded40000000000001600142ae8b679ec94f791d4cd9248e2872f8dbdaa8d730247304402200a5f13bf56aa3fd61b59d775355c6f7803835692b6c64efdf7b41940248682fa02204bc24f4fd5f2d589f83e3266dc440cf9e73856889da53ad9e82d4ebee3c0dc2f0121038b2464b025fe21e4b8bde084f14c5f409b340ff9cf03dd003735ae4d5f844e4a0000000002000000000101f041731931c5f7e97e93722cf55eb52e583c55e22dcbed0cfc5634c68fa7f25c0100000000fdffffff02882c0000000000001600145fa83cf9eefd577ef973af94a23f605ff0a4ef50f7af02000000000016001498788ca1080194d8ec0b21d5f97a4c29c03ddf7802473044022026a0db3fc91687089ba1dedf25cb19a9d2a2d7b7801b01f3d42877c759704b190220516b5ab9fd32936908a5c361dd37d68236ffe0d19a1d3cf7950a285a8dd6c2bc012102a372c509a4d4c1d35aa6a7f8e3554ea2e2bcd63a13d13953582a8f9cc18ed0b349a00a0002000000000101195c342f8cd7949ad6251c9ae38d0f29b11179773a4ac6117cee487a21dc75670000000000fdffffff026e7a30000000000016001400b3cc74b5dac1f777b33cf23dd895d519472f7cc3bc060000000000160014c6aef90524fe024486ec91715a53b078a6e9c0b6024730440220691fd5fc04d6df50bcc009c0e1a0918a7a50141f74b2c20477faeb2bf017ba4002207cc25fdcf163693464b1293a3357c19e7d7882ff5a6fac4c3b1d5381e52be57f0121038e15edba9f43b137c4e280d31c4992e1788d56db91ab677a94d00409c85fd55734a00a0002000000000101dce1f4448712a768f062b572077bd41243d564351f90802a4e5aa5bf70cd35f00000000000fdffffff027a5d0300000000001600141123dee69fc61d8484bd88f82badaab367ab8820f0112d00000000001600144c2381129dd6cb3dbc2a223ca70bd2b11b28789d02473044022002d24c404f060678897f0395e79f55e997eb5b21a961670e137512eaf9a0d9df022052c6a742ba2c3d1c7814f0427152eaf1a96b85640b65262a24b412ee825598ab01210251ece4c77ee9ca71c066edb91c7ff4c951442bb9e4fca899fa9aea9b9b48868f0aa00a0002000000000101d220e5a51e55ae0636d3553a2b1518aa6c5899110bb1de9461db50480c723e4f0100000000fdffffff020148000000000000160014af821ae14eb76654cdd8dbb81dce3574d7f0c375ebbe2c0000000000160014c9c85f95799f8b6b3219490bb6c286f4d58edd980247304402205ea777a79707d6454ca294834f4d0ea31b231928707f7dde84ee3872752c28c6022063358880358ed6cf76d2769ed0778443755806bdefce66c465cd7fc94e18ba09012103dbfee97cddb97e1bb55e6aa90f103bfd64580ce6d388caff1c8d28e978d56b4e49a00a000200000001d7a248aaaa0e8a441304b4b2f89a29f25cc6ab15ae607bfe4b0f6b58a176b13d010000006b483045022100b64be779fe1507a7e1b03f80048292e5bdebd290766ba0e46850141e83667ede02200f750b564fc2417aba3fb40581726909c60203a05b506982a372c8524a220528012103c0f7462d00d7d07f9d48d6bfab8934fc9c837a56afa1e99085b526ce5bb7b582ffffffff0240a5ae020000000017a914c49cb1d2b4c6081394e61eeceb360fde838c541f87db7a4908000000001976a9144e55697b8516cac8f3f561ec98f22c744cc5c88e88ac00000000010000000172754e26340d1fe63f450db9067ebfc451c7c575b4ce4c32d1c522e35681b6bc020000006b483045022100c11e0e3f4341f14c21d0c14b8ed4272f5361e98ec4baa93e282912b256c4fbf902204b7f9ea9be4b09c791e1df96759c49502deaa65d64b69e8579f672021558afc8012102cb3f8f961d2396fd2cb356d836a75e957a9441ac7e4cba6ad0b8c7542a2f1867fdffffff04808248000000000016001496eed2f7fbadf4a3295754ff5ec477456c5f4671dcd539000000000016001448000b552d165330354dbd2ff9fb17c42eb8fdd88e371c000000000017a9141011934ac43bd30bdb0614957b073750cc4ff16c87e0271600000000001976a9140142f2fb020d627214760de1246b0903a4767c1388ac0000000002000000000101e45be6eab735533a9d28f5e12222ab311db3532334a53fa89d1f56f77dc21ea4000000000000000080026eae01000000000017a91413a5c96224c611011fc5b2e0b3a8ccf56227015f87ed0700000000000017a91413a5c96224c611011fc5b2e0b3a8ccf56227015f870248304502210093d105ee8ae70cb78179606c9cd4551a6c0de8fcf7e87ebb4fe86d3e25c6d86b0220672ace9725098e67dd2076b62cc0fd8341d7971ecc6ded5a0fc661ea02cbc97e0121034b04846768ba02bfecfb8dbcd63f121d8e8ad803e318476af78493614f8b12dc00000000020000000251e295ab252a955e3d029008cf51799cff23540a6294d1e6ce7ec3224c631524010000006b483045022100d6ed81cca5018efc684d7fea58f9b0f497454a89b8e81e555b2b5fb7b2e689150220095d92a212eca9b8195a82658b1f8b523561aa293c6af761efff2831a500de4e012102a8fcf3085cb44296da60ec68a1d7f6ba1b25f2b4bee4c1e6bc44d2b8a069c4f0ffffffffd73aad8a1a25e2b5cdee971c5c95775a87bc6ed5f448bf0584c95b58776c9356000000006b483045022100e24eda142e119587624a62e4c09373e17d32b6ae0ec58152a5720cb74b836cea02205eafead85e3941706da7e30950322ac26abc58df2a66a8b77d62019d55c6cae4012102a8fcf3085cb44296da60ec68a1d7f6ba1b25f2b4bee4c1e6bc44d2b8a069c4f0ffffffff02f7d400000000000016001464349fbb1915d74f866cee7409c8fbe83eb3ac4005112501000000001976a9140670c5b419a15afff19f9ee0e9a5a09ccdf6c86d88ac0000000002000000000101ee691c2447c64d45491ce57c811dc0bd5d30af3a6c0c7b605cf4f9eae2ef09d70400000017160014e6f3a8b2c0b01309369a5ab5a13f41716fd42676fdffffff02c7b9b600000000001600147cf63be4ccdb55e5668036bd7f56082b822113bf3240dd030000000017a9148b8bd57ce7f174cb7030404de296911361e63c6187024730440220034d1f898847ff02321891a4a9ff16f7546a708ec2b33a02bb7840adecabfc51022072e8ea8cd72911adb557f6cd7cc8b612fa44e0e56b44032b548db473d937b6230121026661eb48d54cf8178090296b163b8229b4e70f7fd2cd153b6b19d31511e0d06500000000020000000116e9816d02760be17bf701a9a4065bfcd3df28aa7ebda1b046ca2fb9222e3ab6030000006b4830450221009b8064207d9b5d48fc383da41d4f4be7af04ee5117179878b223462d7d1770a0022048fb03e6f40a6b55ccfe37e283dc72e3669567602ba1057afc833f0d9b909c76012103aed81e425fbf93f16cd22e5e46fbb0e2ae130dcba8dac2dd3099c551c9ca8709ffffffff01dadd00000000000017a9146efcf1e3955e87e9c652da193e326f7a7f7983958700000000010000000163062e07e593e904d59302668d1efcbfd5c5c2427f9f8fb5703b391c7c0b6336010000006a47304402202e647afce18efa6c6e2e45977b501930b44d1cd48613671e24085d358813937a02207012078e14ee4f5281a4ecd71cb718be4e65492748918a4779d52c8dcc7df007012103b0f135254af9166fe05d211eadb668362d8f9d1bfd3be07288161b84afe7a762ffffffff028ecf0a000000000017a914150c8c4e101a48cd4ab7560171da28515b930e9f871eb6e70e000000001976a9141082e3fb33d8c9f00a3f261dcce0b8302e23056088ac000000000200000001f398265bedda8be40a5912eaf955d5d37ef15e5738f54c0cc1aef8146fff5dd8010000006a47304402202c3a1afa0234c7d5d77f2a1a4280f3afe0d5e3164e593be1cae96018fbef39c0022046e9c2cffede513e6a0781e336a0bbabe851f406e4adb290a00ec465fb74cf1d012102152dfc698d1a08e6b8bbe5bdf88e975b6a5471828e4616aac9c819445f7ac2c0ffffffff02b07502000000000016001437e0766f3bdc2cc3b5df15f85e19750bd4418a8e95d80000000000001976a9147a6ca9bbd4eb2aefd89524b825c5ac8be875e66c88ac0000000001000000000101d4b8a28171e733b7ef2edab6c2910060d6347d3b9fe97416604a725a1453ef0b01000000171600141332b886f25f7c8ebbd926e19ef4fa299e40b448fdffffff039c3f030000000000160014a869d63d730d99523f545331c3d0da0361c112f3d17d3a0000000000160014384c498de77437c85c0f758a185aa49a4ea9d2fb2403d4010000000017a914c6a841c78a314570f602e626e10f0ea479209a5987024730440220415428656ea714a5c8916a7277f52486b62a3db4e3faafa8f4499dc1567f342c02201322b3566a06cfa4571c17b152b815b0b50cfed1169658e46e906f750e3213d6012103eca9a586df1a21b287be746a8f558b135140f52144d002fc09931d2230238c8f00000000010000000001012f17879a3bf926a6cdad43da4743fbf4024db32c4dce205a12550e375429788702000000171600141a31c9c5134fe23953c69db8cf201b925b075e74fdffffff03c3b90800000000001976a914e6395a990af0c4552a86115bebb04e9a0e12f6a988ac935d72020000000017a91440517cb091f33b3230d200f97aafccf7adb174c987d56372020000000017a914e04510fd2609053e3f6748791d3dc0ec7f1f9f6c8702483045022100a453083078d1966960d8a878e0f6a94327f9e47eb065d401bacbabe37b42c4b002202e062b2aed8cbe4595fae17a39f0519b869adfbeeace4cedab701d108f3a4b520121037bc8a9ed421be9a6f6a465736d6d3991d3838425ad876a474e1a1a3235c87e9200000000010000000001015555e97d48c868f48b47c68b7992b23899a3c2f339ddd304a3f489b224aced6d01000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff048cd61000000000001976a914f13f9a5cddfd31a7fbbc75c061fc7da4394fe41488ac894a050000000000160014f842ee8f775faeb380e5e4e96c39a2fa3f19fb77d2ce02000000000017a91423d562f47240ca6fbbd1b2b24ad8df674413098387ab332d020000000017a914e39f3e8aac37cf712bd65ae854c3888a924246888702473044022050ee5348aa275c782f2a7236ac0ae368e1042e6b819841805d2fce5eee96bc26022018ce557d2ba28513c3809e93fa58c2e59d61f6e36127c58393e35acf6628f14e01210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b79260000000001000000000101e7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4877c00000000ffffffff01e4a01000000000001976a914ee15c895464295e91510121b2e564ab3a34276bd88ac0247304402203e9880e1131f40bc17df96279a0a24c742f70c7d64499145b79cd671039455f6022038d2445650fb871c1f6264663d51b0417b0ae4f4fb384d95fa6e22f7611d2a450121027a740fa4defe3632a51b979c81dc99b6601c71e49754e4cf9f933425a9c0be320000000001000000015ac976af33cce46f99113a28f447043de42745245c8cf8f1d980ee5307ed1179000000006a47304402203e344ae03e4b39c5bc594ca7e226c362971fa2631b4d4d9b011b715260f7a6ab022054e627bfeff2475e33b49a1000d03a655134bed91e73bed50633e27f41fd3cb1012103befc5acf25db377f01dbc12e8aba79d8573f8af8db6e7879b999cae2f1c60fb8ffffffff02a086010000000000160014fc836e762b54e0128bbd6927438389bf1bff15265c3da51c00000000160014019253b464dd814eb9cb5e8f4feaba8af6be6fe3000000000100000000010161436401c94b02b1d56bfec48d40520d55b5f33692f8a23a75b3214a810c649e0100000000ffffffff0200c2eb0b000000001976a914dbd4ab8065b68c61e24d713d92cbb4d27191979388ac453a8201000000001600141ce75726e812b2fcaf36d6a178ccbfd58a5efcd60247304402201abdb8aaff75bcd6280cf6451ee1378d02dc74070d0c2429c9cfc9c045fffc340220737a81c55d978c79035421ecdf3e1dfb7ea2111e235d98b9d800e76a4128a0460121021b7f2cb05643404c57d0587b48c8d882a454f1040c47cbd31c73d29b599d04010000000001000000000101b78c1eb9633bd99402877a5260d85df1d658f9df976ea2efd2ea647e83c405650100000000ffffffff0278ee03000000000016001442bac77ebf2ac7978a03feed5db756659614b1736001741b00000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100dbb3ff55e1396c05ae23464fb79fcd8ba1ea9fbc84840f65ecaeb43e835fc28002204a7b4d9373db367bdb9a5f4e2c58c0f84cdee42baf9090b356142bf25cdb41a9012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000002000000015a4996d93b7f582258dbb614392ad7bfff7a531172437e38a09750d39ab13cf4000000006a473044022007a6096159ba3601158853e733d8d4d9383293863f765b026d1bd8ae2c0ef81102200d90e8ff52c6c992c0161c10e2b53b879d7ea1302464112abaa62544eec4f6d401210387bd5bcb4f6f37c5e8dd53632c48e723003dd17db9db8b962c03c0ba48f994a3ffffffff01ebb4030000000000220020de4de48e88ec3e4edc45f73c9ee6e360ced9849aa3e8f93dac490ca4ad6719f0000000000100000002047846f4f6b09ee8507d0d48dd250e10c61723f27f665839f126e5cced809f8e000000006a47304402204e734c6fdfda49dacaa1cde09e302cd538247f5d0f7ca0dc3af6b9bc3387a08502200823d19fd7864dd7aa15e62ba16ea0a969dde2494787d0e9e681ddfb1c23c926012102a8da5712777b95931cdf5e4b5d4f33decca72057f2ace056bb6ebea634d446c0ffffffff65c82b3c38e4fe3bdf66cb6fa37b6c37043bd4eb76e204c8bd1617fa22ec6acb000000006a47304402201b0330286d22aa11976150835ec65a829a238a4729478385225c043b51f1345b022020c71ed43ac60f961947b4281619197eb886127a636f1b08d329b70e753a4e90012102a8da5712777b95931cdf5e4b5d4f33decca72057f2ace056bb6ebea634d446c0ffffffff02c23c43000000000017a9144e08aebf1f6ad7f446b1059f7f97ae88c8fa2bf187f9030d00000000001976a91438dc21e5c4d7653c55adfd05b8f5355759812de988ac0000000001000000000101037c073f801a8140242b02f31f6480298b9b0fc44510e3ea9f44f128fa37d56804000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff03c93f02000000000017a914b1b731d734be5f772d8bfc84e525de7dff2c4d6687e2d20a00000000001600141b39bc297e9c70169d83c31cfd181731175f6a28c9d422020000000017a914e39f3e8aac37cf712bd65ae854c3888a924246888702483045022100a2b82c1a8fa1974aa06ceca1ad687393e6b79b1a7e05166357dc82022cf910db0220299ae3d792c6dfa9431553b8cc591db2d00ec63cccf4ebfb177733b80df8e4f401210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b79260000000002000000000101915ed34ff9fe7c45b9572754caf983cceadcbe21a2f6774621ca3be897083dd40000000000feffffff02f9b672080000000017a91490e0eb80221c480829eed9b07be1f2ed22363b7e87b4910100000000001976a9143c81848438a91829c299dca4941b01ce19b7ddc788ac02473044022041bcfa2433b95b684d722210003e55ec85bf96e86263842bec9ee64c55719eb0022047c4db12a860991e1b3b984d6d61820857f5f9f03aa90825a89b7babfa9c2a1e0121023840cb70b3e47c01284ac1313196adc6efb61642640cd86fa6f5cb5fb298119f48a00a0002000000025b5ad806cb4d36b7cd9f8a172c6f88fcdba76c2702694df7e0a8090ec2320b1b010000006b483045022100aa1a0009b229ffc0d20c0ce843eccc2f44055a82d9591d3b55226a3c6a245b1e02207ef1631dcfa315c859d54ccb7924115c92c227d4985b52827ed8aac9822bd9b6012102081c18480c29057e3f7bf28b7e6cc9350732c56a1ff88c19b922d3a1948ad5ccffffffff45f66bcfffe7719b920fd0d124cacd7e8c53a0f1b517871bb67472cbc419e421010000006b483045022100edfdf42455fb164ea8acd1128a9d42fd0500240b368df5481d5020774496fc9e022054ab10e9cd4212a84512104ba9f779ba9596472956ff6a52b953060bb81488bd012102c90f04f03089d10b54420469758b8136fdf9d26b3d87ed9ca15f5ae1d9fc99ccffffffff018c790100000000001976a91480524a76b63708d869de91bddc83f76be4cf1cf988ac00000000020000000001021e372fd580d060de08fd5e605c940288c467ae1581df54de811b205c592e9bd74000000000ffffffff8f8c9744cc23a66acee3886bb50ee60cb33ff5557c77b5dc4f968a01a8d5db770100000000ffffffff0128f41400000000001976a914ea14625dbdcedeed0a0473d42e06db4828bdaa0988ac0247304402205b080822e912d8c8ad42e851c0e4400ed6d1dd451fd3ca3c2601e90239b4446802201d14005e242c68ce82b917ae5a5997b4338efaf0b94730935f83fdd0be0fccf5012102825f8db705621d260e13faead617f0c8b2e0c3d483d6baff419b8cffcc5a3e4902473044022018dfa204c082fb324498e7ec08293bf66d1e8bd562d669984f9a0b1a409f296102201f05feb288b074154ec90421a10ef645ed6e61893183e91fe092ef2d7aa302200121022da00ff5170cf16b83ccc98c8b860a4b4f476ecd9729a0d0f44ce01949b572c00000000001000000000101afeb4cba4bbf22defa352977e213f433511ae6997a8a80183392a18b28dd432802000000171600142277d7263999a2f530efd926d6d595ef7b027c3dfdffffff02e1570100000000001976a914a07f160fad115a487c594613cb4f0d6fb88c2caf88ac713548020000000017a914e39f3e8aac37cf712bd65ae854c3888a9242468887024730440220229272c3cc1863c61a8e0a893d0017a7ad2dde77aae53f76d738479ab3a7b5b00220553394eda965833e775f4daaf64c3b6b619a73e1afb96e19f2495a97c0a2e72a01210246f7ec596547e4f87f29aa1650f59fd9772bb964a75c82cdec80074c767b7926000000000100000001bf30f279a30413f8f54c550d674cb25389cc9fd18c7d61660df32a2d7a5454b8000000006b483045022100df311e332f648a9ef0bb5ec4648899051653cb7be8f683f47ae369645730518902204aba884a8dd95689894648ac5161b5a3b0c33ebf4db571c195bfd4bc63b549ac0121026db866c3238fabee81f790e8dc4663548c6b1f7ba53c185de8e769ee92c34d6affffffff02a0860100000000001600144f0260731c2facab6ad96dc3329a41f375cae32b44e8ef5801000000160014acb17c0fd3ff55ef4394f86425acc18991491dcd00000000010000000001012d90abd1ad3caa6b576e8e476242c70bc9180c52971914217428bc5db9098c590100000000ffffffff02b33001000000000017a91424793ab33d4a0681f14bf6d7340f06f41dc3760187ec9cb94102000000160014601f9c9ea2c2b3bcb32b87e3b314df292720e7f7024830450221009108280a20979f652ab264b7ee09ba2c551a2a5942ecfb0b0788eb9f26b9d31202201db8b85b97d5ce8769f3aa475064bcdecc871eac25c6d733f78f2affaa6066f10121034085134fa091ae6b6c0c6eda885e2a0328b4abe70f7129050793f2b32a1e10d800000000010000000001014e557990ef2af925731cf14434a70b1e698d6247ec55882deb1ed2c1279377b50100000000ffffffff02002d3101000000001976a914249cebb30b8ee496a90caea414265754fd2bf52d88ac23ed8a07000000001600142677655702ef75d54c672cc62f7a997302b323c402483045022100cdd30f94d61afd464251eeafdbf78688bd96f153381b72c57072ba9ac0ad8f5e02205d16139ace6b5dbea9c593b956fdbea48b524d3f7da12bf6b373020ad93475cb012103262587212166a8069cf3a5f154fdc5e4b1cdf0beddb85ead226403c1a878c3d90000000001000000000101de309113b414e6d025540f56862116ee1b76e58b51b46742f114a418051ad12f0100000000ffffffff0222d710000000000016001403f67d592263bd4efc9fd6b55d6388881673299630d3ed9d02000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100a825fc62c5e87dfff993b9574fdb2f58787640a181521df323b2edb0797b40c302202332ecf4b39ad8bc2c55ae7d178335fdcdeac0604a6de27c1aaf154b32c769bd012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e71000000000010000000001016c74ba84ddb8784748106aa4ccc04b28e7b9b7cedfce6be351ebf3f1f97ba1be0100000000ffffffff02c58d020000000000160014b79cb39ab49a60f277b0364baf47b12bda494ce1d4b3ff4000000000160014015768f2f8350e4a019b1428f9de152ede16db6302483045022100ab63a32dbdfec6f6543913c51218358e613484693fb34c1c6c40b8e9e6e2e0a3022056d14661770fa30cde09de1c1269cc87fc3649a7170485bc01355654ea6a20aa012102f6f5749dfa3e9b448f2c0ad8e89535b55f21217128563e315d2c9e34f999125b000000000100000000010154c0f24ec859b8913757473f2077b46f328ea5ffc267ec18d20b25c8877753160100000000ffffffff04003a390000000000160014814f9c1cc47a2e5d1367e095ba013ae300d2bc5c404808010000000017a91430d6ec5803cbb4269c358f935ce7f9900dababd987b85d030000000000160014814f9c1cc47a2e5d1367e095ba013ae300d2bc5c350896400000000016001409506e2fcc953d1722cf513c34116a1f4d3bbd1e02483045022100a50cbb146ab1e80fd806233457c9914db65a6df7f25419fef2e66b04ebe1fead02201102d94295bc23867f9be2ffa74658326543777b39bb57cefd1452313ca75c12012103bf4563f9e7baa3fd5d2c0497ea156d617b1533a5d6194dfafd54e4d2699400d40000000001000000087019aaeab9025f08f9d18cde36e3e664e23d5256bdce9f384c04122c0d34d68f000000006b4830450221009948a676873ddd484fcd547c127e53c4e1897b64ca0c5119ee4d66e6e33e83ac022044af3d1e21c5b35158987ee30d970586eaabb603c60f4bca93c01dbc4924ccfa8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffc80e149793278d94725315f4eeec96f4f501f2ffacd91844c975e84c78439fc1000000006b483045022100f1c8d9e78e10e22da3147af2f5af22fd36afff7643ab27633acf243744e450e4022022518e80d4b584bebc9e7a98b8f6aabd3ea22127dae3fa9eb5e2bd633ed2e8ef8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffde9360f735bb50186eaf241758524bc22b702e4ec82c1932f008534397ea24a7000000006b483045022100cacf859b56228f212f888a55b39a1214b7a2f7eb5d43f8a621fdeac0f09f948c02201fde9656b9c87f85fbde8e608914fe8a09a24077a26f14ce866b6d66e0c5999d8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffd63a6b983fd34d985ad2c9629b735c7cd51d625f4b2aa5477743a5ef335e872e000000006b4830450221008c3c9aaaf91451168287036ef70470b903efcda9e5c3e017a6306dc5736713e202203d26806f0dde7793a2543daedec83cd6852f1a4008378d4ab737b89323eb2ac98121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffff3c67498bf58f14527caf53f411b7dafce2934f360bdcb0d44336c03af1d2ef7c000000006b483045022100ceb27975232b652ecf94343ca0e13d47a62a2f2be5afe456efcfc236e5d540fe0220111ce3f547e149862f40683c83c325966ca832075bad4cd4b9fa90eb03ab90f48121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffbe4ba7c1dd1d4ab659f745e5237b74f9d610ae309e6d7747dee040e17bb96df7000000006b483045022100c31c5d9c9d8e200b5fe35b7b072a995b772c3ae382dafa0c38e17bdcff83744b022011d9cf6e24887197191ba91f2ba8809fa13be7eba4b7f09e63914310e2a14bb68121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffff9faf8b124f8d07704b2e3ba65ee5ba71ed070904eac14c12a32ffa4b86b46d95010000006a47304402204ee7a65e2fd38d04748b8ce3ee5035aeb6d48f58ab0c73084b6debe3d5b80dd9022002596f97f2205dedb8a5d45030e235b3c73f2604e5f87b7e1830083a821868888121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffffd74b96d8c1c09effb1bd6bce445fa3ad95e24ca333f8c0c35e8540da08a9af63000000006b483045022100939a8538d6ae6b1088a23bd2b5b996df7b5268b6997ae46a70373627347f1e2c02205c79315f83be0733594c738b070d1dc2519872eabb4d4acf4a4fe3293df7febd8121033151dd75ed605dd0c8291d8069ed732792c4b15ccb373cc4b632703ea4f00cb5ffffffff0254c11c00000000001976a914f0b2c1e09b9519bac1e85ad83047f90e201d3b5488ac5fd90900000000001976a91464c94fdcb368dfff2525e34e1a7b3d9f2cdfd90388ac0000000002000000000101997a31ad04024684145add79d72e4aa05691ab7b0d7353df6e855abb6649242d00000000171600148c51c18db081f25bfa3d131bd4e1e9e04251a302fdffffff01cbb0eb000000000017a91470cf5c70484513d6045fb76a1db7f07695823f0c8702473044022057fb54bc21ccb28ee92166d19d849e99065350a07bd40de578333a91596f4f1b0220337ae8c096a375c5b35766def80cc5d51d9c74052f979804919bd1a2b3102a6f012103d48299d2e28e6318045fedc5ce1befb0157e5b22847a81f929ff6005a9a48aa149a00a0002000000000101c8bfc066b79b128f4237d05c2d45fcf757e578f9257a642fbe04ba650e8aa23e0100000000feffffff0a3f530200000000001976a914fff710b2a455b46b48a43fd9b05b89790992a05088accd873111000000001600149fc8672a85044717778639d484f1d0a257f62af7c0201f000000000017a914df325a61199b99e7a6eedc37956187018638a63e87777b02000000000017a914ee792e8b10b551ecf6689bf9f59ffa941d625f5587b0ad01000000000017a9143c4d6fd927e642977b95bbeee872290f785d90f887803801000000000017a9142aa4d747a80db0b85b56188c74adde028ddeda0e87b0ad01000000000017a9144c2f27044a63eb2a5c2b9509c96a309ca92c082987c23f06000000000017a91435ce1546297c676d7c8257a561bfec8f5aa10d2a877c373e000000000017a914c5c0c96d947fff135df395071515dbe1f373a6898780a903000000000017a914ab702f429fc4d6bd15b81bfd46d99c9789d40558870247304402201093a4397bd9009aa47dec1f962868d488daeefa31d6c305fcc32409b5f5e638022054ed5cf7c783a797927682c9828ab822a368a73db2d45b0b24c4b6372cd91e93012102cf4fb6b759f41d5487f0cb14ce72618ae6ef0cdadda673f23e99e5e9ac5a51ee49a00a000200000000010163484044d9fef3226c7c01fff4348add1ae4171c0c582b9a59aa476029a583460100000017160014d33229610cf5e86b4c34206fc4d0c8512d953e13ffffffff0260ea00000000000016001421f1ca34d806bb998b82ab62bbc92403c6314338d73baf230000000017a91406f19824aff9b90bb52b859f64f27c9837ee3fa987024730440220757faa7ecc6a2d9ad673e24080fab158d29a514a0857ffcaa1a0851db60442a302200181afff7bbc2b386b9bdf46a6313a4219ce7cec7ad0e66d6775b5d214c3aa3a0121025ad6d3c68b8851074530106547e8cdc7f440c33037e8dc7ac8d7c87e9936bfb40000000002000000000101e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1561300000000ffffffff01da7301000000000017a914ca770b1caeb2412024ddd5984946f953ed13eb398702483045022100b89e62d5a38f061d2feac15dbb453d5ae44ce58ef4fd1fd6193676a7f1d625410220300001b128fabba69f7090f77ad9f16cfdbcc6c2694f44d8a2117d2fbb04b33d012103fe3029b4914e5ac5d845f373123d2f59831e3b32ef832c066e3f68143b0528d500000000020000000001018c5cb8f7cc326b20ff2b96aef0ffdac459dfaf0f3c514475602146406a9e12790100000000ffffffff02115600000000000017a914d46ccca5b194876969829c211d6ab939fe186e3f876ab3000000000000160014f5f6cedc8fbc72a03c68ba02f0cd583f5b595adf0247304402206b510b3d7c2f9e5c1c57622d004dde5e690980b1275736c8389b77c305e208c2022013481c7bb7469e78ec5132c93c904533f1053ef5fb9d341caa87aff6236a11e0012103ae1bdb8ae7ccdfd686d5011f0bf12020b7347331ad3b06e0ddc78f1167dbeff20000000001000000047f0b22740f51d27104c8eaff91a05f78a21e532948083d0c2d5dd85cbad03830010000006b483045022100d8c599aebbf4ef3d20e86d7bdd54101aec74a53d8a28b767ee9798815b88ca9d02200cc1ab093b7abcb46eeac6e5a5954cff6ca1d5584104633df7f10bc5f25660e10121031e607a300321f8d82deee739223a2bf1bc0fa57be2241415adc36ddc3b7c7e72ffffffff5902a97fd2341cb1008591115cc486ffb0948dd0a330b55f7ee01c1820de453a000000006a47304402203bbcb37c7c4a86980994682433d910bb5c030b51973e8938abd2a31a37cbded702203b920be0f927ee2d7580f689d43a04b6c1196d388d4803db6c73fa8d546148e90121036f3ad99e53bd6970aee5423cc340009176e80d332628f23bcae6065e585cbfb9ffffffff5488309da8fe1c2dcddc14eb03d8c930ad8fe741535e8672d00785b0e02d59ae000000006b483045022100c344add9552558765629099998c5c9b70a694b054643816918d14b92611c614f022028252758765391080a8beb39019bbfe4efa623eebf337ccd775b20b3a0bd6a2e0121036f3ad99e53bd6970aee5423cc340009176e80d332628f23bcae6065e585cbfb9ffffffffdc9ddc676fb14eb213ddc56ff4a742902e892220bf79b2d5151d60be00a615df000000006b483045022100d971e199bf1e4938710950a539aace3aafb16221accf7485f2d147b142c3e5b002205db3fb500b5bc36a81b4b14ad7e479735e59e4adf85f3bc77d2fe7bc5e49e5920121036f3ad99e53bd6970aee5423cc340009176e80d332628f23bcae6065e585cbfb9ffffffff01532503000000000017a9140639ab28515ab076d9f115a27da99824fb249dfd870000000002000000021dfafa537bd883ffa5c67bf374955d9a44eec9ac459e0aae2b5681ea35d0a935090000006b483045022100bae895077fa959b815a72ef780322bfbdad7528e782f98f16854ad34e4e4c96b02200571ca0899000ee984c95ad7f78416535e40c1029ec464d883c53663242ca303012102b43b1c4a42e396869da23c6e464c42ad67a90061d11598f3d42f077d21bf7010ffffffff5d563411692f1e2a0f93b018123a0d384d245d8af0935601a1a5871ceec477c2630000006a4730440220304350f4cf8dc45831e0792b395db7ff39f28764bb8d3a81d1d1a789e9808a8a02203d312889b9efca44d82773b11eebe9861e9751fff89cebf3eb899cf532bfc945012102b43b1c4a42e396869da23c6e464c42ad67a90061d11598f3d42f077d21bf7010ffffffff019d2d2a000000000017a9149edcafffac79ec129f6ec7d233359e2f2df283ea87000000000100000001056e8bf5a2ca579a12da99e5540a544ef241bba8debadd19e2989431cdef976a250000006a47304402206e3be6ce875ea8184a427e2a37c8d7f3b683671fb706a97ad02c7f4116d56b1802202e45139fabe8086befb3ce77a5a8d0224050548a6208b7557a8ef53f4889535601210367a13b9cb091d9e86e2def758ca9bfa4bf65da3633e90541b961cbd973123952ffffffff02406b2700000000001976a9140e5302a9f548459e8f28bc152b414f6c38bdb54b88ac0cfb3300000000001976a9148710d7396ed7afbba359bb5558d764d09bac2e9988ac00000000010000000174eee0f0dc3d5e47648e11d8071043ae7a6e48f5307e073afda4cd7767f2dc70030000006a47304402204437575069b93fa4a0a4d1e1e1e57ef915169829a919cf9a95c89b13f2d86f4102203e97d8a0c80f7337ab282f914b043027d0d84fae94dc4fcbdaf33ffea78e6dc601210234e3640192b624be947cf4e100aa47ec3b8e368f10e6abbd8048c3d6aa4b28aefdffffff040000000000000000536a4c5058325b76fe79649373f38e2676c4a6d9636578f2f19abe8aa6c502171b3156bc56e2aed9f4d1b727c622272d121a2b86c4b73739f8f3cc190c15444ba453c1e6fbd8b9000aa04900dc000a9f78017903649001000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87649001000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d876a047408000000001976a91415d7be40e810f702ad45027991a17eb6eb30f20288ac000000000100000002879f3cffb913dec1b5ec4e003221ce847e57160e2604f937a90f824ef22d715f000000006b483045022100de23c6d6d79ac0a8797bab927bf55fd2e633098de33f718bf29f63523f41d76002200f2a0979d16ef486a83e1f973b95576bed2632f1c2752a594e32398580bb64e001210295812b415d3e34db04f9b9254de6e6ad90a0a3b2aca78e1eadacd936d68bb7afffffffff84686fcedffcbc8a67da372c44c215cc8c81925418df7d6d7193199741427f62000000006a47304402204aa3bd71d4974fd5c01d4f7b65df8e9ad97cb285a3b535c05cd85aa43067312c0220205b4fdfa49930f7be84768f5738ae0a6215553c3f49710588af3644810a9b3c012102d915f1d3df0790d596e6d65ad80275f00108acf52a62a75eb22e392d8c774de4ffffffff0274770000000000001976a91494394df910880592dd3bd2cad86b91db7a0faf8788ac90d00300000000001976a914637d5548846945e965d41458d0c7c4e57ad7d51988ac000000000100000001bfbc8b4ca56dabf86cbf7e44de3dbbee0db46683af5463b71dce93bdef84cef2020000006a4730440220245ae3241f810bae5548090ff7fcada4e31da11a94b721bcb60d26fa8b7f3ae202204848196bb075bb697c31801b6b14049bf830247a644a58788822bf00c7332e42012102936c15394948d03a7ba3d4a7e7c7523e14194b3ab808cfe5baed526e15bc0651ffffffff06b18c05000000000017a91442b7ce7b1b13222c59794192b0e522dd51134971874138030000000000160014dd34a0d2d172c5bb4114ae2f84b746d111caafd1b50a0400000000001600147a6c76197aeb886e7dca2478969d9c71cbd06c9eecbc060000000000160014b427f9f0a869bf64ccb904cefcb01c69e8eb42636e1006000000000016001490dce4c962f185bb27a3a9db23b58799a566e35e88d1ad20000000001976a914c8a6bc95dfec3fa60785b300278d5378c6d453a088ac0000000001000000000101d8e3ec8a7222b0dc43a1c1ec31d3f40d6c753df8f1d58b9053878f1b037d826503000000232200200e63d6b3d1dfd699a0a531ba0131f91b41d6b05cb9bfcb7d6fb90c0f8b2e48230000000006be0a0700000000001976a9148cad749d206f9c317a3a18f01b93e56ad88d5c7088ac04670300000000001976a9142f17b215d440995480edd350ed3f290ba98356db88ac90d003000000000017a914a76c419cbb5c2c3b42e6867f04fda51ec240519a877bf30500000000001976a91491fb7aa514a042409ad4d9030883c39ebada3fb988ac6ee96500000000001976a914742936c50e25de05a51b6582cb1994400fabb76788ac62e043010000000017a91411c77a756d4a2a8870fa28e3338f493b5acc5369870400483045022100dec298f8f56c31f27ec4bc66085fdef9eb609a758ea06af070507f5284643857022041db20d24f077e17a7ce80b318e19666bb01ce621414f8a10a35a1cb4adbf6960147304402204e3d414f321ff9d4fb15e5af400f3a97e05095622b7590e754307236bf73ac000220417ab0c678d754fe38c4e81ca5839cff3ab06bd0fc36d0421f5194511f67835301475221022bf4cc830cc8c00bbfc682720a42793153c7e3834efa902dc89b0200152262a221039e8efc18dfb52f314411ea607ab5736b7e7cb1bb2b2dc451db454b615bc466cd52ae00000000010000000001025c7ef872b3b0c526be7d4e05e6e70f952aed8843f879d587cf85852edf779b930100000000ffffffffd6b7deae1da87bf1d494e446fff3614881b284989eb77c6711de8833bccfb9a20100000000ffffffff02a90d090000000000160014d30e34fd5c2d64bd6c30f92a6feb44c1492a1336a8341400000000001600140d255571dd0091f2b7ebede582f328d784df260e02473044022014cc9e47e0c016afc50cf935c60dc7b12be758963c4db87f3a07f0eba1e1a373022068d43d6a978e7bfd7e79e9e79e2c4f43d8cb9509d2e0b86d43056580399e6740012103b44820663183f6553327447c66c63a0ea14ad46ce672b33b3035fa4ef1fd46fe0247304402205b8bfeedbff148c0233cecca13fc44a356f35c56b0625db211526730efb4dca902203f671affd8b08a42d74d68658ecdfabb998bb7c44287f29a8f386215bc4a2a6001210249760d81021b66fa244dd52a92813081f0b26536bc866558f0cb496c4c763a160000000002000000000101347c22b6f845b36a385a3c8463716827d8c20ef89402618f7d116f7d296cd8c70000000000f0ffffff044983090300000000160014015f524f21a6d8e0c8cdf9338467814294dd9fbb8abd03000000000016001482ffa1a13343543edf1e0cb5c81fbcda09c38f96f42d0100000000001976a914fc51be0c6b8d4b2a975e73b046e50ba36d50889a88ac62880600000000001976a914c329aa71cb801cc809681f0f0466a31af49266d688ac02483045022100db315f1a3754ddee15daf89c0103de42270f9cea5ee9feec6607d3c69a0c615e02202dd251cb2946a4733a56e3ef32d1f2de2922d8010fbf5943cc2c5ab81390e802012103e0ebb9dd2a9314f16c76a0c68ea4dd2355033f95a3294b01eaf1f6aa1aaaa3fd0000000001000000021cd3881a42438c3a65f979f16456a1a6e68f48d1a485570246e4d94ff7ca82c3010000006b483045022100bfacdf4a4757075ce4927868096762a932718dca9dc1c1e3bbb924498a4efa8402201abade090b48c722de262e1f76ddbc215524e6c17caea17f08c95f4a66e1e07601210394e2ce14a618a1347d227997fbccb67ae199c82cad0eae7e61432e224f8f1a7affffffffe63d56f353ceea7beb9802b327e86b2414c713dae78edb7ff1f92d7c581cb6f5010000006b48304502210096c20730914e6c3f90bd810cf9835179456f008cb1846011b16c8fc1d75e0ee902203c0d0b42a857a056f7e7ca912df02e654497b696c63688569ca81a1bd3c9a1c90121033545ad566adea3387321e760acf03f6055c0efe25ece048846c17c0473d52afcffffffff027e700a00000000001976a914484cb9318941726d583454ed26e38a750eafc39988ac341d5400000000001976a914daf463eb051f4656d34da6803765625f3ff5eb4888ac0000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb247604230300000023220020861e8a82b55bae5913f290b240d5790e94eae00e2574d470bcc5641171342d7affffffff03045b00000000000017a9141fe6dc4a764c3464eb3891636d8373bc3d58705f87ee03b0010000000017a914e3c0b5fa515071b775b957d56e49330433db88cf871cf50700000000001976a91465c2487c3d8afd59a5eea9ec9a2241dec8208d6288ac0400473044022046b7cc2930d49e56ae0249b4af389e301b962eab85f8dbb5cd69a196525ba9720220070a29e606a08953efc72880df47ada88e3b92ca286c4fd2202ef607acc70b860147304402202ec96abe5ce2cd3df49f5f9b8a6551afe34f05f57cbf3ac424b41c3ce2594f2e02207f5d74b9227c4f9a927b7e952fc3fbbeeb58dd5cb491a7075aaaf4fa8b7944f701695221024b8f84c0cd915304652937bad645c60be3ae1d0ada216119a94de380fe609f6121030caf41a5a439bbd0bbbbec589105454ed48c9ee3736eec69f0e03b83ae0a89bd2103fb7d93a3b9af7cd176d189bdb460790afc1311d64173c01d7774eb92c530de9153ae000000000200000001df53ec004f22c48ace3df84686dc65797bd107fd2c244e46ddd0b749120163e1020000006a4730440220099d76036ade9462a96ddfe0aafd56995d1aafe273432d0adebebd476704948302205dfceeafd198ccab1985a3360c0cb285a5476f323628e8b7071f83bf0d4503970121031ef73063e764ff4e811d61616a27bbe9f4e4c31e333de9a1e5c39581930443c6ffffffff027ad607000000000017a914274f0e4f9c63053ee8e560c23486b103fa018eb98762070000000000001976a914d771bed5d76227886bcecab7fa6dc6e76900b0fb88ac000000000200000000010171c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd342000000000ffffffff0160330a00000000001976a91456898d2fd43d77986218914d796ab87bebe0b2b588ac02483045022100efce91abcb08af4c34924132a0ae5a82719f1dc8b6ace14e820afe7ae104cb7a022003733389c2cf63452971fc4220dc6030c3084b6fe8675549e8db8532369293b8012103d0ced0de2ee6f415b4cc67938a278c7ed7c4d2da6927e77ced202c8086c9b258000000000200000000010190dbb26eefcf427135c8a5f9f111543cbdcff46c16927fadd4c146f12edfb9b80000000000ffffffff0132540100000000001976a914c5146a6641bee3098437fa818ea1d50347f79b1688ac02473044022031071b5c9f4ec6e29deab8ffff85b2e403fc94ecabe279ff2152df41ddd0baa702205a8c9a3dce48799fe466bd8ea6548c14a1db3bc43584d4ab23894becdfa82ff3012102eb97539b5f828b19329a78387a83b8be8cf8c8c10dcd90103f3ef3106bd55e660000000001000000000101e8f361e556d8db1de80aacae003438789a1d90f0b58d405abca5c31e27c41de10100000000ffffffff026602010000000000160014df2234de88d760b0cb2e2e342b62dd52da63e3c398e1490000000000160014cf70f967a78e2f89daa0d604f1a7ade539ab482c02483045022100c683eeb4a03e7e8fdd7926be6a34e57c47645d9001a0d4b60b77a550e6d61bb30220769caf7f4cba0b6b98e6ddfba2ae993d764d4ddca73dffb1f29279cce59e3323012103778dd193fe9a70019cc02406f1d36bd221249b8b601d24c375dcd8988f5aaca20000000001000000000101b49137e62bf29ff429279712ca1b8dce0d5b2e6976d4f003cc789d60fb11b9ad0100000000ffffffff0230800300000000001600147541fbdd322e6e957c8e3e56194d4d58d6aefc9b34fd160000000000160014d6d52f1ec74ab98be12bfcb29b1df1f64729e9380248304502210085b917448f9a286c352169abb358447499e22c6a7da792d0b0a15b7d19a6b836022019a10ae8d891f2579dc8c828d399a2b2741aeebbd408441998a864d065f5864a012102fa9d90b7d3b8781fccba936a02f0f6bdd32eafd3f3830ff1c502cadd6666824300000000010000000001010201a14f6c8402c78f64bf6966b356bda6fcf9d49b367387e9183d9794d84c7c0000000000ffffffff0165560300000000001976a91493ff551b496dba8477f6c872d76c5b08334b9a5488ac0247304402200738885731c7b8f1dd8fefb3dc14d2b5779c8b56bef842b264c93bf11634f863022012bb2ee5751aed42c4b4644e078b2491aa011280b2554d08d494cc0a7ea477b1012103c0cadfaac03e2ec2b5b01d4336cd90542677bab708ed812f8aa8895a6d402d5700000000010000000001011d9257e02acf8160a4ffa5fbce48c695d4d7f602a1936acc773d1fb193b2b4f80100000000ffffffff01f54b03000000000017a914ead79244a4a6eacf45927b47240627264083288f8702483045022100ee74443063e11ff1dd26e21555ab3eabf1161633e3d01f17376e96be047dc93902203b7f31f0e4306bf2e24de55eef25bf5c040712ad4bc431c4c586d9ed8069336801210235166d1ef859e0340f05b4bc420a1dec7b3e2824fb2c757535791c602749a17a0000000001000000000101a1e3410f4dd773d55a4d22f413d94f5b2b2da7423a551c5ac8237a6ba21295830000000000ffffffff021b5600000000000017a914ac4077e036a9848dd1ca7882c7eaa9b8354cad2e8715e5020000000000160014a17616eeafec6d32794326111f29670325fc767402483045022100dc6c2df7eae29db4882fb30264f63d0f7eea5fd17a789e11816de9f4fa2d1fdc02201d0c1a5e378ba5c8c1a03ea16a9c3ef7d38ef2f5a572188cc0d683689ec93d5b012103b2953b1ea1a8afe8ad54c1710baabb8e86e1210cfc8d2226e25bb63d77b473b00000000001000000000102bd05bc13ee0bea3a168c1fd3351ffcf12730a2054dcde6fb85b6d56c5621a36f6800000000ffffffff5d198858afa9401244d03c2f23e72b5b9fd195e904c8bd663331ca7b1ddfc9fa0000000000ffffffff027283040000000000160014940913b1e7380b2280c15be059b296307e4170ea70bb0600000000001976a9145a65c40731ffcd3edfb78fff5ec1908436bf166188ac02483045022100b2f6089a22147217548d139689320b78b9c70f4b0ebae4b2e60d304eb6ac088e022060625332748aad98f263792cf4e3230a22e207c60c5bd791739eb56f9334122e0121037479c53c46d9c5d3597bfed5a37acd25ad3987253c3f6fc12288c229f7219fbb02483045022100f679b926b0768aa4445c2251b27d8609e0ccaf306667a31ebd5cc67c9d95adb302204f0fdb583faa901107c7e5e7e099706103f66dfefb4509b3de374bbad7d7940b0121038ddb5ad93c37b187c1cb5541d82409f6b16d9d131038a137de042cefe2b719ea00000000010000000001029de84463597b1bba9adb65cb15b981597c2679183891e3dc027c576ec3413d3f0000000000ffffffff7b386be3ce9c79e739231df917ab3af857063f5a689453822ae1b075856dfcb40000000000ffffffff029073000000000000160014636b31be1639c38a30277478a6cd5de8b73a1d2d50750d00000000001976a914b0ddb73dc9331daff180e250c9ce5846792170fd88ac024830450221009dab76659ff124ac2162b0fe7681ac4dd58a601ed4ecd00ff4ba002c28dd9f2202203fd6f1684535d5974b870fecf24aadc06d72441ec8553ed8fec5302bda38e2c30121025b017fa5220b1c355a1a1424092713461275d9b84bfe4d6cc0db512aa8cf71090247304402202f4f91d4403fb9502270816442a62a702335a943b22aa067b033f3783096c56702202512b45a9c570a00bba1e91230365a9a1b40f597332d4996d99b0b53402e40ba0121038ddb5ad93c37b187c1cb5541d82409f6b16d9d131038a137de042cefe2b719ea0000000001000000000101d07c864d1b2fa39d3508b41e5a7b1b7f2c4e6d7b273f989c4b757fe2eb14220d0000000000ffffffff02c0012000000000001976a914ccf9bb8ca72efc2ef9946c61fb5c8ba3deb36ce288ac8f5c230000000000160014c6f8318a34b50e75c0eab7637001464b954cb48c02483045022100d9e679d8b5b76c44d130ca38488dcaf66078c707e3dbbe30c23a351bd38e28e6022046c011fbcaab47467ef2d9237fb48616c6e91641a8b658adbf85c01c86f3f846012102bfb9cdf7d042a4f2847d7e994a25dddfcb4e0cd86667e2a100e2c5ca772dc7d300000000010000000001013354f2524d6f829c0fad9d7ca766cbcdd4f164b61ad3547ca487d2a7b91ce4160100000000ffffffff0230450b00000000001600142fa82300aca3b9a1281539624ffe3921d6a169be90e11500000000001976a914c2d1c9eea2c10dfee0bc409db730d26cd069ccef88ac02483045022100d2a5c6915d1a8d420bac9b96339d0d6916a27582b2cd4937d59d283528c91652022005943707ffa3eece3297d6e79920ac66fb721ca7cb2d1fbc57bf13137ce91f08012103169ab9c066d91c8cf5788a65b7e2048ac9064fb4ac0a123618880676a0c3e2da000000000200000001cc8f9fda8e4c68b30bd7a31dafc9c72073596478322217c10b27498c7f859ec2000000006a473044022050aca8e90c2ce0b2e7a83bfb78ca47bb994ea0ac7812084ab75ccf21bce6572502203a44dbda2fc19b05336ff77ecbc9ad72981c22a00f910d59016b4c88b3f6d8ef0121039473130ab06a058dab1900f66defe8ffa0951d99433b0ce48b8845c2f3d45faaffffffff02980c05000000000017a914bf353c88fa9c0068991b87b89078209b401aa5a087aa350d00000000001976a914822ab8c1487be51f39724496ddcd0a1f33ce8f4b88ac000000000200000001a6a1d87340a22c67dbf306b41387c50cbb66f74ddd27dd288baaf1d26574609d010000006b483045022100fef411e7b4d9c4b6d000e29e8f79ebb6b0442a304130b41cff9f51692b49424d02206a422ea1e7a78d2719bb1fd9ab06fafc3e1e8cb792c93261706176db6037603a012103c7793b0532447e48a0b9cd20d06f6bb3bc19e47d8214ee8bf3c11c5b3175cd7affffffff020f2b00000000000017a914a318ec285d4e4c27823173e3559ab148511c65068755692500000000001976a914e646e4ae4f12877cf94cae40d3603262730c6a8c88ac00000000020000000189c17ae45d43a30a3af958456ee8d46831675cd293aa65cfeea34dfa063b1ce1010000006a47304402206c158536693dc145f2033f461320f7ed5899899a39b716123cafb2eeae9ab728022029e1ba8f85bc76a78bdf9a9d804900991360365e96f8d93c3c60290b13430fb9012103c7793b0532447e48a0b9cd20d06f6bb3bc19e47d8214ee8bf3c11c5b3175cd7affffffff02f44e00000000000017a914a318ec285d4e4c27823173e3559ab148511c650687200d2500000000001976a914e646e4ae4f12877cf94cae40d3603262730c6a8c88ac0000000001000000023f364eaa9a1a2bc5bc9da2cb3f0907f37815ca53cfea85a6964acf82b293df2e010000006a47304402205446208f5fcf9300192f1a67a260a4555bd40b2bc9b3dc232c21f6179c26238c0220500c5b268e02fe8c60718f7f9a5107bec3aa4ad499f26e101f339c1327cad50b012103edf1a0a9f80fb8a91d132fa601ce48f37fb40a57c708175e36547680b3bc884dfffffffffe4a85d2eeef21d44a8e7309f0f5435ef583bb3394fc3deb717f0a6318b2925d020000006a473044022070c3c776129a3bfcbfbcdc6f8801c6893d9e4c4a9f292630235dc85dece4a20d02201ed958b2791db64f7b0ff8d01666b0adc11253d565bbf5e7d571b3484b1f37870121025b5de92ebb2253f245eaa9018f5e80bbba632e7e0217757a5640c60631dbadb3ffffffff02860e0100000000001976a914b39b967719c9121c3309610e7d95f65613a2442188ac6c5e03000000000017a9148d26cc44380e3612b1cd921f4db8af48a72f701087000000000200000001e6c18c9ea2438f03f146c8ffed4c3864e6cf61f7be67af4abcc4844417c8af05000000006b483045022100c9d9f48ad31a1e2d904d1488cc3dbd9c59c0e9ca7d64f973c4ad58d48d6a61d502206418a5cb2f643cf84743adeae0a2de3692ae27a6df4fed30a720723bd01eb8370121020cab6a4c18f848f131de10c557e7eed5c8c8a38948063f2fd5c4eb6f381ea73affffffff012f930d000000000017a914c84cfb92f26051bf893c55ca97d23b108e3ce3f087000000000100000001521e9e99b654bdd6226a0dc8cf51046354c941cc3a0e6a9f686a77037fb039a9030000006a473044022004867b01837ef44af3904b69770c45ed7364759c73da64dcad324c4dc99225480220034aace5fd1a0149e69a57dc36f98786eb3e65b49b5d37d988283d2188e3d9e4012102936c15394948d03a7ba3d4a7e7c7523e14194b3ab808cfe5baed526e15bc0651ffffffff03313f3d39000000001976a914c8a6bc95dfec3fa60785b300278d5378c6d453a088ac2baf010000000000160014f1fac971a1b293b2fb966542685c5793667c42fccaae010000000000160014d40803acb397e89ac6c6bfd41beb83b0cbcb493c000000000200000002f478448cf14398e6ee63c2afc0e9281ccf8245d191a9943a81c2ab5632be79d4060000006a47304402201bf0ba38c4378eae4451af933c0b9691de2c521cba821e44542803c79758c341022037cb409a01013174437a955da6e13ebeffb396464388e8a918794b492232c8e90121027b779ff80cff917bbd288cd2f382818530fadaf8bddba9f8d42c7d0b7f96ae9efffffffff9cb45073c2b1b94493949137f889e0971c7759eee0c96c2eb9f27362e3334ee0e0000006a47304402202dcd7f4607c4c7113202831c6fc7f312f09bb891339f25457c09750637434b9902203fa559d46a550b54221663e0a1ea8ff0efed4a89ebb4dce850755a236cd880990121027b779ff80cff917bbd288cd2f382818530fadaf8bddba9f8d42c7d0b7f96ae9effffffff02d0aa4d00000000001976a914e4522656c35d1a51612890fa1dfe89a0400f657288ac2b462900000000001976a9147bbe29e02c1b3ffa0c04b16ec42dffa275f0637388ac00000000010000000160da8f6d71b7afbbd06f802667269b96a3479822499fdb1ded600040bc8f655c2e0000006b483045022100a9b9749acc5a9db065383ce464a485c3581c2d6fe2d2314c4343457cf5a8689c022000a51e1940c35347add2c057affe26d169eacb14323a138868d4a1c606eafe16012103cbe0c26ff9177fa6a49344ce5ae7b4e4cc319e5ca915544f32d96255a9af2e70ffffffff012b60000000000000160014e4771f54dc503442da8a43c91efb59edb659541d00000000010000000001017e367041ad6024cc3fffef3f9ce4325b15b2c00854e6ba415fcd2d23ef8a55d40100000023220020856d9ddd19b6e6ff9f9420256a3110ee428660a8ec30eb861b0f1a9c8aaf0b25ffffffff026c610500000000001600143f72eca48a4f6ec12516243f86337d16db341fe34ff276000000000017a914cb3e0242dd20765c116fe74196455f7616f185e387040047304402206f13f9b685a89b74c7d6b1191e4646f55e75c1f182f96b2e93d7f044a50f788d02200321adb5456be97ca06ff1e4c8b7a7e6f70d6b588090d69ad7f9a6f968806202014730440220737782f890cc1519113522f3bda570497af7843088f2a01dd7003f2b0dfce8ed0220786861eb0d6ed6df9a229dd4982eaa52d5f2488177298e6451f0560e42edb5220147522102ed37d621cf85f2b432a2e50c9a55b7d29399a2e7a16c3671d6b1669998f7ddde210305b5e457422ee22500a7df3e2884c4215bd9d9ead1eb7013b206722be7f3b67252ae0000000001000000000101d43085e255d45ed53b6f802dcb53350c3ac91c95c5e87159b7882f4f60703db8010000002322002090c286b6da50a952f3f379e9e28411ba86c791552e9eb4a5d2adc114d0275c31ffffffff02589608000000000016001481421bf6cdf75963723d04f39d0920bb471f647dfe32f1000000000017a914b27d8ba7bb57028b354affec3234a5fe2d6ff60c870400473044022003918c26c04132c336db956cdcdfd8cdfc67c8da73ecfa6aa14466feeb9cc4a602200e8314267e5d57808e7daebfbae50544ee3f9cc7761064086fe8bfb7bf84cad7014730440220393c960f9c210af820bc3a9fe07150459d1e53c5bb02315648b5641b796bb51e0220063c771c00902af38fae9b5e746a64b53e774fb959ae83385c4eec96176b87d1014752210355bddf45e00fd5cfad059be0ff5ad810cf30aec92ad677177ebc708d1bd289f52103fe4543da591a5f64de44f489b597a467b21030ce9f264e878191aeed176a273552ae000000000100000000010178b7a216353b71f01a0becd0d6eabdd7f893c91548435b5bff4b32d7e1866be00100000023220020ccabd61fd45d5182c1fa3fcb3c3a301a30976b10120e31ffa315f17ba6c94b5bffffffff0260860000000000001976a9147280d4626ce4c47349e8fe3b3f64cf5fe3f9536388ac020401000000000017a914bf610e4c98d45cfd92a5e4d1f4cfaf0edac8f00087040047304402200e1e2147f015c1a1a4558500de4df99511801a7590caef824dd1c921d1390270022006a3f2f01336273513998bc629d815ca6b495d3bdde34b23b0787d8d2e14c63001473044022026052161a0693cc52556213762e166fac873395785c98723d26ca275bf7b2bbc0220520ae29e8363f7bd98384db4e2dded3be1eaa75e022ef6fd58299802937ba1810147522103f995145fe1015ba2df382d2545f5f27d1991cf16c44c7f4456d01b9e588968592102d9deebf4e94f9e01f4eecd6f2c6d29201d2e98d7cb19a27df060a200a4243f9f52ae0000000001000000012c1141bbe9b17f564fda66089fac4ad511036b4a9e8d3698e8368103f9a23f031d0000006a4730440220464ffdf1405442ba40b05fccdf7cdf9a119fd5ac8ea0a2246ca9e65f5c94a5680220669f1c7649deb228d612992c66eef23bf727d12ad67bd9be5b879e0b5833eb9f0121036ab047686608b3410b273d22e507a5281c1d89fd94d51825f245cb1330d3d02bffffffff02c5310500000000001976a91494b66a8c635630e08ee56aa1e64081b5a985661588ac83710a00000000001976a9148250c8664e269b881191864fe412dae7b116923088ac000000000100000001b17430e09ca68694ff6c29906a3bdba66956a8ace4e3579bb1881088990773002b0000006b483045022100d975dfa9448f1786aba722d9de75071c9dd91c4053a028de5b2ae2d056047e0f02207f4118b0ae85f7ef0d042a61607340aa06fe0b4259aee5d107db12aa31555f8001210275b71622c5b5bbb46203dec1b56f48a3c9a26ae0c9d395786b673296f485baf5ffffffff02804f1200000000001976a914996ed2d08a89a480a3c9b7fd04cb00c2c6dbe43d88ac3b423900000000001976a914dd4dfbdd81abb7c4b68af989c7a6b7dcaf5ff61c88ac000000000200000009094b74a06877f3d26350bbf555183b9be5bcec360e165629b280895f40751bcf090000006a4730440220081e9e2b85b50895acc38c4dc0b34f6967a74415f67f67e87008147281a3770902205610ca1d34348fbc71ac3481e24db5e5c094d4413a7618be86fcc7a228f6d6c70121037b60e20671415378dabc56fa2308e8a02afcd00083a5ef5b26bb25b5611cae22ffffffff820a59521b9756831acd29dc932108c3d6b4216952bf90e1d2c30f58591afd570e0000006b4830450221009f9afbd83e0630739b8e141f5936a4fbe32f51bdbf169c6f79f402fa209c6132022047824e6b033197c2a865c671ccbaaf273a64b8dd2634c2ba86ba7c476f08fc62012102717851dfbab1a03a508946b88983eea57402e32512d3d80d255f592c01e4c652ffffffff4eddebdfc6995cd174c7e117334cf644a754c1157cb76ea078f740b33ce4230a000000006a473044022007f32ba13ac3663123f269c0aee703a75324502e94137b84a848fb6e83fdfe68022003a8ba444c4a68abbf8c2bf16801ef26098e81293011fa55e43015ba1f241a34012102717851dfbab1a03a508946b88983eea57402e32512d3d80d255f592c01e4c652ffffffff85e14478714846bceeec01ffee4500f50aadda7d4aa3fbe5c9614610aea5bcc2250000006b483045022100956cc01dea97a51d42b0d433d95d156bc2e628eac32de35a912558b8746adf7d022051f357838d0b9f2ee309e4908c6999a454f789d4f52e0fdbb22c12d240233fe70121037b60e20671415378dabc56fa2308e8a02afcd00083a5ef5b26bb25b5611cae22fffffffff4e1235b74acb7b8cf5b1926fd6e3ad3896fb6799bda21311d1c0818a4c3c9191e0000006b483045022100f35bcaaf2e5f0fce7f55731e68e085da6ac4dab429d3d45602d6bba9e7416a7202203f610a9f1c22d5b500e8807626ac4e45ca343e46b82c8cb19ba896dea3c374ea012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffffd29542b0709554150c368767d2373d3d7050c08610d8ccf7c3e1a960ad7b00727b0000006a47304402207af313e115bc66c3487c992ca70c16443b10f2e7b7ac680ede6ff522b69f3f6b02205984389fdeaa3706ae6caa24918a4b51682624884c6991fcb8cacfd089c38362012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff37163ff264751672a12b35dd29948063aacd88ade3f285d43a4fbc7e6270c4b3000000006b483045022100ec225af190c465cad10b82ffca2ae80e74a06ce224680ef36ec4408774e683fe0220755cf4d3a47856472c8c4bd970a2bb435c32c86a34ff12c9f3edf26665ce3945012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff7d121702511bb336a6fe44b286e99cf9ac84debfe9eb422b0d596d562bc99f9a000000006a473044022061edc0d9fb4283edc955706415f28e7f660a60ea9f43782f1f0a6d6892c2166b02205e4c7c3ab829c9fb0c11c919736bd55441027de9ca870861b83bd4587601a344012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff682fd6c4a1917af2df62c9081e65f2e6a8b2106470b928499e7ec7c63a3e4895040000006a47304402207e07a5cc16815af98f2ce68e3f2faae03ea86328cfe6b1db06f868a023c713fd02206e350baabbd7ffbb40392487093a4f821702691f3e2f6c0822780783847c7fc7012102fad1f82d22a4d06b7744202a43293de3976c34c82e14e8745aef11eba5f09174ffffffff01d7c44900000000001976a9144037758b99566f3b65fb2746b88f8bdcd593496888ac000000000200000002684a62c539f245b90382a034671e924a8d9470707f5e86789146d11740cbd755010000006b483045022100ea1920258eaa8842c714b96614c061e6a88d5f3312519c0c1313f8f6511a7a2e02207b8f292c6eca8b87dda782c7ceec436126de31d273344c2b58c63cfbf5baa2ca012103e7301d8514cd03686f0702488732e4e4082fe27ee24c9a220f8446abe47d51d8ffffffff4e1d50d8287ab7fe777385245acb714619b6916c4731973f6d291e3285379e8c010000006a473044022066226321184227ec53af3e5a062126aac5403917be03eb897d1fbb7be6ebe7bd02206664d791c1d22f4baf4d3d9e3c918f50255dc785922f1e03fd4fcfacc65647c1012103e7301d8514cd03686f0702488732e4e4082fe27ee24c9a220f8446abe47d51d8ffffffff01f2d4a200000000001976a9149eb7e6a1ed07f1c8daa9ddacd64a0fdb60c288f388ac0000000001000000000102c50d2e618a04ac0e735ca4d9755c39476ca410156522e29325281f3f02a5413e0200000023220020abc1eadc96e27d63e2c1efb67e9c95feed77a50302bedefa0c505c9c8a700836ffffffffd481abf1f890b7b9abb781a3c79ecbea09f4b693e945a04d88c0062b426f18940300000023220020abc1eadc96e27d63e2c1efb67e9c95feed77a50302bedefa0c505c9c8a700836ffffffff0495ac0c000000000017a914bb09f7691edec40edec73af26de7fa76db15bcaf8728533f0000000000160014ab6d37a170f31517b7f85397a9e30eebddc18f7a31e14f00000000001976a9148dbaa245915eaff25209467d7cc4ae97211d1fdc88acdaa87e030000000017a914bb0e8bbcc750f45da9732d1e98910959e138b50c870400473044022049768bc0b30edd916aa5e583b559912816dc631318a68ff809669cbaf25b8f150220728f23e16600d26dcb11011a566bfa4eca723d557afeec299cf92b8cd48f6f6d01483045022100dddc724cee2e8b54ca17c9fa5a50a723d43fda3cb8273ea77902efeccc5488dd0220431cea5a3da6d33028d787bfb37eafa92538430626d41351e4a308fb84d8acce0147522102103025dff91c69110bf6bbc3ce68eac1f7d4ae12f17e191eac210674f1ea9261210340a52d7230a51a0d75e8ef5d6f0261346a4bf4c4cf56dc3523512c1ca0c30b0052ae040047304402206c9e9c2b9a5a61e5f470eeae9d3cc0c85c0f83d4b5c3a29e0d3635280f7b125202205ea12a42387819a65ab50c8c5458346fa5f1c451d88e04460428725aa7ae1cf5014830450221008d8e95cdd6f31f6bcc6da5a6a752681ae2315ded61a191d86e011ba90c6f529602200ea0e028ede0d65685cce85fdedf5ba0c8318ef437e816465e921f037a971fa80147522102103025dff91c69110bf6bbc3ce68eac1f7d4ae12f17e191eac210674f1ea9261210340a52d7230a51a0d75e8ef5d6f0261346a4bf4c4cf56dc3523512c1ca0c30b0052ae000000000100000004a2eab2d52f9adb14f059a1f5c147bc1dab10f05a81d688687b1880d7df7cba67000000006a473044022044d9854f52fb1cf499d94c07b7c9a8455e7e46bf09c9261b4f2a6d2db9689161022004d4c114fbb212b5de790a096b63cc50332e97b1ddcf38eb8d7fc77ddaa2abf6012103051ad4e3cdc4af3d7ee7233eda313e82c32d98e1cf8bfa860f5f983dea374ccfffffffff2a2f7aeb44c740252e3795fbdbe50fedf2fca35bac0c222276bfe369be975172000000006b483045022100b9a354f5c98da112ac136737cdb77e13edf40e01d2ff9f05b39971aa43d2eea2022060cc43891d22c8e5dde72a17e1aa597b699d8aa3bcf29a0333d69914641b48aa01210206a73684622fe47a8d518b3ca2654a1248921b2a43245c755f5ba7bd5d0f4d8cffffffff9fa93963521a523fae045e5a73c0e2c3c29cbd0bc11038221ba2cb30e21e4fd5120000006b483045022100a6b7ebf1cf28bb7bed43ac618ec48bf3b5d9c99cb5b992c83225f54706a8299b0220357fc271a534d4660108e74bddaa70c050031abb6e6e97f68459d91d99df9220012102990ac27588517096985445a51e5a06c444d5e38782065755e40e474ec180639affffffff3be6de992d2c5accb4c56cb9a92f6c312e63da6a6ef6e328c188cb27bd6a2bfa010000006b483045022100fd0dadc922f86d6f06206573a362e33a14bc140943d34a0b6e1faad573c4446002206171d870d2e64aa80b6f7397870a14a908b8aef25f2d1df8b59919284ebed6b2012103e617f6a8605fb75381dd73ca444c6d5df364ea2fc909c36bc9c100c9254d2928ffffffff022b160200000000001976a914dd76fe01d8efcbc67ad2c7d56dd29cbd75c4dcb988ac8cd61000000000001976a91408e611377d56aacc204d79efbeae391e19a9df1588ac00000000020000000139241356bc5d802450d89536dbd9d4c0aff24e0e3fb9ce6f2cd0bcadf2d1f63d060000006b4830450221009d08c6114eb0eaeb0fd382f5b2bd17788dc68b3360135e85ae20cc894f4aa51202200105e8e791c649de076e2ca86199cf7608cf813f7e9ca82708e329c0154ff77901210339dc876e426f9fc3923ba77c5de81b9f1e92d76cb6768cf2f38c2693cecdb8a8ffffffff017ff53600000000001976a914d5cd7893de0da0adf7eb84386d07196d9523500688ac0000000001000000000101ffb4230b998cd99fbb2729c8efc3f79aea1a3707bec4be510b03901e838f6fc3010000002322002090c286b6da50a952f3f379e9e28411ba86c791552e9eb4a5d2adc114d0275c31ffffffff02da0d05000000000017a914dad6c8cb5f2633fed0291cdd83a2f527d36f8c4a871219ec000000000017a914b27d8ba7bb57028b354affec3234a5fe2d6ff60c87040047304402204f5404fa5068f1944abfe890064a5de56bdd3d697f91153b5bb96336f409ae29022024b4c11e03e7ebcc854bbe7cc666f750de2ebfecd27efa2d821ae6cf9b0b59a301483045022100e6d8e0fcac72e297fbc0b3be13193ecf4b901de54ce374f35b19d77f36d3dffd02205360bc2020063c90dd30a0c586f453c90a747efeeb38c72c4497bca67b78a15e014752210355bddf45e00fd5cfad059be0ff5ad810cf30aec92ad677177ebc708d1bd289f52103fe4543da591a5f64de44f489b597a467b21030ce9f264e878191aeed176a273552ae000000000200000000010105cc037e2b51ffc638bc449fbf5b11dc2084d7abdc6afda1a33365598fe108c40000000000feffffff025cc1000000000000160014a18726a4278615115cb48e4cbb83efe8cb54417c5ae3140000000000160014d2a851cca22f65301bcca6775768865b697bce96024730440220011e0ef1c63c939bee206720e91bf2fe1c593c6dddf4c4262ed3fad58580beb802204ab9e776b82e59ca6a912ab5cb64ed64fda683bb0866fdc271fd9768d8b8ec9c012102fc7eeadc4611e354e717b9bb68eb0bd755710f4a39c40b3f0dca951fb230722e49a00a00010000000001010f0c1f20f9edd0e33ced7357b6358b25d4450deb903ab1c8629067bb222e0107010000002322002041c7b4148b46e77efeb92fadf9dff9f02ca737aff0514ca97c10fdd2c8ca07d6ffffffff024d9300000000000017a91487cc505f750e72ab64d5576839a649c0834dfb1d8799417c000000000017a9144d1d7f277dc7f745a99aade1476ecbe8769e475f8704004730440220020118b5cdfd6e0de3514035755b0dd412afb5b503dd9d3459d61fe85199b3f70220447dcebc90e3961c1e81997a3432cee69e6aea9b162b7c8ad21ecf0b2030796201483045022100fee6f91e81794a140186318ba23b0f42445699016d11d4cad8eb402c8a9d12b302203f8d8791a7b55bebf9f87e6be279b3d035b9031d8c482b78e6ea72d83a449ab2014752210238dd979b27ceb3865c6060af917f97a0b256f788528e79884f9bbb0020ee9ea5210362a27fbf7fd64c870159ce8961085107b034a7a1b088449699f98a10c104116652ae0000000001000000026f08a38a2131b1612e51e803eb673c7267200bc52c9ad8fefc6253a146d7ef1e000000006b4830450221008f25d669dace22e86b97dc55a053b62ce59cad59ac517e4792cdc6e948d1ebe402203a0894f9ea25506b00f8be0c3ba35f956fe6b67a86564f683bd15ac9aeebe9be012102d5a75b7d77c8d933b29cf9337d18acb4512e3c9af290e6bc98307ea4545ec805ffffffff198546b2af77372ecd75983d5076ab9c1522bebd1e4f4cf5f6cc978e82f109f4070000006b483045022100a1012502e8fae6e34b576eff2b5c411be1c1fd4a01f4dd045347b370dda1be810220046c414e3a31b3c487471debea70d629535f1154f6666db2c56ae104ec24a7eb012103fa1d336f2a714294152ebf5d405edd881b85bf1b6253f91f58fcf79643235c8bffffffff025d8700000000000016001470b43e4a3a601238073707b2f7ab9d31b10a262a80100600000000001976a914b5c0c07df4a32ba5fc58c9a494aa6db13bd99a1e88ac000000000100000000010148b804d36bfad74fdb27e05eedf34c8a00fb3fb61dbe06e0b85f8b266ea8cad00100000000ffffffff01d88d2200000000001976a9148f2905815205f2e2e57461231645e9163e7ddf7c88ac02473044022076e5d78f395cca9f583788b80fd651c7e9a2716f7366e99bc3cce60d4f9e750c022072e5b4cf8a2331dcc6cf22a950debe5a956e032be9a2849593e85098f9ded679012103a61c1b5c668b325dcd10b53ebbb36d5147ae11287e8481d0efc993bb2327503c0000000001000000000101c86a0834ac8351f8e8b34820f4ce560cee1593a1044eac616502a9f2d45f412a0000000000ffffffff0187a2000000000000160014e4771f54dc503442da8a43c91efb59edb659541d02483045022100aa68801b2e277e03d4d51443d4ff1502d4f598d9add7739ae60a120e2ec292330220086cc0c20dab9cde1f7f07e6cc2ff873f86b5df3455beb5b67c4024ea680732101210384d21d3094a4144495db6a104e23676a13ae39c361f99da47fb51cf4ea48d0ed0000000001000000000101636659eace17f713642442b8f2ab17a4dfb115cf5b93c4b84f63d494e3aad5470000000000ffffffff02322200000000000016001469613763890500ea3433f9044f24b0c3a414c432225600000000000017a9149558ee169d636b0e2fefd35d7f2299179fc807b18702483045022100aa10a6e44f4e714ef465cfb0e20cfdba1c5b339d7d5796245e2425804a7336b902205d6f42a8d475af63fb3315df369827e87beb08bdcec09f0ba59d1616990f1483012102083dc7068558fecface3a64cd52024606232d554c9b2d3f7c1f94820b1b5cd9800000000010000000001019721b67b99e6073786219e002362fe7312b9135a4c1936e3f4afbf3d39fe33f00000000000ffffffff02f697000000000000160014a976a951bf282ab8b914c109f13275cd267758cbc0ad00000000000017a91410fb446d632a3811169a6286fdae42cf5061d2e787024730440220746886f272f56bdacf3cab83b3ba29d2caaa0d191847391c59c4ad31968fb70d02204f0bee943bfa92ad66c31a681b941860c178dd0ee31445f6c1a7c3d0c6c173490121028b5cd322c86cdaf279b61726b19919c9d53187750c27e2836f601562d362f0130000000001000000000101d7fd4664c21fff331f74a39882b2fd554b75c9193bbb0b9f03931517770f61820100000000ffffffff02805e0300000000001976a914f77dd1226a187d85206851397baa4cd44c1a1bc788ac44d6530000000000160014da45e1c44b21b9169170b0c6ec71dc2e0fbe917d0247304402207cab23d4517c65c120c7bf8c0de2fc5f168269b32118e5ce7dae58905c6c29a3022021f56f1a598178cb8faffbebfc4b8d7cbbf5e45a23fa51d736e4bd3baa8a6047012102979812f0a01a33d25597e721950e3999143a88d1bc03ae74f62583e458c31d2c000000000200000000010bf94b64392f64c68649582bd4c070d3b83a5b3f7a52e9ef1c2599633d4ca021ea0f00000000ffffffff2ad15a7d1d69b218f8862f1c7f238fe02053bba234cee1322778d30c5ac325c40100000000ffffffff3edff33d6badf36749e16ef9933bf9429efcc5ce47ba81885768589f0aca581d0100000000ffffffffe18ac0a28402599359b97073035ad10bf431d544019c2d79c390c3b851056bf91600000000ffffffff8d9330ace746acb452749e191caa96642fb364d5948cbf1219b25786fdcfc9d30000000000ffffffff0b655c60115609cd3b70e3ccd5042390ad988900857be2a5eaae87a5b9e2a38e0100000000ffffffff88c1902e10a24feef7bb81e5f3b7251ab67fd5e29a1cb50169115492507c809a0100000000ffffffff26593ce84226cc13cfc7ab2e457431d9d25ce0cba256060445099e33f93c2f690100000000ffffffffad8ae51332d0271ba29f82f339412d628c9be967c153c9148909f6c2719078a70000000000ffffffffb97b1bde112cd36c45f24e0fdecf61155a2b394c0651d2a5221e25fe3d12c5ba0100000000ffffffff25ced35e0871c13b4d53760766a61f8c28193fa5e4b714599597dfacf451db8b0100000000ffffffff021e948600000000001976a914d6f51ec2e795699280e6ee78b6ab5f2d7c221a7388ac46e2020000000000160014cb1dcac9580d8da1434353ef77f7632ce1d687a80247304402205504ccacca99639196bb5901935d4a968c972a9a3ca56719cb5aa32758e5a82e022057eb5ca2d23936e7db7ac6979cd7cd71a433263a02a70278071ce9b320b156fa012102f3c9e0ce1eb9d65f38851dd49eedb75fae0986ce993133b592f3ceaf3d59286202483045022100bd09975700174a91403ba24a8ef6c4f92b073f226199460934ae0853cf79e7eb02201aaabf778a2178b89ab43d0fa6afb32eb372d40eeb30a1cb394d9baec2729909012103800ea6900ba27b0ad680d7d21071ec21947875338863da111142492b34d3ed1102483045022100a87d949c2761632989bca7ac603c6188de8126a2f82eacf7b907eefa6e74bea802203a6edadf619dda81bf950dc8fa91b6f85f83b55d57007d6cecbf19477efd6588012103e4cf6715b91508b9ab44138288014972f9c4ba0b5ef0931899e9c532de9b030502473044022047fd55b49180e1175ce8a628a8672a1dc0932562964da4c9ab83ce6b3ca5c1cd02200db37e91d1eda1dcab65f7e971a0dcda91b44940c9d09ff0bc2bfc129f07f932012102c8f308bfff66a871416c01d972cde160e09e4e058bafc8081c246903d8fcf5be02483045022100d3356b18c2f091f6af5f7245b6db25c3f418b073fcfc6b0dc49a5bdde429c8b602200da564c0c79d84a8b147e39909456ee0fa572b37095a9d4a5011f59c56d759a3012102e1eec5188e687dab1f8e467863d2c830aa62df523e7622b355bb5648da1478e902483045022100eeb8886971bb358275028d7624e6bba40aa00ed15af33941e261a34f615e05d8022041fa171ecbcf85c596a407761c9bb9346b021938fb74c520f523c93969f9f8520121039dc3ce865a2ebb9bcac2cd884165ec6e57d59759bca235167a84df106d493325024830450221009b6234b7f22926e4447f98bc9150a9f445eb42824347dbf38689705f52dbe6cc022029473c2fc2ddc11dd2d6abf9fe1fac30e88e45be8d42dcfdd6b981d1b5ae31c4012102788e8092de72c51c88595a778bdb452f9555d292f202184d2ccbab95e68f5e1802483045022100cc80698e2607f97e713058f3ac4febceaf0138fb33b862c138a58ca525630b48022001245c62d03ea6b659b327740f43cf0c206032d0aaa35e3b74a64a069214d5770121026468801e63917635bae252a2c7a78897807f9cc4c7acf76430ae88d8f1ab1e9602473044022018e6f711bd62fd461cf48015d845964efa3da8d49de1fc2bf23f24c33de9b0fa02205bd55ea71c564eab22c1aa586a84206a80e803bff33f2c8509e98dd6901d8d5d012103463a167d5fda60d0e9eba244520c91b74450c1246bc23456bf2708cb68d0733002483045022100b9b5d2b5ce6cc552c6c772c1ce485b77cee7970b1a739d3c19cb112273d1ddc302204b4ed4e84fbabe075538e5caa51f4777f09d53e30192afe8b5755f1ee51303780121038de32af3e77feccef3588cab0c065bcfe9dfb038dc72d4739128d6f6a3cdc4d302473044022042c8cbac19f99310e39678fb6aaa4ca3c9fd12cb26403710b0c8f79cdab6191a022033b9f9fb5ee4f7c5ad70633e7cb670825a3f0e5fabb0d5d4a1d985cd519f39d60121037f70449636de438c21f67091b50665f5fec905278c143b81406caf1b9c045aaf0000000002000000000102d623feef1ca4725f8eed0bdef0fc2754296fd0964d8bb6f12497e4f0a4530dab0100000000fffffffff1714f88786286759d58e7ace7c4856e11b42af16abee1125c127d0e3b36e2c31d0000006b483045022100b2dc62311c55ed2a2650d8ba5cc783374ae3d2825ac1a3856709c50474fc095402202628203ef1102f82e2ae3375d9e915aa74b686e03a70766bfe3a660425a64e3801210206766d6aca5241b64682a14c326940e47d81148e8c100c61b8d007580d3e5aaeffffffff027fd0020000000000160014e23f1b8cc8d33a905e1bc49929487df68a3d6592aa500f0000000000160014e031056718bd0b73e1a2ed12b099ae3bf9d632c50247304402203816b78a8c6c7903db35e8eba89915cf08aad8f7f7898033bd653be568618adf0220560e0d565fa4bc2063d181192f1bd52081c8e7d30911fb8f4501db471813a0f30121037897711ad08aa8fbf07e4cfddcb6d7a8b666b7a948924f79db3d53ffa40d641b00000000000200000000010323e57c2746b24137604cdc5729d445825cc315781687a2e0c775ab7ed7430d972600000000ffffffff0e99e2b1be8970dbd4ee53c288579bce85f992255b8c43bdf5d12e93c72de7580200000000ffffffff2b83df0cd3a8e063460c0404ecdfcaddaf85deae199cc6b5483a8c22318af9f60100000000ffffffff02eb6e0300000000001976a914bbb098d1d2deac4f9660d6ee28688c658920075288ac1a1d0000000000001600149e322944dc3724c6390178db69c82fba1c8c36b802483045022100b27ead8a33d151b0f9f4130a6f2b734b20fd91ca0adac213927f192fbb620b61022048f5099cf75f0f2cf3a60fee814d2e7debf17547d2d84e01f39a55375f2f1099012103e957b6b370dbb2e8215ed36af1cd1a0be3400f798cb73d475f847ab82be5f9c502473044022055f9825192f4ba1a93a5f0e0198401ba8e658c7e62b445b46b96e8671ceda9c3022060f9ac56d0eb62a0fbab6e341effac8a1b44ea2145cff2ad7becb9f927974dfd0121025ce6ec1f0557ee88e7f000c6ee9d8a545c9966c9bbd9b2f5c79800c6bd79173002483045022100e0d2e82406eb7c1b3c76a677395258f434a9b9d184f2e5c5e3f46b03f86ef061022068a6ae5f071a9a61924354b137c9b30f56a0cad54d6e50c0a84588b4b92b638d0121031518e49871e53c61d7c6b6881ea59fe3ad9a1015a28834ba49b56a806ec4f7dd000000000100000001b835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d841270000006b4830450221009fd4052fa3ad1384dbfa3b737f76ba60569f8fa0b1e4a6f69b3fe907fde55877022046c802d8f93f846bd3d9f47cc3b6c809ffb00d2972e647a619b82a2348c94e78012102841555d79438a81c38ca9f97453000b20e0ff084b7452820b093cb9ccb0b2598ffffffff01572c3900000000001976a9144ee170eb8066272cc93e66418192f8b96af5348b88ac000000000100000001cd53e9f536e813f375e93a604689db69a75d1ff1d5d6eb18c139ca8838b26f58030000006b483045022100a625357e8d94a1db01751dd4cdcbe7596d80f2ac6557177426d59009159146ee0220280f03ee39fec8dfbd300af3af18cf179248c7ed9b92da10cdd7c1c4f0b02b7101210338ada40820379cb5641466a7060693dcef040b29603a91bc0069012265747c1cfdffffff040000000000000000536a4c5058325b036ff10720671985809253635170dfa7f703a81c224981c8e32da395de882ed77fd9f5b0d43b64bc0adebea9635e4def9b298bddeb4c44ef812451c0509a39dd000aa04900dc000aa043047c03c3ad02000000000017a9143d22d55609b3c2c873ebc05b360b1e4a3e220a7e87c3ad02000000000017a9147d116ab76502b4f48ad1013edbbf9e56d4de839d87e9b5361d000000001976a9142073870d87637302a3cabe39bc9682ddda83630288ac0000000002000000000101b4aa41d0a2610bf001cd9f47f2f4ca975bfd9513bbed1049df1a30df3a85bef10100000000ffffffff01b8800000000000001976a9148f8e9a49c04a36227887bac9740e713fb964efad88ac02483045022100ed8a1773293b1512951859ccb00639aee8320a787f52e1a740ed7e2ae20b47c1022046cdfc259b79896dedebf93b4d9ebb93366b5d6f0a9fd09d1a0fd2a2c63626ac012102d5ba0ad031a75db7738e7aad28ff6f200ac4a7236aa02bb2b733105ee47a9f8800000000020000000119ef984574fc34b4bad989c3624aa30ee6648b0573b1e8cb75aa50a1e461c658000000006a473044022063aa1db39e7096ec4fb4dd9089f64cd571aa897bd0e9899d8277faf5b21285c00220309a481d9200644b8057674c7e150f35f9d45f6265e257377a29c3e0e5f5951201210304267774a4994ac3d1a9180a57f63ec8ea3d75953ab9542052dddd9bd141eed9ffffffff02e69203000000000017a914555927cace12074de99e918855c24aca15277d0787d9120100000000001600144c3121db082a75d77e56c9b4ce486a9dd3c964860000000001000000000101dee94c6c62d2826a88fe488b60794e4c6e8b4ed9aa3543475074daf838366a240100000000ffffffff02541b0a00000000001976a91406160e50497f270994e9e9142cf51d3d908eb06a88ac4c3101000000000016001445f99528a5f5e97fea160985ff9f53ce946a150f02483045022100d127c5716be05653578ee392de663059521132711d4f7e77ead6145397f4664f02202c80c2f7e27c32f13ca4c6ae4877dc362aa6febd185d22e7c9c83bc64c1056460121029eba79261b61b2c9f17a8a8e981c94f7d2e9f89ca6c3b3b73b475a0ee6abf69b0000000001000000000101358cd506b92eee5fd31b3989658a7e7eb99fa9ae863a1f0e02d6a43d5fa392300000000000ffffffff021ad420000000000016001499fc48f96fd0adc2b34e4ccca91f8292f8029cf6baf0090000000000160014736c4caaaddca64cc9093b96307b2d7da327754f040048304502210083b179b1d72583ed19a46e9ac032a2a4db11f4c7f182f9d58e9ce2d3a345757002201597a1485a4b8b38920341e8c7e0100a3da203fc6fe5536cc036cb642d40e97e01483045022100ddb48100a1b852afd00cf5431a6890c84212aadfa89a7562a1267a129ebdf54402203efa30177e629609a2571727c3c134ab224318c321124c5c1f4ac58411e1cd9e01475221032effac01569b8b738896f9806d323687ad0605bbf217ea76866784b06933741b2103a223fa24067db5a7a13c7e90a33269fec8e143d54e9ee78c2499ad7e3068164152ae00000000010000000001043a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa01000000232200201bdee3fb5f265d49c42c1cc1497c513b50b202b55e6e9944467eaba2af81ba97ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc6160000002322002043bab7740211f76c6c8a927c2a601ff7f6b3581113659816384279b8df486aeaffffffff90750c9740bfac58a8966fed22e702b6572dacd729ee123d4abb6db8951858cf0000000023220020ff7cdda48254139c2a64d117a2d394104d39c6263279fc95e3e5f7b58850b463ffffffff654bb8e73abff9d858007c5dae6e6b494b3fba2f245f9570b7c4b3a84ce95ba40000000023220020ae44406b161dafd728421e8ccd4919a89618a78f57b56450cbb658b8e3db201fffffffff0e00ca9a3b0000000017a914572290324c72e6842e8a77c2cbb9882a3b9c2a9f877bc59d350000000017a914572290324c72e6842e8a77c2cbb9882a3b9c2a9f87f0490200000000001976a914c57f5c9729fd0a916572c991d4583783c397b39f88acbb4e02000000000017a914777d3126444db01c218d6bced5448d601048f70987f5a703000000000017a914102105c5ea8a202bd0bd0fdb8072572223d04e0687a0af0300000000001976a91441f7f98da08c22404e6c7cf662d5ee12ebf7a84d88ac1a180400000000001600144892b6dcc105209bdd0a24986ef413584191047fc43e0500000000001976a91457814a0069befd94459f9ffb25d6278b3443cd8588ac62ee0500000000001976a9143af8c95c021c2df056c25819913db088ba7ffc3288acdea70700000000001976a9140702cec18ffadeab309a90e09d671c3b7571777188ac54be0a00000000001600147204c997e9efbe9a194425b4a39881c22825b97724440b00000000001976a914b6e59b407c5f86af9e429078254dd86e1af74e2488ac74d50b000000000016001437f08565ed0c1dee378a3a4c3f15b6003b155925c45171000000000017a9145b8aba0431b5df580b1c1e2316405ac2b22592d38703473044022015340ba15e54e88ce1d37e67e0bd3afba841b6a77e020c019ffc5ca63d6d1a79022071064719593bb2ecdf618037c5f53b9d09ebc1b6c43a61bdff847f3e16d622fd012103bd812d923b5f05f122750fe166227419716b27e786584226d96514bcbf4485811976a914350292c7ce9f9a7b86ff5b16605a2713e19327fa88ac034730440220314a45f6b2cabf89997f4eb0616457061237b5fc8740a6bfa505df77ae52a459022002ae378e71012c06c7b238372f562a773d2da1a83d0c7156033934dbf45a830d012102ec92a6d470cd5a71a534d18d9d60bba697111170e8fe4e2f0b6d980c7c643a971976a914807343b87e5ce32931ca75be4f80a6c7a5becf8088ac03483045022100e81562a6a4bb4becf633a30492d162eee55a79b23d97f9f47b12c9f1bde2ff7602201ce4ffb21aac6bf1965db1f74f3640942bc87d8b2f5e167c9cf5c529d558c94e012103d0b5a094daaf45df03583826c6c25eb5e78379dbf4990f7771a331da0d1c62d71976a914352cb8fb32449f4cfa048e508f37f6bf400f269988ac03473044022013d3248a883ca7316ae4dc1dc0f671014913ff7d00d9653020e9b1eba7dc4196022003a3d4b2f2ca94f5810fe0d75e28854bd84ab11c9b378dcfbfbc43713a82b69b012102e6b58c92f4fe62e5b9ea22814f3b08123637e15e8024178edd9ddd1b42503ea91976a914a50ace239597b420648231cd7417859e535de58088ac0000000002000000018b535fffbb0392e8896f686c18e6258252f0cf018a6e8c0089f5c6f6ffe1f2cf010000006b483045022100e7476aa390acbf8c24492cfd0768ed899e87afa2bd871285940c1f0929612ccf02203cc016abf05337484d132b2b0c328d5e333cb740e748f8a870bd12230207c28c012102748549cb8d7883c93bb4dbe6d57df15915915f213d5dd82fab2903b71a3dba33ffffffff02d8ae01000000000017a9142c3039b374edd1a56c3d1ceadd6899c4e737b7cd87f5920500000000001976a914c7cedbb41282a97a27c9f9fc2f425c3a47d5a5f488ac0000000002000000000102d72f322dcacf5c753ea80a943435ac62f07415c46e647c72f098ca19343163a20100000000ffffffff96d6f7d61ab2a2b2c6ff2f84fd7e33d387515596c09c721fcdcbcf04c2e90ee90100000000ffffffff02485c0400000000001600147e60a7ae8554c29de5d6fe5b5c746a54091be0b0509e1b000000000017a914aa8189e9461772ba854535b4ec2afb14b507ef2187024730440220108868e70e5796ba63219f366c20b9d5b1c191fbb888d4bc3e975f93395214fc02204dd74f7c78567694f5473e1a8477ddcaa42221517062a744f448dfd1dd75a4130121027682930dfeb614171d237c0a2c72396221ea8458fded8d566fb805261de9aaad0248304502210089a3341e513fb697d53554d3e2e18e70facd14b235487ea3b3b8be3515941c38022051db4966ccf9b23174987c3b1b2bea69fbd869749192d2893e3e34a3030aa86a01210319280aa1a2cd835bedb668ae9435c16b8732d8e5cfc051f2e34224e3d401bcca000000000200000000010211f8592524ee3dcc7e759a8199955019c7c2357ed23d6ad05437ef59cf0dae3b0100000000ffffffff155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d2300000000ffffffff029c380900000000001600141b4899681683587c74ada6e852c0dd8e1a3fe54093050c000000000017a9141dc25560a7a1fe1d15aa3b1420272c0c098a29698702483045022100c07e6254be9eddcbae4fd05326f2e539be52c0bfec423c314a30350e5b5705be0220640e95ef4f808c533bad4329b6f398bf70b28f61dcf9cabedf277ddbef9b7ad801210220b7b6f1cbf01b01fbffed767dc47538d98b88cbfc5f6fd9119a7621dc2501ff0247304402207661377dc7a79f484daf343f638cca493f2212caf393948e0cb15b7438006f59022013efefb3fcad6ef3158de53f91d646df5256d21212b96024cdcebc737d1deba701210310cdbd5ac8ff86156c02e36e806652691253068da277a94b4b70c4ef25f2d167000000000200000001155fc78887fe123687396b393468be6e0923f25ef460f78b00be92194079c56d060000006a473044022003ade4a80a6c9cb61e3122b271bad86ffb86d705181601f9a34ffe09e67d80bd0220550ce3527190eb64944863802e68a02808af5aba6812517bc5cac28d9f1e36a7012103182b29de2bc55ceb65cfd2f9441e31873879115066346a3f72e5c5b24b16a6cfffffffff0126172600000000001600144e29300b3a09d79257bbd73c1819896f7e61f0e100000000020000000001014eae5fbcf7e73acc7a80cbf065559f3234adf0e761502ba02e817da0641464410000000000ffffffff0164152600000000001976a914db063005cb7327d04f7854c35ef990426bce9c7188ac0247304402201421487b70272064c53cf86a90f87902d60cc458ab5d5eed4cf00e01b0814c0c022079651f4b2b87cce87e70d8ffb502124c7a09505ed72fa128986f83b1b74111d70121030331ccdd9cfaa223f6902dac8b89714b98e63307e11d0265508a4d38bd4315ca000000000200000002756c7c1b245ab20ccaec0e8283ac849e61be297b7b7cb70d6a1d1a7ba1dc9282000000006a4730440220434c3487ab80ecd4c6d9ca7342dc5bbd3f269cc10c1594c38ac1c65100aa61560220558b747514e728a86b2ff744e22f7e52da05ac944eb31d300846f61efbdf0052012102151e89bf2540b64ec3e6cd8fff674366b50bd9864cbf4bfa9de173e9feabe2edffffffffc5f9cd8880765d510c92159e999d3bbc2f2348adfc702e1eb91513ac208df350010000006a47304402206444f607be06153f63a3d1f25900c9e9679c2b2ff658a5c3f4cd81ad987b6c1e022071470e02a50f7e5aa913d85cafffc7b81a0731eef6b4ffb799b92585d49f8392012102151e89bf2540b64ec3e6cd8fff674366b50bd9864cbf4bfa9de173e9feabe2edffffffff0206f725000000000017a9141045c97a2823f382c3722239a217dbf91483cd0c87a0860100000000001976a914db063005cb7327d04f7854c35ef990426bce9c7188ac000000000100000001baed6377c7831260ff5048087169e08eac0f8ebae0233154f6669f5a55269cdf01000000fdfd0000483045022100ff542a67f57aa20e3abd1f62d6522f812087e3361f332fb663191a6a8df3c5430220668f0bafa1b92799e16176e1d0e6ef21b2536762aee9e54c3865290d9f5d37800147304402207bd46a8fdf673e0be16fb914f4229c2814207d1c44ec2a3e6c683940a06c21dd02206ba724fda6abba0dc50f5270de592c0ff52a3f8acf6940aba79b62a87bc3794e014c695221035d007f65d53d82a36eab4ef99fea9eedd1cbc92e16dd827dba39052bcc4ca4ae2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222103007341b487d8222f00e3bc87117a99c1af4a27d3135afcbb97a74b98017addc353aeffffffff01c83d13000000000017a914ae8245f4fea8a9fdd87924a6add3618fad8b106d8700000000010000000140641603ba95a7e9ceaa65c1e5084af2995b3bb51cc6039515a0210df7208958010000006b483045022100e6e505d08c0fd890ba366728dcd5ebb9bbdd4517be0b1bf8b86532bec6647e35022047b3cf199bbe0ee8842e06c6f8c86e322c43c98b4217dda85d6b28a82f1e4b87012103f61c3451308c0ba80d90695115dd0155cbd79c0e602022d50267139ff558e903fdffffff02b6ea3b02000000001976a91435d33bfc720613a359679b0ad2b85ec9509463fb88ac53b9a903000000001976a914d490843a54df6d1889d44a66b97faea2c96c043388ac000000000100000002c18b014f02625d6214cd41a75b52b7e102aec102716d994181cbe6c11864103e010000006b483045022100c683374bcbe6620fc69ae035fa48be8e61af34079e799ee3dcf1e22cf2ba4c1002202630b90b4a5fc247239014e61ac8ab89555fb605612dbecdbd6721d1cbad71ef01210395a470d6f57a71d47d7b65392e9b7884542188d3828f54d185a3ed69711046a8ffffffff331e6d8c8bcf7fdd2ca8e7b41c7ca28a631e2a8dca7d5a19e2b5e563f32a33ee000000006a473044022001adfdf44697f87ff91f163dd0b712d81bd11a1093b26e4b69a4577c1c1e90c002201ab8a622d137bd2cae61563d7f8fe467c6c2fa14f539299b5617d9567d70b2170121026b011c8c8c894de669e40ad35c58292f042b4fe6a873db3198f4c79c4983e1a6ffffffff01a23600000000000017a91463af3523308eb382cf8517aa2d950427a1e0387e870000000002000000000105ce0c2671d3e6bf0ee0b73fb3d48400616813848dc80f986b072158de1ecc5728330000006b483045022100ef4ff85143a68b9fc05839df6182f115c45c27cfdb97f46046a30d3e1d3c057402201ce0f1197ea6ee99cdf94ab5c9b721157d706338ce7490bcd5794720b4ad0f110121039682fb980695d0a79d635abcfd35e9e38b036470f5a0e1c2bc4b998738a355a6ffffffff74d9171942d5b25f0daaadb5d49153646fcb0f33c2c4c11e7a48cf17b0d067910100000000ffffffff505a423fffe3eae253401344ec551303466a135f5dd694eed59365ca96c721f00100000000ffffffff05d35dc9f212ae813bddb1ed85bbb1a6b8830f972396910661c00e78b1c490bc0100000000ffffffff9dc04eade0821b0fb9a316868ffa2cd598fe3c5719a1c872cf77182e096a01e10100000000ffffffff02ba244400000000001976a914b26e1d89b7cc2dac9f60c00327065cd77080dcee88ac3a080000000000001600140f38436ff452033781e61dd672576e6d814312680002483045022100940a1f56130906d035603fa1fe6bbe69a7bda22bbd7e653888376dfbc759c56202200e858d068d11110dd70bd72ada463e9cb3b975ce6e89d4f77416daf73745874b012102c7103261b052e9a4084aa29f56aa9d2ec363090b8ada7dd607b9e4dd1fb9bb9602483045022100d41dc2c3ff4352646717ed19b6ec5eb8a295400ff4441ff67c07af07d523b8280220386c58bbb169b8d2cd49f53911e792da54e7d970a215c6a8df479397fbf47bb001210360efe445b2d14a35b78e52a630058109a62e2fc8515bd584a7f15921e29fcd7f0247304402202654e4f67a68b2bab1cd54588d9fdd5fe1c27a8461bce425501039f843c8647d02201b975cde576549dfddf0b26b129853645caac02ba2400965350e4f147eb9aca401210356bccd6eead3384d9d638618cdb9d8ffb0ad9f49c012dac068df003cd0ad8e6402483045022100e52810faa985091882529b780e918bf17c65c509e2f7f605096bfe0312f651f602201d4f516a864f10f55851cc00b21f9ea3e8730e3b8238bb1aaa3109f9eedf94660121032898ed073ce4cf272a700586e81553704acb9198e3b7846d9d0569688008d26e0000000002000000014058d69ca7d1d89ed251018fbd1eaff1e427920214e3f6bcfce23406fbe4e691000000006a47304402203f8ec9a3387c74a400736e4531b69cb2522f9f796af6fb033c6d09bdf2dbd71c022030edc2703308863c63da06d61dbb45b4e5e73b8a738f8f57869f4edb5b283f56012103bec75ff4aea0aac76017e387f4a1d123a362936fedf5abd822bf4aca10a9e656ffffffff027bf100000000000017a914de8fd64a7610a11fba8b03043cb0a0ce4b723f29875c0a070000000000160014ea225d985d726fa779b126c3cb72dc121a94aadb0000000002000000000102f32593afd6685e83ebfca2fb2e19ece8f4d7d082e95e55419fcb217ccdf2bf8c0000000000ffffffff5afadc602777a219b8cac7f6c137f29f9624e2cad50f97293a7665a6895c8481000000006a47304402206f71f6e286ea11a73e04e4edf0ce3daca925c82f61af806228b01a10a250524402206abe4f56e3145164ddcfa0c17934becb255af0bcb11ec461f697f6805428ce360121033c1aa38a767d7e0500baa89cf3f4d9ded59c972d0c531961818b0acc17b34c2affffffff01d8d600000000000017a9143e77cb835a25a7e57531f552163b0ea00e31916e870247304402201aebb5e0046edd2ab62d71118c1b911b2e0c2f93457b63dc3d5bbb045f35a52c022006a151bb71743e898ea300333e4370c6548d585eb46c859cdd5394063a892c5d0121022475d42106ae7426f0604e4bcfb806cec313e67a0b19a67787f359e9426346fe000000000002000000000102b3e870caec09860780887da3db8382c1d6f9eb99c2d3b3e602d6cd8ab7c300f70100000000ffffffff33c83b537fed914fc93e323fb97c289426c7c794cc25eb6de991721f14f454f20100000000ffffffff02c2380500000000001976a914e913d96213e775c224a6ee6dc850d3a25b8981a988ac88b6010000000000160014ebe1e87a008cf034d48f840ca25bff3e98749acf02483045022100864c1cae9cb07e6dca957467a6f86284cfa3f085cdb7c0393d704b07b1e4f79402202e18e41e83cb6d8485759a1a45623f1f2949dba9a768aec2b6df72668ef39b890121028df2598b0f4eddf36ee92adb06f96e7fbb89db2bdfa8d617dcc488a92a59504b0247304402204e78af57e941c3ba1b32932f171c03cbd5d9d44d14b8e16b28d968d73449b81502206e0636456e8ecca68ee6bf6e1ad24fb7819ee4023ca0fc43a9e2ca600f9206040121021ca2f58f3f49bd6d0f250b23be4b22d327f223d083bc4f98ac4763299b97d3b800000000020000000001025c0d20496d4bb1767c46ef14e8ec8ced1e1d72de3b24bad1dfb11e4307343f3a0100000000ffffffff22a84b19f45d05c40be86bd9b63b7de02a5cac80ad81ee32a82bd24ab26a9ffc0100000000ffffffff025b5e0300000000001976a9141805b2ab5c596109a4db20212669b84cb57f114888ace98d020000000000160014d056b41dbbecb4dc872fc37c5e764d431348a2a10247304402202feb798e357ca897a9f37f46d0ca07fef5ccce4b10e3484383343e81880240e5022010ab4e7da9a516331cdf69457262b3c83b477a232b799feeee615f2d866ac7110121027f8310d4177376c6e292a5636e6749b5444f9c0b80321d5d798260ab3e06dff302483045022100f1e8c3d71874b0f63422ceecfd966aa5c1fb2393250de5551e6e7b9c370484650220619e8be9a7524b1b1102db9aea5aabd8b335dc529d47f7e862e0b315c9aeed09012103654f0ee39cdf7c53741d3906a50ab8bf72dabdb6fe40445c44e4dca9135fe1cf00000000010000000001016cb9aa6026e0560859e5a21b311a2d8d759e8e28f7c8f82b1c88ba2ad9fdd4040000000000ffffffff01305601000000000017a914c21cd05f2fbcb8cd2aa4299071fd84f3195ad28f8702483045022100b9ea99e7e531d8c0c099bb1cbf6d9897554d5b42da18ec8ca12d7677b70de6eb0220358e3da357dfd81f29190bfa90a3a0f8acdd6c038b992f608e0191c005d337f4012102fee108530c0dd39ade2582601b6903a115d88faeffa790e6281f79db7945f1f30000000002000000000101cba6c5f0facdbca861f48e6b9a68c6faf58979fc06a3ab5da679b11ccafc76b60000000000ffffffff02b29c660400000000160014e3e7b6a5f41509658d70044b2c4a9829b810acff97e40200000000001976a9141ad663ff8cbd111dd4d4b43a9305159ceea0607c88ac02473044022078279124b385ab45561c2bb3589589094d9197ae9bc296fec0fe16f063ee4d4f022032f7d937e0c813bc7734e489407ff2d97a5f960dc1d2788624c68d615f142be6012103e5aefe77082d1876def036b2c2570bbd12b9a4c95288bec61496d7253b06f553000000000100000001c019b7d40e4b0e8a0faacabad4c7d07a580308fddbfecd1275901ac04cb168be1b0000006b483045022100c0e8c7e2a89f90034191a70322b6d3062aa31f0594a8df561c5789fd03c7c17302207ebe4267180cce45c3358f25e871d5ab12b80542da8215c4be327ad2da117adb0121034a6593321ea44db3a8ea908f7dd5c5d3921cd816b059329fb3f26850c8cc3671ffffffff02809698000000000017a9148ddd0bb20f9eddc797105a46d88f0ffe8fdf1329878b6c8104000000001976a9140ae8e97489b9412f3f2ca6a63882f762174b368788ac000000000200000000010112bc978096f6bf73a797a9cc88eb2afbc3a6fd2d594c27922b02491605f452ad3400000000ffffffff02d9a82100000000001976a914305433d2d7e526e70150c695cca26d6364cdc0ed88ac829b1c0000000000160014e551cb5be4e0d32ae10380f0572587b3428c6a590247304402206ff9acf5920a88956d3dfb0a9f44a717797253cf4871380dc9748cb061101cdf02200ff66f4c9d1091103c272f0c17c540a1eb187078a2e3a58dcd45e245fc3abba60121038820457a3b1542ec4eb1577e32b34d314e4b5708d828995c60f3178cbea381b2000000000200000000010188c5e54faea52af2dda7698abe953063f961d5cdb4978f6b901b35d7f07b41a30100000000ffffffff0222bc0600000000001976a91495956f9826e7ab645b2bcca28ec2a74341c591d988ac925f0e01000000001600148c9dfafdb0c00b81b2612b98f8970f13644de3360247304402202c8c60fb781fbb9969755609939e8a85ac871e05b69252ae90f010d460187bb502201ce66a0f1794e04c8994a55ec8d261163f471af65294cf25a7fc2bf1226a509c012103b723f619455c313b833144f52401c7fd3e8d42a4f66cc939ed2b0a3744eb9142000000000200000000010189941f8e0e50d376108fa41648ec9082c55b2800b1451fd98d1647b65cc8a0e70100000000ffffffff027d920000000000001976a914d44c1afdd18ee0b038b292d4fb95383e096429aa88ac2c420400000000001600148300a21ce46c10d1ba40e0dc60bd657e4eb106aa024730440220366bb100f49a8d70696762f80d6a04f796101b3094514285a46c0fb8d1f0cd2c02201396b5f43e50f77ce6d01b04b1a3202c2799bf94f1123f7e096ce74cb7a3c7a1012102a6b71d263e259edff700d4f03ffbf073f30bc060b538c49c8ed9d4f6ac1de6a300000000020000000001012c088954137b3eb58afffb455fd23beaa185d2dab938d9c66b1acdd53cc9be390100000000ffffffff0204f40c00000000001976a914f5546a67bc2bdb60cd072829f6a7371172676bac88ac98070a0000000000160014284ca649bca6edb800acb9c0ee4728d61b9a5944024730440220068d0d1432f1ae5ee356004fa0283768782387d51a3d278239db63c7c25ac0f70220328339f4441d833215b09935065746b1ee64dc12b9cb5f16df152667568cfe08012102322cba245a40791cd559f4f76175149b97efb5988321b41d1800797de2b4d93200000000020000000001012221c5637ae9121bc97080817e4ab28614a180ecb0f2f02fdbf999ac3df395df0100000000ffffffff02b8170000000000001976a914e279994c19493261ba172e01a1bf64ccfb0e495388accd2a0300000000001600145ff97718458272cf15cd25342103260d7a42a3e6024730440220195dfb34ffda9ded344051cae51358386243156ad6c9bcc41a8aa938102acca4022079cea5d8b84f08e135696e5eeac8376d6dac4b90134425ae9d15fc3be1442395012102cd98e3dd4a94b4b246b3b527fc5ed0468380116c5d2687ee916112e2d057d8c900000000020000000001011f3b69a01684a769888386d4554976ad984f1175ad783a154e76e7b49bdca9a10100000000ffffffff0256ac0000000000001976a914cdaddf362eee1f3a9895be71c080e53b08021c7f88acde1d1100000000001600146442ffc03219b8dfd83a04dd971901c7e28defd3024730440220367fcf03ca7fcfa3b45a33a15df34b3cbb2ce5156b6c3ff54c91742d42c1c7f8022075ba0bc82d00ff97e5071540e4b63417fcd99f97edb33af1cb61657e225f0346012102b0d2a5abfd733a9cf7146ebfd5e07201312318793ffb17f7eb9969e1657c923d0000000002000000000101e0506284890b60424ba4696181a1c7a7325e7c95d31b6b25a6c6ce5078b2ee230100000000ffffffff02371b0a00000000001976a914c88ac84534a9e4629f2d01f20364bedd3e2e90e688aca223c8070000000016001401ce1386304dd5e46e613e959a950b073012f8cb0247304402205ab6d912c32072583a82ae3fb0714370ec92f4fce961203ba707cfdf4de07c1202203bb251818f171b7aae9e7b3193799966530f3346a24fd434137f1a0cfda362d60121034acf662fdfd6981703c308052bf0e20cfceaa684a0bcc57166b7011eafde929d0000000002000000000101fb14921b5f6993c8f79d2bd3a0b9849b25da7d6d106ef27c73755497ef89b67e0000000000ffffffff022f060000000000001600148a57bca10003c31ee895ee5a6acc4e83177d753bd92f0200000000001976a914df36701440f9876108ea4b2bd3ca9198f705c4c388ac02483045022100d8ff46b2f97fd1156fc1410557144f30fae1f97691aecccd23f3d30a0dd8272d02202a49e57fe044070583efd404116c4aeb962d9b4010e1e5a27ce89a7d4ec4c3b2012102f419815035c880383dc06a881685c515e886705d781b55a5096f2ffdebc301ef0000000002000000000101b51ccb4d2319b2f63aeff73846be6c09f15df415c200c93848a406d10a0d93c60100000000ffffffff0205f306000000000017a914da19d517336dfb32b3dc8a214e70924072402ca287b9fd0f0000000000160014ee249703941ccb1c3dbf00bf3eb049d8a228ca9a02473044022076cf00a614643f8b3bfea0fa7a69c3d2cedc9b6d2dda50b9244d07e27cab2bab022051db37bef45fad7d4eef4a0a6a006c55fc95cd0c507816947b71e30a6857f1b40121025d54568476425dd9431545c89f3dda76b664ee57387dca7ac090c57ba75a24b700000000020000000001018c06263eabf137ac724bf1a9fea452f56fbbd560fe09967db605fd1c4e3330180100000000ffffffff02285600000000000017a9147291aca1859694dc1de38f56d394794bf96afa06872663000000000000160014616c082e7d2b6cdeffaa76178cbef0d0a5ffe48102483045022100a56fb5f7294651be9ba2dd31d766224ce5e9b3badf0f48de9619367446b67b3802204c857a3094cbb3e1b9581489472c72aa406e20b24f6f4705df5ceb8be879cc700121035932baa3d79ad73d332527771630d414f4c98ae1872a220dd72e66e7ad152a3400000000020000000001011833f7e0e84fe6ac8e2b31385c4df01aca91f9e7bb9d2917aa793ed2a1b864a80100000000ffffffff0213f802000000000017a914f981c4f2fccfa69b231f97c252ce7b99e6677eda874235080000000000160014b4abec4cb3ff6a1defbc6b159d6231913d7df858024830450221008d8c81a0a54cb7fe20bfc7430672c80855c2c37a7754083ed1da16e99265d19b0220208610e1026d23bf31886a0c3c21cdcb17a503baa1e00b75bae1232d909f386f012102432bb5d0d965970825ddc64abef7a445f0553e9905a7f9ae72ecf6287ecb3660000000000200000000010177daca0656b4e393917895130e9295773ba069cb6519ff746b0326cade1cf39d0000000000ffffffff02166205000000000017a914bac62bcd67f80ccc8b76c35e03fe5573852c75a487d465290200000000160014c0f65f7c1d1bedc293c0f96913ce0ba3c067a9b40247304402207785f3b2ee378fe9ade40c9b53f6d2d45c54f0ff288384d60a79b54bf38b9d8b02202c4a697428e0e3dbe3d6b75e62c81947379b5b93d932a026ace7dec0d0f6c9de012102b1d236a75036dd107ccd709c2f7f2fd53014d684025f47c46534ff866a3f81310000000002000000000101d4a8ba2b5a0f3edcb18030755163318d685c09daf5c3f64c7f21e800c185c4820100000000ffffffff02db9c0600000000001600141d9c1e12327f7d0f3b40fef3020bde759d634e73ce0d08000000000017a9143d628e3f3dda945971516a6c818f149a168467d38702473044022010a6d7bad332928018115e73c5b8c56af0e755e572b48461e1e14aa81915ab760220792b3145e8515fa32cd72e93650a2bbec7778dac7d6cbc42cac43e53dcdbbb0c0121033c6474c73564c6ccc8080ddf9be78b59eddbf197d06069e7d1d16338bb6c7a9a0000000002000000000101d11e9e269a70b02be596dc8dba4f68ecb111f5e0f61245e7623a6b9c5e6d2bfc0100000000ffffffff0234af01000000000017a914907438c207548b97051141243b3269d850611bb887009c800100000000160014bb836113e36ad1390dc316698d80fc850cff918b02483045022100a7c97a744f11d1f5c05cdd98334a4fd8bbe1ac2bc8c5ab88efcbf3fbc5b788d9022010c0349292016eea66bf13e8b89e9f0096018d30f059f3da1322ac2036b912830121029840a61d6e95c6c83e669e0842b3d902d4819bf2fbba2649e676e322bad56c1e000000000200000000010136a03d913c57f210083a14edce46ef1b14440dda57fa3c517e03e499bd1e502c0100000000ffffffff02eeba01000000000017a914e37d9ea91357f9d905750608e1790db0bf4498f087b26bf200000000001600140bb46d5536557c0c9971b2ac86500d0a70c5a2310247304402205666a7ae841c7916e0440e1550d7c2078787a72c5f0b33ba7c3de80047929798022003123c26124e9c6b4679fa43345368f67acbcf5a09940907222f716256ef28ed012102a78dd9ace3ac99e0b87e03af1cffacebc9742ea2b7a85405975afda71c61d0ed000000000200000000010194721cc1485e1b56385c873856fdf04379d362c27e9373b37ea80e7068a58dcc0100000000ffffffff028cc804000000000017a91417d43217a83f374870fc89bc7997b6b503d25a64878b15060000000000160014e8926295bc1e31e429e96e572b13e4e27d002f7a02483045022100b4913f6d66b86e1c469f04925da6338433061546694d8f23f699e3519afce6c102207d07597ba0a68f0c88245d9427b6c3f57769fcd756672a346fbc5772234aa926012102ac887e2b547690738dc363ffe309429a4bac8b2b8cb074ed575fdcac16f55d840000000002000000000101f0b8a9331dbab9dbfd770fe9ed3456f7ea4521a3c49dc9e2adf5f68338de70e20100000000ffffffff02115e03000000000017a914956848f3b8f13d266b8f0e73ab0f316e8a3d1429872efc09000000000016001482acd9e4fc12abbeeaa14e277fdb28a0ed03eb7602483045022100f92a38b60cf6e2880e27f7d92cbb117102c9303c613fc04461fd29e40d4edb950220729dc88c4b70e36b2beb603e58d56224630c61e31251a5c23ca00db7385783f1012103c4de3a794d6fc2114e02434e6de817553e69cc2ba2e53b9a656b9c0a380ee9020000000002000000000101b5dc3a79f2591a5fffdb1fe6808af30481451899f1ae1c405965f892b62bc8ad0100000000ffffffff02df8900000000000017a914b186e397769330d8c37d921acc416ba5206072e287b12c000000000000160014b1560c777a2ddcdbb62461fe036b1da102af28a302483045022100acbb0c2ba05730d28d9be34da10d295cc79ae79ca3c9961d47bd10879215c88702202ba0e592c1c61c753e02aa54c156566227d96b9d1c21011e358d0c082b106d15012102f2c1bd218f1d5734046917ba7c3aebd3e9441496d764870e85469ed9beabaca400000000020000000001011607cacf27a9f3e9d81d1c09b320b61d33126bd98ac2b3a51345ebbdb0e2db7f0100000000ffffffff0236af01000000000017a914e5d4489629efbb2fed91b850ac769a5e5ab271d587345d0e00000000001600146dafca9644cc8e3f1c82582ad1c8d0df31c2dcdf024730440220730053e366a3ca610cc787930f9bf6b1286187dcff577d6805cd9c0c32f995aa02207bb6d3d5aaa63ce99dc14d7780b1bae4fc326acc2b4c212d45546f37aa9df3110121033e68fbaa55a03d040e29712c10592f163876a4a13718b6594b598c9dea36922f000000000200000000010196ff4d089a530d4eda282569eab168dfc4aa3e94bec1589eab51430af33d3ae00100000000ffffffff021811010000000000160014e741bd461352ab5420b2a2ee8b5f5bf702f33af56634140000000000160014a2c23827763aa52a9584fa5c60c2b4782a0e242902483045022100e1d6aed7f51d0ec2226fa854466d350ba338c27e5b04566d0dff3ad70dad7261022071c3a42ec5b766df8c8279b0d4be0ab917569ae74a63e56cc6b52c36cd9a82a4012102c3e3b23c46b6f40c8434d489340c19f47f93b9e5095f8f2e34855b9b0a39b7760000000002000000000101225884190061cb3bd9c50055c0085ed23b705e70be759eef02e88771f9a3c8db0000000000ffffffff02ab4d1f00000000001600146ae0379e8d42921d15d4bfd21c6f2a3cf7ded2b81951000000000000160014f53f15df44eece89cb70c56a2fffef8595716d1802483045022100bfa283c6e13133c4f65184270930b3e153c298e996030573f311cc867eec712f022006106a1913b501f316671dd6322f185a4e7fde454c2fab428d9e7912504496000121037621ea2c88192a3ebd490b0ed033b1be7135169425f28b24ce59f5f45ff738200000000002000000000101fd619b5b54872962d18cbb7371d85ad9aa8cf65a44b20b1324e19bcd818a73620100000000ffffffff0289a70100000000001600142a9ed3e92ea390cbe1fde903738520e87589a576fe0f06000000000016001436bfc220977311ed9768cfe1de2f82580a6284bc02483045022100ad64b38174c5ff7adfd6a458fe9c0f03aaa99745cd72e538a689fb20e16a01540220354c3ecbfb6cc08f8917588d0803c96a6016e41a033104c664c45637114f01040121029b08941bd084a71055a15b5ceb205eb486e189fdc7386f3dfe27ed79609133f80000000002000000000101911258724b3414c4647b6293a5e72bdf6fecc9afb00dc0a40ff86f0706d6cc9f0100000000ffffffff02fbf20b0000000000160014c2a0b47cf5600aa3f0ca9225c68b96c10fb5bf5574a64e00000000001600147e3696f7f0c55e50d2ff6442e74e8197a000fd3102483045022100dd911e3b8d4a782e161a24720dbc065f387885727a14d6c9566ba44cb2135d150220101eb8f702617c3fe34b9f5dedb73e338cc3169d4cede77ed75fd53e31bdb400012103e99341d4c07f40bc25d99bd95a08e024f22259f4b131e4ec287e942f073bc87f00000000020000000001017d393b3d17c5f54e47e93e2512702e513f90be299b2f723aad62f10cd52570640000000000ffffffff014e1600000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f7212402473044022005f5cd6a78e0577826a97370eae75766092413943b4aa4482ec732dd53179a5f02205b8a9b162a8722902c4819234cd312d4136e937992dd63c433b43fcbe7ea485d0121031104528af8f9b6016010c45c0c078c08bac5b9db056758ac7759c71f99e15cdf000000000200000000010121ef501abca13332a71dfacba0913c9d02efb96636e4e7a9e539f223238954370000000000ffffffff01ce1d00000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f7212402483045022100a247f7a89193fd6810ca3b8798db2f3dd7bb011641361e9d05fee570819b539a02203d0e8d2c5bc1de4e6d4dfd09ffe0d32a487c92391027f7ee85798a8eb394603601210248c63d9dd2b2000831fed83cbf360f1810dc490a402e39810b23c7192d437e0f0000000002000000000101fd637b86d6b87297312a83a13b1afe47354c740b86a567cbc1a656ad233801f20000000000ffffffff01c2f70c000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f721240247304402206db3cb7b98e2ac36906069e3751c4631aa0c66df40ef86cdbe5524c8fbd5dd84022002dbb2a532104faa714ba6770f2278b24189abf8123ef0b18c5ce9f589ea43b401210359bc088237d5cf2fb0acb1294b96c897eac1268579f0228aad3f3a62b311fa1500000000020000000001016cffa571b27e6a69028bb0b9b760ca4ddc16e6bf1a300bac8cb77a537046dc730300000000ffffffff0137426b000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f721240248304502210085cd879edca9475175577fb4437b7227edd08d3ca4cb27cb5d0a67aab661260202206b0dc9aa30ffe97d3054994d934e5ba4a6039f5f4e6039a64630caa7179ce6d00121023b93548f5abcaed8ef06159a98562bf4869810fa6e6b6f4fb0950787c702d47300000000020000000001018f55cb572194bd4d0bec4a4a2ca5ae69f05cbf03b764546266e6f945f913348e0400000000ffffffff0162c401000000000016001467167c2fe4031fcc02e6ae5f46e81b52d0f72124024730440220605662d4e03541be3c437e600148637d8dd7df659c4a6720ac58632990dca74c02200f7e0aef15fb0d3552814c4e8a97cab694f2bb64ccdfb69b60976f90ae294e8501210368923744e2aa1dab16860c7ad811f1ceca1d0122a34b4bf71e9775febead5803000000000200000000010131b3fb97cf8fc4b5359e7092212b0b15c2a43522f1344ca5c20d08ffeb23c8410000000000ffffffff01819602000000000017a9140a9e242bf46066cdc1a1b090c3530be08201f83b870247304402204abc7e791db579f8211cc384a1a7d876f798da31580ba92f9ff5f12c44c99fb002201554d295e8ef86ce8ea5c02075d7f32dd3382d70d3e669a3e4323a6fcb58b57e01210292ee29d2ddb4a70a91034d264afbc6246549f3e16555326ee487e91f5e55e223000000000100000001b453ef603b8ebda79db1b5c0a4342c1ab44fbb918807a382fa5cf31a51a18c8d010000006b483045022100a35bccacbe3c7df713814ab96aca46f689479364b8f66f4e0699778c9ea46615022030da3d19dbbd8e67941a4cef731bc59f0366c09c63cbefd464ba2bba440fa0490121034982e44c67170ed8cf43f6703c8bcfaf42d1d3c5b62d78dc78def210cd70f5e1ffffffff022e5b0200000000001976a9146abd71adf9cff54b0ef103e83eee1863821857f488ac4c790e00000000001976a914ca726939cb567abcfa3d5c11422d93f6fa4731e088ac0000000001000000016728a47247fa4a22fa579529afdf0641024238b86712123e2d52f47d799fbd58010000006b483045022100a328f9268b137239e77689a48bf71a9eca044d8583db69c17b1137d01c699b5d022057240eff5853653e5e89ec0070e7b5d8a5176c951489ece5e07cc15208e5489e0121034982e44c67170ed8cf43f6703c8bcfaf42d1d3c5b62d78dc78def210cd70f5e1ffffffff025ebb06000000000017a9147ef70abfc575ea3cce0fa9e77d92137010f08d228754b30700000000001976a914ca726939cb567abcfa3d5c11422d93f6fa4731e088ac000000000200000000010100b3058c013e6dcc3b5455fb61da6c1bc1c0b1f9eaedee2684d6be3ec2006c350100000000ffffffff0252ac0000000000001976a914c109805dd0643881983cddc3c9e89bbbe4a8b28a88ac4de68c00000000001600143b0a7363129c5c1d995fa5dedd1f6adea56066570247304402203727c566d5ed02409d9fc699466cf935693e48ebf66193e10b9902475c1dc683022026ab9d2d84077eb60406d202c4f35abb8bfaeed8be6c63384bafc4ad1415166401210333b7cdfed64ab3dee70de724af2960e1b3fbe62d586c09b54143bcd84fa3714e00000000020000000232d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace5322430000006a47304402200239aa76f5f48c6c32f670f888e9997cb2fdd4c5d2b86ef059bd37336e288b86022067198f6fffdd4a3be1568f6f97d682c68190520a008ebfaf315f4136ed444488012102496c8a56e15137f6ae3c296d801a714614f49608d3cc6bb35dec73a9cbf7fe0affffffffa75fb3f071789122a62370b2759ccc6cd82b0b7f9e4bd9b79680bbb363c442f8000000006a473044022006b31054205ca972d5dfda654fba1e98b405a2d59748a8dcfdfd181e5569a76f02207d4e6f028168a3bac8bbbebf1295d6dafaeb7c06f4bd600408a55234dd5a10d4012102496c8a56e15137f6ae3c296d801a714614f49608d3cc6bb35dec73a9cbf7fe0affffffff01a08e02000000000017a914f424752da1c11bcbf2a1b3fac9796c99357b62158700000000010000000001019c5b3310f5c0774c3dec452984a0c2c9c569a978709a2c652deea3644919673f1d00000000ffffffff413bbe07000000000017a914e0361271a717e55eceee2167f6added5d677c7128782a121000000000017a914b36e2683ef7acb1ab928dfc442d01b5acf2bf97087f55c0300000000001976a914f2a0259177cbda10a8a6bb591bbd4dd277b27d3888aca4da08000000000017a914736386f0d9b241931854a85d227c5237e14ed9db874caa21000000000017a91404c5da7b7e97b7f94d25a25c2122a43ff238a23387a52c01000000000017a9148d0180479a2949108016e129d573c10b13b4d1168740eb0100000000001976a914e297e8f3d7573038f78ea64f6927c7e43dc5a33c88acf2bf01000000000017a9145419aee11b400a868e2289eb3b2a1b858297713687a46529000000000016001414542edabd794d956ec90dc670db2c6d64d12ff996130100000000001600146f4e18b825af9c9bd5f943e8c1147faabb7a5a769d6400000000000017a9144aa5d792e802e09a9b83df8be22241c7a259f66787d75d03000000000017a9142193f8ab458cca9e664e72a23026c2b82bbbe63e87b16400000000000017a9142098db88f811115f3ae3eda71543f4de76af9e4b87802e0000000000001976a914446139605352ba690b05a55ff5a8afe25a4a1e4888acc0c62d000000000017a9145a7c01c87ebf591273909eb59939581a2c377b3287f3c80000000000001976a91481759c3c48fee6dbd60cf06866181cebce085e2f88ac34bc07000000000017a91487c492cfd49183aa9d5e38ea1e81efb235daf1e887c8b800000000000017a9140278380196bcf55a6893382d7c6d076d46a4a8db87e8de0100000000001600149e32ef240578a15aad3ffa89efbb7d9a81d8d70482e91500000000001976a914f3091e02d4ba82afdf318d37261784070515840788acb4680000000000001976a91475b64b4a625f646242b6070e70e5d91e1b35e73488acdcec3100000000001976a9140773543509a475d5feb62c28fa7b525b5fc2e7fb88ac52f5000000000000160014c25101a5b7eae39f625f725106c4bd77498e5ef4e30001000000000017a914aec7fb8dbc0c85846c542c2f5d448769ff4e392f8768600000000000001976a91456bb95fcfa6f179aef5015bdcf987568c31a20e488ac21dc0200000000001976a914c84fc035d8a782db13ff83901a1cae745bbcd83b88aca09d120000000000160014163ba4806244c2c519163af1232fb700d04644c6eccb0e00000000001976a9143a5cae677eb32db44a2c636f27cfcbff8ae039a688ac81670000000000001976a91447a5c62d6a5f98a7cdf8594bd8bb68b459c663f488ac11f100000000000017a914517b3048bdd0a9ddcaa2a5d9481f5bce27a60d7f879e970200000000001976a914e8327b728fa40c9e2a2a388e28bb7309569353cf88accda325000000000017a914139dc74b55a1cd0051b50ee85e394b413d87b1f1871c7900000000000017a914f38455e5764a8734944bf6218621c8916ab9715c87400d03000000000017a91447c8f901aba5bf2a550072cd75521c50a03856b0871bc40000000000001976a914b97ef0d88a6ced58e2045ddca15429bac4ca878888ac0af20000000000001976a9140f9c598a0bff1368de0b62dfb2b764dec743589588acaa0201000000000017a914c2e94ee396b9e52fb3e109cacca90e058e70d8aa87982770000000000017a914f434758ba328c9b2480fcd9e6913ccde1e356b8d87904d040000000000160014e60be502432410cacb8327e89343f22d82a22260b6c0020000000000160014ac112f6cd444ddbc5f024bbe135ecf80e3a407068ab701000000000017a9142eb7584d12010d710ec2706967dae1d179d4556f870cdf3000000000001976a914966f496ac6573719764a21e9c3de680e30e49e3788ac452d00000000000017a9145efbaa44eaa6cc67b39cac480dd7c562e76492b2877269c72d000000001600148984fd54c026c0bcd3d935e86309e0be3b6e1138b4fe0000000000001976a9145c29024a616a2d5b96a552e2f8e1e71a78b12c2588acddb01f000000000017a9141698a2761785eafc0912586c27976cca3b59096f87a9e404000000000017a914d3c4f63c2cad79589a65a9c28a322f6b9e616fe3874f226300000000001976a9141053d5a3b655e84f146454ba1a4bd0cbe8d4a80788ac732101000000000017a914092c3cfdb4013f3c6f7de51bca3d548326cd2d09877635000000000000160014ddba60cc23c483b5da357a571f7550b0620d75179f8b02000000000017a91457a47609d18aa6326cbf8ff681918a7f795c2e5e87485f03000000000017a914cc8298de2c6121df4a05d2e021548457d59d671087648101000000000017a91495840b38fb9593cd0f3ada6e372bf0c3ea665c078722b021000000000017a914c00055e7ce98e782a27da16805ed9135ec38cd8787904c1e000000000017a914b7c4f819077423399e295e682d3f3be1e5cc39c087d5730d00000000001976a914fd7b91411e253cc7dca20076c26fc5c86804b15788ac1dfd08000000000017a9144528ce3aa386bf3dd21a63733b31e3e89183896187551502000000000017a91467d629f433f7ba3852aadb2c6eb82d366be4cd16875c672800000000001976a9146ba578f88070aa65a64f301b98c619e27a38ac7288acdad60000000000001976a91471413094a2ee2c6067b56a004adc5ca778f5478088ac44bb00000000000017a914914afac8e0c7180bcc9a64220c8e54316eaa83308714e000000000000017a914b5710bdfe0fda8d458035cb6298681244043e824878dc10200000000001976a9140a496638b65b8b754791d826f26b1c1099e8906d88ac48521000000000001976a914447810b1819f6fc1a9d40ede42ff1847594bc1e388ac10072f000000000017a9149cd0cd01476b05c32e1a5c487a792dc6c67aa9b0870247304402205a9d00531e83f87e6cbe0eea7bc0f5df5cbef33c0b69b31669fab2952256708502202ff5c709e303c36afcbd24872d67acbf39a37bad8ecdcd8b51081e9bd4e827820121021daa684cb643b2f8749c5694da711e2f8198f57374358aa43c481223aace378f0000000001000000000102aadcbf0e0b1419a8fd8435b3389d2ea1c9baed8bfbe8d68dbdd47936ae989b39320000001716001404a6df47bd8920ad8782ec4b93eefef0c9a6258affffffffe920d2a3f8072e4cab2437a954b5167cd1aaef7edab985d8a588bfea3968f5020400000017160014844dd07350beda7572c1dcd02a3a3ba208ef3184ffffffff016c0d29000000000017a91484b16753072b37c53b52cf1e8ed7134f29a57de0870247304402203adf0ec139c394e1104be3ffc46519fe218d5727c4cfc6662faa729af7c35d9d02207ddce9314e9d3918136f0e5ad004e4d902a8b0cc117f869331f95e20312522b2012103b937a753785266060d3a63a981096d15bbb7864a652fdd8668dc83934e105ce002483045022100e3d63f5417b4626f8a6f6cea3b0bc52c50ecbdca3c035703365441ab5c0a228e02201c2b7e1a72c8c9af25009395ad495244c92580390e0f603b4b06f41a847106e9012103c3344ee2d08c051b463253c115c94b285c4c99ffdeb546c441b24d20d2c84512000000000200000000017182539f860cb6fd515f60de4fdbf78880192ecc1aa2846772f289a009c244bc00000000006a4730440220704ce85b8d2c11e8b89b3fd491d65d43571254975ba01a93e7c90a23ab27166b02200502b4deaf8f45b6125189b13f55b36c8a2dabaa82c5aece41765c9a4f4fd26201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff520bdf64bd4de0b0740f5e5d7d2777be762762891f6464b276ad376b897d9c01000000006b483045022100d564067783f958d950e3d88261146bd3953fd99476134f42e8d2015c35eb34c202202ac6c7ae66099b770d9adf1893bc931826a592fc0504b329f1dae7f3c98f05f80121023a967779edcaac746d5c19d8727a49e4236bf69b467a4e671d25374f1b493accffffffffaca232a509c59aa5cd1a193c23292e123adb274e6a4d375806880de5dba3ca01000000006a473044022061e0c33f7200ffc2ec404b61786cd9c3b9e8d67e451b06a01902b0b8aa8d0ef6022076960fa998c3a2bd2d9b539f2fcc9d9f6be938c4d04a5ea66f01c5e881c3523e01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0a26be1c4a256ea8c1c46ba8ee0cc718c79a4124f970efe4245fc80ef3954d044c0000006b483045022100d9053e0d360e2d53c11b1e1ae110480e5024754bc5e5e71cbc1f213a9f083aba0220298d648fa484520e7f352a5648dea6f0d621f6f7f27e1d976efacdc8387c649d012102d48b341ae74d2194c7444345256fabc47d248b518737102ca6d87b08df2a4bcbffffffffcd291a0a06678b913db3db9f9a05eaa672a48b99f2911b28e717bdaadfa7710a000000006a47304402201d6ccfee1d7eb030bf37fe735a4ee037a02501dcb043f9ae723046290e16d21702204eaf759bde5cac19f75cafc4adb539caeae4562051eff805595570a0c9a6344801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff543de96120d0b3dbc22be516b460b327e80054712665301290f22043641b2c0b000000006a47304402205e91e77f1a009b7f861ce4ff542d449e2c4e1517ae86daefda2c669131330b3302201b7bd10e988f8cbd52d6d6f8ed9f040bd7f3495c9024c18c2981ebef562d34db01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff410200cb0513f8859e443b35b689deb57d67cfb969e507c084b09c32abaa2d0b000000006a47304402200f0c1c56ee372b53929c6888db3fb066ddb7fba3da6582c4c03116c8693a73d902203c352584cc30af4f5a80bf17a1072a73851492fbe584acb2a9b96885bbb9838101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff14c36ad6b17ffc42e68c8306fb8bf5de0533e7d9d2afa2465d4ade92356baf0c000000006b483045022100f91b7f88b92eabe4543302f64a6d8dbb6281bf17fc6341d6961007ac162149120220282fe2ec03536f76415348e22c3c54f978b3e0020807820ffb5f3136c69eac3301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff259695630740f586a525809d8ffdc29411f4869912d3ea6a693016344cb57c0f000000006b483045022100b494a509d3c543ec826d487e8f4678e812490bc10c6d23fe791a6a9d20be17be022067751c074074954eab5b4ae11f6f858bdbd8013d5a3041203eafec5d60a7db4a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffcddd9cc9b1994b401d075f4ebd1d345d36574aa68fe5c457b5ba87f2eafe4f19000000006a4730440220465e0c79fbb84c632998c897018463856fb5e516ae7c10d2b60d12cb07008f8002201513982e74e94071d2a0d5617acaa8dbe72f5249a38b6ef63e92524e1bb701a401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff58d0f9091fb7ac63d2ee67b6fe1118d5aa1806147cf1233870c5eed1868f5d1a000000006a473044022021ed6d0ff35ad7a03587a0012da8102d268eccfeadb6347041019a9a17c91a1802201886770811716dae26f6aa65debe7123ea4dbd6ed6d2175025920d4016c9991001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffe84791c52ca7cb7018b5f029863dafe5e5518b89ca8cd63d749879ca01ea9d1b000000006b483045022100d88839188d6d82344a86c2fd4a78ebc992a463a1c04cffa5c5071238f246a9fd02203bd4b822c41293381610b2f0b695087a8b71e24adcce21bfde096ce3969e4daf01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff52a49b76a9affd4702d638182f4c1b271b9e878259fdfde257caf5f1f8d4381d000000006a47304402200a4c649de32b8848dc971e00e51f31aa6040bf298da1bca870e9fc6cf4c041a3022032ded63cc5d91ffededff542eebd86934200f0c0f27ffcab79975c73cfade8bc01210378de09686857338c89b675b324067f4b6d777cdec2b8c4cf538b950a94b315efffffffffdec4abeaa53bdf8645fc489078ffdb090ee0d4287322ca922768b2f374b9851e000000006a4730440220233f76c4d8ed53936a7847f391f11cbdf70a90c9b15ce137fbfc41ef96fab57402201dcbfb95bf3e3388edfadb60604efff78fd52b4b03b5f0e9a903a07de527ece101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffb7cb8d4f2a6460eb9ab5beaa96045c1e0b194dcbc51fc4e67385e7d9e8fbe71f000000006b483045022100f246ce2dd900f75ed116bd43da1078659277edb06c0f69308c5fc7e3350b96e302206080dca0d705af7c07a36186be7ded3b2d26c4d21f88230966782a58357967e401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa1a02ddf650ea0b22f68e429bfdd282bc142c0920be1b32c1c8927003ec57022000000006b483045022100998d5b6ac1478ee2a4f061f24a05a1ed87d0e5fb20210880c24306b3cb44f5d302202f9969e4ac896f65ec24e619e864aa784749e5f5892208d6d5569e8c75b561b001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff68fe66a6aadd5c0aac544883a9e5c4bcb077ee3eb8a475153a5b2c78d6396823000000006a47304402207211e87ff71ec3d94e7fd3830b72e15c914427c782b94a43785da5bc19b65ef402202c996f99b32e92a079ef39f1b9947348655bb80f61c0a8b7abe9e90fe195f23b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffdc67a26338c5e45815dc57092e263ea5ddb3f4af1c9061b683fb7cdabf9db324000000006a47304402206abc806085c0a04b0c990df0086ac10cfdd030cc446f41fc1d8224e779010a6c02200a47bca041f85c0ae52b0a1efdf1f6e57f3959c155f9c7732a6db05f658b537c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff41ac5ee0ba61d9b4f3c9702fc1370eaa946509607ae324c6b9dcb41f78d93427000000006a4730440220717aa85d823c76f4b424f6a9c1cdb76de6997138586ffa1075729a40ab2f684e022059748b7010d13732f9393fac38eb5e4b272bc877b16b1921328a29d73e254c0c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff9bd6e3b8fdb76a6ab5896d85a70821e6b404023023ed932d944eb4d2ac01cb28000000006a47304402206789bd76dafcd25d726ab27a1a6336bde9cf79c5c7b0919414bb357757346f77022059f9342c9bd05e08148d7d10b0f528644f0799c971b997d9e28dc404e338805401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff131b7907c081e399ff3b3364008e42a9c49af5adb570d982c4429e486457242e000000006a473044022008509cbed7632eae793a7d1f0359e2180e1f9f5861b85322a310e8b29326249002206f7d0f7a7d0a2d4daee0fc1bf92d11e55e1a410975b54d55300f6b11147fc79601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa679648eea3d29620c9a16e08784763be9bb6b8984f128df62510fb39b805f33010000006b483045022100970cdca4a78549f530bbe9fe0b4681e1e6edda77c868789925224ee88d81494f02200c7a913d7381ee52f3a9f61bc0eab5b9421d013bbf268f2944db5afa66d7ee6201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff7126055b74d4757ac18d1e169349585a4e506be3d30050cca008ed5d3bb7d933000000006b483045022100a0bc259ce7d5d2694cb6c3f5348191ee321240bc57a583738e9f9b9b72d200d4022017d5dfe1ecec0b492e4afb8d33afac0d2600c4e388c00e6d423a58673e17e3bf01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0e6c4aaa91fbda84766d758a9057893de256b0b8a2c17316783918afccceaa35000000006a47304402201a7830ead94c6b66f978af047e3a473dc0f139045ac954e979477eb219abfc9102203ee1786dd6fa97bc59dfdc657c3a62560baf305eb3904ad8ca9d1a701b1b8ae901210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffbbf71bacffd7611f012c697f6bd07038c687012b63e3cf8e195a7c04a77cdb35000000006b483045022100fcad393b5e8183fd934ee7ef9f1c1106cc1b1dc5184845980bd7d79d8356e09102201b40e0ba2ed41f09231422ecd64617662e6ec74a4f57d5ddfb3c6004d9b6f24f01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffc0171034ad5c15c591bfa1c74116ddb3ef19dfba6d3123749d3c8d05c1c39b3b000000006a473044022072c7fe5e9390147a1eddecbefb8ace200cfb7b873f19190681eed921b06bab7102207cda8e9ea5d887696127a0a281d5543fa65dc9ecbebdc4240eb2d63ab93f3c6601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff06ef4c8d41defd4f8467fa84dd552beb769962a30c695c6cb9ea5f0cd064133c000000006a47304402200fbd2baa18d0912b54bbf8a5b239a7c32544401a62b7fd0304afb07ccb09c9da02207ed1da3b52e562cec3689cc33ad7e41629a61fc2c9bdc25116f233c5d653d0e601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffc7d23c9cbce58f037ef1898b78cf6e51742d7aa83f01189af0da8540a743453e000000006b483045022100bd47abbc461e58c1acbe0580a2a9460e8f4d559efc22e1e7fabf85751e7c203202203b6934e677564db00ff8bb6c82c562728380e5a66c5959db0f4d60e3e9b85f0b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff81f91a1ef43a3b37822018bfc5bf4892995dd9e3db432153405781d6b6c87a41000000006b483045022100b2e38a028e7302d1f25fe3efa3d51611799e5f9286d22ce605dea6dd3629ba57022036c34e460ac9e453cb3c3d81b02826041b6d7b490a924c16039e27522a938b1801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffffedf991cd3e803dd5e379e4135400658817718c8dd2521e558f815e11c5f9141000000006b483045022100e87c64a848716dcf08a68bc803cb0cdcde55aa4025217cd55f211881524bda0e022047dd9960be95b81ef979fee7d73a42cfdb0887203d56a4c986c72d2ffd2da5c001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff9be5a0802a2c0e8a6c6e58719429639af280541949ba389898ec609ab97fa243010000006b483045022100bbe7b1a0eb326d35f47405bb21f2303cd0a03a671a32c1851f941c99f097ca61022004bd947f5dc844e19b86f056f2f4de4d746a0da80c944fa3c8f4b87d4b372b2901210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff2d681867c37b2060157958b06befce5c1ce06ffbe08c9d66063d990b974cd343000000006a47304402201c7fcbaffa654d8dcad577d1de9ba8a5ff73d814e69243f0f2f7713155b2280b0220266c5632b6915677b222ed0eb1c6fb4f88c36f9aeb6debaee0b66172edccde0201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0c815af16a685dc63ec8de68db59cb303178e533afb9bf8572aa30fc7252ce47000000006a473044022033e8c420ef3f25ed1086a2aadb9267c077ae14553b42c6e7adb96d5c46303020022019cac6e636e19e7939c781e53b690ad1e1db816be466e353d290479d3fcc5a3301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa95738ff70a4f325b5b72098c400830ccaa2211aa341400bae676e9f6ae10f49000000006b483045022100a9decab07830e0d97493130cb54f3f94a491bf0da540c09233bf8d1c26803e5402205a8eb13f8109a5a1aa06a54ea550694ba14eb63998a027872c0daf9f4c264c3601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1aa62b39197bbcbe2b0166eb105ea0d7c9b0ca7a6a6fba45a829632326b2dc4b000000006a47304402203db1425bbc1a0dd537d130b3b32e9b0ec5a63f53a62689bf4001bd63082c72150220122f1cde6f16e9b9cdaf1064d007a546778a27e7eaffa986846761b21c3d9f8501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0016e5f5c795d17ebfd957160bd7dbb4955839f780349564f1a6ffed0fe0c74d000000006b483045022100b1aa00a03b62a13597f0d8934adb011e5ee3904478479bdcddfe9f06508fed7502204407298bb5bad15aa4a809aade02c556b735e9bf6df4fdd217547bb5b94074f501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa3838d08b52328783978047095afb4c47a82cb1e03b93756b056eaa93f17d34d000000006b483045022100c239322f6d88b0f4fee95c2b1da9150afd067d0c561b1d4cc84fe5719d4f531802202a7cf669cd2bf17cec9176e36e51dcd66b7784ee9ae74ea3f043f85456633bbb01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff455f310d623b5a2f6cd86672634276afc7938376baf371f90734005b2963eb54000000006b483045022100a96d92f0f8855237f2735b0864139edba0545038cddd921d3c0241a34d28759402205497c1df315ded9605c404f4c21970f57b6dd113b9a33f8c84fa38d5411456e1012103e528538cb5e18c0bae17fd99d50f5b0f0dd593c26717ac8eb0436e3e221e0f9affffffff3650a4f27fd7dbf2ea97871af7c5dcc336b354b0642628ed05f062ff1e00e758000000006a4730440220216888352c9b3f3bd91218b3f47e1760f9910b73c82a18070f6e96ad548200b6022038bb9f474a861897e9cf448f5d4901ffe47c797c2df8b8e8b222fb8bdec3d70201210380666b6117c5da1c179a9d273c6b96f22987629c790885ebc8f2ab91faa38a28ffffffff3beaf75bc56c351e6a05ef70074394716f42bfb2e8a9d2c26dcab053d3128b5c000000006a473044022042b4ce88710368d18b9a89ce471799ab6000343ef45277d757dae3853a1c48f60220400660d2f5aee7c2843b8b26f9de676406db39e26291d8d6e6dc23279b6164f601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa8926027bf93564fccbe679629ce1230f2c0474d4bfb34bd96fdef4814a9135d000000006b483045022100bc35f4898d44d22401048fb290f86ef5e3262068eafb8e808ccb9842930c9323022028906bf2c2d6c8d20b8cbc0a11d84d270f365ae4a843e4e59707c4c70952916601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff59f284a7f3d001ebe86d8b9fa50be16af8754afbadfaaa3dbcb0d3d504e4875d000000006b483045022100a78c618698f5e2493155ea741e9dac4af4e5a2c56e9acbf41612baa6795717780220109620014e36398cb5adc43e93b1f68b63839a4bb4fe3cba9864ab9aea3b618d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff2991199f022e1c82aff66016fa8099780d7aa70c426a3eb2f21b6c5a7d8a305e000000006a47304402207fca332d8c1f91bf2378ebd7f867e0a8f25e490c9f6701e94f2be2decb2cad9a022045e8f1f9bb05e8c3d5b7671cba9a75eefa0802db0b749a62a61ccc0f3de4fcf1012103fdb18923efeaac48df5f2a51ef50e64d0f08b82367a9e7cc341390544cbd49e4ffffffff10b321e986fa61221dce648ba3484ed1581cd14a440819c659f506ecbac15060000000006b483045022100bf3afb49ed11b0be9f0322837dd9c7b997b608d058f88d77e38246622fecbcda022069acf56809c18dd0321e232e69a10ca7189e5338a1105a451c812329a2b4c40b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff8840bef5564bce62a40e731c7e24db8a82249d76b8571abcd2ace28b61556262000000006a4730440220233c5ac0c9f647af9e9527478473614da17dfcd61a211f47c5a162178f57506c02203913d39aa86d742fd08fe70603526598adcda1969b6d96e5fac855a97d5f5dcc01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff59764a05bd1c9254d5cf4fb128686e57ed84b4b5ee9672800442fbcda42ac364000000006a473044022037fa03b9a7154f255ed4445dac7ad62a8623852b27d4898254b458f35c27c15602204b8335d1b8d1f1494c15dad5783cd0f03da6e951404334629ca060cee3154d0b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff31a7bbdf4bb766b3037112c13a24089292dc143a0c67c4a36d722909c56d9665000000006a473044022062d236e5e5b35c08a522652716d09585f8ba9a97d93453d287aa809b3c987115022049d361eb54fbd88b7fc1feabf4bfb6dc8e957d3a29c323cdbfda51c067d9050301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff60d75742e3f4a9b4607d9c8ff85ce0f5825d057396e28f345a076591496d8e69000000006a47304402206ad52aa315cb7a7e97ab0a95868adef4629de9f98e09e24f6bf8cb5f3813c9a0022038224e68bafbad0d11ce5c3bd525b26d3f897cb8e6698985518508c07571d95a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0ed9df0a49aeeba1e5b31bf74f5350df7938ee4fdee933fd3f483e97b80db369000000006a473044022047bc1ef5041e394b93859b2cd776c0ae56557bdfb42a4ce5de8067d76afefaa5022011b1a938b5c618a551c68046f7a732b8130f99f9e3f0b0b2d154a4817814c1b001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff63f3dcd11fd905bb05c4eebf7a341e990c9d0036ff711c0e8ceba37db031c472000000006b483045022100d0d7046efe78f3342adafb28f132a8a9f4ef88576aa32855d09e27c497b68eff02206915d541344421dbee67615035c76be1db9669d90e4e1c725d314335ac41487b012102b0670286efca3117798f23dbf885dc014da4926e9c7878d4832cd775ad5e4620ffffffffa632fc9e262fd2bbb9f07142bcd982fb219deb0397aa494f3101a01648118274000000006a473044022052fa048088ddd9d136655944b3ede46570c08c454b585769a223c0b56942588702203ce2b6a49c8ea4d8091dd814f1041d4df8045a4face99ee3319a46592c1ed3a801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1a92af32a59091b898569b1d48e56d3ca690b018a127d95175b3b331784a0c75000000006b483045022100f6abcc74dc5590bd2030272a8df54576e14a5c5a4796746bd2a2a79b7aa6635602205b5e99fd73b85f6baf586b26e723b5252b2e6f72d2f1a1d82f703bf4e8d9032701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa4e8afc70fcab3cd1fcbea58572cc92dfc47ad85ed1de8334da1779b86857576000000006b4830450221009f6ddf8157046a3ddef28825977094b8a3b5eb773d0d8d6de4e7bac5f2f36e1c022016e067615300f3d62551ef28502e5cc869462c47e9331f683bb4f9dceaff4e3e01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff5f08a08583b7cd83a5f40894b1aebdc5a37626549a05a26e90999faa217c0e79000000006a4730440220165e9d5234e0edbb1a208bd4a4548bcf728632b8d8524bb575091deb4142c30c022049355d13e58b4f6d2d6f8930021af185b482053fa808a7b9926a0faf0c0d54bc01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff065707d228ce1b0aac5bacc171f4d38e3bbaeeb2b2f0196e6945681decb33579000000006b483045022100a0420ab81c484ddf761858be6d29f09030e94295791c0ff8f70cb0d960568c75022009121b42727108fb92a96d7111928d6100e0308b4a412f7a08a746aa55dd012a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffd550ec910edf0c8dc210b3257bb43b76b39b7b83cda2037c93a7892cce0a8c7b000000006b48304502210098575b511f3a3c3c25e593bd507d17ca2b8d6d28d73b19e886bfd47355f04a62022077a8b49ecaf3dd374e9a6fceadaa6f29a9756c914a65b5cc2dfa0bfee9001d6e01210263ec05b5caf22c5703463cddc7a4d0a692c333da7c38390fd71239f0ff7800befffffffffe1fbee16d2fa25921af783555d1f1798391fbad01d0b72c6c8f60332e6c697c000000006a47304402201576868908aedaf63e61dd55a64ec3257b6b0547ab6b0db15513a401f669800a0220314134af9162e4919f4a69977f89bccafe8462354edc60fc2acf090558c8d8bb01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff781edab895b1db6a04a6fed30809920a868e72989c375b4d23ad17bd41aee982000000006b4830450221009a3ad09b36508f8a2e5e31cf09ebcc0a8ce9acdd7b586c19ebeef95bb707b8e002204b2886a8ecf14fc6732d9cdd52da49aa4b24ec8aa6314379119790ce6174b8bc01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1bd854a7b4b2955e67d649a02679c7e107d45d47658853970bab415b4f37aa83000000006a47304402202eb780d08a5aec0ee970cbe5a7975281044971a19e10cfa30685fa7e4b6e383102203a3a505c68f87ccfb3f2b79bc6c5334aa6203ca83c8b33b75cadb28a976f6cdc0121034ac31b9d1d4930f21e47713c20d4a522755732eaf548282d9f6f2a8450e42055ffffffffb40dd1132987aee9444b8c51987a86bb7fc8a1f4775e0262fa0f0112d415fa84000000006b483045022100b47be5f7c89c4062f298e64f13b8202ed88375f25733afd6b7dd195aeb6c217b022079a17fcaa83f046d5990391224b3ae0f08d82ac1bbfd3044a92272d054749b810121035b8c331efc536630420650cb9f8bbd62248c1f0ac386b96a99c30f168d3ca391ffffffffe52669676baf82a9c59d3d1761faff803da49ce1218e9fea157767ac3883ce85000000006b483045022100bf60d50d659db2b2c8d5b80b881f5ff3c762047123531091e8b13e841312dc770220794e8c17448e2dcdb986f7bfa9341803e414da3fce34f211865f2ed1a430211e01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffb6c71c419dc7cf6ae7379b146e6c1bb84992ebfca3af3986f8d6ea1bbe280c87000000006a47304402201d4576cde9cc1760d5234a2db77c5cebcf4492be084e160dd1e4a3841bc0b0bc022006271da50c473acc9b6455309510fc2b7b1d867a57a15b0923533b7c56c0c69a01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1cea181c81b8e785852ad3d35fd8ce15a495e9ae76585434f71d25f79d462e88000000006a473044022070c332c548a8b0da9a1fcf3a5893c3b80d2c5b29f8b84a72b5bfc48ee9ff324e02205c61a4acbcc1a11c59400110459ba5948803fb4670bac1ffb737ae5f091ad28201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff61f816b23dca0f92f25a1dda06184086d841804f90906dbbd2e389b12b604989000000006a47304402207c11de4e53803accc8d153047524b1c40ae26403dc25734410da02e7b492f649022051aa3df6f84513d84cb989eded66bdeaada50e29139cae0d4a415b08a956258001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff21875830e514184602f0477d723a2c079b4dff981e8075d07fd6224cc663508d000000006b483045022100a8a5db8225d42ab85255d4e03f8d28ecc4e2acb93875ab9fc38481c23a746f9c02200fa79f0c161730819917032fe1185b36a4b0872d23e5c7f8c0d6e32336246c0501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffffba9d017764b28f953eb226b27f522d9a03cecc0d472decb604022b4332cc88f000000006a47304402204bb2c4e816805b337e084386f4e8e7dc26fab847616e53d1985ffa2648b5db0c02207e91d54a14eced1d61c4be49eced2758b5dc142c930f96f5d5bd5ccc9068815101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff12602939fab9f94bef6b88c8928c89f8cedd6354e72ada218da124e509f0f192000000006a473044022048e6afeff97d08b02e3fb209237ceb86776c64c2df2c8973a515bdc0fc1a6eee0220575e00cc5e736775b16fee10a785249a2e123791dea85d46d3745a107f232dfe01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff644274f866d4d7acc89d75e1c5319fb1ac9ecdb630b28e460bd0c8a8aeed439f000000006a4730440220325630cdb431cbfefc223c556de0a3abfe89cc857da051c2e2cf477e2793dc0f02201a6d44bfc896509423b39610652b099aa92e9f1655727f798b379c06b33ee93201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0355469f4da7e19b1f124ad4a1138fb4502e99150fc335cf1fd50b214486efa0000000006b483045022100eb37e4664528cc936f854acbdef66993bbd0b2858c7fc55ed7eb3624ab223d9c02205f83fb9d6282714f71f5f2ec1e020e0f4a246e0251d8d61462f42e3f9322ca7501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff3840812abda31316ecc97539e74deab55e972b97936c8296812811741adf22a2000000006a473044022034f2b2c0ea016dc8710d6fabd567dcf8b32a737059c55dd495dec82b737a7e1202206033e5b7c8ca614fe500069cb865e0ea40ac6115c977f8e4c12efcc13687a64501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffeb977dbc4c75d338e5c5dbd6404c6a1607618543e0725c95070b489708ef26a3010000006b483045022100b990423adce06fb0de42f4b4cf1dca93526a5b801c324392b14b36cd7cfefb4302200e0d83d418a9e962d0d257bda7ecd222c2ec822d10810564611622ed0089de1601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffe534e6efb7dd8008698a7b01954f8f654e55d9edd95c26a6929e6df0533689a3000000006b4830450221009c93ca668953c0afa38a8095c23f45fb384518724a72f90b5699e42d73ef042e0220183781596e37c7aa4e7960152ce8f3ce0b333123baa289d9746c60443ae6c14701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffaf8d7386404103599060031c1b06110a7be6b76c1c90341e8bc746393bfc45a4000000006a47304402202fb4ede8551958b96d8225e9db3f85d453e2864792d32d3fbe70e84d7d563935022004d89de1ce533397ea04a519e3f5f2e60594784eb0b09eee9b7d3eb4bcca6ba001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff507006b74b35dc04b1ac3f078b7f22e5202e1890a2997e5964b747e33e800ba5000000006b483045022100c3c1515921194a90348bfac4016a8c0967b41780c5851e801bf84f298ccdbc590220024733efdbcda6f54505b8c2ff143979536fb8311905ef9db96a20fa42f545c601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffd4d2a484c4a629d3c45ca43475a5bfc0c94b8ddcbace6c571eb979cad3d035a5000000006a47304402201a2d8843082a65d2723693bb87f564d916fe778e7e216f153f6673a47eb1fed702201100d550f635b31e680622c71aa109853beaa5abac1b17b5538c282f5b9a812101210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffff09792bb2db0331c2a617f6ea6fe5cc0846b2fa1164d4526f61207d9c27ec4a5000000006a4730440220757fd44e02908714b749317a49747bfeb3344b9a1719c5f922669e46513a2630022066b36635bc2ab6da3beb69f4140cb21427915ff0621ab80894b0d40f4fc7726601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffc0433548b5086dd0ceb7635d806413ad14f9bb2f3f96bfbe739bc9573fdf3aa8000000006a4730440220617500ec0ba287275205cc1ab68c5ae9e3848f69a498e0f8e5f8a003e31ba6de0220746cb6debd13a3e2bb171e20461b33fea564756ae54a299e59bc78ca930e9ff601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff76ab576644e11b1417526e9ca213d7d40f5ed18d90ec102e9a077b3c40904baa000000006b483045022100f02e8582ffa157ccf6e32dd239048d19584f31bc1b1df8f6e57d6dcd006890a4022017bbaf928f044c5baf55c54384c285865647b0be81d12b615ae8f2cb0f59ef6801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffcb1362d5ae3c329efcfc9f5e50c4261f8ec6e5f9107d7458da7e66d4887a14ac000000006a473044022065f5f84c1812b29d5bbf9111bfc6154e0c149e3c71363f4248efccf2e4f40c2202202e8d5e8297604d8f9be57aca1b162f2623e89bc0d48c390cfb887fe37692a66401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff510003d50e57bfa14b277c5307c955284dd3408e66cd8aee77bbeb7081f0adad000000006b483045022100a789d621aa7e6150d71735030398e67d4e48940cee0c76d68713d25836c7d63a02203fbbb8777bdf7df1c8991ea55dddeee298237ed26314abd8fc53ee52b01e5782012102a8895037621c3c650eb04cf243c21f2e49b82ffe0a452c8aa1526ffc3833f544ffffffff545619b29436fbbb4746b8e6897db253d8f9b1f58f79c3221b56a89ff8ab01ae000000006a473044022058c8ad8a294c3ebaa45dfe102137f9a00416e3745821deed48fa6495f00d202902206172f1f75718bf7e0dc030f60d1353ff5cc3ae2193452d5210d50f2b9ae361c801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1aae9e09c877831549eb0ee23b05ac944ab51764473b8f65060a0de6a796d6ae000000006a4730440220510766f8c1143d8239f9b7c31b0e4a8de1903e285247fb541b62cc6a6c07ce4702207c9419f3386a8bbab6f5c1062976659b525b4ae61735f86f39d65998e16953f301210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff097a8d37e701e7f2ce47c3734b5b3b4b556c602a77235274b1df53a26613adb2000000006a47304402207a6fc81f726c5c47418654fb763cd43f8d848ceef53ab513904380cc17b9b19902202b50cf4cee4d576dc3a0efe497591baa81bf54426ede361a358a8a644a7b16ea01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff820de27fc552ef885bf57586111c490fcbeb7cb7fc98f9f5f8b7e8ac841687b5000000006a473044022007d501d9120f6405de100d6edf9fe07e67ab3c131ec9532108a71bc6e4e45a9b02200228c553164541f54c709e9c1526dc9547a4e691940bd2b79a8ba862ed9fccd401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1c6bb2a5938c14c388f52457951e5c52a87e34a56e4e9df23a2fa11e3df1abb6000000006a47304402203f5a3e966a08f408db28d3402539e6de78c0c9aa409ab866f3c98f0bf708f7a602206f8d1460482577055113ba06fa3b1ae2d95a0ad9a37a45a25a745f88cc59408201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffbe6f41c76b26e0a987d7475e8c5e3f168285abc3acccaf0d6ded0be8837fc6b9000000006b483045022100e3b8e1db6ed6ef5418dbe0630b42b62d99614c8b53908161f5f3f957f0270ae802203c4ed6ef4c5261398fae969302d39a8484ec356c07feb730c3246d648cc5ae7c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96fffffffff7dcdba1175fe208ae736bbb18902c636f20cff591aafd78e689a71ef1f6c3bb000000006a47304402204175d4d004bf9607643de8817638437df1d4c034b2cf4b47a4a989006a4689a2022068325154d2cb6c40944b1867969dc97da43758690188045e97af1a3d054f9ec401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff37585c1b2c0cae1f072de11b5ded87a358afc45e6fb015a93e19c0565f98fcc3000000006a473044022037baaa553a33a4e6e879bb369ce6ab1cbbd43825845dd4a83ff4a0af0a431ee602200c7202bd2d1aec6bf6d1982d91794ba3730fd1b36047165e9b3354a16a7a478c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff329b7ae3d23240d1f54999caf8980d8aa1a3523b0aa53e2799dfc324b50687c9000000006b483045022100f59635ee8dc6bc07e0b4f8be4b5d6c613455d827b241dbb0100bbcd272229adf0220253c8cacb00f6e6cbfe1ccac3607d38f8f535de575196e6162a8913f5d556dc201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff55ccd61b17b52b6eb916a22076787dbd8365a506854a3cf524f78be0381d2ad0000000006b483045022100d2ef7210169a09cbced2a044c81749ca0f6079b50e738e583d8a96f2e311ca4b0220714a55c4fc2c117334b068806588e6e9b4056b8e573e4dfdfe3d700941f6e60f01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff57e2a9f4c1069ec9103064b6c1b446e93030fc8e8c0b3a22c5f78340ad9087d1000000006a4730440220384eb0084caded008c2f61b970a7652e2830384607587f0e419581e30168aaa202200610d775a38ba3ac12db2e8b366e1bddb03a0bad38200f7a0568d5b9ca2d4b0c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff922d42946183388c0cd5b5e4893357e7fa8529113267cf1da02a0173cf1233d2000000006a47304402202752c505bb7463f499c22abc5d386445f66f667275a18e31485b833d9e807ae002202bb3260d1f837a66631a0d00de9e1b36c7825615595aba893e41205e69cc73e801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffb195d889c4b75d33e67f849e6fdeaa2e38e13e97f3bf75be8ea01e388d1c43d3000000006a4730440220642163315ca0fde9367b81972b23152cda73ee612ebe32ab8f38b385a558d68f022001b0a7d6b808602870ecf491ec753d1e9fdf004d1b0456b61765afc4ff46f6f401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff94f39292fdcb74e2e9a663120be92d89f0fe8caa0d0b16ff5e76074b3e3118d4000000006b483045022100a2f5365b07d1cfa23cb27a5c53d833d871734c9ac6ceea7bec30e6c5627b796702207730a0d5c539131fe18d56e1901eb54928382656b91487d166adbf431fd5a6f001210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1ba167d7aec118c8d2ccf01ad9af8b5c6fc6fbe58b1e6ac52326c44e58f459d6000000006a4730440220534f419a9981b23287a46330a77cfb076e02181d5b47d4050b817dd2ba01fab5022002c5729796af8965b8b74a2ca4727bf3a43c2736b36621282756ff3b63b081bf01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa4c2cc4ec008a0d945dc5b570aa0c670a55e0b2986d4360f82cd5711e16879d9000000006b4830450221009a36bcf427bf73137a3f3b14d0252100f9f9239db5287ac17a601d564c7520a1022005bcf393b1ea8e28ab77e9c875397ffe97d5371522d176aac35a6d265aa2e8c501210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff06557a0d24b783f1339d9dc88a560cdb28da19da899a7a6f3738e2271005a3da000000006b483045022100d40ab284ba38f3c1c7bc963b553b159f3cd48e4bd55bfd66bd6b9f006d6738020220167bb085496e7ded07fd684bc34c231ed7c1e09cb82e8fb9ce55976911e9198d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff9c4f69ff49d99c8f5837152bdc6587c5ea520109c902b4ecea3f0a5ff28563db000000006b483045022100991177b62334389985d59361e47405ccd16098e5270369baffd8832d4c99f0db022057317fe00c5248fdc99729eac3ae098b6cd313475a4771c27acd655cfbd57c9701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1e2efea137517876ade6439ece6f5a45d26f59ace30e49123c9b5c750c9c96db000000006b48304502210090ad3f046db47643f3c4a258b3cd2059b2d420c587c09b6ed04b5a78d88260d102202d0c4b7a9df00f463cae3181f03ee33e6f8628af44694e4119538bb2eec66a7401210295cb7399eb91e8dae0f5a909e73d13194df7ffaeafa39336c68d231d7ae6751bffffffff8bcdbf345613514b518aa256727fd0953be93d58a695bd59f6a7ca485ae25ddd000000006b483045022100a49a9759596ff2e1b925bbc27ea9493fcee0a7348cfa4d61bb80542fc9a7508002202af20bc1a6cacc16bbdb60c06e06de7d2102ca9125484c62134e9f6ef34e201d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffca0dafe496b61dccf057eced43e82c25bf304e6c653400a319508ad039bdaedd000000006a4730440220296e87c3b926b544ceaf3ae701e96129d6b4c040ff2100d4444e0ad6c5729a5902203060583dfd984c729eeab99c93b06cddddea84c8684125bd555bda9336e9a98601210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffe1104a84a1d1cf46507024291997e5f4e35717716c5b8e28abc3b034a0c1b9de000000006b483045022100f63356fff15e1736e19c9cb2defa347a6568734696a109facbcdeda1ea81e0fc0220365196fd2345fd57f3b7633203368721818c22f9fd65d8d387990b76806b391d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff1b2380af9e561eacf8466a019bf627a04b89fc4c0d772486666ade936f501be5000000006b483045022100911b62b496973a44f37c21dfadf92c1b510d830046391edef7c3eb48d22ad2c602205e80b2ddaa1e9ffec0c9f30c9b0b437b5e707d6bf7222422661290a9b1897a1c01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffaffaa9da654a14116c0e928be7cbbff6ce6630f36065e5feecc7c5c333d93ee5000000006a473044022044557db07b1c65fbdae930e800ee7e7fdd1544c86f449e96b1b8d6a4f8904b110220242174aa9770887e1025056ef0000fe9e6c62a63b36dab7574e3243a4f2bdfc8012102d6092f49f6bbfc6ba69794e0f1fd34ac10c5a6659d12e329bfc1627481078ce0ffffffff38a31f1c8303335016c0c37db8ba93c9ea0c139bb67ec81677d2e8c571851de6000000006b483045022100fcc101737730f4cd3694761bceb88e3bd019328bc5ee2b0d8da56b8c513e5014022019c933e858b085f43ac329495cae35ba6d3accae33c342e86986945b130ce5e401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff886d46d982cf16ff79ab1ce1bbfee5fc842dffff312cb76c09af692ae371d6ee0000000000ffffffffb828ea08d2f6d96e971ae0fe862d3638e275337d79addc9463f17091137745ef0000000069463043021f3593bef12b52a72715f8e22788073800eada65dd253203d2ed1084d3da8b4c022044a1ba25d8f5d66af9cdea6b65adace6f62807ad9a2f41b56cb87fdfe11c0a9401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff0b728004dc3b46580122087b5021c4395a4113bd4694a7fa73ada2001d774ff4000000006a47304402200863cbc5f58a1fb0f9c605afa5022c8842281d0fb5d3fd6515bb4f8bffaca93702203586760c048afe192071c21f46782888a207e0ea0e4ef913e36a7468fea4c87201210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff3a3c00d237dc0435f40972bc9deeeafae550d8d7a123c2dbb864794ba873caf5000000006b483045022100e7b769e61a639bdc37aa837e5868e6ed58d0c9a7db54f82ba89ef74554ae473302202524623511d2f1a81155ed9245e8b2509063d595167d53adf40e5fddae27322701210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff7927c3f35c3e2986da13baa3cbc7ecefce51de82fd94ced60d1916dc2e3593f9000000006b483045022100c36a2c9b9f070d00005bf0b4b8acc2f5b746360d11fed1d64bbe877cbe95024d022054dae7b2a270c700f4912456ef2be1801b960bd8612df9a98949d7cde759243d01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff774dee1c8673c4f9d911191953108f81b1a6767b71805dff83814ba6a0f857fb000000006a47304402207607890f619082f39911f81c7673993a3cc52d11a935c863174581b002d899870220261ae73a555475cdebc8f106f31ad0e388405e4e26787726931419fcbe6068e801210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff972ef40f0a5950bbf60d176f6ea48f34bc278b138cf597533904ca990a8da7fe000000006a473044022073df6795be8c9d829f717ffceb884cb778b5fddc2588db12d469194c681eaa90022016a1cdf054c25061b96259d63adc1322109920b8dda53299c0eb175f9ab80ff401210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffffa930447c4462861bcbeb47968d3ea282e402fe34e164b2fd5987a86399db08ff000000006b483045022100bf91ce0fef26e42f6c2e50c17e509f7a81d6e1142fc1044fcba3db92c96bb36f02203613961a91fddfb1b9b7358f89f2b8d4edbb388d5e02836ce587fa807e6bf92b01210368e5befc57157ab17a3534624558c198e290244b56a2628af7a3bbc8b0287e96ffffffff02e3040100000000001600145427ba84b7b1392e85757adad586ab3a1954e09ad615fe020000000017a9149383c43595f05137d3ba3d9e6fb95b71bc5dfce48700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002483045022100bc84882a9f1786474943cdfc75e027bcd7909e8d4b45f53c06d1e9e9a04d9a4d02200459c2c9ed4a00c9016a5a158e95d956694e857bee8e36abc4be6e37fde6ebd3012102cf65e48c35f87c354dac7e7141b3e432e42c66a2bd981c6867de67c8bc6bc9a8000000000000000000000002000000000101994432019ca011fbccb2db1e3e9e7f8653dd1bb986b7bd3274b804c992c030100100000000feffffff02c1b659000000000017a914fc24fefb7b3744c71fa4c9b2de2fd36021f10b75871b2f7800000000001600143c1732b48bdae8ec1f0a7d396cc56251d3b1c620024730440220286e13020d2b692798faa4b6d0aa9ac85d015d9d56f5059b530bfe815091582102207fd8037bf29af34306b2a2d14a96f20797e2b9fb469096c6d615d63f4f5084ae0121033430a65b169f0d9288fc4cc743413dac81c723f38ca9530532942a6a93f8154849a00a0002000000000101f5bd878dccc7ec5dc6877df1b1672fcbdc59419e0815e963f763108cdaf681bf0100000000ffffffff02a1322f0000000000160014d0dd86e4c6eb602e171b09fe18aa814b5817c30d2c8d3a0100000000160014861ea6d71609f458a64640b5cdff7bdc95ecc7e20247304402200bc44bd1418898308b97465802e372c1b70ed423e5c8c31dc8457aefc61641ec02203a162f987996a966469be4a843a60cfaaea5e43fa5dd2701b7e8e65a8c6eea9f01210317b2f403dc84f2627303b59e57d1b119ab9f0696f041c6138d41088c82a95df800000000020000000001019b2e5771b4ea958795af820f2852899addfe09c4b6e329a24f5c5279d593c1d30100000000ffffffff02e03f040000000000160014b7087ca8b8fa219a2d708be83c4e95e5cb2dc0268046360100000000160014d8ebc286e7d0c07e2fe9e841125e463c51b3389f02473044022042a862cc4d14bffc350e261a720a929f7e1160ae6ca45f4683684aadd60660e30220488b35cb6c3e0bb982e14f3f54fc83f26cb4856278e02bc3c7c04fbe2fb7fa72012102f255b2d1aeb3916462b3a636212cfa5401bc2252e8978d34afeff3ecd919f4680000000002000000000101b290c5d0e7c1256e5aeed001ae848b441b9d8f8bb122175bdb187afd87a0dead5600000000ffffffff0135420700000000001976a914d2af8d07f05d189706aedd7203339873010aaf3688ac02473044022039ca3d2d21e582c80b7667fb1e63fab5cc614391f4d3315b7d2d541b45833d740220675ec6830a9e373008ab2706e17a6509ba6c239b903a3aff25b28164b05e7198012103d76e03fbaff5761dbe9679531723e19cd7ced1e78e2c028d192e17aaf43075f200000000020000000001016141cc0920308f556ab0f9579692bcb120f939116ecea7cb4322e8e2a1fbd80f0100000000ffffffff021ed81000000000001976a9140b78b9d905c7bd9efdabb2d5944f4d83760e211088acae4029000000000016001442fbfe2307904e1a28ef9717a6d6e7e3d1612e570247304402204e27fbd33c17e34815f64684d679fc571582e19038a5cd95095de5d9cba866a7022047c794f526ffeb85a62a061bc7b3ee272745aa57e8fd5b11577d37a65ff6cdf90121022fc9806bb56d4c65ee88f27537f211de518206b3dd40f50d8af616a71778c8bc000000000200000000010170be73a1cbc4d9ad8cb158462f09fd4b4f4e2cc462584727c35a0ce2459145ba0500000000ffffffff0280b14f01000000001976a914e7395794248f65091e6d6a7eba55a958de6f192288ac80c90803000000001600149ab97e62f62baf06cdc39a451f6aa1020726280e02473044022048012c4e978f6a3d4a4ef8fb4b3a444c8ce19682956588858b277db7c20c1a80022016d5685372c095afff105e08363d47b2989b58924c1aba03faffaaeef178ac3e0121032bc32e814a2a8ce4613e62e65c00b3a76f476558fb8e3e5f6b102054129160af00000000020000000001012d43b488dd16d4309574d40eef8ecdb5a0f19d10d6a06564d4bde4f602aa6fbf0100000000ffffffff02a6331200000000001976a914fd7b78f8304d19730e65118edb065a8c6fe979b388ac904200000000000016001432cc4472d5a85279edfb85085a2a4359d4246930024730440220785ddd4ac6884830bd10511d11e973f9d6b71405eb455df1d00c02634e835ea202200e39b1d80afd97a1ec473e8a3e3b8bf023f78b7103c167961d0588a3c63ffac301210392411c4ed8df7d1436ef383e483fc5c82513edae957b6b209de70ecbdbb77da5000000000200000000010191467c516c4e8a15943119b03f41bbe27e5cf70d18f01c616d471edcb4ca0e0e5300000000ffffffff022b811200000000001976a91419619223c986629e518def4f6de93d9a38df50bd88ac2aec0d000000000016001478113e34288d131ee0ed0eacb0761d8fd42c116a0247304402201966d54c6b4ddb82b7bc605e26925a321742b5e3bdee1cb7b174dd0e637716ef022000c170d408dc6888303c01312af351aa0208a76225c1b009ebc1354285c575250121027e0038b769cdada1c1605124155859397ce3cad0f8a3e7c538c2777d59e92a41000000000200000000010138c190a543a43ed2f0fd08e6ec67be34a1dac0e8436a9f833d8790191dcc8a390100000000ffffffff02de5e0000000000001976a9144f58a9976fa84a00e788519c0eb05499863d2e7f88ac9674000000000000160014f28f5191d6debd58f67bd906fd41a4835721957e0247304402207f6dfea4954a17c848ccd8ac761470f8eeda21d6548ef15b7e917ecbb6a81edd02207dec1a4face7ed7090409381353389641170f3a843a10386c47de546e73ad6d80121035fbeef718692e2739a3b60414cbecde4bd7a5ed6f66431f0eb29c69d327b28860000000002000000000101e920d2a3f8072e4cab2437a954b5167cd1aaef7edab985d8a588bfea3968f5021200000000ffffffff02a606000000000000160014f2f03ee186e68eb53becfcc1a74337a1854557a5b5d10100000000001976a9149b7705d827fdf6affca51e0c42eb0b71aa2ee41a88ac02483045022100f5b568092222c8b63f4f5a26c866607061280641ffc65c41ead802218af2f429022026d30baddbd55fbf3a0c827186e8e40ab75eda6a3d01c33b397af0e47e43a9620121029db9d1b196f1919910270a1e2ae13821d25d74058758d87162fe9b86830d41450000000002000000000101af340131a08464942404ecb7f03839539552977c9ec1ef972d5a5b97b3ec13e30100000000ffffffff02752d0100000000001976a914974b3073f1b811fd7a202f15e1a42ffdbfc3174d88ac7755000000000000160014e3efa8b286e5dabba94594b403cae4ad5133bc16024830450221008848165e872e86bdfec5ad205e6c6546674d30f88b0cde01ab836f73b1562a4a0220262da2d5423a7aebe2def90bd9a8265fc70024fd38d4e06e3a12c948389481b7012102f194eedebd42c0c8b555200528ee677e980c39f3b30fd051d1bc4ed5b10bade7000000000200000000010123b63570d65a0f3b2eb454594d50a9308d30e9ef64acea9a12fb3093bf9353b40100000000ffffffff02745fdc00000000001976a914de17eb7012a83cb3b3852a89fdc7c4825a1ddd2688ac38e02e01000000001600143277bdccb6a5fcd1e2b591ab56391bf0166a1b8502483045022100e3f7bc7a50adfdfc949844401324bb4f1dd98d5d24997c57223e423729d25922022048ce17599c2d14d8356d5fc412ec9e41b5acebda4fec46121604f78c5e9b6ef30121025977649f84574c6e8a83ae08ff7838c2b73a2605e391d02440897dd45c478351000000000200000000010163bac4aba5104ef319eaee31e75ef9b5beb67750854a88b53a302a48910f3ce10100000000ffffffff021f2b000000000000160014d6fa6802a486e48f42014599916b2a88a5f6923184f33e0000000000160014e0f92bd0ab11dbb0394d28fe66aaf10a62d762b602483045022100d7426abddddd3cfc827852b26bf234cea7d098303c585f76abadd2d99fff87cb0220645c9af6bf5a9f4a4f5b78deef225a33481193d7ebf584bb4435822e739c0293012103253cd0e53d9107ab875828cd949176fcfae46c4c3422cf1a19753e85cb104d0000000000020000000001012f83a107d3d97827cf7c734c7a7d0df92df49a2377fc7d9b9cfab4948201befc0100000000ffffffff0233453900000000001976a9144bc94aaa0d73e46c994bb49fd4bd2899eb92119288acc4a7050000000000160014e0f92bd0ab11dbb0394d28fe66aaf10a62d762b602473044022076e30d8ea0b5b5924ca1e126c683a2e5a427bc64990c4ed4bbe977a33e0caf160220703604b3581e5e07937d9608206488794926ff3284dd5a2295e40669619b7d2c01210373fb22a984642f73c0cbd8cc3ab3f2354e75e93bb7f5493cb6d794ca6c17be36000000000200000000010139266951cfaf52dcff93057fc15df99d8c53a104df3a9f48800492b41e5c37f40700000000ffffffff02b8c600000000000017a9140b1378816daedb0d461c56d575584074082cafab8752300a0000000000160014ab838fbda24bb560a98a5f33570243100b3ad0f002483045022100b46ad7089f2ea6fd71ad3da7a2f9608791e0d60e71648f13a61b77539932241502201d803fa583b268ecee3c776878637f380ef3aa73a1e50cb0bf8a5e3ba155352b012103c650223e39eb8f20ba1ab6ebf531112c79724cade7abb364b6126d77af499f3c0000000002000000000101e1a834ec36eea6e1c63ee259d960a787735626dbe2f93c60983dd2f4cac3d4ce0100000000ffffffff027d6300000000000017a914aad6102c5c961cb6a2a3ac509d9cccb0077c4cdf87da9c00000000000016001467400c3f55bcbaaeec2222537000427025b8e9fb02483045022100c1449c61601f21c799ca9bba84006c29318659c00259c15fbe50c1a856a8d5ea02204704a07c1916e9fc8c606a656987e3019564a04b032a82f1b8a94d5238a7d9d6012103a0ef06909b7aef3cab1feb941437996513b269ac8fc6795cec554d06508fad3700000000010000000001020d1d28093b97029426e9be136dd20a6c8c2ced830f85509b4fa705020bf8eb5f0000000000fffffffffb0830c16edf4614931f815d0328856da7202d9b838e429eb56870cc3574c26e0000000000ffffffff0480f0fa020000000016001420b077c84c52844d52b2c507a211045bbc20295b80f0fa020000000016001424cae736acada632ec8e9b9d2cd902e6330c887b566c3806000000001600145417c573accd9653753ec67237b4e1f58203fe2f4847120700000000160014a4a7fa5c45d8640f9a22c78f5eb656dc1c8017a00247304402201c30d9b9b41a8230823c458fbcffc3720268e54e7c24bda7935e403aa1ea35d20220158da28f7758f0c7036fea9e9fe57bf7dd1efded2123e8ccde89324e040d7eb0012102fa463f5ee2f31801a92a1afdde5221cd1af6ee194eb72dd01306b57b9347f40702483045022100bcb421e4e0a51a01987fbb036cc41de61b1d1e65f737756e18b0993a21da2a1b02207f6fe250f8bb0c020bd47cd97cc44ae22263e47edb81f8e90597ac179240138e012102125cdfcbd1657796e3d6bd25c222980e1b9996fb12a4eddea1e2a5338b6e43700000000002000000000101ef47227285ed59a97bfe762a541f9f3137f0d692c5eedef8a5fe53c7fd0342bd0100000000ffffffff025bc6000000000000160014d72a4405d9c9e03de05b225c619afd61bf41b32cb64c0d0000000000160014a812572dc895126c1bb5a69f9042e31b19cbe09402473044022055c59bf497c91898added999446fe134d22c06bdd487d50a7d9164ffcfd24af4022045c0892267a7acc3505f58e2ddb1d7a911d052852ed89fd4041b3ac3d93c7472012103ebd31611696db5e1e3ce08002211e7351600e4fa2537cb493f70ce11370159fa000000000200000001268631a21df66ec9c8d55b6e14c295894a189dde2525195db7611216fd05a0c6000000008b483045022100d202240279302cc1263ac09a4ea42481e8a3a6c9c85dc6358c75a9d13cde66930220407d966a5d5d4d9ad968c80cfdd4d5b1a49edef458ac4fe91ebdde096ab71c27014104828bc2a8cca438b0a33ad2d0b2fea3aa3fef76f05ac84dc3e84542ecd23082803acf97f4c290422e5cbe8189f4ac2f722265e3819e842a087aaf23acb041b968ffffffff013dd302000000000017a914c1cfb303bd42b695ce3da538fdaea0aedd3f739687000000000100000000010161123d8cdd0fba745398c379f2e59406a13fad3e6adfb1c84721b983406d46f800000000171600144b82cd1a923cc0968557f5b6127ffb47687827ffffffffff01bbea00000000000017a9149bb7a7f46bd350519ce2f5a1f808fb6f6f82355c870247304402207408cb50311a94b9e80d59e14addecc0832a25b8bf97c879faffd737b5464424022010ca1e9ec8e2836df4383115e0d7919cdc1b7229f76ad8b1b05a0ff48ffe6ec0012102dfcacea9de2e61871f7a76625df28f819599de080bc255cc43bbeb2536326af60000000001000000000107cf2d2ca1f50624e619138dc83ba09489ed025409dd8c671cbc1a7c6cfbbcbe1b0100000000ffffffff1398dee890173357ce89e318b836ed3ab5914812fd66735fe83ad228fa6c98350400000000ffffffff52f470ee46ff863453b46463eca08a036d386366460217fb15edd57879ecc8420100000000ffffffffcc247b21c78965b094880c8e327ece5fe63e1ce3556028ce3051dcd7f54c95d20400000000ffffffff3291a38769c8ec310a130e1440ed4e134b7a7a7154ad5d9de4564d18217127dd0300000000ffffffff672c617fab601b261104210fc0d98c6e4ccb03f0899659b7bc04c96d56732cef0200000000ffffffff581dd4e29e8b7aa430404dca6731c4b06b4cfb159cec1694aab4fcecb5a9b6fa0200000000ffffffff02fdf400000000000016001455c5be228607e8930e10825cc12604ab568ca4970d904000000000001976a914ad7eed4114e43ed9302014dd1d9329b3c41c682588ac02473044022051224aa13ed5f76532520098dbb4dd19796fde41a1a5e37130c4dce0fac73696022076133420c1f46c6204567ab0cf1ab2f9b05d8f5e42e920560f1fdee6bb0a920b0121035afd758749c9cda6a28bf3f9ac8e2af09a626855d2b1b00a38a8bfbd14a5d94302473044022058a1f326d665f115655cdaeb17b69c3831accc73fa8a62f047011b76f92d228c022030824d26f184f3f88fdf320c0bf1e6ebd2ba5a3eee470e4a98c067a4f2c96b5c0121020d742f2f4dff7dc66285f7d41a94b6ac846eebd6798a2a2154257e1a845c0e1c0247304402200aba4f5abb652b7c471c8aa97a9be4b6525c5613c66c392aca18ee4fa42af7a9022067e8d8b14cd305e82debe5461b0b1370a46432c419d97fec292b0b05a3d927030121036b610d3b016c29627404003921392eec77542969a652bcda5a7f4258a403974b02483045022100a13c0abaab303588cf19dc310ace8c1d67af5c489b50c47eedb8fd7813c86096022068862791a24cec770361da4463aaeb6cec2ab39ae26c2eb67317f8ab396a56b101210355362b2091eea9df4258cd2099d9348ceecdb7c9c424949211baac3f5b62c86402483045022100c4bd76450d91ed5bf782e12ef0bb22c5cd5d3c765697b386963712e4174f99e2022033d236485bcd237c25202104a47a68626389656636f494151d9b8a5a11ca75f90121031be0534d850b99355f3603675bd4b2e1135a442fa21db174277eeb81fa4a6a2602483045022100b75681545096f80fde79a14f8d805ba18a8abc80bd265d449641d093f9ea89ad0220204a0af6519678d4b8d651266af28d092baba30905bfa6bdde5c072209965423012102edb68e6af02015029e4a6e28d3a9ee7a292ddb0912cb9204b5104fa948e1a36e02483045022100cf8e890d71fc0d1c9125ec93fb24ac69ddca97093ca1332a317df4755a03315102205f0592ef15f09124a2041d1714d6812b310951f40bca73e9f28d7c4a95daf8320121020c3cf32df8a6b1a8715afaf2a57b104425b8317361bf6e41fe5cc815da52229f0000000001000000000101671b8f8582a40172a22ad58b092f24229435271f8a9d1a3b068a6a65086287c4000000001716001479a961c8cb3930c7c23535c09c1580672a17112fffffffff024c1d0000000000001600143c9472e75c9bd670fa336e4aa16fc46a6326d25c01b802000000000017a9145726c7991e0a55bf46ab38e3c56b88083524cf168702473044022054466acd14da6d4ee8c20166cad179fb5fca7fe7b4fe0f67f99dfb6871bb0c6f022019169378f4a2d92c4279a6e099ce750918a2aa021d7858105cab87a3c7c6dfec012102d24467510484d20afb4c4ad60b95919dc0b9243d05d11a56ca9d8adfe039f58b00000000020000000001048689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd010000001716001416933edb785079d43d60fedaecb6e7fe4d8d3c38fdffffff158adf41f0de35368e5270eedd29d91f3dff5fdf50f1e639e5c99bed8c0e597c00000000171600140948b0e3f3f9f2936836b0eefe35c2d153b714e4fdffffffa6032a7e01f6c17f4949668474ea298b71c521a4dc351ee58b711065acae7821010000001716001452c4c12fbc7a6b3a22997cfff83964349d56b93ffdffffffcc704585a43ce16b4551db1505b8acf176119ecabe04f03b3afca54bc90758ed1200000017160014e8db5a99b6f5d0c99c3bcd0f6729801958ac8623fdffffff0180f0fa0200000000220020de4d50417fe2d1cbb4e056261ae4decc7856aa8cbe5458b00bb272da7d157db502473044022028bd2141f8044455a81ca54855d8015ea901bdc07cdd3041207ae71c9e28f7e2022009c4d8a40d9251e02c7413631104042bbf5ad0703d46c0d1eb1701b6c8b6d90b01210338e4ddb2a24c77fa239db348fbd9f70479dd9e131fef704d82ae725d87928f9302473044022041d2254a5a3c8a734c03e1dc3fdb74fe641bc021e83076d1648bd8d74a65bf2002203ccf7bf4e72b28ce10593500cfb153b42178cfa1ee418f766682ba639cad59eb0121033329f28e491dfa2537b49b88cad4ba5cf70a6e3e42e4c0d801af3d2615c7775d02473044022038ee6bff631fe9689814f6a7e9e15b29755b86cd45f0bf4c65d08e4d5e87f3990220743883309f50f7a717f722c508a72eda95d26a0ef0f09801b457acb848fd3723012102c7d3c1a80059828d3c284258948d0c7fd9966205dc2ba33ed5941ff4da52a005024730440220646986bb07a96e6afac72e22a4419799a6a33dbc9e5847f89273b5c4aa3b2a7e02207906c182945823778e61a977abc5ab9641a3ef2137386c4dfc679c31f9e4057201210243d127313b8a9b0df6a29227770b7448537acf6e0b84f86649a9ea7e02d32d7749a00a000100000002e1a38166829b7c470b534fcbed3367585a332dfcbe94f860263efc1c7734c4cb2c0000006b483045022100f086baaa02c54469dcb5c76000f4c205e08b8178e19bfa31be23a8a5f33553a80220516be43f22a688d0602bd605efe3f5a292144e1a9ff2b522cb9a214e641108dc012103af283a771b9cfeb00bdf078e6810563ec0f685357018c7c8f9fde299b3dffd28ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa487190000006b4830450221009f3e4df373cb7825b25385b63e2cdc339db91c33a35dd3764a29a312899b46cd0220090aa7ec7bf49c9baa47237912e6aae6ace735f3e27701abb46c890bb15e52d0012103af283a771b9cfeb00bdf078e6810563ec0f685357018c7c8f9fde299b3dffd28ffffffff025de42b00000000001976a914e62779048d048edff5310bddf5446a440c4bdb9788ac21090000000000001976a914962fa4233d8b6b3ab89f52c684b1e9ba35ab0db288ac000000000100000000010153ec4fe24b36f94ddf7d6f6793c408d67a0a1c326606cdfe5f8b7028c665661001000000171600143e030a6ac7b5097e794f55b7a38f1981478b62faffffffff02ce44000000000000160014d06a137b57044d0a77c8f1f6df8bd3400b28ea0c346c0600000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac02483045022100b112a8a3b38fb3503ac26ed11ba76f96bf0e495871df90d544c9fb199f163c7d0220692f471afe12d1bb4a9d70d6b480c0cfc54ba13e25db1d53d3050f78e19c007a01210372fdee2d4da660a9c1912ea5b0e072a391f8e6ad9902caf6f6c63ce5832954c30000000001000000000101eb59ec1d3426c514ddd27dbdb2cf6ef56ad77713cffcdb13b85915193a9a82611c00000017160014ca15d508616a1edf0ecb8b2f46a41e6725fa457bffffffff02b52600000000000016001453ef254c3ea3248f114d828e5732df4a1a79432ec1990300000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac0247304402206420247dab79250e2c4a30b82eb735f0ba48abb0dfda471ebe9b91abccfab9ce02201e6e25b48cd6d006207fb8c3a6a0f14737ca7a414320a24e038b320a4528ef1001210379dd4c17af8fccd6b2bf4dcd6ee3d9a923e9ab7e0033559f7635c457dd48b85b0000000001000000000101df67b836f81087b6e85a16c40346f2cb17252d10f2b103937886b7daf8db23fb0000000017160014bdb1ca8fcf4285668021523d6f9ae73783d43ec1ffffffff02d15f000000000000160014ce8ae4364e24d06b5df667b97066b64acf5a3f2b82f40800000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac02483045022100a6ceb98f5cef206f9e0c068e46b4b8afdb5aabee49ee187f1004d674f240e5740220206235c2bdf97c509257b7797c2576ac8941f7441468d4d11052932bd3c7dd1f01210367ef2dcede2c65cdb3b5fc1bdc8b2932878ef4e5ae95f6667d25c5ea1e2e9e540000000001000000000101909c0e1fff1fed4f200e22ac002ed67a3c3ed2d3b5632a11a2ed7469770155140100000017160014615e6e4d4eaa2bea9f60a276f48c50a84a2d0fe4ffffffff026b32000000000000160014ba591b7a1f48304a0970d85703a283db1d98d27fdeb20400000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac0247304402202249efb70788c18e6eb7c198f15b413fe4bb4f8fffca760e220c52c41194f43702202e86e16989c972e982ac92bc3c1f94966884be9759c69696795ce0448bb2364001210333a18a7fc86e8642d9a17bff3eedd249b4c561edc78b51808aa3caa3581859c10000000001000000000101573399ba3f5bba40b374fea9194d0820cbf5ec6e61f9bbc4fbde5b0686c8361f010000001716001485d0a8c4800d630c4ed55e081e542e6da8b841e3ffffffff02fc3700000000000016001453ef254c3ea3248f114d828e5732df4a1a79432e85380500000000001976a9142f5df61da2c742daca440ce3166514e70e8baa0388ac02483045022100fe206ec993a396a3641a1721b81bfe36cbb7d71e31774e05478349d28fc64ff202202a68e01a5cca96671ee882bc1b43b69bdef80963fbbe3065e531f715d41825ba012102f02c6c2640e9dbbd885a6a9b1ba6045488183608b56fe543c04dff2e221d1330000000000200000000010180d8e651a4ac23f0c58ebbcb507d6ed0cf61e95d48515c1215f705973c51268a0000000017160014fc78bcffa8c8d6d7dcf389b4360455af1994033500000000045897150000000000160014b1e2860092208fb75a1ef2972696405b40c5ab01d4b301000000000017a914050591e5f058fd983e2a7be51bf354011872c96e87a0b70400000000001600143a30c3e564893aaab5b5120fab170abfff951a5a80362b0000000000160014e646a2919fccf8cad8e7ebc10152902ee4a76c770247304402200f57ad457fab7a299a11d02a867673576ce3dfe7e720db66cb351bc66055ba8a02202108b2d0080054ada3fff2e6eceae276eff6624df3c53d301a9c27e11c40a463012102f772a41a8ef56c0ca996276084b222a6ce5601e89c7554dea9d101dbb38a366500000000020000000001034bf092cfaed46303056e2988b1afd1c9d8eb2094703974693a263538bade6c500000000000ffffffffcaf46603bfd02b095f8e929533d2be32db3e44110aee36f656c4c4f55aba6f800300000000ffffffff52ca24eed31ebd2541f95ef32b5aa39117b9d2d6e26be17fefb461b27ee72c810000000000ffffffff024e49000000000000160014d52039c29277a5afe3b41b0a58e9cf06b330bc05c84f10000000000017a9142cc3bedf1263b1b6b9fe0df986d1b1d493610fff8702473044022011edb4ea6a028823abe612ae89e88f76d82cd063ae80991278ee76bdc3b4c88b0220799d041f9608d98c278317d79d45251d40f28eff27629ea6bc07fa5b1def5853012103ee901a98d0bb7bcdd3688205ac4c947d08055c95ec257adbeae0ca5c62c3fe1f024830450221009b50965b17ff208febfc1cdaae4f8021adc343d538e42b2c49ff1ec2b7f4cbbd0220602aa6105a66354837ac59c3a429e1a8d7059b4d887f248b017eb9151b678e65012103a12b363919f85186aecebc2f85a48fa8c1bb94207e27e9659c4954069bf8dfe00247304402207db7ca9f918e7a2a60a65c63c703be5c979820aaadf53a62cbddcb98cef6606302205b617a4e0c07271a0fb7fe61f196ad54065aa1030a24a2a022b86b0951e4874e0121027567f010049687a24958ad71d61ba84346014db7664cbde43e1f82fec0d940120000000001000000000101e01b4000fe93973f9efed30def9a5828280b8458d4bc0979237832385f8325a20100000000ffffffff0170062000000000001976a914dc0b71f6f8c088c2d20e5a8a6d3a2a2cef14d30188ac02483045022100c1300e4630092f519ca5a85dfd2a15a14a6da41c55a0da9cfb2de24e741873c602207899a5b3c0bdf869e2accd63a45c1f1c0de6cccd1d45e56bfcf12b1f9e3366f501210343915cb3bb4db2078858c809acec7b1a385a636e137cf9f57d1d14bd361712ea00000000020000000001011cdac71b7e336ec7c0eb738436f9d4b1783a1b08966b5d7cce096fcbbf3a0da90100000000ffffffff029af40200000000001976a91475cfb149f6e3a70b9b3d5d971efaa700aaffa4d488acfd9f3300000000001600148de8bdad32b64325ec9043f6a6444d2fe375075a0248304502210086a3d1a2e90c88b879b5d30eba96b74cae5465d7c1ed4d195dd8e5039572e7b302200a7a1018f58333aec8b907725ef9edc1ca6d073efdffab7ce7298ff728dd815a01210245697f3344228845c3dc337c2bb3fdb1cc9f304847ab8f431c832cd4e172cb540000000002000000000101da4798184f4d00c5809afee454d9febf4cdf30f2b965f07cc44b6d3c7ed4feaa0100000000ffffffff02af3e01000000000017a91466562404652e1f30ef106ef589d41c38fe137a4487725a320000000000160014998f617f532e1912b89846eee0e95bd62518feec0247304402206ae4d311325a17fec669b83857ab927bbcd5628b075c3039dd121f0e012a7fdf02202d41aa6fe5162646e3c5c2f7dea863b18ea4c339c96db3ad9f15661a92ce8856012102f52721bcb64843cbdb8d5b516ea562e964c5a4f720ab0e1cc7fc8d47699902f800000000020000000001010ad6f6a5a764bd2e18db743171a5ebec4b32c0a0b70af5405b2d4f9a3c97ac1e0100000000ffffffff02beec0a0000000000160014dc275c0524887a62376d512545733de4ce259c46b8662700000000001976a91431737df01ada2cd63008797d0c83da6cb2ee80be88ac024730440220032fcfd0713ee536971ee12d0eab3ce8bf709e276720381054bbabe8678b2a2102201b5c86ac7ef6713a82b7ceb6cc8f25e8611d45ed20c8ab8f5b314c0c79e1bc7e012103bb8314f0b0efedef4ba68edf2f521f6b6b00a69d1da26d7efa32e8dfdd9ef1ca00000000020000000001017fed2ff1d6cc7bfd60f9538ae2f64a22f41d9a01a943e4f89cc66502424d35ae0100000000fdffffff0268f100000000000016001488503f0a189fd559073f1c07041e957477457d12940b01000000000017a9142003ca9d370b2110e946bb7dba74197b03bca04987024730440220686e459003a8a93a601a7f970cc383a36f88370a36423a2660b6cb11b368e1b102203e7a9f2e3e0709284152b3702d2d9c735ff79bc37ed567bdc6e71a61d79c15fd0121023c2de31bad9e21cf08d436bf1a97f72e161ea4c89f37e04c1703d7cfea38da3214a00a00010000000001c8badc6d4c53606b8d01c7535a363e477157c9015db6bf3f8626322589cad16e030000000023220020d628ad784793aa090098dcff3875063432f768964efb2ac892c0b1a395fd4a96ffffffff626cba9be6abe8e9972329cf29cacf3a238a3a2d50a72883adf7e08891b79903040000002322002074b69b42a0047641f6239011e0d5fa9e2822985eede39e8681412264dcf7fb16ffffffff85af445edc69ef91f64a7ed82638ccf00da502480f3367bf4f7aa910d10706040300000023220020dce107e68b5f05be07cf0d40c848a2a5d99247ee1614de472d820afa1f9a3958ffffffff85af445edc69ef91f64a7ed82638ccf00da502480f3367bf4f7aa910d10706040400000023220020b267c534e0ddd5ff0bc13c772691f39ede4e689eea661cb5c3e654380bffdd0fffffffff85af445edc69ef91f64a7ed82638ccf00da502480f3367bf4f7aa910d10706041a000000232200204e48672036e8e16c7a158262c47ae048a9468b8fbdb6905013d3f35a2aeea2e6ffffffff5ff02b367384db28a0df8a584f6af70a051bb3048a10e3652417e02dee3b83040000000023220020bb2e5e205b2e2112e21344bbe35d170366a1ddd017de279787b41115702cf915ffffffff0e8a247b8461b91a34e43cc610bcdcbb9a3225edbf5219ee8c1bf61cd80a22050800000023220020b2c4bcb542e98a3173429c2d709c5f8375d968c25366dfe56770940fb796a40cffffffff062e5484680d97801a1e75a92f18ca6dc8c90d1bb136f079100d0576190e4c062a000000232200200e6b475ca600636fa2160f90aafac87f1f1a95f7d8629c73768f89d24921e30affffffffc6eb1e86fb1bfe9ad4297acefe0482f28072aea477b1af12313eed5abe75b90613000000232200203288c69012db393d2824b1ff095e8de17566e5d155cdaf45cf9eb7380c48258fffffffff03b768279190108eed15a782494c15c3bf49f815f6e75bf7027f9a62a9eaa10704000000232200203dd809e9d792d923d78190f5faf0b7655f990a630789c1ae1f6f281acefcd3adffffffff7bf5df84dafd4253f2484071ab954e1e72be67bbf912ad5cdad92936a589ca0800000000232200207a35711ce874191097d276c8759eb1355d9a266e3b656e953c2290b337c2c46bffffffffec90e882ed3981cfeb3ed31919df02ccda1c7f319de70b6f053283467ed4160b000000002322002010ddca58e2d186f90c705ebcd038c9c20125bff69e6309634f4aef57e98c7362ffffffff6838f4a5dd017c09cad320e63dcf6515a6f26271af09607736acf548e720670b0100000023220020e488e22e7639627c991a813d8dd7d3f983cee81f7c04ff00f741de9dd5e63e35ffffffff0a1c0a93e3e219e8aed4beb5387523f320a31e0535d01415f69600c61220190f19000000232200208ffb7e645baf1c2156574cefe06ba432fdfe6609409ce78581adbce2e11b2f11ffffffff57d186fa9ed52033dae7d10b1b114a4680f9e74bf4fe7dc4e7d3562ee5f47d0f05000000232200204da612874fb933d62370810f816cfb04cc61820845626916ab876a9d8c200146ffffffff57d186fa9ed52033dae7d10b1b114a4680f9e74bf4fe7dc4e7d3562ee5f47d0f0f0000002322002086ad61c4e918328b86d4b47ecb6c818c5b6bd263e25e15fa7293e1d790d47bb0ffffffff57d186fa9ed52033dae7d10b1b114a4680f9e74bf4fe7dc4e7d3562ee5f47d0f1a00000023220020b9c7749e6112f240413dca949f74ebf1c930085778b2b182e1ddb5ece2423f12ffffffff6a45af731f93a8731a40fae5a1dfcbeab692ba7756d9b73191091e6e291b53100800000023220020c85cd5d30da53c6c3c7a5a6faf0767bfc7a57654941cf7d9ad912d1dd42acd92ffffffff9d3cb06bf46aef51509bfcd1b636a569b5c611cd0794dce553c5c4f12b6f3d112400000023220020618e7bc8a1c8554a64004ac26ebcec6fa00ce539060a7a694c28ab129f1cea2dffffffff1c09e2bafefbeb6d2861247aa34d8879da1bfd37326121a6be78a953df427611000000002322002095cbb0fb8a600cddfbb0afd696dbe0bd8c2ce47cf8a05e95701b684d9666c2bdffffffffd471eda88f2b3e465f14ceab0bec7c4dbeea1b0808f7f8aff6f29cd81390bb110000000023220020078b8712dbaf7819efba70cf8dbb39d734a06bacbb9085154b381ed950efbaf7ffffffffba88bfe0516fbcaaf69f3e97e2c873dd23e1dfd0700fd1c05c5dda8aed0ee2133d00000023220020744495bbb3209631a7d50230d335957b51b4518d134b500d1e76da36dfd8d099fffffffff3218490c77219440a89d4ad03c89bfc0d6795d215ebe70c6cb0fae9261b33140100000023220020032cb031a1a2c8301ea1f0ccafaf20a6a0da05d7155e8091f901d9609098cbc4fffffffff3218490c77219440a89d4ad03c89bfc0d6795d215ebe70c6cb0fae9261b33140b000000232200206d80e9c0630800825ffd996eaa60ebecb2a2e8539cb29d6995959d3b30126683fffffffff4abab1ea257c7e70482c17b98975b4c9a1ce80560980994acc5c52549abc11600000000232200206732d532be4f9d356063ffb0340b0f4244d765de7ed1200beab4182fd44c9e53ffffffff65da57531dc24b013ced39ab427b491b8435642b1a3f6270b8ca7be9584ed1180000000023220020de6de07732715195eb126e0dbc0d7f45e5eb0967f851f7e60537b44f55ff9738ffffffff109354616086c9fe36e8cc325ee07b14c912b5f9bae13467590405740425da182800000023220020663b8769500a40cd47543efba4d4fb9d2b326d9ebaa09fd2de24e0470703a41fffffffff22e843555dc3018e9cfa561481f3784c7407053706ce8a104730a23cbe1e38190300000023220020c396fedebf038aeb222c582ed2e8d2a6811a8d3d0965e50c37a701c9706be24fffffffffaefa95eaab634fc33e528adc72a4db7cf01667c0f2a15be768b252a3528256190000000023220020b42f9ac3cab96ce5b778508c384c906ae01e4e358c5450116f196afd0a901993ffffffff33a4817a69b43cbfad672b87ed60719122397ffc773cd72774bf9a9db166aa1900000000232200203a8e161f1fc7979778fd451599069699ba4f7a912270d35e8a7ce9cd06516fadffffffffa039759ec904921c5da37ba339519cc2d80434e3552fd57f413d825f6d2a6e1a0000000023220020dbeb70e3342c7e00d9b41a3495cf5e00cda4122464e0397d56294971beabcd5fffffffff65a2ac48a44fd49f287d5e6ac2f7682f5e38013a8ff30d505d0d7611e59b0e1c000000002322002086b0945975746cdfc4997ca3536627c8e7454d44963d3e9431516a2e8f296c0cffffffff52f06d3f603378d81fc69bb59f1f6cb9a9c620c75b8feda545c8adcab205131c00000000232200201afa59b993dbc61b0bf45eaf8158080c9b83cbb9916143d93e57e2241fb4fb6fffffffff7a9eb31f95e78d942a4663411af93b020ff79359b9bd6c768327881862c7f11d0000000023220020e5532acb2d8a48f619ee11e710c9146757542959a2c2391a225c7ea8a1b38635ffffffff66d718d9c615bf1cd94bc15e3fb8d01582c1f5da0d2192c0bd05e781d55a761e00000000232200201790bcdca0713cfef5e0bb132fe45fe25194c744c99a5e1137172bec51b15ac0ffffffffbcc6f463a0244fac7ac53cc24b86f6dfb053f31aa52a3611f8b4e46a5f880d1f05000000232200206b3990192d9f374b0b83e0fe1b1455d12cfc411947109b07d64b25e145e3ab74ffffffff3344007f817278f2ec6217de7f9af871325109e01e67d6c09a549e3b8b44521f0900000023220020767a8adbebc056d53a29619aee4eab8516829081aba56892afd6aa884b7001b6ffffffff26911986e62eeb5346c8178207e166f82e2ae4b5159fe6d0d079551bdd12542001000000232200208a972441f5c5a8d1832dc7f171965bb3f9d760417d5d7f40266a69324be01839ffffffff350e125768d1a193e6c53d7292ec2740027bbfffae694b0d2861d0ccc1cf172124000000232200203ab99a1e160626bc7726f0db7e4c64e6e22228243275b53624bf574ad3243209ffffffffa1828941692eddc8d44374da8dd8c22af56c0b7cf3fac61810a23417ac664821210000002322002005f4c5973b66d1a831a3cc6ef01c32c5f5121065941d52a75859238d283ab631ffffffff77767790afe7a60113ee7e4d32f2d6288ad75e10d4fb7a76c2705d458d4060210000000023220020d0f05ee9e40dcf06b6398491403dd607a1b52f0e32e31f613dc2bd2135873e4dffffffff3612f8023c74d0b54b831ac63fc6991a97f3e2ae5e4202181b3fecd0afdd5b221700000023220020d5c8bc24bd207c59fb2071820e07b8491f5a9ecbe1b481c77cdb2940ed3aff24ffffffff8079ef2923eda9dc1b92ba52467999e5b170223087f70a47c20ee83fdc7774232f0000002322002090aedbdaa66ecf7a52da5d9949f284c233533e9203e2b83efd35705ef64db00dffffffff71ea5078616219d12243e2818115d9945557b4329bdd359df939843201c67c234400000023220020a9117ee5d0bbcd50ed78f09f89ef057e7da9bfe9f9bb1bcf73397b5ff292ee82ffffffffe17be4927a761fb34f2ba4fae0a90d6c3ad47a2356fcbd2d3d1a3423b622e225000000002322002050e7d98bafa646598096b3e7349d2831a2d805d4ede0893031267b38a48ceb5dffffffff04e7b01cbb640c3881129c0ac302bf2a5aa22a4e3a019291b06c44bcb3ad922b0000000023220020be33e422b95616b18bf5f3615f8d3dda348cbfaddce04a4876fe1314ccda3159ffffffff45c22ea7dd82dc0a984508ff816121b68b413fab7441c649919716f98ec633302f000000232200202ff8841a2560a516908b2fb3c319ff75b7aacaee59e5bfa826de38d0c867f20dffffffffb4539839f5b15758a2f5b977b1b9076a1f1d9a63ffbe6e8e0de723476802083410000000232200206b8e0bc3786ff963930fe11291c5c323fe500d533d1885dad19139f126f6ad12ffffffffb4539839f5b15758a2f5b977b1b9076a1f1d9a63ffbe6e8e0de72347680208343b00000023220020219dce7dac95a5aea068a57c461f0b1c02ce020c5225ba9c482d6ef32ae5d71dffffffff863ffd25a7ceb385f9159f3614d9c9e94b7637e70e7d80860a7f49acf2d273340100000023220020c091c5beb272f1f79ef407eb4f724da3dcab860c5041f89fe96fe683284770fdffffffff37a7e5960ef5c044d428a4f8878e6c0c4f6f66eeb4ce1b935991fc3272243f3800000000232200208f0ccd884bed255162f5a36d68d7d317a119ab4a5af6744a62dca01600e898b5ffffffffa824e74875bca953ebb58b16e0117f337b9f3b8db8ca899c6dc040c08f66ed380000000023220020b295e51decad866408f798986e7530a077a43d5e0f25d0c83d2e1ee9246eb7a1ffffffff8bed2faf6d465db110f46ed2f3dfe7a69387a386812ed1f73d5ec52e02c965390200000023220020beb02113f6aa00cb9815ac861120af3ce6b81a0abb836c38a23da924ece9a948ffffffffb3f3eb007ad34d8bd0aec5e5c4b9f5214b22a3ab9a93208542f8bf6a7384bf3a0000000023220020137ad30162f55c3dd617dd1c344076f6e6b3b72edd748f4eec9e26dfc344852efffffffff2e3c8ff6b48d2ef22f327afb99c3f7c7284a88d6d3d49a3f5e877069c54b63b00000000232200209e1fb2389a7d24722f6a760681e15c9fffa49535d68e86e788b495afe8c17c00ffffffff5c9d6a1e0b792a8ec729c4eababf3c8462e22fce369e356a39d058d30399903c020000002322002026d90c48ec7c5dbf208e52d74f26783c8f9819f3fd4eb3656c6b5c966427b576ffffffff8ac37edc7bfd6d46b74cadefb760bc9ecca427b28aad4f81a5e629869e4cab3c17000000232200203f8c36cb54649c185dabb994339a6adcbbd9a02d5bb8669cafcf62f7f37c2279ffffffff8a515d64ad11e24a85c9418a93cf4682e54c078a54e37845e4c66ecf4d45a43f0000000023220020875f6b20394993a9a79dc0189c6f9effc9fb52d31c931fdfdf21716549572b32ffffffffa47f2d38b1216256ef180aa7be3b326fbdfa0551912d02542ba5f86704870d413000000023220020f8c2c727160bb7fc9376110622bb030b9e5f0b25cbe653ee354b67c829c6b5d2ffffffffed7d84e00fdaf4d473dbaf3a76bccf983aeba2c4ba327903e6f9aaa6e531bd41040000002322002069b444aa3c9e44a4f0f5e1f9a8d4fc24fa3022cb43074d1913fd559016c065cfffffffffa4fbade6d61fc3146767ce360a24ff496277ea47b0d49175fa51d3431bc533420000000023220020ce1f57c683f4736991e023276a8be509d266d3ece8b8aad90098d8c577f3fcd6ffffffffeb5e0a3e824b0ffc6333054de1ec620173e723e49e667053eada19028951ae45000000002322002012e69cc5985e9cf023f9dc457c974a21fbd90c0f95b370a8f331c83a3251ba48ffffffffd50dd9060683092f1591c90d6d0d8f519ebe5c335006c3ed9bd732380d89bc452900000023220020c45ebdf04c5fed3d990a956b190d447ee9de1a6ae7e3c6609650d8c828eb86f1ffffffff2c5ffc53d51aa39d5fb7b607e3a7a4b119db4f2b448bf90a250d5bdfa0aa6b460d00000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff9a126de006d6219883f926f0d24dc8b541b07b6028a604ab105f107b65c9f2481c00000023220020c3cc7c008a9bfc67afe6658164c9306565decc99c0b848303770005f39d0dcf4ffffffff6516d5114eec43f51fb16f7a70a485755aa47424b14cf2a5a9a74dafc80cfb480700000023220020e056f5b4b24e191dbec97f6109db3f182706c9382b4ba3fdc3326fafcee966b1ffffffff6c9dfcb0d02ded0c17437072ca90d6c231f7b572b84643308b4d74b48621e24902000000232200204fb172ee7803fdd4fc5759c2ea2ec0212ecbb398e26cdad72787dac61b05e3d7ffffffffb9b1e9c758733b5859c0ae6c0de5d4bad8781a6b7ab52065efe9d3bbce76504a00000000232200205562f3e8ba1a197b50f7bc8e7a646e874bda13975d659ac186d212ab54068db6ffffffffccf6430480cef0fb22e173a5a1ec5e06844c284f4ec634155089b840b389614c00000000232200200828afe8f940847e3563b32be613501378c20e6f08454fc44e977693151e7e5bffffffff4648296a8f851f22f90678cb7f0d2d85faf33beb04a5bc2f44c555977c79654d2d000000232200202c11a496cce0cc8d42c87cb0b4801b9b49b882d2fc0b1b0bd8b1320de0d72954ffffffff7185491e9d027f5db6cafd0ceae7ecc57fa340e2bd7b284d4a94f7d585fe294e0a000000232200203c1fb720b319af1eb3a09497ae1adf784a7b9598076a31c16ff100cd52a28884ffffffff91786450cd15ad6d4adfb68476d943d62d96b1bad0297066b86d2bfa59d9a24e3700000023220020a0e080b1fc23264dd506bdd7fb50fdae3ee509624a965c59b880c675621dd166ffffffffb3954d647dca4c085417aed7cee18d7ec2f170f64954175b0c85a6834bfe6d4f000000002322002027c024c8b09e1436029fa7bd267118cc8bda3a97f90ead3d6630fa304719a7b7ffffffff59009d791265fe937e00105dbdab894028d42f8a84c779ac1075cc8e16c30550070000002322002098b05509d93514d4ebb48290a696d7def41151f803bd53f3f700b669bfd4eaeaffffffff59009d791265fe937e00105dbdab894028d42f8a84c779ac1075cc8e16c3055009000000232200201af75b385e867e4dcb0ea9dfb97c65b1bc5c0cd1c81b2c0cf430b46e04480188ffffffffb2c186c4f0b53ef328175b3a1038dc39c223e938f90a0faa0da924144ca624530000000023220020f771fd090b2fb8afdb5d3f878095edbe6a7afefe862471857e5b605a5557bb4fffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b56000000002322002002aaf3c1226637057f4fb7d8d5dbd3fc9a2ecd19add24fc73cd3d7ebd820ca1effffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560400000023220020c2d6ef16354ef8953dcbb2718777bdfd8fdbe591e20d655f77732a075e186233ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560500000023220020f786dbb10c3e6372d25414b4c090bcddd560d5d6084b04fbe1e9ba9e33df42afffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b56060000002322002007167e0f7e3909ec823497a91020b31d22123e96330a4a972c777eae64f1a063ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b5609000000232200207b26a9227eaf80687a6c5db863c0e7686904583ddb5c73ff593525181fa313b3ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560a00000023220020fe0a0ea65897e336bc51609bff9f25cf2d3960b2e59d0e7ea7cb95591bfc30f1ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560b00000023220020820eb7bed254a4ab33bd64e7b4c2b831a46a36f671cadfb00a1033b82ef29805ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560c00000023220020596bc609087bca8753113f7b88337dbc02e37c7a9c8e1ab3004268a5fabb33c3ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b560d000000232200206bf953e90a746c69f2de940db61c101fa0bcdf257820f337a116e2ab6616c150ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b561000000023220020759aef15b3038b42197e9e0486a8e89d451e8713dd4a31ecdffbf529b90ab7f9ffffffff74c2ca5e4efe50ec918490c24d64e8b3af0400b0a7d8fbc79183ebbcb44e5b561300000023220020e43d468a083a9bf18a20c3693c84b43f33904a6653650def64e0537fd7b51e57ffffffff45de4a5d18ea817d582a71c8c16c3878af4a65bdb742d5e079a99e51001e54580000000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff69413e7331c3c3122ae5a17d9deb55020e3b4a39289f6be5f75c029a2b4ff2593e0000002322002078e7d6c0e33949a01e43aeaa45c7c3f6ab1b9e79c4c1278e6f5da55f89495c38ffffffffb1cc635e9dd973261cb775c9192b72b5a4dd75f286ec90722e648857b9cb8a5c05000000232200208f780238b882b6a0cf160b075d3b9db99a7838eb624a5a52cb0110b25eddea9fffffffff523d2726865cda2051adcd0c61c3e1ffc88fe874586501a901fbcefc39a05d5d000000002322002029b4da3cdd1f439cca05da1054a1b75111c074e258133fe17676fcf87b2da64effffffffb147359d33772ec45562c1ef28e31450521f3c44cf04cde1f29f87bfc18b945d0000000023220020ac771e0007ca7a779e801cc28e3770c8d12131a8279b64136d3152f9897d540affffffff70faad6b7511a34c6f6fb8109930b5d9718006631b7029cffb8d53c076ea095f00000000232200201a9f6577e875ae9100c17a732be3dd1f6e2fb6355cdbdbf62f1ab3a454649bd0ffffffff3417a16f77466834da284873b5922207079dc2b1c3f3ec06947b131399377a632900000023220020a000bd9b83516d2dcc2a8fcdd983390f9ab5cf3c4f1235dae5e89c1bf014169afffffffffe2b90761d0c70aba37e3f1a78725aed6754b95d1e3c25f4b7662a45e23a91640f00000023220020f1796b2a7af7edd7d7ee5e1cfa106711c0590e77178d7381cbe6893dbf8af112ffffffff018f389f2277caefe800b72d8c9de3f93e7164423b70f75aa3245fcdd9a2c46704000000232200200db277031c790de5960776e1b3d5514fc31679dfef4b8d14c2b653604a853429ffffffffbfefd0b97ab3991d11c52458446eed869adadd45dcc2bca229c4b2739b4f91680000000023220020d49e14040af0a63b98d9c581f3a327a03a3cc8ee10db207d7ae5b50df69b0d7affffffff5fd4b7b2d0d177917690dfae35a87b76c7791c2d26a6a8766f8b8dd02047a468de010000232200209a12ac132567b407cb745ad03a82b71c29fa01d74041363b368afbd705509f6ffffffffff174c6b3ded71345513dbcf3b91099cefed08457b095a153a763982eb6cb3a6c0000000023220020f771fd090b2fb8afdb5d3f878095edbe6a7afefe862471857e5b605a5557bb4fffffffff70111a7e4e63852ddabbebaad85455e7d81e08b2b94b588c0455b9f53c2baf6c1b00000023220020aa38e81d269e4e38f7e4a2f202be78e23aea339ee994a0723e2981cccb18c9edffffffffd06c7bacaa38577eac3e940f2ef7675208c049ae02cb4e52c9eab27470bb6b700000000023220020bc4e852fa0c32969b33e90cd5e2e80f11bcd99639db9e23aa1e0f5bb5d911229ffffffffc213ae606c0e655144d5e4163ec5213adf47f8ee3f079f90d519e98304cdd1733a00000023220020200340e604598bddd2715ba4ec7b13ebe99bc641b75c40bebc27f21b7c3e44b9ffffffffc213ae606c0e655144d5e4163ec5213adf47f8ee3f079f90d519e98304cdd1733e00000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff090e1b8192ea3bedb78efd325e073a723c8ce5ef9bf094393b6f98387b659c740000000023220020c1f0758132cc253c004a0d1419676ab16098e8ec1b07ac7df4339a0417d17e58ffffffffd990f9a1be9d9f8aa98bd54c32f46657649294f137c0d2566e1e91941a48437600000000232200203feec4f9629f4a7361f8035f1532ea7db186adbbb009d383f6218ddb67bf1a47ffffffff15d51af755e2f8f7de1a9ee20f9b2cc7486e0d3787c0a3a8112c7c7e90224c762300000023220020419788f9e80e8aca2aa987c17e4a32eb0c107930e6db018cbce316c5d70d15d0ffffffffd51d7877964a78f6aa9940471be8292b274b7fb13a44a5768c03f60491d3cf763900000023220020d9492b681f11b840dc917e848d75f5a8fb2affd0029dfd9ea27a951e222eb7fdfffffffffde1776932eeb3288a0aee572f24a353020752f2448f59e173304f85602ec7782100000023220020df7637cc147e9f0e746fb321482714e3aed19ff8e86c17982560bd219aa437adffffffffa776744b01bc2584f49f3bff1928c9da84b1fe64eb8ee77f00588ae0a03fdd7800000000232200208a947a874fbe1145fdec0b302836ea9df30d923056f893e77a22706391a56e85ffffffff0a9420da71f874acc8d2c27e8ab6ec21f5d6025fbe1b8bbb6ae2bfd703303b7905000000232200202494fa91463fb81b800645b0f2757804a8e9a6034d6e17509cb9f68d6a709882ffffffffe9745809715c64f17a5d1655bad8bc0c86ed350eefbff3ac3f3f4808c428967d03000000232200207519f25b857ecf1d63f4f77e752a40e75e49b38974767de58d32a88dc9721b93ffffffff326145e577d03a223464543d6bcaeea796fd645f4100f1f06f7db0e8c6f6527f2200000023220020ff0488f912d75f710992bed8da7a98aae239ca96b88e233b523b37fe5732bb79ffffffff507f643ab57059cbf7d9ac0233bea30afa2d867803855ff3ec6fbaeaf8e13c860000000023220020f170510596ab3c39aa0363554ca803eab5f9327d81ad6491d8c74014e5e6c61affffffff64e63af4819c616c2ad561149f9420fba2edfd227f9a90b0f28db36ae0fd058c01000000232200201abf48c5ebee3e0a848a9a576fb4d37be6ae114bb1663582b727aedeca215855ffffffff64e63af4819c616c2ad561149f9420fba2edfd227f9a90b0f28db36ae0fd058c0a00000023220020f804a10be5d7b2573630902ff235cac77960ffa7415862d2cff471e1d75580c3ffffffff64e63af4819c616c2ad561149f9420fba2edfd227f9a90b0f28db36ae0fd058c0e000000232200203b930b06bf355eecc6e12309169de020c60158efd2db11d4d86d7763ce5822fbffffffffe59a0c783989a77c0f24fdf7934a8fc537c701a7f276fa75b056902571b6388f0000000023220020ee3546de9b1999b97d31bfcda2148e4b24fb6cf7d01235222779d2f9803b2d42ffffffff8983a9172a07d1cca476016f898ffc3b123b85a80cc0a3dbc74e3693cee0c290350000002322002040819a542df9ba76fbcb44223ad4cd104bc4a61e4ba0610c4eca4d3bed5d6f7cffffffffb0fa7fddcc3a9c9402e123ae99341caa10084d3c8ddc2b24321affa47a74a7920a00000023220020ef5819d62634d4f9aa041568f14720897c46c6f4284310fb150e9c7bf55abb52ffffffff3497dd4d034cc2de266ea4b9506703cce75a22e482c48c445f9da90b0b2c10930100000023220020b894335767d1fced9351feaa265c532be4d2b94d29c22039c81f366f7aad7783ffffffffe3de70a5fe1944b6cc9b3ef326e19a2c6931deeabe6499cdac66607b8146a39300000000232200203b6e800162625df09503d3f19903b57d01e180ad37362b095a23db88a2bce01dffffffff1e3823e566b82b8c4039c0dd100ec7caba5d29950c1a6502651145f668607c94250000002322002024095af5c95236fa5e0103e2195158132a7099a638a77b8eb9e3925026855796ffffffffd872badb581e8651619eb2eea00e32f735e571719b223378d82d3268cf84969423000000232200206f84123e2f162c76db0b25957966ce05833951786db85369ecfaf44da40248faffffffffc87794acfbbdeb8c1ccf94216b2a5f587d576ff3ba5b61cf8a5d52efd3e878950000000023220020d9152d803d2ceba2050640fe3ab2e9d319001f5ab16779d23e1f4cd836ee717affffffff9b36570af704fca04443bcf14d6cf6d0e968bc887bbd23a56b4b6d9742839c970000000023220020d7619de7a64e8c86de0e0aac743de636e5f1244fd19e3feb551ea1073c9ee508fffffffffbfb6e7776e89102c21b5e4a520bfdeeeb50f85e148e7c0eb524ce5e5bec1b980000000023220020ce72a752997d1b81d13ef5cf89cea6939466728bc5802f33cde29f32338da813ffffffff9344dddb65074a8f5d003cff9bda2c23c0073c9b3b2c95c64f555ee45d7ae69801000000232200205fe00c605fd2b447dc9e4770fd97edfa6b8da994c3ce105b18825bf33cf5ee73ffffffff7902dda3f92c6b31a913773292c42c1e5a1b16db27b86f909155e17bd741f0980000000023220020f771fd090b2fb8afdb5d3f878095edbe6a7afefe862471857e5b605a5557bb4fffffffffe0e56ec197aa294726df2adebdfee7eb607f7e744d502fbc00581dfe6d26709b010000002322002043693032be5c60e360b62f39b4ef9a8273989a1f432626d49ab18bfd1a3404adffffffff423ccced08ab4eb0dcd974ee66d8ccfa03c74843035d719bed379860dc3b819b01000000232200205a010bf1f716565d371c604fea6006eb8f62a6c40925485a81f80f0359342af4ffffffff8e81fb2b2017434a1e55640d484a77926252caada726396d09af5ad1a598369c00000000232200203f5770a498d5fc83850954995a1ff10a992a1af6a2f0bd456b9fb2ca259d1c88ffffffffc08cbf300cecc91d3abe19a4441e9662882b0a4ec226f240ac8e51618130c69d010000002322002003744a3c83789aa639ee17f7c9e1cf495a7a53d9e81393b7459134cb375258f7ffffffffc08cbf300cecc91d3abe19a4441e9662882b0a4ec226f240ac8e51618130c69d03000000232200201af75b385e867e4dcb0ea9dfb97c65b1bc5c0cd1c81b2c0cf430b46e04480188ffffffffc08cbf300cecc91d3abe19a4441e9662882b0a4ec226f240ac8e51618130c69d05000000232200200d946b24e0bf4b61a22963a34aad7f693d4d333f8b233b9cac6b70d2aa77f505ffffffff01f1cd064576f2b1cbcaf0ee4dda18732b7a9125f0b944dd984fe76d56625b9e000000002322002030e75274c3dadfac5bc7fcc6d65585fd0f09daf78deb4de2eb68d4958df99a47ffffffff8b066d97d63604c1e90cb6555d8c2070829b2f2766f004353195d09d3ddd53a00200000023220020b3378bfdc6a1c374f8d7b2d9de8721aeeb8de8e2fd0c8e6378c41c0f0fdd0d7effffffff8ca9b76d89929ce581fe4537731c4cfcd9525f1598dd07751690fa31ca603ca10000000023220020f72bd1ff9294820417ab66820634a0fc7b1190b834edfb0b9becc609898474fcffffffffc7e431842852f68bf10fc5fa73650d49de1ada6674f169fd4fe71222e16bb3a32000000023220020f739e10818bf99469cef467acd72c65cb7bbe2b26d6bef8157f2f2a5550e4c02ffffffffb0d1b7ec6b09389996a55c62d79ddfa1ed5b8372c91a4543b7cc5408bc41f2a30000000023220020d1b4272e2ea1709757dcb72cf1429e4353545640228501191de6883df50208b4ffffffff8fb209a7f5f9aa2e327ed8e2996ea4cf531abe68ad25dc49f9ba63d2531c30aa010000002322002040cbb8c82ac6ca1cb0bb71441568a001ae040575e3d8a832060a4f378a265dd6ffffffff81c42436feba56881a4bffa3a9a549605f45f821cf4806546e69a373e46d96ae01000000232200204fbfdd0a05678f8b82523f9961b6879a5977e7de880d2cfbd5c91a546a361d1dffffffff68521f4a6f58e1e8a8b1373a970a7a9ee51ec512b208e03ee05192533ffddeae0000000023220020e2a9e3e8b120ec9ebf8b6d4d35b00a65141ef14eaa00a1ff206cc47358962516ffffffff9e00eeb24f9746027fb7c08d4e55d713fdfe987ebf7e52a253c99242a971e7ae0000000023220020099da42d2da7d3b795b08f68a2f2400b20b365d703fb8e442edc25bf088574d7ffffffffba4d589224288887e398dfa5dedc8a1c305a37ca5b9b042c9bd3b4f1f89bcab04e00000023220020dd850f9a6601270c1ccd682a15b86012b025f58ee1c28b2e3eb7e90c0cdf356dffffffffd833370402171bc8951c2adecc44d863a86235f803437338c996e53d3a2961b20400000023220020a9aa4f565f6605b631e33fba5511821ca6f35887633b917b8f8261500602cdd1ffffffffb9a220d95ab560796a46ecde18292f848b778d9be8e1d5526d51d509405284b201000000232200209b76314115ab3395187357f1b7ed726f6a2f7902451a52c722c16660078e69e0ffffffffa2ddac9ba30dc9e1ffb8994e994efab26728fd4b798c9dbca915e11ca972d8b54600000023220020f19c650652422a57dd0e017f848f62ca973528dd3a3cc91817a79ce730120e55ffffffff3b51244b01a7301413e2d8cccfa87cd7224c9109faee6bd9d043f77cc4f0f4b5360000002322002079e790eb4325fd5a60fb5c2e38e662a51b0b7266ca5cabde7d71582a42d36076ffffffff5aa069eedf311e8b3a1fb334055b04d32beb32a1646a064ec60af0f83a0f2bb70000000023220020064088b144dd77434eb50a4f21cf39a2fd44b7319981a871b53bc41c84549212ffffffff1bc2326911b6e188b8a7b4a44d0c13dd7312d469184595b8a6c92ac4aa62e9b70000000023220020f0555eee4e11ae46b1f0687d55d210c7e782006f6de2d3dde644ed7f521897ceffffffff1776283239237ab3c344468e31e0712f32b1911a8ee00992f16c16bf9dccc0b8010000002322002045485640e2f1a035cb3f95867e4a2af5b95b978db4c1f0870e60b83261622af6ffffffff06671bb3a99a82b62a07860876c9602007b2d6bb3b3c7025a95ad65da7bd77bf00000000232200208b7770305cf1abc8954d29e045c1d6d7625aa8b02aa9ecd239de32d72a07d8f6ffffffff47b0d3f2c375aab9e5acd6a2043d0808a80b66b92f5c598b79a955b472c29cc2010000002322002093313eabc68e60176f1ef6f57bdccf93db3c0db6ae26be8e77130f6b97b07e57ffffffff0f72843323ae7108fe86d3dc2dc9cd8f51fd4119c38db50bdf5738c1bde244c30000000023220020371a1d38db248d2fe7199fce58fc981f7ac7b98c693113e1fc67d3bbfcf1005cffffffff10f24097ec60174a806c1574c60b923652610a1d6e5cefd3514a5c85467fe8c327000000232200206f84123e2f162c76db0b25957966ce05833951786db85369ecfaf44da40248faffffffff26902f0a533ce6318192495ed1ec068180f97b0c91af92f27ce82a95e3c13dc70200000023220020ef895e91f9d4935124459c0e188e99a1d8a84a2addf32bf004eabb4f0f8e7da7ffffffffcca2e4a236b6441916db75878510606df10840f34555b48c88e9e6734cac6cca0000000023220020d9152d803d2ceba2050640fe3ab2e9d319001f5ab16779d23e1f4cd836ee717affffffffbb9452caf645ed8488aa2038901c6dec0ff280f8f494539df09ffaee9901dfcd01000000232200201140830dc3cab4c143d928a3cf3ecd6497b490fb69963cebe75ac4ba0ffe2639ffffffff090e9d66fff086634d3b41f032119589cc0891955b826f20d0299739927ddfce2d00000023220020554764b0d0ebbca8316913a88d558b32f748bd9cb1f61a8ae43872b6c7e81aedffffffff47e2c6c8c7d500645a4bce2dd97ba9d93ad1a0adead26ada80cc26cbad36ddd204000000232200203bd31369eabf23d51604c3ecf33bec208805253fb84d3eb881c2303e95dcc99cffffffff47e2c6c8c7d500645a4bce2dd97ba9d93ad1a0adead26ada80cc26cbad36ddd20f0000002322002097a26736628b9c99de627c2dc1f6c629b8ad0eb638e9abe25771de5dd8c8d64affffffff26ebfb63d0e62833a9d095faa2cd40e8229b78f4cca95f91513e926b093bdfd50000000023220020493d6e1f70fa0a0867426eaf453910bdaa4ea5cf9706d64f95ebce74a548e1dbffffffff022714f9006da53bac6d0e7f1e18ddbb4a36a723a690e08288c1847ff0c010d6040000002322002057c86aecee895df71ed1615317d79b914c86113f8d89795f02fb4cf73483844affffffff74dbc8441d80ad0cc53e09ead1717f1ff9a57bf3e3b2337c4fd6365e343c7bdc1400000023220020aaf150cb8b7c19737cede482584cd6066097a845208996d29bb8937ecb90c921fffffffffe1141bb012881f873c533e326ee5399f54ac499e97435460e3f9fc33a6eabdc0000000023220020ae58ea15550732b459577e8334a5e23a2ca62c193f4d4a59ef7f8e8696df972cffffffffc8980bd0cf35b499fb3c3b796ae9a1edb84a47f81f98938dd4d19076f41ba5dd2a000000232200201a767639c668b5605a030093f0feb15d209603e146713109a48c0cfe766465f5ffffffffb046945dd9db707dd75cf6b6cdc08f00271cc600ccc0c802a4c31944fdd650df0b0000002322002009c832b728d9a69dea82fb91c0ac08da0a8ff4ab5199d3ca4cdee667a043f8ccffffffff0437258c44981ea60b0a4ee2e246de97661101588e144f9494277826a2a1d2df0100000023220020690090b601c665c976fa5f88ab4204f3c42209a0868ca72c179a9305910a0122ffffffffcfb946ee65251267ae52ad79f9bdfee6c71accd1bf98699b258bc745039e33e005000000232200204cf30b5e0b68625dfe5fc35c03f76a4c2e63d07568915222425b721aee93589affffffffcfb946ee65251267ae52ad79f9bdfee6c71accd1bf98699b258bc745039e33e017000000232200202d05779d8cad23d86c0b67818766ee19b9c760f0c79d6b18d4b2db7d9ca70271ffffffff56a515a5b38d2133a95d81a69078af27fd048771af21da1f63ebcfcfd848d7e22300000023220020b494764b1b48ea5fd0d41148f87e25fa92056b179a1e8f2419f40693533ac616ffffffffe2e04c984929ac5df4d22fcc376331d7dc7b3bdd941da294add7121351c805e3000000002322002080f8b99b309e27747884500f6a974924d4cbd9b3bcb62759401793924a527986ffffffff0ea2ec6b4e2e0b82c66c9c8dbfc1fdae457ccd2b0db8607956a926a41d0913e30000000023220020479bffa01b2ac01e338ae99f4bd7837b675ca3a27f7cbcbc6fb3f1db63f3ac85ffffffff6125061c08519a710805d147a4078b3a6ea76fc2712d66842a74da86a5340ce40000000023220020e625cb050814f62502c69dbc6c3f684cb62f28ed0c309067c61530b81747ff9cffffffff7d987476076d692e58a6a0a7c9c8d1d8e9c6460de21e48b117cf3b84b4664ce50000000023220020b7f88d682cc467ab6032bd721bcfe6c3233f98b260991e8a314c78c803b4dca2ffffffff808977606e3c3355d01f596cd4a89962ca370d6b38c989c7fdf2c73635141ce60c00000023220020be17e268a77505111733b2d39d554392364b3a43443f808bf03807daffbc16f3ffffffff37bd19da2769fa22c50c93a8f62a96958a10650a4577240543116f55e92ed7e61f00000023220020b2b0630a2b594c2b28e4013b9eb37204fcadedb3a19c87d66c158800b67b1022ffffffff89f75c88feb08e5a86cf4a7ffdec412cb880b1c85942e87a947894501a7f46e70500000023220020ec4c5ab9f6a083c3aaaf94bdb182ffd7d001fbd53cb2d7a122ff887477f72354ffffffff5ba22708b3d89600b10c0b11376c7dafbf09ece132ef71a9cf6d5923afef1de93d00000023220020b7e9a4aa2667b1f9dce40294b046cdfe39d226b67e7d53442369b568b9e81ea6ffffffff02f30cb8521d1c816b8713555d9fee9ad0f7e34233603bd8c2ef311b0e8421e90000000023220020a3accc393084e6223ceda938b1ba54bb2877208eb1758ff3a55beee54d9b9521ffffffff7b4f4e7c0a6c73e63034a5bfeacf754721ce64b519c6eec0067c68cf36f218ea0000000023220020d7619de7a64e8c86de0e0aac743de636e5f1244fd19e3feb551ea1073c9ee508ffffffff4065d010080713c28908c926ec3ab6d33eefe40ca7ea65c27c225363647930eb0700000023220020eae4c9b87f2a7ab96a708d3c718b25ac18a527cd4c7727a72073ea0862ff7c52ffffffff4a1a3f490d6ae12ab9ee23cfd7af6361574421add45e0a097925f19ba941d2ed0000000023220020cf526c62bbb1e5b09e0a4f6ce46bf931ef35f784780e0f160ea3a8955a417c71ffffffff63de083d3dc1724ee0e9d9fb711473368c07248f87a3ed290dfc1e14c40895f03700000023220020bc3554056300c536839176556929c2afc836d3d0ee6b10402935f19169b406eefffffffffc700e5449e0acb64a086c61385cd4fd3afbc5d7b753c58aacd028681d5aa6f12100000023220020ad57d8023accd137d6c1e7691dcd128a287a3de3b3f410cebac8039ef7e0e767ffffffff567ae93a677f98cd876eb6bb568d6c47137364152ca377b8b8fccc73ea6adff100000000232200208efa02fef04683bdbacdacee647588186fc7279003b2e820a47c9675325ade01ffffffffe87a7a9a3f3c484a600b7dd11e425d89adddf57a4dc8be90b10d0a84b13356f20000000023220020e31fcff68af0fa694101f23ddc040e8cf0c369673ba626e7b0750a0b52cd87a9ffffffff7d082f234006b630826dbf1e751c0faa517525319f1f4a761b070105fa1e26f83e00000023220020987feabaff992d164ad6a711c31a29170ef84a5edcf8c0ad3bd7fbff40d96478ffffffffa101d4ce6638c9f0244dc38a0e275026cc0a65f899eb1b14d60030091e8d86f82a00000023220020c9c386b0b6dbd404c3ca686e796a38680d1795b004b8b5f79d6ef4acb5e6b89bffffffffdc83a1c514f811f43c7123b52dff7793e278a95fc00dd5404252ad9bb373dff9000000002322002022ebee624888b10e46cfe3d029170c72872ca9548301c898c1d539046717acfdffffffff2ab1d8f95d87ec58caca07c02cfa8c079e74f3e423bd964180e58f5db58bb6fa0000000023220020f7adedc7390e493b21be15643e0132204bb1e04af9961dee4f892ca10b559ff4fffffffff91712878e88b7b484c5100adb880645c355605f194b8505c40db18d011f90fb3c00000023220020960d20c7cd9be31de5cb210997d01ac3ba7a0797c3b88f3b5b02a1f7b0ba82c5ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0300000023220020fb5d415da3886a0996e5b983c870018a032b8a03515860d5f2ff63314230b1b2ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0600000023220020a457ea383886b25c2a94b0ab641de1f28485e41de03c361038ba007545ab0605ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0700000023220020a31c304de6b25a84664022eb98564b6835e0a96c8064936629053e79abb4b9beffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc0e000000232200200ba5a244e6c924dd2d5a87f1d244c01c9a28fd855bd1af7afade1890aa92f5b4ffffffff668dd0cdefc7c04896681d00b098f6e23d86468eeb5cfe7c84506833eba495fc1c00000023220020df9cf81a117c80ade7fca8a9e4a6940170f77a366da6810aea4a8ea057dbacebffffffffe25b3403a5e9a2fd2fbd9b0dd0b69f11cbf7f09dd4ca82c0ebdbf12c56190afd00000000232200207c7dcd7bb38296dcb99d5b74a4b6984e46def7af0351bc62416675cc50f9d6f7ffffffff5e011a21ea38b9ab26a95b469c886642855f398ec351a6a6e2deb39e9445c0fd000000002322002005a55204b9585ad53d921c0a21335a3b07e3b78175b49f7e6b2bd9c5c2eef4b5ffffffff0ae0ff3ea628b0f47f3937844447768ee5c0e8d4261c19f8ce4912e515fe71ff1300000023220020ea58a31a60e5cdc88b090f920ebd8c8814c81091b61f90a7f235e57cbf446377ffffffff0154e9271f0000000017a9147469df2f13bc2a355a025efd1d3cf5f77703324687040048304502210093c7b115610dee102b87c9779519a48b752dba13e8a9ddb44a58edd2bb9bef310220588a2228dce1de127de9b56b61ed6be13de9ee13f8f4c04042292504cd6e38d50147304402204e38b50649af258930d44f55a86dd1ad89aaa082c75f987ede1ef7c17fe629a00220238647caadc66f45a301c3efd9ee54f70520d9f4a73062ec5ee2102d9688fc9b0169522102d6889a12526de731a896f255bcc5a01bf5efdd2a21622355be9266bf8d1ac3eb2103f38af409b76777c26b2b5e0ae2bf6aedef0b183d4da1e2345593f5358303b33d21024a45784606525d60062d7888ef34cf3e069d75f4e3b01d0568cba8918b63db1853ae04004830450221009b32764c8980410b5566a3ed0a1919c562922377b6d023d74baaf2ef448ed2840220623008340e0451499c24a8109c6325b440b798691f254dd9cc312ce910c77590014730440220305c594347b408ab91f743b6ee18ea1ffbcfa3ecab434243d70c40dc6ad5ac54022036b90e98cc4021a597e1d6421be28a8e9f9f17a47742b256a85a46c1b3a5058f01695221028917ce240c97a81035e51e244cf9c6430d8b39036c3cc1f5d021d88329fb346621038f425f00fd1efa45523f5d52e6597466ed26996032fb071128c997e2adc69e812103986d2e8347751d88f460366db3bda460ba1e1edae427e2d75657eb21da9062d153ae0400483045022100f9bec123094868d67fd1d00d9f9fe06115de92be8346a8f0d6bd6144098b0d83022027c982cebff658c7ba0cb79a33699d7a800f45382fd3359912b9721599452fd50147304402205576aa84507d95552be855f43ae63191e6060e03ecc1647399b610fcee7737de02207aa3f85f6d42153d49d78a16b131e044c5cf97bbc26601ba1f0eb08e099549ec01695221028b2f8fde37f5cb932351ab8cad916f1667041a6f9f5074f78e3b33e1f83e318e2103ad729bb2e0fb3a71a83d6448ac03dc5e1ca62c5ae168b54251197dc3af3c25ff2102e37e6a2d0182b3b879d4136646b47cab6005be24f61592647a08d988bb4d5c6c53ae0400483045022100f742671e3b85e55de015e8c7e66176abbc3f5c3c701b91c35b5249cd7f9690f60220662f02ea50f90743a7c9f4b5aa3c052ce2e7aa354949ff2daeb40317918e579a0147304402207ef1b3bc6f210353dd286938307bb9a7e6283d8eb592ec327aa15e328ab5922a022077b776252ad6fd24c821a25eff994a05febc6762748435e4af14292fccf29f910169522102d31c22f0dae6ee9063a8c57f4424a178f3c0098589cbc013ee532e176f6f602721035e5b5ae84d21d3d23b37e2fb90f8dd4cc6aec11583991ed41cd510f9f7c9024e21033e5b857f162c6aa7d4c43316fb04fcf7ff4f6518c8cf45ccac5edd38c03170ee53ae040047304402201bc6e596cea44cb3c78529832a092beedf89ef8f0696457f739f821a80325d7b02204cfd54af065b21ba20cf32971699ce08f1d95648b34a4d9f06ff42a77dbb47f20147304402200a93cacfd102f0dfc3d564105de089e2e808473972e29c0637edef4a43b2eacf02205223c7d7beb591852aa38f7309139804137df2b8bd3a75fda931664e1d9eb8c20169522102c6efd1bd12c298c6f59b6d05694ce13511a6d32e87c6f662b84090da6187dd832103772e58212d30a1951d71af13494d226914cf270853029dc60b36fbee8f095b4121027e1a39a2962aadc45f9b33ea54af8c1c1752bebcb0cb2ab0b15ba4d0b4400c7b53ae0400473044022066f0a55f52409ac7a419e9e5c2714056d328186b658b2f3c3792f1ee7630e88f02202e85da1280290a30f1aae2474aaef6c5b1e4fe10822f47f18c47d87c354c5e7a0147304402206c0bd5b96880255bbaae3708826601ff1f7ae88a4d85448b9fcb547ceefecfb602201172e2c67d63bb80ebb94c5e1852a7bbec8d9bb38d29700e0af73639f3f5cdd10169522103d8ef22208a80ec1d2d31c0c700c022ab8b2ec595ff417dd8b1d76085000cb6fa2103a65bfa31571954b93c3aa91986dbae31aa7f63d060f39b3fb9a4d6c0ffe27aec2102eda0042f4dd6635a0525fd3723525a1026ca91e9f67c1be488bcef822f234beb53ae040047304402206de562b270a3ef8abbcfc38445dce0869b8d2a41560fdc71d06a457ed2672dae02207746c109d4a7457830f0c573dc0a8d70a6ffb5cb1705ff8d3b2a1a690ddce5910147304402207b668807ca33e17fc8a818ec478e07b9881df2c36183c9bf8cee8d103623f1cd0220166006193e151a27224befac3cad619dc889b87eb3160072e39737f1467f3b6c0169522102d66b34d291ec4d83bc7557d4db9561b4802605f910ca3b3318d990d11271c6cd210204e7fc8731323239646bcd13aafa853cc56140e6dd769f90d9d3e77555079aa22103df61f7026c774bc482559d7738203800a55ce4a5a2176542b9c6f4782bb815ea53ae0400483045022100f5032707906668ca8da6f84b1ef4bbaf998a0c27640c408e72a6b4656f5fb9b6022045c783507a565b39eb2df90b6c7b51c7a731afa9067213eafa774a2c4afc7240014730440220659d377dee3d3a5062367dbb92551dc9d2a466985088de9c58408ea488463b2a022056a6ef52734128a7ca2482fec58a21604fd2139e0a7686a01968ac200b28de540169522102d3e8fb48c4b873540cf202c4ca249a2832515ea0cd9c1e4c6aeabd98a0582e8c2103e0bbe49a0fa84d1cb908b7c58797903c248fc642cb517c6e9c5cb5eaae28239a21020ba03fe96d937729bd7da7af6031b06879f072c4bcb9b4c5276199407e200c0453ae0400483045022100fa2f91988961db2bd0179e56894ec99a16d2531ce4229cfc486da8e6248ee6de022053a6b2a322fcc5b957f9d9868bf580d1327af07b64012cce43da0c9dc36862ef01473044022034d58798d6ead6d035f451178caa63f1de7e56fc9308732023388a545f93575a022056957531bc8a1a57cb3216b421215796b0978eded266b7fac53e41477d31c6bb01695221037325c7ab5e93dccc8a5a851771d275c2d1e666209f7caab4eead453b7e88aa3f210259391976b5218e69f19f99938c72c161877a32828c8a7ebdc972c67fb6030c6b21024c758a401fc680fd585a2e5768edd19c1b6c9af9401fa4667bdb2e675e96db8b53ae0400473044022047d5edfd9de293d2e221987cd6102def1d6f4bfc22b9abada0066d702b63ffbf0220798d2615198a7abf498b32f8436d8f5f89c405308e238539030b5d7b37bdd01c01473044022023cd9869c725f00f27fa369827fcfc713835e04fb3cc93ad3437ba893469fd4602204809152cd398f994fed62eff1ab6459d2be2821fffeb316492f6df60a0e697c50169522103b18e39acaf107e63607ac0f09ee96e1657a93f52a2015e4a13c08d42201995b921023ccdd627fa57bd1a34659063bf6dbb9c3d731782d0f4bf985ba56106edbb51812102b34cca66bd5c6da1e9d9ed0b961d639447fa7d0cf42cf6f64bafce4cc1ea822753ae04004730440220160bab0816980a795e7bff5f8f54667a7e98767bae9e36d78f488ede00502a0c02201d485ad8f6dbb69bc0daf101929d6d125f130afb9e2e04b25613eb2f98031bde01473044022075632abb9ada03841c9942ab4749f31abdc5f6775c185499f2d887f479a8763702203190042e24a7a11fa8bda9dbf7d90d024353b5426517703f3bc9cf29b455410e016952210280be7b58c0f872d49a67f4a54ddfa2d21156393a3d2cbdba99305631509f585d21037df16b91196aeba4e08bae79910bc64335aed1cde29bd6fcade4336fb7cff6162103ae27bf3bc4175fada0808a79c38c6a0f650d29ad57476b6c34ba0b216ab1e35253ae0400483045022100e71bb10d94dc96122bc562982aa28a308bb583babe7e00cf83ce32002ccdc7a802202ac38caa212db5c0c8ce20b75bbabe9ada1664aa5c334be19010dcef9cfa1061014730440220260c77a95138fe1609f608810638912a22354187c6e996f257b290e9035fd9d402203564ff63d5d4ac53200536f9a7341d4b0694f6adccd99c7062ad815496cfa82001695221035d170caa40820ce27e2bb1200862117ee2828d01fa3740ad80cb7d1daf511b692103271c4ff689e18d92c23ed0be95148e2760ba843743e1caea1040cead3bdb3f04210304a79aacbf282fd6b73ab4245253ebf347a07165885b38ae8833dcbca8244b5f53ae0400473044022025a5568281ca3a9059a22ead7d48f57d7643f20811ce8aca057dee51f72d1fe402202b7c01c412566266b9a2f5084619ad74b5cf54c6a1fa2104ecff1a358f4c8bf9014730440220786ee5a5b77fe77f91c648e1ca8a6a5a5414268f0eaa741fd0b37f258fe4c8b302205d86a5821aa269f92848d9c0ec7f9261cdf2d8e5cb979350e7ea718d3408c6a5016952210333cbe8af83bf4a7e5ddc38e0896f7cfb4ba83b1298847a5e98c990d01071a33521027f82501198617429d891b200040b0a2eda1753755585769e0034f81d1fce082e2102e88c0a7dcd1b6bb380bf6dc1a6d64512ee1b1cfeb1d698d2edbc60928fbf7b4253ae0400483045022100e0b771b07a1e19e022c9fac718dd247358b91e1763868502a9060579b7099fb202207d821fee7845deffa3e098afb6d0814f37cb59a0fa1362cbd38922ca4ade345b014730440220436d26291a57077f3205539a36310122cb97aa0a7e22fcf9bd166db01118524b022075f003d0cc024edd57afc919d4187f878bd6f0a92fb7e6515877a55470bfbea6016952210297c0af9bae32a55c41ad225092cc50745f63f38500d3fbf9368336ff3815d5592102a80c83b31a8a1c5aeb1c55da5f14a1836e3f79e44e87cd2dee331fe77766f8e7210275b758834b8be06aed58e67a22a4ad4b6c39747f0a0dcefbcbb587e045925f1653ae040047304402201426f0e47a92b1c967152689ce3afac5ed274f2088274a7452d09a29201e78d902205cedaa0c8598b87c28f18a3a02fdd5f937e413392425eb713b93b51fdc2101e9014730440220260853bcda7f89394493c542445fc1cedf3191da430c20e708e63de2f30ae34602200513fe426b5dce38597a5004863e1be96cebb8aed48ff7a9e5f1fcd560dcd6b201695221034ad8a18840f2db9d741c11d0bbb6ab0a44397e81642a9f5522c0a64f07a5be0621022f1ea81f851fdbeae58a9f3cd8bb95f93c34fb08498d6aecd91456cbe29b57c32103821b1777e91ae18f8262c5a9928cc204c98f04abb47cc124ce1825ec02f543d253ae0400483045022100dff652bf7c6fdd343cdab02942aae8895a8aae77374b9ff8a66076bda229d1f40220602dd54ca60508c4fe1f30a5016d05628272857a30f72432bf39f51d5b593469014730440220669412e5b53275a2fb93deac735cd6950152238956d878f10c0a4dc9ec905918022057d7a2ad909e18f3985183e29010e1c9f868abd334a88b1790ab99580c0145ac016952210333a56b171f266a57d25f4cabf8c75d762a70f2e70c43bf848eafd61be12259702102c6ed0e7cea12d9c0a569b99ec7971b359bb20b9f787eb5c8efc0f9c1c51b87092102311d2c8f4e136db32ffd291dec2561c47223ff9186aa24ce5b65db70329b51fa53ae0400473044022071e7e2943c5229160460314f032762d04d33bb8f810238c3da369b2a0a7173d4022018ea90dd7904e6ff8788e5e160798e62e267e6686f9b735e763fccf628e0c6a60147304402203d84d604f9b1a1243119b9dc0417b2e591b8f4db8a6cfd3d2d8106b2f34d3d6902201d1464ac8379a0b4ae8960eee647c8ae8dea7170b5778c545b8e9a068f60f555016952210320a65d5abdc7748fdb643d10f003818995e77602bb31734fd0c554e6d959c80c21032724cabb3379cdef15a6af883d1eeb2c6db7502b3dbad48dd8b33f56a6e2c5b121030aedd834e928a69d5fe2256af43187ac13dfbc307ac1d928c11dc7d8adb3787953ae0400483045022100db0be04abc2f9d41779a7117a514d4c6923328e22606db16360240793e8b501d02204fdeeb4c6505bcfb5d313fa7e99e3aea5cf1cd13de2cf7201636a37976b8d9060147304402201c32da8ff5a116a0db53348795900ab26a5a88ad2773e77ac63581b13b37994102207848d8c42e8abe4305b5a713028e2175359f4e0b53071232cb49a4a0b443557f016952210279b4dc85803c98e9adfb1ac5b6a6a7f71c837459256921f1e3b9d2dd6a27bcf421027ab68a7b5c062753532f6e24312a24b8ebff785c5520649885b077b54f34c8fd2103f4a8b483e62b9f06057d4236defbe4b3ebcdd999b6310fbc21ff57adcc0acb0253ae0400483045022100aba882d6e703336e209a769c9ac5abd5a5e689677a63e61f4d378db2bcc4d023022057a235c2184d5d7faffdfdcdf3a4b85335baa20a14b741b842481659b672e3820147304402206aea3ad808a2932505a9a2ef1e8474e8abdc49ea800b6e74aba99f8eb2b9f06b0220008e4f359031f184dec6b54e31c8b5f48e9895eb999f2e11223e86420b00511d0169522103917544da8fb60f788096d8c228fe695dab82f6bbef3d6b0d31e4fe57f03b29a221029333562f2293b0c351c88debf80e3b054bfa400f0383aa0fc23b57d8629440932102e1d92e5520f44ca37fa3fac1fa3ca4aed6a1634cdc8db32f51fc12c207b4faf653ae040048304502210080a0ec3b28ba3b91b59bff24413b4fc3291a13cf0a23e51740f007aaa4b77ea0022060e51a453ea320de15b1bbd0f61c9708d5a88711f3959217977bcb2cf6dfb32001473044022065781a367b792877fa94b6e92fe41771a0d3c0531d43820540e19549a6dbd6150220034b86489d9ebc0dfcb84e5bb709ed224cbc507d7020baf8a1571ae88e9cd8c10169522102705f5cb523e4b49c2cfa8bb05b06676055e0490ba46a8a0887c7b4f8ca9d7746210381d22776c556485798a766f98a2133cdd6b52ad7069e91a9a868beeab5e06f132102c2fe7e342fe7120f49eb5b036b25bc3ff7ad8f88b2762df796b4e2d4184f6efb53ae040047304402202fb03b4c71abcf774a71e396a4f5dfa144a878c04ca2336613504b604ee04b01022013e08ae9b9d8a750581bc681c8c157f2238c2913dce28d29b952bc8affaecfd6014730440220648aff956a4e1d926e7b4e04cdf4e124d8516259086f25c36a9875648c7e2975022036df258f6ae844fcdc808df822f9a48c0b80b068f6f89f9e84f5950663a026f60169522103cb7b408d8d8ba7ffa27508a8084b17e0e0059ddf6ce7e953c8ba45a07567ed5621021f44e5209087e37f774c0721dfac267b59576a7d6c92fe2da311f32469e5cb82210364d2ca8ca6e3e9be08f1eb0683d953f37c672a7352369fc45e1727f98b7a3a9853ae0400483045022100b7ba3fc85b2e34033079cdbbe3df2d79294439cbb3d9e9b8fdff2caa42f515a9022015b3b54343a489ac4bcff16d0a3c5cba7113c22e9b7a1c425ef7404c437fe9f101473044022050396dc21c05cd10860a1b60d9dc71d10a4c41f53191e8b5b3d3f3aaba3f91e8022070812db7a9b9fb54e6ce2e7abaa4a3ba40cc2ae5fb81129db9214e18de0f05410169522102e4ad11c5ffb2b47f43ee9cb0358489ceb33a5617dcb660e9a3ce1d79184805ab21020e60e34d13734138f1649225564e010cf181c2e16b8ffe759482ffd7d33602992102c6b593fb1c891f934f694f9ddaa32189bf58c09272c47db03c2470b15957d7ce53ae040047304402202dc18ea1622e0a47e2a145ea5e77566050d8af7c5a49fcd3d672a5796933f3b402207d9981345289b41c0968cc27bc80192c94892327541e15915d84be4d1b9b2a3d0147304402200ef4571c0af86990630ffe9b1d8e1ce37e9acc275eb7f0ced9574186048f3ee40220723f566718ddd9b90b5220aa36212efc3be2ee8985bcaca985ba460328a33649016952210284c04e6c863e25ec02242732d8a1550625ff0f19b235742e7cbe9a551ee8af3c210285a4d29c6006418693c76247cbc6a1e8aa055bd44abc57a2396b5aaf5259d8cd2103f8795067f093d5f39aad44d6aafa1fb71efd7ae3cea562978fff130c138c8f2453ae04004730440220476d6a99909fd6c37b59a749c6b1b1c46d8115c2b6bd566215e60bfa8aa776ed02203beb0cc7ed8068c0fb24bae0c69f01efac4b31c532ca0cbe00ef9aad8fd04e4c01473044022003532973958f90a97a37071ff442175187c4b6d973e8bb1bbdadb0414f6e65fa022015649dadd893a9ccce1c5615f8f27cccdba63ace4ba61d8039805afe6823fe74016952210218f4f527db128c5a10b2467f02dd0c11531a159fa26cc8e3f4c405b8dd1f68ed2102409b46c590ee93f68316723e96a25e0265bdf222d50858acb866c85c5dd28078210302f6bf94b6d803f6d14814d8d9235142c2e19fe42f165784a322f7e6ebca060053ae0400483045022100a836c67344d62ca10c7aa77c3851d7625bab6da31288d58d47ab7416c1f399ae02205ed092fc58b3c1a79b7220fa051b847088eb6ea10b8b664a65f29f0580e094d401473044022015b4d04b9174f2724a241e57c190c0b6f8dc9d1cd0efdb8fc8a4b4d2de035a2c02201fc3085aa376cd4d434b8cfe443bb99624f926d15d2c1b3b5533400b962d70940169522102d69fd5517509aaec54a384c0ee12cc2049c0612acd5cfb4ae5d2a5c6bef44a83210286bd4e76c98ba33445a16217f2f5206d63fe112d18814e19646dec72ba6eadba2102642ae9509f87b8af4dba23a9a10026bc74b0348e64dab46ae782591a3b612c8253ae040047304402207d64ac5a3ddbb9c50fe40cfdc2cb6f4d3126492f1d88bae63cae55be78b2e953022005fe9ceed090bcc87040d686ffd97b49bf49b0a6992baa24c51c924da09335ad01473044022034e9748c3ac7a639c8a79603155a6921a1be48df916cefc32cc43018195f41e802202ce473229e3e9166603b10390bac030f08cd2f55d318a57aa167b871ddbe2dfd0169522102df8a875805f8c21ddaca3760a3d3e1059d22f6e744a1bbaca56fe02a900181a92102a7b4b1e9f3ba520a8bdcea7f2420a45b4289441daef0022f92dcd79c205cb1a021020c73c87fd45eb6a3244767700b8302c815014705f09596015854f2026efbf99053ae0400483045022100b495319ce3a55c1eb4c3ada0e3668773c3dd5b56c23d87a2a844238ed9508d70022051b9415128f1c64a00ab80a364d605782eb198f4bd1dbd4c71eadcafe69ab516014730440220248a7aa947de43134c6e6e4af036467594685771941ca3df038a3086446568a30220247156225a2a9acfd2265f2d0a1369d67a8fb28003b8503d10fc67a9353221ad016952210339c3542fe9cfc2e75b1ea0dc3f5581fdbcfe6f12cb8c23bfce721bc60c8269cd2102c0b19d86c6618d942d14cbb90cbda83ca427449b8a2cea7a64a343cb6cb2a74821020f988b6ac4a3fbc37c341cf23e89da08cc04e031eaee0626c4d8332e3004996053ae0400473044022048b7edae9670f5dcfd15f633dd1fa7378cc0c82a1cf7f4e35340b9460278eaf8022014a966f53537dfd069764868ab0a70b39bfc591f1020e28dbf809cc568447f690147304402200e4a4186e3c4ff65dd9a89696996a6b33634d9f2133cd42d67e5423a16900ce902200ca9d4a3d2de16d5b4705fb394841b167895c08d04964d6a2fb8a46e4b5b0d39016952210221d15c0705b3642819184e1553c936ae47155b1900f96981f8857ffb79eaa7922102bc27c87580949e0a4c312826df20727c71c28b61725f167fae877e87cabaeae62103e8fe24f54b55117ff86b6c0951fdadcdcc5df5703e742dde6cb2610c214741a353ae0400483045022100842f10932876703fd6e0b05b5b389771bf0d4e4d47d1732daa872722a0c80fae02207b276b9cef3ea87472466121d23ee4e9f62fd9375e808ff8c6b67030523dfffe014730440220315d42b2102c31dd51640b03e2ae30e01a66e8631e42d743fd4b0cf4aae467eb02200ce683dc03439ecfeed3338b84a6da235b20dbda224006aa32a017f00d5aebcd0169522102437f25d7d929bb00391a82b9e696d811e6d57a9c4410274db29f98c575060cd12103151ea3f1fdccf535ce3b91e002c5d8316520ec2f6d02a091ff8f9c8370bd3571210391cb580a7b49590683b99aed101a585d575fbd37ed0aab4a30362959fd4f3d3153ae04004730440220402dc4fa9487f99e47faa0793aea8d0849de43b52948095cbbf9d8dd3b263af6022066e7119ba6db5d078fa2fd9f1e87937d6cc024d1a08e165c1d9a7c6fb8a633c10147304402205aaeb6f823045cdcf26f43ea27c468a9781e46ccbd2ed60437e54dcf0949b5b902202f713be95f9b51bc9dc2ffe70fc37453429ae7fab2f96364686fcca0b4fcae6a0169522103ccaf415728a12dc0ed3aa41e2b22d41d4a8cb3ff7748c00fda2d0a5777bddf862103226c606f4d0b9ac30cd2bed64dc9bda557eae0670a0e1980923b44a02256c04221022b75f9e140b4a87090e83cce620db11bc2ed1cfb3175e3ba93e05b40d8f48fc753ae040047304402202f6cb0088a0943a3c2724bb14b431bb8f854fa304c16b995394eb83a8abaec90022047b6f575a31b5329c40b1e95d19f1d212d2a5f99d2727d3bb2fde09a3f1300290147304402207ea2e32163172eeb60b4390ebe2fd7045f8cd5538e5d02e60c42ba1c8d6e01380220236622156d152cf085231c0d938daa4d8ec04647e9a7451610185829b99bb60b0169522103cd6d4b880564509b572370b09233d73616ef75dbf77e6258478c318775ec5bdb2103dadb083536d6423ef6de50e728368de8343e931871e85cfdf91174a516aaca1e21026c74b19e3e2627b4241de83a80536ad62aed0b44484058b89ae3d2607cca6f2a53ae0400473044022076db24c8d6847093e7b6940d428fc6e0711e4b171f6fc4c37d4e339fab23a1ff02206943e452b99af396b4f656ccf4fe8f3d04149253f68021954bea03ce29d6db05014730440220708eff970928efcab957bca4f0c5274f406d8c078a4f1951cd76eec3773ba06702205d78e115c5e0bbb111319a630c393437d57a33149fcb9db2c154c5c375fc0a3901695221026b75d44ec5f606c54141118055d6be7fcefad271099e49839a432f5b99b2ad832103b53f56b0fe35f04bbb0a8c83c0d3bd7deb414a43bcb9c3b96a8690f629cb0385210223df74006263ca460a77a225d91bc539688c13a55473a89972a0bd57fe76e19053ae0400483045022100e2cfabc6341ca623fb130f477d63b229ce9f17ddc2eb480052938b474c62bd91022055c8a75f922a9ffc0bc4c93a41688db08309edb61a81308db3ff28fd6687c457014730440220653053c1edd1fa576df82b8c202e7026393fe80a757ed0e9ff90f38e64b3872602203535ba71046afb75c7ba8898e9a4efcd1a55d86649aa9c4d08faedcdd40f975a01695221032039ae4ea660ee78c2b9a6c2e3fa4d4ad19960ae1d377a8f6cc4092ebe39a2a321033626164a4ad593c9fd1f1f30ed2186b3391a7dde4fc488e8a70db02437dac8162102944d6dd69f574b42d3f795b01328f5a53f90accb93b0f07cde29ba69b1edf4f053ae040047304402204fc3174730d28a4f23252d4005e82db1a28676cdd4551aeb73332fec57c19f530220559136bcacd5c2a455878adc1896c45070a935c9347a7fcfcfe126f5e6d519df01473044022064010c6219c262bfe9c1cf972b14ea3fac0dbb64f136af8f6a24a6895e74c64d022044ae6eba48915a0f443f08946cef42e6782d0f146ab3921986cb515db6f426340169522102b730feb053380f812ed14258a14c829568b5132b7fe04209f127e86a53b7021b2103db3cd845d0933ab3bcdb1a003875202e98fe2154164d74a37ad18d06420b471b21021273a5de09c6b4b0930f1b9de387e926de0627bca7b5cde5bd806af7d7a089d053ae040047304402202124a092d84402719755152e4c38241f249ff95173d33748f43829f40354b298022065898e3044f36daaeda186bde91baea9912db565f01fd7e4f0ba2ace7e70804c0147304402202bd2fb57b5f008a94955d6b3b1166055d8a10746942eaec856d83c5c1ada264902201fec0930208ca6ae72c293e6e707ec074559b7fd1c51dba9f9739b12cd1a6e4b0169522102e3466eaf7ff31b4bea33e1072923f267ef5bf8a95d72b6f858a72d91f235cf3d210288b09c49a8f1dd9d302e639be10872e40d75f75f022932655951f23d25518f8a210231e4c16a097069948403f0c49c28b14d872da96155cab52a5a5250a1d890063153ae040047304402201924ad107179beff2a478537bc3accb0f89e1b4305a411eec159687e5452c98102201ccc3218a6b0ceca43cb8fb83080cf8b86234ba897da8bc656f365e24692796d01473044022060b3c294a6c6c44de379ed87f9fefe26a6137bf28b4d0c4f092d405d150ab58402206749fa0d21330e48e6bf4a1ec65516f9c3fbd9d63d9790bff223919f4695581e01695221025343c8ec6cb5a5d0a988037e789e162ed539514c0550af37d7fe9b80b0dd5a4c2103c205bf5cf7c07e656de7d350cdd9f7ef205a8cb083074dcd387bc6dd7daf907b2103065fd56e970a9b187c475711d587283fb54053e6b6a17197a883fdc709db03de53ae04004730440220416fd76df3a101ef4424be4b70a2bd0f1a10f260bd862613e0d50f620bee91a002207c57cf8e9caef69022de6fad375f9ee1e0f13dd0b553aaba47f60e47a1e61ace01473044022021d516c6b9356c6dafd0688d122119383c792fd8a81d50ad83a47c409d7ab0ab022057f57f6ea23bb638c16218807369ebd84ee53fb95e067d8918ce88acd3de3ca60169522102d78451624e59866be19ab57401089bc1fc548e91b7f4fd8854b7836cf4a6251c210382ef500974b8cf9309bacb50aa9d93807c10a3efbb0feb5d91681955ba3d903121022e743a2e0903b51abaab2438a6b62378c52e1b71d24711e9d0d1225db7ce7c5853ae04004730440220481e28fdff4c34d50da3c7c41922d07f2daba341b28ac5257c3a8da43977d9a9022035c1766417f70e62e922ea63c687fe111da818fe497d8ea9976fe608da32479a0147304402203641ff5df7ad9e78e4de2f1e52a8ad8d89c587d9b5cdd1667d13263761648fa802201617b248de65db9ffdf4f62818df3e2b7194a3ace3d60375df4e6974735abd66016952210305afb29920ae6ea8ce5f6f9d1d3672e74a98d428b2a5580039167b8d78ce5ec321023cf23191b8fe6a58b683ce2d3339196ef8ac80e6b0d3c49809c3589345389b8821027d8befdc6066d39de831b1f437190f5333191bc00345acd30c122bcf61d2445853ae0400483045022100b0d93d88dca3c219aba6bbe046b4aa2c6bfcacad556923445a68ed90b6f8c15c022009b650f194e2e73ee7c97ef06e1a1d03190d48669c35ad0fbcf2accace2b2d0a014730440220262faa46bdf0f26ab24a4d7b7fd1f652646ee711785948af3db1e221b2661baf0220306bb56e01dcb8a1123a4dd8be98d69feab42bc5ba731ff2099539d12922136d01695221038f99c55e18df4668751495d4e920fd81c82c2ab3a6acba35833b93f9ed4000fe2102c7545d5368a1a623ab465e1bc4eaa486671fd56150434cad1b97bef5a344ec612103aaf0a0da0d5753f3f9228b47b2b5c6e0025300ef8f5cb0433d8129f51728d73c53ae0400483045022100811f8dd0852d6f46349a0d466f2adf7d76e1d75f78c0c787505a46f73f59f09402206b766abdded18b112d0f8b01bee4af28dcdea76fb379e7fb83a0d9f0beabf4a20147304402200fab669c90f3e5fd9d36393da2eeb1c0f807d1ce7089702f369423548756e5ce022019928010b3ba87cce7398b18f7e4baeb235582e4a1825148039dc0da73bd50d7016952210246dd225c66b7d804186e231ac7e211a0d2147cfe0b28e61f7c15d4b4391c61e421037a6803e7f0e1cc802ec5fa49927bea60b4a3a0840be058ceea46e3375370516521028e7bcfbfada263098f5a9d7078734ef7d9dc65f74908f503f381153a9de0387553ae0400473044022076a11290fa8f85074d64616f7a737a18a60a5d5276aeedfa11adb92832d11312022014515d9d5eb04bbbbd3c51842d689198783ff9b4510a8f365f83aabfe01029020147304402206a40d9aeab4abfe4687b8e8ef62a1dea58bc9fc71a4f240428081c343def15500220631b08416e22ab62ec0be5fb43c804d1c4d4f1051036c7837717169c3abe9a8101695221038b7d1a4f548b00fe414e5462fe30cb7ca09f4042ef12aae1fad9312023ad8db6210292f5cadafc1f3a535cc334fd409ae0a8d552bee1207838de08a23175c738e4bd2103abed38527c905a81dea2d1d27253e546db531ab8c75a0301adce5517c869d76e53ae040048304502210085be288412879c6c099ca07f6a705a9c5d2ce89e3fcb2afe2298687e9122da1e022034ecc6bc5baf9888840cb779c0c8d21ade85965d1615a3013bb1dc55315a3a3501473044022001ba9b768607811f9d7747c46825e505ed99dba0ed17d53dd4bfbc4ea43fc8d0022065db603ce92bcb6b5c3e795ed9a112d5b56e722aa8762ac19af990c5226ad33301695221033711edeff7885f99c03f5efcdec35256c9804e9c6a3270904925848d7c9094e521021b34488093faec0d2ccf059dee98c1c7e07ff83ef3453c4da6862c7819609fa32102a3ed6433088a7a107006cb4f81c3063481c1eaa839e571e8721ac9d38eed226253ae04004730440220483ace0b70db2702148f9b269f2e879cfa5757bc7f22d828eb24d357cb55755402200e8145ee2e479d8b6e47a68ca69293e4ecf7acbbc9a304f0a86bec84da8e0ec901473044022043553013642fe9467001f630d92eb586f6161568939a26ad1c770033efc5822002205ffd363c7d19cf0e3ded2a1d24b149965ddc6589a1438a7230251b4998c77be301695221028c3bf81f7f852114f4c7dc9e30ec4a20dc980ac2094af304f3f22a0ae971fa6e21030c1a0ed34bf82dfe774118af4ee8a93e2c6c44b1f90a69494cb1c2b90cb5c9ce2103aa4900cbaeeca06e5ee59e73e668eb898e16b97e3e2b65beeed7d6d7f7d9503853ae040047304402207fbc67c4fe70eff11449aad4a19b527ec75518d7e38b45279a0fd185e3e3ac6f02201c345d197c136faa4d2a6cbe68fbda523138e9396aa1eabbd7c6918e80d55c900147304402204320de0762618ff69c90955f22266ca2b77af6803a3a8bb6e9b4d5ae44a7d6b6022054b31849194b75cf91d0119bb1570bc3c8dd44adf4dbb67617b10daee4c2d1b0016952210376a75758879754d7776a4ac273ba851bd613995d1bbf673a19873a95a8b10c2221023fd2e2c77dfd6b668ed9f667078f1e0f8fe9375b1cde093aec1ef23b1f032a342102adeed9fc5ab1194c131fcd658545e6d284ee99607201fa68189ad5fe7b361d1453ae0400483045022100cc3435b936a3362e4c25b08bd96c9c18546b0e022f3010b39fde3d8ed66f54ab0220605512caea92d87a47fee7aaff28a112e62844f188d103edd1e3ab265361fa91014730440220336c9e20a501b494e4c7589492a1d84dcec7c051cd7b0c3043a8adff617f6ee90220427f0802c404f65f889d32eaf153742ad538b19f7dbe41def9c06470339e97e101695221025b554ee6a7bebddf9c8c33df86abd6bde2a3ed09962ab61301ad44cf7ad6bad621031bb9ce1f3948bc60c3cb17f94f5397bc811162772cd709ed7757d6f87770763b21030fc4aa5a56940f8615913580856319896ead22b3385dc2b609066b1926df58f753ae040047304402207a79ea69c90459e9d872b7a358421e350ca18d04e443b9fde6a37cffdacedeb8022024cfff3d398948d500801c4cfba683cbf7a06b9d8218dccc6aeabb377621471c0147304402204310734fdfd0c4a6689e87a53fbc6ec3f350871eecfebf05f1f3b001d4b094eb022064061ee83c67303b6367cdf75577a1a2882d67c42d320592422baf8433c4cebf0169522103794a5efad74408eca6e21227f809cf5c6591ae85162ed02e55a7d262cce0379b210313a1e65db629c230bb0bdd62179517c08d05e843b1163f02df0acb3adfc3521e2102e1a4c0b8828e8cf7b91be5c054d899f6c5caea250ace1107fb27f145ec3d46ec53ae040047304402206b1fbbc3c739e203366fc62bb71bf474df81f7c9ea0fe945eb967ac0cbf12230022036a7591d86bba551315c2995ef0fea270f7d31add9ca6105a9d28ef9cf7a257d014730440220330aa6e2f14b664d690c8f38e96a9eb48b1f88d68ed272c044a5f34ba7a17f82022048695605a7ac8cb4e4165e956f8eadd44016c090f9a873c2244e41a4b8983c3a0169522102f3c323ede7ac3590716b9e0a31db6242abdee2682454500321137fdfc3ac41cc210296df5367d694671221b91a176802fdc1a2f5f7961d13f18e1f89a7a0536cc09e2103fc3762fb3c6aeec3673b261bac0c2465ce358adf80aaa6157d4bf44071f62e7653ae040047304402203b8e07b60f256fd2781dd8d855ac03287b1c48fec45c6717f6d6c4efeffe4607022075098778e902f07a158e10f9d500013bde7027043f67afca5c44d14aeabcccc10147304402203d53c6987a0a432a49ae6a80d8c03b958b8332915c290d56d868fe2ca08dfd2a022024813020479fc9ef5c583fd6fafe417096d2b59fc47d56f29f4e59eb8dcd850f0169522102f98f89d04d44a7e2f41ced4762ce6fa85ab2fc0672658b0ba56590679c49629d2102c25e20e4ebbcc97fbb817dafae30ef161e9cff70d296e7acda1b4e917772fab0210388f36cfb483227b8001fc94710f5850e9754aac2b079f01b55f1578245cf5ce053ae04004730440220622c536774d5dffd98dbdc4419c9a65346e83d15b04dd9fbd19ceb81c583448d0220400dc95951c9ae9f8ffc9b7907ad84131cd35f680e5bcefebe8e93160acd9d540147304402205de830d048f50df6eb5e4e9d3a7b8e5310df7c62b5f0fe54a22e7cc251b23dd602204f0adc8ea26f89f850e04954a3ec686cf93803a3d02ccce95adee37fc9d8563101695221028d1970590d94f9703dc2dec246bebf66b8dd3f01bdf1d4902ee641913d7d479421024e9f1ade19c632885683862c31cac4b886b2df2c3d9f41f678b44b876ed20f1621036ca34bc834b78c65798e5639be88d4edd164e7b3adef0b0b37ff4a44b6ba2b9153ae040047304402207fea228b62a10ecd2a767bf1f5623657b99eb086ba4f6aea8b2691b6c08207400220755050dd23f7d9eb9f7a94a0986eb14d1666f213a530c1a7c1af3f761a37a6400147304402201bc5165179303f9c4aece1f393c040758954659c9fdac64d905db751f9b4f77102205e08172c787edb67d844c943bb23b5d3dbbaf63338c575f7cadbcfef2c87d86901695221021acc675534a946a71dee712db4c858831af257502b9c229d9cbf287df623db912102b53b4eacfcf3e2559f17f4d25151b05f42877475c35a1cb6b47a10a739ec958d21023e44d69aac2ae055d32ba1e2d10476787916870d0c1b710cad1008be4d717b4653ae04004730440220447f468daa08dee75e4eafa50c6e5c530d5ec7acf0b6e47cef37176280d9b1c402204431db6612f56cbb2ab82143bb327e2823f9dc76b1d3ee3c85139b243c279d4401473044022076b46f1a90ce09f5d02ad8fc2a9250a49ab90eac617d2b7cb73e9505d76a4c460220577afcbf2e82e5b106fb625e308c2d6aecb2b1561d1e44f751e05192d3132a5e01695221037e1503cf8131136d3a91b16b8eb608aeed804a3c2262a3529b8126653ad66ea4210397ea401633daec4745b822e889ac004f585f7fab2ffaa8962930b015363a65c9210231444bfd7256c7a30c1fd9f534eecd3fa3b417677cc482ce45a7cdd256db5f7553ae0400483045022100febbeb9b046d95b58b454e031ba6b5723dac768a5f5b07a4e182ce406581517b02200b6155fea0a041a915aff90c1aa9a2244e58d30bcfd4b4cf715cf4c51f8c60020147304402207bb15cd08ffd9836219285851ab791dc3d2db6c18f674a9953086ecbb66fd49d022062876fe00da56de7ce089dac6a118daa521bec29bd7137e61d5a93bea774baf3016952210203dd5f39cb3820f039a1050094f6e3c243bdbf6187c01b9f3911c1096d2e47882103d7c0642e00298e6b73feb7830bb1efd811deed7d7f7809edb80126d1b786ad4c2102faea4b881f978a5b7b6f41177bdac658df710951bedaf7ac9ea36816e54cb68153ae040047304402202626a9fff9c58653696e3d764f4386fc426d49a9a07e97310244d4b78d43cf8a022060e44bbf31b7b423444be180474182bfcc5d6c856060daa48e8bd20baf308c5f0147304402207652c104b27324b65597061d2fcb2f8f890084a9129cf0a68803f36607ef543c0220532b48f80ef10e1ca0c787ca9a35fdeff78c4748dc35ac66ca2064965954d043016952210297af2acca67971319210ac0b99bafbd43510491244a98fecce91777f6c34dec221035114518e33b7e47d736443001838face1ad7bc899249dd25848aed0dbb460b092102c69e871ce0f9fe67474a710cd7504c5b3e88af17644720bee6138eb5e609282553ae0400473044022039b499a173b7fb3a8ed80eafa84a0c4e1c2b34bece05e548cafd23675709721202203adb8e8c42ad6295c089c6c48e9e41ae05d23ebabac220831a8e66f4bc714afc0147304402202dabcbf7437081d447595b45b8aacb9bfd3b85a5741cb1358a936d758c10eee602203328e397166de6f0293ed45582b6bd74dbb73b10ee99117d9bcfa513effeb5070169522103efe6acae6017e4431e7ba22e047e0e2203759b764d79205041852e04910287f0210324ab84bdd343f36ad6581e975631f8a8b187855a6b041a645844765cbf0e80b821031b4f932ca596c21d84781243a1a56fb6984beb3f562ce6932df50d6b61a9b8e053ae0400473044022077cdb438431d07657eb830ed1c475b688db7f7d1a1ca5ca4d69ff30bdfa0e36202202b220a0bb5e7878cf9df37b9540ab938856d247ea3d81874687e8b15e2b15fce0147304402203eb6ac64f3b9bf9351830bff01d14a2f650594b310c56998ba20e4b3778adcc902207adc94846b21784f1d9232340ca84889602cd08c4ad204ebaf2ff0cf4e26975901695221028323a35f6b87a6470ac489e945afa6d94a17cc18304a647218277c533bb6f2fe21025df4fc228a488391fce26a9c740494911f4aa2ed50475e390e806b824a5f358c2103807a375478fd596dbe2d86cc5e5ea760dc43cbc1f3d85c3494f0d1a782420ddf53ae0400483045022100e3b1ca66c049edc1da182651c7288c0a8c3ff3ca152928673cb24e4dfe42516002203a5d666f57df43c0d4341d0694e83ba2f33bf92eccda9681b4aa409c5d6939d20147304402200ff710990179dad1fe4350dc9b480ae7e9bbfd4986b84f872996013c0791fcab02202721426af82b8a1d7358e5775f8b39e792fa8561861c0d331831b82091da3bed0169522102eae3e13722c2f7f092ace68ad57756ebbebba4a05b3eea96af7b8489c46fc7852102795516f9983ac3acf1d86ac499f7d08b6b823839c779bf1775ea53782a4ab57a2103011707c08830ceae04b68e45bcc17954b87850f072072c6cf98ebbd54c98888f53ae040047304402200f99fad27685c013e1a8589ac199b932ff99a1cf99dd8931f5f808d8e23751ca022074474a95b7245abc60f2b843d732f622da6c29864821b56f13ddc11f74987a780147304402205645451968c311a646b2f6770aec83bd449b5ed97b5f543fb9ac7464adb0452402204a0c7b37db5717f7001b464fee6c143eb210775b8bbf8e878f8603ed503929ee01695221028fb2e5e474ecc7451351adbd9dc4491c9bacae89a8a7845c0f6fc7d75846312c21033811453873d19b5743f74b7443c60064cd17664ceca00abae3287521da831b20210253bdbaef3b6debcce805e49aef1352ecde74aebe6b9d57518bf7526d12d3082a53ae0400483045022100f5d1c9dee6a8176961dc812d9082729b96304587db5cec9eb463fff67fea1e39022066c1291c1c53334f771ac9108f4fa5673a0d3a779369766f0ec8de1f1850e96a0147304402202450139006590303e759eee32f5443d7807f6bf7da0f356b0125cffb72b6698d0220696bc3214957d518195eaef7c658538060901ebf9ee34247517058a7961728af01695221020e17c2a116053668df267bff5dcbc121f8dc57cdc567836631470edc884a427421031c280fc5a303e2a0ebf7919a60ac67876c38b17e0167753e4ede4bbb895a812421030caf1ef66a7d4477ae62bfb9b550f53ad1f47e60303cfa10f00fc391d476724f53ae04004830450221008b9b34c9032ded0bee9935e37f7538bdee7464faaed148314f1f21ddd1fef661022038b4c876f70bac6799b9b34028d84ab70d336a79eb789d0b872b250781c9eb1301473044022052c02d9d7facf0c54261d7d9d7083afda86a0f78691d71c266f1c382a947af030220072f192ab3c14cf2f377a6608dda319adf24916f2dd4170e99eae3a49a84cb2b0169522103df717180f8ebd21ab7474ccb91520c6773dd78844933d6fa90b2cf0caa2456b121027cdce28df15c53c7d756859f10c9cdc32eb2c409839a967bad161c70f920649a2102daa995a7188c345e381ae1c27fe974140f89a2e4fbcf13fc2a2db69f1733c90053ae040047304402202c06ea7019d906756cb0ff65b646db4fc23aaadb8233375cb72a0da7da8c4a9c02207f14c65e1ed6348ca5ef28431d9c0991b1273690d9b079d019b23809805e35d40147304402201a48e7440bec2ec1bca5bf59304fedf1b45ad002ad6fd1f58adaa50cc2641fac02202b1002e4b1e5c4d6989c4bc9163aa9783160d2526c8576220a47deb09d031b91016952210365ee224b803b0d341e5ed036d1d2bc98b388b821ed33fc663bab999004a4a78a2102fddd50fb1fc9b3ccc71fbe234d79e73cd3fdb0b02328685e6c2376535b08280f210330bb978293c2befb7969e3d8d66e59a6d9e875d9e5d85d30eafba77de806822f53ae0400473044022029d2b90523e9f327a0b7271a1bf9268a0d08f81300e2908fde2eac67cd5037d9022067adbdc63d5b97305fb23001cd01880001363a39aeb85b61b3ec6c32fa06df7c01473044022001a8aea9fd816c013e7bb6eb9d9f0b0aa5c753767081162bf336fdbc76996cc802200386d95295c36dbb4c51b0eaaff9cf0f0058cdc0f2eb2d2214ac26afb03f09bf01695221036396dd3b40f73a9cab1e5b8707dccb939ca8ef9504378bb06ade18dc1176986121029066a3cae62850e470baf913dbbbde498832d3aa07be519e53fd4fa588d8224c2103f5b12a1f3edeccd719ca5a9eff407f398847c046daa4e120353a1cfa00fa526a53ae040047304402200d7ac69249a0c95669f004a921512efc5f8f7eb6bd3e2a93c3ef7bdc34e3c58e022071cff2f1c2943803dece29a4145812eb1dc07eb3f8df67193006a8e3ad31f59e0147304402206076f5eab955a519801b22267554f6ac8eb1fd3cca0dc9abb466c924dab4b460022036aac9f9a6bdcfbe9cad283f5db38a449d9081ec298ed0d8b91810e9c2baeea80169522102279f1fe5136b72ed1c21633b1649f47dc5c787017950650d18bb8dde434ffd1b210366fe3446a8ff229c9f73194e462c85d8a2ab76704d6d7f72e0cc614c4c27b7a12102d738894f74eb41ac4eb2ccc796c342399b1a02c0707b0618522f1238b4dce34d53ae0400473044022042bb0917b2897d615bfe7d268aa936a31c0c569379b869f8a9ebd64372b4684b022001fbcfacecba944f27319a9e71cce49cba6a96dbcf5d08dc84ab73fe46c9fbc40147304402206d09ee5c7bf35de8af7fb600bbb95399d5f8654bfae4085e0d0a798a78206803022064c089dbfa72ba93e541a0de08af8442d88163c90dbf45f3c5fc27529578eae00169522102d1d00be6a9b0e1f94ffbb3debad54d614945e6e2aacd8af202481ebdf19cce502103b0e8d917f4d09adc269ed79073aec650e2e858115b75fbee110cc6afb5202b5b21032cbaf739552dba4faf9dc908be347f510e22313c093ea957c878e8af46be45b053ae04004730440220363cff07a2854651fcbe1104d3411ad682bf6aad707bad54c926a2eaeba09717022002952fde60c7402135922064201fd690b9957ff9addc1c46d29280b84081fd8401473044022045ae680eaa868eb40942a4cdebaf5ebd7001751ad446e232373134ce1fc5963402202fe64d8f4c69572af7a28732eab81f8123a4257b6a6a082b2cf72f86e65d32f001695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae04004830450221008aff1975bb9cbfd0c539821d1bcd522a2d70181d3ff9a5801b884f22aa6882dc022025bdc5e9af83bd0ef14d3fd6fe6c88e6beb50877a092e2e0a60e95b0b4cc1f1501473044022005026f8671110125c3e0cd6b4e749df4ce1906842bf1a553af8bf66fd31f89a202202bb2765247a1a249309742fe40945aa1ca05e2ff99eb62caafe092b662ee26590169522103aac85b6af412fd58f3cc79e2b2de013eb930f0d020a14298d4b709744754f6cf2103fca5ccf94cd065135cc1c322dbcd607898c53261ece3c42bb96d7a13ffd92f2b2102857311e5e35037789a81c430d45b7464b3f9b409715057b111bea7ef7861b1c653ae0400473044022019d94f8c083deedf20998d0c03ed7840389153c0981a706f63554f23b96dc65002206aecb7ccb07bcb71fc709621ed8c23328dc4af67b0db42ff5dbb11357cea604f0147304402200a0da3552dd5d456bccf32c79ba65d4c2280a0013c9ccc50845b8ce141cbc258022036fb4793523d256095111071bd3f10ca64ee6ed5b7da2250d9ce0b8788cdac66016952210271771d612fc5145465c7539ad75332319ee9effb7fafecc5a60663eb5c3e7adf21032a1ceeebd6939eff8a8d9b2f12a1c030d4d0f0dc5c080993035ef17a9c291d332102741d1ec72ddbb71749b549bbe28530e12ebcbfe45b7be4bae1f70aad9e4219e153ae0400473044022055f10ddbeb7ef99cd72503971094c49ba92c54dd4677f07d0797ddb4187767ad022013dd03a682cabb0949cb821c190dab2ccb9bda26bee40501fbb61b96a71a85ca0147304402200498bbdc4c09fc0a8e3a62ec77765e652cdef2d94808f0a9a442146f63ab973e022048ec06492b34b2600f43e1c9160a2f75d7937df1eca2b2a6b33dc3973937895c01695221037b77e14c39474dd141dec6d4de0b1cf492945cfebf24e23a9516c4c3214e58012102c3729c679af5559f285e7cc90862ff730c1271c3b317f51d754107827b06b79b2102cd4439bc73b4e06c32744d4f43a84ec48295f4cf857c232b9908d4718ccc2ba953ae040047304402203a495645269d37af7d46091e200cf6c00ea77dbbe17a258ae114048f10d89d1802201e633cc5d4bbadbff7cfba0fdc0daec22c7d2b05b9ed5e5bab09e06372fa55400147304402206567f73a60ecfd1fa0290d665f37caa475c5935e5c9af8901e8cd6d417c5a54002203320b55cd05f16d5b2f2dbd9510ec50e02c66d330dd1a116091f7678f5e0fcc70169522103454b8c7f939393d8e791a43c06b37f86804b4a4c3fe17082889ab9d36cb376282103970b0e90454bf659f920bf123c162ff080275c67200a9ce25519a2331b3566fc2102eb1b43c12fdc124810ecb2ab32b5534b1f431d00f5460cfc36bd5b0cec2795fc53ae0400483045022100cd72b3b0d0a161a3683686778a895af63c57b4b1d206a60049bef069f90bc31b022046f0c2007aaa7fb89d13d517fd4a0fae55e986f8b147dbfb394e6a7c78ee56ce0147304402206691d988ea0e8f27611f97c7cc31d306ba1dc5e18cc72df7c41e227b4ab1f4c70220778d84cbf75a28bf1e8a3f2c96bf4b879c44f14ab7a82a638ab630eab49903fa01695221020f8574d60901add5174536fd22dbfa275cac85c54f893c6ff1f4cb402191af8e21038ac3c3afbb2063fb7bb52ee02feff063d1b19411478021d49797aa303db46cd42103b900345224f7ca5ff9d11a408c1ed26a3a576ae8a4bfc4681bd51b495a6ce59953ae04004730440220502d4ec37cd4ef23c80618c4dc0ecf756de000113de6ecc20b69a1031262784f02207e434fde5c901f3f2d016d9cf88ab75039f5d665737482d3f4190af6144b9466014730440220701b4df72f0854d9fcca8af18ca8d15da7a0615bc9674bf01e7aa59a7aad75f80220438c2999e175fd416ff5088b1e7e93a0a08485e8949a9867abbc15694f50d4820169522102e7d6086f3ab71899720dce21980be627b5f8f9a1c67ed4f6b9e95e28206f8d1e2102528a0a3ad310019ea52f0eff0b536b78bb1e649ada65fbb8bfaf0b3f634ef02f210237c539c07947c79e25ca57b5bf291857881a8395e327802c7449b7a61adc637253ae040047304402200221cef474530c78d65caee4b6fd49ff14dd3c8316e022005f79a3c5bf01198302203f65137a65ae1cae2b6719005e8ce487147c521cfae1fd33b9f9b39935f377c20147304402206528ce9471a9bf253731965b2dcf0ef5b42c00c479d924110ad98d8ccc649da4022007b00a6d2645013a75b5a7234c9104d587da1e6024a0696b2cbd383ed0cdf9860169522102c08dc9d8885c7fdce341efb5ab8f7b915b013e440bc12b0dda769b7bab22eace2103696beba63bc34d5f0323dc28514dc6f4960c7b4eee11d191451f81d5166ec732210296bd7ee411e552f84902af75d3f356514343f3ce4959759f23db7cbb053a535453ae0400483045022100de8571149944650c4968f897883ee1a666ac111a55f70be2cd15a3fa33e2917d022076d0fd0bb91bba5930ac7c495c936e66fcbe466c6891e06a2b86acefebd1c31001473044022072f68a4809967c6b4c0df76634774991fea7ca714490c5b1796dab1e95a642ee02202a6ee3e93f4e45b2bacd307a0f669b7aadc839af50c1cff14b29f0d3ce7c319c0169522102c4934bbaf533e980d8e0f2be546fa5a87b66bc9248b2420306e5f0ac5fc6d5db21039032971d9773722bad112a3a3a8be5ee73c2140cbc03b0711f1863d5cf7db4ec2102a06aab8dcd04fa73afca9e26dd0484c12a19077fe6a0eb377f9cd058b2d4ff2653ae040047304402200622cb8c293c07df66f1ec5feb8055f71c94756f8d47018ab469bb22f16d87ce022005cb95ba278a281372924c42fdc621fff38a31898bf9cd5f9afd0f32ff2afc580147304402205c7b7501b3f1740bf2cbe9c973528acc05970a9039a9eb0128619528ca649c80022043b1278b3ea3c8e414901714b8e24a7025b4c49e74735ac69e419fff52770d8e0169522103714efc3597d0e5911d24a1f9f9e018dc4bec00b0c3df18d34ced574d27bb0b982103308414725c41575a0a9328183988f66a3c13b57122019a446a189da3a6a004dc210376101c20e72bb97f5c5d80d9f5819bc93a64f8373a82ad4b022314aabb35c87153ae0400483045022100a122531ddd36c6393d67d99bfea9544d0b91eeef193d1c8788c26f5e45fd6b1702203bfe54801b15fa35af6b5495e5a7415475d090a72afadbd5b06fdf58311bd483014730440220781c3e2da2df71f8fd2dfa908cebdb412e637c881edc120285aaffb54fadf22402204a8eecb1d66159855af3a48404c45bf240520ed55b101567f939ffcdeccef4b10169522103b88dc31f8542e0710e1727c94c3248680641daecd3a79ecd19d903f1e53db749210288b15c79cbf654cc2f39de82c848985935696ec2512776721fa591e72e003b902103692233ea8bed9540ad03c0d85d9d03e60822245f3f8ce819f95b71969212cdb053ae04004830450221009cad990a083575932f56bd74a7bd11e36744c43f047af24dc63c54681c03e37a022033cd5d13b3e4a58eac32ac577f9fb1a7c0d5c5fafed38910cff3e21fbdd6b803014730440220787359c37c21c17681424f03c66ac471fbe6ee265edb1eb7849e0d21cbb9849902207e10ac5936487eba0b3ecab37fa636e2a5f64bb310b119230f16d4a3ea14b7720169522102bff6fde634bfa7231166121b52bce5f7f61abf507dee04915fdbdd32cc7269442103a0fabd07de2a7f9fcebd2d68e285a3b98d75c2b56287525762a0d4bfc910d55621021d6d0f765aa7a70003a7cf217136cd4240aac443dcc8038f1e1b810b4f36043e53ae0400473044022005bf50d98a6ecb156d65493456c671f5caeea515bc9ba64ff9e5cfba25e6054b02203707446fc528b9d130e0941e8ad42fc6203317ec1de7a24b53161fd7c29279040147304402203b1241572ca600144315830f1ac141835462d0f9b01199126bb5445e33f615c102202dda6f5794e8c0f24c3e04e8cccef036e74bffe153a16c229f8528180972c1770169522103abdc68f6f0fe50facb429b8ee50bcfc254d54e680fc72da7b0f025ea5342672e2102b909bae1db1fa57951ef5c66f0e13710c0085af47c333a9215ba88f5cd965e142103e88ff18953758207a6a1a9cdfcbb3d18e8794b6b61fdd2658ab027a8ad29c9f753ae04004730440220141ad28bee35c45391f0558db47bfcd1583d3dd4ee225243c2099c98ec89a06802207dd8274e503665f5ebaae76e56294347c67764b9ceb04083fcd5d7459880ac68014730440220490e8a45a24b556c7cad0de32108d0b16f914426accca1524c12e4f93ccecd9a0220301521c8c27d0da64b0c246a19ea09f0d5f624e781eae913add23494eddce901016952210385c567013f2289a518112785aea33045c0d0cd9e94bb537142025b64cfadc6232103d4e0c2e5e363a637689a3f92d3d0d707595bb06d3b2762122faa77397ec8941c21030d2bb4a7b2a34f55d15d3351db50680fa28c519de18259ef8cc2b9dc9ab3578053ae040047304402203cb3da61049d3857841be4fd4712b4b834501b8a8c2161acbd2bff3782167c0a022042601ad8872771d25913e9844082f50e676065363845bbc1fc1b7ce2b47d362301473044022019afd3e4f2984c36ce5c9698a550e6d929b26fc55c2fda2a2c94ca74b4d55fc802207e3a5089e488afbab230f3a451dfe33e2878c6358fdb5a7d4a8bd02a2feecd8601695221036ad27816611bf9dc23a4e8080df48062d283a09060aa1c8315fcad5305cff7f22102a9456ebc52ef96558d8b5269ec8262ad04fd7726745dd72af7955f76453e1aa621023589bd6ea336c41c62c9ef4bd3fca675b4aaa23273e25f72ce205adbf6a9b96253ae0400483045022100e1c1519958977a3bba4528e18120a0477d7055a7255d55b5b6467063c8fc2ef002201e4e0608ef62694e844cdb4a2ef35112c690693e316d9ed2bef041f20115195a0147304402207c4ec71b462af87f878ec7e1d37de6d6bb17381ddb8bb30387cd96cb4d029cf002204eda10a04ec6c72e50196c83cb9dcf10e4cf724e9d141ddbf5846e7f1cfd13e501695221026dc790593423924abf2cd0f9606305243f8fed63ba9d5d3b2eebf0f49473058d2103ebafed99092590de2ff038177bd4b47def1429f6bdac27fede3c16faabc4ba7c21037a6d203a7582825f515f47b58ae33431b37ef83ceb7d2a0479ffbef05a8d999c53ae0400473044022043b7446dcfe1374508ce49acdb9372ad4586db4447770fd81c6632fa81d7bfd602206fe28bbc01f22341345bbbe4c38f3f429782991de8f71039f58ed1f6750ff8ca01473044022037a420b17b8114477413ed041295c95a2808e00decad4da07ed745e0c3fb9e2702203b046b775533dbefc9b1a6a08f97edb85aa18678ba0f21c8cc1a22d2b41b27be0169522102af88efb5f832999ea1aac21be0654c47c516b84ce4261d2b756de48b3919bf7521039f1b494a7648139591a1324de000591b3a0803e2b244e249dad9dbe044e43fb5210322fb34fc161ffbde14d41008e588eaa7da29104acfd2140571ffba1da1ddd15553ae0400483045022100ce3a00669732ad2c8f888e562ed05f6ce1a9f9576c4ea8e25f938e58a16fe62602207bf5cb0d94525168039f33ec0998cb9b3668e58ceac7a75516f1e539baaa284b01473044022005cd9dad1b2ddb1c26dc2ea150a10923c553908581d476b5b3c8dbc5a0105e0c02206528d51dbfad5c5f85c37583dd8423e1f76b2ca69f30386a16f0078df6c54ad30169522103e410b8d2f6eab7287591b86d9d6db1738c230816cea3021c2cccc1828fc887ba2102fb058b56050b9e94053d8a027a93060fa106a8e802a9de8dd3ee9e5c05b59f3f2103df8d3d319cb66e06cf4867cd99df203e460f1985a6ba0a3ab256142c7b363b3353ae0400483045022100ad3b36514f9109af87c5bf184fb8bfc26a970de000f6b23fd9355005aad9230c02204a4891ad3e7db1267bbecc191f136325df2c5156b985e3a58580fb1fdde923b9014730440220426348ee600376157ff79073d366b8f14229f3d7104a3ca22389938aad72e65502207961361dc881832c8455d048cdd20b1bccec045a179325e92eb6e7d7355b26a90169522103222aa751338e4f9c1285ba0f8d45e437ee99672fbe97595d37c48e8e54b369ab2102f8bf223b6b413cb286410783200b4c384424142560c1d602a91987109af7e72f2103e8a0e221003726fa8238c8d52935b6e14f0d0cb57f936d83a0be649ffed8ca5653ae0400483045022100f64d124ea2b3549a62359a66a6adbc0f979e4469ce0bdc6be99f60081195ad7e022071150f6d0fbf54a35be554a14bc0c79134e86d647f350ed52a099505e8fe893701473044022014f63ac62be2f507c294d436aac79f506b240a635d56d757841e68e5ea2ffccf02206bae9788bf5a3af92112da4cb258a4dd6df76cf29e91f43e8daa2f1aee3b5f3501695221023b3aad0eb1268ece2f7886f21fd3f28e675bb3e9a945f9ba1fd98f891b1a4636210285709660963a7367d0e9571e43f5d2edfcda4807520e826b04008ad6cee5eb6c2103f679d161610dc9a1ea685935453d3ec7e1c22aad8a4a7d6229cdb194b739798553ae0400473044022049f033bbcad1b808d685f933993d2e60ac6aa8099ce5e803c405048f517803f502207068a3691fbfcac232c03ca5bf3b5154bf2fd48c71d4eb22b5598745a1d593fd01473044022061e986c5e3c1a07c7743dafffceacee460d35853ba03b5249e036556e71f2f4b02202eb71f5f4018e3e0e40a971823f996494385b0d86222c6028fe311c94a21f360016952210247cd0c10df4fd30b662ac7d83b4cba2c7a4d0fd630eb32d945bc3a4bfdf2182f2103f5674ff3315464cd58228e933f1464bfc27948b4c598c692ccf8b02496f3d27b21031bebd1835e5494ac1211877049bb2cecf06d98bc8e75d5c6cd28e73feb08ff3853ae040047304402202c8a2a65432fad1947959375c0effc8b8963e2d03c52b4a6d0a89d7f39d1890a0220628363b2500603dad65f312fbc0e82e429efc7b46dae771b4c7b8d03a048653e0147304402202a63152f662d50a2d19b6d10f2368001fdcb74d3e6a9da39c737c2e3290293f80220552dbc0ae4134403adcf67e3931a679557b6c517f139b9abedc71eb48b2ef3040169522102f14e610317166977418f49f9dc391af31fa484a61ddccaae651ed99ba5af558621038dcb4fb56f11bf28f9b8c3baba2655468574c7312ec72aa444cad738bc5e42c02102a6c1e6d3b92163b6ed2083d0ff4ad28744edc4fe015458c0342ba5624b1b2c4653ae04004730440220014681ff443644d1fd876dc826be2a1c93b7c023d2080a7830e77a8adb87f64d0220322c077e9c37e3dc38a2a68265702b0a4b360e83b5ac6cb9c30bf12d7da69ed3014730440220330d3b491519a70e3ad359a68bcf6cab6ad0be13da8136c571cc4a8208011fcb022006f3b8845879004b3a9e5c1bc260a9b3547f9dc08ae2e15f745f889c97a97cb7016952210345a9a0a119b82b4e862d7e141ad403e588574a544f8ab16787d1ed092c7406f92103222fcc37ecaab1c92d01e81eb2aec7ea38167ffcd488cbcd5f19df1678ac759521036897c0442cc03ffa1eafb0be7351edfe657e42298dfcc4925aa09feb107d4b3453ae0400473044022005dcc87d93258499de3f058e090455c117d9cd9500576f4b42ff44c4f0e808af02200a6777f7e7af6d5a2742dd84b8cc58e3eb1733c174c1d22adc2510c0d4b99be501473044022047cb173fa13d2ab87e2db65f6e08df7be1f57da5278aed7c04ea07abf6e7d09502207fcdf6036e48354e38f32bd3f6716eaea23a8cf6cb8f1b52e4156818f6a981fe0169522103a09a8862fb89b27d3c960434b073c3a119fa2f1dfc6b17a6ab6c6932d12ffca62102f8d179f1f2213bb315843024ffc6bb61870a63fa7a536ca332fc5442826534dc210351abf58c12d40cb9fa13b6b22da9c1c9302e416ad50dac1e6b09589b4adc05da53ae040047304402201b158a243715cb4df4c53731ac641f0070b75f028fe8bada06f4ac1ab275815002204e6c8e3af3b766801f417637646bde5622ed4535c102c236232096f8c35e0c480147304402205830799ab65b4cd4166ee42a40a7b7db33f6990d91b75af7a2b7229ea425a6e1022015d1868a0f0ac80098eb48074574a14fe3e03e268c910b90c82ec3fba80d7a4301695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae04004830450221008de72de88e4158e999bc7646f6d5ab80e27bb487d57f520d225d4ea4a1b04e4a022017bc4b73b5159b6330a6f8b2944fe2e75a8d64afa344beba81353e5bbcc1e57c01473044022060acebc56129f66efbedc1b1c95d4046ecf79b7875c0cff22556aeb118418ae1022017e7df9245096fc97f90492c622743f70cdbad5151e000cb0471cdbe71e953bd01695221028f76b714bb5278e6746e30d5da22df54a870aabb75f098556648cbe80b7e06cf21036a92f8e47478432bdc9146b5430f9fe6e7ba8bf479ee24d377a1ab74e8884a1321028b387829e0cfee457f782d2d35059a97d9d33382e6ac9d39f957bf04045e128253ae04004830450221008a25d2858547c8166a2c907fa0692fa84a81ea447afcdebd5f326f7966f50f630220337d958e0738d932bef7ece4b9259ee9398c7feab4641724ddd482bca175e0c10147304402203872a35b1e192d081ee20a59609ed8ba8e05c18643857c5097a675855cdf97ef0220171cef9d6981082fe2be193841fcf2d0eff0cc1865de309c873d061ba4b8b6550169522102244b577a7644c88779312fb924d68b56351af479d823d7107be7c1d1f937204221039d0cd349673ad8a6eb3661062d1f4f1b4f0abdfda6d6b8f43582aebb914b35802103de71cdf8ed5f7ab92c62273146717fc4b7374ca4281d8afb701440f4087fb1aa53ae0400473044022016455adca8dcb3b65dec5bbdb82defbc8c57f280745e7c28fb3625983dcd0a5102201461dd00004c1cc5209dd4afdeb41cbf5981923b9c792162487c8c6d2fd2df900147304402204304227f8cebd2f808a910d70a7ba435353d1011a34ea1a4640f022afb6497ef02203f44af1079bded8d8fec90c3408f5c2a9dd75f3efd5cb71950aff37aef4b7f97016952210326213837bf592af2e632453085fc2e4a787c9de1ddb9fd984467e185511d02f5210393ecf1b4f741919eaa3260e6df9cf5422e901f17d8c3d324b324824a1990ecbc21026ce29b75ed2df11eb708482a489e33b4a618400685bd476f1468d55d60a0d9af53ae0400473044022077de746b55496abd2e7526fae40166325e9018db6d63c5a232466eb388d1be1b022021ed4271724f94cb92964d7f48acaea0d80b6f41dbe6c16deb8a333d6f088fd201473044022046ee2bc1f30b6abeb75b4b664dd3b434d35634eb2ec1bfc28de21b2f8f8c817a022016cdf68e02c4923c41523130cd19a4b965656b4bafa7e2ca06c94d06268769250169522103508711e59fb2f053ff82560f2e98f9aa64e8fd2c572c9b73b7fa06d98dcfb02b2103957c95702b22f1f9562ab0501348729c5f4563436c3473ffd0b46ef255a5ca0121030f0de3f979c0c632009a747e0f89de2d33400f5e130a8f3c235c6c27ff83757353ae0400473044022031c0e3f1bb5b696f7e78d607ae93837a5455e875c7d8af9aaba60d6831533b0502200db1a6255804a6cc5a165f69c0818b04cd25734cf01d4d1ac0afa51b31f1ff0401473044022050205f646e7a5da96572299a5b9bf839fff5d2d72f0172acb812cc5ab5940587022071447c2667e945fce8d0af85eeb607e15b29927ab8fb89eb5a009069301365b10169522102326838964a51aacd1130811888447a904b5d1dda841e2957d79e91bf1b465cc421033349aa628697687d6c7b6927a388da29a2fec433c4bef33d95a3c7956eca74292103bd87cfdd7bf79b3475322a5704c307f2e1aeda65335547b756be26815863d31653ae040048304502210096c4c8466be910e154358fcb8f54cb3ff02016072c39915b2e8b2749c9d7839702202479fcd91f1b99add1dd0913fdd273eb5b234c42cdc4bb90258df3894a6a5be5014730440220063ead2e6dc5ee4b72f8a45b631e6decb165e8beefb7469ff128013734036bfa02202dc9ff3f8e588a96d9ccf90407e953906499e48f605c521851a3890086674f5a0169522103c9651ca10c762783d3bbb5a7268b2b0800854e0cef355e42ebbcd9b8b9416f9b21032e38cbe9500483ad31b9be806b3d5f7cbbb6439bb438cdfe37c3581f2c84cef121034cbd60b098dc7d7aff70e3f0df1d971396060f5848ff2ef6636e1045789e97ef53ae0400483045022100bcebe4bd2125093f848bcc15ebfb403cbbfbdce60a3577496336e5f7962b17dc022067a7cb13fae4d2c8cb7bbb095157bb016ef8f3cec9cab67102f07bb0f7dcbb220147304402203449917a81079a65c17d81a05ec54ffcccde445d052ae1eb8d985093e4e5496202205b537618190363e89ed83837a9d63d6fdb303e809f4a7d60c303b65a1851121e0169522102533d7a856c7312672ae929d5dd521b1966ca1f8df9efbd78fbd10e12a7a567152102a14c27248b39d60f5f024b87e55bd49e05efa86d37fae0ac46f3c3acdc4d4e65210212da932ab9859522753a7da28971d423adb4877399586f3e9d6aadb139d1a2ee53ae040047304402206dada4b9a4290c7667d24407184a0b018127b7624e0945e6a1709014b3f76c6b022038142d82931572899da76a24311c213a356e8c6070d50a8afcfd65b58f0286650147304402202005db4f9b4ece15b46e0667dfcf5d0462921cf9bd2a3637f5ca4e052b21b08d02206b66047891fd61c4dfa5161baf3c417dbd27c68c3acd59c54acf989e987eb3ba01695221027f36e3546d8500a55b9025ec855ccc7e490173efa98a0b429ec018a2c073104d2103006a0fd2f41aea627ce305758ae7e0bae2eee8b26df8b31620b9923a2cceb01b2103888c3a81840527c0d1f964b29aa29b45455a031e20c5b1cd17d114f82c417de853ae0400483045022100db3a6c73c8bbcbb7e38ecd5594bc774ea136a8966a778fd0577191628528eb6102202c8e15a34f0967c9cba3d9173ca2966d26eecb9959404fff00da39870eb0fb190147304402204f65a0f455bf8cf2f3ca1c4098177e0ac4e7f419edbfa57c57716596b7a0953702207031622e20c08c8856723e2da955491123b7a06e0f67efd55d0381d2ff05abbb0169522103830bb8fb8c14a4613bc456c4e166f72f447c2777b073056a701fa9f58b1917e7210252e036eb4a8b8b481e8858f0dfb127cfe118d9f0c61b4987808de03c448137542103387fff38187f57695fea6b28278a365b70a5c637cec9c26d714bab22fe52bfda53ae0400483045022100b9bc6dedd41365b6324a58159e1fae46684ae1a61fdeac1e7fef7d9521bb7b4b0220104a27faf82de55082ceea1aefa6e6047246cf5ba90320d20405d6c6fdce63d20147304402200a16507fcf83f03c5ac0e513d44c854ea1c4c8b64df3679f2554c40644cda1510220037654dac557f090fe31f6b405e688ad160c54a2a6844c83104e849d5e77570a0169522102aad62fce231ecfaf8e626a438913a88933db87987d38c1665e31fefb9fa26b32210360bca986bf025d238ea58e58fd8ae02d29ba6241601e30e7daf112477e6a8f6421029edd42b56702f27bf6e00b1cf94598263753ff4a73812f5528e9bfdbc393867d53ae04004830450221009c47db5a89671e3fe17a6681d2d3237d74a3cee7322709e9f7518a22fda7f8b2022072be6460b475244f0561dd36bd226622510b9b7522ea3d3683ad293b40bfc9be01473044022067f99ab1d69ad57d57e7b5f8232bf80d6099ad1ca2eec68e6cc6737408e78c2c022039d1b34fed4720c6859640ac6ac18333a47b8c789463d24171831158525e793a0169522103abdc68f6f0fe50facb429b8ee50bcfc254d54e680fc72da7b0f025ea5342672e2102b909bae1db1fa57951ef5c66f0e13710c0085af47c333a9215ba88f5cd965e142103e88ff18953758207a6a1a9cdfcbb3d18e8794b6b61fdd2658ab027a8ad29c9f753ae040047304402205417bdcc15bdb268bc53ecffa07b4210b62416b462707b726096fd03c052d8f802200cf5959ae87f9f35e45ebeaf24478723b5e4c954b9703de5ae26c376e99d841e0147304402201854873c95d0e56c07e6e5b12623c84bbcd2784c81c8a2e46463ef293edb9db4022010a2a5259683f966834bbe834df02141903d83636e2660222408c669537b9ca00169522103d636cf4588739e35025111ef92a450d8a4c43c04a559c7f9ed7c6d73afecf3d0210296d6b5438965f9447da8e0c1f2a94c3ae3114115aa0651c2f4490da7cc98aeff210308675b54cce6f574fce5dad5fefac2ce52b5a9fe4e24a8644516c352083b77bf53ae040047304402205210eaa723379725f21c0bb6c22af59d684c165e50e6924253931d6d30355c7f02201dcccf84be44f9b57f9864019beafb03e7430557345e6b59fa565459a489f11c0147304402201f933134faee13e2a869f2fa6c8a8953670d59c1cd0ee4dd86b63665de6e8071022048a5d1f7c9c7faffb97d98936ea2004cb35f2d503986a0c28b384b4c7ceb132f0169522102b6d8013e7735dad1c2b55a914ca3526df522eaf06b8ccd028a9379a42e30c98a21023fdc3202867cfd79b5b37c44993f58a023af220d6af133d9ab580936fa1b91d52103a1ba0dca09922d87d1365b000f030e7889a7182e9698871ec3802b8d34bb24f153ae04004730440220427f55e52849abbfd1787aae442aaa646f9f141f7e9d74b5101ede957463845f02207ffa914e71ad14cf406a348a809a7c0cfe4319bd4e5562015f4ce83d96b55de60147304402204986f1ef4af0971dd1383e81384d6a5007bf5a6626a2f6d507b5d2962c6b5dea02207fead98680a8199fcc1f22d93468183c4019969e10bc46c1704086a8f9cf1b710169522102acb13bfe70ae73039f050a42ef5d3d03f1f0057ad113ae6b697986898e1de37421033cac3b700e2f810dd1b54e64a1b0076a2a0db986778d0fdc5e2a4baaa40e22fd2103ca250ecd0c11ae0cf956296578832819e4c9a2d9a150923287acb5ca68efad1853ae0400483045022100d0c2336ca80118905a1160ea9aafd704036664067ec969ffea3f22011c15dd4002205c0672e2c28e6b7eeb6279a3595ce670c5c5309c489bb3b8594cd940fadb352d0147304402206f80f2ebc621ec8d142f6f0e2f2e9f079e58cbc452c48ef4e9f70998c49e56ec02200127dba7f9df8319620d6eb8bba31fb860dbe1f48bb84d3662355cdb0a989f1b01695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae040047304402203e04cb4d13008ed70ff0371fe0d9cd08c65f78beec4d156b74e772f3ddcbe2d2022008345ac125df2dcf2fba99f737ab9ec9ecd5afb8d4f56783026e407dab9032af014730440220732a926f50ea7d266daf85017b93809eb0f79274321c77b48475977783c57f65022011fd43e6b031b16717521cfa4c4ab473b528cc7c59a1e8f6015f1443f1c2a411016952210215d0178118d70a8402b4853f54ed0fe6d51cd01dafcded04f035d7d79632e2ce2102511b465671042fca446d938dbc6b64ff6462d9970dd50260268a376f0eab64682102c3e3b72f47af04ed9a1e128b0859f214bfc56f052a1ab65806fff203252bfc2053ae04004830450221009ea4fad89797f7497d63b8afe3e4f70c5fbfe40331a62876098b45772d6c119702201dbacebd7a724c3e54cc4035fbfe286ed5e9f23dd073097e42676a94f1b1aa340147304402203982e97cda15f46ecbb9cf71bc5d8caf46e90f31349f8253d5934622331cf2ae0220513c51dd0b9ab82a0407db3c552f097c5e2281ecae3fc631e3cfffb008ef6b2e01695221020d277f2e85f87fe4d11a9edc3fbb3323f14c017ab01d5a0ae72db7acfbc7594a210272fad5fbf4d82ae0dbcafc6919c4544b878cdc6319ccbc7bc0fd5fdf1a213bfe2102e352e2c429ca35162c201a0c6a560bd09d2af041935aea7e842b4c50394efa4b53ae04004730440220487b7e3109bad44b6c4877ce15d779723b0900ae00a7239a2c1f1fca377d1de802206a58818a5da77d0150783e52aaf9b83abe2d8fc2b41a24b2fa413c541bd28c4a01473044022036e757c99b4f5630df1d41360de5c8a4f8afc63a12a44e3423e71f62fe0da1fd02205fe14f30a3238b98ea8e042200003b513b170f15d2d009db1985af3cc2a9d0ca0169522102dab3b1b1276b36f7d80c2f11160908fe213d6201ca455924f1a9f671873e766b2102be040b27e21112c21acfec304a8040c9f46343e1715ac657966e3738872c129e210364ef76174182349a1bc984c9632f42e4a3b2f46c49b28609dc962e948e41960653ae0400483045022100b6ab54ddc36b3372f3e922359cc2bcf857ef66a8829475a197521e7d1054c4a3022019f2d8e88cd1cc3f43e09702b578a80b4cbfd867c90c24234f35e99b4f146f87014730440220563818070af2e5a2363d7228d51deaafa52bbae2fd6ffae16cd315615ab0c41602206112aa957b308cc2f3538148be9a422bf30c33682acac05c63205bc8d472480001695221020f206ac0cae25a33e4ab48e6cb1d7c5a8e75ad0ca6f8b0e6c182d90e118b929c21031d783169bd4f1b44c04adcc93f5d8263f4a67ceba8cf0c976d0ae4046e8bc7ce2102e4e86afda179a775c8111e300bf40368363e1253c94fba87a25b8f6dcd7533f253ae0400473044022042b3ab22c857518c7f179dcf43ddb1eea0e20dd81d9e22f86a24f706d0808fc602207c258665c220ec62d7505f125b6423b1d0fb74403f471f351b16d2070849e81901473044022079043e5ee32e3429fcddc2ccf25e953261f84fa9ae75473bf7f4650a1657e77c02207c6cd35b41ab4041642cddd8d474a67f1b5a1a1b91a71d3d9341615fc2a0dd790169522102dd9e18e53d67df4a81e5ccfeb9aa0b5881db9e352174b1150d7fac2b6b7ef4d62102a632c57d4c99a467376e335668661850ffd97149358478fc834ae80367b0ef8521031d63622ff527e20a0c7b96bf9519f403b1abc7bb3dc94c1d00c7d930ae94b04253ae0400483045022100f7a8ed941c253a5a118719605f34c65c8f69e0ef42f57a7a6462cc58a74fbc0702204f6318450448e4e45a0611ac1c1dc600728a2060c0992305f749646d3bec6fba01473044022025b9651877137cc51b1afec819933c8b9563f743c20886153e124721d20fb139022048847bbee8a4ab015e8242dce162616817594d5ba57b123bd50a39c2858f9fd10169522102d34dccc79ae54c87c2c48fe997494347daee8d353abc82d61d695ab2999bd69621029747adf732fe3f6584d2b813e94aed536039a4f8a266ce85ec604ff08d38b56e210352009f4eaabc7d1b236db05c1f0b488d0d0ebf32e14c753727ea98fe6122aee353ae0400483045022100d7e0ef266744c811102d664b45078483a56206a8bd42da3e6bd868c0f74d8af90220787a53eed5d66ef9d54d57962cee22260e163a6c792262b3ca9000566c7b6be70147304402206f49f3ddf0bc708a7ff26639b6286e9d8c4314e84cdceef2cd73f14841e0d3ac0220045f3da1764b44b87343647612469702269d8284af57e22c631349e677289d2501695221026ed71554a666f3b35c0d5ad75ba83794a03a45f515dfafac6f85eded71cb70e221024ea1c7d94faae3c0d2ac683ec64ce0818440fdc4a7152305a2daad0064096dbc21024bd01c924eb0dc4dbd6359723a0ba7da2f5f6e522ad964e0840842ffbe66c5ea53ae0400483045022100ec7fa30f8bc7c0489ff74587dc62e7bc59847c4648b87cc210c04ac5b122d8be02204a73d502e56165a4a5a30fd15c45a348de8e249102d4a5e05f896c0d623c32cb0147304402202e075ab625065af0e68ba8a1c6681dc3bfcce2cc5bf487e8c150a420e9d4920b02205593402f2a0486c2c23c91a75668c627465311e9e180563ef0720db46ab737a20169522102192bb1572f7c789bdb0493d5b3ca2c769332fc4b1830a01e892b396957f3ab722102dbc077d2d36dfc743cf53cd27613a20863398a91b62330ea4ac28fc5af75160d21038897480a26a72b7f567af8570aa375d28d00426c078734105a7a5e5371d5930c53ae040047304402200ba139557bbaded6b9121fd728a9c4ba3f8677e4ab5e395fa998a175216cbd6402206a5ae56e29b509019ac0d9cad50210ac35c7ce92d8d956e0275329e1d1156b19014730440220358e379a4e40379af9fd213059af163ecaf5e9d070d60301d2cd2f87f4d32a1a022012bbf4766e1ec4232b95c3f503e0296293d7e16d21869746b757fcb08db6aba90169522102b0a43d951e9add5e17e19fad7cbd671363c8e2522203d335020886939760f6f6210293111d9525568d7637fa48a6f9adc0c29f253c516139c5691f975a93f422d25c21025230121a72d9b2814d2db4a5e5b3b2650d4024e354bdffc1105ff6011cb44d9953ae0400483045022100c2092963cd44618fb6f4f7d34cb05dfea19f5d9fbc7c05c685bf68d705f4ffc4022054df1c7101bb3bd977eecb748b91ed05cf036dcdb6335cc788d07f8f69e1a8ae0147304402203f54fcbb31e9a2a6c60197302d02b393228bb2367ee5617ced7dccad0445281c0220601f900d05be2de6f77e8c90b3358251a0b34732ce618a77d5aad773841da7680169522103a798a43b543a4bd7af003c8023467858a8e5f9de7d6ba252403b83fcd4a81e3e2102ec67bfcc73b6b27d1013e91d0185841d2ca980857d5e5cb78d63256f6047afcb21032cd465f82ecab46746e0e66f1d36f9f6779c7656160e6fa8e2305a4603a5991953ae040048304502210086cc962a62972e79184cf0ad22814db360b34ca787ccf4defdc8945e55c0388c0220580cbe9cd767268585786d85f2a21c2d34ae2c3fa438f9dbf8445cc39b744614014730440220524bdffd3ccbf8245f9f4c3a36fe95b1fc495662e7932a47cc944811386416a7022026e865f22a5e2821c904e230f4353aa4f93b086c07d779a8db063e41523c2a470169522103ff866d25cfcd771b34b58d2d3bc5f807d4e51a6557312e3d9a4ba5dcfeb1d5502103a72fc3f14f3a80be572d3e6cfb5a7cd14f269f88fc22bd55fb36ed3d0de93840210203b5d29c9ffff4b035ad76b24e0f311366234016dd075dab09825e3e6899a9b453ae040047304402200f15d9a1b114319c0b640eb53a24df6c2ac98a5a23ef38f8194249733e7c1ded0220763b8234d10fe0e168a9f173c18ec79319ce4d2aaf981c466caa0a2d9d95484e01473044022044087de16a16d75129de52f45cf745ec8fe1c4d9a0f03e3ea1badf580d18a6e102203f6866b587b317009679e891fbd96688d31e2e20ad302f19ec48a371441aeeef0169522103ae89a6fca6d0f0b39e774cdf78d42613bcd3d9c6123ffd5cbdcb93424b86861f21037ad9e2ce63409555d90e06c2062c544a37fe862de647708a26c22972b8cf2bd121026a2394c2c988c7249b59643c8864cd26e40c849333053cc0e13f29df908ab6f053ae0400473044022030ccaf54745d1e743ae9344d190ae298374872af6b6c6d413ba0727b2f21422f022075ea0f156652055fac7074cc1ce7e5d220073cf9d09d11e8af0aa7fffec326780147304402205676f55469d42b7fcf5d391cfc137bc7319453cbfc1c7f01f08f5fe164186bf302200da41338af09b93813ba2e7a61250c4c22a3fa39055ac2c9bec6a81d94907ca50169522103a6a7e13c5ac6538ce70acfa61d12d534c1b2b8d97e9f3167869679bf554b3142210252ca7e573d47602a0d78b861d5f9be8ba7715f3cc432f6b9b48e8b8f7d07b0ad21032a42894a10635bd537fcbce112b9ac20819c9b5af04b679340a6e20b045b799c53ae0400483045022100893079748a4f607e9467b2df3d92eb89833484e8aab2df2b9311c00f9773b2bf022071b7ed0c2e6b27ea170272925d3166725b24178c0200bbf1836347330b7133950147304402202a85613cb65eae9f6d53ad3989b170fd86ac7e0cfc6a9bdeeecfa68e863615550220141ec8971d6af27144a3305fb093a75a5a973fcb204aa5cd1315771342cca9ad0169522103d456a46afaca3c9779166775d96ddae37a829a52952d22e642d280489ceb6cf3210265b1e166257f9ce8fafdef0a81424f62244782f780ff376e3f04f1e4fa2a57ba21022fece0a26ffe055142666caf2cc3b948abba0c2ed6639ce08d8c70f4e31bfa2853ae040047304402204ac9537412c895746bbc12a0b488f4bb4a413febe617ad081ca765d3bfca6d5f0220420275534856b9ee95de160d3b163b9c9ae3da70845057cebbcc354f75a84b4101473044022066391bc87176afe1e3476215c31132ff67847c62321fdcc49fa8aafd681d6b93022033d4bfbc078fa4f314f62f3ea8e76a40065f49f7c8c14092ea4ecf929f6ffd6b01695221034bcc20c1500bb5f1fbfc415e6c9a597c9dab746787d1a99bd9bdc6fd082676122102452fb4cd49a4577a7f2124293e88fd9296c892937e2a415b2bbc0e58c217a69b21039c47d21fca376655cb47a5b7d89391d131e408a2c4da8aa01faa3a47f85ab2cc53ae0400483045022100be708268c4154722089e4e4c90e64f4847d2f3f35c24fd1920b3029e19c8c92002207393951f59beeab6ddc36fc0e3ba7cb13a6ade07ee05c4721f9344df2eb0f6a1014730440220044f605c79d25850ae56389cc9f12dc87342ff11aeaa394f68506f1dbfe706cf02200b5727fb365a81e62e0e6693aa86c2d79a7414ddcc8979e2d4ab366d19fea4ee0169522103724115c03ca72f73078b6ef266f2a510c50e50cf4cf64fdf855d00fa23e384de210369e53abf51b90e1bf5e9c103541a4f3e5f69a9eeb632eabc3819165be9d2e7ea2103eafa762534ff1f73182427481daa158396bf31180451ef50688476e3c45073f553ae04004730440220762220b970e78a761ffe52756adeee6998379d22903f2941302ca2fca28a531f0220701ed73a7e1c3c6758e56fdbfe850c68224caa64c6d3d3ee551045c1c8199f440147304402207f7ca4cdfc04a6db84e048a4b43e73d4fefb36c03b9ff80f64651a6e9095992c022053aea63202257c7719680be6429825d2072e76dcca12da0a3ef5fabad5b2237f01695221030e87d2359af3c49240195c313040ffbc579b2f706437925f54fb77e717d3e9112103454d05e0126ab8588c5d3bb3da13d9b50269136f65b07afd0a0768764885297821029014f5d89c21d2ca630fb83da0051472aafc7c7317da4194deb8754f8fde0ba053ae04004730440220783ba10474f48b1354d32378e5702058573e66912cd0c518c1f7b785e64c3e7702205b700e79b4f6260a637a254eeaa15079a57be2c3e9b9988bde4f326e0c88fb690147304402205e7c00f317949bd6339cd5acc3544fda3e36953d2cff99f11e24dc541683e7ad022013cc4c8c906e26ab59e81fc02ce04f042e9ca765410e30fad8133bd0b10688b60169522103bea93bec8fb4c48215438414c7c7e87700170c8a965b889eaf20497b8ae408f021030186d8ceb070a3e44b6422e6dc9f2bf9cd663765caca62ed7cf8554302bac26f21024dfc7211db6fa20950e318d24e13c7032eea3617eba533d55208d18b7d07322853ae0400483045022100849a5ddd587871ca730447a55a4b467c4d64513c5fdc28eefdb9851d4369dd0e02203c88044486091fa65a18b4d5de22f421603a3770ce3b79f33fe05cc1192ce7350147304402206ab7bf9cb47d3b3db856e3f5c2946ea2a5015728a4e3b04cf3d8983466252412022044b24903bdd1562fd3e9e525639d0df6d91dbd908d0354e37d7c9a79383d62850169522103ee4fa05d8ed0708014fa87ef7f45e83249baf1f7786e8fc89e818480d88d198d2103e26c0a19567b55f33fb5422edbb551130503ac7906f69c73563f91c6069e0c0a210237795da057f46403f4a9f64ded18f7a421731e88126d52363209a6e954cbd17b53ae040047304402202b4183d40700b6c7fb5d27e1445e2b3ba1771818c480f147f7005c041284ac1e0220111aeae0631fc8cd58b679b6509da4b50fd0f581e56a159b204b1531059ca82e0147304402202597cc8130fc36c67665f18925f91d7384c42bbd6ecc991cf2ea6fe7b15e9ae50220595e2500bb444165c673788e90c23e670f84e1856748c898f6e99814c09f5eec0169522102b1c678a91ab267c2342ef8a4ace0b713458ed0391fc54e057e90a51da68700fc210214a7aa7f59acc75fb88f350b655e472c58218ee404e01a72f1e8c3ff9c139a492103eb79fd02d6ec177de8c9c5f130c55b6aafbc548f145e849e6bdee8b838fe800653ae0400483045022100ac2a4a46cefcc214559abc20c8f8760e4f1e1626be5dfe058bafc17a2d085e4d0220571fc102681da6a93a39611d9e7f5283f4438bffe1db15761b4225b6e7576e600147304402201acef69b80e094a831e6b8327d90a7840e2fe33839f0add30e93439f9f51a99e022074070880abfdda9023782da3f4201216831ad3e9884dacf94017b63e1674ba620169522103a0fd1fc36b4b1f8d9fca7ef23e8e5331b6bd6d5776ee8e63e64e0750158e510b21020379111f4edfaccbc34beea4a0c7b7a51bb1756f5359e836acfd04217b7933c02102f5587360a5b969a04f59be3790dc6becf80d7e4ca826f8e1585ba54e630e6d8153ae0400483045022100f92fa38a4d18666bc2d78bdeb28c100ae70b07f668c01a1774060bfb527ab3630220149019224d00cd17dad75a3ed586e6b91c17207097335e6352841bc13bc5eb2b01473044022071327aada9aaeea54dd0ca26cd174e87abf968e6911a3d854d741959ef65584002200b26dece989d60a348802ba4969d7bed00611bcfd23b63fe53f6e5fd1673a3a9016952210349e368203c5b0b0f2eadac444e0baedfa8205bb241324d076a93fe1e5fc0f0ef2102632a630811e9e436c79ea3820d8cada9a17183ea52fe701881a0d234ca1fe12521021ef4dc98122c4976769560680e55aafea9db27209a4959bed0bbd3bfe2b5b74353ae040047304402203f2b83cf2e664729d54f9e49e2575505114fcb4fbcc84468c029aed40b1f08e20220040572dab369c33c698deb63c442097b91a103cb82e1a00cc33284b86f1fac5a01473044022021dbfff1bddbbb8078aa0204e850dc9296c04b76f287d1183a4215593620732b02204eabd52560ed25b2e0cd3fa5b953d38e1f8bda7936413e036270b114bb7ab32d0169522103f1e86296be6879b3d800459ec5c0e3ad8ba4cd4ee2ed24c5a84110c741e7061021024b1779921c61de07d5ec11c245220dfed31acc3761aef2d5421678bcb1ff63e621033e0147e80d07783caff5fdb743d9d8b270a1e8e870439a9707a2ae6a4c400c0e53ae04004830450221008e00e37e078405a821c66b32b6593279192f766466ef40e8f8eee5ad60ce5bb80220046b6825d798ef3e6d0a794d387e79753b33489ad9d72251e1796203495c10310147304402206c0ebea7cc5ad30748dfada71671f38946e893ff274ef2490d3e6bc92d9a32aa0220589cdf2ec017d9090ebc846103e4810a77761d07c668ec44f8da81ce87ea1d2d0169522103201744c8bb2882fa87f919f08188daf8515b3e298c547c3cdb824c96350a42e321021fa3eaa9e0dc3dcd054181d9e090bf2b61d9cdacf027cf5d4b89270fac63e55e21032e315fdb40d3388a8936cf8224bc147abac3f89d092034963d515a6c2f7e745f53ae0400483045022100fcb0def4d2a268a2a6d11c03864587d6813d2217bf71c5ce0909ef9f395c4cb3022014404656d37374ae3faabe20d83ee51402908d8e2dfebdf502312b0cc6e4a66201473044022030e7ab0b29eea8fa03abbd20a8be0466255f7e0e606f6f0d14ea3ff293f56c450220601a085e25fd80d6191550644f06a25347ccf2562b87a0e27c577e75e9d47f7d0169522103abdc68f6f0fe50facb429b8ee50bcfc254d54e680fc72da7b0f025ea5342672e2102b909bae1db1fa57951ef5c66f0e13710c0085af47c333a9215ba88f5cd965e142103e88ff18953758207a6a1a9cdfcbb3d18e8794b6b61fdd2658ab027a8ad29c9f753ae0400473044022060897db67b11130cec21a9e8a3bdba52197b0598064fa9e8a9bb369d47e88ddc02207ec2af0920c925faf2b3466c7fd1ad77892086e93b594cf7d8b585d80130729a01473044022028ef134497e07c31e968ebcd786952fed8ec99f4baf6bb363d1e863521b470ff022001fe0c79172abc6ae2fd6d0cb7bdccc1d4c32cc2baba38785175704d11b8efe20169522102c58d186f46b1c642d9125088811e7e6abc5563dbd3b1de2f4958293f00364d2e21036036a2a753182443935c65a1b2c713f77eddc1cbf4b64f4341a4a3a30e31eef62102282269edabab609d4b9a8cf2d0d99f09e9d667a7d4eae0ea0d4061255e59570453ae0400473044022073b5cee7fa6f25dc00611272e42b366583131a7b832313d1c033f0b8f3c7f0ab02207f798630370992b6e751d0ce0daa200a13844d127a9bb97970b344fcf409540b0147304402201ce2839e242c9a18f5ec48a7812a8bc49d6b109aee2598fdf70608c595367deb02206b51586bd3dbc6b22b8f8286bc26c9490f542dac230bd3f160b9ab4506fb4fec01695221031bd88149a7af7270592b85a393ab336e6c533417446accecf68b071298d4571521031177ba3f4168134f907a5ed9b6c8e9d6eec68b1aee540d92f4ef12a48ef5b44f210376714263f2bd0d4faec91e409cb446f8fa3f5ad663632ad82e4fe32519ae1d2f53ae0400473044022057ff2b7474ba2244f1717a60aa053b508c7cb0acf871c629344681099f6d1a070220213b60042bc837f45bca07a77b8b88f24182288edbb096b8e33d8d692a374b010147304402206625efa2f549396e2826a5d6ae7dd13ab67198356f81870233632b224249b8870220365652927594ad7da40e1ffdeb7cd0ce7e7e1f561030890365d7c5a9864dec4f0169522103faf6f02b15c118a2ea803262dd9b62fa2911b4533146aff47066be9f449bb5192102191cf547ff33142550f9dbfaa381d89147f354315bb2c15979777d4278bd6b012103def2542549c48af7b0973b21a12db15b429687c4e0bd93dc57e05050f6d9dfe853ae0400483045022100d2da087f18c7314cfe6c8f1319b3c3684c4b63aef72b4fa5e460ed49d0f50e5002207d9c791f5edc1d9991b719ebe3485a485b03fbf2cf2ff455188473540d37fc8b0147304402204e2c4e78cf60199c21914bf55bf4d6649e08e5d7834d5b41f060c33e6e423efa02202a8ab41a5f7d96badab99dc7b610fc9442da661b29f69453bc71d614625c2e800169522102b51b37759d8d99b650987e0a4bfa4563d53562f7e271c987af775a3c7f1cd1ca2103beae8b1f27d19002899d92a46ee6b65c48f76c99819178cf167b40530c95a98c2102d0a2210d6cce2c4f4f73330f63691078f9b4044be55842526034664f0fed901f53ae04004730440220245c5b1519498a0598808dcafbc6b195a42aa09ccda0bd6b7154d6cf0ff9ec26022057c2d90fd64a5479fd806ed9bb1938bd3fbedf701ce570cce2b5e413e3aa810a01473044022063f63dec881f7db0e7af80b9a3817152095472ba899ebf3f924bf4f04097ce52022014e44852b4d28815684207e8777b672a41ce1ed9018cced6b21092937902b1e00169522102bff6fde634bfa7231166121b52bce5f7f61abf507dee04915fdbdd32cc7269442103a0fabd07de2a7f9fcebd2d68e285a3b98d75c2b56287525762a0d4bfc910d55621021d6d0f765aa7a70003a7cf217136cd4240aac443dcc8038f1e1b810b4f36043e53ae0400483045022100dc51749b37b74478ec7b2c1dd01a2e1d12a2a95f01b8192781a3d383d3b613930220414c4c498a00bc9a7f4c1e7f57660bb5dc8fa6caac783639115995f8664ac8a4014730440220134f511f9cd3eb067de0511ff738f80dd04b5f2593d073484f21775a1027163602202a421def3f81ae80fb09d04c10055b8dba546659184c40e9c041b1b1872a2a6a0169522102ba6ea340ff68d97599e007eb531371377ea58d866abca9826231337c34208d5321029ec75137559a980204be1572b46da30e9af87951e571b7dd501fe2a54c301d572102b750943726f34270a16f2fdc94fcff850c8dff61aff267b7e00cc373f9eacc2f53ae0400473044022000f91c58ca889b0233e409e38c0968aac4dfc2c2fc85f9d4e5a69eca38bbc2e90220607a353b8648fb1af732026e87ad8d021dc79940aaf8a20498f46ffd4af4b4ab014730440220173cf1a67b884b6278637675069f3fc92711cb45ffdc0a24706344f7117166f8022018311ec23efae56c6e4924c9ecbc5dd2b23d1e783cd8763a64de6507451703740169522102b230a44765963f4b306245826ca4a7c8dc43e2fcaf3f09654370135dd2f874092103ba85d70f0e7a60559d9b405ed556f9816d08336afb7fee73458888b992be6e4e210214cd1cae323b4f3c72c4eb371a7ab470da141780cacd00a36daa2ec616d0af7c53ae0400483045022100ad8e9d4a46b086fb74621b6628eda9a7ae1f5349741488d76c8036307803d86a0220653df7f24259273407989d68a7f4eb6e4cf8b8a8d5d5a170d2ad7361010bf0780147304402205506c668d924a949bc779401e3ebfd5535f98838c8a6b756e7dc30ddd88373ff02207280d9876bacd1d00c4841cbda651ff1a0927d0d1f8a6a5c71e90568c1a16c060169522102f5670ea84f805f12d3b74bfe4f6cdce1fd4a2a0f7f371c5316d998bef8c1043121025d1581128cb1a1f49540e12800ae66391b8073f2d707f4831691e88245c1649d21020321123c8f7b50b21be42e07524b4e04853d151b8f6fa9ec21ba321df08e609d53ae04004730440220254a4fb3be1073385ee2b3bff8debabb13917303dcfe13a0e533a3ad6e0a6ef302205f43b07831c641c83aaccc30f09b823b2b7bf0283590b60cea26e80b7ed4ae6a0147304402205a758fce842dff543542a514df3466a4ff6e5d08b92364e2da4d4a67ab91fe6c022015e7b3c9531747452f3b42bfcd185846c0b0db9cc7c9e1f2f68a50b6e3f340e101695221028f3f362214d2a2a3942b0fe5e35a8121ce49ebbbf76a9c79eb46e60de6f6eb3321035d9ae37d0e7a50a6e38d5407d4f3bccd32c10ce6d9e6f85f84df1b376c33775f2103a7fa2e9f056327a72d5ef65ff234639fd273a1430230b52900fc71e0afb54ce553ae0400483045022100f9e74ddfb137f0dccdccc565282408fcb25341cbebcf7e5740d4b163bf263c2c0220534b6e0333253447eef275c0950f204f343c55e40bae1f6b072ca0dd38e76de30147304402206df2d9195d3a4bc52ff0750d1030fd7f03cfbdf949b5925627bf89d9b07bd01e022042beebce9bfca60974cdfc68a1a705eede66033510d4650937e2a0668a11a1d10169522102ea46e2903c87a3c432aee303c0a721b460c579d3a62a7628eefae789a1ad24be21027cc688dc9d6bf1277de990ed48875d6c8157414d8321fc53f1cbaf385993b444210369ab4b8bb0e3eb283bc1283ffa6aca762c8a7cc2ddb3452420b37637d42b197453ae0400483045022100da46331b6dd3dcac5ac03281c722b94c77edd12dfebaa44e641d4fd02afb61b402201b39c144c8f2e992483ccce88fd3027f028033121d00b7e06fc69d853326358a0147304402202a38c12f29908a6d6aee7a42e07c0370e76fdcac7efb369a3f4d7e5bf7d3ab9602201fba420a6908320df047301b811dfa0756ce8cbe3122375e6ef0e9520936993e0169522103c1dd95299eef7e95bf5cc11799832d2a88078f3be0f0a2d5340afaef57c48e452102b278156cb8e7d3c753c22fd1ffb0747397b07055980e438df6564ec655a5e6f42103887941faa582262d1ab00ab7fc55151070ef94e82d171bf92d0134c40ffad69853ae0400483045022100ef9a94a9129cc4766371e9e2c65a95894f867b51ecc22c9c388053fdbcf9673f022005f7036834a6bd74591eb540bdcb5fbf56c0b97d1b7c17d61f6f3c30842829860147304402205608e4e420a2e8a18bff8b08612d512e29ffad1c77166586b3dd645bc063262102204702bbf29c879ceb243dcb4b4d7909b28f5971394b8d2bb7cb25c9a0a91cf1af0169522103751fa9ea840e1d3c34844d75cf68844058f66f4ec4b0cd7b1b39c9d381539e5d210379d73b3d7b379c4923aedce86865353a58f4f2abb2d3573e1d3b63a59808e0022102001d88bd373ee495a94e6914cd074d93a6defafa76623092c3fa99f23285443353ae0400483045022100f43d441340ff71953e610008b3b3465d05c15ee4f5cc4236a81b574951aceddb02202187d56f5439aecfe29e21027b98ea08ff61ca592b6adb26b4350630fabbb7840147304402203871c6d98bbc81862ffe52e2a7b1dfb4b44327808454225af09169925518779c022061327a408514cdb14424296dc104e19e9e965db865636da7e102202e42d4bd7e0169522102a5d2e99ed495acb1203a8fd32178e090b2c692c60092ba4f169c9a9ebe2eda9a2102a3fd231a0343ca593f662b69e0c4557223ada866d1388c691aba90bc3a5959732103feeceb5dec826703d43bb37b9a425f3f795bb587cae15f0e8682ad8f57ea40c753ae040047304402205f2c44bb85e7445d55e01e6d918649905ccd76f2ac19788dce4a32012afba6d902203999747ca81283810c42b2594f86fd5416847f9df41476cea9aeec2a455ca5490147304402200e498b2abe84109d905e0b22f0273e4600332b475f979de985ecb48a9893234002200fe7da968bdc8dfbd2acd242368f40235868cb6899397db66c06c7f6eca802da0169522102464e8bdb854ea2f47e5906ce43c438419eaa97158232f230c66301a3a16049152103f89d07eab4059a265c94835b321488c728c45f68f76fb3d97b51758ef5f966c82103985999bb3d6d45cfff9b3f78f63a06f762e960a81c5abb01ec8fe700045b319653ae0400473044022016950e38c4cbe3a1f67fe762b8ddb0df06605c4240ac9f1dd17d5bb19d1d1e330220409df3f55683bcba022eaa9ad51dd323bc6cae76f9e2b49222d2ab1d115b244e01473044022040a6f854cb09b6ba7138831054b13f10dc780c4de39a8ce6a9d2ffca0cd46f02022030a958961a5e64324e149632898445b5cb5703bf6c6fc1a2230760f98732cadd0169522102b4322fdf86c54f9b46a5b2d0eb128ae87269daff4932c2b70be6f5513266b59221035dac0c56c3f002635c319b3fa70fecb08407758a606bc9c2ce4c35b7666257782102bbd7b52fc9db70923f48d5470a6cbfabdcb1fbd028ac15eb543e891808df7b9b53ae04004830450221008723f159e96e71fad79ca9b01dacce2c8e2a4098eabcf36e3e740d7ca5da8c4602205daa8cc7861e98da911f0313225e67d8f625c19ef4972fee9f5322a31ebe7c4701473044022035df05864d20006a55d0dae5bb62ffd81b819a79c4278b19f0fa9dc9a4857ba902202a0eb5ff87bc41d921277da244bfb19ce75abc62dbf578a1848a229fa691929d01695221020b8bbb2cf5ef5fcba7ba9266063f9b2044df9fd629d942ecd3c559b7a6ba0ea2210368f182b33cc65983f750e4938fbc29ec54375c9f87dc37cd090fbc0e68b83649210300412fdd6f99bf55211c752b9c834c3f16755be842a63908c1e78b94d0c53f4153ae0400483045022100c176ae26dffdf902644afc6e0193d5dbc313c81d26d0c2764178db63844842c7022014b36ba709698a54790feeba4ef45b08c2541c741f488fe6c5f6139c8c4080d501473044022071717362e291c6b9147686b7ee88c5b7f12bb1ddba29ed801017804ed6999dea02207cfad234c129c022a1b6004e441880ffb23ea0f6469cd468878f6e55e9dde0f4016952210286ece0003eca5150080bca580ccaa4d3e0d6a8cec60cba7b3bf2a3084abc492a2103876aa5936eb991929019c0ba6e0a9e559dd34dba8796227bed61d47e872a652c2103295f2829cbe58de3a47dc3a4f00c0b5282bc6880101d21ef75dbed956a5a316553ae04004830450221008c86ca1bca9667c37ecee8a8a44c9e3f9c665ed1233a8286df8adb69cb51fa33022001eb3d1fc62564c9bd81f60ac3ae551dedb6aca361c0f96011e5a81da49c95c301473044022002236e290d5dc59bd52b03cda35088699dd9cef518746cfb64917061ed2b9985022008c18032a789501f0e033477b4a913738813ff9ae7a872fcb1c2a7a0e504ed6a0169522102bce3cdc7d6d6c0c458b31a870bf9e1ca3adbd24f28530549e31fd689bb541cad2103be2c3ae62d2a26d69552b0394ea700100e561208d3e90f8e6398b5a4286ffc24210213cbae8df929029d9d6e573e24edec57ed97d9c39551d9e45fd5a0cbb257e2e253ae0400483045022100b4ccece28f0419094deeaab0e8a1a897e033540d18e5884ddf4e837543b009ce022064eb1ce4ff863b426358e9df76f002d607e58e9a2233971440a639c8b4ee112a01473044022037d05548da2673c7b7509de6033026407f7d1b9f1b3dd00d594a150d38cbdce502207c2618f7a26ae182ec45735efa24ee6a4a369d9fb8b21218233b69a57584198601695221037304c062fbc8186f439b9af7b1b78c9c180a122a1d727035e6980b58d6c675b7210366e967c1c1cc590722f86d346e9c0417a948e76e66cffce5e8948f8f5be32b8b2102771ba9c96af79995579b2cd9ef0ec848224c62e6346061b691a9bf0bc2cfc9eb53ae040047304402206d3d814901a19ab5c152a4edd884fa2da0de0852d452819f7c0fd3ca29a1711e02207f4c12176149dc07ee8018fe63ef7b0d0d644914f7146a83d72151806ee729f701473044022071d04af38e71fadbda7dc5c805bfbbc7e16b2cb5456161ac5e2cab1fae7c928502202abeac31bfe0ab5cc50a0e9cac2ced424a6ca7234e94bd992cb090481aa85c9f016952210259cf4752041d516ab6209e567ae3f8597a723824b38f4565ba61a94b3a4de5ff2103154c8d3ba0a28cae7c40f612ba1ed4f51c64ac4747650e18120a2882ac096a95210364df28e592fbe3815a1013dccb767fd14800fd78fa1ca97643d4823d23432d9953ae0400483045022100b5c83c88e0c04096d9c4610bac15879b11d045ed9ca2f90be11d58b9a0dadb92022022ec21ad6258585eae45a29206c0f1ab4867c61c56e9e82d3fe7d2ba372a1930014730440220119f071c3cfe8eee023e5028e79a42e8b53caead560024605456c19b4359079a0220631b89617af852dd30e7133f2b8ec09adcbead757779d4cbe226b9e2de7fd5b8016952210297678ac1028610213ea21db21a249a619b1ad9726e32904c78f28fdd8f46ca3b2103dfb2f5ee2fd064e01694afb93b949915be01f48897e6a3506f05fb28a226fc1c210256bb348f25f0944de8dfc2d82ab377fae96f93867c94ba20dc2fa9a5b1e9e6d353ae040047304402201d91129642d4d19c3100ff3c6b60b7ee2f6ac5e7a6236a693f8735ae5df3d141022014969eb6b8ae56b30dff2acf9409ecbc87e1cf29dd3071f0bf63711e6a5ff64e0147304402205d5d899f379cea1b49b40b4a343808af584665a633f200ddaf942c5321cae34402201f2a4fe0a00a1f5835bfe7d85f203fc671dcf9e4b21ce1e21618e30e5383f3a50169522103c1186f6a76f12ccfa561b8a6a2eabbe6f80dab02e2d1f5c749375c9956fc3e702102dd1f5ad48a190cf271df0f9f5900282eb15724a47fc973fae530d963c29bab222102f42f4f44faffbe8fd2f96e548d666c16db1fb6b656260defac978573364736b453ae0400483045022100985e1cbeb522b457f3251758a187e576be1acd9d5eb61ab00bd0360573b9f9120220035df46cc19df92da94d6461a7dfc2f18607e161f02a555f457592c864e97e1e014730440220168caa6bae6ca237ca885e77f3e81dacbc7185116cb45aa428070242199018ac022039077f5b5b49dded395cd93a8591dc75c6a412b2dd3233caa8a12f72d37302c7016952210267207a0dedfc8cd23ea13c7e007d143cc82b8bfc4d26a8f15050efa1f694043f21039a2f787f843e43a6b464d8ea76f82dc14590d1636f108cb9ca1a036819ee2e1a21028bcb0f43a4cedc1f99f63bf659fff4bee32e95471b8bf4eb86cefc6c6945410653ae0400473044022020f85f966f79873704f42b00053ef7d54c6733ed1d736303b8929ccb25abe39c02200f8c9d94021be3102490b6d8939eb0ed6caf3b41cbdf60ff1e9a7d48612a486501473044022013ba1a90ae495eea23a5b2c9f6e097c3d439d48f18b45ed873e598974dadcb9a022024f5f178bc234c1dcfcdd469ec1f77c0cedfdb7669e88f894977e35f40f99cff0169522102184cd04de886013d1c8165366ec588085048f6a723f568e1a5b8f4f87ea221322102d71c306258c1c2064be8c3e797d6a0554bfbe4fd6572db8bf870f7bcd882021c2102e6037c9e21945dfdd13d927ac09069172425f3c76ad8ad838d0f044b823f5e7653ae0400483045022100dea5eba25d5de6ea49514ec99d28fe7d46d48d8e4c99013598c5cf2424cb92a8022074c39cc705fa28ad23140aabe1376f9bb54e238d149e50d1b8647e0344462e070147304402200178076f9856570be2f60ddf26acce9ca43bb7cbc7c6d5c3a191dbe66bb294a00220707b96ec2723943dd25c506699e12d74caaa66ef7132130fb430d7ae81e1b05c0169522103cb0787ccab1a09422f8f22bd9afd2e2054e9b14d602f0c995879455b366315282102fd191136922dca9ed883790db6dbd120257ddf2f0828f600bc938250d3b426e021024f7d213829f49ac32862ab322f4eb4b3cfb66915ebf970310a5076834789a87253ae0400483045022100e744e213a8bbc66f349833db074cde5ed84a23575b9fa4ebf028026a2403418c0220070e45a3c216d2d760df3245ec5dff3e48e0d1aa6fdd52f2ad027b6390c948e30147304402204aa7048503ee71a7383c4fe249c248df1901a152181b90271fe5a3850d5b97dd022042d3ec6f857bae4f536dcbaa0078aa39d173dda87d6d38f4e7b1cb49d19030f001695221039ef44a5362b66965c95fa242be030b5a2b175fd9410af3b93b50626e2049e08121032939a177e75aeacea708c9c1c67b9db697a1119eda85b19ea8c76f6dfc2a9d5b2103201182f7becad8b040eb95d89bfbbdfe459e07cecbf552bf3f1d887c272d8c9753ae0400483045022100c12a59f77edcc5837670926d61e1ba7a7ce910ad11d562f7560551e8cd13cf05022015e9d7438373f901e2aa2cf409221e6c0fafd4798187ff331de3fed93418b17a01473044022071525075bfe85ca568e862a9cc04c738dbea2535e9149a8d5db6619902cee66602201743b7f3f1c756029fa3ae035b3f3c413456971509cbf69eef54e7f4adec85740169522102b1c678a91ab267c2342ef8a4ace0b713458ed0391fc54e057e90a51da68700fc210214a7aa7f59acc75fb88f350b655e472c58218ee404e01a72f1e8c3ff9c139a492103eb79fd02d6ec177de8c9c5f130c55b6aafbc548f145e849e6bdee8b838fe800653ae0400473044022008598d7a533e10ab3d2fc5ea5fbab3eeaa0cc69335d4f3d6f45d0ad3b840c5f6022060e3929bc386e9d01c0de054f871db141a9e7661c25738fb6b85dca0219fdcb101473044022035bc0a00723a336f4e90cfb8a24592788d29069e1a7d2c4faee7ce831f6cd86a0220743342c402df54e82781d26dbd40f4ec93194c695df68beb29dffde8cfab7b050169522103b4c74bf8fff6d6ef8bcd9e220c99b2dd0b5045b12630e11cc0e96d19d9a0b99c21022ceb47d0d62dacc340f5bb6fc6ec485b3d19ea07a193dbaff8bfa27ea6895d0c2103e2c0f1c13982b034521a5d3fe9239f5d326a043eefe806cd03f9037853cfd8df53ae040047304402200298a345c2062309a4127e62209768376e95e6afbd3bddc2de928c0ec3f555b802206ceeb74fc147072b2952ef70f586e9b9a756d3ed85e754d6465ff98468b1b20201473044022068459b56dcfaeff2c83e7057e59e35212dbabfb16d1801ba2a43730fe9ca44a90220564f0a568334428f10fe24cc92347c12bf3c0f465bd81828078fd556da1b32880169522103a0fd1fc36b4b1f8d9fca7ef23e8e5331b6bd6d5776ee8e63e64e0750158e510b21020379111f4edfaccbc34beea4a0c7b7a51bb1756f5359e836acfd04217b7933c02102f5587360a5b969a04f59be3790dc6becf80d7e4ca826f8e1585ba54e630e6d8153ae0400483045022100f79509a2575492599ee08a6a721e7faaf2706d0e407cca41fe9811d4f737278202203702bac9940dc3f878cd76dac8d8461d820e0ac7c19bcfb2ebba3021b2696bc9014730440220036950dfe5f93d93e0b9af0487ac7ba0c1f5008129bc4a318dbb49b1d5f2db9402207067231d071ae9f47e3d79b8e20f58cff5117d0d873be60b7372e526df8d6b2f01695221029ce8a38d20e1b5dfcb1e4c6438c53fbf75fcc3b1328cf294b403583040b3e7d721021d577ce4789bbfa1c01997551bea5d9ac11b0d85791a103e911de0e72799fd642103ec1614d346b951d3193ca4a35ca7fd0a8980f58299c8ebca6d431cde5091293653ae0400483045022100fc713e60be2484ca544162b11c4ed9398f37d586a8082695432fc4d472848efe02206ffc9f81477338762ced204d2a9a714b73722e0729f33744a3570c20a537a7070147304402206ecb3fe153aded3a29855512a42ab6fb3d733e1a4fc27c5d4482903c64fcd9a1022006d82a3602ac2d15f321c2caea818907f5fcd71aaac1323a521ee15af8cc058e0169522103468eae3246b481258c410ae63ad13b9feaf20ab58a426955a8034f13abf3c1fa2103c02854fe8f14b9e4c6bdb9c1a0dc5b71541d2e8eaa87d047928ab4b273e323ff2103678fd828cb572c32892d581a801b50f8ee2964d3c25f1669b3151bed20f0ec5f53ae040047304402202911fc3aeab2213fdfdff4a837460783d19562421c49599e964f355e3a306be202202d510506236413028b09af2012941beedadc01b123ad6ab8e2ce445c3f1f053c01473044022007178624bc7aa04cba5956dfc9d17ddfcb7a10ef956736d019f88139bea327e0022069bec2572c72ab4dde9b16407b37ba7e31eadb008b083e433991a7013492ed000169522103b62c9e4af5651e475dd92618fbdf8019c9e2ca349f400f656c07d3c94fcbc1fb2103a08f59eeeb7affdc2bac11fe3588f052c6ad3e7852bda7be596b84d37f3b9d622103e02857348f96256080b97889d5c125cb79e1886ae72e453e9c9afd2e4c13264053ae04004830450221009c4f43d552be4a6dc910aeee16eb00006e2eb8e858f290aa1094201ccd2c82b202203540204d55de1ca4a495a36e6c052ed87297dbbaf5160834e9997139f02fd1c80147304402202b8ca7f727fe1f32c8ef7fadda3bec400c953f3305663da0da7507a04264cd0902205f3eb020f5bee25573a937c547916636de4e31e33b0f892ff0c956cb28716c970169522102ba85633db3e81c9b19541e80d81af7862c6f76f716d8f9c48497b40922423f5c21038197f6230b897b7555a0f07637c2c95719895a9b6f4fa47061c26a2c842178a821021e273fd5525d9dacfb98c2f35101ff6767ea41591f4e156e1d6d01e651ca5f9253ae040047304402206f124b8f3672f600396bbe3f99b44367147c15bdfdcc9e942aa84e52d226eb8202205ff0cc4c6b9fde648319362dda50e151ef4bfa586e8f59fa86974ea36f1766700147304402203be485cdaf420ab46669edf378d288db7e56477d20c6c0e7dbd170fcbf42bc1302201e9ebe87b352cc7e9e39fbb8db3381e471da8a0e748ff4c21eae51217bc365c40169522102bc86763b364a3d22df0ee1b5ba4c63d74981d19c5f6737442f2ae1388265a23a210235dea43389b5a87c2d68dd33d8499b66d4c1dabffe5c5117505f9b71ef55677b210232ace45738604a41c6c524d5bfe01292049454616198ce376e37fc1ac550b74753ae0400483045022100c27ab619c64f41341f67707c5b6b587f792907a704304d6c8f8549206a8cc09f022020efb4a898e971b5a34329709bd24465bbf415ee8bc9b96b3e4e2da5f35e513401473044022023672762826f9bb77ab022add5508c2326d22a248e819b6a2be47d01fbafc3f2022074551a16c99bb09a5206cd3aebf85d8cbd773e26aabc7c41e4a789a6b761bc8501695221032c77e1b2c0d8b8f6c9245250b6fac33fc91a8268649a4cbcab7ad31ab4344c052103cd6e66d2fa364b53ca0394d05bf2cdb0e53888e4a0ced8dbf65d300fdc06f8842102a9ca9baf787512dc2ac3fa16471199b9d7645ca8a256a51ae6d88b7aebba3a0b53ae0400473044022063b897bb2523352a56241ac7cbd463f331b9d7956f6a80c3db6f5a9b110f67c6022013b60cbdc5e41eb6230f6732c4685d6f0806a3d17431c650454b93411fb1f60301473044022048669f25b7578e974714e7f07cfd766ba6e385e8aadabde33cef699130316132022004b3b67c2c328d12b975bd43df109410ae62fcba9f8866afdeb83870c22de4e00169522102ed056b0f99a94f4dbf03cd4c0b907eab3c86f869ccb46e315cea3e8c9cf6b5db21027b64e38885a4fe68d4ac117598d3805c9e58405f311175ce83191decdbbe9e1321035eae00617333bd9d603520974be30b9f70abcd03da7e76beb697f66dcfb173be53ae0400483045022100dc4dd2b771b2717ad99302b6002af36a0d05ad3ca56eb94a3554e7fc8898baf502206129481a26e46af7d0c74a8553af06891e1af1060564db2561b903da37e8952901473044022006d27e131125091a5579de27c85590a02475883595718b7149c604c9d6f7c2fe02200f32f0f26e979cd6524178058e9fe201510f19082e744ef7c7955e5571ca7c160169522102bd1287d2af60dba826d506884fa316cd7f73717eaefc4307f699f9a633d6053b210397eb545237ae653b1d37434ccd26af654c6692a53789ec532f9cb73b338f63c52102de2dce5f367f13453f04eac494384177ef9078d425ab2e4a8d135d7365566cab53ae040047304402200116beaba4debbc58148bf19a4a4b5fbcd178689062d355bcf57309d781cbbb602202c41e743d0b6fb3c3dcbf3e3af58958bab257832f1322ca9c9a998f2c0b04bd8014730440220230787993bf8112a1ae6b05df78c7f59378439724ba15428234ac28d7eb4cfc602201b396afee84de3f6c27010e38950802de002dbcad275454855410c77e432bd4b016952210370887f4eb55a4346b499b1728268e5e18ef7c05c9fa94a4d5b534afc3aad668d2102c5336c81410d2c3ca76a7a902ff7c06accc00d5f2963d6463300457e3ce6c213210330cab45af06226bd2dd5dd198d65958fc256792315fdf96951925d0a8d264b6653ae0400483045022100dc286766bdee71804886e35f678ea8724d926701e25b1a87b1f5a86de2b2361d02205b8ebf0c07642fc42ade043af4bf0f7c5110086b8763927b0f91bae1755d30760147304402200dbf6d39d0d7c13a9e10d747ee090eeb3a8acad6da22b8fc09c131e32f2cbe020220494e76f9490e2cc32d5388c50daa71b3ccc541ec2e22a0c730b4b1355ecd83370169522102a3500c3db2ac8ec3a7a68c0a4020d629c5b2d8c07e3524ddc4755cfe58d95d882103b2ce87553423a40003c84d835fccf6f7131de2ffb3d9bf7ff774db8e49efe2d9210248aa03396f1b77aee459f0d91e8037fe355ce08751580cba03b290a3fdb0d89853ae040047304402207ec0571e64a2f9848e66a5446d5c4b3d05e2632143fce61518fc1d40e31e2e5702204c5ce14fa3b5052f388e57159f8b5e3512d51ba9ab56409baa93cd7c8e4ebaf901473044022000e3d128cedc98248594b63cbcce701236d4a27c708a5c99f833cbdbe1689a5302202e39e36e57fa5582b845290b60678cea5321ab4f198c0b2c5641c84921cd453301695221028f4e17578c025b8c990e546c410c1d8042870a91bc3abb726d612718611e22fa21035a4fd9feb2dcac789bc8e1e2f5e467395923582bb0ec571758b56efec99570eb2102ff353706f8c67df8cf662a286021b5fb0676529616ac70175f7f34e25373e9a653ae0400473044022077cd2e8969f25342418d7ef9860af53db2074f284dbab27bebbe21a3e9a758270220666fe3acdedcb27a422f1bec0f1a41230501e7a0f47896d81064472c6599e8ca0147304402205e8b34923ea29db95def51fcc11a48fe73b37cca00718516a75926f37c898d4d022018e5fbb0809dea18c00e9bccea8b53fb74c8e75010636a63a60d04c02c5ee36a01695221028d2f32857b6dea71fb838e54d0a75a612bff002a96310b884f291e01eb0531922103afd912b91038f4861f86250b636255ba269a1acc5286f51aa06f50d0b7eee03121038ab4174e6fe5dfe66857d074ff09c659d4a5d8004f3fd3779a4630e48ff0ee3b53ae040047304402205397fb81142ec01655cfe0e29f1f558047cb57df4f825df37850019da1c6560f02202a6eba155cdff7b49ceadb4c9f0b508286103ad37bfac483cc63420b69b49c4f014730440220146c52ca1c2202daf07039de657838dd769657af795dd9a041cc5f6b5002c262022068f8531012a94ed964ff3de7d741d1eff293e0faec11855dfc0da62597261b0d0169522103d26ecdd5c52b44228eb6199d179446be8ffaa790dee13a5815477491252504ba21033a42dd622177c37da10848ad8551b7880e4b086ff72bb3be1025b2190e1fe5f82103a4d2c806c5be31d13ca1d0070b91a6020e680e644233972ac202868e8833640b53ae040047304402203ecff2091aeea0c8fcf8db845226b685f39caf683aa057b37e69a07cda87b7fd022060b2a71037b1b0afc02359c06a2342c259e0ae7f7a9de1edf1bb58bfe389d40701473044022074935ba7745078b2fc2e8ab9723dbac3cdb86b1d4665f77386f213efd9d3f622022040da865bb90e4b965a0ef07f59a844a709a755ecb3aebe9302d76fa4e95407d901695221031a076d03996ee8677e980d2d6000f57e43a8ea9cbcbbc4ed9e5196551e865dd82102b3f7974188e6e4ed5a0e50d97a46b29f3d64fdfa035bcc3ec9c7c0eefda0e00f2103d6db0ced100dc5816f5c4d90fd43006b536bb8c19c984093c858e95c5cee4d0a53ae0400473044022023e51c0f2ec02c8db6807b6521d4369bd6cba71efbac7082ddfb90b7642978c1022061485fa601a5363e48808e88bc641c9624fc875008b088b489ee2da9e3354ebf01473044022053a4c33bb09c73e9c2e9b62bbaa244ee6daf53e27e1678b51bb83268e873631a02202232318ea88c0bfbc3aab04216a522161ad43ea9ae075ac7068ab9986c587f1e016952210277d33ffc3aaddf83bde58db2d6eb62bd9fe5a856b509681a63bbf08e8791b7da21023c1bbf7acfa2f691b032e744f668d989ac346e8410227872cc66631737aa94aa21037db8f3f3e05e87ceba7ea3c8d395f0b9c3f233d23a26e21e2b10e3c61ffe419953ae0400463043021f575b2ab498aa7698940079daa956782d3db43b37af96172f6491a2b9f844b602204e1dc0bf672628641adabd81de5031bc87f66844e41548f101cd8914341ea78101473044022067e59a735eaa13585976f088adeb7e9ee015820db6988ee4d8dbf6221b754581022040f124db1389fcbe64c7c183c1130ee48e92a3340e7772f38df066d7dd2b2f7b016952210216f751548db0bba253fbe421948cf73cb3fb58f176d91903b0822ff152f4751e2103c99c9e339067941acbe6f4f657f948fd371a553a5d07ea06bafd3d03ec454ed42102dc211d876046561be2f35176430ef1fa3088703cc26aadf74956b3db34c024b353ae0400473044022031774392fe7dc2690d1503810d16acf568c0607b015eb3e03a13162bb7ade201022047adc8bd932fa89fd2e0bca2f271a93cd55c4fbc660575d533be2b9084b7f03c0147304402200bf515ee203df5161dfb31acd766511b15b2f48b7d9a22af53a486a314c93c03022006e14b891a16f96e5c562ca53c5befbfe9523d97c2a512703796f178e3d19a7f01695221033533a5c7e3788f522812bc9a48f4617f986107d1c031f40b6771929475a41a7a21025c1b6afeddf09a1b11e2f386a6bb0d0fd9bae1081a44505ec743409e40d092a0210253eea30c79822ed3657b538d9bbae6d56a7fff8c7e27bb2272c0cf08775e17ab53ae04004730440220690a82b90d14f064aed68472d432d6f25ceb6caedcdb96093d13055d34bd1c8a02204d8caefd69068c4be3c95f0888a731183d90e816d83e404d9ca3b7c2a29be3180147304402203f680c94d9c6eeaa33d74851d2da246cfba90b3bd3c88ef789cfb2f7aaf95f6602207cd6b24dc512920ef64d35ca73a578f095deba0db8d868dffa39b4cb13d6912001695221020effde9ff83d48bdc6417e3e3947176b3f37155cc147bed4828022b1880acb702103b20fa2ff274515b4a1683a1081a76de0abbb574c4c391660196b4e4bf496217b210318288c018903677e32fb43d7a689deb3b5925ed2f2102c3ff0d6708787867b3b53ae04004830450221009842a81b5c94eeb8b4f69b96d5d74e4c92bea1fdad5f8ff8e1453da674c2a4d40220771e5349c9d41f578403ea837c9f94a7cd6f374e4da3c9dfecfb2d2e8e7d35e10147304402207a9b292d89c25a2d2a9a1cb3c29c2cc4a913ffff53d1850dcc80dc7e180c403602206dea2e36b56f43aa5e4299a7a18fefd3fd03ceef7588cd9bad1ff4ca3954c04201695221029b845a9cf0506ff0612f1a026e3312b723aa1e3e4fc8ec7646bb5671f5cbb75521039966f4001bbe1000f39258cd588eb05db4b0153b2aed3f10384b159c88d7a9282102778b9bfd748858f8d68a8374c900d57d0935ad88211db7fc9a6e1dd51eae89e853ae040047304402207f9e628f6be2d3191f2dc4cfa647730784fd394b0fc8b8625fd05e9e39d52f0202201bd01a3bfb32f2186476bada4c7fd9d91309a55f2350c946a7fc4329de69282001473044022046feff56d7b99e75baf86c20852f4eed2c5bb7f5d54beee87457ca06d7982bc602207a43a34e373069dad7d17682d6f85087bd999f0e9b1d45caee7f18975e47248401695221023ab4032c8fb9aed39a1d63083705f19d02745284c472d1daea13d9751d29bb1f2103d3ebb8b7eaa509fbdd34dedcc4474f0cb96dc33a05e695742e90cd32deae18ce2102c1f8a6394fd68f2714dd0cc5d69cbf6a120759d6da0ff1d878f82f1203c570bd53ae040047304402200da7e2d0edfca7a0ead5b1f15945d8b59773589d42e0e1e06398aeeebf09c950022014bcb1a8381791afdc507db9559d4d23d61f935c1db00c11b5b7bbc4c9537ad1014730440220460833e33201e017f81cefb0f5cba1e83051413e96a2fbdfac243725d3ef461e02203c07e50175bf358a882a50b2370196a58934441a04e45e2060e41c8f665c5fac0169522103832cb3acfcebda3627fcb3b920b0e9cc8d99c2a0a259de593ff48f811564a7f72103aad6b2929ee0d5ad8628227a140797b01efb387e9c2bec5c3c7b0dd8564643372102eb85405bf21ba7eb7b8d357352fc15a8daeaf2522035c91f8524d9810668b63953ae0400473044022054fd292df6c71b6d7c45b0584fcd26ad286f23117c82bf25fe44dc5dd3afd11902203c51ccd71a335b8995303a0600dbb5ba3cd0fe6a50abe8cde3b8eeb4087f160401473044022078ed5beb0d31c71cf41c6a5e04751db9d2b2010556ba558780db9387145184b9022028f8dec2eb58ac1e34bf0c9cbccb1d9739dad21368a33d8dc0156efbdec231340169522102ab253c077bd2d552bab9b5149a4bde7b6ecf885c09b7889ecc1009e3db42aaf4210355ed01eefa558011e0c72767eb9563d189620754d0fb9c0d501b6b3623c6635b210279bb57e847a2d7287cac644843b3c1d6dc6f0e1979f7cdff2215bfb1f88a030353ae0400483045022100aa3e8185dc144a536de48550673da0375c45a39a17445d7fc8f52cfd8574a15002203af4e65b97b2c8b398ac28a7d42b172fac00e75d9efa7c8ab429c5a53b82b47f01473044022066346363a979f251ddc61962e71194d7736906589f89821655509c26378b3a8c02201d7698e0ef796d7c24bf1474ea63ca149e5549de30e201d3fe51144d3581ab2b0169522103c0c4a1c67e7b661290ac0b2a1179c7d7a01641e93c677a3fc3e79c9f64a2dea321034710b8f727c9ee01c6e7f1114ff0139bc91fb728395d319b17050ff0a6b3a21b2102e28e62d5a650dfc69aca4ee3d172947c36faed6e592fc236cdf8a352cdc00a2753ae040047304402206a18638cd5ee16ea98d73035b8ce01be39b047120fd8db96fc1624c2a6eedb7e02200e4365b9f9f95f28566f8271bbe00032bf96ca3befbe9098e1534e0b8110cb210147304402202d0c5c02738370349df89f22aa5e75ff39336d7ca977ac5ed85a4592501a357502204c2df84c0a1c3bbd2e5c2d4066e2174b7991d54f749be44f3bf62f6cc79ef7e0016952210349e368203c5b0b0f2eadac444e0baedfa8205bb241324d076a93fe1e5fc0f0ef2102632a630811e9e436c79ea3820d8cada9a17183ea52fe701881a0d234ca1fe12521021ef4dc98122c4976769560680e55aafea9db27209a4959bed0bbd3bfe2b5b74353ae0400483045022100f57a63079f06254d169875dbe03916b8225f4579a2bf40f526290d85346879af022072e594c3afba0e90ccf91e6e3fafb8429796d4ed0b8ffc1fa1b42a929885d30b01473044022043148440af28a3aacbfd579fc5c75c1c6bd071c71f53ce508de9ccad0c3fad970220017ffcb10eb66a52f600eb6b0a4483232eccf1da7e6fc50dd4c30890b79b5d84016952210226d384f062730422fe683db3827de205d4d9e632209df4d4caf0435741a5439721026a5a00ec7fc6b31069d99c693820d5ca55a7d0bb16d35beec1b021eb35b12dbb21021136733ed1b7ea2f8635fb1cfb2b1c29a098be7bd3849b7289c4eb907af4031953ae040047304402202b37e9ef02792ae727a8d23a5ba5ac3beb65db4d8fc9c648c2b5bb8d211156d202202ca765db4e19504d697fe6f71953470dc852e69adf427ff96a28f78e8289ac5901473044022050b3c6cdbad8a7598cf81f87c763c0c2f3b0a7378d5e5859b54981b3c8e65b360220167f1ae514d5bec96ef09b9bb76a8341653464656115c94c273c227bd39b58d801695221033f11db8ec1a20de1d1aa05c417226db86d6ee92b0e7a7b980924b19f2d69d5b72102bb880c200369b2414df2981b88b5cdeed9da9b755825f27bab05f37f46936067210355cc997cf68bb43810a5061a7066957240188f0cea083c6bf01eac1e9313b9ba53ae0400473044022032a35c59bf8da262941f12477a35d422ee18bcb337a34c4b4a6cc725fabe988e02204449eb0c7dacdd27d77659263612ab5b0100caaef104ba73de697cca488940ed01473044022031e120c845f668357eeee9f5dd4a3f2d1a82c85583a70b5b66149bb354937f8d02205b888a17e085ea217f94292a17e8d6451366d03651bb9865df14f5c70e28e63301695221036aba920b391af9a7a4dca937fd3528ef49cbbdc6976f36009d43298e152d05e6210382ecc2862d801b17050c299a642e0bb1b2806ea494712c7751f0f5a5f3a3a4562103f3c0d902cedef44bd221f4f3f262738a4b488d4a12dbd4ed7dd2b64c3e0fdbe353ae0400483045022100ab7578c0f25b9743fdae88ba24aaaaa74307c3bc96438af95cd47d323488d0420220085af6c8551d66ca047147428074210429c7f9d8d4eb12f2a7131957cf833e0b01473044022068c83d812c834f13d1d59a1e1ba06d582ff596ea76fa55d0ad1822394c4d8ec6022063ad12069d043b1bb7268ceb19e050477e4a69a39ce961675ab3d763a4cecb710169522102c54435f15f33ecfc94dbcbf4bf86e6c442119ffec9a571474bd589460af999822103dc5cfcef84899669e8b0a25ed8eea115e170b64281d379c66fe7479dbec2108f21020de7bbcaf1ed3e9f1dd65e7009816f20e5a583e99c6db567ee8fdf23c1a49c5d53ae04004730440220167e669bcd1664f6e36f85a25ed922bc3417fefc9b8d41f5ada9bfb64292da91022006a148bbdc844af9abe1c122ea8cbef3a27a11420962d85967fe432f1ac2f85b014730440220335a462b8c00b262f915f5e4621b851cf87438aaf5a30b9fb0152244ef568e79022013e3e248c9e11462ae0cb0b02e5a09387f1240a688e3214abe90eb8ca2756c7d01695221025bffc0cf1ac94fc393f75864e7b646b386d53260853d225c06c9f63a51ebba1f2103a8dbd1d388ee044547473d009b94a0cfc2ef1814b0a4dbf54c90c8506bec540d2102d9eaeed3bb17d355843bae4ab7d5336b680841c071087cbccd0e39ecfb65643c53ae0400483045022100e4a38011b0b116bf03728a83740d9658a0a8befc3d5f48c175e44a78db9e93b602202adb707ef0dc3527145c80c038792104134f24bd4730e0afa9a275570c3f1c9b0147304402207baf4a07d9fbdf98aa51e6185e300cc0bda73b9c8a8372f6fe06d8fe90bacec202202c65f19018257b035b0a1b184b6ff020d998621d6baa8123b8372b8bbcb0dc35016952210261b821b5d63253f6637da706b32df04243c71eeaa162a241a36c0acc9eda726e2103bce64b8f9037cc0ffcc614fe02073e3c01262f0123d7cc143e7439979fff9bcb21032ace8984fce735b3ff0535dfb23f82a359737ec7cc3d52df5f9960f2fc5896c453ae0400483045022100ea400f3e88f65df77d4134615e3f908dfb1b6ca99d334c9fa190876659366a1b02204b278f2eca814692954ca1ac3708e608372b11dccd4f2e046c2d423679bf504701473044022038f5542b97734abf2b350f6055ec3373ab58e35fc56a6f2a0392f7deec5272ce022027f1f1aa668be7f9e6c5f32511ee7ef07912cc07eb4369a8477a3d8a0f5cef340169522102f423d12d4de47ac34cb5cb11de67951b3bd2aef1b337d293ab2eb875cff8b5fe2103ad78bbc57351651d3c173c4a67b5ff57bb1bbf3c4a8c8e5d0506ec31457a14ba21036fd7c4456339e12665b5c73033dd6faa2fd9d17867e3ec6d2eed36d937682b8053ae040047304402206feee8a4f95e0f49deb4e804cd6ff795c84eb2264487073aa86c52c00251e21002207bdaba3d4b95a2d5e229b90d5cf7dca920460ce561f2a4ae1c696e5b70c9a4db01473044022036fdfab5c08d7998c4547b11161c3b8ca98d53b80a047dbc605c53d0332117c7022006b547abb381c3bb45ddec1c3cf5d029d2c6dc918d82e9be31f5df2be42e7abd01695221036f4be579b777c4f4a09ae568b278a790db1bde43a16ca1a7ec3c6bec5ed22e1f2102b4ad9c46b311fc70528a54a657209e458aad2a938a8a22967e962fe80c4d4fc22103ef92443f992bc9bb98c821c55d109c95732a67fde21ad1c838151d7f197126b853ae040047304402206657fe38a7c2f91d132dfe1a099c3fe58f668b0219f0426eb09fd1fce2525c42022022c46d4c4fc4f284da43b572ba905e7e68881a5861b317201cc51d514bb903c20147304402206453e3ce6691b5e9bc5d49950a216f19c068a833ba9e27df5e6df69299fb8ee002207350f42d869d6c2e958e0a90ca040e81193ba6fa5ac871e5bebde0a0f0b2101f016952210375caa9866e0c3c033b6308321b3d9caad2c385f46de53d0d10ba6891f37ea8a12103bff9d4e7e34c8b5fb3f7147bd1cc4712175be31f07d95ee9c3046120e739759121027eba3493344db226e27e2d6dc2d54c58b936763deb25f92ee44760561963ce4d53ae0400483045022100a5d38f7858e0c3b0be91f710b3821967cfa75130837a92795ce0e4fff39488e202206e675ef20b6325109bd6bb0121fad2b8c613c74d2631095893255bd4f34e38a30147304402205100efebbfd5bf35a87379768f05dafd0d904aac8af97c42076575fb7f6b5b6e02201f4b8d564d7399538c387f2c92a9618652cf38b44f96da66ac34a4a6d8a94b7a01695221025a3333000b029dfaaf9aa9ffe6f3c8ad0feed7ed188af4cd9e5c63caa2694f2721026aa8f5475e56bd86ee650489bb3110211380a6075dfd81ec1d6e286a6ade5db32102cc54e60e8006d71ae9fb0901b6c5f6694d85d81c6a994214a523386f92bfff0c53ae04004730440220150b7fd9ccccf8fcff9c3aa382071e29c252db79eb954b972a1a1566a39ada750220534e0a0937a4f2bfcb5af7b020a12a8ebf5ae0e9d29ca3db9e2aafc21cce63e00147304402203c9de27ede01f15ef6f8e47a25cb51326013afe90f48497981c960042187dde602201906b88c363e48313b824f7a29d5d22adc5f4e53eb5a7ca13ddcf6e6ce3b790201695221028b73fa3876ce68a40a73c8dc0c0050408a51539b7a52e1c2b9f416bb4b19a8652102940b12737023269f6f5b2310f342b31e843b131c25190ef4b91c0b4b08bc26492103bff9ee2d054d6572e60e564a3eb1c9787be9946e94e726b2a3c4d246cabe6d1153ae0400483045022100a0de76b3d4098a36d5b5bf66428bfcc2dd97e2db7c06ab2531ac3da861310a9702207c36daf62b46341ff32b140621c68af028a9ea72463e0a293225047a3d8bde050147304402206626ba172890d28144d48f74a73cde6cdaa54385b995f6cbb702c17173c0b082022048544fbd2b80ded12d63e024ba2922b73ea4ad249462d2fa012ea0f6a471c9790169522102b941b3ca1b5a2ae0610bec75eb050690b8606dd17098487d684c0336c3b814b321030d4ff726e2fac05c27b9452e7f3dd80d75655f54f07e0fc70f698293acf34c2a2103cc03c6d4fc678dbd3159bfe82e7be3a0591af8dd38e6e793d1f60cc71faa647453ae040047304402205de5bc7c391fc40dca895e1ec3d2b6ca015553cae72672f3a214b9ad0d23643002200f05919628113f9fe02a25f4047739bc981f47cd15c83046696853439187ae920147304402202ec1404189851117acc599f4c00459ace7847905dd5de9e59b4fa2159a3ea38702201722c231b820841e992861692dfbec778183aeac172ec519f15894a49051d9d7016952210204da0ec64803dfa6f8944461d1af4611d60ddbccb72903f1ad51cdac4ffce4f72102286668c22227ddd30621bdc598acef02c889286b905426ad0d674fff2cf6642521035e14c35635da66fd3769f92474e8b0e9d175672dc95d7064a3040140af19454253ae040047304402206292fa5c7dd03771813a50b4563c7535f0be91e518c8bea95f6ecd3a780e93d002206f212fd491b91dc3901dda564d656377c5c543f066e50f93022f60df27d85cb6014730440220096e752a9e7469af96d98d4983df977bc922fe3e675b285bd1392e28a591fd9f022021abc0ef8bdf0dffd40acd5cc979e908033b6dc5b7b95f124594a0b16a1f5d950169522102b79dbbc10b708292afa14fb0f6cb7c73c1d13a3f5ac0d9790785e08338745b9221032760162b98bf35b555c3ef814a5ef483fd462b3a20d6eb1600fff9de88928ec321030c5761835982c86d525fa1513323879a4a680c54e1d72214582eefe71133e33753ae0400473044022024f81749d5034fda245c45efe2b50440df7a346a70d1a32cb2ffcc6f91a2dcbd022015b34cce03a7b1f30dc2b8a0ca716343e87ebb7f4a6ef6e902d2da237b8e5eb70147304402200a7c88803ccc65f63dc609dbec94cc194836f754f4abea213034b386e83bdd140220612024cdd330b7f5d1cb6827b90e207abe3950d385daa7a4177b1506eee6efd1016952210234317d2c6059e989b7586196cafc61b2f3dc7a86fe67804ab667b3505e2782932103bea043fe7e626ffa8cdab9188b798b6049480ea5ae8966ddfc6918d11f00591c21020b8a724269f78cc3e61a94a6d22bac0bb4233fab77c343db8e996f984d1af60153ae0400483045022100c95f41ad628e2c5dc26fdf5e9235550df49b73805e5f851c673575a07f7e0f4902200d75b8c7b84241bd56cb46f119e42cc9bd059d0edc8b519bf3bdb97abb34e47501473044022020fbb69e66ee74144c4f4c1c0bd059c901c03ade53d3d521ec40784c1bb5cb54022064c57bd7b1caf720d71f6a276b7064d3903bb9d57f381b34aa91fe399ccc817301695221020fe0fe7db60246c9959086c7d8393cf24238baf482b3b70616ef79743c5a5381210340568a342600d70c2ee23c77f9cc80180ada76ffad5447090e9be2eb468d2d8e210268a44045344f83c16266a2e9df21ec65a888df8be85a6c6dc53d65f2e39cf02753ae0400473044022053992b68b09377a165ad119e39ca76d028b96a49b10fe77ca421bfbd07f5f672022032808b3e94b7ba7bdf5089d47c8687216580f3b510e87d96aba0b2083a37d5020147304402202daceaab6a9651918807f04f03748825efb1ee3c1d5931fc36511ee66383a29d02200c50f6932c8309b6661e34d1feadca8a06359ceecc40b3299ee237de289347690169522102f49250b98a7ecdf1d171eaf2233d0ae683b55b7c384d861f10b2f65b1e329d3a21025e34922b5d80d43d681ce0b1c1903a748b1b2851e2e6e591ff8fb2cf0396883f210232c2a73623d83e7538a57b3e8a6c4f6a8616d2441331ed0251981b8169ee50a353ae040047304402204abd17e1efeed479b5caa3d3ba6a4c87d1bd7d4e0bc68911045c915871eff936022023d42e3315efbaebe5cb24672d10de6ebc3c78c604a146b5e571c6127328abb90147304402207673b5a78c4ba9146c7432e9fb9759bbbe20770af9c5cdd0dcd1f9f4c27a55f3022063292a12701d9c2f74322bd7c3774305d5faedbd192bba70181ca4e11a7803b9016952210319157a73aa7524c6d7f8842924a12b6602c922a2244741f89c99994dfc6638df2103b3896fe581797e620511660b9d0245941a04a4f94086da840a742f806ac2bc1921023a4795a8eabbde307883a07013bcbbea9c5d9ec79eda13abf70606a8b680e5c753ae04004830450221008be54ccad2bf5b0b44d502bb27e969203fbecdb0ec4caa4d92b1e64f6929817802203a80d93a3f08763ea9435b0f515a6beeb76f4d516daa0781579df1ad775e5b2a01473044022001f4f09382b3aa0cc9d669a92cdceca7c5ef87157fc04a6d319d3e5fbf5d20fc022006b795081380a70ec494b734796e6a6c9d1d9782028f8b28274dd94dba6b558601695221038df9d2becf480b13e9a507de65b62821fa9e3b3a294a265791f926cb14acf9e421038d10a7a4875cbec1648290ca1ee9320d7f7aafac0c198cd9fe52fe990f02e5822103b2b8ae21b24531d0ec0935313da9ae34e668f6d65af14dbb1e1886c73cae0e9c53ae0000000001000000000101b257670af4e59231999e96800ee55c4f97587803b2612e698bbec753dd7ff849030000001716001421873dcf62879b4a3c07e6df97aafab5ba818d970000000002ab2933000000000017a914609873cc3838b61105743238bc1a399195a3e5e7870fa802000000000016001478122e233e60e9051ad810e56c6366cefe424cfb024730440220176ee814048c05c69055029adc79ce9d7011cf2d7b8809dc5a4f159f95e522e00220280031d17636625604918558eb017f2c2e390b8ae032d896c67de9cf6672397001210347530bb3675e8c6e9f6ba02dc63431aa6d6d7c43f4179a2c916fbb941e37e845000000000100000001cd371df2d9f4bea4e6e47d210d24da77a03e35236a49e76c9bb90ab16423798c000000006a473044022060eb5715d18cd50a8f4851d9ae320ca415768ecb10d2500f2f7cd3bec8eb5e2802207210e9a9170614f45a8d88ffe4c9dffc4d259e0d80e348ce6ec0b68d74ca6b1a0121036fde4757e269974a7db0e40b15136df3ec940052f79673eaf4f8d0012f6ca86b0000000002b0feea0b0000000017a9142edc61192823b5f4fcd837797f510721c390163287a604010e0000000016001478122e233e60e9051ad810e56c6366cefe424cfb000000000200000001e7adf13cd6da38f2a3cc9280a53d679527b60e7726d62cc4c8ddb6fcd3a7f140000000006a47304402202388a00bfdcb257c51db5cf3ba1d48a851523aa40d0c33bad9482f3d4a1e7e7202205a0d2ac82453f5b408535b5c9b06c8917939a96783533259aab444dec5ab1cfc012102d612ec2530da7914373f268f2f62a8af1fd2a202a4ffd827d214d9b944a41423fdffffff0234020100000000001976a91464ac8db1364703e91ed48cd1dfad8e347965f18288acc0f35e01000000001976a9146af7db97de9d17ab83e5f943a2d4c1fd8c2c774488ac49a00a00010000000001105dca896c073665383b4d3be91d511055376af5deca0a9881de9b3d03bd9c320b0600000023220020f1533faec8c45e3c22dbb4ced7055d5e365b3057ca12585b0ddcd5deefe34d44ffffffffebcc7ef6e09a91b03fea9a48c03665a70bb835363ec01108035bcb1e8e5aae242000000023220020a4f01567f7bb3a4c7a546fd46ddbabf6176d51283f6b6e8950ab39f7ff76d9c6ffffffffebcc7ef6e09a91b03fea9a48c03665a70bb835363ec01108035bcb1e8e5aae2429000000232200204c3068cc6110f3640cf48c18d17913d0f2bb6a5fa9241b45c9edfa4de1c43600ffffffffebcc7ef6e09a91b03fea9a48c03665a70bb835363ec01108035bcb1e8e5aae243f000000232200208620275f63d2f03fb6b7ace33304a5640e919b007525a942eaa18c5ac5975556ffffffff2916374511da9d85d4e328c66bb372460e03fff19295a2fdb857b5b3f69ad23a02000000232200202fd46bae27e37799ec40cd6f59d33f0a5dbe8b131b6a717c0702014b7fce7e6fffffffff2916374511da9d85d4e328c66bb372460e03fff19295a2fdb857b5b3f69ad23a4600000023220020fbaf5e50b3b66a4040eb037ac671a0b933498dfd8033cddcb805d46c202df97effffffff0676dd546585b2aebf4510c2c8d75f34fdddd7fca97625737f9f580a8eaab34717000000232200203214122a4db049d2f7100c1840c5195362c3f6e482a8f6142255c7115508197effffffff0676dd546585b2aebf4510c2c8d75f34fdddd7fca97625737f9f580a8eaab347270000002322002083e749f5200ca54a507a64cab1a559de996c09b20898fb2356afcdf972b72256ffffffff0676dd546585b2aebf4510c2c8d75f34fdddd7fca97625737f9f580a8eaab3474300000023220020aeca474c5974c045f209269db6c16335b0f056d8eb31ff38bb2807aa33959ecaffffffff942730f96bb2b6e054f41e0c4069be7ee04ebdb68df4b8ac4a04fdba42108a5300000000232200200a339ce1a570e0c0cd90544002ff5abd29a14af1284be5a322f90d35c1c96e7cffffffff5e9a277ea7278b4d58083974346d3b1c9df11b429a5c175ef3528c67cc53bb974f00000023220020cf6dbf5533da1499a06dbdbc7f2bdd95f1b9ebe383eb86faf15023e4f6e56831ffffffff2c46d5d49d1c021524727ea9d438e1be9e41877f15796ae7d795922dc113339c0200000023220020ea2986d6651cd41337b5ee8037f2c39b847b5ded6b2037dc7e17619b01816bc0ffffffff08082ea62cfef57345e5273f390ebc25125736a53191f287ff2cd5886d4f22ad0800000023220020997e55bd4b1d7d7b2ea80201d891deea10a355c93458ab43f3fc0dbc1ff7511effffffff14d2560a8d952ab11ddc40a92fd3635669d1ef584405e3a5a513eb39619447d22e000000232200205d0db7f8c6e9d52e7a59c31e569cb9aa08c8143f0ed8162c625921d866b87399ffffffff14d2560a8d952ab11ddc40a92fd3635669d1ef584405e3a5a513eb39619447d2400000002322002097bcc73df62cfe2f395a167e4f5f105032a87baaa83aee2c754ea1229de630ddffffffff880db1d407a2280b9186eb3f367c5ce312150562f81fe6b4cfcb49b3d2732ef04e000000232200202615e09bffd7dc8b9b4d43bcdf2260302ecacb8baa4ae5d31dfa0672b811118fffffffff05f877020000000000220020b2f7ae47046ad17aae85542377271a14b880f058565e6aefe5e0a3e01c6668a0d3a10300000000001976a914c714cd0e05d1ae55c40b5652e19b515dbc336c7688acc00d05000000000017a91411da7ffb0547c72bf0a2e7d89788c3ac2367754a87821005000000000017a9149a7401bfa8d91f1be1e6ea0f7d6e56e16a664a328739cb18000000000017a91480df7ca995406e6665cf54f711d2778e289a287e870300473044022005e2358a6e969b6aad03cb29d89e293b791ffccbc7fdfe73243e655112ef8d4e0220647854820ed0207668e56302892367d049966c00087914e75d8993d62dfc40ae0125512102a69d9b742c7c63485eb730f7e0b48200d64d9d839ff783ce12a70e4cb0efe86a51ae030047304402203a4c9b317967ca85e3d3b45563de9ec0e6397d9dcb36a8c22bc6e96a4be91c3802207012ccf367392a896b4df1fe1d273b3c56394941f38747c751e674f013126f3a0125512102a664f8e0451fc00df65b70512bc13ca72df07cb2d643357e49c0b330ddddfacc51ae030047304402202dad53fa062623999fcf86bb43539c11883ee09387d24f73fcac6db27777043b02200e0547ad90c4ab8f035a0bfbb0a4b92ecd2a655a62187f68d53cc665cbd51fc401255121037df4f5c8585a6dae65968677ad70fb23e525cdf515fb805316315f0d233896f451ae0300483045022100e5066e8ac61c7f10d063542280746fe337a5b8e65410d59e81424a45cd94c78e022064363c3ee2c8f02a37722691011c3b634836c1fff3f2e4b2334d06cb2bc2427c012551210242362589089b2f899de24b327f5863d35c010b2b7b860c00011d9327e203417151ae0300483045022100f4ae880968cb6003852927b99f1cf1e21ac0a168a48ea6538c1b2c0dc00ded7002207af71f01c3f7c15bd31218496c15cb2f1530b3c6137aee18f33755904f4c59df01255121030e071390600b37e1fc33f20ef67ab41cae0a9fa3ea19380db81c452d4263667251ae0300483045022100e07d2017c3bd83799fbed5320d169c033b2ad0318e4c9dccbe05f579e90840fb02204f2b1e4f1ff02cbd68b1ba44f97e86ea4677ca53f0006cd3168686b28ab308a00125512102506db637ea3031027fb491d1468ac579c5b86d38ab6a3b9c7f8e58784fb1dc3651ae030047304402206a6db582966dd74f9ba483f63686b3fb15ef7d38d29e808650ef02e50ae0577502206fec7efa85ae1e831fa9bc38de9bfea7db5f7935125bffc5d9303d4a3e87902f0125512102939406bed41caabd46e8fbb29671907dbe4da16f63408cf7f770780f488b8ddc51ae030047304402206f64ccfd0bb0d1948b0fcfc68c39b2ddf12e9b487a00346b673b989e8dbe32f00220354ecbe70b22461dd841be6c748dba16b15af75cdd7e9686001b1a39f33f5dbc012551210307c1743624613f1f9a6f2f0da33d2fb06c398356f5d8acff479ea2a11657f25451ae0300483045022100bc66aba4e111d4d1f86a5c5fd648dbcc4a42040cb5903a53451bb59fc0477b1802202319c85be2c5bb3fad3a1e4add95fba9c99a97e68a7ff0a60739ce649cd1090b01255121025d145c896cb29f1e4d2e32768cd7530280cb54ea2abcef62274a88cecc1430d251ae0300483045022100a530a189940249e8fb1b25948b47a35595b1f438800a5471b97ea0bb323353bd02203243ceb25d79d58c0b081eea2bbe47001126e635f0a68ecc6c2905c95cb6e9ec0125512103ae55f44c0e2b4ac0bd805f096979b61cf0c57fea7b95a37fc49141ab6c79c02051ae03004730440220393673bc185b6075e2381c0657c12ec6ebcc7889729867eec0d3bda3b0aeb34402202f1ad43fde14e7815c1a6303dc624e092028eddda5bfd1277528b467435ded5601255121032d01cbaccfa46beec00133690e3edcbd1c1928084d33d04697138ae91352676351ae0300473044022071df424984b34e9c1b1e68af55a7adbb91e4c3ef943a71f6dcfbf797cd04ae2a02207a179b5fbca6e7b1a1b4e5755c2ca52396ea82bb2130262346d289f7bf9a19b501255121023db4cccff04cd8086a7cf9353ba26cb63d333619533408e71ee1e11272cbd93a51ae0300483045022100cfacaf5fe6090ba8bf79349736327a5a79f607080af20b6935292eecd3591b600220408dc175da8f5eaf27fd6e0d01ff85c9faf92d5c014e07ea4a44b81c1d0913bc012551210398b5ca22c32cd5baf2cb4cbf1c3f1413eddfe8d3b84d30714b7c736371468a2951ae0300483045022100bc92df470fec7dfe3a2b1612120b5ec599f4a7ed9368cf5497632baf4723774d02202605b59ad10d2722476982ec0c7ac81a9babbba2e771b656f59da6fecf6fbc01012551210203de340cd7d1f8ff5eb8d455be58eed69f43664c9f30106783704a8eb9128c6551ae0300483045022100c31b3b9e555acbcc37d7837529c1be9639a115bfbd3fb80648de4fa0068efffc022038808d3451f702ba6dd92469784249560c2fe17d437606daeb77a109407150050125512103354b4474aeb8649d926f847a82da729def6268153081abe2a6b613bde2c72ff951ae03004830450221008c776337444085a04bd6fc70598863c2f7f180c019caa7856e9c5ce8d69d51140220110dfb807b957f374d824353c4ba4adae4c6ba3781f1498be0c53063a9fd0da901255121026d91c6bfc70e182a502c72fb1ad9ea6a96dc076466a3b8c1c754f50545ee998b51ae000000000100000001a4f28be08eab1633e436f438279ca8b7ab3ae56238eb9b7e3fc999032f1d3047000000006b483045022100c7a0501199a0463c09f9eed3485a3bde3dbd3508afc03a1b8a32b4ac157043d20220026b3ef9e58e57f9bf717e622ebbdad021ede6a5ebd76314c077bd01b1efd93d01210337713483d2e93468a6866a58015ff6d1fe23e14e09f2824688ae0990839d6cf3f0ffffff0280dbcb00000000001976a914c1f3c75034caf16906e670c6d5a9ab664ff16f0688acb4aadd07000000001976a9145c36c962ab9b062c192de3aad188b05c56cab25788ac000000000100000000010181591966b7f23da0b9cb28ac2a8f478ec0e923def52c3040c971200325b41b730100000017160014344aacc4fa9257b246a97b2f40e3368b3b4aaea4ffffffff021028cc010000000017a9141a01c0bb6bb5ee8bbd652f32cfdc86c469dd799287ef32ca000000000017a9147e55ccd34768c836b74c3481d927f50a23b5d5708702483045022100ddb6ec8a39121efc925d8d48fc67a3b0ec9b30cffd5acb72c8f0c86f8db86e5c022042cfbc301630f3bfc34e3b1f2bcfe87995fb3f0edf13b73ca8c19bca8183f4b8012102037158ef10f8cb517be58057de06da20bb1d3223b87920baaa0ed711d415f895000000000100000000010132679e0348f16df132a786bc69946e2cd8b1d2a30ed0f1b8631529b048b406f500000000232200201e4cac041885c494009c8b7ba680cd7107f696bc834c5d8f442bc7302c20ccc0ffffffff02f70b12000000000017a91416be7bd4e459865ad5a52e96b9a56698d34c9b6d8720d613000000000017a91464f91e45c702ed5242d9c6eaed0e3419b4825ee587040047304402207a0fbf8404155b26aab629341a66e69a43a1a37404b3bc76e6709414f043c80f022050bc0f12a8fed0a87bdc3492f952523d8a306ce65361b2af82ee06794e88f25401483045022100e5096b43d556cae2e82bc7d91536807a36b4008fe218efccac047733206fe3f902203699cb363979293029662f1485c6ba9ce8196cb2338138644b8ba6237e31222a01695221037f74e7a6af9139c60605b5caa081bd887236a9d7e578d3b94a4fa4439c33d4f72103a328cc60362f3a330aae9533914a2da7576e5bd3fbe18744b55e4956d7a982a22103a7c8c06a12459519c237d73c6ff4da8c134733a5756472bab15ba42ccd36978353ae000000000100000001c1b7500fa134334500cd854d4f4b1a7f7199b6631bf79ab96067cc2cab1e47d7580000006b48304502210095842f3934becb7c94dc77bc003fec57e668c877b2dfd897c9fe324f0764646f02205aaf672ceb080fff786fa90e4237a11e5e739837bf45e00da2ca839d3239d018012103fce9eace21f16f46e698d25647c338a336a4dea851146c9a11a7befda628b5cbffffffff012abf00000000000017a91496f64f204a5c2b8297b1bb889cb704b24f2630be870000000002000000000101e15390d16496c591ce1f354347e8d31a3fbd63842902446c9fce3df6f6f62cc10100000000ffffffff02490f070000000000160014c7a86faa4e1cbae5536c30c64b27261420bafee2b1312f01000000001600148fe0d42411cc6e56f5f814eb7d9469e5351ae17e02473044022069bc6c29a8a51d9c166f5fe54734bd2fc9e34c278e374e31c887e0919275495b022027283cec44a98348b2e6c6139b9b68061dab2b7b31b7c23fc42d2c33ddf22f1b01210323f892301099db4c30125e555f3ea3caf39bfe4f1c1762ba82713b34bfff35020000000002000000000102b8aa1f8a18a821ef9a1d4f51c2d36d26df8eb74ca8803e217ff01b50ce2fe4190400000000fdffffffeef4b5d81b45d74406fa6d3c828c7cb736a11aa95cb7f7d65c541940363830f6010000006b483045022100beda89987031a782e52788b7afc2e8d62cd0da4d72ded4f0aba61d75548ff61a02202f5dd239e19c14dbc1695d4b005f717af3520f0a9fb2e32cde7923b3f0ee788101210259c149b239ead9e2dda574cbf99173a0169564b96da01e6f5fbc6f79d921cd43fdffffff04136808000000000017a91457151fb0c95b7e734d20472cc6469be87f740e7c87ed3801000000000017a914e020160234181da69c50b4a5646108c634835ce287442801000000000017a914fed8c65b138790a1a12ec1d28732c5e4aa7fdc0687bfbe24000000000016001424668e29c520f2e202209547ec36184b4a8d1c9f02483045022100f1720509bab849fced1dd292c4d49d7b532c678127937475c042b6af785ac83d0220225d0712e612cf52d0f35220c299700954d4684d86de424010b23ed1a40c6a4e0121025ab609aeacd955658ced27f57ea72e2af8d773e2f3c5d53acfda6428ed40aa1c000000000002000000000104aa0218716f6a1b26e11cc51380b053b14dbc83103413610bb4569608b0906d981a0000006b483045022100b7d20c6936a910712e797c50abddfe476a04dc99ba430680a5415d00161b32fc0220708d8ab2bb9f078f6f78faced0b3435a3c676f50d50298b8d0b191830e826c31012102d9917e41fa4eb7b2db61571d813065bb5760fbea5b274070fb6331df8d890ca8ffffffff8acaec9341775294d97c0072546afe83020add01d78cf3f83a1b97d41f90b4450300000000ffffffff4eed5334f8e420ae54cd55081334d9b33c69713fc4779d37a9aec96841cd6324000000006a473044022004c6443f16c67b15dc77b63373ded298af732eafc84b247860ace9e3d040656502201d8886614fc3e55e07de29039906800414254dfeadd1ed1566137d61c4bdc6cf0121023e5c7883d5b55344d9787ef1c0181d5ec3fe3b2d2d08effeef9977a53ca65f5effffffff8d1659b060e334359a14ee129dc84af3211986c4967a1c2cf83786db12adefd50300000000ffffffff034b5a2b00000000001600149f8566e274f3406bf86bb2d3202593e7516d9be959970300000000001976a9140904b12756eeeebfe2d971e66e280ac9156f853688ac3b8b0f0000000000160014e0145df166b20db925a3f7492889a5eb5ff6d363000247304402205d5e3f2e1509d490a411a422dbfc357a3fae5c4ee1e48079fe1bbfb485b3258b0220688cf8d4243472af897285b62021bec2a5abf026821d5cf7bf4b9eb4c468e759012102938f5d20b1dc260a1855b5b99bf2e041aa4efd9114595b1dba40904b06e991210002483045022100dc680a7028a4fbadd687d33d175412425d0b8ea2ed92385eb1d66ec401c7cfad022002485b17f7d106427d88e551548b406222c152a36f83705b3f12e589e86c35fa0121026c938b55c043e01cd54d406352d3781c1752b53d1daad233e08ddffa479c6121000000000200000000010188c754c6b2ccdc8d3d1bbe77b1466454f3a1150faaedcd4234dcdd262cdca051000000001716001470920ec1bc03520e79f7f7ba2e10c79c60dd397ffdffffff02605b0300000000001976a9141534515379bc0e27aa16d6fcab7c6b2e01513bf288ac903495000000000017a914683ecc0b3a0495fa4f7ca8755032fb7f2c55a4e6870247304402206374efd02f1857516913ede96d217afd027bb56b36e84ae5ee21e415f4ea24df022068cb5a9a0233ea6dc9093da98afdf157f07c9d39e83ce4c997dc77a3cb44c8380121028e98df38181d46e97eafcec3283566ea920506d2c9eb0ea5e159cf5c32ea502149a00a00010000000001015e81b967449e930d9f74b7c9d7a4f3ff0bf5924488e5a661a850f89da940325501000000000000000002772e0100000000001976a914a1766486549d7ba8a624a5f38ac6aed14139f6a988ace1b401000000000016001475a2026469773282a37ac5a7ed06aedce69e21fb02473044022053593ea5420bf57e098a686dde70418f4405e4770fe650761bef30c2428f18c4022072e117235bb18f2935c5e18ce8ec7be5c25db026f284b2b740780581350d545b0121025eecbf4412b640b1cadaa872c539ad96a3efb1de99a5b28fef552bfb763c1e410000000002000000000101abd9a4faf7810e6bd30a1c7b53629ef58554bbccb9257734df7118fa66ee4b0301000000171600146cbc6ae243907a01fff296036022f635542de1c2fdffffff0276474c000000000017a914e58c54e21ff99e5f12a9583e62ca3eb3e5a790ac87934e37050000000017a9145cc6612fb29c682c48e8d0e2f7953e23e4ace6a3870247304402207546c35edf0f70b6cf2f0a4331c2a8d5852727ea9f13251e9baab9126685cfce02206d727d41061b607eaa0f84df89bb7a1cc9e91d973f42e10bc3b51ed8280ef2d901210365b7b60f772e6f660ba1b62df8a615b68e00687dafb1c92ac84f657aa814dec849a00a0002000000000101025c66e2de352ba81e05cf3e19c70e7c9ed840276b79743db40d81a356947a0b0100000017160014796b7cba2a0fb7208384c6ba9bd0d8423c2a551cfdffffff026d11c3070000000016001409edfbc314b0d27d3c8a1756b98ee67d702fc3443d7d00000000000016001402fd8fffa6f77a13862ccca90c05eac961c0bb3c02473044022079eabbb03dbfaa02eaeaaf7378d2d99c74c99af72d8044ab77f8370c858e8635022049305fd6a341eead07c8a04a00e8b0c31a176c61a4826b78ce7b8e3c8e19207b012103a1a4c8c0482785f802c0d509771bfb9fab0436774e750d8c65f35611594b0c7c49a00a00010000000001018c42d9c261ea95acbafa8ac58efdf10ffa39cb213f46be9e299870f2efe5ab8b0000000000ffffffff01cecf200000000000160014cb6a6f7a4705432320c8864d38cb763fb9627a0302483045022100b1109ae91f065be5c4d6fe1d7e3855eb49b589ded677fe5ff1f18a33f39407c60220755c116298b4cfac46d7abae8ee9d79bc237ea300b4f3c3eafd8e6a34c2871c2012103f62af5968d6ead81cb127375a48e52be29fd17f7d555d118ce5409d556f9097100000000020000000001011eda41d5b14f56e09dbf7a246eeafcddff47566013023722451d3ce27a4d34b501000000171600144688006e7fd162b95f2123d0e235a76e60340f32fdffffff02446a0d000000000017a9147dbab164b5aae71c0f64eda376451b4fa111bbdb871a43b72b0000000017a914eb36e9242bdf1eeb296b8c8727e7a15e8f3e55468702473044022021102020a7b5650e495387b158161b8f9548d5a59b86a2eb402cf82b5e0e678b0220617f4e9d5547872aad79840eda3c4f335b55f9148214ce5250655136cbd777d8012103d2e0496ad5fc58911838e125c41d4413b5b7e4d93bd182fa17f01973ba4a3df248a00a00020000000001016b593e5b9de2d4e54bc0af17a8b375e5c89afb924f538914c912387e9baef3fc0000000017160014fe78154e123049a649063a444d5f7e06d186fdb5fdffffff02d16dc9060000000017a9146132ae2078ab55bdae0698443ce047384dbf3a8787222d0a000000000017a9147c5389a109d74ec67cf129b8ff0a72499c6542db8702473044022068ee4fb12b8e4cb854d4986fadf6d66eb8251ba751bd49a0a947d873db465da60220326a6a8dce93fc83fc3af53c6db3c07ef39a03a98076d6e583dd6d1de8efcddb012103b6a4cf4f9970ddf7a1e77c9b8a7497c045771c36e41bab0ecb2b72401bdc976549a00a0002000000000101a929309be90d21668525141c2077a9c874b7881a428c06b69f95c3308c7ba4450000000000fdffffff01811c640000000000160014f7625d18150b90d3c6dd9449a5612ff28773238c024730440220745283e920ce7f144db7c227315fd0f60b6a8ba54826906d65061809bc8631fe022005f63060d5287684d913a5da520736d12532d5e77db0add6f4f6adf6988257440121025ecd7de9ab5a98a8d0384180e527721240f2800c4900dad769612671c9b2450349a00a00020000000001014cde09df46839908b524d1ed4cdbee1b5b34cd7123740ddacad7f1d8743804e30700000000feffffff03553103000000000016001499821e4ca938a7ad099da731458dff4c7ce467d3196d060000000000220020c2d1f8acee03e740686591ba8c2f36b16c479b62b236b4e6b8091037939f9e62a5f9c80700000000160014101da51a612447d97cd7abd3f06f87570d388e040247304402200255286638d95c3f3b41fb780cffdc177f2bd33ad63fc6a2bb11c50c752257d302200ac001a62853079031a4096932b5e43bdaf5b1689610ae0e169557736cb2c1dc0121023993bd7e0e94e32a3a9881c4651cfe5b84757001fa4b8cf389e39d7d08fb6bc3000000000200000000010197636c186231b5935ecbd8ae90df70caba4261e9565bc68fe2b64fe0995707ad010000001716001421e32f42018ed5e54a087471dfc9f9c32d3e7e7afdffffff0220120a00000000001976a9147999538d77bdfe3fa0f418ab31ac6c003dddeaa788ac594615000000000017a9140f1991b67d4462f1440708824e606ae4a81b15828702473044022055b79861c02d07f34296d2d5a5f4fd5ecff64ad8384551c27ca4a237de6557b2022074a0e9c34b575f4fbdf0effd73657f0240bb884f9da1eff8fecfa1abfc38a3ec0121030d484cd69f7f05130c0394cbe994b8aea4546958f9ec373b9ddb9822a4e063de49a00a0002000000000101f2c9cde223c5c38dfeef3c8f027a003d0f2ac466bc3c2e6169885173bde2f93f0400000000ffffffff05c78aa90000000000160014a2554a44e729274c988ccff6f1cfe00a75f13134532800000000000017a9148667d1e36c4456928af075a5a0552418f58953948798511100000000001976a91417f761e91ced0de6503c26d3b4ffd32a334eec1588ac63410800000000001976a914f566d8c7e2f92941a053278eb7c84ac29345899e88ac9943260100000000160014e0145df166b20db925a3f7492889a5eb5ff6d36302473044022042948eaf67b12557c44acfc84db020c40e18a1b8a06e6ca6f37074acf45bcb54022045be10cf41e20c76a08fd9d815302d9a432c15ce8774815a8d22186ee9ae492b0121029c73c9de8db31bd1e6c27b8e0f83f7caf385f4d83b37912b8aa8ab23e047d9cb0000000002000000000101867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd1d00000017160014a44b82b5692b3a4ebb434c586a45ee15a170b3cefdffffff029d3ed6020000000017a914784e0683a8041349ab369d61302641d8ea8f5b1187f5b505000000000017a914d1e90865edbb7ba3f737c72f63fa8e2b390dbfd587024730440220721006fe5fda636db868b472012666dccd4e46f49ea6cf18b65a1adc58d00dfc02201379ea61cf4109ea0303277447d6e9b03438db0c27d48030477dbb4b03ab63190121028e3c8dc494dc8c2aa46a8dc16c44481972fa6b56cf79e20265807848749ebe8e49a00a00020000000001039a1bd6f86eadf40c313dab87ae3b188e5da65189b24a64cf29bfa20bf566fff70000000017160014a1cf93ea5616601cc239e19dfad5ab4b21b9d068feffffff73e5e2da91487a8cf62a82c3361cdec412f0d90fc25fd2abf5013f4516fc325d00000000171600147278d0fe5502fae372c04c442250e98ae8f27ef1feffffff5f306bcd6a6cdcd40c162828c7b70c1f32ecd9dc6fdd54ec7ac2a999be24c42b0000000017160014320c7aefdabcfbfc2e97046a0b8dd7195c6c3b66feffffff028e250300000000001976a91482e32ea289b018c7abd37425c94d2835e1e6014888ac4b420f000000000017a9141d19297d146a4aa187a5e994082c75045d4542c08702473044022017dcc32aac412b25abdd239e181f4f1757ec00fc9e6cbcdf6a846a4ffc06e87c022058a76b76992e134a3cb516c896806fa0321f1a808ecd646e2b25d2b1a7b050ad012103b6429129317df3039982aa32e6a08e2dc87141335736fa16960a4d0d1c5dc43102473044022030119e9bc2c600a32f4ed0bc0ef88be09f5714712f2b7aab706d3e570814d88402200d3ef7472834ef46cafebde95ace03582c74dc6620f15edb09d7ceafbf0a5e0401210205d3cc450c1ba282b22b48836d1bc2b85428411a05510d2da3c48c4fa988fa960247304402205914df5d1970a40ca7c4b813ef65bc5684de6035bb1e4b935f271ede036c8e06022012ea93018819389df5a8f9287856e297ea4cac438724ae41c6a6f4e8441d3df30121024765e40ea3666ccc8331ac9568f8d6d15ec53e408e55ab01c3d972b1d18f34e449a00a00010000000001013f9b44d37449fd071fe4d42a531bcd9653a78ea186669e80198783058cb0616b010000000000000000028e55020000000000160014fdde699c4451a3cff194f9f94495fa303ae48b88dd390100000000001600143b4e17cb3bbad44f73c79e3c3c32f9b8893db6f902483045022100d07baf1fb697be9f63e64eec288876627b33fe689e663e473d553ede7d5e9856022048fbe6981b8dca2c9ae1577b8992a54ee0f953031a35fa206d6b7740f8469a5501210226794f7cec79943d06c0c88043e9f185e5938fe2b43f33194776e394c22a924e00000000010000000001fd570131a4f6a84f67cd7466bf87ed29e72dd75e851a54a7aa6906e0dd7fa625aac9ad10000000171600143eabaa215ab085891ddfc729809f44a030dd92bbffffffff67d3595f01bba0f3517792d5052b12b3fb4a1915daf5cdf663bfdd966b90e16600000000171600142bd00e29a02ec9022e7ff68c20f31a97fffa3fbfffffffff71e8d24542c646cdb61b0a16a80a0713252ba836dfb3a7815df8e3424ff013a10000000017160014c9de5d5422d53e3b9daceddbee1cf9d22c1174c7ffffffffe470cdc48a1bb0d5ad8045eae1bfecc5bc8eaec9e63f82ea3dc41485d95bb44f0000000017160014d18e5d3ee81bcf8f716ac023b0c2bd0ac134e1b5ffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1562b000000171600145e2e19835463503881f3ad1d3a56b072b59c9604ffffffffe1d828a96eb6625de20afff75fdad47ea75ba1c16e6f6d39759fc474e0a53fc5000000001716001403683ad7368715d874f4048d44d53814d58dbc9dffffffff132c716a4967f8b13a63c8bbdbfbb11122e48913e7f89eb8ffe28cf971b9ca1900000000171600144c878d6d5bf4af4a3875c9913beb0d53735eef58ffffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9782000000017160014abe65fe37cc40f5cd9187ee15b4b7a84baafffd9ffffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7003100000017160014884d287acb15c94cd62b11ec5586148696fbe48affffffff60ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e102f000000171600148ec2de41942770e1bc0cdc7139f96d16e799e598ffffffff17a366830dc3ce9d6fbaf92ed01798ef9d871cd889e2e949042fa26895d41d220100000017160014bb7f811b057de7704a1b98ad0a04412d6d340314ffffffffe1736c269de4c044245e83c79616b7f6db54ca50e029503545aa07ce13eece0f0000000017160014290757adda34289dfa45aa1e4d8ecfcc6fd8f92bffffffff3acc6db8b273f6a1c0db96981c401de727dd850359b8a29e4a44c50d96d53e400100000017160014116b04bff9f2dfdbcb0189d34f882caf60155fbdffffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9390000001716001410da9a9a940ed76a2f15d195477fa7460b6a740fffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f3200000017160014f525ae15d042b68afa7e0ebe01125d3403d2913bffffffff70c5ab72052ce8c35c5eec7b2743ac2812c2e934be9295f3ad78fc927e07c71e00000000171600146c1dd2c54b39ddb84237ba6f983d2fd9ed85aafcffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc60900000017160014a5f943fae225cbd9fba8a2c926bb515e2f6527e6ffffffff4325d2bacd5845b725848fe7240f5186909c471bb03d3fcd727b76b700f879f400000000171600149685432b4ce23bf6ee62bbfbc98787a94dadc702ffffffff9311fc700aa095fb5c0d97d1b12f1e657136556ee062822d59ff539ed30f9fb10000000017160014aaf74fbfd6bbfcefa2f037b1e6fea187da47abb8ffffffffbd683cb56033f207c6707a298c90fe1cbf24cd0507754e87eabdf97e27055aa000000000171600142fa55334c15804c583b79767e7f6e0804f54cee1ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d06703207700000017160014fe8c855985b7297dee8eedbbf4d68d6a6c1f8798ffffffff5651b4dcef299d513bc684a1bf97ab5f178c4ba114df1e04a7a9e2a914cebf19000000001716001439ff1c52da483f6e431ddca29240cfb34f88165cffffffff9d569bb29cc583e9aaea8456f3386281929ebe2d58276d05836f4938aa74381900000000171600140938990f52c432f57698152351fa2ede4a84f360ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4874c00000017160014b2562b2639d4b615ff9a394bf6822dfcebac730affffffffd2692b54a6ac0757f450ae07e4e0bc2d7a00bfe9422d7c3946453fefb1568373050000001716001472ce1f3313e632a583f9b2edee7c1c41824e4da7ffffffffe1dc0cca2c64e26db59328b0f32e35a73736a55b40efe74ac53ba8cd2a7fd53f00000000171600146fbc3aa9927a824d9d5ce099cf5191820d4a839fffffffffaff8dfafef89c3f27c43e21dec934daa5897d1bafd354e7b59e0df5ca40a65ca1c000000171600145e2e19835463503881f3ad1d3a56b072b59c9604ffffffff3e4e693fc9f04367a2d3c2b0193fd0571a1e2bd5d6d839e999cb1b0bd7ca42ca01000000171600146e63c5f30105b8060da8dc98e1a6a185fe7afdc4ffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e2b000000171600148d1f3e12ccff3c3e03ca01acabc4377de8a1e3faffffffffe3c21fbfa36fa5d236d477958a0cbfeaf5bfd6e9ca1373d66a9719d038f38f7a0100000017160014ca564478e293d7117c908fcf431714d8d22da7ffffffffffa7a780761a8ab229b60ef5df1c89727ccc681b5421b92fe07543f773ed97d2d00000000017160014887cc7aab0934cbf21de06ba48cadfb6e7b8cf31ffffffff69f3635ae9fa0912e56a93da87461b2ba6652514f363de9d90ef494edd003eb1000000001716001454ca9d76ddeebe608c3dc0faf7f87518b1669ab6ffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1566600000017160014a65b7eebf0e5dfd0326cf7d093abdf8c94e74e05ffffffff3fcce332dbc9618665f421b488abab733be133801757b2a9e9345c73ca32afb600000000171600141d7983c0c25498e825d3710be0f03216bcd7bb13ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4873700000017160014372934b37ee5c48d9b11598b5dff79793fa789cbffffffffe8b0d412f6d683b02bdbcba2d1aeb56bba9b7565ecf168d1395e441b657ca69d01000000171600143a2c6e73046138a27c07d0c1d5d54fe245fa88dcffffffffb4a0c5dd54c65ca6048369d44fd87ed37f765526994fbe806b99601de2a046730000000017160014dad31f4bdab9d735a7fcccaa9b8755e91410645affffffffb835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d84113000000171600144dc7b534a7e3a4979dd75e59a65892cf105fbca7ffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f5c0000001716001441ef0a020818fb46da07d5aa7f718de175ef88acffffffff5e0f48e8b51bb4ee1f277ff84a91de737726ebfc934b28160e6b4015d4a9378800000000171600149685432b4ce23bf6ee62bbfbc98787a94dadc702ffffffffc5af2806d5608ecce31590531feb49d2d28322af17073282a23702d5176ac8380000000017160014f342f23b17943c5cc4448c8d5757fdc22b0b8e24ffffffff66c505995e1795aebdfbb3776d3f20856bc7d86b8efbc524ec711e0707993ea700000000171600146e03bf44af9eeade895d574b6dfb5474ed189dddffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d06703207e00000017160014e801a69d45902f4b086d5aac758d5d5d920999a2fffffffffa5802bc2ff6a7955b42d736cfc0f54f756657161b0b9e91d538e8688381d081000000001716001444f251f42ca9293d7943ed926552496251da37d2ffffffff50d7ab1fb0ddeb776b67580a0583024e2e8b53fa4b07916f1a81466e31751f2700000000171600149191cca6f7312e5fba675b6832fc5e8b77979cb3ffffffff3c08a27e232d692d23153705051c3a90e729e8e0a932e7db39481540c89d0d540000000017160014ccb5d417abc188f8f5916254d814e1a1def36f0affffffff144340b1d1e050b753de59158b9872ae98d078d19b9a0f82f12019e6eed74faf0100000017160014d038aa9c5f4847b78f6ee0b7c81aabe647e296ddffffffffe2b433f5af7fad91bd8e4c952a203258dbb342d9c4eef272ad7e2011e7cfbb230000000017160014c85c160f624959d33649b12b8449f1f06b529f5affffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b392b00000017160014cb7e5e3a59a5e084933f83a4a049e0b4ed825b3fffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd343f00000017160014f4b561538f8765feb0e076419a9b2ab74a1f77c5ffffffff19b8f2e8c295e7fb5ed75b8da29e58708d5f0b7fb1d15070e9c02bd34e7955600000000017160014fa7ee994e22f4f69d8a62bf8a3a30a4dcd735f1fffffffff2c1141bbe9b17f564fda66089fac4ad511036b4a9e8d3698e8368103f9a23f033300000017160014da0363e3f537425cc22f4913f73416ff65d73dccffffffff04fb9cbe48edb815a1221710cc1c48899ed10ac685c0fc802721d448057bbfd700000000171600141da921df702897411fa1a1ccccd2b790c810ae04ffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1015c00000017160014aae41e267d316709bed387b2d5324acdfc516e49ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223a000000171600141c14ee9166e23bf17dd55f31a14f382237be6b94ffffffff5d0dda4f37bff1acc602a39064ba95a84383b30c397289510f2f36ff7762db170600000017160014747cba9a8fb6789d2b803754810b4cbda50fd72bffffffffa73b17665e16a0f36d3916fda698ffb842eaba607be9b39e884f520687350977000000001716001461f96322006fa3154f298f723981c1e4eeb86235ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d0670320850000001716001416e919a2192dca3349fd2b614eda926ed6335a71ffffffffa23fe7a56295400ecd60af319cb8504728a83957da64adb7a65dc69202dc01c5050000006946304302207ba1ef404e9ca7af5372e80a4f2add06a0b339586f35942ac212b2a383ef9022021f1580578166b4f05a3d3b8542a61701fda3643ed0b90b003010ef58b44a73a2012102854c706fc570552c5cd88f71a4dd60d46c61a0f47552faa770c49a43b4a7bfa8ffffffffdcc2ffd2e653383223c6102e436984836273a4de87e8ab9eac77b094911ed41a000000001716001494261c9c4f3c7aad9278e1eff10fa36409846ee9ffffffffee0d57c89922d2319a86ecf535b7fd6fefde7d9badd4155a2a3b90cb4d5645b5000000001716001442f146101d36624d658c7ae416e52396c6d57baeffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b390f00000017160014a0f943261fa20a6b84efad9cd5106202bc1f59fcffffffffbbfbd1ca0fb76572f70b5672865411886f4a0c00ad0aa4f0d46cc3bb8780cdaf0000000017160014cf8a2bdd047f093e8e9b62b69ce77ade04ce9927ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d4700000017160014003a8eef83f17bfdaddd5a0375f0860be6bcacc2ffffffff0d81b02a060bef94416a9a439e17895dee664ae3b744a4de6cb4b05ed4fe91550500000017160014daca8e9f79822907be9cf49382bba2d1ad161983ffffffff44de40cb7005a609259ed036aa2f196667bb94287495bbf109be5a5b3be07b3000000000171600146e22d1f88b34a3ec45286f536e0c761f66b009a9ffffffff9571d3d229483c4bd1089f58f773add8859dd08b0f1266e5f090a0718f1cb9a507000000171600141ae614ddbd32c9282017ce6788967c068e0fe60effffffff8e1ad2b50c8d5bbcccaa20205edaa68f726b369009ac96a56759d1c6c44d2a5a0100000017160014e8849036db6c94be4631daca432b4f540978779bffffffff53756dd54fd59b6da4b903b674c6441a6acfa934d992214ff67bb7fabab4816e0b000000171600147b82e29121121f62b88f54a0094947c3e4024e60ffffffff4f7f5f0955f4b70465cdd18798ed9fc0ba7f8fc50dc83c45c83d9109e04db3a60000000017160014116989bb115f0af7def6840c8399db1c8d14ab75ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb4700000017160014f4b561538f8765feb0e076419a9b2ab74a1f77c5ffffffff28c4c0b79ed383126e0b92c65853db2b1317a4b230adce50b88e95331843b60200000000171600141145d06ae446537a9e5cf4b3e623c49a56c40af6ffffffffebe72b7d622ae65066f1f345faf499eb4025cc6ded282227cbe97a055105c88600000000171600145f7682c4bbbce6679958d3490c8fea7942b590f6ffffffffb835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d8410400000017160014e71641f0bfa20d18c03f0fea9b9c73d97f97895bffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be413a00000017160014140de2a59a170cc59d18e180ffb1c5277c2850f2ffffffff0690382a536c1e3717e886b50ad98c540b15720f86f120c5bc60f75cfbef27bf0400000017160014747cba9a8fb6789d2b803754810b4cbda50fd72bffffffffeded8cd14f6fb3b4b60b161b12432db0b1a8667fa0855e56cfa9bb2b6520757305000000171600143544a6bd2c911af7dce3e181b375faeaa099501cffffffff292d044b6eee04df8fb2a4d80c796f4ea36eb74c2e3ec8f0e37f214ac8852b0a0000000017160014f6bfcc5d8e51729ddad7e8722d5e7642c709a274ffffffff50d9fb15b46f7b6c5901c0fcc969e19a760bda5382339b5ca7472e1468433e0000000000171600147c7b88e5eac91e8f8d65e8a5cd5db19f4d30ca5cffffffff3a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa13000000171600142081f86aecc4d61d47b8add98cddfdeab90d5c85ffffffffcc69faeda34b2e8b9fbe3ac20ce8ff99360e8b6062e724817f3ab71715d41b060000000017160014a1db82b987e3f26eda88f1c6ce9d9ef458293812ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace532249000000171600147775dcca04fe2ce2652ba0737db5fc2493ffdea9ffffffff8e8506ab44df454a40f3c4b7d61dc506a3d6d6fb56da1583adea01f5453ccde00000000017160014d8e6f00893f2528cc99c133474190e8fbdeb867bffffffff5c25fd9c52215a0ddf19a9898245baa728d368f58cc22be890a0878bdb5103ba0600000017160014775b858f57ddc602c7048c0929300724d7e25820ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc62d00000017160014d86fc09448662c91392e9a241017c4784af46a3effffffff80a093e8cbef202ef4c173a38d860648653490812493618d19541e06b22abd570000000017160014df0277327039d8f525727b3637af05f60165cc3cffffffff4e077b94eb1d7333b1361ac41f1475f039df301d9b50a5535084881f73c4a75700000000171600146332daa98ff901efd8b52fa40fcda75102caa690ffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d1380000001716001458c8652625640f8f8727cef89003ec85d0e832d4ffffffff7005de51516e9a2792fa561757e61b6447d9ad25b49048b1ac705853073a5e870000000017160014a0c0274ea9ce4b91745f17c846a923ac1961e0b4ffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac53000000171600142eb58895f611479144754517a0c33a2b07ef1507ffffffff6f3164a1b96481409d3a36f40a870b97dbb264161609b16d50d260842ff79cef0000000017160014dbe299417ae3f888820874702e7a5db8b91254d6ffffffff78ff4b3c648099487566a948a5a0d6b359231f1622ee23fbb8381512059da338000000001716001413c018994e07c881e1a365ce04d22347b785450bffffffff3c9c22060390debe7c5457cf4ac434b584d1699cbc237619edac48e79db3f39d0100000017160014140c0ed47dc38d3fa64cb89154272ecf9ca2e000ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd34560000001716001497d18da1c58e79af69480fa89a3d0c6e61b846cbffffffff17edf37217763c39f27059f7a86bb761a2c7a4a83f64b637d40219d3429a39920000000017160014db1409f12accd8d2d74ce291687985696a58a121ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc61b00000017160014312a31e7098939e58371a4fc2223526c6a2a2dc3ffffffffc242dfe6dc907c842a86024cec7470a6147655f95042bf3297f9b48db605114d0000000017160014cded76d69f5ab918cb5e212de164d25633b57808ffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1010a00000017160014628e4ed8668daf52f30cbd217dd885439e71bd3affffffffc2aeee30cc4ba8b244a68d97c26d93e23e731dbb60d57b6037498165a7e8d0861a00000017160014fc6923b9086957661aa629f45c0add9648126abbffffffff35e3ab63d884e94b6056e0942fa52ce5519fa94a6310267ab93ddb0a6e5d3b0f01000000171600143c6b6db6f89b59e27aa7ca14f408dfa1eb257839ffffffff3a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa0500000017160014f8fbd603cb79ea23f39a1a2a87743bce2f109283ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb14000000171600146d5be1c8243258768e6402e7c9153134a00766d8ffffffff21f9a34ca5045cd3b3984b0f433e87fd8d4e96565ce1f32ba6a70cceb577d9e30000000017160014159a4cbeeff0870fba882ebf5206dec94894596cffffffffc4962890116ecfecf371d07d4aa1c3e04827344614eeaa9bf48dedf09d5790640000000017160014c51ade5fde730ad82fe7bb20d2b4e4952c5d4693ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c27000000171600147c7eed2871a9cc2fcd7d6df71404d83a7cdd79e8ffffffffcaab2c57a3ac0f68d7eb6499387c618c67d54a7ed55f2355867535cf2d654bd600000000171600145a45d973b1055368490e44b9cf3fbda365dbda40ffffffffc23938cea8786688a341b9cf47dfc284f5c94e2ad6c00caaa831b0b156687e8500000000171600145688e2deed4dc0df9a5bb03ac3a7ac8febd25790ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e2440000001716001494db1ebe094da330e57182c59588b0a4f0971e14ffffffff210541a7ced85f290dd719a4d166f0bb9ccd1f05b7132b9544f3ca05c3c0763a1b00000017160014a49834a610513da0ba0c7d0dd76732b182fd13caffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa48705000000171600147e6433633f74d2e1ae7c8b4a0e861882c41c888bffffffff76cb6c68f9efcfc7df50a95de85c18a8f1110ecf0c20ae7345c3a35e402cd8020000000017160014dbdbd4088abdf5d5009a0ed6b97234a99644ec00ffffffff706d0290778cae9d7c2e9841ecc5bf58c166a2a02aeed44261d235d5017386550100000017160014b7c2a0d585bf83825142631df9ebcc911a21a259ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc60000000017160014224fab48609b17bc76d9acaa81aabcda70d8828bffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53223000000017160014c3797dba16a260062eef19eddda6d8a80f7ffffeffffffffae40c2c72851ec4bfcaefd45266b9e8cd4ad59d043e64fc27d94868292744d5d00000000171600146478b1c861a4a878dfa4e076bdd611b869cad864ffffffff91da5da7cc18b8428e7aa868b980f9f732544e0af298e3b1e600e0ea766b2fb20000000017160014f65c8d82c872a43589402142dc3d684235428a9cffffffffbbf6318a44429ef5bfa0c36f4fe1c42d9482fbcc128b8104f061817410821dec00000000171600145e4a5c54d71a9ecec56d8e367bf469610bc2ea87ffffffff78d361623a12843a4d851b407856e7743b3775b29631e6cb7cdf5bc153ada54600000000171600140d73f33891af97d3fca8bcd0d733e7fdb7adff89ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c0c000000171600147ddd5ee8cea3e25c06622d977c702f429e76d318ffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1016800000017160014fd5ec65e9b240ca1292afd6ed45df2f1081914faffffffff8e40a440087289048e9caaa8427a6f623c4d4afe6c7768eb88fa5179f80563ac000000001716001463dac5d70fc76f8635dbfaf93eaec932fbd97f97ffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be411c00000017160014845f4300df43b9f67471a1e9bc8a01ecfe4f0665ffffffffeaa931a27f2b421cde98a6bb3e5bb43d61d6de25b3c65827bd6b3137cb7cd4aa0300000017160014a29f56e21e5c0b28e2acbd26d66459a8ca92bcb3ffffffffcc54971a26a054191d09213feba5b5a04848d6598be46561fa9c559b798a26990900000017160014cae708c037114ff105cc9afac6ea0ff74900c838ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd3405000000171600141f622a9c5ec056e9645c656754dd2b21f299f802ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c0f000000171600146c24d836ee681daa36accab8fa6f61a3c07bf680ffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e460000001716001497d18da1c58e79af69480fa89a3d0c6e61b846cbffffffff2356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1016d0000001716001449ab7b4db22dcb97842b49b6b23959288a0e6573ffffffffce2c9cb9b353c6b56a5ff15da8649ccffc26fdf9a706c8475b75b73ef48ccb660200000017160014468a38358b4f4f5c9c1fba059c5d93b1db697dedffffffffba6a5829c627738bef6fc4f138f97511c78be2f006d12d217cc35e7967c6b3320000000017160014d2b027a5b915d3abec43ba1bea96e71748313d08ffffffff5da3599f645519dab9b718c88256aa412494c09eba568123aba22f16e05d22b30400000017160014e90b9f60246848d5b576362f92a5f3e759bc769cffffffff3fcce332dbc9618665f421b488abab733be133801757b2a9e9345c73ca32afb60100000017160014acc64de5ed3ce4d5060e396a741a9585f16e4ebefffffffff028deb6452fcd651885e7dd93f07a8794cc5afff6a75deef707cd64aadab62600000000171600146d995270e7c9deb2183f5d635663061913a09cb2ffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df35000000171600144cbffcba8e81dfc62891c9451f07b815d71eb3ddffffffffe01fc9422cf363505fa2daea0a72b046695a106e3b2289e03664d8fb23b70bd60000000017160014494e523dac510533b3b916d30a0fdbb9f77ce423ffffffff3e700b18701d0a1ce085d7920460ae8c3ced3df16d02a7d92b1c6396fcc8e55a0900000017160014fc0084424fef363b73604a1069a28ee12ff3f997ffffffff28056f7ac27e345546b787d00ea2f47e917411b1a95081f76d1cd8bf4e69afdb0000000017160014cf8a2bdd047f093e8e9b62b69ce77ade04ce9927ffffffffaa4cb155e7760f347836cc547fb2609a6ad090c7684bccf0da8b79c528541e4a0000000017160014bb3ca143fe6b764eef794cb1ca68354338bebc00ffffffffde2df047843f58b18f595f7096b231fb88b6adfe4d788d443ff91c1763c26190020000001716001422655ca0a4e8d0dae985989c912c7e9ae54fb693ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd345c000000171600146cfad9f7359ea9a3978d4f4b36302af8b62b6b9cffffffffe8028a05785b86a87e9690afe843100d0d8aed6638eaab39a55ac6d6e64387ea0000000017160014f5338051b14d7b1d87633f56fef0a108fd5b6fe4ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53225300000017160014a4383859c7b57cf2d4ae0a0a2bc5b2f47bef4f08ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb2c00000017160014061e5b56413df95bac30190824fed29e55134642ffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd340d000000171600141711f241284c4a7fffbe8b79a5670f09c49d7501fffffffff30de41b8a737c479aef0ab3f8fe27193eb4831c487c064fdbac62ea8f60b67a0000000017160014fc45d6c862a710712676194180b09a87d09e94feffffffff310c1a42fd69edba69e3e82b13b7f17a726aff5b6504270285b2bbd3e5777de90200000017160014553a67e7cd31eb6b66bdeea351ebcd0bcd8059cdffffffff2c1141bbe9b17f564fda66089fac4ad511036b4a9e8d3698e8368103f9a23f033700000017160014f657c84e6119d675ae18d2be41951467f4b936e9ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d25000000171600148fb3de4582e8b2182d0025eaf409d8dcfc22dfc7ffffffff2462ba04c8798c60897de129c1e2701646486bb9561be866af59104aac6a39b006000000171600140d4aff04b114b0bfc16caeb66ef4f880bc6d598bfffffffff84285bcb7371227cf92265f4ec5f15cb4968a079228711ed2c184a3832be5220300000017160014d6280adbd1d74ad8a4b6c322370439212b669223ffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac4400000017160014a567bbe721eba71da0fbf059cbb0b56015a7270fffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c1e00000017160014b28bc8ffc1c038d7215127248570a90638eb930fffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb5a000000171600147585bd2055fc5cb9063acc632929316bf2b0a031ffffffff872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc62b00000017160014a5d24831d2001d04898503d59b7aa138309397ebffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b3927000000171600144e8dfc41c4038b0aee939f42ac705a325845b133ffffffff871287f28af15810005d42e205179b7493cc7fb3af501e6ae01ad731544000a0000000001716001413c018994e07c881e1a365ce04d22347b785450bffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d0670320060000001716001448808817ebabeb7a889bec5e888d864332946050ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e24a00000017160014f3ad9ca868219198f67338c83628f2222dbd9cf5ffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac0800000017160014dfa0d7530aadef693d3c38c8d6f741208077ba00ffffffff981a0e9a9fda4ef33735d517bddb18a07546ce9d2a2afb4d8d6d530b8e5fe4af0100000017160014d1747150e0441c29980ed745b3aaae4f277f3ac1ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e21d0000001716001498e2411b6faaaa50ede4e3deb2c3ce047805063bffffffff6a16553d73141e953f71d36ff214669df6277e4a3eb0ebcf00343abf740526d50200000017160014acc64de5ed3ce4d5060e396a741a9585f16e4ebeffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd340b00000017160014f24469e8b3aa522426b7f6e4c4a2a5138eb1bfbcfffffffff7081e401f868ecaa49fdc13edb81fa87714ffd43c3f023d23a5300d93b73de90000000017160014de4f7cadabed893b22d51b65f3df59488e0fd050ffffffff27f26fb950c559790332d4ff06e1d81831df64f4cec94ceabcd32519394ac57b03000000171600146100a086c29cfbcf60abfd36881b76fa2de5695fffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4871000000017160014b46460d0db0481843215987212db4638ebf403b9ffffffffb385f751a753471c04aaef551ff9887f8bb9f6027e8bb9e1c00d47725096c05a0000000017160014d572d4d5ff05f30c831744dfb05371c73f6b5d06ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c35000000171600147ba01767c7a12c26efdb17116f032f0792ef92f7ffffffff29e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec1230000001716001415267b4b970899a72a20509e7dcdcff4d3617ddcffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd343a00000017160014e00d5a43e177926223461ec23c0962779754f710ffffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40a000000171600148d3ec8ec7c620393edb8cb1014be07989b707dc3ffffffffb7a58b1009bc4fb321564b0f8135cf8dbf5aee383f51e47531c97151180a56a804000000171600144c7b2f091fe488e58d306feb78c2ecfc070ffe95ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb3e00000017160014ecc8fa08acfc94521aa1ae7604abdae853a5ff4affffffffb17430e09ca68694ff6c29906a3bdba66956a8ace4e3579bb18810889907730012000000171600146de80f3c22bd39e9cf803e6f981f6c4b6a0a05b4ffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b393a00000017160014ab0203718dd61cd3c679e97b84fdd62210383eaaffffffff030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee1040000001716001483b49dc3cf4d1ccf9a1b670995d71cc7abdc1914ffffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c70027000000171600144128979df0366e50e751bea6835ee3daffb86ce1ffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d12500000017160014c240b07eeeeb243c9eea6253bc82c00ef6b8bb3effffffff31b6425852eed12ddeccaeb408152f3d5e2b1945a52e92c44c3a7dfa8b2450a000000000171600141cb11ce4ae834e023f4788c3fbd23524a48e7b2cffffffffd2b52aede2053de471033e645523f6916056e43475cf87d3d4e4f9220d9faac60400000017160014bb4784c00ba4e8002773228de529b5080d4943eaffffffff9103846294a57536a81b5ad721da0dd0f82d69c4bc1eb359d454a8c8a9ea24b600000000171600145c21432f9d678cf2fa0f24498417053cff67d14bffffffff8797b26453fd5cb3a827375780a313212f5a5675c11aa31ea1abb5475f3d110f00000000171600145ba1597076c666f048b518b9cb4205fdb21aac39ffffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a541f000000171600148d84eae2497d796f85ed5ad170b0c86c28f934daffffffffb17430e09ca68694ff6c29906a3bdba66956a8ace4e3579bb1881088990773000d00000017160014ecefe02652270435e0207152df0eb6dd851cf349ffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b391b00000017160014d8082e47d6f500cd8c03625521c0d38d443d10cdffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd344e0000001716001413e7f6ba2e1c64fe7e99dcb6d7a9a86f701cdca0ffffffff66d955af747c13a4a7a984d9d5c55b8130fb01d0ac744164ab629448be14ade20600000017160014dde4a829981384b7467a3377df05b40c86f4538cffffffffe91b176547096cf921a59f9427dd57e0446c6060c95b315aa6d5b2bf66b4ff350000000017160014875462b45b3862f080fa26a9ee1cd1d55703b2d1ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032073000000171600149d528cbef05845d40eb1e052833ad38ab05b950affffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9782a00000017160014b33f1608e4102be062f1729147388b7b76a81f1cffffffff71cf52f7144dd3fdd5c5ec5bc89d6be99cb2c0fb83ac4a8fb38e0e051f5c0793000000001716001404695496f432a3df9aa7a7440763d05430362f91ffffffff825cda3824e69d5bdeaf39cddcdd9e5e8b9e94379b31e24cfe472bb17aaa5c2700000000171600146e86d1f1c10dc52c3770c545dd8821e3d3a91845ffffffff138fddeedbeee1bbc4abae8756e5877f8d29c5b53fd3f32838e4b2443021c8560a00000017160014b3bd486f25ed9c06fbc240b5ea1a3375a9dfe9bdffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa487320000001716001401d73708da18aad699037aea35460ab353083dd7ffffffffc85a66fd7c595db1afd2148dd7932a76ae4951dda15a30ae8e885bd6b260873500000000171600141a2ec6251e2106db04a0a0852bafaa8258a07594ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d06703205a000000171600142fa8d6920edb1585bef91556740cd6c8fc3e4e34ffffffffb7a58b1009bc4fb321564b0f8135cf8dbf5aee383f51e47531c97151180a56a800000000171600142e5f239acace2dedac81898d5b5c2532d49bd785ffffffffd0959ef71aa4d3936992ce4bd4a5bc92c9005ed95fb265b9e8c4591d7ccc62a60100000017160014db25233781e4afc9ba93ebab22d966be7ca01f69ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb1900000017160014b8532711db2edcb526dcf4669c4504ee8c56fa3effffffff40bb4b03ce2e00465e07208dedd61a8a48acdb4f67249c50e6fb9029831223180000000017160014ffb0755a7bda15d297f2604357f75cc35f82eb62ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d6100000017160014b84d4095988e6396f58f69836003097c1098aee9ffffffff30ae3fef0d0bb008b861b0d9c004dfb11fb872877e090f83e5c2f2f7cc9086110100000017160014bf2b184a7da2b161bb161015cc05250d742bc1ddffffffffe9fca66d06853187a6d2fa5c103bd37013e5d8e961b09f1cfa041c3383f2be59000000001716001483c24602977120848922b07311bebde3f6190658ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c46000000171600146d27d4280f4ae677f41f868583747a450070debdffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e0e00000017160014f70cef9cbcaa8f6994791f554b6c21b2037a9bfdffffffffaff8dfafef89c3f27c43e21dec934daa5897d1bafd354e7b59e0df5ca40a65ca4100000000ffffffff60ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e100f00000017160014dfa0d7530aadef693d3c38c8d6f741208077ba00fffffffffa5f27cc942f95adb7af298a43f7f3d4f5be5cd8ffe547fd5ffe7bd2d4844ff80000000017160014bf148e6bcf28601b98927cd7081fcdcc1f760d25ffffffff16d05b4a95c5ec3d905baa87cba720a76a5a4b62d35a992d0921d62164497aad0000000017160014930a03b0a997dbd04685e8d70ed01e414f5c866cffffffff6280fe3a8189cdc61d1c9c2d1b1112769efc9567f78247db674bcfa08c7cf79400000000171600144803c04ab51aff22051b7ff9152f30415358eeedffffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a542e00000017160014ddfc1888d61ad68bfc0f52f8bdd8dd47157b5b2dffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac640000001716001497d18da1c58e79af69480fa89a3d0c6e61b846cbfffffffffcb2ab77b7b3d43e4e315d7e601e6bb916a8caefa3b6d04ac1fc324638040beb0300000017160014ac8e2ed24fd481708662363301419ae1afbbec77ffffffff8168b130c2a4ea774cb61b6558cb52a0e02349133f6d737ac0016096e1d16c35000000001716001404df1f9456d5931bf398a7f98a3d1c5016c9d539ffffffff1aa22b90214a358a2e334afbbcba09238862ea762f9267efcbfd474814a61a190300000017160014c375fa35d81f125b39e105732403b61a000278a2ffffffffa5687b0d4fe21d3b6783d7fd3847ce5090862bd6603a3b1a191ed48f4851cf600000000017160014cfca685e8b96cd7288e2970263ed18c2da401ec5ffffffff7f4025ed74403c9d3477f25bf40110eeff6382c783b073fe979e447bde5b6ca6000000001716001483c24602977120848922b07311bebde3f6190658ffffffff32d498737ee45ed9b978439478e5d5112d459cf09d2c7598554193a5aace53224b000000171600149131945a980a9128bb0e44079b76ea6fd3b131d8ffffffff5867db44975f6b5d2db1a912a70c331c595668160b0a681afca8366cacb27e8400000000171600148f630022f0067e2d5b70fb08f4cdc90091f299b7ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb3400000017160014a28f4b1fdd06674ff56663ec16e407040f5b40e8ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d1900000017160014a6123e045c8c7dcde04718fb971afae882e1a3c0fffffffff36616dccdde07308708d436912b745c24b8bbb1a3d20cb97f2587c1a87653ac0000000017160014b8510c1ac6f03b5c5de12f14967ee88bd0fce39dffffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b92100000017160014b514c753258ff37f49916600ceef712e1bd5a7b7ffffffffc9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d743700000017160014b750887498a41a49794cbc20adfa3a9a320491f3ffffffffde2df047843f58b18f595f7096b231fb88b6adfe4d788d443ff91c1763c261900300000017160014c118ca2606aea0dacdca7689f32497294aeb4287ffffffffb3aec851af0d0a6cdfa2d5daf458e1811335fced665c7269f3dc84a5bea959a00000000017160014deeb93da43e6e0ec369c0f582406496728551180ffffffffff3ba4acefa50921859a74241ca0ac133042630377f86e286e1935f0d2fc87ef01000000171600147f157bc055622a2fea950398cdb5a7a8480154f9ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c2c00000017160014a21b9dcf022a71bb2d7a1f529d4e224b51236d92ffffffffb699eab3bc1bb52ba2176b6fd686fc79472288bf5644edd7c4259cf7fb0fbb380000000017160014b78bb131b62376850a92c2216201e1f891660c2cffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4870d00000017160014cd13b9f2dbf15321a11559d18af792898fb6472fffffffff6267da857905e70d096f39fb150568366a781038208155befb848c97b4563e330000000017160014eae19ba8b3340109ca9f406f6a4baec31864454efffffffff6a39ce4aa41b80c219170dbc1beca89b77160c802b41501ff43d0b3db04f385000000001716001414871eaf90de8d4a932fb1c73abc9683b68c74d9ffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d3a0000001716001480c50af9db6e2d033ee4aa243ea58e1da2fcb1eaffffffff847ac870feb835b95a306563744af1d5c78afd6b71d65a7322ab7576b0b5a85c02000000171600141c14ee9166e23bf17dd55f31a14f382237be6b94ffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f3d000000171600147775dcca04fe2ce2652ba0737db5fc2493ffdea9ffffffff9e12e0228a243c8581cf4fc79b024cddffa8b06294b88c8872a68f4343d39bd100000000171600146bc9f07e7b27ef4ce554a50c12679c8c1a5f020effffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032015000000171600149cc32f5027cd34469992f79aadc288e9c1259678ffffffffdddc8f6be4e20568ca40968ec43428ab60e19f6478a56459b6c52250dd3b52bd000000001716001480f644bf546ce7096d27e8868355a3242dc39286ffffffff5734378eced4970ab1feaad1f288b6f6b4a5b2d8b7c5a06ba3f59a1b585f1d6d010000001716001466a14845fd84c621d6907b900caa24f9c19d87c0ffffffffbb21d3a217b0de35d4694c60dcab866aff13e899b913f77ffb8e04bc1a29438c0000000017160014074b41c3a28452b5d799833b6b0462595e9bc2b9fffffffff287f2a497a0a4cef21f6fe7e1fa90360c75cd73fbbfa93b61690d561fd214720400000017160014d2c1d20334a13219b2424f7d3409632318848060ffffffff667c6fbdcf1cfef426dff699d7ac130a4d9824ea84007820c59aab87a0314b0f6200000017160014c7da2fcf203c8de5b160bf2646eb7c75bfcd3bdeffffffffb7a58b1009bc4fb321564b0f8135cf8dbf5aee383f51e47531c97151180a56a805000000171600142ba48680343e35a42864f6f4fcd501dff5f028d2ffffffffcc704585a43ce16b4551db1505b8acf176119ecabe04f03b3afca54bc90758ed23000000171600149d668ac50dc3913c1e58f27b478dd46d163ecd87ffffffff5b00851608e2960e206ea9cc7ee323f4c7f3a1258c95b233aab3bf9932aabff500000000171600142462070dc2b0cb8a9d371a2fd3640bf592aa272bfffffffff9c0dcf17653b35815de1bf798b7d1fe45c554ca5f502b3c4b9a1f9838df3a9f00000000171600143cc451415fd1c902fabd4004b334ef269224780bffffffff2b9e3e78831fc308d33aa034951b98d86778a24c0fe33db3cc8e220af1c49f470000000017160014eb98312a5d830a54a7a45900120ba16a0f3ed1afffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df24000000171600149105862721b889d5c212cd955d962907348cf0acffffffff3bf729aa30e60134c0b8048ba35b08c46cb48c9d25759084467dd05870b1d2ac0c000000171600141b18bedabdb5404ab12ede4f7a0051ccf59a71d5ffffffff001541ab6a985d37479b7802f87bf2ade636c18b2239efb61bf120af4af41f3c01000000171600144b9a1e7c9a4f901102c8a3f976d5e6340d910e0effffffffe9b92a6073bd4d6eee0312ae7df1bd79885046c62015b108cd2aec0bb720b5be000000006a473044022044b830144cb2d79419e068fe14ea78c1d2d9a2d0f6748a7fd3f5a6c14965390302202922d4b031af557279aeca3bf9c049082602c5fa41117d5807db8d29b1afff4601210348c0e8a75d9263c4372ad1f9ac7f338843258e4461c56759cd063a2bc0371e33ffffffff9c13a618f7ec9254571f1333d13777db9b117dd43039504040c3edef544b320a0000000017160014432dfc6cf879f86739648bf01b071bce7d8a6ea6ffffffffaf0931f8fc4f76fadb41c9bd0ccfc215baab2dcbe9da836f38bfe476764c87d800000000171600146dc3bda26ff51eb258a5bd9cd019b28b0f32a797ffffffff343b1c52a0909282503eb065b7dd11bde232766fa1665aab67cc85ceddd8f5890000000017160014b51a5004eab05cd4816512b401ae2a3b6a6c09ebffffffffc6791b1679941cadbc2b5321a26c0b8e748e39854efc68115ccca5e5bd16b7870000000017160014b69e3d604c7717df83a3eb0397b7d88eee0727a8ffffffff4ac34e708e29dac7e04231ffca4becdb9ad15121768eb0a04b72b3a74f8767f2000000001716001469b2ff104eb0b1d6293b2f7de6d9c1a1c415e89bffffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da1c000000171600141c59ea15488d4779ef293d63192eff31a67da013ffffffff719105d79109d4a858165b5dc3f2bb574e08ec2dcf10f5b417eafe103062244600000000171600142c0121ed3c42769618f09bb7be515f6ca9e73400ffffffff105e300b1620f238b34d64a1fdca954d7a52e7497111a8e526235ecf03affcff00000000171600148d2ce1a3904cd7c1f2953bae56e7a60f44640b8bffffffffb118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d380000001716001486d60ba8354187eac2ab7a6014b345701393d05cffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41220000001716001462c20f69cc476b152ad9f532f309d8cae249c2e5ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa48763000000171600147efa5996da60e2bffbf9a2c39277d1f8382801f2ffffffff6120c709ab2afc5bd007c175f5fa475c654f3d0bf7087f7d385e547d57eeb7ba0100000017160014825cb6aeadc2893c427a6c4119f447779d8061adffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032096000000171600143edb782ffa2444b5d63652f896c0a92bc7dcafedffffffff75ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7002c000000171600145e2e19835463503881f3ad1d3a56b072b59c9604ffffffff5f1f879a1f7c8fc51c44370b8e01734047c77a17a4b8c505d4972989d77ba2fb000000001716001494261c9c4f3c7aad9278e1eff10fa36409846ee9ffffffff985160aee4a2ef600b1b8ebdc0247ac9e2b6edaa17afdcfc015505cf72f01c9f0000000017160014d62724877a7be92974ae2e57bba12a9b8c337747ffffffffc2aeee30cc4ba8b244a68d97c26d93e23e731dbb60d57b6037498165a7e8d0861900000000ffffffff9e00706b790d6498282ece1169cffabde03b57ec173f4ab058fcd0e2491e041400000000171600144dc184018d368c9de13ea0dd680b6d8f092472e2ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e23800000017160014eddd174f558b51bdf693578ebd446dae8a4f5e16ffffffffc9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d7436000000171600147c229dc230e2afc0939bab644eb0b2f13a9b28b7ffffffff1148ac6f5ba57e00de9ce402255c33e784859ce1d03ade9a877b75d9536047aa000000001716001446efb77321b33cdbba93ed5cccf12917ba185d0cffffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be412b000000171600149c4b5c5d9b9d4d040ef592dead4eecb323c400f7ffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa48754000000171600140205b1d99588698d2364b96ad4ed0d883f2529cbffffffff546b5a68555d6f1e1b7e14155992754dc09af7667bac0c8ede00239f2a166e9b0100000017160014c3cf5bfa2a5cd0567cb62d9d0bb1ff1e8206f7aeffffffff29416bf48c8a92fa21831f8869a91da2f47f7885b51f3976452f3b81a1b4d14a0000000017160014c386aba3a8fe70f5207c9ef55056d553071a853affffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be41420000006a47304402201f03ccb86150fd12358254776613cd57679acf08cbd651d81aaa915286b9c0d4022059223296ac406012afd972fc3b1f4a3114dde1750dd497219e2a7cf29706669a012102199e2b2cb6e509b78b448590507c2f0008367af42e10841de5c0a026b79de9d9fffffffff7aa3816fad4dfd47a90ed669af58c590a991221cfe6b29a56d9efb2ea640604000000001716001414871eaf90de8d4a932fb1c73abc9683b68c74d9ffffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9781a0000001716001445926911acad4bfb7290525d2d2bcb4d6edfdc5cffffffffda0265675c91dfa35f0ed28faf9252134851ff9ac602039774879fe8cf0ec75a000000001716001483c24602977120848922b07311bebde3f6190658ffffffff9cfac58a6feb7aa75092bc43c99e65336e40d49961bbac86b91d5cee579908160000000017160014298f79df490619442fa39aa879c07e51ddfb576effffffff931ead1b0e011307434741939addf0dfa330cfc53b65420778e31fa128ffd60202000000171600148c6e3465fd4c2106c273d11994c05d3e75756555ffffffffb249c1c9e24fcaa8c499deac3d9d599ed2f9b955a32aa3adfb6a1500c23465d800000000171600147ddcb7acd462ed957a18cd78d7512f0131701d99ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e252000000171600144068326b593feb44e4afc772eee3c194a457a07dffffffffb9d11c3d7904fb1caf98dafa38f85f32caea1db8c64ce8d3306b4565bd9ba452010000001716001490c2daecaf013787c3fae47df70a3178bdb5cbcffffffffff25c7f5e83f019099d6778aa9f06e9acf94d45a3dd650dd5d384291bbbd3da3e0000000017160014ab897e0338dbfe71a4b0dc75ae6bc53e2815357effffffff6a4e1a3fe2163ae47b64c37623b6dd46b2b8b298ecebe2e988299af8c30532ac000000001716001448e508e8e6140686bd165e5830f4201e49b8d084ffffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a5401000000171600147fa678a4428467afbd2cf8880a54c49389a01699ffffffff95ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e4900000017160014c88b1ccb882fad44a5a332be0800ab467d3d28b3ffffffffc6d008d7de49979f91ac35fc5cf8495c9484024e59f6a4b5744c099a5b7fb7f20000000017160014b9abac22f7248a8a34c49d254ab018962d64a5ffffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d10b00000017160014afc5178347e6f30404b19684e036c8048fdd4564ffffffff55d096eca7a22de67386d092c907e84ceea01f8e643c4cf93d493d8cf6cb1cff010000001716001461336f07b5b9e94ea8f16e0733560965cdf60109ffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df1b0000001716001445d965f617ef2473f2e53e5f10637a5088ecc390ffffffffb007d394fdafc0ddf0ccbec729cfc0f9e331d6d44d9333238f5ff8629a4b1dfb00000000171600145299d18ed5ecaf02ef8bb806032c6c739116b66fffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df22000000171600144ece56e9058fa5b38aebb237da43734d7aa481beffffffff7205d5ee8cc59bb07eca14eaca04e94bdba4c7191b8c07a1a380af77cd3c9a8f0000000017160014fa935d957f2bd618155f8d36e62be71245e406b9ffffffffff24426055ded4a3bc55144451cb8f5a8e1119e6209e4c4cdb4fe1a793841eef000000001716001459700ba3ce502e4862e45eb49e19da1c1d9fbd2bffffffff5f0d3ea9ada2b18437f2355745b5e4694e1912fbed15394a4e8c630eb999dd5d0000000017160014080fa839febcf4ee0633555b8951eef9d88b1eccffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1565000000017160014655701dc93cc52594fd51d1353ff0c47f6398fb2ffffffff61dfc21bca7f6e33db7afa3658b77b19f19b0e805ce0acd36ac30fc92e43c4fa0000000017160014ce249a7752e62a2838fa660aec7ea0202765bdc2ffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb1800000017160014ba89d1f8d43e76d1e1ee48611ccb2d337de8de73ffffffff5d6ec4c49856236a6c2d025cc88e33fd3ad4ec0025deb423ac2b83039b436c0a0000000017160014246026c72abc49abc9251719becef651381a6c09ffffffffcc54971a26a054191d09213feba5b5a04848d6598be46561fa9c559b798a26990000000017160014f9d2ba24575ec789ecb21b283c55ba383e789a0fffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d1390000006b483045022100b6621490c53d8cb909af79e1f34de3b353caeaac30d214d423d7d001659beb130220094e356b2cebe184e81b3c0875384cc53e11b3064a46f27d263a0639f51b9c8e012102232c76c8bab7713ba176c0836882ae9f876c303b42fed51d24d257b457bdc4e1ffffffff29e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec1350000001716001432cb99481e6619695675e6de45b82b80006f9463ffffffff60613648f6b8e1b6da16d3da6ab317a761da140f1267757377c55b89d067032082000000171600140d359ca149955d822149c30d7ad237fac8baf949ffffffff3a631b9aa0030d1a25226ad3ae9caa8414c946d95d25cca8899de1a73aee9caa22000000171600148b330a5b6a44181b2572d292cc9ff46e7a3f57eaffffffffe7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa4877500000017160014d3860edb634610e5437aaebb0777e50c6cd24bafffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a15654000000171600145daefbd8ece835d6aace48d8d4ba766e3cc732f1ffffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da0e00000000ffffffffd63507285be5473d005aa53478595c023c710fe6c1473622a354a2c8ca926b3926000000171600144e8dfc41c4038b0aee939f42ac705a325845b133ffffffff0075838a1438cc095eec45f9e1bf168d9f73d091dc7dace682164b6fca94c9784a00000017160014281fad29fa97ccac8a822dd3cb395d9c0f3ab5cdffffffff1b14e67b806ae3cb76ebe37210963b3593b651463150926eb056b099d1732a850100000017160014ec20f9bf164b207eca69b1aa157e1a257f4a04aeffffffffd011fbad67f3cde16ca1f59180753e1dc3b41299917a0f417864c8b80c5669680000000017160014e46b064cbe5eeccfc27766c513f2afe38e70a906ffffffff6f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9170000001716001447ba158ca8b81d2f7e95717aaf0be18c2bd99ca7ffffffff74fd4843200455608b7d5358d3a66788642ef4ee1c5ebd03b5c462aefd9c794100000000171600149216c17cd524ec1e4b7995f216a8159ddade6332ffffffff030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee105000000171600147181586216e90fcb2524cc2727cd224013efe476ffffffffa4c1abf1b010c720bd206dd3d19d73a8c2817fb227abc5c435cac723b8bd037100000000171600146e05e11721c32996e62694d25781f849c1b113c6ffffffffd9618c57fc5261c44b519d7af8418ad8d51cce78d498148a51695e4b0725ae6800000000171600141e18ea00adf01a9c283ddf8e4609e6c0bd207aefffffffffa93773aa2f410fcb1501072affddd20dca958630c3f443fc6a5a76be73603a6600000000171600147c6a6199043488be3bb058ba5303e95d13f81f6fffffffffe6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a156510000001716001418bd25d4b6f51b9ed818f07dfdea0dc50b7dd565ffffffff711c5bc2425cd563e2be68109262fe2a2f4dda200c49a57e176ab0fefe841dbd0000000017160014c4b5928fa1d70b4ee73d6d8a7aa90d981fc5080bffffffff6ba52d2bd367045d7c1edfa1e3edb82a36cb88b51f06eefb0efa61f11e8704a70000000017160014f7e676e7e51698fb4b55a072a974cd16416fc7e8ffffffff943419041532a0220fa7157fb9a789f683815db29019c977cca29dbd239cd2640000000017160014dc5285612163826c1730151012971126fe9c6f0affffffffeea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be4115000000171600141240c8a4e3976cfefff0820f3b2773fcff5b4953ffffffffdafdb366de4f3a138bc35d37da27de48e233f7c95b59b07821a3bee0d16ab8040000000017160014dabefc57e39c4faa310a44d597f4ebe5854beefeffffffff7c4927120572c3bd912da24551ccc83f6028dc7e021b3e9e6f7aedaed5fa18df430000001716001459d3e103c51783f80dafd4477e537217951007f9ffffffff157c1035573fa7740015dd661e99f08a1b9d570e62d0f8526a23e6f12f64146c06000000171600149cf9ebddddedbaca722658758610249907f1742cffffffffadf42350c68883d228c26865ff9c042a803f04289f6ac201c3b35af41750b00201000000171600142423e9bd0fa1f0c6e1069d1ab6d4f07731cf60cfffffffff9862e7fef82147f5f147348861ff4ad597b8a93189802a7d51a3197e92de67910000000017160014e9735ff2b940f77c4f9726daf20440ea38b6b929ffffffff94a173a84c5a4ee5dfa7a0e89c1042ae93f7ecc81435cef781679ca6baa8b3cd04000000171600144ba11eb684e517dd3db7fdb2eca797cbeccacd85ffffffff752c95c85d04d572f21f4427fbfc4f211cc366761b5c0b8b7389f5db4a77dcd200000000171600140aed7d4069dc043d84bc9dfc978262c8368ca58fffffffff60ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e101a00000017160014cd02ef245ded6b21451f5b7fafa3fa4b1038b6d1ffffffff5352df881af76fc61e09f3c941e1788d7a260bc7ce28bfdb972332c5269cd2a50000000017160014490c1da80e32934c76559c37a1c6be93093efa08ffffffff29ff0928d9e82f6f2dba53764164e83cd8c679996640fb928113816adf194cdb0000000017160014386a2af4d5e5bcdc6dfba0132ed2ffe4b6724440ffffffff310c1a42fd69edba69e3e82b13b7f17a726aff5b6504270285b2bbd3e5777de9040000006a473044022015e64362f09010f68738a746931b90693b124c6299bc06c5053188f7b147c27f022069819d69ad46cdedec4836a4997d735699911f8b5142aced54051d53ecc85ca4012103ac2aac194b028122397bb680461d2e6d8866436a00f8dee58c8bb58825d5f462ffffffffb9bb7da9b30d423cff64362a193ad683bc87976b6fe4d93c76ba2ff7ea4e18e231000000171600147728e1351d34c2fe056fa8aeb365bb95112b939bffffffff5250f1bea7916aaddaf8c1390cf534fc59d5657112e266d8080475b93135f4e500000000171600149191cca6f7312e5fba675b6832fc5e8b77979cb3ffffffff088afc752cd4adb9adc74e23b78fa5cc3ee184acd702bbe2fecc822fe1a2491b000000001716001463a873784f413017813886eb9b819f8ce8e624deffffffffa65ae3c13cfc44147509e7ed1a410eec292690e6d2c1ba1eb09a998967c154d106000000171600147acec427feb873b0afa534f9c16158d9293cce94ffffffff0298d19e43f8404f8a34bd9071512341e6efd0021237d5d20527d3c4fc250d3300000000171600147f7911f412ab4ad2befa8aa34bac5297ad706ebefffffffffa5a6f85628e2826e5afd942aa1d6f90e424fb9697394c6ac51bd956c1eef785090000001716001440c06fdd955e08bf28c75fb3df7985ff08dd3c6fffffffff95926c05083c47f7fa65a5a9c2101186d4d89862fb0da8225d1025109974e3d90000000017160014f438a6c7c65ba17da87fed455629921e921c1300ffffffff01c62199190000000016001468d7f8507349bcbcebd7dc2132ac483b68e00cfb02473044022011f43c39e0aa2c1f6be65350c97136ed0a049a753a038a2f5d5581cf5337993f022014f053527ab9857264e099b9a134928f73477c40987df861baf22ea0a7313509012103f3a55335e360c492e534d57720eb8e2c57ecc5ddf65a9d698edaa2eca9444a2002473044022035f8c423c8865172ea5949f71b3d6b130172f323598805d6a9b07b8c450d913a0220710072b7e51957c4b801641037827802dddfb4cbe2d9fba6425ee007d5f1558e0121029a4c7da73639696f36cb442bda6d467e4f98dd050587c086f798b7631bb4e6f502483045022100c6780c63660057c89cc1dbef66c4cfb3f2a32c9e9e9e166ed2eab86cdb6a801202204862f8b0113e48d45d7f2a5731a0cb8fcf9addb3731ab250648266ad8bc03fb70121028f5fbfdd91cd4c320674459000370466bd9a8b5835d0cdf639516fd06aded2a30247304402203031b8cb166b4ffb53b065e3ca100f6b9cd5a81d4361f24f2ac72f4b480201c202203be6b8b206f17bc5b1f2a08143f141994d652f1862f188d64495538e1547d22201210391e4e9572a9151f6999d3b3ce00d0f592c2336aab688bd200646ee57f2dbdd260247304402207d06607d9f7001a4f54e25af9c248d0dc9eb02e93661ae2d08fad50e256510880220395505f3fbffae0d7280eb44434874685acd96751737e42bc821a32ba0f4d3b901210210477c87e3b54cf8a4e8cba49987dc546747f049088feb2d5d3d94f0667915270247304402204e0ea19abc018b5fb1c47b62f88d979d09fb7871f4a323c6b096bf7493fb86460220441cc3ead38d6623925f85265b1eaab6b87a373ae09f5a4c07528b725f50fd550121033254991bcf9f3c18b3778872ca3049e41b6a39c469da0e881de1de0b1336c431024730440220052e25d193ed7141bb9c36c32805711216c991844b322eac20679e67be81e84d022007104ed5e9eaa301f6f5e3a98f1c1a785e87124d1926fca488199535d2c5384b012103a9a0a3402bb5a05dd60548296a8af6998b0ef698fc4a170f86bc7795b458d57d02483045022100a3627e0ac1b7b5503a0193e00aa563b6ec6d56dfe21ba6980996eb3a25e7ad6d022050ddf81d44a2684cb7ed8d2a64f319ff0a46d83c4bff3bde14901efc48c6679b012102f18a5387b9474cd384b852efb07751cd5e006c40609ba45281fa455ba1b60f52024830450221009d863ffc02ff2936b7de0fa42f0a07ab837adf41e3705bd8cda35c4b94cbd4e702206bb9e24baa713345cfd80d4754ace40e87a7ad8e2c2ace658fbe2bad8f7b7765012103320c879307d10f05482f28ca8d55341acf50454b96a1be23b7cb7df4575d15d202483045022100cbc8646e049bd137c56e068e161945f90f2241110706a5ce884215fa76d25c6c022012be60f2b22a6d23af886fe55c600512fe65b3c8af14c9114eae9de505e6188f0121030e40a9c0c1f3da4ced7901854d291d7efc00f7e52d4d9490e02efb601eeee3ec02483045022100b0e58fb2f67ddaa1e6dbc9680ae64a6d4b607778f5da84644b806e732c32f5ce0220719792bc6a37709f2424a1596d82a5ed9ed03248567d739509952359b9e7e517012102022e4134e7d4c2545328684e9eec8c5c31d377cee61f11746d3cd7033034d1b902483045022100ae9bba41a1557e2343703b91a3bb82d581829913bbe2596907b6c5b1f827842b0220647a9554c4435372c492fe7389ab3fdafdfbdf0f819ffaba4048bb987190157d012102ed0353a3a86e314bc06b3b309adc912f5fda583de801ed593b802dbcabca59e6024830450221009afb49ccbb93d0932a8978096fc111c671dae6c36d0cd04f1c89f950d00efa6602207a8572c64d728e000b80ee000320b6ea6fe6bac3c5ea19ff8e0853f5e1cd3b8c01210360e4058ca61bc11d403583ed713dddf16514bffd5eef8aa54259dc5c9e50b05a024730440220209e8bac9400f20c70cab07de3a7b715d6411337b0909e2fd79644850c70e9d10220698813d1d21e4406df5a365dc096b33dc35fc4da78797d43995f6e778bc7cc20012102f5185a0beab51840144cec80bdf784e6d3b10a763e5740515191cd508d0b292402483045022100d5d96af779b5234616a03678ff512e469e96f5b9fce0dd7994057922d2fc7b99022050750a4fa7dea2df16b5d1960de015a996b3347fa51ff9e45f1782ffa5977c240121036254c5772fad24e3c153493c32bb4e8cd1c5c1a6b56b08c77a31a28096a30de602483045022100f049adaa20359948b0f34438b4b25fc840675c37f1e77983fc7c38db662bfec102201c265602c7171d91f4d5bf2ae41258fad208ce304c4b0da85b9abb0f3dd9754301210320fc8bf47897734c65223e85bff7cee27493289c3a4d94334ddbdb6e210aeb6402473044022031968929e3d646f3acb6282c033280d12564968307b4c513d85f9fc30df849e1022003dd78374718c4f07c003b64ed07d2de62942b54e7f20b7aaff8da86d1427d0301210292fbd32ecf93aaea26e0d8a98f10bf785c66b37edd7fc3d0a89f4c977f21c28202473044022070ffe061d4d2c54060c2f48b669aefce2ce2705f88388286afa334a8f6d8f9d502202b8682f0a0b31bf9ee9a08d9e855dd72a7b7f4f0b9cdab25914850d3383c4475012103d0bf31ed28ad12912ac41a203ca9f91d1843cdfc7a52d2ce18a3ad34eb1317fb02483045022100ff8403d08f3048904c3ab21ee501b863c93040d6c4b068cdf0c7a6ebfc9e34ba02200a261a09245af1cd72afd8893ccddd3fdd29cca1fcd42cbab3938d2de6b9255b01210289484fbdafbe4c95a8235f147afa2c2bf5bcaeec08267fac4b3224a238ffad4d02483045022100c7466bcbb605f3557babb22e048bdc5fa51fd92cb51f5c01db94abbe5a0a3f1c02205cfad039061bf98cbb940bb285867a327f437b97a90ce53eaeedce7c7433d9c9012102151ca67c3788eada52ff04fc7348ba61dee454060bab5ff1c3c941381b8688bc024730440220678ba31b05c65f108c175d3cc8577d98222088f33cc2bdf31a2f8871a82f233702206e77ed29b1c6346c1ee56e73ae4b861f0226ccf1acb78c5d2ef4df1bb4275b1e012102d9f288eb75dd0b967c4f8e23f90cd365761c5d735b3b4e627992feb280c7ce5302483045022100ad7b72b05a6c2b36b6b7650b94dcd75bf4f2eca519375286fa12acf8b5f0f8a70220545bd87f60a4082f5b6223fad301a3523b752ffe816012e81e7871f4803012500121032cb5950ad570d0b66cd596a6b298cfa995e2bcc628aa8cdad71c9d15aa0143fe02483045022100e223eb7cbf41588e70477a2608fd5dbfceb50d9dec3fd6e53e08c3829730b575022028a291c5cfabbd900e2091d622b23faf54069250792408ee3e3ed6a4ccad34c70121027ffcf1c395e8b1f44a60207e3ba60e38668b68d9676c1e34cadb8129ec74460f02483045022100991110d3f92e3ba4c4e46c2b8fe8bff60fe8ccd935209c4881582310b28d37d902201c17abde6b168583a19bb337056e21f52e057ef97c496b777707856a08c5096301210303c7ff429d4aee12a3d533511584b5a54e54dccdf02df8a42eda1323046e0fcb02473044022008633766cd30b76529ec1760e810ad3d5b714083da3b2d1ea6d1c7fd893dda5802204ad592e7c19132279630993d3cea5515318298ba05f4fca8cede3a92de6094f70121024a3c8a8dd0f46808979379cc7ba900ce603a2c49e21934335b849b0f68fe2f3802483045022100f563f32954cd2980b4801b44464942d78afaa338624e85c008c8383b55523af602206cb0b595e8e4b6f466a8b96747327ff6b558559bdba5249e83888ee79e13a2590121025cac6d93208d618752d295bba344a4311c2302b23d2bb2f941be23c4c0ba544802483045022100b5ff44f65b3d3ea1d314c198147a37d1f64ddb99d261044d9998036413d544990220057be0f78abc08b46df024385b116329c0030b6297253cb549ccca694de20b3801210210477c87e3b54cf8a4e8cba49987dc546747f049088feb2d5d3d94f06679152702483045022100ce4687f56414dc412d1f41cbd89a0f988f792e715a26dc039f273a5965fd9ada022042e2ae1ebd28d92453236b275297023c6e8d804dd84f336a9079bc2941f48fe5012102112926cc34e37d2d202e2a6d579b22e56ac663735ecf2fd4503d541fb5af38c80247304402205d310ea39705edfdd035d882fdd39c8cdb1ba7334b24b50aebc6a0a6dfa3d4b3022049a87ec32f07382e15e90c05d1e2ed2a57a277a2b4bfc7457691f3707bfd9918012103fa9431d3fe0b31c205120cd95c3caa0f3192b772e422448effad0f93039a0ffe02473044022076227b0969c9f557c357d892ed40e71002bb3a18700e8f0ed0369364117969040220309cf38595582462fbe121600dc84051a1105314396663e2d892b02ce7878ead0121028c574174700e0af56bfb59f4d52f2e992b7b95b613214a67836b4bdba336eab20247304402207ed716245ef326033da1f249f5cb8379e96fb4e2a4a54c5ea330976b2a25d48e022042f64b5dd82322aec02863335acefd2ae3df8720da4a7f5c596014ebbf5e52410121033445005a0ecbd9b129afee18cb109811994ff24c8533c93ef36cb4ec6b121b0102483045022100889c77ff027a9ef9875f37a9c529c7821bdac5c5cfee550f4a8b4395383420e3022025c0f098b43cc7673b4cc5ab6e7b9fe1127d6025ee6a84e8b19529f1bfbe642301210301a3d421d3cfe14993b8c9a3cdacf0681d5a3aaee2b7c075b5f3c217ee04230b0248304502210081c30e18bd77cedbb34e833c36b4ecd1b947f367171fa55c5d58601b058e414302204c87fc3ffd01bd86523dce0afabf03dbaf629d906a72ca8f0b07a33d9325d1830121034779681ec73c0757b0b8a272cd0e6b00c677854f15f68d3652dfe2fbe17bb81c0247304402205bf2d0df20f712b58c85f5476c05af64f0d9ec3e3075d090274476a0bb3a9387022056486c180fe904a10d6d6603a5d1e98bd14cc0bcce12d1efeb079777df87e227012103655ca87e24ffcc229f1ed324a6e38c73f8c42375162cfc9731ff407958f68eb20247304402204869c466a922b39d95ba78cf2adfd4685fedeb0ca4d8e15253b17b9f68fdc01902201c0257dbc0c9dd9715d6bfd3d98a60a29eff0e26fce4df5ef3b94ab6ac842d84012103a7c47380bc14d86e728dc1897ef40dfa990f59f0a1fa6319806c67ff698c50c702473044022006a829e08d63ca15a14607e881e939cbfddd2530655fda7bac7b2a1077b5344302207352c892d358366a4d2b03921acc0ff5c8cad5872bfd2b83a97d227f9a28af6a0121032a3b314c3f823bb30f55b4b611c61866da4f3d3b20ac42313629df41b224290802483045022100be4bc0bb561256cd7b666a0483e41891a2ff6b8de93ef9b85e5d4d5ed81123ae022011b84200811763006d2899aa525fa5080a7b10d9aa2568589879b36f160ad745012102b96f6aa8a2a7c8a956e98a69f54d671a3bb91bfc0996281258047ef9372f56450247304402202961977f5537ca1b491e48a94edc0cb421969ca910376e3225f7121ab315b80a0220023a2d8e88dea9a8bc312e981ffdd690a8a278d60246319fc5815d0b52b4671c0121021f3e1c7296c003b8c993493823706ecf341184a39a5a47f00bcedcbd6d6b54a60247304402202d02fb200d9f06d81eb3da2092fc5ea6fb7874ddd04dc5f3d477c98009a91f88022015811baf2ef156ada2c6195dbc4dceca59e26330ae9aecc5aa4a9dff5923f31a01210334fc3e8c5391c0a2737ce82e8d6e5f692941c5096f4c34678c88b94dfb74f8ab02483045022100cf73937c7eb812265acd278020e5d2f8655e0b72bcce0960d7819a92f69b28a1022057ad66f89f9868219013c8b617438f685ccaf3ceb39fd9c77b4ebdbbf8eb28c3012103d0bf31ed28ad12912ac41a203ca9f91d1843cdfc7a52d2ce18a3ad34eb1317fb02473044022032142c9626b7138f96fc9467f49e8c276bcd00a908c6410434cddb2172acfe7302207e480a536803b60798c006eb54161ce09d9ccd835d068695c05ec136c394d3a1012102605960ade5c3116c083eea8dc8322bece85eff97bb2cf90b17dbd659e5a206f2024830450221008ef728e8c0197590f3f8eaf6166f546b16fb16fa46683f3185e6ca724f9ee2a802205589875ed001ae1602e69b143ff325f1de226132460f838f36d84b85dfcf0431012102cfcab94cc9c52783d5014704eabcafb82e079b753c36212a2843528599f417f702473044022052fe02706cc4bcb634a9ed32ca9d4ed87e9c9dd8128d6cf339e7a1d7b1b2a40402206f27b30ea18f0c3202e5738da0ea5cdd6d1b7ab3abfc878099cc8b6f7bbe96100121027e8df711cd1392d661b843a7c61c2e38ab2376fe3f8dc2c653f654d6b118d9ca02473044022006ee30917aa28ca55cbfa3c56dffeb3ec7f783c62e419b5fd804a3a63138438c022004ea88cbdd598371a50354236f9ff6d987d464537f8eafb1ed99780c9c9f97f101210370475459ab1a4b6d9642272301f64f2f528dcb2ed25fe15611dbedc2bac94421024830450221009278deab004d6a4b6d86782f708be758c0068fd496bd39ac7d7806bdde00f22d022012f2e0f368eb4b9600738424ca079d30c83220bf37bec0dd0d9a17ce40566a340121034edfaf50a0fb90bee886a531212e30476b2b6d2eeb9ec27dee972b3b08896757024830450221009705c7343ec9275477cba7089b4048f3a46fef2e65d17f63499391bc2f6a1547022005af3eabb48a8ab3528ea37f6d872dda11e25a4e7976e3b71a370f7df8ec37b60121037d39d13eefd85ff243f361ae8e248fa12596494b8d11f9ce9c4b1ce749488d7502483045022100972b2e2eb848a86967066b899f63744890e65460fc60ff6bad73414e5a448a9702204e62e7382aa1e75dee3be85d430ba2000ca9c645685857e4adda948252572e08012103f55b32f68c562314232e677a8d54adacac5403c70c67981d617ca5585f378ebe0248304502210093e74c8e78a14129027bcea5a40ecf7cecfb1e7c5be4a0c3ecde8b45fc63073702201774700f384f1b20a6c45d9e5639880201ab19294d999796f98613ca138428d5012103662fd1e768094d3c0cc7d45a5da01702148b41075f1ceddc6f0405a80469cab1024730440220249f477d6a9819d406f85902e6879f1b80a2432edeed48e4ed5d5cf7cb5a9d3d02201a7af8e9c8188df8c57935a8f26acf497a9acbe63a0f7deb5f9c8f394936ac5c0121037e872566c6094e55c13a6c8b1dfe7f58f10c2fb6ef5d26e68bd955b1fbc81fd50247304402202e16de98fab1cb9ca18fd076d04324846412457b148f39ead2243b62953169d902206211e4ff388faff8d8ad83e028bd071ff03ea09272addb446b893737f94b3de0012103af9f4c7c51d37b7e1affd1ddcf4ca9e223efe0c866a946b57ef14a1f775c26a202473044022001645b021e594f2d95c6bacb3d1bb4951a8e1479954494604dce2f01ba754361022051754a79c34c77d31abcceb3e3f7b9f2f3ce2b697709849de43d3585108815fc012103c53b13312c575f4fc78612f9785b367a29d6c6215188986041684f5cd5ab98e40247304402204f74dba1f9227f5338577033b32c366a9c61bfa8db23cbbbbe2e81fe9c9a4ca4022078806473dca09b8d2b449ba3805a2133f955ddab6b4b693a5a0c2f8ac1fc4d7f012103d4877caaacab83456bb43337077887d351a44c9980d0995a44038f7d718266df02483045022100e43817401702484bdf37b2eb155b8d18246ff75ad2247d4f562a68cc3ef7823002205c299695613d35a60147ee53fb146e231c603fbeead72b525348e157b3672265012102345f12b637128e96ffa683b859b9dfe38832b4affe5c23ca8fcff527f26ed697024730440220772c5960459e2e285583b87ea77868abd49d1829be177cb4e28413f19a78e3e902207edaa1af4a0a4225180b8faa305e21158eff26bd614295c5502ebdeaac37e831012103d373a37758396758d78a3e8f7d1bd1d8b176e3e1fecbc0a008da3e9a6845d32b0248304502210084cb8a9c7ac39e7daa12cc0f1a58d34f7baa3e9bf66d74989c060533784b55fe022047492469534f93e54e066a4628363b3a7227ac4f0f2979838d74c41cfe5e38ab0121031b2d1337f93d691d3b86939c08a0d91058840dd42a8a2e10e9fd45bcf16cf608024730440220168b9e5265d00f1dfbcf36385e7d5f57b59ebd7afa4a519ae4e1688a6d925f8302206fcd741dcba32d308da415d9b0beafac74d4cb01185d5ebb9e8bf48349637d39012103d61882399cabaf02abd5747e05199e0524e25fe5f9eba8df74ab0fd4bd9f4c3e0248304502210094f377881d620f293a1ea4aff35a5236849c80caf0f669d0cc60b4feec3592950220509a183ff8820a61278d867c85e89a95b1993079bfa3de03f21af7fcb35d6c0c012103f0011e49b2bb38d35b860679dd2332bcf2408c8d2b8330886c7013924abfc9ba0247304402205156680ff010b8b20b841386e0bc5e1b0151a60f9550d7c5a25aa2e19859519f0220730ad1bc15ef322ec85bb5433dacc957ea3153b2ea8bee14a79d356ccb4f3b4f0121028955519e26b8a2883660f7eff3a900a2330d9a412d6b846f903bacb03a68097d0002473044022000996d015dc17473d03e59bef8b493a53db82b1717b6c05aa25b94b146d1bcc70220428ed0bbad043ca344d4fe560780fb631add8e88c71829597123893dfec5cb5001210347491376534dd7cebefb18702b8880c2f376c98671d01df4759c3b82bc797f9502473044022056a67f95f38b1fa8b198839b7ea5da32d0b0bf14b93d9e80acd140e3e2b243ab02206bbae4cb1c0e5a1a760c7c52ab797ec3934408db908f638e233581c11c8e501b01210267fecf648929c26616c90be1f8c1e596a134ac8fd8cd32ced86ae7fe39c9af39024730440220297f400e8703c1fec8feee9ab56162851158e375e68f49aa18352742f2a636e102205e81f4dffb6d53a08c8da09533cd7838c71f2bfa3403e2176408372ae4c078d90121031d75abe72061d9d170777fec50059dfdb86310ad339b55478d13a695fad5aa950247304402207a60945b0d194bae080545dd728dc3d5015618363076d2898891f3371e4c3b15022020f2b885983e84691e76a1040399ec83fef227ede9a88c0edb4c8c84ab9caaf0012103fc6c34e54def90cebc15615b9669267e9cadc36e886ad92f4bacdf11ea06709702483045022100862262eb516e1c1e6e89f8c287782a8ba8a4f95c80756bcbced4c782b68abce702207ad13a8c2785744099252410273a0521f621fd05b9550560dac8c9939daed058012102027b3a85860ee743e838bdfeb75df756f1834e9daf6fe785dcebc289ec630d0302483045022100ee55bcb6786109a550a4d06ce21335a82b9f40f355325b6b3ab80c16b99df73c02203c6d3586bc898c369b3e023a1254d8e1628143db2303c967365406f948f325e1012103e7e8fd0fb0ae089ab085210727c87eef47cd0d9e02683d1260031e6978018b8b02483045022100ef7de39b6450e27656b07e98046e28c58cc0f0c8c665e9e6683ca186f859293c02205bbadc8022030b26131660db9ad5f126d107c9ac9258560cfebbfc8fe34f8eb8012103490310227f84c7fc2ff28c48d14813a7c6e086f32f01051af20b936c025855b502483045022100e695936a32f5b92ec5fe2f012a30c25672bacb076ca1b491e398e55453e5b67702204b291d022b3853c365b77d387f37fdfda919dfbfd93fb1a500279d345f922c5c0121023c7afa00bd53a92d2816ba79403904097802084c6031015eef7d72c4ff80e4430247304402207a61c633c8b59f17021201ead4f749b0d967000514b6e7c388510d06ca853b5d0220549267a8cc03642707b7b60742384cf53eba32cacecf95da59e282ebdf127f4701210330cb7636c4127ec0e14e662fe6a63a349720fb452dcff0953b93d4a7b3c5023e02473044022021ea607306d56c41001306a51eefa139de4d9fc9657b771f6b5bb035b197fefb0220348495fb3733a2e13af92dd315d8b0172021e64a3d31b047dd604bc30f879d780121034560274ad4f7f149f82e5e921a3e697e05f24f1055e200f0aa310ee036f020cc02473044022037f75c496295ae3644dce524f66251428d91b4b4b9982cb146314270f8b6c9d102200f810d9232b059007055e2ed022b18c8ee28c1d7ad0a15ead15f58a24d265684012103a1ef725dc2f2c3f07f878293931ce597cd6b543c81dc0b91f87a215e511b6a260247304402206f08975c4811983fdc9240f8b9b6b92ab37f3a0fbd67f08a078aee37943de75302207fa26331f6bc91496c5e8e708a0a74b9264732b28cf840e971de19b62bc0a218012103af9f4c7c51d37b7e1affd1ddcf4ca9e223efe0c866a946b57ef14a1f775c26a202483045022100867ddf577a9ea63e8552ca892d4651afd17514b229de63221bf0d326c2074dd402201ed8e3a3134a77df43d5f3367d371bc268f498f2f054cc665a47a9df12d9aa0f012103e33e95e1eb5ea24d6ab8796ea9aa81d90679c9665ea09639903bcabd7816f5db024830450221008ce5655a98e536abaf2c301da9ae6d17a724c446140389898a3840c13ecb5e50022017d9cda883be4f82478d189611596786f94e97dc619e9bc87f9e0022de8e35df0121027ea1e2ede6148c69afb93abecc1affd8feb016e3193d4cb11eebfd57911c5daa02483045022100a3c85da2ad5c8e7cb75598401fe6c6d9fc3495283ec5080fb424ba530751dd0c0220280e9129dc954cabe1dd5c69aa908a327020921626667724eaeb99024c066dfa012102b228f1df7323178fe9a06887845ef9a04c36c52c1fbaf20c347c668d2b392538024730440220444cf02c159dba0c0bdb73fbab2c99d5ed62b80896f1fedfc7bc6952d40def0802202fd668ccbb5200ab88e0ed746e7d9845990c120a43e0a4e14a5786c740306d630121036211a00c1372fd73df877d5a4e878bf7e47db9b009bca162225bc3231387f31302483045022100b29c9c5cef1ce668bdf128435a78df851ac9b7ac39e4061b4575f2068dfdb8e802206da1aaa0e2c7b538ef9e2111b84baaed2af9261096ffa64e496f304c84d594f5012103d61882399cabaf02abd5747e05199e0524e25fe5f9eba8df74ab0fd4bd9f4c3e02483045022100e80135d66b922f004561d8f0611834243c21885258e000647ac1f3ef653c8f320220338ce0f90653c666d671e2b9b5d7d31d9591c67ddfccfacd52c6fa3f18d66b16012103e9aebc48918b2b49db3b109a01e9216e0aa680d06dffb3b17dac5408c71eb6a202483045022100b63d03b4306444c94884eb6980f6eb273ef2674475e646229101caee648d518102201ba55cdacb0a590a26c898fe4adf70d675c49f6928f19754b18b078cbe81aaf8012102e1771d32e1c382aed7b061992bc56d8de883d90fca973fc5158fff06ba319909024730440220697037d02286620fc62b8947e2ff17c80edddd38823804ca9c36071e249c475402202e41c84761c58da9a97e3ee99055d798b16d6292ed1f1f51249ba5b49cfaa42a012102c58881eca38e21df31c15b729e95d4252b8d963c8640c369e335e7d1cb9af4cb02483045022100a34f856dc0ec24a7e1136edce2990c19dd62980f12aea078dc739018efbc47c0022041247df10029747e287b163067fda89e744d3cd8dccc68219c7566a9417900e40121028608a94fc5254324f3a83c088634506e7176a9855ffae545047ff6651468506c02473044022024980f82afe20747457899ef93fab6a1ae778614ac207003751f376fabc0588b022036ed39576483fe2e9d5793d10e8f582c619ff09c26aeb71abd1fcc5d22398dd0012102892108315cd4ad6169e02181ec110844ec4a4ee113682bfbf6f43e74cb4d3dc2024730440220623ffae6d204265aa69929eee7ad348acd2f2d9f6348038a90ffc5d645f78367022026e4b2bed43ad2d88e0c0e921fbda346a9ae103f8f7e70c377187e3d87c85a92012103a9c8ea0e7cb69a08bd1919fa3b6bbce8f631e4e9a54b95007b7b0a6acbee39fc02483045022100d200bf2276bf748141e182f200b39fd11f8c93528ea5363f06a6e715dc6ae94702205d8310d9620ba666bd34ba6053ec89e88f894528cc453ddebe96ab93a74f0879012102a7d2c9e6a6ce01f831f292e83f4091fe2fb5f561c8d017c2686add8ba0260c6202473044022056cb8aa333e29727678f09fe5e3b2c31d342416a8e88fbccd89401269ae1285c022021a543004c967f5648ab7a260618e5829b74f28d6c3534082f95b19e24b955500121031ef468311ccbf9e21d288433f17f74b47f60da345d662c8b911a9be38f0b01770247304402201453bcf2e5c6160e526684681908ee1b1f531fc0583f209f3c811383f14d150b02206f8b4bead1a60958a7c914d7f69a3837e002775893ae3003047f48e2f1755603012103918d9ea4a4011e2eb680c158001c85c18c20bb4ac67eb04a9e51dc8bbcb0fb8b02483045022100f4395eb55644ecf67167848056bd0b48ebb237e1d8160285172c06f5edd269590220252976af9460e6d6ba62e640447ed4aec3b1180518a0ae3a43b46227ead3ee4a012102889193b78c040a4ed78f041e04e703abb792ffe1b440425cdd7f38a36e9f307602473044022007e0d32815f52282a357b1b1c04863710dd0a137d37d82326747bccb6a475b1202206520d5f98d604fceea783556eecd8eb20a5d01093e801b66c31679f0957de7250121037e651942e0636a72de0e4e08d5baecd81e82a28d562d26a5f4243ea6d9a203210247304402200e350b376dbf66f449601fb207e05bc4aff88741b70e28c0fcb5732337214d3002203aa54dbf99d8b2c06d3d59a2302e0259d5385c1cebf51e2eb9e8af60ae5703d7012102dcafc448fe5a2e204f9ee9c9812ffb3e41ee113631faf34fc370a6e044918dcc02483045022100b47b0c5721d09c3553cf3bc12eb560c355921c888e5f00d5ea3d76c62467f838022001bfc1785280c6ee3f359856e4faa332a06f24b6acc57a9938786ba6e5a776f4012102cd6b75fd14248108c3877c8fa5ec89998414293a2822fa1fededb96c51777e50024730440220602d5a7a901db0e65c042a7b4b2d70bb018d3dd9fe774eaf87cc6a4245e5c46c02200ee4ea2ab850d96d13cac00525d134ea07927176f820acbcf95ed4a0784b91220121027478fd6bc0248f5a136a115e5f0659c3af52368be8888e8e6b657ad0f54c7d1002473044022058212f5a745dfa5b970208cfecd051d1763e327e27e34ee824c23cf0565571e202207b9c3ae195c68de37e2c437068560a0315a87717ac2280a529a88f9d2f420647012103729a58fc3a54baf884432b728c09632fe49689f229bfd69d30b0057368a0e64e0247304402203574133cf52ae7ded4595bd6ecfe68f3c1c3bca3d53f9d72b9df4f33d47261bd022014b9d7227dfd8f8550ee0011509ec7082474a3c3931bd098d5cdfd65aec2e379012103a0f30dc10fb49c4e034b49cd754521f9bbe6737ccee3965c26f6b07b01fdcc4b024730440220288a32f7de6c2dd6b81d14fb9dc3c63b9ee75d1880ebf72f02004ae89aebf3df022025e999d1849a4a715d820f380984383a26fe7b6e36d6eb6067985998f3916d10012102db6357ec8e93a841357bde1b00e2b1298aaa389533281537af7029073c0aa238024730440220606b447038af8b61c37df512d505b01d2c86a433e36d008212333a6a0ab3d7d302203ea0bade61807d45a64855ee04024071abe2f962a7976d24cfe6154f88a530a7012103623d8dc913cbd5a75d41ef9e41e481ca602fb8ad0692fa482057a5a0a22e5a1a02483045022100e5dd53ba5850d34f4289d459169068f73b0b5b27f690cba6cb7b84db04ffddf10220737ee30bfbfb437fd0b6ab7302a071084999b836e1f6718bcc840d5862e55427012103785890bf2da8d430a9f7e210c1bc448103eba35509982ad9915d50b06db95c9202473044022001ee790449416b1d11a60164a3b212cd0a6aefc035eaa3ea071364e17de78c5d0220401ac430faccc7811b5fd4a0262da5d51d7f9035dfe4136aea3ec8e7aeb2339d01210392169d654ca1db85109421cab89be5f1fb5e5d79a60d5c88e223744852962c31024730440220487cad1d9f34b0f93ed2e82806ef88af55f17966f7fc9989941b57895abe4c37022034483f6739c0a2303916911cb6b928e71df3487a1889b31ccdad9e41604df46d0121020be0725e2be68e106702aae6c5f6e0c999aaa30821f057defc9ebdf4cd074e1102483045022100c01861f7979dccc11a44e159b04d960e860919715a3f82c54f9e0804d98231f702205208ce3afb77bed01a80fd0fefa3663c1af5bdbbb968ac648c11e350877976c3012103f35d7636ed64c19bfaa874602d0f6e089b427103b86970c9ad5ddd59e903d47f02473044022019299172bffaea7d0a506a8d8b79aad96ab82148d0be88a8156695290d07b3df02201b479b1e4c60c63d7a0b29067b287c0e84f6c378de1440ef839abc3415950ed1012103e8f542bc69c849d60fe24c8fe65031b8021a53c3ca3a21b30017850423eb374c02483045022100a6bb0de348060f10cf22b886fae3b4524b109f0a17ffc76840615a2d28d812dc0220245eb5516d7d86496b1bb2bfc44af0308b9c79ba6615da7b1c1b201ba81dfb180121036d978760c5546c08b52a2bc1df9460e1f161631fa8e283b80485b665a0443c8c02473044022010db308622d72575e0098197bf505197973d5d240b3c72e2a5134a9266f800d702207343cc202e9e02bd28ef26fe929476f4c9e217432bdb842d481b4b0ae383e3030121037ebeb28e8cddc00bbd320aa250fabcc06eefbbe4aa950f5084b0e57c923aa3940247304402204cde9c11d7960fe4140f22919fbcb70d58d48d1b9ee4e46a40138bd0d61c0862022029fed8f50bb753a5bc585f922586272667b3da7dcfcd13d9bc3f3465bf172942012102dadd98454340e3ddf919900f769a26f3d7f84a0c004882f93382f3fa2a12916202483045022100e91b5803e7663485fc5b9797936dc7bd859eac8f7c9432ab6b46fdfa9ac7e659022038ca293c4d027669a835e507cb2e65b8c2434094590436c3e3ba1f7a6df97d3c0121033729b6fa746584606c0331c8b8f5a67d3a582507f67839cbc6005d112fbb8ddb0247304402205208916a9df64694742f7be9a801709f919c1099790bad813bd8d03f0cd5111a0220461cfc9aee389c1bf680cd67072f68df525dc5b4f75458e500c9a98157c21def012103827bdb0b700847cb6956fbf9b3c91c9d000fb41394bb82a65395a6a642669acc02473044022000ba88557b44ddeb69224579f992b70895023aca015f61be86e22192961700e902202d24ac2e1a0f604877240b5304c92af23b59e5a34fa25daaade1ff71a93ab5de012102502497572066160e8a0e7f8e806cc3aa8b36229ac71d6d366aa0e06549b6457f0247304402206de7ddd88c1586a92c717456dd6dcbb45cd253a5616fce85c4a73cc6b5811ef702201a2e764d7c6993f258115b925eb18caa06113a719a82d54edd1efe6878a8ad01012103fcc203348e8f94947bead88866e6e865a8cf21ba57bece34e824dc12272a203f0247304402202eba0022b45c15d02b6fb010ee25016ce17b8c5ac3bf0871047041f4d7d9fce00220064385f229bd0a35cba3df7045029cf07205e6c681b438ef794321d3f30f21b201210246fed652fb2cddbfb238f8f1633a04049e474f46045d69280e1243ce57d54eec0247304402206a283a684af8f447113ed445ff2eb9e8dfd3e6cdeefdc5b57000ea628bbb41ce022049243d08cd4470c9e8f9e00a530c67c9f62d8fe11d7859d164434f075de2ba600121034295b6a2057f2cf9c48892bb8fcfa3ae9d528a074cebf0826d70dd07152471990247304402206950b5bd2dfa09503101d32d9c612ac833c0cc779fd42733e69557b867117f52022018b6bb5f33fb10d7bb7b27af3799f5444889b83a6a3145769aa220de8880dc4b012103d6ddd39eaa286a5e86ad4d2c984e977c23e10d512caaae6dec55cb9ce6fa8c7a02483045022100ec4a410b3c637a0d984995183a14fb8fb04e69cc5489bfbfc43bf7cb6b1b80ed02201d8e7545f7bb7032e9f88119d8c5c01e1adb8c3b8f4191e8f2078782ea03fdc60121026280bee1a6ca163391189845e80f378f713c0389766c05763b6e6bae86f16b0602483045022100a3b2e3ef8527fef8236dafe4f5dff1cae64da423dd6f64a46309898c7dffb8e702201e5fe60788fab6f9ad960517a4441aa16744989be352dcc8b7e37fc8f4d40bf60121032aebfe7ddcb2fe9bb9ce92b485be5d17c3d19c71904a3d1907f93be9d84b1d1f02483045022100a4982fc2abb9bcefabcbd0ba0052563c98e327ad38f8d926cb47a76cd58b6dfc022067bb147a8081687630266363e2e270a12abb8e72a23f9a5a37c7d78000a8e88d0121034eeedb0eefaa3148808e6dce5e41a94fe032d13fb1c997fe8971df889cc1f0f20248304502210087b43ed3b6abefe02c36838c0f90bc7efdc1e4be6d76b983e11b3f33fa91886902206ffea684fb23eb4d3511bed8c23cfc4c4e2a278c2d0e78a7efbae4d3f1354ad6012103e273ff5c2029b077ca9c89bc6c12724afb9324b9e9285ca8b49c0060c5dcc66e0247304402207f17bba92ab69272ac54332d84206c20391fb04bcb6c7887991478c6a344d56f022013dafefb32cc609674092f1a5ca616cd8e5280f89b364ba591bfa65bd452819a012103b6a8aae639e3096991414fe3f17d6b5b0bec88bbe66f2eaf498647e5330d42a9024830450221008fdba451eec57109ba772fdb740b2b25fffb627a11d2fa3fb231ba318559b85802200120dee55e499032e3b30042dbf1a590d504aab78bbc122ca54e7c5923fd97e3012103b1b947e2b813691f59b80aa3d107b3789af59bb91aaaa75f44b647eab7012b120247304402200c0fec442d21caa3e9b6a877043c993d02f073170ca724c9ff66c3947d871a13022007fbf4fe81ffc8b54d26fb2398e752ec37e2f52bc732f7239b0dc439c24ec0d20121032c9ded352f8a203df07b079f1cebb086ab0df530007c4740e074d83a331b38ed02483045022100e1003ec2a62f648328dd260a06a46c7107b674221fff472eab07d88626aa20200220296af7b952815ca6a3f68ad8579235b2ad14dfb082229df00acbaa05ab39f3400121029893b6506a598cdd0a2ea304e9d6c84a6e8e631514203e20e6bb34e37d9ef6900247304402202abba449b4d4cb80795410dd689bcc179ccaef68c1a821b10256bfd52829558402204b1c2131d0b45032579934b7cf87cef35564f7ec02d006027794499fc62898b60121025ed245014b34177d1e662eda1e18b067ccce648264207098a1e91150e1e8b18b02483045022100bb06622b59a9202f4555100d6f5f9335bb733a077d8f59b0f971600789a15c6502201156eb88a999c1d4e9e53ae05b1347b290c19cf6837ac06697e668c268d07c1a012103b9872c551e61e63023a43a8dc9d32fc23f86f27681423c13d0a6a634a20244720247304402206f4ac18a444138e27f3ef24f7a6ae6ce305909bdaefd8e960b1049fc50b16b6b02202068e5aadc41f1ed4a4cbed0e88b09d52500388f0511d935456b841e787ed34701210232806d9d5a7a4d5f2eb4b4a889ed6076e2f0a04fcf024ba08bc089164ff9a31a02483045022100f362c94455fe373cd6ee4a978681498dcf8991943335f70e6c0d8ba5332df48202201323f38f3d3748ece4a6f38c14c1e3e2b6b7f80f99e14a4917c781f8a0fc172f0121034fb85bb310945779157e303e0262f13c0313a3b8ef335d90485205dd5b9b0541024730440220697cb451b1aa092ac2eb3265a98af73d9d01275f901d58de9575e4bbe4b9d22f02206635bc3d9ab2d86106cefddda006e8d680e0808133703dba8ac01400d983beda0121029fb3af09aaf239de23ed20a43605456647c5336fe9ae220d28402e27105ef951024830450221008b53232b0fe64a444e776020d3dcc78286f057fdf238d8e9c4e581e6c2c35a1402206e0f14b02ba1c5dd1cbf44756015a31bc90f96fae6247553cc2cd68a3c531478012102c0257b6277ac40508ae6f79a1046633f50bde6befa891b945483fbc22a8ac666024730440220217992723417857d26f1a0b01724b10dd4df0eb095594b5a50ccf7965b4ea0a002203054cfdc7acb66ba518b2b7a073854198221109a3e473217c169e550f8e98e4201210293b5891a6c6f3ba7651e7b631360391dd3ea4032ec5886d258e68f534ff96a1202473044022045f191708c04fac1c52967480b75f91b97c89539d48abcf48905f11866c582330220273259302b5de8305c6965c8413214ae107eedd965efa37adb3cd0cc69fc46db012103d6fefc52d9208b43f573bd2d686a2b595ea6a6573d2bb701989c7b6478e7b0460247304402202f2d0162e7812ad93019fa85b54c47d105dba5a8106d49e2eee3f78705387ffa0220576861a0faaef46411691bf403388f4f46c1f3df9bf3de4e9363d65b36da805d01210234dfd8c1674ebe160efa1a769b1230bb4feb4846c4ab69c818438f9c8d94b75002483045022100bc7ace2f5b5b69500f494344078cf665d6baf7da22168e671b1272fc09e58900022031e3766225826df4d1a99d2c6c19b45b1913c7e2c59a0cfc9203686cd9332ee7012103623d8dc913cbd5a75d41ef9e41e481ca602fb8ad0692fa482057a5a0a22e5a1a02463043022023e2166723adf60acd77c63721fadecde34a043b69257ef36dc2946c2d784781021f2393cb09f57884920d85b8fc77f620af05e8fc42730b57a2b047a95a91f89d012103116567371c60ee8de178a7cf43d9cc73b666971ee16bcdd2a1e61cf8ec455712024830450221009aba9ea5b6e7ef4ac04977b2ff2c6975dc6abddee0d629588ec9a184b760298302205c548a5f6c176579ba35621382461d9dca721bc8904389d0348c2b0f77dbd843012103873455879b50730be7d81bf796b7d7053169f8396c99986015a9cfd76be0eb060247304402205543517740396458b74e188bc93ba428d502849f35c1f9beb12cc7001e2a8e4b0220261caf8f8851817b295cf2048653a34032129d6c07da1a4683e086c86084666a012103bbe769008b061fc50ad23bb54be976c5dfcda276526ba0074764c1fcfad9280602483045022100a5bfa0b9274b5119c8c6bf19a3581f847772aa3a43255b5ef78b3f499be9539602200b955fb5b5fdd78b168a73bf348e391d2d6c6cf3b2d803aeeb332ad9dd12966c012103c909c0dff3e5b27fc51da75568744fb1dbbd6d2355f04e31d369e36372bda8de024830450221009a6d3d78373d1f28abafd573c0789ba71aa77ff528d88bcaa5157fa7c9645b480220353da872d4a0f735dfad080712ad5eee4e63babb735041a6df3de08dcf565e94012103b0512a4e7cc8c098ce1ca1b8e0e0d6c1288e0c720f09a5be6a09253c67f2d3a602483045022100eff183a9271c9b14f078f4a2c068fc9e5100b3ca571326687f669047e7d1718902200a4c4abd759e0f51b3e792ed2176c3907a153aeb10b3189f9097f8689bbdee71012102adf48e5284c307669c854f9e4b245dc4828ffa585ff3af8a9b64e8460b1bc02a0247304402205d7598c49370f93eda45e199fa342d55fc365c949867017ae8651fbfa8580370022052a5d5261a30b1da5a8a3cac2656628169c440067b04dd59f3ffff297da0cd3f01210270f2e87ff41efe8dfc840c9d7b5c66de337af9754bfe0215399afdadc864a522024730440220786b2d30d710353977d447ecb2fcd09fda3686db754ba415d32421ed1fd1ba47022039bb235abb5baae6e2faa29a25edbe476377943145a105d67b133f3ed305a48601210369da264bdfc9515e34369d44c3a6e63bd8d0da38289cb09d1f47ca709480e5940247304402202fb27d5d83df206a1ca5e1a6544dc3c656c28d0aa3368f7cb4c6b110da3e59bf022064b98d85cdf3977319b81537fa410e05abec25a96c60e7f553cd7f5e2ee43ef1012103c2dff31126f4fb820c27f834fdb52c22a11e687aa6bb2be35456f6e3f80e08ee02483045022100eb651bb80ee2b592cded6638b538a407f82d670a3d9daaab8e4872a2e210813102203ff43db4060c044da0726a68a423da286e7fa058fbdda15ab816a7d3c007a21d012103fc6c34e54def90cebc15615b9669267e9cadc36e886ad92f4bacdf11ea067097024730440220281132bb7e33dbee88b96b73dc23198bffaae1df9cba2ca105f30842cfcb1a20022001f2c7cca695dd5eeb463540fc9c08bd0593ec6b150704c65473e32b7e8486be0121038dc6f06df0db42ef31a7b9141c5e8170bcb2e35894e787a451c3c8d3c9bf9b3302473044022012e938254b47bd06f1214ccb4e06247f6e7bf0a5b1e35f1d8da8775b909679f902203b13167b0556797658714716edcd5258498276afa6d6e807506be685605b6fa00121024dd6b2a44fad13d7d3a53a85ea039788790cbedaa336f8012fde0531207770cd02483045022100de30c0982e354620fabc62db31b6d1c676b56cf37ee48418cf0f85c305fd5334022072b554b3029463c2dcbde306196bfe0153da047e9c4ca6f14fb2891033c4bea4012103f4d1213d5bee5f1cc4d8067c3475f555ebc92e72f4b9d2b2f3febbf825cef45802483045022100d8bc22d1f9eabd3ba2c93ebee41f6eea57a8dca7c2807c48124bfd5de8bdcd0f022006f13f6b7a165f457677dd06feefc676676bc17a8f0166016fcb117c032e66b201210267b2ebecb9d7fde1ef7811b0ebf58c375a75d759abb78fdc1d50c5d2baf167ea02483045022100e3805b8172c3e71d234b819afcd654ac1a036cd3fe862636916936d0ef51eb9b02200c1ec016869fadf78678339d60c8cdf5cc21789ef8bb008cbc1c6bcd035e477f01210205a61dc58129cfe9afcfbb415022dc0c43ff2224b87ae2cc0f61b14996fb1a5302473044022005c4b7ad135b204245011b2fcc42d7ca41288aea1d538113b34c4c63158e5f4902203a496abd1a179c01750d6e205d108ad787add8709ad0f959dad1827a3a9022ea0121034d28bbbd349ac724d4a3f3128c041368f60c1a018cc4bf499095f757e202c68202483045022100f4b946935ff219ee9e0487c69c793b2e22bdcc3f41d0b585c995e0b848ea00a002205d8a1b3059fd3ceee4215aaea8bfe6a70af86dc58a9acf75d497e691a96013000121023a17234b03abc0a8e0b5a225a71778c6a658a896ff7b6781570135f05ae57d3e02483045022100c8e423fcd2a9593daacdb5c2f7d3a7f5aec60a6ce6a0327a5ab974171e567e45022017b75e97db597cec750abd85bf6d9ace94e52c31885a77d6efcfc8df85b99d84012102265e801d98e9d738f5c13568c1b72bca20ac7a9c6127abc91dd91d45a005454f02483045022100c0d01d92f5a5a9276fa811105e3a3f3a77325c1965a416bede13de822777f1d8022077f832de6343e41204e78858be688c3c61109448859c30efc9b49b1f8ebf416f012102d210a7052686f367bdbdbe0f597b40a51c85de6b24a8bbe99c31eb7274a0b5130247304402200bb46970ffed3c99e4f575930f6a91fadb1902a1745d0a7180b21ba57849650002200e63f2654a4858ff25c224b6dd3cd47c49657cfec5a1457f47c15498ad8212f3012102310e1c6de014b4cb8b3a4544a055b3cbe934cd4df6baf02ea686f8c037cd10cf02483045022100dcec07f6723c92905c921b4f7bae8e23b2e5e429233ac9d2450d0e33e131678e02204f4d79268ee55936ddbb68fb410f4d655a824f426fe2d3e3421ce396740084b6012103ead042e60dbfbb32e86a69096c6ea18f879410903cbafe4f06da953eb5799f280247304402203fc8e78fab05c20fb112b61c2775334744dc8e756aadbb5b63c2efa0a1d2fa4a0220757f98d2ee881807aafa61c744d5539824af4542184d7b3501dbeb4a5b9de488012103ae04eac574ee657324690a2f2860df7db91b6ddd8be2df277f17096b3b9b0c9d02473044022067d1751b493d6042bccbf4427ba650261f409603d619eab94a2b630eec5edc7202207cedb30f6a44dee7646c7476ec18f8fafe9db8370c1027dea61824c16a54863b0121022ac7fa76f7f1f77a0440d69126ec9a7e67cfaf1f36f454cfab8be4543206afa702483045022100b2728bfe6a705277fa53bfcdf79ac90901d853839b6d178c975b8ca15afa1c43022047e4b1edbf9321831aa75e4b9050ccf12e8f3ee21b388efb16595891c8176d900121033c09cf5d75f18fba0fd302813c4455ec9f9c9f67cbf011fcca3f73beee3434d902483045022100e5f5a25bfd6ea42f52c549171228d1f2cbb38b9877b880fcd8221db7962fa59f022074e5f6012bea4585accad9a5f2383d860cecc4cb25d438b7548d537883c92c700121037ec879f59e2871577c12ad731ca80fa8955dc822bb23e088eb390ede991fdf140246304302203ab091e927f8fcb81db6c72dd54ff3cd56cf71f92a23110d67d0d1c3ec2f65f0021f10c0d7476c02afb2b33c121c3e75e0f005e3ee9e37cbd6d366db398ceed1ea0121028f4ebaa6659c8c17f403a6bdd197c248eef1a6fde64fc45ecec7ee88465d80f3024830450221009bdad8ea8c58da6eff74d6b43fab6462b439a998f0f62d9d3140e5813187426e0220523ce8e5f60b40e2e90019f57ae2a6f9ab4899a2d113338e9ba539c255d702be012103f0ff4d855e957748f324c6e4af3931bef9d35933fc362c6643c411f1541acb7c02483045022100fd4c5419cc9e0ed5f02e86328ca84b2a95f7cc3869f3e4bb2f274a555413340b02206b4be3eb22ff936108552e8165d318b7143284980432182cd6f363861a6dd2d4012103558ade9e713ef4975a9279e88a521a56631702d9b70cec44f59916d3cd3d7e79024830450221009b4c7879202f8a204a6f212ae474d7680eb32afe462ef6843fb9a869636d181b02207da3649ac1823b7eec7d95ec7bde07184120b587a5753bfdc0867b93019a253e012103a0f30dc10fb49c4e034b49cd754521f9bbe6737ccee3965c26f6b07b01fdcc4b02483045022100ca07f08ab8e139ab3866799a814eaa30a6bc2865ddda45c5a1de9a9093b42ef802203eb1c6df5661571ddb9d09c04715aecabf2ac175d57e5817702b7668b85174d2012103e635259f7cdd6d69ff3ee3f785f839abd8500c53e98b705bf7e78a8eca08cb5502473044022036684c3b7e3a8910f2b1615535e0d4c951447fce9bc2465046af9fbc8e4f63df02206e8a93d251f8d7bc2428cb6225aa26b238a783da84a4afd0341ba68b8e5a68870121033c06ebac6cb21eefef1d2d4e6401518eb35711430353fa3e985c2e351d9b66c4024830450221008d4d666f9f546d4ab1e9ec1943476ca6009b5568516988a21d339fb0156fa77b022070869d4da791fdb7006686b16efadc1127a0a90a2b902afa4fdbff1e1034e0a7012103cd85f8abb7826dbb451fa8ca330e114b66949dce6c491e930de8549cc63424c102483045022100d9c68a4b0528d850e3eb8e786ec10742c0964b9f091dd44c57400dc25ad20cfe02201b4606af9bdf240fe2e13a425071f0661b8f89ac851a883adf5443202be3c2d0012102be9fadc7d84ea883f2792c1c30d237c72e5a89846733a6adaa7bfa1ac852a00a0247304402204f0a8527057cf96a2fa89b143b65e23fdcfdffdf4bf1a0243f42b29037c6a24602205aa0d3a7c0080565d6c2ada1a15811a5f31cd09ac33b11163bf0c5dfc6d42e4201210238bc52ca5e54313f3bc26f9f374d9ae43b681263fe81897bcb7b5480fe421f9502473044022045beeeb29c88c56cee4f7fd799ac137873b1a58687fd845dbc75847bb0db01f0022061e56888c9a482b85e78a6046581c607673afdbfeac985850ad4ffb32690743d012103b0512a4e7cc8c098ce1ca1b8e0e0d6c1288e0c720f09a5be6a09253c67f2d3a602483045022100d6837d4c223dfa8c134d444809619f5ce6fbd1a8b5acc38a505987bb9797a35a02200be29c72c3111a8f8f7ad63b8a0798f475cf76c6983a8ce06b893c4d7847be4a01210241657226e9c90135147a7bfcce81765b90c4cda34995c2f9f3ac55a140e1929402483045022100c5d975e29148f9df6590e5d5ce07577b619d300df2622a8028a063abb10a189a0220342a75cf58a998a64409943adc30ffafdbdfd15d05b837b92d1732d660300f110121029a34da5ef7f3c4859ef8241c8d53ab64390c29247f726a01117e82f398825761024730440220463685c92e3de58b0d5459fa26813ea304e46c289f34615f5f8001254205e30a02202e10ec629ef0cb4a150c13c729653eb7c86fdf275e2d4bca3df1ea668739b172012103e7c43bee6e8109dd6d818bf4d82227c0a58b12d7e46228237db09231861ab5b10247304402200ecf4cebaacb2f54e674a6515d6c3ecbbababbb7e259a319f0ce32ff137a52240220521dfaf72085fa3c81c7d3791a1b9c0877c68e34d0e9068bcc0775c4ce6c4c38012102868fbe86ae80a01977225f354a57fa66b32294050ee2fb5b953cb73099f8dbb90247304402206d01ea7b3224dec5ca0fc687e0f40b510a15993698f0f79303d73ff6b3a3c63502206c041a8c9812d5911b01244f6e8cf8f456b480bc918354adceef488fecdd6ae801210373b772afbb486b421e25e61d4808711f46b53aafb74bb041efd2a3fcf2d99dc8024730440220278c1f2d7b9742dce7ec53600b77e3e221de5007bc0a896e1d39f3d08a2a845a02200b2acc657a9030b0e55c5af2484c780db37fdc9f1bb738f3bccee03f017e12d3012103b185c55a5e9b7b439eaff7d195025c0259118eb07374733acfa1066c58b19b17024730440220522f4dea5b1b48fcdcec80a7e8ac29112fbf6f6ae8de7e157bb8d1e7a5612ed802203ba487d681da6302ffc395dce673e6214f842342f40297f6a979009d4bb915d2012102d48d64f1171bfceb6ba14fdb516459ef390f718db45e2e3e02aef7b6935251d20247304402204115c879f7c8bc32e8e609138d2070a7138580f7cdb38128b56a75e2e4abd4a802207cd78c148ed3803f92d9bb3d56923b7e122e54332784a1b32404dd73986b24b801210310266fd9518fd0757e8b9ec4abb40c31151461e2222897229b7dafa1f19a1afc02473044022049b87a5346b8720ac1e90612eec31584daf27643b2e6eaab398b7d2827f6609a02207ee1bfa81fe66a30c1e62c32ecb2b0b43b645edcfca303683e4132ce700a316b01210370ed92dacf970a457592f116603115d1bdf420a99c6fedc1a5864fe41f6804d902483045022100ffe91606bd7d4ea17aa790690ffb264f3e50fce1e3720637b28c8f7d344a2239022070897e4c3bf91c1448224a5842dd43a361b4e77501cf86417e3c4253789d244801210295ee93851ce3cb2394593e3de894760f7aadb5fde4a8e75cd6103136876cedf102473044022056da83a9fe9a9b52841592cdd8c76f5d1605807d99dd76201cd80bf1b6a54de3022058785d04ddea8ec3ab7379a5808d90dda54a19bd05934c4540c13f6103ce4751012102c538ff3934b7904bd52ed61473381e0af2062601283ef0d697ebce8ef202ad630247304402202d14686979e30f2be6a6d210890d57ab6daa169dbf05e1458385a764ed910d5c02206331534a12af41c9ddd6c2a5e0311a7e2e398072b68f2c39022fe2e7d753912f012102c5f2f73bb6c1de5b0bc93ef58c13314166041bac06b7fd45f73ab17eb23fd1fe02473044022076175968d6eee685dba60174b9d7945421d93d10fd6e3172df45b3332f1e79970220490bd8eceac0c64e4e4b9e7c7b79a154b10ab0d0d3046b7bf5a3fae6360f0748012102e960f86641002db7624b6af3e0f8d4c236196166639120fdfe43d18c10d72d1c02483045022100b19c1cb8b3f070047f87458fb287452f6f0e58894744bbc21658dd2f17f09df00220443e2491c669793f2c7ec84283cf8d4bfecfc763ac53a1c437cd38a941b5b8a00121022f502781f29eaff43e2608bd2375e798727902fc62792bd5c74736d892a9e5b402473044022077158b5125e091095f6364fd857e5d0b961521d89e50f777298a59981f272c27022011e9465ed7cf99ca8dc0676b3dffadbff483d50f9d5fb03bcc25a9df8461b6e3012102c00f2b6862816e051f6cabeb2eb095191d13686bf07ce92f81142197c203ed6f02473044022077a5db89bf99ed09f3bbca83cfc788705221aa48905fe84fc9595474e78bb8fe02203805fc8f9be6b2a234d39d9e6082dd8cbe055210ec6164220c8b04cfb0606184012102564fd823be891cc32d9ed936d3ce6975fa03b5f67684a2ff3a2d98d2eff19f2902473044022076acc0d50d5fa3bb1936a3dfb0dfffb32acf5198446a12316726f4e0f861c1c102206093ed98069ab091677508b91dd63708ded0f29f47dbbcd4b5fdcf9b82c834990121023e12c82cc890afbb6d701eac6ce92550e9f7ac89c2b2ae3d2674638788f0144502473044022054ee76137b4bfe11bc242ca3565d4fd2408fc928b0fefe7455d46f23e7947acd022042ed304711edc756593ba4adf94e5f4d62ac1d036770f0405ec78a13a38a142e01210307e0ee038adc96497d46843dc158c5642e909888ddde058a62ac64cb1d6b67680247304402202800660af0b8bf38375d92082c66c42a08ee894a471610a4a86d134301a51bfa02205c1f4c80768438972b5930df2b966a31290a81eceddaa2ec245d7ad6d8d30d8f01210283ca16bafe4b437ff47c2732538b291f0fa8dd460181b8e2fcfb9ce41ec7351f024730440220627eb1b8bc3ce9805a7f78700022b8d8c094404c59b52c5460d645eb708cc20502207c42a1fba32a29725b54b564f3fa16b186faa31ef8c93cc02cb52e1176497126012102607c28406abd6361b340d34e6d538bbeb047d72699a8393dbc30c4cb92e35ac50247304402200a5d488697ec77c5089e0d0666521a7ac8b597e5b9796f8cffa4d51cb99b60a70220661a42e0cafcd8633f363ecd3af755624572e9cf3558a05e9f4b97250b13a3c10121022806da39a29da9309a20794a92ceac6a013f94c84cb4e7ed3444436ea48ea9af024730440220024f71b741f93dcb39705e411f8c49a09f60e3c6086a72f2cd565fe10f756bb60220247aec72118a39317205184e09e7a1d49c7855ef846fb49cc0221c344863a5b90121028f678a57e0cf5e104a07f6e714b5fa4ed89e35c2b334fd19f56dbe73df05aea40247304402206ad716e76e264938ac24d09c272361224a7a205e1c429531473af03343d6b46002204ae9e061963ab93e5fa268e1dfa1b39ef0fbc0352dc85312cf8fffc3a64f150f01210352a11e46110dccb288b881a96d6695efa84c46e861c6d03e4cc7f549d60cbab2024830450221008c77055560dbbdd56ea0ec8e92bf7d8c71bfdd3c266c1ecfa77dc636af2f444502202ca37f91ffcf9499aaf357bddc7730e1f169d746b69af543510eec297b26eb0d0121031b842cf5f4daedfe3b99f8e95805e92130ff780a52c932ae77ab48b3d051067802483045022100c0203e37ce6914c747c1f9bbd607ef848fdc72e834db50db680a0eb8374ae51e022006496604deff27745b9218b96d4a106ea60adfe45a5925eadfa7dd82c129c1fb01210325aa2fc88179dcd10f228bf799fd490ac62eef76ceba78db37b8ffddecad42750248304502210081e85ffa9a729c0440ff1b066b5cca1f21e956d201b849a9cfbcbbb6c19baee202200bc17f9689387dc2f84926d7649faaed92c0645624470558ca0653b826fe6e470121026e57df686e6040eb1ae86fc0e30548cf7e25a8b2adb25bd8063d0682902986e6024730440220387539c3ac3a56959becfff4c02518d91fbea619e2523767888e32918733fe92022070488c2e3980ac4b981ad9e41091c2d5317635af1fbf6faf0fa86eff642de0ce012103d6a610ffc7f560c1d9eb520ca09e3da321464ebce616ec32e907c848cd320bde02483045022100ca07e5dc6ab19ed467f202401e34f42d4ada493ba5fc11db4e26c7f633a5868d0220595ee272194a7758c3caf557c0c2caab676b072bfb1d0fc31d0aa4f1edc7263901210267b8687b942bc659a0430f56876207e7fa80a1b5159dd6c5f4ff1b317972f55b02483045022100c2aed5396b95916648effa79be93490ed28486d0e89fbb63fb7119ba010d3f63022041aa69114fdf265648696d1ea635481ecd36a06b506fa283ce021ad9babdb56a012102e1d094cc7ecac2e1ecafb21f08628ec703826dc12fd53adb53d9791d1eab85eb02483045022100a3687e86ec4ebf00e089d21e55328ad7d4bd52aca72d268eecdbf7ccc90210c3022048612c234ea9911cf694e480499472a856fbc94cfae24736b45f851ca9429505012102feea44825baa1cf35fe181782edebb4b44cb61a57bfe30b528d04ed3435082da0247304402205892d3afbc47c50b580c68edf8805de8383c94d2dbfe3b19cf6204a3233389fe02203358d81ea7fd908346538cda2ca21eb3a36952030ebb90aa08a733ce70e9faa80121035eaf4043f2041acf2d5079e1cf64427ffb1c3ff501eb7313ddaaeb78c0a1ecc402483045022100a8506f60f5b90dd9ea32d33837ab94fbf989003ad3a0b86f216834b84613b4e402203399214351a283b982a058720cf44bdb52e8bb32727ab79309e3ceab47093b00012103fb1381f9b7c186c088e000b61bdce9d0f71030932b36f2496d6fdbf58fc8c45d02473044022007c81da6444970c226ee2fc31e50b16302bafefa079c47f2546269587b116f4e022033041635ffd3363df50b09e660b44c1af36c04c4263820bc866d7526988dfb86012102b9abd6d6dd0eb070b6bb14c542ac5fcccd39eb890f2a43abfc5ccd4a91e9a27e02483045022100e25fde86ad44b7062f44103de7308e4221fc71bc714d0e80e82e786521c9592a02206dbf70cd31ea3646a2b9f886d28a11d596fd9faed5f96535a07ef723bc3d3dc40121034850054f785afd46059ace4805aed52deace0d3d53de0d77092e9fa5735e98c602483045022100e310ecbe3d202532ed301ada9992ba54eea4c5433079129ca4e7d2b1e956a7fc0220303145daeee118732b02586382e2406d89e70008b35b856389f1d7038cdbc5380121039da086b24e9f8784144ce6c55f6f1b607943cd8dbcddc3434e37eee312c5bdad024730440220228b100aaf9cfd6b2ed88dec122c785a0b214b12a0e551062e4d8271016dfcd502205cc2c09a4f29a47cf183da304dce750153fe56f5ab540b6ff149cc5cda5ab72c01210399bdd2f316558cc93db558fb889698406a6c06c3715e65e0d71eaa5ecb9a928902483045022100d8f8fbe01e10bc8175a637878b4c0aee091556a619aded022fdb6c99d776c2a902207f1bd1819c408d8c162c23174138bbe4fe643c24310fc70ccd0af13007c144d7012103be4836c458c207b2ae7b0f99edee800499950542716b1899a8bacaecfa4745c7024830450221009b3e94615129a6dcc03c0218f61b2ed072058e301667ba04f6efbbd3683f97b002200c088f10003b2d0e61d79d2c6dce905d9b987e1a18ea1124e900666eda7e4e3c01210229f4e6ed0a420025169c4d6e0f4b24bd245724e876edb9c28ed327993ffb810202483045022100f8b3699239b5c9f5fd43f357d43cc971a8f692816f73a2f0ac686759d2aad965022061862a2b93e282570a453017b9e19db0975ddb7beb6bbbbbb31469905af940f801210359cc361b4c23dcc0bb3f80694d35b24f74553fb678f59ff7a10c4311ffc76caf02483045022100ca3d02b36bfea01357542d03a9efc71068f2e4479879374b91d3d92331830514022057b05851cc4bdb2580da8ad59310d1a55a9eb5177105ff1a8c90b9a4ae3404010121036eef02d8d91970e6ce2cc5a704dedfbb4b29404166d6faef64efd26d9772fbcc02473044022037181578b489108dea705db002f76f6b428575cf64d91a92697e3b71610b073c02206861367901e65c1ac29993de1f9502b03e2f7e90349adf2cc1e57f2b257de2bf0121033b00585b703f6aa39f36a3a266ca0cbcc6d535a4595546c1e5537fa757e3ed030247304402205ce09031b5fc9e9b43abffd59359e3fad78ec3e1ad69c10961bddabbbba1bc35022038ce43cac8d13cfb8793303b457e62dc37803f66e93c06ae8bf773e9c2045dce01210323ae69e378021d2434a83e446cdb934054780b2810cd906a924b939eec5a37f002483045022100dd63ea774709194ee95db5f25a11ee7be3174d16450a7bdfad28287613c8fdbf02203245ed8750bc65e913124bdc5da28b252929646962ee9511d6331e08add36f6d012102350f529a32286f6eb5ea1b5c9de10642be7522df96dee2dd638a4a2dbeb959d902483045022100ba06507dcc65f1341b0aedcfcddc8d3980a2a21d1e675bbb8445a4d64e1f044702200b56a3fea18d876cd2d65045e7c108edf8d512fc756f67302c309b098a4e5df501210361ff9da418ed7b54955fb6dd902c4db56b603fa6e7696af1ee336a248355d9b102483045022100ff0a860fc73c63e99267f960793768d8019c5f3c1a46ec1e67ffc512605da5930220586b4963194d6e4d2a51f8404db6323f2747294fb5f2c9b2901dcf866f143f02012103cd85f8abb7826dbb451fa8ca330e114b66949dce6c491e930de8549cc63424c1024730440220406f7da98c62cd959bbd8dacd4b73b2f121841662ad89869e5122761017aece202205b93712e37d7552983804b6cccfcff1864adbdb642621702a99129a4d4074e79012102426dce357baba451cba85e2f3d042bc2e3a3bf5ca560f5a7381b45f20e612a8102473044022047e15b26df1961f6fdb5ac765f657b3532a6189d2ad1baa5d9c208bc7c00555102202a01c4fd54a3b051fdee6ae7cb4de2750b830be53accb41b86e2eabf38eeab44012103ba353923c56cb537616c84354ec0d4a5f59d0ce0a8f41ee10baa1b2e513f5b3502483045022100f4279d0fc772bd9bd6f528091a8004141c29ab996fb7fba6bc7711e3e15869d3022028c7a92ab098e40bcf14fbfdae64c4524d6a037ff20c147ce97f6dd74b7934130121035efa86829e1ce16a81a81d8333272fd8a3432ef2aaa90c68b0d6e908c82a681502473044022045d0118c1cde3d6bebc3718d8e718c8cb35ed24f8629102b6e2988c58e11c5c202207baf87daaedba6586249f0999272150718e0ec1d87d29cd37d608c2a75df96cb01210223b4f3fe5554b458610c8fa68ea53c3cf4f9efd4a03d0e96d6e1cdd68734f6b90247304402204f249c73c7d88fe8f09bc9d850ef6247fd65ff273e1192ebc31260744220f7520220035a2647b8d703c049dea65b475a5c0f117c25201cc1bbae004b6d3522a8fc9a012103623d8dc913cbd5a75d41ef9e41e481ca602fb8ad0692fa482057a5a0a22e5a1a0248304502210084d8fc6366997d52c69fa084ff70b22179f9b372b4ef48c9d161349fee94801302205a1cfaeece48d23117fc22686313596b302360b8403ec8da0ded98d24377897d012102b651b9e448cb4ffb45428a306dcbde7cebe52bbec3d624e5d9af52b28edee1af02483045022100b957700898cac854bdbafa19b7285ea92c6f0495cfa85fa768f036e5b6368de002202ef83089be7c609afc7b996a19f71a2c1a8c60d20657d6da2fa0f9a55808de1501210328a55ff0361caa9463f25c759cbb6ed4778bc7345f3711f13dfefca09bd3092802483045022100f689b9ca87269ae9d9c364b3e622aa26dbcdbf7175a7e185b0a97f78a172b6f0022031d9b3e2349115eef7443b4124bd6df829d50bc3a5b084f26468b6791e853e0f0121038625260a45c8b932f6883e0bdc24232740b94d6a7c5b3b573b6c68f2f34151a602473044022071d97581ae07882bfa963adad6d55ac354f0ed8895fe5dde52074ee76a52e707022040678dbe75d0dc4301a78868c6f9b8cd3d4ef2f8f977a8016894966485c36991012102eac5dd056d2f45c393434669a68e699fa9f678c96948d05173d626d2aedd054a02483045022100e2cfea51b01e978899613821758410018b82bb14a1f0fb19371de75f2fb331e3022077e1190d03e1e878aa61ff9cd02b5603e60fbbe668cf756d2212ab1d8162528e0121033b00585b703f6aa39f36a3a266ca0cbcc6d535a4595546c1e5537fa757e3ed0302483045022100bc1d409dcbd2bd2294dae078d6080ce361ac5d5de0d2c54136f2322dccc088de0220669d4046459ab3536da8603c990fe5ab5df0584b46d3bc69f703477ff298e11e012102e3908ef8a3d6978db5cbaf199a8e96fe1f3ba296b32bc44307f8e0d1068fb91c024730440220618ad4f12f6438bdd6babffb6c6383009ce56f8956fe408d9ce0fe527cb56b8302204abd7b64bc5c2ba8c040110607422d45b3e8821d6780889c70def0a90b4cbcbb012102f010294a627359f8810bff1ee7ca9b618f244a9b8753723251578202eb032b3f02483045022100c1e56aa92c16f8df81badb14cbcda5cc8363a55ef95beecb9cd898173fd6f7d00220424fe624eb5910a6b6adf7d2389a74da83c441fdf6dd83ec93a33d68621087d3012103a9fe18bfa2ff68dcf70e4e4418560a6493fe1b49636b26191285530d2a7e239d02483045022100bc7db9a1a70cc293a022a5fb6496de4b46011ab98ccba6005b8cf6dfb5be1d80022005f91a0610379eb78afe254c6f2db52568c4e3d08af681f5111e87eae36cd4c6012103e3edceef4b1c3a0a05cb972e4868feb736628e9e20e96476b7bd279dde583ba002483045022100fd4f95994ffde84205c1cf9d628e5841100bc7bf0f3c2b444395ba7f74d88f3a02206b3a28b9c032c966e4304535c224f92e07d26e2955048e55613c6a439e117d870121020083142eaba06060d9084f721d42d55545e1e6576453874663d818913b397ac1024830450221009515bd202d3ab632cef0e80baa40938031aa469a3e9ceccaa2885fb8d7485ae102203d12da5faa08a2189dcf89a377b03322720bbfd7c6d1774c062ddd3556df8c34012102a6a70b47c0339d53f9093f00f12f20cc02d393ebb868d3695de405ce90f4399402483045022100faaf7b927c661fbf58bdd5602b6db3447e6184f410cec45c66b6ee008631056e02203e98d413543cdc0a365e07d018a0a803b11f3c590a98b336e3e08d102c09db8b012103994dfdcf3ac2835ac09e4f84edd755fa89e49d4be133bda9dbf643804ccd5e52024730440220528d55f4f1c95835168440ffcbf22ac7372080915571494eccb23499aff8a08402201d39d62f8d4b2b9c11c4961c41d828ff286e3e31eae7a4af3b2324111be067950121022b3bdfa522e9c03aa489b768b853e8816831167a6da940f13771e215324b6b3602473044022075c6f5b3a5d122f642112420cbfa470b50329cd04e3f93beb4db95cafcbffad30220366073b206e01442d378bc1cdfa53a200e959eb6803a6258caeaaa8d468b377c0121033a1e26ba585a9a7f1a9e6c07b5fbef9007da4829c1f784da3c60d4ba79edf36d02483045022100bb24addecf89e7bfb447659d661a67cd680384f7b985775c22664633f82db3dc02203ba58dac38720773c8a011a06e9ded9c736a10585eb1208b70a93fe18c7ff73e012102bce2028446157945d9727516dbc9de17ba5f50c7a5ae80055f8323b4574e77b5024730440220594283dcd8168a41fcbadb4daa9c5bf717e09c14fad84c313c0453b122f1a9cf022068aec1326efe44f9a27f9234494110326e9f15bd8652a7e7886090b49d62b86c012103f3b517adaed1b8cbda7feffd06e82ed71ebdfecfe6c5812f8c7eb98d36f607690247304402205379baeea89f54b8e4a28092201cf98ac86c16a312264962b7dcab0c3cc990c202205deb58ace65a0d261eac5bb7f20c393a6d89ced9222500f91692eb54c815adee01210250f1da8f46ada9bb746997c951ba1dd474e9ca45cbe687b335a6d7bc025413c402473044022058e3bbf491832bc853b647b82d4592ca6861cf274926f3f2211aba4dc51a8f26022051cc4f77e3877b5b225641c9bbca597fa03f72e10f822a1d2f3911496c0c04c401210243352b5f45d9a3e7096ff8f3d5095cf6e81b3cf8e1aba1df09eb38e0bca247b40247304402205fd9d69101e768465c50c364afcc553fbdf3eede6eaa4617251167ef189c33f3022065ab3cf928d1f20dee83c01fe3e239365fde8739ba6d7fab965f5d5918599ffd012102367ee7f1e3908bf9876471f8b90e2b08ed231cc8f82716285ed5dfcf1de6a0540247304402206184e0f56691dc99f7fbb0926c569a5321d6a19892d9609ee9680a0e4d951c9102201a08b102366e205ddb27777cb34218ad9b47ea951b708bd4b12d36ebb2dc624c01210242eeaa6e44b207267b4ea7941981379edfad946e9d86e15f43b35328e08e258a0247304402200b4400ce1a41414b6d2cb79e462c93be599da7142c0b48251b32f7b23b30b4f902207855260a33265982b0f6c1280b3460bbfe861969805106fd93f37fa743ad71b0012102cbf4b3e99c081899f8df4f317969e4dc23a38ed4bd5ee1723d03495386659d5e0247304402206724aa3e73d1154f5b8e1541539507bfce7205435d68846b773086b2b058c88f0220492de1c8a24e98861c66af3a6ce220474ac20641016c585887dce407b603ac210121031b2d1337f93d691d3b86939c08a0d91058840dd42a8a2e10e9fd45bcf16cf60802483045022100b19298dada345af831f326c98bef91e963a48ab456d24e25c19d6e38c1cf3a970220196de1d061a6448009407c4bb415f710464a13fa8c5b60eab9701bf6dc93771e012103a9c8ea0e7cb69a08bd1919fa3b6bbce8f631e4e9a54b95007b7b0a6acbee39fc0247304402200ea81db228b6a282ac9105a29829602b876abe9650726dc56ad31892e97b830f02204e999d6208a07df110f32ce5e180abb4605d0a7fcc45b92cdd924c0780f8eed4012103c316563ab8892ea1883a9699bd7ac1708b646ca065aef49c5443269abf80fe0002483045022100a6bec2f00f36d99ef57bc7e94430ea0037d71eae4182e3220f01138b0462bc7302202609284f0fcb856a7595b1c1e10ab200755056547b3624e2bb27dca54c9caab601210335c8d8d8facc054238fbb1a42157883a8706bf1224a74c208009456071f2006802483045022100e883df05a240863e521a5a6c8884b075d5c7d9bb7eba309baa25613e93697296022007a7fbd3b983ba8a3e09ebac6ec59298803b4261452771ad0656b1c98b4d4736012102ef07a32e44d3d0f6f5fd1dfb0c52307a8bb5589b436db3b356cade606fd062a6024730440220222137296a7a5f38d0b3747d083b8f58a6a38f50b102e8e23a98045cfb053cc402206a5cf73f1bcc69a420436f83d44daed6cf4c9a592604b1f641d0506ba4e043c4012102b4216e3c52bdddb8712f68fe1b5b162f5b183fb6c9a4b096b81fcd49c4d3766f0247304402201f06d8edcbd3333bad833aa582e8469e8a0ec46a7f9d18f8cb9a16cb81a4d84002203d7d483ead601c669b9b60990ed0f8e70caa802d2d5cd9cfa02bea58463f1598012103a3f36a89186575813e381f52e73c6be89335beb231082ebaf7405d1d7071ccc90247304402200b78fbc0e78bec1079b94549d457bf377f7a494be2710e7b6b7e5498378b227b0220763688cc13596305aea156b256ce33dffb50132c12222a7ff314fe37e084b01d012102a7129f9cfd5f7db653a25c7224c8b165be8dec5ab76eefc29fd6b3069d3aa75f0247304402204d2d290b7c33cdc5b1e4e8c3b4ae18c5754f1ee38f052d960d18c0a9877d12b5022063157df772f02d2bbbfa8a699413535b24c8bb60ef019e0668789212a1a28575012102c226f9053a8e8ad34473a4c59a2958fa1e6bfb8060f9ac2108a0402fa5f6d0f402483045022100e76fedbb73d78e3be648e344f44a38474224a47d5a25dfe1a795e092c4c767a4022040a2d0a06126d63bec0101a9e24a45c5a28e1e1f3264b16fb90ba27498d57a32012103b2ad730b379e9537ee26c797ed92ea23407ff840540d384e14d698ddce0c85a70247304402201a1f068baa8962bb30b4e285447a17716bd55944d88f72aed9f432896a8b6ba10220400672d24da41249a5b478d02f17bcf4cd800ab41043d8f002c30846827a0b150121035915bb7d456cf8d01b80a319b51eeafcfebebe0972322fa3ded7a51362b850330247304402206b9f6e35fb7a5e9f72c381aaab430c4367732a16649a30b8373944202a164ff802201cdcd3a813993c8d03638b84d051842d732993a5c21802d516ddbd6931e60648012102ee89cfa139b320bacf561dc8172050e7c70233e9f28e3a7499f31a64448c0b7d024730440220372017d0d0670e649aac28f3208068c0f218b2116f1c04fbde60f65a98d46e6102201176984fd325d0fcdfc102d69e494cc9d414ca524f4e5cfde87337c2d30a925e0121034a7d334fe0e5edcd3b0ce29eea6dd005dfb283fa882ccd53381c7608b851b26b02483045022100d6105ed6fdca653cf06d645c802a4a5d8f93e7a7a464e079a2ac11bed1cb9b78022051e176572a6d0f93499d28e1eb3c611958b6ebc9f96c9c9c83d44f6165a27003012103e5e8537c960d3804777ca922c6bd37acd2278f49775f3e758e2c60ed5f16f34a0248304502210082776d6a38c208e6b19dd6d4cd7caacfc3c883f9d82a9ca6b8d15f88da2436d502204a59c2a91191cbd62e4311e0ef5eb1a51a95a0e1161ee27f803b28ce0d70a57e0121037bd2d50d1bc55e8a7c9ddf8d2c45cb56991b394af2ba6444c7bb543c756dda6902473044022003a4fcb070cf73014c0770a8c274891a52a2d2a9e3ba308188a9ec17de8294a20220266aeda076dc2a364989ff05d5072ef92418836e314c5c25530184fe437768e0012102cfce75ccd8c1b4119ddb80d08d74d3dcaf41cd5a8891e05889cece80614e29dd0247304402206993c4072f486b9b7620e26a62dac04f6beda0f8584cfd8d92556581be40df2a022072c3404980e8304b35604d8e57e42bffddf1024f0887229159869a8f816f3d65012102216fefd8ae6e7a23d9b87b8507bff440dc1236b2766644fbda69935951ecaced0002483045022100b22d8165e0e8b4df021225ea16dffcd60c9b5153da424181449aaaef4d326925022030ee5321a219714075df3defcd2e4ceab03482b3eaf1f1e766f4f759ddc58e2301210270e6037ffe3b0173de784367d7e44774747e23915465c0e9aa9b141e076aeb6d024830450221008216b35a3443a39406b58c016689d387f6580d853e9dd5539b9a29b52476d02c02204054c1fa7286e6ab0c54c89598d2ec1a324e1859f85c3bd276c9f23ae154f1f70121028685b571baf91831367e5ff28ba1cc6c66ab63f83ee0242ee192ecfa0221c74c02473044022025a4478a048959120fbe057548ee56f0d9288aa0546f293b5a273db6db6bdb5c02200d7a56ea24a5cbf21e0f5199dad632f1de76b26104d5f4d2173cc413888000a6012102b81e857adb79cf4edd763f44571b0f269c002b85b4399c6beceee353e0ed63a002473044022034ecf5b5754af7d2e8bdd144dfb2be82edc0cd37a2c274bc348610e45e0dfaa502205d1a33e9abcabda6c41fd23a7bc5ace2e52fa253fd100f84b2594dc732cc5bb1012102980d7a46523ba34477db4566abff1fa1556e1866572f15d1593845580b9dd0880247304402205ec2466396ce97b12e1fffbbae11789f79dcb4d1c8ad2f0fe795928ae50ec71202202102e804e46cb97aa54e58425b9c802e6fe9d47bffa5cf1fa66be35261119656012102a726d1d0d1554e51f1ff953f94cd1b29f3043c88c1c2d9a1f9e26ae090e6c0840247304402203d9a57e607d5ed7d867828b022f872eb58c0aba529961320395e96f7b898955a022057a738ceff8142d261637c5d8fd16083c657a430357962f6420651ba37e8dfc6012102393a1aa371e6946a7ca64651e5d09719af0a189f74a24ea6fb5f8081bac407c00247304402206526bb92bc6f7220eef29aa2a352ade1d49acdb84186f285ad0ed344f26218d002204b8bdab6eaf31e0962afd7d12cb057cfb2202f11956d96ec82ab5d7bfa4191bc012102ccee72630799e6fc10e4c5ec4294fe02404d807df06815f378fa4b82847d594d0247304402202a19d5e2ca6a1722af4ac20d0ab1c2614a8a717109295a5432a4d0ce37c311f5022012b01aa7e8d6d01a2772545394a0c5c6d0f1769298b1e1ff5031bf64b4249a3f012102c1620f357cc1e7ea445faba7b685fd87bf30cae7e9f3fae4db0c72b080abca580247304402205cca7654888538a5c254340272c9821f6ca6ddc5a1e898197ceb4cc39eab648702204a158261217aeb068ac86eb7abdff90bb38a6fccd4febea9635636e2b5c0a17a012103030d6bd733fdd8680ad339e342b5df3a3d602b28cf949cfea8da552a973f232702483045022100d8ad3d6e18ea2f07f3735575b7f7de1ad5f6f26f308a3bd3af0ac6047b749d3602206494fd0b48e3417934df6606692ec358e80667318d38861c0b598a295c388ed70121039a893d30c66e8a17bd27079b74d978fa16da13f43459792d27e893f16626fbbb02483045022100d5f34d9b260c4a1adc3c1d707965955df862bf35e2fe096bfcff68cb3905902c02206726ad9931a9a8c34e4dd8ecc2d5412ff21da2c991d2bff28a1f4ab62d1d0054012102736ad497623d8627ab0eaf97736135c776721ef309c6a535623f3cd1d83b09db02473044022059451ba1c49b7e73d5ed6e2d987bca0bd3c244c14fa08745c8d9a300e55fa50a0220537c170d32e094297650330f8ce7ad9f7bea7603318f91dff5297d7299de4bdb01210227bc5003d155db1194cfb40ed2e7d98a37aab415d3bd7b2db18e47814229c8f1024830450221008e22e4be8428130481813cf34e4a30ca3caa1700b6b4944704313e77d88267bc02206eb5437bd725e0142ab48ddac3dc91d4aaf3b28e02a112218209c24f87c7399a0121034af6926fd6cb59b12321d837ebecb63687ab204a0f0f7ddf9fdfe83a21c6cd7702483045022100fa8b8487ae0b258508f8da16ee34f280543106cbfb53ac3fb5235bb18ef8ccbc02206fa79f532a6ffd0e143c7a7b96ad146cf9a68c3f5706d999b82a29dde2f73a7101210210477c87e3b54cf8a4e8cba49987dc546747f049088feb2d5d3d94f06679152702483045022100c1f7ec468af3eb85ecc66bc2d13bb5f2fe13a4283d85c87580478198ef4f6d510220306069ce2773bb2acaed5ed56d6b87c0e73f91b2de2cf13f64ed78c94e7832fd01210347491376534dd7cebefb18702b8880c2f376c98671d01df4759c3b82bc797f9502483045022100bfe952401f68767b67bf86c958c8c666df671c45a1c86ad4cfc29eaf6692e00e022013c5371b78be48d451a569767317a5386be747dd50af283b72cbb62f1a53dc7e012103e43b0ef86ca5b6708aadd00e75006b8d77c4fa5e192775c2fa7b64d4a431ec1f02483045022100be8126e391d1e9403baea591f69ccbed6122b2cd3887a92132eb69dd69513d3d02205d81a5981d8fb2e5a6531853f9ca6c7f10e098e569c2b73d82148d94c988abfa012102a61cc77e0e29e96c4223a0b6f358e03f1770b88208333627a43b4e42c46f21ce02483045022100ea01fab51bb38b2132005c6fad5ba6c872186a1821bdda2c6cbb2630910a9f8b02204f90ab48ad1dd0b6654bd5daf41aa127d385d9cfb38607d9c626e8026a94d8a2012103186568d8dd51ef03b5e2b9facc74a0d02eef89b918d2cacf24576f6a9d61bf4502483045022100adff313e17326e7ae4d8bf6d444eb10e5dcf44d508f212992abd7d6cde14cf6002205a401fed1d1e08b2057f2180de33b6aaa429e6368775910c14d3bea986ab1e970121024d3432e9c7b5baa0572d204b245095b454c90cb9fd0b6a78b6bd7adb5da86dfc02473044022023f4915e2e52b1408a95c28ec418c7f35c74cf42d64b05698d6c14e1c6c462ac02201c05eecda368bd1d60a8f5c2cae8c3876eae3c8fd342992cdbe63eecd64ce2a4012102550c2e7dc88f519ccffb4456b5f63be4dd3977116b3d7d280bcc57e6e7c2c7ec0247304402206f487ded34c68b9a3e9529a4132a88ef98a09fdd67fcedb7ac616e136bb9e61002200c0756ee20a0952f2ce1328d21a3a8074b50c97c05dbd4fa428469f55d7d5bba012102b1fd4870eada0aecf62daac3707a2df67aadcf3dc9e7e5edab5653e6edb4d8430247304402203ba27765d92e8554f94dadddf2b4969550c4886278a1518ce3aea046bd440dcb02202ba6f75bfd9eb33817af232b6015a4663f144173b1677a9b5db1fe14490a19ac012103e8034913b49c3df8615a59750606e97337b465997d6b774f072402a30718a3ce0247304402206ecc8e57a577bcff040ab80bde480d2860ca0516993175a2baf99cc00219d92002207092d8986fe1f8372d2be420a81c5decefc2fc430a76bbf6ce62a13a2f4e99090121029e30273025d302015d4b9522175b35010efbba15765ade70a84f3581bb0f61f502483045022100abd4050ab1b031a991c6894cd2d0805565101b9e7dbfa4315db2c68955a2ae89022047f23abfbe68b2079607a56c0ad72476567b9ae09cdbc73ac1525c6e9311c931012103ab6bed599e04b845b8c6dbc32bacf773044f60c27f301fd4dfa8f7d6c4576baf0247304402203e22bf59e208c838d90a77bf2da14028bbe6642ca6d4c65133d635b859f7483d0220497ec9dc25ff1bcfebbc76a1c623ae5c631af3e20fcccfcaa1f05dec16a481e90121028f917a8f54096542c1ea0fc6d75e5483242dbd3b0bedaacd08d96b820f5c22890002483045022100d273ba0de8ed4f321ee2318f145fbfa12a9980e0916682396b26b2fd1de0ff690220199d13e083d0095adb91ff0d797256aa5d7fc48c4c83a257d53cda5549480a9a01210242eeaa6e44b207267b4ea7941981379edfad946e9d86e15f43b35328e08e258a024730440220163cb24bf4a3a9fc21bbdcffa54a86097b67f6de8fef546c101ce7e62a71f846022027ca24062418c83eeb1251c95b0ccd3fcc51f6c90324fdbebc91955d229f9f020121039a23ccd39ea44a8c79b32634d90ecf7d4ccdf5d2c6186a0dbe68956fd0d94de3024830450221008d42a3865dc6b9908fa211dfe7724f20946a63d9d32e824142b0eb32f0f8bd9802203ba55bbdd184844d01b1163af822647b0887f8231ad729767b329eb62f71b7290121033b00585b703f6aa39f36a3a266ca0cbcc6d535a4595546c1e5537fa757e3ed0302483045022100e03258a9e061a9da805ca7de5235703437e954e8119dd96c817cb507035d5aca02207e7305d999f048f64fc7a310bc4c348b69a7c407038b0a264acf6e1a40e7b472012102d351c59227a32d933e2a87618991adeb737f6393fa34c9181bd422c3f6f115b80247304402207e55c7cbe97e733943c8a715b0b45828eb1db966a8d118cee09e09f8fba7ee2202201331b33d6d04702732ed6f194e3361e8980187fe24053fad5d1f4a08e0da595e012102be4291094f16479d281ad848757e1ebdd812925f962e9ec4c92b4ef7f00a11d0024730440220410e8838932261035a22a4c85e9c5764a20ee1c6c2d72d95f96772a73f661cd502203e1a208007ea200a8635501fb3f50535c8eb47d1cc5e703deeb39aa3d4c05fbf0121036c0f889b1d37a600fa65f2d2209438e96d97188ad951743b1041a6b5b7354df10247304402201a54ece978183b03d6be0ab140c486906b7498569469468a8307c3f28a52261702206473b4c118b1c0c2352820f515eead94e12a3ee3c47a9c044ca1b3dfbcc898aa0121027d8588c9358d198e693faa37e0b5645c096acc7353b7e7c5360eedd121081fb102483045022100b7851b5dd27813316262598133ab910b884b9d99b335b6bd8b77a0d1e3c47d9602200bba9f9c415997b0cfc1cd420877e9444ac130f9f1c53082ce9ebc6e96516147012103afe9eac220fd34465ae78095177e919e75c093bff52b5df56e9e19f83ed109ad02473044022009f41c38551427ea9298f8e67724cc6603ba6b2b077733bb5d9154be0883d2ab02205655fcb0ccd78f3b53cab0db86c99b99b6b9ca9bb46b82d9f769b3bf6886b11a0121039fb5620da8683f9e437a9927553355ff0591a107bcd56e2245cb9570244e8f95024730440220073ca711160adb26eb58bd6b30ecb8683426c15b538c8e9ad6eaf43842ec22b5022014a9cf80fcd5ec5ecb5f74d74da7db301589026d9c3da0bc23e9022b30bea9870121036ed3d745d3482914153d338c3fd87ddc4f9da150c6aeaf5b2cde3f8424fd3911024730440220559c547a4764ec9c6e846efe7f4a59a6bfec4606c8b48e9da5129c992240624602202d2e52cf0c53bb22630a3057492daf794dc8fc3a87676c763de830a179d2a0690121029b9cea8687f261dfad0bac1c87d77f5812aa04e4b0620b695e5cb16a32938c1102483045022100d26b6e8ab7027f4fe2218f26ab26d3b1085b84093872bdb0c7596cb5756f509b022010f66882d97b8e966ad9b098c139e7df54fc0f83a0ae819738204a3f6c04817c012103397d7a98ff92fe4f7173e3dddf73da0626ae46a37274761f17b6ff45a56f6fb10247304402202912dbca49b9138d54f29d057f84e41ce1b14e7b97a4e45f50e1be0300a290af02203763d26a6a012a3fac91a932b0c23edd06ee7338dbe2f01441897bc6ebf42853012102442d47e572149c2eb3cbb47345193024e26af48b6b5c21f5cc9d920cac698fc402483045022100c819539aae1fbde64f604da7902ed91fb26735791a2310de5bfd77cab020ffc8022035756be9f4f8d01f141026e41ad71069fc76861e2bcc1dc9ece782e12dccb70d012102264b9acf36f9357c22a4226356aa63db6e54353c60d175430986757f4946f08802473044022063be11f708cf01eba244c56eeb909d9becdb4857349e541f4fd1dbd1a97019eb022015129ac1aeb4b2084c41254799783e4b4b5257e2bdda903e073650ede2211c45012103501268aef6ae7ae34f36bc84c2abb06458be36df5e4b02f52b9a5178f1c4e9850247304402201df2baaadd18b49db7cb194c022632b9d31322d2ce513919208f413fc162f6d802207cf06ed4009cea6837ffa58bbb18dee9747590b75067a2083396a0a4334dc1bd012102247cfa7c0edcf56fe1d46db38a0f943747536db7fabf84a56e51b05d76a8ff0102483045022100b9ebe92d67cfa30eec8681e9f9c53447b06cd1d3e25e9a32e6e7845633a977d602206c383347dbe52d667d9c116364cb4d377b4962fbddf378570fe0141a41677bc10121024e1e1dddd2c8bccc9f74b1baa5c04a82d6c2aaf0e8249182b6d02a0e216e424b02473044022013a4035f1317977d1a2dd25e60cc3b3480b58ed62573070445ef68ff9488743b02207c3eea21ba691bbb89198c5a8c4547915c0f9a07c969e146d705ea7465b0b4be0121036930d66b0aa902e7c513563ef39b3194d3318526962de8f52cf657bf832276210247304402203d2b1f092832bcc1fa010768cadd5d56275ede5767df2b9fb9654df2069187cb022061bfe4ab25b7b080eb709b81d6de5a008ffa6cc5a826ec81730867b61e2a3669012102aaa8efc22e3f0c2499aba8b3a304650e467a3d713353943c6c90240b146b634f02473044022056bb0eeadcf7d063cf838b21ad0143a3b99e6a348887ebbac8b198711246943002201ea8e44664456b3a845acb5034db08b07935195800a775b4043b2672441850b5012102b325c0b40141b3a4dda896cda69ac14348d90315db9f5f54e4cd17e2f5635f440247304402200aa27709d1c997bebedd6903f31436e456928b4c34b790a0cd3b4c98b9d614a9022002c2ae2197fc6b6e34d2b422d0a8d371f2223d55be8209b3223b80d9a3f32b6a012102997e3cc5fefcb840c72d0b121862e68da214c87a13efb02f7cb9c193f4047598024730440220292e780b7d9bc9be230ff10962d8b4a298ea1887c012524bd885641518f5a59e022050cc785372ce5663483fa859d5116625673f41fcf6cfada3f69feda91401080101210289fa7c9b3a204685ef81ddbb4591d1bd221f37b2c946618a5d8ad563dbaa1af002483045022100ac73ae687ee3d95ddad4b5412be4136e8c3d6d835afe6a63d83a2bb92dc7af95022071e028dffe0086b5a413b82b7edb88a5119cd4efa2015373f9e78905cf931dbb0121023091aaf69d1766e221ede855c0803706071f5336e3425d7bcfb7161e4f984786024730440220077dbb2203e0a54c6a1733fb6bb597c2958cd23126ca680f1a71337315184070022032275c8df4824856a3cd9615e390745635a40e11ae3d52d3bb0af90b2f8e1b2a01210263fcf7220ad4025242d2c44302e44c23bb4709ee70ccaf5cb24f71c5558fdc4e02483045022100b4132c2779067dca697589019ff431172664dcdc926a98fa53c033fe190d334b02203b0dac0760ee8ef6fbb8ad2f0b6ebc2453772d7ed0526a9fab5ed9aa6a26c1e9012103939586bd96df7f1f8c815a71a492230894117dd928b97546c9f4fe1c8baf41620247304402201d632398b4bdbe0f86f3430974f621ae990a272716f76faabde825c1484b190f022021cef744378fb46b4d3b1669fdf3311a76a642bffef0f34e1218537b6216d2af0121029ebb35d7a2b1ca506a56412a955b1f10096c70548ec08881995ef114a378ea830002473044022036229ce2e6744c568ce3dacd092e7cb52faee01d27a46b27c5f81852de7d48c502202fe91974b5d5a3e627994513b166c3b33b5c9575b832815a5c7338b14ebe446a0121029848ca5780919ace55bd161a395aaf895c662521deaae12f91f01e5d1e76ccb602483045022100e136a0a7d4900de03a76abbb718b14ca71748f1f4d092219481c392f08165e7802203009558988464154a50580bf7a65bc74fca70917f228657976166ce70264327a0121037aba34967dab4245aaef1adc456c83a5d09c949469608c901d70bdcb2580097b024830450221009447f6c3b9a8f5e880ad414d357a61e15bb1daf8f61d1ccf1f3896bccc4a3fd102201a41adeac61fdd593044ca8b2102adbbe13dedc678cb9eb0777eea695f00e1300121037b18d5a8c21b63af6bce7c26ea2c83cc40ef33bd976927a4840edab6c007356202483045022100f2d44f9a2ad018cf5d765b57adbacd26f902d11d055f450d5cb5cab0f86d63370220573a7cba744786e020b9f0a2a32baf0c1cc416fea8e82dc42075d6f50dd8d41d012103cd0f56c49fb6df012d0b1720a0b9671027671cbcc32b772a5a14154e3335b5500247304402201e77cec5bb20f93084c725aae9be1ab9edc642d18a9c47bb8d5e6b9525cdb2ad022079dfa35118ece54828d0cba0d3df3638ceca8225297496b4906b912d6c4591920121029b60e5b5ed7b3ff42c19b2e67e3f87a6dfeebb9a7c199e469c85ddaed731149602483045022100989b10227ca09ff5c6b2fe7b3faec0dfcf9079196ddf805155c6aab49bba118002205973807c4240672ce910bca9db36622c9ac00f8d733021209e31f305accee34701210223e258361a5cf98bf4ffafed508da93d00f5d25a128fa037cb6679fd24e6952f02483045022100faf4a7f9712d1ba44aad532bc45ea5b547394bd852de5a9d4d8fd63c8931be1e0220447ce50dfe36169507e70d460ada06cdd932b25fa5316d2705c154e877043a50012103558ade9e713ef4975a9279e88a521a56631702d9b70cec44f59916d3cd3d7e790248304502210086371f4374bf436c20e3975e4e1fb3f7a93bf3c127cd80e00a3b75856c8e1b4702201e59be74debefdea888e2d011957d9ed6c7821b830f4b516596fa6f7e4d9901e012102824d9399d06bc1752e3078fdd4ed38042247a1a8fce454ea74d324d3eea904670247304402201ac2c5c230d3ab640168e867b58353522b6f9cceb42aa73d7b777a73b1dbcb1b022054e7c199d7eff0c3612838b24cc3f6e3b805a2e42a7d88129df9fe261d8bf4920121027366e83f0c18dbfb0fa9b75de1cfe740bee33f48afa08e112affa61edfa510e202473044022024358dff81c02a970f2f900f377120b6f272c2e752aefc7cc558c5f0a545903302202038e106882c9f2737b1abd705808e88f5ff9151b601aa7a5617dc5bb02ca93e0121021d94cae20dbe670b2872a5892b3f446a69a6d15068f8ce3275782fa1c174dc2302483045022100cab76880fc02ffb7d38b9be9ae9f874075f5a5498b4868de908d782df9b6ac7202201c812c7fd4b5a2d7a7273affe3121a3a7cbb0b082dd2179d6d38d72c4b852d0d012103547c44106b1e082243d4e6971c7239bcaa066c3b30fc7cef0991f035b3011b4d02483045022100cb81214f2280f5e142da316fc7cf62c5197a9a0258a2a641924a906240033eb902202c8c0840e550fdc5ce17315b570d1333017a183969a83d2ab88c89c8aadf02480121029b068ffed444f8c30fcea8b56ef463c9505766309033c96f9069ce37e48fa02b0247304402201d31c0e389a3732143029808ecf38db878c9faceadec6eda6ecd4877d772fa8f0220618278fa99906b64d466eba58d60ff61253b410ba9d554a8fed569b12baa646c01210307687c488061baa1ab5aaa3c762b4dc6805e7ffc3cde864c186b8e61da5a32560247304402207853154c9866c487671cb3e8a1716311a793ae8bbbb3ba52c021fc8cea86bd8a02206adbcfc6b69171ccfc3e528cf1ffd882a37d443c230e2d9c4a6ab976eaa43242012102e4d683505165769dce2079f724061d27bfc88c07e7f7876e43ff231aed88dc110248304502210088892ec6503063857e67843d079b5d7ba4cbb2e62d553262d946264759dfd63402205be613b82cbc5aeac8ab6570405a63bbf069225c48dd7b84bb2575f8e1d7eefb01210382f4cecdef8a658a0a9c530ec950ad9501423ce3194cbf92308b753d070cfdee02483045022100b854d0b82c0741d3b38cfd94a42b32d479a366c8e80f408724cd47e2b0b10a0002207e5fb034abe6cccfc2336d21090c14e5c68471353def9ef1b1d23f5e4d7b4bf1012102e3e010f899cf94db7381d29463a5d5657ca330c11dedd2f31a6fa77b34a2ce0302483045022100bebfbe61e0c0cb6641d9d0412d8401b52e5ed983de8dc65706f750914f3ab8ee02202fcbc88e63eaf61cf070560bbf39baf3b515cadcf8339f3716fa6ad8f2f9cbeb0121029dc29ca6e51784653a3dd7b31369d8e006aefe3cf5f374bf88ef9cc070b364ff0247304402201ffd678e0be292eb48c5ec5f4146f96b16df742acbc87dedb8037910a3629bed02201215c0673fe1a9e30fff74660649df561378125f9ea7f12458734427562c7341012103d4f065b9860a0b2803278cbb7b35c267cc5b19b180640c96d11078879bf82c3e02483045022100ef4b3d841bc14bb6eb1ef8f1544c8bfb894135bf8f5be7c0b9d3880d00d43b64022040375bad523ae4546d21f8355fad06ebfd7b8bad48dd70db7f31ff6f5b73759401210301e1fd9f94c61655848cc07d6406a870b2d9e9ebc647b694c8183e7813381ca602473044022038b3e627db843fa5675a87bde1c2d6759fbbb991e4c174d7b171bb5175df5748022067929aa86b4da005831f2e9d8df24e8ba1a809814578dda469f0a015b18e6210012102ad22e71e43862dd1c49803e63f482f250a8da0503cbc767ba4fb49a04a2960aa02483045022100d14658f19d7d7c70d231232a5f6cdcc143d0826575b9c7b154511a93d285205302205f65b45570f67cf5adf99a3d032d368817f0425fc803e888a308506be75c84c7012103ce043d04be5a0004600e25e0ad0a82d353e1d6e8846046ea63cec75b44a6fa1d02483045022100cee9f846725639c641c46d40e1b19e2ef140fd9959185db5eb020b4bbf3b2fc1022045e27d9ef046d29725458281137eee9849114be9cb61d5484589e89896f76aab0121036e1bd4307e1790da06935391f2561f4e2b0f711fbd7f0f9f5ecb81246283f5ba02483045022100c5ade26c59d19e804ca0f455e203d2eef33c9ff89e49a189333a67899c1613920220627ccfcf0cc782aadb86ad140f4d27ddefe72ff073bea2e4c88e498848f72505012102a201b65f20e3ebbe76107ba5e5f8b9ac40c2a15a53460cb78b70f71e48ef90e402473044022063abcce594b0a2c0dc64349bf0e2593f535a7d48f496be8cc5f4ff17df1eb0fd02204bd468ec8273e3dff3d4bba2b33861bdc5c7a6f2b0035a6210576597cd810835012102ee8de5b7419a13f3697bfedf4aa9e4dc967d29f5e0d05b0ba05a2cbe714bd22b02473044022035130d0d11d97040934242f110f2c94eb8489880ebcc910dc3dd4b3a1608548102206c2584bcdce0291721aab6fa8fd110e2988a3085869c15961c902afc7b260b87012102524f238001138570fa251e5229152340918082aeba6155d0a7faac4bd837af0f0247304402201f893033e02cf53b10bbfec2fa6bc41b42e75cbf1e06f4d8cdd386e65228c6fc0220081327ad99dddc4939be2758dbac8b4c97547b72d47120705e82d11a80bef8f60121024dcc80dcba82b22676412a09278dc71bfe84c438aff428524822d91565382db402483045022100ac1fceb730de0612c6e0fce1ca1b09f8eea4e165215cf8416c4fc15d5a9afc9a0220446198927ff912fa675ba18b825f0e9e81594c1cfb3620bd45f50caa5acc65f3012103146b466d60284b04b21ab59f90a16598d771d05203b6b3f2db8817017c4bd4d7024730440220531e76c9345e1056139dab0c0a99534e2ee1848aaceb10023338a42da6ae90a6022056eb46386b936b47d8d86ba2a01e586a59fbeeb095f58b65b9289980ddd8b863012102ba38b5a0889b45ddfe5db7c4c85abc32a27fdd54fbf2f15c70f75df693384efc02483045022100bb32caf2bb451b190c11283059c567dc515a20b226343a19041aad49442712f1022049bc661832508fe0cf3045f8e78c59a96730abc81749885361f3659f6b2cb8420121038df20a308d9f1ae6be6cc67bc7e7c6fc953721894946d53555cb554bb89cbe1602473044022020859f3c1088425bebda3e76c1d152c6c00c10e4939bc69fe818a5c89cbb4c1c022022bac68716fe1bf231d9845e5d337117f658571b9954950731c4dc7a85e97945012103abb0b8564d37b319f3e0279567138dd25ce737556bd6b89712896325aa4268e502483045022100fb776ae450c254df9f1838ed58ab1119d90162b5354f5049eb61445f7c0415fa022001f45d4f2b5b55bbfa6ed2c18dfdcf3ca85773852272905d055233da82ec105701210273a5446e873ed83223a075fe7aefedce9fe6930f0366b1eade8c16b481151c0e0002483045022100ae269dfc19ec673d01c246d150294922e079607813edd550e7ffb1084a26dd36022039494f7a89bba6f996df4aefe32dbf4d272b0f11234ffa67f0c8b06a8e977aba0121026d46d2a2246cde6c0e187b53fbabcbd1b927ad24f9b1cea3498f4377356c893102483045022100897935a00823595c5a70ca22130c20995516754ba4af149463d506655bffb6f8022010bf692d9c351d169fe91ddfeb937e5e035f701e04d40aae7887e47c13ce94640121034edfaf50a0fb90bee886a531212e30476b2b6d2eeb9ec27dee972b3b08896757024830450221008aefd8ab485e334966f1f7595f06b8ac061a218714ad609d83a87529459d249e02200e99e749ab6cb7d930f44e569744276745d0163c39c57f1afa393ee04fba259001210319b3ab4152dbf2bbc153750ce22090bc493357dabb9ac6bccc6fb6978dfd236202483045022100a084aabca16e98973a7ed9fdbb0bb83a59467f86be895ddd2735e5fe4b3512c20220142f9708465a36b8d869ae107b2be37379e8268bbc3792ffa9373a3f3e191988012102eebb6856ed636c080f1597a37e37e774b5587222db8a68958d9d77394b95591102483045022100cce3af61c0fef4ced6d0ce193234d2ddaef0045d0bca4bfa6f291587d34eb08e02207bea30996d24ca459b2887e6beb816cf52732b4cce239973abb03c288e7f80cf0121028fe233b7f4dfca0783929df707d08c6cc9eb625bb07b33038963c4113346bc9702483045022100bfec49447440b044708a73076dad7d7cf4fb3f602b6e8f5a35354940efd1c14202205f5258f828200dba2233843a097b7f72cb0723a5cda22ab9a2ed9d0cc1a2f0c70121023c14a4b7940412c00b5b9edc246e829f42731a2fd36e7fc5194c19423d8a26e50247304402206b19c7b917cc4c7a78fe81619cf429367b7d61701ae92620a4872e29a0176c4902203d9a87d455d8f9ea2b8b2aa7d3592ffe28cf33e4b8b4c0ed75e2b8b567c53d6c012102e9f5e72498b4f1e946daeb0557cac23ee7e63b925593b8495437179c428b2acf0000000002000000000101174402e586524784791e2f9154ac45ea04038c67dcda61ba4b07458c3d43e2c107000000171600143eca84354f4e3d23f786cf6550b2f6bc02d15e5affffffff01580005000000000017a9149a18a95c85a62c04c4e9fc9d8c1c7f35e3c01bf3870247304402203641baac3bc2768534cc07ceb83208f4eeb59538f5b6f73be89417b4955e552402204b161c21e32dbd32a7540dd88c548c7a7bc18b35871843b9d5423ff95ebd1cb70121029d6cc641246780aa770effb75ed77e8f4ca718f5420d2b0b179c6a6afccc13840000000002000000000101a795a0b601134458436cfc272cc21a2181f8b2e26c234979e1c208952e06a6a70100000000fdffffff020094357700000000160014f48746721f7d1cc1f180612a47a4fc2eeb6ba3cef096b8480400000016001449af066b0b0375ce34b15b011658e428535c6de10247304402200bc88edce6be55320f220720c9251f0de25fddedba4ae8d548e59991554e134f02206ce0e7fc9276b31a71cb6feb50665ba81fbf4bc522a5df8a13cae024d51f56c50121025dce4be2d8ff91180ea0fb6fc40a289e96d34d3033c97b78ed296e0d3d7aacb049a00a0002000000000101add1e8709f9832ca0c3c5443057fadd7e3ad8700dddc6cb1388d7b5563664ee70100000000fdffffff0200ca9a3b00000000160014b0cce493a5eef22536ee33c6a7aad8476e50bc9ad0daec3e01000000160014187134581848019b731a4801cb82556764f790280247304402205e938156353ad1deeb29455ef3bf3d98a9d1d33e3c6cd52dae43367ab2ca6baf022053b75a479519ae333b5dc8414c84412226593a367c693e3cce809d37a55472820121038208d07647228544820bbddbca3449fea5cceee4cde8d590d5931c47888af6f149a00a0001000000015921f0889804fb8ddb15db8b151e0fec6d1c8c7670b367b446c443ce66189bf4000000006a473044022030455a16f1f59b400e6aa6fc055012242375a3ad6a9733e8d48a07da659ba64d022074a321d2ddf7e9d456686597d1952d10ded913293905a259346310863b54062701210397c3940595cb6d810ea8b7cbae05147859e1f5643fcde9d1eb885422b4a9c483ffffffff0220aa44000000000017a91451728b108a484eec55d88f23838c999fafc9247787927b7d00000000001976a91400a40acd35db62ec1ac17dc8cbe5ba3dd86aa5bd88ac000000000200000001162b1f820845ac1768aa762181c3a10d6174f7c4ed5bfb0747334e750ea99ec5020000006a473044022002a76197405518a7398fb461126e0cc1503cbac9c618b591aed8d1e74c3ba43402204cb51e953a8420737214392c4d039e7f11fc305ffc114d8e615f43e32a707efe012102e764d96dbab0d80c346e0bd06115eadd8d37741072159130ad7885b9aec57129ffffffff029c8a0d00000000001976a914529633b57971e4a2d0bf303c21f3340f176153a488acb9a95000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000000101dba336de11d633560835fdeab133ae8953a4a7985d619fa96194c8d4d8ed6b430100000000fdffffff0240420f000000000017a914b53558f83198b804344239435c0e2947a7057b4587dc371900000000001600144c24a635dd99fede61b873f35146f1d600637f6b0247304402204c9a16523d3cea554e2809c103e7d1f8542354b353cbc38578b1f69dfda434650220538644875002b17a36ee80dd61483a19a7bce6783e35dd176300cdd31234145f0121036cb6207f6ebf88c6e4030ad17655f352570b744ba0109237967283a5bc06f42049a00a000200000001735174e3b23f4f187fc093156678addd4e33c573bc500f2fd612df59ae99fc82070000006a47304402206c7717782b1a200ab0832e980de0049302d257fd30673ad2d352f617f6815109022032ddbc926e3ba4d6ef53ade9c8215296f880dd1103fac2448234a8faeff4000101210254d068ad1c7d8a9eeaf02c380f8b146ec26de374c5257101d63f997222f2b577fdffffff01448f980000000000160014cdeab3c02b1b4323ff18bd3df075953eb0f0aca029a00a00020000000184e40d1ab46321ee7ea791d5343fd1689ab2ac7fa4c12a8aec3a815f20c6b78c010000006a473044022059601d6f6c3da7c0d24aee187f460614936ee8895e9e8ef3aca173690723b28c02206f2388e23db0b0dd2af599aed64c10e4d6889889d935466dbcb18f0129939eff0121037559d8cf70c088f30fd51b80cb2e68117fd96610f74a6dca04dce889b99d154efdffffff02d4380100000000001976a914a0cb2d86d3d0b43d814a73e07ef4b45934e3109288ac9bd7060000000000160014d3bc619103d23b70086f22797ebed4a620289fb949a00a0002000000000105e0968e2b80cb7e486c3cee535f5225e220225c89cd8817e73123cc5212dee1170100000000fdffffff99be888ad7626941e606b36cb4d098a000a3e2ed53663bb3d45aebabe427c14b0000000000fdffffff4e07dc1ca6b2930f3867c74d615744b6589c753a681eac969e948ca9a839b8b10100000000fdffffffbded886fac673c9854ecfb0810fb0f3de467c99b2ff60c80ffd885185d809ac50000000000fdfffffffbc3a64b7de42c55f1fdd6f25089731261eb97b011e4ffa7d8f65ded0d66f8c80100000000fdffffff0189a2b4010000000017a914c721021f811081926ae596f7a1e451d4a6ea5a20870247304402201a6f1670a7297d3fa562a4c08b43408d7b8a1ff719fb84d27184cca2f6c0fda7022012aa83a2ac18b6168022f2001e3ef9ef2aa7762f5c3b9884b704d960245839030121023879dd9757ac57226065409cc07ecb5d3434d25092b1e146e492a768a100405c02473044022039c0eac7ccb9187987fdec6d083b09b7ca26106b5d3f5c06260ba384d118889f02201fe9d6f3fc02501cdaafbb291e82f9fb9304bb72a55becd6d414825ee1c68b1e012103846fb63ef89786658e701d3056fc685a6024ed42103290428540c33e541436f1024730440220500601396bd1697c01440bc5cf6bb2217abfcaeaae40190f4e4d138024a9834702206a83289710cb968debde516c3f0aad8ab8b5ca9081e9f294f8e8629766d7a3d601210383495348ac5724f0079b271ceeb10166be8d13034009fdcdcb7e0ec9bed0a0d50247304402203d4c34b196769f89369953a7220de583debf571b0524200a2d49b04908da73f002207a71d25194b36202a4a66dd8abaedd311d3ce4feaac5967e0f37742eaf05403201210260c44f4d0f3f7818b4b47c5d496ac30e5f77cb3f064487a7e6ab8283e0dee1a302473044022010c454115bb1ea1e966e94c40f8c03b121c599736a775a357da64b4705fe5a85022071722aa41591ed58127e36e3b926f37175549402bb5dbee07e278e278fb211cf01210255e387ca436fbdd56d8d9706f6e1715c12613541f6318b6ab7300616419df54549a00a0002000000000101f2b2348f4bf3916624d4789413d383df0fdea7b00ad73dc5377a1c1761d0ec590000000000feffffff030000000000000000166a14266d3e72f4a2de7513741f4c2eaf238773b47b83809698000000000022002095eed2be2413e516296c4fa919a731766605dd558cba3ec192e7aa4a22acc192289267010000000016001424a307d71640ff2bd745bd890f7b3460dae9f48102473044022048be1e28db1ba4dd77f8468a83ddf0d685af172b3a025cf047ef73e342c3723802204d02fa3f23144b876f8039292befaea257d9e353cb0ee88fb4a4c4ab7d806d2b012103f11510bc4e60f13603e976d1c2f4cbc3be88dfc14cb7acf3550ccd74939891f449a00a0001000000000101f9baf3220767e9a24bc2a7e610d7b1f04b769c64eda615c5412ac58151d0d9e10100000000ffffffff0230a40d0000000000160014b9ff4f0f938f6d559ee39ee5807f2865268b47842f0a0500000000001976a91417b38230e22253b56c56eec51d222e0203ecd6c588ac02463043021f5c754bd4c382b69515c0b1bb13da0133e6e2a9083540eddbc69797453677ae02207cc34f0f35970727f8a0a54a9dea14461fcb7a600b0f93b970e18603fc272031012102895554bb50c450b0183138119e9db32b19cdb5dac873f2e81fb87cf990b2d2780000000001000000000102b76cbdd276ca766e13ec8acc8d5466785a5f08f6b66a9f01a5d8935f24d31ac10100000000fffffffffd6a43704c18c7f8b682bf7600ee5abb0e839ac0d6a6ba9248a09dd8511e12a7010000006a47304402200b28b46278a1414ca7ef65b7b21c5c13f5194231c82f0f5e12e6d0299ea33b61022075ab0590f2aa3f1855f83c56f1e7cfc478879f0e8313827296e8d8d1351c62ab0121029b62e00d20571a704b3c8d47713e96a023c1f68f6ded4d89126b750f223f92dfffffffff02685c0300000000001600142178a815d5f29cb7c1194a02c96e22fb8ed1529ec4230400000000001600145f79912fcdf12e9834e3f9828115a91c192ed25902473044022002979b9c82ea08a8d59577f0ecfd68fd04ddb659571451938b6a3e3b39d1c810022005a2069de538363e667d1784035c8e599c80bfc546026ce3c71fd87e1c793b250121038cf3fdc261fe72f39ea3aa4471196d8faff13be64403d3dc6f34a5da7e60c1e10000000000020000000001037c9b50054705cd68c9e00510200ede72a4f7257fa4b3fa0e25018daac3dafa780100000000ffffffff020b22281b184b8fadadbd7d1dd4e7498ee628663244331055fa4566765d75a40000000000ffffffff373de55d486b2e5df777dcd77015688f124461cb904dc03c3866bf0d9ec7911d0100000000ffffffff02a241090000000000160014678e5a88dfb63e78d6318f60cf1ada4f33ef9f1272250000000000001600147190d232b65b43e7876d5f045833871e8c1ae8b7024830450221009d6ddf66185eb69bed525600938bc26d6dee9924392c17b5856b3937859cc6aa022051713daee25bf6659a02d5b35ae5e09292e6b246e04c3e5058090b4f384c677d0121027066e4165179bc668e2a5097281ad2dbf25e979f9eac24638071c32bccb851e60247304402203cbece19a8cc1d87477f90c11bb88f236c93418b0f8faecabc9127fe6bf759410220788ee2439d9fc2d1ef307e21ed3f3aefb49dab3348f34127652649b3a06d64aa012103a0fbace8239a373e2d114f56b91b0e9c51ac0d9f89092168c47bdb48e3cb342a02483045022100b82ce38d17b07b0bbc3a97a766c52b5c346e11e95dadb7f0af9dc4ef49877e5f02200b5dc2a9f6de7f8de2b88217f156ab227cd7ec2ff4eacfeebd4eb33125b1a1e70121024dce10dccf64bcc22df79c4bb2b569ee4241e4209cba0d7d81dd8cba8465ad4d0000000002000000000101eaa931a27f2b421cde98a6bb3e5bb43d61d6de25b3c65827bd6b3137cb7cd4aa0a00000000fdffffff024f34020000000000160014f76442a1d493522f4d3543f3a41b7f834cddb8c8395f02000000000017a9140e0f14c4ee140eb19aae6aaad695f7502e213d2e8702473044022038734b88f84af0956814ae6107fe6f4bc66c0d7616178ca4b7f7d90cfe86981f02203767b805a783136f1b4247c5ce49c55797c6f60a30b8c1415e728f1a85c0f56701210359b6b428d99905b7e7b5b6478ede490334ed84d8282e54969b211734fc69b3a02fa00a0002000000000101124b93a8139a67f4b55d748b90e4f8cf4d3dba2094845bbe9de3ae60da9d4a880100000000fdffffff02645e01000000000017a91459c12370ffe4470e648fd928ae814261c189d2f1878b02520000000000160014fc6f319937aaaeca55801f8990770755b4e899c402473044022058f70e7cccb8ca9fcfc848bef10cf7553b018d4af7d58d525b0420ab1a0db40c022070f38bf3f924738d1e3aa420cb1015940f85880866758fe158dbde52dcc7368a012102b8a75f13d3275237f9b55bf5067bf102538a6de232ca3d779ec20d10326592a749a00a0002000000000101b921ff224f6b375525d5b21952eca3665548103385c18901722c8eb8a3a3c4870e00000000fdffffff02c46f1500000000001976a91499517977345cee504ac930d9116aa67ebba042d088ac2d195b00000000001600146c16d699bec113ad847a59c070ffc0e9d47d1da702473044022040b57dfa53c1ef8d5ea9e15080552a66b099ba4bf794f697048a3562b01a967002207615a61af90f2e59cc3a2b436868b39ab36e8f719241ca3872cb64269db68692012103f29a26e8570b1f9926a929179ceff4512c9f0278e2d0882d26b679b67d0149a449a00a000200000000010149887fdaa530387f51acd1bb69f77000630f0cf4a82a76163304c75a05ebbc680000000000fdffffff02c46f1500000000001976a91499517977345cee504ac930d9116aa67ebba042d088ac00cc2200000000001600141085677692a7cc4be9206b85b24d13927986f4230247304402201088e72c2d0d69ad6ff934a13af31b490b6b1449f9657d27ecf1a51d9d0976a402204bedd9eda90049433a4194d257598ca22f8c30cd0592d32aa425fceef4a9252601210258c53414cdbb1792e29528afab60ad62d6964f33a717fe2d6514eb2fe771edd549a00a0002000000000101ef02a666e3d73cd496e5087b029cbaa3ce8261f024936a7e911d8d46197f4c5a0100000000ffffffff02a0860100000000001976a9140136cff36184023bbbb224c640d5350e53c8d59088ac95f64800000000001600147227058c37d991c7d8b4249dabc91aec1a7c52ef024730440220411aea2c23d813c8b9b4770418c48d920f98c25127f432b9486644d338c5e21f02201780ffd06a5e335885719121ebd954d7acdf5588ed61837236685d64df15a6910121023a3cfd124e074289871c3bc8349fa68de01d2210a6bc57296fe505ae97bb6124000000000100000000010bd3f90fb1eeb1b1746f8c9987529521d160c00bc3b81ab35ef1fbb9e909d0070a010000006b4830450221009815941f5681fc8b33f393a408461ceb7bab170776a3cacd8f9f74bf05d86ad302200de1085b4ecb82ec468c619b0d9df75acce8d4f4adc6f9e62d06a909cd5293a301210271e89d4d440eea3f02eaaf97728f8830ad90ce2f1ac0c99650de90c09a6618b8ffffffff09ae0b3d9648caaf33534941d1917ef4c73cd11fc0a41ec0212f821b4c83a62f01000000171600142d2f3f610952ace376251d1fe144ce3125ee27c1ffffffff18f17f1ce4de34dd6e01e0b0301717fe86b5eedbe2406545f61547a2edbec7bb01000000171600144bbd0203da96ce23dfb4cc3204d4df020a1c20d1ffffffff4c0e86053c05e51d72899ad0940a675038deb26c8a0b152fb2d798a8777b573801000000171600145a20c5a63e6a4805da25d19fa879427c495afe13ffffffffc6dc510d3b7dbd542a144c7114419d38c15a63f7a2d00b22b443abd0808f3aae000000006b483045022100c3dfcd5ec2d399f002c6b60ca16b3959e0f7145abcfc822e987671603343c853022023f968200ef0a7f612b5f65c3e206307ed055f74afbba1d1c232bb578af753ba012102a6dcfc46187ffd67517279bde86173e9e03a62414e0db96aaa23577793d69388ffffffff020d320819c3b57f6f686026e65ab1c890813ed35441f575c1e76bcdabed0c66000000006a473044022074c31181279dc609c88b76cca41cb4174d70d2d41dc07089061300941595f63102202abb783e06a664a8d1cf6f1ed3ab7132902c363d7d79890695d1d46623c1a9f6012103176e1833d7b7f254ffb0864857715bb4d76905467927be3e06526788b94e13dfffffffff23b3d4c0795d79f8ebfda511d73d89c4835a4dd874243395faa7ba6e0b3c14260100000017160014eeb130eb92a67a8b1faeb5c622ef8feedc7d1fdaffffffffcced15c89e6c7d358dd4de594365fa2c87e76eccb565135c4c91c69b345f9bfa000000006b483045022100aa6982f0d0cd321c1098d6b8f26d87f439a802673613dec04eee7b971ac2f6bd022028ed157c6136241f1ac7a56410db3cc7ed0f92b87270a71028bbc9963374f1b50121030c1dc817f058f9bab3e69d286132e44d40f2f11895ad66fe981cdc58bb0337a4ffffffff2f83b0e09da3387d09852d569d323f8d89465179c84d30bdb8cf07fd1734fc31010000006a47304402201d3807a4cdf63e4dddec8ff04e33abc0e866b9cf09b907d0c881fe48318bc9ee0220712fb87cb8bf24ee7056e0e58fd56aa72eb46984df03c217e7776c37a2631fc4012103890887cf6e2be7be9bc94fddbeba2a9d7777a3bcf65a603330a6d00f9bcd7c52ffffffff51a2b4880c8fb10d8bab5e9ae73521b219818436c513c843f7f3cf3f65dc6df0000000006b483045022100b62b49c5ad5a56274f0ef292ba68206dfffe5989b242f73db6d4b04179f62b900220184c2be1dbae5a8e79d4ac275a9ec6a6af23f52fa617e06dfa18702c8f0e326d012103b7c322e5b7d45599ad015cd8445ee8a432473c8cee6eb41ded14433900b93261ffffffff64af78e5c81ea38e06ea2bfaa17a336972492fa320248fb23a49279fde7d4731000000006a47304402205047550221eb8120a4fddb2950279391d3242fcc68bc1ab9d7df3d83aa8fee9502201de3dfc8a4eb6ac4b72f424e7fea073e93fb4c9f21922f9c7a5b1c9622187f0b012102fc98c6e744d062425f4895ac7d05bcaee88fec91d31e69656cf1284d4993c2ddffffffff01a90ff805000000001976a9149c33594f5761f636d11472d8a0c04651c325246088ac0002483045022100d8b62eabe545a96e225962df5e8d3d8791eebddfd8c51be9fd0891f58822288e022035216798dc0a4c53aaea95b6f026491ddf8030e41d3a12dde55661606912e3f60121027d2ec6289f268aaac0c1dbe17938c8f3859b1aa8e7f8e0243e2a5fadce71afe90247304402206a51b04d11e830f04d8513a1ebbcac27f8c1b96d6a58cdaae97802d9577bc3e202201c498665304804e1c343170f9a38f2336cf37682d92f86ec62c555b052ddeee4012103e6b628388b2a36ec93a4d50dc127b22f557bf069a21f7a34a4416091f61e347b0247304402203bc4bb66aa826aafa08f6fa52458ff0e8793a4ca08056670d836a4256c4009bc0220373eab51c3ed8eab1cb8ecb07145d7d49bd3613d8da2cec72d5aa1331d716ab0012102e4acb7a9a2b2cb4b95542cbe306b5625a7f0b820b9fe7d88ecdcc130d961b247000002473044022041460249dfbede79154e08ade6e51998f0ac706569fab116a6bfd389abc32b4702206380b9799c6d29021d11491e9554626c236bb7647f56c0228dbf0d69e5896f53012102fbb1e9d56cda3509fc776e69085dec190ef293df757fc39799f713858155a3d200000000000000000200000001dee2220ed24426560182e29e03539c8df68e9067981009ca70b65f38d221308508000000fdfd000047304402203b6404a557e0044e6bc8af56b29e1519ecc4aa544647e85131ca5e5229f4a39c0220366dd9a24c8cc36c07b89a234bb8017ea2854771dcd5aa8703766bcf9af1303f01483045022100a2a6a55181994b6266b64973d422fad8d8ea93f5aaf733af318ffb45e52a3d6802204dce5d6f38fb094f827f4ce8d1e609951cdfb3b0b0fc7fd195ca19d68ef2ffd5014c69522102cd0012eb8729c17d3ab676725dd6992d027ce999bfa19798ae2badeb481b17092102fef23f1d5d9122d7132db56913b8e076432261085e086e594f9d76e8302225512103ea7689913fc3125eedf4944e982a7fc0012ef1616994b1274a37978ed49ce6ba53aeffffffff07df541b00000000001976a9146dec64fec7ffab045c7a92b66ae52c782ba705c488ac050c3800000000001976a9144289cd63f2f59f71f757c0e0bd33ca916566a1d488acd0ed2d00000000001976a91461229b8e1d1d5d0182458db6dc296298173d7f4088acab501b00000000001976a914fd11ec95021ff60e32cfad7f71bbb9dce6044c3288acf3b81b00000000001976a914a383069c45ad6dc50604f8720236c4dc78fce36188ac270e0800000000001976a91456300a7366f8904d3bd3a5a8231ea868dcfecbad88acf553411a0000000017a914e0756020a29969b3903d07ed08b28dde9c05166a870000000002000000000101efde3ce7e5ea5de60bf0ad5ca4525b7187cac700a8d48e31ee24bac6a5d88a6b0000000000ffffffff021eaf01000000000017a91403d7d8b9f54a4fe48642771ce71288078466e21b87c69a900000000000160014c371284e3cec074cebb99c710cc9e941e380d87f02473044022063fef1b297721daa92fa326bdf4e5c3f751aae5165b1989b1698b4088603b97902203de55ddf415d57f4a6bca5f3c9158e0a3a5a4f7fa60808d40ce9eb73b5c26970012103cef1ba12d4a958e6fa3d3d232c89a3c5034851bbe40d085de0c64434e1409a820000000002000000000101ffc406a4343784bf58d7434949c3ca1ca1a89503d3068e852a0fcf116e6eae200100000000ffffffff02d7ae01000000000017a914162a9dcc50bb0bb7ad2981c29fcb4f4bb169ac0187cae68e000000000016001422fa5ec5d9ab435512f5608ee005d1b015bb690302473044022057703a664adbeed95ff679da5720c7df423c578f749014b0b075460fdebfabb302200b41448481f8d610a3579a83e65981b2209eeeddf5ff9bd22cedc2b51be901c7012103dbc090f302d26499fb51baf50bc15f4bf6d66e267cd47941ad19919b3825727900000000020000000001025267baed8319ff41020f74a4583170583bd4a53bf1311ff99e14a55b180d728b0100000000ffffffffeec43f416d420381913885056ec17b6bb7bac5e4267bbab4c53f700bdf10d7ce0100000000ffffffff0283c00300000000001600146b63137e9f5f67b8472bfa181129ab9e0215e481b3e9b100000000001976a914355511af0913f41f674ab9dd7baea99f06a3362188ac0247304402204dd687e72acc96498122b8a2abd6a309901f624be0f8b9c2a5994bf0bc3b364f02203f4fd2a489b75dab44b5665faed2b4bb196bb17caba88f33e8a2b3e5c908f386012102ef20a4f48ea8263aec6cf49b991030c500e9c363f4238463fa8a24cfee2fe1bf02483045022100d0b0b5ad207710f45b4f0556cff2fbd2af173ef79ceee61dd4e8cab809f0901102206676c3421d733e6513f77c204387dd94ce994cb2d2265eaa7422b522b94d432001210392ffc3bb7244ca7dba96fabd39c362b6440b8072b24dc1349d729dae11a38869000000000100000000010111563533de3e39ea5dadf40bb27984893921156fee6b1758eb1b4cc46208f38c1200000017160014f3ad8b068eb1ef25b4369de29a9de6593d189e9cffffffff01f4d902000000000017a914d08dfdb51243c80b104296482ea20f61253656258702483045022100eda15948dc4991cab61197bd55a5d00469cc78ee9e5919ca55852f4f868cfca302205f22e5515d351210706c6c5f1a875b13aad5a1d5216e4c324ad80470b24c0614012102dfd84760676febcae6d31b3ea84cc98b8fc8d60e97863530f542a4ad6f707aa30000000002000000000104996ffe2ff7902e6a014fbccd763ffad81abeac2f7fd347e3f89a00984ff76a090600000000fdffffff092e8c65bca6bd959998ed42050654049d7a624e1a5c36403ca3e0142f439e510200000000fdffffffa730b913e7c67d0e3d3cdf2d373029f6ce7fceb6e7655fb411bd4eb6486148660600000000fdffffff957e46c276282b8b149ddc6fdb89a0a1caa83f7ff4247b05dacf829ca5ab2cf71300000000fdffffff01f843120000000000160014e34f131b66a0a1764a67fc8553911c58f8fb7f02024730440220094bebb52ecaf1508d1810ce27a21f382bb08ba6f1f74c1510d01e5d163e2a1902205d130b3e146980d42d92cef525791eec0c955000e05aca8960cac57bda8716d80121029081b5d4bc874e383e18263851e4aaf655963b2f318d1fff3cc97eaacd672d6602473044022049dc0ce5dcd42793856619e399d39efd5bd533176e014508c3fff8d2680692f702203ab82d8d49ec8bd4a735392066e83f8c01d8958772c02c4af669bcbb4153a86b012102a09b9e441411f8fee0a4634f02a4b7632f3177778ef724e6e91523d3adbfd9bc02473044022063dc8f08d1133d7a9ff7ce82d2427f556808873bfbf4b804a691ebebd45c5c0c022061fe44fcecf46aa998b64e05f48672426b273c5b22ee950ab98b2635c15396f1012102a9e113b564976836068c3f7a2558d300f9476942a570e635b1bbe6ef9091dcae02473044022014046686a12f4c34095da6e428abfb1357c58dec41bdeb6ad88ad4e9c43c1e7f022039e14a947237c18268984fb53859af50fc60595135e94f95183dab986b25ea8101210394bcf8ab0f223fa47170bda29bee9d461d4fa5ac48708616410345ad54bde57549a00a0002000000018fa56e96c0c320b7e242cb3073e63957dec85cb06dbfba5675787efe740e2ab9010000006a473044022019d6911d29a1729279accdda3d39e38c0775b533620f49adc6fe02bd7bd337f302200c891e52d9fbf3acfb2f0715c936b65ac9f048d94e0b33dee1eef706f7985a38012102ddf13e254e7cc5b42a3b323582082d6c9022ced77f8535682874d427827651d4ffffffff028c5503000000000017a91437ef014f168452d5e5198285695a8fd1f8ccda3e871db10800000000001976a914d927fdc342415211bb4aaa7864e88630e5b2f5a488ac0000000002000000000101f6a47aa8c02ee418e469e9cddbb435cc345b8d52ac16bd7cad21d77d885933500100000000fdffffff01f08e03000000000017a914b3ceeb93d1ec12571e9154f76a585d31998fce248702483045022100e675efad3b2003998e38adfb31f825bf3df941364655e1b7f03969810bb7a99802200484fce049324bdc5fbc791cd4cf8ecda79efd88de93999aa29ebe9695e44181012103ca19372fcce5f97d350cdb8cb6d12a3dc7d615126eff29d61ca642bcd241d65a0000000002000000000101d3281d9e0c4de3b3aac24a4e2cdc285c5b2b1913e855d98869273332d8b8af980200000000fdffffff0428576700000000001600147168f8b9dbdaa2520acdca77a83281090ec088ba440404000000000017a914032b8cba037077bbd910905656658411390934f9871211100000000000160014f278b31dda27c46a7bea371369bb3eeebacc31cf74290600000000001600145bd4ddc14049d69bd9cf7338d63b25696a329a7e02473044022028ab21afbbf0058ff4dfad3484fe8f52f2eabfc514d6876464dac282646a171c0220704ba441d25f47e908064a4fba2dbd99d1073359e18ddf80b5c278f6ac46e757012102d5d15e22a5cb0ee85a322692b0143c08515a4358681f313e47bd77ab9eedafd60000000002000000000101872201ffd3cc3e800b1b5ecaff9d9241a1e3b87dd35d501272b157a2b462acc62000000000ffffffff0264a33800000000001976a9144c23e86f02bd9b158522ea33443a698813f6ec6188ac5f38bd0500000000160014fd5352ecd41c2bac42f8ff3625c81e38fbf0712202483045022100a419b9cb03c4ba194c4bdf7b3664767d1e654cf54a4f4bdb7e990173cc3f02cb022069c7fa0df9d6428d684d3618ed3aabfe03d4eb512d86659ff4a9b400dda2ac97012103295afd667c76a5cff407c60f31e5380af51cb5abc88913b048e3bafe8d7dec320000000002000000000101e15390d16496c591ce1f354347e8d31a3fbd63842902446c9fce3df6f6f62cc10000000000ffffffff02b2bd0000000000001976a914d19b5a24e2c48018c05e93f6a3e43a4025780c1388acf17c03000000000016001449fd8cce8e1c0de074dda02dc5f7b3f309827757024830450221009107ab641dfc3e42a7dff533ca0e93742d39810cd38a722726e9578a8e3bf55f02204d3002ef6284b47d1707b109efde000688cf15bb3d98b592dbc82ac467a59e4f012102008f44850dab998a9fec3b0ecbe2f2121387a2250b528a5e0efe61b99267f877000000000200000000010117640f9f132abff40c5e4b42370b7149e505c0ea2a92335c6109656841ec9fcd0100000000ffffffff0295c20200000000001976a914f2d6f54da78b0810739fcddd64d67b5106c64e9488acddc22100000000001600141446a2238352a19db3d74d1bad1978b873b858ca02483045022100c4ededa9a8bb1551a9c082aad568554346a741722427ba2a171b97bc5d51d7aa022040841eaf733b255b9de6e3029297445aec890d77133073f6a2161be30414f2a3012102dcfe7141d1e107d407201ddd73c52132a09c277983f707f7196fb293476650300000000002000000000101310e9fb1d7c6026d55cbc25cd4d0048ec24d7f237805e2b84e007f49ab2dcbfa0100000000ffffffff021d2b0000000000001976a9149a41ff83ed8656d366685a2bf98315defba6616888ac07790400000000001600146773d766bfec77acf20dac7025577e01bd35bfd702483045022100e5307316b3fcff43dde7121a5b02eca1d629d7c5c038f58d100dce2aad8d9c040220043be11c73fa68e92adfea8f6d1afc9e70d6d7a5460f4379637e53fc226589f901210266298ef0b6d1ebaf93777c8d9634ac0d1da611f090af2cb6554ac36a0c417a1b00000000010000000001016561dfda2953e81877ab873f40d3311effdb173a2771d67d4c53769fa1c9572f0100000017160014ecd8b66660dfcbbafb803f0d0a1fdf1feb3e6d01ffffffff02052e0b010000000017a9145d9299717e5b2125da749fd3f2a6f11d9df4980a87e06735000000000017a914fc8e7ca98dfa3fa201dc8f892a06fb724af4ee73870247304402200b698f4e6f5d75323f2fdb0257371eed61c1758d3f944ba663fb6ea4432d26ce02201b297037cbc57d7a59672df4e4ec9f5069a313470dec640a8dcb4e02b5586c24012103f01ca58e862a759001a54bd02bf83f342782d52dbf0d6869c79642bcc65fda930000000002000000000101eea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be412000000000ffffffff025d050000000000001600148285c85ca4f5a163250279735ab1f5ee572a73c71db824000000000017a9141ed99bd67b071433ef3091ca738c34ac0a75828b870247304402204fdca30b78173dd7ca9b9def887a704ac2dfbcfde7c99f900583536eb9fbec77022054878162274eb7160d3563d5a194f70163467546de3fe81d07164d9232a708260121032d61f5ad5c498c6cfde5ae9194f1e7518a6057c7df7523902f48f7d561e3db6d000000000200000000010178ca601ef9a5b7c9352640e470c8a0c4bf8e37e2db182042b5ca1351f134ac6f0100000000ffffffff02187900000000000017a914b420261fb0531e47cb189996c7f2dc296cae703887a390e40200000000160014f4e2e1acc7eaf3778029043826060942e76979240247304402202ca808cf8a9d2482cc1df659650059c3d50ccfaf822495025c16212523ef300e02203e356ff8ea9e8ffe2b5a4aad2291d6c82acf629d0ad7efc9cb7c463aeb1b9971012102fd754eee01d4ff80a26e3dfe26de1a439883c47434b125ea5c26adc7f676bb130000000001000000012e2ed40671eb9aaad960377a780cd0bb809d66c9357ec511fb2f321a95f0b053190000006a473044022037ebe55acc8d4e9b2707885ac2936046f7a7b1ec7ff5bf68de8ff468c735bfdc02204861a07ee7e330ce48145e1b8b2e96ebe4b3a4eee569420cdfc820fa61179dd901210254d4f8f0c47dd240b7bf63adb8aecca6ffd3a90aa8c76a9714544d2aa2cbc436ffffffff02ab120300000000001976a914d91e010220f3369d9679414fe155732639e579dc88ac023a14000000000016001453108841a9465214664843f021e597c4641341650000000001000000000101797e55f2ac912cf0b77e2d39c2561238987c661e0a577a80406172e4d05118391600000000ffffffff13e2000800000000001976a91413399b84c2297c909891580a1360dd902a68570888ac04510400000000001976a914183f0ddeda6d18ac8ad9ff0feb8e6f1947c34b1d88ac97901000000000001976a9142290f798e67153257f0885fedcaf38081786012788ac63001100000000001976a9147f2866991112179d3673541be55262d528d6927f88acf01b1200000000001976a914b5d1634c437850f7b9b6f9e5101b879dfef62e3488ac873f02000000000017a9140537ab490a7b39d617a832c82f686b45fab6a93b87b4da19000000000017a914237f8c3eada719534e0681f94bd0c2ef55fd883d87df1405000000000017a9144a7f7a52f3cebd338660b3e267b071c4ee52a75287e30704000000000017a914576918c18b3639e62a2c627c8ad81325da2e58638706eb02000000000017a9145dea491543470e8d11544f5d088d2613489097d487176202000000000017a9145e744eb40a11757df80a2e3f87a139770c27dd3b8769d203000000000017a914a114207c66b983bd810ae6fb43d8780c5ea14ea18717c0060000000000160014d5f27463a6b0bdde8039df5a1402a1769c09f60c1eb9000000000000160014ebea252a431fbbd3336d079ede3ed928654d3b28fb68020000000000160014da1b50e94127f67d436aae152ba04bbf9709ebfc2d3a1d00000000001600140c6fd4b5d2385faa56104aa7fbc91354c84daa486ffe08000000000016001483ec36d536dc5ef997fe818a9a07e332988c5546c4963a00000000001600148360ca3e559b0d800042a3b64c671bd9dbfcd91518edc80000000000220020923a51c2b9e736dd6cb8ae55038c4e3908fca4c28c65d345f437e4a4174c57880400473044022061eb77668d51c7f66718d3849760c685f57e76290a90b7ae50fbd6f1590164fb02201138e295df46fadfb4d17ba90ba478718247d8758b1e8c2ffaf87380401f44f70147304402200c67d903c1eca9a9978c7b923ab6ce21838656eec3f40ba2018ed993459279f2022006fdfa61d4049e142ad56d9dd23e6524f8098605443dc121894c44c6d59b620a014752210341fd34442d6361965beea89d4881231bb9aff145446538931009633c326fcd0b21037e714df9945ad16f4c442f1d52283ab8e5189783f77677501e318de86ca4aae752ae0000000002000000000106bbc6bd75d24d61c11a8d0a054b96c384ca97edac2184ffc9b31c887365e9b8013f00000000ffffffff9e8a43f71e99751fe6cdc5a006b3dc5392a0c23fcd164b33b6d4974a6300db261800000000ffffffffb60f8e813edcee3214b5ebf21ee9386a4b6a3d1156ee6d9a222f88a69953b7500f00000000ffffffff66e99a5bfcb054cb1d6892a5aa02deba0990deaa4fde31b82d7cbff267b1a6a11000000000ffffffff909d536626ca5b829ca78bd7fc138ee9f930bcf4f5adf7a68ee49c261cb24cdb1000000000ffffffff5dd3c78776c90e2be5db6e82debe75d7788be0ea98fa6036a6a6cbb942c813f23300000000ffffffff02ebd73e000000000016001432797bd76a71fa347f184f44d9ac66e85408677ebab25701000000001976a914e6f6a2ffdc711fa5f8d2997cd09dc132176ce6df88ac02473044022068c6e2eb48139e1d3a0cf1eebfccfed78e907e06f7dd300fcf6b3a6355dc4de502201ac2c92472b7757721c2f39f0ffe2df5702402553398ff015e290b719cb46fb7012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d6024730440220619f33dbe3db0e20629fcea504f8b7cc5c3201f1671ebb9936442ade1552fcce022041ca88cfcf0ece5c192c0f2fff0a703ca09d1732423381e4de8d5627967284b2012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d602483045022100ec512ab59a49bee1d0c5f407f5f50548e48b20ebbdeb5add9fd33c2615418bdf02201d3622e44068174e84a7a4b7b27cc8e10aa93b4eb71d79b320bf681f017e813d012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d60247304402203cefbd0c851058923be588a79edcc678b9ccd403306fc29c8b86567d7834ce3702204a54750b1439b0f00e55b08989ac50459d713f02f6c5f36e7b55d1b0f6b36921012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d602483045022100e3b92eb58b95cbe36cdafc658400f5d443147486a82926922789db9edb1bc507022002532199964fa50247c8d4c2bf3d84b537fc9a506eefaf0163b6e8fb18bbe0e3012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d602483045022100ffec4c82b228aa068b8765ebb1d2a1ae8879394ae5cf84ef586bd05d9ace88f702204cc48f9456d4a0e140aeb67ae71b13fbb391ee8061d81b80e4e2176c2accc2f4012102eeabe821ca6bafc71822651ba590c9d60875a6f7666fc6dc3a855e19084994d6000000000100000002ccc8f653014035adfdbe26f67c3b923ceb3d545a971b7cf7d1e42a0b0dfb1286150000006b483045022100c3f6c01cd206987559a44387342fb3d3b002a33da60eceff44d30f1c620632a90220354ad421808b9fad9f0cc47ad6409807cd480dd12333157f937d70b3c20f03b40121030ebcb0897e8fe8561a49eaa0f944cab48088e9698b9513d75f56182719dc4b9effffffff3b6484fba220090896dec543b0969bde12402eb4bad0be10830db636f9631b44000000006a47304402207e9536c6b426cbb5f400585ee8a30037c1580f195487a5593bc88af11918ce8402207bfa3e6898394a1f1a21099c018caa9740f2a973b0012ba7d7272a8c97168899012103c6e54ad9c7cf9f47183a4906c55293006eb9b6bf1c7828df0c137c40361039b0ffffffff02de690000000000001976a914e14eaf761bfc923e7518c9855b8556e7db584f4688ac5e923c00000000001600145d8032c74a2db07607d7bd3b008cd55c7f18b30400000000010000000001017a37195f07cce4506e6791caf99954338605fd8111b1588db988f2a323ca73960000000000ffffffff0220160100000000001600143dfe038731e35eb83c0360d3da0da571977772a3af990a000000000017a914ec089babc8e00efac869ed21d21f4c6a6cd9338b8702483045022100d7b96963df50bac568adcf398f48a3d8c1933fd68a522154a24b57a27311bff1022039cfc9ffd01dd29db73e7874ebe3d6e85dd8060c219b7b065efc792cd2a6341f0121034c961815b51a3e13d85e05949a57580d82d21ef6ec6689987f1779bfe2c56eb30000000002000000013334243348d9810552389a91079f49339c3cf8cd49f9bf228afa7d42c2632ca1000000006a47304402206ef11ffe33a4095da514a530652a7720e227f0bd94ddc02c9e1e68b16d06a98902203b35db4699459cce86ebaa2e848b3198acf14271d2c27985b65092076cd27ec30121021d84c996b46de3b0b96e092ec929e4a3d0c2dea3a88151d615b09877b5330266ffffffff0238c700000000000017a9140097d84c2702e07f0ef506aef1b01ffe2a208ae887b6b90300000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac00000000010000000161b2512bf39d776e30b3f51312a7e5ffae23d24ed8d89edffee87e454e1a8a68010000006b483045022100c605ab5ce464501c8f913ab1ce423d76d7f72e4de42452eb66e70d91c878105c022079ddbabe6a22f096f57ae24598395ab2816c429f318cc622d97869addb9e6fe6012102e885b6711e0da8f3c02239d1d19488e11267d239e7846c099d06c36089bb2466ffffffff024bd20100000000001976a9140ef6db3006b59ff539dfb9d74701a6a5d0c27e4b88aca6a621000000000017a914b09e26872b4929f822e1f0088b72e70bfcfd3d64870000000001000000000101a99a2bd0e17bd1f38cc469c716d60354bc5aa2f055067b8c5508d29bd20a5b020000000000ffffffff0260ac00000000000017a9143757545dae63f4002d8d9215013442aeb244f214875d40000000000000160014828860cd81aada29bc04ef2232540fb2a3047c0902473044022039701d22e0220cc13c9e0067754163ed832674da2aa590c7cc73f76dbee6c4f9022027baa839792b53ab406f477b68404c82de413dd7b185be73e638bece53f6d4be012102ddf5e40015757175c32e744ba0fe4667993cd63fc515361b8e4bb8a11f7a731f000000000100000004b40f7dbae49f648c0e43b218534603a62dc38aac34be7f554af61792a9740ab1160000006b48304502210098e8e63401134c625a66ac8df90a7a4cf8f2a63b82ebe8cc6848369cddbbfb920220723f838e862997edb708ae9cd28dc373d2f37bef0f7b7fd0c6367edf6f91955801210332a2ae5d389d09b3c3348809a324d32a85ed688d99894bcc6dd5c5c2ac7371c9fffffffff9086bc0a94f5752a8b7a93516ccf246fc990cfeb612bc56183f2dbda1e359ab560000006b483045022100cfbca77722f954af0d9c909b2ac1c2e20075b3a8a51f6988f1bd216b68a8967d022070e493ce2450c0b142366d75c93782086d02de7eb9e3f2d59a019f4de3742482012102c0e498f4db81c8f3741f579546f8721f84d4ce007112a4e942428646b162dc40ffffffff74a0818498ef667cbcd6c8e5cae3fd3adfaf7bf94c6a403f05bf03e61c3f504f7e0000006b483045022100d108c7204766c1ede49cb76462475d8552d62a57bc0e7b14deb33481ebda00190220734f304983e135a3fc19d0dff70977b9a517ab09647fb6477a900885ff94b93b012102f8510ec8a6099e51dc0073c38934e35441ea2687ce21f4ee8f714bd8c09d6e3dffffffffd715608d3794b824163338845a3ef7121e44aa2e6404eba6cd034b3a20f6daef000000006a473044022044b1df1f86db79a87808b2b9266656c06199268c64d6a0989cbb4bd25d22f4f902203763202bb84942af5188def4a8b8fee0dc5f6be188e454195ec03bef67058f6d012103eb0d9315633fe5b3c6940d1e8fc058ed8c4a524f42fd4dba073bc571036d522dffffffff0292d70000000000001976a9149502b17dc305b7f7e1b221cbb8c979b20ad707c488aceeba06000000000017a9146df2780d544d660d080edd07e720900e0b7404a8870000000001000000118c6ad31ab9c6846e77dd0a4a3eeeb4ac6e85e0241db15040f0aea85bbda0f430000000006b483045022100f94c8b0e2bb44a5a7e7c9356634f7c0743e01c1f3be7a1746c01f19361dc77ca02203f75a2bfb417e935628f3e4662177a3256ad083993f1b996fbfbb36122e3a6b4012103ed79fecc5f6a1b86c485eef637cdbace865c8d3cab1b9c4d06b3c0e384961122ffffffffad9147d8c15fec8b30d5dc75f5af700ede398ca0fc6539a9af4cd62bf475e0ca6e0000006b483045022100ea44f9bd7f2c8e3db4bd72ce574323a9d80aefaff3726d6dbf163f2bd14f881f0220572a9f72ee2afffccc6f3dd2734b46e9d485afde632ec5716a466f7d03b8569c012102c4f5f212de9c7223828cce4f670f3eda58088f471ba0af28e5b8de608cd08cf8fffffffffb4b1cd56d1f6634413b1a05e6802b73e6f454d0c7b44cd019729ce5676290404d0000006a473044022033409b1dc5b93d335b01991f6dd6a0abeff71a0333cc580a617f8dcf4e7af5dd022041cd721b9490932fee5e2d88a834667727b1dbd68ba756b3afad37fafc7d5a620121033768a225066f3b2d50e0d2e3dd7e1b24516d9651d54e71f2cdcc707060021771ffffffff4f4d97e3b751ea81de842a7e57c7275f97f7b501134ad285da67e52a962c0fdb0c0000006a47304402202b02741ab6445a6bb5bf4296cd85a6455b7311623ed6e2ba1fb1b4cda17d83090220753f0b9f078314d11604a9ca784f5a8d5470547616198e5972eb397b9f61b810012102b94beaf4c7a0163621756d335457fb7f41f1ea9b6a5d2e6e014bf1c4ccda9d43ffffffff0f3a4e0b09e34bfa44fa84e81f7e8637acf90164ea9d9be79fce8dc143b452ce0d0000006a4730440220156c5424235e9041d4126908904472234587e0d3a2a60e42661556c907cfba3b02201e2128d2b219fd4211491c70502d5a957b318d75b46ca283a15c762023e46aab0121030d48f830756a05929f516abff0019090736040bd37d985f67ef4d2c47a6d6728ffffffff229e9277d7b997bb58a12bbbc448110f7e5b69315983fd2633e722808ff633a93f0000006b4830450221009da53b504daaf0753a8f790b38f80b45adfb93484cbb9863a60c20c1aa24254402202afdf8423033a9a04f6086686be2ebab25061d465c2fbcc77c29de34c2c74e5b012103886ab6616a7b1537d35d73b10b0b84687db0871fae40050cc77338ac64f3794affffffffabba4b38743244985de209c73e6e935bc9b914a8386fb5cf4fefc946379a0d0c790000006a4730440220494d8df3e8244f74d8e0ab0a689b3cc30a0a2097d382c0b53c083c17fda3cd3a02206ae644605da61a14be4aa835ba23a7a159ee0db305a28e7ef9a8fc20da631d2201210308085f29360acb0bfa19e2f6ab546f25177612c0afbc61a9004986bce10d4d43ffffffff658ca47b9946469bd6add92cfbf5bf8fe4df89645bee738bfd6f8c12e75100341c0000006b483045022100c6f592f7f19d84d6600965fe707d113a0080dc0ca310fc9996a18d5d8db0886d0220681cdfbdfb0440854a27218a7587d688f81ad81039e9283862de18e8ae7068dc012102baf0981cf39b54e5350d1806fcd5ae87a60b96a198a4bf9f3369fcf67209157bffffffff96cb1bb491da511f8f36ed3b18a083939345d57f136735b01ccf1602ed12e064390000006b4830450221009460e0aece52c2af07011e8243306fd8438776eee0ae1d504a98d4c40dfb998202204e68c44fd53db0a8f9e1556bdfc8784cb7c020433567a34dffab618fba7e464f012103c1c90e4bbd129d5021446e498eb2a300518879ea5ac1dd32f0db2282df9a6f5effffffff13e14cbf51c05abce44ff8cf014f452723c253809d5282fb34ff014253dcf3a7160000006b483045022100846c0ad53b913c975b5caffadaa32ad684761ffe5c738fbe81a47473f033d52802206044dbd610c99c1bd02529a026759faf923547986a93b638498d4df756e1aa96012102caf82c5600a5b0578a77f1414aceb3652001b4a5f3d6afc7233e82d80f13dd6bffffffff6aa8fd31677572b385ebc7f7994a833b8da9ab517256db4d36ffb9130d769e67040000006b4830450221008556555c6c086b07c064f9c4d6407529a9b6b2e48b36196a6b274fe9c9c469ef02204758b0f2a595f62a332f3a71ad17cc8976d7e9495a1a77b5ef4f0d2453f7d0a2012103722fcb1ea1a8a6961d1c6d65e0480bd08cb4ede3683353c812926223e2fa21c3ffffffff01c6f54e27eae010e694fdd20928614eb4d5603a21e12ab2825fbbbae5c8a8da380000006a47304402203f1e3113790aa2fe9ec275946e7d0f002954daef9501b483bb16cbe83aaef4a402203fd7a72ee3f47f463c02c46edb1c3db42900ee22e8cdde73ebf6dbf68a273870012103cc75262a196dc4be9b5fee2af41ab57e42d505d215b52649d0b2dbc55119d2ebffffffff3c512290617936ad1d6606a26f12023c0385f6d3cabc64da541bde00e97c89a3570000006b483045022100c12e33456093e3aaf82bf0a158bb9d47b2fcf7d0d9012840e327fb6b8f86295202201e7b980a72124be8222e36d78883d374f4ab0c542134ae01d2aaec26ccba4b0a01210328ed84f118696af890b8bd5da1377a6c14feb34ebe1353c10b39304b57fe04d4ffffffffa1c4febfe0d464b2ed959878245fa8f5888f853797c67fb7dba8de17185a70df250000006a473044022005755957d44d58c7301b5af9217b9987c7cbae22b08ffc0a20e6795856e9671e02206f440b183a0925c01e0836253d21e5cd231f21149b82f19f9299bc34c9ef0f55012103aca30a3c6564fbbfe8a3ee58aadacc59f2e1ccf2ca1ec936669b76879f6037caffffffffba6c3b8e89fc61328d456368c110d4a462866728ac94b1af9fcd5705037f1f30290000006a473044022010f6979905e496b34764d80c0e76d65f7602385f29361c0e2fb488b9f517a7b00220185ad5133070d90ada512a04ce7fe3bdb941ac654ddcb73dc4220a6f28c6ce100121029cbc226d60e7f4643f9b15762d55c9c50732747d046b4c9d001db7f4a691a539ffffffff6fe0dad267d64adec32381c8e1722632b7cf043e0dd5c2f03c41dc90df1a120a0e0000006b483045022100ec66528f6131547de21b55b1b57876a2a14de93d7e04350b4016e95b61f1181802200c8fa261c306868e5b12284070987615d67e7d1c630d36fd9a9d317d5f55f4b3012103b2fe1d1245182b802ac1034671eec8f5ab8ba55063ebfceb5044a1d9f21749f7ffffffffd6f7f333d8a885234d68f1902576089fd57aecb16c0d230d6ed96d7599d9a97d010000006a473044022043937911f01f790c72948702d4b535d2abc19f09a0707c412243f63196e08551022060825a9a7a3711167bb56ee27795b6d98f7c302a9ad2ed0c7f69b45a6f96e662012103e22edc31992dee67ed189ab8a50c1681036fc198655f571044b0ae4b5f494574ffffffff02d24e0000000000001976a914b467182007ee3229c103082d0b52922f3dcffc4088acb4b221000000000017a914b2dc5a5d2d0384a7a1a5a249d5c53d122edea40c870000000001000000066c4565667bcd559341a43cf8cd5c839b734e1b74bedcbcd9ff5b59c030db7b19000000006a47304402201bb6ab872a64daaaac753c24382e732ef5826e2e5713913976e7830ebe1e05c40220055ad1dedba14dca1319eff39dbce4a4764948365533fd27a54242003a69bdda012102b7f8416a6c5c749accc164716e53968e91d75c9032a859b7f5fd3bbf41c6969bffffffffcac06763b2a820b3511f95b4674959c0680502aa0711290e53db9d69b6890675120000006b483045022100cbd6004cf5ce655702d65c0af98e7c19268a5669d05ca47cce554c2f77660aaa022005cde2662b0cc568565e1219d9c68be92445e7e5dda918d368d4ba6ee4693f84012103a6d1f246010d58acd38cefb6a8c6cd9b1f0ef62b8e10a923a868c3aac09ea9d3fffffffffe5cedda93eddea56bf31d0e56feeb72c028409f04a44d5b14191c21fad1581a000000006a473044022045bc9ba0bc29b9c22397f092b4b2e0a007c920728b9a31db5615be37133413b3022058c3511e2071b48a3e9085ee4b28c1b2e5548b380042287e50c3bd3fed78591f01210331d485f15b1428a029a1115fd9a5f4ccf3411583a2e687be468516d079d63f90ffffffff86132f918015334c977bf75773f304733b59b8a4ec7e594a990293f5ab00a49f640000006b483045022100990f668345d2d71866e6cad30a4e427459a63c3d7e4284824ff56e6899d92ce902202520d0f75d4a78a292110a9ab86816abba10a1817437910ed67bda171c797cee0121036ddb1f070de025f063fc872d95d3a093dc16410cfe77c4a2d76989f86a0ea62cffffffffeabcf1849717bc4c677dce93e6565ecd95af41458f0aba40c8bc2a45c3fbfac0230000006b4830450221009b4ccb64bce65fad67a1c06a0ce4c51ae19c8c7a2bdf06e43db2e2f6dd76e1cc02205df2139754dc0328eb583532a6353f1c911106def859815e8d59521aaa39b35301210380970fafc72fa1d83a4be11b2dc706056433a2264ea46fb8cf4a5357fa54c02bffffffff32247522ba9735bf6fa0037cfe99b9631f2716f4b061adbb620e027d0f6407560f0000006b483045022100c05f39cae0c2803a1fc9bb8ba8a6b94944a2572c3d834748e02be70d78fda9ee02207678dc865d9dc653d52b02788cf6093ab4d272be3507616d91480029167a2950012102946de1c8e1f2d3fd91dc19d2441e7e7257a3db98f7269a6a001c404bac1115fbffffffff02f4300100000000001976a914f527643753744c250d8a84fff6fbeb4718d67b0b88ace4e7c9000000000017a9147313b49f9c718973b1b0fcdaa1f67cf115cd15ab87000000000100000001a81f1ccb5dbf3ac65a152d98928abca4a51dea2471fea8ebc748c89412972eb321000000fc004730440220096c4e88f466f8aeff79084f53adf8a3b8b39fea3929a24225a6f95dca40841d0220483a733b13c0fbaabc0f6952565dd10165dd9a9bad1ebae6f4b547cf4d3b21880147304402203bfb0706457cf4497bf66c5bba57456240cd560ede742c6d1b3cfbcc1262129b02202cb0e827301af664415bd6a1cc6f6b64864a060430fdf2cdd753d70dd59664f4014c695221020727e42962d0fb7a3178e5249b7a4aff6476a9b4d50045b97e9e96aab194f8e82103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222102e6c69b49f98cf2a5c529ba440062007146cf951743cf5db9979f4771b4eb9eb653aeffffffff01fcf71500000000001600146b032c20867178720bf69f7f9cb79234154c0dcd000000000100000003a5619210c107342d0e439f2aa79ad7b56bd0cc452f305f08e47f226b825689500b0000006b4830450221008ba2d9a6ab809af1ca3bff4748914f8a67420bcce1a2b9572d48f4fd6577daec02207bbb77b469d892749db5c6e39c560e9a54973b3f03e510ad7e4ac1d1af0917d00121029bf93a3032953f11a95387ea51663cccaa7cd503326205e6b59ab73f06a7325bffffffffb58a16b2f1465ade14fa674504e0e3e102d73b03dfa7edee988a6f05f1fda21f000000006b483045022100a2d8714a8dfb8dcb5abf4f5dea4430637a04b6be1a4f45bc521f8f4ecdb136830220707f0707f5588354516672d8cff6b64039f5211088dd6cacfd8f64da9a74ba1e0121031da3c5929eaf08030694c9562c3ad502039a1f46e934a1779ad94bbe3b6856b9ffffffffe6b9bbe1b84ef9b261a2048174495495fa69874e3f71923a4787ed13bb0e9963420000006b483045022100ebaf666a601ca003629b406dea09685637f149034581a8ba953403ee6b1427f902207913b46215d10438ba3edf0367f586c0f25e3ce3c4e1d5204b75f49247960afd0121027dc210ecc2cd9b39d899a2be7495adfeceeb683a1d324a348fb38ba06ad1d6f6ffffffff0222140000000000001976a91402bc9efe41a1e04db9042600366a0e9427a97a9c88ac62d605000000000017a9146960b4cebe7cd8a04f043e6c187f3dc580fbeee6870000000001000000012d184bc15fd1e964d30335cfa85d4db664dfdf1af38f61bf6877c2ec156db7fb0b0000006b483045022100eaf465609a402b3123a72676552d80d453447cae404bda95d6d59509a2f39b55022004597fa5828c642ef89a90ff954679e4f3b5133043adba91c93d8498384f993901210221cf474043eaeb22ab064a67725f2c26bbf7fff7418428b81656b546e4cf1775ffffffff02d8560000000000001976a914c017ea6e96fffe051a0bc02ef00a4da7f3631a8688aca6a62100000000001976a91480394516cffdda9749feb456ebb8e66f7d94e81788ac0000000002000000010e904566b1959cb825d0ec5c3a41277e2f95e2349bdcc0a92384c79289c80a6e030000006a473044022055aeb508178c343e22d2083ccc3134836f9cbb66910fa94e930f26380be1af5d0220211b97aa7ee7b701bd72d7cbdb02b983b0b9c4c931d2dca1bcf7ea9574a28f79012102a485df0d3727553db8ebf6362c7ad4d0c2a242de41b42abbb80ab80cdba46ae4fdffffff042b020100000000001976a914a48fc90c88892450e7ffdab0509302c97d7dee7288ac90d003000000000017a9144089df6053984e93e80573164847e9ffb2b1c40187346c0f00000000001976a91477dc5354650427a0e975038d84d0e5906ec745c688ac55faa302000000001976a9146e9f5e93bd30bc90ea53face39cf41863b2571f888ac48a00a00020000000001016de2ab2d2cda0ccee36e0281361a9155dd5dac13763e42a31c81ff8bf6b6bb8801000000171600143967d342a3ee4fb3c31ab29ee6a8f0e44fd2fdeeffffffff02350703000000000017a914a2b074f17a4d7ffb0cedfb9edb1746977b01b34287cfc02c1d0000000017a9147e4341bb0bf4a969b4d4ffe6b18b0506df40a6d9870247304402202cb85b109076447795d8bd4ff6a975a0923cbbb6e6af97c5faff3a7381a0ecc40220731e745b61ec548d5fede4bf591e805c5d3305391835436c773fd07c80a03390012103639dccf65fc96765aaa5c7b00a63e94bc66b3d01267ee25f5c3fc5bc4c40599c00000000010000000001013bdbc57b63b4faee37e0f6e0cc9f0bcbf77235e65ec43f415eacddd023d451b41900000000ffffffff1707631600000000001976a9142290f798e67153257f0885fedcaf38081786012788ac697c1600000000001976a914ba0a0b202f548f3b1f59c7049588f11cbd308ca588ac015c02000000000017a91427449dd2e8db47e82294a58d0d6e65bdca82900787721608000000000017a91438bb522fed7d6c1c1514ca6dd65a3106935ffdb687ec5702000000000017a914493c403ebdc47749db996b83b40a02e2094f6e4d87763f02000000000017a9144e973ecbba4331fb5fdd9ad6ba19ba9065c932e887d7b804000000000017a9145db7370d518e0cab8e6d6b9d82ad30fe9140db98871f250b000000000017a9148366cc2d76069bed578c19ce382dcafe464eae42872d3e01000000000017a91480497bb47b0ef12e9212f4b8117354683ef7083b87ba9710000000000017a914917ed9b41502988521039b28b9947098724c428587734902000000000017a91496bac19feb47959e9880be9ef33a2e88aad1f5ad8764ae01000000000017a914a8b940a643ed4e521ae9bcd0723acbcf498e8830873c1603000000000017a914aaefb66ec615aa51e88e64adc530b6d1e66e19d787e85702000000000017a914b6aa608e1184639dbe2e5524dcb51efc827647f687b5b202000000000017a914c1731b64b68a7f7b1764c8e6a078187e45cb276587a23f02000000000017a914c9f6d54cd15126b1c0d9d14c4f6f2f7057b42237877c061f000000000017a914d2139b9f0ea1fd3e568071013569ad1ed8bdd12487c74b06000000000017a914e2ed7a37b8a4accb2428a90de397bce3a96c87f187d7bf060000000000160014d5f27463a6b0bdde8039df5a1402a1769c09f60c9822040000000000160014bc99cfeb2dcb70368ff9d2e4961f6f289ef1bad6660b12000000000016001496606530f5362b4e12bd3cb27fff8349ed2d8e8373f9080000000000160014727fdbc6bdd67cbfc9dac90251225966a07edcf312af540d00000000220020923a51c2b9e736dd6cb8ae55038c4e3908fca4c28c65d345f437e4a4174c5788040047304402203f6f2a0401f91e044ef9116b78e6b2c13f98f0ecb7717b8a3c41fd4a566cf6230220424a17d24e2dd53ebefdf878e140b6fa84c3bb2da78746267d97aaa693fb7afa0147304402206386b034c0dc7902bf5746e4349fd46e5c2f2db11c001b698de9f46f4bdd9a04022017b72649e24e56219788c0b8cd26f21859230a52128b3929c362244259dcdc88014752210341fd34442d6361965beea89d4881231bb9aff145446538931009633c326fcd0b21037e714df9945ad16f4c442f1d52283ab8e5189783f77677501e318de86ca4aae752ae0000000001000000013646de3e824e6163c0841535f88666c285bbdce3dc577a6a188dc9632af8fd22010000006b483045022100d876f8dfc0992c076594d69030cb268d282d7efb1617120ac5bfe0da5d0169040220310c987c33c8e31974d294881ca671e72a0930a84d43684451bde4c816decbff0121029f69d5da4219d89244913df39d41164d825bb12be64e4d3cfb71779ffad669d4ffffffff0248590400000000001976a914ba385784ac80b04a547912e9e63eb0820cfcb93988ac8a2d0000000000001976a914c5b45d4d94bc03254d1598013a2637cc24b714bb88ac0000000001000000000101bf3c8c554e6d0b119219c7f8454b120b9ac1f857e43395fb0a2d4fdb10425c421800000017160014b4cbb70f52dbc3ae6828f1b7797aede523677437ffffffff026fa72100000000001976a914b93ed4cc93895572822d8864cf0deec839d2a07288ac923200000000000017a914ef0a6e2baeb4ab63cd9a6c8bf63285653bb4f0138702483045022100d56191feb5b9e6248e163285153cd81798416c7406b37e215f783027e5204eba0220567fa124a9182926dfda4baf655e9dae97fcffb306b153b85de3fd681913a866012103e1f79a8b304df9f9c987b316245eefa814ba91b33905050dc452e5f1aaecc5330000000002000000000103906ddc5e2ee54589b41f159f2647868a1769cae5ce641fd4f4d0b6608ecd838100000000171600141c70d07510c9d7d6aa86a22024def9f65e3996cefeffffff0fc7f8214370915063976f2a4bbd1e08f910c8cd753e6f43e68f6fc46aa17516010000001716001466b738eb9938c769f185d3126d480d215df1e2fcfeffffffd65654f54b4096a62d9d82f30b079ce988449028eac4c1a3cbd556dabab9b12400000000171600140ab86946bd472cf9dae974ed9cce584e7804ac70feffffff0200e1f5050000000017a9144c06a6a9ecb664197df09f988137a8288058c72287a39b2c000000000017a914b182da562430a37f3b899017cc9284c0abcc4d64870247304402201be63061812e7862cd5c3db1e5fbdd6038c876f3b7104d891ff2aae644c9bb5e022068f74624e02ad1034557987335d9772857a8b0cdc81b445cb42cbc5aa11f25290121036e1714254554b59d9d32fd3e4287872993a7b47b7f905c999269ba1ba2c7d53d024730440220674132fcdf559f008e5c93d8e64b6e4827a5809439f05b945a0f868e573b190402207fdcfc3609e4abd171bd9853f3d9b1b93a7ae3f6599d6ebbd46f14d93422eeae012102cee3263961ceac36a4459b66f71088e296ea7f38b7713872613605d0aa87fc67024730440220113cc94c788fc5d131cd32d38a01cbacb803193f2036ceb94bbdb9eb4fdbf0440220115e1ac3b7e9aff911b5c238c343ebd92ed5935557f6fce745753e6b1d4cf86701210210f8e393be44fa9247eb327606d2f09b6e5da35d95b3dd80c00a9155585a37da47a00a00020000000001026d7625baae5cbdeef047351fc645bc9e8acdadd631f4d84a72de58519034c02a000000001716001478219837b1aebf94e02de13c3f7280a27c921128feffffff127d49393bb1bb70f03b7243ebe4ab5a791c6e0934e5107c91df15d9e95b1bb30100000017160014823e39009f1f3dbec0cd3aa0143ff8f5612ef01efeffffff0267d80f000000000017a91437c798d38f3e66807ab533299ba26ca4cdd94ee2872bee0000000000001976a914405efad180b423bb438e466e03d0361b1e4d9ce288ac02473044022027bc8f789300acd06f83ed13a3369ed26650e2afff76bc49752137a84545791102206e77b0cc3bdac766ba192d7cb88d5a560060ec0c50b03d0400055c2e3038b530012103d1f6cab16bc0093e64f4bb91eba5043705cfae1c9a223ca11c2a4dc7f587299b02473044022024c7fe69f293cdc5da6b9e62db13a562f5d0d955778de2ac8d9c67b487ca02e9022047d1e0458dc0f1d4eb9af0cb1a1b61068fb22b7e877f289858e42e6f4b6333bc012102b052e459c31166c72e839d7d7564d84ef4eb29cc9765a99191888fd6898fa6c347a00a0002000000000101af474d6ff5d4f7c65ef90ca7b92abf8a3a8422027bff8e8e6750a2d48cda99ef00000000171600146c738d93cf53901beaed600512c3760633ac788ffeffffff020fda15000000000017a914319bdd9fe1872d1057c52ab9cddee2035510b0f287fa8109000000000017a9140055ee91b6d254564e739ec94875597789c989b78702473044022027e5e57a482f2b758f8d42ebe60bb4cf5c5f2a79278e246923e0839ed9ad7cb302205a980292b8283c1b6fe12db491597dc8e5491ba6dd02851da3fc941b45ffdd890121036654b9a0abd2bd0cca93309d445f82d3773d4d5c4b64b41a8952a739d724a38c47a00a00020000000001052449ec4bda6331858ea3d06ded411e83edcb532f229b02b9da204c687e4ac6b801000000171600142697f87d62f05a0bca3a44566932a0ed6a5cf974feffffffba504b0960aa6ff0c4919945641b568635293250fd63189cbebff26200cd92d900000000171600147e756ec57b0f40a8048611cda3dfeadaccae8c49feffffff3ba756a46089fae67b11e1f6fabdfd911506da901bdc7025d60fe5a203c57cbe0000000017160014c69d71b62bf61e72877ed0b732c3badf4e8319cbfeffffff229405d60a78a24d41211f540289c13d0dd1747290e63036f154c3be50143b271c00000017160014f29da1f9e7d294ac2f9f32c2dd96843edc01070cfeffffff6d7aa5b619c79289e8b5ea40c9c04111d297a8d3d888639e1e98108eec14b18600000000171600146c160bccf70d78f0baa61b9ed56df5b19fd5e98bfeffffff02f6364500000000001976a91490cb2668b8d7199d1faa270ed7edf40a7ee61a3a88acb1610f000000000017a914e71187073f6d8d3ba23c94cf21f063f9dd924af5870247304402203cd2589a8b7c09650892ae7d50e83ec4664a91930c3283c4699349bd90cd484802204391ae5a13ed129533492058e1d137b03a47fac6f76ae14026c34a2a768cafc20121027b8c67742b04c245d2a79918575519d0f2c17f652b5440ae84bc1f105a950378024730440220187337a1748a86888a862e781c57df0e29ae74ab70f38793daa39dde4b5f747c02207b4d4187100601de7948e2b7f177a656c0469af24b4d72fd163ef38a3cad9d2c012103616ef3bdfa6742cac621cf2a65daed08c1d42997313a0a482ba0fe8ba93bd4fe024730440220426e35aaea463fa9e443d8b6c834281cafd007709b5881a2808ce569e49abdd3022009770312a63dc3707f038b880681a789d5f456264633622c4ad6dde44a1adddc0121021b2128f7aed66679d1d49316b779462fbed29d29656bd730f72155df04eda72f0247304402205b95ebb57d93474e1c87f531b9c7df2d3138db415938fa88f028e5ed225270e302204c42539ca65fd73d9dc8c5bd60cfd2ccb46b8b2268fc017909649be91e9608ba01210362af61e52d0014d8b0577dee8f0db1d07958e6ae2c5d67ca4d16f38c96ca2b720247304402200a34a785caea09c02fb76b3f1bc798f16bfa81bd6c37bcc99982d13a386bd89d02207c9550f2841c8773b00b03f148f730f5398cee6f4518e8ecdb650bfd59a317e301210393596b691b010c7a9ffbc68b7b3f547547b4ac80952e7c800f8278a1ac312ccc48a00a000100000001830193175e4ae01f0d24b32f0b5830924cb0231ea5ceeba3632fa0e24d1faf26000000006b483045022100f3d4c880aad705eecc7ccf1ad6123f8cf5bc5c86964c4efca9ef416a56b8517502201367225a7d5cf61500bd585817291187191c93b07c58bc8d3bf0b3cbfd39fcf3012102fd55becaebab391dd9733438481b05da690c644226e38b8b7947bee9f565b492ffffffff02057d32000000000017a914e6e553f0e3db893a05499d97867bcc3c9f207a708731a31200000000001976a914b7f3a71bdad74efff50c849c738b7f065b63bda588ac000000000100000001cb4890a2511fb9d0d33fe2a4aee6c1daee3e85668f13969a9b299b344bd2c4be0a0000008a47304402204819715e764f55dc702524b4687cd3b54a57e9b0470ecec7493a8b6a1b0de78902201e63e419a915df81b712d16e6ae1b233b9fb2ab80bb45ad49fb27bba99253c090141042ba133d3a2c0a4e4681d110cd8be71fa539e7c9bfdb9cb407bd2da97240e02f95dd4e673c102d8535d7265e20d433f9953510133fe6cdeef072aa9a061a911d9ffffffff021020160000000000160014dfd4a13cb12fbdb97c1e19cbccb31c4068dfc3ca64c70000000000001976a9148d37c836a3a1d2b0a2a1b6e5d68a9f65dd52499e88ac0000000001000000000168858dc17fde9b050ca5e78519fbe08aabad5efe9bc7d06d3bb6ea73bdb45706c80100000000ffffffffe19f1469cf9400bf0092981f0a81d9a431f6559f809446d93560cbb0b0d3da4e040000006a47304402206594d2b1416e972b9cb2f058b27933b7913dedb80bfd3f05d154c42a08af545602202a18f4b0d8c5a4efa86c89d122579cc16bc6b07560fbbc5a1f20c56178e9b3fc01210306419fcd8b357f5560d94ee53b4d9803b8facd4bbac305590fc5092cc415762effffffffc2680972af094fac46ba2d2acd77609ed3d30e8e1b3ea6bb374da83680b6bded050000006a47304402206f848c9e9f33c8637a462b4073c1f6ba7e0f930e83259bea4cee9669a07878dc0220681523eca58ff80df8eb212d671fde23407d3aab2c30afe56a0f6f4184de7fb20121027a24ed212c42f5a63419e31f4248eca2e3feabfca085176ad42edb6ae110538affffffff3162dc6564cbd12aa9dd0c78f4c92991d75a9fdfe83378210b2ba309f78b0a81110000006a47304402202958cdb970ea5cb17ebc34b562ae3c0fb1a5cf627575f3af430bcb53a5aa186602206032fe3ade62fb60a9ddaae484aa5b69af9d7c67cc3b9d74bc581dbfaf15af2001210332437478e402e612278a32a425de143af4b2d0490d336ce8ab155115f5a7f65cffffffff161e3f7cd233080e9e8c7f0478b1514ecd167f8eae71f6b7f431f56db6ca6020280000006a4730440220340a588d947954afe35a1b55e2c20daebb998c6c5db4eb76c6c0331bd273783902207392f0942f8f1068d8be15d5fdd7dd3d6fd61f36594183df3a9a5e19d95e941f0121027897a2026a645f61af4727d6e451dd9b9da9e207bf87c1f7a0adf4b278cc7a2bffffffff8dd1995280d192f9520166eb452feb4d51c1b720bd7be45884b41c774fbc86a6000000006a47304402202f85b9133fd3f4a625660ea23f64cebbae17232ef6bef704c5654816ccce79a30220126689061838634a6b467473cbb63b2f5c38a0160c29bbcdb192efc330944703012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff86c101be9399912534ba236ca1741318941a7147fc673ee92a485b37b3f13573000000006b483045022100bcf101ee48e43ffcb2b4f8e2213b9e6d69d9385c6345519b35cfcbae534347010220674f990aa4a34e6cec34767366895e859c1bfb7ab87f382b6ac9b9ce6e9bde8d012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff0f7ebb745947c198a27dfedc96d67261935da5f8801e0c556a46703f78d0ed5e0100000000ffffffffcbecbd0d250ad8971789d87d4e01637e2b64b967f4c94ea380f25890f9568d6d0100000000ffffffffcc15f3c128f53e4229a8e8dcb47265172835c69b978d53aa7289a23a99794eda0100000000ffffffff80b773685ef949a0aef57c98c932d31e89738aca7fb286109af4d04b45921641070000006a47304402202a545a3105dcc9eb590546d3c62fde73b94f94b8cdd7431569998f57d67e8f30022032773d5eaab5afc7aaac40119b59a3ec19ddd0ed0a4fd4e0be2d56f19166e6200121034a2921cd7f28515c20830f8cc95c22282c6827296b187ff7bd046d5fbe6142d3ffffffff70a1e7a954f282498a8fabe6efe8cbe91df9694098069300ea4fe3eb20402cee000000006a47304402204e6a5638f3d24e78148e6a25935299617cd917ca7d4c826c59b2c210db7553600220445e8216244c261f9d763d97fc87c4d9ea162de5e0f5ed44e325f5768a21afb7012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff530ebe3b8e133cd8021a2405f126dbc2d53246504ad79dd93145f34738939717030000006a4730440220177eb69ab236ca45340741870a018ae59140a517813efbd9dffd6d2e2678ee9902203334752cb23e2452fdd1e5211f32c5283d4c478b7c4d3abc79e6bfd953585cca0121027a24ed212c42f5a63419e31f4248eca2e3feabfca085176ad42edb6ae110538affffffff99b45ca7a0ea966646dc5c2aa925908b33cc2d8f4743b5d856f0bed25286ec5d0100000000ffffffffe9425131079a506061bfe3f0d426f362f939fabc6ca57b3e044eb4665239851e490000006b483045022100f52078364fe066726a471e180831e0ffc6f87af8ff18473d597f9e9f37f71ddc0220336372717c51c918378051790e505fa736b4a930de9a43cbff9daf573e50b1da0121038b1d11362d31aa1ca6838012b736f64447b6e67b73cc77645eee45c397214fa7ffffffff9fabdb1d27676689cc02793cdb333ec10e8724ce8519ddf1751113f2cedbd3aa000000006a473044022028afd76107638a53506b5c313e31540502f21001bc37caf1c06950ee6b2d1f4502200f78cd85e246bdb3db830db9aa799633610b60977f713f9b52a2158ad154f423012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff09be09fdb6956f401a739a927bca8c230ecfad9e3695ef1ccfdcd59076678c820100000000ffffffffa1aaa84c5a150f65d5e7a88c01c6aea179e9ac3a36b234021e8a988c86c787870100000000ffffffffbd49a129538222665472f48645688a95a1119aed1cf53d2dbc29459dccc97300000000006b48304502210088a5c40037c01d05fef388f6b2aca94cea3e70e6fd2430b1a7ae0ac4956a100a022018c033e88a8bedbaa55c1e60bc425201a0079fb2f3911d9600762a0bfc28eb72012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff4b6f12b235b1b93ae5bb59e0b0c1fc470b373a8b2c0dca07538acdb9ce55f90c080000006a47304402205d1d5d5d857a4211813af92d344e1b85eb430da669641147224557fbc897fd9b02201fbf7af5bbbd2fe15be298a75bae64251ddb1e7a1d81973d1403413932aa798701210365c1e5e8c4e6b58f8d0babd021910d2ace9066d9d9cad621d9d094132321260fffffffff952b79ad5c1e2e25fd705da935ba7564591d499cfb1e82816a96d11888b471ae0100000000ffffffff697130abae3b3632ed35d218fdc29ab24f9ab06bec68a0670c7fc2298ee690310000000000ffffffff59b1ae8a879eaa6ad8c8452381c0d0236d7948a504ebcab492358935116f73c00200000000ffffffffc00c2a6880759ce2670cd247f3a0d95cf58ee4139e173981bebf772865cda232000000006a473044022060d34690d1b0e18798e48f4794369e135f900dda7563f99bfc62f44e804d9514022048530ad87f5155ed3b2524a30c6883cd35041ba1470a47b34ebf98437436370301210397e6a24676477487630cdc4854e1dd8e966b9bd164e11c674b661923e4c4c809ffffffff58c58ba58bf0c609f7459cb1af96f1cd63167929550087112a5bcb761d2a1dcf070000006a4730440220027111251a97770917370780ff3a84b4874e96a5eb9cfa6446e88deea33945b10220362e69aae34bd749a15f09ed3da0af9f1630bfa30d5b81f55d9d95a9d38fda81012103e37811961c190fed555169e34fc53e90ea9c2b1d11bb866f8c5898f0765c9cadffffffff8d1eaf8fee798f7f57352a7c0b6a4d47234664edebd250855e3e7bfa90b37ce80c00000000ffffffff7ca3a69f124c33a9248f45adde6e36b26e6fdb8f5a8a956c20711629e53bad71010000006a47304402201d9a4ffc1d46d171035290960df4711161cf2914acf71b63f88d8b49121f786d022072685649c0e52d2fa0730aa051318ba0034bbf44471c6610d4b1dfd1941098a4012103fecca90283de10f3e5fcae513ea419adbb6a44c38b1b25f868ce1840ddf2ad82ffffffffad06882c7f53d68065647d93b0436387722e0ab87c52d213cbf3ebcb7c0819a80000000000ffffffff7fa9a38114a02bb03defc27cce57d56e0a05009d7f4b199744f865aa11c6d36e000000006a473044022052dbd2dc32affea83aaf8e313903d5d0026f9f2be76360654f3be9ed7b364118022013d4a55687be058a6ff4250c7982ffc83d8e0c9abef20071a58669bb449175dc012103b0bd4ca37c92a4a39c49c410c92e0b1aafca1f60130f18c5aa5aa638f1021e6cffffffff8539364b73e85845e52a1ec674050287fb6e315f18a19aea7d083803ee71e08a110000006b4830450221009d7c26990a4e67e34884ed5fafe37ed6978d4398cb9b969fe93d208c2a35e887022007e91a49d8566869e475fbd8229cbee60ba9f0fdbb992fc154d42df931a39288012102c7fb91e521bb9d58af02e6868834a1e06d575f275601d1fe7de3c7610a6254c9ffffffff61461efa014a554b1fb99fd68113e5587a9f28ec04eba4fde13d48b97898325f000000006a473044022060117f29d2cac4084c630ea9e0c8b47e1811bb8fe5ec69f6fcf73851f2558dcf02207ffa5e2da1f9f1b284ceab219cab46facaf4b9fd2a08c90fb7edea17b9bf6faf012102047ba3ce2114b2ac281c3e391f9fea819bf386e71edd111824d6bec01e458171ffffffff62b99f001fb570c6a2a0d5f84c25ff2e2b33f9e6896487bec39809c80ce10dee000000006a473044022055fee9b62b1b2d8ed4e8ccbe0bc7fc118a5ea6d2edadddba0b1eeb31946109da022009557802b85b4c5be87e7b7cd2013a8491d44f1ef01f9ef2049639003b415242012102382439ce1b331807fa2db519b56da672c8bdb683e92cabc6ae4747150140a533ffffffff12905100924e8ac6c8ea064cc06f31719c689adc8c4d303b3fbba2bdeebc63ab0000000000ffffffff23a866fa0a7a24d5f059817e572f6605b75cd881a2fc91a075a4fb61faf36f760000000000ffffffff1d92c0a64f7f901b77177789e2d1b2185721268d08ea79b9ae46c865006294a60000000000ffffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b11275040000006b483045022100e5aad2d57a319519ebfea96fbd3402e1638d41efc562920c74db6a9c5bba781d0220402a3673c52b83eb5ad6efdb29be7051472b1246ae65425fe5d5503bdd107868012102a26385d7c6411f8314383bdf5ede2da5594359cfb59d71cdb0d4a6b7e46a5a92ffffffffc3c8d5c01c77269ae8d4813693291e1b1d577a7abea14696d25a5a115e3e59d01e0000006b483045022100cb1a99471427c61453ff42c4cc5649da7b8ddfeea132bc844b5493705e05b86c022068eb87556a1c8a913e717d08936db05a8d72beef7fe9c42b951eb8f30cc2b9830121020dd1186f77ec86a95affaf5701ddf6dfc6d1f839226c039905d671bfe12ff7e5ffffffff4be5829505cfc46514097e3f98f7be9a7b9d996be198fd8380ce4787d0af1817160000006a473044022023dec1a482ab5bced1e590ee6e75a90d105e064c09aa54371e56d04275b38a5c022003a0f693db28ee30f277cddc4f2ff73eaa0f973c7ad829bd2e515ffd5db3bc8f0121027897a2026a645f61af4727d6e451dd9b9da9e207bf87c1f7a0adf4b278cc7a2bffffffffb290d592ff32abace5173ab7f82f517e23e19b40b3862f58c6f08e430bd3e4d00100000000ffffffff115cddec6bad45c5b715e1815d4e71c005cc39c9cd334d27268013f251b2aad7000000006b483045022100a9660de33b495e0bb801a311a5f46cf6a1fe77acd2995f93ad659f9d3cc66e0d02203edf5d571d7f505f6a305ffb568240ecb99371619060277a934df8f59e65589d012102b6e7a76ad5cebd75f0f72c621e30b3968d1eebba265ac59ca237782e51acaaf7ffffffff58932e837b203c40ebd68126a9449d0594004ca0923926f76b61f95eb84caed0000000006b483045022100a25dc4ed37c99dad39afcadac628fd7da0c8d4444860b7c2e56ba135639979fd022044e6f7709b75506385d4ae0a1da349fc25b1e017d4ac26e870885ea75fc607b4012102089b7aff06ead07a3ae75a49f4c133ff35b140c5baf327627603cf1b2f716075ffffffffe6d2233c0cf33eedf56981463b5e6feda5160f1c2317b9d2c937c2041254fcf00200000000ffffffffdc15b1cafac6f87e752b4437668000aa74976df970b40a75d9384b07330f3ef8d80000006b483045022100aabbbc3ba4c678837478702addd5aa4edad79b6a2f79ca5c304012004eb499e802204473ddbe865eca2f8b9751ef12a656a361ea0cd32c6e198b9a252e59ffcb8157012103327f1cab856f953263016ed9576fbbf32b6c318a0fe608adb08fb9e70c10fb30ffffffffb30d1ab234f94fcf20dbd8f01b33ddccd0c24d9d0729fe01746a17a809f105070f0000006b483045022100a0a0521bf6d496ba88dd03f7597909c5b464ba3b57a281e778f7f2a99983595902201e9701cbf2dcfa9c3ec7e8680f854365b151659ea8dbd31b0820f5b49da1cfa3012102f05ff4bcd4316a142d55c50257c871fd6bc81a7fa708f43ab0329c4280fa0ca7ffffffff301397020182fa3886551e8d04ec581c570fb8314355bb965da61756d90b8332830000006a4730440220304acddddeef7d9de09fbb9ee0eaf689f0ccf9c255251396a0ecdbc018641c1c02200161dcd500b1f774c42117c1ffa2d7015804bd5f087fd5c216b88338ac6a6157012103026a09de494ccd80dbb59fda11e6ad047f21ffff7e67e209794e894aab8b2cbdfffffffffc94c023f33751ea7106c2a10228cfca7e44a60a8981667e9476e667d1e814c5050000006b483045022100c01b40fee615dbdec16fcddffb9ddac433496971deaa2e714db00c66e28377730220228af07b54e8765ae4f5782ee04c1972f04aee46be99cb0d2f81d0daea4923c201210301ecedbf2374684fb2314de520dff27bbb7184cb5dd546b7d77eb7f01d90dc11ffffffff644195e9c025ace387d35370c3ebcbf6af4003362022b8d29abf392fbd02ca90000000006b483045022100dd9096e9258938c1b85816d89cd65731f46059add8b4f9be3a54e877ebec2e30022062f1719f03db740a2d07824ba6c8a16e3da411c16242c3e910bd47fd0f94433c01210237dbcb5d169e1f5e975d30fac6534cdd56c07d17dcffcd0d30dec21b9865119affffffff6f5344d02b6c400ae0ee414d2b61e4b3247e315a4672135137aa15c20b48490a000000006a47304402205e4da3c636882b5b9fcbb660bd44809184a4168784437a94e26579463263108402203500b5ec65fec326077246f8bf0ff895aa64788d047f0ddd4ba6618578b076d101210238502e32fc1a35e84e58c95ab1eeea60dd5d7d91f75b0f94a979727d85497e3cffffffff4dd3e33d29376eefd723409154aa35e3803132e5d05a0385c5dfb5b9e4a1e073010000006b483045022100ed79f570f70d4a045b292084384a569e0f4d5f5766d88342041570265c496f7302203ad6f5e0255bea1d8feae1bddc5052022e29573dd46c7c7079d57c575d076fe3012102089b7aff06ead07a3ae75a49f4c133ff35b140c5baf327627603cf1b2f716075ffffffffc816da9323279193b84b2971151aa73097b722e8b9d168f43bf10fa0957394a7000000006a4730440220371a0e4bed483547036e01b537b916a781a5c645da0899989bcc5db49828a68b0220160404d3f4fdeeb1edacec4e0c235f665ff0274a86f15f6735e22e0d0b1a9caf012103c81e03f7786ca6c5c038b18e890646a28d44d16c7e9f4e10313e7cf6e6d04c78ffffffff18d00526170939425381d2d19547abb8ed73ee7e1564395d8e4107120fc47a3a0000000000ffffffff5f311bc0b7087297fff5ca355a6038ae6e8cccd4cb9702d475f1302fd4cb21962300000000ffffffff32b2d4340d9a36fdfc8d23bd92ff15df6bc50b8c7b11a53a3299c4a3c0eec4e90000000000fffffffffce29f7fbe2712bd20535e937f117fa4f78b6dc5c939bb5c8d71688cabac841b000000006a47304402206cdf8f143cb0a15d80ef1ac6e03f180e694b68ed96f179b03219906ad0f670ec02200b6a462c0755860586af733da876be27821d5e94fcbb539f33a86fcd9e406a67012103fecca90283de10f3e5fcae513ea419adbb6a44c38b1b25f868ce1840ddf2ad82ffffffffc8fa83d8243a2bbb6a4ac1a0d742e9ca3db44b401aecfa14039a035b6da309a8000000006a4730440220682a664a04d4989b034b307ec85ff8584b10a0b707e78dc9c15884c259ad52610220611ce7019f971e2a50530138d81d6711d7ba0f971986495fe761e9ab5c948208012102089b7aff06ead07a3ae75a49f4c133ff35b140c5baf327627603cf1b2f716075ffffffffcba579f729ad828ddbca0e8c7eff8eb2a1735e51e0c600569cfcbce2bb64ccb2000000006b483045022100c328a9df64f53fd109af1e7290b4b2ab9a4e9abd9b965a48459d572bce0328ea02200e7a7036935f87e01df557e4976575ea3b34ae6ff7389332939a27598a40206f0121028700bde402f67b6a52652f9f9791ebc82863fbe2f366b9328f0463af8bf3c483ffffffffea1160f48acff9b1c31aeba1b51ddd296b4024872ec6c3485f6898c170cf98220200000000ffffffff61f8e3d12b21b08c715af620438e051f43330765c5cd2e818a5431dd989329f80000000000ffffffffb920e459ee79f5e1d564a2bb689f55ff26d2f86f4dff2b4617a12ca34d0b49a50200000000ffffffffbfa012c5496e9bb69deca27fe002dcae471ec184ff55e34cb93d1288ade1dc8b0000000000ffffffff84eaecb22ea8e1c10301addb936910a38e959570ee61cad25da7190f2d6b0d38110000006b483045022100b7b209a96e26f8425dd46fd922a26bb26398d6866c40a27fdf5119bbe3f4648002205db3e73e4e696845da891241d94b6d109595c703bbe82f66b9481e5591370586012103d50702cf2a9484989e2381c944b77631ce69b657e69421fe4f20726a6d64d66affffffffe5f17a50d76a19813e6dc3397cbc78da20b69fe37bce3251818baa398c1ff6b60000000000ffffffff8fd1a479715923e27ff59db329fbc1ea45abdd0b30d0fdf36a87f37afb9b0ce80100000000ffffffffcb4b38e3d9817ec2ab05cb9629ab7b2e80fd3b687d6fbabd829e6469b545ecff0100000000ffffffff2e30d84315d383e0cd3e8421b3d0c1c70fb188140460212fb7de2d43d9505bcf7300000000ffffffffaef3b78765dee527a8ff5295f347e4d6282ff008f71fa0134a1efada9647f7c80100000000ffffffff372550d661336078dd74beb3bf910dbba0226630200d8423a5b6a5abc031773f1000000000ffffffff6e94b7db8ed628b7be6157302d69f3b406c1004af6248436c6a9fa8ba74322780000000000ffffffff915dc6a72d8bc72cc332e62450680dd12e55536506218103ae023a5661b6b7310200000000ffffffff3c36f3ca29ffd1c85ee59a2245b65a0e7437a1ff78e30c02c5625999af41af940100000000ffffffffa28f330cdf99ad2646515763037b2df4cb5414ebf4fa5303fe635f17f9783a010100000000ffffffff8aa2d5b4d0a10e1dfdea8141c9fd3844303a7641028660922b41ae80ac58fb6c0000000000ffffffff11e1072332ae0767fe2ddfd27698ade75cfe78ff53886d6a09302b014e90b0110100000000ffffffff8d0bf9905599bb507ac8b14ca344f5dcc645300872d7eb196fb749ee69214c5c0000000000ffffffff89f5a26111244bac6a5ee393caf66801e7727a0096cc8779fa9b1ec4cd0c19b60100000000ffffffff5f2117c617a86feee7e4de2045244dcb772fb28adc4ea85435d2cf6ef0540ad0320000006b483045022100b03ad6fd0a79ee5e529c642d7e5ac35f09bef375b6c7a45a8f25f369a4b08c7202202cdf8e47c4efdbaaa17276e8ef73c4b412ddb4e3307bd59eacb2fa4abb62fc090121025e961c9d724d129ea7873439fe7879a9e95f77a8d5f2721bd3d3430ca84ad08bffffffff70ee3651c8730cb8b0e75935aba6bf549162f87fd9331709946779c8dc8b3b090000000000ffffffff0afe36654049d74584fa30de1c298d0ac54baa57bf8da73636af5b20bb016eff3a0000006a47304402206ce6cc4a7e4696796029edc5e0292b61a34c60dc92d19eeacae144f8900bb10a02200c4b71e7b8f05756ed2241a6d269e84e91313bd43b0bd3420df758dea4b76e9b012103e27d2896c162f8809b82314bfd87d8d0d45554e401b851d156a9c77f87bccd04ffffffffe0094a31df5fe7ce4ea43cef3df43e7c67869cd46066488821d70d29b84d13b30000000000ffffffff7e9465fc324d799fee3f303995f1efdbc26ce75ca756b89ab269b72d71def6ad010000006a473044022027dfb59df60066a14b3be40eb1c1b199bba99bf01dbd802e801d6b2a2588ce75022063f839c23023a94b8e7ec7fdd8b024ef0f97eab4db7bbaa3aa100536b478dcf201210382d51cfb0185f7b54c1a3881f50a95172e0fc25f0c2c2f9716a6b7a5ec797f48ffffffff176624907315da6299d1a69d5e28c450e0b990ead92bb15b8c6c53e05a96f064000000006b483045022100e35262d84556a3500a42874475937a0fe006947d6f7fd1790d9eef02a7acf75f022042d540218c668e72397320a5d8a4dc0a6b218aec2629c0f7d5fe3baaf7c0452501210382d51cfb0185f7b54c1a3881f50a95172e0fc25f0c2c2f9716a6b7a5ec797f48ffffffffba204cf4408066c7f4254738f0f4e2041fd86d373a265de64276a5e57dd944e1060000006b483045022100c075bf4affa9fdc6c3bdea9c0824dcaabec0be04e162fb803ec7ec1f0f25999c02203f531cf4a536e8fefdf2929dcd01b0c7fce37fa7fd63ded2058ef48f3da09223012103615ddc5d023031f229047923089bcce37c135c49c19c528bea945f094bd87f52ffffffff237d38674bfe453854e3027e973be6e5238afd83368b76ed6342611a9eca1122010000006b483045022100bce8375405eee6debe2a7c645d01fcac9d3a82c80c8c78ceea3ed5ca00327f9702203860f51d5122a3a44459d7530dbbce6eb2d283bbedf20260f3986fe8a4114b0801210382d51cfb0185f7b54c1a3881f50a95172e0fc25f0c2c2f9716a6b7a5ec797f48ffffffffd057058dfd018405774080be39e63a7a2fc1065531a8983b187b8d75ecbd11ae1600000000ffffffffa32983aff94e2ffbf1e72b9718879c28fb6154ff66474b0b84d1d793014ca5450000000000fffffffff732ae481462d3ad59294797db183b0b204818b4594348c0b5c3b0934ee4b4810000000000ffffffffcc30fbc27a377a89c0a64b6a5d7872df51eafbca693aefeb4e92a29595035e030100000000ffffffff29baaf6a725d4d5a7ec55131ddec11f8a06113f9dfb9994a2231407c8eec43520200000000ffffffffeef50d26f3521c8acc5e7a89f694e3c1d9f38a0da99a80ea832c61fce8eba1771600000000ffffffff1d62af6dec09272fc848860d81559a8c3a41db2d8f7ff4f7fe9e5c30db4f7b350000000000ffffffff2b6fd81fd25cc0d097d59c37ac1ce414249fa418f1a237696c1e3b9f25d337ba000000006b483045022100a03528d654f646b3f214e1a664ab1cae5ae50a9b01bb7559d6c8a6630a15bba5022054b4f1c51ffce65e4edb4c87b52d240cfa12532f8a78113486543a8e28c38581012103615ddc5d023031f229047923089bcce37c135c49c19c528bea945f094bd87f52ffffffff1c336affdb87314dd34feed0752b5db632c4e9306a1cd58af4e746638bb14eb4000000006a4730440220434296e2a5d357bc18987acdc7d5235278ae6bc176dc8d1557a15bf7d5263d32022060f63f5e9ec32472853cdf0359af89148eceef4cc7010f169d99505a9f3545c60121025cb9f489b420b43bc0c7fa1d0c0916805ce6f80a2cd518f35565792df40bca79ffffffff544e75fe6a2aa0f239d0dbdc16d78db6558f98dd695bd4a933e20dba8dc1022e0000000000ffffffff8aa9aebbf92907eb16efa94bec80a567c0f7428efd6afe767a690f477be9ad4a040000006b483045022100a39e08659e4a9f50fd24fb234a7379c009ec573dc76f10283e8569d92a87fe3002202d2ac3b98c84a4859b1f010d8255613d7015d9c94053c468ead6a815facc3729012103aa376076e3b68f761bc2b293d1779f8c16de8e794508367e6b0643bb754fd9caffffffff96171a7937f2a12d4503b0d82389ed86a0ad5e63555f4b124e0f9e07e17cdf0d0100000000ffffffff53ae271006f2f8d20baee68ea02f8b80bc26d095fac1f1576e292fef8c7726540000000000ffffffff23f33484de94cade04ae512df02a83c8d642f4bd8cb9cd6b259e5b08e2490f9f160000006a4730440220608941f06609572b249b45a196bad8589a50ba51cdc1451ff23ff9ab0dda578202205850f2bc5cdff34e3a2e871e77ad810f3a4de066f19a68766b3edac643b785dd012103603dd38ff9e41b0c97d41c25c660a9784b1f5a472ed19828075762dd3fecd91effffffff3f1e5db297c934a237de1b4ebc91ccee2c2632b9ebb28ea3499527637b1de2864800000000fffffffffb30691b3af4dfe917671f4fcd388e685fc3b1400e773060384478cf505ce43c2b00000000ffffffff9090ff5b61ae88dd0b1b8dd194cca8476fd9384ad14f2c1cc32736b1fa699584030000006a473044022017b87348f9133ce05f93df7179940022e0ccebe891f807058ae7ed5207d19a8d02201973cf9bb61c314f647f65da6fd8adca8a763b8729333c8822b94d855536d596012102b5ccf0f9bf5fcc519fba5a9f6450181e30e8b2a7e2bb4de27417a3b75abbde4dffffffffde9a4f718b3cc1741a79477e157b8d68b353c284a2fa769e12c0d0f34d87209c270000006a47304402202082c34078c9b7053c0e96aee192f6577fb69c55f94b3f4f1ab81cfbde258d4a02205e394665e86492814c3834c80d29d418483a33c6ca403085979377de0efcaa7e0121027897a2026a645f61af4727d6e451dd9b9da9e207bf87c1f7a0adf4b278cc7a2bffffffff3e8de374fd110fe098563a519ae7d17b6b94c7ea29ca65771baa43a88a99ae94090000006b48304502210090457f7c54b93cf5f58444da65173425cefb92cb3807fad7921478ad9ade22e602203cf68ba52dbe1fd8d6d914311bd7d4cf30a20e198298fa0f5d903426d341e658012103aa376076e3b68f761bc2b293d1779f8c16de8e794508367e6b0643bb754fd9caffffffff780fafa47caec710ed8b140f8ccf3d3648147177c019efad9aeb4c8b5c0ed8320100000000ffffffff043d664b58d9980dfcacb35022c84e2861239d225979e39f9fab5ab04ed69aba000000006b483045022100c3fa7ab797a1d49a64a320aa729dec7fa13ff12a390a5d8d8b9f08d47bd9579702206641d3bf315ef64729bb48e876f0ce5e4e548bf5cd997ddb2710d2e71bfa6baf01210254b2d5ce88775a0c9a5b54c32be4edf5308aaec79d3649c242bd5e6062677cddffffffff02aad921000000000017a9141e54aa54973cbb78d8b45f90737fd189768f08b0872360f69a00000000160014028cf61a8dbeea74108326ca2524a0009e9705740248304502210098c5eaafe44affdfff35722bc19ea82602caed1233b45c0c47e870387db7287c02205a2510e47920bf25961a23a449721e646c6c309658fc946ed2a13de2f1e8ceee012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583300000000000002483045022100dd3bfad5b4024505b4c38b485764a3f76a1cab1645fb8a9c92b2d5bfafca8a8e02204a087503956fd565356ef78d7abbef9b410ef2e1294b3f7031b81a805b463ebb012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100885f0d50e56c7e6f915456ea14aaaf998356c992a952abc240fd84ed6bff8803022008f002ed81df37a408c5829819efe780a33dce9db350cbfd1c8f78572f9d0842012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402202e6e11c60741902134a11857155ac431cece2f0b9c7e0bfc21ef678e1cd8f2fb022056c753ff448d7e0315495ab56950a5a9c8afa6aa83e46c80d0cde8edb7abf505012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330000000248304502210098879304962549ea3c7447fa2e0a1e36b5a6ccb4319fa6041deccd16458485d802207521b2a3e24fd1bd1a1f9cab57ba32524fe7e0771cee7077bc11e3877bdff2db012103692338fe925de0a69c427b82b92fa522647859b8ec4873a22215afeb5e6381e300000247304402206fc832956904057cd91fdbb91ffa20d6ed68723671fe677858bb1329205d821c02207fcfa57a62bed7702e83e2848b143731f0d8c1e663960bb88fa440ce619bacd3012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022034355a59ab687c721daf6607a35ff9089828dea82228d268fc73dfc4fcd5ecef0220229572fc562c2e317fa577f073fd3ee8bdf27c6456bfaf1d94bfc6e5547e7d18012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000002483045022100f016ef9b944cbe6af634cb8e3df241b09403b75e5c942d1da4a54ffab5939b1502202551e75ab3c5a31fe847361ef28b3a7399834eddace179839c1ff6b57a3f72ee012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100b489abf70f875b5168c274c8f784cc723ad8343db23870c69c14d4efc853dc910220672abfea8035b5b31a4a53dacd22f1f0bb82f65fb9a34ca0fd4823fc76d8ba18012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100bb53f28dca3717fc0c4abf0cec9d76aa59ffbc131ddd268c0e586820b157048102202ce6898e06a0292fd3a125faae0356dd2421ab4c359039c5f9f5e9c75ecc48f101210366aac659b167fbdc9f0c4e94f488cd03dea679a40a3c3be9c213d60507eef34a0000024830450221008fa400be8397a4884a7ae9c62116dc6e60a2c60400df47e176372e5969b0e108022039c8dc91e52a53ef1534024817b243162c826a2bf4749cc8e7b63722a1ece227012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b000247304402204aeb719d7e15432edf51d08519107d82642534d3a041423d3fbe84fff5a721dc022069462833d39b1623261aa043d9ca5fd372f20d32ba8e07d5718af95ad9f54575012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b0000000002483045022100f3ad6f2bad9248d4c47ce1f4e160adad98f4ff96904b3ccd9cf94dff75e766160220304a44c96fd395f7db862faf63915ea618cf6d55f55279e7c87cf0fa3f082a43012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402205975033fa8bd8d28b4f92f36fa825f73cf2ded55aa19220081bbec0a5d75d95702204c5c06053cf86237c4434705dcd0589ec84820bc47dd873938f46a2a64aeb1c5012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b02483045022100cf6bd7478cf59a5f18329376a067cb4c481c3b778695e62410484bc69a0ec2d50220768db1a5ac93a06512335c7aca07c305284eeaf5cb328eddd77d7114eba85d4c012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000000024730440220055c8b31a1c05306982a3ca46718ba680151ce61f9b500912690ee84ce35d62c022007040a1f14473a4d62c7bb2b03bb08e6a8746e27eda714f5a1251a605e6cf545012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000002473044022033907e47b9647425a45ce960847f9edb2ff2b47f7d6ced3e042290df9d47e6a80220125bb2d8a76f788d00c1dbd3e7775758b5e9bb86e278e26fe6507e0fdad59f59012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833000000000000000002483045022100b2a35e96f94049700f3f73cf7e7d555bc3eeacdebf807c856c3e20c5b726dfa1022064e2628598e03a950694a8303650307662dad1ddc0b8086b64cf9103144fcdf8012103bef16fe17dd4a650d5dc8652d30ae59b46fa5a962e87e48407458d3013165f4b02473044022047a16a075ff562da6d32258c1fa1ddeb90ffa7bbfb92291cb377032afb061f3402206ad98fcae7ea0245b2b5f74670308bc957fb65fee73da43c525ea2b9a70792b90121029052065b6fe42aa58eebc9750875f39b851228303e9abf0801aecc1d8ffa1e000247304402204323ea0d6b023c5ae25995c8352f99bfdf10166e1327edd7b6753b22464ed24502202144981368408fc9587c581745b3712395657d89e856a6b13e254e364ebdc678012103fa64b97559c507af4dc391ada8baed5a4cf84131d27173ac52dfb6118ccabc0100000002483045022100cd2072912f78d4b9a9047b8afdee8e1af9c96c9630d667e447684fe62bdd61e5022044bd0037de25ce8890238ad430dd745912647474cd6f425f93f44bdc3d52c6cd012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022019973d135e514d863874eeb89b2a7e20582927621cdb6ccd4ed716da953d12530220510309554a84c828ca701efb0b982a44dfb1b7244753a9069820bde4e3e9b1f301210326caad8ceeaa0b4079abffbdc1d3c4f43c217457d3070721dedbb875c5ec20890247304402207ba611369d2d91ecd866b796e64865d836f848af5d273274d537558473ce7c7b02200794d5d08f5ab5a79e3026dbc74186ef4951bb4497d08d6bee36452fda11a808012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100f5bde00182fd54cae95d38f8e98af6fa6e8f464489b05bdedc15769ae9e92eba022038d3ca97b2509558a8b8791271d4fed3d72995f9d7ce39146edf57a3be3c607d01210326caad8ceeaa0b4079abffbdc1d3c4f43c217457d3070721dedbb875c5ec20890002473044022020b45fdb57d835959bac06e6a1e7f339f9fe82daa9e3be54807b67bd94feaa01022017d36c9b8ffbb207dbc81f2f75ffc67b25123879a24ac73390ea4fe99d9e68bf012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100942c05727a3b189a767e83d92cab9ca0281ccc7a1ac4367b1b03df8840b17ac802206d0306ad0016c2ec1521bbc0d75616e507630659b3e6aa1f2fc3891caa00529d012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100d0574a3ae430340d9492fee914ad153daad450b430df874e863a2923215500f9022004221903983517a39ccc10b9af3d5b27e52b6baef409a167907c89d9f5313d05012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100b0061cc46dabfec08d24b31542cfc95bb920a624b817aa91f4903bd453bd70e002200d510ba3ed3ca9f57a118ef6d8a5cb3b6ecdd21a69c6edfcbd6ff381291fa2fb0121037ce301e82d52ca7348bd5a608fa3b32aa21786984a82715c0078877cad1227b1024730440220460166cd3a223067c4c5c66718f2212dcbe1ec625fa83578120bbff6cfd0121502207d6b1f30d24ca4f5f46ee037caea2ce42a9d950714ac57cdb10d6d7b001977b6012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a745833024730440220377122edce0c7b3af106b4da3ee8661d866255d7962a792b2d035bc9e07a8a9f02207cf29d16f7b82112e0802e61c72c62958982e2ed502e82ed141473387f286021012103b78187a9f1ffeb1a6039c3a6834ec362adee2b00c8242575510882207dfdfb28024830450221009dc05f33e4c422b7f024e954d9349bb78c2a7703252e8cfe28468634a30b487002206b0f01fc79fdc00f7d10d878563b3304757a4805c672e9c8b4319012e3d22dd0012102164b6c07415e4b2f1c385206316f73179e3d74ce51bbea28e6f39f832a2105fb02473044022057da8e5f1882ae7a5f6467cf5bd536abad0bb123203ce28b508be759cf8741d0022029640fc862a92cf9ba8c254453ff8a2d65321f5155cfa93ac5273f3b31ab4912012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100e17b140699913fea05fea97b33db00f6b05086abac36dae7daf66a726eda32fc02202e914f49ce8ed32e222a64601b0a67163775be338882ad03a2fbd747ae3ad968012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100b2833fcdd93cccd0b9d32a4a52dfd26b17beea085488ebc0088b516e4c1feab50220649ce8a96a29e862267c3afbb228977dd4448288fc39cfd1d1fbfc840a0cd003012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022075de05eca96f3f8e6e16f22e1d871b72566ebe172a260e9fefb45bc834a5e62102200bd6a30ff9bfbed0d09a331b0e88ef317d62347f07bf6f8d722e7da7555ac2b1012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402207a0a80ba80313e0d1397140fab19b75657f17782274d5566bac06d7dbe8ef24202203848d2c57d54bde52066210ccdd627285fe25de71216fad9d0513de1f37816f8012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330247304402206d947ceeac872fa169579dec7e782485ed58c728bc94e31410b64595dd2daea902203ef03a5b8835322dc0b62e8762901b5e0ae63f11a932096a02df829ffcfde6320121029e44a29b444bc42fba1addcd42cdf31281f4e61d3928008ea1468065d5b3c2390247304402202e3bd3e47c7dd51555c3b1cae20c240d053b2df7e81b8f6ec8fb7e8c0a3286bb02207fea3e4920e3e2436187c8c30f70605ce8c4aae8e2041aacde64a8107694d0f6012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330002483045022100995fb0771e7e5142b83b50ee6d12bfc8eac36b4c8bee9916ed1d4188da798d4f02205592a18bb9f095682d30b0d8c3a64c2a08dcec25d2968ff04caf0aa99062870e0121029f4c60a434275bee00bcbb140d44305ff0af575ac97928d327fe70eab56d7a550002483045022100d5f232ae8b45de1f58463c5549476d8ff68b5d0cfe4255c4e3013af24af851ee022073af7f8fa8ccdf97974766b59d3c218bec1478d2464f4fed88595ea3f0998cfe012102164b6c07415e4b2f1c385206316f73179e3d74ce51bbea28e6f39f832a2105fb0000000002483045022100f7ba0b815d361ba63fce8688a3b891462f06510ed833bb7b5159ed6fcf789472022013cbe3c818e8141c2874c28ec247a1dda1cc87290c3c21371a8353482f711813012103b78187a9f1ffeb1a6039c3a6834ec362adee2b00c8242575510882207dfdfb28024730440220332fba98a238fc2319b9fda8cfdba0443ffaf1033d50f4241077559fde755690022030b453be40e22135631f095fb1e44d6e5a672c3fcb6807ca1ff43cca834f9766012103e1a43046dd453540c438ae10ba2a0072ff09d64d003edb61d547202b21334916024830450221008baf78d28bfa38e647aa7f139f7cc31e3cd61d8556127033bc6b4020254d24b102204c441e13f17970518a61753ef7efb5256ccc93e1498e04dbb0926961032909c001210326caad8ceeaa0b4079abffbdc1d3c4f43c217457d3070721dedbb875c5ec2089024830450221008f33382ce7fb6535ca919f72d96b3b492a34e2baa59b976e4ac869ff31dc52db02206895fed4a9a21669cb3024c15af7a644ffd847b1f123e633ee1d9eb25df59aad012102dda68b9b4e2aaf3899704098a18d756cb930c5ec5a63327dce76d4271939ca7e02473044022016046cb1861419bf82f27260cb5e4576d680e3b7f2fb9b119cf617f1349310f00220058ea78d5ffa33ecd449ce122928d59f428f2d8b217bd52f5bbdb3f9fae51b10012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302473044022033e9be15284dd63fa8609d33e895283a5faa6db77efe3d343e5cc9855e17547a02200179c89bcd02d4469ece27261f52aeb125abaf972598fc234198726870cf0b170121033aba9c3e0130657765d27d497990a3923dcc766ebbeb875a2dfedef012993dd40247304402204b969e7606af224725ed9a9da6378c1bb82f3bb695ce06fd27aa4f53a17992df0220232f60736c7c4831810abc85edc0d5ab930376b35e88f4a79a1a10c17d7bd93d0121028801f6ce6902f1c7fc0513da2ccb6bc03088bd2afd4a89890b50bda8a1ccf254000002483045022100ee3ba29ede1aacec8c6d8bd0c3e5764689e48303e6993ae0e4766c2e466777f2022076f8b66bbd4835d0be9dbd54567cce2d10f0b407b3a6662e866265623076425f012102b3833a6a1221b8475024c47f14852605826fe94ebd65bceabab835399e27ef540002483045022100b487ef914e9f0798fd27e7ed2603acec6bca1abb834348bdfcfad3d0ccfbd81102203d26302fe70c8435c04c87302b37c008d989586f14344b262158425240faf5d9012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a74583302483045022100fd8608ee285bfce814e900d4c344c3ddad76fe9c4d426ae70d6b68fd77df6dee02203a3280df88a0deac6ce5291301902ccceb2b1a2da5a9e1dcffc37d7ec2bcf240012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330002483045022100c322711a037db1610a244a034b24382d9a8ca88978afab6b4e80c6a57f60a34a022008628d1234b90ed0b95d5179067ad4b78127ebee8774d585d8c046a8f569176b012103444c3d12c2f298ea142a20fe09b53e297d7530ea6e85f62f28b44d6d3249a56602483045022100c9cfe6cf9f742ab0cb0a06ff338b5bbd16b02845766aee602b6e14a7f70177e502200d54cff60c175b0e12b38e2e09e3235f6e3824041b5d0760457c601733ee28f0012103e05bee7e42959c001bad3e55bdfbfef31c477618ed729d274d73318a82c6a00400000002483045022100c11ec1deb876844738957e22fae2f8a7948c7df6f6b1dd5b4e96a770139bdfb402205a3d0ea458cdf4b4754b3677c22a0175af281d04a75af6b4a8d99f8a93fe6bcb012102742481948b37710839e020050cb91bac34af4ca831190d4360beb9471a7458330000000000020000000001030d8d5be601db882e0f0372df8d09f4424c77e6087d549202510d525d95341b800100000000ffffffff50f93a300088c6e1e8e939999307b919f7aeae9d0825ba968db72c169292612c0100000000ffffffff718b23f5c9fc59c6e37645a82b980404dbb0ac0639533a20b340b2523e83d1ef0100000000ffffffff027a111000000000001976a914730153d22583c6d81f07fdfc761994c80c0788e888ac7b94000000000000160014571ff8af68b11a40bd4ab4f8793cc96be95c93940247304402200bdfbc46057c614c8795647c6ee43581c3aa10f6868538b9498412bd904ef1aa0220782ae8c56a8edd8a9d82274e7c09c076380bcdf1ff94438a48b110792d82dc3f0121036b3cc9e0bb9996391a31daa1d0d916972e60483847a79bffc06bb9abebf0921302483045022100eb7097371685aef73cdb5079c308e8b7635958bebdf7094ecb79f2ce7efc2c8902207d2f2f0fdc36421355a169487115aa4f6beb37a4fbba548310f5660ed3ff9e0c01210302b200095100bd404dcb2a1d2997dee0ee314a212356e349005fefc2355f5e350247304402205fa3b5cb6be0b3ca9aa9b49754c10f21b1d9a1942966ae801963db8d5986628e022047dd556a37b40a0f049357a971933b85d430ae9cccf4792737fc7e265a360ffb0121026ff2fcf5f12283fadcd53b0de525f06bae9aed256c81b45b92985e4e2d3b279b000000000100000001c1184f713980c202ca3013781f050b511a8fc5ed56a0a8d7b5439d9aabfd946f000000006b48304502210082c2402e2cfc30f6d26ec9b77c6f01dbbabee91fcec8d4ef5968507b35e65b6502203e7f3b7e8596da255959b460ebfb21a36ec804b9b4c5cdb0f915a6c704f6b3cf0121032d1345b4be76cdbf70da93b2c5c436920070d98b290de74f4beb99f95525c59cffffffff013c041000000000001976a9143c22fe3023f18b1299c1d102bf38466ae4c356ae88ac0000000001000000000101e37cbff7edcd5bcb47e1bec965c4c3e871b4a4eb3aa9cd10db319b98c452d72c0000000000ffffffff0268d70000000000001976a914d6250ec132b28e47185ca7d3d7b115dd993a9b0688ace0fd6700000000001600144aa2d4cee585fd9189170d71297c828c8c0bef1d02483045022100d90c6b35ff98d81adbe7a69027357c38c5ecb41f944e133b55a814d24c58816802202528d80030f0a84b7f22c937cb5359e373d830962ce067a94d100e5c07dbfc27012102c769089384103c5e44361769636fe2f3d517c354a9a2285dc9d50d1ffd4fba9200000000020000000001021c24095922c9d9dc2a111655de2b31f690ee82f4184870a1f0003dbd6f52b35a0600000000ffffffffc5dba8ecb40b4af7bbec1a5017758605db824b43810ac5eac6c1bd00c96234460200000000ffffffff01c3c61000000000001976a91417e5b7b64552daa0c63e0cc3fd9f439d29e8aaa788ac02483045022100c08130db8a82e7eae8caf586516aa79108903eb3cce3990b55516bc7b73c06c8022031ff5e7637b286855b36acfe8461f0fe762a6cc220ac5638014c36144a494d65012103ddbff37e94a1a0d4695757bc8f15c4d432d2c45943e1420344c9b20481580dcb02483045022100ec2a9feebd1239b5b28b9806832afbd940ba8732b2735e3e8432849326372df302206730643faf84c7805a98631842018505e44ade06a2e1e97469e7e6f971c017c8012103ddbff37e94a1a0d4695757bc8f15c4d432d2c45943e1420344c9b20481580dcb000000000100000001ade582baeefc893410389cffaebc7c957d292532c1a0491107bf8cf0125a3f0c000000006b483045022100dd988cc39ee6da84e08116330965d92dd09db1910e897a888ce1d749884e1be902204d8858359b12015ae2d3b803eb1cb4bfd6b68982ed36ba1068f7db2438ae2537012103826ececa22c150d0abfb1c0c7c5133282b415e15a699e286891028b661bcb3fbffffffff012bbc1000000000001976a914be82ec7b99b976e5da605c14aaf7a558387dd4eb88ac00000000010000000001021ee9a86262652d095d55e01c5a08fd412562d5061530302c40f5d60f988a2e6e0100000000ffffffffef1e9fd94dd6a05dfebb34941d228ea73c39f05a1199f03d4fba81abd48e814b000000006b483045022100adaf4007877912c985e1b1eb7d467ef8536f7480b4df518c0854cd858ab5f3b402203f423b8262235fbbeae8a02e82e4fecbc862a719819972824d085184e472dcf50121036011fc192a06514b830f14543ea4247863bfa2733f42e534c6fcdf8cd0388f46ffffffff02404b4c0000000000160014bd7d18a66cd2cf18255ef3bf0852e41b1d07b3a39d70150000000000160014ddd583548cd0b2b3bf8dc24afd06c967ee9af2c102473044022028c8862a05b95d9adcd256992986ebfa1e45506f1eb25792034b6fd8a4e060df0220439861d1644bd1f5606a4687bc2cae8ce88d056537e12233133fb9e9e2d095ae0121039a43865edc5ca6ec5922f9cb06a126de6679784a379e9de4e4c909ca05139bfe00000000000100000000010133197476f184eb10510d33ac05dce1db4e4c8897a776f6b3b3433a9aecef67d73c00000000ffffffff02073100000000000017a9144d5ffd2c0d317877f6ff48c4046a0b6a6be84b1587881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d8702483045022100fb74c66688fc2bf3d086a2fb07487689e0ef62404059f9c47901a913b476092802203f2ae6868f90bc288f62169acb74b042a29534c10de637a384b6d8512f0dfa4801210337f9ddde1dc2ceceb2b0de13375334f19329901cb4cab8c19b358f7d6e03a17b0000000002000000000101051ebbacb17165d86ab2a8320e9a778747183a5adbde50866d4fc1a57c0c5b381700000000ffffffff0246a107000000000016001459b577ebe07f1293a162dc1475e64ced1f1e495f98690d00000000001976a914bff995ab3ec3a37bebd8b806dcffd64d483eb15488ac02483045022100c8aa5057fa48969e024ad9cc6c553173199abc91031c4ee33ddeb1184e767f9302206a7bf605ffaea02ffa08e1805bed681112ac654d64be8a00f26d946e3530ad540121037e0477d975fb89506fc189955a0c5b1f16774a287d7b262497518e94ceddceb20000000002000000000102aab8f2383ad1a18e0c2f1d4abc7059578183aab4bc7ee0a1bf71592ac6a080dc010000006a47304402206ad2abf70bbdb185e30df891f9934d53b99ffd656f965659b3ef964f757be42f02203f3261cad805a4991f1103c2b3b94dba1114790fc03d6e3c84b57ff915b83cc30121020a861cc0f466cc91683b9ac1f8c7b33aa04b51b0073cf09368df8c999773a285ffffffff8bd46ec06daa6d3a8778e220ca0507bf868c88435bf8ed586281785b3024ae140100000000ffffffff028d090500000000001976a91493e8a2cf3406f0f3c530327d82b254f13a77124d88ac0ed403000000000016001459b10cdaa25a287d1404365e3945d13918611a79000247304402201c8db0a0bcb2b4561e6f28f95304cc2f116a37ba57e2ab1374077b97650e5801022019ecf1718537777da381db1c7a73cdc9b2453042662d9d279dfe8457802c74ab01210279b399824c41a745ccae1932365767aa0ed211e465a3d0d029c7d3ab35dc678e000000000100000001bd50a52067034c631e7787d1f43444162d485dc1ad538f5e42041a83bf0184ad000000006b483045022100ecf39e48beec9c61217b5fd1b4b0ac5e90ddad15fc782538814267be6a332e1a022021d671235db8a921aad3a3d1024443d5548c93ec090f2c6e3b1361be09f5ad260121039c4dcd98c9182cd7b9eea47f96c3a31e464cfb37a7c6293bccfd08b4a746d359ffffffff024d9a0000000000001976a914ac3096b1b033f47dd89c120e5765f1023aaf024588ac206104000000000017a914935b875cf07f6daf1519952f7a150702f15931ad870000000001000000000101d3c889b7ec5bea96406ced757518f9b333764c01e3044f41b6040d07fc6f179c0100000017160014c26d05b0811179236d1da413115292b16161e39effffffff024e19030000000000160014ee15e5dd4827475ab67c843ea3fcd465a409df4e47724e000000000017a9144a93512fdd7e05de870fbf399a3e3c361bc57e108702483045022100f968abdbc5b06b1bb779657d33e2d82c7cdfeaf914b19e0a17013061b70dff92022013f74daa909cd29c1ad19f79bd200f00b3fa4337ffe3762776820b9f64ae7f06012103f4d04fb07ae98adb683fd0159b0a5d28ad33f17a97ba711d438cdad4b772f698000000000100000000010182a41ed1990cb274f0387500e5cc50dda9b9a1f02393dbe32190293b34b8fe88010000001716001436fe05201cb0ccee034c1c7d96be3bef5eac7740ffffffff02c89209000000000017a9143eaa99161886d5ec192aea976406dbca1b2cd98a87174a1c010000000017a91437265b59af8998316a0934cb26e8e642007ad5d78702473044022068d4b87ec77a905e4eee1143aea42fd4cae9405d195719e424478e2e30e9c3e402207537f4d3ea2e8a6dd628b60d5397c5c5c1d7ad4c1696997852ef68bcd86f0f240121021eb067b290a3633f2709be25ebcb3b8934280a4bd9a63d0ab3966985f355794b00000000010000000001011c45f31469c50c4f58e3f0f8e1bfa3c86a841d27a7793b3932b2e9c38c27fc800100000017160014314853a6ff4b366d478cc20e6a4de40a89af0ba3ffffffff0248d005000000000017a914eb29643750de5c4c67072364f556e4a18386002387b90d19000000000017a914917ab5f3d3b0bb00ea7707914ee0c989e114069287024730440220562777acbdef9d3f74b0da090b9aeddfd887948ddeac624cd76b907d68c4561802205fca1313df38c8d723ac6920a9b168f45c16e550130d2edbc00b39259e1d85870121039c669dbef65e87f254d5b838fd342f6dfb84b0daed2280e1889fc63dc3b8c1e800000000010000000001013a25abde48f45a1744daee238dd72e1cdb553bf196d5e756c6fcd3513760863f01000000171600140b9e064f46a166074860a904ea0f0217e2b7dfabffffffff0238380300000000001976a9142b2bea9bea22f4abe954655418389fbce37c80a688acf30d57000000000017a9141bbad5a1357d50349d2e8ea59d860e3610e3df348702483045022100f4ce45662f45236bb49f96c530212f55e4bfd4f966f420cee2aea5074be5a54702205df95e21769654ce8572357b167c07fad1cdb750ec4bf5efc8ce4e07c50cc5ab012103e1bb1492b53afe43bb959d42c947072ce2133e6dc016c07e7e2c36cf4b5b0bcd0000000001000000000101ea1232999548830cd5da5bf9baa957312cfb5704801dc0eb181cb527922bf5160000000000ffffffff02881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d87c22e0100000000001976a914d7bd330b0e0b732f8e4830bee7a5e5248d00f21388ac02483045022100ef16eb8cec83a57400fa7af3c4665e834fca5d19be491116596f89e2cd4cc26f02202df830fe88380ca1825ad588d9f4a796de5f20a08bb9d3ab6b823fd7470e257b0121025810f36a580f6f2c066824ae557edaa95977046d4fd778cacd72dab8527f3b4e00000000020000000001066b8459b79e7e1f5a77e9df540ed7b4cd1a239f20aac56f5ed2753d0ec61d7a4d0000000000fdffffff7c51fe81b08d181a7a10ca1c52b1184e42033689ca3b518b5d68574675ae053f0000000000fdffffff46baf451fb7d113da8607120ad51ee131490ca18cdaac4fdf19c920e85952d980100000000fdffffffdb67f38fe06b021aa866855f08db9650d2473da0c637f18116bfbd516e33c0ef0000000000fdffffffc195eafaa333d5fd98bf3f9af81a6d9e5099692d5fa9209b6b24097d3b6060110000000000fdffffff691cf2aaf327a30266aec100f694198aa88616b808f97e178bae1701c38929460000000000fdffffff03485f03000000000017a9149be0b0edc5ca96c0b6278f1a3d687cc37a2406a187485f03000000000017a9147c768d8ca794a5e9a7032b8576af5680cc03484087cc4200000000000016001475f776f349d5a9c5a56557caeca675ffed48208a02473044022008ef903e928332015ba248a4ac535907a75564ecb40267fb52025ec6c3ed88f102206929506c96f1c088c68f5d9b066240912ffcdf0a58e23ae1e72b07423ba79dbd012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c0247304402201fef638859e2f20c2f90a610fed6a04286c9219836910ec38ed803e658e906a50220751fd035a43dfbc86a2235aa51011dcd1db9f61dcf0a188a9aacec44e3a8f67c012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c024730440220532b4bb348a753caf4ea7533bc8aaaae00589ef4719e106aeb5e2d8098dfa80a02203aaea497797af0ff17769b6345a06e4055ed81bb07f8c2fd8ed70b7d742f6d55012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c02483045022100cb418977eb864beff119ae8e4dba97c0b5bc6d69b8c3bee397b0caad6a658dc202207da2fbcfe5ab19a3af63d7e4e8f3c41f9eb0652e674e567ccec043fe42e3dbb5012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c02473044022067591d5633a66c58fc97c0e19edc6032e70c54addf1ed05fba71dbbfa9d4368402205955e1d18483f14ecdc517403012a956bea5514f23ca030b5f1478976015306a012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c024730440220655d7e6666241da9274f9214b9c94c648a966768c59768f7ead3523f9e6ead2202205681c0c1dea9f4cb712af37db4d2ec6220f17cb041bd5093faf5b00e45194399012103d75608eeb4a97f9c80e45a68a7b60f5e909cac4349960ffba8ce8414908aea8c0000000001000000000102194e0bc8f9263be4fa02aa327bf6f08a4df1d4612c4af7fc8a02c91d1fe027480000000000ffffffff9e0c352fe63fe0837739f315dd7d69be64410df97f30034d1d49da979bc34bd6000000006b483045022100baf7d64fa31db4341fbb7179f696dd41696d32fa7bb1cde4cdede24b349b061b0220053badf0072635691f50ebdf1318e846fae3c31b828f9e7cfdb99d296c99b63b0121033f46d26f3dd11241fdd9e98aae66d36ab894f2bf9faa1e17bb5e1983b021f1c2ffffffff02d0460200000000001600148fc99793827d8819794211928bb058f13881a528f1ba06000000000017a9140a4583a2936a98e90abf655360ac20f8b659b36f8702473044022027d6acb9b105e5e296eef71b88b1e51d9ee87a46d403108f61d356360a0c180002201b6358d416ec0408317efda9a17a712e0db72ac49aee90f6dd442b85528cf1d701210387e5d2f6e20c79979eee6679df26ff0a4f5b6922e3caf2042c7d74602c0b3d57000000000001000000000101696ce5ac0856f551ad64dca6eb2a6dfcf06b5d0f838c8e5b2f3aa1efbf982ab40100000000fdffffff02803801000000000017a914399bcc5079e368fc17617b4f764619bbe105baad87ca20340000000000220020943a204c790fae9f2bf1ce501d3ad48487d2193c2a6af781cc6391b1522301b0040047304402207bf260b53a2930278d5289909d35e082d9cdd44845174620487287570f6fd22302207828ddb347b98711f7983090eef37e7c9429fc07e05fd5dcf5f802cb44e82d7301483045022100e2c4c144fa87b45f4fd99912fffaf4cf1772416520d0dcd0b25a0ad10f403cd1022047c64d5e6cbb477c21f3b23246dc3508a856b0504cd36b59a75b48c2622eb15f0169522102e2e1113884afc4bda3fbe2e3eea0c3629df7cdf6b81bff915eebb4c44cfa2d4f21025cc02ad10826c07c2a1dff53071829e6f1597ff89b7e0ab67a154fbed7a0b0ba21039b76a062d8ff2981a6e1ed84b69dc0c4f08b160ab834c1305433beffe13caefb53ae0000000002000000000101c25d15754817ddf70b742ca6436149f63820e3ae00e4268ba324ec41d1aea627020000001716001438718274cc26961324107c2530f8814283d34a25ffffffff02b4fd20000000000017a91474e83bbfe338614f35f74625129ce789fe7c8a1787fa1543000000000017a914b474994b43da99f91148668261254bd2d8772ed88702483045022100b57b107420af9ac86ce93c36a98bf677f65d8c7720886cc068e3f7e6b0b12bce02205815c658c7702743df0efefe2efbf43e63c5d1294bbad7cd4584ba3eb8aaf5bf012103c72793ae597493b967ce917198f883e5935843ce97b6760bb3ba4157dddd63620000000002000000000101d62b17a35004a6836b0538f1d3f5507e47282036980e243475b5ecb365788d880100000000fdffffff0101380100000000001976a9142ed444b77543024076225c20a276d9fa18984ead88ac024730440220193eb6cf7ac7bad29bfbb34e3679f23e1f704403e5c00d289b5945510623fed202202c5087303860890dfc504cbf3fdf01ee691b2d336fbe44acab099506727b3bd8012102607ad6bfc288031e35cb1eb7760412a38f2b6d8a59f7af335b3c2e74c657326e49a00a0002000000000101105d54d9b6468945560f7ff1f89415cde159d1bd8b9769248fff945cc4437d8b0000000000fdffffff0119240000000000001600144ea34a956bc90c3807f048384683194d68034ad30247304402206d354f7bf9f0805a07869ab5299990159697ff96c4d3329199caac0720a9325c0220193ebf77f0a26364d6657f50c8d949fa73e5c7be19117cff6a3df5e94f018ddf0121024d33e3667717cef410e9b7edd4dc777a2e062c9abe372de0859e4e205e2a7ab0000000000200000000010105a03b6b7f438e16ab9907c566a10624cfb033cd60b4d6604638e4f0238a575f0200000000ffffffff0105c10a000000000016001436a13cdd3e29893a95c3178d9ede1ebd4db162f402483045022100e8381483d1223b16649a8835e1ff8de1745e465673ad749f7176db4ead68e84102207967163933205977c715df5100c5611da7e40b6ede482b3435f3f0b50341d54d0121035982776380ae82cfa9310881f46b4c147a2b148894a579a2a391ec3b2000c002000000000200000000010180ee69d9c47f7366252166d3f4c494aae3eea1d6152ac2baed179c1091cdcb4f0000000000ffffffff0194450000000000001600147dc43a9fc7e0029450bb62f6e0e63c84a9a4238302473044022012b900a9bd7d328495d301d5f8ea66033e660887945468988da14d6d032268850220359c6e2a713ccd6f7d1d6b7ff572afaa7a90415fe5508bda98d3993dae994d6a0121035d8cc7c58e2beca0ac9fb1110dbda85e22d2c1edc6e473abb7d7d01558c7663600000000020000000001014b33859c30ee5dc3075342afec638e0f7da5c00f3191e61c792416f6f8a94ae80100000000fdffffff01c1bf0000000000001600142b7a181592444e3a9cbe4fcf0d34afaf924c24a702473044022066bb9a79cb31efc6ccf5d60d853682b8f75382f671c9b8d98eda3840671d0192022079aa0d11d3a76c388417ac6f893a42181f10a7fb62be5a8fcb44ff87f793f589012102adc4f92ed35be94abc84960fe10a62f60eb7e751f679a65a47c2f9742617688b00000000010000000001016cfe1c7fd8c048e2a8c18ca805d17c17ef7cf049ad33435e88105daf137565bd01000000000000000001a9731200000000001600141095cebdbfcb21492df7c6155f259b7bdc1f36700247304402207282f84c274a067136972ba7ba3dd1dad937dae6b29a1272fd91bb0bfa3a206d02204cca3316965a753899db01306b6f4af5090a0ef7a7df3c864587642b4a6305000121027c9925ba1d34ab560ecc8043486aac80da68d9aacc36904ef5b56e9e73ef130400000000010000000001036b8d09670b30128eae779e378faa878fa625b487414ea52e9287dfe88ca415a901000000000000000090f028b0b0b7615e5d8376c834d9de2657d7602c1627a9992a5e4d7bfafdd63b0000000000000000009c209a7cbe7db5bbb864b40711366c89b88ed78797877163e18ed45ff51162a8000000000000000000028eb61a00000000001600148ed99f1ed6db7da8f11bb1e730526763fd65fdb40579000000000000160014e81a4655cde6d134715718759bca4f7ab2ac7b6702483045022100fd7593cb3bca39bbb41b964943ac5ace7e51a71467d5657c0994dc49dc136bb50220511f808a1c93f8cc274c9fd9922dc8141068005eee09fd2dba37aa1c1a22bdd5012103973f5852d0a9dea4f56aa9a9d08cd24de2956942f869ee6492e897401d0f8b1f02483045022100e77b2c78acf836d25a5f88574beea078662e6a2b186d816c210671ddb65a53bb02206749c7261d516b9333903c2d6e48c037af721e3de3ad03396a0eaf1a1f2e703c012102c1cf730cffff2f36cd8d72d5214b2b2b9fa3ed6c2f565bb012362a146ce64fe30248304502210098359811ce4b1c1ccb09b9cdcc332c27fe389c8a3ac6eae1aaa544ac4d638be702201152943b8cae1efdc22999f31381f1054aa4605097b738721879bc4a5eafab50012102c1cf730cffff2f36cd8d72d5214b2b2b9fa3ed6c2f565bb012362a146ce64fe300000000020000000155d593d8270c0428e3c4fe1044d388d2b9626d91a2dcb46ced26839d95796da64f0b00006a4730440220481d9f7b8e063e5565416458fb9e242b4e347b626e3b2ed4d22adb6243e9361f022023dd432469b53b110899070ab250dd759aea4d9c90221201c3fc4b3e1c150a53012102d015515eec53d78f6b956442a5085d66c0eed5214dd4b47997e28ce24cc5196affffffff0152ce46000000000017a91497bad66868f56991d1008060bdcfff9f083bc746870000000001000000000101c64e924f583371f9c777434d1b7f010951c84d35c0a985c8661c66681c4ab54a01000000000000000002d8590000000000001976a914e9cbbb15e14253581446c99d489b89f7e2e5afbd88ac6ca6d90000000000160014ab88de626b83ca4b03084f0bd5495be91a15a9ae02483045022100f0f908c18a2d629653aba7d9284910f9df9e917c0f3512f7fd9b19a0e5aea2f902204b96b0de1b4e577e131274755759924286e14efa461cab7c16d0d71fb19f5c380121020931fe37f260eee7ee2e875889a0e2a60705119d979ec01682fafc7c01c8715300000000010000000001010d7343636c0eef7483117aa01523b5f676ac316c464a09c3f76d6fb6128d8f8a0100000017160014306090a8f9318e46fcca39bd03ff5156ea25ddcaffffffff02cf730b000000000017a9140d9b3b22d6df41e21697d7846f83ea0121c4f3e887f79401000000000017a914ca806f724012e1f66347257de04e931948a0bb138702483045022100c3b361e766e47f5d1bbd2a267ee01eb323cd8c28957dca95058c3288df476dae02202caa0ba51627aabbf30fa063120c1e17d972358cb2e69cab55f47344b16ccff20121022c25bb1c48b71a0263eb4de84b77b447fecdf26cbec2b432fedcd03a983d5fcc000000000100000001aa82dd83de64ab54de31a033e4b3eebd0af829f293ca01923e10862d64ed11ac010000006b4830450221008ee6ebfd0d9b9c2bdabcb1ca56bb628ab4a34d9cde01bfe28d5bb2429fc6d3d002203b7a0343861af42fb5114c1f8efe01ffdee4875306ee9eb40363ef9e98f6cd420121030ab53e5afb206c416b5f73e2311b9f25346dfc8e630e87a07e6b200b038ea38f0000000003220200000000000017a914558a7e0e0700463555d19c552185364e74e1c6c687389a6e05000000001976a914200a8e13b937fe899e5ae84c812d5a7905d61ab588ac0000000000000000166a146f6d6e69000000000000001f000000155ae6a39e00000000020000000001014b8f7ef22f7e10e65dd37da607e90a416a719136f31d04190c0e5e0c6b2c02dd0100000000ffffffff015e5940000000000017a914c32b0682654aaf10e1f28f77fa8e0ffba6104bed8702483045022100ca63d059b8dd39594ed111486f41326484228a4f33968608a19428dce11cbf3f02201efecea743306aafc1e0b299a9753d8fbc9626a2cd4fef1f4566447d6979b4ff01210318d9403a426c37f75d32724ef86ccc444488ef070f0d6b3f618a13a386edc6a10000000002000000000101e6c564bf6acd5eaeb747569a2b677f050b579450480790b033d8e5be5dc7a1561f00000000ffffffff0190c901000000000017a914f251d96caad272771b9066f946f6a6f1bdb7c6cb8702483045022100ca3f8b4fe52776bff08f48b78ef4e784a7d3927aa693de0d01db647b20bf3c6102202ab71f3dd28386b0924e2fc5dfe8684fd9b98e225da255cc23fb23ee852f2346012102d17310ddd524f81638efd65f0b653b87fda40cd3cb1ee27152ae209fa1f2d6a600000000020000000001012356536e8ec1d9ea7cf71bdf6be1351b343b2e843ad100aa6f289b1132a6a1015f00000000ffffffff01375c12000000000017a914e3cafc7d5896ff486181fe14313fce5bae07b75b8702473044022044ead50367b61fc3c3db0eaca31bdc232e17df725855f19b598a8331a5f763f3022067d8b1ece408c3fe88346efd66343a57f84397715c7ab5eff0073e118d086d460121031d06b08a6bdaaf4b6ae16757e9d2a33837eda44d90ecd00ff28c27a95bff889d00000000020000000001011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d41d00000000ffffffff01afc407000000000017a91434e36a7160701987f9c3c2f7ce0df675a6288617870247304402206ef9b615f6772be33c5dbd15b32147977428b6622b23d76f47616645dd0f72fb022057e54d970c85ea994870411b5abb8b36d35027df14beb676f926222d045e19c4012102503e7805067f5c4d73c85ebb42113d7d8cff87650a5d9b876c2d679894e53fa90000000002000000000102249fd3160404cd00e8ec8ca15b399f7bcff08b987cd89dcd2ff525a6cfad521f00000000171600143c5d37a5f8237a9d10faf256b1065cfb97a62dd3ffffffffd54f86b334d915d380e017d4558c2effc50f0b66bd510d25a3810a2c7e971a850000000017160014781193277ed7d8ed4ba854970a69069987a9da14feffffff03af2d2f000000000017a91401a96ba81d91b0596162afa8fca9190da17a9f79870000000000000000166a146f6d6e69000000000000001f000000174876e80022020000000000001976a91421e08903a7aaedd8d5fc9bcfcd747f12f424f5f588ac0247304402206c476dc2a1b5fea8cf0ef26042c859284b5c50c7ecec49dcf51bf20ed7147a5602203b7b6a94f1b79cdf189b05cc41e54fe02f2f73f9f64ddbf1ad79529bba6f54f4012102a847352a29bfffad4959868a2c8683d790205cabb28b585a2ecee5869d77810b0247304402206110d9918792cc3996d4dd7896bd9e4c90898dae85f43ec5fc58a2492133186f02204b16b5ffcd8e63ce14419c6307c4f620a5969fec56883a83c9779836d68f45a60121034729a10bf935db28416209f735700218d4410b6a25050918ad821edf4b98588e0000000001000000000101db744dc6be182df9e674c9001cb5f3c524e6f56f9684b736bafaf2003d3a2f8901000000171600140f5290764f6e7911340a63423a7344957a36563100000000027d63a700000000001976a914ef67d3f868f0d0a0ca3d746feb74f31a89b8595188acb645430e0000000017a91405c89bcc6e88c3ecda2a679e07baa9f0dad74fae870247304402200179677598aba11d30bc5c3665082f7a6570b365f996dc874432c368c713e5260220729f1fedb142ad2628c7f2f5f8e7e7e2e9c561e53a6d77d65904848801a2d420012102745707cb07ad05ce8355f14ea39c9407c35dfd48f086ec581fc29b353dc5cdef0000000002000000000101b118186cf2c056a94a564df348bfc625f13e8ab6daf39725e784fae41082239d5700000000ffffffff01f6b80100000000001976a914fd9f5898a2d14ab3e0cc0fca123cac5fbaa6b9e588ac02473044022031709d8b8ede5520781e724280036ff69364d2ef3a9215cb74f936c4d0f630f00220138d9cca45065dbd90d49f06644f657fd33fcd2121645e5f3f1e41d38828219f012103bd027cbfa620c0aa7211fb37410be10d6a6cc461e75f9df998258941fe6b57780000000002000000000101b1cf082e84dc2aa4074b8b4fd99992792ac055c5785e9da3be90bda2f9337cd40100000000ffffffff028cb30100000000001976a9140b04dc107ce6a9eaf824bf39d1702296acec863288ac79ba600000000000160014b82991049ba43735add9bc4a393e1468a962c8330247304402201b77f5eae0b1b7c4d05fbf2f0b2e72a38b6bb259b53d7044ea9fb2f75364d41302207ebc674f2479790f4069ebf953293e31a2179fd8d1a6b454729c8b9ae184aa1f0121029cacc77a80805ac0deafb5b14e1f51a96cf8e268e5043d2e71ce2a8835851bbe0000000002000000000101139476a1c4c523c9afb7560913b2e4cfd68a27f31dde29eeda68520659fe0ef30100000000fdffffff0338c101000000000017a914fe52ba0dcef0c13a4ff88c1fb7f3b5ac04f8422c875b325d0000000000160014c23ab75257b2ed8adc72f754231c8778a2772f0038c101000000000017a914ed04034bdd4a0abc437b5a0ed83e7889910745dd8702483045022100ae183782d7518755930d504c94b90420112d5b0ba588e0f0fe8daaeab673e6000220065b36c418c84cd68f9ebfd3d0e9e1e4c52ebaaa35b394c10c2db2c3de5e25c5012102a86420a5420add27b9f29d72b6360964f0e32ae73b0024624747d82882b04d800000000002000000000102eafd556406c3dd7cbf86c5db5f0c711a4f906af18bacb78f8ebd0d253ed5058d0000000000ffffffff03b955bf32ff32204595b275179ae34415785b587d382b74873292108934192a0000000000ffffffff010c290400000000001600144454da68001f026619047122559181ef30e1a97f0247304402200fb186c055dcdcf44373e2d865feb6229cad6ffae9ddeaaebe3b3a41c3c1f5b8022048905251276c36a8384f1cefc1afd5c513f95355a52a04da273f314c6dbeb63c012103fd6ebe5dca09b90b8319b67e8f62d025cadafb2a16d877603c6280aa70d3732f02483045022100e1bef69ac072c3cba38bb04d52376d34f9b29db65e6755a15d9a2964c52d2c9802200682c42bfa9cb63c136368ae665a2bd5228ebaded860f63081fd3edbacad4f8a012103fd6ebe5dca09b90b8319b67e8f62d025cadafb2a16d877603c6280aa70d3732f0000000002000000000102d12d41c744ec4c27a2065ed60eaaa8d210b66505ebcd39bd8402d34fab7de4a90000000000ffffffff033323d7f28d8885d9fce11e003d0fa01c1362293ce752609d5dc8d57ce479890000000000ffffffff0142f90600000000001600145e9d91a80e6d9a05903fee76f8ca6688339cbf0602483045022100a7d32ec9d96f01b74b7c8502b1b5d1f35b39be716a265e867850d7e4f134b5f4022059f9e07fb103b3002760f9f00f2a56e832154896ee17f152b6479b58bbeb17ad012102c31fb9604880e9dd63af2dff577ea2de8e530274c449de9937c45d457ec8a9d002483045022100dbb4142f342e1dea65a668c0e4804708093b5c2042acd124aa4c494aafee8bef022024312d835fe176c946afcc92b217c6786b9444b88e85c9f564ba3471da3d9ba6012102c31fb9604880e9dd63af2dff577ea2de8e530274c449de9937c45d457ec8a9d00000000002000000010a061ee3c622bde857f0789c494d07a0e639c911259211c006da1a18fa3e7fc20c0000006b483045022100d287ef9ead13e8ad720c2bc7112714e7a38294f0c5337bdceb3d6e18bb3fa258022047ca189fb997a8d570ada0d042b9ade2312417ac983c5a2d1910fa8aadeb9cf7012102c532d4fa2b53e8812441d401f3ac5baca00f5665bfeb2662b59d709826ba9f61ffffffff01eacea4030000000017a914d2dcbfbe214cdc0e72f4a850b7b8d14337b75ed987000000000100000004d3312638013a32c441492daa2b84bf792464d846f5b166908aae69228002c9b101000000fdfe0000483045022100c661836113d49fb5b0f813b6c30bae335c69789253fd7529a94bd3778aafe74b02204a837a003773dda964930343111c190ec1f882dd24e60e8beaf4969eb0571b4101483045022100d6795642cdf7996aa4a7b30a66b5859584fda1fd51910ae1eb54345a0f1124b8022036899574025359958a746d7c39b26092b424b937237e7549e8763d9af0cc20c5014c69522102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a207614821210341e772debc35023a2c5acac4fb6edc3f065d10312b12445fbe810423bb2d416c21037b79d8d6243128156b20daeb60c9a4004a7e6895257e6c5d6560ea4d1304778153aeffffffffaeab08b8c677588ff54d65092d34eb5924a7700d12a37823684061fc39adaf1701000000fc00473044022049ac37085a1541a9cbfcde794e9b4c6730682f6d119f9956d0f91f3f5eb5015a022053e394d89d354cc05ba2f1753d56a71a2fbfa9880913f3439f674121981ae02701473044022003df2e2571caa958d2e67a365e849c10e162c0df50a3705e85f03dd6b924de82022048631a6dcafbc2fe12ac30a02a7db007a00dba2768c59827aa1edfa894df6811014c695221025e5c3cac54e55f8ba216d34243424282a31169a3d3a91924b3d768464ddc13732102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a2076148212103d3f2a1bf582098c60caa9151b62b850fb616be00bcd1139caeace29b92cf0a4c53aeffffffff82df91a496127b276934e98a7aff46e57ac89aa658a7bb42e05b2b15bfd1276601000000db00483045022100cabe13106a4581379fb387ef6c37f45ae4a55a460a22731e7199842a8b862ef3022054bed235b9db5495ef94f4e01d355bb4639e149e27ba77d79ec9110a300dd6bc01483045022100c1b522b1cd50166f0e41232974784521d22e48c497df8de43963ce050fd5071702202f55d23e834188e7ac52790c4534731c62bb0f2c6d7910d3ae6b79f7aac5bdac0147522102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a2076148212103c6186c11f8c15ee1945b1f7eedf46ae1a04b83dbf2042a0dd029b9bb5409af4552aeffffffffebc87d45b7d3e6c9546b6bab99c8db3a3d7831b5e7bac26b11e27a0317a0b48f01000000fdfe0000483045022100be0e06d51cd5f26f147e2685a9dfea4ce1e07e5fc8161f1aca900160d092dc4002205d643f69895b105497cd600c4b94423acf1efcde87857fc7eb4ce58786d18cd701483045022100c3610f41091ffa6ff4da3c89891447571dd0e9a2dd0e4ef5c1f5d426c73a2cf202201388f8b5ba45b3a020b81d9b0f0e2ca38df1385107de29fdbac3b4ec67571a9b014c69522102774a4bad9fb7ac94db126bfe3d45a3c10039c31a5c384013161744a2076148212102998b012eabba38dbbee018a010507f2216de1e3a51109d188a75c0a46970782c2103a77aa57ddedb81868442311c8a11491b85ab36f30c6b1c5f25fab6a2050b66bf53aeffffffff01d2421700000000001976a91463ca39865c531fb9c6181dc2b25700750939dea888ac00000000020000000148551f2f910118ca7fa73ae2c84b6a51a4b851cdcd97d172580b31f9af0c396a010000006b483045022100e1e05ececb62aed045f6d1031427e492bf760c1cf90f7743f6587db33e6bf31502201b06a5cc28dc4c9c9c278ca5cc87392c9013451e22dc6ca12f81a6e860072550012103c27f45c17e774916918345acd46dd2a56250f11e4570978ef4080ba401fa8ccaffffffff0181badb01000000001976a914c7122668944d16065eea35047eaea204e60b373288ac0000000002000000000101d2c6d2f7eb6e8bee9b2f74bf094617845ade3366220dadfcc8650741141655e40000000000ffffffff01d3a003000000000017a914697a1b18daf37ad836a0127a5c696f48a4d67c0b8702483045022100efd6dff28b475d5822c6033f9b578784a1d1ba65407e3c08c32ab9fdc1b2ad28022009541287f87b8a5c53ae057614edec45cb3b3ed75e79fd462f9555046316b3120121037f918c7c36bfd552569d4662ddb5c0312b97d2b54c1847e888065cd93f5a0fb0000000000100000000010174944178b5f0d3a08105959f2e7e14d65c0c8ed1807a945f11b6b49279ee142301000000232200204cc6d2985a83fb8db490dee250485882fe2edef55b97565cbc079362058dfa4fffffffff0235e505000000000017a914c3d258be8addf0b29309e9b71abbb0b81f5a3b53873842ea010000000017a914507f4829a7bb236f8701338154a7e9c2855dfab3870400473044022030c67f2b84518a130fce37dffcbf8c110dfd173a4b308e25bba16cd22a88f997022055b0e690778f0fd3cceea3e9225adba2a985d53bf1837e8237d93ac636aa718b0147304402202b080558b6e8ce2662594a71efff3f05d7b4d4879c48787a6b14ec1c7b729af90220765aec47979f05919a37a441f89f4d72df6646283f6d0dd8ff5ac27a81727e7b0169522103faec88fd92a4223f83f31aec652d829c0f1c9116c29ddf2fdf046436e77765e32102812bdb6f02f1f837fd5eeaf85c290f05d79681be0b0344275cfae3f2d1947492210319acd73f39d6a120f700bc34e6757b9ad01c7a88af912e458a433ecb8860ca5d53ae49a00a0001000000000101fa82e7540f08c61e9a4e86eb0344fba559a57b69804e8509eed6cc1fd85a0bfb07000000232200209025d61df1256609d28b3078b8ca4e56df92a3856094bca1ccb53149c29fd026ffffffff3c5ac100000000000017a914c82b3ba659ca4a5bd77100243f16a17c182eb28a87bfe900000000000017a914b6b6206cf1f97c074b9d4a357119eecf5b2ccea7875d3a01000000000016001472191a761c169de1c386706a1ff55e3f887e98d4ad8a0100000000001976a9149bfe66102e0d51e91372b099610a323e12b9f62f88acd98a0100000000001976a9141f912e72e9ab095cd64025bda78301f66440635888ac3a8b010000000000160014fbcb06eaa2f1f36698e76d8e452626d77ceaa7c377db0100000000001976a9142358b648cc59c052912a8ef9aeb4bea359c4d5f888acdedb010000000000160014616de8f6d5b72f09554db890b344ca79875ae8247b850200000000001600147c4efb688eebd1fcfc87c5b2ed87ff833b6bc5e56f1e03000000000017a914bf9f5781bb6f9c1e3bcdd5cbb17f16e506ccd65887b66e0300000000001600142644b35fe089e86113a37944e1b37b0bc56f7ae8b8bf030000000000160014c63b1344a3fe93737d1f39253a64ef35df79a5827fb00400000000001976a91449d12e35249ab33eb2da3a0fffc4fb65a655939b88ac5243060000000000160014438e4fdb25bf0715ff0af4d5a41de57b3992a14552430600000000001976a914aa8f70bc5e5565a8fe8c2c51132bbbc181d86f1b88ac9544060000000000160014ad3e8a6dc5d57b4d056f2dd7e1de630f1537d505906909000000000016001429e6e3eac2ad5e65376180e7b6d20b232a0000e79069090000000000160014e305e18a0ccb3d5d6ab2ad2340b857f1f4ab75ad9669090000000000160014f4afba80b9ea4067809002ecc92352ffae12bfeb70aa0a000000000017a9145bb1feec1c9f5c951ef7338057609826970918af87ebc00e00000000001600148523bc7410ab8db53369b055b90205885c7fc7a28f130f000000000017a91440569ea7042aba1e31deb2fe7651d732ecdc34248782b20f00000000001976a91412faf61c2584729fb58821f0bb0f39634be0a22a88ac82b20f000000000017a9147ec46e769802259b7f807c993772745758b32af487848a1200000000001976a914a542675c607e722dba1cf3a3d3bede0ec3ae0d6188ace9d9120000000000160014f4afba80b9ea4067809002ecc92352ffae12bfebb7dd120000000000160014dc4cef21c3eba3ee0b994614a63ac1aa797950d68d6f14000000000017a914ac192428f877b23e12faea0414b34f13e8eb6bdd87ba1b190000000000160014aacb923110059fd421fb13650df67d00797f2eef3525190000000000160014ba71cf3b096847c044302a82ce926696b60490ee31401c0000000000160014a3b1a9d6d9e1a882d880896741c913e12d29a3c331401c000000000017a9142a51ce5c95f7b10cd46126a08c5068d74252f13887b1471c0000000000160014ee19cf96e208ab386901d3cf6b9108a4b53c9862db4a1c000000000017a914ed9ff6d2b88e3808019bfc7d359c198eefe41f2187b74c1c00000000001600148e300e422c29c50e56d63ed97e0ce338dbb91be5b74c1c000000000017a91494eab3c1169743a869e99481fd624141eafef8df8790501c000000000017a914de2e24646b66d1fa0bf1086e84f607559bcd295787c8511c000000000017a914d6d9b971db503ab19469369b3267ec623ff86aa9877c721f000000000017a914efa0966729b3941158d97e42f9a127c84fe69ae78733781f0000000000160014b31892f0300081ab7494d45f6449608f7812471e33781f0000000000160014f976a486e863ac98af59984a96dfa40548ad57dd26962200000000001976a9142fbe866dffadad6b2c9103b8fae5926f2c56ef6288ac10633700000000001976a914d383bc08874c8fe1d9fd80e213f63ce00709470e88acecbe3b00000000001600147cfeca65aa5443feded84b91437fc133a21a2ecef3e13e000000000016001412fd8c7877bb8e24467883fbc51ff1ef938fe8aa8a2c4500000000001600145d90eef5d1707ec4ba9f4a4718ec673a338cbf6a38a54e0000000000160014f5e65398a885128fbb09389bfcf663d4eb2f95b71b3d5000000000001976a9146689d5c7c8208d4ac6e8e128246d1e6ed920e39388ac09ac5100000000001976a91407641eb56f13a0172dec9d5119e38f6243946dc788acb81b5800000000001976a914550aff142c9baa27dc961dd4000bced5216b915a88ac9c315b0000000000160014235b0cd702f4e9f84ae0f19ed9e62eaa5e88a6bc9c315b000000000016001476f7d4005a2218fe3d1fc1d86e1022447ba73a12cf3b5b0000000000160014129790d81265236df881127f0efef322f3fedebe42c45c0000000000160014e19b63dbe4bcbc217cd8fe31d71c3bc87e2779f1e8336e00000000001976a914ae84318512532b31c72df9f5b697a5c6f713ea1188acd4409d00000000001976a9140750c5984abc088c0e29446490c603b3c4493bad88ac2066a000000000001976a9140e71379f6a81acbc112d57daddf7076296d7c8cb88ac9e27d00000000000160014ab01a933926c3f7c2f8ed8d96b48cfbb591f42b7b337da0000000000160014acf952ffd7ce825d938bdccb0f5f1ab926f94a90ae8d1c020000000017a9140ef9ac59bd61f571a4287b8009984c798ffc262987040047304402203a4ec3cbe5c5418d0106c4349fb907d7fa2e0cd3d84b94748294c578158fad500220789c3cd03461ea8f10b5130b1239b3725df39f1d1267711ae1c07969318a0136014730440220423b0621c8f1edb180a74a22278baabb024e953a736d069ca2e7c2f98542a3db02205c288576dc7697664e431d60c9f62ce316ec1495dc7b9788e1d62bdd5b1cec9901695221039cfc457bf3b2aefce7aa8a8fe60df9c1e167b1c93f4aa6bdb51a4430fe39f2092103bf7a9e06359310d3488695e73a81d526adbcb2d0c9f460c1fd001404faca27be2102ba5a2cc9cc394735b335360a64aaa928bce7416d8c1bef780bdf7d2be8171c9553ae49a00a0002000000000101a13a85b02bc9f7fce24295fa29651de5345e02ac920be2ece4fea58efa8d2e610800000000fdffffff01fa810200000000001976a914d6b26c97b971fc0ad2edadd89c294f1b4b54eb6e88ac024730440220629afdcc705048a735f2f2eaf5ecbb5a09d3039eaaec4291fbc8ea39e0d0148d02200e5d651e58535553074ae7be2516e98e40a9c616cc97abd4f3db462cb4e81702012102bedb4c60f83a3456d454e76e58490469e02d1dd375cc4b7a271bad2fdc9ce5090000000002000000000101224ff98ec5e4123b85af7e7a39afcdf923b0f9e91977860363661b1443ba01a10100000017160014d793802e7c682e5cf8351cef45a25b4d7d8f23b2fdffffff02100306000000000017a91424214313f6a82096abca81138e45a254fccb4d2087807e64040000000017a9144de4c42af56d2b81d1e4d8f84dcfbab93c4af3c187024730440220284b15560adf0944178d72c602864c9eec88e04e4e9d3e94d7b059be2ab006b102200adb6af1f5dbe36a80ed0efcaf7ec94d6f61ad3ed099fe9a4d76e82daff3e57b012103f64b38a38f40675be203b6fa96adfb74cc5a2519e8d2e4dd20d03066ae9ebe6149a00a0002000000036a73ecdae14607ac9e1db14f493000784e2ae584a97806555389d4e2bd6b45a3370000006a473044022061614c4f51f76190a42333bde21347069d2730f07669de395600300933b5287c0220095ee79860b7879e089e41fe1d768a35570728fc7805fa784184b6a689ebbb2f012102ee7df4fe35fb21c450fa90fd34b02d36068a441e7aca286535af804204dea43dffffffff44dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb640000006b4830450221009dd9869197f577808a0892f330a90d9ced08b5ed5144c07af3ab37b4259b402102207cdb339d53d38e3cd2fdcc515bc1b1cdc3826da0c94cc88d92117d61d0682154012102ee7df4fe35fb21c450fa90fd34b02d36068a441e7aca286535af804204dea43dffffffff71c80ab1e4a817aa843295d2179f408837871f7b94cfc1b60ec49e544957cd34570000006a473044022060d94e68ab23d430479b3c20fba3332a10e9c599ec639446c8d5a0c173c9cbcd02201240198aaac8657ab174e89b493e79bb614f60674169d276a210919576807f44012102ee7df4fe35fb21c450fa90fd34b02d36068a441e7aca286535af804204dea43dffffffff0129461200000000001600143fcb25f909e54a4da1a71c77ddec6c999c5b2e46000000000200000000010117b60fbedb1233c8ab65aa3e8d3b2f8269557218fe328fe903ed31597dd215c4010000001716001413df1b443930216b2ca29be7c1b87eb8eb64a6d9ffffffff02a54d2500000000001976a9145e613df6dfba12e0fd5bb7fe42df5ffb9118ce0e88ac2c4853020000000017a91499761888e53213ebdf135fd2d52aa9b5780505ee870247304402202514315b785533952a3ecee149468bf1ce2df84af546528d917f17c67145787802207bb12cf24ec179a2e2f3ba73e13d56a537a3b5893735d0e7053420983324536e012102a6b947d0b0a0d1461bcdf2ac28b7dfc3689dd612e73881d56745f57e47eb22b70000000001000000000101aedec521e2dc8c401b75bf3c57ac9cb8bd3a7eddcb075a3a3c73b1152b435db70000000000ffffffff020a2a0000000000002200207c7a3646cafce2526acb8323f2d04d63cb617d227b4f4ee15f9ce507c891d87def7700000000000017a91438aadfe99ca6550af7ee3143b3e4ff375a953069870400483045022100aabd7a6f79ace5d7ed7998a483fd17a9da1d86ee5af87275bea40f1115d0a6ef022061e668129a3f4f2b3859531536910e2be965e7a7f4e3436622f6f48b52c7329501483045022100c55dfc7b8f32c31f91c8c4853239ad58558c98ebc630bbf3241ed7cc4a1376d202203748bfe0e2a6d915231a8b98d7f3929e279d101bc0d06fb035f7f5ae0122c5ea0147522102a14a21022df3ba98a33fe3765cd0106ce9bab2a4c5796d76e4bc62dc0ff619f72102ea919db2ffd021e23e3a5d5acfc27832d08eee12a3e54c919bc0316bee6d1f3c52ae0000000001000000000101e84d600a4020eebc73053ff26c46b4033e02fe5a619cb20879b58f9a569304e60000000000ffffffff0294fb1c00000000002200200e86e390965df1a0c7cedc0092df5ed423d148868dd0bd43a1f40b1a03b98f0c38a92100000000001976a91466ce5222c327e42efdff5c5796658469f4821c3688ac0400473044022050951f8553ce8390461dd89e83ae13d476be444fb3956a6c6d3dbdd0c797317a02207d353d5f67a7c481afe6504a4402ad9cf3fd47865eb0ba583e761ce7bdc648270147304402207077e58dc4adf0c26a15401b9489fe8267078f79356fd1df8a7e9366e515fbe8022065706230f1f539961661c874f6231f7f2e1c8fc3779de8a721b481d7ebf61a3a0147522103bea16f58ce1dcfa4448b0fbed041031a62b55cdfff20a3cca1075fdd7d2174e42102556a18f2e8c0d26d8d65027860406427f9321dbb5631dbe5c2e527cd748c097c52ae000000000200000008bcc54e826f51d11c058cd0b9030f06fd54de1f8562c921212e24f79b95425f34160000006a473044022077af0adaa20b998cacd45473b422eb103067fb6478fa1b39a272fef0c4c4bb3802205097a06a31a22d0ac28c92448e23dc4f4e4eb611291cc141c66e6a48e6372aab01210348bdfc93c8c20d2fa8d19dc38e68776b2dfd968842ea034b99e45e1410dcef35fdffffff9c5b3310f5c0774c3dec452984a0c2c9c569a978709a2c652deea3644919673f0b0000006a47304402200b03d4cf913b3dfcf8889948c7aeec10ea5514e361109b7375704ad6f1be726c022003d6133ff0974923319e3d60990e09cef25bef8fb2af2c4984ae4ad4f5e3f6630121020c017601a08043eed7fdf4ead07c61635b2071c59257637b1fc12d53c3acaa26fdffffff11551c91473d6f527a3c2a10a35eb82e7b0f25a861fd077930cd55bdbdf55f79000000006a473044022058d01eefe8884230a7ce699e77aef18e0ba901f79165c7c776e8cb0d6c019ca1022062eb55005f4e4b8be237ed9531cb59c81f0f1895e8debb10119781cf89ecc7a10121038199b1cb3b5167d7446a8e5a18e186fb2d823e67346883106306da4181581c06fdffffffcbca00c4e6140901e69661236cb5fef23377d4a80d709c3c7992a746e9c74ea1010000006a473044022002fd3eafd3355d76b6b565a0be0ca9d26f7323a2a303293258a0b23c50eaa99c022018f21332a1a7b4c1f851098f1463698b85cdc06ac891f77c5439f37fea79e6f2012102dd0a44d692556dd2c8048f32bfb04a337faffb2ba10042d64afd2c69c5f5e35ffdffffffd82702baebd2f888fbceef3d47c1359d3be839313e236a963ef545831552aca23f0000006a4730440220193da31f05288242b30016d5dcfc3e504b7fe888badcc5b456ea5a490864f54502207a7f352bf1ceb210343210a20445e3180786cb4ca2c1769cb631a44f5bf6a31f012102546eb44920e5e6e6266629abda634031e736f39e619892fa509d33dfdc1375fafdffffffb2ac08025e692808ee0b485e16fe33573ee83c8b990d9f09060f2b88589111b0030000006a4730440220313a1f4a1257ee6847c91182389f677a201f9354e11fd8c3b2f9b6aa6f29a0b602200f09d7b7728f985fe6d6a1c84195233b508e011930c0f9050b9313bb77f1a9a1012102818ab67a700f55e120acaf406f3b93088d6015b7c0a3962cfd9c44d9f8dcdc92fdffffffcc8103e65940dc62a00eee285cbf4d9bbb09738f39e59091c595ecc3a0e2bbb5160000006a473044022062be779ea75092b81380588e52b3429e2f323b5d53cb62d8a88164b06550bf5d02203691f82f337c60ccf025fdbdd5612e2005a50f0ec493b5bc86ae62f479e47a29012103f06c6ea94ab66e4cf82e4a6386462022cf20ed648aa7e8dc86f770d20a92639bfdffffffb83c92be85ab9b6c72e70f78924a30664848f97679e53498b3f6231abcbe28c1190000006a47304402204ef2208e201d959b57808ee0da9e10ca4c546b7a2782cc3b5fce7e582cee40980220159fccc58aa6a42671a5ca1f22251725462e44b329777a0f523794ba7655040f0121022a3c52761b11e014ec1c38869a87b8e38d00b7bbc559c5cb57574f8dd08c89cafdffffff0104f30c000000000017a91439c9a0846e645871eb0eb36b88b4d7de651a7af68749a00a0001000000000101ba04fd3dac0459cf18f666fe4db8563ac5a90cec2044aa2ef303253a5f22fe640000000000ffffffff024ba8030000000000220020cd8aacb336d085cb7ee6f9b4a27af4843097dab2a8e361240aa5a19dcf68989c476c0800000000001976a914d29617d557571a428fd962f4d2f290b4f343400b88ac0400483045022100f96e2f18cbc3e359829cfce18eec1afb3f708f98015d191822d30b8bc18f56da02200e4762c9d4336d6b17d5548863b055757ad39472f41d72c48b6e0bdc3268d5e90147304402201dccda648775f08329248c35852badf92e5f073f44500c30bc4f5b09dce5de3802203ba019ba7a4b8648fa35c10fd847a44f8b91bbb98a639c37a7b74f053a2ba26301475221032458a698932d143309922716c1951a32a6213e596187d246af3d9183af12c1e521024840a8be69770a2de44607becc2c0a79f22a6b5adc39530d1fbce285aa6368ce52ae00000000020000000001018caf289a7e5dc94966d89620441e41767ba665ccaa629fcba8ed0cc750fcc2851400000000ffffffff0111dc54000000000017a91488680cc4faace8dba4989500a12c019ad797cdbb870247304402206d3952ba1e9af7bd3e023a0a9d1879c704ca8facb2e043113892b9bca9f82d670220785062ef8b498e2cbce6cba2b63a25e3f2508c278f9c8f048b69c8e5fb40257a012102c470fcf3d7d3f6cbbbd0b71d184c0e8cc3ba500822c65906441ebbcaedd8ad300000000001000000012368065e4f6c72bbb43c566d86b8bbe1be22fe719ee920b8a5b360fb59ff42de010000006b483045022100d4d12b1368adde4c11dd5e226ec538b6ac17db45a9240af5d7b5284068f751a2022068a09ea42e65577a9f3908692adb8200bb7ea3656e712281203e6455d631a74101210288289b9071832a5f617a3684ef91ca9ccbf8a81d91911173faec10d121104aabffffffff020000000000000000306a2eee7c2aaab65714c23c01d481af80f037682c1873a059cc07bcd9a9159d4d87464c174121f835d8b4239e2429abb712997300000000001976a914cfafd8852f7fe1ecad6efef2577b34273c73459488ac0000000002000000000103676a6c627fa822f0e2fd513e00aaac5ee06fbf465d09d1a782e723fcdf8b61f44700000000ffffffffcf64712629086f2304ab64a69fa19a4671b982379dac599ad6db2dbee40b64090100000000ffffffff28beb268b90fa342ef126e61a8b04be4311034fc08530211ab6a82a5e62cdec70100000000ffffffff0297c900000000000017a914505c5a94c1aecdc4d18171c9ce81e3f131f4d6738709fb00000000000016001419a8869f1e0f439d7d00bc9386d74003ef65be8e0247304402203f0dc30b7fd6c3109e029c8391a6eeb00d3422d5a06e7a10602e5e3789304a230220034c5ddf0b6981634a8c1193ed01b898118ee359e6106e559cb04724b9cab943012102536d0946c583dbc2cb16b66a6c2704c53eb1ba1028bdf30533eaccad8d67029a02483045022100ba9c82990cd9c18912c61fc44716c04e9ef523a5ec46669988452176252f0a850220232f94c8a375042eadd914f8895ddf6d7bda1ad59cc7edeb599a6b3e042e335b012102a3787facb9eb57b3962583fbd5519b5cc544a3c78cd8477b432b61bc358b2672024730440220252ae9ed5398198f61e364c87f592c7546010ccd47ea3a9fdd0c3327e490034c022078df7c2227e26a7be45d0735e371f345aa1ba33256011a2c523b34de3207daee01210359f7596f9503380ed9472a346917f6ee34ea227142491c28650364526ccf40c10000000002000000000103e94fc5a3a5d2671be16f26823bf77a6a6f0d26123c39346652a9d993fb713ce9000000006a473044022064ec8db1c924d9153097820ea018fe69e05f75b6a4b2bf7f95e67dd5b104397302202c906516e61c9b9dfd2614c4576454998cdbf32d15f51056236dc1bde71db491012103f70ee650234ec5f25466bf4281efb7c7d8bd56be52989fad45a79283ee8a5c5affffffff7d9f2955fcb8e81b26e6970e877ffe721d222e80e1c6b178d3c01cf6463343390100000000ffffffff9105a548124b3be3263d84ea3c556f3e28b2ca5f52f1e54b883a5a394e8ec02a000000006a473044022041d170da9fccdd3277a2c0f99df055f389416ccc58496459ade8ffdf5f568b9a0220372b6413873a35c829a0a8ef9453b15a8ff6220bdd9992115e9204bc220c1e8c012103f70ee650234ec5f25466bf4281efb7c7d8bd56be52989fad45a79283ee8a5c5affffffff026850020000000000160014ad8f6cb5f6efa1d62863c13c882a2a8f5f0a3eea8a17000000000000160014826d34b34ef71b235487ae0bda63023f85cc08430002473044022079005814d65fb2f3625b4bbf71e31d3f5039fb19bb4f8211657778b0988cd64a0220485c2aa5ddd28a50548363a95380cb97b991fa52f334cc93ceed21f3d1f22b51012103b5058a7ed66bcfd6012831f999f0f74f79ac91cfb0efee2bd749b5f399a22ef400000000000200000000010264fa4355d694ee660ebaf6b18a236701d5a173f1c77c896b6fb243dae0d204350000000000ffffffff3ede36fdcbe075a22ebcbb529f5234ce920889984c3f774fd4302567cd15e68e0200000000ffffffff0217b70b00000000001976a914ffc21e31105ed36c799d4ab774455254a58561fd88ac9148000000000000160014af213e3be2594edad9de07fb36b5c00b27e3195f0247304402205e585d33a09d0339911e2cec07db4c8a54c1a65892aa9389cd5c11a67c31086f02202619f711aec1007c004868a85efbe50a9e62299243e196aa04d165e17619e004012102d1a67c1f335bcb75c9f04912ecc2bdf65e5f2fdd06e3d18690588df085281ba70247304402203b9238d54304dde6f39cc669e80da3097066ef5420fe5918584c5224cbcea6f1022035c62bbbc58d5393f703c56ac462d3b8a67d1fd2f7443c40f8e5c0e64545bbd2012102d1a67c1f335bcb75c9f04912ecc2bdf65e5f2fdd06e3d18690588df085281ba70000000001000000000101030c9206a11d89067b924992e26cce491adb43e30219d4c7064ba23f0fd49ee1030000001716001496859e49bdef19e9f4c285e4f19cbab2257a146bffffffff01841d22000000000017a91498a327a548ef3264ee185ef46861685c653b7b8e870247304402207e45c5eefae135cc108e06ba9fe8d78d6b562beb0b2e86f6012863ccce69dc9e0220547d34a0b1dc1f0e0da397f00e17c7d035c5076ea50715cb7c2d2c0059c69d500121025a3b9636fd04b2e69a632a4a25a2d628769329a76fdec4142547635a76b0d7c00000000002000000000102eded8cd14f6fb3b4b60b161b12432db0b1a8667fa0855e56cfa9bb2b652075730200000000ffffffff123f5aae62ca02182a2e9f9fe879a6d8fadc5fa0b0f1876ac56fe2416bb7d0410000000000ffffffff02985d04000000000017a914dc5e95444662c7ff603271fe7be9d08a88d3739087f8b5030000000000160014ffaa70fd638d862237ee0d99c69ff9101195281f02473044022043f095d7af649709cbda4fe30569fa38e40a2ac01cf3aff7c14e1513e965cb4a022026392c38c625b640c52787023fbfe7a4f2071460345eb1c59241db7ed5c552400121021fdd93d0104133758bb9649691a2af96d99bed138d0d0307d351e7135c77c62d0247304402205aa071405efecda363472a451a01777bb3a69a931ea4be5cc2bbcc5bdabc1a0102206d16db531e2690e3e89829ea2aa6654fa2ed2e56d8daf8d4775e15bc46194d530121021fdd93d0104133758bb9649691a2af96d99bed138d0d0307d351e7135c77c62d00000000020000000185bacb0435a7ca2cb9dd4110e80759b5f6f4b44ae3de790073d54034bbc3bfc8000000006a473044022050eead43a22c3eaceb138f96a240e46477a22d80ea3782a1a29f592ce7888957022059854cda42a12c8d3324e6c44a3e4886d07113bd86e7ad169f85fdfbf96031f9012103bf800b9ebd341a11792123b6d82dc78fed1ed5213c85b03cac3cc73314b643fafdffffff02f89503000000000016001469aeb0473ee2a9b610c0aec30ba6de51ac14cdb8b48c0500000000001976a914cdde2e11a0f4368460c59d81bd1cd729641c7e3288ac49a00a00020000000190126b06283dd90eccf52c85296083b37c4459f544d4de15bbf290b53fa293b0030000006a47304402205f6e5502631237eff94584c9479d8f7043312b9bdf1138b21b7847a678efd2120220028b9b35641635a364d52fe4d5977eece914a2e074d9a4d9771f2d50e3bcd08b0121037456e06b37ad2057a3756a59bc59157487ec56bcccadb182798d79d7df12793efdffffff062067000000000000160014bf143c8a619a435c00127c58785be699b2e48c0c20670000000000001976a91471ba1088597bd4ba506deb8f322d22d862aaeca188ac247700000000000017a91421599a78320dcb77ccac6ba4a50b4bf44a73d39887d47b00000000000017a914f4bc154c37ade047b6c46393d4cd104fe3f4e027877cdd00000000000017a9140eba954f311ecea673c6b135ce8260a2b84c993987347a0600000000001976a914626923fa6c0cafca107130077bbcf289983e3dd388ac49a00a0002000000000102139a860c5950fc0ad47af8b913a05a4bc00b8eaaaba08769431b8fce372184dd000000006a473044022025c49cdb0b518489008704e333865f85b62064f353f7006efd72d53637955073022041780dca4ab889de963a510e5067f16cde3b837eeec0f5226a0f044048cc059601210280f79ae92557fdb31d8358bc919f7a1718c72562d1506ab52e1159507ba78667ffffffff586e3474f3ce01940b8f0f654365a0245d499a240201ab92406d98dfbecb7c380100000000ffffffff0226d70200000000001600140e062c68d05f7495296d6b5e7b53e11842f68384490c0500000000001600141e50230a1d3c6c6546f75a36108248ba25de8d1d0002483045022100aa9b9f0518f44c1e979df480e6240e56d9eb44e5eabede264065bd9ef6ac4f3902206123c2316c5b202b512b678627fc2d56fce3175a14cb60ab8caafef6a593e0e801210289fad1df93dfe48efb723b610d93c946a4c10a73e134bc39fd36cca86e7b6e790000000002000000000102988c7473ba3e295e942ecf607ae9a6a10a7a734f4d87fb33a89818bcbf852ce90100000000fdffffffcba3c16faf2902ce7f035fdf1375a1a435cf312383293577c95fb95bb7df66f6080000006a47304402207f80c73c739391a23b5c9444a492c2c646dd73d870ec487ec45cc0dfc66fda860220209f1f98c8cd563d680e4f0e47e4b482d216e1431304a4fbfaf69e7f832eae5b01210239f34649b47ca3c79003ab75791925dcac08832cfb27c0bee736e641e9b20fc7fdffffff02a7430a00000000001976a9145cc3d9ae6b6c8b2caec237243dea5b8b163e18f988ac124c010000000000160014923567a761d1c9f52469c8ce558adb01492c34e402473044022067796006128a69f0dc46fe9d806fad742ff3b52af36bdc9a0a35fed4d8b54e8202205c98ed714625c949e32807ce59bf8f623ed3ddc4dc893e858e058d281587dbab012103ffb39bb0b9148b3ff6c40949e33d8731fa78e20cd9521c7b7aa0d4da2d23eaa30000000000010000000001015ffde0cd9d507ea91e62ed88ca442a3a176b5e14c24f20012d4dc1194f93993206000000171600143e3bb1c7c11c639fd516c3de10842314720a8dc2ffffffff0117e10700000000001976a914512cfed99ed6c5addc11e5e830f14bc99dc3426388ac02473044022077a034d8648b8dba8dec26211a893fbbc73b335b0729fb7a12443a11853931a30220394bdfe598b6cfbe434844514309c8373e5c8aeb54172ea5ff6930f3d282cbce012102ca1223cf5d3f27528e86db38611f312dad222124e07107eace40c59df1b6f7340000000002000000000106b42e0de6ae6fca060f8e61164fbeef13f9ec24d64ffd76d9238d176ade62831a020000006b483045022100859ba6cd1231404e1b5a2e1834223e843abf48fc981336f87040f64a1b5de16d022050dbf9ca7214f18992ce578a52d433a826e82d2364832b29528eb382d7a801db012103c194d54b4163f72972b8fc50d144ed4df7e1f97efe8bb69a376dc63ea351f501ffffffffca6123570130e76df636e7740093f10a0576cf422801ebba366a230d1b75a9b10700000000ffffffffa6c5df6f8044298c472604ac858cf388acd3b47282c02d409fd0c62802e0fabe0b00000000ffffffff2e2d6b294c1593afbb671393316aa83b3a59eee4d844e39c269d67f0812743b20800000000ffffffff14be088223fc6cf4c82002f29b42df4c913b454e3ee3dd05d2ab643598093f6e0000000000ffffffffb19a3305baf74e661652684b07add34427057ac58b181a3ce167d15ba04c5df90500000000ffffffff020d14120000000000160014162cc388cafbb62fe7e9c10f375d0b2c524d07a6a0c69d00000000001976a9145d52ab3ef600c0141a4b6f466d5e12bd886f775888ac0002473044022001d5d3732dc11a0a92820f570bdbf034d72aaa7e039c3068c7f71efb0510103f022070b30b25fe72a8e23d8055bf73d96be0ed70bd48c753777e9b0a87cda70febd0012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f02483045022100f23d5a84835f86a32165431e7e1416d2e2015a9e02003183a4d1749e9f7c554d022016bc898c5a50c425cf2f394aed0af19b00925cb8cf858c013d38c19d7a58e550012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f0248304502210084113c13764dd902a5846183de63067e2c43cd58ff04e4e9623dfef7de6e92d202205982ab9aabdef4c5aecb9e819b3a191ac7596581e7461e62f006feef7b4bb813012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f024730440220723c2f62c731c3867981259c6ffa82f921c7eb359c4ce02c95b6e955f373871102201aff1b61c6460d418357377e6af9c92b3e51a666edd7aa4a63a9265b69b503fe012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f02483045022100f99169e17b1bef6ebea1d56a565ce6f09bee9f023890140aa6b60738ed2f0576022031b08de3d39157710991edfc9dcb0e4a6102988d88a405898a0c8cb3bc4fc333012103eb5caac1bcee0bb0db7a16e75e7cdb8613d107bf6929ac46eb7ef09f5f79d13f00000000020000000001018d110daa5560c05af4e8d1471441b45be9e1cd4f3f00cb4875c7fe1d120d683b0000000000ffffffff025df42e01000000001600146013978472755c576f7485dd5ed3f5fab7bf2f4753e91c00000000001600142dc0418832de9e31f9c9c394512bec093acff17702483045022100d5ca94a38f9bd04cdb88ab60409cbfe405ec5aadafe66fe6273f3f4bc94d514a0220032f5c12014a5febd20a4c55ec7b79635d05f5fe4b0c11f9ebb0892541ec6b4e012103e74c50cae0ecb787f34b23080e9344baaa4a80f3c0e56ed04cba74d01e0efb2d0000000002000000000101c3deed34f1634821b0fec482132ebbe6d1f361cf11f6d6b2ce4ecbff23f039e60100000000ffffffff0251c52d0000000000160014abc84d64ed31c68a61a8d7f2810fb1924d01f7400d520000000000001600148b1657b86693a55423448c723e08db751aed734a0247304402201792ca572854226f7f5008dabf56eaf65e2a8479183f27c2c6a520cda62a5d460220719b270cc1ba18d6fd5391fce9a689183f3a4f3396715456d0e539a31750c568012103473e7838a26478e6e249b3c5bd76a47f29b8e584e9db544eafc2146188c430ea0000000002000000000101ef8bde0c7c9eba42caf4dd584e6e3f4c893b8b5f74952124dd4a0df695a0b6350000000000ffffffff02548101000000000016001442d58a51b7c3e3a8cd9c398ccf31d106a53f5f122d81000000000000160014cf7ea84d50a37d1cb9c7236a0c4ce3b3974b471202483045022100d4331df9b67581796b0522ae69e3460481efebf36a2bd282d5880069b750ff9502204461a36b0f821161738a5c044b152bcdd0ed4503c2dbcf4daf26423dd4011a04012102d3c3ab8a1f9eb5c590537ee812994a0d0c5da7260a3b048302b6e985c37a51a3000000000200000000010128ecc948bb63fe0b25f04fbd8c2c54bc505c4ee2ac9e2bfbe440b1ae59ceb7200000000000ffffffff0260fecd0000000000160014820e9850125b7a3a94d4a1478a17380f68fb46fd59423e0300000000160014b49185c05e3df313d60b27590a7632ca391b38430247304402202689a8967eca400b62410e8d2497cc76a771bca32f45ff9ad13fbada7c3dcc4a02203e15cb3f5ee95809aa6e19c2a8885968003de40e051a19300a9165bbd40978710121038690f5ccd79a6a21f1652dc918924a2c014a944c27d7b0da6be4ed453819abe2000000000200000000010124e4f43962b72e632dbff2d87ce3ddef9a97de09da85566e2b533f65631267a80100000000ffffffff02a29a000000000000160014fd95e56aa375f7a36518d5207cb0ebb3ae269bfbc3ae010000000000160014bcbf1a09346f46b8a09f34590c7701ee9e383d920247304402202d49a54cf978f21b37b922f70b3e0251a411353a1003cd1ad011848bb6cfcb9102206ce907c4418dd9bc4683a0e38b65dc5dd1b4be573dcf1f030f0524dab2c3060f0121021ff52f324c04ccdc1b92b38007eaf92b82e97096a91acdecbc460b68f8ed2c5d0000000002000000000101fb83479efd45d5bf438b8660e5fd227b698edc41dfc55293706c774d096a267c0100000000ffffffff02c5da3e0100000000160014da806be77ec12aad8ce738c811517d631756dfd459d5100000000000160014780359a6566c8a4ce0fd03dd5d140543352dff3f02473044022028ac5bf0a09c7316a3a24f035bc4be8de023244ea2974f77c514c8d5dc076fc90220263afef2ff89c3a8087ee77509cf208d8698f749f90575affde0e72ebea5d4ae01210234eb13517d627deb37811769a14fa4118502d03b03be6240f5ff0fc25178ff2c0000000002000000000101d670ca3bb631d8ed2383276a2bf18373806976636c8385c6c54d501d181109ac0000000000ffffffff02162b0000000000001976a914f9ba029f846962298b7e0eed224104e3e1481a5988ac1be30700000000001600142dd8a52f03e7b951c5bf61ab78befa5d2128cbc702473044022011a5a378bfae7685e665d1b0bce25f2bae70c844286c8584765a080f9588623302206ac1e7321351cc25bae5f46139888e76caf89cc1906c2c1d27befafde8c6b81b0121029215442e042def2ac7fbc01b77ccd788611e894f70d97f42bc5a2b05b5fde9170000000002000000000101cbc63f0903fea567f2d64db6574f974ef2949c09f51511ce97f91047a4dd15000000000000ffffffff0289060c00000000001976a914732cf229d3dc3b9b8a0803ffc07d4e364e54aba388ac71d401000000000016001479f9e222935cb56131e9f634239a90f5788d0dd70248304502210080be028c2afc68c5b8c99f5f65c85d4ddea91a65ebe94c048ef37a96f6c36d3902202ae9b9c07c09cc26c56b155be2850926523fa391b64426e474e071137cb9275c01210354207a8a8f1d617bee21b9c6374f74912dd18e26f458b3873f2fa1dc4eaaa08500000000020000000001023c7f242d634c1ebfd43a9028e3f5c7a77d8f001ff6620e1f22f2d0402a49ce110000000000ffffffffad28a959cef70b7995e3918040658932bc9f4772b3af30d93f36687e4e19d0230100000000ffffffff02bb2d050000000000160014cb5e9ba4f38f70a676e57290653fd54f2b6e0cda46f80100000000001976a914d8754315b3409e3fecbb35712d4d9285d52ae5c788ac0247304402203fdc88f2feef372b152f6473fcde3515b89d6ebedc9a3af8cd9546d0a560275a02203decad4067db79ebe496f891882d1ac7ec0de8597edda5d9f058d0e024c38869012102375148066b9fa54cc138c07e0e0708a7cf09fbe7b82027f104799928d7fad57702483045022100dc902b81f2865457be786178bc2ac7b49e5748199d645459ec951ef13430edb8022042a740f23836ef7340d1c17d1663b98e64631c219bcf8317894a280ef90c9557012103b8785099601aac55c829eb1cfabc9e89d6955b377fb8e414160b76d3d857d18c00000000020000000001029204d3995e8708a2545e0d8a256da2c0b13d23c3559e09f5747b9152131f93830000000000ffffffff5b4f1ab1afdc4caca1d032e8d7b5a2b0315e680f0a6eab6d7c17cea78c1a31090000000000ffffffff02a5ad2b000000000016001414d5600816961393e945320f08dc691b2f2ca6c0f3760d00000000001976a914f5f9d1fba85ca7cd8ec1e20abc4e90aeab41a80f88ac02483045022100a4f6b363a536d1aec21e5e79c0ed81dcaa26043cf5e8dff44ba6acd8c044e1d6022016f9ba57201f959f2c6018026543b72cc9e2413201939e09149f4ebc0c0e11840121038f8fb3ddc1fede9b33fcf5832d70f5a153fe573d4e64d7573ea6b79371d8535a02483045022100be1478c168167a43796765d7d8dc244ab985ee382eb48b29d3cd2b40a3ed199702200e50e8dcf6fd9ec2fe5e35c1fe95f546963aff42f54cd464d372a81194a0db6a01210358f32db71438578c2dd2eb50c4dd65e1769bf54b0909e8b720c9ba85bbcfe7210000000002000000000102418aab81f5413f5583de2afafcaae169204676c7d64a0bcd8dfa5816e90a9cec0000000000fdffffff33cc20e8590d5584fa1297b81e2e9abad462fc417b435da43606b7e83a59320d0000000000fdffffff0256c3300000000000160014a3d588e0489422281f549ff155fc947f2ee98c81b3410900000000001976a9141cb6be2d300aea8ca144461245d849645b2a451f88ac0247304402204a8626f3565219c0903471f8f19faef4546c5415c790582fdcfd9a569c8a134a0220356979dbf81444d1cdf1a50c455eca3cb54fed138e431b4f6fa0172941e77d4a0121024b49baf545313869b2b778634891b0667f5260b9decadfa21ed92dfd34ccc58902483045022100d14ed966bdef681161819d7f11e44408e94584a4a7482acb89ad3a9098affd1b022059e99c22895ee125a7bdd7e253d226ecb407c980b77d4a91fee2cab96f892f19012103ec9164d5f4b41df3e29c1f6b8744417345c8608f9d1fc803204ff199887d4245000000000200000001e0f14f6f94e6c2cb0535d11ef486132fc6908bd90cefd7619030ac0af835e350000000006b48304502210095d1413897f0864875df69018d975481fa1afe44fe80c7835b90f8e155ec0c7902204b81055643b68ee41a220e727ac381058b964b0df8061f23eab3ea3e243474300121037bb2953b20bfafab60165f412ea330f64795370a44839190cc84ea537660a3f6ffffffff026c3214000000000017a914254f745eb36c64ebd3f8a463b78343a95e9a745a87773e0300000000001600146c6c8a2e9417b9c6b6be417fbe2fd2ef547c60490000000002000000000102847ac870feb835b95a306563744af1d5c78afd6b71d65a7322ab7576b0b5a85c060000006b483045022100af5fd4615ce7e4003d944fb4be69ae3a2f0222b066565131d1ee0e87d5884362022053a2c8623c6c9844fff067548f9dfa1e5da54b7be0d48df7df27f45208de6d8e01210231228f9c4f48a7e3c3c873b89ed746ed8e104fbb3b7d1e80c8ce4b548c0ebb99fdffffff9582ddde70c4de6485d49b0062716ebcb83759cc70726893655e00a0a21595af0000000000fdffffff025a9b00010000000016001415970205eb8bd576e10be2a66aa03bfd8d104440d3be69010000000016001424fc17111e5d4ea7e0871b05fc76de3bfba7f625000247304402206057990b9d75c5f952738c5cf233cd7ceac9836dc5f7737cb7ad0674ba7a527c02205f4515d4557e2f772b16689a86cfd0224ab98405f219b884a53af2ebfb19cfe401210271b6edff401a1d31d04404a4f1f2d0712dfb49c6d976698dca7fa02c0901eb53000000000200000001d3d78b18180a84eeaef17183fe83a61f203a8012ac5a776776a08412c9cbe1d4000000006b48304502210097cc7b385d5e76474b38972693c4b210eab34b48334774502b7f46233bdf9fb002206a7cd97146ef06fc1e3dd76df48ffab22f3e95110e1ea1141ca89475902f425501210305acdd7614c0b32e3c62526a6d4d366f7485112b2fd631319e16e527efd8aa52fdffffff0240f15a000000000017a9141e1c22826d8da433b9a900b680a5568a02bc570b87f717000000000000160014ec824a97db013fdbfc235e3580da6eefef81a1ab0000000002000000000102ccdd693502b4f24ffbdf189ae2d4cc270e2b819bb4d7a87fee4b755e628a02890000000000ffffffff1cb9efb3b94c6869e42e47686880daed5763993d10e6ffebb0cf9669852633f71300000000ffffffff02f59603000000000017a914a6134017ae547edd6ed376d193b70a7a2d1dcea08733070500000000001600141da53663e51362b537abbd6280479b3d99f68a0202483045022100c493afd9af283a0df09a08b95c66a7073722d47a1c72d9b6d7ffda26ce695fe902206fecaa2b7f29dde073bb682e4e50577a5ae278c7e75e756a3d713759e0044de00121037aecfd92d349c85768fe285e3f04797a7f299ecd8baaf9da7e6d7cf8485292280247304402206a46ba9f95349d67036b98abe4f2221af25f645353d7e7a841b0854b7babaad20220018fbf7e4f9e6ad07f4b4ba8c17521825c1201eb11068a44a86273a7fea9697b0121037aecfd92d349c85768fe285e3f04797a7f299ecd8baaf9da7e6d7cf84852922800000000020000000001029966e36b28a3bb05e174fa0877dc9eeb346fe9ebece93a229bbe79de390bc4670100000000ffffffff67dcd5e6b630ae93842813e203532782515653dd1d3f59970396beaf790ba8410100000000ffffffff0213fb480000000000160014c18004ab172fa0b83862c32535013073f51aecb7441707000000000017a9142bac30268f2ffc41f39ff565e683fc61d247e846870247304402202e54e79a4d8151f376a93dbc714a74e02b292ea139597065d975beab46d3cc8d022079c5e48657b4c1199b7b2924ce3565370388ca1c75f76817657e73224720ccbe01210248cffdef2f6c838c16ca7ed4d02e75dbdd3d76e8f3933ba45f7ff54b6565d85c02483045022100aea5923a52f19e09c6d53e36b4aec3aff5a1b5370e326e9460c658c86a4034af02202d3202575fb647203ab82ccd42897c1ee575fa702b568b13e6c74714f872ed0801210248cffdef2f6c838c16ca7ed4d02e75dbdd3d76e8f3933ba45f7ff54b6565d85c000000000200000002db4c5ada8524786cfdb339dbac4dac441b663595d27251fbed7cb07332ad901c220000006b4830450221008174fd067808c6cee38bead335b5c223e1c2016abac6c4a69768c95723ee4d8e022021a0caa072d880c40db0b0af287c89535204d71e6813fe8b77094e622d9512060121034d5611c3e80beebd9b639ec26c084d30c5ac7bcd6a62fa8425809f1795150f25ffffffffcbb329383e601f5730d18d63f8221f48b14e7ae010c34f683a2cf06e6694745b210000006b483045022100b1bbb13090ac414643315d6e67e41305d03cb64d38d7d9b922717ac465cd70fd02201dea0f6b29202de5b40b0375e09ef3b37035eed78a5c802d73ebdbe1957846450121034d5611c3e80beebd9b639ec26c084d30c5ac7bcd6a62fa8425809f1795150f25ffffffff026fe70c000000000017a9147c963e4296d902138a07ff648d3386b52976d95f87a65d030000000000160014a6459452023cbffc9838d2f5003bf5594975d732000000000200000000010144dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb0300000000ffffffff02e85c00000000000017a914a9fc48103aaa00496467514339271e40dfa287ad875462000000000000160014c802d6e3888d4179ffb0a6af6ffbd6d5fb3ec09c02483045022100aef24a7a6b44012bb4fdc7d99d5e09c1302c27878f0b096a21f82376dd19370c02207d208ef9533ce0e5c308b3f718201e10d978e8e8d46442baa07519fad143996f012102605155f6a65cd3fe5acb3803c2901482c500ec09bae0dc837b233e07ce3e22450000000002000000000101cca81ccfaeb9d828c7d662d077d9dc1137db79297f33e7da099859d1843457ab0000000000ffffffff02d8d1010000000000160014553d62a9acafb81abc492e2bd58fad0a00667d8436190a000000000017a91467518ba51c830a83c8bab60b260dcce8deb678ce8702483045022100df7eec10e5bfc98adad79be740acdf8b4f1a5a69a8c1db7865cf7b3b2af0977402204c03f0972405b1a163bc50e4ef152a3af5252c05166d73de72cc5bbddc939649012102e4a0d9d3170c27adee29412dd92d6428cca8f646e5c921c35819eb4d759208340000000002000000000101f02402c5ae0835f0a22e20b211ad1f3c97975b11450e1ad920412437799da7bc0100000000ffffffff026c7a08000000000016001430c327f3710aa3ef495773269accebc8671e26e324ed00000000000017a9145071e5ce1d3fa81c52fa83ddc3ed7ac86d6edfc48702473044022031cea31c4a2182432a24df25fe3c64e61ec605c06e5134397ab295c6985092060220361211c56a0b12977426e6700bb643faadc9b250d9670bed157b8be5f2ec2843012103c3a4135f766840508fc16a2ed6410d6bde15d93425788637031f079d40ca05b100000000020000000001018e836dd93e0828505a98c1f89bb3599185531bfb9fdd5cf27da6281adcf2240a0000000000ffffffff02213002000000000017a914690f1bf881b19e244b9161383ee1edcf90fd056b8704b20d00000000001600141c7d7a96a4d45b11df941eac738ab50303505a8e0247304402202a8d19892063d2a39a10d3a6d9f70ab05f4994f2afb67e4490517efcb8c1c717022031c82b09952c883e39269a70ca203f67303f978af7e04a26d7796b7203fa23b6012102ea86d4a7755b1aa708a187b79432d6a667ec4c18e5d8e02f641c86668f94e2ec0000000002000000000101496608b644800190dcc25e82f9e863a81da559b57e5c9dae0a48a5f8de259da60100000000ffffffff020f79010000000000160014b6e82716657d71d326fa0b45f0829d2fa5b373a952f103000000000017a914bcfeef7caa0e83f7ba10bdd921fbd01ec878ac658702483045022100b197a312903fa7e96ae199ba1897a3c545075d90b95b1c28391227841e3fd3ef0220772383a77ef472b21ccc132e9d95b3c5b2cebda68a8036bb83f63a0c38101fd80121031ed69f15d6bf997fcc90331706ed927c656f2ef3b72f57cdfcd035e61a7d559700000000020000000001017f11627ab495c832fe810aeaf5c2ec5e79bb9d691a5c79288b5fe557c70e0ba70000000000ffffffff02b15801000000000017a914ccbd5134e6974dba1e764f81f6e62998075b784987aa6e01000000000016001400e9bb489a13b22265f63fe75cd8f011ea119780024730440220071ce677f7a7ef584aa99b5695fe411763ea9c4130c35e9df9b45a241e367ce902200b51d5b15d0310dd30936d3e744d0c1093a7561778982bbb0fb70a97beb689d301210324a516a512801d23928d2291e2c76e32bff06ab61a9a6e97d43c2ab3e0b7038900000000020000000001014ba8f719e905b95dec97c204ac7021f574642a7527d0848c4339092d9be1d0240000000000fdffffff02624e0e000000000017a914772e0aad81005650827825b56a6a7291a7b5a29787566d180000000000160014a03c7df6b760f2ce90d6c7de44d2a9bae9db6810024730440220568e6e3f1c234512194ca7f27e0bb919a4ab52f24e38760915dbe666497ada17022003567dc2bf61d9567db0cb0f24a5f303833db26433ff8271e5e8d83ad09e9bd601210331108b285d715b8935593191bf38935349f4425e2f9318e674630151b81701d50000000002000000000101b59cdbf5cdd0c55aa540dc883f03b4cd361ad627f22cbdf136dd5b1e23a466dc0000000000fdffffff02291b000000000000160014771e48899341ea113b715cf4b4935e9eb24f303d305600000000000017a9146a6cd3d25548980355a95095447e606c78e5ac348702483045022100a1b0fbadbc135c6f5899e607dcfcfa4d466283f3c135f02c0e382dde9a16a24c02204ad31ce97b8215b33779bd2a1e71d93c9b300e1ad5e64eae64b26a2a38b9a18001210328c5d751804d8ed21d2de120f530401b7244588cafc6b7a97fb8f99b2ddf265e00000000020000000001012e471f40fa790c72b24f066bd9a0b52080f964bc7ee9fbcf86a68362f73d8b210100000000ffffffff02908b1b000000000017a914bff2bda6350c3627239f1ff219cc2177e85245d587db5dff0000000000160014695df5bb9a4d8ac47eb969bd3c4c9c140a2b5f0c02483045022100a265b35681fbac33cb3feabea2f6df2fb86f8d4650daacbaf946afebe5ff31760220073adb38ca87ea5ac5c40b1385e23b7f79afbee40b5e2cf5504afd692acca75e01210363321bc3b22dd99ffa99494c23a55bd2ce2e6ee136574c610c3d873e878199d00000000002000000000101aa76b738420df8a6c9efbef44ec5dbddaab950d09a9af1d482f5350a83e88a460100000000ffffffff02524f86000000000017a9140529fb444b22d13bd3a3984a137a210b843e67d087231e000000000000160014a852d6b135b3519b027e931f1d61f67ae73edb5502483045022100f28263102171893cc83f4f14e90153e393063e9a50ededc5af941374dc01dce5022017f8a0da6601a6615f2358454a9585575bf1176b5922dd291dc1caa0ca25663e012103bb916875a57d340d2ae159894f00f27fc3d643861c24939a8b4d84fc6c615a5f0000000002000000000101346e9dd71ee1627cf38cca725e905fb144d811f3d287d2e7246b01465471a60b0000000000fdffffff0218f600000000000017a9142c71dd475d6e5e0679b78a18aaecd3fee27268408736f5440000000000160014ef416262b731b2500b6df65b2b03f100034d10f00247304402205df94aa3bebb9efff27fca5713777ca015266a6fa1f6059b0897cfdca1f9acf002205e0f7cd6047b399b299e0c49e0eec42855cc9a440e133485b9577596e4982875012102ced7adb74448ab35ab9799b686b6aaddd12ed4df3e13502126d70bc49d7d726e00000000020000000001018b368a0b247672ffe8ca3cdb7dcd2bf541515399bc746477450e2d5489b442f60000000000ffffffff02c69e010000000000160014080e6461c16ea241ae19279c3257a70445fe92e7c72201000000000017a914f6a4d2521f061869ec30c53536230624825971b58702473044022061960f95ca13489c969329b0143680df23fd350c1e314c8ab6b794f9e24897ef02206281035738f593f3183357e7e739c439e0fb6a3ec74bdc85129dd1dde83ed64d012103d9bb002b877e7a996abe298a123315e83be94c8641f8f49b5bd5b7a1b74dcfe80000000002000000000101bd78a201b0662eb5631929dc41459b27a90102873b0ca8597a4277f078de52740000000000fdffffff02490c05000000000017a9143fc8ac7baa71a3bd7e6ed61beff39f656340b12e87afed0a000000000016001483b1dfdb20c39349c3436153834eded8bb966f0e024730440220557a48951f87c2dc452078fcfc7c52a4ce431a3cfe34074670e5fa11a5f7239b0220645fdd869c967b68cec1ceeed6b83e93a7b00d54c1e9a0ee57c91601581483410121020d80002cf99c05116d05d71fe1e65ee858bbdca4a302f2a6f9afdbd95f63ec03000000000200000001e15c0970ae101d6de8d817aaa29c78a5a1d2d0be68ae7bc7cdde58a26fb1a5bc040000006a473044022075497f3fe0c47fc5e4fdc00751baf12c5a78fb7cdbda1ff9306377f6fc862d1402207a0888bead7f8faf53d02f86b516d969cf08a24dc58e7a1142884a07fa1fe85501210239e69a259c14e71d58b71b1d3bea33ba64c7f872537a64c6ae36d0216449fae7ffffffff0351089500000000001600149506e7e1ed12ea1b5e0b89e970f314d4f6dcaf7517c601000000000017a9148fea3201ccca491c195f22f713dd46d05c58605e87f8f95644000000001976a9145b4a23660279d1b6015d2a35ba3294269486d8d488ac000000000200000000010121ca750bb20d33e1d8c64f5a51261722e699c73a141b94d11561ff4b632495b00000000000ffffffff02cd814a00000000001600140fab34cf983e5d3f854850f5727c737b164b4e0c42814a00000000001600148fa7ef1f921ba01fdb8ab2be9da98a3f89b7077102473044022023e6a7bc0a4a77f90b2f2a306a238edc27f39d2c1dd716d050f5eb28fbc22a50022030b40cefbde46641de7bc90392ab62b5c04376e33b1ba4a092384ca325432db80121027e6f2c2c8b6375a7b14a3eff50a6e0ef77e449d1974e23510a5585e0554dc4e500000000010000000001018689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd4500000017160014aeb00824022e347d66fe35bbfa2117e9e16f9cf4ffffffff380aa302000000000017a91456f43c9ab22b7b8d25db05d08e1b5a4bdfb7107687804109000000000017a914c47e0cd6318dc0144b687c6308e5b6a8d3b301178752d704000000000017a9145be5f6c73ca2402f4d2c9d3310dd781a24d41a2687b10804000000000016001430e0131101a2a2cfac126061b91761c711476f0d8f9a0100000000001976a9147221879216242eec366c47b1d032fa880ca7802588acf8ee0000000000001976a91415d5d60f5b460989008ecc3eea6eb0eef9984d5b88ac2b9a01000000000017a9149e2f30e10d88c0ba1eccc9c6800ed7ac2c4b5b1e87877108000000000017a914bbd34fd34e1f459e18a20dc11d096a9086108ea1874c2e1500000000001976a914330e4230e77888113a5410af4bb0fdd8c963134988ac042b0700000000001976a91411635aad247b9ede39359a30d27fd6d6c909956f88ac4d4d0300000000001976a914bae72f91e2b8aad7e781be25805d804a47ed9f4f88acf4711f00000000001976a914d250f34d44db57ffcb3cec307c38251f97c80fef88aca5c800000000000017a914414bba85edb72465a897fc55175ad02c1246159e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764c8703000000000017a91458edf862cc4e84266608a02c788d552adad79b4e877be60000000000001976a914c9c26abcf91f1a6e0630aec8bdd0a3020277038088acafe70100000000001976a914d7b6261c82d1b555c114dde43db86a79ee43f12e88ac3d3b0000000000001976a914da429b5260797fc42004b0e0899aaa72b2167a6788ac68ae01000000000017a914c304730c05c9f3a9b3c1bd743074a8748a005b6f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7667c80000000000001976a9142d1bb6875741cd936ca645ea61e9a3282d3cd7c888ac46a721000000000017a914284317f6da524925ddfb8632a15f5807abb7863287440c0500000000001976a914ad2cd0482c665016575d4519a4775eca8c092a8f88acec6100000000000017a9148903461d52af89bb0b8a9973d00947e9fa7c83d687efbc01000000000017a91432b1d6224602329d3e629c102b7ea5f92ba4a875872efa4c000000000016001434670074cf0789de7c5e8a67c208248751a34651bfab01000000000017a914949becdde47335277ade5ee222ce650a47ea8deb8740eb03000000000017a914085e41df89ac4ba460232f2a06a814e719bb6cc287dc4400000000000017a914d11c96ab4bcd62b8aeb6b31cece1fb346f97e73187f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76cf6902000000000017a9147f8413db52ff8734243dd0cbb7531ae86c08cb8e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f2531b000000000017a914b728f965608c8e46d2afaa3803aaa7b1a238934d87df3c0200000000001976a9141bcac61710eaea28c70bc42fbe517a3ba2ac2a0888ac80f124000000000017a91456283e85d0f2aec66bddc06b254066e2f06b8237876df00300000000001976a91453b08defe9f6de6cbf5ea69e7756f1f9d7a5d3f588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7663140800000000001976a9142d47aaed3ef30b445fe560adbbba7d57fc32974088acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a1460000000000001976a9141129f03811526caa2a25f486d9586fd376257bd888acfef401000000000017a914f861eb89867c62d379078b7f455b30123f46ced28755370300000000001976a914b6fc7f51d1a550961bd58ed3de14cb050c25740488acddfe560000000000160014bccd1069dc89aa78543eaa766228fcb4b336d36ec45e00000000000017a9148bd9f6f4ead6482154871af19f5165783eef1e7787d39d0000000000001976a91435542d3cfa6da45fc8f054019033f3b4c385dfe488ac176e5000000000001976a9142cbd56302afbf313bc2e4d36bfb6dedfb2665a3388acb361450000000000160014e58c783a93003021a0b6bd73b9ebf8dbce68efb8774e0600000000001976a9146a9c2a5949b469eb9fb2fd73e3a113004e50c0d388acca8900000000000017a914d5dab13e9531245eb4cff2a46fde0e4996d039548787d8020000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a7ad00000000000017a9145fc0babd560a82e9ea7c9b36911a335c07d5f6fc8733f10b000000000017a9140df0299d4f1ebc666e6d54b3466f0c494de86cd087a08601000000000017a914e0b342cace3d59b9d692adfc2fc319e8e0a87ac887d1630700000000001600146d6f6ca0666c3443113b7c6f386f02ad265f15dda0860100000000001976a91401f2d70caff07f26f7c919aa1a985a7a3b0209bb88ac02473044022051cd0ed6de5361f92a7a652a447aa32be8531463e9c3fe41bbb82ea09896cb5602203aa00340472f52958f61e55bfb884026ed37b3fb447d8a58db8454052c15587a0121031db7f3a376dbf8d3082ad1fc8c72555ad1dc74aeb475f24dba9113201dd34ad900000000020000000001019352e8514936cd2f89780c75bbba237d1c27574c2d1a34c530e172ba01a085913200000000ffffffff02567a000000000000160014f3d7e6fae2c46d19ef767dc5cb33ad3c230d30d4fb4f02000000000017a9144f468a007b8bd3b788dce89ee7ba30f7f90a8fda870247304402205cc0ecb9b3e75f1b172f3c296d3da91fcb49c0a0a427fbc90e1295e1326abd9902201f077b020a903292c9343a11c925749bd66aadd0dce5856bbeb4ddc29321af70012102a8d33c25f5edba9c2e23da268bd2ff7af04c46c597e9aed54adf44bb15c6751a00000000010000000105a03b6b7f438e16ab9907c566a10624cfb033cd60b4d6604638e4f0238a575f010000006a473044022052f1bb80a199c0eecdcca3e047a4e631e67538b77417f11774abeb0ea2ee773902202c93b3f5bc250cac9e36b4584b642426a0811f98cd49ee17d0d9947bdc58c7000121036473d3740cb979be8f6ac9ecc98a493e3001bf184cde90116e4e07b9d78b2d99ffffffff01ebfb0000000000001976a91454a36bbfff043077d3c5de598f9d12722aade11a88ac0000000002000000000101cf01cacc1a888ca6adccf4b1944e795e929a2702f88cd3bdb9294f1b7e9d2b7700000000171600149937341a916d0c6b9ce10e6d93e7fdd68e0bf502ffffffff02c65305000000000017a91442e39bea24f0223fde88282339f0b6e273b3457987132103000000000017a914d0d8b0689bdcab9dcdad94d65652444c18f7c85687024730440220670f68616bcd4f02a118d56b4a13311acbd1998bb48847a20b8da48a47efe1fe0220418cab356fdacd0407ced30e1269cbf5814dd093eacfb280a452e0530c8a46fa012102fd516e1fdcee31f7e060add9df5f18921c231748cb8c1b12bc1136e820cc31c7000000000200000000010202342db74cc7a63c36d45a592a58114cb9d77057ce954d49c2521a639cdc63840000000017160014cc8ac66cfa36ea493b9b367c98ec4dd64414ba09fdffffff50beae74208d47bd8bd543d158c3e9578318f1b6e45b0dc2fbbbaea1c4be4ca2000000001716001455114a4fcfdb4f1d52aedb16650d13223a1bd9fefdffffff021c9c53000000000017a914695c5ffe322276cbfb8bb953a2c267777906fc768740d3650000000000160014785ee1428defb653a8d269d4aea8453637d3cbf902483045022100b5f45974b17e452d317d52cda1a4693c3b0d32ab9e30f42e335eb294c5d405d002204bb83d02285e8467f6466663e55bef718c0d3004b022cdf7d433f7dbaca72578012102434dd01d50934c6ea8f20271c3bdae554cfbc119b38bb105795c1d9b72023d5e02473044022070204169657696ea54097d5331cb4eb3e3b347f2979e99682ce041e066dff5b102205f247946003f1373d2cd241e213246957c0bb222723df5ec7ee89c6fbdf21227012102b5ce5eeb090a63e53a49aa58f98b69c11c5809c202772e21f4b7182895931bf249a00a000100000001e1dc1ae61e18151aa12271d2336c8bc7d1d623e62a2e9d733ea71a21ac7ec00d010000006b48304502210095c96225295d2dbb9c0a87fe71082faeedf4dfbc17b3fed947582f0d60de986b02201f05aea325d2acefab18b0b6b4e6e3537a47ea4c4c770b1aa98737ae7878bc18012103c9190e5990c1763ba41be0e5f7854cdb8b57ea42dc1634baa5189950e782b3ddffffffff012b5429000000000017a914d8f3d5326e69beacd5c29d0ad89d13f6a9226794870000000002000000000104551364ae14ac8bda5022d3c7c6ea368bfe07b3bf4b18dd1de784aa7c56754e480000000000feffffffeb34a7d1edaa197decd78bc0b47b91888e0f0254fee1b0d9e441e3aa6f4f62901600000000feffffff293b01161bfa6fb215bb7ddd89e9617610f5977f80df73b079412e15142714990000000000feffffff867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd4200000000feffffff02e0220200000000001976a91475eb86e2fa02cb35d76a88e6bc6180833e0d3b2488acd38b0f0000000000160014bddcc85fed54e7f703c869f974630a4cd654e23002473044022037af2620f2af64a23706cd72fde96245fd44616fe2769b0dfb3745c87338222d02200b4c34600139c0e041e1023e42e04937875787c61851cae6fd1017ae88a8da410121026e7a1a9d07201ba4482d6e2e6f33751ce5248fbff1976c3a94e64b56c96da6e702473044022024014c13c00154eee78915553d478a7622ef0c5e2fc6f377ba35a77528ad3496022058bc6349411181a5f25307c11f24936dc2a58edd273e1998b9f97ce8c3b567200121038487c38d87f9c55bec9d3e5c2682f52af22f5dddfc0130f39f46c219865e665502473044022056e933447fdc93e68c9f604372768ee57d957fd6c61e92af0e96e1bda007c82d022053aea7d03c0fbec0a7d09396c89ed04f6f318230b23a21ef554198dcae2247960121030c008d3e4879b5613145adfce34bb12fe6dc4fb393c3afdc8462090df38dfa020247304402203b32162a4c0fe3c4ee95a367e2242aefbf364c502b1091b8399b75226322b83a0220718a0b122cf9dc301ec8628524e6a49177161cc66731f2748a4271165962068201210284cda6f896d027f18256636e804c1849e284011d667c13be31e48c108fd0cc4549a00a0001000000000101285dc6e63cddc530b5be94d024451b09f05ac465f629df22e5ac22b86d4ea1240100000000ffffffff0260ae0a000000000017a914c866bac5a508f274a1f1b59bb34871d432aed62587fdc40c00000000001600146b59b8bfbce4a543f34483c56c030e52632532720247304402202364a4ee0a08a5b39a32dbee72260771dea84ec34304fe12f0d0c9b9722455e20220478215c44f7de455e526ac9487e28b3bb9eb729a7ea0a69176e7c6da655e53d401210225e2f4a32634f0b78c2cec656e2c97117c7293c27eed06c8a3a8e1b20a045c690000000001000000000103c70fdcf46a91d1e2ec428b48b8d613c251ff5e482ee224fcc9e5d4dabc699fdc000000000000000000d4f6e0cb1754ba60ddddb80e344dee085fa6d1ef66a4511398268802922d50f300000000000000000023851418af837c32f98df5a0005467aded4078a7d4c4d26b804687bf91fe8e610000000000000000000200c2eb0b000000001600146478165e603a367f2cf837404054cbb6f75c107e4ad9f50500000000160014b872499a87148ed51c904280684a94af749155370247304402202b215d9b653cdd0c4f7f40a5e12ad29fe25d2200fc20db6e6c2006321c0d483e02201917915f863a643832af7528a533603266fcf7d325d4bb0f44b4019e8ccf445d01210266fe876f8412f7e858d582004c9bba14e4fc63ec408516c474830ae43cf76c730247304402200b31009ec7508f169350b95fac71016d81c47bdee7586759ec6f6e09e33660ac0220184ce14be785576aa4ec1b6a38858a493334c0248e2bdcf40d5fa1b7ba88781501210255ce1f99b23be9e0a722258265526cbf3026390761517060d446e3b11e5fd1be02483045022100e5edb6f1c1e1c8b4c4f6a204028ab9e4ed89b9e686e467ea6ec2cac412aab1e40220294462efc51bcd64aecd24c9c93f68465a165d128388a09b752436419f5a2e11012102d7faef7a83d756543945a5d8654767f08b8accfdc657bf4d1571ef8a895a63630000000002000000000101528bb4427ac2025c44c4a32a6b82f3cb1e4d82d32e16d3b9170fddc82d3604d80100000000ffffffff02e0ab0000000000001600145c9def6b8870d5854ec4864d886c2fd3946c6d7f3d7a100000000000160014268e04332389ddf12c21fdfbe9825c8ae0c037a502483045022100e3013219337130c54487b7a49b3583a269dfb04cc66b60d05207cd0f8a452735022049ff786224a499a7974096bb5c01a2d0218598c95ac64ad45095ad59892eb27b01210343b0b7cdfe46221cbb2c404e6de6d06160fa1b61dca431486cbc7608f8616229000000000200000000010132aae9f04d4285a446d0fc477e6200a156b60053abea023e068372bc5e02fdd80100000000ffffffff02e0ab00000000000016001426edb76da94a2470fe443cc474bec0b881687a326dca0f000000000016001492ca85ac82b241571ae5c2bab58b7ac25e6fc5df02483045022100ce1fd0834a373a00c3fc2e2ed2d18c5fdb71886642d943d7200d9d5ae44a2bd7022013e055a5fce33665ff624d36b7660117b51a11baecc7918d6ac9255a2a673fd5012102c281d89653dd46eaa45102a1eeac61f7abfb869b60e2c346b35f702a6a3b734a000000000100000000010103de176fc5dc45c2d88eeebcbfb4fb89629251cb114213c8bc29e039d18cca900100000000ffffffff0280220000000000001976a91461150c6f1d8d914c55b26f7b76d0d6bcc2b579fe88aca2a36200000000001600144ca380f569a92503ffe5f7888290c61c12067b7a024830450221009e896344f1e20de3e01783bf90d838295fb0192dc1998d30f11791fc4bc11f7602202af98f87c5af77b5cffe97e91ca744ae4c24ee75b54ff487066806ae2d048cc90121027c301ab5158187c7c24afb6de2d0837947d2ab1642dbca0f9d66d868776f2a590000000001000000000101330d3d3b0a3ce0c02a89cc384575e773e726301ce70963dcca23c940015613990100000000ffffffff0208090400000000001600147a42864c511397b9fc4007faf970814432084a859c965e00000000001600147601df0441a8188c68aaec1ebc1830e1560598ed02473044022042f938424e49d8fd879e84d20cbe7c6cfdf25d2b1fd713682c5d9bf2ab9fd82502202491aacee993067fdc8faccd4079efce5ff58724c366fbcc5880d6caa582bb28012102024b7b140df01d59a670f75e61c2f3311f70e6324db853ccbc53427eefaaada70000000001000000000101f269ce2a70728c1532737eafafa4be1bf3b1e964d548a3e6231ab6d55a0ec0d50100000000ffffffff027e220000000000001976a91461150c6f1d8d914c55b26f7b76d0d6bcc2b579fe88ac8e6f5e0000000000160014fbf5166964c28ad8526076a3094c3e09d2da679102473044022068ed738cde29bceea4464d57353f56042191181e8c1d59ef204806b72bbfbd300220267716e13e2c3d04e4884508f2f469f1ecf0dcc125a3596c9137b63ee5f36cab01210353c1e3aab263d38311bfc871304a9f4d509813f71d45c7980c0709c4dd9327330000000001000000000101f4bdf80440c90b3bc56058eeab31350680283298eb00c39cafa5f6ac9928424f000000002322002018f481af0c4fe19445d25a373d76eab6516db4a21a9ba35ebdaec773ff79b044ffffffff03e0760d000000000017a9146ea0978cd21cb4e16b5610e5052777ad20d1d2f98788a932000000000017a91486f679db395c942f09cae90533afccb12e3e143c874d3cd4000000000017a9142a1cbe7013db32a850dbeba96eddd5196b2aabc48704004830450221008379d6c94642207acde61d412181d987f54536e5eee1353d53c72b0f28d543540220415fdc90bfd98f5ed462db743ba0bfa0111fd0c4698e766025c520911e4a9ef10147304402206a3cc720fec0c1fc409c212c9c6863cec8bbdae3c15125366b00efb16063f21d02203fbd5ba1611d6271c7b89aae2efa01a908a0b064c72db079f6444010ca7decc80169522103e70515a2c0e259bd41327e6f953f5785234f893d2e26fea5413ee0972709a74f21020370c28d6fe2bb7919bce6117ac92e8caea916823ef3abf0f9fdb8a980a95c2b2103b05a1a823e605541795ea9c49bd5fef7e4de0ae20878e70a12d9c55f7594c47253ae00000000010000000001012b52cc161a715521150df99b8784d5e389be45b97b42264ff3800969ebf0a9bf01000000000000000002001bb700000000001976a91452a7b74417145f9c6504bcd112eca1e4387836ac88ac98d16f020000000016001407bb97ecb6d3d101f903e58f921c64416fb4544902483045022100a0a323782de7331971045ec749ca058fde5233ccca13bbee813997cafe0d18e302201d1fcc31384ec98f5faead4b3adc53b3706b976a450e66c5cea7d525193fd731012102c731f0493e2cc9bdf6686a813a0f82e138c831d77be14eda4c7a836a2b8b2f2d0000000001000000000109469ab1ca38874e71d0ce9a8537c5bae3687fedd530bcf39a57df6b7969f1250600000000232200209f46f5f34beb2cc41241c553b2389dfa65ae3683e257cc87810898cdf460f8aeffffffff00679327cd2a693dd4845a3eb251896a28c44dac01869f1c0f30671c8e66b61a00000000232200200f2fa42dce6a7402a47341f3ca51d6ca406be9368bba9cd143c821d5a10bb08bffffffff15d2c53765cbac9dc70faff0177bb629fb4f842c25b8149a06b6fa995fca322f0000000023220020e02afcb24d2aa35aa3093067ce35e19ce8d034f0db91695ae0ea0a93045f4dacffffffffda26f1d652ffa99015006e492dc72c4aa478dbc736684f48fe41f085ad1215330100000023220020ff899e5a6500552c8b18c6e4dd53802a28b267f4f8136015de3d88e855dcaa77ffffffff2e25db6d3be74b833a46782f7af45168cf3014fa0f0f0f33dcda5961e9bedf560000000023220020cd7ab0c094892fe3bb20c1a4b447418521597d31d184b188a1e57d4cafd10378ffffffff83691a446dd5a3c37755384f93759fdbf3b76a2fc95bfbedc4740caaa9c253790000000023220020b1ba16660b9eff395bdd8017bd18a4babde826aff40d74864afc9f91e7be9659ffffffffb864cefbf182e995effc93d420ec14d966eb52517c3c0f062e7a10c45a0825e3000000002322002070f553121b2c024cb81a1d27275c1aa22418e496247a3e4eff6ae1eea986ad35ffffffff5ea70142330b70711b510a91927b7f3e821dbfed7adbe64d2f254416ba37ade8000000002322002095a75a813dd1148e1a9378174e2a2d3e2935391c83aefb55fa9301e72485f74dffffffff15a1ccaf3333e19ea2687cd534d54b1c62a570581f9f47b011d0ac24927410fd0000000023220020c4d47cf6fef2ff7ef851ae501ad9c485dc5438a12406b148d0c6ab8df7ef03bcffffffff05a99e0100000000001976a914e9bda2ba15eadff41bfa20e00ccd83d58f53375f88ac2b050200000000001976a9148e88fb84a3ff6db6c1113339e28321a567279d4d88acfee80500000000001976a9148265260b5b22f6512a06c4bbf3193f324734b78b88ac20a107000000000017a91488e943528cf757a0b352980c16937471004b7e698780d810000000000017a914f5c7f4bae4d00756ad548e128fc5dff9782294fd8704004830450221009f91c4669febfe95afc12f86bf51223e275e46ddaacb12d1631d39e100703324022076d1e025c874ce2ec2aa3f1947ce67e1ed56623929b1956f8ae2900839aa4b4201473044022034db76cdb953749e414e40a0bfdab1889f19e3d379bcc377fe4b1acca4fc2cc20220439b71a794f6afc86503842152224dd1332cedcfbe682d0f1ef911d8469b9271016952210213980adb1b0d246d9c937111ecf5e40c432d9bb71e6398cae9a9fbe67e5eda71210268d1b88230c4bc40f65a521c9ae12f19d7a6812228b5787a2815688bcae5205e210309aab3baaba5493f5cf7bb5499913b8f89ddd449b2fc6efe9ba2ca34b2116ef953ae0400473044022016006da1df352e20f22046de8d91c43015f08649a0ef741c23f8a04009f23e35022066b0a2ae99b05887e5f86f08d31498d18cde54eefd5895331c35008ef6f275b00147304402201d2aeb1323010c79bd83a2eb3bb0444c8a81ffbe59bf2abf072a2bfc1bc5651102204483ab59d77570213bf66fb09564c7bc1975cc5d7b2361a3ffdf73325614437301695221030d585028661d9bc82d0d1e99b82fe3fa69282d98745e2bc8b48019b1350b3d8a21024f1bc297ef9ce94a80a8836776254ed6722f1d344a54050f56bb6b6f899c299b2103ddc591692c1b25176e26cdff4feb079711c2cbfde4d8c8ba3a15c54d6174928b53ae0400473044022007685ff3535ed77c5624107bfc90c6865f6c8b84f725644ae1629ef480dbcbac022071992b9dd9d52c82a556a268c4d4ef9ee1f244a30b9d830d2df287c31a6fcb6b0147304402200d8c7807baa5691c08fd5bda0fff1e3548508e1a0c6fee6538337b496139042d0220125017769cdf66670c8888562c63d611dac0db26e629304f1f9bd08f40a717940169522102d9c010aed4df536a2127363360fd472d2baae177987320151814707c1cb824132102bb5f8cf170f6585ed0f8cc77f29d16d2cf003396cdd0956e4877b989add592852103894eca4c5a957d09445a7d21af6e923270aa5e3b6a8085fcc8b4135790a16d3053ae040047304402204904d27a6d62c75f2a740bee03d6323e6d4379b569440a31066dee027411cb7f02201fa2d149b32c08f40cff2df349470abb4884a8e30ffa4b228296fe24363156c0014730440220260f6e49f7dc752ffbed9a9d4ab7a621f85844c726f1d2e74fda32f02157672b02204b5669bfd5b1bbc56f82d0f8ca1bd8c817b972a331ecef61a408a0adc2088424016952210316ac5a19eaee794e6155a35340650f06501eac5377f733608f59b4a35178cf152103815762733a3d0563801044434dca36426fb138bc6513621a37a2bbad1b92524f2103fa7af1159512e08d6608cca1514a1f02f7d5efefca2d95b457fd8c798195d7f753ae0400483045022100deaaa84fba947ec35fcb1f6ed87c7639cbf0a221f45e7beaa50b8393202715b202200fed319096a48195b20b267b6149e36cd0f8f40efc94a821b8e3a9e040df63750147304402206939318a52838d8455f9ab928cbc69e47495345db1c8ed83ea38eee0b57c7dc2022060fdf7c46642a1141757e66d5fc8dfc019b1075c83aa3c46d6200feef85f489601695221024a704e6224ef618c5a9abde800ed0e28d5e10ca8e08f7cc9dff43195d24bc2162102b19cbb85237403bc35e0cc722dc10a86d3a608ddf5bf5f9cf93da4916655d43d21032f2ef87364df2e6dd4c3b5547787e213a4b0d33749c827ef66f019898b98272e53ae0400483045022100c50770dcfce01b517382e0c73676493a84fb1a3c656e9a089aa6a112bbb2286602206d853fd2d7dcf17f37398b6d5958e30ea7e2b6ac153975b10ac5d4375e5cb8330147304402200eb7bfdc9cf8533094f36487e7d87a2b5f23bbbd32965e2af1b7433e4bc1f80c02200b88f80ffdd636417f662ad81c564e7d9adbbb6fe1dbd09af4a9b23891860f2b016952210211b9b7180c73f0cc66a3c765e4d7fe37ac9bd79e267b47287f42d39eba478cf62102779c93510ed3b207e1de3879d569abe4c0f6a98df9e833694107168ffc588c202102795595a35f7aa60dc211ea966c2938e6a3e24e80d6ce2d10c2262fd0ad1fa02c53ae0400483045022100fd410bc3f6fbb05ce168981d67d3df41d2120e9c472eec36b67a7ab0f29d4907022065a9a46bc0f5e227dcc0f1be891170df475c9cf270370541bdeeaf963251a8690147304402200b2391817d3ecd9f83a9ee3331d2cce2daeb8701befbb37f65b1c9aee646afed02204ea5fbc1637478070ae78e881325ba05069dd1517344ca93396797bfe58a1f670169522103119d30ad5e81e4862267f9db537e17fd69cb43f4720e224931ee3a7a47ca4df821038075c0da033d6a95b1715f7fd7f08805d9b1515b631d26a34e6a8b63911d2f9f2103bc551489782e3cbe8de1d37ab173b8c3793538b7162ba5dbca06945b5c256d4153ae0400473044022005ac0ec7a170978a6353dd59b7cfd4eee31b6bfc80cebe2afa8f37a4723fd4f002200df5fbfd1dba872e23f43e0d83a9b5ac216554cad5c53212a4329470af757c660147304402202549114d5eb3426af6e37952e28c525010a919ac72d9aa09a894acbf878c969a02206e551b5228fad6ca6dc1aed33ae4e22ff5f30a1fdd82177e5e0bd4220a7bd3ac016952210202b061b414b6493e7dd1548162b005642f17396d53097749545e475b3f27f6f32103af5794585fa3e5836a448d0769d0c3a57e07deb383279c989650e0c527abf8262103b4cb1388ae956c8a50c312bf70400a3157e57ec1a78318625cdc6d5dbcc3331c53ae0400483045022100bdd158437cebfb1470491cdaac06938e7ee646fe02aaa490d9cb0c1ebf9ea9b60220766009170663d0da20a73d47be3c68e6ea4c5ffb6c143e2829831088805b4fb30147304402206ff66cbfb3c97950dbafb5fd94e460cbba854040c20be38ce7f942f7cd3f007102207783a006012536d425df1233a49ae65acb494921877a72a4600ea947792e5f4901695221035a13f8812d6d6cb18ea4baa6acd48472eea53070b06ed7e849a28156681d9fe72102792d73c90c973d50ffbfdd72ea29cd6f2c348f6a6be5cac8c5be962c2e51432121039ab35c50bcfb3ac0497d0e3b568e022c265f6a8c1c0d52a2911ba278fb1ab3bd53ae49a00a0001000000000102ed636b765d99d0340c8ded4173455da2931b07cfece43e4f09721e38a2c1d02c0000000000ffffffffd29613e9bdacb0d41b798ea0caed431ea30e4394bd355c8abf45504959162b1e0100000000ffffffff022c0d010000000000160014a660c44ddf4e485c28e178bab7daddc6a8bbf53cf36908000000000017a914e5ef1f590b15d49669dd6099e6039416f7862e2e870247304402200502dcf3438af1b678b6bb6fa1866f01b5f232056d752c74a473095daf3419540220272e6c459778c1331cb2f0783d5637ff59a46b47a95559b74769aaf2e56e142d012102e7848213ec7d8d3ed0e3ae331fce95a41fc99481e718fb235e9b307954cd76e30247304402207696f327c10982e496be595469d2ff0ce6e89ad0b68013b9eee5f246cdadb50802207e185559fe60d3431481ae5ac8fd522c2d2a9f348713bb646a9f8449e8bf1d6201210243a3a0cee8fd0bec93437702c900a99611aceb53f17f05b9d9fddad99bb82f9f0000000001000000000102fe687cfa7da2e995f383ded4244dac256e6ee00fc40253744f65d61b045540620000000000ffffffff6a52226d8eadd58024407cd9f498587dd1edfe293f5fb213092dafdde7488a790100000000ffffffff02559e03000000000016001433742a3742f9d7d1b4fcb5b82e08690bf30efc6d3c6b03000000000017a914babbd3d568f27e541c5221b34ca896814df968278702473044022038e3d6bce2aa66c21c59142b2252e087668249e3930fedf6b5f9e2e077ed47d30220150aba23b0463c602a86e3200136d757a7d1d2cc17a3dbf6b5eb76d62cea098e0121032b4a5a2cd32bbac9e3bc853a5d397d27322d7ab15d7809218ac3ea3d1ddae7f402473044022003978b0f12d3709c0b380ee66092d687ec5715ba3866b7b2883b280ba9e151d0022005bc1a0df7d1a7debd80e8381a20e936b27d3c6e424dcbd50ad80bb0443fff420121025eadf91035d1b16665a3146ac5470bfaa38ca79bf336690da3827e51b0ec867500000000010000000001010f9c11cc06fa852c1a93e7344e7b3703b607908d0804fd1d9954e5615c630a995100000000ffffffff0156a0510000000000160014a5edca72b6454c12124b767ee7278c9366bd1f7b02483045022100800e7f1b5a30a0c969178cd88634ba18863d2e652c3ebbf0c8137521d99ac80d0220334f32c6a7910310477a70d3e9eb4df1f19057d8d28cd36a8362cd1e0bf09d7101210221ab627696af4ea97eff5cbf5f1bea09d5b398357e3019785d975fa5b45022430000000001000000000101b437b5f752f7c8018888eec713fa4ca5cc6e51a8250ac057d205b25e597460bf0100000000ffffffff01bede010000000000160014a873d5c1e3559fa4c8333bb9c1f152ce96709d3702483045022100ffe1548c4303d12deb80a55b64665c7f83cc961e20b1dfeb76b4f7dd7e4094a8022057eb2273ff7aaf950e3946568df8570cc4f4ef58884afdb053af9fce42f5b3da0121023b61cc6b7f9ce826e22c3054b410d90a245942041264b204d0572873eebc5fc9000000000100000000010144ef69b842e8b5dd266fa2d03a8998bf77ddd02ab4807e94656830b9f42eeddd0000000000ffffffff0142a96300000000001600147ebecd0465abcd5363cc12dc66f9961ea5343832024730440220089f3629293d6b26dc79852ddca0a1d57136adbecf1f924cc2a5e4d5d0a9d79d022000c5a155352bfd92dfa2e19b8a2576e775476788601ab6d65dbdaf57836b37aa012103b900bd10b4ea43317b2d265439115f7ad604afbfe5f51f997bb6f183d36a13fd000000000100000000010146573b9d638cbf6e7631366c6760ff72e07606e2d7ae165bd9bd8ad9f5e2d897f600000000ffffffff014ea401000000000017a9146b4649b4796a94b0fe61128c45f3d7cfeb613a23870247304402200617472cfa2a33fb121f34af2e2d7fa9458b117a2c0bda87b6023feac3460b65022072646b3e214c8c49165cd0c21cae938848c79bc6ace634162a0cb0017fd8a1750121027f0abfbb5e50468b19e78cbb4419b96a00b5bc9c14eebe86d5d3e8fad0dfd0b5000000000100000000010140702fc5120d9c27c23d60bf1f456db33f410d345d67be3d7a83247cb76042790100000000ffffffff01e1f31f000000000017a914d01dc0129621bfe6c674e83d4755fce3488e8cf28702473044022001856e49404e1e996c67f06392c1005a909dde1e778e070ffc3076acb6a4202802201be0ff750afb9713ed0f8cda0fa6afb940df3b9905d32b5e22ab446c9dcf30e2012103346a2f01f5cf0df2ebd77116b711967a780500a562536fe33cceca9ad185d1050000000001000000000101750120196659980346ba0279668bcb6de1d8c114c59c90dc7d166732a2a177360100000000ffffffff01a05e05000000000017a914fcd67b4c35a67e9567011aaea2ed16cb421b0bcb870247304402201d308c30c17d9231cca74d5d55e1b53802f4eaef1f858471edc80499e953076e022029064ba3238a1725bb0d66e5ae213a15c0d20c7f402fb99121c24fafc2e8395f0121028c4ab3f7f7b1d4dc2c121b7e27adcd6e980f775e0d974fba7dc268554070859b000000000100000000010176a5f7a41a73318e028db72d2fc2b7768b798d9de7fe3c4ea542301e71f1367c0000000000ffffffff01547503000000000017a91432f3f1e4e8e4c914c4e23a4337c198c2d849f79f8702473044022045d1731acfe47641241f37f241b3b0308055c1e26a8490f21617f445dccda1f0022001b40842f224a21fc7a86ef09b5b1cec7332b5e68b897acedafb26909aefff6f012103af8f3993a2ccd70298f63304b0c2ce0f40f91b4eb3e775312a38e99a605fde9300000000010000000132a6c340e5ed256f9abc0da01130cb03036bed51328e2d4b0af0aa98d119b102020000006b483045022100937245bae84742be906d2de4b36bd62d26b48d6f8e06a4da943e710915b380620220474cd95dc47e5c262bb683dc9372ba6f13f483e7656731e89ce184799cd3b3a801210219c42a836e17258cd1d8f5ab0041b5aaaefe78794585b8f01d20f1432b5d29eaffffffff0138d44804000000001976a9149e95dd36fe66055526f3583b4cab0be972cd721188ac000000000100000001f111d662b6dadbfe5bc61eba188ca3af2483825da767ea5abee3e85651a72483000000006b4830450221008c0ef78834d39523f2d16149cd2597162a971965422ed53149561a539cfd04d602204479cdb61ebf50ca3961893ca9eab320785a33d82ea7030914c03fe55330efbc0121036b54097e58fd12591ddc51c3fd8ce8491e98ab62cc32e2cecb7eb0e0a9e35e6affffffff02f8a701000000000017a914c1f3a8cb7b7d4b1175f19094c685934a44c21e2a87d4f10400000000001976a914abda4e5c70a40a48dbc34663ae1bc7faa868bdb988ac0000000001000000011dfe6dc515097f3832c3bcc7a4f70e398620a199c568296d3a81a28c837fa372000000006a473044022034274f1faa8b0cfcd693329e4a3df87ced46d414d42081a94ef0eb9a02952589022005511403f3ff3b8cac2f336888da59c3b0e3f66da36e312e25166253ac80e7dc012103c3795efb9bc9afa2bd7d307ee14c245fb5afcd90805b5469f3c29719a15aeb10ffffffff02a3da0100000000001976a914c6fa3403d93fcb9be92d262cf8e49d675dc5506f88ac5ef70800000000001976a914871655fd48378cc21457cfed945b07214acee6ec88ac0000000001000000000101467d68009e32e59ce4d1922e2eda72db0f8fd81063e86c368dd86d1f20544bcfc40f000000ffffffff01abaa0700000000001976a914476767c838f9dd9d7636925529a918944cc64b1d88ac0247304402207c1c6b569df7364b9c6d7692814c35cf6d750db9ec10193253699524d496238f02205f590227d67ed7ffdd79b8c94215fdf80400939707ac506ee011492c95023c72012102c93f7406421d4be2132ab18e7d656b62c7c9cd5f75ff60b829e21715957b23f3000000000100000000010158604375efc9a00cc99f6bf5e6a63f964610ef017be39ce06c8418622d78800b2400000000ffffffff01419e5100000000001976a91484ac82ccdb29cc098bc13228d5920923e31ade4e88ac02473044022007134d3b3f9b609b61fcb3a9146658d06edcad98da0d3934c82de73777ff279002203e9ad90465e1bd06e7458a5c1b8f9ca49b72ac4521c8f50a9156c3823c8019e90121021c278ded503f6f24ad78b3a875640be20322571e2e82766941d7f84f2af4669300000000010000000001049f20f112d177d82ef62ba4efe07a44ef9c3c72c7a1fd6848c271dce4f957b6cf0200000000ffffffff7e8f3a23d1507114fafbf93dc0088ff84d989382051f65bc4e62d7df76d9253d0000000000ffffffffb373cabc7bbb49b66b1de5febcaab5ba771628d4aa0d256151e3e9cb8ede5b220100000000ffffffffe0e897f82064358364dac41f74d2f12e1665dea31564638ba3083bb16b40b0650000000000ffffffff0234346500000000001600140e97ecf3e06e4239b0fb83fb40f0e2aa34640fc975450b00000000001600144919c47bdc38fae2ff73d524d9aa4ad84063936f02483045022100e49a8066e97f1d80a61bd1d885f03a4e669d627ab9eec3861c3b2be234e738a1022005090915f9492ee60bcebef9f9b4ae54c976358fc87d5a91345d901db8d52b420121020a67d2e2893c679f142d5daeccf6f0e107c22acc07098cf75edc2c4a51648ad602483045022100f87c70c0278c57016a62eb7145450dfba41ad265f73e5f97b766dfb9413b3f54022058d1f82787796bf9ff83dd7fbe206e88fbdb7a0ef4e029ce83c742367aafdba601210212441d9f8d9d26ffb33322f1aeb8f1f2145959ded62d47a278562e92fdf79a560247304402203a1efc82583dfc6c09b1e5d01f5e3709e1a4d8360b2ba4826f065a4c279f9008022013b9f3df70ebc4ad6037919465abd0aa4be0a28e0f83a9cf8e24d286bb204fe201210212441d9f8d9d26ffb33322f1aeb8f1f2145959ded62d47a278562e92fdf79a5602483045022100a49a1534732656a464791629553ae392f927df868a0fb9c58176084c723ca63d02200b96d43a226cdc24bc38310c7be057cf8406b6f6005ef06579ab1e55c2403143012102bbc1f0dfafe66763d321753934128d153a27023ece68454144e99ec0539a73860000000001000000000106e87830a49142730f5f77cbc255fb17a1c31343d3c8dd1784d3d1db33198482760000000000ffffffff75b3ee144bffe648633b2b67e769f5f14e947ed0faaa5c12db2475548acbf6ed0100000000ffffffffff25874de98367a7d3e5435841deeadccb73bdc07bfb8b4060b234f6be16510f0000000000ffffffff8714e91fe2c889e122e219bb228cc9ebc88ea898371e869e58013e9a78f2b6c20100000000ffffffffdebd16120db62c4e418cecd9becd1b51c0ec74fbf55f30b7156aee0b23f67af20100000000ffffffff07062a614655bf1cf24171c56ab9ba625e4df052a769f6abb10023cdbc3937440000000000ffffffff02c0ee86740000000017a91494e297dbd7e8ea6994d04d2a2bb50dbb134fa57b878d34535200000000160014dcd98f218523460a2610fbfca009ba78ed1be00202473044022074cc24960961e6911997ef3896d1339af09c8430c0d0e4138777bd81ee4758210220102669268588037954e0495412808d3f2799c95cae6ddfa7e657e0692ac46a7e012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02473044022075feda814cee79367278c0ade7236bbfc1a011bd6dd3ca12c6d8a660180be9d402207898f5d0bf83b8240f202b3c0ed230605c2ecfd67f045c43654237f3cc6ccd3e012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100f9962ccc05f72f0431e9b1d36bf42984f3ea34c5995d5241def5380a572fb06902202015e2080952dc4fc7f3b9faf7dc1ac4d5d7dfaba9cfb25b07ba42eefdc7bd48012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100d2c91de401d7286dbca42c9ee76847005fca866f39a2c9c30249524ba96b64810220115ab357c056187e3422d8c4e21ef2c7cb9addaeed1bd76161d29f733dcd8f83012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100c6d946d9596f54d1be3d33b987446dbb0e01a95a136d19b066caa6a76838f6ef02201e27620def5b992d4e4cef015fc3df809a322cbf1709207ae4b7939fb4a64093012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a02483045022100df2b74a72f942ff9555c4c96ef064581ee2a9d16fe6daff0a4a6b66fc966f04f02205498afa1687065ec9ac43bfc93296eabc56293243c4d85d79494388a66c89151012103488ab60a2ec4714d484eac9a565da6186ca3141a1d5226b1a59a76346677a28a0000000001000000000101bd5b4f022f2e1da7fa46efcc05b96581ebb1e3fc506bd957fab8f29ac0e2a8e90100000000fdffffff02402414000000000017a914038bf150630303298d3398952c9640eb6c6be88187a7b0610100000000160014da6948296542ae1a524997ec3fb54f5e34d94c7602483045022100e18fa7fce5a1ef5ef0ad4842a445d9bc2007c74c32229b873bf185ba0dce3c7702204001bf58226c02ab6094e8264e2fb4a709907cd4bdca67764be04740b628a8d0012102d742751280179e1e69559f6745abab368f666e31e73aa5372a47a53acd5ae94f0000000001000000000101d4c1dc8ad27456f6a9342f48f80f4f4a9581085755ee23b9c02d91253b0c88350100000000fdffffff02235600000000000017a9148fe8ea73264964634363f070dd68a28099f4cf6a8731467601000000001600146e828afc73bfdb3951dfaca5d7bdaf919831359702473044022068909182cdd9dca722093150255299d290aa6f791dd434535f4ff920a6bcab760220437bd1df41e9352817271c4916d5a8649806905a193c916d974a12c54e0f4c1f012103bfe1a6c8b7d61d81dc747134c7c03ce113bd5f6a56494515ac79f13371c5e4e30000000001000000000101aa6df44a8015a4364c2031d21824e2d75bd44ab61b56b2820be87947ed5fa5840100000000fdffffff021a880000000000001600147216f7430b8dd968af18428cbef95d62ecba8384007102000000000017a91401c24df0800dbae29a827dc01492d0bcc9d269aa8702483045022100d6e5d8d0d5af9bc8c3a6d234338d9a7be1721dcf2da12214c30f3c00d0b2a22902206a091d537c2e51dbbbfa656543a37b538c21a517fadb32e9622feefcf2011e38012102222d01e8b17d9de436c4d6f1e67ae82ac2086e0e1a7481c8749972738b7b0a050000000001000000000101177ec05d3b6c727e5629b87ac03282726a575a853f7a6625423308fc924fa1830100000000fdffffff025c160a000000000017a914b8c41e0fbc53f98168d02e8c65fdf16e1a21340387c0ccb100000000001600145a7e9877e64ecd8e0a6b1691b25414c198239d0b02483045022100ccb4aaed01c689cbac14e17715613545de2526aedbbf2aa7bbe5eb11b77d3395022034ab043203648465c210ce7ffbc15af3bd60e8e0b389a7402d36e87f4c0b65660121032873fe6666a4681a4c9db957345c8ce498ec7d03287a6af3fe9b7dfa96fa22fe0000000001000000000101e136d64472463924168357cd453a32677c96cd778d0e4ea4164a4accd7d807cb0000000000ffffffff02f2c0550000000000160014e8ea3c8bd139eb0fc3d47a19bcf01b670e47488288b559000000000017a91484a6d0138c2f303915a3bf5f8daa039070ad7d548702473044022021f927df5c6895d86cc95003c407bcb7b2f193a927e0d7b63ce3dadc79ba7c6b022063f656621fb20787d1bf4a160237bac9b421a02a0f117ad371720fdcfc1f96e3012103695c8664ca0368b1c1d7bbf6975890aab0083da8ea51f996215dfecdf3fa95d20000000001000000000101af9a708d1ad225fcab3060b762c879c8044ffccdbdeda0a7889927a07f24789a0000000000ffffffff01e2bd55000000000017a914c1e123a24c33423559b8671ceb33418d78475ad5870247304402203bceacffde8cbca1188fdd172b391aaa24d1cab3f6c4a5239ab68dc6f27e9c6c0220447cfaa454b09b65158bd1a4346e281b3fea1fbbce921ade4394ff3999042909012103b59444f723c28dd21c7b2ba2fe0105c2534442934cc116347aa257240b63c1250000000001000000000102d55994c42399895deb9ac5acd4be91cf4a0fba74dcf6bcb32ec5997aac080f8e0100000017160014d71fc9dd74509d327a2430d064390bd5b7d4190fffffffff171fa4c308cdcd309fe7a3d413f7d96eab06ec47e7f884bc7e5807e0ac7014ed0000000017160014020243e0ec1d7dc279b105cee29ead4338865303ffffffff02e41a0a000000000017a914d9d991c528b2d4f8590018c49f7153f4032f527f874f7825000000000017a9149720de736175c5dac0643a2f77b6843a63c9dc9e8702473044022000ee0036a6465d17eb8dd57f7dd3280a7b328d1b6388b21b7552b69c907720b9022045f72c4a27bf72fd98c86de7ec8e1a230ebd55f08cad8db5ae57ca1b13137e17012102d1c8d5bb3ad0fce65d0a877b55e2039ef427db646066bbb18081f8f11e5bd8c70247304402204c80b588314398e291cfe1b4eecc4f6f562dc525127e105c9154592ce549bec80220110af6e9fcf147aba3688164e2149bd023db434a8777af9a50e98ec8bed749dc012103cf740851702b9726c73a0cee4b511e2b8d6208447bd9360f637b38904f7b357a000000000100000000010106ddc2fb857910aa3c367f84e384be9643e1ac1a0209cfa71857e5cdd972c0070600000017160014d27191651904ea43a0fbf3056977d263fb60567900000000015460a20000000000160014a00bf6092fa323c1c6bc6eaf182ebd9bd4f33f2f0247304402205e5b1d3c0be9705eb288447d11b599c1dabe667e6316fd5a116559a51332f21f0220487a9d771001d1faabdc2dc844a2fa165921f7beae3205ea04a6cd171e081bf601210282647a17097bf7044366cc147358e19fce90f994971ab433e29053e9a9eb982a0000000001000000000101c269961671d920129a91a9b76724365e4dbc8c6b42ff9870b0ba2235c6a750ed0000000017160014d73db8114d7146fffd0d0a11502489e9a686f9d300000000018decc001000000001600145f76940034b0ad40463e7595fda249ad3892607c024830450221009a19c2a136a2aba899074851fb77dc34f504afcd5179344e1abff0132b5081d9022025aaa8bc355dcfa5b021000e5b634703254f14400ed3b3161374d54c132abb1b012103c0c6805fbbb16e71fd61a771bdb6c3d3c2a59f8e204d72fbe491215db388b9000000000001000000000101b39c57bcdaf47000b9ba6bbbdceda23e499ee3b0d142096b59601d8ebbc7e6d101000000171600140aaef1d61037c00582b9e064d618a3065a7befe7000000000124e41200000000001600142511ea2f186406bf69c0f7941b3789e016fe272b02473044022006c4e0626442ad2031227718420fd7d90f3b93ea4f4280858ce2a797dbe7a32b02200f19a49cb8707e0ef5012bd1c725f4101f947e0c757604db40d98e3eba99e529012103b59337128cabc6cc6a9142a397b45e4f6c7f51ec99d570203017bdce7b45205b0000000001000000000101a65695d516fb03e8588df2535ae65a6a3837f00df986008cf927ca181a081f3c0000000000ffffffff02a0860100000000001600144811392b3ef6099cb5c9ee1d1bcf2108c5c83bb2e21ec302000000001600141db8eb219294c0047567a398d6fcb2ccdd345e5a02463043021f7f082eff2d1c4f8b2075468bf900d9800c4d74e58ba061f189379fc3fa53e102201607f9c8a51b94dbf07dc95f978bed70832bea174dad5cc56684f081ecf87da0012103a6b2285c8054d81779187e8f9c98b1306300b6475baee179567a4a45f7d020290000000001000000000101735e01508a15dd04cf145d48ed47fc982d400cda5709ce8ebc10d5dd7cf490ab0000000000ffffffff02961c010000000000160014c1b8b195c9f0c85a9ec5ba834cc890b064d3863008b30200000000001600147c1b112fb4aa9bc7a8f55a975ee80abc37c813f70247304402205f0689644672b286b9a2e240e403d82492fac6ebdf0a6f0191fe2938af121f120220221ba0da4b2e647cf87cb8f4eb9cd6cb3fc2565113b54025aa765b1a88d1929e0121030ca9e4b3543c7675c65885700fa48cabb28907414665f3918dcc1441b5220ab900000000010000000001015e2dbd4febeddbc7df46440b221d5dff32175ef53cbe0153e6e089bd3ac540780100000000ffffffff0299da010000000000160014b2ee41d584240c64a99770de744853459f59d06037ea170000000000160014c4bd77491ad9d0a845cc16a80c88292f979202c10247304402205b96d9e7a3d9ca53cf6396b3add6fb2168393eb60a47dcc66c2706eeb3db05a702202f36b09114088c1a669f687e5ddb3ac7a0e8c5db2deb45c8fe37f82336b4873f012102fa46c2b15f67863a82bf199eb8212728a241c826ab7733cabf9be7f30c43b9810000000001000000000101e7e6e7c4d2f8e03d75f01df666560ec0e5aad0bb73780f17290020e4493aad470900000000ffffffff024a02000000000000160014f49d06d332db837ac2cc5fcd4211cd5a4808039d54af010000000000160014b23bd4b12a536a582ff04000632fc0815c4a70b902473044022067c91448103dab3cc736ffa031d692c1dd1ff862d23ff8c8ced382d671c8c10502206dc56b1da5a148d6b771776e25c3196da59dab52900393fed84ae1fc49449a1a012103f5d42a3fa49ca48e4cb4f35e76322b6fa1a8d2bc1705bf5842e54ec52ff83e570000000001000000000101f305e4b9acac867bb483f6e42520ea7a89a9a5d34418145fa24847d1e9582c9b0000000000ffffffff020af6020000000000160014691dfeb9a276d7355acf8660eeebe238b89fec82590f01000000000016001480b243c1fe0a68bee34623f85fe5a963185fb9ff02483045022100dc810dc3169c3a9c53b3e4a9409b3fc8deaccafe27273b3c13cd7563c6403eb4022005af7dcd5b67ebe654212a9bee18add7d9f49707e38259ac0c368a0c7efa9cf7012102205c78cac4f090df3919c40434f9f45ef503eca180f1236c291fe8cda57bf45f000000000100000000010160c6a3f91fbac59379e98d5965dd6c18020ce6dd4e4564a3856d29a24c67b6390100000000ffffffff0245ac00000000000016001493f198f62a5d64985d09b32f1680b0e3133e07028e37060000000000160014f3e05fb498d27636ba90ad37606b55afd3d2087602473044022041f800412a9aa879142d3730ed18dcd6c7553e7d5a943d3a6858e3f3590e6cfd02207b41b8fd3c55e95ae9adc31a38d44baba47520ecad8c445e78ea8b0ccd52c83c01210255a0483fede7e845dd9cc69df91a29d3a9ee2c268fa3c2eecaf54fbbdab4b27a000000000100000000010186ab1b92c4ce6d071605c1cbd24fa306f3446b3b9d7c565d2dce1adf110e9a440000000000ffffffff023c953e00000000001600147f97d3e67629d6d95ec120fba7ffea057c33661ae4a304000000000017a914e8199791f8228063238c570f0982180f3e9ee0588702483045022100ff4f31e741c262119231e3b917d81f15f56c43ea05148d528c9030ee12afd21f02200c45755aea2386e0832301c2d1015a61f911007d2d796b4f91961b7584146b8a012103c379bc4ae97be96f17a0bf1409a306562a9ca2f51037bf5fdf335c26c75622fc0000000001000000000101f74bd38616df9647dbc15e4a721a29e58072d9f457b2221116d9ba81cf0834f40000000000ffffffff02a65205000000000017a914f7c0a38375ee2637990e80c2d7a46dfeccd748d187c3310000000000001600149dc547026350750a79fd356b00d7428ec6531ab40248304502210084e876a9b958bd6c41356c1e82aca54ff5d3bb63a2b735693354220642f51e3e02205f5ee361af3efbc7ec87624bc285f4b2bf03110c1c29bc68410915baad46023a012103230c7c9235b16401fd84faf38524156091da6faa2e1b727f332e94b45d0d0bc60000000001000000000101f87a0fc26ca17f779411dd1dd6cfc9a5f2c1138c1588c53ad168895081f58fe61000000000ffffffff02e9c0cb0000000000160014d20bc0a6f165ed6590c08ecba05886f98baaca0969a421000000000017a91465d9bf3d3b7f347b2de8958fe80ce576d2a6aec687024730440220482845212742da7a64f99d06ec72efd033d203163f6eabd3d110a6b81b2b4265022007b49cfdc0b5884c36aa9cd00d0546f0317ad8b51af7a82eb929eebb6a25c05a012102d10caa11947f4b13749f706283fbb45815f5b1239736927afcbebc028970b3d400000000010000000001017b767dcb3df89faa22bcdeacb706620240b516dab1f463b8e637c87535a36c540000000000ffffffff02453e05000000000016001400fb44ad7c1eb8073ffa6a7f1ad94d0861b555ed410b04000000000017a91439cb35c87f83820cfef203786283523428235f9a8702483045022100ca4d2cbf289f8c72692a5fc2af2ad91165606eafd399d8beff2ab86750588f900220585d700eda292fcda375960ed9d692540e537c3a32710d9630733b45b50313380121027d851b03573bb16227788b4dee1912c9343f47384ab31660b182aa8d0cdda25a0000000001000000000101f6e8fa5d63dc3eebf8398b5187a2c0964f15336ea7a15bc86fdf4a0c54dafc410100000000ffffffff022387050000000000160014a618184c09ee9ac313ce0b8b18d98be4f4479cd882ac00000000000017a91477f85423297ac38e5f45953cb6acfb77178d2d298702483045022100d6b7f4b22f06b8dc11b29deae1b1b99aa22ed262ef34f37c41c0b82ae0ab930b022031a01f8180020168d3cd52b04a8ef88103c4487bc9bfa5b5540c468865ba391c01210316b72361243d8f426258bfce2c32b8d07ff6b38cca84219cf0fe54e851548e65000000000100000000010154a103cdf8d0e70285e256b20007a04ae35959ec8ae05c22186c065a92396e6f0100000000ffffffff0223ff3f000000000017a91492d536520ff291de22f2e82d99a6989e73ac270d87b2d7e60500000000160014b6ad205fec3b516374888931a76f5594210d5e7502473044022065bff9de674a4c9d8b5d2d5ab70056e6cbae363992ed3eb103be7bb49bd3bacd022045adc91fa3cf12e89d05ee4bc1c17f6b8d273e9b5e8af6265f8a22251eb41d44012102bb47414d3fd3db8e17e53f24b7fccc4725af73881273625d436bff366d68c82900000000010000000001010e0919918902f71375c31d2d349c552bf826b54a56609d4536b86e9c3cfa2a980000000000ffffffff02802503000000000017a914ce5448f41ac1aafbc6a284915a8fa7a09aba5e3c8776c7030000000000160014e6d0f9afbf3e6f9e01a4d872397a6cd61b5dc76702483045022100c0c52e24f8cc43949dd526a78f1b025f5f0805d571b2cf783fbdb35517b970b9022017831c5d2e5f5d24a713247567ab6078571b84ee6ebb2db1cfb470e606d227bc012102f2541599a55d1d2e0a1c5700050359b3fe9a9837ac3b714efd2426d5e0cc3846000000000100000000010130ab555e20c45959ba3ccfb0e2e360926242e80d85bc09ef9eb12c07313b3cfb0100000000ffffffff0278140000000000001976a914c749e7506099a714215f126e828d0073306715f688ac454000000000000016001433cfc342d2eed15566ad0a6afa2666f607a27f6b02483045022100d8d75b51b675dfb9051a1f25cce4a8f6a7447bbbd453c50a2181ef87aad5f7db02206c6eea8b88c63ff74e27de78a1abbec3e7df827dfa2169f5dd9bb0b5f9e3391e012102ed613e6d3af72b506d2baf1b6eb399d511e57af513221a1b922237c582a940d60000000001000000000101e80d29a3072398ef0007e4d6ae1d51245e2b7dd4741aca9d4b0bb1ed820e38180100000000ffffffff022c61450300000000160014e15ead5e95d24a230d364fe0f1d84f8fee3a96b08f72a102000000001976a914502cee684f8f0cab12963c22efaa59d9f384342b88ac0247304402204cf51a397bc1f20d63950a31170e046e71170e56744e14f8708d4d48f344cded02201a402ddcc8171bb1a7e99c491e6619856d9191d906a44a2faf2fc8ab4a5762fd0121032b90588ca36c77a3c01a83e94145b1e9c1eaeed8b2fbd41b8ec6490ff354e2d400000000010000000001012d7c36cd4a6128ebe15a0d9acf1e075d61c2d343ea173ed540ec49231b6e50f90000000000ffffffff02eed90000000000001976a914c93c27c5c82173131d337e63f24436abbeecea4488acee181d000000000016001450a2773aabd308582d70f63bbb06d2a6b6f79d4e02483045022100ce047f6872e5439643f32b3ceb63a632b0f1f58b3dc4d642a4f3afc55b934e0702204c720b6d6f25a15c069a5cbb9508c60781fb185ca21b4e93c297a07927445bee01210300b215b1afce6dc9f271bc8906f267159917f382f2e564ce61e63849142ef7c300000000010000000001010631175d18f8af5b22aa46748dae51d70f64da2d1ece8325144b1f709e0d82e70000000000ffffffff02ecc20000000000001976a914270b0fd4d0fd543ef64083bc94d94fdd23a60b2988acd104000000000000160014fc0b58e69d3ea239dabf8a0977edea821aef0547024830450221008377118729068e517ed7c41c52533ed6c81ed5545588d464f8ddf1ffdc946fa802201aca8346b1f731ac9ab2f16aa6b4a0226affd1bf2b2ca0cd0d1b6b1e83780c2e01210369136281e3aa460485b5c2fde9019f8b2101435616c4f327cec8eaca37c1392100000000010000000001010974aabe690e1e75daa959738fa511b7c30e2dd4a1b5a06a1bc821b640edb6480000000000ffffffff02235b2100000000001600148f73afef271313c68493e86ddbea486fd81d8b6f388d1200000000001976a9145a5fb082a2a4552bec00e5c0fcc9ca985ccb528888ac02483045022100e267931411abd88a4d68cb092bccc47a7d42e6b11e31c421301c4baad9eb67150220426c3bf04b9eded849fd3a41ab6ee3c7bfa54be73d5d41f25edff8a4e53942c5012103e0a0132c489dfbe984c47e6460bbd7176dc653fcbd787ed42b34843cb4a542f9000000000100000000010144b7eb0ea7f5cac7044e07821bf391502675ad2e45b9f1d5c3cee7ca8ee054013d00000000ffffffff0258540300000000001976a91473641c689bb46f7467fbde6b3dab5d38c9edd82288ac04d20600000000001600144baed9d51ae70598917725ae79eb47e1cd6d9d280247304402203a18de02df0c3612b546510e202f7e3580e07d0de19bdfd4e5b2da794b531e0a022064691738e41746fd8775e18af6b698517eaaccd543a81774e37d5272df07379101210219759c219a89144be3ad6d1f36e1c6aca5ccd70ab536a75366fe5022ac371d9900000000020000000ea6f8a8ba4ed8ab47b6a9e3a3479a05d3c31037d52a9e049ebc16f3333102d30c000000006a473044022034f64a818ca5fedf8016e8c2dda41048c9dc45a52703a2ed42cbc2af5db0332302201b3112a9954b726ce9545c52e4a630f71dcf8d7828347508d5945f2f53d713c9012103347199f869adbf727a16ecf56304ec60079b9dff89e1e32724899e52c1264941fdffffff6fc03343a00a1fdf73a14b9e978308b12dd490482f8709a8156a52d9499df83a000000006a47304402203a044fd7052266abd29afa49047dcdc59b277ca693dfdfb1ed9246fbfe6accdb02201b202014dec5c42f47ce63b63e892d107aca338afd1846f0f71b69e9d7ff7383012103f2e6f6823d054b6f10beec6cc003ba5e36e9c4306e48075e275525d6aeabf6b8fdffffff3c7a5d9fa672e310eff0a564146ae912caea727e580435410f5137ce66f2293e040000006a473044022059d9f5e73396e4e3dffcaa9c17cfd9167124fa7627d82f2cd06366fe2a90f048022012406b2a91ed273bf9a57b4b42440e4a2c2b48ee6c3e75d834c7f71c696e867c012103d6471b6bc15e84ce444165f57c4d624a4126ee12771d9700fabc2877eb369af9fdffffffc58acbd92bd0ad99c8549769dbae07a8a28daad18956ef9b794a27e27bb2c960000000006a47304402203e5803c60bb1f64d356546e3d07802a88098f2c202a39cca8cb51a03600b0e9c02204d7cea1d63004c890d9c77360c7e0ffc8d84f205d33b7669a0397246c804715e012103336c69612743dd2fb6b9e6c2402dd655d22e999983c80cdb7e90c22c38c7f4fffdffffff7a9228e7291273056fb82fdff6052f9c76fcbe790162fe6ae2b333d4bdb99a69000000006a473044022026056aad73476e930cdcbae7a53522538dbed4ac22793a584977c8a934b6fd6502206cfb4c354f539b9a3463c111d0f63e26c827d8b69201812993ebb1d44fddcad80121029f0475f4cdd3bdef1cc3639c57a0e378e93a3a53c463412376a99f2fa46a8fa6fdffffffeda4df85b6b8d0d671e09c0a48d7a436f18e64a935506504b3c33d658641a089000000006a47304402201097260ae76cb0e73d66f3cb5831626f99bc5f20f29b89c8e09c83c639c3258c02203a503e88b7f6909006edf57cfcd817f21827ea47359da749947efefb19f0508301210339e0a74b9fc476dfaba51aacd2714407a0be947ee5f6add75271e17b9e451a48fdffffff3a8074ede610fceab5b5df59e483f58ba6636eed516372caa4ad740f21624f95000000006a47304402207219859eb285f88a96fc764cfdccc64fa70352b3a68b6166077368581a65391b02201b131d3a63f31ac239ac48570ca0000fe8b3f3b5e7be8e22b6197aec8895670c012102547b0412d7cff49d20c4efef179f3e504d6c973b737f7e10f1fd6cdd5dc38e36fdffffff8ba415ce59c36eb7805d2f02bcc5098c1d0b5b9e8e86f04f6e1ebd29a9c1d496030000006a47304402204690417a13d688548fa36b19f9b8d2ec5b2db1a08e718d56318d4c498f3392c4022026b4c9dedba0eedafe731f88276e07934fae30bdbedd8c316e8b2112c70e1684012102f140d9265ba5a64b5eec4f47aa83dc2d9b8ac6ebfd759b819e4779d1a97fe55afdffffff1cfa068b1c6e3f7fb7d79b0437ae9a95830dfebbe344fb526b3b98fb5c17ca99010000006a4730440220383b48f4f415a020cdefafc84994592fa724a9355d242eea531adb709db6947102206b7e9d82b33d90fd23badaf4fbb6d0a660633aacf0b89dd3a18cf847136d6b8b0121025a0c694b1c1fb7605285e75266d53a70a3472c71fc4f4dfdf0e506739e1d3689fdffffff2880aec4f0251f5e6f24b180a811a6750bfe76e1b82d3f88f86e111d4d15eeb6010000006a4730440220336e08f71c7fb6a62b53a8583917258fa339847faa334395f969f084fc9ffa74022071a632bf3c55492a1077e661680bd73f1f935617aa9d6435899027192f89081b012103d6471b6bc15e84ce444165f57c4d624a4126ee12771d9700fabc2877eb369af9fdffffff87f1816010501601d104b2e6b8ec90057e9e28ff00f97e23b437c08a74e960bc010000006a47304402205280f0118a6bbef37aed1d73a78959fb41f1e66fcc0e772fd5f0dedc23ee30d202205ddec811dc2049faaea40ba7190722df65849a04cc15ab04c0145c1d5500f62b0121027731517f46a62fb23c3ef0f7de1ed20599efe71542865dd1e12a90ca0dc9d6a6fdffffff8a2cb2d09e4f487371499afd8db48df2f6c302a8e618bacaa8070b40d9a9a7ce010000006a473044022052df8d70f22cfd8db65dd0a49c4bd499fe6fc2775b749fc838ccc2b8ab13f96002201939442a9f708aee482161cb56c7d24f8c1ca14f1d670f4431e444157d33566c012102edadafb7d844a5bc3ba547e70774e12c180ae8a063b4153551018f6ef3f2c26dfdffffff65b07a3ebfa038255d4c407430574a2c258ea4cd908602bc716d9ffbafdf17d1000000006a4730440220185029d5ad32ff60e99f38f4afd5433e0a725a8141e115823977f15560f7eae702206cf9726fa885673b868691024f04c5bf13e578183007dc29046c704ba21ca3e101210384c9b25344788808e649c112202250580ed6f3ab95e3776f43655a8a6744fa63fdffffff396a488d57b939459c45a7858e1e3611a816c0c4bdf4ed625e65436d11eb5ee5040000006a47304402205a17a5d0f7c906bfb394d9946153b930a3ff3202cd82a82fdaa0be22f4bd646302202309b5d9e557e173a57d047fd8b42778f5a07531072cc5c31d8714726871dbb8012103d6471b6bc15e84ce444165f57c4d624a4126ee12771d9700fabc2877eb369af9fdffffff0142894e02000000001600142f2e168354731ce9a4e51d1ff33322da83f2344949a00a000200000006d7d4b1cbd8fbe202ef534ef85180ac72b75edf90caa99b216957081fdcfbf403020000006a47304402202bd3bd38ae772b7a3a98b9e8a32096c5e8ae0fa418336d755006f634dd3a6880022079bb0499391479959e86f5523a6baa23cec583a7a737329067f72f8def3d7cae0121025084cc6c9fbce1af57aec6c160362ec455048ce923c6f556d4bae552ae3066defdffffff5a57c54d38e235ff662d88ab28f251866270fe0bd38c0331d4e1c174d6aacc16000000006a473044022055c2f8b19df9ee54937ac45e97711653f75fd35e9b3240b22971fd0db61f00ac02207e7db62d1307b8e6e6e12bacb37eb6685bb83b7ac92d585679676161e32bbc970121037ab463fda3926d95431c9ca5af596ef1585fd143b6868a8687048cd0eaa0ae2afdffffff160652286276430e10d0b95d4da2c42bd077b764f44b8b8cee4a9dbcfab538330e0000006a473044022038be49cf3a6a06a9266871d9fd86d2ad9420c16caafcb62006055c09b6f89e29022000899e1204af61271efea8e8bf1d52889a7c6c5d8264d4b07280961813b6e0f40121020c289cac83925c849e5f0ff8513e9749e35a9c20bed46cb07310aacedd1c483dfdffffffe2f9e7c7dad795dbb5a705619a606323aa916b28a0f0213e44cec5c62972484b010000006a4730440220593468726ef9a7efaedad785ebf70f7a941a4f0ed18d06ed0027156436869a730220295a40ba9ea47a48a48c911bf4a3c31ddb0b5e1ee2a776cdd4fb169882ccba89012102f90d30b68246074eb258cf5dca319f1327e08d351ac0be4dadc5b2e6e8b3282efdffffff8a85f1711c836830dc29f18e1254bdf5dbeb153bd2a8ad4e30f889d4007daaac110000006a4730440220715359b4e0381832c6b6fb045a0b2b12460dcca7170da5b55260cd047c4637dc022078732c9aa9b86b6aed0a1ab6369984c9f2fba981b74dcf435b0f4d29d93ca64a0121026a6ee325998d91c010006db533bfba58d1cdf525a82e67b85bdd1d1e87ba6494fdffffff9d48e5ed39b3398cbee72ca435df6ce5ae38e0d9a252a58746beb159e3d137d3000000006a47304402206a3e9da235f35c90f7003cfdb3d5dffa32b29d9cb5dc0fa91897723bf0d9a0c202204520e400b962572497fbe8d9e9e39f4f3dcb7ba4fd625299edfe5af734e89f020121020c7cc8e5b268dfbcb316d6f3220cfb6944faaa7787539103a65e8b4ee7d8089efdffffff01844057000000000017a914d3089f14c73e846c8a4198765a89e0388637c60c8748a00a000100000000010212986e45a3e4ba1a71a55365114c543128da88e06570de804ecac7ee97fa55c40000000000ffffffffb1267a84f7d56a2b68959a5f0d9498cbbffff774253c4afc1b97ecfee0fc82e20100000000ffffffff03a086010000000000160014bb88406779eb25465b9b253a4ac455969ca61d2e243d040000000000160014d943548ea4dd0339b0894f11d80d4fbd6b92c60c0e80090000000000160014c8a4a4dad7b37d14618e54827c939ac85b4b99c70248304502210094f2ac974cf94e74c53684034c4c6c791f70d19cd86d0d70b1e5cada017bcb95022029c52714681d47794e9c1b084b01d83891b70a00013dd40bfee130fdc3065228012102b2350df84ab1814ea8bac40acdde8ac347a102e7b63264f74ecc28c4a8918feb02483045022100f2c8ec45ca288a27fbffb76450cb8aa6420693ca41da0cac0e545dbe664f54c602202b5a59db486ec6b2ce2afa6f0a16e6b3cf76b96200fd990a40e3ec1276078d5b01210362e753f7a1871bfefc85f82111ab7e9a7cbf98c32cb0be215c87c8845dd32f930000000001000000000101420fbde4767b4842495cd4070f59829b9b367602704fea4627438de8c3a086950200000000ffffffff017a7e090000000000160014c22e0c5dc6400df1ca05b9da51bca8721f3deaf00247304402204b260594343da7635a368979e89f4e3c4f256acf1579c0df7c66fdcf2efb0dcb02206941a6e431874f0d4fb2763a0bd3c4a87320d77169ba3cfbe633d17f18cb7b5701210228ea8b22edbc842093141866291c8c6e82d029584bfaf1370558c9964ec061f00000000001000000000101eac3564593d21e170e6a9547409157a160eea1831af2ee47e19e17e5bf89a5090000000000ffffffff01e67c09000000000016001442699ad7ddfec2450c073714ea48661ec82c67fe02473044022034b60b9cb97d242082338a4a6ea7b28c8f8213b80a01a61449588ffb2d7adc7102203229accd7806908a7444e17a36bedde1e9970dc0536ade09ac0c76f561127ace012103b56617f96a52d3b1f61f9e0908a96f47f531bbad9d777dcd52f76571effec09b000000000100000000010154beb22cef8b4c73295a285ad387eed75670d71fe992fb4f7c8e1f7d7a0528540000000000ffffffff01527b0900000000001600141b438e79f248298e2ab4ad3310ee258a13e175fa02473044022058c4887cdde0fe8899a45c85d483302c287485abb472d13f4198ed1d4bd851a1022008b9ed04a2468394ebb6d77d26a65ccf1952a6c5d7de96720ba1b946f7a338970121034481d9875b7988e68c091899fda2fc54cd5e86840f544f7a9edd70c9a7c24873000000000100000000010196092c6f0f1840724badc83a72f0316e4c4bab2a9f30d42e1a04717216d3a8640000000000ffffffff01be790900000000001600146e6c428682da43f8ef1df28a4551c663c4908cff02483045022100e17a0728268b0bdf1e56bb57319587a0433662b03a8c7114ef60ea1e09f074100220118f6361cd3bb2ae5d581a6ff6a83c49184caa6d02269fa70ce351bafa735ebe012103f6fe4576bf2fa86f1e2e1d787e8ba4fc0b64839ec7ca8612ca57003b4fd4b2de00000000010000000001016c99e5705f67bb048f398eab0124ba57ef1e1a60b20b8ca4a29f9b7b254896040000000000ffffffff02b03600000000000017a9144bc07b10e86df307c408da115896a0e8293c24c487f43909000000000016001452fcccd71fff47a11202958ffd46028d53489d7002473044022016e7c3f24d40dfc9939b72bf7625636dc9d4b5e57d97ff8d4b28b9ab44ebef5a022004db5cd3dd476b073d74ce7e554ea1c46f6a2cf749675f508a2325a24beaf157012103475ea2f14ef23e2b50dbb770dc15e061096e6cd11a8e77112355295171247d780000000001000000000102ed33dd589fbb37a6e39c77e60d0e18175118522385600601ee5db06decf5dedb0100000000ffffffff1521f55d9853874fe0675fda4f75263f7c62f52b941faa9872eb52ea248000030100000000ffffffff011add30000000000022002077a5888490d2b543dc954a00c91d9c36639560f654ccc3a8b2ae760b370c90a502483045022100eafa7050550a3a241546e704e4ee792f5ea669590d62ccc74baf05b45c4c29be022064286f2f4d03cd5d1938716a083c420b86fa8c65feaf38443ec6cd45caa810880121037995af3b21ce9fd984586ce0a0a54684e4d6ff818b428ae404e09ecaa99543930248304502210090a8dd1861353f129f6ea82d2dc148baffbcf85dc50e8d1f1e40ed4ef07eb9a502204f6c5b24a4be47bbd8fcbf05c97724b918f6e5e6d3bdf596e9a00cd9d9ecb80e01210383ad133b284b581cd0c76ed8c97b747e892dfbf3951748e9362646652d91797200000000020000000363962c743350a7f018f4a6d7c8f6cedb9b9c6f1635d78a84afc7b6fa366295100a0000006a47304402206e5831a3b99ad6b6325021e02ae65a5a2183b894058427bcf87f175368f16b4302202e746ba337968ea7db5915fd71b120cc0dbb93bf5ba45680a3f6a5c4010474ea0121030b33b5d014dff2716b05d3d1d58f4367547b4bf812c6e09798bdff74c95da670fdffffffc21b5fcbbe45b85ff4595ed6bee4a4a2a37db9ff96065400609aab99edf43462120000006a473044022035a0f1267259c297abe6781258c5cda2f27b285499f001fb67bf1fbab065d2ff02200bdc914a4962d6057e2dca6a3d0a60700610528f10670540e5e2338ccda83dcd012103abe172de4c5465d563634f3c1dd19c0bc0672d4a93db7deacf15e6d122b0ef41fdffffffaa7e9943c45d417723e2ef222fc5b9681da11cf08ad0d1d751379cf0bf3d8d993e0000006a47304402200e14c486aea08bc9fef7594fd05c1ca532719a0d6fb72987cf39b1170ae0e5bd02203375d6bfd47cf547736982fd383ca039342030c929be9d4df182c95f4c2ed0c801210330709726bb8dfc7d1cfbfc6b24ad64b9fd6d67970401d38f071436aaf0f08516fdffffff01cdb69f0000000000160014efd8fe1087d4d816d273f2149d0eb1f134064b5c48a00a00010000000001010d911490c7ce1e360c9783ea7aef5f31bf118e700acdf35d5838396faeb8d53a01000000171600149842bb769401b960c832c134e6543efc9d5f3a82ffffffff0226c4eb0000000000160014e61a424dfb10afc08c337b811dad70eb3cf732ddf69fa1040000000017a914a7173d9fe8c95f08fa54805559cc9246069327d5870247304402200e5752ef14b822ee44490643757037555f93617b48fceab4417b7e6bd29c3c7802204fbc2f8015e6fc45db8dc76ac2333876c2149c7ecd3a78c517a85c974621469b012103466a68ed405aabd9b9d03825734262efe706727ec06d1e8b321419ebbc38afd900000000020000000001017d9119589639eb26ff4f4add3ce447b726a807b026bd9599db24a3e093848b420100000000fdffffff02d8ca02000000000017a914a3d623f95d4756e062823924b922c5b94098d46f87387f2500000000001600146c99da85e04aa102cbef6c862aed76e236a9798b02473044022064683c08f154d08c6a12cd49031abfb2e791b1934da59c64fbecdb73ca0e44f6022004add8278d4efbbb1388cb6b5b4053f048b554130fc0e948fe1c633bbf102905012103a5963d2470e3c0669c2c826f69e0fbacb2c03d80da883900747417e839e7f9dc48a00a000200000000010153c14c6539855ad8fdd20a88b9eb244d74f5e213f7c3d7b125ca442217cd9c1c0100000000fdffffff02109e01000000000017a91497a42e23b428f35471f999536cf961af4eda69588740dd23000000000016001479e682d86ac5e1a82f19d170bdc27ebb0f2498730247304402201aa6e0a22a4f4ca8748fdf3b27db480f7a852743bc91ed4073a3a3fdd3f46b5b0220350061443c4008aaa1a71a720528c3c699667aea622d0dd7d6922b6fbfd97c87012103d435145fb0a8a4ccf67bde6a374fc29616d47ce05656bf6fcf07353d3bb2a8e348a00a00020000000001013de066c7788175aa2a6d7c5ceff5dd38d6474b7722fef2a5b17f6b8945295c880100000000feffffff02494009000000000017a9146f418a19ac81853df8766c5901a733b530fc582087677fa22a000000001600142a9b61b7c59c69816cd170b4acc5cc2b16c390100247304402201a4b307c09316fb67ed8ebd3be4b1c9f50a7193944c303e72d53509ef6785ccd0220071ed176d4f3b49e825eca3066076f52866d60e85e1fe0d14968a9938a1a8b550121022688ca16ac3af10a200ef9006aa3f4fd63b727de5ba3bdccd4f9736b06fb18b10000000002000000000101cca6b9459d2478b4f9ab34d9c0470da0254559ca2c0b955aab5385e7144d28550100000000feffffff02749c03000000000017a914164af5551377716f83608f11cf1e002e9b5db952873cf7280000000000160014fdf216afdac66d63c47dd4d00a166d8207e077b602473044022013e78a4ce7ebdbbc0a699e08b9a6e1522ac254a9b1aff8b96917330b930bd67702202cd159e230c76084344a461dc0ca0c801e52727b6ff642360523ee81efdef79d012102d02dab758a3a9c4f05d3a650fd1dee85de588a786ee16b4208454cbd5cc9ebc80000000002000000000101988a29a0b44eee9957efd8016a4fe30befcd054d00ac103525f0eb2ef76caf0d0100000000fdffffff02b8ff01000000000017a9142edac31293da2cdf210dbf867879c97736bd023787a0d92100000000001600142e5d549ac8459994c5202818024163edd5355ac70247304402202ce7ac14ea132881fe37a2df8fac8aa3b3743028322349176a1a83016a292c1902207d03e842e6486756be0cc4d05747313dc9ba13ac0a8e52bc7cf3015721a7c2a50121035c384579ba9f497498045fcb5e0d054e6dfc85b119c27c46b14f5038a948d6a148a00a0001000000000101bb8cbe305578a475dddffc070839af431b5f8ab1bafd395dcda577102aab07bc0000000017160014f919ab55bc9564e2fcb5f3dd85d1e199010bc88bffffffff02872b21000000000017a914d03db8f9bf7cd1cba96dfb2296d91c00a5adaafd87a89521000000000017a9141df458496e363f56c070b586e6d51f61a5714acd8702483045022100d00dd7429f253d17d01ac07dee40e8d4dd5e206bc9e094b303a6f0dd32bebb9102202718b74c89c13d2ce10da1c694dc54a38fa1996db4a86f159fa616d6464f38f40121026d55545da8b443f68f7d45aabac64dcd569bbb4c54f50f1e67ea20390ca9f63200000000010000000001015037bfde014377bb6d37af629e9d591d1c5c73e4f8ad09f07acdf08618bad8870100000017160014fa89b921fb9d67ef8ce07b3f000b11849ab6b17bffffffff020fd60c000000000017a914e8c74e1ff50145da2d57bc288065ee95e96a34e78740bc35000000000017a914668a9f7d2021c0ea1a1c6e870b093a3a3a0ba13e8702483045022100b0a8bf13ba392ec5a27749b03c70178709fc8cd165b03e476462dcebf6e07e37022063a89900aef40838617514362cbf0f92c3342d9d2e707b2ff3071358611c6ceb012103866bd62e9173b7cd1de5566fb6548122047fbc70d65b1c19cc96a79c8247a2190000000002000000000104bf24d7c7cac74dbf73adf988c6dfd68628dd80e52d23c47aa569f267fba9b94b0100000000ffffffff0e62f9fdd26d7e65c9f61e1c6ffd704fd8e08b650841d11d1ecd7331d7209c3a000000006a47304402204d6041193166a19299f785352bb84334df97009541fc6d3140d5280664d3165a0220409e3baf96bdb6ed72415e67946cf7bcd396b1938edeeeb4ff958f4839c4fa64012102260cf56a5992759b64634e607b72053ab25f37cdbca0ae990e4aaa0bff9aa172ffffffff7249174d18ea054afc26723c28aeff27adbfe1dd4def39af09c77204bada6b09010000006a47304402200c35f003be17cf9b42a82c02ce9fc16a1bc968baf9ce94ce2f629fb5b720fed602201a4e5b67deaa764a02cb689c40fa45321d994ceefd5cb68b833bb65040b336310121030f9484bf763ba96bede9b039b1c3b278c36d0cbba47913eb4b6f6873907fd1a3ffffffff013a4b5ddd8699fbd94cc98ec9947ae7cde7f896ba618ed46c2106aa7c4e5d7f000000006a473044022057eecf7a9a4356e8358e95754c416da09dd1d959fb5cababa6963fa4f17fca4302206a4af0801b57825599b54fb9289308d93bd1875bd3ad5b285e8034e6f2b387ef01210389743af2d1a4be8ecd7ac1707ac09ab7e688d94981295b628eeb885007ad43e5ffffffff17a00302000000000017a91478d04a77681336a45e8d42c4afe6b1a0c7888b9787b5ad1c0000000000160014ed5b6a6f941352db60656a001eba905d65665a7d510c5d00000000001976a914ce7dce9ee783016f81f76b5b3ba97334ea18a11e88accc8a01000000000017a914b6e3d4b43463acc853c962c95730d6a0b974d34387e88000000000000017a91452e7e123a8a9522f863e8083fcc81dc6defb88838744040000000000001976a914e51d9bd16d935a5246e0f3994f16042e5e36befa88ac43c707000000000017a91494a1febe8b7af395c54c6ca7b2710cffb7d8ba7087850802000000000017a914e7549918d49fe34e2cad0f26f50709674e557cb387a08002000000000017a9140bbaae88315ba9fc19e1832d15d4c6472693e1f08714dd00000000000017a914eebd7c90a29dd4b04c43143eed50331a1244044087de8f01000000000017a914f3b864deeac85a3b71fa997a9030a22e48df785887033503000000000017a9147f53a0274e0bf399a2be3f570abd4e0db6754e9b8707ed0600000000001976a914f3dc82e02f3135b1d4a66bda463b14c939dda79188ac2f5263000000000016001408ceceba82be8ad94918f19302bd1fa99c11231610d821000000000017a91463061a4f60eb49d5e68c4b8483f9c69e1256996187faa600000000000017a91454a9cec2214ce7ada9f3aad7ddd458951e9c3aa98773d524000000000017a9146202f6404197f59fe119ef5ddd071f931150337487101d0a00000000001976a914471793c8ba8347a74745e9df3096749485da215d88ac504001000000000017a9142a12c3c8382554c1b5c51b94da4a44bb08855d08876ca35100000000001976a91470fd1ff8ab7a316ecff56ab560f4230227a5392688aca8200a0100000000160014ee3822fa7f3b0b0723aa376561c684d6e3b68d7f04b900000000000017a914e9af7babede626e0ef24db7001c267d38aa677c38750ac00000000000017a914db11406821e02feb476aafbffc9dfd5b210a8f3e870247304402202d48f68614523e7c71763f62dea052bbf2a560484d7bb264aac381037a7c62150220422c1f4b4a0b89bd0b71a3a327505c4c75872ff5de6bc26eb9685b94a5a5eaf6012103bf26ebc56159ac8c74b9de794e9d5beee4d204a5a6c5c301ad01f9de2042c00200000000000000020000000001028b292835acd0c056c0cf8f78f43c55a815f29aeba54a9c9bac974c39d6fa86141400000000ffffffff7af747e5034e06434eadf5c092124a1c93181dabfe59474198eae0fd2329eb1a0000000000ffffffff02f83e8a00000000001600148f144fb499d02bbd9ce0ca3926361368575c317bde32a700000000001600148ec1474c75a40a9b365b1a2b1efe70388748b9b902483045022100b3f4329dbcc82f00db8685968c7312b8e545107a388b531c5843910087a7c4f30220500c8304f27e39e34424fb7b27d3b121e4a8c2d8f78fd533f3389639fbe5fc020121024ca2a9d908408e56bd98f11adac8fcbf284562f352504b3ced3c06070b12c90e02473044022035f1a82bc4fa62918663e1534167264e39fe8f81ae15a275d71e61c52ac537d502202019fac7f5979a10a9439f2ba07cb6909df80943390e3c7041319c376d1048b601210346ea9de3f5ed1a3e3cd50d0414cf9011832aa78b1af87d1944a45d2d0f882a98000000000200000000010106961ecc8e386da278ef3422ce9270579c9c797852ffb166a30bcce1ff6591c90000000000ffffffff02902a000000000000160014cd0859eeca492deecbd13fce12eb669834d50887430f8a000000000017a9141dc25560a7a1fe1d15aa3b1420272c0c098a29698702483045022100f034bf423f3fcc6243656a37924ff4e4acd0ed5113d35e0a16f0505e9dc5f79702204fb192b393ed727194fbaeb49f506aa35075ce37e72d30ca44a780346fb24a13012102bfd9e0bedccb9d3c83f51dcb930d21e7b5fad75f20ec75f8ce0c1d4b11fcd002000000000100000000010163b6d1b27e6bda43edce822aaa188af739aede683975887c736dc9afd27462a6000000002322002016e16ad64f1a7e57a4b5abce824a3b90e33e36a9044a41755463100050c7d7efffffffff02bd1f0c010000000017a914b22dea9041dfa491916ca231d8af30b0956d449b87bcfc0000000000001976a91441e84d751a727b6bbcceb962058b62c35565070488ac040047304402204bdaceff083b8f4184f8a672bb00d136c34ecc9bc5a7492d20cd777c70149521022041418ec59b81515c89441dab47bb05f7ac6fa28e01927ac201e6f5ff77ca8ca90147304402202a4f8518d1e67423220a0abbd4c365dada8a957daa5deb3a995bd09694aa92c6022055e271c7d6c08f08652f313e53e4cc5b345a6cf0c95abd5ef0d267ca84a4b1760169522103a4cfc162ba64291ec24bafec179c9db7520a83d222d0f08e88908200c8ee000b2102826f932d7c52aa99f7d2b559c4663a55edbbcb235e2ff7966bce3bfc09e56be121039ad8a3396f6fd447948990a09c94a79ed74b39ed99e08bd908ff1f5bacf103bc53ae00000000010000000001016b9046a452c4d71350df596a9132852fffe809df422be2b26a764f881b93497d0000000000fdffffff0295030000000000001600147216f7430b8dd968af18428cbef95d62ecba83848f800000000000001976a91479024a7d3232e1fcc42a8e70041eb178bfbac69988ac0247304402206f2edf5dcdbf04305f48d04f43b62bd4ffbe753f73df2af1ab4f336c163602970220608353b6009da00ede86f120f8142b86bf10b59fd024dc088c97147acc8be7be0121025b485295cb51e5e051918ef8b48cb408a29e56754e24fd93307ea6bb76ea0f6700000000010000000001013c2227d4ba73a104fec764cabb57614de157797435ae19f97f1e7528c72d76ce0100000000fdffffff027c3b0200000000001976a9142c1608c0d7ab3db8660a1a455137c6e67a26475688ac56e12200000000001600142f01f52fd495f2329c166b8092de4396263fd68202483045022100f57b03abe976dfd584fa7eea34688a81cb82e37a8404b2915e2e38652ac927d702202d9c542ef9eb6f9c114654e0e36e418ec052c3249aba543dbfe4db780db4e1ac012103c97247214678942debde67d37f57ca8218f92570fdc89d87dc6a7bbd1cd16b030000000001000000000101d24e4acb3704374df92b4f1bcf0e54b196272487a59bf4df3bb1352c81e7cffb01000000171600149e59a420b92ed554704fc1a9b4ebb931d9a85e69ffffffff02bb630700000000001976a914264b9e9c9ebd1a9735ae725f9b90c9c739c57a9688ac0f5393010000000017a914e01c8ef7bbf16ecc4f43cc04a5224665d3e0fbb98702483045022100f00e9401ad7705de9733cf8083ad7b671efdc15da7d365f2cad0466fa7105057022027e4f34a73e12c684cc2f31a852b78e925491e24af070a91b90b901d7bbfcef80121039cebb8c8ad4899504169fab3a95983dd977c0d67c15146c06d7e42ebe9a8bedd00000000010000000001010926f7643147dc1c5c0262fa386296ed295ac9c9bf3bbdfc4ad85af48519983a0100000000fdffffff02e0dd0000000000001976a9141a91c231af09fd06410dafa778d455580aca21d888accca31700000000001600144b77d0a8a9fc2330cb9f2c6f56ab58ba20f039fa02483045022100810e7449f8b7bfc615f3de1fb38c44eb9fb3057cf53ffba1e546a07bce8df55002203a9679cc24e699c23c48d5220cd9d7a2cb57d0ea66061feb09797b2b91e33c2f0121036cbf1c0c4a6ebd799497a43a1cb8f620c0568392dd643b69bd9d958260adb90f000000000200000002da70da0b6d297c11dd303e28748dd099d0d2002a5a725e8088c06734d373f523000000006a47304402207b5d81066bfed6ebaab2d2a5abfe9d8fe3b3cc0cc902c7b45dac62e3f9c6ed7d022064f66fa2c5dcbed1aa5bf06af78bd89a8f7f312eebe70998e2a502a19df16069012102e0378cff34c718f17e6c1c2edbcbcc5ec3071cee9eba11a7e2a23a00e2b08721fdffffffe4716a8991a0114a185b70f59aff5374042818b26a8bb3de06ae057e138133ad010000006a47304402205f10eab512a1dc30adbfd185451d00acf7711edd98c98e799b06893c5b7131ef0220634d96181ce661a7f4270a52ab06a2e4ce8ff1587dc806a57a15a3081a7eabf9012103511afd807e923258e16612cf09858f57dcfdaced3fb4b4015b71e943367a28defdffffff01fa940200000000001976a9142296f4973572cf0c6e95f3b2c0e6c65954f981fd88ac47a00a00020000000001050c59fec7cfd2414c4d47073cacec3e972b92a8b63b70e3c300f4ecbe1352ee340100000000ffffffffa959e851ad65f5c20676e545fea97d720f0c0b92f5ceb48a04f0571de22e5a8e0a00000000ffffffff49a2d1667767bd51daf46d2060c710a5f915ac8100ddfe305146fc8f4e753fab0100000000ffffffff1a3c8cbe779ea418884c3c9a7616a4933e0de9f370a57e64a1d939fb7bdb95d21000000000ffffffffa56fe50325d59dd8b7f9a6512eb9d64b2d049057602c7b37cf85193f0b7670f20100000000ffffffff02220200000000000016001490a54fde9b747f0b0683ecbc3a25e84b13559c74127c9a00000000001600146bae800aaab60e2ad8cec236650075d5557488ec02483045022100dd50b2f2d32ece4633c34d525451f988226ce1e4437b4004a7296549653e19510220178df882dabe508399c59a1acfd813ffd0b2bb02cb9c0285af8c2a2eb2431213012103d767796dc3bcd4c2e9b15354988c2d6a0d14c0b85185680d57e3117322f8114a0247304402205d773cefd06a3a6047cef0a864a7fe0dbc746fd548a7b31d3a6ad9c661023aa002206a94bd097691880e9542aaa44a74e1efea6a941b4604a4ed39dbdece83f27bf00121026e63272a4dcf2c14897e706ec233b2bbefe02b8cc793ea96b3843d03f6bc6f470248304502210097fa34cf4ec9765330c497b11042d47036f37fb08c3e32e86e90c7b453dc95a502204aedeb643b0b9620154f9e5720c285a4966e49ec2f710c8ff7b1c9f8aef116a601210250480ea20c8db5d4da7958a006e754e6c9df5d1c7dc3cbd814fbdf4c2abe5b0c0247304402206d6e4e70986cacfdea4fd49cdce306441fadabebc6a31f89adda8c9406657ee702202aafe6847ef5f2af3c82f98a9742f576284611e191a0bdb3c2d2e2c45e07e3d70121026e63272a4dcf2c14897e706ec233b2bbefe02b8cc793ea96b3843d03f6bc6f4702473044022025d90d836ddd9a247629a23f849a00cfdabcaf81956a02f7ab0d66b5e2d0b65e02207dd90a32c08d7f5a5ae8e12a5fd674a373988fedf737b1e26a8415fc45d297760121023d66d118f80b5be2950fa8a61220bbb6df18a59e3ba3cbdbfaf53f25ee8880170000000002000000000101d222f84a4a33fff744828e92f6d80fda982590b126678573cd612f054f84b1d70100000000ffffffff02bcf003000000000017a9141d65d8f7c7071b7e83557c56bd381f1f93563dca87318696000000000016001421059c992a43d98bdc9b1432ae1ae79ac2e0006302483045022100fe7c1c77fa1ed7311386e830fd42ef0be6c3b056402002c77b3e9b8a7959585f02200bcbba195470be4811aea4dcc19b1ac6649537680b92ecf65549b8e695d0d12a012103e048a6567f6afd6a36dfa02e60cba80e62b56064ee700cee3efee168ad8e24b9000000000200000000010180751518ff7121cb21d071a6afc0869c3d8d1db121c490cbc226964d02ce77aa0100000000ffffffff0277e107000000000017a914f2ee97592326a2516ca1bc2e5a05c38c81e728e387dea08e0000000000160014dd36a37091ba0c8dc9b0ed62cf45375224a9bd3a0247304402206f856ff7e87fa9bbbb8a0f322e51713082297df2fc829317a99a690b3d2c3f3b0220724c9d0fcac869b2da24c6570d2071e4c5e57354cb4672b1e6524219ab55afc501210268316495d02d9d159af051a5a308a05206dc89b7d67e5574eaa85edd534b4eff00000000020000000001019e050cd2ece8d9912cda974d2232d475f62c1d36dda423534d2da86dd5815f160100000000ffffffff023cf807000000000017a914d3734d4bd96901e76b2e2a79b0d802dd7d36d82487c6a4860000000000160014fc01de2bda9490c2f04ea9f49537aa263da1608302483045022100bff03c76ea3871dfc4980475e55bdb05080ae98bdb6078928662db95f75e8a7c02202dd37a940b80207051e75ba19bc5688109d4ae667162e22f7dbc2ed14b0a2ba2012102c52e1fdec487e9bbff0ccec0a2cbb91343bb22d66f365a924c6eb11e3e6be8a50000000002000000000101ebdc7f48ee495aedd3a74cd7b299530e1395b4ec6dec3171a9f0a4b9ead5837a0100000000ffffffff02ca5105000000000017a91422876cc4b29569b7701235d1c31c105a801583ce87b24e81000000000016001428b89d620609749e4fb9065a7c64588846339e9e02483045022100e742fe0385d2579cf18be631f35d3e73647351d508eba5aa161d00d3f9737811022016b6d115d3ae604b5777e2cadff81d3a60f1d7ac06f28bf1afd48329ae4362be0121025750a08390cbc15f1c29a11c5aab7b3a369c8f4044b869d1045a3e34b59e50100000000002000000000101a450b607fad051377d983c3aad1dd216b5c7510ac29816d691ed8c5fc5a2a4660100000000ffffffff02087203000000000017a9141b328b788e82680d33e9d3786c378046dfa718648760d87d0000000000160014f9b80b9418617f96fc609c81f81510c8a63fc04002483045022100cb9fc47fbf46cddb5afdb89c3fe736e45eecb489245608a13e1b32f6ae756b0a02207887621630786ca522893f3974934ea50bab649ff6ad3c50fe78a047342960f0012103d5a88966cc453591eb32ab929d0cf4f703de6ea284e2022815dae4d275c9696200000000020000000001015e74c922862c898e73a1bd72c3e8ca20c040b3366f974a40724aa1e747aec6880100000000ffffffff0277e107000000000017a914e2847067fcc2f3359b0d59661dd40e3b163409b4879ff2750000000000160014cd114e592747c0542177a422fbb4a5867d6dd48802483045022100e923273fe57b4b613b41744daee38dbc6512f68d51943dd8a94b0cdf0c50a20202207e364518a1d728f81a53b12807d49230a630e27491612b4f961f2faad80fa00a012103e35b8749176ab918de3ccbb50d23fdd697f30095c99739b9412d459280a2e2eb000000000200000000010163a40fbab5dd2100cd2e135c33e2015f294bf16bfd7a42d94c7d045001b9fe780100000000ffffffff0277e107000000000017a914796570a0c3dc0afcd90bfd19b2f36e2377bfa26887de0c6e0000000000160014cd114e592747c0542177a422fbb4a5867d6dd488024730440220642c3493c0dc5684541293ec8e51ead4a1b0c4b4844ad70fc0fa56b54588d0cd022007aeeb25c60ab300fdbafa370a502bfcb068b3976b6c4b9ecef00d3d10b54ed2012102dedc87c18b69d82d738c3da32c1614649d2f238181bb67a4b150166edbfddafc000000000200000000010122c7cd9ade331927ac453e67f90ef1c2c31066c9b1fee4933ca28cbd85e52dbc0100000000ffffffff0219e905000000000017a91401b22855583b814139b4f5ad8fa0232b74ffd21787321e6800000000001600145321a486525a84bee6d011ac63e4b752eb46921202473044022051b72bca5f90f92f6470b9675fefbc7ca8473f31882b458d48868c5460d40194022046e6e1265f79ee1d1d072a71ab3c9f0bf3bb9dc46151f2a592a20ea2d58c99c2012102dedc87c18b69d82d738c3da32c1614649d2f238181bb67a4b150166edbfddafc0000000002000000000101529cabb85d30d61883685bf4b35bacd59b11e8770ba4d4d78c73f2b830a350190100000000ffffffff0277e107000000000017a9146227046ddfa0c6178a0d1232ae8e4419c27de2d1874c36600000000000160014d90cd13790698e4f4fdaa00f14916ddcc7b33c7f02473044022038fa89da8433ed6c5e1dba4b1d311074d6a99de4b4a4e2f4bfe25a953ebf14700220336edf5db8470c62f3fd59163aa8d832befda4ecf93089ff22f45f1fb1c8dfe9012103e0178f896c6c2175e7ca0670c3bc2f57f8b496c66925218635bf41abdcf0847000000000010000000001049135838a4b034ef42891d390327322e50dc72292b19b9f6904799c2f15149a3f0000000000000000004fc7f207ccfbee62e9b3958014438bbdbc0130138c5fa4957a3e9c7fa418c7141e000000000000000062110d192e2ed7adc33692c9eeb9235282e7292885aa73718e68c82664eb52200100000000000000001dcf8b8cd761f5caba544e323cba7b74e48a9908d720225db3e56851209eaae4010000000000000000022ad86101000000001976a9144245e08ddf09b4a547f0263b94e935efd5b6cf1888acf230c7000000000016001430efec7145e637cd125c3edce665fd31ad88c35a02473044022031828920b318bca9f9c959c1f257ce9fc758d3a7b5954b0bb04725d35699849902207687cb03275cbc9c4ce4226d13300c42093d5c130bd00a210b714b4397ad60db0121022cce1f1ed0c2601c06f33eb6077a23eaedaec0d41ff76eb8423bb1651112a96902483045022100e5f762f4cdc77cd107eda42041f9da0273971eca348621deb1ddc1f7856d4d75022034572a208b15bf88c0d7e19387197f95eb4a8a19ce6ee8b332d0ecbf261bec090121022cce1f1ed0c2601c06f33eb6077a23eaedaec0d41ff76eb8423bb1651112a9690248304502210092a5683d7a94af4d8bc909c9836d61ca51d2c33c38824a3289af457e4af627fc0220793e52a2001df3f1ba83bc27117690a825c314d1271b4e1771898064ea4c21f40121025547438bdbab8e8335a057b2687cb710f24b9aec9bbe2747cafa2e08a2c2dc6e02483045022100b85ade70a7d65e71c3fb6b4bfa53d1336f6490b81c428abc23f6b0d92a276d9d02204e5f3aacd517486d90cf52dc9894b734119e9ffc26e3d86a1772ebe3d91f1bb1012102cb23221e08f1d20ad19e47661db8e2fe32d093a8a964ae9bf702a8741d0878020000000001000000000102a8d520f89153555a159e2706e454192a661f97162dfa74621dbd7199eed0b5cf0000000000ffffffff5addb8b409dfe378ac252c63fbf04b1ef1f0972eadb2326dd372cb32f0bcebf60100000000ffffffff0226e6030000000000160014f3e7491316e7972df0f154526cccf1c58652800080b501000000000017a9141f38e2c290031b8fb46a5e7e7149e736de49c1448702473044022036bcde4840d27eec04b560ce3ce5a32d179037cfa232e83dbe9bde94a5bb12be0220142a24942c1927b46521b9711ebecd5aa7dd68f800ad6350f75407ba8bec753701210275f17e938496c111cf88a9152e8a71a9422f4749a12ffb88bb27e68bf977ff6b02483045022100a6725c1fa7c2fef83fc6f5a1a50e29a70d332b921cac23f8487cb05d2664a47b02204c381d43fdfa2ab42580efb36a003f1c6f6e4f90deb84393302a56dd111e58f201210319bb1487d0112d5209618fe7aec18ecdaa670efbc93f037337a2bd0b8befe6fa00000000010000000001012766b92c26a4fd6b1dd73353fbaea163341e96adf0ab56492e6f3c79e14a54110000000000ffffffff0280b501000000000017a91407a67bbfb6dbc458ae42dc6b6ec3bd7b2ca463ef87bd2c0200000000001600147327329ede6c3c482356f6b701b9f3dd9abccc3c0247304402204a8d1d258c861e6cc9390ab5ab828c146f31d9ace820d75b298c752501d57e5f02203ebaa229086ab555886ba64dacf50463e13c493ee518589bc0490ad650bd0a2d01210224237f37ec3e1121081a511cce1c82637a175e076dd074b3ef0646b7812c6fbc000000000100000000010215ab51d3cd3fc923cedffb7db3fe183cc0a41739ad3c610acf2af35e9a2554820000000000ffffffff4bee2682ea2dac82a785e17a09c2ca6b7c2371caed120058170b58a3431a5fd20300000000ffffffff018e490a0000000000160014112f338dab696342c455ed0b5592a1e11f95bb7002473044022030bdff0f4452966092ad673fcacc82398f48bf93226d2c8fef42d9323ae7bb0002205ccfaa952f9ec83c23dac6179cde646018da6fa34d04891f8da0bcc048f082bb0121032583d022070e87f6186a794f32af960fc728ac20f06e50465c039f839047b1e5024730440220691f7a3e25c767ac2465371e0dbe0f59747c7c796aaeb2c0737ab3975c3abf7e02207ec7ee3df9abeeff92aafd98b98f33416134f71ecbdcea58079d837552d154da01210298ff325667fafa47f9075749dceff9ab2f78aba6a27839ec000289257fc76d0b0000000002000000000102a72301fd3a180473d181a0ea742bc6208d950a56cbb24897ee3e1bece5e866708401000000ffffffffa72dd81400df77d41b3df09089f028db5d88581020a9bd52112ac26ffd979b8e0100000000ffffffff01f81b0000000000001600143f206ff4afc67ec143d40b5fc5e562c5c5eb15fe024830450221009877efe830ec1a8815bbdab8c14c9b254fb516c6a0eb5c2340f463b5a95d11bd02207cd7e2ef5778cc23ef28d4c2c98aa45608a084c79895e699e4ae995dc49624930121026a402d9d8355ca07010c6bde4ddfc81f08c1534dd875a8714e574b2ca8f0542f02483045022100d818662d99dad0c3bb5e1aedebfd005b3526096f489af445478837c70bdb347202202e14dfa5d93cb973a4e200d8c6ce0117928e7151e1ded60dd7fd71a0116fc4c40121026a402d9d8355ca07010c6bde4ddfc81f08c1534dd875a8714e574b2ca8f0542f0000000001000000000102f8f1002c24321cd76b04ff1a6b9bc7e9de054a40d594bdf4c76437d89530ff580100000000fdffffffa3e72d11d5fed9b5fe4928a56867ecd38f806064be505e2dd990ce34972e86490100000000feffffff01a1f80100000000001976a914f1acef8f74a982d500e0a17fe8519140f2ba28b988ac024730440220046fd0629c5a001bb3cd51c663fd4660a7c185aa5b06507460f1e202ba6bb14f02206a758f185e319ef31b120507da033e984475c95c48e97d51846b69aaf1d95a6c01210341524e0d7960e47e00e6e03da3a90326bc24407bc664b95d33a268ee187668fd024730440220516b90ddbad65350844611230c753a4b0d08cd63a948a61768be55e847f9cfdc022058322ec40feb2b815f35f633c89451161f265f0d2ee2387185ed32d79abc9e8001210341524e0d7960e47e00e6e03da3a90326bc24407bc664b95d33a268ee187668fd000000000200000001c441e718f7f5478372d84f0dab35ee1e24dade227395605341b8dcb3e77b2785000000006a47304402202cd1a48d36c98edb8e8fd3f5f41e4644b4f9129403b2b9d3d742000521620e110220262f3c55780d89155c9f6a14f133680f9b867eebd60053816bb59b5b8562551f012103f982e3c95702330215a768bac4e9cc87e5464433998824116c2cebf8e8daaed3fdffffff016efa1100000000001976a914621ffa3635fc6910da09fd922f167f7613777dd888ac48a00a0001000000000108620137f7cd13f2c7b79437eb83fe899d1a53a92cb9fe4fcc8e523d08a189f9741600000000000000004c49145667e2f5a45e9c53fa7a084d63495f3d9f126cf7620921db88975f708d2600000000000000004fe3c4afe044d772cfb7a627446d5e6a47e8964f5304a6a649df8af0fabdb4b72e000000000000000056703e2b68fb676306988af00267f5dc2de18dd53cd2d91ccd8c3cb3c0e6d10c2d0000000000000000dd17c2c335a5a4fd149cca72febe5c2412c09e2bd9cd8a4f7e3abb966441bacb3e000000000000000015937a3cb9b31d673e0a37c406f5840966d1e27d2e263e05a97d105492caa868120000000000000000c0d2e1e74c65a719d52e4df6ac710d6905947c0598682ba8c2863110b8cabf03120000000000000000e476d26a328415815ebb4b3184bc453c501d3ecfdde793517d94a2344453e8833300000000000000000148942000000000001600149342ed9ee5334acae0cfcc50dcd9390c3672f2de0247304402202591d2dc8c2f1ed2d668c914efdc2e3f9971f43de382c8d46f8d1ea4dbd146eb02203d5b48888d8ebbbaa46ef6a2061b0f8e0aa87e1bf62fd2ab71361c43a49c1ffb0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d0247304402203249f5156f356499bc580a9fdd95830b69f12c157421bc1b3c4c8cb674e100b1022021ac5fad7a733047f06805ff8885dddbbbb765c6b0bfaf2c7372934800265c390121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d02473044022021639c353ba87a31cbf5018c7a2c9378eb57b2b721fd43e1029a11b35159e56102207b7cc21e8a02177afb969fc35b3445180cfb7ff96797cd8e3634ec1fdc28a97b0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d0247304402204a91bf1849ea24d4b3f4c487d77b1dfbf19e015544347ab7ae682a268924760b0220667f1ace024d700d9a8e91f674b317eba748cdda3ca5a7b782b7299025a9683b0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d024830450221009ae183cecebb9a43523d37399fccde96190b48c5da26f54d44078549decf863e022020bff560a398ad9876aeec326e13608a24b691f53793e86e5753a9f36a761d140121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d02473044022003bdece58759c428dbbdfe27225145d3fdab2a0b8eb9965dffb8ce377193de1002203194fd39f255bdc5b819ff91b5217e92a4d27a2033dd84628f1d698189e442260121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d02483045022100991719d300f0f997b6215252d38325f20fa2163d738de72f8e475e135ec3af9a0220128bbb89dd9ea3d77a86269ac0644fc0ce1a5b410f6bf105ce7e342abfbcfb320121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d0248304502210094b2c143dcb1576bc0383940ca9030eae0ec9e4d53a407236288d7b2d8bbf81a0220559c9899109747112c7447b421ba57391e600b289c3227ea2c5cbbcc5f19607b0121027f713e4e145312741e17bcc2ce56d51250d1f62871281bd7ced71419d8c1972d000000000100000005cb472c9dffbfb923f66889008b6e06386a983e6c520dab31735d4442a72f8c3b010000006b483045022100b7bb7ccd946eccdc25d27dac61bf8f83e738849c0ddb8c80a61ae04feb5a2a5502202b92662770ca6647449c84d348e5ef63dca8338b710382c4666ecf64836b3dab012102d315a78814ae2c70db505a9dbacc10082f98f7bb6e9aeda08282ac306d00b016ffffffffb96f7ec50e1eca77334d6511838dc9c0d42c100565dadb5c6581e47b388fde92000000006b483045022100f1e26e2e2462fca4504ca7e9d305f122d07ba65c10dfeccb9edccfbb3c6bff2f022017097274bdbd9c43eb0d494a1761964a10d955821d6694d2116ff2a1862c4def012103b6fb6c55acbd762a06b2604273006d667967b7903e335fa8450c1d21fd6555e6ffffffff5fd2c21d4945c30f335e87b6dc27e032fe405855a5573ef6c0dda837a4a8381f010000006b483045022100c586bb204da6d8b17b18194efe70c94e918780cd5090489ca6150693d07b5b4202207b869d0dc90c19445c09f76457d8a8245e91cc1b9e006135e91687452151ccf30121020a65fffb482025e66670afd1e26b2ebdca4341e25f583b9053508355639b3fcfffffffffeab9a70c0ffcb33e8143c44bf251fb880ef8328c1339e11719359cda1279c3fd000000006a4730440220078a0b71d02a48dc67d778f7cb19d0c453dacc3cf8b12343f23a04367266589e022017b455739610e5abc5117cb828ff78d8d9a36279b9ed50b5af77dbd3465c493001210290eafd3d9552a710a3f515cc87cd201fc3ce988ca6d27b6d4e9fd69b32f7d669ffffffffab993d4c9040f5aa76d92e1ccb54c3a15810ccc49171b7dc4b51fa3b3f1b766a000000006a4730440220377940e7f9ef34d8fad4641e255912583d60d3358d5978cde034c5ebd70689d802204d17a4f2fce3c32af2293aa14f37f52fbeb18d453916066327be92415b878f3601210255078d3fe51cee8f06b7f8a7ebf7880e1b897ee66af4f858840b3cd51cd17df0ffffffff02376c08000000000017a9144d207e60bb4af91e1adccca84f0151d4f3f2df388776d00100000000001976a914cd6b96b2e20c2e6974caab70c0cb742eaa5f956488ac00000000020000000001012f5b3232e231e686910d52820e3ad4738b83c747e89b69917d3374ec9fea5efb0200000000fdffffff04ba8d00000000000017a914d35229d1d390ba8f454ef2a8db471a30a2380f6d87733501000000000017a9143d08481ae73e98dcec0df4ba2b66ac0b1b905daa8774c502000000000017a9148992a13329c969606a5e82840ba559043b7d943087d342f0000000000016001495fa16d1f3d5e76b2078cc167c50170882821dce02483045022100d5278042e1decca2a70ee66cf13fcab6ac47a81a4176d771961af1c55d2e0bf30220540782a3e46f786726fbe7330b943b428a5655f39e09c69e5c6a18ac981d48210121026a35d9ec0983c1e63b0b4cfa76e08741d68a6381f1ee9974604b0fea4aec7bfb48a00a0001000000000102dd88e1a6c79c8f975915c71a06fef44fd598524a331420bbfe845c23fd6ea0448b00000000ffffffff2faf699091831548ac697aa5f91cdeff455b2e94a285adb66990a8ccebcedd8e0000000000ffffffff02dd450000000000001600140e863b2bfe604a133574de35d16e348b1338284440420f0000000000160014cbaf0633e5c0f05f426eb9b1ff8968b05d7aaf5a0247304402207674cf01d3ddf20eed66ff072f53920edde3b64cc322eac9955565f45bbcb9cf02206fe76037bf20b1d1f94f4ed72b279040b76ab98cd6c94afad5f4b6635dedbde20121028f61244dcb30547638b616d383abb37b44b33a34f5dccd8a9cff84eeed83a9c302483045022100cce212ae512da972eaa103f41f59686a8c4ac1c95727a55023281a0cbae9478c02206346c7f8b509c17ff0e8d400654cb513b4f53fe222e04bef59125edfb9ba6364012103359e7f5ba457593b5af1da597b16fd480159078a8fe0657187fbce426bad1fac000000000100000000010213a2fa53d70f468b63a854e5b1d95aec18c226755dbdbd2a05d15eee683bc2170d00000000ffffffff91db6fbdfce21e9989db9412f82d3a900a523e593d9209c244a16f6430c1fca41200000000ffffffff023eb200000000000016001470d73822cde1c3301296976a7d5929e64e42f5a77c180c000000000016001411e99f5e9d9f3ae7b91d625b25ca5d119df3444e02483045022100ff565f7fb58074cb22c0670007ec267e2b64f1f00dca7cf8ac9aa57593edc81e02202f7d67504fd76e453a8e0350d290b583a20ef2233e017b2fcc1d7876c1bae5a7012102bab494a082deffbe865b626b970c103562eb25844704d0eda32d78b34bfbbcef02483045022100e81f27a6f9652c98a8e0e04ef399e6637e5288824747d7c0e9b0c4e275f487530220730b418dc07bdf6ebc661156db78fe74f2f7053beb1b8eb73e6ad2e3876d4074012102bab494a082deffbe865b626b970c103562eb25844704d0eda32d78b34bfbbcef00000000010000000001029b223e2bebfd61c3c67ddf93414ff22d8f51abff10fc57475e717e719a27ebee70000000000000000069c4116e098f1aeebb92efe0e274ae8587c5e98fea68ad201aa479cc4045b5180100000000000000000260182300000000001976a91424abfaa84d6c75f1f02eee8d509ff74bcb02edcf88ac1c9c050000000000160014a29a1ca74d3a002e6d40cd539b2eb7333aeb33b10247304402201c9e2512b57f0de09c82316650d02e39335c5307c0ca55623c3de991af9879d202202c08584d2b2034991be22cc87332ba397cd7798a7b1c5f6c8f0e1e13230bc8900121027fee68032b8e2906e106d5f59815cbe54a19af3466b2fd9f2754f5b8a3f6b89a0247304402204cd1b769490a85c88f9a228e77e9fa347ffebe11d084a11638bab5c37ed9cf110220073aad261916ce89d70ba6838f1b258ae7162fd35fadd67e43f64eda29a3da930121027fee68032b8e2906e106d5f59815cbe54a19af3466b2fd9f2754f5b8a3f6b89a0000000001000000000102046ce5f0a69750a099b65013c0f2b66f0bd6ad79888c83d25243c8ef765b604c0100000000ffffffff5aa668e8220fe919fadb94b3ad5e6f02f6f5b57e4e03b4ff9bb4482958a005841000000000ffffffff0266230700000000001976a914b02889737f189608ff135d7eea38a9290375b5cd88acc3c4080000000000160014577b11875536550fdb8ae701425319c6eb156dce02483045022100d63a4664095fcce4697296ea31962afa91300ddbbd59c519708e94dbb1521cbc0220671f9b546ab061886b7385583de6f54266f0cff1776e497e08d734fdd020f56a01210279665e2d4d5ab2c70d10d2de1b6790e1f73bf4f0ac39f7f0482b19cdeae6243b02473044022001a8ca5dbdd5c0f682b3139e3004c4d8b801e7ea11c4819fb39e52ef4661d392022070d3941eeef712f019ee3e28739ea0b981b56b078e89fb6b3e11c86b478f15e5012102be12df3165a9165bc9fa33cb35162991e64bf63094ae6905699144f4e10fc81b0000000001000000000102acbcb04ccbe4b403268b639cb100426ade9ad1e30978fa26bd68445eb7622231050e000000ffffffff200d2bd0fb864761f37e7f7dfd63b43e6a6a453c21d173c090402d389cad4a440100000000ffffffff0220a10700000000001976a9149d2bcf61fc439a6eab082fd465f9cd547d5636c288ace17200000000000016001436512433415155f058b43f045d8ed8e8513982ac02483045022100c7c327954b7a0d1f9b380a51e8a744e69d10662ae5742cf80b2c0be0bbb29b8e022075adb1a75f05cc484b030c1c6df02ff134eef662144bfe94d4372a1baa3cfe37012103c862c67576a101aabef9ccbdf0241419bbbaa76dc82fbb364e8ecd53803ebe2402473044022046b9e23ae581f4b9c03f1228bec442a519acf56a8651b80c8e224d2ac1cabad602205d19113cae0d9f9f3ee235bc8ff6f80ad4a44290318dcd628428358175f77b990121024d96759019fb66d58332da5b35d594d10619e56a4e6cd54f8c95a9b0803efad300000000010000000001029bf62a874410d6703bb17487b8e8aec0ff8d6b2e089131bbbfd8382e82bf3fcb0000000000ffffffff7f739554b3b72c17e99e1bcd9dfaa79d70d3d3cfedf25f9e4003b2816af87a363b00000000ffffffff029533390000000000160014dcdf8f7741c7dba6b75d78e4c16628c9d4f39b52acdc3500000000001976a9147ef9e6e7bf1cc0e9baad4ac06ed3edc601397dee88ac024730440220209f7b63bb290d134ba7837a13c5c40201f939303b8b3edc799af5e01770dd62022033aac3dc9a7a53c606e55a728cddea08f3279bafa0fc35e6edff6eb357cb5fd301210286e0a0a766d6d62c0c7d9c92c662d050dc08e160476a1ccca771d887716532f9024830450221008c3eccbdca0462798447ac7687cfb0dad6c0941e28fe8fabf35d6dae2a208519022045241da85c6543566ad07331954b33974215e83c08cfe609ea5e9992c25ff156012103fe7fc80ebaaace404ca0ddfafd37b817ab108ba20609ea4463486c832a7f73d3000000000100000000010274e4d045da5ca9990abf2d3e4708cde264a0d43c631bb0092ac5009638c3e06e0100000000ffffffff9234af6b3e4dff8b01f1ebe11104154b53f123ab18c555220a958448991f8b198709000000ffffffff0220a10700000000001976a914708ecbf77357fd2b064c642228d46c4508b91a9588ac57a2080000000000160014d6c2767398fcb722ceb8c6ead1295c74961bbe1e02483045022100d3709b465b78061871195e55b170da6213288f2ad589f07822e5d9b1a6f408d002206b61b366f67c9edc8b2145fa2cfadd5c6ad063efa5cd9877ce8d5f60195090ee0121036eedcf6bf27917dfc2bdba667dce8216fec33f4d538e1991c48f0c2279eae77c0247304402203246ebaa91cd60b067fe2e1fe8a419c688271397a9de9f6a116e0c9873ae309f022044e35e0cd7f2ebce87ee19cc60c56743498b2c4bfb7cfa8238aded100976db9701210322c561c6a78b22a074d64ffe5279380664237b4d320ec4edad295b7af7222d4d0000000001000000000102257ca4786fb03b55220be6af30c2ddf3cd064a6b60faef5e004252962c4aa7990100000000ffffffff982660015c9f5b1261c0ffba11f3a5bde5232dddb0e473cd110c917d19414acd0100000000ffffffff0218560000000000001976a914536cf81d317bd441eb1aaf86689f448a36210dcd88ac39f400000000000016001408fbc5c963429ffccd9c8364cd9ea63bbfd1ca7a02483045022100f195fa5285d4798531f6409e5a48b99ba8dbeca4aa4795d854c69738583835e0022054006d2ed76634ac86b7da17197ca03a1c8e335cbbaf0d0b881ca22fbd0d7b0f0121027c05f61d7086a70a9897a264c3e5d7fcdf07e450aa466350e59b0cd85451fff502483045022100bcf617d7354df8621e63631617de20482a8b1d7046bc01891b76a0f25d9a31140220663439f9546293f09740d2bb1a839d8f5a6e9a7099260913799f0de76392b758012103b46f3709df78609f7c7b011245864ea74a1129d51d643569f2556028f3c298d200000000020000000191d831821d511824b962ab904535002124dd421892979be675f0b25b7fb23d2d000000006a47304402200218b6725342372969849a3f76b742bd77216827ab6a2cfb1ab7df7e376d8330022029a21341f6698c5ca800ce2d47d4cc96681117cb9685a899732c6d9101cbee68012102f9d9e2945b89c4e0253023ebe008de4d5aa41d1f02244f239da3378691d820eefdffffff02409c0000000000001976a914e120b6ae284818b23a6bc3485f41e8b5d31d7b7b88ac5bcc3d0000000000160014c7e9a1cf2c91787f71d4cc7129eb61a2e831febc000000000100000000010214d0c99d7381346698bb06c84063eb99a1eddba40f5de1f26fe56bb82472dcb8000000001716001422668697b5a9a6090e64b76cac1f416ae8f0293bffffffff81764dce21c429eca3e880d74389e846eb148141d18c3ddec127ee0d8561559f0000000000ffffffff022cda05000000000017a914458a58eb04538c38f157640bdea7e00087196467874aae2800000000001600140dc135200bae019c894ee2041056a24d8fa4fd1e02473044022063371625307c82332aa1f3defd589edb82458cb0e19ef9c7fd4647cf00fb805b02206187a9fbc1f17fe42e2880b9660491f5f888f98a7ea209eec0d6a2a69aa26e75012103cd44ea4adacaaa4b922d5bce8d2ab8d4af1d8697b2b6cf11538bff124317a3b202483045022100faa72998290e1a001371025a2d67b71c4c244e846cf0a3d0326ddf1f49e9d30d022009b700f71afb7d387841488b6d5f5157b851b0c7c76aedafd453d192454bd2750121022ce1fc898b588907c2d236eebc8c6777efb75b63139688a31fa56fa0b641c61300000000010000000001014f91b0c5c13eb78a9b3a67cf7be9e21c415e287adb55e0c349c4cb57f967fafc0100000000ffffffff02ceeb2100000000001600143d766a8da7b156f24df178c54778a3deeea465c185be0600000000001976a914e9dcce94fc01146e38cf73c645994b02e6acf2ed88ac02483045022100ed4db8a792f568959048dfffeca0fa42c4a2463716f9cbc0c49416aa6f4332c60220729824d39c1424c678489f523f4da5382250af7cf477c9b86593631a43ee3ef801210384f5167a2f80231cddd2012e371cace564445796452b6c66b860f6306196fe150000000001000000000101d9b27120c76142bd8fa4ad9311b772fd0ea7a243788e5a20ff1c78ddb19ab1080000000000ffffffff0229bb0600000000001976a914233d6a9444e42f1def1f2c3f0a1025524bf4db8988acae2c1b000000000016001490f23121978983658f48bc22b896700ef90755f702483045022100c7cfdfe1d2e829432aadde6e5751388a4d98476c576a96fff4602170ea43c69d02200c2102e2ae79a25d460fc66379920267194b5cf9fce1823bdc176039d8f8505d01210232fcc4a0ce0b719d347ca415d4ee92bd5c07e0deef00ebfd54772242da02bfa8000000000100000000010349879576165b3f2caea399990cf10b6e94dfa99623e1c589b67d15464ad6c2480000000000ffffffffafca72665f36cf6e74316151911f48ac105765b328f7eb67c4d0549f5f6e739c0100000000ffffffff0feecc2e56c9885413777c3cd009467ac2253fef7846e5e8e6beebc9b04ce9530000000000ffffffff0253680000000000001600142902a77fb422e4da13b57d6be16d2082c19898f200350c000000000016001422ced4a45a2a2f92196bc09b1443217c6d3b3eef02473044022043aeded09487c42aec0f4c9f29d65a2662a1b6911ea1cd13dd57f2ca6f5cd57c022018b455b17c106aa9efaf5d71da046db28f95169054bebe8ffbdf63b24f3ee307012102da7c27e9b578a4f0125aca812e27788a95307e77553019d6d2a0d4ad8d408366024730440220665e57abcd17a0985697e4db1490f1e310c67f2a3f8c4604ff1ed79922da9acb022060b54c9cd23b1a4a8a0d64fbf71ab9978e536ebea7bfdb72a9f1ec8db06d65140121032d93b5a11793dfe20be2b6dbded16e207e063d2c3e16e3de95dbfd38188f1512024730440220599abb3242dfae457164eda55369717957ca381e0dfad2eae834445e126f888f022049fefa9e5adf6ef542e0b2febad2a17e90797d618371e5aaa682d8b5bd5b3e970121023963e970daa32783cce05ab20a895601d3c759f0384decaf1fd57feb11d475020000000002000000000103e5199c0d95dea38db73936268e20cfdf52aab4c7ec311f95104903cfdd6d40788101000000fdffffff3574c2c97902ee6edf05fcbaee48ba38fd7e474b0df642895d095407b1f01d474901000000fdffffff10760fd5b3901ea8ecd42dbd80d50337f969acd108686cc57cdb2d77ff9d8b547c01000000fdffffff02d936000000000000160014bb22413ab5a1084290801e4506915b3eb25276e9967c0000000000001976a91476db512e8300fd076d89900f13e812053cde7f2b88ac02483045022100fe2dce8488360d3aea4fe6a4e31d9213906c6ce004cd6d25c05773d0eaf0d03a022032d2d42561e6559860e44d84f01eeecadaed6ce42806c1c326fd68166681cfd8012102fc068173319abec88ccb15a69c1c750778c2afe48e54eb1d2917e5f94684d83a0247304402206069ff163d98b21ab31b2fdab568dbbf51e31ea2410cb8274071f6ccc9997c5202204e907bc9c38bb2f31c71e611449de6e0d7da44891531a749274701daca244827012102fc068173319abec88ccb15a69c1c750778c2afe48e54eb1d2917e5f94684d83a024830450221008dc9b8bffa39cd2c4213dc3c35f8489fc05af44c15292a28a1803f328acbfb2802206f00cd713a54447d2717d1d7eacb1e8f5815ca0266b7c2679da561d8326cde35012102fc068173319abec88ccb15a69c1c750778c2afe48e54eb1d2917e5f94684d83a00000000020000000001029aff48de63b216ff89819fa33e1545d3a894e1867b79ea6ae6cb132c6d8425e10000000000ffffffff24c0d7c8fee925d8f4ad555c67ab7afa46f45c15ded2b97be67c51064378cd18070000006a47304402201a23d6152aa46e29ce061ed483ba8e3a2cb947e55377db37b1d249a4a6e7c57f022077ca79a132db79278333a4653a8f90be609eaf7b2c1811d60e4da5318a3a6834012103e16055033563666f49e749d07635071f994c56e727d30cd3abd3489b098e2844ffffffff02b1bb000000000000160014b7057b566596f7728e1136abdd2e6c90b9e66d189df604000000000017a91423535c61feffb48a5778b203e944893e4f9dbcd8870247304402201313cfa5148c102b845cb902c2e8999fefff5bc1be20447be5aa5bff8e06f93d022013deb83e09ba9060d07805e6431a2e793ace342cf0124592aafc68b770e1573d01210372a4310e785dd2c3e8d37c26f13988f5a09271c89190365e2838951c4c1094d00000000000020000000001020483fbb79249e87328f29f880dcb72cbfddd9669f55817498a7cf2765fe515100000000000ffffffffbbe4a99b11ffd91a4687c1528d400607a0662d691c1579636021733a5a87dc61000000006a473044022003dc795b8638acfcc724624463286397624fb16fda20e01f18d882b1e87c3697022043187c4a2564447308a4711593a69210fda92ce21f6bd4dfff52fa6db52d8c910121037a6c0a3a83e1f990ac90bfc4693c542628b882235bae3272e9167202b96e1af3ffffffff02485f03000000000017a914762312e5519920fc467fdd23282856ecf8f1b60787f0050100000000001600144f561e57ef08fca2a38d860a3201351cb220d21f0247304402201739fb2c7be3f9331fe9de23f98dddb5afc5c69a71eabc40dd4a25bfbffbbbbd022045ad10420d72a385f1026a9add042049dffd1996a8f9ba33096d4eb6ea2ed4d3012103e89ca04daf527daf826f0dcc2325e6cd46aad58d7c66020834a07b37082974d500000000000100000000010187eccce446c583d222e1571f5e043e433f2908f0852dd5ceaac5b81b5fb882860000000017160014d5691635c3f62b2a5e560e82772c5ffd2996b2d2ffffffff023f1b010000000000160014f2f3197838286bc1fab4ecb41be1199758f0239e903300000000000017a9143f4642412cec5953e60bd75975fe3db49df42faf8702473044022061bf082dd5c248ac271d0083cfcf48569a494af437c413f84c50d0a8b61acd450220690143121b8537345045a855b2199cdaf3b77a13c1f77be28b940f39e9fa38f60121033542eb3ec2c0296a91a53b9b67ed7063638d237d7a0fcdc73a288657da4d54680000000001000000000101e4791bd37cfb35ec8feaf73ec8617af5f4c822a2a762ac19962b9cb2c9d801d20000000000ffffffff02bc4d00000000000017a9143f4642412cec5953e60bd75975fe3db49df42faf879ac90000000000001600142c57fae99783d82b830d29242d905d79e435f07202483045022100f8b13837d479723bdf5388afd6c211d77d28565b82b469c045991dc5d8ea396e022005efde736c68a38d40d57bafd45e51390836c20ea3b2f881fcb0e8b0077ff1a601210244cb9bf09055055154a363f1588cc7389336d0632f29e0631afde5dc35202f9b000000000100000000010939f9e22fc0ed884e31736deef69d374ac76a177f0cc7ed93f7f5396fb59f208d3300000000ffffffff3805d46aee1a7ec2ed18468c4e27a81121d0274bee908b166dce7501d53ce5b42300000000ffffffff828dbaf7b11c2ae758ca88aa9a61532a308df24b05937e5eb4d09b6bb51524a03b00000000ffffffff78e84859d5028329bec2e337674a2e8859858fe86f8c8da76e7c6236535770581800000000ffffffffb34f08367bd81732a9476665ba3fe179bb533182e2ed4ef623feaba569ef74224700000000ffffffff1ea53dd599365e5a311abf096ac89c2f3d6eea615d1af02622a5ebc41ef5a05a4a00000000fffffffff570e8106cdd4c4dd3e54ead61c1be8af56b221a2f3e6d5557c99044f5b4e67a4900000000ffffffff0b6a6447619473085c0a992560b9927a2c4343dc7f0bb50c8195b16dbde488212300000000ffffffff21f717e977b53e4ae25eee3326b462636bbc71ab9023e7779ec293c5961dd3e51f00000000ffffffff018297e50500000000160014c77f1862f03d3576d5d6da5a92df1dafeb68ee5a0247304402203d9f9ef021203c6408e75798cd7456d1492ed58f8c4f14b505450c355a72f80f02203879fd1ee63f4152cb74deef1801f4f6b69b21bfca75228cb8784c69020debb6012102f32a1d43bb59d89d115c4acefc2656822d758e2d0ca4f70505456c0837664bbb0247304402201cb05eaae04c7ba9ab87cc69a53622fa560ddbf587d762ec31c9efffb9ff1c0402202d929b8cc1b4fb5c1c4b1f3867d76683d2d6f4b4891c892f42da29a6baaea2c0012102d867eadd040a7a6866eaaaa52822cce250070d422cb5d996073b3ba2e8df1e18024730440220422005397a79b12c05c12d1333d5ea5f85b13285f3657db2b60d528792329ac3022030c9aa7e77b1fea562db71abb55879428bc0b221375e6459ead3959817504140012102651351771c517368c44bc66382101912dbc2ba3e28ada3bf1e2cf1be59266d1c02473044022023a806f782045549f4ef37347bb99920afd06d6f57b0058ea245b78174bc48a802204ce3e674f46324e741b201077e17ce5b5b7bf3331555c06532bc8eb1a92a35490121037db72a477a16ece49c335135ed39141368987b833f68f06f744ad2a0f2754a350247304402205f3a4ddf588b691d959182a43a283593d84eb2f1ce3cd7f92c6efc4b1a4e19da02203eece759cf5a523f2cfc629bc83283c1976b29e6d1eb774dd1b17458a8fcc90001210248a1153883c038f8fe33c139754d974deb1f4640f5af1c391c5ab18aa1547de90247304402203c247327b1499679cceaf5d710c87eeb29da397a5019ce25e4f9ea9ff2e170fe0220257b0f127397a7244dc80219de8a30da3b6bbe1b33ecb9d0dba958747e2b336d012103bb1d7aa32ad937ef2f7ec4e874cb4cff66073c37060fa6ff805dff48b531a5600247304402206e6d1617a92d961353c1e7778be550096f6ed6e345dc00bdcb19c7b28f643b87022070be54738a42bac40bdd410de4fb5b5541d759e936a7f172b944c58bfcfd4a4c012103c973ae8b5f6e145d54a318b0a1c21a690c06036f1ebb0ccea8803559037171fc0247304402206939a1e16789c87b7b1aca52c15f78d8e8678dbc307f9753adc193ef6ed35c33022077d835f3f0a21eff6360ed1340655cc233a955378be5877725cf13f1a08985290121024541448015d9c729a5a6a547147b679cf818c0b85cf78fed1560a5957b1707fc02473044022068886bea83d366424853be42db56daae183053a6ddd385b1a6b0127e03aa6dda02204d18c05c7f90ddc7dff41f9e94eeb4f5f78c86c23d1dcc8f7354809f527da51c012103dcf1838dd029d9ebb3eb0b684e43ea570ef52ac4e1c5c6a35f7cd2497eb42e310000000001000000000109d1ea5435d954ffc2b17d03ac6ba9082f965806c53fb61e3a320510f9fb72e60e4d00000000ffffffff0980042148e5133ec95e2540e123c121e91c70ae667295f9d07b800628627e2f2700000000ffffffffcffc7cdaf91dc5c4448e009b627f3c152d1b514ab006ad5d422e8466aaee816f2800000000ffffffffee5e79e766a25ddd00d8b69c9da433ecd97058be99a07534e66273d4539eff532000000000ffffffffd597ddebe6982bf43db3a6d5a278c7cf7c8e8f4fed24a5e5f79f8884f88678374d00000000ffffffff50911e57987fff41dd4f15df650a01eaf0afb39e1a0a0e210205c89d2b0f66384600000000ffffffff1ac839e9ead010a6d335cf30be33773a43d3ebaf853155d8b6b38274868acfdb4400000000ffffffff0f545c6cfa6f438035abce2d08f8690edca0485b08fa952136789a7ace9884104300000000ffffffff0c6a8f423f04d4fa60a4a396659ce1426d526ca68cec7525621c74f6b6215e9d5000000000ffffffff010883e505000000001600142455a5736e73f9d66f03410814bc4ecac1705d9d02473044022030671d117dbc4f82c216741cc1afb488aa34ea597e099208b241d2d7c026d8bc0220723ffb52f0de77cd6de043553a1caa3088a3d7856d6a27bf207ab528f8a6df1e0121035527f248668f32e9170b0ca84d2899772249ac42ebbfa6d3a9ea5a03392871de0247304402205b098221a25e671868b6d19a689e5c57394ef9d4d4d3aaa573779b1aa2d3a69502204683eba7779f297684670fb1818dfb3c1a5657930a1869452589ff2b7565cf8d012102ddf68246d0703dec49c4c1b54bc071ae15799f8830afb1ba523cb1a0197bf4ec024730440220761c3db6178f14d3b03a388b83a5818f2318f94a1a7e47173b09de967c6684af0220291dd6b89e8283d9c6d521a2f5510d873ceb31764e8d4a348a144f44f08afb2e0121036a111c161b7d7fab17f0e12af227b0dbc4d5c375a029ae60a44b066d1f2329780247304402206d5fd40d16beb6a86b0b9d37fa2e91249dcc4b823eb53166cc851b4b574ffd5d02202ba817920302fdee327a0c190330dd0e7c7fc137fc31a632273ece91fda249c90121033fcd7cfab2ad5069288cfb4e3db5ebf066cbe79105990106d9158c5f23560aeb024730440220581bb07edfde8238d8a4f11bc649fe791ba6cf0f7fc9b4ec86e02a54f3b916600220218e37ffd1972f323a1e77addda5857f2b4bbc4b6ab3b87b5531151271ecc4ef0121028e3fdec0b96445ad12939026468f4de5d98db4518ba68c14dbb5ebaef0b88cd702473044022047727083bcf11dc7d00b01c75780de2c7f540f664ecfcc7b40d2c49b27d8ffb402203f9167ee37fcd70fdcd88b50ae9c264fc0a8dcc941f0f2d7849d8ca1f7b153100121028e6eb3c32ff79fb39c94778172a0ffc2457367b1658a9be9c85d8cca6c9519550247304402204040abf953d4098aea583ac291a16951b16be0c2b5515357213ca4a627087bdc02200a878173e764f83681658222a957de0f80e41b932a535bfc275ae69e8d3714460121038cc6489b308bd308356175ee3e6678dc7654d883c45fbf7984beccdb737fcc6802473044022074163b41d83bfb2568eae9993d255275516666393a2c363ccb70f32d2e2ec2610220163f390c6952edc9b424d9ba90f0955bf2a7180653d3b0545cb06a344ad944600121021c8af354077e002466c9e9e82ef630455cae2b4e6733f4f489b286f03ca766f60247304402206a58984e3220bb01221f4dce3881623b66da1ec6b46ba79464ffe172fd57619702204f64b170765a5630a774da08abac924662c9cd450f406277504aad55fd7651a40121036a111c161b7d7fab17f0e12af227b0dbc4d5c375a029ae60a44b066d1f23297800000000010000000001021cd325c35bf096d56e3a0a96fcd537240bc8c5ae307492dc22a0dbe83786870b0300000000fdffffff1b519eda1cb22ce1b8c85e536403b3b7aee3feec7908ce76bc7d1d2f4ca697560300000000fdffffff0266cf7200000000001600142572cd100ce74cc230a14fb75ce409150dbfcd8430740902000000001976a9143266abdda80ab7f29668230439a8193ef705c2d588ac024830450221008dc804ec9bc0066a00cf22226de553c681d837c38a2a5b64e830199b809410340220369932934d22bf07a3aef5df72251fb12a681921161c12204cacb8ba0eef73810121034db0b7a1c3cc76ce8debb1d4ce26579bebea44c24d8d6572482eae0d7c112a8d0247304402204be5d809f735ed0b3c255e5fb37092cdb983f46e01e1b753a0a2725b5adce537022019437b8967209d60c0b46ce708692917dada5b35c99ea3178301209b45923efa012102d2d2df12bed8f97b80749c6b0ea98ae1b79133e9e57c80dfc5d76b28ad1759200000000001000000000103534373012c06d205c30f1549adba8ad9c3f4bdc72a9679c50edb36fc85d806ed01000000171600141a615a4ea3ece873266912b34a7c813fadb0d6e4ffffffffc923bea16877c52e31b361658c0a26f4e07ed83b883a21ef8b6ab93b8663ee660000000000ffffffff492534fc63f51cfe45a667ca0f6c7e2fb88e1361089e99099fbe8839ddec74f5370000006b483045022100b25e784793ec34ce00d8158a93bcce4685d942efec0ce5db696bc68526fd435402203864d9fa551095480fa318c6a8df41a7e1cb460cba89e6bdac11832813377eb8012102c7052ad0594853fa286f21847c441ab4a6ac07ca6f8df0fe2ebc5f370eb4f896ffffffff02326b03000000000016001481e7764b57f088ee73afe6b75deb7546103487e470b70f000000000016001446333328b2df0e36cc7b8e503f4a8c0388de15b202483045022100b35cd4425c6662f809fea9315fd2159f59bed1dba96fe3bd8848a0a9ed128eda02205d6f0f79e83b8b90f04e065573039ca60c8b2c0badd77417756fa9857b25917c012102a9585b8af3baf07e8b1a44c15cd2df4eabd0e6f87381e548dc13750bb6b3848f0247304402204b51fb9100ded95313071deb518fa56bb82514dd799fca274c4bcf9933d835600220370a9227647989025c310516382017f8916e3d9e666d2f7912c4a5556134adac012102913a7c2cce49231f346bb406904b8868ea7099137b22c83f75a963534387d3bf00000000000100000000010594023f1b969d268dd7fddd5fef2febd7e8b1c2672fbdf67567a664f114878e700100000000f8ffffffe01d93adfe49e51dedbb6615c55fe0cf3ac3a83c7aaf3fb506bf237d17fc85100100000000fcffffffe06458ffd434a467b522f00b0f2025c395667b85a391996733f931410683e44b0100000000fdffffffc7e3c2d42d8c0d3d0a60e06298c8fe6ee65fc85075163aeb0d6ac4505145453e0100000000feffffff1cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d40900000000f7ffffff02f0490200000000001976a9148c0d33d52d8d4ac1a7e6e0e17a28ca48bcd3809688acde0a000000000000160014d0646cc47c10e97bf4b2175deb75ae696576e5af0247304402203f789690be658a1290942851f54221180b9869623999fe225f70cef2ff2cf70802207e0f8b1e34d9fa95abe944a64c73775b716e696ef7478b62d080956347ddd8120121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402205615abcc2c06ad11059e983eb51be217a2e6c53330ac2fe7a3aafb7ae9cb369a02205e9c9a2325ab215f0cb36b41b7a7937e64496e590eea2006c2319ca92457d1df0121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402200d1dd29b88f472600e793387572deb97f03a8848118c42276bfb432548bc9df602207699ddc639ec238116f870179c7b86b981d88819b16df191134f8e150258c5580121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402203d500a31ef66c79f371334abc3b633520d6d4e85de7851f7ccc27faec7e9f202022075f0c42fdee48ad26e6d6c013f175fb4fd989e208cce19ba9d9a5435f8cc656c0121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda10247304402202343d6566fa63e2a14f48d778f63b8bb1233b8324cfd0e4e14f1187f6b4d02c20220036bbd8fbe1cbbd4700942c1c376874b6e9a1a2c589b6f9198b7fc75ba4991d80121034b4f768077dfcfb5b95519ccc8181d2ded2111d76f1319195eebde6f82d2dda100000000010000000001041a46d143f9a23ba39a9930cae2c7bae681018147b7479f2818fed457c6d1c1dd01000000171600140236917da4958f040cf0b2ff2be61b6ebf2513b7ffffffff3045106e3d72164d8ecc4e11d1869c22119d66620622c7f36211d4662c6438d20100000017160014fa7b542a466e14a4afd985733c5c73453662cc13ffffffffa0258a93c8ff9575d5b24be0c369274f9611d9c139669b564422406613e4f6a90000000000ffffffffc06f4042f275c5d475ff87f6675f447351051da0d8bc91d06798beb857f853010000000017160014fa7b542a466e14a4afd985733c5c73453662cc13ffffffff02941d2f00000000001600142b594fd0de045a9aa4753f5a5ba8dda7d5e25f1cc0ab7f3c000000001976a91484f189286076db7521f49c91de28e0d04ee2b60788ac02483045022100ced81c01471a687f10dac006ed87dbc8abef0dea3fd4635766acf88dd45c82e40220132738d40a9cf4a9f48cec85f210264e0953f1e8dbe4dd46bc86766f8609b25801210275e1a36e918cd4ddd8ceb1b35e7c042054d2b69de3ef148d436c234c64425fb5024730440220519d40f982073217b848d02abbce61fc194c25cf5c7fe0743f18afb97945c4200220735e075b021d1bf82284ae52a0b949e28bc3f80976b4fffc2bdf00f7bdc26e550121026fae007849b858de1f1420192a989097c2de112e59733ec4b5282dd075eef03302483045022100b559c9bc0edae4bec9efaf359f6841f01d378c87aec17310d378261379e95fca022028e781b407e60f97be61f4256b81c9a0ddd0f68dff1712773a35a952516e6c1e0121036eb72fc9a5d566d580d886e89461c5bd628afebace91adbb5af28d3d4312b1180247304402201d3c0aa8d0f9682d4eb9c39a2bd68d7835296f6c0826cf4752bce832d75aa409022064aa7b29e8af5ae15829b1e90b5c3542e8edae156a05f137f2c20570866b536e0121026fae007849b858de1f1420192a989097c2de112e59733ec4b5282dd075eef0330000000001000000000102069dd6960f92226d1870a1240331c1b9e43438cb9886bcfb91ee06620f6305961300000000ffffffffc758280bb59037a094bbe3beef1675be4d54b14642e66a3685b6dfae0948dbea0000000000ffffffff019c7a4b0200000000160014d972a9bf36795c0c1ddd2f7ad7f5d4ca27d92891024730440220761953752982661ba80fd4f563a8f55132824c710f8e36de5b5fee405a6fd16d02206e4dcca3632fee763431b0458c690b701530affdd616f23180f95d16f6013b7e012103b54aec316c10695d9bbd542ee3b211ff7a364b3752423ff78bb48c74a2c2b37102463043021f54858b78644b8054749c716ec569f69ec1e6cac52116a43c5ded595be82b580220328414ddf5e9a82c561ce0bd17d97b608aa3ace44a05acd41fd88cb0ca5d4e6e012103b54aec316c10695d9bbd542ee3b211ff7a364b3752423ff78bb48c74a2c2b371000000000100000000010235fd03f99e8047707c647d597ebc3ecb3140a2cc735928266c1d87b356ad3b2d0100000000fffffffff5078d3c45e2a325087b267185deeddb771d95b1042a566d141768ec2e002b530000000000ffffffff0115a8c302000000001976a91465bd2b564a5659a65abc13611f01dc6c5189e26788ac02483045022100abc38b23a1da97a0dbbc0c15ed1b3b8f84fd9c7c01d2ba6019eb50c7c6141cd502203bdc50d2ae452d4b630c7a5ef3cd9acad6ccf00e2dd18011d1b667d4365eca870121024cd0954cba7b8d3c7fa0519c608e04da7bb0e0c53d23c473b6d02fddbf82780b02483045022100d70a05ee2f073ba1929ea00cd684169a0fc2002f02faff905b06249c7c6b5f500220478e763a41acae9321116e058b93db9d690d205001326da8b45c8a22174197350121024cd0954cba7b8d3c7fa0519c608e04da7bb0e0c53d23c473b6d02fddbf82780b000000000100000001ea6a566db396cb5c6e1d208d955a9e1ba762bbe54d0921a7b5fd863637d6f3db210000006a47304402206e7f1137e4020afb79fcd43263aa30685618bddadd3f13323c75d83edf3c492402202ed74b45994c238be83b202bff87df5b59c0544b7f2dfd222e0ff1e4493858d50121021a02bac634b94b72480237aa25683b228864a42c1df34fbbe9637da98e56806dffffffff02e4b91000000000001976a91471cf466c76538270eccfc461ca45184215dce0c788acc0b12100000000001976a9146550b36f8fa4c48c5549e03632116ca9b8571bd188ac00000000020000000001023a1aeb9ea6514d4ab0275a874a61b84e8cb4f37294c193565b0c4c6c25262b810000000000ffffffffc16f53fc8c1ab7b69ff005c22e61a5c99deb8f24d20d5543a9beb0a9a3621a21010000006a47304402202179c99b3066b4f7069c642e43db7fc5ff79acd37c192c5d991980a86c633de4022041ecf2d764db0a11e771a37afe0a97ee195a0e1d641936e6dd047f3e30ff2601012102716ded4b074feaa22a13fd1825dada6a7a11d11dad1165c2eacce3475afc435dffffffff0233ee000000000000160014f6c5b14c03b96d7d7026787ef59d2fbee16ad93ee4b12100000000001976a914e3a6f2bb96b32ae2b0e1a1d1a1ac8b64b1d433d688ac0247304402201a27ffbfe9757a49b5b827b220ac293cc0edd81e9589eb321e139aa263432bfd02203bccccec961ed9de45b7a710efe9e72b2b3e9b0976fad31888aff21ece61b68e0121021edd7e8945e2c67d4fd8c47bccb94395ced90db681e9d997fed9ab07cdea756a0000000000020000000001033d404902a662ec2db32d2cd30d2f35de47571926e9e9868299cd8c6f66ace7d7040000001716001424ef1621a1b4f8e998612c65bd56742bbed63565ffffffff819b68a33db70a550c69d82a9a70c25cbfa6e1de48ea8d87a56b1e1c1efa46f21e00000000ffffffffd94661a4b259dac09ca25c87f15ec23c9b510c6aa757a381d2cfb92e1b01db9f0000000000ffffffff1a406e0600000000001976a91441af2b9a47b40f51b2452454e4ae3c4622fc206488ac02fa0900000000001976a9149ba23207a52e01f73097c019c63a6ef6ac0fc2f888ac71600300000000001600149f695a371f5e5e972ad9b589f1c46e21a634fce4601904000000000017a914fffb05d3ecdee1aa9c386a6605657e83ccc10761876cda0100000000001600142d2317782d547634e7cc4ed05c546e8b8ba6e667d07203000000000017a914307174eb95e98c1787839007fb68bbd710a68e11873f7d00000000000017a91442f8a625aad997e102154a97731996cedfd42a0a8787790200000000001976a914573d7eb05730a3ac586c64811e821d67fc4ae4aa88acd6c5e90200000000160014fb3600c8a5ec656ced25d6ce3b5a330c87580b465f6f03000000000017a914975e048181d170e6855b2ff19ada364bc7736aec87b3fb010000000000160014e13f6e758cd1abf8d8bc1acc0ea459775da63c79f9750300000000001976a914fd3a61b74d44eabe0ef6aec51ebfa0c5ca647fb188ac7c9a0900000000001976a914246d7c4a05c34a45aa576581bbc49239e682af5088acf79c400000000000160014830cf5531e49b7cb91a99160806169caabd2dc2a79da00000000000017a914e927967471461449b5856fcfe690d159827875a58706c01d00000000001976a914fe7f1ea30b55fe222ce105a87f81391564e6d8d888acf87c24000000000017a914dddb9a377d000add5ba91c629b1e0d2eaec5cea187a465060000000000160014584a79de734b23c8f405aec2ce32f56de91a287c204e00000000000016001477dd101237dd247072b5651b135e8ce7d5a2d32d48770d00000000001976a914e37aac6fb5f851aaf0dc50c22893c28ca1e1c32988acda9906000000000017a9147b4a25f0203fb72ee650532d90f309d822807d3787804342000000000016001411fd0b1eec216ef9b66ae2e9d48dc2eca90e63fd278317000000000017a914672b48fb973a51105af1db58c8b0f19d3549908a8707050000000000001976a91447cb4999bc772c8ec5361b345da3155626dc92ac88ac73480000000000001976a914fb94e3c7a6031ad6beeaaaa34586c0d6c07f7b0c88ac6a7d00000000000017a9140d350d29579f9cef5ab00a613fe3765b89807cd987024730440220601fee99fc2a8bdb97e60f37ce08a57d5a65df684c90a325268fc91b074cd65402207511547569be9c0dc8e2c0f668711bbcb69506b299946875c702102c2e37ee53012102b5fec666acc7aad96c138d1e2772a4dde0c994cdaaf9f83d7e055c4454941342024730440220486c914b7fbcf71917c0a51842309e9034513e56339e56ff247c471fee72cba502204d1125cdfccc6ec0ee1cdc669393d637b2711b372897ed62da3add9a87d4e153012103a9c65edc087c04f84c61bf0812aad95c1a9e84dcd4acc62704cddd08759c6e4a024730440220613c28e5a2a93beac5cd82470e7ee50b3ca28f966dd1e14141f7741da4af1a5602205cdb12f143da42ba59f8e25a6f9984154fd60f8322351943c59aa440567c517d012103be0ac5fdfb8ad615deb1da10711949d7916a405af310e841c927babbdf01d6f6000000000200000000010137150aedff7065509f8951091dfe19b20fd28b5b7e523b55d35fe1e36d6c1c150800000000fdffffff01d2ade90200000000160014d40094e95f72cbead21b48d6199b15df0be7d79d02473044022074dbe26443b8c3d422582fbc11654a20c3434c678fb574e7edd6ba931f5f2f1e02200e3c0cea3b040483e0738a7334c9beae7f7cb91735e33bbd3b74a5705136abe7012102cada3de5dc2373a32db0b4ea7b2cbe9791aaa4cd7625ca0b6636a47b7114969600000000010000000237150aedff7065509f8951091dfe19b20fd28b5b7e523b55d35fe1e36d6c1c150c0000006a4730440220732504d8861f30e94d860706e3a4ab3b1742a626f5253ba44ef19d088adb3c2c02206020dfc55272f7c94b9c430fbeb6f0c7522c433b297ee266ccbf7bfd1a2ff6ba0121022594279f49228f8f098afe5500569bb533a60c36a8659bc12ea36da44625edb9ffffffff0a30e5d41321aed592f9453ffcf410153ae037ff7ebf2016a51792a875b2317f000000006b483045022100e4240db318826ca2b436e0c6031dc0f17f8b3ca8cbc6103ca064ddafe53a6ef0022022b56d0b42c4a273cf87ff58f5186553954f3a8cf25d1a94a2d4b90c15a401c2012102c49c98d02dd1c2d0fcd2da69cfd3fccbdc0ab92cbe483aa17e6c331b7a81de6dffffffff02120c0000000000001976a91455752650042364aa938669f6f60744fa3a54e53288ac37220a00000000001976a914a61498adca971b69c18fb6a2baeb34e3b627479788ac0000000002000000000103b3796ac235bd62fa4752b19e59d149161f13287d6a7a43ea0c3e552e877ee9a20000000000ffffffff78eea2b0b6e9580acc2c90c45bde6f4e7863ec3672e21d703b3ad58840e964890000000000ffffffff7ed317b95542eed247206b934f6b9b34968190b0ae157576d3866361335f16960000000000ffffffff74195801000000000017a914acd6a309796a1e5d68fb26ecc2f46af31ced971687945e43000000000017a914ffe1e14f16af847d3db0d1a5e92a8148dd081f7d87864a27000000000017a914f188867ac97e110c83bbf5509bbe746741d0ddb0874c1b0a000000000017a914f45cf47bea924f60ff45faa5d2ec9a33ccaf8f6087b99906000000000017a9143618be53ea4ac24f398470637cb535ef8c2dbc3487ef003b00000000001976a9140aeaa5efc680a0c3227a1862a3b1669a27c0f56d88acb9a30100000000001600149536a0fd566d4548480730ec93a66be7032df148796f0300000000001600146fabced1bf698af0ad0cd4dfb2f32a265447156e2a7b1700000000001976a9146f7eb0b9a3faf80a0b025c47dd6c031d52b74e5788ace3e709000000000017a914f2fb464cef95efe17d46ec4f3935d233597b175087c35d03000000000017a914e1bed0917817955e4484c6f1895fe8299cc40cac8745cd01000000000017a914cb5bc2b6268795e4871509c6b45ab815512d87f887f0ae060000000000160014d69e57ff78832357aa0b6739fcc81ac0320b8e06b4cb07000000000017a914b4242707b5b0da3db6474e5e728eec886bf712e3871f78030000000000160014116d175a840f749aba87dbc85b5fd1b71cbec38df20c0500000000001976a91475ce5c4b5d1719eeef8bbd4e54c9c2a05bfb080888ace7481a0000000000160014edbec46b0845272738c5c5814c4182fed55c0cb819760d000000000017a914f3dd4727bc03e118da2985cec286e3b6ff53647f87fc971000000000001976a91483d1794f458855c162fee06e92c29660b899e80688ac91340400000000001600143f86e94d0827320053aea2f14860f5d1348a60459b7b01000000000017a914cdbfe058ba5ba641803bd8c13c0a2befcfc0c91287cbb22100000000001976a914a6a2f0745f46a7a47136d53177d6f50297864e5488acb3ce00000000000017a914b7aee1658aa8fdbe31c54cb18ae60192a546bc4187247442000000000017a914b3e2ab546933cd773d595a9eabd52f82c93fc80787b9b303000000000017a914d915e0b148659f8aaaa7db0cd022f7cebaccaa98878a050200000000001600141b8db5ee1adf1a9ccafe98d305d3f74826eee06d46221300000000001976a914f88dda43d603fbd967204297c713ef827c66772288ac60af0100000000001976a914e7bb57aa3baa39de7533c7b2e4efd3ae2d78dc1288acea551805000000001600145d00c1f462acb91179deb0aa888c0a8379812912a2a60000000000001976a914304b6d853d940de8d8cfc0c0623a86ec619ab56388ac71c70400000000001976a914c860a7bef3de7d6ab3a357bace4410a73970b8cb88acff962900000000001976a9143f9f77b8fd943e3795bafa788319e0b4da07ed7288ac41e000000000000017a914501ca049f7ed4b20347c45464451ba8b4b0aa58787c8554200000000001600144d0101431fd9a0db28f059e85e1b1af5bd000d4ed1f90000000000001976a914fad0b40fec29e4a2d4dad003b13797663c01e42088ac893601000000000017a914fd1ddafe934d191ad8ffd2efd2541252fb85c13687c00d05000000000017a914ef0952c428133c911aec1ee6d3ed7e34517f552187d34e03000000000017a9144056142c319bff340102f8519731e510b2eaab6d870fa00200000000001976a914154d54bafdd6a22492b99848f83a340d95f6ff3788ac562501000000000016001471209716bddeb681d1eee2eeb3df38bcb89e403536ce0600000000001976a914e269ef62fa18e7da936d90ec6bc93fd1333a8e2a88ac340d0500000000001600144d97142f007c528e2b7554ffd4947bbb6ca81aa766f104000000000017a9149103ab01708a53430cc7b6a335801e6c80cc649d8703590100000000001976a9146afb06700b0aa7a014fd810cc91faeb0c69e920288ac3f660800000000001976a914b4638797a4623b36227e5941aef889fc10c03fff88ace2830100000000001976a91427dcab465d30f9ae21f306113751fa28f8e8757888acb07502000000000017a9140c5b7aefa7e70d451a0dc068d6e3e8c2c8b2920c8715af01000000000017a914bcb50eaf29b51a95b47008ffa6d84def56ce0f418744891000000000001600147a0ec4f3360c06f2785fc93b760c913b7b1109ff59c318000000000017a914ddebc1b2457bbe2891b3dbc80d7d2e4bae67c4b88760d803000000000017a914309fd748732e0777a00e5e3a032017cd00decf1d87601823000000000017a9141e6432239138b3e2fc5984f8dd9ded62954807578700d430000000000017a914db66b2880869e49f79d849e91be7a12be0b126bf87476343000000000017a9147c1d3c1daf99fb77011022f8026500c722e6e3068798690200000000001976a914b9f3034be3ab025c6bc72ec9b59a3d268093c0f188acc3a201000000000017a91446137afa9dfc1bb361a0d9dff63c191316b89a45873d8f0b00000000001976a914eaa3b7781a276a89c150892a77141c24850d763e88ac976b08000000000017a914fce89de3a023d9f34cc77a9fc22d416b9b31808787265600000000000016001454a55890cb2a7e3ca8894f3c288be0d502e1786b404d03000000000017a914e2a9787ef631592887f439fabfa7c9278f9f19dc87e1760100000000001976a91434933bc556f6b2470445743b4852ff9632a0899188ac6b0202000000000017a9146e02f88d54e04d07f8f9f874d83e328e20e12362874f5001000000000017a914773e82ac6f99fb258e0abed46d4a8b18ee4f1ed3876a0c08000000000017a9145c113d7feba3815b38a919001ab4854885c2bf858720d9100000000000160014776794ae25a6160009c737eed6b60e1979f1dfaa6e3d1900000000001976a914efcd7f28efa0e6c30445b2105df27b5727d70b4188ac4d480300000000001976a9142cecfeb624edd39a42196f89faea9091cd8aed5388ac88fa140000000000160014150e50c0eb28680038a326617cc1a20de29f7e5727b50000000000001976a91489483f2da74afc74a21ebcfaa9ab6c4acbd7560788ac585d030000000000160014d5b549a4c746afa962d440ca3ef5304f37cc1ba6f3e501000000000017a9148e7d6a84087d6c02a9140f15d39bdf2ffca062688786f004000000000017a914ccc1ce4ab936c8303a0f9f625d8e429322cc9a5387fec209000000000017a9140444bf001ac71cc4e34c5c7cb06c9a8de9ed8c408715a40e00000000001976a9145f3755aee56b2209fc86cac50384081368db9cb988ac0b4e03000000000017a914dc119f575c6a898e906e00fe96cfbb32ad9cc6d287e25c03000000000017a914cec75ae5ed4f5c5fc88eec9ebb1acd3e12d27dfe87694e04000000000017a914dc3260e5ba3127d2102c4b6e54b05f81718cc7d78744b2310000000000160014f7dce399fb7c6acb306782c36377bde7cb4e02c8f5e30e00000000001976a91431d74daa3bdd2fafff6efd75112a2b54c05ce40988acae5801000000000017a914dd3636554c4e3e95d83e22954bc63c09f5af820e873ef307000000000017a914b7f5d9e1f2e3c0936d74b5ba36eed76cb064eee187d0dd06000000000017a9140b42260fa01aa17b1dd10652585066db42d9059c8710320d000000000017a914d0cb146bf221e3499a2dd76446ebeb3ea3258f7787c4bf0a000000000017a9142e97f1f944298433b65becec4a92ff8b008207a3874f6f06000000000017a91477bfcfa7f9c07ae2f5c77595edea947d29e4dde187b12d01000000000017a914dfafdf37150d24491a941a219aee3f05221b2efd874d4d03000000000017a914a30e503afe92f77726fdf2c1c4cc2016bfb0d3d2873dbe06000000000017a91485301501a1acf575bc73866c7d90b1ef964f860587dc4703000000000016001481c8bc153db4830c59c9d8e90a0ae4ecbe3b3b6e82ac0000000000001976a914fe2245ffaa14d7b7bdebb89d4b59dfd4e89046bb88ac352f0300000000001976a9147fdc9d8f799c8965154c13388d884e6e92eda66588ac15ee0500000000001976a914fcf18685fa0a6a674f2cb7dfa1f3670c98e874df88ac9ba41c000000000017a9147a9b7088a236335c5052c0bc1a8a575de50c1a56876c02210000000000160014fa1486498520e2df0dedec523b667c9d9bbb826c71301200000000001976a914ee7d9bac899dbc5419435d11ff40d8ef17b6555488ac566b08000000000017a9143c34d767345c41286a06e14db51351c39a55790b8769db0100000000001976a91482ef12089d3662c5189a022d0b301a0a4188c18b88ac974403000000000017a914af7122467284498f3814fceb9ccaa18c969065408719b102000000000017a914983bd103f7489776b5fe71e8f8c3cdc44a93cc2787c9020100000000001976a91417aeb689d0ab053fcee6c7f17cb06284b1837ea188ac59132100000000001976a9143c8ac776254953cf502be476c79f04785d3abfb588ac045f030000000000160014c4eb8ffce1de2b695b7277253b3e7318d9ab36c0898301000000000017a9141c13177a1ac3d53686da07360939620faabb5c4187739d0100000000001600145b5ac06d383a812405edd3b16ab0caf6d5112997f7cf10000000000017a914797b4344b43caa16f753edb96cd7e1cc224b9ebf87ea940e000000000017a914f07a48d90901b0fdb20f1d6ec787cc2a56dada31878c9d0100000000001976a914d7bc56e94cce3c9df12e6034fca8b264e056451088ac41b40100000000001976a914e058417770d2b0875b46c448e681404fad37548f88ac434903000000000017a9140d39c52f482e14845e5f9a7f3b15efcebc2f9eeb8711a70300000000001976a9142f9a9be8c53c56d752b08ab4ec068bb102943abb88ac10870200000000001976a914ed9ae106eefd4188ddce9813890f317186faeb6388acd46b00000000000017a914e09fe01f334347987677bb6b7d3d1df153cc606d87eb5503000000000017a914d0c1483c29a3b6e0bb22379a7e64117beba960188749af0100000000001976a9149f42f5533d4ed23279b030f40e799695c9ee624688aca08601000000000017a914a40a836665d8463e5aab4acc342ad8de5eb8983987e81800000000000017a9146105c5060c6c3c6f0ddd899d178ca0e3e99b4d54870247304402204a0a5830a08bd2d583e24808290372e0d577557509474221a2913a2f907ba7d00220652f651f938fce481925d5f1cbe29b68622775fe8155f0fd0c293c1baeeb019d012102183f174e75051fe085ab46348f67856114edc41a00684f41afb236f80c59d0bd02473044022005ab5db0512ab3fd4c2cbf332ef8a429083efccf6c7f9de8936c7f3dd7ab8ed9022048541bb4eb96615d7f868444240fd75a3f3ced70b2b968a39e973fe1c53088a5012102048cadea410986df875da30a58a2d09c3980b6850b6e900173ebb8681469e2d10247304402200b34b2c3508896615afa19bd8bcdd7ee91f378728ff093f49138782537571efb02206b1eccb5616309cca92d22b5de338a2f1cbbb0cb1abd93732551850d375eed04012102394b45db256d71ec91e31990f45ed3f7b2b7a28d4268b9cb732df656bf303a9f00000000020000000001016b1223de98887238ae70cf055592942c14eb3c69411d1fcb8edff4ed9a77f92a1c00000000fdffffff016243180500000000160014d34aaf8728443a047cabd21abf356706964b389502473044022066f88aa6b179792fd4b7ece74aab8327462a93fff352c9b5556b3c32946eeb3f02205776d456e690e2f58133716b02960d2428048c35763a13e322ae7a4a7b017420012102af9a967a35951927bcd2467bba9478ceaa55a00a05d5ced0df5e60ef87e2b16e0000000002000000016b1223de98887238ae70cf055592942c14eb3c69411d1fcb8edff4ed9a77f92a050000006b483045022100a3ec641fa68042b67a13cf4195d5159d540541af6e2b1943a85b629c521cd61202207d9cdb89b26fc38082da0d2f40453c7de7e73cdffce7a869d568d5268eaf1e6b012102eecfb727b6f358a2dfd0015b4ccd47c1547ae6fa0d758ea4bca71b541e9fd038ffffffff0162ec3a000000000017a9144b4e4c6bdeb0d8c70c9ac99766cc6a64167ad4888700000000020000000001019b1941459e704f37236308a3d384f503ef23fd53aaa03e836e94af924a126ed3000000001716001402ded4659cbd7531c418d2ec1dc3be1414ce2836feffffff025fa36e080000000017a914ebebf2773483c996e0101d0ffb33d2e60badfda98750a06e00000000001976a914a6b706f62ccd53c89b2e52247e9a60ccd776383688ac024830450221009c2e12b4fbf7b23944329e880b346d170683c2bf8f3483eedac8cb0aab706ce402200b774f4b9e608e30969f0bb34a796ebbc2f6c1616898f01d3fcb5b9639651c8e01210308c1a114d3b3ad076b364d677c008b6cf8bf706c33aaaaed1a6899b6df55f7c247a00a0001000000000101ec49cc91767830e32894faee577a341229e687ab38ecf7cd1f52a4264139f2fd0000000000fdffffff02fe99e605000000001600147c1333e6055b83ab94932ce31b68b2b1543ac3de40420f0000000000160014a645a1c54b29f2cf50465f570293923566fc3c6102473044022079cde8fca40f94c4e67f0167a65f1b84d7120cbffd5b01566714b781e93a935e02207e30ec3104df7da739ee5476cc18484ea5dcb83a5f90699e10f20825094c01dc0121039e6bcefef93724767203efdce4037787b9c68ca113efa012ee7e8d5f3dd200ca00000000010000000001011f54aed059f06add709885b933d83624b1b96eb48664dfb0b90749f0404c007e590000001716001445cd2acfa16f56f5d16e4ae6a25ef96b66d68cf7ffffffff029a572e000000000017a914232fde864f5ec47de5b4d5db68e533b01bd14b7387034104000000000017a914c55507369e68a9387d320afdc890f9d7b40c5e028702483045022100c062839259fbc24f841566bb55a25f991809569408ed6a5f01b79b893f351e2b0220370f54aa3d19eb6f17e3b4975f1e79b78221647dab0db97899f8b526228c6291012103fbda2c8ab25769b6bfa78d46108742acbbf70f9254808aa66a6dcd66c03210210000000001000000000102c013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c3043000000171600149e6a5e5dcd35da060e906a0c8d650d19f3cdb657ffffffff80fe3167edf09968ec13999074734587dc5f95575950d2e7e6ccd804baca28f80100000017160014a501c3ba0c39b4b82a66271f08386e21a46fe8c8ffffffff023e4f4300000000001600143140dde2473f2b889b7cee4a6917c74283c93635397c40000000000017a914ab347ab2415dd3b9be23e0310c3c69c3cbcb63c28702483045022100afcd64c26e061ce838dbfe8044d19b8275be95b17517485611d0d3faf532c82b0220506fc27bec38037aa1a856fdaf530a74a4e6acbde92d8b32f904be6818a5000f012103cf615567f120068a8375b011e41c019eed5cd2f45524ec802ade59c5b6b06b640247304402203102a4f44ab10f22641bc9de241ff46eb9fa236bec0a6ca7466eabe8119f0cb6022018e57dc888f40d5bc9399a6c35fdb68a42de4847c27be1ac8a95e809117d32410121029c59507576e7ca75738bb4266f73025464f7033d1eafd314b021ec1bf1bfa02e000000000100000001c238cb39f5fbaa0eaa95e9fd4915d76bf5985cc45656815654bf67416bd2ec37000000006b483045022100cd7439187c52b07b1fce2d6211edb5d7fb3e3c9df51b2c3a09a3e7e3a9e7957602206e4fd96608bf6ce9c59da64240a5971d4d5868df7fe6ee5d9c59bb048e1ca75401210339efb8d68f458dd37818ed747a4b6e455303fc5cd999b7b99e516cf111aa7c66ffffffff0261b80600000000001976a91485032fb31d52d4a8a38d3b4129adb1af01ed412f88ac36c50800000000001976a91499359da059f8437ae8be882299d9efa0e249bcb188ac000000000100000000010149ecbe78d9286f12b4839fd1618aeda9ea16409494212925c94104a0ceff6c080100000000000000000249e20400000000001976a91403f454c6698a5d29172d5b3ce48a503dc981ed0988aca5dc04000000000016001470a8b701f97f97624bfe4c80831dec4bbe0fdd6e0247304402207c74efa98a9dd6fe98e9fa878ac7b9502d26e3e5c71e00ea64828eebb088b1ea02207cbbcbcc3942865e6b7147d04023e097e532fe3876e5151f036c1aad5b73587a0121039b4d9ee82f60fa3caf05e1e8f9668856244d4c3397d4bd479e909081603253490000000001000000000102e2d56a9b703202a28b2ae4133a31a0af6d01799f232b633c5d6949d19eb9c2660000000000ffffffff6684ace4c2755cd1ab705f90bf35835b5179303cf6a0d9aa0b159aa65ab229bd000000001716001461a3c348e1916bd6790f8cab95aa6ee8d38d8efdffffffff0232130000000000001600140b69a4ed0a5e0136492f9b376d23a663b419e4bcbafc04000000000017a91472f2961ba8995dec50f6203d28ec01e0093c2ef98702483045022100f866d091fb5dfebd6e541eb4a2bdaca143de69b0b83b0c0f7fda1ae31a4b7b6302204f0a926d0e0e2405d44144b2750fb634a2f5010d2ec88de31e5d226f0853e7ca0121035ad9fcadc808315cc2e3a86b4e554ad03e065e36c336ab8fa1abe02eb2ce22040247304402202fe231424e5e4e3b25638de6b57e35ade15615c24627cb7e918e7fd3672a3148022070e467228269cdd98ba4b0252b17bddc6c1dd0a24d55626b6bc5019f6453c70e01210200398252d7893bbffffe30744b123588c7847cdf94910360a7ccb55ed3238af60000000001000000000101ab55cbcbce4cfcd94c941c3ab2f1c6802951ab0c73f3a3b63929f38f4757a3f50300000000ffffffff02805700000000000017a91459a587de0e2fc9a9b9cc582bbb5552a852cd5eeb87c8f51700000000001600141221963aa6a9d8b46d870d55e8c70803dadc56be02473044022049c82055c7e33aa93ac266db272b00a5c1fbfdbcce2a286b07bb6f37dc3bb9b00220116defafa9b8841716d28ecfbb51b2eb877d358607683776ebdb70ef818edbbb012102148141085715fadad2d08ca6e4119f7e530d1c1bbe7e272c14e4ce795f643666000000000100000000010197c9efd00a85f581afb6c60044c709a1ff1ece991443000b197e8926425a81a50100000000feffffff0175b20300000000001976a914710af2fbd0a0ef44bb002cbfce533f79a69bc64188ac0247304402203e3ef64fe203e7b18657c38300fff81900316784f77cc78da543bf1703274df4022008f9cffd2959842a1758d21c5ed7c5749c385bc49421dd0f5621ac32a0773b9a012102c5dff146c2bf02ec32e73aab17c2c4dda20ff06ae0be4aea6cfe4d08bcdcd1a400000000010000000001013aaf7785fc53118952eafaadabe1ec4e27547f017fb5d0d582a639e1783419fa360000001716001446c723c0e3456076546d728babc20ce5b1dc9fa9ffffffff0205ed03000000000017a91410c76f1632db9f71c344b076eff3b9f565d6233287162e00000000000017a9146c6bdd39888f13386c39ec6a4ffc893a1d507caa870247304402203e19d430b353cb4274e0957443d5108e3c29d8189a16f7b3bc4c4d5cbd657ccf0220682938c7a49961622dd3ef1b9441a2e719955683abd6f04934bdddf83e6cc34d012102bafa237a4398f09ea855f8076e7630102fa5630f55ba65d5b4cab671593c8d1b0000000001000000000101220ac0671924d6bf131199b18aad9c83d32cfdfc453639372bf6700c73d4f2794c00000000ffffffff011dbba7000000000017a914224b7330e6d223d62fca8b7e154277af99d963d4870247304402202a05f5952248564710d578740234caedfa05d9e9ea7d49e60842547fedabc7e10220698e299970075630dc876ae41e8afa997f595d39b2ad9a9e75584febb6f7aaf80121026c4bf64129ec69204a20390f45328b82921e418cdf731357d4fc8d0a3931beaa000000000200000000010184e81dab5ecf067dcd66adbf0670ffdd39220e3effeda193f023ee2a9263fe480100000000feffffff02a05a3200000000001976a9148b66746a03ccf962624ec15b8d99d485e167109888ac013f3c030000000016001411ed7251f12e1e66a8ad280f0b76ad3dc6083db702473044022039cf241bd672716c69379e981772bb045e8825ce43ecdd96f78517d7f0e723e702205fccaa5739369f014ddf5fa64af859ad465b17bef29b7646a7a2a1131236b9f401210278f6e667f7c2cdd075d10daae4943c94cef21ad12a8e5ebc849a5c18a331bfd800000000010000000001012972c2a22efdd5d548898c04e356e9603b5995019fbfb94972bc6595689ef1ae0900000000000000000118440300000000001976a914cecdb2185389241a4915de9f07392d9ebf5a6ff488ac02473044022100c40f077baa8ad3e903fcd27529201a8160fc246945c839c109ef4f163c348539021f0599be0daa967098111964c7203b8147cd791da90d7362d253395a90d701e7012102d3c1659d3896418789a3a43ac321530075598ee6867f009f0e2f55d6c96d1a3b0000000001000000000101d4e21b7d5ee748cdeeb9b1e5b517e98f87b5f516c432c8a496917149c84606651400000017160014277d56eea7310c82b623b43df06cca66ab0304b9ffffffff02956b05000000000017a9147d309295b5cb64d06f4fe837637db9ff04e5d1fb873e7f00000000000017a914be0356de0bbaf59e6bad962ce9255ba436e205c58702483045022100a623bc51589b5df8ee37652aa6e97fd1638163548c49328b2406bb3e4f21317f02207c8518c3678290c116592b3c7d1c9da29bff6a67e2220d6ba1497221e99ce1ee012102f6aee04f55eb89eda68e606e7af2e848e5357cbd60c028d5e6c866fea42c94be00000000010000000179d8c9209bfdf6798f919b38eb2be2b61e0a67315870a600a1f244640925bc2d010000006b483045022100e18bdddf260369240a2febcb1655f3a31fdf94de065d7e323f5ebd33753216e402200f5b8e89bea9cdda4714aad034f7ed184901ab79dc139016a40f6018c20af999012103e9a458eeae55b8c9a279d518b40ed197fbeccfda573af7dfdefd7ab8a87f5c65ffffffff0225b50000000000001976a914c8845174f90940358299ff7c1f2936beef4870e188ace1444a00000000001976a9144517e5ac5d05dfbad1b08acf11a0911867af23a788ac000000000100000000010252fb60458958b4bf9948457abb5ee30460d5b4de95175d8de6dd38eb8a524a6b0000000000ffffffffdc3107480d32339667081628d1f81758f5ac3daa34b40c31925f69f94d3e4df7ae100000171600143fc031528e3ab62475a0088fef5a2a6b7e2c6575ffffffff026b220000000000001600146e7a17ec17c91c5ed53f30ccb81eaffa4094a98220a10700000000001976a9140bcc40a41d002c702377cb022e89e06449aa795a88ac02483045022100c85a80578c9ffe9915c53166f5bbe82ba721a8e2abf91124a7555660c9c5e852022078db7207161f4506b4d9cbcd5df29a135b82ce79289c4a066a5fb166db5d7264012102a51e60fa3dc82412b365bec2339cd6a6b8fce04aafab3354aa7fa2c29f32e1f602483045022100a3626275b5113ccc69c4f63a42545244dce60aa4b8ddeeccb3279fef85795300022011e1339298184dedff46c891d7448a58f9e139cce7043deeb057e074b2cc1c30012103476df51e462452a84075d046ccf7464bb6655497ef28c503e5001bb2a011b5cc00000000010000000001014f16970be26d73717e2cae290cfd6b100e5af82d0d52393c81bee197dae2393e0100000017160014f3071e352e6cdbb286c5984226d4bae1b87f423b000000000148d6f5050000000017a9145769c2993f4e5ce65b9fb8d2cfcc32d89a3f581f8702483045022100a48041bf3ec25ce598d296ef5a8921b87ee0042ab270aff262c0d93149258b2702206b3651ce37ba5cdd8bb4878d1f57d893e26164addc9e113c5ee77b3a59fa6d140121027629394a1212223c47912a042415f6acd633276f6f6e04908cf482d0b7a470cb0000000001000000000105301d898024fe4eb4d7ac3c427ed2b8a814b8aa570e7fe837072e4b1d4fda35d2280000001716001499849c5268aa56bcc926a84af89aea7503346944ffffffffc7c240b023e36667f0a27b89165f55b241947e90d81727f2714cc2d269447838140000001716001445b12dae29cf759d15da6ee780cad78b4c8ed942ffffffff006a1535540bb38d089cbb74855c9b7bfa16dfe88aff60332c033e8845126c1a0f0000001716001421baec96b444afb4fa5c4628c03dbf9df138c731ffffffffb4e318ab8735c8c26ea608e86c8c6be95294a07b6a57d304d3c66edd6dc491ac1700000017160014466bc3d31ffa5ffa811c9c767ed4704ff7b19dc4ffffffff6c8a783ab2cbf4e8f1fde1eca7913106f4c08fb41f016d5da3cbec18da5a84711600000017160014e0e9abb26e2a45fe21f5559283a19c41be6ad885ffffffff0280f0fa0200000000160014ecd024f0d14a7381bc197c1b0a3bfe460838d1ef6df5c1010000000017a91420684134f71baca5bcd8b6eee74271fc7e8a7ce98702473044022017092cbdc51d4e9d58d18b207f6fce9f9d0c637a2d0ff5f20b80e13afc880be902206626c2de2193dab60c469977583bcfadee9213b7fa4e63dd9aede681e31328310121039bc8db590012b6b6727e0372c850499b6c8fa4aaad1e0338df035c2342c555f00247304402203b159768f73e24598e5a8adbbbb79da3c53fd397c13b9d52e125279e987f5776022067784e4c0fc16165f251eabad0357496b6efe89d37829cbf12147a18240211ae012102c36d50a06a143a93d9d3ad915b31d8f0d18aa043b14c30961a474b593e4f0a3702483045022100ebb15273ef0ff74a5107025ad7355c3def422bba3d5d64dffcc38c740c90100a022039fdffe70d3dd863bb038ee725d976e07ccf252c0150dcfba1fd8d330dab955b0121025458bb09091fae97aad20645db35a00559b94ebf632c263824028000c99241fd02483045022100d55284d1562621419238366d8952ed6efca1817b28781278e269a52b8d2da3d7022040ec89c71b896a209954aec60713674142bd2d1462f0e6e565ef8885e5884ef90121034145fada9cef3f52e5bfc74d2dd80194750f9cbbf63793bf4444516ec66c868f024830450221008a6dfa2d631e11212d3086ceb3a24ccd9f4b19cdb5c80933c01c7c137defe70002205c53f71229d78ed106384b370ad3eeddcf3f6f749a021aaccaf201066c49007d0121020902604b222dff62470f933fa417b90d7b14f91c3c4979b54da92d49721458430000000001000000000101b8e2c8943acca24043b9ab77b29eee6e382f4626cf855581213e8a708da942aa0100000000feffffff019a7b0300000000001976a914bdb86d82e3345a47332fdeb4f755257c2ccaa65a88ac024730440220451ab38dba5a0d3b62e8f320647b5b1b224e2c1488a9a8715e1e9bf361ce0bd302201c900d89749802b11a0319c7b416e5c69b1018f961a587f3e16eee5bc266430601210375c90c7fb2962b94b2dc6faf2354993292d9507ee8e4284d25e5ca5c68d3e4790000000001000000000101c1b7500fa134334500cd854d4f4b1a7f7199b6631bf79ab96067cc2cab1e47d74300000017160014109cb3dc607f8023964eaea11986a1a1c54bcb49ffffffff02fd4002000000000017a914c5d21cb16d7f2a8c8323f345b3a1f99669fae58887690400000000000017a9141055c143558305ac1a5a2cf5cfa6ca8db77f6ffd870248304502210097892aa629bb4a7eb8bbc91d565481b8cfe165a97c173dd8f1892ac407c6c0100220750e66bed8dcde4fea8e0e04118f21d3bd8a9beb79a7a50a086e2608ea11ebd501210325f6043dc9fe503da7fa0386c8924523fb2041afcc88e00ba6e04bf9dd3e0edc00000000010000000001015ca40767387e54b7782328dc337732c54a7ed13620a9d8fcce6e441fea0411ff010000001716001442760c79fb01a00ddf2639bae3c12680b8b7e646ffffffff02475903000000000017a914d25588d631dec6322a466bae3b01b4283acbdd35873b0800000000000017a9149c20563fe74ae701ac23c3902e3bff79f9b02d6e8702483045022100a9e35f21125e63536bfb0cdfafbdeef058e090fc5e2bd8e0f9dc12efc04e8a75022015f1fc5bc12b408561d7b90a615c2283e05f7013faddacb24b9c62dc08a8b51d0121038e54ac2c0b6bf961207fb823e6f0607be9242e558898c208e4f2b073420aa3ec00000000010000000001015c3de906f335760132290977215e70d74ec213e48110fde9022cfd529feafeee01000000171600143d442d11bde6593e40e2d4ad9fe9b8fc515c4a63ffffffff02a54105000000000017a914391e5ea508c55a34188bd4b0a8acc5b9d256933a87762200000000000017a9140da334e7627425e547e50d93b9838404f9ff2db5870247304402204dc97c732a2648b56e749ed940865576327f8f844c7ce3fc572abc15f29a08610220547da9a44a01afa1f1d522d3433fa141f038f6c73d53b7479fc07f13215f4ffa0121024ce5eaa835045c98589be06dadb3fe16c99fb20a7c8043a5e81501c2de4f9b2400000000020000000001019c1ae4590637360a0e622ecfc70d8415f442ec7ceddfcece4f462435f62fd9230100000000ffffffff02f00a11000000000016001470023b13bfb0436885f11d5b683574e9f83a6a252eaf01000000000017a914d154dc3a3dd1eb53832a25851e874ed772aa2e0087024830450221009f463ee303ab8ed3ffd8e77396bd2e9381236b81761b5b9b8f50bfc944f1760902202505d74644f9de1db21f6d64a8a6bc79f7cc9ff2d3718102126fa21858363a4c012103d695dca3a9fb93f18f34b5b4a3b86fe770d92fdb9324fd76feecc94e04a796010000000002000000000101466db7dd3c3314f067f605c846bfa5a3dcf2a615312862667e2a0c7f2465d6a10200000000fdffffff04d0e64300000000001976a914b7dc8588ecd41fbc67080397138e70b7bb27d00388ac9a364a00000000001976a914b816d2b9687d767b0501c461a89aa407156a6e5d88acc0d40100000000001976a914758c269b925d45b6d9f38a6ab70a04944a7bb44e88ac9d15d7380000000016001419cb5231f64b7364a0a6991ec5910c8f0d4b69590247304402205a69e55359818d66d1c7748cf0399b0625a8a96e5a21f3e080b1fe2f44356b07022059e4e8bfb82f8d67e25427c7f76d0a3b37d601865eb366e65769568848950dde012103ff7bbcdb27547c34034b8224b43e4d22f4021e941e46bfeb7cefabb6e7d963fb40a00a0001000000000101b0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b259270000001716001410720482c51a73668e2df9bdecca39a5930d8b48ffffffff0216e207000000000017a914e0cc323b31c321dc8247f18ac6d931d6267a83d4871b0800000000000017a9142654240b323666ff1eef8738b5b1de44aab4d7428702473044022007b53e034d514d2c439a8ace5fe757afd7be52762f628cfe06c07d541d37feca022008e686240526743c4740dcb7fdb6bc75cbbd6f774380cc06415d88c990de00f20121029448a41e804dd0e85c700193e81c438525b7ef0d8340541b727ab505fcd1f97d00000000010000000001017508cf98127f1c3e9d299e57ca5c96aece586884bce389862aa84b983fbfa1b68e00000000ffffffff0142e80400000000001600144202fe19401a4b3febe07823fed5341feb09061602483045022100e6a5fec2a8b242b3ffe916a1cfdc614e02f4889fa8b78e636cdbd205d943e57b02204640edd8ccdf2ca775027fdc7808aae131f2e9a3ec4cd0f4261d69a8c03e2f7701210361538bc26f5d443808f3aebf37cc039a97d94b4bd86f4f2da4d1584854057f500000000001000000000101c013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c30070000001716001477b1947d5fde62968174c148f0eb23ef2aef3c09ffffffff0233f102000000000017a91419f81312def65a3d6f66d2981f156ee45a0d3003876f0200000000000017a9142d885eec7ca99a25dc17cced7417876194a39e3a87024830450221009fca9a51605de68ddb29b00e1b6b1a7c9d55ee772b1b254c40a2c4c286fa2452022078b4172679c4b66416917f13ee8c65d3567aaec5c5a75b587b1b93a0cc2d89250121028e8dec430ceab002b8e7b3da65f9d5d58345b5717b62b3cb7c465bfb4c0918250000000001000000000101fdc2a85587e61a77f83a79cc7bc071aa25f59123f0c08c3a37dc4524b1ebface0100000017160014d527a46d30539763d26faf3c19085d52acb890deffffffff02a7050000000000001600146d7264b5242cb7024422ab693623fe2e2a27aa11d9ae01000000000016001448bf5c78838ecac57c73ade4b2153af93ef72fa70248304502210097cd34c6a924be5358a854abeb643fa06e76a248028ca812b531ea02a90df51f02200c902fe493896998d0c3df7c3bf3f2a90dd2fd8abc98e7a7172bb054f3f48082012103300cc0f4c602e10e79f9f6d60be10a651501b6e42a059b0b3ed324ecd2ba2bc10000000002000000000101f494af74041ed5a3868e49d6b5103ea9c17816d8475fd7d370c7ead3c5eae3670000000017160014eb982d4da2f17b2066b65cf4851af49019cfc6d2feffffff0200290d0100000000160014a5220fac55e222190b02ce7115dcd63ca4f4386343e1b804000000001600143001662fbaf92af1d5934921f0492fcb70000f090247304402201be1b6767cb0501368d9b64ca169214dbb8e6ad5ece86011cccefee3d67e7ab102204b6ea08dd2040034be18bc153da06cd5f37eb8e142e6c995bfbf9f5c6f998aab012102de4bb734892f676e423b5d0a99e99f465e17813c7d0fe0ac3d444fdb34a7f8a247a00a00010000000001014abb24584852cdf91a6475f801493a4a29cf408b31fd93685a162014ec54ddf00400000000feffffff01ea3c0700000000001600140713f3e8245d979f92fdd2afe44f3e527747045e024730440220201009ea87f72dee09ecd3ab5bbbb201344c3a773fc03b61e8175ec25af944ea02206b8c32c400aea8a391acce098e97795146b89c3424e10ac19c87ccc5c0c7e4fa012102704c9a26513f3dbd3133de9f8822803132136597a129e2328f5600cdf6ea511e0000000001000000000101c1b7500fa134334500cd854d4f4b1a7f7199b6631bf79ab96067cc2cab1e47d71400000017160014163381939a5897d14a62a41079ea2b4d7b1e0d93ffffffff02146403000000000017a914411cad984b573e3cfc7032956eab346390a3577387a70800000000000017a914c30a66a3a44a50f4c79f3ba38d0bfa469a86d08e8702483045022100dd476d7fe7188fcd282bb10f1da205937c17954d1b700d76c16e7504193d734d02206b292c9a80d93b7105b0cdbc0ffa1e04411daa882d04787e4a5d7e9b07c05a0e0121028ef52205cf2e7491621dd8afe343a3c0fba73bf1e99d45e76e985af613d41a6d000000000200000000010114d06d8bc5dc37b288e6bde20adaaf2a31c2265ab988c178de09f4007fa6d9cd0100000000ffffffff02bff00300000000001600149b727bbe8837a8045b3e34409b84ae4e6a3d812d4623110100000000160014df3989b1cc3338a7fd0861190f14bb01961adb760247304402201112eaf2c67bc7e3093a95461f184a7ebe0087be87d27088dfd63acd3c11b6d102205ab831d2d3bae36e2979fb33a5ef5eab9fe9f7ba52e1ed48fca74d45124b83b8012102f02f42f6fd571f073b99e26b2dc2fdbfa34458cfb9204c57fc675045cdcd19de00000000010000000001010801b2feb72d5490f4aacccbe9313b4bbe59d4182ff43d301c968a74edf2f31d01000000000000000001b26100000000000017a91407c9c6b10b1797b129a749e8e6891c7f25bbfd59870247304402205d0181b804383f711d9026d800d31ebdc54ed0c43335cef8d66167eca1b62c5d02202a47bf53249da411f6ce40988c3a64bbb69e7ac14d711e37f40bea8693dd24020121039ee53794420665635ab65b8f20e6c1b185933fb11ce80dc6cda6886d3e1e4c640000000002000000000101765efe3e30b01d6e2c363d1efca81b8cc0eeccf8036772602c59a378426718ce0100000000ffffffff024645030000000000160014b2c33bcc41f59d262d8f120ee1397594afcc222060ac00000000000017a91457cdba1d466393109136f6e6cfddf66ff9bc67bc870247304402204d684e702cffa00f968fe35df33cbcfc550b677c6015adb7edeaee5772e5f24402204aac154ab1d35dfcd88decd5124210e70d968d1a2aebb8cf3e551d178c84ea2b012103fe57e0c78fa87ed3c28193e7fff70e4d81f4f5a9487ba5fc63eac2e751817d810000000001000000000101227cd7e4935f2ee091dbf091d779df6f9b6a6c5b519378293a304ab57fe627848400000000ffffffff01b1b175040000000017a914b51774039075bd0a15f003f8f9113dfdb8513d388702473044022068aa5d23086730bf946eccb4b9f9f21b6a87a35d46d5fe92bbf7864462a90b0d0220711acfd5d0b9cafb95f200b358928f2d86f0ba4a21e665fcfb258a880bfb467b0121034f6a0855d81654ffd613a032c7043dc11398e3e2e9d46d22ac0337b8e000152400000000010000000001013ce79500932c23461084ef7c6b1a404d250a2775a2dbcc61ed3dd9e09e16a36b19000000000000000002017000000000000017a9147fbe897c4aa5c63847d579b7ceecb6bc2e7109e187fc910000000000001600147bb5e5a244d995c1fd12fa1a3df66ab90588643a02483045022100ba1c6bde0b816aa852d609631a466f1740986b2bd67a1645dc7657d5a3f3b21c022040d090d7cbb765d5c3b50b197a100c229186617c313ea5d6eec39b36c49214a0012102be3619a239990e598704545af361a3a845c25fad4388e99c5d6d6f5fd5de002a0000000001000000000101185559c8b2e7e4bf2b6ff7bad1587b6888f6aec4bd9ac92030057dc42d22078e01000000171600140f8acee47c4bafe01d132cf607bb12575dbd1780ffffffff0265f40d000000000017a914c650d62520fbec0d5daaf86141acea82f1358ca987800200000000000017a914a6144e8a1b245664e7edb3c41e91f9ea8926e7ef8702483045022100af981e827ca1784097e9bb958c9ee89aae004a09e212f3a79fac3756981a41050220438778a3b2d03bb3dabc03e12d17a1a57901f3d6de53125b1aae48b17887800d01210335bbd372b36e294971f288a1a13ba03e74b78b7550478a3892effb199ec5fe0e000000000200000000010183f8f78840e6ffebeed392f6d4869cb556d94a18724da72c0c481ffb27314d7501000000171600146c1e9fed62324a07d04cfac99f4c5590d3339bdafeffffff022b3eac010000000017a914c6ce34b07dbbd171dda9921dac7a153a7f48f32e874e310d00000000001976a914bc6a858a0a08d7973cb5f35b632cc6e62c8adf4588ac02483045022100a65f3b7822596345eb7f3938601350a480de731d1c2b58519a80fe5c288a45aa022051e57ba10ccb7ebc0e23b667a4ed410e44338b36c3f4618811ddf540bf9fcd7c0121036599fa85ffc02ddbee58755e90b1f863d3ed40ce1c75bd9997a4d01ccbbc11ab47a00a0001000000000101f13fda694259434a1de909cfb3326e742f2343fd4d41cd15b6f8bd2fc73606920100000000ffffffff02867c01000000000016001420bca679c37eeb76c927fe3aa761146c39de42356e6b0000000000001976a9141b10e43c085551314d8e405e1f93f932f620972888ac02483045022100f7b6750797fa9542c39da76ca5dce74d66dde67109558789a6232f217b99ff10022007c1ff9d90f301612dd241b81d9baf0789f17573dda7350d5abb210e8504927c0121032f5ba3643046ef16b942a8015df690d69ee2639a39e7e309d8ce7bf7bfcd07ff00000000010000000001012188f70c954c903498cb1f7651e926bf0b4684453ed9d816ef6bb39f9ea09ab601000000000000000001261500000000000017a91453ce5bcd67f2fab7567666d4f15fb24014b4011b870247304402202425ac62a827390d3284a4ef24a9395d8834596428721f4a5148c73f6f4f839202204fcefb23394a770556afb8ee26e3e5b2a05074a8501c437b0d076b287013a49c012102d2afb85c3fe7f20bba67062499b16a3643a11a8e90e65d8ba3ce74ba71570d33000000000100000000010148976a4c37c2909ef252b8fc488adccacf62a85990e96fca29db382d37ea88af010000001716001464f60b9149f51ad9d2b4624519ae04d5361c53bfffffffff030000000000000000166a146f6d6e69000000000000001f000000a63f8127805c0a24000000000017a914d37b42942a6bef8c6a68d7f51927364b5d5fb3098722020000000000001976a91426226f3f2e24f55bd2e89ac0b2a9659450daa43688ac024830450221009e417e2b15d16da93072b748ab1908896bd8cdd17cf6780c57516dc98e5079d50220160dcb0fcf9f2b778c1ae2a69328da99b7e040d5f1932285023a96c6c430ee810121024283a293fc1a13a0844fdadb5a4fbd9b7d90ae339e7c1a37295aa636339e64df00000000010000000001019ab4fba88dd02fa1baa41a11bfec8696fb01c0028af89f95f0b338fe8565e822010000001716001464f60b9149f51ad9d2b4624519ae04d5361c53bfffffffff030000000000000000166a146f6d6e69000000000000001f00000007e321aea4c90224000000000017a914d37b42942a6bef8c6a68d7f51927364b5d5fb3098722020000000000001976a9140140e2720f825065e97082a6ef25cfa3d1d929b988ac024730440220463fe52d05ed3aaf685cd04dc91412ef9c97589ab6afab8604c35068add261e8022038a6511622b921975ded532be0b5aa3ef3c20c20dbf8d4349c9d00663236fa280121024283a293fc1a13a0844fdadb5a4fbd9b7d90ae339e7c1a37295aa636339e64df00000000010000000001016cb0f1aa3868fdc51406f1011ee0078b4762e11c1abc0da4865b4895d4433dbc1000000000fdffffff02990b0400000000001976a914d9f1767af454a2eb77077d01b9f06558376493e088aca50300000000000016001421cb4e6fcb7fad458432d4f34b97203d4da0f54002483045022100c95ee9440117ae97e38a7e452bc87c1673abec478a79a96d1d8b3a7b6be0b40002201a1ecf60da2dfb3d3f09779c8776578f51a9311bd6123e49b33c7437d6ba1c600121039fd22670245b3ec33ac30ee81c750b845f618c8b925683403b3bc2a58e2f45520000000001000000000101c685f5e5bfe64d84afef1e595b8737a934b380b90a59793586d2f281e5ce6c3f3a00000017160014f7079c4fc6cd3a3c73fc03e838161ab5ebccb6a8ffffffff0273f11e000000000017a9143090cbf9a65a581105359c373d6059dd91531a4b87c10301000000000017a9146113f5ff5f33febd068431fdba20dad8d0b83c6e87024830450221009dff9bdd03948fdfc4b23c3a7d1baf2dcf0057460f04a51fb24b1bf587008c980220782c1af22a9f9f9832581a91e2d407f97ea7d22282e6314b1a78a09204f524740121039f917b15af4fcf7be56d43dca481ea89ceeaa5f5d66bf3a7b5fcd498a1e9ccfd00000000010000000001010b7fd3c6b0b51dd04f28dd2d7673b8a26cc67fee11fd998ec749cd73495ff5a8220000001716001472d78fb791786873a7a2cb5f648af82ef365f912ffffffff02fe5511000000000017a91421437d57b9d80f76a910e10b10341d4cd9ecd8bb8753da00000000000017a914c02cf1ec2c6d1a79a843f8ec548199fa00446c80870247304402200b7444b30a38d0880a7ebcd54713a096bbdd9d4f0628dcec90a6c5ed2dc771eb02205f6d834a6426634dfedfc5a610b2edbd21f839de805a3571edea71da7950bcaf0121026a3bbc7e5fa4a23c8a484acdef8cb3e6125dc681979d5386beeca1681c215ff10000000001000000000101ab2ade9eeceeff7793d944f71dcfdd340aa6933bff899f4a8e70d53ffb43b7737c00000000ffffffff01a789e4030000000017a914df9179d37d0ae98d82037e4d01db3b61be2b092e8702473044022018989bd2995339880a3c2edc3305432fd8aaa636e463d89178c1e30c3016888402204bc5ca7c26f15e0c43b2b966d02c54328bc545289cb0dbcba9607933658fb22a012102cf380a4fa0b156e2e95847f2059409b2145bd80d864e6d7ba483ce9f66cd9e0f000000000100000000010136308ef00b5748479ad58c873e058dc7bb48ea159e06b63b9fa60da7c4d3dc611c0000001716001444db1716f81123310b35e0ae0a733ed0b3702d07ffffffff021d5f06000000000017a91418c15a44fee7064558dafca2bf1312f206c1557e87a61200000000000017a914861153a90c6960166c4afea9051385d4c1fd16168702473044022028a63650a539b81192285d8ceae69e9c7fa16a8110f4048258461458c8ad7e8b02201869e77b5a8cac45f74daa8ca5ca31135a82d2788f8e4cc55a1aab6f16c6255d012102535b30ec220b330a8dfe5ec11224a3067d7a1e294800a3f94c93d5b46ced44a8000000000100000000010152c3f0978fa653fe8d9bacf1777991b4fe79911775a486d4c7a5218dbd0cc5a1040000001716001429a3efab13874a0a53fa25dc0f2305681ab3478fffffffff02052043000000000017a914bb7c74b12a2e53012b18ea3a1e3aa5e63407e3c987da0300000000000017a91470f7c776a2fc62ba8adbbafb233b28d83d5b9f5387024830450221008541ed98cce39d92d6258edc30afaae6495ff973f18a619cea43a93043dd129202205f64e2f12eb54f9b16eb266f9622d2a1fbf9a92643cb47ba3ba0d72c3cde5a27012102e6fea74668d007e97721669876e5c918452f80963a339bca3bcf0ceab83db490000000000100000000010114998dfbc6c24ea35ba253df56cd64a1db11ec904b8dc10dafde095e98928dc70000000000feffffff02746700000000000017a9148443845b2bbef890e4959e15cc55d80ac29105b187f30700000000000016001497d489ce749013505681b648d6f45232084047e002483045022100f45a7494e03cf79ff838fc87711bf9431c656d7522ecc7989d0f67bfe220735502207ed8903fd0c55bef0fd9e59d58908050ad8b2c534c9062fc604d92a9dc0d832c012103dd342bbc5c5eb5a121e11cea74455383f76d7e3c38742c277a6898b096d63a08000000000200000000010147297ffa92671249d011aace83a185831d722f6004c366a00f9aabc9fc051c210100000000fdffffff030369f73a00000000160014f90263428d7f8a62f7a8566b68b5f8525cba4c224d614d00000000001976a914b7dc8588ecd41fbc67080397138e70b7bb27d00388acfea005000000000017a9146b2b5b7719883bc97583c73486a8d9e9f21d4e1b870247304402203f7e323ff34c76da8ade013b89dda34708c197f3049026c3fafd5cd7fbc67489022047808c6025894d420fde75f23d1a9bdfc38e577e5d00d8ec58a28e2b7069b670012102d948fc174a1abcd17249b8e901ff382a36a2b8b5825512051fbc915e08d854fe49a00a000200000000010195ec730c8342b0b58871b14313c5d335f1fcdc671d71298535ca2882afa0b97e5c00000000ffffffff01cd360d000000000017a91406af7ffc225426996d1a12aa2398390c6f9f1e57870247304402205f22ce82dd176be659e96eecdaf3455be4bab8953a0e649e5d59ace7d8041b18022063ed9ba1446f40b1b05eb715bcc77046eede1223f2bc4005807381524adb6a0b01210336014abe4d177267b8518dd5e176fa0e2d1f9ab3e6d63ea9ab50d03332c1582e000000000100000000010198b854c572095846580696e8ef6ffadd1c1f41d4302e9a691106366c84e35dba0100000000ffffffff02cbad1e0000000000160014c6ad71059dde2e88f4cafff0039ad29c403f1b0d0d4e4400000000002200201d69e082697465f22b59dc9e3eb7a045efb4f62ecc9bdb03ce0c6102dbceecbb02483045022100df8640bf0a164a50d3b43c97e4ecedad09c67bd23b175effaad280ab8564737502206f2b3ec991ad924f05bfa70337feb145407c7c0a188ae4de62f4c8a2b1885c900121023681668c1c804367432971b92bbbf427aecd35d42d7eaccbd74ff03ecdbd7fae000000000100000000010196f77b2544e5fadaf136b5db52e673a601c6d3e27b8b43213ae1142a5259c9630100000000ffffffff01554a4400000000001600148306261a9bfbbeba114ec90a248b6b1f6ee0657a03483045022100d2d4349a379f233540f283e076836051eb253b84df2aafa3ff7e3cacb39fb196022038e2b8fdc0456db42fde5130202e4a16ca65f9d7d93ea22ff231212ca7c455e40120c519e74ce38d748e4a92bf44550e8805186a79e8d67ce569b858b7f1b196a4fb6a8201208763a914d1bdc1e076cb9c60cecd6d9951e47ebf1e140fb988210374b61c280a7ea29493d97316e549333a207ec5926e89e3fc00cbfdd9deaea35a677503d8a00ab17521036bcdca8160004b2bc7f3f01116502ea61fc8a76704a2a79cb052644cc240c4e668ac0000000002000000000101c1b05bec62244100d8aa7f1e8054bdfe23dc1c3afe721ccd6e456be8508a72100100000017160014693f3c22d98acdfb06a73bf4ab5024f5031820ebfeffffff02f99910000000000017a914fda0f06ebd37b9a4548b33e31cec69ef5f452cee87c0c62d00000000001976a914985cbf0081af2e43f20b11760bc1efb30e86a35488ac024730440220212b209a1a086d4f3ebef04008a1d0f143cc9b82203c6e4ffb3ec3f2bc14815f02200d600e70199f15fd2f040a976b63d3c1ac413106f9e3b8db067ac587cb7d7b2f01210365923f82410358e57325c2b0dd2c89469855d00e1029f9909c96846f345b116c48a00a0002000000000101dbf42408c64fedcf202641b3e50ea1dfd56e9d13d6d8f510163e9f28e47ca88f0200000000fdffffff0e79bb00000000000017a914767cf39a7b609b3023777bef5067feb8a83dcdc687b2bc00000000000017a9143f27908b33da919cf2d998642d0accefc31c95b58703bd000000000000160014db7af6eed964e531ecb6d3f55e3c07e90d4f407b24bd00000000000016001429859c8c1dc69aa9e05fb082071ec3774e804aceacbd000000000000160014a26d01f990b43cda367e956d7b429a9107dd97380e6a0100000000001600146e227785bf349ed37e52c89ab54ef07b002ec3181b770100000000001976a914a059a162858f2174cad9c3fa8a80cfa77b2e4d6288ac2979010000000000160014a26d01f990b43cda367e956d7b429a9107dd9738c37c0100000000001600142ec4e3f2b489a84bbdf1839b0ec7dfa3ade2f051c9f3020000000000160014a26d01f990b43cda367e956d7b429a9107dd973833f70200000000001976a9143dd00c0bc0f06d8c5d05d8bdc5188faa60078a1e88ac99f7020000000000160014c3c0e70826e640a27f08c9f2238b8ba2f87b5c79b4f702000000000016001415bfc41b02d239b6396fd124f0f0c263cd6c6ca0af94410000000000160014879fb8519fa2787adad4a0b555c2ceb6ecd65f970247304402204a7a1e10ed34786ec19e6c3196a2a9b9c25a64947efb6da48a2e50fe49bfa93f02200e5e1fe1b6fe28949a4447eb033bc7ec91daaa9ed9483ae0e0540a1f0796f699012102bccfc773d0c4a8b98cd83cce08af987c0c11e615bab2127f8dc065cad6509e5648a00a00010000000001015a8ee6f511b5b2bdb50733c374c9f3fae9a8f65951c8e5bb859d88cf6b0ef08700000000000000000002faec08000000000017a914c70df891a36004c4211adb6dee4f74e8181c1f1387a45e0900000000001600148bc4e8f3f0ec0ff86bfcf97c438bb676ad68b98b02483045022100aa114d393fedd99994e873b43f8b150b6f37500fc3cb22bfd5d9c9469db9b458022056da1ac2cf776a3874848e4c4a98ef433a488446345dc8e4e0190bbf0f11a2c40121022a1c752e69eb193a5922da1fd853eec066b16ece323c931ca695a1ecca09a3160000000002000000000102cb27c664cc4e95846ec0d329a4a1eb3125f58e37fcbda1e359f9b59268d3ba8d0100000017160014b50db181dbf747a953d1eda35b782a181d375573ffffffff2f5d30a505add77b46c67ef4112e1a27ae2b6173869ec996ade0fa5a3075868b0000000000ffffffff1a205f0300000000001600145d3d2df08d877eb0fd475cc09289c56a727e8b7ac6c139000000000017a91498aaa4e75b38def102480d8cb7a91a409c0db4f187208e0b000000000016001469fe48a1fe79a416242380d16b5cbca3397593ed34240000000000001976a914853ec8b4941e99e60546e08e387677e6e417a19b88ac3ffa00000000000017a914dddb9a377d000add5ba91c629b1e0d2eaec5cea187cd9619000000000017a914e5fc1aac83020287b878693e680e7cc42aa47dd68759200000000000001976a9147ba171afe97b350b7c90f9336e4a783cfaf2140688acc3ae01000000000017a9145f53c6caa4555750d07c410b30408355d15041fe874e6237000000000016001411fd0b1eec216ef9b66ae2e9d48dc2eca90e63fd38ee060000000000160014183ab98f4eb39070f13cb41b6441865f9fbc9f7f606d00000000000017a9140759dc1a3b5b528d3cc613d9e61d9ca8648f481d87609901000000000017a914f9847c0221836b3e575c8dcddf88405c3641a3c287f4ad01000000000017a914dc50572d8a0ac23f736e2bd666bc254c697155ee877e0901000000000017a9148d989677e5afa2ee2193b03d2d32e9e950facfd287f8e809000000000017a9145f262ddb1563ae62b220b85be416d9e0fd4813a1876c3a09000000000017a91464e31d40d6dca61d9747c663703ac71072a81802879d4d00000000000017a914f829b13391dd42fddf0339b3e92cc4c3c7decac087cfe200000000000017a914a4ae6bd33137c199bfb384491f769e61379220f2870eab0300000000001976a91476cc45a57451dbfb4f9e1d2cd1cfa5f2288c424a88ac7dac000000000000160014235a4cf84665a9bf9b4d74b6c55e91a252ecc5d962d9390300000000160014e13ec45c6d71a71abb33e1b0553cba4cf622a1b74e9b10000000000017a914024a2b28dd3b0cf48b4107bce9c953f8424505ab87e62d0100000000001976a914b4485705b3d059c2931150062b8dc8405712d66988ac4bae0100000000001976a9144733e405059e028c80be69e89e3c04d5747f22fe88acf8ee09000000000017a914457c06a39d8a3df81619b525d6601843a3cb01af87303211000000000017a914af82f72b062716685d4e68a619d992e3542556228702473044022029f27df227f4f8988490d1c38b6eafeeee8a35c0e02bc2bfd6364e7a82556801022070d5a8100350973554a2d000303204bdeb29d6b4e77d9a38c465babcbaf22ac30121038bb6e00f69d23876451b555b21d85bfb886404f570cfa451da958f535fd8dcf60247304402201e0945f54d3c8fbbf7361adbb0099824347320db66dd2af2056a55ca0ffe3d040220544ccaef2ae4f2da0874108e4f0960261f436ab47a35955d41e49ed4c3d3fe84012102023c024f26f05c2953ff81d9bf2d2eccf28db1aeb16fd2c21b39939121651ae40000000002000000000101d5eec262a7909035f87da5584b44542c50554c3f54083f9e5bff76e524c29b7c1400000000fdffffff0190ce39030000000016001441c1f3dfd400e4a08a9b26b192d16fe7594426c00247304402204eda94f7152f8d36595d21e8e0e40716e29e7b5b6cbe73d59a77c774305c208702202f38dd81f5a0a7f0c92b9717750e2ea705f1aa7a5aa2efff41728c71af28ff400121021001b39665e500be746559e7b95bb35cc0d6a168d9b06424c3a57e88bb68fbc3000000000200000000010237150aedff7065509f8951091dfe19b20fd28b5b7e523b55d35fe1e36d6c1c151500000000ffffffffd5eec262a7909035f87da5584b44542c50554c3f54083f9e5bff76e524c29b7c0800000000ffffffff018a9a79000000000016001494ea3335fb0f606ed17029a4757a15f87c0e1782024730440220530a8840ab1090f9eb6cd16d4f4f6fe3a652a2274bd9453c5b0a82c8f06c67a7022059cfa02e59210e4ff1560563f912537f872c5f50a2ea053ec515b26f11d562500121032ed3fb8db6816d57bb27a8498db69a18d7db84e3b304143e800dd50bbe1f6c2302483045022100f197ef4f88c8a5aeaecf92cf5b3bb70035965463dfcd9776c3d344215b309da6022031dfe0f0af51163aff051697f8aca21669f8143f35ea9b88b79f8800b646d6810121032ed3fb8db6816d57bb27a8498db69a18d7db84e3b304143e800dd50bbe1f6c230000000001000000000101dc134f3e2787802a804547421787765fbcb7853e4327d1e55fc25a4115ced8d17600000000ffffffff012e2eac020000000017a9148ad09b9360d135024d34b8cd222d9b3f966149c8870247304402206d06d1f612a811e22578ceadf9ec623b82c29895b6b454a5e43c97ac2fdfdbfd02203b75966bdc1a77178d02e63eb16bf269296aa09ca2f5d76846555da7bd2f973b012103796f18e5e4ee20696017701dbef6456682ccc12e4173664dc8bd5d63a39c77bf0000000001000000000101d5601c6f7a6fe36b1f9bf4e93c49238580f1fe8e4718218eacbef50dae4e64a901000000000000000002095901000000000017a9148aac531980ab0203bb869957a8ddeb7ecb2398d187cf180000000000001600143e6222d358a5000bed56ca72f72c7d14092b07b402483045022100b9e149f827e99fa794dbd5283d9359eba3c5e05e1819367d3715d6e3c1a228ba02202e5fdf418381c05ae917348b166e07157a68772bd3e9cc159f6e99cb4d0854fe01210308045ab26eb5e32de2006c705f6784f911f1e09322c746d7da372e47cdb7cafa00000000010000000001011cce50f8a1690d0138cb26ed21df7fbcebb602b941cb93699910bde34b84d0d41c00000000feffffff0191340700000000001976a91414a57557140919fca469e6491c2677594960089088ac0247304402205bef85fdfbc83e6f5c3741def26b1ebed2c6f03200a3f8d8436902169835cd640220152b68cdd52dfc4839b9449f98ee3313746195a39e175e4666ea3d63a6474af2012102c48c498d549fbb004cdb8338c6c2c8f694c1ff6830634fd81d8773f79cb818d80000000002000000000101aa6fdfe9f7bd2a60fcb01797cddb2781d05b6b8c689f6480a7375ba4473fb9ea0000000000fdffffff026ae80100000000001976a9144274c8e7b8b777707c2fd1c4d51b4a1a9877e42888acfb40950000000000160014cc9edbbe737f64efcdaced8065b568129e238c2b0247304402204fe6fd54c7035e7b38ad816099bb45348e46f70527e12cb8ca769e57baf9e4e20220202136b6a25e3b7a92861aa760a5e4b02e403eb2f67506bc1ed5967695cfd6100121035ef6200243d294b5b07289ca969990c729b64061514c8ab054b99002f5a8833547a00a000200000000010197e6f5b6453da407cd142aecc652a1250b96aa27c2b480ab6e9ab7dc029ac7710000000000ffffffff028dd74e01000000001600147aec05dedf59b5a05ee33247b6fa0fc64d6a01bfdcb2410000000000160014eefc04e0e863a72b90605e52bf8d39e221924c690247304402205920ecc3b32077c39737323b8ce1ed4efe30311d15f1e87e8cff75e5eb653062022004230f1f4dca86857bd7ef7bc438c0cbbc1bf16e603211d8146d9500b73b69c7012102648d491c1235d6829efd5b4678441106a4be6e71b4cdf242aa75f27370f23b370000000001000000000101fe9e975c14312c6d5c9ebdd3ef15eefdf641b8477091235e3d682cde4274d1ba51000000000000000002217d0e0000000000160014ad134debb59f78be0d94b0eb1427e7d016807c558b6e030000000000160014ae589bf0fc5001d7393091491af4acc510b648da02473044022013189e889a250e16ea589999862a1f93ca737d02d4f7526d94754cf075740c58022048b590b37e2b9a91a0883db31151024c3eaa7ffc4000b698c0318ccf35635ab6012103eace4fa57e802c0065bbfc5acd3366495d0e122949ae0b0ea20842830877e498000000000200000000010134f43eec07e1abe4403c6c7c65f37d48d9cb82e0e11f598ceeb7d510a6a9ea060000000000feffffff02238c00000000000017a9147668626ec49f3d86fb9cd255587f1a6481a02dcf87f8600a000000000016001427db11c7ca382e97643bd5ad0e4ee91d067df9ad0247304402201d91686f99354778c02c221d3e780a46d4d0337cb18b8cf9662f77989c9206cb02202562134c3aa71c0963ddd57cc30fb63ba0dc31b8697de63e4abe770e116ee6d401210213a2bbf5a5ab4ab0241fc86673ebc1c69f0413899c8e3b1f97826f3a2921e74648a00a00010000000001014b8bc8544e77ff31b14447522ae6dd50b2df440c5ce308330d5e011f3f7598440100000000feffffff02e27200000000000017a91465c6ff5117693d867ba590d49f59b44ab873dbab87f925040000000000160014663c3129381a58d74d97cac27d223cf4a950620302473044022038c13ae934c3d4e1e1bc3009d9a4ae4805d548b73b4d267e305a901800646a8102200e48b814ab51cf16e02d36537c983c9092f394241701b986401fd8d22b4d0c1c0121036d4f539d856575a1e5032d4b48ec1850e3aa44f7383b6f55fa6574270a3edce349a00a0001000000000101067e40ec13be4ed086823bb840d4e6c451523f276f87c0f5348dd01546063259220000001716001462ef4171a0f0e9f1ea284f95c6c1e6145c6f1c2dffffffff02ee331900000000001976a914a42eb866316d5a36afd8a131fc2e6e0b87661c1188acae5700000000000017a9147c9d75a7a4343b5d4f38d604bba61bc120f78d3c8702473044022028662a751bb913a36c6355573d382066b0c3701431c550003086c80a11c19a2d022005fe4a11ee6014cd85b332036970e9094b7aec1d9e3aaada4785a6424fce25bb0121026a06a738be00065dce20d7f78a140afeb5c0f32316ee314cb83851dbc273c81000000000010000000001012b7cea5580b4c5fec90598dad0fdfa55be5074bbe988d36617b8c4c1128a08550100000000ffffffff02d95c03000000000017a914aa920d0d1a09fdec6caeaa6a8137bfe15f812519873545010000000000160014ddff782c1e58e36ada753a15279c4970cebd485c024730440220170bc6936094702770b6d312aea644e902e8a6650ee413a60e3a7c544745f7e3022058b21fb6bf9b4f4580ecef0d8c9b543b92e62b1575d3e5ddb67c1c02e9867ac401210392c4e1128abba556d0261132731430716200989c6dea240cdb9f2e31cdbe25540000000001000000000101502fc2cc0a1b1b05fd16778af65274e9f721505c762a45389d887babd21d23930d000000171600141a13023dce61f22863fd250c46ffd180cf92e4a8000000000200943577000000001976a914e34a552ed1811c8d83dedf291ac30706a46fc0aa88ac6814bf530100000017a9148b856fac00defdd1d26c3ac6bc5d90b4fe67ee458702483045022100d439f9d7859c9c41aa27a937089599867a438fe09c0d691d43f0639b6c40ea90022024d5d873ed6bb41454dabd946e1d056866a1d0fa66c2bb5d9e21be4b5bc4b6c9012103658509daab2b7627d29cdbb5a14628b7af4e334b2f7f7989615636a30ff07ae40000000001000000000101d322f61ecfde41f01fef5cfd99af9493d1bf148e426d0614893401d921d33c573100000000ffffffff02732200000000000017a9147b512d7a165432863f5c801607c33be3b7bec858878b8f9b0000000000160014fa8bcce7b532f4f12d5061474d9c1b20874699760247304402207de5f031fcd9c291c2955e562c249db102facd5f4d3c8aa945187bc2e265f3b502207bfc38ca19dc4bcbcfc9317872d3e585b72aebeace5fc67955f9ace2b4636162012102328d1fa0a963fb4fb3a4a94793eefdacdaafd1c5329f79e0a5ad43472b2e90eb0000000001000000000101aa2d09d46a79f7e5db9415abb51f9f0dc650a382c8aa797d6af06a9c239f913548000000171600143a7dae435eec7337e92eb3807e1de18ef13ba67d0000000002eb580100000000001976a9144f726153d8ef4e4efecc2fd5259db6cb6dfe396d88acb8927a0a0000000017a914352a95c75d51035869918e6971be549c6b0024548702483045022100b50451fe8d9ff75fd7554e205c8865d7f241d561150c2dd909b83b11900f8a6902201ed04b851137e8949870e1415a0e58a4547f0a5a35ea45d9312b489dd87fbb8501210230ff50232073b15b48dbee97c16f7661eef894f655a6e5da32225f2cac4ab45f00000000010000000001010a152676d98ff5826ca427abdc20fa4c78152d358e01ab3b15c807e52c8293f301000000000000000002d0fb01000000000017a914e93a15a1caa676367077cf74f16fba76b2a3d33c8736b40c0000000000160014335aee81df75dcf90b657b966cef3d113e985ccf0248304502210087b534a656630a040589b1a939a63318adcd2722b254e7607ec88459bd4580880220381e577321dcf806cd56758a496d0344b2da0fb6e1560c5d99aa01418b3b889f0121022fefb488514a052c6ea2127929d9f961a712d8ab1d9e1ae4e482f118a9fa9df70000000001000000000101eb70d013510905fcad0b66fbf764bc84c20d0574d0b3d03f315ae1532252b66b000000000000000000022cb00000000000001976a9149bfbe9f9365f785026c98f437502c8195871f43788ac3f12000000000000160014d72a4405d9c9e03de05b225c619afd61bf41b32c0247304402207c477e803fe6b16c6f5e41b8db1f7f14ad568214ba96e66abefc8b708dac141902202471de93c85bc80c3c2838b871e5ad5afbce7a684b37c52c8bc25b806ed88d9a012103f1683127093bf3cc692c88babc207e1a0a23e9334d840b86aefbb158351d3412000000000100000000010109b11e7053c923996a537b1847d0d48cfb4158dbb76d30b616a1264b275585710000000000ffffffff020a4700000000000016001478a20b4c1041bcf2f96da7a3fd0ae280190923ae4aee0b0000000000160014db8695ebf1842f5fc5dafe9aa71388ecec54c04f02473044022079dd7409d069f7139a51c5914d514ae6309f78ab695c314fc4829ea0febb58320220091bddfc888f78a28afb1f56c49e46d792999e9af32fe9826893643c8da58ec501210331961a039a9e24f770ed6111bf0970fecd2d712e6b1264c5301c0354c28f719600000000010000000001019dc93a84dc594be24c0012551eae915d31bfc46a740bb91837248c67128261f401000000000000000002b0b300000000000017a914829118ca3c84a89865e5ea47200a0da2a572634f87a66e1100000000001600143f1152432a499662df76c7fc80ff25993166daeb024830450221009e7b217a9f313ba4945594f37979e6b1343bed3d295aae5960da864f25c8f0b2022013d5d4a8b836095fbd81e05c1bea4e337362fdd8e720e5c92c495f545820f6f6012103f142b655721018cae9fdb9eb41905dedff1ee3f292fa60938e7b94f91a9a57cf0000000001000000000101ced2552a5b684271afc5785db79022f76fd134fd4c6819c38c43aaa4b92c330f0100000017160014411001e691cb161a82df24f40c0309895ef0aba5ffffffff025d710d000000000017a91475daba4b7d847903a4a0646b5b943e972b908f808713e601000000000017a91487707b842256bf66cab92d12bb49b05d022306de8702483045022100c277a3e611fcc213c4f2e297e01616c5c66b76aea7ff488933e13cf83370bf4702202869cf80aea3cf94f40e56e2e39272f3f33fd6f6772607f9a23ce7c825e0ad61012102615c15cadcc987f76b32b28e30ab70d9f0ebf7b6e3d9bf584b6a5c9789e869230000000002000000000101a53ea5c643316f4f6a41461ff7047d9233cf3ec9db37ddcfe5cb72a16ee781020100000000ffffffff0271cd1b000000000017a91406cb57c567eb8bf221d1d3ed2e107a68f404b64f87a0225a0200000000160014de219d2379a72d7798a1c261264b5e514cd9784a0247304402206f74e7124c88dcbc8364c7bf6dbca87e7e9336004324a2118325d054ae898b6a02200763f00618df15d0ef14238000943c58f028c40efa758210708f6cefb825922101210262f9625fead18f1527c4a5e31a4c6ae6fc72f33a308ae7bd65eaa3396d47f0cd000000000100000000010153302fe57d7525f29c0b0a598d869a422fb0a6df7c4f0b3972feba52c198e46101000000171600145a062ac10801255b2617754b402b24fca16f1b5affffffff0263a60300000000001600143d9e9470046f9752e84f2e5bf11dd1f9ee8c4ba2153600000000000017a914fce5a993359e5b281deb91b2da8b6dce6c2680008702483045022100cd8d78ad02c73b8a2501394807a3135daf535b81d44bfe6a0b48988ae2a313c902204dd4f1a186726ff3b87e9164dc45d02e03e750013799169aa43efd93df5d42d30121033a86b3aac9a03f432fe1d2abe27146e7c5662c759bddf22106b8bf781e30fd24000000000200000000010237b435329963f394fff1fa8c7ebde4c372901d776ba15b9ebf4ee28b885ba7410000000000ffffffff0fb31f86fa17627ff9c826f6fb569eec1fd3854602772a0fe0898b8cc0025ea40100000000ffffffff02dc341400000000001976a914e1b57e189407769abd4923c2b7b41b5c4dca8a8888ac27fc0d00000000001600140e98f6a49947d4e1db8f3ebe728a0da3f921fa940247304402206dbf7bc56d5596e4aca477c11cb0eb6bc453b1c8e8816cc2ef8f366772f79aa50220640ac2dec81c20ea5fcedba11f1a5339c4d88258b6e336287427fe196eae1bea012103a7b610fcc604244bad7770d60c7ab18ce45d27cfcbabb1b8c1d27806017a825a02483045022100e33c03be5564b6291f39a4063ac20397a90fb04716b63c76b67376870e1691d00220444e5a4bc50fb8f959f51a6083db08a2a7c3a575d6a620d593775bf73b26b4ef012103a7b610fcc604244bad7770d60c7ab18ce45d27cfcbabb1b8c1d27806017a825a0000000001000000000101b0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b259070000001716001493b54ce61cee598949c4e82ae41ca80bd3d979d9ffffffff02393506000000000017a91472168e9bfdd528ce08fa33be495e697d47f5ea1687745100000000000017a9140f0d0b8c91cb75c010d45b6df565bbb369dfcc40870247304402207c228fa9034e898237aa74357b5fba49279a16cf87098e8544eef98a60e26f90022017f4f4d669f988abcc19e5c3ef4e0e97c47983f9dd93d8303e2740beb450012a01210310854572421fafd283829b0d0b1f8e7ca9ecf1e0961761c4590983e3bf5f0e010000000001000000000101ed7d84e00fdaf4d473dbaf3a76bccf983aeba2c4ba327903e6f9aaa6e531bd413800000000feffffff0250c30000000000001976a914c8197f50adf290a45187f7b582ce7fe959b4300f88acac0e0000000000001600141c701a611c44a3a67f7a8a23fa81d4e03a5a22e9024730440220065a5bc9feaa0ca7ee79698a6e18d419aab08e0b3bfc0c7d3574928ead54e4ab022059c50ec6d95d20b9f85937fcd1a27524c34b1ef4e713d49d8568c55e061c16a20121031b3ff47290e11dc7dd91b03cc2296a1e6543276d6d92b21e5e1b1742026833cb0000000001000000000101a2f8bf77b3ec6c564de7b61ed8878b99dd60156d7521495ded3a23009c517ee165000000171600144a2e836a754626c07d55a3f74c0a2f68af8001d8ffffffff025f5d02000000000017a914fbc92b02c0eb05f20ad963f485949b859f7dac26875bcf00000000000017a914e8a51fa882bcb8029c736b752c662f6d558ea8ac8702483045022100dcd97909fdaef5b311a3244f4af268831633c85ae6ba88ad94ccf980d0671f8102204ce624fc1221f3d39f61dadd8624f9ffcafb3573b14e10227a701a15da1926490121022ac9089012330ff50b40d40fb76bcadb82d0e8ea9f0e594287660fb524fc576e0000000001000000000101bac7a6b8f656a714da9e2098dc6f7082cd0d7915f17aaac27a751ffd8beeece60000000000ffffffff0226a54a0000000000160014d20665d55634af636338db983c0859afbba0ecd835af100000000000220020f7f4efb4c18b0ed6a3ea3d8ab400044a5f6dff3fa5f8a2a3d08f464dc434484b02483045022100ce511282859e955920e6646201873c831cbf7947ae733e3ce0bd6cecc1d44d5e02206b16434b3a6b3d984a5f3a6a423097f8d3c32f6c93153a906c08d802ee0ce8f40121027700ab2265d7345998d2af510c4fd7f0db77dd5355413f4d1479deb22fa476f500000000010000000001019ee4dde42c5ead4111fd130f5da5ad1ebc9fdd8742d123b9c39375e3ee7153a71c00000000feffffff01549d28000000000016001447127fb0a6b14098390e20b1557502257d5b8fd50247304402207cdb67f2e5acdfca2bdb5b3c7c43fce7c3066e651908453a9f303a947f820fb8022054fde18f3081c1a9e0e41a13819253a2573c30bd1df8686727c1b150b7a6e31e012102260f170119ec61ff651d898158b64002953167c3df4cd4dfabd6bc14364b45ae0000000001000000000101f4709b9623358496889bfe8ad61fff7cc3b7fe83f535b7a082de1bc0d42db34b0100000000ffffffff02213c2700000000002200203110464454a556af701f0bd87d297965d830e207d60f064354e43b9e4b2207138584cb0100000000160014c8de38f2992da66dd5a432a186222fb6b50a239802483045022100dbc8be8fe081e235d4e923c3a26a21578f01e72c2cdaae21f9f8f2e7e27a0c39022004a877a40ed71066b8aa96aae435cde7e083c0ab30af82ea79376bf0d832acc40121026e585ebde5a1f4acfaa45842a3afcf2d699d75c536bb39fc4046fe2badf5adfa0000000001000000000101ddbd5bb5c26f2e7fef08c34e7222e8f90d21a56023bb95fe4266d1822e0044ca0000000000ffffffff016938270000000000160014439d2bc49a031567caf750db825ac9bf3610bcb50347304402203bec554bfe54ffd6a50d08e751e9b85d0648b7ccce2e23f36cb65f8e9d4722cf022056283ff199f1b267be2b1c744e1ff996ffdac76188ad01eca81763e6d0913fa401202cec75ba2d9a55531e1998284b54f318fc1b039349442fff9af0fd92a28bec406a8201208763a91425db84d70ce3caa02153ff4691ba0460364fffdc88210256b5763a9435c14e919f1bc74c05ebe25a7fb021804eebc6ba4d5a7f6f91a563677503d8a00ab1752102035117e8f42385c868624e80b4d7d3494eaa97a6323f35e315ccc98ef22f8c1068ac000000000100000000010158530eb5607c1abcb37fa57832a245a3893426a8c498c53b80a37d0e2c7ce9bd03000000000000000001e61b3a0000000000160014623e88a5b4c1c779e1794d13e80d630a7c993cab02473044022019380d92e078e9ca8e29e2025fdda26d2de68562bc1109d05cab67bf8f9de5f6022015f0c4b1d50d18462fb34cd9b12c736c0bfaf7e522951b979461ddc97a3a8765012102b5542c5f543bf5dad130dd5849bc24eac9ed0c4c59563a1d54f3c89a6a021a360000000001000000000101d8026429aad05821f1a0e0e213d9f2778033b038d2ca8e9d74333355444cdb9d0f000000171600141aa603813100e58743aaa3ca980ddd162f0484b8ffffffff02e99309000000000017a914387d233a72c6f8803c749379d23bd071d30fc5c387740200000000000017a914ca8ef9067e6834fee9980337ecdb2ae59d7dbe0a87024730440220132329b0a02dfd9fba00e138bdf97704ea8c5b13292e87c46c8bf78c56e8f1a702204219809540b5eebd73254b8b6007af634794439a8788d820fcec6c5fcf6e9b47012102a4ea9a27362301741bc088804f1f7c6064a6ba2bf3f034191164eb1b5ef2a11e0000000002000000000101a8f847ab4d5dbb936fefdcbdb7bbb6ad3c61ae2d247e58f2a30799db633db6f90200000000ffffffff02bfe20c000000000016001481620204039a5daeee057469d0016e09c89652acf61e0300000000001600140f53afaed09a9cb8b7317b875ed8021fe919cac702473044022019c1aebbc8fe2a53be88e15458793d18c3628ac20dc93ec957fc1aa9fa86cf8902201cc56d942d1fa7bdb9765c4c87a18fda7eca7507a5a41ba3774a3dc620f350de0121033df7020a2f752c9af7ff82ad30228c5299e946110214fcfc6da44a95ea00331f0000000002000000000101fe3df429ef100d9fc6c6608f812da6925a3d470808274dadb9355a83b15076100300000000fdffffff03a7c202000000000017a9144931d93d9b01f3573764a7124ed24b916af3d309879e30cd2b000000001600141cdddfe414231edea840e4266467bf858331e0f97d810400000000001976a9148c11e238ed0f51785a81f7e94309e5de5ffdb15188ac0247304402204c6f01d65e956f73d2005cc41bdbeb8bf2fe3c654616d508f35112b0267fdf1d0220583015d2d334253f6dc0326cef649de4187683f44ade712a2405c8a15136f910012102c67905eefa1c5edbb807a69d2562dde550cf801edd808a412360b0efac991bc848a00a0001000000000101b31d5caa5eb86dca13273d16181bfddb27a361d73c4bebebe25301eafb174498020000000000000000026379a800000000001976a9148570141d33491dc3d1c0c2dcdb9bd455ec6ea25b88ac51323400000000001600147c6c0533f066e218ae830c91a00da6f52ce57b7702483045022100b9bb9246b559c17e00e33dbd4b1054a42e5a6f015288a2d2c0ca06ebcaae1db0022041b8489dd103d5f8d8a3b00db43cbe9c7df403f30d220070b44228ed3f01cfe401210357935a467a0c8ebd3b692f9595a350bbc3a197edca72f2bc851189ebad4a7cb50000000001000000000101ef46716d5b94b0fb0bc5275a1feef58e11bbfa85ee8b15181f74cc3cf498ebba0e000000171600144582cd5c4bf6097201072a5300f00deaaab96247ffffffff026ce601000000000017a91490ece4f224af7be12fbac4e562e651cac3d9fff787420800000000000017a91466e12248c41bb7e191a305edf0bc6a25de51530187024730440220088a3250c724cf5c85720c4d4e31454280fb502982017af2bcf4cdbde6f78c2702204c3d996dc6be0e3f730e8513c5d1e7b41e79f2455ec05ad3721fc63803e7101e01210200e77bf7a415699ca7ff4eb488fdff0fb61435f1480a518c8b46f37cb81764520000000001000000000101b34f08367bd81732a9476665ba3fe179bb533182e2ed4ef623feaba569ef74220d00000000ffffffff01549e7c000000000017a91445d0edcff19be446c7844d2beacc159951aff7ff870247304402200622d1d5fdcb3eddb191a08f3abf90a19adde66fb5dd76b18f664dae8ce407f5022051c86f6b18aa63440d40fd7c792ae65c7a0a0627d8ed470e42614531eda44f34012102211f2d686b441dbdf229ded5374cb3a3d29f6a0b604dc13edfa5c86dde23d9550000000001000000000101d9a25fe7c80163f2f633853e73e20c6c00ee7fbc2f503dd30c1d9951812bf590010000001716001464102a8620ced09f057f3db25f8ce1dc1ab49451000000000240ebd201000000001976a914208aef6dc76a821485ed1285d57fa087f79c63fd88ac101304000000000017a9146173cd8d37566c61bde1ac816ed2e92ad74cb27f870247304402204a6397410bc71d6c3490e98c2654d50e8cb78814bd0e17f76eaa95c2ebc32d0902204b074395946d8b742c2577d48ba2c55265d1d9d3b2668966934393b398954c66012103648f185da2d427955f5a68cba48ea87a785a74b594a92dd97f57fd9bae8c1c3800000000020000000001018688312bc314e58bd91b070908bcce2cdf978932b74b576c3cff0c43affe75d20200000000fdffffff024571000000000000160014439edbc0e491835e4c4404fb5889127bc03746b50b030600000000001976a9149f3a50204c9052eb3b98a3ee494dd57b336c6a9e88ac0247304402205632887704bbd0c88b7a816b79efb21121df94ec5677d46f4329abc8c1164f890220024f5d99b0450fcf0bb77a801fe6c249a2d18164bc9bab733bad76b42c86a8f6012102fdc196b76c4b3361b39ad8242dc6b1cf18daf558513066af9503a2b1c3c928fb48a00a000200000000010103212c077c7a7cc6dc33b76f2d43a96d5b2d45c25ce0d9e8765812c7213241a50000000000fdffffff0ddf7a01000000000017a914340ae75a5e7a1ed20995d7aaeb8d5ed85da1417a8761830900000000001976a914fc34c742f6d2e0bc4d53b044aef83f845a7f11b088acd3690a00000000001976a914653794d58a83de90a44237b4d2d3fa1094dd7be788ac0b8014000000000017a914849570840603594893d2a5bc31ae61f4f3550bc287c6ff1800000000001976a914115c5237e9a1262d30d6295d885c4e6c5f680e1088ac991321000000000017a914086de0d35e2c46c1881ea06c78c42a16363731b68742892a000000000017a914116d87d1acf09d456d1c6a07641c6c5d94d7393887c62b2f000000000017a914ff1324fd34589e7e0ce8ae32bf5df763eb04f07e87d69938000000000017a9145efb17eb3c7e78ee4e4978f80dfc51035c1b31ec87db023f000000000017a914215e02b9bf07841be9d262e09c22185db4f16cdf87f2af6e000000000016001418ad7d52fccce6ddb392eb0ad349ee6d5e519304fc3b7e000000000017a914fb71defbcbeaf3e86073001ed0f1e0b6c3f05d3887b7a9d800000000001600149cf85fd284dac17953e0c695dd7d348b1128078402473044022052fc2724b2aa4416e05da42c711c8c1e9942da0bb0c4ea08a231ecb5a972c61c022077b8841402bdddb0ee7cb56c73e1c2ab05337f554c502580e01838e7e0782475012103deebb80d4ca52217e3f86d123b607857a94d7d625aea1bc5259160ace319d22948a00a0001000000000101b278fcef9d04b37c0fd53604e7a670d8fc02c7b183d40c78898ec586b25fb1c04e0000001716001414fe5ea661ef2c0efd39223d53ba3e3c06f76443ffffffff026bc606000000000017a9145b180c19e1299fdd57a10b5008b6b96df9e1e9fb87bc0a00000000000017a914ff7a92c5ccf199282fb7014862626489c96dc798870248304502210084b2bb87d1cd4556e20a1cbdb554c325bd5502902f807702c7178ff80ed141570220245116f5e6b989a3e3c8183618c7646713305e80e5124c294f418add24350fe0012102b73407b5e9dc8fa14a01e32bd7f328109cb3a1c730a40c9a6c7d4ccbb193c9460000000001000000000101367429a7d757bbed62e5744f198f54120e2422a9674dd8dab29281145d81f6680100000000ffffffff02d59301000000000017a9148cf4973f0f990bbe1fd97c213f10e51a7e5e84bf8773280900000000001600145ae4169d6da5c291772c15cae977b9e40e8c508e0247304402200b9f69e46c57687d510a12aa82fc90c594d61f94c96de12c51e0dfbedd40484c0220208d523e2d49290a84f600fc939593ee55a1bed664ae9ff7afadcee736abb797012102a0ae2733ba6e05948d28a31d7f3541bd461e9279db1e5b6b07ac8086b9a5ff69000000000100000000010131e4a0a4fdf9e974feb89dc90ecf9d69fabe4b50247801260fc18945201b51f80000000000ffffffff025b470100000000001600145655dce0979cad516648c453fd5bd900f1c00a98100f0400000000001976a91420696f7ac7f78a2771d4fce9a51ea8c8abcee5bd88ac0247304402201f33fe029655c2e3e1f2534df3bfc3417adac2a88d3c4150430c6306007c3f47022026f62e58065a7f311cfd657a410e286610793db84cae0ec6060166154a9832ed012103319d3bebf5729115cf754aa8b7164ee0f25db473e4b0d85008714e8df06a50b4000000000200000000010153f826019b416c7f355f6ca7398e0c98f0fa44a1fe48f978c373dfd64f935d300000000000fdffffff05c56805000000000017a91443557f26802c0f2b78270315b35fa85d70485ab8870d43570400000000160014cb275fc303754191bbb749e3597ccbefa31982b74bf305000000000017a91482a9cbd2d11abe8009c8d45b92dca73669b82e8987e8287e00000000001976a914aa86836906ed1be8ca4fc7b3d64e77ec36467aa588ac19c20f00000000001976a91448401a4fa552bad2f3f4e25052e2fe95677ab15b88ac0247304402203de95a1f3935afe5558d1cd8b5b2b51385b0ab1ce1e001868bb16e9101a4ed7402205c62ac4415d44077f27b553a47a7b86224d122fa6bb787310bcaaebcd9fc088d0121036a91ad282a53d20c63c5863b664d44fbb88eba459752c43456d8bf97406fc10b48a00a0002000000000101fd33ff5b01a89332ba020af978a4da6dbff3d80a44422d46431d70b3d9c793f80200000000fdffffff0220f70100000000001600141926acb1990e554a7139db32ab65bd1fc790e40d5ee9060000000000160014135b175ba618a4057949636af66a45c3e331a3cc0247304402202e61fa454ab079b18546c8735a06ee9b943adc3e510fdd7f571c819c618393030220138030df8e7032ea9c627b0c0201d9abd036b9a99b1dc760d791da11df69925c0121033e4e20e520e6a3ad9cc43c751b93b0f8b4889eb445f2e4bbae23e88e343acc6b48a00a00010000000001012d9c3e84dc2df048aae8a96f99f4acbbc1efe01dc61db5f3290ace94ae3fdddf18000000171600148e291b983c87c3d04e6cee3c06e44e0bb85240bbffffffff0218ab01000000000017a91417ea704659269d873ced41580b23e9c70db520ab87b02900000000000017a91495be583589c5929489ec58ee604b2f5026635fa2870247304402203a6645f87cb4ddb0c2f2bd065826c8a95dead847cf19ee2731dd7d1b35a75b84022014a1cf64465d0bd319bd621206431f514b62c744e12afa58d7bf343258ea4a1001210205ab969de2dc9f1b894cffa3bdc51ef626fe78d58ab257c6c8485a5a0c642f050000000002000000000149ca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3500000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1800000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1a00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2500000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0e00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0f00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0400000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1d00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1100000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1c00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3100000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3300000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2c00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2600000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0300000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0200000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1400000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1900000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1b00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1f00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f3400000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1e00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1600000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0d00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f1300000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db52500000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002240300000000fdfffffffa7489fd391d4c4d15b52b31c3d3fc2e287fd3a7e8ab069a4e5acd3506e11e5d0100000000fdffffff071fd817e815336d4d978536c09f6bc68393b578d0ae0dd021174b947a6400cc0000000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1600000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0800000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0600000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1a00000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db51700000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002240200000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca0500000000fdffffff42831a047bcfa604e398765d3677ee5512262aa322100efdcd9aed6614c203830300000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca0e00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2900000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2800000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0000000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca0900000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1000000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0b00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f2300000000fdffffff103f3b30249b6b48aacedd8ce5624347c0fd20d1f9e306c6bb40247c3c8305490300000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002241400000000fdffffff8ab78b26562f5af87dfe52f90ae7d7620a0b2ab197067137e149762aec7dbb621800000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1d00000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0500000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0100000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1700000000fdffffffca515d48fd1ada69df35d5292dc5846cb487ddbfa6c6bea70c72947fd803b52f0a00000000fdffffff33b4fd2eb095dffa82aa61352b17f824eec62afb449ec3058bf6b06cc9c8e9ca1b00000000fdffffff103f3b30249b6b48aacedd8ce5624347c0fd20d1f9e306c6bb40247c3c8305490000000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002241600000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002241200000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db51a00000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db52000000000fdffffff6bc020db9f7dd7b665deb577b5620907c96617ccc1727830d6592b48e0e002240a00000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db50000000000fdffffff8ab78b26562f5af87dfe52f90ae7d7620a0b2ab197067137e149762aec7dbb623300000000fdffffff8ab78b26562f5af87dfe52f90ae7d7620a0b2ab197067137e149762aec7dbb622000000000fdffffffb02bf25918a5149e31f58f038609fcd122df8d88d64786d3ab08a3c295db5db51900000000fdffffff46f2b708000000000016001411f31e6d01cf9c1cfc61b26ec66e8c3a7d7b83a24fd10600000000001600144358e6403faffb4a81cf102d9537559385d3a1ef802303000000000016001422806d183ba68f24ef8d7fc13c4bab20a1a15db75566070000000000160014bf60b46f74ce722f1b624e7a0429649507639fbc4d2b66000000000016001441479d0d6ca0a5949517db8a4d8a0beb9d750f43feab0800000000001600141d2c3d5e4d1c969fcc82c6a77e43c1aa19166230131408000000000016001452160a63584cbd98a6b73a7e3731cd12fa55e79d7434110000000000160014249e431376b96108f1ef9b09d33cd52a0ea9db5734b70800000000001600142a31de92ba5c16a50bb971a940ac2b9c0cb3b3c6651e0a0000000000160014e6a4ef0ed1503c21921af1a2ebaac8141d1bf59f22e7060000000000160014599e87915498c4085f8b11c95a3b6da692f7d416cfce080000000000160014999d1b2e143268a56d8a2fde873e5b2f2a8810b20b1a0c000000000016001421bd3a942ede93cc89ef0f8fb09aec92d026535830aa0800000000001600140940ba74005ffb1b37e6240ad34f67e4777fd569375c070000000000160014e8a57f565099772452a9ff26c76aed9518e73cfc285c070000000000160014c0e5133aa5f2d602597c0c3d39a75de5149637495bb3080000000000160014b3cb7b3fceb7c523f73e76e2313acb5768e8f8849720030000000000160014e2f4bde4b844b1228e2aa1f1abbf5a9550cc6d9770f8020000000000160014e0c5828c917e111e7dc3a8365f81408ebdd67fbf1f6d140000000000160014559767fa15b359c2aab515711a73ea7f01311bfdfd131f0000000000160014a0f97510eeb47d38854b2a32418f8ffce14dffe8f934050000000000160014e04b583ae7ab6a54dc0d988d0e3c1bfb86137eaf771f030000000000160014c5e98802edea2b5f7b40a5e8ce4dc4d0b718c78339fb060000000000160014192c228cfe30f07c7e8368bb23880bacfd63d0d32da008000000000016001450bb67daac619ef48260a552822f823d0365b60d34b7080000000000160014b617abd87c5f103a8b31b0bfc67d0eb627dc89fd641c07000000000016001460ad2f959cee672d5de4442878f7c94c7036cb7416a7070000000000160014599ccc8553e3cae67179cf6af49374ffd569db7539fb060000000000160014690141d09042e5c8519bcc7b888dd5750205cd601f020800000000001600141716e6abca9207fc37898c015fdb55b03ea2c74eaaa10800000000001600141b703c22a26d38a934c447068c7d8d6555d85e89289e0800000000001600149d2e489f7449087d59e297f22070068a85d4ae6913200300000000001600147c6edf289097d4ba8807dbd9568dfe9261d3be45c7e6070000000000160014bcec883486e1ccc0840ee59b87d4b589b12b7df365650700000000001600143652182f3c0989accc923f3b74ec26e13059d81ae956070000000000160014de0dadfd13618f5e221012347e9c150d2df73dbec944110000000000160014bab7432bb4c53cade0dc91b86039183f7dbab3e9af81040000000000160014feef5244d98bb97c0937194d822255c952e4ce2fa95308000000000016001400710466fd25437f11b4b3e4f583161c4fef871e9b5e0700000000001600140d1ad2a55d7a96e4b86a99b8f73b15e6f895991d2aa9080000000000160014633a54a3d2008471a1ef8c31821889fdc034961ab56a040000000000160014a238314574fdbe00d8891182beff644d6a55af5c464b080000000000160014de9a2726503c6f82f3fbadbaf7385e81f30a524d69c4070000000000160014ab60df490c2ded163ea5b4b7c1af1db7466773db67ee0500000000001600141b1bc224a1bd7e9460a9866deec8e3d16e299356e252070000000000160014faa38e68f2dfb0349a6f729280a10410ea62cffa649c080000000000160014ec97ea38f915f27457598b034be221b20f894310dad306000000000016001423cb284a339cd2438895679f7f27d66f261c7cb8a8510700000000001600143f090f0ebfb1002ac1b5dddb8d5e3de3e51ce9cf622a07000000000016001415bdd90ac7ca8c7d5d4669a2311c8a870c8da83295d00700000000001600148627b22b567d98694c9b32768075751385f2bd759dd707000000000016001434c9971204a4adb080f31ba68d1daf7dc00846de22d30800000000001600141e948b7492f965a2ab68d2cccfdfe80c927a3366985e07000000000016001463f4e4ca075cbcf0956b3d5f680ec90bcfc9ac42be641d0000000000160014dfc968cc6c13400a5fe6136059911990af5039bebc461400000000001600147ddae345193f94fe476ff19bcfb02d2396db53ac304614000000000016001401d7791bf1113ae39769ef10762de5b55519030b38b306000000000016001440374c30204a0e0b347994cc5030e00d189e613f254f1d00000000001600146348284847d7465b33e8d9e1d8e950a6c1d9316b959e08000000000016001448e2de74c81c0a46a9357416559f68970eb6572a7fd4070000000000160014cca747b1139f569ff60f8a965b787dd06dcdc9220aa90200000000001600146ac0801868991b9e70030753ff89964ee0c1c48165441d0000000000160014645c1dfd2f8d1c423e3e292a9c0c274dc60c74b02a9e0800000000001600141d26570da4d06a3b7ac941da1beb796b87e141926652070000000000160014fe76fcaf2a629fc1580104d2c03cbcbbe26327c574a00800000000001600141de75b8e2bd26235ef5b1b952b14cd7b5f424bbdfd9d080000000000160014a8dc5df46dcabe519f2c4a5dd012bfa4c100a90c0c2f0600000000001600147c7ab2ab2f0ef6fb1424980fe1325d4eb62e93cfc726010000000000160014169ce47ad98367758653c983fed476afa65fa21be1c00a0000000000160014d562b3f7c153140ac91c66e0e1d5f1cdc7787d220247304402200852a27372cff9d5dafd44aa1d263f7b90e688fdf5ca2f657408e1ad0278b0a502205b2469d2e58759dadb1af1a27caacbb5a0e96d624a2d2a970d66a20e1798f531012102a9e44cb34e6023581a0d21359d770346960404fd7632a89b8764d199aa209cea02473044022041736287eafe528411e9b9ecda88ab10b56ab95b2dba6b1f45f5d13932a4d8a702202e5bbb5916c4ee45b20f7c66eb5d3ab12c7af15ce2d13c0c7ddef910b97d512e012102f9748d54962fb87b7337f781ef85cdfead8f0492d92493593553d66ad540f4180247304402206520c255caee3f1f6c33b246f0af092eb91e6e50f2a7e0d30f0fb2dd8cef2d0802202afbbff3da3ac08fcd9a66237b4ec7166585c8a3c93bdf0092a0a211b0dc904a01210342943231f59578be5adffba894be2b05b6aa8ebfc3b6ab65d5272a84a25f34d40247304402201e57c4e11655ffd9e447def35c1cc9bf5dd273a239198f05ef98c78a0d1ec78f02205e4d520645c65925be1795deded99be0158df66fdb9fff55ff5cb8c2f5d8dba60121032737eb7306a846d8221090d90e0bee39a2d34c6b5f052f2f6245f0715b4d76830247304402205f857d455c01cdee178cf70d0776d9e1229fbfc6d11602a93baaba3e50551d0b0220415efd48006f5d24ef8277c314a5a839ad4c44afc251c6503888d12dd39bbeec012103135c3f5b56da754888efb16bdadbfc56a060c4835635f851e6f824dd5364fefa0247304402200b3bc81e8123c96e7ff5dcb3ee817a0868dc282af7b47656c0be6cb322f5c4950220408c53640e2a3d8b43383bcb0a2e3ff33931112e9a0faf8ca7bbc3dc282b21190121030e8da0fa3fa8315399a8d34a910eafc445009511fe434422db1de5f68f30422c024730440220107b061563279c3332e69ea039b6b95ab39e5372a10dadbe4ab5fa2aa224fef6022000e3183ea9fc73b0453ecc2ccda43310d935187c87cb41f3b680d436e485f1300121022099ccd112c38bde427ad41f5748da38be875a438cd08965bf1fb159f9e89c640247304402205def2c764528ed526a151fe26f314a721204a2000b121b5b16a85734e5c6c4fd0220719d768c3d1f9beaa908876eb84f966b42ead7b8bdfe3b683a8463d37525194701210261b0990b68a2bc70385dd9e0b2e15076d8d7a52802bb722cd6b85c8836186dfb024730440220181c71ba6a83e737a35ff02659fb0517428ee71d83b2bc65ad16d9272e78a351022065f4e4e6454d40b7ee3783d2ad5cf18c95f1d2196023abf7215f1a9018438d3f012102112ca74b90e74f1deb4d43d7692fb4a3ae2dca1bd80219ab8d7db101828e40cd0247304402207a1173f5c2842e1cfcae18ad5d9defa0f882356155fde2f782a213e96b7244e502207341ab2ea26693dd4017b51d9fa7a2094867b24941e41ba0fca0ddb5eb97535c012102e9e66c824455b1d7d14a1f1b4b9c50cfc85c2c2dd4c12944ac69e9a487de50270247304402201862da5c14e0a083426d6ce1ffd3fc326fdd7ac436e7941df29272503e6afa63022051b1ec6ae48c6020cafb621d6eb382282b9e6c84c829df38bb2aa602fbed06c2012102795a2f2a2d828d5732d891e962d1a2eafbdd557899ded99693b9b82dfe0932d80247304402206705da075e3fc3fa3506b79e06b7f8fc4de8f20457e393a5a25250a18d97301702201f5c221aef325928f9820e9d22ce4838efd1c706b95a6bc15b81b2261f56e2480121032445606486b2ec4db59c21971711f0cb149804b57c18caca156db0bd8c312fa402473044022036dbda892609d5b88b8de6b4472515f9983972ab2e8d28a3e86e80ed1b17bb2c022014c94f4e1770d0eb2134d57f956ba71f32307f551cda865192d117d01a75cc2f012103beb5d370e151d9629336e0d990eda181b0d3e704d65e70643e95b127ce9a76920247304402205ecb5b6e8b222fc817ec748d6a7665297af5e940481d01119963485c63b9240a02203aa80b8126040ce8b5853df7686f8fcb373ac400ea41d38ad68fedc3ad44e34501210226fe889bc9cf38b57aa4173782bc9b906bc9c72847296b7b3674045efb5d567702473044022044afdff7a474dc2b39823fd44babca7b6df7a37eb7b09e18e72a139c1e20b6c002207ecc5f20b5d11a7881fa73888a2d80d23eaf0a53fa13a8388a8e7943a912fc9d0121026d465b6b7070c50a0c512bcb3f1c5bd77235ec02513d14fffc265bc9a943ad8e0247304402206897798a17d2823c07282621c9a2b51cae00e3628f0e82066a41cabf9da9fe2002200f9f009106c5a84066eb2cd299f58172fd2d0493fe937365e11d124b9ea750ff0121023a77c586a32d4814fa7c7c0ccd168f5f85a38d41bac42d460531185c051d39210247304402207aefe6e6063903502a757debccc061476b22fc07255710e051a09ea1294c983102206718d3c805859dda1b2a3946da5c5b7421d703594c969e98eeff90174eb2d2b0012103f8e034171e93b34a50516024a91a090fbea0fdba58370458097f5b03929e96c002473044022049c1b06b4836c1210ba54a8b040219dffcb5258216147d0540b3380f45cfa24f02200d877ddb0ebc7099504e27041fd75c7d2d1cb4e91d8b7ff7311a074e3cb6cd510121029e7ff1c88c11d8405dbce28d64032c919a4c8f62c055d460d560238a5944a3240247304402200fc59ccb7e79dd2399c04d01e22970e003425628d20dea15291253efacceeaeb02207bc9a660b43e774b0ef8857cf64b45c633742804f1cb9a6c34318e297141a6f8012102365d60488b8d3961d6c6af56d38e42c3198053676ae2ba7eb0a05520e0484f2d0247304402204d329c4062a65189052ca0671a758463f19f07d087a20b264dfc212d88fde62d022073924d5433a51b2f68f6afb54628881ee379a16226bb414206a092d67a835c6f01210331a030319da6078e8a8b7701e4a24d132dfdc892f3ce793eb35c5d4e188688ae02473044022044e7927fa43eece2528c0dab011cf2757dc4f582708fc84ce37a29843722143002202e397ffa6461b26d5d4455a46369debeb26f6ba37c091e9b54b1e8a85f7a85bd012103ed72a72b350d4b52d53edc3e6895a41d90dd2b2b06b6382e975c833f2986746802473044022073f4f685319a167f0f471fbed97188cc58ae16555066dcd9a820e1f6eb699fbe02206e26d2034dc38ea70c2eb25f623d9e379b11aa7cb293a01a5fdd7a85284c6f240121036b6bcef1b43af829fe9088f0fa19f523f2ffdb936181f5fed7a509c3c1fb406e0247304402201a45c843ba972acdcd3955b0ba60bf5c1575c4d24ea33f1cb32f9c084a9416fd0220211907e7ffaa1e26d77c2c5e1c347f9295060851d837de3b1f6d76ba9c78d5070121030e3f9423c657a186a47f2c624ea689e615396a32a52fb068506f8e157d966f5802473044022044318b10cd33041348f4ee237c389433c79565930d7660e5f1ef8fff7baf6fce022048651d051c8ef86eb8fc8f19a2a41038aa3764d09469ca4230064019cd1e38f40121020541871a835a1213be8efe59d9666b01b49b7b619957ffea92217addb42b5e2f024730440220061057c12c534ea645073572c0ec60d17a12dcef72e9315f9fca7649181c196602206e92b38c896269494434ee9d5099649df06e0b064112c4d8177b3fca3bb4bd58012103c603fea3d928afeaa2ba6c9693e8d3d85e9e40f017aac90e10dbb833b2306e530247304402201bf17d0239a5f1b9ede34513c1be3291ee37a7c7147bddd037494f112648d15002200e2e87664b91eec9aeb1c7c10e5e3b01afe3e07a98658e7c252a56371ba0506d012102e7bfcd123733d334f62d80789edcf84b691f72a820e6b30c74afe562ecd93a1202473044022074f8f72153649525de3e2369b5808935a6c564577e72ab454a59bb9ea628df1202207f8ccf3dfc81a12624564c176e5cc7789a56e90b9c69dbb5a9ceafae45973f200121021c667785c51ef2173a5719d4dc61e5d2e8b2ff21f0f5edc861fb6b5e171cf82f0247304402203d4666b1485e16db3bcd927baa567cd543d43fb380378458a0a2353602ea71bc022033433b03ca14d16a6ab1d3f2f10e8a0277a95f7f9deb428b6ad5f98e320f2ba3012103f27d501cbd14e6c934b70e89e418503b40fdca5d7fdd183c54dd9721220c100b02473044022031cc08053afd18d31b901992dd290ffeec42ae0f4de63b6d8f807d02c6a4e93a02205985144db11dd49362b76f8de21da68a8625d42f8192cb0961d2ad1d7fceba52012102d0cfefaebeda95a1225126f410240880e50a7b451285a0724f998c7657641bf402473044022024646368fe8ba806a3fd9b530e75ce9318fa2c75c0a12e516c3b67168a5a759a022018bec5b2008b08f44f95e7df71a3f4423e35917e719161e2f218a9b4d67020d60121032f4aede840727d37f3dd0722c04d70574cbbf12fb107e018838398b07ea737df024730440220143e7729dfb5db877a05fdc4463c1fd3f7f9d7d79133aaead4b66c290ba625bf0220533377bfe9d83c9aaab448e3093344f04bde9260fdcaca7b676b818da48c8c05012102ccc317eaaf6c401d779e7e48dc9c1007ff02f5c3870eb42387cfed0714403add02473044022039b7b8013286df8d036652487c4d210bc0c27db4d3ab739b193fc6d2cc64f37e0220533a95c53f4913ef6cba9166657deca8cd760507903601ca161cd843d1dcac0e0121028804b4f4a2735271befefc6d5a5bca97ed12bac4b8ded580a86827e18db89a730247304402203a538702dcacd0502edaa0fbb32a0287f69ada478fc9070b846831905e2607b1022024845a0d13078521da44fe1d48e2b6be065da6a727d91dd8113140d40d3751330121039e3adb7978a73e9adcf789b0ffdaed326e1eb660b341c9ae2934787905f730a1024730440220039d3c438a14c889a31512a2dce8359f5f4033f99a2694e04422aaaad6effa220220548589c3167c3d70bc41e62b7fbb5c41603b6daf8097c96ea13ea0c7be68bd38012103cf8dc0b8b834dd48712ae67242b12d9b4f36664ca8c30faa4fbf007683aa9f2d0247304402206ce1206c279a501174b2752489996b424e0cc2d16b24fbb91fcde55c4e3d0e7d0220615098a6b54b7fba73caac781ebd6bcc46d58363952770e56839b32204ca393a012102b6a7a55d9d2a54de605281870d5d3cea4e4eeb7dca7467e547e37b636614af6002473044022079da50dea624283ed54d9c6182888c4e3f30f13df70b290c726b4af9287fb98e0220752b7e47e0d5a15dbc84b115cfec3153c3a4ff47ae169a879633129e9aee6dc7012103f42882c6e1b5a93fa771e763600fbc47a1573e9c2294081754c6905150400a3e02473044022012de78e4dfe7f376d4805f8bd95f33aae50c1e0ade5c7a5bef2d672228c262030220406797957ff158c23201d1b5d7a827c6ff2d03114b8ed7d75c512bb7904362c4012103b76dc97d09232d56f2ea46fa43164771fc6039d577db47c250eb66ff5280f4930247304402204d08e9701e38473c369675497aca761956b8b0b3650f75ee923cc17e7208fadf0220630f9716c85e9167d6a3a0b725a4bd851490fe8a117eb1633f4fbd842acb3ed701210224252fb615cb430c73221ca438ed75853deb28ff5886bb81835327cfc462764902473044022053894a458ad7542ede8e1cd1645dcd1d73c58031d834e1d846d0eaeb26ead53a022071407255b4ff05adc0a546faec9e8ee3ea611dd6925f6484d681c1da24f62c2d012103eb42d1f77cda066fc6816f6482cba99c0f08ab694d5097eaee465a5b8319ef360247304402202cd4ad77b5bf14b4f0ba17f2a1e68d2702167ef4534d236ece554b3ae129433f02207aaa0e25b673ff63e9902750d39c105845868e05ec91c65d0d7840cf8571b25f0121038e931f6f9a187d9856c2df65eea3e7aff6b6782a83f8e0aa1868da7da4f2ecb4024730440220210b6790e11ad933f2bea88adbde68844e6a12ae2d9bd8b85de320e9cd1560b702207cedf7a8f1e8fd8c8c2cac55432365850c7daa568be83b2409f14c2c01834826012102d4cbe7b4b320428fc18fa496772903bea2dd12be8a0c26ef93aa053816c1f2ca024730440220794cb4775ac5537bd796a12b017f91135fc03aa5f4ee1f0c2a73aba2c453c309022003651afc2f725eae928e4f99abf3c9db71c8a0d02799794bbec643c77dbddeea012103f024b8a0792e347d7d08dab78aa25edc72011aa65757b19686610bbd092219b00247304402207c1b605bad97f8148a7d7fe638097ddec86292d78a250ae3f5aa6f930e5d127f02202e2cebaf29e2d9d9ae477af91176594012af1229671f7ead8cb415c60889efc10121021f19594eab8c786acb1ec8fd7a11c019da7c39dea178793482dc2ed618eefdf502473044022059481dca440609056870701b0b786e9403bb0868f994141d23073165428516b002204e49067e79e4b07cdf84c323f412751253c50f30b55574ad8ffb2b1e4af1b8400121029660902b19c5ee036ab49e8a8df91fb8fca256a4b063819c1abe688e3a4d00cb0247304402203ce969954c5eedb4c65caa91879dae25faef63a5c7784bfeabbcbd490176491602207608e83e99072537fe0ed955e2cdfa750520897e0292be64ee76f8c13a10c79c0121032a4c0fa8979b654647603c36de5e76805ceb33bd67dac90256085afe60236fd60247304402204ab9a43da412fe415d34f4503997f6b6688f232b07235aa9bb4a626f5950be6d02201114c682f5143d9a50dbf5b859489c7185f0249bfc2c1f42d48ae00836007d00012102c9b151a2dc960dde15b1671c1e075a26d78ad77a831249086cbd8a48162bc186024730440220664e437b51f8197b4356235cc0f7b305f1acf5520813b3adbacd27b8291683400220019c1a4fc3fc8c7254ae802141518d136564a8a5c393923b36911846dc24cbb7012103ac867d950584cf52655e55f8dc11a1617ff070f125ca8f868684e5beceaa1bb002473044022030ef6466c85730225b0cc8cd6cbd756b0c22556a1091500c8c58e2bad3394a1902203316287dee80dfedd339938eed51bf53e4dab4123aa7133eadd0f4f82007ab710121025e683dc8ae51bb80e2af48e7ba0e2412cf11763242328fe309429248effc2e3102473044022026651d9f8f46b202488df94bb254520836ea160bca27ab68dfce3c7bf3764ca40220434f1cabe33579b1e8f5240756b79336537cdc6084d7cfb0fed79403fbf13b180121032a98bf7fd880b2eb9117096d3091f2c0936de87e379da7bcf846e5e9beae3084024730440220263752e1b1b5aa54440a8fb1f44f1bfe4981fa49f6eb81b01bce24e3390b7dd00220640363c44f145248b74a81df98694e8ed397c9c3abda43c99ca3aa6cabb7152501210354a7fa32ac79bf6fb94ce2fcd5cd55217f0bb4475ff2086196e0ab7da4d9a9830247304402205154d8e4f3e145319336c7c6c6ddd5c726f238f347f500903d60717948913407022074e998eb52f456b2ac7041bd9a58b6c3c3d66d94d64c8be00900eda8a1151ef30121024151eb86493ca66a3dd3dac604da168ff10e3e9c86fe0c093da04c63c4b91067024730440220387649768b868045d019d913129ed4f7ffe7bf34f55d02cdd6f2fb24ab822b7802200d067826633ac6b9757059b26b6df340aa7ac467c43e188de7ccbb9398855cc60121037241e72cfa6dd38e908fd19eebc8d1b1c83b2ea708e2db91dc9777ffa1a2a7c602473044022045fe763042eef95e87177a2aac02c2c50870cae171aca11c2f718c698ff06f5702201602978b5ae0233aef10fa70c697e70feba0d50026a32afb8c88bc5b57a16c51012102046ad5836d520c9485285eac037f669b9ce960750532632b6af8a850d4df7f910247304402200f771502d0a30d3d57074271f2da14ad00e6a1eb62493b02dd8ff1494e2c7ce9022079156555da5360d48f96285998423f78646f46d59868a75132fc630d924332c701210244ce6c3eae7f040d03ee1f4fa23fb5d2fce5bf1b32aa2e62de68473ee8bda3530247304402205ab2b5d129d5acedf1fe8aeaf64f601beb5456c5ca43ab11611e3f007727fc9202203e17357c2ac8403ad5e955f4aff40016b874a5de9afb8442106c0e10a03446e5012102fd62c8fb7a1ff2180a9ce2bcd11707c2cc976e9791f8d8f89195456d614ebe9f0247304402202a7517248949fa7c73cab544377c821adf5bef50431c87a1743cad209397309a02201dda699c8b6a2dc5d285d273dd22e9ba30068dac6ad444917f456e45dc93c85c012103673d4b406a40277dac3952bb8886c6ac776dc62a6fbbf3eaf9d03d48fd6824540247304402206e67571e8462b02046264db066117d72f08764633457829bb05621d0697fd4fd022012931551cc33097ffe7cda0c61480f35d66a253ffd1cb3dbbdfabe3acca26c130121020bca41040ae08a5d22ef96fcf72fcde3da9714eb46450b00d560deb77db4349a0247304402206aaaf8b8a6cdfc5b62ed43e3123d422600975b5a249a5eb2c0d069efed79583c022047993c7d56a2507be2daad831278b069b617361a5a5ad9563ffc99e31dbf89970121039a03ac21b0cca21931c8cbf20796fef2f851dc409c8b640eb7854861cdd57c780247304402206414089a8b1f7f3fea34d4ceb5ebcdcd5f57f4d66261ee98b4c2f9bb0586ec2a02201152280d477ec396132fd17a7b53ba5eaf43da5391b1f41ea15543db45242ee3012103f26ffbd4f302a8e83aeefa5329071fb46f08b9864a9a816bcfe7c4194a2a04da0247304402207194525db08eb58bee2e65cc010509dff6006c740b2198226702ad7f1491604902206d476b6c3ee44c91d57dc12e00ecc32e265c24a67a88971f08c60f7a07cb3fc60121034d365b0b88c96cf6e096ea416450f22c3c149feaa626b66f33902ae0f0ec269102473044022040222a1a9e307c27d7b305cb98f58815538646f0dccdcd28c2c034ffbae1983f02203df06aa62437ec276afe780d5af0a8570257dfdf404effe9b9b8a495064bbdf101210388220e07b822aac4f94936037302cdd3e6d48eb0ff2e4480f97a80c498ab197a0247304402205328d3a4431238ff24a323765c749ec9765c9dd2683490ca806fe11fff64d61b02205472eb84b915f1a570b8e822a1d2361ec9abb4dd9047587d6cb44bae3373508b01210332eb74a392022e5a3393cc55a2b6d8e10dab11ac389746a42f076b4ef1c3249002473044022044bf0f10f4fb2479f95145867ec2324f1e62370028373463c487d1484ce322cc022024a7b2f44965354ed3a2d7f4e5329460f4dd07a02be12162d75672d441d456c8012103b4450f0e71451a1cc6acbc0c6a2e06ad91bc71525fc972bc9fa3b1397cd6ed940247304402206ba1adb588996444b79ad4003e485ba979eb538ff30f8601f29eacda63ae7b2802204f3a312fbcda0b33d77c9cd02806028f579c3aa15c23dd0175275849b32fb4b6012102be09aaed75c9efa0d501a6dbb9dadc60dfe4f25ead35acbf75a49e287657b41c024730440220562420dbbecd39bf4a708c102222ff1c823920716ef662947e4b57a279f2eecc0220443297aa9e31197bd4f32426d7b061fd1bf4e40f417592ac88ff8a4c0854738d012102d88d59d7e672930456305584d16eff81dc2fd787b20d38e776ca511eed46c0350247304402201453cf2b5e334f7d0c83e18e2bb5d446d6deaee47652dc68775c0da91c71a4d30220353c136aa02874ec31f922084e8f46b22914d57426f87bb7652b93c1ff8627ef0121037def2f9ece26975c4e9f5667efbbd3b0964f8185cbbe11e4312d6399d80c1a5f02473044022024352f43edb39e143a2ac75f1be6e98ad803a6e23170d258b2bd6835676eed45022012cf69b3fd7b920fb4217129261d4ab82514acb71836d6ebdc75d5c814c4e39a01210317355406f878d698f3b695643d461e38f702f8aa55342d034716acdaa622ccb90247304402200271619d47b273305c4855d1676ee608995f93303b6f124f6c2d316a257c5ea502202256addc33f04abeb617b24523ef61fa3c7b8d7ccf42504c2292e1b13b5e1a31012103588f512334643a5e7a30f0202dfdb980ea7a9c9f52855b451f4e940ec587173502473044022039d4e159646e6c9f7a30ae5053a03e614a0f2419ae6674dfea6f2625a79d99bb02207f53fb9806bc0338f198aa17c715994d1b19c7dbe02f32b4eeab6148f8c760ce012103ff338dba65bc0d9b59f71b6fc9c586f47e92b3689ee9cd48296e77552bc32f1502473044022075969146c4e63f375ad21678659284078257bb37b987b1508fdc3455858e17c40220045437eec9c5cb62737f4779ab74c4c9823ff3037b8fc30946d6143318d4fbb9012103851950b2613c4ae03d15cf641e72c56b156c7a6a741b49be9afdb8dd821107ea02473044022061c6670e2f931e5560e368323bc317ed1b5f0c1517baecb2398c6eda0e5245a702201e3a41b805cb5cac736531f6b19e7cefb6fd30313b570fcf79fa3eaadd3356dc012103cfdf4abc14752c7bb08b55c81b1747060cf5cc20d1f0392095ec9e8e3da0c5b902473044022056d63983b58e455621097d34445f4ac3200c5446a8e3cbf8eebdadb4bf54720a022017c0ffa72b932a521490b413340e5e672ac19012835c383f4af6de1e24c6a70c0121021af0e05cc4369bf2943c2f06b15ddc6e4562fc94bdb6f0a9773b44cab9de58140247304402201e582f64c4a410f0fcedaa9bd6ccf1b6e3c8270b02bd812d076ff86c51f15ed40220462f78fb0c6fce05a1e660f6e43f55daabc8cb2d9a35b2ac2605a7d4182ec4d6012102f49274275df07ca611245ac68b777b0419681739117c3c70b9210f16d81e98690000000002000000000101625b5dc266becbcb9bdd0990b4ba5be17175654f9b10c9a74563f46f0a2459570200000000fdffffff05107800000000000017a9142a791522bf778452dc7515bbb031fb75edefbf8b87bd7a0000000000001976a91422e9b1c36bba1e6bf78f7e3aee4a91a46f27cf9f88ac2fdf00000000000017a914e15b9bc99e009300d5b27fa367759ea92d63361b87692c0100000000001976a9143429336549b47e08a160378ddfb7f4c289f46f6188ac4b4f6c000000000016001493dfb09b36f87f0cf62402d45223a63feee01547024830450221008436f76131ea7eac070c56118e749397b5b3265a313b6d3a39b51ca829aba2e402205287dc4e1f709b085f5eac406f51baecccc52bac1ccdcbb042ec942bee927ed8012102cdbc485ca478f4d9c2fe4415becd8e48213ded1d95efcd7461c2f50d8659b02047a00a0002000000000101dc6c028fe38eb1220e1947b04b7fafa0d3ce8d37f6314e65b66e1360db3bb1580400000000fdffffff04ae9900000000000017a914e24618aff5694e1e1d3400f77d0fa1e0ebf19fa987d5d700000000000017a9144f69e703e611476e703a1774161a44f3b504d9c28769fd00000000000017a91427c1af2e4fa97219e0a170ba8f49ca8b125afd0e87b2da69000000000016001493dfb09b36f87f0cf62402d45223a63feee01547024830450221008473b4798fb96aed7f3637b905620ec11740d258013c921d94ac769c5e92fa45022066d9feec5797cb00472ce2dae9b0e7c59242447515631b7d009aeeabf8472c65012102cdbc485ca478f4d9c2fe4415becd8e48213ded1d95efcd7461c2f50d8659b02049a00a00020000000001048eb5203a2fa142235e5ddecb63033fc6140bf752025dd8c2fe8d294c576097220a00000000fffffffff399de56c4cafe0a6540619494cd0fc2097d7bd2b1d4d201d3cf44953ecd9da80100000000ffffffff13e1868559111cd548b160a4806b9f907860261546b14a57ff769b59a20e8e0d0100000000ffffffffc6d3b69f2dd1e566e92a78ed742ad096a8647bc7508f8b42f5f69fec43c491100100000000ffffffff011d953800000000001976a914d8a81ee2f17ee3b2038e339c2ae73287e8f12b1e88ac02473044022044e90c5777e5c9783a560e013f995dece57c3e06963cefc6e4994bf08438fc2e0220541eb6101bf9ff9039ab9fabf7c1cb479a87f8f01c5857ba08132d3da24a4ac1012102a9c9e9e72cbdd63934d3ddf17b9af6e172d07e21e7f700ba63d81d58def1fc1f0247304402201f7d31b6d840d6a8ec0f37436b26e178ea1e03f2a8772957db0dc9e7ad87e4e2022029d641d5add052aace19b5e953758656820e87815aa52acd433a4f1d1518c8a1012102b099ad781fc43e65d65ac733ae48d41473df1796c746c1a09998aa3eac4de10902483045022100bb49fff85da481e8d40b2ad71d3506d628f78c8eb2e3087614aa8313592ac3c2022002e137446cc61584628f403d40e856e2099343a1f7b2649db9f85bf8b21ff3a8012103e6c6b9436ee67199acd3d523b7dad1b0bb7b3cf7cb85cde28e4eb1a0436d692202473044022079596afa09adef5bff0bb317b952e4fdd3eafe98b6fb8d15c2d178fdc56cb47402204ba0e736ce2d5b959c1ad31ae7645d020b6a11721459536269a2f230232dff5201210373e86119292f2340439af13b18a5bddc0e9f3b8a68dd9261782b6fe7b851b42a000000000200000000010906a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718862100000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718862600000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860900000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860e00000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718861300000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860100000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860b00000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718860c00000000fdffffff06a362c77cba8f9e69d6690569016fca097a94543888e5649017de308c6718861800000000fdffffff0e7e1a8b0000000000160014d604f8e981b3309beffbfe6abb4b1296c2ef0a2764486f0000000000160014a6afbe6c32d1978a557c885e42f39d91730666113ee56f0000000000160014e83f31b872fab319c82461200b39adda8c9d88d693ee4f0000000000160014a2c60cc14032ff4a60ddf977f89f8791d58473ea16ac090000000000160014fc7aa5ad65d8ceac7e6c28087f5b0a7d42c9a21f4bd8090000000000160014fa532c6c706f5b716da27932c3b55dd6461b5a7998d5090000000000160014faeafe613e73cd0c62f291296f1b619224b3de2950d30700000000001600149cf40e4ac8101d0101ee7c41d40ae9bf551ce96bbdd4640000000000160014d9212fa46d1b3a4aa5b417a60339d3b7b2655ac4898935000000000016001490bff31ada82cb64ac579a9a774ab2ba29ce5ae0137332000000000016001468803961d7d2a2d6bba9a1d0fdf70b054f8ff9676210130000000000160014f2794a4024ae8c5013b53ef30c27d4a8635a5ada80670000000000001600145c4db032be439f5fc68a5bf0de989463f87091ddecfb330000000000160014ddd96bb2c9afc55cba12bb484f328d9caf5955b002473044022017301dea4c6ef66cecb93d166d3475a4fd45944f2556589d5f923b2d91fc21f202200b5c77cf620a16168e1d4c0b5190dd4921a495d0e48f564b4158282efb2bbd510121035d49901328c40b0646dd7c6675fefa4c2ec35bcaf24c3460f58c268699fe811e02473044022009c7f97c4f39bd061748a6ee3039efaa4367a39916e07d1c911587fd89653a9c022077abf394996031d663c864f4169215aea97b26917b3742929aa4e115784489b00121033c14c51bf5a02416d0b145023d1931b56b892112977bbf4da37671f82b48ce1602473044022030a84b7cad9d74906aa3d278d0dc6c51f2903543291208f1ad438438b621dca802200238aedea4d06b969dd02e52ff1d2397d62baa3fbef93ad35bd063d245e2f63e012103a665d05c3543d624e0a70d761a6db43bd788f7a23a62b658295d54ba6f36a2da0247304402205082becc6f96589ed9e90de7c322ee72c29cdfa2e5464b9e8df3657e69b9981802203f922559dbe95c32d5079f0875fce70113520c8e8eb3207ae3d382b0a464e84301210251f2c1a34cc8ed654111bbcec783088674ba60fbc2d9ccb305636ce306519e860247304402202829b0985b5925b81c92663589ab37a71a235ad99d9b2724fc584601e11bccc202207963b908a47d129de9dc6abc8aa42c8b95057192578a1452794daaf2f6e518c60121038934b952f1d6a4731104930dc40681e681f386300fa4f00ae0a426805b1f71bc0247304402203e132d63805817e0e0a7225c254acf953fac7034bc70049a414fd0fdad3a7f0802203bec0412e4f19c52616f6a9749acae9ef3b0aa81fe4ac50f97d69588f08ca28e012103c0257cbd49d4860dd6acfdf02f5ca60941ed51d21e51b3ea61155014ef3ccda70247304402203357749a5c8d7cb721ae8eb27be13af2fb012cadb69da38a6f30ae5f52d7131202202dd462f63fadfb280cfa84888c327d7ae879e565b51d9d3327b1b7a6eb7fe74f01210377b9f941bad9416369652381bbd3b75c45fe3a6e0929666d51e8c8994082166e02473044022063d2c262a784942a9d9efcb6bbbd1d2ed78401a4d62dde4042bf935c780a942a02202fc52c7ed06189155383f5e1ffbbdc2dfbe10e928d16f6a188fbaf346ca73aef012103b7ec6de3e10c296a413bcc7e6ec7e01a72551916ec099ae4778c2b9d740462330247304402207ad71a79ec3e6c8c0e99dae0849d759ed79e1ad01842ea7a03d73885ea569da9022057cf974658ef9d0de2b207ca98519dd363417c14b8c828bfc2524e4bb66a0cc80121034a063cd5110d098c66bb6404923ae5fbea24673c921dd393574c3ef0d7dbe0e70000000002000000000101055ebceabe807087cf3817cd2fef4add7b28cfb354dab684128d4faf7b42290a02000000171600146805a238ee3f393d8cf847c45d06bc4f6577f8c2fdffffff01322500000000000017a914029f5f834e35d78bbfb8695ffd834c7fe50f96348702473044022063a55798d53e743313fca393aa1ac86a44b90bebb0e0f5ae5e7a9d363b17e92202204016e7bb121c3e219088bafec63a4b15586b7e69679516133ec88e712de566f0012102a077088c89142f105c9d908bea29cdcb9a19b2cc0f4c8a1cb533ee8f509694f747a00a00010000000001062bfc6ef66cd7d668d59f849d715c5daf96fa7d66aca6077ebba7efc62b41a09a0d0000001716001413d535246846a0b561ea899f22d8d78062d99442000000001851bebcfe73294924cf8c611693fd250697be2f6382d4293b56e5dc3ef0f7af0500000017160014a8e1bf1b38178b436a8a5f2cb5eb5c46db00adb3000000001851bebcfe73294924cf8c611693fd250697be2f6382d4293b56e5dc3ef0f7af0700000017160014a8e1bf1b38178b436a8a5f2cb5eb5c46db00adb3000000006948f18f0cea68f950be9166eb6543b9da9eb2335c633c800e5326863706d7830900000017160014ecf8937b5e617d729c559b4ee98d41288b7208310000000005061cdcc135c24d78a043f487a9a6f338f08ae4b0d1ebee957fa9fd2708fb6d010000001716001458e67fb2f5cea9879f851526691c6b2c63911ed2000000002935a93030563ff4b9d804df4996bf355c5d7568dc885a7e9704468e0234e72e01000000171600141d4246b5543e3c340e73bfbb5a5780de5df0581d000000000280f0fa0200000000160014425a3f40eb3108fa22f6404017007fcbe97ebf8bbd9428000000000017a914c978162d72444173a0dbf7319c53ce5b77a4a7648702483045022100c388f32a4bd9da5d33967221e9afefc66435502417707a09eadeb4390dd01bbe02201efc14dd186cc2f2f0e0bfb6ae02ebe536480d30d0f9bdbf78c0b506d6294e290121037ff9fab62147ab2c45f19d5e3dd4191006333e34f183801f3e42b529fcac016f02473044022071b00cf685dc042e0c25b1bfbdee432d4562fc353555cc3a50f9e028a9ec3c5902204a016f6e77ba14278d8aee5c7ba75f14d3c37b9f8cd9293e6f8dc5b373010e8d012103861ff82ded12bb2882b45eb835617eff7872939f37dd7eb25ffa853428437e460247304402201bb5430a371e75392ad05f58048546fadc3a4fd9339ab33cf200c8322ef9eae70220628af33283d760a693b394cb3db3e835a7bba5f01a4d8b7008c14fe97a049ea0012103861ff82ded12bb2882b45eb835617eff7872939f37dd7eb25ffa853428437e4602483045022100a0da6b26293b7e6b550ddc1542fa9c4d4d70069b478c844611e5729f59fda9c10220138db58e12399be37403142e12853246080ec1006c6119e9f19dfdf35ada13db012103184bb2b8e7bcbfcf904fe55aa8ddc5afba0af038a7306710b2434cf3d2521eb002483045022100b2df42a32c438438d33657c4222f1e02bc719c6b0ec2a225a313e5ff1ee397a302204eeebc66de6dabbddceda2a1aad1734ae94d165dd7de6f6179d4be6b347a2d8601210363e41328db10ebde385d879b4a04d7e959749320aba84bab1f21d88add354b3002473044022067031e4ab7592f18e8f7478a4c3b5eadaac77e13692fc932d5926f662e82a1ff022000afabe652641172e5321e381e9531e0ec102b45ac047d8ba176fd9fa8b66946012103ac5e9cda2212ebd965cd1bbf5c133a0a7e13f8fd2d969838f8dde5a3baeb974800000000020000000001014f7e0d409c4052b560bb1516771dc1dff815c7f9287d90c70021f1c632be57630100000000ffffffff0240420f0000000000160014ce9a04a7a03beba0a7d32199cb9080bb10c0484ba9c8783b000000001600149c38191f20275ea9ececd2f762c450ff159508f802473044022038ddfbca788237916d28fa47ac0dd4416594566d78871f092c2ce6d38eccf4fa0220164206383e809d73babfd9f801ea3553ab5c08db55072a4c72f82d7e64a0951a01210244587bb17c3d845ae477a2fb2511ef7233e7b3e8f3ec6f83bd154be74c39bf66000000000200000000010232a7839944deb7ebfd01226e221aed6c0b292ddae9b3638800b426f699a0b98e0000000000ffffffff3d9d2b1044a7faec7c336d950eae0e33ba82acfdef34924b217c9fa379eff8760100000000ffffffff0282031000000000001976a914887a7ab629a05e7e8ed0e8be843db60c431173d688ac2a0600000000000016001409b8f3899d9228203e307354c4b9f446401ea5430247304402202a8d88e070c3daf911a10fb6d3edf8d3c08497115dd235f8b661bae67b2f649c02204267c76abe6587d36c6749480257c7c1d0e6caf6c20ffa569bad93951ab4fceb01210202b93964ed16ccf630e6d9f29dd5ad85cc9af1289157d6a3f19538a4015c99f9024730440220146ec111e093582cc1ffbfe7bba1c7c2a4746d18a26e54bd661f9440874b659f02201170f5ecf4ff65617c1379bf6cfddebb29e699105718701341595027beb9e4cf0121034077d5577c23bbc0a2685cbe025d1f535c3384a77410dde5900317ffa5ba1fa900000000020000000001012ce94cec4bc48e60f69007541601267d8b86d03f72c557b48f3b07e41abfe31d000000000000000000029c380400000000002200206f40145dc13811f79fd79cd199e8d2f6e51beda90677ad442ed25dbce021ae504bc4050000000000160014bae334e93ce33dbea94539fc3d117cc6cdcb79ca0247304402200dabedc9bcd39a0271a79d618971c84b418157339e0ce8d6848599ee63d777f6022018fd0dc8b8532b2cbc3bf740adbc1793efaad2eb899ccd8f4e102b277b2ce4a60121031dd2cf41808e6a64ad78dba60fb0cd65863ce3a69f9a90f7e1f7e36229c6421f0000000001000000000105fd06a20b698336d1ce2a2df4e78606b4f39f3a4240b0fcf244b84fa9e8e3df0600000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e00000000090b8c8bbf0784a2fedda9bbda747b5e6dd169412ec9abf8dd0fc17341c7762f005000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e000000000d38a8ea9578f04c8c9968b73e82104d49e4323e8fa9b2a1271c2d5902eadc89c01000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e0000000004b855bf7a64d6de3c7a406531f1d18c5fa0aee8d5e6a0fcc0f4615046d861e9a0100000017160014a30f2b51e6d30793b7c41c11c54ec2b52a10de21000000001325440299e6749fe04c2885f25e62d54c633dd704618a99ef23f056b0e3390000000000171600145279e01bb04f715d11734a71a1d9e5c6c60ca2e0000000000200e1f5050000000017a914eeee72a290a2947cb96a900f3005135bf72a1d6487bbc05a000000000017a914093932f469b6499a6639d5e5607a22bcaeb2e6ef870247304402206a0cdd1e71aec23264b2dea4a629f421d60642f3f909dff9f3cadf56670fc72f02203013803925b84218209da348b714d1caab0d72e7f86b3e7b6d72dc36f96b23c3012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f024730440220284cc9d6f9932f8f35fa4933c4be8548aa3474f8ef205e403f0af124777e4f4f022063d150e942c95e5fedd481f4907e9305d0183fc609239d9e650a581b9a453058012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f024830450221008de5bf942cd25c49f6b545ed286fca5c8dd3d9baff4f2c3b74a5990770881e08022037b644a58c291c5d3c19ae0afb905450ff73f0614448816fa3eb61dbb00cd72d012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f0247304402205fca2aef160ee61732a043323cfec4ea95e360480d313a14233d28b40bdc39ca022062d8515aee16486d1bd2f67a23f99e52cd7890314f5a32d960fc69b29e05cd5f01210295f0bfa8f27dc3c6565b09bcc71ebc32025b22aa04b7ff1d2f72d681107a6d150247304402202537f337c50343b0d0b31bdaa9b41a0dcd795d0cfc1cfaad25b73fcff56bddc402201b12d23d91a513fad040a3c6110dd73ae8e7dd7368aa280ba2bb5b7f539095e3012102e459630745b7c2cc9abe74d5af94bca646ec4af77ce0fe0bd7588fdd758a613f00000000010000000001051e9a9afdb2305ad99b14c542dadaa8a3bd5929a0c78adde02f8b4169ad710b0d01000000171600148e3c44505c8cabbe588af0368905c15b18e45f21000000000c7fb29adf90b7facd7351ceba80e704843fce12302ac154cbdb7c30a4777a8a270000001716001432b286e1d33e5691cded7b140315cda22f66c1b700000000feb52fb1d30130db4106eab94b34d162278713d9d354753acf441dbea8c7551f0b00000017160014aecc07474e0f69e6aeca9e5d51f23d72bed399e600000000426d661a9600deba89dc2429cf79d6981d3a7c5864a53951aa346fc6a4443506010000001716001413523982e54cfd90c79f1229b79576712806e810000000009d135baa650cea7001aeb481bab034586e82ba6e9857e3c32189854f240050e10800000017160014e292285a78d01918315248ef960380fd72105a7c0000000002f0e508020000000017a9147b699c4a81a8451995ecc1afc9c089c456432e7b87542644010000000017a914ddd8d5036207b972bf5fa20abc83f5bb09e6196c87024830450221008312d64702a27c90d1d65dd29b7cfda07716c903a9de88697eaa3128bbab221002204999e5cb06fda57c40c31ef95ab777e575a74c583178b68f1f9e70021a56f2340121031e19a244f9a60412498cc53a2a6589b7be5721899ae206782280341943768ecd02473044022072c6f9cc349ee3aaeb766abeee469be810660e29139867ea23095bf7ce75dbe3022051cb055e46eef11e0fc34d8bfae0ff3616956e70873d34011c1b103dce47760e012102c447395a031a1d60b303ab1d78ad85161535319da0dab79418f2216cf8c213c902483045022100835fb701c32849ab2b7b92ddc6e1de1d9c82e9a2dc54bc927eb6a1809ecca2b502206b9cf4eb7a227fd73c011a36fcfe5d5918000941fd698a2a111c19a96f9fff28012103138001bb0399ab5c446882c2ca1e5ca530ea5685f395073fd195ac24e2a2ef1202483045022100fdf36987268e735d547ac8cd8859575e2fd18d9f67a59a6f6aee83c3c5fc156d02205b17c04f7e0d378c8f3c314bc26c8f234c677fea642f1a3fc9986fd53103aada0121021c39d1994f6879a31a54cd0af80a0662e6ecfc59ae05154c062439068dc18f390247304402205ec4bb4479cfa485e0af040c8bc6db7eb4a99e86d3c86385229e0c74a3e271a6022057c035ef65f8dda8afe462fe574839778cc443073ee6ae2e8966e861a07bdaea0121033d806d5e9ac1a112fd81e501a4f6274e69e00f137eef9d6f7f76a2783200026100000000020000000001019d3cb06bf46aef51509bfcd1b636a569b5c611cd0794dce553c5c4f12b6f3d111a00000000ffffffff02e85b0300000000001976a914771000d74f2d7826669cf2e1df7a73e8aca55cc888ac91af090000000000160014419d431b359419270aab721791e471a29c77c95b02483045022100b71c5c4807d946fb706e1b9a8af05f61e8b91afc2a0e42b9bc5daa0baeb9752d022073077370d2a7a636d98d72e0d0e0ceef4c94cc61c29b25583ea93c20c7c2c1b801210391d3e072f9365e0f741684aa14aef96827f1e3711153375a4600f4f223e550760000000002000000000101dadde375dc876822a89b9e06f4dba84938dc94ff39dd480a29d7f478d61a36030100000000ffffffff02e4dc1600000000001976a9147477b7e271b4b5f5fe2b89a44bb9d953fb82e22988ac2fd928000000000016001431dcb3eaf980b3153429e889e374b07bd0541bc102483045022100920f12408cfd2d6f10031d003cac08a91adeefd27b5647134281624bcd898ac30220788840480fdd6a4ed06a2bda88cf753138b83ab12b6dee5d229e7ad74acb3efb012102bb68dde0608872e83f169842eebde5a021c3c73efdeff5bf0ac1dddfe58df6b300000000020000000001018df82e92adac8b0ef9b9edc006c0d400a206600538ff905cef6e5aa3f3f3599d0100000000ffffffff02b35b0300000000001976a91416450f7f22f6f84b7731e12885a669408d590ea488acb28f1e0000000000160014155f4543ac1959aba30b0c980cb3d424cac7734802483045022100e51281701dd93002a843172adf5e24a819912670359bc24426c775837443e3cd022005a9edb4fdd47d802165b4fd688f86d792bb29c9822171aa9685f91e8448fdf2012103cc6f62999043dda6a6a5aad7f30223ee672628a74eaf67eb8e640abf029d27a40000000002000000000101c2421f0a2c260877af8149ca2c35cf6a873b6afbfad805fcd61c1c9ea853fbb20100000000ffffffff0273bb0600000000001976a91461719609d6dacdb42c25c90c48afaea442afbbb588ac65592b000000000016001446c1ad5a7ebbda55d7a0468882c6fd37b648d396024730440220280de045a2755b1ad1caf2ccd807a70cbe136ff544597c39f32ab844935d3afd02207319cab3c9f4f57e162ccf171ca02fa83c354dc00a08650a1ffb4dc014a664480121024ee676bde0eda1bc414f7b659a5942a26949dc5cd8f8366e98eaab9446c689f2000000000200000000010170cd0f9f4d554c3281253a60c021330dbd9499245cc11cc4d1a4d958a75c7faa0000000000ffffffff0240650800000000001976a914acdab00867ac716e4dad3a65695041364347721c88ace648080000000000160014ce5da13cbe7a4009c81120dd2f469b386886a3ad02483045022100f3c278004e00e7a654a554315ca3deac57b1fc2c9396ebc9f0ead40a00cdcab002202e36368806a8b3317bd2846627135f1248f2d7b33e92c5ea8cf01b628cf23db8012102fca6466df807717f7bf37396918d74418ce166a3c449b977b89cae6af8ba1d6b0000000002000000000101bb86cdae0fbdf796073a2d7831f22347e9e1098e0a32b11cce8bd1f7cb77488b0100000000ffffffff02327c0300000000001976a914eb913de565be9b71d793a3df42216d52e45f954588accebb060000000000160014cf6d943bc428969a3e776c4435ade7c74993059202483045022100e6efbeab237e643890e21722fd19d3fd081354c37dc933f9392aa307728bde1a0220054a44ed30ad1196f370613ec15a56cd9aea573ed9336f497a7cf06d965bbb3f012102cd47d93acb1621f357b9b2c44c1585d4082dcd7a56537f44c40418f67f979cf400000000020000000001016d6a36e6e583cab1c3d3bdcbd57fb6e0b14c6a965a6b1cb99181b858857a9b780500000000ffffffff028cb70600000000001976a914f1f9336b4dbbf3deb1b23eca6443972a55e7eeb288acd2860e00000000001600146ba1d798583551ca69b4deeb54f8faa4102193230247304402204d4991587c202913fbfb66923b68813a6cd37a641d4e91f20f134d768b61f358022076d850cd148dacd860d0c2fd118f85b8eeda8dd1d48faf7415d192a470f512bb012103ff93062bdfbac742e94ed16a96deac418128eef8f67472640a6cafee4ce0682900000000020000000001013d10a7f0c4cba5d596c0dda162ba9eb18e3a14699c3f768d699e876e81d3fe240100000000ffffffff020ab20300000000001976a9140d8912310ed9c4baed0b0ca956900569601cfc0988acf1212701000000001600147bcbc608212de78b15157aa19a49b1dcf55741be02483045022100d087ee715da6158fc0135691fa950b9c8ac953774822783825b06a27d7d56d1e02203a6adc77a3ca13762ac7072efa9f60be5c5ac4a5223f1df4953d7934f806c8cd012102159adfc73d5b5fbdaf9bcc2834ad8aa044647d4dc89eb4b58eac67d24736673f0000000002000000000101e55efd73547678520212ff88ab85179ec402a9d8804b27e9183f0265a423bbbe0100000000ffffffff024cc50b00000000001976a91472432f31b2ec1fa3021e5beaa89a8cfb06fe4ea388acffbe460200000000160014844616bd758d7bcd89768ab6e7a4d12873733a3402473044022023e876abdfc9fe1defd1922c34dc7be2db85065ce2774475f045e7b01e8ab09f022034ba045b076387b235d7c1cdc0d0723bb91d19942a1e4786bf5d65362f0b8a75012103dcde9023638ace90d998fbef285b9f1b0d70bfef8a3eb4c5f1ff9a882ed2869b00000000020000000001014a67cd103add6307982aae27853ba673ef33310db5df17a7ddd68185a73177150100000000ffffffff02cc6e0d00000000001976a914f5f2e339b5fd9f89f6b49bfadd867f4cb9f9514988ac9ac5bc00000000001600147a72ba2c2f030944a2d285a294e239b1e7ccb58102483045022100cd445cf3a7765e0bd0bd283bbd86ee705e7bfd783fade7273793a35619bf019502202e62a0ec14c2935e894aefc7e95c9ecd4197fc21d2e33959433a62f72e285e4e012102f9857fddc89740cce5693ec8701d01cc54182dce54d366f8cf2c2b33c685750f0000000002000000000101128743f8da385ec297e78b4f21aee87f44fc9d2a0804b9d250e9abd0221056742500000000ffffffff02003e4900000000001976a9144217dbb35f88857ffbe2b1083e19ccf2cf0e599d88aca620650000000000160014df722e798ad833827f5f7427c9dceebf42b78ccf024830450221008cbf15669aad0076a6a3b108d274c5ef45e9b5e848ac0f6f1de7b0206606bfd002206e664c62d75e9715487b23d35bde9d0916b95052583d2e25906dc28c478ea9b9012103634c817495558268afdc6c2a26030042fb1b3519892835b100e53bbe95e1ca980000000002000000000101b94b6f3f53435872d2808c963f17231a744f54d1090cf88a9c7d0e97df47e75a2c00000000ffffffff02f1953c00000000001976a9144888c86f3d23cf91dec8f5dbb63cecf3020bb90788acd740020000000000160014d4b7ee9036fd68ad578863fdb97fb8935ef827fe0247304402202009444f0a04aa85b8f15c4deece07abcfe865569a8864186972452a80435023022069060821fcc0171213f0b9e8580fc21778ce0ae8d5e45eb0ae93c91ee6e24f71012103ece355e66c9392503e25ad685dee484fad19e06972962cf9ce507899f32b1d52000000000200000000010191ec8f4b9e18f3410474bc42ff411cc6692ee68bb47ab292e933e30a97a8fba80100000000ffffffff0281461900000000001976a914e27a13df60ebd9eac9c87fd90e32685ac82a24a788aca760b000000000001600142606c728625925cd2fcd7bfd70bf85d3454932360247304402202ec5796d5c35e5a3d48f03e9b948eae90387789bfa0ae87f306f270cd276de3a02204f131d005f8e35e32e1a7d44c4629648464011ade1a2aa2da67a9cf34f88ca0001210329f6206f9f8d2b3eda9693ca1339ca1684fa62ad7c601637ce2829263f4ed8840000000002000000000101cd5d505e899b0dcd25f951e74028c7d0d5a9336324a391a10e03af81bcc43ad40100000000ffffffff029dc502000000000016001439f5a10ef26963e5fc95575a84d67f84560b6fb8a6c20600000000001976a91447de5f1c4af54a3c81d7ef0a61fd42ec76cb12e488ac02483045022100b5f5f38c76b36ff1f70765034e8b6ddd43331bf840231c4573cb2f7bffc1f1cc02205968f227c936eb694e1fc1293979f41a6860676a4dcc1a3f6583492520f30a370121021342070844d20f1ad4348edf67feaf4a4a45d4d50c28016008433e28392713a800000000020000000001010fc6d18e697147b7f5905bd5415c7b7b2d84b53f9dd1434899ad9abb9c5683760100000000ffffffff022e2d9c00000000001976a91440dc0636d4415bb304d0c4106a64f12f558c596588acd20e000000000000160014c3463bb94d069cd076375c4bb9ef84ec838cd7c702483045022100d0d13078cf43f777bab6f2d3e5da8d908b3b4898c161e7a9dba107d96896d5b602202e1e1d6c45e81dfaa20b1425a25571ced3cd069aaa90ef3e1ba2eec1e3fd6dbf01210316c57c8a1b84bcd1f6767aceeea1f26912c2356bddf8c6e1d309e163c9128a5e00000000010000000001014d7f179f620184c92e2dd2022511f522a092368977e6402bdc28dc9647c8e37c010000002322002047c1d5b19316c16378cd4b28078ef10ae57bccd4a0bccf6543b49a55d9e6b2d7ffffffff021ebe00000000000017a9148c16d9143afef795f115f96f2ffcafd603406ed487108c04000000000017a91424b0a33953ca1d3f4d857ef8820f995e15aff238870400473044022009eea39b060914d7d721143a43252ab893ebdd57ebe0222fd39df3b03d73da4d022063660edf9ca392626e5936d6b7395976f65158703fa180f016b4c718de85a93001473044022064d9ba2a3b3da87a26f250b6a2799976b1ac24cf7d958fa4211b781b2f169e84022054c169429897fcc46c37c7a4cb1ae66653b88a2c48818bbe4506371b30dc755e0169522102e0f532963915bb3a63a97a603c6ffe38225fd714b0168b3130aa17bc22810d232103f70527d26bdbc5418b9ca66fb3d6d5f9a12a8f0da174afed92e6c2e92899cf1d2103586e9e623d027c402b88c5af6160bef5ba0a622b8ecbec4b475399c63427fb2e53ae49a00a000100000000010195a37bd84fe01a23cdff36bbcfeee5c1a8b717642a5b68ae03447d483dcdf24a0100000000ffffffff0209941000000000001976a914363f360ea8e5ee9a6c9b67e51802a365d9be936a88ac1e723d1600000000220020a5ea1632c08ea0b7a86bfceb93fcb04b72e73f275572bef49ac000fa2ebb86c1040047304402200b0f0c852a4f55f6c97a56ab08d2fea87ed673d810229987baba596daa7107a302207819056577044baba115700a8c71e3fce884effc6e85eb908a13c4f8162615ed0147304402205af99142bca8caa4edf6e778e5b6f21e6d54502e3129b441eef2a4ff3134534102200d0dc7c05d2fbf96434aaf9ed89d35f2a3c17807fc87e4a80ca07ca68602c532016952210357daa4758dc300c43df52dc06f23298af12a7e7fa312122b1b65c300af1f2a9c210310bacb383f8be8d9c5d34e5381292a9bc6eef523383de56d2248b51d9e19e4b82103396b70d5b51c6f842d43a640418f60d8d638300a85cb3aa53545bc948ee38f4953ae48a00a0001000000000101e76c5d0b93e2f4df1f2c8ccd6b30f57e3c5ee00e80ed04a62219d5edb56d36420100000000ffffffff02d8e30900000000001976a914e7cd2ae23d7ea93da49ab2da5869928ce99ff1aa88ac3551f32400000000220020a5ea1632c08ea0b7a86bfceb93fcb04b72e73f275572bef49ac000fa2ebb86c104004730440220421e9fb7781027cbe94fec2260de83b2c14916d37d6fd5a87bb1e69dba2cd32902203981d2e6db2d113b4b215fd7d5bc62b1f34712134d9e600ff98be9b0565cd02d014730440220296286ef424a11ce75e779b29c0031660b09a52d0e0bcc11d02fcb80f920851502203e28a48d24809f4d6f6689298ac1bf8d87d4aacb927191f9440e7279ab43d11a016952210357daa4758dc300c43df52dc06f23298af12a7e7fa312122b1b65c300af1f2a9c210310bacb383f8be8d9c5d34e5381292a9bc6eef523383de56d2248b51d9e19e4b82103396b70d5b51c6f842d43a640418f60d8d638300a85cb3aa53545bc948ee38f4953ae47a00a0001000000000101cae443267f600b45ef8d21e3986a144a20723d278166451ad4e11fb9aedd24c90400000000ffffffff02a3ae6000000000001976a914f35e603d6e263099729829a98ddcc804b23930d788ac8583df05000000002200204a15e45b36f9676b974c78fbf52d28621a2732f9904ca2fd6db044a4d18bd7b50400483045022100ab71e02c1c9c0e90d050baf4f9b56cd6be792e2f7f4b7ec0011cc784480c88d5022023c8c847f62f405ec457c18efe6b220d39bf3c67c71b6669f4b793429106985001473044022027036e7d7d69ac6396401bdeb89c60bf9be727537d98b16461964d153120cdb102203f7524d7756a738afd6f68974cf2bc112dbdf02dc84b08e8aec69863597a9b9e01695221037bcc6d1ec076eadf5593de56052e924942faf89b07dc5e834f7b44276c25b65f2103f229aa0877a4226e69e74f645ea1e8fe800b92dace8f0699bcef6d607fbbf9442102b9b22703bda50429e61e95b630a68a100918ae4f8b0c4a322202b02bebcfe82453ae49a00a00010000000001019efa44a62ab833beb83bfc8eee8c382f414fb96b797466574cac489fde80b83a0100000000ffffffff02389c48000000000017a914436d72dca48327acbab6334d036e53e87a79803e871ad01005000000002200205dfa04ca762913e7cb975f8887638e64a412002770d012d315097debf7f68d2d0400483045022100a1739b1af621ef071adcbe33b9e4fb84157b4869833010d08de39d5d1c89cef5022041b462aa876cb8c6208fc3f0b9c32af5dce17108741deb28b4a35a1ecd250179014730440220016169dd56f9483f33651c19650c8b4d38cdb81d9e1e33ce0cd437a95596c5bf02207603cd0889ef043cd718a66fe67266f5c173920b2d76011b2f6b543a9df84e500169522102bb9e12ae986c063fa32232dc9f774efb9095e1f63d73304bea05163aff09eb1f210321d524b4da00e8c00bef977a07f6c6f5d82ade57dc07e6aefadbb2e78dea2e4d2102ec7ca178189f13f36153fcbc200e4a1c8581b125b0f8980f7e43a76c054eb17653ae49a00a00010000000001015b7b96c3c8ca115af37ccdd83679cd46e4e93dd9fb59906c34d6276bcddd44750100000000ffffffff0284e901000000000017a914db056478f4f5358670d2eb7f56ff6431816309a18791097607000000002200202dfcfaf7639c1a5f81b77d6c001b2a5814a7a46c880cc428007154d0ddec9a0e0400483045022100f8a0e35bb9902a49297c0ffd5b81a379f77c0211b9e307736ad7590c26989de102205e2e626f88f8a7fe7a5ae1d5314eef126e9c13fc73adc65755ece433da3e28c4014730440220531605da55fbfcd431289eee66986ad0c3de20861d5054929c0604b8f53c582902205e3abc1b18c22cb76652875cdec6c922c6df716a2c104be74bcc54cc347215f3016952210355d542b71f8b22251117e39e0c3a741e9aaf11c516888490cbbe62453598cd3d21027aa6c71a0e099db20e3fccdcd78ef75eda382f87e500fa71b4ce4d77bbf044352102e989c0543a6dd1dcf88a7407a459c1b428d2854d5fb84f99b0f038e62d100bb053ae49a00a00010000000001016711ac55a8a85432e353f8d412ebd4dab9715b066ac3cb9bd9f757aab6c418460100000000ffffffff02419e06000000000017a914b19a158d0474e0f6b9ce87121732a9a9a654eb1b87c46e9f010000000022002047e0aeb470bad0eeb2598bb5be2c719845f4d9f5b852d7bacfe3b0074c65f1780400473044022071e77a463f3da7c0efd128f25033d954d2c2a853029b764499908f10a80a7ea7022048401621a3337b441278c3e4bbc03c657fa9673a6e3575bd3332f6bc8a646d4d01473044022034491342c59e21e1b45ba23d96a3a72a50096fbd03c2ed18c3b179722dcb3bde02207ef8b2a95bd65951033eb97dc601616c2456de9d96eb1abdf2b5940d5083e62a0169522103ee424697eddd2bb6e314c4c3164a7ba6d96c5c732d6f4c985a882ea3358855b12102facda47fa6f95d629520aa8898b612df4ca7facd3f6dd827f9933fd95aea33e0210216130c353f2a9b1f30354d239f41cd26c3acb4f9499b327c9a6e7ea0423a023453ae49a00a0002000000000101acfc4a5d85337844bb97d12ca5a5beb695bd02499000e805a8f16dbe2515435000000000000100008001d6e9100000000000160014e7b127849b7e6228623f0347a3f618e7384a37bf02473044022042f6c856e5d62fae8febbdd75cfc9088424d8795749062b2b5c58b62010d085302204dbde488d5952984243dca877096d921c36881a6e675c80a4d6fd0ededa279bf012103df08eda76a7df05c3aa4369aa1a75803e3b30899bcf7e0640b9139dc476eb9f40000000001000000000101e71e169fc2e9123aa9dd9dddbfb9657167df989a2ecf8e831d47dd0272a5fd5901000000232200201bf9c9adab37ae898796e8d862f4958e3b29562158505fa9afbba36c562378dfffffffff02ee950000000000001976a91482b8770c9d6f8224be2ab8cc5942249f791b155e88ac44d29e000000000017a9146a15b51e36dd49812de61bf12e7d0c2afabd9c8c87040047304402200728eeafe6d9dabd26ad8d6d3a4eadcec8ea08fbf7d93b348f77c561fb516764022049169efbd6b91d3d0fdcdefe27f2e57b39cb8989f20ff67f43d6e27fbdb4fac6014730440220706d733254653217b8b5c31ec1cf4956bb2039e7c72678b2baf730495ddea82d02202d038f1a5345475297940a64269ac153dc51d33d732d23a159dece65a136077b0169522102c1eebfbd4ef490605212b8cb075ba4fd78e1ed4b6aa38b367bb4a06c0409e35221020328d8963f838d1089880045982d6702e51fd0ed94ee33c8bff9862c569753192103680b44094e3bb8810a1d8b6949bed3249090ba58b47d73b34c53ab465439357f53ae4aa00a0001000000000101bd20916d0a62ca1dfaa173537349be7504bc908742bf42870f9f8f5be6ad9f7a0100000023220020b80103bb9a8bf93091bf26cf8db1342d2d39738e27457faf13fdcfc179af2547ffffffff029a970200000000001976a9142d88a4978aebbbd4b2fe249fe7b97604ba9a910188acf62c10000000000017a91480e03d81b7eb7f5bdfada146f5936705f18e01258704004730440220251ebfe4633d8387f13da2366a252b5c8a3b6f3f01341234510988bf8733607902207ef8e6a6de4592d74d1541e92db9ff0447c7e6cb78d97e932db6430442c4d87901473044022007f33904144698d1e11ec752b332f1ab4d5201d7c0d73e1dfd8dba6f19c7cffc022070a7b833bd2db96942b5daccc73956bb6df6f6fa066ad63ae69a50b7c7f13e2e01695221036a0ac70a5e576bb898fba41cb730674efa3fab70b920cdf3755486abef009c982102017a89165adc8076e9d6edc180c92bf52bb7dceadee8327b435d725f22f394c02102cceb8a153024997700e13482079ccec422fb8ace28d632cffee594c93cd95e6c53ae4aa00a0001000000000101c1697c1ff940b5473446902f36e396fb9c2e3f3bf1776b3cfd9905e63a2d88e10100000023220020f196e033ae37e34b1c54af09ad49baad3a511521c9c0765a12999a73e643b42fffffffff0263dd0200000000001976a914588459a92c6f9352a7e660de557c360b3dd8c77b88ace7cfd0000000000017a914fc825a5b155c6c8354e00eb2b22738000d404fb687040047304402203ec2cef4ad250520acb697c087dcfac0f9dfd0298c52a378610bd017d56ece1102203d13a7fc996e7efe3acc71da2cc68e8d35c1c7b6151e2ec2265a42ac3f907d680147304402203733e6c97d21f8b87c84b3b8d7229c14ffcbb015c98bc405f1591cec8c53f47a022062fee40995a1bcb14a167ce4312845c26b445009c7348de9c52241c846d7b6230169522103595580b18fc0d7d23f7c929375bddcc791410921913e8be39c428ad1a6ff978021037f01dc391d6dced8e0d520fa740752a9b218f9fdbd0cea2dfb2720e87f899bfc2103204e90c2f92929fd7d6b2349b9cb2d7e0c908b24406fbd55f2125e33967d93af53ae49a00a0001000000000101d5a2496585f0b575c25b03908afed88d90ae5b61f34748f15cb038aaf82808eb01000000232200208910e4132a24d91a8609f2fe07c28b2ca0a3bfaf2f08b919fafc19b56f4d6137ffffffff029cd80300000000001976a9147a8019d12e524cbb0138521fec37975ea57b929088ac8d8409040000000017a91493f1c7dafb0b5711041aa072d0703348b7bf11a08704004830450221009fb88a49fe3d92a4cdc8eb69e6acddaf11bf702c3c6b15e4ec21e1c7b4671d49022012b0e1effdf4263af7d5b5d9e55257d2122a9c7c9f297fc72552d58f12e437360147304402207904bf03352fc708ff3e0f4df73c7062d18fb819090b948fa4451102d0d602b3022056b32dea231bb2785b96444d62b28c97748ed0517c9318862d5fede8ee1ad2fd0169522103cfe42dad8ecf1a0dba2d0979de96de8a588431db9942480183eb0c888cfc608f2103311c0c4a885ed0bbb1432c0eff4f006e43c4ad8f4b5399d0c2a1d36909271ac62102ddf97f893b18927e3710a350962631a5885e4435453802c308e1fd854761e6ed53ae49a00a000100000000010166e309bad0fbda394fa553be4d5dc61cf0933af6d688f84b38b891f117eafce002000000232200203a2e048314acc07eb41413f3cf4861e63504bbdb9729bb954df7473ab85868ceffffffff021d170300000000001976a91478995433b27e227aab25394c5a72c57e3156f69888ac1e1011040000000017a914f655472ab907a30af54ff3f9e953e7c72d7485ad870400483045022100af17ff47265710500b00011c60df55d225b2f412f6f80c7501a648ae4326e6fc02204fd70fd3a3d19c77bd7585b92db73b459915c27502bba6006a213f170cda72950147304402200d236e5f5db625fd35e1f7b6cb6f08a9c5a2bf183a8125428b4a38ab045b0c7702207099591b120391e7bc0fbcf454a9fc802396f32b2d39b84c82cbbcef7bbc6f970169522103b90efd33e20355e50c934e46fbb0d418c258894f772abd9affdd7c8213a05bd9210237f5ce4c168d5f98c691c3d5962396e36b7e9a15a9fd0869143d8e8a24c193912103cecf754182c2f0a316c284b78b4326acaa74d142b60c4b3f4e7f8a757b42997f53ae0000000001000000000101f6b89c45a3f2f9ae5c3f0f297bbc247cda6390639ed65f07bd3fa819fc0da2b90100000023220020321090f86eecf42514d7802e45bb1c9d1194e1bb7c4aec323d5ee61e5abbd39affffffff02d4af0a00000000001976a9148a6892d4926d5251a2765ebae48b47f8382828f188acf895f6020000000017a9146c641196688a194326d8103b8e9012abaaf12c9387040047304402200c295f573162c63c3dc74f0644b4f0ab6c473934665084394a71a8a18dc097d402203a06c5f9755260aba207ab98f6eb1fc656ccad965ae32d1dea4f5caddfbb7b2801473044022050fa48f0890b17f6edabe894ba8b0c1255a5d589a46ad95c17e852fd9f73ce0e022079d9c9079ebf612ca609e97acb423b9e5c95f97912ab11fe4dd79c4b38090f07016952210293c21fe2a682da6005b1a898bbec745e292bb0957373a7ad6a3a03af82c246e82102379bc1f949af6db5830d0856ac9547cd3936c36a1fb4b14183a1c094ce05ef8e21021f39368cc30984c2a1ffd350d71187e55f6159760bec20889773bd51aa9d8f1a53ae49a00a00010000000001014ebb1a0956a0f9c6b9ff488ead4f85df62bf7a1b946c0a87f5dce8110d47e9810100000023220020ba506b2bfdb5fe05a48bee2a1b36d93a53819bfb3bb5c7a7e65732ccb4d206dcffffffff02de0a0f000000000017a9145b156accf60f751cc85eef0b9e7e3ea9c2dfe3328713b673000000000017a9142d4ba8298265c77e5f2c24a0a48fd07a9c2a6da58704004830450221008761403d11cffdc6c0c108326817347dbe87af031a58a54c3187541262f65ce1022040fbbe1f0d19af880516b31f8b2a8b45bb75a3678532aae58962a1dae56c5c4b01473044022077879018372170e1501520031788702e1b666ac62c2fee611fa7aa4e7c5c77b2022058e47339b9dec40a203ed751c380d4b175cd78ef0a48291c5c86c4feec0ac0e301695221030a5f7ca228cbeee14a6bd6ee72e9d3007565e21bf9262bd47184596ed32ce07d2103a92bc4ea8aa4a77987218b27c60c30980e70846eb6b3334309204c9858fc7c342102814e3ea99e9e772d6d7f485904543d59d8ea82f8da91d6ad023f78f839b2e46453ae4aa00a00010000000001018dfbc5d8c231ac9feb13dd7524f9a25234771450e8aaba4f0b9f3811941c4ff9010000002322002029cc05a34a64fcad00a1d7db41106deb25aed044623d053a5fc0e2dde9ec398effffffff02cc4903000000000017a914efb740772c5e3a67b562bcafb8dbd9ae01d4d6ca87632d4f000000000017a914b27d782f3359d94613d36e1d15d679d874ce89c6870400483045022100f715b2183dfdc292cb7c02583b54dfe8bc55bd5e38b71a0b555d86aa7c1f1075022067fc9784bfac8dd05c2b74bbb6749d5d04fe8cd2c716fc81c0484a9ba05dcd3d014730440220701e1839809791bb91e9c97609149ae9c67513bbf6fb9833d80ce6d92e224a8802207ce966c18ce7334bbde5e92ae24bbf058a5dd830d2a732a3e351f57474c5fb0701695221035436b621d4887c68e4d2c097778cb938bebef21618d28c959b0df387231e3c5921025e58fe01374754279113ff1d4ba91de5e4f56b8e48abfbf1f2263cde307a3fd42102556844e13b50a9c34cb6586b6703f17a8ee52ccffa3faa43d89b5d69680354e253ae49a00a00010000000001019444de0c1a5ce3b39a68b80050f0cda56b3c76f83c0aa426f985280042198d210100000023220020eb982d88a2d0358e37efe0008a2c3e65f077832d6ea18d1eb0cbb9806607253cffffffff02f9ed04000000000017a9140ac196afbf5020dfcca401408b4ad8d4dbca1ae4878a1531000000000017a914a5e6dc7c95d220cb7b4ff1313cb3ce9a377895f8870400473044022074e51798af1d17f11441e948df14d574dfa61f5f0a6ca7eb463bdd12de8c543d02200fbc58abbd944f061c7cff0d1d062703abae4dd1c6b6111becb817f395fea7ef01473044022025e0af8b6057051e3fbc9c969770a2163b7e9fded2de13be6f3e48c67aec18fe02205bb4ed52ce997480f558261f01e938d101bd66af68ecce42b94c91316cc0caaf0169522103c123801d006e994e2834b88a9dcb64767d4a9cda1b314e2c9c71265d53a1d427210330d09d1f5aef0a3253e74cfa64ab783cbb27000231c4e660e99616e8ea8b09dd210365e28e50e87072d1ee61fa3655f7236ac46a9b0dca5fa1eb0b3d91b9fab0630953ae49a00a0001000000000101b0613d071f8bbe10faa27eddb8abf37c40bfa0ae0f602f47d2c81f6051d9dcd5010000002322002026c940904dd5df60cfda6c5317cbb58aab1f6e515094ff0fc7c9e28ae0062947ffffffff02f0a503000000000017a914b2f1311d5b54019ff1fec873910e9d11b3d127e687cd0f00020000000017a914b56080878cd18bfebb4ceb5d10e9ff44f7afdcab87040047304402204e52adf65f8620adec12a3ccc6ce18287309444eddc96027f53801fc89828ac0022075d98b35a8a1194df43ce75899ce7a30ece96c180e86a371c45c03eb550d7b490147304402205e22e9e2c69e00b6712858b978fb1fde0c349a4311a4ca8c10960d69bf48fef2022016eeb53c1c2214f6c58672d83900efd4fb60f1f0e1972ac59ff71ff129ec21330169522103c5fd91eb4338fa9072e2f6822ebd2aee9bf92c89831400be228c308275b21fff21038b0d20505d5b24912172467e911b76edc1c6137c892feb21a44a6f729a659c19210356dca9b2137728f492ce198c6bac606128e071597baa78485e5a6c25da8a330853ae49a00a000100000000010189a62756b5e228cb49beb6397d585aed0bb074cdcaca9a42bdfdb4bc954e25af07000000232200204db1825cd43b66eae0403881a83824a97a5e376844c351bd417e3aeeca98c442ffffffff027b3450000000000017a9144ba1ab7e039d7ff88cc355b4d19f0eacd23e8dab87928453000000000017a914a9e8b8377f23ff04a7d55f797ccfd55b588342b5870400483045022100b46cee9048ea180daf356c8b2b4e4494163114500781ccfe2be4fb63effd6a0202205dd48dfd6c86d13e7bf310a021852f715c0a95b51ce36e2c582ea990851bdbcb014730440220472ad0637b1e17ab9bad1a9cfcf964b9251d65a50b5a2b6b36f743a6af0724960220763e4b4a99d5e955c5315fd64b79746ae6839ac9c360339495a31ffa4e3fbe9a01695221034fcda2a266ac4b966d1ba1c9003d9f83fc957e738f137d2d4e496d65a37340642102a763c85158b63fdb96fd2962562550dcfed27800ac0e9810299a411fc4e2c2bc210361f44ae75e96ddcc8aa700945d5a8c82974ca576e9a264d073398980c081c39053ae4aa00a00010000000001019b30d48ca7bec3c6ad7b2d1bed620ae1d82e3c8754cabf1f42827f04d4d696d701000000232200208298b9913a951524ee01028b0cec82a78ed657a256d6c9862a4a25bf87707fdeffffffff0252a50300000000001600146f5d750c02b9277754b34c27d5498746dedb31bdb03061020000000017a914367cc8f70e198ef6b5646b25e58a6d5bfe5e709f870400483045022100f862097c34f2aa08387f3d567fd31688a8e2e216dec1140c891877b3731bafae0220097f4c2a1863a4d18e55ffa58e88a267d86b1f37f4a7382d7bbce456cf06a831014730440220578eb3bf927f684ba46833165d39483718e5b11398495d6a11b997c7824dfe3b0220071397274ab411918a2ab2c1b0aa770a5873ad595e29b9c4cb17b48649dd601d01695221025253c4912fd3e692f65064941ff283ae7242cf3da8161e44ce9ff772115d05302103aec121379e414d6749ee0fda606161d7c376234c77824efd4fe0b73a6a188cd12103e7ee9241eb937bc61d53aac27d05a3a15534c2ee2902bbea7634850c09b316d253ae49a00a00010000000001011949d2ab22cdfc04e17b8130c1cb9bb7c2b551ba5d0316f2357e686a4dc83e690100000023220020e50ae0f96be42d4291923a077d69ddf8eeaa6738c60be5a03fb1b526f1e67225ffffffff02a0eae50000000000160014737a008bf498ed91dd3f58598986c218f74e0551e77dbe030000000017a91410abdedf3a130bb06b0a637915681ebdc408d6dd8704004830450221008b4ff3d3378978a9d4d00db5093ea91ff1afe20fac5c8b5bada335bd492769e002203e6a336697a2e590c763b8b164fc2afbfd801175c40a589a6a68ecd82880befb0147304402205355d554f8534895bad24ae4ea6a7ae21f8fc9bc42ea72c3ab6993f023cf156002203e6762608fce26875bcc8d661ae175d467ac6ac93f0f01d67fa0859a84fb71b40169522102ef532e7f7c6ea2123d173fe295ee7bd9682efe1c71d5bebb8ae4e243df19de30210240eb8c471c9e861a5a335edd3e8df15f80c7293a45c2bb18d6cc2c63e911048c2102e882ba489c6efdfa52b57c44c14bb25a86b969c713b064c1fa8f109861d44f7653ae49a00a0001000000000101d635ae858c51192599b25a959ea9e7d693f82c4e0c9646fb83d2b31fdc3d4d760100000023220020f9819fe890ca1d2e7f805151143cd488b755914aa45b60b2d0af2b70bb671a14ffffffff0210270000000000001600149e8369e5155375f213906b2def9b552c34fea28df61e5d040000000017a9146af43df1746b0ae2268efb4dd900a65414a2f83387040048304502210099403f0e7cb946821ec3d92f26a703e58b85f97b387fd25ad2558b169ee0a97202203f78b0c94265dca6893dcdda5519a662d135657b9644283a3bd6e59a15d3e6b701473044022069e1cd606633dfbd8a218fb155d255ca5be1be011765299e4a4ca43b7587ff7a02204e5dc70a5ae3734b6a96542fdb3107c7ab738aa450f73e424f755d0b5238865a0169522102ea4f04f141463993ad6a1dafa27f199a8abde03daf323c07f4ebba59fcf57bdd2103c03bf22aef3cd624774510508ee9ae96701183ae8e0101c159d40cfd7bf50105210300896d037fd5b0c127d2eeb55c49c91b17b1fe38e9b78c83aff88ccc03330c9653ae49a00a000100000000010131fe890acc18f54a0eda23f7d724817cfb10392a9fa15bea49fca82b9ac4c3a60100000023220020c372138ea9118ec1658e71cd95cfc086da941f2a2ef5a23f316f8d4642015adfffffffff02f8680e0000000000160014e09418fe2be8fec38b34183dfc9df7517cb95ef555f30f000000000017a91479f37de171108bf6c7cc05e8dc73ffb366e4cabb870400483045022100834c65223adb27371d0d557d7c7c66c37935c3a47ac101d97ae89d7d03e872230220077ae755da871ba5cb5dbf378354a0f34ad92bd76aa34e52e16a0c64973594f80147304402203237fd43e88d7e354e509a985a086a5e97e7895dd4556d40a85fed8a7bbadd2c022063fa163403b9d2c892c602bcebec0df2450d9266526e1cf3573ccbc2fbf2c02b0169522102cbb2c524d2881a13d59c711607da6c45f2fe8d3ca785468c463099f4d6a7bd5121037dcbd34edc846047bfe7f2e1ef54cfb1c374054e5092302ff28019466c4f559e2103a3ec736c84845cadbe358c5c6e4881180063f2eaae30080442c416d7e411f4c453ae49a00a0001000000000101630e65c027453b9cc9f613736437da268420fe8b90d3cd9d151a6d1d4af038d50000000023220020def4074a0e487988bb7fc33971a145298e754265e097710f35e51cd5269c81f6ffffffff0295332200000000001976a9142597d1ca6784e7a2f5391772282bcd3502e7e7f388ac55d6320100000000220020437345e291a6e0a78d8f8a6bcaf6419d66949476a872c47904241036c35a518b040047304402201e80f5fc1f52d9f0ac6e679bba487647b8b2a53acb5e9153c5323a2b87bd75370220148ccfea11b1fda94d29ff86eca80119013fdcb0c48079f788e52c28fc72074701473044022050efced7126e34b90726737e1c93d0f87b44478bf0387ede4fa631ceac033a7902205878e59b7d3bd2e5aec96d5d50d0078115341bdf14293d1c38bb3371f2026fc201695221023b518c5eac28c2936f8589dba117625b42df9511852d7dd923ace82fc0143a402103cc54976c6335956e60fab1cfe0d4fc2a11889715cb70fb2d7af782976447c0b12102a0a1b4c42f1b12109ebbffbe62dcf413d2f7fe1b895fee406f45e2967108442053ae48a00a00020000000001022e2743985b0af85594209159978d32b909a96d25fa7f8e4b199f44fac1b494b7010000001716001470456b99c320595636fd92235135c0db8b7b9097fdffffffbd7ff3ae61b362c462baec861661420d1906c5e233c3e37cd66179ebd7fbe6250000000017160014fcebd5a0e5bc992efa82e48f320e4ca8ad44cad5fdffffff011cbb0000000000001976a91492169ed42f3dc4eff0b10060b6f0eb39367a0fdc88ac02473044022060a55e7ad8687ce7ace5ef7b1014f2718e4284f3cdbada12ee743a2329847067022038c70ea55d41fd1da0bd7ea92eeb63fd4edf98650a55f2f821de4873fda73a2a012102e7e41ddb876409a8a39e3db2369f71f451502e6f62c3f70ee3b400161001bad90247304402202f22b33b89b21954e9a391044ba83345b84587531473f483eb05f52437d4869102201e23cc41b0fe08764175dafb9cb2193756e71cdd357a9838fd6c92e1c72020ec0121022c13bdacff20dab5706f31b68cef94a66bc704a3baaaff2dfcdcfce1b4f4a88549a00a0001000000000101670a6b8c20cbbb3a9ebf40277b6ff87f7823bf4632ba9ad39794768a9e200389010000002322002003136bfa646e26cb4d196937292241ee6314825ca62a37c95c33d8d921fc0a38ffffffff03072b00000000000017a91404b790d6433b95034d263011fd3406f1717a3d0887929b2c000000000017a914e0ae233dd476d19116135cfcb24f1c527c2b8b1587fb3b4300000000001976a9142d88a4978aebbbd4b2fe249fe7b97604ba9a910188ac0400473044022075abebe0778af9af09ea980a22b559419b81615d417d52950e3993aa2d2fd0ed02201fce8a2bdd4e3c88f66e6f7669a845f710bc666e0600dd6f13f2c02122fe9ed60147304402206c2fbe93bbbe8b8b6ee46a9b9ee7ccddba12c6896da98820897802861c02bd9e022059639e6abb7e323f7d262f15603a56a688fb42477f1ce9882cacdf896f7de12d0169522103b9826af87deb1542d8b38ce5622fd8c0e560be8a4548e23b68611d5a665477672103687ffd7cee00484bf83f85bca381cb6369fbd2a24cd519fb0f3df525ffaac66921028ea5cfb006a49ddf89695189ecaf95c2b3e8170d99169b1f7cff5ef47e55838553ae4aa00a00010000000001011fa462b5ac4a92d5d7bd2bb64e4443b01b745e170516f4e23422c5c0f1e1991b01000000232200205155262a96d1a1a3d707fb1a9852177ef2b4fb0ba3d6b854d00bbc3c726d7774ffffffff038bb80200000000001976a91420d2934e1a12057d65283d0baee2acd6a10cdd5388acdc9403000000000017a91477da60a13afd0b422f7b2f5deee476e56b9174ae87f4a914000000000017a9140f607d560492a4e24909af8a7ba8c9d3f6c6c6e7870400483045022100dd5c61e2ed8dce36663e6e658bba6b43081c33bcbba38f35ed391262019d526a02206010013d6cc8e0f7b3a25793e07e6d0aab31e5dae76e5e0940b6ffd1412e73d00147304402201dcb42d3b2c60cb450465b385ce55f649d2e1ea8331e4a18462ddb07256a4c6002205a1d0bf5187425fbc572fdb717b47a6a09a3b9e7621acf176b6ec68cdf7ee2e60169522102895672ae0480229c5f6982d7e71e29faead01ee997d0d2dbbc8e013dacc77c4f21026544b6d212294e120a281aa242f247d1496122a5ddc399c6272fc6c6886a5bb62103d7587eef9a9179b5f6ba2cf2b9f0ff8cda51938d51df4170232d5ef25ff8113853ae49a00a0002000000000101dfa4f397344d76170ea5a046763cece98001b0e3dd794ae820c5e9b91f339ceb3300000000ffffffff016c2a1300000000001976a914f3d28ca372eb3d641e4ea0ae9e1214994833f25388ac024730440220505843af46ab3f5a03daeca20c4030ac6540c5329b6e2cfe8309c3af1c2422f0022047ac1148d26daa627cb911835eb04fdfd228fbb7fc774b7a00c8f9b4e1f6d143012103b9d6e30928ffc4dd355abf60116f4740f76aa72b324816712af22288cf11283a00000000010000000001015e1e54644c372e0fe6e11f82e66ea76be869e0541bc47eec406f0cc6d2eafa430100000000ffffffff04a7480000000000001976a914b12a0bce13f6be58082b049f8ed5261caa057aad88acfbed0000000000001976a914e4ca7c1646372e5732e7760ece7b3b9b4a2fd07f88ac510401000000000017a9146226c5bd2e7d19865a4dece7e198b6e69daac139876d989f0300000000220020a1c8aaea2d5979870c14feb2199de2f7e743eb46cabf1466507bac0017ecfe4a0400483045022100c60b99c56380676583c3a6f46fc156d89228525d620d3466a5b2b9e2bfe700ee022038d666ad2fcd178489914afc3c5dfd732180adfb92329cc6c8261a66568965360147304402201f40635972159f04ec8ca358426bb711d5d855c8ed584e2e706b00e90373eff0022034727e11d7b774af676ce8b7aef35badfcfdb72ad0e7d8a31cdd52c56cb6153b016952210235b81b3e1e01db510dc8758ff588b9afde2ffa1807e841f0e6af0cb2539a7c0c21029777c5145e3c38553dd0311f3cbf3b8b8772574be9c2b7a0f9ce9c42f5ef84be21035cdeaf4d34cad43f2c53501de11042e1d71f7bf136c6b887e9f51954a52125ce53ae49a00a0001000000000102d3d491dbf33b1aa6793094f340abd4d83fb7ca204ea5db4f51fe15eff401e6790100000017160014155090bf46115b5cc2c94418c6b966e89f272aabffffffff89a747b7da1d6fd590414df3b3e8bb8bdf0e26b16b254039160f751e4b7bf8cc010000001716001433d3ef6d9f6fdd95529786f07c3559b1d992a407ffffffff0272d310000000000017a914b85c71a91889042dbc50a696c1017e6386f589e7870a170b000000000017a914e15076722f0e6642ed2b3aafe744ad2a921763928702483045022100d759e6bf9654607e943363d26bab79c533ca13b3a0795d2dfccc757a14ef59ca02200d0fb7116aeb9d87fe1db4f0fdf2b609a8298b9986d4f5a7e32b28c4a4500c1f0121024958fbadd4361ae259550cc3ccf8a1bfcae949c00963cbf782af8273cdfc4d740248304502210080104a34bf64a85cee4b70f1ef8a4f08ea57dc32cc83ccce66ad27d91a609913022013c9e27b4d335862360c3553272fac3682f649475b35c86beced6cceef6638a1012102785b1797fb37bb9a7a7a97dac9ab56c3e73cb9df51bc8058d53f1b0d71b032190000000001000000000101cc352e0fc70ac255c4afe79f9725358408a381641b78fbf458a8b6721f8cfc130300000000ffffffff04c04dc103000000001976a914164def976673ce8e204561224dd5a9dc2d4a1df588ac3ccd7c0300000000220020cffcb0c22ee684012fbd9e04c5fb574a5d7f59fa934e329aea6444b0f68b251b6833030000000000160014b044ca3251171af8242d318a4d54f8c84f22fd05f94802000000000017a9146176f6555fc83a417096714faaf21f5b6468131287040047304402207c4b6ffc928555bc2fcbd44c660e6677d980465124c2e82c0dc5fae0a90ffe580220564ae922a4b2136971d53361727cb44bdafa6346635f0ca1c6f7d106423f7bce0147304402205ccebba85d003f248f9acf3290775af0b85ec7a65f4e6c02ff6cb73f6e6d0a28022066f61c7742147fd490d514754ec59e78b710c1588f2f4a54589307e4bf0dd4ca01695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000002000000000102525ce0d1d9fed6248b7385546149393cb145c871edaf4bdfd5c7ca5f60fa36c03e00000000fffffffff9ed9051e48b1209144a152751289b322b6cf2c84becf43b8a29be0fb896505e0100000000ffffffff01e6e40e00000000001976a9142cc2c78366caace0d5b23f05478bf403d6843b6188ac0247304402200777d6c0c9076044810d8ac32c4820cf498ae8d0b9a5e403e690e476fa024100022019e036f7bef403721a287e923572cbdbb1bae47fdde0e254a9c56d186f0d0bfe0121025f4eaa64dac2832842b38ad21a5996ec58e02e8ec0f2db78cade41c38235b9e90248304502210089aaa1d8c69252e228201085c1ef00e5d1df779fdc60cf6d223e51dc876bf4830220726a107df72272e7185d1a83ffdfcf43f81cdf8bb69a0566791c6136e1f36234012102e75a84165904bab974bca705edac19c044a1b15a82070447bc2bd9711cefbbfe0000000001000000000101a8e928c76af42ba74eabb011a1d69d9e01dad095c1097b5692135649e4287fe30000000000ffffffff04db3702000000000017a914fcef690e5825ba0988e37abc55bc8fb7294e919287318c02000000000017a914801445d90e2afc9070d0de682ad9354d945bcf348778b3010000000000160014fdb6e11178599c17f6984002b5eb95a37a0b4a7f10d6550700000000220020cffcb0c22ee684012fbd9e04c5fb574a5d7f59fa934e329aea6444b0f68b251b040048304502210092402d665a51be09afffb9561a23ccfce12bebb7b646307f9680d3c6c9c10b890220283520173f2011aa878de861ea79a9d33037f9d2502328d98b772adefaf5fbdc0147304402203d792a0123b470b3496317cafbd50d4f0995fef7af63cc6690beaa53a53de32d022015da3b907125d377f556dc1144aea984c302f9d9c0041ca1db3b98b796dacdb501695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae000000000100000002aafce5425d1df5bd660438f1fcbf6f0905578dcfd77abfc2bb080381ef8a7e3f0d0000006b483045022100e14ce81fe891d2a9a0896d7d9304978ea8bb3431790ce930a7d255030277c66902201b39771e4e1ad18a7dbb8136d7f23ce2ae7685efc08379d7e07c52029b463d580121026982a964592aa51335d614bb379e6e8b7521e2e911192cbd963ef7f665f1919bffffffff5d7227b49a0802a408204d36510c988786e3ed04c48a2e5e4d1aed88ca991256130000006a47304402200c41dfc7f82f53d4ca794f3859bf6e2aa9613721f5d92377822d5f38b2a6271102207c49ae4aaf8530dfa637db4f63a7923fc77e6be562528ac519839dfaee6248160121026982a964592aa51335d614bb379e6e8b7521e2e911192cbd963ef7f665f1919bffffffff02dd481500000000001976a9143dd8534222f64755c2f0679ee9365df2aa89998088ac3f5a2200000000001976a914b19e0cce97a4561772924b6d4035f1eecc3bdcc188ac000000000200000003045f3dcb33726854abbf5c6aff3f341c0ecf509f498d4fa1dcec65a1dbceb505000000006b483045022100efcf560cb92b07640d88753939386a1e9ae297c2ca50b27e3184856387b85fa70220301c5671daca0c36d8666f8fcb0510c6810673a1136d72683e2956fa8b141d80012103a5a9a588ee3469c24508e7d925cd4456175d6eae67e7a355b2cd9ed08a1d3e5dffffffff182287af8e29df56cad22d0702b089e9649eba34e819d6b90987341bfb482266010000006b483045022100c3deca6e31339f2b0d522ab04e79a13466a2fc1e81052d95daf07f078110a552022025c0ed6bc4dd56f84b8860c305768ba2346e36b4d02b2d01fada2eefe8b52600012103a5a9a588ee3469c24508e7d925cd4456175d6eae67e7a355b2cd9ed08a1d3e5dffffffff3ba322a8fced2565bfdee9d2da89406af923beaf2d76040a3099f9cba93aa218000000006b483045022100b524a0d03d610fec5ca67c0e358616f4e8e0e9dc6e1834361819985d181a722b02201dd6272202b3995ffb0c978992fa62c08f4e5c605a56c9dc3c34cdb198334271012103a5a9a588ee3469c24508e7d925cd4456175d6eae67e7a355b2cd9ed08a1d3e5dffffffff01c7825700000000001976a91451baf4358e163ab2bd4fc1471a6bcb8b642257b988ac0000000001000000000102a9d47e9685362f44f6ec27f1928f3707a4b02fed9e8805c16d6e944c33e492d90b00000017160014b7d4b8423cc5d74a9c641ae4919ca0690145cf74ffffffffd61e5e028959c52441dfb58e7b900bc4d4333e9cc07df042ab32f974392d08c30400000017160014f7f17a5888a4363164dea437887a7d131939d57effffffff019fdd09000000000017a91449389954673a6f1bda11ef47cbfe553dafdc7860870247304402202e6f37012048d9ce989c29031f39162e3eddd02b97605cdb7cc0172e8fce2bc502207c99c4590671bf384b1c8b9ed29cf69122a91bd582799ce35a07d7a70d17b33d01210250ba656c9a80d57277131b3a549d8ea1155e571d410c622bd948c9d03caa5bc002483045022100d5db0e93793e2d4468d6e1a3fedb9ed3f54bda416e76f1563e69ee9cdcb1255f02203b81ce61306b75c91f3527f39b8730eff41d1fa9229e8262944c8fbb0a96efa4012103d32aa87475ad8c144a7076d044be822c964d09ba97a3bc622e2173f1b08c6429000000000100000000010216f4fa35ea654084bff53be37e6be5356ccd277b1207104614389818a5544f4406000000171600147c948b04b1966c9a2a03d40d9576abf1a5219bd70000000032038f840b614660c7c50ca3919b01587b9decd0dd910c683d6ed1fb369d32c40d00000017160014b9c946ddd0182126eb2320f441e36b8c791fac430000000001140231020000000017a9140d76961f0ee5afadc45c16c0905a49b87accff26870247304402200fbc663dc41fd24a8a077cd5f0ce0f35bf3005f3fd1d5ffa9befd436343379f70220698c22c6242ab18e8c0e7b803a31ee404c9e6151c2b53b9f5e0ff6af429882ae012102810cf8bf3191449c227f946fc7289e252068953de22be8b5a53b71e5456b5ad302483045022100de283f24e044a07c5f64dff7cfec618e2cf33550d0fcd3bbb13569cb57d10b6b02204991f1f75b091c30bafe1e2425a467cb3813c64b058a7c72ba792aa38b21139f012103c4914c58239ca45b003b53b4acff142800bc851a9a902c0407d7c8a0ae45fada000000000100000000010161e6f0c88e826bf7cb6f13c04efbac0544b6790bde160ccb9b8744563a1ed8890300000000ffffffff03503403000000000017a914f155f30885b7cfc1d407a497ef44f8108c97797e8780234300000000001976a9144d83d2450a9a33214c837562fee6c6dd6844319788ac8ba06607000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe040047304402204ace1075102682825abece05dc00e3d74385ceef923dbebabdc5489e7cfc6d1e02201e7040a37aa96569baeeefae85ecfbc32059ea21a14dc523435eb857f60f9673014730440220493d216923e8c1de42f6288487d07fc9c8ed27fc0099e52bdfe70f2ae486bd3c02203734bb5ec63d480523889852e30e93698fe525dc486b6bbc14182ed41515651501695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000001000000000101ea5e96ad5fa6b25110059f59addbcd56afa885a6ddb7486749d0ec3ba778b6f40100000000ffffffff037be500000000000017a9143609033c17b910ce4dd8a6d9e7220ae69365169c8775410300000000001976a914eacfaa9fdda1d559caa216b684aa90a99e8b963f88ac05e76307000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe0400483045022100f529bfd8e3ef11682516860e8541c9d009ec073eb6cb96328187dc7fb72e4c750220063afc4297738bfa7adf918dfb82252187575a50197d7ac33b28987137a663270147304402201a8c3c59d9c3cbb3f4c45276ae5e3029ecdd1ee2fd39e51ce52a9959888872dd02203a909049e5a9a2a037683bb86d524affecec589772c5a546117db68f0559308301695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000002000000017601b7ebc7d636161977518f600ced6624037c67a996b844a11439d0a1c667b6000000006a4730440220059bd4bc6cafb9cba5870fc62ff327b43aeedb235a6d6260e596c2cc5c69a2c502201dfd1f545626d072bb2f3cb9ac5cacf85706fd0fb97257b5d1e7c57a099e6b8c0121022ccb889a191577b2653cfd05046a2bb395082c048885b0049de88c0ad078c79ffdffffff0288ef1e000000000017a914922fd14fe3b42d803011bfb683dd21d1e26ce84d8745a30900000000001976a91493d5123e57c2beb88ca39a1e650d77124a02b1dd88ac0000000001000000000101608fadbb6ff1000cd1d3a2a7aa1154b4b518f3e1eb8bad5ad963608244c1c46f0000000000ffffffff039a3a13000000000017a914ae01d1fcac41f1adf6289f61379f21edb32a968d8750eb87000000000017a914ad1ab288c763549789438d35875fb34c7239924a873f51e906000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe040047304402206e9cf7e36a89ecb3270456770e8f98d0f6b8ad7b15a508c94cc5f50df901606f0220027b48309379d275f2910f0a956f3683c27c1baf76b16516325fb413b1a0554c0147304402207aee483e997d47c10d2bfc11ecb8d8c8be84c47ac87c1e8fc430688fe3bd755a0220073a24279dd90ddf39e24ed97a77aa28293f3f3fc28dded04b0191193ca5f57101695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae00000000010000000001014de0fb06a155da2937bce6fd78989044cf5f7b3c9a78397f35ea201e442be9ea05000000232200201d54bfa93b4ad858903dc6476683034578f104ba95853f51352bea07f8f8f67cffffffff0617dd030000000000160014c6eea74a2f678a0afe7d539ae790991ba4ee9408c0df0300000000001600148c4868e87a673bb495d4fd63b51bce8478179b260aac050000000000160014f97deccabf78af129921f090881f08cd6506bba481bf07000000000016001498894b64bf8319c0463346b0c354bef00081b660e9176701000000001976a9147623c7a5170dc0199b2529915c95b757efcfaf9488ac2f5a6d040000000017a914b28abb9cc7f4128fd1337db6c3955a00d852e87a8704004830450221008de2b21666a538a1969f19b00ddb1d9eecc1c72a7b4a933ddcc5c07aa0323e0c02202e041265dd64246f49747971a1851cf0c582fb2fef76ee09edd25a6a92cf66540147304402204538956af7224084c0232f5f6e61cf323058239cf87151d0ba47f280c626579d02202919a71e65c5f0cfd0a9c0d197ceaa61704585ff9fb64fe1c6e6aa210220e9c501695221021cd47af2bab3d01704ddea9448da5535b4ad08970a5d0d793d254874f6980a8e2102182ad85504812a828e12c463af52d7873fe3ec345bd188eb9adcffaa6b4a837b21030656ac04d48248d1bda5ad9f5ebf5f3e2fa5790c98a152e1ebbffe86735a569d53ae49a00a0001000000000101dd891d61b5e35ff44930578727683a863e7a9aab308ce7a4733868e5c17ac2420200000000ffffffff02e095430100000000220020744c6d2305324262fdf8879c5d5861bd2698386d7580301f61d2ac3bac423902ba52020000000000160014a2a2df1face4096386499303e5a1649b73b59f2a0400473044022009c6e487424d0c1744779e359d76921458530512f6591853948d16200f6876d702206f8874716ffedc5fd0a7001f99e8dc33208f8f513589c65a2927befac11836ff01473044022032319e25fa7f5356d20319436014d094dad24cd049cc53ebe81cc77a3a35376002206382098732ff9efee653abb563463faaeb9748cf341fb769c2436a13f2554f2d01475221027c78833ed042a0e9a7e9145a79eb850934d125d0bf615a50f2bb1c2337b3f6912103e00ac494b10c7e751af63b857aeab4f16cf5b1808566e338ce997f1e034fa88e52ae00000000010000000001010394a8cb2ebce07ffd9a9b7a1d2cbb9ca89b9fd13ef1aa4635074252a2b2464c0300000000ffffffff0270640800000000001976a914a91cb8c08f51563cc1eb42a1626ece749f3c727a88acb5e34707000000002200207250d91085a77a4568fa4cfd5bebb59f0b9cb3530f8154cd4fab6d28abd548fe0400473044022015ad31e6bb9079d148fb5a07716a9278b74265f1d44c634b693e51fe3fbc5ad3022074ed2027c2312f84b32309bd7dc72325b96ce36d328f9a3309f8643cb5eab6ae0147304402204443d112a4cff145878ef6b7213770ffa9c0066cc25f0ec7f25a628dbe05b5ce022049ce3c90b2d001315bb7b401bdfe0cdcb1dff3a3f70585752fd75c8f821e4bf401695221030fac04165b606dea3b8f81ada5eb66ca181d5215c873fcf46623ea7cf8e98b1b2102b7836a2a9d3ff095415383cb23a5f4f1badd75e44adb17537962eafe3ded3b602102f8cb472df1ae03cfa6b65b013add7862c7d3ac3684a8a92a44192faace228aee53ae0000000001000000000106a53238304422386462ca3d6b1b49e09dbfd6c26143186086654f79121d53fc5600000000232200203f3ec17d5b34c38ee84b28bc0d558af9d161d02009628eff05868f2ee2323cd6ffffffffdd6f1ca26b2fc0c65266b41d2d1f493202143fa132f541ea2326f442d154e35a000000002322002007a5e41133a7b340a88fc3c23a1cb31979238c3ce641cab168ddd0df03c6936affffffff993530e024d9755c0601136936bb6dcab727841ec8da69cdd7b5143f92cd5d8e0000000023220020cc320a34cd92460ed7d63a7e28f615ef60527e047c22be172ebd4b0f5f1b1292ffffffff0314a2fb4119c75e30964b7248436dda12b3902275a73262cf7e4b4a331b27ce000000002322002032888b337a3c1402c71d463a8348c09c91007197bd55b0d26aed76d5f9938231ffffffff76c3ad71fac6750c1f2d781bc48fc5fc5720811c83c83a1bba661f7f7d80d7db00000000232200208ae227cd119308bf3a99c6beb64a1c2e4f740246b0568e5e33c25559267901c3ffffffffe8b8d87d47b94cf7fcd3f16c09dbb4b9d61fdf8d0d395697dcffa4df51ba06ef0400000023220020d992cffa5ac0b2ab28385936c19225f012af420b1bade5c1982a98685a9fe151ffffffff2359220000000000001976a914c753e70375a0cfc4bd7f80b7f86781382bec95ac88acde3300000000000017a9141eee949b62a6ebeacfe4c19e3fdf59cedf1376b787803e0000000000001600147b1acd101b72e9343f47b8b22af62162287f5d18cc5000000000000017a914d4179a675eab870b504176fb64eb3345b01d93a6879c5500000000000017a9146b348b65869e18a16a18a11d6a57704202f2bb89879a580000000000001976a91444090aaf772ffd83949b773bf6be2ad5a1d2fea788acd3620000000000001600145a04d53a2cf74beca4b9889a6ee860f13f6c597429640000000000001976a9143a595084be64ba7effcac3ecddae6e9025b9d6eb88aca58300000000000017a91456f6ae6045cd46104420542150192176cd7468ad87319b00000000000017a91486a100520abde5eaf732ff84fea2a6510b140b1f87c8af0000000000001976a914574d951b98959bc130d6b78b47eaddab70522c2288ac77c90000000000001976a9146de9f32fefd91e7eb01953779568178efd7fbb4c88ac43d300000000000017a914d465c930e541f8bc8a6edde26ce279c28a4f2d3f870c3301000000000017a91466a9d0509cabffdd1bc7ca507f002834e0d28953872e3f01000000000017a914580cd4fe1e6181948c53bfe8e1417909d4fa9394877c5701000000000017a9149cc4e2c17ed56bc1570ae8bb06df82f445827fd187d36601000000000016001463f5087637cd4292a3448666a174e15ad875668a0ff40100000000001976a914ed22e040772f00bc10cd4d46b8b04f0f04d7892188acf0490200000000001976a9148a9b72eb0ae7716d7511f715a021125a45c5400188ac1e8b02000000000017a91459e33043ccc778b07ab730acea59afa63144427687bdb50400000000001976a914711b78a4896ad54d1484a1077cc6402384f76e2988acfc190800000000001976a9142430de6b26d629911472ad5e9e43e457af72cf1688ac524e09000000000017a9149b90b453467e87f5c4b055afcd112bed9197d931872cf109000000000017a914b89d9097ca59f4598f15198057bd973620313d4587b7150b000000000017a9149044a3ed3a332a934e801396485646ba941a263b87653b0b000000000016001424207d4321e3d94ec4ab8457da24968368eff9b579500c000000000017a914c786838b79c827f5250acfa5c1b589b7c1f7b2be87d89b0d0000000000160014d9e4ba0a821ccfbc7c88c804a8552e2e17700318ac4e0e00000000001976a91436b27163400f6118309ce7c56dcaf390315c321188ac51eb0f00000000001976a9145f0f464b4e0359a4e18abf17e34433aba942963c88ac5ba81700000000001976a9148e50ed55d383d81f81777f1e7bbf523a8f8f22ed88acd4c22d000000000017a914b32118b97040ee2dc3ebb03074ed9d8a0c075bf887d9d94500000000001976a9147ab6877da91d503f0caca318e7c1d7ad97dba3e788acd6bd7100000000001976a914b6dc472d358f02da2f81ff787f49d3019781c1d388ac228e7c000000000017a9148c63591d284cd73e05190e6326bf404008496906870400483045022100998bf22470145249a6bbc613d3c3d36ff44db60f256704f8f8b78e10bce275a602202c37cdeb83e11f68c3b57fa5a10392b419ca789014fb4df244b3c3bb3d4610c90147304402207bd95cb2a85b4100f19dc938ff0cddb48a28bf46d3c6094dd65b2222d4400cee02207eecbd01dc4cfcfc56e046fc110255d4d8ed2839a5c0847e314783e606f4ec7f01695221025379ba3878136a2c318d2d2f33aef7218451b48fb525feaed0b7b00ef24935d2210388c36b59042708ecd6b3c73f236458909c69f561d7d75dfab5841d4334b8d2bd2103a6ddf5b4c25df6234ec4af25178778b673307aa8b17fbb3792b5ed134f5990e953ae040047304402200aa0790b71e33df6fde24d5d12529131c80812579feeddd54d9a5ba6340c888602207c39f4bfcf64d2acf5c021f39146d63716904be87dbf3259afbccdb9d4e87c0d0147304402201d95e0578c0c2ab4df5473e9ed86847621f4b0165dd9d602ca81a439966547ea02207b46c050202dceb3b5a104aa3b6941267d079c9f1bc4a42b2fdd62b7c72edf1b0169522103dc56f5aa54d6bef478c81e30672effed8221a3cbb429bbdd12b9653997c1b876210360c68956233d463fe431a5ef77505aaa81609fbb64cfc8933b3eb6b89a0c47e62103697e50a9040401d97d977fb2e02bd5d7b54bbd3753f970472005fe8d6e6c68ea53ae0400483045022100ec791c16ef981c4908aab26683c4592250025a266fc225a730b82d6a6319ca6802207539b19b79121954a1b0c66a08071c72aae206b4cb9a427acf3dcaefc12595a00147304402204a968dcc0534906a68c43beaf578d6967b847961ba8cedcfe4baf69143c2bbc9022022d339712c4c9c25f121fc847c1c7f1e3a9d2e5430eeeecd4935e48883c06b070169522103d7bd60c38d7aea89e4988dd5d83451a92bb65b86a4578ec28324a79b5b84b43e2103a99c5b570ce6f0d96aa924a0d9114ed3d73a8f8e4b878372983c64cb03fd568721027e63e3b1749e96ba2609f21597165a988b06b6bf3f1d51551f1c94e7a3dd38e953ae0400483045022100d1bccaed8ffdb139f950489fc446b7c233872a6632e527e23f58e95a3b2e9f400220125a73dd20a2ea9c63b579153a68822ba796ede10589344112d35d1387922d0701473044022043e3cf40b27893539182bb0ba360b617889b7d8fcf4b620c7fa4419628b230b5022057542820fa6d8eec0701b192e1b78d6e8d6c42770b82153c8676c0d9c87581b001695221023acc221ddea555cdf98ab345cf940b3b28f83175b0fc3bf0fe837e0ab51f647b2102d9f49d3caed0365398fc6447b7989506a49edb4af626a6fb96fe8a116bab609c21023fed83b7028a84b52208fa4755a1d9c9afdfa5f0c6f92e4c486f9563d8aeb34153ae04004730440220523aaabab06d86b721a66af38c754c4600e81d34c8d532cd4d2d8c61926967bc022036e4b26e8a10bf716a70143d8fdad0558e891800a937c450119ecf11d4bd7b930147304402203918f1a538ede5b186d559585ca004aa343a829da1131b66e2c54f07c956098702205ef52bb508f0f50a6be8e4ba22134367ca2e025b0b0b2fad5e6cc7f46ca4365c0169522103c0ee790efd10375b0f8ef78648ea92e1f75d359e0147578f098f83be7fc27d082102564029cb1e4fbfdc452a014a59ed14de0482f1eb9965f1a8f62ba481fe23bf762102936f30d9068aaed8f7bfb54261faf67b3a5aeae82841c92e6f14139f7b82b81e53ae0400483045022100f70037815095b247137b6914512d5a82feb7667051d8005d269ebf325e7dd04802202996497c13007dac9486bddfeddd92b0ef5ffdfd5cb0a12a2f2b6fa9d8026c08014730440220672fef702c3838357341299b9b526af7c2ddd2ff9474759907a58ff0a65a827c022078226de16704d83de59a7c740b76313ab6a813df8505c6948e3ccd58c5ca5d84016952210258a0b1ce9790fe2fabc68be2d32a0873bb62c835e14d76d357320470d24d4fb921026b6a31702b831ed46339e76a470afddb5190516ffdbff8e86c4b82a6778a1d572103f7f3733a1811f7500f87de73a8dc19dcad0eea3caa710ad991328671610d5a8e53ae49a00a0001000000000101a9d09429106054032743d2461e99b1cdf5e3a1954da0f01d097993cd4cc5ee7c08000000232200200260fc464486f8d56be3aca9aa8bf24feb3963545db5efd97e255cc2e8698d5affffffff0b0589000000000000160014f2af5fe24ac0eb74fe5727e10c71f3c8bce916fb4cab01000000000016001429983bd159aa17b2e1c48f548c5b5bfc801a5c9735fb0300000000001976a914d00f26c4ec6dc87083c386f12125e9d801ef631f88ac87fb0300000000001976a914b7118574c8a22f1b425a6ebbd1ea854a4ca0eb4c88ac571d05000000000017a91422f1bf94825d0d83c1c18fc2cb7c81d827fe3dfd87ca5e0b00000000001976a914b43f8c786e94e18d10c3779d63b9fd654840dc8688ac97600b00000000001976a914eb8b8df2d0e134852d603d6a705f372dba105d6988ac8f300e00000000001976a914d676bc2c3cf4e599d68331dc776b242a1c58b64d88ac60b919000000000017a914254a0705e5ddcd0deb90ea7ecdc426e2cedfb6208787a53600000000001976a9142b16065047663cd38b12abea724c5b1849e404a588ac5c0022050000000017a9144a9a8e5c97508db512cab4a8cb153422b1dd1c45870400483045022100b07d994373fe895c3b6387bf7db3576f8386ee0fc488a2f8bdb4af2f38d07df602201d98a1e6b6bd694f7963c4435d8f83bfa8b8b943a687c05ee8becd22272e1362014730440220270f88e5ad3280b1a464e3cd735e9d54e58536b92c49b1ccef3aadf0db61e9e5022065d459f7dfa651663913df34f30bffc53e2ab1dad3ae06439d9341532c477ead0169522103e25f9bcd9ab8baa763774dc5401e2fc0124fced6a6a5bdf42daf4075099622202102fc3acdccbe9a3627f361a6b063f01136e2673de7029b65d2162b06797663d6e821024830f8871991baa519420efe127a466dd744b1db78946c7adbfead0befad34ac53ae4aa00a0001000000000101155096aaeb7facea14fcf8dd278c039249f4f9ee3436b3864c341a2c019200610100000017160014700c4f328f810257908f7dc38cc8287651286ca0ffffffff020f980200000000001976a914c9b2e6a5e3a1eb81680975c29c42306acea9a29788ac59115d000000000017a914128dec75ecd34c283b459e3bc4cc4d5268944d70870247304402204fd272abb37d1b19e51bfa6f2a238a4bf841d853f7d2e10e4b74f778b7b5e24c022043cdef6e896d3b0cb51f79c1385a17762f8f7b6e60f230b7e90a5ee2317c5e470121029ebeae29d65dea76b4d2d08556db3987cb2d154ecda037f3fa62cce14b7522c30000000001000000000101229405d60a78a24d41211f540289c13d0dd1747290e63036f154c3be50143b272b00000000ffffffff43870001000000000016001446bca382fc7b7cf83f059ae17016498b0caff1edd8d600000000000017a914084e66c423e9e2958fb73dc0f7f5e2a16490392587eaa517000000000017a914ce683e1a7872d4ee1a7033c7e344f771ec9186db87518301000000000017a914038f74775de9de6336554ecd0704be14f0f79c018716d703000000000017a9143e2981173101222a79832e282e31abe5cfc4b11c8718b906000000000017a9149b3478092591ecfcb0b46dbdd5b9ae5da6bea4b887f3001b000000000017a9146ac2c789120bfa2f8254d966dd0bbb69ffab136b87105843000000000017a914b813a95d2dd1d193d5db908bdeffafc992031b7e874e9200000000000017a9148de828ea53d06e2b101e7b35216de9428e2966e98734020100000000001976a914e9d62b80bb5e6b4390e65b443a724c8e3a0e3a7e88ac206b10000000000017a91402673f9a53dd800be4accf7096248e2ade6730cd876c0402000000000017a914e2de935deff7d5a573ab0bd77e60f872e0ebc9f987ea8e06000000000017a914871978c6bdfe8fe1daaf9618ed865a8a577f9ff087d2870000000000001976a9140a5b034b0988b24e1303544e721e4c38a208db8b88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7640ae0100000000001976a914b023d033efb14a0efea884d6213dfcfd0e62b88888acbad001000000000017a9146cd0628096969de251b3c074b92072828bc0d3cc878d5900000000000017a914cdf62a906a43d45be58e29fe8532fbc3e1390acb870f3600000000000017a9144dea624fdaeba9dd252d986faf306596ed37981f8707063201000000001600140a08f612da830c242cf4688fd2584fa744ec685251d101000000000017a914a278108ca2d0ee1464f7494d9519040e06c005cf87561a02000000000017a914e2983e32cb26c1ac2bef3d94030c1c7691cbaf5887361f43000000000017a914a5d47bd778e4287b2667add2d950097f495789d787672354000000000017a9148a66d3680ed872c53a3826d3163dbc7f1cec92af878abc0100000000001976a9144418ea7aa97b829d3670f2414b073b0545a13ce088ac438801000000000017a91425f58a4ce23f759744fe39bdf055d2d239e04c728789ad07000000000017a914fb8741f2dde840046b3b2a31369d3b36024843ed87e6150b00000000001976a9142e4a0ba1eef5bca91dd30e18d81aae99fbd81c8788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76de6702000000000017a914e07bdbeeb47fce6978382355492c2af5f3c5bba2870c9e2100000000001976a914951bcbc4ebc63d540e2a653a48a051c723157a0c88ac404b4c000000000017a91428a07fd45f38e14183f673ceb71673afc5452df1877cb0020000000000160014e6568fc2b546bbac98e4a1925e0b68964b5e7dc432b006000000000017a9146a5605bd8bab40db57b2d2def62f42f17c70834d87b66d06000000000017a91403d0df2249d0d2d6970299c6aab95333790f28ce875aae0100000000001976a914bfb45dd021d4ac96ff424b74bab6caacfd3acd5d88ac7ae001000000000017a914803dddd4cde72992bc9cb94766408acceef9be0e8738c700000000000017a914da14bbcaa164b54906616470e918d7f9deca3ea387dfa300000000000017a914ad45f5986729ac385ddfd89db8588382b1fc80e5877bae01000000000017a914242ea9c06adfbb0528161be44c9b79d7385f74a7878c8df21b000000001600144fb2b94f78615339b292171d5baa71dc5d426f1aa23003000000000017a914ffdaa89b34cb3a3cbdb42019ccdf6a69cad334a68725c316000000000017a9148a399272c27cb796c62cf5e22ac0ce8180f1a1ac87f6fe1000000000001976a91454bdf06c179960ad61edfccdee08456afb9531f888ac0a6c0400000000001976a9141e7359f33e0fd12634789e797537cac5ae8d40b488acad5e0000000000001976a91460225f52353b6b6b71159d30675da1532119a6aa88ac03fd00000000000017a914a5e31888193ddce873fcefd3714c969120a2a1a3875d5700000000000016001404bcf82d749bcf4ee0344e28841dfb9608802bf40e3700000000000017a9149bbaf7231d6e4ab3c445b7958ec3ac4347c6877687a6c905000000000017a914f0e2a8285264d277a562c87da21a90397a61a8f587752f0200000000001976a91475a5552d40350c9077fc8ed8bf1286500ba42d4c88ac55d901000000000017a914dd69a89347008716f8939f8e69a04a9ed8b74ca587c8cc10000000000017a914ac71ada37a12d8c0c7c921e3c7832b6749dbe7bf87400d0300000000001976a914ae746d53ecb7877ace8fea79bdaf2c019d2d9c9088ac9f3304000000000017a914f99e27b5cc1d259ec5d89e25cb979d14dfb1e7b487d20908000000000017a914127025844a5b2614a422ff4fe184bc9369e52f49878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b0570200000000001976a914012e8d3c383c92903bbab0d1319ac3ae25b50c6f88accac800000000000017a914ba82bd97bb6727e46a308677f72e935f21db0cf9878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7685010200000000001976a914502d9a2848801dd4e9a6c5fa63dc0bbee916105588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a85b01000000000017a914f33861c95280fb5b06a0d9ff3668760aefb27409872a4902000000000017a914e13deb7c46fcd1b0fdc890d37162fa8e47ae53a787f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76559d04000000000017a91484303ac8f5c8cf2f3b6c92af7d1b6dd08b6269a387a08601000000000017a914f3f6c3605868789a697d6e9545dcd3c16c74644a8702483045022100bf969e36d815e432b6d3c6ca78c87928c108d33c50a2708ac34e4c971db90cb2022033fc87376708070f7269ca391fbf2c9a7f4f41de6e5207349e9724c26f029edb012102c4c2cb439e36dcfbfe2e81584abf7a3c8f47ab6cfe5600dcb34335197f8d26530000000001000000015b3d9acadd3310e7ffa98c93c311f3b7d6fc9f34957b522a9a17adbcf06f3c16350000006b4830450221009e43ba294b11955c8c1a4dec84663a941db7303138a494c54bae2a3f71bb4413022004ac8afb7ef8b3e399d8ce5ea31299d6fc3cb31a52b101896944f536d544c5250121036a2ab0c26c8e86a28f62a72d335d3ebc1628224832f52ee2018f8b8ca0e4d98dffffffff01b4ff02000000000017a914d0da5bc057fdddb3cfece9a986381946592a7a00870000000001000000000101039c8801357c75bbfc3d803823fe0040e2fbd86b54f53f19d639ed4b9a8780bf0000000017160014e8321d55587f0ba849a30eaa22171d2e214558f8ffffffff0297b013000000000017a914eb923a8b17c82d33173b8ec5b01f0a425b74402287257b47000000000017a9140e961698ef6018cb3752afd92b5580a81d3e6af7870247304402200eb5d01ba8a95958afca1e8f782a494852a52c44686e5aa14a06bdebc51f35330220449e6a93ee41a1a3a27079c80fade7d7a1c07e5e2925fdaa5b67d5112d9e19d90121026f669e08087de4123cbce7a0013405746e1757ad0ddd58ff1a197a784fa5781100000000010000000001010db06af505c06303412d9e8deb5d169b658572939f30608f76fb29dc455bf3d30600000017160014d6c1d34d5a3adbbb131afd2f4410b400b9306dadffffffff022c5f00000000000017a914020dcf019d6719dec373f488ea30aabc935bb58087772603000000000017a914875ba2916b5ca18cf720df27b12f781c5ff14c3b87024730440220330dff3e8ecccd1bf5cba3d4eca4109752e8d03dc264c8991a8778e75d5c667902205e65d6e5766dd1b41674e033a25a22a3fb0d5fa9c8103576d2a754a0b2f3edb701210358d0a293242b27dc0b2aa3601ba319527dde67ab3111d304fdc97328c4a5922000000000010000000001010fb9ade01a052246858a2b5c6e6b4693b9331f301f3636823b075a13c70d9d270100000017160014ba1bf1b872844cece9be65add495acd687ec42f1ffffffff028cbb21000000000017a914702abe7bb699d8e1b7860a1fe1e65619899eb94b87945000000000000017a9140b131d428d8a7a7c1a932e73df46dcd691ad73f58702483045022100a651654fc57ed66257d5104f043e9e4d02c2769da9bc1df98de0d31c4f5b6d1e02204dbdcc758b0ffac78fcc2f160d72fd8bfb624d007ed252f26dd2416f09ba03b1012102abda5fd09544370429485f522b5870d5705ff082648dc12414985dbecc35c0610000000001000000000101e84f1332896aa76fdb9018a1e1ca0a57fd67fda58145477c0721439b36ba8ae50100000017160014d5a8bd422736219b4df70fc433757aaa4b655ef1ffffffff02714d00000000000017a9145a1dcf9785dc6e95a269d7b004fe4a7df55d9d00871daf00000000000017a9146b0c45124ee3fd495684271f804bdda983d3536a8702473044022050b60d355703f75de51a48054bcdea3fa6d8fd1433d4fb9ff465d7567c367aa30220381dcaf43d316ef6bc95084decff61544d84b3bd0882512dd92faf25492ad5cc012102d00c91545b6dca1320eb817358310d8ae22b17c60ddfe62879f1f4cae57467bd00000000020000000001012fb97ebd486f5c9f90a20b02ecb66cd133a19af753345c1bb8dbb1cf0d50ada20100000000ffffffff023f8a04000000000017a9144a88c2710afe95c60d8aa0bb06d69d5a33ab2c0e87523902000000000016001440bed5c8bdb601e064e3f21c5590dc823a25811d024730440220553800cee1827cc5d7645c73318659771b7f2362c08fab6f180e76476d7315ad0220259a5997b83223ac0202dcddae3226f7786e6c9211566b70dddcf2aa7d9f69d2012102aa2c5715bceb4e5210e954dd5bd76a39852e6aac409cf5c4da4916ceffb1359500000000020000000001013ec805dcf0ed2573cd063efef1f7dec035516bb3bfc615ee2670bfa4d06024c80400000000ffffffff021161ed0500000000160014acaec1acae955f7aa33f5c2d167bd37b69f8638702a7fd0b0000000017a9143a79cbd50994a2c1f8126675b6e95f51f417e5dd8702483045022100c6682340ebe1715c34dbf5b1cc0dc62f5191bb5132531a767c8fff58afc6671e022000ca0a1e5b655326be5f6f5db0538f40cea725004b305551a61e9bb445a07ea501210296c88f8ee3c752c3696578d935248b67a564a7fda7cc971a312f812b05b795940000000002000000000101dae0801f9e17f9fcf292d2c53309c891453a1608d7f41b6f0adda72f458af7bc0100000000ffffffff027f70010000000000160014f1ff2db1fda3d48000f87c5987b98be07d273a16a07101000000000017a914079ce7663b9f5468bfe8c4ceeeb85119da1ba8078702483045022100f8d12b3b62c34fdcedd817eafff13222de25d4b5483e901f8651cc95e9ed762102203c64b2d7ee7483fa06ff6860d3568939ff89994be33823f5fbe2155f171cf24d012102c79180575072c7ed80673a4b442897b67e7597d2ac51bedb5be5ecc3dac78ed300000000020000000001012423bab5dc6b33acb94bf4e3763db25d2a3b6b74cf5dc93a113c399dbffbaa020100000000ffffffff028dbd00000000000017a9143b98ed6c0f1a695853ce07f2e525b8a1250054818764300100000000001600148ea23c36581ffba5bcc2e896f336c3ce3c8e24ab02473044022046062ff5cf9bedea041c69748e65df7ed26dd72438becb8ce70e35cc3a1c589202204323fcf7e6d9f9e84663addab22927f250a65e0b1befbb59e9af148852f1614e01210214379722b2d1108d03e04559e18e9dad5b3a536eb06159f5ddd16719855934a4000000000200000000010112375f175857f1dce19dec8b9b070adf3a9979caf8a72da6e9a841e95958d29e0100000000ffffffff02c62000000000000017a914d71cc0cfbda6c7d2e1d8f6213b62bde65f0bf9ac87884b170000000000160014b91de0cf0bb161136c5f6c4d48cd70dd0376f1290247304402207e22f096ecbd94c76724514fdff3435b52b2e7a66f239aec4eaa004087925b4b02202016c34f6338cd3089641cd53dbd9556cb666c648b51fce1f482e05e2e914c8c012103c42d87854fc3bcc6fdb7ab18b3d1ae3cc22397b3820035f7bf7809cb3fe7cc9e0000000002000000000101138657ea0d90b5e8b8bd41cee8c98ef30132693339222915c999691205e714ec0100000000ffffffff0255ac00000000000017a914340fbc78ab8cc428a04183621f7a6d20ac703c858773230e00000000001600143ebd19c5fc7f807f5066b8f21f47df0d042e4c800248304502210085358877698faed372f61224616ed1bb241ba1c8765045f911d115c907b8c900022060084f9461e463b2b97dc10c36feaaed60d6dac73fdbf100480c7c7cdc84ed2f012103ba8eec8cfe6bca8ff9bac88fe830e40b030bcb2814cb8a267f4429648385ff42000000000200000000010167fc50b79f049264efee2132290925c1826e3f34dfa34462fd939d31893170060100000000ffffffff0211c001000000000017a9142a7ddd0f76294df2ab1f2e801d79cafb85d5e751872a01060000000000160014bf2f4310bab7e43f04e57e3bb21abcbb210b32130247304402203b52881096cd1dc58aabd8d3d487ee9fdbf41d5748530f507c3c16e0a55d7dc9022059984958d7fd097892953098f18cf5a4600a6a4dcb5b095e1a6db20da6adec85012102a08755f363413e9bc8f9e50e9b226c6f4a7eda1cd30c6c334125e33341a36d720000000002000000000101fb93287eedc878ab4bc37c2595e0805c5a680261747a484be567e0ef0123c1da0100000000ffffffff021088271d0000000017a914249c595e4a4061b744f5b3dc2317db825e5efadc8714ba9b060000000016001442207beb4ce1b3aca9808d848fe5c1fdee783d5c0247304402206e5327648d7d801fe44189f3c5b584c4e95a4d8a2b9932064ba40b9d667589f9022039dc5240385b331760b77f0f051922977a0d17b70c942440c774c2ef577a3f38012102aa1924fc6cfd0de06e554eb067314ce5ee4ca63c85f7afae40f324cc411171ef0000000002000000000101beb83c7388041f3a9c6a25e33e7bf825909c84b72c61c854b316c33363ceb5e85100000000ffffffff0213c50d000000000017a914f6b5cbadb6d127a1f22465e0e016e0e68f180e9187252f310000000000160014def513b6fdc7b303b422d2877f809900a6b3024e02483045022100dddcc78aa984d6030d54914f5ddee87053f6db590d1da7c8f16f1570a503dcc80220268a290cabb1be38d007966124472ed0501e84e088fdac4b4722adc43b99ae76012103c613c87377e2bbc5b91912e842f418d40a4b129b2549f48048cd3ec18627c8920000000002000000000101b0d6deefe72636812ec46d72f4f1e5c0cefa4699af2fded49828b2caa6f4bcf60100000000ffffffff02e3ad01000000000017a914d2805be62fa7bb0bc86ae73130fdf8459da8b19a87715105000000000016001448fca6d15a2adad16c196cfe1cef10a70782428c02483045022100c3f0d625f2b35d8cb21b41203f7db30110665d42e68dd75035e3f07d5ec0385e022057ab8314dcc01f57ac0977ff7332e6a7461487a570f646b63c75b5e02d34f862012102a0d6a1daa5f87bd742c56de26ddb61e328da83d62faef7fb133d87017a19b757000000000200000000010177159b03ec84deea456e378b021593f07db30835a789d8db8c0e72d9c50be1330100000000ffffffff02af4e04000000000017a9143f94f2a2b1715bae3e3b0867d12719d44cba6eea879b9c1e00000000001600143aa02f1653e86694038ae9e513e42dec1bdaf5fd0247304402201ca3874b9abb14f05b26f952d8ffdcec1bbd55a4893bf2455bbd93debd6ae83f02204f04241b5e89366ee9a1a180cde11b9ae74010e4adfde0bd97e854e6036c050a012102f329e04454285ca9252b10ea4c5773989aca98e038cf712d9bf39531b6e5ca300000000001000000000101837ff4b7c1bfb2b9076d1b0ae92b07f55021d9a83b7b170a327e6298110ad6f30000000000ffffffff0284ae01000000000017a9147170ed7f17aac1dbd26d074915e2e5222e0ff51c8704760800000000001600146b98459e08245eed65d1386d75b1c8321b756632024730440220273e5eb3af67b95f93bc6340e35e05a66f1d66d29df90eae735b80cf14089fc902207835023e355d8327e50f0726e3d8fdd36c7aefaa88fc03ffd2794feb95480337012103be9a550e97f468c6500c573a893191226f8d4c0820e3fdadf8ff6cbe4ee0af03000000000200000000010136b64bfc941aa577c4460cab7156e903fbb0c98bb619d8c645784edb84f15bd70100000000ffffffff0258ac00000000000017a914ca5a4b064cba0f74c84d4e839c7dad87c278bef787fc1eb400000000001600148cfe4379bc0f17b885406bd53fdd8025b3e326b3024730440220231796afcc692d0ba63ac7fc8a4b93a3e86a7b824048c7091d2e4e754fc7f93d0220419908f7ccd6929b8aa8abc685065a6ff1a68ed3e10589bd6053f03e695986a3012103f5c7e65dfd52ccada9464588415b5253219d12322785b4b432006cc503760a5e0000000002000000000101033f073e85bb47678bdb4b92b082c5ca1af488bbaefec2359903af3e8ce3e4d30100000000ffffffff02eca80c00000000001600148bcbf57357018e94bc1f3cd0424a7ad5d06fa64624f61a000000000017a914353e4d3f2061f00ac3a9b8d2750bd6e651f67bb78702473044022008ea5b1e394387347bac83c14bebe6d9cd660081738046d8188524ae01427b61022060565eb701804659fe54539ab0161ac1b421cb36721159a94e5480a343b846e7012103cbf4c058be4f7bb8788a9d38d36174a440d0cbf2ec80a2190f225f296fe779b800000000020000000001012d1d9a3941412ba80932c5e8113699e1802adc97e276f2c60887dd1606e5810b0100000000ffffffff02915c03000000000017a9141468a4dff58f26f1c3b2acb108ea7ef0f498c56b87ed0c4800000000001600143130942c9725513bd67eb9eaf30a4941c41c65df024830450221008fa0b6157ef7ee3e13b0f41942d7cffe80e2801d855f159e0aa764c2b5049eb602201658b7a24854636a165cc7fae478d0f6546e9630d7e39bde61fbe622781697c9012103cfa7d8581463ec7f0990871fe27957aa621f5d6f94bf663ade1fd5f4ab23b535000000000200000000010191b5460f1def86af5bc3118c4cc9cdd364484e537b0d85ce1b0362cfdfa1f4bb0100000000ffffffff02082404000000000017a914805970aca819ea3758a7dcfa81a33edd615d563c8733244d000000000016001410742a5759f64825cd56d1758625842590a01a0002483045022100b7a6dcd652f097f0477e59e81a5d61060a9cb74d93cc754450203b4538b2fdd602207f99011f82fe38bac69fe7717c0fc3d0b022c0d6e6ee3884224cd8fdf19195080121039e850f18f3f9efd229fd413bf53ed9b3769be7b9b71405590839f9cd1f5a4007000000000200000000010171daaa90b30d7a6f9dc151972184319be32f51d705f54c8387d78328f440f6b00100000000ffffffff0241a921000000000017a9145ca1726ee471e0e4a5052c26bb66708dc7e01e7a8720480900000000001600144ddabc13f82c2b2edda1de604ed375d7e9da4b5d0248304502210091243ae0dc5605bf6d2f1715c71c35d140849bb051645528c5c4f19190c122b002202ad60b6967d802b25b9ccc7d9e65e86ae2800bd8569ef08a7c91a4a0cb2424a00121029d2b3b4e86148d61c57b5c65bd95baf1e834fca8bae6bc466ff73077d79f980e000000000100000000010108710596fe200e0a568ba1b0f5478895976e611c3e70a259dc52858667c266b40d00000023220020d1a7b830f26e15899ad61e70ca6754b79feb91f62ee3a5096e3e54030ace652dffffffff0cd1e200000000000017a914367438fd4d7aed2e257fa01cc8de3d61536e8be2872c6a0100000000001976a9144ab31f9fcf5522c3dec385aee3f9b8f3e29942f188acd8e20200000000001976a914e86470cb374e255b2a29f0d12353c53cc0aab0e288accb0803000000000017a914f4e3d7a584884eb30885613a5df9783549d79ea387a12f04000000000017a91407f13051be5adacb56d6fb4331b082967e4fa531874e650700000000001976a9142f64c252c2200e8a4018489d8b1ba28b430434d488ac8b200d000000000017a914ce79a7c912220f8ba2ade369ba2cd103c9853f1787ccd410000000000017a914fe357885e8d091fca49adc9a2ea3b7cc59455ca88788d71d0000000000160014f9ceeef6bd5f53f4dff5872196f4a91333ebba72f4522d00000000001976a914bde4970384e6442f55c4d5592bfd222d91ea0b6588acf2964800000000001976a914aef0906b6970c78a64a0430aec8a9ac561de7fff88acdb77f4000000000017a9148b90bbe3bc3538d3ab492392073976b1f2dfbcdf87040048304502210093f2af8bd2a7024cd3224101a8caf8c801736f80598ded529943cca7b1f02d6102200dfec3c170201c3f13ed91ae6b5ce36d4da310800e7994fe27f95a507120322c014730440220176275b9ac64199d9763ca092e943a215d8742073cf1e6ec504a69cfaa92e53d02201cfd8ad38bcf1763f3f21c7f5c43122df7f2ff431d0abccc0a559f69fb17bc570169522102978a0484bc56566d7d4150e080c15c17ea6ebd36983dce58b10baed8d08e84822102be4f29861cb3d76eb67f0c4fb8d9277874eba59b56e577050596188a9aa234e021021c021b0b0e201a051628bff532747b5b27e3c1542b82d5febb154b0683c09b9753ae49a00a00020000000001025698602fdaeb32c2d15497c8a651eb680c854a8388cea7e990d89da944787dd40100000000feffffffb91d17d8e52ca4b80e3a7f1854e78fef05c088157f71a2c45c285603414100be0000000017160014e9f4bc5aeb835b607b4dc4fb462085ff8ac84924feffffff0280090d000000000016001457caa4c2937eb05e47fb2b1bb9843981769a30400dce20000000000016001481834de77fe312cec4364f1642beec0b528d1a520247304402207f8f735228b2720b63f6064b6a1dabfaf4861af980a958cb421c5580a30239ad022073af87c66d9d5266d832d021d7fb1f8cc5d939f8c5d7d8641ed9b3f42f39f1c0012103bb39983d872b19259ea80bf7ef77db246433e7d7fddbb72cfa2fb1bd434c9f730247304402205b86156d0593ed6ada49cb4c699f0234a4b0cb2dc69c11f02f163358cbf007e0022061d2667c1753b45d1eaeb34bb709fcee5053fb4bf562f77be1a4b38edc057fac012102e246d2b6fb73b3c7331a4ccfc9ea9ec43e57b2c5054666cf9a6fd9cd4cc0997c47a00a00010000000001020d07c5d8c05fa66c2720e7bbc8584628619b28df8923159f9d7a34d4f6b40b0e0000000000ffffffffa9afe7d9217a46fe58ff1dce05b8d4f8dd815ba72566ae6918a3ad88b9096c55010000006b483045022100906a8f0dce576f0ad7e45f24ee8cfc887879d62354c39584330a8d052cef9f4202206b1e909c09a7059ab2155f54ac27a98af60c37e87beeaf5ff7016cac01088312012103f9ace73eaef964737f047e72f3bd70279c55a86a0735c294ea9c3dc293cccd39ffffffff02ee630d000000000017a914720e6230fbea943fe2e4f590f736074a4d4fb8e2872a1800000000000017a9145720dbdb5d524cb282503b1434ecfbcabea267ed870247304402204a07c17dcf0851ed306b8df025d81f8acb78ae0c905b3733db66835e0973413002205413ce8ef296ffd38190b62f16a0c0daedf3e70dbe575bc72fbe9aae51965ee101210328081d35263a526330f8d03275faafa0e9ac8ca3eb2ab384d0215f8b7425452400000000000100000000010123ef338915ec470322286580eb9bd189a7cd38159f1d2fd3a093a879005838b50500000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff0f7b0501000000000016001491d618e22e823abe1c1a0d86855e1d2647680fb7694d0100000000001976a914cd35056236fbd73ec1f6ff7a001bd2faf6e81ca588ac0aca02000000000017a914ea4e7f5c221eca603c3d143728ac9a3efecb458f87d36304000000000017a91470654a2848075a45648975b2b6743742d899950287aba20600000000001976a914784ebc704455b0702f84757db754b846e4a4839088ac03ea06000000000017a914872be64d13ae7eb4a58b99e49ea05c957e2f7e8187f24d0800000000001600141f10e04780942b0a0abade152cd0b0240b506f7754830c000000000017a91458aed14ac3fca8ecd827d2a9ecfd87b0ee59acc28750060e000000000017a914f668ee9dee5be9f4047bfb8d0a6c178216e0ba3187d29c1a000000000017a91479c5e4960b3364176f79af9bba6ce520ff6871e28714ee1b0000000000160014b71f14f84ce5075a3baee34d156c6d3e4b0b237d9ef21d00000000001976a9140fc765ceff3e2323da52f9b5774fbaf0b5297a9088ac540b2f0000000000160014235b0cd702f4e9f84ae0f19ed9e62eaa5e88a6bc0e6b4b000000000017a914288ca8025955f8835f655f97f693702f36d4c0fc8776088c00000000001600144650f80d43200ed6479e0e766790ad793a61ebf10400483045022100855b3e7c4d532aee591a442deb9d263639e40490ec21d466bc84977135ea2e0902204f3fd8c7477a1164ad505028122ca3b7bed1de9bef73d0ccaf790162c49e9ec701473044022031b5dedcf8c9933e07e221b5ad989944b31df347573e3def7855fe9edf6acdce022059de9d04ce25be7753c15cd1553779e0bfbafbf90b1024a76626b4ab43d4bb9d0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae49a00a0001000000000103a4f542ec63084899a9693d08750a11fb6b959fd7cea19fa7b2158bb14892a8140000000023220020da60fa0da759ea734bff64867e769eb25c7949674c454c16b7b65be8f1d8fd60ffffffff5a790a6b5f172ef0365bf329c5253df0083f62930734b4a2919943e7295c3a350000000023220020c494747a708dbcb207e9674e9ae3cab757595ee7a95287b86ef2dc1b9186697effffffff27ccda6204336824588ad0526b03c44baae57efb64494fd27efd9d9776606d460100000023220020bccdcbd4bd0f49470180413c1cd07fbe4698c92d9b3890b195548c56a31c2644ffffffff01f4484e000000000017a914b6f42dddefc65b1f71fd93177b1ad6a4727afba387040047304402200ff88ff5f482d062ae9b5bdc34e9412aaf97c51d1054d8d2a6ad6ebb7ea18cc402200165b7df85db4132527218e959a6da473fa801c606e3e28745cca545e5fa1cb401473044022039343161dd2c3c2d130baba2251e4065ff2861a2d44b11744cc93cb53304e89a022013e1b584420d7c03982c5cb9573218755f72e9c4b536197b3f0312758898051e01695221023f7139e2219306c7e40aa67dc415790d534fc18ceccc2c66cbb126ae0f332d7821034a4fe733cd78039379cf6d9e234314f7724ac0f3468c0368dd85c2a76beebadb2102e5a0f0eae1e8a35e025ad1b7d0cd7c9bb155de847dffb9aaeecbae698a8da70f53ae0400483045022100ff65c6a02c4ad2b786fd60d8b35fa4245ad46e874b39930ebbe2f2e9d08fcafb022027e58175a439243a112e835bf630832391d344f2957dfeef126b177e06c63f9201473044022043fd97229e0777f05e791dc20e7cb7907e3c4ef08d4cf90ccd8a0ecb82cc92500220329dee745bdc6812b0deb42a6d02f72ddd83b4e45efedfa9e5266b51b76e69af01695221039c35a36b5b90e54a7912b1ca05dfacf509e8c6a4513ac6f71f281663e49332562102b8b8087965b93c9dbc4e31b9d8c43041aa821bdce3b63270c95013229eb5599f2102eab645c97e7b88e3325179b2920e6aba40108232426e974d314cee6eb5bf363753ae0400473044022030853f9829871ec34f7617428fecf4e20e5045c89a5e581f92b2a53dba4cb0ce02203127de7051a8b4286483157e54de1abdf8c28d659aef41d7e4ecedb7e5d632280147304402204009710f4c1a65e97fed8d1009c77a387dd010226c144fa713041431ab51b13502204adc70a746f2a3f3b1b05c815de5c36b808b1a8527b08fb230af01e8511a155e0169522103b5cd7f8247865f9b884bcee2ce265c4a6734a4cbeb895c17f55fcc26ce1f97c1210378f2ea608db6919a63ce29a36fe9c6c8f749222ec0baccf37747fa037db508bd210292b0f153c6721e1c68f57d411b2109e7eeb45c4d96b5fbe25892ebd2bfe1506353ae47a00a00010000000001021ac5f3a4e094c1d675c2dc28a27a1672629233e5d49b2c4eb6d378e2e80640f9010000002322002007f0fd7b1da8039f2402d02cfc04184be1aa73c31112c0cb5186c1e0a1a6c8dcffffffff62870df1a845fd835237c58aca65d49990b7ca152c74ef81fef52bd9bc8b29ac170000002322002033a45ce83ccadcf9f478f2ebec165861e15d8233f4a685e0bb4dbd8810177893ffffffff01ff6804000000000017a9142627466df2e7f65b92d0dd3a93a6e2205ae71206870400483045022100e936e805f348e62c0a2eebb1bee24e4087ec38cafca5c85f140051045c5c03210220743f648167e3eee308ae2db6b1ec3346ff1c60c43f0df46d0c9488ee778b4bba01473044022074a2e8dac644e33f0b39e0d8c59cdef61baa089ba800467afbb024d1e06dde7b0220316649d8df3cc3d8d4e410edb64173def93c13afac40437694c6a2ca053d6f4b01695221030c09be4c4e1f551594b3ceee30ad291979f569bd64597fd84652f75c8f192891210303bff3c5cb9df49986c18a667af622f6e129e3030e534a4bdf6bd4f8cb25dd73210260f4453f749676daa6859112a45e0cea8d44dacd81ea5f24ee306c0d33c1b2fd53ae04004830450221009fea064a707ca70cf62130c0e4e47de17e809db917e994649030bbd096e40aa602205a150f1208fdb09c8f10520b2e885163a9b05ae084380ea15b95401d9116b21101473044022050aca4d3083e435ea1cf167729775bb4a27eb569fed8aa5cccc273657c75eaa10220074f3a4338c29c78900c43ff9ee26018a34bcfe043a97703edb4513ef47231c201695221029c53f7d067115540e9796f453254132bb78c2189920982d23b5dad0280771a4821038d81d0a30d67610beec58c4ff27dde597f9658793417cf0133654570cbffc7bf2103bddb23af04b173e3ed44fc88ce00d67a4acd2c633bc2875de189b0e39d3c8fd653ae000000000100000000010190f69eee907129df79c43173260b0bbe4d793eeb656c2ff792004d81a8e4a34c0000000000ffffffff33f82401000000000017a9147ed52d3d5f555d142a63aa490bbb237d18bd8a99877863010000000000160014094600909dee42047db19b73a700cd1794f9bdb618730100000000001976a914f454804fd9db65402e7becc99e5cad5c1b9e235388ac109e0100000000001976a914f1d9a96839c9b9af45cc69cfa8d98fbfd07f8a3088acc8a901000000000016001472e2d2a48aec3c6730382692c7c968767124014cc8a901000000000016001479271247cf4fdd069c62595c4e89046515c32878289402000000000017a9144c216f58ee6f8abfada554d19b09265fdc56ca6f8730e602000000000017a914624b8bd6a925eb22f580aabe5e8665d1b3f4543a8738380300000000001976a9143da270ec2c4c6712620176c60f47bf5e0eaabde788ac38380300000000001976a914bac04dd6c87d9d48314bd58011715e8228d4e41888acc04b03000000000017a914e24d72ed6d1ff214019398669ac73ed69f4c595e8718670300000000001976a9149cbcd407d0b97cda3804891eb77dc72be3c0738f88ac408a0300000000001976a914a6c36c68048c3c932c457e2d5ab90595ee3739ea88acc0c80300000000001976a914185e7696295b08a745dc25ca4c7ae76bab2860d088aca8cc030000000000160014d917530bbe43d2974f4997c11f4307cf5109de52f81204000000000017a9141ca37396ae735295a82cd72700f592eda4c9107187707c04000000000017a91469ff1030d1e6d59bc529be4fbf43574d3a38eeed87108c04000000000017a914e2c0804c4f56e28ba2c37702e2bb05ab50ab03d787e09304000000000017a9145f15fffe74954ca1946f12974e1feee48631c39a87305705000000000017a914e1338ed3f01e892e4df69202afb6dc8d7020c263877070060000000000160014f1e0d04a48a6989487b10ff58c06c3fb4083a29e7070060000000000160014f33e8de39820c05b591d5045c0c0c01a43524b7338a306000000000016001413cdbba109917980dfc8bc94cf1a9dccf844f4d320a70600000000001976a914d13e2a0b94b483ecdbf7b039d3ca0b9d71019ab588ac90be06000000000017a914d811e2daba62d264958cf65376b757f736406c1d87a4c306000000000017a914c20070d894ded8b4609f883d6221f0b65b70915f87b17d07000000000016001466eb43e4ef47deb2a5342779583610ddba4a3004988d0700000000001976a914be72f4329a773a2b9538800400c045384c681df988ac69e7070000000000220020de4d7d5b8720dd6050d87c612cec04d2ec31d0673fff9b21087d8a1ba2d87828c8020800000000001600141609de493b5e90df2e9b585cf1fd413dc086f8ce706408000000000016001413c5cf9643b21fc380ab36bd4e5f2281feca6df958df09000000000017a9149236b59ba9868c0cab5b0ba9b7f815a441a4783987f8ee09000000000017a91418c15e95b0ab215dd3ec4179b3eae49da27e7fb08788540a00000000001976a914fb18f441c09f5bd57bae7d6ee69f65fa8fd7598a88acf0130b000000000017a914360834b2e9f84faf9aef76d16ed4f365039c68598758560b0000000000160014b0752bce5e2c3e1b03b82278ef2c82121d3ac7e118b40b00000000001976a9145077a7f546f2552fb5d0242bc39ab2c28746006688ac90110e00000000001976a9140c2d3c75e96b71d430aa73a14032be127b29c1f388ac08f80e000000000017a91431c3a63cd15b858a45c83998afce2f540061f57787d5ec1200000000001976a914e7150302af452f283b5baafa8c08a303ae8a1c6088ace85b1b000000000017a9144e20f862e66b9b4047086e9fd28e7c7812c38b5a875080200000000000160014bbe110ea38dd359ac773cb61c548174f5a9a08f3dfd620000000000017a914502ae5b8e9a8fadd44c17d8ed9b6cc1015f06a2a87a031240000000000160014608428bff98c9c1a35eaf96c6f8618de8fcb227058ae2600000000001976a91496d191ae70b16d941125cb35054e5e452f84e2c988acbf8b3200000000001600145880e995d0b6cffbbb10d84875010eaa258faf9570cc4a00000000001976a914237dcca874765a2fe749fb930d3b24b1b71ba0c788acb0385300000000001976a914139806721f60d81c93e588a4ea0ecfc924f5dcf488ace8f69300000000001976a914ed554a6306ffd153aded86690e036b79a507fe7088ac10adba00000000001976a914fdac3e5259f81fb487dc72f08a3c891f2a36a48388acdaf831020000000017a914739653c15ebcecb029f41139d714b71d627d140a870400483045022100a838e691823cf8f39a723b080a3579b1b56e39133676f273d19e3695aa76878a022077bb29b9a2d930e17b670e92e761f5f311229e8d60a21163ab6d941eb45649c70147304402204892c684990320d6faa0cdfa1d1115ba38cd50b756fedbfea3fef19ca19db39d0220435d96c0b657f7301314b101680cce56641ad2037afc40914f57b4aa5ce1122201695221032c8b08f646eb87524c2d566a473675743a4ed0420342c9b4300a48446614f9922103e77cc6012387e56a1ce2b2919d6a32ed700e75066a2e31a71fa46648cc362c3b21020d4fce3fab028d84d22cd49e115a4ec3dce429503a6cd9fd70055a246852947453ae49a00a000100000001b0d6993f4c435e0b7aab7cabc320732fdcd99371fd29b1d2500252e89d64e41730000000fdfd0000483045022100d22c4f8d25d75c3addc07ccfb4cd4cecd55d8d73be99c189c52b01f2d2aa23dd0220794e43fa6bdee8d3aa2591505a3ff7a5c82248d83ee917b7777318431b4a601001473044022036adbe9fa7a51da7bc4899784e3d782d7497d8ef055ba4551e519a9614c9d27102202c2755201adbe62a146aa006ad028e7a401ed80ed8386dabdef2b4cb7af1151a014c69522103e54bc61efbcb8eeff3a5ab2a92a75272f5f6820e38e3d28edb54beb06b86c0862103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210291c5a54bb8b00b6f72b90af0ac0ecaf78fab026d8eded282ad95d4d65db268c953aeffffffff33bb5f0c000000000017a9145ced447aa9af2008315b599cd68300ae04aaabd38787d40c000000000017a9145ced447aa9af2008315b599cd68300ae04aaabd387e34a0d000000000017a914c9ff3293579b7bc1c0e07c463f6ef2b46e0ae73287c7570d000000000017a91406c2f852f2a8aa74ab8fa04feca84ac850f58fad872f9a0d000000000017a9145c4c0dcfe4931387a96723230fc0e2abf7eb5b74877b2e0f000000000017a91479a52ede534bc5700cf415a3ca174a956d6308338743de0f000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e870bdf0f000000000017a914748759e22eec3033feb74a527af83798397269d08747ee0f000000000017a914748759e22eec3033feb74a527af83798397269d087f77014000000000017a914fdad36b3aa5100607648fd769eb3e0e392d7df49873ba014000000000017a9149c36c9db0cea15f0eede5e0a8eaf25dc570fc85787ffcf16000000000017a914748759e22eec3033feb74a527af83798397269d087335d1e000000000017a914a48a5d2aa4d4bf0a6c2c5dd042ac4eaae53de7cc872f981e000000000017a9145d6be984e5d4832da6acbdd46b038deac2eae6d7870fa428000000000017a9142887b24e2591482561c3024beb18e151d9d2a8d58733152a000000000017a9146d0269192f72735038799ba26e09e293a9f73a21870bc12d000000000017a91453bd2f4eeab0f7d2b887b1fabf1a2f60e69528cf870ba22e000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87df682f000000000017a91453bd2f4eeab0f7d2b887b1fabf1a2f60e69528cf876f1930000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87df4930000000000017a91453bd2f4eeab0f7d2b887b1fabf1a2f60e69528cf87bb7b31000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87833f37000000000017a9145d6be984e5d4832da6acbdd46b038deac2eae6d7876f543b000000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b18870f583d000000000017a91492d8260cb2ed6ad1e06a6c940a19a85c6e1bdcbb87432f41000000000017a914d18429443eab27782252172d345ed14b740fe6b687f78842000000000017a91460b8e43c11f3435b3ec009b1f23c4469fca24ad78723b148000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e871f675a000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e877fed5a000000000017a914fd1856ef613bf8d1b865e9ed387f7ba2f24a29748747aa5d000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a879b5f63000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87d7516c000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87275a6e000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e878be17d000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87df1f9b000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87c327a0000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e874ffbbd000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e87cf4dc3000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e872f0dc7000000000017a914bfd9c1785d931fb175065772d258ccd579b05510872b16c7000000000017a914bfd9c1785d931fb175065772d258ccd579b0551087737fd9000000000017a914bf016de94381bc75ea8f123c8f4d1bff7d5bbc9e879717e1000000000017a914fd1856ef613bf8d1b865e9ed387f7ba2f24a297487ff0ffe000000000017a91457ce7c8101ecaa84bd582f53ee3148836ead613a87f3596f010000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b1887f396e6010000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b1887f3a860020000000017a9148308ff1be18c8e087f65ac4f2bf82b1c86142b1887fbd40d030000000017a9146aaecb227f51ff21bf9e8a09d6b6785bb5df574987330f64030000000017a914695475c117e3b1bc3e949402fb84ce8aba10eb03877981141a0000000017a91410065dd50b3a7f299fef3b1c53b8216399916ab087bf7511310000000017a914471c9be003e77d85b74fc2ef5b043db2877a19fd870000000002000000000101317b29d6464044c53b4ddc59c01fb2ea70cd5c01a2e44ac4a7b05f919e954c200100000000ffffffff02bf6d4d000000000016001457093e8850b68da7f3a35c3c739ea09cbc47b4cba5d31d0000000000160014b74cc30f6a3f2640703e2dd7032160c24b90f004024730440220337a28032cad44ec8489a6ac6091152cbaccac0bcb4ef54e8c04b0ff6cfcc6e80220043c2d73d693076897c83775c91aa028658b95d4521bde447acb319eee311d9b012103270881f5d90261329b4888700630360062f216137d23d833444355f3bb54c170000000000200000000010116f27818a7d67c74a130ee6e2b1774efd416579e40534b041b91cb822cd16d140100000000ffffffff020f2a000000000000160014e9902e8b70440394560b2b6107ac3b48eda8646f5423040000000000160014d4a6aa9694606a6ecbcae2b133151b6aa3acf2ea02483045022100c8cb0ae3717f04a78db18005154d25880c4eb597606710ecea4a1e6ff0e447c302203d03efe433364af3de71500583c13e1f31b031e38b1c36ec033f232a958fa5e401210378428f7d857b097aa9d9d77fd4bc8031929538ad9959c8d94c20dbd09ac9415000000000020000000001011b60f9d69bffdd6d644ea51b235400741e8e7d1325c15c769887d95c90a547370100000000ffffffff021027000000000000160014931c81d734c9ff8998bd70a861990ae9e0c61de25972030000000000160014a4dcc0706d8efa9eee763375b31af137c911b52302483045022100f449ab7fa3e331ae3755f0c2c1550ef9c2db8e9588ad8bf4d28ff9a5ce9ad1b202203e5d43c8b50e975cc6cee3e6534c9e73e4c0951c02efb87edc6d4bdfdb167f670121031ec8bb04ab2f5ea951ecfc0dad3309f02a3095d0dd9bebf10c6bb51261a923850000000002000000000101e07ebc5039bcf6afcd92df25d4e830c33b5469284d4a2db8385b6230a418c87b0100000000ffffffff0201560000000000001600149b248ddd8e149c31ddf7a36d7eeff74aacd4f69aa728070000000000160014c836e841c3dee1b111e19f4691e5d6c6a6315e190248304502210089184cf9674efbb2ce06887b35ee454fee02dc4c8506fca9dd0b1366a9862b710220725e5bd4eb00b9c320fa1faf0717b9d0ce803f223aaee98a6fa37e46d31a2b67012103a362c7abea6fc68cec2452a12e7b7f2964aa009e4fffced5b8b0c66d697be5230000000002000000000101a2c498524d02bd56eb18ed2128f3a700573fd8b8ebf656989210f427f5f07a6d0100000000ffffffff026067070000000000160014b87184252220fa2c48eb1b931dc47b53cb7ecbf67e22080000000000160014db26c5d1fdbfff4346a3b3177cf155c61a4526f60247304402206665faecc950526f6ea1c9f9a3599d744baadc7930af53ad9239d3503d88fff0022036d071eed88a8ce457112b8249c39b4fa7d75f064733dd4d2b3f82abcdf82ef8012103c6579418a6d0ae285210fa47ada5a6599e16213586d9afbe1b4627d3f6c89d820000000002000000000101891b6850f9ce7cfe3b91f3111c400f011baa9b22eba71d6909f6087fb37748fd0100000000ffffffff02a909050000000000160014c96f3f9d89191de9581c65a6090f5666e36033e071f30100000000001600145281fb878c437ef18338fa72d52e2fb3b8dc6b8902483045022100efcb85e0cb2bc21064210c76103a313f40814a5367c1c0acca9008e4f1cc2227022002c4648a371c511bf46968058bb832ff9a2a588bca8535d47df82d141ec3a66d012103ee767e5c92f29ba686e2670faf6c2a93a60c1c1d420bb20140edd2944b4b7bb6000000000200000000010152f1852d76b528e1c63181f8c7fbd6e81a4076d6e9635bb73d879712d3c203aa5b00000000ffffffff0229f8200000000000160014f59a12dbf66cca1e183c042e03d2e58b3050ae61524c210000000000160014c42b52fc9988231ac7d3f48825e9ce61d7e9e72202483045022100aef4b3276e8122087f23cd02ab468471a7bc874e37f81b1cdd859c64b7d89c6f02204d763fe4cf776346959006f497e7562cd37bdef080cf476ade0708e774be00600121029f8fc0793d3737b8c29dcbe5842b6d58e831397e1367e52f1a3565fbd5b309b50000000002000000000101e1547429070b0bf0217d14564148ce45ac67f9afa7e5881041fd27c7491e10840100000000ffffffff027bba060000000000160014b1b4ec7d19aee291c55ed4f917007e44c2bc040f214dc900000000001600149dfe3e12f1e68cbf7cd32f83f68cfe28fc0c11d70247304402200540b0e10fed241f0354d90737c28afcb7db3ba3fa0b47792df355bcd842a1960220525508d39ac829dd8e7c1a6811a17541c476e27e4004d25e9829823d38aac064012102d8412fb5b4d6ef0b55092522f8b301af7a7315bac820e3f53bd49eed29d31cfe0000000002000000000101d9387a95babe733e94bb5aef1ce029544fd1f756a221e16803d161d9b2e9f4ef0100000000ffffffff02f604020000000000160014f175b40c7b25d6caab562d323a824e08ff832edd0378220000000000160014dc5f52bc7fb51ee82c5ddbd2733cf41ab8ffb870024730440220710ed838919d9eb10d28112be88540e86a9a2347982f9f0599ee7924463ab80702201adfc304eed9b0d70302fc498ee2d5d9dcd5842cc916ff9e543a59a0d064a97501210287d28c327ea918dcd03c4387a91f090069002d38e4252313eea1f3b4cbc1d1390000000002000000000101e4e509953100e50fcb0d0f28f21400feac9775824fdc52885aff02818e3ad6a90100000000ffffffff025f02010000000000160014117e1fe6467e5f24960d581f20243d131b38cb28938a1a0000000000160014095ce98eae5a51424136e642de67ad7bb68abe900247304402207e402b7a475f06f62dbac74f2cbe33bd40de63209a2940fb89a641bd1b67d41c02204e9947673e5067a26ab42acb3340aa3e5c6f28973208524be67866b8406c3e6e012103b4e20f97208208f8d78b539efe729ca752f4f84413623fb969ecdcfafb7bbe14000000000100000000010517225d88896992f1990d493560b2f8f0ac456e72a3d10c1b8f168aeb7c4bff1a0100000017160014c1850fc9c1c37459bdb97dc8cfb3a2bc383df0f2ffffffff2b8c0975057958a6863e2185b0f19901b1e992bbb5e997c19b98a68e067ba830000000001716001455df85b22703eda03a028a5774db45ecb30e9258ffffffffc6478607059680df6951d4d55fcbcdeb369724502813d5e67c1ffc1a594163500000000017160014edc43f33e6bc95f4f704efe69c89f39f82fe4a0bffffffff50fb89fc6357b0d3d46ea6ee64c5c5245efe93ca2c74e470496f51a09cc0999101000000171600148bfeb02950568428005b4522dee8ed5486ac4319ffffffff054b4146ef14f319b8b1fca95749c626db758613bcf9be3a75df19af30e068d200000000171600148779535dfb32c6932716ef98add5a85300e438b6ffffffff04a31100000000000017a91402b9af5b122598d95cbc43a39866105aaac74b618723b803000000000017a914f49b313031576ab50b45233962e4afc84b361d6287c05c15000000000017a9145c707c710326720c6cad49d154221580cb05980087c05c15000000000017a9145c9f16ff55128b31727f4ced9250959ee6833aa88702483045022100b5c95ab37fd4e412aba90583764bafe2d70f3b8dfa652874fcea0b81d72e01c40220415ede3070517ac51d1096578dd7719d8d708ee8b424e75b01cf7a73a07f211c01210280b75879ca388206f6397c53cf65b065c3898a87885d74dc26361a4badde3c3802483045022100cadd4d6913439742f9045355adf034eea102eb94fcc40c9aa8e47238d162e12d022019f1b07e072e82e6e702ca4f02ddf95123c525129d67133a652900374ec958610121023bf88fa8f38c039e9f35dee896d083d9d74d5bc975e9e339a5228b55538246ce024730440220209cdba37a6f8ffe550d01fdc72c96118a8705666ce583796466374bb4d689720220297087d5f98c321bf91f450a2e78d16164cda0dd7b27d88fd1e96523337005720121031d3eda1b16d6ec9f9c56be3f8d66904b8c1d26db06a1b7c239867e899964e40f02483045022100a79e85906f9ad39efe9e161945ee38615e75561e176401c377e94d8ad2dca9a302201300db6f75ab96186dcf3a75d29b370316a608372a25497ab47f77caadb402640121025a3bc25dfd37266dbc9b1c87279f8e3feadd6e3af4993f4515d304e87f51a0f002483045022100e380a0831edc5b142175dbfdf7815de3d399c26294fd577d93a4b8c1dbb0b0380220495e3cf3092bee2672b273ca661be6e5b8742596f615315635cf5e82617c2fd701210338134d72d1de7f14882c4d4d7ed53f59c77b1b0479c7707bed3f13f5358fb5740000000001000000000101df9d0dbd2b07298be7d55d55bc5ceb47e0293e005a42a3985da702d1a8fe1b520000000000ffffffff0130560205000000001976a914f4739d8b07133e766a0d64baf2a07bd44e91ffe188ac0248304502210091eedbb89a504a61bbed209f8f43a84bd179d97a6ab09a66f87b20cab52dcc9302206988576954a663b84c4256a3ab923fa24d79f9e7ec1eecffe9e7cad6db2cf32201210251ee213b8f7890a7e4befeffdc7c45d28ec0144e445622a858f81cd477d36bec00000000010000000001013dbbc903ab9748ed4f544e1c2e2b1f7dc60c39a6f57de942770920a7272064660d000000000000000001bf070600000000001976a9140ccead47ebaec31b35f648ab468b0950e9459cd888ac02473044022011ec48da4368b0ba6d4b4d9aa041769fb7a22954c35288a8786b07d3870dd3a302207f5cd7cd2a74618a57e4f081ac13d3d2e559a5dad0db674999faa34acb5d9ec101210205c1484e47043049d8a74d769cab929280e0659e7bdf657e9666ecf85b31128e000000000100000000010123e282344cf88a82b25fd69b98f8d675541dcaafab34b0ced349211fb12fc0ea0000000000ffffffff0103930600000000001976a914c76c98544c7644c1ac12baae6059d4a622d2469988ac02473044022031513dd3a5f6e6469280051fe535f9e6b73c5a2379a865c4bdd1d6b450991c3e0220788c86f5ff7aaaaf5d8b2c3f9b08547b1149a5050a6b3df991873ef4bde221bc0121026fd234daa5a2a5dc5135701108b90110ffe33b6ccd12696c4963e9c03df6dc71000000000100000000010183f048db759ea87d9f3f6b50c9f1c88f423a1a78aee576a3429e327fe2a5b3c21e00000000ffffffff01b4b606000000000017a914a825a503ebd3eb2a987c92b32a0649e171818cdb8702483045022100e4199989f4540ceb7adbc71ea0d6d48a6500d6177f202b230b4ff488d059a22102206436e2db9d851ae570080b203f59ac08f140c91b9580d1a28b4f57369894a19d0121027c28a4bed79b032cb01d91f09abe4c8cba5aab7b92b123235b8436614dee68d300000000010000000001012c4ee94e86e5a6e3d18efdf978acdaca3fd68b611c152bf19326df3f9cef35be0100000000ffffffff02985801000000000017a91426e7d472fbc6d68ba26d5c2ed073d6589843488d873c410000000000001600148a218310a155c3f7a1b12ae6839afa623b365c82024730440220696adfe989db01ca2b96a64802c964af32ccfb8b21d9dc7d6acd4a98b5500c3002207b34af72d79941e8b8f95a1c246cbe4520ffc564f93f34839e9b32a2c819a628012103e28701fd1051bf66005142ae1a8c17b93f7862c91107fe83ad40da33a341b09f0000000001000000000101212fe74947c9bc0a0ea70434a35704889125541b78cf04189fa909031292f6940000000000ffffffff02b82c120000000000220020f8732548a888a9ca62a634c26ff1a24152cbb69b6a5673b735a2c0334546112c505f03000000000017a914774fd440523aae4a5aa5b94e1cc7c44b736bcc0e870400473044022032d0b6fcd6dfe1d48120848023e15dfe78519941f99db07fc8e96989e62171ae02204e0013682443cc2462a2ee093a8802eddf3ea98d54072ba7d7d678b8a6b7b211014730440220636369e801b313ef6030ccd9ad1bbdcc11986844f46595e032d1f6fa8118ddb50220659a51fb6334fbc93e7d197c4318301f412bb54632bb2449add402a1f50cde4a0147522102c2bfbaf52c66e1e7d5c1ff48b5f13c03bc0d5542b0fa3940efbd000018cd944c210203a2aab0b2d795c25e906042983eec460e4658f7d36a632c1d3697bc91c59e5e52ae0000000001000000000102c693b5e76196256be229c89d0fb06b79740790b8bfa1e1221e17b165979fc4870100000000ffffffffd41f166ada8083576894c0d2fa0640d29b2bed1a02416a2c8bdbd5cc57c426300200000000ffffffff0283760100000000001976a9149ea91d7e1c4da964052048fc701ff7bdde1948a088ac6c80280000000000220020123dd2725ffb736797aff6308e5cc93903fb8f9675ce936af71d41c389daec3e040047304402204f5c83abedc0807ca1b20362e8bfae8cfe2aac2a4f265467b7d705e0f736a93c0220417dfab1ecdf00fbffd81d8dab6500dacdfc69d45d2b361c5f9b789f5c7cec1b014730440220403ed8c2b79647c5ff06aa25d89f6687700d529ce4f9d67328e6dd264ea86100022041a6cf3d0ba317600b53ba5f2f8c629b8b9a39f3abd66edef0da8df359919b6c0147522103b22f6b7cb2f12e0aba5eb36d2f71bf69533616a6bf923092e8a390cff15c46c021029009039142b4de669fe67507bb3a6b17ff38f7798ae4d7bb3826a3cc2527d62252ae0400473044022058014e57ad677b0fef85c6dba3cbd2d536752c6feaacd0694d3be100f16f61e002202241eb355fb1931a498a5f371851026a92775727b6071395a9fb31c1437ea488014730440220382c3e47ba636d4d3bd100afd3d2e2e541f992eaade520de18eea082ea5f6f7f02206c9278edb31df8a19197c92635d195b1fc7f499e2af74cd3d25995a3b3f2f3870147522103b22f6b7cb2f12e0aba5eb36d2f71bf69533616a6bf923092e8a390cff15c46c021029009039142b4de669fe67507bb3a6b17ff38f7798ae4d7bb3826a3cc2527d62252ae00000000010000000001018551202fcc8826c35c89c05212cdfa4cb29c2556a190d818b400c43fc5f5b9e70100000000ffffffff02340d0100000000001976a9143aef9806ae0e04565933611ef139e1f54645795988acf86c270000000000220020123dd2725ffb736797aff6308e5cc93903fb8f9675ce936af71d41c389daec3e040047304402204082baec8adc250ca5b7f7d6a3c70583f5517523d909b4b5206934b44f91103802206272add273cd18e825d9af689ee1b22a3f1ea4ef702e284f5788d27ad8ef7532014730440220488d32590006d48661ae73278b64ab990a391f74f7c3069cba4e5eb3eec4edaa0220301ab897114f4b5d45b4be9da4c6a08ceae43faf49892a05c1cee01d339eb7700147522103b22f6b7cb2f12e0aba5eb36d2f71bf69533616a6bf923092e8a390cff15c46c021029009039142b4de669fe67507bb3a6b17ff38f7798ae4d7bb3826a3cc2527d62252ae00000000020000000001015841987bb5c6a7203c16305eab3b108c5f75266679d057d509385b15c3045d850200000017160014a6be0f2256c54879619e53fd6b444293bc5e3f93fdffffff03381012000000000017a91423c30ad3e1b290e1c806d88fc087f1e517d4da2587b62e00000000000017a914cb142c9d596930c1e8511c8c55c6ef8fc34a301b87535602000000000017a9145c7e2a200ae46ecc55fe03fb164a0f5e7a4ff522870247304402202d0c05f104abafc8db6a8752c3eabaae7858ce80dc8554487677278a49bfb1f802204a3052a2d57c1f6561f391ec6db5d52ba0608a48240e1e25d2adea1d8d42c7e101210298d9a8432becd032cafd4005fd146313ab5443d78c42f0b2b1706d2601ed57f10000000002000000000103dbd7dc621bde8e539f4cb796e948de11600ccdb894ce0df03d887815df5286c1000000001716001407aac19d7215270ee0c5564727ebae1922e89561fdffffffda76d565288ac7c175dc27b6089c2c4790e502f913f292d16ed2a1cbdb78fecf0200000017160014f1778554dc4ce35e3e31c8fff5ca54e4640bab0cfdffffff93621d8479f20ea948040dadf5c0ef10efcf91af1a48eacdfd3c2d8c802296b202000000171600142c337d23c4af2082f87965107f7ce49ace56b4e2fdffffff0260b74700000000001976a914615a36e12d98662960dab08759cd86d4adff728e88ac74f401000000000017a91406fb5ba0e74b3bb9706aa20bc5f360e1a519c4bf87024730440220113e1d8324ccfa715ffdd6f55aac549ac5316c421c9127016f701259b203827c0220764284ab070c5d4dbe52541d6a7939cc1977faf0ac696e3e20c86051ba364cd8012103f766b641d872aa0d4051809e07d6db384e1e0808810a4d65bbeef614bd3052b90248304502210084bf4bb19156caca8c0e95a7a460b6c25be63d9427d63edad0bae8455b96bfe0022011e9eb09b531e61cf54b85972ff6e4802b1f44b86f2d14708d2cebb33bf94ab5012103a9c9be339633b43ec9250f1a10a6f28ab344d8bc8faf6510a91cb25b68fe0b2b02473044022006fdc39f3b0e70d9a932ae6b1eaaf85c2baa3bbf22793619da4af0f3c73ad3ca02201b5aea57b063c5e4c3c91ea8708cc7036b408ef6f904c0e1612e9831a2eeff1c012103050aed79a7805174e0a400787dbab864f2bf94e9b6e3b8d59ef0d85f0b44cdfb00000000010000000001011e3983a4a8330bf351961d255c23389882fcfdc947ce0270c16e12cde40515e2010000001716001466aeb7199d120dd55288b950c263b63d47049a050000000001c6fe1b00000000001976a914c829fdb878855511f3bafb2ae012f5cbc1426d5788ac02483045022100b560b1f3d5ae4b701636577f3f89a8bb74296134aeff9f175cd0aeb702dcd49b02203250d7fb0b8be51ff0c4ab1c86638358fec712d5da5a0ae1044c38c2426f7bb80121030edf1c72d9ceac617c794ae658006d38b9ae2156ab66a13a78a38dea5a17ae85000000000100000000010108ed4ab01d01ca423da4453bd65250120cadab5cf9ba7f73e290834dfca1f52508000000171600144847a95619218b443f34bd9189df697fcc201acdffffffff016be31a00000000001976a91493aae5fd6dff7d10e7566051ecff74f2492ec2e688ac0248304502210094ed03d7363574eb357b9d7dc6b9cebf7395aec4029b683d02cb4137b4eeab960220353775fd94826c937f5e68d08e3db377cfbf2cb5b3cb93388aa2230845bfd844012102b2817c49bcae549e3af8cc336332c06c14d59592072bc0707e579c879e6431d90000000001000000000101333305ece052b75df28338fb8da05bc33fcbcd9cf9a4d61663d6ec624741798d0100000000ffffffff02f42f0900000000001600144fcce656f6d2893490d03129604a87304d6ca43359ac00000000000017a914a975a5b685293553fda0a6daff7fe502664777e987024830450221009b137458828c620f8e846ece071a4273f5b78931ed74ae22c4f36ec339af2fb3022031d26192c36bd1c635d5a416888a940d594e024c980672b8ea7dabfb93841d5d01210355c69b2727dcc7cf7cca04eaed60ffb82d2ba5a2c152ce4ce5c4b45d37038137000000000100000000010154dc9ea561d451620b9e8ca500bda3d358526484aec6e2dd54fc1b70e2258ba40000000000ffffffff02a21c000000000000220020e293a1371bbc82a009dd3ea44f61de5c50ee64144b0150081b0858dab91f7cbaa0200b000000000017a91473c9a5517c2fbddb1fd95e1b9313c79713a949ae8704004830450221008605c68492a86363eee34d6f6b3c06986493102a10365ab07e751cc1c836fc3802205a6b94df573e6e8ebde7734f804e710ab054222642758cf31d9ff3ded794220e0147304402204120845ec1429f0b709aecd2ac882f726041df0c621c85fd6347b044e6e64c2e02204b0f31f918a1dee052f66e562391a51597faccb22c55841684dab970be85f8b8014752210227b39d0ab5578f8145f49abfd5ed90f96bb838030b287a4ddcb6b2e4a574ef1f2102ced8a2dfca0a41fd8843176b023118c0d9598ed92a07e5f6118b92b7570046e952ae00000000020000000001053c226508f72d99c39f0f707bfd39af9f75ee6c57fa75e59f0ac8868af7a3a6410000000017160014765af88e4de81cd5378285abcdaad54aab5e5126fdffffffe1fcad43e821d75124652c3c69530c228f019c9f97ef7786a1cc223738f8f3b2000000001716001431e8e0e5b52d4c857b361b48517a72612292a2f4fdffffff93e213c7d3ed918acd9f8699241588c96478aeba4de99808abebce635a9295c20100000023220020394e280c0ec0bafc580060a6a549920301715bb2ce639407b1a8b7c7089207c2fdfffffff2483aec11c949dadd493b2d54a705b30cbce456cebaa630eb81db92b35387ee0200000017160014bffe7c037daa75c1efd2a4b7c61e610eabc7bd3bfdffffff71669f9afef5e84b5b52874b61d579411c1f1d8e59c43ddcf187be112db6370702000000171600146a56150c4d3dfdcbfc962852efbf5e55c1826164fdffffff0308f222010000000017a9140da87c452324aa4c63f75aec0d1f994296f7c4688758f002000000000017a9145d2cd82439e56c486a26d17b43c267284a23cfbb87024800000000000017a9146f9f0c92b6e3c763e0a033761260dcc58e6138f48702483045022100ff82e1617f8ba3a5c4cadb208a6067c81914f9c6538854a980666f9d4bf88164022027b3f7ecc2b03955ab20be9f1423a87ec6efaa1027dcdce8d7e89caacd346b430121033dc9945fcd548491eee1275ea8f991ed42b6db0384bd11e4d9741b92630642a702473044022100cad8ebef1f6c4fc309ec85bdd9a9d52aab0e5f16b2f465cf2dbb6ab4c596b671021f2e95117e6349911f5d403e0059a5668deac9fc46ed99042a6c41b6768327ef012103568747cdeff3afb4bca98c6029e10f84a12a817694b9fa957bae461cbd28b26505483045022100e3b7c488a3c6288b6ae9c1cd5ab47e276c4dde79ba280a3aace86ab1c47bc65602206592780a59d2d690d7727d5a3b45a1736876db3b411fc7da08dbfb37914697dd0121023c3ccb23fd9ac36961efd7f19b723f4799b52352068b3a0a2b76f1ef1f2a3cac206d4661dbb57123da568ea82687403688525137559e8c42bd72999e26299dcc930104877653876375a9149bbd96e8b27f5f95d7ec71c3402121db4d20372d8876a914eab5071e8ac7302d6a54078658452f236a0c230d88ac677654876375a914a2226abb8c2f5bb5e7925e58519d919639d4f4548876a914eab5071e8ac7302d6a54078658452f236a0c230d88ac6776a914b21593335313b125c5abf055e92ce0048ed25c0a88ac686802483045022100871daf72151e244ea44ef25508c28ca4924e8119122b193515e70d6b614e46b9022056356057a7c27c870d593c73bb9064143a46b586f0a72ace507191f9d5bcd0a80121029e3b35a480a798e10a3d996975987bdfdfc6f0d3a0067fa287b5fc18125cb47b024730440220307063ef8bb49a5560adb168de801a3a9247b338591ae2b2f20c50b1f7f03d00022033952ecff15642c3cd41796de49e689d26670cd6be9e44671de85e7aa6548ef60121037882fa002e7fe3568a882dab518ece426ef018afba9200295aeb33da24c9f6ca0000000002000000018366022761fb2490f65bfd355bb4885e90851480c5da6b71ae7488884af3438d010000006b483045022100a70872b1f7e761b5d3aabd19a8231ccbf1c70cb43bc48eca7eaef0b612a3ae3a02205a478b39f5aa3fc44b418d451c88a56624a8705ad09f63d9eb37c0ce89b0222b0121023205c9822b8da45e2f81ae44c2045c27fbd6a97fdd693848c5583440510061c6ffffffff02b35b0300000000001976a9145f367de1395d1722bd3c92fc139e8dd19e95bdc788acee461500000000001600143663739ae3e93a1c799f33f055b576f59b5545c0000000000200000000010207818e78d49ca72de37169897addd675870456688ee29ed2178959aecd9237180100000017160014722c913fa0fd2c77d84b7ea8a31f1590b36d13acffffffff35b388a4bc942c91343de6d5b22c1bfcb47b543e84f100b0bf26671496d139490f00000017160014e4e9e6e1cb0d5915ae0520ef67ca52d3a98a0aa1ffffffff025d4220000000000017a9148863ff7130a99b6c73fef9189d06dc6ca375c2a5874c1d960000000000160014787965fe076f692a4213e010c19e7e57e3f66f4c024730440220077b8c5a8d2d7101b932c58e3fce8bc766e0cb6eb5a79242e49237b4902f72e2022044bc791aea8b68219329995124efe861fd5b43136269bbf257ef7d04335d0705012102f16e7bc2d5f43c18c265f2d50a3c6380483521885e72a4166f23d1cdd55b3ccb0247304402202e3d06c66df53322f5a1e6d5ec9f1b0f36e7c197ce9eecf4d86b24e045088940022027de09a321d8951b01020783e31bd96f89cff7fed107cb0b74ac252b719257be012103e2a7aa4ec1205e4d4aaff4e74a44b85f95a74521768caa6b01ed2fcb7a73ca2400000000010000000001018861b998fa2a1bfa8052bbad2a43964504340beed0d9081905737328718ab4da000000000080e3ffff017a8a32000000000017a914a4e877140e727affe8948c984726c88496392abd870247304402207fbde0b826c4886737f7805f8e1e99d4770bf103f365ca66651631020347090002201392d4e8725dec85941732c92a0db88f970072a78ed5d3bf377a6bf41193598b012103bbb483ca5a05b5a63ba97f3c536d7b1f70a8050c7fa76c55b0e81979a8892ebd0000000002000000000101114ec9772eb38c237ccb0bb0760a529b0e268699ba9b4b06a51557edf4e2e53d0300000017160014b38f1461633a9ff97a42b579d4782a8f34e86659fdffffff03a94c020000000000160014be3e367692435e91e348ec0cca7bd7df68c074365d190a00000000001600148a4c30fc86534241db7aa987976fbab9eca537030e5993090000000017a91477c255f0bff6aaf692cd44d7703088fd9e62fbb6870247304402205f04fa7a3aab4df57a8681ec60609a3664afe2b9388f16664407374dccb8978502202d76eac90bc42cf6c6ed000c9e28e2fc96b738c84e515ce4520eab1e694e1327012102d1abbab06832837a346cc83764c79a500f1ed68a53f5c4f64a57474989965ac70000000001000000000101f12fd3c2476e8a0ddf43f3d1b5f45bcf89f17ddf5d8c9c85a923049d18fa9f5d0100000000ffffffff029eb1020000000000160014488de7dbe758e8a5dfc410ce2196c3a8e8ff82127125030000000000160014f1359c26443d5ee5cbbae3cd8ccc0ed66d6e1b370247304402204f80b909d3d27fdc323f179b520be734d97db209022c64d3ff617b6599d4b437022056148c5875fde672ba29557632f84018c79210dcaa772b8d92864b0e3a3c1a7301210214ea3970049d85640d9f99ad1a573552e0cf47b33060cb2133184638b50ae03a0000000002000000000101103b912f8099e43610b613e18c7257bbca1839f96f1dc6e543308b873659a6dc0000000000ffffffff01f82e0000000000001976a91428d3dec5c17d6f2c1e1035ca27712af65361e16988ac0247304402206563180005a2ae4691b6f8a7b5c813218d4616941652c0e64bf6d5655bea52bd022072ec6e33d218ca7ae7085cb34102e383ea2980e57eb509a8f5d1d584dcbb64ac012103d1fa669d05a791a983f59e80a88e4f77634950644438e926441896cff481b2e60000000001000000000101ed35476853019c4d64c42e886c368796ca26e465947b175e816db4131e5394cd1800000000ffffffff0ebc3300000000000017a914e52f3f1b3bd5779d33ac779d112d5fa6c312c45587145600000000000017a9141e505277a046a3d767d399d563d521480b463dc587d17c00000000000017a914b17a735414dd0091417c3f2ae191350d3fa29b9b870a8700000000000017a91462ea651f2326a7bc5650aff038dda5eb00f484dc87803a0100000000001976a91466e5eddf7e956621e24103dc452321066884501d88aca0860100000000001976a914bcb43a8c811b23a2bf11cbfbfea25b89ce6abe1188aca08601000000000017a91460e1b3c76bcb0914689c1a9335f7b4bd97a5352987b0ad01000000000016001434dfd7f9678e5d680d7bea325067c41616bee3c0b0ad0100000000001976a91410aad17593aaa5662fd568ebc38624278932182e88ac18130a000000000017a914cc7f13def9845f45b412d1be76662b375089d5ec87ff7712000000000017a91436bc4484325171095121efdce55c4eccbb31620387f6601a00000000001976a914feb11f7df2f6ba10ffb62fda8cf32c9fd3bf27f488acaa641a00000000001976a914dd4c2a38728529a5f529f22d2ab75234a0f2353288acb037fd00000000002200200235f4a4e1db3c45a5bd3962a3abbc6e319ea58b4a3f9a2083c9b4d0893d512d0400483045022100d226d65900a8948de36fa2fd646df6739348d64d744bde16f524a16c24daf37602202281836cb53f33782e53c111c02b0faca07c3471613212d238fb663fa75d02540147304402206b5c48b2b2b0831b1d2a3156bd15076752abe3713a70eaf8085f7e176cc07bfe022042b14cb799c14cf45a4675aa52b86e24510099b1a686d1bc0cbdcd5e0fecfadc0169522103d6867b7ff679b9775ad894e72d3120728dafc97857e1bda2b8607fc7e833f34c2102fddec2d769aa1ab6274ab01b1378a579693bd774b5ca375bf10550cd8329af19210210bf171ecc7b53ab6decf64326faee6523d85144eea821fd6cc8b762cd6e963753ae48a00a0002000000018fc8bb84583516b11ab1bd9fb66ef0d6322373be4a8a3f890709974d7632004f010000006a47304402206a709eec6ee778be507961d121e01a703c80dd49d1f8833700e7a87d93c857a002206c70e7e25aa687fd6082fad2796769b6ce3b57897b43e1b75e158547d74e835c012103e7cf92f0643dd6fe7e4cc6a88e3d90d4f03104b25d438727ff9bf49732a75250ffffffff028c386d00000000001976a914c01115ace4ac58314a336cd249f66dc361fff2ee88ac747db728000000001976a9141e92ee6c301ed0c3fdf49ca56d7fa20c8e04143688ac00000000010000000001010c105463f685ba482f47a4497e239dbaca39569f8c7d5e8b7f2a4a0e2753bb950000000000ffffffff028fcd0800000000001976a914653bb8726f364ef87aab912588a68701f9bee9ee88ac70b8e70000000000160014bd7e1651e57920536cbad0600b597ee84a76056a0247304402202a45dd79b83f63ee68a09a17fa748ad3ce9b6a83e8ec3ffb0f41066f80742b430220013447b34ac7fbb72f0129e76dd4c7468e4159e82fb809652289f9b7ae5de1be012102d678828f8abf45a451a6da4216f61217efde2d4f21528eeeda84b0ea051597880000000001000000000101a620db560dde3679da09f3b7c5d436328525841190fc7bd2cd9ca4578d0cd8860000000000ffffffff0232310900000000001976a9142e393a91340a5866ea76afe0d38a741d3d63d86888ac5c335c0000000000160014797f50391dd2433f8b3238feb7643dbfa73298b1024730440220588246533152262fbabab78cc4bb9ce342023098ee5eadea1bb1bb35b8e6925e02205db9f638449e13a24f2f7dfcd38e20c9d5490144c27ccdaaa5509f1f120fd16401210217df3489e0842d3788bb0796640d599e4f39717297c7c61a60e8320dea01b61d0000000001000000000101a9d035b4ba675555b617b05d916255018007dd62f4b0a506ea3da2d1220e91870400000000ffffffff010232100000000000160014db3ea46bf8ee2ce35bfef58a91be9556da23591402483045022100f18d720499a4275a6dc8cb42f4ffcd7a38c0d5e5d1718d52f4d5f84e38200c0b02206d0e7e408c89d9d65987acadc1642f05ed0fb28bce3ff280c7401dfe1134404e01210205f85e56e48f23ba5e6d996c5a92c040450ec118d3314cbf002538c4646a0ba40000000001000000000101cf37d95e3929ce508625a7eaee55a7c1f8be2b3dbef1a5e16743f25e5c7ded9b0500000000ffffffff01b97b040000000000160014d52f6171d954680bced33290c3e924c1dcfa1783024730440220379120d02e30a0b9249f025c50f2f1713c7a7b21a804fc12f54732e3dce74caf02202c57195a12a22901242e0178a9eeb43ad5033b8ac98d3b7be7ddbe8ef6e75a86012102b3379d1ba97a3d0f3fdd3132dd036c6cbdd1f8068c7b128c23b0e87032f5525f0000000001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70d00000000ffffffff013fea1c00000000001600149751904b8c628362af6040ff05ac0711c0e4e71e04004730440220270a9e78bab8affbbd2842fc606b30e76db5fbaaa7f0ab164a51fb589ec7d0e9022026797276638dc3baeff33d653cb354e04b83652a5d13e53baeb64cb959c00b34014730440220632a5de4858b7f3d4cff4203cee0f28e63dd2dc2791eea6378e1d365a428fe2c0220061bd07913b50924a85c5790672e071331dce3ea95f0ab2842990c7bf24cf6560169522103995fa374bf570e4518ff4a5e8c34760a9f2034e4abeac5ee4c37aa2ddd7763c52103ad4709bb9525c33c6e9c24bd1c12902a32a93c032e04a3ff606d7dc94160da56210270d083d5cf97a5095283466f0e9e379f92db35d44f22ee676234480a0dfcc53e53ae48a00a00020000000001019b99e6d7528c514c1a950d096b1fa58b8bcab8f6f2355f11b308d6a958459bac0000000000ffffffff02e71609000000000017a914ee70c8c6cd046201688e14d730b13d617a67c01f877ccf1300000000001600141fd53672790d51e8037562234e88c401762fdf7d0247304402201bc8b6b1e47516418b3f5acaf6d82754cd2cebe9860ab2bdb36c70db4a152ada0220471331642e5ea9ead0968bb4c1340750b433e299aee5d8a332c59aea3214e169012103477932e4642c2c23a421ee6880385a0ad5e228d58aa7ad4ba3cf35eab7b1efae000000000200000000010133b42788d5d4250c06db0a84f9b29fe389aaf2a864874fe88730691613b157db0100000000ffffffff0292670000000000001600141fd53672790d51e8037562234e88c401762fdf7d0e6413000000000017a914ee70c8c6cd046201688e14d730b13d617a67c01f870247304402207d8ee44226d8649848129b22c65c32726a0115215462c96156bb6d7578e2099f02201dd13e5e486fddee57bfeb075d73b87039370ca47740284edc723c2a61cadbfb012102456958aa617b6848f3a1cafc436e81f79e0c98dd6a52b7a018fe024106b9948e000000000100000000010100eeede39ee0612a6570f405d36c29a890560df49eff0922a29422ff7be8a5f7000000001716001412143b087040a52e2fbfe67a2b16ecd1f4042524ffffffff01c20a00000000000017a91458878a6f54991c5164dc8837a8a5adf1d25ae3df870247304402207bb60fe4617e93dc0db7426423651508d6cd110b55eb6558b5dc1b90c6046e0702207615d902f4f76e53578aeec495d3ffde016cf35a0f2cee2647302ec1ff14bcfc012103d717e049fc7bbb504d14ac0d157c88c59449dc71d042b979501648a473f0fa87000000000100000000010160dc868a8488ddeeec47c94054e6df82df7386313aee856bca0b5d2371d5198300000000171600141bd7be13cbf61dda3f2bc7b262e3f86e0995bef0ffffffff01320700000000000017a9149f62fc4b99c4b54d4e0ca8504fdf8100c2ee9aa28702483045022100a430247a9028ebe146be4d4c097a3cdff5e0fd5d3dc4f596123b5ce47da65e5b022024300179c4ef0a1430a05c6d01ced7b88f18b6a3c6be2c05cd837b0276c622b601210204376b92f4221215605d1e77c142d300a3ad6b0aef6375c5ff55d9ddecdf4e53000000000100000000010106a8c6b395d27464fa97b04eca69e2995d9e1b9188a44ed52b4c8ab7273090a50100000000ffffffff02aa600100000000001976a91467601adf17a8eef52696a037bf694463d103f6d888ac809c12000000000016001406df20f5a473de48649da516e511f712627c013302483045022100e7f04e5f56544911425a9e78b45d368aba8e3bb0d78cb7a272c4d3c4630a1b3702202ece0d9bdc579b18c3e862eec0cb89e8b7bed10048c69d1a95a3a1b108cf476b01210354c4c774104860af621aaf44b897b34a54ea55f2d21aceb53b19ff1bf66815150000000002000000000101afc89e5324cb8724c92173a34b7d92e47d2b9f56609fd80243148ece3d3fa8610000000000ffffffff02f582010000000000160014342251f650c223fe891f676f834270b78989f1fa44d6230000000000160014bc3ea58d2a93e2063383010558d51997a39e62ee0247304402203b360f4f6d07c4aabfdd2d839e224076d3c712eb7152c8f1eb147a718219467802202769f0d9ed37a582b31aeda706343c7d2e5276f6813719c0b7e533908221f8e3012102536f93df4fab89b7ea99a676f84fa9752fb1238bade5e0a60962d75cab6860f00000000002000000000101af724fb1cb9d748bdd7fdee326be2b6b81d6358e0778cf6f6dbc717ab80a25c30100000000ffffffff02f6aa0f000000000016001447154a7734e059d6c5fd5f23bf30ba8f302a0a2a722714000000000017a914047dd493a418135cd9796705ba8dbd19393519cc87024730440220202e99bf7bd524b26a712043d948f68946f254422ae83455d58a2cb79d62c9f3022022e926299894dda0380701e8960fce6827a2584473e41f4c662818f9b0c5a24301210298bd51e561ecf2a75f165581fd54dbd92a355958bbe17cf2fb8cd3008b5a2b920000000002000000000101822f1618141b0e4fa323e619c52edc88adf605c7a3c9dfb9c80db129701b086b0000000000ffffffff02f90101000000000017a91408b82ca43b0dfdf71b2f906dcf601f3cd8d4521087b3a40e0000000000160014db5a301b02f2d526bf1bb0b54ba163907fdc42f802473044022035b06a4ad8081e223d747a27700ea09635abb10c9992bb4fa1ac57e76f34a3610220462326805c2f42b18c6b75ee026c2105d665b5c99a9d38b5ac6c42b7532e8014012103bc04f62cb60861346c35d54fa64b51ad9d17bbab46470f4c0a3b73d229f16f6e00000000020000000001010e5aadd40efc0dd590bec855d6d4c8f114d13e08484a577c734770227d185e3e0100000000ffffffff02e40704000000000017a914d6e10b346030bd26fe31c78ba066c2ddeea4ee238717980a000000000016001426cef4b960a38d8895de0ff95a0321064ba97661024730440220268fe36e9d3461c6b15a62cdd9c0ccd02bc37154282067e679eeb2996c1cc17502201b213bc120d79d113f1fbb4efeec8784c697a935274b125cd19bdf79ae3ee493012102fca79d66b7653f27351cde5ea9ee5561345aaadb8ae902a36b4e587dbbd0f38500000000020000000001017e84f0fdef792b94c9ba84bd2b24b6ae49240e088c9b0fb91daabcefd318dc550100000000ffffffff02ac860000000000001600145c994784b82ee18c62e2d9f5867cd1c18d951758be0c0a000000000016001441f83b8bbc856cba28b7a7e5c51d293c3803f9960247304402206b0f5ea015a2afcad220f9b2b69e81c952a5168bba91a1845672ecac5e95dd24022015210e88cf91d35dfafa761c81f0ddb7713f6c1a330cc2fef12483749e41d627012102e377d9b3e460ea127f8be4c9d7621a603a6667c952e5396156bb63fad737fd08000000000100000000010109912d5f0a8fbdbcca5de2b011b6157386cce32688518a89f9ef88f26726ec280000000000ffffffff0221ed1a000000000016001411a1b9eb1f532c06cc9bff94d49c28b49c5200f1d08b0300000000001600141d9b3b31867ec2942ad5a2772882a94873f5639e02473044022074b9b40f876a6ac3fcf6cb5ccfc626b8c42c267313fa504adbc6b8a5cc8c8c93022041cb16a666a47d6171269159df8f93d6c1292e003f152f88d1861d0d192d5931012103ce0eefaaaf888acfbc244e195835a1aa016ff75973f1f99a715042bb0f514a5c000000000200000001aeaf2443bcc014ea211a41597e044f8bc9fde653fd0bcace40073dcc80008128010000006a473044022040b21e91a7dcdbe359aad3e99b4c5e44f1828cad0f350825fb05683fb783d8eb022021ea7cdb51304998ae1ae87a8c9b6d8a01077ecadc0a5e3a0dbb34fa7d7882470121032b723e22574ab54ca1987100c5684ad4b701cd60ca13f1ce2233e2a840862c81fdffffff01f9830400000000001976a91446569347d092f0c20fafc09e241231657dc555c688ac48a00a00010000000001011971fccd92dca708605bc8e41995cdb869bffeb33e1b8368bf5c50fc4e67ff8e0000000000ffffffff0208070000000000001600141f3953ef606cea7c48376328e6f1e9887f18df459a6e0300000000001976a9140f81600d6f8a7caad8fddeb02582dabca1178b1088ac0247304402207595486ed8f93551a354ef030a452d3a5f51c43d3c8c6f3d0e08defee9a2df1902207903b71048aa47834c0f80f783f8007154c7966f734b9ce66db9033c5f6bdbf401210209174317a577a4287bff33457b435130667924e9adb641bba63c39aeb9572d990000000001000000000101a60734f89988719f6f6236f0a3394ae8094c9d666cc32329bb4ca33ef063de0d1b000000171600149859dce5947032a147c49c23aa170edb4bd1f1e2ffffffff0117bd03000000000017a914c385195ff18b431a0beccaa9d4be247005f09ccf8702483045022100efd661c9f108f744157f5b5e2530ca7dd72bc104e2975251885b079ab2c8abc102203a6497691d02b99118b1081b9b261a1d9666223e4243246910f2894dc05d14460121038ad845637cd3e54be480ad526826eaa37ef2f1c89f45106b9a90c8b8884baaed000000000100000000010136be906215373f1beb1158e8193b8b0e42e44ef9e98c40165857ff6d923afb100100000000ffffffff02ed6400000000000017a914e4e25229863831eb368599eb46e081c6a21b7ffe87d8400000000000001600140cd9ae4f769522fb904ff45bd2cc63107ee4e3bd0248304502210092517bded9b2677cbb5fead4c2a1537bceb7e86910bbfdb3bbf94796671864c502203a9b9b3b005aed96c02b52b298cb00a69c73dcb3577a97890804e419a7265e9001210240caf609a05c44299f7c6c3085ce11c5398563a5484085e20eba1c669f5ba7a2000000000200000000010289bd9da2030c6cc4dc721352188fbb5de016bca81edab90706400b3e74fa49e90100000000ffffffff6b5291da5cef3336bfd8d8068d57588a2610195800876deccbc3c2f72d5430220100000000ffffffff02a89f2100000000001976a914a11427eff4d999c3f3820480f4e1cfdb60b6ac0388acd9281300000000001600142c6dc02dcffbbd519b2a8d973a28795d5eb0519f02483045022100f6011628927a8c87941d77db6c3d8731cdf07d57df83a36a65950ebe568a0369022050b6df946d936cc05edc471548108173c5d01f5a3cf1a1c544d326db2c20921501210229c4830cc8c55f7b204916352744a3bce6fdeaf1d3b32ff7e4ff464ced59d55702483045022100e11f9263c7259e7b1226cfd73bd0d7dacba52dc2eef70270711dacb65cf775c502200174ef1d41ef9345c1f8e47faeeb7f47d46e59f99eccb6b8a4256ea1a9cd6121012103e184bededc549bb51fa0fbb7872b05875674f27a37b36860ff6dc18e07123c1e00000000020000000001023fff17a0454b461a5b75fb42d8929c47beb9f2f98778da1efc9ada21d97114130100000000ffffffff1e561b4c68aa5160b60fd295ced782c398ec891a8ae54716b3eb5666a7bb7e3d1700000000ffffffff021119000000000000160014a6dd2190e5868b61c83ebcddf1eb2dedcec4d73cd9beeb00000000001976a9144995013d8f0a6d91d519f53bc4f9516cd21f764588ac02483045022100ac8bc16489050907853b88c16e35fb800efbf322356e8ca1a11c13f16f802105022061f92cf577c80a09552dc4f61dd51b4274506837f9fbaa13749d7f5934ab62180121036ad4c84ed6bab352e227836b1be4010c9f06b2600f9dd0bc2d835c6fa1cb5f1502473044022058f428550070abfcdbb0f5829f3af1a46deed807cacac2429f92691aa905050c022034c0532bfcc16443f30f6d8fd74e9802c0ea457b353d4bd35dc6a734efe2f5c7012102d4fa27f3b4d4114432a7e98df6566460ff64d7eddf8fb4a2ee82b3ef53785b480000000002000000000102d1af901b868567993b4910c6a911ae6d6deedc094184f412ff8284aa119d41070000000017160014ee71a52840b2786a4348c44d02b8e31b1ea8948efdffffff3994cbfe135b71c00b67e2bd1206b5dc9eac261036abb67c54430071cad12db3000000001716001486a779924ab80e3d0fb7e0f96c92f65e5ecf907efdffffff016caa02000000000017a9141d6dde9c855f511ee0793fc402516378afec95788702473044022046753ddcd5377d4798f605c18035fda544f770e0ae2d67a43fdff06e947f410e02207e149379b04f1163d219716c022cf668afe2371a5907aa1ba4699ebded973149012103888bce1ea4fa525c5e1497c04cb15c3b5f8ac21b4cc5af00479406e0eef355ab024730440220213ec7ee990ec43d768f667ee43d6221fc2ba2f4d87efc0607179ec0a2611c2c02200ddab149d3290e0e34664ff0c15aff0a2ed37c5f4a547a7144a4aa1bbf61d145012102312b43428552fdd553ed4154838de44a3e8c25db53e7c297a201e2c5a89e0e3118a00a0001000000000101bf8f0cb9a096e90b3965c63005e04f3a65af95b2146db4eb7b48ae22f4fc711c0100000023220020590495b4e59f1537e2ed2b69bad29e055ea18b55bb27de0bbeb730484391a9f4fdffffff0200093d00000000001976a9147f48d45523cb43fc87b792ee935b5cb06bc5765d88ac89c91c2f0000000017a91421bea4f5e38e6af586a3902a5232d90fde505646870400473044022069c8ff39f551189a3fca0c14ba45ed09ff49ea5f3ba7b1a30e903d76804e528102200faa4cc21adf4b4644d516e8ee447d6c0c95bb8fa2db5ab852cb18172b3925940147304402204375f4a359fdcf762558ba004d82e0fdc6c1f2008968e0fa33427910bf8d65080220169df3033dd34872ca9e61003830550a227506b8d65e876e2eb4f422bd6c4ef3018b5221020878f0382c50a5410b9e7ec4eca7e8b0a67e7917315df5050627b4dae2bb12a42103de497bf18c10dc94dcc4f7602b6f73b11726f741437802dfe9dfd789df2b5f1e2103fa2cb0414c40f880e06b586f3d9659cebf03c1d5952f28232815b9cb1b19a44e2103fb853110dfb80507e11d09fb81f0dfaeed5f50ca3c6b565e034d072381c43c1454ae0000000001000000000103a430da21c1c32ffdfe8c700482adee0570f40eb35f38596cc6bd09ab965398280000000000feffffffb62eca49cd7a0a04ec8425755348b89b6f76bbb71c437ebaa5b83f8a4a4e4fcf0000000000feffffff0f0168775ee8d36a20c59ca851a0a531ee56fa9ad5a560013bfe0d63fe8ef69b0000000000feffffff020073018c000000001600140d6c1ba99c1be0785892a9619e6c4cc76bb64939cf3a4fa2000000001600140d6ffe888cbe98075c14298ef206bc04c4d657790247304402201898326d1bbf65bde96dd0f895dfb3b7deb7c969fc0dd11bd6c39627deb779d102204f420e62badb821fdf5bff3ebd54f1b0ff4307f2edeacdf2192071414489523001210239d891f78b2169150e7893cca8a3e1ed8038e6305bda7a2b2ce596239a69f7410247304402204384563e790c4070319997dbd84e84c500429a3cb7e382aebb8d1b55f9abd5e302201326c214d24c1876aa1f987404b103c4ded9ed23f7c40a14d904d01a213450a601210239d891f78b2169150e7893cca8a3e1ed8038e6305bda7a2b2ce596239a69f74102473044022069ce488e6bb754541dd7a0eebd4960d381a5858d81acb897004d56b3814fb08d022078c08fbf3b7145512f42be24664c9b1729a4deb2470027188a679794fd84799d01210239d891f78b2169150e7893cca8a3e1ed8038e6305bda7a2b2ce596239a69f74147a00a0001000000000101d3007134a4f53faa24cac2e1dd55ba06d7b8f6767c02176ec6319376a5ffd44a0000000000ffffffff029460ab030000000016001491b4b2f333c94fa59f54a06461ccfac61c1a9f77a08601000000000017a91495ca35c5a43c926d1676a265a68ef14fa333a591870247304402203f678a5b029ba2155144e0b6e7a13593225c69356d5238cdb5d42631e929922902207ef8baf763bd07c33a3deb84a7845dfd015c3862ce1a04d1261b51776aedbbaa0121026bdc0a65a1012f7b5c933f1202d25de2084a500631e10f6ef309065e54d8bd290000000001000000000101359550dc5ccf7dfdee6044e2f85a5f1a8b6db8b8d6d58dc0a12c0b8d57e856700000000000ffffffff021e7ead2600000000160014efa3052275561f84b12957543d9361e27d7c7b6300f153650000000017a91495ca35c5a43c926d1676a265a68ef14fa333a59187024730440220213e3af23e2aa2c18f0b74a9dd4b832ad30a82c40cbbd00981f75b9e786602100220552aebb57b6a5db250fb945e2251d5e42bff1467c4500b7b51301e2f7e33490e012103f3d0d3b5f2822165b53d38ed65e9ce70f8490fb9f5888a51f07f7f6df69c9829000000000100000000010fae1a757a4340665118dcf0c44816c426d7364cdf58f8461c396be23a1fa7a0320000000000ffffffffa4305b66577dc05fceb4c445c74a8588dc904dca1e82262031290f9ef9a16ca20100000000ffffffffff730dd2a685eea22f74ef62edd6ffefba37247e28938ad0c4274d4346666fce0000000000ffffffff4ed4f328684452b9c7f2711648a70eae4f16edd6bd2bd1f034414e7cfd9ce5a00000000000ffffffff4024321bac98a705966f6b8e6d093f1f583adf295f2a63a0abd1ea0a6202489c0000000000ffffffff7ca544919c6bf27e3bf17666f84c2f04fbe6b865107f8328da5754269ef53b2c0000000000ffffffff8043540b00af6119f7186a944bf48b4e20f61ca5d95e55b418d481657686b1e50000000000ffffffff66b505d7b22c27ffbc8ee813478e3a54cccd61883aa6d62c8e75fef61581d9390000000000ffffffff37094537c36cf41665cc8ff59f87c85fbeb48f3d4e3fd333e40eb68408fd64d10000000000fffffffff9d582694604c0cac4df07c162464d39defe2136fccab21298f3d4c4ffc4be1d0100000000ffffffffb71e90d45ff5fee98bd44e5108296b1c841b8108399a21942881bca7c533db1c0100000000ffffffff2ff3f3787f60737ef470f6b00049382b24ffdde80ce365223c366e9f9220c5f80100000000ffffffff40893e423b90cf439c2b5464ac9a92c42191a3cc60aed4c1f2ac38507436e26f0000000000ffffffff11b4635520fd898ae138099bf447215ab0cdafdd7a13b629bab5e2980dd2e49f0000000000ffffffff45c907eb9ba665fc634c07ec0b37442c4fc43d7fa0d6c1e0f8ebda4204f8d5cb0000000000ffffffff02c999c50d000000001600142e1e127c55c938f2785ddcb87a46b2c662beae6b00f15365000000001600144811392b3ef6099cb5c9ee1d1bcf2108c5c83bb202473044022027aba088f6868f3952efd8c098f7523be5122d8bc8a9265c023548096dd4179f02202040d37ca16fcb6248acbfeb1f71bebbdefa138ac48ac4726c557d56fbc58b960121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec024730440220494a8fb7e77f9eed6a855f90b199fa278dac82088a0ea627d217fcb79ce0ea36022050c66fbd1c1a05b8931a987e8aa9cddd8a1a77c43c5626c2f41330b55bb0d9cf012103f0f66dd983e5a780e0dcd444ea7961917eda9dc0e4a1677820d9444ccf382fc80247304402200b48c6707bb4021f4a48e6596ec062e536b9c467bbf319aeba6bdb8b10836a250220098b6d63dd39a63e1b0631b5fe4d7cb93c66a32adf86021c3153dfb8fba8e87a012103129bde81389eca500bd610f01054890fefd811010ebeed40b8877ae66414276402463043022030f311433e9c4628b1b3b4d9c4b1ab7a0b3f5afac5f534fbc740985c50cc6781021f28d9f35486c02a55c0d557c65d16b6a5cdb9adc761db1f5e5f2a59dd8b3f22012103ce00ca83f65b2f190a04d4e78efc35874ceb1fc624a20b27626e63698d25d9710247304402200ce31e0d6ab7fc776f64cc010e0ca9c13e1f7a428e347b0993edaa021d38670d022032f65c9b3dbcb2b88a80a4065bab6bed03da9a7373d6adcf974c7d27f406e2010121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec024730440220638458e31ad522c41d2d33e7826974f5e123a09adfc8f99a50d8cf4447bfdf830220704b6415d0b919b329a8fe509e5d25e38fd520ba4770936dd880cafc5670ce450121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec024730440220190938ce6b83e25e855eedd05495500a57ddd7ae94bc4d31628bf3916fb1161402202a7f175f6df54b98ddc9216d56bcbc6d9c104de0b0113d5f824bafa3467ba1d001210382409683219a8668a404b4c80a8facb97e453dcfb04aabed2a4d202959425ca80247304402200af6d747d8e845535b724619304af3652ff9f8927b967ebb29c06443e4115b5d0220524c9012de1c790b77549cafee135d7d59df56f3cd99b31e99f9b793dce7eee90121031a15e8e775f5fd97b77af185495865cd5040c10aa355b572a3de2bcf6add98ec0247304402200a60f01883219a31ab2b90d0017d63aa72db0a2b2075ac4146e608e5947c93b50220034f5300f54987cd7230a00e0d28ef45a4882a703a59f78c706e57f495636ef201210357cc6b846ed1c3681d55a60d290ec7713102da1c2336ebf96d49c66ea530adc802473044022033670a64060c73eb7408c5bb1a01364b9a50920fda8986583977b9c4ace509b602200ab8c6c33a7e188877826b4c4cc7fe698bb7982fc9f8c69cf6cc15636872edcc01210244f40fb690c670400643367dc7214f8ba4ac7dd915b4f5db6040df92120d8c2c0247304402204a73bf4f85f4a936b81b93d4824d2ce0b5fb84e82a9ce801c10956186793e9d902204fe2b510a47a48a3756caa469bb8d0bcd2a4e804ce2c6e996bc71637d390713501210357f0aa96f44e67ca47fb4cc84d1526a1a16277dc15874024e852303555c1f49d0247304402204a6692e7a28deee30626f656cb216ae9e10e45f1783cff67af5a4852f484dc5d02206605c84c492f1a8621c3aa21f870a16105bfc38f29351699f029add4280988db0121036686faa340ef4d3ebb9cb813df20447f43e43f856539561340371debb7dab5060247304402203abe19e3ceeef03aea2d4a0492204809a4286274d42fd1b0f7e0b7fba12860cd02201b3d0dd563a1382b6dabf3bc898e0f6a318f49f44cfba2b1597500114c45f3ec0121035dc268092f62c1c3a7198484d93c0904919c7c0fbbca86202a60793005fe9a62024730440220052582d1369018bd1b280b32c69bf5f811854465ae2e5e206fed580be6420ae302201057f7a404003b0830a4b57a6a1f5bcc0c3c1a39e1b36eba15fd62c48aa8591d012103129bde81389eca500bd610f01054890fefd811010ebeed40b8877ae6641427640247304402203ca700dbf1472d9d93c32b7f7523516b5191cf1ec3c17518cba4a87ea032b07c0220570fd4ffa8c8713e72a4cb89a518bba80d7516b9f1cb4a019c4e28a27d3fae54012103129bde81389eca500bd610f01054890fefd811010ebeed40b8877ae66414276400000000010000000001015235dacf6f8f826e6f5f17458f08a745e3e9c49085d90fbe607d5e22cfdf7a370000000000ffffffff01148718000000000016001477e6a1a77b3007d05acf0c621c9cec97a1320d38040047304402201709ee6d7c4427e83ae24543122812b69795f74fc6cbb3d182ff7558766a906b022062cc42b0426655b7331f461d6e7025c5a44174bc478c9d04b0ff6c4e8b5ed987014730440220755b59924fa22b59283a9025ebd12ee7a3de893f12c451eaae922e344cedded4022048b19c49f24dc1d32f638f02604fa3af25f208c9f0a7f8c8f093f668dd4d8e0001695221034966a228439da1d11a5b8428e9dcfbb285e76e6cb54f8febfee48db38c667c6f2102e69710863d421f5a8279aab5c57d188d71a755a39201bd60a2ef3815c5b399d62103c523bfb4e274a1c58fee282e3e5edbf1366a467f7acec107936e0978e298653253ae48a00a000200000000010279adaf062e3d19f3ef91d86634ea0e427b90b01358d81d5a29552727c5124b100100000000ffffffff0d64a140d86e7b5eb1b718c994d29865b2d93edcbee595798d827a8f41e2d60e0100000000ffffffff0210730d000000000017a914bafb2d7e4f86b395b3cf43105893acc8df3c123887d186090000000000160014ab0378f76d82880a348afd979a38b25ffe4bf23002483045022100cfee19f2b86fbb6f12b19a63b3406d0b22980e9d03771649b3f59efa891892b40220553b0e3f695df28670800bec6028c31931204f77bdb9124b4521ebbe5c3d284e0121028553f0b13a6cd02a279c98943b33cdc71a2968481cde0f7576445f0ccdf4db4a02483045022100dae9cf9fda3c322d078944b235abf1014923f2697f32b59e88be8d1b8c74517b022006cb8e835dcd3568600c53fc8baa4989764aed81b4dadd9c99b1ac60447804e5012102606c49d93f99f437d41ee6c5bd1e5f0c851d5d86cfa247c12364b9f196f55913000000000200000000010136ee30afab5cf7b44b4cacfd79a05721a893bd51594464bab37364a4862e9ca50200000017160014b38f1461633a9ff97a42b579d4782a8f34e86659fdffffff0211e813000000000017a9142a6514ae5e126c061a86546cf35ace2215b993c887d619d1090000000017a91477c255f0bff6aaf692cd44d7703088fd9e62fbb68702473044022052fbcf0172821a557d9a38ba40b6c766bc75897807b8e1c7dd405f4b17fe2ce502201cf80f8a8be85175f63635cb4f3aa45a40176cc67ca1a40b435977945e1f2583012102d1abbab06832837a346cc83764c79a500f1ed68a53f5c4f64a57474989965ac70000000001000000000101cfb30b6a681199dc1d1571323bc541457762d2fa43bdb68a1fa6b5b5c68802de0000000000ffffffff01378d01000000000017a91422d902d4350da958e5c309b69b03b7633b870cd28702483045022100c9595a94626ea391c582674611b1456875d5d44ad723356bcdce263a10bf839a02205e86fefe9c557f0a5d6271d442989951adbcc4aba9e015303a9c0039fae5c5b1012102576e82eaf532bb62bd778b331ad12f1e90ad9fc49416667ce304ce86f73158150000000001000000000101c07b342d7da8fa3db58815e05fa15c285c4ba1dbb72d955a00b3d6f019269c080000000000ffffffff01f46f00000000000017a914e376c8989de9e6417c226bfbb35ccef2220d06558702473044022003305da9162b030a82e5f3f5b99c9316d598c488ad1f013a7c25b6d2c5c4456802202adec73e7a5892450aa24de3df3180e744fc492b8568437d276d07cf0abc6bc0012103d8cf7c9fd5825008ca6a7a813b005c80bef844f118a52ef3f9a23a6e908fecf8000000000100000000010143a7ee48b69946b6bf4f1ccf4fbd20b25a2dc46e95e291a09e578f61d72e44450100000000ffffffff01cc5403000000000017a9147fc154729721fb9668b8bf37f0eb1eeb43d9311b8702473044022060f380dfa5dd35323c59cf17f1939a0b2f262745e615da440c5d5d14415d69040220198af5ff261c37151a7d02746bea9f4e0ae9fe8e898fd07726044586b80e01720121025048cbcb959c6c9cbde6e4f3fa37f0501afb786dbda941303c1265bbc89ccc9400000000010000000001015d1be03955bde1c41f997d2823e12de6ae1714460d5d3108296ef66dc98be5250000000000ffffffff01987901000000000017a91496ad574a665aadc8c70719c6cf645350e3ea53c98702483045022100c4abe062b1e2ac538bb68e0e1567393d06f7f2e8d79c3f219de7619b5ec179f50220782ba7d2505d3bc177c030bbe320608fa27f08b2a6fd0a5ad433748030153e03012102dee1af38d0ec3fda61fb3de1ab944445d7513a48cc933fac2456e214b79f922400000000020000000001010a43ec2499a517cc57f8a6e6fc5e9cf11f79818a1333cd3977614c31f0ff2b530000000000ffffffff023b1d160000000000160014d0be80f0d3d6658e09cc61e3f26091b10bb56edfb20e730000000000160014c168f20072ca05006fc6e943a5f29e8577f61dc60247304402202c9675624cc1317721b799ed729b0797b457213d803ec5f329300d71e7ed229502202dd11d44d27702170a1c45f53a565dc3a70a4efd34bcc94bc614f59d4d6894c2012102304e54bf1a457b562238900401aaad1034434bdaf46e97a8bbebe4e22de5ef41000000000200000000010139892dcf1d1e6333250b53ec124be9541f5edbe6beb713331f93ee5b8a1560b60100000000ffffffff0240741b000000000016001431091f3465fe830c0e23a5f3dda182ccfc02f8703296570000000000160014a4bbf86504c07ca2171a64fe285d1a3a5affe4470247304402206a47c31de1fc26cad479d775482bb4ffa2d9c4a856736e5ee4f6ad6bf96481f2022040505923349211c01dbceb3f94ed5e49e1a86d5c6a8c612f9b924807aea30c66012102208134c721878d1e5b3875033ef545aa3294e564167a44159cdc09b70e564e9a000000000200000000010159c2c9300ed1ccc6d5713f4713c2261742da0cd930d532b18680ea08dd30d7750100000000ffffffff026c4d1200000000001600148beef2ced4ae48ec3915c6b45c21ac1f74642b8f1944450000000000160014a72733de454cca5fd2b71e8ee2f4c8a4c4c855620247304402207edc2c64afc865570f7dee9babfedd4fb051e9084520949d688934829cdff5a802204ec77f3507b02a30913b2884453b162de199ea106d0cde4c1ccc25cbf32f83e70121028af7ae3b5a5d27e9ee12dd4394d5bb381055b5d78e4e5853da2ed0b6a8c5133600000000020000000001014656d6f816574f9f0bcf007af3c466f9c6ba316460bf9d4455538bd1782aeda30100000000ffffffff0245ea0000000000001600145a05b35753e150f190c9e299a04baf81a07d9e85275544000000000016001448b4322eb3314c4cb23a9db16c9e1a118120c8440247304402204330153ea60b9bcb4610e614aa0c3010541bd8f31c05736d38ee1bb6c3a17bab02201713f41a62fda1052cc24d5ae23908fc040f7dd4af3478d0aff1c843db4865410121027ee228fbe1504c7e57f3f027377601236e65ffd18d9824d5759efe4c6c5675000000000001000000000101ed73bdaba7480ebe2989f8e53948390b39e8933840876bede1648534c0eb9ccb0000000023220020b279288a7a3354d9a0537609f63e4e799f0be65e87c41f309ff7bdfbce30a2daffffffff023c81450000000000220020a6ef28093c5727b214cd3c7e5d07c73aae458b7cebae1d747916a189f48fed4a95af01000000000017a914b82f7b2b67fd30a4ebc57225be7aef6f92fc0291870400483045022100b3795d442ed404051a22147c64453031db453899437183c5c868c1e6f0b276c702200cd54b18ce3101cc0c52f7915f64f37e4ff5893a8a91e02bb5c182ee101e644f0148304502210094d86c19c2442948438857b22a3bc933f3245706b891e3fc2d7bed8335c2a103022011e596dcdbd17ae7976935ff5786be02bf4341606d5d1ecc91eac4503ca4e6860147522102b970a5d03ef4068c7f3c7779f7d1130ddf52ba7ba1317d08e8f3c0f25e15bd3e2102427d297d9a117f13e1b9217ddcacda741525ac7232c9f8d7c903fe87d1d94a0c52ae00000000020000000001012473142989ee156332ca4b436e181eff1fe3833c873c2e1d21eb052f5672fe990100000000ffffffff02983a000000000000220020c94af3b2ec12e774d3e3e6a113e89f654745ae9061a1b0d2e0b41816bdf228499d570000000000002200208d691c086c9c28f38d331b6059c1e5b12966fd59b96484e268643a4ec847ad2c0400483045022100b2ff98c82d81a4f909fdc08a9a5ef9ca9db36b20ff87107415aa9e4776fdbdf90220637957a92fcfda804d1d7ce623ea676266282b72ad4239458194d747d3ed4afc014830450221008365f29e145161c5d84afddfa0cf04a56a4ed511c94a130bdd576c84b89939bd02201b4eb8388df89154755fc5993867dd1fb904b868b5eb10189fca50b129ec662b0169522103700e7a54222dc2798f315698bb811c53311d8933b864bc3735c20d336674d3e32103729dda8d9e45c80aed1c2e4172b5f8b9770e6364004a1a72aac08ecdd9ac11072103cc8fce91e6aa311509ce60e8fef8e86601704d3b3583e9279066953a45e687f253ae000000000200000000010331634fcc50bf21b44239e3310c054f92ffdcbdaed0db7ca9c478b0ad303aaeba2f00000017160014b79e5443bf2bf71978c2ea48b71151360acfa17ffeffffffdf494cbc42d344309c1f2bb1d4d1d0eb270baaed0a83e1fe9acfa1d8d48b4f773100000017160014edca11a302d55a0110bdd390cb326d8e2899b35ffeffffff462536bffedc1221fb3dcc00dc233d8577300f9ea16184dc6c09eaf6be2c23ce38000000171600144d1e8c5970324f3f1f134fb7481f8de96fd7867ffeffffff01e9730d000000000017a914fae60f142927a365336e0da1da5d1a90266273988702473044022013fcf1dc5b35df204dbd3bcf0bc36d1ce6d7d8c344fd4b59d5dd7fbc9438c1520220292d28ae2668db29f97c0fcdf17b24946637028f830b776b813afd5dcbc8c3c9012103e9f4a43d4a7e09bfce89fc3a9ffb80197a9cf0eeb76d2bc892f159847fff22e00247304402201ca4379c42bd92b79b5b9c1eac1007f1c791fea91d09c6e05fe36dfaab5ea5900220333076d033fca03060126523e7679ffeb10184842171aefee8f468dbb4261efa01210335ea2cf2d81c63ab5a4f8366428a08df0e786b6e675ca9043eca344c76fe01fc0247304402205fd441e7752e90f16aec3be05c962582649231915977d1df7faa108272624e1d02204e0b59367a8d4c9884e1e72013cba577b6f7f83358d5d5215abc0a34dc4b0b47012103a875689f8f65afee8e4e140cc58c7052f855bbb5ee5cb94ea5cc0ceada2010eb47a00a000200000000010360c2fec34be254381986b5a6eb7ccf429b60cb83c6b65b55db4dc6a171bd8a800000000000fffffffff9787be0f84120685a44ba4d38f8cea76c4c48c2a716c98abdbce4c6315d94890000000000ffffffffab45f8805dc74f3f58ab433a0e87888241a581d55b23aa0a79bac9be9a6d33e80000000000ffffffff7bacf90e00000000001976a9148f19fee2233088884b2e443ec0f2ca50d257eb1488acdd0830000000000017a914c400c0fc91dc274349df19dc3e8c89bf194dfde6871f990900000000001976a914a05b22f0880d47e000bb2764c5b989002b93aa5a88acd4b102000000000017a91450debe495bb7ecef97b1a7c470c98b8760d6867d8712eb3f000000000017a914130d353449d5d50d9edb6435e3ab0a00dab190d587c3c90b00000000001600147b49ad0bd94e0de4bfdb80f36ff350300d1cdfdacc8110000000000017a9149f9867e29e99a444d2594a61968de753a635914287f9cc0100000000001976a9149d65b7038f1dad374312756d3ec9faf810c7924988ac02d700000000000017a914b127c48ac67b9f3b8716252da1e34bb2d84e646d8768660c000000000017a9141a9fa0826c406b0d083474031f3be39db78d64b387fa330d0000000000160014bf8b8105ece9a33aec14ca6a84672ec391631ff3bfe8000000000000160014f6ec55e931a84d6012903e4d8b470809adffff695c0201000000000017a914f1ab71befc3ca8f85d362e9b455b714f86346a2487edae0100000000001976a91419464fa7df3a94da5ef4f7eecc6f9c6fee11dbed88ac0a230500000000001976a9149989ffa7905dd36784588e70e5dc9c77e768096688ac4b1402000000000017a914a50d30290aaeb351620e075f33c5e855cfaead61871d9100000000000017a91434da82785b87738bef01c05817231c3a3832586987708203000000000017a914c55d71dbafb33103db1ea355f621f97a2afdf39f8712591f00000000001600145026292ea64eb114735e18a394b9432d2fcbe89c572a0d000000000017a914d9c77a8fbed5b3a8fe4eead2f333605ecdbc2f718759ac00000000000017a9142ee20a9f48a3a5daba764234b9dc309594a7359887034e03000000000017a9147879b22414070de4e1a206cda3df1e883b0190978787554200000000001976a9143624fa07b153806f7fecf2fb4e60c003aa03426388ac93c93100000000001976a9147430bab03d68e1f3008c379ce0382ac3f8520fea88ac681e06000000000017a914e0fc023400579d8c08391ca01d8a3cef416d24b2877fea0900000000001976a9141f1000d332fe02c3563dbe9ce51ad9172cc191bd88ac5b9f03000000000017a914bc748a36901a132fdd2afed3f589d8f6eee161328743a60100000000001976a9148790d191a11a65e7272f2640a33d0aa267a3471b88ac7cc13100000000001976a914930a6140db0fb4a3ad822dcedeaf540b9d31fde788ac3f5200000000000017a9148b3c74308d62789593b5c1a08733caa3b0ca71ff87c4be02000000000017a91457967256845518fbe745cb1c776d94d23bc5103587b0ad0100000000001976a914e4729198543abb286b96edfe62cd7c7f14d8d14c88aca86100000000000017a914b85efde9894bf7b371257791e6ca03f3a9fd93e487fe6303000000000017a91419e63c0ce49ef04420ffdb36baa5e637b50835fa87359b0700000000001600147701193eacbb6bdf3d3381bc6a30369e9ae6bd5d7c47040000000000160014db45ca476aff15f8bce97d3cf0702fdc36e5bf5c08cf0000000000001976a914faac6e66d3e165fc6f125ec288d48bc7d98fb7f188acd4c00100000000001976a914ca0eb29e02442777cb0b0481b03780f3f3e2eefe88acfaa610000000000017a9141a47268b9d0e87bf67e213b7572c6dd5a7cb568c87cc280a000000000016001438e5665654cc89a9a11b2cf32808ae3bbc7ef93e67070200000000001976a9145a5cc8ce13ff6452916a3d631d43531ed463a90b88ac0b4803000000000017a914dc831e684156c56d4d2d5560a2728285dd8763b587f75d0300000000001600142bcde12099d2901175352c403c857593edb0af82e1e309000000000017a91458fcf40115375a7a40cdc8a83494855dd0556a2287444403000000000017a914c37cde90b2f00c1dfe8bf5ca23eb816e061eb25e87f15d03000000000017a91425605c715a23e7739f1c6a7926fb244aae0dd4ef87ea15090000000000160014eb69bb94033522ef3bd697d1bf00b4a015ccbbc070b70100000000001976a9141abb51fcbf706d82da493cc9b65f4c8e44b1df4a88ac72990600000000001976a9142048f0fbde998c11790176eb13ad7e02031ee9b388ac534903000000000017a914ce3bfde80ee20edef4e0615caad9fef2c836d8db876b4008000000000017a9148068c638b891b5be30eb826ce2be7afd1e8edd5887b0bd00000000000017a914e378113b78769c2165038cc5c640be535e68803e87ee2000000000000017a9147e8034b08b0f8b85671624297a712525f02091e0872a790100000000001976a9149408a58f99cbe5c54f9837c1faa977832acd0cd988acd8fb01000000000017a914b8f307584b3f7683689186452bdfbf64f8f91a428736fd10000000000017a9143c53277e252ba76bfb3f830a77a0bf65f2f7ed5c879ffa0000000000001976a914ab2ef1013082a263c688e3fd91dce8b9ff6b515f88ace4a421000000000016001450335d288aef6db52278134b776c8c8363a660651cad04000000000017a91407dfb1c71ce5bfa7084d1cc671d3570c6f84d81287783f08000000000017a914fe7b2e5618a28b22bcb61b1d8c11e39c7a89394887e5fa00000000000017a9147013fce53d3ed0114103204f89ca93fd05b9581787924c03000000000017a914113882af83b80c2953d524f980278906e70877188731520000000000001976a914ea4bd207daa6b4f973d0eb72b9da0e4c370b47ea88ac46b30100000000001976a914cb57ddfe1bd5a1dbf76029b9cecf920b314e89ce88acabd20100000000001976a914cf95435966b4fa1bcab66dad7718ee26943065e288ac54460100000000001976a91439fa3aa69af56b59dabdd887c0a1313fff7938ed88ac34d000000000000017a914588a2c3bdade75c3e3d017606ac160d01ba199e187ecd610000000000017a914a8f9a54ccb16040d68bc49e3c900d421006c48f4876f4303000000000017a91404fe8216d7ea8126cc740ceb4b8f46653326ab80871e5e030000000000160014273ecf1a39da933a00f38255edf5be6c6ded27a17f090400000000001600145fcd2e15105fbe854c7758689448e84393727184e3d90100000000001976a914716503aac58a06a896fe4357cc4ed731a063601e88acca341a00000000001976a91431d74daa3bdd2fafff6efd75112a2b54c05ce40988acab1a0a0000000000160014629e0f2b740dee87a1ac45e435ba8ea487c4dee49f9f02000000000017a9141f949790a60a4c7385349915b6541552a68523d98751a301000000000017a914d1efdad210ba9a64aa591e319c943073356b170387ebce00000000000017a914b02e60f3527401c99a087aaa2e52dbe24749749b875b750200000000001976a9147a703c7a3c7cbb9ea69c3d13eab80c653c66e82088ac6abc0100000000001976a914748213f7ea593391d07b0ac9a07c1ec688937e7788ac4c691a00000000001976a914e695ae112f44344a1219854252872269aaad0a5688ac37e100000000000017a91489b7617f585f01f261ded284ecc923f135d0d6738791720f000000000017a9140659b22f6c17a25ebd4bb8e7ca1ed345d5a2ff02872946420000000000160014ebe57dc10175ef0870521507dcde684484debdf3755800000000000017a9146b536752e87d03c23cc3739881513f2737e76819879f8301000000000017a914419ef556b7f9df31a4c1ec5bc1e6609d3a5da1f4872e8100000000000017a91428bef4289e574b9ef685a1c3069cfc5e1bd5dc4f8795a60000000000001976a9146f25239e1bef5b8cef06ad67e67b83b13166ae5f88ac8ec009000000000017a914bd6c41816dfb914e6c3502f4b79d19735311ae8487ccf900000000000017a914b0b411be759ef8d0addda3ae4e677dc098f4473787c1ca00000000000017a9147cab32348246f83eab97abe524b8a9a37e57b62b87fe0702000000000017a9142e8d08448244e5c9179099bb724bd4eac3283c8387d380120000000000160014003fbe9c39d4f69d6617380393d91e3ff4b39f37b9ce01000000000017a914a385ffe8cd10f9bbd5359b224f14b24dccde109a8757c0010000000000160014fe52702e88bdf35c3517012649090e6c7e2af444314803000000000017a9140c9cbef0bc73af0a3ca054270503b3d20271280387144b030000000000160014bed4809b7b49000fa9b7a680329268c64b366f52e03902000000000017a91465d6eff2491744bb1553444d4b4a12b6d8d1bf018704a800000000000017a914c27693cd140997ca8c25d08464a946471c2689a8875fd70000000000001600142519369b490f562c399115a0b6818c6e1baba077acae01000000000017a9141cc88d7c117246964aa9e65897450f1bdd6b72248742dc9b05000000001600140374738f64e760b8fb8873db27f9bdf16875eca55f1e03000000000017a914c63c4f459fc6151513e6748d9cc69ca26941a44587f9470300000000001976a914e6e828f2bebf1db27f727f5f2abe441a7474c5a088ac4b4703000000000017a9144381140a1cce385c6cd99842b25e9735c5489573872705020000000000160014136d91041ec7c876d1baa4cf6197ce4581d60605fc0110000000000017a914d7825a1fd954853c761c55008803fa9c6c64dffc876a9d0100000000001976a914f2eb0a5f73d4fef576e62c6c5aa9735677f53aee88ac3d5001000000000017a914e4cbbe1956be7b168808da03c9d019d084809af287c81a07000000000017a914739de7081adc791b91a066c6064903a2f3eeea6b87f04303000000000017a91484da9ed651c0b3fa33d0eb13fb1d6fe5fdc9202f87af3f430000000000160014345c0fa7d0a4b947de28b009006e73e6fd3f948430e80900000000001976a9147bfa54f4c30de943bc06b2ba105595caeef582d388ac49cf01000000000017a914fb2e35c68740a678efa23bab7aa2476310ac18ee87b7e30a000000000016001425c17d3cd446e632d53a4f2d33ef90668a779d73bb1d0400000000001976a914d2d46e7a77bea8859e6c6ba5f67fd22948ea543988ac679f02000000000017a91466a20f9b3c03f1ef6e402431f8f365ce8b2c9dca87155e03000000000016001411da1dfb15158682eee3751f9c5796ce538d277597b701000000000017a9141259acb9e7d11e2becce0f1a065d6b7f20bdfa6687f3e20400000000001976a914915964e4cd690c6d8e9b0cbc0063fbbee9fc798c88ac40630300000000001976a9148772d39c9c030bd7803bd38917eee75c327f1c1788ac353601000000000017a914558fd36e329b5841fb88c8c2eb8695be7b572e5287b44703000000000017a914fcac9b2fa5751341d1fc4bc44ff2e2d44e6aa0188738c606000000000017a914b7b147651312cf6d386efe52f8fa8af74fdc908687024730440220312f8cf4c71293ce89a6541bda8b3b43ebb13e9d3112006f3c3e55368b218191022051ce8409272beac3c5eb7e7b1e876434da364432b9a84821dbad8f06ca58522c012102e558613122b96084504fd9b45ff3653dbf30dca3f8f340fddc5c28c7afa60664024730440220256cb9c8d120319bb45806d1f74bc307c2618f6cc33b32f31fb7a1034c67aad002207c527c5066477b97ecee34e2fd07298b9f1b45baae159a79b1cf7978b57f491a012102beed0f104069435d255b8dc21add1b7ea3a87242370632eecf6ac47d13db2c500247304402201823a90094f1bab0b48adb7dbd855cb24c04c598bf777b7aafda3ab2ee5c25860220657916e300f2e751c90594c50d6718e65f73a2fc5b53d3d2fd863e4058d67421012102c0ac4abca4417e8b2b21b7b570875ca0b22809a91f7089b32198aa334a22b21a00000000020000000001010e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc6400000000fdffffff01fcc89b050000000016001465b582ae6f99e98df2114d713bc77f450ed2db8a024730440220282bdcde255b1230c26af54fc36b956303385cf5531425b2884637951888733b022010a16dae8428793b28e582eab76dff7cdf2072dfa7e33d22ff1cc8b7ca8cf8e10121021991159f1963be5b99b70868c63aa2a871459c1b87ab5da1c79466d743e7144d00000000020000000001010e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc6800000000ffffffff011ffe0100000000001976a91408a9d5b52961dca049fc07e693b0c522d5cf913188ac0248304502210090d671575f55bc675a98148b11fe7c1fe3d1a7f87544ff56fc87745ef20e626702205f6fadfd3120dbdbe994033f997794b4f2d044f2ea16da5365408aae91e41dd30121024d0026a1b93c9d02fd8b529bb5b89f372551c7ca984464ea831814600d85e3fc00000000010000000001020e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc050000000000000000e7474b45525aa5fc8fb821c89035f5f213504547a3629121e0f4e3f1f1faa487400000000000000000024e8028000000000017a914e69d9a0b8212a85a90179e947783a9922d316c1c8763430100000000001600147b49ad0bd94e0de4bfdb80f36ff350300d1cdfda024830450221008a090b983feda43a59f1daae0ee0eed8f0c4c8f914df98409cb5806990c107dc02203ce311e25c442f860f2b18bd03f0f43de1d6c22802c9353070adf46d01d7ecef012102899cd000139e0ce65943204d6febfde95853d6c2242a0ea9c602cb9860e47e79024730440220333328354528f2a6e4f4ba9d5ad7a6d6baf0f7209cc524e097b11c3fa9c2ab8e02206d0d180dafa7ca9f342f0f7febb3ac0863809171adb0b6b6398d3628e1be3132012102899cd000139e0ce65943204d6febfde95853d6c2242a0ea9c602cb9860e47e7900000000010000000001010e44276754fee2fa46ebc42433eb120218038a78e29ab3f3bd10afc40f32ddbc5f0000000000000000010b4803000000000017a914dc9c79b9e267094d5dc5ef4912e5ef7c8a2fe7a68702483045022100e32de4c3750c6258848d5612f7fb82fd3fbd3af92cbd178cd69320289a50504d022011456dd931b4b5c44bbc9e7591f0208fd6f1165313ce1535b2ad2d0286bee1be012103615cac3185091e0d14dbad82498455697a7b4c64eb71581bf9d6537dbd1114610000000001000000000101f099652f51490d9adf6f867db474b523a59ef02b5bd8bb4c96c905e98a4f87930100000000ffffffff5dcce02100000000001976a91406ec753b1671585b074109c77fbddbd4e4d1d0bd88ac160c0100000000001600147fc83c038c50945096741663f1194d0637663021a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388ac0a9e0000000000001976a914ccf6db844365873668788f9b5a1675add4f4313a88acb4bf03000000000017a914d2c34ba3cd36664113630aaba4eb2ea9cae2f3d98736e80100000000001976a91497a26975f7bcdc87ea6e52a0f751c5cd5a9e6a2b88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd766b1a01000000000017a914fd8c623a37dc82feaa22f42a7aaed120bebfe2c08779ff0e000000000017a9141e8e4304b342ce4b8de512121d7d6ff82961cb0587d0d00300000000001976a9148a10a0c2cd10c8d78b0983e3b5f8f07fe3a73e2288ac875900000000000017a9144ffcd40d8b71f9e984078249f5dc000485b9b587878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388acd524f3160000000016001484b3ab882419eb25eb0ff21bfbfc973b3b214e57145600000000000017a91492a46072297e14fc702f5def2f1d3fa1cc88041a8777ef00000000000017a914210eab64e94ca27ac35d48e6c8529cb70625181f870e3800000000000017a914da15611b37160c1abcfeac8c954a126e5f0792e187e31b3f00000000001976a91481c4a44dacfb1d584c4de78c31bbd97eea5a464788ac036f09000000000017a9146ee92609190377f8ecd6040d1dfe4de3bab8ce0087801a06000000000017a914475b2b5cf9292150bb6ed5201575a9fb9ae0b2bc87224f0200000000001976a9144e7202a233bdc08c031a1d27f4c81546f04ce0ea88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b78c01000000000017a9141a2decc46aec972b3fc970eae9554ab953a35e2e8765ae01000000000017a9142c0205e3689c46864ff4d8aaf67d8d4168a9354c87d7e800000000000017a9147bc3fc9510d6911696fb807fc02a11de9d3ea56c87509302000000000017a9144767cae2db359d5fee6603b0eddd945263fc2793874a710600000000001976a914542f4acbe1732c9b0da547e8b4fdf958a381ee9988acc8431900000000001976a9149c3cf3cfcb82ce49f620519b4d1606af3e51938d88ac7d6d00000000000017a91447fe0c3214fef124147899bd52da06a0517cd352873f35000000000000160014185d76fb9148a6333468c50e0c9c4913010ba2044f443900000000001600142cd8acbe8c403d5c4e3abdeb3cf6e717fa3866975c583200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388acd8d600000000000017a914515d3acf78a3d06e797cb5294a45e86c5b566cbb87cd5000000000000017a9140e8aa010d23606564c335e80ad4f69ca59ed325f8772c70400000000001976a9148c6e020ed187db78b4de7b659a89d9c1a73014e888ac7d330200000000001976a9140ddd3d45d8ea45b8cf774c7aaa1aa97c5f610ec588acf20804000000000017a9140cbe98f92dd4f7c20147670bc13f5ac7eb8c5cd587f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c99701000000000017a914f0c3b5f96f5116198f79e5ddbe2aa3b3e9f3d3b787746f60000000000017a9145256ca9186a3970d4a7d0b6ba2ffe032159f9d27879dfc00000000000017a91441a81d10c085e7f5f51b169db9cb9e26f0dbd619879bd700000000000016001462b59fccc57ee14578a40c7d2c62e92b0f84539ceee26d000000000017a914d01be739b5b7bb73d8a1e8c3638a20f3a9d24705879c5b02000000000017a914fba89039f5fafd192eb397d4160f0903b74cd1b787106c08000000000017a914e0df028fa15bd66b4f48ab778d69c8458ad2a76d87a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388aca176000000000000160014dd9d98a44dddbecda020d2e6dd3b4fd22ffab3c27cac00000000000017a9148269a7907f93816a5f3c08c264231c6cf4e98e788736d00a00000000001976a9146e92fe225f9d806e2bca6e965e37965c933a1fa588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d8d600000000000017a91495dbd4b812a741fd721015cef26855c8dde77ec3878fad00000000000017a9140116604df1c684795c234bc3ba9e6679cd4c135987f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76704505000000000017a914c603b497ed538bbc97bfdce1aa9acb9bbb405e34873b3803000000000017a914dc00159be3c1f747cc0924570d0fcf06422ea143879fee790000000000160014b795ef1a18dae4f283c0137cf0434b2bca58fa1f5c583200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388ac909a00000000000017a914e98cbf246685dba55a9c6ba34cda891af032e741870ea302000000000017a914e1f52f61095031f655ac1522382905d815da6cc28711af01000000000017a914a846c7d08b3001250d0ce9e1490324068ddc520887ed440100000000001600149bb78290c39ae444fb42567e934fd66a6302ae82eb5e0000000000001976a91443c61d0ca81bb3c74ef24df955cf46ad16061c4c88ac53bd0100000000001976a91464c1dd903ae966b9bd8a459bc2ac6cb32766fe5388ac0bf65a00000000001600144cd87c47787bdcdbae85ba66aaaf8873b1cbd844a04f2d000000000017a914bb13d179c249b954da0a6151f9f82058acf31b828726051100000000001976a9148482e2291608247e4ecb6a8fa1a0a5a717628a2088ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76160c0100000000001600147fc83c038c50945096741663f1194d0637663021f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c66d00000000000017a91454eae234ef8cb23f20a50ed6dfae8566575fdb12875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd763f740b0000000000160014e7a29bfc64407ce9f10f1764edc8a324d335d1a0fade0300000000001976a914845440cd9c0b208c7f8f95d8f95265566c66ae1488acc09105000000000017a91419beeba7816224632e039152c51e0e0cfdda378d870d0802000000000017a9149e06fa1d6654d970760a4d8332769c17b635594087fcae01000000000017a914e848db0e87f15019de9401722d11d034e26675ea871dcb05000000000017a9141d6374ab6cad8f655c3fb30592f648ce849096a487f8580100000000001976a914cb90726dc69766320c2518dc41f879441ed90f4b88ac400d03000000000017a914f71ee2e7056ce6641c10b4bd86abdb6af3c058948740214103000000001600144a4b5316cf1d660707a5df446085469bccbaddd179ac00000000000017a9144a817cbcd2e1b8c7fc25387f0c22ac5293f81f7d8726331b000000000016001419a875afcda1f61521ffc9900db3b0e3600071d25055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768bf0fa0200000000160014da4572fdeee349547adf9574faadc68c15fd8ad1bb780000000000001600141b941a84d1819d27553bd6d0a1dbe993b17c983e54050a000000000017a9140dee4efa51aabb1d94d14dcce3c51cc9480948c887751a0a00000000001976a9144a597efeb0572964c99c24c2fe3f5499b27f42f688ace6b91100000000001600140db774451361792dd904fe96bc75e75d498bd50f69e515000000000017a91403495c9d6a79b71203ee70d33603087543c68f30875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d2c40300000000001976a914cc38d8f4775b8c3722d03a60bf4fc6068d5e852a88ac024830450221009ae504e7ef05573b9fafe859ec041e6083f370f7094c720f13b4a34d6dc0d29602207456839fb15a2bebd230574b76da5495727137b0bd3f458d3b4bfc5f002556b401210266c3860b4c92151b2098448898e3c83b885341f4b0998331e5bcad986c2466b400000000010000000001038832887a7f59dbff0de0b0f22b8eab1d78b3bd7a316ea808beb58e6f7c44f7215300000000ffffffffd7e2a5aa687fcf7651bf6133f6715ec50460b16c53a39d2f7a371e48ed3f99830100000000ffffffffd45ee4d2cf3157564283fe623c4d8acf40e99ea3c2bf6f3dd215963131205f840100000000ffffffff02803c060000000000160014c870b1cb3108dace0186f00ba2fb538ccad630a800a53c000000000017a914e1d68d1f160c37a5c534bbf4e06b5c1d221309478702473044022062276ba3d8c681aea18dd4e6d5d0e4783896e795b356f4bffd2358115ebe622702205b7863db012676d1bc7448aafd3f2e74578f07ff6856749ad15b626af410f3100121027f195b5d386178cc5449a52c31a001941c225a63afaba4bd35113b0888affeaf0247304402207704a8fcec1dd6fcc6127a04d7aa58a3a9a6473cfc24a0b0810d36544d4c18c60220596ca635e90935784e5fb2bad03d5057dc5ad4ad858c18ea5a540e21549a04cd012102c06a6cb775e65f1c99e7ad1d13b604d3df01554f787d529c658c41bfaafc5f5b02483045022100d5b25ec4799345cd24bf52854b7df16c0f009c492186996e30afbf4d0c34807402207ef3c794c997f354714d7707903e6a4d5b81ffb22965efb3a4fd49eadd8afe87012102c06a6cb775e65f1c99e7ad1d13b604d3df01554f787d529c658c41bfaafc5f5b00000000020000000001018832887a7f59dbff0de0b0f22b8eab1d78b3bd7a316ea808beb58e6f7c44f7215900000000ffffffff01deb21100000000001976a9149d295875c8d0ca68acb0fda07102c2f6a8db4edf88ac0247304402207a04ef6cc452a3035707447b309dd5aee0fabd0307d51f8feafabf83728aa20302200a4eeb7cbb1696aa23da51a7f7da344875d8713ff77e23e268f0d1dd666e74c5012103a0d8f43d26648c33e929085cf44afb19eb8898231dff8c71aaa6dee1e5516d8d0000000001000000040466d4980115c6c67b328516e4d0c3a2b9975e03613116c5bc77b16f6d7b353c01000000fc0047304402201c1599461c8649752a74ef155f78d79c534176308e791ba601995039711453a002205277350c41ccd0c6c907a1a8b290c1192c9bca93015cfa96ed6b760039927a57014730440220655ac4fa9c331721e78977ea34f21a97f77512840aa02aea1d709b82fdfd35ac02201cf52684d5d4b698bf7e9eb8787b2eae55fc46605403d03527ade581e48411c1014c695221023860b53ffbe77a101c81f9e45c9d99b78580bfbfd230428e9ae93c5a780e1f022103b4a4f0c915f05e2fac0d85ea038df9cd06791bec0cfa7ef2ebf1f70620774aef2102c89b1f2208abacb9729693a8ca6fd2c4c616dfdcbc4a463fa33d7d8ead1eab8353aeffffffff2c24566ac2275b425134ee750a9be3baa59d22b45d12dcf9ab9c30707582de7e01000000fdfd0000483045022100f5628aa752a6e23e9bb1ffba3ea26d2b2094a25d42c8ec7ab3b4f79542ad59a702204cfe7d7c501642c4e5d8d610baa017aaa02b858f3492b00b4d48f0c767649fa3014730440220458facfae1924f0ac6c6e6bd308d2df3e9294e7d1b32f0a98522f4f56e0be3bc022045d397e3d07182341d99d6f00859b8f4926f3c2a357f53ed12517dc69782785c014c695221034e3551be59f2d595a75b591672682e47042ae0976d671c6a6bc8545a2913993f21039b41591f1bcd8936881c186606593a7c2d445a4dcab133ffabafe1625935249a2102b46ac6e0d3c352096c2d03bac8a2cb3c1a519a2744715fe0e2733dc79cf4e42653aeffffffffba81e93f36c2cf3b1a389a00016ed9cba5910116533fbd6de4638704fbe89ce201000000fc0047304402205218339c6a8c1f0a696d0ff3cabadf7cdae892bded326fde45f39a432fe8d07b02206819d529a76cc2c6f716e1f8a9d911e5f268b40a976f21a1af0bef591494702c01473044022079702f40f90a1e277994a7a4eb2f58ea2b9741f1ae1ea5f45ff71d31f49cbf3e022034b479322bf98dfd3ca28c47590e530f71b064e793f1db8d742cc9af99641181014c695221025004ed1b9fe3654fa3d69a613aeb61796d8aadd524f7bd88f12efe255d02a4e42103d21747d071af77262e4ab64580f45017d0bce92c936784861e10d5ed52c95b22210310f6f665926ed2c94aea7e3f2a5affd3b08922c95aed9b7c2f45fb9a00439ec253aeffffffff00eeede39ee0612a6570f405d36c29a890560df49eff0922a29422ff7be8a5f701000000fc0047304402205edca5b7e730e83f15c9bb126f3dbc2d60c7a6319b23a6627f6a1f06324808cd022024a7693e9b3746e766a39376c78f277a1054c62d9762fa931eb54cbb221b41840147304402207d84acd1bc99477fad99814242ba2821ac683c80b39554cbbc58cc72ea0c30d9022043f902dcf9025728ae139be9953d3bb513e52ea0f6c4a9bec089de27b4b2b503014c695221030523599577ee5339df99fb20aea7d0d2bbd59021a09afb8dc8b42460f8c4483a21039e934fa72c4161f5d77cfdaa18d56f79d38acb981a801ea00c9a16e820dcd4732102ba4d88ce69f0a5db62cef1f5b195d96e39e488e42b0d84caf2edc7129f16d4f753aeffffffff01a1d2450000000000160014d38729a0ac4920498be5beb81e6509421862630048a00a00020000000001016b3d33e5d34682f142cf9cfe8aeec32a47ee30f93f56f13875cb90042ea6d8c80100000000fdffffff024882120000000000160014c215e1f8e30855271b4a0265685e2a10a681ed082229501a000000001600144e757f79b73ea2daafd78a7430f8db114b7d035302473044022012b8c94cdf8f7fde5c290ba3776099900fba12b60999223739bb0af4d900434b0220192973ed0685e5c90dda25e8db7ff6fef251b661c39a0af61e161b290c85988b0121025c17b4ae5a2944ec529c888ed81c49550ea6ec6d05d3c760d548b23ddee8dfa148a00a0002000000000101b56aed144d4678197cbbb1bd36dc8a2b2e1e676980f5357371e618986018f8040000000000ffffffff01d07c12000000000017a91402a2ed91454ace883ffba6ed0ac9e7ef48ae5aac87024730440220665a48cc0641ee32226d5e1dacbbeb9d7f9e389730e14cdb5d633aa1faf111c2022078c59166a3495571c00da24f08b860cbf81ec6b36da8cb1627801abfa3e3cf9d0121034170294248b817cc9606398f08840b2eecbf62b598efa1ef24017ac3ffe63b7d00000000010000000001018f6b0728177530d162c0c8eb5343ff392a0b9bc8c05c2876f677a998b32fb81901000000232200206c4c5b4caebca25770feb2473363969f66c968571cb1e95e48beb9597cd40665fdffffff024be4cd01000000001976a91423c70cd847f9ad1c25ca73f18b85c58f0af2f5af88aca36712360000000017a9149dd1b207c4b713e9c0b03529f690aa05157880ca87040048304502210082effaeed4b5909a736a334a01ddde36f90730ad11bdc2b9d6259bf6ba0752fc022013ecfd0020747ca64f434b295082dccf1c617a56514557bece6c6d01af934d2a0147304402200221c2769a1642312b20f46c7eb2319756f0a39657c80342a6af6872235f8a9a02201983a15e053b01940c419ca4aba8b12603c8ad02e7bfb7490f4e0783ff5a61c1018b522102e8c6dac8f6a4cb91ed438877bcd68578243be3a5f2007d4722fd883ebef2f5df21037e7b54aaf9ecc2e4b5b018e4baf98011b2fc097bb604a9416140f794d8661ed42103b50859377c3be5044ee8de17c748fac9c83ad9518c62354be0842d2cf1838c432103c038764055b486a84a916941e39adbe51d7c2ce5c5b74e14fd99f85c91cfdec054ae00000000020000000157a65314ced89d215f5703050e0d6d16b1848011bf62c53dd990130be9f6749d010000008a473044022063b521a9231345610eb24df064fa83bbeb661f4f3e1af80fc3455ef619f0b17102207cc3839a2687ab4e3e43a967739c707c6f63b463eebf3c1436232740827765a60141040675cb3563df262d6551e21c8fd5ce09bc5c2190c6c8376d788f4a2d4b32640901e5d78f190d62c812512a1b104a1a645aa8fd6934ddc4cec911036e36a1b789ffffffff02cc070000000000001976a9146c9ae0689eb19e8126a8f13365a47428ae39709d88ac9b5e0000000000001976a91445569d43a14bced1017f7a8d90c88cf2423fdb5388ac000000000200000001f6446b99ad9f86d9e8e6b4787cd034026aaf52a9b5c32cfd506596515fd6f722010000008a473044022075ebb72b13b0eb8cb7ec1137190220d796a632cf60ea2e47812f6fd34bae7ff8022049e1b41e2c599d6ded5e61dc63629b1ccf0365bd1781f622af344bec56950b9501410484a4bc9eb79a5600a745e404f7c8f89fbb29696ae6d9e41ff1e44bee98c707ea939da6b2e6655ab19c0f5d411bfa7745a9cd2aa8e1c80c12b74c7ce7460efe71ffffffff0205100000000000001976a914241092e379ea116bd196ae39e049ae5beb0ad80188ac90732600000000001976a9140458212ce86e22cfd3b59b2736bb5a885ad52d0688ac0000000001000000000101535c3145eb65fbadca590ad62b90200c442e1ea694f7389c68bae46b7f2ee8420100000017160014068eb6b7222f9a8b913ac595f194e68a517b2605efbeadde02208b3a060000000017a914fe19edee53ca8b0ac083da70475f2ab4591f9dea875e3065110000000017a914c08593a13c53a94e07a7519dde25e050e88e40828702473044022031134256f16dbf5167314a361ce2368c917a8eed178010582f5c5758fb1c14ab02202b605fc0a95f47e70179faa5611e492ff9f98c26b5cefc0f4ef3632b48fd135c012103b1f163f23e48d35c97ee415183c61213a31572afd12b0c04ce048884dcc7dc7c0000000002000000012314a340552eb09629c5d43f49f1517b85bf04427aa51a96d151bbcb9ff9afb6000000006a47304402202f1eb21e5602bfdea722946de06fa3a5fa54cede817878ca8c7d60987bb5e641022052c360453a16cc179c404d945738f6e29b55e6f803a5a9937bb2cff5600592cb012103cab6e09c0619fbd5ac5db1c05ccca1eb63c5b57fdbc01660badda7c6e5b71ca5ffffffff02b0ad0100000000001600143604725b67369d51efe9564ae918c14b3f64c8c21c1e0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001cc560de8c7799ea416717e6a9e33005565aaf38ff57f09a03b793062d00b3b66000000006a47304402206d709ddcee03b663e088e3296f712f52bc743484b484f2fcb524b0f78e76926b022072eeded39cd3b3787df93b5eb050609775060d4b0d0503ae1e56ccc07d0b1f9601210252ebea6cb8690084bcbe6f6c219fd7ca25f3d5b16c90fd90f32fc19d4eca2bdeffffffff0280380100000000001600143106d3df2bce4e245094294020d5f96402f32fd671100000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001301fbe2abd93222d93a689c5456424533ae8783306832aa6354ad03205c0757c000000006a473044022022982061596367e9dd91bd47b22a6005a6bfb8cfa6c959784511774eb4d6c83c022045908db9a4f2209c916eb79f268d3035f3d319c54c322b54ca6b52474848180f0121029881538769b3c4995035b998c7c5c7688316805a3a1e8d9ec839356e83377075ffffffff028fdf0000000000001600148ab6763f75927e7fe3a65aa48323dbd4b135d95ccb020000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000000010160dfc8d684070b91fe59a71df54d315e9233bd38fd7b48d38eb1caa56d218d8600000000000000000001a0b3470000000000160014eb60242d5ef0877365ded643c26f5436ca7c57800547304402202755c5d052e6deb626ad8f674b6bb622115b941485789b216725cc5581f4057b022026cfb7737a98730cc22ebc293788024378ff6b24d3fc7da18e5f822f865770a3012103c71d0bae841cb7e0e9ed05c38d3c4693636b53d38e9027ad350673bb1e600d0520b5c6b19c54d80d02cad7e7d510bcf2ad4c97c2d112edce36a16026746c9587390101616382012088a8209802528463fbc48019ff0228a19c8a4c987864bd1ccbb7da69c0827eb96be72d8876a914eb60242d5ef0877365ded643c26f5436ca7c57806704016a1d61b17576a914f76b0b4fa7bfcefeb5fe3afd7b9a9648ac0470956888ac000000000100000000010c59c671a48d4da705e1dce5b3389808cc1a888462a745dc9953a9d4a04484f8030000000023220020846f9e291eda64bd5fbce7516ea4799ad31a27b1d3552f6380b67e30e4df6959ffffffff80a258cb49fa27857e19d635deaf174b1c84c037157c8fa6137b4acc95644f080000000023220020d9837f722576d4651ec89c4c1b33a27e3f2f79452e11cce8cf0f99010d6be899ffffffff0b7a0847c9a6fa02eb7951147fd32a1b7d23cc2526099bbb81547541764dda210000000023220020f500e9987bbd53173e533b2f1a755d75ab51a60e295c82a969f18ffc663f6568ffffffff2d5d20a2aaaeb3988e676003c8e98348577ca01e867f7d16f82e52f050d41f220100000023220020ecac0d5987111e095e2d3286b99d7359ad6d3d09b86b0616693615d4fb5c529dffffffffa9366b0cccc4ae2ead90d56709f566b286600a8ebd1dbc327c52fa2277f5bc8300000000232200200c7be94f26ceeab39c00458533e80c9429b5886abd84cf35c77d738bb7f42417ffffffff18c0fd42dd336d1ef7834fe16b9d11536393da04ad57c2d6338d06cef97e54850a000000232200204f36af5ac3067cfabca1ad3969e098be6cf9439031e53f4c631a310837f00c40ffffffffd3dcdd3c440277cac6b0546a3b98b4f29811cf1fcf60bdd9b0b8e0f5077dfb9600000000232200203c409926069e7be16b02f07e9594aaecc5a074bd18b81f746c0907f2aabd5f85ffffffff71c3a5ae3dcc57cafb7dd0ea33760a665397f83773a7505b03e86ff0f4f7b39c0000000023220020f72e30059c6198d152e469c44aa4271dee9ab63aceaddfe02b67bb3234d30c01ffffffff5f565c91a36202b3e0a30daa02d7d386672eef9e810248c51ad4b5de04d5f3b30000000023220020df221b0a96935b064e1cb9934a5d696bdb9b027892ab66160df0573089248cd5ffffffffa659633a3a877a452ca69500d1b37a58af73a0fbd434d7f18a0fa8336548a1c500000000232200207bdfe39c970f38bf1bb5bae9de23d759f1277d82743aa204a958721866734f97ffffffff01aeb16ebf90b8d5b169712aaf68b8a8fa5a6cb654ca20f15f8879a81e167bd600000000232200206a8b09317c277aa952759b9ac1f30b2821c3e7feae0000713c8060d33101aea1ffffffff7ae083a10df62915dd61f6b764a2b76814aefe172e3f1a9a47364e67f7b697fc0100000023220020406ede1a66462e61948ac13878d001795efe1c15b9086e1540d69f90b9651313ffffffff03c926120000000000160014d11c13179ef7129c4d3a14e481ac819c431a7c0860e31600000000001976a9145d13d0b4604b5aae2b1090c2c69f8fdab5ea8d4c88ac6f3aa9000000000017a91441c028a1747f9040c39c06a2efbb849446622c9087040047304402207d3c46941d58624a8d2c7c5267a98b7b448241c4c76ece6e30906e53ed24dae80220678343190d550856a89e8c158c2b8e10cb146802b339630cfcdaded9722e9bdd01473044022072835be8726bce101a0bde45c93cbc8bf27d9ea14e8a28f4ffe245568d0e2b6502203b218fca405d66bc484ff4066b5377bf48990ffa913f20f573e769648c68b0c2016952210336163af49feaa9908bc30a56eae8031e7af3da16cfb4878a927966d433b7029a21024f6c1f33ae2734591ce0a07c4a3f58b8fbfb8d5c6b490e30e5eb6804236f23c62103ee0352324e36340e5a1e1afc74b2384b106d242bd5f953d42ff33383f8efba1f53ae04004730440220603a30cdd81476e9a7f01cb5173629321d50f5ba520097a4d30e63278cef604c022036daa5e226390d721f30c93d01b9756b24884dff6f067c2717d1bd2131573d0801473044022050ab4d40bc177c9fe875583508dd785565abdab816abb95e4ced240be723abd7022021448dffd82aacc94bf3b363b3fbab634290efbbe5df9d02f61bf8b8224487890169522102d840a95f6c24012be0dde96c5d68c8f7b2ca4e02b20da6f2871d4ffe9eb1ebaf210290d0a7f001ee8290c0a445ca0034fe0778920080fa3163957501886c685ab27d2103870f8d8a7bc19c5602e68f34d93e15533d8e03722e107ad27976d1658183ad6b53ae0400483045022100cdf6e0f7561cb135def0db74653dbcd11f6f80e8cfbd7018f543237927a6ebc202203bfc565289e6b245d955de9460f9430d51f221f70937486e6ade31e1293a1ea901473044022033cfd339c55eefc21da5e705546e97fcd3ab6a0a3e10b7c29c4d8515643bee7e022027f14bcbdda88a28bf41477f9652971cb5877895b106fc737c7aaabdb0c9b52d0169522103272da1049807dfacb38efbc34eace0f3ef3c9829c4a0c009af527654ace8f2592103e88fdd1676c178e719d7e82a39618d7c4df1243ded60dc3491d47333d5386f6c2102258ca34f4de8f103d3d1b0515dabca2eb0f041ac270919aa3cb1d35e0ef0678e53ae0400483045022100815d6915b32f98c8bdde8f77bd2f9618e3bbc3f19f5220272ac942c6715013dc02202e25418d6f6fe6ccd277a207d37388440fbcddb606e9d525dceaf9fa8dccc0180147304402205b9c189f9a25c9a1fea431368e8581493141ff9371aa1034d08caaef8c4ea8820220109e5a7e620b0fe5130f4f1768087cf6cd39e54b091ad4dd30448577a1719e7a016952210326a0560c6ab7809c848ebcd7aeeb30276c65e7d058366236f9479f09c27f173f2102728f73637f043dce43d8123031d1ded3d04ff934572dbdf905b364a9bf1ea16c210380e6ae66f484e34dfcf0b627c25a47b0f27ae06ee49ea9feb21d2f07bf7eaef653ae04004830450221009c8f781dd121157cc7e6a8c74de0b01ded61d40afcc782762517d7e3d134b42402204ec153562a5ea6c277afd4e27a831413af31e0793dc07ee05c889707dbb5f5b601473044022072002d7b1a4bed793dd85eedc177199446e44a1c98f2ee9ea59f61d9aecfa7f902205c050544402b7028dc81ce16e26433d9319bb3bce799e2ed0fb54bcaedd0d56701695221032f39b1e6d4062b736f2898acfe7127f649631b491da2f3cffdbe5feb9085665e21022a32eb47c9dc1b932b1664ad4d79976a90b37208eb4308b6c93f1efcd3e02e402102f96f6b4ca584e68fd83c7541ad9a229dec4fbdd81bd2ad59cd524986415d7ac453ae040047304402200edee0f466413f4dcfc2e425db5c163fdf129c7dfafadf9e2a1655b0d503af4f022069d027bdab3327e9626e79c47b4ed934992f597ece9e9be5f9508ad623713e030147304402201d663f5c152526393457176d98d1bdeafe31e81f1883f17a4313fe5cfa45341702203d3ed7b565b2e94a3240854840bd5f888862c1914d6d37746d8841ebac7475be01695221022e50a32541069dd0aeaa0dfa60ca2ef2255d9cd92c1d586f29f6acfd07600c062102eb8fc1d6f772b61bf01c6f6bfb10ab2251ad8f519399c597b88350dfdd37a200210382659bc3db2c2cb58834488c55bab4fbe83570873e1573a9396e4eff7bb8c20853ae0400473044022037895b1accfdfb89f9110de7fac3b2f543012c3cd38d7c87c89bdea3c594bf6e022016abbff02be468824ac3d14f13c6a546d32b7ba5b07a0d65115dc2afc8ea4b3d01473044022067604f0c5da9abfa2b7e17d95ba509ae021b38b589a232ecf6f9ef1805a201d1022047f6d3b1cf53b17c58f9c80270298d191778196de50924aea94a5438968bda7f01695221031dbd56e81c833dcbc9d0d18b2a3a3d1fc02961d949ca7e83ecbc62489bceb82221023b283c6f6a6241a2980a8a9e19676430b481f05ac167a190f42118ebed4e07a7210287786a6673252ab56b4cfb0972feab43e5de8d1ae384630069e7ea28e56641a153ae040047304402204262d9045b3b5a27502f02c6be6e8ac5334dc702d49b7082f71d89e1cef45e0402202330bdbb859fbc7bbadde2e5bbbda8c0ecf10dff616524675998b4a1a35092750147304402203f7a6273d2b24bdd9f538856857f5b263e44bdc419a3ec8173d2af4cc77acc5902202ba3cdc1ec874d457e2b5c92e42baad6967b07e56ee9ddc1e752cef762d779330169522103a19c253672a964ac247434986a38272a417145ede760192e4f7fb981ab4b8288210233afeee6c4c99da690471bc60aaac8e87113d2e8d44dce5912c92c6c92e65a80210283b437f8992a31cf85e924609e8ac291146fd8fe44968c1a1af67a171d00ee7f53ae0400483045022100c2914d7d7db59398007e28bc736865988e107c033ae8baf89c1871024cef5f7f02207ad1d86c07613010eeba61ff1e6d2ef92519be4976c50b5248fab8ccb261172a01473044022031c4af4053b6572ac3fa098a6cdfe4a8ac6b3cc4cdd6d60e9f11fbfa7e379e70022077556599346fe16443064b973467042cbf9edb89753c6d905494337f8757c84e01695221029627a228230bdbc14dfbf1432ac23c23900a65dc3323621130a43ca0205dd43821038c7ecbf68bd2e22f233d4697d5bf4de39e8b00605f6babbbe15c25483b5b0e6f2103a43162492d5906712558e01bf408ad4f79a7394105cf1bfaf808eb325ece5f4f53ae0400483045022100d435cf25da64975f9beedc16b987ccc47c29a7c1ddbfe865ec327c12e44bb05d02204b1161f5d5ab7a7bb6fa91554cc8da702027cb1153dee5c1406be955524b7409014730440220513fb1d5afada5fcf9e5482b26b88cf86194f047c77624f444113ed03461fa4e02206d948cfda0831c364ee8de69d3a12e121a9bc01c118db24ed6a8eba678e012ce01695221027d3e8820c730c405b876b412feee63545327e4ecca2e1c241c2b9d4a51c842d121033e28a1b8fcc2ded9867eb34af04b482ccdb5a7c6bdac20a54245be30a2a8ab4e21021f48c4219a6e44f7888b166469d6a0235db6ac289b724d9e85bbc17f027edf5d53ae0400473044022078613e5546f2b2d2cdbd022252e1653d6acf4b39432baebb79cc100adb0f4e9e02204d38baca0b759450aa7a6b623d49614e9ad086857cbd1daddc933c9b0fb557330147304402204c0749ad90f3976b9f9c6612552b85b360912883b07a41eb5c7fdd305b788b36022070f1d7bb61fef65f5df7f3de979140c6987c6bdbae172dc0ac238b4d821dea7801695221024379b40a0b358752ea316f85fd0cbc1567efcfdb88e76a6c289239b39a7af98421030bdbbca0c7946b9476e1b2cd1a5433fb9d034ac60535cc1126213405324d23cf2102f759f8bb204878f8f3591be03c2c943606a357a563929569d3d94fc6f8a2f88d53ae040047304402204cbb3502dae54b4a187c37904dbc8720d7e500e71df08eeb42fb2e16c45aea360220241a780aacee42f500096161f1d8414111282b02de721c70b4079c15dcc046b1014730440220425646d442b4e000b6bc98935b2c378ba4a8975632139a1c1bb813d2634a3216022028011f7966468a4933dc97af7f8c386ea84d62c769bf82ff023e082b2c889c810169522103379669a310706d29a49c6e6ac897627f65e1ff1a898678c55b73bd1d8d4c262521030a7762bf64192aee0994ca2c680a05cc61fb596697f3f1bac07bc024396305cc21020b5e3f92b64c7f066e5b8b33ab495f0261dbfda7c0ef42110dc013946bec2ed153ae48a00a000200000001307e3130c037a27703c7a745592ac88dcc7d03e47b27226102eaf5e135841724010000006b4830450221008a00aecf48636a4143e03e44b1fba81e92d16885a40ef122c5d49c856d591445022077d5db6f1bf67cdfbb2a5169914e310f194f80b91a97db4de64f57604b6df57f012103d52f2adbc30131dbcdbd43c188ae388964549561297e1e1aa88ef8eef708a26dffffffff026a580100000000001976a9144043f71dd7c858b5b1ded1a675f3f0c5a873555688ac5a500100000000001976a91474a843b96aaa0242e9180b2165c56dc1742cdddb88ac00000000010000000001019f73d1630873a58f1a305dbe754f081b08ce0065467e624e66456d5ea4dc734b0000000000ffffffff02100e000000000000160014c780d1520cbf1b22c915ddf678943a72fac65b08e82400000000000017a914f537c414e606b09dd777deafdcf4409c99d562868702483045022100b41d16f2b2899a1d504bf54d9e29acb0268cd09a24fc706320c584d7d84751e4022031664563c480a23ae8dd6189999878a830dca082dc2b393425cb311e18dac140012103afee7a6095cab9f35e123913b0624ef4ff701b89238e11125332ea7a3017888000000000020000000001096493a50cd92df1152d219c08efa81227eed20b53455bc17c412246d7b82cf08e36000000171600148705e7dbeedc408c1b3c9365b250591fc8d2074efdffffff9a67172bb59f76282c581bef6f19934912a58d424c49eff4d8829697190234dc0000000017160014819d64687e96b5ad20b48f9bb040119bb8e5d648fdffffff8237478ff1531d819ca1561867715b49ecdd6fe80ff7fef032ce77eb964ad4820a00000017160014be38462f022e61614c9b553ff18aedfb1e0baaa9fdffffffb03a6879c1e5a32556bd2ae4a39282b44e06e965e0e7e19b0617d9ebfcfee16a00000000171600140695efdf0d16e8a3fc27321d7fa3f29c2b7c4ed6fdffffff0049c254ec1f7d4bf8558f6c055d76955e7b7a164564aa6b4928ddd4b64d15da0300000017160014d632f4b8aaa561674e90375099ebe25c536a5d05fdffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a4800000017160014fe8a43b038a40e8d2ea20cd1e9e65ff1df936c91fdffffff5010b7b51bd400461d7c9a1b4cb43cb2bced5c7f65dfd18d32c7fadadf7e2de30200000000fdffffff818258d106a72afbc79588ac03371e58dea497419674bdc3d8abe7dbbdb1a5280000000017160014ea3ad34cb75cc4f3ca7d4891f839b534161eec74fdffffff466118b8570d0fa986e936875a938dc40e50359fc5011caa58f75b2d837f4ded0100000017160014b38dca9f79d1a0ed24a0970dfa963d558012f0a5fdffffff03a07bc901000000001976a914cdff017214cca8fa36cb98c25b57d7b167f793e088ac0ac81600000000001600144a9d276b645a0808d4eb81c086ad74a2039068e6658713000000000017a914c13559c674a3d6fd6f4810e9e14438387da4e9218702473044022053651b6c0d244797f3873ef1f64b94458ef16e56762abbffb502e13ce15b4d7802201e09434815b6df307a62aa0102b206f4e4848ca3d97aa89ac058a8cacf087535012102a778c02e0a471a1a970de7bc19e158a8a74a4b2ccdc09572e40daedb12a8a4920247304402206dfcc1a0b1e753f7395e0ec78f8ce33a7819fc02011f8363d3876f5793a6eb8e02206772a6ad32b24da14f3646aea9affca9f3a396ee1c2cd1f815a949502a8077690121023b0db1a27864daef196008d07b6a06dd85f7c4010d4465f857d2c64d9c7503610247304402200ede11e78c7d1694b832b4b4053e7434f00d38266b2d68ec4634ede0a78816b902203b4157bfd3b06735cffcf957d096915329ecd973e30edde4ef01b6b262f1f71c0121031f02523dbdedf555a701ad499389fa417deb8646a1088f5fad3f969ba2c1e21c0247304402204fe8bbc697133accc1c51082e10a125fe9b07e35f0e2a04e54d761a14091874e022035a79a0787d8171dbf21960154bb163541b501f0c5ef4045ac433cedce3af4ba012103eefa28a7c11c25c71b5408f62a03602ee68b25aecde180578ff72b7fb000b6eb0247304402201774ae8381a18064c79a877235f229336cc96a45b984ee0c104b87347c00bd3902200e403d3fe586ec7e795f2b7607e1a006156617839d5ca4cc8b63522d9b4a349301210377fb65441049a730755c9c2c775422588795779e5cbb5fff2722b5825091ed720247304402200f7c9fec93632b42f6597a24610d03d795c7b05c12098eaca91a390df9533a07022005f4ac63b770dd37fc6aa9c2780e83d56b92c055260a0c096eb158b4eb97aebd012102e7c3a85a8e296dd14d51c9a2be9bf49cced6e1ec5917b76ecf157e082a1f32e30247304402207bf2f685c2f61299c699f39a9f2fd045a899db17182859e50fed1785bf0c310802201c9e670799d0c6878b1088f3c82813e6d37711a5f51c533aaef4036cb466908f0121038d5a9d7705b6224ed3a74cda77f485f3b0c41371d2affa7e8a1a59f361d450db024730440220533bf02d5860da1be3a28a9d899ad75b2d223fdc4bd0aacbaa3625618dfb2a3d0220617e0c724e913a50dc7fbd3fefecec10a52323cb4b6f54347642ba741fbbd05c0121025f8261f96a4a4ce21bd989f18579ad9cdef30e5df7501bf19c8eb4aa3eb148460247304402201017ea2934306d4eaeeefe8651bcf0981bfb49c9f1a4b7167de2d452c2ce6ce60220595cb8f23ade144cc7e08ff7ce440e01126d9c82ac3cf3b38104bee4deca6c6d0121021147a0653978a461e197edf09c94a67694ddef85d6d5198b79e19d7615df201a43a00a00010000000001014d46e1d6861d67b9265676ccfca8f8f97be1e08046af93a544c1a343aef76c1a0100000000ffffffff028654010000000000160014c3ec13d9bcffc63d8b991f58862d9133070a54bf806d15000000000016001435d3f1ccaa90696cab703f2fea7107a8d980dda50247304402204f680336a43ee2d4c68f5daea8628af143bde20cb0274a6f76d544fe69cdefe102204033b5d5b2c67f813eb7f585dd2596c7cd788f474e856666bd4fec34b5fe8bd80121039dab68c790b4a373bbe854830898f2a196846b01c82d3751d388762fa28152180000000002000000000105155d9d58a9df2a06af2cb120ea7b3d4cc4b87244548f107c10b0544485b2229d0000000017160014db98a9df909b2154c0316401c466e5b63727c22ffefffffffae09dcc703fb03ffc0de6ddeb13d311c22b8b0b715e6c8ea04adddffc6d76dc0000000017160014894651b3a70040412374b5b6519aaac0eb302d95feffffffad2b5e15895597c9ba75d7596306054ebf2db901b4b6b41e7951d3a3a7f5c193000000001716001428605b184986e715b3aa997002cf01fa9f9b8594feffffffa456d2867961136cb699ce7c8eac879f9fb305b15169f134b45e33e271bc70950000000017160014af7f2d21f07b16b82c5daf8de93205ce2fbf27eefeffffffcf6317cc59736cac77306f7de907273ec3e99667e85b8d5b8c52707d3132785200000000171600141c1e35e3dacffc2b60cdaaf6647d8609c027cb18feffffff01d9ad20000000000017a9142f2797394910dbe0c8350e7b562930774aac5217870247304402200b325ace9227c0a8adb08fec68ffd48076f4303f6932f482661a40b109f70bc9022019f0f7f682ea7607e631b5c7cda1e056bfc77d4c4edc1ac06c13bf708f8493f0012103eca9a710f88bd232135c945545cc72603326b0dd30336ae6e9791381da7cd4d3024730440220772e2aebd1f5f5cb48247014deb13c9111ad0f217cf97832a810f10b2ce1078f02200bc9a9f91784d029539d674ae49bfb691218ad2087a778ad2b7cc9a87ed4673d012103625bc9ebfdf7e0f9fcac0f0add4c01bd266bcfbc089e8b414c7c7366a285aaa702473044022072d1d6f909acb17ed0bc177f245cbb6040658d4c46eb68d3fbb538f601031f0402202c7e15e876b42e911b1dbe6a9d7e0703dfc890ae4031c11d2a4ef8ac62bea683012103232769cc9b84f02828195438a8091b5887f73d5036388fe916388e6a152c34fe02473044022037472f557413b51b83da4f52b155cc48917571d2051512b7c95982d2d8ab4a5502201ba9a35e1710b0bf4fd3f4dda6929f867ce1cb2f477cd8afe81dbf0587c60a22012102c6c09adee2d5bc793ab7144c04f5f773f493437d5ea3b102e2a3fd8a64dc20b60247304402202b0e24702f01acdb45763bcb9fa55d0725d69e72f74dc25c4064be67f5ea84ef022048443810897fda57a6a9453ffcf870fac8bfd04d4c1b21b91c338ffa7d4fa5a1012102e691bcacf541a0ab846eb6edb5f367fe8b20e459c2fa2d5593c1a41d4d1aa60148a00a0001000000000101b0e242de122280ea50f7b83195e2a4c84ba8a3ee654a8eb3b2534a27b156f6570100000000ffffffff0280971f000000000016001427efe225c091675dfcf70439aaa579fed5e379d8bee605000000000017a914e842928007b63c19c80d74aa4a7f90ef5a6bf31e8702483045022100de75b888fe55ae96cecd65bc13a2e9bc6c4175d6e25317549f8450e3667fd33a022017fc799611dc90b96e41cfdb80cd0275ca119f38adeb35e9a819fe5046282ad901210249f9854d929baf6db25829cca287a2aa03e4060cab809167df41ac17b1733e8900000000010000000001013587cdec68220cbe52e4f48ce85e12fe2fdc4ca4bcb35390332f2665646712780000000000ffffffff022433030000000000160014f89d7400fb31e9260f1a33f73a20e34508c5868b16ee00000000000017a914c001b3970bd626458e0811a2cf60c1c804395f0e870247304402207949225c0b7aed56bdb0d01f402aff19bc507bf8cc175b5607ecb9096796fa51022018a5014f65af10d65103ea7f03740895bfc5f13d32092f6c38ac447faa85b4c401210387c6b53fde6a85c594625a3fa8947c5363dbc0c132172c88804ffcc75ddc1e04000000000100000000010243e5c7c92c1ab9c5596182a8854005d5ceddf6372be9b54f62d7e2c694bab4c10000000000ffffffff6ad59c856765521a02327e130cd5be6fd401cb4fbf66630535883ada205a7ee8110000006a47304402200c3594a8fe3a717f57bcfd3848b678bccf245009089e27e061008cc3c5ac40da022047748e6d15280d64bea5cbd04936e5d0d465a235842d99a16c9f0587d31816c9012103987f28ea43cbd8ae08fd35d7bd2b3117df6cf1d875bb4c4c74878a3a7ec3bdbfffffffff02b0f905000000000016001492e9861aaba866c6dacc643bc732ebb82d5566004eac00000000000017a9141b709aa250f20ea78ff31566021c58f59eb61b2f87024730440220074bde0d8e4a634d1f5eff5e7d0be60193aee6d8392409f976f3b45a9fd559c5022016f7504989e530f78192a51e81e7e70e21f70c7495636264e99523872734d6b7012103910eb75b19921034dbe3c720885e7638db65da7faaa9330fd3201d386bd91308000000000001000000000101aa485f9fc1f556c502d1005f5190dab0d76391628db516edf78a75b9f29bc6160000000000ffffffff029f2d0100000000001976a914e4aca1ef1571fe701deacbf30f34c54446a1d06688ac38c8040000000000160014c1b007464ba95a159f0c40294c5a539296e77700024830450221009545127a0d8f9747ce54619d4519578cd95574379fb28eef113f084075949cfa0220048e741cac0a63b3ce313bf98568e9fb25f1500b48df02e3f85fde43248fa650012103adedfa80f9e3f7fb517c606d934e45360c6b8e9e70f495a5bdca45e88175e9270000000001000000000101f55b438571f474ba232f20b5e69daaf41aa83bb39f8df96728ec66f5e29092bf0100000000ffffffff02fc6601000000000016001495e1723387fe03fe2a8327ec2fa75d55a232123c915d03000000000017a9148a5fefa6b3847f09f0933f422fa1a82c75f0907d870247304402203a26308a3e14dfb58f757657bd6231f2d6a78e82ca68898cd36937f37a1910dc02201d66cc34cdc45d16f2b7fe73941b4f781b7ca071ec74747af2d2df332dff96260121030f95853bb9af8974aa074ccfd7fca3f365fe2724a47bc936b5ef4e01c91bd29a0000000001000000000101ba1d85d16afc32922323f54e8ce40d12bc3a9a1662b2a664b0eefeec50d51e0d0000000000ffffffff02d0b6000000000000160014c57f23a6c17ddc0b2d095dd0d402f470e9e11a094cac00000000000017a914673f53583868ba05fb1e001ae24d2daf1613df0a870247304402206fdb8d272d7dcf8cd47881df1729ef33d136091f6702c0448a92afdbeb1ac0d002206d7112f13e51279907caf33c2ad2f9a167b9563abe5fdd79b165faa0a3f08ab3012103f9364701dfbed8c5c033166c6a6e9682ca860fb11719e9a6b955a1fc66bcb5bd00000000020000000181791259ec826b77b4f4e48569b3d7bd3f16aec22fc2bd8b45d6e97fa49b3666070000006a473044022062624e91eed387c3abbe59aa04987382b3587d054d20b50e201a8386f179d65b022030461a5e1db0be8ac8f522b8f8c5082b3034161f8296d7dfb12fde644c2a3645012103652315d9d5c614bb623fdcaae7a4fc16a2386670b71bd060e52919fe03cfb17bffffffff028c1c99000000000017a914a5eb64849a076fd50e4c74cb067bb953bf06ed3c87fefaac02000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000011eda41ba9d8aa27622dceebf93aeb87d869e14de8c72f9802cb886e0d6309378010000006a47304402203ad5c05bb7cb0a2254ecc74431d43873b96220b9bb89e23c601d9d552a4cc7df022014a2fc326984a29f586d572219e8ffb61f91fb9fc4a320c376f5e04fe6bab817012102302b56d06cfbf165e37e023865eade534448d28c6ffe6a2faa7c1519050eb89dffffffff02d85301000000000017a914b35aad13ba9184b56b78a12b2930b74b5cb67b3a876d190000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001c96510c1aac106686a0c9c2393257a5cb5f49406b010d177f7e60a76b08b1fa6010000006a47304402203efd6e5f14607b227e19b807177fc01dd9ce2ef0016de2d2c90bc234081c54ee0220247e28bba34c1eb82791d99fcd340a99fc9f2745e2998753ad2d59176e6a622f01210255cfae3d325652ab75861b63f329908f3d85efd8e070b67f83ea411b6ed399f6ffffffff02b0ad01000000000017a914fa08be5ed8dcf22a4a60ec8597249ff82c62c09387880e0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac000000000200000001b1c8b92e6cb2d29ba609fccabd1d15b231e881ad2d24ab32d4ae2d66d484efaf010000006a4730440220177dcab9f4b322a6ad885e73a3b88c922753c1c6cc4d304efcd573e19d73ae52022048bac9e9237a26fa0e224c31a7dbd24b209a366a62277317e6fa892028c22173012102894394e5ea85f1c8290b6ac62753bd5091a43edc1bc441899b9406d2ee535091ffffffff028c5503000000000017a914fd2805888e1fd0a176d7186d9af874b0727fcf1587800b0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000001000000000102ff2bbb4d35126d6f3bc93d52108fd7217bc4f935a49649bd3bc3c82b306ebd730000000000ffffffff304e2ca41f6b9c91eda05544bb5d0e8972f6a12d85371d69fc663c72fdd2f7fa0000000000ffffffff029c080000000000001600143fad646cb8b41f95c749b7b8771a286434671ad9f81100000000000016001440b1664e8d859481488bacabf25643b21664842d0247304402207d1c1560b454b1c65d0959c8930998f2c457ba855760f972d18c706522310915022007540bc7c21c229579642637812cffe840a1e709bc56d35efd7f57a5d32692d40121035da22331110fcea6495e8416d16aa989138b0887a58223b69b7d69446b062bc402483045022100d3240fe654ae2019e03544552df706089fe3af7fa3ae66ca7826f313c5ca87200220268f3f7b8a5cfa1f62320722fb62d4aa9c1e23da8f3edec633b1bf8ca56f1e69012103d337d69bf9c228ce64a0d1ef2678e7b6ef501c2b6b871be1e95d5aab4f9cb875000000000200000000010189b4795dc188c2e492c694a8dd99f98be6360c96583e21c341b5ea79be3271260100000017160014b38f1461633a9ff97a42b579d4782a8f34e86659fdffffff0270290f00000000001976a914efaafd399104ebd506985e715fbebb958dfbccff88acc74deb090000000017a91477c255f0bff6aaf692cd44d7703088fd9e62fbb6870247304402201709331fae03b5c5b988d0fa9172444d614d540b10ffb0ba701c3c71453881ff02206eea505ae02945829011502b79b9e0cc938a05995b44ce5cd974864ff228f26e012102d1abbab06832837a346cc83764c79a500f1ed68a53f5c4f64a57474989965ac700000000010000000001016997cf6c0d52a24e33d6bf9a690ded369c1fee36d3c730ede34390c6c8ad93960b00000000ffffffff02ce2e0100000000001976a914e813aba5832887a2cf3c6aa0f5e13467c960d03c88ac37173900000000002200201603bb92a1b8ee5c6c058c7d56fbb41789eab0896b273b4111a43e1d5b8d46d3040047304402202b26bfde0320cf168aa8548bb3a00220c2b333a787502eca0e217706cb15394902204b17aa62fb539b1cb7482fe16538ca68d1322d1467b0e6685cd0b0b2a6d9efd30147304402204db70536279c508cb7bacaf55e23c8c1f356f1aaf05bfbbbbf141bcfc29cab3502206374a5ac8d370cfa9f71285b6ca854c7b5f9f7d0b1553a4e9c187bde680ff62f01695221021e8a11ac5283f98c0fa61ebec7d7fd949a89f6eb3e47503716be10a12bc301fe21026cf4288ebed3e082e0985a970bf4574f620617a9287ab91c57befd43a0315398210337fda1ad2acff7015ece927ab34fbe6bdf7ccf7bb336672da0062c4c5c9c6fe053ae47a00a000100000000010366b043d1a03e07404291bca08808e70c8e9e91a3c1200d30eb55b1eb2dbc6bcd12000000232200207ea842690ca2ead0d1bef006858223c3438fca85dabad967fecc93966cced8d0ffffffff234ccbe7e038c3bbd516c5f394da76c1c11143e87664e23614a4482a69a919e70000000023220020c146d902d78d87bbe92a90ef46cf789f97f72bfe90985c92ae4f8fdbe099ba24ffffffff288cf5a27eb4f8ac95d1f72f70b4cf52b0b05c5dfaae23e91e49c6c604b3b2c218000000fc004730440220290427aed6e53cc5273e633cc3c33538dc838747ca14af15fe04a791b60a2196022041cd8063065cbe98d8d55308ebe663cfd558dfe774ae52c48e9bd4f402d6c9f601473044022004ece3bad29d180ebe2d3166ee8dba674df99821c8a19933a47a0f7788a67bd90220304eb3cb30470b7c12061a808ee28ad81851c6698cfecf4e1274bd1e9caecada014c695221034064875fe36bceb6a9071c090ee29ad2a4c79822afdfbb8435b96afbec036f6e210313f2b36b55c1e7cbae75e591bb67490a4a54f241356d90b34895b4b89a7fa4382102b53318d8d3795d995d263ea8cf38f75b7bc4af58649efdd74203c81fd6a3cfa953aeffffffff0432b200000000000017a914c6f3faad30ac25b5278b994fe458a55c29599b3a8788900000000000001976a9149c69b81ced9891320d7c11bfaadc7ddb5a536d6a88ace25e00000000000017a914fd8974dd84d4bc0e4f62b82ca8d4e831b4cb204c87eee60300000000001976a91489ca5f513a7c05e52320d912ff7c7240489d142988ac0400483045022100d4d81a90af2c484855141616de873876cd083dafc828346028303822116b40980220530a3ff007265acf822ba47a737d23eeacac637284e080b285810271df8379a901473044022073d24b9169d32a3b92bc59981f45e1b92164913617a14bfa429a018a37a16834022000ac6592c480074d87302dddec5a2cb6f89e1b50d6f60a1149aa69107d012f6401695221030ff3730fac2aadd53c537ac10e0aea13fa9c12e6ae6478b9c282b4a19a6d5d7221026504a3bb4e661f5d5eb18b91bd05c3773ad026fe7a1831398c6a649dcaf7f8582102bcc09102bf0e6ee32d2e63d376fe6b45fa49996668793675f10c54e690f4559753ae0400483045022100859802a0a8a96d6b674bb9d54406d42c706eb2d5a83c7eeb345c76c90851abe402203ba6da56dd4c8d0db9c17dd62f984bf04bd3655fb71e63945390aeb909e8068f01473044022014aeec1466435c361d248bd310ce471d49d225107f0fdeb5213af4f9ad83aaad0220128fa4e630d6d4486c2f23c4b24818af7af20549431f217e032ea76a74e1f3a60169522102b945fb24b450ead3b05dcd9a1f228b1089b6408340af83b749522ded429dfa87210361093d705466e92a2e81926055637479158e4f706c8cac3c0eae4e738c10f77f2102a7f5b8f752df9aee83cbaf455e81cde457dc4326c18ce6ac09a4c6313b90639153ae000000000001000000010ad125bea83c9b4ef99dd56352d1cd8f620502ec7518b1ecc13ced2142efda65030000006a473044022047406f9bc2a91ea04368b4e4296d423762149887e40e80df527129a74186169f02201d6f2db27f10cb8415061f482af667eac23e81efed08b8bd30d8fb2854262f560121028d254e09b9d37d1dc6141e4c242ce300b6d5bd0510c0173e1cb5a7b9d4fb6ad6ffffffff0164df0300000000001976a9144411e188972262754dcdb3acb2cb87e0829dd85c88ac0000000001000000000101149cf920672add1430f8d9512b7e70b1eec0460d7603dee4a8fb09def6253a6e0b00000000ffffffff2e7bae0100000000001976a91487e5b86088953ad6f11a874004b32534d10c354b88acb0ad01000000000017a914a751dedaf04c99104ba1b38659d7dff23e6c2ffc87c14d0f00000000001976a91455c887df1e03bcdc0917547c1cd30136210f912e88ac91e309000000000017a914a8ed38beac2b65b187e882e5c653dd986ef2bf7587c2e410000000000017a9145823ed0d7454204b94bf927ab83cb3ec1b743da487bd330000000000001976a914f22673232c50f30ef4e17bce557a1e10d94d5b2b88ac31ac0000000000001976a9144fea9d18eebfc5c9e68919d38aa75ca26cc79a0788ac445b01000000000017a914c2bd19ccee26ba6f3a2bba786d103eb8bd2a780887578100000000000017a914acfec294ef497a83145ae39f37867116809f216287b80d1e000000000017a91459d543dd3c655adbf2b3aa3b7d8bcc5a53f9360887eea600000000000017a9148f2c471e2c544b0a1fc5fb048e6474dce7bc92f287ab4701000000000017a9148dfc7dffebf1bd541cfea82635b36ad706b8b30387495e03000000000017a9143471ebfac03d0aa418673c6bc8c43ac57346adac87542d0100000000001976a914e3375f8081b884b005f612b663896283002e6d5288ac89bc0100000000001976a9140fddf52da27c2ba941c35339cff66511754e75c688ac42da010000000000160014af667c6f73842ac181b46c587eb839f5ace39449344e0c00000000001976a91438d1714ece7410ae6cb6286f6abffaf05fbd450c88ac90861200000000001976a9149540e61e7a7dc6a64081393bbd4e6e26a6ad4e1988ac1e5600000000000017a914e85190873bc59e9546d9b6aeeb7c16577032accd878b02080000000000160014d59b4e18e119bcbb5b160060508f094432fd37e1533c0400000000001976a91451fa78cc3730a003792ad4b94caa233c21c939e188ac6cf92000000000001976a91416d468200e3c1c0475c223bee3a69722c6aa464c88ac029a08000000000017a91403b9a89aeb94045fd4aea755d120b04f86fbff9587e50255000000000017a914ae4b6b9838366ce693850fa880af12b4178ff01587ece901000000000017a914dcd3984af7c33564c5a6cff7a8a797c8a436a2fe8771ac00000000000017a914f8459b304ed93c4e5d9f13f37beaa5575eb85b148740c5030000000000160014bad7253337b7e7ae5e3501bcdb035b2eae6bcc1c5bc701000000000017a914db8fbdc1d97383857ff23970a947602d5c8b665187ac6803000000000017a9142bb1b71d7c7722b362008e0118d776cd2bfce17a87c32a00000000000017a91446234624bb66fb59808d61bb33542c678f14bfdd879968200000000000160014dda973b9acf85fe3e5d39157ce2668e709e7aba13fcd0000000000002200202b8d5554ca8305040df361b83cefd090b2059ea200fda04b40a281255da861e899ac1000000000001600149348435d56fae2f0bf9bb86962a4cbab677e993b4daf000000000000160014cd841c53d11bc1b4265eac8088e423d3eca5f9006cd71000000000001976a914ad9422cd8a905da4744ba1e64d9df18e63fbe1a088aca747030000000000160014357e5c4471533487bdbadd3db1ffb2915d68a6dbbc2c2000000000001976a914a527dff26c83b875d3a020a404c35b7d9e5e716988ac495e0300000000001976a914df48f8925b797928b73bcc85d008cf895aa206ed88ac893302000000000017a91466ee143f44cb610d9263d976a78c9f8d02b36fbb87f89203000000000017a914c2b8770e8dfd03f32c7c3523dffb192cd8cc3b1387d5b919000000000017a9140e18abc82dced9bac790e32184b12826ad143201874a5600000000000017a914e6b739022ebb083105a680fdc3295d78f9e933e08737eb5f2e0000000016001439b0a08166b7a9f6a0a90af32e36f46b8f80dc28449b01000000000017a914b3d9919da2bdd7d593435dfbc88fd0603abfc1f98700ed310100000000160014d8d53e474690699708ae82bbc4afa2f492eb2372ed4c00000000000017a914fae42ad99df051440792b0dbbaa65380a460ab528702483045022100f93a2b9f445727c50a95c2bb9a9f07a9b9a1afaa6390077da6f4dc88887f41ba02203dbcf7992a0d326a271de1fee4b096658253ac5670b4b3c8141172b2a49f34b301210271c48bf025344076b7925fd86bcfd5a65bef3f48ea0009801e804f28acb1cf6b0000000001000000010d6cba687de3f267f85dfc4ce6d5b2a31b5e8f212052b88eab1832d55136621a100000006a47304402205b3fde1a149ffe79783300d3067625998217bffe38e7ebff84f89d3086b3b81d02204faa251c2cd3ddc5b0d48d48fd0143374cd3ea7b24b8242ffc7d2f3e1c3d5a9e0121027eb191031f1b28a8a17d50cd1f981424e5792a8be8c4ed8d6b87715e9a0c32f0ffffffff0188480c000000000017a9146ecb1b29efda871eded9dc1c6b3ef7d6740e52bd870000000002000000012c4cc4242bb01f844b46ac5890c889f5fed6598d6a05dc4ebb1b01d5ec3533f30a0000006b483045022100dc4fabc20e8e119ad83cdd7fcfdb506362977dcb1a15f66cc8822914fabfa474022039fede7bc36f3c6262b82886c7bd7b07044520b25cd1c8ab87b782cbab3f33ba0121036ceb0f22fbeae8f9afb1bb9e96f7ad8e587c51211b12108f2e9e00f5385e8972ffffffff0101ffa500000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac00000000020000000190cf2b80f8e95bbe0ab755ebc9a036e04105248c4f0f36d1981cadeb8b305aa9010000006b483045022100e4bd0bd763e45a98eb4fc9fd3ad6649452a3b27598bab9325a0ca966723ad4d002200a6fdf80546d36c0d30d05a3232b0560f692b92320df0be6f37ecc5b7816ad870121020bed532d79c840a3451477379edb2a935161a96ce49129f9d0083e58ee0fbcc4ffffffff0101043d00000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac000000000200000001eea3ab90fcf025d958069456c124e452a9f30172e3c700afca6f5ad1b6d8be414d0000006b483045022100bb04e72dadca4a385980881f15efae0c0b142f00e290211c75bc50a7cb4b41570220335a91059a8545274b17bb42d946efb568257a7b54e5e593969a756450e53107012102f7d4414ae40226362b15681d02aded75586d18d21bcdfe3abd977b833e94e8e3ffffffff01c2823a00000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac000000000200000001e19096d743454269c733b5ac5fae23f94949ff5cff2599cfe6f6dc9f05bcc7b4000000006b483045022100ae76f56c901b7bfcd887e8a472af8b830b3c60f0c24c5c6a693292548c61833902201091864a5cd43aabb0bfbbbfe13fed06f0c4d04d871bffaf0030a434ee5df426012103fd7f43a80388cc5572fdebec88e97ed3edc7709ce50802a5881a6f826e7b0a2fffffffff01c93b2203000000001976a9145f972e8b3c05bbc840cc549ed8e9bc3589abbee688ac00000000020000000001020b604f1644831926ba35642f6f5344a51eb98848c3d1ee244dd1be9f92269fb3160000001716001487979bd183edbaf7f450d204677f9174ceb5d6f4fdffffff7738193923ba42fafd17fb4f986faa0719e9ad8fb3ee0837a3a24a29bcb334c30100000000fdffffff0241d6b500000000001976a914d5547a9a6206f711495fad89d72f59feefc4588288acb86c22000000000016001404af0b93fd5bfd9ec35ea00b5c61f0c442394d3c02473044022028891d83556e156edbc67781dc5c3c595fbf2723fb3232268471b060c936c99802203a4d38e70ba0cb46a98cf7c7d4469cd8e555068617449d85dfc1c6459e77561c0121026b6b2645d882bab4762f4616ae25092905ebb416bc081c185cb0557ce6f56c8902483045022100fdeb19e4f7586b2c4dcb37b7853d7d9f9ebde27fbd71a5de60774ec6ef9f9ec802202b4498a7d9dde1ec27eb2f7d873143c1f4aa61d15c8928b4a33515d81cffd1d70121030ede538e2fe2de3da58ff421e99d4675e44bf3eecbe8c80a1c8bed1fae59757100000000020000000001047797f8e61d1a174c8d0bc8b111df28f656ff710fb1a6ca9e60f228909d327d86010000001716001457d218846c6caac649a3217d604cf6fafeada08bffffffff8076211da9103c32d936706365f6058451791b11a38dd1775557fd0e9ae7dc75010000001716001485934a49f438c750dbf9014696589c4e10588511ffffffff72157e17f593574805622c24c813278a777bfc228d3f69573273f86414fcf26e010000001716001491f60f654cd1d24fe38bf75e508c6417acca2fa8ffffffffd0576258002844671264730287300292dc9a334c93493229eb7970e36cf13aab0d0000001716001485934a49f438c750dbf9014696589c4e10588511ffffffff02a0a910000000000017a91450e2b49be3eaa338658a7a9f059db82dae3764e787509800000000000017a91439a08dffde67a1d7e6dc51b09711da23576d2fc887024730440220619eae8741d532d7a3422f47513e0fc539b317af9f074b4b78199a997da4bc2f02205cae09c3fa299590b297ba56ca4a1d096ae306c204530e409b84e9fcb8ac76970121023d607f37dc9b8fdfd2d70846431f05b098b0f858377ee96b7f5d5ea4cd7c25f50247304402203191c6d9b4cdbece38c5d355ac8e17320aa1bd2ed3bbc340a1470c901e4f18a0022024abbba4e3172efa3a36a49ea56a45ad70f7567135ee03096f4f7d85539a9b98012102477d607ea88b01c2c3e2d709c745b4c8c18889eeb38f83c4ac1884a88bd659ce02483045022100ac7ae13179fbda25c242448fadb0ee465bf79a43074aef288257d1f39111551c0220435ef92b302a1e2449bdb36169d3d4d5f2ce62fda2ca49c0dd951991fe7b7b4301210355c0ac667f4637881cade11ef45c381492faaf2f13dd6b26818e40a72a06222c02483045022100f53aed2056a9dc0cb4294d04836a244a2df6988d8f43d4adff2669e5eba23e25022028f8a080aa06466a01670c246d6acad559d73c7dab32acda2140c102331975aa012102477d607ea88b01c2c3e2d709c745b4c8c18889eeb38f83c4ac1884a88bd659ce0000000002000000000102f5c8ec9b41d57cfe42000f1267e2c7849c242221e5101547c85697ba3cf0314828000000171600144d797492413da145adf45365d51e76f91192fbabfdffffffbc9e1c75b6ccb86a9a895296e984de11f1ec58eaf8ecf43c0f8f67555d5478b00000000017160014c37bebf3af25c3097bd18db3a1fe56cf5b9b7a0dfdffffff034c6443000000000017a914cf46019832362f03224e98890f6e8db304c516ba87bce360000000000017a91411db5dc2e21b8f31c73f8d06b3c55a760cb67243870cb321000000000017a9145e0857faefd797380c228f61feac589737119f01870247304402203c7540cf3c747d715b7ab4683040dab435a5420d96e89c9f903d2d93da89b64702202b90518242413818f4bbb93831dae382f1d92ae6236050ac666409c3f9346aa3012103c06f1a269cce5118a7cc403ebe4d160042c4a9d73fc643a714960372e1dd6c3e0247304402200c2d14b11a9b82fd50db6849ee3f2aedb3dc5e6399478ef4be9c3cd904ce030d022016d7abe0120113b4b031c9939cfb28592d68694d8d1a54e4db3fe80452458fc2012103ab20345840abab226e023f5d63f095df230fd3474f3a97f648600f29138ab55600000000010000000001011db08a41b8d41ae2d53cdbc5837c0531fcfc5c17f9530516bff951aab37a21eb0100000000ffffffff020bbc06000000000017a914d4ba73583e4d6b0a9e6610d8db3ac2d3f77ae14387309d0a0000000000160014e1b3a24944d30a66cfbf14b471b335b2d871a65a02483045022100e860c6b119d9ffc0f91a6fc3a3ca1df4b233ca30df53439aea58d3f0dc5dd79e0220744000d6b92acb32da4a48d694c4f394ddac68c56946c72878e5248f0fd5afb5012103b2d195b05508ea07de6cb6a5429e73ee3ec510df103f6334c470f571225e83e3000000000100000000010136ffc5ec774294737afbe8e4335b921b803815251958e3b4c710a29cce606f890100000017160014d9da439f13ec6e2f3ef1373cb7e5144423421c54ffffffff031a4479000000000017a9149d524e6aa6d22b611f47d9a6feed28284d729cd38770360100000000002200200f9bbbd1b649e5eab7525095681449afba2cbdce70941fe4fcb09da499298737aaa413000000000017a914d7f1609034d28818991ffa960d149bd4f6400f7b8702473044022033c7ad81970f1bd3e835e220fb88612749f27322b21825aa700cda16c3a159be022003db4d12d01a02ad4ba85f7ba0e56ca78f685a25e79a934b03337afda0dbe2500121033c7a82aae6ded86ddcd8e10f3e763c5d5b40a817de867f5baf5be888018fcb300000000001000000000102ece19f69f0647a6cdd5cbc21b0645e1a6b97f9874039ffd3cf6d1c0ecaf0ef3c02000000171600144fc17a4b29200842b594576a1bd2793279713f7dffffffffa9dc172081fe0ff800f9ba47eeb9ec95460d2835ddab452001cb7b74519ddcb50200000017160014253fb503053392c44fc42b8961aa4fdd0e8758f5ffffffff02e86d1300000000001600149d9a9d9067dd5726909fcf4be6ed0588af02bb95bd310000000000002200200f9bbbd1b649e5eab7525095681449afba2cbdce70941fe4fcb09da4992987370247304402206e90fb942f18cfbf6094c6ba6a80a807e17fe886726abb3092358dc37720ff5202207f37b2e8ddc7aebbd8a83b856465da198d1e181358533e0d347673bb09979944012103ea78e8dcc4a7d9e3694a688445c8d5fccea83efc1740e19cc79abc8fe83454d902483045022100b44bf6259b9789258886802855495ed82761e4179d88e25938d3bfe0a8d9b0a5022013840dfc42a5a3df5976eb69fe5c4a8ffbc67289cf40fe1db6c36d2368d81c310121035a8164eccd54245e573a6062d94b2e74127858b922dc1d0f07aaf3d395d66be60000000001000000000101ea6a566db396cb5c6e1d208d955a9e1ba762bbe54d0921a7b5fd863637d6f3db5300000017160014a8fa9170a6df383c100b9e3e838f058166c19d33ffffffff01915a03000000000017a91498dad9eac49a7a6e25c572900848b3e45c5212458702483045022100820d8ff3153d2dbae6ab1b4e1f39ff47a7a2a0cc44f37302d628ff4e3ab1731402202538a2e3f73e81c3b3182dedcda57cd35588cc388fb812c4dbf0f5a2bf5bd5720121036a9d475da26ea78d4662ab38afb3f28b38ff7b1e2cb4b52e1419cf39160ec70300000000010000000001015e273dbb0127dc70f67a5f2653db39bf7f84d41567f536b144f49a3fbe3a801b0000000000ffffffff015fd20300000000001976a914d2b29f365ff9539a5f3f1174e6c30798957f0f4688ac024730440220313e4a8d50246d5c786c745ed751c1b42684716d51c971afb406ac10f9948a82022034b3f889931a76356220119779c9b0c7b6ecb6f234c6cb57de7eccaf79166e410121031b844d3d78a429b4c13ad7c2a24b47bbfb58a02058caaadae5e9dc8a619aa9b50000000001000000000101e48f419da5b6c13a6ed4eaf0971997f5c3b86238d3446544a1baaf7d3e9c4acd2f00000000ffffffff0157890300000000001976a9147910cc1f477cf05c279c577667938b100630e55288ac02473044022067e053b8c9123c73e6b6bb6a3a570b493b5fba941699e4ad67d3f0c5f4690a2f022034374c95b062a952df576e5534a7c09525598d38b41db9550b6f37e0e0b1dd5d0121030f70e89e051108017f795790e41061dc14e6f2ac7b8be62a5cf42e4b3d2b556000000000010000000001019ced5ecc3a4a467a5e4af6c7cdb4d6e013e288e3c038a8cfc58adda1eac9d1e51f00000000ffffffff0187ae7c00000000001976a9146c093daf0f17c4b180a6b861c4d7560a06e3158688ac02483045022100aaad046667f625f2171cdc6ce885bf53399d9c6a57f876370bcff0a58de3b71502205016d3225d1703d80a2668101f56bd195a3427ed873afa9952f0ff13733db746012103c9ce90a9ea26c45abb5acb86e96ec0780cbc811dd28258167f261b3a9499d592000000000100000000010162e58887ebf2fa37657786ce28041e8c34e53eae987c9b26337c60a5166c6e890100000000ffffffff0116a40000000000001976a914fe3d0abb5111548ec5b0b734063a942840374aa388ac024830450221008c539dc4b64f72c801f720cd2b9b151471ed9f864a3414b80a742feb279f6e52022015edd31db7649793713e6132d601aed6d52bd2ad9904e7da3e5e517a6a8ed6210121036e23aa61e83c72b6030787999c8efd1659473f46723b4efdb3bfbc1d5ec5e8ad0000000001000000000101b39c36e69af219c96f7e40d8eb62aeeec7889649ddbd258f7a826bf7961199830000000000ffffffff012f5c2000000000001976a9140734a1c462af720087defe83b7c0dea74775499488ac024830450221009e2375adb2aec2ef328b44a3dba6bed4755a7ee5993151141c7e53707a6a088b0220145b5279268c13719b1ce69e9553a4bd7e92e38dea8afb00b545241bf449c74501210292304392f3183d7fc001560d7ef78ad831d487efb420e92953589484a86e91f7000000000100000000010180ffcc1146d2bd7c6a2330a69e90404bdab16b2be78697c29b503bb5c95f6ce70000000000ffffffff0102b11a00000000001976a914d34a7e1eed1b9b411ede591460e61c58fd87ce3888ac02483045022100ea85f63214d43929f747768a3b5587fa40a5dcd62439a3573ba74f20a6ea559c022026a873abc7ebe004ac99f3814d7626af28d59efaa68acc92f8288bc441a065c6012102d66daacc4318014abc7a6916fd4a54fb524376841f33606a391eaa446ab4886f0000000002000000000101ab1b1c5e185b7fbe966c4fdc1d487de928d1f66165187d07739139418aaea3770d00000000ffffffff02d7f93a00000000001600146ec69fc2c338b3e99634596c2946cad43dafe7adcb8d0a000000000016001498f9075805cd914c868459d8813484dfcf72e24e0247304402202fb19b96ba97fac44c290bad8e38600d17e97352770206d154f708d3c109fa940220305b2fc96ee1813fd4bb6857e4a014956bc3a3e41072358da0f9245a5dda64f0012102cb0dd83a1e9f9454ec8d26d7e88bae128f1c2428acc0ee82f01cf5ffb290721f000000000200000000010242885b11e833a8bc9978e04b2398568ba9157635eaf170b3f20eaf42f07996e10000000000fffffffffa6132da7b0429474cda8ea1d849265b5402401e79c71a25131617dc80c0a25f0100000000ffffffff01cc613c00000000001976a914ea506f6a1880d1a9dbb6c16ab779570090ca3c7688ac0247304402202866dffd2a8e4ed2b4d42e3508c6f4353dc68994f11867b31102248d6ceb4a9d02206be85fdd3eae332565ae464d4a761b02dc0692bd55c605586e03c64082790492012102486e4989d1c014ad35c41a8d21c1409c591057c379e7c2b02f3c6706f49bd03d02473044022044e472a9cf08b9cb6ccc39d4f67dce5539f2a37cfbd729f07c50a2f61d4acfcd02202302de9de8786259dca172d6ea50bebd03d164d9129d4e322ca542476d4b2b71012102b274e1dc779f92adec3862c5441537e3e1ea7f4aa7e17830bdecad1d45352af30000000002000000000101c2178d41573b263bdb7150e0fcbf3f7181bde2a4f6e8358e70a0efe4b0b86af70100000000ffffffff0231b00100000000001976a914e31e69e87f2e6ade43a4cf0407dcd2799f385d2288ac8740770000000000160014393bc48ea7ce15e0c9800dad9fdbd9c8c2c82ab90248304502210095abe7cd8172f041392d1e8e65daba8a1d8bbd1c3ea1813bf1e429410655621a022024bf248f2e447363a6a79e3f9fec66855afaded4887fa1251353a71e9ddc6a5f012103751e10563678ed8b81c00e53aaf7813c77cdd80f3e6ea35630f88ec6dd9c982b00000000020000000001011a9b7a1fe167c2d3385e22ba122c93101be8cde67bce9227c701edfbda27b2890100000000ffffffff0286d90100000000001976a914df828beaa0d4952baa5229c1eff24833c324030788acfc627500000000001600148aaea4477819be5eb0505f63f4be06b6ab6c78e90247304402205f417a0c1a13c9009242a8cd480b326d132bca3feba9e980c5c9d3a6695522c402206609caa75fa9a633e3590bbbdda4f68f25029fd452a9a6ee5491cba6917fd3380121039d9ffc57ba5c5e0997f9c86c1ea947ee73c5680450fd124db99527c0361dd5a10000000001000000000101439590b36256dd2cb38063bf24b4d563074cb108af914a2ab2aecc2842405b06050000001716001451ce91855c561f5f59174b488daec26c718ebbd3fdffffff01a08601000000000017a914db836d1325befee7e00eb189ab80aa7a7185f3ee87024730440220045f19778f4022585a346353c41926a6836675eaca79f9a5322cc551d7a50dcc02204fe8215d5ae8551dc43f9bc97d63cb1c2dc4adb478eba4a35d611b0c305fcd8d01210385ac5dcb2dce7b88e30dbf8bd047d1ae6052915d7362a74e95793768387c33ac47a00a00020000000161c9b4bb73ede4cbf3b9b6b14ef9c4d0ddda01650470c7fd600960dfbb13ab72060000006a47304402201932ed455f7ae1ad59d4a23af5e055c0e86f61f8801a1336977784c0e78d458a022056708ef4ddd8c371bc1cb8028e8155a04192b75ba48ae71db4de8e514e351f3301210361ba866d13caec5cfaa420a0cc981141b57d8619b79bc23e43f74e0ecb972cacffffffff0290e20000000000001976a914ea99b8b815eba949f646916b68d138642d3e752f88acbc0a0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000018843b19944c9ee7a17bfcded2cbdf68fbed5bfbaeb9999d33b3898ee82f39cf9000000006a47304402204b5248cd8965a6f383cae6df2b20e76e333443c5d23e4fe42936460eef742aec022047bcbad59669f3678cd89b172c5105b890a790fc863f205c29624d284463be690121032c11dc8588e8d10da52b5f1052f303eba1e6af4a69877439f229041318c02b78ffffffff0244500000000000001976a914dc0708a105cb23ae04115bda8b62caa34c768cc088acff1d0000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000002000000015de51386466f5f194dc065517a7b377a26e62227b5c3381b661fa2723752920e000000006a47304402202227dfe0027280557992e83f29bbb523c9c9eb26382d660f7f4f8e8de6bd2ade022052ba3d3fd12ea03fcb8ccb24d2b6459d0f734c652c7b2d54c9182f7a4c6c11be012103cab6e09c0619fbd5ac5db1c05ccca1eb63c5b57fdbc01660badda7c6e5b71ca5ffffffff02c0c80300000000001976a914b68a93e006d3824499ace215cdcc1b8adbf8c0a788aca5180000000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000001000000000101668ccb8be2a9c73eac8500b41aa3de876762b3f91cca5c1dab92e6aae1d6fe8c0100000023220020851815586f3a9c37f3b691c27e1948391e28ad5bc7a18383ed225c52d71a5251fdffffff020aae0400000000001600146a4b0f97a619fe094e06375f74168e1cc0515468269482270000000017a914f39c5094bffb5f08bf3bf467a90bf461813649d187040047304402206f7a359bbbc92bbda908e74ac52c910bc7f0607ceb32bf623c9f3d72351e596802204857bd36fdbb2906dfe91a4130b013c6659094ce618cde7746a24c365d397ef301473044022067a0421fa2cf3f6924aa03aef2d7f2a1b7d620324af3d7fdd26f3624844ba98e0220763fc8a2cb6eb0951b09aa71654e19557342abeba8743149a7285432ab8a5a41018b5221024f268784aa4ab1ff141b5fb659c3c3f88f373ee56cced439557fbc92448471b721027e6195ca05a736138de3eeced8315a71510ed640efb8944065c8bbacd7b2acbe2103ab3e26eb50666791b17036998000c93144f6c19689f32607a70868850dac0a1e2103fd1956549853f1ed412462e92273fc08ae92fd88358bf4812006cb7a271983f054ae00000000020000000001035e21248b5eedeb0153e8d8c7d98487d606d3ddb34f367137cf06b3c574b00d7e0000000017160014a2028100ff0a0cebbc9191ab8a1e56b38f902132ffffffffede5805d203e1b512c682821ea97be1947a0f9b84e8dac5e2ba65140f2f027ca0000000017160014a2028100ff0a0cebbc9191ab8a1e56b38f902132fffffffff558b6725f6014f1228800deb3df54ce4c4591eb8d2af85e42ad3496291aa7880000000017160014a2028100ff0a0cebbc9191ab8a1e56b38f902132ffffffff0200e1f5050000000017a9143ddd157eb22be95dd73bb37cd131f01e9565fdb587436c5c000000000017a914288107c1d4621fde988e6ca56552fb9288816e158702483045022100a8df9413184245a36df47da665bc9fc88054d991c2158ebc44cb529b2fa99507022016d5a61d186712ade5419a1c87de2ee77233dd8e320648ad5002feff38fcdd05012102c069454cc5714ab622c90e46f3fc5922f3445e1345bd90adb721bc94eadcdf2002483045022100dea3806f0fc7a91cee214d0fe8c83967ef459b6c43521b2b7bef3992cd6cb18b0220045b2aa396049dd07187c034d6e379a2b488a7d53dddef4f65966598c4dc2398012102c069454cc5714ab622c90e46f3fc5922f3445e1345bd90adb721bc94eadcdf200247304402202017d5fbed0661d9ecdfe4a231e57997ef156bf6981dd5472232e6a74bd22d960220037836f8c8727cd71ebff5f85705eee55b98fba65135cd154ccf03472283d0a4012102c069454cc5714ab622c90e46f3fc5922f3445e1345bd90adb721bc94eadcdf200000000001000000000102f2763db6c396913934ecdf4d33135e444acc2923dfdb93452db40f181b785c520000000000ffffffff14785b1cec69439fdcd72db7490dec05a3dd0dc3744d82fb2438496ab30be2b00000000000ffffffff02c104350000000000220020d37425beb076b0e4f22be3694a74372134b008923740d6b2cb40754c30e9545932df10000000000017a914b535bfc00b8c1d9f678c835ef3767f35791993d18704004830450221009b0a56cda9614b731e223095fb8a7b5c1f6bba2ec5520ccb81400b0f9179964e02205e4c5cf0d1f7313dad30e79d7fd690a00006e770788c3281fb92fc4081df9002014730440220322dc2dd26aaad9d18a629da7856da71c997e7d7339c5f667c7dc55b77d43be002201649eb3decf66c5fbe1364ee3fc31d7ff0499d27fb0eef0ddeeb54f9163856850147522103690487697c258098b6051fc2df4f8fead0eaf38e13a93fb58c985c845a47dff22102e53c154dbdde5740e4e4368d0a3fa7ae27e6fe067f73c166a30d7e63d795ee9f52ae0400473044022036fd7faae74e7e8760bcf4312217c395f3a143f80233fc5b984d6ba48f90ecb902206fb75c0c1d4d1bcfa99248d40f028a6e1ad9ec2e22442c67546d620c6029c74f0148304502210093a9916bc18875ca7b349b1d88b74c053183f9db0499bdfe2bc4e26411af9a12022050bc9e770cd094944e139e4af5716ce08078bd7761bb6213a4cd02e9d1f7addc014752210249f4383fa13c2f11af066663500ed4523b5dcde7b1180eba02297d4de512fb53210298c024254975d3aad70bc54ed89386aa4926b83345dc19aa56e4b9a31b81586652ae0000000001000000000101eb4eb80770584de34b0d9806bcc33dc919d54f9104848f29605f1aad80f1679d0100000000f9ffffff020459280000000000160014aa52a6f5b5a81e076dd52422ad73d396f5ce378ee76b210000000000160014d85f9cbc5fbd6153cd540ea10df0be72280c2f08024730440220751465f9f28a267b98a5c694a20a58e85b9c92c233cd2457905366803d9a8a950220791e21910778ff62337902f22fad546960bee258cbe559c33191c0536506588d012103790ade7d54541171409ac01d8191ba79a6780fab980b1507a4767e1e31ce7f740000000001000000000102056e8bf5a2ca579a12da99e5540a544ef241bba8debadd19e2989431cdef976a1200000000faffffffebc3120525996d0b8fe99a58e6135518b3f520406686bee9929acb5f9ad70d660100000000f9ffffff02310b250000000000160014a1ecd3cef98713b5e6575f0285ea66a06e308b870223170000000000160014d85f9cbc5fbd6153cd540ea10df0be72280c2f0802473044022019a3c3b770ed17865987016eb3be062347348d84cb5b6fd9ccf5ee2d58c269df022058a4acb00134e27ac724632891ff348063ae050c049c987ff127e53fc5884fb3012103790ade7d54541171409ac01d8191ba79a6780fab980b1507a4767e1e31ce7f740247304402202fa75912f2b04d4197eea3a7c348af2a06c3897518ad59651b24a28953af9fcc02206ce3c6619d7353915917fe8dec4895234708793a01c3be77a3457ae4acc9b0b7012103790ade7d54541171409ac01d8191ba79a6780fab980b1507a4767e1e31ce7f740000000001000000000101a2e07e8c70c316c7ecd943e7a4fd61f45d1e2d2cea366d77bdc3374f8255179d0400000000fdffffff04b69a0b000000000017a914a5d100433f8933e1a7d7d4fe9c40143111ac9d6a87078b0c000000000017a914d869c3249d31dc143010321098d25886b4bbf5c5872ccc09000000000017a91419c7fd6f4078f6174f43a1cfe2df92f75f87dec3877ac21901000000001600140c174b958501a2fd028ef09d2f0a090433bf498402483045022100b61aa667457403422cecac1fb75a135de8bf9cae9c96819c99643f3149c22994022001ae39631f1a57c09db583e426faff9ddcea190dfe94640202e11adb8a6e8f2d012103b7c76227b6c5515c1c7b721031334b84b0e57173047002714738044caed36e51000000000100000000010261c567d6deaabe2be9505389a6a9d694c146afdaf614798233b61e1d691bfc6e0100000023220020b0a829ea5bb163d2027cc4fe33e090d2fb7b2a58981d090c71d4aa46167408f9fdfffffff881d4cb7d9b9cfa71dd63bafa8d9fc9d4f26048c000a22e38ec11f71d1d26a30100000000fdffffff02828b0c00000000001976a91481e4ae811604134c5944284c8b1876a9f4bcc21c88ac16430000000000002200209270b06e282779ff2c32f3604bd3d9f3b7499dc22055be1667e37d685fa28c940400473044022040c161e6828a55a535c8487967ed9e99f16594d5bfc3af90136eedf98e5a141a02201035906ec9af08546238fcd4441c2c1f5a585099ca8d1b0a44738dd7e7da448601473044022010111dc66d60ea3368803811f036a03c8e84294eabca61b23bf9a1e08467c7260220279610c20faf614fb679583e43618399b0622ff0cb22651478f2eca9abe06707016952210286f8a55a40c0859f7d98c7cdc9f5f29ecbf9c5316d9ebbd09002dd6fddb382492102c6e307bfbb96a83876fc9bc76be96b31e6c7c7228dacd06a6c1a4e9908ba7e6c21039d62f094a47ec2abe7d77a3d7dba0eba069eeb5bd9ed563bf96876a8a02ba71f53ae0400483045022100d022645d3f2202bca4f77ffe67f54fac65a36b716f087671f55db27b81f041db0220675a90a9ecce42c68e8d44abf454476b02dcd3534fba368851bd1fad76e48e6001473044022000bca527fc9b0bd904b4713fc48e7288dec9a17966cc3dbd75ba581e257ecf0b02202f67c2075a2680ebda1674b6d989e9148e5d49ca8ad734db4aef427d790a19ea0169522102759dc3e4960d8d4ffb2b8a1eb050b42dd383a27c03feebd693056a7781ade4392103a7073e5d7b60279440bb58b02a1c30c8144a6beff5429513e8e8eaf8979877522102a416e5fe9608a8bd8ade3e7731992d0d049c95cc69c984d81081ede6b854c7d553ae000000000100000000010512fc50e8faa91dcb364bb1a55c5445154484cf0e27f9c2e5e09b0e72b322cb250000000023220020549ac51812a64506cf90702a54d116b4be227aa1d642e037165e617225c5a86dffffffffbb7f7ef4688358ba19def6f05b2556b5918ecc88d06731294da714093b9db5280000000023220020944cc00ee1ccaffe8e5daca85de74e240e0ed85484a6ee54f089efc47499791fffffffff48c7518f3cab1ad187c171e17be6ec94a9deb3c06cb5a7d644dbb594dbf8dd3500000000232200207ed77faa4a1418f2dc3564699c6f188e3c57c5a69a45a1324873b08a8e7d1e1affffffff50ad4dc6c9ac449663cc40553cdc7c68037d1004ede1111497224153813eded80000000023220020a73527115f5c7b6707c2edbfcdf93957d0616fc70517035d764c469cf93e2b14ffffffffe118d11a02e251bb2fe994c4da6fbb70c529c317e5b21e4d08d369e92564c0ee21000000232200200d83059c99480769662a6b07af87a96972d6eac74e83083f397b6a08e8332f43ffffffff01453399000000000017a914c066c1b97bae10b66131306ef3620d60be03eea887040047304402200899529d85b5d4eca1fcd1ee324e0a99a271cd31b070a6e702cfc0cc96d523f302206e357c642ab2b7745218411c2ff99326ea95b68d7a1a075a883b230d4cb395ba0147304402202b202c08f4a2476f969ed2be936457aa59b84bd5918cb583733ca0cc23226815022014f081ddf09cdf702a68f36c16deb05b7c6c84a2b428b5d0b8907e1436acdbe8016952210272a60c2783b9a35abf0a5a90820c5bfdf0efad73dd59b49df7ba2d3cf42625f0210399241675cc4b7f1113c78c99a389f8ea367e5936443918b91adfc4950de8b5cd2103c2aaeb3e3a5a6e6582e1c1e9e2dbfd209525827b9d5a6f365349873849bb606953ae04004830450221008add80b137b5af0d789e7e08b48f29a3cd965df79651d0be4908b4731156350b022050dc5d1207b050096c74fabdeb2b75378e3680955b387c9d3ee6f353bc04b25b0147304402204856b96d245c6e211abef7aa3078c06d053e856efa865e123a066f2ce0c7f00002205ed60f79e7800a5e67cb73d4798a15bb26d7ce63d492ae7777cc63163930256901695221027d687cfd119fb9eb3673ecea977efdedf2e1f9809a35824256c917d48b4db63b2102838e2dc553d48d9d8c7cdfe7253fef4a9b26d71a3e5df0665bb40b39f181a6eb210348a9c983e76f3c613dd9b6c30b881ced85266df5f72693c94fe0f5bbf457280653ae0400483045022100c6447f4c6cf3ab6cd899e6061bcd8e70cd450f666dcc5a0a567286849f8d0f530220686a4f02716dc666987f8bef9762044ae87dd7f9f2778affc0ceaf8a279361df0147304402201a1e6ed9aadb74981f9e906da908e7f84fb41d21da99769278f90e3a55f93e7202206ce7953283a1ebbedf6b175e14baf92fd85049e192aa29baded844e693657f3e01695221037d5378813f14e3271603a363a8977bfbf768eeb631f6ea044be28ba3bc408a8c21028e7eb38e017ded380851f77ac49951a410c260c97b109bbbca6e35f850f9dfa421022ec5881505282c6d1e47aba94f6260d9ea0592ac10e2f9510bf0afcab837fc8d53ae0400483045022100c1d95ba6727afdfeb11763ab053f5f072618f3946e5375ce36bb23b0b33f42e802201b6cf97f5fbb42c934dc6646eaf1eb3ea275acf502d401a8ac02f663af8d424e0147304402206de93520f5a848a5b4882f456f796097f9093414eecd1d6a930374c8d36fa97b02202b85ff9e631ac7cc978e8bed3574d8abdde73becf29b5d8dea2aff581b53bf6f016952210390016c4e47f7af647edec08b020ac0e972a87a112745b354cf74dbce20daf8512102ea709da5f43dbdf68babedfef9df620b595dfa595daf84e4ec9a954a24bf94632102181ec9ffc64daeba321adada4f2085dafb9b2dbfd87cfbcaaf83520a3b53e89053ae04004730440220025d01b4f74768d948bf2f78a8a721224e780554843f1b416773c768cdfb2fe402201a64f1f627b78880307a96965a96bd93da5faec3bfcfe2379a7feceec2ffcfd30147304402205ed0a5062b64ccb0f29bd481ecd9fc551060d7056be5e63447405a40e317acea02204c37dbb398d607aa88db795c06212bbb3105d6c35f81d750b9449197c1acb3a20169522103a3b73de52374988ee0de566e37fb9c031bc2c7cc3096d6ade5a2bb11e16a44162102cfd8ef6e94bfd4939fc1fca677ea23a7706059931184bc848e700886434e98bd2103caaa76555ee2e69afd34ab647c47fc15d516e3264fe0a71e7f2a7fe7341bb2fa53ae47a00a00010000000001019f6ed304627f088ab9d42439013169b35d8de08c3e60f35cec35084a19dcd7dd0100000023220020760238d8493c1c5304f26ac25e71c127bf63fc087465b3bf645f3e69f889ec62ffffffff0234e800000000000017a9141413cb8cca4654d67a55f8c3f95b407e4bae321287c46c25000000000017a914d7688cbe98706aac916397d63355ba656d86ea798704004830450221008d33abc4a85eb2e51e332495819b0a8be791cf93939ee17338b7cb6bf8eb785f02206e5a83e5cf4377e66595ff1fd4bc04c4a24e3f7275e6fd6e28cddb6143caf44901473044022049b4ccf276b6ad87ab333aadc06af73b3ae858c0478fd20e606b9a123742f3e402207a91c1aba8e3be3f3c8e2d544b4c712b1abd586f538164b7e2dc9ca64d21fab90169522103a6f6786d0a1537dbc0c31e1d11001e871f4333dcf093d01775ce04d93f0d63e42102806b1b260bd065b514033f6e63cf996e9cc605350f562e80ca613a41603f00b72102c5297bc5f2580de2deeb32edf55f54a15db33b78ddc1e160d9e529509bca247353ae48a00a0001000000000101c65178f990cfadeffc64ab7fe62622c4df45a4fab49979e99c7de41d5cf541670100000023220020fc8fb0abf7092dba5cbcbc96a5c9b9bae5a507d7814842d0ed54bb08332ac9faffffffff02e7e80000000000001976a91439ae49047551a5c5c3313c741aaf01af2f9cefe688acf97d24000000000017a91447c74e67da813cfaf85533505fc62ee6aac4c4db870400483045022100a99993556a728b569e869030c69c5c0b812730d545d5e6857ab01f9af9822fc4022014cd3d4f5c55e9cdcd2a90f6afaee0237fdcd39346b2b9685a47425d48dda1c701473044022007f58d48cb4b948522f674f73cc75edd134cf3e3ba24f5dd8ad10091bded2eba022040762ee6886132fa258689b7db1f9381593267cedaff9b92d01a1c087e9ac24a0169522103e2f70e33c991800e0b6863f3df89b82475efd25da623316cc65ccaa99e7dba932103691da66f3f485dceaa15f44cac21c9251fb9d41a7e680b2d11aa2bb9a83d194a2103412fba6b4ea7817ad836f0ec1d0b5b2ba208d37bde905043e87c6c36507b0d1a53ae4aa00a0001000000000101bd3f6e9950e9e0ddf9978b0fb9be3abbab9af9f17815afadfdd7d7525550eef70100000000ffffffff02649600000000000016001451299a96430218bfe73c36960e9db097d41bd11eed220300000000001976a91471a1253a7c2847f8ec6850f917d2b1fda9c10e4f88ac02473044022040dec2877c1d3af3f4108af2f7d6a7584b39d9bca2b43403cd1df2d61ac31f43022028b1a61ad12e82b9a98c0cfac659a103054182903eb56dc0eaaf749248b25e840121038409bf2886e5efd15aabbc37a575e9032ad9290730cadf0b555c1ed48b05121900000000010000000001015487fecab936c851846745aa90574a17eca4e0717fc8fd8702d02b3040d09117000000001716001400b7399646ce9e01eef4ae075ce9b8bd37e3b90dfdffffff02e28601000000000017a9145ba68116dc2403acc810ef385aab3e16247abcc587518f02000000000017a9147d629c8ffad42043af8ba44a28341688828b79b087024730440220352e5e2f2347a0655ac780fd6b256503a1c3971b54a83d5323fb2fa527f11a4a0220505a6446f1cc46fe3cad0c565f284a5859a34ecf218b724fbae3672e9aa4ad4b0121020749520237de074be42aac8e7849bd0a006c3b65e7af7f65a92360b558966a3948a00a00020000000001011a77cd342b311a386c84c9542d794f0f4803a5bd5b7e9e6fd99fb11032abe4e5050000001716001418d1f3eab6839986a20c2c6e8aa2fb40bef2117bfeffffff020c400900000000001976a9147004e2f1b5a4164689949ac67a7f47a075d457dd88ac853d1200000000001600144d7c7c8c8087e1383a35272c1d135a2e0bf2601c02473044022046160aa63f428cefa02187382d0dfa589a81b387a492798471791c0287a6ceaf0220514728909d386df2874605542bdcc9e6263124d797b452954da47b6a81e0d62501210244a7a952b40145797f3d7aceda4a3c0e368c280e430f6bb7fb32833e98ed4faf48a00a000200000000010134f3ae76f8e61b3a3167040ed3e45a727e113e783c837442db5becdda3a283f60000000000feffffff02e9f408000000000017a914df0ba256311a70575a69a097e58deb6136b5f0da87d3cbcb0f00000000160014b68bd5810444f810f916138886a6fa72c781c32102473044022055deff7e2b74b5a882bbe4a1eb301e08758fb79234b1966a543749dd8ba9797602204ca092a104c2cc4f31610f213fb21bae59f50988fafd3099e68a00b57ed0496a0121030b30ec454ce64b8a4c4d4877532adb91260de111d6424f9aca8f80fea9aed1d848a00a00020000000001014c8e2008724c7e567b4d234110533e75e3f3efcc9f7afe3ee40ad75b5133a56c0100000000feffffff02348703000000000017a91443ca2e8b9cb85adbfb2daa14052ed68cdec77ee0876980110000000000160014110246e503f6c117a45cba9c9556cf6cffa3f3270247304402202dbc2e369688daf16f169ab829d4b7bd1342594e081e0d767cb7399766707ed00220375620668212d7f70a49c6009e7187e15468e67046bfe922259dd8204acf4411012103918f777b61e27ffeddf9d27f2627a6fff93808fc0bb5c651d66b3541462bafc747a00a0002000000000101f23cdcd34e6c79ac5dad9ccceebaee03481ce0fe5f5e9ceb5a73cdd46c17e3690100000000feffffff02be92aa00000000001600146e2a0d4ff7be2a5fbe8af620a90872a92d092c3270620d000000000017a914024e93ae896aab74238900f5ba16842887950d3e870247304402203eac5a502bffd75f3d1ae8290e1cb036b970320c4c80d392fbd0da76b2fdbf5f02203356dc7c82900a75509f19b8b7bb6c0a9260a79905d18529f10d7b35ba5d35fd01210280f5f202e6e22335d4a3ff8a97c983c30ab71e54ae1b5d30fa8862a785aefe7447a00a00020000000001011b5b75cdacbfbf9d71e1801cf666aa7bed6fa74048d03c698b042c17cd413d150000000000feffffff0ff2d57a3400000000160014f9450f8fc94a544cef71cec7298ec2cc664137531c931700000000001976a914631d291cfe7eee3ead2f08f1e54ffdf34f07026388acea8b0300000000001976a914d21dd7fdb8ea11e57699f2815b1ab60d258ea4d188aca8ac06000000000017a914091180c6d42afc4b7f3afd938db6ad3e9b62f77f87dfab06000000000017a9145c6ba069047ab34591f82faae66b4650f1644f6b87cf9c00000000000017a91472de5941c14505324993ffa8c92e970938aff1c3877bdf080000000000160014a999b71c0144838f2346157864af9ed3c0c383644ebd00000000000016001446cb2faa05ed366b7490c091347cdd54f0e6de361ca3120000000000160014d8ca2c49589607784e83ff2c02769979afab5cb8530f06000000000016001499e4a533a58bfcde10388e0e901f29315b49cd0a92ce0f00000000001600140cd1bb8c0b587594adb4010909f124a08285560237063b0000000000160014629e0f2b740dee87a1ac45e435ba8ea487c4dee454b4140000000000160014736b6d09c6a5fa5fb28319ddd71f6013c01e2d904c193800000000001600141682046a06b00c79ba47546fd498b286c05d28144ee505000000000016001414c5fcc93ea5ad768461b9d3ee802ab433e6cfd702473044022000ac3e4831aee156938359e0d6f5a4e36f59cb1ddbcb6b0e6fe5eb86fa2fbd210220022c71e7f4145641cae5c29c14d0c7f673b1616b2ba7d3677bc4a670d7bcb8bf012103fc60778930219e93ef91aab1915a774e5dd8af8c4a4926e7ac92dcc5762c10840000000002000000000102dc5dd33f901473b2308a8c62acf67ca405fa26bde0ef6c1f8c340d6a85df1fa80000000017160014cd16b00dab88aaa4eb97615d17f9cdcc7a57730ffeffffff1aa00415c04c6b66db51a4800215c543f2966e76c96badd89733077d3f12e27e01000000171600143e2c0316e627a8676183fa9414cc9d4be81dd5d3feffffff02770411000000000017a914695dc5036c3657bd2dce85f4b65dd8831dffab2387aebe07000000000017a914396b35a94f3d205b1a8853c09fd33f8b8cef822a870247304402201477276ffd10d5b7097b2ddfe58aa8574a68b59e1d439e48725d0e82312382a702205a947dde84db0680c5b576e91b81cfcb6511a4efd08479ab529a23d62d0a6873012102cb12d6649153a1e562db4f99c7f929e22604992ed9d8dfda8a4aa11486b80ed60247304402206a6d9c1344c892851c13b3b61c0da76d528a9841c9ec1317634b337058d79b5a02202adc4b23f4ddd0b473cc3ae63ad3bba704168a3606f75e754d145a6fd7c3b973012102151472cd156f56523a25191d785b6fdebbf131d5f08e8127b0e68b6985bc7d2548a00a00020000000001013e1d310fc441628eaea934298d2a4382da47d4f46871c0dfaa680ab843573aa00000000000feffffff0522ee1e0a00000000160014f0ad17783b300b1c5c833c43876a58c96dc1af1adbc40000000000001976a9147e42c4609dd189f021680393b338dcd83bd326a788aca23d2500000000001976a914f8c196c0c9b5c372da067d91d95ad3a85bf3504a88acc0c400000000000017a91445369cd96853c59c836d3887bf6b20835a551d7c87ab2e0100000000001600148157b3c98287f77a17768b1ae96141f7c2d779f6024730440220791be4c249a863b9b73a2340e5e048f969519968c31cf527aeb4fd94d67c7bd502205f9b2baa994ceed94a192b37601be9ca6b12d80c266db1796432ef8e06973b4c01210375ec2f4ddec2c8a625704ed1daf4277da239a3390efa07fec51dc1f3d57110d90000000002000000000101536dee2ae2786b89b17fde52c18ef5979bfe36947d6968a659362215a50201020000000000feffffff02917c9a0e0000000016001476a6d57bdc40c110cf9e480244c560204037e83fee881500000000001976a914e9876ecae3aeffcfd613c60747d39470c8e725fc88ac024730440220305f13b9ec4b9aa69cc7ecd7a8502255d8ba90ee064029a4c40bf34ebf317702022051c7c858c7a5a5d5a5b430931d9980011f6e62309a6abfbcf4753934e9a454db012103020f411bd9da913ab5e383113085eef734c94942070284555533dbf187d3587c48a00a0002000000000101e92ea4bfb203f3b446e8c2668373a7352e65c3538ca6e47025c5f29f77e923b90000000000feffffff02ff5e0d00000000001976a9144d2000f0ed0afa28a585b94c60549338fe643a8388ac97737811000000001600140335e217311ba5c5ca599e909e69afc48e28725b024730440220102d94f349eb01b82edac6bffd46676823e3d743404f037e9d5f3c985b27080302204a3115f2c9e6dae7a2faec85990bf97c139944dbac4da88c93fa9fbcf688968f0121039280a6d940b92de0710ecb2054f319da22bb89d96305325c6176b3935347657f48a00a00020000000001018b81825d637f8ff7f2e53bd8c3d0348df3382d8229d02d8be74f8ac16a2b30fc0100000000feffffff02c0ee0500000000001976a914fbb60108955dfa4916f7c27a419456ad26b6583188aca23b450000000000160014541e8f53177958e2d72930ef0de20ace35949a730247304402202b5689dc0a612f99324fc7125d0cb71c6f1b5414668225e0f16449250b3b9e3d02200b2c4c9d07af93bd924032c2fcb38e3a6084d1882fabab1c7b559f36867c6973012103caa48aba96793d7e3cbaa2e20b4f405fe87a146456ca021913d685afb3af1121e59f0a0001000000000101677ef460cf92ea89ad95c1abbdd38f409f1ef62aaef19dd24d0fd60a0026f4c60100000023220020985fff4454d737933ee1b2b58676f10c4544704a5deffc7174645ae2e2c27ea4fdffffff0225850e00000000001600147d4ac2ab07b16c73fcc6d21d6ba68ea8aadba522e53b2c330000000017a9148c869ed9f331f58efbc75476ba78bfe03fcd6aa8870400483045022100b7f6d06bbeb430f394d1b9a9e38cc3423dc155fb3974deeb975142713ec659ae02207745d02139f88fac78f0bf60e7de274c4bb6c798fbdc5e920d13480f026c417c01483045022100a530a4eb9a49c412c821ad5825f8bbc7a4788c69bbfa853181f3c9e1ccf32e7d02204c843ce0b327519e1f83f20f9d64058415a045c0e8b77c1a1e4bde9ae1da8d77018b52210223e85c38bec3ba7266c1a4ae371327f40c35b6a88ed29e262c1a345b1c811a2821028b1a454b9dbdba39ea96b8099669d6bdb40546309c4fddd9c59925e0c16de0292102aa7cd471ec550234688feddb7617504cb5816ed1c3df8b980b529d2be925d0c9210329c4b94d8b94b6c42b888516b01af5f83a03d6d2d009a439f18ba2561c0b4c5c54ae000000000100000000010119918cc69cc1d401f20b5829c02a06c59b12afa56c773d8896adde8d2b3622c60100000023220020f769fbeb610a85cf93099ff1e2960ae4d0259fa12bd7c2b4d46546b4f91e4448fdffffff027215040000000000160014ec0398c147ddf75d61299eabf291c6e433215bf42800790c0000000017a914ac5f985c97e7dd02a2457dd89a4dbc0efc6fc61d870400483045022100b63b01f07b906ee404e4546586ff7db234913603babb8a407db08cef4bfd9bc802201ada9a0f63c50a990c7bec1ea5e7c302209d82521eac068f04737c181183436a01483045022100aec8578f79df141e5d5b91102a174f5d11e8f5a3b8cf25c793437ec88fa181f802206eebaa11b3d1d1753771c12ceb9212edbb160ea58ef741cd286c6263c97fa647018b522102406fd226ee27494affeb8835e3a23f77a03843b5de505015dda72a2a2069519f210253b172029546afdf4cdb5c3cc628f1179e3fdce64fbee04b9930b20a4031e4ff210319514800ea6f23ef9d264e34659528236734765bf7b53272213c12daed4694472103ccc3e5a3008674dbec8b0ce0ea07b34e25a3a728f3f2908ef6ac0df69870346054ae0000000001000000000101513d01db5691796b7b1b52f53da6fb12ae8a3486877ed34256991e1b648c852d01000000232200209ee2ae95cc76a5162964cb8ffe86eaf452d70327fad6ec8c2591df5afbc9411afdffffff02750602000000000017a914678887ae5ed6b1cbbc2a4ed21dcbfbf0751bd89487a2570c090000000017a91466aceed1c89fa7f0d472eb2fd0d2dce00e432fd3870400473044022071725626b9c4a28e1e3ef1a698d3ea9b01d5ff870d36593ac4f00f8804faeb0102205b2c60f77c2ce04e101558f2fe41ffbe9425c7833d4c52f9578d97dfecb51d8901473044022011ed44722215e27de780aceddeb3dba1ef803e448ccef3ea21f2a2e1087f711302202e8a628dbc8423120e3230013c70740f5069a65ee26b855f8d0d28995fbdae5b018b522102f40d410768fdf242cca64fa448661a4735c11ce057ff41bf089cb130e41d398d2102ff7f725c59b9ab0095aa42db08ae3d6a2b8fb3d48d0ce976a929c7cfb251c8ed210342076259da8d8b62d4e457671ae6cc8566aee84ae13d5c6c45b8181a688430fa2103c613f0422f9c0f91b414e9bec655b3bf3335dfb27fe22f71c137fcc055feef3154ae0000000001000000000101683f9aa355541f87f0f670b989389758795134f99fb7a7510e700016caa8fbc50100000023220020f2f7381485d6433e346d81245a4e9a1cbc3268f25e6927cba852b4ec775857befdffffff02d4083b000000000017a91421b4ac3211f33d3c4bf1d921107520aabfacb5058743f86d070000000017a914093f947ed6202b22b059c66d6364e0b02e9042a2870400473044022077eca8787430b24353f919df67361d4ee4501bcb3421449840e8906c9040e2ba0220363cd014b7b5e2933e2960fba5e49135b9360165f311a1af891f8253a7f4fdaa0147304402200572cabe9784c735ff0b51392aaa58c341425c256a8d7b4f848d8558501474ca022058884b1cc829db606ded6d1c9bf30bd054abd521f20bd658271e7abfcdc49d80018b522102aa3f4eb3c544a70717333f3798b78f2b7db601b9cbd6717d25a0a69f5767b2ee21036a277c69a92b1e2191949629bf564d8d9218d382187a445d622d1afe1e963b5e2103da7868cab976a5a53717f5164f3ad5de5705cdaea6471d8279e13bfde737a3962103fada2f84d55cc437f68080bab3f2c1796cc36b31b761c3c4b0c70aa2ec30133354ae00000000010000000001018021611555ada0728d29f9e2f8d881c240fd45595827d733c90401fb448ca0d501000000232200202d4f2df95c179d79f830145d95f35906549134b3e1c253aa4853592333a0555bfdffffff02c293ad000000000017a9144da75afab977c7c59ff57948108d33bd41951740875a1b40080000000017a914414886a2d3f999609b62a0981b92e5202ed4cd3987040047304402206f205dfe530336ce10f5585e991cd02f93fb43760da699f884acd2f3e2f1fc17022010d2e7d0865c86f3b6d360b74c7f42e1aa30abc010ab0863fc14edf6e238a0470147304402200a9af6b5f36f0cbc06f08ec878318e547169cdf8e19182aad817e79e6fb3d55b02200502f7ae0b32373cc0206f5ad0875771035384d4bd24b6f08035f8d22b57b2f0018b52210256bb6dfdd49870c8f0e894bd83c8635e4ddcd8f6e306dcedb982e11b50d237bd2102ee81d708f617ce7de918e57848dcda28b7a1c34662083a478340422211f207bb21031be908dceec7f40005a8a7a1f0e724a20294ca8d1af54a46fdc92605faacdedd2103684f07a1b69dc21111c3bfe1e274555d491af4d8719b1be4050cb05b31f9bcd554ae0000000001000000000101795132522b41e4bf69d7518579bef7db715ae65ba60e2f4893140face1f91fa41500000000ffffffff45583703000000000017a914859c58ec66cc229064d78118b1db0775eeae1e80876c3301000000000017a914ded9ccdffd24623f925ca12ce4481825c9c0082e879ab601000000000017a914347529632388d463c956009d2da8d5c528f3c9a687e4b400000000000017a914d3bdaeda9615fd205e65c4f67184278f2d97989d87387300000000000017a9141e68c8e8dd09e5160b4cee73cc3f8fca56f661ad8700e1f505000000001976a9145ccc83cf270fce5421ea8f8b89b2b487462c811b88ace8851400000000001976a91404a8678b923487a44606f195b1cf6f6d70c2138f88ac7b281a00000000001976a91476f9511df66d03a6d80098a6798c6e991ca916af88ac7c2d0100000000001976a9140c46db68c067fb57376a73284811523d20465c3988ac9cf91f000000000017a914ed4f291d2820eb56833ab28c390ee0725e0d662987336700000000000017a914a8628a37dde4d20af3db9fe1887cd5bb13a87eaa87007102000000000017a91446d28e61ae139d98886b5c8b3aae1040bb0326be87efb50400000000001976a914361d04dacf753e9ced8c2f1f380ba2dfcd517d8788ac3af100000000000017a914041f02527527a6bc17d367e425f267601abbbbb78733340400000000001976a914a38dc006d6c839a941671befebade3deeeee013088acfe6503000000000017a9140e4542a2da24cf3aa5731adc78f57b4f986ac83287d8d600000000000017a914a441e170356a743b3d38ecc1b382d51c554d8c5c8715a66100000000001976a914529633b57971e4a2d0bf303c21f3340f176153a488acc78200000000000017a9145ec14d974d9b20ef1e6ca11ebe7704a70ccb96be8738c101000000000017a914171b734fe1efca0e387624505697c0840800472c87a8ad9a000000000017a9143c5599cca9addafadb3209269c1a7bfc6b69ffc0879fdb04000000000017a914d683ded344a336705cdc908ce53fb376004da99b87e9f700000000000017a914d5947f1127115fb6ea9ae25e840b9ab25ab21f80870d4f11000000000017a914d2189d5647434a183ecb933db0236dcd0dbe91dd87b1700b000000000017a914c5c60d1defa6de1a4d1a45c3e1a3330da3474f0887f5ad01000000000017a914391eddd18432f85b55ca86e9d35de5c6beeb318c87f7890700000000001976a91418ad414b7be7351af54521d1da3688a3571b07c888aca7014a000000000017a9143e669eb477f111a7fe8f05a042311afe2011a56387b0c106000000000017a914e63fefad438844579c26e2c1bab5ec25bc805fac8726d1000000000000160014b095ba7c59c74ea978a0d9127b1bc7d06151d19f89c9030000000000160014642ca979a86b30382b0a0eebbe7375d9cae676cb9c2e01000000000016001403e764487c11934d0a2372bb60c8f1e04cf0db3a790701000000000017a914c0e7b3ac9362a3c7f7c94e694bc79298d47da23087c06232000000000017a914fa4bb5ef47e68f7646376e5be48b1eded70c0dd2877c2d0100000000001976a91482aacd81fb4a3aa3fd445517e372fd32c67d170488acbf590000000000001976a9149c7736b5b348f46945bac0ffea8d01f612d9365888ac62ce0000000000001976a9142ab984cfd2c51cec54647a942ca4500fbb51cbe588ac974705000000000017a914ee616f8b21dba752e2fb033775c390f8478482ba873f0901000000000017a914c650b2672e1ee94021b7672f8fc5696ae772d1dd870ea921000000000017a914a85cea3396bd278d8a26ce030b4603d72342018d871fbd01000000000017a91465f117f687bfd1c1d76786f046f2685683c22ac08735dd1000000000001976a914c17a4bf06882f4b85f53b9a50fef9075eb339ed988ac397703000000000017a91424a5bbccd7a691451f830ac88aa3a619f03d6c0e87cbc800000000000017a914d970c81ddde95effcde0e1c186857c0ecf337555873ad30b000000000017a914e3269c31b8f27c1a3c977783feb7c05a5aba97e88763f70200000000001976a91463c2358d4267dd0af612c41b7902077e183addba88acc042c0000000000017a9146a897d9519649c8069eaffb341e17809710746408707fc3b000000000017a914d3a347180462a00bb6775abb010cbc39c1e3809e87f05500000000000017a914de44fa97f4a0bd62fed7409fe5b58bf93445751487590b1b00000000001976a914d9cab8461f914f8a52398ed416f7c38143ef2b7d88acd8d600000000000017a91477922c86cedb8666747616f50e1b56e7064822cf87086603000000000017a914c6018a511d33bad788a8ccb72490b4fe8d54d35b87e27208000000000017a914f503a6c08297bb1e30bee159ebdc27d4c092d63687899a01000000000016001414768dc4c5c42e92116e2d257c670efe53b912ddb95e03000000000017a91467941aed25d49cd70eef056df13484a325a0629e8758c40c00000000001976a91478957744f0b0074626889895e7fb9e314c98658388acc95400000000000016001423097829bb7e65f03623d2ef8d22473c77a0611ed40402000000000017a9149c03959870e069b478917b375bf2b84a046c390587b0ad01000000000017a91483094cf1c02810bf484d8e143afe9611111aa3de87a1590100000000001600146dd98d894d43927b65005dcfe0c57e286c5bae5904f42400000000001600149bfc0ca5842ace40b8b3a598588f15ade35f33e1b5ae0100000000001976a91438db8968bc279d0326696fefaf3037595a852ab988ac2c2f0200000000001976a9148949e9304aabb83c575b0198a85c9af12057b1a588ac03982100000000001976a91451b08bfb6bf69fff1d0481b423f123444fc327a188ac68f164000000000017a9141f884ec705af16fdbe9482a759902825021ea48387c7b800000000000017a914b41334de0f3a124ab9fd8add56f8b4f3676239a48735ca13000000000017a9141fa21321c66a56866fa7a830c8e88703b094720e878eb1d22200000000160014afad386c83045e83c76e3567219bf1bf48e4d0220e200500000000001976a914a957797ba74c795c1f581ae2df9f5220cad0294488ac02483045022100835d50c9b6ddb665f12e4e3718534cffa1f6fea5d7591ab702ca0ff11a2bfce60220011f99afb12d8a6394ebc95ca7d422d4bcdcc825c5cbdf844db1ef52c3a96ecd012103ba14ff9d451c5105b6f0ac4001a6c9f8a24d47185cd4363950e173277e6aa2b0000000000200000000010379eba39401cbb420a6510a43e8eace8da6ee20f24adb871ae8590ec4ba65b1133c00000000ffffffff8bea2d7f96779671261d220e836940710f15b7c8b4a96e3b1477264dd76445c28e00000000fffffffffe0799a34b9dad871375b335a93c7b34c95a43ed709fd749cc46c97795f1872f0100000000ffffffff02eac24600000000001976a91435a0d0683fedcf4784307def9ff412a07ad5234d88aca64c00000000000016001466d433e08d65b8ee0e84aa316374054cbb0d0edd02483045022100ac81661eb347d6db8c62a4b74910f7b8a2b348d36baa7b7622a377878dbb238d022002c4d4d018820a46143c3edf7d805de61c721e5bc8329d8b8884b8ab148863d501210379e6996ff4443c58aa7f23cbbfd97f1e470bd4533aa1f7f6a337da2a109d8a7502473044022038a3127078a97fe0623355555c1cff2a2860efa1f9ef464aa7fe3473ff7f9bed022078ed59948b0de0b0656186fec77033d4137d8ad709f2b5b8fcf0603e06786b6c01210253340c0646a794d69c8807278188ed8209b78636d01d1a412bcf814c5ffdb31402483045022100cad991b6fad01c13e885e2aa8c7bca00f422a1ce6f2d97b4bc8e1bed6dd71e12022059bf34bbf32568c61650ffabe95e377ebad59651d4071dbabcc57c458cf782f90121038dd9b38b8a9707dac50b88231d534d9fbc1cf99e220c8db655861304c3147b99000000000200000004eabe78f0d5016442fa142dc944b2bb7c5725fea04be882a89ebb7e11c5cfbd7a000000006a47304402206da523fba2c0b9bf075708de90dc74fe5c025ac6cb8ac3b95868768f29702fc502204c4047ef04a0d0d3a2644de2223562c72e059220edf16d9bfc91992d3c4d09db012103bab665f51d7490b5c9b893ecaa0c240056c13f4ecd50c838c4397e7957832941fdffffff0652c422ac76c69650171081822b199e75c446136315705f32d67d85a760f0b7000000006a47304402200d916153fe96f62e8e0ae46df6886d69998000c828b0a91247832649c7ba2d7102201d3e16a6c0108a002717c4d4e7ba83bf55a351c5f5d75a09dd99ef14cb1c88db012102edec757c1d77618c7ecbf847a257c39b849d105f9df533962217d0aeba0831affdffffff8d802cd75ddadfe724ba487b6e76efd99d22d40ca3b493e74a701c2213c292c5000000006a47304402206671909df435bd511089ef7e84243102e44dd226a2fec36bc3b3501065c73b8c02204892942c62f1d550b5d455fcf2c48059b48b4189b103ecee1017e143d1699ac50121032ab52bd3204260029670d2927400edc4d05458ff8340181ea3c9ecbb963db388fdffffffd5f6f62617d52b222e37e94d5de9eb0fc72c55142f88440d954cabafcf26bed0000000006a47304402204ca716168d2f0b9cf88c4154f6dcc015cab01c5d758788ebbe34622536ebb474022052b12cb0650a2f58466b641ccd8b9373d6b96d19e6b6f1792b8e2c33079ea804012102739c22bcde71de7eb2c666c09cd12c5a02cabc5382551e9aca8598b80e542048fdffffff0218920000000000001976a91476c02f6294f93020a905515355b6ca5519ecf13588ac70640800000000001976a9141ddfcb2246dcd826144f8612e1e8128a219b6f8888ac01a00a0001000000013bc21d2fcdf8e0059f5fdf0dab3f9983037041db35c5d11b7df715f14f6cf5821b0000006b483045022100f6fa5be61b42f7f40afa594cbfff0ccba9e93cdd383563998f46606c6c531144022074595ea55f7935f831137214580343df3fd098fbad7c32714340b67c48b5b3880121037a4d64f1dfbd362ac586a9d217ef58a86346300e4c6d10adc753df1f6d91bd08ffffffff021c2500000000000016001439f365ce25ad5cfebee5745d20d7e75d7353ae28d0300e000000000017a91441d1143fd79f5ba03f233c2b9502c2decfe72b2c8700000000010000000001018864f1666754df626f67994046ab8db9f309c0bc47c9fa85921354581352d3b51e00000023220020e823374c3e678aae294c6c87179d52b3912f8681454821f42a193aa7e4942a61ffffffff1d3c8601000000000017a9148f26374018c1f840e9c875db03392759abf2909387a0860100000000001976a91494759c04f6a9568186c164626fdfd3a4b48f1b8488ac85870100000000001976a9141a324b27e2d668cec6bd2e13c7ba73ede1dc416788acb2880100000000001976a9149b53e27cfab657045d520d58ab4d48c1b4dbf50c88acb8890100000000001976a91463529dc1da8bf1f542b9a0697a132f42c851ac2388ac098e0100000000001976a914e1f6ccff5769700644ca034b275a9e513cacf93088ac4b8f0100000000001976a914c2cfc563b76023b2cc73fc3be1814b4f7a187b6988ac23ac0100000000001976a9143ca529221e7b399d6e9454998dd8efe9bc44202b88acb0ad01000000000017a914d3d908bfcedd4e25d080f936fdb0401550a8c09587a4d601000000000017a9142c121a09b872c7cb7e891253d7f66335ba35ba708747e201000000000017a914eea4aa87954ec5be42208b828b954dc59a639d2487bdf701000000000017a914a29e81e06852fb251236a4c691b4f994bbe24f28875c6002000000000017a91422b0a7bf40fe26c6a3d1adad837bb9061909dac387948d0200000000001976a914e8218d04df9bb6ef788529fd9fc6add78ae4d04888ac7c440300000000001976a914335166e558af5ff2911fbd315d759105dfd8374d88ac2e6903000000000017a914b4d9bbeebc078e3f0f2fc9c2bfebb476b73611bf87ae780300000000001976a914dc1fe5450bc4cf80a709d156bceaaa51c360f8cd88ac02b603000000000017a914ac189b8403a4dab316f07219d77c8a3e3465551b87f2cd03000000000017a9149a3b068d08352ee2bf0b7a49452f9727b1d4f5da8794310400000000001976a914236a3976630567f18fa2edd7538eecd7129d25b388ac7c930400000000001976a91489e2a68816737a7599acd8eccbb142a7a203299788ac32990400000000001976a9140197ab31c96245ca509f25627a52da9abfc7202588ac6aac0500000000001976a91475f03a128e2257b1cf3aa3ff3529faee29ed6f1a88ac598f0700000000001976a9147984d16be6926d33e45ffa5c24ef108fb75258c388ac7c8409000000000017a9144566fafbd83d1f6b05b3336cde6a5757d80714ae87dc410f0000000000160014638c365e6a5d36b115a94685c0b98338b0866c32421012000000000017a9148629b8fa50b35a99570f4feae15d4bf98ec725a1875b4a2700000000001976a9148ae9c105f7d2e6b7da2f1564f9e474d0d2ebb66e88ac4f036c040000000017a914c8d61efc09354d352236cc76312dfcf95e523cfe870400483045022100855941caf4961edaebcd1e43c5bcf2d03e7bfb03c7751395c3d13c3743baebb0022032a284ab4485e79a9a5940b4af11b584936b5d33116643256d2f46783521884b0147304402200b09332b26f3f2f1bedb5dc7ba2af2bcf5d0e28876e79ad7f7be2f9ebf6ea89a0220147a4058dab6ba7a9283fe7283aaff3767f5c90680e23589d60a7c083a0cb41301695221024169c34ea9b82b1255ad0951fe20ac1ebde056ca77f948ac501791788dfe25c52102ecdbf411fd01658def1c4a19fd2c09c25b185a1d9ba67971f0879fa62d5af4da210248e3e95a02d3ad1227ac7a9d75c3f6b24643121cbf5346ebad32389a06435b7653ae48a00a0002000000013d49cf53cfd5b6df4655ca0dd51e30de135e558628d4f3a933cc0f623251d700070000006a4730440220293d139e2db0ad6c2d6251478e731f626f0296b285ec36c8130ab4e747a4f18e0220787a16d8f222273cf4b05af1762a4cdd291664938c606ccd650a3e6425eb7cbd012102e33847eb3afad6d5169caed9ca60808a4fde78947b116c18bb1a5d9df2c5ffd0ffffffff01809601000000000017a91443382fba8833b2cad2724dd97d3b6d665b29ad3a8700000000020000000001023f031c0e9a187c778475030198856d987e2ee3fa585f4ea9aedbe45c69d9ee6800000000171600149cf0d95ca9b2dc43e908d42e358f9d5bfadf08beffffffffed0e9a80964e3ce161023e998add9fad838a1a42029c395ab9252c8f1b9b4f6b010000001716001468ca214acda148fbdac58ac4c3b62a83b6b74d1bffffffff0268881e000000000017a9147375475d503c3986328537071632b98fa004ffe487955605000000000017a9144681b77c8352d4be876675c79b4286ea80696a78870247304402207abe9f0a60a67ae519dab4145d64c134bfce05727e7e8d792f96585d4eb69c120220313844b02d6db79fbc7876e5ba4d446d62910573f41a29e8a7d8a46e333c76750121036628447f33dd1a1e841c7df1c2dec405ea45c10a86483ca669bd44a758d54e2902483045022100e66d7728323ed456ae949f21caa654640532cfc2fec562f41a71d3db272225b902203ea68156f0b6cb20e3bdb7bcfb949a947f17e458df0f19f4e339721980001fb1012102f50028e6809342bf8ebfac1b2d1d6693d4c3da405a6bc76eb4c0ed47571cf7a10000000001000000000101ea7dc78923a4939d3524472969aa9a64f7ca06b6f66a577faba8e244bb290a2834000000171600146154a910d9c9aac84589426d844d57195c383845ffffffff01200805000000000017a91435ebbd363e3994cd4775fdbffef329ba21fbd22e8702483045022100f7326cb6148087be2ce2febd061f833b28b68acb17b573bafd88d474628e2e38022045ccd970deccfc80b3b8fa4c13419ee2bb36ccfd2f97ff3fa04ef5978650c5fe01210322bd3328d402c09a0ff2b241b37e3dc5902891d8186c70611878e32d8e35aad100000000020000000001034bca1905f4767f07253e507bf26b215967d4c1859d3db802622dcf1278aa2d000100000017160014762b7427f76e42776a5d32fe0a14aa2ac61c36acfdffffffde7c5838bc647a87f9c871326e2a39d1e39fa6cb1b56281fb7500c6f521465d50000000017160014e318b0cedb745a5673f3301477e3b20023178d18fdffffffbb6ecd587680bca96bfeec04f034b6781e93a05c12b83776e4fc0a652f98cfb100000000171600140f75286919fba0238020409c1e5f56f0f1eafef2fdffffff01bca417000000000017a9144c3b34c84f04e3777bf45e72d626be9c8209886f8702473044022048224970b9d995fa7f722517a589676013fed300df7bf17397f1d056c4865de502206f52de291617459b56c034a02832f937f77841728deb10a69f7ec6b44f11c9ae012102a55cce9da7590c162a7b0f52e2c6c8e908fa0c6772644581762f9c6e3ab931590247304402201006ce8afb7fd0e88a0b8ddfdc6c17c439ede6edd1d0426f84b2a1900edca77102200608e9f8b7f80da24e5672e2c62d12bcfa0bc40a1cea23988063bc7c99b2ce7f012102305a1b49c478b91b38c92628964526321169b191b38af03df88cdbc7fb10ddd1024730440220604191454ef1786c9e8cc8630ae1b65aee8b6dad3c81f8b6f05d5c120a2c05cf022033e3a63118118a00a4cb77dd57c6c13974c554a1919dbb877c4a01fe7a9cf700012103dd39b395eae4f4199d63263ea7499b101c0b50cd0a6a85e25ca907b51b2cf53f48a00a0001000000012c57095f2b7052d5e67bdcbcb89cb84beab0917cb77c0541c9a2189229adda92680000006a473044022042738a4964c7c0c8f6179b04e3086b144649032cd9890169f98d6dc889cd0898022013b6e874dd3355882ce3fceab185b2e3a91d8eb38c18b55d54e943ee64d3ad9f0121022ba056f6699b1b659453a46a4fb7a127808449a74a9cf34eb5e4512033e1fa8dffffffff02369c1000000000001976a914df6b3a6631cb858fecbc42db01c0c8b1fa4c9d3e88ac8ed81000000000001976a9141d5a925312fc8b35722adaf4bcdca251c57463ba88ac0000000001000000015dd07da86290da69a1940f92b46946d09dd7b6f96391ab044d1c33042d949455010000006a473044022068cdfdba3cc3918dc133b58811d8253392b2bfdb79f9811f739391fbdf9cb7210220783dbcaee15fcf97b6db68b16d6004e09c0c9b91749448892697a8a9b06756080121022463169a3c5f11f99ddd2c655586c8e6d36c81c950ff93113a6ad561cac7a42cffffffff02ed1f2700000000001976a91421db291ea72641d4750c37b6e677b897fe99a21888acf9040400000000001976a91412ef8a698efaff34f4c66315435dd1f39477eacc88ac0000000002000000000107b45d04ee182e32e192d1cae6e290bfc805c1b204968d300f2172a1dbea8288c3000000001716001475f3c3a5165a25a8f99beb318e311fbb392ea49bfdffffff6645c5a80d6db1ec97f579e43b098b093986de0193ff898ff272473fa637d4a90100000017160014541a5d29eec60e80e393e2a2969c452bf51300a6fdffffff86f160b91b4fbeba802ca301e64d654e40b56e8ae19be261b6d77f291832e9d84c00000017160014edb920aaf8e2f1c8f6a6d494d08381add711dd68fdffffffc0b1d7661dd7fa1c7c9d67f0ce258259cf175db9e9a8152682df626d4c9581e60000000017160014493a633c8a4ba037df4e428f1f16922634a425c5fdffffff00015de1c7709d755842d09897e61a97a9006c60c3e481d0d737b2ce5a8a344108000000171600140025b3761d2306d262fdccff6baabb3b029b35fcfdffffffd2fff10a37e2d068caa229bdcf839f662d7991db7cb1a31a50436139752fdf8306000000171600140025b3761d2306d262fdccff6baabb3b029b35fcfdffffff253c0ba2a6872e8ad25478a7718409d231ab797c108bc70a12fc0d96db0477440600000017160014350fd445afd238d43b3914df08eda3e03ad1691afdffffff01fb6897000000000017a914d59853a5a3c0371da5f3cd6358c31b7d3031591087024730440220026c9b912aaaccb8b41d47b662e16191f2d6ffe1180dfcca9a9b43344cf5aa60022053faf4426595749ca227446c69257dcfb797ed3b37193332ca84a1a54c2b4f70012102ca396b4bf190e798e512584d6070283a1c9443fc431126d2146e289adb79f8b40247304402206d783f9873ca2fedd16870887350a8a547748b7a5d6215b663af7ea82200c93f0220268f76a527c96de50d0594ce47c8dd47544f48a039978856811902ef6ed7adbd01210363a398ec67c544d5501b8d3c7acaef99c79776d7d319946b96e5602d1820a27a0247304402206a8cc29e711934f66af4acccea8bf9d32004afe1cf3fbae8a0e41042513a82d702201d5cd3ce7e2cac23cb3177276dbd81a76262c19dfcad695426c7c02987eb307d0121036bd7ff01b062a7de740ce4f277a55cab5f197220bdaacd32f678e53f9fff84220247304402203b24440b5c94fa5d0f79ef1eb5b4fc69e11893a05d0c69e6d2dc2e56bb0d2a9902203675c17899328856ee3e28c1ab58f113bab3d18d47eccae08601cff11acfe9d20121036e1bef8beed272556d8a39779165a68068a488b765bca30cc506be32aafb58330247304402205d63ff5eea33f18b1add968d03148a045509ed9b8814134cc5b4a989c1381af4022049ba4c7583116364299ceba9c567c02366c4cd4ff29e098d78166807b913dd7d0121021c1fbee854063fe739cafcacf6e2b0eaecb916e44241eaa75892664125bbdffb0247304402204248a20148494eaf9e6199a6b73aeb4fa464d4d1b1db3e7db77e477c766a84a30220221799b3fcc0f2ab00e17346b3b50be94e501b846beae678cce545241eda011a0121021c1fbee854063fe739cafcacf6e2b0eaecb916e44241eaa75892664125bbdffb0247304402205ee816b1cc6434ef3c78a039c0f62afd1ea705a1ac97e858b3baff37aed75de402204eb1616637364b752ae9c275e08cc7f6dbdd657b8849f6d36b4ce37a0e6539b201210272c8dcfcf3a3163b22827839151229862bd0ed7bef7fa2a561fdd2c11699af7d48a00a000200000000010113e94aacd2bf534f2a886b1776f70d5b64bbc51dda69719be1f0c214e8f4fdd70000000017160014ec786c7d8bb67d7ab66d86f220f782d7df436d49ffffffff0103649700000000001976a914fbbb659fce8ecbcd95871b650f529f165f4daa0c88ac02473044022067a4ac878fbc075e8f751af9078cd02122f4ef9588ef54866c499cc9af3109bd022022373aa715658f7db56c4cda9bdcced5965409fdff77d2be3c76605e327b145001210300db88edf321df34aff3ca0573f33010c55ef148aef629211bdee69c01942ef80000000001000000000101c5d240495a328ac11f1c2fff5dfb8627d8116e847d6a50c9c59c71b88ea092fa0000000017160014625cb29e3b27e32a30aaf60c8e09136b9efa705fffffffff0235e133000000000017a91414db0e69c63c082c66e93700ea7fe07b48ffd42f87f14c05000000000017a9142fd9a0d25775da63476b48c316db4c8538fa100687024730440220030e12da50f812f18f6678da669adb99fdda1bc22f3ec557beaaf49836b28af5022015647666dfd304c867c8dfc7719a1227e8f0fc254872190584d1d2c1ae91309b012103c07fd211c29b5d618333f1318af23f41e7afe49d25dee2532ae6c8787cb692ee0000000001000000000101dcd1ca6e71b62bf06a9a2741c4337ebd8cebfe47c6f0bab0f53e133c1c701f670100000023220020ffcdf21214f1661cc3f29c7739e96f3d8691208f28a26e28d18891a8e39419edfdffffff02807d06000000000017a914470292261e769bfe1df1dfa64f46963bbf0ab6698736168a070000000017a914a006ccba66c3cd5d2e682d8d4d721bd53755dc93870400483045022100e8d26285625a97b704c16425e68d5e3d42c4ed38e098868efbf0da5f8aabc4480220586fae6dcb7fbd326730268a4d0686fa6152c7a142490cc4df9a972dd576af4f01483045022100d1a31c4614ef209b8d4119dd81736195e0024d9918f095bbe03fb7b9a9aa33fd02206dc0ba1e19cc7cc131e0657943805f9da6960e7a219f3fbf63a8766e5c3d7df4018b5221023a7b47fdec0634bfd44236f03a04738616b45298375262556178f06e27bc090c2102fdaf047e2cabe4a543b3bdaf7704e4c15a2325f452c09113b644168713ced78521032bd96f88cdb85721b520bafcdce72e80519b3f089c56276574665eeb3d3c3514210366f003715b170d37f780af1a1cddd4f0f02007037e9187a3b071e4e20a362bd854ae00000000010000000001016f5013e1fd06cffc68885c3b74ed94ad9030d5f71884a19a974e4540265c3df80100000023220020bed1cde99566a45ea3becad703841af152f71d001a830ff425c06d524c3b1834fdffffff02006a18000000000017a91425325a534522b41b2b570efbb80adae5765309fb8796be22000000000017a91417a788d704df80fc91f7e00292ba9395c8457a4c870400483045022100ca1e65ae610172843fc025290ddebde571ffcba247965ca312719bb3e4214587022010c67dce90bd0e938cf2513e991cf66b76ec2dded28eadc9a2e13b75bb65ac1901483045022100c4cabcfc4a9ed7156c0a06329035cfe91e9f7849b9ad0c7835089ebbd5d8566d022035ed5808d3a9544dff356e430d79050c285cb4870ed73d51dbc6a31253e94994018b522102b175777044cfd556a3a653b9277a0f13a66ad3ba006031df5a6a23d5a49c020e2102f00ee2d984902687026c20d3e1054f8e05e732d5b78bc9854913db88589707e32103a7b2e5c20e8993a9ff80be0b4e19e8718c0396afe668d01263c887e93331e0382103d62c309549248364b95eb710432ba28257d91c99304ed5807314ddfe0cd3571a54ae0000000001000000000101383de4f115e129ed65be5a7f4580baa361b8dfece86db9977b36ae2899ad574b010000002322002029e74387adc3624b88b2720ee007b1cbf1bdcb52355204813a02e758e8730c02fdffffff02a57946010000000017a914478bd63c757114e09beef01c1aa879f6dd760d6987b18e02090000000017a9148eeb183813d401e54bbfdd038ab7e87da85fcc5c87040047304402202c2f6c20a9e612d64c6c2fafa998fea21fbe24f9b9dfdb7e382c5d08ffda479c02203458d91d3a4c8e42ef94a83cc3b3b13002d4a62655ff3c7682939b34f7e68f2c01483045022100c4332e19f198e663369d3b5df3389e820d25c9f028667a8bfdf7064640d13988022046ef5cfa19436f31cff7cc97ecc7e5eb5e972fa543b7694220e7a9dd1cf8939c018b5221027720f40844c2dcc2a9b1aad205144d88ea1eb55111da310c8d8b582d33f33966210322ea70e971351b97db7f7ed3ba58b2ecfc9c18a00075b7ac57f18845911a94fc2103b76ea9b6b2345e752712e104006fe0fc807544cbd38904638232aeaecaec22212103c1794bde1cb5cc4512d46a9289d90122dcda6347b4ca3cb4003af5b83f53260954ae0000000001000000000101733ab4c07e00d9ba9d4cbc956a74bd8c1f5b67f1cac5acea4c51064b759e1b5901000000232200203701ba2621842cdebebcf58e37817ff834fbc35a537bd5e698418ea328efb7d3fdffffff02d81e06000000000017a914936d6a46ee239e31280893d75442b9574953150387e7d7c41d0000000017a914d12cc14c93213f1fb7b3454a3661b777b612d7bc870400483045022100dd69b67b680822e2afc1ea40f30049e1a252dcec1b30f6c3b2a5e7cb657fef340220619d95e4924e6b9802370d00458ae73520710385a0a0ca593109b587f2e8dd0501473044022029315f7f7f505dcdfe511357f13293c179441129ab6b31cf69a8fe6b2b31d52202207a63528090da95a1134c93d611b1b5493c37330f195f3708557eb1634ba98ca4018b522102ebe477c9fc403d75ac57fff3bfe6c6de22182db5f050b3f1fdf03b82923e5d862103387402bb5705e00cc7784e9b7680f33a8d6c2c66e11729101dcbb9412985290721037e1bcc6fbe25cbdb7bafd9b6343158e468ae71e153122d8dbbb48f4ae81f4177210398b8cd0a4df9fef78af336d047b6d3370cb08745f4dc76ee1b86e8f68fbd23a554ae0000000001000000000101130bf295ae5ff8d0f8e3281e1b34f1ba524304b406e3872e583530bc487d15320100000023220020bfc54ef9e97a8c86e508e2c082594680edaae65212672ed3f8020cf1b273c3f8fdffffff025d700b000000000017a914c0d3b9f6898e5c99f9c3d46181d2b2992f7924b987fc378e140000000017a914ebc36e44199ebe07e2d8ce47a1287611151e44f887040047304402204467b6eaf1481696fa62b7663a818b0f1242bb40c701a15775cc1cd54891c71c02204940e531c83d6603531e30133a678182c375c540255b1feb14564ace21df05c201483045022100c43f7729b9f1d08416d611439a90a81bca310611dbb1a0910cc389e079cb800c02201b0a25140effdb598d6e8e6bd44e28841ea5981775d5a36cb14059e86f52db98018b522102f7be50ceca3320ddf39f2c4651e8521739cb689a96375b7126dbaab613a7ca2321032390bdc8c2ef18ed529f258b31cc0f755263be304bf7b98be7857eccece2f5f521033fafc82182b97db08d64ccab3ef023e70da59caed16334b987393bb879f1585821036b1375669f44dfcbc6bffaafd80c3ef9df41785afbdbf58536399686813334c454ae00000000010000000001043a7fa2098e70f0ddf15a9673508cd5dd1bac5424275450311260ccdffa6a674c01000000fc0047304402202688cc2d419437de24f450e98256a861789cd972bf2f37b99163d9136daf059f022002f7a51054d5930f28eb6e2dbcedb5d67bd7d5e2f46f8ab8989ae4553adc38c30147304402202a0a74cd41bc69f63df329416e4eb4620fc27fcca60f0b8c00db94c8c7fe0e0502201156adf83d0eda98bb64c8c96355432f59f5591be2a93815fb5ca596bf18b950014c6952210375f68ff50fcef44f2bf5d0cd13dbecbbcba9ad3170781961b5fd1008096dda602102fd63e7682bc68e1ee9ee0422d1d37ca9c2eeb635488d5f3e148fac8f1dbe96082102cc4e4b3c6e734a9a3054af2f032adfbd02dd434c7b62a51dba97c0905a00149953aeffffffffb5392b043904af2b791f415a5eef7c5cbcb0f3b1bdd28e57bcbf6b6a1c4370810000000023220020eeb9cf137ec4e2bd98b9e2116d0b9bb73d4cbe78b3ddd0514032d20fe9e1a8c4ffffffff588b891415c09bde72fc221ed94a4b7470efc4136dad226e48863243bd4dc39500000000232200209c3e93d40a23de4e60583504c3b9965f33874c228e6957077ac443965fef8043ffffffff49b7b7a765796518cf9756b8fd8d3ae3a447a4e53047afe7227090521f8d96ac46000000fdfd0000483045022100f948c74bcf79c77a58b4368a182facd17b79fc39cf1aeaf69b2ce2a6c6bd91830220288b8578fba84e61b941c317adee9d7fb1459bfd72a4c80ccf9afe5917ceb17c014730440220684f0b52e7c345e061fa40f7f29c021419b6f841ca41c08c0be7112129f7157b0220360d7f0b6d74be4f15359319da2edcfcc1c8740faf9bb45e9c001b8737d3dccf014c6952210375f68ff50fcef44f2bf5d0cd13dbecbbcba9ad3170781961b5fd1008096dda602102fd63e7682bc68e1ee9ee0422d1d37ca9c2eeb635488d5f3e148fac8f1dbe96082102cc4e4b3c6e734a9a3054af2f032adfbd02dd434c7b62a51dba97c0905a00149953aeffffffff01262e88ee0100000017a914131d552a56e709420d601b5ae6b1b6fd6fd6f9698700040047304402202fce2de1cb265e934362345ba21877c4cc5293bd4d7f1c04b2f439d1cac6a461022069a8f352a2ac825bf56f95a482b05cc8bee368d2290e9fd9ac073feca5dcd8230147304402206d607e4f01467f574e304caa97e1826f2c52e89ec3ac38ff0ef98e63331446a202201ce3c58d983cd84d0ad16da42885ef28399e8bd36607abec9ad60c53b87b3a71016952210343097aad39f90f89e8b50a17d8e20179992bcecfc667cb7afee1e905d0a5ffc921027b30da9bb6a6a7840ad50c45b318fafe0128059bccb303dfbc13536bcca73eae21027fa028749df23208fb57952698741f90a7c0fd3524f762bcc77da3e79dda61e853ae040048304502210099a6c8f65afe61a47c26bc9d7cf5dbb062fb469e9a5b91c10ce6e1a1bc9f543602200a7facb6822dca83c70b31025faf7594b4de289ffbc8d421955d9f839e38b7be014730440220013e99909af4722521ce5ba299b0d13ab039af120e91e1690c73583d9e7db33c02207daf12adfd3f4ed2ce6a51373b08521d67112192dc08988783af42f832c2a9290169522103976e75248439f37a78d3263c7b780bf31060848a6e66fa1dacd5f24ed9929437210269d4a9aec4518019326e243741511083426268f1e4f80ac7f6937fd772e294d821036979619f0fafac415737e6a91e052ef964a8afd9d0283df3c63985aed709cb6053ae00000000000100000000010153423e803cbf48dafd448ec27572c4fe4d5b8bafe53707a28b316db2e5a06e230100000023220020115c4da1a0e6e7414964e3e6813b25fcfa9bff98e9652c33f6d11512e4676d7cffffffff02a00bd1000000000017a914c9ecba5048f30e56c1689528624a607692c4521787bdf570000000000017a9140fb0c20eacff2965b1f2594c250c165dd4450ec4870400483045022100940d84f4b7eb4caef61584dffe9cb9332b70963dedce413d100550b1f7f129a3022022536aa64a8099197715dfa29e068e07d5ce25e72d7b2f9d255b00a14ead33a501473044022053e9635f14e0ed497e2fba28d238d6419dc8363521b5fd0cdbd11ecc065401e102201a05696df46bcc2569076c7d30034634a9822fd7dff71fa5d38f4acbbb42ec010169522103110b6a279de37085c775c3899fa8bf3c7a734d346b86be7a6dce55a41623b4ec2103ab719ec244b513ee8a77598ef7a5177e7091390a52078874ed74b5e79d2203b12103b4e0d0ba8bb4a77b53175b02a8c311b57a7dca6afd5f20596d96c46f11ed827d53ae0000000002000000000102b3f1762dbf4741b86cba28399bd0aaed95d9cfff677ca928878f9d3d97bac8f90100000017160014427385bfc0fd72cb87c1cdf459fef28ba935e6ffffffffff56c443b2b13d1be316dd60c7070afb1fdb8c4a5855a86037573f8d51b4ec886b0000000017160014fe7bbe67b585e9793e39f5facee04deb62b6796effffffff0200c2eb0b000000001976a91406cc9254d1337c2bc93b32895bce9854a7ea109088ac689d66030000000017a914addff10151b48c89a9320d8f745f822fedc08abd87024730440221009716a58a86e8030d779bee5e2000534acb8c89f14f1930e1c061076b8ff9ec11021f6f98a23bb839d8deae110e6fce4d1680f04d8f00194ad9e91dff5915d9a70c012103a5ed074a159e14a35eb3830d7355237d5077d55d5eee3b23b0580838b44325c10247304402206555928030d773c05c1d1404064061ccae6ab506daf8a3271925fc0af4fc02070220102f2f1e2a17ff43d9c409f3bf49787520e01c9316ded2bad5f7863b3d97ba5b012102254725c7aa4f425be81fb2f96134a8bc5a021e4596be4ac11cbbb1c1cf324d3f0000000001000000000101da8bb35e94363550e7e34cfaff5aefbe4f4c0b0c4644c5bafd959701bc81a6770100000000ffffffff45b68502000000000017a914e3fcb470ae1679a9603e9be71c452e6bfab72c318735380300000000001976a914fdeb4f0531a35ae45ca8898336c5e6adbcf9938988ac50a7090000000000160014250a7349c6d02be065c01aa44f4adf5be95ab69488a01c000000000017a9145650b4b59039a2bcb12df43b2969b43722e17117874d260d00000000001976a914848e5b7135d011bd96453167b4475a3ea13baa0888ace95a00000000000016001415d96cdca3f7ab1fc715fae669b5163532f57a949f800300000000001976a91423747b54c03880d10412476d61730b9569b696bd88acdaaa0100000000001976a914ecfcf9df4086a30599f13248043df0c3af1da72288acfb8301000000000017a914317d64d48b00b086b06ad8a75a1b75a78ec1452187724c01000000000016001416cc6f3a170cc02d50e16d021c783572dce9b0193ed700000000000017a9145bc8c18267aeb6fc05e6ae15afb932977a9046868717af01000000000017a914dc92069bc5f8c481ecbc5e5556f2cc91c1fd7ba787c60701000000000017a9145153757dc76859d35a0a11c5629e62d8ce9813d18782d901000000000017a914c80df05e6c0a494e8b06891a565616079c19eabe873d8c02000000000017a91421571ea0e73cd5672382873794bcd5ae5bbf3abe873f4501000000000017a914f1c8bdca49906a0d01cf1e1e7abb0a7e859318a58780ba03000000000017a9144cf49d96d6f72c5747ee250735b79a9ddfa0b2b187f228de03000000001976a9146e019bc83aa8e94a3158e171d537e376ac4b3d1688ac649b00000000000017a9145b02ecc014c3a73342a9b2c1f140456b82fec7ba87037d00000000000017a914f8c72edabfe2b8ca6a65226b1330326783382fdf87508502000000000017a9144ec3fcc4f7cc22577522f5e9a09cd43014fa52a2878cd700000000000017a914e82a5efc541671c9fb901478ee3771545245f4cb87f18900000000000017a914cde861a4d3bbc5fa5e598604223cc4231b482ee387648c0200000000001976a914732cf229d3dc3b9b8a0803ffc07d4e364e54aba388ac0974a1000000000017a914d41cfe11faa7291f92906b83f74f1060fc63f51e870d8300000000000017a9143a431666f7212934bb454849c16fdea8168a204387a9cd020000000000160014667f320d0ce92e974f83a5dfd248eb35fffa1ca2ca3200000000000017a914ec00bc61eb3b36f47d90f6a38caef6940e5ab0ee87605b03000000000017a9146d18db1e7223616423bfa11a89eaf91bf201eb068752180100000000001600146813f6b12c4d1084046ae65617eb9c5a1e4d891a56d404000000000017a914e8b2b797ffea7db9b6701c4e74f861b489e8a09187cbac0000000000001976a91406b09b7ba9895737b9fb3dccdec88871458646d188aca3fa4000000000001976a91409342ae9402bda031e0d502c26f0703e3e6a190b88ac83e406000000000017a914506de8fb14225153ac2f2085954354e5f64d6f0087f1e406000000000017a9142d8426e7ef0c3543c5013e3c6833533a9d709be387d6370300000000001976a914a8bbeb27d3e193da0045a02a73cb660956aa3eb988acd7160a00000000001976a914b819ab4f519e161b9a8c00a6ef3e5246a1fca7bb88ac78a60100000000001976a914e7056730a33d0cc8d03988be0e7fbd9a3ca8b31b88ace94209000000000017a914ad3a0a179da4cea12d7e2124af0188c39e04e69787d8d60000000000001976a914b17b36526d7de155c09e7df0e584737499e08c7688ac7d320000000000001976a9140bd5b7f116333ac891ae36c6375c84f9ec98975f88ac265e03000000000017a91402389792625609c601797aadc1a2f9a1c9e9a89487ee3c02000000000017a9149f489fd780e0f988f7a1f2ae3039e158d03fd85987b17ab10000000000160014378b9eda380051ee13f90a85ee70dab21c79b8ce753f06000000000017a914b77856da2e8e590fc8a896648ff5e4e166ee52578720b00200000000001976a91481816a2cc1a5aedbfc4c283a73dbbda1b387a1db88acf4d003000000000017a914de1d4b750084c50c120050358042adb8c72eef1d87a05a3200000000001976a9141c038d128bbe644e141fe629185b8ea3685f82f588ac90c60f00000000001976a914efc188aab4bdef4ef5a941f61aa7407bf5549da488aceec90300000000001600141121d9f84b5ea07e9143da19a0101d041d5beaeaf25c0300000000001976a9145ea3e77e6152a36a3f1fd0d95c33345c2ff5ca3f88ac75383200000000001976a914cdf226c69dfc38e1ae85f508c777b3ed2ebaf64188aceb75120000000000160014b672b2e06f8c50c694185c5d44e57979958f390867450b00000000001976a91409fef07fca5f0dcabb6165a7237a7edac0af6eb988ac14ee0a00000000001976a9143681a13bb476e642272191ed3727bf62a54389dc88ac72af0800000000001976a91454a61925e0f88815d8c975f990bf53e0c90c0deb88ac722a0000000000001976a91470e86d8962818d118e30713f3c67ee42166f5e7488ac79c90b000000000017a914d1f2d29f97f4e3fa2690bb7c4eea7c560bbb938287e89307000000000017a914619e0c73b46f41d9e85ae424da4ad2a7ff763ad087a08601000000000017a9141026d6f5bfd844606102b35d60befdecb0ae3c6087fe6d04000000000017a914ef036aa38534a0b4ae9af6e9f341abdb2b5198e98735180100000000001976a914605ee8d2c843fd6f90a87cebaba83d1ffc79bccf88acaf4d1100000000001976a914a319c8a16ea40a49ca5c5f33c6eb6a24062a304988ac7bc903000000000017a9144c817aa2ca4c8921c2ad1906175e3a96321b29c78710cc08000000000017a91408c30df4a94e2a6d5d43ad09611b388f0b044c6487792e0100000000001976a914e98d6a385c83d5f872de3011dd0bb4ffad5755f488acb6b701000000000017a9144599a1cd3592634f2e55ef870d78a3d457922cd787090301000000000017a9149f9bee30e67d0239bafa13bce27b9fac77cdca3787768501000000000017a914941402f15905ad00a0e5bacbceb52ff045ff47f38702483045022100de5e2a9be135adef6906ac9d2e1981fcb1881ba4a9335eb5f73de76bea9d9f5e02201f21b91b78e5ba3b1750716c3d2de464fdaa6817911d6c82f4be76d1b796722f012102c1828a2409b93c16f8a3e1749f51cef63ce7ab654f86289c8fb2b791188e82db00000000020000000001014465ba6ec9712ea226c304f76c9d9aadd050518f19e2e16404ec80beb34ab3df2e00000017160014c08ac2a4dc0e9828dadf21a79ba2b5405b1de753fdffffff017dc803000000000016001451941a18020b8796c06c76a78fdd7617e3aa6f060247304402204b48c6ea21bafdabb903f49c29ca9640815262bf9e3300cfde7780cabbd6bc500220302108cde189ef54c9c13bbc446575939f6611ceadc1026a7c84a213d686346801210214e4e78a32a0df537cefe43cd1a06730532500a1079649e6a51a3056f07f83c60000000002000000000105fe186b636c257cf84d6fd5bce867dcaf0f9c8ddb336872219cea5e4b51fdf5600300000017160014b33622217793e1ee12a5bb999d300908895b681efdffffff5db9cb604d1c958eb234e9b285985abdad575452d58eabfc60c40489afa8ec9e0f00000017160014247ad1da9aa5f64d227c0658f607d547f790a5f9fdffffffbf1aa296ea604c85500a23c7cde62e95abc5e752433f6f940bdc4809a2896443000000001716001438bdbee2dfa7481148a02f7686b5f37ce94fe777fdffffff7b1a77d24803ed3a60df3d57b4fcf24d881121af6a9369e56d817cefcdee949a000000001716001486a779924ab80e3d0fb7e0f96c92f65e5ecf907efdffffffb9026e4280675026bb875ec1fa47c47ed870804c46f82ad02e631fc11c3c1aa801000000171600141a323f8c429e58568fa1b410ef41633e32b8eeaafdffffff01f88a0900000000001600144e54399f8c72c9ca14075b23881a1d474b5fc27602473044022005199979b5c0ca316c0ed3d9d72fdb5b72e6b0c3876300a9b1a0e264e6395349022033f62722800ffb80e27e0626b785d3929d2ef0e5be79b7e12740bbbd288b708701210283f7e11769960c746d60008fdc41fd3df4f1f443a8c2ad406cf895c1510c66fc0247304402206e55b27a139ddb03e9206dfca97bfbeec0ce5734095c946bb0fe15e2f41bf17202202c5e1e24cb56a3697c6ebc89ab02a6d8915b4b63c0ed5d786756ebbd25e015cc0121026f3dd2b358d0ce54d17b02f259122662826b512e6e49a1a07157042eb8765a3f0247304402203f97d4c350c4665ef0c923d7a488c65393681574087a251e19778f4517764d9e022062a66cffbf7caade42d4f7dcfac31c69c89874ff4449c17807b1cd96bc310d4201210240d91f801368c82e48099154ca05cba4a651821d41083eae24bacd890f2533dc0247304402205d9ca1aca0fde87aec0411fff89027109c9ba790fcd7b828e218df8cc819d29102201e31ae10d21998b1e0a48b90a9fbb969f280fa9cdec9424c46c3d54be3e7b417012102312b43428552fdd553ed4154838de44a3e8c25db53e7c297a201e2c5a89e0e3102473044022058c3e9f15d9d9a93c225113231c3aeca3380d990ef721c2ef098a7609502d437022068ca6577489dbbe55d9528e3d928443ad343f8d6f3936ff9d602f51e378919d4012103b69b742ac0552a44646fb873ddd2bfbc28a0dfc752cc25729ecabde26e35185249a00a0001000000012dff9378c7bcf8553d2b557551ee0f90b9b14ddb95e36ff8579a0c4a32d5b546010000006b483045022100f8ecb3228fb2cbfd9c1a88c1042580e85d7a862f4991fdcc0c49d9d25cd186d102201f4dee8074ffe008b7c43e4cad87104f4124df3940739f4903784305b18bf65e01210291a7eeb2e74fc3e83bc40a46075381043881c5bc8f13e78771c7c2ab3d715d70ffffffff02e0c81000000000001976a914f231eff7513ad38dba029b427d14df0db629517788acfd720200000000001976a914d42baedceb4d72b111f94d7a5e1a223804441f3f88ac00000000010000000001020c0f11181573d87d599293e4bbdd2239b1f949af3df9e796b48ecbe84cbccdea0000000000ffffffffddb5a3e5da0e5ae6a7a0b7fd621cc137e0f298625928b814841a02cd1f16e11c520000006b483045022100aa5ee846c3cb1fe23706513bf183e2a08b706f4bbaf75dfba0edb57f12fb3b5e022028ff108bad5f950942c49149b030796eb8ea09fc5ab42b6efd307863906e2216012103c8eecb1d332c9f50ca7878141afb90312d3fc865112f8518d36b31231a55bbfdffffffff0269a821000000000017a914f138c7121d259e5c9eb340f2534d721233ecb05d87795c1d0000000000160014b93f3a7b5ff1cc39ca28cfd181021eb5617f38e9024730440220606c5f8dd5d4187963a0bf758812b0ed050d81ab988b803b4398242e106b3ab802202ee693390f5a7de07de8eb6e4c0c40f5456d83be8a414c067ff95064e5fb66c9012103c4e084bead140ee4fc95f677b7b7a32c564db0c73fec7cfaa544116a030dfaee00000000000100000000010129e8b29ed71871b31aeb00a45502afc2ce54b6ffd1ad08adc907c6bead534ec11200000000ffffffff372e730000000000001976a914fccb5d7cb3ae61e95aba4523be2458a59d9986a988aca0f70300000000001976a91463c8d3bf2ee3014e7bacc6ff822e651e4f8f960188acb129000000000000160014781cc59468393e0a4448858401739bd04afb44aff93204000000000017a914a2241a66f665cfb3a03692cd4537b594d2bd461b8716ab98000000000017a91472377675fd69f923044b809ba7af67d55ffa5e8b8760bd060000000000160014a494d691d2a6a63a89797704770caf53ed29d6cd381106000000000017a91413f319c1af68708b146212db6fb01b52e2dbffc087424e2000000000001600140161911be88760decb43f032c7bc802ae1cfb6d420300500000000001976a9149721f3f7b1fe284722dec02f74506d80fd824e4988ac8fe40c000000000017a914b8ae3713b9fc237cd576b24b40471797de04d47387b36b01000000000017a914906c0689922e19317c5a5c0ece6dd46e5939b2e2878e380300000000001976a9148556e8fb62410c884f06645ee4c12cf6ab67408f88ac3d200e04000000001976a914a79e4effc7c914e97b91a2009c166ba1789eeee288ac6021240a000000001976a914f3e5204022a1e27890c10e38e341bf394a7a75d288ac954b520000000000160014da4bac0a52183acbb90d3bdba8bc2581ec20ae2fd35e03000000000017a91480b14df6194414e974ee499aeaef32a14c7580cf8770d910000000000017a914eb98dd49254f108dd9121006366003a1641cc2ac875c9700000000000017a91403fc3f5ddaf9936f5cbfbf39c5eb2d2c228686c18776e700000000000017a91491e5aa3164aa2a9e1bd8483263ac62f8e0016e598720a10700000000001976a91453ef8c978ad907c64f73731556d34d3daca17a9088ac846a2700000000001600141d622ef2c6de69345cb0467a7e683774ca459b64fc6a09000000000017a9140855bd7b49bc772b6a24e929ba9da43a064b2dce87924100000000000017a914c540509d13843c48692e4b8e5ab95470e4fc1b88876f0b01000000000017a9145ef34a82d8eb878d4f8124480bafe9b14d4bb26187ed8a0300000000001976a914f80ff753ec8cdd9d25675fea230702e812c7881188ac47d910000000000017a914207f7eedcad07e8fcfe35d229a44c5a2a09575fe8756c202000000000017a914f0d338c837c0bc06e279183d52aed198e92d78d687f03803000000000017a914e5ba77cc5bd4e25a35e4798dde39cf83813f5d628739e8040000000000160014bb0522eb5747539e9e45f67b9eddaf2e47a3c45afa990d00000000001976a91474247bea0a2d1b6609cbec19b78f5d0878a842dc88acdb980f000000000016001422c10226d6437d94762d56e32f5797dec9508e0e801a06000000000017a914321f47cf348dc77a10b29f7108fc65a6219b073287ae8d0600000000001976a9145db3e333dba73b53c6cb68582c8eac87b22e7b4a88ac9a7b0d00000000001976a914e4ac15eee812385ff7c2443f8afa386e4562e35488ac80d810000000000017a91438b61aa62c13c1a3938aa59a2378bd58a9a7e32c870c3f2000000000001976a914b99fff21ddcfb7d693fb94d20d47b4189ce0dc9a88acf8a101000000000017a914bce5d28231f7f5d231262248465f5fb84481326a87e55e0000000000001976a9147e3d8df8bde88298a88d80dbdf9b5aebe1ab276388ac0f9e00000000000017a914e2e42de8afff91696e24436556f62ed0a0f8163b87605b03000000000017a91438cc0f5e4a1bba6dfd90bb08dbfb8578a6abe2c387801a06000000000017a91491d6e648ae49d8029fecd090b99eee238224239f87e23203000000000017a914e5c5ba04c30ec6998426f834075e7917af943450870f810d000000000017a91426fb151ef5acfa7ddd911220c4c4143dbd585faf87c77800000000000017a9149b4241f888b5b8c3cd8e2858347c5dae4f68a8288755ce050000000000160014fae1e0dd147ccc7da0dfd344b503569ed269695602ab06000000000017a9145f49ec9e9136130d2b98e07435149443a31fd8de87ed1c590b00000000160014c5df1d10d7b304d637f6933b744b8c146f6c70f7df5d03000000000017a91408a859bd8521be57104c5e32eb1653aa9235e32587a16e0900000000001976a91418ad414b7be7351af54521d1da3688a3571b07c888ac43c109000000000016001442ade420a9e870fe17cb45a9e4e599a15814add00f7b0800000000001976a914be2ff7e99190526ea5acec589d09814f06d84aec88ac18ad21000000000017a914ff706eae5ca7b8dafd753897954b50e127260f8487d5c52100000000001976a914077c99b9f7020a60e40bbeea3f810e9fcd80b6d088ac1b5600000000000017a91426e5a0223e14a890ab366fa6c393176e220764c787ad780000000000001976a91433bb2c2169e6a3ca1ddc40ec0cb1dd3cdc9da62488ac0247304402207605d4d409aa053b9b32a7b70e7d39ae8944cfde4fe92af2c8c92e1a51805e5e02207d3693e951d9106150d8c96ad1cbe75290cac290a82c85b1da70cfb85fb7e841012102bd04b9cbfc5e6398862826f95c7b65166ca588196454326806c1ff36c8b677090000000001000000000101e2bedf6222c4254d851f27b9d95d7eb9b1a4e59cc8b7d4f98b7d3183c66f67ea0000000000ffffffff3c9c270f00000000001976a914d8b69b8f07f19223f95d8468311fa1b588f9ace388ac39510000000000001976a914120c0c252a10ec540aab3da5bd00a78ac266c64088ac6dd000000000000017a914d78ec4d907b007c61a1298720fdd7db13f03fb6787f45c03000000000017a9147de3919fa6ef83824fd373546085a91b0b00668a87c058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f9e40c08000000000017a914f7a529e895a597be3e59f0d0fefb75a32cf7e81f87f00402000000000017a914c5aacacf8e034c0e188749577ffd1c50fbcb000387dde156000000000017a91476f3e9308e3dea711a1f678e3b412cb5408a3b92876ac50200000000001976a9147d7059130af0efea343d4bf700fa078aaa6b8f3a88ac7bdb010000000000160014c2011c32f7c9d8f6d1278ec9a10541240aa1b723298100000000000017a914fc3a314acb54374c0ab58ce2217b58cbb92833448760a70900000000001976a914b11bea33604e8f487f5fa871f658cbc70a919a0988ac54590000000000001976a9145b33fc3af572555a76e53f6d8419fda6c6574a3e88acf1df0000000000001976a91432ef77076df09836ace982944b81545c64bcc3e888ace09304000000000017a914dacf76d360bdda9a1a3d080a443b588efdc73bdb872a8f22000000000017a91426659786c306f7682fc34e9b609139775a1a8c7987c058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f97bb40600000000001976a914447810b1819f6fc1a9d40ede42ff1847594bc1e388ac037d10000000000017a9146a0da2901df51543332f0904fd96a30020a75c7c87409c00000000000017a914a858c26f24aaa08c6a5f82cfd0a0c8fcdf8f9f6887fc6004000000000017a9146fd5f285a371c9704c8d5e48eb68726c9ed6c47287b43600000000000017a914fbe8540f745883ddae3e4c373282f23429b730f287eabc06000000000017a9143866b661eb78fae7f7f98724efa254d7b8e3ea8b8788db00000000000017a9140f2b83971b9129b757f9e07a780b576ac25d236087a43508000000000017a914c7eac1f341627762e9883750bb4e3ce2ec57ffa587e35403000000000017a9140f4f52cc10d07b865678116e7874cf7ffde14df087407e050000000000160014bad666c8ded6216178f96e4c6a3dfa49018d3d58e43f04000000000017a91452a7694a9f351fa658a6a33952ead147ee84b24687dc562a00000000001976a9147d86b66e2120991225d684a8961d22be0c08a8b388ac546700000000000017a914654aa552f5c607b039ce3ddcefcdb6909b0e33d587102700000000000017a914d7a8d46a8b708605384a2f9ce59f176e4c9b58c587023b2000000000001976a914c9418587c473bf4eea22dd6cb19de2ee8864e1e088acd02a0f00000000001976a9147e985203476cebd488b5847b352e100ed60613b288ac4d690800000000001976a9149e623a1f1cf10e9ec3ac33961c8ff3ecdbbe350f88acaae27600000000001976a914420e25bf62f5973857302cf61704bbb601643fd288acaba401000000000017a91475fb3b34cf1693e3baf177260adf2ab61034747b873ce00700000000001600143d5caf483ab59d7e198722943d36b15374500a52bc7c0200000000001976a914b5cb6fc1d801220fa0e64cbb3be0454cecf0461d88accb945700000000001976a914715cf00a3600489b1ff0f32c267038643f1ed94088ac12bb13000000000017a914ade445c86c508ec43ddd7923070ae4391cee0a2f87bdf801000000000017a91462e6e1dafdda17778c8b6bb064fee47510603f53870eb1020000000000160014616bdde03a89d9f0a30ef3121972f0aa2880a678306f0f00000000001976a91426386b2b926432a9ec6afab9fffd5d5d2910e0fd88ac683003000000000017a9141b905c26e309a25f3955ad3b2b16d9a09870c2c68776b72100000000001976a91465febb1e04335f4941d194166e1a461e112be2ce88acacb406000000000017a9140b71e6fc3664484e535f4f97660ae9055171eaf887cce001000000000017a91483e77ed71ca3ea288a964eaac6024dc83ed2b9bd8790dc01000000000017a914298b985b6f65cdd7821b9e99b105d566296d63078785de030000000000160014fb0817b68b36a613fcaf5368a7e2f69dc3ff11fbd0b104000000000017a9142d7ba092a88fde9bcd3274f31b77e5f8cb25690687620201000000000017a914f3554a069a5826ad3258664207f7692cb23f92cd87e5ba00000000000017a9148adf0dd4132b1b6358e567eb1670cc3fbaa05c8a8701dc03000000000017a914809967524035414eb43c2ec4f28e3bef2e150b0c87948100000000000016001460e340f65afe39e9eddcd41624bd7bb4f8b5861b35d301000000000017a9147ad2690676bf1c98e43bb0e5c683accba606bcfc87b860f60a00000000160014b857bea64289a9f60a073c2ad331248412ac371d1e9b0100000000001976a91483e84b9f27baa1caccc88d15b0ff471e87cb87cf88ac93d700000000000017a914f0020c8e888f720ba282de45c8302cd3be20cc608795ed39000000000017a91456fe1501ecb863fe719823efdd9e9157ac8bf70d8723ac0900000000001976a91448dede4814de368ca8065e61a23893731719685088ac02483045022100cd5fe9cfea6072fc0839fc000af5d3bc420cb5b69fd6a9b8a18027a8fe1c6faf02205007e6f0e5d01e852325a5c04ac12049432f6f849f6da0ebe6ef61a92076b678012102030946c4a9e3ea8b950c2f08051bae4f2adc9bef74b0c55cfd2713becd99cb5d000000000100000000010175ced4a484add320d8b546acacf981ba512c1757846cd98b0c69aa4eaa96c7001100000000ffffffff40c27200000000000017a914621e02a71e20c2a3edcdac4d75c575e18ac4c3768788d7060000000000160014d76e84b5c9ef5e550a0c97126eb9b6b60efe30a152de0500000000001976a9148292cf1041e2330bb5dd337515d78ce7acd0a3d888ac5d2b580000000000160014ea60527ee36d1f837b40ddf5f06b13b1f421aefdc058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f9ac1001000000000017a914566f7eb6443d1cd2fad35c83fad3720c4bcb54e0876f6a1c000000000017a9146f1b3f9646ebced043180c73fa816853c07f9ed5874bfd4800000000001976a914494e2efd06779805b81b09656fd01adaa0341a9688ac803e00000000000017a9143fb3085cb50a81e686faae47fe598c4552654c3187fc5d03000000000017a9148e497879598cce72fe56e4b20316cec4bcc6693e87e1691900000000001976a914af40788d67f43a52526b2ce3c4971ef201a1eaf788acc47e06000000000017a914820c3e24201576e84c9327b913659c84cd31544387dee40b000000000017a9146f1fa975248024bdf0a540f26862afdba760cb0d8756c601000000000017a914d12079a7d533fd24a264bf9194e2f2e8d12db18587f7b000000000000016001476289229327a6119f2feeceb5912af12311ebeea80ed3e17000000001976a9146abf5a71fe044b96f4a6ccdd487b034b319d84ca88ac2c5001000000000017a91478917e0f655fd4377e0fc0556107234a8d55dad787a0860100000000001976a914a8f5d4c934b644ec4178a84305272653a6fe125888ace3610300000000001976a914d51a56c832a9481d5a5571df383eecd8ef45010c88ac84f09000000000001600141537975744c76bfe849f86138e190bf5277a1df6bf3f0500000000001976a914fe35d185585b203121bd4930213f1fd06050994f88ac880ca5000000000017a91434a3569a0ce3ece74217da2e9bf07d0c096794ee877cd500000000000017a914310163a9dca5fd80d2fede9b2a5a2758a575f57b87c1ec00000000000017a9144fe9d65c72feaee417848a1ad7ed4edf2d5c60ae87cbeb03000000000017a914cc75433a7df727feae5383ca2cdd1fe6916c825087d0eb0c00000000001976a914d0b2d5f710f3f80edb296d99f06709160eba0db988ac6f4f0c00000000001976a91408e17ea7d9e97b1e41ad052e2be4ebf4724224aa88ac3ae801000000000017a914673cef63a222c0fc87644230dec43d9394234cbd87664a430000000000160014dbd66b231a73057dbccdc1d05d89adbf4017150dbfa909000000000017a9147dc1ffd0dca5c57cc62fcb9deb752c307b179de987d37d0d000000000017a914c5571b6e7e60a6c85dfa459cfcb7391bae340b0287513803000000000017a9144d0fa7c52e2e823d73b670091d08178cff791990870ff71a0000000000160014dbbf6901571fff530a916b2a47d09d781b1a9afe82e00c00000000001976a91448fab79a6707fbe0c890e89ce9cea0d4b4f98e0588acdaa300000000000016001467f16e98361936075e5c4a0cf67e5ef30fcd3f21a9eb0000000000001976a914cf6e8706b4c4b7dfe0d40978e079806a2e354e5b88ac96f20f000000000017a914b925e2fc53854ca65a8ee9356efc59ba7b689b1f87cfe41100000000001976a914c5a0360586cbb411b3b83d8b52b27fe9cb0f9e0a88ac035c2500000000001976a9148c7605902ff1256c6db596cf887de2edcb0d910988ac1aaf01000000000017a9146f56ac6b59eab117f1e6c7cba21bda725a7633578742950100000000001976a914e3f56f11284224a01411dd60cfcf3f027580354f88ac1d9401000000000017a914248a9315ce0a5d74a4db5d8d764c9750ee03e9a887ff6b08000000000017a91453d4614bf575605a7e197151336dd70d58e40c65874c530b00000000001976a914d6f7bdf2f01778d6103694a0f66202d0a5a48b6d88ac44ac00000000000017a9140784c7dee91b1070acd625865a737f37f47885e287f4751e0300000000160014b9bdee0efb4003f321e9fd022429eb7ab025225040420f000000000017a914fa01f671bdc21d3538dbc4fe6af29450769f514887488a00000000000017a914075ac31848f1273d9eccd73e20f30ee2c346fdc387fc5d03000000000017a91400f6ebb3a2b4e1dfa925aa3140587b1061d9c7738787380300000000001976a9141ed4502e37e9718eacbbabd64d5aaa972288da2d88ac084c01000000000017a914e5cb713e51d06feb216931b63b74c5eb23231bce87fc5d03000000000017a914d102cc37204b238d336e53904e6a8ee7bc255fa087af1c11000000000017a914e3c1be36927fd4720c5ea60bdc90f817c7577ceb8720af01000000000017a914fa797a1b38a33c0890bc239d64747758910b55df87c29d00000000000017a914c7c017c68377c7116ad0e176194beb7a4323a609877fa600000000000017a9142fd37f9b296de42bfad6d8e1aa2eec3ce7b2e7e48748ee00000000000017a914fb73c3e930b2995dea1bb3471cb2c366dc81eab487ca680200000000001976a914fe7f4bad39d877f34a2e16f2ae3f8ca1affc0c1f88acae3b03000000000017a9146c58ebca64b48748958b8dc9eba7659ccba3497587c058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f92ae30c00000000001976a9142f324eddab914193afd6a532a237265b4c29ae7588acfeae01000000000017a9145e57b9e12dbe938e65b3304a3fbeee19f690d7048790d903000000000017a9143d93fea2c9c59fbe631b192b4e48fde5208e15ff870a2e0000000000001976a914356c5e7a7714d12fd240c918bdbe0434db987a9788ac0247304402204c5b3d928fa08557ada30ada99dc5ae09e511f10c1a97cd11e8e7a8185ec49b00220753801f706779db22312f19fbd1defac87c4952383320e6aa276403df4c9a78001210339fd0c78f9f1488c314d437a36d9de7d451dd45c1f87a46232369f6252e97bd30000000001000000000101c9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d742300000000ffffffff4788d90000000000001976a9146a355b605c2cf07cdb25a75b802b52fb592250d388ac089c000000000000160014d5eab5addb2f36b3e83185a7996089d822b1d732b4956100000000001976a914532f703c7971097c6ab5dc4a354a0af48f137fc088ac4a6613000000000017a91427e819537192162e26e66eb214ed308b4007835c87298100000000000017a914795d922866be128ce4f540cd9b63bf8cdc11393b87162f01000000000017a914f28fc7f95341503a7dd7d5b37be83e0bf736cb6c87701a0100000000001976a91485c80e0598d6a3ee640ca60b993a5742c2e0216188acacc5000000000000160014ac1d7d8ab290d1adcb8dfb409b6808b610c7cdeda86305000000000017a914381132746a5ca271b68314f220f5d9fadd0db177877fb00000000000001976a9142236de3c0b5225b24ae50b619d3d3eb6486e6b4588ac7b9e01000000000017a914aec8791618f4813f15c394697710703b3784e8fd87078401000000000017a9141192ce9805fb1dcb4d4b0de6148111766584eb8e87b0a702000000000017a914b43be76f96123f58b273675b7737fc942cd9c358876137ee0200000000160014fdee8f513d513a8f11c502c675c8d570c8334e37dc9503000000000017a9145e713a5c91a01ecdeda6742dffc380055cded587873a560000000000001600147da05573c3509ecc72a0281326ea21f4d03d418b5ae20000000000001600140bd435721a27d5be3f8f3d83787ab343ee6fa4a3e1e201000000000017a914301320bccb329c44fecc306764c9e1127076ec7687671a0100000000001976a9145aa59d0f5b62d785800320d1bead4d014695f11588ac731877000000000017a914d25ba6e1db93662c79be01499be1b2ca8556f6ed87f47800000000000017a91408337281846752a34152aeb1acb2bf5d9d25b54987475e0300000000001976a91436fa05eb65d338ff5739d0bb5311da2b52361d5e88acd0cc02000000000017a9146e48e94769ec15c540899ea3df952d35c809d2508793d700000000000017a914157274410ffa3151b7ea1c8895b7b008d8e2c61d87e0fd03000000000017a914f1be6584f04b3f992219fe41cf0c4a6910b8abf987c4481000000000001976a914425c760a71386afd42cc66e68ccfc6de9c4b47a588acb0a103000000000017a914eb3707466071e2caad5a7184e78c5d39a3553a5587af020100000000001600144bf0217fbcfa017437357b24771aac66a7fea881d2e800000000000017a9145c439e1963caf2421438afab32ecdae5f385dd1d875d220a000000000016001467173550d6bdb7d8947edce7d73030991e8fd12d5bc50b00000000001600146665e56ca7f62a23af2ee79b41cd70f529538bcde67d0b00000000001976a914b18fbf52e2305e0e0f005fba2064369dd6df98c088acd59003000000000017a914b64afefab92543e42e48fec62cd477db48e776bb87ba2608000000000017a91468cfa99a4f0d49c4ee8cf3869075335e9a1cf745873ebb0000000000001976a914da179164f2d5a1e690a5ad2c4fa70cdfc43ced7d88ac0445010000000000160014a9a86d003084d4d9a6e09cd47233b8436321d5f385a601000000000017a914ef6671ac8611f1f663254a2612d01ed49da5059a875fac00000000000017a914962ed8bc0e8f96e426594f0e0503282c3eba9a318733690100000000001976a9142a4a8bb2d673c832a3219ee443f590c20fc4ebe788ac94cf1a00000000001600147fabc362d4f5f5188556f73016110490dfc71bf59fc0010000000000160014eb111de04e05d4d4c497e527b8aabc149ab92262489501000000000017a9146c1470cbac2eb791fa498a96ad7301970f975f948763c4050300000000160014b68f9aeade51a76c27581070612ba2235d92e368fa660300000000001976a914c6e57a871e818642e53af953978dc882ae990fb988ac75ac00000000000017a91428c4d7267187d1986b15184a9df5117a724d4e67879c5b0200000000001976a914eed4420ab732eee9710d3c1792d6fc4f3adf534b88ac00260500000000001976a9143084267c410a4f3587c10129192fecacf2dad34288ac047532000000000016001462b8eee51a279120658eb64a8798116c2fa80ca1f3a320000000000017a91466af9038b8cf21a24fd7bdcc3de6100c3350cd178726af01000000000017a9140e793012231370dc91e3d4df024a6e374acfb18a8735000d0000000000160014f6a04e67650314ce62be72af032ecb8e979a1d1507380000000000001976a914b60359f7892cbf8de29e3cc75920b38a6613a79e88ace8fb4b010000000016001474fc9dc1220a634142c83d379d0d3e944f1b59320d900200000000001976a91402792d96581b8d4721fb549374f04b5fe9e0228688ac5a150200000000001600147ecad926f63c9b989f88aaf8e1df9b777dfa1f62d46aa8000000000017a914accc646e8abffc8cc6eb6a9d8a28a77410a1252e87602501000000000017a914e4528791514f443e7389d2cf8ad49f4044d671d78736dd00000000000017a9143d0ef72990b36189385b75cc0ed94dd2194acfa787583203000000000017a9140c647b09c45dbf5df10a158fbf130ee25d772fc3870d2d02000000000017a914c6b80e18a26990a64caf4a315a040c09fd2619178771610000000000001976a91408eabc66df7ed7e94b4dc8dc3ca593ca42b63f1788acc058c20600000000160014eb67aeab427479859a73d6397ce6e6b9b7a421f963110400000000001600143c213025e47a1be3d5675c33e1fa02ff8fcc98431be01000000000001976a91406a844915768d65b8d429e4488cdf70bf7f8d58b88ac27da00000000000017a914b8f2602ee950add9d51da92251f09c4cb3aafd908721da08000000000017a914d9af78563efab45011975a12877ad2229b83804487d4e4090000000000160014911f8ce5f8c4a49eb05607e1da5a8e8d24187af8433b0000000000001600146c4abcb1cb6ad2db352fb8b41c17e5b8efa98e10b15900000000000017a914405a5208f784551887b0e0d0e47e34f1b5d389ce87d89a0100000000001976a9146b66ee73bfb6d92642bb827c2cfe5857c597099088acf5440100000000001976a91496a632870c1b99c4bfaf9edc4c0fad063af204aa88ac0247304402200790931957eea17ec802b1f59efc488e3468107433dc51485fce7148099d2fc0022076ddf577b2d53606b28aaa55fe150818f4c0e15562d369b46163f970b16b8427012102a884a8e75c5e0cce0bb1a0f510c0f87c2efd45c4cb1a6637f04a442e4d9a562f00000000010000000001014039b775199241cb5a466311695d74514371b0fe3b1d8a1131d027724e9208442300000000ffffffff3b36ed1f000000000017a914baae100062852a7a8b30177c7354be84a55f75e987b0ad01000000000016001474c8d60bfe94b926b77df6bab3c928a5d029b3633b3d00000000000017a9149b99dde6e026a6c30cf9bf54740338abab49795187cb4902000000000017a9147286df6ad497ec67fe7c9f04ce566aeb6c364ad2871dda10000000000017a914e96f83187cb1f695b29f941a8b882f733d467efe87ae271400000000001976a914a28ce423ba7e851497c6597015b2aa8accb9572b88ac22e120000000000017a9149829b161da751019ef22ae08999a41c221e92fc7877f480b0000000000160014ce15419a9dbfedfdbf690479c895a79009c12de11dda1000000000001976a9143fbda0521dc9b5937ddb288d70288642ff54ebd988acb1a202000000000017a91447955fce93ee1d539646ea1273c99a25394e447a87d8d600000000000017a914238b0b906c17566f805c287f02e5b75deeafe39487c66c04000000000017a914ece31172a6cc280840a5228951dd86b458115806875e8b0300000000001976a91488f3b8e3ed433eafa99a6da507b3ae76ed46600f88ac03dd0300000000001976a9148e2d6a5db4fbc07aeaea6282b28243489ad74d0c88aca47b01000000000017a91491830e42c8c21f36a736783a4adef63b90c2f6b587523b0000000000001976a914628cdfa93b1a639cc816a9299567ff41c1b8338c88ac10c70f000000000017a91482e8cf68341cedb358bd14a8702c3b8b75f77557874ff50e000000000017a914f01adb6c43900cbb2f09933dba5730b8f98870e887422165000000000017a9147a45e67b7bbfb13cb72325a3bad395c7b97adec28711a81700000000001976a914e10847acaf7af82f11886e071fb3d37b498a872b88ac4b7b0d00000000001976a9146541d4124773e4591bcb1ac93bb502fd8a94c37088ac7ce600000000000017a914011841ac4e0bd83666c424d2b4b0331eb0f80ff887f5b403000000000017a914ab7665b914687ad927c8bc5185c13964495877fd87bfab00000000000017a9144b0c9b07c9246c4adb7f09f4352bddcbc623df7887573b00000000000017a914ea36bf36c6ff8965346fa6b81c3cba7b6d3090d3876d4403000000000017a9149eca99cb0d622af7a64980a24750050035b02144877ab50600000000001976a914ca1e7d50795760188b75f52acf83e7cd3721293988acfa7e02000000000017a914e6c3cbd55a41e11e67ad33bfcae4f5491bf9c59a87babdbb2d00000000160014ff2d6d5a936480b5e5e78c5c15b706302b5f55429d951700000000001976a914699977635e25ac59f7a515b52a90eaf917211a5788ac75dd0200000000001976a914eb22944825bc0f7eb4a6da0f1bf9f5035363ecb488ac55d8000000000000160014d9295bab42203d1e4d1da4ca169eede32523d1f6b451060000000000160014679de303090d42de45361983c1a0d50c352cc38691ac0000000000001976a91407518d2c62e15a3d47df9bbe7964da41cca351d888ac8a1302000000000017a91476ab21f74173133861d9a9ec348e545e733986cc8717361300000000001976a914dddf4b89a7d60fc8344173d168f4a39a4d97fa9688ac10b102000000000017a91432cf9dadba9efd6246f5ab38568373325d5c132d87ef4400000000000017a914be615c40aedc26d50de572e12b8e3695bb9b008287e7680200000000001976a91496de151d493578b1637dccd23195049f91df6bf988acdafe0400000000001976a91469a3079c11e976b1675255e28d0a77a3a89ea4e888ac1e8702000000000017a91436db66ba5f8ff2ff41cfe6abc23753c0ddcfebef87436cfd0000000000160014aa9ed5986559e1e77f27b78f9beb517f9b07af8dc40b010000000000160014b760b6f5efc3cf8c11b4ec7530a2cde9b5f1995182a300000000000017a914fac81216f81baa082c0f64c3bd175d33d3ee526d87636800000000000017a9144212b582ecf3e1ddead775c6f0f112504d096ad087760408000000000017a9149010967c7e515a91f7001541f79667db8e38c6ad870a410100000000001976a914daef4bff15b2a29c4aa163cbb9a5d7882ecc216a88acf58e17000000000017a914c55f88d81121ecff09b3e6dca8be4d8b7dabbc29877e7f0d000000000017a914a260c3805b38f5fc59e0e2b74e4584e724783b2187e13f0800000000001976a9141998b9ac80057ca7306d0424656ecd34fb7606ce88acba1d1000000000001976a9148bf2dfc49e98841127d01af816cdf07c3f83c54f88ac08b500000000000017a914f790e8868512984f09f84a7c7caf17ade6860d71870f810d000000000017a91417dbf57a816f7db635e7cf7734b5d2d30325e74d871a720600000000001976a9147367a127b35d252fe968149e53c497693729763e88ac222a0000000000001976a91461bb6307f437e291a1dc719edcc97e0eda35728c88ac79610300000000001600148c480c838a68a5dc6d0697fc58a2309f75203f708096980000000000160014007b1e73cafccf9d3376d3b21aa672fced3ca249598306000000000017a914c2ec26a35cdefa9626b1364c5f07c4e4f4932bb18768cb0b00000000001976a914dd017775455444310d8be8d5c96b006e0ee3353b88ac02483045022100feb73c26dd630c7303169d800f8cbceba835a5c9b4a36de1ca0b443c7e00d98e0220018030a51459af05573f266be82146ba9979ac08557c72547211e8bcadcd96cd012102f3d191006ff18eb5615cb25351fe456bf39dd25c2243554a632797c2615af8f30000000002000000000101da1d3c6a5078b47a753e47fa59a7cc3902644a7264a729d9d1bd7b9090419ef70000000000fdffffff03c0c91000000000001600145360bfe8e1dedf111f7d323bd7f415b110e54b2a275600000000000017a91404a24b0288393f633ae2e1287f5f095a25089ba087626700000000000017a91412f3c7130750c4886d325fa1065975114710308587024730440220087f8ea014cdc5ae3cf395f6dfd31b9f0996c134308b2948312613faa4c3b1aa02201d4d7db9ba771f183c23080a7e689430bf4908d4abf50c12ae3a83dbb790ce21012102cb4dcccbb744ff89028056614ce5b3f246c9033ab05cbe485ebbceb73609d72049a00a0002000000000101911f5bc5509347f7e12ebea52bed419b40b272cf4c0a65d9dfa0501869e4a1290100000000feffffff02125fa31c0000000017a914a8251054a547765a09a39af5eb646c9fa164383a872b9a0000000000001976a914f4ffa6110c11f221bcef6ea8be4bfc0ef945234b88ac02473044022066822fdc8c3986e6c09a10d7ccf0c55f8c574f2be58a20f5720a6a633f285c150220575f17f41aff17210e1c7f7528cfa9ea260b5a0c35283fb5886536ec5b0e97b3012103e8b59ff55a1e2fee644dd9afcf8f1045eb60c700f29c076da88bc6735753081149a00a00020000000001011971fe3496205ef3b5cd9330c8a5b0e76687a40fcc2a3c2bf2302bd0f7b32d7f0100000000feffffff03b8ca392100000000160014f1c43176d9d540cdffb018d42c7eeeb9d05e6e0106de02000000000017a914af731c437fb57f940bfd02791ee59af0fb81c61b8736f5940000000000160014a691ee171cf1e4f1702b6f3a92e676db6dd7fbee0247304402207bcea31e9a16cda0b6fc3f385397c72321e8a497dca7ff0d907446529982b73b022049474a35ff756b00b061d3aa5cccf5fe79085684dd8dc35d5b20886bae51b375012103fcb8c3102c255348b6fcbbf30f6860344d9265daa9d8d3ee09974f90400c465549a00a00020000000001018704b70b64ce2cab57cb538615f5ab8eb9186ca0f3c2a02c4acefccdee92f6b60000000000feffffff024afe0e000000000016001404756795e40a22c7433af99d9a895761420d7f2ae61500000000000022002059cb8075368472a8b24a2cd5f634bde9a71b9cd36c106855674e5d1f58934ef30247304402203a91ec26474ba2ecfb064bdfd3b8d37f34d8bf5b09db5e967c37f77d7ad4831f0220234c95629c0abdb3bcc81e0e45f659cb747223cf7d0270b545839273cdc10706012102e7826c86e916e0e69ab193eea998db2e35a468bb84efa71aaa3c8fa237d753dd0000000002000000000101cc558bf1ad3f28321d86917b2ec24a081dd3512692e8c0c52cc20158a72510e90100000000fdffffff02a51b1e0100000000160014e49d3c2c8f1385051584d5fc9fa58ac445001a0b24071b000000000017a914bac77a95a0284aabad59a72eb6232c3db0ae55fb8702473044022045775b12fa7334936c7e701f45eb6bde8516295d35c544f09eadc2b18a907fb8022006049d4565c90094415a51fd52f289bee8e46a3da02ca075e870bb70812dba9d012102e210ec0585c95378af4230060a9ce5276211c88847b8d27ff80f67eff2a3a7e549a00a0002000000000101b6b7cc9c52801d0b0c382e220a2582434e629ff3246622def2ea2ae484489ba60200000017160014e95ff55ce840f814a2b65b223f629bdb5bcf6339fdffffff02153902010000000017a91475a604c818c0295f4e93caaf336ad2c146087de187a0ef2e00000000001976a914fd63a17f89421cfc8baf2b4586e48a91823e259788ac02473044022003dbc21f14821dfa199e77261498341e7739059c33ec2edfa44e5cc45d1b16eb02200ccdc2b1095b06c8ed43e52a7496ccc17e63ae56dfc1c0cc12756a8625bde713012103d54ad458321350b495bfb4b44e4328d3afb9003ac30d3cdb782fec630e00977348a00a0002000000000101cf535979ca23281a1caa0f9176c6c46b81da82cb2cab5b866f44d347b94fc4fe0000000000feffffff02302d1600000000001976a914e1a5284a6476eb53e95c5e64f8d88f3b20b7bfdf88ac87f1ad3400000000160014935c2aa5d02d50cab9ce34d79a0554539c3db52702473044022074fc885d4f7ef61ae4b4c9093adefc9abcd3f08b560f8d292a6ca29b9979077b02204add552136073c67355d022f670184338b51fae080916fcd65466038cc55c1e7012103ae4daf4466ff8d4925a0f5ab67063aac7546cb76c028309a718fde5514690de549a00a000100000001bb3e833b5238f640cc76d56433f371c9ba50b313c1177572b7a11ee4750916eb210000006b483045022100be3013ec74dbfcbb7e2021362697bb18c248ec7ebb24f5168df9957bca7b670102204a2bcb23a98c066088844abe3583986d66cd070fa765dfb61bf844df3e906bdd01210311160371ef3d4ca26e94de8803ebcb9bc607da6fd2170c62d7658aa559587fc7ffffffff0248f2100000000000160014acbc25e15440886bdb5df3d4680a3e5762c8ebe98cd61000000000001976a914c4c69d6fe0926ecb383226eee0ecc7fe3a479ac488ac0000000001000000000101c2993c2f38902640f82050db708a06a0c23b7380c058977666cd0dbe469d640922000000232200201b9c21f047e3a8390fa63137b01443bfc4f074a7e797fd0a5041c7396d583cfffdffffff02953a0400000000001976a914d4ccecde7b239d65ddaed87df85a2febdad838d388ac02c80c010000000017a91452568a1d251268e991282bedc2fa288fca31d6fb87040047304402205a1aa6d6a323e24e05467a4514da1cb3a2292f2de0c16270534167c736629a2d0220449645b864c896b0f4cd64e250e9c79afd311a194b0d68d5b16c8b1daaf389ad01473044022055d4a04ef581619ddcb888ea152c5177df233bd742036887c6a7707f0fb6bf640220624ee1ff465e355b5cf8a569f828839fa359902c7419409741d5f52249500ef3018b52210227b2bec611517b6ce04b5291033216ee59f11a8195055a1ca0470d99e1ada18e21026c89295f0d3566857b881b7952875b8aa45a49d0e1fb5b121e7cb25fd584d9b5210373f7dd6c0bdac38819761f7271238ed28e01d10be1e9c5769c1170c21faf6b002103fae6497f18de660ca03a866e019c8507a265533ac67928232c5245dacb6dbbfd54ae0000000001000000000101ed085d5be2f0d0ba6f73a203e56d24f21e6871cc0a73ab61938a9a263907062a0100000023220020db6c375d972868bb29a7df9911cc70379d63425b86505157569a8ba27450e902fdffffff025cf30000000000001976a91498fd6522bec6b306742d5e437eb674fee169247088ac15e479100000000017a914abdc9123754e1b5a987fb6699988f12d97387daf870400473044022063a0c052468713819300d47826d08158bfd8634b73bc538adc7f3753bc9786b1022079421131792195eacc05df6ba26f3326f3df5df8305a3d1677d971cd730ba464014730440220344a4f1baad9760b694fe53e0e02a65301cf600327dd0f823000b2b16b22084b02201e63112aa1d6f8a4b5f1df3822b3dfba4dc01459c35ad268dda061187c63e8bb018b5221022bae34a276089c278b6ae1d78a61fcf5a85d4ed64bcb2c5350d1f1fe3396bd8d21033bbd80b9734ec7c1033d13d124224889222a4f1980a549bf5fbcebe51f6d9bae21033e46870a01c731a07535aba9b5acbe1fd439eeb45b0fb9d3cdac6cc99e8a47a52103a2fb9265084f6d88c9f05395e281acf28ee6214660175f7bb2f64f9ad17b84a654ae00000000010000000001019419cf33fdd1cdfa57eb6364cff678b6335774d238f715db5be9f28b1b79b0eb0100000023220020051709938bea707c3ab89a059fb73a4a2e749ca8442e55581e7dc853723dee93fdffffff02bceed000000000001976a9143720948f6d562836aa84ee3f702f5e4658ace9f388acdaa18b160000000017a9140fb8cb1699518984eb91453cc1769a68ef5960b287040047304402204d5ae148ef62455221210abd24f7f08bc6985a963d6c673147ae2042b365297a02207dc1167cbb078e1925d000e3ee143746e07b3e742ebbe63283fed597afb93b5a01473044022056316d00c401971c799cbe125dce347e9400eeafd9ef9301a1982e4a66958536022001ee310b1a499ea547cadc438886aaeb42fd8c866d76fdfe130755ed8dd3e777018b522102804879313205a4cbb15fd2c022a962fb6ce5e488593db97a66a994e0cf8e595a2102e42757a53d56fa4e1fc3f1b4d01cc1231304c050cc708d6e2283822c8ea6970f21030fec54a63f10a86d3ffc0c602cac2bf1b6e5e031e0f84d238531523658f978cf21037fb942c10fb47843abdb9084b27cdfbace6c82485a04dd9bbc4b6ecc89bdab9054ae00000000010000000001017db6b05fe6e1dc4df18aa69690bf98d1939ffba7511f633633e2b3de04f59ec50500000000ffffffff0184b4530000000000160014a93c6ed47a2fa26f5272d9537c98d2b79c354ddc0400483045022100fbdcb78ff55d9772b73c4c3f3a41c017dd7356a1d45b0108b9d0ee55fc93ebd102203a50d10d4c4b764150263a437495b3fbe2bffe70965be078fbaef7753bfa45a60147304402202fa10b848a13f1ef44d0549316c92a5764ada7dd219de37ddec1d5f2b35cc1fd02205c40abe98a33bef70ce7bd4429a60c04086302eb8dae2639a850ff57002cf364016952210324c60644f649f281802de952ea4611694b0c0622549f2438a19b8d1df35ddda72103dd9d7f35a86dd2f44dfee73add289a2f266b968fb2787d14182e25400f28d32321038a3837260c3975fd31b0eba4f5b00434d237eae51a11dd8059d863ee42cbfaf053ae48a00a000100000000010124feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10000000000ffffffff01e78d760000000000160014a93c6ed47a2fa26f5272d9537c98d2b79c354ddc040047304402205d68fc50f5e1e8cb995cf1094c4e6b8ec88c7306843d5a238327dfbd3d511ab6022070827a5c2b28498fa364a82822aa400b2cc4b9c0b7bf021ebce547b92970a14a0147304402203afda82db5c4e9524429b22b27f292273afc7efb2110765c3bd49fdaca00ccc202200a03651fb09b2cde48e7fd22deb8631e49dcbf05edd0a192077821eb91abb4680169522102ba20cb9b37dbb25dbb1dca51d3b8d85a1144f536a6dc4bd895da43daaa4b46dd210389eed93b545733209c23d4aa5d971217b724c9252a1a698b76dfec6492c4c6622103cf2041d4dd9c101650fd3724a1dce43777b957f0092b89f5fcdd68519cf21b0253ae47a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70e00000000ffffffff0124261700000000001600142d3203e5371213676288d9527214843d8e738cb80400483045022100fe113e48702ebdb4175e96e14fcb9682222f6e949388db7030b4aa9af4857582022074c68de74a2d8c1d4b907ef713b79b6746abdf9d3cc9f96572c64cc5567ac8290147304402202887e5b916d4815d3fade4e2656244e4ba1616759f91c92e3b34f5bd762ac5c70220457c865b7398f46d995296207febc849abe757f0a22e48035a3615ef45730c4d01695221023d9986654e77733f7a0e2d67e8431c94b3b87b108447200247fa047fbcb56c3521025d243bc7e9c6c3d920e4b6fc257d71afbae71252002ab8d1fb10f7d71d135b9921034c89bbf829dfc6c703af72ef553c550a72d8075312ccdbadb0f8d3620990cd3953ae48a00a000100000000010147d4cda8477dfb81d340bdad91fc34f7591cfc0f851fb0d781a177963bb807170900000000ffffffff017335130000000000160014ca2ec3061e09f463d0a31b7b71fd52ce861e6d8b0400483045022100af93e7c5cca0fb44deef06f8901288217d6eabf7e7429fecf3f0977ed80d83e00220614221e3a0f63f7051a4ab1145fbb271d716a40327592b8ffaba4cde00b1c1240147304402206b8745de955f3476c1fc5dc416f2b8cbbbd0137a4ee3cb457337971656147e910220500706c448db3c98ca370f3d8fe771583e3e412552f3c2d3bfe7b6706b9a2a730169522103f218a377d25c08ae48f2d87102b7520c09541986d4e61ac579efa098f58df7fa21038e9755b238f4fb2f19aacd70a3e4ce9e744ef2efbfee2832258e6198d7aa59a321031a4228063b465468207044754f541b9041aa6e9e7c8592461d8f6a5d3bdf7a3f53ae47a00a00020000000001026ec51b802e43ea90abbc71c990f2462c90f04e48c379fce3497cb77ab5fb83733600000017160014165fa2a56354ad4f0d5eabe8b7485c641f49bcf1ffffffff20c758079894a8e59e932cc2d654d866d66d0492bc4db286575ca383d3bb564f1700000017160014165fa2a56354ad4f0d5eabe8b7485c641f49bcf1ffffffff0213d51000000000001976a9141b6e8a8715c9ff502fa93c9bd21fb8fc1ba57cd788ac5ae400000000000017a914805bf968ef35ff4e35f016743df19448fc0e8e6b87024730440220275e90296e209b1aa2a3a6092444276fcc9d480c996c6d6e96ebcbab32596f8102201ef1527b59fba4a707f910265d944e807974fced0d114d5232497c6d344502b501210282e76f1235dad3def2dae0d7ef4c719bffa4fc20fc75bc378d9d5fe789a02c0c02483045022100935e76f10a8693ae88896345d004ea51ee2b643b5a0ed2c5e3cd742034e91874022026768dfab3022e7c4a5570c813d1110a5145f3b97917b99bf489c8b1142d562b01210282e76f1235dad3def2dae0d7ef4c719bffa4fc20fc75bc378d9d5fe789a02c0c00000000020000000001028402815680e541bf3d9e2038edc8820ed07a04a336120a065f23634ca83806ad0000000017160014ee0ee72b634b6b61971d88deb3eb813cec5e82adffffffffb8ea6a7df5a7a15ef7bf674ab63e6cf1085d3fd431481c83a195c0b57f2ec1f60100000017160014494cde8551dbc4f6763e3924957b93a5048c99e2ffffffff02604d2f00000000001976a9144e7e60713e76f31b9c6acfeaf22971ba0a45628588ac5cc219000000000017a914778702496d3353829ebf722cc2fb5f4afc3cd9328702483045022100f6f98b8963649010cc4c347d4259188e887ffdc8106f442927e090475a00e877022004d3684c3e526e722f4fb1414eef13ed143de67d7bbcee3c19cdb4fc9c7fd294012103dda3da2e58d34e6ae854c5954b609185a87eda1853239370a28e919e14563ba002483045022100a4df952587cee634f1b479b249ff16be41d51a86ea890615850d7c223209de9202206a3915ed7e579b115629c55ed29157efaa286a85ceeeb446eb0d0747ca801f35012102870792cf284bb0889a85862cff980bc51feeab51a26922d2849bb2c6fa19e701000000000200000001184b7eb381c6d3ba0f7d7e126b30517125e28d86b1c627a6699f4de380873009130000006a47304402202957c16598191be10073225a634245c130fabedaf019714f76db5bbdbffc840d022028e69c3646cc473ed8f04db0fc4afd2d905a8ec8aee8b783e69bd65112ef388d012103050def628583331b5b2ecc50d57b52491142ef0dd4a98fc549afec8435ca5263fdffffff0241b30d0000000000160014d6314a1b6b5e9b9191eeb9a1921580b207b9308177e70d00000000001976a9141fd022f445f972b4ff6d1dfe3b428e385c8f7e8488acec9f0a0001000000019a7aaea45145e3da648918b6fecd974b114c2d98ea4f9a0e0521d0aa034fa755320000006b483045022100bcfefe076023bab6b548f4b562c1a948911cb01d23bf80e0633826a7158d953d02203104c57580e8bf954f99ba24a60cb688fb5ae33f5ecf261665498de9407d980f012102af4a83788bd4a812c0ccea70b567bceb5060d8c195261a1c643c7c7033b43171ffffffff02df9d0000000000001976a914b43a6522d95b16c1eb86d5a27b85a961fe50ad6688acc6305d00000000001976a914fdf459c55621b96a5a3635a9a921d0f4efaa61f888ac00000000010000000150820da321ac39434f939794c7a0bdbae5c06414ca1b89d8c9cf14c7e3d5913f010000006b483045022100da2a1faa9b087fc2eb9452c3ffbeb06e44bbdc0b663b329102e3c16e1e59745c0220350a3f5131275526ef2b73cc9ab6d66a71125ac41a6587365d852d2c41048057012102ed4f307f82bfbd099d4f1b007f21a34b2fb29186921a8de9baa406ba33e65d18ffffffff0245a40000000000001976a914cc40a30ce1277d159c0ff39c94f8f493fab551e888acad835c000000000017a9146538570ce109f884b2b6ed0165f9adc26d713702870000000001000000000101e9a28d13f468d59cd0fe7c7b78c2bb6a4759fcbe43d9edc3d17d6038003eff791a00000000ffffffff4d437b0000000000001976a914f8de718b4bdce7a309a82cce315a39d2b73fd3fc88accb990100000000001600141ca5c4db4439d031136d13806c097c77c6b2d82b8bb70b000000000016001435b29d5081d6d6a30d0e703f6f5719d2fbc53185b0ad01000000000017a91478739e4361961d65edb9eb0f1538b2af852e7bee87daa84900000000001600143eaf26740c7d753c1f7d1a0d5649db0a2ffd09ed593d0b00000000001976a914907f30c73f415546dab2ce52f31e9a1455fd43d288aca74a0d0000000000160014f5eca18840c3f935e1ba0837bdfbd66537ba7148619901000000000017a9148a50cfb17f5d2ef01036cc8b8ecdc7904f8e19ca873d3b540000000000160014e60c16b14255fe97b4e40cf4a4996f516d6d7742390302000000000017a9148c511ca4c71d0b37592de6d7907fa139f000147b874de302000000000017a914a9be699fb8ad58ff520a561dd8e42769824d02e687458a030000000000160014c7e46ba3d0ce4f7cea22f8fb85420f80d8efe102ade20100000000001976a9147572134d026c6c72267c63d3e5601b3eba913bad88ac0d880300000000001600147bbd4ebc7a5381a4f438cfe9cf9e534c14bd938ae13e1300000000001976a9148e525eef6b38c21757435864fe76048c035c692088ac48540f000000000016001435398022483f9e743b0d440088066e11b2c1d1dd8c2c01000000000017a914892a4b8fa0e61ff840601d1e95859f601f4699b7870db01401000000001976a91434123c395f220018164a2525f953ff393663f07088ac585b7207000000001976a914c8ea0cef357db3fd65d96b49ccd78c4edd191b1288ac1d7df5030000000017a914c4304ff5eee2a6b6c9072c03b21e6270d65eb12f8752e705000000000017a9142d65a96c3e53d930d7a65ae73f417ae3736eba0a87f23f03000000000017a9144f7148c68c0477df719020864b8b8ce6d2c4bc2687b3480000000000001976a91473b0b0561dca0f6495f2812490b4747587462f4e88ac618f0b00000000001976a91441a69ae2adc0bf07ef4c8f8bba5c80a817bd37ef88ac339b00000000000017a9148652ec04c647cf198a4b012376f9333991cbd93f87e1240700000000001976a914339b81ee057a092dec9420650ee75d3e8299694c88ac1e080200000000001976a914be6cfbb6e6e84ac7174ca8eef79f6058afa6e45688acba3723000000000017a9143b41444193135b2ece720a8ffa6e9e922d8418ba87a7ad01000000000017a91461105b6177e103ba72fe78daf509898a40bd985e878c68c6000000000017a914cf2c5b0b65b8631e543502019dda261c869483ff875ddd12000000000017a914cb91b6d5fc07e4bf46bac54fcaf821f8962abc1f87bbaf0200000000001976a9148ffbadf772e83626eda50154b66abd29627c83a388ac9182130000000000160014b8fc4df3ef687bf9a12c356ee2199262cde57ea1f8930b00000000001976a914756de9e94c38ac39344e58ce03baf9f352356a1a88acabc600000000000017a9141895ec28354aafa43923d4937f1c7389998ddc8d87b55a03000000000017a9146bb1216071075c430990bc7536ae12dc489129d4871f500100000000001976a9145b9200c60129a69d22283436e26f1d960073a15f88ac3dfe06000000000017a9147f79496044bcaf9667dcf6cb8f044db7fb62ea3687715205000000000016001430939c0ff33fff38b1a5fdee6952eef69a08413e27a30000000000001976a914ad5b2f3a9ea58d0cbacd1313021f2e31f940931588acd5c619000000000017a914dfbce80c053ef6d454cf5015f11b64e28f57315b879d2700000000000017a91499ca5b587374d74b9cbed442cdeef84135accc5e8765fe11000000000017a91413a01164f3d444bed8a2a4ea6c27a01f4a24fda687ab9f05000000000016001465253ca87747fc2078bf888f0424eb6c884c4fedc0da00000000000017a914c429586ebe0a21b01e4dcab01f9797b965d37df38750e404000000000017a914256c67f61a6449559a07281adf2de0c547dedd938759920300000000001976a9141f87200ed8bba94b69e925a0bc1ecc86bfa6d2e188ac69b50600000000001976a914818cdf8a67cc1c750254fd2e072714bdc12588d688ac9e3d03000000000017a914c0460f4706625563a10616ab3c1519d250d8373a87addc0300000000001976a914c2f0ce1ebfdd789f70f8d0075cdb416a164dc23a88aced800000000000001600142251a20e7f3826508b85e094353282d0c58133a033080100000000001976a914f2e6a9de4c9dc8ceda98871f1958fe08e8b9bc5588aced8b1700000000001600147071f552ce5452d1e558db02d5a08b583bf31569593c03000000000017a914267f141d2715d7acf3a76545539daffbc9a90aef87df6319000000000016001449a9a3a5d704341e747c9693da7e64f7caf1bfef27870400000000001600147093bdea624ed57f872cf99c1fc8e5d3bf11a4dac5990100000000001600142ee6ea008afb4801328e1fb6b9c15ffcb48bccf96b4b0000000000001600140b3da9286d5b63d981880ece62044ca34221fdaba0f802000000000017a9142302f376b45435bc017b8a23fb482a466f4be4e587bfcbcd010000000017a9144e9d60b77f8362d659c2ad73cd4e480a2782a33887add600000000000017a914ee0ca3095e6a42e865c84fb964971cb517541ed58741ac0300000000001976a914f603f7541b73f10e770cef8a624294d4c35bb76388ace91808000000000017a914e43c43d6e9bbe8db3ca4d8bdff4bccca7842802187cc1a2f00000000001976a91462656738b217132e72bf74e6180697b28bd624f388acca3200000000000017a914e5bd660b50562974868b1e395794fd4ef5fc01da87466b08000000000017a9147bb17ad42e333410c88a8adab1e8e7118d446d0187e25801000000000017a9148f40d9e906cb784183d0c85bc869d0b16a3c0f26875c090400000000001976a914d1126e83f223e26365782b471987efb7f38d0d3c88ac1e100a000000000017a9148d7d3da285c1417678b5563c3ef7cb330d53be5b874cf80000000000001976a9149bf92c153a573baf47d2bd7577843c0d493a617b88aca34000000000000017a914b873426a88b6c91dcbcb3c97456f769572f25d718742b700000000000017a9144972b538a61365413395c94dd86ef3d10bc98b3d870e8b2100000000001976a914a814ac62c517b5afc2bfeda19a0bd2244691bcb288ac497047000000000017a914e1f28a9359a6b98f4681d0f26898d4b9b93cfe4687305600000000000017a9140316c703201790a3049e4032d6c8aaa1cb9159f187779c0100000000001976a914f28d7c9ced4bce050c67a15000df06d038fc82eb88ac30a921000000000017a9146cf884b44e255696bfd4e752cb5a924bad0847d387024730440220642fb24fd9f5c1e5882f41641f0c05ef2549637e1de5cd642aec7124f525a86202204e7b2e8dd72c0351b2cedc18dcc7113aac7235da6326fe6efc722c947c979603012103eae51bdd54806d620e9824cec107187949ef2e12b3e657c470130dca3358d0280000000001000000029444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d4270000006a47304402202c463a560086ff3877839ba419d3867e2343299d0186130e8d4b7f078e7bb482022022a10a34cfec8df6c4e7ec2e178e41d69c839ae5d7c448b7e12c280692458c2f012102d6342807c5895b8205a4454744460f51dc8e7f043c9fde44166c12ed4ea7bae5ffffffff9713cdd2120d739ff89a61430efd3f6fdce6b20a25570dc65d8a0c2bed87dc5d110000006b483045022100a3969f7767c54cf7d1ace9d1ca63bcf140f59268fb1df97584656cc660d8a78a0220409f073e9ffac48c796b0cb03fe73bd2cea9e6195e72efc9a133c39a7fce4ac4012102d6342807c5895b8205a4454744460f51dc8e7f043c9fde44166c12ed4ea7bae5ffffffff014af14802000000001976a9144a4093f7864b2a6197a3a1f3a8d4f653340f09d388ac0000000001000000018059497cb60ae58a87cfa62e55be04bfd0e103789b71be8bf8d601d2af48fce6000000006a4730440220631ae36a5508a6cb14ef083fb3f7f0532eb170cc26e8e7ec757b30429f67280302202f18960ee3b76a1986c8a097aba6445a725605871fece5c1d925d1d6f07b8b6b0121036c8f771c148bde1ef1e3ff4fe04282f9c88fa2e28044d274fd418074d69dc2d7ffffffff02bbce5700000000001976a9146546f4e2fa21e64cc2260e47ce3641c9f191f5ae88acf717f1010000000017a9147710efa4b590ee652628650c2cbaa2b1ec18908087000000000100000000010172bec257d67f3fa057f6484e42cf2afe03ec7093201d5bc7c8e7b796e761dcfc0100000023220020d2f773f7222674085ab6b32e3af34055ff14fd034b80ed453d29a392d73425afffffffff02556602000000000016001485e50ed785aa35d8a4c57738b742703bff2d6e18361830000000000017a914e6a96497590d0776b28c5327a6917c791e49283987040047304402201b498f44a8118a44b12ebe97f5e2baa1d6c812f9c49d801465155fe9230cc84f02205914b3b02240b5ad5ef20ca5681a953bfb116c5dcefe743e2b38a1726396d0b5014730440220516ad138ec7a422cc15269f4bfc5ca1740e9a758cc8316b1fe3333fea0120b530220016d39ad33c5889a1a28863127743aa6771b41eac107b9f46ea1928d1ac91664016952210308fd9b400bd8d039616a5d375d175a750b958693682bc16dd871f3e2a3594e342103aa6bc41e0f95cb69a5256b9b7e85f94648e1c302a3f79704fb5ac5f4c1270ce62103034abce97c5ef9d6836ef82ecf10bff7330aa1cdce3e9d1c489adb8498a26f9853ae47a00a00010000000001010665b89e9399e3797978a2e0b3b5788a76b15ecac47d06e4779120cc36ac492f0100000023220020834307325351b96e0a26e09f3d174ce913c246818a0f15b1f6cfd259104df63fffffffff02beed00000000000016001485e50ed785aa35d8a4c57738b742703bff2d6e180a1e1d000000000017a914382663a9fe31d007fce4545673384a5bc0489502870400483045022100d83d59e2db84da1cf744c53b70ac87cdb174c9790d129acc1c4624885e0b4be102203319942418f1ae90b8154cfb284f8cc40ac791a734104a06ec880166cb3240e3014730440220711d1089e0a9494db7a05394ae1cadb74b651d5e5fe98d973a616d4e053d299602202fd43010f437c7f718e13b282b9dac7383750aa11835be6fc31b73322325c7b3016952210287a68ece8c65d6be35c20a6a4156322b6edac10dd994adf5bbf4cc813083a8c32102b4de774f5f3cec2b9e8fb1e9746f75eacca406adf5fabe27dd25b3349f7fb00f2103383d3c50f5a8ba4f8ffa11e5f80617b74ca0cd3be9486c948c30b09a6cee273c53ae47a00a0001000000000103a8a7c3912750a083da77c255b212902b6fc430c3b1dc65f4b1d0b5a2a1e863ef0000000000fcffffffc2a84eccb10445f995af2370bff5dec85f2ae4d8bb98e6fb9650e733d083a05f0000000000fdffffffce6bcc91698f1678e13d4847af256bb46e2747b56a517dc65f85d29340dd7acc0200000000feffffff0152cc0e000000000017a9147a82273b61a3a8c5ca2f23b10eff78241f2194b487024730440220440de4a01cd72ea2e0e45d9ac6f2f564bc62c4b14223aa4ccaab94f432b05d74022032a2171a31e6b249109c613739638efc8c25e1a87cb2f8500183d1c164c3af22012102995dd866fd23f9f825f415ccef99f476d0938a4faaaf4810d9598ca15e6d948802483045022100974710a12b0ef7308419727133fe0f0674ce5212d3d2fa3579baa9843271a583022036bba9af4a50bd1cbe2bd2a6943eace1d7315698a90120553e6eb82fd6f3aebf012102995dd866fd23f9f825f415ccef99f476d0938a4faaaf4810d9598ca15e6d948802483045022100bd5459d41430026e75babd79af8185604830ad7af1195cf12bf29ec9733a11e30220666e122427a03bc115272dde6ec248ed982324a1a33ac92f3e80ec885d300ec2012102995dd866fd23f9f825f415ccef99f476d0938a4faaaf4810d9598ca15e6d94880000000001000000000102b9c5fe51040ab8ed7e377c5924f8060b3c6c0ea4e093d7135b3e23d1d95ae5be0100000000ffffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a4280000006a47304402206f25fa97b89e5bce0d6ce617596c979d903cb09e562da210b0a83f0e51234d43022028a3e2793be27ac2cec137948463ed61f53bc9da305d6593cb2a6458839e31f10121034587bbb1b533037aba2202eb171105882cef091e0c3db3095e18d5629d691d22ffffffff02108100000000000017a91411609da7142103ba9c1f81bf5c0f023d84af462c875887200000000000160014ee0bce9d56aa6fb65c30d4e3b1c6d5576337d02402483045022100dc9f6f3922153f40d98757ff245a23d51c9455b9af40a309e5c30045335b77ac02207ade904ecd8d3aa36fc6ac718f0d6e88459e5192446ed9a30e8311785491f068012102a92869d3ce64d4932b9335ab8b93b5d1b7e14346105093c8bb287e21fd2d4ef2000000000001000000000101c6e083c95c732e5780e1091ea906bc7d30eb8d745cf9e3115de84c0d25afab730100000000ffffffff02a0651300000000001600144fd3f9ef16c7a7a67867ef85bc92c3e00e70d969081e0d000000000017a914e2088a14e8e49e721e52bacb895c0d50d699ff4a8702473044022024f6692eb9babb83f521b7b543c2f744fb2136eaed6958bc77f9279860b3a1840220275f13f1b619274ed289461057a21ead07bff51fc148f991b6dd4e46d2dcf7040121035121c1a183794b0cc979c7d1e8deed53df5815e9d90b40040dba2fec8063ef480000000001000000012191328e78fb286df01e333123b66f9aecdc680e167915fdc361e9059807892d000000006a47304402201196efe01f32c4394eaac7a782c15857de15505838736bd83a8e2aac296e2e5c0220797beb0345b5f15b0920a392520b1c53b4654fa70a7a234004fac397345e08b901210334a0ad16af86561877da97befbaa3ca6ff6b2ae7fbed2cbfc1b44740d0dc1e52ffffffff0118f9000000000000160014cff86e2cc6287af90a0eee58a3d58cf1b825a3e8000000000200000000010161027d3c69b9b8687831d9d0631f610cf22a5bc99a4f72412b9f2a740286a3970100000017160014e013b6fdb113baa97a165ddda472b6f5bf1f70cfffffffff01f82a00000000000017a914943021cdad50ad491da442e3ead07adec62baeeb8702473044022010bb382a57a874a38248a1d9906e10589f89c35159bafd3cbf72c458c04202a102200ee1b13c6847d0bae05fe23b42b0641aedadff4f350666c63f647d6f621f05e9012102393e6e1d60c98f8e27236c1439b13d59d1b596164b93b930a8acc4f95ccfc30c00000000020000000135011c1fcd7c6d41c335b73625fde62abe817ab904c88eaddcc192035e8f8493010000006a473044022047221368b98a4cece2460b04788708222a25fea04c58907c428a412a4fa5e3d302205b6a4c674f0a22b32b6e82041d43313f2679fa39917217d09e0852cb6a83995a0121021ef2b7bf9db83f69dd1c61695fb4ad206fb60ac324c8c403123eaa74e6798387ffffffff02b8271b000000000017a9149c9e011f95ff11b030eee620bcf2851a10cbe682875c9e6304000000001976a91478a551abf692da3a932ce17e1301e124b90e0ff888ac0000000001000000000101ebfa6175cd50ab80987ede51d621400e6966d410645400acae4ab471c2ec6e973d000000232200206a9d4f73640f86ce54d32382a0623db8f587c1f23c66982aa09d65b1a2be6e14fdffffff02d33c0400000000001976a914564de4da4a9aeabc0ff4e6b3a94ae20efad5d3ee88ac2d1c03000000000017a91480a39286ad055e05fcac9ab7030d45164429349c870400483045022100c2ccc4523177ad4e795c2c59d120601f1bd383bc0d1a140cd933a119c63a3b6202204ae75f9c2ebd7071ad7f91eb54a39f447149ef1884b59c55687cc3da00042fec01483045022100e2a7f1c13ade943ff9d50c734b95395432d5262b234d466d9eef8d06a895bbb9022007f1e728e7024a107a725a9ae5c8369a32d382ce6d6276d887350a61d38735d8018b5221023dab7f4d9afade6f7bd66e99de4f7d79d3200a22624dd6e68203b95091c290cd2102572bf463a803ef91e8dc1789fc5bc721e7fe68a7bf23c97fcd3d7779aae0852121032b16e429717432df04c36004d804f62edd90d3d894ab4b75c8e5905c9d3cbb512103564c672b9816fcb2fe1ae40dbefad485e2095c7b41f8b571f0c46d2725a4cd3f54ae0000000001000000000101b16ded823047c54c4f72147b8b7b5855cabb43e37dfb6c421e2f2957c6202024010000002322002095f9c4c52b0b68126fd05f475cccb79801bcbc4821f3f114029e7caed1025479fdffffff02c0270900000000001976a9144c870f9c28ee7a8a9a2dbb88a766d69326ee19c088ac9d9e25240000000017a9147b5d3c4f7febf710b131bde6a5300273067ff04e870400473044022076e3b0ee557d67805e35470615f8e3af0bae30cafc28fa46b98435d38584c126022068a47c67f7fbfd74f8905bbd8a165dd0b10efafe94715edb7dbe0e08be937cf501483045022100e4b6b6dba4dd95bc74ebfc28240f9782c99999464f6555c36a97515ed4d72fd40220719b83ba1556681250702cd45851181832b0a14483888a9724000cf15e6467e0018b522102de655000a22e698f70ab09b4afb53da062e9422b87e7f718a6b5c77658ca35f1210314a2e03687d2f77cee32dbd646e0eb36c929f304e7969909662de5488f8b5b2421035696dd29f456d4fed304e31505202a058a4e47b9edc124b2a38348a5217fe4c02103c026021d4f405accf24f5af68bc7b51e4dd1e339cab704f7c556e2f5370bebc354ae0000000001000000000101805081a70fb4435b6a71e0fd0bb5149b6f24a5603fcae0b08c3d960f61dd355f0100000023220020c323ffe77c25f49e90dbf72362096d81215b659e4ad6a3fd103728f67a9de3bdfdffffff02d65f9300000000001976a9141004bea477f28eb1a393986e7c51d1a91b1b9b0e88ac6d836e070000000017a914c228bab36435b69820ca8e5cacd958d219a02fa487040047304402200d4b687ab121ca621aae40bc79e1ab760dcdf02e9dfa0f17dd9bc3cd369a7cad02201f85c72b782b5cb069068d0351667acd87f9e17567b0ee51f7f02b7113b68ddd01483045022100d9a30d0e1a210739b29ab2062d8b3558878500676b450c5ec3dec96f47dac04f02202d15c4e4331a388d7123f8e799de5fff801bcdbc462ae0fbc29586f298bdda49018b522102202882db8fc05ea096a41d5fe772333bac8a63200723e055eef62ffeb74e7fce210234cbd9b0d2b4399ae4b5290b05e10f57c7b283060d6cf6af0dec341647a7100b2102915ba416d30d0aaf829c38b675c7a5174ad05098e62e30dbd9fae2cbea7d69e321035f59ff9eccb93caa30c774a4e0d5229b47bb7d03d68309b00027b1b865f5725954ae000000000100000001dea80f4b3ac927e0a8cd089ad43f6954304a1756f2e66a61c89c608d49b89bc1040000006a47304402204cae3532f5de07ce76de8fdd00c02b3c201e3d9f5f83d3b6411be2c6b865adbd022073c4f1f563f6d8663f31302648f0cde9ce4f4200a6fad22e3fd1bc7acca0db04012103139de71caa01c8df5ebad2685f969b1764226cb939fc47dc381f3a759f307b19ffffffff02876b010000000000160014d92f697cfe4bacd35664c4fae653baedc57ba26b000e0200000000001976a9144358e1bdabe92b95fc558fef23be68cc9bc43ea288ac000000000100000000010306ea465daee14e65b1d853c07f189597dabb4c3954ffcbde2aaf577c39f0412b000000006b483045022100dcdd5d1623d7fad848e2a7fe929e2ca4c1022f841d8cb9fdb80bf9fa76a7879f022024e93ca35f5d5edec2734c9b61a42b71e268a61daee1081c8635c5a1769356ac01210311b632764ac2014e090bb4cfc41cd77bc6389a54c0db3785e3cb68e2c2ce3e84ffffffff9ff5f1df09f8c6ba49d73478b71b84dc2eae043829ad3bf4b11e3cdb77171045000000006a47304402200d446257ba53f35c9e4a06ef45892602c901b17f44d355a8d0404d037474c161022013792ee1d6a755c97b610a43c8e7dbbd138ba8ed6580a08dea1aad58c12706a201210311b632764ac2014e090bb4cfc41cd77bc6389a54c0db3785e3cb68e2c2ce3e84ffffffff5ac976af33cce46f99113a28f447043de42745245c8cf8f1d980ee5307ed11790100000000ffffffff027e1e9901000000001976a914d05891a138c93fdeb3d78fecc241681e6451a3fe88ac615d228b00000000160014a797b869a758dc2ca637a78b4736c668cc500bf80000024730440220247ff9aca35ac660b118e1168c983c52ea37dbe6333f62f0c4e6712d10c95f3b022014e9f7b53bcf99de6194102d7c83518ab910fe401589d7b9f8cadcbc2fd0c21b01210311b632764ac2014e090bb4cfc41cd77bc6389a54c0db3785e3cb68e2c2ce3e84000000000100000000010197c4554f57f61b09915b23c75eb6e3d9dfd4838de7111299abeedcc7573fbb940100000023220020115c4da1a0e6e7414964e3e6813b25fcfa9bff98e9652c33f6d11512e4676d7cffffffff02400d0300000000001976a91470e4134838bbf2052f9b089797a2fbaa851b8f7188ac7da619000000000017a9140fb0c20eacff2965b1f2594c250c165dd4450ec487040047304402201d3c45b5ca87c6a7cdf12b05d0b9b572a94ad7d21edb3bd924cb8fb72ec9449d02205ada19953317034b791120e985abe08c50230e7d6759c667d16f7779c2649ffe0147304402203146baf726d5217336147da6899d0e52d6b634aa8fde095ca37e7bf22637bffe0220259ec5b207afe9d56717ff7e1e0c63f0586b81afd98d091b4a947fa3b9766a430169522103110b6a279de37085c775c3899fa8bf3c7a734d346b86be7a6dce55a41623b4ec2103ab719ec244b513ee8a77598ef7a5177e7091390a52078874ed74b5e79d2203b12103b4e0d0ba8bb4a77b53175b02a8c311b57a7dca6afd5f20596d96c46f11ed827d53ae0000000002000000000101a4710c60703fd708b84ddadba09f7edc9da9376971b566f0bf553324dcd7d1050100000000feffffff02d4f9f6000000000016001496ce9461137c42279022273c74a95708bc0a5b5a2f0361030000000017a91485bb2e19a0001c09a865d41d8c285fe121c76e098702473044022065c902de3ae0670e04987ebcc16a6ca2cb22517e52fa9eece28dcacc1a82f80d02206181d0092615dc74604140bc2bf798f20cef32360682a138b330fcc1fe946ac10121036d7b7eb90dff0a04f824ebe797ee200136a45af4ed03bc0bfde900a5ca1e685349a00a0001000000000102cda994f81e9ececf80337bb571a0e8915b19e9f5239993806bf4620c88fb7e040100000000ffffffff9dfa2855f969d2f880f07edd915f35512955859edf62e44645e2fb125ee82c1e0100000000ffffffff02988c1900000000001600148c6dc479a7b78d28e0350b4be4da90dc528f7320139c2100000000001976a914dd129ca5bf608ce52975bec42f97c41aa08d126b88ac02483045022100939476deff51e2fe7aa7e3d9d431c561bb67fc556c5c33f51c071d42e9a7efc6022024706e87a3540694588ac6738b67cd2a5eccc2206649118f09e6bf82a3ae00be012103b1dab4ee9060eace04f67c9f837c17ba40c39ccaeb11e436e0e5064ff7d3122d02483045022100ae0ea3b11fbe34197c8d91f59b0d86237270cf9ce89788807c01948ce0ec80c40220573874bec61c8bd40439933447968315e58114dd5785ace050477664e4c0533501210268ec734c32682036d1cd35f74669da84a3881284534c83ff18ccf57d2db5fc960000000002000000000101e206afe8739d2d6830c59611227070b1ccaa0b8f5011c9542b7303394fc3a6940100000000fdffffff02888800000000000017a914ca2c26d4a05b38f38521450a75f5e5e2e76069ca873e29010000000000160014411930375572868f110ec6ed0ba93c85a651e1ea02473044022004f5ed9bc5ee89e450a3dc6b1ec373e460194f1e18f435a0a465b368540c84c502200dc4cdd04c693030ecebaf9bdc0bb782ec82bdc7d372411402ba3e0aba6d83a5012103b07d4813ff1ecd6e33c53ee575302bed2b39649ac30a9ac0d3e7f697db6eb15e49a00a0002000000000101bd7325001b52902da31bb6140eb15383e8b7d2807961fdf6b5550551b7dba4ee0100000000fdffffff02ea6400000000000017a91415cb5e2336a03cb548351e3f898f3d3f4f4f4c4e87b9c0000000000000160014e5ab16a2edd4ef52ce2a7d19b9fc20804148e00f0247304402200338d4d8341022b86540214a9b3799b7ed7e0a0051559b6c4265858d1345c5c00220356e74c17f5aa6fd21d69b6a471d63c60ba525116d90f66847210b94a924036c012103e5981b8fe2cda9fd0bf8cbda989368560eb5f4a90284355a8705cd96298b867349a00a000100000000010195194bf660bebc5fba571c0502aa4e23312f0d65adda987c44e61dd0684215390100000023220020115c4da1a0e6e7414964e3e6813b25fcfa9bff98e9652c33f6d11512e4676d7cffffffff02a0860100000000001976a91470e4134838bbf2052f9b089797a2fbaa851b8f7188ac3d4bbd000000000017a9140fb0c20eacff2965b1f2594c250c165dd4450ec4870400483045022100c18a958d18ad97b91a54a7241bdb327c83b6a3246f16f30a3491c189286c3cf90220589de133e31abddf396eab402ef66dc91e9fbee22cb2d337fa45e295a8a4e85d0147304402201a74b6dcfe02c51750ae5a2be93e2fee7cb38a7098fffa6426b09f7d693eca9e02203930bb60703f6ecc1a4b495d0de32ee15459ff422fa395d794baebcafae223e50169522103110b6a279de37085c775c3899fa8bf3c7a734d346b86be7a6dce55a41623b4ec2103ab719ec244b513ee8a77598ef7a5177e7091390a52078874ed74b5e79d2203b12103b4e0d0ba8bb4a77b53175b02a8c311b57a7dca6afd5f20596d96c46f11ed827d53ae0000000002000000000101ac6fbd96de91ccccf8a175c20cdb6d1cb40e23d3a498bff63725052375ac29790100000000fdffffff04beb10600000000001976a9140d92e38813e7a6a8629c87d1bf63583a6c620ace88ac6f3507000000000017a914b8b1a7519ebcaf64ab43402551d5682a9fe3049a87187d10000000000017a9142726d69f62479091bfe757c27892073ca26295ad87ad0c940100000000220020cc2d14c551e9d6fc49ee0d489fb79ba78501b3c4e755cd6fc6ace8525edafe94040047304402201fdc7812317d855f59a83358186bdc6add74099dfdc5cdca4647e60ebeab317802200ae0132ce347192326f459749c37e85c1862ef8637ac898fb3dd9a47926e26940147304402206a5875f8cf5f0cdfb600bdd92a0f9a4241191e036d3e61d4a76aa27bd5956d6b02204fe5c5c1d938eb161b3cd5542dba2db5e31d87fd59279f8726deb9c3d571423a01ad5221026663e680542081ee29a0f24818914befdaf6352236395df41ea0a10f4242799d2102e426131ca66ad45aec1274d5ef9842738861ffed1559df313942887ba694793d2102fd89a151627e19431b90e7e0cb82e3f9a03a5795a2167f0beb86430ecc8187be21034625110b7266183912b90c3c2ba27ae5b4a80e07a2cdadb3df9ca6469e066aaf21035c2f3a4b5fd45020714310a8f3454c3781eccfa3a967b6539b247020254ac1d555ae49a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70600000000ffffffff015e9f82010000000017a914d5ccdad95505b0b8cfd9deec7a9752302e7106108704004830450221008c710cfc3f1d1111fe9edb563d6931669a3733ab6204ea49198af3632823af4f02203627e5d267f73538a235525f8fb9817b4e31fb153890424d68443a91d96e615901473044022026e3880d0f8bb7135f7bcd325e19d2729d6b968a03b558f6cefd2365820c76bc02207b6ee06a2a073faa941c97aad52f37a9a6a078b9ee8860d9730f4f0c2b5f36ea0169522102b6a7effa28e0dde3b3390a14815c148ef069669bb799ebbf56a8946a83c234af210221fcf9be9338f3623260cd145b01bbcd0f29353d20da8932f1205bda236b890f21038151e7ea6b71ac5b09882ba681406d8fb51990859ed6735bf6ff17b906b1609953ae48a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70200000000ffffffff01913a43020000000017a914b81d35dd0e248e800088eb41a7497d26e5e2637c870400483045022100c910deb5422a82de20f1fb48676cdb51d19b0d58519763dc2fe20f2c3dc8724b0220263578755ff4ade39c77b22677ed40f5ad3ee5d2ded8826b44b7add52f067f4201473044022018e43826f1266be378304163709f9fa5441f0ba78629cdfb3b116d5eb7f3a25302207d7ffdbe65d7ad516f89843dd380896cbfc81790444aaa2507f795fffe22724301695221022d7fac9ad0a0e949236b1e78e795c73ff5c12be002a7b22e2061c3b631035c21210207065a9e2e091f19c9c1f235a857cf4075f4edacbd87c95a0d703cfc33be1fca2103a6853660d465f7b12ebb627f68fdb74de8e921b8ac6fe258f3bbf2962fb5375953ae48a00a000100000000010124feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10400000000ffffffff0166ebe7000000000017a914b81d35dd0e248e800088eb41a7497d26e5e2637c87040047304402203dd9f7e0d8fa02f3898d7ab88118209c0c1a10e0ebd3227c3bf34653d57dc41502203446326dc15abd83eb9212f7067344efe8750540a36623510931b65dbf9290dd0147304402200f21c68e284dc058f075dd3b43225907b8e5abac9bc01e4a1588e4bea7712b5502207671e2e5ccab1acb765e9ac2b14cb503ba5a6450a6a022e061bd792ea05061b1016952210393d6886709576c50a9af171fbaef2b04869c0509c7cd4905188af00d381f79272102a12bf428c7a7994884598ccd71923ca6a99683633c7cbd7a3d2d897d51c219e42102c6b5cb044a31fcc0ffbbc131b010045b2ad05a3ebdd8f9b6fecb993833b8537453ae47a00a0001000000000101d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70c00000000ffffffff015e4cc1000000000017a91478fae23c356b92f21335dd7f133ab0e7f22a8d5587040047304402207f258eba52d242fc7025e9fa6590b0d54c837c82d8c543ad7ff1f03599d40792022047401290237f085908d755e133d91bea1805e978986c1195d6a77bab8f38b41d0147304402201920274ac6027e242fed99825330dd1f3d41954094a88b294a293ace724a367102200f16a64e5c093fd156dfa1a0a8fda418d35cebfee4ee529596c83cf36f5e57240169522102571e6a8155e0e110cab083a574518763fe1111a13666e266554466ca380bcd65210242f9679f868410249cc32c1b13b42c5848e72327f55e1b2642f43fc7939c44292102357a24d531a17e18568583513730036fa08ea203ae185c7139150ee5b4a92e7853ae48a00a0001000000000102a028a64b0cb77920188f718c2cabe7e1bb2f76bc9622c60713e718c5b3232119000000006b483045022100f8d0f91af376879736849d21a3b7ab69377212480d436542765fe366cb301c6e0220553dd1fc0f63f978abee9a4d38bb88f60ad64ff005125d4a46ff4315869735a4012103508572b63b0fdaa2895159be68d30d9295a6a2d514e9d449ba84507d082f406affffffffb3f64aaedc39037db7ba23a22294f4642b88619cffeca22ed70a6d2788d1b5f60100000000ffffffff0200743ba40b00000017a91431c4d79f52873cffca23cb16adcd50b8224494da877d5ca81209000000160014014ed9fd1f0ae0f62752af58ea63285bc05715810002483045022100d559da015eed7965b3080fe6cfa2bae7a3278ee11e39bac0825d17cc45a0ee200220477d8518120ec026369650e22902123e1d491d8dcb77151d40ae172c3682a8b101210282b4af8a8b9c1b5218b6167a8ceb9bf94fd4811d718b4a932e808e6850f46493000000000100000000010161b2512bf39d776e30b3f51312a7e5ffae23d24ed8d89edffee87e454e1a8a681600000000ffffffff407b81000000000000160014f78eed6e5b94ea746d48845f0c788459a02056e1f06c02000000000016001460da72fcedcb2844b111e8d0336b09e877d46b9258af01000000000017a91431948f8d8f1d558c20706fda577cb7a5c9048ef487e56d04000000000017a9140938254b6df3c7323457982e58c99aedf690c76587f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7685c606000000000017a91495373f4441336f0e280c9fd55188b3654af0552f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7646070100000000001976a914a3de3831d9cde66d171d05160e22b7851e2e975388ac0fc50100000000001976a91401fbbd494977c9fe6e236c680ae6b1c175c06a9488aca34107000000000017a914251282267a067560261846306e73eb65f5b22eed8718c900000000000017a9145f4d7325c8397feb03a95224d93330b4a8433eaf87eb0502000000000017a914c6b1b9a9456937480ee81e9179aabba36ed65f75874ab001000000000017a914ad899dcf3bfef3952f719a07e30afc2f007d257587f12d0100000000001976a914d20e7d647f12b557571dda96fdbb0f74fdcb437088acf1350200000000001600143d05e399186c993a979b65df3f94990ca2a44118b9ef00000000000017a914ad23f0fdf4fd70e23e363307cf86a5180ee97846873c620200000000001976a914932b076a66e4dbafd370368d7911518685fa1eda88ac6ab9010000000000160014702d72c42a1f816de9d38f99b9122580e234a9972cea0700000000001976a9146427acfcff816ea1e705107b1fab653f085d552888acdd1b18000000000017a914363c34e7a80aab9278ec65bb659a27fdb5cfd9b0876b330f000000000017a914a5e41e336564a5732e87709771794c4e790717518700e1f505000000001600143b8e46159b1505c6c974d6e17ecb3a3a347018653bc804000000000016001487b32ad281ce4737e35614f49271dc4a98c19d880a3403000000000017a914cb11abbf10c3bd7674f2eeb9139f8b7b474bc7aa87bb510500000000001976a9143535e7d0deb181aefa9e24959b04c46d57e82afa88ac36150300000000001976a9140d255e2939962ad1f744f32d036767d3a5c122f188acc7cc0500000000001976a91480566de31a02888fb012a2bb80af9d11ea1314fc88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76586808000000000017a91452cbb7c2020cd03b0d6f3aed5fb00bc6822fd0e2878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76004a02000000000017a9143e736212b0a5bc438bcb78be17afd0f2ae34cddc874f320000000000001976a914be93f892ca3520ac2e51fefb959783f93a5d0a9088ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76633c0000000000001976a9141968ba5de37af00a5f498f9b64d956252d1dc88a88aca6c601000000000017a91431da02f6245e22b45d1f080be0a6290178cf939987ffef09000000000016001431d48a865487bf9514f8549768e9f8f799dc38a15055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76265600000000000017a9147e2f8bd4e0d12278711a1c06fa1166a3c26d2d93872f170b00000000001976a91427022da07b3850c552951db6287b3017656dea6488acd85301000000000017a914069dee280be61f42a650887eb2e84e9d8e3114fa8743130200000000001976a9148dc5c6cd0f504913f44eb4e38b514e111fdf860388acb87c0200000000001600141667c22ed99f58c4c4a363b25311159cfa9575c28f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768b900000000000001976a91407d63b7590f190700c93d7b28f92410353c79d1388ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76292b0000000000001976a9142ac6924141fecc9b92040bd24e6bef4a8667df7888ac4b981e00000000001600144ba849344df69ee3916cffb7229621ea38ad44ce0f250100000000001976a9141d6976d0c3ff79f161d72ecb7af9d05d22b7346c88ac661a05000000000016001477cbcdc7ac865dd21249342fcffb50beda72b30de16d0400000000001976a9145dfbeaf9c61c53382b608879b66f6e7dd3086f1988acfc0025000000000017a91491dcbdb5976ebd2b0453c992ada033d994275e5c873c9b14000000000017a91480ed19b90491c343f54ea34e1811a4c9ae875edd87ce0402000000000017a9142f62687a4d7cbfdfae20d3bc0307af25e34342d08790d00300000000001976a9142a7f96504d563af0e719d6bd59b834e4a009840188ac401f0b00000000001600142e9bb05ada9f137abaf77b3942b83d83352b672938c70000000000001976a91451d935b5658a1ab33119f1ee45b6043687650ed488ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76525600000000000017a9145eec6f7365f4f933059c17c9ab892375456e3b83872ed90e1f00000000160014988d973f77eef4d890d10913f7dd4356dc74acdff654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76838601000000000017a91446fdf4c7b5b8f1d24a96931ee688aa255f1a048087b0b300000000000017a9149656a497ada4d3ae313f35555584e80f3a5d85d7878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7602483045022100cde09af7a728d8f7bdddc5db182c40159a52f7dc4612084414d0c5e54a2678ff022067550c610cc2128c9bd9fc0d1b69ee417c1a844e10fd2677d2f68c34cc824d4801210313613f900fe4b9a99c8c9e7bc3090cba15aa26a93fdb5c013ad76374a59d34c9000000000200000000010158163773e743d1cc139aa942de3ddc414bd3ea75695e1b9655f92d710f52f8202300000000ffffffff011be909000000000017a9140336f5e6242053ce4b509e5841a22efd88aa4c3b8702483045022100b53d941513f0f3dfa762e3a67c0ea2e2de97692a6fc91089dccef99c788f6c9f02201f1b69912bada43e3f6412bb2137683bc904745d1f00fcb2a8ec1b56b02a1b7d01210271abbdd231ccb7acdfd4dc8baa916d8aba2c0d2eb9335f1d9ee668e11be3264b000000000100000000010dab2a2a5dc39dd341b9e7b5c8aad82bcfde7b7fd7ed957b86d5df98ad438b69190000000023220020fd7bb3b13087d4b9fabcb064ff0697bfb1c56e3e9b962ad5129b2da59d7563a9ffffffff5c1ca1e60ab624d80383b98ac1e93570743d7318efe2a5f972d026067297b7210100000023220020efbf05b9d8c9d62ad97f112224c73f3d162e0b010b958ff47ab1516ae8f9e092ffffffff05cee9cfc319e89325b1b0125c5fcd48e8ff23c75eecdb6660fa551fe1d762720000000023220020621c294541fa8075f6249607350d8f0fd5098626c7bd035a8a6cc29ce04f033fffffffffb6dad996a2a73e308437082555e68fd55a478642905dec4d2b63dac67de54e7b0000000023220020ac0e24c09ac57b0ed81f219782b1fa9b9e91cd4f2c55e5822ede0b274e7bc1e9ffffffffa6875345d5b3ec78de6d3d0a248e1eb8dce9d40773cf818600699db32ccb827b0200000023220020205a73fe8035e0ecd7c5483ce4001553753f1c8d5bfad1554b0ee7add6ec7db7fffffffff146e3237d643e960d4f8f18c9f23ccf2c0515abb15346aa51d6e5d6858ec89f1f00000023220020a28b423e3e06a76057bdf5ee9183fc774a9f6194bd3bd4ddaafe010dcf59ad2cffffffffefb9cb8ef61d85f74b460494204ff7783c7d6f6c4484f4c0f69b8866b8bcb5b63200000023220020453c2ef4bdea9bcaa4335555bc9c574bab4969bfcf38a25661a03eab839df47fffffffffdd6050291da2265bda67fc80a50d1b4f80eeb141855ed0bc0ef02c6b0a1600d2010000002322002051bc566f6d7dfde669f1ff3fd239d9d083bf8273efac28870235798482835dddffffffff9c389deeb1d9ca1644675250e2826973e6921bff853081eb793fc07009cfb1d50000000023220020830bde4d71989fea2b64c5583856ccbe88c745dad1d80df3d3c9aab28c44d800ffffffff0a9dddc9b2458f6539e4ba9198c4a82d8e27bbfcad79f195eac51b8a3607e5de0b00000023220020eb9600a9d6119ae7238026333330b45e01714ac2080c7b0b06f4d511e68972ebffffffffa2f8bf77b3ec6c564de7b61ed8878b99dd60156d7521495ded3a23009c517ee11d00000023220020b684dc72421a21f58dbf128b30fec46da82883f43abe413795447d04683198e3ffffffff6fb6d7552282b644da4cc1799bfbe860d5cdd740117cb019d362d64b17105aee00000000232200204c68c3bafe902c45851e6090884d6401aad8a577eacb6aca958694d5b36b9087ffffffffbb46fe63b7f84ab9b03b91f92d76513064c553f4c413c1435c8af62f9526aaf40000000023220020ff426d0452013292ce3c22b93798af643d3afd4534308b5eee2dacfc79d71b7fffffffff31541500000000000017a914b421768f5ec385ff153332d1997362cfa323cac087d81900000000000017a914ba76ecd72864db8d8a72cf51e274303ef9c9e3e887e81e0000000000001976a914a49ed29b981917de26f5cff3d194348129030ad888acc3210000000000001976a91475d1057358c21d38ecc9ca84486f4f996745318388ac212b00000000000017a91487ccb189e63061243d2546aab17b69ea13bee6fb87df47000000000000160014a88e50f5cb0183a8ea3f76569bb0e52674f8b5a2b25100000000000017a914df296f16073f0a1b80c63f2fd9551b9303a128b187165600000000000017a91497b59f407befdf2fcc9d9b2cf6e280ea74aa3222875184000000000000160014eb49832591091c05a4f6f05977037311551774f6a98b00000000000016001426b5be4b0ceb86e408b2618c2f317b21a4327738fe9b00000000000017a9146f94cc24ce1927852b8b8ecd175138f07a786fe787409c00000000000017a914f9f9a9632fe2701774cb92b3eb0a7467d508fe8487bdac00000000000017a914709502f35d8c10b1ec772db8dd71c52886169589877d0a01000000000017a914bfcd75ef81bd2bc9518923768cd79d6daf7ba40a87472301000000000017a914dfb4698f24d39b6a5577e6ea7436d97b7c6b9c158754a90100000000001976a914d70b9a7c77fa998fa2f4f156b03d01453cac5edf88ac9aff01000000000017a914cd21065c8626548386f6a4c1d88a0f57aef0969f8710020200000000001976a914f44d676817120082350e6df646803cec19eea1ab88ac8b5a0200000000001976a914a241f6466a2b005b9ef5e5cb4a59cd0520b7544088ac186502000000000017a914c65de974746115196fc87ae3219c110295bddad087d4be02000000000017a9142d5070d31a56b07edfc59e00749116ad08a97c5b87630c03000000000017a91421571ea0e73cd5672382873794bcd5ae5bbf3abe87fd5c03000000000017a91439aa13b8504fd72fe268b50c27fca75bcaa3c55887d7f10400000000001976a9149b0f8d3dc787980e73d278f32f7d78190a6fecc488ac0c490500000000001976a914f4203f71f3703564d981ef2771a54119b152a35688ac074d05000000000017a914998485d8e97d28bee276c88ab0ce949fc890004b87c58e05000000000017a9149ff87c43ff130a9f15e7622577b4e6b4000df5dd874b3e070000000000220020df3ae00e53b5b5fcf94b7931fecbbde2a3bb698a2d8bd9bda883171c9341fb948c700900000000001600141b56de4e92f890917f3b57f8306242d9bc79bbdfe88c0900000000001976a9149a590f72cb7ef5990b18be652105362395faf06988acd79f0900000000001976a914f03041ff7dceefb287df177e6d7314d5c2fa93a988acb0ac0a00000000001976a914e294793ed359e174c0512f1f01d69d69befb0a9d88ac9f380b00000000001976a914b38c3a479ee8f1e8322a48db35d59c0d479fba3f88ac95920b00000000001976a91430472862774ddd5409a9db12d1665cddebabe0f688acc0980b00000000001976a91404bab1964805a9b863ad47e16c98f043b4ad086688ac2c560f00000000001976a914c65f34404da5b594b8354dc81151012f5184734c88ac631b1000000000001976a91468c08346af1cc923d10dc59575e71ce52d072d4388ac3cea1000000000001976a9144cc42d03967211cf40fae807a2e8d65b81878c6e88ac5a191d000000000017a91436f43003e198836790bd38dcfc9de801f578ebca87beba21000000000017a914b4eeff991416ba52cd2b2429f7deecc15042a1d387cf452300000000001976a91461719609d6dacdb42c25c90c48afaea442afbbb588acc86536000000000017a91481219484abbc4a2916dd83f66bfb29ea53d8d50a87638d5700000000001976a9146feb8c41dced02fae2bcb6732311d72276a7ed4888aceead7e00000000001976a914eeade5be34901d606717adceafa240d123f11a9c88accc46a800000000001976a9144c6447816d1588f324b0dcea6a1e02dd562edba588ac4d34cb0000000000160014b28498a4489ca4e0f99efaa04f9a18051e4482e2459d3f01000000001976a914a135f1572791430884f74359b1413546a88ef0d288ac3eade501000000001976a914dc99208954b7945d2c74db3b569d245ec3e691d288acf4c05b180000000017a914192ada04d33fba323fce796ee801604c5d251b2a87040047304402200773f49330c42a1f39b08d3690c0ace7ebbed1f779220b2b6062b9256a5c9f7602204813f998f30d0e4e11549c924ea756fdd0afa9bcb95c3a2e2e8e283e4a8dbd0001473044022019cafb26f4c44e969cc6b35386cdade05fc6df6580063bd6c6525ffc91716cb50220538c5f86388a1f485bedee667822832f4c0c4459695646ee7d8f07d75bdfeb7e0169522103c7c4b95cf42bd8ac5f260fcce585f6ab1f3a3cef5936f47abece11ecbb345a902102fc0c33566c9cd5093ded3e5cf29e22e57ca0740ca30ec1a52a9e0cbc56a0dd5c2103efb5524f7f910407226c6b737454f2a71c6bebd53823c3ba2cf0ed246b39568b53ae04004830450221008d0405cafd3222ea5f3ccd1b35f647457e9196e9ba8109b9569231c3bd3ce0ce0220359dd6be100a765a01a4b27c3a658d80069efe31df2ec8524ff66e7dc783dff4014730440220734297f6a9620f9c675e5828d2b9bc1d904d07393ba6b279fac1a8d376596cff02206ea0f70dd06a980efaa716d10760aadfecf71bafea66cd26d045927d8dfb105b0169522103f2cd5d06492c88bb3cebc64b99c03d7211bdf9c8d944741162394870ace801da2102f45fb4bdcc3d9f5d00a45f73a2e78ddaf7fb34709bf6f1c52487d9e2ee2b88c42103b15aba2755891815aa55329c50ad9a387f4935605ab9cbd15ef1d95fe8be6d2253ae0400483045022100ca76d322e1541d07805f2298720b8cf30297190667dd0326362b0d969fe4f3f90220581f32aa19d5b0865ce9912c2601f77c788f215fefde8303528bb0a5b12374950147304402203b2e11457844de4fec9f131b8ec351e5742e5fd2ae02677ef213b18025489c5d0220648759ce56d4f28ac55a7c9ca6ed5bd976c046970b5fb99db1af3fba53782f1001695221030af9f6f078495252f6eeba36f74ab283aa62338ff52e918e1e6ce3e156dc05e2210326afd1adc9709b5ca3d511a7b39b647b6e9cf2e1624e00277b89105f34f1c27221039f37c9619e21a79daf474444f1bb9cb758da679052d1d0645ca47dc9bdfa1dee53ae040047304402201c238603dfb23817317c8596fd4969f8377d385b2070ec92502e6541b13a2ab00220432e90f45ab57f60be1c46a6aad2c3a6299b9d733410a23bc66123e6f44ee45f014730440220587b8f372616bf638c65a376eb10af19f41c06f85caed69ef0dd3640e7afacb9022015b58a3517f36b89cebbb459c49ee3312b5085afff582f5c016209ac31d78dea016952210285bd8a340716dd08cdf150d42b0bf8f44c0655177d71316ae7ca959a9bebdb9521024dbc5ba534d5a8749c084014868b6f902477cd168a2bbdbcf965b8080170bf9a210200c1e819f0d2f039da8f737980eed8f54a3ad8b651117525b6b1df2b8fb185b253ae04004730440220179f263f8aabc910b5e018886a604c91ea9daeb8c2cd325eb66094621fc43e50022024b6e747d73dc1bfe43811b284ef866aabdccf09b70ed1f2ffb771c10f8475fc014730440220778c78cd40eee0cf9094dab19affa26329663813c36553cd4f4305846aea6c5a02206ea20331fdb161c09d15e7d3bbaf1d17518d62eb26e8498c60f865c042d85eda0169522103702469d25264db1c601d466a1edaa069b8c1fa31eb4bd6a2932a87fa013d31e62102eb1a34f7de378c3953349ee177f5e549aded05f5f6c93287fc29d9f4ffa7598d2102a99689d9bae4b43e7d87ebf58c76f2baa902e1a71d5f454568ef8758b5d67b6e53ae04004830450221008ae7b2f4d24639a7c8809200bdc8c95306fe252988beeee0a0f97b9bc6418171022061cbd12d062e5261ea6779df9cc89384533d46008514ccfecc0dc034d2b2e3d60147304402202643806dcfddec1b85d6894963704cd7b0380afdc4843c8f0da5c1fbb33b5baf022025503c85b511635495636de36aea3b5f461f5fa50b73ea7cd295900d7435f6990169522103c388ca502d5bbf7180fed6dc5149edab2886f0efdc9fe1d2c74dd04891f1f52b2102cb2ebd248e90beb18219094823a64eb483ace4035a12e08e0a61becc85964f9e2102c43fe9c39ca9e82c047bfefc65f3d204bf86b24b9ce024ab386a7df36bea8c5a53ae0400483045022100df2a7025fbd9328e6a1233bbfa2d9aa62dc0c3305f8b12e5066552cd7bf2307d02202d154215932576ef41c4b059e3eab2b7ffa92ea65a6f3d54af6258ff4bc6d3750147304402202b4dc2c7c576e3eddf354a9f880e6ebee9a675c5ff328613ec2b45f52d5c221902203eef67e1edfb236daff9e96bc0ff0e559a54e3b4d0be8452acc9fe3f581570ca0169522103f463bf4a7c2d2ca143982e089a7d40c095b5627a56770ae37a2ad369c321be1a2103e9caed61c98d69824fec45f5d116de090fadf7e43c756164d761aa1612e65f8f210214c7482bd0812e715e39b951cf82acf8c6bb1c8320aae6c1670b6425acd337fc53ae040048304502210096410ef526490718fab375b96c85c94cc8072570a5195b54827120e2de75ae5202203883bc46a2e54629fca5353cdf64addfebd811ed96f0dd85eee9cd26beb95ab90147304402206318d92977ac68be407277a5e8cf5308556adaf538a2fedf9cbd1d2f72a49ef6022060b3fb21e278eb02136813b0885683931d295fc5f590debb2c16833d66854d8d016952210204db684fa60ae08d538ddd96faae7c71e55f9c49c1a2307ff7f71f671f28e1562103e0f5eba9b2aad862ce35059bfee908352d03ceebc6278103752f2e341b7073df2102ea11d505ded009e6b9b2e8a5617b1c98363096fbbbfdc71002261ed1b134658c53ae040047304402205d10d9660168a2b4eb0a101b7923508e1ef650d21b2fb9001f187a4c461928af02200797a40316ffa1ee4fa8752b82ce29e3aab3b95a6bbd41bfcdb7d310555e1be60147304402202c1e330cf7c6ba13d8cf4035dbc54d37b24994bb80a3168ba142ab471876012002205bd402c5f6d7d07542239edd9c09f877b5b344158a93fd6bbfc3dd6eb7be0bdb01695221020ca067d3658f51286ed05fbdd1da13e4ad0460c3bcbf73afbd7d26b74dccc4fe2102c4fd63df4343e7af31b92a62ff9a8d7037d084866abefbad49ea87762a0055df210316aebe6e38a8b289528cff7f90e1254acc2a00295e2030864816392e01cddbf953ae0400483045022100c125e28e303bc09954796a18c3c082434480632ee7c3cde2a652c593b1e2d326022058379bc69f619b33fc93ba442b3152754e107d048d846b036a2308cb195fdc8f0147304402207ed61790513d7124617a7278a992e6572aad6166feda00966b88dfe49d2b9119022065310a8b827a04809db426c1314caf99cc15dfad46ab3742d9f8a1ae8cab693f01695221039399df644b35e196fb7b798914b11f9ca41e7ff2c95e06a555906996c6f68e0d21035f998e9e029e31705125e8ac180452dd46983ced0614103ffef4d481a099dbeb2103323cea88515b18a881f0c6a0bbea5bdfffa27a5cf68f27fb88e9fca60cb07cb953ae0400483045022100ba4c3e6ed1e87a6be36409d9296d167d64c539da4fb76678b1278e2e2c8f3b84022076fd33e0b3271fedb115b43f1ea94e6a02bb1ca4290b2b50d48f9ec116221abd01473044022077f91f5c233d1ad43a58eae1091dd7b5a76fd8f756e8fc5382d38fe4e488962d022066aebf69c19c0be9d02fbeb3b5c025bf048570c1087624c7c438ae6333eceda0016952210371d2cda4525d00a9d0a5d34360f66bc773b657b271b234ce92be659d3acde9922103c61aa79387eba17dd40391c4d49f7d90fc1804e810804a2f5caedb3e580d03dc2102b20b0fdf22c476ffb0036606f90c3d1e16b115a954593bd6a0d88ac637e4b0ae53ae04004730440220435a791c65af8da60493e4e6bf390b026134b293fa921fd16a24f945259add0602200b6daf9ae9c84f93ea2ecbbf211e79147a2531ebccb1b86c16b2e27a646982d601473044022044c14bb09d7d97f14ac83118035decff0571b81f4ce67becc9d76e0d442bdfca02201b06b7cb4e8f3f506fcbcecba07f851d273577a6282898087fb0cd54534a658e0169522103ec98f345908dde3392d328ddc9a98bba8f981aaefe4cb8f10ca4df3f099ff32e21025a1bf407819f45d1f3eeca3e63d7c71793b8853b21d2f80398d0993a9efa9e6121027ab6f9a135bd44ffa2b282e1493891c8e1ec16d0ba96ba79bff9914ad8b3c28e53ae040047304402207190fa7397a07c67fb9c0a62c7d5d8f4139939aed766f7168b80421d763a9ad9022041ee2d9fbe66af0fa127669eff1952546808fe218d323c1a369e0de6c7f1dfe001473044022014ca1c0cbcd9c769512540904e8af5efd232e5a19f4fe34e0d019a4c4b6f74950220179daa19c42c9605481a90d1e4c66947d084dee4efc54aabc9493f08a49f0c0e01695221022d5a0407ab95bc062e7e5ebabc1ee40b935dbf65bb2c6ab53d0cbc27f537b3db21036439700ca2b27046d174a40026e8ec854a8eef8af393c685740ac50fbd75c9cd2102153fac9e03a6b23e6c1bc86ca4ac61444655b6e653ccab3b471a835239be05cf53ae48a00a000100000001ee86c40d84625f2d3a46cbe5ea74bd77e5851b5805e7e6aef39b233e23adda720f0000006a473044022045f81c3f054a34d604071623a480e5ef6175fd7de99ce6673f4d89ce36023a0e022047f5b6b62f3fa16b5da13f9908e7c1a3b0ce41a0d1666d9c26090ff7ad777996012102fe2708466e67f4cdaaf5b7b3545130bbfa2121e71ce0f778ab487463d2511b6affffffff0109a10100000000001976a914eeb8bacc9220f59abb663e432985ee200d427f3088ac0000000001000000000108ee86c40d84625f2d3a46cbe5ea74bd77e5851b5805e7e6aef39b233e23adda721b00000000ffffffff0c238d8951df9942482feaffadc32daae5da34439625a1ae0f89fb01ab772e82040000002322002020335badac421f00cd72ae82cfbdd0c0620da0188622051e99a07d79ae613723ffffffffb08f37eaa57859da21644a17ef0808316122e5dc2c81f9efdd75b6d9a707bf9e1b000000232200207639310fa495fc266d527e9405c3a6daa8ae52a5087cb82f791c9d0a0fcbe144fffffffff9aab8b4f24d7d7727b8ebc53dedd0967301916e8fbf077f5ddef657933de5a30200000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff672bba2c477b07eaa6b187691444e034b4f847d236c4ce8a90a77d1fb7ec3abe0700000023220020d089f182bbf2a486a9b003ebaecd6ab5bcaa1b299a0f7a3823c74bbe2c5ea820ffffffff2f8c010c44bcf72590d0e82359e8d2e861d6b8338fcfb07798573c9c91b909c00000000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff3a861f47abb52dc93c32b89bc5041fe4cc63938d0754748e4a3b0832617d91d214000000232200206eaa4b0e46f29916ed0a2b9264f1137cfca69c0d037477a56d8c9e06f5c7d340ffffffffc53736363ccaf021d44255bfa7b7adf2b2ebd37df369ccdbefdd372ba6178cf50800000023220020e8a3914077ee8f4cd8c59a225fac68c8041e5d66ba0f84b653d1aa631e83c2acffffffff17a4cb00000000000017a9141864d65064208b0e2c8b7dc2b01267545548f6888702050100000000001976a9145cf1b9582767eab14683de91ed04369c0c233ae488ac310501000000000017a91481397a56f39757e948f033a1638f75f2a5f7744087bab30200000000001976a914495febf67a5dc8a3b8e18335da0ed0b4b0b3d59088acc0d203000000000017a91499816e369ce45ce5ec621167bdaa149c6727ff7787498105000000000017a9148746a5e7040281cd3df461be975b51594b5de57a8738e306000000000017a9142b025be8a6d4a8685b5b789c68ed26c0fdc49af887d94e0800000000001976a914a91b23cee31b61770fec6304a9a4894ec5fd60d788ac47e90d000000000017a9148eb1837fb8d4341d650e5f67ac9d23a2e24aa7ea877db810000000000017a9143eea9a8abf01b28efc7d457509427062c632262287ebbb1a00000000001976a91452d4124d1c0821707e866dd7d7df8cf287d85d7d88ac95ec23000000000017a914ce06ea07ab3e25e78573f3bef31e06f83d61c1de877e4f3b000000000017a91495942f092009b0c58e4ae0c275fb7aa58333c89c870c6c4200000000001976a914bc5d7bc76558a4979b1568a7573157c0810ef7e188ac8b20510000000000160014eefc57d1d4ff0fc20652335997fece4f600c447a75355100000000001976a91416dda5cf9e66714562024b058513d7877866126088ac74ce5300000000001976a91435dd90a41bba5d1bf76c2b9f522daa97a48dd4d288acccf853000000000017a9145bd5ea23b9ad18b4dcdaf89bbc63f3401a81358387c5c75d00000000001976a914349be278823de01c10e52d6154eda92c2e4338e688ac87606e0000000000160014344285b002c97f5e717e4dbd35c04f897be40f6d725a7300000000001976a9143292418f87c82b54c7e1f01609a01bf7c7e72fb188acbff7d20000000000160014df7b1adda5f1e3a4f34b3ea2285f5661466de3643bae600100000000160014f130115a9d2a19fca24db80961564b8ea06aeda50400483045022100e9951694e5068e60a370844402e95bba8592576c76dff823f9917fe56adafb7302203e746c7befc75422cf12e330d5f177d36100a9ae007ee557932e31676da365c901473044022019b076b8d158f389001484f68e30434fc5a0a9a9bc45fe74143155e8522ad5f1022011401681fe1ddd37e73ffe09ad92242c92cb5b5bc77310cadaed96d679653a1601695221035c14228b8f7f67bdb99055ade01e0ecf92c9d6fcc9d90a386604fc8ce5d0214821025f303a181fa1fba9baf352c5f4cfe24bb6c21f8a536087d533859f16edcd9ed62102daa4f9fbbf0e6aed4ff756fe08344d722c8e8933d16cedcc40da4a93911f2d7953ae0400483045022100b32f0fb8060bcf8549a2b840799e522e7324f043091c00eddf943acabc378853022070751941b7c1a55889241f41539e383d0fe7048fa6639f04e3f5c8633909d23601473044022038f971fd325343710ad16b55043e8c4bced785fa0f4a8355d296be276ee6248602203ac52d79c7cf152a0bdc67185d78747bb08921a9b4f33e95d48e14be090b8c21016952210223716ac911554cab628accc91d7f7c8716ef111e3080c9f2b2613a15343f69142103102553b9dc0cb367d4bb5d0bb76833eb3e455e5e22e710005bd3f0b1df71445a210235f248dbddbd6a0f591fe4a8992f49c1a14f2bb1f03851aab8c045e5d98b8d2753ae0400483045022100c5663eb2c088d4e4e901049bbe54bea91f489bd6cd5d3ff4422c226edc15ec08022053b697f191626a5586bad18a147abaf88a0ff90e0345a34fd98819aaaa3b213101473044022063d42916cfffe95bf66ad973165de42784acab04faae2ffb23a1332c348f4281022051b833c4efa19081e1579eb9f2a91e14cea89ba6c96aa9f2cffe6bbdbfaa30e101695221025d4960f2f279b24bf90350010982b21799f96a785da67f4a2b1a763f2255d47f2103304ba5d78d67bfa759a4362e13486cdcd9494b335b09a5e5fb4110d3891f29482102805428d6b5a220d14f2c8c4213a9e1638adbb275943b36aacb23435bf325383b53ae04004730440220342a6f84a0acc2aabfacfb1d8edcff0109e5fd3056222dc44d76e9f76325939d0220134f0e2621583eae424e04e3669ada450af684c330a4f6d93fd57efa264dcf590147304402204920b65fb11d4c234a33a037ccda2e95ad1b7dd6eeb4249508e47fdb21374fad02202025237dd1481bd427c9e0dffc8a1b3eec57a9cb1795ca446d1a54ac946e9d780169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae04004730440220712de596e353d8f75baf5988b5b28549adb5c5fdc05cd151ff0c3865f06fa61102204e35daa536a76049c10697d0e2e291613d4a86d9e1c8caef12822e1e03c481cd01473044022001079ac29f7d01a075da163bf1aca42e800851125ee2200f300844d87d498def02201633d8ebd5f2c0f56dca9a4e84b22e0d05ad7835846dc7eacf6d9074a239fe7d01695221023f220ecc5798cabc855696f36a4464f780a32e7c899fda8a9ed573946e7193b72103d5b2087a0b42764f298772ea55f56ce0545444f0ef23981a1bf6fa26ed345b322103623cf84510c05204df72363d46ed31afaac4126990840203857ed2ae934c01d353ae040047304402201a283d1e5b0349378856c5a945cfb4a7a9ffd9c878a3288625d859a03f51da38022072e1a6983cb17156a67e2ed7fe7dc0c665941c12ec9fe8db18c9536bdf443e7f0147304402201335af828e07a5c33733afb1f38c4f5a9f5bd4618bdfb0beaa6e372a1555ad9002201a6e1df703718caf5b0aa9bfe0eff73e1dd935627e7630a2f51db87c9dfd238d0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae0400483045022100b83b5088dd0b20069718d8a2b8274c91878bfc1454d23bc5ed8529a92bc4e174022003297de05a5bab10c704c2067ca8552668f6055cab2fedc64ca06ebc625f19be014730440220321f949365b607fa11891fb520a125e6167b7560209fed6fa05a2ebe0cfef68202204866bf07311b23b3b9e9f5882243965545fb9b6c8010c809f98a4d60c8adac94016952210238a334c175ba8480f9411677a782e5b822f4d00214c90644fac6925b65f0163321027b588766063d6016dd0c7b4bdeb84cfa280d0bbea796152cb2f4a7af9c1def782102c9a89a6be665d6aa28971d11e1a3a5776304b7605d437d596aad050dca84cc0453ae04004730440220286b513c5103e1e7e05d32e129eafc597ef3e4abcf8b9cf464491710173673f70220318da65ab8dd606acd8d96e0e92bf3bcd54b7f7779517cc2ce2afcf77a210a000147304402206762627fd65d4c94a04594eeba384604d8a15fb7fa85196c13350bc689765eea02201bc7c22a2b484dbadafba3281d49d067bc5c2d0fbf03ceec169b3e207f8c29c001695221022e66b96c3cf8097b4a8b05582c1610b1dd4a775322c26d00d2e97701812006f421034afc787a9ab07271273fe42620b030399cdb5c9a3c4162a2508daecfbb71e4a921027eabae0562f14a50efeaff2d802a7370cde708d4b7d65f887e1ff7a76fdc60f853ae48a00a00010000000153cf759da7b331d8c4b70be1c1eb25d0fcbacd9fb1eeafc3ff1f10a90362a152140000006a473044022003f1892e7d8090af03345107f4ecc8e2e667c9c005356bfbce69a88b81d110ee02203e4725ab9cf986f5aa0c090a1562953bb0ef7e78c4398242415a3baf4fc7687e01210283c07942dd0e907aedbab44bdd8784e208a2d444e3cd614fd2510c0278ac9599ffffffff01fa547300000000001976a914c4842b6f263e8298fc5de9de3151f768440cdad388ac00000000010000000001030108e6a2a6515946d1a76ff32acf8f931b68733167e84aaa6e324c9fc5c6bc9b4f00000000ffffffff33a335c2930cd49fc33a17c0e52597fc708e89c0b7f124e9baa09aa38067ea340000000000ffffffff68eef66c2f0c15ecf61300e7c3d76088f29d2114ffd0c93658ded6066dc2eb930000000000ffffffff020178000000000000220020b6a5a308feee595f88c1b31d013e941229db2a64325088e1b38805d051433384afa71c0000000000160014da6a062dc786684de3598b7ec1146e1cf6e19010040047304402201055bcede3504219c8fbe159e87198e7bb6159a2b9a07d30d1123d92b86bc5d5022043bd8d2328f3e6b01f619763b33ee7ef31f06423fcb603ee502da39d976511f401473044022030edaaafaad096676a786eb0ad2e225323c896df38b9868f3b0f85a239be72570220585def76efa3f34cb893013f979c7bc8d043b374d2880f4a4820f91b698c81ac01475221031d21849bd9e85a37b77bf79611caba99c3d5b797cfa3b5262913686458cd743e21023ad3a018a363248fd8acec6806d0f4b05b934a8896d30db89d7b128b0328512252ae0400483045022100e00948ceaec168263b282fc650347eb081427e31a1bb00b8b7cd5bf77dfda9d40220327ad26817b75e9a30537542d6b59e5e94afa9c8639c7a52f720ed747170d776014730440220734a4be5beef18d8d1918881d869c5353fb52b1dad005c351a926e01e73408e002204abf27988bbca3eb87416fc7444dfa70f74f10767c10244a101cca6204586373014752210282d06b3a24482e7e78bc909c780f71e94e362e39a1bdb88c8a5cb70744acee072102ea8c3f0983b54fa25e3dc15f113a882024309762fc466851fede3d9f57b7e9e752ae0400483045022100bce75821eaf8007aee797d54bd2ce46f6600637bfe5e2b6c44ccbdb061a9a0b8022003fd405e74c351aea6912a7bfa99a2ce651e01b82abe8e4d4fd9c8830fb9c60c01483045022100d590fb8ad6a6a4cef166e27df91773a1a6ba592f62289a25ad5ead03b6c0431802203e177be7d0508a830794c6db2dad153cd494522a93c9a75013207f6312d0bfdc01475221039723f9b22e2cc6f4db79d7cc89d3a583ac20f5ea23d5c1b4347df12b0adb629521021242cb32ad51f36d048a725e9277bfc19955b27691573b264902c599474c379252ae0000000001000000013ede36fdcbe075a22ebcbb529f5234ce920889984c3f774fd4302567cd15e68e030000006b483045022100c4dafd9fbac1a2c0d7f54cb032173bc0cf84fa22f6ae01f52ea441e267a26fce0220673523f5d95244c2bf3f9f42cc71fbebbdd8dc28e37cbfc53b35f0551440983a0121025fdb19918d31b3e53ee3a897877a4aa408ae1e5ba8d44d4eef3113380f7b9cc8ffffffff027f0402000000000017a9145541bdbc49890c2054d36ec2e0e824de74843fc38720a602000000000016001415cee51f9bd6b352947d95842be35ff46211311d000000000100000001b6029dc16ab03084ba0b7421a9ce7bdd85cb07b0993390e3069d0e6c5ba56f60000000006a473044022073031d98e23ef63bd5b1d1a80400e96e67258c3c2618302a127079d704b32af802205c29327f7eaabe0963af073ec8bdb8818b41b6bf281f46d95369e51014b74b4c012103265526a4827c892400c2159b9f804dd6624a8f3cf857242e470cc30c61d2d696ffffffff0114d814000000000017a91497b19965621e05c3e4b6044b1e5dad6b675b2d9a870000000001000000000101e200a9b21009b65047e133549853ef522def6dd0cf64b95032d4a6b8b252c44702000000232200208601ef99822bb29e4f7b05624f45333f2f75d1d0b93440029c7e5e2fe8525a07ffffffff04dc1e02000000000017a914885118287e45397eda06aa4804b1de1b4b67af1a8726990300000000001976a9144ceda7edbe703e456b1ec1218d52ecf27fb87ceb88acb4d030000000000017a91492acbcdf7087059a3e2443bab1b2043027aaec4187e6a16c020000000017a9149ca40f74e798623467ad9101200241fd0b2177b187040047304402205aeb313e5556c8230a760b5d3210485296e9a9c83080492957193375cda2b77302200a211de6860689fa663096f6fe74112f95d0634b39c2e4193411a19349093fd00147304402204691cc8e99b808ca42879d0dea1274c477c5145f77f8109d0e8d9020bb96e10b022059cc547b8182522ce5626a40e3d56c704219eb510c4c89aaa2a10aec52eb89da0169522102c279fcbb68184ebb832732232dd9434f5c61e1d52c5aef4e01f77d4db98ac0e72102ad27694d01ca381b5c7b0141e5d67d5f891edd952d07893d0d90e094c81c19882103937d64c4c915cb63ca04394a66dc1911012e275110dcc09c41bd47fe0056212953ae48a00a000100000000010194d126e03d339829cd61c8db1b36b5f89dfea51a31b451ba9f22229eae8257f50300000023220020c619bf93ea10041e74c00e80a8370fed5a8f73b9818a9e8afa245f215041f40dffffffff03b4a805000000000017a91455a64276f15461192fdafbb46b98c5feaaefcd3387e9db2200000000001976a9144dcab800d7a9de3ead3cabbbb16aa65beb0fb1f388ac3e1744020000000017a91480ec85d0911f9df1af21c0e138366950a3c5d39c87040047304402207530a17fd01f5cba6e65183fd744fe44d150e21c5e10baad37d0c1a35849c1d2022040d8edc62d9559722e234ae45e60bf7749fca576569c257c83359e097226556e0147304402200148e942bf2e4bfbd183c6c69254d3487427c6227b8fc7085dcf7c252801b4050220734b9dda411b564e829271df5e5665c8c68905d2cfdfdc23327770a7ad05cc400169522103c9b2dbe4ee8f77d7426438e5e9e678b427cee7a15f6006bee4fbed416e15e3862102f9832704025fb4070ba338825a7ddd92f876fc64f5d1f291c0c229e77f4821c92102d4926272f1129bc114a54933cbb6573438115e4ae49ba3faaf01069a23559ce553ae49a00a0001000000000101bc4e43d7ade42f1eb3fa07a62b60a99e8ecd8106bbdc81ff34c877b44006ce770200000023220020ac23f26f46c94f63bf42bc4389de77b23a14d458a8cc7fc2224e026d0096c522ffffffff03f4dc0100000000001976a9148e1bf8340948ded58ec299d0fef86d04036c0b5e88ac806d0d000000000017a914649727e2e84846f8a4a088145ed1b65081cdc9528708c634020000000017a914a7f561ba3389c63f4a26a9194a26937a01fc3028870400483045022100a5c2ba945c2b3b3adf30ac58e1cf6d0525c63f5754a0f10a734fa5044696c1fc022005f28825d7279fc115c13f6362f14f9e79566ee4fcfa843b573c21f8be389c0201473044022033c00de705ea6c36f75780379b3a8d824593bf61348f8c8dae70ceee43bf81210220135872d2cdd563fa855a541263657c6f16ac55da484bb49a55bb287695151e7301695221039c10657ab19884c79aa8f1fc1b9b10e9a1da2c1972fc79dcb68c0fb1c29351c62102185b4c41bdeb5a8a07317ae95cc8c1e97ea14d6430ee867f5f82d51c3b743fdc2103d776b6ed7fcc3327d92bd27c76b6b0a5cde77cacca4ba3b59f32f4bbe9e0729f53ae4aa00a0001000000000102a80662cf2d72dcf88eaaea2e194fb0b7ffd2a500ebfa4271e24406613c3ef4830000000000ffffffffecc7289c2892b9c469b0774cbaf50228c1897d85685981e8f61e4b597acdc794000000006a47304402206667f58b6c4038f71467438c3ec38943fa874863f37c48176049725708da461002205b5d5461cb0fba90c941228072f890ebb4f0011ab0e8540decf39020e4bd52b9012103c07105fc8c2287c37827f86cab20e2c7956ec850841cd37629ad4579b4ec8cd3ffffffff0276bc0600000000001600144c28d0e4ab090074de1ff52f03512531cab534b000a50a0000000000160014645d8dbd8967d7c06b45bc0ba40deea772ba60bc02483045022100de77f64267f6558387a83f4ed330dfef73bda7f413537ee1212cdfc5015b851a0220698c8f877cb5f18d8e5e3f080476e024dd9825c8b9de41739c57c0170fdeb4eb012102704cd3ad1024f2950f2134de6a9aa8c914a21d1fa72b1bf4bf72d726ae5cc0e700000000000200000000010224d09736b8c96330e85989fb584f61060c27a88a5c832dda0813a15675baf545000000006a4730440220737843eddf684b73146f63bd9a672a1a49541cabacff9e12603a79c4827ca6400220370fa6af0b817e7f65797bd333eacd36348fcfed197aec255463315be22e530601210370d16b19a4041701eeb06566a1e6c8ff0ab2c05cac3f6a50980db7f9bbcce55cfeffffffe035da95ca4c9ec04e8f97719bf75361280efeae52a394beb6049b38d7d6e9ed0000000000feffffff0222610f00000000001600142191d521d0895130a83f937a6533df02528d10a7b46603000000000017a914064aa2edf6c98f977e54c16da834e7d254351eca870002473044022013c6df5a8a35290e9daae57be0da1edd3ae2a3f586a9c318d733deb4f1c86c6702206c1cbfc6fe2b770d29a18fad4af84c7a3890b9a6f42089b69fbc859a8b489e23012102255d6cf089bc3496997e897cc43c83b999248e484c9fa0d07ff689a6777869ad47a00a0002000000000102e0243ed961c207d42392edf3de81ce103926e534d4196886d29711f5eb64cec8050000006a473044022011647c977ec3b458788617705489feed08b93d12bf2a4d073e5be1cd8eac523002202984389cb35ed7fd2486a5f417a516c0b43dc20612d721aa98612b0e310a80180121025dea07561eb063f3444f71b9bba79481210828d558705c0eeec108b0a0973224feffffff445cbe8b18b3b72b0b2a43ebf5782e592a428d249ccdbe497749620faf5a36d30000000000feffffff0190ff10000000000017a914edce9c339124f3ef99d4db547812c42e53a5708987000247304402205beb20b150974f681bf2094ff0f691e00f43b667acb47ec8a7bd0f297be935090220064536acfd555979a147b0dfb4223d00db22bf5e01d2ce911486a476e89c499d012103c08f26b146ce144a0fc43d07224b343c0a277a38f0ec8c8332a53a1742f9902547a00a00010000000134668e018fffa04f288f7ff61f2c217df1dd5fa7bd871de47b2d7cdcf1e456b7000000006b483045022100b20fd20c396d5ed2693552292efa128cb6bebb8a9c609c4bdda1e218c9d356dd02202969f774a344150dac374fcd8da320ef3f2ebb4b4380f484db1000c78a45dc7d012102d65ff4fcff14e2685b9515718c44b2d7b61a17835333e955b21ea94bd2d3a93effffffff02b86796010000000017a91493ef596a206a3d6a38f9bc59e20f44d7cfed7166875a4f851d00000000160014019253b464dd814eb9cb5e8f4feaba8af6be6fe30000000001000000000103a783ffa7657ce577d23c6cdbbe76e8f378b0977ca8cb4ad44862ff1609d0970c0000000000ffffffff5ac08ce4989632ec8e140a386c3920f26bb0d33cc454ea5395715da891d8e7270100000000ffffffff48c8287dbb0219e3dbaf68dea6334c5f90b62895fbc02559384c275485bdede89b000000232200208a21e7740d9410de9569b0c0315d595970bc3b6ecf2c1d762634a5f69328090bffffffff012dd8240000000000160014696a9c0b2691bb4b9a1ef3f980ea253f74c98b390400483045022100e4ab546d4fd16e34dbafd0f882fb6be792a4d3a4c756e14e205695e9b251897c022056c8714542b70864cbd6becd0f9aebde400e988997a0171a2dbc45373dd5344101473044022008d720c9985125180776e36a617a1ee05a38ebe47697171adbe629145b57989002202995f574df3b4c5958fb4e2c9e7204d8c3665eb209a9b49c671eecff07c6c6fe016952210226a9db23962b1d9d52055357f086b6f2736808f53c45bcafc3f45ff35d5414ee21022fa46a6d745a600d4e5d70b6e3b7bb53804979c5e32e978d42b78449345a92a42102e2f4df12d2395c894854fe7e7d7415309d42a45791a38ebe1b966fcbd3860d3153ae04004730440220292d01267ed17331b289de3398a3ac2ed7b42ede90895db3cf8dffdb0f071bac022039dc748b5540eda906dfc74eec2ab3b411ece8b1d74c875fda8d911ce67a3aa1014730440220722650f3a5285b7c90c6f0bbf5e6aa278221900fb54542b99281625fe01e81220220124bb91ffc9a395773cd10c10cfec29a1c9332fd8f527ab44516d2ceaf2d09850169522102f823ec94328e8a188d15339b8f1bd0bc1b49aaeeec4dd4a656bb23948a6c748c2103d8b19d8bc095a60eb1954736e94f2c2b708547e7afddf03bb6378d7ed48e1e482103b5193aa6dd66cba1ecca1438fc8ba552cedc743b39b5b36d019d3a5e27a85fdf53ae0400473044022035a3367eb9395cce30a318dafc5e3dbdce6c75ad31ff35e51f3f15d3f90863eb02204495d6201588d45aec0040235484067585e2f0406abf4b8ff8285c738b59a1ee01473044022068f89123a63ba9506742ec1fbf00f725f617a5dd3c127df76b9bafe8e2888e79022044d218a6106b3fd0f1e3dbc20c46777dbad8456d457e8550f62ae7218d5469c20169522103454b072ece7f19da0a626084133265e11dd123e5a82dc412469e8c699d21dbed21038d379464e981a057c702f91f5952a008a8da91b86e669144df39f3134adb0f322102425e098e4fc8ab848a213fbfd5c3f83e8a9796542edf0f6291577655ab317beb53ae47a00a000100000002d59dfed2853db67aacab70cbdfca590c58fa20abe535d6eba9fcde6c14729fc1080000006a47304402200db289692dddf6be894d7359cc0ff0f14cb92c427c4c90ada0dffbaeb267eafd02207de87d4abc10603485bb7b9a4905c2712f1aeaae36fc634df510b06b4f86cad6012102cbfbf78f57da985b46ff292301acfdaf2226433f7518b82de3e92a62e3e703c9ffffffff9751b4c7d69397c0d02e1602280da79706060d4d3016b4d44fa91f3c695f74bc030000006a473044022022ab33f7de4de9678994c397faef1eaa7707ac27278111c0580d203d3f40e87602202aad778b807872df5a59e025b4d9b02fa340d0028070c079096971190b6ba6ff012103226f9d8b2e66b9ff55ed0e003a2a5e63cb107580e59695ee122491dbba979c86ffffffff02d41d0a00000000001976a914a4ca7d11d5dff70fcffd2bafd9a82660f627d84888ac94ba1a000000000016001411e15188d37522aae49b5bea63cd149e4c521f6700000000020000000001018d0c6bb5d9f9671c56e5e72639cf7f72a5da24278e4a31c11f6db25d7a7575b00100000000ffffffff02b4e015000000000017a91411c495c0bb2073fb2a68af72f169444aad4618ae8750a99b09000000001600146bde7bff8df00ef5738fc4d0612f3f673c182d630247304402202cf5c1bbae9e8ed3ad1a43428daf3942dd520f0b1cd60307bea7ba4b2a0f823102202699c918254716cceaa101e91796a466bd3d5b2aae6f746f896681e5b35c16a001210226ef36699921aed1d8539fce3e52ee4a832655b8519f308758cfcb7ea00cf04a000000000200000000010198f41327ee777f5cda6fe607c4237881fc1418dae181fe5e62b06e513644f2360100000000ffffffff02eb220e000000000017a9146f7b5d366a76d1d9ced49d69c379b3a11fac282c8764838d09000000001600140d5572d88c2b2fcb7c5263eb5c89f09e4d4ba227024830450221008a2ff2b39b4115a010c2ad4e8cc9bb7aaed1c2f33c5f13c62174934918bb030a022007d85121747fb19e182a173e3b46c12bba7e99c6ac713d2eb8a993ac4b14303e0121027c34610ae2d42d96be5931afdf26f513b68ca7c6a49c75e56367d4f4c95d36010000000002000000000101bfebe4a58b13ff93b4d9c15d53585ad3cf0f8cbb406fc71eb935be9c070e7cf70100000000ffffffff02a6042f000000000017a91406550aec0a442f8215d6f216554f3e454ed2c76d87bd7b5e0900000000160014ed60142ad4fa5b168c521f21cc9e08876f8692e2024830450221009d00c85024cca46e920b6089d2c3a22b1fb806afb0e665f02400cc1db4451ddc02204832f011c66157c1e87d48888272903997ce36c2ef39738b62e3fd85a014a33c01210333e463826a9a0d99e7fcc77f5b34ae1447605d8ff02df01f677a6739ababf4bc0000000002000000000101cb89cb9c23b6873105810154686076c210fd6a7ed1ff52db80964001af4ce7cd0100000000ffffffff0216de1a00000000001976a914f328081871f6101d1162f520c391bb296854201988ac299a430900000000160014ed60142ad4fa5b168c521f21cc9e08876f8692e202483045022100c71b89fb5b176f195009c54cd8d13dcd2609b4294ad706aaf51a7918fe9f62bb022053defc8f74f84f8e89252b2b8510131cfce54f500b7a229db2f2294a9801e31d012103658018a23b87cd64219c3c952188318391a411cce82694a1ca03cf4655f5dc7000000000020000000001017cfd13c9444c15e1f2073a74a0942802260fa4599f526ea7307d7f08391416490100000000ffffffff02362b4300000000001976a9141e89b30780c3c51cb1114c50fbc480a307e7848988ac756b0009000000001600147c02b111d7ca1bd28412c5bb03a334860a724c310248304502210082a14976a0b19308bc111cf05e0a7f36177e9b3db7c0b503da5cdecf075f1b2502207ad1ccd2fc64351ea616abc0fcbc7395888d04c8360693c6a64ac4b3961b66c1012103658018a23b87cd64219c3c952188318391a411cce82694a1ca03cf4655f5dc700000000002000000000101716d21b730b06f64b24756929f8d1ee2d2d125ceb90f5dd825a9a61c9474d4140100000000ffffffff022db75f0000000000160014e32033aa4bfa8ee8a72d4efebffe2cc8af1e9b01e2b0a0080000000016001483d1a54940e3911e7e1a6a96837bff6af326aade02483045022100f6bdea57b10fb246256d01b668540d1e0230e9257da8562689a3bb1aee7da583022037d36a25ce1bc5be5a9ef4ef66ab5796739700330696ee29f9a997a30907a32e0121027703b8aad59878682f98eb9d930942572485aec0958fc7bbf6f5c1ef502cd8f10000000002000000000101a6dd0b5e6a2c3babdc565af090b738315c16de8122735e6b1296fb05dbf490fb0100000000ffffffff02c65f0e000000000017a914f42b7ed87ac903b9f0d3119a121de83817ffcde987ae4d92080000000016001483d1a54940e3911e7e1a6a96837bff6af326aade02483045022100cab5e732163061a9fb769346be9cdc55f597abf1ed5090f79fd9ea983cac465302203e2a2fe507d3395a10ac3ef85cbd615856627060494b4f82c3c1f51d6fdd5ccb0121025cadd8d51c705f95893d3e5fc86f109f203d47ae40efe2328f764383c15102b400000000020000000001016376ab162d9807419707b9abf7158e8ab8905ec359a0c16fea36ab532404a99a0100000000ffffffff02c5562d000000000017a9142788769a05c5ed945f6c3c5ae8bc9d5b56cb8a4a87e8f36408000000001600149b198168440a39b3a2cbad2c27e582d544f7779b024730440220514e688e05bd2564f517caa937ea8aeb2bb5d0f107a3999ca662dce9fed5e49f0220505a132e3876977b6ef94aab6009d69953501a6930a15dcda21a08b6f2e8295f0121025cadd8d51c705f95893d3e5fc86f109f203d47ae40efe2328f764383c15102b400000000020000000001010587c25c4623356bbf1e681ca610112a2998bdd795a963276087c1c6721a81560100000000ffffffff0267650800000000001976a91437edef3d923215756fec313e7684b6af60fa7f0f88ac728b5c08000000001600149b198168440a39b3a2cbad2c27e582d544f7779b02483045022100e8606e2e501c4abc7f97310e3d047ef1652eb16ede92afc4263f8f1e7a86c3a802203ea5af41cd56b5a9a010067ac269d24cf2903eb82e3ab3ad7bac1aa7469a4b09012102bfea8f16f4a6f0240a0b29c5a5758572c6ef9ef693fa2fd0522f2f14362aa8580000000002000000000101094d1653ac0c58f7892c7b471b21b429ee42f0a6b39b04263b4a1551a9cb711e0100000000ffffffff02c35b03000000000017a914ecb4e071c2c536649a5bf232090c4f92a624204387ae2c5908000000001600144fa58c80091038873f55988903d47115f50c992202483045022100c27ce7155d482db58e0e73dbb7f87cd2549b19ed8d4ce9efdfebe8591ca0ab43022055a6700b3cb022022456964ea81aa85dc1f20a579919f29db359da2106c88f02012102bfea8f16f4a6f0240a0b29c5a5758572c6ef9ef693fa2fd0522f2f14362aa8580000000002000000000101c38df5f43be2bae7bf38f30f4b791b3b6b9c14df1907e9299b11830585bbee4a0100000000ffffffff029b952100000000001976a914ce68c494f5efb9b66e9436a27cf509376bd738d588ac049437080000000016001471cc69b0ed0620a704626829e005c0717a5c786002483045022100cbc0ab8992e26ee55396996ef167768efc82cc5f7ce8fbac834dd5199c322d4b022031815a09ad7697a48492b24118b31708cdf4b0c4e21d8fe9a32153a5deb84ad501210250af32f749a0fd42e0478c093706ebea9d40a46e67ec052a11f59364edbc62340000000002000000000101aa687e93577d54007c8a0e128da4b9e70be21bacf125d2db8e81b560f4e237340100000000ffffffff02214d280000000000160014881a7dc7c58b9649d4122115b5b6c069c379a5fe7d430f080000000016001481de045ccf8df8725a19d6ce9c67e8642c2331de02483045022100c2533a02b478651f1824d08cec9bd503b48774a6e195f57a2a1cc526d9b6f06c02201a568286fc64f85ac91a99a354745435dbdf6fe5394022e32b6348d43ba4b11c012102f28988a4badfad8235922d21f499f4ab8ca57b4f7d3195242e1d5a92776634ab0000000002000000000101540c1e8d9fb5a9c7a9bf2a30a28afbd5d606b9b16b7d21343e70983ac7cf7e580100000000ffffffff02d1c064000000000017a9140457d16908f3594a0d5a94b516ce8146ba34305e873e7faa0700000000160014eb4da8093cb0e606779631928b6af434275e4f8802483045022100c22acfc1dfb89719884e58a7b0d14c4ef2278d96b1c813ee4feebbdbd5a484590220636ab25540d33e7f9ebf7cbbdb19aa9b342f176e61883aaf083848b2fa3ac6ad012103f03b8b7c1a154124bfe5852f783cca6961519a42d1a70aeb73c0d894b274c38c0000000002000000000101cff01dcb7498c0c4148248d2d45fd9ee96bf919f089aaf47731c36d893519a4a0100000000ffffffff0204f653000000000017a914921416efbdc7d74e655f1639a9801b16a7ffa079875e85560700000000160014922f14e9ddd184a8c06ab1162684a96e71e6577a02483045022100955ed3f85c2b8927454ef69dc28be6d766b32ec7e38c1420118e81c283df624402207eca7573aa25f7fbb0be5e4024ed4eaf988b8aeef1d6370aef956e1e5e420849012102a746b7f24192b2454b8afef65f040c1f96867f47fdb537e94a4326d5a435d7a400000000020000000001012b2b2d2a4a396b0e2b3532ceda821a2efb5818472f406a045d774eeec1c051e40100000000ffffffff02eff10e000000000017a914c82fd00f81bb8ec43314a59a0cf9e960446621e387938f470700000000160014cfe3489403e5ddc4ea40495f3ea7cd6bce0f9d9e0247304402200d9434c51b77a00d702bf97c4a9c2eb0ef5973db770f3babeb597e3d5327be3d0220159c40365a0c2df308d91c3e873d77637352a92b7c2ab5d9084f40f0de2bebcf0121032383fe49b7e3d28582bd9d7e3ed1adc949ce852417e5a5c703371f4bd7659114000000000200000000010123e7d462101a6e8a6825a996443445fb293afbf2b1e85580cfa3c3256f5282fa0100000000ffffffff0207eca70000000000160014780f2c19deea5a0ce9da7f9dbf4fd9ecb96acd1db99f9f0600000000160014d512620f7ca5d342d18e668bf09249ec83a1dd7402483045022100b4d358a50b3b5914c4517407865da7c9b89d5cdac8cb35f21b72899ae0ece82f022008137436541bb414bdb15181789d98c6e941707c5192726d4bfab453681e734e01210325d700bf8211d1014a6d8d44675aaca192a44e8588e87c8f4e436081dd90e04d000000000200000000010169edd3fb6d40946ff53b6c917204e267d77d6779bc2d27ce99344dff49f05f4c0100000000ffffffff0228dc19000000000017a914f8a03271566649d6a9e71100454e264622c5179787b5bf85060000000016001410f1417c72e5b18dc9e5bd717b867f16d52b8d1202483045022100b132315365cb02074a4fb0b4a6301f374840c413a601f3c0401d1777b12395a202203e56dbfe79e3235e7057f0394c4215c1c8f37303f1fc0055694346286f9e6d440121028737b5fef95aef5b5eed24169b6b0f8dba0be9518d8f3f28c78e1ae8ec672efc0000000002000000000101b6fb21cb634dbeceef15e988c8559ef819f672c80e2a0df0513254593e6b151d0100000000ffffffff02d1c064000000000017a9147dc902858bd8c198ce00de5f3d8946f517c619338708fb20060000000016001410f1417c72e5b18dc9e5bd717b867f16d52b8d12024730440220652dd7babf839fd68eb3ecdb8f29c4a042f4583239db552145e4c1451077e38102204835a506e9506eec85ed8c166ca59e3600b433d065f21f7c3ec81d439e942dd4012103b9f4b0345d3304f16d681ec052eda199e75a587bf45a0970aef7328f936bfad70000000002000000000101d02dcfcd85daf08a60bd6f9a3bd93dd4f978c605c0444d94bb50e545a45da1e70100000000ffffffff02d1c064000000000017a914f94c5f1118c2e41db9831265dc3c8a9e00b8d3f8875b36bc050000000016001427c5c032acd779bd423c6a56213376c1a48994870247304402200c69a8ed8e8d090585b64f057e3fd2406784fac5fd3fa463c1210c379db779380220579d5dcebef4821b7beb4f21846187fad43eaf8f4278b2468f45807969495ecb012103b9f4b0345d3304f16d681ec052eda199e75a587bf45a0970aef7328f936bfad70000000002000000000101f56bf4864e3db8b2725d928e622fc3996e740dd7707fa5a3a126f37dc145f28a0100000000ffffffff02d1c0640000000000160014949149f96858c4da1a4cc0574085c4b11e191fd84a71570500000000160014af30c4179342dc37234d03c5464b44ca4ee623a802483045022100e54468523711391d8e1502f3a8366e83314422e189891147ac30c30ae903adaf0220611daac87bca7bd6a9b97112e4deaff4b21c14536b8bdba03d3a761960e4042e012102986c37579aa75fe93a80dea4f67249c9d534372befb8be7e94a7280250bcece0000000000200000000010122d65a248e5b8ac7b0a46d20dc741d1cdb9703f8c719afc6125e6cb188b4e21a0000000000ffffffff01fbbb64000000000017a9147f6047aa93f1b6701f75ed7ce0c0c3b0fc62603e8702483045022100f4a2075530a6ce8760032f75e74976a4c73ba3f0a8097e3f2e2cca9afd22f40b02204f84dc8e25eb54039a8b64a34a534a7760344645bbf72a339e0370730f0e332201210286c4ae0dbfa092ee413a3f2f4d369dedf965f501a8a7e950899f31958f21dc00000000000200000000010122d65a248e5b8ac7b0a46d20dc741d1cdb9703f8c719afc6125e6cb188b4e21a0100000000ffffffff02445918000000000017a91429c4f9a1530fd71c8136fb3ec5d0cf08d4e8c17687bc133f0500000000160014076822f3495abc7735013ddb7a59b6ec7077520d024730440220138eceb59a23e79c31cc67ea5d6770422951ce4e4d2d19c28fb6b9d0601dc49c02205586f0108f50a3292a9a0124605a36c4e28d5e25b220114d6f209ce98055cfac012103b5a6273f9210359348b913832901270b9da8b21de5b8726c074197e4853c9247000000000100000001716d21b730b06f64b24756929f8d1ee2d2d125ceb90f5dd825a9a61c9474d414000000006b483045022100aad13464e9a81c6f575e4280289e35e95a7a08ce0de632ccdddb6fb49f56a70b02205a5f07517e5d9f5792392f701725834abdd122030b82a2cf1ba173ca17ab573701210252c143f94777ed1a47e8993381e52a15f9e7d8061bdf7399201a0a3ae3c292f4ffffffff01be2543000000000017a914f0d880155834773c937de80838315c5b70d5834c8700000000020000000001015e9a704f5b45ca37c42a3942218f270ee15698b6be99a921d1922622faa9941e0a00000000ffffffff029e74210000000000160014768479138557390b2cbb96132142d5bdda8a28f4991f00000000000016001429b5fdafa4525107fc9fac956187581616ddd07a02473044022068741642d319a11cf90e36e5b3821b82bd4a3ead5f99b7d241ea169285317e2b02202c530c2d31b6075a4c7cd59774c72ef9c2f77c0d2071c44380feac21df2d9626012103e6c6c3f1108e3e3b41f3438977187bc838d4eab869c3a1b5992eb962e6436d450000000002000000000101ac559473b3371c19a2c6cec96fab04e4a39bc6160c85dc9b71b5ac633fb8b6450000000000ffffffff02bf0a050000000000160014b28c7cfbb62c4b4056ddf2fda23aece7ce0880da32651c00000000001600147376e2d5c2883fef620f1c04e3bce0fc6969466e0247304402207e3bba882d1ea08a5349ab2dec3051817ba25d890dc86118d2d2bae7a6763f6e022057d1c8b16bff82b4568d87c1e75af87716b8530894b663d60219105c4b986c62012102036fe1ecdef54583b67af33a71a0d5756624fe6d50d24d970e766b9d95d7e88e000000000200000000010183dc096335ceaa188551e0424c4137f506f3d7aba2cfb4ed8728606e323783ec0100000000ffffffff029a5c03000000000017a9142e280e45c5fb9f572cf901475300672942f1d5f087e003190000000000160014f605b263406d15aabc272a2eb92722b3d7a05bec024830450221009d3df36c8232c600bb91cb4bcbb5aa1f9047869fd6e10c7ae40c265d6241679702203c56dd89257e0730279bd4563d222aaa5299fd2b64c89307a193527e3519340e012103c4b58faa6cfe2cb4c5e06dfc19744c82742341fdaba2710ee3efd90ff467b36c0000000001000000000101b5a3a1a8dfeb3041074481b5b5cbea2a39972059770b9f2151b77a3fd34d971801000000000000000002c8af00000000000017a914f92ae75b442f33a8374fafea7e76d2083cc93497873a5b000000000000160014954d02cb9f01d84c225ce2991eab9bc2726fbcf202473044022015e075dcff36f3717c148d440cb01275ea79d367e0aa4b0469a47b2d93f69f1002200c671430e7c26bc19e200d976b00c9749f9ab461618b22f34626a91b6ca35da30121030732c3be92bcf4d2e0c994fe8d5a669fd2a00178d59802d3306dfdb1afcea4bc00000000010000000001017235984beed1062b79484d8cd5b18d610e016c950de041864ad04c5d26aac7630100000000000000000123580000000000001976a9143d33c8b407135b91db2cf8588ee3b7bca81afa5088ac0247304402204cf6475398af52367d17d9c9850476c4fb0ff96ae30abd74e92e3adcd8086e4602204fd73085c7323969060648f1439454165dee72ceb65e0579a19be852eaa147b30121030732c3be92bcf4d2e0c994fe8d5a669fd2a00178d59802d3306dfdb1afcea4bc00000000010000000164b4b192cfd11352455be154e902652a5a82fd497c50184410db22fd7cd48208070000006b48304502210088e86d38c54dbd13a8d638c1c3061d0af9ba224bf10ee56337d214caeebc3d6102202fd12ee51672871637f755ab81fddc833464232afe60cd99ec76bb9f4f088cdd012103c8659001924ae721ad2c64feb691e06b75c358f815f73fc75eb7437d439ba015ffffffff0128e801000000000017a9140727f1cd25389e474523e476e8b8ec7f1328c59f870000000001000000012734aaf87a689e9e9cb66e9940ec92c01a6d8fc2936eaf5a85db4d5da4c0d54f000000006b483045022100a74d7abc730bc633d80a4ed1e0fe4d32910a5353ce00817d77c102d8411e26e302203cc94545cf38cc5c1609a37ae37f7c498b6522eda44af15b002e9e95a5e3321c0121028201524da806dd8e6cde59e24c2a9f5f021b684132f0605893b0a37b6545c0d9ffffffff01a05d00000000000017a9144d55f5c57f8dd76f1d975338f25e1967001b9eb18700000000010000000119520276d744f71d92c35f9fb068a6d91f4a5de1e2421e6f27ff5bf6d1165bc9010000006a473044022063a476491552d8d6b509711a3b0026fc7f018e43f712265ab9f9dbaddd7e367802201366023ef83a502cc6d293bc75845a8d52990d77d66551bead61e0e0a59590cf0121031315dd61f00e1e51642b34e6ffb5a9c29def616ccefef64a8a95184c42b10d13ffffffff02961c4502000000001976a9140556f64af4edc38ba6f341044fe63bb7c01cc24488ac70962100000000001976a9143f3dc8a42ffa44065602844ea28302fa1e4dc6b388ac0000000001000000000102b75ad6b271a698a946ab1483e0a18c9960c0bea49e2f8320eb2e49fa9ec92b340000000000ffffffff9108b9ed7a8ef05e698f49380fb776e19d8ad7af0e4a08d5943c7a99ed14618e040000006b483045022100b8b5ba2547416eb207a066cff7daa2db16990c1d8492aeef98598c49374d2fbb02203c22b090742b3e7bc5087bd7e9ef09ea2d93dd233ba653ce7a73df589e083409012102039ba27d81ae0f1a8d76e4048822df0eb1455242275af44c2d0b02b28130373fffffffff0294c0000000000000160014a2c0b2da10ca4044d8a734be22feb54fc5f488153ac306000000000016001460d0fbf49092a062a99adaf0569b1fa965715fad024730440220069f0966102fe1ba8506fd85990e4cefccb0dc2d422f172fbe317fcccc16e074022010312fb9307135fbff757a2ed2a7de483a3cd541ebfe45ec2bbdf1bf867a9d31012102f6327ca56b61025034eeee0150e1b7a1620fb914017d10c55628a1234ffecf2c000000000001000000000102a3903f2de64b8ecc65d524f2b3826317f816d184f2f99e759d01eaff4261d6da0100000000ffffffff8f242605cf2868fdd91eaa8e12d30b0aed50e4b8f3e2e25f68ecb36e93e514350000000000ffffffff0261cc010000000000160014a16f3a2df776b8d8ab901b3dea66c9d352625365c0f30100000000001976a914016a67cac3b4695e186e4ba6195d1497aa2d47b688ac02483045022100a49dbff6159cc84e9b69978327ba74d06c5c2e4ab4f03d884257d4450a6e337e0220043aefd62d0ec085cf7baa5f01900d6669a85b7c330a47262a78fa903018de740121028aeddf4770dff36119101330d415de183ce2ee215ebc52b6d84bf396c1d0f5ff024730440220377b12feb9bdea5fd7f82c9f767014ec20a1168b70002ee9f4da6d54e6cc014d02204de8751273a8fa3185520b4c91cc9232ac1d3179f2ec2bbeb5434319ef278dce01210240a64cd405944c74edc7af252a6d7c10e66b8a8922bc73e689730513499722d4000000000200000000010165b4ea6355202d4a2691a825ac8273d85a82ef449c1a614f2b6ea17a299fae033a000000171600142a0769974e36c86f7bc592f7f82a64c1c1eb5255fdffffff0113af01000000000017a914cbd85ae4a52858e10aa3677504108205c88821d1870247304402203b99ec76281aecc8db611c7aad52bb4107614e3f126f02d2ca2677d5399e943e022016567e7f786682d341f6d7aec5b193a047af5ca8d5eb7844445cf9e3029bb1fd0121021830925c75ba1a5ff570bc323fa54e107de23598d5c26dc0205125090cd6a9c1000000000200000000010285228ab547f594ccbf8d3ef6fd065ce9b947fa1e25be6962a1bc25e5dc3559079a00000017160014daa2eda9815efe858c74195a83a82c28d1884cacfdffffff64b6f2e22ab22a176da2f4b5bb437149377895442af67e3822c44ea9edf0dd042d000000171600141a680f43dd46144474be3f04b03a19d0f942ba12fdffffff01d5ce10000000000017a9146b8f965255dba62beae9b83bc108fb79707f7321870247304402204a612e5b2aff03727d45a90ff86b0eb2270c04aabaadab0dfc4bd146781fac72022075718d0400e4625deb768ea0f0f256cbc20d0794cccb106855a0c157cf98f952012102ab9d2bfe72fd8845f5a04a7e6bcb96517447fc331c960c70e79242cb0a756cc20247304402201fffa1cf76610c2f873bdd6516e3616bec36fecfa1f067cd9e9f2dea03be3ae6022073fbb4b33dd414ef10522989eed09c640961036b452ba192ded9b0d4ba54677a012102f331c7a7124c012dca4b6ae2d83be9839b081f81716f1b59b54de2db0896549500000000010000000001017396ac482755fff47f5775f1b46c06df192715845e63e37d6db03e9dddab293e18000000000000000001a1173f00000000001976a914b859dd1c0462591c06f0add93ebbb23e3619ed4088ac024730440220164ea4f6d1e56a7af35906d8466b7aafc67d63b62333e7ec05e586c432b4ad2702202c4de5dd551fd7c6db5b4c5efbaa66b6eb8a6bd249c6d084f13cb19b75fa0c3f0121036a53ba0829fe4de1fe603a5b7e999a3ae93867fd0a686f3ec4d1371e312df63b000000000100000001d29cf68b1f38f9b9b4007257cadc820a0a0e6caab1e89b81bdb8b482ef130efc000000006a473044022056cacee8c7e9059d1581788a044a081f31776acf939afac05f0fd25bf1a048d902202e7944c1cea5ea7d012a7c8234c9545322b312d48aa2960c3d3265f8d67fb9a20121023696bcbd0918cb61203117f96e325905a9a86a85a3021157d6bd612de234a4889bffffff0289b90600000000001976a9148ee0315d487b4d64050bfd9fbde15c1f2f39e65c88accc583800000000001976a914377b8c6f1df2e965b6fddc21831afa3a1e068bbb88ac000000000100000001c699b76ca18f3b6aa86d7dbf3c3ad0937ff36f55775d360b63cd391d69013bfa010000006a47304402207cb07a55545ba6d72f136467c24143c3e18995cbbfeeaa81341f4c5100ea85c9022064faf0d42cf8a30a61705c49fefdf5c139921217a1071d995956dbc44f8ec8510121035825a441d57a1ba87a14e3789a3dfaaf4c7ed6e11eabf48e86ab3c0342508bf69bffffff0252fe2000000000001976a91427a73e2b432ffec22cfe139a19620bbd57c4f43588ac4c541700000000001976a91408e982074ca4cd327acd6b4ef4a4de1036c80e9188ac00000000020000000001016da49dc5da0e34972a86e01aa97dcc508d9f86d29ace796006a9c987ae31745301000000171600146cd470d1b952bb2dc8e4c2d5fd0ea1af9301aae2ffffffff03114011000000000017a914e9ea446b00f7b0971206e3487af2b628bb1c53cc8722020000000000001976a914783b75baababb4f68576c06627c16508e8c5965f88ac0000000000000000166a146f6d6e69000000000000001f00000746a528800002483045022100d04f40481a4536991a8795566258ab87c20829f590696dced4485526217f0f8102205e93ad344fcf6de81984cb0489e03c423e567d9d55ad8f06b0979190764036fb012102a5b9aa82782f7248a854fff2f44f99e1a4dc9bdc8e1bb479d8de8d7eee31e6aa00000000020000000001015d4d273eaccef3ccf37ffd9664f33d914fcb964e879a1dcfc1307c5335b8cf03010000001716001429d314de324bbc1a63ca7430c0a7d6c40ea689d1ffffffff0322020000000000001976a91412006cf08cf436dd4cb403af9270fb9c1756151a88ace83e01000000000017a914dfa88984b567f457bfe4876a4f866b0cbd06ed21870000000000000000166a146f6d6e69000000000000001f00000002dd231b0002473044022037ee0dd0fdd78b214b728f913f2dfed095a05f9420992bf559dc622d4bb9fa6f02200d339b943fcc71e6339d5acdadb495cf063cefeebaaa10174872a18fb35d0755012103a0f18c39756e4cd3a202be5189f0c8429556326ffcfb871359226817789e56d700000000010000000001027e0da2fddfe8c4902743f4af4a7d1e2e76500a501c0b120276d6bf1ea225872c0c00000023220020543f05bd8c7cde7d69d5ddb47a1a0ef1d00fc01000c945c6753e68f2bee82bd0fffffffffc6cbf0296fe716cef402a25223efc642b7d794c62c2627723eeb867a53077d2000000002322002070f12cc8ff9390b02dce32ead166d17596b880c0a9b4a5e2db9ba985d9bc78a6ffffffff01f1610300000000001976a91421f200aef7d87f31b18048febf3f565b172edfb588ac0400473044022023bcc0062d216b624a2da899424ef7c7780440e43cfb3464bb18729835918fbe0220232f00faf0eea1df289ec5a4129ac9b4d77ea6b8dceba0c5ded0b2cc8ed030950147304402201fcacd75087af3f4dec13a5f734fbd222eacefa6b83f9139a98fc6a7d2a6920102201b405672dca6330f841e6bbc951237c70f3cb9146a85bbbd5e16309c70f95ba5016952210338412b4e522a34792f442809e5fbcd96cb31d974e7f164db931e325fd32ea7d12102a97e0bb1834f0b3d00a1dbfe1f90ff1d43d85be5ab5a35e4286167f1b51e330421025dfd0ea89113598881632a995d98bb79043f51b06c9372b0e4b238600089935a53ae0400483045022100a3a66773a386d4093a42c6810fbc760813f31788fe4cb5e9e1618f8776339f6502204d337f4c1f254ae46345f889a4fccb3820105f30b3b070fa231af5c327f77cf601473044022066249d5a8ecc430bc84e2fd9cc2b121e20330877e318cf9df5b92193447776f302206c109d71df464f052267fcb286bd0529e50049adb3b424abb716e0ef091b088d0169522103194331bb7164e2a488476e580f52bc35df9ddbf470b10df1c24ce3f64037c2cd2102e0470b3a176b00a949cafbd890f6b9ab0787c7c9c60088035a1574bde2dafdaf2102d3903241e375dd10a17ac473be0720070b0d6c10a61b32fb2904ebc71b451e5c53ae47a00a0001000000000102324feb4bf385df08f35b2fbed3e336b9573c30376db6421689e8f8467e7eced60000000000ffffffffb2eaacd719a996c12a35952e1af98bb63fa0bccba79fe26faf77d4184b9ccb33000000006b483045022100bfdb2e0f9d1734fb44d4f659af0980b1e71ec024e878e45368794d8df21153080220506e46b7d836ea42ad6bb23a003d6585f2b8d1e401ece743db429e75eca45c07012103c8ef10d633ddb3798dd6cb10bdae0336488ec351985a57db97d9033891012ddeffffffff02f0ba04000000000017a9148c28f1ac160f85041e8bdd4a66086acda303f854871c5205000000000016001426e4576c0fd21a7174ab4911da648bdca124e93202473044022063899731ceb807a71b91c22b2f8b85f3eb87efcc8f801c6f8dd500de71dd9867022014ced8b823fada37bb7c52639b7d291509e4d1e70b63b5b9030b71b13e5bb0be0121027810ac9fb3e410587817b8d5f1712a1d457820e8ccfacad483ada4c1abbf245e0000000000020000000001017d371faf3277f0fd78e2c0876a5dbde4bf69d0feaabeab9333acd3800d06c52f1200000000ffffffff1b887c0000000000001976a914bc9e749bfeb4c7032ba6734325459c999ff9191a88ac905f0100000000001976a91410581aa1225d52a8d26a23e4533d4b22663339d088ac76e50000000000001976a9144fffce53630be28c41032d0d14e385007e0a022288ac567d02000000000017a9148104959d77b314598a1f1a816b4c019c85f6e2f487ef5818000000000017a9147701d64f093d7ed5b11193aef393c5baf9bd508487bb3800000000000017a9145fbca865f16b047e6fc2739a8330477c8588886387c90802000000000017a914a73184d32fcf02be79beffc3a7b7c204a76652558720d613000000000017a9142b7c559d954ba634c36c0285ff5ec438d0242e4487774201000000000017a914700d1c26cce83a1f63e7bc9d1f0d2f8844db297287588c02000000000017a914f4c8dfc76f2f6be004a7f478140188e8d913468987a7c0070000000000160014e2ea5f0de6679ee3864956ea58543b3f4098a96a81720000000000001976a914702323220d69511a690983e34ce2df79aba5fa6f88acbefc0c000000000017a914d726b75810166dfb8937da7536cf85de73600dbf8722020000000000001600149f0495192467b3d51ddfe8a1439ae7838521faef82af01000000000017a914df250119e5627b06e229eae4f2ced4d5818f981f87e45001000000000017a914abebbcc41d07af873b8575f42799fd69ff8063f0876fc40b000000000017a9141dcae95c6aec8cb2108ad2185ee58208ddfc008287544f03000000000017a91415f343b668ad5189ee515c08dd508f39f4f14efa87eb950100000000001976a914a082f784fb9fcf947279c6e09b3c78a66d0cfc7f88ac5e83f2000000000016001457012fba877b6a24c59f6d8bc443759b938275c6754803000000000017a914f713cef3f0b647d43b17f54bd2747c94577def7c87b60802000000000017a914102f4d8a04444e54eb98009c19c4b97483bc52bb877c14c8020000000016001407af528d7703b19a2150eebc47dbfa776e84c58787724000000000001600147515efb16c3949a2098036676f1d448d5ab9dc159fd500000000000017a91457946924c6d49e1ed1ab05a9f79729f996d6d3728709d32f00000000001600141814f48c5bc9e7f377851b6e86cdd20b87fa3aad82af01000000000017a914a1b844fdc7bbd32876e1d19cfcdfa5e341552f3387024730440220414b3df4309d6b67b844fe6c20b83ab86b27ad5dfb757f85951da4a69bc4a0670220559b601fce021d89dcf57c4c33f7b4dac0ef05efe33ba905a37dce67ac6e5bf90121030d29b6531c1efcd8fae7fed973dd38bbfd98d3df420b2a91d303dd2d3bfe831b000000000200000000010141b29e0bb47fcffc3640c4e8aad85d31592b93a5f74c19870c3a7f6358487d901300000000ffffffff029076120000000000160014600a115ae2268ae676b719c3cf69ab498efad76b870be00000000000160014a34b94c8c8b0e7ecb32181546ab9a2e9a902b64d02483045022100de0c86ff9400b730af3fbf6b6e68f170a456f47e1bb243ff60f64ed6e2c7c1260220253225eb8f7928cbaa5a6ebb9849f479128d1ce5a58c51af1422db57c5d20cea012102a8490dda21b66acc204a67b079693da9cc56e9508c18e28236fe13c2e5c28e3400000000020000000001018fd7e0ff0a8d741d773296689216d038f9c8ad48a1334b5998fc1344a793e8760100000000ffffffff02808d5b00000000001976a914a7d8204e05f057c34efbfdcec03515710c1d166188ac9b76840000000000160014e9a93d42861c30767d456ef95e13f819c13c494902483045022100b746e3870152c1634b56a7628164101c7b906f9bb57a697db82ceb33c5dd5c8a02203ea80bdef0bc4d17646c233faf36c3ad1bad2fb731135657f39d553f5a6e360b012102a9e73f770d2833f88c0707c5987c8dc0ce003414a0ecb7d47f7deb547a5f7045000000000100000002f1667ca0b06b5852ac2c489c2287eaea4041bf6a01939c96c4a80ea92a771ceb020000006a4730440220144abfd6b4893c3cd20f57aaed8278b37ceae5e78c5b43f600f8029b549f24270220773b91ce4ad9b6c0ff55933395627f12d2e20c3ce133c90e33cbca2717d17e3d01210314bb4d0c6e3de20ae32b9a7a51323c0bcffb63866abba51b985a185ad6faab99ffffffff34ef75c31daf809bb0e321f99e423ab337cdb157f966de524d7e246a9d3230a8030000006b483045022100a76a31c248ff186c0c8cda2bbcb8a26a21c3c6cbfedb02a1b41aaac9953ad30c02202f345601d56fffe62646469b6c8a9ca7adefc1f5ae8181d2533a97088f5d1a3c01210378e38c6f0e62dbb8ac47f7435ab7a069b08dd415153afea597d096f3f4d079c7ffffffff028c721000000000001600148019408d5fa5c5dc90adbc1389d87a8525d94d0f89e1070000000000160014c68f50fafe3cdae966c87c53dab8ba2d1ed8877800000000020000000001011f73ef2fc133446916c8126029614440b42ae4473f3650699472d5737904fd1a000000001716001449c98b60055651d2f8abc4f007ba167af2478ac0fdffffff023e731f00000000001600144c58de2acf4cfbf77d89b5e301cb9908054bb0e778b1ab0100000000160014a2973b2c16a029acd31bed2fdddbd5023056f9550247304402201230b647d4b858a619b0dbd0bad757b74e27363e9e30ba5a35d81204e6646ba702205ba4cd20f5a5ce0fe89b69229f05e80d9c50d932fb1390527dbd71da94cb5615012102fca162fc9040e47a8a530a1e48bc237837e2f1b35c1fb6742c00e3588f7ce15047a00a00020000000001018ec7b3a3d724a45c5581c5e89a3602a7758352f887496874fc0e2e46ccee23d50100000000fdffffff0255581000000000001976a914b9b51038d5e936b5cc5936ce3faf114f5b38abb188acbd559b010000000017a914997eb5605b661f7857270fe29d40e3c403404c6f87024730440220453b477bc53c79acfda615b9f392814f901fc41a2e098c47622f8f7396907638022073ce0a496232205929bd412356bbb95088ff5c581ca28d28ce935047fdc561410121020eeb90978d1e22e5db20d5c4e376f05e86d0a885379879041800188eee97b9f547a00a0002000000000101f78cd9f244ee71e539839d77ba6e6cf753b80737cfcf6fe67ed704138bd534da0100000017160014346435e32dbf9b207ed41c6ef917bef8d1dd1505fdffffff0237d791010000000017a91410565a4ef40f874b434552941a9d38d22b506eb787a27a09000000000017a9142966bf081f79c57ffc13638fd1533dc20b760cc6870247304402203cca13e9a8272270da176f30720d2279aa49e2bee8bdc0d3a05e0d77ac0fccc10220799b76d3cbc2d25b8958dcf13a509989e45289aca57fff80904ec29eae41872f0121029b9834e75cbc64e6993995cc2c04a879d9068dad3858741da7a341f00c810e1e47a00a0002000000000101e9a5c623b9e5d5fe11d3109b0b2153d3ac82f478d873b0ed94c8b4cf116b459c0000000017160014bd0fce5a8fab213f1d7abb77ff0ee33e34734c7ffdffffff02e711d80000000000160014a944487badd81b453b22e2b83ca4e7a375f83b1878c1b900000000001600147d63f5e69f860838f3f0c8bb19e4c382ad075c7e0247304402207af647c3bb9418ad961f2ad67d93d1a51b87ac38a1cdea693bb01e76bfab19600220688cd299ab341a1f88ec2c9eacb49eb60564569017d5536870f633f5fea8a65b012103ea5ad3a91edfed178628c0549cd208c3e139676c5b493b13c266a98b7f64355747a00a0002000000000101492d8c16aaf3a1657a19dd90029c575eee0e609a576da6bb8b7609ebbfa567680000000000fdffffff02358ac4000000000017a9140e7a61e4cb5f2e428d50bed1990873c06da472d2874c841300000000001976a914313b08c154af4f11a767c13c57b00edfbf59bc6988ac024730440220081812fa83c3663e9d7a5553eb76c7b355935641ba14b0c79247c692e81e9ca902203ef6b47f0b7305d1cc8d0ae64e7a50b2c5319e4f58b66ff95a523fb1bfaa91440121039b57791130271e03a5e3bf86012412c56c644941e00727a4d44b4b836b303eafef9f0a0002000000000101cf010a05b04cf6680c4725b43a8458e0f00903f72bee80b0214984063a8015ec0000000017160014917d556c7d0c10d1d49d1d1fc859976df5675ddefdffffff021ee101000000000017a91407b22f259a242629449b5338db03fc1bd3c1aa7b8733a5c2000000000017a9141b2cc105b0708510dc0e3f64b8c8d5e9f22d4ba58702473044022006e76db814a9620adf96d8e07de19f23083f3e9c61c6367f530a208f3ac671f6022079ce4fce58aa576e67ebb7cfecfae4e39b8527c1b03ef0395deec887d23da081012103af901c93b5681fdc3edd955ca82b93ba2e3db956d8c750a16d24bd65580fea3648a00a00020000000001017d3453682d1d7d77b45e470eed1ec69608d1ba62ea1c4b8a4748a34c7211a82e0100000017160014b777833377d62490007e84359741e1fa5f374169fdffffff027be50c00000000001976a91416f642a3e929123bca3efd9ca713c7b2df3e822f88acc8bbb5000000000017a9149e4f55cf29556292b8ca1a3efb3c03203c41570a87024730440220693e334fd68ca07cf212d3b35d3c5514e719c2129499638e859fb0aad7fe171f0220613e5c667003bbe60fb142c98c3f81e4d384808e78460ee9631f25aa601313630121024895679137d12a5713939a27b197007ede73f601db84780de527f06f325a209b48a00a0002000000000101e65389b6aa701aa8fecddcb2cf1903d9a2863b588f6b584d4a2ff052f8eaf7200100000017160014bc9781dab089f4756d41f15859d2162124a91774fdffffff028330a4000000000016001491168e6f9a62bfa428031f91ff9461e4be89f77a6d87110000000000160014f28c4f6ee273649ff0043a7e0415409f52673dd1024730440220529aef056b0f15af7a062de11e242b2747021c6bdf4b5bb827f6affad2d2e6ac02206f64216dc5cfa69dddaf7a6c0220f6d0ac378a70f7b0dbe2a3675625e1a1daf7012103e7896be1303981a72f21e91b8e4fb53b4bbf2a3935cb7847aa1082c73a5e319e48a00a0002000000000101133a07ba59999c0e4374bb5cc5ae020d7039bc8b895f6ccdf9a1d75e33f361f40100000000ffffffff01978211000000000017a914cdd3bc162aec065e96a3fd3a0d1715809a95b5e68702483045022100fbd6f7dfa27f23d136993b07c7cc47bcf7910cd979754cd2fc56946a49c4f68002206028879c28425124decf844df3f2b125be9b626e4bee5bcb511c0099e47b59d90121026fdc41a797b448f91e5fe87b6d33144882111fa625ee6de5dbb75fe3e861d7120000000001000000000101577e538ab24e20bafcf2bbd04a163f131709f85d9bc31456c15bf450df5aa9160600000023220020172fe22d1e6fc050848713ef72c43b4ff29f9abeb63d0c125b82da27fb1c1b29ffffffff049a2113020000000017a914fb4ecc5859947e01ced0c44bf6cd841fda0895f887805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b493000868700a3ca000000000017a9143d7cd99748793a49989784a418c5e2cc49e195cd8780404d010000000017a9147a9ff6ed0f830aaee21ba54b0b4ea17375629563870400483045022100eaf2d23a52ac4a9aae4fb8a6ae66662b7bb4d309bfcdd4b0cec04524a20f1aff02205f7b4fa0e3574d21a25590514eb5d91f15e1ef4df3abeac7005d6e3e93fead5301473044022001b1428458261a8cc8d84ccb1a016b2d2a5e57c878152aed6c81b3b11970edab022021975851e13870f7cd5ed10f2c92e4ef0bcb46a9bd16b233243f58309e40f5ed0169522103a63e4bc0a9a31b4cc35b81fee166127447e69ce0321fba42a4b4f5719d42447c210262aaa1d420a4ebd6148a87e33f448ce37d10ccb63a13a4733a80cd9c7911bd8521027d8b4c03c8e950d74e4ab71d82e7e79edcb636e076d5420c4a05c1b1b236135953ae000000000200000003da4be5c7dc5f0392fdffeca5d07e7288f15491499adca50c5d75d2e8932be75b080000006a47304402205672672e51ca5d2391777c220414d38a89d27bf6ae519ee4037cc9321c7263ee022026a0ea150175ce1848e73c9c69425c90fe504e673c077fb7ab1220d302bc7ee401210329c5bd764389d491e647650e5e2e2076bf9c82c32c043240cde53c5240aee89ffdffffffab89c8024c857b2d0de861faf9ad633870ada47675fc9d39b9e1e040736df13f050000006a47304402200b2ba1e53dc6cbff04d53ff4b018f1a05aab3988c3fa0a203d3a71e12d758ae402206098a7a4dd4437cac2e60816cff3907500425bf9b28d67efa23276af4a191c33012103c923a99c0f80691d155eeba2395a3ffd3c4a0552c64c6522bf555a44b7e9c67cfdffffff20a0d84ed50e36ce2a2f08a5861a2996c1de02801d4f282f90001b687717077b010000006a473044022072dc0f21f6db0794beb1dfbd6d2f7b7bec25f8e8a9acdd5bae7a93e0807dc83c02200ffaa3c8e6f6896e73b9dd5cad3a691f4c2723149990210273f158692141b1c70121037354f6688be6b29e65d0f96fbf158ba374a1db41a206a25bedafad263ce16fedfdffffff04c05c03000000000017a9147b67f82ddc2d68e11c89607f478a3f94bab6df4e87875d03000000000017a91485fffcf77dbce03c8ce3343b09e2d8003d86142087ca352200000000001976a9141f50abd6b927c9ca5bb0ccbd66a61a7ae8ac1a6a88ac5a105900000000001976a91407cc15ab1440210031da2f8c920a0e9441920db388ac49a00a00020000000001011b41fa0a98f6119a2c85d5d5eb04424a45adb92d77a49a18a1800cc0e7b2a0de0100000000fdffffff01d468030000000000160014356833bf8ddf74bcec7187a84a6790226c386c2502483045022100eb66c2f8964718c5e64e0270554da5e519f6e9ea1730f64904fb5dbe7c1b78390220095991ca482b2e0edba60447f8e195af87de8669111ef85a751c12d22ea10f3e01210322ce8b8f917fd145473e18f18eaa00bde163bc133d3d237a1503e77655862fbd48a00a0001000000000101e1e5beb70a04c5d9d533fb90debccb666bf84f35199e3d1a5146af6d2e678de00a00000000ffffffff0103d92a00000000001976a914765d5f88fa4cd66b6bb45a2c75f29e71218a977688ac040047304402203442c33718cc55b48e4d81775d48142fb672ede09af66ae315e80bb0fa771ebe02201d8e1bfd434d83c4c6ea215b17255dad3b28d72b294ccb3d6b14574e6bdc9b8d0147304402201839a6da500ceb3d94ad586ab2a3e2f72c61b58519b9a75ff8a5bca1711f8d5702205e1b2e128c5b2c993a1947472d30ab9634fa84ee2f0b19149e6c1863295544890169522102f6908414564b66f32df29756727967939549e23eeaef83114b55d8b7e1bfb9f02102d6c054995cb3588f48fcff614609a437827cd510af06c454087ca39ff9d1e4af210203b80debbc81c43cb8acaaf37f8d1af60a6f553018e6fdd85b53a221c88cc1e253ae48a00a000100000000010124feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10600000000ffffffff0170944d00000000001976a9146eaa4a3ba017554a487c407b7b0648d98ea7b54488ac0400483045022100e3e700a512f9b236c313def8bff6d83a72b1fbb550b53768d2330ebc7817988a02207185aea3f1e6264231853014db9fb8e8d2b6f1c7bbce93c176119768b18d62f70147304402207fbfe53f1ab11f91341b1c55ca691554adb6b9deec1c9a0a4e4362f80169670c022035a4f9764af7167d9ae282cdc44879254e77c2b4ff8b6cafe87cc35135cd4b09016952210213218525353421bf10e1e2f83bb254d1a387fde2f73582a993fc900568055606210343ece74141a486365aac8fa0cfa8786d50d030f94af212788442de9bff00383c21031d43ffad31ccbcca0dd82761288ddfc1c8d0c569479be2044ae9f373563423e853ae47a00a000100000000010250ef81f0e1427eb584f748dd3ecb8bf5e2d0d452bc2d582dc7b3695bb72bcbc80100000000ffffffff8c0f59fe97c288ca4aa4e06586136ecb068aae264e82fe725454910b0edc268b0f0000006a4730440220427f90d537697a864f406c3c44dc5a7ae886d2d5e6cccd2331265e7868fda88902205c707e776d48c3b7fa606f56c9315889992ebf586c054d6396427bba1c8136b2012102ac8cdb24385e623414a71e63e0d07e9103f9f69a25ff0d5dd6810c02f779dfe9ffffffff020faf01000000000017a914ab218eda32f16ce85e0bc897f3b4f85006529fee871c0c00000000000016001431c8ce219309f4cac20d7569ad83cf16d0a44a9d02483045022100f76aaa8640dad52d2528c85c757bcb344419a139c8bfc3c6411b4fc53c3b9bf3022017c00db8950e95a41d72885ea55735e8403a1c12236b851e2f208bf689d0f00f01210309944d0eed27e387862bce8c4c68c24d8852144df165ad29d5815ec247e9612f000000000002000000000102215d0fae2019994dda71fe95f5488f3b70e136d3c3d7a926156bc2fb8602a75d0000000000feffffffd0a5335aa676c1799332313c91b2929703ea2d54f9e79c43264b544cb76863290000000000feffffff0237450f0000000000160014ddb10b6ced477ee9d62bb835a0417737f7cf15f230c807000000000017a91413d839407cee486d212122cdaa958b274c9904738702473044022004ef4d0c2a9c151342e5c398b2126942ec1ecc79ee827d351207d23d3a2edc3c0220356a3b4415a7571164ac11ccdaa67aab3abfa4774b1c74a01a49121802018b76012103f7bc5dfcd4121685acafb7ef0447ddbcf5a9868385b0ffe393237b07f6da62e90247304402201aa95e70fe5069fd533a13ec71aea9fe9df68c08ee6d4689babfa5c34b3ba300022014a40aa4d664b0eb713aa70121e2484904f014da6ff5fdd5f4ef8eb183542b35012103d0228cd9d148eb4c28d8c3cd94314e412eebd5c496c4b9c81c36df2ef9abadf548a00a00010000000001015e6ae478adb9e44aa3d365d9592fcfca67a7a257d835b54b03b4674f769b63020200000000fdffffff0252ec03000000000017a914058d27086d7eab1016dd9c0a49ae758e7ed12f3687d9300d010000000016001485b222500820af6248fecc684a62ba9088fe4dd002483045022100a7beccfa5942e630f75821550df5ae3076dfabd673116281a9fc340619e8299402203c6be2d77e03cb1e6098fd98268e2f0b2423260725742527bae1c8b875141dc20121034ee492ff049591d13a350a761b9ee245ea82c23cf94497f3a20bf4c13644d5fd000000000100000000010154d49266a86b955edf353fbbd81bb5fe889878768ebdfb29ab491bf1c94a14c3000000002322002018073e8ded6a6fdfdecb27b746e668a06f22d3d78b675863ead2fc9b1e5f3d2dfdffffff0182e603000000000017a914669aace975e26134c70e7dac6aeb38eaa9c37e7e8704004830450221008fa282f9258b8e8fff396c8e8c79843874585cc92469cf9ee384cfd5c3a41a0a022072d3cd192cb9b578cd823f83006a31fa62edcef0d2d2009d08b128e30863338b01483045022100c110cda42de776d4464a436af9027bd55230e305ad04526cfb43c7c7293eb96702207a940fcda8ac3025cc25bff5cb26d63b365c9bbad7a8577706f85495517e8c290169522102c32d2551d22726466d92163e62b3eda53f0df5c5550da3db187a493103f1b65b2103cb43e15070d6f1e0c53b294c6a0bf031cf54724e644660878ef7378ec60a16c6210290e823afdb84d282e42c55950451ce5776eba2fa1f68a5fc667e8fdcb469e42453ae000000000100000000010161c567d6deaabe2be9505389a6a9d694c146afdaf614798233b61e1d691bfc6e0300000000fdffffff02c24406000000000017a9146fbd39ddfb097a2ea6354611e8de37686d83f01d87707b13010000000016001406d183cbe6dc2b5cac3fd8ab6ee84cf38f78352702483045022100a04fd3117e943eac31b4f0d0029e99b90965f556abab0ae1de558f98d97fddab0220443e6762b84006baa3828a2a22c60bcd0ac52a148b2935e266875fc1a902f97e0121036a8fff116f98fa7487ecd3dfe85d9cd5a6502210a3f160c346e6e29787491be900000000010000000001010a2142947cb4c3791bb131c342c5f4d28232f60102c64cba32251fb81a4b854b0000000023220020a1cf7915ac8f29b6805dbfa6a3edb6c83ab674d0ef8b28050afdc3af743dcafafdffffff01f23e06000000000017a91452550a3e687967b78b9bfdc4de0a26e6c775ab9a87040047304402203eeb230d01265fd963324f400fc76d3959800f3d336a38aced14ce28555e1afa02207f8d699858b9da9c89957cc1af340c22c756b34f69c03b77e296dfa02a7786fb0148304502210094cf41ebb3eef2cc086952d1945472966c5b683b1d69846e854a0f721d72225902207bcbc22b1a81c0671c31683d08cfd80c020ca52012c0fc5fa0727f486489b60f0169522103ace6ad4dda0d8089855e854004fb9e4441df20126b72faf3a16b3c5515fe03922103949db543e514c9c6665a93606fba64638c53572e7dac71969911347ac9f852742103f7f11bfae6ff75c3224daf27c29dbdb3b6e3381bc84bbf9e4ac114b885885b3f53ae0000000001000000013e1d310fc441628eaea934298d2a4382da47d4f46871c0dfaa680ab843573aa0020000006b483045022100f9007dcde4ea1e7518a3e3605984d04cdf03c72a8d8d539dca9b5252384ccf2902200438a0d914b1168075c8017f55eb4d1513be6f87af258ff0dcb8540bbf22eeda012103cbac59ea485bcf97f5e503c2f523e6de501a4f9cb2020e2a05106aeff28a17e2ffffffff02d00700000000000016001488e1dc5486b48bcb79148155f81992472e8a3626f5bb2f00000000001976a91483995f377e04551be28b953eecea811eaf0270b788ac0000000002000000000108f06a6ae14dd08fa52b226063afe0ac03d2574e0dd504b428a90d38323b52381806000000171600141c7b0ef808eb0c66478bf90621c2288170096ca2feffffff5b7b06c330083de24ae0b6b48c03710a9c26ced1717a0ec25ae484284fd900f50d0000001716001483c5742cb24532044f9037ab37bc26a3f0bcebebfeffffff379d7557bdf9879895d73c269c9ccc8392be9941c1ce015d026a0686f460117001000000171600141ac6594f2e1f268a675737825ea598fc1e4587cdfeffffff16d8c58880cae967a097e6d5fb2dd394037b64277845beac5d592614551231a401000000171600148e5266fa0f81cd587af577172eb40db696a928cdfeffffff26db9fcc975a257cc80426ffd2988768a95a56666a380fb3e16986a14ad289112600000017160014a9cc0faf37899c8fea82c7a3c44c3850e48b7766feffffff34d219e7706aff07aedee23c58ba90be56ac35fff1d43eab164af35cc5a1f66b0100000000feffffff035905f60d35e0317fd13e7e2b6416d18b6525390b5ba6dd7bcb2193ff68e4ce0000000017160014d6d14ee2f5d4d38b84c1efe3b47dcfc9432c8e57feffffffea95dd4dc264a57d7cab0a768281c2c3c1f7bed4b9dd77d2f6f23a89237946ad0000000017160014cbba0e3f4eef136b56c2a821f94958fc0f20b876feffffff01d893f50a000000001600149a1f6c827ec0341381aba8e53134c32226207a6d0247304402205a8926b57096e8a76d5c6eececeb7045b690bcf2ef0876cb2b83453fa5c10d0f02202f80c190e852b470e8a9df0a0e16481dd35947f249cc7e73ad0c9ac6c4a573ed012103f2a84d1262bb34e8191dfd92f69889e88b8d888beabf64f807ca9e9979e67f5c02473044022005dd7f7005547bfb871a26b282a4d453cb27842a15d3d10e267420cf889adbab02201961f817552390c436e7af529b197fed026a26eebba3cba89ac1553177d47aa9012103957b65d7badb22f1bd90ecdc1e727f89b80a1b17752fce79427d9f3874cd8fcb02473044022044ba340f72cd40727c123502fbdc6e0725751e6d0ec2dba2482b438479c8a02d02202afb503b78e76d8634e78cd5c8cfe804fdf2315b0e3eb56495dde72e31b214a50121020433527645f03542a35cd67763fbe06ac713eb587dc857a597bc03e695087eba02473044022010f2566b499e499e7fb37a4179446979ea63233594def4d21cb2bcbdb08a67350220764fdc7aa966686ed053afda069f933429f3a754598deebdaeb95c9d996a52430121039ad7abb0a1add46db9fbc218c5d08c03fd0539ce046709327434b63ca04684ca02463043022068d117abdae52188a4cba777a6fe465cad0742ab8f4fa5628b1f660817f74c17021f28a4af1bcd760e323c470b656ac01bd216050cb08577ce067f45c669d4931c0121029d9a8bd0ea1fdc4d9caee810c898a50127c5c5ac127fd589a4f88ed12438383a024730440220477d57c9a9391663eef9d3e754710be49b65e19a801fa01562653607ebc2697602204195a3b242e3ba26d569d5477bc130d011657e94545ecf82fe05aad60bc0d44b0121036f12ea2a09e25025325bfa426e07150e7ae26ae63ae044df7c5f2a2f3ff77d0902473044022048a39ad0c773f1402a658552d0806ce1f7dae924e41ca3fc894007b3392ab78d022064aba39380ec39698a120713076a37ec8a8ae4d30c0a7517eeb39957636daa600121038ac9dc5717cc116c34050e0695d122796ae667d69ba9e76ffbbac31909bed7e402473044022027b849d61d318980ff5a13718daca855fb7d2d8b91c6d104c4ef555d490e776f022005821a2bdf93dda680170d056faad6ad89aa4e86c0cc7f4acd27359232084e19012102483a02147f353eed481176c4ca485a67979f60bf730a0d6da4f66340fcc6bdd03ea00a000200000000010c0395a6aee531d9bc8c8726c62757514967f00c179398fb170603cf9c7a8ab2fc0000000017160014c588a8134c3b4e1a9818d5b7c84d372e07cb7985fdffffff07bb12f6f842f241565205655124572a3f216070bb1c3206da6e5a0f0ff6aed70100000017160014561ce7b273873dd9a2c0a641d51f401bf2aa2a7bfdfffffffe70e51ac1e2e27765c6c7247c2cf811155030fccf01aeea913aa796a54519710100000017160014762b7427f76e42776a5d32fe0a14aa2ac61c36acfdffffffbb6c18457195fa31247abb2a5cba15dc551bf7137488f393d3d11e0cfbe96601000000001716001470456b99c320595636fd92235135c0db8b7b9097fdffffff8a3c282d8391bd5a45d30ca375e22b0bbb900654d2f18105e560bb7000a1749100000000171600145399feb25aad63dde3841545ff6fbe1f847df3e3fdffffff4f73b12e978030235893129f86664de1de8fa4b44475acf05f646fd9ee73edc800000000171600145399feb25aad63dde3841545ff6fbe1f847df3e3fdffffff0f536add093086a2df11ed63655610b019b358f7de372e0c5a34c10f020f99fe01000000171600140f75286919fba0238020409c1e5f56f0f1eafef2fdffffff768a3e56f5eb95fe1b9663c592e7c3223eaa71e114495080d70a562afb1f08da0000000017160014623089fd381e970b53efa32ecffa40349ae8a45ffdffffffc956dc97be4fea0cd9a4282bc710a6f68a4a2ff6bb916f82f732304e60a6be0200000000171600140f75286919fba0238020409c1e5f56f0f1eafef2fdffffff60474afb9202e6f9df20f9a8df38ae86a6d17aa24caea10d0a0efeca52c206ea1200000017160014b33622217793e1ee12a5bb999d300908895b681efdffffffa6b8ada72f97946f61ddac2de354f44861aaeef18fcc70ad11e4ff145e0e227d0300000017160014b33622217793e1ee12a5bb999d300908895b681efdffffffd9c502b25fa2ef5d15e8c3eb789d3f68e7b01ef24a24c6d0ff8fab972b9e9d180000000017160014762b7427f76e42776a5d32fe0a14aa2ac61c36acfdffffff010c7461000000000017a9145b100f61604951359e393850ea1079ec493acbc08702473044022012606b40a5b6e57914b32900353f3f17c0e59c302f19a7d4b29b1e8518f55c6502204e919483a73a0d753b050aaabf65600a98573efca4972f1d21f3f67a56e1b44501210258283d77fe41e38ccc0b26b757430ce0d4551ebead58109455fc14b032c22a0b02473044022038995517faca6f69fde87d9e4e0e895b1bace7cbdff25c967d44146fb332174d02206765994e82ce615448ad18d553b0f0d4b05e2330914da1296ec661376303a82801210274883798656799bb59049df65e6d40e20ae2ac50e56be4fa7d9f7b5ec8aac9020247304402200a885040a0bf5d89018785778949a7e26550ff1feb9133b3607400e9c93356ed02203935964a8b95a64a43593b8a6a795441395c040a624d30adf4fde9a6b250ac6e012102a55cce9da7590c162a7b0f52e2c6c8e908fa0c6772644581762f9c6e3ab93159024730440220093792f3be4de7d708205599d857c04039ac7364731354d11718440090e26484022048af346a57c9dcb1401bd69403c42762276fc13d4acdf842dcc0747fde1c0c4e012102e7e41ddb876409a8a39e3db2369f71f451502e6f62c3f70ee3b400161001bad90247304402200c68ed040fad7b9a17c50c94709a1296569dd0afecb17c973e5811d8509f749c02200ba3b45df0f3a0c8c845ffe31de5729a94b6a336953a6ca12a81879ddbfd3692012103947228a5a970e8a5e02120e13c6fff12035d072fb51916e7c1d3af155f8c96b902473044022066b7138339aec59975cf031e07aebc3d3185d95740500ab8a389348a1549b1d1022050c59deccc1ef5006083fbbebee6edeed139a9ff0e8d5b583316e941a75696df012103947228a5a970e8a5e02120e13c6fff12035d072fb51916e7c1d3af155f8c96b90247304402202525672d9f5b4fec16b1657915b821371b960fef3d43bd9ba31aa587f2c3ef2e02202cc9db552e48eee03f04ea195ce5ba02db338dcadc869c83c30d9c2a133bad9c012103dd39b395eae4f4199d63263ea7499b101c0b50cd0a6a85e25ca907b51b2cf53f0247304402206ea3111eb9ec6f7eec2487f5d68b38f7ef7727e81a7e0de6f73b298184a0644202203fb84e8de89830f3cf64831e485deaabcd12d7ed4cde493e40c306162dbbeb7c012103ee61f91d39335fcf70117d81806d1fe2054807cab2cb12a470e3cc8cbaa9759d024730440220133bd6f37ca73ebf682d1f0bed03ae51b701163ee626cf1b8407c12fd86f2b2e022046bc44703654387e9e4a7980e199693c78dad8d51ae45cb074a2f14dd7fd0045012103dd39b395eae4f4199d63263ea7499b101c0b50cd0a6a85e25ca907b51b2cf53f0247304402200c99ec76ef078a89607ac28cb4c4a932f13fac65eeb3bc2e03cca95f58db42a3022044c9227f9aeb7c867fbddc8e870d75fa26d73469d51e917cf4126c044c04c0cf01210283f7e11769960c746d60008fdc41fd3df4f1f443a8c2ad406cf895c1510c66fc024730440220504eb5c434f365eff2cfd625be79df995e6080913729bf5c1f55bc38a9d6558002201b7d5362301e508cbdf35f401c39133101e8becb234b8e7f1bf21cf14b745c5d01210283f7e11769960c746d60008fdc41fd3df4f1f443a8c2ad406cf895c1510c66fc02473044022050162468221aac62b6dd42c71453a261e7ec09c3e8614c54b80b171d1fa884e502206f2dedff41f64a6fba63e89786d075989eb2368796a8b193f5dcbaa78a002feb012102a55cce9da7590c162a7b0f52e2c6c8e908fa0c6772644581762f9c6e3ab9315948a00a000100000005346859552873e4c02c7e8cc2f0c753f140545a5fa5c6ddbfec51bc7891794a38000000006a47304402202e9a231354f24dda33040b7ed5a9bbfe72a1e4aa7480c18a237e87f196e0345f0220484e063665c641db4125878ce154576f93389bc08a8de13145dc38c326b7891801210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffffc6d9674847535bf66e97d4fcd7c164ec15330db5a096b9607b6b3885b8e0515c000000006b4830450221008d589361ef8afaf9db386d62bfad75d77c6fe7c6fdfe4d6ad6b5d6937299ee1102201ade8ba945e892bb9b72f031a9d46f3e2054ecbfe95c30d39a2f19558b3e301a01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffff8b903329238a14fce44cccb460b036b1308daef517b4de3354e5ba125955c864000000006b483045022100bdad92feccad170808b6a2b52f3880530583856fb1837a905cead1740009bccb0220599dae494c84f56b73996e26c834336770b5a40b995249d973254b64001e757d01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffffe79cb842cd860ae9768c80e87fd697591d1ccb9cb6e75d4b38f1f4454ec4f03c000000006b483045022100bb89690691a332487e64e4cc644a99607b89389090376063bcb7f6429e706bce02201993ff544920814e4edeafc38cb62f71ba52557c66639fc5171682c0960747fe01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffffae2ce446b431b73166be4bf4aa53001561af91f5c03d774fe7b445470d627e81010000006b4830450221009e3a0680150eaec1c15b24f0416da49f5ca72934c7465f8ddd4881e66d9d413302207f8c8fba4c929fa964f947e802ab619dbce9e9b738f10aed09c5359367347b7f01210214d02103200e3ef9bd98f5c5605db4a0007f609fd56117bc33f6e0a484c615d7ffffffff01d47c1300000000001976a914a16b391d6ff57f7f310dc92abd489166e6996e9788ac0000000001000000000101dbc9ca5b89911e65b7bf98f5efb0ce78c4de3b0dff370daffae85f875e7793060000000023220020499d4f65c617eea9b88c366e97d95cf9a9239c6cbf0bb8fab38a6769f02e0a13ffffffff03e03913000000000017a914f201eb110c1563a4a1293ced5c2f7ab29b1cd58087bd1e30020000000017a91492922df4fe14ffbfba3d98711be19962ecf4bb0687f05c03000000000017a9143203718d5932ff7a7450920d0dcc0fc9d000573a870400483045022100ac95a3ba87047f81c802ea3b58e71218c8ff1facee253d52ab23eba0181990bb02202a8477693fd346d0cea6ebd85a16fce8feae8a7d95c865c7a9a8bc42df0cb1a001473044022028ffa8b69f5f03144a0153d20ea31f76ca828fd557bac34ae7cd5ddcfc93de3a02202e683cbc3a0b840e7d2c2ec306573477934cbbc36c05a5a03d3b30bd665281f60169522102bba27c50001ca9b8ae3853576f8c3d1ebefe942492204456aefe4d06940a6a5e2102c96982a6507daee7f40eaeba89ff0eeb18a86f806433a7ba4daa927039b254ec2102de5cd5e44b3b12784ce51b8f86bc67a6f8616ac2ec3994926ec903e9665bcf3f53ae0000000001000000000101dbc9ca5b89911e65b7bf98f5efb0ce78c4de3b0dff370daffae85f875e7793060100000023220020cf24513cc07b6782e6b03c34102568b057842ff97c4eb420f7d8723bbae054d5ffffffff03dcfa05000000000017a914b63d07b8ba18addb9424fcb91b6ab94066c8298287082cf2000000000017a9143586c9bfeb383d7056912a96ac35aedb1b3eaba0878c5c03000000000017a9149f9970629507c4f00436ad38e07b4e9ad665b5e4870400483045022100c63e2c590a3d5697868d597feb472007d6ba931e9c6d45567753a9e08e0ce87302204a4781253ff6c36e5abecc9a274f1193a98f25d4a2cfd253349d2d372ed369c8014730440220398a52db4801c0b4f6a75f97403eed37df04fa8f13199a5886aa3a692af7dd3a02200dbdecfcfa832cf5763ba1f76e4dd10d639c6c7f2f61f9a54ccc0761c6a5137e0169522102c9afd6672bf14962a03789600ab22699e7fd78d7164226d3b6debb9cb6824fd4210288fa22bf781ac2355343eb6ccfff143187e363bd099694857927072cedc7eb0c2102477320e4a45c6e49ccf75c91eef0eeae69968b25c7eb0bfb901d46fec263a79e53ae0000000002000000000101d1dd66715fcd59054d79cb24024ff2d0cad2beb2087bd06dfc94fbff8c3e172e0000000000ffffffff0d840701000000000017a91455884e731db8b151b499bb756e5f5ced86751bf38758db080000000000160014b4bee49d3a811db368383d64585fdc96db438144b9e401000000000017a9146af89b4e3d4385000228412c8d568c63681434e2870ea901000000000017a91497f25a9dd30ecbc98457019178000cd54960a76287d0bf0b000000000017a9147933c84464ea6fea532baa859021d951cf94470f877619000000000000160014fea8b777933ddd1e315e55a3dc2a495cd35e98c9113e02000000000017a914e587e0b80955f4e2ae6f9b65654faa4ab4dffc8e87e44401000000000017a914f72b76a01b4a59a8317baea62ed7f7fdd285e4ec870a3e0100000000001976a9140fb83be1a0a1470d7380554ab756a6f6bb44c92788ac91cbe00700000000160014081d9dd0179e6f9f49dfafcfc830ed0c1c5818f77d240100000000001976a9140fc234a65eb0a65e28aa2276e6fd2a43d9b8759688ac926701000000000017a91411a998f548751a1c6d32c743e1249df0f69ccb0f87006200000000000017a914a82e8e06029d22dbcf3fb3a5bedd296ca7d2a6aa8702473044022074b60562b1545656486d59872ab3425d17db003bf12e4d64f60c0d32eeeccd1c022032968fdd2691efb3ff803d4c1e972651446aaad2b08e68fa51ed00e311e8e914012103fb2e6bb271869bca5e19ef55e3120872cbf76932c23be7027f5e17ede2e1c8b60000000002000000000101412fd3f3d92cc2100f624d1da7925cb9c14214f2ed8398381813822e57bf348e0100000000ffffffff029cc403000000000017a914747d24a92496a32a3837a637860d944ce3782231877212050000000000160014d9dadc106b68ec1ba7705220202c228d6cd765d6024830450221008c3cd2509ac27ef3ab02584a46bde5da56d6f4a2cd3666cf28f0f75e986474ee02202138a686296ab381bf49329eaa3339fb5b74523c52c8ec66970710c685d7df1b01210308e0fc5dc8e585707d3cca0cb32f3b2ddc5b25a5c1659e8ac9dfa6ae459011cb00000000020000000001015b285151e2929a82ff56b2d688c99c9ff5e1413ac92823e39819560421ce2ae90100000000feffffff15e8740200000000001976a9143d50a817a679d132b3499563bd541c12624c9a1e88ac20342800000000001976a91440fadcea38b6722f71050bad7db4d9d8d15c269c88ac90bd4800000000001976a9145be8e9ff9d91b40c0d44c0cd2ec9129a927f026c88ac7e8a0b00000000001976a9147b27f595f47bdf05a0ebd1be1730580b6a07c10b88acbdf80702000000001976a914b75ba832fad08dc9e36ec81e2b15ec5cd2d910fb88acac091a000000000017a91406b5334e4ffbb1718314d167c71f8e5556bdeeed8782c815000000000017a91427116d63b116f4c6ec2a0b6c0b3724e03e2846aa87da9201000000000017a9149abe89703bad354cb12864f6b1792b2688a64d5d877df20f000000000017a914adf936466d7a8d804242f6dfa624a4532e1308d6878cf728000000000017a914b2845ce2320aeae06c557ff200979d8dfd0e99a987e88e01000000000017a914c5f9c78ff2d4bf38f0e7f4d91e71942c3d1be0d6875ece01000000000017a914ca4e9c42bffcd3861aaf7c03d443b216cb1316ab87365e03000000000017a914da2677514704b5a2a38b9b52873656dbbcf212a087d65411000000000017a914dfd6ddc6992af459501e7052439b0b143b8c12be87a31f7a020000000017a914e91b7c9d4f035d71022841dfa753458be75c78eb87100d09000000000017a914e93b4b772a9d882f09c61291a37cb810be670bdc876ebdcb2c0000000016001436a86c185a6a608ca915cf723c8f10fdcf126b4e173e10000000000017a914ebcf8c512683c4590fdb4334a09b7b196293487b874054890000000000160014780e3ab3583d951f9a01c5939a086e0594644062a0860100000000001600146e7dfae2164f2024d8a4ecce684dc4316c6e4020a760dd0000000000160014c993323b0feca3e891ebb9ba53b199883746df890247304402206afe0b74dfdc392bb93062b3f02a88ed314c289287cae21f211fec9f13e0d634022043b7f501b1c62d9af32feb5a443db2efe76a2edeb3795e88d17b4b196d081ecd012103a2754ee799e77673f8eca18c45c2ace92e9bcd9bfd8d1386d715b6e932b831490000000002000000000101e7698f8c59cf8d8d3d8bc3b70b16f914effd4a0b90da686af356f83fb85eb7331400000000feffffff01c95cdd0000000000160014897658e9da1fa0c9bba4ce204b8f004a081bdbea02473044022011161d0afa1a8b50dad438ad3fad30c6cc847b4e6f8bbf0948c0918f19f2de9202202cbd1afe546c4f10740653a63a42da81aad6f1d5e73cf840bec13d4d83749d1a0121020410ff3beb589eeca2e621450fcb3c82a7cef44c32f726afdd2583b0b85cca6d48a00a0002000000010b947e148e2dadb957a1940782f90be211f9a51fee6f8b44d14e6f29beee0009010000008a473044022076d94025c2c7b1f6aa23f41d4b60824458412ac64c03e351c9616fdae86021670220588dcd641379dcb327bac18bd3ba22f79947d090c25a1906f20d783c6e2c6fb101410470584e87f314924f00c5ca78dd0d7147a3d125135f0a9f89eaf5615fcd1899f0cec436790e08c3947b07b36039bb36e6e1283e39459242d48249c4e5fbc6de7effffffff02fd9a1f000000000017a91468f77701129e4297e248559360c04d990ee30a968745e79912000000001976a9147711eab6ffcc99e4376ac39f4022de413e1ea2a988ac0000000001000000000101da9f5bbcf8bbdc020a50f3a9d808019589648ccd58f2a3e9abff63042c2ea54d0100000000ffffffff0280682b00000000001600146b933e923981c979eca1c4fd97593a19c2e91d426e0423000000000017a91438e286d910bf4dfabc4d6b8eb696a94c20e9a8d48702483045022100deabeca2134edd83646d9ff1bbfce84f0ddc1052a26757056ef36cd9881fb671022036fef4dcfd7150620495fb27055f651629d647c5136cbdf61b440a06c629f33b0121029bf0a272a6cd418f6c6a31b4bb022f864ab6732d5c2211c71d7d88f8fd9bc0090000000001000000015b5cbfda929751f5dff9a85cc41d812af7d4c88a36db7b9aec083fdbf7094184170000006b483045022100fa4349817e6503c00f3525238a8c1217b69c93f073f24aa50e1b3ea04eb83ed002204417a0a4c6796b54ff87ab3c4e6db1950529f5e17964febbeea7d1ac1525fbe3012102fb624ccf98ce3aab4b9f09246f14c8e3e0ccee5ab1949603026a3ce4a5f39727ffffffff01e7d97b00000000001976a914733a28cc8dcc0f4deb05628055eccab29fd1460d88ac000000000100000001b835eb03d6d236f8e5ba22b8cfce8ddf519db23a8f0b109f71c3bfff7584d8410a0000006b483045022100ef91198aa98d43c304de633cfd7c2a498d48580daa76375eacfacf53b8cb199e02201f29f5992339e7768e595744fe6a930eb3016249f1cfc7d2ad12b98402cd39ce0121039c36348f8f859dbf3fbd467291a65ce1e19e06af8f9f8b425460b5bb3844219affffffff0132a90400000000001976a91408cc5363bda70acfcfb89a861afb2ddbc0541de688ac0000000001000000012817ff4544c8ca4996efb55d9413b8ae6cb4e81dd01e6480aa879f65d23a11c3000000006b483045022100b26cf0f069ae056eb194da774edfbf4fa358e0a4e3a37991eeab81223f8e187102207646e9136ae3b9e6d8519d6e0a6b3e16450a72bc9c2676e31a8261c235e1f9110121030fb004e97fdf10a8bf142b7b2748203918915d5182dc0ef028232a19122fadfeffffffff0168b10f00000000001976a914dee944ced2049c35d320dd667ed2a9244d40bbe088ac0000000001000000019530eb079242b3a3b4b03d43d38ac54d7cddb1bea9c242375aa7fba01a897790010000006b483045022100ef647726e4c7648fe742307f42ce8d80e13a1a6d26cb602888043c15fb86223402201dca44ccecd8f251b369a857ea039fce7d516765f57e07c974aef8e9102b2adb0121031fe1be76bbc57622da89612fa9ccdedb0198119fa648125fea38437621f08803ffffffff015f650800000000001976a914c5b45d4d94bc03254d1598013a2637cc24b714bb88ac0000000001000000011794c293e8cf2b67c94897c28d9ca1f49a755a01a43569d2117505944334b2d9200000006b483045022100fd707c3f0be79f05f793e22c52c508f56b0e0879c567283e43720bded94f6dde022052f36f5d306d2d06755eca91b6b4f5e66a6541dc9021d0389d8446bfe459eab0012103a8fa8acd8a938beda77593ef222d8044a602adf1e3dba9d88530691f511f074affffffff01a73f0d00000000001976a914d2df08b1ca1ed78f5d22db384125f231dc8f205d88ac000000000100000000010273f41f46e0b273513a37afec5e502a0d51be2eabc29f16b13adbe42de7ecd3e24a0000006b483045022100ac0143d05ccba4a5d5b1eca63f14f47538a75e3eb21af7afc693a8ea71ac9caf02206cba4980d5a0fe56cb58c244dbad572fdbb8cef2486fca59610f0f8de0e0cc000121031337f965221cebdfc853887dcb2be2a42b176af64e94242c3acd7b19fb6de922ffffffff0cf4422b47ceb02af122483e7362426d22bf67dfd81e41ee95555aae492fdba00000000000ffffffff02f8f30400000000001600141e0d5575e66d6f5f9797101daa11aa5ee9ba5e0357f90300000000001976a9143bf5d8ae2c1444ff42d426dd353a7d69498ecaee88ac0002473044022069b213e09439b549d37e97fc8edd59c3548d0db47085ed11d22086d272bb7d7e02204976b7d4a0001c106f1d97cca9195c1ca540896ea4d76fb0788fadda1dfc66c2012103077f609e1d3645b1fd0f55604be1346b8eb8e47cae052ff4fce3bbf9aca1667800000000010000000001010eff0f98307cdf0199ec9f600b16c1e22c48f8b92e3ac88b3fd8ea21c788887b01000000232200209cc6c05ceeca7822be85a21892fbb3425fdc155e72113ec1152e87327b49655fffffffff04706f0200000000001976a9145948869499b7a1ded47169d7d7e87ce386c520a888ac605b03000000000017a914c84c85cb9c0ecc9761f830843db08ae3dccc1fc087977b79000000000017a914094edc2db0bfc156ff482b09d9ee04e4aecf854c8738c101000000000017a91444c9b9d14f118931c6df759527020584ef070f9487040047304402202afa24eea4d2494607eaa83a7779b7b92fc69e8de464f4cb66a0ba2ec0b016ef02202896a5b3cf90516acdc15e1bdb423649b50c1c9003ed438e0f9bd81395e052890147304402202c9ca94f54a102bd8b9407b989fc209c33e971c5123f3ed02bdd05b5e2c7a0d0022068600db6b5b09fe71ded9362a1138f57d33c8b03de3f7096955810263d9f4a7301695221030cafe1eabd049f319b2b244287c0a3ab576122d02f78c926507135588c80b511210373aaad6a9fa9f2f475e8872c79a912219fb88382fa66bdec826c465d6235b90621025b94ed6f4f4f786d784db7ebe5aecd888932a06974ea57be2fe494b1a44b335a53ae000000000100000000010185005b6217e06629e1a6c8d849919587c626368455d4276324eafb963991364e0000000023220020d83a80a331943ce2ff466de9659617a7a37db540ca11004d39e7f1cf267d6415ffffffff04f06df6000000000017a914659c7c094b869a021879369b89f7b08c6698f73d87fb6850020000000017a914137a9186a1c67047fc6b851766c04015b3bab8d08770110100000000001976a9140a21366bda422e36b8b31fd502f0b4bc3847285e88acd09b88010000000017a914a461071457950d00887c9ae91c7d1352ae7b1d958704004730440220593b76d10ab1144a426abc7e21f6b488efada535c295212a0ac85ed552066cf3022077c9c534d35d76e6d29aa22c52cdc54524e279da9959376c8b727232f31f0f49014730440220589ef629378f2b017b8435c69d50bfb8fb75d2760ac8b1c21da1b0b2b25e620c02206f4aaaaf547a60430f8cee4c967304ebcf7345080abaaa19d5441faa1f2502a10169522103dc9c353d1177f92b93521dd57d66617a667b8f67e8f89dae282e0c650cb919d421024d10382771648c8d423d9307e1ca783813535563192eb26131fe49b5f7037fe021039ef3a7fcb2ed205fe3823dd6883e19ea41aa6cf7197a28b0d3882cd8a630c9eb53ae000000000100000000010150061bd1ee6894098a266244584c304939c3076b3a776a0101792ed77c0505de0000000000ffffffff0200141e000000000016001408fbae5b982050ff18ba09dbcf7f1d2df8e1335ca9b002000000000017a91489f292aeffa39ee561b12bb4f0fce0296c3165bd8702483045022100ae47f6364e702249be4ebbe7551d09b0bfce5a3776a33bd9773098e210068dba0220548259a3af23e74cd1b2ec1fcd195cb8b63074150a3bd2c5436e75c90420aa550121023fe803cafa46b6adf147e8c448a3f69f55bb1de5a8a539cdc67537f0f599fbe40000000001000000000109b4e33a7174cd5709536c848e6794d67193ad4124af283396fad9f7750ea1130500000000232200209b351a0dbaa37cd0dd378440a841b92b25c1c1bddbc5f09aebbfe86f67b4a06bffffffffe8ea3eb15510090c61aa0731843b5f9f41f9d2fc05ae665e171baf7279e71d3700000000232200204967096f1268c42a5872fd11dbb7ad78d484beee616ec3a550e4c45a9563af2effffffff7a04123dd9193e86e3e11406178b3083c2d39a56f19a93bc01ed49831083ab510100000023220020200bfcc885fcb75e8735634d0368142573787ad20561990e2c77de5335e9dd97ffffffff2e3a9de44906509e6f787bcf84e040f5a7be36e222652b16d484d0d4937a815600000000232200203e45a571bb765022ed7566e4bed5778af9d2279c9e5fce1f6835477b71291eceffffffffc0c65978efd46fe2c0285a5a908173757bdfb6961127a1365030b0612b2b205e000000002322002036e0fcbfbdb3eee1833ee67fb997d82fe4680cebb4620a200f0fbbb04d4895b9ffffffffd58f1c88ea1b235e4185793d4a4c00300ef9e53534b979859d199e83c92cb27c0000000023220020b43aebe3f45b17a1eed26e2e4eecfe00ae6d8b6623ec31043db1b9330a65040ffffffffff00f8f83f2697c6fb535a46aa94456d21d3e8898f3ff3d00071a5690920af28b0000000023220020af54f0572a64a498d67e2ba1fcac3776d5d7e84a2755a0e530a7fb5bdc899133ffffffff6e7c7c2398b6ea016dd34706ea543682661e770328886d8f519630d04d170c9c0c00000023220020a383437a2da1cce6c4fcc111435a3cc01df405c9d9b120389b20c3a93405d5faffffffffed848ce06321ae0e97fe06715044db0bc23770df6217205bf0215bd7a9f09ae600000000fc00473044022021c4621ffe8f81811e2c2b115e3f4adbbfd1bf070fb0cb81bd3c0e2c36b5984402205ff711395eafb1fb26cadd9b93303c9c8ad9292ba0286ad8c0e448bf669085590147304402205d18bb04618b2860d967f16aa1f6417dd48cca8518a673ef99b4cebb3cf2edb4022032ece68ae8a623a31af4459c7e87c177447e749ffb3b1212b3639f926429b3f9014c69522102c462329aac15fdb8188242ac3fb69e79fbc7423933f3277490b9f88471479f7721026504ac9ade1466e7580ef1451bfbe21f83c8d1b82b715462ad2d49422d4e08112102cefd09b040c1abbb1cd9049985063fcdacae7b0b14576cc6af005535668f372553aeffffffff05d35c0000000000001976a9140c78482318febd6308ad262f978aa9b5be3155e688ac54f01700000000001976a914d9c969dfe624ca93554e2e020f4833db9d1b062288ac253f1f00000000001600147879c46dd1529947ff8be21a24f359bf5bc5bc4534b92100000000001976a914784c6b6924ea78396be44665ebdbea41fa0df7ad88ac8d946500000000001976a914d05d3c01d9963d5efc92fd8441c0cc6265acf00d88ac040047304402205159a5037fa17382563e213ad526d839de278ba67bfb4bf9ad89637a612a7ef302205b84b9f43425dd67ddc2fe66b6c0a8449694e1bf1d429dbb7a6924589700adbd01473044022015c8285d3638e58167d48363aa2c70f9b74e281a82fbb4fbb8d58412cc1ada3c022029fcd075728ca9c1c13d4712f0cba38cb16927a8bd8a6800c20ec639f3432caf01695221028dd660c0f2c4e704d389d61dcb95bf8c287b76b2604ca712bdd5f2a6701c29fe210332091d800577392922d5ffd66ec8818cbf89f11fa521c3951fda8f735ef35dfb21029ec05ca59a695c2affc803d52d491cb9a58e25f6e96de116f21fa76dd75acca753ae040048304502210084ee76a8fcbca98e29a904674a8ec2d86189512b488ee040b21d7adf2fd2941502200cdf4b5660ff6e7e8c2fd79c440498a11333f377fcf857e80ab749ab9fd065ff0147304402203cc47a339966c80506ae114e826da643e0d763815c597f17ce4438be0fb3f53e02205cdcf44e160d9be8bc801f996f3a83d0c066d1b92b0f36701b39ff75e4ce412b01695221028751c9c5159da76ea72918080e922e389c0792113e0b966f62f9c6fa17bd670e2103ea7a9217e96a94e0730dbcf95786c636804bca7d225bdbbe462928bba6f883992102f40ed502d0c7bb7bab14c63d03eb5d11aaeb8f05b1445cf832d837ddef0f07e953ae04004730440220461ad1b069398e80b5100a265490eebd4d849aba3d7643a8335171f4342f161302204fbcd28a398cb12b89915e8d63ba0ac30a29099879c1a039f9e4209b02ae61890147304402204ebfeb986339d7eaae23ba21b490793fd92b4b3effa2f58521858a0e633e1d1702203bb52eeb01f1fe6842330f7b3e3c86e97ee6b66152e4c665b45d6aac30d62e0d016952210254055e16afddfea2eeb5efae61e13479cbfda6a52adabbe57c694d271c539a672102df699aca3671c3c3a32b40f6ebaeb87e8395dc4024a2159952881f022960a1ac2103864a303319d9909da3a4501cbf8f127d77797a6ca251a36dba0e3985b94dca7553ae0400483045022100d334179777368b3b4b188f0bf4d78f8a2f3453b87b66d42c6e0ec370469673e002201ea9484eac02fe2fa6fb457d39455863e51dd8d42f340205900751dac5a4801c01473044022010b4b4a564eab9b97e3967b0fae2214bd6c0bd7cbe1b5c400a4624579055580f02207759af37a9960eee260b4b57280c65855cb20ea0f12828dbca6fdcdc85fde9bc01695221037b0dbf71cf858629299d8183382042b8a47cf959dc26039eff358ba5dc6828af2103e04a8b9a8aa4d3dd2a7ffab9348d9cf7561b335f4a75caa722ba28c7285d393e2102cef1e935e349df5b87db6bf490d263df09f46fe743445deb0d62302e541b0f3b53ae04004830450221008ad25a337ea59509d670113fa8aca7299bdfa1ac189d4e529a4851550b3ff81f02203d562a3cea7156973a8138159e07e5014f883a3cfcc5ce38e68aead396cf9d63014730440220363dc28bf7ca3ea905bffefb689ab602728d185eb915b5b232a46b127c8bb0b602203d14dd55c6d80bab2cce6db13caad6b7796a3871b7be6c4ceaee573d47d113440169522103812974706972a2024f54752062981f04d8651ce3cdf24aeab02517b6473ae01221020914a80ac7c923431bd50a7a08155a86b67b5120e80c23f89e357f23f4055e742102b7504e12f181eb0dfad37120a6a1ccaed76599d3460b3ae988940f4a055cd88153ae0400483045022100a52f5045676ff5064bba7b06f21a7c506c158e832797d20318047fd497ed72a702207c4e7a5e12e91981488a372fa3325b38f693de86eee87fd0d3aaa183ec63ea4d01473044022077c954c1e8e3259b820d44679792d7f54fa1d979553f8cfbda61ba6ebfcf10fa02205d5c83848c5acd0967113e912c51f4ddf8a1402ed50030f1c51152233d643b9d0169522103ffd1fe0d0f85c9a5943f7d55264c9d032cf17acb27510d36bff8342b7cd7a8ab210318c13fa4f409f6aff604c5f0e8a84c71ba131ccfa0a2b6c6afdb2f3a01b4651921024bc8335f31d4762ae1f62fcf6f3151f5984b264d9ea4882195e0f093ccf05e3f53ae0400483045022100e6cb052a17d5ce8310d82f904734b31479e271f548a2b549889cc80f3f50212602207acf1ebad8f6a71887ccc6d877ee98fc137baadbad3aac6e702c8619bb4c199f01473044022009941f302fb9960f72edb4a30b7c6700208895ede8e52eee5117fb87738365de022045b49490d8c6a2f7f1327d64ecae334ac7e3409bb05be529ee2023e3e64f09800169522102db0e76164f08b340428bcf954c7b08a3e4f4606b989a12d39ecc1810d02fff062102a8a8a4bfe8a289dca53036906c7862b81ea63dd942b3552376f5322a7197965d21034b8814bc9a99bd4fb8b96d5cb97d2e50dbaff2911a6dc86117635bfcbceb813c53ae0400483045022100fbe610edafe8583efb5d55e1e76a4df2627f5e7e89a456ff9e2524d471bb73c302203e2d083cfc88a6b7736a54c0ee348ad5bf400e8f6c128056beb13c9167f17ed50147304402203e4b3d685ffc14612a235a1ace437eb698df1b9d677faeee14d3dfad7ac265fe02202bf458c8746f0d1daa4aea3a22a9e78c708c7abde540a0233d4666ef69bfe75f01695221038364510832967d6df06db292dc780a552a372cd8b4e200b6e1ce12ce71c837022103441edcffe58b1ac25156c1e71c7d47af59e4dc3af7522bef1df305528a2f5d50210349d771fce35fc962ac6d050fc85464936c9beff3c71ef46b01e449a717223f8753ae0047a00a0001000000000101552873bde52391cf1893802e6b1221ec05ddfb715467a8890a5161f666e7799800000000232200209807d96a45153145fae3f713a82fb1b8986d876951e9e8fe9f552e86d8db35d7ffffffff02941100000000000017a914c982030cf0b7d3307630a5c3326e4d037283d813871c9b00020000000017a914a1cdf97093f8911dbdf016205cfe1e032b14bfdf870400483045022100c9057cecda06cdaf921a7e64a479043247aa518e9b08a895736e7c8abff4466002205e71e0e7a20fc1d9001be6833b6023d7e6381434a00b70afb76d1b6fdf2c92ca01473044022021835367b874fdfe0dc8f89aa550a39514af082dba9ef068d537ad8ec271ab120220482013ea64e9e136680d4f2ab0ab219bf6b44650468f4f21c7c93a42a0001bed0169522103e536ba13ea8128603eeaa2f4b667e1befeb8dd4f04c04c0eeec7cc95b8b29ab22103a707c83e29ef69ae8c6ff4e499ead14cccd1738585de2961bb246c6deb140f592103e7a069c004a3718cd7d0891419fa9f9156b40ad49183d5e269f262d4fbe4236e53ae000000000100000000010151a871b00ff221dff46f9590940b4ea2114425730d3871f18ae036088a54b2c70400000023220020246c196064d0ddda955d6baa6aab45a09265242517cf11dc7a2a341ab0a5dd9fffffffff02b00a27000000000017a914f2196ff5da9a9f2de365b4aaa8013380ee610de18780e7bd020000000017a9149d1e59c0490deadaf3495f58494db96b4930008687040047304402203c5e72ce2b616d3a383f5c97b94c26cb2f2ed051ada126d276a1911c1685cfe402201b3e7aa36297af77d1d65c6e7c3929bffff7e070700437d42bc94e099cf7085b01473044022021d03be2baa2fa673bb54c92c9739a5e2330373b41f5c5648eaddc13a0be8d0b02207ac88a81a0a548f332fe1b6d9bc04e11b02a70620e1373b84a2d7e50531bd87401695221035a04cea4c13994d0ca323a9db2045b9287ebc5da6446cb19c803caf3e1636dc921028d4c6631ceab1ca51a8729142ceeccc45aacd41b968097f183580b3616b302912102e367da4c8e71e1afbad7b170b81e8c72ed9e232c22b93c8b06000e12b562e34353ae000000000100000000010134cb38d00f7105e3d589911f3f299507cccf6ec10dec953c2b13dcc6c47cf5950000000023220020bbeb9dd65d1a4f1c48d472fd15e2a6109f3b3a361d86ff79beab73d70497c92affffffff02904106000000000017a914161261e9447615efc2312132886528f0b98fb9ad8776be19000000000017a914b31e176d6536b2f474602308be6e4ccc1e408360870400483045022100a4a20ea72088aebd51a0bb2dc6f125a3ee34043157d7ff373949c5043279d69b0220240bbcc44880e741f87358ca72d8ca7a74746d51c58e3c03720304e8d135ac61014730440220209d88b84ae430c33e4da4db79e6d5f5ec3d065d3381cc1d18169a690003a6aa02201c6e58a8c7af2302aec2c69da1423426ca7b2fe5675f55cc1db989b005c806430169522103f1e33f309f7095835941b1d83fa3b8f3081a3cf36548e06b87ec627be11c5cc02103b8ea32eae82c3366901d2ecd03949934b0fc6644b1f31be8c8d665473a04f13b2103c2ad7761b96a5c390746e388a6480138ebb90ccdc8acfa7e35264c441536321253ae0000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb247604230100000023220020d4f481035fc1acd7359027a013aa92006cbeb010b87a3b021ba8941d7cc0093bffffffff02786900000000000017a914879c6a1213771a9f7479d5422840e6cf9117e5578738cab1000000000017a914133eb9a71268210a6a21f4827db9bae2678a1a03870400483045022100ec68998c93d553789278e28cf55d2758054ff455bbefae0a2c6ff66d184cd8cf0220111c24385bbc6636650cc6b1f9da393c3ee5f954bbe2a2d4a40995ad71000f2301473044022021cdb7c7b854cc96398371e8d7a3fb1d1ff3f4e3d4c3da107b9b365c7693928802200ded1ffd76e305374c912d0d017e32112e711f6cb3314a657bdab5701713124c01695221022c4006b4e2de1fd3a7ed161a8e8528afc519fb04152210e3cb4e01c1de0959162103a1d8dcccffe49db36260249e37f4e20623bc5bdce4219c9fe25115ce2b5f2f532102324487180cad71cc0a138d87516f7c0f9e72fed808bac710625ba6ba122cd81f53ae000000000100000000010157e580eeaea2ab8adbafb48ceebf4cf0cff2f403f09024a6ea0f1a07042513f6020000002322002005011ca05096d5485369b11ee01e70e8a2672294da8db3269f61d0a1745a6d15ffffffff02f21e9d000000000017a9144b1d64cc5d928d1ab95bd920db07f341ac77b1d187a0b612000000000017a914e190d6297e4f28cc301a37f055b14ab1432274ec870400483045022100f0cbd3b8df89124651b6bfc1b0972793a67c507de4634ec3d7bfae70cfd41be402205a0f69c096ccd6eae220c99f005f79b4e9517c8d463c05eca6e358e65dc08286014730440220583d899d3c38a18a3e2cf627943b421adb9093907cad42d513210e5b059b3427022053b03be52b57a64c7f66f52755d9ebb0aad39bf5824dab6cb7fef688a536593c0169522103386344cbb6040e6e417b60d8108a03fef2eca96aaadadfb15158c50d62dccede2102f417fc2043915a9bb4be595b79516a2e086e104571e2805e5585341d6c99d25421027154162fc8837b21772b7200ef7bbcc859fb8d78a576dc991df228b71167778753ae0000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb2476042302000000232200201901234fe621b868f3ec44a9b28e3712543c46f3bf041bfd3681d0208b7239a0ffffffff02b000f9000000000017a91494298e0eeac83ec3432d68881516f261b4c6d4278720120a000000000017a914602f9d4d6ff6ec8186d5fe39cb82962fb62c350b870400483045022100f55fedcbb0ba3a6d730f2af49eac39d2e5869ed9e131a6f5951c4112d2df2a45022056e054183a4aaecb0c777f45ae844cfe3b21293d419ffb88d13cae6e01e00bc20147304402202df0d57db249be7e758ee84eb16f72e9db2b623ce21a0b1e0c28c991954222070220468409fa322de37868d09ef58d24d199aa828269a885e5beb10abd300656f7e0016952210205b54600c1ef742fe47e9df98dd2cb0d06c8ccd97d15a6b49dae2e7d1bab0f1c2103b805287e5d01ec1a81e1a20140dff6aea35d643f86d1bb32ad5b3a169c896dce2102733acf49cbff93cc785699655db6a85d9aae0589d1b8931be1452e07fccc871a53ae00000000010000000001015c2a24c159c33727ab7aeb70a240b76bc8a935aed306de4a8374759ae18b22ab01000000232200209a69e7a9ceceeff94f668182f89e803818b0d32a20bcbf37ed55615f57d44159ffffffff02a00a05000000000017a914ec8baeed346ab78e1f744e89af9c4cf61d1c746d87f095c0000000000017a9149996a32d81f5c980ff87f0a2854679c7480f8820870400483045022100ce748ee79f611c36a920d398f1f269d6835cb4603d61a621f840d82a8be2874f02206b34c2cc795ccc6c97d68f4ad2e7e086d12b77f579c886305cf8db0aa2a87c2f014730440220678246e1c37e0aac9f29088e2cd8fce5acb3b466c6c3475e7f320a08856ba33902203d4e350166d8073a66765d9618a0acf63ffc2792b63260c14fa65e3e09fe5f200169522102340e28b3a485e9583a5325e6f82bd2d457fb74f3a447456fd297917140185a7721033bb26dda61a05d27d86cb4fcd29c455a8e7aaa86fccef7f16763a32f9bb454932103705aa6a939a3415a79c590f9f2000acc0f788dde72ca30e399ea47f16012045353ae00000000010000000001035fb10c62dfb932486ab81c979167a03e5cff6a28f0069b62c2624366ed1238e9460000006b483045022100c29088b5ba75888e0af3ca8eea59aa26affad26484a06fa597d2a2b9d73428ff0220132fa96218da43b2529284dbdeaa07b4686484372f4c49e69efa6240383c53d10121026443ff8300c361cb8b9f0dbb67c61d13ef35d014b5ec5706e61a171fd6045b8dffffffffece5482e699ae1a59539ddc894d33ef43fd100ba5d8c1a7be962242775a765bb0100000000ffffffff2d13ded158001ce7c0e7ac4d0f995ac621cbfcbbc559c03bd451618df44562cb010000006a47304402204ca96d3d87f5ee757fcfec7eddda3630f09539dc1aab64b0deca1ddc82f992c9022009c3ab637f05908643f953170fd055d01c34729e07fa44b2c763daa40aeaed23012103c43b6b1a70e02f71f9a0413373e0c85ffa90d53c00d09e25e8fd6d2ba8dac08cffffffff023fa221000000000017a9143a2081f827b944613c1b8b129a4617c9dfc1dd248720e126000000000016001438c01ea700449b757c4199997846a64869390e450002483045022100e56ca33a928b360c27b599ce890232bfeab7b5edac84eab332bf08a33f99381902206a6561ad64da97302f8e2e838ad991312ab85e8c6500effde921515fddb1f8e3012103cca2b419cddbfb80a33156ca5a120dc5772472a3755bd1cc2574dd3b09ed951e000000000001000000000102d191d34a6fa841156920f8c3f71c06b56bdd07710cb51165363856dc8436bf1f0100000000ffffffff44a44b74e7c0c73d956d0c45c82c7052ebacee99aac33743ad6029c48f258af34b0000006a473044022059dfb10ee7281c7713785389e77f9973e287b7da00f460e2cf90eeb19e3cefcb02203a0216181ff2a38d844d3c16dd0899bdcd3097d22b2b8c889ace9567f14c7e400121031b1d543fae1b6ca9139534867cc3034f17bf1ff2f753db5ad0c136bf257e6918ffffffff02e87a32000000000017a9147ca3ac3300b6737173e2ce68e4b949ab9d8cc39f87d04c01000000000016001498a45acdf401734137ff773df2ff940467a9cd310247304402201369e8a56548c56873651be635145700dc6e7400335eb8e8e1269c752ca21d8b0220439de143171e139d7849323af494e7ae69f3ff9a734d0a613521ab1e1408f855012103909872d0c13defeec04ecf4361d0c6097b912343ba0f100531b503bb036c2325000000000002000000000106f66f7518b9f3f1fa7d09e4d02f9218b6d547c1ad1d07a4d37a2d2476934435ee01000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db27000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffffb4df74bbb59b9029b91765eb3dd4e7330124db06d6dbb027ad3408d27f87e4d301000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff460ffcd7b37628ca2f0e290e87f912f52243e613dcd03b201dd50fab41c5deb801000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff4fee593aa27c4d64fdf0ea81bbb30937ea736be90d4d92876dd7ac4809a4ebbb00000000171600147378cf392f7a3cf8076596f4a55a283b96046a33fdffffff908fd81c6a580d6ad11c52a38c6c39acf43eb283e01d169bfab882db019fe13a01000000171600141b9fa097890cbfdc0031aab4c39009fc1337eff2fdffffff01d4ba93000000000017a9147ef5c40d530ffeff15a7a94712d8c02003bfd7c58702473044022055f5756bc98112d092ede701a6f76b28dae075e2982b4309457f5056402c8604022061585742eef8adac9c40a4acbc9622a522d0fe5f87e6b3b3f4726a0a123697fc01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc7357611024730440220343f9a1e441d0e8662f39b2c9096cfbfea03c7b8bfd285e3d205cbf1cc1ca55e02201d2fdd4951b7b245a382bc6f19aece45e08b1530c2eca0064bb55f729ee016f501210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc73576110247304402207f47aedf79963e003935f1d35d9183868f51e26ee52f540ff5a297a8adcc0eaa02203cc9f03fcdea24fa0f9a05c0d61584f2c47d915a4c3b18b59595cd0d331c9c2c01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc73576110247304402200a3bdabba1ff5f1b0e87dd40f87c9abca77fc1a1f0d2ef37a82be6203c71ae2402203b5488929f9ec3cf0d129e50fa09f00dae2b46867d3a1b134e255fea9cc919ec01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc73576110247304402203033e4bc7158c8ae712f22b44b4d6033c27542d24007af52ecc312ff5d59c9ac022014cd1823414d48811bd68946994c75159659e5bda2b76a649c5f984b648d3b6f012103574ad16605907302a222e1c8bd9ae97b9095035f104ed6472372c349009cfcea02473044022049e6c695398deb58586f2d597e44bd0fa953331bdd6f5ba55d1c96844890f2f8022073d983167a8659795d2a723147d7c182b7764b6024d99faf02c9503ba01357fa01210225023022f8894e9f6eaa5ec78e55f2ba1ba6afa868eeed9dc9e9cfccc735761148a00a000100000000010a621c24e09bdeec55435c56c43cb9bab41645b28fd176400b1cb2030ab06d08160d00000000ffffffff8b606b0c69b1093752c8c786f88531a4238dbcbb8a98cd167016e4d537a3f2a81200000000ffffffff62984b9507eca54d2f1a922c5f7bf6f6e642b39dc4aace8f930bdff53118e52a1700000000ffffffffd76e15744080a70554e61c9f1925eaeaa6d590c1d5147e4ac8ad8ea21aaf94d90e00000000ffffffff44da7dda90030924833a14ffbfe4a90ef25508309ff944e3ad0285949498158d1900000000ffffffff80caa697be0c785d3b3c494ca934fdae5fa0a1ca68850ccce76e36229f0dad2e0100000000ffffffff6056c30947cafc8ae755f96487545f1cd11cb3f4ba7bb4b518d24a07991011b20b00000000ffffffff27cc7f1d0ec27d24a3d8998e4042ff65ebb2128254a9ed62f355f0b8bb74fcc30d00000000ffffffffdc56050240aa455461c15b2bca9de184b1d213383ba971b4e9ac9bb5c30888e20100000000ffffffff3d497fffaae79391934ba61b6ec4212f8712c92f406479bfc6b8291fc5d3242a8d00000000ffffffff01d94528000000000017a914b5ffe7164008b6e3e9888b0d1d350c64f57a36fc87024730440220549e75db4d9156de9a00a9efe01f64efd1bc7857064febf84229bb308a661be80220605ce4675ff3d276ac1f2dfd443062984079c06d8767dc4d99cd6a3e50b2e10b012103a8edad77ed96dba5410eba16ce54e499ae018a98a34ef22ffb1d067373a74e6a02483045022100ae8ba2ed7b7604038c62beffa0c146e3e1fe4739633c1b3e4b0f70c2f18a64df022017f9f3cedc7f91dde4246d17a87c55dd0bb739109ee73b89933e668f738ba2fe012103d314f47dd841656e1b58a5e1eec611a51af922961798cba6b5aa58721a99d69102483045022100e49ad0e55e8b151b40b374e4f8b7e82ec8c7c1747bb5e3f96afd82cb1232488602203f9a49af08ea6ea35e463308e92bd0e887cd01b626072f48d1f00c42bd2fd0940121022155cfea8dba45c6f8ce3ea2edebc082b02911c31ad3805e65153fda7b276df80247304402204e579b8577987e9b0e33aec75d307cdfaa6e327c82e72351a0bd3c249dc305e0022032c57b327def7157113a033a9a5b047a1c6f41ebec95fefabee5d2f1b55c116a012102ffa8df76b539219e3abda70dcaec5368b67eba05551ed0bb8c3d009ba636e7ed0247304402207024b6207e4debf333b48a21ccbe1f9f9cebf94040d341d8ebaaca2d7ed2a3e90220573e20f20dcc529288a847faf4f800afb97fb3c052a6aacc03593ef133af80f7012102d812af48490e29b5c4d5aad43e6a2c4f0fb15e977bba98c727b218b1db3851a302483045022100a42259e21dd2d977a7dd66c7b40f7fa83567d0e59981ad21ff2feed2f26869f802207c408fc54f64c74860ef89f5099ead4f907b0afc1c59251846895f991945d4b5012102b367672955fd986fde8b1f45e5b4a8d990a74c911b3a302d6eba7b34c24927f102483045022100c4483648ea3563831bd636fd3f53a67974bf6a7ae4a2c42cf94c9fdb2c8aeff302206e7030b62cf37d4040e4b84bc7b902765563b8b934aea1a1c04d98e4cd9af7bd012103053e739d3dc78f1229dd508f995cfa6637ec1493a62b8067a08c2bc1c3597a4102483045022100fb67448e9810f0c29f371187c1cc8e701c9de3b2c3261d3b360ab9cb7e94e4f702204a75eb88de81e54402d9e85bd23af722cf5af9e83632bd734ee0ffebc5aa91700121025e3cd53219f0b8dc0262df3d1d35206cb5afbb9e0d26331b56a8eb8cf59522f80247304402202ccc45e5e18535725da017d3b5ce5fc36f9c1ab7116e683a8981ca728c68887a022040d29609d8264d2f294d7d49c58f62ea2cbce4e977216ea6ed7f5bbea8f227ac012103a16acd19230963e78b434cf7d6f0086c358077f2bf2b2947f66a298d68ae4355024830450221008ee5d796611e2fce46e772278d6bbaa8212ee4a70e449a539211ac170e984fed022022f51e94e2ef672427006572c2da4b68574a5c8bf071c1b5f089c510f61db8e4012102abfe0e8b9de12fb4584fc2e01bcbd22b1a3beabc683e75ac845b9a89b8dbbe98000000000100000001a2a0ec23b237544e3a8977523d133403f0511cf9fa58703100cbf1f50c9f12b0000000006a47304402202847abe640e604dcb6960b9bb8b05ba3f749b9b6971b893b201cfa96129cdb2902204ba629e2f2e6bd744097284e7a7d43d6bdcc9edf69f258fc4618523d0d659df2012103f3f44c9e80e2cedc1a2909631a3adea8866ee32187f74d0912387359b0ff36a2ffffffff02cad81600000000001976a914a520c86a08366941cd90d22e11ac1c7eefa2db3788ac204969000000000017a914d9dfb5a2c34941e6674635947c788e7a9983f45d8700000000010000000001029cf5bdbcf550a388f531d3dd3ae58ec99eca93926f5e64db4de69d282f1a20340000000000ffffffff43ff55101f63aff9871865b6a72f02720e0d37d6ba75373967bcc9e25cc0ba49000000006b483045022100a841c6da219e6d093967528174abc4f6580b4e3f42c9cdc066116f883c004f9102203834a9b5dd47511e137182e2b70776d543b2a955cd2f3f44edf791337d2c1e62012102ccd7a8da76a4b24301770e285aeeb4af4e0c61fe6e85286e5586a2551dcb230effffffff02495a1400000000001976a9143f3868e2ba43586efc2539e26eb94381c9ebe48688acc896000000000000160014f3e4c9d9ab6d44460c5ab6e1927cefe51c3d9d7102473044022019d785548d61cb4bc5e9a209bd76c02ee951a75fe8af5248d536d012b16f654602207f1f3b795654391749bd1e572460f98d453fd28f1a9d57d18eade751e4f5a9150121020458b71da716415bc16771762150c37ab89b69c9aa2346040aed0919243a4a5500000000000100000000010315e1c957afb35a38aabaa4fd652a044dd098dd5f5b18600ae273d8e99d03688a000000001716001430ece263120bfc0af4f232fa388ce55a750e8d95ffffffff3255c2227b4ba5b5787bedee1cd4db43393d5c1a07b3209ad062d27d851afeb6000000001716001430ece263120bfc0af4f232fa388ce55a750e8d95ffffffffa34444453dfc65691e25e77c0862f640be007e1d7fb2c76bf522d7c5fb6e61bc000000001716001430ece263120bfc0af4f232fa388ce55a750e8d95ffffffff02d59b00000000000017a9144e3b7006e93d6a8d8df97111932fa01c3fa2c70387406c08000000000017a914cf5076d7e377b263cedb4f95e59a537fbd64a7ac8702483045022100c4a31fefe151fdbed7ac3b101830b2269a2c0fb636dff803650f04ecaea408020220667aa2dc22f386156088404bdd14d5a057b1c5e3ac9d6e9de14e30d56e397702012102564bf3d20eef3f0bd9ba26d79df6baa4d28b7595b75b155ab848bb471a2d379c0247304402201ee35dfc0064e44d973b3b3ec786793459b4580523e150af2478630aaf51fd9a02202cb51e52fb0653c854fdb74eaf910faff3d6d3441af83f5cd06d2d4b9254eba3012102564bf3d20eef3f0bd9ba26d79df6baa4d28b7595b75b155ab848bb471a2d379c0248304502210084ae040bb87354b1a746f99d46ce4b2494c88e8b567a4b332258d1c8b7d4df2902202205d94975a2556c8ac0623f5fb59ed414c431ada3ab17ad39bf4d1b658d33f0012102564bf3d20eef3f0bd9ba26d79df6baa4d28b7595b75b155ab848bb471a2d379c00000000020000000001029360e894d4961cb3493e93c7557d38c538f309c0e060aa74d0aa8f2041332ccf030000001716001440c39b5f020dc4eb1514d21e6d4267cb4d599ec2fdffffff6f541fa348bbc546bc9d602c9842568e89654c5c271a62ec39f61b22e87941ee5800000017160014ff81e73782ccdd7ee6fd89097a909206e789830afdffffff01d62e0100000000001600140dc14bdad4c548ca37f1e15b1069c00f7eaa24f802473044022057a0b6a158f8611fd43c2c97e1113ecf7c0fa77d6576351cd0cc3d5383b249a50220740f10e11dfc54a388d2074d03f521582e0e51ccf5d7f6be5bc10e5d8cbc1a230121029235be35951e0f43ef4c72d074520f00474002d74550d121cb7b848c9dc1bf490247304402207895299395b96a17d3ef65a563a2be2d187dc89cf546d78427c35363587e6f4e02204017ae0b6b91a7440ea0a960f9f3f7909573d5f1f7346383916a85b822bf6c3a01210280186313c42eda9496a3865a5b11149e91961b3a9e686338e6f5933637ba8da149a00a000100000001634f54bc97ccd647ad4a76899b80cc2f163a5afac87065f35d8986eb3492c8f60f0000006b4830450221008ee2462fc71f9dde2f15d0d5203fc1239a6e40136eef6a7a8180f388fdb178780220389a64a41feabb025da2dd332fdd4ffda10951d26b471930fe85b17574e898550121034775b17bd883fe22ccaab1ffd85b99f379599d7b5f948e93d8a8fdf847e1168fffffffff02e4ab050000000000160014445ecb8a4379f162978ee85245ad04fc9dd912896aae0100000000001976a9147169b2bc9712a6df724e0d5bfee312fbeec6389888ac000000000100000000010183f2b2969da8005a0f7572e013e7392f42ff580e12b9bbd56bb3ad4f4a66e46d010000001716001457bebe9a6ac47a890549974f2202d793d942a6f1ffffffff0230510600000000001600144148661e7ae6cd7e1d58f2d6845c4ac7a0adba2a0b7d6b040000000017a9142023d0f69c89c7316699c12d8cf6e65e16815af18702483045022100a09f0b902ed321d59bef6113643bf737dffcf5948797ae36fd8a02efa1f9db1602205c753cfc8e4057fac81d34adc3a7f8dd9b532137fc44fd14dd1fd83d12623434012102cdf841f5e642e8f79b89dbd9c7b2dc7da887c129383554d90308944cff78df4d000000000100000000010110fb2f5fb18b1f86a065f3c9d08d01f0bad2a91c9191f49ad5f930ac90e4ac5a0100000017160014777eba922f33dda676ce6ffa955e242ea1d9d002ffffffff02583211000000000016001475c2ba370d795889dd542e47e0ebb3567cebfad5c1485a040000000017a914a4b28cd169f84eb11e94b3519821749c329669b98702483045022100cc3672fc825535cc9237395be56582bbc486d5dd8a6c123e35d39a060b749fe302202561247efe5a91b0dc4065e427e94066f8dcb65a5fe1596f62bd1a311b599b00012102586dbb5415a813756685409fe58e247fe2c75e1c89b63d376167416be2c4bc7300000000020000000001017dd5f84b125858e6030146e922537193ddcdd960f04b323e7e59eb51f0156c390000000000ffffffff01502b11000000000017a91413084b723483fcb551aab98802525d1ac3c5ab9a870247304402203f98df36bd82fc75a273e21840ab98cd29089371ff5489606582f03af39e1d1e02200634a2c3f8d3a2ef3cf7bd3cbd8c6d67560509bbf661852c8a51fc7f035c12c20121020564e40b16c74a52ca9130383d88a31a2e79cef37c3045693685658378ba40fa0000000001000000000101aefde7ce3312d05c1e412061ba5d1d38779835a4c598b0f7ac8e4273c64b628a0100000000ffffffff02c8912d0000000000160014323ff8912f2b36d422683c6e9248ed4b6415a801701101000000000017a91418ff21246e351aff68cd9b72dc4e2253b480f4de8702483045022100d920edd0c8370f93889e9f5d7bac9d42c7aa0730887c6fa05b2c12ae19d67bd202206e65c57f426839ac216f52d929bbc4c97ea36dc64b3d3e6ccc2bfc1cc24b4b02012102be9708fd6b302b2f7d4ae0f0e0f0ae9557841b348315dd368d1f1f39e38bbdc5000000000200000000010185e1b0c1182cf30002a9c8563691436fabf017f819c149e66c5219d19d7fb5380100000000fdffffff0280841e000000000017a9143d9b2de3c3b349fd23827bcedd113dae2d130d128724cf0f020000000016001430ff7417d6ef67b0aaff0de333362598720f73c50247304402206d19fe4fb131db8c21d962e23ab6e078d5fac77cd428df52850d3a0212deef15022046ba34b669332d9f76ee82c4106304ce42f5a2ab88825795810706e3a05fcac701210323b92239d5fe003b440c58874de10c55033f251cec0380dd199573b190afb16647a00a00010000000001011a8fb52da33878374a66b33b3685eadf2ecceb2fe051590ac78a492e026637f60000000000ffffffff02900425000000000016001471365d1954703c1f5c1d0564fdb20710bd801011981007000000000017a914a625be8f7d161abaa10357f4dd0f640dd10eed5b8702483045022100b39f760fb5cbbb869fd849b7158c437664ca3d1d851c1dfcb811763085dd37fd0220463efce8370f23ba95772f8b105223658c579db65e63cafbc9fd2e5387e939030121031a522170abd14f28a735dff1a8bb0c12e37fef6ac6a682b275b0c8c7ee1c7b8f0000000001000000000101f75c95d008352e10ced6f745677784067fece512ce46ee14a54407816010f1960000000000ffffffff02c8af00000000000017a914e96bac6b256e3521e83404f7e6b1f46a1f9fad5787a4060000000000001600143354b976e205090d94078c7e3c5142bf988792d802483045022100fe7287f37cef31cc729bbfa4f79a3cb9d3a77c151bb2046c9fc34dbcb302415602206dcb7595d3879a87318b2f500c39d240e1a061804809b44edc6cba3749be3493012103e89c8e68dd87fd4127c6173b6bac929a96255822e74b9da50abc2f95243ac47c00000000010000000001012f5d6878f52c60a011bbe31e71eccc04971f0429969754489084726bef0791c00000000000ffffffff021057750000000000160014232d8c69ca37dd0bd36184e09a8fe522799ee678a08601000000000017a9145e70202677f20326d0fb8051c55ec15402cd38ed8702473044022017e77ceec0041077f93d84de8947b27e9082ef9a5b6ecad1f95c8bf9602439d402206a1ed370d5693dda06505160fa34091c75dbd4caea74cf10d5df8c6d263b3db2012102ddb4a8dfd17ffa3132a706e060225f29b544abed399e767e58b95b70d50563f7000000000100000000010bb62a11b77eebcf7ddf3ce3914f294898f3c36f39e59ed627856225fb69e1bc4e000000002322002029a05e3d05f6514f49bed0439169ae638000599173c6d2330bee32c58cc4e50affffffff589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a6689050000002322002034bf8e751ca3af95c5febafe3b72fc39da22f6fe2ebf0591e8d9462ad7dd0bdcffffffff9d06083bbd1677a5a5d322e84a314852905ef21a0b8643842f521832a9d8a498000000002322002090353785a4975b6443cd6d69e635318d819704e130ea3bae61c53a54b66711caffffffff5352b976f61857f9144c8f50bdcb2a845635cdc03479e13847fc110ba8dadbae0a000000232200209d0f3214f4617020109e3cc6460ffd4c50611df2fc223209331bc5bca48fc011ffffffffb3fb62c142ad262204a7973c05ebe148dcefd0b357d9d87c0dc4ed0b9699fbb90a00000023220020f2e1e6cf7c0a4b229096852844ff060a7396d41c242e326285f4acb00ee0a171ffffffff4efce4a3494194b28baf99ba4d607d30330de835cb5a4a83a2874bb08a3d7ac20000000023220020aa1277a0a8df93787db49522c3fe6375ba3d16ff4850eae76ef4a7bf27c7de07ffffffffc6d49f4517822a56d1180b0089d5b4bdf237cd05e7ea58cc2d281ba4a47906cd000000002322002002a40a7396778713c76f212d005b68b1804dc0d992b029b594ae3a48bd935defffffffff9444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d42e00000023220020d5727d03bdc997c9f02ca2d3afbf69e34c5ad19113506701d9dd43d177176d37ffffffffbb0c6560321f3780bdba879cc573c02137d5ce774c5702f7964b33bd7251d2e20000000023220020852066c6997237aa65452b9605a0411f460f3669f46fe7ca92f0a157f23499b7ffffffffd86da87bb5423beb4649d9e9305e9ed22cee37f7d2e0a70efafa8b39b7cbe7f30000000023220020a2f90b877337cdf4d5d674785588b897c8f215834d2f47ef43791313029c7600ffffffff4ef5b0f30e145c59d42470a888e3edd4f9419b160610bc736863aa2d7332c9f41a00000023220020ab4fa29c45b6fd8fceace087abbc67f95c9c5e84b17c3df02ad86ad4657e6b56ffffffff020e5d0300000000001976a914a1b31c4cb1a4174e2044142a2ec9e08ed75225bd88ac1a182200000000001976a9145cb6a0a5875dc932513b8580b4e62276647e209f88ac0400473044022054172514e728077d3d29b5d878e88769489e0a854ef39b4e17f1edf14fe6ec54022022d940d8a1b9ebf31de1bf8a7b26d52dc3a8f2fae5e1f890c796ad1f24434fe601473044022006a897228bb77e7c43e969b7f70dfb7cfe5758d0157e6f26659a9a146e305e23022038d6a15a104b796d97a3402ab1d3620867d917791fd6e1f25d1c94d0c9ee845d0169522103cdf8af6da131850e5f240a32ac5b119cd8aea930e8118ef61f217ee1e806dcd1210243cbbe97f1ee324a9f1e2c54e60304a249984c55bdb7033cd9384c48e2388fc121036cf438b9f3232dbc7c908595d28c005d56f90a75c16fa7ddb2c9a9ff8d64cdb553ae0400483045022100a7f92879ce1f88992c2f6ce2a8be01b245946932ffc3f5c536f3903e6340df5702204d7c66c76009ec9aaaa7bd521ec0b43d6772ee178d47619f48be17ee4d3e27d8014730440220403c91b47d266f35edbc1d5af443e2abed4514243081bf753545533b40e21e10022076e63564bdadf1ed43fd9fd734667a785729fa5453b14636fcde46b4357a0a540169522103ea4ad7167afc5d5db53cd6e371f311508c9504132333133dd2c3645dca98c08a2103f91f7f3b8d31f86786a139829afaf394bc4a1f09c2fe29ab6f6666df8273a72c21021ac194cc7fec661fa0513a7f6e8214a0e3b2510a0c0c720c5e3238801771651f53ae0400473044022045af1d737c181dfc09eae4d461691655fa1bf7340f483922e03be5a61bd0f2bb022003a7156ead5cef16e3ea9ee9b554fa879eb9902f59ae9c0ea209a56135f0c8010147304402200a296b709705a668d22de89243c29d3a37b860ad069ac012a2d9d90cc93d3ad1022063a3c060eb206269a317a5660042bca937678d0933216d53f9c9077ccdd5792801695221020a140d0555bbca888faf74de0a34e360c397f56d514962360e42fb1f8e2c16422102f15bd694b8407a6da6ab311982d70e559bdd2f9f6930373d3a9814fb854a796e2102adf529c07a80000f500d12a7288f14fa687d83066321fb8e38a6f8e1b13fa32253ae040047304402202165c9898d925ee17bd00a756a8f54aa8b5f59b72fd5a21f3bb7aad15ef218d302207c1fa63fc816a1ef66016f0e24c5976765f68eef608469c61bf9e6ec2d90a3930147304402206c4d4911de9ea32e1f10e2897ec6beaf56646d325aaef305dea6288eee282caf022037471bf48ddfe341aaafc55f5a5fc20b7f850f271172959df811dbdc1a92d9bc0169522103832e15d9ed6591c19ba51e82e8b3946bff57a7564555f59caec452b1352c4c3c2103fad7b4c4518c62010f88632833c8208d35b1eabca8a161b76b35c25205d8e22a21036c9bb5543120ec914e62b88e69060c79226d7cb9b743a9dba6eb94673912845153ae0400483045022100c911a10bf8a8276b5a86e12b1f09913b904cbb13fcbd4137c33b1cc2bf6cb73202204f17b86ccd6309666b133f6291ea34274ee6df97e23b9fd136811df8623e5b660147304402200b61619461e368cc476344d7b3297fa716edd3bcc707e1b630f7b33d1ee2cf8b0220646b272dbc7cc70b43240d554c636a7e0794268d99afd551d8aef2a2a01c5c2c01695221028cc1ff8f0f000a6c666dbab4a93536f159953fd0c69d86a4e170a07f481defae210277fc94425c45446b650fcd5d981ee1292a6717857aa47912298f177d179debec2102673fd8fb4f047c200b3361425dcc0c006578b7c76a5e4dd3aae7288a100ea33553ae0400483045022100a85e54ba64a25bfd6eef2832261e64b1c4fc381f75a41b0999ddf4461945892202204b7a07c86d6b40c08e132891820320130a6fd7a32c4ee01e6330d036e72572600147304402201e37614dfb06af1c6bc035ee1e2ee0584369f17f0007638633ad498573a14e3702206282dbaff4502199121be3189785dec4675a14882b816ea2aa0f81f803e4b2fd0169522102ca98e7a3e757678d603270e320385ec4de801b56d09e533a3efca2d37ac832f42103a1a3be28b69883ccd7674c4c89ec0f4079e9be1ad8b6ebca7ff7c55c56e741832102d7274a40c4ee8518e332be2313d53257c5194f3c10f7c681f7cb9728125fe49353ae0400483045022100956f56733a6b3e2adb3209c412623e23620a3a41d7e96e0699ebc06dddb32ad402203fbb03274938a54eaec6e4c96e64d74522043e5559d7946dad7bdda2d88603d501473044022078b152ba092e3b4962c4078c1b7c9a34b8b9c768a375a277e902e6742ebc338f0220154d7c34b77a564a9c9af23e1d4ad16f3ab11d4dc87a28b4fba9fd329188c4ab0169522102d7c5b10712e64a73d8c6db2dd8b81f098070dadbe25f3bdfb95e3f996dedf8ed21035588cfa1e7d0931267ef5220c5f08a17455aacd0d84a58ac024f3d01757c19be210204df69a1f05effe70296075366e5ce601811e58f7463e53fec9dafdba46342e253ae04004830450221009a0e594b82af1d4f848291a999a18185dd4bd76df001fbf8f7dad0bd8c2f6c2a02203a0cd04ede23a0adc4e9aa0fec56a3d7d76513f90e4efdb79005aa1ddd4426920147304402203a7875b67410c8d1a685ca0bb0586540d4567d38e0dd6323c63ed71a43992f4b022054a3de5dbd715cf1b3594505868210baf872f8c7e7ec1e5322aaaca7648736460169522103164f76fea8e9882564fadd4991eb7bdb620760e418bc86a5db8175cd554543442102013fb36dfd38616f9ed5bc5db8c0d3fdf0d54231fb07d0bfaaded36badd2f08621027911ff6fffd6c09285b5874d52e28df628ec265f4e47ed5409d5e66261fb356653ae040048304502210083da7a15f6c97d53119df2c0a4086c31f6f342be765df37fcc3d99d1ae359d140220207caa5fbec7c71858f9b4eca999fb710f89081c3dc85e797a3fbd3dea990ff501473044022020e0d1c4577944d0c5c9ab887ef3aadce41e34424a68b05a866917f6f9202865022027859116ae36b7071020ed7f12a0f69782d705570727b3d241a8f01b04f3b85601695221030835cd2121e8be2acbd36e5184228afd8a0cbcb3aa550f969b1f5cdcb888833a21023fd0aba8d56c29e944a5fa369590d986ed87d980fa45974c286354995e4a0f81210331a654ac9f9f105aaa60aa07b8b10e5d880e1a28a7a5854de2b141eb2c19f06753ae0400483045022100b2b36894875db279dee54b5bf10c513c1d7b64605e0502790684d839abcd174602204089fce54419bcfd7d1a0ddc11488dd3102570a5dd57ac9f39e14ce4e2ae116a0147304402202ee16df4805f2879eea04ec855de80c4125f2fbfa6f098ad51737225153498220220395a7e90dfa296cdc6b7a5c0bef3135ae53a2b708bfa335068196c38ea0b48b10169522102fc6d2cf4e1a4fd178c1687d3f88534b22e0ec942cb9efb8b6ba9b7065d85d6c72103bb0a2cb5792e678d2e3da015485efc1aafd3f24b12e44e9172e9bd8e3b21b2f82103420dbe4d568fdd07aff092a5f60835c142fc748265d311102bab13805b5b24be53ae040047304402203d5d8d6693bd2a6c3887d58a5a892481c2baf00bc87c8048b996627f452bc2e7022070fdd2405a0f7551ef195e9d7797f474e2e263b02e56ba5ee10b69ad709f8def01473044022007f5975ff3dca485350522417c0eb516130bf3ff6853a15fae3ab86c5688dc330220324e86796a79761159ae460d192ca2fbc73c1d00c6239021629dfc8011d1cf7001695221032f44dbd6cec970553004c8f1a04765ca6f94124429b0bc8651cdd1de87a0669d210245fa92523ea980871adb27ecf17c32a35517727d3d00722c3bbf4f20b1488c9c2102a89382e076f40848e4a24eb858be15211340cf8a10f2880e626efdf662a38b3153ae47a00a0001000000000101de11a0402d463c162615bb070974894b3d265713d9af25af5e582c96a8f0775d2900000000ffffffff48c762110000000000160014d84fea6886d48f514b1e98c45024af2fb43126ef102700000000000017a9140ce9f7126e0d8d060ec49d3756800b68c64d2b4b87ff940100000000001976a91420ed478fa95099e5d6f790307023c9db7a83ce5f88ac293400000000000017a914ea2bafe82ff8890749017ec66dc530452387480b87b9430d000000000017a914824b8a917e2ccb6e21362d064bf2c988178cdc0f8726c61000000000001976a91484fdb0686f95a7b19e7ef1e1bdc66423ac9d944588aca05a3200000000001976a9141c038d128bbe644e141fe629185b8ea3685f82f588ac0cdb02000000000017a9149165510adf4a1a6f4ee8f3c7db6d8997b3a46c2d877e342000000000001976a914c42eeda1922b01afa721686ce8a207e4bf7c717a88ac709400000000000017a9147677efafcffb10a137e18c45678dbe913eac5a0c87e02e00000000000017a91430e09ee095c435b4566e96e8620113b9c173ada68760fa27000000000017a914fdd1b4d0bfa54db06ffcc7658ca6e7837448176287dcae0100000000001976a914ddf9b9db262ddba8b654d1f499f0f36e9aca830988acdb342000000000001976a91484e4b5cb721f284fd3178eb74f8513d4ebca2d3488ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768b500300000000001976a914c5dbac82519a87c2a9656124b1b45ea6d41c535488acb6a6010000000000160014d4ce70cc582282dbe21043adba8e55e70dabeaae07c20600000000001976a914801b320ab5ce0bcd9baff7b876322c10d48fd88b88acf56d04000000000017a91416b8fc46238808871c4cfdf5a227ea6702c3d1b08735bc02000000000017a914fcce1064c532a6df556c3db209c1ae4acb20754c876a680200000000001976a914a0e5d4166489f8b968c8861318511a566b19518e88aca50201000000000017a914d834b49895edce45a81a17aad8a9cc79bca7ba4387148f17000000000017a914a7cc8e3bd8f79aa385fe5fcbf5b849d36fe987ea8719ba070000000000160014ed6bf2c8d65409888859f98f0b831686465063e0db120200000000001600148257dfeb287e6bac2f9333af8b33c39e90c7f734e1340400000000001976a914cd0342ef1010313b499317c06e6b6e42cbbbf8af88ac11494300000000001976a9143542689d0793197b830bad0d2e41aa43b831e1b188ac10270000000000001600147e2250db2da3bf2131877b5191d2bc42269050ca17050100000000001976a91422f459481e0f3f803f0cc388daa2fafad9d51c1b88ac5f672700000000001976a9140d90a265e10aaf89e8dfca9e096b06a8f3482daf88ac5725010000000000160014e3744e835073aa2fcfeb4c6e042fdd6ad73d3e5a7b610100000000001976a914fc734b70abb7e2f21e8c84c923320935cd86c2d088ac45181000000000001976a91451c8fbda33b1596a691d2759592b5da813e1ec2f88ac17203c0100000000160014ee9df3069864e19c378aca4b84cbec2bd8f97bfe60e31600000000001976a9140b753ae21519cd1e40e991995e921346f0d3e40288acd15e00000000000017a914a69e4431f3f1184f502f4bd665827867279d482c879fe61000000000001976a914f7f44a5428911d953b6a511d6f597b71289768ba88ac8ad700000000000017a91444ed2ef1d679d58d7899ffaf5e6efa85b137d41c87b7ae01000000000017a9140b1773e5671ec87df1f3ccdb2f379b9080cb175387252a0000000000001976a91461bb6307f437e291a1dc719edcc97e0eda35728c88ac4028fe0200000000160014f420dd4c71acdcad1112f7cbb9fde162897b85b230230100000000001976a914c741fa3341acb7d31fc174a0937b0878d55eb1ec88aca07a03000000000017a914573cd6f31752d8aaabce59d61b2745713f8904d3873a8100000000000017a914350ffaf2628408aebe9523fe4e7fda2a432b278587815d03000000000017a9141584c7d6d90aba7e351e33093954f8d7154b337187918203000000000017a914eb2592e91f59df8ed4e47f77aee2f1ba28f80c5c87a086010000000000160014114971afd1d8ca6a2cbb9c556891a3142b2f8f79b80501000000000017a9143e9450e3e443f321af4d72b215d340d3c82e10e88797af32000000000017a914bd42fba5caa4469a79a28063b618bf426e76388a8796b100000000000017a9145b9e7bfab3ea0a01f6d05b4bb57e16572c86415f87887100000000000017a914b62eededd2a413110a72d21a2e526e3f917dfaa287a54b040000000000160014a1cea6ab929a2c4e82c4b058a4797acae51f14bb915c00000000000017a91404511d120a868bf453aeabc60dcb535d5b18b41887c4240f00000000001976a914253a6c111a86a5c19082d90e9e52f32b6456133888ac737000000000000017a914839539909a487a7b8eb1ca1fca8f897890335a468701b50000000000001976a9143bddb41bbe976492a25c59403d1c729db80fe1b388ac2b43a8000000000017a914b205102d729c11c11f0ee97f94544f9025ae44cb8746b303000000000017a914c55010701410b8b8a882e28b3e4e5a43ec48d75d8744fe03000000000017a914e1ea0108c7969e57f5a97b57815fed9ec2f44dfe87209200000000000017a914deefec43f46a510d5848de7cde65b4de0e1154198706330a000000000017a91453e98d82b0866ee84377f7671f28a0dd0e98d7b587ce2639000000000017a914af13703a79eb3de46d671859f8262dbc1c63783a87fc32170000000000160014133ab36f836b6e82487c7f274808038de35efafea55d00000000000017a91445c458e9af5cba85dfe2e0c636f60a6167f12a4c875ef905000000000017a914e3dbaeb0244e5d505822635160bf7fd7473ae80587683003000000000017a914fccc477da613fe95d899ce55a76c43062f0c074287bd320000000000001976a914635acb778378a402616cb317905d9692a948420588ac4e5d03000000000017a914154c4b992fa95808d8e4b0d4fd41c111f57e2b4f87f6a301000000000017a9146df26864fdd21432a5db16858936188d69bc117687d47703000000000017a914e85cff85bcdbea32e7046b06dbc16f16950b63d587ef8b1000000000001976a91448310c6b458a35cd293cc765863a3f977346076388ace2560000000000001600144b6ffebbfa9d555e3ce7e9e89d7d3d87996caaf10247304402206947739073b7155cc11cd81d0f8ca916553b281a9d8f7493022fb78d8de4c51b022028f96baad3d5073e7e3baef3bd798e2555b5004bc6c7a2b81256412732cec6e6012103fbec70195971c3d5858074704d00069c4804c9ec9b445254cc830315cbcb9f52000000000100000001f2f12628d883ff2841cb680addfc6ba7fb4aa04753594d11f00130925fb48eee0c0000006a473044022000aedd7022fa20ef8864d926356a821446c2d60ca66297378de7fda9b2539a7002205c15912d45879e0a374ababd379724d68dfb117844e484f77eef3651380a3c2b012102f82432b8c31872b7f68f6256e7faf121411c0408ea22ea1bc2b1a6fbad8fa952ffffffff010ca7010000000000160014fd407a520d6d8e56515562d2592f31d52096b3c80000000001000000000101f2f12628d883ff2841cb680addfc6ba7fb4aa04753594d11f00130925fb48eee1e00000000ffffffff028d2300000000000016001488ac44701b2705dfe6bde06abaf78b5062a6ac51e8fd00000000000017a914b65e1e8a6be4832954022ccba4a01b1d1dfebe62870247304402200297a66460635d5d62f210db118322e63cdfafa7f981086c755cec7826e8785202206f7d01e9e8601fda8c26030290d3012e3a7f73cb816106919b17b8e04ab07bd301210288dd7800e497cbfed7e4cb797a90c144c78fe14531ad855b8d2e439bba1e1ee8000000000100000000010166c352d3330a72ffaad2855da97ba6a2f57106ef2ac81fb75ef7cac310cfd1a001000000232200208934016d286b621c4a78e54ff8df9b1f5d7fde57f48bb3a94f14481944e90f51ffffffff0350c30000000000001976a914f3ebd8200b083a066d77f3237b2da31f5c42f56988ac88740d000000000017a914b9db760ce7b8106eff20225648c818e825d0259187708227010000000017a914a7f4a6d075bfd7ff65273558c1737e2c886b5807870400483045022100f65c7fc254e3c66fe21d1e31932979c6b676bc4267119bf3ddb8b8416983ceaf022029c937962d3f0de41d98c5d4d2fadd398f58aa802e8ddbe21bdb7308f1d4b20001473044022054cead7048653580823dcdd096a6f067e58c9dcda61c785cd7aed151a551a53e0220125ee23551ee959784186499298901e3a2ced12441c3d4fcb7f5fce6442ea30501695221020f1000961bb9be4efa062cecb8e1e4aaed87edeff6161157ce1aba051cf6091f210394b01919ac5b81264fb8ccd4e14238d728014818d3518de92a4245804b447d882102a6d7d400d69a164e0b692206d8f11c8e5bd69a94e65221b3960284714bd1b53753ae0000000001000000000101577e538ab24e20bafcf2bbd04a163f131709f85d9bc31456c15bf450df5aa916070000002322002021b926bc8171719b835707369a6aa4175e65084788f919291a8a6635b08e60ddffffffff0340118b050000000017a9149d1e59c0490deadaf3495f58494db96b49300086874e050200000000001976a914a94d3b917969048ca8bd6e79fe02021063be8d0988ac9fa0cd000000000017a914452cee8e2a216ea69418bde98dac2410dea2372787040047304402207be4eeabcb5e41e120e218c6f54191ae63596ea250e2ef59592bad0d6c6bdabc02207d6f400a911d806f701182a5713ae2372df4af712c62944e97e63bc67798b5470147304402203453465834aaa71d36782dcc124b7f8d32d6c4ef393f3f1fbb9aa4e761b07fac0220376d4a8717ee7d8f637a69716ca099a60edea2a743479c818733d0c40c39ee050169522103663ae45a6fa4f47712d233ad097d4a04de50bfcae54ee1245752e5580012541921026589bd3fc896e3dbcbed2c4682c9cba885a5f2c850830874f1533100d622db6e21036337fdf91218674c19bd60f1b748674faaa826ec71724db465b7ec02e8cc6ebf53ae0000000001000000000101619a1c40063c498a91b1cbd30277e648f265f8a8538ccb656f964a3359937c4a0100000023220020b98ce1bae24af07c3f4f807e891535abf983c6468586947be4ed5536a957fd4effffffff03d8fb05070000000017a91400d4e86aa11694bcfe0f8cb3f918cab8fb723ac787104046050000000017a914a24034e91c098c19aafe4809b08cf27a8fe005fc8740af0100000000001976a9147ebb1dbc807712f8f2eb42a41c7306876792334488ac040047304402202e838bd6b204dad91f94b425672c0fc062bbf171019b4e5594d34adb5f5e97c3022076e91945bc3f924b8eb0d4055627faa6037e6899837a7cafa3ef528fbcba2560014730440220211bc7bd1841732091e02afbd243e4e811c13c5ec1ad315e87532727ab76bdbc02206cfdacee425ee5a792b92c4b38f6342d9f6be01b24f6ccdf2563317c860f21a501695221024209db6db1a7d202fb86f96a54ca3530120cfb916e032c4c181d915268e96a7b210214dee4e50af7287562466ff3d22ffb60e41873249e01fecdfed02a21fe4cc06521021fcc627189a7b3a6f43b27af226f3fd1a7578cf456ec1faa503e2f2cfc90ea8a53ae00000000020000000001013fcce332dbc9618665f421b488abab733be133801757b2a9e9345c73ca32afb604000000171600146d30615a6b7bee30132a9e74e262124aebeada77ffffffff056cba06000000000017a914638e02cb26fa753f73d5fc6c5ef373f52a73f38087d8740d000000000017a9148fec004962526ddf3f7d2456c3572d0d6c0a2120876cba06000000000017a91409e47dcf48c40aa4eef00ebd6d0942b8b1d9731d877880ed00000000001600141b658fc28da3ff29d570548bba9e69773c46ffe6188b28620000000017a914f82ad30d55a690a2b6c700a108ea843f313c3b1287024730440220093cdf6a26a1d0be2bfc49c3fc2f0fbb8dc4eff72c69f4fad685d6a737f4ec5f022008f09f01f45cda19d6e6ef195ff5d40488480c0124a20a272e4ad7fee2a96dfc012102c87dd7c367e7812415bedaadbd0e2685ba26f1adc5f15001ac2544308f074e780000000001000000000109510789176a27ff4cc748f0d05f0765001b32ea47041e1c89851225407c628f1a1500000023220020c0ad539745f161e0969d19f203f1f3815b5cdd7993bff335502069f2767b6a79ffffffffce67ca995ec7ea523bfdab24dc07a2aac2feb3d1771d74550a87a14d796d4c2a000000002322002071ee752e1fe04bd83a89acee85f41482a84c22099a5f359ae888809e1e2196b8ffffffff1ef56578c5aa576db7fccab7cbc1416843d69d3247118c232fdcfd4b080c433f000000002322002051f7a6f918cc4236c0192e26812d369b4b66338dee56f5cd9bd6b47cb5fbb0f5ffffffffb4e11f1ce0f63eb40f2cd6f73214c5705beeaab74cfe344daaed628670b5bb4900000000232200200740ac2b8b7eda6b0d846c1a0174fa641e72732257714315c0a925eabc29c444fffffffff222ca6ed81d344ebf5004362d8eff070f616c21caf194c8450c1c3a96ef19670200000023220020e47e10a748ab15b3b2636beeb6b08f9f71f5201bafcda2d1f5b221f905335e5bffffffffa2d062d5baa83326e4b2ea5c2d8ea76010b9ace8066b2f6ad4efd36aed0d0a890000000023220020c737e49481190eefe12f0962d3f86c7126a4093a9e59520729bd312a83ead490ffffffffcb1805a216d287240675ce2468584c37e655f48fa4c788f81366bf59549ef08f01000000232200204af40d0ba348971ab12538a29ab2ffab16c211e068c37e2b328f66d47b774034ffffffff98bfe11f67ae1661052a6cea10e7e8562e0a29dc81a7ea151125704036a377ce0000000023220020566928971350ee807b8e2492b2f9f176ef3027d74a0e172f7eceb0efd860334affffffff9444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d41500000023220020bfb98af950d0acca82c3b08f7f972aba36d85b624d6e16e89f5c912fb688b17affffffff2c5415000000000000160014085369e82db62748c7f4f31ff856b2440e6d117767200000000000001976a914dc99479b9e3f9d592660e371a4e588bf118da99f88ac9c200000000000001600149d531edb4821428d311096d54ba9a4879fefe6ffdb2000000000000017a914217d10ea1f617bf3e9d93fb23ec1721b11da61a387232b00000000000017a91412867f2ab41c72d2ec1d69e5d1c602850f8de34c87493100000000000017a914510d400486d4536a0e4144084651903e4f5c4b9c87d94000000000000017a914cd09c5eefd39a1b7cd78be5d70cbe53f05bf1a9387124200000000000017a914bc842b9e7cc2c544442897b1242133db9428400287ed4e00000000000017a91462bd70f864bd13c204219056d2969e98e9ae3f7b87465600000000000017a914baafa43b1728974982d69e5f433907e3d3aa33a1878f750000000000001976a914d20358e8b0b4df230ec49dcd283d30fbecd6830688ac698100000000000017a9149e74600c52990a65152dd45f29e3f1f8dd1688ef87eb8900000000000017a91453b6c45a3eb7b561cede4b2cf766b3718bd534d587e0ab0000000000001600149914058c3627ab64f73be44098fc900c2e246f0a62060100000000001976a914272a2793cd308ab961820e1b3b0f188f48d086f288ac4c24010000000000160014f7cebc6afdc81c331696521f5043abf306ee3a9bfbd001000000000017a914a720ca1f13d92335801f77a9bbb4d781c008b87f8789db01000000000017a914dcd73dee2fe132dd7b350ab78efc9499542a333487b8ff0100000000001976a914e090e49b598a8eb86bb885fc38305adf200e144788ace06c02000000000017a91453936e66c7de2052cff01235220c559bae42bf5d8790070300000000001976a91445818e6512e8dcf5794b28b9ce46e9ef766bac6788acfc6e04000000000017a914da2ba48f8d8aca1498cd8b300216e6b8f328fcfb87e09304000000000016001467cc499adca70ecd9f28d3cd0e32cc09d5602b4107000500000000001976a9142b62a3577f12ca06632200edcddeae86632e2d8d88ac143905000000000017a914998485d8e97d28bee276c88ab0ce949fc890004b87d97206000000000017a9147b08914bb83c3c521939ba5b12b2ae5d97291e778779bb06000000000017a914bfdbc4c56e3130ff82d7e378f0e992b96f884643877abd060000000000160014a74d661def508595338b87651cceff859a1675a77abd060000000000160014be8d2ab505f4a33523eeb88023dd30bad3f6957a1bc606000000000017a914e22b18b8ec4f5b19eefe79ce807c9bd4f631b37487c1d00c00000000001976a914dcb6345ce1f8e515690a649e16177ee414c2d74188ac953b0f00000000001976a91474482d794e1926c4518bace3289b73b1e9c8de6688acb0d4100000000000160014671db50ecf1cb7f3ee430616674a77ad5813a428fec11500000000001976a914c0f85ceda357753e76e6133b3bc2c90606858b6188ac9df718000000000017a9141b4b2e03fc791a2a3ab73beb0f4083848f250345874fb721000000000017a91474f3bcdfd76ae28ad557e5660dc0b758dd1e0226875c9b2e00000000001976a91495f66fde6da55b988ec87a0c20bb998516c6e94288ac12133300000000001976a914ce5ef000d31a79e61a52d095ee57c92a3c0c4d9788ace7433500000000001976a914980b63461f47831550ce4b257b90296167a4a66c88ac82663a000000000017a9147f36fd406882bc1b6b0f0093bce323719ea4f20c87289349000000000017a91431399582b4de74f6222dcf86b0c229eef7f2a43787689a620000000000160014406869fba393fffd17956866efe0303d5a2f4663d43bc6000000000017a914f5fa642e420909bbd939239793ed3516ab45fe67874031f700000000001976a91465b8ec70214d6f743a45c9ee14cf8ad42af8851188ac04004730440220200db0fa8e28b274fd1d164f646accb016a66f4c73fd3264a71acf6f7bf4e76a02207a5b67c05de22236eca5dda29b1a0433fbb0d86d01df8652ccea06c123c245b20147304402202de5cea019e69799a61e0d3155159697c9d3357ec3b7db14448c4ecaeb870112022040009e1c0d5e97f17c4836ece2c15dfce592000ea35d96189aad6890dcb67ff10169522103cf71eadf3731b0bca261643dc40b5566e6dbf664cb56f6aaad3039e60a0e527a2103153aca151def99aac6d0f814f227fc81416e730dcde32432c05d75d5222685e721023fe18c23809c35164d008f5979f62da08be3b8140ba24593511214069e9a9b0a53ae040047304402203e9e86a8aa5cb60ce93ad6d4f946ea8ecfd61962aba42066852147cb4fc35ef302202be57bf5d15998dda80c601588bce21206d27527c92af273116fd302c47b2e2d0147304402204143fa914de93b3975a3fee3e68dcc7d555a46daf0fc4ed07626284d7bb156a50220474a23529ddb4a2b1a6a88c9e7d631f0e8e8a43e39856329caf808c99a1f425b01695221034c3b5bd6d67c1f393083ba94fd3c8b5b005f4814dd55ca997d42794de6a81ef0210362cd595b5b13f34dfe489d4d73244994e6882c050a7e0b4e6789110aacf05e922103bc7e0c4e2f359bced724261a76f28e880e768201ce0bb1a8992120743b5bd57353ae040047304402201bbae086a7878d13e2b9276eb3437a7e386977d64d58aab52efb658b1a5ff0dc022018154ec23ea614d6cae46f1e48d10ed15023bd0c90692af44db1a1c50eb67c8e0147304402201bc48d60e084696bd8abcfb77cae9cb38de4c56182a81a28d29e254c1a20513502205051562b05e1e9900cdefd076bfdb6e9ef06f5bd2567f0ba038daac7627c8df70169522102f4cb4be7120763b17bf4e18b0685acc0a4da1bbb5a956ed599d4ad1761a879742102d0d38f21c0a8f190d7e59f80086c7430584dfc48079b95f49ba413db6bf9376021034c353204fc122de277a1a8e95ac49a316c85c21b7e1c93aa249a615f579d0eef53ae0400483045022100984794682c8fabf5df437aca797d891b94dd36d2a957dbf16588b1f5c0a88e62022076dc0b053f12346c572f330409178b6a404c80be887a78239554fe10ac7b59fe0147304402206645f97a2b10406222a7ec68fbe8e854ed2291068f3b9d380e1315d47f5a884c02203a747d70a1082567616416b9e148e6f2075ca6c57d25d2def07043e75cfdd56f016952210248cd62ec04e38c4aaafcd03783c33a12433821207376514679af6e500c823dd121037bc0832f38472e95a7d308488422bff883fd82c4482c2c3eb44b93bd0763cfe221033be008e07f8b4f69cb318b50d8e3857c2d3f45501a5728cebfae1e9ec390783c53ae04004730440220254a41176113fd91df625bff7bfa4967e35b9faaf966ef6c07062aa94960a91102203623704fefc69ca477e1c989444c167c04276466c1f241618b5ae2d52d3af1ab014730440220702a83342fda3c14e5d69460d56ab07b9b238d03b7a6073cc7a1a434a8728fe202204390f8efeece12340e92613379d2b2b64b3cc15ed480b65e5e79ad53678d449901695221036bf45b6ae8381039a64d26fcb4b9fe107eeaed3702cb58605d7f12f12e4b03492103adb708430d7c1bef7451739a23f7d312d6441a77dd98332ba2fd9d543d2f160b2102a3b642cf6d00033f918f1ebe694ff5e09a6b7a91d0c4731c5a3bd16718f730b953ae0400473044022013459f7ed99b847a96ba7f266ef7a6e9a7d2bbc4d79e97fec084addcf5ad508c0220429e0688fa5237d0c1d0f85453f5e24e3562034ba9e3980e19abfcc961f716a2014730440220390721aa1c336bb822535a9b4370b424746afce3564ba47e65d283deb445241b02203cb45896f6e915b8ba5e66f5ee6332ac6a86f497f62f5eccfe7148efbd3878be0169522102763de45261c4425d6c4f7545fe6374aa34b849128beaa7c2423c49eeecac4dc82102007926ed8c3c6f69881ca7be40e3eb94faab9a2737bd93a5651e18a3e3857dfe2102130fd5ca783039652ecdaa277f9881660b7ad396dffe5d3f30eca0dfdf1d602953ae0400473044022059fe662655b986e522fd6fc414ca95e8d427766ac28c3f92f55dfc748644399b02206d05659cd2cfab7dc9675b68d022d176483dc225c06c4f1a22ae5421493a3cc801473044022029b79e32359d9f488976745d7a7abeec36a4b9f4085ad195e5595017aaf39d3702200479fdc206c97c9bc41a503d2d41985d924f94333d03fe7600ac771e2b8aff2e01695221029d45cdcc7139c502434ebdf6ecdcdd1051038068c3ec57b111c1b5f662d2ec322103c5ebabb961233f35f9f2826b1bdad27980ebe895222097b19b1c6474588226a0210333628a469ca60943eb8ba0dfa30f1e46adb5349ea30fc32dcbf65cee9742bef653ae0400483045022100c8cfa2dba1102c9d59733c13298167180985e47a1f8cb877d4dba907f683ccab0220310431e7dce00c5b174c034aecee72d8f3d4074b8ffda7621f4480890aa8ef3c01473044022031b45140e65d1e1e09a7dc307add997e0b2ff18d76213de52713983aa7b7d27202200aba1c169a17e205d686a3d090b520b17586fafc43eb6101ae0b0c083bde3e4101695221030efae34fc04f2f4d066a7bf043a37fb0ac3dc2c4a3b580d78b03375c1600b6ad2102b763fa8847c950b85472e491398c9f05e69b40b4ae64975697a44a809bb7d59321032fe8f1e0883a183bcc110fb7d8bb7f9da47bfa3eb25ce890f9f29d467d99551f53ae0400483045022100dfcf7e7ab9b1da634dbe9f707eacb1da00d04e6a79f31a8974d03221e545c02302201f77d5abc89e197b08e0da133c1a7e737a7762a72e894dc1518dcdd44afbbdc401473044022075240d6fb409b92f65057a781d70c1d76d67a9ccabfbfd292461f1ed3ead46a4022061ffe3f0673f161443c864237dbd2e65c83bff9d85faa647e226118fbf2e7d880169522103c870d6c88f429e3c6ef81583e5f85399bb8c27ba31fd405b886df8f6e3456dbd2102db95949776d23c4afe45795c520ed2409870b9fcafd371e2692f7931a93af5d521033196acbdfccfb63a35c0ecc796ee0d984ca84566e6cb886a91aea24ac6b4427b53ae47a00a0002000000000101ae769ce00c43ad270fa2a3b519d3af37541793f4d314f5736d1bc49f494b74030100000000feffffff020c36070000000000160014bfc416809942660918eddbe4d51169f5ec4ddc2db683e300000000001600148606e534728d9cc78cc85b5ca0c8b18c9d855caf02473044022026633454b733c8e74710f9bb0ded0168224b14b589af2b375dbea3163eacfd3e0220475390464d39ff96ef431e782cf9ed6614529154eac182e2db5996deef22e68e012102e5bd93aaa7006c60169940f4e4cb8ff2b7188ba73af7af558cc06887f6ffb7c647a00a0002000000000101b84aa6d43b9eee45556aecde47928a945e27bd454026c9c0f63f998dceb9ab020100000000feffffff04af2b07000000000016001481815d7457945fe63bed533f3be79976a45a507f84b9290000000000160014329a6e3403063e245f3c4fac5310dfb46da0311a837b9c0000000000160014c9e95054459b04470f13e91ff8bda05c2e6d385ac91d16000000000017a914cd175541de1797c3b8da3e8aad5e6d41f1313766870247304402200b5ab8a9520554895081eadf6bd056d1204f4a4632c32c100c85a08bcde7a8ee022018378358ba91dee184bae68b560761aa4bd314bf7790d407be35c90b67c6897e0121029e27606e2ab69856fd780cf75d6b18fe2ecd2983d220067efcd21700ad01a82149a00a00010000000001038cd75923071be811605e700c907971fa6099fec77ada0ba9244eed0dff4305400100000000ffffffffbb1c730634810bbd9ffdb757b66920fe5588a88efc57fb0c55e216f095bb11523c0000002322002023def64334394297cef305b5acf2a091bfd669650e53f00b2ec0ca3e0e28d136fffffffff0120fe8b57187d08519327b47ab3f6fbbbafe658d3312fefcd131015eeb17ce32000000232200201c88a32358742ff2e678f7663dcc69e1a3f8c79833a204213c0d801ed962cec8ffffffff021d14210000000000220020a7e2ba166bba3fb71a8285f839afcef9fe22953b69c48c6f171012cb362e872e406e23010000000017a91406533871b72a54ad7d234e6df990edda59cd249587040047304402202891359c0d5f8fc91f6279bed5cff1efcb6b0ff05bf61f024818817aa299d90d0220728e4ff071628faa5da2ae0d46747746f5bd7e363db24a716a9a75475769e67a01483045022100bd290a56c4da0f085f0520047812c4dd9e09ab159b281673a6b6c43d16aaf71202205cc2cf57fc39db1a41238c38dd0f516fef5c655ccc3ea07bd21e6ad6229fe4c701695221029a035239f960df47e8e7b0ce11f89bd07296fbef1a737dd0f064c055562a930221039b4cf4c15e0a995e2b8b054c8b76972f04f9b1c64aab913b42f2c2ddd638f4b02103d3fa52282ff48585e52f078e90e0edfc857586771f88ed0cc200b76faec9c6a353ae0400473044022023d56a08a0cc8e8f81aa02eb40eaf935998a8be0f9f490c4ea1458ebd5a3102802201186faa679143483a63200ce178b08343fe783f1181da21c509854d01b70b5b6014730440220655ba42506fb073ebbea2f179ca526e57a42eaaff7a601bf2c6c63f41f14025d02207d0eabe905c613afc1badd8a30ff5c7777a5eac103046abe134f59d5eec935ff0169522102d126d5a81eaa20bcf961daacf4fd692160e1ef46751d59605b64075fa62a9eda21033aa3ecd735eba6bac2cac21a6681fd1f94941cc6ab324804b2a6da3742692428210359cf37316983baa50e26911f93ea59d10d13d0cda3a31a295bbadb985d4c67fa53ae040047304402205e8dba0f7facbae9c00960bcb3db0c90fc236d5edfa473c12123eadedb3a366c0220277ee14436acb4f42ee486d543a91f106e598f9147b56cec4c42beb821aa86f301483045022100a86dbc9b2e16dabfc71f2911f88591525bb6c674353daee26fc9893fa19a02e102203056b5d16e55cd55707fcba3e6f2ad1f2fc76617a5675f507fecc848fb98cac201695221022fa7ac2e0a1ef8fdc7bde0990dc3c5f90f85ec7a2f69c9b8187a0331d47bdd5e21023009aa19327fcc19eec525aac30adc5fd48ae10ce6de9e9529af56ce7c19e4f8210347f82bd3354046f2111f10d88055f123b6568b3e598ace19fefb03cce229c86a53ae00000000010000000001021174cfc135ef92cec75138d486e06825c2acdb54e12e2cb0f56d17773a9c557c0000000023220020bfb873193762fcfa8e973ef91e4819471505e88438841d26738aabffba7743c7ffffffff577e538ab24e20bafcf2bbd04a163f131709f85d9bc31456c15bf450df5aa9160800000023220020ca6d28ecc65d6b97a1c4087e15729b23222f713cb0c3ddd5dfbc9cedcfaa0a9effffffff02b0fcdf010000000017a914df1417fcd9ca0c378ed571062221eb6d2d4f6ddf87805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b49300086870400483045022100f14491382da62c54701112fb85a99838337e8ee71fcdb9fe8bae910201b7deca0220541308ee5ecbe73d38fdb6af46b8ee483b672e3ee8aec695d34e3a9d339f4a1f014730440220691349c8b1071d0bae5dacdb095eb5136497e355d46af7545110f9d98912b52302201267e0ad6020ec0ef996e32a0448498d9358e5262925c6f4209a8dba856440e5016952210397e501c2b63451dce458285a60cafad84339254bdc532e5cf8af84cade8d158a21025330fc113627af04fd4cf7134f84c3212c6d6ec46a1dbb77dff628b1f55617e821026b6caefc3f7721ae9f21312d79507e7f1ecd956cad465699ceb94f2949f25e8053ae0400483045022100f370920e9f5e58948d7abd832bf6c0943789d43001bdb6fc971de269cc454b630220605fbf14f5e196b8cef4754e9c4f3f0b9b41a27238a82e20202073c17a43756601473044022069a5a2c8e0f82d503d3dab02ffbc9e1aaa591b7dfaabaf3a8e9f4e3c1345b5a102205bbbe69b5123951ddccd0bc0d0fae71f40ad2e362e9701d7177a6de9f9552a0401695221023a2d692ca016317a9e81e815c63df47e37eafbe278c006354a016d7362ebb9a32102360bbb7244ed8315ff6bb82f99fc2c20e82d9cc1476bcc23ee5bb8b9680c4c32210288edf00cadaee67703e5c6a6407ed7035c30ee2f63c1d15bd628919ea3e4422e53ae000000000100000001a8a165621d126525553e9396bb4e17c2e900a5b6cf229bc6f16d8da17cbb6ea9000000006b483045022100f1072b30946758bcfdd911e0c469480a988d413fdfbb65441479c577943b4b3002201e189c9277a0d172ef0a452ddf6c2bd914c01d8ed1a78a43aea199aa516aff37012103f3f44c9e80e2cedc1a2909631a3adea8866ee32187f74d0912387359b0ff36a2ffffffff0261e3ef00000000001976a914a520c86a08366941cd90d22e11ac1c7eefa2db3788ace0c810000000000017a914a58a3a386ba7b6b36f3cf745dacb11afaefd6950870000000001000000000102d673d7b03714fd245d6ea88ececf5a7ae0fdf63e426aac96e60ef61a647ebda70300000000ffffffffff287734e5ffa576f5e3cd64ad2f69fc87ec3f4ac5cd08ab7c8809cae8f2dafc0000000000ffffffff017a7713000000000017a9145bb62de63f3dbdb25180cba2ea57c7092decf6aa8704004730440220233e06dfa4a0e8928a0d379b36e7e680dfb5b8dc1788721dae9490fcd6959ffe0220640b47e1db969b716712d1b64badc2bae1b69f7ce1753ac3d9cc1caabeb77f6f0147304402200a4b44f07af97d4c8be1a0b663c455d43c635822d74d4ad68069104f638477ba0220087786cfd93c4d5ef4d135c9f2fa7ac1b096245c703ce32a149f2b1efb85ada301695221029a8534083d96295f3f59905a66bc335e92c1fdde5c1f60977081475b62ee7b7d2103bceb822ffbbcd2f9ef833f17b74c753d906d9ff94ded1a6d23bea4c539c6e7e22102d068a141ef27de38bc8e39899f58ca84f759b9321e037e279839fc35ce8864fb53ae0400483045022100d898f6acc30198554de2a59b84ba8f599977df0f21b644d5eb806ccbee6ff0fc0220309f49bc7bead7ef8a5f14e7afa48bbd199586ed107c72fe1fc6db39cd37a9110147304402204d474079a3f2383b94fb7ee84015af355e6219229823ed96b1147b4ece014c93022038abfb7048b33f064fd2e933388c57d9c1e154806a91b306ced7aadaec9ae52b01695221023834b93f77f2eaef67a32c5d473fbf25855c0e8dc8dbabb19797b83c868f965421026ed95d8c4045dd79d8082c4c7dc4732f15c97f75ddbf959053266850554fe68f210216b1c913a9b92e748c74bc325887280f67ca6db751fe7e0fb44755b9da79cb2a53ae48a00a0001000000000101552873bde52391cf1893802e6b1221ec05ddfb715467a8890a5161f666e7799802000000232200202aeba8b972ff57468c0fbf2c86b1010cb0491e55c7dcd24d3d4c02c458407a1cffffffff05f2c4b7000000000017a9147429157ae348e48cb266f2d1d1f4bc4ae067b21c879ce76700000000001976a9146f5dbf69464be44d54cc74eef9795dae9ea4d5a888ac007102000000000017a914aa6899930c25311dc2130796e87a0c512de8dbfc87a0860100000000001976a91471161e901363c01787fc810041035d268de5568388ac38c10100000000001976a914ea94d740f7696ad07e06ac20f020ececa487e39d88ac0400483045022100dac108cb3ccbd825cd513edd1344be8fe88e33b4c89f70ad16bebcd576eb92f1022065bc7058b9dc077965822a54b965af326c5ea91efb3c45e8ed563fde8119a0a001473044022022d053633be84cb77e1e12dc01aace24843b1ce30d619448e1245ccb6676899002205c103bbcbf624558e764236030ab33195db42a554cde54e52f25e50c71a869e80169522103a0fc2715134229b89e860c3c1b10dab58f160628d380968be05ec449a3f7bde62102872af3efee55d0c1d06a63d0a7a2d7f6c148e759ddf03fbdadd747c2b4ddd00621034ac85b93c49a11c089415afddfa4e74fb6b5d3fe59e50541cb9a147aed479db553ae000000000100000000010253295db5a9b70a35dd654620b50dc209aa31062db67cda99c0da35bbacf7953f0000000023220020d1983bd5677360d2e8f4eb96025965192f9332cf9cd50f32a1ccb1a7fd2fac98ffffffffa43cdc0afd66c41210ed964f4d4d9dfe38dfe27e542f299badf695c49998154b00000000232200200412e2a7d38bdae7261d82c9950da02f751a0844c9875991274197065c1bfeadffffffff02794d1e000000000022002037fb73d478610264852fc88a465fb33d4c521ef84809c5bdef24a72b678e5fd0340b25000000000017a914c0001905db101466f15b3aa25207e12edb7886018704004830450221009f527ae2191eb5ac433053b2df34e53ccd88f2cd6d05693159923d0fc33ad6e90220192a1bd3a3011bb1fe2ad92e1e61c927e1baad02fd462bd99333b98a0fa3bbdf014730440220590d1970fb7c9918eb60b085dd42805e84e4852b3382bb7fac8a639cbe07872202206b824dedf9c37f5f9ec0635671feb6f96a2ed8dab5c9a409ee78545b600cb3920169522102403ca7b2bda2e6cde762cf9a892ab5f137fe2db085963b0431b2b27bd5274353210341515175c1ee4353ae0c12594cf2d5223448c40ff345d81457e9ce3d17c533712103aa4a059eb67b7242fda0a1e87ea9a7047156961129029b3ffb1caec7a71e9c3e53ae0400483045022100f2fcd3e6b061844e9d248d58f816993642ad79d40a22189218965dfe9e580c8e022029e5dd50bf182e6a08d69ed672a68b1e7554bc174ea19558acf9000ecc98e153014730440220653d80b89bf1fbfc9acc2e8aff485de6862dddaeaa2ff39910636be037d7101b022005d6d5528f5380d7f587c96599302aef4e9fab9a5c9fb8bf199e1f5f5983550301695221026477c5fb6bc8622527ff918f0260e05fa830275387e1db68a992540034e91a56210282bd048e9721db5021157512ebbaead24215806a397ea34ca49647a1f866b0382102d44af065b55611fa5c5285837be88800486fe37ce2c5a648bd414ee1367fab9753ae00000000010000000001020e22bdd79ed6d9ebe23466a9259f3657d3b79319e29635f463772216141f8b2c010000002322002024b78c6d0071128e4f9198f61a741fbb320c979ece72dc49abf26ba5259bdd8cffffffff252aeac069972b82f8a08dd8913c7ab83746fc4cb56a7cd21cf4d1fd15c456e70100000023220020d60f3609283a9074651f9522177e5fd5c1aa4734137f6207914aa8bc3977c93bffffffff03207c2200000000001976a9144b544f1ec2aaf5358c16ce42ab1f9b68ad752bf388acc0d401000000000017a914232a65b647172ee34454781d285026590daac6ba87f8245e000000000017a914c05f597c3404618cffb52bcf6e13b2f7dbf0a8898704004730440220552bd1e0f5707b6634c3dc5e23787fe53e12cf749a8dd2b336490bdf05bdccc402201e4467d97b6cdf9bb2f571563186a691f1230ea8bd171d03443f5c3ff57e299d014730440220747b2ea56bee1b87a54dd0a8c491e51e721e909bd7982afddcd842e3bae2dd35022055536440ab55ebef054895a504ef1912fcdfe38dc7822af76ef7e86a2f12cc8101695221028a1dc3010c7871e50930bb5f0231fa40445bb393beab30572cf3075ac9ba4c4d2103fbdf49f36e58675c6e8c7d9598c6bde4054662332e6a59b0dc8938a93be6096921039fc5c0d91e61db4e1578491ed536ef77e624757d6357054a3695540384a25fe553ae0400483045022100b71b278fe854bd76623f8fd5b4d464ea6a69f4deef977fcf01c2d0aae6b71b1d02207c74b773fbe09415fb02722c6a4d35dc5804ee45ec8863a74a882b7901feb280014730440220228b8db55c265a7e83c17e4bfd6d5083ff459f1fc5fc33f3144c3a43fbad9e27022034d356a74a6aa941e9ecdc7385e726a7aa448186e6838cc75da8ee1b5cfe8b3d0169522102a1e6570f8cea328a572931cea9479a96f5aab2a6f134b7bac0f642daabd7581c2102eca91fc9ef63daf2440a49a5ca943203d366075807ba7d01f7e139bc55ef28e021029a8f79725a24dd23f6814f6e7b6e74bff49a52d35b470b5860ccb0a2918350dd53ae00000000010000000121b9a9e428f550680e082dacec17f4189646271880a030245562cc99c3fa23c5000000006a473044022071e95402a6777d51332d1c1c31c6b423d766728895e55614de5ae55c85e8a01502201e5452429343367df3d525330c63e9202675ab8c4f683be534751d4e1c2928f70121037a6ecfad67a0f286d8644c5ef25f2eedd1d6957f03deaaf6a4bd7e127898d032ffffffff02371e0a00000000001976a9142daea31982cb181b0f3b27932b6319ba7562a16988ac482600000000000016001456145c39604d8f01f89b8de97174afd36d81b91300000000010000000001028a769ef5ec87bef0f68da75805cd180043c2a3a9f36f46fec53296205c52adca0100000000ffffffff455795e54d03bc13711820d7fdb5b8d41737beaf6f04e4767312759ad4f8933c000000006a47304402202177f4361741625a31f7dd08632b3a69aaafcae52b683d54e32a418a26dea74e02200d3d361d296e7182f8cfa0b7ebd5ee66d7db3cb59addf6bbe397812fb29cc6cd012103958edf995b01d98b0f5d4dd2806215cd39f04acd957583cdb697104b349babf4ffffffff0224f5010000000000160014ef2afe76b971ba475a12a19ad60ce102d84b4b67c09e0300000000001600146d1da4bdc5a21a9f8687f3632d34b3096d1939d602483045022100a358401b267e521db2db8b1e0eaf91e057cf738032d71267a28591e8cb6a795c02207f8ce4cc14088581cd082b9c7e85d9bf94078f9ff47f6dcd4815aae7b893379c012103c2767f3f054ff8040c97835ce083ddba952a7c920e13273e9d3a399d02ef6c83000000000002000000000102dd91e2eee43e0d8d403b5ec633887bd837a0513efffd6508f62ca1af75f895a4070000000000000080ce874e63a515b687a523763b7537100191c2e47e44f25cd3ad6d10a58351d51c01000000000000008001bef40200000000001600149215a1dd8e4807e963e13c862c70e803bacbd1f5024830450221009098080cbfda66d99be394a55967cd61a0e79476f7cc06cf3c6fec08039ee1ca02207212ac9b5ef3db5128496baf45d77f624c19b1885b94dc38b39ab262eae065c701210373615b3c089d2685b4a5e9eef5c19301e7dc33fbc0b26a05e0eb53c34c3b2f470247304402203a74eaddd8b1b23562ce7e50534d135111cfc756b1ed8af062b2ade51111223102200a881314603edb8af42240528e67a641b5379e94523bf11c925f91b541ed75d1012102129907b5256472fa4b0f9710182ad341b5e7a8c0228526f3ec7c02209a538d1f00000000020000000001025015e8097df8aefa6876c5fa4ac3486cb50c15a884f56ad96d923a9514f271a80100000000ffffffffaf26b8b77be50af8709c16062808b80e634d17f710b8ed7a437c3f55a69bc6d80000000000ffffffff0220a107000000000017a914178b498444ff5b9d87f1c35f16902624ddae482887f8ce1700000000001600149215a1dd8e4807e963e13c862c70e803bacbd1f50247304402205b76529426ad9a5e90bac12bf592218e625816e7f1d9dc23641c655c9568e911022027ca2ff1539dab0d606b73f2c5a015dd396d3ce61569df559929c631a76f884a012102a506c085059d59ab525e7d4bb5cef16ce0a0fe162223d7c181d0259c5e9477ce0247304402207177f65de74aad4878c28df6f59160030e31811e97f2a6ed71f55b5d10a190e6022040a6150b43a5261b5e9a66ee3d39556df61e8e49ca51e32d4da753d70b64e4b6012102a506c085059d59ab525e7d4bb5cef16ce0a0fe162223d7c181d0259c5e9477ce000000000200000000010174f99da294aeb44b8e18ba7890df111a2c9bd9e4b143e462d47473fe743824eb0500000017160014d4df5ac39463363d49fc5c18bd4ae2edb665d492ffffffff03679b02000000000016001429792e4e0008880d8fe3b33a0824b99487d5cafe56650f000000000017a9146ffb1f8a2757bc7ed42b605602e2f610ea1b17ea871d1400000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e0487024730440220700724e08026d6707ff4f807f0614eb63b74ed2d76f66661ab291070904e1b1002204b6bd509d50c0e59bd43fc35f8e3cc4affd81fe4581c87a84f254a4c2142490f0121025e7fa0500e4974de4680b25108c7537f18276d400bdd73d48f7e8f030931e2fd0000000002000000000101fb2c29bc712951f262e9bbaffe101cadacf2ff67a7ad8c7e7207fe3c17d8bf470b00000000ffffffff02ef8602000000000017a91422e2541fea68f68ba94c036b8867b39195b95fe6878feb010000000000160014bf5f283cc0d61fd63f19f65122334d2389a536c702473044022046c298cedfb147e594b44cf7e716a675f537c510324d9463842cf39f8fb5933c022058a44e6b5ad58baa24a1d1428093985e59c1757f2db4309dc95a4c0d7e0922a70121037a1d94dd929970a7abbff845f6ddcb7ce3cd30071c6a5ffba445cd2f3b0d3d2d0000000002000000000101f07de85fd6425cfdbff2506f68f894f5aa98bcd5710d50b3827e8ab1ef66a4cd0100000000ffffffff019fe601000000000017a9149ed881956e8a1d837903221d2106625f7193375f870247304402204f32435659b28058a867513228d094ba4fe46af779aa9dac81af7072c3c60565022029eec2193a352756d428b6dcdcd4ea749c2d17457cbf593b6e797724f4aa31ce012102f342890bcc3b3b2bf2b5c8ca61eba87962ce4044524a0a88e23e38335654d51b0000000001000000000102d2787e4c860d573f78acda517104fd76dc50958b960996f0398d2aa97a34349e0000000000fffffffff2fe9433145b35238ea18eb4e2d9b69658941896d0e1e39ecb00c89399afd1a0170000006a473044022050d386a6440501ec008a0b078f5ca9f8f958cca07c9224c365bc3ff6637494ad02207bbf32b039e5ba01f6b044b8e72b394dd8165fc1f0893091da0a3ebad9df897001210339e9f97ffe13e5b2066fc37ca89a99569448e69c40b44affa12d66c47b9a89bdffffffff0200735500000000001976a9143dd8d0ef321414e0101fd9b0de61c93acedb03cd88ac2c6500000000000016001435f40ccba555d619d086905f9532101551049ddb02473044022045d8c2a3d264d2995c913cead8bb8fcbccf8df1298b63947e0c8dfe5b61dfb6402206796050cb4442e1b0c082b6b3b5accfccf6a216a039e4ccad2363c0a578e552301210326939cc4614c0341e493ee5c00a7cc08bd14f948b6acf5a23252a348d2af677a0000000000010000000001035049f1065c1bd729b77b45dde914d542f88c51ee30af85a97d36a3dd3d2f56a0000000002322002059bc5cf87d0f4b7b9e7af6fd9a7a38f539dd16c3026766f30a6f933094d341d1ffffffffc28caa1a0899f1d7866ba95ef9548029e23b8301c16f5ffa8b279226a14528720000000023220020b0189bcb0506c66cd90a428cda359d2561bcabdebba9a68d58b7a6fe6bc456e9ffffffff46924cc28df09ae63136991ade704ab61e037916c48674db8f3a5b041fbba3d400000000232200203796ca87c0995f867559f57cd0a7cc56dde39dade62d9ae5389f49704ed1cdc1ffffffff02805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b493000868771051b000000000017a9143f86563ce72fa911ec61a6203b8bb8af602965bb87040047304402200a9d3444eb05357dcbcd1e2c4adc4d463bf278a36d9fcecc7976cee99ad252e302207c4bfb6324e5e06ddc7e2ff37771893d33c6758ccfef5a55e30f23a144f9fb3301473044022058a0e692c8a236e49331838e24472636f592ed90a547b0244b320d348c80f2a102206de555d34e5b1fdef3b3334902cc0cb553582431e1bc4a9cf450b1569de817900169522102aabbf3147300e44480d390971af4a3d18e36e5f9015feb5f70255437a3b1f25a2102c8a9083bdec94e401778eeed432100c798000b40fbc83c6e5c3e65f19551884621033c6f20dad4f81c347bd19b9d59cfa5555056d378b33056ad1dfaf28df220c00a53ae0400483045022100b8cd953a220b5ac957c6f8ceb31797616aae64e69d458221c74dbafab03d728b0220733295e8b9e7d9a990ede2aae4ddb25a2ded17f6ed82334ce03b547bb16ac34101473044022063ccbe144b703729b76a9bf3b73ee7ac0c81100678c5344e857e2b5101b75fff0220467c62b82ce14bb570a31ed675bc1e01aad95c5810c4b179345d4e5658de4e350169522102217d925a0c752b827a1be2ee1d16bb0a1de31555f5e6871a3d265e68c22ce07021035978eab023f5a68b1f34a36e6a12473dcf1aa26a7a93b1c69872f15114ad55a8210212a162d4e8d6e470ad4c2e2292dced7f88a460316f5d04cdc0b1cde03c123d2653ae04004730440220325e19cb764f131943fa5ec78e4a7e79b7e0582c43df86f7bca6b99b7d7166e902207a0483f117584ade6a7cbdd456a5bd041cc54aab48de264b7de0e7d005cb3ade0147304402200d6fb1b705d57e7140f0fd235ee17f5d318d4f7ecc4e4c1482f27e54ff871fd102205e61ab299943a0a315ed1c1b209473077153b77b96b4939af6f9b0ec50b6092101695221036bd41a10e194b24a0d37f993077b4e5950d35bf9c17ce056ce876fb37d41f4072103bfaac1c648ff116aa15f297381505c769b545e4fb600f87f2e60dfcf40d8619721033522bc40e4d704517ecb52dd1e148cd14379594c259dd0ceca93527242692bf553ae00000000010000000001044259681954d2d66542eaefa5f82c893a0a1f2f804ff32bf16b0e702a58b7260d0000000023220020b011455b74b2df913a3cafd53a473da2f508400f28ebf6ab0a42e0c11fec0112ffffffffb7519fad3e6ea41bbc9336739786cce787af40ff8b0d4bb5ea314068462f8c3c010000002322002086f400d08d1deba156bc894e0275e40de7dbf9b584ab64ede676c12ce35d648cffffffff224172a9d59d6a40495f74075a32f7947d1353dd6fb3d899f04c6d685d649d8e00000000232200209d479bc2de3a8f258d0913088ab1e55ea73bb43e38010ac366d36fcaae0c66faffffffffee46a6b486043625374635be75d3a97c762e117b78c120e21681ac894eae08a803000000232200202629627d85586e4c80b347dbf669b09430d885dcc5dadc7554d1aa9ad0cd0e12ffffffff02a43f00000000000017a914e5da5bb2e27559337e2bb784eba26635874e2a3b87249cf800000000001976a9146340f1908d1c5e9bbabf59867dd4063e9599713f88ac0400473044022033d80de02a2f7d3495928d2699981c2fe75d342cf3094ade6357b8da53a6ad990220426f2efa047c1c587f37e022133ec4aa18bdff3317d2f8df1ea5477c91d92e6301473044022049e5bac58b098d7f66db9b2368210145aa31bc358809a0e65173701fe2cc897402202cdfb8f516c3c5a959d2d8cc1228666f5797c1a6c27c315d9e8d13128de5a8dd0169522103428509cdb89f5e5edb385e310744c8ca094af05f825b34babfb6c4ea5e1133172103956463ec8e50a4e989a3f3d57c2a6e3a47bc8157740b5d820edda0e71950c0552103ae47cebaae2384ce21a04dbe9f28c9b5b84b739a5970fe6a159bcf6ea878245c53ae040047304402206c84808b39de3657de534d4987af922ea0abbe66946804323f0ef27df526433e02201bb24665ae8466463c65184f2eefd40e89aa7f11108a8d33b3d50e529333f8d301473044022044a3c1aeb7d919179b11dd7fa84c8b46fa4b4c5e2fa9d44f52fc8ac19340512e02201ad267551a79f6a723008cd0a7cd95dd86c1fc0ba03278800ca05c3109e543cf01695221037193d9a36fbfe4ba8da86b2fc0a7a602e4e43ed4e48c7928e5cb119de00b247a210274d93c243073d8278585b75c58821247828564af429362d3b9561205dc5c8fca21028a1c41e298977d89309ccf404d248e246123609cd9aabb720794f551d94defa953ae0400483045022100fa848a33384a1f744c55308316d9efae103d135fdaed205ddf877feab712875902203404fa709189433a7483c6adb29997b08a8f2b43738e543a21ab20579852074701473044022005f35d6fcedce2358939c3822e8cb109ea16dc8602789d04d91562435054b924022031a400a8320f6b249f5f1e4a9bf04f51870a1ff33b8a90a983badbdc99be414001695221033aa7468fd499271ae4b7227da782ef973ffb328f9bae5c482de74fabb91bd0212103c4ab9f5aeef653c62aa0bc04f8cd4d61d5a0a13448dc1b642b6fbca37128afa4210304ea8c33a7cd1f92da885c3bde783a8170defbd8e182c58db92444ebd47e87a253ae040047304402206b88f14048ba5253381bdf70fcf4fdd853edd4506a3370d36b768d1ac0fa6b2c0220725fa2e5428cc8015b651db55409aaf020e2172921709e2c958b90f012ebf1e30147304402201fb5cac954cad87f85a8c62f684e05de5b50a87a50802c4d9b255acd4e16257402205bf4ac6c2975493ffed77d7cee11b8c1ed1013a1fbfc1d094e098080820671a001695221020101485addac2da80bd910b1f48568b6cfef4d1051f9be5ac3d5adfc590ba3602102db9d28c81b3251417c554181b28bde187a3e412d0def56c174fe954aa064bb0a2103055f90236a314bae7014bbea56763832cf49ecc393ae9f0dcd6b2d1f2f0b578d53ae48a00a0002000000000101fcd181c4e85a4451b19e50553061461134c0bf7e871a3498ee63fe033d8df2b9060000001716001421d900734b2ce2ab6618bde8c013800059f1e32dffffffff05b04956000000000017a914d33f4d304945c6b4bf80ecb43a72b2eabd123f8a878fac01000000000017a914efcc0a7142470a9921edd2040ec1abdfa3470cc387237e06000000000017a91483a59e81783ee9459dcf5ba3521c5ac7d70a03bb87080a0c000000000017a914c7020be73548e008261d88c3248f80b18cc19a808730c127000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e0487024730440220760bacce56479e3e20c17d0cd7f75cd82e3460b5972842c2135264a4e6547be702206e267879fb8342e4ae3c5d7c4b77e6cc482cb2c3332df64c9d645a7d301e6e0d012103489c725b39c4090b054d12823f1a3c0f25828b84c7f8a68e435725d90fa289ec0000000002000000000101280523577169f29b691d37359c9f74b0f96486b8b073ce57c62ecee9788215af0000000017160014c5e8332c1c9f9ef45a0c9aaef11b9c4f66d43816feffffff02e977c6190000000017a9144c2d116b68a7d92b42b239d1adfd56dc876a59f887804a5d050000000017a914d4de3e822689e1d1a4409305aa30ea4ce90a48e48702473044022016753613eeab105b15405bcc52a2dd3fb2da34285651cedac24c29e05b08e11a022018c2cb80d4e837938ed325cc86eb34fd0427fa7cbff68de4fa04cd5f672c721d012102f69d7596a6de787d54bded690d13d77054021c99695fa0c441ff159bb50b6e1047a00a0002000000000101f86fccbd50075f3ea829dd71c0074ae2d51d31afdd3cff129d5ad1e2926c15e90000000017160014c7b5c624ef810542021fee57eabcbcaa616fd96dfeffffff02c792d0130000000017a9144e99424626d4701bb2d553ab6d414efcef5275808700e1f505000000001976a914707d38b786b8280c3db603cf76e0ef52017e8b5f88ac02473044022015dd8bb7587ee5f04f5ff02b22d00dda0a4b2555f5aaea7d5b49cec78ee1e54e02207f2fc53fd0274cba376d38d2d10d188ab0471c603bee4ee03710cdc017f9fd0f0121022a4ae9b2cfb9e92cdc09d6a90cd84dc9897696dbed2e2a84b0abd4d90525369f48a00a000200000000010157310d2f02150839272db7dc010c889fc06b3d828f7eaa263ce02561a24b80ad00000000171600146acabab0f0283f9dfe019f671126b3c2aefe7ae5feffffff02b0feea0b000000001600146c7242f84610830d902e5858259b3e0a9355bf730e90e50700000000160014814cc28b45b119ec24a202bc35cd96e66f810a210247304402206243464d07455096c4bae49404c76dc1a227677c8d60235f4705ec54ac7c7c33022068aae9e4a0da0ac4aa40666b598d965f44587160e9078de13de5dbc17117b459012103889614d2b0add0076a444e5019fb223ec2bfd672b0b879c52c4bad4eda94b3bf48a00a0001000000000101552873bde52391cf1893802e6b1221ec05ddfb715467a8890a5161f666e779980100000023220020b71e6b9a338f81c09158f10bd56069fe541055b20a34ccf99197a6dbcf4a63c3ffffffff02ea354a010000000017a914f69cbdb7984253437320e3d5177a74d7246b257887986c0000000000001976a914d24963073152787703aa925e1ea127095ecf03af88ac0400483045022100dc29dc9e46f1c3334fe13a2c6e05f56b66f929c2ede8842140ec8dfb74e1c274022068fe5802195f5d19e8bbd1062722d73429d2959dddf864ad8c73892f4c30dfad014730440220626d4119524a53272bac5c33934ed19b1d889a36416147323bfb52898cf2d5a4022032e3b07c9fa3ca2e841b86416aeb9fb8b7dbee5651df7c8eccb274db20f8ca850169522102c09a3bcf45277cceb75a225f4747314ba6808bdae3361a301a577e9b3b5ab7df2103a9e1b2bab5f6031be2b0260c138a915516c0c7001218bbd3999a882f0195b93521036d887dfb3f8203e24213ef71edb9d6bb37ca6331af8e2dd62a6a04d72583811353ae0000000001000000000101a38a25dc066c2d63ebb0211898a7fc0a0b4c2395368fc9093f39b89cb59e14060100000023220020a3810ef9ab41b3cc2857670277c89c64cabc227d31ff613f87f35bf474594accffffffff02f8ed0500000000001976a91475fd9a00b42214a598004319867e28ac23b2d05188ac8aaed1000000000017a9144091b137a585bdfd4ae99ca5f4e2db35c7e407b887040047304402204b38ba954f4717c260bfba9dff07144f0b6c28a1e06a463b549fb3c84f5c2c3a0220130c97d970bc538eff3a08709b47e22fcd95457092217d3dab6f201936e659a20147304402205ac260477c455672d903ec239e950bb03261f5cbe9705935397bf9191eeb16f802201c086929b7e38d72686bd5087d7799bb2cd893b8bf6a12b63e1547c2903183080169522103f26f33e8912a2f4ae906097e8f86c6bd715e3b6c7fc3e91247655f6126b7573b2103e63875da618e03b036715b2ccc4aaa4772175574d48eb5db4fb9242068265ceb21035248d3b8ab52b11ee67cc0c8dcc6f57d3b91dd40ea1a6659166af242ca12c4d153ae000000000100000000010524cead39bf834220549f15ac62cd2abf3abee4c8858e55ff8ab8d78b5c21002d0100000023220020ec8a7261f5aec080a17ab146d3a5883c65e4d58c266e32253cead55ac824c814ffffffff13a4e915ab56e87701a29295e9cbcbaedfbbd45510ad51d786baf268bdbf238e1a000000232200203cf60988da76f281bccd723bc37bb6d56e04af1df8ae3fc892db16217870f3f6ffffffff5b83ee96ec57de1f881b1a380463e425a5384d00a2b52c829634ebd776b28d970000000023220020560cc55d3ea6a2ef1b128a725469b6fd1b8ff5486d38fd984e500c9f9511dbc7ffffffff75ebcaab56c03b72571945034a131305ed68070a533337e6d63d0da619c0afa00c00000023220020eb1e792da177a1f415e2380fc4348696f8a9dca6dd408d20e79698213f44d6baffffffff73a764196860faca8d601ca535ca84e0f140de62b6090825bbc5d4fe40a698ea0000000023220020c9fa87a5c3cc63b04e67601ab3b800a4c9e4db1438e788a4f3540c8e0d2ae706ffffffff013b3d0700000000001976a914a298c53498fa62502e46e726b89e7461b4685bd688ac0400483045022100bcd8f3ef691c1f4b3fa7c0fa1c4cfc0ac54a0b35bc83e3104f9c045dd04cf8ad022023d6116baa1fab62f6b24270c423f11e203277ef5015c3ae2d7c318aeb273ef401473044022044fb0813869ec818dd8e6409fd830c1a918df645d7e8460f2c37c37fa6b047e602200feb96b15a1d429214896aad4f54f0656b5622c716e1d6ec6a884fd9e7f57e6f0169522102b8aca2c5156d057c2b0622faba3a545d331f674eb64efb1ca48bd5f3c61d6c7821034850cea2fd6675d64781fdbe1e2ebb92f699e6138b747936ef100f348922056521038bfcfcfd657a404cc177b77c14e10277fa167556b26cd0fd045518f4781a69ca53ae0400483045022100afcddef7792f442b134eace54860e38bc49972d3ac16cae3e177226530bcfc5302203ac81298c333fda29b08319b487f75cc50cb9f0418d813ad50e6bee3b581b2b001473044022058df8e7e74bac22b3508a731f9d643218132aeabfdf6cb80161823ce64b3ae370220057591d9e6316bf446cdbc9c6c65fd27b0654f54f7756335cab3616ee46acb0e0169522102cabec589973a637e505f5fa1e492797d1eb59301be9609166a7bbf1a33a4c6062102709e79d0403cfe507f91d51bbfd4043ff949e797fc280f740f72438905ca8252210374983df2fb70ece5ff24f22b5bc2282ee0ad4cee838b9e17bd95abc5fb0519b453ae0400483045022100d5bd1a0255d974e3f106ca5899fd05d2137d6ccff301274ea31885134a104f2d0220611d628236dc7391741a8c4d2ac579c054b8f6415e2fdbf4751aa87bcbd0c19d0147304402200ed30c9125560ccc1f5c4e06b7bbace3e54a26dcdfa463495984953b08188aae022004970016ed404ec285013656354476f443dd9216821bdff653f91c54627231d901695221028c36316e3f0806e8a8b263e6c901488797f8275c81ba79f4892ba4c88408e21e2103a5d1edd164f8e9a36e931ea4c53b0e963d9493b6d8ef83a3e50222cd50303a402103efb29f17c2f73dfc590bb73cc1e7a001ed4fb0cbd2a083a207d998e0f47c166253ae0400473044022030f65a920697d42b8b80d54b7544fbe11878eed57b9d792ea52345aa6651a3ff02204486891a793f00eb766dc8f3d04559514cfbf45bd66acf8844d108c8a18c701c01473044022009c0eb517d4116b4ab2c4002dacbb20da2e5ce114091c6e890e090aa5fd3a76b0220384d360dbed3736f238817eb3ad5e4ce09ff3806a71a66f737b56111e752cc3801695221030f8785126660090c189d2c9324cb21f9ff1d718eb3f44ea3bb3decd090b9db0f21029968bd3a9aa5d8d1bf99fb20671da724ddb1ea7081e5eaa93c7e502016380a922103084f7027f37535e8f1281a2e2f709c92aea2a4721977139617740a822d946c9c53ae040047304402206694aacc84fd5c34dc6453c7feb28b90b91af2fb7d91c5b3e6746d2ef953461602205a1606d38771dfbdddc3ac71bdc8b16231c872fdda3b702eae76d679b50e3ba60147304402205285ede6e18b46b3f82c3be37971a6165fb0e4e6630734b05ceba5eae03d450302200c8d0d5f8715a7bf52ec77d7f304877ce5073ee5243d9bd6968cada248429c080169522103bbfda4184edc3667d86371fba8d91e8d149d1b6d08609ff1a469e07b5c5006362103bafc305dcf3440d466937f79d10cb6fd93391bbc00003ae7bd953d7fafa3338a21029db7cd13b01b6737480838c78480d025378664e86ce8513b5c6078e11ab2160b53ae47a00a000100000000010128ccbddc0c1346c747f6d8e356796c3f05f5ef3317d3b9c1d89ff2cfe9e72f7e00000000232200203c5ca226c6fff6646c475d7e2ece190c3a770391e8b37d870f8b5243a632cdcaffffffff0258290f00000000002200200e7c24765646ced46abf1946ed117881218177e2da96c6369b5d4d971b12e7474e811200000000001976a914cf7f6bda041b99c15281ccaeca18efb08a8b6b8588ac0400483045022100a0bfde0ccff41c3b3cd060cc9916ffce4fdb7893f08b22c404d49a260875cbe9022070a246b4ac466606488790e89ac8c6fa50d04e3485db5c0d9ce9307c8a401c170147304402206bbfb5fe1851a9ff7e9b968964a47cf4a06fdc59f14b23bcbc527432a0cf5fda02204a9b591d77ba0d69c50fff20aaf00219705806044378b2c1634ef94ab28d939b01695221029fa0d95fdcb4a920af1671afe9de5282977a70ab4b5a5c352a6868f413cfa0692102d57bed65cb4e67b03730a2d4f933c758b70134fe8ba9e51a8cdd3643201379dc2102fe964ee4bbdec853b67a09ad05e9fcebf2719be21ffdc192c767d6f376c6cc8d53ae0000000001000000000101f6f28f28d1282bef2c4c6a58155cd200da71fa6bff1c5f82d90aaf50117d0f9f0100000023220020c5896d42278b964a5aeddac69596810a98b59bece2ad3974afab368074b89b98ffffffff0269aa0a00000000001976a914fd7653077d2ff13bc476d8db0d20501d66c1277888ace500170000000000220020c757cbb36ae9e01d58314c6219ad3fc3c8ba7950337cff9ea0ef84dbdaedd9a404004830450221008c432d0a987a716f3178bca29ddbe3f72f73e9ae0ae991cd05bad1ae8c8da957022030e51a4521a98bfdf4cf41eaf7aabcea35015df2e7c07c237f11c43773c1f63801483045022100a022bc4d74c1bd7a9093405b618db154c0177d5e122db166e7759795e167dc0702203e924009b32e04dfe711e6c04901d0a1910f9232a85ed1d2c0843a9c77e12d15016952210260f50780688c3165740649a99c30790fd33c8dc7aa4b8dfbb67b2507c757494921028ae720bbc1f19f8ec9b1002f1be753f5ba9affb9ab7ac84d8c3d4428f341e2be210347817f4ced927e6e37013bff63bb375a018ca87a72a6426bb067eb641c59d79e53ae00000000010000000001026ff4c0d90ac8b12d0d5b128080a8abd0a559121dca8edef160fcf879bb92d36a47000000232200208ea20467833aa49eb4f9fb5b26712259e4643ce91b8eb42b92be472b3dfe0590ffffffff15c663b0b14a7a645a1a8bf0bc5a79eed3f89fe62efe0db37744033b0e5b8fd7000000002322002081c3e238603f100fed31206e0139aa7cf639c7ff46dcf87030ea74aa5fd3b046ffffffff0151dd040000000000160014ac6259c0dcd8f5b6a6268027c9d53c3bf044e14e04004830450221008e79079ebaeb032b9e94f1c323294e106f84691cc76a6234a47cf99cbd4fe4d402202b21d0a7cd13b395ef2f93726b7be214e998ec4cd2877a872a09388f870d24f20147304402206dde56ef58bc271fb43d9dc0a0e39c5744667c2f214dd13c72f3860af8ac7ebe0220432d14e240ed8dea67e97d83f38072ff1553f0524b2c2ecc0482759eda70d8e10169522103286a11552822a68e08e7ccc9ce07b88698c046f465fbdd6f4c748fbfded4914221025855cfb042ba653f32d7f881c573a904cc81109c6e5805b63b5e6d151a44733d2102fdb9b648b63557a1cf298e9b45d63521dadd36f78c5dff87ac6c2e145bd3258e53ae0400473044022009acab0d722bfafeaec6fa1efb44c742920c77a519883ec2fdbc957fa455159402205c124cc772062022a21de99c860447def532482bd50fdedc3464ea98f6dbc2e10147304402201de6fddbd838cd479d6be535f4a72a44fdcd5edd110e2884ce30e05565ddf07c022001ae6cd5c1c59eae94d4fc29670afe813ed230f4fa681aba6924a3fb51ae851d0169522102d40a7e282989d0566f80214ed9196b57f2e3d2f30b169015a4966dcb6cf807ff2103713ba408c15c7c0ad496db0f4c444c15ae453d031ae3b4e085e5ef7d917c17bc2102e9767791665d653c837479050b19aa3948c7388fefe19846ab0a5d03a3e29a7b53ae47a00a00010000000001075b346232e822b9ac5b84f3d01fc758c926d15249760d9c5385cf9f63acf0f30ec103000023220020242c97048d6f0a8a174d3794e6c6fa442489ad25e1844337c9d64b1c6116676fffffffff5b346232e822b9ac5b84f3d01fc758c926d15249760d9c5385cf9f63acf0f30e180800002322002090336c11503ea4ce2b612e95536b127b977176f0fabf3195d51bae7b3281dc77ffffffff1e18433ee275d688357baa82a1facbda6f639f80357d20ff9bb096358a43a3310300000023220020ad02bf1498266ea2e3694e42941e1d4bbec29aba67de3d123e493a02e9c1bc60ffffffff015594f556439852dd437b84580596cf08faf6f9f58fdfe40d70dc748fbf22322000000023220020a00b8d1373f59f6058b93acce8f5744c611af43563087066e6440b0ce5096149ffffffff015594f556439852dd437b84580596cf08faf6f9f58fdfe40d70dc748fbf2232be01000023220020d2a274425e0ca6e867dde508d1259808c8de72bab9d3ab5690ed510ef1170ae6ffffffff015594f556439852dd437b84580596cf08faf6f9f58fdfe40d70dc748fbf22320703000023220020f46571db93b77036023106435f61381d52d879ae9f4efbb202689e22e7cc4940fffffffffec99e2925d3bd7287186fe8481afd6a42da9d9d4aefd84d632013119e67dd60480000002322002069da989990f54f3fc161c7b560ac7ca8e3e1087f4880da5d562dfe36088d373effffffff01547121000000000016001424e477941227280f200d1d45d813bb1d1e6cadfe0400483045022100e56be84f7b01858f8d7f527543a0175a7c93dde40a52bc2c26e91d7654aecb0e02205bc9490e30b2801b13ea9146bf9ba6346180e3d12f23e1497e33a799039e2ca50147304402207a07af21fab254a75ede505123b98f91f14fddb5bdf452d772d3e5b6f687b21702200884af2e8959cbf6da681d42f36cbf55fbf71b1061019772d116911ca06625e30169522103a007dcaad8960c9ada87b97d191828eee479eb57e669efde55aba48fce3ee38c2103d9713acfbdef88de2c2c920f86ea29d5e776a0116ea29c88a7e1d14695f98e1c21026576b9cf1ebb928a28c5276ada41cfc15f14ee920733098d40d860900f175e8a53ae040047304402203cad8370d9269bb22eebe9bb2f056e2cb349f6697b5647ec240ef5fb82984a3502207f3c6d976bb8eda37c2191ce8f486b334145ff5f27d57a4d49ca381f52f206970147304402205ca30cc02792ae2b0e6f72b299fa394d90f9219f24426b7f42c540cc16435e6b02205dacb6750b4c799e8c3663289fd0a28a607ea32d824abc3b91a3c81f0e3279b1016952210310237419605b1384ac84650d18b549e9fa06c692f62d89c368e1db2858f676432102724f2818950f85840c2369fb078c01e599c785f41b75bdba922402586a90d99e210300f6fc59567c9273aada8482d529006ea0b27375062dac6901aebe538a5f9b4953ae0400483045022100fcbad200ea0f81e39189d072b9e0e7e73fa5e0f3943d731db0c0dab5c29189220220357cdc48e2cf532c65231d9fbb9e2a4903c4d735c8d5ca2a56f488071109771701473044022042751a4bf27bcaedaaabadf76dfa7e584865bf054e5b941eedc016a03d05343e02206a6b832b0b9a497212486ef9ed8f7e839490e595e37fd6ef8bab7c92073d27cf0169522103c1e0b625afbe59387d9d1cffd356b5eec8f0eb8e15cb1be5fbddab362972637d2102d8cb93ae0d8adf60ce10ebdd411ee03798a2497f656de16050d7f5dc668f1835210305b3e74b43706b48060c3e1a0ab05c2836cde0571f1f2909a943a4fa643db97053ae0400483045022100a32f5d3497169a1daeeac18f04bf71cc2659a2ac18cddda66d105b429ceac82d022015760dd44b7d197a494068ca30ab36575a89ea4c5248b091e74163c3d0a28a21014730440220662f751ff203f11cc9d3a9b48e3e9377216608d110f2e43318b45e2615633b2702206d9dca28c19a6f4230518bd5672df5ae6ee5e1ad7d8ffdfecb2c7796cd3dd876016952210320cbf8cc184860b48a8180c563d506931d4e38d337afa6134d36ba704538489a21027f2ba1ab6814f364490ec593111ca0b655508281e22c94a3b3d2eb40b757a1a12102aaaefa2c87e8f58947ba1218def717e28923923584190d74c7cc4786374d06a753ae0400483045022100c45859520b164a126b07ba2a564f64f28746b8c4a2c58d23229e2edf040c7c200220705f0b0a6c8009546abc880e30084d9917b96ca6e8e4cfefba07b022a1f5128f014730440220714486c0daa857e9727651c11aefdbd378af889d1bc8cb23dc2119f1aeee75240220332610be353875ec4e98f05f51a00b58751bb61f0d582cfb5c8d61170fde18800169522102fbcf70a709cec222babc7c0ea76b54d7cbb49e013957fd2667bfaa4e1270a7862102d6696df407bc9aec9d7c35300e2da85ced003f9ba0c2ad625f452befe4381f6921024db95c62bb27245a05a384e9bb1393616f35e4ff49b40bc9cd4b017f02b9a02153ae040048304502210092ad48aabe657a07d08b9e826c49fab5af31986e37bdb1feafcd9acbec0de06e022006d248c2e5dc65446d4aabe2354278da59e0e642cbf3faa7c7c12a83d4db2c470147304402207859cacc3c49eed2dfc3fc0cde14d114ab640fa8d1d3e85fa69922416457cf0b02202135b49cb3a695aa580c371aaa4bede320e5eb0adf7bcfb81bffe57e41ddf0260169522102c9dbf87c4044912193f60b9045ae949aa4244b817009754fe850edbe8549a8432102cf77a0d7e87db00985f7112fc6efa8a272e491bb8fb7a4d1ad5f07b27c47e5c22103facadf2f342a166f4d08c014c028ffa31155e99d982faea4139ad9a3dcaf85e953ae0400473044022078b5de3ed233ac88dbc547da8606c6bb591888fa5372013c9743ddd5fd72778602201617a1a8a257fe33d7b8ab868352b5c1bb09abbf7a9d80544c78dde6b207adb701473044022072f5f5f9a3e545f202765049a06f5b96f7cbdc78ed90d62776d1afbff8ad4eb302200a1b568b7c7241c2218ddd314db80326298a78c946f43cb9c8f76981b109efd901695221037562e534f025ef5e31f059f9b3ba9c710449a555934e05032b1124d7e4779d132102867ccdb3645567934c413b0ea22bb5931a0e62b579d4ecafdeea92f9304050e9210380f3a141c15b8a489d91526e0f5e1a627d015b2487dfb33b20da92184a89831d53ae48a00a00010000000001012d18deccba52344a161b27dbc3d3ed60f39ab221100057eb8f3597092922234401000000232200208cd3543424e3c73f216f78a5e0a8f84557c722e696fb7ad3c99acb1165ce915dffffffff02b82500000000000022002005861663c7380172555ce6bf788ab847b084d9d41148a72c8e947fb6d9e311cd8a84010000000000160014c9f92cbc9889da40c8ed332a6811c8be1ffcc5720400473044022061d7afcc6e70e918772a0ca2f5a8ce7d7fd2a033e3ff5c0bd8878e39e4b65c6602202ee655638e107ed2bd96b134cf9350c5fbc5d7b9ff4208ceaf09def274ba410701483045022100e5cffb2356490c700c22d6e67d6e899d4139d5edaab12f9b6d137280a5ef1d2702201e61383624af506339a2ae171b6946552e74d67cf581e1ddcc109ba57dd28b9901695221020a2473754345c002ac046842add6559fef3d0c71dc35df8f761205931ed4d89221032388bb6e733dd7423a27f94c02395a89064d3aab0c8c1ae6a4b78041beadc3bc210323a6fc61a18b7b31fa938dadbf99b1a6b7ec945deaf525cb5a3a1d4a9dd7fc4253ae0000000001000000000101c8aaf3e791ebd54d184ba383969c585d61a163d384b909e4df5b229a2fc0216f0100000000ffffffff029c6bd9000000000017a914dd9be47f541392d83928cf0b1aade292fd69220087325bff0200000000220020c5422f6e84aabf7093f16b025ebd0de60c8403135e0cca36f5c47221e172116f0400483045022100b9f4f12e7dfb23a924e60ba1c3135539906ce575f98316a6a95f8d8574aa0ca102204c2f85256f105abafb6c7b5397595f79af910bccbd0a9c0d428f4d6cec17426601483045022100f9cc4e761fe3d50b2dbc053ee8f69d9b3b86ebe274bfbcf1701bd1ba2d55845602206f0e8958556e7457b6db6ae185c3177e13fc66f44c84dcc035e11effdae4d2980169522102c734b729cb72f7314873552d719a3c60c622beacd81756d3aeb34f7e8f793f362102cc1d95aa9c8c870e24acb31f0cc31a91fd2ce492da93a218390b4c753df109a1210321bd8b299c172938d333c480d83fc02d22df89df4d801bdf7db84f1e7f76f6ce53ae00000000010000000001018d735cb457eccca6db72fb7b6d767b38de04cc4d5ac744d10c45a642a5384a430100000000ffffffff024c5c0400000000002200206acbc2b909282e4c6580909b848c350485dda5425480a0dbb2b7921951b2a86ae0f01a000000000017a914c237fbd7f81782f38156876ea2735eed5c14514b87040047304402207d92c7a4eb941dfc50eca96081e3df7395863536a7b0b4b51985e5475653fc7302203c98874939c92972fab3186808b35b54fe48432c9cdb0c8283f12e8466e65e970147304402205565fff8201376df1dfdf88d0d26e76abd17b75eca4348d4ed1b638ed7e715650220122a83f4bf55e9c138ba34d810cad201c0b923e5070310fe81c15fee9541715401695221024b19cf877523fbc9b551995d3e35d12bd9a325ebd26750d6c4dd40cea063fc272103987bfdbe3d0242bee3d0efeebf99814c957cd4f91300372a9dce11eec02052842103ee373d0d3417c1b7996e010a31c83dafc1b8d11495c76d35d5a52dc4f078747453ae000000000100000000010172c148c7b1118785b14a40512e78147d4e4c67a140d761e78aac38c6efd77dc20100000000ffffffff02ac1c0a000000000017a9145ec94c0bff6d61e25fac7ce38003701c7c64373c877ec4750700000000220020426d5778f1ed2ee156a02b4d8328db6eb404be04fd5a90c99e482938ba918925040047304402205e4b74e4784cd2ebbb448bd8faef6aa53acec7375b58cb31f4f143791c614139022050599c2704221c757ada3d835167630b2a7e834d146315953ad30e83738cc2ea01473044022062d63f17d0d09b898a65c6068a13f8121123bbe41f713c4e8c8de0631033fac9022013253c096a70541baa63d36a8ceba0e140f7b1be74c60e794cad01f6a82a54be016952210201bc31a911315eb6d543505554d984c505a8a25cdc62bedac2cac0cf9ffe486221033a4873432b658ed583bb05f2af5d02fae151a54b5f6402674944fd15c467f0032103a87c8c624ffcccd5e365b22845a677d05ddc1f443e2b189c6221a9dbb08cfefc53ae000000000100000000010126db9fcc975a257cc80426ffd2988768a95a56666a380fb3e16986a14ad289112900000023220020ad816b3271ebc0a41f8c51d501f81d627ed9582fd2e136a56697250e9cab0cdfffffffff02121a14000000000017a9143a8e17a9b71f17065660be5b69a398c5d9bf7ce187ac382e000000000022002093ac930c3129edf707430de32626e116c2a18a9d7c59be1cb572fa55ac53fe6a0400483045022100fab56cf0d7a111d3b14626bd758cc3157836c7911c0dabd340151529838794510220496c6214e46134bb6364a17746258bb1da5a4ad730fa25a8d0115b72fceade890147304402200e7d9f676443a5a0f4b1687b43f413d0757b8656a2672852e10dafe55f6cb79002202c1fa9202984e6bb30be4deb24e093fa4fcc1c2143c056c1235b7e69ed33f38401695221024280290cfc6b45dca763b7788ff9053d45ffe9655e687e0b60a3b9d53035796b210345c0bd12315f82bfaa41368316f210a974fbcae3c6406a517cdb1c9216ed311621038308290d0e71277434150adc43c45ef30af62c3a952639ea108f4a4bc4adbd9e53ae0000000001000000000101d0e9bcb689a7ac4d9af2d756d0da361939acdd80ad3e048d52c3c8c96c045f5a0100000023220020c37657e736b1e1cb5cb7f4affcdd38b0867b3f8b3920a7636029ba5c80554579ffffffff02d0160a000000000017a9140eaa22686886c2fe2acdfc3aa2a0315560963bb4878b94170000000000220020f135ad3afbfc79795e81b1c5a589673fe8e2277cfd34ac5fd2f6707f17e1132804004830450221008a6871726bd6f388ef771b6077529f9d41ec443dc2cfa7e5dcfd820e0e9e8f440220691efc0293941445070c12cffd0ab8465d50789df126dc7f39fb44f8ba35bb790147304402206e939fd54f1fc28ffd936ca1e63cdfd9c6afbcd0e01c4554ee7b014dc076942e0220204d740159ac2f1eea31c7852b724226fdfcaf055b42b810ac99861559ee0faf016952210228b7415f8b436418da2ac3ad8424d45842d3ae1b992cd60efbd4c710c2ee08182102fb74a055a8b060584831e7b63589083183ca822b09e987503dd523e6452e87fd21039f9c1b27a917173a7634c936b5d4fbd07221059455091038efd890a2903048a453ae0000000001000000000101e2aadfd41b4ce1f022d26a1c04ecb109189ea624594f74204a505de68abff68400000000232200205915a78617cd7d09ec63f469008b2af2d9eab6d0a84f9204b099840c39246167ffffffff02b03b14000000000017a91490db3f5876420e8cc79d3a0699876ebebc8754b2875e362f00000000002200206809305f371e3db342f00109bb72d9fc1e47e57f799c35dd6bbef6d3d5d036e3040047304402204e5eacc6b1adce698f380eba3fe4561018855c9b0726e716f12d37e0be488376022053812c4a7cc96aef9712be56b02681573b2a7e0fca12cf60e82492a4fd89ae15014830450221008a3a3e77acaf42112b75f951f762b048192f4173cff23eccf561ba01d97eb98002206cdd5602da53840abee99dce46918a292e5da4a1afb68d1bf736b3703eb9331101695221027a0e0ccdd4fadd069fba59550f220fcf5bbaecf12d87ec1a4edcf475e3ad653d2102cd01829ed8da45cc94c78531a4dbfde4506e6615763f9769558cfdb2c56decf521034d6874c1d326537bc2128e26f3d68a8e7380e6f97ba95839bda65acc588675da53ae00000000010000000001014aa36793330f626634ae1f86c00163e56214b1b9cc58cd30fe7865c58d75de290000000023220020989523833584984b5acbbf6481d5969a3ff453325d2eaaadfc89005fb307efeeffffffff02e6d210000000000017a914c8088b883297cc20d81276de5beb1a76666f67138796689700000000002200205606a182c9aa5b9d0e2611c6e510008310445a4d1d20e6c293c08900146b31eb040048304502210089cc1afcfeb1f547c723d2bfeded5f6fbef43cfee2b7e7ec780a375d63a8425c02203fe921da8a560bdfd089b58483728ba37e3c90b64d3e08197c919fe95a8879a301483045022100fbe9586d4565a91a6c4afa6a04d98e6df7375f061c45c5d08db160d6881a6f47022035a71aff4c52958433fc258db36899e8976b54222ca04f162a5e18fd9f1fe45c01695221020473a7cb8b90f38338d60ab779073722959b7fd4ae58a6b9b6227bd243ebdf2c2102ee47eb0262da34a6fd6e4d6347503bc2e625f60aa16cd397efd8aaa232f24fc72103e5e1cedd0442ff2f903def936c57eba57f5d12d18805fae07cc40844f308be8a53ae00000000010000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d40700000023220020349525a2ae22cd9af283146d103b2420141a8ac3d075ed0d6e052b741fbffb6bffffffff0246ae01000000000017a9148ba9b35c81f1866259afa52fa258f2b1db016dbd8741a341000000000022002014e35dd23255a520fa6eb176f994e8d59d8f672f4eda285cde0ceae697609e0e0400483045022100e5d91dd421dd057f14a007ad21347b5aec49d857747f76e318dbcaa4db9b8e46022004678fbbc5564b527d1b65ddff3575fb8d0723534fd0eab1ab871bdfbb771eb4014830450221009c357a524897770fa705457a3af834bda58ace634978f60a22ee534079e0b235022012a31909b803a8150a7feab2ead413fe1be1200592b24a90f28efad669b440200169522102dfd218fc63e3ac311dc8cb8d7288e0409b13b995279987f56de93bdc3062d899210327870fe719d9d4e0ab6adcaa400e6baacf89af396382b5b65a5ee8daf1ee38792103826f1442c39da08b1f9085574b60101d4983bb9d48b71b898917fcf0efc5d9d653ae0000000001000000000101589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a66893500000000ffffffff37f0cc01000000000017a914cc132fbc6a1e0b2ed9c2deb1fbf9eaeb7971440887f7c50b00000000001976a914d95ad83456290e36cf80610feda03d952cc4f35788ac00d8b8050000000017a914fdb2f88043732262ed21721e324e467e66a07b5187174b82010000000017a9142847bac79f37447dd6477fea6fd30355d937762787652d0100000000001976a914f2ddb87dd74f02dbb327dbc02dfe90445e515d2e88ac1d770300000000001976a914e5d536a040746e840bc8b7a78fc757c0bd4a723088ac55d703080000000016001458b67a661b1460cb1eb0206e66a405213c73f59dc7a300000000000017a9147512c3c484eeb9044c266b3f073f8a275406d56787b83b04000000000017a914773df5f8f33bb59d9084fc701d0484e2d7d8f4b187892d0400000000001976a914dfcf5d80d850ca1e41bd707e00efa0a661d2006288aca0c30a000000000016001463a7caa5ed7c0de5f5a831c31c8461cf655fdf2b8a2e0100000000001976a9140d8fe50d0facaedc28754ab2aa6453cc94d8be2188ac2d0c0200000000001976a91482abf74e9c2fd752d2857cbb384d7d70ac595f4888ac6c6700000000000017a91447f8cf88bc16e59474a925f9185c52f8279ece38873fb60100000000001976a9144ff07054020718f0d98e4f8f03fb8629f952842a88ac426a0100000000001976a914d0f489d7ce1e525f54f9165db287f19ff214c4a888acc6ea00000000000017a914943dabc3e702870b2b285ac60ed163c47a7eb33587e56801000000000017a91473e92f454a8f42cc0fc673a902a0ab910db8b36e8716e00c000000000016001465253ca87747fc2078bf888f0424eb6c884c4fed00840300000000001600148d3d7c0065167eb2f147fcd3f78430860cf1f03188af2100000000001976a914e7ba534676eec15e3ffb5c68f064c7068d5348f688ac8dd3040000000000160014e0d375a8f59d8dbf303b7e39924a240aeae801dcae5e0300000000001600145fcd046477c273828fdc5d103b0acece07a2720d1bc73900000000001976a914b8bc19380d9963f313ad2e4594d352187baf626c88acadc200000000000017a91474fc22b2e380cf2b00fcbdc58f949a702f8b23058781c900000000000017a9142b04cfea6014fc02651f700daf82e3291aa73b2487c82c0100000000001600148de1f8e970c4feddcd0de0e4082e02880960313460330300000000001976a91462077e9a16376d47d499f84d8850ef4b962ae99088ace0ab00000000000017a9147e1b99de0aa4608f94df8ddf5fe8716da57cef7187f45d0300000000001976a91405cb40d021b9003e2f3338ab4dabb12bb46cf6a888acabb601000000000017a91496a30f061c7e6cdb7b86c3d1cd95aa7215ba5c0d8741e904000000000017a914484bf7ae95e7fd4e122f9534aa551b7ce7fd4b7087b3ac25000000000017a914a227f2af162f21bf678d91d5554e6472addb194487f79901000000000017a91475486e97702a2a3b037d9c9b48d33d9ad0ce8c2887fd9202000000000017a914561a969badeba2d410902408f0aad9bc318d8eb487fd7c0000000000001976a9147d104dd9d88d62a5709c3d82baceb23701a0944688ac51830f00000000001600146324bf412864e1c3cccafa7cf36c8bd69f373d7209cf0000000000001976a91436759f8bf1a174a92025bc804a3d1833c2684d7b88ac0e574300000000001976a914bf2bb0adb2d22cf535ac08d1622812f68c22cb0888aca10f0300000000001600145ad9856e38dafd49c7b2b02a947438c967da0702d20825000000000017a9141e4c701a916e13729c13dff8db94b49e48ce6e2187e60f2300000000001976a914759a73c0591272e9ab6f01ec5b12177322e49dc488ac3156000000000000160014477fc4f8a14bf1f3ffe1342b145233b71849b5ed9aac00000000000017a9141058e1a0dfa47dc8352767a9ac9db6934ccfedd987855403000000000017a914617db28ca649fb1688614c41f379c1e82188821e87e7b02100000000001976a914712d3dd9014d9f8c21a5b3e50f07fe0cdb17be8a88ac1eee0300000000001976a9143d61a5e1411fe59831e190233629170febceed7c88ac2d750e000000000017a914d8e07bfea9beb242e9b0c09a2679b3683050086c877b2b4300000000001976a9147a585b2752683b8f57b0551878cef2aeffb35c1e88aca9d900000000000017a914a88f46f5814f39c93c0c07b6b87cddcd035f957887d06105000000000017a914c63126b0dab2246ef6fb43e519136daf67546b2f87854124000000000017a914bf3debbfa837ab09c556865dc0620f36c3e0866787d2d00000000000001976a914d9950573f3a0d5ba8e4fad0ac4692aeb7dc5947388acb66628000000000017a9148cf3ad565d2836c34302ee7badf19c277c34ef4a8746e60100000000001976a91444e39ed8584a07511a8aa6898235867ef4d8b98688ac02483045022100df25c536aa74dfd95f816b358ab4bf606c91a2479ef32721e46c1671958e7585022062d6eec488087d4b489dc050c958a2f2b6592ff15bfb96a0c4de8a1d092c864901210284a91cbebabbfb9a9114e423910e2c6a4d1caa16fa37f5d4ba8b880f44641739000000000200000000010173dda8fce01c9519462a2c4125dcbc7f411607bff84e6fd9e145975a66de40071500000000ffffffff01b7ce04000000000017a914fc91e850b207d3677a7b86579e8089ca59b4fdec870247304402202f3784ac3c8d3a6329608ca6a615f54541dc429f7f46b1e85114d3808b4e16eb02200c1a8a77832406e469daa9841e2a545ab995c813183693cc865d8b2247806d7f01210217eeb383968ee82b46b6b1487be2741fc1afebc3e64fdeb96267e39ff451653400000000020000000173dda8fce01c9519462a2c4125dcbc7f411607bff84e6fd9e145975a66de4007260000006b4830450221008cf9994301c696edcf15fbeb23be2c7b7b6b243b581bc1350c7f1e79413746a6022037b4823940d04aaf0d84d5e058ba0a7ab7f27053d9664bc359f3f2bff840d59b0121030a70b6c04415346100ad1969992ce07e1ff8c647409747b44910c1ce0fbe4670ffffffff0221b700000000000017a914cb6554677fe726f83c8b6a8b999f48ae40976dce87bb9a4200000000001600140dbbf014c0ebd098f8509624f0d5a4b415f702a10000000002000000000101e4f29bb38a4a627d081cd2b458d55045c1e56c3aaf0a82f96bd776d7bfeed6560100000000ffffffff0214d100000000000017a914304c1e7e0251a1f6a9f080918d189b036c8164ba8782c441000000000016001497a961f8f7346d6e8fea0f17c844b8910936394202473044022028cba9a9c8036f35c0ae18bcbfe1e21b1f3cf053dd4b22f8eb851acb2ff0a7cd022043aaed2e805bb09e8c9886b05d6bf57db3d456b14c9d88eb565bbe9b195d26d401210374bf461e0869283c3142a187f32063ea99659bc0c308778e1fc3d1db1418bea90000000001000000000104adb23385ee0229b7b26566972b04f9b1352e6c5e0420af15f2f25a94b50041b200000000232200202df8cd679b5e6c4c19180cda095c5176e03f13d6a89cc0d713ff7012cc3aef8dffffffffbea6dffad067eaee7e8b7b3ecf1e96b0ee4d0045229282244f57a621bad329ef0000000023220020cbe82077da83f76ab60873bca4facc34f4c99e1b4f47874f038c102fd60c7c5dffffffffa7113999d1fc5fc61a3294a7bc08831dc937e1b525e56262dac3d6ce25cc671602000000232200202f3cc2940e2764a4909facb042bf41f47729f834a7073d2edf9f75205099f951ffffffff41766955ba9728aa70c09fdad7e2de715f2c8791a18ba53541045d60595f96a401000000232200202715f276fd13b0236ddf5bc583ece19116fcb36d6bbfb6a36415179f404445b7ffffffff02805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b49300086877d1531020000000017a9140b519f87f95781c1d6ae92b28ffad5e5b4f763df87040047304402207cf8c1be10c71835301cdadc83f642c5076746ef968892546d0cc566c097cd5f0220733ee17300833af7b896f5cb8cc0f007a77cb2ae37d8c5555eb3b47a849ab9040147304402204c1dd8fbb2d627ef91a4defa1a62847a51dd193170b4f69097d1daea3e949c1f02204ce61dfb283c614fbbda039b106ea00c4fec069b2726fa7c6e85fe1889f6a6e30169522103686b5215b7e234440717e83eae136da2be7c1eb97f8c2ad3813d4a1b893b7a9e21035d7f16c8ab27103082c8285502582eed0d3d5a8c443f29db9e5283633b297b342102d2e3e37f5e73bde7695c3d309863e8361226b6d25a6fb50d161cea3bdc16709953ae040047304402200a1d8da2935671c0acc3a958063d54052fcb268ce551a395b1af3b9dd2e6034502206db7d92993e9d2d21039af66c9bd31881ce8c367deba8de05893db35542bdf680147304402205eacf978d28431cc442ad52f637a7f5e74752aca277959a0124c7b7ffe4ae3a802206e4f9cfd4da517c3b7f510e71cbc91ad7a3cd4ace54dfe2e1806fc45f3d5a26d016952210237860983f35f8a17f6c2bf69f7ddeeca21e0b1bef1854962836e711d8cc9b3192102dded5c1af6aa987ba156316d2da59a75a3050c954ab5969783f1493e9437a1ad21025e30a9967ef1a37ad7ca8c08c22f1af5e6fe43a5bc203fd4a22bd5307a263c6e53ae0400483045022100a39e17a5ef22b4cbb1dd45c742e29abc6888a78520152a6132e78deeb1baa46a022019cd4c240258566eb1e874e77015a929dd60b7b233dde7676d5e67e1ae72cf5a01473044022034d0a2bb9554c81426226053c9af5d67159fbf60bdf0dbb988d8976fbf53abcd0220235dbfac0106793bba36348b871f35d9e53e7c155d0013064e48386ca25bdbbd01695221021ebc04ffac0ff9cd41e03cd8e36842e71b327a83e920a20c5720019d637d6b6121038468457558efc56c1d899cbeb1a27250115d62cd0eb14df6c3828cd8001419542103a6ade99e88c8046ca155678025fd63e0f8b6ab10df2b8ad34aadc2432b551af553ae0400483045022100fb3e77fa490c83d252a4057dade8e82161e159f39f349ddda0af0c7b1166688a0220616aa07daae3c1f6ba6cfc2b676a98facfb4bfcc07f08b4cd913780b2ecb8a0c014730440220094b07a761840ef8a98828694b138425c4ff4384ef8d666a4644e1287af8081702202f15c77b89b047aa09d5400201d0265b177450b1be6edb835bf48ad4879cee660169522103f6c3b885c6b7f8b3a29afd0d59587ee92fb5784df66d104aab13bd74e06f4bf32103501741f3f6ce5ae25924a3319448417ede14a2d191ce9ef1cfd6a262c3bf6b2c2103a1ae744e0375291cd0bdf3a09f6f3e7a752ca69a784c23cefdf8a5938967483753ae000000000100000000010496984f0a12c0acad2994abd75945b82361a35901466585d5fc0d391251693c3501000000232200202ed7bca248d55165da7f965b2909a8692ccaf78d12fabebec40e2fad786fb410ffffffff049ece2e5be42d9631aa9173901fdd5af6515ed2aef7cb28886603b54fbb7dee05000000232200207b8f0806bd63584e9ecfa172e41209643f181b7e8313e9e438a77ddcb7f76f69ffffffff0e36b0fbe6f875b344272474b4c778fef25817c7461d0321f6c34d3fb5a6b69a02000000232200207a16683e186e2515b75ca002e062b99d3663589ddc4fc9a6e87fa6d0d34713bfffffffffcabf7f82ed32ba67ec36b61237a69955e802dfa3f8353b78a0c0159f5b91383d0000000023220020d0a663cd5335ebe9ce65b09e093e8cc3ab293ff855fff2a5ea14fc184605f5cdffffffff02ed7c2d020000000017a91462bd8a03553ed4444775c7e63ae4d4db67b62d3187805cd7050000000017a9149d1e59c0490deadaf3495f58494db96b4930008687040047304402202a7c5757a5954e719702332eebba91c5ef0c42daa5450b1e9e5bd1005fec166a022038c38dd62a7690c6dddab7774454fe744d61b48406830bf101d83031a428f0b30147304402207dcbb13f89b909cd49bad8500c11e56dfafcf7e38279b6b06dd36df44ce1b0d302207c071dfdf335199c0ddf465706335de256ff7ba2836cc50ccd7456e55cebfe66016952210329656d584ceeb80e5f0a9be191add3154b856ae3e1881373767cbc40ec40ccb9210355a05138c8d84c3246fbaedd8ebb7f3b0eac823ae353e8ec25795ca80400e3f321033fa4cb58578520d262a8b300c18cfd4e62a504e38d3c56f846988593f6b2522953ae04004730440220346c5ca8d7b82275c3ea42f30354f5edb7f6802df5db01db9db9f67905ef6a1b022009e6b51d8138db6a8bd7ffde835c4a1edce36ffe82433ce0e6e40bf55ab59a4501473044022035d9a88dc1a67b7e666816808873af98f386853eccf0691c10347ae543b1681702206b1593d11cf4d92356342469aad2f6fc3367c7c3f5cd64ec7c9ac06e18614aaa0169522102e129976f8bcbfec3b67248b879657a686ffeb095385ad89502bed3c80549b1082102615d0acf3d78f13bf0cb84dd3bd1d736600aeffeeceaa6cba87db97dbffcc314210367fdf960f5c431c5a19e4c45657047c0aae2ba2e337124b70c690bc2d20d124653ae0400483045022100ff6048063384e163d1a247ac45f2cdc2f5eaaae6e05db016e01db90563fad2850220659211978b313582d60a75b18e50f26604b54b53bcc00364074b774931e1be100147304402204271285919dda54a1c0dbc37460c34795239e8621abd8eb27e5582b0a472d55d0220361bc6ea1b71dfba623fb2bc2434cae8ab94e584cbcb36cbdf39e03dfcecc1a50169522102de3c649caeaab909c1e84e2528869911503fd6feded1c125dd7c83102955363b21027fa9431b2a7eb35dc870d5f541e58e119b4d79b933b3f4eaffab26a59131032521036f27188d5db196c72f0135472d66c4ae977d016f86dff19eecb915ab1f7eb79f53ae040048304502210089dc6a3b9883a61594ef183b7a1c334624b7e6f294e948371958bd4902071af502207a81e605884d0c519dd8309c60db2f1d141fa24401f02ed48338015329754a8901473044022002f120cc3d1800e39743ed3c89e17ac2231a2300cf7d31b6e9af89a8bbb4972e022078a72530d338b6466625e655569c246361d4d72d6338759a5aa8bf17e940634e01695221028d397e1fa0d1333798c1fc2a42c2eeea4aa43dcf2d0bccbb9385b723a623c10e21031108f27f9d3c6bc50d21f6c4d58b0bcf15e2b5d79031902bf0b102a548ef2251210295d28fbd09c4853b390b01741146779b498a1e2cc59f1cedb70adb78594b73ac53ae0000000001000000000101391f581d72b536c4b0894fd807cc97720da95ce18c9294dbe5ff4d72d254d8e40200000000ffffffff59c6e700000000000017a9148a8d3ec6a130e84936ad0ac571840efd279250b887002d3101000000001600146822b63856897bc0b6f234436bcd2373f257d5f8559b0100000000001976a9149852671077d5b90105080dd257e04df79bff173588acf4380000000000001976a914636b6af7e5385764cd7394897f3046715bd74d9088ac7a9b01000000000017a914f0ff7de7da0431eada500e6508aeaf79a701a17b87466c23000000000017a914e6d9a519063ac2567313be8e4017e9b61af7d1a4872fe305000000000017a914f765710a2c8fa8e61ea1f24d44925c2fa23161fe87b87006000000000017a914f41d38fe770d6ff2d0cf8fd135e12bdc9b9ffdf587aed700000000000017a9149bb3cb05f9a493d05f14d6f49e861a91070d9c5387b56a0200000000001976a9144b97cc94b63d3e49b8889c20af6f3ec7b6284cd488ac5f3911000000000017a914cb68e7ba4293caafb7e72b70561633d8084ac79b87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7690f10400000000001976a9142633d5f8cd6a0962c9888ab296617a545765be6e88acb47200000000000017a9149e3b91b78d19bb653553c1b6bf8c51d57746d5d38759c50900000000001976a9145c4b11ad11e97b293bfb17243256096eed55baf388ac528b03000000000017a914eee0ec8f5b8ef705ceca73a173f0df6833d3691787f03e0200000000001976a914cfe6ab0a15b7fc52e702f16de2de304d29dcc31988aceff11000000000001976a914d459920fabc835736599bf266768627a58063a3588ac721608000000000017a914086a84e77c13a94f6b18d4279a40562f48a7e47f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7690bd0600000000001976a914dc750ee2cc357566b64cd516a8b5a1d0cc69d9fc88aca35a00000000000017a914b1b18367a9f7143df40acb1eb03060d10d3304da87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a84643000000000017a914761ca848561508fbd332e9539a2976dbe4d837bc8785f202000000000017a914d933c554253ed6e8b818b714be64c0ab3c23061287b6590000000000001976a9141ed4be544bd252b9c25b81142be50fe3c72cfde388acd10201000000000017a9147b0dfbf02779b74487d3222a49ee2c77835fa7cb8772ef00000000000017a914c8902d278b92552ce2fb5fac26c1760383248e03870e4500000000000017a91414a8fb9ce453a3ee0d0ec89d813507e1c4b1fc188755af0100000000001976a9143679887ac2305a3239ed66fee81a45ce12c171be88ac232b00000000000017a914d9366a35692fc2005ab7f87d55a317b4b1bf5313870de30c000000000017a914851a31ba011dd78578083cdeef05f30a8166e7448763fb0900000000001600145e6d25b36afeb612bdf134488a1213b15b8186903b560000000000001976a91497c34cb743770cbd1c11cf4a999b3eeee879e5a788ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7621fc0100000000001976a91462858649f1cca6fa8b7b135c1c005bebf29fd44a88ac9bbd06000000000017a9141ac09a3c6edc0c299b57fa6ca42bd885c6e3420587c1d609000000000017a914871978c6bdfe8fe1daaf9618ed865a8a577f9ff0875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76935c00000000000016001405c637833a49bb726223adcf3749b5330ee148b2e03229000000000017a91469f375c28567d0220d9e2b341a1aa49a7e28059d87d72302000000000017a914b82c5464731dbe9ab09e8612047c5973f13c828f87bffc0000000000001976a9144f726153d8ef4e4efecc2fd5259db6cb6dfe396d88ac2f4a4d00000000001976a91444a3d3f936350d9c1e26ca31e4bc4d63cc23c2c588ace95e03000000000017a9146cb074bf4c4d028f25aca2a7ee7a00f747111f4c87fac5c82200000000160014571e2d6d1470aa2e9c0352e3f68b28f0efbd5a308b4500000000000017a91470f643cc06ba15251393bd5510ba42a907163e0387f6bf03000000000017a91401d37be2e9202a3cb70ea2af8cd931e3604bf17187b95e0300000000001976a9143b29c7be76712529c793fbb212737c2cedf6140d88ac3aa400000000000017a9142677b8db348a2c5d9f26ad7ab91e8c0fd231a9a7872c2a0000000000001976a9145d4db605b4098d383afb6bb7a82105dceff2d4ab88ac494301000000000017a914c139ddcb594dcf755c63c181f728f5519352a69587ac3000000000000017a914a0c3ac3e2067abbe7c445bea87383fb5849cffec87534e0700000000001976a914dc2037196407bd9fc606900770d9289b12cf361888ac619b010000000000160014ffb457101eeb8d5262ff0171e1ac6c2e927f926810270000000000001600147cb4c11ed27d8ee70508d0322b98979168d6f6505055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7631bb0200000000001976a914fb835688cad7dcdeea9581755628aef3a6da5ce288ac60700100000000001976a914395f7e9f9be575cc0758c0855978a9046c08a4e788ac42061a000000000017a914cd5a77ac7741a79e0391859c2f34b0c59cff7a3487ac460200000000001600146a0b62d830da0128a7da24ea0a7c095cc6cc0f06f88301000000000017a91464be69f81ee83726a71a6ae0c8c7bbcc2bef89048703af0000000000001976a914dcc97e94e0ce91885886af252289ab1ea93c8edd88ac58f010000000000017a914f827ab2de46529fd87d479bd9acb29f735d2cf8e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76e022020000000000160014ce2006b4c5661f5c162b5241062e4c70f11d74afb95e03000000000017a91474f867704717a3968e8d84b2b79e226a62f7bd81879c6143000000000017a91427f6a247b806e21e038d60b610cae4c5f7b03cb18774072100000000001976a9144af9dc28100d0e1a2a1639d05424f4708c47316088acd0471f000000000017a914b1774dc11db0c16efb3ded79a6351e2a7172e13087c0912100000000001976a91444f7e89510332d4a496cbee10146f5b5cc7928a788ac1fb121000000000017a914c6cb7c7ea82c5cc04745cb8d2af15892a3b8fdc487305600000000000017a914b2a2ad15aa3c3f2507eadda6942afec72b26c4c987ae6305000000000017a9145b0ca2a97af55467b8a65d720e8347112607e47187742103000000000017a914c5207c7136584971084ce34cf3614972a45b56b287cbbc02000000000017a914c64a5c768030547444faa382d59d54bc1fb5d092878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c16702000000000017a9144fca358cb1be2cc7242c76c988716bb7f40f23c18763bd000000000000160014622ebba0646710a53d14bcff02b2977d191a7b35f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d8d600000000000017a914dfd5aa8487db1551cb755aa50c6424d26f2a14ad87b3d12100000000001976a9145f4911f5ee817eafa9ef89bcd0e9951353d28db988ac384401000000000017a9143a7a344c3d19e6570a9ab111fe68619ab43c974487aa564300000000001600145a8b72aa1e4eb40a21ebf38c6010be5ae86f7808075007000000000017a91413090292c08f2671dca811d97a789cb8c0d9e11d87f339a1000000000016001406517806408256d077d04f4364490845c607d892024730440220166fc7135811011eb1ec68e4256cbdb5ea3fceca5554958c59d91691612a0aeb022023d125f991de6b2f245231c832fd89a47484098d2eb6ca4b06092deff2c91ec60121026290e047dd17b860ad88e54e4f059ed7a40c1e671816a0cfd8f9fb45603852a20000000001000000016c83cae4e235e88f63fce2ac9051c34ca350b444bf0c89ae18264452e6006301110000006a473044022068fd6641569e886aa54ee281a382c90004393f41d24b1d12baf999baddf29df9022077bdb6a260fba66775c9193bb6c461593e46745f7a7f6f40d281ffabdb21e916012103cd6d400459b66da9a5fe83cc1d8dbafa2e0ec233f1094c89fbc78448f03e1519ffffffff027c040000000000001976a9146807e999c3d6ae409df1d0cc9f591d0e7ac0dc6388ac9fe41000000000001976a914343b8071218df57fe1d0adc74a1507c920831e2288ac0000000001000000016c83cae4e235e88f63fce2ac9051c34ca350b444bf0c89ae18264452e6006301100000006a4730440220261169184e7e4ee674d2583718922e75379346e573944d4392aa1f79109fbd1a022015634cb680d067179a71d94c99f3ec9cf369c33c30e3e50ffd1949cae9eede6b01210235de5d16f84ebe60c2dede353ab9fcaf6d7d1e08685dccf6c4ec703455adb57fffffffff0184370200000000001976a914b54297146bb23c2a4cfe353adeaf2435c05c6e6088ac00000000020000000001016c83cae4e235e88f63fce2ac9051c34ca350b444bf0c89ae18264452e60063013f00000000ffffffff020213000000000000160014e145c4a61a34986d61eb257e26d4b101ff422e82d72f02000000000016001488a8e5864068415fa72917a51768c3abdea8f84102473044022075785db168549a58d69a31cc82a5567e5082531df725c9b1d66dfe307098a7f6022052eb57cf4224f897abb2039655fe92265ad3c069e4e1ab9774f7fa5d3a3c0fa70121024f813dd4621c1a1b7861df6d06c8f64d0779ccdba766d3f0d53503bee2b00533000000000100000002d3cce0b65cc11fb16513fee1e40311494c0f279098d45a6dd980eba43f83d85935000000fc00473044022009c4c213d49e794eef551d4eaeca273550c467e4d8e407cd5d3798c7ee6ccb7b022077e23fb43270d06e7573649e71bf472fab96e42be15f436e0e4ea6e8209ac1330147304402204ef6b75a5612c5b188a4f57593850fbe34146ff544305ba461e7d13ddde74d0b022005ebef69ca3c031e32ebb9b4f92c6819ab8d9bbf9f764cf73832555ef01ae034014c69522103bb9f8d3556bae3577ffdf6aafc0c598f9a55cafc39331d92f38f648d640db6c22103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210252fd3a3fda5a44adc0a40f761b919b461ec5c676fbf8d56ed75f928f0a335a1753aeffffffff918d82cb34538d01add6a8308f385563691622f4eef164839ed8e809a09168e101000000fc004730440220630de7698b5a5f81da304103cff2b97dd82231869fe8746fe84a18793dcb016802201ec42eab7097282018bc5467a46463e1416f27e3c32f1e4f4f6462af993ddcc20147304402202ad8748fc5bc14b234bbeacaed7c7da2037d05630c0d8f2598269a0b1478f4f002202654e42804d15cc517ad358ec9f3ff747349f371fdecac188a8e2043ac60f5f0014c69522103bb9f8d3556bae3577ffdf6aafc0c598f9a55cafc39331d92f38f648d640db6c22103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210252fd3a3fda5a44adc0a40f761b919b461ec5c676fbf8d56ed75f928f0a335a1753aeffffffff020c4400000000000017a9147da0cf00fea6c91bf16d80cddc8928f0a4937bbf8710b017000000000017a914331eddfff7167b336fd6bee90862c3bcc8a4ecb98700000000010000000245e1dad3c3ca0457b017536e96e2f98595490e7bae67b053c3b2cf60b4077f012b000000fc00473044022009e3733ec5c83a6141051575a5c162b31ab1fefbd510e8f8b675e5b0c5b07c540220069d81a21d1c15ec663f549ebc4e4ccb76ccbe3ca970a0023ebe12f0947068fa014730440220275acc8e3abd16a9f40d88999ec96ae8c105511fa62a706f191dfec7d4f4e80c022039d5c3419f2d089858a165c3b93484e8b1d197a67eddd550a4dc24d2f1f5a5f5014c69522103c1bae157bfd6aca6fee140bfa6b83762b481d75841973422e70bbddceaad60822103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221022777d217e5424e5c93edff94eac69213088881f4a5f22a68df80ac04ddfafd5453aeffffffff47fe04d1692153f19be829bf3194047666b35b282077caab5ff7e23d28ff1b5e01000000fc004730440220031fa20cccc571d8429befa38eb88f3342ccdc360a1909bd64cc4c8cf5055cc0022037eb09888d646af789f1bb1cdcde12d8df987c9b64e1e3240c85a46b2b51a8dc0147304402204f8d7e86e145e8766975854db05e0445744e43aa4bf05c5208b73bd4bcb919f702207e4cfc6330eddb19ff98124750af93776ef34f91d40b2ae831e0ba56c3dc0f37014c69522103c1bae157bfd6aca6fee140bfa6b83762b481d75841973422e70bbddceaad60822103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221022777d217e5424e5c93edff94eac69213088881f4a5f22a68df80ac04ddfafd5453aeffffffff02a22700000000000017a91455355666a567cd40f4e726c5bc958ec7f77f48f087207d84010000000017a91472a6fd7cd4d4b296ce77496764fb53c8b0fa124a870000000001000000000101da873ce0ad4a8a4ace41fe081871bf6ed311cd6d0a51788a6a65ddbb24760423040000002322002041b55b47f29757da3db9dba1231ce11f42b882e2d1f93ee445ff73618c587462ffffffff03a9d330010000000017a91465133a297e16b49f2a49a11bcf1ce4db89c393318700494300000000001976a91475aee6513daeaf8721d2511c5f621af223aad92388ac84cf1000000000001976a91480b1bf6cea94f8e7e8a91085e5130046b178270f88ac040048304502210081370d224c4700f1f1e769df0b768cb09b8808f4f2e2c071120e433f442d3ff3022019490db4658fcab7673122bfdd39c94317a9bd85e87b840aa81f414047dbc670014730440220745f6d8a427fc2985aeb338f1c32ad2dbc97e8ae78be1b7fcbfbfdca3df9e54602205046e61a2c4ed2a0c63b1ae9d9f4307de8ee967abda91de6cd8b9984fa6fa84f0169522103b75277f5e28b1b29b5170e7a55acae2db8757993a087f169fa2df4f01a6075ad210261eaaf7d37466a8137881bb5777e76304ce7c6270432bcfc3ba5b56e4f28d07d21031d8f353a8cd37b0c8c1e316a9a0444abcf169fb49927831da19b51b678c3fb6853ae00000000010000000001025ecf4c56134509c0d2b6526067c6db7598b24acfe926e883047fceb7f20f95130100000000ffffffffbb953ac413233e0d1480eadfc6bb19975e2fbfc3cfbdc57cc7a351bf5a01a7c6000000006a47304402201a26dee77f52a72007785a9ed7c095aa133dd6d8a293b5b10e4722e913b71486022048b4c96ca951ac6f94675f370de27715b87a4ae4761cfbb84923905d17d886870121020cfb554494e13e91e043f504b02bd3189160b9de210bacea1c1d3a889e8bdc43ffffffff0200d50200000000001600145a7bad1c72ae65c32d1603945b0fafc55a5cf4d42a1d05000000000017a91446d5f25db90ce5e11ee4858648f1b04e951f9a3c8702483045022100bcfbd5290640e7a26f22779e227a26ff66c5c0593f71949a0359fd7c7afbd634022038ed5e919fd59e7f97e7edc5c0ff2cff6a865a8ef4ed391379f9761da108a4720121023bcf3c614be666ca94408c1b74cfdc8c58ba0f785526bf9d352f8164d7b76ce1000000000002000000000101afde54c68569294ed665852a74b48da3c4f66fce83de7f97575bdc46c9e4951e020000001716001481a555d9713f01c4426d13572ff4a8b8538fdb3effffffff08dc7e17000000000017a914681a8be9dab2a255a12c6e8bea8e17c8f1752bf187572faa0c000000001976a914adc60e12273d591294a7f13c4ea293ee5b39cb3688ac98375c000000000017a914d1249b7c99e6fee18380e09ec91a4ebfe9b53c1e87c0d401000000000017a914d3b3ccb53910a15a4b58b203f5b0a115e64fafdd87a08601000000000017a914dfe58b07aeb04843182e1810906f6bb0f6ff409787e09304000000000017a914e1f77b02a42124ec4867facdd7ca6c022c90a20287438f03000000000017a9148b874515ef552f225d861ef3f12d2b57f6b288e287083a05000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e04870247304402206483cfe634ae1adf6cd9d74cfd53825c183fd142de1d50fc2c70e8bebc4f754d02203088038869c122a4c990f62bdba023f28b6cfd50bfba1a04db2cb7fa446d93f2012103684f0406a7093e0500211cc99c84f90e46fb70042ec4b25d9dc7a5863a2363cb000000000100000000010132f1611155b590a5892d3ac3aba447d3bf8b81ebb03b10f3904867fcd93f82640100000000ffffffff02da5200000000000016001405da842c73b15bcae29847c1cdf78a5fa5ed999a362d0100000000001600145c7aa406f988223232c66f7d18c6de1bfe0f95df02483045022100a214eb8fae56b064332f936c082870eed89a45b49071ff20d7f162251d77cbde0220714454e025263a0db4d2fa72426afe3a9a4842decbd86bb35deebb6bcdf93d7e012102708dc366e815183ca325bbcb2695575a95d4f63ecfae9dd73564de6c929f6543000000000100000000010232f1611155b590a5892d3ac3aba447d3bf8b81ebb03b10f3904867fcd93f82640400000000fffffffff5735d641fdac0708fa3db194cc727e927ee23497f7700040000ed122edcf5490000000000ffffffff01a0d10100000000001976a91404b1cfb3546430fcdad7f44fb112b12f1d93f0bd88ac0247304402200d9f7762577c9454271f7241e0564c1b3289fd635776746cfe997bbe25401ab402200154621547a0be68c6fc4961f1c3303139b57cefe033d46d38e4a034a2a8c53c012102708dc366e815183ca325bbcb2695575a95d4f63ecfae9dd73564de6c929f654302483045022100886eea719aa3ccff44e4a64526f6898f2e4f55144cb9544bafc0fda58b653750022000e4311c38e77597aad2eff9ab8f779efdcc559c34f8137f969984a40c7d242b012102999cdcfb9a93cbfc7c3e9589e5abf3527d20440eab001cc2e6109c531e89ecec000000000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb297902000000fc0047304402206736c38e3fb7360d19020ad2e64b50fb833f63e39041156722e2481185e1161202206b9ec0fd023ead4d3c8f58fa45417d4429b0592a583d0d6fb026db0e46e29a2f014730440220759b951a5ab4b329501597da6cceca7954aef873a06346b8fe758a0255db337e02206dc8f40d8ec32e071b39531e3b38bd242a08c328ef74ab958cf043ce339892fa014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff02c11c03000000000017a914cc314101c3961cb286dd0d1321e97e58f24952ef87f66e5d000000000017a9142238a5066c2f49e1921d3aee7fd81529071c3e258748a00a000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb29790a000000fc0047304402206178e2521cdaf7b064b2de261737f6a4f93cf22760dc8bb35b3d6e09ebb55d9f022027fad4f84ec0077252877dfbd577332dc737ceed784b9f869c4e7935815337c9014730440220275d927bd046f2b6bcb1870449a335c5f2cb2d7eef7b3a909d8e4fe6a9a65d6602200a132a33f6efb3875bba12bcf65532a876ed2c1e8b377594413b502cddd5bdd8014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff02037802000000000017a914345f0d47d10e3fe574611b3d2da6d1f19143bf1987b4135e000000000017a914ecd79630722e2acce877e6d27e7e7ee6d63b6ff08749a00a000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb29790d000000fc004730440220569511d29a1fc061e3b367b0b80635b66bb3166e4db5d55ec3245c95e172d015022058cb84d01b055b669f90380c5d3ac40b934b8c44a109786e6b0316490879cd26014730440220431823449a266ba5704b891113ca742dbcbe6893f02cf52fc0893aa4644853d40220125e9a776e324b50c6b1d72dda06738e09fe87e595c016b8092d49b2844f0396014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff02490f00000000000017a914b92237e57ed58e3881e61972f32266ae1269368f876f7c60000000000017a9141ec0118e0ac55344207564b84de27cc7c09af7548749a00a0001000000016881199955736b0859e9d254057b7da1d2afb6b470d99f6d235b8569fc5a222b04000000fc0047304402202d97bded89d3dcdca24ebae84cd34f088b8e3fcccc5b948cb268b9b56be4be2002205d286647027a88f470ed11a3d5b03d17dbe36d8f9d91d6797f133260d5aad5af0147304402205c34d8594fcc60213b741950054962b69c0bbe843f5ddefdc39522eb95ca28e402206455ae34ff29c868a0f3754c2356bb95cffc5c420da9aa5ae282f0e2406453cd014c695221025a687170a67b6f202dcb7551ffe6b5869d6993b3dd150f382801fe1b6e1e648e2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd608222102a5db55abd8c16b47ad594979bcea4b0796c50e28e11b08dfe23063c652b7949653aeffffffff02e2b400000000000017a9144a77c75280658291439770e247519a764422341187200b20000000000017a91447b286add51b4ff87bab58cf9c2f7b48c94ec34187000000000100000000010150ead00895a313cf1deb87cf4ad6caf3a1a22c5145d85c93d2cc6715751c2f0b0000000000ffffffff02d40d3c00000000001976a91441851dd4569cfcfa18c59682a7d68a89c9b0d54488ac465a24000000000016001440fa9148a179fdd76206323ef4b9b1dc03b7f51c02483045022100af2bcf9f6e1f1ea27c7c023c4ab0cb81342e11e28ec19dfc3c1044f39db4d9a302201b5b2ca75991d2431e5ad43e1b6b5e99d2c310be9ef7a4d1c4b1ac1fe4ce8b1c0121034668044499027d909ea4449fc137a121d09fc3c692bc0f0b9f95dc323711e0e40000000001000000000101627fcbcbc3f070dd1a6b0cfbaeca959b6269994c2f271d6a7771230dd686da830100000000ffffffff02ac6a0800000000001976a914a7bca6b7873c96f6fa161791d9fa44d8f7ad691988ac557c03000000000016001494131c5cd1147003e01c2fb6cc27eef4219377ad02473044022013401012bb4beba6324d6a95ec906992436ffd58fa48b3721b1c0b23c743907e022002e729addcd7aac2a277c04e942b9f4b0cd21fc5cf5da0c65806b9befd66faa80121024bf171320f30bb6f470993d54f6fa2da0217cbe1c10e95520cea807564c79a970000000001000000000101a21d4f81cdc9e8d8bb7508505548275653b058d9ec4be72b8d1d0498e39a8f5708000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff0378da0d00000000001976a914ef73d296718ad5207f8d03b568173d2a2e5b902888acc4e70300000000001976a9146055cb4d1911ea4fe1e973b13a9043659518621988acd09dbb1d0000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c0438702483045022100aa13a9e92f7d86a1f35227d2c24888373cee1c05afe5eb4c4e43555cc263dc3902200de006cf4a3e19d1132e395dc233eb02e2f4e256c5123b0ed05fd67f208e2fe101210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff000000000100000000010123bed277f01b15df38dc214cb5a518b3e4736294dfdf3ee76e0c227abd6a0fd90000000000ffffffff472ee90300000000001976a9146b86555cebf448b5797526bbdf5cede794b1f64a88accd6b0100000000001976a914d52f5c041300954453b0d502c486939082f8d89a88ac5a5bb500000000001976a91444151ac1f9f30f857352bbd68048c001b9df43d588ac18dd0000000000001976a9140df766a0e7548839dc74a18d09d6bf0edb4fd6d588aca3ce0000000000001976a91462917ab3c7ec3604f31028c153155b7341ea794488ac7ae600000000000017a914ddaf54e62cf03f231cff1d19d10c1fc789746ef887f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76bbbc01000000000017a914e436b9bca58259edcaaf0aeb03a4f28ebbcd744e87f0490200000000001976a914041ad43018f699e802d4493982596c63f0fd67c288ac4c280000000000001976a91475134b2e0a3e523860f2c30c2741e64c8282cae188ac0abc070000000000160014f0f881fefbe36b60cac0573e0870b97bc271826f4dae01000000000017a914ed0de3eb4b68c4bbfba05b8dea96d549afb93e0787df1a5101000000001976a91421fb47fc0462085188e61c56ee05291da81a656b88ac4dca02000000000017a914b71bfb68f9603fbe09add30daabe5278155fd9d887a0500100000000001976a914f0e102b503c36c99119472f907d46593dcac6c9a88acd71c05000000000017a9141dfb257d8f308319017076b13b409859c0c3cd1c87d06e00000000000017a9142c30bb57cbe9b2ad1f7d0a5995815cf2bf2ecf3b8790c80000000000001976a914b62a14e705a63c0e2fce683713f579a421f296f588ace1ae0000000000001600141eb731a80b190155981cc6afe9c98c6e60c44ee5062b000000000000160014b5d4c14ffe93918afc3b6154dd9400dbf447f2231ab504000000000017a914117c4af63a4ed199275a60734c9d078b07096f7d87adb605000000000017a914782064318bad9f9803d804340160a0dffd901e3487cf190100000000001976a914f883e430d94f0461d6f5c5fd149587186f0462ef88acc5470000000000001976a91478fa085dbf223ba7c22a5d4f63f71ad1fb1db65088acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd761fac0000000000001976a914d94054f4ad4f863413c387cc0958be0d912bccaf88acd96f08000000000017a91494bd5d0b7f7a0f8e6d1293417e01b319aa0eee9087624c0000000000001976a9143f41ee52c9d11b099144896ef957faf268d262ea88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7625d301000000000017a9142644b3d2957d1dc17ad3072537d3d660568ec8c8878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ef150e000000000016001434198e6e34a99ba6ff1d565f124517a7ad843ff19b5c0300000000001976a9141f49fc27bfba8dab8fe3233ee7b8253a00cda35888ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76a66f0600000000001976a9147f239e088b05001d44d68a0357c5d4639587e3e588ac9a500d00000000001976a9141cd8f680cf7ffcfb45501b76b75a345592aa879988acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76be241f1a00000000160014b8334b364ef07cf96c82394c7708f89a7e4f6104f57c0300000000001976a914c4bb8ac4669575ba22da3b93e4ee451f82cec75388ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ccde0700000000001976a9142bcfffc077fd0b25ae3fa0b9502125a89423babb88aceedc04000000000017a914ade0015514ba512634bf7ba4a8bf554aee2b4792872d481e000000000017a9148f35554dfe0f91332fa7a90ae25401aae8a22fba87a00302000000000017a914ab8641d446c11ea844b49f5c6c8cdab2cc2488fb87d8d600000000000017a9143aaa0d3674a7e99c6af69ff5a33272507a956bb3878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7657e610000000000017a914f02e26e8d2c4d5789a28724e5169b027380a3d0a87f7f205000000000017a914e45f97caa316fa6978b61f0a038819e42f0f18b787242b0000000000001976a914d250f34d44db57ffcb3cec307c38251f97c80fef88acf3060400000000001600145d827a9cbdb704de6f6f051f78c5b82d0e1d8aa509dc0400000000001976a9140ec691d11d08d75940b9282500d1a547c059dce988ac74690100000000001976a914fd2805a61e7211385193ee7e1a06d3ec179e933888ac94b906000000000017a9148224ff96d2506197efa0daf06ce5a6ca1e9fa84887ffa706000000000017a914be48e82a79a9b4c65ef585c9742ea7eca55fcb5c87e96306000000000017a9140c0c0cf112ee116e18194949cb04b284a10b7c4b87403200000000000017a914a85e868196bac87a3302dfca467127be073ad253878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7662f7020000000000160014d1085f76d3f16d87d90ac8fe71c706e01957c534e0a501000000000017a914e68d5c997f1a4bae53183490ec5da950b3d37059876d7c0300000000001976a9145071ec9cbe23dbb21db83b539dc5d84c84ca835788acc6f5200000000000160014f854b4bdf6741f7d55576ec346de9cb165ee3aa50d5600000000000017a9146d68d41c3ef5c4d4373631ee91c7fdb8b9234ad987d72620000000000022002081f1de78be3b7ea643f81a4504713ad59015473d252d5219752cb7a6f193a797362d01000000000017a914e44398b521a7efc41f8ef94bbf734ed58d72afbc87406700000000000017a914d5f6c019b1f7b7a5dff0fd1a21dfed7dcf51774787196c0000000000001976a91475c8a8dfb182f39dadc966add4e1c6bb225ff81288ac4dae01000000000017a91412c5c905848f6e03a204bdd2e8ce1c6924051c0e87072b00000000000017a9149f23856a254304b1ba40a543dd1d53e683090a9b87c80807000000000017a9149595f8abab48ed3ae2d515bd8d7a1a5c5b1e36e58792e20000000000001976a9149f096d88b4bbe9bf6dd8fcfb361d954294c86e7088aca6c90500000000001976a9147bd6b9ad80266cb3634fd1c2709312aa6f89608488ac02483045022100c62842dc3cc313da4cc2c1bac1703ee89517d88e96f576f5d27f3125fd149969022061b47c7a60c56d65c8048b4fcbe78c9a1a935488063e0f4f4ba246d55a63d5d40121032a2eba978e28f6d47fff157c5cafa1ce1efc6916da7acd864f07d503013687fb000000000200000000010184f0badff0810d73897b926898bd7f54a5fd68376d839fce97716ca59352695c1f00000000ffffffff0193100e00000000001976a91450c64c785f6daee2d06302f0003a74facb4263b588ac02483045022100ece5a87ffb9ab7f6bd44f3d7bc714dfdc8407e0ef2e5c394189017877e2001ec0220143e02e02b4dde6c0e4c7f37bfcdf7fa82a1a991e16e4b08a770779a56eec8560121030eea0d89c002081f18e5d26bdfb6c3a90d4953ce91ea1b966f18ad13d4709923000000000200000000010184f0badff0810d73897b926898bd7f54a5fd68376d839fce97716ca59352695c3100000000ffffffff01ad010400000000001976a91478eafba54181d0629c311194a13fec55b657c6a488ac0247304402204619e1448044d520747b77dd8f7db8a9b1f98dbd48ac9f29c0fe9efb8a1cd678022012ea6088052d79e35bba257eb2af7a73de5b2c346771f2233a4ab500440e5c08012102be1b5a18b8d270dbbea8a40cfa517349816c75669268039015855b1713566aa400000000010000000184f0badff0810d73897b926898bd7f54a5fd68376d839fce97716ca59352695c450000006b483045022100a5a4d984ff1b8783185613fb41120142872910d33306d0e9d02532d25de4b6500220409bc18915933a04690600c2d7aaca99f259167bf45128fb24bb581458f75a8001210372885eedee08dc1e84c5fe00eafab5d4ace19b9c4ad3036cc98793e0a60fe0feffffffff01cadd0000000000001976a91484232b84eb51cdfb066d034e0449e2522b1c8fc588ac00000000010000000144dfd960507d18f38c88c98fb1ff24042b6ec5011b27d024054fd187ea38bebb370000006b483045022100bf7339cd12241f09675024a17d8fa235e2b726214ce8ec7be7061f67d5dd9a160220493b3250dbd188c1211d6c4c026e77b3222cf577da7c32b41323eb1afaaa2cc90121028c9d281579d0149038bd9e55c8fa5c692d0b7d9eb088016d6d05c88025c142ddffffffff018d750600000000001976a914e48fcd28d7d7d8adec59c03973c6ea71a004e3eb88ac0000000001000000040eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e14192b000000fc0047304402205ae641ca8a6603dc305db76eb6a26e29d72ced46b8eb92de017a3a3aa170d67e02205a1bd7e5744948ede96b31f14d351852e3edf13d75f7ab49f6de0a0f9b9cff2a014730440220753fed4a6842b45538a2a6ba83786921f4bcc25f1eb578048abd83bc97b784c4022008ebcb65a35679facbf3535403eec15041ae0842dd43e5a7ac643aedff1b47f6014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff0eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e141932000000fc0047304402201af6a43735a18dac84fcf12afae0d898da409e4265fa0ac38c46e666703eb71102205d6d2090bcca8b3341dc1825dea4a29628c1c025347bb254c1490539f372c5da01473044022018c56a9060033e477c3ab349f88f858b5a65b0d186ed46bc2c5b61db6381084f022061528be7cad1dc5707ea822c87dfd9d887cf313f036e10ba41e88a34d1aff922014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff0eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e141933000000fc00473044022048ff5eff196cd39b09e20273a8faf457bcb5bc3be27c0bcde948157a0fb50de602207bcb229c7e5d652c9be7c2d7802e34cd48ce606820786b121ba8f4f780c12f7c01473044022037b442a5615bcecb0a449566937e461ac72a45d34b8d637260b13b95729491b502202d6c0f0f79261d7e3aca06c00f552bf002c0d4a41b9a99b91f33c36e78566fea014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff0eaa135f1fa9530540f5a4f4b2f407b9e14b5af43f5fa07b02986480f82e141935000000fdfd0000483045022100c07150def762d9b731be3048320df210d08e7ce1f307e78225dad1b2c48fe919022055dfa8bcd758cf1d4ca49763f6f8787b45230660c1349afa35646cc2edbb38cf0147304402204a3a090dc506ec175c2f0c71aac335fa8b439d5fdb067481ddb0789d5f1d04d1022050444a9c9d9cdb1acb19665766f1ec4f4407ded6fbc5e65653b8fa3d024bbee9014c6952210251b5b6a0af0d385eb053cc213f64b4f47bbe1f61a542207105cd89bc9211fa1c2103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd60822210339998b386b4ef2449f25e41df87bae4025df5a9a469bbc2a490fcaf45b0bf69553aeffffffff027b6f00000000000017a91442495f0ec7867713826c410200e54e13e1024a6387a0c5ac01000000001976a914a4b9c4e3dd6cfb9e233a46aad7407b5493f6647488ac0000000001000000000101a6b668880d65628cc72e2acaef44c5b08ecc4a1783073cbb0ea9a1361aee74b40000000000ffffffff4fc08b16020000000017a91410df953dbf4e1fd850ae1b95391ee3576e98fcbb877bac0000000000001976a914c8919657e75bc47a8a26d44731e20c908361818f88acb902010000000000160014b8e7d87332db6012eb7ac10f5090d820a6e17aa5ff9202000000000017a914e485944fec91b78ae626d7322b7a9f8e2930878b874cee0200000000001976a914e06810bc483463a52735fb167ff702c71017b15088ac683c01000000000017a91421458301c707f31f9c8248b868095e67463f158d87c367080000000000220020f019719a81596386cee79ae87d18556a902a96068a8f40e585349c76526ff44cf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7647a419000000000017a9142efcad77a36889bf6bfa7cba9cca1720c9930eb48754450100000000001976a914b48943ae4a3b9e1164c974310446f50a1508575f88acdaa300000000000017a914a6a0275735537cb85fe17655ddfbe8adb25d844c87b5690400000000001976a914e43771b3d9d2d70ab920bef16351bb486018e5ca88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd769a531900000000001976a914000aeebec0672572078d4dd29464586631511c2088ac480701000000000017a914c408e9ec4d2f7f6d6b1163c726cfae8c0d1c8713877d6700000000000017a914cc0ee8a86a8bd15dd5871f9ec2fdea4f79eb019b87fb7723000000000017a9141ef2724df79d08c4a6cfffe9d8e881fef1c62fd08757a71700000000001600144d0cacbc1aded2a24786193542dc82a3710ba83bf2123700000000001976a91442556aab3b4b4800e04d87bfe8f99992694c851288ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd767e8012000000000017a9147518ada39bf93b36bac93538c30edea2cb8c9ce387f09e1a000000000017a9141f4942c3aedd30994a165a40a014910047b20576875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b4470000000000001600141667c22ed99f58c4c4a363b25311159cfa9575c2201705000000000017a9148c484c7b04a4f64902c1d68a313e44b5a5ecd3ac8735eb05000000000017a9149be2f487d280a6ea18576ce758beb1a58dcbab0387863112000000000017a914b2f9b647c86a9ca826de3f518180871f22f19b2a87bd3f2000000000001976a91409bacc51eade9bf7c93b0e96cb470ee8af4914f488ac4f090100000000001976a914b7e946a345f927d23a0cb3d4315a496f273e5e7b88ac282700000000000017a914ad3a0a179da4cea12d7e2124af0188c39e04e697878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76bad001000000000017a91404975fc6b5b7542fc54200ee1fcac21098edf9fd87e47a03000000000017a914ae66510fcbc72469024e7099cbaa3fced1d4e4ea87be7813000000000017a914ed2477b23cc5c37aadbe5fdc71f8f43b02ca7ff5878fb04d00000000001976a914a6d57f05c49852a4f92f10381327e62d17c0adde88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76d8d600000000000017a9144fc98f68ca7aae05c1afe70cb7dc7dec036d124b871124d50300000000160014e64dee5f598a8aa1ab8daddd3895f5cad216943ebc3d0600000000001976a914e31a1ae808e7a1ce8481459fdbdfbf7c8d82b27f88ace7b704000000000017a914f507a387d33019f38c6ec75eeaff5af42698b0c987ad2d01000000000017a9141e1f1ba163cf4bfccdd1bb5bc33e0b39b453beb387d8d600000000000017a9147af7f4d9f9903fda39b612742739049be748c80b879c5a000000000000220020af338a0b34d2f8a6761215c960cb47c6c0da0cd49343aeebc0854677f95ad84cdffa0500000000001976a91450ff5f67112daf693671ac893e81e934a824dec888ac60450200000000001976a9148d2ddc7ef9cc66adf55669cc91529bdd4f3097f688accb871f00000000001976a914e2a3855de7b181e646050f5e68d44023ece3765888acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76cb337b01000000001600147a38182d52e58335908b59eb846e3ef5ce525086317d24000000000017a91419628f99b13a1305ec3eabcfc5950966248d7789876adb06000000000017a914bfcb154c3e92be1d64074c3dcb0344575bb0015d87ff5702000000000017a9141d398ffa720794a7b06979b1fab45a3942df4a2c8762160500000000001976a91459ce934f306f747f02b382357f67f2425d5bdd8788ac6aea01000000000017a914bfd7d3a2019bfcd9563bbb2c6f2e0bb8f788578f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764abd00000000000017a914cb8d6088ed4bb73ad2b2d5a3540ffdbaee325ddb8733bb000000000000160014ef7d2e410756d22c95fccd3c83d2ed28d57ff52067cd1400000000001976a9142e7f50d97719a82ece01830fa049eb12a0e8d82f88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76e7c001000000000016001451f2e822550bfd03718518fe1233816a0736de5c5c2c03000000000017a91417556ce591d96bfcb3fa3f37f34a124b7f0023128717650000000000001600144587f5fbefd913f752dd1fa9ffe77ce29622e7a829fb050000000000160014752d0ae337ee74c4d336adad9e1fc17ad4023d32cbf010000000000017a914e9156d12a93721057210b7605f79c4027a17023987f74002000000000017a914b9cc58d61b9ef4c1afd2c0393b143d8f99ed1ec6870bc90000000000001600143767895daef4ccb1167e9f25ca19253b613af3c0a00302000000000017a9147265424867fcb65ee0b3c1120e0e1a7eb6d69b0f87022f03000000000017a9145fe656715f31e2d26f522982f86f7e4c517d7f6d87a06a0000000000001976a914e64eb233531f4309477826c539ed79d58816a35d88ac4b3303000000000017a914d21733c62e7a52887c576a2d65a3d3d509a68aee87f6b60100000000001976a914a4e60439a439239636ae09edeeeea96f06239a8388ac4c3801000000000017a9142eee85933c279f68cff676fd611e2ca25216367587287e02000000000017a91495e45a3e8fb26ddb99ed756d12983497f520926d878f231400000000001976a9140c50cd2930e4ae92196de58a2eab85c82d65f86c88ac93fc04000000000016001446d141e829505691b6b6268523582124692580ac6e280500000000001976a914f1cccc33d4efcf9c0d5143c16d4e38119d34da3488ac02473044022005658c1894cf051e50b2c5d700a9ad39d04894b9c63e483364bc8e44af0b236c02205d4af6dda2aca0e9c7b8f51258e46b8ab6d962fb061588935414b38491a9ad0201210305c37aa12ffa56610fede1e7dc550755b7d4c5b932ca3571ff63b8505810e19d0000000001000000012b1aa36c7da5b78d1be7c474d2e8d20ff9d60daf12ec62b6fe0684e77d8d1c014e0000006a47304402207fbad4f3cd6afa5340c8f7007c5fe3562f88e5d44a8c87555bf54af2ccef228602207c938c08c98a1c767f86973ecb9dfea191398d25e15acc8b5355844bca05cfd2012103ef16fc074d927e1263134ae423690cb2cb2f1ce1297b8b6270f77b919250be79ffffffff0220c501000000000016001412cb908fada7f4695e33ab07e9d4da98734540d8d55d03000000000017a914ab54cea25146b29478b2e605730f7fbaee5ab5c28700000000010000000001014d5c047286de6c0e8fd907b683281bf34618677560469821e8ade59c3c4bede30000000000ffffffff01a8bf01000000000017a914651e2aae69069582d723a68280efc689f507d9488702483045022100a2b88a4a24230cc8e9c4f222f59aba02568844e0a2b14ef8116ea9b096a97b2f02200213dcda56a476c5a000a6318127bed59a729adbf171adf2487009020aa825330121038a4dea56c310b083b770d49661a0c7c99305737d1fdd3507cd6028248780d7f6000000000100000001e28e66bcdba82fab8dd3a814dfc9f37afa0691ffc2068f1d4ca34876ee7c333603000000fc00473044022062f18bd3f1271c3f96ec173bb21a94cc51fd49d18a8aeab0f4d38341f48e0f9002200c7a9554098d4d226da5f32c51b08866fb43cc1a689d2e5313caa1cc0a65ee130147304402202f88902e3694111ad90cd98da84cd7599d97b0f16eccfe34b54d93fda6d2ac7b0220185b8402fe60c097ae183abcaff9fb8f913a3de2a52dbc2ad85413de2b589255014c6952210268b1659da1393ed8a6e4a25b15cd7997cf45f1bc2f2adc567109b2cd7b7e59e72103e0d51b4913546eb6af290550287c6290a291632562ce6e4d06b6fe8e06ded24d2102676c026bfb976c3e8464eb97335a6ac6789707068add8bbd218c05e2fbba401c53aeffffffff031a1d00000000000017a9145336be8c972f0660d87b7e45bef849b98bb496088784a91600000000001600147912c7f21a754c40ea3b1ffcf78de8f6a7c8d5cb54ddfe060000000017a9145336be8c972f0660d87b7e45bef849b98bb496088747a00a0002000000000101c9a6536052bb49a9f877f3a149c70ef353fec3c3a9efe21a24ab647a9e3a34665a00000017160014631f58cce75ddf4e540ac0f54c3771cba38d1504ffffffff0384b215000000000017a914985663aaf87d85d52c1cf256b2b07170e5988b2a87a08601000000000017a914c48cc4db4cebdcf9b34a7cc510f51725c06b574d878b0200000000000017a914f82ad30d55a690a2b6c700a108ea843f313c3b12870247304402206c84267debe300beaceb2d740123204d07819c8b52101ab3979fe7d1ca747cb902201e74589b34d381ece6bf3559053b50940a92fa20ea1e14fb63b9f4868c6a2308012103d600e9995826ef07adf23eb982fdf8634ecc3264f1592a1574b5220eaa02db65000000000200000000010146885d75ba385602ee00260fc15e51a86e458ccf56b594c22f6bf9933a4e79121900000017160014db03742b66a88f277cc5487f2f5bdde7f5a44d2bffffffff0368de05000000000017a914a8c0c47353eee4d9135d70d58b3a6df135b3c8eb8760e316000000000017a9141e16561839e60f68010959fb19c211eb1225a6568779ae00000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e0487024730440220747bc5961eb56da5cb1eca9ddad539e5412c393a42507bca08227784b3961b18022023cc9722ef68784e1b8b29a3a67e325b624c999fcf649ca0703e9a81b9a364410121031af62042ffac37e17014984a147d32351ad962f60668824d2f99d956c6bb627e00000000020000000001019a624ac763040b3e707a7696a4b5f3696939a75bd2c5bfded0d9b972426bfba604000000171600146d30615a6b7bee30132a9e74e262124aebeada77ffffffff034cc198000000000017a9144c299e895b12716dc4f410381185f44380dbc955872ecb47000000000017a9142dad35cec6234c6006222b80755023697ba2bbbd87c4f947610000000017a914f82ad30d55a690a2b6c700a108ea843f313c3b12870247304402203234ebbe8a1b1e4330c2a62363c0c211fd2336aa59af1fb71f1a9d93760f465802205447223c573825d2fcbdffb9d23cad3fc798c699302c7e160d4714557b3f846d012102c87dd7c367e7812415bedaadbd0e2685ba26f1adc5f15001ac2544308f074e780000000002000000000101baf567521bf61e24b5b4ab9e6e24f31626dae08b48448095e57b279f2149a0fe0100000017160014a01a9170b81999223dd78203fe887a18a1b45092feffffff02c8fd45030000000017a914180abc8ac03647c84f18a29b16639e59c8917e5087080c3c00000000001976a914bad8dbacef824cbf34a6d9f3ae4f954e3347807288ac0247304402200e4ec38f20c6be675abf0cc9adaa847b2b98ec62164446433b8cb9354c1d55f402206ae39f1a8ae88fbee093eaed6f7d04efbd8462daca34977c83efca4de31ad5200121033c9fa5086688454fdeeeb29ffd694f37af120306562dbb64394471fc8b2fb76748a00a000200000000010161e1f4bf282753f6fb522cbd12f746ce40278f59e26d7f9b22abaeb585caf84f0000000017160014e302d736a431ec8c68970b8bfd335fcfdbb368e1feffffff02c78e34030000000017a91408f6668049dfa86eae1c5b116e55390f79ae8bdd87b66a1100000000001976a914ef8a9f415aca541c20634f04dd3543699e0d5fa488ac0247304402205451655b4d001505b418f9c847408324d75b8e3f74117ab049ca8ed889771a9f022058ae89aa7fb2396bf65b49da8d2fc1d2f4413557e770b11f8dec25edee027441012103a687a18736fcac22a96808dc49304065c09bb56ac6352602b83d84bae06f55b949a00a00010000000e11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287604000000fc0047304402207ec822a34feced8a71019254a74239c264d5a5e4a8e06102c3c61f71f54052fb02203f8b166f195546115ea3f00ac1da6e0c5e230d9adff0e0974ac05ba61407c76501473044022052091d210b4b3c49344504aee9dfef6ad0cc4988c0be2efb01656327a12aa75102207475f9c6a98edd78927e80cde60dc6313c0f420f7a9eda4c458336698f8721af014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287608000000fc0047304402207667db06eb8c3e0c8ed741534d628999619b22f79e66a7693b84fbb68e1cbf2502203ae085ee09aecb7ddbb510faac933b35b0527cb1bad3167d945e9df049bcc2040147304402204be755f7b1ec341e1620495bb0f98e946a12b4c6bbe0b4e6b5b836f297f2324a022067a3075257cf9a8dd34a02c6e051f3b12190455f2cb2f4d14103d79c106e6ef5014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287609000000fc004730440220135ab3a2544cc18f000dfd1c310fcbb38eb650403c6af364e3caedbec643a06002204975e4d52a4e89c86fef7829e3ba50908878f22d3d022c74f534f283b7d4de9b014730440220697579e07094419e3028ab4e36c3110d1da0e4be9820ad05ef6a8cadc8c171de022005ea9787c20d07c50493de0915a5776e7da1b8beb848ed4e42b8e057963e90e3014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de28760e000000fdfd0000483045022100fd401655c4b457550742a477503cda37c30517bb21eab27b324c2814775fe3220220269e5a1c62b9a79de039a31da7bd1b032d34ebc13e0da3949a67e4e0073b763c0147304402201b5098a35a49157b1037fcfcf7cf1363586f8c00e4727559fb416fbb3be2d0d302202a66682b594f46b34fc7942f8517c41690c6c68f31639268ba590f7ad399b128014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de28760f000000fdfd0000483045022100a425872d8170a4c95930346eed44a8ecd8c2cc28cf91825b5b3ac640c23165cb02200bf294cabce9af54836f94b0b79e30a9ee8d8e2755020072e939e5123fe0b89d01473044022043b491fb5992a8b292899786fff659d2462d945d653225bed8cc6ee419e2865b0220634d1752d60851906aaa0243310d0109da74b3515dffa2cbae21402945cec466014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287613000000fdfd00004830450221008111d6c5971de5fb6b0eb31ed78adf0b917cc2200fcedeba16f367f507efd7eb02204d64928db4e0160832c911b04ac74b17f8c37ac96299b34b3c8517631e42bd2601473044022019fa391d21445d2c7a6102381cb89dc56f1bae8f26b3771c6842f0272c706e670220015792e6e03786a706e631c12176296d9a9d05556dcd067d4fba813fbdc1fbe0014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287614000000fc0047304402201db85c10740c6b2d555f7ee883f4b9e97e4b67bff73a4307a035a8415a0b409f022014b7e795c841975f05122112e24b9bbbd9e0dbd60b1f21552e3b5f69916640dc0147304402201914e42bcc517658b56fbd775bc6c0651f270fd27bf016b261f67ef5672353e202203c894ee036cd431a76c57b68ea9986f3f16849e8f2b581cef63d897ba3e2b814014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287615000000fc004730440220783d738a645d12b8e7a77ad66fdce09daa03b404ee4a39912f378557c5d08f8c02200399c89ebe8db7211693a7ce929fc7486cf9f422471b42a47641944efc400f020147304402206a11ec5ebff55efc65f9aaa0406f3583feb1226f48a99fb746ad1aed0dbadbd202200c7654d17d5036fa03934d7553b95b5c9abb41a1283752befea7dd2db4e4423b014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287616000000fc0047304402204700979b543416ea0f78bb312f87054b7da6e35ba6debee465e655d359782a1702205de3c29a338b57f51e370bf3a23f3d4851381269f89de6ae5bed43d2fcae2ae10147304402201ffa27752ccc7a58e5be0754b4af8a4d47655347fc504d3bb2c207f0542fc64b022028c9542c8323faf8ca049f90fae4cdb0729807fd47d22e46df02a485946b230f014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287618000000fdfd00004830450221009ab2e00ab8e0e6fbe67fecf2ce2e6c425a938532015ebf00b568490350d088dd022069df5f4f50a93a03c37c37e791f0594a4dc1a839c8f347d527fcdfd07284c7520147304402206e97d4969e63be31803017309f4cb3f7958a5ffdb006674ba44dc825d30ba2100220484256c912f0269e89f09dc6118041682d957a1b03969983a453a3ac8e4ed048014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de28761d000000fc004730440220784ca92459b0bb1efe7df148e2da31f9e7f69f9d45e905dcadf1304c5f02d1ff02203a8b5d6baf9a51dd5c5306b622975ad1049c94f2746eb9055c7c3327b76429740147304402203112f5d4b1e73f471cd1ed2d05f3521d302de0a266e2ee58f88f8266d4fb7a59022010a4c80826e08e46e10bdd6c1370feba72f4cb50ee838b774960b4ff81b1a298014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287622000000fc0047304402201a0a5c589381089397e4aeb519930e8c4be78bd4fff521a2d1c0b13b0e3d5f3f02205e1987bfda730b6f9d50329df19a4bb0f3a271a0231107a362482f90bd7f8f0a0147304402203ef847daac5afe2917dc8e551ecac3e05212eb511e9644dd286ecc6583d876ae0220678c49a6f995228bf76ad9d51477a6b4d73de495eeb4ad4827a251584c24d8e1014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287623000000fc004730440220421087d881b97673d35b2f20454e41b12ab563999aa5fb6f5409391242b743280220365b15d1fbad7c088a3da43d4f03d5235126ec21f6a4f7f66f18e28dcdd0365a0147304402206da230f95605f449e7e591813b75c2db1595a7aaa0977721940f5b9c64eb13d8022039e217404d165f15a0722190a532d54d077bb1f64d7fe10778cf76f340bd0525014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff11760b787f1bdf99973a006b121e584b001f2e51bf4a923b5c75f41f76de287624000000fdfd0000483045022100eab6d9edad257dfe947fdbdb01f822241dbd6057b7d9f02be8adcece65265454022029a06c0744f44e4bd37929e7d1c8e2cee8fc7d963b80be9444d337cd83f1d9b001473044022073c2e584e67f69bb16e5e30ec42b88c84a1158d45942725702d2ecbe3b38164f02200f9d34e93613693a3979cef13601a55935009ddda48e677c4df88e6b05b26617014c695221029a2c2d5d808f387116200a6984384323570b9fbecb7c5db110ef62dc5ede94e62103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221025b93d6cad6eab3d2a7b8b50e9c3a625f5fe2f0b5f55a9450061fe5aaef114e2653aeffffffff02e31b00000000000017a91493c186fcf56e5338392a63480fcb4de2cc46d15687c005d90100000000160014463447e36703055083c29fc661ae38b6f08cde920000000001000000000102d38424d976362da3053b9984064bc63fa0fd8e732b9f379a5f11f23f5598ea040100000000ffffffff92cd5ab7a567c570e863dd605de72a4c0d38815b541f6ad3c7d110a58cf897e6310000006b48304502210093b783e9ff9a18f4523e4dca98ccf4542013565adc96d7fd7cfc9d701d480ac802203c7e1f81a46b2254347fca57df1ea4a319a59509c05ba0215db91df71e73d097012103bebd6d6ca204410db9c1565d07ba455cbc35cc09699a67a4b05f1c937796e77effffffff02f80b0100000000001600144da77180acfe4dedc4e35fab0da4ce48d509aa03d04501000000000017a9146d4f0e4072b3bb7eb611aa1ce9a906c36df4d34f870247304402206b607f80adf78f0625e0f92d8192c7570619212ed79af8f4dc911e97d2b5358c0220527a11714ee568d557c597cb56afbaf6dee84ac665d5c798af1e7d3a9e776321012103dd838141602e9e524bb4285884fe427a616d406e2e1624d1cf1f6c31a28b1089000000000001000000000104ed87e049a13f9b4e54329e44a6ae4939e6cb9e4a5fde2188cf50a3373041d13201000000232200209f697a71b0ff5e46bcaeee87dc0503dd763c65607409b9c2ff3ee794ae4429d1ffffffff13fe65b87796b7896d44ecefb0408d120351e4234ef22c1eb1099373f738b51f02000000232200200c6605ceb6301abd079f698e886a91061f05a1eff2b1d588b6d58f68ff8501b5ffffffffb195c19c1f5982aae1cd90f3b00f6fdc34523c407c065836d694ded365c1379e01000000232200203e46d6f4b2a00a159e5a75449200d7e6d688c8033d6886b1fe7f524ec996d2cbffffffff232126449e89504851d7d79b644dadb405f13ab671c806366c813098cd9494bf000000002322002038e1667bae57b2573ccdff82549d29d26029d54c59cf67fa64ad485948781790ffffffff02b617bb000000000017a9144a9b8cb8535cc8bea5bb83be4bcd34e420d61d668780b14f01000000001976a9145948869499b7a1ded47169d7d7e87ce386c520a888ac0400483045022100f59bb38bb3629337fab8c1940beaa29abe93a80ad4b50a67f6bcf7130663577e022075b3aff8944190c38655ae90ab71d96e90034e9ff7507d01eaf4bc4759a040d00147304402207d38c327a830d8ea3cfb8b79ebda1c08a6172f551e03477aaf190c3bd5f7bb83022050dfa201bc17e4fa556042de663b4cd5c8c6f692a0ed38e5a52249d06ae3947301695221038a649fd739986946ebf5f6474fbe9888cc35a62696ab2fd122940c8ecd33b9a92102dcfd18d0c261f946ac406abcd71e41ace5f2f4354799cac181f2bd4b424719fd2103781d5785a5ba852b7ec2c2859744bcd57c9f6c6ec3cd0691dd5dac747ffebe4f53ae0400483045022100e3a926bf424c3a329bbb5c0c9512752fb8561c314d185195e4a0f976a253e48a02207b0869298d21657d4b3597dfe2c2bd457dc45f900dda1cc9cd84c29a18f6f8350147304402202955cb0056b32cb63ff09b0aad8c6303c57fe4090a3ffb09193cc14e42e6118602204830c73bb6d4195f57ed28d7769079df9d3aa70dbaf0b08a439f161408a88d0a01695221033748512b52f09641cb4d7f8003c46823747533714f0eee16097b32ad380d64a921032ac74f3d2350e8f64c7a3eb62cccd04a7528c42f8b90d867b09caec5d4ccb7882102769d9bcddebe8ceb237d4c3424a317d129576c5a086badaa251315b2f03fc58853ae04004730440220451baf988bcdeda1ac1ded426e77042c409de202e8a2b1d765fe4c85947ce3390220016c86e6439caccebe5f25399a39cf02ba796dda6357777d1372e4a63b2a1c8f0147304402202be14c374577da6aa5d517e96eaacb5f6d84577019b5854c72de459cc4fc4cf0022042cee0332b2c06e8a48e4f8d5742202d7c78f5630c990618e4edcca7f5cd40480169522102bb5059ba4424731fb5d50dc5988a469b88979ecf2c362edd77af1963c64cbd1b210308f72f52231b5691d4e0851035c30f3c52decf2d45d2a9758cc02681309fd6642103a295e7aea757a5163bc74370de4a0ddc6e2c2843fa4aaf558308c7c38c670afe53ae04004730440220259bf036315b96bbb9a8e8100a71138c8ba495eb70bc4f1f363f3cbc8f416a05022072b33592e4944989f0ec4527c30150fc3986bf9ac5a5d3332636241b118650670147304402207a315b94279c0287bdd4142b15ff8dfe5ef4b26d1ca7b4bf4ff0dcd1b61b5f800220658aa555c22ef6e400328bb3740bf4aae6eb383f425ade2466e8bb2bfabdcbc40169522103e36983b1fcf5879096beadcee8fa41c161579d1da23269ebca8834c45a2e304221036cc4aaa7c847d19d04a44d00f4e098d765e4132f0de5eaaf3c66288b6380999721025ae8be4b4b4727a01a7ab9f0799b3d115857371bdeef074ad0e666b2aea7261f53ae0000000001000000000104fd2afbb8d0bb4483d6733a22259a9eb2a82e873e55ebeb68f25070b4f1ff303d0100000023220020842d53522c8135caf2a9764188721b3d383250884376357d8e7bbdc44988e2e0ffffffffdad9519215b6ad33cd517d757118cefee4be1988c692904522a30d603059776200000000232200208ce3cf830dafcaec37608cbcdca117daab211b674e7b4830217c95b8f770f1c8ffffffff37b8963ad7cdaf6ad543ba65c040fa0b34f94b9366d569e205ac749bf5d8d7ed0000000023220020a3297215c29e3c9b75915ef885dba40ec2ecb706930fd2126e5d2d97b3d0e4b6ffffffff9ba24e2955d0e8edebb6f747e54e4995c3c0dc5badcca20156fba868c3cb0f4b010000002322002013c20729b5656b3d59518bc0f274661f150e39e362add3e90cc256814a298a31ffffffff0280b14f01000000001976a9145948869499b7a1ded47169d7d7e87ce386c520a888ac2de19f000000000017a914b95ce669a2d065cfcbd4b39d63324c02bd2803ce87040047304402200e2983d3550369777bd8c10c42a67f419b9ddf432822d87908f52f9a3f56f29b022008f1a32834386a35ecae9e5980f0d099ff633d50aabd751bb277cbaa773d33230147304402206524adc31d034c94a3d049488aa66b3e55fc5d602bf6f9fd76d43565826c340302207ed146a7756b5f3422f8190e9ec9257354e5f8790f0a99b660b876025923bec501695221023331ef02418d7f0fc6bf156e4f345346324db1afd40ff1672620d8d62318b863210346fae161ba846fbd883de89d7304fcc7f815ba38b2b4220aec9ae1ef1353727421034a26cbb409bbf9c905d262f69ad056db6ed8a386e0836e73b7e74ed68feaa6d253ae0400483045022100a0df8374709ee2ada78f7d1ac0edf6d62c827517bf9fb3883247a7f559bd50d3022025282cc0d72e521e9cfad4d52b254d089b9c0c1b6317d9ad50b832537ba70b4a01473044022078ee75a37d1d743bcdbfe8571b45bdb2e78a25f87c37954bc7b4e00a730cf04902204cdcc8e98ae9836b54f12a235e881988e7472f383437887af09367db6bd5fd2901695221028e0bfbba853ce2a37e58436f07a4de7a412db38fb92929b3833e3c65a6934588210229982e94cd0cac90171d6e3779b9a5714f449f037fbb7638e5ecfa224e2804082102e6acf9ee9e9b22abdb15c82752b5307e8e782b70091bebae59d007c337844dda53ae040047304402203923442aa29b6bfcdd5af8fc49da613cc76c17273fc8df1f402e5460a1f00e5702205e4eb56822de709b7978bef441edfb36ca0f168d2a0cac1d9687037169d207110147304402200f67733506d875ba40efde2aa9ed751c77c8897c0e58cef6aeed029ba1fb38ad0220188056f1e0aa89b9fb12e62ce4afcacc16f419e7bf526f48f1ac9b9f09efaca00169522103fbacdd6475690213b12593a30c087d383061b42fb1ff87edfbdd5cedbb74440721023cf01a19bcada3e9c77465d8351141518eb3c1e3bcb09047f7fd24823a9e08dc21035ce384e1155a960edcf89082bb927cf421219e2d3bcf17125c460c40c24df6fb53ae0400483045022100f1bdbc8e695ace73683f454a35f7a12a1dcafeb9252cd9e99e4f60976099bb5a02204461d9bfbc91039e0ba8863af087af4d79706fed6c22eaa096f6059074de1b33014730440220726f4e1a92f7add7112014efdcb5b1d664c7e4836810c82c858826d8af810a0d022042d6fc24563136a2815217ef1799798262e07609edb93479883b22a29ade2afc0169522102d2a422255658bb3abfbc7eed563dcb9f67094d9e6c02de7faf4f4fc83ea0b59621020d226ab288269a283390d886020f20a166157ee5866a3625678b75b738f3a69e210205379187c0e283da19b7a713c40184dd6a61c4f0bc2d0ea229b7e69dd0924bed53ae000000000100000001673237e1bc1493821b510fcab4a9ea04c383989c6920e0d3825c53fa91afb98203000000fc0047304402201637a30074de5fdf06bac5b26a1cbe634fb7229fd56f609a82ce76d2cf35a85f022017c5993c51932c74edd3b87214a458716e3374ff745a21d0f766f4646d098f420147304402201cf1237286d07cc8748f3f2f021af7a5ce34ec66ce6b64aaf1ceb7d34f56317102201150b13adc66f587da5f442250b360570ef446c4a9a6f9b5d9480dd07f632899014c6952210268b1659da1393ed8a6e4a25b15cd7997cf45f1bc2f2adc567109b2cd7b7e59e72103e0d51b4913546eb6af290550287c6290a291632562ce6e4d06b6fe8e06ded24d2102676c026bfb976c3e8464eb97335a6ac6789707068add8bbd218c05e2fbba401c53aeffffffff041a1d00000000000017a9145336be8c972f0660d87b7e45bef849b98bb4960887defa0000000000001600148c3d91cad194c9d3984772c54b7ca298a7e63b70d8b7970000000000160014bd12bb87652d5c7fbf99ad39f97bb598a4ebab0f61073a090000000017a9145336be8c972f0660d87b7e45bef849b98bb496088748a00a000100000000010307de49826eb8eafb40098497e02c31fc3819907cc82cca5819a505ef7d4dba270000000023220020d5501380d4b970a1a54b5940309452fcdf1bd5bafce5bf76f520f3846fdac88bffffffffa7a89bfcc5d58f49677555beb4a15b7d471703b47b18bbf3928aeabb7c5f69a4c1000000232200205b26a4e9cad0271ece7f7116fe07a036a30a1f8fade61e1d31e6d1dc7ad8dd50ffffffff0915b25f1f0e554dd5fa70bd51f28e828e1a1f66d548391321f5d9d3461b1be901000000232200203871e4e42829136b119b9787dd025a0c40260fd2ef6bc5cdf5153d9d6fdd1590ffffffff01668110000000000017a914b6f54b5c325ce4cb659c9f58af5c81c32121e0cf8704004730440220566adb4fdede7df3828a6053bc45e836e8fa73a076b5578d84ce24bb17260347022040c19e4addaf716cefa906432e04a5774a5b4d199741fdf152f74a9a8539b5cc0147304402201f2a893a0555c1f28fa03ce594fcc7597f81ee04bef9767b0ac1dacec8b8c7d202202d72b28e63e3e0955718efe855921b80493ad3c96cb0d02e5f2e4bf3918e998f01695221039cc1be229e7c8590b874c93c40bee114b4b1e75dfd7a07a8c251d3f09714e624210360f882b34de6e8b9fe9b63f9d6ef917c1021a6a2d1f2dbec9f3fa6bdce583e8b21033744ded95a58d6f51ed9ab9ad3b27a0f360266d37dffad136dc5bbf156609db453ae0400483045022100f8d783d20b512566f67f8f3534149cf1664c9620edbf1be0e57e6424e76bea3502205310234a03c6272caea077e7099a3f9c3f58e702a136af66efa5afba175d988c0147304402202eac074da183d6d44cf50747057d9686ba56c49de00699caca7852e9de253cde0220559aeae9fa87212eb6485bc148c5f6d0273b0b33e47a15af9e47770e83655acc01695221022325f472264ac740ea184c818c30588895d1c6389637265b980bca5314d136452103dcd231734efcc0d836f115e1301e3acada58e18ffffec559b23f655ab09a9c552102699a5c4536abd6427fb33f2700cb0632ee44d87d8f709b8e3b3a8fcd0d46fa2853ae0400483045022100974f4e0299d18ab9aea7babcf1d61c7d6808bb2f1df5370a77c46752faf9ff3202206f57dcd60abdb2af6987153daff63d6f4be0c669fe81b4fb855740445f27290201473044022073057ab6c00b8b35c90ed727ec198072c8958167dc17b2162fd2a3a4954367d902202b3018f1f1f7d3caeacd630c2e5b6a5596e0e2cd6ef8fb696fa53455dda84f820169522102218f62f016beb16ffaddcd227ccca3088dc8070377c95ecdef3b74508875ff162102baf355a577ee7e19461d9a9ff21086e5d3112bb87f796b6023391ee7eeea97bb21027ed8e2ad2642c1e1ceff2425d0e1488f8dc3f33801119ac4738a6f5bcfce636853ae47a00a000200000000010107818e78d49ca72de37169897addd675870456688ee29ed2178959aecd9237180000000017160014fc1aed55c0a3dbb757bd77f32a5edee7a0a0149effffffff029901470000000000160014f0136b4c003e2e2ae67d1123813da6b25b13ea35e37f5f000000000017a9148723da03f1b5c0b1f7e4e51d548b98cc52c4a10d8702473044022074533ca7dd752ef3aca16a804438c13c4933e941943b6fa2ecbbbc21f0b03a060220704b58e410ca97591a60bf5f26671b319f6b2a137005ad873deed657412046c0012103bf752e12be2114485bfe327219055d5d0267fd173c130ce165e3895de841510b0000000001000000019ee807b7a76122ccbba7d78788874ce6f989dabd1b633c21b09a563a9b14cfc2140000006a47304402200298bdacec9ffee021d5d38d31cc9e4876e96b2b3e90a4c353df7edfc6c21b7e02203eff14c6f3cc67ef6564e3e25740000b80383684d1403f67907723dc41fd199d012102c54fb68286b373d5b1fddd309ba2b9fd28790cd7cc0e08827230ab7dfd0a8b5bffffffff0260c702000000000016001403341ee4788cade6f9c11d5116016522b2fe0ae473160100000000001976a914ed5e2b11ffd61e3c468178a8443197aef890e35688ac000000000100000002bc3a0e6452baf167523bc181f6a21af09ab45f44ad45bb7a34d33dfa6e5a825f010000006b483045022100c8d406d502d451341238b1b9f7971c95d10510ef56613942d131a4a9c8477860022051adc5d9bc0e43a6868678c869210fa4a74db44806fcc947ed8117e4046f52890121021ba1e887427d4b8233fb500e9fabee58bd8b45ec5d90e47d7b1a8fef1a199e17ffffffffcd6f9d989d97f09ce52d5b722fa7e1146388a0619bdf340cff2fe45d80df5523030000006a47304402201410ea9631ecad7d2551729ab5dfc24b86aa257aa7cd79544fa66fb75110c4d202207ed752c611091523421df723274097b08f99e90f918905ad62869e4c3e4dd8b70121031c40c19000a74c7639ffd5e7f38cae3bb4c14622b1188bbe6e3886fedcaffdabffffffff01e18b0800000000001976a914c6699781c26d897e8d339625e43f900ed8ec8ade88ac0000000001000000000103718d90768f7365ec4593dda3e00ee7158296b5882fab7f3257b7bc79c44231f30000000000ffffffffc71c5206e6d9755efd455a88ad56974958ada2c627a9fc8d43d0c21db13d11740000000000ffffffffc9b2d808a740452d847bc888276df0aed5e70db7b786e98af3bd61f5706f6d743c00000000ffffffff026621000000000000220020df45020e24cee7e724248272b9fea1940637ca8ca2b766c3965e721213c996ad199e010000000000220020e8069c8d86acb0f959df88feccef53e7b8939088cb23cf5c096ca7a03e001c080400483045022100a47dc27fe33812d95c645365d10cb24de439e7018ede0548f6aa08f56ce7241d02203f96bf1eefd810b70407b7f88176c643f1b2d8143c93ca67bdbc0fe93a73f6c701483045022100c4079ea8c275676b589e9209250567e2f4e7fb4c533374645561edb938202c7602201442ca9857edad5d52df50a5629cfec65b48868aabaaef5c96a697c66990ebeb014752210355e675474e86ef3684ecb6ae48ebbda1fbec662c6d981c36ea28129275fa4aac2102924264c4a9446493eaab3d98a21a569f3a80a029b0b47bdf97c6b5dc792839d952ae0400483045022100ae217ea0d040dbee1544df24a1a4c6f4bacab6fbda36ce601c11a6bb6bf40f63022071b2547bde1768d661aecc8742e2c11cbba148f9daa2ae79d1e45d85f0e2498101483045022100a2017e77f565aefa2a007a282e9fa173c193d67f40503e9075c8404ebfbedcd302205b87f6c8db9c33fdf83c506514f204bd153f62d51f01fdc4b756f02133b4b928014752210374f46dc58f553747ce6cec23b2f4e073f8ea66e8c0873b507b6c908def45bafc210259547fe7d66f2cf3da9fd7073ab5b02953da8847b41e27e6e48fdbbcc958264952ae040047304402203adea27a5666ed19839f5df5d081221fb43a9a243995d8afa04f532fb60f53e2022055a1b8fe09b155b3d518f6b90e3a0e1d820841b5963afb8c0e88587dbd022f9b01483045022100dda4f8455de5f66e2f9f8cd879f206e425e8e37e75f51b7ba4b3fea06cb68bd002201f652f3e7f3b08daf9a2590dbef2b6adc7f6c53af6795af2a3ef6c990c8078540147522103985f9f1cd0ea225f18d9e6a24a683e9c7e758568379203bee6d5a7e47683d2032103d17b8461169c4fa97f3f7d6924507f765bcc519c22773b9bcae918af0d42f58852ae0000000002000000012f86c7d8935b2f0a9da3708648a864b05f9adf7014a0c5644d4f432644a5b19a010000006a473044022077947868a9a0e9c7c2b93712d73e161d27d18a50a2c6a1a49365406ed20a5e3c02200fce0bc54625af1fcd242c0ba67a3259ccbf742aa5af3812f5d21fffb7bb7a53012102f14290cc70f3f73a6b2b6b2a646a08ac37a92597e4bc620e323e1b07069daad3fdffffff02b80501000000000017a914c97fe1d0fce82bce94493e6ce1941945711c801a87085a0700000000001976a91466971e298e267c410eb45f1b89e6b434cc320eb788ac47a00a000100000000010dbd45fd446eaf7ebc86cf5b7f4c032d152aa40012cf0feb8f59b4f368d063bd08000000002322002042df394e721a83eedef2951791096509911794ef0263d8cfacf8e6ba0045d1b2ffffffff7514a6c261e352bfbb90d657c6052ab0ae4a91d7794aa1b201bd9131e7e5f016010000002322002017ce2a13c0ec85b24df4b8fe1ef261117ace0f4ef6c8f2ba573df91778c5c5a6ffffffff29bc67de2e320bdcce250a60d03a596b6e181a04bd448c77dbdf531ceba0271c0100000023220020cdf52fa5546cce8854b059fac079b93ac00f63444839167499558092a7c9ed17ffffffffe6b67205b5a1e2d675e872b6aba753f0954cae721eebdf589a0da5c5c7c43c4c16000000232200207d55ce5e9c12fa39794a24fcbc354c025ad54d7502ce9f6b33066ca04b6b178affffffffcc945e0b54a9dc2eadb061c70dbb429c703e73bc6795befae7786863308c514e0000000023220020b73b51f99246eb8cef2c3fa79a52860aaaad95429d3a92d521b83dddc230daa1ffffffffb53a1ebdf2865705d166f14d3d4e0f9825651091b23f3b2baed88effb9bbf46501000000232200207c05382163638eaff430721bea983982670e2647812530b3c8f53c744889ed31ffffffff3f28eecc83940e8df3cf2977e4bfe3121daa9131a87f6fbc4994cc68e656476b1f00000023220020507efb36a5746cd677145c183938bfcfb3ae116ce0ab1c9a69ba084080e97573ffffffffb1c3d26069c502dadf587f9383a5d3ea09ecf021f004a9612eccedda0d91e4ba030000002322002097ad8638c2259c6d74362eabd4ea937d83a8e77ff173d0330287e19df4543f91ffffffff0ef91005c1189e15b4cc17d184ce3d3a4f556bfc95ecdbceaace7bf9ec70b6c32a00000023220020c1be272e03ee9dd8e5f39c7543f8ed408e4b03d162a5fe436f1176c44c45e0a5ffffffff34f43e96c79e850dc5e89d7acdf236c1c1d391e231d5281dfd8f9311ce579de20000000023220020610b1fc3c880ff94eef3b175c2c4cacc9f5dcd9b49f31032d91b32f9d228c0e1ffffffffd6356ae860e230bc560d8db6faa00bde3e8e8f240cbb16dba3200813278cd6e91a0000002322002071a5b58e61e7237629805b4ebe0d4a3d5be8803da0b78f82fd78907ef1d65847ffffffff44a44b74e7c0c73d956d0c45c82c7052ebacee99aac33743ad6029c48f258af33700000023220020c00895447e13a0e8966684a3fdc55890ab9717a5f5f18f770b2b7ec1a7961e63ffffffff641975ecd2fe3f209afe787d6561d23233389f61e8450031b816516d964754fc08000000232200208925cef6d2a35a82fce943a4094aac1e0c76a515e7a45c7a327caf8eeee74f42ffffffff20f12a00000000000017a91499a4519a81447bf853948d940c97715d680c6590871c5700000000000017a9140b2cde1ed8f17f26e48a407748437a77471854ee87438100000000000017a91455f79b6807c907bb35033ce01d5abe4294a4433c87a8a20000000000001976a9140138826862f2c8188c34fcdf7f837d2dc5a46e2e88acc3a6000000000000160014f682c55a49fbde3411f22621b4a50c879aa4976237b600000000000017a914fc8ea1b7c65abc78a0eb46312e5beb1a00efba66873930010000000000160014d8403b546156ec6ea78bd6998fde8d980cdad428f6ca0100000000001976a914ded049156d1100d3a2a6c14597ac405c55deb77288ace02202000000000017a914fef3425511958d1a18cd6d9a1261cd3b339031c687317802000000000017a914c2539e5f330b2546501648bee8fa1ea426e61ecf87d95a0300000000001976a914296e1af8629edd05ba458b4a7964f5acc372add988ac09b7030000000000160014eef99787f09e623218caad228622e80a7b6b664cf09804000000000017a91492a02d3e007350edd26fa7ebbe5eba34c391ddee870a900500000000001976a914136d292cbd008205732f452d154f5b1fcd8cf22988ac11b90500000000001976a9144c4652c0b59e1a3885e1a8e027089c6a47b6b8d088ac83d10700000000001976a9145f1b15c0050004559076fc4c04ab433ef0f9b0b788ac7ca90900000000001976a91497d161efa3866ccd051aeab211d32d167f0bcde288ac17e4090000000000160014ef33de69aa556ef5a66509b734e5cc6fb33591f949370c00000000001976a914a3a5ec8a522faae34b0da2538fe0712e5801ab8688ac11390c00000000001976a9144a90e308334e00b23e7f98d2f17474e3a5ebf49c88ac6ee60c00000000001976a9148a65dba044551bd0edab55140dad097e8e44f12d88ac7e250e00000000001976a91444229bdcff05acfd400f5d4cfa885e33f49b074a88ac068e100000000000160014c1385b82971006fbdb4665086caa8322609eacade4df10000000000017a914885bee615035d74d2cf8d0dcce8c665f4ce2b6298748d61400000000001976a9146f3f9bd4e6445aae60ead05b00c0a4b81e8c2e4d88aca5e11500000000001976a91420ede910ebb4fd700ef82fe27cc64069c027a7e488ac4b9f1d00000000001976a91483f83172000ed7f7e375428c547693c280ae523d88ac46fb1f00000000001976a9147ded5b04ca4d0aef7399ea4e05875e1e529232a688acfc1a42000000000017a91442a5e739aee218961d82a16821351e90a43966e78775860301000000001976a9140e9554f8fe83c0b2e97b7a531d209d0ccf85004088ac461cc802000000001976a914b3f13a1d77662aeea63e104cdab4088f200cf96c88acd220c25c0000000017a9146eeeadc19a620ce252f9f24cb4a963229fbb6a43870400473044022051952eea54e701c1c8d60f76f2961b693be93842496ffe999b3592a158733cf00220183d7d8ab081b94a5078d1bf29d37ef4ba0b111036d75e88f34d7a6dacced41a01473044022025d1b074f288be62a7db1cb3e9335f88eb4f72f0cbc891f1b9923ca4355a96590220533a7d1bb0e64f09ab42346cb9eef4fa4a490aaf6203a8e9088531aefadc14b50169522103a32024d4f6e2767aef7074ec1715871ff5577a8c61ffb4d97cf9852aab915c6521034f1c76571bf237560cad8dcffde50b022729d3da474ac4c3844d48f415e962672103d161579d7ccc59cd346bbb50d21363c2e4e3ad995d741d3fa0db25182777380053ae04004730440220577db5841d4dc7b0f137223e4c376d5e43488a1ff1d6df69426bc1e10f59f09f02206ba81434ecec92be3a5943419332a2d5918af26e7c18cefd39802978666d9db50147304402202a8e89013946707859c51d46367cff617e37ea2b5bfaddf78193ed0dee24b41c022074cd7ea32bc5ff573fb90015b5974f83219f2c32d7d97608a77c9d2803be2a7c01695221037814a69e50d54c575456fe9f11027f261d58fb798ebe595487d9fde490fede8e21026cc673e7d08316eabe60fe6c46023a61e18afc2186d0f705fc2c8501408982dd210237e8957d22adc42e16d19269609dd6b019da3663e231838419ce0a430350914f53ae0400483045022100baca00c8da7aeccb66ea8fbb97723ae9857fc4f95cf56f3b0c6f75ca3f84cbcb02206c3a15cb28bcf38dc4738727b8544a10fb085453f30b2a9a159842deab1b945d0147304402200525261ff55508bd052bb1f7246910baa96a5a71e3031c6b313e28b8cc1f602a022072367744eeae46934d4b228592bb922d0302812ea64b7dc549c123ca13a7ccde0169522103065138e1be5fb32b0ef393c2bf2af7316eb6fc2ae89ddb95f22a730ead7a7209210337e9ae75b84aa6e0f0fcda7c3082da0213ed6aac660d0719db7b96257394616321035fe5679ef57908bf91f77027a33c44516cb2544024066ac5e800479566f4a1b553ae040047304402205410f451c29e701348220aa5c6ac24cf260073bf5939cb3d73e5298306ce77c902207b432846b8a913c8e1c3789f952d7692b183351ecc2bb2c7390786f4c07859c70147304402202ac9793823e34640c882678c855627136ad0f50f68bd0620f9472f66c447afab02204d69656ae7bd0ab265804e8ce92a0c8dcf75742f304f31d78b2166fe49b8f08b0169522102fde889acb2bc8c1aedd55fb5270d6e6017363d1ba26b034580e6434fbc6af40e21039c9f4b6ba36e1b5d9710e6a3b5951d4fa2144e2db6a24ea80ec48009fa319a6621036e4012d30b355570ae0972202a4aeeb146244af30d5d16568ad2649b7c52cd8253ae040047304402207067c58f037863597de8c290bcfd891d314ba0dd23bc28cf07e31d4f50606c030220152a4be76c5bd0ce0385ec300d18398a18a6066b2896fbe026f9f80ee74fe4020147304402205318efc9c656b459bfff2660c8dd4a66470e75b659011f6489de67a31d9ab2b102202021c258bc7f9acfddb12d4077ac72fdc36cfe697617052c17c579ab9718e5f20169522103b37e96b54254a0c0392d440c7ad5172f8d1f606ea1d9d5fa7114b87f1f948a4d21028e802e3b7b9eb3a8c729367ca876d93143b7e8e65a5c316731f11ac8e0e85cfa2103538c83626b0351c052f5c8be00bdb610e57910eb2ab8787c2dadf2d08da8108953ae0400473044022028069231dbdca789e2eb497c8a7ed698785f423f61ebaece675e1bc798c9b8ea02204d5a6e33ad4ccd111b14413940420739689b1b334418c41b043f2d139ca55cf60147304402205d1e2ebef9b99648d46aa5ab440880f6cd71cbda002a019fc286108e1675824c02205d6ef4279c91ccd64449a231bd07921e0e5d8828543182d4a6fb937da68c289c0169522103915884299ed89198c905cc616cdc54f1c247966f015968be7d0b46aba332ab342102f3677aabf3940c949d17fe4ffaecc09fa586137ec14fa65bd0433bc05341c2ea210297b9ae6c315ce77c71e202862b397ca9a30edfc0c6b99961fbf4e44dddd6b0b853ae0400483045022100f15acb4c8fd77f23e456d20fcff943715fb2780ab6a82ba4ff73f957b044c72b02201b1897e6c7eb61e53766f1a956ca17444a6b6f70ddfb332f5ff768c690f81be201473044022073a22ea40e1a11b9828e76c3ee3a9eb3d4cfec43de41b6b53feab71377437165022039851f781cc9dbba5eea1350e99538f1907a1ae2eae0bff91458eec5a30e88b90169522103dbd47ab738567f0ba05603a8dec196390b88d94021daf1771ad872889ce7b44f2102d9b5cbfd23d3e063cb7076b3ddb18db4e24bf3f80aad2304de9ebe12881db26d2103bee9e852797d4b17d15cf0fb91bea027b0e08d30f86b717ab69d576ce18c163e53ae0400483045022100e70fa7b2a2d554b89935102916dafe5b5d5e00d9b8deb5e6dd678be7942cf0e402200614cecb6bb27b093ea2382a88a6b5191b050eda465caac692f20fdcfe5350a30147304402206b0fa5ec055bdc6a367396e06adad9ca59efefe0dc67ebd23cd10a6d34ae4acb02203fc3e5a61df4edf0ce9b13f2f02f2c63401bf50e7155096811f423c09027b91a0169522102e7d307d13ee65088dd5c7518ce7866e86cfd0d596a136eaeb4dbeba3b2a7cd892102c1a174828d32e082da1789afe91d657248e7938f314a6b2f57e49aad699201712102b8499b3daf3f1e2966441db5421260374179a1b333a54752e29c4902b8b0beb953ae0400473044022055b7b52b46e3155caad845179bf74db896eb4982fb5f999741a925730247e7bd02207602a771e8176ecdc5b1fcdfe16d44250388dabf5aff62164b8973838385b0a801473044022057483d8694e31e034ca68c76516f49982b2e78231908c28dbb1a01926956f2e8022012729b651b1e1b9cbd7dc4024a413e26b3f791838abc044c401d36daba60b3bb016952210396f6519b28a707904cde2efae75433d4b7cbf532692f4418ca05524a81c23b2d2102f8029ea70f0df060bffa811c99f4f7ca2be1fcaba59137b3ded915aa46fffcc72103116590733567c778b82edf653d0feb2f7883cf64706ff479a47b06e558502ac553ae040047304402204e0d11d26bd675ae9d2eda90da9fcb54d5d4bae639c27a133541745426d7d05602204f631252d119fc8a5462ed9b1bef75997e7f70ca004cb95bf278cdd53937be300147304402205ca469373e4e9a075f1919fa8f8299fe056b487f18d3f4306d4a81276ef93830022055774679df350a4ddd3c5b1891a14a65f9371255b513567dc0962f59a39e75850169522103f4dc4783610dbbab78b0f94cd828c1c7f08f3f08a04f48f3941ef2d83673f72b2102d28d3a971affea4f5fb8c5712102586ca8ce076744fcb94583df5ba7e91d396e210291d31c539ec31f775932c9aa50c9a9bdf77c5b41030bc55f0eaec0fc81494fe953ae040047304402203209c7ce61c58501f194df85556d4770dd68b5165e907572390c07d713e9aa2502205b8d30ba9715348d9e98633ec8bced1952f9fae69d4ec7595726cca8358a76a701473044022036a321c8265db29baa6f2453fd66be52a38b64132c09cbe0a878af27c4d497c302203003f9c3316a263b7c51c8c5ed79139c8a1772a15d084cde5ad2bbf0ffce571901695221021587d81128eb1edde9352b8e48eb6507d34165a126cfe6ab4610265b4a6fa7ee2102c129d86e32e6d13ada8792f61897172fece0815cca9e7371fd10e0606e352562210264b594194b2f6319107cc20c4537d35e4d6f1a26eb4000a38377e5dbf816623e53ae04004730440220639b1968f79697b0858e1ae81b3589fd9249d8bbcc1f25b9dfdc97c54e88cf500220258d5d29d5922e98bd1eaeaf1bf92f7a6e8c34e02e23b2ea3c1b274bc524130b01473044022061a45b8d6e53d23c1bf9c1c03725d53af93cffb6b497b09eac79fb4f752455030220159926a28f9dbdb7ac589d4160bf7156119ffb9be658a8f5388e6f0fe3a8e0b00169522102db1b9acf29a66b30d9fc5299270b0eb982bedc2bd7667b22010ed388069e727b2103b759b9aa7416544fae433ce9688c1aa486f0c47a24a8887e570166abacb3a1d721029c0907a6ec497ed1dca3dc43d737bae29a012b4bf44b820e3e2866f7379b352353ae04004730440220280e1804225faa912b0ce14e2f7dc05a910056a1cfcb91107b4d049cd6d186cd0220123cf944c645d42f071b479b875a25dc0205c53f2f65915862e9635b9313b8fe0147304402205c0ec8180f668164a64bc711117742b88f4623d0e47ab68a8ed231a95d6fe01402206f1e082f9e4c42e7d18f4ba299a795a734536db0d8345b928325154dc8e74555016952210217a9d9010b092377ce81d39c9dac9557113cfd95d1e4e9fc5b21bf06f36e5f6c21037fb7250d9b1999fe48c1ef3806a7e6679b0d3f76239c31bb12c629b9f951a7dd2102e0ac45babc8c7b343c7fcebcd8f63bc2fb8c5ded32fbe08039b2217cb620b88853ae47a00a0001000000000101af49357157f5d78842188d627ac0a3d5843de7374bf5135cf9b30c2420e0238e16000000000000000001ef8a1000000000001976a9143ed8ca8bfa28ae9d2666e3b3f5d2a582b7a224f088ac02483045022100c0a6058def6e69c5b953bc4b5130746638e4f5c5e3ae72aa92365d28a37731c402202523b7c66417c6212b00114e6d302a8777fa230486b8751f9481aa924647165f0121033d821ae2f23539a347827841ef1140c51becd8bed5f5a35e3627c08640aa79da00000000010000000001093cf057f7653960448d5e2e5956711da96f8a7d39b464cadd8eeb8c85c74a7f580a000000fc0047304402207ce859e94d0d4655b564b9386b68f289ba2796191111ae8615d44dfa3a186f74022035acbe890e140b96cb419e10b1f386216cd67f8cb5c0cf9dc3e82741fd9325610147304402207c8d3783be3d0b3bd0fd85c657946297f3ce3b9f4ea37b2dc8d90cf3cb6f6973022075014b57ced63f20cc296dc06e1aff2c49b3560b656ec3240ff8729265e3e6b7014c695221021cbf29296ec5b1c3ec35a87bafe3d3658b315c6064751aca1ed9ad7f26a30a382102d8b98340502e831fb2a85af9ae0c7c405b4187b8dde1ba98d8bd22b89ce2899721033590928c762d78fd13fcd5a290130b133718c775716734b2f59d41ebea8c4b9753aeffffffff3b73f38e11a4cd35b6beab25688aa4a5ff43c220d15a554e64c84dc9ef4348252c000000fdfd0000483045022100973d2dd0cb51ce3a2f2430bfc3f8de82d4fa9e3688482f037c9ddfe940d1bd1602206c66907a4ef9784f033863f15a504dea0d16d2315d9afbb5c1caff63cfe3375101473044022071ba864140ce4976b808f4eb82380c587f69d6cb1727ebbf2c5f37d9ed8ebe5b0220792023666bf789927705b52fbce8ea0265145e6b423b20edd5f712b90afd4854014c69522102e176e50b054f69ec7314a37f82c875423089eac858d252c52f3537a455ebba512102ac33d2025cd2803f1ecbe05b7f1e2fc073784d1dc36a007aa69e86312b52ac2921029539ed640cb43e2cd83d93d24cf43d98b21eb2afff9efff2777c66b143d1b3c153aeffffffff59686c1ccc6a613f97bb75f29aebba142ba0db48c3263d5b1afbe222006c751c010000002322002028b17eba056d8ae0329e646f4ff252c7c70d693f90929e6ecaa6fa202b189659ffffffffc960a41692f8d050a2ea755fe1da3913701f87f784b5f1aa253c936df78fed5017000000fdfd00004830450221008a3db3447f8fe26f09394da463fb3cbd01d49850757220ee6e1665ee66b80d12022058abd4e417826ad0677801921927e44376fba0a04c69d6dffc795387633a59e70147304402202707a9ad8b37896913efacf2a83240cee14ef9f8067ac5b6e56999e3c91be7720220326b0aa25a5055e12c22dc89180a24b6b8c989bd7658abca3398960bb027499a014c6952210303cdf44fca5d7eb9f2d343986e8e17f944152aed6444eb9a57395ea38a8a30b021038bb965741db59cc144facef31e0766b5119c761003f6ad16b6790dde8ca37b4c2102dbd0fabe871e4ee21e6d3d51eb9415cc82c45c5af12383a5cec823d39ce48e1b53aeffffffff85351fb9598c4df20ef1b25ae1ccf023e7e8442f95e34fe5fa7c0d9f6f6b897913000000fdfd0000483045022100d2262503d9ede45161699b677b0a662549fe4aac5c936b014b0e5c64adc70f5b0220735cbf4edb927985dddb92dfb6101b2bc1e8a5e6e7eed605377ff5bb53ea84ed0147304402207666c99de908ed361ae907eccb65a998d5227c7ffa5f5fd128e6ace15f2796e4022011a5abd28a92b9cdde859cbbe31205303bf68008c75f165bb73ca1ce4368d532014c69522102e176e50b054f69ec7314a37f82c875423089eac858d252c52f3537a455ebba512102ac33d2025cd2803f1ecbe05b7f1e2fc073784d1dc36a007aa69e86312b52ac2921029539ed640cb43e2cd83d93d24cf43d98b21eb2afff9efff2777c66b143d1b3c153aeffffffff1e6728f073b6592306b584d873f838814b11644456bfebd336fd5c1e2c0970a857000000fc0047304402206d58e98d7c2b52c2f12126491c301f9dd842b5d9953e93c0376bc451ad9b460502201f7c9c076201cf165a9ed6b5048854473ac81715fb3b7b7a58af8a6e5fc965fe01473044022071ed7589f18dc667783c3c06a68727e9eec682c195ee15f69ca94c754bb8bd7c02201806b16a131d9d258c31b7be8ef32132c3de20a9dadcb98bb3c8b81b7c38ba81014c695221033b498f5de3148c86467b9bd257457232e8e92a040cafd0e599efec28eee167eb21038e07c8a0296191e4c706a1d54613c9ace87d72ca25b1c86bb9bcc6b5bf25c508210203b1178ffa93838af236befc08694447155e98c6c18ca379ac77e0b39f997e3d53aeffffffff0975e88c75de7389691c4fe9d92ec79f6e23146bdd2ce80fb59955c2e62728e213000000fc00473044022079958be2313ba7e6d760d477f93920aa2f4eca71003a511b3ee18fc207ef68db02200cbd408646a02641abe4fc335561697ef354cecf3e458ed0f755301689a253c10147304402203f67e982294c5639211c0084df140018291ba5cd19792c8925e3f7e90b9d5c840220256bdd267fdf95008ecde9502a24ac4cb684ddf658a034079e278df8e74889c2014c695221023748f9725b5f38f6405a01028403af5ea1bf3ba95461c5c520e094761513a8642103b11aa5a515b4f1c70b09cd7dd8aa263cccf50e7db788c676193b9d70ec5e62cc2103a84ce8d4971bef3d1a98f1fa3e53e87176faec20175198d92e335bb42adc627653aeffffffffe8fe72fa9b57afb28d07d188606a561441e0e4f1047a2f429efe01f35df2aa4801000000232200208fdb005536e48bc0753b87c998074ce498e5eef6c25b4cbe7db7232292f3ef65ffffffff1e498c979cc7ab01b90389515a396e2ab7a888ce1a7890a43cf4649a731038da00000000fc0047304402206a63e0ed94b12409d4330eba233bcb1263f4a51592d55b3ef57d94b07c4f259702206e4fa2bfa092fb4903eda423a52a8a5ef6a97e889c05926ed9079d60ab018eba0147304402200ef78c81308845da1c0f8ca495fe97822b6b4a6598afebcb22a5992e1b71f81402202cff7e708c2da5c41f7202e1de0fbad2abb21f4ab24c582fb10a9ad06d723c40014c69522102f0452497877f3b34914ed8bcc877ad67a9cda747302695df9572c5e365341f1821026df568621fecf517d59becad2fdf4fe5ff7a21b6b0c7c591777da14b5bd7a3a5210252f422588dcb45fcb22f0cac64e3eadcc9af390d46880d16bbf3308fc8ec5e1753aeffffffff02dfa808000000000017a9140a9e2e266a4a0e8af9e009549c77c8bc9913cd518780969800000000001976a9140dddb92cc192355fcb6818ea9c19f06f3a091f8088ac00000400473044022038f6ec721533acd98a9d586c3824181de02805f8f480196cf98fecb7fd5ab77e02203242f1ce3db434b7ddebee3d92982d2ba2034de736ee56396b0c5854c80e04f30147304402204a764d98f4c718db303e796cbca606a7c84ac1369f94dc12dc735b77102198a70220342e85f02983c25caddc9f39603004db5cedd9d0ae1d0997a00b2719fdb358810169522103330b3cbf2c22a494d0152d5acd1976eb036bb3c49494221076e0b9c73e4220772103c4f422a802e7d700ed2445b6c934492dbf53160299d270cf62532aefc0980254210200fbbebab28c9e569bea4ce81df5e51030dfd76f17edd863e55c50a617d8644353ae000000000400473044022040892f220a31d1e3a0bca5903c85010582b7ab3d8d3616799d1e8ecd7a972de002205a343dad9528bc9166ca45adab64fed96eae67b1601d8ed8f5ecbfab1dfaa74b0147304402206b75e1e59b4f1b86aac0ca39509dd1ec7f008ec987a39866ad1471a73cf3912f02202a2ea7c24b819d6c1da9e49fca41937b1c42b93faab60b980b8bdd221a2420bd016952210238e7701db0487e7d34ce3732346696d4b753177d88ddda640e4a301cf2fc81552102a8ef460dccbc19b95a3b0d1d20add53f71f632114a78f7c5535c9adc74b48096210313fdb1ea68e008cfefce59cabe0cacac9c6bcc83302f5cd447d33aff7b783ffb53ae0000000000010000000001028ef3d4b6f025819a85c44336fdc6ee0474410ec3e82420503e3fa44de0c0ce260000000000ffffffff417e548ac7daedd069d316d01c5bbf0d7dac34aa04996e7bf099db1f93d1c4db4b0000006a4730440220216ca263e76d94dcca462ee71f4bb162526bb6be63ffed819c4705ee4ed47f1402201e59ea95445421e136daf912f865e5aef38cc94648efa4beb23390e08d528201012103711b433762d162bf7f8b5c77c65130ffdb42cada749c5bd2e728b2081bc2e454ffffffff02900201000000000017a914023a1d8030a8d8e19199f86f47268a788cf3d91e87842f0100000000001600141b57bb3ba790085d30459b3b4e68d1f3c7b8a15502483045022100c40727dc1188bd5767f7160d3fc8c4b84d7106d104012a659157d8f0963395540220712a72036765cec49aab1bd5886c00cb0495d17df571b4d5a9c884964bc829e3012103b7277bcf781c3f85b18d0fd88dbc1c65192a895c8f45e2dc33a2f05bfba7936900000000000100000003a93fd58bdd92f729f35681568f309bc085dc58729131252295fbec4feda9b94c070000006a47304402200d4b15741c311c2fcb2664e473cac5a2e645a49933294c347304682fda2f155f022064b42e95133c79d37ab457f8143a066a546bb7d065073cae9baf2bf3513411590121037a405272bd6853e89d5e23cc54587e1d827d14357177ef7bc274154d1de1b00fffffffff59a08ca928764c4fae0efc7ad8a452a144dba8fe3cf397515dd16b94b2f386f2010000006b483045022100f9ea1df119e03669d0ef66bd00171b76ee80151b96bea781efb3c082ad9f88da02201482f271af7ecee649d510a61fb593b4a18dedfd213c3777425989652fb8a0ca0121037a405272bd6853e89d5e23cc54587e1d827d14357177ef7bc274154d1de1b00fffffffffe86641fff884572d7dd2dad8913b88fef3e176faf28f6f1e1fbca79028ace0c9020000006a4730440220568931dac2f0a06146f4fc5a01d506326f96e0a929b2359546399b0372af962802201beb2c2ad8e5a8dbe5bbc2d8ff6a51436fd012fecc25e792151147e77b88d1460121037a405272bd6853e89d5e23cc54587e1d827d14357177ef7bc274154d1de1b00fffffffff016b13740000000000160014f0d92cbddca31fa631799cc447d39555201aa80a00000000010000000183563c022f3b1ee350f50aece9740a184e1399bb7f56a0e76655098403c7cf520a000000fdfd0000483045022100c7e7062550d7664587676b6f412f84ae66e8ab0130ce19e4c5dda510ae0afc27022006670977ca1c7ac70f01d28b4f7d9f5e98e421392967b463bee0cbd6f5239a1c0147304402203e083feeeafe8eb3683c2c6e876ed5303a3f4b24a86588419219861938a9a82c02202e508c63ef5c13987d61ca13ce9d3b38f9494a0c1c2d846c5c887e698d9fa24b014c69522103071bd92f1e6ed78dca0ca982666e312d5565f2c1334d9dff56c013e81be4e7b0210325136a6ffe95b136eeed86b17290d61346bcf02b1a243ca2ae371c3f1e3642fc210330cc37435f61af21a5db758c1aab78eee07a22b52a46d70368babd08a058b21a53aeffffffff02c05b0000000000001976a9149e18c42fed4fa7c43c42368b821996647ba6062188ac373801000000000017a9142c3a7c386df4774b074c2f3bdf629a6a5b5eefd1870000000001000000000101ec61206b80fda08a18b603f3657df5d0d17afb9807466e8842f82f919a980e960200000000ffffffff04d30f01000000000017a91494c36edcecb30a10cbdc6071baa472580e49165387d93705000000000017a914cf285d516f6b81bcb41d996a31187f2c5c75540687cafe0700000000001976a914d8065c4cfe87dd925a469b0bf3d552f8d12da42988ac15ba7800000000001600149f46039b440101a4e9fe20fb8ebb1efed686548f024730440220232937de10ffa30036534b8a054f80fbba0b08c3fa9a503b1b873f43ba6226aa0220368a2faf9b580956e5d0028dd3c7105009cc221a27d59e0d0e59cd0868d22b8d0121035df9390379f74a83bc4d6279fed162f8b8df08a48d735d408a95aa81b5813a68000000000100000000010210e3ea194b47b336d3da2cc15b72e6cd797aa00aa5b8920192c150721e8450210000000000ffffffff649e2f695dbe2059f57c7df2ff0adb40b89f1a13a435e00e88309c21aa789982010000006b4830450221009f0bbc964a251362cd849d296433452e5de77634762bf7aaea8e0f5333c26d8c02205b7bf7f95bf726795498ad6dc1d280a7e6a029116b630f0eddac5acac3cfc97c0121035348289cd10b6ed4716be950f1cfff27c3aea4cff856caa5f6ca5e66d0bcc50affffffff02a4600400000000001600142e051bb4514fca44b21e5392e4a81be1c8596e43405e02000000000016001427cd19d2bdf3a2d9fd4623bbfbd48995d847a54502483045022100b34ca034f837d26af1b12204b82b7d6f2688e1e9251a6103367967950e3cf04c022078d259af3aa1dec452819cdfb275d8b9a390f02bd6c3703030738ae14e788ef20121030877130e81d7e956f3091a7a723b3c79588a932ee38b976faed0e29940506243000000000001000000000106a48f6eeda8363cfdb44800f718a98c0bbe9a2e1c6ff22bf69f98d71bb7d7839d00000000fdfd0000483045022100cc6103cab6ea367c792cf25a768299a00bca9c93d2bcd8e10fd4a7e2df7eba230220466fc8137febf361aa54e62c223451e78c526947075504c28cff475e3fa809bd01473044022010b6006b63f0cc3de89e75d6e6f576671d0062303262b74094fae4f7be2a9213022052accc66e1e43b476e8a28babe1c14d45e1bb03aa9c271f1e2490310a274da7e014c69522103bbcae8200c71ec8e8f0787bebb70d3e9b4b7a462cad9cdf36fa892ccaf50903a21033dec73a674ddb8c6fe3c35cf0ab1ff22b17c641eb4a6932dccd232ba6674ed362103fd2de37ad1a4fdec977a955f354372e910ee946a978c61cbfe9987c4e73d787953aeffffffff9de113d8fcc910af28ea58fc97cad00fce87f422ee8c51177412684f58a647513c000000fc0047304402204b4bfef23b8d538363216b63670646f9e12b420685310139450f1299143acad00220099552c64ebf66aacc390f77f7b32bb49bead5f949d1cd81e7519081e4d404e8014730440220112608e0598dc491affb6dccfd01e69d5a190f865b9b2aa1c68be0043747eccd022034435c3cc165233771af25c50947fbf562561cc2f9f87ad22a93a3e4cf09d1e8014c6952210292bd9abc022bb4fcdc4c35b8c307ef44abf8694ca75cfe604301d6168853baaa2103f5028d5b03338587b04ee0064dcbca75ee7f2da2f9068f32eb19b1d591ca88a8210287b68c53b28079c52db06ced27a413618daef3592323addac97851e75eeeb31953aeffffffff708b606cb2e309686aceeb60fa3394cdde75dbe55a653e7076ac57ef8823aabd0c000000fc00473044022074b409791c4c0d16531089f8878787383510105511b1a9ec83d6e02dd7bc8e34022015196098ba5647fa41b2af5c53ad3de3afce58114890644803b4a0f1debd33c20147304402207a3d0f242082e26c8b812c69147af9874b4950700fcd02fd9b0660bc6d0663b9022021cfd7c57eb12a36a9bed93491f68ab80a8c64e4934b42fbca1bc2805a834cf0014c69522103ea2355c5f02e870cce3ce7bd01ed8a147f29ef29645703100ed48f0f243ee98d2103398a3cd7d1bc34acfafdda315b06f96f3bb980addaebd707470878d6db9c4d5f2102aea11e100f4116bc2c2176e3d2708c0f320035141ec8d9e8f80ce0428e81bec153aeffffffff3b3fe26c43b540bd6f8e2471cdb6a3b3072ff59a617db987d2c8d7a27ecd750d0000000023220020b9bcbda149192c3b1c879ea0a52ae320da7ba322cbf7e50b799e70b497b3cf3bffffffff7d9fb90364c8e7631abfb32e45f492a70fd617e82a06e3861d57c20f7f9b2aa30e000000fdfd0000483045022100fdb742213fa838fc5f128599063ff27c0c915b10c087900164a32fd154c6633b022024538c34c7dc4b93572e4dcfdefd79bd64deea4a06a7d4a189f7e496b49b0067014730440220447e8934861bb58dab200749abac0d03052422da6edf360601253f64a98f7713022070a9fd4b2751eb793eb2a8784ae8225281f8aba047310e5fc92f416c3d5af84d014c69522103721307f8da5fc49c056ec787132eabbddb1084b9cf2104d4a37969cbf99d7f9c2102bb210bf2ffcf35b37243ab65578cf856cbe62d93b4a0958fa668b6f559a6f36a210346c713dc216832ede557b1beb282f13598231ec2ba37b95aed1ee17d35f96fe353aeffffffff02a82850ea024be17ef10c37d1d65284d1224db8425d2c81aa3b159c50a642b737000000fdfd0000483045022100c5cc606ffa934abdd7087391b801ea93e6ac0cb24d14125af10156b6be0e35880220116096d276599ef29d699f7bf65207b4c28f7133824148640e2e00e3628ff09701473044022047f0c7390f513beecbb449e9e9749c5504217d5c3a9e5f71c880ddbe7d57828402207cc5e81dd4b0e4056fe2224a314360bdf0de0ba0697a361990016d8203077e22014c695221035771802e99076a8c8cc21730c97cbeae55760962668f2b5d593adc24856c8bde2103106071d3d3d5a0e341194870da9daa5ecde0f7a9a0f1df79aa33d9bc9ba6a01921024d09acc2136ec7e06b717bfb87c0a72cba7ce169c2bc3efc9d0fc974b6b5e0c153aeffffffff02b0202c000000000017a914d5af331e74d715b81b03753e92bfd3085edae5468760e31600000000001976a9142357604d68c269106f8237bf804d6c66e70e4c0188ac000000040047304402201fd36d7c4741d9cd754d25cb7a66c651ca23f463900f06fa2d863cef4f7bf25c0220521befa58b63b8f3b9375d9a5699d6f0864b62644b4fc4e6922bc299e9dbbdb70147304402200f14440dc899c7d0514a36bb8ea00584a29f5ee0060fc77109edd11d9549aa590220173db6b6eb3b4500691bb89e3c0da51f3eb35b1a34244fe78e4b2a86255f6dd20169522102fff87d553245850902e8a1665bc8fe230f77704b7fd2042ba48400a785b0199e2102536102764ff506e4d854502f9c083b07ec3542695c237e094d4bbaea5468f0a921030047c11615a7bf4470f4f66fc8190d53ae28c1b66aa218680a6c91e5a676965053ae0000000000000100000000010366dbfad4f12bb3875225d02df9b8895255138c3ab5e67fad4a7336d8188286ca00000000232200206aed7a09fe74395beabbd0b456d60d5a9134fb434f48789ad45a64adf63d4da4ffffffffccf2d05bfa9e8a00690c5d9308bc6caa49e50b5e2b430db7b98301c6e81403070000000023220020eb671be0f3a4dd87eab76e551a8f4fa5668d142e62302fc6673c1163faa3ebaeffffffff884b2d5bbf9de00aadf23559311be0cb4728c95af461b6d61d19ab70be1118c50200000023220020bcb8384a60ceb5239c6c916d87f5a011e8c4e4778da113cc974c8a51debfa22affffffff03f01d0100000000001976a9143a7b61bb4b962e1c1274fd34b6d038fe6372eab788acb0992801000000001976a9149d667d640337050c45f7841541fe6fc47a4b0f1088acca4f23000000000017a9140d5bafb6562da4d86913c9bf9fe09b60279bc63a8704004830450221009024347a3ca4e6122711671c7889fef3587b669f1ecc79ca2def27ac000db2dc022039cae38ae844d996ba573e66f76691b4d67cb46eb702c79c58c24f8ca5ec900a0147304402204f86fed6d3f9cf6c3fa00853a30eda4b7a098957258bc1a2c0f987628bb8a8d902201f8bee0babd5f5f28ff0473c61c2774a684e95de1788416cb2edfecb6c8b25110169522102de1ebba25ec02e830a9c949a5ebc9c0d322f2a01fb7c436050200bdc00d3e83c2103509eb046a56186193551f49d02b0e38d26d06e4990fed3667f6b65555b34758b21038db9a4adf399239a77485cc1ebbeea0ef451a41c2461e889ec5fe8b07366687d53ae0400483045022100da3b49a39c18fa6db5b11c6a9ae9ece05e7a232216e061d64341d6a78df339c40220748ae8242e04272a97aa16557c12b98a155c129e6d7e7ad8c0ad05d8a10c72d9014730440220097b08e0df30b36b2c0cb6756ce794d345759a9eef7a21d97ba448cf4f75111e0220212b66233c0a003d2218679df51ee595790af735cb458048a81b23e46455ec3f0169522103681b1900ff54053466199487e3e9eecdafd3f78f9bedf3757bcc8216961c0ea521028443d0a2aadb5dc5bd7a94a9f0ba53ccce46f24ad65dfc39e6d96252ca8c8490210283091a83dae4b602970b6d8ac0ffad832147eb7eca7f7e18859a85357f2a62d553ae04004830450221008ef9cc3e66827073bc3190b25602c6b033618e76979faca96a00771478cb5b4702207fce0b46168d2f943f29dc66cdd5c16e54c94fe7b3240d43d47d1907a5ded55301473044022021b4d1380407db8bbb6b571cab751b59442da56860d2b9cc59dd773607a726f902201629e73f0c62a9db6cac7e0ba4dedff6d0c897298365a8e22e57603ad972778e016952210353ba46447f6ba695caa7c8ee50b51c43700af32d74bb5627428ce0a57e2658412102be8cfa800efbe010fbff3a7ad2f0557fb44b4ca60b2ca5dba7a2b17653d72b2a21033ef37d2e6ad70482bc1f3f09fd21217f3e27437cb3ea32ab27b5fad8ff7ed4e053ae00000000010000000276ac70ddcd70e51c889e2cbed91fc1c01676fe1e3905c1db402d05211bc3997c01000000fdfd00004830450221008bbe5175a8f5d86035f616128c5c7c3ae07d4f7e25f78fbb57b495bc38efdc8102205910d5752d069c77799ac749a1fbb0e6c3d02a9ccd49103a75a78d80327efd5b014730440220644d334e9a4ddd185e50952a8f1e596f922446f585666bad28f9a076cef3854b0220334b52ddd2b0a7c5d9c8ccf8c771116c7fec10d5e4462d0d151f7fe47953d7c9014c6952210306a0c936bef9a0498858431314144b266e2788ca924d6c569f5bcf4060a486c821023515190d22f119463c1cc2ac8c6d91d0bbe40f6c20df4f02488407a2e9f18d242103f8e980f6e8477d0a436d8f7cfa4ce8b68c300e3d4b1c76a2b5c6b8ea6af76f0a53aeffffffff6b971189ec12c7912faf8cc52ff2a0fb5cb0bba260e8e34ad1bc45f3943f1ce600000000fc0047304402203dea7ec4fa5e07383db8510f09984e07e7b634e40dafe965cad050c1e3e2fef3022028a698357e13cd6adf8ed551e0df72ff9062f1911f0aff9edaf1c4740670ce3d01473044022005bc5794b06118aee1d654385cb449254a089365d78c8d9c0b7893ec32673b0302205a58e897871af6f1c6abdc8c7dc2bc2da09227bdafba507c63744391cdab06da014c69522103795fc4fb9ae3f76d099fc70083925faeefad00fdc6d2c7dee88d83dd9694cdf32102517c61477a6f62fbc82000249e8823cd53b4580f2fa65b5417c1a92b670079a921033e6809d844bfee20348ee684cf57e459a8ffc67f1270be5077b54783778ff96e53aeffffffff0299021c000000000017a914230f436777d764efe3d946589be2c0e627242d84875df92b0000000000160014d38729a0ac4920498be5beb81e6509421862630048a00a0001000000000101d0ffb3814512288e31049ec525956b7ef6235916dcc1ba94a4f7b1135082d8bc2f000000232200207f457a48ba1b0d808df1d7c1bf42f63c4c721b34434d9377dd8b22ff436a095fffffffff0937cb00000000000017a91431169a5e94cad6d08e77e881430667d0fe7067a387720201000000000017a914dadce58ec5e793e19a0300d7aad43d4c0258a66987581701000000000017a914a1f36f4fd7723b3a6e351d0584e19986f33f706f87b0300100000000001600146373e0044f7c5ba88ae3c09b9da6b125004cb0eb8f180300000000001600143b103a60d7b542c3b92ede276c883dffc5560bcf1aa803000000000017a91463351ba5eefc067a229ebf1bf4ed8c2e833590bf87aace03000000000017a9145a231843bb5cf9a90f5c5f6adf316bb61525cdc987d592040000000000160014cedc4d024e10cd9135d1227e5cd4fa19a6b3e30430ea08000000000017a9148c6a362e25f3670508905070ea4580d8c5a483428704004730440220421429c0eccdbdcc60d665571c8989bf7d3aab24fa8a6128170fd058a84cc25e02204aa3fbe02dee521efb9a265b2acba068ed748373f24652e8660dbf76dd368b8a0147304402206d325756d08ecb3e7fc6f48e12ebf4e828d1fda32aff5fda2e079ea11d0f5231022066d871a66d71fff7208e21b223bc94a47c2beb3eee544eebc7a1b2a62009faa501695221032326326a58fff2211369db39e4c11017e5f5ab4ca3c052e7e20db559307492a42103ae96b1b8515b203699db9278f13808bf2027e941d37125f43dc762281409f98e2103e4f64b977d239c1cfa773e1cf9fe6acb4d1de2b635a36277324fa5e9359c30d853ae48a00a00010000000001015046dd6dac79c2f7f07f8e5fd885aa1c7f20bb580ebaa42cb004ab56ee38d7a304000000000000000002ceb1020000000000160014ac5d204f54904f7bea7f10e7358719c9b958650be6620000000000001600143b103a60d7b542c3b92ede276c883dffc5560bcf0247304402200da50fe40e5bcc3a04cdd10f81af9490665351bd2bca85e4322efba2482dc6ca02201b6f43879a100a01185a2950b3235938d4fa1a6e72e0fa9f5ba15683f3308b1c0121026b209bc70cc19754bab4ec3a7cf447f3d484d5e74ffe45e52eeabeeecc6999f3000000000100000000010967100e9f5ee1098166b93221c869ee8aa279ed299175219573898f3a82fb623f0000000023220020c1b75ec37eb2db1f95058e19167427ef89e01c13453b3fdf9ab4f01fae315657ffffffff82e4db70665b240a1809a92201aeb988524d11a5af364e58f2a38b38c431c257000000002322002075e3848ec5e9e59f3851b0b1a9286658826f742020860db2d43428cc446ac614ffffffff795132522b41e4bf69d7518579bef7db715ae65ba60e2f4893140face1f91fa40c000000232200203673eb0e3a619e8c6cce72e366399227f0c993bfd5dfcfe9a15350d2216401d9ffffffffea3891ea5894974bf8391332a777fbacd94b3ac289ad328c0a03ef86d3ebaeba000000002322002067e4d86328c8f40c62e5ec84e1614e6d42373066f02f3e1f92baa8ba41e4888fffffffff53579fae2bd2839ffae6489f213f48d5e7fead06d7fadeb34982301d42c15de50000000023220020a06fee00d7a34e61086e22b5daffd617b41738398038a428825f866a4bafb74fffffffff6acbce79877e256ed11beaa6ada7626b731ee38d0817c45a023901aad42151f40200000000ffffffffdc535ce375522bdb755377410fea206c1bb2d6f619f376c043d162251d4becfb000000002322002058db57855bb336c5a53ae251c592fc63b04a47342c5b75fbde1c04bb032f9ceaffffffffa26309e06ae479fa583376a1707793920f928dfcdf63a460bd35f7cacb4d31fc00000000232200207390809e6450440b788d25f5811a765ec2774676fbed5837f18458a73ad44359ffffffff44cb05806c2fa23eb0b87af3eebd9fe083f0ba190a4dbec27b002eef6f30f5fc00000000232200209c1bb2497144e134826638c1cbbbe81a9ffae71eb6844088f9c7fada622f8b41ffffffff0560ea00000000000017a914aa5f1a9d8bb00bac894f3647b2833dd57118b9f58717ec02000000000017a9143d84b9cdd8ab7dccfc4ed6855dc04811da0d156987d5f70400000000001976a914a242f93183e0a470f5fdcb06a8b1f8e529a16bcb88ac1ef11a00000000001600143443c18fcdc27c85de1fc83c35603d004d925807a6d7f505000000001976a914bd836a3704efcf01589f34f678db967d19756a6888ac0400473044022044ff7141bbdaf792a0eb7719f4eff6c9d7d8bdb152e70fdb580e162d294deb3102205731f83313a24f51b88531886886e1d6a6688794c4d9e11174a234efaa481217014730440220053ffff4dc2f664bce54b9baa850e0bff2c4b62f741dbec7592b7501bba2917102203475e8cebb6b90e5df1583494befe5d28dad3cb64e33517e9104743aef91d1e101695221029360b85fed9573aa0bb434322f0799a9f040cb4c2263b69428113a72c7a0ad8d2102c0cae548d7fc722f8a1b5592a44141a8405df02eada2540587dbe8314af08c132103cc4d61ff9eba9bfd3d962309f5aede55309eb0fdff7591a39aef700488900bfb53ae040047304402202a5adb1425373852f9bbc4c83cfdadbd53b07e56307e79c8ec56243e00ccd39f022031bf44aa6d05884a3fe098a4049e43810714ebd7bf7cb98bf2cbb11d88b70d1001473044022055754825ce2adba1080a1c3006cb150328e8eae229acc31ec55cb0a6dbc2919c022062b7eb93d9ae904eb4d7bac84cc21accbb893b805cab5c355e88fb680f18f81801695221023f1cf93fd984cdb4fb685d8c474cc09c1539fc94f650e73eeb5a6cdaad3f53452103d7cdab4026215acd4deeb85637deb517ff472843dea44415d182fa4c35437990210321fd151d5336f1c50978ea912f5e36f0485426ba693504ff596a999cbafddc7353ae040047304402206f79775dde4a1029a6df865f3964d05360de9f84c8d7d0bdf93247364b2f9cdb022057ff6c3de85102518da8638b53912b5087529961626a0a52320405fed7d643a50147304402201220694fd9a668512880e4b54ce9803cbb9261db97ef1f5b666b7f1b471289fa02205cf733922fe9e83848ddbb42617396f3ac619588f8dc60567ba6d2c25252232901695221034a46a4c6f821b8536a83c8d1bf32f5923a936232e37f5ba203030ef87e76046821024229fd469f2628b85b1062cff9df88f7007f9b6150783547cbeaaf57dc61466d2103a2a138626f2d88f03dbb1f0759905984c1cdc8d0dc33e596fa39d589684169b253ae0400483045022100d815e1ee831b7251bab696e0299d513cc6a48ba358dbf779e2129c579168d76802204ad4bd9dbdcd5693040bf26510493709ad6b5c8a3953a50d48e4c1846d04292a0147304402206dbf8c669c9d449b7af6108834d37b84657749da489e16f322c3b8ae961fb2a902201ecfb0724efbc626448486db0942434ab5ea44301b4c6e871f112c9eb5ec78fc0169522103512249702d99688e037701f675e1c437352d6f46a7930fe9ce67223d687eae18210237fa97432c728eed98f4b7903f077cd715fafabd22ec15679fe24695a13877ea21030be573791aa3db4bf45a6740a79c0d2acf44fae189d251bb56e0946126c7bab553ae0400473044022043c398c0270aa64a97320879478183023c9b61998f9bf3a1bda051f91be7580302201a506c80e974f894d927fc4b15130bc874c5e21d53eeca68db31a1e6cda78d9b0147304402204dd7d30ed9799532b12c3ba1196f9f5b9dd98dd574f5e9fcd0442c0a28efae7902200d5b0828f5aff72f80c13ee74b1b3534368744b97726f46b1f0a7b4cda054c1e0169522103468fdf077291a01113186f36abe98a0d29b7de04f02faa72d8b735126a7e74f42102fa38b21323e7db5b20509dfb0ac1f9755d5c2b1728e7deb82631f7c3403fbfc021022e35c77b5f253cd97cf044cb4aefd7541151a87178eeb11a8284e887d5e143e253ae040047304402202e7697e0d70b69eaf5c3daabced3f159ca022f4d3f2c408638779283e69200b502204da7e3de378aa839f5bb3e437bb994934a9576ed44ef2f27020862f305ae6e6001473044022018973da37d9416e1815080b4095098ffc7a2b731a7eecc46ae3af56cc1cc6482022002b0415bc97682778cc41c909b5f9354a9c2c98777949777b62e49453b159980016952210312fccbd687d86673b3cdc383adc97d2b25d7540d15b8fbee35dc45edf1b7e20f210278ab234a1cfae6e92355089efdd87354013bd333100e4d33d47104ed2036d9652103be9ec9d92a0d278c543dd0a254cdfc2816da093086b895d6dc49c871fada72b053ae0400473044022030645f0d34c9cc0fb214d1a543a5d1907574dbe417514b048d137681672fc07902203a48ef4c9c919aa101f0781dd0f9aefcbeaf58fc8ef8e040db7dd618cdfa869301473044022074543a2b819df0a82a2ac4b321e85f11377a9e9c6e52f7d50208f87eefc947bd02203d994ffa9baf7b50da6841ee313bff82f4191dc692e45628bf33660206f919d40169522102a7747af975b1062fba38dfbec7bdf7aaa104b0c0ae9207aa9763e548d337826e2102816d6812995aae65286c249a7fa5f33666574f31b4b10d96508dfd6a5d0e555f2102b2fbf55c64cebd9925103601da8ca5ff8368f79a175b4ea9a8f0b72c916e280b53ae0400483045022100cd85991d8c351f045fea7647f67bad7e7bd7cf2783d353218cec6378935ba8ab022003e98579457b2ff3bc0ffb4ceeb6d9a06732e73626238578311b12903d6336a8014730440220796cea18dd38a1b1d1eaf6372ea7a5e4aec0d0d7765159a92a99167e463bf7ec02205319c9aca8189c0faa1bd64a768143efc96f41b66e5f5579946d8947b2110b0201695221035025e655162ef06635382252b6bfcdb11a7f503b1c7bed914ef70bf96a45df3b2102b2f5ac0512c3e163ee3bb2e5c86667e250a95594715bea43aa1f0e2713266a752102854727208e823c96402448cafa364087b573c39690f667cd252e6bde9323add453ae0400473044022077d457d60b1b8927cdb4f4a1b2c25970d461f43712ec2d1b719bacd6425a4e45022051adb50e82515c6fe248593dc1d1c7ffcb512d438fb6b0bd7e7a2bb9ad9b54d30147304402207ba499ffa5ff236da4dcb4758a91b9b3abd31b500b794614fe2294d76d8ce39802200dae66416836ebe70b4ebe2f29bc985da12c8a0bdede22b8fb15d0d9dc39337c016952210299cfc55322183e4a88f823a4d34f3f08c38ff3f0a5c313ec89c0555377ec94cb21039a3a0bf9f469d13987e017728834d692d51791a1262a0a47f46e7ad35262a993210281c0339a2ba488021def4130d609276f42df9730aa3f14b862a4956786f2978e53ae48a00a0001000000000103e0a943467f7dd7916784831005b5e67df3aa4ed3fd1f3c47b308061ed728d1303200000023220020f9066b0b44bc380cb6ab4521b28ef607f1d5755f1d64cf9429b531abce8b6b6cffffffffe94d92cb8a913253a540e69c85a150cd8374c89617e0b629be30f5073ebbb89e0000000023220020137ef05fbd153d5c9b7602ed6a511a8b7d4b49dbd61bd9df3aff2173d546089effffffffef3eb3a585b7817cb8acb5c8afdd30c8ad1989fba95751bf74bc70815e93bcdb0100000023220020d14d2dda765ece63c6a70a5d5945862e8ffbde61d7fa83182ce3fc02c9c34bb9ffffffff01804f12000000000017a914f24bc902ce22924dac39e66db479ceb17f35b396870400483045022100b165a517961e2d6f0e63f6a3939776c80a7d24e958be6bdd41dc24139352e85502207ef39b52179b44e7fe8a47848f9cdddd2590e887c43d36ce81bb9d60300ad17e01473044022003fb290ef74824e94faa5368b676a683160cbaab18e2128f49f58d746a8cf7a0022047598d6f7ef4ae3a04ec235e66402f8db985fda6bcfa2086ed43137e22431ac801695221027d20ceeaab5a06e0c79b282f9c45a22aa4656adbac4a400705a2612bf7008ea42103e86679a82f936f93bdd0ca080b0513e2f8769d9dd495e7d5fe95204d887b2d4e210265b305a1247e02e9f8de7e9b31bd88d5b504f53d816386cc087565c39b8c05d753ae040047304402204200a942bedc486f67efe411ac07962fbccd37b5f113b621e6fcf4d1160f92a002207250ff3857f607efe70a1fa2acf7841fcdaea5a36fcd9e1db2864014e6302ec301473044022029c83233cfe0a8df4f142dc25c735e3b6aca15a31c4809c9d8f4e467041154cb0220108f41d73ef60511f4e92d320d42172297e67f430123cd791e68392f407907210169522103f3faadd482016233a977e847202fae3faff5b92ab21b41c9bd9b054bfd22f4502103d2045e42e62171b41dcd79511539b2bbf1c65b964ced74c46de46356579d4ff221032ff4fde745b5240e8ff4f6d80c7acfe6b085b45249f29d1240ad25e0cfa0c16f53ae0400483045022100f12148a61874cc06673dad03798ab95acec29af4384b877f1771c2bd3a899e1b02207fc60099c717d58ad95470ccfd45cea133eae6fc30b69111bad23ee10d3cad790147304402202db83ad29a5e6042f10cdf1feb9599b9be340fc6b973a93c17a204373f895be302201e9cadebbfab459751d43d458a7bf89ff206939ccb8214bf1c987390be1fdc030169522102e89943233b1fbfbe2037feb3bb9b1413143e992e4589ff0314d5a715ae47526a210219663c0f1fcc64ba7a9aeb38ff9404774dcfc7c68584153086cdb2d5b518127721032dab328c13b34087648d3657787a9347db71047794ad21d51749e0fb81ed801753ae48a00a0001000000000103be964aa85a870b9cce0248f61aea5f490d87ede55fd0054367d06b4cb29478550600000000fffffffff70fdb3d7eb762ecb4154feed197ff9dbefadbfc964eb17b9a095186606026940000000000ffffffff24feff01dc5294d2900cbeef064b16db4e591c35ddb75b3ab33d2c33cc4366d10700000000ffffffff01bef6290100000000160014048d0381dbaa8508c4fb9452d080c361e4095ea5040047304402201e175e9dd9d62898bb0462907118bd2283c5080d44fa310dca7011ee42eea9ed022014f9358e340c748c5cee5f93ba602f3d78e0bdf2a6d4aa6bbf37ef89d96f4e6d0147304402206b0362aa4f4ffc1585e74770de99e7c8dff111d13c4ca13e983b8e803bff1ce902205593b5b4d66008b6f6ec25904ff03051ae2519f0c79ae39da415cc2a91c8c81d0169522102cb227d4e7e0aa21ea7e98d484681d4395fe653d11d004f1c25339dd543a087762102ba90a03ab74ae2d5eec2d1700930213fc7c09ef64ca2750f109b34eedb0e9f0d2102a1b8e44c3453b9935868feb5093b4aa2460c31a43abc471ecacad597dde021b753ae0400483045022100dea3d9a980d02cd9adae664cd8ba269e26e6c1b3c1071999a4eb23f10f925d2c02200ec871fff8af08b8f75e5beecc0d805318b243e93feaab802c2716ef91f8a83b0147304402200818d9aeb9b808fba6349e8aa0ba085726719d8b1c6dfc4154ad48c77ea6ee2b02203e18bb2dc1aac6d96ea45d234fa057f3102c3812b8030f680abf3adaceb64b9201695221034fe63baf81997b4c9481c2b423c778114fc77dc47a9d675e979c9cf082cedd00210285fe53b0869fa34d743f78da780fe9bc4675aa678ad06591e2a6517e29bc3ca82103c1d81ad963432f1f8956e74cac4b90dd93a70d0e1889873cc9a8c19dad61e98f53ae040047304402206cc14ba14360fbd4b91332236477bb36f37769bfb0e851704bba204d1fb4756e022055e96f6f25c19d1c668017ba7243108efc96df9f96b915b4e718f78b519c9cdb0147304402205da25f68838a3ac809fc638cf60f08f1b82aa5943b69daf5aa08a55e6df9960e02205751206bf29ee63d541ee166f1dd0eff7aa1adf6e5d819e97bf9836707ddd7170169522102be7614aeb19d70d0a9806d6198801ada4fde5376dae6a2332c612b24cf445dea2103fc14411492ed487f712dce818e1d344a910f6d5c59ecf9ee0d5a4f9ce8592ae02102c182a824924baf2368cdea726aeff8a069bbf9586ca9ea9705cb01cf98be0d0953ae47a00a000100000000010151bef0b29830defd1b3b7eb30039e17b8af5859cbba0dcfe7c004c6d29f529d501000000171600140c1a4feeefde3330063a0c99969be8ae94098945ffffffff0178ff00000000000017a914ba2a0f2b6bbde25070b7deb7e127053fbb3c636e870247304402200f46bbcc097490d1f3017c2c1f41f034905c559e123b7d6b13e1c3d64cca2590022062c99fb48d09b34372b82832a0f98f6eaff07be3fe12cfab02521e5018673933012103b728cb55b9ab95ddbe2b75c62137db2960b98725fc35e34550fa05d16e67206d0000000001000000000101bffdead4435b08cefa6aa89c625dbaa353b2d13c1a07b5bee2bc4c9253a4680c010000001716001453dd0aa89db6725ae2f9c222ba1e52571429faf9fdffffff02a28701000000000017a914e50fde399720d37868229f96f5dbd8652fb693e587203005000000000017a9143f3648191b72ffe32bf9882d0f7583f6bf91e706870247304402201bbc910c8aee09400199d50754bc5fa5df527aa01c1f2e943088a020ba8c5e8102205790e557699b6a67ac1afaf068b3655db3fdc2a259a32250bfc100b7a23bce76012102a8ad331d4e3150f7cb809b24d5016427f2503f057da8a6c0b557b897949d04aa47a00a0001000000000102fa78a3824c6412878dedfb8abccccbe3aae60d8fe5c39deb717f8236b10b92130100000000ffffffffc33cf75e05ac57d7b5a907d9472745d3fa8199eb9fa5d836857d4896451ef4a80000000000ffffffff02d46d2700000000001600149ff1de52633718e7ea76bb6694fd8e36389619d15c8b270000000000220020a6547fe21cbeb7d58530ab5fbdf4b68989e24492a5b28a9e4eab004fccb72ef8040047304402207479874282719b6399d99f748ab585c778e775aab8c5b0d4bac8585733fd5c1402207c7921156fa2d523e72a1e5711f35ae2918509999aa168234f503e6e86e1b9f801473044022042817777685188762e3dfee11f6c555a83529a86c78f63d14ffa71f5a82f79a902207e7f7b290fb132e78c94d074c8573814cf6d2a3917ecd48abd67ac2649aa17180169522102acd2db76324590f020976f46d8996ab6e0ad401746baa0a9abf5c28b7c8695012103d9328afbf0ac105f986dcd7ed97c85ff901c0703b4be0e5b85d6cace9b3b847c2102bafcea7e96a6b76dc1e3feda6bb05a4f265f2b144c5c564175d7e91c2a3ad4f453ae040047304402207279b3c93f5e73e5d528ce7cbcf6d82f84c6e86e45c5c48c972751e2d326473a022021dd057a89f5893d9cb53602d384b9813ec7b18848fb4b59ce0a82b0a9aebb6901473044022052c9b586e2ec04fc73e8e5e6805c5de456f8156c97898a6caa0e11cd0c6e166f022069a767b8b04f710fae0f4b506c998b3bfe699df6d2f8654bc36e533fde1daeaf0169522103b4f4ce3a25b5f1ec04644f27b15ba9ecfb358bea944b0d372bc45a95240396fd2102b1ab2f22122652ced31c212d6da8e00115ecc556da50f116187b6afb5af65d1721026c88618476b32b56117f1d5e016d49989aa626272fab48575e74dadafc0fe9ad53ae47a00a00010000000001032edbac635a9086d4f38faed923fc42b26544c486ffe03dc340c3bb58de8f49340400000023220020f40f0609aae71da5164745795332f4d3e5ad138e6e1701acd89542034454bbf4ffffffff417ebefa13bcca4b3227e55ce552106ad62f15ca6eb9a23013f82dc57b870a840000000023220020f40f0609aae71da5164745795332f4d3e5ad138e6e1701acd89542034454bbf4ffffffffb39010b7761ef9a529d517118a9246d3667bd18c150d717bcb105431ee68658f01000000232200207a3a1bd9c294343f85b924fe426fb1546500eb850aafa376419ec7d4f4cf0de7ffffffff02e4191e000000000017a91443353027bc2c2b67d97cc56a4ae2a28be30f63da87a1521f00000000001976a91402ebd7a928a66eaf6b10567c8f2835e32ea29a2a88ac04004830450221009c132a9ceafb93c6e71f55a4fc75b16b8d19eea5844bceb61004b13ddc07f72502206e1b5047dca9eaa480e70552f42b002d3cd44377324d38fcbc95079bc2fd45bd01473044022073171097f41dea9559ba51015e3c99049bcaffad78b73e7583c4e79d2b60dc290220459ae7e015b0258eaedad1b9f5c81958bcddc4c41e518710cee17c4ae608752c016952210280e022f0f5dae84c2aed5174ef4fa6552d51c8f8c981e63ac83547ac1bbad9ad2103b447a70f033139232e826b4f1de237405d67934fb5cfb2f9c70beb2e51e8c35c21034a04cf51963a3ef43a86bffb00712cb62c407cd42c718a02e36bced7d079a64253ae040047304402206faea1ba82a9f903c728db472d12e619022b169def4a99d1026e973ff9f6eb0d02200acdfdb76e1a90f0771a358076816f627a4657b9b408b3bdb9b5e8b26b9314e90147304402201a1c9a06c1ff2a786f1c041c93c65555a873d52ec8a934a9f5ea88c1555cedae022042bfc8241673622ff2f711302b81ab2c01508c112e19f80a21a27fe7a144997f016952210280e022f0f5dae84c2aed5174ef4fa6552d51c8f8c981e63ac83547ac1bbad9ad2103b447a70f033139232e826b4f1de237405d67934fb5cfb2f9c70beb2e51e8c35c21034a04cf51963a3ef43a86bffb00712cb62c407cd42c718a02e36bced7d079a64253ae0400483045022100c9268f373ee73ecbf55de2d11d2ee1f1b32924c98b459fb4d5ccd27e48d60d890220128a35bd4bf7d940d07c33c42a351d769fc3f6da5c003330c5f9817151e5b9410147304402207dfb9902bf94bf825d6481973ad67f688314616eb9cb4c521e29c8e59cce3dd8022006971350451110dd0bf16f3f08ce41068c3879159a017aa26732a224901f0d1201695221023df1bbec06425f239326c1dcf56096ff8dd4d7064152cbf8d44b95032594b17721030f8239e01b7151d355f4c5779fd1753f441667b5bc6033592826b401e613f086210284252af1b4823709b7e34cb2f2ee9d70272d0064eb29dbe89907b394daeffef253ae47a00a00020000000162c7023067e19f1a5292e65e2ae34aee3da36f0ebb28f30a87b6e6bf49fa3bba01000000da00483045022100bd4fbfa828e77ee2358e435264eb13f8be828749eba3d5e11d7073de4560e9ef02204314bb9471084981fabf11b682608f3d1fd89ca813cb3e96429e9fb22a0b967b0147304402206e1ee1ae1602ee33130db08200e2c8b07caa91b92e365324d55eae1b820ad59802201b6b7dd23e4e10664f706942b22596abdb16fbf337fd650b5e516e2e6909143b0147522102816ab738135fd14996e5e7634d0a536a8c0be8a27f780895c18214a109d41aa02102244dbdf46d1367c6b8f44f2bb3153c8843347b440a2920f095388d5a9807b2b252ae00000000022c440f00000000001976a914f1768ae6ffbb87191b8600fb69bbff7b070c9f3e88ac8d72a6010000000017a91440634823fe9a4a47a51d1f4f8e81137c9d9d7d79870000000001000000000104bbabcca2198fe3013b2a88270260387363ef5213f190ec45a8168d3c8117d8200000000023220020508cba13b94cbe7f139d29675123f7d79c258f809deacb78c7953b6ce9bf07a4ffffffff022bea7421a8f8977d9e4b7c0c5c540e46db54d9ecbe628f81a334ed327639bd0000000023220020fc17ae29044f99d6921a916cf8e8f2bc0248e8cd735411666253d348dc42c08fffffffff022bea7421a8f8977d9e4b7c0c5c540e46db54d9ecbe628f81a334ed327639bd02000000232200202c42d1abdee3db86c4a10038b81b43f9595077a348a56dfb209c8e83c28b1c3dffffffff022bea7421a8f8977d9e4b7c0c5c540e46db54d9ecbe628f81a334ed327639bd0600000023220020130831d177ccd71afa7ef0c06ad98fe19d4509a9a8b668b49945548b1831e7faffffffff02a3ba27000000000017a91411f70e8674cc7746036ed8e932ed1789446d12aa87d05ec9100000000017a914ef08f58ddcede15bb6e82c72a7bdce1af788ae3487040047304402201ea0f562aa37e3dc7901d9ea6517f5616ebb64c9a685e9755cbaa958491a6d240220299427e84964bd590bb846af286cbeb9b91ca947966860f02a4a58a8e3ab4a9601473044022046fd1194121800ad5748b9c6d75cf42b15f2b47782d379f186922d4434b80db1022026ead0357642331d11f2c98303450429468d2a8cc37a5e17d17428b18879be4c0169522102b95dcedda09f4ceace26e0095fc5fe645e1090a3bb2f6cf66914d8bc52fbb07a2103404e82d4eb50b6db2c98b88ee6ac26caec187eb72e3acc5ed356bf07f657d4f221023486ab7f288087e4468638c8ee2f84ed1c4cdc19e3db31200e40251b60cda6a953ae040047304402201b8964b7a789d3b0a9349cd06ada6e86365bc2a7b67f81063ca7838e6f7bb67a02203646314a84e35b7f673d3001ce6cd126046cd8fa06a7efe09f22442a1e12db3101473044022007aa77a0b14be273408e68ee1f44096f18aaffaee658641127eced562bdbc65a02207407aa7fc8e969a1acbdc285fd60624c9fc9c2d5614968c3520dca7dc0a49412016952210379391669b0006b8500ad7666ab87f7e66e5e277269e934637ab04afe568808182103f9f13d04453b47958f126dde8d0f016c0c9f293ff890021af0c546aafd463afb21020f16211bcd306de33b66af6e7d3c2ea28645f9efadcc139fd0b85f5c31774d8f53ae0400483045022100b00a3795f2672aad9895dbda77532ebfdadf129130aed0895295f93131262d6f02204731f21147985656c393b369fb0d73419828753fdb713bfec02c9e97cfd42dac014730440220044eb953148a53fa7a00da38403216b5ffb79693280f73487b7aef53a937296402206d6f1d3b6ffbb2fb1c34ab453f1226e001801c61893a0c6a11d7313e43729d500169522103b5d9cdf6373b7f9a2249cdf64e43352c60a03c0e07bc9a85178955c8cebfd2e821021fa2b0c70e51a4c86b6543e77473e6d76eb9debccf1640832590febfdacc6aef21033f3855923421c0db28ed27793980cddfff05289b83da9fca9603805b6c1840ce53ae040047304402203bdeaf16347da7db367773a7f199bcebe0bf2c666252bc1fff881046ca4d11b302207287870ffb156fee72b12d8c4b1ee020647ec460aeb07b4d186f9a5389283c120147304402205d17798db3bcc9df90a6d08c27529471ff800dc3480e8e04c0b6f2140d3e145c022049ec4ddc0c20b6525aeceea09fb9e685b6a8e8c066c9e6facdaf7a10103b26d201695221038debf466d756823e5ad90f669ad902fcf70469dccc8d96b34064715a6f307ca4210318a000b05a387f4d2b8e87a19aaf7c29af94a5971280f83d4f9018bb06fda652210284bd7f613327a0961789b18f73c846fbe66b661e760e023becfd82711257ceff53ae48a00a000100000000010103e334d93fe962f07ff3eea641e492de620d54082e549b2c603cc4d71bf9788c0100000000ffffffff02b0ad0100000000001976a91417b38230e22253b56c56eec51d222e0203ecd6c588acfc6d3600000000001600148f35ef41d10ecd22ffab5aa309df1f299e391fbd024730440220015cf9615f0afac48f072764a6fa59c63cfb17f1f55a3dacc5d1f63972e4341602201d90d3f380d99af4c42b9e949f7d6a512e751ca3b0ae6ab5a7d87968454e66b001210299098625ea281ae339d9f660a7c1f40996b661369ddf4a6168a9498aac828a0600000000010000000213a0939fe113832027aaaace9f25f140ed19b8290826d79d67321b74c956bdb2000000006b483045022100fc97fcc437728349fc741d38e4b1499b8c94e97ab4a1b0c3bfb5f42fcc7cbe2d022062a31f6515c52264a6920f7be53829e24ecfab9648dd8cb60891a7244fb30aac0121029dbb75e27c953d8e3a5cdfdd6043ac1bc70837c5264d43d8a2e1fd3dbd14453dffffffffcae8a0580c989660922b8991e990b42a894b8c5892c5044afe709e40386d3f30000000006b4830450221008c49669b8b7d0c56f563798613b23a38dcf0a4551da0d3360c533478ce4a1cba02202fd042c3c645a161b49ffcf423e49d3fb5fd35ecc8a81dd4471f46335869c1ff0121033d24bf38988feafc944e9ef0c6f798d7512b2128ccddf5fd11ff090b52fd14d1ffffffff0240420f00000000001600140c95e98f8572914a4eaa58b9c03acdeaf1d244958443ce0000000000160014c251f9c4feeb566e603fdce803b8eaa1b11a5eae00000000010000000001057c5bb5d7e563a8cdcf1d3cba97f4a4693dac5b63037efb39a21dce40e63bde02010000002322002062265ead317088bd888cd4d4c0d5322ed1d5d7fd769eb78e1f59c45c7e124d0dffffffffafc3b3ea4357eb7559505c6c81a525a4d8060d480b9356b69a8ef9a8c8aa8d2902000000232200207dbde115d4611ff2cd834d0d1e8d515f06d2539062ec883a05725045600a3f8fffffffff7326094c73359a8e841b30bad10f1a1098dfcae2562681a1e3d085ff3b4d014501000000232200206b409964bbb5081a15714ee3fb75d62af85a09b410cb46606b915f8f48e03ee0ffffffffbeb6de9c3588fc993df2a6021db859a995571fe9fb9ae279e1af5c4606e0188f020000002322002025b9791689d1f02940791149121fc71da313d56364b3ff12fc53f29fbf30e191ffffffff9970b10a4e9d2c70cf256bd847fffeb5fe2d1aa22b4c287d66681152d12900b00100000023220020dd4a082b71b5dbfac2347643bf386bd9906ef52aa36e8a17e47cfac09427e1a0ffffffff02f4cb98000000000017a914ec804bdebf1af929af0bc82b88b72f0256446509870065cd1d000000001976a914cea3656b5e98d764bcafd4b62850920ee426c70288ac040047304402202a488d243815b1ff9437d702c3a04caf1fec2b68e3b9c01b5dfef6c46c7ce95f022048a45f78a37bd3873dd52a57dbe57262e026abf06227d8d077e2049bb25c40880147304402201d703c2ab8fbfe0fd89c4ebf3ff6cf50cfc6d5cb5b28add68662fd8e11f3378a0220375009633bdaa18f8f126b0b1826fef96c6103f220815ce9fb1b3b1857e7a4770169522102083f15fa648503e6661eed119898eb750f1c3bcebd387ec63ccd8c6537bfd2d72103d553d94697ea62b175a2764354329b83d3ad121d29a4ce9c5dd9cf4b8619ef6421022e42adb542ccb43170d35f300113d6293d6af138e6b47701530f616ea2f6814853ae040047304402207616d85f3a10ddf3be146c7a7367b807b2ea21765ed9170643603eec1919b2930220269809e88d262ca1b1f4b9b86ed5f7c083d7c9dd822c078ac3fa0d3b76d0de0d014730440220622fa1456447da05953e2141e21a7cd49c0d02307185af5c99a8a5c9f4d24e7d02202c31eeffe778ff49e01b660ea313ae106efd730ffbf2edbb2e2a1edcdd4ed8a8016952210294f8aa383e65d9511e216f779ff7ce91dde0ffc65696ff148ee3757b54791024210241c6b5b7340c36a6f6f85355349e005a878fb8e23b9659852cdfaa755f89de7221022d7fa1e2650a37a0362aecdd5328bd0310263f129f23a275fc74f48e87d6d47c53ae0400483045022100a871dce49687a0ed63f43e2877a112df723b8a5b546e77f340b872601bfa8ba402203f11d8ec9941e9f41e082c4305b45b0d00ccbf2c8fafbc4b8fc37f145cd490fb0147304402204e82ebd32b7ccf1fe15359e1ce7355a3e5ad4138ccc58706878a88f3c169ef630220108f5b45fe6a9558f41abba0306723c51a4971d596ad1a3a5b828ee04e92297d01695221037988b5f27932fc625ab7dbc5c2e3929cdc7da416c055d477ea75427b048f17a42102e2ccf7599048a8097a146b0a894331bda7176ca71d7ded18252d9fdaf3ce9f9a210277ea5fb1a5a0e2fdd0f6155d9fca280edf88f32035d1e0f1119de21dce5efcc353ae0400483045022100ac8992d4ee3399a1792bab679249726cff0fccdcc58e159c8cd111f1c9d235d102203d650f70229fe68a437ac20d39464dbd07b25be8932e3564488496c9bd56eae501473044022060970ed9330a05fc7385489672da1c613c9ff5aca48f2a7c882ba4d454c944ee02203d4102858ba0a925d783a1c913e5493dd6f1100324d2a419a5bcb8a4d134be720169522103dfee28856f385fc7b935f4f6f0b39aad049bcdc8cf3ce3e5d30250b34b53a2092103b0b2c6c21b1c10d6176f024d07753f598664d57f8f23830f8bbffb61ab976d8b2103155060fd2bffa59f18a56ac95dcefcc9b5f9e85283c6f60b913d651167eb35f453ae040047304402204d288736fe532e6fb32ddfeaf1309717f3152e4600f9f75646eca7a2e4baa24902200c761ba90e92133567ff7ae8d96215f90b2a70c6f468659ace88b54fa5948b0b014730440220288c8b3511ff994c5f6dc6d88614ce7c456a6331d191e255ec95bda6a6013851022044f477edbfea48e035e5e1d2439aea99b087442859d61563c761667c9948159e01695221031f543204354864f2ca4ed852fe9df380d52faa4119eab4bb39aece72419d8f8321027409700084c73e154c846ebf9b4d544fa5a03f987bada23cd922cfb89ca50d922103fbfd5dea08c2bd8eb1d54e7c82717a73d09230973265a13bf4589fbb0d8df0b353ae49a00a00010000000001036cbd696c266a64634fd2ade800c751a321057a299ed87aa85d599f07881b801c02000000232200204a4d65d65337e568516b1bed74e44f59ce563a49448001f83028ffa19408ec09ffffffff50d4b2e3413924825250cd6ec2c449544fafe5b74ec1b5b3874df612fcaaab2c03000000232200204a68942e00130ce2e937038fa18753562ec13985fb846a7484f9c55b6066d7efffffffff47155a70c27e642cb0c5af2cba683cf60ca073fbc80da270b92bcdde1b74e7705f00000023220020d0cb4c910f84b53412f4fedbe5afa32fd403db9513ff7f1232f3346c75a260d5ffffffff0199d10a000000000017a914da756ca67e9b52969643fd783e8d4df97cfab45287040047304402205d761bae92162469546c8a268cdfc20291ba3f81de315ba0f4254eff2b7231160220022426158976a0c0b84e7dbae47161c127660c0662344998081e73938efed1f801473044022059b66d985f63b219107072ae858293e5668df97613514bdf13f27c8a838837d802205a6d791991f3c173b43f49345f945622ad369d8d2c29adbb67cbcf50015d8825016952210312091ebbe8b3ca70755f790f28611551ff3dea44f7faf639f2b1ff848c53b144210246af196007d1f636400ff8e5b60282c4186e8fa4b467a50f11a6b9d2abc9ad4d2103061037a38e72c6fc9f0fab9111373572ce242bd06a175cc49e30c5d46240a7a153ae04004730440220138600b05d0d18894afeefdcbdac21e776d8dd2ee73f4cb71eafc41f87a700cb022018c6af2639ad63e49f7b7abcb284ed1d9d2c7b00065cd931ab6132542b27f6a2014730440220385afcf5688e4e1584f927cc71ab43b30995e377d1bdefa613505d027ea4b2990220385168d6e186cc9f4c9b074612c4ca7969a0e9174bc695121dbed3b59a1f6f490169522103d2e38b2fec781dd1274ba3a3ebfae8ff467191d9bef229d0275b68d380ee71c621031be63a53c623d863592a5994b25ab67ac0787c91f4953501f6476589ba8fae2f2102072d315895bc6f6a60657ababd4f876b4aea508e7e1dc7e62da2db99416169a653ae0400483045022100b8771c44cfebc365c1d05410b182993a41260bf2bb804ca32d4c24e631565ab902204dbdcf1dbedb53a5cff94bb087d8e104aeec1eff6969c4f7a54794a5f4577fb2014730440220662f82f7fed081b63341a18f12c5e8dfacf72e2fca3e15c81129ae96ad274448022006d65fdc217c71fd9cbd33688bb3be304c7c3d44bd5b8c8f8ddce9af54b25b300169522103f7e5b5f2cebc4055b5a23976d11492fa24e162eeac9cf5ee4059964b2efa73b121025cf5b692d458b9377529bac8a38208395dbbcac1b12c192316c01df1722176b62102f4666cd112e4992c1165df8d0d1480e69f0f4efdaa5a731d2ddf55d3b1146a9553ae47a00a0001000000000102a186767a6c6685227496db0019fe024da64a759108edbf77a1f17611d6a9347701000000232200206a133d2621783fd0727a38fa5160c36f8927f14e13085411fdb42aaa5b0cc5d5ffffffffd0f7eb8b2314e70ae38b1ac18760eb555103fcc9fd9dda35d674e12c48db90b601000000232200203ef16605573c6f9aae60a7427380261dbdab39a63d41715cabee07b590ddb1a7ffffffff02804f12000000000017a91487f3b1c5efb746e872f5633374fecd9fee6e836787c7cf13000000000017a914103a2daa10a67a5ebb875ce2efb65b362e70c8e18704004830450221008bb20e694931e4f489ab55fe331e68fbbd1b662deaca2dafe106f60b9386eaa402200f92f5fb9ef9fd4dcafde893f0c1928e9cfa156b013c71c7e2126a06040e5a3101473044022037437f7427248ba062ed1ef1b4855c8eee4a2801b453e06b0a322893a1eb185a02203ea806ad1457623602f37399db7d3a0ac8b9c5eed3d1b27e9476f4d79a93ba3301695221026381e526e8de2d02d27ede9bb15cdbb88bd4fc76f3b32ed04cbdb847fe9b3d5121021ef18a740ce78d12ab055e67067dd33f50a8b8a00f7703bf339b6490a83b2790210349587dacb319dc181395887eeb490cd2242f9b0274fe80bc49e306ea053de10153ae0400473044022049c0b7db9791412b0bc4a60b2a00c9092cfe8b167e35cbbd232f96b79991e3d10220335be6990aea873ef9ab63de82202c844c40f4d244bd0528e34e4b4b9daa2f900147304402207444c39f78092e1687b9de70b9eec4f20cad4f094c12549470f9ccbf74743fd7022054512c1539f62f00fa45c7bc05018a1dfaccd5b7ae28fac250c2105778f4350701695221038927fda8112795cf0eb16e94822c01b819db9bae1cf5bfa42751e380477b35e521022540e61ccee24e8c330b031e87c669da2367098ac6640301d50f7440636e6f3e21025add7a9fae344f05875eee90dd63599f4d3845f07b7ace50bfd63cdb4bb689d653ae48a00a00010000000001015de18a76baaa89c1391f3f3fc5d2d8a0e8f3dcf0320aef984f1d955c0a7fd9fa010000002322002075884ca6e26011cb48064ad2e72656a291b8e1cb398fb110057c6b9d765d0c2dffffffff0280f5be3900000000160014fe9c1b14110f6f4a947960cfe118cca3c9307ade753be6790000000017a914b47ec3d5bac5c7febb5b8ebf31831a5fc276ddb2870400483045022100bf3ec0cdc6dcfa6aab52a374c2652b9bfaa356bde73e459a8095ac1ada58944f0220080304f012d343daf2c4761ab0d63cf5555d3411d65b36f62bd637668ddc6698014730440220022076b76f4c0a60a829574bd68827a54bfe572c874df14456040ce036dfd1fe0220577e37de5a37d7e787fe19e58a849b35f9278ec18ecddb8d082f76b4861530d00169522102b6d2c7cdf048abb3e7f32a615fcca3891aab4d3a7dfd12b91eee20a68ed4adbc2102f5e670ab81cb87bedab70d06142af498b185f68ddf863f6a41b031c87ebcfed121034d15873a40248ff78b7d458db919d13e31bc0b922c2bf1e755402d08b141ba0453ae47a00a000100000000012c820e2eb1efd253f123c992e29202527c4d5cff66ce5b08fe7f40a8efe038b80acc02000023220020157a6c888cd28aa1fd2ff8dbcc165ad12cb294a3c455f6c5b7612ecf9c43d09efffffffff098dd06cde78690dee54869b4e95f86b43aade9e2cd92736482ecb6b87b3f0e18000000232200200466f0faf3fc37eb3dece6b3b130bcceeb4b7ecf938120bc6c94beccee6a5a33ffffffff36347c7292064c63f9b35d49f1b5351cda8b125e31260e3187b14988ceca9c120b0000002322002044ae191aba89f7d96bf609b2e19e95ffb24fb5bc5e3b742fb401b72f06580881ffffffffc8481d59f3bcc9fee800a97d73b1f8705ee5effe1bcbbddd552cf22639307a171500000023220020a110e7804760bb48f97dad7db88348ff9c10d922d8468d6ccc9063e2e376248dffffffff83e08d18cccb2b77f38fc9b11a1961a4761940b89f400cc451719ab0165946191100000023220020e30a78021b9565a2310755b32b84ebf390cb23f7660a337d4ada5c5c3e580b81ffffffff8d09987e4b753e3878b57f6a50682cb61cbcd6cd87f694471e1f41576be0e019bf02000023220020b3083a5426af8d18b9657093643147b01b17f38f122a8a277c360dbd4f025e16ffffffffe55da240e3cfce90cd1dbf833e7231d8b2618997d0a09421074875eb02d25920140000002322002074348007aafa9c474ca9fdd4e7b94efa5febee90b6e9304f616d5627ab97b0a7ffffffff44d705d1df4d63ba49d4e41ce384814b26b619add30c0784bb3ef5a063aee0200f00000023220020be93da216f0368f863d863d01361f43bb1303063994778d5ce71e7e4ec208929ffffffff2b0f7af01117efd84c7a5f06f019ca13015ae7975ecff45e4e3f2b7a385d2923f802000023220020d75ff6ca413a5ffe855385abdbc423172eaea39e97cadbe91c4101b4b46ec134fffffffffa937827620f6ca2e6de3b9d998e8ab62b1ef0bf89ebaa55b02310c878ae03260600000023220020b4c9a09ab404d1424fe6947b7ca2fdfad1b75294ec95423eb4e395e30dac6aa9ffffffff843b68dd3f572d4cdf696c975051e22910b1884196d2ee05437d2706fbbd3c32120000002322002030815acb88ed693e6b3a294bca372ff3e385c0518a5e2973185b18d2ec78da88ffffffffff9ec988c7f08f3a361fd754090b5240b5725982df8e6b25afec4b007c083f40000000002322002043966d3fba024e8fe605d1afb6f3731f96420fca005f9d193e66a992d523e89effffffff75633525264bda6f65bfcd19565d0ed4919a77120ba1afd8bb86ea91e4c3e6497f00000023220020d6b89ff3c3ca280bccc3dd22595ec633dacdde848e3b5983d74c56f7bfce98f5ffffffff627996c95157a9982dbec8077d83baa7dd836943bc8a3b09e1258ba2b03f345919000000232200204165a042ea4ea9041cbab08e092d3dd0077b0c9bc214e942123ef1493b8bf224ffffffff80845e38060bcc5296f300e5e79d1f3c1eafbc04513cbf3ceafcd24a842d28630c00000023220020be93da216f0368f863d863d01361f43bb1303063994778d5ce71e7e4ec208929ffffffff18b483907cc08a1f5ebd69a0ffeb1b81e64745d7f662fb8aa20b9407865787630100000023220020f856543c85d0867e8a592b7f567438fc1e95b38d5d28f13925299ccc12e1aaf7ffffffff5b2553d57c94b5725c481d6f451120b1069f637c108095032ed83a9d743a0c6801000000232200202e94989dbaad89b6602946e06558f34d6c05a2f26d6c5aa688c30107eecdee73ffffffffc7f6a231120143706717dffc58ce01a685335144ad15d4485a7e7225fc9e1969280000002322002074306cea988d93569bb04a5c5fc511be808cb57f381e496f7e621587506f1ff0ffffffff02dd54ca71380419e621a8c9e069f5cf002bf376f9d54e1693e27a660083ac730100000023220020fba49e4c2f9ab55cdebb81f9d650a435ea3980cd2de3e714c4f347bb0665650dffffffffafde2cc8905e1c17800ecb129383227f69effd762d0e8b60248fb02ddd0e83774705000023220020ff6ab2f515da4874e1f1f50fe4893bf7900c03e068975b93c31df6a35b2051e9ffffffffb931c8e7ee065bf8f1bb4b9ee1fa0e4b42a33a2de2ff46aae457f9b87b6d91781200000023220020fa9133390e83689998667349a23a712e2a974ad6728b83906f53537f190229e8ffffffffa74220743ecffeff0a5dd785739008c2265382b17aa644ca56ef968d399da478d207000023220020cca67f5325e86fa75059fcc3e956e9378051f99c8c4984c8141140863972b835ffffffff5d2ee9072c20fa009c366f0ff95134ea9958455498f7eae317a10c8314132a7c010000002322002080524557a947e8471c5fd72a3363f150577793cd0481db8700f40cd664ded4d6ffffffff43b8f4bf0a998800198cc8b4ec958158eabff0ad179193b7709e45c0da4083820500000023220020c5681e2cb83d7d66d39e4097763de418e880685f9957a4ad45f9c88edc36df8affffffff89ea01c37ed9ea444e67353dd2c077d9cd0bd3b33ed82a753701ca445bf000830300000023220020d1a435ba723b2137df69964caddb180079b9dba5e06cbcd4007705311d6ca990ffffffffdd306d27815face0dffa0606931970b5fa9232207c7c97efac57cb3d662d798a0b000000232200200b72da9e0f9c7f8f99dd47d786e887fa67c4976c940943e1dd31f9fde8e89724ffffffff65dfe07e486ed2121a0bf5d0598be453960f022008141aefd186d2aa92b7308e09000000232200202544620848656515525d2db2b86e5097e8f7d8613064599cfb7c0f5cfc3b4400ffffffff2bcba93c5efbaa3a366e4fb48ad68ddab40e540eeba3725178f60394fe2ef9a300000000232200202b18ade78ea15859cc2aea184624511539ca745e36a96890710f0ab309bafcd2ffffffffa2a9e1ea78a50ebda619ea6d477b493f7284f613687ceabadbfadd1143ff26b2aa000000232200203eb028916d860d794c29dbaac43e20e628998bd6d266b1ec1f34315cbfcde77fffffffff8ac936b72e36377d7e120f411de172ed1f1028f9385dc486628ca7dc5fc9b5b2ac000000232200203c949a89ead1eecda1578a13f3ce611ec1008da1ad9e90bc52df1d17e8d4c3f7ffffffffd7ff8fc452ea785dd534017128a2fdb87b69085c360bfcee38894df1efc7d8b7100000002322002007984a9b65bc38b99c7d12912ae5f3c3032484915a6faa036bdd36a4c4e634f0ffffffffc019b7d40e4b0e8a0faacabad4c7d07a580308fddbfecd1275901ac04cb168be2609000023220020fd758fda07c1b239fa797868fc88fe2f58d2595b426d91e7cc523daf6b73b70effffffff01b460bc4b3479ace1039d27601fac9e64064eaf690dcef9433c5daf001018c43f00000023220020416c5b47bf6243be8bfb6711af6ffa8c51478f376d3388d250374312cd3358f0ffffffffeac9ba43eff354f31940953dc5d1b478dfef86a5a6540f8fb79b8c13184b3ed30000000023220020fab52a2f4acf2e0ef734a218d9bd4e1ef2aac44c37fad6e4b2c22e9e00131a95ffffffffc1d2d27c37a863803a43caee948f7d5d2820f218096319630d99d74c7af9e3d70403000023220020f131fd6fedbbfdcf780dc1e9efdb681f8627e03e74df8fc632a1a10a7b36a795ffffffff3194c7bf1390a126a3522e6c0bed492ae1fe00e33b91123f09316c40854b1ada1f0000002322002037cbc15396a7de4c1e3afb4c58d9a4cd2d3c2848ea7d0eaac25503a156d12c8fffffffff3e8e5fbb3cbfb418c40a54e4c34ade6844eea64a42c61ae9368c817961092fde7908000023220020824e22fddc05cb373bc809a08b3a8edb218fa9f6e0c78c2c6ebed59a2ffe5225ffffffffa1acb59bc5502af945b79126165f43eda83d960c27a03ba86b7663780b1fd2e627000000232200209eff597cd49603f43a1409b9d0770b41fb7c3915eece65a58e614a2216237615ffffffff06cae7d75f3ea0761b9f4dc52380123df2f5d60894189de615ca3d504d929ee85d0800002322002035264bead63ed524af49eed8d961bd41e33cccd388a4ba0124b6c7e9ac06809effffffffa13daa753362a62dd63d9110f7e9719d00b15410ba47481d9fcbe627d57321eb3800000023220020fc0846da6104f5587783a858a57d0c94b053022e7d81c52ef48ea9ba7d1c365effffffff8ce114f6fd58a7111f28eaa22723df86d9b7e70831bc4c676a6c593355d46af6b0000000232200207c05745873e72daa3da13730ebea98c5100bb0edcc43c68143028f9c7a0cf5d6ffffffff1b9d160323b8674f868909a937fa062f63b8dc5f7ded512872713a1c5a159ef88f0b000023220020240d9fa352834411d329a80a2d4c92f1466c43bb9023a631b389f360a5087adfffffffffd8a463e9be74f5399bb4e5df872150f83078c48801b29841787b4286cc7259fa160000002322002014e9fa16470a0a63512ba1f613039dab2e74056dbdabc74d6bd86d1c797615f1ffffffff0d7e98fbb39e7d4b7df2814a154c187423b8a4624f592a6f32b4025cfebeb0fe1f00000023220020413438136d8728d623f40f2057fb848a7be0b9b8a1dbad4f982622e970545eeeffffffff0229cde8030000000017a914cf1e9559462a6229903a8c1ac576635990d8f580875e731f09000000001600142b2983420d88dfcd1d7f93e1bb9eab06a124bf2c0400483045022100ba8a460c734cb0d5c67f4a24c35b87223fcc82351b1019193a0bd7e264a3db9d0220060843d8c2a80f1d8a8cdded2d80912993cbb83e57fe924b74d02fd4992fd9d20147304402204574d7d3bb900c3d4c9db36b3d8659fbc3fc1d79e1b5579ad387c5634c1ddb50022013867e3ef4b249440bb1fbc76271dfcd2d2e2007e2dfa85a10ba1c1d642412dc0169522102a5587a18e65792d4fca8f692523f7899c3a5b623814320e0c9d6809f30906b022102d0131087eb3c8e148b227bef3f2af23c89b4a71102474bb58688353dcc9f1cc0210363d915ed0746f19024e1b318db76842fb81b8abad83ee25edec25c9421787bce53ae040047304402207bfa3ca07cf6d0ef270110d322485cd84a277fbac07d474c151c846886a84f6e022036da77d370c0df8fddee40233194b953d1c2c44f16ebf76d7d571b9f84239b16014730440220310dc0e62e1508977a2b7b1c90bd2641fc41d8e1a4fd17f40d25cac8f278d62f022072e03f0a07758395af3e91d268d9e170093339a71be2c8f3dbcdebc275f51b6a01695221035baada09b485865fe3cb5995fe787cb4dc3b5bdf8fd24a065d2970f06faa87742102e5a8d893d5da09ddd78f76b705e10a6c33509534de29554aeb802a9adac074ee2103ed5be69c2e1c656ce95462f973e86975633506a9834c210992c02050fc48177553ae040047304402207f3af246e8607251fb6a24d20913c085b23e83e803d4b15da821dd6776d2cc57022074c6207dfee7b2823812d58d80b3fb6849cbe267ec10fae3cde5e6692fffabb30147304402206afa73f017ea3a78df96c9afdc6f45ca764965ec4c7904ea9b5e2e1d217dc6830220573b3b9a4ca49df145c68634d697b2d95a0301416d56332f453aaf79047cc252016952210289c711e6759a8a52ef35356ca1f048c4195ad18096816d2fb84cc05242c2b57621039ab50a3e7da3d2589ff2b9d5f2392582cbf93532acd9a22b23fdae10e2a5b08a21038e4d73aeba5d56e180eceda447ca7afb211b72e957a7b2d108f83248c670efb553ae040047304402203bc5f745ecb7ecc554039a3d5a28ed002e7d7a76ef2d884d7856f4a2c04c5ef202202ba0fe7698ae19bc800aee1f046d0a8c8e04822937b106a60c7018407499ec840147304402200b35fab02369b453197dcee63cfc9350eecdac9f99ecc13122c4e6ed15deefe102206a947b1db4ccc943c0fc5a3295d5852b8b9176bc058a1221d865e379de6b3d8d0169522103fc0d09058699416cb3555daad423e67f59f4ad3c2bdcb90ad0786c78239724f52103444241d7d6b8a1ae2c1b056b0526ec35a83f1da150d79c791d35a1e31f07a5312102055a1db0f51b9f9727c71cbe764adf2646d4156c9c1e6bcb7cda8e59272d0a6c53ae04004730440220017f5e3d7dc3729df2ca9cfd725b8b3cfcc3ff31a3c43a4a6ff05d18218268fd0220598bec00982a796bf327ff7ecc694f14b48701b968e5efd8e4136aedecdd0c0d014730440220168ded1363283727ad14c3c9affb6bbdf4386c1fd1904c2d21b5e8e6dfcac73d0220372f9123def8b1176d57b5e09a35fc8526afd8596972fe87d34464f6cc4a0f7a0169522102109ba5d5095f02501579d296ad67436c02a43e9f074cf9bba34283a8eca046c321037033edba8106e33cde5bbf0a782cbe7ab4d06b3e7dc03bea99d17fff6b466d092102918e2752d819090787b6dbf6bce89e75184862ff676c57dfbd5d6024047a7f8153ae04004730440220238273eb28ca375663bb8bee2046ee36e471279933de477f174ca955a767264102207f39d6f136abd383f74b2cbad0d47924cf91be689024fc001afdffae995e580e0147304402201f665aafe6943f3cd11b5e11c8d3ecbda1ded0467bf705bce72391accb75691802205b03da40a1a6f9c8307ba80b9a0a903b12956d5e0274c96b66178cded0249d500169522103efe693d799447e66002911c3004f6c71f7cc8161c68979916682e6cb969067952103bad2dac1c952dbe1396a1554d07358713e217f29be8df92794ecb0fabc47e733210270428c85cc5b7937e49ada42a2606756896b197a47980387a892f52e143e8f8953ae0400483045022100e954b4e9eef9df9052ee289fb42db772cefd6ec925a4af4b477470763526a5a90220366fcc383129fd6a01373aaed2318dbfe7871a44796a30c36d8a558d82c47067014730440220599b125ccb88ec38037a6122c558c42a4c9ab749cd438c475f3140251420196102202aba51f477fd0a62ccfe9e0c351e72b8d904746300dee4620690bb67c55475cd0169522103055d59be9d96d5699836f5cf82b83319f1888b1c26af2271dc06226afa89812121037923db249b09ae6ca3aa8f26551838a7564e8bb1794ee8a6fb8557219461b7e8210260a7c707aaf4aea78bd904b3798d9fa71eb1f953b979bfbf4cc5f875eab9360053ae0400473044022040d100e893c2d5e83b8a9c9e9d0745b082a21fef90465608b93d4a16ec34928602201ee1e62cc3a49cdbb07fbc9edb458ac558adb986765e54b06a081244ef17b2890147304402204588986f9b2129d19669d15429bc02ceb318cc2f3ac01295e35dc914f7fb6b38022021d88d6926f6a5a24a4cacf00d1fd66d9f92c8102243928ece06e6551312722f0169522103d9b28ccc34271609b23273f500fa70ea7bf14459ab6b384f5373bedfb20a2a4d2102dc77fe2b11e51c41b97e8ac60bbccfef097bfa1e07136134b634b6a9a10999e72103b07cc8f3def67a5bcbf9c40fd8e788f7670373024bd33141d1208a31833d115a53ae0400483045022100fffee5749c359316cbc7e3ad7fd7eafc18e1ab6c6a695d502f025db983ca5d0e0220278ac8f6852f2076eeae2904b625e83a19acea593be651e252086c57195b69900147304402203fcd00e01f3cece622d0563cb90531e9473489c4a67434a0db686b1610493bc8022034cd1e02b30be7081bb2bd7d1d41caaa7db7f3ca0a0e37d7926f1194d11eb6c40169522103d0dea7afedd67a016e4413aa3dd9cd837753d83fd44e87448cc2b044595446b2210380ac04480c3c8f920c0e859f44728fd5d9e847d23cf0ef00c0f49ccc754025a22102a5a9f8737e44c1a6b0e0cf2e6bee14304b2261e5ff1fb8dd1c177f50e777af6053ae0400483045022100bc8890ef05d63f488d2fb3bf268752d15afbc767f371605e30ff77f1878622f0022070aff8de9197861eaf719850266df26c56ffb9b12e0c50e4fbdcdcfb803fda1c014730440220233e3add4d7370167e87f9e9dcced5bec0884aa4e806ff4acf3ebbfd08a6fecc02207ac358ab07a3383cca283fc18661703eeca445e3bd9db6842b79452767023726016952210263eca629d06784f002aca6cc2d07841a20209b8f693338172c4e1d19d0d9147f2102ab37e5bca123b58d3862ca87bd34fefb4add649aba6430e33799657743054ad22103a9e33271b9940f9edcda5128272363cc782d93bb77d866a4c4d45af9443b21a853ae0400483045022100f72df3ee399cee990cb9ec2bdb11471ac86e3b15a64b89c994dc612727e48f950220455f014106c1bda182ea62cc16a57615c11fe02275ffe5c81f20c16bc544ede701473044022026463e158b080cf46596061d7c0240850b669f7765aa4319c8e265f6253e0ae202202a5f64f1a6688957e736eda7da47fd946ae66f2930624ea501390588f6954a44016952210318d872910a19178793c812847ad556269e65a22e7048746f990e5a67a78ab2072103bc1944b582e982906b7d1d0d850de3d9d6221165c823acb56826e85eec1e60dd21032f05c726eaf87172f3c5ec4322ac0d4ba378f9a5c0c4db85bbb3ae93bfe9823253ae040048304502210080009f95eec51ef03498bc2c9469b8e674a59156346fce422d8a4c1531b29cd80220078bc2fa93a6610a29b4b43c5579845acd707d8866d9f8f25d94f0186302b965014730440220254ce0948ace0b3be96c3f93fbd52fe1733c63946588bc7ea21d228977b0621b0220374138417df3df490919327018e06f300b3e2fb414af3ba14d3e37d19d406ece0169522102af11aaab7fdb7d5115cb31f79d68f7c14507598634e6d9c517e4b8936f87ac60210251abffdde3935264032b64873a4759bc12fbb721d3cc0a4fdb7af72045e7aae3210298263d4806f5e956d050db71146a4f27c1333ec707e434790d36df1a83477dac53ae040048304502210093885299bfcb89bb9c2bbb38fe18c1b64be763b061e473072170364f0564fb850220124aa905728425635006c8cc9913303905550e110ec2c8f4181987a7796e37a40147304402207f70dabfba4089aee2ee0a8463ea9c3e36880fa5773cc7fbff7b3f978fcac6fb02206e9010d3f9193ecc50cf252874eb9c503c1e9d6a8812d8fb8b8e0b7c5e9bb24d0169522102e30252db940f8c7edc0f5ec1ba5517ff77cd16e83026f18fde808d0f0755c4da21031df78a58e74ce27c97222cc2f03d75d3f7b474db1ab9499ede337156061fe26f210217759543a9b57b189a855718dd3021f06949dfb9fa2e94881b100b64a221dba053ae0400483045022100fe46964313ddc85dc02861d20259d27e13d56c7325b899bd0981ec4c3e6d114c022026e106d415b07152bf05d5aadd1e0cfa2544494005202c6800c51f8b0b310cce014730440220141ac1ddf58200569fdfc67c5af70b9df3e721a5d781586933a465a12542737502207883a33b870f8725280975a97b0fe26954fcf9c39133106b3bee3b29839bba95016952210254e5cc7f407b4933f9e60d81d21c62adbf2b5236dad74f3419457a6a1205dba121026f9216eacdecd5c385f113c95cd6b3f865e1bb422a0358411c68a945cd561dc82102d47dfd4bff0c2172815b6f0db2cadc904a3ed0a8eaa9d57bb1fa461788d965e153ae040047304402205d30bf0c1228044f5871a984e0f4f96f63d2f9d30b5087e6b421c69f2364489e02203baa38bf1b6467226bd67ba66054283f53387f954f102a46e9811bed8df8322a0147304402203fedf67594b1e6b3aaef1b063e0b898b996d8d2b446190b828214459021b7a2d022042c463b0a1f47a2c57588d93121f46988555daccbe32e56b06ae0f4d11aaf8b90169522103d9b28ccc34271609b23273f500fa70ea7bf14459ab6b384f5373bedfb20a2a4d2102dc77fe2b11e51c41b97e8ac60bbccfef097bfa1e07136134b634b6a9a10999e72103b07cc8f3def67a5bcbf9c40fd8e788f7670373024bd33141d1208a31833d115a53ae0400483045022100add444ba28444181049965054a55fb75ad8953aac3941c052b7464b863fb762902202bffd90265466950b2e31f895ddfc3ed19019407b5559af5d151488ec7877877014730440220554bf544be3bd9ac95ba52965f67fca1f78cd3cd98fb520fdb438542eb13b2a70220184688c35f75b21beec23f063d050c5e4d437acae933414897c4778c85fd4c4801695221026abc8cfc08e521dec2800850db03995cdd097e67ed5b59b2409c2403b4d233b321038f64d5f9b40c7261d7900900c2d2c80b1c18a9f992cd9852043bee530d0077102103f64517658e572dc6d96314f57a7644fc0d7fd901d755e4bba52468cc9a78505153ae040048304502210087547172629a16568d7e9008553ead623f384cfed9a1de3b313caf497b29f5b702205240f82851f1786300ca972c44a47c2c1320a2515a606b68651dc01a64fe4f7301473044022017ce35a5539c7532a3a4b52e41acdf8ad1d60bb742387423f50697fd9c6cbf4d022017ab8e6a15f37d07844ee397fb61618e0fd88c19079c1a1141f4020d9e5c79e701695221036ddbdc1fb2e7e7c69c0b963a3e516f0b338093ca693cdde7ee37090addf03d5c21032ddeecc80afeb9abf7b591a9f22cb7f74cff4c78c15f7d02efe3ea84c06789ee21032ff3be51f6124daecd8aab7bfc2aab3613eb16c5f06f749513a4502a952eb7d253ae0400473044022050011c4d6f10f6fa9caf844c3d0963a7101a8b8cd1769af9a35dbe3b80c2a8bc022012894b82655b08768903209c75697134483d4a1f2c369a9129039809c531c4940147304402203a8713173fe8867ab692d35edd3607ef0cd21f5fff60bee910c5f1ccc1c545c502206071381eff52246f749ff0450c20c4a40180c9a365d8960de2baeca10e4eab4a01695221024a61e898f4b820a63fb290a59239a1ad3597edc2b4366e4bfc785c5025eb73d92102ba87e91e79b21eca2118b5613b112df509c697e9cceadd06e94a76c62b13bca72102ba8b24127a8163de26abb8dcc0855fa391c7bb1ffb030deb39e0259f2d5abfd153ae0400483045022100dbeec09cea323b6131414e0a22af56958d0d7428e518887d4550582fd95c4ad80220380a02e51e9f98b9f04c1ff262a34d5002c6e27b8a4392ad2ef9c98394907f4d01473044022003280b002f127c767d2cc9bfea85494e563217c3ef2595bd4ea94a3e1348f4a3022050589796cdb58c113f6586e2633533c242723b6695a8afc0d67c7e78062d7d27016952210247c25526bd86531df907eb4cd359ac4e50ca70b0ad6ceea21886c8f55bc08adf2102d31bf39be2aed8157de9ed3f56d64f19b59d345da7f52d93c99414f96f3654bc2103fd5f7e18df08c5a6ca4504f8c16c2a6af7d96cf0dc70040d6822e25785327b8653ae0400473044022056f9ee43264ed0ad62f7d634381230abb389d8ff92c0706e54d34bd8677b19ab0220788675e488794af672ccb07d5eadf1893bc90c5f582925acfff450b965bdf2d2014730440220382e6ce7cd39a94783d256f5268793f382dd18cbe7de629d1c147eb3f958d92502204b378105ad6f48f90170776b166223c5c716ccd8b74ec485651bb036a2ed9dde01695221031867e718daf26e10dc8292a874f39d78da444e802ae72061229972e3daab465c21037ddab734e7827a14fa976571129810cda0e3ddde1fbe806c4e19715f6885aed72103808a7c1c54dc794a3ecceff1d0eac68a6977356e3806ca5f47fa933f22d0099a53ae0400473044022012db4ce01b7322eb9aa594ba8b48ecaadccdf199a201dab1c2bf3b03b8592f81022074e39158d3b6da431dbacc00acc5d75db93cd20e0694243c1a0a9212d34a882a014730440220760dd1a1158897a2ecadd6f94cfbdea8c3b586c61633b6fe66d3ad698c8bf650022049dba39fb697e431042f4967831f4cf9e6a358b441b962e6dd6db1a5f35a067301695221030e7a05bd240f0bde38410464af0513964227bd4be4570941e2efdbaf5862b0412103a920dc33df9a23b21d8a984ffa90b164bac497da9057fe6633479bbe55e129372103572feacd15d5acab8404aa2e0d03bb887d13712111f959b254b285426c3d98e453ae040047304402206f959656d8ebb55300a9bc08f03d07bcdb54e630c4df33edd6a06a6ee376a1e402201d79450c11d4ceac9151ead9983b69c38be45cdf8d905ec722aa375a05bbabea0147304402202f23ae89609809aef57bcf3799a5a3992e666e2a30d02dc6f98714dcd0af755502203dcac5782c25b6bc0b78dcccdae14d5b888429d7899b961f0686fbda4c5a27150169522102122ee866fa2cac61e084c1ae8a5f3987cdfdfa53a9aa639ef378dbaf53a2b8962103750a438e25d61f0a5a8029b776d39392ea876ee17614bdd5156016088b041fec21026a707bba97f455ae981cb6d19f2f3fc3561ada330765a42970519a8c85728ddf53ae040047304402203ffa60ee1edb82141f51f1169b0889b2d0bef7d1987d97a9c7245b20f7851ae90220278f925ade3bcc1e00235518141ce626b18d01894a8a63cdab5509673d012b4501473044022077c51b25a512a399cddae6ee32bf6d70dace8f23d8265ff578514f2aa40d305f02207a3a863f5b350e6b7873dae99211ed88ab6875b65f3a6d59cfc5d3f0bdeb0a7801695221020c32fa75af038ebcc890a2a09bb1c0cc89d4efe45c354f06e820bd2d6df300d12102d05315d200d3c193b2145407d4957e9a4a904b0ce2b076a0a181f3f472b96e3321023199791cf0252f1728e1646a875370edf0a584d0d1511ef0b4307b101a38b31453ae040047304402204258b9471660dd85e8f84956f2f59916a6b880e6df7157c9c89e40d64b1a2df002206b02941e1fa566870e4d8350bea38a86ee17f6d6c5152a6f813ba8996762363101473044022074744eb21cfae25cc226bb497ffb39abc24994164bcff26dee222518f3a5ac0b02207dabf0d36d502a9eac3088ba20cdb6d5e86af0bbf08af81a46927bcc16b8ba8601695221025e67ac2371a32b504c716b1445c1f12b553a3230a2a964e224833a2b902413f121026f285e09589b13021a9de1715fa29d7c9964177354137d55f288f016586ab195210229412989bbff2eb48c4645afa212294c8fb438c50865a32edbeaa21f7e3d687d53ae0400483045022100d485e7495667b7d68faf35731e2ef126bf0059ef2588e8a23e4a4d8e7d30e1a302207064286058549646da5ce99066288880fcbe32d97404a695c92628bd71432fc101473044022066424f9ada3b5258d9853a2b4d2b457c06b27f6cdcea77eaf9837ed55ec2feef02202713e881f9df1ccdccca800e77d7f3abb537b39df02bc277026b7abb00dd6f7d016952210313458abcfd510c79dedfd7504aca825e5706559b2a17cf8b61dadd2622c814cc21020027038a747b59b524bf310ab8de260802a938c932b4a2bf386889b2304682bb2103a3b52f37fda16ec2df32236034698c2248af6069461c9bee15b4ee39ce64651e53ae0400483045022100afa92a4053efff79f22fff317034f0237ec2b69aff712a538225c3206073ad910220745eca771799ad50e473698600df9e21a8ec560c06ce00e3d9f390c6982abfc40147304402200f6d58e653b3fc65d93bfbfa9acccac54bd771b0b646fc8fc8372191719ad09a022059e028ce04ed26ab8888b53494ba7d96d27eddfa0e115587947f3e045f70ca2f0169522103facd42112f4a3dee35aefbacfceda814cec6cae3589ee67520b0a4b3e1439fef21034bc7eda59b359a3cd54ef580d698659af6b6d3ba99f1333150bb007644e6241f2102b2db0b966efb20f471f3d72fa8762ed9342b5affcfcf7d57b62d523ff86a1a6453ae04004730440220560c7b5ed5bd0fb50478878183b8f74d324793ba8df1e2b9ce70e6275f990bab022062a92f5c1ac3790195bd5320bcdf1ced281e4c04d9bf9d5d2452eedb179e3f940147304402206a1f937095688aae0c8571a9ecff119d8f52571868438628725791ee9ea5332402204a1527c634505c7247e14cba1586facae964ebe80c1a9fd748cf22aee50c03a801695221039d2e81445d811c98ec2773409166cf887f2307ba6c85d14be7c75b83453588622103571f9bb794929ba51bfc0034522952ba0ee1a1d990b498dd3c7f8a2d5869e9a121033c1a735f04ddbaad21b283ad9802a85e63bf314d424df7f1b80789d66a67c73d53ae0400483045022100e26adc429080340a89bb1f804c28ab8f44b853b5b26eedca7d5e7c070676d630022014a446a9520a6c5831c2b7b4f3593b80259c01d06da9341948ddcc9aee76caee014730440220178059247b6c4a7eeb9624386c6ff491c4e8cc14e1ad455dc8cca8bc3f5e33ff02202f973faf022f24ed81278ec10a2e612b2478c6469bdd946ee890326b76df4b5201695221021ee43bbb9ceb803a68a9a22e5926ec9037365c58ecea5bed91da064bc5ecb9102103b88087cbc615e0a717830963f258b5b0eb8ed84e7fe74d4e1efcfbb038586e0e210314893182073530f78160a868825b2fe7436a2766427c2d2a732b9a243a63b60253ae040047304402201ab03db7f406fd8d65af852174c03b2d0c536b4e409eb6efa6b6c8a6a8d59d1402200f5000ac54ddd044210c3992a81b7a57f97ff19b31adca2ff3898dd9ef31864201473044022062b15b8ced2948156fbf69fafb8db8bfee0ce0a9db7cd21df270816acd9533f5022032da67ba233986dae85bdb9fc34f91fc4ffaf92f2210c9d71186b7aac27267aa01695221037c8e0e2d531f3913700dbbbccb5c2f89731a776079e733559f0d8aa8b34e1e4d2102e63b7491aba082413648c0ab8a30ef27b63b72a564c08df840daed7fb336748b21033079da7f26322cb88a3dc22737fd4710e71f8fa4c459cc5681176dc92517910d53ae0400483045022100eb2cb309ae5bedb7ee295b444ac4a938d2119e4e525995fe7054687fbd75571302204cda9e8551a87ad413c109bc6d1df79ca0398a17c1a8f6de342d44876d3c2123014730440220520a00e23243aed9d41a35badb39f4366b355f27da67613b0c01467619fd8234022072ef323e013d5163fa1fd39626d5900606a944206087ec0e32201a962eeb36de0169522103ff3d6a212b98792e2728c01eedf2881c2083f95fd3cc8d71725ac5211b4b83bd2103d412791e0d2306ab06f1af5c67c20219c5b02720163e89e66eb33dec433982bb210336e3b2fed92fae5720e19f15c673afabe2588a4c1a3233eac2066f0e0286c17853ae04004730440220393f24ebff9506d2071d95f3c064525f1514babc579d3c50ead2a0301cb42c4c022040a356c8a28aa9c5e5834bd698dfbbaf0945494a384f070e387175cfa4939a1501473044022029fb2de3c4dabb6852e9e031cf457dca4353aa8ce5a499dbb840cc13b36f7e44022005dce76c0495d66f2309be144d5847d97bc3d5c8ad53c109fb17e87e079f771901695221032770a180c8b46ef6332a470fe780e432f1989f70d170cfa38fb287a77ca51ef321021c9cf5a94dbfa16bc652f9c95f16aeb624410769778126e481cc1b813f320e3321032af1dee75f4d6221f2873527cc12a64c15f59577b28f9204cb6f722adc13e9ae53ae0400483045022100ed38def6032457b5c2f980a683429c8c12862e1def093e455469a86f375b8a4602201faf491002d6a1ef313c670f3fae142c534ab31e3d861c5c353df87b33c0f28d014730440220398fd88668e07786ebb73d26e59839c262e2620cf67841797d7cad6016faa11b02203f2bee85c782af7beac16d8b7a684668cf10d9e1234ac8b5701f832367d5b10401695221030898b73480082c5544e3b23f62b3e90b68bca12330a831822d31a55dd2ccd8d821031919c730a563214f3cc6f47ac56b70f9fcd4739abb11b42d30fe23735f0b6a692103238622d5de0112d0d7eb667dfa92f9630c4ffdb828edb16abe65ccb7c979ab7f53ae0400483045022100fe94485485326662489d5653e53df55f3acbb0169e54598014b17e2afd5c10b802206f42dea404d2f9781ace22708f5e30cde66a65d7d71140a985cf2150ade0e16d0147304402203be17ed61e4187d28ba7ba61d4851a70c009ccc456d75097f8d450f1f0c6885702207be5889fdcf48afe115dd2a748d786d0ee5af5787c8fffff7a7518e0b93ec4e60169522103f5548118f2c98fd79fb5a706b80b5e05a4f45df60a8ad7b2485ebb78c81c3b602102b58773fe23b7bcbbce1c3695f95e67ff26ae4f47a5c5723284c5da300e4319b421029f001d294346eff103c04e0a7a99a601678f2c0b5eb54ca5c64f94843c7835c953ae0400473044022055213758ac8a9ab6b797484a1cc08a44c2b0d3bba7a1ec4718ed4a17495e0dbc022054dde54dc9122af27e8415721c388423753ec00db74307bbb756331eec7476ed014730440220254cc9c1b9903f60d437bd745ad6bab2dcbecdc25f7d33330178e6605d60ff5302204c4b80c60075e61a02291d673a8961b6527965153755f2cad5579b56bc6fac0c016952210363cae418201f90b1ce020b02b6cad00918d83a6f7a25d9b56258f6a64eb80547210356eb06ceeb2636c331babf059837f6a3967abc2c6b19230a2949701b40eb8d792102daf8222d68322fd0f240f36b9a47bd64220267e150e3174e0638eaaabbe2b71453ae040047304402202fc244f87bff5cfbc1f9d58e3c0736e94b8b71ac2f6e654cee97bd7e7def9fb602206e8380a5ef216f7e1a5e00dde807e3ec7b3733625b0e29c3665c79c1e52ec94601473044022009d9af1026df5e001c754967c2927486e8e102a2a5defcc1e4d19d19e79b7238022041bb8b6a210d112a2e846185eb05e6c85883e9ff466594f59b927c6c975d168c0169522103232f1d44cf7e0c10fd1cd8dcf899687a3631d38f229b2367df32c19b703fa7c72102479d58915fcf9ffb15a66b000c0b4e86485d538d115e4105db1cb9fe7ab40fae210308116f63b9ad3ae44ce10fc45d27ae158df8c26cf00e00d4453c265f660bf9fb53ae0400473044022058a900c08bc15f4cda52332b3c3d69624b545192781ed5eab86bc463ecdb62ac02205d7d755172e8165fd963ff0f27972c8693ff7e2420ea904b84d42bde5dc120dd0147304402204c0b71f96fa373ec3d89e8ca2fe5946c52325411e025a8e4c0ba515ab95ac6dc022079f9fb7d3efe1349d3715150258a19cd21d53b06360e5283807c96722dafdba60169522102d7664594b903b4e30dbb9fa969df78391e26bdaaac490840f546a44a3addd5952102157042035b7d73343891f477f90cfe40f670aadc3174af947f426b3348dfe6a82103f78926372c97694b53921dd814beb1d7dc3f6eea65903e49c568892a686214dd53ae04004730440220786c1d2201aa902bda9df88aab8e1a55e93fdf95750fba72ce8df64656e746490220242f464bbf9663aeb63b42c27b25a28c44699109a7120fb6a9c48c15745342a20147304402206cc6f48a53fe6526587ac30d5e718355719ebd2e29afe7d4ea4eba44cef0a01f02200a33b786d6135f6cdd8b5d4dc4f26c5fb5f5187044dc449d51d374c25d30d6fa0169522103a0d93382e1e4390854e98b76ee4866d5fcb8334e94810a50882efc8e99a998bd21036ba95a11f3d3b08d96d6b0684601e6ca26ebdd5d25f5867d539b71612c1bf4d72102e3d600534d56a23b86e6cc7b0a98368a2f006e31e917eb96dc2c57b55fd037f853ae04004730440220712d593a1e64860453e1c5a2ab24ba9567987a6dda1a0e1ad29979247079a18002202cf13c3e09e89bed17cb50e18141456b0a8f0626366ba6f788d7954963b0bbd701473044022002cacf184b462f622d7e66230f829337e136b1c5fb5677bce3176877157ebb7c022022b2885ae0dde6eb378d568bffbf710897d84ef94a95ace77a8cd5028785a4a2016952210284c97ef2a740dbe355f888f2960015d23681e7426732fbfb686cab3b8bb351542103ebe9adeff93529168918747fc52900b4c36ac15fe89c6c85500d2fa32d3cabaa21034b51c56a255701518ca252278be6922aba2417ee97c23678fd6176a714713b1753ae0400473044022100c048da024662464457bcf715983a69a954af730536403570b479da3ed0130e40021f2ad2f0bf286f2ed951ce960bef48771482d41d137b5d8ba908b1b925eff27b0147304402206c0556d5aaedf3f5bd170ef85f0c754c461d1c4ed47d03855dc4b9602a2c9cf6022030f817cee803d246ad80dbd353c101fefda2ea3ea1f5ce6d8ded7c655ee07089016952210312439386b77aef075cb4bdce88d1c826333dc0d15a55507c061251a54d942e482103f9ce7183c020af1b94e713ce38dd440cf50de58fe18f19b7466fbce3a9cb71c3210349fb932de657b897f7e574a6564a32d967289ff61f9a1f66a9b17d82813fff3f53ae0400483045022100997a4204277ec3cc1737d203ce1d15e70df2385acd8feeb05d5a04aa5e3df22802205e1c46e02d0adffe964f8afb77452aed2d240abc37cb6142147a98e73330f05701473044022018b859450bf0a4d9ef4a95313613732971cb7b5ef82397c26159d022ec104cfc02205437d185fe83e7d31a5bbe160f51f84e4e4f015083bf4ea1f6297efbf367a51e016952210209812d2937db8fd72b964738253479843c75af9684e2fa99533b16ecab3e30422102c93da81a4123d34f19df350480f45b3364fa6919846bbcb69f8abbf6ef54813d21038ed5b8e7a7f59c6681ff67c7dd8f7a9c4b767d21fc490fc30d0901f02e94811453ae0400483045022100e8b5ed88625b7b555297eb7f144ac7873f9db891093b04fafe78bff2740fd11b02200d7ffab58aeccfad0f22737224eeb189ff7f8d6667a368183d6b99f9222965a101473044022025cb7701b8f70d816d510814599d8857e12ef8de86da108adff6a0dfa1f042f202206304657253589029238594a3cf30a2ba64c943eb012174982b8c792d058f679e01695221039d70801345516ae834599af34e9ffcca0e5f0941315367cbc27392386164bfc321026e89a5d915b5da20c560852f2a8be03baad19391dac109eec83709b91ac39eb12102f614b563234e4cd07e38114fefbc91c151d6cc61cedfd0dc47d19d2497c6aeb153ae040047304402203d50fb1e50a58caa5887ffa6ad0be44f85ddc320b07411f087e1db9130d2bc6202205dfe91ae775f61ad3aca822c76f1a7b5eec92fc17c2dafa80fb826405d39be8e0147304402207b1e5595033b661c2ad61f4b91a582bcbc859a828a5bc909ddb06fdd49b9982b02202effdaf19bac74911c5077e8a3d80256081781b1254eeddeec84cb5c3bb80c9301695221030433eb1830017458bc96d970f5c170288b260c7afab6e73e26dd76ed92cc458d21039128041a104fb77a721a9ea05faa3428c6a2341c089bd7acca7ff30ae6d6b8fa210369a12747be237b54d873a603bf70ec3098fc5ed373a0e001974a3ffcc6256d3953ae0400483045022100e60ea82f2e5ec873a8096b9c129bc7cce4c96ace5613bc278499b0ce7047947f022019fd734b812cecf4dd7cd562d4bc74ac3a7efcbf9a7a7acef36799ecff852b3d01473044022025cdbb39b5bf7e31547d0a8e0af9967fd45cf6290a7ab856807a48c28e08a1e602204cdeee98fd0c5fca4b563f1259ee37e6168f5cd2406dfb23e41611c82cbb706c01695221035a111a666627b3516592f7f57e55fd968f0e235f203cb8ca1b768b781262eccf21021464c3ec7896ce1217ed9cd5f618337daec0790aadf03bc8fe8552cdc9cc372f2102ab017c681b8b7c9ad0d47e9343a48057b8e4cc83158a8258d0eaf3df3946c5dd53ae040047304402204f14c4995f8bdb6483f4830f1830670929cf1aa372243823f3147d602aab4407022059779a493960ede21aa03468b369626df0c2b5a4f5bcbd4c22172ee68d2bcc060147304402200eb441e11d0f5e0369d829278061c95be5d540cc8fa3627a941cb557c3d1578102206e5ebad641c188fbba2fab14fd23f2aad6aa8bd06b06fd49177c9e06a6956b1501695221029d69465c994e36702dd55d54429c0d747342e51379033c6dc79ed55aee52cc362103c278d037f92aee3698168a16660faf4dc704ad324ac78e3496f2e9bfe505297f21038a11f769f5e15299e92c2dc16fc2259a94752e21c56d41785a38c78b17c23c2453ae48a00a0001000000030f49a08e7d4665bad2fac57d685b0b2dc9e45ed901b87d104f157bf57afd3a9f010000006b483045022100fb7c1fadf8f85331e77880eb5c1c10feed825491ccfeaeb9f6d323ec542bf59b02200a211435f4b7ffa59e197ce8d3176e6bca11497dc1e310c703ddbac54bd1f0710121032293062f90c4bc7289e41ed53663a254d5b347c622ee26e496629ca7714b870dffffffffd43c3a9fb8e1d89cc3ad7d28d563890be7cb13aeb73207bdaaec246cde832118020000006a4730440220101e5f44d9da9778c3822113f180299899a6b73821f30227a7d0ab9eda6fac3202202f3461e974e8f77bc0079b984b82989833a36d1eb24cfa6ab2e195d258af29f90121032293062f90c4bc7289e41ed53663a254d5b347c622ee26e496629ca7714b870dffffffff8074321dd733dfd9293adb4ae6bd61b013e19971d87f119fade239a372c35a05040000006b483045022100a539153024a09735e99dd91fedffcaba129f5e3da272f8615c06e91401a289c40220525e94e045d815ff440c81228751a00db27ed058a0c95eadaeda67d369ad7b440121032293062f90c4bc7289e41ed53663a254d5b347c622ee26e496629ca7714b870dffffffff019d3f6f0000000000160014f0d92cbddca31fa631799cc447d39555201aa80a0000000001000000000102143d750e5814ce87b6d6295a2e28b8e54f997c7b2e26f72f584d48f28c66e04a0100000023220020b04d22d4e56f79790ccdd320c199537a1f96df8ad329ef011f907e6f66bc0cbfffffffffdf0fe6d11873c6cd3654d5273b203b11c06b553eabfdbb18fb626b4bb8fb06f9000000002322002027dc60de65cb130db8f6730517d7fcf368a716a8c8c22c261e8ef693eefb584bffffffff02a49a0400000000001976a914c930690e888312478de9c747c2e9aa0ed5241e2788ace3a710000000000017a914222f8c776e641c205822c4cd11883154eb13211b870400473044022055643f4982ecab4887b0a4c33326128ba5456f68b76a2574ec713e94512f4c7c02203b1c0a916790cf171118b614b1e3206ba7e66366370ef4d15f284265d491f7340147304402204cbe9c9d21c8c802746cd357bca39e706644d0717f9267b4b067e2884dd4514c022003d5ccde239bbd63b80236fbe1f88587c116b3cf3c2b34448410ac7d4d2a760b01695221030843d36c12bf75b580a29df4fefee56053deae720ba2d85613d0e69ea7d4bf0e21038756b44bff5a692bb9a596f6ae8fec1b78f5c921a0c67ca534ed04ffc61f215b2102135e5261123d96e1c508adb955db1b3bcc36f6b1d4a382e5f7ae22344443f31253ae0400483045022100f5c513eb27cffca886655135ab8fce949f30a1dff17d79fb932a787e567b79020220309c57dc98da4eb66aacaf593745689a1946e458343dfce42216cbfa4e2cc33601473044022037b3fbe75e91db533eb7dc2f2856ced67a7b2a72995fc4f7ef735a2de9f1a79f0220276c91e2ded1afcc2e8308ac43f588da978e64be639b6002589fd15fef297e9a0169522102d0d4ca6ae8aa04181997face3b260d7ceeef7528263f589fea3a5646a2f978332103df4d5c8dbf186b0e1172b43c87874b3d43416c2eaaefe4d52bd8df8f57f4e8042102fa68202868f0889774474a1747f5afe394616c147054eb3867f75564a1212e7953ae47a00a00010000000001017c7e32bfce9cd2cd542edc0c8887711c8e503a262a04ab39be2e3c52e1d250100000000023220020c86021a3961ee7f34d4d6ffd7045d791af8cf57c9f23c5ca30d576dd43600b25ffffffff027ad510000000000017a91406057d3bc839bb0178d06b548fc315225a9dfd6b875d9721000000000017a914841edfd8d41c1f74eb2dea393a6967ef53d0f4d4870400473044022053dc20fa905a01a56e5ed89e93cc8a1548050fb6136eb7537ef67e147623a91c0220770f47410d118c7237a25af8af749b63fee2bcda1f707805328f065f2bf89b730147304402206bc84950c70fc5de0fbca01b98300bc244f15420e0012c58f87168c49b5b3d900220406c0816e426e92b93e9e4fb0a982c50897e9ad52f682443c73867d923fb656b016952210382c24d169470cf423021970690aec514bb9a3cc72cb201648738316a700942012102fae3bbe86fd613964b1c07646adea5d9d20e9996da16b9c1b26be6070df26ed2210275b2af1f2ba2be55a87e4079b93b065df5bcee100812c93a39561e0077ac354d53ae48a00a000100000000010ad671d7f1037c1e54d1d78688d755316c687e492de8e9871ae065b7dee761d60a2a000000232200206a11207d413c89f8fc8b52c2108c2459f0ad7e5e365aefef7ddc11b8bba866f8ffffffff6a1d88233225ca5afd175e720ddc849f37b0925fbef756adad2ee3f796388a2101000000232200205812818a8ebefe2f4f5ec66ee1052139a05ec7850215cfd98a9568b980ef0dffffffffffb7b4e93d27d13a7959b926036b98686c577b64f3f7f5340c19394101bcb4ac230200000023220020eb588ad4218c1fbe861f499be7952f6d52fc1896684ecef6472914d138a2bffcffffffff902e972352f65d5ecbb205b57cb8dad2aaf6323741137fa1fb2e5d4be7749034830000002322002025392ecfba92bf815b80c13744867dac222e8e7ac9fd41fc4f49a8de6ab07cf4ffffffffc746bb6471cd19d16198ad71e8fdb63b73ae8c7792af674ddf33ae3cf2a1ef411200000023220020ab7df18a040a30b0bfed4a537d37c03a2f7bfd8343bd553c5f3cf05680c3a79affffffffca30981d4c50ca68f467f4d6991bed81bdc4d15022608cbb52c439cdcc1dc9ad01000000232200204374874a911e0c73073c7bdd357c64bf4b50ba7bbb68c59a9a4ed913842026c6ffffffff7955011550a403755762dfe0b25dfee403e732a1539157214c1cb7a0e282a6ba31000000232200203569898b2862728175f6ca712b3bf79ee99769876f4109e79a949a839b5b3621ffffffffd0f3215810e67b9da6bebe95f70be6a5298f3d1ddd554cb5fafffd23282a3fc300000000232200204e5007d4964d43752fba39b9ecb5a1371a2c0b565d7cf0a9d79c9b22515eef5effffffff3d52b59831767a89c7fd8b0264448cafbd7e4ca7a1f5f32323f6252f44d1d5c43c00000023220020f58034bc7ff13c9a1d973e4ce18e8a7a4af36cd762f28dbde8d1423a1cf38130ffffffffe7b961963359d8aa6cc572ad0f8859d12b2f36588fd8958fd892618f463582e5070000002322002077a51646b14b2a40b25de4156d3bf44233ff6ffc00a8c4a5f187c027d9b73a71ffffffff026cde14000000000017a9140683654ccac23810550f756bf460610d151cacec87c04032000000000017a9142faf09d676c0d33cd0eba606982b1a9af0e32f228704004830450221009aba0338fb1e15a13d547ffb93b3d4fd726b4603e3f465948a9feacecead29000220197770578b2053e13025673e17c8e4e2ec5c75d8aa97b66c7ce5dcf63e6e873c014730440220212c4e46dd0c7df29a5424047535b597a36cad661c5a15b50dca99eb0963ae69022047bf7d829126e59a5318cf543909e2e917f78752a542de3dd45580636bc84b440169522103346f6ba93441252cbf54e49e35cfbd421d2eb15c7d79b65aad02734184b0596421022e73957a7326f6f2d607ed80a9c52ab1b22d46461be127cf1eb369e8dc9c57a82103ef8bb87e22d60d0b8e591d9579498b7993bfee9df95b33507dd16e2cbbe0c8da53ae0400483045022100d21bb13dbba259634476b278efa2d7614072bdb21e06bce9a707bec3c989fcd002204b679c3e875cd77c6b4597558acfb9152467ffcfbd1a71f03753cfaec38c1fb8014730440220210cc88229bbc7d35a710c2ea86a816407a859ebd39ee1c9b8d38b0323f4b0d1022060f5260cecaabb95d1b523dd1c02fde1c70d417aa157450d7c3b197a67a9dea9016952210211a0d7cb66123ea4010e5c2e30b8ae3b155fc5da9c587aef356dcd7dfc462de721024f9590a5e26315b8ac8e6be467e82a94a509e153ede48b3d42c20bb3bc9715df2103d62e80bcf794e99db239c704b2e75620dde5297abd443652172292644b88f3b353ae0400483045022100a978ca2060d8d3c9243ff2b79a474201632003c48b71a50667efd04a66be8c5d022050d475d0a8e2987b7ada433115abc7c88786c81babce6cb0c107d32b95ead2fe0147304402200a152ca7b6835005432137f33ff954e90d3e7cc38e827c364c2fc4f3100dda8b02202aa91f9aadc2787d8a29121e2c406be88290e1267dee1e5df48afa8824e1350e01695221038cc2b2c8f48cd1dcd75386b57298637c0d59bdbc5c8b02213a8db5fe5e3c82772102fb3ee3cd1b5ace036283dad605ed8164fdbdd8ba75feeb732c96baea359a2fbe210329b9088011a4778307cd0565c2913d9bf2441df9b5223eb88ff0e54c71e515a553ae0400483045022100abe9c921dec8c06291e7e29b4808a6f2db23474cdbf96f342e73126085e65ca802203d4a867c404fec389b10e0dceaddeb399b4d43df270adfa9aee34e2400c75d8a0147304402201ddd4b3f04b2bdd8aae3e6baa280239ad52a47330c1c5466613e89046d7ae2ae022034e3bdeeaeae333719b3845ce7659a0a2004f8e92c3f85ea6759d245d246c3090169522103ae681b556866aa9bc32207d478d624cdca1ed293f30e4c46ba56ab53cd309f8c21023727e78b995e847aa3b782b4380954ee0a906d18dc691ce787f62d7cf68dba012102eea379f518adcdc97ab7e80d66b8756867940bbacf6827c65c23b8e3304f801b53ae040047304402203da9349bb8f6a6aad228aff95d3bb4ba3d6d2e6fa0f57c40815ec90607bf6ec202200da942ec2817141f46529fb62fb3eed1575e01e09124c783dd01d0158d5d681301473044022068d13df32206271014e46bee0ca092b4e904f84419951b746a100d2890e34458022054766b4cf777769f59cd8b201d9dca49f711344e2f499c228e876554678600e001695221035c935ea18caf27eb2849c465a48e5dfd1c217a0117a0dc527ce66c760249e1ee2102c82fa56abee4e940051a77403ef405e4a156a3e225c2e95c90beef611958c6412102f8960fc843f2295212a1e77b97a83f5834e009be462924ebaa0b50619b2cf39d53ae0400473044022023273181e68e6935dc084733d24c9980b242e0dd8fa84dc9dd4421cc0e66343602206f60cd0ee28d4792f03a945e8224301160842f213a578517530a59846f0c17410147304402204cc494ee36ac818f9f187bd67074021ca68beef1467ad4ecaa4fb36db8fc80e70220146b66bcdb54f6be6d7deb39976eab180c15ca95e70a5b325b5af490649fefb00169522102b2e5cf2170c9e724c5104a1b32b67ce12db8e4033aaee681fa05b5ce1b3780cb21036b60245dc5e981d9b053b9cc844fd31c96600a916ba09c053e4883cbebee934121036ba91a649a79d3464c0d710282861e3b7fd88048ba38e31c6b3cecb6d74c595953ae04004730440220710014beeb3c64e168724cf7c0843be42fa5b84bbb766b57c194c4dd1c25ac7f02204b74bb8b064ed24e5b2e77136960610987f049a35c9784959f3900baa4f7b7f3014730440220025d60dcaa88fcad1a97e302f59f73994359a4cf21836623cddb47aebc701cc4022065a362e6743d8e1f0164e182f4388828dd5549fc699098ab5a4df3568ef0452601695221020ea493f23a1bd475eade33381a5af0b63080cdee0a0bafff4544c71bd1baab7f2103c4e57e02d898adabc703e148bad49bdc2871f0d8cdaba1668a37c081ac0e90732103ad079627e6529cf0e784b363bf5b52c9e3c851c6a15ccf6a2d2c726359ba63ed53ae040047304402200d9b6167109f73fc498713382307166b226b226a9bbc140246c30622f3c5c9ba0220671f0c35a60d0317cba18b6a60d9081d0dc432dfd4e45bc6679b7091ec0b0c87014730440220250fa3a6189ea06c5ebc65758d8447ab73ed66d1446596ac2f3d2fa7f96dbf9002202fe0e7e0e7619a031a50d743202ef9503c5939693560bfe117276f04aa14a9f60169522103e3c55900b8ce68b8bcad23598aa5b3a54c07f778435c9e27bea123dbdb1d140e2103ab4bbef8138135c6a15c1d75e688ec0c6fa4c6e1b15f500a9cd37a0daaf43b462103ee4c7c0e29023163d247a1cb73c7ac9d4601135adf849e76155c33cfcc1c65a553ae040047304402204720c39f5aa99c3814750a60b02037fbb77c5b7bc15eba5d57eaa2a910c236be02203a3ddbf6cd04a06991a950be24ea228309e84f95a8bfd7917e82ec0d05ac43e8014730440220044c6b309100d1dd73647d701682788241ba074b6b5d2f3fe0ac0a1219c576b602206b8fe1f54a532fedbc627978338b7abb043724bf38574af4cf6aef6b15eaa0830169522102346eb29be298d40bbf3b31f854b8bacc902f11fc6a40146859616d3d4b4e0c9e21029337fd755aec4f6de4c9ecac86e3e1485657e888e21d0fa6a7f0c36da2e86cb72103f5dabb2e80c7c8ed79cd9bcaacba0776637893ad51def03ea082f58c3a64f04353ae0400473044022071dd32f76ae7076a6ed9db5743fc724304326e5218571e4add6d65b9de9669d202205fceac0cc9766d7f6a6289684dd0e40697ebe97902de9691f000af0f57b594f6014730440220668ec8a36f6ec2640673e54f1098a49a02ead118521cd2e28f966d826daa4e3802201008d12ab9bf295551044a270d1480a8bf2d44d0613b9dbb99e658903be8a084016952210380115fd65f8717e13c44f15eafc6c212c3ac5e4c5773c3115949ddc36ec9b2dc21023a6fd05d1dd15316dab99c22d5b2f97926254283ce12dd10208252a0c9c5e1ef2103c04d04c48816ae593866a9da27e7b340a378b7cdd959cfc97da2afbed2c4a4ca53ae47a00a0001000000000102840015e6891034a29e32bfe93787e2d8b6f467f9e21e512b9036df3e9513d32d0100000023220020e07b7843697556449a20f92608b639495346e1ef7d59c5e1aa17a445f92d5daeffffffff3c361ff7f1f2268bf8f4173ff534c0124037840e9e7f00057155517ce5eee2380100000023220020105b771fec41d26a540fff6fa4420e1a7ed03c389fdf465ed821c78096502c3dffffffff02a6a20f000000000017a914e2b95b3ad34f429c499bf52f466c24b0d01673d88797d01d0000000000160014d7fdaafe511d5e0a774985dc9120e9471a068016040047304402205f13b0ee4af1c31c02d3ea89ef6d17a98cdbf7aac5879bd55c92414a2e1df4f302205a0563c6390bcca1604b1d859006719afa659af5a3623ab1d346d156527e547e0147304402207ace204a00860161b6e50ef4c5e1a011f27670911b2d50d3e6993fded3d7288d02207caaf10d990f19c6407aca4115b4f92dc38e7e0d0762b821be91490ec45389bf01695221035af3f4b6f8a972974debe76e5437731e08f2b0120dc666b79ad08b6320f601c121029557568f3e5f343c5f8004fafe052ce9ff6e943e8074f7681955c0c2849621c02102df514d72051b0418582cbe745d5738173eb5030e37fbfb9e5cf95c335aa61d3053ae04004830450221008eb4ec9d5f7135e3c1e20d79a3986ea246a58e59dbd8a5986039d0a547a4b3dc02206cb4130c179ec090d21b6304cda58fa15b30b9da5557724059ca60bbf2b18d010147304402203afa2a98ead597dd4eee457cf0c7c44fe294d092af8e8705b0854e14e5bcc7c40220786c379ad70170448ddbb6797b0f1fe13a29e705f0b5b6576d5273e6d3f968240169522102f4eec5ed1538c90116cf540d284595c0b06bc56e090961ce4fc46b69b197764e210356466ade978d400a9cded2f3251090bcf9bd2441c8bc79de73696ad5867c6d6a21039e28cecebc6c05bb94571741c66211434ea0e957130d6b94192af3d4c7eaa11853ae48a00a00010000000001025aec5ac55b212de4e0ef3b5ce28fdde457ddf9539e83f08e448e9fb1504813880100000023220020b372f0f54ea365353a9baede35ae1a8bd20e41f76e9002fb247fe48c95be4553ffffffff47e9b0a275398da0ae8d13a48150c1e3c9e24326a07fe259a52a674eca04d9ae01000000232200200bc303b24d47eb889ae302e0bdf25891fb4f743654c7f3424f8b63d2c18425bdffffffff029122030000000000160014e69b965d02caadcb9fa0020c8b5c0cf60bb05fa8aaf11d000000000017a914f6076f56bcc3cf4787925e7bd6026c998faea454870400483045022100c1f6a9a503317e152ac847d544b5832e9cd5e99daf79b24aee08148117914aab0220217164bf521e640b88067c902fa058d402b12c44a6d73f514a40567fe5f6973f0147304402202ba98daaf276e630392608ffd829e0a580c81c64dc7529360f413ef9fedb9bca0220484710bbedc0723e8e45eefca7aaaf121ac23ca71478c413d0a910d552f0092d0169522103fc691c5666edcc8da23867de9684fdea80d2bb2d4269614879377e4b5e7e1bd2210263e2b67c3463337b84c9d72e52f92dacc3772b7ee2653cf68f0fd53dc0df64782102d11244ada873c57fee29a6609b7f82e82ecacaca9ff4060089790bcf3c0e6d7253ae0400483045022100b1dbfa3288bd11456fdb4b764332529359ce5561e5b1e8ff42af2d6cf9911c6902205030ca2f059e318087dee1511ee825f2e05bc5b0b7373e74c2fcd76da39e156c0147304402202a827e1a3cf06cdb1beb250724a583386c2f634a5b7366123314cac740f4ef7902205a46bd5cfd58ca6294462a5a5ad51ead01ef8d4a641cafe8fa3b5e9cee11c76601695221023bac2e4e813acce53c4bec9b8571ab34b173c5efe2e5dc55e9c3485bedf74e5b210242b83854e2979153c7ecdc89eb9c2d4554c3dfb7b7b43ff4d103402c53bf166b2102dacdf2df89aed363549a6b5d22a50ad68a76fb3abb2379eab43bf5292b32294c53ae47a00a000100000000010165d800a25029adf9245352915f5b484fbec97b09bf331befc9c9a3f0a96f9f0e010000002322002069aece5a7728d7d067ba7950abfb9006ce38d8d6fa96d56ca44eeb8c37457410ffffffff0280f0fa02000000001976a914f1b77375a0d24bda42a2832bad76c18a541e09a588ac7678ba0a0000000017a9143041b34c4003c661e08fc45c7f2f94b4c60420f78704004730440220029aab3a64987b5fed68ba923e443fbf0dc4e3361af5bdc5d0424c6c7acd08bb02207d06f0d5a00d831ffcdc82ab1fe502c6404e0901d34a0f4bae19c48c6823996801473044022056edf316048412892ca336c7a86826f222c7fe631658da9a5870f22062c9ae1802207874295da34cfca2072a000b9d45ff765a5636e87dd4e077062e95163d0cd24101695221022bc472a9fa6c25ffa4437ead482141886a83c9740df5f3de981f7ede46afd17f2102e98d7e38567cecaa94c2ec2761bdd1bbbf1bc9fafef51274f7c45f4da8b92e7f210380e8302da297bbb220f29040232572fad81ad656a8bd8dd991f63e6c2b0f92ac53ae48a00a0001000000000101b366da076e8536b8f53faff1c8a0d3e8bb26cc7c6c75ad448585fa561a5334c401000000232200203fc6329e9b78e710cd069a0a365bb8599bb67cc945cd1a4bbacb2a8a9e241942ffffffff0200b4c4040000000017a914fb87b993f63248d13b026a0e7332dc45eae84f25873dbff5050000000017a914690657d083fdb86e7029ba34aca9be732ed86695870400483045022100dae839e847ab53a4e94c5677ddf5e6b2646843c9dc1129ec737305bdc51ae9f90220710fee286ddbc7bafbc727e1475afef2e62a1bf2a91f9b2aed93c62a0cd0f61b0147304402205a04957c23f62ef22bea09cf85240a757893816dc11840e2bc5f54f88bc74a3702206b84dd4aededc423dfb87f952d62af17dadd20752a931bc18ccf9ee7de5128a00169522103000a3e8b2c2a60b0a7753d4bce3fade70f0ea054da01d2cde303647db2085be12103d4a437130169da88cf9b56bc4f45ea084860f2961a65bbb0aedf6cd65d95c9302103b71e1b45928f03f3301877d5936c5481d8ae3f51a70bd83c640943062fd6cb1853ae48a00a0001000000000101eb6bab71f3d966736d12d0bae5bae3ff91768ba3613787e5d2e4c107f37a07120100000023220020154863a232f68724967610b2e4967419be0b9577ed9eeb551678b76520e21991ffffffff02002d31010000000017a914a68aed6f7e5574240a27b3f77ba2332f71eec7af87048dc4040000000017a9142ead538de840644ce081681e3954f37bf1246f418704004730440220077d1b8cc4c52b576265ddba71fbfdbaa9f6becf8ea896ce32f211c1ff2d158d022007d08ca8cfaf35d513f1d244e9904339a9b1c1e8cadacfe0f1d3763eab8eef720147304402206a49804f487372601be1dccad5489a447c14ee2fa90185d2f188cbe9b5cb612802206c4d3c8cec8050ef4f75ef9639a05815a0ace553b0a89903503d9bc3981d1e53016952210317c89de2309510e77a46992436278373aaa3bc4a07da052158cb9d47d8100d792103bf7512170000006c4c9d239b60692944c9d3957bbbaea2d2507359a81085794521022f3ffbd846f53faf99d8813bd6514056ab6672db42b803f5c0c05cb9def3416853ae48a00a00010000000001026adfd2076c2be24f3691ddb1bde984472714f50a1aa52c74501f1dccce6da455000000002322002092e3d12f905104f1875b63c81e26ec8c188208281943759903c69c43ad0a2827ffffffff81c0400b407289d8a680b7bdb8121b4028097a3178b8e1f597517000929406f72700000023220020405f2fcf6d8a25e4d922f25f9934fb2f476a472cd50b413366285f5d1ef12033ffffffff0211b103000000000017a914e37f45597cff5b9b5d4558a008431f699da53888871f6b11000000000017a914ac945458f281d4fe42888f424aac1e56b9009a65870400483045022100e449117f6567b8e4e3c53d40bfda56a0071b4bd21b3b16a4654fee960e1712740220131d611e918fbd3f652cc0f58059387d92b57da583e4d2affd40a2aae2d9c3a00147304402203b912cbd838f941e34ed7854cca1311ef5767ab6a9083af59f8bac07f2fa137a0220604941d82d15102476d14c53c18956045598cd52630ae9ec40ff3e53b2503aef0169522102140eac6c2b731d63f8ffd4c1825649e5fca3c95654d25f9b4d3c0ea24a040768210313b356ce5cc523447766c5ad77b4b8ae64937741fb3f34cffbe9d87b3bd2aef82103f804af00769aee09b72bf51433c0ae56ee39c70ec824e3729ecfd9b9eb02131753ae0400483045022100d140f6e4b8ecf341a3406b8551ad894f0557252a5250237b030605c0edc6f4ad0220411d03e56b3563e9c347565a37f18e74a15c43b4be2eb7ff06b7d8a27fc969cd0147304402200f68807015c5ece93f4b6671bab0e60c2fe9fbe031bb96253983f339bf7486e0022072426bf4cc2ce3189b34431780ac1d108d7e3171a99eb8cf8b275cac1396d9af0169522102c30423b9ec7e819bc3e696aef1fe3b8571980b2be5ab74fbd8c988abdc6c52032102df52c33193bd460f349cb4eecd9a46bf88b8768a60d7ddd96f1859603334b8c72103d688b3be241d1d47cf4f0a6eaba734e997d98596b094769e1731ffe93d6229a853ae47a00a00010000000001026dee9d56f510d95eb686f49b38d962dcc2d6c64be91d8b05b843e69e8a0d842d0100000023220020eb8c7d362afc77a0a188da08a440e7e24996c36a509072c0dae5fce01fbc2533ffffffff8fa8e824ccdb851fc821f2f1711a4fa68551f218d91ccf6aec02c6d1f6eb5a3b01000000232200209b0d4c2911bf40e854fbe6786db241f5a7259eae59ea929ebc25b01b5787cd50ffffffff0265430f000000000017a914308a131d84cb8e745769b0ab9116b0c922542ab987ff3010000000000017a914d0f33c73db25c9e202186fbb498e9931356ee06f87040047304402202f3d98d397ccc90afa7fba67411703c28b2ef0db061360ae54fe779ff251d27402204154c9e691a9e9b45ae9873610fe76a6b4048f08265f077b295cd73e82d0a4f40147304402200f939adb469be6f64186606043c5ff06688dd37792c027658cd71c3c15bd22b202205a3f5a766f499c60ccbefe051e068f797637071b15a1d3cf385cf47b4db7dc380169522103f7fb8b5ddd13332ef5ab51d503b2661372a28d1a991fa9fe023a100733465c2c21025d06be5cc47d1fb9c4fb036b5da3782ed9bb15d535d9dc30dbfde28be66ef9772103ac23e7a3c45ed966a259e51ad16a2c09b1caad27d2a909fbe16ee2cf1c351d6253ae040047304402201af016a50a778e6beabf74db60fef761014163919e3454cd4242451a88f00e380220283069cf1d838290c4c763c9a90eec8654677e654dc5b4bcd1c45132ba3fb5ef0147304402206b080afda27f7e824e89312df7f47b112e26ad018f6cca4b63999122c343c696022065bc9e357e40c777df26dcc3198066777352e0560088a4c3e4de8f488b657d9d0169522103e58ee5948a9f700758d5bd1aae565c78d8dd1a1016b5fa71940e80db0683ccb921023cf5f7c2d92d08620449d970093be19b39aee4a41fe57f9cdd607ee044a06945210230cd8668b12ee44703e9268cc1b99e04e606776cfe5fdda2922ea2b77dc53fff53ae47a00a0001000000000101a21d4f81cdc9e8d8bb7508505548275653b058d9ec4be72b8d1d0498e39a8f5704000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff03b14d4e00000000001600147d11ac4c48a1408b694da86a96c7cc02e0811216404b4c00000000001976a914019d2af19efb389deefb53892e885e5f3a14075a88ac34c7321d0000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c0438702473044022051b7e2f278cae8eb8684735e35069d495dd553369ee56f5090cde83d732842bc022059f30473057b7e4b625850ad1d3da0b438e710238c818b96b890092ac573ed7c01210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff00000000010000000001012b756be7add5c75ac61befa2b82f1c7d5d84ab3670da134b6c6775a5417de90d01000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff038096980000000000160014109831b744243ac86c44281f163791442817ee0fbd471300000000001976a9149924a8bfab420a89bd63b7dc9c91e5ae9786840d88ac1d251f1d0000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c04387024730440220326eea4bce2b88a3fc853e74f7aabfeadba8b560d88b02ab0f1368ffaa5bc73702204dd526cc7a43579a5c4eedf4906d6f9295b2447774a7dbe1c6a2cb9d609d1e3b01210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff000000000100000000010113b5607a19f40070bfdf4a39e5d1b9ba868b8b2b8ae8063dea92282c8cd9d8430000000023220020e295f82e06e470389d22400f51d45ad9665906a53bbeda02ca9d2c85f5f9bca9ffffffff027b620a5a0000000017a914a2a016eb1df4ce3c2a16472513208e7fa47c99d18770e64275000000001976a914e86da0e5cef34d3e440f3373819671f50233e51688ac04004730440220227e546dcf47ed775edf39d7e630cf0477047fda2df3af385488b6af5c50aa0202205df402f32b9d7bf52242ded4cf592707ff46f8343e14051da3f04c6995f828130147304402207dfbbcc6f0208b673248841eabd9ef1eabe01174d70467b6a3d3417de054f4e9022046b14279fe4560999f21367f3cd1754c41c13e15790a2970c0c0a63143c063df0169522103b50f7d54d2686b57f57d34fa89bace966e38009a60e2b6fe48042a36d3ed175f2102e005eb06cf83e8989c162e9f49ee606a6e3a5bf72f301f406a412f6a211bcac12103ff7a061b4849581df7dad7f8c01131bed2be7d9b205d3ff5567d209e273c91f853ae47a00a000100000000010156cf1575f76c68dd45309f88cecf891fb14b45ab91f8dc4c2c60503d28b391f80200000000ffffffff02f0e01500000000001976a914937ab8899e468b8fb1499a88e9a22f42057ea91388ac7c719908000000002200207ebdf7fe72c2dadad8533347911937672129095079aa2bb1a2b396f70b8f75f00400473044022042fb0f7b6406c4e6fcb36919fd58094d298fc0bcab9003f00e060c4a5dc1cfa5022079e33ff0dc7b8ef9fe63330e1864265fec71f56628e5c34d5a1626195b0db8ee0147304402204bef355820b698f7f33e0cdfe970781e88acd639e02454e28f490ba35601a59f02202c5a1aaa6cf3a78ae1addb70c4b119710a464997ed87e742d6e4a59bb6ce60330169522102b7bb486e57355f479c64d784be609eee40c9cc7aee896dfdec1b43f0d44a4dae21020848752ddfe72ba478c2ad52942e425b222abe565974a3ddc9516964ae7f2b6f2102b65e1c54d59bbba3efc1b391e2cd29af12c4be1f4ef822eab626d94b444c82cf53ae47a00a0001000000000101e64eb2818b3fe71ba38589157dde2b0f5ad4eed4f5b47779ba0525aa6ae0c65e0100000000ffffffff0250c30000000000001976a914601f6046359c4fabb3833338582022be3cb545d888acf6b6c0030000000022002013869e09d1d61c710e69bfac8fc7e94da69ea521aecdd00037c044895a7200b4040047304402206e91e7e65496b19e57c09507942b5622f048622468f8d41639e2d86646953c00022056c1117f1136713949ec94ca513c50ebf17a5e6f3635e5a7a353b582d0b43be30147304402202a95eedb5245de664d45f38601ba2db3e618041e3dc8620fa9f00b392ae15a6702203f31298247cad9d15e5b0b413102956fc83b6548d2c3391d794d244afa63af2b0169522102117a18ea94a03676e548eac55e79816d07d4ac68caffd22e64bcfcdecb98e156210378f578aeff5a5c1996b68942eb6fcfdbdfeada5632877f7156499b4dcc843cb221028387f2cab816c75f3bc842f5ecaa1a3a5ae9b3a25ebafb4c9571e0b389025a4f53ae48a00a0001000000000101811dccc8a430088f78f8762eb18ee25801eba8419e13cbec0b40de8a17b7e1ba0100000000ffffffff02d33c0400000000001976a914526f90f63bd26c159c902716765fc3836d092f1a88aca0e0c60500000000220020ce9272f7b2457cf3311e57dc8573522b4f8c7e8f99c9dcf835350f2421bc100b0400483045022100f209fe20af883a45f3c674ad99e160fea1a07fa4335dadead3b3b9771856da36022061cc639ee1d27ad323c94268e7c27085771ba0c7a5ac7e7cb7f440a4505b8d5a0147304402201688d040528cf310b0adcef8dda721e51fdd4b0d1a17327bbf9ff25fae2d63e702204b808e41c49de80ed6ae76480c2c7c8bda6bcadfa344257a96292cfefeb3c83401695221028d1ab1bb93045b5e7b33456e4e6aabfca4b32cb3b994f8de8b2eaa7dd2402a082102bd992ab222c6ff3bfd1fa73b57038b6c2575140a31226a1242eaffb1e1fcb32f21020ab7922ceb57714ae478673021a77bc3d38d43f521d6d6ad10abca291396886053ae48a00a00010000000001010fa8e33f9d78c1ed2ac1e142b0c451a3584805ba14bfda53be3dbeab1fa8dd730100000000ffffffff0270640800000000001976a9142d421fb2e7f4c4d4a1ef23ceb6f00df4cebfce1088ac1b69350300000000220020aa3ed1e5a96c16f797cedbbf86063b099933b37e419a9311698d86e9f0da3dee040047304402207b107087da03e0e39ad3a00f4c8855d883072119d8dccad43a593aa2733409bd02204d578cdbbac84af4d72619021f9da0b40b95876c8b4454890871b1ac3cae16c40147304402203ba1672b916edd503a300783b210f321e6ff8d9bb810a317084e133bbb22c1aa02203e50177f20eab236757cb0d56ab4827edc0679d006b91c7202164ee4757b23500169522102783df1b28396f5fd037e4521fcd6f68b340ff0f3ddda4f7d1c73124c92b4f6112102178978820ba4a4f5c63dd9793554bc8048dd39b0eb522fa9151cc8291cb3a82a2102228c5b950cbb061efa4e691a461e41d468a7b4c9138aea1f1cb51d475ef51b4e53ae48a00a0001000000000101782122b61da694aa8979971badd7659708ced2a26de739f5542429942b094c0d0100000000ffffffff022bdf0800000000001976a9144433af10333dcf4495aa07ff7e568bc44851393f88ac77cebd030000000022002019edd9232989c1cd232e036252a0318b070f01896221771b5c5cde33d482eb7f040047304402204e2e73425c2b2b7cdbf169b00cad787e3a00de84ea9e903b06d234e87a48ab5d0220202938f35c1a7b3455912be75932aa0be475f8d21dbabcb36a61429b04db10570147304402201d20473b8f34fe0a2d50e68c84244ec7903b23a8d30b167b53f3c03370851bc00220786948ef78710ff098b3b683c730d479b56450f48b08fe36b852ee49f0b0a46901695221023aed40c695957d354d45749b43b82fdbe0ae3be4c959444731ccdc9b1a45b556210288d2899367227c2bb373ad3829c3474245f2f8c48e1f5c7a0a09b61ff725c8ac2102a68e818040a0e5e4b1205892cdf7e6ea2a452c25565cf57f4188dfa8a25aa54653ae48a00a00010000000001012375882eb343cafd6c9aff35a388f88f687bf5b78efd472aa663879bd13a2a850100000000ffffffff0250c30000000000001976a914c2a94e4744d43b64412b70fab28c549f8844062588ac53bacd0100000000220020db1071691cbe10efa99ed39f3297c03d7b080267efe1e51d84116c2f265df252040047304402200c61e2d1bba39882964f18c0e94f2f46b9f8f580355cb2359be0fd7783253bf502205704aa4d1b4a60aa7ccf02b12c630533363f3aa9a91d632190d77f76e76db30d014730440220713c6f1e4447173f0d2eb144ec692b88dc545db11f6893a7211582b94b5761d702204639e8266acfb57599fa0d79a7d36573470b27457af16646427611742dcf5c78016952210333941b35bd04fa47892acd931cfdd1ca53a243e3fb36bd92249fc179c59e7f702102c1bdf264e6d91d6819473c020befb76b4e2f5a6c66a6e7862b26a71e52f70471210243dbbe89e76c0685719ea5c2dce7668a49f306cc36253e9da7b1f942b8599de653ae47a00a00010000000001011e65114db7ea0d936fded1971cbf223daf2bc7d1cc491e307409db7b08796f7c0100000000ffffffff02c82c0300000000001976a914ce23e890b56b970762763c8b88ca17f357fdd9f788ac56509f06000000002200201fbd7601944d28ba53043ce7b13a92fdbcc78e61e5ba8352dcb09b135d24413b0400473044022058d37e58c1a35d542b331cd33c72c062cf3d49102fcbeba8d92fa09b347b5c010220337fef3fde41cf2cba09e07f1f228ed0b70ea547099d2d5fc4a479a316004a450147304402205363842deb862beede9b21d34a0cc6f9f6bad7531eba8e1843c2f34ad63ab18c02202929f527ec96c1fbed3d186630d90b0700365dca4a3918800182109ed4f3fdc20169522103cc119289642dd158cfa6fbb92f503aa89aab6330fb566e945f2d8c34384c0ccf2102400bf32a0d46dba0e8ccff2e93f37d22b6892f301d4cdc41c0f99235033ba4ef21033e5dd135d57575855019226d4b12fdbd3a14ceeb91176af9611b9e35093b9fde53ae48a00a0001000000000101b665c38297988b95aa5efcaedf81d38562ea9dd7c9b7ce470ba3bdd5d6eeea8a0100000000ffffffff02cb241400000000001976a91427cf15e2f270540cece80758d3a41dc7614f0fda88acd876440400000000220020a4cc3cb8b3657c01bcfeed16d43bb14714e1d54580c7d5ce63001cc929d1a29c0400473044022022d3f23541b1a4790470bc912015a3180bbbaee54f50334d6c6c3d0d047b653c02206824bc138d0716054288f4f625819e47f1624ae95d04c37b1f7a92a8d824c76b014730440220230419b45be6d8134c4915ced16133c6a0ce98f80c2937ae33edf00bb406d91602203c5677487c5a172361088b8d3349efa258a99a7ff56fad6aec202d43a1eaa4ba0169522102d4b082b0930c4b05da00594e3fb59e4c5ce0b9d4794943aab7bb146780eb367f21033ed8a84b822bf36cd968a9e83869b0db836a1960cebe34bc64ddd6f73bec76362103698bc14a6041d88cecf392e60b9d4991f5bf04bb71c4fe479c1d2b2aab8c18f553ae48a00a00010000000001013bd643ffc17422c58c88e49631f420ca5b06acd85d3c61dfd35b128fb19a7db10100000000ffffffff0210270000000000001976a914712768d60385d30faba697b49929570401d3efde88ac44cc3703000000002200208c0067875482d855a32b63488e3d1b9d5082287c8cd2bea55bbe3ff0282326bd0400483045022100ae52afefbe7c0c61aaa5ce9964f3bfb8ee9f56ce666deed39e90d82b940974a50220716901492cb89b890cd485883c6c1e2355c1bc525ef6de46ff64f6fa06f887830147304402200596f1fbd6172920e0c068661de14ce644dd350c710d63a6471faa67d92be7cf0220089fc1e23d5590cc97934cffd5c475e44bf14c1aadd1fcd76e4044f828c7578d01695221039cf7de805f2cac8a38950de532fc6ad806ea2470cbf009d0b625fdc84f0dd5be2103257d924716124092fa1533959417ebe5efc3f94ce361ad3db273c08de845d35821027ac09a0ade34f1df2013dc95f7141c7b15cbc7a097182c025ac9828d7bbd9bee53ae48a00a00010000000001019a9dff65882bcbef0f241d17d0e0d1ba0cbbfab9fc47ab698d60c03c12afee2e0100000000ffffffff02f26f0000000000001976a91463b9f125cdd3e242ca7c883781cd124cb48b814788acd8a7d00500000000220020eb690a8a023a498a1341f62473d78b6c81583b90f74b0345fd626dfb8d9d8e0c0400483045022100a70bdb1b523e07cd089749a08eee2906518e8232ef5ad7ec44582c8aedee9d5d02205ff3c339634286a917d9b76ce337a95fc40ce17e3084025348141ba535b5464c0147304402207c79c2a103d5f8634b64d093764f3a3dc92990f33deec80abf801035f73ca9ef02205d4fafd288688d017f3adc8d8cd02890725f4ff56caafe06cce051c3ac8e0a5901695221033ee0f5dd2098dc679eeef865ee0dc11cf0aa832ecd656a121317256855faa3da2103d948f301f9f777c546bd6073c6c635beff13c93c1d9925eb545c1b8cc47e89682103dffe697d5ef44bfa74382348b68009dc790c3840d2c52a7fa8b9da1ac8e73e2153ae48a00a0001000000000101a41c24be43a9e8bd54e08e4064b3f6e7b228c246fcecb2b2e5ed0f93be62776c0100000000ffffffff02405dc600000000001976a914005e0d6698e314a155cd2fc35586f67578496ec188ac4c9eda020000000022002073e811d0fe651bfad24a21e5990aeddb24ba92ab0dcba09d01fb1e309ab051a6040047304402201b1514cbdd96c3dced048cbd8845cafe0eadf720d219ea6882f72d177462da4a022016b74417986f3bd71bc8d9994a94b0b57137298f9ef5c9f1047903df3847b8430147304402204ec82da68472c3f7d1f99762683bc8b701613fbb9929b6db879a4025026b26460220319257c60b49479c32165e0959119037002d45814ae5b2a297cf7fae05eb55cf01695221038f4e0a2d6e08a52ffa9479692cf34c2a85e0644d3cd70a8eb12d2ab4b34a37b72102ba0cf1dbda5be6a95ed7dc276fbba976fdce0a50f2eb84f52f0263721bd7cc8c21028f3b3bafc04f164b7a85c5aee9e4e9da20d3666b4c60bff058f1698564882cc253ae48a00a00010000000001018e422f716fe4220c111fa806d783efd3682dcecc7fed6668c8b1b24ac782dc2a0400000000ffffffff02c1400000000000001976a91436ec598c1641da6c8e40d3215744c9f7fe34d8cb88acd5bddc02000000002200209a153ada40d1eb3b88edf789d0a870e69f816313d2d661583e39b9856aee375c040047304402206103560a242b6ac4256b8e26b922696883b2c05010ecb3ac4ef27073d48c3e9702205a535e4d4b75b98e04af70ce7fe8f95db5702c66af4ea033b782157423c64b310147304402202d63f3d9dc1eab9539c3c4a9fca8cae1cd04a014953a88e95203fb3a70e6c908022008a340960dc881f63af13af95bba4df4d25eac54b106b8b0d070a28b16c919850169522103f68cddd2c11d931c36f728d092051919897cc6270f739e699974c5a6014d28b0210372778725bf3d025076a9201aef48e7073dc7a73badb6b94e6876473dcd05186f21033248ac805caa99a58a8bed491f96cda8dd53d1b9c6b851f1426d2aaa908e38c753ae47a00a00010000000001011bc2bd91002ab689a0c7a27b262bcd94bd16a84af24b5a77c13f72c6b4bffd740100000023220020585751bdbd61bb3d8a17a7cea99d1ac1fc80704e7e0f6718ea758d945504a6cbffffffff02f3c404000000000016001448e83877653ab448dce7e22a59e65a8ad57d5746cf5f07020000000017a9149f2eb8186bc1123cb602c22393f70d6c595476af87040047304402206ec59efb0c825aea7dfdd934b8c34ab2cf8edf107bf15a8b0556dcf576b1c14d02207278a9fc6aef82623085ae7cb464baa92f3379e1ba09386dd32b607f72cbb99201473044022072a1edf0836981965580a31aab9c5a3c010e3ada5849f887dc1ab3bc5fce4cbb022076ef93976b33cac692b01e4bf2e554d728fcc880ae488363f5fa8d0e5f62b90b0169522103838952a8ab1bdfb9739b2b7963f646ea39daeeab0ae49ff8abcc808694d3b54a2102a3729ca832009be4f13427a2441969bad7a1000f5c8c0a23fe4be2cd73673d6c210312b63195d2a5df3aef65ca7dc6e371f57dc5cd00c602f63fec15233b8c17b49253ae47a00a000100000000010145d606803a1a7a5cd145e619686353658635043e335824e75085722333b21be70200000023220020a10b0cf1391b059102b6f398f7c33f122f1f8bc45d717820195daabb2b9e3729ffffffff02cf51100000000000160014570666be8269dbbf51e9c4ed14d842e4b1a8ccc4bb6ca5010000000017a914007c662d7f1b2303a831b6e8fa6cf4dc9698c686870400483045022100e45cca3e803fd63508d3d1b603bec5d72caa87e94c85be6a9264f586ebe7872202201eeb19f543b2b261f9202b5cd45df6eaeeade6439b0bd736d2d2a25727fb296e0147304402205866aaf7b83cbf719480b005dcbf6f0b24150ba3e8bd250186842874a7d5fbfa0220190d8ede79fed44769d993eea5f78c9c999a5e06b35e88dae2e131da99058aee0169522102c490797cc081df4597b646d448508e2f971416742492e4ea2de2470ffacd5fc4210378ade2f907cfc2770eae0fb35f7247a335967678e19767a0039c2abf778f0b5321028e81a9783c19a5ea3c2334c714fb8b1b77ed8ee777f0dec38241a43c0c0436d053ae49a00a000100000000010143b41c23016ae735875f6209f837ba86b9d03c48cf2f192e29fb73cd14a3d0f601000000232200203df8d7035b1f108f9fb2c976494ad369cef33468fc3b60b0365170e895c11788ffffffff0266b527000000000017a914025362acdb1ce183bf8a7b6baf86e6f5d4bc7214874c21290000000000160014ee1663210acd78b5a270a4f646c66b0408d12e8904004730440220406fe8429d90134e09f6c93935276be989550bbf396f680b0fe83a8adcffbf470220294fecbe0d9a921f8a3e788d770ebe35af1fc518b517c0feb35498ffcbe6846f0147304402203f900d3070983aabb746652d4782397f6caca12fe6765cb9c900afa0c9c7923202203fbe25936487e6f319f2d94dadf8632936bc7ef0943742a1c06e7f175b120bcc0169522102c745fbd23eb3a53ac02925386a4d54b74720f434692f821da7f941fee40114dc2103fa8b99fed85281a3c7376d9082e2d08a07d90a669f3fda5d5f63ca98ec963305210207e3be6cbf4328120ad8f1ea5b34f7c0bfd777e49774f56eec355f11b7cf9c5853ae48a00a000100000000010104f6b3667951d803178a2f91e6b37ffdfad7a7dfb83faf8ff34b435d4262142d010000002322002091135dd6f70e9e7668c5b119ad0e8d30c8d7f1b1964490d92df9b5709d5ab4dbffffffff02ef5c030000000000160014b6f25a7a415bab29639db862325ae6ef7e4114e32f1915000000000017a9147697e3334f9dbfdd8dc3a22038201396fe85f29787040047304402202239d054f24b622cea3e570dfa86bb361a01d4dd3d5516e662ec9c9f93ac1ce102200dfa6cd58b896d92711f930dc0b0fa5bb363b20e9cfd2e4a2a898625eab7421b0147304402204077e7ea5d6f4b69dea91744a95cffd12097b137fe5da2b87f2f1a754232b6c6022075c041b51a55f1a33adba622ac6ca60d12d0af69f8a37c2a5717af859860d4c3016952210333f17976f1b00163ce73b02df063e009f30d5724ef550f1ce03411a32634322e210270220ba8f5b4d8853cb76d82abb6159292973ee02b85b6bbe03ecbeb255352c22103c7539055f22cb79fced28ef4464a0f0c9867004520b90eab5f7cd02fb42bb71053ae49a00a00010000000001016f7eadc48d859cec10f43491888e2f61cda01488d078308c206be7c2bb1a64830100000023220020aa85cff8e11d8f405f6b812dcbd182d696b8a417aee90e3a94983ba71a56c65affffffff02c9503a000000000016001460c81f59fb5803fa71839fccb8386bf85bbd16c7917fa7060000000017a9147a48399d9afea2ec851fb0500e5278ed7f91f83f870400483045022100d39abe95134629ec924b3580bac4ac3956e5584919f57b7e6200105a52688d0e022066ea025171df852ce177c1350642fe8e9e620c86248186a2d8a14cc0cda2116801473044022020a4dc943524a6770bf9a577d750542dbe6ad79bc198d3b6b68b687c8356ed580220077b8fb5da29b8c918179e036923cc9ad36c20b7e298337547da26f1c8617aba016952210394469f282f6f7d0c0aade302ffea6473a68fe41f8d89e6c5e857939c81a743f1210302434b6cbab010414647040fb4cecc38c0e2c1686f4f0f450aa5d75a50a571c321028657999a7e1265976c08e37accb091e461c7f4c67dddf60bfb0f6042d479cdbd53ae000000000100000000010134b3b910bc86d030a161477f159f3ef971bd3cde85fa94a1c67121ab7d77e759010000002322002002cd04425107d0218dce60ae9d92f7eeed084111101886a2beb1210d6c1dc4d8ffffffff02a1c2440000000000160014d32c88fafb00553345c32217070d05b061f8dc30707eb1000000000017a9142eea16a80be719455cb33e0b6394ae7f38b1f8d3870400473044022039c8a229527818fbb880affca63a559e3c17ca935316da5e73be47e14983338c02200b0061551ce9a457a474973fce54f18cebc69b57e82e1c042c774e25c700f57401473044022008cfb011de6e0ae834fa43ee215c1934e6f64e7fb09de648d67a4bfa7c5ff457022054a26dbd0e2dbef2641dca5947118da97740dad5cfeb03b8d5c45179db6cd2a90169522102ccb770fea4fb83fdbcb696110c680bd709cf2720f3911e1f88539e2400f39e16210371afa4612dff592f46085183ae25766541c086a375ccd8f08a7848e1208b1bc2210331faa2b509bad3da2a3b9fc2fc6c9828117418454313c5e2bfa8001b49b4779d53ae49a00a00010000000001019c71edb2470c09ced7057f2acb2be7441b71b01a28c12b6d309257c1950bd1a30100000023220020ed70c1c71c33583167cfb989624e829aa91e9d5c8255a8586a26b2d1d36c7a4fffffffff02dacac30000000000160014a34c1dcc9d0de7a12756cf80c1c0faf648fcb2717db29c030000000017a914356e022dd0af9903eab52f25694e08af6d227776870400483045022100e17cdc13dc250121ef8e0ec6ff8814d87971dd23a747b4af478e657479684ab3022004306f8cca364617ec9b89cc4fd30f0535f395b5277b1c0db587d2187ff93b8d0147304402206160e8e920780276be22779b4ce37743eb59b833e3afa05779b8365f9967384502206ae020e7998f2cefa3da1f8b297b0b7c68f01bbec600a5b65d5189f1035370c101695221021317dcab32854a80af3842e7b2649ef11e5c68c8ba930c7aba1894b4da5460af2102f109dee83f5be8b5228cc0a46abe16f4d4732a83abf0ada8aa191ee0eef6ae4e21020bdb5eb3cf46f5405c3f795a089cc7da7889ebdfcc08d61c0c4c3b8421de05b353ae47a00a0001000000000101bdf3bab1482073e970ce342bcf186725242a531cba721543c5d5b644544d77af010000002322002019d8da5d1fc8dffb53371a89c737299b933528df38aaeb773f091ac1a013c3ecffffffff0268bf000000000000160014876819e0bf13c8253824c863caed150d6724e9b37fc104050000000017a914d2b6ea5b4056c628ecd5c8a95f4af77ceeacd45887040047304402204f465a8562546d46191c8d8b264d9d05a2624f40e52749ae61272b5712fa456102202be044fe1b2342fa1e9e7e20d4f72ef44eb8c894fc978311c3b4166f44a73db801473044022035d39569fd8da24113bc92c87c046122b7fb3b6e6efdbd645e1f9053903014bb022009a9e5a360444d93b0393f9c354322fc3aa986e5071b70999b6c98ae3bc288ee01695221039cf30686d785a9a516f743abd25a5bb31676a50cb43ec9d89312682a47e2f707210397142c56c769930636e530e7f0e76526f701dd184e36edd8278cd6a9ecbaf58d210343368ebb3109cd2864211d7e23bae22c500e0c6965765c419eaf031e333dfa3853ae47a00a000100000000010149c822fdaf77538e8c36362d48ae22190efee159c464068d2858543f54897ad10100000023220020c0c3e70e577662a3655ac3a91ef8830f181e4537470eabc6600594c947e76cc5ffffffff029a3a020000000000160014cfb2100d4d8451234bc4aef4a74a0d48f063434c2936d8000000000017a9141bd8c08ff43342242d8e2c3c2baebabd16c871f18704004730440220095aeb69085a6ecdfce9d362fecdfc8d3cd4feff5b1c6ba8c8119b5a9730f68d02205b120c20a74d1a41b26975bed033c4d834bcc47e5dd645b68b8e5ec9defc0dd201473044022053a4d70f02602b903bab00659348ab141911a5aaa8f86a1befba58443dc6075802201d1373884234c1181ff766f0e81bd688225c639f206f8a4cb765ea2e03eda3620169522103e4af937cf0fde2077070e403b1a7cc4d763f1dd5822447f1c013ce068b7d7c0c21022881d368b5ca3e33b5abf8f6eafe20aa89b2e1b351c484ca2bc4a8a9455a4b0d2103920530b58e33fbf20334b63b3dac3bb4670ae228335c07a866b45b6cc0a96a7453ae47a00a00010000000001015c2f5319fceb8752357476d348575bd253c571838b68ed76d00f0ebc5357ae5701000000232200205d72df6d4dec572bd171086b720fcc9bc3dc83d99e386261bcb2bfb6b90e25e7ffffffff02d2dc000000000000160014cfb2100d4d8451234bc4aef4a74a0d48f063434cd96601010000000017a914fe11ebf666ac74392252f12510a80c7371d208f3870400483045022100a97ee2fcb80d9e9c39a1a0d02eb0778f8adff85811870dabd809b38e65c57115022017272d6a9fff475fb74b4899173b60841651b2aab2316c009cdf40cd1a17b34a01473044022038b41a9320c10f112a9a7241cd7608a648bbb039479dde5eb3ac69dda043b12c022026ff45d7cc26d0e4e91eaa6e7427aea49ff3a18178bd6b67f9fd1a5c81e9fb3f0169522103db628459e042df949c9c510dda7616738110eee0b08fe6b8700c7111a3ad6ef92103361c208d971229f82db7fa71eec532da2b466bcc9f929bd5da995ae42799dc73210305f67d0b3d55c7f9b02e86673ee69e7005a73226491605e4cb18fe86bd2934c653ae47a00a0001000000000101dcc4177dafd6c0487b1c7d537bc3aa3b568945fd8c3193ee64aa1440b662b3760100000023220020fb0f83eebf0aed14254f1b8d4b722fbeb4e68dafc8e09786123103c6fb6bde6bffffffff0282b11400000000001600140c77fad2c100a582a4e5555053bfc79b7fea095f8d83b7000000000017a914a8380a34ecfc9230adb3e3fd5b679115a520675e8704004730440220157e10f66de6aa87c22344c69b263a8cbb0d84c30c17381b15c3e274806770f80220637719b0b158b12c401e289a92debaf08a4747ac846091db5704d7346346f43101473044022064a4d74a35f56fc34cda48d406d13aefc7e27575ef759ed632cfd30b7dc899520220432bcd8904e898bfe2cfc65b8ac62a597b5633831ae042dcf75b18803de10f81016952210331a13aaead8cece473fafe067a9fdfb0fd1ceb2fe605d74de8ee7c3dafcda76a21021127d48a24a32627e0cc28419a4c838e4f7bb382645e95de1b75bd95f60f8e7d2103498f3ea1840988592fd8ec1582950887a1ddd713d5409fb4e19aa6bf936dd8ed53ae47a00a0001000000000101e3f6a7daf5193387639bbf8491b106d5c410fe52d2defae848dde7997fee3a3302000000232200208b0da041c71b8551ad5e002f2eafb94c3b6e8e023abd921a8025a5ff9433eebdffffffff027f2e71010000000017a914b517ac60bae7ac718db5de68af4aae30c621ba01877bfcbb0100000000160014b4558d1b8b030b7d051feafa8a065cf02f83e29c04004830450221008902795495673ee264774b7a8ec0214e8e077a0f2870b67764618116c1c0eae702205be99ac88f0b8c5489c16650849e45f48168f47f04e6f251162285c5e596351901473044022006fb3c0cbc4f91f3149e63195d8b2a2cc306e9da492a0bb3f30c079d00a9168a0220591db3c51b7556467eb38d45eb846c09a034942514c8c5fe043d8b77539fb94a01695221034513c98f58f8f30f76e785a93106b447f6e73600da2054e4cf464ea6b3c46f0f2102d24099521e84e2f3f77e2b8cee8ddf1040298e979ce3b189aeba10f35d0b1c572103aee387e0c39f90c36a7da5fa0d7283bc67ea59790fbd89eb50fe71ebc40b32f053ae49a00a0001000000000101670a1415a6ac1e4bf03ad21fa94e48da7dffafae04c40fcbacc15768bfca9d8801000000232200204c477291dbd881fc6cd0afb0a3656756025acc405d4f73135d39cac2dcfa7322ffffffff02a0e7030000000000160014571ac7040cbba9feaf06fcf148d784ab1051e977b2cfc6000000000017a9149d942c6e901b2728362b111a83a0df118c25990d8704004830450221008a015890376cc5fef0403807aebb94a4fee460930efaa166c595e076b518372b02206bbbe6bd990b158f93463406913d0514336173b27c9b6b009524e9c3c818a30e0147304402200c28d0a112aaf7713ca3d73067fd36b20db1ad7140b350379370358efdc5169602207bb1c85e51e202cc60ced0072415c7f1f31b12aee59b131f33835447692e954c0169522103f0e60f868874e9e1ebb0aa1426aa58d53a69d648e0e07eb1737d8f4cbee0c9362103d27d1919ca1b93256da14067fa95d1f2a2c245aa6badeed19a37eed8e87509502102cb9ff2ad762eaa52ad3040c8c7e9f8f48b7cc6c2efb4d306e1bd0308d19b53a353ae47a00a0001000000000101e7762a6e52290e1c8ae888802485874c8e42e45af38525bb38c1109d9369ba7b0100000023220020943a6f26a8475e2ced8d0cef5039f926c6529c4b7fc6d6c9297877b5b0c167ecffffffff02751c17000000000017a914ef6bcbf52f70bf9c84c1613eefd5a863c635b11e8798e34c0000000000160014ce76520da2c2b44ead6484da5aa4bafc695fb9a7040047304402202021d99727d7371c4d218e7de44977230b373401be052f6abb03a2de1036b6d002200d11be6c9fa33b25cf32b603be33a91a849a7d12a3a24830fd2b4ce7a34f92a30147304402205552b71033d2007d5ee917a46d1c65a9f071edb9e83e329c392ff204d522df3502207311afb4e3bff1f7bf1772919cc04794b74286f5bb867a2e13a4920c60726f2901695221027a67b01b7c06bc937127ec2685c7ad3498022447cf927c8f23927d5fd8a52ccc21035cbe1e01c871dd90beaa8f3edda0434a78e538096417dcb8dddc9ef04a5fdfc12102661a50b9f46e1eec9b91758c72ecd59177a68ad746474998722968b6a288bb9b53ae47a00a0001000000000101e5178826c9f0c0b4f197754564bc280449a74aa0a08af2bed42ce5e640075ad90100000023220020e062644de3a5efce26a617e03daf6733908f67ab2381614fc42af63164419b00ffffffff02d798030000000000160014e71ac7201e07dc6d353fb4690d954bf7b227ece2d22800050000000017a9143fe7dc0c5554a4c9cd9ed5fb8e82c9991ac1e82b8704004730440220318b6752f5272f1ca25795af8e552e3ceef86dde5a9e160811d8b29137fc86ca02204c79587c40dd0bf8805fe80b42beeac4c4daae282c5bdb5dcc2fc7be3d3de4850147304402200d55bf912862c34cbc58a17c8699ada2e7b0269b1e2e5ddf33be0454669d879e022071db8593ae668f73f77b5dbc5ec2f9a44019feb619107c4ca93722753e53f71d01695221021feb11c47e4ff357f5b69f1dbab3b26613d6f15e5eadbba06318f0ebc6caf9e92103c0b51b3598d0b081795309021902fd90fdbf502c52319c70a40581dafe2f673621029cf48cc2860329180d0e5c178b1f212b4888906a1b6e4e84824c863eb6846af353ae47a00a0001000000000101fe00b5b72c0b3881adc059c16dde8a6b50241912fafe330ca83bc9aa896af9610100000023220020e2a73f84c7603fbe4ce079e2dabd79143a54b9a174e2b47d9c0464b02d0059b9ffffffff02b1320000000000001600145cdfac9cde12ffc2c1dbae38f2d14ade8350a683ca1f24000000000017a9140ee24f0b42a7819c7dfcce3a0337dd31cb24676387040047304402203ffe343a220142ad7aa5ed511b259f522125737ed8ebfa3b63a04f26a1dbef5c02201f8fe4e03bd0efd15106f2297eb78431c35319d0864080b6a8bd2beac5bca5270147304402207a195a10d105c48246744b97c2aa4245be44925d760cf4ed7c694d82549afd820220156a6593c312083cb2cbb15af45583f9c92312af5e78f8232502f36f90431cd8016952210308f2f00b7219b837a3fcd20847287e15554dc78d2329b70668a935b7fe6e6ef92102dce8a187771cf04fa504b821a5c26d32587e531e72133d3ee4215ba8aa52cecf2102359b6dfd0d5f4aff30ce5d75e7efb16a46ab2ea29b75a7e2062a1eda493e89fc53ae49a00a00010000000001016b3390c6f995d7a46cf8c5480d37042d41306bef365b6faf723fd0d14f50274a010000002322002041315eabec907db73ca0aa6e02b30120cdd2e70e8137d785caed23a9621fc0d7ffffffff02cfae1b0000000000160014cb82b7e0e877e8d7f6fe6c15240f0ec724accf823cf400030000000017a9143f032f4014002fc8384753c5748c875473fb7f8d870400483045022100a853cef95f763858cda5430c672bd5a8c1207515acea4c5153b5e49661d294f102203f4fdaf5fae9071bc777d2da875ce30f5d3d4a9e5a4dd2f4bd6b5ca49c209cdd0147304402206a696b1441e66bbc956785a8e6b7fd32d3ac1690b0c8fc490f6243d48f25ad5c022052081bd7e6e38689c9c20913d66b9a4dcb2b1086d82d26a2bac9f55ff4f430e80169522103ec71c9a339f228cdef1fdfa89ca7edd4364a858b13593b2c2498afb842e455672102720062d8efb520d55a1e5517e4a8b20eb5843d2d5df82daa31a24d92c58f322521038b8dc4e8be006fbcf2a7dedc6bb5022f69d0496b98ae6adb8a220ce992c256f153ae47a00a0001000000000101fe52ae9be2158c922bb9f969488ebde62f809c36a7bd75725d7d41f6705ecfc3080000002322002090d2ca0a9cd12afe9f109e0352f86e5b1775bd84311dbe72b656203bee559e3affffffff0222af0b0000000000160014bc968a86458b9cfdc2c49e6605e5d0f18559055cc8b221000000000017a91423bfb9816996321a4ffb464343fa64d6b40399e987040048304502210090759e7ae5182ed0cccfbfba344aed96c1316c0d3697da24e747e20333943eba02202663c2c5276027bbf23f22326369092cfaefd7eff136dfce5b0f8e7a95209f870147304402205f6b9de57719a55c10b51b45f610b88214a155c63650e5039689bdb7c521dd7e0220043f85a4ef6e8f5c216a5c46fcf54e336966fea877fc2aae4b46ec8709cd2a4c01695221032e4059117f3c1ce24fafa4411118858c1d6d21828c707d598011c8770cd8de87210354ca93b9a0b53370a3840d9f1a8f98ddd981948de446bb363f1e31abe1fb81ad21036fcbd84a08348900ee6583e7c8f0e4a03c83a1f3628689ba962036376d31806553ae47a00a00010000000001017c4685a505c2464526d9f80afec08f46083e135edddcdbbb2a32f6c29154f7af01000000232200206abc3b1d2e2b87b897cd69b3808fa1b0cff5d990851b26eb6d7ee5b97e4961b8ffffffff02f25411000000000016001418829e3a7ccf19ee6fa27095564b3097dd9630b84af75c020000000017a914b6a1daee108a001375f33f7fc1c4f2c6c41246098704004730440220438b550a4cc8c5c95fd29247517e3349e7aa7a83c54a48361d424cc452064cb5022024f747c25609056410786df90ae35dae9642cdf0c48d2eb29eea33836ccca6f001473044022054468f94d28f0fba160a8549256e64b49027241fb0e5fbf633886adf04df24b30220123c27f8cc34c7e235a30fdb7984d6571678201d60f0616f054e0977ffbadfbf016952210211e8c9db27ab895ed4378e38dc03e0a63c43dbc5d52e5884bb3ed0926f05ef0c21030c06e347b0b7f0449f4189b11bee7392b99cce860ece151b1b470488afec509c21033b4d027f6e2979b945ef88bfe7c911ca0b499dd80a5409b07356060ae17a06cc53ae48a00a00010000000001016cdbc9e095a4bea5d03b6eeabb9831c13e7904a2cfd77d47d7cd54e9eec6273d0100000000ffffffff0285a2020000000000160014faefa9800be38a1ebcf79bac9b83089df955bcaa3fddb4050000000022002012d29f5611f0066a062d0cf92742fea364ec01887fd8959a8da6a3d7f4035e2c040047304402205f20d0d7924519ef4495ebb7bdbe9fcf05443a0e1c8b2d74dfb4a7937aa6b0c002205a05b431aa89cf638d233e662f02f5b67cf78932262746a239b6e9a9db255ebc0147304402205d5c4c365e647bdb515720b084e83febb47daa980ceecd28a55af162b2171f2102200ae7571fd0b036ed8dedb0744e5474d0651505a7d81179988a5656a39b1cf862016952210270ae4c05ae19013ae8dda2c97a9dbd34941d247e24c14364241bb15e0e2718d7210289fba3123cb41b3897dec188bceff0e4b3b5031270fe095477ee92963ec5c25d2103bc306e9216ff778421205908dffd715fa6f4abe6423135d92627f8d59912383653ae48a00a0001000000000101e36215b0a841d896674a36ba714296b6f34d1b26e2145d80b7f59a298996e4260100000000ffffffff02f18c1e0000000000220020e4685987fd60188ff794700d95772cd09c9ba98de6f7484404968ba75258e3b7127c2700000000001600143da2b211f09d99e5790ab23f96b8ad1f7354bceb0400473044022013de20f1a64534cb7d2d1cc33f57c8ad60d97f3ca1289c012e7d55d351e774f002202cfd46b579659c685715dd1053960171ccec40b238988f99e29276e3d6959e87014730440220758e9144cad9baedb770f455580e77efae5774f971ac29026d325698420a9bc602202f7893389d37776616b5cce0a80d2eb63bddeb94df996e1dbc22b8f5c09882640169522102195309bd21f3264a30af8fddc0ef1d46bd6ce5c8c5e53504713ce1d8621e392a21025211cf211d6b0eade66c324952c3604ca96d75d7a22c98ba6f999deba0f4fe542103bc83a953c958fc5fc1715e71b61e4b84df9509651caa88e91931e58bf62fe7ff53ae47a00a0001000000000101b203c47d739bdb6d68876299b45d809fa2150f34ab7300155092b7fd1ecf9d970200000000ffffffff0240771b0000000000160014e7b5e60fd25e42bc7d1b52cefdb76c1d41ca7f30640b270000000000220020173ca806323f5024712c3efb60b17cb100a599fcf90a33cd802dbb7215f8d1df0400483045022100cd43f62b0ea772bf1d2dffca60595b304310e79f09a4b32ad458ae615701d8f602205de75ac41c6f050594dc63f90cec296746b733bd84b35edd8a146a1c47dfcbe30147304402205066223ff519d1d6639b9b471177dd3d6bc6fa2e4fa8ba8a56609d06c0ad55fc0220690bcb3ca2ad00fa10b23bea09674aaf549ac94fd95d8e771f592a7edf92b8fb01695221020142058a44bb3b5dfd3724f66f92230cfb2f1e2e5355410d57295c61d80c04b32103dee85765d8fb48cc4bf8b1e252f19d44673a5625b4df8570c71c40820b55a5d821039fae9c6d0b3bfe94f38df515db596aeee9b5402e98470a3749b12ffbf1c358e453ae47a00a00010000000001015edb2e91dbfe8bf3c2e6b83007f492e7adf715f1196f5b22e4e098fd3e767f750100000000ffffffff0260f60400000000001600142ea3d3ec62547ad94d5ab89f2eae9f0445e5de41f3a3e50400000000220020b3e51be23aec83b29154a64126ce5435d25ce98ad256ec458e6df7f181576cda0400483045022100f23ce010a26b1cf19d039bdc8af1489efbc9b9ec01ce0563ad4f9b05de2d3f7f02206570dda3dba1772b117278985462b36077307e71ce2fae244a6c721ab1a9c4e30147304402202be3e163ad9474aa3034ff3c721ac3435a571c271a3a725244faebfbe8af0a95022032ef859c07198f746d1fb393245a4fb8effb475e346c6ea7855e14f287e3f72501695221033b925986167b22276e8ed712c4816388e1c5927bfaee39d89c85a8ac534b4971210368db13bbe615a689f99b862e43a1b0d16b677ab1e8e1b81fbdd4d035e255bd6a210355728814c542f383596e71f9b0a30aa44f73a3586b0c10d9d18077abceeec50d53ae47a00a00010000000001016bfb52fcf0ab00972921f7fcc51192dac26ade2ad711b092b504ba4dac41eae30000000000ffffffff026b1e050000000000220020b7e49a8eeab62209a59649576a0ed3031370df995ef02f41f281f5d284608e3962401f0000000000160014f2ec753e60ca46940b46ca373d65b261a3d3e1c40400483045022100fbb6b84e93a5e5868033da4c238a0c9fe3089a7bceb692b3066a95c40283cbf1022002bfa457578ab38d5b38a05aaf29678cdb6531a990e79f78c94a06e991954451014730440220478cc31d1b795490702bcd9068917d1a875f25040d4293861db6d1896b93bd9f02207269a7b7f6ea8174fbfc1f3bfe3da43c9f2cf8413b8135687f436094328664bb0169522103845a206ff161ae417101b8d503ee88725b10a78c2af609da27a7ab4d55e39c682102f384261868aaa2a5f304d427c2d979605249c89b94813db09633b9aebba94e5b21036f8d51c303d07e7542b582083201d897f3f081abe855cf2c0be26c5dd5c213e953ae47a00a0001000000000101a9844ac5bf6cfc9e9f17d7c7b93785875e22586f2201cce2931f3ecd9c1290320100000000ffffffff02525a010000000000160014b4e79a70f9e505a59ee0593c369bbf1f8af8de6e11c7100800000000220020dcb84f87b5593debc3bc8824e248341d5e69be562c9dfb54b2fbac8a9e443c5704004830450221009514e1e5ee18f0584899519118a156261bcb3b13550c03d0158f7ef15c427e740220344554cd58df08061dd4cf3045d5cf461d0aa85856205ed76fcbecf28c075471014730440220657c4736d208e8b43291cd00cfd72616e948e5798f0cfc4d8caa3ca2afe30a5502202fa78f85680bf255313abe61e959975c616e3d6a694c96b9adef138a3bd41cc70169522102eaaa004aae31c1d5b93f3f2d54ab071c5df32d85662f5becf1b2e9085681c72f2103add2b1973e255265865ef3ed6e83e2ac5e186a41db21321643481602427f5db8210239069b4702f0a46c4c15c5602333a82e25e232580d688fb4f6c25220aee556d853ae47a00a0001000000000101d6cf419ffd63fa250d17a827c25bb5ece9783053aa28d18ab430ba76ef780b390000000000ffffffff020e6727000000000016001422ea0358003eca60cf343a4891601fc6518eb7c7a529540000000000220020270eb717d930c80f0bdec589ff40cce79206ea51d6e6881fed884df63f773af30400473044022005cd0b312d4a803ccd5c654567becb4d205ca4d1de1d5e75bcedf7c3bced618502204aa7b6f28c33355d29c7e5ea0d883e2fd8144b8bb942824743935d45f74df7c10147304402204bda4ff56dc9faf2cb10c2c42406fa4b6a84594319879cd64b10d415feb51515022076103da4db5c93e775ddea59052e6d60cfbc3b424a6d49abcff1f194598c459401695221023bcdc15b1df98d8f05a3d4617eed5860ff67e2177a8d35296fc3274ba7a1b93e21029dc90ebd17edaea652433183402e89ec37b69f61848d1ab115d07b034f2a2dee21020d08e71b8f7e9efcd7ade13331cd0b7682742c3bd7d1659721b115a00884223b53ae47a00a0001000000000101e13de79c06590631337ae50978c3f91bc351314079d59f996dd80b50cd89875b0100000000ffffffff022fb4130000000000160014d0a0f438d3765e3a6f32861268f45c517d73433815d5350000000000220020ad6af22c703862448260df285bf527b5cd89e15aa96d820216f8155f5fb9c37e0400473044022072fb112c6960748a99a624e61e3ac0364c2f4d59a9e43b9debd07a55beae0a78022028852325a1a8cb48147fc03f59c808de35a7a7b2c5ca7b5dc998b9813b733aa5014730440220624f5560918912dd8b29f41cdda2c5801dc66cd27cd6c1ac7d91e459157b38a702204b26b50f72fddc790f3931119456e50542d91cc4a9ab76d639000bd7e68a1c7e01695221022fe6342235eb24a147ad6ac991d74e5e84683db746c148cd55c54d2bd214b513210388e283d6660055019ce782510d36b1269df7a05a4dd52513e6f45483646e4f162102c802d24f83e058857ba959f2ffccf9cbe360eed59b67bddaf2c795efd725e6fb53ae48a00a000100000000010113e86291f5aa0cc9a8af48e105a8dd768242367765a9251cd65def7ac5550fbb27000000232200203ea7049a7554dbdacd69c7fbd069af2d5c77d03cd100f2a39ab1784d8b39e2fbffffffff02d15e02000000000017a91483a45d36c22646e98a44e2e3d5e2090900e6427e87cfab33000000000017a914a6c2e55b2bf0f6c5de165ea969269d48e069947187040047304402204ca7eea5b190b9bdd62d7fca281f017a98c3c85b295320d994536dd0e47ed5ce02205afb59aaf0db87e48419c0cc67f54aaef076407290deccdab49989d71411cbb9014730440220737dc1db6e13472f1a23769ba4c67c8fed2c8477ccaa1d82acdd435201174335022065e6ea094a0b02113e59cc3ea717d5f91f352ab676a2c77994488d19e59fdd960169522102f4d399a5d368b1c3a64f19ebf1f5ce6c60d2bf5f75eb317f8d99039f60bee63d2102ab633f219e1442f21e4b45f9c6b9b91f44e86d9f8b1a8de8a53b6be55c27c6ba2102302f9057481b871e232e7450b4a97d0aa3749a511ef40227b64b4848843bc34953ae48a00a00010000000001013aa6db4dfab4253790b14da8f199f25dbe15dab558710cca2cf9031104d887dd010000002322002005994e8a1a8665de9c7998dbe3ea26e51e7adb449617cf5527af536753b2084effffffff027c4805000000000017a914164d9cd85345eb3b842384d57f862ec1ec46cf3e87850d4b000000000017a9140a517e8123747a526b6b1d1e8f7fdf8f8825fa898704004730440220403a12da135f3bf61ec2e728260955dff22c8bf90f4782c8547d00258edeacdc022056106398a061c0db6e2f5de019abf12bd3dacb60bca131904ac98357bea7ffc8014730440220038acfd2bc25ead68f87834b0d74d23eeebd60c8496d3c0952a6fdf6548f8c5c02205de66ad56c6a6eb6f57b760a7b4245da0263c6d11a95bf3ff15b907fcf1fa95e0169522103d776d74e86e8e62f42210027579e11a5c4bd2b32d5c573fd933c991985c428362102c85f90f4d73e2e4476da353fb85f6596864c1da66893eb2eb8cf6567b5cc269d210292aca9f9e4f31b6dd2e109ded736238142e2f36c1888c951ae3a00235f2f730d53ae48a00a0001000000000101ba03fea0af9c58539d3cffb970aa83b66113f1457f3d2dd91b9a3f697c58406a0100000023220020cf3dfd7a5b107fcd47d1a3468efd0b490bd6f92a6298ab6c94dbc1cb25609771ffffffff02918409000000000017a91403004eec202bae45da67e2500709ddaf1224f66d87c7de13000000000017a914ce80fc555ccd6c471467bc4690025142e25fb10e87040047304402204f2bf72f2a69ea914737262bd7ec20b742b17994698716f3fb44e41ca920989a02203e31586687e0a00481aae1c92d01b201a9f154b221e324ec1b6a1ca2f17336480147304402200d7909d278a443ca73ddf2c4c976247ac4f410b19b2f502470332fde23ccd72f022002e350ff6c126255c472571b8b271538a557b07a4544bb8f47182a5c7e08555201695221034e7f5e1e319d4a6df7e1158562ec7c0e1f8a3a1c270b146aa0c7e619ca95a0e52103c8ab44f3369f4f2d4251cc9f3435c6c6a9516bf640ba3b9ee764d0ade22e1b7a2103a607fc5a4d6936ff73965b34f45c2db71109383451c35e64685b14999f74bdbe53ae49a00a00010000000001019c2f9c086b7e1f1c6d71ac28534f7a901e648d3d7af9812b3ea2c7dd6e40f68e0100000023220020eefc8992af7d7044c6dc49e6341b1a458a64189305018120600eaebd39da6f40ffffffff022ac617000000000017a914fcc83478d8aebd0ddd1360e5361a43a2ac1e78b08785a446010000000017a9144b85652d01dcfce9595d28a23d8683b60a2dafb8870400483045022100d62593b1c202d2f83eee4ea54ed7512ba6a4388e7cc8516391a5ea4a6205f17302205926ad74b201b63245b14052b9da517bf6c49180ffb7f566f3b90b1a9abaa808014730440220696f07a0e660e2c5d90e26dfac93d9c9485428b9ca6ec6c0f62c2c0343915d5f02201fa90faafb268f13f60d85bfed31b68f330fea9284db29b10f7995dd512a08370169522102fa00387b64763de210865de12aec2f88f38e9febb91d10e8a93a4bc9c05f80a6210348b51da6859ea478f3f5879da81ca6b48a761259c59102f51143bf144c51a13421024e986b862aadac885091e00040a2a5a637ce868dbce99b35c7b6ff2848b3daea53ae0000000001000000000101c6c326a5cec92334c7167139dc13a8100386024d75138d5afd42d9a6a7bfe2fd01000000232200206cd54f30355a8e53b207840247bd76bf1a1f09afa3bcde2b6f4c4c8ff96e51c2ffffffff02425a03000000000017a9140c34eefe6bde2c0574eeb03575615dd38869a8028720635f000000000017a9149f2f58b008b0b78412803392df2f2c64fae1db22870400483045022100dd8e1fd2004e141738fb67f8d19635f4e914075c1fa871abd6c06c9130dd08e202203539562c6b9570268788fe915a5b71aa2e951246d6a32aea69a8a5c15c829a9f0147304402200c57e56ec2b797ce8a5bb3950c68479600bf748cc0e1815df21800d41501f1db02205f88bb9b2a41f4d957a6c15466d937cbdb7572c5600a5fdc53f9fd9cb56562cf0169522103606f3d6ddf1c36a0a2e476bab1e2f6e593c91efd0e4514dc22854ace369381dd21021aeee27e91ffe84cd06e0bcf8cdd112d2b883fb0af6f8d902c7f02714e083abe210399920287453f4f5b25cb33ad79dae6f10e5b2f51c61542f8c110c74f704c2d9f53ae47a00a00010000000001013b2b7bf03d73955a0cd8d41642dbff541cd63f218f035f67776377f2b6cf58350100000023220020d08d61dd27f81829a76f28e7f8099fa839ac1ee8e2c9817e51f7e75558e96074ffffffff02803108000000000017a914f1f417cfc64c100852164f17f6b8fa1465d5195e87883157020000000017a91415d2018023cbf8f49bb1bfca8442a2f482ffaff2870400483045022100ed34a746455ec3bbb95dce1f5d3831681a182e515e4a2170adb9d29d94642631022019233553071b4e7bced89b79ca0cfcadf6d68cdace804331cbe21241d42dfc9c0147304402205b3e0a0c54f4461c1e8fe2142c5effcea2dda6153b87e64b5ce6cd6f9d415c2402207635fce4bb0e68e4528fb6a3647de57eae1938309b7f0bbb05f6fbb33c7d80790169522102b87e36f2a11575a737712e6e7d73b3c1b865a03fc257794e27ce1f385fe2b7a32102a2442947c679fdeb809bbd230de62562d7778603897cbcc353028a8ec3bca2de21030cdbd9fa97aa97dd5383d63a426fb4141d50372c456ba5fb46395868922a2d2553ae49a00a00010000000001018c42b819bbdac1ea1757cd741331008bc84152adeca56090265e0707fbee76d40100000023220020f220553684bc0b0b1c22dffa4ee9524a7dc1fb38eca612859a0c97ea756ebb6cffffffff024b1604000000000017a914bb5c2a4a8c5ba67fc3a989092580ccd7d979b009874eb974000000000017a914cc8451d67b8725ba7ea007708cf0f71d0a91a624870400473044022002de614b1bb385fd86eaae95ea91400f16794f6e64d3fcd5458a19cb7964c1e80220592c6867d0a1f769c623867c55e9a0148660b0608b1459e8fceb946e503bbf5b0147304402205c0685f4b0f6d7312ea4e43b96dc2abb7396d1c41c83a51eb7fc10ae1f538b4e02204c3e2e1015aa89bc5d6a74be0f6ebd68a8a7659d12fdddb2deabb476fae959610169522102761d243e6fc3ad0dfa153c7b512172305d691fa1905f98c972d691d79408ef2321037047bd0c24c04fc2f2fe0f163e3baa6e62a549a63e4e28ee64b83a71997dd985210350642b5527f72596179bee5b4707b3687d2c7b1cf508df92d41b98d9a7b1d52153ae48a00a00010000000001017ef10fcd0388ab76ffca32a1e7e7833b6ca393dbacdd334bfe5507ea68e03d710100000023220020fa3d0d581799edbcda0546a3002492c31c99059c8a65f90c6d6863d8ae4b09f4ffffffff0200863d000000000017a914b5a48a2c7247c727db448991a630bd38f75b52a6870cde90020000000017a9140f9f90b0631d42bdb34b3f041cd4d6d9a007cb89870400483045022100ec59c001904f5d8b3d2bc0f23aa70f1f218d69c69bac1df5a90f6a736b2dc16b02207db8275c5ed6ebcba993e5fdf1acb083c9fbf6b511d183ae107c9366b63cc22a01473044022029e95343da2a4c3895db4aa1db2531b4510f47b3869d0a3c37e4c478fea6018d02202a31e92dd9d02e043726e47e40c2ad08a3aa2e8967e7a135c343ea9b85896af20169522103793bbbfe6fba607fa8565b02efdc466e3dbc2d91fcdc64ee943d373b4459560a2102ef7d334fc9580d021843c77543515e00471761a96b306962299e173529ce165d2102d558eb03a50c3e2c545b49c063bfc47b07e23727bea7b49d329ed7132913bf1853ae48a00a00010000000001015f3b47e6a4b442541041a6148c9459328bf6406460c8646753ae8f405c2221810100000023220020f6f3559ca0d8fa8b52283c3ddc44ff565a45e67688f0c3dc9e03bab4847af690ffffffff0297d281000000000017a91459c4c3cc5599b51e3cf31c8ac47e13defa6f08a487747944020000000017a914370aaf340a0f923a9dd2096cb35f161b41a6dbf9870400483045022100a1f99faf203b434fcd54eb381ea37b947c08e4f3cb0f912a5efba590dc72dd36022034489378ade31af98b129a390d4d539dd224f4300609fc9eeda9d8ef30549be5014730440220744c38d8da9f1f8911ad96ef18842aca23dd0812535aff2600754fda4b5363f3022070f2167c1df7a0d30e28239d5c93b6903246a2fdb0e6918d9ac5f66a5a00c5f001695221030f653c48b790ff25196419eb929eaff9f78f0f1b6397e919ef1f4fdf465295dd21025dc15e2c2deaa4ffd182935157ea11cc26573725264c545e4238030654caee3f2102e4c04353094dcf57c7c6dfa549fefc1c075030532367d06a9e2aa4ad01b9ba6c53ae48a00a0001000000000101343e45678cd16f572959ea17e16f7ce117a5033096310914edb5d2257aed11770100000023220020ff5b8173cb6cb8ae5fbb2c972f37056c55b0bd62931063ae81b6a552c72fa6eaffffffff02f7d81b000000000017a9145f4d104bd0c3a5de130c53300e80ca674aaeaf1a87887ca3000000000017a914486d5c060ebbc4f113ed72e8a8bad3848cf65ec2870400483045022100cf68910dd71c3202f575de731500c58f4ec354f492a408c42fddb776108e726502200fd5c27075f690956b14d91524325f5cf5410324a91344569d9d92fa56e8a1af014730440220751d5a2269b723f2aeef3c4358de341c0bb7647961f3b5b471c369e7d459b57202207e328abae6b6e6499aebfe584b57462fb761e31bff9b2066caab11fd5a162c9c0169522102f389894327247d383d00d961d97e86f39d8087deff418b4818ec34db0841b52e2103f3e7a54597801d145b8d1a01a39b118dec1d054297d968d86349a8bb481ce40d2103ad8032fda5cace560c6b5c4669e456d8ea2ad912d543004c137960975e76a3b653ae48a00a0001000000000101661585b782751ca73161f6c87abbf63d7215c403fb048c331e2e6800bf15aa9f0100000023220020e50e8148ae97693944bc13226de44ebaf5ddaec17400e5caa804537b294e7038ffffffff020e3503000000000017a9147aa4ee090166c5f503aa70193db77e02c992a8ee874242a0000000000017a914ef045c9e42909fa2554ffa155959fade322bcbcc8704004730440220275531eae47f279f4a7a9d5193799230a734bc504e84a74aac08e28b9183545d02205796b9a655400e8b7c9b81273c28770c26afe7cf624ad6142c72bac1ab83cf5401473044022064611604e006fe95a6c21b3ae2e6a9af80072b07e92af80160bc7d5c9f7cfdf40220349b2fdb2798bcd4b810c0134014cc94709fb6b71e8084048dcbfc89031658420169522102c828744a6792a68fc150cbcb168c73cd283933205882024f72579b614119b92b2103d52dc777d68ab75744c7cf10293e7d3dff5c19e6588bedc1e31b4446db52d9ee2103d0c5e075a320c0afc24e0dd2bde3b27e0099122b9dc77833753c32f253ec3cbc53ae49a00a00010000000001011f09158a302673ef5d4dece92073ece56bb3c9565eddb3061b76eb68eefbb4b602000000232200200fcdcce31ffd819a89f81eed7f8a1f72aa4fe4a9bf58109178db41b6d7fd1278ffffffff022b2701000000000017a914a8937d58552c16de27897ad855cf8e71884f9ee6874f55a1010000000017a914d570d6302c4c73391596924f760bd45c22874f988704004830450221008151ca81dff17c43ae70a4d772194018dfeb878eb9a326ce3fc2b9f24d6f19ec02202aea891e1e2d10c51c5aedac364fc93909b93219263b9028637b42122293b485014730440220715ae00914738a247d9a7fc5efee9c88e0054683ea77ccd1268503137b87385802207e44d9855cab8a4e70a7368823a59778a15afc9fdb648e58f899d7731493b04d01695221023724b293d55e80603d9fc69c08fa14f796cd3e06ed8d0ca2608297ce330300c62102c8993721b8a412dcecea4038028029ecc2389853cc8d1d6ef30e75a29ebc4c5c21039eb86d273db31807812383e28526bef64108a3453fc4c42e540c1f634bdd6cbc53ae47a00a0001000000000101c6b896d104f352b889bc4033774e8cb9def6e8062eb84b1236997c1e80c50e950100000023220020ff52812051ed396e66ddd5a37743b2a48b3e13725aad33fb999d436cafea0e95ffffffff021e8b00000000000017a9148bd9473f2571ba2b3f417dc661cd91845ed0b8bb873330d6060000000017a91408a07c0444925d5a0e6f6ddf61ce849170456f738704004830450221009d69b2cb37105c93cbb74cd01dc8d14cdc9f63f46945b7041a56204011e86aa302207357d131188b6b79818b88c0c9b2b9b9134a1c2e7e38b56838fa224f1ac677ee0147304402200d476f709233f5cd1c099647f4f00186e70c41f9e5176b31559f843ce852631702203b4ea118ce398228f541bfdfded36fc645f8ac898c4fdc2ebadbe0ec22b0876801695221020dc4efd37ee19628350cc7f99ca548c6b4af05b7de035d3ac0cf375c559672302103d579b569058ebdecc1175cffbc37a7bec24040b82e465df68fd7e7fd486c216121020a7fe69dee0220c9cbb3433e1c0f1cc525ec9badffc042715729f49d9bb5baae53ae48a00a00010000000001018d29fcbfd573958e62cc5251091b5edbb8670b4b535648ea943f21d4541e1a970100000023220020e64642e92f93a3197130150b29d3a4ff12b7eb6a973fb755a87c324cd97a9766ffffffff02025523000000000017a9145b5f8fc351ff5aa7baaff0f04c006ef0fba16b768733f349000000000017a914d74e2bfe40311515a84de5a48f0b5793b5ed2a1d870400483045022100b5b56fe582163382e135aec908d021876fa235e0cde1ec99ed166d4d0a791de102202c78f76b35e8745a121af63a6c23bd5a61176d9d07bad4f67d42637074579bca01473044022025d761e7a12363c7b9cfcedc3bfebfd86500013de65747b7a4d596c10a40dfdf022054d8214050de55ee4c7f2cbc6178ca03dbce5f6ec4be7816ae13315eb3dddc630169522102ff8e3d60810aae40b0376169d21d4f9be79c4750ca01fc46b391b7489d57ae7421025281f55620cf2ef306f443008bdde82ab0836553d5407283ac491ea67845d61f21027c4e3fa72b97ebea879c383d804ec3e654a3e8def6b6495bf933ff5b27d4c4b553ae48a00a0001000000000101c725de0081a0782b072b48bf2e6d51b7d789486ea25e592a7f0c2b729459868201000000232200201cdfef3c6bbf611293e0d3cf02d2d324b05c85731ba7d3f1b9f82d50dfb0345effffffff0281bf01000000000017a9141bf72a88b1f2eb6bd0c7a34982c53e6c2cd4be6f872b4224040000000017a914af4bd1f8e568cb7e5a4fa99656f61b27035f4809870400483045022100f30010626fb7b9bce5d08e620b694faa30af64d1572acc9076cd45101bf2d1fe0220664f39826a8952c00e06a671af047cf9d35d2e1fa63dc880c7936f2089b0e640014730440220474294373311d1c0ce67469dd63413fdf503c64af541bdc5e3a14d0c83339a8602200a566e65c287ca089344c9d4242dd1381ceee3e89b29e581b0da72e653e6a25301695221031bcf012177d5bde84deca2f1a87bb386f8485e90107f3923254617c689c116382102b90d739c414bbe0ad59b5240704f6bc869a444abea5d7ac8ae5a86da3a7fe7782103ad7cce02889af9ab806d0da7a90d65a175ebffc87b4ae5b99dd9a9be9b923ca153ae48a00a0001000000000101630b0a960cdc9dd5f3739ed75099ba15b4ec9d67f9fc12c996ee2697d2a2a00b010000002322002043d32e8d2f53bb989079f959e2d24bc080d75c4c7a6ee166e36e2f58c0ed9b90ffffffff022cd900000000000017a914664d06227a0c322532978014e43d7dc84d402d9287834ada040000000017a91479384d94ed81783967150619caa035329b75a5518704004830450221009562979cc62babaff5484db3b5e19603f50d38165859513904ac08b042d28357022036feaf01471e7bda62e005bec4d7c6166ad9299c60328167296b05ec07b657bc0147304402202187b49a479a95de21ec87df80534dbe40e40f8742cdecd722444bf7ab1974e0022022bbfe981e4e659f13856b6d080e284eb6c05a42121d42d612f60653225c83e70169522103ce59145ab0125532c1313be7bfa7536d97038eedbef21b9ffebb4cda3779a3722103d5fd45cf8c33ffe36edee6f7d67066cab1223317097e7743db3dbe6feb77fc382102716c1e3b8d5394d7b2c0e131972329050d9f07f0e22421855f6b73fd4da96cf653ae47a00a000100000000010179f0db861292bb72fafa4ee02c06562e826d150f9d114746d99bdf23d7267a690100000023220020f13a31d7f07e7867387bf8c891c56a5bb9907af3842d174e65ca851028523f9affffffff02617200000000000017a914fd37aa59544a59a1ac5e530996bbbf0fbd3db06487c3b549050000000017a91446842724f36f1044a4f1ab7c7d3d26395a7f9ae2870400483045022100b3c2216ba77f4c9d7a60aca0078b463c35bf460991f220024a481f93a9fae347022040a09dcaecf724218afb452bc96b1753ee4e136e62abc13ae066b9d32515111d0147304402204513e0dc7ce80b2e4feaad78f49c6d95b99fdc073aed6f674d89202a94a9a8df022041bd30e2fd7448bf3694bdbe4f8786c75bb7c1d955aec75cb5a62877dfe1730d0169522102778a72b55afad5d3ea24ea103ee9208220634dcc3222b73f5c1bf07501db3eab2103133eabcd9970a49a410c2dceb0d1a16a6567f6663607356bb497baa7016fbe522103d5428e9495dd7688391e7d4e30f6754da30bfc1b0cfc5f0b03bc111b1759c92c53ae47a00a00010000000001012da44e0d36295e5d4f4f494b870a317f07324377156bc5cfa858ab3fabe412350000000023220020056a01d0832d67f8fdcc5b9baacc4f3793e88b0c6f77a6941454dd964b349704ffffffff022d4e01000000000017a9146c259170435642a234f4697c0ed8d5da5515db63879b3110000000000017a914e03c09b34e9b4b33cf1ea9a2e52a60f568c80f1387040047304402200448ee8b1ba8fdcdbdfd89dde09d2bf7c0e6c351b6c48b94ba9dea29ae9521d302202d521787ae26c195efcc1747a7a2ed7635bd720c92959e6a934a4671afd606210147304402203b31ffb3be4d7447b99b069a3ec9c149e73bb07e6cdca6546615d376fd37b624022011130ca2b0abda6de52c0cdabad1031152367f4ed2f7c765a77ebf13820e6d0001695221023191f456c1f4c6ad338ce5df91a86293bcefbad4e7ae372c2ade6a1b51abd1052102a294a91671e84efdbc442573f679860b7b3020b6c5f373cfb86eb4fde3f81aef21036e2dc48dd7d279666252de0bf4cd03575fcd5eb365498e92994053272d55bfac53ae47a00a0001000000000101104c23c5ae31b142f83112289942331d5893f84cc7c4bd671489c036fa1158380100000023220020275a575c286b9992c9cb315f16fa822e204762b5bc6b5c182a0755f59591109bffffffff02e8970f000000000017a914a6718382dc5ef12d8958147fb6bf6f20ef85ef3887852d05050000000017a91497b66d473d76be9d1732ea025e7c899d8e5be71e870400473044022045534282eac06a2a1e56d9527b92f34960f3310229ccf1a84ab11e2821afd05d022047fdea6ed091d0ff116f4a3aff3a83bd2ff4aac1d72c8af22d27ba8375cffe5f01473044022054f7f9ca50ae0ec9c5e16b4a48955048e123892bc1768a6b2789271b63bbb181022013843d214d92a484f84d9a351412d934f54836c727bd683bf01d53d3fd06c1d1016952210398da7a972b8c324fed886ee5c0079e892fdf98cae0cccb6f59cba44352dd192d2102407f4970ac30f2c58d955655985bc77b1016abb616ac8f2250f84ccc796041932102a24a5a69065ce1ab032d487ae00ef7f0763c450148e9eb80acc19d9634cd79e453ae48a00a0001000000000101b9316fcfff3e61726f1d73b18685c2de27832e4a1bd9571dd3b1a91439d0bd450100000023220020a54f38a81a7a9fb773e350845b7f51dbd9bb8777bdf0b6d9c961e1f6e79efedbffffffff02e1e000000000000017a914ad8ed3b8c372cccdca73b1f4d4feed71f1b9404b87bc8af2000000000017a91424c63fa3265252c72e983535dd1e2b9fa53798a887040047304402200da16b03344e2a045b469a6ef19361a5e0e7283a4199d47dddacaa436c5b5e6302207921849a4a486e87032f9a40d97acf202b891ba7fe87c8fed6d611d26d8b33e101473044022015f5fa2aaa4c1ebe6efbf21a17956db6c4ca6b96d84c5dfff57276619d801e2402203e257e676309659ab4466ee5f66592af3745c18f6397cf107de5f8f473706e840169522103d65675ad139c6a407e2db52eb7058b49aee9cd08877cc22f1a77e25dcc61e0d3210258679ea976f9beccde7676d7dfa3647a46864f1c287aec8bb96ddd857c20b6d021026d2a92f0f64ea5a11c2251576bd0a5345151c0eb51035ffc0d5d618e61492aa653ae47a00a0001000000000101b0f843d6bfbf681c824a83cd86f750bd2f0c555e1a34530c97ca6cb84c44ba7d02000000232200208ab73608648bc5c83de0e1d84c1d5548f5972e1eb0974e41606381a9c6a76fadffffffff0209c001000000000017a914c29e9d7dc080ca083640d02ef8e84b99e8ec29b887cee264000000000017a9144b50dafe8aeb3b010c1df148729205e1b6e7b441870400473044022064120e55fd8145d01f312910dac3736593e79834aaf6dfc996ff337043bf017702207637e65cbbe33c8a9c56a1b7b2ecb8b5fca077eb2320f139a64f0402b339e7e80147304402206993463667146d16cea751bc5b5c6b3131401da4798bdbca629297783ce4334d0220671de176dc11fc6cb0b338c22e017a1eb9431657cfde34ef7ed30cc588ee29f10169522103884704a5a46c67a8c0474b00af72d9249908e2d94bfdc36edb763d8578ff998d21036e74f622320833f1c9f019672642c964f4c04f339f9f576018862c89d99d4b4821020558d11db1a618cf77ea3386e7ec4853fc46dbbb06bdabc1e3639560fdea05ea53ae48a00a0001000000000101069dd6960f92226d1870a1240331c1b9e43438cb9886bcfb91ee06620f6305960400000023220020a95a340b95bc86d3937ffa710e9253956647c2afa22c457a00ffb534e8a1bf1fffffffff022d3102000000000017a914664d06227a0c322532978014e43d7dc84d402d9287f16844000000000017a9146e43e4b9511fc7dd2dd2805cb649db1d3df8a770870400483045022100d07f0a07b5dbdef3324ed23f3a64e2251969d3b7b9ca324cae6d9fd18851983502204e3393e05ef939afe61df15a5d95e6e21e539c7809187d8c1210a0ef6888cf6d014730440220656978ac45c48d1d31191bb8c77d5e0a07cf59dada95c0ce8fd58caa68bdf4a9022069eb26e7d7ce26011f995921f1367773bf64480980c2efc19a5eae433447585001695221027b18d9478561cd63ebf57f4e1a1299259b910d9fa0a130bde586848cc035084d2102cabdbb9d0c07a9f3b88eaaab0f93a4c33c932598b8fd2533851773ff7146245b21038be5d12c0cc6ffe58aa1ed59a5038fcb3c5708e86e9ed58f55b0f3d4e1cf0d4053ae47a00a00010000000001012288c3947dcac9c12677fcc56647040b281b2484aa222c0b4c5c4dbefd748105010000002322002076a7651eb645c3c92b3c8c1cd102a78594749ba86793bd5ff8ead751182165fbffffffff02faa150000000000017a9149e9307ecaf78bc4cafc4cc51753384921444d54687661405010000000017a914b5fa72cf1b14f9dc1349ce688ad00b4c82004f3187040047304402202761b4d2d72c00f7b395b7c0c376891217543ec28159d1cac60aa725fc3dcab702203a44e8d6fd02172f75516a94103e4b6c35ed05b3c97059770bf692340b5028a701473044022060b623168232dd2fd98f9ea469ebcbc1ae6ffa0db407579c1760be98df1de6d402206d5a39c46ec087598b0e4c031e1f325aaa842df26cfbc954aa2ccc686d7b021201695221032b4e59bb04903ac6ec44e309bae9fecab080cc189b529df5308b4360834899092102517719f1d1a35b271b5f097f62ffec377682ffcfd16efbbace78d07fadb4824121023bc0ec8acdaa7d5a9b56762426f6d4d58e4b912cb29c032d6c2573750fa31b3253ae49a00a0001000000000101f93c3aca8bc4d767fe7a8410f91121e01aca05cfe5728e29faa15ddef5ea25c70100000023220020723ca694275208ee0b1f598ea2016bea8de7d41a7ddf340dc35941f735271dc6ffffffff02501608000000000017a9146f76944d40406ed551c994957013dfddae7edd508714dae3000000000017a914b2650cc9933c1575f225ea2a2b80784e5e85be10870400473044022045dffd0e7e40c942a07fa6ee8fe7e92f2f99da96ba82c5eb2607a779f8ed300d02204a17612bf90590ded02813ff2af510d0c99fde8db1f00ad7fe5378aacfacf8ec0147304402201c384f7ef5019292bcb4c55706d5d45d652f5341d61ad9988b7e88c3553ed4140220147f0c93266ed7f8092ccefcc7d840a9e05f2c95ae50eb2e7aba4de82f1c67b6016952210382c730dd08c2971d3c46c28a73367b63c5d9e7c69fb4d2a7bb5359e272ed286c2103d8df66f73991b25819ef055e5c020ad438b9294ee78927d008f0d81405a22657210372ff96cf3eb23217d0fe50b9c537b5f12fb86b6bc4beddbcf3d6ef4f72c6612953ae47a00a0001000000000101b567d9e85f5a8c11271dd416a9b1d7923140af39ca081c24e00ac5f99a89a8ca010000002322002022132cb3d5f1a3a9b4cbdc0e468f3551957dca301722614faa7f290ed5757f4affffffff02f2a903000000000017a9146bfe3968f7f83c44246959d1c86791283d6ef75b870745c3000000000017a914831daffd33aaa63f764294eff0a7dfd8ec6b90e9870400473044022049660e9437057d40cec2d04c8d96d15da19c2eb65398cc4160a4eee814c06e3b0220723c7c6173f53ef0ab7878ed9322374257a2ca8cc138a8dc19d7c34023519fa201473044022060ac8719d8cae6a463878bcb63e6ef31a21f4ed92dfb7092f0579f07b2977f9702205f95c38a0ef39da80a673d73b94b4a02ae756355c6fd6387127d1a418fffc13b0169522102206c45655bd2631574b1f1ba27a69e50c04880979dc272a353e9850cf8e935412102a9d12d8db3b6e293967e47ff89a4f59f8c29da7e33b3cd28963ee1bbb8215d9e210278c43343efd5bdcdc09ec4e69b4c5655790498955c2ee8ffd3dfd45d6800659753ae48a00a0001000000000101bd374755adcc599ae06484aa704efb3e5bc7c540b7fec2c0b23702280d45e023010000002322002014852e39b778909c0a5eb3464ec09ad619a9daf68fb75abd705f4f119eced84cffffffff0240f129000000000017a914dfcb52c619e2044da4264a39415778ebeb8dcaa9872a471f010000000017a9148691ba1750168572bdba86d6baaded0fffbe950a870400483045022100e6a8257231f35a106f742f4c2a424c4aed6cf1e3f0ce0964bf08cb7fc5bc9b2002203d453c58d2f80320b872b08f1b3870c8cbc2916c638a0e5564bed7ed3e70c11f0147304402207aab0cdf4432a20b57fed78106525d4b378a29ada9a57e77594f396d0891622e02201ceacddfa8d80ba7ede0546c33b298d1fc774f9a819d3a9c5c85e9cd283df70701695221028df5b0f204d7e99b14f56d7a51aa516a6f0ee77a1e254d8099bcd782f06c53582102b573e17fffd05dc4f2f43a099b22c0365cef701374511ea27f07d1d1b97051e821026cd0d03028065ff2e6d2738c8b8516b1d0183da832f36e8bbd772a4218e09fd353ae48a00a0001000000000101d86b682b9714aa74f3fe024f13261bf1be6e1e1b06d9e376049adfa9bf87b4520100000023220020d66636bcd75c41dbe3debc71e97004be1a4cb74c457b70078ece13819b700aefffffffff02c3b1b9000000000017a9145a1ae01003f069cadd70cc22e82cfa6183ef664887fbb3f0000000000017a9141233a9d76fff40484b4a64b5b8aa1b894d703fc8870400473044022038128c99065c9e6f76356fb63847385564d4f5a9e070b6e8550e835b49d9765e022048b141ff2c09dc9af26d24c0cd0a98c47882aa7bc565a3c95fade956ac94e2f701473044022024699160ae5b69140c442966e67a4c3e28886d623be513e3d56345604b419a7b02206c53f90a454e16cfddc9c957b869f75a66cf5807165e6b771e803684b3006daa0169522102d28ce0313563c1649055d5af3f231ff5631e104aec04e5314341b4b82d9bce8f21032fd3cf315b06b38883e7525982f8b1da859d49780b0b8f5f4bb668df867a0b79210354e8e0dc870b0a71a85701956bb72eb6e6ad98983795fb8f4d98f595f906232e53ae47a00a000100000000010132837ba18d6ea403394a2f7fdf40f33823ef0d9bd45c4b5b52e4997d37d1778b01000000232200205cd4a2c4ccf92c76f684698a3b5f0b864e8b197213519c6ab0c2659ba8ec69edffffffff02a9e908000000000017a914bb5c2a4a8c5ba67fc3a989092580ccd7d979b00987a6e657000000000017a9146279a9370c7bae0aaaa1f09a047d60f7a4f51f60870400483045022100db7859f587269e1bc1f39c6c7dfcb12cfb06852ffab7b105c21f35594b251aed0220754612e6f015460c4cc4fb06875ed5afe19a099787a73b80365cd40700dd65910147304402203048b1915b500fd867ea2b46a57b52aaf9691207b2db4f0647ec04e55f9faac202203aa1510b0e1b696e3bd596c49503420b3f40b170eb93f857132b8aaa92c5a9cf01695221027195c8f742856edf748b30bc9ea59425d52b1d8715c21630801287bf0b433d252103ad6a292112207d44b935f5618c7fc6aae5a30047f4ce13d488b576748f3a883221034f6f8b258ac867c7f861cad3c9a9e144bb4a5cf65c7c5a0001154b0dfb31081553ae48a00a0001000000000101aff8f0185e2c7c52876bb0b905651f9a7cf308e6e49e34225d5b75117943cf8901000000232200201ecc459bdcb04038fe762c6093ef9f8c80271a65584c7a6fe397790a8aa5bb69ffffffff02b35501000000000017a914a3cdc31bdaf5cdeb6021b3472cdc55ccc073eda987ff782e000000000017a9147caa8d58de7af10281f821464a1105e60f60065f870400483045022100845f5dbb9dad1fe4aab2d58c2aea241eee8337ff4e0f120b535626148ddc12d502202a8cc41101412530216be610890e5ec028ecc3e44b359581ccf60dce814f2eca01473044022060fdb2199875c1737fd6f66eb7cfe1a1e350da6f3071212de24d613c4a0e51dd0220266423d4efb553500b7c06586c703c8a62ce17d26bbb44635bc49c7890ea972c0169522103dbdccf57357879368932f8b3db85775e1a0fd9f226c200edd10b83146e91f63721032fc32515f92346df17b77f3682bad129542ae36318e06d0fa29628fd0b52d7e02103a835f05411ec1ba6605a6c23ee1af60c4198bd80fd58c842ac53a172e48b943e53ae48a00a0001000000000101038a56f8a1e48540528e95f897aa8c6b895c64f5c353a3ea2ed0100a53cb56dd010000002322002046209037745ebffb8de704ee062c262ed678fcc6812a9f9432a12df8a92ab20bffffffff02cb4004000000000017a914ec4dba6b4590e56bbffd14413d3fd8fc263328bc87992658000000000017a914bc5ebd9c97ba5601f71af7ec06f92477f87cd85c87040047304402207171551ff0e10143e22d6ab0e073a5b2941e9727bf0f93c11e2ea7e537f302a302200cc647c1e1d9a8f6ec5b74e4514b1b350fe8f83aaae7d69d5eafd03e5821852c01473044022068f4bc1921fa901c81e529d400b2bf60675f5d96d8cf3e2dd877490ee40bfc0302203683efa32b1cb249fc49d9c121af24e775bea2778ab9934e3fcaa503bdd143b401695221029d9e03077556febf9f3302cd2a6c1445d49da09025a73f4e069515082c2ef45a21039ff08230e2b0aa7763903e1c688c3a1b752a17861e9289bbf1cc76b03521d52b210359a34e0ed24b8e59658b1fb4ced1d2776aad67134c6bec9ca2e8a6b7c9070d4153ae49a00a0001000000000101d6bd17fbe0ad052e24e5b23f2683e00e6a03cfd630566f58cc3d88fef15a01c90100000023220020da92265aec0829999176d46b9a1f839cf7a3e12c0334f1f712b15d9dd97081afffffffff02780709000000000017a91437d845af391476247701c6857b4d6e7522fa9ecd87e18d15000000000017a914cd10aba89035db6422ec55e6c3194332db4a05af8704004730440220680de9d03135e468fbc78a2255c86e2175da3a3e0b628f03c7efafff8c2b6d18022024d1affe8b6adc7143d6b3111b1d49725f7a2f588d70e6c6984b4c4b2a3bdf7b01473044022078f1101d8451ce9ebcf96e193735cd227b9f36915e5c920f7c2e6855535575dd022041b7c52d636bb4178349097cb68a68985c3a2ccedf98df6e2142fe94082584ba0169522103e9d302eb09218cf2dc8ac02f88a51038e73f3ad83877776e61c30ae76907ecfe21026adb55d416a4d1d3191ddaa3489a95bde68ef5adb9e9541a2c0dbf56949dffca2102b29d8fb0181f9c17efcb3514150905285cfb79a9ab34e2fd6b3d396f6f11a25453ae47a00a000100000000010191e3a5438429a9ed34d7a65402658ad8348132d06ff6a500732b4b0cf00c49900100000023220020f1e945eb2a20708d31de2d4060236a1170562c1bcc02d953a6bcf0c0e5abd64bffffffff021a6b02000000000017a9143fee4f42c2f00fd1e89963fe09699a04b0343c208746e95d000000000017a9147855e1c6c714261cb28d16edb3aade307494b2dc8704004830450221009c3e9ae5d025c162d86e813fe6207bec9fc898a31450229cf01f4d2017c7bbb7022048f5d61a0c576e52c14a7039f3752d31b113702b544227101f1870ed5dd30cbc0147304402200753ae1dbb89a11ccf8ab75bdff05e797289f8f74ffbf79a5b60752e6374786b022070dcb253ad66b348add6a0db98cf8c6e591ff35c5b1ce7a625855f8d6795ae27016952210264225b71a48370e217b50ff1feb02252ec5dfccdad4ab1bb5b02a30b8e3b996a2102c568e1cb8c3d0d68a4d4d6f3c9c881c460e0cabb65bbe875cf7aceda9a9698c321034bf3896d34160dc65ebf6159e3657bb4523f2235e7463164125de4ab2a28c2b453ae49a00a0001000000000101b304a8f9b50b2d7ca68048b9c20e32431680f6b8dd72479b2e16e0f50df02e840100000023220020f13fb96048391294d961ee6122333073f986eb9d4d7a443d20b4129843196802ffffffff02e22300000000000017a914e37f45597cff5b9b5d4558a008431f699da53888874c842d000000000017a914f5c9334067ee03c1701a0eb2aab2c5abe969a4f087040047304402200468394182816e4504761459b9b0d034620c00125310e6f92307064f6dfc36a602202cb2836318268d17bd9ec55de975ed6710366d991ebebcabb8dc9478a9818c2701473044022074d250e2d94e2d1b5bfe0dcaf69ae25e45b4307e6df1c6d0d87c98884bb7486d02204134eaa8127bd12bdedd58d1c6fc0b03a0eaf8c0872ab78538f53a951aa00709016952210387d7a2ec5b53dd7130d2bf4d84b614fe8820605e5d22e9bf9f6988bc3aec6bd7210231e051851533353c1fac3fdba43c2325b870d929f316a4cf5ec4e0d665d6107c2103c8b75caf9d5e45e0f6992d9367726f5ebff5a4b7b9c5bc1958de5a3ed9d852e753ae47a00a00010000000001015be06b7cda36fbf168f7bb7bffefb4fb93207d5f3bc2747bf02d0db95265e0400100000023220020d03613e703798754ac19404100a0892e6bc42d5fe66605c6f8f9c14b19d18066ffffffff02bdb901000000000017a914de05984a144be4a19df0fd5abe0a0b5f78c315c087f01d1c000000000017a914e631867281c338c8977960a07bc0cf0eff6b7f6487040047304402204cf0cebad49d53b6b58aafe6a825fb42162d2d66c395e9c784aaac49bc35eca102205f13567a2327b58db73cdbaa7878a4da067a449eac4ffb6eca042898e533b2c40147304402204ba942982a7b6af6707ef1ea394072fafc718fd317bb900a9647b1f85ead051e02200e4d13b39de7565a022b59f53e359637591dd255e8b1820e6c162b778427b8d80169522103485701f72f8b0707e97939cca011a610d04e60d2424eeaf8e6cf2e8296a244872102a646bb7136c5f2ae0cbad9b345c1f4f6ecf1bd93d3ace32298fbbc46d8b09de421023a29a21c062c5ac47a995f71f94e56a037e66b98c0869cebce427808ef27451a53ae48a00a00010000000001017171ff65cdb05aed7dd3ecfff00a25ae41ca06d4c8aac7606c2f41bdb5272772010000002322002037beb0a6dd4809977e52cb99c605d1f899c87e41c2a5be9e9198955e9063fb79ffffffff02a18703000000000017a914d7a741411a2545fb6909012b8bfa06a92e71e846879a5d78000000000017a91446d8c5a1676bf084e9a1f983d695c1df5624900987040047304402207bf171eac5000bd4aff77c24ca32916d9db362c2b84668bd63e853a1215e355902201229f6a9c297588b403351b4a4c5b57d2d265b3d8854530b013b967bbc1474860147304402204c1a3227ae41b312fd1767b309450521b3293f89c50df41c0f5ec3ee49ef878e02200b86e40d298767c9f3b73ef8f7aca385afa304f52e1a3ad143c70cc6050fc91b0169522103342767a7d772e65da2b8a9623d9fff1631e279e9df625b9ed43821db8f53ecb52102bcbc3badf6723e8119c4d378c3f053cbecad793189b44d0c0a79594d409cfb6621031f407e5c8a5599bf21149d579a5a1ea285c6e6c4af6da79c173b273e7de826f153ae48a00a00010000000001016880b065eff5be03bb8c526c70e3cf5a2580354a834fd34be9bfa1b07584f5cc0100000023220020373d299e3f73b2d9fd8741f4d7487c15aab9ae2511c5f06327057ccad0fac4bbffffffff02c0e207000000000017a914c3797e048b64e5b2d897aa8d1288184595f932d387d1c65a000000000017a9142c371935766d50979f388dcb1aed3e448d1ceccb870400473044022071c6340112db1eb59346cfd32f9d839a9cb4cd3923331068ab34bb741061271d02207f51bab6db92df44bb9a7302666552cd812e187ba3a1342449b410b87b77b90101473044022032c65578d1e958ce6e8553dbfb5318de4e52f7edc789340ddc1f5e226a9b4afb02205dc51afe9ac656e9f676c1ab34303ef4c3cae474d474c3657c4f8d6ac19ccf090169522103c43c4a6bcbed6fbbd990b8ecc3779ae56494be2be327e9cb37964c65f0febf5b2103cefe0be0cd9cf834b6e3ecfbb34be4ef5a6dcdd00ce678e7c320287966ef44412103e90902111d16ca05cdc63f5014e45cc175b33cdd53ec3e68dba7959f5df0cd0f53ae48a00a0001000000000101bb5944f224a85605ff86f6e2a2410fbb2d98a4e67d1e285cc02fb42b5415e32f0000000023220020a9897a21600fa5f992435fbfa4548c2b405b0711c3f628bf2482ec9e076d5a32ffffffff02d32c03000000000017a9148ded6f0cd3fc1e76116b87dbf09b587f74ac0305878ed3a0030000000017a914d02fc8014dd397eaa19e5dc22c12cf39c1f0a94c8704004830450221009b81869ad15773fdc433164386f7af8d1a441d719edfd12f66f975cea9eb15e702204bea8948ae31eb0f1844af3c483b88db1bce608f659ac5f130fa589b714e4ad901473044022043abe53610582337d709826646e8fe9b3ea6fb737cc957e7a72792d16cceffc602203220ec4b03b8352611e18d5e78788116e81fee58ccfebe7c2eb7899ab5b12615016952210253fd38b414a484c247ede14ad97ad8b286f72d658db05fbb7c02d98d6f795226210337e80c52c555c152a3729e724e888b20af13b49eecf9b4e67ada23d49fdf0674210379951f4138b6a576042f8cb0d9b52a3a9fb46e1690963f039c729d1b05e9ae6653ae48a00a000100000000010134f481929d167c7afdcac6bfd95f15e5002e6448822d7bac21f7277b083101d60100000023220020f149a21ce175a9e2d0595c669f3b86a22024f10c6c2f064bf1a8eb50da61c348ffffffff02e00401000000000017a9149c0f540f10bbac79668c35efeb605982eda543ec87abb8de000000000017a914911c97d9112e278f07afa6a4f4bbb7702ee32e7a87040047304402201e11b72022bfd27d956cc629db7ca71bdafac2bbeb2cf3ac0c915643c8f143520220666b529335ff38c44afc80ee71c496dab86a707b5d1f5e59347c3bd77e35491f01473044022056653db070fac0b201419991c1372669f02ccb6548e22904d9a09b9379813562022074a1ee9cda89bdc4ffb8aac0be1bf556e3fed0b0cbde7636348532e59eb2a2050169522102a4ae97aafbecd2e182ec322ccbe7a7fd7c860a1dd8965239082f9abcd285418c2103cbfce6e88c5a1cebfaceafe8782a697d81a9fb5438458f3dc06b5b94042cc4802103a4c6ea4262a60ebdc038e66456b545172e02a8564bd89256eb1467dd1b7a434053ae49a00a0001000000000101aa12669a162f35253cdde9d4b3b77b7cede3b65dcf31d4414790650fd9b5422201000000232200208aec6a281a44a5606e24e0955d322f7d56b4addfcc6e1b960a9cf575ca9f1baeffffffff0204290e000000000017a914d7a741411a2545fb6909012b8bfa06a92e71e8468772bd0d010000000017a91480b37d490712d8751463812745316c10a3a6ad8b870400483045022100c0391ab907a0925c04a26a5825af727f1dded934f4ebe1cef0992d6bffab645202202d724341acc3ccee05c06c04168e48936dc141d3b2012607a8807089223a8c770147304402201accf97427eeb7a76dba724892fe199bac7ed3a8e61fbbb90f238a0f3cabffc302203fc06746b77be704e9a9a978d24e25ac956066b87d7d5461b22c52537716e5800169522103c07dd4cbac56d8cc5dfcc526ca89c18a9e8bd39e2c72a196ee97b5916065ead321037a221ed49a3bd1a76f67c66b9dbb00a4cfc5f61ccde8d5a206ce9cd48dcc44192102cf6114f6bfe543a59afc2e04fb0b923753527260f2a6726b5823af3168bc113153ae48a00a00010000000001019aa2f664e1b8e3bf592444bd5d14170e0537bf5341a2e8fc944d1a6c0fcadbae01000000232200209efe7a4e777bd06dc44f824b8c283368c04365dd8bc4a7f3c82f71943903b1d8ffffffff02d51600000000000017a91435aa2a405c54d2ae783aa51cedc85e1ebbfd8fd887468bca020000000017a91426328ab0e462aa591a5b599061689ffe17502260870400483045022100cb4285b356992d7844474cee98afcccf56be16ad65bef743e5a1890016931d44022062da81a9f4e649455e472e8794cf476bc6024da4907cb468ec9763a6d52595600147304402200dd7ff31eb8f252586510045a62d7efa3a2438e5a9d33a71691f82ce2cd616c402203970a077a889509045bccc607128fc4d43276b7381e02f8cda2a2e85872a8c6101695221038047c9c15fb65ff80133d0546e33212f7e9507dca34b2abe2aca1697bc1b819e2103ff001ae3f049f13ea217dc91a05ed0a638c520bac59e5e3145bdd562fcc7c4c12102fb2ae604bf11cc816b751cc012f45ac7c51b05dfb33726c8978d92accb41022153ae48a00a0001000000000101e0800f33353916d2f2de5ffed34890c9bd5004c18e7a88fa603e33f4d0817895010000002322002044332b46ee6a901c75415f8a8e2d81d542a1219dfa34cc4f655b24a522063edeffffffff024ec003000000000017a914e8599bf9c28c670d8eef3a757b8fa92b6cbd440087e2001b000000000017a91471571c714e5ef36059fe7957d6ab8e4506a30c4e870400473044022006f7038d3c5c9ec114b156cfd08b9aed76bced645e3c73342b29a2ff434f937e02201dee7f23f35fee2254d7dc5ea31e247db73bf57140889a7cff3eecdaddaa23df0147304402207845bcb763ad8bb84c8a2686a892fd83bb906cc635c5f056b662a3262812886b02203c19b216df956129662245916417d1004cf36ef2cd7525a4cfcc23a5d2f7c59f0169522103a04b00259a231aed14d2fbccbed18432002fa92d407afd93741c4e69736307742102cec19393a8c9c2f8b903358873f7bf9e54706bbc3edb42d38364c21685b65014210376bda9d00334c51c60735dce57537ee5c336752eba800d38f66f5b4b20a1611153ae48a00a00010000000001014c9852fea27617ec2132eb7794fe4d3154df1edbc67cfe10617565eaec4c8ec10100000023220020cb062b372d64330d5d398e533c7fab3bad9db40ac98e2e75c399ffe3fa2007b4ffffffff0298801e000000000017a914d46b2bf65e04ca10d06c5087573c89c5ee5cae048709c4fa020000000017a914603c650f6b6de5c8ee409e9bc6b99c8e114e27e087040047304402206b445b278f15c1231d0206ffbd13b64b50304630c1b7e61ee9b414cd2ce48b870220536db42f0db460572f1cfd579b6e57a52e0bc980f322c7813d7fee56aaf9fdf60147304402202209e3d08f9e31c4c7fff9f2b083ae35f963992763c2a5528a3406c4eec0f21202207257e3279de7832cabedd0bd04b22addea469773fbcd69061d7e279e6e8b150e0169522103362ef1f73fa155f5b74cb96c57d2274be5d810b88f27220952aa59549c3a06592103871924be92db46f2987b14bd29b9de47449e1de8468db43d33df8b880fe96d642102760a4938e4aa859f82dc64a2c4a7130cd08318a3e412b64f22c4f84805101d4d53ae47a00a00010000000001014d5eee5a2a575cece600645787533d646f5e1326ecb278799b7937bd8c5ec8dd0100000023220020b18762ead1d3df73038424612a71bee73c194144fc9859a994f925fa865db796ffffffff02f9c504000000000017a914ac583457b6ba313d38913a442e170247d954b8688728ea68030000000017a914e3823ecc4791eab3c8b66c0690c1d0caa515c2e887040048304502210080899931775a37bf74ebc95358f28671329d6b9c9974db2792bbfb12bcdab27602204d348f43efda5cf1494ea841793d7b78b8331f9363140d2fb2a26735dd929e930147304402207754857ac2bd5efb989760c56b383092f138d2da7ee282ca90170e1ebeacc38e022026b4489197d65caf16e2aa646e0276d741e7ffa36d8feb772d9c44e2a113360d0169522102648aa3f9e6cf838f9374d329cee620a786bd88cfd2f124bae9f106547bc496652103bade2d54f8dab218820d53334e0457bc266035401ad69cf808554070face4d3421037b3c19bb707d7c08ab85321ed9bf31726ad81c79dd26dc097f5d6fbc1d23da0353ae47a00a00010000000001018292a45f7d706c9cfc5d2d2b37e285ee4e653ccd7497137eab86e34e705224b00100000023220020f882811bd76cb06902729c453434abcd16cb8193c01c36ee152be91e22b490a4ffffffff02cc6ca8000000000017a9147eb985da26792d7eba20018d08c927cf0746b7b787d5ad41060000000017a914a5cbeff69890f67ca8b47d0a3ec823dbdb57f65e8704004730440220699c8498f1a2f22dce4bc53af891dc76939c144639408f686e64d6a6cbc66b36022004f62c6e067f94e977e4fa0ab73a428e2ab44ac1b141f8fb21b10b92b50e2b2901473044022078a2efc35c5e55161ce8d56cd38192094410be09f3ad3632acf654890b7212a3022033de126e2bcce45b377982657851cfbee2700c6ad5f1e1b8b97ab561ad0c172801695221027678d684cec42d5892fe4956c78512742437d1b454f4203bf7136229851c2e952103d2745282a5dce9c8638f9d79b37be218745850c3e8f5ea2044acf21743be21e921021a284824f44eccdad937073f4e40ee5a9cdcff5907b8ee91768a893c9de8385653ae47a00a0001000000000101ee4b36ba125d72a2fe2a7778d962e3a0a16f52c881783ef9ef08ce35b7a4f4d60100000023220020906215bcfde477914b77664fac5930b30e5bf3760a67ce3880954441c49231d0ffffffff02cc800b000000000017a914ded58b4f9e4688fcf44171323f7dd88e40048d8f878d2c06010000000017a9145e81da2c6f0286281a881ed55d315ecf307fbdfd870400473044022016e8cd5e813ed13f5c8b6c571ec259d5466c460d8217029d9c9d771e34034c7b02207495204fb796a914b6a5d7e8768a633424a43751b008fd857bcad5180ad138a901473044022010e7e0ca24afedb85bb509dbf4df1af112a48d7d22f1d12737b51d66e4c20888022016ef5d89bc7c572140178504a7041ede35a1884fca4ab838332d06bbcf13fa7a01695221021474cde5b74087d963f25458ee865ad7cd54ac81b4cbe89cd4465c8ebedc403e21038a779101527b5f50436d5cc5378532d066339a85b698707a4cfc517d9759094d210272cd32deab718c72d7cf5f518ec01833e1fc7506ab1d9a29f93294dbbb826ebf53ae47a00a0001000000000101f553d5ca9332ab6bad19b3801df7df9aeeb691000779f242e113354f18fad7c001000000232200201591041085bfe0e2e95c65d3f47b3468f90a6fc6b31748fae2e07976978f0ef6ffffffff02a68203000000000017a914e37f45597cff5b9b5d4558a008431f699da53888874d3ca0000000000017a91494feaa971f0df668f7627091823da2f7e0c9743187040047304402200942513acce03a5228fc5eee0462fa4e7dbb2f97fbbe19aca581947e9340e3da02202f176309cd86d8ef2bf5c5f0b08f9d3f838a2b4ba452a8c362986bf602c7241e01473044022070d368962f64ada6ec56f06a52c4b9d6d0139bf2f5f92b13e37490763adce515022006b9d7cbf9acab6013c2c1c251934c117e2ac073526d203867db0c377d26b652016952210232d5df0a8e1b57770b17c5256868c69fc1c09758a6bd97e0f78b0f56a06dd81721035ee08e3f5e618ad2480656a78ac886f2b2a367d1f1eab26e57117637f0af76c0210388633a6948e5de928303f192ab77aa2afe7e8df795f9a92b751f17c7d5f5f41853ae47a00a0001000000000101d5adf6de81c6b86ea22ed7c2fdb70ff759bffb6ffdbb07caa42310a57374b22325000000232200205eb0a4c786cba7283c75a29edfb1eb54cb937750fb98ae92dc7abaeed22391b0ffffffff02dbf329000000000017a91489c98bf41828049f166c08c8c74ec027bea54eec87458237020000000017a9147686b6a1ef1e4f3cbc40ec20c8ffaa44d9bcf475870400483045022100bae9750ebc49a916a425879171dcb04a4a086a14d44aa8e662e9717ce9c406df022029c2800e09db43b352ae2e254c5faeeec8552a81ad8658388db0e1704d9f4f160147304402205263115dedcd81eb9de1b531e429c4a0bc4dddd3a30b726ca8e701365cc701ad02204d56a6ca4aa38c4937c66712dfa93d19df8574e5d5dbdded588e35afcffd2b670169522102530b4a2f72e6d253a4a7b5487ccb60fd470be02b6ce58c763845bab61b4e7ebb2103e6f6b771c3eafb936e7fe3360c179b1a48c2835e04af52261d733766a4e8063221036de09eee47c0357f1421ebca28593cfabb0490f0259dfb5c4ae6e1b9a7c99c1753ae49a00a000100000000010246dd1884d2c05307a330b7c6ad63b2cc405d82cb40af32ec7f41d7ad0785826e02000000232200209b49387ff64e93dc1ea585fdb3c08023117150b5903697539c9b4ffee2e2c21affffffff5353b94ac70b4b61a4ec7db388509e2ac1f9fd717244105dfc22f080bbb79f9d01000000232200206a869e4b9454b2925a6d40003ee59d48c7594ac339df83bda0229f4c3d296fc8ffffffff0358a30300000000001976a9142d3ddabd20599afbf602f95aca2e1336e65929e888aca1ca03000000000017a9146607da53758068eb97254630c242ac162cce421887e2c81f000000000017a91444d55a5999a4fd1211eeb83b10e9c1eec642567b870400483045022100ce704f5f4f2dca2abd4d0acf97326211afc9f24640ee41d4359140f837d024d3022013b6e4f039bf6d3a304a9c1988cda32d36f2c70dc6138e16f86ea650c4e679860147304402205f4c6aa4ef41211654279de60ec1b4c3bcd0562a6e15fb0512413b2598365ce8022005786ecf209ddd372fd96e1ee9675c432438057a7e39d3a311804c3af27743dc01695221022df1190b1aa9d117cabb5dfc671865567c3d5f009e1005f206e6024aaace82bd210364d6a3f0848c688c75d5c9f61d1688275d5f4b1ea4a24071f0b1d921e33f99972103164a75424679d97e4f8a00f4fb33650df27a24cf1b4ea8d5e46ea6701f59cb7e53ae04004830450221008ed28fc9ed0b529147293c676865a31db8be7a93a4385616389faff351b418a902206cf5b6594310a1ceab84eec5232dbec8b39b3deb10ecb18ad6e3629a07a2eb870147304402206eabb51b406760c48eb416bb536760de1b42d4e02b4366b5d188a41fe1dbaa6602204c3f6edfe6b479625c8fe1d076ec96e18805c84ab524aed5807ab3326a626ba4016952210316bac0baaa739e50fab8773457a1cfdf669fc453c15d5b98af200c27b13e03cf2102d2aee76d0da7d0e8577765d6305a2467d44fdee4632e86608e1f83a653096ff62103091e896c43a15f0d736033a79bcc94ec450ffc8eb7cb84a91d013343b0d2bb6953ae47a00a00010000000001053a772a7aa375706dba729d26c843675e4646555cefd64268c7bc06cf195c712a1300000023220020e06002539b937ac7e4f4335a578f7505cf921ce246b4acdd55ac6ab0becdf08dffffffff0e5eff6c7f25229820cff2603952175ac75ccde3cc528b81a92c93840a3ff04b0000000023220020d6cc14b503207d36e8131a3424bb8a37d1f06cc061d797e18841e830e5d97468ffffffff373f1d0edbfd1d8c35cb51a872a167c59e9151b768bb7af2b6859054f5c51e6a02000000232200200206ed0d0ae1a228f7d0127f5852d1356ba07ed0866f0d04a5f0c3bbd8959e37ffffffffef04fa9b09818503ed99ec332c883d3893bb4b0715ed6333878cd5ad50b94c9700000000232200203a427076950d271924d77cf1eaf7c21681ac82339437f73c0f32e09a085d0a4affffffffbcbe7ee38d6230c234c893d983adc8a3d0fc3892e7809f02a39236af5dedceb40000000023220020f88956f54b37772224ef67fa3392ecb79dbd0e4ee5fe554774c9984402a2ce17ffffffff02625900000000000017a91442f54264082b0e502138c51f53f1f477ca6ecd6c87f0295d010000000017a91429a1792d5c99a6f8fdecb879739f5eb5de46baea87040047304402202bffcc43aca1db4f6cb52c781d742b2324c03026fe1b9551bfc1e7bfadec894f02206e9a98e4e3094b86db2a8ebcf5fa94dd3e9ae1c9fbd25b3377354d92962c0c0c01473044022003aac602ab7296679f6842a89f4a586dfd371cae66a0eede6e563b2dc2aedd5702203528112abbc1c62eed440da89b1e07bdd6e7cced3a50d999fa61e25b4bc8830e01695221035cc519545bf8d70d00e109cbe053c0467e7185eb615a40bbe853abed9db7167a21033c21fb2d5f2d142c169e72fc06833b4a363c573b5c55213d014d3d1cb683158b21022df0dabbdb529af3dafce5a81026bb600c932b6098425bb91a67b77b71d12fee53ae0400483045022100b4ef0c4d599c59134e39e5f680900640e7f2a0c467c50d5162b3805a58caf209022055f0f31a7613bbd5a522871cb3fd24cdc2f9ec4167eac321258ebb6475af012c014730440220478e67450f009d7f72916377f5bd47a5423d8046c550fbc8557d284a85e7fc6c022040bfe19b3223ebcb5ee4e7065bca625b772993cd0fdb80eb758c2a7190d111dc016952210269f6bffe7dfe8689fff742b8714db96fecdd6476423c06a6cb97b34d1c7056f52103d68cc53887c56abff27803897183a24bce2150086f2233158901034cee0277f821038ab375c1e415c9cd652f095812d7347488c4397c74d99e7221bcfea67ca266ac53ae0400483045022100bef648d3dfd4ae793671753b7557538cce30b14c3d77be463af4f238fa7e085a02201e8e95f84a8d65507afc154ef0cec76f5893fead2f9eaea6f7ac2b2facf15e620147304402202c5922ece710e2cd328a6f4b8f0f5c63a37590f423127e13497a07045739d9d1022034c0c4d0b6d09d9b1e91ddb6ec45abc555ba8219cb84f0132bbfb850b1bb47d90169522103fd3c39d35df9be66192af5dd02560210996d52d075e097ec0b09862af472f79d21021a2bb2b0f7aae1740ab526e4a7da23c696a90a6ec6256485f6ebe3d80068fad321023e02dba62b137bf51de336d0eb581559f48cdac1a9d2258a923973a1dcabe0f253ae040047304402205f93b55ed0a78516607e12a54441900e73f0ba54f6953ddd5fce3b14edfa550e022066ac091a8ce10cbfab2e2a0544cf38795418a4be99c55820c3ceb427ead728090147304402204c773044fa937a0e4df0c423452a93095989313535721b83b48c89040f7a32cd022010028fb2475594328dea9fcbecaa60c07d65dd6724487c30080c121d8382167201695221024b4ece84cca896d525b854c2164fe378989634c6e576ca14e2d213daa4b2e02a21026e8b018797b20acdadd217551154bf83790be0fc165772586d6b5a0b1ad29cd1210357cde708bfa540b1996d7d09e0ee975d47767f5703872544fd6d473cac02411153ae0400483045022100f90d76ddbd4e8b1a24718707d3ddb41562514416de7d815325c954c36b190afa022061e55734cf941a029aee116bfe02902dea624df8f1a17d4946716a7a5f1e05e50147304402204fea21e320a2bab7c2c9f9f3e678753512f25700928afd2664799700bee5992e02207e98bc577f6abe7661187fa2bc9c54c9c4ae756a55a60f03244ff19db237c60e0169522102b8c6f6b7ddbbadbd626bb8912302a4649af3ff898337e3c1cf7ef2cddb2d42c4210333cecd553c34c15efa0a78c6fb86e248fc816e3e4924d7fc8eedd8a5eea74a84210315d49d19f6327b5103006ae23e2d34b642f4615377f1181fe55269860cc8118053ae49a00a000100000000010167e498e4779c9bddf58a3204deafddb254ce240b61e65ddf5b96d34f0904994a0100000000ffffffff0219b10b000000000017a91432a4db311f79f8ca0939bb61d4f87e633f5c138f872b216802000000002200207f5e081fe4b81ff1455b5208507b85a0ec4f95075c83514aa675a64804b58407040047304402200dbcc28a3450a543212a0116ff8f28abc4e4ea4df5b4adb112d0a1f5ee4ddfc102204ecd979e686d4a0ac85bf6d7a179214ad3d0281471470671fb40dc1774e9b05d01473044022073c45cdda96b146cab590f97515be2216c6f386dcdaecb3a81baf547cf254c30022056f01ca3aa96c7c12fd1634f7c7d2ba44740106e5a3032e0d036b775961d3af30169522103a299831f4bf3f7dc8ac93718cc9a2a3989e6bcb1aef21fa27e63950f76a71abc2102bd6eb1d2d86dd304e62bd63c41d037e1cc7471481eb38cf184efb9b07b3cf10f2103d3bd1a49b70d645b87aee7642347b2fc108e7804a7eb156548bb8b48e48842d953ae47a00a00010000000001015067fd105eeb13cef346bc5922a0d5ee09ec5bcaaa2982ddeb9d1d9af59c0d5b0100000000ffffffff02af3600000000000017a9148d02083f6a14a3d808f2a72114018da01e347e3d875af0ea04000000002200207afe4da629dac86f7cb81f58e0260070a1c2a9b3466e0afdaa62a5fb639acc3a040047304402204c736c52437160062c1a588881e6a674bdab76cfcbf5a656271971064353bc4b0220119140654a4312e851d389339d6a4b20ca8eacd4d28dce74eb3d72dfd49ffbc901473044022067c4f476bab30a59df836aebf4a0a6b52702419056e4197f98b996c48d6643d1022059be21dfee032571a2f07b7ffae8f9e3e08cbb25b2c150e35d7ec5dadeb726150169522102a47f4dc5b946365203e1bb4f29811bd2ad1738a0331f5b9e92811cfe87606e7a2103f5b914d27f4396038526e28043ede8fadb67f52da113cd9cfc2868426f4506c72102e35257e85cfe0f3f16e6c99d90d710abc81b6d84b1241c6549bd2f6199a162fb53ae47a00a00010000000001018446f9b5ee84a915ac721ec814f4fc19c97ab26daa6c50227160f3f2f730da760100000000ffffffff02796308000000000017a914579400d812d36a27934228c13b8b7ae05a9d1873876633cf0400000000220020caa7f3cb850b0e451f6fd955db0c3bf13dd5ada720511c21743a38cc5a076a6a0400483045022100cce94905fe0556c157521d89636577d6359fc16fa905f868cc5397fe200fc2a3022025c63cc824353a88a7ffe72c3dcd66726cdb1bd707bfbcf542697560bb6876480147304402203ace5cbd63b4e8b633d9c4dc67b05dceb5359a8353c2059bc0ce139a43255ccc0220321e4185eafedc8114ef92553591f0053446452349ead62cdf75e8ce984a70610169522103d7162fd0a2c011137aff39f0dabdda968bc85f6b2e8f22a3ed8eb5f474f342ee2103294f24d57137e1b0be2efda049fb3dd1216d8059c53c6ce5861746fc20ec58fe21032ec0e2c310003308eb85e0882f2394a227106754ca8b0be63a91363d961369e753ae48a00a000100000000010107e7e2dac5b74d2d922176548ab34287082f78e06fcb0cff11506b07bb1b38740100000000ffffffff025d8400000000000017a9146bfb750698fa1f3e8d1bcc6f2162d2943b868c0a87db72370000000000220020c695c7f234382302c96f75a416e2b5f15b8c30a5de426bd6bef739552cafdc6f040047304402202a3469eb0d7a481b20303733cc0ff2df3f752b9ef509cd60e54d29608751842002206006b1ef32f022b9d01353b29c2cd2e88d3b0ea5068b17efaa7188285c1340320147304402202a6e13ad0bd288a095b170eee9c07f48b44dc0447feeb690fad91f0e5e5f801802203dde41258867ee3d243ebf1a6e36807f59af0a6e7cf3b9bcb5b260253c9c7566016952210290b4f8505acf87d0e6cd351c9fbe8a594c6cc924141f27842d33a0d46bfc205621036e38f142598781b0682957b52aad0db1817d0be9f26cf960dd4b617844a5e9b9210334ec93ac9fcc009aec0fb99e82ab494f8a86f7c7b8f7f2aca24a6197966a85e153ae47a00a000100000000010175ef122d5d8bfdff2329912c85c52c08578e8c7345dd95138647d5d40b7fac7b0100000000ffffffff021ec119000000000017a914256ae22c130be04e4aa846975fe14ca5dbfbdf0187838a8e050000000022002037fd7786aaf6e2c4ed64639d05bd310287ebf2f7817a1720c6d4b79e884baa08040048304502210099cff038dfe9470430a166f669ad4cd9e4d86129d03271509fe6b321efae61bf022019f50efacc975da60b77cbdd5ac4dd5fbc7d865e3a11f1bbfbbd6be23f8a524c0147304402202cd01b019fdff44bf2b6530d0ce85ec7b5110a06ec7962a0e8fa9d81a7f0b7a10220332ca6d006f04c1d1e4a9402617049f11f998b12cadeae62aeecf0a629c2c31d0169522102df2fe64d6d4da991927a6c26de63ec526eaca77da017e33031a16c183592622f210226a725c2d50282a0b7d023caae1da1085abc3d74be98c8eaf7c9a75423d53032210247ad1500d8b38f40cb2fbba0d75b04824919b8adffb72a9c93b6e06d803799ba53ae48a00a000100000000010156844dfd73ad902926f86790ddef05dd2304242cf66b96f3cfc0158925016a1e0100000000ffffffff02eb1500000000000017a914e763b7847d9cd50063933ebaa618b1be13363c168763c902040000000022002079bb9b1db822dbf396977de32b03eb38b84b7e86262bd3959004b9ff7edd08290400483045022100a4f9e1f6b293f844d8a3db27f5460b467af5ec9c1325cbeb1cfaf2d5ec8e883a02200fc19727c71ed45f916a2d8a519c37fc0ecec55bc160f62fa19306794d0725be01473044022024faccf0f3cf949508c2267b2efc7516a6b1bc64ad78dd1e2a8942752aa2f4fc022056d74fae5d7aec72c982e8a50b8631aa95049b6c03848c526a6ce8e9e7f08f450169522102fe028e2fa8b9c04add326ec2446777b07c335f8ecc091881ecccec0698ba32512103467390d1d7e036be2f70490c8e4a661b80ea95de2f81f3989beb1ec543d38f6d21033db0981628152fb816c6cff13a7e7a3a70df3f370f04740c13e83328a500977c53ae47a00a00010000000001012865b5b7d99e69b6cf811b66ad20550a72d27f2952c31397cae0192ad2e6d0020100000000ffffffff02682810000000000017a914fec3a9e228ee710c6b401d50d2237a3daa85592787705b4d0800000000220020af8a2f9c5003d002f8f4ee3947243904054d478d29279efccbeb60589b265a180400483045022100f43e4012135d1c29b0e71a66794a470412e78cfd90e64c359f95adaa4bf6137a022064d46ed797e9e73d2c1b1e6b8c7b3a1e7df75d42147b8956a95bea06ac891eed0147304402203a0b1cf3039bd5bfca0a0fdd199d80d69b238b36c8826c822921d5f8d6805dfc02207c97a2b226f5a20de7965a96065fc568ab8c1593dc5e71ca26d1e5336955a0c5016952210356c9df609500ade51db78ad983b1dc6888e7f78fd1a73c10da0823c2c8cc6ec82102baef2ee94681e38f2e19814928951521d90e201b590c2c96c8fd9bf7b102d6802103c1c8b82aae2362e635a8341e8c8b22ba99c318f1256c04bd68a1694d7d623d5b53ae47a00a0001000000000101e43046747526f38c26521dfc4cc713036eb144d3f8c2c250bd79d416a7dc5e290100000000ffffffff02478d25000000000017a9144370994d375f076570595668156288b85f29142487564ee90200000000220020ab45c66baabd056203d19b6c6d342d5ed084f1d06af19c75bc9570973f74d41c0400473044022015899fb8847cff22e4b8f50528d3d0e0e9075bb0720890309dfbd68efec12d0c022077f065996c5c075c9c18e2c5a11fcfc5bded9a0e7ea325b53654031642429690014730440220177174ccdcc3204fa47e17190a95fc19e77693e9a8290d716a1dd443ed9697e2022021e6725c34fb14262ab480b23c38372ffdb4643b2c4ddecea5758968556893750169522103d2024c7676a4cd119b2fe03f538ad2f11d9e077b1052f99d77a81c27eaa4648321034b7033c268c72459ec08206b8e93a9f6f1662682cfe7450bb945c0725f060a82210275f88fcdeef2dbfa4b3f224b8ea6c3ee55545a207b6d72f869d0b918eb18125e53ae47a00a000100000000010145d5ece55f85c696517a8b46b1bbc8800f983753818cbef736c74791ee826a310100000000ffffffff02f2150f000000000017a914b1d7a653884c46de9f42426fd4cda1dbb1b18de38709679303000000002200201bbd95e382d21ddd5f225dfe1812717a501b977815d818fc012350da5eb14d5c0400473044022041d209a14fe5af9715f917de751f2834ed8b78f43822279e0ef66de6f9ed7e6a022024c3b25cf1d2f7f583cda5124fbbc7b94cbf4c811b60439832326dbb02a9ca630147304402202a05645761040633bbd0113883763994fd14dd5ed622c5ec07c55c6808c6f96502201c5138d8fcbb24bf62743ded6107e5773aedfb56ce82a7b6749c06295a76674d0169522103c7ed84168c0077871de9b54ddf8d5612d132b2da707a3a6a107a54038ca2720f210310fb33c5de4b01aae51a3503ea11a6b188e0eb15b80b939a3be5e4d4ab64992b21020fa67c4ff2bebad4103c6d96878f257a601de7c7b67d535c6fd63dde5e24760f53ae47a00a00010000000001015c3fe7745959498bf826bf03fffd1513914eb4b52874a5c13b20cf9b418c0e4f0100000000ffffffff0236221f000000000017a914a16bbe6607527575fda2c52ed1930fd93c4c948087dbdba1030000000022002016dfbbb5aa2df4399b5f790dd4ea889fe99cc8de0cdb2fb743d92c6fe40ad6010400483045022100e946e9a1ed34783d6938c2d29b5c9dc809f54c0e845d02b35cc8f8d4fc1f4b4202203e743a8cc9453603dbe59529b710430d326abbcd098c95d293691cd5211912300147304402207ca5859cfa79e6aa9dea1a75ec0c62a8d813599fafdc8c77da9ba3dabc13eda8022024c6f1df65081232ed0824149acd42cb23c1700ba3bc1377daaeee9394f5d14301695221021e2ce309f78ae43730cf320e2bb4aa9a4cc64c56517a4be6361f65d140179f3a2103db36159b45e4346c984e6327fe464675a3ec5ef8e4de71d241bb5b74c94d55492102d59c7e8f8b3755d65992bdd004a8d82099c52284b1992ee5f6c8cc6b575d2da653ae48a00a00010000000001011fcf193f12c813fe1a29bd7663d98c6378e7794c1c4ae126fb2220972e6fa33f0100000000ffffffff024aa810000000000017a9149929c2e6e4139f48121b62e57d929e50c5354b54872399b00400000000220020be1a87c4431971a55da4c826fed5603776454b7ba6a7fc6de2ec1fe823de53f30400483045022100df1f2da1b2994843d13735156cf4178bf1c8ec36112618554d2f18128dc68319022029ca26e5fc5190663395f9cc8123cb5f83a4f978c713785a0bf350d8854b0cca01473044022024f29bada90e858cdc397f01c71763e94cef7b3ff88d9e10c79a35356e6c777d02206d52c2fdaf69a34a9831eba176aa343ba77ec1130a900d9df4a0c84f899181120169522103fcaaee2e09d2aa819ea8f93ee85cc4537f7ca08714cda678c9000b49fa7eacd3210325ab7b461edf8f410e52a1d43934ab1f67020fd526b8598b9e5666dd3da8cd2b210207e29953bc85030564a5f00faabd74ba57e4eec50f65c5c21a743df8edaa635153ae48a00a00010000000001010f1ba412b46f8b54d7fedd1167274e40915af991f257472e9df34b3f76c5c68c0100000000ffffffff02e5fd01000000000017a9145bc167152af659eb56e03f96fde90d9acaf78e338705e4ce060000000022002047ca6ba851e76a713abace70b03ead5e1e3c4616b00ac79da5db194a7405a82a0400483045022100b635e43fa56f26fd0ad23d52e5da7687b312d49b256360a975c8930baae79f7302200eada4ec9cf6a0f44a5765578b48716c0e65968e6b4d10d4af0aa4b27e6a12890147304402204adf3ed40832645dc0381af35402e19146fca355b1ec471ffd39270455691c5c02200a028613478ef0e76bd0b46cac9cec823dd38cdca9852d90d2643bb855abbae801695221024da23d836fbbcb67c730844b8428ff0cd477a52e55711ece79a4fcd8e67dcb2e2103aebabe318a49d2d343cf24dbb9dea85778d60f721b6a395cd1f3c6044eb1a0372103d0ab06cdaf2854b01ba61b63cd958d5e953106079de22457f3f7ea8520a4b12b53ae48a00a0001000000000101534b82c73e7ae381039fc759ad28be78eb26a8467aa8716d18b0f7845c9a1af90100000000ffffffff0251fe01000000000017a9143c180cc5c085373462ced449d7fe2a2f36e7ae7d87633f5e010000000022002077175a723857e1e17d045c1b4d13e6cbf05625e56981004568038d92b4850a070400483045022100c39b9f1cb09f1dcc08ef5b358ca8e1c673490659c5147fd4a52afc1f4074b9e302200407734865001bf7b8e04961b1818506271508d7fbde80f7eec47fc1680f74bb01473044022025465ae3a00bad39d87fa190305de0d79c71356f5aada5be7212a7bdf5c0f7ac022040eaca0ff7f078f0c245771b101a7d16277da68f6e7cb7ca56cc7a9435b3ecf80169522102a2bd6f6880393b02063296d3f3ba4a8ba018b32d742d11bb09e7bf894c6a26622103e3c683e0e7cedb3ebc535e20f0fcfd9080b9257eb541e463e0d55c05e5d4398f2103062393de8ef3bdb5c5c6e82b86645aa797f3c232073e6981e49e409b1c8a704253ae48a00a0001000000000101d36f681b4fbaee4726eb4f355742d3b2b8b1d90d99e5a4124256672da6f605d60200000000ffffffff02af1005000000000017a9148831d74373ce2c93dce78f35f485ced2a73a30a387602b78030000000022002047aa5e788c9ce02768e6e3e595f03990c1f32cba8b9623714a4575848519d4eb040047304402205c09c281a6bc0ad42f98f892ca2ae480e41f3a848c4e2072cf77659ea81ee8ac02201724e5045956ed0ff0d9c9e229d212550f8b48eb04ad014ddd7ba03180e9fdbd0147304402204435e6a8cda51c64511c7faeb73a8145c81163cb4a3249b7c8178e6fe65cda010220258b5df1982cbbf26b67627b720c6c93cd412ae2eef1485412a6c1b3d23c2c3b0169522102340a92465f61bdc49db90010babc8a1eb9db6779707206c25a638f9c090d55782102d1a1570bfe9e0ffc83c28b5ee752eefd38f0a59e595316b63963e918373bf4f02103f887f9373be6130ebeb912f5dc93223ddef4bf396cb8b6f591a1fc298920ec5853ae47a00a000100000000010139808f91c312abc345623720b943ee8fb31a212315cf99019ffd4cf3a46b2fc60200000023220020b6431fdbff041ca4b3f19f03ca4ad25065548cec8b497e00c984bd576e420381ffffffff03905f01000000000017a9148acf2a162d71eeb5bbba01f1d67a4c2c122688e0873b8804010000000017a9149115fc2109f011ce6248b324b5b302c22d4cc2738700512502000000001976a914273bf51cc4fb3c8c10134341479b5ed5124e451488ac04004830450221008201ae8a8c3174920b305f41b60836ffb5663958ee3a65f2d4ea801dab8f957602207209129463b6891d06858c8d5e09b68a212efd1f46adbc38dc37b54416fddb2801473044022067e33539213a04b5ca34ccb105376ccdf61aaae3386c20265c53b04769b999a6022046cec292be04ab1432ae2b1f5d6f003695951202b34f5acb2b5212d6dc89537f01695221034d8d13f4d0ba24fbd2aaf7161b93975c79007c3d4765eb7480e93b5f4cf5a9d42102af2c43c8668f67e8f68d4d8b004aaec8124cda4d4275f96c1d68124094e06a8a2102394c5e6babeb23e57bbad03f922e13bdcb3cbe3daca91a0a29d764326f5a62a153ae47a00a0001000000000101897e2de3cf5c976872a3a6bb3ebc95cf2fc3be66e8bee6e7a2f03c00011e4cdc01000000232200203f2f973ad0399a5fc2c8fabf0c3244d7100cb74a5cb8221204d13b88112f4da3ffffffff02c5cc0200000000001976a914a314467ce48f1dbaac36f00f63ebddddf0d83f2b88ac5d4202010000000017a914f87576872fdc00addbb9a66c1196ee3c0f059c28870400483045022100c93cdf6189ed0ad33f96d9a06ff1363ae17212d16d01bc29dc9264167443201902204019adb939920d7a27c76953c04f85409a79e06620c2d1a3e668b623938de5060147304402202afb200f0adb192bed9398e91a56adc35069edd2631a60b60b5469a7bb00319f0220552c44fa46da5075d733101a152ab2f430c3325b1c5f34f79bdfdf670a0d9a5601695221030799f0bd039fe22d758981f1bee1da8580114ec886e349253b4f205a1c4edb5b21021e436736b86d89934e3654939c13b7ac2e139b3582fc80ba7972bd1f8f95dce62103e4b3f5f5d19fa3037fc52ccef3d062e2a5053f03e0e1b4874f7d0d0b6240f5f153ae49a00a00010000000001014b8d9fe40aa564991da2c4e0eb072004d538bc8998a6bbf56dba0b64645ec7fa010000002322002059ddeb7375c1cbced538d505314f892f2b368411af58c35bdfd3c87af1951322ffffffff02686d54000000000017a91489c98bf41828049f166c08c8c74ec027bea54eec87bdcfad000000000017a914905f65fef691d04b0a0d649b0d9731f21cd303a887040047304402200ce5aa2e6c4ba82af38fb6de5f0aa9157f4d3e8bd49f991732fa4962bd814bfc022073d8e8262e37175070bd2a10b41b53dcaff292535793f60528d0aa171b70798101473044022052fc004a79df63216575c8cefce0852d1717f31564952f6f56eb30ce1efee81002203c41ed9ce485c829e905f0f976d54100e34e9de9782c69b430da34cf44b9f9440169522102aeca9337bd48bb79a4cce0f9d6cfeeb33677cdcc517e90603844dc81374dfe972102e63d817abe559ddac8aa5002a9614e39a7320edda3de24d8343ae2a0e3beb37721028caeef8c6a753557419be31577d2465dd26ee02ff842bec5fa11512d24cb73e253ae49a00a00020000000001019e8b12d6cd8152868a2fe1123c45489bc0b895285dae76bdc4747cc525cf0c910000000023220020909bda8bf36769094b6434d9954f4b3c6f3cf864a3aa89e980d48c26690c61b6fdffffff023b6d02000000000017a91480de60fb7a96bc449373b531d3bf94157c17083687033200000000000017a914837452db33aa2ea5928cfe91f9b472ffb42d6f5a870347304402206d7d9edc6ac92137d973b564f131902ade176814cc5a823b5490f9df378ea29502204af935a138b2f96f0f72fa40ba5991a9b5115336978bd9597ea17adec4073fd90147304402200b2107d44e3ba28c423dcb3dbdb06bbdf3c2166c1a40459ac6878f55528abbd702205e476013dbf2125b4fd304646730467e2b630aece26c66fd267839b5abbd6a93014e2103a04513c6c994e18bc01100db7a6b4a83b29166573d7fa5c65e45addfaced7f82ad21024995616d8a481012e926983af65fff5921db2eb099ae8306b1f4183c97ad9838ac73640380ca00b26849a00a00010000000001019372aa5d0d0d3aa5cce3d12763a34290c48dc50c6ce95ac80bce9955409a8beb0100000000ffffffff032c580000000000001976a91471070140903efde1733f00dfad410fd7f667e9f588acb70702000000000017a9140c5ed70dd0bd462ac05b78cbb27317390baea419879e072e050000000022002054713a001ac4ad258a2f9258c420e2ce8245be057a50cf023fd0fee4c76ecaea0400483045022100d91d1937014da50eeacae1cde0b696c7592bdd65fca74e22ad1f826b976d54fe022059a44653c2f01aa95eb1892ad3f78f0153ddcf25fb5ec5804abc3c5210323904014730440220249d880a248fd137bab16883418ebf62fcb585bd071b66a5caefee42511acab60220404a3ae1617d828b41451cdd12ff709f67a6fd777286ec06f17b1f77ee3fd35d0169522102c4ea841929872bac916f2b63e3910b8d50453e87b24c3be72c7c55050ccbba8e210246badc370f9caa3144c393bc723940bad41489bd4c69a13871168962a24fe5c7210260a56d05e43752e8e53d4f2d573811d4eee70aa5cc24f63f60713e391357837553ae47a00a0001000000000101a467702d2ae816547a5963e7720a97e48e43861345e3af0c143bc52671abdcb40100000023220020bc8c1dd08ab518bbf38ee4a8548b778de745b2fc48648e71c3a9deaf521d0ad4ffffffff02aec3de0000000000220020d8d9eecf7b43d964cbd8ee5d33f9523da2242c5d33a3962e86dadbdfd730e6ded00ab101000000001600149c59c8d458b784f5efd027c53d44a41deb419e94040047304402203db15a4f79f56a9098c4535b76351ea005c7ef74074cb0622766133e7312f71b0220336254bc2aceb4e6e19d0b795d13e84ec0cfd40936bf335403b3c3ee6213610b0147304402205bfc1bb3de324b884a40b4ef21d541f305aaeda5f9e7253c1ca4ec5d996cbfb502206f36a9a34d152b01b1f371ae84d0d246f5c7c46ea4509ebd611e6d1f3dde0c0e0169522103cf9e9222ee73aa873102f4294a07e02dfb625b53addf285b6a220e38c1a8716921026937613552f385276cbf26415f76e094b8a60729c84ba0ba610faf47aaf432ca2102a4209cd33d160cc2db79d86411c5b031a432a24dbae1f8f1dbde64138b7efb6453ae48a00a0001000000000101f1382c1a5b6f4dbbe6e0b416103aaa6230cdba869cd9a0f8721ee2f247d0238302000000232200207f8202464acb8fabcc3174f693d0f4cab2fb8c90579ced142f6a584205630966ffffffff0249873b0100000000160014747b9300799ce7cfb5f35b18f9f2c145f33781f188b36402000000002200200000e8a9b20364f541e8bbb2fb80effc1d568c1e298fd89c6ad2de7dc532fb7f0400483045022100de7faede039831797e00763f022680fc62a9282d53caf6547ab1cf79e265f4ce0220030e8c5b0a944e5b27412c5d9754fe918796cd21d30774a878b59f1fac25710e014730440220081bbd880aac8695d94859bfa5356f68f87ffdcb6c0bf7b80a2f4717c010b31802203af4e50e6ed2017315733be1eb7cbd218045f1bb16e8197866f132df9f15f1f601695221034cdf07622db1260b25da95d00ee5afc38d191afdca05be6344cb968cdf2a26392102421e442d77e41396e4d798d09e9ff3561c06083d996ccffe69345c7b6e1ad8c421037fdd45b5169e0463326d6cb468af7d41c0520d1ba98a9774b8b4d397cb6ccccd53ae48a00a0001000000000101ed8eb1b6cdfb257f0aa397b0c76864728f805c85fa224045a7dc14276de152ac0100000023220020fc25ca2f6933b738f93cbc7132aa0facd384f69694308b965f2ded033525c09cffffffff02b4ea0200000000001976a91490d48607747ab79f5c4b51235d5fe6023a2872b788acb8ccf7010000000017a9146308007f204b1140ab4c93f98e64adc8ab2de304870400483045022100df80e201a5130bc309f4056c40eb256e0cae0b543ca2e2646bb92f2cb9b2f5bf022038934167fe5e63367e7aa0571b189c2c7cd3cfed929695146fa55d22c19a960101473044022053dd87d4a6c76a46a1cb2af38d12ab6759906bae5110376710eeb1879dfc18e0022019d4e002ced1da85570035696647e57600f7a8d05bc6118ab9b3f7364920f70a01695221037804247a05bb43bcfe7016c7c791b136363f8946d3600d373f87fc33b6d7e5532103f4cd60692ee32ac4da0b1c301793df7d509d1c21d4f7e457c445838dc7f9a27e21037b2a0c15f2207fe4fbd38c7caaeac8013cfe397bbd41c26c14291d677046358053ae49a00a0001000000000101c3b34a307a739d8351002f1bb73428a0b20569d693e16805fd181b0256cf84b40100000023220020d5600d0fa967e2b49a03f368a4bd3fa9c3b57d93acb1bc8ead85cd159fb49067ffffffff02c82c0100000000001976a91490dd4e08fb5148720e1ed2e18952372d49d6ab6f88aca5147c010000000017a9140a83d9feeeb4651b6b74eb8dbaead606343e01408704004730440220018c937e48d589bcfd48f5ddeb89358cc9351f732b42629c86721522739d2a59022079f69ab06d4fd9761d63068a307e92fed7969785513144b3518b446807504c350147304402206d793fdc3d1786041ac8edd40b590bd490c7f36deecfd1328d77d4be8d3f96d002207b53a6477b3f3b9f9b0695fd19ed00cfab46ec0748fa12206c02f844f66169de016952210314a61fcbfd838ead184a836d123b585132c86078aa90385a583f638e6df392542103c037e5fd09d36303cd927f505b09c9a38c7c62723294a951ef0645b59089d5e4210352303e950a6e5d3d40ed3e076007fa5fcd4111225d14126c7b9681f5378a967753ae47a00a000100000000010115567b4ae999977e532defa97cf2caded55387f2861638ba27b5d9227c259e0c01000000232200205a0de772a397a614aaa5608223e8b1ada4555dd496e7bff9be2a148586de4931ffffffff0230750000000000001976a914f99065bd70d1ded7947ae4690293c90d716c125188ac6bd77c040000000017a9146ce6b914d79fb3f160e85e3b0309a8e6345c6695870400483045022100fe66035a0f8ee46e7cd8b9bb57842839876ae650a2ca6b62dda7ee02e9f443c302201f2c5e3d535f16e541881a0c6d351f9fbfef9768eb23251e0025200d9ae824c90147304402203eee023143e90a3a674f2cfe80071ec6d737a95469eb0dd482bdaaddbe146b1c02206d0e37e8a8760093409ebacc862f0d7ff14b7ecebb46f84a794f7b1dc8cdcfe80169522102a415e10fe3ef3c2e48846f8d0b73f5b31356e832e1209c6fe9a80c68e5c8b7132103724dedcedd824820803688fbec6f7670f59ac338b88757d2b8978c1313f21c702102e74401e72f647a38c762ff327e9b6d7837f9deb9b271d9260faaa4bb94c1a5eb53ae47a00a0001000000000101258edbc85cb0fc47796e80b9673b76cfcfa9a1a0c9f30e8e26bf0a3cbaa94a0101000000232200200f70f7041a648cdcb492d8927b4f69cc446fdb25559d97b9bfea6ee8f5d55cc2ffffffff022c070400000000001976a914205308992f082fdd85ab4782851b35a769c4e81088accb26e6000000000017a914c3fd26cc14b14980b33e29300092e78ea8009cdd87040047304402200e4513babc8a1c0eba6e3c163e95746e49f72c1a6b6223eac7ca9277e50aaed6022021eda6e3fc32297f33b0d78bb6c7d215f06445aeb7bfe982af4e02a6e464ccf001473044022073f8da69f369c08225eb20796c98f2b08a90e358edf8a69889b16dbbe29197b602206479703d8fb35f0a63f5a69382288cb8f29ce69ef6e244a79dfd9e81976893aa0169522102050c8a1e617a7701dc37b80fc1994e59fd52019d7beb4e6564ed0abe790357142102c5d6193ff28419483b6ee402e7d7299f38f3eb40bc96cdc7647a4130ac7cfd4b210281376778b81f579285da77926a0547223ab9b37e40af7b59cebfb3ab9026c00d53ae49a00a000100000000010162812ac498845a3acb19204386a6cb46a0a0fad03bdc35d2bb6a48a0ea9d7b1f0100000023220020a701ef8cfb59fee792561ad8262d63cc609e5fd15be127ef4ab21c1901f78598ffffffff02bc4d0100000000001976a914dc6280faeacb103de1346d1b57e2e4c162c19b4e88accbd3e4000000000017a91446e014a6a65d9f612d151d40cf5fc7562b747f6887040047304402200917bef835e8165b359ac3d292411079f47a71ef1cca3e5e08431b93544e4ca102204cf18ff05bac064545681604a110a1458d178ae45c7221576440f3ecb0d0989b0147304402205d6a851e4e23779a436c842c79779fc3a6ce604b2061d7003bdb535d476cbf0e022038f717883056fb88abd87867ddf03d9cf8b751242a57abc58d2ea29cdb6635cd0169522103d49849bb6c79d19b62d54401dd6dcd0762bfa9058c098e92eb922e8b5375871821029fb9da24d84ba1bb1dc30906ab7e01eea5308345e4ca0268f2295123a24b229e21024afa1d8811ba27fcdb7520308a3513614077fe032f91b1312afba3f9a60ea7c653ae49a00a00010000000001015b35b424f7e985ea1e9a7460e4313192f84b4d3cfa0ca73e0e023abed442d3bf010000002322002029777095313ebc28c583bb6023bff50cd66a8e20492831a9d617798a5b93f8f5ffffffff02ae970100000000001976a914a9635d3cee875d200b36a7dc1b6eb62b9c3a500288acd936e3000000000017a914b2c0a3474754352e7f2e314d06842e8df0da92fc870400483045022100e13311f00477f4460e6590be09963cc2c5515530db1318249d47d1a9f3f01b23022065cb7af3100399bcdb484b0ef5a3459cd0d19a17a88bbde23425fe22be355c4c0147304402204c4fc476e22a6b7e04b806860ad6dcf51ae96dac21d85a8cc06fba36c23043e302200fd131e3fba259856c4f64abae5f42bf1083f2dd626b50f29c66fc741fdce8b2016952210260ff5da8e385c500744545a545f24ff9c4154eb655a7ea23c30de9728069d8ec2102fc6e35b970d2b59946e3d7b0aba39a44db7f0ad57c6bac8fdc8f15961f260958210216337764da212d6df3f6f61211f95b906fb6c908fdfd4e17140dcaea2f4e228753ae49a00a00010000000001015d1b8ef7fb4f444ced27aa669f6a2960e0e210f01a868e747a5e602c9b2cab5a0100000023220020cfede87ab16c6ccd348f2f843c795d97f481891e7e546b5a1041cc273368c91affffffff02efde1300000000001976a914f411c151fb2f328cb2f4c4d7319e5e90899449c588ac3d9a9d000000000017a914ecdb72c6b479db27be383c33d146379a49d544a5870400473044022059210f238e5cf4b1b2b5ad44ecdf85f0d5279f3c5553f3af5541e4349a5244e00220256c440278e82ee9302fba589bf5690f5ccbe4dd9930acde3e14c933bcc2a18b01473044022074afdec1e6ab719958bd4aa4a829ccc97bc88b8b5d00196b7c80995cb504d54802204695fe804c36e05d2d5217c3f52b63ab32d243c0c11ead94b8db9d370bf1738b0169522103ae902456a79e278c3a3716d356cd214d5f4df18accc48b2f8825a57276ebd46321035f24260101d62ab9ca78e99bea4aa76b7e1006fc0d65259c09aea64c9dde9fd721024c5bb3bd1e6b24693816ec594186d06ae6c97d214a3c0688013946680707b09253ae49a00a0001000000000101fab45a304f9acf0973c0958b4aa72553b1eaf5c3db83111d6ee3904fbbbb89380100000023220020d23eb6b0dd757fc6b8f941d2a0a6e31044498ebb2db037389940dccbe307beedffffffff0230d39700000000001976a9147a492b0d680fe70ceef887711a9421990ef73bf788ac845833040000000017a9142f8f01bf1cf03445ba156b72e6c6f0a444409875870400483045022100962faf4c4345fce36eac990a589bc5876b60de44afa20c0b1fb0cdf3d0ee42ca02205ec66de4735a4427da11ae85504404e8240722d361fbb216a5f84801b19e886201473044022028d8806ad864578cd8a4414ccf08a0c1201c9cb02e1ab9e068d6118fc1a9c0860220672aec1f66792909e945027510692b9d18e2e9c14d02c49e70e0879e8df80eaf01695221027b2aa7e6a94d02cf632f26c22ab67a456d2d04c9fc58884d75ec2e085087e4792103d9e957b2b90e6c3e5b8ef080bb79ef92e217327d952b0bc7729af30ea4f564b62102ef5e40700091f5e5d8248ccd3a9da2ed43799160945bc1abc5a2756042290d2653ae47a00a00010000000001014b05f9129587341bb78d8fce97c015a73314e94a97bb89e473f10344bfdee72e01000000232200204553d3f35088abc4c9819db5513ed6e532eda266d6a33223eda67a3bcdfa9839ffffffff028ca63601000000001976a914edb221b0bb556332836b58bc9ad2f2533824883b88aced779b030000000017a9146beaf2c96b8f42249d12115cdea495fc946926658704004830450221008c1af2cbb6a2f7af91ac4754c0ffa427501764b6ee08b4286d296812696e751002205fd4e784cd5dec76e74cfa7739ebaeea40289399dfc356ef51133bdc98ee4b8b0147304402202f947310c0250c24906a104ee115459a28945910de3c22fc0e5e8b712d63fbac02203708415edd9e3e41936903136896276e5f10ff898445f91c995b9e905fa3741d016952210385259d71216bd913519a9abd35b6eeae65f7b6593fa40ab6a0e3f4d0aaea8dd52102bd17ce430d6cc5fd2586af42d03eeeda48fb9ea329a357212df681bbe55bf4d021024a32cf67ab108b607fc8622ce2671252489bd94c660b881ef0d04eda5f3ea6d653ae48a00a0001000000000101412f5faf0be3d041aa6bfe1771eccc614c98e738402a1fa57685c27b21ac13ac4400000023220020026c073b449f247b6ceba36a239fee26f37738b369fc959042734715650a79e2ffffffff0217620300000000001976a9142ca71ae625ad91d766df5f61ea752e4392af8e9888ac95111f010000000017a9140316c211835bdba8167161611ebb919c5c7a4dfc870400483045022100907dba4dc8ee971cc08f675b1ec57beb5b085fffaf5a8c54bad593c95869dfcd02201f89adbe02934e6e425fefcf685ef8ad841144d3978df55a1eff806024f9092801473044022078a99dc4c2352bd1fba6a9ea780b0203d2bc54069075b843ac05f28b4b91582f02201b42d9b9379da722599ac5e2108b31b75fb420e97a1ce7e4a9cf18011261127d0169522102ec23b11f07dc91e17bfce6479a6fdaee8545f45ea1ae4e8f882f88923060c70121026ae25023dd0a522d56389c8aa5f96a4d730fc7fb2def470f7a807cfd6ca5410a210298d2e63ee92fb7a0066876999404713f10eb006a3453c165c2db29641936425a53ae48a00a0001000000000101be36660bf041c90d0633bce6fe6a77a72bd83913e43dc4c58a70e8e90b14e9ae01000000232200204ca18eba7713a425ba3a70343b413ff8bcb43e6c9b9e08764c97713fcddedee3ffffffff02abff0000000000001976a9146f7a2142cf97dbdf7109d01be4f4ff8fb32f8c9588ace28340000000000017a9145449e22b7e389b95a434bba373c5a8e6bbc4ddfc870400473044022045c6fe3aa6f90cdadb884ed838a7a96a48f34849af5af6e220ea6dd0f9c89af80220141cbd6f587cd2f124c0042588e70eeca986c0456633c42d4387297df1ff171c01473044022049f8d744d370351b6d74ca12c630fb269e34e6a50a415e3592b6389b19434913022004b18300aefa19b088599c80732b5a51eb3bf6df4332e14d22657dc945ae13cb0169522102fd143e862760cbcadf9072147fe3f381448130f09393d27c55ae6c2f5b63d939210249b31f583b574427d3d5abe19e33f84a15d460b84fbe13591699d606041da0e82102d348665cec216c59d68c9972ed3c166403563e8368d763f370f4ff317dae173f53ae48a00a000100000000010162e49b92543c50cae4b11fd0c209f3abc84470dfd1dea933330ee262c2494b1d01000000232200200be9d958f65d786e15955c391a196331e7f75064460a56c2d885fa3e0581170cffffffff02e03b6600000000001976a914a8d36aec3fb1c83c656d08de2348666520750ded88acf2f6da000000000017a91456ae04aa7574f55a0e30ea6b35b2fe59685035d4870400483045022100b1a207e185c5a35f90e908a11ba1ab2f2d1d6c56852af17fe20efecac3d3eb1202202a563c773670be1ef60de088e25906506af9c37bb5f1256a84e9852b6c9f6c930147304402206ec84902ede8534852a0667d1482b74b373f38896346a5d6df456a41eaebde850220610f3abdb94d28d5b43315f4bd8fb1cb8f1439c03e935143fa4f21957422e2150169522103c8d46c1f86470dec1aa76a5df7b4467d66748b91563aca9403ea449a7be24de4210263174bef3e17f3b7268ee72c5f186456672f437b0996e5fae251de6b9813e89c2102526690c749a52a1d1e384bd2cb9242a94141dc2c2883a102f9baec55f0fb5fe653ae00000000010000000001017d87b756ca7c214072e54fec8422be5eb9b3f9f47503b6c5872182445a97cd0405000000232200204143915f309b0b5ec9a74db01e67e6bf1f39676065fc43e620d4985619d2f83affffffff0278500000000000001976a9141479bd9d80c121d22d2794dab975859af49bc3ee88ac255f67010000000017a9142d46f296b1bff166f34e8988d2ca564709b60b06870400483045022100b922afc0f96dfc5088b8c777e669413b699e4dc85201b628f45bda20217a4cfe02202e19058d33bfec102fe5ea14ace2c37f49e66fc2fd6d4b54df471127441c082a0147304402201d8bb48f3daa9065202e7c7a6c340a191ee670494f141728aa59435ec9c8f5f80220114b37b898820430e6c876c22b7bead6c2d3c1c45d23563b850dc527c49b52e80169522103794b64b98ea54b5402968edfad42fa166f9b9a2a26e2e32e5f8ed84760fd3818210201dc254ca85a36863eeddca094b4cf2c9bea3b75d6a7f0ee43a75686d943acf12103a323a8a6f89261f935d148577cc8a27181806bd791bf0f68d3f41e78ed554fb153ae47a00a0001000000000101fd5036dfb024891b190e6b535f028d9bb1b8d99f72c4f13928a90fd7e91f3d9d0100000023220020b0fae5c1dc908fac007a3723d91fab3c6276ea9564951f6c028e749195d79a0bffffffff0272cd0200000000001976a914a6ab32060707132c4e65106c7b30133e01462c2088ac8faf34020000000017a914d0afb0ceaf90ce0451bd28493e21c9c2dddfb78987040047304402203bb7c30aedacb86cc075249db1576a703c4c59f86761263aab1bacdaafd3844202206b5591fbe85b0cd8a9a20d06a33f1adf224c4f94c613e8c00f3fd1f0c13a81aa0147304402203e209b594d06c41a1f8e53f51f540d92b71df38ee2a93bd3b7ad42c0d01d666c022018018ecbc70bc8385c88c86517e234fa708086ee31773bf764e6e373ee1f350201695221030b4ea4782aa72814f786ac2086805593068e9c70007fdea3d8be31eb68de45a021034de551e72255af56a271bac0c80db57d61382d5c550f2fbe501e5ad88443f3572102705b804a271b9c6ec612454af8f97d740f160a9e4468db882fb49c625a375fa953ae49a00a0001000000000101dc3923d53122ae8395c6f05e2e049ff24d849f102424a8a3bfb89a2a96049b72010000002322002011efc455a5704af31b4e860cb47d4923b3e2e49e3ed125d60a36ef38030a0d6dffffffff0247d31000000000001976a914a08546f46f21455d9155b544292c1d92feae4a3c88ac742419000000000017a9147405ed82091ccbdbcb835d935bedaa1e1dbcdbac870400483045022100a7cc652314d6cb431652cb5f4ef3d2bc45d8d09e04470eb2a760daa39178852d02204443132110151d3e123935a11565cf8aa7cd4110a6209f6f396fe507615a4344014730440220702ba1f438c6584e1f6b82d8948858987a93b2447f650e51b145e706bbe13826022073ac1b38f8d526144aac67d13db1c3684032fd097018ecf2e06c9b43d0b65cc50169522103b0ff1e8887c22033cf48e7de36ea0afe42a995e8a8811ea54bf5411045a3e09a2103dd9074830a0cf73e6e46a5a8e2975b658091c8402909a58980a72dcf571a007c21031734af4c3d896a611c987bb9a31f5b973f87b5880df5ddac7538a50fa2da146653ae47a00a0001000000000101902048c0746eb9d6dd410d7cbabc5610f020c090096510606b4ffcb1c85b162a01000000232200200396ca28d17a8781c04d3e49e32c858b1e62c8bd88881d553f91ff4d0852bdf3ffffffff02f6600000000000001976a9141ef3aba46d7e98233e5489c6b82e634aa4159b6e88ac016f36000000000017a9143708915357f652af9c90d7f1b170a502cc0d7cb3870400483045022100c244b3246c870f52b12bb28b3316a8aa429afc4efc1023cd655cebef84b596b702201e48339f235a7bb614632fe436add07b6a70af87344309552b972bca402464ff0147304402202f06b49e72ca86f711d097e287205eabe52cd396ce55bba900541d01bb5d043802204d26ffa7bd8457ec6116df1b6d15cb5d593c4c3ac0849f938c84c3cfcb2388b60169522103ec5745b9ad0a43ebeb2ddc37191799ac4bdadd0c06bc7d9558dad55012d0e10321031f5e7c367ffc5efb70b0d805cf566e6e1eb8cc74c7137189701ef345dc744fcd21025641b29986153a34c4cf5aa3a36eb23bd4da75b555cce11b07763185f147bf7f53ae49a00a0001000000000101cd102298a3e1ed7bb9734bb76a8d9ad0a01d95aaa0b2c32677732781f690bed10100000023220020126e04d12bc58683aba6ddb077056e2f6dd17f59ae4bd41b266ece8de3dd545affffffff02a8a60300000000001976a91485c15c803fbae172284ada2a68577159a3e77cdd88acd89d59000000000017a91420063c016c241c4523d36b96a31d5c5b86bf6ca08704004730440220207e4663318a171260977a7418fc24f72433c5f9c0c2c0c4c4acf8f801e57f5f022007f021f1d78de956be82eafb74259f8619830c35e5cd8d9cb488d75ced3977dd0147304402201878d68ef7cfb7ee525717a57885bbf41b5f31106f3f9cf56ddf4512e254d4080220755e9d686f45ac99467dc2ab3dc560be99214d2bda04f8ffa998c659f5641acd016952210339dd5b0421822be9bd0ea5c780943dadd7df5677cf2c09e26597f06f20bde7e42102c4a1dbc3235f29ca7f973914f050ee6d950955f9829cd545599715d138a12b9621037aa600635b45261790672910fa08957463ef8989c7fb64761c5199398802d9b753ae48a00a0001000000000101f2d4f09b2b33498c2db0045b9cd7763edf4721b4300aa2db30a9e47d4e0d1fc70100000023220020c7ba9b24a6b9a26f1015d963ece15a2bd8e4371b8d55da218c34c002f128cb5affffffff022db80400000000001976a9142f8325da9b28f4004645aa395307dd81c8cfc59488ac023a07010000000017a9148d86742a81435334b652bc4d17ad8d391f12914d870400483045022100863b288e7c49f87dda62df87e9698729ef4e542c92af9f6e0167615b0b471fa202202650bbdbf3b07671a38490f0e4a6bc3112593cd0f94b07344aff2f8b024d61310147304402204f609446570bcf886f87a8de73dab77d7300338bfc9112a5312256bf4ab4b5ad02206e75a15536e33db1ba5131c25ba5a35cbb235a9bbbfc485db54716b732719f8d0169522103777ed4fa2e0d58bb1846ad6440a544ef45b76c821177c90fd75c3c0ce2b6fda22103a79d7c6d842c9dad538948e003dd30e90b0d2343071e897cab19b0a8cacee285210340fd330a22fb189660d9d04b4962c7c5788ee286908a795202e2b331ecc5172b53ae47a00a00010000000001017dad6c58be1125e86d27ee1c74bf276f23941b5cfba1f35bc5556bbf7066c0e601000000232200206bf416de19a878a60d7b1599fcaad88e79f20de3120601411953884ce2130773ffffffff026ab10200000000001976a91463bb534414ee988a13205cc4c852fc38d19185e188acf39927000000000017a914ec7cc029781019f6f0204632a675663d2d8c626c8704004830450221009cb413526d5fcd063b9af9d08ffddb232ea297a78f814b0fd91ce42d3877a0550220530bf9fcc8f242b40b0d710060871664c5612cf11c5d5e1c39de7ca60e046407014730440220474bf6ea7c038c594a1186cb8c24936f7de5d14c2935afae814bbc304aa19f4e02202561f1d6db6bff77f3d232a29fbf1640dfb50a8315e3ef167c3336b6126daee30169522102ab6e3b108ae7f4d3be9eeb2f0c10a7941abf7232e27879259b927bda0869fcbb2102f09eb622b9dde39b53a37564780072229596a7cdfe530bde4e78e3f5f76b9a742103d5f64a7640ac0f1eb5050a8d6da6a28be7db45e07b16190f4f7e011c4adcd49a53ae47a00a0001000000000101acd9abd7c00160557d98c6e633aca5d8ca3247f14a133926e0d338ff7750b6500100000023220020d61bd704f1fe00792f99d4bac6fc7c8770fcf42dc1c67b211d3d9d50b7c30c2fffffffff0200be0300000000001976a9143a4f771ffd44ba24bc46708c84d8213eaf23003b88acae287b000000000017a914571d766cda764be30e8cbd76b6be2ac6c48b35cc870400473044022036ce4b6cdc0cc13a21441f14ddcaed2a0fef4f13a7d880661e257034928692ae02206b79e781dc7a0b5edc51acaeceef57665157128b507d208f40aca01f05393cfa01473044022014cc9a3dddb13d50b6cdaabac7ec545a1ca82b75624eee98e6b06b5c2484812d022012fdfe24fcc25d11fc199cb925202dc54c556ae3b57bf25c34d378ac84677ab30169522103b67f3c821d62e1dbba360c35f53eea4d5684b756a7da81e718828c263d82c1d92103f947084103f042ee1af45d16428e174aa503448d45ab1354bfae7382efa1a4d32102e141e9873fe88e5a2a37d09e82d6e1b62e3b2cda0f592479d84e1c18d214aa7d53ae48a00a000100000000010143b15a791ba00e53f6cd3aecc7790b71ce0b3f16e844a595456aff65dcc98cd00100000023220020be7ddd3bcb48714ca83fd7a6fa5615a9ba1d5dcccac33e4976e03ffcf34eadd2ffffffff021877a700000000001976a914edb221b0bb556332836b58bc9ad2f2533824883b88ac021726060000000017a91462f1676a9cd5b24f5f05dda2f0ee6abd7c900094870400483045022100df4133a7eaf64d20c7707cd3e9ecfdbdef1d78edcb9b71d94c1cf9e49a588a6302204be0d205493e4db44f0735f051aa12978c5ab4e2533eda571192bfda753eac1501473044022071c91c918936d831c1ddc5c84c83b2de276a75c0eaa841f6708f25eb3284142402207d71a06b010d442ecbb9439ca1c3b0ebfff89c02901483feafb429929e40cc8601695221036c0e6f1fab1ae6e2e898edb17bec292bf310d7c8a57ff2ad05adbd269ce0e7672103d2fd2eb4f2783ad0700ab5c1ab6e5d51ba3b8468ec11fded8464d1964bcf71832103cac8e85c53f3e21998ab7d3b0a8e41baa613c99e1ffb9f00b9894d7f86e4262353ae48a00a0001000000000101e2e27fed59dc34cd705c2f36315d92f9019bb2687792b729981566041e037f6803000000232200200dc6cf3ec29ac82784acbc789d887484876686828c473dbd1374c461333cfffbffffffff02005e1a00000000001976a9147e24db633572cddee3f5785682545dac3d63d50388ac8a653a070000000017a9140136cbbb27933e8829a8a7a3bce04ec12a09b0e4870400473044022050dcc65990a16156b283159d93a35524089bf6fc5a6c94644db044dbc7d5b52c02200e68e3b5edfd76dbfb6802ee14c54bcc95d3ec831aa5a36062d4b01e09ea25df0147304402205d4e01ba6a59ca82e1634e25481ab3b7625c4a200e0976c027f940df9a0b5deb02200217f5e6368175c8604e92a23b797f0b6fc90d8ee660cffa478f06435118632001695221024c33294aea1a9610d5e60c593ec10b7b82fcfbaac123bfe4ce6ae3808a5688fe2103fd7497040f7188a6614d576a06f8392bace309e9ecf43ebdc4f62e30c5147b6d21026356d9174138ba47ef0d04bdd79f0c10669807a30f7b48def2843596e8b75b3d53ae00000000010000000001017be83a4c2e0f7369f7ef2622d72860db9c7b5ce6c403589dc417b544a5a3277c0100000023220020c369f16106794d05bce855090b91398fcad5c33fca210803a1efed18ba31e8c4ffffffff025c2e0c00000000001976a914af7aad5048b7d9138921685f2b838f432333c49b88ac10d17a000000000017a9148586bd97ab4471e84e32cf7ec71d49c40f170f12870400483045022100c2a129b3d59bb6abaa957dd98247fe4f0d5404738d03c2360641c8ffecdc8ca9022034ddc5704e730e0236fdbf1e634ff57249f860f0856fcae6d7646b7ac253821b01473044022078f6f38c58b25994cd39cbe1cbaade1f8edec29fc74025bda089a22c4b120e8d022059d00d477811b078dc8db011fe0f8de10cb9e368011c76b60fe325db24897fab01695221026ba38d2c5e98cbf994178b26565c69977938ab4175d37aab6ebc71fc4a9c1d3921024d18ca8b7aaa454a4aba771211629f2acf7d01eef0b9e5be7150995418fb9cd82103673b761485a73e70ca964e6c9b48fed779b076cb69d81d7b5b5b30ec24d1f91253ae48a00a000100000000010142094daffdb30f5e50c2c3e4d530f0da93e7dde4c3b896cf8845a28bfc6630d502000000232200208808c4e92aa3a5bef4d47f62d12ae71e9d85710e8f734acee494e54680cd20eaffffffff02c59d1e00000000001976a9144b5b31b4d1261d32449961521aeaed441901101788ace788a5040000000017a914c080b44b22aa3e3c9b86839d614edeed3d1b1d8487040047304402207d595094914be3c2024961a7ab8c69a5079f155b81a3e32ea6caefc9f781ada5022028c61835977572e0e5843649c0e2f80ac34b59f9a14a163c9ee30e0c7dfdc897014730440220725ff3a5d9a04fd6c6b1891fd8fe8241fde42a06804e7baf094f0fa09fb8bdc30220168cdbc96fb2153746a552b3090ee3ebb6dc7f19e910375335e266420ab2e45401695221036405af90d8ad8dc0b46d41a72b63fa8b5ee29cea10dcf5b87858a67cd0811c2e21026750d9523b19521d7ceb1afdad9df6af1d298c837e8ba1a33fc2de551e2ac9a721023934f16ed62c3b17d7f76fd01d9435e7dd745ec4626835a54f7004e40fff73eb53ae48a00a0001000000000101500b87ea00f21a319c3de6ed4e59d5133e0d2aa9e428d72c1e38db369927dccf0100000023220020bca7e2d0c28ff5c080150884b13eab0f755c2f388bf6b5569cf256473c5ca7f6ffffffff02e3070400000000001976a914f73ba280fd397dc37683b51e7147616b4b7cac9488acbbfd0c010000000017a914ba903b9e19ed2f0c194b8c9b6ea036178a4d3c9a8704004730440220409f2c3a3e55f8f3d9472b0ec970f500a76cba9fe2b1f645cc3019d7b8e1ca640220791120d0533aa2c88dc54ecec738879166a4fa1169c0da591aa515d6f0e02c5401473044022057ce1499dfcb2807f03e2a492ea193bb8fb117ee3392e0bc057b5757f03dbaac02203bcbb4313b346e3945004aad393e5bc9cc79a2d8f7b5dc1cd4c4be0e284fb6a70169522102cec8f5337f6aade4b4662661f457ca68c5dab0944ff6fca796615bca8d27a16621020eced6eb3b989f9b458cb320e81fee02531b2e9846d3fb0fdf23dbbbd0d5d6a421026b54c79c7e8aabf130859a05a6f400b810a4947b8b72f57e35edf1c52272f85c53ae47a00a00010000000001013a548de8314a1c97b498abbc98051b9bd3df798c1ef6cd663266c21d02211a8501000000232200203cb2b36aab06565665596089a4b89d6e2c577e463b9cf5e66ec2274b702102b3ffffffff0259690400000000001976a914d34200f99d3bd805a772bd4bdd0245520267b79688acac000b020000000017a9145e7e05a3421c691bce5325c61550eff610a1d0d187040047304402205bf69290679c64624199fe6a89743f970b11878dc1824b91a3c719279cced49d02207912b1d606619a426ab38c63d7cef375111f49cb9c91cf8570407f7d3155656a0147304402206c2c7d7d3932538ed8fbd60a85a5f429f5c1294ff8377001e5b5c020981a4e420220399f054bce042637c7ec22d15897ae2b8ad1f2046855ecdf67b69d2e64bbd77f01695221032d47b070c6b97f2464c41caef663bc7985a0522f263adbbe8cc2101a8315058d2102515df1fd625ad700a30de937016ca1df75a1d0b53d7e31545214196e3f35df3121021fbc17de6aaed21ffca449be6a26d84136b69a4dfa440bb1ade32aabcd52b9fc53ae49a00a000100000000010163249382b8cd79f37af4a795d19d1e68b097f133f38efd6174e3343f6549b226010000002322002018084b277fd882251b632f585d02ff4683c9a879fef650db86a3d0402ff6eb72ffffffff0254e70300000000001976a914356eed393438617d3cfef994317867b0f2dbb90c88ac49cb82000000000017a91480aa7f74ae58eea8fcf3a288bb627b35841bd78587040047304402206284dff14b2ba2f62291d22e68dac6d623994ca4be7eb53f1676c71245dcc61702201e75c15fc1444e824166089cdb193c976fe27170d148e319fcb46d38c4541eaa014730440220047f01986b34fcd8f0aefb7fa59707c4c1de31174a2fca3d0f0ef4b917f17075022013ccfb7bf09eac0e5757731ddb54ea5261f823a6a7410318659131d27bb1ef42016952210284a18125933d196838f7738f5d44e9861bb0e30541a7b53c7ff253a29e2d5d302103a3c257701e83b3c595e91ef8d0badf5e1744ec876a1514171c15a752864b0cf62103fdf8b95fa68feb9c6a3b57dbaac94aa964d216475cc4b38e92bec69a480938d453ae48a00a000100000000010184a5a6e6e7955ce3d16484a94ccf3adc6d7468a53a12c2ea65e83f49b69947cc0100000023220020f4f819ee8406862dbc3d624b70dff5c53a3f6c28c38ef069223a4aab3d5da038ffffffff027c5e0300000000001976a91475f5f8bac17a00596d68bc6e352de534bc223e3588ac6cc917010000000017a9144daeef1a7ed4ec828f5bb355ed89062b1532571a870400473044022068f1b40ec3cceb5b1a3c505d9d293b0b1be80dc681bc8cbc0987012b2ed14b8c0220618aa1ddebddb128e8e1c18342f54c30b83c851407f1cfdb1f6432d04dd6ea9701473044022058982d0834d39f509bd6eb55c8bdb92eee69514febfbf2d45fee98f6d60978c2022029e24bc9e6934b871412e40df5748f5ba49b1821fc7dff681012441a650778da0169522103452e97d56d588ed38c02a1e6a6918b42c879b9777b2a87bd077741dd644fd45e21024299795d46d01ca7081d1507a95704206a9fbfa6cd67c74cf8dbaf758c35fc6e21036b7339a49049cdbb4ecfe50488d2c23ac972cc34495290a76c7b59a2b6d710aa53ae48a00a00010000000001016ea1520ec752087bf04e102b25d62e00003db63afdca529a099bd671f26e94be0e000000232200201901b0fe98bbab8e93628d176f4fb633c2fc583f4245ef098d7cfddcc7786c22ffffffff02b9bd5300000000001976a914ef366e1a71aea73aa732d9462ec3d48c7049515d88ac6df028020000000017a9147be8ab6554a9d4a93c120dc12818ca29784d449987040047304402206fdd5004558c01d5abccf7dcb709a82b7c7da303cb790062262be5bec8d6a17e02200f40437ee4ebae694ae0ff7f5e200c5d1c8ef9283a946be58f16a4f440fd9ff101473044022021eac248151aad3ca55613e2b6c44595a6e3056107e26d61777f20af3309253b022008b4bd66bd6d24f7dc59d75938f848425b8bde2a65a7b53f68a32462690ecfa90169522102458477ea4254764ba8cfdd6f0471bfbf2cd6605b615b7a25512ea8c206b28e77210327744c49530583fa135cb623f660c8564ed5965d3adbdffd697a7b5dad6f30772102087a9dbf76670c0069b16b2f5ed0f02a2b969e5b101c05b7ca26c0d0d5e9f4f753ae48a00a0001000000000101848142d4e18ad43e805279abbbe08deae38c5876b23e413fff98c50f96220f9b01000000232200201204848b0b04559fa3b576270855e0bdbde83eb4b6b1379df735d42dda76dd49ffffffff02134525000000000017a91458a8d3c1710d08bdaf10f46049d737807440ad2087d3f47500000000001976a914ef53f1e2e7cd6d04c2273e7a10e0ad71d5eb358688ac0400483045022100ac4b05b9ec54bc25f7defaa89505032b9bec156e8e7bc9570709e9b390a9581002201e36e0c92d3f380b89c3f8ac6a8c4a05382751ba7415bc09984f0812e00d512301473044022063b903435a8f7803dbb859f58b6ae25964aae99e6fe5071cf9896081e2922ee1022072e4d18687b4dbbc71f761244965204e17f39077d30df81a84409df7cd2c80be01695221020e58e98d0f8154105813b74dea73b95d55912426a94956c3e1ac826ef6d4b4862102ba50b24a1f30a7a2c0ca6957948e254c1f09888b8aa8f627a9251652c7b734822103116852d43602a87a9fb153a23891477c1b485e0ff6a110bfba4dfbd7ef5d9d0953ae47a00a0001000000000101e30345c553e41427f7c83e03c7aa58a3a716b0497150bb16e87e515c6fb47f5a010000002322002007df283228ff755111eb03bf8e1adc9947971d908b63fe1c205aed46b75bbfe2ffffffff021c370200000000001976a914e736bec47cbfdd7d183f55b96e3df2d5b33f2bfd88ac1c3c47030000000017a9144e0a8d0534610c782d930d1b1fd4d3ab81c2bd2d870400483045022100ba4529073d336437fd53101f15f4c1504a563fff64172b73750db860b040cd2c02206c44d11d64464b32aafa7c508e92f30c79ec52925a86c1e42c8fe617f3723d410147304402205a3d6cf61d133be35030dd2a7cf3fc5b92a55a1fadb2f8f31c1ab0ea31efdf35022076e69bf356208d215af86cf0e0d2e188a9fe20ae184979d7602fe4d6bd27f5c5016952210399633f45ff3844204fa558005a00e7ee37f3ae4d2893af1ca761d8e267d61e882102e6c4066cf88ef0053912d6c43def2b6e71562d8d7b1547607dfdfcf5f0899cc02103aff77738193c7c7830e1ae37d7c9113bfccd1a5e62d52a88d673e48e29f891e353ae47a00a0001000000000101d4b389d0a9c54951b3cd965c73c9621237dedadbdb5637b774b5c414d5176dbc0100000023220020c76e3e12abe99c1860254770f09fa74a63c1d0d13166ec78563168259a2aae97ffffffff0208210400000000001976a914fd13f0a0680b92cbb71c24c1945e961891e1b82788ac633688020000000017a91442d3105ffa6698cc6a06859eba2939f9f99c52f687040047304402206a54fe8f1040fbd039c1a76e5099f6b0a4fa31923f10542f49894c2a65347488022073044fe8ecee02f3c69af6983ba5d1ea158c776000d81c8a3ad4745a8fe0e7280147304402203218315b839412eb76973668e13355538b5b86403ec1c7855b388aa817d9376e02200577017a4bd099bd3776b383f7c37f05c19a6663c77f733b394a08acf13dbc85016952210320c097f0c43e1d874926f59d27a79bcb64efe61fca6a45e9e830178b677608d621022c65ecf52c760c666c4409fc68f9810b437ea9fe28ff706f3adec32217c391122102fd87c3f21e7176f25e8d4ed0dc2ba701a696b454b6b9d73a8d1370e119ee73da53ae47a00a00010000000001013c351a8dd2c7bcd2af868488581f96a6c449035f31a41b94efa8ddc8157439ca0100000023220020e452b2ec9b14818c45ed51ecb199eac7fc4fe51c7c68acebd6fc077b4d7adf03ffffffff0228170200000000001976a914f17c0a4223d052af0827758a40175984fb4e805c88acf61241030000000017a91477f128db037b12d11715bc4e77502e93528af95987040047304402203649542d84041a9bfd3d2209f68ff558e0c5eae430bd971ccca947fb47898071022010faacdce970173a606ec5898d7c99f776322ccca9dd024407936c8c2da6957c01473044022057a6411165393a2764244fe4d9c938f8eb1c1427ff472b593f34777358639874022018ae300333b5945bf4c32fc8333f0bd0fe825e05f210ffa7466a380a29170e8501695221025aa73ca1def05f0c1287f0e689ebb5b2665dc5e9dc1d17fb038e6c5c618be5b8210327578a8f97e9e843d2848528d536e617df77e6a30a053c6cefc0c44f71129b6a210279a53e6299a98c24a2e73904b122faf247c3a143119f3cecbb613cabf3e03aca53ae47a00a000100000000010153c5f530c0e7ca270ef63a703d9f32f377ab16dd63bb6e6104744c3c6fed3b210100000023220020f3bcd2e34452d210349aa3aa4012f831fe84dc6278e34fa362d6a732d17701bbffffffff025be50300000000001976a914237317553123df8b75a06e617366f32ca3f97f4188acc73029010000000017a914fa12828205ea3b2077c2df5b5a4f9c78f18a4c11870400483045022100e0d2c97df8b0835bf9ee30e88abc42c7ea64ab7d25f3ab77037de8e5dc830e7402201e874f0f057c0feafb6b79f832bdafef7f03b77a4d3e8d57703d8c5464ab42710147304402204a7d3704d978fc5e5b73a875407175bbb56fb868f8ae227332941e0e84209220022017bb4f5faa6c11d6b425062ec469b1eae5e4edd70be1fa6239844b00239da9910169522103f11532c249bbca53c0288bcaca48f2bc72173a0938ffa7bec8082b4cf1d01de22102f0209bc97cc714e7768481a61913167053e850693f1813085d38fe9e1914c74d2102f006a50028d9b3c71bf2fe6a4fbbbae8829a44c4c0c5b25bcce8dc075f5f720153ae47a00a0001000000000101fb413eea331395ff2af7599eb532225131c62db2b30ba16d6f753ce0b4af352f01000000232200201e85d8d40fb4a3ecda9599024a402ebf2d867f7905412dc7b6fdacc43919922fffffffff0297940300000000001976a914fed7ef57ca2f05ae1fdd3ad948e349c55948aefe88acec8853010000000017a914d5f51421482d574ba9779e4aa23f5a7167a693f6870400483045022100974a53bd33b49608ea82e5ad743a1c42b3e32faf376b2d5fc74c426556387016022073322517626e92446fc27fdb3dc07941e5906f18c71ea22713c5030358ed718e0147304402202e9a3da4233ac2af4aebb910b101f9e33f52fbbf2fb77aa2e6398112408dbb48022041e12d5a8f8a72d8549e92dd0319dd52d00d55208919faf49d7300c0d70fa13b01695221020a22234af995d575bacc20b07c34a332371496481664ce209b30df352ddb591c210354d8c066c5dca7252c4438e8aa4a9e7b4e519bd305d65d216e6c8b1272ab81db2102d2090212eae081bd6403171ce187394c71b9572a784f05b7950c66228a8e90e553ae47a00a00010000000001011b39721b329a94d95c6b1e29d6627ae5a9a212edade33c2d167cf955ef451d6b0100000023220020c538adfd92c15f288de11a5bb54a1eb79e64aae26dc72601786b1ec46c402527ffffffff0278db0000000000001976a914e736bec47cbfdd7d183f55b96e3df2d5b33f2bfd88ac392312000000000017a914af8adbd4454a6f58309758a343258e29d403b0dd87040047304402206f2cbb26c741e4f73af408aee5ad81f9bffef7fa1f8df4a43d7a0998082ff11402206f6155021ac749fd584fb5a99a03d03cbe291e291093390146c08d55e1e907b30147304402206e0805c00313de1cc5610a4777c02e90471e2f166765b3e19966ca48bade83de022018667a83bc8d56cd3492c011d184c76c6033563e3e49460f84a7bc880a549b170169522103f98bca092bb1d08e198b51ab20453f997a4eaa8f509fa3c46d576c2cd4bbfae62102ed8d81d46c2e16fe909e3521c1b165f65d2e00a51b36d06cb8555f756cc4ff8f21033df093f68d33b580fd20afd68ce51987129829818e72daec65ffcf730ebf8ef453ae47a00a000100000000010121656b8961b6a0ba2bf2ac61343fae5cd0360e269dccfb589baf1536c352f8e3010000002322002011543eb697a5fdb72128db325d18b6fcb6856fac914c3479426a987d562aedc0ffffffff0268d60000000000001976a914a8d9dfa196c265ada307db1b66f39f4989e9a5df88acffba13000000000017a91455f3ae18de4c04133fde3bd17edd8ec9e0dd1f458704004730440220746a62c3aeed3c513e538745ce1035938a70b2a1d59f3a039fccd72bed9025ae02204708e1ffb5136d0007ad0ea4561060cd554364d0de834ddc8c4e20bf8ee0189601473044022000a2b4649a08d20732a26e4d951145dce70549eefe5614e6a41b8eff84a3725002206655e826f3fb77de12267b376ad7c238d96c1eeac9dff5cfa4d6a6cbd647b9800169522102b84d36ad27674ec658636d467a2e06e0f4b2bf82b789ba1980623327e86b6fde21027fee7c5130a89c9940cfeb405885c821c5e86fcf99b32244d2664c69cb7521a6210292097283948e172c4f2167782df7e62eabe590ab1bd7a4b0a9b49aed69a8081453ae47a00a00010000000001019ed35c6f72bf33ee5464b119c2f6a1491958b02e09cc50554b4f46a8dc0a84c407000000232200209376c6592b1bbacbd9645c2121b0a7eb393d86b474d9182fb0f4e492075731dcffffffff028d317d00000000001976a914ca3f6048bd290d5cb19e7060f8250306e01b36e088acc1471a010000000017a914eeeb95412fccaaf7ed9b93e4880129b5940f5447870400483045022100df83d5802fd58d21aae7d0e32cbdcccbb10d8fbd08a30da5017ef9754b01623202204a0e6d663f9d9e4f15e1286143a7f054aebfb586c749e94e3e254d70ab1374ed0147304402203b1e39ee7831061bf368f3e91a5426244790fa39571b500db1ad603e5eec080c0220595e8ff26c319376e72415ac4829836d2f70dd5144bf1b69b4aa66f86f4ad7b30169522102b46d005d60346f0d33ef590e36058632c13b9d32447dc0fbcd257b1f400bc8db2102860936a8d838b49eca27439bf8cef52018120721dad722e9d41dd3df841e0385210383053933b991a9065e3596dea1747266b49206ebccd28f6ece5a2993ab359fcf53ae48a00a0001000000000101dfa04b7db571b8797137ebc3943fd72cde3cd1ad4aacb2336948e70e5489f30b0100000023220020a1090de31aa6b6fbdf7ca28b08251472038d4d23f18f44dc2ab4f8e90c3645feffffffff02af2c5500000000001976a914c88dd9fe399049866de14e3630ffe93ad7e7d34588aca7eb8f000000000017a914b299b2861a9b20f9c9ddf2c43606f6c4c0ee1f4c870400483045022100fe9f1396c12583e844c248580e6f36a1f5cf3c0b99203d6ac1661d5d41e9192e02204fe872b98a1cd3ad1ccaeada5db6ec6875bf8efe14e5b986583c5cc76460ae17014730440220233a4390955eb70ab6b2313140234fabc1f5e24cabdce4d0cea40b6790c6d24002202f56ce950b016812fb91e5ab42347703be0ea6648f6761bc578b6338d5583b220169522102c66f4b5b821f48a1e8ed8cf8b9578910cc1ddd05221b3abb1c8917d1b8e70c9e210206853fe1e170b022cc22507a571c06a30fc2bd5ebc4ca292c43fe3034502e828210274b54f534bc08e56998cc942c9a324dbb5c75fd8a5299ff04f3dcbf4bfe0f73853ae48a00a0001000000000101fc0893d0c5f674d2ab662130794008607392f0a7ded241abb9c08dd9373fa1e801000000232200206e7a996f4c6d2ab00eb7eb95399ad61f8aa7a3799ff850af71b69e621a5de22affffffff02d8f32e00000000001976a914f0a3c53992872d744981ec4ce16f7c400209970688acf8ad43000000000017a9142175540f88884eac0ed5f89e42c9306d2c27dbf18704004830450221008624af8f5bf0aa6c2bd2e43a5775885366411c037fb5cef1dedc6fd612ef73df022040b532dec8356ed92e710979a04a109bc8e3a88b991ffcf8cad07d73b15b8db70147304402207bdc4ecafc2cc078cb1110a16e9e9c7058c59eff60c8b6600e08aace4585b77902204622af06c4d7366bef5c248c661f96cdcaecc064f49b0e59b88c5f27267ec8990169522102e1be5699a5a7c106f4369d14d9484ce1460c034491a54ffa1d7ea35ec023d66221032200f94b525375431a4e105d3563ff486120de3aa6d7b9982834137d582be8f5210281f3bdfb15ba3f081e40eb6861d2fc1d04a0518d7d3714c48f900428d2eacd4653ae48a00a0001000000000101902c293ff8fe7aca59fc13d2149201f87a800d00f1d95453df6bd864c5c61d1705000000232200202eec4bde6533798598f9d6bc5ad420d10c96b18cfe6c0c3ac2842ca146e3d24effffffff02409c0000000000001976a9145d864bce32f1ba552ac493f3ebc2f956abab48e288ac1c5f3c000000000017a9146aad9eb06a84f9e12a497c954f69315b6deff02187040047304402200f3bafd1afa7020869670867068262f6bd673b62c8bff9a572f777e869cb105f022020f2df995fe04146ffe6213021a5460df8d23cd0ec375ddbe7326dc06d58e68401473044022054024aaadccbe6e2fa7a1d413168ae27b48e15a375bb6807acc492a5ba8b377d02206925caf59b3c1494eaf39ab135785f21210bb55657e91be46cd6f1a918dedf720169522102947e915c1fc1c26d37fdf9e6cb80bf7cda6584c70f68a30304196d915f1beb5d210351b30c49013d6ecc69a7f3780173bf37cbe0e5fa0d1caee8a7985cf92366495b21035122e2a9949832458f7a9b37e187dd5cfd6a14ddb05273ad56c55be58cf9292153ae48a00a00010000000001010aaf9803a9eaf1a108198243bec027586006e4739e23f9e36a28efafc1b62dc501000000232200201c169593c7a73e3b8bb246e27491b6ede4491075d2d1153ded4224866efb9b72ffffffff02a6940200000000001976a9146f7a2142cf97dbdf7109d01be4f4ff8fb32f8c9588ac55736e000000000017a914491ba68df5d2b1272128a7316f84b5a61675c1258704004730440220128364d3b12b0e971fcbe9692197c745b9641119ff412c4c6af9373af4d724670220627feb824d32755a8a03a31a7a7de54c89a9d1ec447b167889b712b32bc22e820147304402204fa63ec46f9019abfc7645dac23d882f134df9f626573adcf6ac724a84cf9175022076236fd0ba3d1728470c3c34dcfc6ff50879b821bb38695572c73fe71d1ecb5d0169522103d05a8eab976d1d6274a65a9146733626a1e8c1bed333dde52a34e431492c103a2102d41fa21604b727febb5fc819329f3b09f5d2155ed3a5ee33f1bf9bfedf882eb2210220114ce384b884c7b4ff15f5409bc28bc01c74d29cd83ef6e27685c5550d6aa753ae48a00a00010000000001011002eed725b3c6d0cc0dcbfc8830366a63ecdbe3de6661fc4e5da00e932069af0300000023220020c1569bd78d6e70eb904f37dd0b183b46a0972a0b686d37b2043d1fea7133518dffffffff023dd20700000000001976a91444c629aed74397ecc1ef4f3a91972d151b50f56588ac912d6c030000000017a91403888c03eb9c6c582728d7eb95350c5c691d561887040047304402201c1fc0072d52f53f8f4103cba97f877c3004af7186c8a6e4311b34856c84caaa02207b627f80a78b724e8fc594a27d2b2f1983b8e69ed3c21ffd9987899f81f542220147304402200f2971ff5c19191ddf0d5282b1eda829419ff4050b2e1e21528833aa6acffe2f0220410ce7601e20d6ccd928a9487df1f240a1f1d38abcbc5710b39fed75def445410169522103527958de7026d6a059ecaebebb0c3e671772b26562a9d2a64725bae91079cb4d2103a2f9f308ee9790bb91725423e8fb6875f3fd4175d85e2dd7c93e167b7a4ce41921027a77c5628919e38f8e8f156575027af44306565bf4496c7705686a2233e0b5ec53ae49a00a0001000000000101e55159930d1eed94345ffa1cb200c3f65ac3f5bc694b2da643141cff8e684ad9010000002322002065f2071f3c1730790101ed3045553042412e9ff07436a868c862c4eeba2448aaffffffff0209060f00000000001976a914271cac83f164e5f54c97d60208954e94e29b2f7488ac3041a2070000000017a914de0a07bc5692bc664aa0bf5e07dfc1982c43920a870400473044022003622b7114afe3caf6e7b9b554ee461934e207fb4d1bf902c8176198ef684873022046dcc550206cf47fe4dad1435d1b3c1e8b3347b3feda618b5d2bde8407fb6dd201473044022021f10aca1d9f1ec5e42e74977329d3db25b29cab5b1317965119103ee0df73ae022055fd1247effad72892d5aadd5bd3b606f301b34c030f854e158c8e48e78d1a6d01695221028601dd0b6b5bc15b24aa3466e0f1eaa08fc37fb54ee89fbbe0e3b79cfabb415f21025ca247ab0a784392431a5ac101db53cb26401b52ccbeea1cfddaa821dd9f88fc2102ac5319733c17011b15e81102fd67b58f4abf00e008df9d00f3f930250a33cbe653ae48a00a00010000000001017734dbd4c5186ff198c1e69bc014748daf237150d57d914f8fce15db6dcd2ee30000000023220020ff1bf5a54e02b9cc6599fc2a9ea5c9826faaea83edb0dc8174effebcf0074e8fffffffff02130f0100000000001976a91497b3798758d6dc2fdf3601058e4b06cd65584df988ac6f7820000000000017a914d0cf11beddad78b5695c065d05000b4f7a4ab6d987040048304502210080f23a32bc84a1ab2a27decde3880b4ecc8008ffddb22ccc6b7e30f27b5189b0022006b2db5bce602ba0dc0b1609cce392d6fdbe5213120bcb3d8076bea63ef578a10147304402203015b56217dc537269d748c774fc018865ad883400ca7fd9fec0fd290c9e32d1022062b5ecfac776cfa1faa63fd2b6c3a5edf2303b6d3223fcc8f311d8b6ee119c9501695221038fa70989dab2d6e2f78b38941836d80b188c0d3a1d57a310f27f2f5bc428978d2102b29f6849b1466bc74ae396e549bde6af99f898f3e9ab7162caa7195e952096b7210373d164c89ef8bbed8eaaeec788d19a32f267ea878fdea41709afa60c80d880af53ae48a00a00010000000001015b4e39f31e64f10f918e2dca84e2eca910bb36df6cdd050890ae1535ff4820170100000023220020046d04bfa33725d86ae99ff2b95b9ef14d3b72432b1b87b57e76169a769b93a9ffffffff0260b50000000000001976a914f1616f738e40ee3af8aa2afc06f0f34695a3892188ac32c174010000000017a91493320b09adfe1ce6b9b87d825afab53c47c41a9b870400483045022100b1a76d999b928ee7f217b3abb6b237644248f1c8928cc0b0df0705eb2a8b628202205920777c87b7a6c7a4a1bf92268fac7714db91a8ea17024635767b5f8898d39c01473044022042bc8803b3bda48e1e78c67d4c45750bd849b102938bb15e9c7561adc5cb3b4b022033641965f7d2948c81edbe616337526ad0aba4356b2ccb25586aecfb3a5d64ff01695221022891dac645f3c3492f52ed8f981c76a20bbc79a6c52488654bd41f046ea013232102de6514852bf9f946166e28780bfd39ae7150580dfda1a8dd065ed7e0e411c3c22102a567690faff8ae92bdd47d01093ccda966654d06140dbeca964278aba6b00f0753ae48a00a00010000000001014ead6b7b18c331ab83b33a933089e66b87ffa6430a9e2a4c901f4265959b3a1a01000000232200202bc252046a82446f0d0b4de975ddd0282913e984117d65ca6f7ec54688f6e9aeffffffff0229350400000000001976a914aedf7e296ff1331ef3550203203a01f131a3339788ac19963f000000000017a9147846f5670dd8e181590bac5f4e70a4be66db506d870400483045022100a05d53ab983bb3a3c18f3d35aeee7c4d750b7d57258ea3b39bcbf005d5b873a202202d07dd59a3efc6402cd6d3784737e2d494f0ed775b182511928703beb1d566480147304402202a8f48c3db17877c74aa0541440393ae05bcf4a1068d1bff89763a400175c49002200ee7eb559368eb6283bee4700146591cf98a223d1791253782fe9632600025740169522102b1bf584c0022bb92caef4edf64b7ec3a442b373443d9fd0e77e492b343212a532103cf5aa711272a2d2cc0e169058dea6803d13768f540c8be98f163b69e1857264a21038c012f7fe07c462b1a5c9504a36fdae52451e16f5bdf191f907d3fd9faa5cb4f53ae49a00a00010000000001016f79f01857e07a031d0c594d929c51aba4ad9c06cdf857b693275a3ec13a065601000000232200204fa0a0e75caabb5db3dfdaa4ea2c54230e6683bbb2dcf2b2dd0416a0777c2570ffffffff024f1b0100000000001976a91413eb141f5ab768d3c755e283333164a51b6b855d88ac6016cf000000000017a91444fc19eb405f3712e7ed07a19228f15267f8ca90870400483045022100fd9e4dc8168f692148093ba8e01581e059459d9b9d417e0bc4cd409b6b54c2d402202dd312a1e9f458c9dbed9f9e834d74763915b7b7de12df27eaaaf5e9beca70290147304402207923a0113119b64be4b022f72b74e1979ce65dc20fd9d89098c6cb0f4f0a5f5502205d41742a298d3f539bab599656e0a3a9b46bdc042de34965b1abcee461ce62190169522102944599a79d2dd1ed8923e062243fac25b992366a9618fb224b38a47c6908f98321023dacab40d77fd82f66a9b358cd86dd4656f59681590c832606faabc2dcf424852103d4890c9f912863c21fea411df4fa143f0b9ba3d5fd178e07cbf9ec055b937e5d53ae47a00a000100000000010169808ee81ee95c2da4b9eb64dfbfef547d5229339ae012d4a6d378ea3607ad000100000023220020f5b07bfb51eb44dc98b781d06577d06ed2d1ddd7701a5dbbcb577b8cea551e57ffffffff02d01d0600000000001976a91411435632132a0736280cc4cc0f5c87acf8dcda2188ac66e743000000000017a914fdeebbb09fec8a91dc7f41cb8b0f6be23a4f7ed887040047304402200512cae9875fca7ecdb5ddf94f2d2cf2c1c52f2f012ca61e3e13b4d3afd680fd022036bb9cd1b15bc558d3a6a7bd920e5fdf1144883075a257eddbd044a703750acf01473044022040bc49b335a2426ea8ad5d2f7848de8ab0a27436af86033f47030fcbcaf6309d022070732cd7bc76bdc42d1ae3f13de606b503936bca3508ad0c5ed7e906a7ea5377016952210351b1e9978d5582f34cf8c747e7c40d83a3ef0388d336e5011bd3a747d825d1252102c931fead05b6be16897d62c8a22cd79861c4e7066a593960df6d29d07668078c210331a8673fefbff3f707265a315cdce62c21db3b78fe6e887c949b5e5f35733c8153ae49a00a0001000000000101095f8a4b5066b2ae41f9ca7528b07f700953ab57193b86ec2c464223e32d73200100000023220020e1f4ed925e4f8e46e960812747a640e0148943501bd4ee505523230a4210aaa5ffffffff02ab9918000000000017a9144b36fba26c2ac02537875231dd9d4ccac6b5cbc087f0ac3000000000001976a914cbfae731380b3201fe39672b382890596a0c72af88ac040047304402202ec4157d9e3ed08aebd09b037ed91591011453625171eba87818090109e87f45022075d21a29e2cffcd156e9172ea54d415976431365a23c8fda7774b3b2ee5196060147304402202d836b0e02d622178bc9fd9a131b753874c370c814ac3ebf39be6f98e4593b0402202f2d1bf35b14abcc9b02118432e49c8e8d63f3eabe5e34d557e19ead636678730169522102733167d81088f0e85e66b4a5004ad6195f45ffe52b64e189b470a6c5e891bbc82103f0a556673a7a8cf21a9a74a64a0d5f5af2bc6f0817893c02c276ed1cc4fc1bae21027484d6d128ab9b8db9164cf759bf480dc1f8c94257880dfa04b061b49373366153ae4aa00a000100000000010149beac2576fa9a9ca825941c9069d10e4a4a1e2b576e73716851ffc51a36e0b50100000023220020d5085ba1d9cb49481967883a7295bc49c447d3ebcc9d8162b0591d832c6a9527ffffffff0290ec4100000000001976a9145733dad17d050af4b082041b93ada187f55a22e088acaf51f8000000000017a914556a80553a31b660a622d1eb091c098755fd6eb0870400473044022066c75b492b51fd13c46285f995d3cb5e010409e25c347a8d6e973df3a9eebb320220275f5fa2b45011b857dd3ea2eff9a1df44605a7bfa8b5907ede6db13519717eb0147304402204c8e21cf6ccd66853a81378e6b51e0f241473dbdd8865a74af7e2c345dff2d180220520a277b5540b91ef303a219fb886d905c39671102368476b241bada4ceeea9e016952210383ed03ff32740790861550830ef381708b360aeda786eca6701741447ff5232621034e7aab25847dd6fbb52c3c229c02a71716a77d6a2168332c4c0759fe02c4b66d210303b99d00b8313a9e8fa762775085220a161ea38c1023320b380bf74db026785d53ae48a00a0001000000000101c7a3f7ce2a20827085f4c6181c13ad5a2d544439f4daed98e791f869d9aa545a1300000023220020b6b4882f3d061553641edab1bc7075890e558de50246732f9824a3b27abfe816ffffffff02956f0600000000001976a914c37c70b554d09b69686880a4d7d551a61a4ca1bc88acc3904a010000000017a914718c5cf2497d5554744bd7d1ca8c5af592de0384870400473044022053a14e9c4262c9c842cb4a2527bd24e30b0ff27d1b664f803bc18b13808d69be02206f6a7a7aaca7b18fca085e4a63fcfb22157a8c4838fa01f0a8d3a69507573e0301473044022050f96d5050d7f871c271345a5953eac6e8aab9965b857dfdbf42f1b18d3e5925022069d0640fe97b54948a2ec5677a615992c0f87809aca4a23ea5f1c6787132d2ec0169522102a3153b85c0d6af6994f61cba649b2422aea7a6f5a89141384ed62d33b0e4623c21027b84b25fbe9c07e72c2d2d1bd715324e226f6cb24bedd817941036a5359cc0242103c21932f6e4ce7550fe0e0bf2b5bc7f1548bb71b28f1517b47b3214656f5899ce53ae48a00a00010000000001015e6cdeac23be1649740a167fb74c45163572537dc32dfc20e7820bd600ef413f010000001716001461eef5594b4eaf3c3ac22d00965e83b17478d706ffffffff02190201000000000017a9147456f77f1125236af2fc39cf476b22da3abe0c6687fca70a000000000017a9142303b02848fc9599e599bb639c3e3672c67250b98702473044022076db6d0f0ea543d44c335094794aa039c7a691990ae7508a66cb15a3acbcfa8202207412da106a040e22c7971f685dde96ea6edac0ec65c9ab384601e222e169838e0121020732b51ddce62fc72c143a3a9c0c9f51732a3a1a6d2eb6861fdd44217243d1b100000000010000000001016b322077bbf420f262baf0403610e447c1106f3d3ce0c1e08f5c88859b0c184c0100000017160014129bbc3199107a6f4b195417c9e684c477e219b5ffffffff012ba30a000000000017a914b65b74f74455b21e077a7319342c8ad886b5fd00870247304402204f4ff23eaf9088f41826272afb1f9b355f33007d6bf4e56db3acb10f2733d49b022052b5445751b1f95a21b1ca62b59749d4291e6ec80d800eaf2ae4c9e018b0c5f201210321f72bd8009d7135eac4367762caf81a78f6099507c7eeb60f298326ed3a807500000000010000000001020cc3d55ad5cc55b876119bb56f930a1454efce33c7e7388f24c426150b2fb17c0300000023220020134957ca36d83146e9772e62f11bcc21b7846e70c0b868abe96e4296a09c2c59fffffffffc7daf0c5351b1476287d303baab1ecfc3696279993f82cdcb15363a6a00c49501000000232200206f7f240102c8673efbc0f6d1b98863d2050abc2c8776e3ea6114b0d87cda341cffffffff046de90000000000001976a914da10255d296ef746ed6b2ca5188001c1a8b5501088ac879903000000000017a91453ea3dca4912d22455e7391baf280c48d2fe7aaf87d3ff0800000000001976a914584276e2bf7bdf5ece789d9eb5ef396d7a68ff1088ac40581e000000000017a91441da14f83a0d5e2fcb7360d4aba7520b06ba6a1d870400483045022100b0fbf7a3ed5eceefba29b8ada5043f83884693e533e02d445a21177d0cbe917202206372b89bb34c74b0061c2ae4e859cc9a9715db9f1131931945304a8e14521dd50147304402200a9de91f7e3077e032b937946959f8de13aed44e6693c5863b430c343dc90fa40220191aa34c781510d6cdb8a9f873d2a7456ea955d8cc38b3766fef6bf5a2fb6d6b0169522103cf2546f76b583e5a0b6846bef36ad1ac7b5d89e44616cc3708d7944475479a5f210314f81422ebf594c8e493adb8c812a014a97a03bf553308fec31f3bdaf32b05ea210372f04c58ec4a37d9100072414422f8779ad837807756a78da17a33b3dc04400b53ae040048304502210082c9e492cb7cd68cbbaca4e6cb98f78cc76e8572508d22c2580d5ed0e46a83370220718d55dbde02046a98bbcca599a327f1914c61247ed19fcb3c53a7bac3daec7401473044022015dea5ea5c11f388a8c20ada2993336e9b32388c470dc024f39de840363b7d6c02202a82483df2f10060691777be45585b1b48c124b1e57779262c4f68e4820b8fe20169522102ed1580811cead31cc8e13c08b182877740d5f0c27c9a4d4b1f52e08f6846e16921025037351b339b39053160fe390d8c7fa308fc51e32efb24ff250ebbaecc87f3572102b770599d07233cc8270d914f834fd13e15554bf9d0579d229cba9b6e2f39d6fd53ae48a00a0001000000000101345a073279a95cd2aa739ef9815e2f320b1e5ed7908bac91688fe00c8544f9b5010000002322002092e1fa48ca73f07e278a35b7b06cf48a6fd47bab097ee0b3825177c30177849affffffff032c3600000000000017a9143e175d556df4ad29e81d4f1428ecc36c19dd4bbd8730a654000000000017a91453f9a3090d27040166c017122c4e4a2f010a0939870f4c57000000000017a914f968e20eb82158ed51335227064d497f743d443c870400473044022079c02b36776d17c01a955d53c1f5826f252513212b7d6491f252ba0e5012270c02204d4afebca4f0dda9a6a7544dabd4bff50f7acc6e9fd3c62983d16d48a9c5e6760147304402206f61419c07acf96410d96e7fd0753c2dba848e7da3693fa9037f785795c028d1022043605095831146225b5726bc68df834c0e6f492c3a8187648eb64ccf83bfc01101695221027b66f5bc1ab6d60bcc09e1e36f587c2f2a7b96214e9dd795a5ad4807eddbd9882102944891b5ea24c6d51eccfa5195b9a59ff1e1c1a87d0a311e5fc882a070f46ba621039773b02c1b540d795429d0006101889254b0fe43e149db3e61f32e29edfcc10553ae48a00a00010000000001019bfcbeba31252f027509602767a11edfa66ba0a3607317653143bd623701ed2b0200000023220020303cf21556f518184ea541113812e930910bf7a3e7aa3075eaea39ad771c9135ffffffff03373600000000000017a914f8cef5943cef4b4e35e2bf982afb51bec526d11d871f5902000000000017a914191e82b09c3376c678f12fd996eb099a161ee1bc87bab654000000000017a914b14063a89aa602c00da1aabb619e7ff103969e9a870400483045022100e76edf62755bdc05e99678ff429db5daf23976b79c77c8162429d8f30d254a65022037948d1abf05042e3f75ca18bbab5b9319cb55f4d9e704e4126584addefbc3910147304402203fded9da3b5812104af28df2302a50d9692018e9462090fc994fc032aea557f402205fd857447e5593c8875bd637865eaf86a3fa2c004d6a19756a2302fb4bb9c70301695221035d7788c081b021144ff6280345ee6695a57c56af4ff39a1541dc37a81faaa5d9210210c7e4f8879d0f3f733eca1f7a1e0f0de92c79ab550db616f8d1dad210f1b1d62102b56ffd1fe3ccc264e3c2df650daff25f299e16a82b7d02b7d3549a40c4f5368d53ae48a00a0001000000000101b95cfd7c08e80b553ce08c7f0734fad174a273381acdbc8ce273891b3b057aeb0100000023220020c3e19bebab3838512a8ad3a05acf5cbf0817035f29dbeac7e6868ad0f90b72fcffffffff0370270c000000000017a914393306f9d5a8554c304c1a48c75fc0224d382c318791e713000000000017a9149bac987e313cc6dadc9064bcca9f76a3f601a99c87eb0a19060000000017a914bf452c795128158c2cfdc8697187e5e6ec3292dc870400483045022100ec298d1b86e1d93bfd2548b52230233f9d3399609f5a2e71a3cb7c9e0bf7840d02202d2609eb37b1a9b22a7441d5472286d693917721a8913b8a0572383ebd72a312014730440220016174090e46f7bda86e5b0546a6ab030242d6c5670ed8a0fabe5f43e22c86e602204e80f046cead211e4627d1c4e4195293cfaeeaaab06e790f4ec0750ffc64874c01695221023ff83c24e7dbf7b0b129081aa907056497d09fd311c9456f67ac5fc4d6338c862102ec40ede04fb6ffc1084e92043d51d317478a908e97ccb16175ecff6d00b2424a21038340f65a55f20dbd502add8ce985b8ed870d0b6873c585465a22a0bfa38c9da253ae49a00a0001000000000101a382fc9757f9c023b5ec45418c0f9e966d463e74c5564c27ed80056364adeb8a0200000023220020770a72050adb525f632603952f2b734e7acb199357474e56acf74d52d90b260fffffffff02804f12000000000017a914f8a284495a1743e3afbd8cd2d87d58a8f3ebb8768733b606060000000017a91440264290b5003f6a7a587a8967cbf517f349969b87040047304402204209db97436f29303dbce19f24cd8dd1b659e78120b377653847a9b5073df37d0220508b7c8ccbd9be4bc26b85d537d29e134256470c413ada5da9283e412e9af2cb0147304402207648437b499a4cb2a05526419e356a0b0fc713d59648fc6706a0940b5d0107ac0220586709a4b26f2b07d65ee6130ad1693e767071a9484522d553a26d00ccac3a300169522102ee7b2ea417cdea1c7d8bed32b636ef5deb9221c99284a739894bf1bda477bdbf21030717dcbf66b65d5ab2e137a802a5c01edee696c63d03f65efe746f2c933d24f6210201698c869a85a73384187e02192f2282136dbfd1c169d807b30b4bc81694770553ae49a00a000100000000010193b1cd8c2265a00c43aaea7b3608380d6ca62725b77ae1670674ae31c35a2a0f0100000023220020cf9ca70ca310fcda01d30a8ecdc8cf6f7f3102ef7b65755453e0137d4b8fe193ffffffff03e0750100000000001976a9146dd65e7237da6a32319cbe1c899799bcfacecee388ac1fcb010000000000160014e71ac7201e07dc6d353fb4690d954bf7b227ece2139a10000000000017a914dc6c8a321a983617728913826d09f530a6db8c46870400483045022100be9d9514a8573b5a0e0ec46598f00b8c66e84fe94e15457a48bf741820fb6475022040b1a8e8d798028f936c8b23cc45c95fb519e89d93b4d1bcbd058cc5d4adf1310147304402201117aa86a6fd4c3c8b91f3db9a8ba85d63ba5b5b840e4a1614a154c403c09da802201bb1feded083806910d218efa83054f20f19c9520f5723e55f7b856d4f4706290169522102968671e508c4223b08606e99180bfd6eaca98171a6cb55edfb42d0245e687367210310c6589f7a587b498402429fa4d35cd8bc0638f73e766f807aee18463c1e4b15210214c2da3396fb26a52348257a94d32cff9b43cf69b824793b426fd81b173d43c353ae47a00a00010000000001012a0b40092ce284a63db128091e8afdac721ce733e1e6edca9e5f63a48ec0dded02000000232200201121cf85d179c1209fbe641a73d4fafedfa8c868343ebc166e8177a39b84d903ffffffff03a7870200000000001976a914880ac6003505ea057c7af66144aea571ef3bdbae88ac91f071000000000017a9143e8d259bf1214fb89bcb5c451f60f7b5c9a3459087b15828010000000017a9144679b07e1eeff03e2a5993dae2da87a402bc7e9d87040047304402204149f5d9ba0b29d2b671dd752ac2abb07f25eb72473b4ea89f0eef7acb21b4ff02205b5f3e1c33df519b158cfdf6161fca411084c93cf79a60ae3207b911430919cc01473044022028bb8d69e171bfd1d8a07548606a074412f677cc584f52b3504e00417eee011302201cdf6e2a00bcb4d59a64b9bc7ae691e423710249e7d9a972481f8a655fa9325c0169522102e79392e475e92b3ab2457aa30882b00903a1915d663d18d6e75160914937727c21021b7ad0f9248a1e8e0d3c53c586bfdfac0d737ec731172b146b46aa8cc57e1e012102eee29a5e5c46843a124263f7a7d6fc2c1dd92e97095e9489607263795fe6b12f53ae48a00a0001000000000101b694c236cb5faab70dfbdca193d6f8b79a4939876d3c05b48118f13f96656b9f01000000232200205239aaea049249f12900f2774b1428c357357f5ba14b813d95a896291818e2cdffffffff03bb1800000000000017a91457e70bab7b09ac19e12f436c5fe6823e1d03fe9f87b8a52600000000001976a914ed1d851c7677852eebc84fcd681fe38ff4fdb4bc88acdc2ee9030000000017a9142255072c122a3a247300255c2386e1eb939f76768704004730440220537b8625321bc2f4b34d0f5d4b0ac30116279a1f160c57835454516225d2f498022020676b67351c2e01dffc23a020489b35e898a51f352ca04ba248672640006163014730440220531473726e5d26bffef73a9931f96411ddfcef7d414ea03764b0072c3c763af402204159b1d76b4ed3063ec4d1beddcf49563a3ce92e45356b1f79bb622f98e77a120169522102dc7c6bb577ef25aaeeb21a854f6d33b9088bce01c8b2f05a898014ca8f25e6622103bb3b1ef89ae530c709f7f661555eea13350c8221a15bfa9bc445c76e220515462102ed0d6650dd6eb8edde27dadd55cc816ffaee46fea12f5277f2c7475c29e73d6853ae47a00a000100000000010136e81a18667c373c1a3871a984b8445eb15c00b7675f7529d7a815a32f1b0578000000002322002098754ae11c5e23366dfc237fea9b889fde11734abf7321260628b20c48bd6333ffffffff0264305300000000001976a9144e2cf9c86d58665d5587276416b28ad2d43b8b9688ac94e7d80300000000220020f3410dd80c4ff42eebf9e7808cdc4068b1f58d5202b5e47cb7114755d621340204004830450221009f6ed60083bffefce07259771445116247f220f7506b5de94528b54086ad2699022021ae66771d3a9df5b9ba7f87abb583f17e335a056ad06deaf43f8835dfca645c0147304402201e429d8c2eec29483cb8fc3b6432ae888941e99d2638635392f30cc9427ddc03022079c1c5846ea22730f486b169d68d579664efb6729332a1bc0c1caf116dc35e1301695221034742fef0e40753db2fba2eb4e61740ac13fa4c8154a6677c951fb47ae7d8d5842102c4f2478aed3b8a519cf05f9277dac841d226d4d5688352de7643d9a63179581f21037ec1ff086e8f7b14adb5654d897522e5f34b086b4bfbecd026182cdff7bcd16553ae48a00a0001000000000101027434ad9d151b01094e9797518dbd14c22df293cfc6385fb44c99a9e7d1518e020000002322002082fbc7463f4ff79411a83851f6ee4b4b2d9b0fe65419d0925b8aac9fb22a9ca6ffffffff0342e20000000000001600144214ed91ef661530cc0c2b02801f37acb02b2686058903000000000016001418b472efd9ec92f33a8487c59fb188d1b518a48d10061d000000000017a914bfc75a83bd2bcf820354344f545c12aecfbe9748870400483045022100be991fba25158712b5c710ef21dd640ea122d997fd2699e80bac26e61139870c022032a08ef8bca97e303306573bc4ca833e7d77194732eece0eca1dd558beb14fc20147304402207d176bc5b51f87a466048ec9b132a6140190da5bc3fc804d2818f883c8e0d817022060b8da5985893972a23d3b7d082582841f7e13e398d1835fd0dec625970044720169522102d098f11abaa103f09f2586577fd1c725db505661610533462487b72694667c842102bc545a9eef196bee7c17fe2cd84778de1647a5b3f26e8b78cf5816f0455582ea2102689e663f809bb43c4c14cd585390ae025e545759bccf1ae4c7b5f9bc1bba277753ae47a00a000100000000010115a0694a9b2ef3b1813302b657f32aff1eb6a906bcb2dee6aee930f3d47dddfd0200000000ffffffff0375a101000000000016001445250523bed7c1aed4fc4dc02b95674c3bd68e2c5e672400000000001976a91461376ab13acd91de093aff2f517bfdce239a417c88ac9b9cb10200000000220020006c6280291e42d776e058c8f1557955bb47cdd850c97f9b0c341e23d859513604004730440220376141a4ab0550d47aa505b06a30a7817f9c645489cb6c93db3ef61197aba5cc022068c37acb2c4481c9dc88a0bfe7f7dbbe1fdd1f31892d39b5e8e34eff39fd4cda01473044022027fed6e0b8f729607f13b475012446c26ce8c70a48184e106605abf6375265d502206c80122e6885e0292769932335d5ff7bda1400c6e8a51f68b00077ef77be0208016952210248f94ef70300e83d8e9308eb41534fdff4e9e53150b63bdb4896e6a1f2e002b02103b5817e913a6ed8a9373dae8a92c12f8964121b6037c7fa7941991adcda88954321033c99cc373707931965677d8050e0935db231f051fb1771437f493c3f0350638053ae48a00a0001000000000101f704f02d12c350d9aacb2d25dd147fa9d084d7f2cdc125fc23de22c3d2622fca0300000023220020e0068641ec24723deb5721fe211f27afd34ab1ff3f581a39ca32ec06442cdec9ffffffff03187237000000000017a9140ae6e964406757c8b24e1ff0477dae1859af5972877cbb540000000000160014e4fae9ccf17fce1c1afce054ae84c89ccd8fa16839884b060000000017a914ca4598b31c2bceb987311f05c3d29bed3cab8cbd870400483045022100b70a0aaef5e9822b657c3a9190be7bc62c2137f59162c7efd2e639067c262a750220752933ac0d99b0a1516d0917e75bbda67380621fcdabcd55f9cb940d6008da1d0147304402207954cb81b9c70a03cbd191fcaed911e534b8085f7993e790097314a4d683c59e0220592dff15ee1d6e0ea9dc78829155cc799ba74718d8bf782724056deadabe9a5a0169522102e3046d0b07801dbfc98612b00b2e8561755c8f226fee11962e81fe47fc21322921036c0de09bb23a7c4d639daa375a89b23c1d68c7a208f90492ced88d306519aaab21032453861a8b03314662abc278666f3670ea9fc6847711a04e10e51c16eafb8e9f53ae48a00a00010000000001013a0b752964c4aeed01d52653a4aa716dcce3f22eeef53b9acd109d35d4b9a50a0100000023220020ea857579cf812e752cc3d315b825ac640eaabdacc0d7e568c4f2fa5cbd8636daffffffff036ae5000000000000160014ad711b5122b47fa28d015327294e0b2d0cc4124836cb01000000000017a914ea2c393253d3b3f2e16f6d8592a753ae835d519087f71f62000000000017a914038e9a6535db01e7f66dfbf0ec212bfba29e2d1e87040047304402201d220715f16b6e47f01463085a71e30456509eec83a30de88bc69b7702c7bc220220583b5048d2ebf9a48bf0d6273228b65ef3a7d853f1a04f465d52df2f52d6879b01473044022038403ae2f8c4955e4b4cc4ee45cbc36ed60e3cd51d32a47e6a847e6dc81dfd290220623aceea49c3b6ae2581c384928b2cafd62c59927ab0beeebedd55a32666cc4a016952210298930999aee431b9e5b4a1aaebf65c4b7d1e7679d4301120c5585c1e65e0ee4321032c12ca03ddd70dd4a08fa7b9872c5888c8f8e41146062926100d2b69f7585c0421026f461862859bfb96e47ece97c8c30ba3b71e3a1e0cf7bd9c9568fc167324ea8353ae48a00a0001000000000101d58bd11d2cab48075dd20b85c6a53e367e743d470821481599eb7f38b463654401000000232200209d8980c09ce19c8f2cfae789ce67a1f9497d53cfb43366ffc3643afc34f3be61ffffffff0309d001000000000016001422113e5588d016aa4d093444a4955653fcd08e2e8b9103000000000017a91488b63722ef23b2797a9ecb98a4bda1f1f3091488872d477b000000000017a91411b677c697a909bdb02aa92b0d9f753e5065de7e87040047304402205a2efc43de5dbf6f8c28210d2431b34207795c119963eb027b9a53525869ea5302200fd14c34d69dc10b3ad1d4dca4b06448e92a3d69f82e0e3f24aaeae029448f450147304402202cba62ee1e9e03c2db19109356ce1460bcb70c025282331776598f6eb2bcfcc602205a7b94a4ed1a3afe1fd6cf48c6fbfd6313a79ba62da9e412863871b21ab78e2a0169522103bcbdedba29bf8c94ff2db94343da6aa2316edfa272a27a1d7e7bd682651a21c32102a2782811176439282036b202d71d1d4db6cc3a212678ff50eb9c02b0c9a0f45a2103db02a2a703f98d3f33d19fb8c5b6b06204df1d096c2b9a3a982e3cef646e126553ae48a00a0001000000000101c15983382938b5892d3c4ccd60f7d7b3c08014eda6fd480a53a83148872c2a460300000000ffffffff04be1200000000000017a9141dcd65f2258265f15151cae4cd367bf305b00ed687ee4b0000000000001976a91410dc0762ab8232a2defb95fe59b83192e79b0cd088ac57ac0000000000001976a914d7e8c4e5bdd1c649df16b40a96221bce8e2d0fe888ac1d574204000000002200202c9bed9e7419f68603f7a2aac2cf6bdf760048c4d41c6bfd5e139db60755d4d7040047304402201e463536766d8b72a1d27753ce3e4211a8aabef90db55d0acb1e212bb9594008022004456882f63ef2d0ced7ae594f0a6224ed986050015d68cfdc76e1d133cf35030147304402203165c4f49c2d2a71b0607cc329886f63971c6e153831f09f4f4af45476165e0d022059eb029e6af0ae06e6312de30f5e3d7dd44beb8d742670b342c9174f65fda5b70169522103ff99608d42bc463da3ea374519df855049ebb79e5339800ac852c9a0dbb8d5432103faca449d83901953fb8dbfafdd40a1926bd4150c2482679af57c0d1d5226a60221027cc9930ffc86cf3d34e5d4090576bbf76740bef4b9b251fb6e5b494c6edea20853ae48a00a00010000000001015174081a64e18498bfe8200202f1ea80d356287cc1025f6251d2c6500dc235d800000000232200207fba0e1e9e41f2e3667e3c7168299f5be3e64e7e5d5f47d75fe0c18f126376e1ffffffff03525301000000000016001480562c44d8e881591244ce178a982a901f472098439d1d00000000001976a9147a2ea9b297d60af7b4eab901a3261e13e06a862988acc66d4700000000002200207d0b3fa23a641519456ebd0514478d0274727b5113e5244c405d799aa0e9d144040047304402200ca43742d411ccad3631e955ab03dea90485b73a39be1b7a4b69ea8348aaa5af022016db0f529fd4a7df0bcd7d4b338b41be2cb91fd36da18de51bedc292366f85370147304402201ba1ea233d66ddf26eafa27a55c79df9c4606481007e4b8bc2a7c217e567020602201189c117d508f8c19ecba246f659c4edbb1bb1a6f7d8bc350c86f642b17563c201695221020cc11923393dca06ea649e71a283688cec0609aedff6df57c93724453ff0bba02103b55839e9142631fe85a41723895c93c02e811a282ddc5dc1449f07dc2565dc1a2103a0c214e0843dd20c4484dd4f55933ca74a91f9d5314e66c81e25b214a1aa325653ae47a00a000100000000010173c1b57c6591b3cdd45051c197c492b9b5c6e0a0fb4aa5c90219c231930a26c20100000023220020f2c6d8c6593422f12a67dfe2d779183cff785fa109cb21a948eeffff4f5c72cfffffffff03a5900c00000000001976a9146d7dd67cee9ded13a5ecb33422fb235254c70a6d88ac28011100000000001976a9147c54087875ab44c134611ae66e256ea531c9d44888ac086379020000000017a91481b8b6b88ac0ece6d9f983a91cec7207961675d9870400483045022100d59449a3b26520b475eee32aa14b4aa89192f3f6b281c292b81e129a62b288940220330b86a7424de371692fd1ab167f7570ad8e7672970e5f9f3c0855013b0e5bea0147304402201bd2a1cc1be61195c62fb1869144be8a1d2a0dcdb0672d756be8ff60341e8d2102201351a2f167a8b59182a93be6c6442a16842b7bc53049eb6da8ca294dd87f7ace0169522102492f7c976205a16676acfae5bfd9fb989331f0bed73ec220dc9632310912959f21027726e14d50ae279af6a32f6f89a4fea654a592516d53943b5ed9af545af532c121027b225e0993908d74e24ce2c4e545f9c36e2675f22618e391fcd6615d675157fc53ae47a00a000100000000010181a9af3764fc4c5d1fa87772f78a5156ca5a8eb4e9d563a8ecc3b0e9f55223050200000023220020ae8ab26f479746f46aa2abe873fb94392babc55cdd3ad6525c6d86b86c2bdc1effffffff03309503000000000017a91488b63722ef23b2797a9ecb98a4bda1f1f3091488875cb105000000000017a9140acd3e9b0b24919249aaf113d5b4c39ed4d5420e870e0da7020000000017a9142bfb90879e50d03c6907856fa5cb7dc079c299138704004830450221009992cd2acf058bd8b7262b9400ae222c351ccf73aca500dd428ebb2dc552a83002207c80df4103f4b01c59c5f68ff0bf3ca784f4e7eba13114fe0407e5f1222a7a5c0147304402205981d0c15c4b13b8200901283cd3402473cf6f0156aa6ab8a9ec6758a125383f02204afd0d16e6cb235862677d7adfc8e6a80416f963da7e5ae9b4899d7c942541cd0169522102477bf1db296e336f2248b1effe1bdd32e3f06a49495bf89eb1fbbddf1194068d21020b0cdc9ff3e82e8e3ff4eb36ce427049c988b7f27096181ae34c33ef5953c0a72102f45ab513381e9d323679a1691cf4bb508b0a961c014e34f495052bc14da49c5b53ae48a00a0001000000000101ecc16ce21af56e83c4db9f3838dc3a47808ba16e6bc46d8e2a622057eca4253301000000232200200d826922265b6c3e6aaf8f2894e80ad9df5761464ee7170925b6c61af0bc8f78ffffffff039b9903000000000017a91453ea3dca4912d22455e7391baf280c48d2fe7aaf87a14d07000000000017a9147f73da4a92f055bec34cda307d7bb0ec10b6af55872cde32000000000017a914a7161abc53f0c592b1d1bedcd5d33751bd8af8e487040047304402206283c98daad48b80b31eb038cb8653124af209f9d00e0fc236c345b7456531f902204a1a41395c2a279c9688c69f75da000fc79f8f030e6ebce45f45f422ed8a6b3301473044022052f490a2e605c11f1414ec28deef341ff01ee278e3d74b086e86ee28d80f50330220588582b8c5c330eb6f5a8ff334a0a3da22f6b61604db0034f65a22b0b645097e01695221033e8b3e7c59b9029b25d13c8eca9d16e6de3efa7ed6a1fca37a890ad924f1a6e021036f0c54e56b6d96a00b50f18ddb67b6d8d147a1fbb5dea4b0effcab65bbb831902102c0f6f43b1945f8f219e1f6f122835ab06f17df9895b9261d56a53d861bff63c553ae48a00a00010000000001016340d26d8c5d8608b7c69530decd8d11af01f63a3f1ee3c39d27bb10d8283b0101000000232200204f8bd174dbe7697ce87d8be00d24a199178a36c309d45dd2cb6bf115606649bdffffffff03a86100000000000017a9147c6ede017e559055d4bad7443e1cd6e5f350b36e87809698000000000017a914254658f9832a4de856aa4c88ecd15c2e7708770287dae25c050000000017a914aa058c26e899cad7f3421aa1b9adcb74e679ed9c8704004830450221008e3abccee7057e1f9a02af533125bd1ebd8525d31a713a0f3f62e1ea6c2e670202202f32724169e02ed29559e28dfa57c07738ed633f64865c8b23187403b63b5cc60147304402203f6f0ad6ee3958cb31488edfe73664747e4638aaf6c5275e211e96b5b184c7ba0220747f6328708fc97902a5f443885774f08d2112ea278ae4504d4aa86c38f81bfc0169522102c8a449a58784b4d791d86682c57a0f052591bac8e8db3f1dd4ac311d6467b7532103cefdabc8da644ed206333f0269823b5877331e21f6ecb6108114f56c8b39eb4021025a7052e9156bf954ab784fa426949c76a56255ef32c501a7a4d5a324bd52bb0453ae0000000001000000000101ac6fbd96de91ccccf8a175c20cdb6d1cb40e23d3a498bff63725052375ac297900000000232200208c63126671ae2751cae3f10b13a8985d01226d53d2a5f5b3865714243f4c6f99ffffffff03b85d03000000000017a914a78bc7afb6d2da4eb4a73a2320347f73ec3f8d8e871e3c0800000000001976a91498be30a8cf8d7416084e9e5bec7f6562cc429c3d88ac454f470000000000220020eae987fb0090b23f20e6b57987a401622bbe9ba49bfedb8c223eea01cbe46bf50400473044022019f3b89d33a8c1e797751ccba74c4a5f028180d8631d05f3f860ef208b37c6cd02205febff04e3f7f4100afbf2731d7b4d8ab385f280a102fe2af47441c266678cb30147304402207b29dca5ac009b797cf01ad72ed96483365b828f552fa5469ab09923a930190a02207bcbdb5c84beddca27462bd8576d9c999a73c5d118880e66d388fa378aded90e016952210373d590842eb2d85bbacf4c15e4e72ef07c7cdfd10f029e0ed24373ac8f17d4d0210338e6003f5387adabda32cb180c29ed784dfa4fd77059314742d40a7382b1b918210275792370e203d9b7639eae850c4a67ae8f7b12c970514fb36e36ba5f41d9d54f53ae48a00a00010000000001011a77cd342b311a386c84c9542d794f0f4803a5bd5b7e9e6fd99fb11032abe4e51800000023220020c7a9be02c55decd5739201198cee14a0eb49aef96936b034ae876f6e546e2f84ffffffff035fd10100000000001976a9142f875826cac1523ac32676c4b74237d97e83e6c388ac94f802000000000017a9147c90e724b05d0ad7994d38fc1d7a44b82fa57a3487aa3b70000000000022002089c5e568a3a074daa56f7a79aab665a687043f952b2e4a813d201ec8e25ab15d040047304402205a6833e161d0b44648043e7e0d7ad87959ddcedb2e8b709d0697ecf402913465022059e49c224184a1c3c5ae4b248ca517c34dfc2782fc5cca81f31bba6c51baf1dd014730440220587404c14700bf7f7958206f05150f1d9354d28bb817e23dd3e02c8bc11d73bb02203484dc5d09e1ec1629be513bd54e98d693ce5e5c4ea79b3b7c742ae4b9077113016952210208a66ee8c99dff843ccd2bb4075d6eca2f1d18d49410ea9972aeb5e799ae8d252103375a3f187873be47d06661fe8f05230abdd6c250373f9909dac342a6d36983f52103052db5550afcbd84ff2fd9055e757a0edea96503e484720182208dcd0981713653ae48a00a000100000000010118e3f6dbbcd1ffae432416aa469831b677c2b6f40d0545c3d6e29ccd542d768e010000002322002023756ff05282f7e51bf64643fe6d02ba743e1d9c6a058e7e70a402271c51ec07ffffffff038c45130000000000220020e91a6bf127c486d5ae41bd94b46ba94c2d91aca7704b01bed577b8588b15ee02190118000000000017a914cd5b30dbe97b88654794a91deb078bb653a64b6a8747292200000000001976a9148d535072df0cd808b9d7fd6ea269d98c47b7057288ac040048304502210084986bdeede1481901b955cb4a077f1575f66485f2cee39b0d6b143d13a4f87a0220342d02015acbe357765249a4ef5717d7b3db7f8cf27b3c639821ba5f725ba1280147304402207a72734bbff8030e42393ba813ab72b85a06f1e98c37751bfb3b84a55330e83b02201b977ee1b26586445fd2ee02c2beb4bb809f69ad064d2173a634c63a7aec6cb601695221033af2e91b0f8d84f041507f175c3ee0b937de9285d5506647afa9832f9f27f67921028e103c02ace7e80c1a1c88fca8cc900526e807164f6bb9bd2f0f994986fa80d22102aedd706b07bc23e1a07c675dd46b7a3a90c1250e3f6da77f1a02cdb82d43529553ae47a00a00010000000001019143e15225107de61d4ed906fb52534a160f38ad5530affabe191b4e9b2efd490c00000023220020ac88d0b1aec172a2e55675d114e5d6dc367fde2709d0c8027b9dedf67444b074ffffffff04d988000000000000160014a16b4a5bcf90ae7585d97181ebf95df2a71f1192d3d100000000000017a914dcab1af602d11f350232332721cbd536d414bc6b87d2641c00000000001600143e803dc4aaafb804208d0edce1bee4340d2b100a2d3344000000000017a9142362df7e2dc29b89014a04962419d2e1030d36ce87040047304402200de6c5cd3d76cf64a1ed69100e6dfee73945becf71e07d47798f3a5b05b45563022018a177b49920118b2289c06ecb365ea5f163294199dfc7605621c2f2bbf5c1e7014730440220274c937bb5ad59063f828f21d19e233d28ba36e21c98a44cb5b671c6d990f69e02200be45f11e34137aaf5abf76aca0d63b522fe7d11d008f5ba22e433ad5e1a301101695221036aae313d369a3a600dab1a995ef56cf6e218706bac08c54162db8e9a172393a32102f58371649a3dc82933f1d975274a050a9376f664cd6a00ccdf0343b1fe9d90512102c0530fa1588d47c0e47b693cacdaff831480aa72f8903afe9eee38ac4b8c3c7c53ae49a00a00010000000001017bf6e84204c929437778619e4b27a78c4222583868053fb5bd37c062f15cac3c0300000000ffffffff049a4f1100000000001976a914ab374d91470025ed6ae5b5b47d8fb2bb9e166ee088aca950240000000000160014d11c13179ef7129c4d3a14e481ac819c431a7c08c0c62d000000000017a91451f6225ae81034d32083c58a706df4f555ca8e5887d39f4601000000002200206ee1d30d745a82ba9fce575a2ae8426101ad412daf4556b212d22c79686163f8040047304402201c18ddca6116c5756c2cf7cec158a8b362a1ef9a153c9ce473b03f9da153eb9d02202d7dd5f397e7b1014ffbff05affc70d2079529d29a98a1e3de5aa251b155434f014730440220152422db925e65ebab2ec794ec8f49cb0f3ba112fbd7a3ed3bed217cb6490a4d02200dc6830baab7465cda6bb1140998e9bc97cf520dcd6c592a9bd5aafb6ae14317016952210229b7b2c95d899fa0ebfcfc024b77f8660b3c0d45d7c6542608d97e749151d9cb21035f22c971aa24709a0f2f20c3242e2b984de175e2b0a84e68026e4c4a91f01bcc2102f86636b37d980eee355f5a8150f606cd4220a7871bfd44bdcb097841b84b24d753ae47a00a0001000000000101bf6f6f31032b1c2231df1dcf22696470ad848971ac2aaff584c2ad13e5df294f01000000232200201764088ddf3ac975339307edc867dcd623f0a4aaa0d5e0841f0592cb48b91f22ffffffff04ed4f0400000000001976a91487da394e763cc7763853cece11e8e4fa67a857c388ac7f090600000000001976a914b3565d4e2484b40db1e2567efa754d428ed954b988acc3de4700000000001600140d2b01732bd949aea218bd390c770a219968678c30ead2040000000017a914c4d820f33235196b0088448c25dca36513f98fd98704004730440220539642e63af2974769e5b8b23ea48e72d7463c94a41146fa4a49fa93b224f827022007d269c81eaf1666b7a394dc1925dad1432a7050b73e5b3c866a57cefa3e72020147304402207f144e4a7d8a8b2ac76ba589148c2a61f136c83fad950290eed95c85bc600c750220414ad717cbea10a430f592e1221c7419146c07e84302dca87c384621778759d601695221028c67e45038231cc73e17172ab2ea2f99bf2eef34168e9f24f4b55019d5c01dda210290f3637cb7e1fe84ae33ab7b87d7f63e8d13472d12fe747f9fbf5d2d3a4d4bfe2102c8f3c1955f80f5af43fb14d4f041f200058a14ab53b26325bc35f7e456874c6f53ae48a00a0001000000000101630003818cdc2629fdccf925deb9df606b80d14b31e20996579148046b886f660400000000ffffffff046bd700000000000017a9147436cdc6d87a3eb4ec13cf382589cc6a71565e0c877b4334000000000017a914ecb0680dcc849ab894e43f7fabcd01102f31fd248727a27900000000001976a91466ab8332f72996e886962e6618fd062a3eb599f588ac9f9f9601000000002200202c3b560ca3897d36eedb2567a57db53a1f184c45cdd54c14bbde62f950bdf5ca04004830450221009f9d38f95efbca7702b0a0781410c9d3edf0439faa2689001fd9fd8a047a94550220539fea7f1bc5bf97746f949f7000cf241e6871ddc70d6ca71d50512dc8e8bafa014730440220092a74415c1fa0fe79fd2db6a8227250c58c6d39272c4b57cbcd1605404324ff02206bc1502cffec16623376c06f306a5a68cad613c1dcb5a90502864e48e20ce1660169522102681201e01250f2ce4aa683df252e903c40bc11ba2e9b17f728f6a3c72f9a92e32103a028c6704f0ffd54d4a120d6a95bb79d3ed892c531e0d608026481343f10bd2b2102a92d637630f799f560e2ec256a38242a473cd0d156745755ebebdbb3620daa6c53ae48a00a00010000000001013cfb66e77aabab3713ad3c5cdf354a2b6b2bd7e2cabd25cbc806df29bc2810f40100000023220020c97f51fc34035119d651b2393db1cae1a0017c638bc2963082566b86767ad08dffffffff04e58800000000000017a914ed2af8233552111f88175bcad91dc6d5f9c46a538796d70200000000001976a914804650c13024e8d81ff7357d903ba7fd3c80092088ac071e4700000000001976a91493ffaec640caf407b02edd3bd6b9c3602dcac7dd88ac08412e030000000017a91421cda7a85f89cd794affed25f1c71fa7063f6ee5870400483045022100c9e61f6e3d910558d7a367989a357ae3b3d367067da82e316cfea2598be9892a0220760ab5bbbf2582663d1b9a9462e60d979dc807d624c43dc4044ab0d760bf6eb50147304402205a3d320868dca3152eb0cfa91b0484ef570f28343cf9442c758c21ce5b1d91e70220510f188aa2c99e2b63c733a666724a83db98cd8fc33dfb17acddf0b6e5d0f5a70169522102092fd1c945214eaba8cbefaaeb73c564bc8ad5f477189c65adb8db91f8ece07b2103e5e133989df6f74451bb3cd06cfad2a981acca23b7d7f79d771414e92d67255421028d05be783da42ec3a93fe18279705a5455f3527bff4e901fba5cd3dbd8db8e2153ae48a00a0001000000000102d025d3df7e84438f7d3ca956c39c3771adb9a58d594703dde26ed67432963eb50000000000ffffffff7c7f60dfbc1b1d86842d705c512415bb2c682eebc305a0e9be9fa3081c6ff19d0000000000ffffffff02d950060000000000160014e1384cd059630ab93a639c2c384157756dbea83a778301000000000017a914782cb07d27838c746bb86403ad51c22695f1c9ab8702483045022100c2dadd4c918c525196e64b4811ab5a3eab582b8c530cb391098455d53b84c914022074dedae5f7bd71a932539cfabe98b182ea03b8276ffcb1af7e91d853656d91ff012102efd112c679c43effbda264a9562aab37b9e1c8d04f3fdd96a1bf82b484b62c7f0248304502210096808e1833d6e2c17029cf90064ca40b5d4b0d1cac026f5ee11797c1786e518402205a1d16ced8fe3150d77c967ae3b6d8fcc255c9a70473e64326401f5da53345c30121026c660c8751a1e65d027373b56d2cf0de6b5156f969487536f91b1297a287e1620000000001000000000101c8af4e538f8d52038889257e8042331243c8a72ef025273a3dac9c896f38b41b03000000232200206f0c8aa44e66b062a8f53ea84b6ca7814690e6c3c1d435df379da3e92c3cfc9cffffffff05741a0100000000001976a914d9fd76ca39a0a53654ba2403c824a2292efd0d3a88ac69360e0000000000160014e289dcba7f67926f5051841c6c009f02e1c79c0f70ba110000000000160014a0b5469b4dce20cda2f1fc48f1d0efc06a495e84f11a2701000000001600142f0245c2e06a2b36760f82b5e5bf22ed9e71ba67d243c3010000000017a914d2b2586da93aa2f0b1f3011307e1c1cda43287af87040047304402203be8c53a8c434211c109cb3296309a8bcb59d7fb2843b50d6a36abb9ef78c00f022022ca0e64bf238040147fedaf9b7026887cd7ed6f8531babf00a1e933cf2dbc060147304402202578211aec3833d65cb95039c8dabad5c164d5726e44319ea78065bfd7df7fa902206f55ea0c3897ed19f43e47c37d78dbc5cd37f1bc8aeb4c120b3ce485403d50f10169522103570e76c69bedd0b62517f353596fec20b657ff30f719969b8559af2bd8ef24c721036a96ed0cb5c4ca3b66dbe02d72d20367b21604a4e4c241b2236b3dff47c420c021023d9febf84cf1a327a26b8965c2cfffd89cf05e1d2a6e8addbce9bf6c9ad356f853ae48a00a0001000000000101e869399e57d384362ca33d44da8d0de1bb74af96df5ea3930d761c773064d5e20100000000ffffffff052a0104000000000017a914c58d3aab049be1d23d2d3e8d0ddd3199c2d30c7787b71b0900000000001976a914b6230d4dda6a5c56e519515528f3d5c4bcba42ad88acb0200b00000000001976a9140ee667c9d91e1252fe300498560ee65e5bd5b42d88ac80584f00000000001976a914d7144feb3d6f3f158177d1ba47e7bdccfc03499b88ace0c5400300000000220020eb8698f37ffbf309287881b6f5fc1481f82f746e1355f851909a18407bfc6232040047304402205c3352d3a5abcfa7a475d034b6da04a9e10f51c717ddf22031abb0864e7f42bb022046711fcb20c0d33eb63a84909f26c3c0bc7db689ed87a8b4386cd7b7dcf97d830147304402201fe472aab2cdac3a8b8e98725f8cfdf3fab86a5aed53b379fff2c3e80142ec8e022060ed9e79eb69f5fafb0fcde71f1d595f5e1672a048d34d72c1446807e502be5b0169522103b5ceb14db96cc9d8a1b350c5f4ab86f2a19102135f065156e11776e7fecdbfef210231a9efa385e848f7d28e8da99ed83211129445ea3ec505bf1de84ef02915235a210264441b3673d2ef86a935e3c5f218097fddf3229fba559cb3e0980154fdb6f45453ae47a00a00010000000001011bfa1e98ffc313080ab9cded53a94d460523eaa72545843b7268c8d38a5bc1210100000000ffffffff051d3e0300000000001976a9143faa26be3cff3a037d7b320cbba01a59e7d7c76788ace0c810000000000016001418ecab6af32ecd3d1dd5631f352c32d14485b37e3b4f14000000000016001483eff5aac3e48fc4dafd3395a10e78a5756e4800f92b2200000000001976a9143d9ab58d59cfb63d6f593095884076777624c2f188ac50f69501000000002200209304b9917846a00d20d04098f32b92584e826fe09aa73f4f06719dc5b511380d0400473044022025fcfbfeee681f4f30029bf5c8a29460d17452a61575b567fccc39024ed1a56a02200556e28dae4b93aab0cefac1e7604c63bb6e2622907279a383a81c3c417155720147304402201d5716c86184a99a44fe58c86c92489d083d63ecb0ee1371af49a2133414bb1202207f3443c47bcecd92fa4e29a170d708ebb72373c59c27c7353350870fbecbd7ef016952210360df2fabdb0f3e8b43aec3e2d5aed3f0a6307afccd518542fb9596b13b037fc02102db9d5abcc44c78e79ed5a2491fd0e0fea5ecb5f2798b8200b863bc08c68d2349210359d428bc2e9475374bfc93cf61fe8ec436d48a354f6aba257f03c43e404819cc53ae48a00a0001000000000101560c31fd42a39533d7b5a4f8ec93cf47d289c80387b3a68241b6216eee6cb5610100000023220020a570eda6f0b75357652bbca8245fd9d7f6c2a243fbbe54f97da6b74d4d86208effffffff09bde00200000000001600146aea0f1a2d5bab5864448ad2581ff44d21b5251af24625030000000017a914b32b2b9efe782ad8f5a182c7ba13c941fc9b2bb2875a645c030000000017a914b18a9604800e139a178400878614b74aaa82075f8761a966030000000017a9146c5aac9b0fe3d80a59b4e217d17a42eac4c2436f87f8c46f050000000017a9147032730533477ea1d7b02d84facec6d6584dccfd878f6398060000000017a914699267cb28734e054613104e314583aeb5831eea877e04d6080000000017a9148012497f0be0d18efa2133217150afaef33c1d9d87292be10a0000000017a9147e1ef5c1535c854766def7ee919fd72794b7edca87884bfa0b0000000017a9149eb5aff98209e768fed283df13dd444a11b439ec8704004830450221009e8914a220256e6b0115d2a28c943c4219375fc4eba4c90bd5b7663e5744b10c022033e5abb8f5e075d669d943b38ba5ec0ef41456b038610a4495dff36ac44072bf014730440220768c6564a1fdb1c3d4803cf80f125646b1ca28ede806eefe59a923f11e402c4a0220091cc048c61177beb4b6cdabcff112eafa47a729ca02df1a9c5a1e98c20e399901695221020d9c7704dcf0495517830b4c49855492f9d5a02e1b21030a82943597b963e7a521024e87c1be56673008fae48e06fca770b523846882a7dcfb637425a2a35d6f9536210375a4856279a6ba4b2d8f48694db79a496752641966f82ab9f3741ee48e5cf9ad53ae48a00a0001000000000101439026d1b042c2228435e3162f47ca111bb85113e2ceb42a82ee99f9565f299e05000000232200202a7cbded90ecf2d754185167fce2e3b4e826e169f842e627cd4633a4b35c549cffffffff04cbd100000000000017a9149bdce331709fe6bb2382193dec7a8392e4e7a87f87c7701c0000000000160014dbfb9546762c8ae4708a26bc1ac55f943266cf0677598d000000000017a91478f64d74876931d101fc03e929670ef0254470da87c7c0ed050000000017a9148c7b584ed837e2905153c1e028ee7a0e3afbfcab8704004830450221009155ab864f0245c1d92bb394e9f54a961cb16b057278abaf3841da1bbe23b40b02207dadce8024c8c9ca3865c9d9f04735a4ddfb413cc2e0c3a40112751185dfaeed014730440220681eabb782f5b45a41d5b6dc2eca37722195e5cc6edb6ee3ecab22d235ce874902203fdb0e0ffdc70fd57e06a41ca2727b79ed89800d592372bbee0e0f6cd624868801695221026946cfaeac37396e4abbcc16579cba715bae71d314e6e4a48b80277ed641218f21028330a7e71ef364d94f6c9d7352d9ef429efbd56197a34058151498b316fc04f52102da71634886c56015641a79b6ea30adf0d827cff9ae2531b94e0afd89cda4054153ae49a00a00010000000001014d5c33586eb7a542b4a32e7207732eebbc95c81ec7a7f23289c3402eaa184e3d0100000000ffffffff05a4c500000000000017a9145771848f04360c39e56b8fff60ba86f3309407fe879e0602000000000017a9146a71ca8d881284a7744d5d26be53018bc70b114a877c61040000000000160014db4fd562198c9199eedc2104aa1ce6851435eb1189a9830000000000160014690351c30b3387807b5c74ca4d4e923a715c00a6d25b790500000000220020b30437bb2c2883af961bd1c9922f060a6ed631962e59f16eee6b7bb7d8f75e350400483045022100b11640c0fadc4476609605682c694529b76697fc4502dbe37db24fd936b6b47d02207e3e6e3fb288531a1927ef62544f05090e21df463b27ee84c868a08f376ef8b30147304402206cb636704aa89946b3ddc4240601f29eb758b8e4bbe1c436a24a9769eefb30d202202d6c3e446331339453c2c21e0dff849a8eab43f03a3e442a6e9e2d4318f3c9c50169522103565603d4b12265e3cd61193b6a2f40ef3b5276db3031335ecfe8074eaad2c6d721026950270f181469229f2ed804373a62d42f03075df8e68360748ef73a09d90fb921025a2e843eadf7189929c8d7b00ad9afab1aba35c8655ca53f9372832fe06b932553ae47a00a000100000000010155676f25793c5f811fb12c48f775c5aa31ee3779c2e8883f2a34a69f39560a570100000000ffffffff0558090300000000001976a914662c7053d7b3a2e0020a03d5d8895894fddad66188ac153c0400000000001976a914af6c2bdc313a2d799270a672b870b3740330ca1188ac2a170600000000001976a914014a81efc202335928d8d4674afbf9bb1146761288acdd3d0800000000001976a9145a8cac23d4e50cff7bef433f9a4c4e09dc8c760688ac51e30c07000000002200205abb814b6bf6de371ab4900fbb1147f094abe855f123c4b5a1bcd64a1bf1d0bd040047304402207dcab51a1231d90a631fc3c36caed0f1b7fa8cd45fed88dbfe8ec77d2464bef402200ed4a53c7761c8e8bebc5066a01b293c9a4650aa0918f65abdecfcece7b063720147304402205914ccee47857764b81d43d3eca704c0200e9709f7a587e68535b59aeabbb03c02203841af7633d9649dd85659775c470d66ac802618a5d3ccaf789c46394bc7cf4e01695221032bd7f412ffc4d46bf8f12e84d63799017a6ab3d4eafbd42162b554722b89f09c21030bf8d2e39893b33b93dedb61f3a6096034299be1270492d97ad59a45039459552103b41e5ba209f8ded93cdfaa3649626b773330c0e7e2603a391349e40ab7254b9153ae48a00a00010000000001018582d611dfa98ece11ab0af1cee5b25587ccb30002d546e6626a83f8fb1f785b01000000232200209bb53364395b7ec8e2c077e75e7477b5870799efaebe04d20978567d66db9d02ffffffff05036b0000000000001976a914635f2db8c4e788b8e98cdeae1612ba532d5b57c988ac6e970300000000001600146b3de90e3e1e3007cf65530865ec9c9ecc579b8cf5a30300000000001976a91455a356350df5eb9927eebcca083f8e65c2ab39df88ac03a40300000000001600140ec3d5930f6a8004aad7ec05bbdd40bb3c8f54d75c5135000000000017a914d5628c8c1307546cf6a464db9fdf0ceb8f52531f870400473044022017ab07ff7ab6f64c3b7ef59ed5bb4cf3a8e51ab2cac13b6d6556f0d112ece0bf02201340d564e277851f9eb7f3380e963abfd14e3ba58b84125aca9de83f0320dc470147304402206b86bd2b31eaaefafafdbb325011ba40cfc3a4f15772d2c62061fef0e12d25b802205ce72f7e1cd9400788b85ac6a2fb9b27dfd352fe4ac6a75f3221a4210d94602e01695221022b3832b6231fc40c13431e3d09e6fad136f67a3574505f27ea194e05b973190c2102360902e261f43d374cc13b75a1d6901b8de04ad90ad1aa580c0d9c38c3bb3dd72103f9a64c0c14c57b10a90739d7f57786fb3263588750c1f2a4990962e4d70ad7fb53ae48a00a00010000000001019d33e04b397fd905c5c88ea7f980b1204402564f91bbbb1d749b4489dcc44b1c01000000232200205b3235a2f9b7728fb7dfc7a0c005f0d3360ff9d4883b051cdcfa37850959694fffffffff05411b00000000000017a914e11a574c25d87e89031312dc326ee94372d285dd87d90702000000000017a9143eb2217c1ad20a855869906f18b7a81bfda958cf8708bd0400000000001976a914dc0d3820b8aae25171e1fbdb3e3940db8428104588acd2f7370000000000220020cafd024ab85b8f4f132d345209e930951a2f3b1fe62b81f9d12ea734635f4002c2818600000000001976a91466ab8332f72996e886962e6618fd062a3eb599f588ac0400483045022100ad2edd018847f474cf564006481b7c0e61c8c972411f936765047331c4024610022061b8bf6ba4a260811db8207d33c81386415524ff80334ac040dafb2ee1804bb40147304402207bacff4c57cb9cf5c843f2e9bf95b43bb6a76680f0c2dce528d2b5f62eb5c31b022049255337f48120914926b0c813d2a5d70e49c58a7e16dd35b90f6777a3af44930169522102e4f6e1f7f3aab7b9172d188f1d5d5a5b9290aded0ed4dd1d89181e7f91152183210387a86d62a6791577b9fa0c18ed04ff011e403374ec8b1d8f155d927aebf4f3862103e17524aec838f3bee798b8e3edbf0f046daeb7f7786746ada290e1002a1d8e4653ae47a00a00010000000001010e7b594c5bce7fa65b17003c547b84b055df83d6f99412e03fc9ce0e592532d00000000023220020b114c135e7a6650a98cc99a6a0267f331e9076e486e5200b82b33054fb78263cffffffff051b0b0000000000001976a914bc12bcd8f16c9c21023d6a13348788f785f3766988acbc0502000000000017a914ea1ccb5485705f31a01f42fe9b3257f88f152d3c873d070200000000001976a9149467d96eb5008ebb4551e5adee9ed39013404de788ac573004000000000017a914cd0dcfdd97c155827cde8e567f02c980913e358a87a94e0102000000002200202f3c7924ca585f401912009e79f0e65442810e4778c34816a72c48f42fa2249804004730440220123d1019508225d03c4bb58bc343f0cd2876520c99f2f7d5d614dffd661778ac0220170962ceb9324e0062ad2727f79e2f3ff40713c5946728fc16ffcb42a87baaf501473044022049af43ff4af153620ec07007c761873dcd7d76b32905618e3d98b950a4d634920220433c78f1f0f478e7743c96bee50145e46e7d7fc23766bf3bdf76c1847cc9f8e00169522103f970a114ce9f4a1ffaf9fd7de6a06604822d7efd4446cce395583c829c49945a21032bf185e814c4d1f5e43cf860b3dccf232c5695b46482aa9e590095361180222e2102b8d94a4e40a727532aba084065c07128b4bf46ee5aaff15c35c363533554851153ae47a00a000100000000010170c405a1918e71ba840e5af9ba90abbd81234b8ef64213e96edfc92f55ce9a4a0200000000ffffffff07fbb50000000000001976a91475d645ddaaeb447d3b9ebc10eb10efabcf1540c988acb0ad01000000000017a914276ad512f474ea044239b3bc03900132a525add6879c080300000000001976a9143590712a1e8daf71a13efd38527caf5aa513c19a88acd80004000000000017a914a561dd81cfe94e5c7da9e8fb9451ad0decbe95bf87e03c0400000000001976a914ca5735d5f17712e397c637e0ef016b17b1bac8a388ac7e782200000000001976a9143602ec9d11d2b3012c33c0331715aedce4cc7cb788ac553d120600000000220020a91755537623073591bbd4384d088d0ee22c077a8f451a0bcf64b6b1a31f1c480400473044022069f0eceee032e7e1286a8e6e4113b084951bd1f9e28493a323ffb4b6531476480220550ba7ee1bca963f10cd25e2cff8586f0f466e3a762d490c4a459306e15b83110147304402203f20e5bf627410564f9508779c4794ff26512e25a93144356a470b07225c3eb502203fa287c737b97973ecf6287d9e7db2f1e7666ae727255082a16752b90de42d9001695221038ba478cf610f75d740692289aa16f622a9af4cd6aa0954fa11f08d58ba62fdb72103881f2219c0fdff5eb27aee3ca6a63fddb922e9b82560a7fe5280c5b02adcff3821033b050bb6e74b1ef379f3bfa3e8bd98b127c35a4d0ca06e29c95cde274a36d88453ae48a00a00010000000001012d5d20a2aaaeb3988e676003c8e98348577ca01e867f7d16f82e52f050d41f220300000000ffffffff07120f0000000000001976a914128b202637847f0a7bd922d1028ba05602c7b3fc88ace0280100000000001976a91459b4efa31d482973096cd7d0aa957b770d67774e88acc63101000000000017a914d98380ff20660079fa7138ec7ce80e9c86d26e798733bd180000000000160014e488116c7a3cc62470a074e9d8a31cf62f3cbc44c6a71d00000000001976a9144057053c68b84f3b915acc695e299a5247d081bd88ac8fe94d0000000000160014802d5178159a5c039cae7bf9eb137fbca2cfe1631b20bd0400000000220020cb599e6a01a1194790f39e5bedfff1c1fe7174c0282f7986eee266ec14cd56520400473044022017b7128b6562d60039415150ea85ea6475e90d6745b933cbc9131cec78ac53fb02207ce4adb302f3d92fa09d5c1e4615c968053c412ff3688c84e65ee79dda68bd1f0147304402205ff27b8b9dd651140a9d71fb3619848c4480a3cbf55ac6662b0c5976fde9816202200e59d180c67fa0b4f23be25bf4048966fdc6c44b8e6040a22ef82b42321cf5c00169522102acdaf936387d9e183e285416ad33bc72a4ac2d10290e9c787ce4f29cd82877082103aad522fb6fd867460342b55156d27274b85c5ac9dbe87d7fcb90f3461abefb5f21024f1eff46258bfd54824cc5ec5f99128caf39137bb0586341d1732c9962e7e30b53ae47a00a000100000001a372a11de8246136861686ab0e3514b41166696d3dd77b92b95e55fb01e38a7000000000fdfd0000483045022100df72812ba8b24e420d50c7a9adfc12c093689738cc2535cc9d35965ccddfa8ab022060d701b7fc3196c3bf5c0a80ddd09266088b5814e2c67f6cef0efc01d29f3aa101473044022049b5d46455772421b0061154e8b114d62770b49e5c56bedc68fa8266e8ad69c302202fd1b03110637e9b1baa92a639fa7eb7d74e627dbc616ff76b0e02eeea8ef912014c69522103c01eb34ad56144b81f09fa217a2f1c1cc4183fcf570f4b255f50f7026acfe4732103b46442b074075bd0f5a970e616eab1279ebc0dd0cb02239ecec97c5c221900732102163653431d5382bff1a350a218855da277cfadff0d310e3667a7d050562577e753aeffffffff02e1500b00000000001976a914549f88887478928720934a8f05bbe8eeb4e3bbbf88ac847a32000000000017a9143625fc09dad8273ba615174c5d4d1d3e971808e18748a00a000100000001a7efc2454c1a36bc34ab668dd610a128f9077c636cb3cca3198401aa21cb297903000000fdfd0000483045022100eb0ef4a25ce215342211a5c10a040a5037f26daea1543d193819f500456a323502202b15f21d92a5634264d141325a27787dea3c1c0be14f9dba56b634d7f58d0df90147304402205c96181817e94acf859151dd2cc5dc094201f101e701ab6580458574d1b5867e022014f9e5a574e725bd7902b2f8aee52f5dbbd7d28416c73a5799da7bd3460d1474014c69522103a5cedafbc0da8027cc92a56ad88f54e424c089cd9880956ea9349a8ecccc22222103ba46ef94e6cdb123d0c8c854e50698ba7ead42b1be1d732362634ac2d17218e32102d851c59a8d8143a6b974c06809505983f583181e956b2dfc3327ab3a062bcdb953aeffffffff0277540100000000001976a914ac8506dd3d90c8384514613e1916b586b2ace93c88ac33375f000000000017a9142bca1eb1d8a3f761270ddac48ec5fa5eec00730a8749a00a00010000000001058f1456a0c411b7f1caff8afe06520a357c9f11d01f5c01228bb9c531b5eeeefb0000000000ffffffffa6dbd983e78b0f4f157947c597ff5aedbcbb7ede1d05e212eae0529cecfc3ed5230000006b483045022100a63cd14a332e026b7e63a74cdb72694cb6516538b8a1860b1873fbbbf8490d6f02207fc1badfdfe8d3c991c6c0e0ef12f7957cc8469692eb9a94c94ee71ec9ec3a7c012103cfd040d20020bdfcbb8b9a5663178de0fe480b381714090ecb1cfbdf41169673ffffffff8164d7bcaef7f83d05367bd6927ef6c71ac5d430a9ab554d125f5908bcb0d78e000000006a47304402205a223d38774e46fd95b0b22b501ebb3e13aee1ff8a3f68ccc0b0590f948984e8022065ffe9f5ac7df3854ca51fb862cf9223b7fe246cf6776fd52b0996d68e7310c10121025a55dfb8161fd1956fde1bccf0ac95787b6dcab2f7a87c6eba239e9c98d0d935ffffffffd984b763f4105c959b9f62e9f4e559c528d4e64ef272703b871364dabb34e37a080000006a47304402207bdec33306a45a9657292a121277f5c6f56ea19edc3a58a44ac85e1a67094bb7022051cef329b00fca6347556da0d5e49298f2088ddf1727ebbd0079953802eeff5f0121020dc0af0eaf1e19fd61b4d285f591fa542822cd2d8c12439943726b0d05e6319dffffffff75e974fcd392279c70b0ccd7a699363fe347e47f2788091503e8251142d09f33000000006a47304402206c986150a6d79244ad3a68dd5bf7218eae3cbdc666a57aa75cc0c75deeddc6f1022028645150c8ccfff55c131e3199e449656ee38a49461468cc070d47494b192e69012102dc8aadb11906b2981a76eafe4abef08be70350cca0de92f689c825ddc1efece5ffffffff020ad44e000000000017a914210d9da476e54f9b0d72cff3d08809f9eb538ed187c8d007000000000016001450b8cac63140fda5c159db1b773fc0e9d41905660247304402202143979c8a27bd882eee0bdfca69fc7748a39e5234fb247e6f4e4c5e6cfca0ff02200a2d15991d4db5fc1e5b8773174ea37a132a788002b191e68377236ea2e27991012103a27d41af7a7446189a07c1c43433eab5474d5d8525dec1c05e452aecf0a8473d000000000000000001000000000101a1b22b149fa86ee1de58ab3abe3b52b8850afc767897003f8f4773a57a048afe010000002322002079e5633552235b5e564c958ab630023c8a93e54196101c038748a943737a1393ffffffff0629d702000000000017a914e03e2b1a25a4ae94774743c6e73ad7201cdc9b88879c850a000000000017a914e05ce6c92f3903725ad38adee3fd7ee80f4ef0eb8769a60d00000000001976a914eff09bb13393c7b3258bc9af96c014dd4cfaa9d588acbc441b000000000016001401b0b2544e4682355440f23bfb18f799faf4b6eaaa94a20000000000160014460e0ed47e6a7ea1e7220012b83a3d80e27b82e8870b50010000000017a9145cf3ee9419eb81822402a3d9504ce37c0dacc9b0870400483045022100ff2d4bec5a9b61425c3093d87810ca11b1b2f39e4400aee1fdfab64b0ce057270220536c1a5a744940b8fdb4cf9f76b3449dac510cf31bb5dd1de66ff21b2bd25b0c014730440220687a01731f1428f8af8c69d0be7db5f0fe2fc3b178f3d8e9e08a05cdd54f785b022052b09d1988f2d31f3e28995fc80272b654512303167e96be80561513ae60217b0169522103d2433a03904778493d078f1d609d480bb44dea2d9182bec1c516d241ec00383521020d36b102c53caa7a8a963a9aed98266b8fcc431bfe01070aaee2e81899a153232102ed05f1a65a010979a9e6a90810b178b9928fad62b590e9adbfcd9d393887ebe153ae49a00a00010000000137cd8a89e80bf15b811dfc6f8570834c43e482d6cdc4678384e696d887fa496800000000fdfd0000483045022100f7ef263ac28da3d478b797f0e9d1cfe8857d6ca27a44c6a8fc56d37aef69c3f20220433591b698f40e5a5c3ce96f8d550807a6090d306e02015993750927c5c87c2501473044022036151de978ca55f7b1239645fbb7b50544d9ca1f1b7e2dc60cf3a74d5910790f02201c50819ceacb6249af2d2a0d915e57c0f30376e226b3c4b009b00ad8692dea11014c69522103f95d0afed57e6286d951364a4b7c1bd78933d2da86c59e0e3878bb9176046a642103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3b6ab009beae68dd6082221036380fdf9b539c440aa5e083acc5973a2bef6987246a0a25d467ddfde5eed2ce453aeffffffff02f055000000000000160014ac387e45fdda2d59e155bbe3a5bb4a1da5d654317e2a01000000000017a9147c52fe55b87e590be02f5074759ce2441149c6c48700000000010000000001019707b0aebc636c038abe67ce05c9314d2138e778d25e1b0a17cb9ec356f6fe0b02000000232200208d0f4ac21bb6ab016ff87f86f770b10ae1a36cfd93c353ad8086e4cc6974f867ffffffff07dc88000000000000160014c417d35b195d41b44deba11c3de085d2e58ba8b4dc880000000000001976a9140640b1a7416fc12f2d725e4c7910980bb36e622f88ac146301000000000017a9149f06f1f5fe630393bdf1b4359421edbe58bd6082874f5a0b000000000017a9147738a2565ad1859bb444b3609fc411fc04af7b8d8775c31b0000000000160014a05166d97ae0f5f6943a49ab1884bf462c539d25fd9e2a000000000017a914334349f05fdfd391caf38d156da4b543b311c3b28789a015060000000017a914242ead46d929f47b2b41b90bd3da21466ca30704870400483045022100d74392c742c73f537fd125e5cbd5e1465ff93b7f96bf72259f99f5bf7869394d0220534a4387a0901f51919b3bbeb3328e528ea090cd8bf6338e4967f8b520cdb47301473044022078aede7e9a78baaee8c468fb086523d839ec9fe8ea69e610afb92005f0c9b89e022004c0b4ef9fbc46b16d9cfab4abe1f21d053454111058ca6caf642ae8f32110dd0169522102e06bba1b57a7575830eed44ed7b5a5078cdada2ffd61f0572f101eda220d5a0e21027dc8de69e2df1ce465aa5f018ad0ef5fbc70bec545991d050f3749b526d42f502103ae57e49c21d767c8dd4837379dd70b28bb33965683d2283f5b174f12a284d10b53ae48a00a000200000000010724710cd5107facb1c676ba789ed19aa98c44c5ed0f6bd2d82b919b0c52582bc5890b00001716001413dabb465f76c3216688552f2356f740b5074a21fdffffff5a0ab2c688daeb9c7ee88dd61cdcc83ed8b3ffb3b5df0fccbc99893dcaf781c900000000171600148f78fb9bf79fa37a27ce3e719a7d3424303e3fdbfdffffffdc4699775b8d786ce6c2e91062f77459cbe8f66e3da556568a3884f7807cb40399080000171600145cc866eeb876c6f54086177502f35a73cfbdae6dfdffffff5db2aed6aeaf896f72ab9913981786dbfb81f0fd14c5c624e857a346bdcad3b70100000017160014f3646ef2770888ffc2b4d244154d9ea8aa1f4debfdffffffbf20893262073370a3566cee4eb414d4b9561b0b2039614bfd641690891be9c900000000171600142232ec1ebefb4017a2a0420e11b8c9d84437b33afdffffffc6926040f7d37f8683da90ef7cc1c29f24f88739940fdb71d290e637297f6a2000000000171600147520326fbf08cca6c2ba1bc1f0b347fe5c0b2770fdffffffc7bf9937a9c77a2cc533ae8bc9ebbce358dad38b9d871074a0f7a02ad692f336cc09000017160014bc70de9c1ee0f232f1c6246da220a62be8337f3ffdffffff02bad48800000000001976a914ed472e03b4e1e7eee11171aa01b9666fee6a250f88acab8b3200000000001600142c61ae28d6bcf7486175639ccd337e811f3f2ae002473044022060d346c7caaa2fc50a4350941748d81ece3f9183c0b91266f080e5aa131afb1302205d2e3765bdc7afb090b2a92aa501ca92dfde39abe7a2c8a0ceb1135103b971a001210309260e38bfcad2bf952d54a59a75f93cdfc730047748a3095dbcf07aec48da3902463043021f10d60a4b29dc472b673c9c93cbdd18a55fefa5fedd3e1e7f270d97867c63cf0220655d9c69cf7d7d21405921bc0bff2172f84ab787176a7ed69fb447be88e7c413012102e123e7d9a5c23ecf84a1883da4cc46311ff6ed71e151541401d9ce043d15cb160247304402200fddf9d33e7bdf2faa91da4d56fc33866eb8a397a03bd212b38bd39f7dc0daa602200769694bc389820a1775576094bf3ae8a5f5615cf1695fea1567512bf089856b012103ef061d6f85d07e57e17b964bb839d69523fd11ee1c20feb26ef5d41da44174ea02473044022071fa6345303f07a3838af4a87f77ce6b8747ab404cafc77d81799316e90b873d02204c33b4890c0bac05353a18e355fa55b27090d2e2f5c81279574d2a3e8e89d4740121026730f8d59a6fc01bc636e7fedb7fff840bc35c05a90f187a2430daad79ea1fda024730440220142f29dbbb44e51d6f4616537401c1f944d1d3c92c98758ac42f9c2aee3eeef702200f6b975c3fc0168858d9cb722536bd93fa8b9ae030d7eebd67517ee87b70ea6d012103f5eff8e568214340ce1eefb0d8058222c9c46b28ad6246940e3c32d3cc2584100247304402206c19d3ae93bc470f87ecb38ac22c44e88e0488a7f457c1f950512e324c38952402205f51b5e168a731f0fa854f60c9b6c3e942625fc1ee989d6ddef3dc3c0a51bfb6012103a771eb1293748348aee1876e48b875bf484329dfec910227b918083ac311b9f0024730440220365430b961fbde8a9a56487f217892614fe234a807397bd8359d46d2f0889e0902201943f8347ff450bef08e76c44d018dfe2006a329126f330029a17a95a76860d4012103dd43eb330cd35aa800c1639f6d3a37dfdaf5806aaf2dfb7348c3f09793d756a847a00a0001000000000103d50a099a5b01bf998cd21bbfe4bc83114c38ebb5e0e67e3fbea3335171d64f200300000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff766944e2f1ccdd1174f567205b9b4429be72d5af33fe38f147cbec152102334a0100000023220020700355430a6ecfa0524d25a689eded1d36b31704194743a671deb7389be402bfffffffff5a1cdd429c62d38bf6b9bf72fb616c7958eacb0db1a3f9f0aa1b99cf7520f59505000000232200209258d375dcb75d5a3351f51c37e3a722fde5bddc59bff86e61a5c9e7a96946a5ffffffff16540501000000000017a9146080f28a17c13be1571f22ee3793ab1fd3ab6e1487a7050100000000001976a914fab3230d9e1bc2af04ca573e2be0086286a335d288ace54c0100000000001600143c2eb30a3953ce6237001ee86a75e68de3e0de3abd240200000000001976a9146acfc0e022a900594b9e42789384466afc288a0c88ac43b402000000000016001474d61b9998b64137f2a061c355167339ffd32d8a62b402000000000016001495167457aa505d15ec2ee513f363d23152a75b3ffcd70200000000001976a9141db7bf39b2a42cf018086f69e8fd9bfd8784fb7888ace3430300000000001976a9149c49449cc84f80ed031ea6a4e05492d624b6b61688ac43d303000000000016001495a113fedb85f4719101f3d5638094e02a9fed28b283050000000000160014d39cfe0a7a25cb7a5990c3a029e465135813cb5ffcb70900000000001600147739ee16de1ba1f77e19e39062f6f762a4fa26fe185d0d00000000001976a91497fc9af5fa3767094355e3c15b304abf9ae0e32b88accc7b0e0000000000160014e840c5bc02f4193d400371c08f79fbfe802d5d9996bb100000000000160014906ad59a62cef973617d94e5247046f9ec0ba1c93b2419000000000017a914784a21620911544f3b4787ad5fcae849ab2a566487c22819000000000017a914614f9b8cd350a7fd0e5c0ddfe5d3bd58833e827587c2c81e000000000017a914784a21620911544f3b4787ad5fcae849ab2a566487deef29000000000017a91452b757f5ff0b659f6ce7989f984de95b7d87dc2e87db0c63000000000017a914c05e1f62cfffc48d55d990f7f347e9ce9ce5b9d3875820fc0000000000160014f783f58717ece7b2c94efeffffef00a876966dfc0c4cfc00000000001600146f8b3147906a23c5810c471e44800580df87c4168c691801000000001600148ec89274abafc8507634c1b21bc90f4a8e576d3a04004730440220273e4c99c147e6a8743fff8da75f26b051baadf6f437e91fbc987501b28cc21902207c0f1667d47d44ecd8ac5ea552d80444ac8b80e195838e33c85472f6da46f6b801473044022048e35882ad079baf38ba08d70616054383aead9868020d30caa282a000297604022066dca5798ed0deca9b5a6eb60e5f388a32283bb7178d713f6490a8a885bd791a0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae040047304402203140be1cae940cf86331afb0d18ffa08ee23ef3c037c17b5489444590f6ef4d502203291d56cb7f78b8aa285612a60c6d35884ba7f62a10a78272a25e3fe77f7e135014730440220457eb06dcea63362f9fffcd9f992cae4a64d11f81741839e57be002baa7645a202207aa66102e74f33311baa6c905d5f0ff5af86c45719a8eedeada41d2d87da05ac0169522102d4b772c3fe711318d11255bfa12c8af4fed3ee2cbf8d264eeb838280a9bb86572103c606605e7b475ec91351bbc538d875c32b440b37efaea9066e177842bc3deb582102626a3a6b2943b4e0056f846b717a3008b43aa7f51998557d80e38b71c847d99e53ae04004830450221008c37638a85f9e826bb53c526e403638a0775a5c5b75b35a5eb12cc946c035c1f02204d73527a4ccecef5299ef8d1e446d0cbcf84845bacdbf03092a27df85edc16930147304402206d1e7c69a8b6f97ddb80932f7febe7aae7d5945b26b19a489582e984223d2c18022024937a71a43c2061f3a656c64da0adc06156d60b6b9f43f66c00c02b8ac246030169522103bfa7bb0f0d0f23fb4fba9d61340183affc815ac69ca941b5f64dc92e290f07522102ba0fb064392b191ec2b8b9b987843f3b003e990b3d9447a5f26d48ef5340714d210368c2736f0c60494aa0c15279ff7662a44276aa6ed3207835b7bff9d704d4a5c353ae48a00a0001000000000101ee659da4f6769287d15731b9da40b6ed58d3273d5007cc909cc4a7695b0837670400000023220020afa1407a7d38969a68fda344215e4db21e95355e0690cc44849a954f96e55c15ffffffff08e8190000000000001976a914bd19ba13af18a9b56effefe96d4259472c40b01088acd7950100000000001976a914cb4100b54b31a00977fb077027809563918e9d2388ac4b7c03000000000022002051e0bcf71c3335a98ad053c6f6df6d2d28920dc3e22fa97c93528ee564df8c35f0ee10000000000017a914773669084713f2f4a28236e7c08a7a3bba88113f878efe1d00000000001976a9148ed215db969e0a39a03d343c64e5710edd00d3f388ac654d4b00000000001976a9147fda2c5d0c3c5dfe217162524326a778cbda5df988acd95e4b000000000017a91471cc9ed0aef9e88869ce164049ecd4a9535a9a8f87a0968c050000000017a914b983dc87a46497249b42f2223da58ff2da1e42a487040047304402202f6ce050acf81d7e5399d9501cc8f7e145c05d7bca6ab6a96c6fd594a35dd86f02205586606e2e8348cfa0bf36b698924c2f7ca99a64f060f25e43e29c263b7d1ffc0147304402206f9d8277043b32c3fa824fb8678374bcf82fa7933c65ab2d250d591ef437a082022019d22fb01d4b4789a3c9b52f28065753f1a33cd7407e1c99ef8ba9372334a25f016952210243aa1778f224580af04e5cc98ea9613c287d383a91517a7cc11ac7bff28b815b21027177239f076ec19b3aff2499cdb39b6bf8bb33b220cace63ea940778a18560072103862bc7910160d7b6fa6c10fef9865bcad484b5d737367e2b190ed169dfa262d553ae47a00a0001000000000101a5ab499a1a1e9a3c0e67fb16c11aaa22a8afc8fcff9d565f5c8cf9f6198455f1020000002322002049a2cc73c048e29aeb21c4b325763cda7698222bb7fb45304bb807685e8a8986ffffffff0841c60000000000001976a914fb7b59a08d02403bec03bab33af2c234f919048c88acb3950200000000001976a9145b18beb9332b761ab27b7da62e33d159a3970b8d88ac0a1a0300000000001976a914d3cc0a234ea887d6b29e23bb9820c3899e7700e588acb3781b000000000017a9145e3c3e8c1d75effc1f718dcac2b4d906ef25b6a387a54a1e000000000016001422de9d5f6fde16967f2376b54beb0fa2f3df252f5a50290000000000160014615c4d134ec098c67ad3a346dc1458649b2ff3cad5aa4f00000000001976a9145b18beb9332b761ab27b7da62e33d159a3970b8d88ac609705030000000017a91497be509e82be6e88752a2edf2d2d0a62d21c5879870400473044022025a4ceb86ba7e6f98ecb77c3233e553f06a3745c658de025e12764e564c6581802204140d0f01578d592042bba16b03f379bc1e35c7aef2c5528e81d9e41b5e998be01473044022051b34fb3a70ba24635c754c6746d622556e7d220a2d8d07e50412c28c6fc019d0220374e8c6540b8231ca7cbfb6d8a2647b102f02701d3584605e4322ed133d55897016952210264198f7747ae9339b052fa2c8034826a5f6dd59e629ee73a9f5b7bda40c5d9e921037412fd31490821662e1646f6dfde1f8e8010e3b634f8b5021a0f19e493682363210222486cfc323f22de4418dbe26eb17e27229b2fe815d96805758f075e57c04efe53ae47a00a0001000000000101e1439cc56777bf6afbe3418b4f656bfdd2804f9abca9827dd9b00ed1970a3c840a0000002322002014adcdb273d670fc952039e0b9ad19a5140262de317c6ace09a5fe00c0ee96c1ffffffff0863db02000000000017a91469fb91eb06f3deeb35ac20fbacc9c611ef35a93d876c380600000000001976a9143dd46b1feb38b3d62ae6d1461d53ade62298ce5688ac11720d0000000000160014ab02e344a0817b44a7e36e4750f1b8d06afad294cb4a23000000000017a914b8527411d53077a13d7db58c4288cb905c613c3287f6433c00000000001976a914ebf59b1af45d5ecd179bddaf5655cdfdb53c423d88acef034700000000001976a914aae746cec7057a9bb0622078b74d46c0254020a788ac05f84700000000001976a9146feb8c41dced02fae2bcb6732311d72276a7ed4888acfb6edf030000000017a91438d11c5eeda57d26f84557f36a93bec84024535687040047304402202d023e4e0cf992f4f8bcaf90fa35635635e437b0bae9623d81d5fa11d43e05490220509d37c9880cd7e4a225c3d654d62e8b7445e26a5b8b7af33a0824c0c6a71c4701473044022069fcdee1d69d03a0ad8fe6727c589c09c4a1cc5755ed1bfbda7abe3fc2fcfbc502207717d3b380332e50dab50d099ed9b8b707c8c76c6d6019076fe83360825bfe480169522102a7114dd560786b2d574614e1c28cb84a06c04a2a8f11c27f516de68bbef9fccf2102344842a2b26acb6191c3d24f1d1eb0391082227c2b4575c34441dc3edfd4076521036aea0ed5bdb6ad1a3f7440c425057df31876c26a1b012615e2dc5797284cfe6453ae48a00a0001000000000101dce562b8554ec0a1ded6f3e768bbedd2ce76856f07877e8d1a1cbd4de246da8d0200000023220020c32d5ebdf7049eeac1d1fa0b11f850b15e53b005b974ea1b91b5b8d4f5eb3460ffffffff0ac3c600000000000017a9142478e2c9ae8dd4e2f092323a661d4c9a9477982f87ca9502000000000017a9145ff6d863d22fcc0bcfb5c645825ff64d120561ed8789960200000000001976a9149b2232a50cf9390c1b5906ce4db66ab91aa50e7c88ace618030000000000160014fa3e1a1b54307aeef8d328292aed31868b01a73f2b32060000000000160014bb2e9f2fb61678c0c9c9daf468659d84e2b59d488ac20700000000001600145ad0d56dac009bc75e466b50d994fc29052e2aedb26c0d0000000000160014ef30584af55e2aae3114b4f5da3892629135d894daa311000000000016001475c38fff9c5a83e9d760beeda30b9f5f7654d18fcc551e000000000017a9140a71302a33cfa273e32c61ada8616e3d4c99118387f976e0020000000017a9140c0f76274cc1d7144fe09aa5657de6aff01c348b870400483045022100ce333329759a666bae406a231a86399f70fe843df504d39339edcf150315f550022066fb47088129e4576004ca204313c3220b13d5a6fa2c7b0aba8fa513fd6a6f7f0147304402200d77793aeef54de6dcaa21893bc3206e7e15089186ee43236ff13d63bdc79a2c02201deabd2398321b6450129fd1c713edb00e63fb67eba6bb750173c28bc679875a01695221029a00a10255463ecddc109925aaad5387b30e720778e5880effc982450f47d5882103732a09c890c53676208c75bcce2debea928f9c854af6778584ef6372e469985d21021782cd53d6da483f62fba567289732f25d62b4e08a330f0ca0dea63b873cc88a53ae47a00a0001000000000101ef275e2270547f95ec639b782c8054f67e1816e29491c4766dc30e40126753ca09000000232200203598503b6dc3af946854c9283435c16c0a24a8091a92a76defb101e5106196fcffffffff0a8a2c0300000000001976a91485d2234fc849b4f0d139f7287933f4cb1c4ae47788ac482d03000000000017a914b0506eb8170e7dc968f71e813a30b0949844846d87e82d0300000000001976a914376bdcdaf70a2374d3363c969448cebdd88121de88ac7cd003000000000017a91473166780f619deddd6f5376b7909276253485a97872ac204000000000017a914ff378df47102a20d6d85bae5fa9fb2a9fcc7ee4d87b44f0600000000001976a9146aafc769efea63257f8f829dce63fb502bc1326288ac948d0600000000001976a9146aafc769efea63257f8f829dce63fb502bc1326288acfc4608000000000017a9147859d9bf0c106fa1e03df81a5107cdbedbf7ef0a876ebe0a000000000017a91480266c5741a664e39174ed2def0ae44fcaf53c7f8753765e030000000017a914e1687c51c2fa7e24de1826af53dbb38c71e1f710870400483045022100f6de25ae6b2fbc6b4a2012a68cce4e07c78dc1ce58f848daacd5d6a5909f622602201ba7b2ba468bd7f806d890ce4301e7f4f66d460de187bceac763b3b0683b7a0d0147304402201fce29143942c6dacec905c8097ed378510658f2533c39ebcf94d12bfe140f3402201647b2bd618bb8782ee8e89ad0cd8b223f674bc1287eb3d0dda54a40d5249a60016952210241997254b9ee35591756deb8d5917e12f001fab61ff017dba0a19c6aa8c647122103ec6485acc33cef8032d9e58d965b37c53240fd5e760232315d84621dc5b7526221025dfe8f762e653aa58ef0872e13e3f80ad0f0795b3095a5b46c655056f21d2a0753ae48a00a000100000001bad6cf12e05f3153280a23076e5b07523f5f830d24ba499a429dab1f4b50aecf03000000fdfd0000483045022100a0c6ef9926471c394cb4695911a163b1f6b2c079db317a79c2e60212afa0c8bc0220347e4dd478ab93e54566226c50db3589e1a032c010ddd5eb335b667692cc78c00147304402203bac51f03adf2606570f0ab84547d13da22e0b881184a86df913425e36ec5bf302205f54134d6c5e9af3fc55d254509ce9b05e360a0880fd07bd0fee707f0d02ca8a014c6952210268b1659da1393ed8a6e4a25b15cd7997cf45f1bc2f2adc567109b2cd7b7e59e72103e0d51b4913546eb6af290550287c6290a291632562ce6e4d06b6fe8e06ded24d2102676c026bfb976c3e8464eb97335a6ac6789707068add8bbd218c05e2fbba401c53aeffffffff0a1a1d00000000000017a9145336be8c972f0660d87b7e45bef849b98bb4960887340502000000000017a9149d9eebc1e59e6c2e6fa57e2e4d41244a54ef5ade87a3d03f020000000017a9145336be8c972f0660d87b7e45bef849b98bb49608872ca6ec050000000017a9145336be8c972f0660d87b7e45bef849b98bb496088782c4fd050000000017a9145336be8c972f0660d87b7e45bef849b98bb4960887272638060000000017a9145336be8c972f0660d87b7e45bef849b98bb496088778e342090000000017a9145336be8c972f0660d87b7e45bef849b98bb49608876fb865090000000017a9145336be8c972f0660d87b7e45bef849b98bb496088799318b090000000017a9145336be8c972f0660d87b7e45bef849b98bb49608878bd9d50b0000000017a9145336be8c972f0660d87b7e45bef849b98bb496088748a00a00010000000001013972da63392c0c0cecca9300ce1e11627dca9d3b354f768fc3da8545972a53120100000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff0b50dd01000000000017a91461d976396fda9a92393c4ca85c801ef2d054c85187e7b4020000000000160014eb2f3282fba3deebdb7b5474b88f98ae3f65bb0de7b40200000000001976a9149ab8b6989b8d2bbf59e18a2e70a3ace9f659a53288ac6ad403000000000017a914742f6c061c3c0aa362a0e694d24480f7d598ecc187ae8305000000000017a914785c85baeecb29b0503590cfa9ad749b98150bd98755140600000000001600149956236e81795db9a4c6f602bee2af5b7578144b17ec0600000000001600142c0ecedf2b6e046520bee61b65596a64d491725c881a1500000000001976a914948f9a8bd6b195648765f1220a9d2368ed26c8b288ac2d982f000000000017a914c4addd63af64085bc33ca11c26f8ab8a64e16086874211540000000000160014d77838aee790bafc8c08be33a6d5b6d65745be0b8cacfe000000000017a9146547b97761958174ed93654fba8d8a735411e0ea870400483045022100de68d3c5a41ff304192b6950ba76f598a6b3472a7d55c66aeb1e382dc766c63502201eedc8d31bac4ded79e0b1d909e4e641c2cc6df84afcd9291216f82be52a91c501473044022012b626144bd83139b36d005e2d2330c3038bce85fc03b86e20eed3e4b696b7b202204e9192aef4cc5ce7b944c9b54cee2f8420fe7e0c30c751dc1750adf56a3e7dfe0169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae48a00a0001000000031701adaf58e8123019ce9138602e1ef3398b1e4d68caf039ccac819e65f5c889000000006b483045022100906c108dfc7105a50133f5ef125d5c070b54f11963393d9f62c86758d2300dc5022033a0ede2068d6c646f3def020d04fd05d48e72e5d53368a9c2d023294041e942012103f82766673796048a36c165de60bf48662e8dabafee71c4c776d6f72c8634337fffffffffbc05a4ef1b22fc68debd98418c7d68735c00daf1672fe3f0cd6195f029e7c924010000006a47304402205b5963f1b7402d71353fceef904b170a8e0b6475de1ee47a2cfada7085ab48fe02200ec848216fad56c8c097aacf7cf6ebf06905e91ab4da6e48b3a516dd4015246c012102451b4f1bb25f5b37a46e286c0ad782dedb925d0fe2ce337608c7d36f1d3a45a8ffffffff66cf314c90078d21c03c15b39f777fb409933e764c371c4790f0a1b88748ebe1010000006a47304402201efa711e3024fadd769adbe1e5be3ac6e5a0c6728114d40567199b0f769f460d02204713d8e58a666e61ab9841a72b444815191ea3b957e1679995e4ba858415c889012103f3ccacbe713a898bcd3674ef3bf46294da6531628cf6376ec6a929fdce17ccabffffffff013bfd0100000000001976a914d097da125db99d66e31dd0d8c84e1686922b574588ac00000000010000000001016b9793a7029aa1882e7fe6ebb94842f63f7101db85bc1ad2872a8b1ada298ede0100000023220020858fe21a4dfef3a0a454451cce106a181ff3e034ce4a26b2c2f63c94bd05b4f2ffffffff0d95640000000000001600144627f287d2ed5313988c4f8c8a7285257194d5942a3701000000000017a914ff51500b839f4b52b526f97abef36407a5e2aa1087231202000000000017a914e4eb77ff1cb9a1700add651a332b4659cb181755874e3c020000000000160014076fd24c3d6cf6e0384963ddbc8e272b02dcdcce70d80200000000001976a9143c2f1852abf6a818040f0286c45c9f7bd29ba99488ac70d802000000000017a91411bb5aea37c79c8d67fada559d47e420810edffd8797f803000000000017a914b0181c69298495b96ed6b1d578f20eb3e57368e48798fa03000000000017a9147c16007952b008bf4a5757ece7e7cc3b0482c6498707b00500000000001976a914d1fdb46aa4ec821f932a1182490844e33399a55488acd6640700000000001976a91496be300d9333d21da703b41574f3e4a609f0fbe288ac1c0f0d0000000000160014e2bbece033c762d165ea4d623025bcc7300dfa7856a03a010000000017a91441cc4c0fd8d3b27f086af8219b5cb4fecaffbe7b87ef769e030000000017a9144a8ccf8d06fa91c9c3e4d3d2653735c2e8d8529087040047304402205737a503f9e4e9042a3a9a9a87af5bb00609a2ac1ee83797e15ad1c8cdda3604022054b55f55878233ff060357c183903d3d84e343b467c707c0a58a73685b7c30d2014730440220177ccaaa19cd0d345f7c90a827d8492b79e7373b0b2c5a322d6a87372f79536e02203ebe5805226c7f26189f9257b7a65d9ae85e1097dfb27e9d649ae2efab305b240169522103cdf1a55e6fcf9e9b212301b4d607e92c0fcda95fe70705d1b3d7e01eab1789d62103a72c6f6a7ca78797ce676fe37e759c453bfe2181e57c3f69d2f2df09b4137c70210363aeadbff2b75c9f41a9fe551dfc9a2bee8596bc15027e5579d0dd91e40777f453ae49a00a000100000000010149ab66630af86867967a2beed7bdeff62d967c9564aa3a97d0db254f75c3c33001000000232200203142fbb1b591f86bdeba421ad9b1d4c8529fe5b2db5caf02140db8befc3db4caffffffff0d84ac0000000000001976a91447f5b28bf29ba8b71f557d5633c81bbc4b7c955b88ac8b0502000000000017a914d5e71810604249ca0a15da4503ba55bea67317d087269502000000000017a914f3b9a09d32b10115fffb7b1bc0c08b25240feacf8795830400000000001976a9142737eb8288707e2c13b1b9172b93738936a6a13288ac564807000000000016001464290da9d691eb05a02e567c1c0e82a6035f1f4898500a000000000017a91438fc30f330c8a13c17fe30211410600c5959b376877cd90a0000000000160014daf2273b57b452e58787be60bb93d9ec9681f060278b1200000000001976a91495a11d06522aa0f8979df819c5e701d8a61813e888ac4e19160000000000160014d895f483190fb428eb548a81492ec0a9568a6573ecec17000000000017a914a16806c6a322418fa066d63ecbc5b4804b4f720387fee11b0000000000160014bc070f6e4aedb513b36bad3ed3d1cae2bc23877982664b00000000001976a914e7c2f51260b898ee90f02ee90f3c0c97470d2a2088acc39f7c030000000017a914ccddb8865c33c44fd5760859ef357eab2a3a318b870400473044022014d6c4d8c1cb36e1d431cd7574886d1b3ea790915c7c463c75a1f7396dd79e7102200b82540167219167b7b5ce3450f7b206b23b0a09f6cd388c609de1616c3251950147304402202d1fd05f8578c90dccc7e2ff6202636d052e3c5e393b749f4061be965ef809e802207c0ade3e82825c7bc9b47ffabf2c3b550d1d0a3d2f8d66d4eedd5b6c46d4d1fd016952210261b1cfb9dc916de9cbb837c111180caa712bf8e83b8d89f6b4e80cc3ac6e7b5f2103835a9394afdfc3bbe609af5e50d638f438e655a9febf57b9018b2e870e1f6e1221022d1798396352b3e2f465718bd89662bbc100e0e930db04eaea5ab663c625466653ae47a00a0001000000000101c38bf58d977f8b9ebd017ef8ddc8b319b2de068698613f66ab811c9f31390418080000002322002021cd33d70b92069e527f3b06ee15f62d87a66f36778e60e539066c65f59507fdffffffff0e8e2d0300000000001976a9142c013ced13e362abb5eaacf30b3b7c088e6277ce88ac1a2e03000000000017a914bb4c343c9fd6fac24e01d0d0e75d09f2b633584b874c330300000000001976a9146867700f7a49f263ae95c7f46b95ffd8fbae9ef588ac605603000000000017a914df27237d79e01be3ded98639f511a835a5f7bb0e873a0b0600000000001976a9146db386c85045f9f1caaeac8430d83ca4ed9a68c288acca2f0600000000001976a914175e2697cbcfd8ebba2b4edc0fd03fd95c3c9ca188acfa590600000000001976a914b6c197211000c3b58d8a27fdaf7514c3d428ba6588ac8cb70c00000000001976a9147e6d7b4570d9223db93898c8df81d9891265f96788ac104b0e00000000001976a91417a87100957fc684d588799863cd0b9f67f148a588ac62821100000000001976a914903cacc4400be71d1a65a06087208abd0096320e88ac10a61200000000001976a9146383226317c4fadc5392fa740cfbb0908a24590688ac58ce1f00000000001976a914175e2697cbcfd8ebba2b4edc0fd03fd95c3c9ca188aca04a1e01000000001976a9147e4efa95b0aa70f3422220343956706189002c0988ac1ce31e010000000017a914de3249f843bed5f36e44b16f485f7f4e8e1586fc8704004730440220240162dfc92a03991d0f63b0591d5eefebcd3513b43cb1144eca014e5aafa33402206345910c17684e3c12d7210900b9ea7d40dd241cf5777a729b7e551194a20d800147304402204726d73cb7a8df123401a45588a58211de46e33e6d496bf5fe7e2990ce2217540220096c4a6c38f5c6e823ec5b199cbbdd9c5cfa686de91394e167692962122304d701695221023cb7667802995eecb387b4c112019893593b70c2eaf5c9a8ce4e3f8503718ffc21028975996a5d41ad96ec39965ff0e814aa7eefb563c837f7a6073551902c5a5d6f2102459415ed6a4cef6d54fa2033ebfdc1f87c24c2ffc89e7c177af71f2e9665b44f53ae49a00a000100000004f976a009ffbe11a05f425f745cd7a1a4a12e650cd3344eabff220ddf89d6bee6080300006b483045022100e6625fd18f81049f349b47b7bf2a0f0352b42b5c0985d4c5ed3f625536af8b7c02200553ca38b3bdc0bcef384f13df4725d846cf1079c91193c8b4aa84ae76fbf44f012102af49895337db47f118540ece4facd7a69cf2031f7d9f3991c5a5f25bf86f3273fffffffff976a009ffbe11a05f425f745cd7a1a4a12e650cd3344eabff220ddf89d6bee6310600006a47304402203cbf15e6266543a37599449beeb22afd854e762360d193614c774065b25ed9e9022076ebc63adcdf892a0ac167d9ffbc0cddf92cfd0c47b24b2cea692f8b84ed71df012102af49895337db47f118540ece4facd7a69cf2031f7d9f3991c5a5f25bf86f3273ffffffffc078bfd795aa25331408d574b2b5568f07d82eb3c9771a143b2110f651e9cc2be80000006b483045022100e8d2685c4e474bab795691b6aa42756907c4b7909ea0af575adff8c4601ab3be02201df263f75321ceb7ef8fa29d29e400e275225e7eac0e8df9713a675fb1039ad401210395f4118c3f16f6a01d977e86babbd9ffed54a9f82058f87500c9e8ca6915263fffffffff9ac140e10026b6f0be50db7f9e6e4740886df34764eb0d4ee216d1e2cfcd6695480000006b483045022100c91d46aa7eba5c2081afdd51b341d4df25584bf243e447e48cc842d9f9d0ca0f02202310f262662448f5402195c5e55bfa53ba9fd7be237b9d477f552ff2ffa793370121029a82ceef8cd8e04d1a45b392e2833717924751472175872cd20245714e315cbdffffffff02d6e7010000000000160014ba7b662d2dfed3551481f5a713e29707ae4361ef67b70b000000000016001485b802810298b0a773b62c89866823e1eeab08bb0000000001000000000102975b936f5b20d8fdfd0219a1c83453965535abcd3c672b9e02e501ea2879edc20000000000ffffffffa87c02e25115bbdd7ef4499bb0be9d69db561cfdb731d09548023c14d6bb472e100000006a47304402200afa123143cdca62ab3f258c9b1a7b10115bf8919eed81540114894e5fbf0b43022001c8d983018ad16b8ffa643aec25a0e33e49aa941a26d126e857a8b67d67b19701210208775110f02341939cd97bbeec6a56711e758b4fc607563eb2cf91c186f924e5ffffffff020c940000000000001600146b96fc51e1f0c6329e281b268eba5eb4964daa121e300200000000001976a91403728c88b1109188abaff163b2f378742a5b50f288ac02473044022016ea41a817ab5c689cc24708add01531bc236901ef0e10d0bdefcceab0efbafc02206ed8206c96c8a51f941c08320a24c9ae0b20f00ce9e50b40fec584740fa01c970121035d5e0feb6b4154fdadba069c80ceb2304452305195904bfe6b701278d8947273000000000001000000000101dafb78351fe54ec32c413975e09a6b1c2e71ed445e69554e024d2f2700bff3470200000023220020893e38a8cf1d10d98c3b08c344692e536992173f3722fa98c015a61f75408fb7ffffffff1005bd00000000000017a9143c4b7cdc3df4e984037b668ee497fe24fa4ba53587649401000000000017a9140ebd362606c587b040c961cfa57a47ce8da4fad08765950100000000001600145e33ae40e86a500690d90a67f67fb193cabb63132d6b02000000000017a914648b61f277e0565536f70932a0969f793c342b7e87774403000000000017a914232496be1176412ecdc85dd133e1e74e056e831e875cd30300000000001976a91441983e6116eb9c2ad386ce13422ae8b514e06c1b88acde7e0600000000001976a914d1a0937fb98c183b315c634a66d5eedb3e3c700a88ac239e060000000000160014bb2e9f2fb61678c0c9c9daf468659d84e2b59d48cfbe10000000000017a91457abb161a9b92441ae5190936a40991399dcc2c487ca171400000000001600147303d921f328050b796788611c1ecb267fb03f530b0a1800000000001600140954b4463f2b1a093b1d1612149560eedcd1216f40e81b00000000001600145d73b1cd6e9c4f40a9bca5f5fc6bbdca9421716d77dc22000000000017a914c8e55de19c2eaa45f6bee646cd72c97ddccdce4b87461c27000000000017a914ff0070199461915d2170e69fcc30067cdec1615487c1d145000000000016001440b9649a08b230518f7534f9d529a62e85b81cf604dfc5000000000017a91452c051b666060db26b8ec7be35c439144c6768cf8704004730440220208e2df27a406f8bb012138b0ef6455af64b9cdf8869195518d9a735ff4962e702206251979f7e4d9be66752929158d24d0354f2e8e9f1b03d4987745c1cbc3e172a014730440220201b50281f6187f7ab9b259dc83af4efe412e0c557566818d9b5f581604edf86022001c9bb4eb6690b5bbd12dae6683af4bd5d1907c731d60e4f92dc389821d405420169522103eae02975918af86577e1d8a257773118fd6ceaf43f1a543a4a04a410e9af4a592103ba37b6c04aaf7099edc389e22eeb5eae643ce0ab89ac5afa4fb934f575f24b4e2103d95ef2dc0749859929f3ed4aa5668c7a95baa47133d3abec25896411321d2d2d53ae47a00a000200000002fcbb2b64d40b607cd29ef62dd34ef2ec3354043a6d6d01ad637b8affc51d4b04000000006a47304402207cb4ceec7f1b75bfe29441bfa360077f7912c08fe804ef0d8a4392af1eea1d1a02207e3e915cd53acf231f509e7d9bf1779e5809c1a97cf226dcfe7ad45581d7edc80121028e306d64c8d1979bcb2151e7100a602610441ab34b318ceaac1108ceba902e5dfdffffff64e2ea7f2a9e90fe59edd7cf38216eca21ff47396f834d58e16a41288288e8f7390000006a473044022056096241f161b9be3390418747ffd821f94ef3e115cf7eb94bb1303e394cae8502204287a56fb20fa0faa60d5a6af61b26e8d63cb69b049e652adc637f07fbdafce3012102af54029c55da5919bb5d3542be4befccc6c5fe62aa510c3d02509fb330974e19fdffffff0240380000000000001976a91456f4bda98df8dc0e6fa2d033fca8e5b59a64864a88ac00b0710b0000000017a91434ab2d93bd3c169100863d4d561636c5b0a6cb758748a00a0001000000000101a21d4f81cdc9e8d8bb7508505548275653b058d9ec4be72b8d1d0498e39a8f5705000000171600140f8f95e3da7660889ef3302dfb51f9ea36f5cfd7ffffffff0318ddf50500000000160014f418ca7eef91236defd08f68151af7ba6e954988cab66000000000001600145be9874c6406518791088732db45ffa56b7c93135ccc76170000000017a91440d02c3e4f65b3a98e5e1c6287486b6b6785c0438702483045022100a5a548157e3e862a5b62100fe0f0b835ad2b4f4187caeb619227883653ad1873022051a35323a745761621a64a9006c5f6f1576a21bc6d655081850016eeceeaa2da01210337f2d24b1d287a6896c89056fd193876b31ebdf892b29f5fc86f33bc1f717bff0000000001000000000101078a2784f354e8956e21ea98ac131a5b98690c249697f8c849e1b07cec8dd8a3010000000000000000021b9d3c00000000001600140efae5d7364aa7fbf7a04ababed43f0673f4566e54734100000000001600144a8e7d0a9608229ec3aab05e1afa82eb5e4de05d02483045022100e651b1a183cc2d1f4d20031394f136787f4c1f98b30025097b1247af233a496f02205da7d3b2372b8c2c69a9c4577d3ee1c03ecc6e4ad618b2de708eb635c8a4a612012102c109133f85d7b4633c5efdfcc5d04638d5e217feb46889f563ee593764c6bc6c00000000010000000001017ac074b203a2f8ac580e6a944fd96a47c9a1b71d730c46e50d6e81539cf85e0f000000000000000000027ea443050000000016001408162a8ea44f38cc706229bcbdab22504a28c9facf574c04000000001600140c00e098db890d270e1de154bca0bb23de5770280247304402206d52b6e914cf2ec75d5e367a582ea86a83164cd8f096d3d631a597ad734d5d600220576f3135483779e410ae2a75f17b6912cd91587255dfa2b1644ff9d724e5e2cc0121025eb24d96be53409536e21eda8ca6d91a7c253a998ff509485fb9ba7f966173a00000000001000000000101903c4e176e8ff82c0717d3eeecac24f5a4bca281fe6b6b0cd8fa9a637fd446e501000000000000000002a8760000000000001600143dc20c7abcbff52d93d8a3519cfa937d66f49876135e0000000000001600146599a90d7841a1723103676d83f11e28355ba6b50247304402205da67be8648bfa708fb0f060ad5b6cada4a54a61ee361b21894062aa5cad82e202201c72e562e9efb49db5d066892d2bf89a44d3c7e18ff6b4f14c446aab97caa288012103235826cc5f3f44754a76785db0228f283e4be2559ee03dd25396cd58b69e68a20000000001000000000101ea56b4357360517e972c8c743a2994f26424c3408bb64670c144bd4c86c14aef01000000000000000002c8c2030000000000160014e55ac1f4e8d1ed3d42ff228ba1bc3478e1976a0805a3100000000000160014d3877cef1b9c5c1ea3d855347aef6661bdde579f02483045022100cc6b2cf0858d30d18f42f8cabc77d24867b17d0a50a07af1b0b4a085b915545a02204629eba38a8426aa8a77d07087cb29749e0910937d29596ce83115f0d583211701210273ea661024c525a4bdbaeb7027337e1972ccbfb8e6abe420a26d890c288821be00000000010000000001014dcc9dc0e413ffe822413cfdf0257faf672643ff89cabbe052c36c3d93e8b3bb00000000000000000002f10d8b050000000016001408162a8ea44f38cc706229bcbdab22504a28c9fa5867ce0b000000001600149ff4c2b62ec7a44c21a03c702d6cbba9f57cefd70248304502210091a7e27606f055c3cc4e417b97bc73cb3e7b4d74b8cc677e97a80c1bc7ed301b0220783319c94e900b9124b3a9913b3a0dd04ac47e1e0ae778ac75c2122059673f0901210345c89e1e454a041810fe85ea32c304312e47a0f5fa70a9e8e26197f12df0e4db000000000100000000010180c335ebce6a72fe8f88a45d2c2f6b5efdf943f7da41c327782ead43512c2a690000000000000000000234a3040000000000160014f3496579cf6ee78530ee67716f6af7b36d167dcea7f5010000000000160014b1883e23ac9401429c3ec58a293cea4dcd7ad0ba02473044022007857facf7d29369f5e8a8a6b5a98cc9f2b96c1b416da945c3f1da4ce151f83d02207df25a96dcbcdaa739298e4d7665707d809d8e73cb97e0121c1bc6f3fa0efe9f012102fdfca8a637e9de855e73d32c3c66862a6b4ecd54b870d50b076a4e60246cad970000000001000000000101f791a328e8bb46547e365ebfb956f7d7d6bbac8865f77510ec38a22ed084205200000000000000000002a086010000000000160014b28558558747eb6da08e220114de1c41a612b5ee84b6130100000000160014f89dd4468508b478b14a84b5ba04fb119d13e0900247304402203b3b0860320283725a96e691cd13912410f07e233fa00be29d45cdcdbd5e83d10220512503cbefa30d950b2e23423d3af04b7f44fdeeda181c2016e3160dc28bf430012102c0945ce4e3dd1fdc9f917729a8a199e368d8cb62380a5059b3aec441372a2c7e000000000200000000010180339d98582164a8690b0041633c737502fbb19fb7539cb0f5efc2bd043f7f170100000000ffffffff025d104800000000001976a9147b7969a87b7ee4f42fadd6cce31899323c4ca78a88acff11ee2100000000160014b41ce198d0cf0095f951caac5bc0fba4580947340247304402202565783ac03198782825aed32dd9405331fc5f382070bf43c5587ffd66a6f8df02203ea333a7e7ba277ec2977b912be790400565cb46e92a417d0a3b555b4dc826be01210361d29062bd3cb07c3b86f705e66874d5f497c99395a3fea69e12bbabc3334c3a000000000200000000010122575d3915a8c8d15419eb3e1e41d43832a5dbc46f4964c7be42ef98da1c9f6b0100000000ffffffff0242a1051c000000001976a91460eb31a655386dbc7977cdd7a18a36f7c84f344c88ac106be80500000000160014d012dbb9db86d57c11a0dfc08133fadadc510c5602483045022100a4dc34b048ed4d1c41f284dbcf4c96cbcd6777b113cbe32a9c7b1d5d0c2ee76a022057f98a89d642598c36dfe8d98d787db83e405d9bf531a4cb56ff860f3acc5ca20121023c7da3166e6ce5fea14f569387ab67894a9401fd7549cc52620ba0f88be284ef0000000002000000019b288dc5d9e13b60826b4c5c9aa0a32b6700de048ee14e862421cba94f89fad2010000006a473044022027353e3b4a1a2e317c2a07e527f51edf873fa75cb86e3e76c7bb6660ab6618c1022043aa4549f069fde7be324153b42cc0d8d2ba80d796d175cfb94aa486262008d801210208b79248b18ccd4317da4dabc78c7b43befcf8b8fa3775c2f6f122e45f5c9f90ffffffff0252cf1a00000000001600147a76f990f93692c2e1f9068872852ca9304785dba7c94804000000001976a914e262644f2838225eff62b788e95e8b93864db56d88ac000000000200000000010115dd71e5b61eba9da4f6c2c4abb8441cc537ce6999f082f0d41b9a4bebb874740600000000feffffff04bbba14000000000017a91449534e1b57cb83b2bf7be8bd62e2092dc437079d87f4d20b00000000001976a9144d1fb4c48cc9fc675298103f633fb7072410870088acb5ca7a0400000000160014c130f273d77c570772e97d90e48fc0c7f38776e230883a000000000017a9140a1962ec0d09a72c1c59b3414ecf0ec311b95e26870247304402200fcd0395db013c66a48e69d8e59bc1a40c6007db7a01bf595fbd5233ab8ab3f602202390e8135c7888f9495595254cfb6a2fb4fc34bddea3226deddd6f9a44fae2e601210374db459fcd5f8a56823d9f8bc21eaaa48fdec9d4035d9f876d6a14ac338c21c346a00a0002000000000101add71acd73cda67ba9c13584e11df153df17572b6eb79b0aedd0e415f8681f700200000000feffffff03983205000000000017a91404ec82f1395153aa192ed565c99ad7c26b8dcad5878fd6520300000000160014c1616053066d8b563edb01a57d913c3a8fc1b7cd80bd220100000000160014f999d810cb28b37f66b73971a7b86f9d23743a200247304402205eb0c8f616533cfd6f333a16493a94fe6a141d10abbc69be0d78d43aa7e717ec02201ca8403726376eaff171ceb53e0ac30b7a07f3aac7ba5a0df1f82159bed70a300121036274f2eb0147fcfafb344b3a9355c54fb9959b6df08f04ead21ef0dcdd5b4e9348a00a00020000000001017d6135d961cdf97f0307f4a74500f840c76322e0053537907d7fbc7d2403bfb10100000000feffffff05c9680600000000001600149619786da233ddc98013ca9345f726cf03cc7b156d6f1c00000000001976a914d43b26fc3c7709391c0feb1d6e03d193659411e088ac47ebbd0200000000160014d7ccd48f266a423210e260ca53586a848a3986cccbfb38000000000017a914305a6a6201c17e89bcd16a24e6bb2974ae98e8ef871e113900000000001976a9141c0db03a96195e5a29bf238e932865241c2a013f88ac0247304402206749204ed1b7f1778927391e48f1822417708f9f7c469517e6a70f3a49f82b8b022056fcb0757567e23c65401befb9eb912b74187435d1451bd089ba15a7dfecf8b7012103d7e07389004395cf6e47d31392f54914917e19a454c696a6248e48320107cb8349a00a00020000000001013ac611a37c5b5190f08467cead3a5b3d4832b6503c40ee6380da4afc5ee089150000000000ffffffff02f73103000000000016001431362e4c72b9891ae3dd90c9304f1649f08c0c5e05f01200000000001600141030249a91627c0e250b014560ac56cdc382dcf30247304402203c1bcc6b80f182bda1aa8e23f5fafd91864055c30159f6c99d9b908ed1bcf3d002200aeb5cbb1087156213b6890424ab8b645c4b21426d678662ed4a8ab16c7f03570121021e3a77741d11d42dc793d50093db20737fe93bf4e5c2dc8185790620b3beb54400000000020000000001015f1a258838c2a0fb989ddbb5c90362d14f069484dc67f484e843f4335a7e9a630000000000ffffffff01212d03000000000017a9145cde351085b1187c876d8480186084f5965878cf87024730440220055c9c33389ef8a404d1dc9518e443ea7ea156190821a9d70733c5ca19abf26102201e8aacf62bdaf908c1f1e7282ee10e92ae29a81b3fb3726b0f8771ca9caebed9012103e5f631233756dab06f2bc656090ad77aa3fb7e588321d7c6c03d9cffda8c48ca0000000002000000000104cc704585a43ce16b4551db1505b8acf176119ecabe04f03b3afca54bc90758ed1400000017160014abb86952acba587279e213a89cbd2763b09419b5fdffffff1991d81c7ceae0027d88121878e707d053b8f104b36b95433829cc8b09a749a92900000017160014569a10d0056f077cef0c4c6b50766594654e8adffdffffff9e5c786826d6a92e36be426272c079cb78bab701a43a4f66cd960f08f04ef8ad000000001716001409164d65e72b05e7be8c543e1b668b928c172b19fdffffff1b9cd58857379096d2394deffec53184739d6ba24fb0d1a0460a81d558e23b3c00000000171600141c0a4a6c88d341234824c32f8a2046054f1837dffdffffff01491524000000000017a914559c054024f00bbe66df55ab81f5a9d7c79eba85870247304402202a0476bde67c3108456fdbdf94835c948be2eccaf744ceec96883b63c45905f002204207b4e9218bf651467382be3153ffaf48cea8ff5216f41b596c0aa8831a5cdf01210389f41fb0494d6cc55295b45e7db0e664a9ff903d268c69014d2cff40970de5ee0247304402205810e424d7dbcc8318d1841cb6b01d458c2b15aded9a247422b53e0cab3d4ae1022046a903554f837d766f910988af8fb0a49783f2c1df52b54659522c9d970f2f0a012102c5201849ed21d24d1531280d0d9c9826e83c2797c61b0043ba62e72e9aa3954f0247304402206ceac934300c87805237e1b93cf97cb0a197ec36d3132ee4ee4fcd5c8047212a02206b7e7f75a256ce68a662dd9ab7a14dcc823fd38a4568f2c9fe3c77e1ccaad6c5012103c2f2b79253e72727da66e14dee8f2555083351ecaf04d9875ca85156d8cce71902473044022012a0dab41699b3669cee83a21e512262b4f6db59936a988508d4d751adc9972f02200336059252db9b7db1867c154a678341bf32e6a69a8ae983fcdf98ec6ad85e160121026c6c4f489c263bd701a3062f9144ebe7196316ea5cd15e531dc3afdc3eed5b5149a00a00020000000148b6e1d2c206cbd007768bce6781c5fa48e5229cce8599d97b8215352f73afe5010000008a473044022031db4613c3a2eb50524320940e0e62ea0eb994a783a7c7e691c0c16b2468e89202206354f1020f7b616513c9b412a977f066ce3f97c2aa4054cdbac42329ead5ee9b0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff031339a109000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f0000000306dc420022020000000000001976a9143a0c7346d26d13dbecd0b6956cf1c5492cfe421588ac49a00a0002000000011f29f24af695ad8953d1e5fc656d5871c1cdb070c9f95fe92ea6a0a540e5b7b9000000008a47304402205364c20d77dfd25eb65c2d6bf69ee19151e3267d2e1605bc315cb9945259ec6c022014f654d8891225414ed3874e2d37633754fee4560c037c5d80c08fc022ff0d4e0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030730a109000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f0000022cfc6fc5401c0200000000000017a914bd68dd9bed35bf291a5d834ec75fd4325a26ebbd8749a00a0002000000013383770e338bce10c2bb71712daef1721434508a8d3a62ec4ba03aea96446e6c010000008a47304402204c590858dcdca1e099a65d9d1a2963fc8cbe2ad04d3a70690fcba6346be84115022046a3e492045abe0fc76388c225174a69118f27f163d73e0f539c0ea221c6e0fe0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f0000000ba43b740022020000000000001976a914c74aaedd7f255d438e3de7392aaee460e0ff8f4188ac0333a509000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0ca00a0002000000012f7fd6281c43427929c68e892eae397f2888d245f86c904b1d28e2bc91897484020000008a47304402200430431b75fb869af9c74649bdd51e9a503b548a1afcb134ecd0979afed5aa990220417bcee6623683d5c18f320edae4c707034bbc1e7c7055daf2974a3b0a57ab3a0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f0000000ad806d78022020000000000001976a9144d3cd6e756964f7d3011ac77a2988c1f0ca90b9388ace529a509000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac49a00a0002000000010f6123569f59505b603c4dce2b21276132b316fca8012af6faedd77bff7937e7020000008a4730440220088089b07defa819110c760e53470a5a7e93a3bfda35cea30a4e732cb44c1a9a02206fed468b44ede1a688ff1d82b80b52ded7351f7ec7a6031f2a42d6b995c4238f0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff03d920a509000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f00000002540be4001c0200000000000017a914b42a576e24994d328d505171a00e0df5df27fa4d8749a00a000200000001d48112d4783609ba0f602a5c1fae57bb381bf91763e9ca02cc0257ab870754ea00000000fdfd000047304402207967fd8abb03e0e8d9f6737379ea14e2b92ad27babe0a347066e334e87431f0202205691e41c5e4cda13ea8a7a4a2b363c0faf285f5c7096d84bae833812fb68b0b301483045022100db9a5bdf3fb86dc7d3dba28ed61a707f95b022d549b607b06e3139c960a7ca76022024a2099870ba1c2cff701fe3e6eacdac8795b9e443139d23a110e9ec228dfa73014c695221035c037a36e4ec9aa1aefcef02ff742bec63c098c0a7f1c9a1b822b6294afbb7102102a1ccf15bc58870240578a2922b3f0e922260f37098adbd988e15be36943816912102af3be4803e51fef309a51f0332f399026e99dae117dc2d22a71f4eacc1f3f4f153aeffffffff0376c879000000000017a914a7aedd0d1e77300fb06aa154c9a517b74c08d24587aa0a0000000000001976a9148b7ecd919c48bc58142d38795a155a062963ff7588ac0000000000000000166a146f6d6e69000000000000001f000017eb18c029000000000002000000014e59819cadb76de35a1e931c910e958e3e93023ad74e85e8e110ff56b7a4db70010000008a47304402206ede4e550cac738c120719dd4bc777a79cc6a97dc17eab44dc2e8c2e57e942e302207c6bfb399b818be3ff5c970c41460c7071160aaa04c4ddeff666ce7209b25c760141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f000000e8d4a5100022020000000000001976a914353e504dd287e55e168b96b3bcd71f2f3056b95888ac4bbf9e09000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac49a00a0002000000014a25e5ff034746be7c17448673e14d34d4337dc9050cfe72d1fcffe6b0e4a127010000008a47304402207ec7698afb90252d22c9cbd7410353b908273af36bfd0c22f2687488841e1ad902206855b86f32aa85075bb2ef7b145d00d932ef985c9df124c94ca6a24802c1f85c0141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff0343389009000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac0000000000000000166a146f6d6e69000000000000001f00000002540be40022020000000000001976a914519c88ca4efd6e1270356d08fdcb18ffc73d1e9288ac49a00a000200000000010103f3f8d4a349a22ed498ef337733879b5a976b2923d9af834df75dbce8b79d730100000000ffffffff02f9010100000000001976a914e34bcdb2b9e449a0e8a14101f84ea4583a09c80f88aca6670300000000001600146068c549e10aeb9659640c2e51219358baa4af6302473044022028fb15bf44b072c4e8fe42447c79a5287f2a41a3f4992b1f52ba9b04d214cd4e02204ffea3e63940a13db64af8bc1b41a9ed9db7981bad4f1623319022bd71ee28500121037557fd1063643d8a68990c593ba1842f62241335ff62fa07babf46a6e9fe383c0000000002000000000101b8aea3a703af7b46b67b1c43fc3434f9a2f93fda4d48ed7e5e072654e6960f1f0100000000ffffffff027b6f3200000000001976a914cfbb33fadcb5522f7f3db573c5303a426d8a927e88acc0ef7c0000000000160014b4f93871218e8c5308b75b21390ee7c07c8c6ae802473044022070867b23c7b79bc783034ee4e305cc7e66188ced828fcb2a5df9e2ac6612167a022063f953ceded72664b98cafcf5dde93f357bf657881c055eec87dd5f935e8c87f01210379de9a203f2374c16a700ba27e5b91e08956f17ab1626c4e83df15709e0aef470000000002000000000101c43a2d09acecbe6fd3a068e97aae03488603fe5e3706c562f97d76404095e5430100000000ffffffff02f5820100000000001976a9145c0491881afb8338c7c5d7df499a1795a50a214488ac8c081100000000001600144a6ef39555c93970c4ffda61371b93dc7a87a3c40247304402204c8296cc866d74e54f526f92bca0a96ead60a307a14e5f8e0645c105d452157002201a70bd137cd6d11797cb15dd8f3013fe90a9a36572d567f100db5479de63d40b0121028ccce3bae8a17653ac51ce41bdd5b9dea9e32dcb268d197f9c077c6d8a19b7c400000000020000000104f6f5679f340c4e1c7ccd27cf5100f1f0deff4d84f39211ca926255b2d05656020000008a47304402204982ed949f6f3ba84139fb982d371f158380d2b8d37ed74e7ea00c9c89ec542202206a4bd678a52b3a32d613c26175c7a46c108f2a56dd364ca764526350c1c6a8110141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f000009184e72a0002db69e09000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac22020000000000001976a914e798b41d0810a85fcbe2280d132a810d4ac14a0f88ac49a00a000200000001116819a4caa293c2fa3738d2ede4ea8a9c166bc9ddbda23f63ee32dc0fc4ba87000000008a473044022014df60a48544b8d67f9e6f0b35880ffb9b090e39a2a36049827903dc9ebfcbc202200655036d10aaf8a3e948a1c7537502981b3dd0dcd23f220f89e9493063f1b8a20141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f000000236c9bb880252f9009000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac22020000000000001976a914da2bbd71b0fd658b2e8ba456f3bd272d0db3ad3288ac49a00a00020000000001012e11fe49e4c0051a98a99ff95f2b7e695c913d77b0aee172305177e4b727d3340100000000ffffffff0218560000000000001976a914f01a6f5fceed70f63efa081d51a6f92b24a5f16088ac974324000000000016001496fe112deac3339323f9d2ab89691d8c60bf20ee02483045022100c6d6d98582e5705d849880d871c40554e8f7587737597de76d8d92ec9faf82d80220118494ba6c938c8d4f401dab77d8380972b491acb8dbce00ce910ade8377405c01210397c6f5265c770357bdba9448e1a235722373b1634efe08696f676dbceeb4f67a0000000002000000000101347f5db813158a6fd3d6dda503cb2044f61fa354464c28fc790061527fbb234a0100000000ffffffff0240551e00000000001976a9148320d3a4792ac6496329b4294a2b991ccd202a0288acfafa060000000000160014f6d3f9b8e103936b24903dea7f02dcd61b7f354f02483045022100db098db23612f6a131efe991ba1aef9bdf60559cfb2400dfb50bfa73397134a2022013695761f7cab289d22ce675caa87c8e021c7aa387ba1fc295e2b07b541b9fa2012102db8d517b945f83ece84024912ab8a8cdebd94edce7280d5cfe2c302dc862c5d10000000002000000014bdfa2807d7bcca96840f5f60b572640aa6746ca53314fd812a3e730fe1f2517010000008a473044022057b7b9dbee83541c2d659a8575d3dfa73e6c4ff050efa320b622a9b08d72124b02205fca5e250e76a1fe5003e6e8bcf6edac02f6628b8ea2f636b86d8a3487b10fb50141040ebdb13a94b7be96c5c354d00b89f719ec4f37f8391fc9bbfd96dd13bd3b918b5f416e33dc817657712db17b3a84bc0d88d9651e1f87020d91691ca48eb10657feffffff030000000000000000166a146f6d6e69000000000000001f00000014af83db0022020000000000001976a914e533b3df4bcc090a49dc94058083f60d804283c388ac02f77009000000001976a914b95307f028c6d8fdba3f34e6d04800ef3fa5bc0588ac49a00a00020000000001015db03386b9fd26e229f9682a4c56ca0ecc960cd2d57a897a378d9964063cd9710600000000ffffffff02505c0300000000001976a9149d84afb990d9089a2d7c40502d01a2d91096b5e788acaad305000000000016001482a9f0ad0d6b138e121c657ff73210b04f6ec3ac02483045022100a6de63b6915cd4320745050624e240f785fb8addac83cc6c9f9987b4f3a5433d02203b19846aea6328d706e2324bb1cc5c4e34ab32028453e3816c717d086afcf9530121031bbb398976cef5e35a490228311aee756b3fd22b8725a575dcd0f7cdeb70e0ff0000000002000000000101196fa177a4191b7d7ab4048252a043f7ba44ad6667e2f10fe20f641565f38d630100000000ffffffff0240771b00000000001976a914f3af4beb2d5be452bedaa946d25949154a67c69188ac78e3220000000000160014d791e778c6d52cf65c6ac7fb7a0785b8d504db7302473044022013ae0d0a364bb82909f048f72a767fcf983f178dd15f0dc30a123c6c54f1208e0220066aa6c344863e9acc32108f00f1da53476d963c6b8f87eb1c7edc26ecf9e6b20121023cd7105ae91eec34b0fca530e9160620c24d34818d156ce41cd01277e78bb5910000000002000000000101d3363b444952ffa12cd50b2d61188cfe03429cafabe9b0c7989c798e95f8a2730000000000fdffffff024b681e0000000000160014c0e55193472abdc9386ba0fc5a084a611db202ea2a8d190000000000160014d8477799535ff6613f8367f0b8b324a84eb1353c0247304402204d3de925092d52b9588910097724ff95c4412fef231c34534c6e697e2dd109970220529e81835e5f8a58537efa6dc0836a66778c5d7acf7efee035931429eadad9750121034e7b52977a3d489e1324bf76dad3a37b49f4968e3895a77c708701e6d14fa01549a00a00020000000001024d024b41be5a6e718263738a42cacdafc4447cf443162f196c04a2c1237fc0180000000000fdffffff11d9820e415cc61294af6da22f226e3ee106acfcb3c878e4c71c3ff7de67b4c20100000000fdffffff0266b30c00000000001976a91491ffafb8c66bb11704b011a3d186d1828f298cf288acdc490f000000000016001451ea2f2e1829cbd71e60b16868d5a289a9db288102473044022064d7cd28a83e08f8cd949f9af737b5000f2ea3921b55f6b0b51ae10d91e54fb302206deccb86b527baa4d2b6a4becfdce24618f9733ec49ea9296bff03100b23d7580121026f0ddb4a3edee6adf585a9550c258f5bd4b7898cbdf28a973935430913bbb8680247304402207b3174635d8a96c35c8c54e9b9e1835e2208bfb71651e2acbaeef03557e7454b02206a324f53eaac80846f25518e38f2b8a40c7d30bcbb1f836c954ebdf1f20d81f301210241cde802e772810bbee424dd31d8686baafb577b934497d9355f067091577e1c24a00a0002000000000104df61a43ddc20a811e5a70d88de45d9e5cb1baf44619e2bcf309b1f15274731fc2d00000000feffffff7901bdd53c839a10e2b944ba8ec0f6f51f763e41ea70792a9fd01d97e85ed3080000000017160014ff46a748eed9bb8e5ebf4b079965ff4169b7a8fefeffffff907cbbdb5ad0772e75ab2a2d661b523796b7a7f2a43adba465e47ef56ba352140600000017160014300cb82650a4a4a2120aeb77497b87dea424aebefeffffffdf487dab317b108993110f7d50c08185c32be18e45e8e327f1871bf837eefd8be902000000feffffff072ab10800000000001976a91470d84faa320a2c052a4398714066b25e84294dd188ac70af07000000000017a914ef85f7c9dd2b560a627106f03be2cd9be053b557872bbe0f000000000017a914406d2022a4e5d9aa2e7898f151a7672f9395c6b987d85900000000000017a914f231590cd1233044f7429ac4ffb7569b023dda9c87b6101b000000000017a9142c64684a2739b4e7bea6ea5bc8e34e35f3518a4c875eb216000000000016001482c990cf9f70fad955e5adbc58fc3bdd0b6ffb6f149f0900000000001976a914749ca7a200c2da2b8de3c96bc22b8a0f6801e62888ac0247304402201cccb63bcc1ee7ff184f6df98bba0caf077e34ef5e92cf1ca2b9931b6be7922402203624024030d1b473cc68ac96770c1abe7971fc0a8b6a54065b0ea5f7a68eec5401210211b2a20abe2ff787f4d2bd30b7651110f0bd6fd916f6c4dbb3331f5540dfc41c0247304402206355f3f6644137d19fe1af917f45651008d6c76fbe35ffd66024f68462c1153e022047048bda9824a23f7c42205cc5a3e7065a407c11490f5c8ef591894743abfcd301210295f662ecfc420666df42edc9cd29099ec3554f6aa0683a9452ef936fdf5078d80247304402202c6b9d2c936c397d1d6ffd73fbf2698b835897d79c25eb6e5e89498d568c6920022061ef810f2891bff38575a7a879c2b955ac8623ac8fec7261aa6ac702103e61b7012103d85f86fb4505a7b1a0692bb6d5921063ae242897d9c8673f0f208336561ed5880247304402200f02684a408ee5bcf6ac7f75237cc934db8abcc1362b53b5855d0600bba2ef0e022061148f24c89df2b9f1e87b2cecc4f71bd3ff41ed3703bf37cf42d42a5c97bd920121025c3dcbc5684b4f4b2f607f1741affae0c4d0e9f208a1721e2298242642b9e34e48a00a000200000000010123ae6975afc2291fc83bf0dfc0d2ddd017e65a74ffed19e358b2be2d3d390cef0000000000fdffffff025e8311000000000016001436f7c2011bc7cdb513f2bd1e1f639b475cac9a103677120000000000160014d78088bff9701a375abb00ba4b1d9e4c781dc9c20247304402206f8b611874088e14df9e7ad6efe3d20855857dbaca4494097aea9f585767b25402201f57673012f18d1b4fa375ff961b40f245037914f332bcf291adbb6e09c6745601210395f7433ea1a2abd28ac6ff0a2826d5dabf99cb1a53aa51c96b19a3576ad283c049a00a00020000000001014602273175af230e2172f45cb7237021ceea7cb51b875122b13c86a0a6670aa00100000000fdffffff02b575110000000000160014f92cea6f398aa497fa79aa02d8018f882949f02f03fe0000000000001976a914772c1b136375419c0bbcd3100f6e5e97dcac363a88ac0247304402203d63cc3d2f7e4ffd789ecfdc26c910c871cdd57acd553169dddc00d265dff570022071ed06f1d134ad9acc29b4b156728b32489de562b46a53c55ea536cafa70232401210394a59431a16c61a28d5034f42b4c2adbb005885e36a91e2332febbb509162b5949a00a00010000000001025e4bb86da65ab675365aac3050d07bcced9dda47efeb8bc168452a682097624d0000000000ffffffff8c902c5e0c2eede584cab9b8d940880ccf4f84e8ffc5920b3f958161157fe0f2000000006b483045022100b78d7237c92a6b0dd76bde9d4256d82f55cdd621b73aa9c183634628fd5dcb52022053a1fc3f2c7599f50d9d61deb8d53ad93adeb1df924a2dc5bc5755ad90e015de012103ffc8879b76b7d94603c6a171e5479569f80bca2a4a4c7752fe0ecf5fd58bf98dffffffff02803a54000000000017a9145f0efdb1779c6c8ddfd45d205f2ca5261ab06a31878d453e0000000000160014cfd4c82fa5abdc541a543383dd2f1c55d10036d50248304502210095c6d9a67c027f3dfc75b35d82110057182a7d16f38e1343926aa4e0376ccd8e0220023c264804ba1bd3928819a02b3db946bbc99e2a5e1f96eafa2359325215ce9f012103e2dc042584b50c8d8ce1430c3b9e41a4426456b789a01a8c9e65c3f5c5adf7e70000000000010000000001022cbb930364c6812c673da47cd74565000636be1a589a02b4dc9816b27fe96bc20100000000ffffffff5fc37e407df249c1f43bb8640fad307f1f2ac961a78ffb7fbdf7fd36b91a0015180000006b483045022100df6917882b92f1a0ac5e08df37f3a10b447663994e36d3104e64e00ab5f19be302207bf9824a0bc420217f92741b41860762bca39eaa7ad6c452a41c4c1531128fab012103b1f1fdeabdd404e7b0b2e653d163000f70e30321a13394660ae96d353976f631ffffffff0214050000000000001600145d715d0ad45d65539329242f75ffb1bb5e47ff7f90ca04000000000017a914da4f9cee619c862788a4566aad3e893dca66d7dc870247304402203828431d861728facec52af1c2e687c1ee9eda52fc14ddb4f4542ae2d4cd8de3022004640c8d6c7da4b184d5f8dcc66f65c840be6f27e2e1741b6d19147c654247d50121039a0230e4f383d5d188bb06de6bcd080b56695eb9a172e65eb4576b056e0cbe51000000000002000000000101085b347472800669ab6c3c2666c836811f9dd0006aebd0075e5c0c3cf076a9ab0100000000fdffffff021af710000000000016001423e753aa71531206dfb750023f8faa073c390deaabb0020000000000160014c628e28a1e009cedcf1f2fc51aa4516d8556df8d024730440220697cd32c8c5a43683f7fccc43241150a2bee9c57eecae11f33eb04eb8b0d9e75022063d43f3cc6405146ef54f5cbcf6688d6f452ddce73626e56984ba27904cf1ef20121029ce21fca00f3eff55a7d999fd00e66faf0aeeec03860a33cdfe85e5c4b46bf0249a00a0002000000000102ec769e6c417b7653ff16cb42f653384036e208b9b76c2ce3e7d55b3300fc198a19000000171600142e9d84797a7456fc8823b8df5060e12e34a30ee9feffffff18e40b4876f47d2bed1739591378f49bceaeedd2f8edccfe54b0deddee2b33820100000017160014c794319c7326752db63bce31ddbfb862cef15489feffffff0148b606000000000017a914171df1bb1344bb8d2d6414ed182277cfb635f503870247304402204f0b2f93b62452d5f6e2f08e71a431bf8958e5e207c879dddc24608bbf2254e0022056e7f4d0ba625de6a5bebe60e6924f6afc149bf6cef38664f29358f314d4ba24012102936ca3c3d85a86eb049ef4c34cda817eadc3c20fbad1af8567f2262e99483e77024730440220504ab9971f2731dc61b263c1d7dde5239f78d07a790979bfa4c82f5df3354cb302201f0869c4a84a4cef5aa4e6553764963e9bc4fa5529e11dbd9963570ffe652a9a012102f3b7fa20034511c4441b0096b2f7d44b109acd235d043786a9ebe30f8991240147a00a000200000000010197e2949ddfeda66faeb66cfd13dd6079438865ab34d63f1aba547e7ff18231ce0000000000fdffffff02a5bb100000000000160014c2ec02b7890a94f6c69a328a2a84f4458a3f65a69fb600000000000017a914b85239cf1f83fbc556d2fb89f5513778343600038702473044022043c525fb45a7bc20fa0ffc9b086514c3a4d18039d61331ff95895c50167fdcf502205bfa199476fcf7c648cb8221747f1365b73d77fd116e01e43a88a64f31d85051012102c8ab4c5e637072e2b8fe86e847693d5e26f1ed49b45044f48b6cb90fa504f58b49a00a00020000000001011d5a401db5770823e71a23eeabf97bb991998218206054bbef1d0e7934f0c11400000000232200209bba3255ac5cd7e4e2ef900a108ad96f27f7bc484b51d819441253a8546d1db0fdffffff0158560900000000001976a914ababce7f98457e0b2bb1a2c7e20a74f56874778d88ac054830450221009ffe8f9d7c79358b39a8e95e347229306a458f5c10708f5300fa67853e9b8e3902202dcc1dff92197789f53579271b7734c3bfdf410798232fb0cb7f13dcac1d549d0121033d863a272ef48b92bd390660aa1c2862fb5655685f7df87f8d547e6c4f31a20120780983d26ddbdd710bc8a059ef2d0091978bea5f6836e747dcf2a7c460051aeb0101c67651876375141c3cc68f41e7215304d62e34449ec1fc0d8c8b7b144dbb5a18bf2db2d3a94fd390d1c52a4245ae0e1f677652876375141c3cc68f41e7215304d62e34449ec1fc0d8c8b7b1460cb1eb79f3d53e8e2e6b83632b7b8c30aa2273d6776538763751470c5e503d6e39b6e45a60b623773e1b0a56c2fdc1436ee1808ce48b67df04b06a331923ece3f5180936754881470c5e503d6e39b6e45a60b623773e1b0a56c2fdc14c5b206d4d3d6cec50bec5ce2b7108c6fbc1d408f6868687ba98878a988ac0000000002000000000101c10e2a87b49b5142a99e75dad34bab97dd33a825522c24e951484102c6b91cb801000000171600144d22208ef12281650b253b6876dcf91ed29d9e06fdffffff03838a3a000000000017a914dd2119f0e678588b83f19274b21f321e27dfdfb887619700000000000017a91434c5681333692876f346b3a9bf98f9045ddf376c87965d3b000000000017a91440eaf2f263e922aa6486b98603e9557269466d72870247304402205e32eb6dbca28d3795d16855dd4c7ef29b6f12688e7cca61f2e98c13bde62ba10220168228918dd25c58dcee448d0753ea1ff3cbdbca892a9d115ecb6acaa591b9e6012103a5e0d71bf03368e6309cee3fff18aa2e7322496574fd788248efb4305ee0c08c0000000002000000000101e92530fdf77ee49fcd6d1ef08a41692a5b48ee20c8750f729ad340d0be410d7502000000171600143aa65288345665c1e1e6988f80b8319b5d675f79fdffffff038c4231000000000017a914b2806d465d41d6855625c8477e66b0ddc065239f87627f00000000000017a9147070b3be9abbb607e80fafa56b4d46c8082654fc877cda3c000000000017a914fcfa42f68c1c6046832311beec3821e702decc6a87024830450221009e7e9f8053ce2ac7011b775e076c296f5502bd79d570eefd982691a06c510e51022043747efd7164af953860fe3e6b2f8365274ea903d3d4302ada18d64a31ee4d0d012103ee25eefcf869f9900517c3b03c7c69cb7f2ea707da48473d6d93204b7c696ed50000000002000000000101a80ab67a6e3de009bb2b231687557c2991e9d887d5a67d02f4eccc799ad0a0730100000000fdffffff0258920100000000001976a914c90a385c377005bc5fd2f1d1882f552da8603ed588acace7160000000000160014ef19973155806b9ea6d1ba038010b882c36e03c20247304402205623def1addb850008e68ec96088cd4d3f43d55ad962634a052e6676cf41c2c1022076ea999ca1589e92797775cde618be4dcf56ddf0f9878bc86239c04833fc431a012102bcd53eee3e927726775ac6b4f34176a8ac55a6fe7ea1ee6a9e6b4a7f2539291148a00a0001000000000101fae7ce79a027115fe6d889d763fabd1829bfb1858f9f369d54f47abacaefd2980100000017160014d94289afa0fa7cffe41ffb40be10bfcdf2b38ea5ffffffff3e622620000000000016001425e0bd3c29f54210021869a39e7ecf8db721a697395600000000000017a9140d01f7d5b1f247114df1609b91f7a7278f6e727487236a3600000000001600147bd323097dc8cc8ee02b694902779287fa1fd08b709400000000000017a9149afa4cc0f8c82a864d96953617f11a5ad4d7affe878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7669b22100000000001976a9141a9a289c4d1d3d31e5cf83b7490c6aa5cd20c47d88acece60400000000001600146e7a66d14233c5e24dd5598cd817d93fbeac890f8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c38003000000000017a914ab359fbb916fce6d8efb9a6777fb962e4a3257ab875a3c000000000000160014848ec6955dfa189c971aba2b50efbe7eb3aaca320aa901000000000017a914567d5f8c4226106c7d3dc122aac00b1550836d7c87815d0300000000001976a914e8a230b6f356e61e270853522de5bbded4ffc78088ac126103000000000017a914a8eff5da52fea29937884d0bcdf1b377ccfe8105877e2e00000000000017a914005e6f8d35683adfdf6191ebaf416f7c3b25a63087fe190100000000001976a9149d289ff8b555f234507865aabcd4f0bec031ad0b88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76027102000000000017a9144610172f859fb9e4e359761f2ebeab34d9faea9887ca0201000000000017a914734d26b3eb655f57a4a873648e72cc5ecdcc104487e6c203000000000017a9147363171a3d3a07c60cc7a9eaecd9775472fed97c87b0ad01000000000017a914f1a3525a684d7a435ea745438a55dc95baa7817f87540502000000000017a914dcff4ce7baf86296255b159bb90cadcc39f038578799fb0a000000000017a914f00bca4dff8bea97651fa3720c28f7ec4ae916488776ef0000000000001976a91464056fa77fce80723fb085b52aab7f0ae0d3be0788acb3e20300000000001976a91496bb253ec9c933ec2e379f35fbe665b4adf5a92888acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7668d10f000000000017a91424affbb9f11f1ef273c5e705b9d061da51068d6a87023401000000000017a91492813b7aa9061a61c67a722665cf85ad18e92b1687fece00000000000017a9140a211cf1581d0c4dd698b0b90718eead106f942087078b0300000000001976a9145b33747acc116fd58455096858a8138bb429ee2788ac18ad21000000000017a914778f237ba0bfb5bca38a5967d0ec0c420962906d87b7d700000000000017a9140f06904a884a79f814e607d49b66d7ddd34f7bc8878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd761a9806000000000016001458fe0831c2839e5c006538ed5e19ca68e0c91a42c0e44e000000000017a9141fbc096e631ec34a9b986ecd90b6d04e95df028787ce5e0200000000001976a91469bf55415581628361bca94b5f7bcff19009684988acc2ed01000000000017a914e746c564faed82509246139297c3aa15b9ea995487f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76872d01000000000017a914038f74775de9de6336554ecd0704be14f0f79c0187790201000000000017a914a797298a23c99481f837a7519edea7cd8f34dec387314808000000000017a914aab09dd76e5ff55a569d0f9d1323f92768c2464887815d03000000000017a9148bbfac936bd3b376abe68db2caa8b36a8f445951874d810000000000001976a914a327a6e953fde66aac293034565f0de66a10f39d88ac1ee80100000000001976a914a23e9ea8dd4d79990dea8d1dbb1c57582972424788ac3fc00000000000001976a914dfdd20c458aa3b1ca5f2009e03e55f5f6e4bda9788ac88d200000000000017a9147ad181f4b7a8c0f8c0a8cee4a92e53b0ad80b27a87c0e1e4000000000017a9149497edaa822c73b8879deafcf853634aaf5a4f5d8734aa09000000000016001453f72c74c7b7d759db8517d3615770b7050d7c6cb1ef00000000000017a91437a1d356180d0c1c0994d115692704092747954b8742ee460000000000160014653f10ae29f0f1590727c13abd98a004cfd0e91591bd0000000000001976a91430903f327a6a95b9cdf9bfbfe71b64c60a42165d88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7636703100000000001976a914f5583e84afa06e2d3edb1b540995967f3aafc04088acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd769cf900000000000017a9148b61d1318d82ef3e0eb4345bb94f789701630be687808d5b0000000000160014e5281bafa1a117c09b0b30a898369896f276bf4f27bb0600000000001976a914c88fb87129ffb005cd20b1a2dcc34e3e2640be2e88ac2ee10400000000001976a914920e5b97132330e81526b0146f378267e364143588ac8e0c0800000000001976a9148589242db0c36f6b035dd672a82f3e58d669251b88ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd760247304402205cc44b78e047c63f38028d62ef1252ce98f340a4f65fea15d9b024626ec2ac3e022057829900aa4da4a819f254182f04b9df76cb46cb380d54030a2032818f0e442d01210318ce0c82728e86281f7242c8d9bdacfe542e140f2cabfef943b336148dc8805a000000000100000000010169592f0fbe5458f68fa16bb861fbc0fb63d0de54edc0f2d6844637eff112801f0000000000ffffffff0102222000000000001976a91415912e94cdd9a6a969967ca0bcf8f87ceffd20d088ac0247304402200887d262ca64227602e390faed500bee19f22c3e7bd31425578c0ba5c4feb7c802200d6338f74ede94e466816e0fff673c11a8c26eebbf72f58de94800f6c826aa3101210394c23e2bea67407bd3886a9f03216cf58e0687adfc4a3bc6b69254b7d43e5e460000000001000000000101040ac828cb5ca98e62455c0ceed61a254e5805c8510960a54db40f8045e643c60300000000fdffffff04e5ea03000000000017a914e82f51299b2d6c21ce8890b5085d0123e9b857458727eb03000000000017a9149495ab703c5acd9944b8a35afcfc6c4301ffb80c8740180d000000000017a914b78e8fcc710ac5efad59aaace523e56e2e659b418760803201000000001600148f198fae9651ce75a4e96d61054b542e69515c1d024730440220530b9f9602fb4aa262b40dc10442c8180ebfa5ce096c795ca058efb4e4eacfe50220755be1af32f49e3da8eb795c9e38957cf4c3f2b7911b6d099ef120a6f0ad125b012103b8ee38101c41483d4207df0b42f69f2c54cdeabf70a3eb24c2c122f414a4428f0000000001000000000101603a91bf4fe756f0f38b36f64b285543e1ba539dfde4667b1a20a713b0eebaed0200000023220020bd16730af3d19dd63b50b78bca38b9debe1e46cf208dc31400e39559d72fe571fdffffff021df30c000000000017a91490d4f8e6d56869c71250a899d789adb509f6b5a187fb1d0000000000002200209a8fcc511550e3b9bbefaa12b882a2f3b70132d420b1aacbea7283d656aff09e0400483045022100e77db0743d566554396de0d92368a9af0916246489acdcab25f2617bdd41362802204559a8e2e699798e0a6259c0e6d5aaba21960257191f5b8e6fad2100d11477f501483045022100daa54f0a0700e4ce78c79c93609a0657ecb65fea8e2c2945d10d1a10f70eb70102205d3b3866ccde72a7d22f7fa3d49d5ffdcc3c158de6d2c74968be1b8c9181181e0169522103176ff6d92cae5eec08a20d0699095b154685c72113baa6c9a4b7522203e4d3d1210236804d999932173a83244305e62625b76ea69fdd937147fbbff1adf2ab492246210323490adfe654ae8adc11114253d5e3d91d3609fd6e963fe1a9df3fdb3b9736e253ae000000000100000000010100e68cde6fcf8df65c0ea90d81ee4afa4bd4569e79741b90f6f1aebda49377750100000017160014543b22e0cdc077a1c0eb4ec1f1bacf861a4f9a4affffffff01c25903000000000017a914f6fa236eb0447902456f815ab6416222cefc40268702473044022045fa84b94a6985cec89d40ee6ee938ab68ac87ca547488ee13112cc5f6bc2b4002207e5856e4602197387f2d5c691400c5cb763ad38529fddefcd6424514dd7ef2d30121022c6507b51bd0aa784cd814860c70e5584de918b39b592f2fe73cd7a1b40d2e2500000000020000000001011902d84f23a9cad9fc211f001c6600ab60455a133cca976ab2461a0bc3f80d2523000000171600148e1ce632d871d78d7e547d983c756a3762ac3c0efdffffff01295901000000000017a914a7674c12ee520b7e6383490c3dcdd9e4465fb8138702473044022032ac26614e41bbd1bcef1962606909cecd44a32e8fae0bd90fc457f07d54961d0220653741314e401214ea235a8ce3e65d9d2c92c999f7c6c292f92d6c50056ab7720121021d2f8c3fc72a79f92530d5e11874b5f215e36c0668922db9b4af83a49bf8332448a00a000100000000010132db70351d13ddafda504f2acccfdac968cca8126e7e439c937af6a60f859e520000000017160014649604d03f7bb5fb44dff876883e87b0c945a2c7ffffffff02bc2309000000000017a91476f372f32c5e5a1316c397ed0a94e2b22833d40b87009f24000000000017a914e625bfd863c9a5849828445fbaf59187c77d56118702483045022100a5ccdca46a240992d71b0fe3b860dc418720e79724a6abd6c2d6ad02aacc74e20220421d5e24b46ec213f65bd201b88b784df272a864dace4b5fe57f9395b44449f4012103a457bfc74edbb64a74bfb05931f371284e0849367cb592d4791cc8af84d889130000000002000000000101793091abb7367ec465ebca78601fad4288e0244afa6803c9e47c1962ea35f32d0500000000fdffffff1040548900000000001600141882322d20b18c744ff499eddd117c50df44f42d458f03000000000017a914836dbf2c0e605c29dc01e651a417755c8e55f589871df07700000000001976a9142d912611da115d1ce832bc146638f062f38fb63e88ac5c5c410000000000160014562245d661165af5cefb80a24d8b8f4af7e438405c191a000000000017a91431ef3b60214554e4083d082ad4b997d05e11d35287dba501000000000017a914527899399864be275842b01daa740d515b43d19687e4111400000000001976a914aa61db8865c1be5e943cb53616750386c277f63488acd36c0400000000001976a9148770294629b77fa5feeb88e486ee5209f2ae163488ac705d1e000000000017a9146ac37fdbb395ced8fa70a73cd60d51edf1cda6ff8714663f00000000001600149b38bc9617b52f51399cc1d7c8cb15842110e9ef4f4d220000000000160014c3ce3f567d216dfea2cacc5a5600f3c34f31cdd0a47011000000000017a914ab4b0f74e4dbfda300455ce79420dbffa6721bdb87223e0d00000000001976a914f56d5e2e9ab3d4a74191b5721f867aa8e1b99f4b88ac1f5c4a0f000000001600148d4bc188a25e4350d60d2ebbe08318b81f47318d8ee7160100000000160014fa9ef4ca31d13ca20980561fc4fc3f43038c78e98867ec00000000001976a9149187a2ceb80f1d99d2f8a790b110bf8d88cfe1df88ac0247304402203c498bbc67409a64f2054e9fcaf8ce7fd67de5ae475ab3ebb84506ab5476e8ed022023b7dbef825ac3496ba9b565945b0a6b7da5c3ce7c3515b0765646eafe723504012102e8f54f00e3b9688ea47ee844e5ed6fc10561e770ba15bfa98aee1cd96643d7af3ba00a0002000000000101743fae5537be6b137212d6f27b1a8f5171e7f0d58bc25cbee10a364c5697022c0e00000000ffffffff02daa60800000000001976a91457404a221d421988291e5ef3227e57bbe14bf0f088ac643f0e01000000001600142a8f33fadb33404a8ec4d77132ba83508a7bb0ee024730440220456cc85f827cc15aa947377dba5b793d74a13183865476139d6ba6e84a6fe1840220089023e75ab0df6f7210985e57ca56ea393fded494f772adc7255f6edd726db5012103bec856b176143886d7aeb20e172721e2651be120e6756aae1230fd42874937840000000002000000000101f188f1b905c07c6047c113aa989703b66480ee3fae9912877e3b8585ab180d9e0100000000ffffffff02a7020100000000001976a914a4cad39e8e7c350a964746e3d7e0dbbb7d64565f88acef370d01000000001600142c59860dadab391ee1ab19dada715ec93fb47eb602483045022100d83566c42e7a38ff716d24864a0e3f6304955c584d05a3b90f10152a4db79b3f02202fbdb81ac2688c76537ba2a7fe5bf123d5372145394fa9166a4eab335a4410d2012102ead5f8f2743f5b0f89f116f48032b42542ac9b789f589973b1eaf298a32866330000000002000000000101f7b3fff2702c77f6ea6264a5be2c95723cbc38e84e38ef10ce0083b19ff47f9a0100000000ffffffff02135303000000000017a9140f2d91a86a13625c39559b5f4e0112565fe0be3b8724e00901000000001600142c59860dadab391ee1ab19dada715ec93fb47eb602483045022100e4728d6846991691836bd0ea8ac8b1fb0b9a8ca417d80e89d228eb99eb9a8bae022051c59ce09e3bed72326e2f766e86d5f62aa3d5f25e74bfc03db2b295d8f34dc4012103af6981e71dc165c6b781c98cf267209689b6f0f7f2c3a727bbf0f501e52b9c340000000002000000000101cee9cb3487d480340c80cb2750e70f944a6bf3123f400ba1ba9288527feb5f350100000000ffffffff026a782b000000000017a91414be93a8a8b14f26a1e3e52b9aaf615b14a9e2b0874b08050000000000160014761142dfdddd23918741278f45e3df94e6df621b02483045022100882614a02e79a6e537a1d2de8379b9b1a7ff769c57eaa8065a8980d0fe4e95d1022064a46d56ebd78c2000b17514e40cb7663868cb476a64b7dc9bdcd2ef945ab5d2012103874e1a80b84520ae1bec0c30a7fe6d193fb38c2bc8980eadddd717c03590ab160000000002000000000101c85ac1fd46691cc7eb4deec771bb9e16093ca5aa600a9792d3c65737a4bcfc510100000000ffffffff02503403000000000017a91429a68d793ba493ab895cc6b2720798501922f689870719110000000000160014103ffa6cd5e46a64ab26dd7593cf8162470608be024830450221009073432952d1bd239ad8fc14eb50be22426b0f58cf8f7722f8c3413909aeb36a02204f888574d287e158f9b60fcddddfac8dbc029ae847224be320e807c33939c62101210395e79db629868b754f8efc7cca3dbfad7caddf6c1b5b262e0983a13f1064e0020000000002000000000101d1b2804ae98c5a21e54e0fb7a593aa6ee4fb62bc924743c000339ec1525c93340100000000ffffffff02f80101000000000017a9147d0351f9f43352ed8d118955a9fcb99d8d9fbe07871517000000000000160014834b8604cf431fb0af7ac4e5c5db62c49987561b02483045022100cd7103efe4ec70a478b5ef96fcd2a6f71064cfce6f61c3a1a2c9d4990926693c02203d67af374a1664e63dfc2c119e8ecd0288f09fa4c4e0c48a42ac9f22708a6643012103f4cf7277423da7f5cf02f54517940a2bcf3c2a4a97d652be58d562b083912aa50000000002000000000101525ce0d1d9fed6248b7385546149393cb145c871edaf4bdfd5c7ca5f60fa36c00300000000ffffffff026cb82f000000000017a91419a3cd3143be23ab122403e65c7f4eb4cedc3032873f18000000000000160014b7ddf27b6959e472e0653ffd4d55029d957bb90a02483045022100d99bf06aec31e2190e45e80e5e24a0099bcb4a976d51a1b08e0fb7229e4cca1202206dfcd5579e572de0ecbc1e3e378630a48cfda53d4e602ea0c8265079aa416c54012102fb83fe495a675419651ac27d8964741c58ea69e312e1086a6817b5566dcae6d8000000000200000000010141b29e0bb47fcffc3640c4e8aad85d31592b93a5f74c19870c3a7f6358487d901700000000ffffffff02ca720000000000001600149173c979740754a298d2173414cae3bf7e43a3104ffc3f000000000017a914641913b1448655badb5e8b19b1b8082a2fcd22118702483045022100fa5460decf8c7f8eaed21d2d7bfcd66f66b2a97938cb66f932a9049f4356f86e02206ca7eb9d5af1dd0a0e4f757687930c7ca99dabf83d1530f46eb441c4978cce77012102256d65c71e4ece9b21ae1c637d35402cc409a02318b0641e30960c9af3942b6400000000020000000001011b673d0cd991db9634be806cd3390c66c80687ee127a8e4fe7272499efd353730100000000ffffffff02cce901000000000017a9145491b104ec45ba3fc7fdeb72a278ac2f56f32f6f87dd7c77000000000016001479e8a6464dcd8e2f815abe47c00ff5786e817946024730440220673510e01d355898f32972fc0124bd1856d3c8fea86c03cc44d36c988d655d71022036a78c35dfc64b93f3e93a7cb5f2bbd8b9aa120e45456d47ebbd41c7be716851012102bc5eca2277949663c8fb6c1dd30b36bbf1dc0170cd66980e2e73a40007dc5019000000000200000000010153c724fdd64b16f26366c1161410e80e47a48f75f609835630ce9535c1660b2e0100000000ffffffff02565901000000000017a914b5a11803c80fc2a2538e6e77f77d0583e5c3c85987c36e820000000000160014cfe73216e23b9b28956db8638d560ad1c1ee1f4d024730440220465d891c1613c5c21c590c5f0507fa9b63570ec9e685b4fea1003254df0bf1140220191481bddc03192c692f408bc7d4971fb9b3f7bec11c84ee0896a59da0074e2b012103e332531f8a83c3ff40cf8b26488c3776b71d6361383459a1b85d4f6fd9970228000000000200000000010150ea0c43c53b4f3932a09053bcd94913a27987346a057d6312a3fda523a816090100000000ffffffff02565600000000000017a91499eb6b2116ef20f68d65970bc5dce86ba1bfe775876651810000000000160014a2a26e5c3a433d5bea4043027d1b0d8c1f3f7fbd02483045022100b0a225e6104670bbf756f849e7df98ded3ec7b617d494c9c995da86e761e42a9022072b7fbacaf559b154ba67a266bc08b653cb0c98e9006b23f754f5358ebb342e201210229f1d795efd966cf901a8284c6cad92bfee2ab6156d58571afa6dc55daa78e1f00000000020000000001011ac1ad6ca2769eb96865b2aee892dc1f3f5aa946933ba789a0ceceadd06076ba0000000000ffffffff0228ae01000000000017a914b6b5f300455865335707c28dc9c01ea8093ec25587d302090000000000160014db59f9218a15584b299e3428510d838adf3356f702483045022100d919712e579e0eca745fe5b459ec8157802f73702209cf8a7ad1279b762d2154022020b4236f6bc4633bcb2bf4c5ee4daed35edb51f6235ac3fe775532eed9ec8f1b01210353174b4f691297ecc945975fea12188872b87fe401c4d468c061ece583f3b4e100000000020000000001018689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd2d00000000ffffffff02d06c04000000000017a914eadc0bdcfb02e80d595429ada451fcd553151eb6875f9d1d0000000000160014744674a015d040af92c66bf14c1898c2ba7ff08e0247304402207e6966268b34017ce3852519b9c4615ecb7d4cefd9998a63baa5c6f41ca9738d02203d23028f45a3773abb6d068e79486dd6530092fcf6aca725c2dd49e7a8fb31a4012103fcf79bab0fb67276005451bc932c4ece4997fd58e7de2d68da4f9f3be24b07e80000000002000000000101474d2690125abe0940d4f10d351cd08244784b4181fbcc876c6d870b9a52c9822200000000ffffffff027dbd06000000000016001499272c1f46b721d334d935b77de318af55f245201d0625000000000017a91465bdf585a60a14d43fdbfbe7b00ad262d4b390138702483045022100fa2b78cad6584ab21d2f8953dab3ea48f1d65895c5b846660615ae25b3ed8a54022046d522fc6d7f2a1ada7ade60cfe1f47589d15b339db565601679174be0b90a25012102e6df5facf4eb93fa3bbed71a21e2997cb058ab10401f4c3c3883754ad85c3d6400000000020000000001011be7b3fda7ee4e7df4fec49cf9c530afbffc98f168b6d4ee059f92a22cf882190100000000ffffffff0285b706000000000017a9147eff8eef74cc4b67d48ae661090c20361bc6c13787225803000000000016001410f0fa812254a9913a37580ad75ed5f239da5f8d0247304402205d8624e2543674f1611369996d05518ee238787960aecbabd4b48ae12e12330202207e56933503ca1d5c0185de854e0303a05cd9620c831d44c5052e1e52cc7d174c012102a65aa4ef7fbb63ae09abe4da57290c298486e21363176c2ab7ada9a30248281e0000000002000000000101191e7f6ed24824262cb2fdcaa3da1e10fe661cb96f1e0d14500949a3cc83a7430100000000ffffffff02842e0e000000000017a91490a1ca06d65c6a376a8eec131e3a0bdf1f688da7870a15230000000000160014d644c415b39939b4ed3a32fa11b00d1656430693024730440220247386a5c645b16d21c0d9eb058c72119050558630519f9ea9f6cb9626b9796e0220024dc149430faafa65e2434a10e327d9166b93dced67f3e80b4f1a7d7593cc0a012103ebc58ac226c93521674ea05703ce7bf9947b8dbf302d4b4bd4eced1093413522000000000100000000010117fb730fe5e49af31bd9c9c928116f73119b7d53c7632d20d1e04ab204dfc5d70100000017160014c213fd2d1325bde5f7afe2038eac80337aadd2f6ffffffff02267500000000000017a9147157c32528bd8ae7aa9805df11a9b85c80889d2d87fe0e06000000000017a914453284c1778a486792164c2eed76662c1d45e0e18702473044022068a63aec0c6ac150d15744097a4229ad3729062bf467dddad3f751fe8f8134ba02207c53d0c72ad87c9a0819b1fef3c44a72cb1fb0306fc3dec0e5ed916e4d7de794012103ab4c33f36fc6c2c7b437cbd1fc53f08fdfc93429b5879f1670a289c42d4d056b00000000020000000001032e530767e6fe20171d20e41c0fb909e002cead373d3c5fcaeb1abb3958dadd4c0000000000ffffffffda80317156f7cede1a5c9e033a4e1f5cfdf853fcf87b55c188e35668b15e82ca0100000000ffffffffba67f9ae085d1b7bb9fafdbdcc76f802d93d9966cd744cf6b1dcbb684962bd6d0000000000ffffffff026cc48c0100000000160014e4fde8cfb67a6c8cc274d8c81646eddfb430616973f1060000000000160014bc018679bc8ea08ca4a9a8f5af5536cfd9b99fe502483045022100fbea96bde65f142dc5c052c6c2e9c9d977ba4d3b82e79678740cafd433c044270220550f81f18e0d5430a55921f7af1290075b03e2220790a5b7a790647bb0d28b590121023c69a93d25fc0c52db6bdd5d0abfa9a7d491fa4a0cac22f5c25dd6c2a73e36f00247304402204d8a726470f46738028cc22cb999a2072e8c9899021238decacce6ec9562d751022015940def0ea2d3531c13d16ef3664cdee42d5a0ff79c7b9b8af5e3fa9027f954012102a4ef72a62167ab1ce5016a89fa196044388eb3cc34f5c393d5fb495e1c0fee7a02483045022100f7e20e35a0f1771c783108a2c0ce73b359070b9da8bccaae9288a6bae86f3513022064a0ddde5ac14be44af508d15c8324fb2b750d8270598817e9933d20f5b1e251012103b30db0385b21396d13f2d35b30c9dd9864287cccaa034e6e758caf0c8e1d555100000000020000000001019ef09ebcac1dc179d2b3e5eac21586701a7a1e94fce39cd925d489b41d6d3520330000001716001428e46768a759942d07196ee9f5847b467326caf4ffffffff064b860200000000001976a914167b14f615988fe48f85ace41abc95a6faf6c19288acd8ac03000000000017a914d05b06bdbc91b0629c81430d5320055bfd44abd08720a107000000000017a9141e16561839e60f68010959fb19c211eb1225a6568793230300000000001976a914c9d5a5c06468088ab7ced3ebf499ff85b654c3cb88ace1d80e00000000001976a914b47af6b671decc5233f6bd2e66c6a259ff76a06f88ac3a0700000000000017a914bbba37f40cb545bcad4ce84c10733be66d166e048702473044022025b168896ee9a59ce2f37cfda176cfe6f4569cba26f57a4b092930d58e7dfbc10220792a01ce126d034c7d64bac093c3a0bc0c1d36e18136f06829e5f20738283172012103ef01ebaaee7e3f69baa508cfcee976162bbf2b7d0fcaa16b0bbae606592f893f000000000200000000010192891bda419733e9769bc7f1f7442ae4cda4bb43e7b07a1bcb3e3480df3258450100000017160014d36768a941510633abbd5804556f6b4d24106e11fdffffff02a4d620000000000017a91464e914f0144f1f2f20cb34ad2654e729208278bc8750ade8860000000017a914dabee60d29aa48180c1105ee08adead9c63d301c8702473044022069d76044376e9bf18c363426df56ec7eac10a6d8d8ee2c2c6e7a96eafe0e04b1022030da596ee6253809e8ae2365ce1a736677f9db0dcde7b327c0222d22209d4fe8012102661d97194af4cb6233f96d46aa991cad95215e31cb261cf06ef4b6271afa2d4c47a00a00020000000001012473660604a298b09fc3b7f90e5fffd4bb0c2ab392b9c8a36ce753303ce1a43b010000001716001446241f4ccb526b9d0ef85e8441039b8a7e02424ffdffffff029f484200000000001976a91462d5f1a2ebd595d16561382888ab84e9a5c6b32588acc160a6860000000017a914af532be08f45206ef9c98aeffbf24eb2034dc1a4870248304502210088d68956502285228156e2e3afcb6361202a8f40fc554652b3c0cde23af761d7022031ebeef097145c5951b6295409f4b624987be53f0080983ab1cefa25590ea55d012102fa593e703841c61122f138d55a806cb95b3955533ed58def89879328274b93d538a00a0002000000000101e1eb4d461da51c59a24340134ee7d90a97bf7ba0d99352a4dceb8a4601cb51c0010000001716001429470b614140b65971e1e6e7e15850b196be4bb5fdffffff02bc2d33100000000017a9147908cd52d902869e3c8f58db40d5cca5d93c8a8a87212f73760000000017a914b3e882bdc4e843b4e2a7ec3876d13397c17140818702483045022100b9464f3284966aee6d290fb7ad263174f71df43577f0447a167e77367e284548022047e087845fba5018b95816a99ed4447942258b75f949f11d4b58bfa4ac03de84012103f5bdff59fba04c4477fcd9f4f26ec33dd95479c3daa20631a910c2f201dd3f1548a00a00020000000001018e579e23a6a6903ac2d891def8f7a8d02fa48f5d3485fc6e24797102c3cccd9f0100000017160014b611be2b43f60fd5e144324189fb647f9edaaf32fdffffff02f6ba1d00000000001976a91498171af683091ea8d1b1ccd52f45c109731745d788ac3b7055760000000017a914d1af6766d1a6acf442cb445261c45d328d7bbc978702483045022100e0a186f84a69fd9794d0a3558fcb5e954645a1531ee016e947eb337bb962207e022036dfc518abceda4ec5ed9f2515d11e6c92185cb56128ad01b1ad4eed1cfaedaf0121038cc1102af0eda1b5d37541dd99798dde8329fd404beaeb0022432c72a32ceee748a00a00020000000001014290115857e3f86465742e07f5236db0c3fcc6dbc5df9db3bfd1f801eba71be30100000017160014b1f04f1462fbf7e2b3c5754ccd81e54fc32aa27dfdffffff0240d62000000000001976a91462d5f1a2ebd595d16561382888ab84e9a5c6b32588acb09534760000000017a914fc686e257b9dd5f895641c4ee1812808e3c4467a8702473044022005fb57db7921e56f94cbcc86cb479a117767a2588e6c7da25333aaaa82b27fb602207703adfb5e1a844f206d5a56c5c464b5cba00f4a36bec0103061281aa5e48c690121027c040a5ded40fd999662f967d2524c112c7c7a038857625b40b3afce665d6bcf49a00a00020000000001017290eb9d3f08d0c8dee7ea60fafb84711129cff665e67453c8f33e40a06f0e320100000017160014d61f9a0c38725cb2b9ac472674836ba74d7ef81afdffffff02e79b867500000000160014ddd7d84330b5d6ae491e0eb91c897714aaf9c49698f5ad00000000001600144fb332a4b7b915d43b00ab867af82d99b9d0739b024830450221009ad84180cf6824d1be6b9becdefbb6d25279b64d1b34d8cd4b4dc3872b99866c02201f1ea52e1d6894cf03e2c8f6274f09257c76569cba402cdafe289d7c474958070121022b9019b590cfb990df899b11fbe4c70f78c6b830a225fabc0dd56026063a369c3ea00a0002000000000102f5903c390887dd2cfb97eb5d6cbd6afea89a3c438c1780f59934d6a490812c6000000000171600146055b97cf190c00c4a3bbe08bb7070639702f645fdffffff750126e038c144578e8bab11e865ff5449535c5b734d4449319653805c8164680200000017160014b2c7e080ac2b409330d9737f08a5bb851c09cb10fdffffff038c8953000000000017a9142e45c58231ae34f34aff07e30700b3cc0ebf0db58704d800000000000017a9145d1eec502e6818f8640d6181e741076473f3a0cb87141d00000000000017a914c30fbaead0175f21c5ac48dcd84b67a5deacc001870247304402201c29186838f059fae4ea270d11002ba868078580f61982e10d3166279f5d82f502201a78da05e425f2cac79e8b37b1f399407e145b002b072b7b221fc79a834c1c5f012103b20e39cf5b99d14fa8213daabd26baf244545fc95ddbba51338a19a364a2319b02483045022100fd301d9b3b8f2cefc7c4c4b867e45196223e3844c2b9371a70d4cf08cb17baa0022002a2cd790e099b14aab90105b7da2bba5f125247f0f5f22092ac5cde3ab9729f012103f47fd651f138d101c1e255cb8f0fd3942c0950b2652448718052d0612602da8200000000020000000001021a9b13ccf23b492165bd8c03093ba9989c009da975f0485ac3ab6ee64cf97f920a00000017160014b5b6b5c44cc8278b9f7ef1fd597da36585c58a75fdffffff50ff7c0aa00b87cac616755f24db626bfe810a89cca4b99493d6098d4c32e42a2000000017160014857fe4ac24ce9217be24145bdb1713bce0357bdafdffffff0367472a000000000017a914417c4491c2953fc97d25f3399758519f9b5001d7875bcd2b00000000001976a9145c4c8b2ed0ebd8ab977b8256eaa62bf8a9f9685f88ac7d8a32000000000017a9148519b2c8040814ae0ab2a0b2ebc9f7e79d636463870247304402200d9b26555ce7f54b4e076fb4297d8306080f3d96f78847f830a9c883ad58adb4022019dc7233835c84d4d50629b5cea18418e458eb30d185fcdd70f552aa1b238d8f01210217714eb62f2243afa46efb572cb50f0d1f8a1d46091e3e56e84936839604c1430247304402205f42ea5e43da62b3e5675463c933740a2bd2460a59bcf77eeb3b7da8021295f702201a62982844b1aa4604366cb1c999f07c0dd69b7875404afaf86fbdf93afcb58301210386fda3b0809b00ac73c93f3ecae59906f2af85880005fc78bbdf8c05e62534120000000001000000011801b22d37caa8aa8a6c386bd0b2ef8e8a38f74cdb80a3a824b7c4d3f6a6ed3a01000000db00483045022100889e6efe719a488f0536d11f86c1786b1570428a007e2cf4f5aa8d0c41ce02f602207dee5e3e1688a544fd61c1d33dda3e9d40dc2682909f4414c7c100eebe7a248e01483045022100df52ba8665049438dd0d6a43c84b5a96bfc1ead88aa766d650710e0393eb60400220223bc70201d282a40f3a3ee958bca4b206032005383ab7cdf9420c53c962164901475221035063450bf6bfa6970b9013ac8ab7ee12c4cf89eafc3c6dfedbc0f8d7b9b8f8c121035b01f48968a0533e3a43cac1f0b540ff50fedd82549ec503ccdc6f9b0c0a3cb552aeffffffff025ad8380a0000000017a914fe097846f2915df1de0ff3403b65a2cd4d38f4ad87e0750900000000001976a91490209e73bf4eb3371d4e379c557534947719f91f88ac000000000200000000010407e9fdd01f3f8c8807cafa8877b45df3bfcb7d7ec889825d9d0fa5539bcd2012000000001716001438f9756b01c1c3e8cfe2a6c28bfa264305ad4d0dffffffff0a083afd6819507726f1c4f9b13c7e1048bf73a1d028bfffd6c04bad813f525300000000171600144242ea09546b7d95b5c5c7f7505449faced9edc9ffffffff10dcc3720868d027f2fb906127c7f4040a7748895fcf458495974ca652ae29f00000000017160014e09c560641c1575d7370409795167361f1d11edaffffffff1120b02e9af0c9335a14610e44a16e0971a7d42e84593a7d78630cf882ae3c0b0000000017160014734f6d2cb2d71f09be19f271ba8e85973441096dffffffff021c6c4f00000000001600145f3dc182e625b12adbc6c28cb7a6544c7f8219529140ab020000000017a914fd7e37292b33c0866540892d6b79bfda23e59a93870247304402202e5c802133e882c3486ad5b900c7401df0b547ea678ee1d197a3530110051765022058a67f0cc844743cdac201e4ba3cca3bae2bf2853052707526895714783ee6dc0121022fbfd5c260eddb8d0a7e2036951e137e68bf2a4934c782eb690f6566fe3c3ff5024730440220211c2f4fc62c15b031639d28b397ca7c0561c130de62171be259eb1435644bd102201091dd59b5249f85e56a1c26cf2aacd9a91cf834fa2ec36858960f89e7e91fed0121029d956d6c6dc0a4a78c3f4e9880ea07b1efbcccaeb9b0ee295032ccc3bff4ef5702473044022078827e8c93ca2d73d013420e45df85c5004f7744bd97db9bc9d86d4b09686c30022059fb6527d8084e421a4cd2b5cf1a5a9012c379ced7312b0d0ac767c059aedff6012102f526957725e720e0720352b243a1f533b58f35aaee0427bcb9b890ce37e3801a0247304402205ea18772a771f7c4e6c382e244efeea66bc8c3e0987fcc126ebe15ed0b6945cd02207b4e841df91ef4c3dcfc93e707a9291b06345d8a4570f47d8a77651cc54acad601210234f5c3efb9b5b14397aabc32d56abd1023e99df74592f77a31d566ec880bde27000000000100000000010319e270d90f18df293b26a91b4ff51e524e715c7c0b3b7cfaee17ca3b9ab93e83000000006a473044022079a086e4c732b3d85e21ebba4eeac66ad77144f7e31d1d62d13890eb60f7775602202bb98020df327dca08f8bb6f17952cceb8fe4a5d57480e4ddcd6f1876bfca0d40121031dc265a7718e80e1aa6b1c8aa457a1a195955c9a0d80f7a4b433538887480280ffffffff1c1cd70a9acb2b5fc89d9eddf20638b0e8f13e1097eb32e9db3ab94baede19f7000000006b483045022100c2460acb08824d80678bdb9d183e70ad91ba4add80792cde3b0ee0bab9c1e2bd022077e99dd5fd3dcfb6fd4a18557d902d25c14202086d9e2c667d425a3b4f84d845012102deb15120ba7b32dda2b95c967052a3e034a8ecb35f91014c20792f75d3cba164ffffffff656f1ba70ef1508a6b073531a498bca54c1becfe9ebc5e0497dbbcf0de3f0ea50000000000ffffffff028813000000000000160014e7095001027c96e08f5fe5927f721694615670ac706408000000000017a91465fe371dce8ec0ef24eeff3b6c621a82376f2fbf8700000248304502210098a16a527b3f1b481dad1051f8a59e36eae78a4001ba02ef57c612791d7ad1a8022073c82d051543e1fdde4ad2fbab56ca18a9e8961bac089fca0228ae31618b5bf4012103e3a967be51a714361b5365299f0e0055b8e6ab0544a6c573de5a3cf7254f0f930000000002000000000101cc2285cff3d94ebce46a09721d60fd842588c58ecaf19ba9de0cf3c490f9b48f0100000000ffffffff027b880100000000001600144aa2154fb21e4ec0e66c7c0c9b03928fba302fb69c0f07000000000016001471e56462c0fc53bbcc50b5906bd2fc7ebeb0431602473044022063e3d44a779efb5c603eff67234c0489451612cb076720c58ee3ab69d7a3401502207012d4b9163c7101292d6f072bdaa096323ba5040b5c90639cf84e710469dd72012103936ea56b66dcc271ded5aca2f78c998e073ba36dcb42dacd479f77e91e40990e0000000002000000000101055bdd55b0e8cd6334f58a699782720d352acc1ebc327d676e36c31cdc1a35b50100000000ffffffff0282941c00000000001600149734ea1539bdadff1c439279ece1cd8d75fc597f2ad7270000000000160014fa8ddcb640380a91df72e7e0f16b9c63566636eb024730440220167b9ffd7519a87f7529bc7601e491d495780c240541721b39150fcb55d3c67502203a1dd068e93dcf87ed444d5eb90b40118799ac03099a0c7cba27e7125cf60e8e0121027d3e92c965c0027766b59f36c7cbd0d42ef1868d544c641535f6075f714445710000000002000000000101dd418429ae6b1827b0b92dd97619c9c1fc3ec8f78df91fdb9cc57b896f28776b0000000000ffffffff02eef6610000000000160014212c7e2a50bb652773743fcb5725da970ff6045b3a21970000000000160014526f1335470149c890a7feb020577db6cc0c8b90024730440220465a595139e16cd6f320b7b7e3362c60ecd145e28b901f51d29a85e43771fb2f02204d0497091d138c1ea231e6af6328a81ff08502e1fd8325094c75faf739ce12bc012103217a45f8d0c2a1551262d6253649a36d1d882e2fb88158f16c52f1623937fece0000000001000000000101d09552b49e223062665e7f13da7b6e9cd8f63c97ab8ee657d909c3dae92411a50100000000ffffffff0280841e000000000017a914d3fdfec46ab6a28821c10141bad9c97e216f45228734c834000000000016001421fc459198d4db1c6a490f9c8949c281ef70a8c80247304402200b1dabddaed05644c9e6d468776a7ffdf7aa9913fd0b8e10b027f91705dd6ab2022042991d3a9463ea047a8fe6f1153cefa77ee3a566efb8247e4a7c610b518fba02012103a8ba788029883a38ec7a0a046527798fcf67a664eb29cb9e6f8efec2f9ff0ddd00000000010000000001016a958b462a1c3c85d8c97a249073e83f34c0e39f2c665c0c50dd16e921fe431a0100000000000000000280a812010000000017a914620712796c66914dc692a43614d422b045f95eb387bed3740200000000160014f63a49a99cb7629bc272837cad3afe4a0c0c357e02473044022032a25209e33f2eb6e3746fcc0ab8b2d4a26bdf5c0a4b2c2dc0feb6c025380b3402203b2eadbaadc5deff72c034b66fd92752112fbccfb8cdbc9168a7b162efe46e9d01210349f8eda8144630aa5456e46b33fc03c7f2d245f50b18abe63b0850e2f73ad3ed0000000001000000000101fdd8c89f230b8720507aa11f1341b718031200d8af208156a7922a2b4ba0b7660100000000ffffffff02f22d01000000000017a914c046e6e79b3448691c06a4c69012a326e3b5f5e88798ce060000000000160014048f5c7f6134e1f528432f527a13d7c2696877fe02483045022100f9bab72bce4f6ceac2e7f1080546b168ddf413bba7c0f67e71ff16413d711300022035345f99342db6c87bd9e7b4b4048f578b0e9e35ae7c1105a179cd3fa4bc93d601210338b89b7925dcc45681ba5fbd48497295d1dfde822e7b06f72571962e1b2f6def00000000010000000001013278fbda969a05252876b8fbfeee4d90533351af10e6d0db449ca500864dc94c0100000000ffffffff02909804000000000017a9149404bf5040e3566e7a9e041f98bba0ecd0047ca287b8af09050000000016001499c03801794930faebc9cfe28e0896965e3e53dd02473044022032fbada6843167f3758b430d222a1d24e9445b031533f6883ee305e56b5756e702205bfaab1345a3b44fde600e90734910cc2dacb553bd0e2bf6bf05862ea9bed6c8012103b5a3130f46166445930d21f7f5b256fd3c309899114a831e58a03ae090daaf5e00000000010000000001019217b0e38a91d86685c0233f0f0c93a1f710f64f4fd932a3b4edded43725b75b0100000000000000000225e70d000000000017a9146e9e9c37bbbbab561ac2a97464b58bf1507c517a87e2ad300000000000160014af6556a9b38bc59b6617a3dd3e336ae47e17d27802483045022100a443fef79086b5c23eaf218d6c436fbe1ab8edd15c8f17c07fe3aad183a7940c0220508b83ce4a3b9ab40cff8057c54b97a907056f9085575eb94f136e42ede808c8012102754581ac855aa4a7daac01d091211c58dae0d051fb856ee660d31faab45ab83b00000000010000000001017c61117aaa32db2457492045572510d97528285d4617480b0a5ddcf0f3d275920100000000ffffffff02f9bc06000000000017a9144ffa39e4d2a8e2c03ff0831b65234bdf435259c9871be00d0000000000160014bedef437e5570b01dd58f41288f4914f40b4320d0247304402202b0244502065e26ec73e85125bf5b1a2e22e61666d942ff7080bb5e746f7288d02202f9bfd5188e4e319540127c6617872d9a19d6d2c87fcdfbb9cec246b99e52c2701210248060877efb9bc74566bc69a738d5edf0167b01ee8131f317d64394ca9dddac00000000001000000000101628684523555c2034ff8f19d3e7d9046a879279c73e4c73207f6c455b3f85a1c0600000000ffffffff02c0cf6a000000000017a914d303356e924625636c41f31b41a2aa519457a533878cdf9b0000000000160014d3d11f64313d48ef9f5dc0fff553139a2bd19d4502483045022100b200a24fbd1e4031f56eb5b961b54c4a785e239f82e59c5b4037c24d0fcdcf01022070ea4fa067d204f5977250d71626d1a9759d24b75af5888bf58d069ff566e6d60121038550902d4397bb0af908142fe834dc107104ebfc307864199ba3a444b66e60fe000000000100000000010105de45eef4c4cdf63a27e1817feb1f4d6410034ec5b3a897838857a26c8d331a0100000000ffffffff026ed00a000000000017a91459e57c6f3a81488505529d7bbddd452ddf86a79d87326a0d0000000000160014d1885d251cbc838cfc4e15dda2875a45caed45910247304402207fda679bf634480990259fb5811e9f98bb1aa01f480a570576f820f9f5b2e09602205586c2ebdc6661c7ab857a372ad75f0c4721481cde7c17eb648f66af669029cc012102d7c657dac5636c45d25dce99f623253bf5d1a285b66d7e89725398f03dc9e0280000000001000000000101665da4bca6158fe4835372295a7cd5b623d871a93c15b507ff9252dd789116a601000000000000000002400d03000000000017a91456f63533907f7c9d7f84b676f4d652aae29cdaf987043539000000000016001427e768825ea04a36e969c795520809db4f5f0ec802483045022100da1bc58096d6ddad2473ecaa70384f1f980f316cc76abd668577fd2e49621e9002205cd7b3995da0e7989b591052f6d6da706e4af3000adca81bdd9872f260a14bae012103b69256e5769d3be65a8a208c061993ddb6ce01ea4c7d1e75c46e9d87418de47400000000010000000001016f1cc3e8097a907b0cbd60660d9ed726f3fd2ab03aa3c1385dd8eb32a2ba55b9340000001716001462465bb436f39a176de3f08408b53c18b0f4b8cfffffffff01efe309000000000017a914c0065c3cf79be62e8ae142ce6a196aa04cbbc00287024830450221008a54c37f98c054ea52ace8ed52b2cde28ae960a89847753f2d4a87b8b0416b4202206fae28a2b5d686a0f640fb6eff0dd910b6c87d46e8cfc721b3478061d3d45b680121029fe6ae6f9beb07a065c97b7c5dc2045234cfe1365b7b639027e39f8768cb2c1600000000020000000001051e76fcbc440448c6e976bda2317cde449fa068fad1f049417a35e6647458ef640e00000017160014baaa22b72780eee3acc0cb5dae7aa4dd02edd365fdfffffffa31ba9e84407a40ed3479ceb70f29d01f6cf1c57aa8627853c400d1268e390a0000000017160014c557f37a273df03c61b5290eaea00d8ac1b2d3d1fdffffff269fb681a3d2ff612bca556aa1e082dc1196e3847af46bd4c68df16ac1865f3d000000001716001456f32c22aa819c0f1f9f96ece21b3554d9c58bbbfdffffff80930ee4c161c7970b799212a5a92b21053426951e89383a3cf72f53277f7fd50000000017160014bcf5b40ab4d81069705c1b21e965015f0b3df6a7fdffffffee98cec84c8152df22fe2a0bb319cb10b203df32cfbb88bd06def338b2f3d034000000001716001436f0de0a6a235da0e734d1934c0201b438de9c86fdffffff02ea8c4703000000001600146dbe4da00542b83ab674a03632867cd06b1fbe25ec501400000000001600146f76a8e51d51864638d1c4c83093329accc5f71a0247304402202319815a331cf91d5b2aed003228e4542ddc89e83259d9ae8f5ac63294e869f502203a661a6da0c3ff86cd805b9dd44837ac86d3a6fd921e9dca092b1fa04d87555d012103e71f87a6ce6e1c5b3f444418bfe6cfc149a53d96c153be439e9d5eb9ae28dc460247304402206732423e6fbef50d73449ab9c9544bd0730b57d57ec07b3e4d66c3fcd2a09a050220110d85f0e242492d46fe8f6ab8630649cff83d94c1a9d32fa8d82fa4d532e834012102fb879b66f4e6927927fb93ce8abd5f30432cbf6fc96f0175b1209410921b823c0247304402200c6cdfc89c30766264c7216fa1f97c501fbaf65b9276051f8e04a7484400a2be02206030d146d9cbbc4d4b21cb432b3ce6368ee5912c41239c8c607828c05f61484a012103039a2357d916e00640a3b880782e2da435fc307551d5d52f4677ffe6ae3490fa02473044022003accdd685ae1834c1ba97c0586a91f411e6bc9320fe7c731aefdb94455a21bc0220546e8583a0bdd8122fabe920cc01c759ee273b35090793c7bdc34050f2e854b4012102b4e01f13c2ae21d7fdcad69cbaf23228dde52a552232ea7b1389d63763ff3f6f0247304402202dedef9d03fb1d6bc88e67897b72872fef42fe628a0570f030e53526e6e62f3802201be1ec1207b5d4ad59fa1af96988df5ecb03a0402383a91668c715a0730a12760121028bfcc34a6f6e961df1c10f8025d8a309a4acfbee40174f7f70152b0fce4fb8a7000000000200000001b94b6f3f53435872d2808c963f17231a744f54d1090cf88a9c7d0e97df47e75a2d0000006b48304502210095e12a95df029193b8e40f5fc19f03ac18aa45a750f8c94fc135af1be00e23de02205ce789706084dd58198dfa7a509240aaa64ad447f486fd3a16aa7dfa6fc958530121034466c9cf82de0feb88ee4dcb3a47bd4205f60063063d58947c76cb3bc0325ebcffffffff02887e4b00000000001976a91445677d9659736ee38427d54c764dd81f3277368b88acfd1a0000000000001600146f3a558ba24ea134b55d8d349310530355f232f800000000020000000001028c5bbd106d84a391a390f8fe231d8f7c77cf57e81f3b3d2f17c24b0a621b0bf9000000006b483045022100c379474a2860dac3f51bd586ff0a270062ea6a3aaa023a815680f1fea0510de102206de90bddcdeeba6f9576e5ca82e06521b0c8dd13be32e7108067cb7330f48889012102b7d3fa15bdbad0f0b23baf46d3a40c2c51e0353e7a276350301ca234c3b411e8ffffffff231cc6c1aa3c58c7035f7ef7e8c9c0fb09c4644ca7c18a42f028759493add7450000000000ffffffff02ff2354000000000017a9147f36fd406882bc1b6b0f0093bce323719ea4f20c8728f107000000000016001447b95403204f1fb2a668eceb2d92d65ab32f113f000247304402202fe96dfbf03a09e1cf4d0d2a963debd12014e4550ae0fd57f494d648401f2d2a02201124d7462682092cf14b0d6a3cb38ade1d48073057ae0b362cffb2502954152201210378837649e74a620b2601bd48b3f892cc3dc7c9fc5286c744117efe93c9a4d8f600000000010000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d43900000000ffffffff56f3b503000000000017a9142c2c3b228e2e467d051d89256d55058c0b31171487fee10100000000001600141d94ee2d7d0621d1770a3a41eda991120b7c11f78f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76da09050000000000160014f833a90495d80ec7efbf5fb107e2ec0fad030a18f75e0000000000001976a914cc4e2a4da2f1295bd4061b68246ca5995948ddb788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ed9a0200000000001976a91475063e6e6104f7ed3dd30cc7274498575547644988ac755d030000000000160014ec91f234add3c943edbc99ff00916fb2d386700637a60000000000001976a914033748f4161bdc6f722dcf6d2cb9808adbfa9af188ac41a10100000000001976a91433dee2ff07a9924073876a2ae06d50c210cfb8b488ac2fb801000000000017a91442f00c15405916eeaaf65d5113e119bad989d960870a0101000000000017a914307f577713adb35ee7c44842d86ed52fdb765adf87542c04000000000017a914363b09b9403141f1e8b11098a96814f8cb7f0b6d87fedf00000000000016001432895d354f98284b0eee79b7b51923d3697f2315f1bc04000000000016001413b06e4fa6bb5c2663093d3f3d81cf8346ecfc78f1f7060000000000160014c49042b72182197938f3c1025b0b3912bb2d51b0f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7600093d00000000001976a914f3949ce2ecc67fead5694a3de93dbcf0cf2c875a88acb2ef00000000000017a914000462dcd263e3428e3ab3bbe9eb680968f71fe187017903000000000017a914acc7bc45968eb9b7e50f5f6b9c18514dd4c8ebd58772f715000000000017a9143a90729c74989da2d5ea9330bdaad9355e2c5e7c87a9d910000000000017a91408606aef337554fb05c99a034600bc02724f4a4287102101000000000017a914b78c3edec45edbbbc60b3f09c4bbe778d7e592638790de01000000000017a914e255f1a8a136e62aa7982c42d1dd2ecaa08adfe587349c00000000000017a9146909f35550b29c2530894080d1bdcbc389ee31c687848d4d000000000016001454728dbfb81200f6bc5efec96cfe479eda10e68d508f0000000000001976a914b8c8320b0a441c9ed4a335a352ab22240e6b286288ac76ce0000000000001976a91431e79222b2896e5c0affd0f20ce04d320074cb8888ac80d810000000000017a914b268fdc5ae36bd61bc43423b8fcd168676df66e087f2020100000000001976a914a15b696f9e71e27c114ac0ace127e7354aa5468e88acaa3e0a00000000001976a914475d6a6ea7a6a479d77601fca1839290554125fe88ac4a196500000000001976a9141f5cdafed28c8998569309ac02645292adf2677588ac809354000000000017a914715b8624aca1fe4c3dca9aa7c29b1e34508f6e73877bb503000000000017a91476ed4b67e6af56861d8140773bc3ac5355b19b3587ea3a14000000000017a9140710af23c4a39f8d16a71f9540fb06bc898ee9c8878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f23502000000000017a9141362f454bd98636c93234622bf6f134f430515c78747ba2500000000001976a9143dd9e912d307fd5447bb9209fc75f692ca42732688acf8a101000000000017a91435f2c8a5512fc09ebdadf6595353fa4304537516873b250100000000001600143f9d1f8098891e362670164d425bfe52a12e8ebafd152200000000001976a914ae5d35c3f7e5f7542186eaca767cef4ca3c1349a88ac67200b000000000017a914d422f3b254feffa088ce6f6043959bfc62100a9c87632f01000000000017a9143aee30b1680fa1184e675f06a67b6e58521bba5f87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ede83200000000001976a91419aea15c2827792b1fc7d978082dec5c06da956c88ac9e070700000000001976a9140f2975874f83587c6c14877247da13cd9854aca488ace57000000000000017a9142fd2cdb9a91520a2f56c02583481acb7a40a902687dfb30100000000001976a914580696b069d16022cffee47e2e358ed882b30eff88ace36b0000000000001976a9146801e44cb4a87d1d8fba21a74104fb06cfe6a32b88acff850f00000000001600144d93eba800c9830b198c802617945a2efe2fbdb40e7900000000000017a91415616d68bb2c250cae44e7b7af9e5e576872ff7a87ce7704000000000017a914ad20f3af12118ddb1f7ad406d00834a2b03b01dd8727bb0600000000001976a914b55eaefb0e25794c461bd829eb8b7c572c62d92788ac225f03000000000017a914ad781c2307b13a76e668cd1f9f356554563bbb5b87766ac100000000001976a914e0d8624588ffe180dc5ea58556323fb96e17c37a88ac3c730100000000001976a9147e11ba335e9de493061980a35e4b1d5b788b966d88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76580f23000000000017a9141ac471f08cae5375ee58a003c346ca383494eeba87f30720000000000017a9148f7af9047693854d70b6068cbe9e4d602eb33b6e87bd1a01000000000017a91493cbcf2cd033363baf2f3c63dc6bc6f86a2387d087b0ad01000000000017a9145af7953a5ba4b5048c48c38f8a619b62f2b3ce8287d18b00000000000017a914c8a14cd12eb15864fb9e433b457ca1eea006ac8787e59203000000000017a9142b9ae16fc5e52400e29873366aed398f730bc1398782af01000000000017a9141192ce9805fb1dcb4d4b0de6148111766584eb8e878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd762aec4a030000000017a914715c4de53cf374ca5948aeed646e8207463bd8e18723f0fe0000000000160014017478195a44865ff95fb87707a967a8396d76b9e8e24300000000001600148ed9adad140a80bf360ed12702d5a19ff6cd8b1b8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ca590200000000001600142b35fe6b624a5e16e197b47478ee2c861684ab3a900b010000000000160014cf28b3f3fa5208efba4cff92d79175fc10bbec74ff5600000000000017a914e8a0e4cacc281c686d1612a522ed6a6fb13f8eb9878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764c8100000000000017a91490e3a836b496b87740747c14941b35912da3110387d55e00000000000017a9142486ff21ff3bf7a198e71a8580bf1c904f689ce587bf3b20000000000017a9140595bdde75abe0b979d8cb2ad9878ec226ce0419878a6903000000000017a91471ce3a8af1b1b8fbf0a7b50214be06c8ca00e25087a5831800000000001976a91474482d794e1926c4518bace3289b73b1e9c8de6688ac95f410000000000017a91469047a0c51a05475ee1c7d2921f04004a45a079b8767103a030000000017a914081be5b512f6627b27bcfb52587a0c584f2edc28875f3102000000000016001431fcb1b12a68d57f355c9b1c94215b68ad780dde386c00000000000017a91401750ee336344cc43ab6ea4495256178f737db2187204503000000000017a914061c1c9f1c495e4df9676d82835df298e8938a9d87c0470e000000000017a914d2640ec2bdb7bd0b3f953a8b90fb9f1de86c4dee8776412000000000001600149fbdac96811921192bd2fdb7b581c451058ac14d62b804000000000017a9146a3a26cce07a575613a7ba3ec38016828529628a8702483045022100d7bd995213ef8d00c3d8d3bd1f7e132ac169ff73619ad908415098cdfc86ed7c022066a15ec1ff14a29989aa77df36b3d2c9e8c1ee244ce68ef8c5c1a5c1c917f7be012103f689b0251843bfde1d754e2a75430d1842aa0c9b49af26033a3d8822a50dc0f1000000000100000001805c5c5b55f40c27ef292b137d086958a25f958238171dfcf82c8294acdb32601e0000006b483045022100c1cb67a7ce89ea2c11ebae8a76dc8c174f7940180271a40ebe6530f22dd9a1ab022048226e0919990f66f9cd485044bfef6d953b6baac3aff01a34c9d6e439ecef170121038b5b58780aeb43a85a4a697f7a5c86f6ee83c4223729b2112ff2e2d8814a57d7ffffffff016a380a00000000001976a914e90299f625881e5c456876e7b0643871037ca80088ac0000000002000000000103b5d3de50afd8e6bb04c7980e420f25886389df936675d96615e1f6374788a1de2e00000017160014841a42fba3015ee87ff13c0517cd9434d678fd7efdffffff43194a0535214e77fea70f6d9963a5c12e1b563a06ececf697a986288c9c49a82600000017160014188b9fcc602d4fabfb538fa0df4c8b90c8559e7ffdffffffefc8cd895e2e33370f7b38c7b0c9fc43b21ab2af36c1c5a4366e718b985b66a100000000171600147a2bb0ee416bd6840d9473ee87dfdc7a69918d50fdffffff02440951010000000017a9142ed48b3c3a4ea6b38c00525bfc12e09edb637a67876eca7c00000000001976a9141aed05fd3ffcff2f699b6085f99fa2e60bcdcf3988ac02473044022003cab680a9fc014171eaaa1ea9848ff19289052b318f4d944854cc5a7e767c8c02203854fa7c5a6815325ae35bb1cb5c4a0f25514bcf0ec53108e595bdab3981a1b4012103fbae5864aae0556edfebff195862ebcb0180c42f0c32699b0dffff79207fe5e80247304402205d80433848d9ae6c878599f4710891c79fe76af1e8c3b7d161f03c9d8038cada022050e0ec0a5752d4ad3432d90f9ec236990a25abfc1715b4c4715317017e0c5bca012103f3996f7b11bd5672b12210324a69e0262a80cc9856decd93148493b5c49f812802473044022059de10b6b501a1f48b85de1cc41e705a3b4b03f7213a087a53b1ec8438828b1902204db09a929247574534c50e54db29f48f959e2ad469302b79482964634e02e4240121025af18c6b88e9d18fe030f2a6923100d45c298bdc96152ed911b72b053c58bbb80000000002000000000101f104607651453b6d00e1c0a3d18cf66585553013492592e45861996ed4f369820100000017160014378961545794ac2094fe15934d7622fd9593fcf8fdffffff020e4500000000000017a9142104be28c618f6878e401cdf906354b23f0c77f1878d2300000000000017a914f24be6cf1f7a4f1c0f932848cdd749be0a0dc949870247304402200b2999d13f2a4fac2f044ebd71f4cfc969819053e3f5e2916b2345c3c607dcc402204afcf55c5182ed4e047542794fa6f3d40a0b03f876475748016e3ab3503262810121036f70de72e98987b91dfb82411768e9036c424867ec70242bcc17336068da99660aa00a0002000000000102c336eb43915b38e0eff147851594c94c33b5c92e7c71c3bf53666fc2a858fe270100000000ffffffffc84d70d434180463a12c588066d711ad7c2f988691300c77f8d7b06e23349a840000000000ffffffff02435600000000000017a9146d4d604b6d8ece08f2c22400541cc6d0fd3a3db98747090000000000001600146a3f92b151a8585d0bcf1645ffdc51baff37134102473044022077544d7928510c7adb5617e50f60944cd71b04b0a85478ec505622a6537e4525022061c69b6575635985c621c906d1421d5082d4ea455af0a6fc58d4740d15ac61ad012103b200825aefc71fdeecfad0659ae1dfd93333b19e9a2d0ab0a85d02878438bacb0247304402200a4c5b5655e5749d06813a0a2a4eb3d80ce2f9050a69e68b1295c85ae29d785b022051c19693a069cc0d2e5885ef8a33d9ee54787b95f342517adaeda63fcd47081b01210306f7b28f73d6a8399b0a107d7922d4cb5474f7c03f9f50144f70b4cb875265bb000000000100000000010202cc8f53dcb160279e4d8ee70172a4400c701bf3796a0dfd1c1b90339a7d0986010000000000000000cbd04c20a7347560483b0a87b59580bba69f54be6b759a90f32531fb960c5de8000000000000000000024e74a800000000001600141102db443bacfe4accf7594c54bf7e6ce0893f12485e870000000000160014cceea11e907adae1f71bbebedafea18685523b1b0247304402201527e0de20ebede8a030d8b68eff755eced41052a52100b69800846764f3360702205278f7be942493485bd7bea4ed2752363192f24a61f43e8c2d6f5c4ca5a1dabb012103a5e634bc39539747e26de0e219196315810a09199ce9bd8fd9583f1981faff6d02483045022100c8b3d86a6d04f9bd1347428485e9cfac4c74d71804ad4c0f6e80dc14635a37d202206edd6f6cd4afb8435a43d6318d29bc6582028830cd8fa6976d7571c1062bafdb012102a93b3bdf0b25563df9bbfb0abcfe9ead626c5591c77613ba89d2ae7e9a0f996000000000020000000001028fc106101339ac998a430b0cc25461b6f261f0b39a2c013f0dd0fa5b5e0605ac1b0000001716001494353f7c41105ff75bf760ea177cc975b2f15d4afdffffff4ad97ea5f8182883254bf60a25949e0a4d5c2b7af0a8a0f51f0e82daa71bdafb01000000171600145aae3b86817a9aae689b85983354a3a806074589fdffffff015c0b060000000000160014d2ed9aaaa3a285b8a8ed069de0aa08591a7bed600247304402200f6bc881ce5e6bdef069be34ca27857377798d5725fe60eeb71ac04a7097ed1802207eddc79afee8108f3eaeff3bd83c12afa35ca2e352fe2c94b02b918cb210ed4f0121020e8be8fb4a4f7cc34efd4d54f7e3547fb60a11bda2cf4c8ee292662f22303b56024730440220572df6e251e6a63b05232e4c67ff369faa8b22eb161e1b9ab7e29e9812bde72e02205a3cd6d49e4ffccb116bf7b30753f99734997c3725c24c54a906dc9a0c583912012102ec2ded6e3981f6f8170de187e6a2cc19bdde534c1a46ddcbdb0bac0f575b04fa47a00a00010000000001017e0da2fddfe8c4902743f4af4a7d1e2e76500a501c0b120276d6bf1ea225872c1b00000000ffffffff49533b00000000000017a9143070a131682ef04cb7307fb10334c5f99e1a467d87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76228217000000000017a91464c437215427408dc941a86759e502a72ea800c687a05a3200000000001976a9141477a5b27a6e7acae2262174f7f875ac0a058a9388ac8cae17000000000016001446e3ba86e112339fe82ecdf4922052b75f8a920c517800000000000017a914d0d6b32cedfbb5b07c6c77d36fd91a11f25f09e687f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76445908000000000016001477cbcdc7ac865dd21249342fcffb50beda72b30d541d01000000000017a914930e9620676c4fdef170ec71666304a2c64e5ccd87ddb221000000000017a914fba30756bc19084c6d0128ab3d54ab28cd91f4ec870f7006000000000017a91461ece2babc90cbb6810834799795a823b2b33fdb87052b00000000000017a914a365417e90aab4f54b8752973fcd343df0cc5ab587dd1801000000000017a914ed23954cbc1d8f7912a981f25ea1872e17318ac2870f3403000000000017a914e53218f2eeabdf397e644f2a936949c6b0dbbdf3877f4207000000000017a9147419d44121fea4909ac7561283b0cfb411393826878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76695e0300000000001600143a1b4fa9588b225873230f4225edf8fbeaccbb487d1e1000000000001976a91425954b10efbbf105e8034cf0f6834b18c780498088ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765cad21000000000017a9144fb912092d5013cc4ba5496b00f692c3af6bc85c87167f0000000000001976a9146a94cf586c9cdea00efedfd86e88498b6df9599b88ac642d2f010000000017a914c669e5e0587039bbc33c49f92927fbe91891720a871e6156000000000017a9149088a79468f190ef19aee7bfae5d37d4aacbb3978797e63500000000001976a914bf8b1aefffde342c12636ac8a6d7daa055c1cf3c88ac4fb90300000000001600144ef8e007795f1ec2f7d6bc75e16a5144a14e0998db850100000000002200201c3a1fa29e8ab5e3e023df105e4562ee2514e525854ef1140e81d8f5dd2bdc1f40420f000000000017a9142ff8c9d85c9b088a9fdcbd82b82bdc27e50f4eee87ce0201000000000017a91447e256115dee4ae3c347cb88b17adc3033dcc9ed87cfb70100000000001976a9149363032f16a29dc73e9cafd89be6e168cfa7f49588ac33a101000000000017a914b1290ed27bf34dbe3e1f41cbdfb51d465ca413ab87e3600000000000001976a9149fd1d986c22f727bb2e1eda43524c09fd6db540788acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7697d90000000000001976a9141cbff7f1650b341fdcdea8a006fa11abbba17f5d88ac135901000000000017a914322baf8bd37f9e5f8c67fcd715229ebc5ad0b9c587c28a0900000000001976a9142206b057dfe2f298586bcdfa30b71d62098821b588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7669743700000000001976a914ded471777f69357ca2829e0fa5186b88d05ea5f688ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f79e03000000000017a914c11fb04c8c32b648d0ca96707a45a0c9c8ab938287607d01000000000017a914d0e0e1fde003473e97d407cadf0055125f9864d98757b3a3000000000017a914a52e8219be7d01916ab87f47dcf5c9f8da69127787d8d600000000000017a914de1a8377ebfd0fa8d0b0d8cff82a6a5f8e36a48987d3412000000000001976a91497414475f310c6fccc4fc067dbb7ff174945e1b888ac89fc0000000000001976a9145a455593e278d8b31effc51be2b2c989f2ecf3d688aca248c400000000001600145e306ad963ed20bf4119dda6a9948e0930a1e2364e9201000000000017a914e7c552b400522f201d9be0c6773d08c58a5ede9987eeb001000000000017a914c8685f72fe153a98e40f51ac89a53bc0893a2ece877d120200000000001600149790edae2eb1e570073732bb3f3c6e79d7cf1c83455102000000000017a9144c60e19a9f30cb4ba5a04a96817dfe4e90a90e71878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd764d450300000000001976a91447c0ce28bb8921fd29623455284d859f3c6e37c088ac7b4a4c000000000017a9140c5122e63beec0c083064457d228d21d3b5e975187123903000000000017a914a83d5d1a73064b94796db8435023281c413613588786d906010000000017a9147ed2a584ad9ddb057b7213475c2c390c7dc0213c871f2b00000000000017a9144dac6df223df146d494faf51c571d457964e9a0787358401000000000017a914e6676b66364ed2b2cbeddddcfc209ce651cbafd187586808000000000017a914fcf3802126141b6812cd0b2d192b01d6f47f4b0c874ce6fe1b00000000160014e9c863c73cad3419c7c735011bfaeb76560ac7424cbc06000000000017a914b03f898c50132987384c299b3d40cd2283639c25878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7653493e000000000017a9146a405c599d3aa38522453ff55968177807864c1f875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f16f03000000000017a914229abcf6b3468fddce7c382d124e59f61e85fe5f87077506000000000017a914613ab2f099c73b511062996e15bdc2f412bd94c5877e610400000000001976a914d7bc56e94cce3c9df12e6034fca8b264e056451088ace03f07000000000016001483faa4559ef19046c519b6a08e7ff1850d43da99f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd763fc901000000000017a914d413d90c2d1e9a49a6254c66ef350d0ee23b5bd48702483045022100e55a109650a489bd8c1cbe1f6671f6a3e2750e972a0bcad5fcf6193c50796b1a02202b458e46da5592e1bf51fdd4809756c240d410c69f3725b32c522346a2d1cc9f01210342bf26e8e584948be6642542e485871f2d99009d69c5c0816f0aa5e57fdb44c400000000020000000001015189b481c8864d4d46e6704c78e830053c903c8ac0835cee8d605c4adf60ac551100000000ffffffff0250c30000000000001976a91421ecebc2791f5c972f8252551e3e90ed04c62eb788ac4b96020000000000160014def30625c7a841f803eccdc05d3e3f6b1983dce602483045022100f23ab93fdda1c54119ccac38a2f88bc6771a6a679ba7e066f63c40a512325ebc02206fa2353b6577b713f615d718c36b2282a8d24fbbe33fe17352fb4ac9651ff058012103a0f01d500ae7f0480c4d5892f7946e84700b86669cdeef090c0203ad2066aec700000000020000000001024d390b504382814c0095ad291f1732dd904679bd26ead85afc831e674009083f1600000000ffffffff4eea05f79130c0f90b0065c38b226733984b4edbd337a403c2ed1cfe548add340a00000000ffffffff02c0b60600000000001976a914573d7eb05730a3ac586c64811e821d67fc4ae4aa88acd718010000000000160014b72b2888a9e0064b1543f4c6aaad74106f71b1d6024730440220257d7b4730f5c3d348f0832f08870e6afa3c7eb5f824676ba54e2faff152afd8022065df3970baadd7ee5800fc254bb63be416a215c303675a9cb7c2a1f756462f7d012103f2393d6885aa34d38814e5973114619cfc59dc634b199974888881fb764e936a0247304402206580aad085d8f7076a0be7247e548b7750e7033b75f1d00b11c9d3988c9f055e022006f1e23c9d68f03881ece7966122a84ba0b24a685e5abaa9f2aff40c832985be0121020004c23e9773b8dd00b98974ccb2c9350f433dd43081cc01efde4b931556946c0000000002000000000102cb5aa370e8fecc1a84720dcd558306dbaef82272fa68d95b1a40d4fb9aa3fac60100000000ffffffff293b3d6dfce8717decfff974b4132cbd65c57e07246fb4d7b60386c5f0d9bf240100000000ffffffff02ba952100000000001976a914bf2fcb71302bbd2a4c3a12dc7da753878d1aac5088acef86030000000000160014732eb91e1ee7de2f0a04f0cfee145bd3e9dc90cd0247304402203e4a3f6070c7dce2c7cf278faff99c23f17c7ace7ae550a8feaa874bba124680022049c09938880a75b781316c3c796cadc583ab638cc9c8099e7a0793f98220a0d8012102558f822aedd7f45a9d4de84c80bcf3fd443363107f1380e905aefeca915a593202473044022008d4737a2a4c37a42f9c80b25f14cc124f5940293e270d0373bc211106678bbf022028ae689ae09bfb42f483cd6f654557613b86d1c1a20b02979a6358b9029e375b012102f93b02fd45b74a5fc59177605ccd60943669c6fc9d6afc9669564c0f21c2fd6100000000020000000001012694da2b39568ee7323ef9b0047073a300d6f904ecb2685a7c881324337cec200000000023220020a54edd7d530ab3c3d1602fc28aac2b89498c8acd3eff9400a654f7709af23cdcfdffffff021f1e2b510000000017a914f35d56da9c30a28e45fe632c1370386e0ffc1f5e87404b4c00000000001600141bcd91aacc4c96732387e5e02d0b37b7691b519e0400483045022100829b6d531d5bfee28fec165a3064d9f21d52313e892ac4663ae6db926fcb387802207d14eb026b6bee9dbc4703edee732a193c4a6d1477dfb4908511269e2d6fa91901483045022100e9c6091de5c4f757c0d8cd2b1c14b75569059a524b908408797ff407aba996cc0220359a0de6f8bc507ab900cfabea3686070457892be5a09ed06c9cab26b5d91d2f016952210395d987819ab03685492940752f61e5409dc5c46764a44a183d78b52aba554a8f2103ae48992f9fc5fe7d086f8230f00c6af978f4161940a2cf9cb1a33b966c3953c82103e56b69760cd1b97fea74cf3fee48d22493e6a9e4119e82cc3a5828f1a855017a53ae0000000001000000000101bb1c730634810bbd9ffdb757b66920fe5588a88efc57fb0c55e216f095bb1152190000001716001477402f157f755c8e70fc26294317c42db1ff25d8ffffffff013d940600000000001976a914213a11f65620aeecb1d91a9a378dfe0c3091df5588ac0247304402207c78809880beaf59e37a9d9455b51238e7252ce1dd53f8f4082f2c05a67592ee02207c16b2ce064abe7b37a32f661098be564f8097d8c094b2b89efaa45bfe6bbf9a01210251ef2359601de546ed5e4c43ab112c50d635e488c4c0d4f310e9dcad84c803420000000002000000000103ea4027ddce5a1e17a7bd8aca0f49d3e4290669464f2c859ab284d89b662ee44d1300000017160014dc3f9a0b27ca76b964a1455076ce215441450c2bfeffffffbd5015921c55420558d73bc43b4d69c91f0669055bf2dcf4297a14328f35e74a51000000171600145fd69a39c937dc3c7c799c6bb160586ca54e9cebfeffffff5c564d4249e8554e574d9ffd7eb42196f9d20472138acd8ae599f03d0007564a3100000017160014d9abb9cc881855124b5d72c9b6bc797167966889feffffff0109150a000000000017a91496d77fb6a82c76c25b721c52edd9f6f78473370a87024730440220747e0b14110a596effe660e85a004128cf157902dbf8a4c3bf0656d861e75713022065b8cdf9e14d6c2ecd8e3a334ad2029e7d929fc888fd4f708004421d59ad68370121020ab84eae7c545bf53bd0144210612a23a8e004929998324980ec7de9e4cc7ace0247304402201dacf390d60606df791da4a130e5db5b79e6c637932b705b4f2a14fce6f52ca1022001a9944f8053fb8fc25de3bf2d1bf074649440c9e3f43232c940a8ea46c0b6ce0121022a75f2316eda09e35205256dab6705212bcdac627d68c7f6f35249e29dde09a30247304402201a849be84cef79453941771a0a45c9b006746aaa10ccd950da68118c3ad1b603022044cc1ced3cf3c3104153a98bc724bc475f1ea262f192e674f51c285706b9c0060121031932a63e320f18fc9919bcb521c692239c695a783efadc89ac822bc815339d9348a00a0001000000000101bbc4a77bae29f8985bca2174ebb042a7cb6e008c145da96b50ec2ed47399502b0100000017160014bc86fe7f860c81724ce8c29d1cdd163276e951d4fdffffff03400d03000000000017a914a0ce8f29d6e10449189a61efdb101601a444434387409c00000000000017a914f38995b1cd6b5801a90826bb798f2afc8cff2f648750c30000000000001976a914074e7a9410ad48692bc8d69dc6dc638066f3ae8788ac024730440220050cc912721c15d31592242a3a5ea9ef339bad1dbeed5192d39fc047319a375e022047b766b76c00e6844245473c0fdfcfc692a49075bf4b3fbc6dfca21ab845258a012103744fe622d7597907f0426d0d65364ed31716bbef7c686c05ec01e45db7677cb348a00a00010000000001018b01a02300dbd9efe9e977e9d8fa60732a391efabc43eb1ca73acbe16b0fae860200000017160014bb606b11d15a260e224817f6f137102b4e1fd850ffffffff01c8f700000000000017a914d7522e5dffd247c5044cfbf1f409fdcd14b1fab387024730440220555595a534c9d705264833132cbbd0555260bcec8871992d0f5c291ddafbf58802204ebf1466758e2aa6e2785a7c10f4bde697960ac897a3864837181c247787fff1012102d49b732d6d2ae96a39a645a331b89f02f68828ffe8062fc947ffbf581b69131a0000000001000000000101664e640dc2b8d2cdb5759c783f110d6de9933f7acee51c01c12bc12b11ba15f5120000001716001480a6fd59ea9b9787ee1d4bf659c574bca426dc64ffffffff01b67a00000000000017a9145a0baf63ddeb62f47d915828542a7feed01d8e6a870247304402204b7f35ecff6e7fcdbcdddc2f3f4d749bf92c187d79218faddcada64f8f57f25502204fd01aeaa2bc72e5f04a499310a01a1360d586aaff6ce7b6f62807af6b3723c4012103c154c0a37addf333bde15ea4cd9a6f5d2411cbc5c8e075999e40caac361c5c76000000000100000000010177be49eb445fed10ce2b679772066d8a3a6f72a04a47c4263597cac716a5b02a040000001716001436ecada2864dd980b51d3a07fad6557e77303cbbffffffff01598a26000000000017a914684d2388fa75d3c932e75db6c4c304736616a0e887024730440220738abb5edc2c2394246865f37194deb5cbd09da3fec0c3a04237265e27e97fbe022048662aea48d75b0ad4982318efb58863e98ea0c2e9084e2b32ac9eb66ee73401012102bdf1baa3fff58b1a0223ff68028630c1b556a456fbf0b46afbce064caf36d4b20000000001000000000101b7b6b4a37769f219e8aad1d7b338f95eb7db57c811de7b9468a802fa3c33d6040200000017160014b9b081243bea0e4d5b8d09ecd18e750ebc940b33ffffffff01d35901000000000017a9145a0baf63ddeb62f47d915828542a7feed01d8e6a8702483045022100fa42fbd897206baa775290f82d87bd5f4441e4156e8f44c97ab15c829edd0bc402204a9f9928a28b900291a8ac453e523b58dc5555ad854372123491d2fc1fa4eb35012103c844cb377f5c0a8d074f60c9894509ff20c21c62033ad6c46d3943f2e48b75ee00000000010000000001017d461fe705a300153a611e87c09a3f7e1c2c5ba93ea7c8a831b56cfdc17cfbd231000000171600145aa53b02f554cc45d2d4bc56aff77179010db136ffffffff014bbd08000000000017a91479e3233fc660a1db36073258a999c76389abb6c0870247304402204935068260ba013404c5658ed0391e44a86fb722f903861a673ea35accbfd1b3022078050e07cd9a98e3fb2c64f1847c9e5db08efad7e763f7773487c80e9d5d47cc01210284a2b9b3138e0f60798e69bfcadca7c4de6277ff9b0d4d0c7488763e5dc8dec500000000010000000001018469fb7e8a0a7d588b8a372702d61dd50a190e9ca140c5913d14e66e1dea64840000000017160014caae01cb7dc60e2e116bfbba9b9c637147c617a4ffffffff0193fb00000000000017a9145a0baf63ddeb62f47d915828542a7feed01d8e6a8702483045022100c2c7249e665eb4e320cf902fd9646d11e7c42bb6cf0a0e4f070f145fa41cb9c8022019896f5359c1537e63bd6e3133d925dfb8632218524cea785d57a41fd1d550330121030bcc1518644fda1f2be063962d79af57936795739d14fd8631e8a0eedf6cf796000000000200000000010203bad55e4ae37eb1d42c84d801d2248e334c0b8e05ad49d3696a70afd43c4b660100000000ffffffff5546879bbc0f95bf9b51993de594869993ab7d4af159d1a4ae67f9052bbf93180000000000ffffffff02cf4b2200000000001976a91467741ee60eebfc8ec54342fc3ae0c097f265d1da88ace3d10900000000001600149c6bf7021fcc87317fa2749d872547211859838502483045022100e8a2120e8f4eb8d8412d6fb6b03feea3a43b350d1d0f001247f9cd596a23d17602202de39df1018fdeb1108216d73bbd6b9e9a11faf55b2b778df9acfcb7b1a53f600121025c9fac51f2cf49864a5d4e271906538a60d655f177a91ad47956d5be4cd9a1e80247304402203878fe5a8f137faff57399033c73818d55bd4c2665e7c76abe458594c0c6aa3902200d9bc826e1fc711ff9967a0bb36657d8019d10bfee1bcc3cd6e8a132b16caf76012103e4a69034c84d435886107cbc59e4eb03800a8a9309abbad480c948a259609a8200000000010000000132bf7dac367649ac5b8610d52c153a481ce303cff212ade5afd769539f89539b000000006a47304402205f49ad3a0be641a5614ecbe190a64ef4f8b6eb8f9e6c7922d1be03c80e59f6010220661249f65bf33310d21c23219ecda1d6913f0cc0d16509b37afb5d77462df3c801210387e8fdd5c0c9d63bfd319f86123cde3afdadbf55676b8702b467e77a34e07f9fffffffff0145442200000000001976a914c35cf605f9a20a69442c28d86426736f1c0879e388ac0000000002000000000101a561f84ea1ce6f7928c8ab76bfcf826e8ed9c5e7d1f090d190a04ce8f62168060100000000ffffffff02dd5e0300000000001600142d0cbcefb373254801a1f0c1af7c5ea245c052cebd84aa00000000001600148d5e52dc5f4f1c0e099f0771883b4ea5fc0effea02473044022046f33f1fdaad6716522cf1e4ceb524a282323227556f86afc74332a154d5dc9e02203d2a99d1729752c0d8428f37dbaf9264e8918c62814445543ad3a8d02e3c2677012103860508a62ca43b334c2058406b4b2abd8b1c5f7f7e17fa1190090cb5cdea11d10000000002000000000101aff1a59dda61e704b47a536643bc20bc24d96574f052ead5e8f1fa70a247a9410100000000ffffffff021879000000000000160014581235906ea14d5bbe5b834ef59f2fed52b6823ecd8b010000000000160014202e98d6b8bb09750b4eecda6bedf8380c4ebcc302473044022034c997f2882982b2054aefc191db2cbf42566c54ebe61be56205a8e4d1579f75022064c1777ea8a2daf1e6db30691ee35ec346e77018dc33ef4907925f65bf5b837e0121039af8e40ddd8e1b41e55c7ffd9749597635f075b93bde3cb290e54565fbf227df0000000002000000000101cafc1e0097d5e157aec6e602693fb46a655236084ce30cb5df33e3e3341835fe0200000000ffffffff0287562200000000001600140e5fddfc37d47d6b36b2a9178287593d1d4ed8dc99410d0000000000160014aa29f5a31dfad49c2d25164ab9cf9bd9b8af53310247304402204d082b6731594e49c6ee8472c3c406eeee5d2396a7bfe7b0a5ae629950fdee600220626dd6020a90f43fb0b009ae6a3b0e19916b5a18dac91a61e9b85e9ae1863649012102d426e696a83567400544f92ce3ba3c70bb540bf2b35aa49dc956b73ddb4cdfda00000000020000000001011a7db0170c8f5abd5d6d3121e43e6d1d1a5382a7c7df02f854a596dc2ebf1fb20000000000ffffffff0240240000000000001600145310608dde675e7819cc57d81084710be9369eb08f030000000000001600141b5a71e26a477deed62af6f12466b4c629cb01360247304402204bbc5701e359409a2e5f7f3fbe3da72182de334084487d6c535d5eeaa5fdb45402201a76961321200c59b2e6ba38f1dac8d2523c501a3a676dcaf7b597df6ac3bed70121038b292c84426a49a4d7ba3b8631179b2693a53325b939714d82993cbd3336fef20000000002000000000101861c444b5deb78c32efee08d6a8c4fcd2900f0b65425bd518e102826343930870100000000ffffffff02dcdf0000000000001600149acb132562d50d0726a01dc52f242029c1a7f2ab52200400000000001600145ef9b98c1ce85cdda755047a501f15a6f5e854210247304402200e0b46c80a6d0f434a9373f3cd9b28eae50435f789b61df1a20a21bd78dc08ff02207075bccc2cbb9cc523e69daf08727c79bcde17a705bd51fa1fa76ce1d2ef1e270121027c8e4fb2780a2d1b95740236f87e9a45bfb52bd7802dac3ccae3eafed62430720000000002000000000101b6b897aedd317e32fb067ba34717240a709815cb275007909c1e9b2e373e59853700000000ffffffff0279d5090000000000160014c51b7708dc163da732c8fb23390f458d802952f7084507000000000016001491c19e9b6bf9e0c99b5b49fda216a595d7ae690702483045022100b5e5ad75efb089e9176841194acfa500f4950282632910eb8675bc15db7cb9f502203cc844a222258b771c0243fb51c991e2765df3336adc14e2c5306c6a093d22ba01210312667b887e6515f93429ed30d189b1f8d064d268fa94179cddf3d583424e93f800000000020000000001015a9af2ef324e2b955044a2e4fb34374ff39e8ca2b728dda458c09d393eba88a70100000000ffffffff029b490d00000000001600143d539da9af591af72f6b18fe12a76cf50a2dbe36f42900000000000016001439203231659006ba5ad95807281ef14c6b9350de02483045022100c089f7e063bd03481cf49d9f376b7005ae8ccbc631d312d5a3081c63b4a8bd7c022063398d925aea3cbfee90b54af8caa4ca7201a2f458f15c6b16044f042b986bac012102864f7ce293f18bab4813102ae0c42758df2b6de4c882a4098a7e1e6dad0117a000000000020000000001018e065bc3734e9e71310fb8fd4f5fdbe03addf383f8584d93fba3968ef6f2dcda0100000000ffffffff02790201000000000017a914f4f3c6a2183c48a644aa9b9f10a62f2ca482ec47879a278500000000001600144773a76700b3e83de49cae63bbaefeba100fee8602473044022032fea79a8eae1ee0b907f709b81f53467ee560dba6628a5288a9c9891d4ddd400220184c329dbf2b91beb403aa03c725515e683a098133986e1fd69e74d6230e0366012102a7d462515258e93e9a71239f086c7ee37c9c72ac1dbe19ec91465d236a928d4500000000020000000001018445d6140b675761dcc5f337ea89bcb8b0d97c325d533d99cbd36cfdfa9aa1d40000000000ffffffff0225455e000000000017a91454b9f8baf82b524c9243765947ad1bb824f22da087f519190000000000160014eff3f473d0d29696bfe8c22ef0cad5aa8f0dd68102473044022078f896b2b9aefe33080e7d74360ed676901744c8cbcf1940390720e2db8a289f02205fb5923347fe2d59b38a11df7ad28f2ff89f865d7b33ef23ee608c27057fc446012103bb77af7ea74d7ec5b7bacd1a0044f6ee99888df481fef458e80320aa379b3f8e00000000020000000001018eb78f027c0f3e7e5c372f0dc1c838f674d7bdb26ecbeb5469c07512593ec6253200000000ffffffff020f2d01000000000017a914b058f239ba28220503a1d3a74ade0ad273e45480872673000000000000160014548a1f53e5357ad8f6e0eeb0ec257ecde2621de602483045022100d008a5241ee139773aa9343320816998d2470142b1040a6a35ec3b0c3cba6d0c022056ad17651e77360eb380c24540817c155983ee28bb2dfbca82dd488404337a91012103e9c3267aa6a18bcbccf991280934fa60104378a5b40d29f84994f0e7d88745e4000000000200000000010114d6879001aa30db6c73bb582153595c88a89ae787a62452d281458d0986c5243300000000ffffffff028ba701000000000017a91429203a5346a604808610ef85c7be8dba91f99f5c8760fa0000000000001600144d4df0a4309bc519229cbfc73b31177f5b46759b02483045022100e24d8f64ed32d36b5daf05b01f858fae1b28f14f183440d401050e921f81a6c20220076812a2662d1fcdfa5711ed45f5b42bfbce1682dac82bd266c4464b6d6143250121028a3522e0682c5cc6ef3f786ac68f4325a92c5bd55f66032c9379401732a4d3580000000002000000000101e4b3299f9c6ebdf936ca16ad74f163a7ff5daa30bab58347756f1c1f99d189cb0100000000ffffffff02a85b01000000000017a9147c395b4ef4309c3d14d682008b2e780b96f6939e877f7b00000000000016001426c1e7e367f86aee3c6196baa6a5fe26e7af7fa50247304402205c457f4d64013bd462264bd2e568914d7ce608cdc5892a0c51a4ff7140dc5ea102205ddff59bc4b249fe7ff43c3d690eb1bbe08d94d5a485fafc1cac7aef47e1af0a012103c1340efe0c4b67170615b8108fbd072335f9775a275c2f9788e14fb77909aa250000000002000000000101dccbccf8504588805b33471887b76e2af84a4ff551adf6bea9ded1a10c8e3a7a0100000000ffffffff022d6703000000000017a9141b8b6ec270d42321cf0fb17e0af4c32fb717073e870bac0000000000001600146aab1caecf8ad6c60a5adf5fb21aa93e8f537b880247304402205006fb9b1009d5713ac48d4f10cf3dff4dd295d77727649000613be377f4aa5e02203566ef59f3536dcff3f7bfc3a9b032adc6c7ead654f8bd8d988361cbd4dcaf3701210221398d733a6f269a78e4732815e6f9e34dc54f69a93cf532f481082d0fa85a3b0000000002000000000101b5f9308def7e1b267e85be741240ae87b72028e6c5a5c5758d57a217811fdb5d0400000000ffffffff02efbf0b000000000017a9141c75893d8d90731d3c05d40e03fb107dbf1332d787be0b03000000000016001458a63727ffe770a41d1f9970c9b50302d2f1eae10248304502210084274086e6ad351296b46c0b3e427ab50745eee600810511311b9daba825538f0220111f4ea1c9a18204b7ac37b3d06c1bbce885095c182789bc2b04bf3a960e818701210271e43375b4073403953202d8ba164e42a5db6c63632ca884047681d0d0f5db8c00000000020000000001010abbcfc05bc13199b5a5534f2de727d437cdaa9202212ef458bfa61d4be95f140000000000ffffffff022fb202000000000017a914062afd41cb078c996ca6d9aaedd4dda7b4bc3bf487a045020000000000160014ab89bede02f8f5619398ea2e674e0b0fa3b0eb0902483045022100b39d9a58c2a3dfc4cb1f9e43a5d982d1d5aff4a067f1f99ba68faf573b30f828022071cd3269e50e27906e8a5b13eda4d94030f464cdf655e0cd18c525ea0109e0b10121027280f2dd25f184cbe65a5a0351fea20c7b24ceaf783e704e16ea815c417e8a270000000002000000000101e63dad084c4892e3f41403084375b492df1aa276d6312a0cb537ee538727ec6d1600000000ffffffff02d48402000000000017a914fead174b89883589ac04658e38988d3eb2313c2787362300000000000016001469cd7505026bb7029a6d8d0023786d4046cf367802483045022100f734e73dcc394a25282cb5ac9255c96183a3c3f1ed108002cc93fa32e7f3a73302200ba56f0d2335ceeee2849f269eed2c3885d5896fd51ee32b1142d790390836e80121023678834ce3cb58c21205e1405bde252b8ceb3d11f3b65dbbabb7085c16d5c69700000000020000000001016b5ac787c5ba836609e9bd255f06f8aa69115be1fc75d6f23909b38c0e0e03652500000000ffffffff025a6304000000000017a9147d226fc21abd7709f70cf391ac3da84edb6819a487d731000000000000160014069b91afc3284d971c1dd87e0e5514e74934227802483045022100cd82df223d63bb329cd98af5a0f7acd7b51f8c817cc00b08220d1229f1babf9702200a8985ded3798c6abbd6b79df72025094bc8dd39210401011808ca2e0debe1bd012103399e9d0f07bbb14cb5c1de111cd84d3417683edb4bb82fc5c02be4e96052ec4e0000000002000000000101abb33279e9d6671f8729f150258796a1ceb8386fc779944961f6e91b33de8df23100000000ffffffff02f07e0e000000000017a914e80d9c9ced8fd647c25900718aac5cada2c2d4708757f807000000000016001481f490776d8fdb55ba6c174a37b067431b4adb8302483045022100ac0f814a90e5d458cbb63b27c3f55338be7a9b964f5b1fe9687a1381c97209900220214f39173459c458a035dfd0b63427ffbff1091903bb78e486cc383dcbb36fc1012103f42404123ab1ffbcf1d0263411bb0b2c6c787dff28cb9be521685691818f896c00000000020000000001017bc406cf4388d6ec4f68fdae203698608fce7ecb21adb81f1bfa62c8e235f1430100000000ffffffff0268dc10000000000017a914fafca0a3039ce9a227e2908f43279774f5770d4187f14c0d0000000000160014984916ec495b93a9a2a872179e37e45eaa39a8900247304402204b5d40d39091245e627e976d5991c1d92a99f47514439d51e9251145270e3177022077de53670a5f039944d3214f8b2d4b06d72e305322b7f99b026806747eed2acb012103a701bbfc25b57f7e3cef5ccd2c1bd107989480c98433f7121a46b2e2e38321e200000000020000000001016f74018e8a6940783323866f222d8eb9aa71ef7ec46559d0a2894da87d5ec1f41500000000ffffffff02527b0d000000000017a9143fa11a035b90e7af47d05fde10792f94ee045a9f870e3c0700000000001600143295821ebb03420bd8800ca24cd8672ac9160f320247304402205e8f23ece5a0c5632972adad04f5540e396ee58b24e6ff023744b51693e1e027022044487c94ffa934626cc9bbbaf28f6d0dccfdb3827d87bade4b9b7d7b775d2861012102a02c5008ebaa1bbdde320ec25b6cfc52dacbbddc6089a1ce6df241b69d08e8c9000000000200000000010136e0507adf75b3e2ce0b963e1cf5d9298b8c5d1e98caf498e000a6ceb68329770000000000ffffffff0250b150010000000017a914b25d3b6c763c85f4cdac66fe6d0b48db0a9f4773873a53a4020000000016001412261eb8badaa5c6400f7fb01b0581199da4980c024830450221009b240b00030235a8a1f7514d86dec0626394885524f34f8ef972c6f0f9ed420402206395c3c7759099b8800f9bc5fc3b394962a9b88051c30b4222802a69f2fd99340121032db0eb6d06212f3b07b7ae0cfcf0fcb410580b3b48785bed4c5dc858c5539dd90000000002000000000101661e4471ad6a21cfc20bd5907632458ed48cbac5e47916db532cdfa67ebbd2445400000000ffffffff021a3c00000000000017a9142abdf99bae6805cf0e54f332290c5db05ba57aef87a00e000000000000160014e271d36929d44c87f0a5d344ef2899da04dffa610247304402203f899c21025210e753329c3bdf93fe22769e137b8cbb8e234a9cb5384942d7db022063450084a882894c191c27d474161ade8477796a65c3bd6101cc3bed64d71d4d0121025fdd30c38fba9d3e964579649b88aabb31c96e29558dd150d3481294c34bf6230000000002000000000101801c2dbc77fe206f43c3ef150b1c2c502ce0965366ea2d7af1f68bc674e9f0d30100000000ffffffff0251e50d000000000017a914be5fae206d7353065097ccd0d71e339fa022f4038799ab270000000000160014b4b6725a6e5cb0bf3d4186c0a15b778b1e9e300502483045022100b0b0ac5940da7a02f053d49d580c9b6f894c85f8ac1a307ebfaa5990e57212fe022013c6128a3f1e4a6d06e8cd6ef1a94cb454963a28744c8b135ae039d284d0e060012103c3d5b4dc995c6203070f25161f4ea895e4f6e146e2afab6000e3a1dc0a0a8fc500000000020000000001017deb5be7f9d8d7e9c00fead8caee340a47e59ea52ab6a9bddd4bbf725d028aca0100000000ffffffff02368100000000000017a9148e6c62c1b55f2d3df51a1366be89f33e31d3d20e8797ba0000000000001600149a58438d7231de126caefec9b918e0f034f8d8870247304402207deb68b52599b2ca0694408dfa64972308dd8f3cf4be76de510d98d831b97070022064c0cec3e212fc810a9d5a1666c2c4e46fec4bdcc435131e6556e90cd181e505012102357e1fd4bcbb4931f780efb09365529a3d30117a0ab535634d8b686aa5176348000000000200000000010146369ec9bcebc7394213dd08a7d71f816515e5ef1dc3f8ec69828127445fc3360100000000ffffffff028b3343000000000017a914e75050505b7ace8186ea488a7d030d792682adba876a1d2e040000000016001438cd564805b641b242abf1fa0884d8eaa7eb790a0247304402202890b06d58b8de3756340fe27f3d5adba776a3405d96d89d21cab0f7041c6dc5022000d40336aa96af0c3299144d2e450bab09661f2414422ac92e91df8f858eba9d012103e50cfabced248575cde0f950f284832e903fec4725e3fd38cec8a916d193283d0000000002000000000101bc50b8811a279ff9e826f1037ebf9e206dcb04bd918d697d8cb0fa76fd17a7bc0000000000ffffffff029ebf00000000000017a9146552926868801f7c445751c60a6b3012905145ed8747050000000000001600145bb66ea65c0231cd069ca00864c3f72f4edc9e5f02483045022100b17e81ed1fa45f3d92712f3e4206437dd957d247b05ef615f01b8277d09bd7e70220231dd5ff149863b13226c31fb583ec70aaec6193cda5aafa902bc756e3bb098301210263bd2779cb19297817a1499865f377a5cd94b5ed4bf586fcd28b9ddc8c54753300000000020000000001018b2d32effadc7758e5c93992df7d7b041767d854333d07be7304662f443a02470c00000000ffffffff02165606000000000017a914bf758bedeadb7337769482004ff17b3005d04d1e873c13000000000000160014661f68f68285d520d32e31108c8ee4360d2614a20247304402205235fbe4af8be0be0bcd072148a1eeb6d0c1ec8f82ddb08da89b61077b8a2afb02205ea09d328e0708a0803b61f8ef59ff886681e6bd6d25f5b015d6e3b46125351701210393e11ea03bae6a0773a6ebf996caf7a304df4b685e5da09826cbe8a83926a07200000000020000000001013799d903b4bcef55b30fb7b1efc0560d1d9ec3ee86f6140b5e3fb70f96fa0d900000000000ffffffff02cc0201000000000017a914ceb612e99a5d4dd4379007bac772d54cbddb5fd087b9700000000000001600140cd2655099eed9469754f5be5fc411b2d5acdb69024730440220010396c56b90716ede7c6c2c262c9ead309105111d96c678ee646baf602c16a8022072459e6a2267476faa4de4eb341c4c229b104f4cbf7131220d1547f9def42ebb01210269a2a58ca06f3837c53ee5b3b5bfbe9d2d98ed6b527a0d08df0c3937c8ad8c0e00000000020000000001010dd38db01b14bc243c49f5a0e2919a4da13fb5afdefdf54dd16ec75b24624f591f00000000ffffffff029c7c0d000000000017a914d6487d354acc962ce5d579ee9a27ce889ecefe8e87ca28000000000000160014e1a60072cd94fc79d8ceffd606fb5ea5c0b02c2e02483045022100d5a54416c330dd144ad534bedd435aac7134421f02362f502ad5c36af8ab3ed50220411562d97332c64da953a2f3e3a2c1a1ed5b2a74598b9df0b471d7f483dbc1b6012103be5fbc4d59dd47cfc582db28b31489c231f2d9ddf50e524670140b97237e3cdc00000000020000000001016afcb122ad51c47fe364f39e6d4bf41e8bafb009ff849cf07028813ac441f8570100000000ffffffff028d5f00000000000017a9148f8a1021a4238b014ded770518c31b16ce5206f087820a0000000000001600141ac34245c1449daf2b0f6275c6ac9ad4b79feb450247304402205d1aae0bd158e21d629b3200e9ff082742de92301e53c12e5f8f0301d6fce85e02202896a9acbc94748d8d7fe1c2a654899a3158bc04257680ca63bdaddd5c2db1b0012103fd15fd8b4aa68629373dda9981a45b940ba6e6e805e5bcf26545c62f871137710000000002000000000101fda081c31a34e6ad332a71738ba68b30bf49776d533db59b91abf465fafedeff0100000000ffffffff02178502000000000017a91411f19b105a3065716036311ce973d7b1d694e23a874a300a000000000016001404f3a4566d2ba4feff02f93468c6eb58ce26df6002483045022100c37151f4cf433de5d9fba8ed43bed99f5a9a67aa605a808ef939e4e5e82dfdfd022056330a42e52ec25d5bc510be1e28bc14d6d66db79a73c66962bfb91340c1260001210212fbdb55baf4535b2df85c790b0283c51fc44fb0af240bcd824b2e06dc37ee2b0000000002000000000101c4f6bae64ef2520893399c4804ec444fcd2f1aeb80e4076bf868aa051cf20dd40100000000ffffffff02501d00000000000017a914b4828c5bf1e81738f1dba08fb3d9cf981dd3fc2b87ba03000000000000160014e825b4b7a4b670e8632174eed6d40f4ebc0368f402473044022040dd18ff3d2cc37af8ba2f3e88bfd25e792b39e85092362a718cc325266e8d5302204d45cbc268e5e416b92e37a8ba0a9e1d253d5c44a430ff4211479cd91feb152e01210207f577aa463510ace9732caede2ef6fc0aff37889cb165934cac7182e9f703240000000001000000000101b921ff224f6b375525d5b21952eca3665548103385c18901722c8eb8a3a3c4870700000000ffffffff01f88905000000000017a9148f7fdaf3d7f79ac3c6ab9e4646e4767b58bcd4ae8702483045022100962224b53031cd006c521173f97960e4652c6cfc39c3ca22657388af46614e1b02201b4fba0cf2312698f3ffa33950366de3d78f1db596da1aff2db6c036964d55c40121035a9fbe5ab23a5e764f682ba82540532a007e03814b4b7cc5cb26372a992f32f400000000020000000001017b01e28c86824afe2e58d988f3b1d22963baf7fbafcceebe19d56a30cadb5f5e0100000000ffffffff0296ae0100000000001976a9147f5113be94d804a571026ffeff0f1797713ad37688ac6eb91c000000000016001407754d27b807e85f0c425f4fc7f7872794aad63b02483045022100cb9a3a992533a62d055c7a84cbb99211e24cfead9a669681635958371d6eb2d9022041c094a95e248c07c07f050d6c2c95c1da86331a27d52753fdb4d2daea2c8d7c012102c646e6ad75143e3d27b47af9d001e08dee20930525696599f9773ddcf0b719970000000002000000000101844322728151a36133246f9cb64328d7711422e35b3cded53eb5fd0707ced9c70000000000ffffffff02ffc10800000000001976a914349e6b215984f8c0ec4bfe3c6fca290691e55cc688accdc100000000000016001430aa87001a9ac4d5c35566e1fd9161d710e05e2202473044022053b71b14bd3b05b6cfb5218dae21e2c9ef968974624cf1f1ebd2705dc2df6ad502201f469ca2cb5f9573f6742f0277f20889c50749a368abeae1999eaefdebd42151012103e8560d614cc193768b09a3b48f7f71db921d32f9fbe522fd27ba2c062bc0755d0000000002000000000101be021c4fff8b6f3c2602a2af6c45bf6b8027ac49a579be4ea2db5b80a663b23a0100000000ffffffff022790ba00000000001976a914d4dacb4f14d9bb347d263b0abef66da693028a6388ac0fe56700000000001600140f55885024dd20c6f2dc3254cf9b5e9c66fb93d002483045022100a7b6c70e19b76ac2285f5700c0167517e462f76c904aff9e1800dd2799b044990220420c5e9fad934909ba4377899cb6c23fabd8157ef5d613de733739bde67f419d01210292f1bde034f0cb742cb24c3d17e2debe4594aa58d53c22f94725ce54265aa5a400000000020000000001019de1af84cc811fc85f4db151e5427709401daa49a00c822fb0595d42eaf0d0450100000000ffffffff025cb20100000000001976a914d3184c1dbd75a2d4d81e6bb2f1889fb632b59af588ace3210a000000000016001441d693f9dff60e6eed2842c337c0a03bb60a7e4c0247304402207415a21dc3f6253fa9ff29478a447a767928eefac6b3aaea6539f1593b1f46c40220754d77c58358ead350fcff08acc2eeca73460ffde78593ad9b79a66f553047a60121036029bface97a665379cd2ae1b5a4b5e55358d54eb0fd64eca808ea5a54d01bb0000000000200000000010168eecad80be5b8549b2428156308576dab70d9d16074019e3e34969c163ca4d30100000000ffffffff0207da0100000000001976a9145f69d1cf08cf5bd9e7d3773d7063da88c6f7007688ac6c94750000000000160014f151177ed5daf6250e60a6f16347398ae6ea2c5b0247304402205bd2da3e6eac824e1c6afaff757586c07de606f8447ce36e015f8f7e134348ac022026e13f5c596c29ade65ea7761087d772021daa89df92eded843eb956e68e3c7f012103009e964687f01b6e283f0542f02d34df298f5dca371e75ea4da6d574292ad5d60000000002000000000101d4b279d924043aab0e5eade28f24228f696c4b22377ea71be4f9c81787a620aa0100000000ffffffff0218140100000000001976a9144ad2c95e6a829474d1cdaa3f66b6ece1c477d98c88acc98e00000000000016001462108cf719b779d1af618d2d70314069f2f1b62702483045022100f9b116c6a46d4c30b1669ba656bb7effbae2203b6c3c0fc32538c54bb82e7a24022044b262a7c7b4bc308247c08cd518b6f52a763a77cea0193ef6c948160e3e03e7012103e45ffafb017c150bdbc9875a63ec61a06775c6c0317ba7b1ce56c5b26efbaff80000000002000000000101a462488c7f828da11e820234fc5a7267a34be672ca211ea170250ffb7c1bdf1e0100000000ffffffff02c1260000000000001976a914d75e9dd05ca300bb9631000ba1748b2488a21f6c88ac28470100000000001600141f30d243b4597242545183112be4c96171f53ce902483045022100c22e970cc903edd031e627b86a381d03daa92793726bb2b734c31a34851527dc022030b4a8730728cf64e6c6b6fc56d9009aea9801424c0893f09ef8b92da09fa96b012102c00b56a630f65ede946211c5d781117c17d5db36c4a4374526e988e7ab20d8fc00000000020000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d43700000000ffffffff0298640200000000001976a914ad3b00cda70e6af6468c1854d25f1b42b662195e88acf608000000000000160014deca1f8addd29d37f1c5a61f371b921bb5202f7f0247304402205949e77a943e36a97c8d412b898cbf42ca5ebe3883765da8c91467c2d3c80cda02204802f79ec30402561a78b61477fe6b193784a6c7cab1a36386a543854777c485012103eb7585a80c7a39df0c4745ae99330fa9352cbfd4b626b811729fbbbd4378c9080000000002000000000101b26fd25e8dc72feafa9ebcd6e127ab655038a9853303f37359a062c01de5789a0100000000ffffffff0275270300000000001976a914fe4ec5a97e32f1f9b4144a12948310d63198f3b888ac6dae000000000000160014e79ec28f3aacbb56d88e5320411dccdb1dc6a38302483045022100a419cf40b825a42e7c4d6ad0d3e6ece9707a0adf3c2417162cb60d3d975e05aa02202ff39516e9c076dd765938ae8b4d75c96fae411dc16950e8937cd952b2e74627012103bbcc3a5bcb7471da9b113913f19e78eb39121ae5df107fd8937350b4c948a8da00000000020000000001019ee4fa18d738778dee052235a54f98063fcfd965042c4019aa48fc10b923a0c90100000000ffffffff0270b01700000000001976a9148d145383cc2c6beabe57d10411f608220f443f9388ac485e100000000000160014a3ba1ed9de058b0baaafd7e538208407c5155e7302473044022022e95c8b5afb52a74a5400375f54fb97be11f38f477b5969e21ec3b903f793ee02205be36a5734a8138f0c1c9a30f1458b418ca1ac86c0e685e1c626d6b5ed5fa217012103e7a62e58e1b2b5eb4c348a493738546138ba9489192ffcc1de5bfaf9194a2dab000000000200000000010270be73a1cbc4d9ad8cb158462f09fd4b4f4e2cc462584727c35a0ce2459145ba1800000000ffffffff2d184bc15fd1e964d30335cfa85d4db664dfdf1af38f61bf6877c2ec156db7fb1600000000ffffffff02458a320000000000160014471627f17dae35a5a297260874675220929252ec466e000000000000160014467e8d9f8b293eaaa998322fffeb1ec9084bc38802483045022100d09c9cd307e835722567b150c3fec1ef7bfec17cadd29f664a06ff731455feff02207fb8dd1c42f107882d331c2d73ad769e41e5e43798b55e50be516b6ebeb30a4801210237fda9c675908b999ef3ff8de9cb79265bcc3c249c66f6b1116116189520929102473044022044bf41a83ca04a876ebbc881cf45d98368ebec9be8873cfa178b9f13425b3d7e02206c3aa96a6e8588fc08b6a8e8c1fa6810d7b3118bb9ce262cc9d94d37a4fd369e012102e35fd057ba9e6cee8053c0f35eaaeb4b752615899cea52f0a0e242078cad33f3000000000200000000010104415edb86c438f6e1a428d49d3e93a414652d6c0c8815acb007f08e2f7b44e70100000000ffffffff022856000000000000160014471627f17dae35a5a297260874675220929252ecbe14000000000000160014d298046b95e94a7130f22eb8d08627cf848523bd02483045022100eefad72e7ff65def0b1123898fd959e592408b977635d843c1f26f4d5d524cf70220145b3fa8987f401e0928b3bf5cefa83593bf2845770923065208708b599d6a72012103401fb83248d965b618b51393d7050dba890546b1387410f92dad0f264411e9fc000000000200000000010191e22a8e212236f95cd8249ca3a6bd9faa7f8ac8379ad101cc8ec96b9a8adc4d0100000000fdffffff025a540000000000001976a9149d6558342235e51b0a36e730aa669c2a0eaacbcb88ac0589060000000000160014989b5ab3a6bb8c00992db8cbdc5001b51b0d2d340247304402202ebd08472864d99dbe02ea8667683d0e611afbdaa86fbadde0b6666c2aa219ee022033ab756e2c3c9d0d1d3ee846ed071cba636a536d38ce229c049fccb97721018801210381352ecf1a49deb4d41a900a3159889bed2d060cb55a8280f345bf7e24d0b06248a00a00010000000001019444971d93f2cf791e799af3ca760ae10adff383167c65ac260c7edee930a6d41d000000171600148a6303d468213a72f23914a505bc3e75b32b103bffffffff01a8b80600000000001976a914542b949963e00788ab4d2a81ac89fb51b531179888ac02483045022100d256e27ca94b6202e1a4f1cb713ac1f20ea17105ab811eec33d75721b87d801d02203e0260731e6dd898e1007c5dbdaa8e8bdac45100b0a0ec4ffdc13a55902c2c60012103d4ccff23892f0eec8b3aae546ec38951bb9d4cf39b57fa6e0ea524fee776e92700000000020000000001024b672c6b154aa542f6dad7c4091e827e8ef47ff792e37cd35f8ec903b523a67506000000171600140e5186b1d7d78cd1e4e93df16281c096434d99feffffffff9d2418001948a2a0b7f7fcb44a3cc73a031616ce1d2dc3b7dd4543d1c3358154170000001716001424a74e5b19bc6a34f91976862164e00fe21de53dffffffff0240420f000000000017a914b98998edda0acf62bf7a0432294dfe828006e2088711540f000000000017a914caf61d6ea8ecc0e7abaa5fab3cccd67cf805a10f870247304402206fe4563dd97c7c70cde7016b11c53ebaef0209ce98ee3f80f11e4cca48a167b102201f34811dd8a0c4cc5a3ff40fa76e9435efddf9ca29d558edab93599996b757ab0121021b9511f40db2ac204c2230c98f020f9b4e433e9e27a6dcb0afb7f4ebc26ecfbe024730440220603a92c084e7635717ea5ad7b17c2a7b2a620eee91076437036b31aa3f2a7fe502202c068359748ac86acbcc1e56d5e3656137be6f71bc72b88f1527a264015e13bc012102f945abcdbed15757301e9496e32b3ee6cf8f17bb20d34578bedb1b26342aa3b40000000001000000000102adbb1780ea3dd67ad8ee4d0625ce50dbc0c257784d268480ef105248f025ca2e01000000171600149a95ce3c74016c25b35d80f2be176d34e7846867ffffffff6caed9fd22ace36372c61a4d3f7e3fd7f0bc3daa5596037148665524974048cc01000000171600143c2dbdc09a3ca1d84665ca8ef7322b718346da0affffffff026c2300000000000017a9147283f3f8b511cf4cfc0fa835d3ffe61b6885f684878b0201000000000017a914b32858a3b5bb28aacf87aa877c94ee78aed0d6c9870247304402200168a090e98171c16c0464ba16d3c1ef8436962d8f4cc0ec9b562a188ea5417002206c8334679f7070790d4f66f901bb96433b1bdabefcc0a944b1da86641d0bb0ba012103f5e4757510a0f65592685c477fcedf011f3141b4cffd474abb3803eac4270ed302483045022100e99f9b0807d2f10673d0d0f4b20b5c7e316b1b4f486b7740ecde5e9c65498ede02206dc1ecd5487165874b7bedfa01fdde33f8c0c4067a631139a027b7a649307ae5012102d9622456c5a7ad25f0b24477fe4267aba313f0330f0a00c2a248a7481597b3a700000000020000000001054a20876f68ee344b15a86b48eea4e1395f804736d508602191c95abb56686e07c500000000ffffffffade3a13d934074f6a932d4758c524ea2812e7d104b8d85a3d06fcc522e8811895b00000000ffffffff81f097d31a00520bb15577c1edde4da4edc679e0872e839f300162d1931b37792301000000ffffffff18557735eccde13b3c31135c42a0cecb1619a08e22d3c3f024bb9bdd0e52ebcd3a00000000ffffffff0dd8926c71bc7174cafd41c4fbd3cf0d1ac690c20fe8488ed12bc3a7c6aa4ae4bd00000000ffffffff02d45e0300000000001976a9149cdba499451db4830cf0e7da00a515418f688c4888aca5a7000000000000160014748aec84c2c2d62eb71aa094808702f13055ea8102483045022100be8a66bc7dc78497af5748e53ece845be5bc5071be36425c8add7dd6f7954188022079304d40e14a74ca897638a67a7d12eb2ee8a66ab633302e63677ee28afc575f0121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca11502473044022057f8086c4f7b03e61a82e0f97018aa9ec2ed1c7c148d00098cc154fc20bc830a0220648229717fe340bb3a356c97dcd6aff9e699e59e959fe75da104215dffdd87110121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca115024830450221008d26eb18520579d826d5d84c3495ffd26eeba13d526cda370b1e2b78d4cc881602205ee7ecb3ce8ba6dee974e3a783d0745b1161886fdaf00209aeaa51c02ec187bf0121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca1150247304402207f3e1e409b048bb698dd52cfc9dc8ea9d5e20ec7ae08124eff827a082c2fd977022009145eb08c1f46b2fa6c561634211a6364004bd7f8a546ff0cccb7e90a2c17a10121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca11502473044022014126d1d4c06deac6c63bed0b5538a82b0be5d696bdbea21fb9adf629d6790d3022018ca827f60c6672f80eb5ab428cc13c09353539e9c347f467e9614f88807a7010121030598b5e9697ec3de1f27ca0b21f5b45fc302014309913e41cdbbe843ad9ca1150000000002000000017b6b291c690262d0656530ad25c376790c62e05fe286b8b56bc6ebf72c5d07f7000000006a473044022037aedf13be13f5e4e09973b2678035dd36c4ca70aa187e0c46fc7d6877becf69022067894746e2ae9c4f62e542c15e0d0f1b61cd39c206aa71b334ce93552def403b012103c3eb615f9e354237471d53f47f30f151588f59fc62c6ceaf19e21811605e5e66ffffffff02ee4243000000000017a914a62232977ce1b7ac66e94d70477aae287f9b8795873a920f000000000016001455ab28891572627ad9a60b1d5d9b42a744c34125000000000200000000010162b63444ad0ee84400321f3c70ea62c00e5a1c7e5c86e8d3812ef73b650f21a80100000000ffffffff025cbc0600000000001976a914f5aabfe98246b909a214971fe9072bf42de640fa88ac6cd2080000000000160014d56fad0ff8b83195b47671754f096ad70bbe817802483045022100957890b95282d46522e586b0268c3aa379129b06dce626f2de725d83c8257a69022061d77f360dc71ee1a96de99a42839fa9f19cd3a07b869dc9b4b104f211066e2c012103bcff404fb9bbc11302a410ed733a28eb3817d49d672cfe68115666c619527869000000000200000000010223821ed78ffa205490d8c5a9f766b0c7c05b79ef8dbed610b443223a6e6f8a261400000000ffffffff61b2512bf39d776e30b3f51312a7e5ffae23d24ed8d89edffee87e454e1a8a680700000000ffffffff0220cd080000000000160014f45eac30ebe6579dc700542b34d653683abcc6493259010000000000160014c375590807e7d72817d93fb4c21fda3ca8a2200b024830450221009b8e0d3a98fd5c6c4c3607083ebe8189709f884263bd10918ca1c39b43a4e2850220619dd5fea15a3d08390c1a15465de1a7e2683f5f1ac81727ba520a24114fd6790121031d49cfa741310d85a563e7b3e5fac421a00974981d85356b9f8f9644034394c302483045022100cbd0ffef5b2ea7f518df103cedf8a2c3f962fec02a934cba0842fe5338fee18d02202684f9bcbf3de485eb26ace36b7c5b0fd0d86495ac325bb954241dcb1bbc102b0121020a9f796ba22c90f0ba6d1bfd9fef6e7897d6ede2ade461192c39b105931d6e67000000000100000000010201edc1edf6e98ca52b745f929e180220e7121cd25a3c5e6c408e68ba4a8792c0010000000000000000c6a6470447b310f8bd3081847a72ff7ce868ac92e4b7b1fbcd34e49c38939d0c01000000000000000002b0f44f010000000017a914e4e33a0b508ca788273fe5b9a1759c2ad924fd9f87e711110100000000160014b0406726c4ba289fbf2c0d9c143831553c384a47024730440220347989f89002513322045cd41cd091f4d2ed3cf6a1f43f81fc9d8f52a8e3ee3802203bc968a395cc1aa762851388c32047c92a657acd28e1591d59725b68918156580121036c15ec11018ad519161ae77e67e070588d77babd000efd23679f798bac8b7859024830450221008b27fd07d16ad4b14a4dfddea0fded87fead8b849d7240a1d1c8319367baa11302201465298cb31c5bbae108380b10d67f11a4ee3c73e3b49ea50a8b3a4e8ab20468012103d792a86ede3054f815ce80cc97c8ec5a0effd5023384ca9299491a60fa22698e0000000002000000000102de3a363247ac6b449f2d400c4218df61531eefa70d6ce108fd3fea66e3d50c420400000000ffffffff13aaeafb63fd9f23b346cc145b22c72c4d79105dc1df1ec2158716712777a8b10100000000ffffffff02545406000000000017a91433e72152fc9feaf069d42fed35b8fe2b9a5d594987aa29000000000000160014aaa5fae7e648cb17384e36179f203081b57583eb02483045022100dd775f58ce79c8c4240426665320b01cac009ecfe87f87f24202f7f4b194f35e02206091411a48ccf18d5c86c41751e2dd45298151c4b1fa630c2f454538146fd569012103b13f734bb6b2c4625ddb9ff70e4fced27b591a9c3f4b371e251772f281c6e87a02483045022100f2baa91fdae17c1550e83e3964729786f1c19ffda9739f0e20d9d9164238a4cd02205d644635959279c3d90dad14ad58c922fd3af661a5ebd51f6dd2a2a7085f95c501210371580f0ce398fdfa8f996e18b58b9c86ce96dbfdf8faebf5f86748b1f72d326e000000000100000000010263c684a04a3ce9b84f68ea1053a176a60b9e687ab547652788d731a51f484bc90900000000000000002117ba251d88a449cd3ec2ec0ee38d0c0bccd3195e645fd619ef3898b040c98d06000000000000000002160a00000000000017a91415b8f5bb7a4d75b4d8b348e504179d8d5f5b54ee8701b4030000000000160014eaa206a180572d7e3b078f12058c26191c761b66024730440220579b5169d710b8f061ee2addddc6f2c58753df30acde35df04c569e715aed9f702207ed196da108f2fa8b409194041e038d4c8737b839734df696434cff74451d7830121031a518aaca4edc3cb9ae0f834671fd1e66c78cfe78af1fcf694979f7a80ab624b02483045022100c13ce7722b9d8a8a4421ffd1af07b4944d321156bb76e874d3cec6164a94ecb20220457a8d7552671e04a7b694cbe6aab1f6316e42e1ecd9f1c2d315b5bc748cca950121033ca9d0446a8a7e2b3ede63257edb4a566b4b4488d4796df0d729970c2696847d00000000010000000001025eec900f6697eb8daa60a9fb8f753e0afa4f41a096409d6218943862430cf4002800000000ffffffffc86aee7ad75cadc8d8fa4b65b2bf645d76be2347ee935e73231f959100791d543000000000ffffffff02d01213000000000017a914874d11399275a5d7ba8976162535545028c599e187db63000000000000160014ed24f578a5ffb0a13a5509e1cde08c863e6ff3420247304402202ac4da13b9bac56593d5e914a8307e6e387411e7218fced7e3ccfc1f230fcf3102201f99298d2b70505bc8a49ba2d360d8b833232d349c72f40c21ad24d694d1f2590121032b86e97c48a8b32374c2189a0734198e142e6cb0da4f3c2353af1037dcba396502483045022100884b9b1c09431cbd008fb5df2b7dbfacf99a332ed000840d7b62ca32bc5f4f940220350d3f4d2c2c1c25a3508169a9fc9b4591316e3476b00d2fe3b7839a1d2888b20121026ff4a8f91c3086ef0beb781bacf60de6c9b86a22c6b347045ed395c01d2b4c7a00000000020000000001020f66d64f1097525503b9277282459e7adaac251356e887440193a4f40dad12490e00000000ffffffffe6c70fb3d44e23e428194b2eb1e2445a813a8dd3a8d2c867475d4206056d2af83300000000ffffffff02281702000000000017a914bb3ccf35a3ae40c52e441a77f2507201c34c1dd787a4110000000000001600149f0eab32624b10551a9d36ac62d852efc159817f024830450221008f65c949cd6b13cf8f6be8d9a449682f191edf703ae87f8c4be39987587e05730220285e03973e8262c3253c496175845fd750775d6afa9dd16272a1fff891b7ba4f0121033e810f0fdc6315b4d7ff19c2bccc91565f7ce84770cf13c3c2a3215ba8ac4f8302483045022100bc2375126d9dc65f7a9fe789a65f7f91672650ca7a572e99618ecfa6c6d00961022024a77f1080cd73257bb427eddffec9801d728392d7bccad81a9c16d6f8b80c460121033e810f0fdc6315b4d7ff19c2bccc91565f7ce84770cf13c3c2a3215ba8ac4f830000000002000000000102d4803189558941ccde0c063507d2b16d2d4b40666801015f6b20419e0ef933be0900000000ffffffffc1644187c9c08f350d8a4f939a50394f9e5c8cb62beee7002c202c42c9bbafe62b00000000ffffffff02293801000000000017a914c80f15c368b01579cf65491ee8586aac61edb40687a1480000000000001600141d5d0f0fee39b0a21716ba536cafcda12becd6e00248304502210096f022a568e6f23692139b245168d9643f520e02a7bc2f28e129cc3c7a1ce58302205425a9c67d2408e062adddaec995302d7f6cb549dd1c9af4723f59a2f7a1536401210222536414df97862ff2b6c4a98d66c0e7c84fecf0c54360dba35e5607a49c12bd024830450221009b2a9a4ab87884b09a49fc425343b864ce5b7391c8a53ab973af08f585ee146d02200b55e416708b09e7063644b0f8616bb9b9f793aba0e779e4448ec4b45857492a01210222536414df97862ff2b6c4a98d66c0e7c84fecf0c54360dba35e5607a49c12bd00000000010000000001023b745b1a47578cbde33050aae62f44101ce899ec8d514626e95fa177b8bb162c3900000000000000002e9537534313d6f2e205cd7e982822a2bfe8dae7d5ef91cf02c0bcfd4a05a2a81400000000000000000280f0fa020000000017a9143e6c9eaa4ccb9c9f1a959566984a83b8c989083c87daa89c01000000001600145672555a58d5c05a9213919bb30997bea1aa8a0b0247304402201290878d64d8c6eea4c9bebb89f7a6247ff751a4672018aeefc37d9e0c82936c0220672e1919ff83900b6e2274e8b552020361d9d9e9836d57590bc0d1aa968c3b1d012102592d3028714785314ec84a8a64854a1cccdc48c42a67704af37b9bee48a048a502483045022100ec24d20d1b85cdc5ca8358e715f77fde56fccc405d06632b543c29ec71ea940502200ad500c7bfcfc6be53cff6c2c04e27c94e65ab489a04cacc41be68282907337f012102592d3028714785314ec84a8a64854a1cccdc48c42a67704af37b9bee48a048a5000000000200000000010273292f2a2284c621693e9f8131e42c874b2bc493408860ccb2900b6a6de535f50100000000ffffffff2c1ad7f252739bee2568b0f2b0b5ce66c68742d7c39b69ed176b3f9a3b0fe08d0100000000ffffffff020f6843000000000017a9143108f597cc4491be2e0b2bb02a7b1b52af05121e871d1e2b0000000000160014af2e2b4aee628f313c8b3cf94e16e1e77975c18c02483045022100e9c0a883fc10929b1a9639dd31d281b1b93b0b41684ec6dcb92881d432fe7c35022063bbeacbda126623d392b4a3d789ac266b4c007d580cc1eafb8ad0467febca3a012103f569c052df97653dbddf3632879bc1374ebd745497d2050889d1750d7f0a790b02473044022033fd903e26dac69ad51a770e70ff04dc23d98344ad382548b36c468112863b0002202c4153f1a41ba67ad9d6bbac6c726a1cab0d2c443569c610cd795e37903aee510121034be25e8038d712434d8c2ce2dea07f90fe2426d705e31fa7e7ae486833e5367c0000000002000000000102313b2106a4e5af4987b3905a0426952409e831d9305444596c059c6446f0a9a20300000000ffffffffe2f0f1c1f341f1459afba9076efe8de94e3f04e4637e0da3512e2ae3b4cbe2240100000000ffffffff02ded91400000000001976a914ee213968071430af94f94716822eb98c8954d6d888ac76700000000000001600147072fdacbbaa0b4bb684397846b3c2a27b44f3b902483045022100e7db45508543f575a0a26c7a7c0f5e658f6a2726028130f68faa3ba626660c0202205e6a5c204011382b1b3353167bad00294011fa5abe2e9c331fbb32349011dbb40121022b0132337c47fd5f023473ef4648292c90c0374196e7176590fbbd109d6af7810247304402200d8cea18405ff679c30e65e613abe82f84f3df41cee6902e9bc2f2760fb9adbd0220120132eceffa30622b7e0140c6749e63d4621725d77987cededbcc7047c8d999012103049dcd223ca305708f1b6f6ba83e34e5de67d3f7fe5180d6dde988e36d1c616f00000000020000000001025e5f71052043b32abb0d5e846a0ccb859aa9298172155cccfaaa197cd3b346150100000000ffffffff63fbf8a5c3bf529b23846cee81f60758d4e3d70bb56b6b662644fb5f42434fd61500000000ffffffff020d8b2100000000001976a914fc9d1cdd6f45196ba22dc026cc5860a70cfb3e3788ac0bcf100000000000160014606500158f597e2f7e1825db550cfe2a0626259702483045022100afcf5461dfec5f307709e47b72e31d00c90f65534c9c47ff3f5b5f2fcfa066ff022071ef6a3789adde22f1d64c0a6d6dc3ca6b993d6d9910bdd94258cc7d6372ef1b0121036042153b7eca5927673a37fdb9058df20ce0d90f4e823e75d215633e5e0c9a7502473044022022a6e931c2bc3e2c3200b5ab812d82864328505558ab3c92e736eb891669819002204d7b62bbf9583be1361787d10e5888f932e873b407976d8879e429c07cdbb7aa0121028c2a2a47751055e9cb868b416b902444c57bae587aaf4450d95efd9cbafde8150000000002000000000102a3ccfde30843adbf582314e5c513d4331b4ee666a076f4f7e64bb554bde1ba3c1e00000000ffffffffb76479970ab84d7e6230588d665cf3b61dcaecb2828291399a52968a41d9eeed1200000000ffffffff02bfd71400000000001976a91446c1f69817227b388b9b30fed8c2abd317fe752988ac41140000000000001600142f8d04174f4e7c864d2796d5a3fc1772d6fd191602483045022100da994e2920bb2544cc4957c666e7a3a8de4d5f63b036a11ce1af5c4847982b5e02206a603703a4081b12d8dda2ca13991f50e4caa6c9792735cf83b886bdbf2589da012103bda5c002821a0e746a3bf3d74026a8c936317a98851852c820ed2efe90fdb9bb0247304402202bd9c5a4da2f7fbe46ec1bf18df85de64c78358dc5fdcf5daa592296345e8d6b022036ae87f47594679807ea2ddccef71a2f79b0a9c34a7bed7b0d199af467270e88012103c2743678b5bc2438cdc2292ed59f4a75e14aa63588be11c69ea4aa1cfa959fcb0000000002000000000102c32121cb8ad6e62ab8afc88700d3972a38a4b1033a1962af8d560413c158e2930100000000ffffffff6e01f2b81a7050d3e1423bcbbeec303418a2ea29b48184881d481a5db4ff13c80100000000ffffffff02beeb5200000000001976a91406e61a4f8601eeabd329deb2834ec9054fe5271588ac3ee509000000000016001401a5fc74518e69b4b399e40f1d0e085689bb002a02483045022100c502757c7b9a2dda228c92b550660080716083f1239fae7a6b74c6ebd9d446a602207d5e0615f47eae0d6ab91ffdda423c80db00f143868a47b50da4d4187776cb53012103c5147d8a840ac4b7defa4cf2cb1668df4411fc16016b1818b885dd1223eea4a102483045022100a2a9b2209a1b66a55e09f83157dcaf4f36c7537df1e142d3119a409397ca57b7022047828a10dc2831c9a606259a4d1b01691e9b564979fffc15cae348ce77e518c1012102ab83d5a67b08f8f784dee1190c059269b4c2c4c680c3971f9bca05334a6f105c0000000002000000000101805c5c5b55f40c27ef292b137d086958a25f958238171dfcf82c8294acdb32603b00000017160014a967cd389050a4836000860f387d5cd2e2577de9fdffffff018a1701000000000017a914318bbb0f7b28684c75da3b631a42c45cca22c1c78702483045022100967cc1d4c2f8c933ecef5b348454d87ae4b528050f8c686f13ef3db1beac53a5022022174ddbbf563a780f6468962b4c8489d51d2bfe710e3a17028cf58f668f600b012102c8d352f04f8969a0f0df4aea66f5775f8cc4d80ff25402a2432b9b02e732018e0000000001000000000101ecc244685f02303b8ea966080488fc18c95831fc96374e28f26c47d8afaa6a640200000000ffffffff454ed700000000000017a9149bb3cb05f9a493d05f14d6f49e861a91070d9c5387bc8faf230000000016001475aa5f410c9d7aa2348af3e06cd19350a92c4896c7b800000000000017a91458b903beddf7d13bf1b34c3a35e57bd61cc3cfb787695d03000000000017a9143534ddb8c3feedae8dd8bbfb133431219d58dfbe87e49401000000000017a914304c47c2e72cb8d6544caa68bc5bffd13b1690f48790b70000000000001976a91444019ecd39f9ef2f2fe78908cdadd692c298d67188accd1104000000000017a91455921c15cf3a7f92c22f12fbaf7a57f1359ef4b88714c600000000000017a9144757dc372b151c7753cf03c4370e5299d435f28f8702a000000000000017a914254441605b44775e8885a028c204a3944ff07ec08713ef0000000000001976a914f1e7274a519ada212d07b963618007a9be53723088aca6c500000000000017a91413245f7464147d9fa65ff9faba52a25891b55356875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7660df0300000000001976a914198602ec05a707b71d9fb406803f15a318a888a888ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd767b410f00000000001976a91466a359c82e9be93aec71eec5782b4ccd472cd3bb88ac36730000000000001976a9144a2a3d0f2e927ad42a389b630dd5235c9627ab3788ac9d950500000000001976a9142e2384b10245f3eb74ae93c9b9f02f052de09ea888ac243f8800000000001976a914f286afbf9bef4588325ae8fc7429ff29bb74cb2c88ac4b590000000000001976a91495b3b66224ae77ba7d9dbd0211d23c8555f2284e88ac17db0600000000001976a914b23764877a32a8bebb9feba5706c5aa87a632b7a88accbc800000000000017a91466e0b5f61518f6ac09d0bf109c6f79c4d8678d9f871ad70c000000000017a91457c360359f84c41dc3208dd5a285b8cf2590443687f7f84302000000001600142e4696cb4efd9af304eaa76d0ec04ae6268c8e35226006000000000017a91425c0338e8c3ff9cce70aa6886a1ba520f072b59c87476f0600000000001976a914b4eced7f0bb93d64cf86f5660bae35d12e3b71f888ac907e1e000000000017a9146b1583f2e2ac28f36c41d5499ffe2722219b5f5d877f9f0200000000001976a9144dfff70d7e1fe6deafc395b0c4df200e1636d4f888ac6bb700000000000017a914530f1cad5012571bba640fcf856252aac2d3d442879bae01000000000017a9142d77cf5c3ef3735f68765b5ea6ea96d7348c0b5287c5040200000000001976a914712161639d187d1549bc22865edf1c21fc6c5fcf88acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76e7300300000000001976a91421a0d23570ad006dcaf678c181f46e3bb24bb12488acc89b130000000000160014bd8d477690848320417415a5e776338d9c6df2618f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7656950d00000000001600145436a9ab04cbc8e30f6c2600429eb07152eee13dd95a0200000000001976a91422e90297995dcd8f4a4d679e04501962e72d35d088acaac900000000000017a914cb4e207df3a5d43aec90f1be4a14813472ba7d4087dcff000000000000160014de0678e3282540a049b8d430226aa5c6841a3b4a303f09000000000017a914de7a6a2498d607ccf45f516f2751791e7c92fe318713c507000000000017a9140b9717a3e0d835c197d284261ef952210db2e4af872b8602000000000017a9145715638ea74db96ef54a4f96084de4245987e739877b4d0c00000000001600147cb4c11ed27d8ee70508d0322b98979168d6f6503f391800000000001976a914724701a17895e2283fd775ee6ef4aa3d8a0be31e88ac26ac00000000000017a9141657e0d9a4fd44d209e35a66fa2fe7787bf0af3c8790d00300000000001976a9146fc6844ec42f1d7620b2b056d36a798e5f8d69a888ac674808000000000017a91403e99b78f6135d5b8bd1916ac74df7d9e7515d92875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76785d02000000000017a9140125a6f94cdf462d892a79beff157ae9e4b2b3398773a70100000000001976a914f5388f0878bddc3abc8afafb2764648dda00db5988acf01901000000000017a9145a584b44a911673d54fa0dfd15ba0d048e36e2f787f07603000000000017a914dcd36c19d5944a7dc9f7fcfab354cdc719df9f1787a8600300000000001976a9144e7a7c528f00617621e20e974bba2b08aa59ca1288acf654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd765d0a1b00000000001976a91461f64577254853065179f65a8a4404323015944588ac98b101000000000017a9145f5615d0349ec486703109a4f02a861d91ff558d87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76f88900000000000017a914b8f0f07b0869a59e593ca0e33b815b139ecbe88087f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7653670000000000001600146de8af29013b0c7a38904d09ae7b54a834c7322d8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ed4a020000000000160014102e98675fd45599596b87db04ebb234838803d40a200400000000001976a9141119246c8cfb0dd8b781993d603fa08dc44e9e1588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7618dc04000000000017a914bbda74567a21c53c457ed0a4e3cb73f44e47a69d87f6070600000000001976a914799993f5a9b6e804dc32d4e816fa60d86bea11fa88acb93f0700000000001976a91425f0a98f7404cfbb2f8afaa01659009e055fa9d688ac5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7648ac00000000000017a91420041daf10880026528f4a995b79161c87a7ecef870247304402202380fa616d98c7ef8ea7004a2bcea6e77c22ea72e04b8ab32ae1559d499a586a022030de1cd11e883ac89124e7ce6178622982043f9610c735ab11d13887d05e630f0121037360c196fe193448b8bdcb3fadf69a778c0f93b2d21abf7edd7f900a8f4dc64900000000020000000001013e2bc64bdb8a8349654cb985379e250de371ebfee6b6c984edb2ca4544398cc02000000000ffffffff02095c0300000000001976a9144f123f9b07696ead1de43c977f261cc5f9fc552b88acd13b100000000000160014452b34c6a171dcfe9d8a4b9792a5d8826a2bf3920247304402200bdcc843cd22e79c8d752013ebf98ec93a673b5acdc3883469dafa66eb13bfbc022004c7c5a6f33bab1a33a89c5e479863e85dab2ae8d3d360fb2e7b11b878f00bb001210205e1232d932f0731ff694c9b9a04202b6de9c4e94ed54f16bc48f1b0161c759f0000000002000000000101fbd15583764b1905ba7021041ffa3915fe3078d7f5fc5b1a1739c111c626941b0100000000ffffffff026ba50100000000001976a9147ec99c07776943a5d45a53f142a14a7b3297f61088ac78920e0000000000160014452b34c6a171dcfe9d8a4b9792a5d8826a2bf39202483045022100e37d06bc359915de8cffb9bc7ba473a7a281d6d887c12bfb3cacce4a02f5f87102201966ef02d21cd3776a2844cb6d78d2cd7980a99f56a37a39ae62f5297667c03501210343464bd66e3207502c6c570faa2dba48fb479bf85c594284bfe71594a70472950000000001000000000101a1fa1df01de35bb26fc99806d6b491c8ad584e691aab80969802a0953bd6d94501000000171600144de8ee2c6154fca1278b0e49c62de6a3b5a057680000000002a00f0000000000001600140e02632fa025c5cb702ebc26abbe467ab61578dd360a29000000000017a914e8dd167f60e0722362c4242702dfd4307e77bf108702483045022100a1ad5a5351e1cb33e51c2bd8de6aaecb645795ddda2b7b3308475b5ecc3a250a02204e313351d01f83595323eddfaf7cea3b73690644dfc35463e782ca614f753f42012103c13890047fe12c5f2637fdd0e05f55414087b16030675ab18993477cf8fe06050000000001000000000101a762c5f65cc708d2d970b56383dd18094c7caaa2da597a61a778b0cb1b2922932700000017160014623502bcb75e827f9e9a30f4f012d778bd92adf5fdffffff02e58701000000000017a914b09bc1742709a0e486821ab6b3c4fd932a959c4087f391010000000000160014f2854b809810d00d2e3d3e46f1d99cf36302528a02473044022077274f77cff46d369e2b89d45b250190c462172f245fb1add7615720fe3d8b7a02206f53f01d0368455095a51d9447c62b007c375af85fe76940da22d7135fd4f9fa01210296ec9d121b0da05c594f7435927aa7198774abac49fb1d4c492f033cb20f299647a00a00020000000145fd6580746c3fb0c3faf7baedb13f842675c0cb54549e1e5869b3c908d8c1260e0000006a47304402202891a228804c704977d8ae11ddff4d99898e954544858a4e4dd15e397845935502206ff21a027ae299fd5458030f3edb45469d75741f10704b032390c67202320a87012103349082d128722e573c6e25d11fa9fe0e61c2e66b3933f557748b51d7b9a79ed0ffffffff02878301000000000017a914900bad31f7d487824407f393852c65e55103999387940d000000000000160014e0a2b7ded080b86c2d97e1db88c5b5f73e652719000000000100000000010189bc0b4278f7ad18a409f319b9e78448c9fc5ccf7deb89fa7a8b75a028e16c690100000000ffffffff0116931200000000001600145b2bd4729e243e67f1d231ae8a62fe758df7a4480248304502210093caa3cb7ec4619997c89b56f41284f9cb85ee3937918aefd4a9815249727afd0220147269b1bfdc9d0666b16bf7d064960bed8cc6321e5e91c858f5b31b6a98146301210200b93bc8afa62352bf49f59a75a1b8c34a458b8bcfdd52559da10786f0299c0600000000010000000001013fba2c7bd5f8121f1db5fbf0492cdfa395d6fceecaea71f32bf549548c020a0c01000000171600148d3375f6644a9dbbbec275907588261a6ae7279b0000000002405489000000000016001497d7842fc57eb5a3cf2aade4ae1704ff067c14b6be29d3040000000017a9141121f721881d3a7c307cf21e52583bc9ae219559870247304402201dcd8ee98337ef99671ac46c72490de4c326efefe2fea0480c6f2e0a3ac3dd330220303dd2d45a0da345007ce2ee14b942016f8bdcf94f25cdc8c4fbcf773a91884101210326c76df02e3c0cfeb7cb80e0b97016415df69cdea72fc6bf8a5e718a9a517fab00000000010000000001018e5ccccb405c95d190558a401a859824e3158ea377a1deac8f6f72c1052ecdd379000000000000000001eae10700000000001600141afbe9df2a22400f0496ea630db0b2d2ff410cbf0247304402200a0ff61a6a5f111360bd42526bc915373ed5b059fcf71a3c079d930f093f6a3702200d785b51d8424d92e7f7762be6e5e257b1d368232201b377dab71914a8d16d99012103d272d7363f558ffa63d8a47dfb1218b29daa8da729eddbdeeb5d5a72d4a4ac470000000001000000000103ca389f62dc568d5f39ccd4a2cb52b903d5779c8dc0400a81c22d0cfdd0fda31b01000000000000000008ed4ab01d01ca423da4453bd65250120cadab5cf9ba7f73e290834dfca1f525090000000000000000f11395a8ec3efe0d87e28d06fa6d427b625772903fe789f7e1c0e43fb68f261d07000000000000000002509731000000000017a9141fbcc0441bce8e55cb352f8892d5f1ed4ff650e387570e080000000000160014f7bbb8f5512e1b3559c04f4554fd096020e570c50247304402205b8575d8edfbefe354d2f72bda23f04418fee2daa724748888faee528f92c4c3022010d923602806603eadcf7cc6b16a27d3bd9654bd006f060a8985adc3f06061e5012103ee17db14a95c5d6c93ebb5514ed9a5a37ddbb4afc0a8ac2ea36ac539bd47590e0247304402201c327557930a8f54bee02bb2e035bf58f2a08eed7479050dbcacf2aebf8e41dd022029366b85fcf80ea7b1ab5a84b076a7d683880e4a137f83881fb801aea60262f4012102d006d7fa7dcefbdc04bedb365fe091cbf071b503547384a1598e65aed46681230248304502210084fb524ad129a818c8eca870491f2632214c6df9a40d035ff489464e9be2615b02205cc4c2d5712df81f776b1a13c90ec64685a84fd2a767cce302ebc9b64f1fdd66012103367b8cf3a01a1f65949c529c952cf369941653e7653109dea3057117b7fec77c00000000020000000180e8660b2c76d4961fd803354c54056200048661561d8334c97c9fa03d326ff2010000006a473044022036b2444e516db97e46ca19aafe4361cfe8631de36a9123c5a7c1ea201666f779022044446e9a6d270c03e09930f95c029eef57d5b22e7803668d3fe97e87411df0fc01210238fa362c33d9089d93e48cfb40e904652012436a94d460d0fef0c919603b509fffffffff0231ac0000000000001976a914c6425e245f875eef38a5d951667b138b0bbcbffe88ac250d020000000000160014b6e68731413df42337b7c71ed37262340f42b3ab0000000002000000000104bc1b9f058998c0a6cdeb55ede9264a8bc662a364f9bee1d74b61b9ca6bfb405f0000000017160014dfa799847c881662e45725ed004f816f3b1a3342ffffffffccfbc2b48f4eabaaf5627aeefe0c49c049c6a41bbfe4aa71c6fc11278df590530700000017160014bd45e0800d03843c49fc0005fd55b9b5eda4aeafffffffffa494cabd1d8101ec98c315b602273d8276041aee11d7cabdae5914e600f14bbc00000000171600147c09e5546f4c67568d0a55d40d99bf5d45bcf00bffffffff9d2418001948a2a0b7f7fcb44a3cc73a031616ce1d2dc3b7dd4543d1c33581540600000017160014b1fb6aa050bbd37cbbe8d18e5c56c580f7704036ffffffff0420291b000000000017a9141cf4b8a0e953ced4f15d5cd7b83db10ff75133da87281103000000000017a9145d8a1024ebd8258dba66128add6426e4b22afeaf8740420f000000000017a914ad6b0ee010fbb4f1701dfb56417c3751490c93278788ac0f000000000017a914caf61d6ea8ecc0e7abaa5fab3cccd67cf805a10f870247304402203ccb5ced02f1e308cd7609f990cdb29c6d16e4464224fb118fb5e97ec464e95b0220305ac91bd95331ed0fe3888b1985dcfc20ec2a880abe89edb650d14738ac9094012103b50d59a3b6158add24b9ecbdf70144ab8f4ee95b04fb9129d0e73b5a6d94f440024730440220563880eeed85f3f2b2e3e89ec006a4cbc95f57cc227216b4e3cf25f8e94faee3022062f53a20116f5158e436251c33253838377bce96642b3ce0ce52de2696a9231901210356e27c5f7e3c11698884d760d2b88d614949b29913d27026ecfaee5b08a89caa024730440220083d2486a84ff0d1578046d6252d92fbe45f6dd32c9c88e11cdf484948ba7f850220691bdbf22014742cb3b07727042084b96f17377b99840f3cae055f4a68e625d0012103482a66780f923bb277442b56258f3de7ba146a5dedd7dd11c40cfe93959b312802473044022002d31a99b5d8cd083d75585faef958f2a664077961ffaab9945df5939562cc7202200368208fd8ba348ee827f2484abb2adca1cd6a16930e4bdc2eb8769d46a0515a012102c7890869c150f5fecb2dd2693810db0813d9f3b8111b953a06f11c5c1868ef90000000000200000000010364c7cca6ca4be682e2686a2d6802055ac593cb88ba9b6201e3267a90104a139a0000000000ffffffff768d188dbc33f0df7bd9fcf22c1924859f8993cc548707e5d39a64902ed61d530100000000ffffffff5199dfd257d8102e7ae4f46f2c7ccdd074ab57d92579a2b5dfb72aa2c6b3b0f90d00000000ffffffff02858e1700000000001976a914c280f014f554fd9a9498afba49e3eb620df4f68388ac2f1000000000000016001482c7daadeedadb87f4af861881831471007cd68902483045022100ddaaac58588fe2194c037c5e9daa744f7967a39c6f54044f9777c46e3ea0cce10220331515733fbe5fd916febab877f295097b9af9a4ebca7c6adea772da50dfbfaf0121035af791af49526e3380d40f781bf4b8de53315db2a520e49bf3a558665b6bd10e024830450221008a3f78fefbff0cf1c9b72b3f0e6098037f9108c282decdf3c72482791827e14702205393c485d43d1a0a9d7f70ea4d90c622ff2a8120567656126b81219bb29d2f55012102af2346fcadc2aa64af0fb382cf6dfbf8bdca261ba567469b7c8c6ccd0ab9495702473044022019537120d308471641c070df5bc501ddeb0ff0820af116fb468d5762e30cffd402201476c8667ff57ab7ef513633d437ae24a75607e1adfda7f2bd795c2460dcae1601210282a64aa14d57fd5fbf5a3a199ead1341840e0a264a0da05b98f607a984ed49d900000000010000000001010da308e0be7c14e649ea8ad08a76494b604498a09f91b98dd5931bc39b532b7c010000001716001469ee38a971385a14bff801d24e5f6327cea5c5f3fdffffff02a2c801000000000017a914c30a3020d931acd5e84809494ff6e537e2be47068720a10700000000001976a91476530282b14b33b36ebb33bae304b9e031a8d95088ac0247304402200e6b3255d3741ff053f9a3545f5e320eccdb12a6daf5c80b02511f376cdd466e022053f4e89938d1d297a20e63114614588a50e9c40528be2edf68381b6e3eca90f7012103ce67f46bacbbcb94c44088e3072c66c968bd24dc74230e1e63f2cd17879ccbde48a00a0001000000000101c53617e6f5d808a532e45167d5fc50aa56042f6421586292bbae3d95e183d60f010000001716001425922e53bd63022a8def8496569739b04cb4c5a3ffffffff02233f29000000000017a9146521aecf385fab269f525bc1e0cd94fdee322cdf871e613200000000001976a9144913d5c1f34f8316eb04f2de7173d8cc2f55375c88ac02483045022100d6db436859b9f31cf8925ccb0b61332bce0b824e128bffaee1df59f9dfff089102205a4db9210102938b290e6402eef593a664ba99e3b832bc08dcf21830e3fd95e0012103bef5e9084db9af70d3de5a9447866f96db616ac47b3a6e5b4884cc9d1797ed86000000000200000000010105e45fbac3288da1b61538b7c5d0003c681aa3a86b03d52778ea6e9e560cdda80100000000ffffffff02e1904600000000001976a914872832d8665907d47bc02b04a630cfa85f30c31188aca358b201000000001600145df5d88cb04ad348ffdc2d0b28309b06954f0bd302473044022038c6f9fd8ce46f9147d2be69075b81ea8547d49dc7fec9aabf980d183ae6b27f02200cff82aee13742763312f39fa8c5f577d42f698c9a4e6c41e087e1418dde81a6012102cb79bfd8c3e84ed0e80fd9d5bc4c03007ce8757f82c1b92ffb84c10c115db5a70000000002000000000101855e9bd3587fef93d5802550b7eb942878d3236a360c66db98e783cd565587b70100000000ffffffff02e80836000000000016001467c7c9c13b7f13c4226a55479624e30e638fbeb2744e7c01000000001600147c4e6b813149cff8fae39802b87dd92876d38a8c0248304502210096e3bce1cc027d763eda43e429391351f6518d18c324e5331c5aee8b169d31b302200b35db7d42b19a7cecfc20efb7014a7bd69c7d0d9507e38c2d6046163f1e1420012102f3c5572636c340326c47458bbc746dd7ed339a791ec3fb2e7c26534a35ce039500000000020000000001018680555dcb51ed88b9868d3c374af1390880515a071704f7f46cdd74aafdad480100000000ffffffff02034a0d00000000001976a91409ab66d750233f9ac303fcdf385a8a68565ab11088ac21036f01000000001600148affe05c944b175b7e4aa11edca476f5fc22d38e0247304402202f40ca01dcf57dadee12a39d1db74df8d9c0380b9bf2316c5e13d160a197fcb802204973f7a9e0ceac0c07ee20ce6711e3c77daf31092fe6bd50fc48721bbb7799c90121023968278884980938429ea2f491c9953b60ab83c24bc376f3958c9e4a8101283a000000000200000000010136bd02417ed2c4069356a8877971d469477ac32ccc6e2010c9110d74b2b743fe0100000000ffffffff02f45c0f00000000001600144ee06367a9c9097869c495dd11ebf8d64318ceabe6a45f0100000000160014e9921102aa08ec2d03006cfb8565285bd119f42e02483045022100a10b3db72e3bc015e8bfdbe06fbdb76ce1d4c9bacadbe9a6258b20e3452f216e02201bd3a6a59d81fe530f40016455a952c60a0833e7b08e69c31c9b9a5e1f00c6eb01210252352017fa80f6f8beae00b2d52b4da096d18a83ee2e7b191c1c438e6ffd1b4b0000000002000000000101be82221fbe3484d9387f65863e25bbb5d6f00e7d1e29f2ab1fe6e405108c99480100000000ffffffff02bc5f2200000000001976a9140e484bf5cda339b81be7552d135ae8bf30ebe55788ac6b433d010000000016001485dd4ef72034834b4e5a093818edf157d60edb500247304402201cc310de862b3544a0affd1dc476f3df5b8e0cbe6a84e377edbfa186943279c902206317dede8fe406621d45d29c366a8635e03a7097dd90634a5ef1803e7a96ea02012102f090ceba6280ed8aed2f6db8bd41f9bc1c5ff57ef0e98e4383330ace41725ed7000000000200000001bdec46b3f3f43e43c962cf9cdec835711adcfc7c7dc1e9ec902d9d37b227fde4000000006a473044022063a8be6fd3aeb2ddf429041d76154df4777c8a0ddbf7cbe7c5bbbeac1c98a00b0220354b4782a9b1fcfb0fbe09431c0545af0f3a53fd103a5165c358f8f8a43ea2a30121032b6f9cb3aa1a4e63f0aed08eb489fdc2deba84a0210032a753704d41b179d822ffffffff02a99b00000000000017a9148a9e29a0925b81a987773800c693ba4a847c62ab8733b8210000000000160014e983a7e82a2d7d2c03e63cbce1b1092baa0eb4630000000002000000000101ee9a0cd87a98d45155191fa61725d6ad13f07196aeb6e0e062669fdbf6a2fdfd0100000000ffffffff02b38e00000000000017a914de2c92782e43b5a3896bb3b3bc9d1bfc8bd6f55087a4222100000000001600146b037729d6cf1a812e57d38b9d04f92715123ff7024830450221009b520820e9f7f73e195dbb7c8c11c6d2710d23df1b698a82087034f7e60e4d35022054e0c36aa3b720f8d264a8d2351d33ebf7cb86a1be9b87a775011196f5900c9c0121039d63fcdd899a762ecec2f3ec908b77dfcd12087d8d20b207852e69e6cd858a7700000000020000000001049bb5fedcde870fd7469fbd205728055a1d7c913d6d62c782dd34d325bdfedb820800000000ffffffffd4d08b879d682f81f9bc72916a0162d5a9572d918c4761626a6a8a0608bc676d0100000000ffffffff9bb5fedcde870fd7469fbd205728055a1d7c913d6d62c782dd34d325bdfedb820200000000ffffffff9bb5fedcde870fd7469fbd205728055a1d7c913d6d62c782dd34d325bdfedb820900000000ffffffff0248ed08000000000017a91456c90dad4b4e38ff3fda3b572d5bbb525add58e187b3540000000000001600145074817b8a203bd9009e6810a44b250153fb990402483045022100c31be95db8b7fbc19cf4bde012c18fec12064c8eb92475564bd09221bdd0a1f202207625f7e33a28a4b9d44981485372cb2c5564313ce7155beecdf4d10e22b1751001210318f7e6d0f377b2f4799aefe8b2e6ffb27026f64db5c557dd7093127b738467920247304402200b78f948c6670d8e48e024ac05b606c6b3bae8e6d2d7fbb9c65242bb3dfbda1702206ea55b41beab29bd4ceb827c014b34f7050d118397f936b4bc80669ff23f742b0121036b005dc713bed2b76ebd3f2b35d4bcbe6d0711da2c12b07c4be89014f06298a602483045022100c464f4a6d18c3f835962709b970e419e8e42ce2bb7c4362b0146ceb14bbd18a102205bc9d10cee36b404db6d6665b80f45114ab2f683a7b159a4b97da3c65ce81c3901210318f7e6d0f377b2f4799aefe8b2e6ffb27026f64db5c557dd7093127b7384679202483045022100906e3c9e96ec7d0da9926b49e66f5ec5bff7b2542ed8d181d1f50b187a1f077c0220458c2da99f108f84d8ae46efee79939cd1127608070be980bc232ed5ebcf5c5801210318f7e6d0f377b2f4799aefe8b2e6ffb27026f64db5c557dd7093127b738467920000000002000000000101553c2b2249b18e2924b38b407c55d1201372dc04fe5f276c19a163aeddfe9dff0000000023220020aa2e2563515395f6941b0391d4a9f495d182b3b76dea844f4f82c547d3abe466fdffffff014dae09000000000017a9144710ed444e6f45ece1c0025616aca05efbce00bf8703473044022010fa5146914531dbe7c786d3a998b22911706e531514ddcdc2aad675d0570a1e0220051cb2088a9fa2a908e35b8546de2643beb3123d365b21063655f1330f5938f4014730440220670e87fafeb70ae80ba449d35e1eadc09257923a367e2b0fc6c7d9346132ea3002206d219cac05f5b183c7a1515b039efb91fd20ba5c70e077e89903eb5f1d16754d014e210358803ffe1e4b0bfe83878823a80f9fa9882af4e0dd0c3d75c1c1776b87268579ad210264aa69de27c43b875a389cc0355f1676f6948ce5ea8e46b1ac35b13ef79bf64dac73640380ca00b26847a00a000200000001db52843bd8d4e8aa14ebf3ca67c0a6122d4de1c1b0fa244a3fba725981c580e7010000006a473044022073aec13ae31050562c73d6ab85ab880d7f4e9cfc9b71e4a58246869cd736a85e02205ce4820c83d3a8def73213c5dbe51d122fcbf8502cf547c900e25c18d2555525012103327f4e24a3c6157706a3855e84885de3a751eabf27fc36db4949b6614adcc288ffffffff02ce9005000000000016001427e06d4f9612c15de818e90097dfe45d3acb969cdd1c876b020000001976a9140a708acc6882bcb59b393e89909340c50376610988ac000000000200000001dc6450535e60a09a90211a41fb8eedfb23b56e1fedca2f5b05616a07db721bac010000006a4730440220203b14db75326c4f2e4cfcc21af440ea871b5775dbf8d81c4be2a2bd095c9aae0220242959c38bd51d8a9ff356bff921d8fa950657d44a1bb927ef875df28277a480012102499f2c0c26542603fc687de8d082db26da391761536c81fb88f402535895b245ffffffff02288406000000000017a91476826e0f3eff6b9b100b687a919af1af4471a8ef87df93806b020000001976a9147b3afaee7811c732aa8da591f884ecbd254cc8fd88ac000000000200000001a7c7459e370e809b41945fa8063c772714cd3ec85248f53179d37d7cf0628a40010000006a47304402205e8f7626fe7a9649b2dd6704eb8ba593563ce02472495f3ca30380b181dc77130220744fc2b3450d8657bf4dce8fb83beacfe8580a6ada6f2afaf3ac8b7dd449f1f1012103a55282308302eb6ebd6614cc731683037eb27a83c06e394deb978fdbd09e804effffffff020d6b630000000000160014a269c9a76d1583bd31bf2cd8679981c7eef06d5fea241d6b020000001976a9149af676c9cb030117b8e4bc2280a4eca2144a464f88ac000000000200000000010127801d4a3c1605741c6d46a2d25252c980c0d8286868e1a734bea459b23564780000000000fdffffff0234d807000000000016001471b75bb9f5d1d8faa5f7a8ebde23cc5d4aefaa99808d5b000000000017a914b6301a5515e929c3f97fb8fb4b82ca0dd35a3df08702473044022004383ea5ae140e4d7e45307c4be6dc922974c75c484929bd777fe221f7787aa60220597a51589aeefaf92bbcdbe2369664f0d44d4064bd987a2f05a5d21d5c65c50d01210369316b75d92b406e5bd0c664c506985f02ef67c0f76167dcc43234327e35122548a00a000100000000010239a01de4cc8df7c2c56c68b65b7f5d8503b777d8ef519cdc7b988698992e295906000000000000000053967df0a1fb141805d74768ee3f1ca5c25cfbde0df5404b87119d3390e4fb8b1a0000000000000000018e685a000000000016001426da2a4f50ec66b05366cbb84a03478c321ec5d80247304402207987d2e78a9d5102023b95c5a17fccd5a6f324751f6643d1572cb1940211a80902200f6d95159fb9b2efda6bfcb1238fd3dd6fdc4b1a0e4922f75a5e0b71d2ed91f30121036f55c7dd6d0920c8d9bc5d702cf22068dc326028d42cb5c7d868812df48867d60247304402205091b0b6d34e8ae73624431a3536f887ffef3f8f3b64a2e2494bff5ec83ae45b022076fad001d0cbdf753f515cd3a8367eab8ac309f99a54c0715676103ff2b22e0b0121036f55c7dd6d0920c8d9bc5d702cf22068dc326028d42cb5c7d868812df48867d60000000001000000000102057271c71560c95876b1274346a4c86e1c43d9fb773163d2fee4ee010f35ab080000000000ffffffff72e2c344246f1dafe3548114ab5ee9d19d72ba28e579bffc2a83ea42a1ea87f40000000000ffffffff019d790f0000000000160014764994dcaed2c3e660a4039f331d5268f2c1c54f0247304402202d1b5c2e2e20584e62efb7d1c438c78a79ca4f44d5b1c857627fa044251e5a6902201333f28e18fbf47ebcfb0e189aeeb58767d26571b7c0aa98d7f036a8c6b143bb012103c455b248afba69102516d5c64caa49528109f8fca83b664b03aa46883c8a29b402473044022033d5708092e4ba39b14869fac5b64747ec5f4e32ad8ff07e9898722427a36003022065658790fc7ecf3f177011e92195d997fb016080938ca1b56929123fb3c8eb67012103c455b248afba69102516d5c64caa49528109f8fca83b664b03aa46883c8a29b40000000002000000000101ddca0ad54a1dc65a4e48c9607b9b11782f92a3878c6e04c03d84629e81b6a9ba0000000000ffffffff01c7740f00000000001976a914ab1adc011a2b1589b65427c6bc5aee6138889f7688ac0247304402207424cb0fe660ea81302cac77f28e53b1752a9accd262452ec68fb152b4c648f102202411a3bf144e2127c010fb6dba0c80a7a38ae5573aa119ebd24384ac51d72fe1012103c7e71af338aac470ca175a816d0e2c1884894b8ed14a10093916fa69592058f3000000000200000001555a49b085eab85ad7ba1f0b63545d92eebf04c992122824e9f8dae188335527000000006b483045022100efcb01cba7cc62fa734d5eb1809b02761353324ab0283bbde7cb19dd747373b8022056bf85f1da23c6ae0d0df01b7340ee62fc5825381ff0a9ff964611a91bf2b3260121039fb2bcb343f6e4381be35d42b8ab2c4fe715d2d6c10c297c901eafbb7d03183bffffffff02508103000000000017a91455e067e01c8c766401c51dc1a24f991ae0b9e4d7870f364200000000001600149e4e1fbc556d95d67bd9dbd83f97e2e80dfea04a00000000020000000001014675eb86ead8390017ac4d26eec2daa9213d9bca76477b3a94615d8a014474190100000000ffffffff02b77803000000000017a914ef7ac05d22ad9244dc1d5ea24955c7f788ebc9d787f2b93e0000000000160014f7cb105c606cae24d4c279e45d28aa8199f624c902473044022009ec39733ba85523cd8550ae15a67412cf364ba0114d10b051c49b31d1bd57410220677095031b12b0b627daf77d4ad2c293a822679c6b825fb3453019dd29d2ebc7012103e7c05ad61ca1b1d7ee348bdd804bfa35a69596176c9072d70247c45ef5b38559000000000200000000010187120feba42d12e37749ae03e0faa923b945a9b68c91418d8e48aaa42e2682c30100000000ffffffff01fb0b00000000000017a914188124334ed819b96e718acdd52ec7dad8d57fb387024730440220132bdc6da82cce2b853c140f8bf18cd4a5f7811296d9a0446eef731b043bc3d80220535726fa578402d43e39037634da22844c3dd0d2ccd3f9ea888265cac4db160e012103a54e28f4bbe84ca32c6e18773f0569886332e3c847eb13e7f66a50a4d68eabea00000000020000000001013b3e736592275c0b1adee199a00a2d1108f601a13a2aa5ee09bbc856d18fa2e70100000000fdffffff03b2c60200000000001976a9143a04074f3535bb1465ca8eff3f3957b2e67f527f88acef4b0e000000000016001474cd5b9814f6068152deae12313084ea26523d3f756a514b00000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402204069b73e7ed0f8ac6f6e7699255b1df3654977a14b20a0c5e9431f2e899cd2f40220742a00f814d635d80902c17b035d8006d4e3a457fff010ec61567f989045d360012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a47a00a0002000000000101b82272afb2943245014c8a0a7a66c9c5d46bc6c63b145567c54c88ad3149f4810200000000fdffffff02ed2dad00000000001976a91482d8634d5deae9e95b1ff7c3d0044c17b08d552088ac2839a44a00000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402204e0218ab68810a22f0cec56a8ab325eeb1b3bd23e8534990442d96268748d1c302200813982f61354e418df22510b36240951ffc4fe49995d09fe365aa6b2a9d44cb012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a000200000000010112e48156a67f281edc3b5f4190079489fef3dd1d88e0fd74b29c6e10d1d300d10100000000fdffffff02f07904000000000017a9149b12c0362c45357abcd94deffa3b5375bd0e8c6587dcbb9f4a00000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402204588682440582e14e6f26f0f009950d90f3b1b22d7ef1bf2637eff7dce27799702207a9edac04050bd30ccfda896757e7abc24d7a0e925835acbaaee2da14d99ca19012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a000200000000010179eb149eab3ace219928e0cbdb11074d96c17ee7ca9cf1084cc5b63c205e58620100000000fdffffff04c9910200000000001600148e5265c7a1226e5933af44d58a6e2551d0e281cb5960070000000000160014c4a5ff2c505e9bd3af5378ad749aa7a23cc2442c631a4700000000001600148271176a61ab14767e1abb735907d3d6f0afa78395aa4e4a00000000160014b9a8f2a2b75894fd155251072c5866b39f291118024730440220049677c58d84832be967e049ea4a32286b4f35c14b87a7e4c79cb6e8718a1c0902202d380f7ddb4f67fbba2089771eb1af62ee321d31650c2d4cefac438cd7585feb012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a0002000000000101cbf8a220ce450e67950c9058e232b549bf89a9606dd4218d929cf99e0bfff55d0300000000fdffffff02c0e1e400000000001600146c4d909077d63c0077ef10a257123eb8723698e378c5694900000000160014b9a8f2a2b75894fd155251072c5866b39f291118024730440220386e68c586a6c24bb53337deeb15dee11c6c6c5ebb9eadb638611e5ad733b01e02203b1030689415ba6bf6f5f6f49c6ce7c195515b043b440fba74b53d134b511326012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a48a00a0002000000000101d008a29a9b075325960badef251c23a1849c3306ee374d290554340a2ac4dc010100000000fdffffff028946010000000000160014bebecdbc69569e2036a9c1c1d27b7d17b9ee67b35b7b684900000000160014b9a8f2a2b75894fd155251072c5866b39f2911180247304402200199407743a1640632393b19c4cf16862ca5e6856cca4ef59b00c49d748962e802207ad60d9f6b744f7578f290f799707bbf7310e9468f2c493e0ebb04caf23bbdd1012103c883e8703fcd313c8957451d3a5e81b8e4ba7d939b723f0eb0aafdf3a1bac29a49a00a0001000000015b1ce210bc32f2cc64dd50b270fd17f8f212c865a8fc13161d9420176863dcc1160000006b483045022100e373df188a7f7ee381a23aa40a77ba252381434e67269f07ca779b70ad6a80fd022053d7ce3c227d531cb89f91c8b7bf6f213b488cae5e4d473e14fe9837145d96c90121030048ab7a429b263bedb5fabc86ee1e9dca4679ed9f7ba88f7510a403bcdd321fffffffff01463d0400000000001976a91470b73247c630f033b26464caf2462254630cd91588ac00000000020000000001023aaecc12f141ef120bf6f5b40851f228a28f75d5fdcf4547ddff2517d6dfb167010000001716001458875acfa722e89a962b69dfef82d86b7f80dca1fdffffff4af214f05cda01a244891bbb9fbd0d1074c3de7a8e75c0a92808205ab1b2626f00000000171600147fcc75a399b696491d039aa5e056b4a30d4a8b4afdffffff0297f801000000000017a9144326d4b89cb46da346934812f7edbfd636b5e94387453900000000000017a91447cc89d3d29a825d3f6aadb8a8e5978dbac46a6a8702483045022100cd598bbccb75e2287cadef0dbf4a3a7415b7adce55688d84aa4a51eb1c10618402200c9f2962b4ea37fe796068752e61af7daab4e4f5aff9afb427aaaaa815c921440121034f44945acc1613f5ad047b2214bd796545503128f813224002d24aab91840d6a0247304402202de48e76739fcb053cc2f0ff4a9be66cceca7328ed8af6aa0f3bc9df1999a9f1022027ee24766ebefce643c40c5f7885b610c16511f4d5ac3328f7fe178b771bc9e9012102b9bbb5becee2f5341ac1b0f0416c0091dbb15b7b753cc9180b27429920174ecd47a00a0001000000000102418edc68708f80d14c9e6639125068655ebc57b0d82ace63a4b7b30436ab67990100000000ffffffff16bfa6de4bb6f4cd238138f2dc4743fb3e7ddd118d23ed8d84e6b06bbcc9d176000000006b483045022100b0800725a13252ab57bf9c58a25383911f5719c67d82b1c3fbf074b15fc026f30220043fa6e928f46d5fef2df03df6a0abaddb018cae43a3fe0950c57e015ca8558a01210320affaeeeb2bc6c64f60ea761a8931b138dad9666bd92e9a2e59443ea398ca04ffffffff0195f58e3e0000000016001467657efd1288f3b664269bf75eca25b482140940024730440220698fc2e567ae2d83c140aab46be647c52b50570d196f5c58c898877f230c9283022020c1eefc937d2569d99da155ecd8e679d39051d9a187c9744c5d25630f686d6801210320affaeeeb2bc6c64f60ea761a8931b138dad9666bd92e9a2e59443ea398ca0400000000000100000000010108d4fca84c4f3558d4e5151e95070471b3b81911c9cd9c639af9390fd878d46e0000000017160014d04339c0d2142984ec79289a5f50d421808aef64ffffffff4c98af0000000000001976a9145f7536abe0465940c959a7937ae8699a97c8cd0388ac2fe500000000000016001408b447db567362ea1afc2286757d9d95c7ef3b95bbbd0600000000001976a914b1811ca2953f59dc31e8342a407cf279aa3c60e288ac3bfa00000000000017a914e55be161d9af66d6887fc92e8e658b052cd1362a870581000000000000160014b459afae5a91628bdf3c336a3e6e42c2d4ebaa75a8f759000000000017a914671091af88b143d7b5cc39de109a2f6a47713d2287b0cc00000000000017a9142a9595f3052363d478e2042718bcf8c98dd537a287d61336000000000017a914563908ff10250fcccfa9124e6e677dcd0849d98d8728db00000000000017a91409d6d0f891486415a3465913dc27f1e409f09c4c8721af0000000000001976a9145af4cfdc742086648ac45b9b3afef114e375ab5d88ac4a560000000000001976a914549a13c6cf5a1c0a6b1b3f4ccc76132862d061d088acb4a63a00000000001976a914a86a50738bcb0cf1112016bcffb198e6ac1fdac888ac4ebd01000000000017a914fea2e02e0feff598c22a46855a8054c642bb0d6987269b0000000000001976a914ea5125c74fd23730b0adf7036b977d19de3cbe3988ac78ef00000000000017a914bcfdad2f3b18606e03251ca22ff242d1cdc7b3288793da01000000000017a914809e60ce5afafc897000a4be18b25ad37491052f8786dc0400000000001976a91403c95429cefbc9bf445c5d1967843db36761850c88ac579b010000000000160014e38afc86f76c970279800a84d0569fbe7e8a78c2e2679b060000000017a914f0f560bb231e51cdc2ef0e1bc8692b08d686ca98878ea9b113000000001600143a2fca45d5c033eff633d4a04b6a605aceeb06393b510100000000001976a914722f1f95d822ad1fc92ba8d41d33fb12feca8e0388ac768a12000000000017a914522267c98e128d18622732c05f44db0e143fda3a87801a06000000000017a91447419c5eab7801c36e76016fa885839f54fae3ee87770502000000000017a9149e8316c1c59a3644cd4851aed770de5be252dade87df8901000000000017a914e31330b24d8bf2700ae004fad6d3e97ee8c1409387f51519000000000017a9143606c9dcf4a2f020fd8c2bf2a4e00a3782cba4b087801a06000000000017a914ed88c583fd7ab7ac9cff252104fcb8617910bfb4871c9c01000000000017a91405af2487c54c5aea61c2a6894a8d292baa96d2bb87ae4200000000000017a914372c920c6b698e34cec839eb9b4dbe6274f7a36f87465305000000000017a91494184f05ba478b73e5985a181cfe4502251ecb4f8708210500000000001976a914151aa3e9d23942d3c73c68db0443f1efaa0d614488acedec00000000000017a914ac398516a94f72392527591c1c5383580e3c94f68798b701000000000017a914a4c50172a79e326700f842724b4360659b8c678087d3bd00000000000017a914cecf4460a2adffe3fc79f280707e6a23ebc818bd87386d0400000000001976a9144489c504a44ac6d39c94be21be57db322fe70f5988ac779200000000000017a9146fce2e7fc9c5400211c0a3d22aec63a3fcb9108c87f3450b000000000017a914a7272ec0e73b0075477d2c3cbcc457de521e86d287f9c00200000000001976a914ad171af7e41b9c9de74d2b2db79818538a3828df88ac52da10000000000017a914feb42ba13bb51290d4952b9a696bf71e192a97e087db3e0d000000000017a914d0cb146bf221e3499a2dd76446ebeb3ea3258f778738f110000000000017a91485f9d417808fef674deccafb679e3fcccc50cdb18758a20f00000000001976a91475b592750f3b14b985a3d25f39c79739bd68f77288ac56060100000000001976a91475f6226015a4c8788c5a16bdec3f3fb5d8e3686c88acaf0703000000000017a9143862c12ff9ad5246d1411f482e5aa7fc456aabf7875fac0000000000001600142babf955cb040dd2dfe92efc3a59e139b4903d7115c90000000000001976a9143cc2fa80bd342a7ade2ff8c1afa7f568880b1a3e88acc051050000000000220020de4d9528df447b48adb3f69b0eb0aafefe6fd3cf5727cbea9f2cf0a7a637c01166ec0100000000001976a914cf996a6715e8bbb03b48daac208dc390cb8adda888ac7e3f9e00000000001976a914f94b73ac26348ccc3e1f7a39a5ce0fa4dac63f6388ac83c12b000000000017a914eeb5cb440a5edaa1c7501a07043230e65b10a159879bde0300000000001976a9141c051524e2e575eb56de1e875475699d219764d488ac265901000000000017a9142f2f56438209bc7cb0c6296271d0be251ee6f0fe8746ca0000000000001976a914420c0bc274a7827fca96cc7095c2a5701ebac2e188ac095f03000000000016001440936309b017d35ee423ecbad0346e71bf194fa410f803000000000017a9145e9965db8383de694856dccd3ea1291fcb97eb5b87939200000000000017a9144b6c68ff98e7f524597ab02754395f471aeaaa9f8700ee0200000000001976a9147380895a67cb576f77f88214b61c7f9c1a92970188ac45ef00000000000017a914c1685383c1df346d3e160031eee95c883fa6127c87bfaca8000000000017a914df420535cfc3e6d124f6a1345e9914a8b8c0e8fe877c9200000000000017a914fd7593b5c40629ce2c97adf0adb026648b5292648726e505000000000017a91424a2b639cfa3b31104179135001e98a43cf48dd78742012100000000001976a914331c2dbda6a4d5312dedb69ccaa89704d7af926588acb70e05000000000017a9149a19b6f9c8b22f2abb13145f0e582bd559d54ef28785f502000000000017a914f6c4a67beb177d73e9a9d97212fba7b0190a0ab987d2490400000000001976a9142748da0c6718d200495fc8e5a0d103ab8f25a57188acf3110100000000001976a91496c9eb9e030361e377dc8c5ce7d4bbca4907c75788acdac800000000000017a91494452a8823fe3201b73c7305386f4c6f13bf514687204e00000000000017a914fb5afc9c4a63e37f090d50f882f2e267fa22235587d73002000000000017a9141c6584bd9b40cdc5bb394d7c7f400ebcea47bbb387f52707000000000017a914640519b9c308e9b9fbc851b45feb7d0c40e4096987a038030000000000160014a04568307661a270e9ce0f7267cb476d85341872496c00000000000017a9144a78daa8c0337aad00c23318d4111812f5dc9e708753c521000000000017a914515755b95470842dbdf7a499ad125fa802af332b873bc99a3b0000000017a914d7f4e1a642d2e95570951f481eb526782158f51887a31a060000000000160014dd4bacb7ed203e90eb499c0c30c3fad65ab1a65effa401000000000017a914bd26378233a00583a01ccb95e016413cbc50b75587024830450221009116bb7c165418565209c869cb1ced1f89b23aed2e05622d6d5c4b0efc5843e3022015c5c2551eea55249c0e7a2baff0bad6ffac86457fc07bf400e371575bf187b301210210b34217a2addaaf3ed4fb24cad15ca498cbc8562deaef8a0bb8758931cc647800000000010000000109a3846f786ca749e2db35ef6515a70e583f923f9396dab3afa8f1f377cb44c8090000006a47304402203cd3698108d140f4d5cf410d20e693e6534e5c7975fc9b147ef576a3dc623d2e0220501f92df5f9477c9aa1fb6dea61d3b38b15e2087965d314254d1e90334f6507c012102a83950703db250b09775258acd867d673208500dd89ed477a9f994a2f5282bc7ffffffff01a9a90000000000001976a914255d2e8c1673f94392368cc2e679495101fda80188ac0000000001000000000101e65ae7ba66f9c8e0de5e642ef1c1010593e960f8da7a870034e6ef954c276b5801000000171600141f24dbd3f2a79068e170a9ac4517670a21fb8ba4ffffffff01581000000000000017a9149d9d70ef6e77349aad9eb39c0c5eb993f25192458702483045022100d0d0398c86a16ee94c71bce73180bcbecf374f627f789b26388a5ff8821127fc02202cc4454aca2a3422a1f3798b1552b0cff8d55c3a638dc4b30c84ee9583b2ba6c01210306c4f2ef3ed680fa3bdb79992f47cddaf930769446746ed3b003ec890b4c16f10000000001000000000101b94d9b12ffb2fcc36e15aaa71bd19d63319fd41d00e50a974acd376d1deea4530000000017160014fd049bb34d161a16fb2726c31a0a6f7288637277ffffffff01d87863000000000017a914c48fcce7cd5af01722dfe375828e12ad9fcef95f8702483045022100b510e330c51383a3d330b29c292533edbb96f8604838a8ac8d424a637052397e02205e99d648758ce7071aab56271f78314a9df028d56645a3e8134f6c7521fcfd97012102ae88ee0db72d049f79f17f6fd1c37917788b7447c4d957bc76bdf2466ec8dc790000000001000000000101e65ae7ba66f9c8e0de5e642ef1c1010593e960f8da7a870034e6ef954c276b5800000000171600141f24dbd3f2a79068e170a9ac4517670a21fb8ba4ffffffff01581000000000000017a914bd39e0347642c3589eeeb4058cdc8601860b90fa870247304402201f2572b0c580f82cba73f97c9d351b090b411494c13963c684a8fc4c0dbe74a2022054c5470930da0a6f44740d4fdcacca910d869867dc809b4d2ab760033bd9fadf01210306c4f2ef3ed680fa3bdb79992f47cddaf930769446746ed3b003ec890b4c16f100000000010000000001079d826139f5a3d7ed642b6af0c4b037dc6a1574c1e2ea9032565b1875f3bd8f171400000017160014c683032150d6bca37a094f7645606742d07b4b77ffffffff1238190171c96fe4848ff509a41136f98d819d1d19af9a8e53075f94fdbdcf3a050000001716001446f5bc1a7ffd378f5c1aa870bf747c9081ed0d73ffffffff0688d9c4022923f30a209173644ea2cb860ac31e1b775b1568f8523e33d1a6510100000017160014aeb8896050c9373974af4c952458755a8d40d635ffffffff1ee0654ab7f02b485dd0b380162fa248f2cce357df22f8bb8255eb5792b6e1820100000017160014f611d4e058884d63a538ae4a341fad862c160082ffffffffa0f33f57a3162c17309c0c25582dd73ebbddf85d91ede2bdd4ce12a9d857559715000000171600140ff5dee69142a1cf24ddd9ade69366733cbff282ffffffff92cd5ab7a567c570e863dd605de72a4c0d38815b541f6ad3c7d110a58cf897e62300000017160014b716bd15df85387a3d3ee35effe09249d12e1bb1ffffffff0c1fc1c4889891f067f82f2915eda1ef14baca48ee8e786f34d132ebfbdfedea010000001716001450f619c9804d41131580855f8cc347dc3a863724ffffffff0121d44b040000000017a914684d2388fa75d3c932e75db6c4c304736616a0e8870247304402203ab596610f9ffc76fbdcebbac52da0c5563485af688428511043d86a3b1a8d4702207f9bcc51a8a49e29b1a6a56bf94e9972391404e572a82e21fa97d72c0874a8b70121034054a60f6e7d65a0a73541e75433e0f0f62469e50ec7f9f84ea0959317fc522002483045022100bda3df841afbc32d8ce52b47ea73f232655321508310da4019a8a437206136fb02207b34410190780fc2cbbf4b354b154557dca5593b6a9b96fdf7783107cb4f9245012103ffa496d48abae5eda06d9d566baf9140b88d2ced357c977e42326316d1202ee702483045022100c324d9c456c7fc26f7f33833c6a5fdc28bc3066f7f01b03819f62e43239bab6e02203650779dfc81b8e603edd3ca441a5a713d8bbb7971b6cd970a67f2ea4a15355401210362c22877276f22ce59e445cefbd765998de0677a5cbf7fde3dfa8c097676eac20247304402203eaaa4afb45ba804160bca9bfd97be12658d2032c237f9949468504c090501bd02202b1ee08e11fe28532aa758a0b6bc625c76ee5222b3dee59fb5288ba450ea32a3012102cd6534692acfd443e50b04eba18b3742d35798551004cc02e35afe9adf9d74c7024730440220158d581dcf107e383ddeb7154bc16af211ec3dd5571ce14f7c992c3ccbbd344e022037670c237f63360f704931c6c80ce0c643d9be0538501f2bca789d2974e0b8030121029f7e61f7ea99153bca291cd908c4b72adbc5f1271eff01b29bdcab0747afc70b02473044022035e9ca4ba8db82be5df9afa8e538ba090c26f4bd7ef27e84daa9621fd0ed484702202c954269360f443c56252d0a3bf8bd6b99b33c23e20714a14786658fd8246a8501210213ba4c9770128edcf28aa7f8421c5b4be7be17671d30436eded4c90c2373777d02483045022100d7087f400fb6cbd37b58eaaa9eab82c2a908e2a29f33e0a1b300e8d8280d7b460220214479207e0aba93d1949088cd5d708e545eae742c152fd3e7bfd9653a97cebc012103128a24b739da8b62a0fc98d1ba693f8a1eb0c1938aa9e941aa52b869622e81870000000001000000000101dc6e59e3e65c164989c00a67966753f98e8e2eec0012f7745bf8bd49360d0d101c00000000ffffffff3cea5a00000000000017a9143c0a42343345d011f6f72e07a51511e4e533b1dd87599e01000000000017a9140c1004785f096a9cb1de8d5ee76f11e681785210876a740000000000001976a914a85d74c08f906eb81b6d500dc77ec9873a7fc72b88acca000100000000001976a914178bf16860f53f1809a17b883708236e75380c9888ac24bb0400000000001600141dbbc89f09399ca58b66b3bfc7147b15b8dc86f3a2b911000000000017a914586ae74455e355f4b2cb7d914cbd5e024f3f387287623c0000000000001976a9142c2836cb1199bb4417c18af0433c731b155219a388ac8ef61300000000001976a914198b1d4e726c08ba76d460bfa33fd77cea44eabd88aca6590100000000001600141509d72a63d853b44a848c5ffb8776b35a55135f36ca01000000000017a9148939ce42cf2a92f54cf571c48c061fc8efdd4d7087da790f000000000017a914866d1a48a29c16868b48d9d7c2bbe847a046712d8751c800000000000017a91477a8941b7fbd5ccc38feceaf7f0291d02b9c787187a2220100000000001600141a2e456e1ddff4952c8526351e28f2d3cc3d8a59e09a090000000000160014d1085f76d3f16d87d90ac8fe71c706e01957c534ecae01000000000017a9146322f82298b71933b5418686211940b63f634f0f87467a00000000000017a914f2c4f0a933f99d5e9e59a36206609fceaf76804787352d0800000000001600143ac3504a4897ab651e9d836e684daa2865657ecd212b00000000000017a914666ef662e567bb6fac9ad004c057ffa1b1c057f087abbf03000000000017a914d413e3fa9aa8a85e46e3d42ce06d601b30c14ea087f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd762f6e0700000000001976a91475c2b9b1d9f87f4a9b3a6b409cd9fb15828d55e488ac1558170000000000160014042a5a662cd07ffa9e380ba117b22314810217f74ded00000000000017a91491ba8a350956cb4c592f54ee42045228b49337b1878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ea3c04000000000017a914de0b014a11141f767fa43b5ad6ed3902376c6e43877fa204000000000016001427cfefa13996324bf1cdcba60aee019db39beba0f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd768f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7672370300000000001976a91443b0c7b39ce9365b4ffa7d194d16f62b57dc593688ac3e4c07000000000017a914c92949e40631bfa42ac71e32e127065e64d73bee878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd761dab0900000000001976a91408f548243eb45d202bdba4b95a105b3415f4003088ac8b0e0800000000001976a9143288c518cbfbe074f1353c6c683f10eb40c2a36288ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ae2c0600000000001600140aa3b448ea23ec06631cef2ac3fe40790007eea1aebe2100000000001976a914c8eb74337327e0c6ba6af59b4f0456bff8f4caae88ac79e60000000000001976a914bcc738f5f02ef5f1cdcd544fd37be0d2496be34b88ac55360200000000001976a914bbba477d40689190a7dce0ae81f264846b10720a88ac96cb0d00000000001600140f65588e1f4da0eda54122735de4afa36b053a67a3d500000000000017a914ebb4414d933ad5bf4f3a3c21f8a70943c26647bb87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd760a0804000000000017a91471382ad2e8f4ac94d6a2cd47bb22366ce24fc03687739d0300000000001976a914e305503585c1204d2979f871b550fe22d3ffa18988ac26755c000000000017a914f84d4f24692ec4e7ecf695de27140037dc6d907687dcf901000000000017a914b4ae8774b314dc89392649dc9dae58d859e8e78187407d65000000000017a9147ff1102977c0730cd6e973daa271dafa7a89bd7a87fe9905000000000017a914542c458e9bc4442dc92b9a66a2fb3740b5e908cb87cd0201000000000017a9149ce823cf8b6b711e2b302ff5d003e80134623a83877f0c04000000000017a91469094fba37b02c4de26ec5b272a9c3c7aacd47ba87ca8d0e00000000001600147d09541eeaeb72d179b0921b5e3b3e2ea7c2d1bef06a0e00000000001976a914741987c0a7941bca02a3148ce27fab16f363501388ac352b0000000000001976a914bfab9befbac04e497081ae899a495f90832853cb88acbd4600000000000017a91407f9c9fcb0c307591b383d8368d9690dc8a5a4f587f15a00000000000017a914b69e6afa74ba724b1e5369cc6cdcb2708e8753828712a1a300000000001600148717b4abbf8fd3b6289b0196098955d4a3b2de1eadb221000000000017a9146783ee0d41278ec087a860637ca1c1cbdf104d908780b501000000000017a914677966a2f12b16762465f85c46662f8a60c7800287c4e40100000000001600141c05754a1bab387dc154eee6d80dbb527adc8936445600000000000017a91457bfd8c7332d559a70cc095949789a966581a835879e3803000000000017a914682d7b9eca107a06034d47a5aa33e265881a7270870247304402200bc8a7641138b08052a732b5edfd2d0314a6f7941afd4c41bac8306d36ac5fc70220083baf46189c4725f6bdb111f07f5eb6f6b3d9d2516b836daed6feaf60c9e12601210270336065af5c8893e908d415219909bc8f760ce9c41266fc8e037c88b47cc9010000000002000000000101736310d24e1c2797211658519ff51010ef70f9222417f94cab9e3c59c259b72c1500000000ffffffff02afd91500000000001600140bda35c98bf6d817d38e35b5cf1776b54625092f1f7d010000000000160014c4d543310f32e1358c99f6981767fb0433d6adb502483045022100f7342eb7f98f1dda390957a3db790493fec2d8747a6d12677841c96c50c346f102201e8dda6bef7be7fd62ccc22298d617d45abbe4328252d3cd87420eed0813a596012103add5d7506896999615963a6c083ab4b75bf34db3beaf6af2bd2e45f26a76bb2e000000000200000000010360ef290c1391d500151b2fd92eb70020ea87a1f6c29588856efb746afd695e100500000000ffffffffa8b3ad90b42ac41baf2dc88c73bce82a7b793b4d86e89a08871e0b964ff9e76e0000000000ffffffffca09c579d4b86eef8358c658c1742047a2977c6b23fd0734ce491ae5ba0465f50000000000ffffffff029a0a0000000000001600147ab03f63165fce21c19f91a99a67d9354d72ac994c405800000000001976a914366d0d5fc57bbc466c01dacbb66a737b256d3b6488ac024830450221009b558123e410a1a5028a5a61f3ce7da56d38ae9f2459e58128585bc05bc335db022051c08af8d9f684db890d3ef5148457c6c09c04472a18a53ddda9a7da2b18eeeb012103fdd776808444daab19dc18d4982bfac0d3966fc40878e4700aff2dc0ec776b9b0248304502210085c7e4824606307df8fccdbf7a39473dfdabdc4e8809d0a8f5d4fc944e34e2cd0220279d1133f2e019f28c57ad76d6f8a6504b71aee80bca258d90f69c74aa3c578a012102c4f279437e495350fbe77f287797279ef9c5b4b9a3642df012b26b07f92ac49e02473044022055abcfd8b3bd467206681a1791f0c6756af39e9810b8d9238ff7be00085938ee022047e2005be7e620933d6351f93b5d5373269e1c002d966dde276577e28d2da85d0121031bb557b0bc7b4cdf9dd274a9e04e9e0fe1f6dc259833c1834856282aaf017d1b000000000200000002b79c7dc97af9ffa7920c5b92cce6bc86c5d2fe0de4714a6260d220e2f6cf7693010000006b483045022100f8907eb514ac816eb35e9019a24f473c091b4d9397ed186243739790d1026fe802203d2df1350240053b2311b7b5409dd4194d35f357ccb401edc94b3e5b82bfa7b6012103d8bcfed344baa587de216e18fa42c01d02bae278b0945d72998815e5ba04f814ffffffff287c51301b31935a0f46616dfa7845bc0dcd0303b4699e236f661926c52b828c010000006b483045022100ad738bd154c415f620a165e90fbc8b548752d53aeb4660f29128eb27c523ff7202202d25ba18b5a1987c8cf3f5eafa231f982a247415a9af7e651b3dfbdcf627589b012103d8bcfed344baa587de216e18fa42c01d02bae278b0945d72998815e5ba04f814ffffffff0123ec5e00000000001976a914af3d72ba00e41523f3e33c32fd697479566c6f6c88ac0000000001000000000104cf40da259442cf5eeda49bd2be3aa856dd770057c272d3b1d10be62edb9b8be20000000000ffffffffe81a65bd8b5eb5def27e1cc674f3cf50c90a0e8bbbe8cdadab64881ed39a0d270300000000ffffffff20e582126051b3270fe41a92056a0a668841e0c15c18e2322f7e0bf2acf865700100000000ffffffff04d3141b84c09860ca8f37e01952dab1a9627c75bf5bd39b8718dfbb3e8e69800500000000ffffffff02002d31010000000017a914ff5c18c0d0ba91e2318a452145fb6d38f30a5688876d8d3400000000001600147e0543cb775aaf816702db6e322da317a0243e5f02483045022100b76d9f0c9f017291ae2614374cf9682415f96450985699777d0a7dfb6a7af049022013630f2e00e91bc9b5e2fa545824e3a5fab8a99029e55b5b5240b2843221f1de0121023b0a33df2e81c38cc1e2ed99212e1e8f7747b46244af613263df6814a9710f5c02473044022036985a647ac594d3a77e0309a172e214831fa09c73758f8bfbe2fcff860fdc3802202308a6237c5c67f96ef9720191f8e81d1e447dafd58cd788981991c6c17a336201210208e58e12c423ec12ea78c13cd115870d981e63f73e2269ae8e21309d7d48093b02483045022100a3522fddfddea9cc27c2c0b7074716ec034eef208e618db5c8b95176c851378002201c5f7500357021f372d2846be004b87f0dd44ed4c4b3fa69c38f3553f447396801210242eb4f91a153fc4aa1a37a6432e5f4cbee5b77592255948f3bb8af7692f75424024730440220040821ffe96cd1831eadd2a54333c507671daf4768d7e351633c177370d749fe022037772aa15d7a347906b2368cebc585537ca22fad18eee0cf981d16d9f0dfe2680121037560062a7078b90abead7039b372020ead597a17a1140dd9857297bb8250d2ef00000000020000000001014eb60cd91904b70da926e8bee12d6947ed7a74207b1dbee56a243cff2610ccae2b00000000ffffffff027f4e4f0100000000160014d5cf5561d2650e15a39157cbb54fa1ee21fdb8298a64120100000000160014ac04b0f760d1e73ee2e99c17a8c567a629b0123e02483045022100b37dc1a624776e097a08fcb6adc84544af47cbd4e4a47feb840545d979e214ed02202b99908d19560b339a422d9857a0a090e85702248ff6a9726f18475ebcb330b0012103696a69171e49f07d521c6a46df2944c38127fc87e04f0519461a1b152076921f000000000100000000010146cfdd056a4a01c936b94b01861ffb23466c60f1982d8673dd0f2af2bb45384600000000000000000002d66708000000000017a91467f15dba6d3b0c04d607cf9d64688005fe34db598755e3460100000000160014d5cf5561d2650e15a39157cbb54fa1ee21fdb82902483045022100cc37160c40b797d169503078fb59de1bde561912f967a4dd25cb8bc6c580c629022050d93338a0af12bef4087f7beb21cd08aa33754aa876a6493e7d14f99d3d96d90121025c3769fad6bb160c7eb215c3deac93d4d294e838d5b82d4641eca21b354b4dd700000000010000000001012c90265f1c6eb32e5b32a0a2852be5e3b73c9cbf33452e5f4259e82e9b99d92801000000000000000002644f240100000000160014a19c3f0448801359d5244de3620b271cd9767ec2a390220000000000160014d5cf5561d2650e15a39157cbb54fa1ee21fdb82902473044022030992ab540a8af97d513dd596b73923fb7f020c89b4ca142b7cda46f75aa4db9022015d10e2a355a49a0c6017a6f455da64f2c53a4aff71252359856eb35e29489310121025c3769fad6bb160c7eb215c3deac93d4d294e838d5b82d4641eca21b354b4dd700000000020000000001016ed13ecc57f46d6b43d0b2cd002bd06c2066a8c070fde981f2d22c0b1d9088c90000000000ffffffff02fa1eef0000000000160014b0b0ab233a899e4de17a71f6ff01837f669efefce42a3500000000001600141f90944d624a321d430965c12c3d15b40c650c9202483045022100e1555022d0744b1f37dc528762338e4556f1a57b3d02fc0e5206ec730c21d520022019f34b92a8b05cf697c18ace8d0ac5d44bff85e723bcad5ebbef5705a26b683d012103232da341391f18ffa43f16cf8fbc8fde6575cc07e8a3f363d9bca26cd20ba82b000000000200000000010146cfdd056a4a01c936b94b01861ffb23466c60f1982d8673dd0f2af2bb4538460100000000ffffffff02d9ac0c010000000017a9141cbae5e771e26cd84376ec5b06468ce2c0ed426f87f9b2050000000000160014ac04b0f760d1e73ee2e99c17a8c567a629b0123e02483045022100818d0792e052fb6ffcc09a40d39abbc54c645cc42b79653f443f4a9f0d30687402203cf38a4f8e4484f961762637c3b28ab2e8b3e0cdeec80713d36f147c05181768012102a580d19b9aff07394e30e31b3d9dbb4f0584465bb0342b4c18a7edb03e961a9e0000000001000000000103a8e988580e642db1b5418254f8464863e45fc957c8eaa26523a24d07f594eb87010000000000000000355f617b6b6f4a8b881041d73c6ad20686686c97e18991e17641bdd7d5447fb704000000000000000059b1ae8a879eaa6ad8c8452381c0d0236d7948a504ebcab492358935116f73c0050000000000000000024081ba010000000017a914e5a9e8a69180ada05fac407a781831f62d5f29ad875fac08000000000016001466b1b776b9a4eb1c7c4f75ee738e30346b3aa55e02483045022100838824cb8b6135359a18c73d079005fb044114d9ee129a6da187735f7d7b30d502203261152e1eb24c3c9c0c14639a661d48da39e778f3d21093cd5d2415f63edd1a012103af37502d41dd1d619c7d4cc8234390d0cc5bfb227fd9146b46229ea2d8a1484f0247304402203e090ffb1b6d47a386a291f3125a2d00538c852483fb2a4e938893a73f54c35e0220580cf89fe5e516f6812294bd554d48e1ed7c50ece810f1025a49973eae2778da01210360976ec5534cf358eca444cb79e58a936c76be562596c33e1182e905a39ff8ea0248304502210096eac8bf944426604e182bc4c322a147e924eb386cf4303047f9eee520a621bb02201290a2e08250574ad3b334500cbca466c9d592fe5559dc37009d6d444bc72ec901210360976ec5534cf358eca444cb79e58a936c76be562596c33e1182e905a39ff8ea000000000200000000010281f69585d52eba1cdfa241a0decb0ce2e38a93f98a3ad72ccaf116bc1effb6ed5400000017160014dee0c1df150c0acc4779e2cbda0a03c42c33ef39fdffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a416000000171600141be30c874127230cd178136a49c97bff927d7109fdffffff018bf724000000000017a914ffcd6b66a621414946c4d4a5caeacd0cd4e124e587024730440220502826f439983de146a8fa406fdcb8f42a72154ea5e5686c880347e1b8d35d1f02202e956bc70a309de08c79d458d3019356cd87a88ce8bd9f96bbc29d2c18813e2e01210372654f9b53ae4f92819c08f29b88ca8dca4dc05bb9cb2a209454ebc1f98d65a6024730440220749211c4a352aac498d11b9ba1851843d3f8b0067f9eac354e08de431a62bf7602204031d09bab9744f8e2fd480d68cb81ac1480a41672be1ebf9122d314901f9085012102cabd1c83b5635cc621d6fd2782ec63fa74a67331f17e930d0bdef5ad07126f2747a00a00020000000001030dc69871f81378916d59211b8137a515b8b15f2fd05e73952d12df7f690e6f890100000000ffffffff017d5b99c66a937f1add611ccd05d2377637dd538346b2cd545224b80a5242000100000000ffffffffc8c4842dc2a09a78aec7818c8169fbf6049ddb29eed1c519029a1ae5776b3404000000006a473044022009fc2df3df90596176e487bee0012a47c1595b39d8ad5e9f7eb2a6b390f8e98c02201fb589b88ba090301252ae68b6abc10cf0fe6dcd412555f544b2a7e05319370b01210349e3885de72513bd3b190dedbc34147e754ff6b76c2a7a3b35b63bc22523b392ffffffff02f43c0700000000001976a914e703ab62352938f2a6bbfcf7fd43742205c9669588ac3e0b000000000000160014ef73aa3687103f6b8a82784c0f3cbc6cef9cb3e2024730440220433c007e32b6c7b62ee0d3a2d42b024a1b578c5e9d0296bfbb6247dc3dffd0df0220687973b8c89450cc60d70cdbe4056c22744507008ca7d5ba915c131e19f0ad9a01210335c2b40eaf04a17047c80f5bf7a06e97dfabf8ab0968ea2fbd2d2f22223295350247304402201e5840e44e7c3568b515f1a0549b000b2e77900fa6083195b428b4f8acca999e022026378441be952185b3d00ab50f848f77ab9324637422ee9c784f619eb247551a0121033e5888e05fdf88e227a1f6d64c28c4a132b52f857c239cd6103bd0d8ef9e30d2000000000001000000000101402c4c7c64eedbcfffbf37b5098cd479639af7669dff9fb2c3aa90b94a907a7112000000000000000002e2090000000000001976a91466fde6e31af0c3b3d2fd77724bda26c0c9c7e48d88ac7755000000000000160014f559c1be59feeb13ca4a04709aff216f723bb64502473044022013e7485be0b20b216e15f0d694167d5767a53c998e7ca463c671403132f1b88602203e9a5944c087458b92b42d69f4ca274cc91e7e5f7860015d85ae1c3d6bdd79d101210313a6552cdf396b1d540ecccdde9102cda972863af3999d3068bd034ef645327d00000000010000000001018ccca2d8dec844a5b535e16d44fc742dd518cce1feb2103c118512efafd5a3810400000000000000000204850800000000001976a91472ddb20edfc48a71ffe9cf03366c296d30428c3488ac18386d000000000016001408206737ce48c72eda34c3a180c5c4d901ee547002483045022100b59c130a66fed95b1e1cd0a31d1e83da4ad1ff93493fc7e85c177e859f085e12022004a43f1b43162c22d7789b9a3bf030746290b341808d095194ae0e34f013c1ce012103e423fbfa49bdec16396f06be327a6dfccf1756e789552939ca743228f2aa7d7f0000000001000000000101c96dcd85daae49eabea1321ab0e0f34d183695bebe4b99c5cf30da1f5c3d8ab80100000000000000000217210600000000001976a914674b8583e2704c5ceefa555c9f2e7532af8af82588ace3c5a40200000000160014340520c5a0da76d35a78f17ccf81bd779abbf824024730440220392cdd2bc255977db2bd808c0906544d0adfa541e6f2797310005b242588c47502202281d09c8d9ae99e194a524be859afe8bde2bdaf06d3d56f5f04b3a252bfd7750121038a399e0978fcc996dfd57bf46d12740732f60095c1d7a0a09e371a1962c0531200000000010000000001018f713afc7218c4e8fd44aff6aabfd15ea83f96a40a897e5bf470ede6bfa9d4880100000000ffffffff02408af701000000001976a91463f5b6d6b66b71cc5dc36ce174223d342175b24788ac0ea5880100000000160014e348fa4ca132aaa77cb3730661b2d60ecf28a84902483045022100e29d6d0d86d1f3b469493613f5b45ff6c1dbd25978c814d2a213fb8a3c2a74af02202148c3651fea23cac1a84cf8b96e2de7faee04d4b847a45dda8786b3d673fadd0121033497b50b020d3175c6254d20e32bfe52a12ed94b13709189c6bec2dd329be9b000000000010000000001012997f83d883cb88cdab95103d423edb4c8cfb4c9b86974fa191c28f7f2e38a390b00000000ffffffff0280969800000000001976a9142409db3a3d52bd9f5d57f5b48595c1db3b0f9df788acec41f300000000001600146df0e66f72dc90f45238fa3735dcd9e671971eb60247304402200799367f1f5e47456a7169611a2acdf9c05d6110d5ff4ee829c5da4429c04b24022000a8438b3186a62a402b0df47682e9492e689a80a6682e99c26947ef8fdbabab01210234b193146798def6a1b01bd30d118a4e3ee5376e7937847e3e0888bb1d7fcd5800000000010000000001015df19f86b12fd6fc70c4c880ee00f8b4beef13a2ec2f59e7e20865305c70b6d30100000000ffffffff024c5e0300000000001976a91482d97c02b45ac3765fb8d686821bc082a7cf36b388ac37ecb5000000000016001498182710fcbf02020cf156195d946e32111a71f5024730440220085b0911643ea4b112f78b7fa202bd7baddc41cf096fd3152ec6cd99e9abce8902207a17a6f8a4503c3cec57e6d7b01792d30697bdf7a370d54a71993ad7ef3ee9240121038afd83acdcb5e5de6e713c3ba9e2c695cc52088014c89cec504747b23fd0a84e000000000200000001d49e0620193699879654857b00566e09391e9bb218c7555dd66fa3869321ef33140000006b483045022100c0bf8cfa45482a44bd9aae17a3c1cfbabda934a4668f22f57e27259b0fbd5f2f02205be14c36fa468099146c5b3574d1ecfeb48721e83035ad62be67e06372e108d8012103f8c5a77a66f0b77dfeb16fc4982186783b0c10ccf799f8c424b2a2940f027155ffffffff02bb740400000000001976a914bda3727823ce988ee721fc02dd00fad1d5d7d23c88aca62703000000000016001484f134393a570d249acb9b30df53dcbaeb81bab10000000001000000019b2f345c64a37a7e223122b8dfe0545b3295936545af4ff92f11a65eeef393d1010000006b4830450221009e66230ad85b711483a38c6d1c2e40864281c20f516cbb9664334b06a6960a2102200cb6cca25b409fc0fcfc512d34208d1a5438d6f0c134bfa2c02c8c7d111e34e301210338b9bc60fc428eb7ed72eeb3d8ef852128fe8cda5c8a7ae3ebb5223f6c842a2effffffff02a05a32000000000016001414f8557b376227a0cade625f38aad1839e3519d66c7f8700000000001976a9146896a5f2273a9bf9088a660f175af10cf92abeca88ac0000000002000000012b0a80d8cc9ac1847f82fa014e78bb70a070c65c2f0c53f66bb21bf4dc814134000000006b483045022100dd2f7a1bbaeba7080e396d8cb27dd9b3bfdc83bbfaa0b3028f453ce32b1453bc022049d7071dedb1ec1f1421a0d063c7a721506a80ff6913383c1c5996d5d0adc4de0121032aa00062414b104f7381d76cb43d449379f450f79a2a34fb0d384ec4e777efe0ffffffff02b1540600000000001976a914397b4affca0efb52806600af82cfdff04d5394f188acdbe33300000000001600142f788e3b3cfe7fb3880d42a707dec477f72a20e00000000001000000011698ef5517b7add63001fa43d813ca03aa995f55a3b88d867a66cbe2c8965355010000006a473044022041050c7e5ff5be7c20f88a9da831f28e3fbcda157b7792e07f0c10ed9825d63c02200a3d7231122aff9580e25b9f142d3c843dea6673c58f219fdd2f635dda8683a501210223dda1b9aa32eff821f101498bba661b1408b2220226e284c073c8ab97c7c48cffffffff02746d2c000000000017a9147a980923a70f2a38059b5c0c28546c781bfc122887be919200000000001976a914b0b7868177c13d63970ed51c1c2da69bee9ecd4288ac000000000100000001257865e47ed4501aa460dc6061e434413bfe5515bb00cacd40788b073389c036010000006b483045022100b470f78d7cd827b942c82537d12efbad5e82fe676e53c3fa0fd66bf14b9c340b0220070a3dceb1509907b30c83eae848f0fe7df432e7b56bc9405a234f68b12ec2d5012103fc5a9aa7e2336c29aa29a598faa73245cfb5e77980cbb44e547313adcdaabeb6ffffffff02ec4c03000000000017a914390ddf1e32d458a7b47899155b8c84ee5286b7bc870b050e00000000001976a914adc076c6fed5fdde3984739a54053e08fba256da88ac0000000001000000000102d8d5aa5c11a0b3eceaaff49792e81a796a2bca76ca828506e0cb27baa1543f192300000017160014d1948fe4d918461bf708419b1b04c8b45c0c9407ffffffff511735fc467a5c31b40021bf7672500a0869aa551b2536cfe989f42fd7a792382700000017160014b760a3afaaeacafffac35eb4726c61563cbf1f5bffffffff01cced04000000000017a914d799587f78d09c673434817b11e670ba571f52f88702483045022100b49f815daa9a03845ca50684a49c226fc631037f6382e8927b48b14c798529d00220710e5ac7ba9e0104ee382d13ce00b39fb1b1ddbd05cae5bdde804f1641d17fa2012102ff06d392763b9117453579f4e1429a3670c92b9d5a9abe416da50ed2269bfa32024830450221008e27b2462321af212fa042a02ffbcc43421efd5e84a741b77373b17dd3b590a102204fb9d4fd429f3c1582bff39021629af1e5ca88c1a3f001f830ef7aa7eedfd1be01210239518c611d46fbe3b5a9319ef175d828dbcc077f92f6b54d83d8c8c7919ef0680000000001000000000102f21221f3bd63939cea359eca05166aba7662ba8ce20f406a19608b66e3422323040000001716001487a8905c1c6088cec74cf72e6bdd1f909b14f6a7ffffffffafdefdc34a68a2b9d9bd925d4039713fd50ad1ee3c27443aecede293f6e7554f38000000171600149a63c79eab75a20cbcb2a1836815aed2886d9127ffffffff011cc501000000000017a914ec4c0c99a75d77ce4cdd153f512a47d5016c36a487024730440220093e16ce768b7b156698f03d99b5ad71bb4534235ac8e3ad4c2ac9dceca9ed6902206ed6c9d1a029ae24652063f43513d0dc9336c651d68056533eedfa77979693ff0121032b9bd7ff1e9db29a233b5864cf325b44da53dd2ac9d8fb91109ece66a255232202483045022100a9afcabcf4d19ef805eb0f43a06b7690d3601bab301c74fe312ee447092d3bbe02200544ba583d4f9baf1c01fd3202df2223433760845f3cf1bc7430fbe2a95d75ec0121034e92da907a7e067ab17f69d4a46d029746bfd3fa778667aa7669d24dce5bbcc00000000001000000000102e3500588fdcaa499a514356f4563a246e3c0908b8b398af000a4e9250cc7cf140300000017160014f2aea8f7b22dc65c5909bbb8105319bb1be86ad0ffffffffcc5e707e52ca1e05779103d7ae1fc126e11b094230de5a60aee4b0cbc3d5c4e22600000017160014ee0d18a0c6ddca95123e76d8f625ce1daa7b1467ffffffff01cc6300000000000017a91498c02270898d064b8d7beb435f90f0b480688d8d8702483045022100fbd2208ab6f089509f9afd975fa0055c7e4208f6b19be00dec593a69e0ffab290220754157bbcd5e8e17e5cb1c33629a59d5f362f4c7a46e67824fcc17ddb38dd9d60121021b9a94c3d143acabe78e4c4853258407e5da91939277e781f65066505d3e248d02483045022100e66e9e3eb1a3d686dd0dd836a7e6b46ccb3e02df1573d5f44cb8feac8ae89d260220046e858cc5b80895e54aa1c3d6159d44709a8fe2b44bac99c861246f474db0dd0121038ef0520cfef58021f088a3530b42938cc354035f87a6f7d5f68dbcd6d9f9e521000000000100000000010139efa2013edc814ee37e76935888fc0eeddfd3e9e84d901ea3d00db736a902940000000000ffffffff025aad01000000000017a914e6210fd93ee8fcb3500e8f44d86d30d3f2a535b8877360030000000000160014f1bb8ccd229f0af5af3ed7482c14b413df94fff702483045022100b5b4f796c2fe794d9d998011f7f0264f5a58a1f09cc39e16a877ab3c5fd193cf02201844d3bc096746cdf162146246f4c661517a4a8d0e6fefc36cc2bd5d128576d2012103f122f1efb1f798f81667a739308ec70cc3cd1d3925eb60ebd6c7db5d28c2a51c000000000200000000010246dd0ae65a059bedaa7265cd5679082de07b1be8e01fa2d2b0a477ff6871742e2400000017160014644dd00d65412adabefe22f2a65d968543f1abd5fdffffff3ad5bb3f1b74ffdd8da29fadfd0935e368ff50ded20c91fe9404b64ccddb822e34000000171600146a0057a927f5a94c55ba6725dbb9bb443bb1db93fdffffff01c7e91a000000000017a914e48445ea11723886ac13c4f24dd0d65e06c8475c870247304402207ebab23e5d5a5e96ece66fc15b74c6af5744b4d6c7e6648058697ab9b251228c022077ca2e092619b391a43f90cea8d652ad0489d8ce5241e44e74cc9c96e4ce16cf012102132baca7bbec287e064cc66b801780f01bfa4992f092f4e687d8ff06fb7fdcda0247304402202c83a0d1d007c5ab6fc5c29798204ced83bf6b85d4ae80a1ddb0fc0e3ef7df6402204e97f4f68ec1635640fc448324da40bb8734feed94c563bf703081c821f2ba570121029b34e04928ad8b5aeea4b1198da984f4ad925bc84f5a963a590bb8cd8a08338f48a00a000100000000010599f70d3f97dc578f459a0cf86b95db65703907d14b09d97556f75e55b797e0d60000000000ffffffffb1c9f2c60a4c716bb36d8e325bdff3bcc684a125792434f23b6fae665c58ecc90000000000ffffffff798865bb5518a35e338b15ae98dcb099df96bb542bee53f37277e0e287f9b4f50100000000ffffffffd491f244818eb4e120d220374a5fbe2a8961d8d113d5f2ea91e23cca4c8f77940000000000ffffffff7eaa9b6eda8264b8d0ed95af7d8be07a0064724dda0e7289950c528527f45b070100000000ffffffff020084d7170000000017a914d3ed9ebfb65319f87bb0118b2833fa807b0953368734d7f50500000000160014d4c5d71eb0f6960f3a8ece4c58a3172fa20f4f3b024730440220390f25ebd3bd37f3f81999bd0a26be79a067928851114957181c22750e143a6402202f00b602e6776516806f0897ec82308c4e32b31ee9ec4cb610323743906cbe5f0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30247304402200b71d5a86b841847472516f2235a2acbf91e2cf0fba2fe7f2b7bba5b61765e0d02207e2c5c082dd82dffddaea3d8c184680d2a427586ace25a2370c5db8d1e38e30a0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d302483045022100dc15e329d4f5f140d181e83f62e092a0bc441db20d1e83c05565f3c6481dc5ad0220439a1996338f66fba802c394754731fc6bd5ef9ccf921296993450112657ff6d0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30247304402205fa33ea3f2b80ea675839c93c1981891e2a75676c28f795cda5f32ae6a6707b1022002d10054dc44c21bdb8196c20479b7f30ab63b5f894f69e713bc57a4ac33644d0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d302473044022032f60b8222f916eb2f13f300387c8074d9a6d2a43e751299ac7fefc6f760ded80220092681306e159675dcbf90c59caac718efbfe9e3f9a2a40bf39f90b70881dcab0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d347a00a000100000000010588bb76ef35a01a7c5d4fc2239209287b655ce9450bb1ef115fa610a53b45545f4800000000ffffffff303a8449afa4e7125a7aa9f56df8238e7e2a3590b1d1d5495e0fff487d47a9370000000000ffffffff519744b18325602418940619acee31ed8612e758919da61a6007d0108d05e80d3500000000ffffffff4400ef849b117636ddeb74b42dc9e2970d09fe3a3932ef467812e4e4740e3fa75800000000ffffffff39d1e592ca40c1274dbbf7c204d4c2c7da6e6f84030be24f293ffe5db148f6ee2b00000000ffffffff0262cf4e000000000017a9146fad525b13a07aa1e53854159589a583962661558729b51a0000000000160014031e2de95272276177cac3b385cfb409a92033080247304402200bbe562f3b6b77810f6b65343f4d51a3281c7d9f8607a7ba9d8a9c592c97111d0220251fedc2ef4803270295f3f42a0201c532fde442e23a7c74238bc323c3b955df012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2002473044022042d6461f298c395757049ea293bffd4a25b2d41b2ff830bf90af6074b6b46ca402205fa00ca01f1dad2893a7a51f5ead2814a1414983d5cd1735b3b7ff6b1b6bc1d801210225efcbdcf67f77c79c112dcdaef637fa604deead6a446f32ce9624cca4abd1da02483045022100c0f800dee727698ad61d7d8e6ec4ee48659af86eab4c6e2813fb01ffc104b4a1022033a8f02bd410b228afdd14f47dc2b06c46b666a71610f2c892cb4243f873bdb6012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2002483045022100a720b2a19fc65d596f6622b27d1389f29886734781f7fe71b97fb0ea2c1d53e302200799597d36dd721620e7687717df7d2bb41c6dd51f15be5f1025d8e47fa6165e012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2002473044022027e948556a16308a4c6cd0e8a8d5f4968df455d29c2257ddcc31c1655ec723ee0220558a1d49d979ac459fac2927649ab1b8d9c761c0b526e927f7ca335fd32b8aab012102b4776f9eb223ae6391845db0ab36df87acfe2111c527fd63991d26d3d88f6d2000000000010000000001056994101a0d5e7bc52c670788b216570c5936d8350344e00812d89a0e444121e40100000000ffffffff3a9ac96d59812fe13ef0b8b56c181d72e4a8a52cac2b086ff46da3b0e8e717540000000000ffffffff328508dde9ddae61743c8f694a3d810e1ef2b9544c5b8675a57caaa02e94e84c0100000000ffffffff47863cd28eb01f043745ca6278d685889cb39dbf4808b6ef19b0f6165385653f0100000000ffffffff7d5016096b4e119c498433814b677236cf10346f05976771b1c7de110ec511060000000000ffffffff020084d7170000000017a914d3ed9ebfb65319f87bb0118b2833fa807b09533687bcd1f5050000000016001409126b9062edcc40d35493f12e5bda5341cc79b802483045022100e9b6b683ce166141f7c06cc66bc98f38cde81b4166e9774bfa31995d62fe046a02207190a717ce23db95d78210f76063fedafdfe99570f8e8c7071e3d36b8f8c1b5e0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d302483045022100dba43be1c79731a3be1679e9a4093b64bc8821b7e8efd076a5dc03d03a1d68fa0220549c6d80e3444ee44a73984fbedec590d03f7d211a059caf754f49337d47680b0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30247304402201e7a15c1dea8be5a1e5c72886b866f9645ea5887204bcaec5d2fb6b39533fe8f022048f2ad6fbc7c67b0f84b2443595682ccb8e0a2ba92c4dcf5d44554490c9df7e80121028956ac1b7d13f400ec3f156e0fbecfd577e1c1d259c68a164a83ebf9bb9f886002473044022036aa6f1887e9b0c8f99a1752abf19d96d720d184e46576cbffa3a24710e4e30302202e19a445b295377a20c3c0eda05ad808acbf8465e39f3dd29c367eafff18c5bc0121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d30248304502210092ec4e1cbf27393cd12d4c6930cd4969baa96f8a33e38224f551571f78c139e802200857ca8fb1edbe4d8a3a088b0cd920ac284545cd62edb6cf10f6238d4bc7d9e90121028607491cb5e8251fa99b17b210fc7d841a3bbae79c3ba713840b4ba3dc1947d347a00a00010000000001019da9abf11a12dc6c29c342162529a3177752bb451425e18910b9bb495a8debf80800000017160014441cefe68ff31d3053d23c548bd0d0cc64296c570000000002002d31010000000017a914ddb688d2da1464553301eaa854c037f22605672b87611d54010000000017a91465a2bf3f2fa7d712791109afc99f26246e998f9987024830450221009aa02541671f404beb012893b989d6d53eb042c0bacd61d1e025695896da191d02203c41dba38167c5976c886db6a7dc6fa6b65a16c27086830286c07858b99f9cea0121029dc352f19c2100107731d955f929102197d671a3590ce4ec3e151e38e13eeb650000000001000000000101b9bd0fa9e77045d54b1259fe6e93122df5c00de29475ad265afce57dc24a99e500000000171600145d044cc5c5610f78dc687282f5c150897f3b81fbfdffffff0282d101000000000017a9140979c8801f449b1012aada7af23e9ee1ead0d4dc87e09304000000000017a914d179198172187f9b75ec364ba200449751d70f0a87024730440220010116fa749a5e35afedb9d30814d4e612bd2360e8b7639ec073b0a8dbd4d03e02206aee301faf79cc6d473ae4f06c69db31ba9f4645c3fecb5016e6b5d5cf42b86b01210208634edcf947babdcc0ddfcec58d2d2151e3a967b457295a06812cf8b488d8f048a00a0001000000000101eb910fbea2a979f0b56bee878d4508d92a5a3572ff00b9e4f0b5c2a424556ff101000000171600142c131e37bd149f0edae86c5f20bb8b41d87c4fe20000000002902904010000000017a914de46c3790f61e5e8562d101324c30a1844e497a387d058f3000000000017a914cd1ad4365fcd95c9082e9ffe59728e2c54f84132870247304402200ee62113a99deaa4efee89a892eaab52e2a4dbfef1858fec6bea543cf393e5fd02201faca5fc22c5503852b43a78f03f4a6143a6c750e99620abe300bab6be958aa3012102d0b759f43404c53410d908af8334577b98535e7042a7aa673b88d937f6ff8c82000000000100000000010104fb82d3adb1267670889e2f8496b50fc87c8628605260cb9842a2f90ecdf30c010000001716001491ca122fd33f62a3ce3e9da71d0e7558f95484d20000000002212a11000000000017a914f79bbc710a53884306b40a72178be06b51921aaf87541800000000000017a9147e2477cfdcd479862733857ec5c13fa813bb44ce870247304402202fd09ad1d33164858d897c825c17e1f49f347653863fd1855f369f7209bc139702204bda20763dcc9bc6c23a883d7329f2de359e322b12943c8c4ff8317efdd58eee01210327992febab0a64b00ffe82833953891b4402a8c0437bda7cb895323912ef2b060000000001000000000101cd544d84623d875eed891905935b11dca5293333c784a11c0b5989f5b2b7888b0100000017160014870bd6e74de38f60f9f65c2691d14b1b5db15303ffffffff02ecd909000000000017a9148d155144dda3227bdce55b93bb5318bcd35421e187530126000000000017a9140c17a74f2bfa8ee4ba96e04d708fb83678c68555870248304502210095c73e55ff3bd31a744ddf35c52e36798cf97df54872af68b6ea4150a6955abb02204cd1c8cb111f8c62b921591f66d8932ec8dce894327715c6121fd345c86971fa012102cf27b4635abaff7b9ea09bbeed79ab49b9e0fbbc8a0845639ba89e7aff334bfb00000000010000000001017616b53dd55bd5784fa3292f54a14ea361711ffea4f2cf047f075199d79c3c490100000017160014ba877e7520f1906cc4d567ba4a53f57d874cfa47000000000288d910000000000017a914fc94f4fcd462b177b30ae0c25c0f3539cf5fb4e787313278000000000017a914cc9111d3a5242e23ee11719c362d73d4975947ee8702483045022100e61e90c264a411bf73d690217bfc9c47fb61224859f90def58a4fadff2df98b002207132e66befcbf616cd5745d1b9f5c02d0dd29498a931ff71f054354daa1b9e1001210277d3657cd155615716be6060e76df6133eb13a4be5b367a891ad94ba725ffbb80000000001000000000101f925a451a634d65bdd65c57a03862147d3187e388900127b99de287c595e554201000000171600147adde77145b8cc89b1be55a6511d2ba35c60c21f000000000202fd6f000000000017a91446a902446e8e6562112b986249871542828c3ae487094abb000000000017a9143ea47d0567df1db12fce97181328deb4265f32928702473044022040eeeaeaad9bb03ca57eeb533ffed287d8635654b8b7f7c8bc44d535b8305a3102207a1d25986eddeb76edc3882b4bfd52539f35cd5b0bf5fe9a1feab165a3e8cc7c0121026de866565eb8bdb50638c058a0013c5ba00453b101d938fdf4c374e0c50e6d650000000001000000000101b02f61d0beb5669e72909956e0fc07d0d15c9378dc84ea138abbefbfce33877f0100000017160014dd2c8a995e63724578b0fd0fcde4d5565b84a141000000000237c90b000000000017a914c276bdaa28d76e52eec78ebec10d153c2bb96226870ba21e000000000017a91437546e307d5394fc39b88e84fb3a6b74ca8ea1c18702483045022100acb361a184165f2b1c06a0d39410ed529595593f5740f6d840146806c5f95d34022002c0cc8e1150c9e83fb193ef828d75bba5ed686004688259378447a00d141d9f012103085215184a56416f0957c13143fc509d0b1bf0f6e0c93f831c35158bc39b7d8f0000000001000000000101100334dfa5fa3c4fe7bddda988c2bd1c324cb8ad6692d85acfdc66b42f32691f07000000171600149118aa85b410713e8b3d9ca5f5083b68ed76eeaefdffffff02389601000000000017a9147e2060eacf3ecbee6bc2a0304d2cdba448ccc3f787f04902000000000017a914db836d1325befee7e00eb189ab80aa7a7185f3ee870247304402202bf13466d95ee18da71d1a15ab8e419696cbd8ccfd9b2ee0ef0b16456be67b0a02206e2eb5c91f1a8df36e794b0fdb8264b42dcd390228e0edd7246dff0059c62d4d01210241b40706c8437d30f427fe0c65092a99e610103910a3631a57de45ba011d253b46a00a0001000000000101b5d8aa3d2072a02c19c9b1a8e00e40be09738bbdaa7cafd3bda40b0a726f367c010000001716001490df1f91f347faebe20b1e5ace2ac12ce41c1b31ffffffff02fc2703000000000017a914058390916e3787cb1c7a52692ab50a25561f336b87bbb5d7000000000017a914ccc140980f7ba6c4e3ce443047d88bf8740189918702483045022100b67e10b21cb510db15ad1f625a8e88f4d5bdb1d6c8c621e6020a7991714346fa02203974885f3a6e96ec041169368706c0cc79c4f9088f3ee224026b9854fb2e98ae012103e9bb8ab3d4042c6d27b1ba94ecd0445ae2ba18abc5f388d1edc97443d18a5102000000000100000000010107175616be18836d21ad22df69512e56a3d593e975983b6cc599d890bdf962a20100000017160014f9a0aebd69b408b903b121f0730f8ab67d07b2bc0000000002c77800000000000017a91497b205bc6af88ec82dd31ce36e0384bef3c4b702874d5500000000000017a914744b45af708643a77094ba6a94638c64c0493e7d870247304402203ede23dde8060f1be288e0c6f70a7e79fb7f0142a86442e5ed8ec70920c6772c022008f96eaea6e859f18b96d4e790cfb53c1ad7aa7196e6f515c9f2ec7ae5fc700e01210352502e0a0ecf2704e4f781fcad0f37204a89d2e6157ccb110d23e50e81bbaf8b0000000001000000000101c83b2da45a19b604d5249b78befd2c6227f20fa13e3f757205032920283f37af1600000017160014827f293f22d4d35a5f8c95f89c7c5a471651bb07fdffffff02908c01000000000017a914df610f3adf1b18e2f8d270c71ed54796b77673c287784c0b000000000017a9149d8086a42d52d66781a538d9b3463eb1f7f171c4870247304402207cdcc870ab8b20563d88c1b411fc8bc5a74c76600d2098092c67a91c55d5d1aa022031856450dcc4f9f4c7ec5d67c9c96196ebb860e0d8b45002e7eee1529aa48818012102979f2e0265b1c7c892ad0131ff3279ae4d47c4b32e87c33a4eb4c9871ccfeb5a47a00a00010000000001103ca3b9f712666dc6f2d8749de913ed9c2d9a91c8d35501bc8a6681c1d178a20d22000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff56e772e755e7bd981409ec9f03a3b3b6663929fd8dbfe4f1fed529f968d73e0f05000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff4b1dd2c8362df900d008ffcc37a62be17859622ec2f7c649c6ef3c9ba15dab2400000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff8e83ac16911c4fecd4469073b9116a868090fd8f4c23d24dada28fc9dc491f280500000017160014e2e7c07c8079b85ef7f3188c4055f401f6217975ffffffffb0e29a22476805a571dec36037bef31d47873253b02cc0976213246665ef713104000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff048a1e3d459db9e5ad1f39f973d2e7d6fa725ae78123103dd23c519c315c8e3b00000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff9ec553d471e69504dce4cc2aec22d68fbba123b2750572bc2ec208e7ba6e0e4b00000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffffcbbd1cfd01f03f06f48a207efc9742e22c0bee910b1c9b9377a44d4980a7466406000000171600145f042d257fe2b2ec5613859c4d7b7f24c4a013ccffffffffef5704ba001eef7e56fe7817f8dc19325e021b98c646ac1769197545833d3e6e01000000171600140f5e3e041e7065396afb4e6fa73b40e66712eeacffffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b1127500000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffffc4d7c561e22f5ed851d182cd39b95caebadaf2cc82292ed8790b16f532b9c29f01000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff78f8a6a45b9f3a6d38c2d8dc660934b666b13bea2273312d2ab119adb0adf8b402000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff8689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd04000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff49307451403b5fdd3cddc2da6d17e874a6573a2ad0f5a03af03f73165a0990c800000000171600149b679ca21d423c604c6d6f45b92b04a6f0259ccbffffffff506b504455e6c7737b798ccfc5c155f4db519f4e8ee380cdbb513fcc6c20e0dc0300000017160014e2e7c07c8079b85ef7f3188c4055f401f6217975ffffffff67977947bf09d47a9f2af989a91b138535fbd21acf677f0a3963f39e6031e4df0000000017160014a4180631d0d4611b7bd9f60ce0695626a581184effffffff01630ebe020000000017a9149aa89177d9aabaaffa19c638207e1bae4bccb2d58702483045022100c00d9bc1f269719655dc03aea135c5d020a2afd5cefc451ca3d1d266d4fcb425022009640d685f6ebf6120dda7b5c5b108c0d376c987742fae37b402dec7ef6a4cad012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100ec8d1a09745d2ce0205601fc6bd920c6d243d140724afade079adadae41406e702206c8b638e7cf3dcfa3a4a7300899744240fe03465630ddd1737ca4d12885752ec012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100c7a07324377e06924c8994834e813856aeda9e5053e8846cb33febbd75b5834002207f9726ee5f1fbbbd965f968310035da2fe4b1507587139acf82a592de2215592012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100cabdd796c8495c82004ba1ffbcdc91df03bbe2b75e9ac75f021f258c0a1a15fb022042a59988d3e57e08a827dd5e359c42628439aa6a7fcb7387e5c3b41123fb99b4012103075318765aa6da8a8749a140b3377e61ebce2034c1d58dd493f135b50096b28f02483045022100c0c32daad90b097862decc9c4499f5f9534b42439fe5d69d679d6663a881a7dd02201e4569233adbac1084bce7480c54246f00f2e3bd832b01190a9387eba039ce79012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02483045022100c125ee419fab4b790fb619bab6ce9cb9716b4f8a370483ae594b96914468e8010220033b67b0d30aa8ac84b2ef564a1cfc9934e8ccca080cc905340c43b1b37e6cda012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022000e10412297149c918891942b93ac76695220910ee285aeea9834abc1df2750502201cadb333a3d99fb5792518889dd34e2658994562952ea6abdf2b6e7bc946759d012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a0247304402206fe29c733d69ae7e07ba5ac9515c12b33e29cb835e48c1e961cb86605d7d6be30220635e9523b7c10223325cf45e370e51685996d5e1c2a054264d15ee503e2acb470121024d1365d5d94bf7ecb269f20e583c922612ea18027cd62cc893542be4bd8abe330248304502210088f8494516bd6f81202a3bf07a467804a5d7cb7928ad6f6464f7575feb014f6d02203ba5912c30edf9e70341617cbea79aa7d9647f28e0de4ee4dd387590772156fe0121023a9968a4b863ffe3974e8163e020436bc7af2e117eaefd3d6bb9492c9cc178bb024730440220146df3ae02346d7755d81dc25f6f368b1a6c308c52464fe4b3338c5a22de3d8d02207d7e6f18aa47f3fb0dbd543b3debc7d338cd513ce92d0d0f56016e5b6cc03871012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022029abb86bcb5b3eb8e06d9a845e16c55a8287d7daeef628a6549ce1057dc947bc0220729e1bb8d9bdc7c8a471cad784f5747ba8eef2496f83fb73d826dd8d9d4e88d1012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022030256bd7ddb455bc071db234f813bdb69c497b58ce2de71d376c53eae8658ea30220028b42e5032ceab7f64fc863b49f8f70f81497e71de54c4033b9526076e1f9f6012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a0247304402202b49996868edbc5e63c1c20c334af2df026da25abb8d3e933bfe73f8758efb1e0220215dd1c289babe3d0720f870a76854c0644e18f7838a4b175e6ba2c221aa8f38012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a0247304402207273f3d8065fee6a5826b713a6300abc69ad9f430762de1b30cb821c3c9b55b402201fa1f5cfc8939609ba5dedf76e76afd2c4ffbcde1c395c0f3542bd590551c5d1012102735fb8105d46d5cf71b96da18134992fddd6e1961962852f5aa8aeaac921e83a02473044022014294e5de65509edbf550dd1e53b4f411128b53c5865c61e8cf473abc9d6e08702201c9f20c9ba22a2c1ff31ff0b99994b2ef6c81b4be1a8e07bbc1263aca1f71456012103075318765aa6da8a8749a140b3377e61ebce2034c1d58dd493f135b50096b28f0247304402202cac3a4da0c190a7c6d51287fd2ff7bbd8f35ccc8fe9e4120524189df45a317e02200b060445b5250301f2abc45b7c4232f88f9ee68615215e6e431285ed4914e94e0121024d66c487558614161f337bc84ae96625030d9bcba544a26cf5e2498f731572170000000001000000000102bcf9a969f870e830a56e659014d72a00bf9f27958777faf9dded2342ffc7361f0a000000171600147eaec455269a540ec1fd03512420fd2258d880eeffffffff4c9d79cd4a2c5513754066d890f34f75cdb6abbd0c7c37881ca15efdbd29553800000000171600142e4a4979696bee7d8ed78a87aeebc9d8a8507bedffffffff0254d425050000000017a914b7b2258bf2b5cf0f8b7b98d682fadbe0a6babe2987385eb0070000000017a9141ae9824920cac8474e659f629d7ecc479aec33da870247304402200a9cfbe275fe779efdcb7142b6b323b240145c5680b6fd90c75239144a5f932702204bf418b7de693184b35e6d58b0b549ec10985bf3a23cd6226e7b121fb7456e950121037cb2ddbeeec174fa94e4691e0409fcbd7cde4bc73cef7f6123ccae96e8d216ff024730440220154266cd561436ee677c62873b4d898644423f16c98c5f9b3867c50fc7d9fecb02206803dd44463c0d03efcb72c054bcdec184ddae2f25427e086dd430c5596d7f6901210262f86dabb2593bfbb15aa50105e69256900752cb40fa6cddadc56f2a477b13a20000000001000000000106235d74103c1700816bcaf927da7d9e8a3fc0c8aa3a76d9bd8ff815fe28116f160000000017160014766990f0bc0a1ac1ba588fbd67e3d394d5d28204ffffffff67204573f5fd81eb0d6441ea19d1208aeeaf490a58bae3c53b912bf451fdc7163e00000017160014fe3b6135200be446f07c1ed2eda07072c5a405e8ffffffff8d2135d60c5dc553e9d1ef842c9bb11a9fd8e016d33fade544c70e7c5b07949e00000000171600148e0fddc5bb4cb55edb2829ec45f949834b16369fffffffff004ecdbd070b5b9dbcc98036e934489135205375bd8499e18a1106dd43f5f0f53800000017160014b81f36b2db9c7fbb6b1ca9b71dd778ea072335d7ffffffffc9df2f405cebc5f0071793deaf1b8084359af5477753b3cd43b5991b3eee1df607000000171600140a9fecbb95aedd98a4593697c85dd7ead00a8be3ffffffffe72309331e766bbd693a85a7957733062d5cf4ce8b5ac4fc0d85d25fc29ff5fd25000000171600145fe0f5e628d331b26826838b44f7975efd3f86dbffffffff01dce6e4070000000017a9141ae9824920cac8474e659f629d7ecc479aec33da870247304402206d758db6c8161d45af265aba9ceea43d4278bccce56107d7072046bd11173ae702206e6ca216dce66f6a8f74ec8e2ab1a46c604addd977c703e4056e7becea7266ac01210214fcda8138e2a0573139e7215077b8ef3e97197f303a7b0892230b813e6e318c02483045022100f4ebbb648404b86f3abcd70bc0a8c1dc529614de84ece9b202b1b0b4da409f7002203136b5c6e07b324cc1c3237839ce0e768fe31272b3746ac8881b05db77e0be900121020f6b52192b5830c765bcc9a27012744fc40d834dbd5934b782b9fcf60f6c4f07024830450221008adbe11b0ecaee18ff0f857efb7546ce806b6bf3e81670c9cc6fc14c3514ab87022013ff6bfd1addbfa128031d64788ed6d96f38087ad46dbeddc11cc4761cfbdabf012103967a110bb603c0c9389e1f294931184b35e17a234fc17bca7e09272c5c5454ba0247304402205437b3a3a75d7493aa121dd4e0f1ef8545f069583d7ad01f9fc3c27b5f2abdd20220661d3dbdddb7f3fbfebbc6e19197da2c592ede771fcf3980d06a232cd6141d9801210292e3f9309b0b3da9966a429272ee19f2cef9d2dce8934a9dad0c6da7cdb4137e0247304402203979dd273b3614cdc175e415e59f1fb4d6d13117a501794d36b6e899d369e6e702205a06af08197e99b22c362ce7d323a107a6ce341c808520537eba3fc161a5b54601210395e43c5ba53dc4df3fb68aa3100a9dc9e6450c6aadbbe8d54d17796f62ffa74902483045022100b5f7b8f863f0cefeca7effad31a5cfa894fc851a5cf2780269f03bcb427d9ab702205ddab5a8302cb0215c135f4383ba33abb3f1780c14995e4df3b1cfb71ea11a89012102facfa581d2f539dcd6fd2180985403944b9b8ce906f3e8eb6fcf1d9437fe4ae90000000001000000000102ba101d470892fe991c5efa1b7e68fe44c0dfe3e2709be09cbbd4c525379bd5ac020000001716001435048d0d833ded16a5e10cea020e9a5f922f8f39fdffffff322361c0ebeaab396e27a36b873bbce43efca88e126b556e83075f30643c15ff00000000171600140952cfe0671e5eb526bd466d0e4de3ac42e27866fdffffff024f0f00000000000017a91431625e7c6afca364f93b04ea27f8c4e1b90f840b877064080000000000160014b9a8972085abe757891f416b37f240a74bdb702b0247304402200e3c72de8ad278de2f52befa6254e6295602a8ad3674ac53af56e065fb44c4ec02203b12c62ff97b19edfc6501be2ddd4181b06f1a46d8b5e101c439d0a76c6db2db0121032a880ef8ecdfc2a7cc011e5d5ac94f38db55b56a83d0370bf72b6fe7326f2acb02473044022018a96db826875621f7aed6d38c6ad509846399c7b75dbc9cd64e39b76a5008760220300973cf965c6c46c5af74b087a895d02d8f670b10b07c62713cd9db2080aba90121037fe4b88712741841461ad937bfc580cb0a186b4cc43dca1fac94c1c85736b2a100000000010000000001024837ae6698d2c09e8963cc64570edf1c773ed69c0e6626532f235070196a753f000000001716001496b24fd78e0c60c941614cb59bc6f9d9e0e3791dffffffff0bc2015dbffe40a53b8512b5477317ab8a2e2d391991cea5430aefc03f8b38b401000000171600143d6a0b0c364bc1d71d8adfbc0ca6310466911b70ffffffff02da3e0a000000000017a9140e8f395a8f992ccdd0e785763fe98d2c4fb3276f871f8030000000000016001435c8b8655cb6a69d0a33e28dcb6d47b9a434d681024730440220615825af1f87f9d6bef3e7dcc8584529246e9b320c0764d33935dd4b11b36f1302205028aa42b953a3a41937e57fe403a1268a44b2c8ac84bdf72bbf2f41217402b6012103c8068599c1f1e49b3d27b963ffebca1510ed4793d7954845dc764d7b7f48e8e90247304402202926cf2ea134cda05167d9680a9820a1f7ee695121d1452bbd9e907f6d0ed12e02203416c496202cc40ed5ff5cfde5644de37670c263066a627b1a36f02632c5c0b70121028000935bf8c70e288f98e1c262c93c23386659b802db462ee20ce91b90c4ac1a0000000001000000000108c2cdbf0f1919a3c7f86fe349121bc5fa031cfeb2729115ace9a5968ffca9f100090000001716001434f6b9c447d2724e6617d807c460d5a543d183abffffffff1dbe7a64d8d745c3ca71695b4df373dbe396cfc2a95aa32f482dda31908041160700000017160014a3a05c19226b120401ddf3deedae476db55adbf9ffffffffd91884c9edbda3e096a8c51c87191f3332b75812b40b1b3c154dd67c2517e3590000000017160014acd82ad41118b7e71008c633945e989ea761cbbdffffffff2e6469dfafb1993ffea2d7a70e14a85619a57a3156ec4729ee482ca1ca13c15f0700000017160014f31ee0592eb99158ba1dd75f6b3557722fbdc3c1ffffffff8d0976a73e7b35c6590a98f9000081a662c3b2a88ceb02d0d893765dee8ec59e0a0000001716001447b099e583c47782624adaf26f58565fb5e1c7d4ffffffffb959873dfc30bc8a2a5b1c4529761274d03e253a476e705d8f94f331512ff5b70500000017160014f31ee0592eb99158ba1dd75f6b3557722fbdc3c1ffffffffdfc9769d7cba14ffb0cfa0f7f8d3bce3bc98c7dcc244d65182c7296dcbcc6ec30c00000017160014fcda19be9bb23202db5a8c09bb1e6fd977bd01b7ffffffff413dbdc5b6156a63399f30ce1146dc7c71a63f5e32602af1fcb593711c57e0da100000001716001455c728c9943cc44457651542b991d54ebc3eb27dffffffff01a96f59040000000017a914684d2388fa75d3c932e75db6c4c304736616a0e8870247304402206596638e83e72794a2846786a0a8065fd9e7a856ab2f83507de45a6088f129cb02206d58b9d8f248adec016e7e168cc7074da8fc77f7cea39f28946b36536ee1d27d012103b4b8f52755ee63c1845a36b7ae97054f6e906fbd001915c7251716042a42fe54024830450221009958cd91081d683e9625b169fe1e0910238ceeb58d438aa49902405cbcbf9bcc0220343cba1c31d0c2b95b439c57a58f9b6d344d23c79c11633368f974a37e05553501210274c835c15dfccd0c93dd13320392c719817a681df2ba15a0db8e6e1bc9a4319102483045022100885df3f939fc146df57c5f0bb93b81d58d633d32a6bafad03072f89b36cc31330220362d7b961116b92865aad083cccfebc00715484f54dc73943be11d7809e6579b012103d1f3e1f97ab731285a2fac22bb65fee8df27ddcf74428a022d053619b792069602473044022010ebea12ff14b0904b1399d95549ccd586ccde6cdbe9dc029c664a33d52cd9ff02201c88b626be63c70dfcdcadbf0b1203621d5147ad91ccbb00bcd0ce437d2298790121036179dc5228db52d45dbf800ccf08118299400ab2743f887dda1930f2bd6f9a0a02483045022100dd10b39895d60b8290dccd86666c7d44530ce9316f1813d20736a8e16586d0e5022002a5028021d19cf8fc078c2d6763c07dea374f8f46a7c5fb79afc3e4825e48c7012103ce180edf64fe3e71d17d533bd394114499a0883f9428fa0180558358d2a35d4702473044022035b5a4af5c791ccb06767c9eb18c92a524023c143a35fa23b9e8c1c03c6c6eb902205c0c41b8b24e28b09a485dd0e7faecc5d22da31ab4f0234b594eab6879cbf65b0121036179dc5228db52d45dbf800ccf08118299400ab2743f887dda1930f2bd6f9a0a02483045022100faa44f474f20ff5188188d342671cdbb278809c83ed20b58e06d29890dc72621022078bddb46af7c992d6fd6cdc3acca719ab60a92359eeec004110d79f742ae5715012102547c2bf2e1de76dc47efa1a1bf705ba43affea5b9338f582a2f08671a2a30c5a0247304402200531a9fee86f13f933c54386678a06af6eeb69b91722570c3bb87cd534d240f5022051f3a4224b7060b659e52dafd85d478e69cb0fdb62ebbd16cee95b372760629f0121023dabcd6f67422eba4d7b8191e09ec003c4e6050ad9eaf36a04561e5c774a326200000000020000000001023b491229cc79e87ab9767c589de167bcadc166ffd53589cc9400b53dbd807f56040000001716001482f4e0a69e0584768d80c6248f5490a16f61ee6ffeffffff2ad5a648b3b647448ac087fce93bb0a6f101aef53afc4aa07fc1e8a6d87f94635b02000017160014ae2557581c8d9ce125ea3a3dff27507c3c952adafeffffff029a4b0100000000001976a9140f158a7c91d760cf07e5a576c3209f95d78cce5888acb77108000000000017a914fc6776dddaeeb85bce777cc975c334494c35e88d870247304402206edc33c5611dc6455b15716c43af76f9f7f7dcce9db92dd73dbb06e9bc3d9ef1022076406e959deeacec1315589eb1f179d21c11802cd49981641d84f9685c9549970121033c7421180ee7faca08e5aff72316e295cc775e7ab770e1e69ae7ff119d544b6402473044022047047eae32b0f176753f9cf7f379be118767794699a446ca5e50c1bddd4cc85402200998aa3dd53f3355707eb55a778068537d94b199a39e33ec7bfe1c1db6c5439b0121039550b790a670395cb81f85273d07682937d1d8aba9a9750434c04f748766509648a00a0001000000000101181cca9ad1094832f4d6edfef0886fb3bf716428b9014d3d0bc36c898352919d0000000000ffffffff03881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d873fae01000000000017a914b00a58465efda6fbaefbea9595232141044f900f87370609000000000016001428f7082bb964a4376cd52356e8e52e966e8e8a0502483045022100c5ed195d300c5cfd71721661f465be44ca9adb45e59b158f78a9aaebe0e6d27b02205818933d959aa6ee54168b64e9fb1e6ab964123daed70c9394a0dbafc336dbb8012103ddff5a2d03bba8c1cbbab4380f66c21704792d47607cf44fa4ebb68ba35941590000000001000000000101a3c8084f440de5b0cd1b52c6b571b2f0a6c74f9b145153b0d48254346536b9600900000000ffffffff03881300000000000017a914fce88d7650c7b21bb182d44c07c0e882449cd95d8739d510000000000017a914af04995d140909ce765403ef693e0f3181b4413c8754c44400000000001600144b3e71e72cef83ed3ffe79664d85f906532b930802483045022100c3a55c2dbdf37e7e3d4fd5c573c276df328f0eb8fbb8e1b0f3d54eaaee48342f0220076faaf1653e71f3b4012ca75f1e7498d9bdc3563ae86fc092d91ae6da068dae012102c1002c0a0adc8a7ed1c296857015bf12ce20a9f6fa110aa46fce64c6de845f7c00000000010000000001022e3f47fa3b9e6655863eb111f07b388468e20c150eda90305aa21afdfe39d616110100000000000000c05cd4e6785668aef6f16766431ab96e052f874f3b98194e372cc4ed5217d336d9040000000000000001b76318000000000016001439bbee5b28c03da7ed58bdad468665e551faf5f1024830450221009bdc7d0c7929234aac5d95a343843dbc4fd0717dc34bbab48d36740f5aab7a800220573ea7274ffe1fa6a9f32ed4987c85eb3b38e81e6d340eb871ceab97d9085644012103261ea7dbfd1723f1ef61c6a4cc0137ca8d56bdcdfbc2ccc6d685a9cfac8c096c0247304402206fd0ddc04420d16049c07e2aab0e32aa9b76e3859bf435dccc384d49b26b00f1022044dcd7c26d8373c437709bec16c1703142bd943c7043dffa076162a9c98d2553012103261ea7dbfd1723f1ef61c6a4cc0137ca8d56bdcdfbc2ccc6d685a9cfac8c096c000000000100000000010866eeb4b9d7956c9808ef035b8595dca88e9d4b665dda24ebf4a934950930f9020000000017160014a6b2aac285e4d4aeeee55460eb7b203ec2820d6dffffffff68c89dfcb366f5307ca2b1bf4262c71ad314d2ecf013530f685e6428bef85a3709000000171600142857e371952618ae9a00a433dd0446edc2e71742ffffffffb5042515d0c953d4407f587958c282cd28b1204dc0630d1dd3858b3d59d8214e230000001716001437382c6137e92c2b9154fb6c15e42be27cb692feffffffff16eaa3b3b0d38fe8f1bae966f1dbf1b2613f79b4ec253ed314535faf22f2515707000000171600140cc55378ac404efe509d101ae8bd75cb3eccf217ffffffff9d72f9815cec927963f132ea970d464aa3b44888adaefe911a58427b5e33855c0500000017160014e2a6bf3284cb816d8d88ec6622265e7c0d800df5ffffffffb7a3d924a342e8259eb56baa12b420a9c248aa20e1428695af2ceb4eaf39326a1100000017160014e2a6bf3284cb816d8d88ec6622265e7c0d800df5ffffffff6b7b48630848cbeb7df1505abdcf1b691f8770eea8f622e98f1fc8316497986b000000001716001437382c6137e92c2b9154fb6c15e42be27cb692feffffffff6e85e5769ff4d219dc3529bebe880cbb81693205148676ba9935bb61f99ea6e00b000000171600142857e371952618ae9a00a433dd0446edc2e71742ffffffff02ed2a5d000000000017a914df6384ac4924369539ece6d6e932373409c94873874aba180c000000001976a914ccda8941e697ed4f2f317fd64f380a201e58dc7b88ac024730440220213ed5335f738568522d09cb788ebd8ebba3f4b02bed2b1a2761a6cdd0f8e74a022032dfab49bfd002d3558e805a14ad1d4334a86419e53d784db99cdc2cdc7b9c370121030b2d0c662418a3473395d20d38b71e62cd0d89c26b572c536336634ed8946b64024730440220606412c827f11a9463660bf37280156d295fa798f9ac55f9dd542a1e8bd6a41b022039b569f33ab780559319599bd04c8ff08fdcb6df4293cfe122baf4d952babdbc0121025d3f78b745ae5d1221eb57817f8bd16551ca4f112e2de4f788f2c51afed1eacf024830450221009936f0567973fd3ed7db82ddb38fb14d26fed2d5ca6194cb9fac7fec096a4f0702202f6538ac1f10c74186aa3d2ca537baa3b1790b265d56085b529c12a41c7c4f4001210344a5897b6060e7c66f4d7694326a5ab222e2ae4e7fadb9f45f8e4e906b4ca51c02483045022100e57bbe6d32485c24ec547f14226befb657165cca00e39ed316b2e1153cd30e410220116d95db0d5a83998bcca878f67360eb46d1dfcc21d7c01b676472af189295fd01210248984a5b881ad1ba2b166d5a82576f7fc255eeaad5cbf19be80be654cfbb066602473044022009eaaeaa8c18d061a47e96d136ea92a21476a585e1308fb30af57cd6ff57438e02203175bc0183139b900ab47f1945d0bf13c53510e8de0fd3d18a0434e234bb2dd6012102b8559f6297f24f6014a6e653391af8ec8d7019bab8927bb06b622f399845fb1a02473044022051defdede8848a7a2353ad56fce7f866c4dc6a600759507c669d9378baad1c1902206aba44d6bad2e8fd196005abc6236983e2a05fcf471ebffc9a66767749f08c32012102b8559f6297f24f6014a6e653391af8ec8d7019bab8927bb06b622f399845fb1a024730440220705b72912478c162f00fd23dc577206e6d627e319724ee153e5dfbda811e8172022038cbe0d65ff8b14ee3a27e1dccaf13cbec3e524117ec8dfa20dde07d992a96fc01210344a5897b6060e7c66f4d7694326a5ab222e2ae4e7fadb9f45f8e4e906b4ca51c02483045022100a3fa7602902ac166dfe4317e247b194819c139fc6780defd53b756a37866f6ac02201868036e054ef5776e34f5cbfcedde667fdc1ece1803e15865fb5d39f4774e000121025d3f78b745ae5d1221eb57817f8bd16551ca4f112e2de4f788f2c51afed1eacf000000000200000001144fa160a25efe88131525c6d05acad52396259d9074ab8c45232a84cc96257a01000000fc00473044022047cac1ff9ef7539d5e94596c3513c7a9a115c721130a886a83176a5cf22884de02204493dbecd86b61bcbf8805fb59dd70b5f2f72f3b1480807dc7bc570f4a319b1201473044022077e8093ab836d7f641ef48bda540bb98fcfed33facbcc1df7cb117b6c21b0259022022824ac02772006840f8cd7ca1d22ccc4c3ec0b76a05e9dc2cfba276af3e0a4f014c69522102c7b9525729dfd92702dd28bdfd4477e005cb023c98af0fc7ca994ed294b22e27210344ac5838131b30aa72246816bce64975c8de5ae309d1bc49b8942ec869ad4e302103c52d4daafc59ce8fab8a74a0292de319fe2f6226f803ba509ae4372f4265219253aefdffffff026a2008000000000017a9144bd1bfff7269b2d745becc8647e2e39ad3e1620887426722000000000017a914a845596702e75216503f110aab2169b44e92c6238747a00a00010000000001036bf57d080e81754200c92cf131b7964915d8a73b1022b871b173c840f61aae4a0100000000ffffffff18fc18acc62161ea6c8b66a8d183e88106b1155c6160d4cdca609369bee7f2680100000000ffffffff2993394cef221949400bf9a48a2b32868574fdab66f3c1bdb8bcb06f94d082570100000000ffffffff02803301000000000017a91414a1d6f15d28e2676920e145f642cb9fe764112387bd130000000000001600146546238487731a05330fdfab74732bf138ffeadf024730440220625f7d24d224655c42f2939baad17d431d3f89868e33de91e973c393f916fbb802200e18d5d8377b22059de71eb5a7f53ce9db0d7ce9654301b94f4da1862b84a09201210236faa8edf39257d39662abcf70f3a1e21a6fc01ba3e3cc0a8305dd0ecb13998d02483045022100e1ffcd32bd28e799bb23ec294728099e403a3f3141e0246788884d47ae023b46022079d92d19a793e3dbe04568f69eb1a37f625cf770ab5e5fb368a30e18d66fa6060121035686fe8bde8052606a47b153e4746a13b26936507c3f1c5608ca3969a64d4bbe0247304402206b4d475bc3c8ea37e9a2e3d6428d6a8a5e1706a38a4e8f5e8ac98ca45f5f2b7b022016cb339699ffaf4768661e2e89fa198b559daf037ba0a54852810b895f0633d3012103636c2003dd3f3d8882bcb65b149a2933f892238b4e8c3480df9f08bd631e144b0000000001000000019a9dda5c3dd0d9c5a10eb1147091587a5f15eac34e8b71f5256cd1b21ed80aa7040000006b483045022100c6eaca04db04d9796010bf329e71a30e53fce1e2e24dcdf266eb1843e3cb320a022037e008c1143509f95c44cebe03845f398fdcf76b0df53cb486606a7895f44d97012103898daf21d93485dbc20403ed293af473e36a83ef2ffa6a414559513abd5b87379bffffff01425c11000000000017a914327104ffe19f0d6845423d47a38e3dd6c0dcdd2987000000000100000001094b74a06877f3d26350bbf555183b9be5bcec360e165629b280895f40751bcf11000000fc00473044022013348a20f8f0a9fc3dbef5a0c16695e39c7b7567408b2925f3dca0ffa230d2d502200d20c952f62791be2b90a9b695049067fa86d940b305f3c93b3ce596a8709ae40147304402204b14af4812fac4197279e5722d99f4a111f981bd7acb41a390081b89442b6c9a022039502db1ba73a3848afb1410a69e020a8261425289cb3ce8b75e32728cf8538c014c695221038b3dbc78136c5ea0081bf97c3cfb3c3272a05f3675b72d4e7b934b34533634872103e216c971fd0eb56ec0cd0d38c5a28232190295580aa3b6aa8c1826b50eb8dc2621020c8ded4f2713f6250b4d479dafb94e0f94ab6eb97a9e1db5ed833edaf9cad55653aeffffffff0208a110020000000017a914884d70eb60c6ac9f09eb55b5ca684f6929de0af887470ab4020000000017a9147bf7f1d27d55587df74dcd5a9dec139387deb1e98747a00a000100000000010640564d459b8a807d5b8394c7d9153a6689aaebca9e0066ca7be32224e9cc65f1010000000000000000a47d1a47798dcc3bfcfed26a874b324da8408ea7aea7671f296078ff85b7cc982d00000000000000008939d1905bf5d11397037cc43ae6457126faa07af2e823cbe5fd13cc4184c05101000000000000000015ca4c30d508c0745761d53fc7470fa3c62d4c91536bda5b50259f6eeca6b94102000000000000000073d9980b2bc09318835abc1e059bd8cf49f81e0f69d4c975e414541127c421fa01000000000000000046bd019a745e29c59d3ae3c54d3570879c2df0a6e16f5ecea6077b8fff89bfad13000000000000000002002d31010000000017a914a9d362ed7a8fb37bf561e4bca9628065686e35eb87cb5f6a0000000000160014aff7bc32d46362426fa1795c8a29f4a56c36cf0b02483045022100f0d2e01671cd6ab7b81631ce422d5ba76a2ea5e26c7b28ff9a181a6a85f7ad2d0220726451c56d714063802e949d02e428bbc83f6ec33c5d5f922222547fcfb40c40012103ec69bf7fb14b301c60416cfe79a9f478930b916ea76da40abb4f21efd10eab3e0247304402203378a0587a263678a41c5476336785e31ba06218a8e0b3bcae16fc1864fa6eda02201bcc3a805af975ab91695e120f6349bb5c607aa459ce6d61f138a272f2a4d002012102f94b848400178688b0fc53687118dda8a15c9827fe25091a6d3094b2698ae5a302473044022058bb2341c31ca90071753c28aa9d8ebe2de52546aa465c725de1103f1435f25a02204110f9094a988080f0b7d266f38e0ae944659a3166901e0256a14a4f9be32fe50121039129667b2636a1983c7e5b74f06f04a7329f89fe47daaa18bd2d97a4ea84610402483045022100e3d50814a3fdbff29aeabb9023c1c09e5be2b97a92ddc424c36b4b272c16bf01022071d1c35b401ca9abdf88bf6fe475e7264d0536f65af0ebdab19802fbe7aebe3701210379f2fb2e182076872e7fda95077b96c9e1663a633dc63107b55f9000560bce3a02473044022076e8f76d94246a7dfba09e1a04e82554ab69c892b8857069010e9ae73e599d1902206d5ca944693bc3efecd57951413bf0640280af8a2613a14ca1d6a2d795ddce7601210379f2fb2e182076872e7fda95077b96c9e1663a633dc63107b55f9000560bce3a02473044022013bd718dea24f5f49bb7ba4bbfac095eca40dc434d11c23cd4a0a9c71a4e19c40220253d6ff54df7a6ed6f15fff0683ca721e1c42da82038d82dc4cfedbfae8a5cc3012102f1b31463dbae3332ba359c4ad63aaa5787f227f42137a8cf599c160690e23512000000000200000000010134878033e66e878c6aed493cec767beb60cb8406e677f492a1204dc09384d7820100000017160014d18971b263fc06096c38282224dafb7bada6a4d9ffffffff02be06040000000000160014012d0a6b2d4b33d71ffd1c94b0e04626e2101ac4811900000000000017a914481f4fea66c27c6aa7d4754f60c73602d7f7415a87024730440220427aff45d83f7075adf5c5183bbe83fd12e82af3f4c48bc777ea70dc29f8d4ca0220792f9b72229fbec7aa21a9069e5ccc5bd685296f4a698966bf9c7fdd4907f9aa012102ded653d8ecd207cd84862694bd1eeea677d626ce00f6ef177183ddbc4087ead70000000001000000000104f64d5ded35953ed59ebababdcade951b23dc4c06c1eeb192bd940529c0ebfd130000000023220020121a74eb2ca51e34a51684ee8181fd590e8d33638d60583fcf780e19f03d6bdcffffffff9240e9b121feeae1468dd89980b701d33130a37dcb6afc6ba08e4c293771e1ca3f00000023220020dc270ef2b5505ae43a1ba48731d77089085f711e32f6616833c9860efcdbd4c5ffffffffd9c7b844efb1c796e064b51f2a446110470223ff6a15e3f537f579c4154a28d500000000232200205dd9f9758c50fe49086d1a068db15c274b8bbcd4843fc7fa0fc2da2773cef5e3ffffffff893774c4387b02e3f9be48d2569a77773214b097059fea50ffa09429f12054f81000000023220020c0b3c9e4bac33d3f3b3cde3a9ccae912ce1174257c28ea8d9d84c2f7319960d6ffffffff01febf64000000000017a9146cca76b861ada64b12027a775c71635f53e843408704004830450221009c053fa00bcb2aafa31e96d79dafcfc368dfa25b7c3335aa11891052c63bfe5502202512774dddc843e78d5d66a610c99a6991e6caa4f2109eabe956203abf0d05820147304402204f4124b3c012fee549191b08070c472b8ea0b14612288b47216343f4f72d8bfd0220602f4fc3bb3cf1a68040704fea8fc4dd22aa739469f605e8f1bff9dd6584c8290169522103b9907aa4b4df7e761077f32017dba608a128f4bcc8c735a27d2c882ca7512ec02103fb5d28d102469eef3509b180b986064002d315c8058942ddd87107cf0dd5fd2821034999d2de58d76fbcb3013429f575b758350e2de337d6a94d080ca0d396f4398f53ae0400483045022100a6e3714a4efd71daec2b2dd600922779b41e16089f7f2a105fad409cda7adad40220184b766a3d7759c7cf57d11166e27905744a87b261ab4a77c49edd275348029f0147304402207d1e07f167a49d36b1c6946e0cefdd3bccae13cd9c9675c518fbdb98c1dcd7b30220587c4c6086a807aa6d98fc4d21d240998ddd182841ae579bf6e9a2c22ce062db0169522102181b8a9c59b658fb3d53ae9a76152225a7a22e713f8941ccfb349bafdc49a94a2103ea31aca5d9d96761a6a739183945108c55ab789182b1542dd2979fd1de7f146b2103d06651256073171b5b96b1e80eaa10aacad87fe2d1d39ab517437d62cdc27fb153ae040047304402202b7d3e1e6ebd0e7eeb052743b32e7cc790802a3ae3d559f8c0f7e701bb9dbddb02201134baae6cdd42ef6c70dbcb8d7fcb7daf2a859976c9c7ef37b5b291df102653014730440220502b2e2c0bb5e9000e559d250b6aa55edae63e7aaaaf8c6fa2662bb9608338d302207a2c42c48c136cfa35c4790163511d96897160225907fca526fda95a7908487f016952210262c788b04bf5a0b4fdbf4a953e099f6cc62ad470aaf4723d55c73eb8f831c62e2102906133c3b350ba8a2b9f4bbfc49f20af4a8f2048cef63ac4639bac8b1472216d21039ff32b0a2f18a528d7abbcd1035d816aee71859a5ffe09931d082c651c10cb0c53ae0400483045022100fc09b99e6a2bfbc5b3ae3f732e8ac304ed3c078ae62c06d0f6d1ee304673babe022076f0f5d1bb32c5c2320c7ae1091779e49e921d4aceccea4d15a0daa9dd09f2ac0147304402204706e4c16ac732d537a280123b4a8963114f4acda4ea7a72f6e1f1a6f6a3a0550220581a5700a4c11961747ba691e4804d71ad986ccf2a637f22a1968944be5067370169522102d3a80f63c373f338b8df5e11a90af67cad1c32aac7e7c44467276ff3cda719d621025f4d57dc25d14ea7f932bb750a007efb12e579d806c616afccc6fcb12e9a04772102e9762bb36d40c4dbb71f045f82fb5efd66237b037730d8984a1243509e3f973b53ae47a00a00020000000001016163be12f136e68ba8fb354b506d2d8a326777c7060c6816b1c4fed42108a641350000001716001464b74a46343fd407f7896abc5496eea9a6c6eb72fdffffff01405600000000000017a914029f5f834e35d78bbfb8695ffd834c7fe50f96348702473044022062eaf287d41c9e5d15864a2801d9bcfea152db3597115d1cb050d24ba52c56d4022053d66bfad545a7518cef42d767d88706351c4a3aa059db497aeb35c3d524e2cd01210361fb9db2ef72154ea06be7a997116e5eb676f6fda0d6451a059c2f40432a014847a00a0002000000012dde93fc0947c5b0ada3ca96965e4995d0b1db31459a3d9f5b1fa4be5597d9ea000000006a473044022077c9187f3ff1f443ce0c9615e39243004cd34abbf8ef002bce9c34577c024b7e022026d2799f935d511d24e483a0e76c813b0e8de6b9dea55efcc43d58986fe689300121029fa3224da31808681b1d810828024f93f8c90b02dbf12b3b33f64f56730a2568ffffffff0186fc0000000000001976a9141718ff9a56bd3a526055155c8e24a05e0f6cf2bf88ac000000000200000001fa336c4809e53224fa400435436ca001f5925ecc7c2feda779976f4c0bfdda16000000006b483045022100af5cf947207106088f6cf85fd17661815f9b612a84dca32ed78cda74cf32bef202203ae099c1e73df1fa25ecd296b610c4a31647f6616ec3af7cc58b7f785e40ca670121029fa3224da31808681b1d810828024f93f8c90b02dbf12b3b33f64f56730a2568ffffffff02178100000000000017a914e8c5f4d75954f690c1b84e4b3b68f6321474c98a872f760000000000001600143df9d732d0df6b35ddc9e63c811eef7c5903706b0000000001000000036fd277e55827f659a0230b7dffa719bf869216bdb4efe7509b5dcc5fd2ed435c010000006a473044022079fa4a309a07adf843dbd339f431d77b2f51c49f47e88b8c4f9f7fb5493ba8d5022021e98a9cf0c9970cfc5dd9d3dab2819a79d3292ab2fce5a660ca6a7274a9eb1e012102e102d5d6c10ea3017d485661849071487bf919681955587a27a41a77a871a2f79bffffffa9c5d31819ea17e89664298acd4b04e76c12c4e6a6e51cc9f249d30b562b484d000000006a47304402204168a306c8994da8bf395c1302954bdc93c18af3096d53bbf3b1fd9ed59526b4022005d7a1baaa105b5cb959e7e44f40afecb6ff332e18df8225df07ca5dc6ac435d012102472da842637189815421264b27e8a56a4aba4323f5603959bcfd7145682f9bd19bffffff23aa27ccf1bbd677cd72ee2ccc4dc45370b1ce3ec7ad1f567490f869dbd6bc472c0000006b483045022100d2d03197a4635ee4272fb22dba3479c4326125ca2c998b2e38b75ecbe355be900220223d817294a398c39f346661c9e792fe8105c9c8111030b47ca2dac3c705ff2f0121024b76a224de87b3c82e222558d28b19494e124231dcaaabc0ccd8ec67557687be9bffffff0218de04000000000017a9146c52735993857f55a0c90b38e1839011bae38c0687821d0000000000001976a914a30ff142de32fd828ce17a8778feb6df5526734d88ac00000000010000000001045aeef89233904e66772945b4d232be9faf3903675062d6d3ece46d89cfe5f06d000000000000000000d695d52bef9e854ba6680d65f6a1a5f3d22750d7bfb6c604349350ee82e533d5000000000000000000de67af6b2951de467c54d0f772d669cd7fd8f5731a74ec379be918cb22f0b30b0000000000000000000cb64082b4b4bc643d901b23de56ac67b418aa61a218fd4bc0e57e02b0e7672a00000000000000000001159a9801000000001600148277865c56400776bb2e74a9c175d2b076d4ed830248304502210091ca7723269286b657cdbd4a3a155533950e37fc1ea57c20d93d107ebee957b102205dafbeef806e01ae59369d33281189e4eab66b22615dfeffe34dc0bd07ac1e3801210249d0620cdcccf488a3b5a5293afb2bdb2254ca0479c91fe9ac870621df847b060247304402202871048deaa529c37ce9d390d1453a3fdf5e5f85febb8ba132cf388e983ec368022063aac49a14d3483f4e22ed64019a6922a697110c68089e301bc49b1659b7ff09012102a47cedce8363452bcb169cffe80eac3a16cd8423406a02ae3a46b9b3a585965e02473044022054cf228384cefe3a3e6bd05b9b47b58e0a44c7bb0a9d027793b871ce6d5b8c4d022054e5d05d4dac5f6c158f7098b678cfc540c876e15bf4f81722cf557d5050e8de01210372ed70f58c2354d42406bacdba5193d0b55e6b6ad52f120ec250c1008ba58db602483045022100c87ec33513e8ade5dbd12b1168b4707aa7614045935ba2a5f37e74d15ff7405e02203319874bc879786cd211956d7f9c1a86b0e811c464bcd06b8aed57d7cad8c442012102416938305fd429baf0155dd9ff6f2ad9ed4cbecd27ae24f030c1fe9ee6e0926a0000000001000000000101168d200c1ffcbeb54013ae07861233fcae136d464d7d4f4e4e9687f76225c6430200000000ffffffff4607ec04000000000017a91481b0b375c6446112eb74cf34cc8834afbf7ca40087201e0200000000001976a914cfec1abeaba99da87e3690a107dc1bbd8ccc714988ac5bd50400000000001976a9146256d4279431413c572c34f66743ed73b7624fa088ac9d1a0a0000000000160014185cbb85287e6a51b2171a06724b5d2a336938ccad5d0300000000001976a9143ab5ae9a860e09fb06fbc1188b7d5c80959eb9e088ac20bcbe000000000017a9144e02e42639b4fecd68eb0271816f54e6b060145387275600000000000017a9142ce1625a41aef73e0d9ba5e2799feb37ddbb4bc68789fb02000000000017a91405badd108688100452db3e81e500fc99556e39a687d43820000000000017a914003b70e68b3be58014b640140d1995819fedadf587fb801300000000001976a91425b4081b4dec4662391bbbe6ac4bff433513a88188accbae01000000000017a914814d1896f97f2f029de7d6a7f808536f1f1fac288737ac00000000000017a9142803bbcdf69f690b75efae2f40a906859b4dbf418744f9000000000000160014af276492efcb833c8a30beedbef8557889a356c40dcc26000000000017a9145e3e4c74885f119176a62b9cff8ae0641d5b9d6c878cc50f000000000017a9148fe0e6bb8db402d49b3623e952dee4557403413e87fa7200000000000017a9143cf116fca0964c66655300ed7291143f411486b7870da60100000000001976a9140a2b2cf57191752fd5b039bef978fc704beaeab588ac34fd4b010000000017a9142c615afeb65f598a32b414a91a03c60f3ba4bd47871e0703000000000017a9140048d83c55c7c8b2fdc5577ee328d75d4193de6b87340b01000000000017a914c146f717b72cf9b0e110d926fb5399096659a4ff87f9ae01000000000017a9146756eb99774b29321f142a1e0449fde441221ea987579b01000000000017a9144d89da72f9a65de3cf437b18e6fa615a026c22c587c0d40100000000001976a914221a6528abc83be9dc5be0928d3570000e9a3aee88ac4e800200000000001600148c08a8b86b5ac9117d6b5bb2d6bf183de63a9ceb889000000000000017a9145a3f2d5a66e31ee717ff8171ddbf29a7cedc47f587eb927800000000001976a914c78f2b13b984f4db18098fc3a075f2c2f6e0b24688ac3bdac3010000000017a914891dd9be6ddef5f2246a077f75a880f26f530ec5878e45090000000000160014702635f847b29c66937fe3cfd7afebfbdb12f06d0d0c08000000000017a914d0a43ae97f7105ae8afd26d9f2dfac8c8a9a4ad987d68d0a000000000017a91455df1367b7ad234325cc235da0872a0b562a398b87ce7203000000000017a9146bfa1be0c3605feacb1a77da8c1d7fbb869e47408727da1000000000001600144ed5345eaf4bc77c4686e33628b7bd7cddc5e93a606802000000000017a9141da3880b1be6186725a35367e4c930390f9e37e987d8ae01000000000017a914cac6a1e4daa921257889faaba046d06279c6f5c0870e8a0000000000001976a914690a0df8b05701544db674c7a0cd2dc6dc5dc52988acdc035600000000001600145a51af3399c9081a1c4b0c5cb932439db5cab3c432b5000000000000160014c4846102dd889a669fc4b2ee4c963b8ac151028c87274d00000000001600140aa98f611bfa9169895d3ab17df05c9c9072737ae0930400000000002200203ed5b134ecca36866eaa6fa835303772a93b908466334bafd04b1c9b22eab6a0482f14000000000017a914cb9f63137aba4c591cb80eebd356bf4e4f580aa987e11cd428000000001600147474cb4f74648f0e6e7ca4b172828fa35b9b8514013803000000000017a914c156d2b92a6808de9a4678c9b33720841f3acd3587947f01000000000017a9141023153e7a3ac72e8c094d46cc3519f5e6156ef987b15202000000000017a9145d2a67ee9e4e97b313da436a5d27ec4c8950b738873a2f1700000000001976a91445c315a70eef69f8d88d5c3815047e285b86998688ac830201000000000017a914e50e610e3b2e69ae59d55b66623eb563b81fd57587bcd51000000000001600144a0f736a459497d81858236fa380c7755e7c5047b9c800000000000017a9140377f6886755a8929e68cb3eb1ebf161a62c15018759c00c00000000001976a914c65ccc1bb1fb9921fe00079a8b7b18d21972991e88acd0110800000000001976a9149f27426e22381abac67fe0926f9b905f00a910ba88ac183002000000000017a9144c0f9e408381425ae7fa9fd74d2fc9dfd143bc7e8736e10c00000000001976a91428928d8580d2d02aed6591a4a4dae19ab7f8b6c688acf56f01000000000017a9140a87a0785e3194485efc35000db7fc50ab20de898747ff20000000000017a9148373a14a7d988c5d9d2d674cd480024505452e44872df60d00000000001976a9141ae3d80c54a62691235dd6bdf8bde7d6fc902d6088ac682f0000000000001600142444478154512f3a898385d28f92a57845fcebd0ba9e04000000000017a9146bfa1be0c3605feacb1a77da8c1d7fbb869e47408766330000000000001976a914aca5a4a6bc7d20399ce1eb446898218e1baa651888ac54f100000000000017a9145d5153f0ce727378aa7e48ab0c5a208056ec95db87a80854000000000017a9145a15237bf1270376122f6937f6fea598d83568d187c0cf6a00000000001976a914cd7f74cf45c1ffc86880c7185a490c005a7b061588ac9fc704000000000017a91414f5388ec9339c2d64af0e2d300d14f9cc14ee3387d0eb0100000000001976a9145beea89a3d359790e79d59f54645f61d620aabc488ac162b0000000000001976a9148d1959711505175b396944e160c3781236260a1088ace78f00000000000017a9145646cc759dd35fe84010a8d13d194e993896393c87ae2d0100000000001976a914ba9fd3b27b80b6d09cd3ef4ea445b0e5db0035ad88ac57aa0800000000001976a9141efad2d1ad9a1fe468af468bf17227769bf6be5a88acc3da0000000000001976a914cc8acad4d4a8f0571dcf11e717ebc786661785d488aca0660000000000001976a9142d7e9d24160bcdadbf6517fb67565945bd2b8bd188ac6fc40600000000001976a914f52f71397964426351a9217f03b2c0ef3b5e6a5788ac0248304502210083e84e01178ec0bcbafd64ad3939ece783231e2ade852aadea99662356d781b0022032fa8205f3f1649bb01afc7062b48887e3525d36c2536b3afea74e4abd1aca530121030644ab3b6b3d97fbdfec73360d0c30c3c40bdf382ced2dfe9b2fe548802804c50000000001000000000101a4e40bdb822039d2ce288720223f9aeffcf7fb958fccf34e2802f904afcd4fda17000000000000000002a08c0000000000001976a914370aaa048a65bf817ef404339ef072bc40358ae588acbeef0100000000001600148c08a8b86b5ac9117d6b5bb2d6bf183de63a9ceb0247304402202b07dd671000845b4f2b849e408e1561ab0a486562ed3f0cca45b4c46cfa3dc6022029fd4378646cb9a7ca0b59d7c770f4df84516b91fa9f7f009b89895dbcee48ef012102f6318e4745f40bee01916ef8f1e31e63a1f6a1674c28b24d8174693928fe6cec000000000100000000010253ba0c24c30dbacd9bbd01bb9387050ad9acd8b29f78007da3c248e36fac211b0000000000ffffffffef2fabdc2833cf4fe0d59912d68690edf5089b52f603a3813c2471fae55410810000000000ffffffff02009b0e000000000017a9149e42c922158b8a330e0e018fddd48264da83687087c808070000000000160014c68a5fae3093a1c11b5214c732e859defee609bb024730440220703ac6d59c06874f14b8ce2cdf0155137f08b39207c95d03fda7030919b08d4d02202b816d17093289af6b860dec6b4286fbe65273c7a72a55ba52cee0715430646901210346d4d3484257242cbc662a6f2919e9891da286d50d9ad4841bd585222ca0076402483045022100a1cc224bcd2707cd2ef14e0b19ac76228a28af523997f5993aecc462e78796ca02206f5e7cef7ec362d21daf993d68065cdf24aefb63b5bc07aa8522b55a4454d98901210376828399d0ab6efff49b43636e6d56d559babd50b06ef6de5eae0f8196bd7fed0000000001000000000102176ef162a8edac9cea3113712cfe956969eb007c5a87cc233dbec42519f65a39ac00000000ffffffffdaee2eb1c71cb1e618e4fdd2af2a86c53c2a54bb1acf4b94ec82644284aa4fe8be00000000ffffffff02105522000000000017a914421e4585be2fd1111669657586c5ab8cd6dd1d0b87858b0300000000001600143be6585f337b322a4e26d7118a114c444c08925b02483045022100d958e2715ceaa02bb88961019b875ddd8532b9d77767700842b3b787c4f763a802201f0f8d4d3dc6a26b173fa2ed8e9e7943fbdcfddcf4824c26748932bad028d5980121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a0247304402202e22de22af42e3b5f7e6680114f3db2da1eeb05c3e4b3b3384f4f132930863b9022025ae3b911e0f32f8c2ba1469c261966703cf55f334e02e2fda5f4f8bd05aedb20121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a0000000001000000000103a85b1e021a240d23fbc80a4591f2e964032542d7af789b12f89976010854817f000000001716001403fa69bee6d43a6a8e0688d931c051934c97cc4afffffffffd92ed1e61a93724d51b5a7b8ae11ff08675d18b38fa608fcd468c234a9078c70000000017160014733e4158b6a549f276bce7ec1aef89b36860e5aeffffffff7017c0412d78500c53572b0ac72ddce482492df3b8ec366782f4a38588b6aafa49000000171600143a779098dd46c50bc250d5148d90b1a855aca398ffffffff01d1c211000000000017a914f2576bf170d03300e5e643319bea2cb19beea2cb8702483045022100afd844fc44357729dabcc3f36731e907579e803ece265673363dfb1e80416b2202201ded8ca8587ebf3d2495479b1af66578f5a02240ee6b7e941b1dc61cf50427d6012103cb9e814ca2402209882cf3aa4b9906ec8702c3ffa8625f437d15790378f67ac30248304502210097b4f02080d9ca4351551689666e0ac6bff0700892beb675d6a70e84e9a1872402203bdc268592544aa6a43bd7111f8021d9d93c3c4a3fed853fb42e893112070a680121033c1abdeff408a32bcc2c0c81fd1e1f70594afe55952c3add907cabf6d5983e8c02483045022100a5d32cbabc2b6352bc415d03f64b649c972caf2bae05bb1d4c93d7ec3eb0cfa002205ad881c1ef57a9e22f7a171522ef633bfdf2a363bbbfb77af7c9df064c665a5001210338b4042ede2eeda731584cd0c4a52731480c3af4fb9056a385c08c57bfcd82a00000000001000000000102f0bb8b7307d6e135763c1f39e7febf2ae457c1d609ff91344f478aa82c04cf6c0100000000000000005b6aba2a6b591811af8f539b1f5588794a7375f4e440bce734843d77d17498fc01000000000000000002ac550400000000001976a914f85f15568038bf921227d597b9f0b152344a07b988ac27990500000000001600142702a8ab14e11fc0fe40087de997187777c7872c02483045022100d268bca1f616dd764decbc1f13608d5f23c40ffb1a072268084734835b72ed5702207a4420e9b743e9981a0b5fd5ec484997ec70e9b688ca82d0ba3d93c8232207ec01210390731f95834fd5c5b6c7c3b56c6b4afce52316d94f49dfffd1635dd2d7cf2f4e02473044022031b2fafc773d75c970b95dd476685afc4be113cfc15e8de5f921e78ccaa3213a022058e54b573b431eddd1b67822b02680967e253c2c963e9b8e1f802a5c6dd58fc7012102d0790b2e21d27779a8737eabeb2cc2b8ebb492648abb0c1b2729d8a683d729670000000001000000000102a5806deca45fe9e8e69a5f0bf7a1bd9fdc2b60973f95d9a6b33ee449eb128539010000000000000000901b96704bf06a913155ea1e121481e4542d4dd6b56aca1db5efefa31150ce510000000000000000000230750000000000001976a9147f809a296c9482bcb7657078a5ea974f251138ab88ac3c9700000000000016001431859c81d88671e92f34dc46088523b485f46d6202483045022100ae8d09a0b65f43ea1036b590df592df500f3c6b7c8d149284925d7cc425b0f66022079096281a32c8bbfbfb8a386a5a526579b05bef9263bc02675742760d117fd5d012103617449bcba91059c44a7c378be8e3a1c9406b8d5d2aa84c7eaa153c85f793d560247304402204a7301587d721d64c997c70f6751da855f1c0d32187afa09cea84ff5721e77a5022039f47023e0cebc945ab54c0a82ce85cb946eb4cf05c809387b1e9abb0f5484a7012103b2506d42656c538b98d56ec75a8f00bb3ac2db6cfde56a8e224bf5daf624f0dc000000000100000000010130e3d32aa894b81d069178ac925383278c5a6f97025edd0f49df6fdc62ada2970100000000ffffffff01e0748e060000000017a9145da7eb3c03c00bb5415f9b6e671083d0fb46f2618702473044022056530c03cb894b8466e72df8589fc73dffd4cb6b57ee7b2745c31f1b0ba6a324022018c630bf7ce2f090585d938811666e178798cf2a4c55e26a1e5caf9bcabde3a1012102b541682ab71d55ff9db27882425799fea513176c053574121bc2178913a3f34a0000000001000000000101c4fa78fdb464b01ed2dad33acd421f286ce1c3e88f72fc518c4f40fb102127980000000000ffffffff0156df60030000000017a9147eb9f2e9f98789b588aceaa6dc283ea89bc47e068702483045022100a35d30620a182496d05c4020011dbff1f5db0145b84766bf8c818ad43844119802206bebc5d5c1c9a2d29698e31c1d665e5710fc11418492acd03df99b8695b4308901210300ee8e402db5f33a90ca00539dd08f124dd60751d957ae597446749710985ab2000000000200000001aca912108d920960f7a8b1ab84a4188cc7a1bcda07b1394fad2b014314008d0d010000006a47304402200b7742bb0aa9d6dcaf53eb0dbf063e1fb86677b166d9f479c20c67b43f9938d30220744078d4f0c1b100a610c25a0bbbee75cb74ff11dc768901be5ceca6aceb465f012103909233abbba6d8e0b110c3fa917f05f772f790697ec8c0e04cbc26d19d3dd93cffffffff02dd610200000000001976a91443eaed4bba950d2a1da33187c6756fe25000123e88ac83d102000000000016001462bbdc74fe28e735f74153e5ee5f61a6fd22590c00000000010000000001013156d12c912c6f0301054d8c28017871dfaa6359e8ccc2c3f89529c4c8531a0f3700000000ffffffff0188d296000000000017a9141f05edf331197ea0a49ab4be74f4b319c5ceaebf87024730440220051fb060d66446a5093c9d1e0ea2c42c4c4a3700ef437ea6f9c86a6e7e42f99302206f548ba06a5dad1b8ad9bbe8f02fd68c483589ae45c160fd31218871b769a1540121024d675f5b7f08d2566e39dcf87b90a2268b089a619388b3314651dc3befa4a2370000000001000000000101f494f6649c16c34222936085ef07adfb2b53e5d293a5e5f62eaacd5e668565e802000000000000000001393d03000000000017a91463e8c076f861dffb4b2bd152b56d1ac5656bce8c8702483045022100a07b6cbed20de624e56478f955c293fe8db4d8e0cfe5d22398eeb8149979204e02204b264b1d6d8b981c6638276f235666fa11202b93c6e4a80a1550aaccc35a488201210244bef543f5c79d2f98cb8a9ccd0a7d93d2487ec56a787a76e172a64fb085338e000000000100000005fda0f92e6691a7519f383ab777828e811a5514f5ef4fd233697b545a74245e87010000006b483045022100f54ed2d9f8d478f26c6f5144dd2390550d05822f373fc77caa099546ba8d2f4a02207814383b5e8d65bee57d746a7b0f8d94f1947403ad480d5fc078b6f34f658025012102dbcc14d1aa42c9f433ae5bdf6c2ae9c4e98db8aad5495dd3873863306a37369b9bfffffffeb453bc281a590af288986a7a1324792da88ae0e6f404cbeaf3e5648779037d340000006b4830450221008cd08552fb6cc1ce1c52aefc974a10cf6d5d6b59526ede8113464442f12c72e8022029d9e0d0c428a0f956880d38a5c68737839735634cb7188b08b56fea7760954b012103a12e32582ab2183e82ca1cebcf77565257e427861f8a0efd79587aa2bc2441b19bfffffff977606e966f3b5b364178c9b3a1d3cba658675b36792b66b0bcc1ea531f91c2870000006a47304402202ede1efef73c70e577cd3ec517b819288cbb35eb872a57fec677516ea8c818ac02206eed3b2a6810807ce0dc82e32236fd9d51e242e0facf51ccde1db5b5f6c3d9cc012103a12e32582ab2183e82ca1cebcf77565257e427861f8a0efd79587aa2bc2441b19bffffffbe7dafe9b770e4516b7ad351245ebc1c0b7516ab56cea001227cf2ce07121676010000006a47304402207fc4dfb2332860e8a8bf2082732033f98c63a2e5c9086b69b61119397b92bebc02202d3f3bcd3e088c3f9b6cdcb74ee6d9dbf432a2c908f42bc9d22d929a26fe49f6012103efcc489a9a0594fe5b3d9e68d0aea1e95de7a6f4d29016faa28f564c8150eaf99bffffffefba4e047a0e02144d1a48bce73dcff08699bf853a9c3790dd86c48419bcdbeaf40200006a47304402205368ba4030f8d1797b1acd1d4d052113e0092fba8b9d209587a46fbd47eee0e8022026107ba1fa7dfec48ef6172bb634aabadbfdd9b122013fd10e7421d3078c1fcc012103a12e32582ab2183e82ca1cebcf77565257e427861f8a0efd79587aa2bc2441b19bffffff01d4b708000000000017a914ebc7dda2f48678bccd14d4ad93fff4c6baa89b8087000000000200000001e47a81d70d1abb35891a855e27af3ed52b556f93a534c80622a6c3665538e463010000006a47304402204953f248f9aa3f865924692e9d179eaa5515aad585eb88180896fcb62567852a02205270c7b5907ee86e1f0504c0e2c0954e4b5dc021a927a1a0219f64f095838649012102e7a84e93c76013c454a4843243ddacb93638cd0dc41ef31382847c800bc7c3e6fdffffff0242cc00000000000017a914c97fe1d0fce82bce94493e6ce1941945711c801a8780880600000000001976a914e6bd304c6211f5054d0c03a707c0c9d1ea417fdb88ac47a00a000100000001ab42618bb35984826044fbdd42d8308e46ca111cefc82442fe27ef6621f5356e010000006a4730440220136e7c72c9f1f19220e97b878b6685dac04c5f44515c16bcc263a60baaf348da02204425cd88369f587ddc3d75f88da864898756f7afa23a1716430ce6e45f1b47dd0121034944e9891bf96a5802c07fd83d3d60a42e50b43ec69170b61337ac2c5501707dffffffff02f9ad01000000000017a914c26297fc180f43a900290db3729fec2484c7f7a68786362200000000001976a914b046369c8a63599222c651a9a35393be0888705288ac000000000100000001f31461c16c52f184e0613a49f36b2f5b6bfb0373a3c4ac843504f46e1f295f0e010000006b483045022100cde60df7618d99c9d8536094330bcda1fad31368f39a68bdda8c01c099c5c69f0220350a3ff9240f0c315b145cc4316616b9ce0dc91931f2c652290ba9f1052db373012103f387447b67126e7685e5ddeeb59a63fe3ae0e90d84703b339f24909e15efb63a9bffffff024db301000000000017a914659122f7bca595371975da256e3ff824d78dfc3d87b8240400000000001976a914e729a0eda12493eadffc03609b17351f0792b41088ac00000000020000000001026883a9ae1aba52905ffb970ba8e8e3f389467f2202c6c886da4f5d655bfd81880000000017160014ca1567b340bcd5e489eabf105cd00a77ba2919bffdffffff55a7111ca6f1a18b840ead54f8eb07dba4277183f39631e00db389b050efee4b6d00000017160014e5550a682fa2660629aafa2418ffa91d099babb8fdffffff0103c364000000000017a91426dab79385eaafbc6149bf6a54bba4cf4f7e921a87024730440220601b7ee20758149932be99fdc5ed0a0ba3e384335ab47b7380ec07f911ca01e902202551b97a5038163b872b51fe53387eadd04da6abd92a522d0d960359cda5464501210260153e01486a0586f6f12b8bb3937ecd9843057a71c3e9b0d5222aaa026a60ed0247304402200c2768caa8d2c1abdfa68c7883f6037921722d03654101e82cdce412e0c40c7d02201df1e00cc345ef07314db7418d569a1c0404662042c13f403d1c530e3340e7690121025c1dbc67fad570951c8c17264662dfe5b4ab5cadc55fea082269013610cec9a80000000001000000016001a2d4470e8089c200a5e775ce12d615cade2d4340a3d42036efe7ee373245010000006a47304402204019b0de8cfbec37a79f0be653ba9d8e3b7700d657135217938803a750cb412802202c7db91fc4efd4e2b16c28adef17fe03dc17dbcd490a66d4e260fc090922de4401210355ca767096e916d8306737c8ef503de0901aec3999741159ce4cd967452cf971ffffffff0250162b03000000001976a914e01e3661ca7705db65456b36291397c5530c2a0a88acc7ae0100000000001976a9147460ecd681ae4a57f5ce9155f150f0ccf28b447e88ac0000000001000000000102d9405cd3f58e7dfb7e07c9dac0e6023ab3108c712a457de2a25c4900a72d4ec2010000001716001402957e13b360cd12975d13a9a29c00a8ba6aec61ffffffffb2c88b8ffa5e321a6be29c59cc87bd856cb329b252280f38b9f821ffa34324e42700000017160014bdba96ddc7be008debf7aeb7efa497cdb8371333ffffffff01d8c1db000000000017a914684d2388fa75d3c932e75db6c4c304736616a0e88702483045022100e3315b0ab96f2ec57370b6a57c975577cd845c8eaa50571ede0328490ef736a602200e8cdc458bc5bf7df46909754a4cbf751380762bcfc35dd917c75c43700c895e0121028b028d0cd16a617227b59b8335c1b395a88af9dd422e55e2d98243779b9b368702483045022100dce501c93fd0bab71e0b987adfc0fb18d916b6d8757efbf58a0fbfda08911c24022049ade5539154670fb9cf360b42d6f2a619954779407fb1c5bcb80c1023b73580012103d10f56ac26b7d5ce2381137d7c4b5818f38274048f6a06cb28e7f40062ab2a500000000001000000023c95ee89fe507b8952e14e549ef2fd208c8e99a58f2f447d8763bd1404a613f2010000006a4730440220094d57cbc18e1f900eebf1d9fee17df19ddbaf1f0192b437460f0e34e658d4b1022035af3dc9eb5abdacc46f3eb64db0bd5f79ae999729636c5ec41a59f8b68f208401210366b4e2de61ee868339ab2fe91d2cf7384dc5868d0c476df72272fb0104d034cc9bffffffb2e5531d4a69eac956faeffde7922411a4dd4f472279c1a04a7b2d7f97fe3f57000000006a47304402207fddf742b9b380b2243ec0fec10d8873dcada053d1e22dcfbeabb7e17e82dff102205b8f003fc8afd5eb40c707fade4a5dd90b56ead7d9507aaa3caff7ec17fd5981012102dc4159e7a7b67c47cb712da220f7ae017d4b24a242fb43a2cde20fc2b8139ad99bffffff01c8480200000000001976a9140e28c3deb55b00a4095806faecce68f6dabc23b288ac0000000002000000000101776bf2d335797903cb766801d7b74e3ab3f3c5888c930bf5b929252266ad09804d00000000ffffffff01b29d0100000000001976a91454851fcc817abb7a57fddf2ab4b07bf282af9fcb88ac02483045022100f66cb8a42dcf985be2918fbed5638d7c8ef548be41fbc2f525c7608472a4a0cb0220175018cb4ad126f7f25d1eb55daf0fb3d733cd4d1405d510aa733b159c05bba4012102fd10af7cd49b6e9745fbebfd3feb6e4c1fd6ceeaca6dde0f6eaaccfc0223b9de0000000001000000000103c577f4fb91010c22c3c693e8ecfdc8c1d0cab0705f9dfe6f6099e7b7c3397f1b01000000171600149bab7ab0dfdb72454dd7a9af0376b9f46e061c4dffffffffa617ae30c62ce51c354d549a734fc2d65e80e5a3ad1968ce69495944599fd18100000000171600144422b664e6c4c5479e3341b4885e892a0f9c44bdffffffff648c2e312edd2a23f53d864be518893856dd167ec7678b447f9f750ad922658201000000171600149bab7ab0dfdb72454dd7a9af0376b9f46e061c4dffffffff0219f80c000000000017a914001679b5e30c01c194a72149eb996269c1209e7e8701bf6e040000000017a914bf7d6b9b0412b08e6d75766e36dba9ec8ee21c0a8702483045022100f9e59abf8fc535adf0835a0a714030f1e5fa05b9aeefddd0a8439af574bfdf8302206df351a352f92c2eedfd994d55a5d28842537d2f186c1cd885f6348cb2f8efe5012102b1f3c93dea0c41f62b5537adb728cfef5f30966d583d81785b9d38bc40ac07fb024730440220220b5985db592850ffdb032c36e3a999b8781bcf41de319c6c890f25e4bc16e9022021012ad6b4176a9f112492712eca6de3f6e62036ff0ddad50171d9e13c524aa301210369b98e463994add72be65d49c6d95d8c76e9bc894455b93b3d2b81a61d69d6ec02483045022100bd61670ed591c00e0573f634929801c7b3828d861b3f12bb926e76d65464354202202f784c78503f0ab22002765faf282cced7fc06a8992d56882ae725f653f040be012102b1f3c93dea0c41f62b5537adb728cfef5f30966d583d81785b9d38bc40ac07fb00000000010000000001039a52559b3c32b28c4106ab822e52c3d540f972703dcd953cd866151169116a4f00000000171600147dab16178a97ff5d74951b5f34854c9615edadf2fdffffffcd0fa92d620e72afd9dfb30591169213a02d9b4a43227ec2b73ebd2a1d0aad9e010000001716001453de04219db928d0458c20ab4b0cfb4f8d37ad27fdffffffab1092b838b68b2977b6f00368dfe9ab6c4c3aae4a75258692ab6eb7b0aa4bca0000000017160014f126e2f078c6a2cf471816ac7f6425b367cc9ce3fdffffff02680b4d020000000017a914f0f9a14e897c86f9940501106e92b775bcd4160f87009435770000000017a9149eaf3858b4c51c3a234d106aab8ca0aacd5f2da88702483045022100f9555e433ff8403d33d3d87218c4483a713dfddb9140aba81d7f59498f3115c70220683ea63e46f924223e55033dd8693cd033f3f6ce62f357463d585963fb6f44f3012102b963dba931956518708dcde0efd604d3912e4568dad6437b7f168ccda46a930202483045022100a5399cf6fb7cef778bc84d754883b5b74255e8ca3360e5fbd09b11b897f860420220052d7ae8a78b3f0d721592c6a42aa3dc833b366c19786202bc70f70c45e427da0121038bc49e83f0d8ea944d33e86be177f4ebf3d62cecfca93293feac6a7648b6f53f024730440220488c42c66d3663352028cb0667c006920955b7c8c08a23022674a8f4419f1b0702207547ca6ee1713ad59e9377ddb4800eae2e43235de208a664ddabef4280edf897012102689a9bbc4f3bec114f15999f5835bbc1557d6b04355ee4ffabe62ae608e435ef000000000100000000010143fb107ee9a9fff3967e489fc35f77b9411014c9de8aed3138aac4d0233607752b00000000ffffffff5055ac00000000000017a9141533e7b88a4e42044643f42a6128881b06db879987f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7684f10200000000001976a9146442501196b4f45dd275af0918bbf4709123ba3e88ac8319040000000000160014e25784476a1e404533d8bd01245635b5b647dc734f760500000000001600145ff15e243ea2f6009094e95c605dbf8cabad79eb5055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7687c613000000000017a914748ae8781ea298b99daef0f99664583bb0100c9f87275001000000000017a914322baf8bd37f9e5f8c67fcd715229ebc5ad0b9c58789af100000000000160014db08d3412cce1b1d4ad774e0cba8f2def0d6291d564b03000000000017a914a6347d4a8bba98c7a8f4b72fd2bd2538870dead18768ae1c00000000001976a9149be1e0349520f5e319616276166dc14bcf785f4d88acc95c030000000000160014a534ae7b77593053d838511778d611211c9b132d503100000000000017a914b122020b9db8317f69ff19fac9a0782b45ed95c1875703040000000000160014f25f1f667effaee2941645c93ec6df16e242ad3682bb00000000000017a9147b576d34b4bbffdfcbf5595060af8d5729a3e41d875aae0100000000001976a91456ec45a152f58210e148b2a1812ad49e710da1f288ac6f670000000000001976a91466c81ee7ffd4de024453af5987a35247fa7cb83788acac6506000000000017a914f15c88bd259a3b55405ab64582e395603a07dd4487d8d600000000000017a9144935eb5d9e0ece0fa356e3be1108a22695ed5cb4874e7501000000000017a914794825037bb2ae71d0a70661327599a2c01f07d487125600000000000017a91440266d14ed43490107460555e12c3dee21a0b25587c52a2000000000001976a91497dfee2212cd1d79fbe976ae0e61e537cf83a3df88ac02bc0200000000001976a9147cb815b97767c725bcc8f1d63d271bf0b73ba86988ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76c1790400000000001976a914a4c2e6a3edfe396f606d1ea43f5b0e82a63dd57688ac80f0fa0200000000160014e50f582ece0a2354e5f8405c4729411e1fdbeffdb0ad01000000000017a9140507c1669b3c222df6881067237ed9ab3382f4498704470000000000001976a9145223efc4ff558cc0b251c03e24033dede7d44cb388acfa440100000000001976a9145bae986451a23b8825a006c6fa6b21a1d362258588ac8f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7688f345000000000017a91496a19f370bbafc8a8cef83d13a3da6b28558905587d8d600000000000017a9148ced45384369fd2b29008cf4cdfa30582107d3c287c7500b00000000001976a914198fff87bcf0bb3a6b3eb9be8879ca2addd50db688ac145600000000000017a9147ba23667175a17894da79e0597959a89cdf9868887f3ea0300000000001976a9146941ee2443ee019443418fbbcc6babb802be1a5c88ac43f100000000000017a914ea0bea08223ea3ee71f1081a4807d53b672cf60d87937106000000000017a91422b81806b970271215c4b25c16fa2447d472d9de87e5b208000000000017a9147c0221a4bb764ba9ac283be343c800f772bf27d287ea3e0700000000001976a91476ef84b2b49fa73888c6ca0638b3372b8e883c4d88ac450833000000000017a91453ec546f31daca42d7794e7c792a9a37ee74f4208779ef0000000000001976a9146374c8e896db61a4ee2473a912e991c436a16f2788acbc3001000000000017a9140df00a463a8fef6db6966f03abc36dc0efb06daa875e0205000000000017a91459487c446e2aa17d7f50089729712d21a37d6f8a87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd7676ef0000000000001976a9147f81b086e319b1fc15997bb5663ded23a9eb649388ac5db602000000000017a914a2ea5367d06c69d32a322568f7a484cf56901f1187d9d709000000000017a914ebefcb0326804d08888d24389c046990e4c386aa87b1c201000000000017a914b9ae71f2ff935e63b51b9b32426e7bd37cadfeac8772b900000000000017a91452660edee341a018280b9becfd3b2745c057d31e875055030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76cfce04000000000017a914e3f1bb3144f851ab6bf8a38968baaad882128cb3879eae0000000000001976a91430903f327a6a95b9cdf9bfbfe71b64c60a42165d88ac801a7018000000001976a914451cff54fbed5f61503251bd163db23c54bbbf7488ac340a08000000000017a914dd67043177799bfab87f2b5f701e529ca0254711878f54030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76ba0201000000000017a914c5f72d8b4583932866bbc33ae1db294e5fbd8310873665030000000000160014114ad83b406b40e90efa0e1fa98f2046ebb25225439800000000000017a91439e638bf5d33c1d6b103ad78f00294f6701641dc87494e0100000000001976a914fb6e552e88ac599f5b5817afc9ffd0f0ea901af588ac462a0c00000000001976a91403d6da4dc1104c1d13b6f8b4fc15b2232cfbee2d88ac60282200000000001976a9144062f3cbb040d553af538bdd662fc6a80b17b28988ac6a021100000000001976a914551b191e09400f31519896ef05b0ed1b0a535f4388ac0f560000000000001976a91432d2f3a72b615d8794257305ea03103625cb4cb688ac63ac00000000000016001460110cc22d0f4ac7170c9bebb643cbc7215bc74e75ed0300000000001976a9142cc2c1c73f19b09fe27c772c35301ee04c432e1588ac0ab0320200000000160014855d8d1f85c41fabfe9c0f3eb51e9d1a41db281c843803000000000017a91456adb5ca3cf74560e852886f504af7828fc2622b87605b03000000000017a91429b7964e6cd8d077a46b12a49c6d1b92f7a2bbaa8731ac00000000000017a9149f7a5f8a62d5669178a616922e2895b004a763ed87f654030000000000160014cde4ce697a385649e1a0f99834be92b881d3cd76b3b306000000000017a914fc0cc102c0423a47a75d69743bbbc621c10a2914870e950400000000001976a914d981d49d77e5e3b350743ae46fe0e23249dfb83b88acdb4400000000000017a91461250fe8f6ef62f296d0f0f72a8f8783abe8741e875f430d000000000016001452dab7db96154f8a3c0bc86875d33710264fcf91fd4601000000000017a9147b1ffc3a07fb5ffc65b9b43f833f95806d37d5b987d2e101000000000017a914b6620514ec979270b7a64ccc9a570ba1dc0f28a387315c0000000000001976a914ab538057f6cbb91ab760f6001461a7041142ccd488ac7cd7000000000000160014b94ad9fdb92408ef9aa7d0873d6631c3cc7fa8a5e4d40000000000001976a914fdddf5f21bcf7931f547ece3e422444c03e47ade88ac125600000000000017a91407b05898a7825ff4e7b083600142af8f208cd81e87024730440220451af4df11bb711c6605239fc4db2d48ad222994877b58a695b8757ee12064e602207b309b0d128490f433c9dfc991fb2264b6c27d6acd38ed5725adcf14a96123520121032ea52b82e991e135eac877fdeb8e623f7423c93e6895eaceeac0377c78be8b1d000000000100000000010276b23c680fae4f9ddff68599c5dbc05fa2395e6699273325563fa7a37c0d64670100000000ffffffffb7944640551c5ac478828bc1e44da691db43e08198d635e35e04e6c5e6a918e5260000006a473044022016a4d27faf81b362ed8d4a484e1741ba4c33b043ead279ec8e4bc604c3d9319602207da41c7ed36ce1bef5c6d0fb3674b6dbe5c13ea5c457c0238bb150cf391b362a012102dab07aa096e6aead4109db3d3dcfc201d1dc10b6d3c3dd09c9699083c5d4e09affffffff02343c0700000000001976a91481b6f2817b695598d59bc0e513e33f73dd2bab1388ac141e0000000000001600148a302cb2626d5bb7d62b21ee109f49ba83a9ef8b02473044022056d14b85a8da87ab35f0f9da26a89be2da6deabc5042fc46e74ad62e6fc4a36602203e314707c6cd9231f878e2104c49909cd32f66234f466dd98d3573f6a5aa91e301210269e457b0c42001245638c5af03b1e32a7491041d5fb7c3036b5d6b5a6bdb069b000000000002000000000101df96adfbf5c29b0fd47225520f8e56a5947092b8b98d40181b786a951d03e25b0100000000ffffffff02842a2200000000001976a9143b9f09b9697bbacae443eebf7655c56098f6d56a88accf069b00000000001600148ed16ef059fe11bdab1d31aa472fe3e29c4d2f370247304402205a6f0f6131013aa67b6db4ced3162373eb518ad32f55a98a289da2fbd3fa692702207ad530cbabedb28d186c18a700adff28cd366049cca893ac5b567f3156c7ac35012102332f786741fd8f3ffe8a58e10f1018d79c2f4c2459c95b9f52e95598220936e9000000000200000000010166744c6b347dff33474c879de996ebb8589a4c3f830c677c7f9052591de6a0eb0100000000ffffffff0208cb0b0000000000160014fbea8518f3964f94c4b433235ae15fcef5428dda1a378f0000000000160014c84256be20203958e4e5cbef5bc81cea9331a24f02473044022062444d523608b063392f807b625304c4194ed135312bea3d0d9b623f799ee57d022005a864c799b16bfb27c4d3d59534a3cb1797b4978fe683fc60e29a4acacf60fd012102189de7fd48ee78cc4701f8c7667b010917024d4f9e305c2e470137d55f805420000000000200000000010197b6fcd4ff586038cb6a816c49dc8cbf4f83c8581fad825ee35b2982ad89bcd10100000000ffffffff0284337f00000000001976a914e18e49ffcbca444e3f2ec8e220c87a3a4815dadc88ac4602100000000000160014773b6933dfd15d1407806a7b1e4b38a7019d3be002473044022074fe71c3c38793d7badf67f152ba060009332aac43abe21e73c97399babaabac022053672b95ad73b66c8f8e59f7a4cec34f4c027d40b4d850088800c31f6c057713012103372484ad84f33c34bf1333cc92b237f2f1e5ec7bbc7014297a3db5ba4f31027e000000000200000000010252a522aa771d4d6e3e5b66539041efa6bb575e2c22905de5c78092dc5a95437e0100000000ffffffff2be0dd99ac75840688c939c4ba740b3d3214be7e34d4fe97a3672f7fc6372b9b0100000000ffffffff0163df100000000000160014fbea8518f3964f94c4b433235ae15fcef5428dda02483045022100ba7081d6a1814cb6ee5c5a1fc495518e14ebb9391c66c62e25b85d8579fd1b95022028f7085ff79ae13cac5b309b925853c75b1185f1e88e5ca3ba23da811c9159bb0121022321159d3ba2f5017323154257aeec6089752f1ecb9a709a12c1cd0ea3948c6c02483045022100e2391556dc9671b856c00cc1db912f3793ab4d3a6cd275ff6eb722e45ae26635022067a6e3e0ac7439c08890359b2711debacb4ef39e183b8427f0f089c170428b7a0121023d1bdb338d2ab766a07dbfb94d9dcbc12ae744c67875fa890dcb11f4904cb246000000000200000001dd6d1a4f1d5179305c09bc2c6f6e366e6ab69225dcad8e2e181c260cdd02037a000000006a473044022031dcbd9956133036f753e54f8d04e11c3d732c7c712ca6b378fe5f8b74b5ff79022056ee36c00e4517d3e0ea5e3dfaa18240865d0bde91091505a5e47a86ff6e6f34012102f6ffc26e79ef4979125debcff3e7953c6129395e1a6425e7172ea20252d495b7fdffffff02553d07000000000017a914af14fe5002802bb358eb0c2cbbbd85a8f931dd2787024b0700000000001976a914a1fa9bebe41951a9dee3517f52d0cbe693a48e4f88ac48a00a000200000001b0650af8b176f8cdeaca0f12af965f68da4ccd7b09b24f4baf4a3c8c29e65731010000006a4730440220507a84aa2dbcff61e1e2ad5226c738124ea52360a9a2d48bdec34fc99f9259c502204b0e273ba1c135490075285e2ed4683b44c76a0dc3193820ef9dc5069cf6a8f0012103e91a59c9f5c50266d175b5c13239eea233a850c9e4b8af3c05015071425f4d13fdffffff02905303000000000017a914750bfcd28b6e7dcd31f15918b051c709bca412a28728f20300000000001976a91448a18a64f963f2c6ab6d6638dc8929ef248359c188ac48a00a00020000000001036d93cb07a57d091b30aa9ce7e9aee0619a5737a06a29464693d0e4ae6da5b4872200000000ffffffffad8062d1b6a9bf2be96797a3876889229aa5f96dc643a3dece19fff3313dee3c1f00000000ffffffffe70f2610d1cf36bf3db76342d719b07a1f568fa722b500a8bbadfd725a190d6d4100000000ffffffff01153646000000000017a914454518a94257ed40985325a2162f679e05e4b34787024830450221009b7e6fcbf7b851bb1913357171fd4ad7626dcb17dca8d3ad9728a38b0603cb86022023e5049770382314678cc6b6dd9467d0cf6da60ca83afaede1265d659ee7369f012102ddb107fd1e4f019e1ef2a5ecf86e9ff4229a01f3f68d75e273c4ffa61eee1da902483045022100c129dc30f12618fb0ed7436f5c67df96f0523530b9edebd9781e2469e068a75e022035fdef8bac65e4eab2edd025640458258e83f1178ac1966102c1c588c6df0c42012102fe8d9626711fca47db3f571551150fa6a2836ad145b573f812cbb75752dbb25202473044022013e2ed620725919ea8627c147feec3dfeb03195e1affe6333046cbf9e46abf4502201d21371e045c08a44c7fc1cd92fdd7db9df10369166892e38b6f63a95db9b168012102fe8d9626711fca47db3f571551150fa6a2836ad145b573f812cbb75752dbb2520000000001000000000105d7f83a54ea3d77e59418bba4585df33b4a8604ebc661a063acc5a2dad9b2a92f0100000017160014a35da4f8d79dd9d07c160309053851f85d658700ffffffff652194b2115c1e061d5630cd78c5281fbd864fb05ecc3099f93b96dde1f1984f00000000171600141bdad691a3483093e92f70d9570326f970531ed9ffffffffc82d89a2c11504bce631ae56bfdce26f34a612906005c373c1e78220b97c58a101000000171600146fd93a53f1627614fddf7e811050cf1e0f3c40d8ffffffff83581fffe74e0a2afd2e6d99ebea5aba6407bb0134007950e4b2c6f76eabedac010000001716001401bca0a528e0dd58408fce0f6a365870ab4127bcffffffff89b3adbeeb8eaf23d3dc7fd7b1dc5e07d0f59d001d71513b8d2d5bd29fcba8db00000000171600145b0a744709d63f0b986ce1f7cda36b26ccb94c5bffffffff01d0eb4e000000000017a914d82ed5931f41d270ad372b817072018378098f75870247304402205ffa3b1fff90db0bc6d61cc2dc319b13d16252c35372cc135ce3b8852befb76a02202a969179b0d026ac2bbb4a38ce6d7f69b08b575bdf8d0e1bcab5659fb32dcce5012102c05c40fc0872f827b7e655dec27f88548e5cbcc48ed7b96387264a496628b6c002483045022100fb10ca6696e3a6d236d95d6514332623a1157895fdd61b9a999c880015bc5d2502202855b39c462eea7fdccfa7ea4f6a1668b5258972b31c0e7daf5f3923416c498f012102889fbb4b9048e6fb02943e311f8f6f46891a2e84e095537bc8c2d827adb1f70d0247304402207ab736f78aa37d2508544da6c18011f59fedc12c36a9a4957da78dbc234cdf6502205da10e72c5584ae2105e1eb67edca2c3873f6a27633d1efdce9b145430e0ed79012102ac94f50b3bef6a447af452f143e0e95228bf0e32caceba494ce8135b4c90deed0247304402207070c24ffabf2ef0c1fa4977d01f474a1069a8c3380ffd3f4ddd22966507a0b50220089724617e48038fa4bf84ad023bf2e56858f0b6915f0f9f407676932033255e012103042f04cc1b26a8d41f775c2440eb887010de151d2524b74afa6cdfa6ad8517f702473044022067c6269ede75b00c7686a79ca9ec0acf959f451efb9a2f0c262084832a790aa70220374b84802e69da577c1a5784138026aabf8daa6e2ffe702197c9cc17fe37fc30012102b9b012b09e94310d4cacd9f24548e8f3fd6c4f201a1ef06b96b4e5dc6e06728f000000000100000000010205399d181fdef31fb7266655378ddcfc1b80a96b866681bd3c757f8d0236a0ea0100000017160014ab1e714ef706b913a2e7b46dbef62b186d7ee21200000000ad30e7c5d8a5a464ee548225050a01ab57ac035f4556360df39a6e1ea249107d010000001716001435207c4595f096039353133268555779f76bd7f10000000002d9790b000000000017a9147bfb39d72902dd74c0f6afde155450dbcfa38ee287582018000000000017a9143b81db14e69daa67450554a6d19adf1cdc330409870247304402205fbc082cdeb71ee168ff8ef503d1cb6702152ee0d0cd6e2f4bb97a0df0f56beb022010e012395b90f9600d7c1035049d371e29078ac50e68e8ef83d3d4caf35f4bf70121033c82b267aac73241224db9dcac8f50496b79393bf2552ba62db8edcee1ee5f8f024730440220625d6c5bf29b38e109e235b97d34a3f5223c47002e43bad3f200f965d0643cd7022074646a4a94f9c22d1569c7ff713e5fdc79f9575f3e15e88c008e4ea9d4bd8ddb01210358f634174a45a0d9bb0b1184cbc8290c60d465fcb6e38b72ea3f145c96085e080000000001000000000102c3b08396b2704b50ecb0174c581a42c27c4e2ad04735740aae7e5070d50be7290000000017160014c58ee976f66c8f86aafc6e5f5a7d2c37a6495cdbffffffffbe82354d3b8f75246c536bf7067d2b98b51576d11b312e40e5085e8f279dae9b0100000017160014cf38be9f403a1dda3c965a37cafee686dbaafe14ffffffff02b08a04000000000017a914164d511e270418cee506d29312b2816c5e282a55875b44a8000000000017a91492da7eeb82d528f9587084475c9e30f1321afed9870247304402203df6aeaffcfc040951a088f52c044047de542065fd5471309d1c32500667cf0702202486b3c8e1f4052d6d495de079b01aab130dc27c640dc41c8240235573edaeb1012102f1a877369ef1ef3e6ec173c16bc7044a5c639d5df887323e5ab3b61049def15f02483045022100fdf32c1492ff677954a517945a197a7a2fb12b6767d82e13f263ca4776f22f0f02207c6e806a7355b652a9604138f7b9c3a205013986b58a752ae845a0362f325c8a0121039056a1eea3c2278026947268c46e25a2a6ab488a6cdeb341e787610ad2f556350000000001000000000102604bf964398d6fd616b8fcb87cc092d25559301e3c9d3a5db9dee822cea67a260000000017160014291e91c1bc24d848859c16b79e40ab09bc1de198ffffffff6081dd7316b0bd80a3c5abf10c45d96cfed461ff8ce763c8da610bbc760f57aa16000000171600142a40e740ba3ed76616b263e98bc9c774d9f891d3ffffffff02e5243b000000000017a91431ee122cd2d0366a925cec1be7d575802c78aa0087fa49cc000000000017a914884c0e32e4a3b38175707a064ab15e85290a6df587024830450221008531e36ad9be799f45970ac5b46d80da493f5b90ad86ed75064d7b419a89927a022066c93ca385505cb2e6e0de791fa4dd7b6d5af20239cc22650b1f138040493996012102c0929c812e12d58a1425c8cf76ea1d173614c13993755d3ecaaee348da65fbe202473044022033847c0dc52ef0333165d0bffd526819b87305d4c899723e29beca1962ea1efb022043d82259bc5225fe5c6c187734ad847895e3993dfca771ca45f5955cffd79f28012102d47fd17f68836ed96a1bdeea12ba9c9f1aa10469bc6f5fecd8cbf6fe97372cd100000000010000000001020ed1b2754cb7a588ac12f25b97edee6e6b6c171a0c1bdb2307514e6b886ef1170000000017160014b8b40863dfac4e06a3b170a69d378d925d63e9c7ffffffff0d5ad7b96f5e688cc34b93acc5afab94d6abdf38adfcff15ebb78d127104bbf60000000017160014338d27ffc7402e49d8250e77f39e6b2c8218f8b8ffffffff02e70914000000000017a914c660af4075702d84430cc2554ce6eccbc53fe9ba870d2838000000000017a9147fabf8e0c1841683eb9d9b02abbc105c43d36f03870247304402202af59ac3087d686d8a5ad5b0eeacff17bb451cd1181b0b43f75f4b2dbe565c66022054341c4f2314db72eb649947575d943874b8d5dc6eda85ad930b34ddfca319af0121036c91359db04353b0bbce96080207fa1b2df714f19134601fa470dea801b131b402483045022100af53f017876336704dbaad8730bcff6485918e7145f1250844ceff31c9f206a00220223ba5fd7bc6617ba688c76c92b6c909ccc1ee3665e9ab3ff122b5457541e07d01210388b331adbb87a5414864acd59baa3bc84d803af77475da045cfd9f3c1feef64100000000010000000001026a95dbbebe36637aa62e5a69607af3b37213af699d6db1ef89c53c74535d64479b090000171600142af9b45b34855f395fdaf729f12f17ad71e1120ffdffffff1bd2ffd29e54d934acb6b5dffa0ed3a23e5c29aea4327135a01c3d363a9dfe83f7090000171600142af9b45b34855f395fdaf729f12f17ad71e1120ffdffffff021cd606000000000017a9145980723035393499c8e5554cb66b8783fd5ffe2a87ebd51000000000001976a914701386d9b39fecd3e8ca2dbefe1a9746a4c4019d88ac02483045022100b668d5d3115a5367c1b6e9eef023f6924d5b1c340ddd9220559d4910fd58ea8002206df148daa5f1e2ccf96ad9f3cc92bababb6b212ef0946fbbaafa05bfb4485d33012103dfb830abea7d709b38435fb5f2904c47507ac8b2524b1b4d5d51fa481771b4a00248304502210095c11bf0cad2cd6c1be004431e3a91371219dcd94e3da2eff818a3793519cb9302201e49628192f9293119d226ab89654aed67c588108f2736051699790249f64584012103dfb830abea7d709b38435fb5f2904c47507ac8b2524b1b4d5d51fa481771b4a00000000002000000000102a7aa8f19d7127a91459564c712f0a927b73f47675ef9580e71e869ce05d2d468010000001716001443d2ed89145a7d8a5ab5e06a1f92b728c05f0f0efdffffffbb1c730634810bbd9ffdb757b66920fe5588a88efc57fb0c55e216f095bb11521d000000171600149058995cce48b6f8b3cc958eee5cd37fe0a642acfdffffff0295650700000000001976a914e9c2403e1046f81e4625a0cf2da94097bdcfdfb088ac430700000000000017a9148cede224ae575632481829bde426639cf12a84c387024830450221009680d75c2651f7f9d16d33ae2da62f9154babfb3fd2b60641e46088be2750dee022072747adef1b8546375aa1ce9c7494de71ea9fc55679377cb969f96ae5c020145012103050295df70b7cba2aef03e79c34dcd2ae711c6dd9d7f646ded2f22a5bb08ae9402483045022100ae40df5211dc1efd0dd4df289f93ac5a23f22f7393bc4a2e362f787bdac18a6d022024f435ebd2ec6bb81ca8f5e3f1a4504f46d9e5433f029a6f1844e5e1887bed2f012103e3fe26cd4b4204e30555a36a5d8908c8794f13c43373c0adc1fca6af955661fe47a00a00010000000001025c845321c005fe35e98b2918e3ac6ed24f34a1118163fa3bb15ba1881cb60d6001000000171600142395ff13bf58c0e34015a107d53223d3c60993c6ffffffff5a9e6ae307477f1b255c6dc777a2b4c1458cba691f911278e58ffaa6c5b82de40000000017160014eca790c140455a771cdd2d25bff394a6ef559895ffffffff02edd029000000000017a9144c504398ccb1784c8b02bb32a526f1453e07f28e879d913200000000001976a91450b634c794ab8d91de09a1857979dabc491dbd4f88ac024730440220553e89a02d3b178b0c59e1a85e07e5cc11c2695f40741b5af05f06f22f10f6d2022039b04560ad972c7150887c12ee2b363e457ce9da803f8edb2365e35a52837745012103a9261f9c105e9be93e9d783fab9fd655707b26c37946fc15ac2e6f38616eb6eb02483045022100dbf5aac85347f6208aecf59f542271cd5f5d110a21a412cfd5cedae11a79363002201f09e4f25259e4a0d4c1b1a2ee3be97ebc38748db5a73449681d66e36ac07399012103d7eff517ae5894dc93fde67dafb604e015e45d7f761520221029c50f67b765a4000000000100000000010113b0f1d4d5f0f6c25c0e2fea169c011d3134614dee50f10fcc7f43864fa9c04b0100000017160014f29d40a2a66c4566a42e3f9955fe9e4c3e098b45ffffffff01e32438000000000017a9142a213542351cb6fee95c26fb5878947ffb1d6ecb8702483045022100c785dc3b96de627b3be873fcc4ebe7311cf8d1312ed4e3db4fe7387a610ea4bc02206064ea055f0c7903bca8122f94717101be7badff17de8464552027adb67e45cc012102a3b6766a70104e4e51cfb5d8379974d7d0cca854913ea900f39d244a27d29b2d000000000100000000010188ddfc350134f8fbab07808f9ec09b8105bc27ffdde166a4a3115170142fc66b00000000171600142a011b33216dc87c30001225e95034f482db4667ffffffff01b92138000000000017a914a4c6b9bc04f9802d2180e4e43d29af42c9bf2a308702483045022100aca0d566b76a638433bb091d1c601be98d4a4430fecdaa834db680cbe1aeb5ef02201b1fdfe3d4f83d33118bc085568ea0f70861149decd4bf0a50810d25487807e1012103b7d81ef4e928849b3b67ced37bffef14bfebe6a76669c0caa122d418f22a54430000000001000000000102dce7d57b42b8792c852d30479b6a625ec6856f40c6ef3741ba693cbae9f41d3a00000000171600142a40e740ba3ed76616b263e98bc9c774d9f891d3ffffffff0d5ad7b96f5e688cc34b93acc5afab94d6abdf38adfcff15ebb78d127104bbf601000000171600147f56622a628aceabf0c5589fcebd511c5a95045bffffffff025ef017000000000017a914197002af6a44af0e2a7a85dd28fbac5eb5fef4e9874375ec000000000017a9142db779f370a61a90a550bc811b010a782e68b6f7870247304402200e88ed8e2bf5ce3a3df3fae2e4fc6604ad0c3d894e2c2b4e35b464b0ae49550302202fbb1a7908e1414a807f3f8be7de8ae031340c7a6efce88fef8a0df52757a6a2012102d47fd17f68836ed96a1bdeea12ba9c9f1aa10469bc6f5fecd8cbf6fe97372cd102483045022100e5cc5fe4a06fd78f705ef23a250e83b6c1c728077a53be82f60f9b5e114cea90022032efebbb727a01abe2527685e289251140d61aaaff3e4bd7657e96e07c2565c30121031caa1ac5e2586638b6b427955673a6cc89158ae2b7c76cd392f826c5ad89a8c4000000000100000000010267310d739c163d42f6a69473bf90469347e285a73970ed3863a6d2dd4d9fbc340100000017160014ae8468791daec42015480e4294a9c0538a2ca226ffffffff1741cf21e26defd09da85783f5aef5f39cf44a9524f126130ccb73302a61c19d0000000017160014173bfc72474a1ee799faad067a1a7926e008ca2fffffffff027af002000000000017a91494151ef6782c2753d20a186c04224273a7a4cee4874375ec000000000017a914dcd51a26f82abec453cfd9b7e82c15fd0107221d8702483045022100e87e1021ef0c06743c8d49403aae92bb4cd19150ecc4d784bb9f7ccffeeb6f9702203cf309e6c818763df21020395236bf644f9e7617acf09658522eedd1cc77c65701210285fba2310a83202fcc0871bb780207a65e9af9cbfbc4656ae6196b4c3adac4b20247304402203152394bd350461a611f314cbbe7f07b5bf6ee7d551b92508614ebb539ccb31d02205fd608944933184f5f1f3347dc9f8ff937b26322d0ffbcc8b4efbf4ca9d300c401210265063ba0cf5bcf61cef3f2ea82bc47e8d6326caf476e9320eb0b730c279943eb0000000002000000010e7d52a553a76d2b997dab89a34017358c49ee6e848c6d1398fde13acebd14f800000000fc0047304402200d155628672f58d0f1622dcba1ff27183dee226587b245b7d11d37acbabbbc2002202b6a5f747e5f4641b98338d1dccff66a02373e271a686b2b547ab84127d1147101473044022054e64e19d48acc3bea7ff93a5abc88a1310932e7862c76d1520417600d8e88460220260629cd8ce349574c95708fb1fa60aefac0617e4a165a9193addb928840724f014c695221035c037a36e4ec9aa1aefcef02ff742bec63c098c0a7f1c9a1b822b6294afbb7102102a1ccf15bc58870240578a2922b3f0e922260f37098adbd988e15be36943816912102af3be4803e51fef309a51f0332f399026e99dae117dc2d22a71f4eacc1f3f4f153aeffffffff03f9963f000000000017a914a7aedd0d1e77300fb06aa154c9a517b74c08d24587aa0a0000000000001976a9144c7c5c2454e832713ffdb99ba58d52e4db628f8a88ac0000000000000000166a146f6d6e69000000000000001f0000001deb32650000000000010000000001018689fce935bec449e9a51e65c7255d4100c0d3580492d26d99effa8b557c86bd1c00000017160014fb557e8c0e078d31fe1bec2a0f89681c3b44133fffffffff0151a2cd000000000017a91464733e0caf2f8a6ac1b6a4c7faf63565594c4678870247304402201252bbd6ad1685b6ab66e105ca601be5da1fb749908901de5a3b8cac7b1463fc02201191721158b64965ef87e66e902fc31fcb67be94fd7736e18f6b3c55b8cd1523012102003a4a6543046f6c3101e00b946881bc34618a2b529cf0c188744f8ffedae819000000000100000000010171e3640f86da9c404d450be37fb044b4a9cd4a11149acc94eb6cfc8de90f089b6200000017160014ecae9c76c1d4af187d0c3c07f01de1ac99136fd4fdffffff01b2dc6d010000000017a9145a675e81e7ccb9409bee18634ce5904ceda7a8d18702473044022062d659c557a6cd45120b3bb8ae21508e3d0217a09222a601f795ecb77e2893170220500ae074aed92550c03cc92329686cecbeea126c3360430543a256c621b8c20d0121039645c6666a1de750208c280fe7824256851ede2de252551790a9752bd9e8e4f800000000020000000001016d0b95bc75e17b927da085ff738b909da97506a34c6edb00acdffa1a5ac7d1f90000000017160014dd6799988a273f9190b2c7e6cd20a2e390273477ffffffff01ed8c03000000000017a914935a373ef47ed64a3ede76828b93bd3bd32d6b2b870247304402202d5bf96ae3b06fde9ea6126897be842855f698cec50902c517b6420337c3c62502205bdafd3f4ee47ae73b6e7feed40a3efff7f8baf6f553bb86a6bb0852b70ea680012103ba4ddb77d169e5641537df0fd81a6364894e5b1d90cea6879eb94a593ae9619f0000000002000000000101b74b0da176ea073d0f98a3be6fc02c611a833176e50fc0a9344af5714b32cf5e00000000171600143226cde57949494ebb39f192361400e2621cff2bffffffff01461e40010000000017a914b160da693ff303e75c1dce18e0287d58b2349b09870247304402201a18d12b706aa3a861b28428fa3f529bb52d6063d878ef41d64eadcbbf47a34e022029a0f0cfc628f0e7df4b47b63902802ea9ee01a9c1fe7d715aa1b9d6257803e601210350ed8743455ef7bf2a0d94b1e1ee290d9fb960a35719d30ffc58f65eb790b4b200000000020000000001027bca398586206d4d386613024dbcf36d3f984bf412fcfca11cc0e63f73bfc5f60000000017160014134deeddb28f785cb0463f97cd9e5f52d44111cffeffffff3b4179cfea233824f228cf0eea9ed433f3f108ce53f5a1f78265d1761eaa35ef20000000171600143f3aea8a0f67a1a2165dc8a46db672e8c8a5059bfeffffff0144560300000000001976a9141f74103d46426cd48fee0c6e6ca2849c1d0fe26788ac024730440220049a47c7149f470b8327e292cacd4d01b9837e6b55adb0e4cd0c2a9f66677cc8022070843e59de7d9ef4a0d4ba50baa921f6e9378a82fd8ebbe378141ba5017d1bae012103294cf4eaa958608b1f8ccd35540b16361027c44ee00c86524ccb3f7fe88822390247304402206cc224fbd926861e24a42dbaa32a4eb8d61a570d1c24b5b1d8c6a3337027554a02207eedeed378180bffe7c8da019e2d75c461348872cfe1227d4eeaa40730f2b5d6012103715e1ebc94871434ed15dee2ed9d494081d529c65ae2a58a8a91fc03eb5b757447a00a000100000000010108b8b1e130635d01eb1dda71a311e3a17b459635d54bcf78d009d597c5b38cd20300000017160014fa8c51d456903161d372127581df054b7e8f8aaefdffffff017be80000000000001976a91471323c1e2bc80954e712c6d38559069c262b70e688ac0247304402202ee7762a1f014671e778f089a0c90692590ee576090b597f670ff76306bb7fe002201814732991c1fdc9f15fbb640408f03ce32bb62de29af92771a86fb91a4e2b9b0121035a4bf1f87fdd5e36a2af9636fe3ec18ef7c00abd8526b4973e15f9a542e972db0000000001000000000101d624112859a40fecac323f73eabd1d799d84ec1fc3274ff1322bd60edad626d6010000001716001445763d5e86f488d0b89a42314b401dabbaf114c1ffffffff018c730200000000001976a91443542bdb27aa5e732fba9ca4eda9742735266f1288ac0247304402204afc0708693a4c3bb3073b878615bf2435ab6c02f2a6020b83aab4ef913d06d8022030e1355db59c8b2bda7a07416651adfda25123ab19aee8c577d3a80ab0ec5f79012103167277402ac6ba3b5ce88cf566cb71963c35d903033b269fc7023cfe6857757c0000000002000000000101bbeb19a7845aa4f4450498b1a74fac0497ea3b41db04545def12bc61d908dcea0000000017160014a148a695c7da69c5f03313c108063884982c9007ffffffff0169600400000000001976a914c52f51146e1ec7a21dd5ec366c898b6f1c05575588ac024730440220041e8c4f6df621319664a906abdc394a9018e35d6526c5c938d71fd1252163600220676147b1fbc44d803dd653d00670b29148cc92818b8c416c5fabda9fe8949699012103ef40505df2dcab89f25b490111201f01224af316a035b52a35c79e3e1ff0f654000000000100000000010164b0839f4c44a43f7150cef9f5c0deb04dd316d43e33070491754259ba140474000000001716001460aa4391997e61ac8a8917fdaf357fa3f5d5a82afdffffff0135dda435000000001976a91424f0ee4a4613043cbceb33e487e55519e66aae5388ac02483045022100d4d72a22e5f6b48bb691a74c137daaf72eb009ca9c224724795b2600b7e70d7802203026e6505f3cdb4ce4c144c742c61c62c98c6487bfbd37d2f9f7bf39ff1ad98a012103a82f585c8cc517856997abc32665264a2730050c5fac623c305e3bd6935b8ec80000000001000000074ce9241a9a07e4eccd3f4c3db4a119bf1e698f93821b971f137d2ff2b20f2339190000006a47304402206fc4ee3f6516a891a2d68f51fbe7a2dd616101fedf02dd8cb831fc22bd37f1370220712a96768a7365e80a01d86bbb718b932a7a526eafcdd552e84bc090d22f2874012103247738102de9d18ae520ce02363547356e0b4f83b2f71359c4fc633d7ec20a1800000000d74e627f5603d0b37c6919f032faa2c0007e42a1301e449222240eee6172c44a110000006a473044022061b93cd23a0eaf6b2c894481ac51eb528be12363c744bf4c6123bdd013aad778022025926b3a2716c846376a3823f7ab44e79a2203200e2f4b8996b688075e583d4b012103befce56ef16e4d001d2107055580924cbe9959fd89e7acb5917a549af5a3225b0000000068453bc5af770563dc14bb97e480e21e3f66f02ed45b58e692bc431570ecb538390000006b483045022100daf01ca67938b294cdc50f0a1038c737d0d4d3a8ba94950e88724a0205596c8e0220391e100ee96a41f2d2f58b14705496f95ebed0878276a25fffea86e2b7a82786012103c2c8914f91c71bed1c1bf86b5173bc6b2fe738a983552bd8772765308ca9f5c7000000000b290437066b5ffc8293f7ecdfb5662005e67d46f70c190bfe6e3fdf00df73271c0000006a473044022018ac743963343e0d5257cc15a49faccfafdf28d558b770dce2e4ba352743a8d002202b9b0fc1e8acd327c39aa08196d281df3500c64ee294b5f0698473aa03b093a5012103386f4d73db8d2d9bd36c764dc35dcfe42f7ab11ed2cdd5ecca812284c128141000000000439e0eaaeb3d8bf5f57868be446483a09893525fd34b34d3cd2cb03871e78af4010000006a47304402205fc247888af833d93bf6420d457301c38bef97e22539119a76cb93f3c152295602203ddb6ffefeea863a2170bcb2b4a19d4fa28e7f9008961a8e57949ce53a3de13f012102553bf27b9f807683eb4c5a738e0f179168d89a2399c56496052199141ebe7c0c000000006bd2482aadc7884dfc0669856a4a7c0a0c0e448c8f8577f189a8c1d49c8dc6d4000000006a47304402205c6c0bac4d92142613c73a591628365902f1d90af6b7b061351235e365a4bdd202207186ddafe779eac685c6da8ea62462085efc05714ff94cb6c718bfa9ecf73eb0012103336547bcdefd0755221b227e054bc556a73c5f499ea57a0fbcb485495bec60c50000000067c6f5f71e2de70b2e40efbbe917e7b56fffac74978b5c83d3b3fe9af0133631290000006a47304402200581b54c8fa18c1d6d3a829af7616d05ff44372859b438c7d5715479c012224e02204547c307ba5f830337bd3539d2d99e01419615a57db8755de7f79d057fff85c901210218e8a40c66eba52733162096408ff81fb0a9ce9ca9b7622b41464121930951c2000000000220f1ca000000000017a914e222f48013a04fc75c371536a11b4240cce6e96f8773940300000000001976a914297941d45c298c1d7a723fde24a38859e515076088ac0000000001000000000103d833da1dc7a44f4f638b1ca38ea6b53daef3f22a8796309d5d2880e891ef9a207500000000ffffffff8b5f0a88f013c82e9ab913c7b0f0530456336b198ee419d787efb7f0807b0de64201000000ffffffffdc3107480d32339667081628d1f81758f5ac3daa34b40c31925f69f94d3e4df75201000000ffffffff02ce5655000000000017a914219a9dc1016278b0f96e36589f15b768610e65a587d0751a00000000001600143be6585f337b322a4e26d7118a114c444c08925b02483045022100a9e48acc874d7862ec2bb9e93c390bd1a22010ae7c2f04bc20544152caceeb36022044931d80e330fd0149b2395ff12405b60a6c6116843cd47635550d9889c61afb0121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a02483045022100a574ed71129091cb22fc287e74ebb4f53dbc2a53d1247aac8a0d4f7887cc8ed202204a3286788b7f053e91737d81630a4cd36c7d20d86014badcf9bfdd39046e75210121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a02473044022060ad6f5e573b6113a900031c3ad88c5af03510b248ea9aa820e78cd0c754e994022056ce438b10c1c370cb11fffb59a0bb83f089044b5683a32cc38d20cab7fa2ac90121035f7d39a7688841092113f90bc9e6acc3dd8d676fe7473cca2c395ca1358c5f0a000000000100000000010a13735328fc9b1a19e282703275e89af19f6ad398c458477d8bf651bd262d770d1a00000000ffffffffabfa05421ef3ddb201793466bb277da8d13e28d06bddded9a40325da5e5513110000000000ffffffff5295b834b6e4151a071a1fea7d57ec35426d9346a530f17894827c64312b7e270100000000ffffffff37fa88380ac6d3564f86a0d1a56d5f75310a8bcc189eabe6cfaffddc35dee42a0400000000ffffffffa7c818de25f3f2e6912d60d6750860b03d5b42ae56e31be61d37b079018f41870900000000ffffffff0a83eef200ba09405963026d0c56556065acc6dd2b94d5429988019560284f880a00000000ffffffff207ffe1883301ceb6e2febbe43e733c229ab3c429167064923afd6967f32fca40000000000ffffffff9999434fdc1772f4b7b9834e55665465bb54e4336e28a20d670fa45d700707ed0000000000ffffffff4967d847ebac615df56675885a3a8b707ca2971512550db784abeb4debb425f90100000000ffffffff1f3ef90cf879a10f975597d82792ca16aab7aac666e231bd9fc6073cc774b3fe0000000000ffffffff02d7c60b0000000000220020103b495c2042becff4a30a3b5ed907d23b884bd81b41d11551259c53c6d747c080a8120100000000160014814e0e4f262914e12f602833ad4237f41416270d04004730440220681ff93233387e41a5a347178dacd0595abe6781dfafe8f950e78925580738b802202b0a2554fabdf1645b9ed7d716b612749a764180e1a58425ee394383eb996f370147304402200cf8ba356cc6e1d4acf702b25a7861300599f40b9e619f323da98f5e03be03a4022000a897be6c5e2d7281b30246e6046eb934db62e1a43655b9a10cdf5591272e500169522103583fca9668ff1093ce72c7d87091a9c1a159253c62d21260b5b067e364b307ce2102510fec1d21b633d79b187b86c721daf6d9d4f6770bfb6eb4c45d56fbd712b9ca210285c593f2eb65a37f7e527a5d9074f8b4eed8adb7571916160c6a417a2a91765b53ae04004830450221008c9549e4e2fd35a034611b25202f2d49cf8592a327b8dcf5aaa610b92879d8b2022031414fe82391e2f56c16e612ea26fe5cda1bd55c042f1fbe81d7d6d2a821b2ec01473044022038b520a5f43414a0797edb77c2b2c07a865b2c3ec60c517e57382ce109ef5033022062890cde5e2cd7b5f46cc85cf3922d988c574218dd3f9f7d2a7b809b378c6450016952210302f9836de1ce50c07964eb8b3fce70a03bde2586117c284d22552f3393e9193e2103ad542ecdf1228705532d307dd2fac56ce99cb3c0a6dbca2890e5f5a75d10953f2103a53fdffd6102d00063a5b62852e474d2fc59321a93f0202d4038ef8ffd6c6e5b53ae0400483045022100c4cf89b5882e9d641c458170012735985dec0935c19321f17cc392d320802fc402200a0bcadac40b6d397077a42217c7486559e5c69ef78310f9eefab31a027934c30147304402200403be703e974ce7c72a558f2c71489366e653f51f218a51e9d60147464b5a2302204b34c7b52a09ea17d28c07284944a7a1e84dbb3c7b0d1a0b7cb33d8887b9e595016952210348e95c7dcd2c6b1ec1b37ab7b84b02a323e268df184fdda3868b81d6bca6421d2102d3608d6bf371b83bcfe5ccad62db8edb3899b11d59509ba34ac0151711739e7821034a388edf5d559eb46f1f3e694440052e6754e4382a918e12256d28eda451480853ae040047304402203328ac7ea6e0c156ed3026645eff466c0c50259396beb8304a6f258a66bbabd5022011402e6d4fc927a111fd83dac3bdd5b23f7cbf42e1121c24517301a57868243e0147304402200136d42e964434e16f8bd9841928d5719cd73c9434f42385007b74948c29a32202206b246ef6d74feb032cfe98f927aea3d0f2df0a90b1b0db2f1456de4295f27f7e016952210248345ff5136ed853dd16ff069af807c11a0dc004cffefb5671a6e7d6e1a2d881210317d5e6f23770f417a675f4c7165abf16d573b94b84b6dab859c2c768b383b9382103c3622eccceb2358f4513550a1b89efe9209c0daf0f24a2a594142580d58c3f5853ae04004830450221009f88f0a61af79748b108f6157ad911b289477d0fc29b38fc9f00630fb94675b202201c2afa5f3ddd9a734f5560e2bd1163cc6a614c2bfdc5f1f2bc8354c456728b70014730440220638d25c69680ac3d71b13fd8007ea04b7723ccb0465df3fcfa2fce22b3d0486d02207ad8d90e7f6546cbcbcb690340715423d282d91cdb9a27de95f663ffad63be400169522102e9aae75a4eb9b9672e44248ebed573f63db7042145f7d990afc7f7eba19799cb21023f972f443243c0de95de47e03110b6e6a25a6a2ced9bbbfaa5fca65d389dc7222103dc028bbcb90b45fc446bbee4905028c07352ca53c2cd5b1c1241404d6394805853ae04004830450221008724c19ee2730e1a0518301f5287f36474658dd042778132f5d09acd3d9c5ef602207b2b4538730cdeb61e151b4b318a4aab69e7d9aaf4dde2790671d7201330e5df01473044022077ccfa1de043e18d8ef1368422c5103ff7dbb9c87e1a94cd01a465bad3502a3f02203a787dab318586a3e2a2b43c2ffb399104df625b1d78912afdca0fc83c0e990a016952210351c15c77b933b0fc1e2d297a4aef6cfe15f6947bb26327820020fba9b7ebeb83210364ceb96e5050521adf9b1dcb36a9ee2da7f966d7fed4a72c7a361b45bae75d962102ff3ec1f6939ef64c98001599cf312c259c947b0606079995b729d890be583ddb53ae0400483045022100feb81b6f51e2b92881480cacb9c005f4550ac5331710401f0f3be985acd1e90b022063886023b6d7f73400903e591c1139889ad0ee0af571a12488251f27a9424e4201473044022005ad0a9885718ae29e1a8c82e39da087c2c6708637ddd0e523fa434e833ac8d10220379cef0e47a13286d6845f96b94b06b4952da79a5cdf3227c524f3ce36a8ea600169522102972f248ae1ed2a22e77813e5c57d26b36e634a9c26a4978aee03a8b32d4028572103ed7cf224082b3e076f2e9ed34325c94f79880b4c50a3260daf204a67338eeadd2103a76fb2ddea0455d9aa0c30a6fdff674a850972b1cf0f5adc2f2d39ffab0c984253ae0400483045022100e3f57ae709de857dee3732ef4346cf990b2f4b5ef4ccdd79f0d6d1514d8be6d802207f5e497a626acf972828a30e10f534d71b46e4e10852f1af14ead78557672103014730440220383312d36fccf7c8b7b75fc993eb65fe08c71ece4ed70a4495a3a9d4d6f7fbd00220667907bf8097b42557ebd86bc9931c0725f3e1745b34cd7be13f4af47c20319d016952210275f582acb981ae4216b9eb98a2fee81b242a5da7a2d3f83e8546435c299a822d2102ac7fb27c2df5ac6900531f8885ee95678283222565b1e947661d18239c95f0ea21037efad9791537c77cf17cbe51025323407e841777ee5b96006819fcf4f0c54b4d53ae0400483045022100df92a13f71300fc3b94adccfedd3b6fb58a883dae18948ca972acc702796521f0220114233a0aa710515d0818d270a7075e99e150e20622c5c514b85d0438c9a73860147304402207d5f30715f45019c3d053d28fba85845b6a9f3e5e6e5855f4cb54e5428dfc3e702205657f82d0e94352586c83b684509b8f8e98e31539793e47e7790ab5d62a9c4c201695221034a4bc5910ec242ca68b7d4bda6fcc7356a0df53349da75d91920400d918a59bd21031d041bc3dd27d66bfe70a8d5a4deb1ab7f1d4f5b7b2b40d9e812da9fb7d995f82102dff9dd59aa46f1885053d4fe1269cdc0dbc54e24e57e6c95cd732c43c5642ab853ae040047304402205e33d6ae72c327fc9d15f926932ea45037638798e27708fcec87545afabc402202205ff9ee3decb901626b57369f2552a6755958e75ab0af3c678b4d2dd15b54f30d014730440220161ba33c8d731ea2e55e20d9d76844cca4d0331716b7f56c408cb6412007e990022067bdd88c39b55c84eab8028fad8adf7e22870b389cc0c6bfb26e9ce3f5a21b440169522102f524a865ff22d4ec8e4063b85a9536892480ff79dad190797229b659109bac5d2103f833e34d178135cafb6d5343b2482fd42f6c46b759039a24f23c6b2c3c253472210290e4b5756412f1165bf6f5e20248ac5ce47c04a89de27c3aa21a573b5bcfbf3253ae48a00a00010000000001019904d96bdab6c4d3087d34f622a18fb18444b43977343d23e0bffa8a9fd429560100000000ffffffff022bf62700000000001600149c03f7a53c37c7690f9d7538dc58909578ad8cee8b59503c00000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100b11bd042730beb2103fd4c96b304746cf481121bda36e495a4228df0033ab81302202f2d10afc91615065cdce6a86d5a6615d6a2ac15888dd7e03698479785a24761012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101fae90b59d3fa173fb487d4d382de74340be46769c934864f4b4a39f5ddcab9a60100000000ffffffff02c9d51100000000001600148561bf14a48261dfb56c34ae0bdf677a8db158f986b2a93500000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02483045022100a5cec3ed698b432e36048787d2d26f1b2fe2d501aa98b908c2369b2c3775cc6902207b378910ce96ca3a054d282bc4126849890e5a8331e7a9ed04ccf113e90d3268012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101b611f8b2923fe4c0d0f75acd59ee186dbb3740ef310fed6d13bbd6b9c6711f2a0100000000ffffffff021bd8200000000000160014c151c92e821a92a54c452476858f57fd93d8c1f4d139756b000000001600147b2aa3b67c3b0746a80f5ce027842640f062e8c70247304402205b5856dcef9a88bcc09db4a57ce4f1a5256ba96a451d91076213ea3edefdf5470220062f5a21dd5c09ce14a30606287436c5f218a7ad4302c931322fd926bde34baf01210343a21bab25e836c9d02739759016bbe2d3f7db8130cd224f09393424b850a660000000000100000000010190cbbdb86da7e43155d6d186539fceb685398c850ee241ea6d760a7b2929c87a0100000000ffffffff02db5600000000000016001497a75211371fbfc52d09ae963137e24572f3d0995c15313300000000160014ebbd98beb987489286e5952f33f05a9bb38e349a0247304402203f3ab0c7ac2f3b81c7d8fd77dc014a71b569b2f58596bbe4d7c6bf73fe7e4268022041011c958c8e3e8c0fab96c2dfb64bb4ba2b5667ba30e1f3997712ca35982d17012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101e6788529a1bbe7b6a733b3415f5800a5df95963e80a8a1071ec1ea7029d56d760100000000ffffffff02a086010000000000160014db339441b6b4e43a20a91eee099b1ace4c0dd3b6a680950000000000160014acb17c0fd3ff55ef4394f86425acc18991491dcd0247304402207c8e570d526477ab7ee7ec49ed6ada5138131379a9443222ff0306af0607e9f902206727a941ec278433dafc3f5dc601deabbaaabfcadde57e1cdf570329f86adb57012102befdb54e9dfc1a88f46ff0de3c255f7407fa32031515112a1ceeddae30f6882c000000000100000000010160e05c46e8f4c2bc58bd7ce84fc7e14526296c788d73f42ee9f90e162c8997ee0100000000ffffffff02667e110000000000160014af54c9643e1ffce667822659b2c16a031a52fdeefcd4cf3400000000160014ebbd98beb987489286e5952f33f05a9bb38e349a024730440220750cc71d7807638778b934351b2969f62d3a550fbed0ed2bb2ff8eedc4f55db00220353269c75e752c77efef0695951d282a9419526ead217c5cb5253e94a8d81ff2012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101fdfffc1fa75a3c9a0edc939c3a1265531690aa443463a2aca0255e885d3c190a0100000000ffffffff020fb201000000000016001441c341ddc5d49539e5a9f6c604c91582ce37f579af3e082900000000160014ebbd98beb987489286e5952f33f05a9bb38e349a02473044022073ea75bf0861e07a8312cf79bafd7af5f487367ffaecfdf95d060cdafc2af115022045fc55a99fbaa64a12fef5fbfa16afb3d6213af38897621bc5a8735136910c5d012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101ae04053812ebf33e8858163fc1c7ee2a5f14ad7cb010b7c7671c4c60c1b2f35f0100000000ffffffff023063f70100000000160014b69ed15b0e90b64afa81aad569669b6d55e6ad35de99f567030000001600148776a0d51930317f6839491e81abe990c861dbe602483045022100870a60e7c06024026234fd928e2b21ce1fae4f9e3a7d199fa532932e34a4f36302206c9316f0601c94abfd38e91529536faa32b42118f44df88323c8e670b85358c0012102e32ff4bd5110e57e8aaf9517557eea6e7545dede276ff998c924900711317599000000000100000000010138425a6c3030ba3c028d9ca41a66ad72817951bb4ead6080b3191c3d56c343b10100000000ffffffff02dc0810000000000017a9140377e81c9c47b9daa5329e426986e54f9e8d5d4f878fb6424800000000160014ebbd98beb987489286e5952f33f05a9bb38e349a0247304402200325462164f80301ca98a47ea9b51f818d8b346f85e38da0d28ff4847ba753f202203211eaf31ce7ff8dc6c567bbc2175a386e2270cdc31b96300efe1b5e743bcdff012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000001000000000101616901b7ba9c75c875aa6542cbdf8028ecc6c5aff49a658a1dbc7ba7316d9a250100000000ffffffff02bb9a23000000000016001443379e5e2359cfe7a69ebfdeee0c6b2e18556112e8cd08000000000017a9140a02bf000f834ab1fad0e524ad1f887487c3208c8702483045022100afa5b315ee4e9688f10dd9134c9b5cfc1d69b118fa210a8bb9306a9708a8bbd7022058c617d8834a9865bbdd9ff9554dd2edc57ea3979f57ab1b2c376fb5ebfdfee501210325c338814c79ccd23e5a916bae4cb969ecdd00bfdefaa6fab767e972858b30040000000001000000000101c3f9ab2024779c5251abb33fefc0b0c0bba8c4bd842fe192c70bee19788c28030000000000ffffffff02ea2d1f0000000000160014f48d04fe037d4a7389f347f115568d05364f959ee86804000000000017a914089d9c5ef1c22ec4f4960a14df671626d24f7caf8702483045022100f20327c2f3989dfa11e703cdea529d74e3515a11966ce6476dcdca75b7a3fa9c02201c7237e136b517941935fa3fede5d0ddfb07be233bdcdd210c631cc9662259de012103847e60e7867a8d1781ccc74ab4ae4c75758fa52de02eafa129ba7718bc0733130000000001000000000101c72a4b22cc39edebfb0a32427a764f2979d309220230fd35604181ab2be755c90100000000ffffffff02a1810000000000001976a914137fd289533c1dee2bd18835c6082d44279e76f788acfa0d0b2200000000160014ebbd98beb987489286e5952f33f05a9bb38e349a024830450221008ac75540261fa2bbe09c5822542f05633c3683ae9ca484c7c52cad5f8f96595a022042ee54d5cb536393549a2aca6c8379b9b6d6456e5fc7da2c228900013fedb57a012102b6d9ae59aa6ee7a5650305d0cf9667928f941d982c613188b495e3e72490e7100000000002000000000104d9ffe6bc57e8f4822a4e0c6093861fcdd246c9ce3f0f11c8a5b639a3ca40fb700100000000ffffffffaba2bbea4d95ce94f6441d606ac633117bcf0a0deaec50e6ba19e900b3ef75a9000000006a473044022068ad37120539b35b9ba4e845f5f1d64c3f2e9cb940959f7c9adae625db048b4802205c758f57efa0d2a74f961383032f0b62a107a6f3dc2fb75fe8e3a55bc5e4d44c01210374ca2db2e1d7907cb87c8c9f171c4ec6434b4997e2a2e9849eb741c2bebdc881ffffffff78785411f9e8f18dbefee73b773c1e81c877e9bd4f7ffd4e219263945d2be343020000006b483045022100c3d43bf9aa44f354cc2f812e1cd43bdf521b9753b1e148436c9d189071331cc102201f7bf4c92d912a327bad1448d6724a05f92edd1a6542373de331e8cbdc53e59b012103b0eee7c61925a636297ff1ce2d0ebfa04cf841d09a7631a868f7aabbca40b6c8ffffffffd5a9ffa5802575fede44a621f77e1d96a28b083ed3e915cae6a475962c6afe92050000006b483045022100f015204d3dade4ce52a841cd934ccb2f2cfd4b4ace39efdeabf3f2f542e91a0402201e87c7e2138493d318ef47604dcbe0f6f49a450e5a4d6868353d0140c70040e5012103b0eee7c61925a636297ff1ce2d0ebfa04cf841d09a7631a868f7aabbca40b6c8ffffffff0289c80a000000000017a914aa0d3eba7116efb0fe48ad864513c2f196b1f588878286000000000000160014bb1c6d3928d220320047d81f1027d2251368c0a50247304402200fc636b4279f9a92e58788cbf6ab6b89be35c3a339c1dc75f288227b4083b283022036afd592314b8baff26006f4f88e9e4c6ca3c7afd2d896f5fac76f41f49064aa0121030c2c38701edeb2df8c78f1858dc2c43e2c7599a1c60957edaab101a8d1e848700000000000000002000000019b8d0e5c045434ca5f0346b7a49903f2739f665c0072bd871ed373747feae573020000006a47304402204a45efe41a01d329b3f482eedcde03bd81978ce2e42729115f228162e8cb64ee02205057c6c82e17f6697d96ccefbce5e0ec9d3728430805d4f4bf99b27e39217249012102f81f31afeeaf57a8521ad9e353bbcaddce87d70d72cd314676bb3c5655fec54dffffffff04cd360200000000001976a914361c7e3b595251a75f268ece966600bd7ac6f7b588accd360200000000001976a9146f1b3f5a8fbf958d6d7119e21aa6f12278e78dd088accd360200000000001976a914dc86c2ab0c56eb6b989fae38db6ada5e8aad654788ac40bedb00000000001976a9149d7a124db0d946b65a81984fad65b21a892caf7d88ac000000000100000000010470ae00f0bb275500e1535642072fbcab18fb4b7c0c34b1bc3852380630f7f9212c0000001716001493985a1e8daff09f985e249c2e8e1844ca9a675fffffffffbe4c6a3073f8b291830111a327f8f3451e3945476db024bd02bc08568b89424400000000171600149b7aa51dd68b93d29aead4085fa5cff458771ab4fffffffff6e3758014b30b32725566595961377357a224fbd66212d97e9598905956dbd40000000017160014937cdd7830a75e2509fddb69cd1cd1e4a15344a9ffffffffd678fbfaa1a16e093f4501d4908a3f2d33f3f3b7d8e92eb5c17ed74681fd9ddc0000000017160014fe2bbff184ce19952eff891ace9af1e0eefcbd53ffffffff02db6e00000000000017a9145fe7f2177510a8e14093d44922d827cee9b0dd9887541a0a00000000001976a914e089db993fac9049e0d7b4966bb1d42a0a44a2f788ac02483045022100adf0c94512c1b364e229dbeac168cf3847d48524bf687bd940190332287fa1df02200b9b532ad826e4507faff6e698a80ed22a3d277f037d6fb6de7371f0ad9e3a36012103bffab4d0c3b6add924fc2530a69b6ffacd1b411e804b72ea71f3d0a8a312e0ff0248304502210084415d41b39d36278baaab39713d5d6a1bbdb39a4d3cd4f2542614549bd0209202205d08fceaaabc43ad33c11815ea13389869616c57d66f0c389b7494a74a6eed97012103a604b6631fd9133f56e71d463f47392ac1f1e68c2c638a3c2822295ba658ab4102483045022100c80a66507b26941edd5462fd8377fc4549576468078c3d7019583563f7db4af802202e14d25c9305f08289d8962eb78b8d900f52116f0eda54645272fc7c63fe537601210319dd7684dc4265206a56ffede644a227b459148b25bd010e628a8f02003ce6220248304502210093202ce5b4847f5ba1ec05d3184ffac2aabe23f069fd8d2f66a3ae893cfe399a02200e56515b787c640ed7eb539cc5f873e1361f080276e560f6ff3b5bb5f6527378012102a4c881d73daae67d518778e2bf89843f6fdcd1f5632ec99ae446cab44a97001f0000000001000000000102bde64bdadd236469428f64bc50e2cc8d5d6f1a4d89c84657569520aaaec8521c0500000000ffffffffede903ed5c56f720af6eaf992ee3d688bfbe10bcbdf87ae5fd2cabc1f2cf01af0000000000ffffffff02ab3e010000000000220020d265e9455c92bf25821580dbca4fe41dc186c52a8ce35b60f80640169a4d36146656b700000000001976a9142fc8e805bea78346ce4f8e772b5a5bfed160ee0a88ac0400473044022068738e863641d5dc11e32b1832a29912af3e3af4213f2f5132fb2a50e560d54102207c0b3eca90f0dccc65b6107960f480ea7b913edc14af730d72ae1905cfccc0090147304402205eb0b8a104c2eac342aa9f003799987dfe8ef55a6d3d5a8db0da9274bc6d51b80220349dc89b77ccbfdde7c7df02349aa85e97296ce3682976527a141ec1a905bcb80169522103771891e71dd6810d1d0ed2aecb8ec0e895a879c4f2d809805632d97d28dbb076210373efb58a6a3ed1017bbb4c86bdfce5e1323bbdeb99f288d2d74b77650b50ca1221030e84f3ea006c971c0a79013e05d8f577c2f56c6690db70bb4596eebfd9b5283b53ae040047304402204b03f4e2c3e5a5d4dfee662982e45887f5ec7f0332b1851354ae034066bfa239022053403226c371a743a991bc8ce2c0376ed5a5b44c7825f74ce9cd5f568bff2c0f014730440220723fb2038aaa319fc20df318059a36b5ff02217d3ced6fbcd7d387a9757060a80220729504185360d6d3d0107d0f5b268dc890348fb6f54fb3f53262bf504dff1e3b0169522102f0bc6592d2c1b769b49cb5ca4c8973a4f0e33bbaec01d736b01baa5a22db49912102c3cb927f12a94ff7c2e3f578d328445d15f26c587ee41853a7cbb3ed0ff99c6d210332fc5bc30c3c9e576e59e441f29e9151e52aab9c1d2a7ec7f176b232b4dad2d453ae47a00a000200000000010201a5280a4fbc6b8bf5703e6f920e71c38505a8d1bbaa1536ecede39073f440c6400000001716001493b35d56d6efc3fb94ca16e416784edc3ae2ed83fdffffff3c38ea3561203cde49dad0af65150546d12a264c0ba9dca83fe74aa0481d7f2f00000000171600149848ecf62233cbfb2623b9980d7871166476c319fdffffff010d313b000000000017a914bffb7318cf11b38a2f00faab6105ca0f5a7d2b98870247304402201be62cf4ad7ea1b9d89dfd841723d9227285a609f8a53eb2884117552f92776102200a0d1a62cdd14aa8bf3c23e9f4f3e93c2602ad11d2417dc8ac544606cf66b97e012102e986427ef34e2045e975091d6389412f903eb543949e36bc3ec3b8c3e7a5d1bb0247304402205271db6c5152e69f885cf8320a99557b72414738915c79a1772797e8e6a451470220328761d870790cf595cfafd14861aca2e30feb976f6d8ad34914c594ebc17b29012103cb6546712fa3e9443bf5e6a6490347f0dcbd38abdeb82d5ff6000a5647e7e4bc000000000200000000011d56e9ef574aeed39b0a22539e9310c746e1d6faed8cbeaffdcd1ce0225b64b0e01e0000006a473044022017441bdbf96ffe0a68aa1d481014e62f5f6bafe8a2d380c44ed8d2e243b56d6402202c2a4b325c67cc1c5394799fd10645cd23d93c9d5639c49ff892534c961099f00121027052fb0dcbee43b14bc42714343c63d63b63119ddd59f70636dcef7b23726944fdffffffb645dae37a34ec98261f6c4a79c479714a30603950a2132a0edecaa07fc0b29e1c0000006a47304402205a33c764faa97e29017626587ab617d942dac8b272f44d78a3b1eea0e9b29f13022074ea6f7ef6d0b45a5467beb4a82e893336295dd126852e3e82eede961ad7d472012102470d4e0798f9bb76f4bccc893f50fc66a7a56c685c508a057fd8aee655f5f1b7fdffffff2ae2a1f01c67806ee111ef64e4a90a664087f76591d211d6e6d40584c134733f0000000017160014a8d7aa71cc2fb6812f9b72581e4a1467c35b0e0cfdffffff669fd4b1e924b5c1062cb34d1fd62809097d360e69b99d747d89f405be5de9b2730100006a47304402205f434088f5f36ea11fdfba7c723aa58148746ee07155d2639400b9a0cf1a51ee022066624f00c2ecbb0a52f142eafd5c67070a78e6d40e7043e4c0917d159231c17c012103808699afe5357d905944e50d9c93152cf6b0e734be65b1bcdaf22599b3eb068efdffffff9febd15657be8777e1f27cc1e189ce35dd6490c6b2c94a70c00f4f447ff6d479020000006a4730440220768a08778028226a773d2f242941d80f7393d2ed031d0c8fc18b54705960f029022042d223848a3830888b302d3f8230320087a191c1a632480035390b88056eed2501210329f527dd3601222aae60c1b14127d9db44725c258cc9142b7579aaa1c408977efdffffff7265f31458b895e117d6b8271eae91790cc74a23fe7aec6754ea3726ee174f8d3706000017160014f6108b94703ce2efb0bdf491358062d24f20c2eefdffffff04c917c2f41cace332a53af52c4d068bc881cf8fa7a81a1a52027865564afd96010000001716001450bb0b9e6d00327ea36313ec8f6d8294a20ca106fdffffff4df6c0d1484bfab722899fc86233da3dd558c50480f0c93cde7656300162d02d8900000017160014d4f15742c27cccc2959cd04879aec0643047a437fdffffff9ecdabdffa9e128ee27f038dc1df08a88044237e3c326dceb3de8c1efa84baefd40000006a473044022053b324e5346cd55ce772b77967459b2744726cf7af051da9785e29fb6972dcfb0220176d152ad5f9a5afce17df6b9f154ca19676552e9c85855a15e9fa58e56d26220121035b587b840adfeab8a2514d5a4c7476e69482ff6f8484d895b53a4227a22889cbfdffffff10a075f2d9e6f31eb0dbd1f0c2cba4852e64459eb271e26ff03db498816a7e8f470000006a47304402202bb37eab088d3c0337cbc4528e73abc2123cdb56005dd8c314baea24f0cd97b002202859b9615c128132b881056426a0fa8176d261c5e2f7a220ef6eef1e56cf0609012103bfb17edf8ad4e331216353c421a934b70191749b01285092204229f5a134439afdffffff3b4492d68ba3e69584b9d44883163671b0558926d5b263604a2656ea5f35a31b000000006a473044022065faea0defdfbc4278996de8a5120b18b7d84c10afe70890eb342cd7864c11670220784d1d726b6c51ed8a5f52b2cd988d586d0f2aa174669a9a99301976ceda740901210380040c7110407becd011d2369d5d92f86c87214765a20818142240948fdc1e93fdffffff5f4797f656c694a9020f5b0db0db527d8f0dd808fd9a2bf1e4fd47b87f4a23b6fb0200006a47304402205cb72144fe94c02d0b4304fd9820cec187d478b3edf1c632a28d482b388c353402205b7dbbdda58853b550e419a392670f82b7e4ebb849e0c24efde6601407d75f0e012103c087a3e431126230df4c6584eedd6db45f26098948efd136bbc90db3b2a40fdffdffffff21dbca8409e909bdad12942e9d238cb58c0804ed8d808f1447981ea3aa9fca47040000006a47304402205c4a09deec6798fd0e2280458ae4282697520e84e95c13d1d1e806910a308b97022010dc647d7517c6613df872b6acf16a4f77134e5ab65c672987a4c226b1e50eb301210385541a7ddb6d70554019d08944da2d42f2391c8a076d65641635854eb59a7683fdffffff7265f31458b895e117d6b8271eae91790cc74a23fe7aec6754ea3726ee174f8d4b0600006a4730440220048c26ec58362a9a07e657f67a19954e4519c251c008b6472b105d65fe55638602204a7ad3c9d5cfd17664449f4516c0b8efb02124836c0ede17a4ee65984e5d144c012102c92d3ede08de2b98c5ffd13a9972ca6d39112b6e30655da82f976962a83073acfdffffff89d6d7ebc36f1da4a9bbea2134a660cd15789c358be7630242dd0725a85ecbba9b01000017160014432ed69502cd9867ff240359cb5b681ab462b941fdffffff53625126629f84a0bac66a1fccec949e3216872f1ba299d947a70fe3d0e0f1a0210000006a47304402205f11a85eb78683cbabfa02b304476ce13b233036bbdfafc357bab93c03e64d9002206a618e4c9036f8ba25e0521f0ce471f1488282401b9bd5bc35094be7312938950121022642f721ee289c32024eecec32408c3fbd00f1655bb11fa30aa7f58f504bb4a0fdffffffef5463fd230415292df2525d9c7942ad193c262532f326f5d3fa441772e7103b050000006a473044022032880c0f079184d776b8b268016ea6b9d3a3ebee4eff1e3c51ae10bbcff4830f02206b99004e6dc2d3b755ca9b8725777453f5f33b456f1e130a44d0d2bb5f170f7901210385541a7ddb6d70554019d08944da2d42f2391c8a076d65641635854eb59a7683fdffffff8b5f0a88f013c82e9ab913c7b0f0530456336b198ee419d787efb7f0807b0de6190000006a47304402203efe9240c152bbbe449e599616ed27733ad04fcd510cd77c8633c8260d962619022007cbef277860b1b5ad94f1f4a42287bb6376c3219ad1e21be9dc6411ff7d0263012102565a65b59244e3417fe23965702b5886d35a40a56f1cb0dbed2813eb06c84788fdffffffa6c1c17981a7cf303b6c622b9cb04b8a35cd3106f233783cbdc9a11fb6415396010000006a47304402205928943d543e9413d6ad533a6d0ad99bf86c235fc792af677f647a96d37c751202205f543d645dff10f695a863835dc9791d1aaafa0392467032a79ab847348e5658012103a46e9eb73e3ac49e64ba9712136842d984b6f19e1ac78ab40e64bfa024ea2f06fdffffffeed9da3c533220b3ed3bbc25bf099398b80c2e4b29857e653c1f4817728562cb5b00000017160014d664ac70aea7642179787ddea7fd796fba2792c3fdffffff898afc129e7605fd865c44d475e55df407bf7dd1154a0375c0a8c23944fe92b5040000006a47304402207f781f3b610b5047215e639ba2def9e9299d8c777e69ea62e42592d3fffd3f8802205aad2a4da9035fd9e2df4d7c54a6ef5effd4af60ddffa8f78e08b9cd7bd7274901210385541a7ddb6d70554019d08944da2d42f2391c8a076d65641635854eb59a7683fdffffffbaaf768c7b258892509127a5fc195e03b026be03f46ca5d7b87b075c393ff73502000000171600149db27228e9bd1acbea038d645e2bdafa4511e3bdfdffffff6e01abd306f3f2a3067ecbe62a6d2ec6d8ca08405a009e8392b805afdf0d600f100000006a473044022049067e93eb5fa48f4c14831bdc90c19752315b02c4abbf5b06c61bd0b4df75d0022073afa902358aeb42f25ca2ce6a217c3dca11bf9cbb94bebc1edd600240160eb5012102470d4e0798f9bb76f4bccc893f50fc66a7a56c685c508a057fd8aee655f5f1b7fdffffff7265f31458b895e117d6b8271eae91790cc74a23fe7aec6754ea3726ee174f8d9e0600006a4730440220021fc1a19498e5c13b054dc47a27e1e024e06f8ed5cd970e5ecc8c166111d6dc02207fc5862c07b5d941b4979b43905a165f150ae2419477c43e6d0e67fbda7ced2201210246a5c53244ce63af90ab7fbfa6df9f8c9eba983fea9a7ea3da522a202cf33694fdffffff9ecdabdffa9e128ee27f038dc1df08a88044237e3c326dceb3de8c1efa84baef950000006a47304402201e4f15c07cf4360f7ef284dedc8044113f79b7dc6414cae9e90f91e2c739c2150220627f9fbca8f6402ca4cb931ba6dc1fd5325f85c44202cf1ddcca7839dbd7dcd2012102a133b1ae104910fbd254ad109fd2e3b8f0fb9d48416e1a9d7b7a06a0927d4074fdffffffd55856eea03568a4d8bc3a84f926c45a9c568c979469f08da4c3df7f2d3b6dcb0400000069463043021f7c0db1db84d34d15643dc2816e43a02e94b113dc03907d2de52f1978dc88b2022066ebbc2a3f249d4273fbf200f093a0eb21a382872d60abf4adf0d1a77c3e62760121034b021e229a515efc4a1b8e932affbdb676d6665d3588f07244be1ea0e3fd1e4bfdffffffbd0ecfae6acb7013f83773e169554b978815b882afd86a09dcdd6f213cae7fc74500000017160014e920a0bbe3dc72579e5ad112bf830e4377b3b992fdffffffef1a41ef46ba98d1ee8fc545a491a892a7acdde95fe3fde4c1e98f40dd64bc300000000017160014bf65a5d22e058898f5e0af7f19afc79c4c7944b5fdffffff00592cfcd927227346a83e39ef9d63b641cb535c584296fa0236cd98b9081fe315000000171600145147fd5b2e8899b496af531e09b5441d2932d254fdffffff0140787d010000000017a91422c6d7bf0881ac34c735bd8a2d045844ca00efa3870000024730440220147f43378a890c3c7dd91649551ab891715d23ddd88575bf6bcfcb4ea297bc410220436a38c8f1588184e438f078102b1a1bb3b7273ef125dd09d67c0f2fa92bc8c4012102fc65c1a74b49c1982889255927a7ac34c5f4c5851ef6805b831a48258d7f0c280000024730440220428bf6f2af6b43a7d0caf377126f17aa6f1d9240c0de572bcb1866722c1a5202022064504a4802b88b68a3b9008eac9a1507a1eb54cba5a330a62c8bdf1e54e9fa40012102a2cd6577bcf8cba47d4751f9881f5a8058c45413f60175865ee750a2f9d563ca0247304402204f9d4db2735b47f54cefeb8d4b3fe9aa32bdecfe3bee08e282924cee86c85c5f022051291a456d53781df752a8117d81d827d6c68a1a97e0f4116076da19fd0f1dd40121039d44e1f76ab73356f15559081991f81c37586692559a53b3e2e2c339b25ba51002473044022059ba86c5670922573e210d8dffdb4036bd2238c6fee44019d99e5561856e39f102202c018dab64079eebe59578f96690cbc9671c376de89092625cc55c6e594d0a0e01210333219a53b9aff1a172017506bcd8df024655e880d5c9b6c8d4ab79ce9d2765d30000000000000247304402205987af9d6bbb6fdebb2f0d1d3a917f65ed5253da23b2527e4455115b5bbdc324022031e470f51ec705c12e22b3a44e93a2433a27a74e7509a5eecf0676290d7a2670012103409c6d4c8ff5b4fd13bde4ffd97113148baa83e12342bd0a545d2c2973231dec0000000002473044022020d8f6f8557836c00449620f1b59d832a9d7d6341420c97b6737934a17dcd617022026ade099f6c951f585dd8441dea4f3078c4e187c67bf4ea19543c9b86644b6c5012102cf299741ce02c3d2974767ac2369a17c4b78ff188d6636f391037fb51a2e2bb000024730440220197b2d40e74134bd087c89d656f4853f35a49f55c8365d5edf709ef5dcc73f7102203c114b7fd6c7593296c0509f0212d23a6d63256b460b8ae1edad7a814dbfb263012102b5871eabe86a1fc4552ae2dfaec87206b69924343bc6a93d93be6fa362daaad90000000002473044022076729e66e563052f47a19853bb88fed9cf71db596ee029e9b6ab598d0d79ac2b0220057e281f079295054af422885b46a8961e278363adfdf9c8e0cb902cf8550a58012103b5591059dd77337ec29bd3ab9637645b2b9554232bfb38c8fd7354849d75be51024730440220034f3a9faff17ee0e8bbddb300d3d60b7e044b97542182cf6d7363fd1305df05022015a461c122ed55ba18972b2541112b9bf50ae9e70d73e3c70717b3cf29b675b5012103a3a4d200731e50868622571a34040dea94f578482c6b4e8b6d3cb19a778d16ea02473044022059081081652698b2881a87bebe1a82a0faf1db70ce095b81dd4891e716fbd26802205b716237a1c16d179f308c2d772c860ee8ee3e9229a7db16ca0a8e80744d0501012103afb8e3c4f739f33f30f154e7fd3222832be7825e667deb7a6ccb908ee3aa731844a00a000100000000010473193d49b2e8021fa6f9bf433057822a197a6c81e48fdd14c332e3b398380f293000000000000000000b322da0b9e7e125ca25e4d4f1b00b7f2f875f9747c2806fc0f0ad04954eadb71f0000000000000000fbfea665dd3daa4ba78ca2607e3d7ad67c12bc73b433af7c0e47312041638048080000000000000000bfcc5977771dd5e45c5ac34d18d44293fd7ede26e867b0ce74d2926c0b6e006d010000000000000000014870b6050000000017a914d36749117ee85b22322ef20a433911c8fb1449858702483045022100cd529059ad28e174f2022f5eaa2084c9a905a8e0235e4df9f7acd42850bf10f5022077c71a67166f2b8905e9280c0334b576c2dac6aae9951e8af5db5b1aab7d63f101210352c25409c884de50422a9b5ad5a59f0c6d146dc19e1fbc3a5a6f91b4e364a25b02483045022100cf3cf16ac41e8032317f5d5a30c27e380320f8329d175ad874254fdb1efd736102205f7beb40ea0b50070b9521266028a48651e6d5e7ca93e3bde225e87dc5d036a1012102be0c56bdf15e6ef62eee6b0a8e54e9b2b3eeb5e2bf4f01d5582b94a4f3bb17aa0247304402205abb9bc034a89ae1e7ea2b7b0af677d75a6fd78ce4a9535328900a42e8bcfe2c022043a3c006cb43ae910cd4bbe491bee5ce59371cc257409f5f1d9856a117eb0e2c0121035e832a32a6a118159015e293ed772255ee50e89e0f8f9903dd0145c0a17b00520247304402205beda515a8651e20d1d1a0309e76d307b1245d7a0c5e4937ae8587a53a2d725b02203e88b41afcc7761c17126ab2f2c96e2e2965e60d56b4eddd76d927aeccfcc2820121038999402745d08ac1ab6adb3220308da59f260aa0766f1ef878a9ddcee920a07200000000020000000001047562cf9fcee9a40dc003d47675f997e5e8ad0232e560cfbe59740bbb3742bb3273000000171600148def566553b2ef19931e8d2b9624f81c4c0591effdffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a2000000017160014936dd8421dfa09fe568828645fd1d11b3e3df5b7fdffffff1ce05fedd416c032c48a21596ea39132cf71a4c426ab27b6ea778525f8fb4b6003000000171600145a4007c3e395c74c7457e9d12324834ae3f40682fdffffff620cac8a97495ce0b0a6614f526ca5a0e5f774e9677c8b12fe3148b5894759ff0000000017160014911777bc6b231068a246318b2d6db96a01fd72defdffffff0336c02000000000001976a91489d618a3678976a30963b8210abb6e0cedefc15e88ac440b42000000000017a914701995d14beb925cb7ba37f42131cfed5383968f8773c11400000000001976a914f0489e3e4de93203352696769ee93db42caf14b388ac024730440220270e4751e46b814edf62c932ca33f1f72d8a5eca26d2534627f66b58c509333c022029bf10a886c32d3f71cba966e4bb26154e96b7a6ca8dd554b41ecbd995fc0b19012103c40760027ad43ebe16921906365d6d0ea64b205ad96955972d13691b5c7c60af024730440220009c67d1e0572d065e1096f0cd9c3a2049ec452ad909bc85cc06ea31e1e5204b02201ebe09f7425462bad13a41354d4283dbab9ed7e231e135c9cda8115acbe31d95012103dacd76227de638b58a08a3f0de47e6ff99150c31573db33b4b3c1825587deff7024730440220390cd2b370469976268ad781b7219c73133b76473925624837c50e685dbb2a6c0220649b28a6af26310ba999f4984b2d943df2300228a211f7a1938adada1719a6b201210310e59c0c3018c0705a79743548e72e30931cecefc7ece8d480e0b2de2f2592aa0247304402204c9d8128b6a46f0401168394fbf4ce1cfb0bc97092540ccfaf024df736faab61022027c5587518b91807248d113202e5e868f924379c4364974d1a45521e0b11d6ca012102647bafe9bb7b8aacd1d8868eca7191f963faa512066d56c704df64030c9a241048a00a0001000000049c5c472de3926d4e12446557aeb9094230500d7fcb62e9d1841f8b69129ee5a6060000006b483045022100e3069d24ad0172c24588b74bd3c86ebb0d91f5a9716e1cef138ce363e695055d022052c40c81ff55f65bc372e0d4d1da1485f2e26acb8f522cd8e82620c24d31f689012102dccdcbd47cea9a2c7e77856d894cb382e403f36947b102bd6f3c124bdb1f5df59bffffff7308983e8cbfc50a3c13893dac19270d037cae9e14042024899dbb82fcdd168a020000006a4730440220684adf5675a95592ed2f135f4e94bca32e65e9f8c6ec190976dc7a1c4b7666a402205f60cff3244338f8c05bf8f0381b349cf94726df0cfc3cada375236ac72bbffd012102f95fb813a1fc18345bba588d9d6595e68828ed49093abecf01a2bf83aea9ae999bffffff5ef36c7551e39d98b793d28e41ae9e7baca99920ecb2b71b0606c1b11816c137020000006b483045022100b9e91d9fb1658f3de1da24f1f1eedd4ed6f3aea7bf0a818924c3121eb3b9288a02202231b284da4a3fc3ea8a92060b0d5aceeb73bcd8cae8463fb77950df01a8f053012102dccdcbd47cea9a2c7e77856d894cb382e403f36947b102bd6f3c124bdb1f5df59bffffff749bcfcbb1917ffc2e0d5528ed98dbc8919138216e1b96eabca4f7fd3b91ce64010000006a4730440220012478f0dc2d0f942e3a1c70e630322ce5838dccae18ee2ccee62249ea38782d02202581777e51b102917faf667a154bc3e1b87b6390529826a4f47d2de41f28428f01210395c86ccbec0688e6e5143ba6fb2acfe178f8ba6d557516b83b5b1968bdb4f59f9bffffff01e367517b000000001976a91460bb1c1cae8248d4cb0960887d93f831f29c5d7088ac00000000010000000001014ed605d5a65e1b3b5118459c4a71cdfa63455d51e2264c02c178c04b4a0ff0d20100000017160014e2d2bb743573e246d9db896690328aea6eaf2313ffffffff024ac0900000000000160014e52d2376f8654d14b91bcd6fa51b64a920f8f8cdc8db10040000000017a91403acda23c16991de161fd058fcb056b56e6f92bf8702483045022100f0d08a089a32c8879389331ae15a7ca3f43c8d81b80eb3a84c088400f505f420022018a890c7ce72569bb9b3994c28c2931c229aa8a8e10be3ab13fcea2317af6995012103a5ad0da6289d997fa6672c6be901c0d57ebcab62b0c7342bb87a6563198c27070000000001000000000101056cbf0bb334741344e7b03e362b697052a475883059aa63dc8791171e7869bb0100000017160014287ec8a346c76a935d95d9c141984c4f08b3c294ffffffff02542beb00000000001600143a5bf19f9b86cba7e794b29832348dd4208de26690ac25030000000017a91452563695ee8f916d39b5ab0fea0c3c75922bf4ec870247304402201311055d526da2bd50883415afe45ecf4c12c3fd257a793df107d36b19db35ea02204f71c61bd1765eea2d97aafd4100fdd31648a4987bca3000c9af6492a8116508012102a0de3ead07065f68a4b545b3662a9b27e48d1985718e18aec0c163a7d4ccf57900000000010000000001013be913511033825a5ad733f445a29cbf761a8c287af6a1931a9eb97641ef72d001000000171600145678970ce2a0b9d02ab69b3515b09410266fc2e8ffffffff024337eb000000000016001452418e162bb75bd115b19f15454eea1a375e198f69713a020000000017a914866a2d7e71354d95b19f78cce7b9594bc097567e87024730440220479de1ce2d8b18798802a805ca114545bd06890bfe001058e5c290d2185900e002203170209e92cbb8c4c34bd2cbed5f0aef4b27cae1e66c61e94f1c08ba3b946570012102764ad7a299ec5722973dce5b7feec75a6f58f2c3d8bb1b242ace4bdf64fd0ac600000000010000000001016c397843ce03260da6b9044af6e617517755c4ed6d3c231595a2128c2292d52d01000000171600141524264dfefd6ded439a6afd151d6920ad6842daffffffff0272461c01000000001600143445ae1ec166c09bc914f75711b3d436c295b13b13271e010000000017a914342021b23658fa63f74596ae17f0c32e81e076a68702483045022100fa29fafd47e607b774e65ff4ce543412c6274fe3c29f64a9f8fb0f4fef6eeed70220079c3544d8a2326f6ea4cbe6c612e161141f82478b87ff5997e152d0026d1bf601210331ee628efdfd4e1478b30f57a79799cb0a8010d06300b37ea9f2ccaa664bc9900000000001000000000101a379e86639aeceb83085d9958d40ad244f888dc37f81be89001e6a4035f0511100000000171600144d16b976776effc4767476304dd1aa3c4a429ea9fdffffff025c2c01000000000017a914b229a747a771fb916c1c51afc62576e47b75e47b87760d020000000000160014fe03de26301326f53fe17e853b0e911f760bfe0902473044022057881c660a9f4287f1d9ca78f23136e02d32bb9767d7f03d5b130dc2a72e95c002207b805e2dd91943749ea5a5fddfb4c59b0b8e63446e08f57bfaa83d00888a0edc012103982cc24b7c27a25a1b8ef51104947afd9f9120c720b711d416baeaa95546da8d000000000100000000010120fcbf6658ca21301be44634544c8bc74a0bafbac200770c0c4f6c8d644762c7000000001716001469e6e62f7cd060ae905f041d4442302c2119b39dffffffff029c0a050000000000160014be990708ac2448c8996063059e5048b94d031588fd1b1c000000000017a914ab05ef93b7fbe4b8fda90160712297d3abe0ac258702483045022100f2d97ac501df1491360e74f4cca594e9d4061367bbb4e0781bcc50e6b7f5a880022012d9b9ce06183d087cf0bba0d5c8909f1349ad4760c2b773fb7f851f0ecec85a01210224fd850c02b1ce66b23230fd09a5dba2fe1e25068bceaa9d33a601b6d2a6964e00000000010000000001012e7c8406f40eee14068ba5547d7e09e35b3ef4d5956c867bac9fc536ddbcb3bd01000000171600140720791be6219491018fc63a6752c2a133a92c8affffffff029f0300000000000017a914c971bbdcea65f3cd2b7a5d69f345f6cbbe54681c87901f1e0100000000160014a8e82a45c3f4ee1b1e05fd80608e1a4d0e758e5e02483045022100ad88405dfd547699ec922817a318a8631ab6f917ae60cc40e6a3ad6948cfa7f002201081229f8cded9256da2ae0c5d14a824186259bd73557ca42c697ecc48c270440121025ddb9717e35303d9cf1bc6df0e35f097ab19ec0cab572968ebfca3809e31dd660000000001000000000101bea72d9ec544c080f99b16575cc48e90699de7243cfae736aba235a9e3c551280100000017160014c26902f6db43cde1b5c4f9aaa72fd0a5209ef0b4fdffffff0230ab6e010000000016001469e5a18b2a49acec5f90a1745b65ab9382a0f89bdf01fc030000000017a9145cc903b87e714f260e220a5b8c819ab8488fde798702483045022100c323852987265c8921da23d0e1fc67c01e5ff152ecf7188915ad66e1d946e8d4022006ab721533352fc87d8872e13b07ae9b9a6211f3665d913e6b707dff1f339dd5012103a57eac38453ae4a28738547cdce81335c318e114b1f62dd824283c5927cc744c000000000100000000010169374a8eccec9b9e6b13714b6c34593973d1e2521e2bcc2e1484c478727ee5930605000017160014d192bc4f97bf89e8c119680f587e79dc847e379ffdffffff0284ae010000000000160014456cd214642611cc2844c3c667e48f7eb5c878f25adb18000000000017a9145b15d690e9d7d1862b7da01bb5962373dc570e518702473044022024eec0be2261e0b4d30af1af502165b7dbdf1813edddb133f942b7e6e574732702207762cf73ba5f6cdac41ec4c8ceaa88d315ee1e36a18dfaa4199c41c00258d61b012103fc3cede4b7d0ade84c4e68fd90478dafcca0dd94e325880b0daa65faa20e29fa00000000010000000001011d1bc71247a4024b8f519d6e65375ec991203ed02ae6b8f64c29dd2c215c6f2001000000171600146f9515b575b5f5aa791a974782b1f21c8169a839ffffffff02f049020000000000160014fa82e264b5df0f4c64bf2f678279f59ac96d4fd2b26c58020000000017a914be4f989a06cbacb0d0a1d338c1bcb4bf137bbd8c870247304402202b4989bd42ea0c1deb0c75368b72050b6d927598f87c3008bb123de2fef71c3b022046bfad1386386fa4e45b09a6b3431a9eee9615a54d94fd59067419039f61bb1a0121022d7536acc49cc3a1a64242e6fbf0b88421c240f97c08ce3e9074bbe54e55f2dd0000000001000000000101c4e407916edfdf53d5ab8a7a818f1d9077a4cd62a9b1c54a17f1524c6163170f060000001716001460d9ff48ce1c2db801fc5d6834f036e5837cd613fdffffff02e75c030000000000160014456cd214642611cc2844c3c667e48f7eb5c878f24e3604130000000017a9145b15d690e9d7d1862b7da01bb5962373dc570e51870247304402201b5991c60df8d72124ec0c9158184ee727e0a2c2ccb91dc93f87fa70ece8832802207461c4cd26525b6a44fb544615ebebcb9c36a527558db7e4172ba7f494775fda0121038a7189cf032f03dbfcc98a01db4c09935c3141c84b16057cbcf22fe50f8f869600000000010000000001016dad3286424f42eb659ae39efbb691e3bc9fc748e8018d82e493ce538e0009bb0000000017160014352a36976b06f57bc802b5fa5f34d1b28d2e8268ffffffff02088401000000000016001486978127532ebc4d1a5e4e52e8d8512aaebaaef73d7c44000000000017a914b931dfdf03ba48f7683944057fe0ee8215cedf17870247304402202f16c7bbda770399a501a76707e7007dc9100d61324b6dbb8c3d1921e2b933aa022005d194361cf1e517ccadb360a205b4a7766eb84f96b8df018ecdad7c8423bdba0121038eeb790d402154c4ec5d409ac2a93cd860701f3f98596388c0469ff3fe72982600000000010000000001013da42b08821792515269222ea99ab88877bc86c3ae15512aa807457bdf1b742b04000000171600149b3e2786178f4e9df70ddf76b01d2677c7ee99e6fdffffff0250458c0100000000160014f8e96d40954ebd36df2da900acf5f1d399438e956b7d16020000000017a9145cc903b87e714f260e220a5b8c819ab8488fde79870247304402202c8bdf5787ee5787022c7e20d23c6f26b983caad873a454260a492feadd3803302206d82cb767b7285dd052623da6e85b211af3bf61e6f0bb1e15f134bd0bafc26ce0121024ea19963b898244dc78b85361b2fba00e0bad41a40c31fcb8bda552914257d3a00000000010000000001010f5594e35c6111f0c21691381ef3fea5b9efb92afc2876ba0579a1d4b556ce0b010000001716001489ae90918bc9c9890066402343698b84d0ad9367ffffffff02941f01000000000017a9140df2e45731469f93a77257889e1c59cd7f3a4dd28761834e050000000017a914becfd4fa6b7152c3dc84bea7cb2debc09af3d0fb87024730440220458aabd4724c5d2ece55e575c2fa695f554ef9fbadec630af3f10b51732611f3022035b891ec0cd0d256f06a31ead5405d05a015b63ae02a188e00dbf7bcd054eedd01210221c495f2a325f9462c7e45ef4c00624242e6f9c4d833a0e4368ca05b96007f0c0000000001000000000101c3436488aa610417f55e58a2ca8f61285490879540d03d74194f5e5c501f0a860100000017160014079a80e1f90c8f9517c54460990bf031bfbbc9b4ffffffff0248ce00000000000017a914e633cfefd37c32428d2e8c1ad6b5412ee3d58c3d872fb14d050000000017a9143a9f90c9f73e692a24d5b442d5693dfc9324e265870247304402201e1a1dc3c5298158a87409eb9241b71d21a360bbab589ef12b23e606b274639f02207f9a834bddfffc73a8268e7827f08e688086974601e4d9dc0e5a0847f508969901210255d868545e0a600581318b8174a69476251c10277d1ab2a6c4c942749d4aa7ae000000000100000000010130c7181ed93a2d6c9784379cef69cc0befa9a2987c3d9b81f93136a8e626683a0100000017160014e9243e33d13a4971af805093729868676ca898f3ffffffff029d4101000000000017a9144cde92e8c7ef72ee59eee9cd8ba09013a238db9e87a86b4c050000000017a9149972e039d0fcbf351ea64e31bc46b1a72a7b581b870247304402206ef06cc9dec0f62f038ed6b28cabd8c958bf9aba58a7457d5541dd5d2cb2b63802204c50b10d25b8a1715f8a3a896e2e525581951af4f275e648f6ac56829f899d2d01210359be4f0cd4ceb2582c96baa24996d8f1dc4c33fa978075635edbfe572735013800000000010000000001011f3048d757ed8f9466e7e6b1922dfcf52381fcd9f5042a0e519ddda1668a7b770100000017160014ed2ee2b62189910487caf820a9e952eec7e71410ffffffff028ce500000000000017a914f3ce0328e9c11e2cc628fb89fe4592a5abf07da78732824b050000000017a9148674cf9110d0e6083f1ed2e6300f33260803ff1e8702483045022100db45c12b4552ed0e28dfc5a66c42bf73eb221a217e9f604754c8849b7eedf7e6022070bd6e7748f76cbbd30eece6c6d6edd506c57fc04628ceff9be665f3564695cf012102c879b45190ad994765978eee2f999e108252040c3c62a29e3b50adf2a5e73b9e0000000001000000000101583886bc10c9a4c0471b9dce90ecc9fd2a053a975791cea1e3d1903f9785748f0100000017160014f410d61cebe810f053537299dd93504be0149ae1ffffffff02243b02000000000017a914e9ddb8975991adcc8a511d2f02c614d32bf6d4e987244349050000000017a914822a3665e56113cf5cbbc4cea568caa8d12b02f7870247304402207494657da4ae24a9e274b3ba2bb03833209d8e0ff47374f31f6e27b57ce396c802203b0735fb92502e42272268b333b654e2d66fe584654cc103d719df2e66cda567012103e9069cae203d33dd34eb2032250770f070983829fba57a0886aeded7ce27f6940000000001000000000101588a9d6dfdf31b4c78680b4e20d88754acaa61b8393595125a73714fc1d75bf8010000001716001443d08db1fbdc7d23df0e3b33cd9c7a104bce3832ffffffff02b9e400000000000017a914354cfcf598da6843c7d03bc65bba2a0b9de67bbf87815a48050000000017a9148d832ff783ac3b3e0ed1155ae5eb53144b61870d8702483045022100eed17eb3c8b8d7c8bfa5d37ff77b4ad9e432dcbfc3d6d77841a8425225884cc6022048cb9dc330f8553a8067737f78299fef2e220ee5610cdd3eff008656f18edb1e012102a684aa71b1b48743d30478c2eee65d8befb7bd5bba2bdc6cd9d357684f6ed08d0000000001000000000101087438e31ecd8fd740700a484412fd37291bd83fc4cb62e682fbcc852483aec701000000171600142e4f683769979530fe4d88028a96f6ce99d1a911ffffffff02f8ca13000000000017a914f30d604f8dc15b5906cb14f8ddfe75fe56b6adcd87c53c7a000000000017a914a89e853b27194de05ec1e36521bf979232405c08870247304402203219a80ebad60b6ae5c45f795e3e66ace2d29138f8547ffcb409985e7cec141b0220788406d0455a5d607d00fbd7b6fc607bbf954822f29b4fcb0401bec0a2b9905b0121028f6c74d58d8a07d3f6ca6a70ecaa54bccfec84f6f0b5d994917e85a16600912900000000010000000001016f6b4a5a58547d27720cce2931dd610f87fa514a917761942afbc7de8fd978cb03000000171600141a05908409963177e8caa2b11613202c18f7d33efdffffff02e61844000000000017a914c4e8e91b6dfcc9751156981ba1c8ccce2779865e87f470b3010000000017a914850e65f24b5bc9d0ab15a485bd7e801b12340be98702483045022100f55d433a4e346251628de02cfe4fd8418728054d855e0234869664bfee31bb5302202f9cbb4cf62542c56a6b968d011db217262513cd800ac938cfe19818012ab90a0121026c162dfb211ae7b2aa22e317fe13cd4d6308535d6cb5bf4b192b4469b407bdd7000000000100000000010102015ce1b4f3daed58e0c858c2b7bb3a2ea74eba67ad47c36c3231b4d0f1820c00000000171600142aee6d528971a9cd00cf43ac58d98acacb72772effffffff02cece01000000000017a914394ab038dba14e63af661927e31b1b4885a479ab87ae4422000000000017a914930ea3b00a6392024925152bba9cb268169da2ca870247304402205121ef8c662e336b47aa7f10883e89c182b5b3c17c9ae3908fd33023b366263a0220053948c46bfbc08feabdb18a11736c34201849ba2817bc49404313ca90941cc801210262e55f53b1e3eb24ff720b9c2028b253249a70bcf4a88d468e778ce07230fd230000000001000000000101988b03bcc17c8871b0b983d535bde85f06757229089df6c88aaa7326fe2c97430100000017160014c4283c5fe0f414813ec4f993d7d2b3a164dc93b6ffffffff02ad1e01000000000017a9143730c203a86d2f74da69f7649d283834258aeb1d877d948c000000000017a91454c2778cb1695a0900af374978b549b0ab5a9e8b870247304402204672b9ec6f84bd21afdbd8aad4621eb8afa5a34ffb6b848f0789af666b22781f02206fc99628053e48ced85b663e929fb5ce629d9eaa4ccaa6750f0699decf6c74920121035589bbfcdd009eed70e50f069e621779b1f4376c25aec6f2d591c8b93800f7d2000000000100000000010106f49a88142801f8875d54fc2707e4cd56b530dc24036e68613cc9719cdaa74d0100000017160014a776858df491b3333f5c6b26caeb0635bad501e5ffffffff02fee400000000000017a91463f68d3bb8f477074ddf9cb24105b62ddac42d6587997147050000000017a91419562fab23f8fd0c11161d7e2d2162da1893683c8702483045022100e9247776faf0f437236b56f4d9cd45496784d482eed778daaf25ff21f0281cee02207742a467fbf12c8967eaa391e95dd351cc189c23b37008b0e4f0a990101f8300012102ff90e72c7d9dcbf84a4b147715438248e3ede500bdce7703d061a64470e158380000000001000000000101da9ad890c6ccb7c14cff1f89dc4c418597dc570c0e2b7f95532d8a953bd2d71201000000171600147cdf44d14cc2633154ec54c8273384617fe7d544ffffffff02255701000000000017a91492afb85e31377d06283370f7882112cc2df2645f878a1646050000000017a914fac688b26f59963afca20be8cfc50e8a83bd7ba28702483045022100e72f3a6d499da67c60aee85e3770e340d236c399bcab59750be5b951c20fee2a022058a82ac582dda8a5445a4cc5a792a712af3527417e67cee2f66c6c84b20ab3b7012103ebfdc1eced8c4c59bb14210e26e3683689cc3d3ffff50abd446f237043042dd500000000010000000001013a345ccd614ef7f2bcd1af964e5fead72d43ba9c68dc652e0dba0cc40cc9a1670100000017160014f67b17d873e2be26a2948f9c45b44b3a85eb99fdffffffff021ae500000000000017a914ff3e5cccd2f1611d14daba6710fdc58e07152b8687862d45050000000017a914508900ba4c59faeb7292a1a961853972833b6d9b8702483045022100d19acf2cf1442e1bd1e333c059e310e59f6baa109228136c13f3b87758863838022043c880834642e988a34d6c6742ef04f5cd20124b52749be7ef9dc0c5fce37734012102877a27d322698a0b56acab5ff4cdd8014207f8de638821d9659ff2ec6cde77cf0000000001000000000101cf6d5118f5f725241bac9c3439a2a37c0b71f45f83b36b8c6828457e2bceb1720100000017160014ca6bbf71acedb618bbd0383a582701339691aa97ffffffff02c1c900000000000017a9142e57cacae2e8b6aa41a0d9d676eefd7c74f87c4f87e9d503000000000017a914954ca664033929a98abd31731677c56fa7c746668702483045022100f3706526551f7c18aadbf96e63712c73490db2357e7da1c039f30e11937b9056022064c1f771db3060f148672625be44a7179174e65b36dd181c07cbb18dac3a2bf9012103520b25206434c83bd9ba6ee1464e83eb5ca7701b1a45b0d2a4a13547751a06400000000001000000000101067a734196be1ce4cc930e9c4adc380c001d9099e987df1ce91dbd9e44ddb88c050000001716001456e0b9d723e0c2d9c7dd52566bac9972dacc5923ffffffff02707c04000000000017a91473fc4df39363769221aa688660b6f74f8ffa96598755f305000000000017a9140d8ba77d98b32330d449162641b789dd35b004708702483045022100a9fa7b8bbbef8c799ce9c5343405453a93df584a2d2d5e620de57cc13a80729a02204dfede9e159a24358fa598fa1be7ff1b57a2507157647727608a0044583e8d2f01210276862b33e0ca32376489c9c4318e0c8506f52b37a26a16b8cf6d695e1d67a14600000000010000000001014e1855ee6136367374358297cc516987ae53ff7b4b200f5b9b8c5d95ec6b6c8d0100000017160014fa89b921fb9d67ef8ce07b3f000b11849ab6b17bffffffff0256fb1a000000000017a9147c3642375795446ed1803dff4a7db113574ae97187d09526000000000017a9143c77909a4b49dfa0cf6bd4466defe3074f66b288870247304402205e71f17ef1aed6890acb5ab7c43b2db6ba2bfe7241cddab329c3c8718b00f7fa02206e6417232a8bf64ed3cedc55689211e51d0dbad27a6c5db537a55686879d0bbc012103866bd62e9173b7cd1de5566fb6548122047fbc70d65b1c19cc96a79c8247a2190000000001000000000101182d1c420796127a567e691f4698ecd8a7b8078cdb075eea29104474673c0a3e00000000171600141a8d3aa65b2e840364e1cb356e2ff7bd434abbc6ffffffff027cee94000000000017a91401ad100bf14c2271981cf3b2bd770b5cb1c778a987005a62020000000017a914d48fa4637d8cb1199c3614bada835a7ae974c9fc8702483045022100ec124a8ddc5e9908b8d74fc493a86e350189a4b09c1de9a50667d78a3f329889022055a96a021e8bc2645efb521a4547e62e75ffb243944805902962145925b939a1012103f6339b20f1fd99e09c9b6ef94864c19df7c3d7c3d8c793c9c6c460b279782ee700000000010000000001014b5ec07a3da4a340f0fb38f8184438333df681172bd4f2c843efd2ba955eb9e10100000017160014b81018bcde33f9f434b9ce1b950ed9c91b35e3acffffffff02c1b706000000000017a91480e592494f6402f6b7b5fd5417d3af1c01c1e21687a22339000000000017a9142121f341e175fd56b40810594e16aae95efce098870247304402202cc721a964eb4f750aede101a620f0b09a4bfd7688f95e96df5e65d5bcc0a39902202fb0a13acee2d8b1057aef2e1b0b36d252d79969cd97d775c6b00a4c1b72c4960121034a5a8f6e2202e82b8df62f7f38200babc7abe8d2f1760e6a9758e9e3136e17ce00000000010000000001013191eee8acadc72c912157955946f12df0b45e997efdec42cfcb8d0aa45d5389010000001716001484fc924ac820875f43258624623d8dadf9c6593bffffffff02f7e400000000000017a9149a638876612525b989a461961153ae6d27eb530087a54444050000000017a914fe21591524f087398a3f49fb6bec677dffcac67487024730440220612bda6cb967aee5610b23054c48aa2a36fdc98ac3bef893e77294c1f2504be3022019f12d23027bc106d62062187825794b0a1f4b0de2290d2e418870a49fae1d4e0121031737563dbc71ca4e0a95ea4a2d4db2b922191358bed812232a7dd3ee735eb2c4000000000100000000010101f27102160782e9a29976ac0c60b0efbad8475969c7a86f03d04090e3308069010000001716001415d1ca07b16ac24d9b621857ae704e69de617cf0ffffffff022dcf00000000000017a91403b0f0602965d174df192a74f997df528dcb2deb876ef5ab040000000017a9140ec03df3a69f1bd1ced90f36bcd6f7252d89557187024830450221008cb9ed8b806a075f8626f297d9ea3ef5c7f8ea6eb3b6c39ee55804e3b92ba72d0220701d4c4684c984d9c7652051f9df7f8d449fc44c1737bf7c3248ea6a797baa5b0121039ec7bbad63ad6a7b47853b6c3d7f1e393d14a3afc0731689ab82dc043f83de0f0000000001000000000101c89982cb0cbe8a9dd75eca7fae963194b0ab528ec8043d4ed4782740d2d6cd9600000000171600141635589bf4a1420c5ef508a1164814a50bd6d322fdffffff02610a00000000000017a914d6380b15782adc943c0054f0aea5b46a4aa76c7887723314000000000017a914065aad06467213240b95165e4255983744a0db42870247304402205a4c1045a67483250bd5ef7c1e7747ec547477890af8c6474f11b8c142deb7bd0220542b7bd872878eeddbb2025afd5a1232b48f80ac51ebbf3586ddc35bce91691401210300f1538ce5b4330dd5df25f21e5e502472f58a948392455a7f23387fb8ed83ac000000000100000000010117c7c863bbbb32a6958543232ecf135b83a1f90c18448560cfa25901fb75a06001000000171600147c949db445e0efa6fe7499d5aef137abec03d06bffffffff02a07508000000000017a9140106fa5689284ae88ba3256f2f7088781d43747d879e4811000000000017a91415ffe5e1f968d560805cbbd072ad011ac7a15bd38702483045022100807f262e8ced563561f2667ba2b194afea3b422d3a43d399b1a52b985a7fef3b022007da46870c2f804ec1ec16917a6317f142ab706fbe9a11084332f9c2bb7857bd012103875824502f4e56c04e98e1f43bf69c256b5acba93894de25bd6b5d27b24a41cb000000000100000000010172f3b0c5304a2c7c495e6e82b9497d77ba088ffa4518f46a098b0e4d49cb83f50100000017160014af1ebbb8de6f434f44a6f9d9b152ad069b18c948ffffffff027b500a000000000017a9142c19a360f265a1dc815ca301a3eb14d358782a3b87c9de70030000000017a914106819fefac7c44d523b091e47ce820b20c519f7870247304402206b2a406ad85c6e8837bae2b38abfb49eda052ea1958c14de2fa02c0a37674cea02203e248fd77d1faba1733c67cb6d0fc4f0fdcf73ed64236b0d58e8e9d613480249012103256b91ffa4864eb98b0eda50f69e9db894f9bd3fb08be594f918cd604c5a93c100000000010000000001010982addb41260ecd880547d72e70d2a17333bccb7b2c3e053402e4fe30cecd190100000017160014bbbae2c80de5a05cb446a59dd075c1e1817b75d0ffffffff0244ea15000000000017a9145f9d298ebbbc316abd786b1dd813d1b1df841d33875cfe22000000000017a9149d3499f882d89dc63a94201e32d2d4b365f52874870247304402203b1332c8c8ca53cb18848a4926be409a980a03023b08292f74422d7f1b113a5f02200d703309307cb980f96d6b1eda37ead7fe1d9ec0ad24f916284021af0073d547012102424e988a2680a4bcd6fb50ec4942a957ae899380bba22f8e680ffad83056dbe300000000010000000001012903c8c7a5012b6ac58d875730808ae6acd81a6c87be8e41e7219d453be5eb640100000017160014e32e89a30ab9f7536e830c8ae4e546e0faa03a9effffffff02800365000000000017a914a6e5b2385b6d678ac74d1f7612ad910bc787551787cfdef5010000000017a9149699427fd42407619274f1e154b33671dba91aeb8702473044022057abfeec6576b73eb9bf14f64cd1282cc29a6c8f4a59e2ae069efb3c67811991022051af1d2ad0c4f239aad1fe494d986bc8edb94f6fb23b211d12f05487fde0b5ec0121020762fbcc9896ce61363a17c921e67b1fb2f591c6a7af6ea863315259e47d0a290000000001000000000101345314fad5c1e135fed0b638d1c632078a900cd00c459e4d1f27aee5724faa8f0900000017160014918d901b10578e1154c8f70c969ec468d47d24d2ffffffff026aef03000000000017a914a452e50db6bdcc7a1ff18081f5e6565a16b9db9587014737000000000017a914fd0d7da1854197289081740e23632e08d8cdddaf87024730440220261c0f4220c1f3c0805f1af9b9da511fbe623d1485638ac97c2934035ad25dbf02207106b64e7e9e26d3a5c35da6b7d0d54fa290d95831d6cc11d2bba1ce098722600121028f7c7dca222bd657f8acd1258b9965dcc81d9f9fc585f59b9fc2a9786cf30c940000000001000000000101f61407d94a4ae1ce41af96285e81fa6757edabe5f915c5a678ee475489ad07f40100000017160014d8a7601fcd189dc0cffe3dae0c0cc866dc8c0204fdffffff02d35043000000000017a9149fa2186694168b788b3d300c0ddaf3c2d40b43f487423aa3000000000017a914eec89806bd961517f38dfec688d9abf57687afd58702473044022009fd63a6155c0794e043e9504e4ad3a86208bf3bfc7b24afe79613d23b11206002207e8c1604405e552a96390dfc9825f746d7c386b153d90f7ad5c70349ab519a0401210320efb60547c9884562b668705e788cd2af9bdd81db0480b1122de65820fdd0b80000000001000000000101d3e4ce03cf983599c0795fc0f20f962faa2faf5525072e18937b9ea4064639500100000017160014726ec4b42b9bbff9e7b1ac0ac276e483a352ae02ffffffff02b0fe03000000000017a914993853afc629ecc241d8261d171204be4dca2c348749f622000000000017a914cb1e175bae772a6c58e09db79109e3d314b64a7d8702483045022100f0e1b86317c21fe784792da8c826968cfbb115ffd5396defac042a60044216fe02204e743b70aaca080f236fa9278fe1b483eb126cd4968de713e0bfa87906f13f5c012103e9351dd007f2241cdf49734b14610c80196fa6d08ff5d05fbddb4e3b157620b3000000000100000000010152ecc1a9eea33b015675119942b7ecccdf1293b0975d3f223569f7c35ee760580100000017160014d2260cb4f0260303303885718d75e4debe534819ffffffff0257e502000000000017a91466e095a03da82aa3e41f3d8dc5a7ed52af1c3c9387ce7b5c080000000017a914b402268818c160b49ba9ba9ea4b74acddd1930df870247304402203076bd839ace0391bd0a0a2148ebd32184e74e03318d6e1488c4493759c5bc0b02204c53f94787e93191e82f5d0c10e5267ec3372bcb8933ae2ec29788b98a68d16f0121020d129e4b2b84c8c75dedb67f791088421da9c825c9935ded709ad5bd10e1c28b0000000001000000000101d0d089a8e57846cc1dfa81fe3408f7be946da80d64dbeb7b48484471ec0058420100000017160014f69d1a5a873bac71a907203bbc7b5bd5ab5b01f6ffffffff02087404000000000017a91408cfb0e39dcfe442bea70aa89e9795ffcedcc43887a1709f000000000017a9146229374992793249fc60fbfa8d633f6210e695dc870247304402206350f16c6f5c269754ca9281a01fdab7daea91697436e9d7cbb8405339a36d8602201ebda2de3aa6c18895429a246c9753b1bafe46ea20a3cd42175e4284dd72cfae0121033326d97d0d47b44ede2152f452bdb2a2fe4b04f8b5bf751fe07723063f243b3800000000010000000001014f7b54faa89865231ddb57cdba015bb9222c0787e44dc0f78c3c9c0e5b157f9a000000001716001467c67dcf44e47323335b2f606a91cd1cf07b7a84ffffffff024a8e17000000000017a91474291bb44c01dc5713eb7c9f5a7d9c2cc64350d487a844ad000000000017a91444944f3418894680b1e299b3f221ff2763d8c8458702483045022100ad5f0319ae7e038fa4d9dac03ceaa03e92da0a51da7ad492e1c2de9a2855198b022027651778f9574fc21675699e213d6311c31a52a920c69a1ffc83c7247d39da3c0121029b4c9378a503e1c7a2375e9e6f9cef83bf76df2494a9655c3b88e674fae95e8f000000000100000000010187ec232a5c7007b02fb3e8179df3ca06ab5abe73c15bf140adc83b946fff9d8500000000171600147ef7d2fbf30c350777bd1844144ba0a3fb085fabffffffff029f430b000000000017a914d6d3cb9a7dcd86ba4d7852cef2b1d1fb0ecda91b87800f25000000000017a9141bf804b38290bdc7fa440997ec583fd7a510abfa870247304402207a7e0c751acef75f280ffd99dd8736357fa19a936ac4cebaf99497c40a91c8b002201d597846c7adea7ee8d7b20f4ee3d57ed601e66ab0ef00125ab9187b8a96016f012103380478f03b548c4beae30056d62e2d490b6eadf4b7f3ad905046dfa365b3b4960000000001000000000101059c2dcffb22efae2644b93e8af3d819c9522160f96f99094840e35d6213cdb40100000017160014feb1d5792968046239f7365fa3e6c40ba94a6cc7ffffffff0240420f000000000017a914bf610e4c98d45cfd92a5e4d1f4cfaf0edac8f00087dc1422020000000017a9148909691ad217ab27709439ea5c3c2948313353958702473044022025f6b51f4b726f67e17d07ed5156a135629d0f77d3670d331f1ddc1ea73350c502203f5e7d63baf81edebf20b5801c0438badb7604ca04d8418e138f291bb203942f0121037c3f8a40d011f2d9264aee342e0671b16b739bdcb1cb80df6358bcb54b834e180000000001000000000101588af00124b204891c8840514cc08b98cdc20067baf97fcfb11e92de99d86ffe0000000017160014726ec4b42b9bbff9e7b1ac0ac276e483a352ae02ffffffff02f50004000000000017a914a1b0f90c98e6bd6a24fa92f963deec37c681029e8754ce8b000000000017a914683ed790c0149b3f44af5ac8104276de5e908af28702483045022100c308e0d19e01fb204d9dde706976066563efe15c2e47af9f4ed166a92be0d128022052796ea75a36bad57d2965db4ec48e3a9484312374d16ed632a3dab0f18b3380012103e9351dd007f2241cdf49734b14610c80196fa6d08ff5d05fbddb4e3b157620b300000000010000000001014facbceefee8ddcc4daeb23db61b5da4c9e3b526f94691dca14ce7e2c10527740300000017160014065c68eb36b4a1cffe3f2e8a4dc4c551f8e12fbefdffffff02179532090000000017a914c374125030ef260eb4eb1a17b27367568debbecc8700c2eb0b0000000017a914e97119a4c90c66227fbfb93810bf25973e052ead8702483045022100a4b4f4d0a8e34c1137d1fcc6c4b1cc6dbfcc2d62011027316975f4f3b7f8308c02204b30daf24878d6e4e52fb28f8f6d2f527ab811aaa455c5bcd992844c6e848fda012102233b7573e66bfd60095117fac80a992765f27d9ff73c2dbf4cbfd4ed2b8c1cb00000000001000000000101448619ae2d6c4d947b9b590e67355da411217d9e5ea70753422d0de162d93202000000001716001432b498842ba081c0858e527c177269b51e2cb49ffdffffff02858800000000000017a9141b3aae1de5947a4fd2fc00be02fa2750892a850e87b5a801000000000017a91439df85777a082528859ca8cd4db8bc2db69710db87024730440220253b393464fb63065a9f1066019677d5d7e6f39f21c168dc87898a260dfb289002204fcc1481881ba4b8d2a3d9f3ccbfca38abf7dd2f7120c4255d9daf0f52d956e1012102f394a7b5a7f682b8dfb64c2752e4fc6810add915c0b863f40dc947e6781d38ba00000000010000000001012397f6c9691440e4670ff962886c16e61dbb969a606fd3074a0426aca092e4a60500000017160014fa75c81d7f55a6ba5a33f988cd9034c1e496cb05fdffffff02e09304000000000017a914f0296d127b92fdfa49ac350a1f5bfc26588046c587210507000000000017a91407a3378f2cbeb7f6729ff082ea8c47490ffc927d87024830450221009c9566536c07b5d10389188170df76e978a959467a7d17595c00d3e4b89f84f402202873d61458a44eecfe0650d67cd28ecae8a70b3dd4148dea0de0ae9d17c957e0012103e0485c21d402071a7d162dcc6018810dc6d6742b792ad83a953f8409769257f60000000001000000000101ee98e2d2fdcba48b24c27969cfff6779200ceb00fdadfcd83c687e67f6b9131e0100000017160014f060ee2b2d84f82ec9513be6c7889ba6c91ef73cffffffff02349700000000000017a914e9e3ddd9e87af15d482180a32e9c9cd5a7fe882a874a7c17000000000017a9143806eca6d814f5f8e774813937fcd966c43603da870247304402207e624c7aa3c5db8fc41c6c3b1f629b8c24a558edfb68f829b53f1123ab416658022013d869be43a61b79bf6682fd68be9344040cd407e7227d95f15da773f83e7666012103bf21ed6a0ba1e3d49098f9475edead1bc30e3d1c7a7299eb736f6e0f571205bb0000000001000000000101328486155a34b0d813b6f76d26467ab0763e9b1238cf2639bf17a13a050201bd010000001716001497294e0fc95e7913778cabc52f8384ea28546320ffffffff02f02814000000000017a914b79f2e5368ff652ba39aefb9c84ba9bf519868ad8749fa1c000000000017a914c280029cb4a740461723faa6b5dcd59d606ee9aa8702483045022100c8a61ceea866a220b7b27fa544e580bd98521d5b658b569b13b48cc95772724f02204ebd5574e84d6545af6ddd12cc0aa1d4b8a487d5caea66c9e358a7a6bc1a7b0e012103f44af012649c9f7169fdb5be8035a20f5bed27d2b984a282aac7dba678d73764000000000100000000010153ce532269ad2060b2431ad3f6887eb86d52657e4b5418cf494932f3dfce7b5b00000000171600141a6ff7c10a5c160ac9d42f02abdfc347ab5f730dffffffff02b0360000000000001976a91479efaca9d5d84a9d34d754bef2bd1e429380672c88accacd03000000000017a914afc2acbfc287fc4c5e6dbc359e3175f0f0d9ca1d8702463043021f0328b7962685448d3a27a398411dd3cde85bf13589cbc8f642299b58b1d510022013c754fd3a38efb48f49921db8c1c7c7cdbf8f5a99c3f128f3c54e64c07c61ce0121028dc584581e0e4f41040bb21576ea3e0e7bd5484a2392d2ddd20128c135582e5f0000000001000000000101d151c243288acb5c81baa75a09d730ee16d56e2d18b80707a6995b327438862e0000000017160014361ea94997d70bc598248edd2f35b70ced431e69ffffffff0220180a00000000001976a914a73cfadf49c77f048d3f9716e54aba6308039b2488acca561a000000000017a9147a149d3fd76e28fcdc1ebd2742a250941a61a23e870247304402200871e8c6be59e8a07c2d2873120d5c3400bbc165f4edcb2307c68a50cde0f12c02202e2cf7fa0b4ac45719a3139dcf48412689ff4df8bd8922ae005bf5636c86a2eb0121024443e68832c8fc68ff4e1f1eb409bf491850867a0f2dd88593dcf8bbdd93261d0000000001000000000101ace2bf3fbd316b222020cb5dfb576070fcdcf039ab6c08041fd0b7d3ed23b69907000000171600148a6ddb535a9005988d6a8e5666ddc24f7160288dfdffffff027df7200d000000001976a914d09c43f34f87eac2865f1f1bf73cea8deaca768988ac0076f0220100000017a91461df30d8777780bc6fb1fd84ae71fadc1107bed08702483045022100ed3bef9dca16e1aa892b988cce8c609fec688ff25fc98717cbc1ed34d244db2f02203cdf90297deb03a918551700091c989113b50c9e0a810f55bcc23f2e2e34fc8f012102825607800f554fd4f91e51e6670d4813fea51c01c485a482c2c467b0e6f269dc0000000001000000000101872b284d3f68de49d99018fa18c439612ce62da983e1558d0c408f2889275938010000001716001448d2a305442f09cd2548315b930bd172dee945ceffffffff02b53da800000000001976a914b23b14eade24f455bfc212492b99a3439e0c937788ac8fc970030000000017a9145929c3cbb2cfd58b8224348474cd38a6ba6d0cf88702483045022100d23da0f73f21a848f73666e80cad97120fa5cce220b06fe5356d5c2d7f53a8c80220664acd920135787661405624d5b940eb85bf6dfd54899944aa0b7e1fc5261c190121036ad178daa2a8c70f3c303365f5cb161ca02aa24621aa181e19764daa72ce54940000000001000000000101397f855b984c0b263974609d549d27fe8f6e49b02efd48a31629f27b8445a55f0e000000171600146a509cb89f94b8e7bc5a963a96f9bfa0568cf4f4ffffffff02aed61000000000001976a91434e06ff8336e6f664969b2fe5a3e0c1c44c0a3f788ac649b4c000000000017a91472e87e16abc627596f7fd3e90c2145dc924a5639870248304502210092f8a807a4489df12a2f44c2e3ed291db8925a8834ff4fb5460add5bc6a40d3b022011ca91bca3a209b504b266d10f94b19d545c4839e692a2d2bc8248e080d95e0c012103866978f9505ee9341f86d12c3f989f3c91b767202754c5dc7a586463ab37de6c0000000001000000000101267dbaece95e30166bc3421ffbe2cd8332049509d59aa53d760c8515cd059abe010000001716001418590bdd9a4fb0677666d188f796722fe2378819ffffffff0234a56c01000000001976a9145ccc423118ef044fb8a135ecb866904671ffd1f188acd6a405520000000017a914310ce2a42f68216d20ab2b551c1dbd0387d7230a87024730440220778d1ff2efed9b1f6b0747001595560a36368914343e52bb45389c975cb4cba602206499f9ccc124df61304ab9a2b173b092cac325c2392316ac4c00a27e9e98a6620121030af1f068cfbd1e1f30ccda8deacec8f0c9c96502bbd552db6b85c39b5dbe9ea40000000001000000000101542331a9d6211c353f06d14f6e4bda9b9d676ee23bbcc8ce0148bbc1ccb1ea3e0400000017160014f30d093df33bad3333fc8d417c72357421ffc3daffffffff023ac401000000000017a9147d9fb555ee1e1c8bcd24ce9bacb5ae4eb6f28bbe87600ca800000000001976a914b23b14eade24f455bfc212492b99a3439e0c937788ac02483045022100fcae04d0c5c959127ef5d90597659fff94b2d7441bce735ecc259b96b9bccea80220612d08e0764048e7f47c503dadf8876518b7f1644d86bf6bde16f3b42b781cf5012102fbd0db92fa655e1b6e69b53e4b2a2e20b9c5df30e06ad6ca26cf4d3548360e580000000001000000000101bea98d1b6f001b162508407acc31bba8961690734c2ecd0c3ff250255696800c0100000017160014b24421259c6c235e56b1669a7b300aefdd8efbf1ffffffff02f4f6d903000000001976a914d9f4f2961dc6e2edef9c22469a4299820521aef488ac7265dd050000000017a914d43b3c2aad9c595afb941939ed9612f222e1cab9870247304402205c6d3effe159e83c382458f203234b665af8796b1e3ba0a0437be56ffc3f9bd602206e3344dbf720306021c265ea223b451f7d80a3e4f61e2cb07bd0430c32b801780121030132c62cdf148f98fa0a36ee55066cc28481cb7cd609289aebc04ffd4efefe790000000001000000000101e068543714eac6b2ff81187823167bae8af8cbc1e2c58f4db90ff95fdda662490000000017160014512e66bd78f1b860a723b03e4fb606ef29aa6a0affffffff02ee160a00000000001976a914583ea358bf51cec1792001d2d4b78b727311884f88ac735d28000000000017a914bbf78fd596fb5c5b134388398948fe1dce1ee7c88702483045022100c136674e6091904a94388ba097dfed8734504db840a3074acf499a3123ab30760220286893f530fe140cb8e64d10db958a5fd3497568c2da5118d3e458e1a9ea7039012102df3f07d6eca1e5ae6937dbdd24498de3cbdb176f4e83ac9975572ebc69f3b1aa000000000200000002ad93ea388c6be3f8357cd80b5529efdce31dd4980625cc89d2f972f7c25f3438010000006a4730440220710792a891e79ce3d748b32a60d8425e79038bc7cec151d59d54f33eee8c4ce902203648c2fcc542a98ec89aa14e53974f27bb24c29d365bd43cbc3d884c214e6d82012102d3cc5520a83ec3a431532bbe03db82aa0c8940a7eefaad7f962f3570e3014776fdffffff01de6fdb149604ad79d326a3025234ec85ed58bb508ce6352a53ab332b8ce9da030000006a473044022008a688092f285bbdcab41f327e52121c2f8d0b7198e52594b96bb3ea2f3d508802201667a5793338f0907411d2e06102758344fb7117898c1d31e487a8a91f11fd5a012102d3cc5520a83ec3a431532bbe03db82aa0c8940a7eefaad7f962f3570e3014776fdffffff0170c90f000000000017a91471942aaf5ae4954b5b65e7d0fcf4dde6f04a0ab28715a00a0001000000000101365776b28c760d84c68cd6333b710a41992df74fb22834ee484db67d2b93bdc2010000001716001483a6da40fab7ff9b569f0594b8b058c1e9601b95ffffffff02601bd801000000001976a9148dbc50c3b3b4e59ef524da633a44919198c2063188ac9372a40f0000000017a9141491b9ac3e9b541d718d064720687badea74aed2870247304402207904606cd452b12c7123415324a25c1548f934b18049a63c402120abb42375be0220131059d8763d4f42f5c6c25bdc50009a756bf123c39b9790c5bd6d7c2dd2f9a6012102bc1a523180c18b5b8922f6e6822bab65efc2530f01ec502a2f46892ef03e7ea000000000010000000001015f1402bcd2c4129efad1aa6aa95fdd1c1587e543918d51114f54e035695559bb00000000171600144d5f959e6df12a8d270aa6d48d5a33c779743ddaffffffff02f0ad0100000000001976a9146251954f7ef869ecedef81c4d362e6f567eb1fe788ac3bbecb000000000017a914977298deb8d7eb699f8005720b7e60bfc0c0537f8702473044022029f0a679a134f1d8d38115370e23ee8746a30b34fd5bf3f13490c00da70b800f02201b4bf312ad76dbe8b0e433e010741801963a3d6ccf33165b3e0fea9cb193c2f20121022d33e7a16dab43263ba2f2b328fc5a7a5ff991226261d3c8219b4b73f4d390b90000000001000000000103c163dfecb9f6e1b108ef1e2ccd5ba231e2ad8d7408f674317eeba156fd3167340100000017160014f8096b809690edfec9b4f3577a5094828d9356d5ffffffff7cc7a7dd4fdeaf348bfd78981b0bd11fe85d04706f3bbe6a9a411d71ea20a1c2010000001716001498af0aaffd0174cb9d9b55b6b5d90c6b0475ece6ffffffffe5fd437750bfbe612ba309a49c77d878ce03c5a53ec9feb1c38d610766ae17860000000017160014286833441d95d9de62f2a8546e2cb1915b944f4fffffffff02200598010000000017a91463ea1cd8261bd9b3c99d01564a4930e2e1ea3cf8873be706010000000017a91418e044e6daa500ade8794d60e8dd5df94f312fa68702473044022016d665ef810e7831dccc7aa38dc7e0292343f09d0a882865dc940d42aee21cae02205d2202b5c191005c5e986d65dec9c13fe7116790c41796b467fa593faf5053730121031b5f3d8b1d4d234782c968d99e67433a447853ed82cd25e42dfc88312c9281cb0247304402207b3f36bd957d7d135179729304194ecc35c8acef160f2f5b219399b88f55fe020220504943d318a04db6be7979aef18c2fbfd2599a3face0e423bd15dbd7ae3ad9bf012103a4f380903ace9c9f130194696fd162383e54a7a65825ab862815e2452a40bee402483045022100b5b0e85d411fb0716bfae8926dbd9a2710a8a636544a9a6784b685b7ee4559f602201e4122e1f227f683eca8c053279b4d949d1538f25d700e03936c9095942fcf6d012102ce271633e9c07929563198a79785060c51ee71c4f3a64108bb52d38ec9a4324700000000010000000001017aa9476470af1891e39dfa71b18c5bfcf5927a02db211790c2f3f66973ea03ca01000000171600141bb0e244a33aa85009778e67325d97da8f34e0890000000002a08601000000000017a914e9d95155b81455ec33a86a93fa348e94cf0a289287ab5c05010000000017a914a7e12fcbb0fb4f802732518b2d92a09aab1d778b87024830450221009b261ca3c418793a3a3e3fa28654f6d1cc1be9e8bd3dc6c5fb31dbdac02afec902207c5f1a08bf4e5b0708fc2f4a5345df32ef06a821c07c69c96ae6387addde039a012102c0ab94a0e39f38ff4e268470400103e2c53e3c3853f355ee474c131ea84b4bc00000000001000000000107183abb0a919db5db244542ff6f10bf9880416f3cc8c3924b6480dcf7e74d0fe20500000000ffffffffafb7e16bfbb5787f6c0252844d1c451957ae60f1a9d3e725e33150a334e517690900000000fffffffffc2f3ff3bc5a22f2820e5c021682cbfd9d80194cc978d1e217bd4c55107d62470500000000ffffffff1de532d20383ca5b1d76cee894d9686e8372df61d66492778fce7c42ee8fd5320400000000ffffffff79994220dc1dc570252dbab3759524c9fb71a789f656e1a459b70e53612609c20900000000ffffffff046a8d9a6aae5416b1b1d798481dee8020b82ce5b62f19cb8cea90cdff6598460600000000ffffffff304689872066c22cf2cb21838c63049599a148ae6a151a5ce5fa3c9e0cc3fe600000000000ffffffff0123b343000000000016001414498eb4f7e3a91ddf84daa3b678a64fe7f421e202483045022100c237d2f7d67088bb31c431232b0fee5def6243ed2b5d8bc13c48f3ee9127a41c022033becef9e0e388692deb7588ac6c84494ade9ceb9b36440ecc7ea001b131508a0121030ab3b154420c51b31830e5795b9fd82aebefa76f51ab605e88f3c7cf726d8ad00247304402204915a6097cbe315750eec5d5727f2aa5aa0557a014bb201cc4f0a2eb1ab73b2e022007b5d2f44c8e0d043027c8310aa18b18805dd803aaa99721a36c7c7b1cfb18ae0121034853ed0600eb62455ef2879e00a89c0d0375fd5378d120aff44af70e54625a8e02473044022057b07a410fbc419ed3493c402d3e6172749d2a10d6249074648bfedc8c9c1e3c022078d7ce67dc6213311d8af5b563ea1e608444722571c49ee8beedf708b611b2140121024b1dcad99757c02f706bc5692138e67d6ab76209f91588dc1345ccce22e1a73702473044022060abd1469066aff4d78e5b19ed712b6e4fc2ee30a1afeb99a55e7ad58bcb2c8d022064807cf353720b1986ebb7c8a6e1c9983188a1f309c47ddc1affcbd55c6708fe01210236b7f7ec07c0abef76fb857937c44c1e8979ab3198c79c0694a478ca66e4a5a202483045022100eb05f9ab4c261c10f330c0a61c42f55df1ab3b9b01cc9ca14b3ded9d21c1af05022072fbcb531d7acd54b419c851f4a426b0500dcb3c78bd0d843a5e40f3be24b80101210343bcce6cc3ad93477e7d585290922b2b3b685a4acd92da0aaee0544421ea301a024830450221009577e4c7fb7024e595b6e540964f5887c7eee20903eb1091a796c2ab501f842d02201bb2e108e37f6db857e26b00d866e1433caa2a1901b32692d3231d2777ec723101210280a1d0d8b5f5ee1067bc2babda4e67c8c9ab8439933fec1786788db72a74235102483045022100ffc3ccb5bb886052db8bb1be5379c260cc59a7775396741119d7ff566b758b8802205a5cea6c3549b38e730e545925afb5185fcfc78446d1d77840e4dfbb0d4d4a950121037b14e9fc18d000865c9be9c0e0d9d39ab3b81d2eba217fadcd814f7f696e485a000000000100000003297405f0181ca21ca6db2d15f150da0ccf0f0c7bd03914dd7c1240fd5e045350000000006a47304402203092643d10c8666711ea00083cf202459644a4d9837dc3c444e2f11b124246c702206fccfb349a6363f0acead791d243b73d7cabf7529c4930bbf1d9353bb425bff701210373524709d0da9c2d3ddd9381e330ba908096f76d6327b24e8ab1a61ed1e078b5ffffffffa6b6561b511fc1b4d89c28ec69c1e55bf5133338c5e6947fba620532ddfa481a1b0000006a47304402203a106ab8c088af0dc32237a07b9129e5815e47f51a10f34a48402412e390b91f02204f87e0054550e2192e98e94852fea049d3441e0e1b4e6c41b62fcfedac0f944f012102bc2902d5e18f7e911fcd5fe80401422a11349c4d486e2c016e982b1ab2ca494fffffffff16856291ee24de9054b553c92e70c8ab39d278b6af26ca9ef61febac1bc3f1a9010000006a473044022072718d281a77340a605f0eacef3c2ee4622d69e94bfff2d83d6be930db0983b702203669faff8986ca06a9a6ab51517df65572322c30c72cc14ae2f89a85357a9ac70121023ef070af64c1c0f7434b2f1adecfac3b205d33cfe8d25649b681ac8395930eccffffffff02629e0c00000000001976a914e5ac9f0e89be81750f20693e016e2011fba6daec88ac0a170000000000001976a914bfb5c1d1572e3d8a0d99806661ced1b47e7d75c488ac00000000020000000001012b14134d8a7b27bf2923b125c785e7454684c941791698de6d0355f55413a0860200000023220020c85f4d3f08ecae4e3a27664fa4b230cced3dadf7f576994a234a7b02dfb93210fdffffff01f6ce02000000000017a9146fae35f50b75870a07b16745ceca1e7d57f8caa887034730440220612972d02e66a47c08efb854e0a20612b27e70dcf3d35c10240510752cb01919022021a5b37172b7bf55c8baabfc799e61c8a771cf9f555ffcec7122381b08b31209014730440220360ff5a99182a33c11d85514b41edd11891ca40e979dcdaa948db9d0a8f2b09f022044fbecd786415e2fbec858fe586c31aa61193c56b4ae83e4efcd31965d274671014e2103408f94094de61a847c3a1f9e2d0c8999cf2bd601857e406addd0e60d19126088ad2102056dfb8c5238fdc6b5f6d0c107a40ed0e29a0891939819566350ba947acb8ffdac73640380ca00b26846a00a0002000000000101b499206fa002c1015b78bf98ccebe784621892925e37b743980fde683926833f000000002322002029cbe218e6fccd561f64d6c98a653c570040c979319acac94487b186fa09bf37fdffffff01ab9301000000000017a9148cb1730a42506bb5e8765338bc37393a6e76886a8703473044022077af1dcc9fced2c399ee13fb6735251188b255481fc4e3704a5774438ce41a6002207be570fb059fe4b5a772b39c9beb054338f2076cbb5ce7742f43c9726be8483b0147304402204a8e87a19183ffd29a6bef3457c8495f245f078b881e4992e6f90ddd01146d3b02205135da9b4bc9e4eba0924864ded7bc1af12ddbb6d41c781452145a33a39b8a3c014e2102eed72408d06321541a39fec80893d5e25a23d4f360c2b4c8df16f3ead32bd749ad21029faf99e9eb01c6ad3d99a8f933915b1d78666f7a2a28fb7b536f1bb231a95016ac73640380ca00b26847a00a00010000000001018036343e923b1a9b72bbbb26511ea5565847096c90d4656ea73277b865a9edf70500000000f0ffffff054e980a000000000017a9148fc3e8a4acf48298df2c4be0b775bdfedbf3c9e78713e68600000000001600145d6758f828d1614dfb87ce68453601de4713576190798c0000000000160014aeb0067d646026b429ed667528085d5f8ee3ac73980d840000000000160014061ab5181a51a7497059fc17f0b23cfe0d6b3335d13bf5000000000016001470301761b0f36ae791bdad749aff5dbfc777a10302463043021f4095978ff6adef90e74bf5c2b31afe357253c33f87c358fd0c718d570d79fe02205188b3004744bb90d5479ac624ac0a7b8dbf0b716627c2f5db384669648060b3012103f1526b7f0b1386e807baaa9e1fe54cba560e404a136d3be375d0c06db553cf2600000000010000000001023d2b98a0ddfe4ffc074f3b989bcb1cfbd191132bc4ceb85cb62e286a7fb426ff010000000000000000068a488cf3c8d9f4d4d059b7913c8e56441388f1a21daa9c69849e91546872da000000000000000000014cf701000000000017a9140ce105fe3d62d891f94ad9e49f6275ad93ffda4587024730440220768d1be19b07ad5921c0d9eaa42b73884e52561d9c31af34016297ea19c24b39022016e47e83b0e6266a086a8c8732c51c4ddf7a10a5c1e0c3c2d0525a7c435d1c67012102404f8738e355385f4feba28de23dafcaad5c7be9756bbc5caefcc97b1764a3fd02473044022041c6baa1ce934b14d77de3d41c59670dc49079a456d30b5cf9f304062943001902201a152bfc4d9b900971a26672eb3126906ca6a3b6306c52ffecd4e95d1dde5741012102404f8738e355385f4feba28de23dafcaad5c7be9756bbc5caefcc97b1764a3fd000000000200000000010285685151f5ccffc3929d7dbd89aa40adc62590aae9b02972b3be6e5f4467e5740000000000ffffffff5f589f7e5bc49af90a13bea4fbdb3ffdb3f794da3d8f5bfcd1192915981203230000000000ffffffff01d7fd1f000000000017a91491542221a5cabf4313e0274062d6e5485bda425a8702473044022100ee4ea6a3f8af13530a2bdef64045e2900d5b30d02e00b9ddf0133e5e7cf832a5021f0c0f8fa5d08850e5a6c415c2d78037fc1016443fba5295518ba1ecde445d7c01210343d03d7af297e4ae4022171a1f6e7c50f1b53994fb24e8863004e91145c59a150248304502210097a1f4d45bb302a12623b06182b90909b5708eee154816193d491004de2ccbfc02200c50cc2514cdcbdb79248055b50b36bba564210fdf31e5d3c157e68c9e2a895401210343d03d7af297e4ae4022171a1f6e7c50f1b53994fb24e8863004e91145c59a15000000000100000008dd6f8b3c3c48a2e5c30ce80d0542f8b901c270f27cbd5f8b320cf4430efcef0a010000006b483045022100c5bf1b5b1ca688da3236643cb571c77c681492d0b71734b94ce04572e7ac0cd002200e44dba9c72b4fc4acbd49e15299b3d32a67eebc504fa75ea2c3c12e56589ee4012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff8dd31d620020930a2a65cad1fd4c63df76f3830e34cab7beb2fca7afb09dbedc000000006a47304402207c154f7f78401e9d1050899ef1e78c2232a16ea34cbcac77965425f01181b608022012ab017c14881970ed73ab8bd6137575a7461d12acce5a26ac590dc4008f2b98012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffffab508f1bb7160c124c2eafcc20ab7fd936215231579c3976b15cff1e808a1b19000000006a47304402206e2357083ce43d7de44dec4b42259f8f1dce018c1051099d21729065c19c823802206875ba35337fa8d1f5741e3752f9cad3016b394841212742057fb8cc5e22e857012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff58c8108c845397020019fee01fbe16b12a8160ae5bb47c8fa740bc8294b1c2d1000000006a4730440220060642887ce0a7de07ebdce2b78392b6d87ebde6236366cd8197019858a4b3ba0220327913f4194dc2ceb231589f3cad61c35ac5ac59dac7ef137e951f5d560632f2012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff1f52e38e81e569d89a952af292a977a575d38dd746f2989712acd99e7f341e83000000006b4830450221008e5954580833db1ff8a293143bb16102c31595bc5ce9d7c4f499c038bebe21140220409ddf5b1c2c239760f620cac7b691f3f93caba3ba6e7ddc2cef0051718c0f91012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffffd331e01e8dc5584d68a1a605604c958b877c2433d10a830998c73101fb1e19df0000000069463043021f671327940db1ba69b2b1357215c062c6b804c7fa35e7b819d3b970e133bcd8022005f1548191190a2d164953ce77dc30588f1f89a96ef397ec23bc6e80bff8500d012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffffb1e122140b2e1115c502165312935c1c78a4f6e8db7ab694335be3d2fe1e8460000000006a47304402204df5016adf9b859e6acfb8a9f72876f9b57446c48106fc1d81af0c276f61e50302201cefc85e56a4385b9cf51ed44e7aee0346abac3208188474cbb2ed4842854a98012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff033b55b4f491f44a1f601bacf8044c7b73d9cf1dfbd2c04790a4694b8a02ddad000000006a4730440220049d7da374bc0bce995047609d41282bf4dd37254d4e481c78cf28b3ac9140c90220029b2156e4dd9ad5f8d17f8a4f5efa42bc45f10510a74a095042f729ac6d3ffe012103a6270cb4746f9a18c405b8a5655947a9967ed8c7d3720fa969eccf8093d736d5ffffffff02204c8f04000000001976a91435ea5857775c9e55ff4ab7f5441e2580bf58bbba88acc4110000000000001976a9143b9ce0b6c571264340cda99a7a5f95f790ae4aec88ac000000000100000000010275235b08ed15d101aa60660699a3b34397b48b19b767a27c2e9ff679b591581c0100000000000000009ff804b95ff6731758e4331a5892c69a84200f9348e8999159df07d15247a085210000000000000000014d274500000000001976a9140f446e978cb66f1a576e9d86e63e9525d6368a4788ac024730440220577ccc0ed51bb5c1e6c52f54abe274144f12a0893f835bb180d91853be9527ed022069be4a7017bafd3369db12b49aa8f72fc7f69c97ef3d8f468a79899a41a016bb012102e307b753f5e0a54089e471d6976a503844f96a02769984f88dc5c035b39665ba0247304402206210301edf8deca548fe1132cd719667f23d620a24d9e0d85113145872cc7b2302200ef51fe5c4b823666deda307e569570643c543501fe2a01d95738f80ccf5025c012102e307b753f5e0a54089e471d6976a503844f96a02769984f88dc5c035b39665ba0000000001000000000102ac3b28122d1dbf7228645dceb4b52c4652c6ce16422e2c07d507281fc43b01030100000000fdffffff539d1430ecb25f0493f0e586a7d552099ffb624931406f2de33ffc33e76bf3340100000000feffffff016a430000000000001976a914ce9c875c152f3fc2f2950d6db2fdb51669ce7ea588ac024730440220615ce3564329d30b53c275a07456d18e2265e18b820c0a6dececa98c83c23813022008bdd784cb18d649d5b849b288ced9854cfa71aa7835c8755111c4f9cc59e0220121024d9aa777ee0baead8a947b16a23faed0bc8d3e94f7b7208fdd0d18ed6673e52a0247304402203c17051546b57bd20416a5af76556ebcacc5d8a25ad1b005b6da0ed4fcabc6b002200b01b5f65a63025181f60b8b9a03fcc40a31f7c05fb06830d242e1c5a47b88610121024d9aa777ee0baead8a947b16a23faed0bc8d3e94f7b7208fdd0d18ed6673e52a00000000010000000001028c0f59fe97c288ca4aa4e06586136ecb068aae264e82fe725454910b0edc268b2400000000fdffffffe7fce15e25606f9b58e690be98be217f790e3f83be6af4fcf001d3960588d55d0100000000feffffff01ce710600000000001976a9144aa51700610970c1d151f1c8aa339b07faf6efff88ac024730440220147894376ac62aea49fadca1112f567014876091eefee2a37bf690e2c59fca2402205867a47c5e50ed86282978c91aa6112839b6415766074f6ca730a05cd5430fd1012102a8681a32c36bfcb6f13a3c6854df08625049a505893fb1f27412d6e51365dd670247304402200eedee83f65f825e6ec785e6f92d1ff693450a8c336c2d41d7e3708ce6eadfaa022059274a4defb5688101eebfa56cd82bf94c5ab82dbab5a0a6a69ab44915b53ab8012102a8681a32c36bfcb6f13a3c6854df08625049a505893fb1f27412d6e51365dd670000000001000000000102c05cd4e6785668aef6f16766431ab96e052f874f3b98194e372cc4ed5217d336b401000000fdffffff921fdd20241eddf84e6e55180ce4ec33e2592d0ac0c7bb55295ba18d204eec184a00000000feffffff01815c0000000000001976a914c923a44459378051f16daa82aae33ed0896f508988ac02473044022019e27f288dedbf099ea56b366669712420219a679495c73cd83884cd3b16a9d802201752558e00b1bd9e9a3fd09c9adb001f7ac4e215f8c6d750bf70c86faeb99357012102cfee65bbda3536d62bc85b8cb26c1110db654ebebc8a162fa6318ca2369b05e50247304402205f7f573aeab601be7e384e6cd16481b8eb01817e004835d5f9a5f45827831daf02206e6b0cdd5c8bbe87574b289268a73c913cb71c60c404ea5d5e8af0e5f70679b0012102cfee65bbda3536d62bc85b8cb26c1110db654ebebc8a162fa6318ca2369b05e5000000000100000002acfc631cad7e9776f5424500e0549fc645dde988015a6614f8fc5f3ac7cc1509000000006a473044022017cbb5041db7d4f4b82d59700be8c95f624ab7f375ee80035f0fe4780103889f02206407c211fd963fee21faa8e2a27060e23b2e25aaad5c26117a892ecd6f798cfb01210357d060ebc272bebd863f5401596201c9f5b30eaf6383a0892d125ae78c272521ffffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a4090000006a473044022021d2727be757ab31daff2f1fe422dfc95a87746c0b68f94cbe3fd2c1155b45d402206552713df9ded223f0461e96a45cd25c5e5beaf60542d1472aa1676535cca8b0012102d4582381bbeae8e5bc63392b1e39346b46f45c049c8903f4c58b4f1acb0211f9ffffffff021d1806000000000017a914812c087f3147684614f26cbf5df835d358b3a0868703d40000000000001976a914c0f6ea8afdbec8a7f11033b41b84703abcfd24c188ac000000000200000002abc0219a07d97cba3465d2511ad9265fc3359ebcbd41fb69e1da656a33974d80100000006a47304402205f6f3c262509feab29c50b9db28fca7508e0341bfa370e3aadc9457c6befc1490220255830fecfa3779a4f07e5a23681f155b27d4837f14b3f52b2229b5751917660012102b7695799e76e1e7db7546009ba5e886010e95ac63ffb1f7b73a6045ca58f6288fdffffff7835eae2709cf0d36d6c59e8135416222811a479358a527b882a8d93d4153e89060000006a47304402205637e5d3cdfd90ab0c707dafafc22813d63fc74c88bc47892df59d6281fcc498022013f47941aae321d31e19adc75e51a8197c26ddb46ca326872bcb77419da01613012102b7695799e76e1e7db7546009ba5e886010e95ac63ffb1f7b73a6045ca58f6288fdffffff029b620d00000000001976a9140d87107e2195f76c5c77c60dbb8dccb6021c933c88ace0df10000000000017a914686258fbfa4170813ed9f6a0d257dcaecb8d8fd08747a00a0002000000017a4ab56882734f4251bdb14b67a3949c17326a91559df387588f05c8cb5c68cc000000006a473044022026c085ae3b81747ed098c1d601413046e54ba9d78e9f98fdf92fa3a31b16b70602201bac795989cab64514417143b9a9e017d8e1a88c24bf0e24da635a952d3bff54012102ed8c5b6eb87ed2928250fa4c1e0a5f139305f9d0ff5d1883b3a98d8a986ac451fdffffff01161546110000000017a914865a6ce0c77d73c1730f009fab9fe0b4eac655d18748a00a000200000001c309f8ebee524e03925896e43742782bf17d1ad05ef44a4b4e85a6e11eefb0e8050000006a47304402203fa225b907e28fc4c7080fc659172e76bbfdec55ede34e71aaf4d3f772c14281022067b46667c4eceae36865f16fc0d431fe2a6b12d21d6193a20424701757dcecf7012102f7a8db109436e3cedf944fe827fb873a6eed2c44f642e6899cc28c2ce518edc5ffffffff01f43102000000000017a9146b21b3870379120443fbb4cfa549d0680ae8f19087000000000200000001da754ab0b2d56cdf4af89ace3264594405d88fdaea56d12f1f98350bfc67d9e9080000006a4730440220757e971ce99abdfcb4aba22410ca69444d148816f56a8127685a4923788181ff02207f3af99f6a0607f421f56fb65b2ca831dbb8fd836f41232d784496fca9d93f9e012103c721ebe2b01db8a64dec2e37c1cfefb432c987c6fe606c3170d33873192151ddffffffff01b20c23000000000017a9149f5d0b7087091d9927842a5eaacfcace57543174870000000002000000000101d8653b7f01eaf9ed43076bdaf3f532d63f7bb33eb343f86795559478feecf4b401000000232200209b241211f8499a9f5324ec77d5440ec8676811339ffe9b1a3c2840005de3866efdffffff02375600000000000017a914f7a24a5fcc6d957f401279f903c04e44604778ba87fa3a00000000000017a914dff540759bacd280535eb264b0e9f98355c8df5b8703473044022018a7ea99bfc77b46b30a27606245acaf6ccb642e26f25158bc736242085e51bd02201a15b23f6f21bf0d08caffdd7cc7f6c732793badc1f03a46a2cf65faa413fd500147304402202562a14f7ffdd88a8db1c3928bb15bc58ea09769b12d509eb0e0c4acae66cdad0220146922b03cf3cd0f5721a2cce861d619aab1ac95db7fecabf708bebd0fca0bb3014e210227a8f1e1acc172de35d847ed8a486862374724845a85d9ae3059c2c45a2c0662ad2103ff82b751662d70441fa48b982f994929bed413c4951575aa8ddc329ba5e8c39fac73640380ca00b26848a00a0002000000000101588991891b8289b02febdd21c131a9707c5f23644596e175b9705b160456d3a10100000023220020ac95284749aef38e0d9ffe4ee5f34eb8ca1668dc6570edab92bf5ab15379482afdffffff01da3600000000000017a91490191e9356be41df82794590bebf68056f070d1e870347304402202b5b1d765ecb01dde788fd64ed32c694d8f4f249457a8e0984d31d94506d6394022060bf2f5be9ba3fecc9b48f592168daeb6d823ead2df3101b4bd030229a092dd0014730440220334246be2bf4ce28e94731dda1eb5e0ce9ac78c18fc34bc17ad0b33e6f1fab8a02202293546c7e0491838daeb7e2f54507ebee75f1136256958cd51a6b7a79524eb7014e21022d537976be3f00645ddb88a2eccd196972165bada3890d96f64dc636c6f8f3adad21023aed7683246b653e518b6230d1800e1f298155d4e666a80193c8ed12538f8b78ac73640380ca00b26848a00a000100000001e9f0ce1ecdde970d4c790bb392a93fdeec02af322d0ff40f9cdd2e651cecc831010000006a4730440220790a906d97bf9bf6ecbfc08d09e2d3665d26e3414e3776ca2e751640a328b4e8022030d9d545be347db6fb9a323664b029d7dea5c1b1df0a3b8c557ae9f71067bb730121036db9c68dcd2943c731f439eb542dfd434facb843e7daac325465cc473ab5c4879bffffff0123060100000000001976a914ac3f8daefcb3f82ef58d6ea7020a1aa9804b171788ac000000000200000001462536bffedc1221fb3dcc00dc233d8577300f9ea16184dc6c09eaf6be2c23ce300000006a473044022066d608ebace662a91b6da9d8d7b164546ea96c15ed95d0b91154e7c8dfbce279022063318ce916d789c42073869ee99e6e09064d6c7f893b5fa67079f400e62025f4012102634449064be4704e3103c945c89ada1573008b9c772cdae4d6bed3fd509b5003ffffffff016d2e0000000000001976a914d000c91295eb43d1be81aac66f40dda09c069efb88ac0000000001000000000101abff3a26ce39ac942bf8537797232ce955b0fd8d3ead6f78985847a31fcf49cb0100000000ffffffff0277810300000000001976a914c2e41a0dfcea02177c886aea7426d2a478dd3abd88ac1ca1030000000000220020722c89fc1edc540e142f3e2865e07fb1487b0769346ec1ac55cccdec2539117d0400473044022100d7a4d0a521c6c4ed0bfa78c5b0ca3f8ee216623dbd7f9e8ed262fa0087c99c24021f483e0bca6d6ffedc46c08661271784c82272bd229a421543c0d50e56f38f20014730440220657a789b1edcec4940a260cc9c65790be4fff794014944ca7e357bdef6a2513102204dabf54bd616aa4bb0f1baca2dc134b4a359b00880ad25e1c2063621493d67190169522102d16c0cf38fc04ccc7dfe4782d96047138f35dd0eb41492f08cab59dd9e55f6b32102be5663113caa38b3894b8136bd7164661c6e689a90e60b5fb43081e52d63ed4921020d1cf455c2ba1f9316219c0036cde157142c1628df5e312af2275cf24b5cad1f53ae47a00a0001000000000105536dee2ae2786b89b17fde52c18ef5979bfe36947d6968a659362215a50201020100000023220020da1b2452c030ca1e318ebe6a897d1c86b1564b0daa5056b3199c8a493b9e0710ffffffffd1cdc95f8dbca280ff538bcef77818c5093118e0b669cd3d17fcfba684d7c7110100000023220020c4cd9a3f41b50174e61f3e78bc90f0989bd8cd67eca6210e48f9b2147c81ff4cffffffff7ffc2bf07332c47572789a831475dc94847587878be2cbaa1fbd0df7125327b100000000232200205219a18d3a05c600751aa36e8d385e7285701f777a3e383d591d23c2ed008124ffffffffd9b4c46c48552fa446cc0847e0b8e42431e0bc1e5227bb93585c33ddff4401c901000000232200202e8fb0e77fb24952c60d9e146a75400b6c22ad8fabde91a5839fc23f3330f8feffffffffb1fe32d544e0a1635ece2b488e6e6e3aa813c81ab52112c4900bb6e72302e4e2040000002322002054727faaf15f31e2a3dcc649bbe37f22a7ce214ad03a5145629284a6ca2b7d90ffffffff0291eb0300000000001976a914758626e46b241b1825c288167499153525de1e4d88ac2a932c000000000017a914274dc84e8ef702fcd5063b3914acc62945236a168704004730440220135ab4316f6a1700d92bc6ece085827c459d03156a9a23d257a7932c9a1c0f560220568aa9441f108afbb3ad5d1db6a06053eb9584a46ef05b3081755151040c7ec40147304402202aa15c7697e79a8ac3db76672160c710b1b040002e28def635940278e07c6dd7022046e0166dfbdfa7f00d7ed451cc743456b3aa86065a0ac9104b63798e34a46d620169522102e8bf8ec9100ac270fcd3cd466fe89e37a54e31ec2cf4934185964f0b033b32e62103bd7896fc618ad8dfad036e778e544eed5704c1306ff37d2a1232a50cb03f36a42102bedb8f017b8a91ab30cf4cbc7a39082ea5d42d899af05c8ac75582bb6d98a25553ae0400483045022100debe2032f6fbbacabf880318a4846d578cfe61353718957c8c9d1ac12b60c1b40220589cae36386cae72ea5e043f986a2355a63756d2223737787546a6a2749cd2de0147304402207bcc14a6454f79b46b41b7216ff0f11df79f8bae93349232716ebe1e2e5c8a0602205921d1c7240f300ba3fd413fe830803147ff026a32cd2b6c01e06c584e75b33301695221023733397f15dfcb9ba4ccbcbedaab34565f8f58fa26224a69f6bc68f34c392b6c210399441374c0a6ac490a81dd63f37f0db7ce68d4bae6847496418b32d1060099292102db5e027bdaf64734baa57507c62137f165eb0e3b134b46ee99ddf67ca246e93e53ae040047304402200d114e30fe3a992bd74c70a22fbb52e7e59341d0a3429b04abe9c116d4f5a85002202048793b30400eb6456e5dd6d00c3752d1cee2e4fe66d1e7ccf488138a0614520147304402204129643010e60aa0999595d7be683cfa8fc71aa1e530a17dc7b0ff5a1d1848ed022002582a8f467c8eea8346f3873bc45190e87fdae74732e398a69e697901a936b901695221026ff0dc73b2d836ec13d754d5fb4acc7b334032575c1c0093c0c2c7bbbdd635d22102aca51f5151c9c41184716a4c4bc571b1ff9fd69c7cb6e84876f253c3cef39d4e2102197e674bee07caa634da24d01703d879ce913e0100fee95265f448ea669fa52353ae0400483045022100ab3b8b197d7f463ffa3f9a9e6f41389c17091f21a33d724146818ca8be1475200220273e115c5956e689e054364e17e3a2d72bfe37ba0bce8bb889ce70ef064b9efd01473044022060df4f31775119c76e2cc0f2f82dcc1809d9975a6f0076c75059b579723ef2c002203770d1a9031cbed5e0b8d4492fb83d2a6e7f0c65dd6149d5093bdb9aae7962bb0169522103380eb3748e7fe2553c6154dd06c12f3513750e4ffe2b5577a4fc70b105e9f57e21024ef8d650155af5f2927ce8c4e1d79ef699d4cbcae31b1b88cde43cb30567de61210218ac94f34cbc3d8fc6b08205a13368f6617052b1c19ab5daeac63c78f082bd6653ae0400483045022100e4397e95122a1f677523f4f9a5fefc5f4f91449da29a5c0df45306e83dd82673022000c5bfacb0dea99559321efc7fb514759062f3ab52f3ab01d26fdbe9827f89e201473044022050b5dfc3e78b8f34bd898bc24866b1ff5e66f634448e857a578858d26f78468e022074c62f99e39ad0850fe4faabf22d2fff951c73c1044351090f165d7c75bee9f50169522103c898ff2c7311c7c1c0fa2781bd3ba2f3ca37e984ae10a78591fff6469ae0206b2103e3790289befee80428ddfb6598ae51cdad4936a87bb9aef7fbb24cac201de9a22103f593f68fd84ef54a4b06504c7ff84ff653e018858837634d1e165fea25b1fc3f53ae47a00a000100000000011145b0a20e47b72b953b0de4eb4b674d593e47aa31054e4d561e37155288bcecab0000000000ffffffff6d54d9322159c83b6335d2d3ca13785af901007ee9e6857f9a96c0b2ab4f5dab0000000000ffffffffac54fcc6bee64bc4c5020a02be7853a5600b291f764b55f677b0de5f32ad457d1200000000ffffffffcc6728d6f62c754d026651b2df0a885fcff91fd8aee16b4b573a0855bdf73b6e1200000000ffffffff756e1411d9fdd5d84a6a11fbf21a22e29abacadaf465f167fe374ab480c14e3c0500000000ffffffff6b7e282e1023e44dc69ccf04e3f8a339c8b2c8ea40629665f6e13d7e105b62210500000000fffffffffa64d33ab1d128daafd9b2690a3cc7cf66753ca5e1db868975e9c4a1e8bebb330600000000ffffffffacff967745563529a590d4088683c675b0c10ac581395e0b31472d7aa0add6861000000000ffffffff839205e9614a4536871a7ac7fc86e273dccb694f103783307e443b39cad230cd0d00000000ffffffffe5362fb97ccb936699353de4916a8c5878bd2e363643b8cf3a47e311287db3a30100000000ffffffffb6b9301b495a17d7e6071e89b4b8f68ab1f0dd6167f77c121863055db1c985350600000000ffffffff49f6c5729116a1df1a47596be953399c70f5cf05bb9d87731d784209909b51880a00000000ffffffffc91424363a15fdd60d0f70fd86f0f156179cc67c56030fbbecb7148369ded8c21100000000ffffffffbdc0aa9515c5e333b7ce284be8d39fca8df42ca0f6401da71d869b770a37deff0a00000000ffffffff7c83d25cf910998338b880c05d7ee15edfdc4cca2d30c438bd4771c2cfeb41873100000000ffffffff90045d26da7516d77fb38fefa82de7c72c8ace2b681f629f98de1baa561872d50500000000ffffffffc04b615fada44f8ca9351e224aee65f40e09881227785b5d205a6d265369e7600000000000ffffffff0221d753000000000017a91424fb404b6e5f238e436bc6e57e0944891524ff1987d7860000000000001600149412efa0cb1284d2edebaa62b712cbee73132cf80247304402200f00367231a9543783ba3fe4d29613b5c12370a9882e2fefe49b8c55d9d76e0802207c83f3f2bc4887ae4a721d29e8d7cef487c1f4c2daed3d35827a98c634788f1101210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502473044022042c490ae43483493d54e779cb8845d11541d415e5a6f66c2edae7b0b8ced13c202206f42073ec27d1219a2dc4bd56aeb724a8fe591dc4415b1e676142121a82c322d01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100f81093a375a7c1dc5512b13cb7f8ca77f6d040eca662b08019350b87a19f397a022008100d180972437f48709644c676ae8f6a048e8fb856547e7439f8bbc06b63e401210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350248304502210080260e1382866326bebd28d18856134740431695a150925daa9afcaceb803902022067333a755f22670703e9bdcd6fc26b6b1168514bdf7f5c4a84fe7f9ae46b840901210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350247304402205883796d0d74f3fa455cf1dfddfbead65ec2291461e3851b33e8f80916a7879b02205e577e0c0f926d8420268ff2409c7775dbf65fc978e0d8acf03d1bdb0056e1c701210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100b72c3d6a73b885dad19ad7a5a6fdf77643595779afc2c3a09a16f9f946fd6b83022055708cc71ca8264abd35792c270c0b0fae6e259bd223f3a1787917b558600f2601210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350247304402207a4dad8a0ee405439ef52c03f68151e2865b1bb15daddb640f85705976d4c360022066286adb13e6f1868b318aa14324555c02344bb0dd3e58bda17a1027c079300e01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100f9e9ec912cdfcf64b4516e098eb184f000aa875653ca2323685627c5983b3c0802200a50857e5be51beba393ce40f9b985092f626a2f9e3f9f1636aa9e29f93c50c301210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c4735024730440220754f5913d37e55847cd372c8300f52b1a2f52c5ba9171a0d5243db32169eb8dc0220653542eccb784050b707782e8de6613265e5a37a5986628b15342ebf09d61d3f01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100e23963f2832800ce437400058603b4affeee5cda0ae9e728babb97572edb6d0f02207f7e42fe0f4a43822e62944a5f843f1712d1395b60b3862f2838be60b3b2143c01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100f864cc64ecb8b986b06a55445e05ae9e0473278927c1dc08c00aa4e28b7ab7b7022042d08cfa3865f6f1422b242161dcfedf896c49e731d90dc0965f9723f015345d01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100cde21969d88e796f23278dc232704aef181790c66baba0d1970d3ae3e61cc9a002200552a7c245a60a9e6331453a981c0a74b00664be97067957c221cf86e068db2a01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c4735024730440220128a18f348448588b7de8a1191930fc84d744fa64f34350b675739995cc9d9ea02206bc9de74acd9b044cea7617f1e4883721ce504cd8249ef043ef398cd2155fe5601210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100d203a2daec38f17eb823e051646beee38fb8a510b4259cc6f89ea60e5088e9c302200a7d5942f6c3d26ea12a1a793a5c1ed94984f24cfba74ad7c5f8b300ee4dce8c01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502483045022100b19a94356ee985b97a9f861c3b45996a9b5156bb3f1f16ff543612e7677181b802201ff7eda3f25bfe90c657b4f3cb112ff544f205629bac2147970a4c9ad7f0795101210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c47350247304402207fb4f7a298bd8c5431ff4c22100665ea119d899b588577a579b448d01f8d70a302207cc4987b4c67cd9d2cba743c0a1fbc5e3785937fa7d38507c79712232f8366df01210212be72c9ac189a002968d371620f76e697004a9489b024d13e65b87e335c473502473044022071062a085d3e16fd7dc07ef6cc76b9ec05c65a8c8b1242ccaa85ac536f3bd36b02203da46d572e3cca8759f6d48801efbb30c406402a2e7940300cffb91f720f0b5b012103067613673ecf208fb1d7107cb5e2b4d007b20a2729f474da78bdc8cf99cb84500000000002000000000101a74b8b4d63370fcbfb93184eb34aa214a39e7ff2a29da109301d0831eb068caf0000000023220020e902abc22af5c439da75cc27628e074a95b104604e3f9420e30821ce7a23cdb8fdffffff02537a0c000000000017a914686ad7f1e89e01a451ffb725604ebda7d464f28b87588b170000000000160014c7d09772eebc4ea3a5969fe6310965c98f43e0ee0347304402204b708da27ad540639478d102a2f8a81cdc454e1ed6701d12f42ff9677cbe3f0a02200d105bab4d79a2dee17e3e7a7c03ad88338348150682be398f6a700b919556e80147304402204328116c4d9f3c08fa021a3cd9595ec10a09f5eb6e4243982dd843e558fd117602204a0350e80fb4ef366430526783c83128a77b8df5870f872042f07c9037ab454e014e2102beda5e511fd7ea6156cce987fa09693e91d865261c9cce7f7690a2ec110e1753ad21026781ba93b808f1387aa93e7ef27f4b641f1672736f17e6e30ed820040b773d32ac73640380ca00b26848a00a0002000000000101b5424bb27adc55669f2aad7ea04cc9d254acb2f780284c09f37b279cbd0fb3e90100000023220020ff53cb0b21f9e6fabb2370af02e003214e76b5cbe0779b00f9ce46f6781402a4fdffffff0275f0210000000000160014462b0b397516be7c135bb6b9af47634871c2f3ad40b3610c0000000017a9149966fb14cbd5492e626fc124e7f958df3a12a1418703473044022020695b4b49902a47681ba4bfefa548e3f2f4adaed3c9d18060c4b8bea36330e902202e5317ca445b54397ad3b60956855aef193d510ad33f3a444be48e1a2ac9ee67014730440220704c2de4d9f586ff9026c9db5b555034a00ec2e3e9edfec8525d46e83591f29f022008b705e7d63ee70794a1b6432d79bf5c3d7e3ffe8e60384ae2e5646037aec068014e2102883744f06cc2353e7eddae246a9ef4fded97e96143bfefa9acfc9bf3f8caaecfad210220afaec469eeb1f6342eb4d54d1fbe16b121d74dab3b57683f3dae0a145e4bb2ac73640380ca00b26829a00a0002000000000101e687dcceee4009900fec7c5001fc4393f0299d4ffc8474e56fd4bd10a24d978000000000232200207228a6fad1b14c4a7a7df017245102fc99cab67306df98a6ccac6ee28f51decefdffffff0247550400000000001600144d6a87ca2b019151dface094efb52afbe872ce872c6100000000000017a9149d7957ad9182bbb3722f46f4eae816d1e021d34a870347304402207d78c6e49faec5f9340b20226cd524731882d78c202f0969fb3486a17f0626a8022059ef70d1abb744f267336b7f6f83f283cb085c845509d1ad70aa8b0ccf05e8f101473044022045a73c57e4f3645ff0fb2d1afdc80fca58f3efdb63fa496081168118d907792d022071df984a632f7aca53c5697f6aa39800d213e0e36f772423495747390b4850a0014e21020667ce4acf7513c84452c35a01ba42ae6da9bf3ffc43f820bddc9f7644e04c31ad2102d465b8fb196dd12a621344459c5c311b7afb412b26674dfa942f1e2f12d96240ac73640380ca00b26847a00a000100000000010508d025587014deceea930003cd00be8a5d3714ea882b634d07f09547d43cbea20000000000ffffffff47c19c0eed7d2e8c53d1f51d7c7a0351cecef19577542c1157c4f338dff412510000000000ffffffff56baff5dc3d15b7973440a727ec6d3cc1b1a5fc86cbf690ae69374960b771e810000000000ffffffff5e0a42d94a3644fb71d6ceaa2f721226b07e76e4e754d34b3d5816ffc328158c0100000000ffffffffcaa69ab66e18fd7835688622b0c207ae9be119e550ac767832f6d108e4279e370100000000ffffffff0270ecc10e000000001600149061efbded57b144c14348ad8bb0d34f9823c38913ba3504000000001600143fb0b3b60821c5795b328e3019fe881098ddfdf702483045022100f1efd64c6ef71ef049a4164476852b64d45240ec575417d090d71c5592c4808302201a8be5e46e2227d143899c68dbbce2e343fe6b76ebd145168d70cbe6a346541d0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b024830450221009c910f073bc28655de26c104465b63b8d8925c890ba2fca438bb532101746b8402203c68ed156fe7aff653882ab4fe23a64165a594ccb9fa8a24b633275de5e9a0ed0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b02483045022100a1e1e35dd4a4f52d1215f5afa94ae29e27a84acfb099a543364c288d12f06f8402205c83b31f867a935d8612ae62cae0ab52548e7e1cdcb3884817cca3ca9c23027c0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b024730440220462d4ec172ebf191e69f6b97a45a83169910b4e11cd2e8b7ea3d723f7a12dcef022026cd2430918d2cc563a90d5067dd559dc60baa84bd180ba37e29131adcc118ca0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b02483045022100f276a172add0d964b83fb571fafb50e629c24cf65914478519c4e19a7376c0ac02206b81ebf482e2702c3bc4a6452ee6323a166ec8ba54c1741c2a11f4199837f18b0121028b98733d56f76878d0133ef1022447b712f49a7508640f3ae8ef38e878e5515b000000000200000000010184afe2bf87bd8c879178b8a9fa319bf70110676dc7717ddc25281fef4b9f732c0000000023220020a767931c99f519b51f7e2cb0fb01057988e3d3b09145c85e1dfc1f2ba61790adfdffffff02c34600000000000017a914e71ce86e5d0795c007bb4a3365c0e75fff57495987d83000000000000017a914f33db711808150ae31f6ba8bc505c4047bad4fb4870347304402206154ada93e474cd5ac7e0b8e6652fe9ad723855b6bbfb6a0ea78eac45203152c022050b427014bf95115f48eab34a388b26dcd1c87bbff37e18ee206383b4e39cf7d0147304402202baf7f19b4072d4a74571f08f593ac9e7158cc7f14c3e22b6d5168b804c2b170022007eb1e531d4cae98d76f683263eb1d26d3898236c568d223ecd4cff3850d785f014e2103209baba0083c38f982c20ddb194bbc744ef33f45a0911cfe692623930cf3a729ad21024828d735e20c23834951ab8ff90573ef310c3845202e2f6c7b9733d53528ff92ac73640380ca00b26847a00a00020000000001019713cdd2120d739ff89a61430efd3f6fdce6b20a25570dc65d8a0c2bed87dc5d1d000000232200207f55c882bf5703d6a86a554a2538ba480d54697d0c0648a16869cbf6c81ef654fdffffff02120f01000000000017a9141e342723da4fde717bd9adb96111a863febabe71879a54c5000000000017a914f4b1286125a3b9fccb8a3f8f7d12697845b8ed778703473044022002e9bc872ed20bd0398452b9b365a11dc4b462fff4a4bb5cfb1778435b3f3a5e02202aaaabf675b48e61d0cefd34887ae6db65a92972d93cc063e67d62784d50fa46014730440220218471d0698339f7faf9ec95ec9b214e59a4fc4268ceb5dcf22e42bdb09968e7022057029307bb141fb0c263fc8c24a4ed35b2fb6c7e84f66c2fa027ed5ac01af285014e21033819850da25ed29ad6a610d4e171ddee8c7a749c7eb9cb68ee94a1365ea860bdad2102a853f13b9021e0cfb3dfbc380ed8a4bd4531682675c28a7e25dd6bc7e39f541fac73640380ca00b268fb9f0a0002000000000101b09cc09efb99fd895ee5161a7108287dfcc56f4791ebcfe42e1180fbe91663a60000000023220020ddb719db11dcda4e06a047eba9d9513a7269754ac43a41a65ffca7c38f089185fdffffff0270a89b000000000017a9148af955f4f7de2b2decafca2df21240ca107d2d158700350c00000000001976a9142f0cd3995b8d8508461378e58e7af7fa50d68cf388ac04004730440220422ba65e3ff120b9525124401ed905847c96f9415a92b6c18989be5c08d1aaf80220305667a4f8caab3947a1426fc072eebc7a8fa50c690c560454dcd9f25993e9390147304402201e405a2fe36e8aa46f405e8283137c34ca07b38e5de2ff93b0d0188391f4b7580220037ed77de8c3e98c977d8dcd4e8fc78b0dd5425b1aa5e5438c68304cd365ca650147522102009e23e6361a23b74949bf178c8a3a73bfbba7aa3a7f8d41eb111962f09b020d2102e7bbe9302a9e40e56d43d1b4e51c11a3153ee6e91803cf93865b2332afef10a252ae48a00a00020000000001012464e6cc3c0d98176ccf100f28eef669bc9fc137902d6bc2c93b52b1552b475200000000232200209d5fd9ea55490562ef912bfc23947a8b1adb82f3e1586550d1f8fad30200c1f8fdffffff02ead90d000000000017a914dbf8643d6ce27800f7a16d8cce3d9d7423d5fa868740980a000000000017a914e9ecbdf7f4c4affc66b9d77f6cdeb0c6e78d0b4d8703473044022044724480b7c9124eb60938e2b1f11d40231fdfee81324724b370c70773921a6202205c83d0604a465213bb9436e7b58583d80f6eb33a8b1351868d728bfba3a7c42201473044022069ede424e4a797e607343b47d572f3e4682f9158bfee9e6c631709bc1ed5d71302206cc7e7db6310009da2fe7ab3b657dc8c6d021411c26c8e7cfa35fe6239328afa014e2103a81dc4972ae9f743498b50718c2ab8c1e9cc501995f3615c6216f8dbf436bec6ad21028acd50f7c0f9736d400d462e5c03710c44ac1e9d1bc6e23ef1775ecd7e38cdd9ac73640380ca00b26848a00a000200000000010196ac37c700ed45bc3f2edca62c93de19d8fdf0c3372bd29eb79073dcbb3a3b8b01000000232200206218787c4a57366c60e5b5a738ed2b719eaeeca69cd4eb2299ab498611ddfc51fdffffff02a2953a010000000017a914079d52e39c6345e35f6a91af716fc5efa7090c5587808d5b000000000017a914abe51129735699c6c573bd3e04125f04248709c6870347304402206aa2fa368b30c0abdb8a1f0b30ca5b22d9d0ed3d50906f97b75df759cc1190380220073e7e0eea3e69cc202b1d003adab7f441bffc497c7d50c0aa6921c07a48c36201473044022054890f1dec5e0df7212ecc14eb06f2ba75bc4e57d60774cb28147d1c67fc72dd022024b19ef92da1014e374031cb4b6211d423837a6995280b785dd5ae5768958d22014e21033f1318fec31fd8917dfec85b0d50b2d7f43629843914bf60ea6332a399da4300ad21033cf2802b56e48249b7763264f2a07c3ccc7c126b25bc913908865e12fd7babc4ac73640380ca00b26847a00a0002000000000101e421300a97b1b6c460022825d6400191250a541f25218ef97370ee1b84a31b1d0000000023220020b00ac6adecba02f1fea5bb28cf8efcc069fc2a475ed321f3a71890d948c06a86fdffffff02385102000000000017a914f1115b53c4c380bb77a8de84255fff8b899fffe38748e801000000000017a91463cce9d6bffb1d6d49bda1cc48527bf5506288f1870347304402200fc3aebbc898babd8f3b73cd130825704275f4e0722c3545a8505f0d65f8bfc40220062d7773674853c354c3a046cddfb8e412df23b9ee0e40cbd5d6a777c3b91b0f0147304402204ba52507b164c925295c76a1095cbbc2dfb3b0c4c8e9785ed7b336f91f7180e402204f475e335c7d7c9831cff6fca96fd633dc5bf95cbd17776b4e38916daf32a476014e21035aafb425a620fff6221a8bbd28dce812b98fb0ae660cc924725486fe002f2034ad2102f011771b6e35010791d6b567d20cae46c4f2e117c99a6cdefa640acc6dcbcbf9ac73640380ca00b26847a00a0002000000000101ad9ed755b0b92cbb227afc75f958be8b21d318c072efeea2e66514a3a0b4868f0100000023220020a8e4616dffeb599b04340903f76cb97d5e3f89c09d1a737ff5879757baf635e0fdffffff02c54e3c000000000017a9149a9c330e40d6507b550dfa10d586e79b5c06459d87c0270900000000001976a914387bf67ec91190013274c9005b6190e8912fd75088ac040047304402206417a2c14aa3dbf85a3342c0eb41f155eced21af504a15325dabfa53a02f93bd022076c41c1079e8c1c3dbcd3281df79cc6ae970bc5197eb75ce2956be50f202085201473044022009460de667ea71f2eadc8d32f4b0581c0d49a204c95d2f162f83e0fa8aaabb6102207812b0038bbd78c7430dfdd498c05ac9e7536b49ae2db9ee7cebd30f758d1f330147522103612c32a0675cff0d02fb61a3b34c4229528613ac5e62f50b89a3486a35bc11ba2102acc2377fb7873a862c8daded1fd9c1ac9ce754f512bc571140755623caa65c2b52aefa9f0a000100000000010256f751cf4dd6c3bfc7a86c1b11778a37b561740407beb3f289aad6a74474ea010100000000ffffffffe1080b679ce209826bc9cb33f627da4a374d303e82b634b714c5e4f3105f33a80000000000ffffffff02ec940400000000001600146dd1b95db63b50e5ef4d4cba2726ecbffcc260268dec0100000000001600142080bb632058f1e108ddeedf8a92407fa564a3f002473044022008f52cd5bb36c54996a28745f601d17b4e1dfbafbd07c3d5551fec3548accd1c0220230ad5804c36514019c286d3a3864b68575775546ae8a8be2544d29d504375b4012102504f6cfe4abedab8e0f35dec53099ac50033a775ea7834a65a5c1996ae1867620247304402207b7d4da4cf45f9bcfe9dc2fb8759a3bccec668a33247e56f63711e3d1888f001022068aaf1366c3b68745bffbe489ccd2554d88c18b0bc3fac6cdaee950768a62fee012102ec076981e11957794559cb76c9146c85dcaebf4e17a46da80ca9963f0ff482b10000000002000000000102fac9d408c5eb31c8e67f9e8b31c38960467d4cd7b2f402e7cbdf1ee8f35a61780200000000fdffffff80318b159870aa87032d79de2e3184463579d17a278755efbb11fe3d60e935ed0000000000fdffffff02668f0100000000001600147271e3b2d5204158971a1039a6e9ba1e646be8f5e9e11c0000000000160014f81075198562565fa58fbaf415daa56fa78d3bca0247304402200785465a322173a0e533c1b5b349da2bd9d26f77eba22b578f99fce08c6e919f02200b1a61c1c0d636681c8960cbf218e11d4061b7a22218cae3db397789aaf9f928012102c7ccf699dbf77fd16f919fb8b2d7bc92beb9529ea0cbcaa2838c460d3f54e51f02473044022011fcc330ce7a74da0448f0862b6022ddf7aeb1d5c3ddfd2ca031641696cf421b02201f2c5805fc937c1a197d92f3974366f688905c14a1ba9ceca73df19cc814719e0121022e30510415a6c7774ad6c79888a1507c7b62d5c4f70038740350b84f33ae0fd8000000000100000000010272272bc3a82cadfba0ec69fa258808931fac5430983a0bf898e4cdc984c44fab010000000000000000f3df6568bb392412f1aa03a0876b4c4c0c2523735d5c2225ae3f22ef4de24e4c35000000000000000002485f03000000000017a914be130b2cf3b4052a603b4bd68ca32d3de79aa5618748dd0000000000001600147043f6834ad0f4cd7d2248a9ae3aba1c716111b602473044022029e2d341af4c9d80696a1679f9f3e98b94fce37dcbcc1ad289f4ca7835e3a7ca022005b7c2928f233200a12fb90fb251fcc9a63204288c51b60301c10ed38b13ee01012102b5a10ac01b9de3f09484d6fca9b21c601bade21b10fd59940f97c8496256fd2702473044022027127814ab86f98c9f836faf17e3080e02cb52177cdc48b1de6bc37dbc5769d002203bc640d2797e33a130756f3bc40ef50ecc343b789ff4797e50399f79f14b9d86012102b5a10ac01b9de3f09484d6fca9b21c601bade21b10fd59940f97c8496256fd2700000000020000000001024494cd1c214ca9f6417250871dab3b4917e249b2261576f87ab82e175eaf84bd0100000000feffffff0a4104f494ce8f3f69ceddf77390e49a4d1a5930150cb22f8849f6a273843bee0000000000feffffff02599d8b0000000000160014630aab59cd0b00fac96e35aaa5383b8414a981f9c7867d060000000017a9141c0edc5ad566fd0b399fe3b490f2761a12ce9a68870247304402207042a9d783eb4bab3773657eb8779da6bffcd0e4491d76cd594db655fb3e7ea902200524dc359ab33e8aada3fe0d57726e3a229379dabb3de23b70387d26e3c20e6e01210205ab2bf3003f4552bb3ee7d3d27887b54f5d26a3bbb6677c1425708c9a38c4ea0247304402207879bbf3935dff9e5aca4764797a6f17607850753a7973a067da58fe55d1ec010220193ed9f32495535fa8fa237b2d10892fc689e6f258bb26fd2aa62244fc6c762801210342ec41b6446ecc0f68f925a70dbde58340b2c3faae7c645e024ba1429083fd3348a00a00020000000001038d7149895a74edb71827e316bca146840391850c4d21168eada7721dfd1bf57886000000171600142eec697a44be01850b4c768fda75a51d6707d655feffffffa94c430b7fd79d63c539db22fb150122c0db445783f2653321b904e5a17907680000000017160014d031d6d0a1c541db4491e17e709a401ec8ec8de3feffffffd9fcfc1d08d1adfad076dade759719415ec8478733421b28e9a333324ffd91300000000017160014572cf4169d4ba33b62cf2902af410d2e80e74a98feffffff016048980000000000160014c00d8de78b6e707dbf844ca30ad8b243959ae82c0247304402204e6bef617fe658869ec75b8fbea2984121052940c4b8c22245868bbe0faab36e0220141cdc4bc71e13049c8fd179f4cd338e3214ed61e311d9d2c9a09e09f5ecab25012102b636fcdbc1fe3aab254dbbd680c3bd5b6f89d20cccfa8eca4d02aeba95479e080247304402201f517108b38e6d3a67d621a86406b1dcbe3d03746b8ec00549469ab1183d3d67022046edba9f52baa4241b16ed59d272eeb1dda80b851087e80db46988c32c9b9368012103506a99f4c501aca2bde480584907dbe7cddc0a06aa60dfbb4c965f7bbf4fe8320247304402207770471c61a1d5b26a596109483ec0c39426c42631e8f285fd63ea97d669e246022015414aea6157d48a88ff4293b9b97fe49ef11b9c579467517c7801eff7da72d20121027bb41c99cde805ffc437bd7f9fddf5cf716fec4dd32a2438184936aa08ac8c5747a00a00010000000001024cf9618515e64c5a065a2ddac774a83cd80015a04e0f65ac2775a3dd4f1e53030100000000feffffff947c807aa5317c9bd525c6f0b9c1fdb1202834b1e5321452a1c3f78fa0ea9a5f0000000000fdffffff029ab50300000000001976a914a519eb11f88d37070edf886b912fd7a7c5c6ca2888ac6e3700000000000016001490c23942cbaaa33282b0623eaa001f07e9c9a47d024730440220458cdb0f88e9ac297e0c7b2be8daa9bf430cf8be55e7542be67e1f68ee968e9402201a32b9bf2e0db6eba17ec4810b3832e9b201e137c732e6d64cd47d062b9a25ed012103fc3083153e6bd6015a09ced4ce771814a9a7ddb685be84d863c5396585af25ee024730440220483373722132277f881049b46d07ff4e6715d694c2226413860318b0aca1c08c022001f7ae55a98dd664b3fc4c31e4f484055b5506ae1139d550ab7429973fbc0484012103fc3083153e6bd6015a09ced4ce771814a9a7ddb685be84d863c5396585af25ee0000000001000000000102753c99f268bde8409e305da217dca7ce8f7216f0b00f25893347c6c440fff2020000000000ffffffff224f3b3537d2a1832d5a1da837cae9d216d161da63bbfdc5fd8fd153adcaa33a0100000000ffffffff0237bc0600000000001976a914c05d496522524f2627a735a167547087023c221388aca50500000000000016001432460da4b2c837497afe900a62c66dfd8e316bc5024830450221008207a633cc289670f3db9f1e1ab026917c60d1284efad5c85844291297a304fa022035f4c4bc5de514aa59f342aa5eba6a7cc921e2c5ddf1e080839c16ac1afd13390121036af8a64f5b53cbf13fca55cb0c1e0f5ef57c35173dd3736a0e08e2068fa138410247304402201e2574063f508e8dcdc4571d3b1f66ae3cda0083421bf9e858de30c18360659302206198f8e9ae85a0a3dafb887a833f5330a5e1f2fa3b5a66be0b866bf23381ba6501210294191aab2f0b280db37e578993c8fca737bc6a66312f732f77f1051b15a3ce2d000000000100000000010268dab359deefbe9ab4d8226536d7f9cad6bd1f58215e83ec9e9c791d2a97de670300000000ffffffff5e1187575deca71338bb476875e31261fef7a1591d7340002ab911c68480d68c0000000000ffffffff02eb3e000000000000160014f2e74fb5d37c91aa05ebd685a161385e08ffc19918950300000000001976a914ad3b00cda70e6af6468c1854d25f1b42b662195e88ac02483045022100ff83bdbd6119832ff80f648a41b0c7f60f2e8f7c7fe0460b82ca8a7ad968935f022014a8ce3e05a03a8554b8de39964f623d07b982ce607b13ee7ecfac42f832765a01210372dd50f752fe3c5a16e168a5b3826123bd5ec84a568d9f99d08518f698273282024730440220406d98b38b44c4c370cd9b176aa2e79fd7ae9d0edd9e109a4e9c58d6e37ef16d02206d9ba88776a151f2e896e0b507908b820c30f2f5f9229c3c1ef335752807abec012103c3755ea95081162f2d0d7d64d7a093b147230cf5aa4c37b032a73f45a16d89b00000000002000000000101bcfa4f9807dc183b974264c5831cbd386cff479f93c1021f386b6704f9ba28620100000000fdffffff02487a0b0000000000160014f0886fda93552b542fd5285e37b6aa8dbda9e4ca40ac27000000000017a914020ca04045cbaa22840bd5a96d5a83bde7f2689e8702473044022074dc88e351e26ca0c8546bb7754bb71245300c5786db9a8f6b5dd6507e138b1b02205a808db7dc3452d7f3d7d7fb8926136f7eef8884ffe56533080455449d21f4ea0121021c87b42386b72e027599594269ba867ee554ece38b8a46362ee7572dc35b265748a00a00010000000001015580f7d8644f5ba74429ca2c72796c54c3c78662c283bc351781e9b5b6aca9dd0000000023220020dba031993895a6c322093108959f091abdaa4e0c335b02329e086c09c485b56affffffff026fec03000000000017a914eab33cd90fca4146b1c737dc522e0abb5ff0432b87fb761e000000000017a914c8b3f7003ac43ce131f2ea246b5b923c3e86d218870400483045022100acad0452c1a28a762802b215dae8ce91f51ec74acb74b16c34b32c2c2da1ea1002206972600f8b079fabac43e0ee3c2a856b674dac47f6c57581ea478e8276f0edd9014730440220238249864233f17a9fec710ecfb4ab9257865c89aeaae8d8d5bbbe95070fbcc802206b8df70d26f567e90ad680200791868bc18f57e4cf34c8148a733b4d969954450169522102a90c13da33b0d3287e3f7b563cb36641d744a02545de92d61d34c19d227c169c2102532d2a19679fe0f62bfebf5393c0053ac867f171b1d29b3a51530683bce88b1921023b87691db61e0ff7bcc3607e20869b5f1e718a00d4d964b604b0b4b1771d677253ae48a00a0001000000000101ef89cde6b62abd6f42e8cbf072df988e7433ea6fdd82f012b6f36ef1cad504f60100000023220020b7e61a42a116f8d73971b28170d5b7575935dec1ba970b7abb7232313bfcda4affffffff0208d856000000000017a914eab33cd90fca4146b1c737dc522e0abb5ff0432b8733a4401b0000000017a914e172625a981127c8de7ff9957446a2fc850f0c2887040047304402205f79c25151a4173b25993a71b4bf46aa2588ff511629e916023277743558f4e80220097a7b7c99d5a9a45cfec803ac83c00569795d88bdba5ab36f1065f13ec3797a0147304402204157966893fa5176dcab3afe9f068dd617e072c0304c0e1bcc1f55b4096668d2022039b62e7adf69c19c0d6253b2796446ccaff771a3b1d5e1d0567623c69afe97a401695221031762980f16f54c75362d03c6d6ae0e173102fe2b075ef547bddf77bc36ca068a2102682eae164dd32e8681edf452e9b349c56165773365c88a43136a0f63f6981eef210320b291ef817b4a64b74cfd5b1c0a23db5078dd27ecc01eaf0d667c71a354e83e53ae47a00a0002000000000106dad7f00cf231d1b5e5e0c5add6efef3d5815c57a2a3083eaa409b7ce2e20f9dc0100000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffff2d628df09aef9ce4337ff903c0adcf41d7a6edc9a86220788485e02d61c5874f0000000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffffea795a431e0cdb68c0cfa4550fb3624677ec9b2b6df5fcaf2c9bbcb827e6d5c00300000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffffbe322a18c9d1191ad38c284a0444baff328f5fcae07ce74e52cf3662f79b68cf0400000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffff1135a01dfb7647cc1470cda5f984349d19512c91d0450e0f0ff3af2cdba6817e0500000023220020067d558fedad833856ee52515d0dbb9572e10a3507493b3b84444fc1858e2661fdffffffe76a9e6e2c6d1f400a6e6beae59393211c068e8fba1e87f9d901bdb37278c1810100000023220020ec5a61059980e82118989b9464ff3f3bb5d3e3f66c330bdbf2d8c7a5e682f8a4fdffffff02a0e9a0020000000017a914cc76c6b29a599fb5e6db9c1cfa29ea4ba07598918752001c000000000017a914da2aa565bf53c9c3a0062cc7f5dd0c174bab8bb6870347304402204cb6e65adec08ae2e5eac2dc7a5e31f550c3744ebce2e37d8ac9177c0dcba74e0220495dd279f0272919679a770f25f4965429dcf8e7792ba774dbb7df319b9d6a440147304402201ce4f83573edb24d58b70175db8b7bc013ba8025c117bbfc640665eb3b9980570220771669a3cd41c7e4d557658d7bbc90151f08da2d6dee6cd6cb517e0868311b93014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b26803473044022016772d708b01675e3a5a590a710961d6460f5d4888e5eec08b5ea1adcf0c48ba02206a7e1641e99258b04b61afbe64c83e056f5c62784bfe42dcaaeafc368175880c0147304402201c72d15122717d627fad6e3e21a1f76df02ab7e1eea46e988202f525d0f01cd002203bce4e334e0378e163f3c7118b3cc6e7d24f51e9c54db5d4326956115f7dacbf014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b2680347304402206db5edf6b25d883cfadbff3bcfdba31496aa2a525f88cd9e37b3d6aca30fea92022052f78493625db1120bbbcd5747de5478ccf4e5c7573cadca0925335b4be96fa401473044022040a2ff89bcaaccc052ad0d004c09e8b6618f5da9caa3913120323204730a129702203a6856f0effd9e99b91709f1cc44c60b5c8551fa854cdf97915f5c5d6f19e96d014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b26803473044022067f3a64319b2ac89af7bfd9fed7fb5433ffacf89cc11afef8544b27403213015022001e66e6a6685e6ad2ab44c4d78013f4550ebf8f90705cfe71002a292085e33410147304402204926763992eed91b5e5cfa413645eae5b1657cf865acc3971fc457babaf473c70220221bda67c9a2fa1f8f763ef82ddffe349736a42b6fbc82836c915848c6c75128014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b26803473044022003c7875eba5e4d5c336dc10faf2963d1cac0287b6545b62ad30d86f337c6169402207350d4b7e79065a87f06098d582c9b958b9b09ad55bd3e7409280fa97b608d460147304402204ed4396e6c9a6966218e9d9f0f3817e6b4a02f2e2db0b0cc95284fb1b83158d80220434b9214463818e65acb60feafe4a836db4d3991ed5dda59aad62d66fcd52307014e21030c3cbb260e91507f23d283cf42d72ce30cbcdb02a1deb64bb92e00a5be18a4fead210345463ed564e03cd21974674eaa403857c5290ade0e32fec6262573f2c90d6cf0ac73640380ca00b2680347304402205ae11b5166965e7008382cd7e1f080906233633d400811e3afa3aa291a408204022026cbdbe81d7bf51fc1d975cc0f48b025b64e8d11eb4d64e95dc6c7c43b6a2d54014730440220532de17921abb1dd69e456164da62caac1109daedbeefacedfbe697de7386355022044fc67096270c6813ac8d1cac1ad698b5ec2f7a7a1a1497d970dc4bfd5decdf2014e21039a8c2ff68b3bb557ac7248fab41dc12ea04fd7092c7e0d4d1e3d20517f4553bcad21035f626c806733920dba2a87bb51c63793908f2b0d417e04fd6826edebde45b6dfac73640380ca00b26847a00a0002000000014f15c3ffbb142aea3e58dc06e8779e9f5b63b263b013b6832cffd1e876117795010000006a473044022029bd61a2272afbe45315668a32cf2ad058456d51a512569cb9e4e6a99f3a2bed02204a405ed79e5bd7a8346d39b51a49c8754cea3ac26ca936d3be9dc70f2815f2f0012103aa40c176d58de5eb583947e4a03a7e9010e32b15364463ede6aaea25b0b7e097fdffffff02568a1800000000001600140c7d779abb90b615bd6b4f2cfe6e75a6710575affc180a01000000001976a91482cd851f5c5b554b7226dd55b6fd241f1ccb233a88ac48a00a000100000001c17158458827347404685a41355459b6c573f59e4280b2db94b660cf1c8286e6070000006a47304402205826394d3e968fd376a425c81c69c0fd2890c9ed8c565860e1d69004f002098a02202b4020fede6e1d2fe6d81a25350e62f57be6d9866184b50b48e7b65d4cab495f012103fde7711863a85dc63f46ea6c3fa717dcedd6eadd88c2f165db32b95f5cf72c0dffffffff027bb30100000000001976a9145b0c2916fa642fcee38ff39fe269ed52c3a981ec88ac5c190a00000000001600145af3a18d9f57582c13b5ee8d429144937abe104700000000010000000131071f1050c0820ed1590791cd3aeedef0681729c8d6c8c766f6badd75a51e5a000000006a4730440220702636f8a3127493f487842b7ba04e01443e2a2fcc570460bdb5c18cdb90abdc02202faf7069fec409d4a5086357f4a5c53881eab42aeaf7cebff14610c9906afdd601210209b23238a8c0b30bd97ef113524abd5c9816cfea54d24734eaedc0fb3470a886ffffffff02f3970100000000001976a914d4b4f87ee84be718a0d4758aa767c4ae7245b47f88ac50c300000000000017a9144638ee33b20682a6fc5879a5b8d9589f44c70bc987000000000100000001af190284d3d137a34703fc97655a71b1a7c65e6074a62bbb15acfcfda45fe15b270000006a4730440220536bf5534cbd31ae3fefad749a1e217e0f9b30916f177683258c5ee4b732fc4a02202242b8a4528a0e3c6eba4d372a2770f9346c9db3db9972972685d2b54c980a72012102a997fe94039f378ff94e1ba39c87465196ef68fbb207fbc0080cdfd60674e490ffffffff02d8a60400000000001976a914e72fa4b99b46becbfdb45a1bd4be1610636e544988ac305705000000000017a9143be0677e5556d7286b7819f2da7631496911124b8700000000010000000102c72fa7897b09b12631616cc97dc70c569cedc90483961a8f2137a49c26adf1000000006a47304402201924a4dc8f463a5dea9a2d5646acc9b35ac047dcd8205d653e9e64c58f7467c60220363ad8a1b781c847d7765b263ddfcd83db0a9856abd0efe86babc0195acab0e00121033487db11d91a7e0eb4e542c6b9530cba2cc580188b58132a996f85126619b31cffffffff02c1550000000000001976a914611fa94ead8a87c039082aca680d8fb0b97997d488ac831c01000000000017a9143ac12a03680d09fc2f0447e76680b5dbfe8c36e28700000000010000000104c826d672631e5e817039f921e9e8e71fc5ecf0fe9355e5c1ee58a2dc30a93d010000006a47304402205377aa596256c4514878db789e716b3d3b354708df073871fbd6a6a7ab27f97a022005157a064cc030ca7a4d4a078e1509c196f716bdfa2c83c328e747269ebd895c01210356ee6846e7214d1f013b73d3099146813fd7797e7242952f2ddee73bd5fc6115ffffffff02ea8000000000000017a9141a61ba3a7ca7fb5c8a936a1c25f5a9b3e5fce0a187f0b70300000000001976a914adab044f7b5b193f8213279eea3367a2125cc44088ac0000000001000000019c2316c45611d2b672cc8b2bad6a12952d10cb7f46bd2554d0197dfc123c88e4050000006a4730440220430f511e370d133be655ccfba697cc9af559bd5ab0244b4c773387f5401755a2022004b59c914dd4a69773c6c9c066208bdc93e2f848484a0d5e54721cf1c35a0b84012103401b6b9ecbd49c09f0309cb55bc5ac4666097c6e9087a9d2169f222d469c2417ffffffff020cbc0500000000001976a914bf5a4ea08f82e997583ce4ad30e286a89afcb58d88acb0ad01000000000017a914010cc38901d1032d46a328453e390af3b69d33538700000000020000000169f8fc3832617dd022f7b9a478935bc5640b58078ac47a99c7c7d960f053b7bc010000006a47304402207eeee3645b94af2780d49156e473ce11227b0316f921d5af5ef2a168ba497d450220100e2c67fc05a209570359e4a7022d98c4eda5b7323963ad07294de07531bac401210276a9d6835c6decdf50a47440ec3f518b13da17b3ebd0c060216d98ce4cfd2842feffffff02195500000000000017a9146a94f3dd5bc84ab4bc6352fa3264e9c1726609bd87a1cb0300000000001976a9148045c1b4e0fd173100f733de0bc80746daa72d1288ac47a00a0002000000011919e0f4d6678ce3f17fabcebe73ee8a2ed09857af607d6a87369011261529b8010000006a4730440220303d2e4407ae6e318027da08f799ff94e63a39668a07c47690002a6bb92340b202205c1a41392ab30bd97b2854a81bcd592f68e4a3c5e2bd939869368b1dcf4b1c0c012102819056ce25932f375f6098f011853b4cee3c6e96d4ae6704146227b051f6eec7ffffffff0280f0fa020000000017a914622c5650eebd66ec207c444938e1060261db4901876d392f04000000001976a91459a00800d833ddfc7cc77c4381b678c9b3faadd888ac00000000010000000130da0534d3285bec884ebb47ace94ca788bb92abbefb79f00d95b3a79acb90cb010000006a473044022062c33c1b3efee7ba41182362a3fd7c762a17cd3cfd7bfe77e259423fa753a7c3022015a57851a8127942070031afd8f927fde0a608ba2a79585207077b1155ef2916012103582b06f99ee98cc53dc5be45417091f74acfe62e173559b2bbf3c36fda440d90ffffffff02915d03000000000017a91439cd33eca94d2d3f860b8ef9ff70ce3dacff78c687eddd1300000000001976a91492b9e813ba9e7750f998d5424f6922753688ae0488ac000000000100000001a9bb6190b887e6cda0389fd0862cbeaa6697958a838aea48f526042b6b290d24180000006a47304402203a284e3dff75990bec27e7526ab13e4d06b50cdee6de78afbf06557a7775a0b3022069c4c7832848a388f11821e7fe3f7ec2ad0d76b83b8953c5c48f6efde7644306012103404d0efb16ab3568d0871bb7b9b567c6f5e9c5d03741226bccbc499f62225719ffffffff02d8d600000000000017a91402ec581359bfb44b3ddb6943a09159509651b1e587ee5b0900000000001976a9146e61d52e6139964e71e3971b612ae0024344353588ac000000000100000001243d2eb89601c8134e9ecf008f278005740f3c2a114060d182962d39a1fc3cc4010000006a47304402204a1c15a981a30af06ee1e54cb3d6e58def30a4fc89bc8052cbef692650a7eb97022049c2661e7d13564f286f065162f4884a40a38594368c6f2f1c8cb27a65c63923012103e4e56b56fdae54a1d7c82b11aab300545005d767bbcc5711a17ea002f8f031dcffffffff02636600000000000017a914481add906ae014279886af81e951202c5dac86be8790500000000000001976a9148e59261a58f1aed52ca4d6374d944b7c1860b37088ac0000000001000000016a73ecdae14607ac9e1db14f493000784e2ae584a97806555389d4e2bd6b45a3140000006a47304402205d591d2e4d2c884b62a9ad261f8d72e45cfac5bcf47b3d01550af823e52908d502206ea906b3bdba89240a4af8dddbadcddfa779510eb3fdda9cd7d63ae5ca6b7f9f01210389aaec27b9c18e1d7ebac870c2d9bde60122f5f028c4ac7f1886c5bcc354fd1dffffffff0284a707000000000017a91497a0baaf5eb6d6dfe5462f370e9f411d8a50fca187bd940000000000001976a914ba3b6a9940afe943c9634cf2a6a2f13befd9b3b488ac00000000020000000136d6ceab70209b7c56798ac542e795b06d1b79090381df258acf1194b9bfc9c1000000006a47304402205a2adb0e5479b23a46c6f98575adef2abb3f7127658d1f7add1df6d919c53110022014e2e88fa0560c52b91b1fd76d19b130ee5c13aa0bc8ddf6218ebb0713eb9ec5012102dc1b2d6638037cea167a916cc466f74f6b7727242d4509b1a0427f8c1c1e1de1fdffffff025dd90100000000001976a9145eebb2850eec348c92e631536609dc9e7f21567288acc2590600000000001976a91452464697e3171cfa844a9bd8e8419b258a47dc9a88ac47a00a000200000001c6baf281e07f940a06d534a7b956d9205691250b3975fed8b536dc05eb019582010000006a47304402204ee05dfbebbe6eaf8f1a394c514e68c69a0fd95c7f48bd1e908b6c69411fca2802204254bc619dda2d24c0ef6a804b9db47bfc6e6df2a4b317bef6f134d533b8b0fb01210387ba7e527dd225c155f59b4b6fb3a49871e35160fea5a7e1896c873667a692cafdffffff02eabd02000000000017a914e8d1a409bd7bb96c4ff579aa132f7608f8d9b4258798960300000000001976a914ec734863be1e4b98570b2b6e99569ab9cb1eb69088ac38a00a000100000001893025e205a0cdb2d7cddd510cb987ff947852bfbb7c42dc113a1d7c55288665000000006a473044022074a0e6137008350feced1a6050b6463addba10a46a08bd410f2e81ea5d5d278302200d4160a5c6e7d3fd954eb1065a4b1e78f89c73c80288f1e3c2cd3e49d651cd91012102d58cb26cd98280979a108c4380fe9be366bacfcd1217228c9003efefe4de87eaffffffff023d201200000000001976a9145b47e8fa7eb89f45309f862299affdfbf2725a7c88ac0ad35f00000000001976a914cce42c7edcf85e1a160c21e917a09fc188902af688ac0000000001000000012e7c82c534c7eb0c0fd8eba5b5089c7a5c3402b2ffe1c6f8e57e95d61d8ebf15100000006a473044022076f5e38168eea0878187fc33502d9d27d887186c9cc40987aa9bdcf98728910b022046f99095186c9d20d9c1cd55106d5196132603ca06ba953542a65b4c71c522a30121034b1fbe80477d70a31197a08418c22959ca6b58e3f9846b85ec12fcd83de9b9e5ffffffff02951d0a00000000001976a914915964e4cd690c6d8e9b0cbc0063fbbee9fc798c88ac8e921100000000001976a9143452668815371d9fca764679b1e6c19d5343cf7588ac0000000001000000013a4295997ac8eca374b7bec56b6f191a821fe5ca4ff4ae3915660dbbf834ea8f000000006a47304402202db51ec586fca1891c8439660a5d260715f70f30837a323885b229b84300d5fa022008a716490069779d17729f0e3f0c36cdeff57066543b7d3920eaf9583b55202c0121038af4e7fc6cd6a7b3e91de582f26cfde6f5e4796a1c236f85b454289998cbe815ffffffff02af030e00000000001976a914ea91c66273d027f2102a9e670ddeb1efc128d71b88ac30c91000000000001976a914a4dea144ef171ff1944af047edcbcd9e1e5f615288ac00000000010000000158163773e743d1cc139aa942de3ddc414bd3ea75695e1b9655f92d710f52f820260000006a47304402202aef66f38c0a94fb2ae839e4d0909d1013179c4aab02cbfa589b3fbcbf0ae05d02204dc98257ce745f80c081fc6ce24c777c22d921ed27d29b97bdaf83d0032058740121026986627b03266e326acdd42162df0d305c85efed3a4edbfe4ce7a5d8352e6162ffffffff02dd5d0300000000001976a9142cf920f21711fb731b4c61303feacbc6fab5b67f88ac06b40700000000001976a914bcf96b4241eeee155a491d4a4a6054fd74d0d70688ac0000000001000000011f7674822d8da5134b419876149a6630cda1c0ef7984b7d653974b53f394d48d010000006a4730440220378c5d587986261e9cffd43d833a18220989c0855c8284c443916223fd369b0a0220269a836154f4d10b3c50bc06e0c7835a998f993e1f7f90707b74c7a1bb66328b012102b7b709744e3dac31b7837be93ab0b6ff4f0077ada6079be6529f1d602a0a89bc9bffffff02c5470200000000001976a914193a5e211efd2cb607e0b6b2280f48010d0b1a2988ac45820f00000000001976a914490ee9cac05652a1f726aac71a8633086788368e88ac000000000100000001c4adb8b4598621a19119a31b6b75ae2b405a1d983f252af5edc0dccfc150b826100000006a473044022078897cd499b5252c5f4008c23dab0681d868765444ac8d92edf67d285081500b02206929373331c9e73ebb295a735d5da877aaaaa7044e4716fb7325f7744fcdf1dc01210237caa495fa5e389ff7760824060edcbe23c377640c950d709af25368a3cca862ffffffff0200c2eb0b000000001976a9149cc8e98aff458a21bdf9b66eb06b3d5f3f5d9e2c88acd4126206000000001976a9149ac9cb1fdbc1296d967c0a5ecd911750a274ef4388ac000000000100000000010546e9a6813d80ca9357862df71f65019b494b4376d7bb0543de0b92d65e2948060100000000f0ffffffbd370e88be76997e4d789a3f0397a07f66a4fa8ac9ce8e796f50661cebf31ecc0100000000f0ffffff1785d6e94f90058bc50dbbda00fae2a39dc5956a3cf9f7cc89b4e802e4639e5f0300000000f0ffffffd54908d338c7404fe90804af18ad2ec0365f125233f50bf137e884794b6b94b60300000000f0ffffff349c31315f7729cbbff4877c00bac3aa332405046d93ee1afeaab7e05a1b63430300000000f0ffffff02951208000000000017a9141bf14ae8e651f38e11a93ba4e28d0a93f78559668765720000000000001600148cbf9bc5172d88c468b5881eb67222545f5655dc024730440220627ced87539f3bf1ade13abc5d325c6b65cd075ec5d7c00c99772126464c9b190220401e6639a62385df503e0e027f2458d09a691fc9aea7eef38d059926ebd85dd9012103bd0159c96016ae54186814a15d1e8eff0e7f8c679dfe9db906e806a3d160cec302483045022100cb51a72778689895187dbbcfdda26c370471bc10ec6674c543f4f14b6f3e116d02206f024eb79bdeee1f88399618dd76e17b99e980fe1f1d85563e2aa5e3f3559572012103b3a797421c323ae8135f359825a0f854010e628921ddaae353841312c1d6f740024730440220291777bd2cc2f11f6887a74b4f52ed5c02a0fea9b2e63a1d46d5b86485f778ed0220503c29125121b6bbef0213e5306044e97817f90c2f287b7f05fbe2c85f424809012102963fdca4d6b1e461a8d85b977727df8272d65d2bd33e6ec9ebb2124b23d2918302473044022007481acb53135fd78a1bb583d6bf323821da483ac6921c174e5658f30eb3322302206d8f39c6d9ce2fec9660d672c5f7a6c240b45805ea43c114da3131b70f53fff8012102313513690e7a54dd03315e652a2fd3157c1398f12fbad9bc4611f523664b341f0247304402206d5d6b05515b9e31b50874c9d564c5b6e87fe843fe3bf23227821223b6d3cfa50220789553011c3329d829a3fe975371fa150c4a6991d41b96c3ab8eaae35607642e01210315cc9c241e2537aacfdd2a800213bab1a8640b6b7d50e3282d285b731b9120b900000000010000000166867859d65bb57d853b8a3b4f7f571b5ed6021067dbc3fb42d36a7e196d72c3010000006b483045022100a383541bd89cef84ec1ce135230037b41fb8296cc763ecce38a7d3442035d955022028f7b22d24819dd1951f9ac0575e4ff8a1d23baaa37eaf302098cbe9c8163649012103502de90e8a628e530944983ceaad4f940e7102fe36d533f630c8f34b0a1cf19dffffffff02685c0300000000001976a914ed0e6230acd27d4d5ecbffb1400663f3c9c3ef8488ac92206b02000000001976a914b45f7573a0dfe5fb0cf197496c17f64140d6093e88ac000000000100000001ea4bfb4cddf84a6a387d340168c00a1575885146cbd92f65fad27c65588e6d0d020000006b483045022100e342add37f83e253b9db1fc81c827ff8d580dbbabbc6ca4d18089ac24929b81d022050b8b7aab85e408d2ab059818b06ccff06c1da7a4d2e0720dee91cad3beab72601210261fdbdebd602cd95131a229b860444de6ffb3ebaaf9465d513f18d27b6dcf2daffffffff0286b44900000000001976a91467b2be7c45d98e0226c6ddbf2a93f4fa46b9ede688ac85bea600000000001976a914c0eb88a5d4c8c8bb2ee8b1cd493ea16682cd956888ac000000000100000000010c32c33a343870a74090c913acf9c1a66c484f46410604db7b6a26e1a1d6f43d181f000000171600145a78c1c76900decd5dd474a3dab1e52f6966ab8effffffff31584fdce734efdaaa5581c68f957ebecefe400f93588f0b9637a23257067f2600000000171600145489875fe7df449d6408307da055a265286add2fffffffff77cf2f67ac1a982e396b037c0a6b64ce48b8afa7f1f7363381aa93137d46362e15000000171600143d8bce89f3972914523154aa6b886d7b03870be6ffffffff5b900112455ddbe17ab5992239471e574a3686a512c897a691c5c2f2e9d9263401000000171600148ce75b6d09aff2c0fd6ee571414db5ce040b64c5ffffffffeac74ad24d27a43b7cb17ee36de312a9476871e17948939deb8403c47d948b580000000017160014c5fb72807f522f910f2ccf3a51603f012cc81661ffffffffab91ed08e41a851dd0351ecd2768295e2a93ef54c69e9255aa6d27018017cd6103000000171600144e702b293ca45582768e9487923474414eac6b90ffffffff0bcba1283e929c84e47f549ea930bacb231da049aaef27f5794ce9a11b5b5064020000001716001471f087a4a275102094315a443327915983f63f79ffffffff40861f4ddeb32f8461a75166f387ae895b152d649e4b06bcee045632582073680000000017160014c79819d306f63b2da541394c73cd16f2116611b9ffffffff22b2a31aaab3a7edfab3eca3d8cf24519ea593f21f439c762e48fc80114b7ba30000000017160014afb42b74d6e3f1b8518f8035ac974974b37cd1c9ffffffffe609de8fbc58a99f67a2f9ce9fd1b4d834a66d0359dd91b12058918384ff9ec109000000171600145a78c1c76900decd5dd474a3dab1e52f6966ab8effffffff3f358656a118eb662e119e6c92667dd61665303c83180575ab27b715b52c1cc96700000017160014a23066fee8ed14e088ea7b8a14866464590c79caffffffff590ec0729a929031c42b27e1c32787b1507ce807ba797a9da5b0ce6e1df55dd51500000017160014d23fa60a74419fd197fd1a285d5cb088fad240f2ffffffff01ad110d000000000016001463714a1d646482dd1fb95e0169603403d5564c480247304402204ef8a5cde0d8e7648db36a589ab44d08465f5aae73efef1bdaf91cf68c7d38e802201cdb8ec73e5da56040b6cb268e6d7799c7faee542503f88e1137b1c949f69ed0012102612341212c953088bf42db8abcfeef0ac89a2b7c89d906f97f49bad14b901a810247304402204dfa8096ffb3298cce43969563b3c42c4f634ae9ba51326ea485f04fecacc6a6022055fb01ba2b9224637d0b25798542e56c8e8d7efc952fa9ce5f0bc1b5d4c8848e0121022cfc93bd913384eb2f33b42b7052a312abb5f03f6c65d8f29207f645870c984802483045022100e50219ba91159393814b57617498b42ce630542792fd3983b3ab7d2f6656ae7d0220644a572324b493eb4b4c589922efa6048d6868d6e18fdcf9b4db7574e698c3c1012102fa105983dbb39ee35247b9e0081449cf603e94d772df6d09943a103ef89c29ed02483045022100a73629f60fb51bdfeba13817f39ded5c2484ad8f7656f36a21018b3a7b5b214c02201328fc6613968ee4377875556c00e78a3c6f1f714ca8013d863fd746f77a5d82012102ba295f1e0b95f0c9b4b5a6f5ca02430c95016b88c06791259787c2cb3a2941cc0247304402200ceddfd1c35eec933c9b2c8186ac843c443851cd69cdd895515d2155898e228302201168cdc6d207eeb357f345571098da624bafde097b77e584360d2addd107bffb0121030ade71d86a6a52a9a52ef18b7c493e8463adb40f71f0ece514b542223c6ffbe702483045022100db2c57d2c35a99d41695b00e4100659237f68afbe02af97ee518b6408fef6b78022038ac76f78af9d99c737a7f11e2bf3046a98d53548efcc993613586051cfd29c6012102ff9c1e8fe6fbb6f9360a11cd7f5b8f1ec8b2599f8df971c2f04ab92092915db5024830450221009d0be54eb3df037c5dd0427ea3342cedd12ce8dc71b2889b9de8462448f0259702207496a8d29e87ec4e39a334aa3d59d8cdfdc45b92fa546cb5aaddd14729af3b4401210283693ece8c569969610d61e2c0becaa71f23739e2116c109e9217c39d876df9902483045022100bbd387df2ad7f86d702f4ce8d76da93e549f4deac2bf0f6b7805eddfb825950802202c8f5745584ef0372fd779bf8cff961a69a5fd8ec62ebf0361caa0db7d49cb0e012103ead258acd662804e6d04f22fbd880369adc91f343297252ae14582b26ed111590247304402205f7741518e14b34de5b8577f133deb54f10f675ffb39bdffd0c43f796572875d02202ca61ea179f24f6a5ada7663e1318c10bfda1b6591aac26634f2ebc412b27c3b01210320fd465ebb0d3d1c0a3bd0303ee6c6bd2c531afe6b4d1839eb4505da96400db0024730440220631d7b3e4528723c043810072acee752c11a38562ecd1eead7473b3159288c4302204c0d376a0f6586df886fbe363aabff9c9e202320c1e5350516fa589b6f0d9bf8012102612341212c953088bf42db8abcfeef0ac89a2b7c89d906f97f49bad14b901a810248304502210098b35c0f87d2425e15f1916f0a8a6065ed5545d286201496e53cd55410a766bb0220562c698fd88eec77a644f87fcaea360b25e22498c4941d6251be4059ca1c024d0121039b6a423aa542564650faba1c16fecdb80abe07b454f23f3e48cc6898a484d05402483045022100eaa4f865a8fc65b40fee8f666c8318940ecd48b04e4d53d1a47088d955bf8514022061debd749334caa50f1ecf8757c47b09f0bb67b573555da7daeca16f330e2c1b0121031fdb1a7481d73b45adcc66e688f83f6562a591d1d23db85439a18adafa7fa34f0000000001000000000101fa1c965b5dd92a2dd24edbba4de5e705b0728a311e83cd9182ff21c4534422640100000000f0ffffff0256980100000000001976a91469527488bdc4640de2d46a7ce88b5ecdb07d8a8788ace15a0600000000001600145ce1c70ab8849758f3e656e4b2f1fac5bbdb8d800248304502210090e638b14fa2b0b1dfe80de798c73b5c1948167a4d02cc6aed682facc26dfac40220159e36d102b43aa439b73ed80b77f8493d588787cb750e76d8383481cf154873012103322632a5a0d968dbaa0e63dd2ccf01a5269c438b1b47a304d22ee74308e215ee00000000010000000001045330e31bcb241fa88ba9a3b3c8258bafb9857807791d836ba765461acc09dce10100000000f0ffffff48ea678ab487f2d8dd331ca66f8e56ca8a4738abb20fdba9f1f770d38ffc920b0300000000f0ffffffa21eff227945f3d5ffc16268c700ef8f76cc9cebd971e6a44cc863f4127c79250300000000f0ffffff7781816dcb0ba896926445f12d3f1d75416f4f243e59c9ef6bdf6d2c39c434f60100000000f0ffffff02dc2042000000000017a91457240f848f6a9ca8ef73728a85bfb1adff3832df87e23f0c000000000016001497b1d4079eb399e0b0fab09ddc58151aa2aa1bfe02483045022100a163c34a566ff03bbc32bd8bae82e1b285e2edc8c43151ba712c75f59078741202203a60654c19f2b971d9d0808afe2ff4e8b45f9214a3b3ba6bd937dfa0f377c56d012102df9b584174728a0cbc0aad88a5fabef40975776c9a7313a811edad417369ece602473044022059390f60783e6c68012a7bf9f837b8bbd10b7997d29b1d45bc5dd003872544a8022075266b0cc1055427a863d1d4bb6e5f3d984ceb551e7ff54571ba4bcb4f952c0c0121024fe0f90e8da8b61aae0fca15541d2638d8931f91c178a49596afc3953e3f56a80247304402200ba5eec2d5233b893a8e813cb43a026c298ec6ffa8dcd0882f1b7e390e032b2c02205b9eacebeb97a066b9529d8a89ec7b916e90a159b0984753717d7ae92a80298801210257643ebaffa0d7a3a5b993ca7ac85251bfd5d9d02dcf7bef558b8ebce3d0511c02483045022100d683e8a8a2e3d7ee3dfa0ce9c764cc46b2d663a1ff5a411e4d632ace8b3d35c30220060540753a84e2b12f5baca3023ea7f44a51aae1507599f661787e7de150c22d012102bc8461c11601f3c7c6f279af22176e2a46493b46c80e7f78a1b8e44109b08cec0000000001000000000102b94b853b68b049a2e3ef2820ab54d290af6fff2c98552c33e5bd594b195bb5550100000000f0ffffffd13699107149bfc3e54e75dc309a194599a0a772370567c6cefb1687d9add2140100000000f0ffffff02846b0d000000000017a9142477b820e6b9854492b7d97115619c7fca1a60fd87512a050000000000160014dced375e695767dbbefa58b650233587e5042e1902473044022073d36bddf2fd84c457478c87db83899af1040895c50592f58ab14eb68f94d288022004d900cf0cad8dda1045eed6223bd967bfe6889e8bf1ed76dd0d3ffa1cfcb99e01210304052369a354fa8e81a8b471454c23156c6fa50b7fd2c27bdcd1bcb5f4ca7032024730440220206ecbfb8e4fd5b3c24cf65be645af25a2aa46eeb090a1d080eedf34fa5febe00220507076790f4a8e293c6108adc0ecaf1d41e3c94c79022a9a7ce51efc414a8ce8012102ea60cdc75f250452ff41974e93c92dc293236be02fabc1d8eb00636e0553a96900000000020000000001039cf9bd1d46dab4632acffa6ecfa1475a9b1673ecafd96f882132400c7d7d039f01000000232200208901835a105321d6e2dfc6d925e596c41d36f19666b206a3e44cf6a715486cc0fdffffff322ab16c46b8be3d71034a3801df046c825e0f46e2e188df3014cc4a4e020caf0100000023220020827ee8b65c4a0f8b65a38679bf60dcad44e8337dc65b345a8c58a0656710fd20fdffffff8ef6492570499700ce45c36d3f73a77f5bee8b60a5654ab3c6305c26b51ee60c00000000232200200d3ab1854ba2327ebb8596b02e848702dc37b3a3ed06c7df8c8e5e7eb52304cffdffffff025aea05000000000017a914c60081fecfda001a8a098f2bf5d0fbb58925be4e87067c06000000000017a914442730b217ef2a8feff28393531ff9e2e324e699870400473044022033d1af12602f7aaca7b97f90876e13faba0aae40e68793b35cba3e4d7a42388b02206d6a9a5b6fcfe7871f0edd5964f0a269f4a1002f9ce9cf9246f54640d02a1a0d0147304402207d7343a7d7483735ee5e81fa3c0159fe66794491a640775491736834131346ca022072facb0028f8510be3219c7032ea1871aedb3561842f3a8b71b46a1fef1f5f7f01475221027d5fe48c570d1332ccb476ed8c6338d8a70174d8386baae4e10f984c25d3a8be21030b0e11dec973ea606450a5a81103aec8768ddb9bca5dd47750499561cfd015f452ae0347304402203505799e393d4eae0dc731a412eb870c98fd1732a7a3bbffe462fe1dcc99ea5502204a1d5c0e19dcbe3350f825e77faba48ba2fcc5a0bce6ea3fb88bb77245f3eac70147304402207f1b43f8cfadf447337855442b2a1ba48984c10c8adb01a7816ced768a0dd45b02203a34d89d06cc3736fc48f0445bd030d9fc9f4f9dd2021693f96e49551dfe87b2014e210255c31a6263b3ae9af7be553da327689e12af3d86c986955946a937577058a89ead2103d5ae1ede457b43a0300317ad87a62c7918c2312b4ecbc99422ff6400cbfc67adac73640380ca00b2680347304402206cb7d8acfa885b26d97eefee8d6a76b712c327aeec674cf09344be20d54d9984022072036371d7c666142ff0605e4a40508731e46ae39ad2c904d2a896645663ea200147304402200c6de268148bd0bc392fe853c3bd4591267770d45ea5493e8fa7d1a0d5c119210220390148fde304b7002af38e70de4e4e1e1224a582456253fb935f060c04628cae014e21034cbe99ad6e8c1950caba8eec458469c391ef849cdde13617dbaef5253a0ecf8cad21022785c5392c1f3115e1d8f6fced56a9dbe83b32781eeb3324c067771b11aa41e5ac73640380ca00b26846a00a0002000000000102210daab76159fe41c585fbe8111ec24132cce1bf9eb4c74c63fd93748275cd9c0000000000fdffffff6f9f2a8989c64902c268f0c685e01ff3f1b5c2400e5a4c10f7f63b73aa2c94b60000000000fdffffff036d781a00000000001600147a5f99513c6cce33b8798bc0f370ddbc0baa402dab4c0300000000001600141def7722c19e83bd0b353b1baf8c6ec7891e8b5824d3000000000000160014d80a38a7a09346f94ad393cab10aaf7cfbd56165024730440220530ba9e1520182f5743e85bc2ad04b47d327aae9640a47f0d2d98681c94af9a90220769fadf22dc0e848d1fa0d1263cfc98e2b8c080a96c9ef5f9d704c8701bc8d9f0121035e81cc551c9f183cbbeaa7e11b3b65b6fb89e3ad190c746f2d3eb9144c9f2286024730440220459681aa387300d515f23112f57429548ee66167550e985925bdbe238aed3838022039215d77f6c80e2f429df771b5e29aa6d702b15c0125b73e6b16451002d4c59d01210218ecc15fdcce21c5a495210922b049eb74ac9f4fe8be4f5c1955d4f923881a08000000000100000013e575d67eeb755c5d82be0772b56f6f5ca205406bbebbfcc00783f74159ef7622390000006a47304402204e99a5dc9b232ee23c1e9eacbc9b5f7f2c9ed82118f1d883b41009a2b64ff77a022011c6a39cb22c2e477a5296a661e42b0c41b98f2a089ddff508e4e6e4ece5c43a01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff7524a0325e76d489a26bef83b20997e84e6977b03c241249f660183941666cef350000006a47304402205ee4ec50bd74793cb66407463851f047e7cb5385700c5a9c93ad1f8952a260cf02204e1493f36f6639d71cd6a49e387a08bb2b2ca147f86a2349542a495124b70d7c012102603828fac74b1d20fe275c809708fea1149cd626bc9730503cba1c1a89a708b1ffffffffe9a28d13f468d59cd0fe7c7b78c2bb6a4759fcbe43d9edc3d17d6038003eff79230000006b483045022100a2020223d54e96155405807a96a3454d1e5a5de8dd405db8b358907fce59b22e022036e8e9d665249518de6ceb846cdb936e5e2efeb57a97188de22110807bdaf6c301210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff7ab36648965585e5ec754b470686eb170ea092780d356b7a89214a832549db7e290000006b4830450221008d2769dbeba6058431e2f33e9c638f41a8d299cec067a04ff8f8dd6f0876ff840220188ba549d0bd811616adb3c4c40bdb70eac6392b772978e9684f7281f5f32b9d01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff67bdf3cd11ee4a8e61efa969b981b3c618b6fab142dd05b09e6caa94a0c28c532d0000006a47304402201d3d0de5337315ded13a834f9f4e8066fc54cb63403889153f313c715e4689f5022023e8ec15e2a8de83712ad96424161aa29ae0767276b6655bce30ce23e38e40e70121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffffc159cd65b011d4cf2ffc79f3e3fc943a5ad9115df4e92bcb0522b671dc6043866d0000006a47304402200146230bbfe00d878f536b459cb8e57c8c0d6cfb2bd491488cea5d5092304c7b02200f96dbe2d2d8f3126c37f821819ea1a97fb601b3c6e2c464e837cbdf595f66ba01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff87d1e55378f29d14dd47a24c81a8258a86788baaa08a0fd544fe7b790ad102c64f0000006b483045022100ba44e22cf34fa57959d566768d0248584c5c1378b0a0af4cccebc02d456810f002207892a7cdc3e36df46e54836060f5a520f69e69bf8c3222e2eeac93d1a3861bd701210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff242416b1012ae5ca7636d47d63207469870d632988169f374e18976cf6f6a1bd230000006a473044022070dcf3adc646bd03e30a14e626ac17f510e944fda4f5e5c9e0dd0c581d4bf71802201f9aef7a020ed8dd84bc1a63983f83d238eb5043c9291d42dee0dcadc9d11936012102603828fac74b1d20fe275c809708fea1149cd626bc9730503cba1c1a89a708b1ffffffff66426c7c7fb90d29f06484666b5a465b868a8c3f52b97ed742197e8868b54fb00e0000006b4830450221008de968939b12a27b0e2bdd3a63f5cbdddbc5830a07d3bb5ba8defc46de7feaad02206ec267eee2be469e71344b2baab754ded1f1ef0daaf84edc5c8a5030d1f919f901210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffffe88111c315bed74fce737273d91606f060c61b92431bfc8a8f0b7cf155baefd60d0000006a473044022027a109d8cbd2e0a848f873d7f0dc5f173be8532c692045f7c87413eb7e9f5d7802206a849c69c125eef5addbf2146ec744aa225babf246932c4fadaadf8856661fa6012102603828fac74b1d20fe275c809708fea1149cd626bc9730503cba1c1a89a708b1ffffffffd7f3341d83991f185c8b78b3bf8c17ab059d40a1713159c68d23c5505c03d99c5f0000006b483045022100b1cf1c9838b2a713902c23eb5b311d6fe9f3877c19d068c44b5c935af136c137022041160dd34f70106d94a4f6747318ca27caf4e7add7f99b6217b48c483548d4df0121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffff498823c2b3a410477bb21b89321e75ff0d50f7e38182e0b700ec222be0d0e878210000006b48304502210097d594d3568a886c980f49f54f0f995d1a1ddf44f5d490d60629bce5dc578bd302206eedf972ce61050a7f1d135262458eea9dd97789b1fb7ea40f9710bef74c099f0121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffff47ad152299daa642d6ad7d2a27d5cd0a6852c40ff697dbce3bd05c4eeb45a7a6000000006a47304402206f4681ddf35bc456eb9d011003c43d7f75cef5a50c657bf4e9f4d27514ed54b10220110f2011b32b2c3b26d42440739a8b0bfbfe87ef7acc42105af30f7136ddaf0a012102f2fa0257a9aaf5e8abadef7cf97c594be3eb83f7887f600c8e54f5fd7fd6d59cffffffff7f7e9915928aa76699e4f9eb44b5cfca8d36c7c18795b97b31ca75946484d0893e0000006a473044022071c07b164e1f2dd68e311ae9b8fe2f9b2483814d3d81890655468ccfd6196dc202205848a2d2e1a962840dbbd8dadc3cacc049a5d12387b3d7416784ad0cb1ee1ab701210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffffe0301cc5c57bbda8fd46f83c9a6ee18ba6b31719eb8fe914418200d1cc9e9fbc4d0000006a473044022027c8ea5dbdb99c2dce9a32c3f3672a91697e3f29a96f8ab34bde041b2188577202207af891ad17d9a6e784b18abcc06ad99259d7f79b168204ac13cf34e52a4da6c801210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff9048016fb2cf0a6c41772a2e47cd4658b9d52fdd5dfa1d78c75910b49ca21e6b0f0000006a47304402204a28e284bad11e3ecec63534a53c603cf8a9b0314fcf784d4985dd17de9a7d9c02202ceb8c51dc3b7996b471cff62b6c85d1c50d2e83a53615cbaad994753868243301210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff03bd92bebf313e837dfe4a1c2c465834aa366bc53abe1f9399de04b74f9b96b0640000006a473044022070c4529cb51c49e404b55ad94630f009f4e7fb335769f888d522eb68108a24ec02207981c13c7f15a05894632517df6bd4d36d7ace7b960ff93ab52ca664430baeab01210249e54b03e4699a600907414c8e00dbfa49879fd0c65617a8fed1e1f35271be10ffffffff9be24d7f38edea4c976d4ce3b70547360566f0ff49fe96fd064cc36e63fae320000000006b483045022100cccb9e8e127b382ba937a4feee241fe705b05fedc178cb2c1a9c16cc4c54493d02204f8d3ade428765d22c6b2227537276bc8084ca012e5a1949325de1b39b9ff712012102b02d22a2776cf17220c774e135d4fa8ca218b60c2d42c1330bdb1e7cb4bc046affffffff2ab01bcf672d940b9a1d9dfb867cfb725cc94cff982fb8259b73760ca4de0b8a370000006a4730440220300a000dfcc60a875bfcae2ce4b1a1be72151b48af9552240d13f01284f9fc4f022027143a0482bd3b426dd4f46c6decc6172e7e4f205b020de4fa2ebce5353164600121036e5cc2697e9f356383979e33f3f12363be7357ba1bc0c47378321cd3c89771f3ffffffff0231f186000000000017a914b9068dd946c5df2b1171f0dd3f93d14a7ccf21e287a21a0200000000001976a91498df799c6b591e08405d8eab5d93a5c14988a8be88ac000000000200000000010101f9b0fd646c07f4ee6ecb1119db4b5bf5558df48bb11045b8155b3b87c0b4d600000000171600144feb8b40c21096a68f1cee6a6f20895329643e7bfeffffff02b96902000000000017a914bedca39372a67e50cee6a2573678841718f115ae87540c04000000000017a914c7e72d867623eaa7d59cc2f2b8d647ab7d8a2ef88702483045022100d072adc1fed51b65c1c6ba21250c0805ee37705234d3ad205f4de474c782b6010220658ad9d430fbd02f23809fc1b1b2613cb8cf16398df8910627b2f0941908f7cb012103306ee510136ad398da0bc6a9ddab0bbce252df58c364ece7c204e78f665c636847a00a00020000000001014c769f83da7de210df6d5f7b7e058d2ad622bde6d6a5f473b9a406901883de1e0100000017160014439a5885de04f1b4e73cf195029bf7182eba57eafeffffff02e6d749040000000017a9142bc17f7f62ed4b0b2cd754d81d080a45b8e802b387d4bb06000000000017a91484dcae8799ddb99d578b87d8c8dd15fce23fcc878702483045022100bba224e6106d763634511b666eb4d93e1189f441420e328ee86ad29020a9d78202203eb77772d46a1a97662ad059ba580107d0eb5242af5e1624ef82977bcc57380d012103308d506fecdca3e08d2b84637747066fb0df5b376ca5732ab0811494fd63199b47a00a0002000000000101c062692e1eb6659126e54f8b5d060a71b635f51a5e9903b9b040ff2896252f730000000017160014a23d3d61dacd55a47cabebc43bfc2f396703b954feffffff02540c04000000000017a9144c1d238704f7b48f1e8541bb48e9ad99e353ecc587857302000000000017a9141c62f54406f1cbb824fcfaa634eefcbce932768d8702483045022100ad27624e68f185d62389c6f6ab3d48245f66c228f23ef560c34fcfd29d95d89202206ca5cfd9a4e41e644d3d8e929ab9b62403989ee97d26b1152af7a9f6131926ed0121027e82f6e3c1e114f930aea3c4f0a3168dcdd9b49255a680e8f9daeff28b664eed47a00a0002000000000101b61d4e368f32cd6881a72ba0e216f60957828abac696680ad5884d23a60b03ba0000000017160014813d5247548e08d19577f625f00b2be9d077c6b5feffffff02a6f86d0000000000160014644efec808af942fde7aa97f5f15c7cca934509968dbdb03000000001600144d4a6df2bd7f709085137afb3f692a9e051c900c0247304402200ae15db9ec31980a2d1861b384004374686bc37e2ba9a400505a3aa8117ff81902206ec52f0900c6248a3689e507a89dea084f4ed72a958cb31f1e9d284f4ec77b4b0121025db9c567b22f22b915a8e38527b303671c82a402be635144d4657d9f2c0cbc1147a00a00020000000001029e25908819d3fd35d907610d8a48d4f5b29619858d9a69f2ad5801bc25b63d9600000000171600143591906a8be74151f17a3cc46aecbaaa13e1f128fefffffff545cca1c19cd59e2f851caa540f1caf8d8d4de68e0c8cbdcaaadb9aff0bb0c6010000001716001463874f40645f818a376c4f5b8666706716b04618feffffff02fc3b04000000000017a914109b677a13c6cb694f9480b1e9bd947a96b58ca4873c9b00000000000017a914394fe6b4928aaac608a5190dcd5609ea703cd2f8870247304402205a9e570538efd7de6047be509c21287c65024ff173ba2923156d1e0d6d3f6ce50220114ff9ad07c07abd1a12900eb7be7dcb7372a7130072ef2a636d5a8b098503fa0121020f04342ce2d7e13cd1d1baf7a1797aaa3ef96c6786c60134c16886ffe42248c302483045022100817665206074cf36f17ac580f26d2921253df4fd303750eca665ac6d07dfb94002200f8407b3a8de0580fc691d07b4b17eb12ecc3ee09b6b635ae95ebcc37e5ec37601210204a91b1e82d4b70a3563da42957d0a1c38d3b7192b5dc5dc9007fdd48721f23348a00a0002000000000101a58c31329c1257c3b90f69add69db3e192779e6a087d6adeb8c582b24f6ded360000000000feffffff0278fb68000000000017a9145d05b69590ae75a7a38de56b7bab370820985f6c87d4f904000000000017a914f4b851d18052a25b240a3c385bf50e024f4628308702473044022036efa57a6c72676bdb8941525a1dc2fde92e2a9503287416c5db84980f80e8d7022051feccdd6d338f93a679ace3649567b4eb5c8269de4ed98b52ab522d596e1a1801210276f025ea76f6c446e51ac7e1a68390b911e31f3e07f7437c2d9bfbb18a3cbdfb48a00a0002000000000101f1172aec212a64457431a3913edb01653737cac9f201944a789ac803d676cd9d000000001716001453f2a0aa1f417a140e491af9d744022919e3bd08feffffff022c7c43000000000017a914bf1a1ed0045d9c78f376cd1a62d7b4f66c14662d87687b25000000000017a914efd600ec58e0283d418cb64e97999f57b0befc27870248304502210094eb8e7bc92851ad78455618f51d5e4b34124965a0a4d826fd8cc725dccce98802206e5938d568cea0b30f8c92fe4faabbd3a854ae84a6cf5b331ee23a6511b9270001210340f02518a50608339e4312d2e3ffee2eb3eb8b3265ed218f93ef033c9377dd9148a00a00020000000001015b7daf2bf15f5e35895a68ecbeb734913f6d121302c41e2eab657cc279ee77390100000017160014ac52f06b866f6ebb4d1f580731a3e7c0306679c8feffffff02b0bb1e000000000017a9141866d713eb2468bdaf6038de7c4b8e7aff2a2c1187d4bb06000000000017a914fd5d07dc9c84b8c1cb009a0283ee55000125fd878702473044022014aeebc22c3c9c32de9a22baf3fd5b0c9c5eb717690c3cc884bf31760e066a9602202360271b96f3361b61f173dadda6479fffb64d9f6f19dc427bf65256f49a9b02012102c4f6ef6b9742d85c6c7ba5f70d8911ca7a41f0e1fbe91c634d7a60741e4d79dd48a00a000200000000010122395cc17580f42932cc24034698b9c276c0020d6cebbd9e8aa675253831f4fa000000001716001476ae47bebe7b8b5a57a48018e6f05ac2cdd73e62feffffff023c3e19000000000017a914b1f202136622876e734b7151741d5837772a9d1087907905000000000017a9142037653efc474c77cca771a2234ce13757d18a3b8702483045022100ee458784b4a70d67d710e6218a5b2331b5db372d1623665b9aeaccff26290eb502205637bcd274084d3dc66469e16d214fd4ae3585a8fc4fd213258a12785d7490340121022a0b889bf806c9ea65213acdb955053a5c945e09ef7a1d1d1d476c4677b3540148a00a000200000000010158131014f23598b8d0308cb1a4fb3ee4c13463b18b20d1737abcf153c8fbf31700000000171600142cd3eb10b5483a7ab6f94f4cf0b874a6b39fa9affeffffff0260d112000000000016001419b32e42a25326b878f9ea4f009ca38143a3d66d0469060000000000160014ea20ec8f1f82293a3f3dc36721aa9fb39e5be14202483045022100f4704151f8d26e1ca1218ddd2d9cc485b1b45c1671fa7913c04f35d7454f3cf40220189a08df2d8a39b781126acffb3f5a1233b830de4f422fcba0108e13909a2b55012103ac8f4f20860c6fedae0a05ebec1ac9016892cc909e3cb11561cb536bc567f9fa48a00a000200000000010235f77066366f8183ebb64537aab2a5817f56c3a9f61b858f13b71050848d33590100000017160014b64c3b4a59e42d23ba2817d5305f15f70fc32685feffffff8a75f052fff668aee13d99191384cc41c7faa77dfb0502034fc3edec75ab7ae80000000000feffffff02280b04000000000017a91496ccbadafab0cae95fc580b0e99d03208e7028b487c75b0f000000000017a914497c9298bea3f959524c0682671061c4954afb218702473044022030257b1f84ea001ba8c71dfa449037b8aebd7322f76a7bb7ec06b3a9aeb2ea2a0220511554d4160cb0e55e05b1ab4b6c5efc38cdfd758218649cb4467f26bf2ddef901210379ae0d573dcca0f6c22e3c519b7b46114b549d4091d92696e9285a4039876a5c02483045022100969108ce6a889dfa25241954cd849be6640c574752b4beab809bc24dbff0292902202f506e8f094a0e367401334fd67ed325887023ac3eb77479db983fcbf94c74800121023739b4579e4c4a9570bac8014f5ddbd35a78d4eb8110af7821288acddc42a8a049a00a0001000000000103ba5c7aecc19c8846740ffa120889c25089258bb2f54cc65f4104d478913d07cf0100000000000000009e10dd3f6dce979f5d9eacaefe49ab82421ff41e151ae63add97be41de1025c1010000000000000000854ba31e7dfa07d76c7d67d7c7416faced8c8ab63a225a05dda626819b3c58fc01000000000000000001066d03000000000017a9147de660ec80c5de8de18e319c848db1c4ec161ed58702473044022015c3ddef0e4de59ecfc5d8189af989513770c2e657a3602defb5516b6ec0d7a202201ffa22bf85a1630756d4993dcd256355927fe91f443b9bf77bf9c56515a5718b01210340a96b55c0c15a2f655913727d798035b64848ac88a7aa89cbfa245fa6c816a102483045022100b34a66a7474733a749fb58204c62dead8b2e71bc873db6844967d0399a5b037a0220032aa13dda0026a75f63d20d037e622e1f130b119966b7342bdc81e9abe42bef01210340a96b55c0c15a2f655913727d798035b64848ac88a7aa89cbfa245fa6c816a10247304402206ecef031084bb76105d1f66f5c41574878e3c251931d66481b21b30f5217bdd002205a01c55396a77f900f8530d95aa5ae01a6461cc4d815a462eed6f80cd3c9a1eb01210340a96b55c0c15a2f655913727d798035b64848ac88a7aa89cbfa245fa6c816a1000000000100000000010365254065710a7124683a6b5e9f9c454c6681926562fdf99cfea4990f911cffd40100000000fcfffffffc85e83108872d2cc5af22e2eb39c2542076e19667b2204ab9803186a9bd328f0100000000fdffffff807d552a6f27a619c5d40eea4b5e217fb99ecb2bafdebeb8c04eb0b8fcfc6cf40100000000feffffff01efc90100000000001976a9147ed1f5eecd0779ae88020968ff13b559c508447488ac0247304402203e79794a3aaf34ef85a8cbf9dd88a52bc4895ea56c5c16dd98ffd78c796a1f7e022038cdf6f457104043050a83e6127df91c22d3d4154a69eda03b2533d1cfd32f3e0121031e5f479a07cca0aa7728cd01dc62118175416feae701f574911e095c1c3a1a080247304402205b4a2e3f3c739a7215bad7818c1681be2e7d1bf28b7dceb7e6d1e524f8c3fa0e0220502ccb0fa4a4a4ed80cb46e43115889a44737f70137eb40b2f73165d257edac00121031e5f479a07cca0aa7728cd01dc62118175416feae701f574911e095c1c3a1a080247304402206eee501d3fcfe16a3f12b47172da8c4be1e166f5042b55fcf67f9d6afe5e07fe02200c12379d5f697d7645ef395a07f4e8d8bced3c3444d45c77c50587fe2d739e300121031e5f479a07cca0aa7728cd01dc62118175416feae701f574911e095c1c3a1a080000000001000000000103bfb1174e65c06317c83340feb401cd576910d51b839ac8ba82f669cff5877de8000000000000000000b0e9c7e4b6e3e166ba9b3b8f88ed998da5d0b827b0b6c0f62c05218719ce7ff12a0000000000000000b50a3ce222033fc652438008967b4905fe08085254483b1dd02ae5aae8f794d028000000000000000001c5e00500000000001976a9144c61ca999b88defcd1a2f92b7949680246bb979788ac0247304402206ec1a053092075b1aec22de685b1b07687f768ef2bb68198499801ec440e4fb702205c0013238986f8e5c07ee6f54dca14a1200429270fa33f5142dde4d73387c0e2012102a2f55c1f9e8a0109712674a7f7956eb454c02e014c12acc5939695d365a40c950247304402203b367cf9c5c6f3f11789e6c1ac1d437308e2779419f32b7a3d832801c4df01bd02200b946d8788e5bf483d49a4666a46ce56600e58882931af86527009870c149dfe012102a2f55c1f9e8a0109712674a7f7956eb454c02e014c12acc5939695d365a40c9502473044022045a91ac5eb8a02ca27cbd90439af88bdd669030bb887e5435d1337444d34d9b10220723ed75e5692cad09f4ead8fabba7de069c428bbafd0db834c73c7d22fddd267012102a2f55c1f9e8a0109712674a7f7956eb454c02e014c12acc5939695d365a40c950000000001000000000103d86aa443a95d16fcea70af18747d25bb938eae2f6295227efac3d38de29d9c240100000000fcffffff85076b3f82841b17f4205e65829464b59431bd89a7c9bf02986cdc62dd78edc90000000000fdffffffa8b8a392f03da8a2123046a61d4beaa5648e576f069fc464826133f79308f7f00300000000feffffff01eab00600000000001976a914daf04d2b1748910ca680a13fd01d7caa9cd7054e88ac0247304402201833e1197522fb10062c449e503fa71ac05a36417afac32eb076925784544fbb022072ce66d48ab2a22e97adc92a1d3b56049879bb3eceb838f666c198970bc3c3a601210243098313ccd721207dc9669292e64c16c1b75bcf57415a07a1f26ddf34f6b1da02473044022064a23af546707e1e23c7746177be4512453239fe6cbdc8a570d213d5e23fc8cf02201449f4b916ac3040dd7ab22e980c5c0bc4b0805ca61a325ae223bf80ada84ebf01210243098313ccd721207dc9669292e64c16c1b75bcf57415a07a1f26ddf34f6b1da02483045022100eef23f2628cb36355359e8f633a1d1d7e8a56333a7cabc1066f46b202f17be4e02205b455d2eb8ad8e54f9201356ffa53df041b79cbb10f895fa497910e0298c234401210243098313ccd721207dc9669292e64c16c1b75bcf57415a07a1f26ddf34f6b1da0000000001000000000103c10d7517fd24ab36c60eae04a73100eea364caed27ac9fc5ba641d031a01ab7401000000000000000004dfc24ff0501da6bd318578071965a7b42560d3e82966e2559115d5ddf0e3462d0000000000000000ae14e752503bb82d7a838843436c650679ae6ea9f67ab8dc85b2c6833d04785926000000000000000001f2b90d00000000001976a914fdee7a2f38f477dfecd7e299815ed0675650a1ea88ac02473044022013f532eb882d2240c05cdd7d2c85f97bf4d441b75875002e89cce4729b3db91002207a5f46306b947cf04958161644dc153de404fe8b6adb289c0bda94b9a0c0016f0121036b6b7521e0feb0777258ce48f85543faf58b5a7215480edda50dd5c808a541bf0247304402206c6a2b74660b4f5d0eafdea106eb2abb83705ee0977f0853d7d25dce6bd28ae902207ef21f2dae6a42823be0828b09af5cfb8c4f5c877817b08b702abf5b51de19ba0121036b6b7521e0feb0777258ce48f85543faf58b5a7215480edda50dd5c808a541bf0247304402202bc92da39b7f68843b66153c43b22a36de4bd112188bc002fa52f65d978f574602203a0ad3858e7b1817a32141a14b7e2e11cefd90ce68f445bd9785822284a8a4420121036b6b7521e0feb0777258ce48f85543faf58b5a7215480edda50dd5c808a541bf0000000001000000000103cf9b41116b4b5c02caff4dd7b8d285140dfcc111129de15f8e0bf6835842495595010000000000000069d013aa694d332dadf575813a9271fd597af49692f8202e0088ca340a1bf3308f0100000000000000604219401b901d547b33066190d6ea95593b261160991f864434e3d764bebad09d010000000000000001c60d0100000000001976a9140c13a270e219b895f24ac02bf384103b0d933fe788ac0248304502210099c1e41b9a4af370d9a5463897ee9cd80ef1d3a6c294e0ddf830f062acd911000220103c06cb11d59086a1512eb684efc689e775c0d512afacd2e42de359db5e63540121026a65225a80aedf47e959735b123b7b2ea60f8ac6830e7adef0ad177f98128d390247304402203dd14bc2b0ecb9314f2f90d624ccf7030c4ec64f76e2c4cb853d6216533d92fd022056a8db7bf1cee758f2b66cb671d07626406fb84cd6893774dad6ee6fe09f87cf0121026a65225a80aedf47e959735b123b7b2ea60f8ac6830e7adef0ad177f98128d3902473044022019873b79ba47ffc5710a716cc84e241f219fdf79c5bfb41757fcad013b61865f02201238412fab13a2f9aad5443a720353fc956caf45366caa58a63b19f877cfba560121026a65225a80aedf47e959735b123b7b2ea60f8ac6830e7adef0ad177f98128d390000000002000000000101693bc41061d2c8db65d27a88e15190cb3485a28797d55829183c734d97bc4c4100000000171600149278c214f2562cd021c66c36a1ccd9d4486d8cfcffffffff023b1f2b020000000017a914a36aaac5de44f9705babf5c5e80021cafaab4b9987dd6368010000000017a91407e330ac727c58b98fa74fe99d60c4b7f9a5eea387024730440220174ad0cfbfbd42674197ba21f22fab761427f0ba4caff2ef0f4f0b89c9b21d6b02202a5666a197335c53f869c0b323a5b7c91e2c5b71197221c772fe8b65dbc3f4350121020ced24a030df15c4be192b1b5ed1f62ca49d487127e038d63b0963744e8ac0510000000001000000000105952de7700284f10f231ea3b5467b1b3ee74774febfb1fda440f946e1e5f0b2130100000017160014a66e03ba1125c0ebbb81d87f9241de5a895f5763ffffffff700f39a45e1cc7665c59686b1307ac7593a1fac6a72ebcaaa675883e9adef61a0000000017160014e755a87d9e8dcbae720328a32e797d2329954120ffffffffb17f9a312ae79681eaf1e89e76c8cbb4378aa2e995e9731375f4fa4c9ac85a1c01000000171600146c59db3631a3093c6254cddf6d65cd1ee5d0ffc0ffffffff1f72cd695556823d80fd225bd5e5b291887b668a66a30aa67fee0d69c33bb84100000000171600143e1229c381acb39160590f0c2f61abb134b9dbc5ffffffff9d9bed33670b234657dfcead6d3bd180d10bd1afa4efa56c21de6149b2d28a86010000001716001443f573cfbc9ed0861d2ada5e9deef0bee146c564ffffffff01889e3100000000001976a9146b3972a37e4c2a44da4ab1843b089201a7634bf088ac0247304402205c7a876ac3e8f81bfc547e21cc2e81a22a0226fe30ba785c0bab1368a6b6d369022056d6909a0fd3056901cb95b6fcb9cce301dad41928f7eefdcb4197610de6641f01210398a6222703cdace0fe195d61ba1853fa1cb5c917b8830fc5744c5ebc812593cb02483045022100f8b746cc459fefc6e5191d98dab814bfe1c991a09f2f71c188cbecbfbe4d9c7d02207f41ae801aa7db144c2637585f74e1d8a5dacd1595c166fb469df0379167f5810121036b8e5e7aae8cc81fc8a7331b479b0b7f66587ff4114de097d8e6049f3d7c9ad402483045022100fb15320b371c457bbebb4bc052184e13a31fed2724ea089d00f63b0ff5089752022076e2eddb8f0620a7a7b005e5f685cef6528f54a7272e77a0819d8b3eec3eebc10121027fd3038ba3f33a0fd4f488b1c4fa524584be2d088b61e4b93f82dadbed38d9a602483045022100816ca95ede83897831edc43b3e67b6d9f9155c0b2119b80fc93578271fea550702202e533d365b624888148d19245a34a347cb4e98c1af2fdb074ece7744c9e71e8d012102265d7461c85a3f834fee8f31098e32d601c528d3605a506bdecfda2f0eb0b8250247304402203eb3db447ea7cd04b20ecbc4b2351657e5246132a0805242ae8c2d2918e93b38022023c91af841451e795e5099743cb0f7ef289ae7fb729bf4422a3859f2e820a9020121031996bab23b11afb10ab5bc449ed36b896e497aeb64cb85c310255db9c242974c000000000100000000010191776fc1f5fba2e3499ac3bb032d93dda7fb4abaac350f22ec80cdb6caaf2d5d010000001716001477e20f9143a13835470a71b093762c8189ec6f1cf0ffffff05178010000000000017a9141aeedac9271b2c2623bf76ae341ecb8162e5826687dc37820000000000160014de2e852624ca25ad27774aa78c2b890643bd9d5af32d8e0000000000160014f9d8a4721a63ea5913c22171b0d6f6651620c33e9c497d000000000016001457eca7eb1a71ad875152fbb82c42098ceb140f7a5fdae401000000001600144c95a6faf7b6befb7fcbeda658085148016b103602483045022100b13c80e7d98cf35d4fbed71b976d8a9430858e6019045ed91a13378af231e0fa02207a65020b9cdcb289344081d1be4c9aaca56914e0f3d67aaf1be55fdc300a0f87012102d9792563fdb4b183aef750b6afc9cbd2fb527340006d80192fbf7fe873103faa000000000100000000010177fbd0e5d146922beed8ec5ba6b0ed7d5eeddb075b9696ab133bcc48a5cc47cf0200000000f0ffffff02a13674000000000017a91457240f848f6a9ca8ef73728a85bfb1adff3832df87fcf3190000000000160014709eadb4ab309a2993d6db178b1af148518bc11702483045022100b73840b205be2401b5cc80109e0edd6fca5af9df35f97b0f955877aa862650fd022012443b2d0a3d8905d809065a5e065f0f9bda5e1a2e3619c139d31c2d1519820b012103f86795d52bcbd3a08097688f6363810ee1b25b6da14b08b3bb47697c151b775b00000000020000000001056834eb79247866a74770ad15bdcf686e1914171ed2dfabd1c2d99dc05347c9bc00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff20be6585848116ef921e1f5bab834e6f6b96f8e0630b825991445d5bd966a8ad00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff15e1db03c685f4ecc332fa255805c82f5d7904b32f51e216ebd588980c469b4d00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff3b0f842e99f4e4c08613a7ad3937b37e05c3e1b15326a0a2a33b0c6a156b7ccb00000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffffd13699107149bfc3e54e75dc309a194599a0a772370567c6cefb1687d9add21400000000232200206d296ce6a58d38a9d9ddf454c44ef8687546cd218db1fc39109c0bf452eed363fdffffff02ab5f50010000000017a914354a1977e05c2c0d16b6046198ed7a0f78321ede870c7d2b000000000017a9143bae1dbeb51414bb27ef745389ccb79cacc5e2b28703473044022024a39fd93cc6f53001c2c5e78c398847a94547e259560121d355d8c36e5fae1a022025e6c3616b68e7cdf4e86d7c51cd41a25977aec60c85f1a65ada28979910cd4a0147304402200a9ab7645c505256b91924670feaaf3c0f82dc1e4b0d7fe37a1aa0564120bab4022069aa573b8e41e9c3fe06b79b8891b6aa47d9f523367cc6438f62ab9102965490014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b26803463043021f551b7ac605057991c9040c8e21eaf44ad8131dab90c6fa18cf0d6749c989b8022077aceab4246692440b5f9e726806b61cd88ff6b8c9995b2e3ccb511bd106f83e0147304402207153fd49745aab075b07d1aedd575f79d8726186cf5d02973be1f05347c7f1dd0220560409ee54fa7e313a5dafa8819df6a3c248c641b5e876dce8fb70f9e379f6fe014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b2680347304402204c39dc9ad4dae49340968513e29fceb85433bf60ff80579df6d706e3cd15c7ee02207c98bed0ecbb4e90890f86197144e94f14606c6d6fbc571c852604e62260262f0147304402206c96a8e1e25ea77ef93174f905eca0676de808b3e2584c4fa438e543f3aaddc602203cdcdb344793fee7be33644848c8c44a30d54fcb28a5b6eec09ac6f9d5459e34014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b2680347304402202147f5b8ca925efeaf591b3ed7961ed2c00f4ce4198cf17e280df25a8780167f02203103eb2801c53ff2806987e7700d1eee17b01021f9e38786722e11a040170a8a0147304402205fa5f855c590c19145dc27ab88735051af66191b55b380c079ee822f1b70107702203d20c3b84f51f12e0c853f34d15e402a892664441a402e9dc21ab6a393a7af5a014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b2680347304402207ef569367236a30262da471b95742c889c6ff25f62e957b10cc0f0d428316433022077e0a711ea9bd75030455419291811c2efe69306b66d73b4df5000ad1ee3d90701473044022023e52f926d8a4f5c9e30243241c4b9d0715f67f39d7d00c219933a918b0d1ef202202126d4142c1662b58ff063d42a459b23f8e953ba07a805849a9b8cb23538ad49014e2103401773c00e211274c6343aab2004914f5adced2127d51ba384f9cce96291b871ad2102841aaeede7b9566d7284b6a6483f32cc0044462ef7ff09e14cdc77635120166fac73640380ca00b268e49f0a00020000000001074039b775199241cb5a466311695d74514371b0fe3b1d8a1131d027724e920844110000001716001463e1b6db961279fde15f97140481368612cb98fffdffffffc970b27d9316c61ec1d4f1b7a77789f80b63d23bf84ac7e696bf82abdf13e24a000000001716001475c5086b1e2963cfdb34306d44ffdb58eda441d3fdffffffe6b67205b5a1e2d675e872b6aba753f0954cae721eebdf589a0da5c5c7c43c4c03000000171600140025b3761d2306d262fdccff6baabb3b029b35fcfdffffff811667966a22e75bbea9047d047e1e5fddcc6527306fd5852853f70712a57b301a000000171600144ec307e5e3bbf6b03d60d42a03c6dfb1ce1858c2fdffffffb4299453bb8a165915aff3d09efa4a3f2d5f7d916bf460089e7440f21e442ce701000000171600141a4fb31ec32129bba0a6fd9bf00b284540b6f6dcfdffffffd6a5a6382c9a39a31eb3e111ca964667fd608b4140f09852911779117f57df484600000017160014aff962914fc79f728c8a1e4d727fef89b932fe2bfdffffff1d255d9f69ea8d17689992297d32eb0c46eb79a0ef610e4101e72e99452bb29630000000171600141be30c874127230cd178136a49c97bff927d7109fdffffff017741aa000000000017a91471a13bf2bd6fc4951bff1b08c562e2e0829698b08702473044022023326a32a9541617303f6c3563e355ba6063016e2143b87ea28df06c5a7fcf26022036c64307d3538f11af9975a1f652e7170b43bcd471546dec5f6412833bfa6068012102f8a44c19dec941a3fcbf390ae67a4a8986f1245160a2bae40aa99f8c017a464f02473044022072cde8af5ab3a3a235b889ee9696e99de8ab36411b0ed2ca2a02f5fefc116a57022057708b5d3d44744e8563bb4d3bdb52736cd5e533b7a199dcac57f9f9e4db35b8012102492e6069e9c363328b7efc3cc3145d3085808106047783df00d6f079abf2f7f70247304402203e2292414c29329d45316ce1904f1d80a743979d3c39d9ef3980989b9f80ff0202202d2a6381d2535d9d36220ea4b18088d5e8b00b318d062dd844d90a093aeb37f80121021c1fbee854063fe739cafcacf6e2b0eaecb916e44241eaa75892664125bbdffb024730440220228687a51fb7301abcf48ee1bf05b7f39f26e4fd28e55d0bca4c3fdc37ab811b022025c62f1bb10e6837c6f5cf19b230aa17e6ae0b17464eba441f533f44bdfa86400121029c722935bbfd11bfbb4554d476c7acce5c1cf045cc8af33350fd04d646ecf7210247304402204e0783d090eacf2429346500d63b9b06870adf9793e068b95694a840154a17fa02205cb98f30f164f6b49c9bd2a8533f5f2bdb380e6c26def71ae6ad4b2bfcdb7b9a0121037947417ee0dd0afe504769c064d2f2af9ca571cc924e44d92c77ef239aeaaf3002473044022070c4f2d13c8288e43b44d3db733547cc1a6341b5c58dcca03a4a54320d5f008002204e51569cb0693a96393a4e09bf7a5bacb1c98674d68fdd63813d7c49bafe071401210350beb553a6e8a4a9223f633e05c171c7b3781269ed74539e62f2dc369249aa9e0247304402207ace6a2084e99a3872312143c60fec4cd6142b64679283e389d697f750b054da022048f3885ee5baaf4a729432a007b4fd17870bbf346cc9762e40d6129ecda05a2a012102cabd1c83b5635cc621d6fd2782ec63fa74a67331f17e930d0bdef5ad07126f2747a00a00010000000001029924ae8c0a6b8493bf25b594333c5ce3504c8cd091a095b7f1d760552ffd889f01000000171600141250dc405d813f0028bb5b2bc094110c26707426ffffffffb3fc57a3cc3ecb3cd49349a0d13ab9e235a55f4341a886c60faeac6faaa85ce9000000001716001460350222802010febe0bae3175a0b03ea4c208bdffffffff02a22204000000000017a9141a68126b69ffca952a64040f0bd4e05ff5fafd9487110001000000000017a91492a57605bd300cbc3e91184ce07486bd078cc9f3870247304402207654efaa8be6e44c91e589f42e2e134be6b660d93aa6716f0c5459057128d944022021c7970bcb289bb18d051c4a9d79911f0e06afa5f36ed5fcf775871b1e3714320121026244f9128de82b1d79aeb4df4c573876075e6b813fcc61057b57a460ae2fa2d902473044022018e5b63ff78ba871dca97b40110b0359bb6a740b8bd67892dd6f5635a476a8de0220754f922369a07bf8ba39da6be9519cec214b122578f3a171718ddd8127bfdfca0121029f3a522fddda494d4e519c434e9741613af3a247439ac6eac6ee2ed6d2c69db700000000010000000001015b7147689e63c8a99442078d4ffb0cdb45bc9721b6ec8277bb89d1f8fc566fed0000000023220020a6d1503dc935fa1ac644bc73c1c46efc7cdb0f1c849622cf87aff5d11ef93b9cffffffff02801d2c040000000017a9146e2ce39a41b8b273298a4910c93cd191b215d58687d4605e6d0000000017a9146fe4b1bb042ade2a0c48cd725cd25971fdcc7fbb87040048304502210080ae988cbeee74b0fce37343549e977ad7754d803666e0de3b2061a1151ceca70220278b02cbff1fb120bdc7f454f750ca2fe2d28a5a2b353ef61d7e84f7d710ff1001473044022052f05dc0a955d12f1e35c276803be4be31f292529618b2b3a9e047cb2d9e180d022003cf54be33e23884adf2b5aa1bf38a9b78acc2b3750ecc7c3ce91adbdb7394780169522102970a8b4d7978fcf470f4b210cb58c2d5666be805055ec94f83c7be09abd634962102e18bcc685c387deeb1f3b9901b81ea4bb50834fda7cab797de2cbb829c02cc4a2102f4d6bf9b8ed5a3d4c1fdeeed85fb59d5be8184f97ae1fa8c4123c6385829c61b53ae47a00a000100000000010239a4a7e00ae797032715d6a590081cd2f754946c280b13265c77910a949fb394000000001716001457565b6ad218e362b83e4c5977261161d5a2c22b00000000be455a52df8ef230e180219e6abfa6f6687f2b960b690ee209c217bfa46de43b0000000017160014c6bfda47cea6ec90ee019ec27fc30bc6bec78823000000000240420f000000000017a914825d6d20bc269bd6cddc6ed535c291771cd61c99873c2631000000000017a9142b9b4b1fb3aa11febafda6020f1991abd83585628702483045022100d0a0d509ec71aa477a2f73160d9dbfacc7aabb5b10c71cd7dd0cd1dd3fa8401c02204dcc3a7f5c49b02f91b42b6246865fc76986d69b14ce77343a595454f5860813012102fc59760d135f0fa8cf351576eea0b6e9bf9940c83c036c080b9d6cfccdd0d80402473044022031a4d4bca868ed95f96022612a2a400dc1dffa91f11438c2a6629333f317ae76022028132ca05456d3edd179a739ee49684f190d248ea9a4283432d0c1997609fb70012103e9a19931e9c05682bbe55e0445ba7f4d794ed0749eded8b8333264a903ec88e20000000001000000037e661ac9efd3ed9a040be6f6d5e6691f3ffdf8f5d1824e7ba911b19b11a13ee1000000006b483045022100f3563d37f86332ce2d700eb69b80747d9e01118230c452d154eef4ac8166633d02201e0b11e7e33ca197bed7152f4c6ef1b70fdbded2eab77cf4543f61481dfc6b69012103c621e92ffdd48954fbdfbe4c5b06b8995bd24d517c3693f98366492ca5c69a12ffffffffde83acc650ae80ca955f43542663ce44908cd0e98d25b0d0b34dec93e8af69820b0000006a47304402200c18f3b046348b386656dcbdbf9361d90e7aa904d14e941bb52095b62853fa63022050d13cc8363dd42af0ea276ed95915ff83d041f250932d0c4692559d08d4f0ec012102715a988c1fb046fa1d9db74e421fd52529ad0eb8be4bfc9e8098d8101c669b74ffffffff9108b9ed7a8ef05e698f49380fb776e19d8ad7af0e4a08d5943c7a99ed14618e000000006a4730440220030b39fe365d7e5a71411425c43e84a96be635f202faf438b9f3227151bb400c022002fe9e9f32b69f67b294d9ece0bcd5f0bbe4c76df1a64b5508e12c744934c5b3012103d1c524e2e2901cfcefc8253638d60c4c14be64adbdf2becd1ec7cd7d512a192dffffffff02d45e09000000000017a91440ff45620d102c3e4f7a92eff52aed52e7fddbcc87abcf0000000000001976a914bd35566953081d8c80673da858f6915ba44fcd3588ac000000000100000003a6e3e5314678dba5e9afc27d934ff63e2f983d041b69185703a004942b36831c010000006a47304402206e332838c90baa757712efcf97f44edee374aafdb16eb16635cf15583079ae79022034e2adb0e870c4b4d7b7de6b4dd4cc000b7969db8bf8ed84c703e5d5c6ba845d012103e4fed1d6e91c2179227d14d9ae7b6ae22b9f82b03b5b8d7324e8e2752aa3723effffffff5d9bbf3d6b87ea30af6c52cdcbc22d5141112ada9ff5bb47f242be88d256c780000000006b483045022100ab64579ecada09d6a2d672f12e6804ce9ebb886467508f1e4ee992b1cf1fb4d9022013f7ec995ad479ace7df4952f1884954bfa4038bc9a33bc377b191a982c69c7e012102b31bd4b4f70c2bb34c5b2fbe60e84a4ca2da75e5fc24dc77eba01f00ba5b0db0ffffffff7efd964a4ce101b58615304bcff559ecd25aa0e81428cfa3657179ec2a138738010000006a473044022062c4e49ba5e6987905108cfe7cbd0ee5a3864bfdc2336b2bf337425afd01ba4502200d1a1730751753cb6fe97fa7b96b5bb5c347b9c3e0134dcff4bc83786519c5b70121020927418af0a38f04ea0979ee95ede5891262ba2170a864201c2fa72578d36504ffffffff025c5b02000000000017a914af3fbe272d7de24beed7a77f7ba79ff93511d71c873d4e0000000000001976a914a63e0f363f4fba36a126ff543b72c6e309aa14a288ac000000000100000001a8693314969cd8f5b8d2e34422385c8d6036eb1aa0b5979023c36e618b7e0436000000009100473044022070c62d2592604bbf77882d4e5eb369c3322c174d2f80434a4a64cbb88cbff88c022041da40f4b6c0b632a8ca9b8693b3ff0c60032d07f306dd5cf79bea74ca5661d101475121038a17c200a7964712d733120c07235996d56619add4afea0451761764f069a9de2103dedfb5e867ff0f2862b0a6940e113865a2971892556a54336b4917458bae6bd752aeffffffff02d0f011000000000017a91430dd5e6290e00d1a42545195f3b5a223a9dec5ea8720a10700000000001976a914aef396e5de9064bc80bbb3d23c5379735947588588ac00000000020000000001027fefc2131a07afcb6466b60b53ee2028d0a95d6febae962fa2431c8e63dbd0f201000000232200207fe7f4f6b321ba98085315822bdc7cd322450ae711a9074de0773858119daaccfdffffff02459f9b7bcbd9266b0fdff5ec8ddc4fa9edcdc9c302240692d0bf1f95917a543b0000002322002001470b990ecd4e330e5b998d8d7f5715ba11995cd856752adcafefab6a603528fdffffff0238e91800000000001600141d3002b18d4ff82344a8346d1f2a12f0936481193ba31c000000000017a914f2f8eb4556334206ab915eaf37f89452143a57f4870347304402202bd9290e6ee2174bb830304f1c01ab30d031092c2c37ecf41e01ac0684debda002200f1f9e27a5a23b6b7f96336ab27ee4bda12eeea18fb6e5c94b9c2c69310feb9501473044022058507fc4ffdb4cb7469543d2e4eeefef8fe0ca9e08a2e14c72cb7917c8bbab9b0220709be173e908d4a384f366280d5920f28b9188cf993eef1dd03f1df24fa9e3ea014e2102e77ea141342148dd70f58af45d7a4b5b9b5a696385d7c29f1d3ddc809d7b54f7ad21039b520255ac47cec5d93820115f1cf7941b1ecf0c439e08b146b81e450bfc583fac73640380ca00b2680347304402205f2893d6e369f6326848a827051acaf1f5d4d683e86ad35804d8d962b40d9a9802202c34cae96ab5e1e630117fc2e5d068e33abbcd810a6abedf09a3305ea744a33f0147304402203866dead15948cac03cc3a8f13679f316e023c54add0795a049901ca579db8fe02206a5f97928bd2208def65b0bc10c114ce53a7ffbdd457891f893ac45bf0727b2b014e21023982ae35b18f415a490ac825fc6db01909d90cf08d0da86627ac39d8798dfe87ad2102d0794f82ee51478e419224fac54ef395303cd8072b5eb40b3e2f4d9aad0476d0ac73640380ca00b26848a00a0002000000000101b11e50e542521dbd5caf45cf45b0aa529d39adbc9efea2bd789d6167f7dd007301000000232200207c047e3469313f1e73bf1f6fe0c0e8e31ec6d776e01163d671073f5fdfb2016afdffffff0228cc02000000000017a914fe77fb7ce6fb2bb16be0cedcd6e6ac8d417252c28733d219000000000017a9145ee17b8a5961a241c3ba23d0171f8b83efdccb7a87034730440220333571b6916f84643e27414b6a52b47fce9298d80b1daab42e13aa324d4d537502207b10812761815de3a3af4fbf3ff330981d7484c5a96604596828f19743e52bc801473044022034c2f92b90c110a6f64d12de1c470a9640c72e6aaabaebf7994e10f8fd85f7f8022036f47510be2284454392a6820f1c600ad6a8f9fa184f72e896a3078569016005014e21031f355a0142b1944d76140082b072d94045e679d2f08b75437c26e86ec85a40c9ad2102505f75f57be6f706491daf2d7ec22dff37a9de21806105ffd6dafcfed2f435f1ac73640380ca00b26848a00a00010000000001033672654d6d5be703b0db71ad4870ed01a50d606a1362280a4632ae5ece1f94d70100000000fdfffffffa29be180386bd9786ab514c48c182cd85aeaeea9375f90777c2a747fcefe0dc0100000000feffffff534596cabc5aa50e53dcb06900c4e9b77bfcd146de5961f137c1e8046ed25e190100000000fcffffff02b0ad010000000000160014f35f9d0133f6834b73e75b0f632d54a079931672ba020000000000001600140d780517bc4cce1dddff0a1e208702e3c9fed3430247304402205ef9dfab8fc1771caa2249e2accb5e70d8561eed7e2ff69b07738d339e80c71702200bf0a35371a0bf6379c7fd1e1ad66b68d91b8a334750b6a4d456c9888b615364012103851b7f7aff4551c9c744a100bbaff370124608ad7bcf651b4aa0d2ad6cbccadf024730440220567d6f2f152e348cfd01c13da212dc493f7825abbba43ca1bcdeb2e8bf7344780220717998b991539e04506d670be5362be36a02f63b6f85dbfa0bbdf859c377e454012103851b7f7aff4551c9c744a100bbaff370124608ad7bcf651b4aa0d2ad6cbccadf0248304502210099f25374dc59554f81694642422a68080fca75bc123948f25a4c02773056e655022035210f158dc019da118d5dd20323e481e0094594f63e0b1c3d45048c76a59ba8012103851b7f7aff4551c9c744a100bbaff370124608ad7bcf651b4aa0d2ad6cbccadf00000000010000000001038d175c062bb6cd2ed6d88855745ec481da0bde02838fd0c4307b387ae123470f01000000000000000050e2e6820fa955a04c3f663edf58e3bb4a9541ddceb8f69f84ddcaf820b822fb010000000000000000b2484c4949228cca40c9bf61e3dbced326a2804d4cb38f95e08c2b9b4b05b9bc00000000000000000002815e00000000000017a9141c732b574736020d4ed23aeeeeaf42051c7e4998877402000000000000160014ce8c9224cb2f57a66b78a00f8ac33c5f2589b2a202473044022055e5abce4dfa457756118650fbd65dbcae367ff86507e399aa670f33fe8bea31022067aac0e0bef5f6af595a7ad5754457b9b3270fa92ebc59575d568e991f44cc23012102c29a59a11d039b04ca3e7dd484e72ef2546686bfb015f9a25002b8ae15141f43024730440220229f85fc6b4e52d5a0a2dd39629e7056e4e774d63173b4ae9d966b72c91dca7c0220150a4a087f82216a06ed8a5547141e101f6cd8a01928218afb09d6796a1d99fd012102c29a59a11d039b04ca3e7dd484e72ef2546686bfb015f9a25002b8ae15141f430247304402201b799950d7b7ae641114f5e1c2e0e78e789e1466eaa9c09ea40607e844341be802205bb876c49f5c427b4abaff5c6ce29069e0fdbe68efeedad59c3dd4baf448cb8e012102c29a59a11d039b04ca3e7dd484e72ef2546686bfb015f9a25002b8ae15141f430000000001000000000103b778e872fd0522055aaf7fbce426e8e9ea64c1a921b131e2cf1c2460f02d4985010000000000000000b0af90a1880879e1dde8a500f19eab6a81271a1e4865ffc9b709530eda0b91ca010000000000000000bd5eebc11c2ff885103ba2795cd2bfbaeee66a828447a16326331af4af7143e90100000000000000000206b701000000000017a9147204c7fa517b9a1c051b8d879b63062259c50c8f875d030000000000001600145327ea13eedb79104becab1628b705d258d9251c02483045022100f1ef45e08cf9795d406e45b0e748442b554dfb51c60916d4e4df2c2b28a20cbd0220358c810077247ed61693180d45176bf0cd554520a9e8d8a9ee3d2efa8beb5e4a012103d0c088ade799f31e94058a3a71e4687c4db816bf77fd758176bf17f3adfbd8c502473044022055d9cbda375c0106e28fe1c2509fd9b902ad708257e2bdaf8639bd77affd3dea0220213c3f09998fc8164861cac39b108d163bf7123326b83c53a94a344f3837b82c012103d0c088ade799f31e94058a3a71e4687c4db816bf77fd758176bf17f3adfbd8c502473044022003e77e00eede06631d195670b76aab41470f64c38624265b2086275daea97f3002201977c4d0cd685af40f46fb63e50b7b4d28c1158be4d4a7f6a802c51b2650171d012103d0c088ade799f31e94058a3a71e4687c4db816bf77fd758176bf17f3adfbd8c500000000010000000001018036343e923b1a9b72bbbb26511ea5565847096c90d4656ea73277b865a9edf70100000000f0ffffff06bf3718000000000017a914dee12394ad6a6ccb598604ae55d8008a09451aee87a8510c00000000001600146b3febbaf4f28e65e5971037f01e491983bf9f7378090b0000000000160014af767ef5730db3568b71de93781a4965607ece5182820b0000000000160014bd5e146af0bcd6f8969ec91cd2972b30b461aa38dc650b00000000001600140612b34d7f424fd2330c6f82f92442c54d5ce89fd2552900000000001600148bdae4853b0846e0e6cb4d4336b85ac68d6e523d02483045022100c5f4c41bf4ee7b96ae8e3bd4ab37ed9e64186d68b900486b358f5f760f5d081702201bfb2e0b2978b3e468a2f373608f8460af0842d0b4ead6394bff44286cc779db0121020af1c48f4012b7f4a1c70471e1090818453a0543b758e2aaefd31308d0a035f800000000010000000001040305d050f801a511735a002ddff566b1d322efdabe2166abf53d8461539470c40100000000f0ffffffb04af4ed30ee324317e13f24aa4f83377282f666b2d5e83bd2f335d1e8d486be0100000000f0ffffffba3a393c3b7a2d7cc5367ea3cb0705481481fe1ce68033e72cbb73bdb2bd5cdd0100000000f0ffffff42a68095fc173ea111e29161e347ddd82d979a261a21394fc335f7cff19368970100000000f0ffffff0262ab03000000000017a914e20792283696d91f19be3039dd3e2d558f105d4187cad00a00000000001600141a6e5215525ef4acba7e6aef89f82c5830753ec402483045022100a8f958416f888669f04fc03999e0974b057453f89f9c499d1fe0a0a5406f5fbc02207a5fd2ec3ca5e402bfc64b018a8c8ce1783e57d1501b600d6864f438323b162a012102e6630b02e069ba344c71dd0a7f0dfb3d3b1e01a2078b4997074ff9a697ca41880247304402207e468c425b2fa320370a49f484ee7b6189d56eaa791d363281d5afe2e8a38eec02205c20f6133f5bd8599b08a4f45cdc3c2a1cc024d44e66d57fa8757ca661a36d47012103f60780f84ba60c42ee51a7cd14847c0632e99f85728de18f1226c62cd78c287c0247304402206f5ec870449acf95ae3b98ea380206acc85de9e46b758218560312da727cfe0e0220796f5fc3c472d8a1d071b23b79ff101a74f0eed9ec4e501f10066e2f754da2b5012103eaa5b8b4b605717fa8b1cef0f341298f30f535c8470e99bae4c5bbcbf6c9d3870247304402207412e0236004fe51169d55f1c6251a9f99163b409841e423ef634710cc0a669902200bb1c7e7513c74ac2069ba350c8ccc3a9ff4c5b10f6a641610a16904fa3fdb510121037ce3a09fce4c2e046ffe7d5d74e120537933948bd995c8321f3703fd18efb85500000000010000000001021fb47927df40cfa63833f603c09efd40af0fb34fd6d2c5176e4a9792e35fa9b80100000017160014f3a76b04cf4a2b13d517b801766c44613f5b51a9ffffffff3c38a792781d079ab9bb9250dbd6cddc924e713757e3c2a7b59f92beead14bb900000000171600140bc41a40d2b7dc05f52915093c231914b36f4271ffffffff03605b030000000000160014df499f0e3fbbe1b0f436685f12c333d018e5ee2220b903000000000017a9140f19cc4f9f1ac50de85e584557efc1752db3d3f387946e05000000000017a9140d8ba77d98b32330d449162641b789dd35b004708702483045022100bb1024f6eed9871215b5d6908fc540f29a9ed169dad38abb770c27d19017e7c20220250e71f9250060ba60fde53830ea37cf9a133dfc7b4e3984ff377448b56d6a010121033c42038e71da06dd3f5897376fed199ca9397ad1bec747fab26b100b66ad6246024830450221008b5be17bc444efb1aec04e2d8910b52ab38ae2e56cfb221ab4d0dd4ad48d5cb4022007e9e0a02ba92d373cb179c504e27b75ae326c0ebdd76fad3770a5745f127bdf012103c88a3077a59270e9c28ebd978ff3b54a017087f7763abbd217553acecbfbc53500000000010000000001081960717b7dccdeab525a9566afc9d158e3aaaea60e6a46aef636b6b76273f3e700000000000000000063a8c2dedfdd696fca14a0c0059723b7b4546ba8a50a5459f935b1dd47155f8400000000000000000055a20ad099e5a7ef9d44992d6c047cbb886ba9d25593f1997ca00bb0f4f7208700000000000000000055d9b28fa717a9e3be81aff771ae7b6149ab273ee6d861f373369337f26ef30d000000000000000000936d7eadc89e53878e078f47af5a2bd6be28e0c6f212d895b2e071433f41c70600000000000000000005b873b35cac3efc8a50b7ff0b51696abba4baa397af5cce7a152b0a0dbab61200000000000000000085713b54687d69132f24c9c0e0035fd4a15cde3c8e71747dd1d90dfa2cee6f6100000000000000000083e8d9b1da364afb9839b6b8d0fcb4c951ce312e405fd39989a289b5ee51dd1c0000000000000000000191718f020000000017a91444241a71dd156900b5e4d7cd31447e826ddb10058702483045022100ddf53441d0bc37a11e5bc54f4d8b6d6ee0fc02501edb47e239d660a896979bb8022045f0b71d93e01aec76c5704a3eea709c79f20a25c4e3018a4d920de6f4a421600121020ce6388b2e87d87b3ea8119f32a63c3076d0e2d5fa5d04cb74950e87fa7df9bc02483045022100bdbec0a780a6a1fbdad2227c7e72ffa255094e3307031cf5253a419fa688963b02201c315432532b23d4c84d6c6049ced91060477867244e15f3f41d8ddbe2eaaab3012102143752c4d6881b1d20b7a8c56bce25de33cbe2de6fff6e384d5a0b8b27b41c1b02473044022058bc34c5d5b606b54be828649c1faa436294ee79e57cc15f9e396f96067b1fda02200aad92c4e9a61d4d5f28099783825839de32ce75b01749a8ec9ae2103e96085f0121036489d8aebdafd8bc327674e431e4d2f4124f09cb4e140245ece59204d26c496f02483045022100de995afc604584054be2d8471abcda07b71a689ab1e7201cb0d6abe204e881c702203020955559d3f0d468813440d01e8fbc6b195b4c08f3ea137a02da608824e28e012103c9e57b7dd68a50cb3863a4d0fda2df7b67ececc91bb6b963cfe0fcbbc9e78a9202483045022100d2b9129d0051a7555dd5335f8f626055b3c0fec2f9b3fcc09a4d14a1b6bc817e022050b40a85b98af5c6418234cfa92c5a48e18ee551f23b8731f8fccd0b2bfc45d601210373dc6fcc30ea7e04d0963ccb539dfeb6a86c485f8e7af093f5636fe5001576f602483045022100cb7bef3753bdbce4e26e23123a6e7c8ab2fbe428f034fe4fcb96721e96df0d88022008a1c730627b74171277a3e40b36762191c52b223daafb8faa00f1c6690dee11012103182a5006afd211e784d0e0a140d20c4a87126bb472c0fc0ca15b1fe45d5925f9024730440220140b6993a366f6bdcf8eeb0dd284a841467a26c2013098039aed7efa1dc5216b02204969a54471c783b442702026fa5eaa15a1202219c98079e615b7ba061034f4d4012102a01b9808b30e0196166a773e3798a234792c287a03f5e22e6149de2dfcb02a080247304402206dec168e8d609db59eeb1afd03c17015438d9c638a4cd9ce936180cc8a3ab68b022047c91927a987e64321e1cabbab5c11859a0cc3400b84e3e03029f3b5431efdd50121024ef5a742a54397a5026c954b23f1b4019a62ef6fc2f26ba59bcc91d13cd8f0440000000002000000000102b5d62636a494fa4618e697f94fe5902e7c1f8da8eecadae6f8ce20980e4752af0000000000fdffffff23702c468e89acb2cc206cad2fbd66f2dbaf66df1f9210dac1326bb93d2212dc0000000000fdffffff029f1fb50000000000220020d38f9b8d2039936704d04ce9ab0f2a77e025bcd0588540aebc4f207cb0bb7582edd8c4000000000017a91425fd3c2a96446c1fbf6186eefc4f75f1b1ac4227870400473044022003ac691c67001967349ed10cd11ff8438d00050d79b1ed2a16c323ba8bdad836022010604fa25d9f91ff9b077e6775304b9402657bef406796a008a6bebd4234421c014830450221008dadaed028879b25dc26c9f87d141b020a2aa71cdd349d48f8ad1dd06467781e02207af5c1cb610f1f30d0f9de9f3f7b506bdd3250fef647d1e1947bdf2a7fdabf7f01695221027fee7625c40edeafb566af7205f4435f706f311fafa83234e35bf9408a84d8f72102854b00d9da8237b4d755f3ded3b52f4bc770a0566e936e4b960a7816e549b7262102bea8c400a1ca982ba9cd3a3753dabd21dbdbf8ae5ea0f4cd6ccabc7b12ae22ea53ae040047304402202dbc0b46a2c6851cbb3e7ea59af387126dda08de35ef53845f2a1c939c7ce11b02205b14ac881ec93a3e82789b764aca92434364e8ec33a42c7228084605d5b0d05c01473044022041bb7ed3fd77ebaa2e41a74e332c8a0c2ba4a5881efdb383d7c861319574196d02206b5dd22442ce1f23cbd74b71667db3ba727b281481a4fe8ed9cbd025ae436dd201695221027fee7625c40edeafb566af7205f4435f706f311fafa83234e35bf9408a84d8f72102854b00d9da8237b4d755f3ded3b52f4bc770a0566e936e4b960a7816e549b7262102bea8c400a1ca982ba9cd3a3753dabd21dbdbf8ae5ea0f4cd6ccabc7b12ae22ea53ae47a00a000200000000010e68aed45f44454c114371d104aa238847a53f7319eacec08d148fa67a370022970000000017160014d86ef706fda7ec587cb83192fb78fbf069b6ddb1fdffffff249f08aa59dd367a10d1a3e8b6ca56fca2b1e94d5eb624f995f2df6f2cf1b57c0100000017160014ba7c20091abf41e57530d21b2e3750f3d1a6b127fdffffffb0e9f121b3d2b45f6ad0e8edfc9e677cdf397af2ec2d056ea15c57965ae6897c0700000017160014630170c2978d4bcbbcc8faa34dfdb238212a9b5efdffffff6b103109b6348c1bd525ffbc08ef65b4f0db638e2b2f54d14cd445a9d59ccbd82f000000171600144a5cf2e50c80db71bca9dd82f12561e9cfaaf80bfdffffffb3e4275ed8a47deb75ce8ce447e4eddb0a168a13ab4240d0dda21ec6d22c3e430500000017160014bb335d23b516fa13c817c311eba2edd714c80c97fdffffffe2759db0347ec96f36d63e0b73dd9e2168f974479849fdcfa5dc6100a6761e8c01000000171600145cfb182b7219b0ece46f9306bd8dba2385769a8afdffffff4b88c00ea1371dd54a638f0433cdba180f2eb4d3e190d435a96d9841fa9946bd37000000171600141470556d9c9a621106589cce012b63f6f7b3f7e5fdffffff31372ba0c26128dbc5aa1259b4c2dfc6bc296d6ae5cb47d5f3f7bda9d7c3994801000000171600143bb3930a71c209801a54cc8bd46440b1525302a1fdffffff93163ec1a4bb8ad4bb04445eea9c092d2e2e52a3bf26143acf535f5c92f8f6fa23000000171600145b1f1a6f25568a6464eb98e450c876a11092d1a4fdffffff7480f7b2a1c8b302fc349763ad12473ac7b679892a1fbc25940f1f296fead8260700000017160014ac9f35fe900aa65f93376935fa53c0dd6049a01dfdfffffffe85e789be9969af9774dd05630f25154787a0ea9031f5720ce4e643de22092c4600000017160014cd87538500f3ff8bcab20c52d878ed49c1d11b6afdffffffb7e85ef50c10f5902adf8d14bef9b8da13d01cb9ef0de747951138d64233758f01000000171600143536474b8833019c6d0e408c24ac06038f7197d1fdffffff29ffe3f0db5d40f3453e0c72ed9f80b5a440628290d84eb0a9bc88e4b7ac57c4040000001716001446254754b850c7faf2cccfab81c7a69cf7ac8e6dfdffffff41fadd6d9627d298c6a9b491d4373361bcb6f6b85061ed6bdd6fced403d8a12c00000000171600145c355cd8280497a8fd3524b08979bebedc8d116bfdffffff0377b01b000000000017a914b3ad1a98aa47a0343d724e1842ca5e4b07e0fe35873e2f01000000000017a914abad3c20f6de22ed82458ebd5573a246d75d995887801a06000000000017a91401bf31d62080d6563b92285f9963c3c093993dae8702473044022077ba55e6b1285007d6397fe8ba690b5fb33609a3560ebff2284fcbd7d994853602203377b73a49f7752b6b57494baadff07d3841a08be9727265f5153e12de0a0a61012102381f249b716d96bbe90d8a30a3bea26c1cabecc9628600e6fa44297efb6c899502473044022024dc9ffc92381b405c89b6c48db6aef9bc27853fcd4cce51168fe89ac447f7160220739c358633dce2a5562155a74e1aad72570a2ef644bcb90b03eaa1bd05b560a10121020dbc6a5d2d7d31fb8e9745f42dce73b465258cb07df58ce9a04241fce7af11910247304402207f1d60a85ef93c0fbd7d4387791d91506ca8e50de57c9a69985b1ddfbebd27330220706d1077f09d48fab67b972f3508723ffbaedd1d05348a2c690f6d15a2dddea40121028d7ba42ca0fecf33adf8ce1c83d0fe2e72cfb8ff1e70b903e456f9d690300df4024730440220485a37fac08dafb60c46c7036c60e48296d62b2fcbc50a01b8098b57a09b3aff022005fc3965fb475c4d731d3ec3f4fffaf09984660a4fef1039bbd27fd23719f0750121038cac571011ef84b28e51475c700fc92049880ef79f149c9922fa5b29a110edd502473044022063bddb3aa9735a0d7f255bfc1eba8ae51a4cd936084d68048275570d53a88c7602202bafbd7fa4c664f07431a4dc903c5221ccfd7376d26d027c87b314b812af932a012103fe03329515781b0a254cfd7e4d6e49f167e587e06d023f074c9d6b83628b46990247304402203e3d222a61c012c24f79853568695ee8cb3b3ed8aecd32947de845b68e4e9513022046e520a482bb580dfb5b03713f2904ab38662866b158a4966231c3e26d9c75a40121021f1af7f9fa2ff0b8579246fd2ed331fc881f4ae40f229ca3e814dbe952b757ab0247304402201ad98bde1acacd6a19c69142a56fd5b9acd0b4c82910321670da4c38e89f126002205fec6f777f56afeea374c1457fc20bdcd92f7b7692b4757806461bbe53d5649c0121021eaf61bf9ea803d5a7edfe1a66b552869f4d4c9d72b5b73e52e5b372f7ffdae20247304402202af18f5eb80697470df178ffaf5db5b0bcf23d3967134d4e9b5cff32e79961a60220486f08f0cfda36ffabf09ec219cf371ba36e49c104adb6ee3b12616cdb7b1693012103fc0b820c0c7e3251e2263f86bc1e44345799dd38534823352b9f05b93970d922024730440220654bdc977225bc008b703239e3b04891d39a77efe8915febce3c1436030a3c420220282a85d4b08e9a67894c40175576fa9c1b5270386e4ced3ee935595f4ec56f9c012102d695d4336d8e60105df1d9a4f18cbc0477c4265f5cff936dc4ee86abb37359650247304402205e6d4aa98e7cd216844a16f8b9b6261d7de8865333a9c1c4c8e5e5b4e4a079ad022075a6b765787a99d67f58ba3ad0027e9a59b6fb2e5947700fe0cff1f9a6cbb5190121033fcdd85b261fbbaec58125a0ecd3b7459b2d43b4ec7f8d829c8e95a98746ff4e024730440220334101d18d7321e53f3817de465fba49e0688607c390103d2542b880c0fda3c602201bca2ea62e84fa74b6171edbf69b7fa2a3084ca6795efefd21b5ea27ac4ef1100121039044e074e4952f81f9523f246d1a0fbc1e0cef32c2f7e5f599e182ccbd08ad610247304402205731070ce0a4f4c786b19a35ae70d51d7422728dcd4756a4dabb2c52c3ac78b802207b523f3350259d6b1c7363de8e3dd5747d0c4596ed8cf00e2a82ff10a9a1f5d3012103886c9d42c0d7f7865c49ed2dd43bbc17b1dd8e47f8e7659058200fdad2079b0e02473044022027af1ac01807906d493a53ffea7f41792bd86863ee5972cbd778848d7f344496022065df0999777b379dad16386c0c4269aa4024d8c122b75dbafaaed66450cbb6c7012102be0e4701252b8b6c8ba6544b467cd59b55c769d51bdf3c77846923be316e1ac902473044022052b7d5969776ff3fb60728c78dfb5bc01c8cfd7e57e2947196f2cc73d3cafe45022050269a516070af8256c25929e5f6cc12c773567dd6f7125a18361c261d27df2801210212ca0ade2ad48c5f17b77bfdc25833542074a0b3cb804e9c40aacada0f5e1c1544a00a0001000000000110d91ed721ed2512ae916f21a5423053193af0a71339ec8382a9870641e2621b0208000000171600144d0cc2f6bcbf7e9bad628e5db8150398fed62829fffffffff31b76e05549cf703e299acb121365479cb7fb1f59515d9af540b921368457180e000000171600140ba0a0861b8c353d5bc29230974df2339df4b7ecffffffff54b066edba69cce8da6fbd3312c8cf1408f2de8793ffa206990b64f946f2c0342800000017160014352e96afa77fea7fa96472f5ee7b0a36ba0d52abffffffff8c8df1b81b16605930e82fc0fe9e22a281cfe0e740861f06db13f609e4af1436000000001716001481c1662aa362b89e5da81c35aa9575c2980f7437ffffffff880350dc1805b5acec52b5719659decca06065d50e06f31fea1a7226612f82370100000017160014efa0e45e4b15870b1429fad8bcdf972e9183183affffffff8a41f80ee42e88539fb308eac3e4937db841a4603ed8c8208b0ce97b9bc6fc37210000001716001441e2a2b80d8094675be790a3ca4598c49e530fcaffffffff9c5b3310f5c0774c3dec452984a0c2c9c569a978709a2c652deea3644919673f23000000171600141b477c555caeaddf5056c3e674b2dc480c55d6b8ffffffff4c804062af937649578fc66fdd012b9624da4315580e6224d4eb874679aeeb4a0000000017160014261884661d99dfb20764e378310aae54bd1eacdbffffffff9b754ce517f3c1feda7f11a01a482031fb40be12011c6acaa1c15bffea08815c0100000017160014e359562709d1569ace33a1f80a0e23a47de3db1effffffff2bd3c0a871698260e839a27bd7a5ac0dc07a325843f6bf21b7a34ad917979b6a1900000017160014ddbdbae32e6213dd65d001ef51713a81263dd4a6ffffffffb626ce3ced721ed7f74480ae2786c63ee2f8031a74b7267d5ba18f5a736a596f2100000017160014016d6053f1d7fe8b2eeca0f2ce98d6f15c7482c4ffffffff656eae91ae97c72880c4854d137dc4ff337612b4781558bad83414d1dae4429a0300000017160014a4fa5812a6566ff4a4ef8141683b5c7ed1f3741cffffffff8799c252989c1d86ac9546e9adc1431db40d5e3214f753e0bab0541a06278faa2100000017160014ea66136f78be1eb9ef708a3ccd2ed6665223ca54ffffffff05a49d1381123fc3257b85a147cc805445ee084b75c65ffab2bc289076aa99e21c00000017160014c7b763b02f6bfd246ca821510daf07131e1f42f1ffffffffe78e552513548933b417642559dc70a2ece65fb1a6b23dff50150733b78795e3010000001716001464a5fc24bc4cde508b77c514ad7cd2842b56221dffffffff624657354be7b5db049654695aa75fb0bec8e1f7d07840bca0f3c3b36d6aabe30000000017160014a4f66085f155698f5f317bd4c98ed1410bd71ee2ffffffff01ea1404000000000017a914ce3f4f28d978ec9c89cbaa6bdb04bd22e4a4a3458702483045022100a437d03b1ca638da3e3bab401f4b23c16f7a2ae6093bb93853d46ba62955c9b9022051c7ab341de1e225d1a68544d8608fbe5157b84691f9b888db34334e696c3fd0012102ea9d98ff00e9e5b7ef7e451abcba2cc6b6b93059db3fc4c5ecafd93625b0b5470247304402206651af095c69b1efca2389bc351904a8840be8bbf4e83785f18bcf3fb4032de9022000bc2e6b12f0eb051e43bbd454537c81fe7d5f9ae596d5f2bf813cc61263e42d0121032edd6fa23df63be36258cb84b62a2e4436383cd52339ce2604d9549d7651c59902483045022100fbd35e35cd05d552b3a34b80c6af912717b78411163e47d0607b8b29845c59ca02207171be1667559a4f4147e4d88daf46821bf29b7f4412028c892165aba5eacec401210355cf33d2f365f84d5956d6e6ab6a08b31d5a61c5e650c9faace28d70af9be3e6024830450221009d612551ade25657e0787937da1eab9e120d58f8f5d5999a2f03d8b60fee8a8a02203fffe6a3c06db71d375ae481f55d96017ca5afcfc44018301a2a10885ec5ddf8012102c512b7c6b7021a43177e3481579d69566a0cb9aa860c9bb31661a94e89473e4c02483045022100c85a4cb75c24d3c4ff538b699065b3415ec50cfa2f0cf6af55a5aee13dc100000220580afd7e8f70fa85bae0a431811b22b4f321e3a60a8d67b2f2dac972b2dc14830121034de4e918295e65ae174e25694a32561675d4172d4ff48cca11414c31f935a6c402473044022004ae2cff89dbfe3a7ec5f9690fe399f413b0f01f450f3931154f10ee48f492c7022061d3f2153b045ba202cef2a1fc102dc4cd7f37b4265e54f9e626c88c85c20c46012103c9ef5d95acb09b674fd3ef71e9360144eaabf86fe13d8f1d5ffd0a3fb6aec3980248304502210096d89618f6a1438fc1131c874f0d53698dfa2b4ddbb7bb443358ecaf04e632dc022019a7de7e9d667fad15bfbc5f1f521bc445f167ee0eb1521baa53339f1fdd2f96012103aa285cf0bf4e962d269c0f643036a34ddb8ec90a40be59d17d91e3f96dafa9550247304402203c4661d040083dd7d38f4253944e23c04aa434bd2ad3ad5d6f5cba1e2dca1cc3022020559bd27c677a18e87142597d1fe01548a4f094345518804015a9ac69f74c5401210290e55b7d96858ffa6d4e5b1ea1000822fec4979458b42e37ce5039f8b6e3fe420247304402202ba4217b60ee625babf2f07c282769bbd8811e79c6123e20bef9e836d3499cd402203f67986a3c6200f3f2cd3cd86b6d54e127f0fd6265ee86708a7bcba6bf90fd72012102e881ce97fbed793e35d2adc4215e8f88b8946335c70a64832d29e63e6b7ece3702483045022100a59f592a91b724bd94e176b39b8521c1d22a87035c47768e008f43eca298aa5e0220607d10c07528fb768bb2aaee8387e47b3d980ed64c70ce29010e9656645252d70121026451dbb851bc00589c324f0276985bafdd04152f53f26e47132fce64d69a522d02483045022100fb623564730979af93cd2f73db70cf5ea98c6a937723375152bc847648d68c8502200aaf5e108a7e05a15dab662e48ef6de6cbf61802b6c5745b63de6f431616352b0121035dd8baf2825c825f1ebdca2f310764cfb30d5f54b3496bb8fac2fd5f2d306108024730440220495873a4bc4099214aec20c93142e376d8a07e3cb0332e9b403e46ad5e23211e022012ae78ddf5d782f89a91503120f15c48478256d4fae88c61aff60299fd5c24db012103c0db00b49569ba7b106cb42b06fb4685e30132a894e7fc6bb61a89d8fd1140520247304402202f777f20f2d79c2f3221cb7066fc01998cfc23fa9c58ac3968e23176e21f7491022001ea534819a347e43d7dbf36dc4aeb7a979e7d3a74c5e05d221d3bae30a4ae8c012102a450fb546ca9627f95fedb44f9acff626667a8326fec7c3bfa095f8ceaf6679f0247304402206df84144cf52d994ddb6068aedd87d4ebbd07eb81250ee9b72c242e3ac7432bf0220798b318a58462d4c7877c0d1da63f3f0b32a52175f5755163e7cb1f000ce896a012102bf1670c07f858af931aa89aecf970a1ac2f0870189d942c43ae3ac2c3cdfb5e702473044022072a2c2cb70927d416d7c06d9a4b6c1e9ea5ba94d4e88d3f87c1257676875299e02206c80a9f97dea0fc7957da51d21933de8be1c9393b84315a4cf1c3d1207f939170121031264bf739c2b00f536bdd7fded3ddc1d6be5694a3e755016badb679728bd4ae802473044022008b6f219b1980a2aff65122a8d57937ac55d50f58b02077fcc9a8d8494fd349c022010b71677e74e626ed75e08f138d586c3d3e4fe7c2e3d4757c3b5546921331b7201210388d0fed26fd8c00660578a767e2c419c203921022f5b024f0fa2fb84addf7c4300000000020000000001c016a6b1a6fbfaa3c1f22b5af1c3b180f164db563a8ed2b0b7c588dab0a1e963cd3f00000017160014923c658ba5ce4f5f48c3654125af00a1af36b96ffeffffffeb4585c16d1f0dea8d61bac6de87081e574b3828fa4cf999f7d7dfe3b95096780400000017160014487c6ae643d2498e7144aa85d5dd5aec910193d3feffffffec6a309aa482b503eb383bef9c77d8a49b524b5985e6ed7092e4e5dcb7ceba1404000000171600146a3ebe906ed7dcea4b0f1fe7fe03563b68573bccfefffffff0120fe8b57187d08519327b47ab3f6fbbbafe658d3312fefcd131015eeb17ce2d00000017160014f8ba168c88840df221cb4cb94e1c84c481b05054feffffff16a9e7efee5429e8cfd6cd3a9967cf57d45beb0921f07ab0d77fa50d63fe684c7500000017160014a60164903cacdbc3d6066bf8e4b1961980789358feffffffdc559854733df9e2d7c746e8db72e4ee7d11d49f574cfa35afc0bd58863b201b0000000017160014ee7bee5d6fd5ab0e5c6b91695574bd8d2a44b85ffeffffffbb3d5bd0afe2f265c5a45d26ca494c0b963f620ea3a4232dba08836aaa70b24e1c0000001716001438febbbc3069ceeec249c153ad2d4dd0ed04120cfeffffff0715d937172d1ccd67b7727b19a827f89043be693059c36412d136d3d4de73dc0000000017160014eedb87c6f702604e7cacd8ddd447c1c712cced4efeffffff867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd3600000017160014a98ca9b5b9d2c04e29dacd9d4ded7bf4a31b427afeffffff45810def42d0c2a8cd7901a3c546b5f561877db14b954c60f831c89985916163000000001716001438ad10a092a859986649ef180a55183fa81fe23bfeffffff588434dea1a08781c6ab1bec6bee771723f94570c199e296a0b8a4c37e14b7c8000000001716001478f0f2b7435c8e15fe36565a3955a4d79b9074adfeffffffee46a6b486043625374635be75d3a97c762e117b78c120e21681ac894eae08a83600000017160014e45011e3e611640f74d8f571ed66deba8b725855feffffffbef81cc26430fe9034f61d775a80d6f4e14f8c4c37f2dfb803447fb918007f3d0000000017160014ef1bca93908cb08bcfab00eb927d7477cbc31579feffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0000000017160014e2c6b01dc1a84773a2a803c78340fa581591faa0feffffff3511cc5b4d40a40db79141a329c2766573d44309eb96bd40ef17aca08b7fbf401d000000171600144402b799cde567aa2dc6259d99e95a3b7f0a09c6feffffff061e429ba1e83e6546c267e563eea4692f5fac5f48d29e03771298c41928ed3b2800000017160014111a7e2a5bdf53ccc151f5ba71b4bc470788d558feffffff958919e6c89e822b59d7406ef4b5e78c2f180b84814197f8c51774759a9f2be604000000171600141e70a2faa478573b9c9d6d68793da8e9ad09c566feffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db1f0000001716001477271a970bf0ede0634ddbe0e648cf7f8d8b14f3feffffff117496673b62ea07568be7b71f81f9dc2ac61862834c271081f5ceb5ce5003620000000017160014094fb4ff97b9d0937b5e640f6ba6be2ac3305f6dfeffffff598c5747bcb8e858f23109a6382f842c615cca4fbd01df04f4434cbb8154a47800000000171600140b8005340369ce3996cabbb263c5ec837192ba51feffffff78f8a6a45b9f3a6d38c2d8dc660934b666b13bea2273312d2ab119adb0adf8b41d00000017160014f4ae19e336d9334932adc50de8eb646c4617c551feffffffceaea910df2354c7f203fb93fb3226fc05020d6170a7e019511c4d425b76bfe126000000171600140a1f1b135403739074c6d033dc055e53c6777ae7feffffffde305a764049df5e38bf8e54624d15c32fbc4ab7ed538dd5cb9a8904cad2ea1e2f00000017160014c02425d6781b9e69a88eb509dc110c7c6e55c2d0feffffff9f4ff004e3f70f6e176ba8c0cc275b5fd42e8b3a0632444c1d4eff6bfeef83210400000017160014a88420fae2a7e910f15e25d9297c2942bf5262b0feffffff16a6b1a6fbfaa3c1f22b5af1c3b180f164db563a8ed2b0b7c588dab0a1e963cd0c000000171600145425110b75478128a9d64854ea6f705660266ff9feffffff379acb79aac65b371c7396e919c22673a62451fde9df5a1e116ab7e0cd3b5cba010000001716001471ec63e954a509df4b5ed521acc37b19eadbe6b0feffffff7396ac482755fff47f5775f1b46c06df192715845e63e37d6db03e9dddab293e09000000171600149f41f2ee6c11fa1cf76f5fd07b5be910cbbcb783feffffffda8bb35e94363550e7e34cfaff5aefbe4f4c0b0c4644c5bafd959701bc81a67720000000171600142c083efae8bf18cbb50ae8f2473b97e90c2e6386fefffffffbd3b685f7d193d55c00d6cf586d496c0ea9e4830271f027d4c52eab85eb68f10a00000017160014f2c0cdfa83585a2577413d4bffdb5f4ade5230a9feffffff6540ab6941808df6f9d59f338354f91387bf77af735d407bd2db32ce69d1fc1300000000171600146ae09f450cdfc1bda9050323406f85ce4b503df3feffffff16a6b1a6fbfaa3c1f22b5af1c3b180f164db563a8ed2b0b7c588dab0a1e963cd2a00000017160014c6566df032dc97123bc4649950fb0f04cd316982feffffffc6f03024d0973d42ad49ea8921cc3d6b5419cd986dc21b11cd51559ecb3ecfa203000000171600147121e8666821a0f97bb430aafa714cc934ece16dfefffffffb51cf9e09e215f7c21a74fed1d5fad13496605df74201b2a10923f25556e7100000000017160014cc8304d0d92b6538359cf549289346751343d139feffffff4eb60cd91904b70da926e8bee12d6947ed7a74207b1dbee56a243cff2610ccae0f00000017160014b7c7274c41e4fb566cf293e65698b75290144dcefeffffff1bc4dbc754b56cc8c6ca6a370e7d8ed57bd378b5612b35f7367e6bc9e577383a01000000171600143b06153b6b50be3e09c35bf0f9edf4b5270c06c3feffffff83e2e31f660d96859bea1f3ac82008c60e3aa2f85bad765cf9c9dcfa8e2c1b88020000001716001483f0f835b1f1e6b1deff5d689cbf6ba5a000682dfeffffff1629f3c823f30830d06e582517b7f675f56a8035d3402d76f3a7c2954bda8f280000000017160014fe117e06919574f0aac8a79fe26736348c5ed44efeffffff661e4471ad6a21cfc20bd5907632458ed48cbac5e47916db532cdfa67ebbd244290000001716001473a766422d1b74adb391e76fe7b0ef83fbff90eefeffffff9c53a69fd71efee6e0d21606de424cb89dc7cad7c1399b3bd7e85db8e6ca856a0000000017160014966b99fe44fce0f64bd5f7b30a43f427dd4eb264feffffffa86a90d296e0e88e6375c9f0841e0a6d28bcf0153b02f851d7a3a35ab27fca5d0000000017160014c51ba99753a9f1a7a1dc136d8707044a161701e1feffffff2ef1d6be4f8dcba5a631db591e02ab654954591671eae9aadcdff99751232d63020000001716001445c3b2d1e0b27afba5bbea1d69bd5c9bd75b3c43feffffff867a062103b0f86a394f890459ebd7d3f574a8945e180e94fcb6b7a9b1f2cbfd21000000171600148f3fb01b38665bd77e8c74288f9749028855ae07feffffffde11a0402d463c162615bb070974894b3d265713d9af25af5e582c96a8f0775d080000001716001430c1ad0960838b54d6a302637605b308d9e4b407feffffff5014989b7b0b14b91527773761f2eb9e0526fea553da5acc41adece99a31c8700a0000001716001439cf20c4b4300e0e5b0d6c5f5ddd03b7776f0ca5feffffffab7520416341476bd6d498dc342d9842545e642a1f7ac1ffffa50fb80ae6f6280b00000017160014e7b11a407842e85eebd0754035f6091448fe6b6ffeffffffed1a55765ea699c2ebd90eee3e66e9484beaddb6b708d17966be8c3becf582e90100000017160014dc4a8f8c7f6cfd6c5ef53bab71d1b0951f0b2bbdfeffffff8b2d32effadc7758e5c93992df7d7b041767d854333d07be7304662f443a02473400000017160014a2cb8afb1a55b8397f8118c1067019c0fa0a0082feffffffdf6b32e5dd5ee8ca9dcd09ec3a5425f221a175651c7b2460c6943a15d8d465c0010000001716001485e23e80bf62f0f1e89bb883ec5e3883d1e669eefeffffffeabcf1849717bc4c677dce93e6565ecd95af41458f0aba40c8bc2a45c3fbfac01300000017160014f6c77cc5af4661e57ed15bd555d5edfed9fe2ab4feffffff8df63c35e8de399d2194dd81396bac4e85d7c58fd578a79748ccb3d0c90ea40b000000001716001486459265b02fe1744c891e369986666a25952f8afeffffff9048016fb2cf0a6c41772a2e47cd4658b9d52fdd5dfa1d78c75910b49ca21e6b2800000017160014a2a57176ba3bfecf957882ef095c08cde5427ca1feffffffc9571e9b678a28832b48489cd289551fb8d6d29c258bd0d8e5be536739f5ce3e3900000017160014035bb9f0213a43cc9601e5c4e12ebe335652870cfeffffff8f1d3268346f14e2f446f6843027efe7a9f22c1a5ba094320c3361a8847b9489000000001716001457a6c9e127d842bd5df2238a2210229647bac0c1feffffffd95c7252a1ab4109a5c1131ff80ef3c66af574cb0914514e8a2d6ed569a0c4644000000017160014a7a25a9f122c48adf908ecb9547accb83eb7cccafeffffffee46a6b486043625374635be75d3a97c762e117b78c120e21681ac894eae08a84200000017160014611017570c65f7de25eb159b1fb5fdca086ed456feffffffc568ced040e969c09850d07f2399da2a92dc92e2f06848e1016f93834e0899a52800000017160014dfb55495c867e67c2e6fdbadd21efe63609f13b4feffffffbdd2b0d73414b02af513d29a85ee9ffc3362443cba4ba658114f89be6568bcfd0100000017160014f12891ffd63ba1ac15bd49d6caee99da04927bddfeffffff74e60b256525b987dee50146438c7e1d6524af3a1c6654f686d7feb412cfcb0d0b000000171600146639cfed4cfc3594ea266bd6f1fe95022c6523f1feffffff19fed193af34806b1a418b2644655b1d68b78c68348dad44b7133556bb5fcf2d00000000171600147ddc7ead1bd59fb1de05a56c76740887cfe7ca61feffffffd95c7252a1ab4109a5c1131ff80ef3c66af574cb0914514e8a2d6ed569a0c46425000000171600143c8329d9e2dca493de0b63f6e080d1faa5c4332efeffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0500000017160014de25859100406458be22bd5a0e0b98e0af610721feffffff5072e60708dccb12ccbed883d5b31168286e510b6b4f6789c02682dc9956e4822900000017160014e9633877927224883fc01191943d3e2a2a02dc8cfeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b611e000000171600145f2c625e854059558ad24a14dd3eaa741ef052dafeffffffb278fcef9d04b37c0fd53604e7a670d8fc02c7b183d40c78898ec586b25fb1c05000000017160014c61b60cc9a92959e24e05302e06990abf3772492feffffffc013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c3060000000171600140c8203328942acdedd2075ee1d97bf23c68e9983feffffffa34b6b6e054e601a3fe83122b793003665d9e150e760e72e80d33a209b7a6f9202000000171600144ba4eb7c07b6804451152d9dbf2c564a1f195391feffffff6baad1d09797f0eee66526a081997b96e8c62532ecaa23cf38350d712b7ff73d3200000017160014bbc5f31da74e4acf74f5c42eb6dd557ec9f64ac2feffffffcc14c186a876ee0b508d4ad31c61cfd6ccd8e82591789e2055c40b1e717dc7a6000000001716001496f97072e78f7e2c5c15e626bd20d14404aa5f8efeffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b112750500000017160014c19b2dcc5c4523cc3b88f424b876d79dad1a500afeffffff8bd6094400334155f1825451fa46a8527c05c3a78473494790d948ebc19c82d94b000000171600142b403750f31f19857c94738be4b21b7f0db83b9afeffffff8bf06487284e83ea8058beb0c049770952d48f8ec4e8d4018b8856370bafec5a0000000017160014fe117e06919574f0aac8a79fe26736348c5ed44efeffffffb0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b25920000000171600142089a69091f35801317bf4852a8151eaf5a354f1feffffff1f54aed059f06add709885b933d83624b1b96eb48664dfb0b90749f0404c007e1d00000017160014e3d8f7dd070c33f80ceadb0564e66a086bd5ea36feffffff1b0e80a38b72f0c3c1f5a2860a114137d9eaa679af62d55070bb250930ef1a2138000000171600146dec633b992c9228d461c09ff299eefe9cd673a1feffffffc372ec4c0166dd4c3a5123ca1803554d460071de86cb13030c83fc488857b3a44c0000001716001478f8696e5bf7065509938700dd4583f7f3e6a410feffffff661e4471ad6a21cfc20bd5907632458ed48cbac5e47916db532cdfa67ebbd2445500000017160014dabaac253e5a5a04ba85b54830b1ae57a61639a8feffffffde11a0402d463c162615bb070974894b3d265713d9af25af5e582c96a8f0775d1200000017160014dbdb439bda1fa6892a8d59648884ef7203fa562ffeffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a43000000171600148a07e0d5873ecd3b997c7b888971cbd4e6e7fa87feffffff29b4e10063c7532e95e9681e901de889f17ce821af03f773317945174bd0d36b000000001716001496239f9427d4227d71215aa461c2faf37770aedcfeffffff0116497ab206256599f52c284f7b17b1b55f2c262ff2e281ded5dc5c69fc1cd20600000017160014303235ed74a32489d9fec1b0b081057db40c8246feffffff4ec1084fd5dba17ad734738e09269959755f4abee8e1c4fd4cdacd88c115a0440000000017160014018514476372e4984b561b047e140e3fefa1935dfeffffffaa0cd535b2e093aa4c4a53feb5efb660c7591d0179871c8c834c60e64199cb3e4000000017160014e15a66e59295ee3e51c7f3737e8eddfd7a23e5c4fefffffff89bd5e135c8a34eefa5e1681cc022b451ba3eccdb31905592dff4477f62d955020000001716001481d9644e2ce01ae34175cc2aa945ea327e3945b2feffffff16a9e7efee5429e8cfd6cd3a9967cf57d45beb0921f07ab0d77fa50d63fe684c7800000017160014cb654ac7837a970c02d8444cfbc8260b26f0ab6cfeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b6118000000171600149da187e357237e42b659b95afe81f37351ae1d2efeffffffa2f8bf77b3ec6c564de7b61ed8878b99dd60156d7521495ded3a23009c517ee157000000171600145890c6d900591b1de6e4370d03f6b261d660c2b0feffffffa1a254762861a2990d0f6f7a0d14b02ba74bc48880d38bdfa74a75fa802dfcaf010000001716001404e3f62bfc96218fb3ce0022e6444746cd70ee4dfeffffffd2f3b6b64a58edc8352dd0721531336c02e92262d99da2893de77fc420039ca90b000000171600143642247aa9d480c51c1df4c978147623e136ac7cfeffffff4bb95b5af1ac94cf9c728e296245e03b058e49563193f93ffc1102a260002af52500000017160014a4c42a6923655e7c2093deb71350614f5a1c0880feffffff1991d81c7ceae0027d88121878e707d053b8f104b36b95433829cc8b09a749a93900000017160014477d279d29444200ced4a745418cde458ac99312feffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db160000001716001408433bd142cdb8b504c421ca16643c5ce9c85382feffffff7a296393613d7d15f8a864fbd43031a79e9ec8edb58dd2b0aa972b62f7a8515c1d00000017160014f6eedf4c8632a8d8ee0663df9af38951bdf1c7f7feffffff81b9a567c76feb5f8044a5ac269673ed46a585a271d58a0a4e148e6d40f2a05c0000000017160014a98ca9b5b9d2c04e29dacd9d4ded7bf4a31b427afeffffffe2df204acdd34998359d94bc6ec9b562b468eab0f73c5e797fd3a668ac3581ca0200000017160014b500d3632c2d180c5ed7df5782446e1535f9c708feffffff97ad1ade65928e1c273b6160b66eaaac2f993b3d14d13a2470775e39f8f6f974030000001716001422e9bed31d7745178c4fb8a3463b5e6b87f9bc83feffffffc013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c300e00000017160014408afda761ea861d71b6f5200c0d5cf425635b71feffffff82a84ae4ae3aff4948c30d8d2b433c0970772d7f469daea9dfbf72c69ab522d207000000171600148b9b5ced84608eb0f72781f1cb19f96e714e8c14feffffffb8e49fe9c05d3c182a1bae7f4014858a9d722c9ee69b246825c6d547bef41ab90000000017160014f60ecff3899d37a29d9828551f8cbce954176e17feffffff101921a1ca9f9d0346dd69ce9834611c73fc6e4dc9507b250e3d418f92bad99e1d00000017160014440acafdc7f76a04c074cfb8ea6abb846e134070feffffff8f18e55cf6a7f7f606dc42bc5e2d21c5deb46c8e7bc3f06460f18f7a783671d600000000171600147263a28a48c4d536db848e7aa5999512accff881feffffff0c2e45a25ed938e8d40586bc1b4094b2a653ab5132173ea3d8e624f0e11b66a816000000171600143c8329d9e2dca493de0b63f6e080d1faa5c4332efeffffff589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a66891900000017160014d35b7d3698cdcaa9dd416bd1616be7a3513f494ffeffffff7aa7f046fa782be8b64deb99a70c75f3c6b267c97c70183720e8c500ae9f380001000000171600146931aab091cadaba5d98030698860053e44a2cd1feffffff3603efac5840b8ca933a5df80b32381ffc1804d5207dd5fea70ae7048c75955200000000171600145c5de831229c1c184f18d624497dfdb28c8409c9feffffff1991d81c7ceae0027d88121878e707d053b8f104b36b95433829cc8b09a749a940000000171600145d8294791def6b878695072a8da3545c7f98f810feffffff32247522ba9735bf6fa0037cfe99b9631f2716f4b061adbb620e027d0f6407562200000017160014290b51d4032069394c169a6e6f3ad26a6e32053efeffffff43fb107ee9a9fff3967e489fc35f77b9411014c9de8aed3138aac4d0233607751300000017160014d44170a282434d37c425f6dffdeb6c774fccf595feffffffe1354601be2c44719158f271bfaac17d3725845c895c70fed13536efaeccae532d000000171600141d22905a3699c62064cf86eb5d7c34e8119914dffeffffffd5a88537cc8b5a0798a73a42d9fb19c6cb6a222e5ac8762bf93b8aa8658ffdd00000000017160014e15a66e59295ee3e51c7f3737e8eddfd7a23e5c4feffffffd5dce652a9ca89958cb7236358b0c49da28cf72ae42d6aa154b9470d7ec2b8ac0100000017160014536eab3b3fe25588a41d247353b5500a25d4cc20feffffff09ca753b9459103db7d85e57b3bc1c34a06bb9a486ea5c16d1392bf171905cdc000000001716001423f5ebba30e22fede0cfaa126d91d3384fa18a00feffffff04f4c427fd476129eb51f807dec0704c3d69f161b8e0f9d177d390a221e3e4d100000000171600142be86fe930f0d87a1ff3a1ee981f6a30423e99d7feffffffc6f03024d0973d42ad49ea8921cc3d6b5419cd986dc21b11cd51559ecb3ecfa25500000017160014c85b41fffdc03b478855c9e64d02988de6e13765feffffff1002e0fd009b62ab687b3d603756824386c0a7bc468120a71b77bd999c240fa00000000017160014ce5d30df2439b1da957b5a84bce5ebe47042880cfeffffff1f67a75c0752e17172d03e49a7edc82364e5c32dfe3b3c9c1effc53dd9b991d30000000017160014738a1b0b32ed2d12e403a5a347e29ddfe330ca80feffffffaf64dd859f3d0c5cb6a4f27b64973e8698aa30a386a7cc97c4a807c3606694de0200000017160014ee227798f4b04e749d3a62f6c6d157227e081dc7fefffffff2e2aab1c4d83668a1c7b54a6900a97f055706392d7b1cfe15ae189efb5b6ba202000000171600148208e23dd1332c354ea97a4c04f4349c425ab401feffffffea4027ddce5a1e17a7bd8aca0f49d3e4290669464f2c859ab284d89b662ee44d1900000017160014a76c7e141ca739b69439817690da53d7886ac031feffffffdfa4f397344d76170ea5a046763cece98001b0e3dd794ae820c5e9b91f339ceb6200000017160014504e1a7b4ebc9d2ab97eee35c7419aeb69392250feffffff5b1ce210bc32f2cc64dd50b270fd17f8f212c865a8fc13161d9420176863dcc10900000017160014ad2151288c7b82fc008c7944459eba39df47cbb2feffffff067e40ec13be4ed086823bb840d4e6c451523f276f87c0f5348dd0154606325937000000171600140503bde470315981cdac096de9e18c4a731e4368fefffffff05b4956914a23986b29b8a387150e936c3a63335fba41bef9077637e803d1560000000017160014e15a66e59295ee3e51c7f3737e8eddfd7a23e5c4feffffffc8ad441b6f63a65c65da4014615682f237bf0cd4ae1d378c1ef2b22eb37308d92b00000017160014880baa6ab4acc113bba8b7baa7753238058d676dfeffffff0c78a4e57c545df872531963b8a210fccf9cd9d9a38fdf305b227aa7773c478907000000171600148c2dafda7e243e33529291eb24323dbcfb112065feffffffc1083450d108d5912d9042d80af1c6492dbee2959ac060d942d5bc6afb43fd1f0000000017160014d24400a1b31e67698253650df9b8765907063f9ffeffffffabb33279e9d6671f8729f150258796a1ceb8386fc779944961f6e91b33de8df2260000001716001420f5e68050e302da1ae34c063c3e9c70b400111ffeffffffd5adf6de81c6b86ea22ed7c2fdb70ff759bffb6ffdbb07caa42310a57374b2230f00000017160014e7c7235962c0261fca9dcc89ddec9716afb0abdbfeffffffdb1d6152516ea2fd416316d1de550a1d479669b150976bd8350a8d41b581028d0e000000171600144e4e11ce084dc2a6250410f093b5256eb14d43ebfeffffffb9386bf239f3bd91eae174b259d11ae1a7dd3da6b9c468030a07fa3ed941eeb40700000017160014eda42c8f5a5c1fd7515240ba385d637b0584024dfeffffffd3113749e9d76dcbea04d373c1feb4184fe4a5c29790fcdcf3ba1324e574da2214000000171600144a7c71be23125d8befaad3b941fcc87ee27b7d8afeffffff22436689f3dbab0ff4830dd3f68cfc608d4b144ec46e8200f76f87855084f1af2500000017160014a5d012210a66dcdfa0d902bec804861e5a6d840ffeffffffef46716d5b94b0fb0bc5275a1feef58e11bbfa85ee8b15181f74cc3cf498ebba0f00000017160014f3589026434dd0c4f732822f558314ce144cb3d7feffffff69e63737c98ac91527407aab91962db5d0f69a02c745c5e2f67b984c2a216a61200000001716001477271a970bf0ede0634ddbe0e648cf7f8d8b14f3feffffff2f9b9c482c4d402acb7234aa941a86c879e0460224671104f6803b6d03b112752400000017160014c533a47bb7be2e26613243cad2678c87c72dd52cfeffffff9048016fb2cf0a6c41772a2e47cd4658b9d52fdd5dfa1d78c75910b49ca21e6b240000001716001430da98db0b0fd50bd0751507e6eb51f116f9086ffeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b611b00000017160014779940c4ae4070758f455a6a1d5604791fa55e54feffffff2f82c953093866954d3d39c09cd16f49f1ba5c1e699e345edfe5a5504609ae3a150000001716001498960a779117b27c854f91714e0c027ce1a5b423feffffff0765339803096c3bb35b8e8d83503b4fda3fef1869df242df8602cad939d4ef855000000171600147d42249445cda38dd056849254490b29783c17b7feffffffc35f2beb4360cec36e83ee744c971b747c8f7b79143cf58d9567a77005b6a2f31b00000017160014851a55bf95a2683c36e567d4cf535ac98b1f446efeffffff0765339803096c3bb35b8e8d83503b4fda3fef1869df242df8602cad939d4ef85f000000171600145870c18da1da779d507ce65563097fb6bc2a7486feffffffc013cb888efec2c0462d65d18110dc7aa9aad3009453f83b101bc7bb1b615c3024000000171600140b7952be54038813dc2cc088d6748d39b7ab5014feffffff6ba64d1c35d7a2aaf0495666c1942108e7d727eca5abbb8e619788b50013d43406000000171600146ea9ef1acda9a1788f94710fdfa98d2941daea6ffeffffffab05a853b10a2f49a27fb56214197e0c092f02415bca9ae86878442eada14da202000000171600141e6457ee1ec0c557024f9ab0a65d1c5b19917022feffffffe2df204acdd34998359d94bc6ec9b562b468eab0f73c5e797fd3a668ac3581ca3100000017160014713fdf025ca606c35d9403dbeb748e0143444601feffffff0b7fd3c6b0b51dd04f28dd2d7673b8a26cc67fee11fd998ec749cd73495ff5a81200000017160014101c80d9ac52c79ea589e6982ea8247b876b21f6feffffff36b1d77d5f645003b0d205ab8974c000fad4e2221b9df9e639af53ed4ca9f5300100000017160014cc8304d0d92b6538359cf549289346751343d139feffffff5a182baa289ccadd8d13f9e68a7cd96e449ea259b91490a1ecef67e9fafbfc710000000017160014a4f28c26b23486a39d9d1597fab9009b085bf10cfeffffff6e402fc8edd39ca262102e2ecfc78978e38bec66cdc79bbace94b41366bbfc7e0b000000171600140757a9cc474e3c2455f1f26056082daf37cd6f65feffffff1e66d9e516504a2ae74d836eb6c8ea3de6953948ce550a652e721476c96ebebf0700000017160014a54c8e62bdd3bd253e8f548581920f35e18d828cfeffffff2a27948d74de0eec7dcf776ba22d89d16c3df5af6070a11240b8f49e1453e9810200000017160014538b583b46aa9f1a30ee64fa4777506b1061343bfeffffff722245e00d50bc66daa0459e3ab203555a7a32f5872ca5e04b51f8d87c5e377000000000171600143e17cfa14866589e3a58d281d795f6fd1c23dd20feffffffb278fcef9d04b37c0fd53604e7a670d8fc02c7b183d40c78898ec586b25fb1c019000000171600142fa6c14370d6b59ecfc7f20a7661a41a2f4a3a5efefffffff17a99b5ea54db411ceac773902de4f60c4e47d79ed6005f2d2342ef54a919370000000017160014302eb10c824bf4ef15e931ccf35b36695021187efeffffffecb2e9f18cb6b7f778b6c00a8e509e8d95c229ad13cb93d2c300b08ed578e1a30400000017160014c51a8aa9d6cec3939ab4522d7b8bd6b1c291c2b6feffffffc9571e9b678a28832b48489cd289551fb8d6d29c258bd0d8e5be536739f5ce3e4f000000171600143c0e4c1b70a828cf00b8b6a04a5f0b41bc90178dfeffffff6baad1d09797f0eee66526a081997b96e8c62532ecaa23cf38350d712b7ff73d4e00000017160014ffdd1f9defc5ecbac339634c2fd040ffcfb857a8feffffff3a9e2f8039966e852c860851a9716b9b57cd472d4598ab2bf319671c4f3c04fc0400000017160014caf130c55895d920eb5340ecdfa53636f07c06c2feffffff16e9816d02760be17bf701a9a4065bfcd3df28aa7ebda1b046ca2fb9222e3ab601000000171600149a2d675317ebce5faf81ff9dbeb2836521573899feffffff2da5b0bb11f12a72ab545f8305f881bb3d52802208df5c7c5aab40c7e0a2cd3100000000171600148c394f2ddd249f381e1eb8c8fb5a47fdf5b5dd65feffffff71f0deb871aed32e7acea60c94f3a58893dfe806a0c05420f0ad8b28f5f191d30000000017160014c3f173a4b7eb5fe764643e816cf25ca9251a2793feffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0700000017160014b41e6ebd1cc1267ca81e5344eb260ed604327174feffffffb0db905b82a0b0fd9de3f46f2ccb98fa0a8756551ee10f97e2e84cf877f8b2592800000017160014401790d38b92a9e340217678b863f1cfad377baefeffffffe1dd09ff6c1171aec585d227cbe0f83fcd3b7922c1514d01baeea55d081b04b00100000017160014f257aca15c44cbcbf20c3edcce9e68e848c22a56feffffff43fb107ee9a9fff3967e489fc35f77b9411014c9de8aed3138aac4d02336077530000000171600141c2750ff2c6fd910d81b6422e4be2f6c8ba51965feffffff589d8debfe6df1e438ae3eebdebde3bf0a51d4ab6f1fc20f9d62b8eb167a6689210000001716001476b277c3fa798546ea4adb417c5bb6baae822aa1feffffffbff80da2c1e77f7f39af79b2c937b5bee05c2c380dd2aad8cee659fff284ffbf4a00000017160014f44c6422b99578d931043bd47c82e65630d4f56cfeffffffea4027ddce5a1e17a7bd8aca0f49d3e4290669464f2c859ab284d89b662ee44d14000000171600148af6c04ea5b6a09a7613cf86aa6a9133922bbcfcfeffffffa68b591d5379791472945ae05f35c86c3e8c972054fe1ba290d48b51add2ce7900000000171600148a5614670ba73b772ff01bc6d7ab777a270d6825feffffff4a7e782d12f5395e2277cf2e584a361f3bb2cc91b723fc0de9846079a65abc7a41000000171600148c19f3d2d31abc830edfbfc3aee0365e969a78f2fefffffff624d733610d7999e5cc3ec828754579c63a3bf1c6c83ee7cd36daa53669063f0000000017160014d0c795a14584900a071b756e4a062ad0874a3639feffffff38eb8e1f526ef2fd9eb2abca0555d9c8e9f7a2de9521bec79c6b8b711bca1d720600000017160014de5df9497a461fc11a8f53a724b7c0f9853e4bcefeffffffea55920b15839c32892787f6be35cdb811cec03616422ba479e5e0bbfb677f09080000001716001483ae518dea95b99859552c515feb8b2b18283b48feffffffe1354601be2c44719158f271bfaac17d3725845c895c70fed13536efaeccae533f000000171600140ef49e5dde4b7052b6466193f97f30a81105572bfeffffff3e79b72a8971690195ee02bdb9898a2abc0cb2b2c5ad03d7cbbee271c382622c000000001716001479baf9c41b92843ce636d2f20fcbe67cee1afa04feffffffebbe4797c8aff05ee18de51f319ddba3dc3a72465c7495e5bcac1f55f2cd47fb0000000017160014e57864035af507b889690002280880307e990c02feffffff6a73ecdae14607ac9e1db14f493000784e2ae584a97806555389d4e2bd6b45a31a00000017160014c787b42a75a1d1076992516391a5459fe92c080cfeffffff972bcb07d84ec542bba977ccebd1f2443d844d8438ea2ccbad59985d567b746f03000000171600140a8343425c98bcb607ae431bea9532f534d80760feffffff500d3261deb9173bbee3324b7d750f55123fd47c6fbaedba90d248870fcd40960d0000001716001496239f9427d4227d71215aa461c2faf37770aedcfeffffff73e8733d4e9109fc2b0235b7e6c2c5ffb8f8ca9c99434d0935e12cc9677ed5ad0600000017160014e2c6b01dc1a84773a2a803c78340fa581591faa0feffffffab7520416341476bd6d498dc342d9842545e642a1f7ac1ffffa50fb80ae6f6281900000017160014c070c6ec4314c7702e92f1cd3f003c443dc7bde3feffffffefcfd592c69c545e71eed6102481c078bba9c4d1679c75c1fac965a6bac47f5300000000171600145cb73fb6079ceaede2af58fbf600e72a65e3d1cdfeffffff12ffa7110ba1175e7a4baad2179640ee336cc014e44da9143efcd3e6f2174d2f020000001716001413d0a895e234b7b44b71bce0dc01e39627205468fefffffffe9e975c14312c6d5c9ebdd3ef15eefdf641b8477091235e3d682cde4274d1ba3b00000017160014e5c45c8e2458d4f73ca4240cc61c7fbeb60d0914feffffff47acde9e4a900ae2a25237e0fb93daac938763f071a1f515011be4cc40fb30410000000017160014a98ca9b5b9d2c04e29dacd9d4ded7bf4a31b427afeffffff01c14ef47e9a7ab95c00cbc1676b412b566126ef6d8926ea7f689242455215fc00000000171600148aed733244270a6a6f296dfff6e68a74c55aa74cfeffffffc48719db38d7286213202ef512b180e389ed8f863bd5116b658b7b1913dd9fd70600000017160014af1d01a2f98f9a682a63700511dfc9e178492302feffffff1f2864cfe2b488d2daa3d65f09c43a48086791ad7cdb8913ac4362c7d90826db170000001716001494d236aa3e040712ae84859fc0e932b52b94acf2feffffffea7dc78923a4939d3524472969aa9a64f7ca06b6f66a577faba8e244bb290a280100000017160014877b372539ec5f5c1e60f95b3d14fea8074c01eafeffffffed0b884cf4dc38444fe876863236e812036e107a0c849080ad194a3983d71b6132000000171600142acacc7fbd6c3149fb8ae405353a0c1823804550feffffff53469bce4f0e70f18cbb7ce97c1b80d0cf5a402021a191d8412bedb2bb3fbd9800000000171600141f7da2aab82557c9e57e2c281d5265e4f0bde6e6feffffff9c1b85151a21728370b31bbeeb39cde9ec3aea7eb1984a4deffbe60806b96b0d0100000017160014cd50a713ea14decb542764569028070b4fa434f3feffffffec6a309aa482b503eb383bef9c77d8a49b524b5985e6ed7092e4e5dcb7ceba140100000017160014e76288770b1fe971b592469447cd1ea98bafaab1feffffff01890adb250000000016001436a86c185a6a608ca915cf723c8f10fdcf126b4e0247304402207a65db8178959f68cc36dfb101caec1cb3f5dd8baa120d881f52dd6bde00737a0220112e509afe3ae0e12df683482c0bda8d4adf927f5b080583e4b181ffbca2c20b012103bf4ff8b503d8f50d3a0311eb7b0f38b5be1c9ec47bcac95b2a47a7378f86588a02473044022078fb53541634864dcfbc9929db8551a91fd2e79a29ceee2f1bc8bc9af0c98ef90220352de6b0078c1c120a799465681641079b9bbe971476218a93e7466fec42068d0121034fd15ea3aef29c73b1f8ed2c118a85b5ce13118963144baa149d7b84282cad7502473044022043e060a35def864ef3a9680a09e957e0f9ca73ce2c18c25e4530687c1c9adec202205952722e735748c84ba9a3b8a18a1a741f96945e6501a962c0b2dc3ec02df9eb012103c592b3098758ac5cef427b2965a9045feb7a04eff103bdb8becf3431bb76587e0247304402207962d5705c0eaa39abbc712caa36da94e2ee58bc77e43d878bb9f037509cd954022078989ec0b48c0a0d99f37e03525936805a8bf4b749ca61663106652fef14597b012103982cf5f68744f3bc4efdb48c2cee468e393bb2a3b4c5c8639a215acbe495f7bc0247304402203f9bfd539a0ff9367bd47bc3f40bd07bd004679fe3c68c1e744d54fc78693c150220417b515f3e095a9a10e12d382a5ea60b97d26ccfb70ef10b43077f1567db4777012102dd45178e6d68d5f63db22b81d1e792a40b7f063f1cd2b48acd9bff844d288de60247304402202fcfadf9af4b7011005650b75641e1ea6e40fc1fb80d349295d6fc2f30a754fc02201ba33cedecedb722277b2d49e522e34715704a58adc429be85d76e76a13da915012102238df0f5c3c41e53d9f903e28cde87cc88136548d02e95adb8b19b64250d7ce502473044022011dca498d74973301f570dba0547af9c3f732ebf336db6f29fe033451d0714270220567ef6b1a7559f25010b732a8ab19a04f19053c344ff5a8c8006485e777cd2af012103b54f8d5e9557f0263dc62925b0c725aa787a8e0ccde7525851b4fa1054b1c75f0247304402203ccf98f44dff941b1346e93ead50b961e9df914538bca9767216b2f4e29f2a1a0220162e1fc983707fecb83d2caff44ff7ff17446b1496dcc5181c241481b270c378012103ee7881da3153a8656ae9d97745e01f6e2c765d4ba7b99a15506ae7b71df44d5f0247304402202edeb5bcbad766d78224b5cdaa86d4eaf22721dea7676b210b7e83dc6e80cbeb0220311b5340178895e8ab8e975067050649de16f27889853f5109dfc9f6f41e4f2f0121025b00e200d065be057a6641129666c38b269dd2ce1cd0ed269e1f436fa3acc87f0247304402203a84f6a5b9be30e2fe1e9a5b86329a879d8beaf5e3ac6fbd700159cbc120a71102204ccd266b8102c3b7b9e12ac9b0a20d1330fee954365a8e6f34d583d23e86447c0121024d7abf2650574bd644811e248c22966566fb0ae62ac178ee7f78ecb12a8decd70247304402206c5c0b386ed2c84341f3e6f995cdaad2efd305c6fcaab763acbf75d0e12102d0022034c8a9b807b66f337e6bfbb35d189bdb7d94a935095249ffd65165f2300dd4ea0121033c94b7f237d438d87716724e140684e0f32219ef8770e67267f1e722021433f0024730440220470ceb4e03e1134638ce808f3c04d389a51892be1d8a9b48068e1d58bc2927b20220389075d0f26fa1955699f35ff21a18f2765949dfb8a605dd96f68367f2420fe50121025d3cdae03a2acb084939e3c926bcb1db537a5e6ddafc4cb7c0ee3d6b1ddc7e670247304402203b15feae05cc1b000e3d2c613cd1840357e90a848854a3fd805977ad20877b4c022003486526736ad8143948b119f6d035d866eac7b8edcb8ee4d4e1f416f598f249012103651baf7d5027c6dcb1bb7a50bde1f328e3d8dbf569ff8b3de6a33e8b39ade3eb0247304402202fd9330cedbe1da6e95025c66db555df741962a16efedf5e8788188b062faf7702205235fc007eb5b8b261796f17b815887882a594696ee8085ba1d887b9813b7b2b0121034ec5235fb47395ba2b9f285e40257b45357067a3c750be26d5d3e433ad92296302473044022021fbb68b920c91d429d7d8251565d56580dd99a945e78fe1a399125813114c370220628a2183a29d862ebb986b1d9a9fe327af0636cb181af745783221d2c152363a012102a756bc96900e13e5858e268d03275acce8aff1210c76faa26a09ad74df416dcb02473044022077e280026323cc2a653d923ac9b0cc43895763e41a28d76490bd81f785ae7fe30220447167987cd774d3750281ca6b54365875eed38ff532c563c9c8d3101f85738f01210241c8dc9abbeb06db2192a0f05d9a4a940c24681f2191906eaef36facb23ae43a024730440220097393d335e1d7b18ed8ca02dc1c36e9bbd6264d4e8749e86b289886e203399502200f906ae2a002d5140a29f81c5f2239cba94d70fbd9fe232684072cb23c1cba3501210343b8f7e362e8eb24d65146954e4e9a45c675411b34b9ce6cbd8870084cd605a10247304402203bc4ea49cb25afe37d8bfdfe35f902d2503b39ccd249940b595f970292412b5a02204f4f018750120a88a43e69aff9d7a5a39c061c1c1bbe0ab849f0aa4c242b111001210244e1a850649ab31b67eabede1c152a216de7de4ca357e498977313a5feda5306024730440220223ab99eb516a8157a02a13892be26ad8e207f65d86b238104dc5012aaedd9ff02207c6d0decdcf4ad35c906839443149c23016d7bf80da591dfe07c1b3eb8faf4a701210363bf4247703026f684651a1356f24a116d40eeb8083e083b2c7d8bbb11059f2802473044022047da84b4f8313b05d88ae573fb1f95967ec7d5a5a64c66b58ced85befe468cce022074dea719850aa9b8e27eba9da131ee2db37f02f25a505c8fbc3b62726fcd4572012103f5ff51dd47a604e3623e3f58c03d93a177d57c7581656ff1647d78da510421ff0247304402207f5e74d57177c716a6dc6c94e107688c3e6160739c16fcf56285fd885b5cce5c022019c77de03ba0d2b1c21553fe07a002cea083a2605ab1ba03984a6212ccaf189401210312a455378e1bc973277693c4738981ef1b3c46f7199e66bb84053bdd71ef22480247304402203a12c82f338e09e84ba74cbf4bd61cf0a050884d8bc72fe4129c1afcf1f7401602205158a2684e24876b5c6e41e975ce9c9e7e7aec54a54dc45c9fdae0668a6e4127012103258032eaaf5615636a06270262bba99d7793982a34656686fad0d76e2a3f94c6024730440220623a270303211afd3acf40cce04901808f6947da773e4b387021236fd3120f5a02206e8b7df9108dcc6a0d46d58b5a66f685ea83aa66c9f19bdcf16f1533fe68a05e01210274446efc497a8a0d3db397bdfb98239057f73eeb299e4b45ad2fc9043d253eb80247304402205ef43740bbe02522d041e9ff63eaccfcc91774cba9722d95d865dcfcc5f497f10220072b11c55a962fe34616d13d30c7b51347947f0b92960bd561db6e0fdb7344dd0121037d707ae35944ad693a6e2a643277529cfe8c133a00267a5d7bdbf852cecf2bf50247304402202e9671d5aab0a716750e73b2a5b6795ad805bb72de4c8e875eefde8f08de83a402202a41795d946683ad3a5e7280ba9dca7b3cdea108d6151791acb546bbbcd93bcd012103e107db5dc33dbda0e93f2388ac624241a21b868172ff7c35eba11bd85c4cc37a0247304402202f9c49e04c017cf597614b136a8666a171030444cd5d27d51d2b4c65efe6964702206a667614cedf3bca8af8677b2a4f511edbd952dfd04523915a0fe612c6a94d82012102a3d2053b12ed57fa19cd435509c5404a466a553084aad0dfdbc34dafdb47a3f70247304402203c97a5130987191deac53410127535e5dade6c52c9d01e72d46c6dca6dc67805022032fc21233d62eb46fcda184520515d4a38eff6ce38a2664ad2bf41eabe4504550121020404a897b4a76c79312b686f466240fa88140f962450d5f92375c41e3314844c0247304402203b79c86fd82e0b19e4f9dcf610fec23515b5ec1c0aebc2915d68df458b6baee402207575fffd1852144ed6bba3bb6d3902f478e7b029a62bfd337bf35ec871b66738012103af326b099eeb6a3ec575f50abcdf0393a89df0f3583a5c2cb8ffba257c3d50010247304402203cab38dcbdd1d71fad1e3d0f54518ddadd65da6ae70906e71c24c481b7372efc0220642dcb511665487f492782113a797db5099f20e53cbc2cd68ff1edc6590c91cf01210289074261cd1474273e91a2e30ed7e5e9beb850747641d3723aa02a9218dad40402473044022037d6f1c51de794788a49e032b65632b5688e0f0c0f691fd8aef3b81d0d85d8a50220210bf63c88b2c76ec185d9c5e16e1b008d539be840b59d52cf0293320fbb3b6801210260fac5e0010e5d403c46ee0af15f8369974e45a1c4b946a6f2fca43c0ddb3d120247304402200318518e2805a3fa11dae417a8b02fbfa2d4558a2aa27d6208f5139f255af11902207cd5b08d8f8363ff20fbc6cd1f321c0b067b62d9c99d59315e0f91632f7b0432012103844bf57003241c07842e5c6436fbda93732c5cc9cd78be382524a97e11244d140247304402201ab24a48c0184c6f374b484221e815b2e13cdeedfbc13fd318757fc6c229303a02203cb8038eb1e3cf90f9f09fe88d55ccebeaf72229ef814af4acda3e71a855b5bb012103c77b6f6b94bda07380e7b5d697ad08a5b5482ca958728b630bf5676cce29b1640247304402207458cbb60ece22608448fa1dc2329df254a8b9b2245226824780812fa884548502205070c7b426fa7183eb0739fdb8ee51cc862a02a7278b71b755bc828a4bfda1a50121025b8612354eb2df11e133174b776a3c5d31c4f7ac975e725704c2416ed0453c180247304402207c6d7ee158e87750efab02a4ecdab459983dd1f093f353459aed5f51ecd9139402204e3216dfa335e533c30d4265bdaac73d00e7815c4b433987bba9efe323694503012103ec3901bf2a34d03ec2ddbc3a85c942ec6a5d862ee7291b422b5f2120b319c9ef02473044022050e05f7e4b2da688f1b7c5ac4296e0e539722a5c447ca702d44184ac731fbf6a022053e02d8efc1a994e6fc00f2f27cf069bcd59c1c5ae8867761a53bff95b4b02c101210208f9b0e700976ce1fd23df260623288cc55457973bfc42ef022a57e0f549f9600247304402201eb7f0834cd0b80da25ad29eb18db858abb2a18b06f16f7385bcdff5442b6d7802204e930c8f35d3527c4cf4d24e949a1d9d5a93a8714c34a34bafbdf6b7052991af0121028a08bf7a2e0dadc17a8e74ae9d9abb3f07b5aa36a87d9110a1f42560edcabd0d02473044022055bf56b8d349d49ce42e761d9449136065488e5581ac068b790223bb46e0aca2022049e94991e276d166284de313e351ce972b109d9f1291aa44ffe2f59d6a17914201210342b54e3224258b47ad303c89336362eee7425630bb418c01332575b10ee5d8bc0247304402200da4f5a1d7f2b6818abec68c99ed87634affe66235deb6e120b37a212cce858f0220405e7c95c67658fc5fa8f3c13c52d34544989f4cb961ca6d38355015340136cf012103cb367099ea96c5ddad7979feb5a2c1ac13a01c33b0eb065fdc617cdf50418ccd02473044022054f094daa30f45039be460c708a720c628a620c5008124eeffd9179c60daaf470220589d4b2c919682afaaa396110a51e1ac5d4592c969e9678ff8a80463573a7111012103c3d64e7a1e39abcd8a9ccf9715e06b023d1cb14ec3ef65d1de0bf33876469b360247304402202a493dcf869979d0cb5fd2724bf395c3f1280d8ffa49607e96d2c7ac9cb2058602207571109f68408bc1bc5c602e388d4c09d2cc888a97ef827bceb861856abd3e5b01210375a41c3f4ac53adcaade50ad4becf927c78186edd0453fb660f83180659278d7024730440220367e60426c5e5d1ca00dfb3b286db791d3bd4600811eb4d856cd85bd77e97c3d02201a974d86d02fa648a3d8ca5244eced89e1e7589db7848b46557f5411a749d205012102e67ed1a5223c3f649e32ac75bcdcaf346cb87c8ce122d8c7a31a7c4eef1036e40247304402203d7680ce14d37ce54c850dc1492278b5e57e4b59eba43e4efaf466ca4c946f9802203b2bf54478f94e5ca6efb77e81cb2e071b471e086a6ae6e0c2277a7595f93ed8012102ec4cff0c7232798e996bc40e30e463bfafcb39488da51685258ec35cdad1f3320247304402200de96cc59cb58cc3383a7aa281030f46fb82236f014dcbc789c008c5cd717d8902202a057cc712752e3381f6c22691aaefaee1d2e87c772131e0baec71cfd79e54b50121035eee6b2fb2b13970024de184c94af8d0d26802674fcd955d0c86dec9a9c6427d024730440220408369024abe46f4842a39ff2e9b00aaf275b7af6a1c64877b88ea18e69ca319022034a5e57abd4614f69af9e56e0c2f9553c4b7fcb7a844e6a7a23ace3c9b5f9feb012102d860b99e007d724689c75c7b9dd1a3d2aaebd5deff230311d66f2b98cf3e80710247304402204c282ade3e1f3044e162f52c4620350a9ea5657df961e10e581ed662b5f5738f022069ad2968b7b44c5cafd634e26b2d297c67fb1c01de15cad4d54ad1ac12da439a01210238658816d5d30c69b7ccade04f71a9ddd11ddbd60fe8ed740894cad425eb076c024730440220408a1504ee0620389fe2b7a9e16985e485fe55f70ce09b0ffcc63563de219b6a022012ce026e1370fb7dee5a2a362ff19c52cdffbb72a36c10e4eb42c56acc1a2c5e0121020ec8fc5e86be87c74b9cd344ca9fd80ee7c309c15c4e967ee99c3ee1840ab1c2024730440220486b14d999334d13fcb37b56fb72d3178011753b77192ad5e77cb2932234979302205db1691c5aa0bdd5bdf9b51d9fa674eba85c7f7f5b306a97970ca388e0694d170121035432d7440537fb9ff15dee99416d697968e7cde454299d7bdfe1ec3acc828e320247304402204911d40ccc63ab21bad1ce2bfbbc9bf9e33b5355bc45688f381da9da55a0408c02200e3c1261fe94347242032ca31aa45120966952197855837bd77c484c64cc142c01210365bdd6b8318291f7be3fb37516e8c9f632495d87dc3e15380645944160896fe60247304402205139bae9b6657ddddc27fd19c01e55ca81e566b29241124bdadaa478c85d167c02207a4e64a0b8231a304005a4c3270c12f872fe32e63d88ea022a831bd04377a0fd012102cc71da42b9991e1ee83d5b7c9f10e341318f2d6a5d16aeac5ef6415261a3c5930247304402200f7217cb0c0d9b7627afdd1ccdd9fdf137a2dca2b39f4cae1f007be1c7301b280220775f73499114f4a5a7451628798792c9c4832bbcc450f6c25cfef2478fa85f0c0121020596530ef52dd8fe9d3a93e6dc3925afc8f6ee10b5380ad7a7907e512ae2168d024730440220227b593f07cd244c8d8f8229007c71f6a4c0e59779e329c7dd212d994369376702200665950db4be98d8dcb58671e6dca952d5375d1c35c0c1f58f6d7e957d2e8d640121038d0e735901cf32ac376ecd9a13a0d3718e62649151205c4e4299b42140debf3f024730440220614bce30d43aebf7ff4abd65c174996d38d26574edd7e1de4af035dec0a73d40022024ae1cb6560e0ad259f68560d45da2c6769896147553f8fdf123a0d0e649f868012102a9e7520e116df0d374b58f07ed4078642043a9613201803170602330aa82a25b02473044022045115818222901708e6b87ff7bde3bd631cf53c7328a16a3fe14889ee6a5f05a022020126a6f974bc54995b4664ce7cf847a029b16f114f41d4dafa8dd01f90aefc301210267cb13a83fa9198700d4ac46d4a56dcd71521660bb5029db8a7cefbcb512d159024730440220270944090d226049e9056bfbd86123f82b28f628630b3309837279fa52e54b6202206f345f9cd52abe864ff86aedd1081c047ee9ba2071902a5d1b2dab9fc6a896550121028b132450702208bd3725d14c5d30e2d2cd0a8e7a644bf8df34de4dbed9015ca002473044022062b4e7d3ed9de70bd227430e28bb68662c639ef7d3fad9a630701dbfd97ceffc0220485678a41e5ae3f49511c82504a09894568ecf6afd3739b2e46882a28804fa180121020303244b4e92e1d0e853c7113918a6884ca06b15c8f2c7c0e0a464676f171e45024730440220701ee126f7cbc6655df34fcde7131f4e1c6ea3f6059cb9e49b66d50f1b68187d02207b5f4fcc4c426dd2cc631c9dd47449e75a2be1686d040b6dab942a625c1414c90121020887aff6ddc65dffb03ce6563c7d63d89574961e4a05ee53c527ade357199b090247304402200a6f17974164d9dfc1ce902630da161c140ac07b96490126dfef3870e53957ae022050da575ab081d2cb1cdd216c58ad094e922a5800f8674032869888e7b4055e5c01210304722cfae59f1d296e305e82764e773b8d7152e7f5f6cb15255f2d83c89c779a0247304402206999c19c2e52db9ef12921dab0dd1e82b8bcb955cbe135c2f3493b44196b107002206bc5fd7206e1b7c4fe2ad2e292aa439c85bf3c0cabfc0d2029e2ca19384ad2140121025701d24258d6813744ff86aaa9d5ac0df04656f3e173552eca4fc5e0018e0940024730440220367c3201d3b50481a8cbc9e7db88b11877bf790d58ee3e0aea085accf518a2f2022045a359d03b4f887ff0b0f4bc6a21af349a79c41de64e24a27596cb37e8514c72012103ad5fa34109e60d7346b112e0f39c0cbd3fa2430d92e145420754ee2e7135ec940247304402201750b3bde8c8b50b0a8f3b6d726de9e13410d329d8cff99d2274d0eb562ce3e302201a024933aeba8ce56b5c19a403480442eb1f6890645e3dd7b80bfed95371ac2e01210397ad7434872371fd75405e3369c01740daa89cd06fb3ead2c99c61b7f65275570247304402207cdada2a4dccc8433473c5aac52c305906ff60e68c61dd5beb10f8ded19f0e85022041bcc1bed70fcdadc0be23e87adf4a73fa5ec4f5dca88824af0662b2884779760121027ed16b436c7f88add1644c9fc550fe74766140f249f445c09e3641e14415af9302473044022051829fb4e36174685ed7c5ca87f44983a4a404b6cb5d7b200e312b62f531c2a2022012b3783164681f6e1635e7aff72e719b68986141244f848b7883b9bc8dc75a45012102af231eb9ead38f0fa0ff5ebcb3fcb6cd18fabe7981c72d612babce7b3461aec002473044022038a7cf01c4b1bd1cbd0a7238263ebcb43b6877cda898f65a7e4539445a6cbf1502202c1cc8377294b112b733335c51ace495df99bd6583e111c3ce656ef55a4250a201210396cc4f4ae2653f6f2604bdea26231f08a42d856cceeb59a547921d8cb0270108024730440220209b9da0ce1aa73695e895fcc70fc80549fa5b5aa32b039724d23b8e5495567702200c74e43c82740cf69f0a2ab43f13743be454225c1ecdc8828431b7b6ee0714fb012103fed0410a4dc2a72ddccbe65205e2acf5d44fc151e1888e25020cb10bec8071c90247304402205ef78b3d814906c0ea8253d15ee81ae02a232843c0c21eb51cd3f9204628d3d002204bed98cd0d055a0ca2c53658470d87bf3ff85dc64ef25e086c34376c7b149a06012102c70b68011a030711c49448281fe049ce2b6305fa1a0d8a0b26e94e3a3c783a180247304402202bd84c3002776029a8b18b0a626ea321f72992b682ea40eee13f4fdf565af61e022044210eaa829952dd25d6cdbc7be6b4d59f811a6ba8bcadb5d613592d304fe13601210322eaa6608f97f390f6110fcaea2ec70c4b6c323fdf4eea8e6748c6b3128696460247304402201894ca4731b5933c47c40ef3b5ac976e4d7673b28274803264285332fce136e7022078e69227e1e00cd8b61530903391ba4d88e8427ee6ae4fea82e126445af1b3da012103f366ba7c9258da6d2d6e310864a5d198a667c0a62f61a97ce767299049c09a640247304402207409b5d96d6439fc65f7ea250fd51dac02e6034e1105c60a42f2ef6939dfd9dc0220023f291c8869a18bad0dcd0f8f3f2d5bb1d0086811a3dad8aaf39db3d0814cb6012102be232f0d4b3f75d4977616cac0569f412a4aa0c6b8969076c3c0b90edf2a1b0502473044022018b2d8b9a077533ca7a8f19f8ce0c038a11f85df6f4deec3097c3bdfe05a81da02204ec8c5c0f37fe672b34699d1c7d324bfc06dc8db1f8b774195bedda0796569d6012102d43a8015b58ae9226e7a5109a6ff5f61b7a6b404fdfd0f6d023f2fbdce92011e02473044022028eb9e5e7a92e7ee5e7282dfd1dd5adee46a6d429cc81b9d12364d5dfab0d64f022024637163ec9fe46a1d57c09707581076adbfacf0143c071983ba1706beb630610121022d2be5cfe49a4feb53b9dd0b5b47be3a067accde9bb33db3e7a352eb5e6dd71c0247304402201ba7b1c6ef6e2d7a8e91b06e9d2ffda53fc1ca16735fc724d295d061a9a7b7930220525f51f1324191b55f90761f764229d9114628fe94e44af877230e40552ad22801210342b54e3224258b47ad303c89336362eee7425630bb418c01332575b10ee5d8bc02473044022018bb645f71dc159f8a62b1a52f6ff1c36bb740860f409bd0e9a7539ad675c42002201fd0496fa23b868275f7c9feb9541f001e406ded81955398ab29818ea9deac0a0121023fe6694cecad624b92a0beb3a389d64040f9e12fa715650a75a1050b45c2b6de0247304402200fd1dc0e83d112e9e41ca658ae6cebfd89a52ad0f9507f25ebd3ac95a2fa2e86022049e80954fc04658ec32186dc3cfabdf0645feeb2d9a3cf9fd7b2247e91c67d14012102cdead0b58209d928875ae06f6ac9efa242dfca3e0e59946fdd1212f1f3a37cb402473044022009a915cf97af0632b06159fa62fd329beeb60aa57773a3370ffe96e744461df2022035bf5c1e0f912b0d268dd2aa1af671f3306d329a499bb0bcb905717f32d6ba0c012103b88c5a5535d622296e5fa3826f8de7deb739c27a7ac04ea37eaf3b4696ef28db0247304402200097079950b3824324d90fa0e17eee5e5ec9ab14e9260f615c6cc036aebc126102203585b05f420df4cb490d1d8367d378ee6603681b99b796e6cbf7f537b095539c0121026b28a94f69a0bf8f5cd50b51ff2d2517661f5080fffd9765db4a7c84ad2436a902473044022056d28fd4bb30ffd1b0d5f50ea4ca6588756d6d4645d0371e674282fff1152bb0022032d9f0d58fa6844c914e5c86b66039f53557cd33cab9b71f6f4cfdb9577f65de012103f01d23dcf955ac0ba8e9942093896d2e3379314f31358ef0944618f97119bf120247304402202f4dc51c898bfdbe2cd8c32713267bf183f8e260f892b08e324a549532ca2c530220188de1a486c277f52dc0b4e36dda9d011e2929f1cf316cf8e4dbd2785777dea0012102e306ece133e6cb860cfeab0f2b0c8d72c7bbb941bed354506b6bdd51ea81d224024730440220365004471240b7996d07ff923d157fdc15cedea775688d91eb95aa31a27442320220433dd248082ad3c1c54b41d884e6004c857dce74ecaaedb6bcd5feac9e3f11f0012103586f8e56b4d0b726733d888ab58b57068f7a506dc60af9741e5fe3037137226d02473044022013340d8a2f9e697cb91587b92c2090cce5bacbbb530dad693cb3db932085107e0220161eb4a87a473988a4073ba56f902f382f8088e4eddfd398a6f27bb0499c8fc6012103078cc114c442ad435fb5d464f5b788ae4e048784e6d640c75af2651ef6d71e7502473044022079bec3c6f9c25b5d5f45f2b83bc9415cb47367df15d28fe07598869d2074b06d022034cdee1956c0a3dfd26b2911ad879e759c50286efe01857d56825340d95d6fa50121036d2d66d6a7df4b9229ed7964d3e77d613154b4a50174737a71b2c00aebcc44d00247304402202eeaf695464e1d35f9d1799d988559c57d6c03168774f6fc392f467438514e1602200ebd53d4f12e217a5c12fbcb0c488a700f735b15b004d9da5143dbcee759cc3d012102992c345e8e2d78d8a5990db66f1cab03e378bae05aadb15e17258f66fe9363070247304402206df721bc8772f6831481b197172d79675366770871cfe01de7da6e5647942401022028cbfd90e7787a3cdab4f7f1e64bcd492917ffd92195e974060f502ac127748f01210230eb5e2d290e66ed5c90c00a5c5c25d70be9120a2e8a16693f51e4b8b7aa0f8e0247304402207df9298aca983082667c21820dd3e16a3d783782e4b0dbb27f30c9c1eeb67aeb022059a2e832a82d1b1c694695b389b0740c07238416f9da139ced787cea102273ed012102aff4fdd04e956c5e56288a1830265f7b14e3996e2beeec5c772b4b9d3b348c5c024730440220046bba1e86ff85275c218f4365c3dd1ff94bc19e542573f0dea9781e61da3dc90220113ba43a78966a890b438b3fd403bf442eae86c072e7a6cb8f60cecc750af6c201210352a64f3a4fb6540897bf4e7d20d79398921e56f6a1f3ff71b6b2ae469900b0d60247304402203f111e258df7f022fc6d2ff3fe6f554e57b055f1257ccd2a9ca9bd05b4757bb6022051232b67314a0c50f7544c9abd4d6bdca1ccc8d7224d2fa5fc344be8225a7fec01210314e447538cece9989da482a1887d02fd434cd609459f5e6cce2960f5846a72a50247304402207d22cf87d516b8db425ef12c083f37cccdbdfbab4b1e958675f8db93fdb96a62022051381f99b45e60ea620c16ed38a79758da29ef182a6e19484fd3e79a0d6b8ba80121020f873b7adacd648d674e730c2dee3d7fc8ea1248d01ad18be7d686880e190b25024730440220089935879cb8d92dfe52a7f9983b4df2a16acadabad10593dbe7e378bdd321a4022063f5438f1755cdb79d645d3d1c3bd42016f6c34a131965f36d4c1c80f94a924b012102f6a4667b91cb7145f5a8b6c866df00314e489c1d1fddd4d0e61128336a7e7c400247304402204ef80397bd854e5748c06a48945b754fec4d42d63a18e06e2df620aa4acd2907022039eead6c00445ed41556d10eab0840b84d784e0fc76ed517af9801002cb29879012102a05087dd0ba36d4dad2f35b8def008346ff822b272ebafb90824c0c46a381d1a02473044022007f9de728e675078826abc480f6487678844ef43361671669d40d762f150deef02203afcc3f6cf6095869e38900d24a41dd1a2fb13be35aef22b92a2fb2f3c452a47012102e127fdf7bdf0ef379739084ce8c91d8b2e4464a9755e5374726e3b0bc941f2920247304402206f692c70cc9a1e8d20c2376582032d391c27f770198919707acaf3cd82447945022073df6a9b08964b5975a99647b65dc8d10b3992f38daf01589c3ee2e19acd0fc801210322de4650620b6543112006a687e1b8d0b64e81f6308e5487a6ace5ad67c569940247304402202614ad204ea899392be3ed5744b2c79c471c12674e06aa3fb5142567bb59f27a02204da6830fa9d615deebb3230260d6e3f5e96547e6d2f6594de6b2cc0d8fec2a640121038460648002de67efd960ac0ea533569ecd08e92cd866a3725a94ab9dc9fc7c8d024730440220642602ec38150fcd7d83f396dcf1bdd9f7cba1202ff1b01648f38b98654ab2cb02205a9156771bdbcd2d4de89ece5a15438f99238220e815ff3ec26a5871134e13ae0121028f08480253ee36ba3036b8e799910c558871757e54bdc156a8b0274d6a27ee8502473044022064a6e89d183931fd3ed718229f55af32eb0bee7deffbf07ebb07258f12009672022026436962e44d81caea9449e5822aca07592d3eea82009604553b6165c9a076700121025b00e200d065be057a6641129666c38b269dd2ce1cd0ed269e1f436fa3acc87f0247304402201ddc90af731bf56c42d152ca80c591096d364d828a142bfb4f81f6a9b75412e902202abe55cf3e01c632c85d21ce1c394c4d1cd5d19486c7764b3761db03824b412d0121023b21133f369768f2696c32b57d169b3df8d38e2c66279b448a6aff13574882220247304402200906c52138b7c61f9f24ee287c45b9bb42f154a1ab95f31b31ecd7c6c8a70f9802207ba13e29de2e42c9f0434f050d89c334b8b7e0f78c8f7a49a28bcc742be142370121025a561fc9d5baca1973d4f44f71a39c290a3bb9ae6560b31689f7725791685dc302473044022028387370260edd70ef9b23d65e3fee19b1675e3ed19391bef50793096e6e25e5022046605374a4ea337e717fba0a1bc3a2d40673743981ff70a14b28a9fb6e59c501012103f5c78131b68be2953697a69a65bbefd3b366b972a4e2502f6d69177df40a73010247304402206fbce87c321a46cf1f504b77656a98262127f537ccdd02fc6b6b0fcf43a240df022026de394964e1a48dcd6b1022eea6d01c503475b48c903126ae68cdda03a27c36012103e73a67195bcb7c533da3f95f3eec9faaec993bf0c7cb2f602b2cf34e62fa194f0247304402204cf71783c60c41d5bc0389e4645f94118a8bed7751b94b5e57a2c51468c4aa35022007fe215d6e49af0d8928e33c594549e9c6811f38338a32a99de82a23164987f701210275ba776b3f08265a15ea5187004f3bbd23c550fb8d3738c56a18421d9a429eb602473044022012ffdd3ceda682c7b07abb71d25ae171007aa20dfab84dbc256af8add3b6737e022056d8b3024fa0f76bb6aef5f1686abefcf25a754a9f601e676b90abcb4243da190121039a35e18fbef80419abf17a1496c8ee5515776be1229e07d566e5e0718fe0e5be02473044022030f86d72f646032aad728c6eedecd133e287bff2b8e9daefcb2766bfc7114aa202207803f6a0bffcd70d4827b6c5fd8ef87e776c2f7971f91a68396255c51753deeb01210294f9011ffef6f4a8433c636d50bd9e6ca9930f14c448879bd1d8de76e4775b7c02473044022023b1773d30bcdfdf731ed7eabc82e4969f364bad898187ad4e9f96012144c8f602200f2c33ce46299fbfc1c2ef0bd5c01069ec19ad5713d2458bf955801916a65ab301210397ad7434872371fd75405e3369c01740daa89cd06fb3ead2c99c61b7f65275570247304402205b0e834703064f744e532d0d60eb0614e6ce5592381b6c86b1087fc60cde1047022000b2ab8ed0bd8091751c07f5a5abda82152bb852d925964026f2f7baf9086a8c012103c33178010b0bdc28d4a04125aba89c7542e8af516b6445508de9481a147b30ed0247304402202f128814d7b6e3e91425e485960b7364e35b388e3468f2a79413d582f15f5f8102202090573d5e9d07bc195e60f8ba104d5fb944f81168f05dcf68422260c4a7517d0121032922988d7bc3c7e2aaa852392ff9f1c689d67b2ab2b025757089a2bbe825386102473044022031d431f1556dfad613d5f5d514ce85812665b49f3299e41b851192f3b817dfd90220583b1d5b9783d3fac8fc78be51cb87d6f7b66a1c6ac8fd89ef6a895b39b39774012102f7346bef3ee1df4e7a3c825eae8aef9184bd566f1dd61a942a8326093ac971de02473044022079a54a146c868541d851464a0d3b9b3069dd0fa2754b4b970414719e15629c3502200e55a495df45332179bb3b51024935b52dd436e28b577b87c187dab4112a178d01210329251152ff32f10ad1157b4359fb04e027e15a661a071289e8ef53b7522a435d0247304402201f934d0c9810529afd281f62317d973114a5deaf5fa8aa8ceb1caf661c8fe38d02204270347286508ea15e15b22b4d0664da86aa46bbbd3db1d5336a82a62fbe1b580121028113ed92618b03757a6b6568252479d060b6712f032c6b9b7646d017cab8b9370247304402204158cffcb9ac3903ea67f54a173ab2a5bae965f378b24520c1a8e445bce2411902207408407dcf88998708fcac65a098f8fadf94a4c650c111efe304835805cef2c6012102e335bc727a0cb612ecd47decb004061f8823fc6fabfc8f4788191d51bd2dbd450247304402201e202433b29cfd6cbd97e2570e412328c6aefef393061e3d278bfda6845d17f002204160618ec27efd6eef35e6d4dec9d8ff5ebe123a18a14ddab7340879ea8e65fc0121033ae2ad0b45ad461d44849bc10744facdaf01c6754ab9b0c1972d1540b5d84eb9024730440220486d433323ec0eecb9643930fef8d3bfd6aee7f3504b0b065d35777ae8ed4f480220062c2bc2b9dbcc65ac1e903e1c88fe7dbab378164584edb3ebf6cdc8fc4d882301210230eb5e2d290e66ed5c90c00a5c5c25d70be9120a2e8a16693f51e4b8b7aa0f8e02473044022000ad10058619ec35e7c5d16d0baabd01a8de15decb1b1fec0cf555533a3c4355022079529f8cbd82d544fdbe8dbf1055698e5d5d28651c00f410f38a5aacdf519e610121036f960230e93c431c2a4e0eb87d8b1ddf6ef20e339db6f2aa862bdc11e093656a02473044022039cf8eefef262b8fcff264d859af2a03c26e7e4461d7c20426cab2df2fc300c4022064a497caa872ddd6ef2037b66765686898ba29add5f0fe1f25b2001f387aba7c012102f17d281c1dde2313a5ad61f60c4479abc51f91afbd2ec889dc1ff5b65ebbeaf402473044022028efb5625d01382be33bea2b2eb100116636b302f2612065420e7ef2136f1eb202204d27b87dab7a8e779b091267689424acbde9c1bc0dc243aa0b98e17779c5d98d012103a194220c84ef3d6c4d4ecf89324a3e3250c699c68d4d80fc893be989a30f03f10247304402202400c889965651817d412c15769e17ffe21da8b31d4236dc752049b6ed9bd5de02202dabad21efe0f44826ba24c5bce232bc7f74bfdb5846220dc41bc7573ca11f9a0121020708a1a1975737fa45da33952006b903c1bc40a3838a251861c1d40d7c127efb024730440220519305c57a1d4a359beb612541088a989f5ad83d0702753925f62cc13a96435402202872673b0cb290491382f0e8d969afe3e52fd93c1ebe57020dcbc7d64cf2537201210241fc4ea262a8c2de633fd79991eae78dc0a5cc7e8c94f80b930d7c1c8df3351f0247304402202125487dc44db8e0cc5c3ac67c7c7ac2a2838c6f52995ee7bbee8b00ae2dc911022021418479b844384ef6cb6b8fdb5d20ebb3409d102daf62af1d813a457621483e012103633e4e6c7310e082d3ea2ccbc3cffed5cc0b302cc82ca1c5c29c07c81c23bbf402473044022019720c3da11636350967bb3f2c54611747e2c8645d1ad44c24f8226d5289b1c5022031e2647a7180d9113e50d794673ec0ac89cd2910ea39d009a6dbc6376af93c4a0121023eed8711e196c26c01897a2f842f9dac22de77315e70d9f85fdf40612c4957ca024730440220015f8952832e546d09ef1a21ba37a8b3124df90db78eb5a407a3077e2d602d70022019e2d945cda9fe650a130d6d886f9f8821ce000ef9b20493cd0c3e30791e36e3012102353011175dc7b6c2cec0b07850b5077488c04857b78af5bb6d16335bebccdc790247304402202fe6b8088bf832f974fdac53df0ba6f1efbf91d723547a7a02414f70a7fcdbfb02201b94233dd3c8bf3038505ba383f24ac2b424030d263433613383cb44a9f260b40121023478d62b285e0b1e87bb2f0e9c0dc41c42b7b42a676ac28662d621ca1a3276cf0247304402202a097d09dcbc2c7843f65d10b5146d42928ba6a6f04843b6b3de37d1a1e58be40220596b277ea5f58d7cc2715544054ae5ba472a5fd4969631cc26e7e4ce54a2ed340121036f5c9f430b6140ba4d82fa583ebc8024db66bf0a533c42f3abbf7b6976afa85c02473044022055485054f6eb3c5b29eba11109f9ae22c0f7348cd6005f6d257680fc63402d8702201ddac389f6a5c080226159cec58b62430936e963697592f8477a8f9d5e7aef330121033d68c25dccd9b7886901a9b4857332c2dafbea29de46bbe5953d3132bdc8e49102473044022008ad7d9dc97b3a9baebedbc1340dbc82da0453f5fe647868198ea2bfffb25b46022071359ab0150552e26c597cbcfa21155d4d7fc5ebe484fae14e067581e98756af012102f5402f21c03676fad2ec31ca537726a9262742547e7f4d499b74e5f0334fa4a10247304402205c96505d5a1e3f08e8d52f096e81ea3a06b5881964544eef8081e0374ce337f90220698942745c18d4c1f2c56f83c51957dc2d7ebe7b9714a24a08a3f8dfe1a6a24801210230eb5e2d290e66ed5c90c00a5c5c25d70be9120a2e8a16693f51e4b8b7aa0f8e0247304402203b85f3bf9a8f625660295061e92e3ba1a20fad2a0d808cde92cf3f2a22e19f450220761727e189e815644eba89c6c60ff8a2a48af02eedcf06237b188d4ff3bc3dff012103d4e8e521735919c2af448b69d61ad65598507180d05829a336e9a51e18753d46024730440220178d3e2e5be38423b37049d1307e6359404ceab490c2a0df9d1e5294ddd8116e0220193ac1e09ceae3f66feeced95f93f94588fda66bdb13dd8ac8c4f8949b0c63c9012102c9732a1add626fd61d347cc1aa321f5a9661454182cd7beec364e377fd92c89302473044022033434ef4072a7f267de3541a977ed817c32e69c618698b6aa27b5eea80dd2d1b0220275e0dbace8058ab45daee4de7c142f8cafee01df538ca818edeb0e5348fb16a0121020180f4b6987db81cfa31303ac56f95253292ad39121544fbb3af47650c96420302473044022073621572160b8fdd6ea8a88d76405878c5ab1f26a2ebd0cde6042b806ccce9c90220638113cb5a74617d2db794898597e2ab44bf48af9aac2042b3509a86b9bd490a012103e6593e5905b6e3dec42e023bd2460cd92b55caef897ebe881c72914b04c0a56e0247304402207a77f461d1536598e37ea5192132f7eaa2cc889dae1da2eb774070a8741483cd02201aa068822dbca9de4601d2eba02607682ed6091e7836166e21f41fbb098356aa0121031822d7dad7cf11c3e81826ace6ae74886cd856a491d199f06d210b286dd2f5550247304402200f2400db3359ff94901a7f9da13e1166d8295ac9eb8f1f1ac88b4f9a13cfef7e0220291dce80c8b89f1456935ef64d1a67162020b0d890db16c3a33127ab7d55833e01210389fe3eac4f3b5a7e4950b421b36c4ef8b7e0f37f2b084bb04716d7b32a2fd9080247304402202e3b4bc238a1f0d9acc19850aaa2e6d4cc5ffeed7ab0a9f8d186384816a12057022037bbedce0689d2e9211ef5cbdf59d54e454e788a303ec170da5ff43e657306b30121034a24ef017af7c56639935b945c1a1e256bb03d18f70d26e315c437d368c654f5024730440220260b7cef5eee9c43f70be65d01cfdbc4099ec4847f74cd966da0d7c2cf2428a90220515d97ec6917d20d28b305a7028b614b00de6ba5bc6068a0a85a5f170ae3eec90121026bcfd9ab52a882013a88858701a36210bd81295fd16e96497cd558716b1e769b0247304402201590b8d7c7ef21a601685e32a545c216f1140ed2425b02d4c30446bac1611ba402202af483e3b9f2878980076796c7f6b3462691c296f56867749b8c43a4cd8ed4db012102cc3965058fe5c7f3f0d7e6d077b8ccbfe5f9c8004eda0ea3b79db3171dd1586a02473044022070e2e2b75e2be862df5258b8faa87d9d866083694424b6fecd46baad53fdef350220165986cdf93709cab6118cd699faa9d66ba5bc1fdbe22abdd9739f803334f303012102362ee1145d60b8f8e93d43d1e9b5ed3a65a94918402b50d848bd928a63e719450247304402206d3137e782ad1e754e4b81570b1001b789c59b632acb0fe50818edcaab88a3f802205d3de192961b0b609f3cd69029552e93df7e92c26716b8c6bfa34b8d63b5954c01210244e1a850649ab31b67eabede1c152a216de7de4ca357e498977313a5feda530602473044022036f65ff87b7a9a3e36f49ed49d35fa8f9d5e6b82cfe9bcf7017f764f6b30ea2c02204feddcba234d3443abe280c7d731a1989adc4641b5d853385e81b1bd9da316730121035cf2015aade914ad19542a7b3f60d9b8480c93698d35e9ca1502a79ab3cb96330247304402205de1c405a431b5880ce79fc09f7dfb6d897928d71988f12f7f72eced87f9bcfd022075c49f20df3d1b669add8f53fc7f712ae9d0f1b390e8968c47fdb2f587c88f86012102d68deaf8bcbaa0d34554d55e9fac44cc26947a25662860917a3d18854860947b024730440220222ef1c5b45f692f644e1b769e24e6fa5a00263258a506b121dbb08fd38c0d4502206172602e09cbd9ebb54ff381519b4503345f07e80d932d3c2eecfe06d2a97158012102d57b72ecc69f802d9ae2d9722e2acee5c23f9f779f6e77b89a39d822cd4c4610024730440220264ace7006446b8fa0aff843e5dfcf40b86e4b5ea17ff262da897731b802978f022001c36e1fff11b41cc2a234a451344d5d251f93b4d7b17917943b10da0a08166f012102b546078ccabc794c45e94ccfa4158cb1ef0e9a7bda1312a490024888a577090502473044022015499379de4604e2913f21aeeccbee37a0df87d93e92f8efb6f1b8dd2e1a873d02206c2df963eb325445cf06faf7727abfec2d8827887c9999cc8ba610dcacdec85b012103774643414e3be07f6a3ab30088230cd05aa568050cee51261fafee151bd5461a0247304402205d4c9a17a9398cc4c9c702dad537500d6f47b2301a8b68f587dd2fed8427cb5702204f4a190506797350dc36eef59909d94564ffde11b6b56dc42ca261508cc7d2e201210282ecbea7fac91069da2ec27c6dd577d0101a9e5473fe5b65937243738c49c3ba0247304402205efdc28384e99b5017933756f929f08a468e097f527687c4abb986b30a8e0a0102205b540e11d78543cd8173eee80cd06f1586cfcf5cf77fb27e112053d0dba8f69f012102a28affd6c1de0df49e44d3ab263ee5db6fca7974296e04e467efc6bc82fcdd9e0247304402202a98117723e9d1a79867aa916d8c4cb05aeeebac4832c6df87e03b4323726b1c022060e1cb07dc956d451314c09fd20d82faa7aa03035b355db0e937b4c5b70cdd3f012102770ad5bdd5bff0a8ecd400c707cb57a844528f470290668dfd44cbcf240f003d0247304402204f62e5cabd2b4541ff5d454799598e60fcccdd505e2e93dcf950392aa3fff62c022058fdfe201b05de2dc63f4e42b47b854385c09f6569d7590405687617b2492523012103035ae9c7dd349a401c7fe364e7ffa559f82bfbe923de4e734500505ca4c6b4c40247304402203ef3c983419c5c586ac67448f981d8eef13883945bc79459598d8c5544d336be02202b2ca6d6274a8c65aace1392aa6147ab25fa2ed2a8c6d574c42571c4b2e23a660121022020174ca5c20783c8fe7c6947219f592ee89b08cc36da1ca31aae3f15ad241d02473044022054bf693104512739163a607f7af0154e23b8ae74efa6cc9bbf61eac85951ceff02207304f85d081f4a63931a5b5d1dfb7618caa61c7d9726fe1cd60716fb4026b3a101210364d9e2c1ceafee63d7b86ef389dcb466e739a0ccf539bf80853e68bb9f18a3230247304402205bc4874b18908961738126b53c7f09a485f87a5d05527b69af09834c7c7671890220150ad477380469ac8c9c9a20d03663452645b0c91b7331dd1d4dc280dcbe137101210256ab1e35c38726b6a6d324e6f6e71b7af2257a519c646b7c9f28a69f336ab49f02473044022006434266d471b2095e9f95c908d364fca607255f2de37b2d9f21358620f613c40220494201e188575e7aafd6a123a27a882dcc67395369e20e72ff1395560e10affa0121025b8612354eb2df11e133174b776a3c5d31c4f7ac975e725704c2416ed0453c180247304402201838bc0885a66580e7d29ec1e7f67ef8fb5750db3f146918958eef269935fc3c022019112b7bf2e7df9db7dc2e38d4e4010bdc73b9142fbd59563037f4da6c4c08f101210271bc7f52a1e41cce671b5606793242163415e41a9b0d2291bd6b36f7e46bf3800247304402203fe574777a34186e701b625276763977c846485b9b7f5d44f12ebdf5d3cf39ea0220549a1efe67690734ef8245bc6034344ee2fff739815ee2a4eae393d216db655a012102b89b9e9441ce167d82400df21a2e413a0027784b71696424d3ae226c493b60020247304402202cf3c3b53c4e8491bd4a31e03db35b277a473466f380a141da6425da78235abb02204060e89be5b9ddfd2d9dac6cc10bf111ce02fb66cef19702fba47b17b3c3a52c01210271d3ae4548b7a30f6dadc7be3a08dc2f1dc5bca8b4277bfbaab03c1adec372290247304402200bd58487f4b205b6f67786bc584a9410de3c535817eb887cd9ef728df111ca7402203024b464b7076080395ee91db87abd85d362c3d8950143a0110c44b7c94d3671012103aa2895338190d0be5fa5d8f25d182858bada198266ab1f698dbeb7c0a22c2fc30247304402206abcc7c3763c72fba2c53c436d2cc789c474a6815340264173194918c139e6f70220760d1070521393186d1b2070fcf6d26f96e89a49762f92f7aa3cff8f7c0cd958012102602a4d2e4f767eca7bf789b28addbcca8f33688eab166b8ac631f6e60e528ca802473044022038b5b789f276f9471a7c05b173797609b5d69ccd384a2378c07140f1ef3aa45b022062d638567cf97c27f67e2af38374148800302708b73b31b4e80c5162ba859901012102e6ea54e4335a05ae2e28e14aa9dc7569994e07c5bfa18ef3f8b70a3f456d5e80024730440220777c1dd3c7b074c03afdbc1384352d6256c4e998a74ac3d649f9478f364ae7cc0220247df44ee84bf011bbb4ce3bad0ef84afe451cd2bb818fa4867c6d7468032f17012102125df27fdfe49ba51f792a17de2e12a0326abfed3c54bd2547aba8dd63f1cc7202473044022033e32abd1b6f0832a876d57fa57908a4e81df10cb3b3d2c9b439a786a18eff9f0220629f6ee345af9c190270e899e90390470bcc0dee73de6d8a84bdf4ccff753ce0012102f4fe7a5bd7c67a92e6077fe9182ca9ee2e24097d3c6f8d8c2c846f9ccdfac90202473044022029ce63b61fc359d28a455bbfa953c3212b52b7ed77092a5ab597ddc1d0b48ffe022016c4d467dc273acc6fb32414392e31bc3d5589804a6a419edcb32e609f813d530121024bd11e01fa7bfb8975d280b189ee7906992501ed391af981ba2819bce83c79270247304402204f5e66ac18833548912abced93c6f31c950cd9303b85625769be275347a81f0c02205113308e7f7cc2912e98687e7eb47392eb0003c9ee848b42a5082489c2601df70121032ac8834127be17ba878dccc3defd310ef7d794dbe8814717d598cb95be4a850402473044022002ab75f94a376378205f8cd46ecb548e3e24791f2f2d5b58e706ed5c9bcfb25302200f58c053979e678abe63a0da1f67f908c902079aef1f0a1cfe6ae340f029182d012103008c2d6e3a99e6c8e7d2681cddf859de61d493b01ddf880d592dbd6c5a59614d0247304402204309c0728cedfd13cc0fe5e8db0493097ac7f74958fbd3bc1ad0fedeb365f111022035e9674f4f453dec8b7cb3b1ae6e149b8d695e3f1be258d2949d03787455dbfb0121034ccf99051fcff75091df3ecf596a2a142e14e57150357cf94f93494f5746d8610247304402204996339ec24993ef07783d89f96e6eb3d839e957be7721d2250e3ab89e1912d402203ebb4e468edb0cc629840039b78a091f81bba4d0cff33e82c4384583219a6663012102909b1419e58a815389901e9278664c07b8e94f617fc4e134436927b2c8f728ae0247304402204878ae8ddd9f2bc7dea6abf3274a7585c15ad0a0981d42099c7b94bd9898807402205f9d81b8d8a367a48478d1fb1b084cc00dd2602b1da378d659df9d5816f5e06a012102e3561bd8b695ac230b0be70fd72f28812cfac08ce8fa50bb5b3746175c22779802473044022036ef68579605303074915b6d5d6b2e1bbfaf7c0853cec5757c510574e5031c0802207dfafbb5b4f194a99c5f3c783a68964cccef1ef7863269388c19d518a9cbf15a01210389674898d2c64e5a073bd4b2898295b0c6fc9b08c352b898422bd24659eb819002473044022064cf58e43dc5989b46b3116bbb09b6044aa03010e2ddc55992c7550671b39ac802200e77b88fdee3bab82bec1bcef75018c4cc96a058f934e251b95a260042fa87530121037165af8d2124ca51c1b5cdb4d084a36509179a4e79571d3e09ed1f1f36195a65024730440220700225138ca27034ab477a9b38642af38a58cc4867654c48877c045aa40e945802206e4f60f387138386ca8813e7f33d02a129f3d0e22f8ca1ef4346253b29447a530121033a817c13eeda0ebb3e8ce55627015c8a9cb38f6fdc5703d77a661b30363e8d2d0247304402200c3afd9e07a502a096f6cf41b1ac26b3be58565b1f056627cccb7a4ebd20dd8202203c1a7d19e28031c829b35cd0c9a826a68a6c8b3a249f243d7b2ad650a2b6514801210296b983a63f7c37af1b6908acf18f8ffd73afe31ccb4591c27a9ec04dbecf5ba50247304402201599613d7f444fe78013607eea5feadb0f33f12d43567f4d4a294c64c2eb0071022016d410bab78293d06f173fb73e30654d2f95840b27d30deca46021313fcc23f5012102d4825f1f9d8c8610414223bac6778ed288cc5a303a36ced0d24200cb656638450247304402205e012cbce495e1851774109939320d8ac83d152f6a980e2b1c7799382389c0af022018bdf4dec78b5aca03f21243b49ef52ae84ff4074fa708b6a9557a2708f51fab012102024451aa3375ead00676a43d0c14204babac6480a5337d754f5d625cc76550c002473044022043040282c943037e4f7499f0a8a0d159174bdfb6bb1f0b879065b8a6945bb469022001da29afece17419ad668595a3f6c6b1b8f0450bf062f3b5f6098e7baeb6f4be012103f8fab9f285ab8486f71677066c33149696dac9fbac6f02bcb45cf6993f5c153502473044022071d1ce22c8ca1ec72776f2e9126403c147e6dd2c7dec6f62319af7e81bf2dcf5022034cd15cba6999c7998addfc71bb682c1bdabed1d62dcd5755aa6fe20852d8c87012102f2cb6a64eb40f093b616d6025e53eff480e7bb84f64d4bfbd428b0be7e85c30d0247304402204dcaf740f58b5c33f774688a147224c7c79ab17e52b46650c65cd29459ad6707022016687409287d811a2df752af30b455d8c8f9c082efee8f65e6070413a483194a012103871e2e091008c7fc8da7461d56cc9209792a2c2e9d1be2cd1581f6b4b1f1be4d0247304402204858ab664b8db5f6136cc5c055ec0840a219d4988a84e949155d9e368a64eadd0220652c0303de4a2a92b141fde3a537c11046c98c4055694da39242854560265bcb012102cf55113a8baa991c9043e7b51fd505c1afa7c4da5851fc6e9ada79868c30cbfb02473044022032d86ef3867e3afd5f65a1fb96f8732af6e00ac17b2e530f061132f22d3b365602200dc383412841849b4f850dae15e8d991427de4be651341f32daf6c4c35247dcd01210305a69a7d559ba1f91a2b91ec4158e4f1e2efe864ec8f9342e6a0a4b2a0f88aae02473044022078f60889f91cbddc51608ef727a6ecce32f59c15a322a2c7774bebe6ff08dc0e02206a67a1295616c880e66163a587622ac9ea7f6f86f74ce932eb6f0ba00f302e060121020286f06808a159e0c24fe9147cc1ce6769c594d74d6476c2d5abcfeaf884d53602473044022052dbf11294ada4b2b0f37a4c611e3f2b5dfc9e80aaf8035774e9b38447c41ea8022041a9c48137a6d8f6072372478599a6bfb849d42016637ca8932b32ac1daebe78012103dd544b9db77da7cfa671dd0a6d539a8eddb8c352479336809701a450b6785036024730440220039e3c4d3a5a1c11bfa09878b6a344ec4e6bc62cc3eec6f19aaa5e936a9cd237022057496476cbb473c2e9aff6ec6c72d5b46fce015d541f88c4f337663b9ce56a85012103a8e20276ad8cacaf6a02b2054aa56141e73e3951a0d0ab7b046b235906ed466a0247304402205cfedef757d2d39be06dd0707675d65ee88ac0e5037c7e0667123d6be993ea2d022026a800dbe25f98685ebc504b0435cef99e06f914679ce927348e4c17cc85a1840121021542d7ec53cac388cef60788ed39da4d9e2a3492a81432107ac1b84deef53f4e02473044022036631397317a87b786fb45ecff7a2919c35b90db7290f12ac34997427492191f022043fd0559c11af00388bda59301066d297418a74ae90179c28bbb2e4569fd914e0121031f6600c8b1d6a9ac3a536b954a8367e96c28c379a6f43df5e22289e228761447024730440220030a6e87bef8bcf9329bae6644ed4fa3b5e95bef1e34245367e9330a6906a3d00220043daf2430b6487eacb08c4bb713486628345f3fc4844a47ff9c5fc78a150a60012103c537d3f7211b25c055b410f32dd90496218df5032682655793e40f197c5532720247304402202a77ab80bc2956321a8c0022fb7c63db5cd2424acc224aced2d7d0ddb595cced022023008b2b461d507c8a7b9ce0ff284ff263a495f3d6bb873cb759ade4e531b52b012103078cc114c442ad435fb5d464f5b788ae4e048784e6d640c75af2651ef6d71e7502473044022001d76a5c166db083dde0f6dd5bcdb26911a0472b9153a9d554b63a8241ee9022022048b4ebaf661666ad25bd874db34e22a057395c5a9038feab786f7bac1a6e387f0121034ec5235fb47395ba2b9f285e40257b45357067a3c750be26d5d3e433ad92296302473044022002536f7e895efe6b2de8928e747dd36cc0536e0b22b9492df8ae53586c5c0b8e02204648d71252c80217f94b9e2ed9f4765627a4f0ba62ec4185a20b24de70a4054d012103cd03a68f18770ce2387ca3dd074ea756e8040302c8b99b9597eb4e75a946f6ab0247304402207cfbb96188c2ecd3a79a75325e64e73fb9834264ef711811996f4ae5406846d602203f6a1eec899d7a521d27f4d52e8bec72a720b3b8a69440f0546c342546b2ad5a012102733dfcfcff254f352640868c5719655e977abf4e92a2ba3fc1acd3b31578ca7d024730440220121a8f883bb2a0be5ff9dee869b56f71d3e4fdf9cd732c2b7e3461ddb9fab0c902202d061c83fc6ffc3a4504544e78109b8a22526f4c3b9d7f6b2bca49df17a2e8ce0121031824cb62ba37b05e7681ea84fb3fcba90cfa90f0b80dbb370bdff2b5fb519db502473044022067ee43f8643d522d570119f78ee8c1d6b63f7550a98b6af4c4464b687a56b2ff02206e4a1746469f37fb26d0b87d96bfd7ce46fa1ed32366c0f6471332e8a7b08cf1012102181f314ee73be2dd5feb3550f25869c1a198502edf5454a9ae6087a8d002405f0247304402203095f79224c623fa389a844c9ba8c54cbb5c391cd5498d6f5b438227e49f44080220767d91452f55eececd3113019f6df362f2a828c445392a70b797dd30c7ae344f0121025b00e200d065be057a6641129666c38b269dd2ce1cd0ed269e1f436fa3acc87f0247304402205d2fc244b2f4a29b7a2a4e95e1b8f6b3d61d7a054de68570ce4685888ff8f88a02202400de88a460424cdda23d232548cf5384baac6c60172e8b55abb14ca19970d3012103822900b6c6a2e9558ce02a69803b585dc0c4bab879f91d9ab97dd1c413faf7b10247304402207d0af7734d79bf9929a5c5edbce516930f4496c68c86061ffb056f9446311d520220581f10dd722dd3711878a996b198f90d269477d363e3eb90e8597cd0397b4f7301210393b835860bbc7bb42e527babfa33139e53bbd094a2dbfdf00385735a2b06e40e0247304402204f8a0c847959229e55c21aff57e1595667529d2c97871eac9c2c12f53e1ceee902204a519e758891c44803a5520fcc43cb40a6d1acf58a5551b8c30987344c4136c5012103b58db4c8b2be3a6efbe0eb179cb33af0a548b53c86d61e2d1d8046e47c525b790247304402204ce91045ff32882f94793d6f45e3217fa2f2db7be213601c474bc08f450ff2f2022079086e8eb7f2297c8ebfed1fcddbdaa4c8f845e825afdb62086583e520ce539f012103f8b67a97873429ea614df8b6b30259a13444b9d4849c9fd5165b719c71088d1202473044022017c263abb2435b27bf1d2f7f8664acbb14f6b9a92f773d4d844ad0b223e982b0022048f516ea2ebd07db2a66167567a0bbd1408d50a79492879db1cc02b1ecca05eb012103c146f3c41f9e038b4359b1c5d5e95991055ceb336348a396c3e81d0527f8551d0247304402203d76d08dbc61d5a26f1365ab0897695dd73f009bc7d9e54ca4a56454f8787a5802203a349d218f68ac1d9b73106269562ccf035ecb70301ea65caf1c347aedaef4f8012103569cfaa7a0c97dad26a622b4502aca88cfe540a74ae19a61a33ae9889b011cff02473044022055a2787f28acced3592f7cb091e1ff5eacea3d6482bffd2f8c497c5da1118ce50220604a22012005695f308ceadb23ca616df7de819e0cc0b9bbcaa18581cff0c41e012102945e33c21786d1001530af5555c893f2c7b1e5e2dd36d9d035bc5ca8dfed286b02473044022004b9d5378cdc2cb65cf69f8ad6ef4e104a17c9a2a1b280b1220bc4e24064b6250220708792c93e30ca451de3996f899dab74c70fb1bed8cb327ac49ecfd72d9fcabc012103a447a1b20c211f616c0b8db0a5281dc68aa3745df2db1d00f2558c9b684ccfc000000000020000000001010b19f6982a943ee9e78e398f830a802ea6f82bb4ba987f9360da15a9bdf737270100000000fdffffff039e0a5400000000001600142409b2d3158306a9bafe5b03981edbfc40d4a4fdd0f608000000000017a91489c38db38e0eb42e7b0323ac4f6c050fc6603d1a87bfbb12000000000017a914f5addb2751f101415ec2d42afb94926afd5c920c870247304402205512f7abc72a1d9fd0d551c4064498358e9c4554b601d984df51a03d143a561f022056030255de06ff0a3d89d19f358df5d6909af5818f0107e89be6d541b003178d01210356bdf3a46d4464602b5a8d18128f5b665a481e89853dfe0c33b72ecad7259fe847a00a0001000000000101849178b2b2d3ac5ae6fbdf24064c30c22b6703d2a3e64756dfc27dce3d7270530200000017160014c1806b71076f09c26108e2fb6fe6a6026f1d24caffffffff0195b812000000000017a91464733e0caf2f8a6ac1b6a4c7faf63565594c46788702473044022051c57230ca0f59498bec8cbff3bb1fb3bcb34e0ca1ec418d52b0086871a95a50022063a578028120a92e7ed75891b8b4e1741d2a1c1aaadf28f25ac2d233657405b8012102629dd05f9740c5b359a9dc698fa473ce5232f009bf18940f5904e72cdce7ccf50000000001000000000104d3ea0d572506aeb862c4515978a7c43345d9f8aa1741f31c1fb91d67ebf2b2361c00000000fffffffff450a399fb30268cf2a1417f94b18be05200eff70bd9fedd7f04f0193b85705e0d00000000fffffffff1fe961180d2ec7bf4e2414a095ef41c78d06897aa5e6f51878613f320a113632200000000ffffffff349c5f0c078f1db474a99d0147ec19889698cff068b1c0f09886bae3c446137a2600000000ffffffff01180f0e000000000016001450a0cf214c7b9fc63be612c748659530893168690247304402205b3bfc7635a05326416370945017510f26712d9687d92baf3f1bd09cca5b469a022023ffd02f12ca458f0a21d966fbc643600fb9e976f2490f5c18a3ba94ab2a8d000121026f9d39cc16cad955403094a4a8e5c50bf4973f8485c1e57f1d5b8673b720ee0f024730440220327e12da52096c2a6ad2ced85c97994d49fc2206451ccf4a8f198aeeaa0c9ed902207f03ac93258a48caba275e31f91bb926599f629919cdd782a029174f3dc5b9800121028f9d0e373810d1bc851f51744667545a9c9a7c8170f88f007b67b028286193ea0247304402202ad8d65b076a034a9829c7459f03ec8a43b82b8e4fb14e23fcb469ed484df15202200db094c105a0071a22d1ad9f124524cdcb1769aa79c6160ceccd91c1157e1b810121039a62df1dea3a754cdfb297e0f25144f40703624b52ba5b956cf074697f3c3d4b02473044022039d18660f88a04b5b8427ad9b3b378ce2ad79d15f3cc3a0a2aff0346910d07ec02207f15d40366e5254d0f872d432d2d56f7899c5d4a5e83a061e4f6a1713029d3ee012102c97f374dcd57415f3e71994b5f52f4e9039eeb2eb0c57491846325c559425cbc0000000002000000000104347ba4e6751df7f5a4c6d9e91b51551a6b49c128f8112af94b7640091871e9650000000000fdffffff1b5fb81b90404f4168ccfdbd159c2732457eebee5c865135257f7168c8a01d770900000000fdffffffeb34a7d1edaa197decd78bc0b47b91888e0f0254fee1b0d9e441e3aa6f4f62900a00000000fdffffffb7b37119ca063f883da8ecb862386ffbf8abe88bff97bfc12f2f0c1129196e942800000000fdffffff016f3b17000000000017a91471942aaf5ae4954b5b65e7d0fcf4dde6f04a0ab2870247304402204889a8125634e2372fad6814de4a0abda99646f84b7d52d65dc2fd7e276751c902206ad512f4bc2016805a49f45bfdcdeb19bcdc74f208d98a04d13e369e6846a11b012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d370247304402207826fe279d5f1c44327ce4439840c90bdaa144c1c5752ba117dbd4e278f1a8cb022051b85adc3666ed9dcdc18b37f9a961470adb9ef83a9902fc50361263034eff25012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d370247304402201898bd091c08fb787c87b9f5e8bf276b8d13b52e5f22df36a9a136f29641158a022067737429c3d0f566d491e3a3699deaab2d8f7b0608587a5aade78dc9a5546666012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d37024730440220106744044b342b4ae3a9bed1d55b9f104c8e5a0271ad627d84006d3df19c3130022030936c8aa845c2ab75aecca7833ff1d495a60e67344737c6f8ce8585334acd7b012102ecde720e11129638c5d256d6a7a4d0af42d6ce71fe654af65dbfabe268614d3748a00a00010000000001049659f410fe6e30af72658700baed8e9db3d5eba24231e797b20fc8d6c76752d69309000000fbffffffe172b6847b0bc16deee77cf3bb383de6e3522f3306aa7cf448aefa31eb3bbba3f104000000fcffffff68f97ced4f2e695716c58cc3674d9f0e7fc15d5472b565b33bf51d22d30e825a2906000000fdffffff44516db14fe96bf3a2565d2c7b7a598928737f4e067d880619e9b0b7ce8c0f9ad701000000feffffff01400b00000000000017a914c82adb7141a87993722eb077c583fb64b26e2f838702473044022046c56a3df5d35ca298eabb753a9dc6cd2cf9ba7373dae678ba9db3b0a3ca9dc00220326a5bc206ab46ee09f26c73569524fff1c0eb8e95703ee757b5b2e467176b18012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b02483045022100b5c0ff9ed5dafdc71bb818ce4ad7b50ef5e570f592c761e726f993051f898dba02203a9c47df842bf8fd6a98f1049d964012a4f89053cf27dcefae05d7ca039040eb012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b0247304402203feb1fdc57e187740ecca8150f90cb733364d6dc503bde996233b602d7e83efb02201fd0b1cbc2f2368b1abe6897810c46e68a2e77e7d9552bca140ddc6716477e3f012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b02473044022049be7a670a1d34b2a4055813b095a2ec9164f00da5731ff032829245c7efbcb2022036f2f37aab3d99a682715c4f7e34cca9d3f1c8c378458f082e7e0b57f6224a3c012102900bbaba2a10b735835ddf79aaf3c69daccff6f341a99ec3a1637c2be116c73b000000000100000000010358295982efc3c356724b96df28bc39ad4ed2c9d590c12edf4eee55cffe6e6f1e04000000171600147019990913864aae6f3051e513fe0c5ad4a97ce3ffffffff0212eb9497d023f52929afbed9b7ef25240a8ce3cf488389a238caf87c7f7f7e0300000017160014056a21604fab499f7903157c7dd529403d500aedffffffff0212eb9497d023f52929afbed9b7ef25240a8ce3cf488389a238caf87c7f7f7e00000000171600146966fb2300d1ba7a59977f0a14813306559443c9ffffffff01c66a8c010000000017a914599ed9c78a682ae7bed6aea01bb6627a71ba272d8702483045022100d990012c7d900b9779027baaae19b9cfb5d1ec42dbb5f7353130df08817c046a022057ff10c111e0fe4fe1e34681cf24979786142a3764a8db377039330999c4252a0121021225d1592bdf554a14efc8345e8a5a29c18624cd3c256c7647a86e7f7c811e0f02483045022100b76b6f1b493045420033dad1ec08b5926372d1c3ad74b9cfafe05c55ae6295900220224a8c5dee4b80e7745308ca50338f73e40eb7ccd725910e0e2c0bc92a1a797e0121023ae961af187ecbfa499779daac54f80abff81759bb4707f9bee2dbdd6fb89c4f02483045022100eb6fec46f71bab6f02fa8b2ac6643170d6ab1162540d8f01bcb4a74db3c7996c02201c9a31a56e4e1fe09647706d4b65b65998aa0a88c95ac6e6681165d21a1f6107012103b4648eb1e4cedf4d4892e65f7176462de95f6721b00f5b19066344d1e271eabb00000000010000000001043dcd4b450e46e61c24ec098bc5b222b729c9b11c9a705f2df112b9d18e5ac3c40000000000000000002515a78f3d429c5407b04009af58332cbfbfdf6ee6993fde816f9e0d207cbff8010000000000000000c917bfea138884c0d27c363d234c5a08c088bf36f02780690a2567f15ef166d8010000000000000000bd094b631c1d53293e8417acb15e013a0a9de8969e55dcc773555a3e934093880100000000000000000168591f00000000001976a914bf7735e0e217dfd65b92d19e85642ac2448ca97a88ac0247304402203bc99597d47092a89b6c2b53c4fe59e0af4c7c3668e0f96726f354d87ae9fd81022005b36c17e6ac75486eb8c2b9b4c387f75190d9a2f9c5b179f366a4a65be2e9930121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff02483045022100a9bd5dbbed4c5b359074351d80cb321c30bd572ae12341bdc8635da256f72dc602204c8d1e4d5d32cef0d1155b9b81c3e1cc9980ae0ef96b2aa45cfd0341e8840aa90121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff024730440220371c5d3032829deb70265352b4b39e2344fac9039ff5f208faf04459f077838002204f1c889343e0cf9e79dc7000612f9627f751f04db7f7e8c35ca093211d0b8f1c0121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff02483045022100d6792ccd799b210808c5562ea4cdb61eba164fc8ab356610b13c05ad0d62e0690220281603dba47bfae1e3e3f313d5038d8f5ac458e0f584ec226b1854958428ee0c0121020e6c734ac6866f0c6aa4bbd94d1b94dd906b855b49b54126ae2193265fadb9ff0000000001000000000104a7fdee2da6120adc69a34e3c741685e3539f0ca6a6122baec7745245041eccb10000000000ffffffffe0f2ef011a9194b0c66830203a53d003b72f544f69fca7f45d3c7d5f8fc85d1e0000000000ffffffffee262b18f8c0a063c44aef124dc7204cb6cdb5823ca4aa9d6fcb3f3e33fca4e80000000000ffffffff1567434bc7383e66b78de5b0a0d63f9438ba3c5a2db4e86fca024277cd9d62bf0000000000ffffffff0137af3500000000001976a914815decccc80f8212b79347852acb5f0290490a6a88ac02483045022100e3d8ae6fe65472c4233fe2fe021dc70adbd4a87abffceb70e52e46051fa4440302201f97657f98d2999e2ec11edfca4378d75335da9b1543574095bff3f465b2aa3b0121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c302483045022100c8cbc9aaf7b86651cd0c49ade2ab49cb4461583c3203e20cbc23783f49fe0a1e02201810fa07e24d8132bf22ff8b4ef81cd290d8c10c20d317be6cac494d23d52b420121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c302483045022100a0c85cd83e5814f94aef92938f470dfdd0204a876747757674562c0734f1eea802202fe278353de8586d6327e92262a14b5194159cff3b58581b0a6ee0a110dc16c50121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c3024830450221008d65cbfb3ccf1e528b46ee6fed47f2f614ee9684b71a69ac2724ff219c38b0ba02207a51f00a027d4aa387ff4b60117343bac41c8cbb14267b03ee142bfe23e43f590121025646ba733ed0c2cdd939c7af7fa049d15e7d77d9e43d8994c42db72f019677c30000000001000000024760555502737a522b7a3f6f47b0f2ae02abbfaa623b3895bc9199b3d592ba01000000006b48304502210083fe1202d32ee20982515198adf570a1f163452619a1ed20b4f2270a159a60cc022032357c965602b3819e13e8fef1be1cb2de41ace2105be1b2c02fe721be82e35201210288a4ed5db17290b5db084729e8c41a4d92ee64e2dabffe67a634904f6718fa98fffffffffa07c0fd72acf3993e6383bc6c6edf75d9e5b11693c6873d5ee9d619087022c8010000006a47304402203b9d56c20ac66114d86b7890c83d611fef7641064d533b6b21026a5a7371f54502204db83300ebcca8e9cacc55999e9f2e357c785f13fb532d403b661dbd4b08c104012103d7ab5decdcaa23da51dbca65a20f2a92e52fd95504b249193d77bbf29b39f136ffffffff022b0a0400000000001976a914cd6901b9b522233f29f7e508247a6b7478f7001b88acc0d8a700000000001600142e84c9c2217221c801dc77ca1cad01c36d1d1af100000000010000000001014a1e0005d917b6dda0e2ae15cc3b249aaf1892aafe842bb6bc0a4f33bcec5cd90100000000f0ffffff0474bc1c000000000017a914806e10c4e32b502508c59e661b081b74a3ee7d8487b481840000000000160014cac2c353c58c732703d7a59d41375df28a9ae67800328d00000000001600148de288389517f84ee9b7273e378f61dc0262c1ceb1184d0400000000160014f1285a12ba2e219a945ff745b9d145d8a6f1ff6d02483045022100b6e2fb69a083223b9fc47d7cb1b0cc770c82c3fe0e4a0533d73a9bc94f7ed2040220571736d7bdc0fe5d99a12dd19d797b04a3e82252f197122c99f7bf62e31a5db801210223fa3da3e0bd0ab2f52faa25b2eee31cbffe24aeb3dd61ee2bc7be2a6cd96b3200000000010000000001013a9e06b5fb84d097b69a91fd700ac721842a0d2763725b3776e6fa42290133770200000000f0ffffff02b4ed2f000000000017a91431251f39fb65eea11aa79bf4e1386cf12ee1101087f7405d0000000000160014d86bcbb4a096c8712f7456947c4a2af5331cf37902483045022100ab4857b950c06aa745421532092265e00dde15003c28d131973bac28c95bde6402203a4f2be7999ccb6ea2dbfce8ebcd7264194d02a1fb8f62c8d5057cf8d958bae4012103a2c276d93418b2092f837da8e3cfc90082d2434690dbd26c3c2c2ed9b9a6665f0000000001000000000101453085912daf2eff1f23c604b3d0ef0323ee78230d2b2e924b059db7f563d5430100000000f0ffffff025c9337000000000017a914ee89588f998a90e7047d760fa0d041f24275237c8746aa250000000000160014c28b0d7aa6e0d45a805a02f9f684fb66297e5cc102463043021f4da886074cb082b42fa457cc51a3f1c9ad7c93a00f8d08a1c76094f93c32190220220ed627875fbf638c398665c063af81a2723e8747d5f79b7430bdc27ddd4abe012103ddba43b078461bbbe3a8deaae57142656987520447cf049019b53608bdf7b3ce000000000100000000010929358a3fd8726710620b40b1a52010c47bd54edea9476062813320f7f9d151a00000000000000000009df2d48ea3691e107964853209d9d9f80a88f70b5b3e815c14ba177244671f89000000000000000000652c650d4919d93c3960bd8e83d330d8df5ed2bbbfb0e3d62c9c9df0e9e5519800000000000000000013ef5b7850726903f80b4f76199c82eb38829b7592e854de2c3b2d956f46a3600000000000000000000faa0e6ee1c046c28b98a31abd2a8cdc69bd16627cdc88457cd1ee62e7d9b74a000000000000000000325ad9689cde42feeb7f1facf65a3bd20a662a7ec63fc2e625efe71ad01b56cd000000000000000000df1c43eb7a9f9f17584c91554f286fd6037c344590c00676e72acd1442c714750000000000000000008f964299cb231b9e2739254bb661a313ff9179edc8b99db93948b1cff91f2460000000000000000000b879d5d76e53bcdcb3735dd5c74e01f53933a1c9e5f7ed431fe0a5d92388501d000000000000000000018ccc50030000000017a91444241a71dd156900b5e4d7cd31447e826ddb10058702483045022100e8210817802d843727c9bf2c7ea0abc573c5f0c23aaf2568c39b52845ac4e7ba022024a0cdd50ca25ca50231e674375f3e3dbb8959cf9fb7a8ecee064293fb0886eb012103e05e6e384d1b046d579e2ef7798231ac8d05d8a6377a3fe84c0cdffa7ef0aa6202483045022100b97c33a4da2f27b7a7903c730fa5f8328d1c1c6f31bf0fb2f8bb001f38fad07502203811eebd453adbed28b4a05941abc6acdabc81e2a2277be6f20c336872e96ef1012103520024b9b8df69cd33312b9bbba9e0f033e999b2837e35690a9255b991a4301b0247304402207ceac984aa59474444cfef693926d5bea0b685af5d8af1273fa47f125361e79602201bbfefd513bffc6291083e333a8f73c553a540244a42ead307dddf09fd6b399d0121035e876ba3eff556162fa2ccf79aa00f24b462337aba436e9b9b81be341c5afbcd02483045022100a04b2ef03e1385d96b7cfca1aacfe3fde4444dc68fa626ca0e1b4b1eb31d281f02203b6f37a6e085463ce69c5b6c54a261ba59f11d3473c16a5ad63605f3f4ef40a90121028820b39e8b834cfca3048e8feeb014c94c2ea3675881980e5652d84732e3b7ca0248304502210087052d9b528014b733f67586021372f7a23557fbaf7d9a059e40147b18cc88b002204cb393f3ff820ca7b8ae481a4b30c05bb73950fa7c97f8a7653f54866ec0c9370121022d1210bd5a60520f8042e8febf377a4689b1e5c154956f2b776bfb06ff28d9ad02483045022100bb498c36f6a7f4b05065f47a097186d957a15b7767a976de2d76c8e7e29e8de80220373154c41d8c8ba6f2d18445233c76ef950379702cfafc91cd6c264e6821d737012103b558950de4d73e369715f8a324176d99415a8cbe562f5c06bd6f806379f6481a02473044022062bf65dc424f78e95106e466c72aae6f4e4755d77ddd5474bfba6dba9e77c4e902203c5507b73f641c24c33be53216340178db92d53dc3d3a7234727ad052cedacd2012102f64aac7aff25b693e2f5134869827f0c0ba53e1706f8a06fc3c5e9a84d7246390247304402203f6fee1ae384b923bf3eae736fc87b5ac486347a2d91867a02660b967e45040f022069aa8401f8213dab5b377f0e916a514fc37d62233b0641bd2e0e5e85c2869f08012103a8c9746dcf713f0833822c3aff8b5d603a4da2c1c71d57183e861653f1f722db02483045022100e31d8028c5c5443620277b9d66d45a9c23e80d46e93626df52e347ff4a1d7f740220590527c7168abd9e152a88128bdfb786be518ba564e00b04d2d3cadcdcf0e5400121021625e1a3fa092757b51c8fe4649bbff3b3dbae5564cbd33a7fe6c3b2e287061900000000020000000001019384b0447aab663fd693ddff7cfe1a93c32eac10f45406653cf070d052435a6300000000171600141560e87545047da8c0f3112d2ea9130d8c4b77c0fdffffff0275ab13000000000017a914cdfdae9b2a8b58329f0c9e32fa7e7ef85eebc59e87aff1ac050000000017a9146eb2ca7f97b8f417f8cfdcc8d82cd77aef825493870247304402201ebbd95e90fd79ae5e0507ceacd7b2015355cd86a720bdff982835d72a79b38902202c5d0d254e130287590286da157b98affffb191bb2d31ce90934360fff6b788701210265c34f49666f3652a68e075f8ed0e10dc3ca697e0cd5b1b9df10293ae29f625047a00a000200000000010138f1575bb0bc6fd7d848d10773e64933ce1393cb03d14107ec496b7f8666b1050100000017160014b87b851ab8f7ef5338993b1f79cd42deb64ecbbbfdffffff0298951500000000001600145f10c9de1bec6c7294cd6833836731bdf70c1b8b3f58970500000000160014d6adbef8b21a4b09e86bd2cc5b9c7fceb81f114802463043021f642e4edb74195aab588c3643782ffeef639a97e0f54a79f77efaec100329fc02205ec905f11edc2006287f773c7ec5dce4b1e2864be314c225ead8e59444bc6fe6012103e6b2844146c49b60cdf81a463ec8af6c60c3f483c9aa2cd91060081a0267346e47a00a000200000000010174c5114c78df15ca7032e7f19c2e06d47e62f50a1ab9b47e2e9eb136dde7107c0a00000000ffffffff01e62800000000000017a91432b0b564ecad298926e20e82dbf83f6e124f3778870248304502210086119d97bbf0e5060c747a5adf92b95e7fdd76644f288f49338a5f527dff36ec02204a0d880cef1937f7409b25101d41b78f619531ee8db2c65153e3302a0e015cb90121031121d89dcc1806c19b10fc40e5f8f7c14a43fee79808e66e181bd0518e3a8f1100000000020000000001026e660c15b71d914429562cf83da5eea6852ef0fa6222d0d532c13e3d964e92564a00000023220020ba369adb0163cc9cc7d74ccca765831fa3b90d8c8ea02da3eb52dbfa05539943fdffffffe7c1000195d7d7269069f130921d8df77234b3821f207b059575ebb8080db67a00000000232200208cb432f61f9943199bb5fd2e4414b3bc1164eebdbc4064405a12ef79fdfc64effdffffff02e044a3000000000017a914abe51129735699c6c573bd3e04125f04248709c6876c16eb000000000017a914beb3dfca8d44070faee0dc181ddb7a2184d4483b870347304402206ce1e3a620dd20b23d66018fb18955efe8917e5e823e9aec1ecfe31314a93f57022006f1c4da931a3e49deeb10ba1e9840572fe8a59d8696703eb6fc70b6d92b8f97014730440220041a6355bae0868b3d69e2c748a2ea15b4ac218f4ff6b6d0230ed45c0e393aaf02200cc5bc5001c63b162a926521cec96990da108f83d27e553a91c88c239286060a014e2102b046d463cc5ccf5fd981f3339259549704d2e2856173109c43a17fdeafc1c7eead210320d35950f54033ab8042ed34192752c8e95d81b3ce12dfc68f9884f9c2fa217aac73640380ca00b268034730440220791ca0e5e466494fffecfbca87429994a46ecbbd0a3aec73fcd9fb92a7f2b75002202e7c867208b38453f3ed0aa252abb572f3b8fa16b8cb9afa82e1b85a73f06e6b014730440220199f5edf2c0d2f4573ad70b8cdfc88a687269f9344d7263ca829af6296298fc70220259f4b53fc5b0d93ed4f5212735a563490fa7a3aa165fcc131f80f270d99f0f4014e2102979c979862d7b65122a23690aa65f57ef0a96b16599a2b530c99f0086f425f06ad2103ad88b4076b499160a2becaa2274bfa9f4dece8dd8403fcbe41c6c2cb054e7ba1ac73640380ca00b26848a00a00010000000001026688de06269b19c4384968c6e404cd7159872d8f338130b3a1d37f983d1127c70100000000f0ffffff9104ddc26ed24fab5257f345d6cb0663a7fa1b8524b32c832f9bad9085e95f1d0500000000f0ffffff02a689100000000000160014375257345224520e42c2b2451c92e3b800e3ae9a0b1a100000000000160014c23fa5ccecec0a828c54fbb463a67a66933ef60602473044022002bffca9067678dcccb1158dc47c83250492267261e58255d4851caa264610bc02204ac4677b14dd3fd510744d3d3c2bdd47fd7efafc97eecc81293b669caca84383012102f3ad45bbe99da6c07dcd4e287569adf3d2f998f615f873c8a7f01915b5c9c2e102483045022100dfa81d976a4bcda31a7acd834a8d5e2557ba7832a9dcf7b8fdd19733f5c508290220750df01ce6514065339ea2c5f5f51233099d568effd4c86b807e3d2d1dbb8a91012102a1d5fa5f43ed4d8c777a7060d72de4b075d2871fe271a9fcc0986326e563806700000000 \ No newline at end of file diff --git a/test/mocks/listUnspent.json b/test/mocks/listUnspent.json new file mode 100644 index 00000000..35f31296 --- /dev/null +++ b/test/mocks/listUnspent.json @@ -0,0 +1,92 @@ +[ + { + "txid": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", + "vout": 2, + "address": "mowfvQDraTDvRgZowL4tx5EatL1u78w65v", + "scriptPubKey": "76a9145c6dbcd0321aadc2b51b564825aa444c886030b988ac", + "amount": 0.01956600, + "confirmations": 1264, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/513']02f9a7a32a1fca818a07344f350735ac6727fbea4fd3ac8ec73276dd6131486e36)#vp4m9986", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "2ba6da53badd14349c5d6379e88c345e88193598aad714815d4b57c691a9fbdf", + "vout": 2, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.00253100, + "confirmations": 2407, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "55d8e551f8bf95672152f4cc65fa8e4ab1b74cb31d0980e269b68e1a7687d8d5", + "vout": 2, + "address": "mueZ8bFJbBAk8hHPdBCRxAVxdCTVro7eNd", + "scriptPubKey": "76a9149b01c0c7675b52a77fa2f612f2c0301f66dff80888ac", + "amount": 0.00223121, + "confirmations": 4292, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/115']03e23d5fcca8b0f84602ca5b917c35b5b4ae2027d8e9243678b86d02badb249bde)#rtvnc86h", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "4fe86a22084f951da95b3d3e3792eec9d4312dedc4d0bb78feb75f5dbd676240", + "vout": 2, + "address": "mnyd1xpy8Xz7ZcQQm5PKAby11wZXUUktHn", + "scriptPubKey": "76a91451d404fc044e85554e83d33ab8c3ccbf665aa4e288ac", + "amount": 0.00090625, + "confirmations": 4709, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/7']03845c292fa9d06650247f1a6deb5ba41fc4fa3bc66f4db904eba3b89cc06624e1)#d7ekural", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "43c08d251b533f61b4d8526427e62b575282ef44ceeeed144d1096c304d9efb9", + "vout": 2, + "address": "mpZdpgfShdcztEftzAU8cFLcTZypGPPPn3", + "scriptPubKey": "76a914633af5dbd857eb6b84b52a8f4b86de80ffd53d6a88ac", + "amount": 0.03094150, + "confirmations": 2131, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/503']03e6f15974153b98eae8bc76e7f9da045a18098a6ac4acc24a32c1599138d60095)#sqdqs6cm", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "7be8b35942e39de396f24f212753c01256b9e1e775fe658bcaffabff9f131eaf", + "vout": 2, + "address": "mtrGcn3CbCLEDQb43LDshuHYwi6pcUj17e", + "scriptPubKey": "76a9149240d56575cf4594da1e589f23e4ab3c9ccb0d3f88ac", + "amount": 0.00178612, + "confirmations": 3922, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/279']0375950d9efbff9a6dc3150c064697dccedf0afdeff849232bccbfef926b57ebc6)#675n9s9n", + "parent_descs": [ + ], + "reused": false, + "safe": true + } +] \ No newline at end of file diff --git a/test/mocks/listUnspentByAddress.json b/test/mocks/listUnspentByAddress.json new file mode 100644 index 00000000..5f222b05 --- /dev/null +++ b/test/mocks/listUnspentByAddress.json @@ -0,0 +1,92 @@ +[ + { + "txid": "2ba6da53badd14349c5d6379e88c345e88193598aad714815d4b57c691a9fbdf", + "vout": 2, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.00253100, + "confirmations": 2439, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "fda421ccdff7324a382067d1746f6a387132435de6af336a0ebbf3f720eaae4d", + "vout": 1, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.02000000, + "confirmations": 6, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "da28401c76d618e8c3b1c3e15dfe1c10d4b24875f23768f30bcc26c99b9c82d4", + "vout": 1, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.00020000, + "confirmations": 2, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "da28401c76d618e8c3b1c3e15dfe1c10d4b24875f23768f30bcc26c99b9c82d4", + "vout": 2, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.00100000, + "confirmations": 2, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "da28401c76d618e8c3b1c3e15dfe1c10d4b24875f23768f30bcc26c99b9c82d4", + "vout": 3, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.00100000, + "confirmations": 2, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + }, + { + "txid": "586c51dc94452aed9a373b0f52936c3e343c0db90f1155e985fd60e3c2e5c2b2", + "vout": 1, + "address": "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS", + "scriptPubKey": "76a914eebde2e5b79139fe6e2fc209a90a2348abb4b19588ac", + "amount": 0.00200000, + "confirmations": 6, + "spendable": true, + "solvable": true, + "desc": "pkh([1fe67580/0'/1'/426']029071754867836692be62b20e5bc06722fd7582773a607f63994589549c6d869a)#mx5ee5ra", + "parent_descs": [ + ], + "reused": false, + "safe": true + } +] \ No newline at end of file diff --git a/test/mocks/rpc_client_mock.go b/test/mocks/rpc_client_mock.go new file mode 100644 index 00000000..7c439598 --- /dev/null +++ b/test/mocks/rpc_client_mock.go @@ -0,0 +1,982 @@ +// Code generated by mockery v2.42.0. DO NOT EDIT. + +package mocks + +import ( + btcjson "github.com/btcsuite/btcd/btcjson" + btcutil "github.com/btcsuite/btcd/btcutil" + + chainhash "github.com/btcsuite/btcd/chaincfg/chainhash" + + mock "github.com/stretchr/testify/mock" + + wire "github.com/btcsuite/btcd/wire" +) + +// RpcClientMock is an autogenerated mock type for the rpcClient type +type RpcClientMock struct { + mock.Mock +} + +type RpcClientMock_Expecter struct { + mock *mock.Mock +} + +func (_m *RpcClientMock) EXPECT() *RpcClientMock_Expecter { + return &RpcClientMock_Expecter{mock: &_m.Mock} +} + +// CreateRawTransaction provides a mock function with given fields: inputs, amounts, lockTime +func (_m *RpcClientMock) CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) { + ret := _m.Called(inputs, amounts, lockTime) + + if len(ret) == 0 { + panic("no return value specified for CreateRawTransaction") + } + + var r0 *wire.MsgTx + var r1 error + if rf, ok := ret.Get(0).(func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) (*wire.MsgTx, error)); ok { + return rf(inputs, amounts, lockTime) + } + if rf, ok := ret.Get(0).(func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) *wire.MsgTx); ok { + r0 = rf(inputs, amounts, lockTime) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgTx) + } + } + + if rf, ok := ret.Get(1).(func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) error); ok { + r1 = rf(inputs, amounts, lockTime) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_CreateRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateRawTransaction' +type RpcClientMock_CreateRawTransaction_Call struct { + *mock.Call +} + +// CreateRawTransaction is a helper method to define mock.On call +// - inputs []btcjson.TransactionInput +// - amounts map[btcutil.Address]btcutil.Amount +// - lockTime *int64 +func (_e *RpcClientMock_Expecter) CreateRawTransaction(inputs interface{}, amounts interface{}, lockTime interface{}) *RpcClientMock_CreateRawTransaction_Call { + return &RpcClientMock_CreateRawTransaction_Call{Call: _e.mock.On("CreateRawTransaction", inputs, amounts, lockTime)} +} + +func (_c *RpcClientMock_CreateRawTransaction_Call) Run(run func(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64)) *RpcClientMock_CreateRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]btcjson.TransactionInput), args[1].(map[btcutil.Address]btcutil.Amount), args[2].(*int64)) + }) + return _c +} + +func (_c *RpcClientMock_CreateRawTransaction_Call) Return(_a0 *wire.MsgTx, _a1 error) *RpcClientMock_CreateRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_CreateRawTransaction_Call) RunAndReturn(run func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) (*wire.MsgTx, error)) *RpcClientMock_CreateRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// Disconnect provides a mock function with given fields: +func (_m *RpcClientMock) Disconnect() { + _m.Called() +} + +// RpcClientMock_Disconnect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Disconnect' +type RpcClientMock_Disconnect_Call struct { + *mock.Call +} + +// Disconnect is a helper method to define mock.On call +func (_e *RpcClientMock_Expecter) Disconnect() *RpcClientMock_Disconnect_Call { + return &RpcClientMock_Disconnect_Call{Call: _e.mock.On("Disconnect")} +} + +func (_c *RpcClientMock_Disconnect_Call) Run(run func()) *RpcClientMock_Disconnect_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientMock_Disconnect_Call) Return() *RpcClientMock_Disconnect_Call { + _c.Call.Return() + return _c +} + +func (_c *RpcClientMock_Disconnect_Call) RunAndReturn(run func()) *RpcClientMock_Disconnect_Call { + _c.Call.Return(run) + return _c +} + +// FundRawTransaction provides a mock function with given fields: tx, opts, isWitness +func (_m *RpcClientMock) FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) { + ret := _m.Called(tx, opts, isWitness) + + if len(ret) == 0 { + panic("no return value specified for FundRawTransaction") + } + + var r0 *btcjson.FundRawTransactionResult + var r1 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) (*btcjson.FundRawTransactionResult, error)); ok { + return rf(tx, opts, isWitness) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) *btcjson.FundRawTransactionResult); ok { + r0 = rf(tx, opts, isWitness) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.FundRawTransactionResult) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) error); ok { + r1 = rf(tx, opts, isWitness) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_FundRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FundRawTransaction' +type RpcClientMock_FundRawTransaction_Call struct { + *mock.Call +} + +// FundRawTransaction is a helper method to define mock.On call +// - tx *wire.MsgTx +// - opts btcjson.FundRawTransactionOpts +// - isWitness *bool +func (_e *RpcClientMock_Expecter) FundRawTransaction(tx interface{}, opts interface{}, isWitness interface{}) *RpcClientMock_FundRawTransaction_Call { + return &RpcClientMock_FundRawTransaction_Call{Call: _e.mock.On("FundRawTransaction", tx, opts, isWitness)} +} + +func (_c *RpcClientMock_FundRawTransaction_Call) Run(run func(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool)) *RpcClientMock_FundRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx), args[1].(btcjson.FundRawTransactionOpts), args[2].(*bool)) + }) + return _c +} + +func (_c *RpcClientMock_FundRawTransaction_Call) Return(_a0 *btcjson.FundRawTransactionResult, _a1 error) *RpcClientMock_FundRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_FundRawTransaction_Call) RunAndReturn(run func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) (*btcjson.FundRawTransactionResult, error)) *RpcClientMock_FundRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// GetBlock provides a mock function with given fields: blockHash +func (_m *RpcClientMock) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) { + ret := _m.Called(blockHash) + + if len(ret) == 0 { + panic("no return value specified for GetBlock") + } + + var r0 *wire.MsgBlock + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*wire.MsgBlock, error)); ok { + return rf(blockHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *wire.MsgBlock); ok { + r0 = rf(blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgBlock) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlock' +type RpcClientMock_GetBlock_Call struct { + *mock.Call +} + +// GetBlock is a helper method to define mock.On call +// - blockHash *chainhash.Hash +func (_e *RpcClientMock_Expecter) GetBlock(blockHash interface{}) *RpcClientMock_GetBlock_Call { + return &RpcClientMock_GetBlock_Call{Call: _e.mock.On("GetBlock", blockHash)} +} + +func (_c *RpcClientMock_GetBlock_Call) Run(run func(blockHash *chainhash.Hash)) *RpcClientMock_GetBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *RpcClientMock_GetBlock_Call) Return(_a0 *wire.MsgBlock, _a1 error) *RpcClientMock_GetBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetBlock_Call) RunAndReturn(run func(*chainhash.Hash) (*wire.MsgBlock, error)) *RpcClientMock_GetBlock_Call { + _c.Call.Return(run) + return _c +} + +// GetBlockChainInfo provides a mock function with given fields: +func (_m *RpcClientMock) GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetBlockChainInfo") + } + + var r0 *btcjson.GetBlockChainInfoResult + var r1 error + if rf, ok := ret.Get(0).(func() (*btcjson.GetBlockChainInfoResult, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *btcjson.GetBlockChainInfoResult); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetBlockChainInfoResult) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetBlockChainInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockChainInfo' +type RpcClientMock_GetBlockChainInfo_Call struct { + *mock.Call +} + +// GetBlockChainInfo is a helper method to define mock.On call +func (_e *RpcClientMock_Expecter) GetBlockChainInfo() *RpcClientMock_GetBlockChainInfo_Call { + return &RpcClientMock_GetBlockChainInfo_Call{Call: _e.mock.On("GetBlockChainInfo")} +} + +func (_c *RpcClientMock_GetBlockChainInfo_Call) Run(run func()) *RpcClientMock_GetBlockChainInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientMock_GetBlockChainInfo_Call) Return(_a0 *btcjson.GetBlockChainInfoResult, _a1 error) *RpcClientMock_GetBlockChainInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetBlockChainInfo_Call) RunAndReturn(run func() (*btcjson.GetBlockChainInfoResult, error)) *RpcClientMock_GetBlockChainInfo_Call { + _c.Call.Return(run) + return _c +} + +// GetBlockVerbose provides a mock function with given fields: blockHash +func (_m *RpcClientMock) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) { + ret := _m.Called(blockHash) + + if len(ret) == 0 { + panic("no return value specified for GetBlockVerbose") + } + + var r0 *btcjson.GetBlockVerboseResult + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcjson.GetBlockVerboseResult, error)); ok { + return rf(blockHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcjson.GetBlockVerboseResult); ok { + r0 = rf(blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetBlockVerboseResult) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetBlockVerbose_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockVerbose' +type RpcClientMock_GetBlockVerbose_Call struct { + *mock.Call +} + +// GetBlockVerbose is a helper method to define mock.On call +// - blockHash *chainhash.Hash +func (_e *RpcClientMock_Expecter) GetBlockVerbose(blockHash interface{}) *RpcClientMock_GetBlockVerbose_Call { + return &RpcClientMock_GetBlockVerbose_Call{Call: _e.mock.On("GetBlockVerbose", blockHash)} +} + +func (_c *RpcClientMock_GetBlockVerbose_Call) Run(run func(blockHash *chainhash.Hash)) *RpcClientMock_GetBlockVerbose_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *RpcClientMock_GetBlockVerbose_Call) Return(_a0 *btcjson.GetBlockVerboseResult, _a1 error) *RpcClientMock_GetBlockVerbose_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetBlockVerbose_Call) RunAndReturn(run func(*chainhash.Hash) (*btcjson.GetBlockVerboseResult, error)) *RpcClientMock_GetBlockVerbose_Call { + _c.Call.Return(run) + return _c +} + +// GetRawTransaction provides a mock function with given fields: txHash +func (_m *RpcClientMock) GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) { + ret := _m.Called(txHash) + + if len(ret) == 0 { + panic("no return value specified for GetRawTransaction") + } + + var r0 *btcutil.Tx + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcutil.Tx, error)); ok { + return rf(txHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcutil.Tx); ok { + r0 = rf(txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcutil.Tx) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRawTransaction' +type RpcClientMock_GetRawTransaction_Call struct { + *mock.Call +} + +// GetRawTransaction is a helper method to define mock.On call +// - txHash *chainhash.Hash +func (_e *RpcClientMock_Expecter) GetRawTransaction(txHash interface{}) *RpcClientMock_GetRawTransaction_Call { + return &RpcClientMock_GetRawTransaction_Call{Call: _e.mock.On("GetRawTransaction", txHash)} +} + +func (_c *RpcClientMock_GetRawTransaction_Call) Run(run func(txHash *chainhash.Hash)) *RpcClientMock_GetRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *RpcClientMock_GetRawTransaction_Call) Return(_a0 *btcutil.Tx, _a1 error) *RpcClientMock_GetRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetRawTransaction_Call) RunAndReturn(run func(*chainhash.Hash) (*btcutil.Tx, error)) *RpcClientMock_GetRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// GetTransaction provides a mock function with given fields: txHash +func (_m *RpcClientMock) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) { + ret := _m.Called(txHash) + + if len(ret) == 0 { + panic("no return value specified for GetTransaction") + } + + var r0 *btcjson.GetTransactionResult + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcjson.GetTransactionResult, error)); ok { + return rf(txHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcjson.GetTransactionResult); ok { + r0 = rf(txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetTransactionResult) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransaction' +type RpcClientMock_GetTransaction_Call struct { + *mock.Call +} + +// GetTransaction is a helper method to define mock.On call +// - txHash *chainhash.Hash +func (_e *RpcClientMock_Expecter) GetTransaction(txHash interface{}) *RpcClientMock_GetTransaction_Call { + return &RpcClientMock_GetTransaction_Call{Call: _e.mock.On("GetTransaction", txHash)} +} + +func (_c *RpcClientMock_GetTransaction_Call) Run(run func(txHash *chainhash.Hash)) *RpcClientMock_GetTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *RpcClientMock_GetTransaction_Call) Return(_a0 *btcjson.GetTransactionResult, _a1 error) *RpcClientMock_GetTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetTransaction_Call) RunAndReturn(run func(*chainhash.Hash) (*btcjson.GetTransactionResult, error)) *RpcClientMock_GetTransaction_Call { + _c.Call.Return(run) + return _c +} + +// GetWalletInfo provides a mock function with given fields: +func (_m *RpcClientMock) GetWalletInfo() (*btcjson.GetWalletInfoResult, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetWalletInfo") + } + + var r0 *btcjson.GetWalletInfoResult + var r1 error + if rf, ok := ret.Get(0).(func() (*btcjson.GetWalletInfoResult, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *btcjson.GetWalletInfoResult); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetWalletInfoResult) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetWalletInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWalletInfo' +type RpcClientMock_GetWalletInfo_Call struct { + *mock.Call +} + +// GetWalletInfo is a helper method to define mock.On call +func (_e *RpcClientMock_Expecter) GetWalletInfo() *RpcClientMock_GetWalletInfo_Call { + return &RpcClientMock_GetWalletInfo_Call{Call: _e.mock.On("GetWalletInfo")} +} + +func (_c *RpcClientMock_GetWalletInfo_Call) Run(run func()) *RpcClientMock_GetWalletInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientMock_GetWalletInfo_Call) Return(_a0 *btcjson.GetWalletInfoResult, _a1 error) *RpcClientMock_GetWalletInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetWalletInfo_Call) RunAndReturn(run func() (*btcjson.GetWalletInfoResult, error)) *RpcClientMock_GetWalletInfo_Call { + _c.Call.Return(run) + return _c +} + +// ImportAddressRescan provides a mock function with given fields: address, account, rescan +func (_m *RpcClientMock) ImportAddressRescan(address string, account string, rescan bool) error { + ret := _m.Called(address, account, rescan) + + if len(ret) == 0 { + panic("no return value specified for ImportAddressRescan") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, bool) error); ok { + r0 = rf(address, account, rescan) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RpcClientMock_ImportAddressRescan_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportAddressRescan' +type RpcClientMock_ImportAddressRescan_Call struct { + *mock.Call +} + +// ImportAddressRescan is a helper method to define mock.On call +// - address string +// - account string +// - rescan bool +func (_e *RpcClientMock_Expecter) ImportAddressRescan(address interface{}, account interface{}, rescan interface{}) *RpcClientMock_ImportAddressRescan_Call { + return &RpcClientMock_ImportAddressRescan_Call{Call: _e.mock.On("ImportAddressRescan", address, account, rescan)} +} + +func (_c *RpcClientMock_ImportAddressRescan_Call) Run(run func(address string, account string, rescan bool)) *RpcClientMock_ImportAddressRescan_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(string), args[2].(bool)) + }) + return _c +} + +func (_c *RpcClientMock_ImportAddressRescan_Call) Return(_a0 error) *RpcClientMock_ImportAddressRescan_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_ImportAddressRescan_Call) RunAndReturn(run func(string, string, bool) error) *RpcClientMock_ImportAddressRescan_Call { + _c.Call.Return(run) + return _c +} + +// ListUnspent provides a mock function with given fields: +func (_m *RpcClientMock) ListUnspent() ([]btcjson.ListUnspentResult, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ListUnspent") + } + + var r0 []btcjson.ListUnspentResult + var r1 error + if rf, ok := ret.Get(0).(func() ([]btcjson.ListUnspentResult, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() []btcjson.ListUnspentResult); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]btcjson.ListUnspentResult) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_ListUnspent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListUnspent' +type RpcClientMock_ListUnspent_Call struct { + *mock.Call +} + +// ListUnspent is a helper method to define mock.On call +func (_e *RpcClientMock_Expecter) ListUnspent() *RpcClientMock_ListUnspent_Call { + return &RpcClientMock_ListUnspent_Call{Call: _e.mock.On("ListUnspent")} +} + +func (_c *RpcClientMock_ListUnspent_Call) Run(run func()) *RpcClientMock_ListUnspent_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientMock_ListUnspent_Call) Return(_a0 []btcjson.ListUnspentResult, _a1 error) *RpcClientMock_ListUnspent_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_ListUnspent_Call) RunAndReturn(run func() ([]btcjson.ListUnspentResult, error)) *RpcClientMock_ListUnspent_Call { + _c.Call.Return(run) + return _c +} + +// ListUnspentMinMaxAddresses provides a mock function with given fields: minConf, maxConf, addrs +func (_m *RpcClientMock) ListUnspentMinMaxAddresses(minConf int, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) { + ret := _m.Called(minConf, maxConf, addrs) + + if len(ret) == 0 { + panic("no return value specified for ListUnspentMinMaxAddresses") + } + + var r0 []btcjson.ListUnspentResult + var r1 error + if rf, ok := ret.Get(0).(func(int, int, []btcutil.Address) ([]btcjson.ListUnspentResult, error)); ok { + return rf(minConf, maxConf, addrs) + } + if rf, ok := ret.Get(0).(func(int, int, []btcutil.Address) []btcjson.ListUnspentResult); ok { + r0 = rf(minConf, maxConf, addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]btcjson.ListUnspentResult) + } + } + + if rf, ok := ret.Get(1).(func(int, int, []btcutil.Address) error); ok { + r1 = rf(minConf, maxConf, addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_ListUnspentMinMaxAddresses_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListUnspentMinMaxAddresses' +type RpcClientMock_ListUnspentMinMaxAddresses_Call struct { + *mock.Call +} + +// ListUnspentMinMaxAddresses is a helper method to define mock.On call +// - minConf int +// - maxConf int +// - addrs []btcutil.Address +func (_e *RpcClientMock_Expecter) ListUnspentMinMaxAddresses(minConf interface{}, maxConf interface{}, addrs interface{}) *RpcClientMock_ListUnspentMinMaxAddresses_Call { + return &RpcClientMock_ListUnspentMinMaxAddresses_Call{Call: _e.mock.On("ListUnspentMinMaxAddresses", minConf, maxConf, addrs)} +} + +func (_c *RpcClientMock_ListUnspentMinMaxAddresses_Call) Run(run func(minConf int, maxConf int, addrs []btcutil.Address)) *RpcClientMock_ListUnspentMinMaxAddresses_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int), args[1].(int), args[2].([]btcutil.Address)) + }) + return _c +} + +func (_c *RpcClientMock_ListUnspentMinMaxAddresses_Call) Return(_a0 []btcjson.ListUnspentResult, _a1 error) *RpcClientMock_ListUnspentMinMaxAddresses_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_ListUnspentMinMaxAddresses_Call) RunAndReturn(run func(int, int, []btcutil.Address) ([]btcjson.ListUnspentResult, error)) *RpcClientMock_ListUnspentMinMaxAddresses_Call { + _c.Call.Return(run) + return _c +} + +// Ping provides a mock function with given fields: +func (_m *RpcClientMock) Ping() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Ping") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RpcClientMock_Ping_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ping' +type RpcClientMock_Ping_Call struct { + *mock.Call +} + +// Ping is a helper method to define mock.On call +func (_e *RpcClientMock_Expecter) Ping() *RpcClientMock_Ping_Call { + return &RpcClientMock_Ping_Call{Call: _e.mock.On("Ping")} +} + +func (_c *RpcClientMock_Ping_Call) Run(run func()) *RpcClientMock_Ping_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientMock_Ping_Call) Return(_a0 error) *RpcClientMock_Ping_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_Ping_Call) RunAndReturn(run func() error) *RpcClientMock_Ping_Call { + _c.Call.Return(run) + return _c +} + +// SendRawTransaction provides a mock function with given fields: tx, allowHighFees +func (_m *RpcClientMock) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) { + ret := _m.Called(tx, allowHighFees) + + if len(ret) == 0 { + panic("no return value specified for SendRawTransaction") + } + + var r0 *chainhash.Hash + var r1 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx, bool) (*chainhash.Hash, error)); ok { + return rf(tx, allowHighFees) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx, bool) *chainhash.Hash); ok { + r0 = rf(tx, allowHighFees) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*chainhash.Hash) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx, bool) error); ok { + r1 = rf(tx, allowHighFees) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_SendRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendRawTransaction' +type RpcClientMock_SendRawTransaction_Call struct { + *mock.Call +} + +// SendRawTransaction is a helper method to define mock.On call +// - tx *wire.MsgTx +// - allowHighFees bool +func (_e *RpcClientMock_Expecter) SendRawTransaction(tx interface{}, allowHighFees interface{}) *RpcClientMock_SendRawTransaction_Call { + return &RpcClientMock_SendRawTransaction_Call{Call: _e.mock.On("SendRawTransaction", tx, allowHighFees)} +} + +func (_c *RpcClientMock_SendRawTransaction_Call) Run(run func(tx *wire.MsgTx, allowHighFees bool)) *RpcClientMock_SendRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx), args[1].(bool)) + }) + return _c +} + +func (_c *RpcClientMock_SendRawTransaction_Call) Return(_a0 *chainhash.Hash, _a1 error) *RpcClientMock_SendRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_SendRawTransaction_Call) RunAndReturn(run func(*wire.MsgTx, bool) (*chainhash.Hash, error)) *RpcClientMock_SendRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// SignRawTransactionWithWallet provides a mock function with given fields: tx +func (_m *RpcClientMock) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) { + ret := _m.Called(tx) + + if len(ret) == 0 { + panic("no return value specified for SignRawTransactionWithWallet") + } + + var r0 *wire.MsgTx + var r1 bool + var r2 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx) (*wire.MsgTx, bool, error)); ok { + return rf(tx) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx) *wire.MsgTx); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgTx) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx) bool); ok { + r1 = rf(tx) + } else { + r1 = ret.Get(1).(bool) + } + + if rf, ok := ret.Get(2).(func(*wire.MsgTx) error); ok { + r2 = rf(tx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// RpcClientMock_SignRawTransactionWithWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SignRawTransactionWithWallet' +type RpcClientMock_SignRawTransactionWithWallet_Call struct { + *mock.Call +} + +// SignRawTransactionWithWallet is a helper method to define mock.On call +// - tx *wire.MsgTx +func (_e *RpcClientMock_Expecter) SignRawTransactionWithWallet(tx interface{}) *RpcClientMock_SignRawTransactionWithWallet_Call { + return &RpcClientMock_SignRawTransactionWithWallet_Call{Call: _e.mock.On("SignRawTransactionWithWallet", tx)} +} + +func (_c *RpcClientMock_SignRawTransactionWithWallet_Call) Run(run func(tx *wire.MsgTx)) *RpcClientMock_SignRawTransactionWithWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx)) + }) + return _c +} + +func (_c *RpcClientMock_SignRawTransactionWithWallet_Call) Return(_a0 *wire.MsgTx, _a1 bool, _a2 error) *RpcClientMock_SignRawTransactionWithWallet_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *RpcClientMock_SignRawTransactionWithWallet_Call) RunAndReturn(run func(*wire.MsgTx) (*wire.MsgTx, bool, error)) *RpcClientMock_SignRawTransactionWithWallet_Call { + _c.Call.Return(run) + return _c +} + +// WalletCreateFundedPsbt provides a mock function with given fields: inputs, outputs, locktime, options, bip32Derivs +func (_m *RpcClientMock) WalletCreateFundedPsbt(inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool) (*btcjson.WalletCreateFundedPsbtResult, error) { + ret := _m.Called(inputs, outputs, locktime, options, bip32Derivs) + + if len(ret) == 0 { + panic("no return value specified for WalletCreateFundedPsbt") + } + + var r0 *btcjson.WalletCreateFundedPsbtResult + var r1 error + if rf, ok := ret.Get(0).(func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) (*btcjson.WalletCreateFundedPsbtResult, error)); ok { + return rf(inputs, outputs, locktime, options, bip32Derivs) + } + if rf, ok := ret.Get(0).(func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) *btcjson.WalletCreateFundedPsbtResult); ok { + r0 = rf(inputs, outputs, locktime, options, bip32Derivs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.WalletCreateFundedPsbtResult) + } + } + + if rf, ok := ret.Get(1).(func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) error); ok { + r1 = rf(inputs, outputs, locktime, options, bip32Derivs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_WalletCreateFundedPsbt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreateFundedPsbt' +type RpcClientMock_WalletCreateFundedPsbt_Call struct { + *mock.Call +} + +// WalletCreateFundedPsbt is a helper method to define mock.On call +// - inputs []btcjson.PsbtInput +// - outputs []btcjson.PsbtOutput +// - locktime *uint32 +// - options *btcjson.WalletCreateFundedPsbtOpts +// - bip32Derivs *bool +func (_e *RpcClientMock_Expecter) WalletCreateFundedPsbt(inputs interface{}, outputs interface{}, locktime interface{}, options interface{}, bip32Derivs interface{}) *RpcClientMock_WalletCreateFundedPsbt_Call { + return &RpcClientMock_WalletCreateFundedPsbt_Call{Call: _e.mock.On("WalletCreateFundedPsbt", inputs, outputs, locktime, options, bip32Derivs)} +} + +func (_c *RpcClientMock_WalletCreateFundedPsbt_Call) Run(run func(inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool)) *RpcClientMock_WalletCreateFundedPsbt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]btcjson.PsbtInput), args[1].([]btcjson.PsbtOutput), args[2].(*uint32), args[3].(*btcjson.WalletCreateFundedPsbtOpts), args[4].(*bool)) + }) + return _c +} + +func (_c *RpcClientMock_WalletCreateFundedPsbt_Call) Return(_a0 *btcjson.WalletCreateFundedPsbtResult, _a1 error) *RpcClientMock_WalletCreateFundedPsbt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_WalletCreateFundedPsbt_Call) RunAndReturn(run func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) (*btcjson.WalletCreateFundedPsbtResult, error)) *RpcClientMock_WalletCreateFundedPsbt_Call { + _c.Call.Return(run) + return _c +} + +// WalletPassphrase provides a mock function with given fields: passphrase, timeoutSecs +func (_m *RpcClientMock) WalletPassphrase(passphrase string, timeoutSecs int64) error { + ret := _m.Called(passphrase, timeoutSecs) + + if len(ret) == 0 { + panic("no return value specified for WalletPassphrase") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, int64) error); ok { + r0 = rf(passphrase, timeoutSecs) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RpcClientMock_WalletPassphrase_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletPassphrase' +type RpcClientMock_WalletPassphrase_Call struct { + *mock.Call +} + +// WalletPassphrase is a helper method to define mock.On call +// - passphrase string +// - timeoutSecs int64 +func (_e *RpcClientMock_Expecter) WalletPassphrase(passphrase interface{}, timeoutSecs interface{}) *RpcClientMock_WalletPassphrase_Call { + return &RpcClientMock_WalletPassphrase_Call{Call: _e.mock.On("WalletPassphrase", passphrase, timeoutSecs)} +} + +func (_c *RpcClientMock_WalletPassphrase_Call) Run(run func(passphrase string, timeoutSecs int64)) *RpcClientMock_WalletPassphrase_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(int64)) + }) + return _c +} + +func (_c *RpcClientMock_WalletPassphrase_Call) Return(_a0 error) *RpcClientMock_WalletPassphrase_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_WalletPassphrase_Call) RunAndReturn(run func(string, int64) error) *RpcClientMock_WalletPassphrase_Call { + _c.Call.Return(run) + return _c +} + +// NewRpcClientMock creates a new instance of RpcClientMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRpcClientMock(t interface { + mock.TestingT + Cleanup(func()) +}) *RpcClientMock { + mock := &RpcClientMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From 9e827ded61c6d9e9c3fabad1ed912437b8d7fa9f Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 25 Mar 2024 11:55:32 +0100 Subject: [PATCH 037/113] fix: sonar warnings --- .../dataproviders/bitcoin/rpc_test.go | 14 +++++----- .../dataproviders/bitcoin/wallet_test.go | 27 ++++++++++--------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/internal/adapters/dataproviders/bitcoin/rpc_test.go b/internal/adapters/dataproviders/bitcoin/rpc_test.go index d321d111..47c0c2e2 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc_test.go +++ b/internal/adapters/dataproviders/bitcoin/rpc_test.go @@ -23,6 +23,8 @@ import ( const ( testnetTestBlockHash = "00000000001e94d85c3e736aa4071d36d26547713820a27af9edbe97489c696f" testnetTestTxHash = "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29" + testnetBlockFile = "block-2582756-testnet.txt" + mainnetBlockFile = "block-696394-mainnet.txt" ) func TestBitcoindRpc_ValidateAddress(t *testing.T) { @@ -110,7 +112,7 @@ func TestBitcoindRpc_GetRawTransaction(t *testing.T) { } func TestBitcoindRpc_GetRawTransaction_FromBlock(t *testing.T) { - mainnetBlock := getTestBlock(t, "block-696394-mainnet.txt") + mainnetBlock := getTestBlock(t, mainnetBlockFile) tx, err := mainnetBlock.Tx(0) require.NoError(t, err) client := &mocks.RpcClientMock{} @@ -196,7 +198,7 @@ func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { } func TestBitcoindRpc_BuildMerkleBranch(t *testing.T) { - block := getTestBlock(t, "block-2582756-testnet.txt") + block := getTestBlock(t, testnetBlockFile) client := &mocks.RpcClientMock{} client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() @@ -252,7 +254,7 @@ func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { } func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { - block := getTestBlock(t, "block-2582756-testnet.txt") + block := getTestBlock(t, testnetBlockFile) client := &mocks.RpcClientMock{} client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() @@ -265,7 +267,7 @@ func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { } func TestBitcoindRpc_GetPartialMerkleTree(t *testing.T) { - block := getTestBlock(t, "block-2582756-testnet.txt") + block := getTestBlock(t, testnetBlockFile) client := &mocks.RpcClientMock{} client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() @@ -336,7 +338,7 @@ func TestBitcoindRpc_BuildMerkleBranch_MainnetBlock(t *testing.T) { "04dbd50300", }, } - mainnetBlock := getTestBlock(t, "block-696394-mainnet.txt") + mainnetBlock := getTestBlock(t, mainnetBlockFile) for _, c := range cases { client := &mocks.RpcClientMock{} client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() @@ -356,7 +358,7 @@ func TestBitcoindRpc_GetPartialMerkleTree_ErrorHandling(t *testing.T) { require.Nil(t, pmt) client := &mocks.RpcClientMock{} - block := getTestBlock(t, "block-2582756-testnet.txt") + block := getTestBlock(t, testnetBlockFile) msgBlock := block.MsgBlock() msgBlock.Transactions = append(msgBlock.Transactions, msgBlock.Transactions...) client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() diff --git a/internal/adapters/dataproviders/bitcoin/wallet_test.go b/internal/adapters/dataproviders/bitcoin/wallet_test.go index 352e32dd..cdadc835 100644 --- a/internal/adapters/dataproviders/bitcoin/wallet_test.go +++ b/internal/adapters/dataproviders/bitcoin/wallet_test.go @@ -24,12 +24,13 @@ import ( ) const ( - mockPassword = "pwd" - mockFeeRate = 0.0001 - testnetAddress = "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5" - mainnetAddress = "141dsd6YZxdKcmTZckG4Q9qGzJbR1Jc9kv" - expiredTime = 1711098457 // 2024-03-22 - unexpiredTime = 1900400857 // 2030-03-22 + mockPassword = "pwd" + mockFeeRate = 0.0001 + testnetAddress = "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5" + mainnetAddress = "141dsd6YZxdKcmTZckG4Q9qGzJbR1Jc9kv" + expiredTime = 1711098457 // 2024-03-22 + unexpiredTime = 1900400857 // 2030-03-22 + paymentScriptMock = "a payment script" ) func TestBitcoindWallet_Unlock(t *testing.T) { @@ -201,7 +202,7 @@ func setupSendWithOpReturnTest(t *testing.T, client *mocks.RpcClientMock, encryp ).Return(&wire.MsgTx{ Version: 0, TxIn: nil, - TxOut: []*wire.TxOut{{Value: int64(satoshis), PkScript: []byte("a payment script")}}, + TxOut: []*wire.TxOut{{Value: int64(satoshis), PkScript: []byte(paymentScriptMock)}}, LockTime: 0, }, nil).Once() @@ -216,7 +217,7 @@ func setupSendWithOpReturnTest(t *testing.T, client *mocks.RpcClientMock, encryp Version: 0, TxIn: nil, TxOut: []*wire.TxOut{ - {Value: int64(satoshis), PkScript: []byte("a payment script")}, + {Value: int64(satoshis), PkScript: []byte(paymentScriptMock)}, {Value: int64(0), PkScript: []byte{0x6a, 0x08, 0x02, 0x01, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00}}, }, LockTime: 0, @@ -280,7 +281,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, - TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte(paymentScriptMock)}}, LockTime: 0, }, nil).Once() client.On("GetWalletInfo").Return(nil, assert.AnError).Once() @@ -289,7 +290,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, - TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte(paymentScriptMock)}}, LockTime: 0, }, nil).Once() for i := 0; i < txscript.MaxDataCarrierSize; i++ { @@ -300,7 +301,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, - TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte(paymentScriptMock)}}, LockTime: 0, }, nil).Once() nonExpiredLockUntil := unexpiredTime @@ -314,7 +315,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, - TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte(paymentScriptMock)}}, LockTime: 0, }, nil).Once() nonExpiredLockUntil := unexpiredTime @@ -329,7 +330,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, - TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte("a payment script")}}, + TxOut: []*wire.TxOut{{Value: int64(1), PkScript: []byte(paymentScriptMock)}}, LockTime: 0, }, nil).Once() nonExpiredLockUntil := unexpiredTime From ff724fa748091ea776e5265dec67ffe9fcb9649a Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 26 Mar 2024 09:28:46 +0100 Subject: [PATCH 038/113] docs: add LP management documentation --- OpenApi.yml | 115 ++ coverage/cover.out | 1034 ++++++++++++----- docs/Environment.md | 51 + docs/LP-Management.md | 100 ++ docs/lp-management/img.png | Bin 0 -> 24927 bytes docs/lp-management/img_1.png | Bin 0 -> 36787 bytes .../dataproviders/bitcoin/wallet_test.go | 37 +- sample-config.env | 2 +- 8 files changed, 1005 insertions(+), 334 deletions(-) create mode 100644 docs/Environment.md create mode 100644 docs/LP-Management.md create mode 100644 docs/lp-management/img.png create mode 100644 docs/lp-management/img_1.png diff --git a/OpenApi.yml b/OpenApi.yml index e3de88d1..7d9d268e 100644 --- a/OpenApi.yml +++ b/OpenApi.yml @@ -59,6 +59,11 @@ components: status: type: boolean type: object + ConfirmationsPerAmount: + properties: + key: + type: integer + type: object DepositEventDTO: properties: amount: @@ -78,6 +83,21 @@ components: format: date-time type: string type: object + GeneralConfiguration: + properties: + btcConfirmations: + $ref: '#/components/schemas/ConfirmationsPerAmount' + type: object + rskConfirmations: + $ref: '#/components/schemas/ConfirmationsPerAmount' + type: object + type: object + GeneralConfigurationRequest: + properties: + configuration: + $ref: '#/components/schemas/GeneralConfiguration' + type: object + type: object GetCollateralResponse: properties: collateral: @@ -162,6 +182,27 @@ components: - status - providerType type: object + PeginConfiguration: + properties: + callFee: + $ref: '#/components/schemas/Wei' + callTime: + type: integer + maxValue: + $ref: '#/components/schemas/Wei' + minValue: + $ref: '#/components/schemas/Wei' + penaltyFee: + $ref: '#/components/schemas/Wei' + timeForDeposit: + type: integer + type: object + PeginConfigurationRequest: + properties: + configuration: + $ref: '#/components/schemas/PeginConfiguration' + type: object + type: object PeginQuoteDTO: properties: agreementTimestamp: @@ -282,6 +323,29 @@ components: - rskRefundAddress - bitcoinRefundAddress type: object + PegoutConfiguration: + properties: + callFee: + $ref: '#/components/schemas/Wei' + callTime: + type: integer + expireBlocks: + type: integer + maxValue: + $ref: '#/components/schemas/Wei' + minValue: + $ref: '#/components/schemas/Wei' + penaltyFee: + $ref: '#/components/schemas/Wei' + timeForDeposit: + type: integer + type: object + PegoutConfigurationRequest: + properties: + configuration: + $ref: '#/components/schemas/PegoutConfiguration' + type: object + type: object PegoutQuoteDTO: properties: agreementTimestamp: @@ -410,6 +474,8 @@ components: rsk: type: string type: object + Wei: {} + entities.Wei: {} pkg.AcceptQuoteRequest: properties: quoteHash: @@ -447,6 +513,27 @@ info: version: 1.2.1 openapi: 3.0.0 paths: + /configuration: + get: + description: ' Get all the configurations for the liquidity provider. Included + in the management API.' + responses: + "200": + description: "" + summary: Get configurations + post: + description: ' Set general configurations of the server. Included in the management + API.' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralConfigurationRequest' + required: true + responses: + "204": + description: "" + summary: Set General Config /getProviders: get: description: ' Returns a list of providers.' @@ -514,6 +601,20 @@ paths: $ref: '#/components/schemas/GetCollateralResponse' description: "" summary: Get PegIn Collateral + /pegin/configuration: + post: + description: ' Set the configuration for the Pegin service. Included in the + management API.' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PeginConfigurationRequest' + required: true + responses: + "204": + description: "" + summary: Set Pegin Config /pegin/getQuote: post: description: ' Gets Pegin Quote' @@ -583,6 +684,20 @@ paths: $ref: '#/components/schemas/GetCollateralResponse' description: "" summary: Get PegOut Collateral + /pegout/configuration: + post: + description: ' Set the configuration for the Pegout service. Included in the + management API.' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PegoutConfigurationRequest' + required: true + responses: + "204": + description: "" + summary: Set Pegout Config /pegout/getQuotes: post: description: ' Gets Pegout Quote' diff --git a/coverage/cover.out b/coverage/cover.out index d250aac2..33359c22 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -1,156 +1,8 @@ mode: atomic -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:29.90,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.55,37.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:39.64,41.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.76,50.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:50.16,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.8,52.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.36,54.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.2,55.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.17,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:58.2,59.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.86,63.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:63.48,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:66.2,66.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:69.54,71.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:71.44,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:74.2,74.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:77.110,84.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:84.75,86.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:86.31,89.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:89.9,93.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:94.3,98.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.2,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:107.95,113.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.22,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.2,123.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.2,127.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.31,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:135.2,136.25 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,140.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.29,141.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.18,143.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:146.2,146.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:146.69,148.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.17,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,154.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.117,159.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:159.16,161.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.2,163.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.2,168.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.16,170.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.2,173.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.2,181.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:184.92,186.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:186.16,188.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.2,190.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.16,192.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.2,194.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.16,196.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.2,198.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,66.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:69.67,72.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:72.16,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:76.2,76.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:76.29,77.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:77.21,79.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:81.2,81.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.125,86.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,95.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,100.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:100.16,102.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:103.2,112.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.24,113.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:113.40,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:118.2,120.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:123.2,124.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:124.16,126.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:131.2,131.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:134.46,136.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.16,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:139.2,139.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:139.91,142.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.2,143.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:146.67,148.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.16,150.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:151.2,151.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:154.115,159.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:159.16,161.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:162.2,163.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.16,165.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:167.2,168.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:168.29,170.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.10,177.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.3,178.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.39,180.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.3,181.119 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:184.2,184.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:184.30,187.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:188.2,188.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:191.46,193.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:195.48,197.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:20.79,22.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:24.110,38.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:38.16,40.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:41.2,43.12 3 1 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -162,17 +14,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -182,7 +34,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -191,26 +43,26 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 @@ -229,7 +81,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 @@ -269,41 +121,6 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 100 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 100 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 @@ -424,7 +241,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 15 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 @@ -446,15 +263,317 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 100 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 100 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -497,24 +616,300 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 128 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 63 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 62 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 192 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 38 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 2060 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 8190 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 4134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 2474 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 46 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 @@ -673,6 +1068,15 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -715,24 +1119,24 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 @@ -990,24 +1394,24 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 11 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 11 @@ -1332,24 +1736,24 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 76 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 19 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 @@ -1690,24 +2094,24 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:28.49,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:32.35,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:36.34,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:40.47,45.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:47.47,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:81.88,84.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:84.9,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.2,87.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.29,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.2,90.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:21.51,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:41.50,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:65.30,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:25.63,27.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:28.40,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:49.107,51.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:51.19,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:54.2,54.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 diff --git a/docs/Environment.md b/docs/Environment.md new file mode 100644 index 00000000..b11decce --- /dev/null +++ b/docs/Environment.md @@ -0,0 +1,51 @@ +# Environment variables +These are the environment variables required by the liquidity provider server (LPS). The following table lists the environment variables and their descriptions and whether it's mandatory or not. + +| **Name** | **Description** | **Example** | **Mandatory** | +|:-----------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------:| +| `LPS_STAGE` | The network where LPS will be running on. | One of the following: `regtest testnet mainnet` | Yes | +| `PORT` | The port number to run the http server of the LPS on. | `8080` | Yes | +| `LOG_LEVEL` | Level for the application logs. | One of the following: `panic fatal error warn info debug trace` | Yes | +| `LOG_FILE` | File to send the logs to. If not provided logs will be sent to standard output. | `/home/lps.log` | No | +| `ENABLE_MANAGEMENT_API` | Whether to enable the management API endpoints or not. To know more read the [Management API Documentation file](#TODO documentation file). If not provided default value will be **false**. | `true` or `false` | No | +| `AWS_LOCAL_ENDPOINT` | Endpoint for the AWS local instance (localstack). Only required if LPS is running in regtest mode. | `http://localhost:4444` | No | +| `MONGODB_USER` | User to connect to MongoDB. | `root` | Yes | +| `MONGODB_PASSWORD` | Password to connect to MongoDB. | `` | Yes | +| `MONGODB_HOST` | Host to connect to MongoDB. | `localhost` | Yes | +| `MONGODB_PORT` | Port to connect to MongoDB. | `27017` | Yes | +| `RSK_ENDPOINT` | URL to connect to the Rootstock node. Must be an http endpoint. | `http://rskj:4444` | Yes | +| `CHAIN_ID` | RSK chain id. | 33 | Yes | +| `LBC_ADDR` | Address of the Liquidity Bridge Contract (LBC). | `0x8901a2Bbf639bFD21A97004BA4D7aE2BD00B8DA8` | Yes | +| `RSK_BRIDGE_ADDR` | Address of the Rootstock bridge. | `0x0000000000000000000000000000000001000006` | Yes | +| `RSK_REQUIRED_BRIDGE_CONFIRMATIONS` | The number of confirmations that need to pass before being able to register a pegin, it changes depending on the network. | 100 | Yes | +| `IRIS_ACTIVATION_HEIGHT` | Block number where the iris updated is activated, depends on the network. | 1500000 | Yes | +| `ERP_KEYS` | Keys that are used as a secondary multisig that would be allowed to spend UTXOs after a year they were created. | 0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3,
0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14,
034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f | Yes | +| `ACCOUNT_NUM` | The keystore account number to use. If not provided default value will be 0. | 2 0 | No | +| `DAO_FEE_COLLECTOR_ADDRESS` | Address of the DAO fee collector. | `0x86B6534687A176A476C16083a373fB9Fe4FAb449` | Yes | +| `KEY_SECRET` | Name of the secret of AWS secrets manager that contains the encrypted json of the liquidity provider RSK account. | `FlyoverTestEnv/LPS-KEY` | Yes | +| `PASSWORD_SECRET` | Name of the secret of AWS secrets manager that contains the password of the encrypted json of the liquidity provider RSK account. | `FlyoverTestEnv/LPS-PASSWORD` | Yes | +| `BTC_NETWORK` | Network to use when connecting to the Bitcoin node. | One of the following: `regtest testnet mainnet` | Yes | +| `BTC_USERNAME` | Username for the bitcoind rpc server. | `user` | Yes | +| `BTC_PASSWORD` | Password for the bitcoind rpc server. | `password` | Yes | +| `BTC_ENDPOINT` | Endpoint of the bitcoind rpc server. Must be an HTTP connection. | `localhost:5555` | Yes | +| `BTC_TX_FEE_RATE` | Bitcoin tx fee rate in BTC/kvB to use when creating transactions. | 0.00025 | Yes | +| `BTC_ENCRYPTED_WALLET` | Whether the wallet to use of the bitcoind node is encrypted or not. Its a boolean value. | true | Yes | +| `BTC_WALLET_PASSWORD` | Password to unlock the wallet of the bitcoind node when it is encrypted. | `password` | No | +| `ALERT_SENDER_EMAIL` | The email that will be used to send alerts. | no-reply@mail.flyover.rifcomputing.net | Yes | +| `ALERT_RECIPIENT_EMAIL` | The email that will receive the alerts. | test@iovlabs.org | Yes | +| `BTC_ADDR` | Bitcoin address of the liquidity provider. | `mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6` | Yes | +| `PROVIDER_NAME` | The liquidity provider name to be registered in the liquidity bridge contract. | `Default provider` | Yes | +| `BASE_URL` | URL of the LPS to register in the liquidity bridge contract. | `http://localhost:8080` | Yes | +| `PROVIDER_TYPE` | Whether the liquidity provider will provide for pegin, pegout or both operations. | One of the following: `pegin pegout both` | Yes | +| `PEGOUT_DEPOSIT_CACHE_START_BLOCK` | If provided, the LPS will upsert into the database all the pegout deposits that were done from this block to the current one. | 500 | No | +| `CAPTCHA_SECRET_KEY` | Captcha key used in the server to validate client requests. | `
` | No | +| `CAPTCHA_SITE_KEY` | Captcha key used by the client to perform the challenge. | `` | No | +| `CAPTCHA_THRESHOLD` | Threshold from zero to one to consider request as valid when using recaptcha v3 (right now we're using v2). | 0.8 | No | +| `DISABLE_CAPTCHA` | Whether to disable captcha validation or not. Its a boolean value. | true | No | +| `CAPTCHA_URL` | Url to make the captcha verification. | `https://www.google.com/recaptcha/api/siteverify` | No | + +## AWS variables +You may notice that in [sample-config.env](../sample-config.env) there are some environment variables that are related to AWS. These variables are required to use AWS services, however, they are not listed in the table as the AWS SDK has the functionality to load them from multiple sources. For that reason, they are not accessed directly from the code and are not listed in the table above. + +## Other variables +You may notice that in [sample-config.env](../sample-config.env) there are variables that aren't in the table and don't belong to AWS. Those variables are used to run scripts or to setup the local environment, they should not be present in a productive environment for this application. \ No newline at end of file diff --git a/docs/LP-Management.md b/docs/LP-Management.md new file mode 100644 index 00000000..b28d2551 --- /dev/null +++ b/docs/LP-Management.md @@ -0,0 +1,100 @@ +# Liquidity Provider Server - Liquidity Provider specification +The intent of this document is to explain all the points that the liquidity provider (LP) should know in order to operate his instance of the liquidity +provider server (LPS). +This document contains both technical and non-technical information, so it is recommended to be reviewed by the LP itself and the person who is in change of +setting up the environment where the LPS is going to be deployed. + +## Table of contents +- [Context](#Context) +- [LPS Configuration](#Justification) +- Minimum security requirements +- Private key management +- Other + - Headers + +## Context +In the Flyover Protocol, there are two main actors, the regular user (user), who is party interested in executing Peg-In/Peg-Out operations and the Liquidity +Provider (LP), who puts liquidity to speed up the operation for the user in exchange for a fee as a reward. In order to do this, the user and the LP need to +agree on the terms of the service (a Peg-In/Peg-Out *Quote*). This implies that the different LPs may offer different quotes, so the user needs to be able to +communicate with each one of the LPs to decide which one is going to use for the operation. + +The user interacts with the Flyover Protocol through the [Flyover SDK](https://github.com/rsksmart/unified-bridges-sdk/tree/main/packages/flyover-sdk). This +SDK fetches the list of the available LP from the liquidity bridge contract (LBC), this contract returns a list where each element has some information about +the LP, among this information will be the URL of the liquidity provider server (LPS) instance of that LP so the user can communicate with it. This means +that **the LPS has an API that every user interacts with to do the quote agreement**. + +The LP also needs to interact with the protocol to perform some management operations related to topics such as collateral, funds, fees management, configuration, +etc. The LP does this operation through the LPS, that's the reason why the LPS also has an API that the LP interacts with to perform various management operations. + +To summarize, the LPS has two main APIs: +- **User/Public API**: This API is used by the user to interact with the LP to agree on a quote. +- **LP/Management API**: This API is used by the LP to interact with the LPS to perform management operations. + +

+ +If we zoom in on one LPS: + +
+ Internal view of LPS +
+ +The fact that LPS' API is divided in a public one and a private one implies that the Management API has some security requirements that need to be addressed in order +to ensure that it will be only used by the LP. Some of these measures are provided out of the box by the LPS but some others require additional configuration for the +environment where the LPS will run. + +## LPS Configuration +By default, the Management API is disabled, and it can be enabled only by setting the `ENABLE_MANAGEMENT_API` environment variable to `true`. This is a security measure +to ensure that the API will only be accessible if it is explicitly enabled by the LP (or the person setting up the environment). + +Once this variable is set to true **it is responsibility of the LP and the person setting up the environment to ensure that the API is properly secured**. + +TODO: complete this section with the explanation of the authentication mechanism once the LP tool epic is implemented. + +## Minimum security requirements +The full detail of the endpoints and how to call them can be found in the [OpenAPI file](../OpenApi.yml) of the LPS, the following list contains a short description of each endpoint and +weather it should be treated as public or secured as a private endpoint + +- PUBLIC: accessible by anyone +- PRIVATE: only accessible by LP +- ANY: is up to the administrator to set it as private or public + +| **Endpoint** | **Method** | **Visibility** | **Description** | +|:--------------------------:|:----------:|:--------------:|:---------------------------------------------------:| +| /health | GET | ANY | Healthcheck | +| /getProviders | GET | PUBLIC | Get list of registered LPs | +| /providers/details | GET | PUBLIC | Get details of the LP that owns this LPS | +| /pegin/getQuote | POST | PUBLIC | Get pegin quote terms | +| /pegin/acceptQuote | POST | PUBLIC | Accept pegin quote terms | +| /pegout/getQuotes | POST | PUBLIC | Get pegout quote terms | +| /pegout/acceptQuote | POST | PUBLIC | Accept pegout quote terms | +| /pegin/collateral | GET | PRIVATE | Get collateral locked by LP for pegin | +| /pegout/collateral | GET | PRIVATE | Get collateral locked by LP for pegout | +| /pegin/addCollateral | POST | PRIVATE | Lock collateral for pegin | +| /pegout/addCollateral | POST | PRIVATE | Lock collateral for pegout | +| /pegin/withdrawCollateral | POST | PRIVATE | Withdraw collateral locked for pegin | +| /pegout/withdrawCollateral | POST | PRIVATE | Withdraw collateral locked for pegout | +| /provider/changeStatus | POST | PRIVATE | Change status of the LP that owns this LPS | +| /provider/resignation | POST | PRIVATE | Resign as flyover liquidity provider | +| /userQuotes | GET | PUBLIC | Get list of pegout deposits made by a user | +| /configuration | GET | PRIVATE | Get the configuration of this LPS | +| /configuration | POST | PRIVATE | Modify the general configuration of this LPS | +| /pegin/configuration | POST | PRIVATE | Modify the pegin related configuration of this LPS | +| /pegout/configuration | POST | PRIVATE | Modify the pegout related configuration of this LPS | + +## Private key management +TODO: complete this section after wallet management epic is implemented to explain properly all the mechanisms of wallet management offered by LPS + +The LPS performs operations in behalf of the LP during the process of the protocol, it means that it requires access to both LP's Bitcoin and +Rootstock wallets. There are three options supported in order to provide this access to the LPS: +- **Provide the private key (PK) in a file (NOT RECOMMENDED)**: in this option the LP can provide the PKs through text files, the LPS will read +them from there and use them to sign the transactions. +- **Provide the PK through a secret management service (NOT RECOMMENDED)**: in this option the LPS will get the PK from a secret management service +and use it to sign the transactions, this is the list of supported services at the moment: + - Amazon secrets manager +- **Use a third party wallet management service (RECOMMENDED)**: in this option the LPS won't have knowledge of any PK of the LP at any point, instead, +it will use a third party service to delegate the signing of the transactions. The services supported by the LPS right now are the following: + - Fireblocks + + diff --git a/docs/lp-management/img.png b/docs/lp-management/img.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe15d3af8ea1b0c48d13a0cf01dac372b2c59bf GIT binary patch literal 24927 zcmeFZc|6p8`!=q+B#IWa5L&J%6vYriS(368#xk~~7$#JE9PiYx(aI7J7aI7*}w-!EW%;=Qh;II?d)jDBv-DaeRyHfw#Qtj2{{>@HC!KFqy zgp1PqOwv8(by6OS$g1MjE44>_gA6__hWRiM=D-TRQC-mw7FU` zZ5+qlr@R_4!xI72#BIK0)dc^k4qyMaiG{?B8>`@+9J`VvKlUPja2yXff#pR0_-Yw! zy7EDl_W#!(+_-H~9YD=8&WOk|B@2Z=bs?Qg33Xx+pUk@iZ|KOk58I)1Ew$`Rgvv;t z6Pv}*Z%NmuwHT_q^fxArSKBG~5 z!vVs(*HkV1JmdT5xWsxd$_If@geKZ${%lq9R?Z_#(J2|X=iAjZPt#5D!*$KdW~YH z$LM<~t2sEd?rRL&F8$m#k+i%}OI?5TMfLKcn+7gaKTd)6_<-@-DT;$*UzLAx30gDM zd$jXgugGa6v^Q?=rtA?6X4V_!vN*R{owxBFMNQ`fdk8bir^b4^s8WyD!K~oetclf@ zTt|*U1uR^5A1fQ^zQhiSU$a4_@x>{OQ<%_$?nL2Y?qVrP*J6~8b3Tr54-BHHTOogK;^ znZE8uhpJ{SR7e}NZ~p74gw%M*W!z6E1{w{o`)c4Eim*+uDkq!IjL|xpFY2+ZlaBcm z_?iv=8qrX?kXoPrv~|v{Z;E|>QQxN^HqGVPm@09!^0{+aM*9k{emOavL*Km;^bG{m zj7be9VcT*N%0`R3 zy5ltO{QXWJjb*xqGLl@YWoD1!0)=rNt-WOJEi1+D_ zaiBjxF=kCzSxvXMYv8_L+J+gR#pz&qpV8tJ<1F2%jCl73rGAE)Z4ouocX}**G)~!* z*khYxr6hO#`}sC&UZVPxG2O$p-!f6TXaU7~EWovTJGc;shO7(qi6y{w1@6DUscAg=uyc>$gf@ zacj7J$h!R5KvG~YwS!N%IokT$hbJyA(bm&rJ)@icYAtpIawI%1hP^)}v=J}Vm z`fZozqUVVm8V>X22OO?e^V4E~v^^t}BzA7H;U<5YSe)(~kTlEq?+?s=@-6= z4KM0ssxRk?jhFNV6l&r;EcLx)eWxy0_`@#LpXfVw7=>fXk9L(P4l~JxU8rLjfy+x% z%gXL#-7Sa8zHVtDnaLD78Zy7DFrKvLSa(f1OKxI~Ozm)tw>$kr^3vM~kvR5?WkW|@ z_EG#ooNM`eKbW{)^IT$n=S6)-4hyTXciIFldKTi^4!O5kd&lHf&3&-Zk>g>Nm1Vqk z>#Z#78Jp^MZ;UDT93Cqn>qdzuuG)5dCVO$@Y}{WQN@>!=&|bhvGVUlZM8%Qg2$_hF1|N1uDpJAVx+LK^Em$V9f{b@drv;wW^?^z zD-m56a7T^ZYMkyd)a)=nHQN7BNAxi4x22=!M%r?dlps*`*%pOU6^7Q;7v9|Un%CT@ zdeQfQ;MzD8&LO9I314A#9KxfYax#46W&D!=^5XR9#dViHJkCF}ZvUSogHx(`Eg6Q2 z$nL!u2wNkKTO$5^82@kpgPCJp(f4Io$;P8ed#X$-)wvuW(!wQr{l!k7uMfSpKM1`p z61ecg>vn!()GPAfz2R14!*EV#on$((ElVSWM`1Ex_FJ?9mXyKZ{>1UhW#FxnLz7BK z{Vg@l`dc;z*Qswu%oX2DTNlt5(nc(TnH(+3WCjskC~<-zUvLtY({PD#oTc(7{AWQ| z;?ei zQgk8}M3g;bweM|3Sr%VDoS^Jk@Unvt6lAEr*lJ^DXHj&fdu z!Xy6OUR^H5(Iz!cC=WAL0_$7rm5T{wt{nwwA_3W(cBproM(xZh!nHLRd=_v+GH}Br zES;hg6JpCVVF^|z2u1d_5&cgsUGMaSH6%(s9-bwdnSHW!qzQWUc-Y#o3x!0p+s=0t zyA&(c#4OM2)i;F8)km<6kJQXY>@xaCp~v~Gp@KWC=Zs%>lwzBNWA`PgP2

xrLUvJMD_nD)57d$4=H zC*xIyMh@Oca8SP9jLU^5iN!XNAvs_4wB@-OZ5vRQV5NHxPuhys=RZ1BE)-f6u!tAN zpp>Gj=$`(Jcg|Q>f=0;H@D9demW?T)%V#WP{kCGy0wK|EB3jB)7gTeurqPK-8EP47&X zarGxS-`c~tuWUjh+SUAM-AmNHV^TsqPLgHOWrad8qit+0ep#hR(lARQ_TByfyYZyJ zr4F@is)n2{P1UhG+Nm6+0ir!&;*Xn00nFhx3djriytyklrHsGKo>JDt3*2XDsyH^p zm-@~{xn^*X6YVn&bh~wzHc4YB@BBSEHs|?toGNtHz^Uwr+6K5|=#QcL7&#Zi_)eAa zO8dKlQd=vs$5->}>Te~W0{2iHc2i#Q69nIh$=|#s9%Qtb!=JipmrCHsJLQh2>j)@6 zfwS)X(%j@(egbMetnYQ?<4ezbJ7M1z&GX>n__`LpQb4*&i#R#)XSpf?HNFW`xC!$K z!Cc3$Z^qQ<@XKVqMHdbaq&iiF%y4sknGG?0@+tG{$!~{FscYbVg>n_gIvEYzOy*lp zX0}Cf_MZ~^a(#i2MaC+MDm6&`*7VfC*abuW<4)p!sbYUW2M0&+HiBT*SuFW1;nrd` zzp1B%To=jd+KG$sOuruWudmSm)W=t2{eRBn5!1hYdA48HeI40i9r?Q!z@lB1>&T}< zSeL#8Is2)MQd&mJ^PWhelV{}*W<>J`Gm&|Xp#DuZ!KSGia{Sw5Y`W#0nqMRNX+Ff1 z^9Xr8Db^hGxj&nlDEV)%BV|O0H4QP=pGuu$0M>r{YIw8GPCIeK#E~lQ=3shk2%X0e zLFupV0hlj!-01ZRhvd&ADxSkkRE76=L!=KM(g-RNp*GbJvt&A}z1StrBL4zs;W|f---2)USY!ChSPD*Zkf=hl1V@OdFm0H)WSfpJk?Oru1@j#=(li_E`yR_xj6m_n zl4!{-{5<=FF_CI>Sj$FME4ddxO!iuqsb07M6`iO%K)~855zp3h>A1F>hgqNgr1U4) z)r5BN>s5G-UK_tFu(H3b;y96BUIQ?!oo_r@?qL#fcz zJY92R%x=xl_L!^eIX{593M0-M8ITm19>YwUL1(H^#}g^D^6^7ZUHaJn`21#yYFThm zx24K|{$2c^KmH2Du6Ik*fy-@`%S-cPw3$GXDfw>e_w$^GLh1qIwC}Etoi)=}r9l;0 zK=7=8c6cl<7TL3=PD{y4TbH-Gc2)Wm_M|6T98BTo3}yzcAa7bMN^Yat%yV*v+H|)& zZLle&$L!vQe_o6}mm9cPN8Pb3bDICK(r)9ItyyT#&TY1Sc9;@Zm+7ph41HXsGd6Du zcO)HVP2A@<_qyr;ASZMbIz~c8qlHzSk+<|La%POYwoPu@3>&0ep<|<$wVcpj3;T~9 z1coilKbRSp!`&zPX`}O>0bt!NQgZKq)=Ty6@&`=n-PdY#@DnbV>Ja@Z%OvYj*}M;nh#+;^fszbR5Kiu!9yxOJb-k~vL4B?#O|xlPA^ zN48%+o$0xS<||WpHY*0IogS*x_!A ztORVX95;6DrOfSJVG4pYJ+p~%UMzEdgdiciE%wK`bysNI`?YZ#f3O*|2w8|n1J|$Q znJpw5f8R05pJ@e%_+ggYzLia#W7EZ8(?Hm{Zb981;F*2rD4Sf;<7N4Z@Y?R5pAx4tKlfVPddLbpY>w3b(>afo;IVq~xDT55gKquT+u@y5 zO&R%W-(Re8S|4MV`#-#z4FZf&&aJXtC2rp19|SY1(ABwlzw+AeAy9)^Tb6Z}ppi3d z&W}`_Wg`W3^)NxYD^^3TjcmuiMHQbJQKWTei^Gc>tH!LIQs$U*?BTGSswe;T#jyi= zEcXKm5RhyeYG=H6uaCp)+ndL%Z)*S7YkR{+V?S0k?`l~a+rlFy3#Sx$XbR0|6Bp|9CV_Fz-ZhMh<0RHX<1HLcc0<9%vw{O7|-{rsOuJio^55TEdz0p{ zSm1(PBA#_%;=M#tsdvl)KYI7BA|SrlBn;~Ndw z&aJ*?qxxlF)`okZ9HH{T{qsADaM3Uy|KqjRUBIGGNt)%v^X9nni|ffEwLa9q?&GIF zWF!SRk5x_>GB-rP#Z02$Uowp5%xGy&Nyc8A>3u?FkB^EZ7aXo@soZ(RFnagP1< zG4^iiS3he_0HM)7ynjFICw%NObHAF3H)d2QJ2n65-l#g=ek1FJqW_#nAwcPgpLH^E zNWQEDKBhR@jGD<8V#(H80-7}6rMbk-c3zQagQBdom+S zkSAl?Yp`jq9hf^bz{$u@Uw?oNd4)|wu zS;8>!vVr=dhx<#;ZO@=ij=jaXJ{F353+bZkiWxzJv%>ns z6s5(Wu!M{zJ>|_1Vpce{h|eo3TzI|Cy~ndHW^csNSKS^h`d;SOvW(K|A%i-&sh@wr z;r`)3M*9_ELqZXdBlBz`pXjmnoshbx%DS)CicHN4NSW4$Uf?uatOka3%JIOtawmj(pNh!>|Br$LBG5wJP2{D#MxrZ&`dm$}m{91|`fEVFMl zi<+n&SjAh`nKMtX?%ZloL&w$|TRTB$&Zy%}3T(T`nC%U6$(K5LKOvuJv zgxASQ+SBtT)r&MfLp7j>E>QE45|n@;7!$16B%%x1DDCcO2m_b=i8ePoDTe~c+X|I*RaxoV9CqFhZ*xDC=*PpJ83`{t9=sTgirjnAHCX+5j-TghcTRKSHc(a(v*zp zpc6%3X%UL9ef!`5$fCGGKA=E?L6J0c&A-4YFlw% z3G?vW?@#v_G)L~Zn0^wHL@+N^w&$Ykf^g7T;nQK4Vd ze!knAe*ETYg&UF-VmdmK&?WU%xvq2nI_J`>3*XQ8^ruD{6!7o6gTF3lT0}k*eJIB< zQJa7!(52{iHE@7$N0!;gh-i`n?kd~LQ#izcW+Oc}iyA3A^>9yr$Tpk2u2%Q#PcP?s zh~DPaw)$(+61z`^3w0zJsvE@dn(P~rtxi}neh+Hs5#CfVIe|M`;4-Q($N4n1lFhW7a+5!YMUQ6~*GR_BntwW5 zM4nRu-9;$wgtKKKA9)~W6dx`xZ%%Ds zg?I+2sn>+^+V2s+$Om%N3QjY?GPI5y_Y%mywG|^++FFzOApQN_`1HK=U73L*MD9i4 z?k^i=-g++g<3VVX^I9v%A>j~}5WDG7b|7s_wkVp@gx!y@5ETt0)k3F_x%bz%A33s7 zb@D;NLo;f$jeOZd*CcGUMvACJVgR4&MzZEGUqviUaY<>|XK*P&$U@bPx|WB4zfARN z_BQTD|MJ2$Xvn&1gu=1JgExhgqTYtkS##pq>9llIYS>2Rb6j_%gy_w%j=t5Vv zh1_&MrD;<)q~|Uh+k@V}^}uv~O1a246WgiT(?{@Nj%O@h|xC|NixV zZ8R{4D+@ZxoYH;eI5=(|$8z5IzKi0}4!lzR)M(e5wkk36mkX87KUZ}*&8CdD=huvM zl{7ATX{u4Y$8F~4uPyUAQM%=+8A~9;miD>c*8J-V=3m~1>q7?D8){Bl!#JH7P^naC z@?%YL%TFCCo61s);>$7fqoICSAe#E?q>Yn`W`N;?5yqrI0BgPn2RM$mK7 zIaVDTgcT6wL)_eDG;(>-d-P_PlTRi^|eMAR`;tQdaNCS6=M`!VtwTvNP*0@m$Eik1J_gTNrPq5Q*mRbFc3Dg zU42WC15aSt88-OS+pt;kPbxosyt}Ltj@Jb)u0{Zpp%?SHcf;3bd`8^lmjpWg{l4gD z2`b*@-m8?R0HbZe6e2$so!_$W^x5*`XNXS0(FQL*e>A7!i;#lnpxm*6c=wU<=Rjig z14vc?%IS#j)X3GoKcP_FaT2Rtz8Mn~LcgmAgAqw*8SY!pL#~UKQ3RqQt;w$oprFfj zjehocU*EzvnZW!cJJ9&5km^MB{UlT|aR8Y+O-QCRdFR%5(l(Xt{w-(sQXIAu1cy#y zd4cRZa+4mb3dKW+smOMn{Mxly^N7q0VxQTxLuv=2%GnNZ^NW{yzq#B~&hQxRWQeYZ z%+y9zp{zV#_@R);E?vdnO0xo9;vCLu;PN(MQqI^N53C)l9yP%v3mwtGO+l3zPZwe< zEB!gpx4fhXfs?;V!WXhjV(ud)1HyLo1tI%pCcr_I6lYnjcR$N;~ZUeD;_%_fQ4lM9|v) ztc=8K<2?Id8g0g;=!*Rbh!({!VIU8c&6%<+uiZ@r3c<|tyD2B59cIWtfhC-+SyW8a z8)lHA5iE8r=l}ub`>)!ahqTS=%83s(Y{b_Phmt2sjQk2mPGO^37eWC-C3WW({K$MA zxhaicV`k%%=Ih=pfcNyxJ%1WY6Gea{%5T!=dBJMNv3|;uZsw|ss znrqWjAFtFxmGby?aXxa&H@`u*j)FH+l!j-A_ZI8h{`p??{2Zrowg0<7xDi3_>kqE` zYu0X%1*A{m5^N~eLJ@5Q^tj1NI!I~BD@HqFNx?R)InDdXW#5^nls+>X@HTi3rA5a= zl*$w(z9ru~bObVumm8nRuV87SvgclSt1W;)jcqvk<$n9O76TO;!ZZ2H83w#;brbt3 zrh)U&OFY&A*jsu^F}Hk@-{9zOFAEe=vB$%>`9u^wRs{(i^Lx{VYEU5$t1r#iM|95o z_`-h(2kf8plSdl>#e?yIhm5H}jWln?cpiW1>}DhYb7^-~C}Z~fG8AVU<$MK!Lu$szk#d8bDnv@Hab_X@}HNe&o# zE6y|3mt2q+t~*%r3}I)eN|qmNfT_sCm4;g9XppL|>qP8CHXfG-^<_WbvpLFYw2SQ5 z{D$qEq?8D{5HAlIKQ068E>-HJqYO8>NfR5+7h>wayzdAUE-e%%V~ybx8Y`hzTU;a+ zp4zADY@A_GRLj+HiBsswp?$+~ZdJP5VL)Qiu04XX1K+T9TxUlLf}?>F1Aju)7kc@{ z_gh*r&+RoPV^B~yG`4rDvc;WdQmXVoO2VjU5xmEH$Kp=%5KuysyHjL%5{9l-Nq??B zHEEZeXs&^qgs5o}&|D%Ixkjb)9?snikF&`gH@L}MTq~0fY#Vr1R>s@Yn@k>=WS%7~ zI-8*8_JZbGSqLSVah0Esik6BX!WUYXdt7znOWPU31RT&2)Q>O(0lOuBev7v4M1>{) zynu%VqXYE(6v>XUP1i3R_vuv#4XD8$#fh)m^cJUfFT)qYKCCe~_T%*;-!62WsO^_d zaQLJKiT^z?FEc(>&WR8OUOEXYT)w?%i_^vlm=^#!Iy_p^S6p`D(!TeDebv>Ym-MIR zPDEeBGNfp>6}x$C?{(XPFMZtq&8s=#T%U@?_@Mm zXAc=jcRFw8U#lc&d1lR9U|c(Q>~71k7ACndys>c0GR9Yg7)Xm_^F-c^o)J7?Sy|TviG5~m8>%uGSB8l zHJ4y^9Af14J0zHD;Knu~^k9%7ft_90aQDfsqnEfFmOU3@unOm8AodxJlde7G9mk0r zDt52_@O@=mZ5GZn9%o&Owsw%PHF9!zoGO4RaqDxHuo8lj-#1!jaWxAnq+Z`~RWRl3 zg*Y#%#m}MH>4WEwqjJi#(>KOn+$g*F&oZH(;#o{k37iR4L2Yw`ITqjnTl{5*`6NdWXyg|8qdSe+YPZ6uH;NolK{2QP?O3y~*Y1 zMXCxaTl=oS9c$*m%W%csXC8DQ-T8jaPmg51G#%C*W8>WTfQ*JqMJ5p)pm#+^h)|5~ zttJ`VIB9X3fR@7yy*MTjx>3w^V|OxGmw01U%{4v5^vD915f3@` zyaw)^LHyAsYF#wnAnMC^kQTr63gTgVq+7`P+a0ytI=823Td4bNFu#H9nWxfM`|6`? zW!YU}3t@C25rl_T8cL125IFJX-nNpW5inwu+PKqDx?KAI%-lwB9i*)@03pVBWSMvs zgyscJ_xYoJTv?Q4?R&96*nGY*`o1_%`W{S^wyYAMJkz zmWdF$kag@0S;b)r-;N`o_N`w@NFUvqPH65&EhdjXF4(GG&TbL%(|i4R-#5A>Xb~mU zQ>yq$*%b*WB1X3bt^SoSEMx&6x@bmz`9 zJw8oReWGgDR&QK0H}B2n?5w#*4B7p>T+Cagm}rCHLUENpkKBh)rqWqCSM`gs)-rL{ zX1~x8uDkT=yvXtNPLnmhK%)61PVQTQjgfRAKjkWLV#R>PV32_YwD}WZx6hS zU*VL$hLvq-rY#DX!n)BNlGVAoF6 zbWHhpKFpNb574<0J=h5z*F}xVl-&=6-hO3NWRJ4)jg0-zCl4e?IhIqWBv^#g5~>4Q zjc+!y>BPnxKfcs<1@=r<(WCPxc06xf!?;NbYjOeXsgOwpHnsTJK9=3V7&_4((3`tk z#0G?m2l3p*Fim^RC>}jErwl-vG-4jJ)bl3Tx|$~>!NL?Aiym+zL^LJ#)7Zz17$KgTNrnd1o;5#>no}Ql)r-aJkU9yb$U0 zDP&uB#mEVFFnNqD%`~nOIhG~bO6Xt#z52R6z~2?w?h;?zmaL`|qYhx?rtV7R+#Z>Z zTuFR2Iub7IvP}L!C6_zS=cyW`h#CP?1XHrwa>r+Vg1ezCQQAde?W$L`+SQT1&7(cf zj_a~vx(k#YizXVoKM>Gj=MfK_&$lOL^=-C+F3Mgb*o{YvtP$Iw?<~-C3RK_e;+qs8 zuDs&-N(EL6m*l%QSgyUMCxL3Sfr=Niqkr^itF_nF12V8$Eu-Iq9a<^-BO!Bfm)GkkTsCb#pc zK7G2QIjllF_}<3qhRfM})INFtO8nflGsaEB{#i2asyg1+!|_Q?VDy;297XYT`biO z(#*GqYPbLVB}mR0FcwhBd3ez5-b8dv?hs+v_XI&X_w5FqNU#|DwEDe*h~MDz7OHBD zSBt)4S<>nKS||$ZxGvQ}ncjNYi${t_(XDDW9ag#b$jc{q4BIXv2ww|CvujC_YftA| z9!~xc6Sjj0evqKB9n{qQV-J&S0Y>gE#Z8SP{JcR-E}={4X;u{9T!NJ+1MT%L9e>R8 zDLSwg!Mv(DJc6u!xz-iM)Ch;|ZCljLZ2gOD$ z=i?r+fptza83L+q6@d{mDl4HcletyX+s!aNYwN-L$wHWKH@QS_`#;a((xdKyYW^$IO<&g?qDWR^+sDty zP%nn9lG;=|{aBgc`S$*f{-QRULRHUL-5=l`DfDcbvq1dRzL}_avuQ%D$;RyY0fV$5 zN7L}4fT|gpt0870vQo!~7xl1g$f}Ejf84T>q2{ucC9h}cpeI#YzT0JF@3JxRwRpo# z25qigCReb2xi!6rd&l&TJInX)xbfr*2@Z@sNFMF;xOP|q_B=ko z*kHmDztCy>Sd+xJA6*BFT+@=o@+-9tTx2VpM^AV*lkTbzh=>?i2im9^0?ZvG31C8X`eL?2u$L^b7h=C!($C zDVLV?@Ps=y)CJ|MsK6z^Y1&?wukRir9Q^5-D)*<)-K)(~T0M?vC8>S~Zbx!*F>72o z;kX*Wy{Y-iru>|f_GK!m*!hz9CGuuWVX7+SE!QS3MGEV@v4pI^F0EB2To%d?j3RGT zNu%qC8&%i>M_ccuyC|P$oTz$rSKPVDQy`$oaFwoRc*=(%C-gXBe$C+?{c0V5-K?kD zaxaKxdPTKFTgDZA{n#|SJmt-VAWhzlrj6Nh^CY|-ltMTh=1bTO1-IVrwSCtOu%3p4 zUxQ8A=5trWOjQ$mC0HHk^G5rPW^WnX$8Hg42e67-eOngYGdkt%lY2A9@`!C(6c&m>KL-|~(XKY8BXPQJmSd-iS9SvZB=ruDez`g$U&&M8 zoSJWdEDj?$*J_zUcsG}jrBlD7H@Po*b;zq^2bTY2la5O+DIjd_r_nRUhFqbwIl5l0 zg+oA6#_-Dhh`;m9WG_js7+=XCnRU&d^Ur>jB<8qBJj9fDneqJ;%^{~(MdY#5GN>n5 z$9%?>0U-C%TvnIP5We$}lxIInmuc$bOtFkB*AlYYbh&xiXmTN6EZgU~jR$WR(-$+I zfQW!iJA}%~Lf3n2RP&UTp4<3kP@Zew+xk#s&q$6FW0R-%b&;c2o)4Qg5gK(xqW;>e zYznzlKA~&ZD);KQc}q^|AkHdUUS_E2x$#(I$23t>{SC>>IP*Ndf~BSD>RP^>&v9xT zf=^8%(}K)6cO)on)4!53oarr|QMBrWx2)qv=J<)ax}%z2Y!!6R-PM@};z#Qmkh%s@ z#;e-UwOP+eT?eq(teuP}Syc?eo#NIrTMem&Jbo+}^eMD)F1bp;(^h%^bjkor+9&0C zimrLrYZMsZa~+V*VO?4l9*`xexoz6imH+%8Wj`PPDNp$Xp-qjrg(kXF%!VyA6l^CjG;w3a{evFo3O8te zS>5LN1Nti*b@+$2n=U(>UQfVAW;9AYIfi6%uK?cgncG`(=`4B`Xw*+G$;hqv|6=XV z@sX1^28NvF+{*a`aQmCkDdK=$VOcMDAJg3j8j4MgRI?2l@9>!xS%rprDRbF$W&~}r z?u*IX=gjAT71S>mP~T~(slZN*SboI}aPbZ>jGa8iCO7<)QQm*omgnSh8~w}mxgJ)& zN5P(|p{gR)7>j9v?I_sZql-4g-0Gi-b*2*P1%z*qL{4= z_KJ>sP^=FWu8uy5bNVAPPR+7=SR2>+KyEf=DbeGnYCyF?f%CQG%Td7NvW=ZN9hNy61l3=)Hw#m`4p*dlct7Lb2wcH?4lP}6BtRxUvjqaPuIVqWT$U} zCGk1fRHQ{8%H?Aq5)=p6Xa=L-Zc^_^?02WL!+3@JtKxtq?-%*DPG59~XE1YTbC@5Z zHFG_4C}q@V*?f9Jzv}^v37A@Ajsv})D63zUZlT{ZT+&>C0dK)*_51p5n>^l!GH24c zr{ryKW*W4_oTXd5Ij%1^sB?*14eFvMo(-|7%@zi-L`aIy-)m5;f+jwteP@mNK+{7H zbQWn~wZ*}^n{k7HibLHyI{G3#rXz*fLVS^RsjxeqPGs;37_g^N-eXo3hWs0xW8@Fo ziev7c84kr!dh%;UagOgISHpeILT}mzB8j;r;M~#ok55%`lVe@23QKzYCTKUYz)0ka zUE^H8_1MRec!y`hAj_+sVr=(-;NAHVrLbRh|mQKoj7@pCS zqv1T)h*XE~kbCQIEc{(iNZ>5OhpUvuFvDfQc%izs^@#Ji<6sR8m>*SiZ_?ftgRpMX zStld4$_&)|f=v%b|3JEFAYc5E>|}kK)7YP*ToVT+vCGY>PziLF5lA1DJ%2}E7joe`cb*ra3aihxL z8a7Q1wPeHrPvKDE>TmunjxMAHy;978VLbGo)EUqP07y zo)KW)bg3@B@P?-%y>jZ{ijJ~fpPriLilJcbqTlW~d_gOf`R6{0sMXwvQ4T%T>4(P! z?WiLzfN!ctAp*4BG;yQ&7~s+RcTER8i-Ki3Sk>!~g-zthp9XCxIafeh-(vk^kLhK#Ytq#x9po9o9B`7ax z{pWl9^@}sZ9HaqKs^M1 ztX6Ur>L8)Wu`zM#xgI}1?{?W;X+PTSz*zV1asQVwl3^5EwmD>uX%%LA@Lje?Zik1q z?em5mL8`t}r8y$1|JtSgnis$9nTsa1#0^iJMR0q-h|A;YkIT^*2K1>1vzInMUR~Wc zb&U-4=IBPnh2lnJB62C7j4(M?~8qU@Os zjuwycpOf(3I^|%={B3*uC3PW2+x|qBxlHBvR}>~pC_!r|{N3Ohm!@-GoIZeD18Ey| zgm4Zeib$RMUxs>YaC`(@!yit;_dwF2%;FILv-Qo#Mp(264w|t1z)IS*O$X!)8kiEn zo*VwZJWNBeOIJNOjlJjtvxuMf;P8f^R83p~*hUBMu{&|ODA4RKrLtgk{7;ik>LmcrpG%RsGA7S*HLK*%OLEqa1tvKb`-#Q4#bx2#&EIZ5`y=SR$Yo z#UuawH))EL2w}xTX1_edz`XPN`;#<=p~U_Max_RoM+GpTZ3+{MnjcJu@`=D!vKFDQ zk#X3QyKe(oeQ`1h+P`CGKL%~=u4sOh<>n8LwVn!%G(?L6zbsM<$zw2`okciWjANoM zmUmrN7$IGxXgx2VX-WeE479(}@janAYH1Yc{Hly=~k#2i_3~%t>(8 z=tGZ$%e&`I%?w1(Exg=uWV(xYmJVXR9=HSeW<;8?WlsA}KbD2X^kLB3gZ{UoEA=zh z5yqAjS_qWe8>-YO#2Yc0dWYO%wNn&Ypkcy^LMZ~B#ywAH6N|fLylzniECel+)B@<@ zgu7h*<#N_Ot4aE>iFz`1aJ!`9zPkY>ZC;)n%FB&IKVn@o=Fb`5IhR~p7p~Q4m}?Or zg;U-|i4a14hzF?*X|DAe|8RR|j=3=P89K+$@A<{RoY+AAAQ-qj-=`WqvQrgLp^4et zJhan2t_o~?CAfHFCCFyCI_2> zkhbLJTXYt(LjO2SahCr8ad%mh8h5J`%ygf6|7R z7%FR#E~HWW9>o6p%s%2U($TO(_WTWA0w4Q2(%7KT{dTykBzI9bT&y=+P?t|-L{<(8 z@%d-?#76byN~&SgC7Sp1T2KZb^`!4>2K9{E?mzgW+Yr#-hqf2+)rG5unvgM!wWd0V zsm>qI+h(v92}SUVss$cVORWDexnyMCR=~#a=%+v2=SNH8!1>t;B=2s-Kdn%o;MM8m zb(@rJRo0BySOKCbP8EIwxv-#1@c4Q`$%{44AQHP|nj8laCh7p#XGHFH=iBQDW5fbx z>{QApfoHfIqD|YET6=XmQIg{PnTqs&Z(jkfZsimOzF&L9=3@F> zgUWb&l1^LGgD&tEb&g7+kHL8c`mk5IL=s;mn5t~%O*v>?P7x8xPNV_d7b~LT^^8YQ zvRzh^6=Nbo)W`+yMjet=A+~9c@Oi;WiuH-cp)3ZQVLZglwN-bY`4ko>gmP}bq=B-U zMp!RZLUOOkq90G;oXR2Fs!AWwzAu!txtD%@bfz9@>D?~|eZxIDbLQ+BWrFc;t2P&y zc_YO-wxj9UWlsFF*ItAcamUQ)A1ktbqM0 zb{hNvZqdu>dNErnsG6E?40mGVVcs7ihc5)jsCc_xu1-uzB<(*tyaYcM>gucTb`$mx zR6y;1j6YlCP??yU7>UQB9Z6mLx8rUX*aPh}#Rfj8Rgf-d0;>2m;by^5b~o5h2FA7n zA3`PLT~P5#ipcQn0)GhzH>b28fa_JRM*t&OrEt0Zd|1DvfbwJq;ZBeMrV*SU=KEW| z>I;1)eaxg2=S@YNp&MXy)A_JaIz9wmQJI||t81ni$XJtge4r>eCX_4sfU)=|ts)+> zP^dIsbWZ8BM9V0&XY<}a0>>#B!?6nPu$a3Nt$F)AH8M=^pL1ia*?4SI1=&Wd$5b;) z5W|=tCfVM!jwBRAht<5?Q9`eN(Mu4G^ZD(37X7l2HozNj8pTR?&Ivv;5tRVPStQ7w z0xPvG&!t!k^BNyvMc2zg@fy!qW(jj9JvIbA&A=kV-T5niSz-hmvF(<)wPrrdvMkA= zMy!7BnmeZ-Vj5z@zDRU1>0%#~e{ISp@r3Az`lKeDdVkMhqiJUAcZ>|?(c2*>#>82f zOuVLGF>0qp;3QtPGTC z?qwjeFQ_L4h%5GtA^qT}0-=EHHtk$ZKf|j~5dJnKn>0ziU2t+heoY{wZb+Up3!2NG zL2chY>?D4k^Dw7Lh*b!R{rIlgx3p697&11~^sl!inW0q#2!0=q`uG8xG zoDGYzGc{|T3bqR7XltghD+MJ5@1yQKwh?0=AD%GYZT`vl1RFWzVVY!P)|1P!W5g#l z>hHE_)Xt5IeMRmRG_!hGcIVmS?jG-)x-yFrE_k^pm~T+R+KBB^5!xz5p-Zw3GA`== z(C?b8iWDm#E=wJg+~sWaC%KSy_NeiA%FoD9mNNgAH+?qKB-!C$Eo;M@hHY1`J!ZO~ z-O@Cpgi){^cy-Vgx4YsuOw;YGmn+7rubkN?R_#zYRr;&Sq}DL>>R$}9>Uyox0u%P)k2-;RJ*6`M0Fa*>a< zZBb5VrQKW2JIZKQj7d&3(v{%+UP=&5#Dxg|-V6;N0`NJQm@2mKHrYOv39Pt`u%{Tp6&E6E>;s zyQcc1V7G%=gZOu0XJT&iBB7t zXev=?SPlF-Dt^a}m8IgH%P)pt^jDFclF{|#15rhphu|8(d;Gcv{*<5^>YnK_-f4!A zTC9Raix_UM9~wE@QFr*%7p@@9OYJrcVb{`^1{K*M7f~wAcMtcDUMS}&1k)(Tg99tp z(LTB)(*L0Zq7MzUc^8?X=O=jbLBu@boGGWdeqT1dGwsZ_t}_*Wv)7P@ zoUSjOa9)wHN0IfatuUk@SA&7MBh-{8oq=x!Ct{C5daB(EfE|%NhcG3&yD5O3z24=C z+ca;mCtjr@+=F}v%K{xv(#Q?v1A<*8#aMR@#|`XW%If3SFA8Hspzr1U%hmI_aZKUn zW>nqNgYM%6U2x98Mc+%>%fu3-!#D>Aha9DHA->hULn|lH2>i0d{>nR29Kp!{5S+2% zYy~W+ft(ryMq@Zgitv{Y_t#blH%0n7jw2`j>^k=MKC@!VhEs-+LyEv@`~UA{+0y{K zo&m^=0VhfewxbwqiqF7+RoZv*T^;~l)RcEQp6y%+eKgbPJuA=`UYF$t7T%TqX!vDX zQvqUbl!r!Juj=pzyKVj1Ps)bU<5ntjrGa?+2IXOCxv< za@W3|n(s*GUkCnDkG^BAe}{QV0JHovx>^fgy8F>IO|kD;^%6UGjCLx;e|{6o<>_fH3Xw9~0Spd)Om~|qQ zdCtDo=wTsFWcDM&`FE=+SS1u8KypzMhF;@8)5_bB^$K1sq~RW!B7b!q#<1Z+aex84 z!54{~5Cib7pl}1ya{4!p1}njB7G}$Mo(9x)!kJto zh;Ba&rlpm zyWUD47+B;8HRBRjYvJoD&``RvzE|$bLk>7$^a%`H(x7?iH9(c^K7O~O^lA!np3~?Y z^dO50{%a~QKSF~DFDaCplojC#*e$;fss;k@@%QkS8~2{PpC=)F2u=}bf#Z|p?B8yv z2pucE`UPqJA1Tm+zCto2#_;)c!pYxaR|V6xvy*{%o)s8*@R$$t>pI&~b@_kAP7IEW zIRb{kBW+gh;ft!GpsS^Ojdrda<7DgiBV?WhKCOR^L>LU!8)tJM?x?omq^Ycx<2{f= zlVByhp($WZHbexIQ;lNH9~FAK91F2=mLJ6rZ$h!(sMEn_>j z64(W&504L||9xb@zwWIT(mW$%>a7BPTVtMBn9`X13n2+jN{lI35?yy?WY?*pNz5h`E%LM?e;= zJ^tNA4-Hn1m-yEqIQ@=uXz|Z#*3fZEFCnayIq{%zPYwypW3XZ(r0t2UzP)Cr` z6kOn2){_h>zy#u=KQhu$=%nU?_^hK*2ma&w7htLNKhWgs08hjJDdpVbp-kI2zVExW zWkeE72WN5^5=yACOG%?B8k0kroK;SljF?cZLn&->Omb`-$B04WxV56zIFz#qZ6!=$ zmIGV@4xR~KA$o3%rp0WKi75N*YEm$>Ci$%1504pj`;XTrqI~FP`qOq{qfI` zMiATty3n$(0!dOktv;OCQLzZdgRx|3Qy$CY+YUYyWE0{bB(>dOOv%W#dg!3~2;nV! z`Lp={=cc_|BvmmCKzYPS%;n9#tdHC_%ZZ)>r41qXct;(imB9eJsdF9P*6SeKrQqn5J(^CXyfY8d&bkKv|c`xr&}jlFgd_vab${^s40m|7ld zgcD>SHDZ9&=C3m=Rtgr$0>yjY*Q~+mLM=aw%$6A#U{0dGAmi;9LQcOik|~GhP&+FK zz(y_*yLjZiE_523FEqp^wMMX4e!00DVwm+MPb`Vl!|>i~h2AeKs&#c}fJfB6F&(Y* zovPc!qk!%~6+XyFwkv`2?#rWK7xg{%C-iXdTbXL)!hj%U>^__((S7KaxIF}e18#eQ z!#W`>B?0mPOJQA_cvJQRQEO1|_poT)_u?liDISwx8RX0Zg5rF?`FJp#sa_?^Ek}ZE zXy~Kh1=ZRN_7$c0c3Sh2HU#srgq;^-1n3iV02a_lwLuR*Ab-RwDC)ikZ?_gYPga{D z1Rvy*rK(IJq&5oJc2WJHN($Ypym7pq2uKxU&r9C7WsTfT^O85)NCBbFwpi z^aNJW<9+=hu{w4wL6kxj)+UHN&OfSJ32`J{Ad6_At%zR$)Y+2xcRu>fj3R1@Cj83v z8@&es|42NYx5IiXJl%A^PE8#Ytl?x)B0xu(c%a?Azp6(tvolCQ!VdgI(3f_Mjp`F- zdL!~^Z#-*icmpUKbSPF4z?pRmM8Hn#z2`gGub@VEJ0(4dw^h}Eb%nWa^Qj)U#>(`L zI_fK14F2o&M_gW|XA=xhmEt8h!(SCE&4~af(PVOVR7;3CSda`T;8$Fp-F< zfYTusSlNHDGLDuU?HA3w{e7Mn)G^3BXy9C7u(-os5o z0IcDCv=sap6dxM&J68CGV^Bhnc32j6wC?GlwaoHUP*Xwb0h;WuUwmBRJUnH0K!R|B zM)!22E}^mAz|#b1sa&g@V(Ol#_&Hm+osSxbU47Z=cy*HJ2PtH0t^4~v|=WzRW6J=|!LhGQ56(+VnCdi9qe+QzrJML3R?k>v3@ zR_2Tc^jH~xQU7H|C>YRz@q)-3-(99@fWL*uI!PW4$n8xyVdJ;w#b~*E zk3$d`8%w}cISI1E-M&h{N=A$bt^v|xZy69xCt;(_nLjEv^ko6;C}XE*9!_8S!nZP4 z!1h4(qGatoz)`(0uKCNljoJuc^_8H3IG4}?IOIQ%+)o#|?av``sMApK2f78dp9xCn zwIicn;B*LTMuhO_2&Wz|5_Mte3BUSos6Tj<_80>t^87hyUIsB^q~EzdTFPrD6c_>b zBRN}`rTlpYs3`3W(g5Oe)x2l%^?e&WP)snUn9GRXLrnlFiM5Qmy+f-_edyRwvDX&7 zliF%F%pzO?vOD97Az5o>-}8yEF855C=kh7Lr(S%C*Zvuv(+&i74XcG`qNl&>mBq#> z;PmYuKf-B@!w&WECl^3<`7Y@Fy}a1C7jl|=p&fZ;okXOCbpjAH2~r`;ucyBS{1nZL zq{knjUsB7L+pYn9-3-+4d=xBYY{cz|9)WJ_(dl+_-p>_aJDLwbW$TBWS;*w4C_TIi8hGD5K8=%<1l|7?veNhUBCg;2u{*1q4e3RKckI#1l z7aTcxgj@&7ORukX4-&qu{tz{$iV)y1dlyMpkKyiO?jTaF^6|7QEa12_fpW~l5F=rz;~EIIQEwB0e`olpUmu)2D$OQYu5hB|>|C#pvyhKrvOT)+qohhv63n z_-+Cvlc@`v?IsA9ADtVZ4a?aiR>>Y|FsY586E)#xUpboTe{tHD27MYta@{85ZfRYh zskBv7{WvALX*ms8L_sSHCG6`A^&G86!W&J49VBCEsvv@DhxgpggIvFybUq^07n2iXu>zr&+8 zV0(T#SE2xpb)y27S58Qia}q47Baw(I5iyVaaHCv%%hnVewM@WA6iZ~5=FRO37+LDA z3??0Zvn%TD3+1V;8L}pPTg~$hDg=cHh1Ta?#6;FfrJ1{3l+BQNVSfEuyh--Ud9j&K zK{4Y_yPW)56b7pOYh&NlD2`3vSp@cgPg<@}?&SEkN+o|5(LO*#mH_r1lo;A;ji;H_dHFfdt zirU&*9~YfJC*uyZHq0OF=1=}iDBkudAIO)-TQrH=bVPXy(g%0NXPIE5 zePuqrsJXkV5-*(iV#CMI2jSfpQGZX^e;HKt~11;WU*ZPzY?;0`t*v{d1 z!^27{&)M`(<7*7=QJ?x%R98oS=@JPzp-^!vw9ra7sp$U4@$m-Scx<|5jC`)k2KqVU z@-U*Iu&C+3Ur$V2U{mc#B;%WE!Hc zzI#@&&~PxemA~+pf#}FcqxH@Y>|Kr}b*+u=m2o03h>3|!Y}KkDoX&k?5$D_-kHK0x zK2aKw2(kXRdI^IN*kk;i!f)}eL5+zmgZ-O-)g9wii$+8(tReO*+dbxn;|ZN#USc{@3(fyxZRZ>-Kg#rgwj(8nf&s(MqV$B5f_ba$s$P zrr~zcmekl(s>$$a5=nh@LE==yP~3Ifr#Pi`eZ{l0vu`9ze~HkF>#ucoi<8IaZ8601 zKRd4BP}AHrnjPsH*g5!?!w7SlGqlDL30gD{$06um*?Nj{M`#lcE`jsfxYFa z+BWXipR)z+?CkVarKdPKdYUIqI7K$D=&~{3WN%f0Klnf5(MRzyv1(|Y$H*(&h7r;0 y7G)dg==Cgj-m@x?@8L}hKBky=U;obqrq^w@l{s={q7F7k5GIYx4i*}ox%MAN8HvFF literal 0 HcmV?d00001 diff --git a/docs/lp-management/img_1.png b/docs/lp-management/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5355cfcc4fc9a725deb06ecceb26e8d98731fe9 GIT binary patch literal 36787 zcmce;c|6qX|35s{aVn0eNF}7wLTE$wqSA)8F@+hSQpS*d8B8fl38fQ7)`}Wt#y%KK zwj_I&!I&9K)-f~LW-!Lw*XVrC_k7Od_r34?asP4mm(0B1@9TP9uj}<(Uf0``OBQC5 z;@ia`5QyZtv!|{=AZw-|kX4cEeh0sa8QmlgfjoemJ9YA!A7YZW*6-Tw-Y@P1!X%!# z$STdcp5v1H@a&6dc&?7jZw=NtJCU&8K82Kr%&Mk){dW1@cm0qD$Hvc%l@s^8p9=IO z57gY>wDV1e?u-ylL94v+9BJHEbBM<;8#(#q?=aKOJ) z>r4zFkP~Om$My`EE}N}_>_><`**SrVypVr`@xJ@diu$79dkG&tEVe)(seU`b^$$LJ z-=u7``RVvn(5+Q}#`k>Q;iPtQ^MX;W56WQBSOM~2ms!MG2;}m<1C=hFlh+b|o{o(Y z5A_M1Z!|v{>_XgQbL2qnCN4ik5^|zVdF6&__S5pP_dNy6_1dM5u~Fl(TA$J8bzaTy zjq0}$cXl?tSqn-1xN&e5dfwD@_*TB*2G=ZP_XpDI1!W+{oeSQ9pe;Ptk z*R6anRYmc*!-dR@-eUH6^$&rvVP=yd@j`5(DH*fxoFe4Xv6X2)KeiOaO23xax335K z-SU{1k&Zbfp;fKE=@X?d00I%;tgHxu{MO9Xy2ovA{qan8RB+OO(3Gf2D49#N%2QE* zr2do^jq2u(zMz^d(E?P%am;)(C!=I;V$W;+UA0XmVBo1M1FC7y;dUA$8;WNqNF#Xu z8sC%Jx=VBign=<4-`2nK>Z;nmPM=lAR_kuXP2IWYdV4D zhepc7sby%JV@9=2oogXGjaLR;)4l!WovVv`N%qXsx?V<^O_I4%p$iA>RH)xlVkgfg z2o+XAp6fsMgFvJYj|8XOs-{O0-D$BdF1+ltlH$TC!uq4ztOj0dvauH6f=2JZ`+~{)sfRz(u~N;>8)@s z>lFGxAYZk9T`N8n#5jIyP2vX~=y08v(d0-S|B=__f?QfGDv)rC&#ivMJx7b`Dt3OR z^=XS^lxl4^#T+c=gR%jw;&WN&n+UCS*(K$_CdXt$Re5j@m4rgpRI*;>CB_PB9q z`9?uwWtwH1L7pr`NlQT>yS}V94IEMCrg3TE>$Qt)mRsT}CIQ>^gtUF(lQS4McV)ww z)`iJ`4(`XE8mGq#8R0JXvrM(qQ6Uo33x{hE13_Myrg(tyY0`@HI4{?R;?|i(EgFb_F8i_RXg*SON$|=(jM!)q z;j7*r=jBKm35+PG9>F{1N%H$sgQjmT#<@pjCHaj7`iSQ6Rr6O`RBf0tOTvd9a;1oS$dURI=n%jKA z)%!FQXR9|SbX|Yhwp6zgU6YmQ?k1a*A)CId&Gg1vq`|4RAb)N>vgQzZmU*{rM>1OJ z#f#_BB@+hdPZKR%>%vft4pE@R9$n=RBEE)BPaW!Y53Yh@cOyxwUEp87-XS0;*W94yyP?Kz3&M|*eeS-Yy@-u_hb z<)Bc*tM{IDs#A{2&`CXyh69Q-4%rcHHPM9=AR<=aIE68mY_X}#mBwc5W0{zF1s+QYFTtgt80@eOP>D9lF5PaNQ0WJ(q)$q z?p9{2DlY1fcmr;@k-DR-I4P&@q?V{Wy;tO%wHLgLoK&OJHi2dFU0IfmXHdpBm1etd zo6?`P?0qn5rtcpC+mA{6b`gEabc8VJ>Z`N$-mAT})}e2h*;UU9@ld6L8dtaZM}{_z zv04OC;D2a}La@J!yDzhss^-%TZ6D0OH>#jr@YN*ntrouGo4NzIzw!>r!693scKGS>nk>T`?tY8sXK$0JkD%n7?bUI&Kh-E*eI+Hf zpxAL{&AvF*H)m z=h)#)KEjQRy685!?N`2UwE@vKTv1>+i|Mc_MUvNg@a?v^BHxRg}OPR1VpPS39BO@MAl!USd0 z+EtprwVbu`R-I{Qhb|V`R&%xXB95{KQoRvCaD`e zzbjDzPy{g(&RKHaCq6Zf3$9hl_9?+@6d)h!2jOh+@rE#ehcn&2ulUZnU3+AHD4{lr zGdJf;O%Ly_?I~>U>g}VgUpC$Vfka2Hq>F7`G0jRZ(SBCElycF=QG%PXmIjw^ck$qy zVhTr;DS5w7l@+`U^}}5ve^16A?^VRLG87LmT9Wa{z98^=3{agC=aweY4q>3r47m>3 za4qHXMK%VLz!#47Mfn^G4P`?hx+_U_+8ODP2R9Bv#XZlmpTjotN24=8B-9FGop)3B zUMKGjcR6tsvsH?ibg(9Kt$$ODn{Ci5s)q$5YoP^sMZF6_*y_k(keY)P%NStJ`)iYv}j@&e_(!h(Ouivpc$VsiJ3Js zJ4QS=4Pqo_=&k-3borHMg~iIv6@0Hu7A+yxoveiK^KY!+A+C;|F8qX?bPDTS1MzsU z5~_=nm3v68)?KQBJ?Gqg>aypG)TfBjfd**p%${ef!r{`Kl+4o{kIjSmMLO7;$JW_% z!QPQL_}ekEd8DOze!Lv2$%jtHPFXfH0{b>dKp+MyiG6DkPes4IB=2ad&Elm5+nSk- z`wrz@lW#xVCbqE3T(HV;pL&@zV}7i4!IFt1F1(Yv-n)KLVQ|CVo~U+8Y02^%1|h5m z_D5kTIzJ2pfgD-E{9P~p^r@L>?CG~k;lTztf_sk?#2s^qKdSFEWbUK>NQppU-3O zcw^{yVT*d2pne$Kj#6h}x`i@euq&+V#a+4lhVu(s3e@DBiOtuYsGf)9jP@0MdEZ-u zcru>Vo#GWCs5cE9!XEDWc;%V5pT|4(lx=PUaZO~Z*OK#+Q`YrQijez(E8!gbZZbfu z3~9PCQXQWxjpX3F2aF9ZuUu_(2)4)tfZP-3RVOt?Z(ZQA5l-!ES^3rLOOz&3ZUmlB zF#OY83vpFqqPgeplTY?sut`?Oh*n;l)?EDwU_m24BR**dayYZ5w*Vf#lsOvt_>tLU zeA_wg_j7IP;~rZFq5f{}L2o66cf(mdZzstv-M^!{oj&ZVz24J`=30$XQp`#&Jx|Gd zcXRm<2;{|IH!rw!cCL!Fdh%7;PITSlIqoS510S$;>ukiQP}1DLqontziqG2`JySqSeNmFYZtoh?wfv#dH)7y7wi0vsssqgNJD10UnuX4 ztmEX%Qh68p*EMkou|nR9`~4BHQmgmrN(Dse63 zfznErl=5Jlf-7k`i;ZJA?T>C{=9397j-)+3G4Piz7sr@m7U#4}Ec0;iKb;Sh*en^s zVmCF#Sy&X=bH3OxzO2Q~sWY=X&E3=Z-KcQx2#SvOnMHJISQOR+7Csi8#zW5<#z+Ju zb*uMOD0+QW+)nOsO(}2QkTD`;u7T|OYY54aJZqlvS{IZ3#nH^SlOfsUsPVUoBbe=R zE>y}EmsA?ju<6bpXA9CeoIG>b+eqj>o&m$7kNKuGH8Fl)#~tJnff>CT3gYzj+j6l^(NUcZ++wG(Y;B_Eh98 z8^e7~v743%mzKs9VZyi0n=8(eeci?aEfVFQNIM&2QXELyvL`sJAv<@ifYHNV;!s4B z(yQ3R6q=HiXS-L_<+Kw9K{xYIh&OlciRphcI%s{&lBd1fE2flU>wA4ZVY%^(k7b@+ z=6mZUqbdW)DgBjsNk3T|(>?v>lXis@y_!V+WP&?C*SGONk<*2#^+o(51$W*LXq$ki z;OeQcQ{kn{l@uVscH&OR@z+3P+(dJFP5|4iOPDY+;x%ffvUtioY0Xf;o}Rq%Pp;IW z^mIy>;TU3?RK3g7Gignlar+I^mna+C!#lzNsk*;%y_*l-*dafBpVPH(0_B3839t`c zMJQ(6`y0-ALcDl10!bS@mbl~%c(+)O{fiQR1u==>i-l`QPw_LWA(!S?L`%yCmZ8Ii zy&rnJUBzsk7+szzdY@=`u*WA`ZT=?75uSj?ZANW_wVD$Q(_pcf(Nlv&7wOm)IuL&5}8qwDI@pR;7i&B!Y%@VgWASdaZbd zUX60iC9{DNv! zoIIj4K3B(NRmJ7utu{Z0PKus2+#U;{%2a#jY;t%gogb4VMdD3jns%XR-}Mg$-;KYi zpvZ7ACqx&XdF3!EKvTe$*m-khMe53=jZ=G+VM$gw3f~u>N3ky%U^|9vRrKnAC-yjT z82R*2-ri0JR@3%eHb2KS@Z~!WjHBOCA>3an=I^~_o|BeC^`n`_S9kF{le#8Gv|MW{ z6FVJo?w!{~^IAc~AFqvTNL>dF`!=9;%FpAZSyBmNv=0AN`ybWDMt51u7;gss%bg=HgOK0!MiIA8VE6(`uJXM>*1H9bN_1o?klUiu7dmzVx{c zFluMnn1X-_$7QYtjNe*tdcKOSw zd#mxCDQSZ*%#vAHm<|dz4FJzn)5- z{FBrT5}`}0)Oo%7zISLxG>9V4pz@SRn(4-AD$^y3O3!=@;$04rci=!j$(UWQy(|FP@qKGQA9|b zEYc$$ZFH!Pokp6M;N|xOeT4Ysp9-wqOhXcW7X!^B&5`z;|@anbYT#8 z_S?(f{X^$B#E7gH-4*Xw*9r*WRm-oiGb|vbt&==x-yfmhxLOgf0k1`GHb2B`Y-%*? zqEr%z`+9W5H$v&VYMaqK&m=2oxQ+j{!#SRHXHIoCFD7Mv?(xZFkPu(he+@TXa?0Ix zonW_YMf19!-VI*Fwd}1oeGR9|X*RyE4X+mxI}dc$CubSdC&1x3%FBtw4L14K?UTz# z;CYYz3iZq$EseH(*`f1QG}MyQD@kVcr*g%;kA^p<^mT+ZiJ!g|hkCKk;3!zrb)+m% z`OJXEd^AVtmZq&%X984nUYaqz{KkquZDB=pS$w`+3M`9K*pk&7O#e4Lx1;kBE9(n7 z4_@+LgBG9Ken#lgSwe=ELLUP0t{M}WE8gDK4ShK@i9O(MWh67A7G;Mjw9(AhagE9! zd1cyyiwllg+Avj}u&) z2EGa~V?2IU-R!$2f%_w1cCJ#dIF9u5v*J^}#nNPr3lS~rX08rp_cb0TEs~C-$8g8d zQ_0u)w_Vt#fsF++^0Q~kBsb9PGNpJoh7|QDlQ}xYl>ItdOlDk4Nwe$XtqghV6hxGz zu-7QDWC|qi3D>_i;OU5#BY)E6EiiSEtmz>vBdlF1^FU*KilP&=uBONEY8TZ^&9`?p zDcq$gZ4dS3pU!5{FWom^X?Jl9%nQ<=OVyevt)7si-tF9%ovW5v8&-wRhJGC>w2erq z=yIJnLYcTz%HR{m9B|C$TxHw_rI}!nFWL7Cv(yr#$z9v6k{!IGd!&ql>`D9y$$YGF z_WkM}fqgGS_2QF!k2J!EeP65>fPfAf(c3h$6z^I=G4Ysz(d^r2{YENGZvn0k$lnokd!OKTvK(U!|K!FNqKNtYC)E2*%8H(%i@p~> zTliV`+k#r@4HlA|muURvo@~YkSf3zGkCdTW8WLD?F4s!ClJN^(dYvQCq;ov`yTwebUNkaYbWX|GIx$})`v zf+l_J7s`k~ey6|ZI^#>Y_@1v$N`v`tHe(7tNab=|B~_z|cV3yEoG-nOUK~D7!oh48 z<2>8jO^b~EMhidb5eDY0yV(;{$n2A3T-Tf+sB3Zgh7}=Ol~Wfs&o@T)~{Or8Pssg*A?2`tX>Lh87$-Stp=s~O- z4!BDAT`Ba^-s)j;o*cGOTue|r>zS45wvTdbR)A5A$?tWmweI9N;wFDwCk>7rTA1#6 zJpEED)JKv)(Zavogw)!bor@+jZn}BX@6k*Kg3h-4$$vjc|DAX-r>G@6FO#6?;{DCX z*Pbr&?T-QsZ0oHSD@9}!RxlAp;w3+&N%IU0;!oW>%;(K>OM=2{9tpQ)3)=3xD;gsrB!;- z$jzlNszHh`^jrm59U|f-RT-?FF3oefhZQzu+r2c^Xyre0cI^e4-ukV)HRJuFD)NeB zA>ZiTYD|IFdPC0K)5BdOMTOcGqly;{p8GTkGTtlXs;@tw?QJ$T*TpGhyOVHp(+XW4 z3qEN7DJ%57HY;A??Xg_#G;VEzp|*+_8~f;-&mk3o^%MQ*?lOB|Q9#SkEz7*rjL-N( z1oh#t#}#+v`a7q0*XZE4uXKz?h4h<|dw1mRuB*5WIq`WVLy}dLj6lb550%IPIVlC2 zKTk}{DAAH^1oFM^R2t!twHp!Tes0;O(U&^(-Nk`$N=G~m^Eye+fBh69yq4;lUHHU~ zU05A{mIINNTw!{QNrrpP9VtVXN7jnu^Firx`O+8{&sSrY9&nas_u3p*qhl_Jsj7D# zbVWRknm?$V-5hz}v`m#FqWH?3$s86lRzMVktUI)VeZDr1S5Se(SygY>uo|~44s~{1pMf>p5 zPLV@2^1fRte?{Qu;W{R{}_8!wo%PoWLu$wWt2u-&l?+cp*n$UxH zbIDN`uA(m1{l>(^)-HQ&8Z5kR+aN#WQZq_&;cy4r?Lo_V`^u>H`?#LX|754+6Zu(z za6SmwfW_7UbAtQ;d6&wVwFlJ;=V9qrHzca3BzsiVE?dY9ma7j1kc(=y4>~p+hn&z8 z#c2OA>=lB|TZea4C$b7WP8#DS#_b~F3v&&9Y?hY4+B_6|Zr-guO0Cu|?o2zldt;u& z6ux@bY%sCi`UMr|vB}U`(wu!{=dY**?(uN>mZGNb3bd6rAHL z!TC{?ZBghB-^^m_a7$&oGo@5}Mb{5j?&da(?U7$T8B&P8mG2$s@ea3i;JU&V$b*oR zE6t6NqW3ns%p6wl>q%po>m=>>J>NgAkNfj;E9et9i}D^~qV3Xs)2v_`p;22`N7Z2j zI@Z^>wJ(5R>WLmLJtx!8A#seTMW{q!>p4_!LH+qZ_uH@Cu;ZuFYRFE;N*Z(^+cTn) zJiZ<1!rABu(_Z$L`R5CUl!Q5t)=Di(fi^N{Wj|n1J$bd~;|`9S1eSOVyHN1(<*OE= zVDDd%A<~^?s%4Z?AJ&BN@MCbngQ^u3a9Pb$mX0jJeGzfC&=uvAZpG}v#jO81aBWD0 z$$x$C9CSXv#fTcpooUu@S^gPr+QJLt2o*bk=^SZf*Y z&uu34he%9<%kn>5i0>sY&uJ!VA>#}Mv+Z0yLrCuho(#sih|8uS%@ei3=9c3B&vYhg z>gsIB!2*}MXa%-YQ0H?$&4`vHeM&FU&C*)|a%pme?1NM5uEn<;hG!u;4H)bmEcYctJJvtTAhtu zpcemP%n<>gJSFP5`Lr1N{Y(`~Lm&$)y|Z*hAS0y@{JK)KhA&o1_y6{51j3}uD$|%h znO_~C0XkkH=A63q!uj)g$%g3O%#>hfCCrlh877TH{P6z$yropbi``~@%&{y+i?Pr} z-KMA@N?vDC>UL|;`;3f5rRJRb119o^9UcqqZSwC#&2bpQ$1R2%X&fE{!&&Wz08`;m zi7kR{3Pyq5n01f`fg)9rx|K@uB?y*zWa4%$=WYRy;l`u+rqIxwa_(THrnR+of^arx zvM0Yz6^3^q`LL#y@|XlNon1E5y!rRx-zB$q!|Z~FF~?28XOq$T?4QOi`A#iGVUqIJ z9v*qZOVM|?qQ}2~KsCgvFPoOc#e;=7VK3r)m!2J{L4M?>pN?D#cbS{$)b^g}c$Ol2 zYTw1z{S`3pdGHh;S+wR4S4IU*Y;<8})Fym`g3Gr*58x9(*l+5y3fi;LJa*l06ZhIP zZq&!BupUVneSOU_3|{i%_33(!6sN?i+uXVR?a$nRxrq|{;dCtNjKni}on}E_iKi1~ zA(et;RFtEG+60Ynb=#qX&?&nTj}MYNj<;6K4@yvT9mDm_Mw${w&+Pt~PT=r342~iN zjh?RGceJ@d0#wGGS46qE|BKAv1+aNd!~Sqj3+lu|H742ga;lh**b<6bRN|@i-bU69 z+T~U}@H^}z0h$#D_aA<>MNV$iWOkd=+X3t%n07AMBLwZh`TOY6B;U!7tCod}b4(i( z6O%7U-|_FYNdyS~ITZ_4Q-k5(3cwaBiqx#=UYs2tVh=3Mv=Gm~QtgRVxsZK2a*I#T z?f4t4-a?iehM$<#nssy_2D9{z7Qn=@gPV0nci7}QgfgW+THz8@_U8(ef#2Q>~^_CCJgW|Cs5u%dqEQ;_H==4U z_9pW9LcCq@xax!+D0_#P-MQ~1>coFwv(==@Q(xq@9l!jcKht;=zVE^Qtz>R5a*L7@ zCnQgG=*>MmDXb^Uqr!(}tuTewJS1nJMoaJl3l0Yx~L#+Bw>s#0;re zz2MnmI9lZj(h`34cA5Lo7yLA?HT(4BkA=|`-^v@%Ajw2Ka&XW{ybtBdoQ)|BR4XKz zPvh8*K1fg`4?b1v6WqmD=xsQ5P1xtz(zKP$9`E?{GO>sF^O6A!7J59{UJ2QfKNu2-yh7$Zm_2IAKcRv}aiNt=7 zxAk~pxb(A{n<8AQGvt21pjq;*sH!Ba3&Up-UH6xVRj74jO{?qKjbc4dDAVQRI8(sX zSjfJSKRMfO=}X8&Vy)@#%%ouBuoIl#!mO;H$aw+SxqUO8_gcYOBe_8+j@K8&qX8S8 z>S(frBGTeE4npCSuMg}nf=&$(=46jk ziZ_U|o$$v?%jljW3uQ$0oVTH7tC~T~4&CpPZJ60MGuokGb>~cJ{Q2cV3W7O;MMjXZ ztE3FSX)?(7q-VxH> z-Te$XBKyx#7bmpfPmd=14L*66ai6Jfl9|R8=e}7}%(bNK^1#NTBgvmaaQ2gQ@!3be zOL|C*)Q_fM*e2z2KTnU|d$sWT^;TYfg|n8QWVl<$$ID;hysT@NUzjPndyYa+Q{p_W z|FCT79Q10>v?LGJb!2@AtdI47RNK$-p4W#)!frFGypK{3TJ3w(mQm!Zo>9M zcN(`6O@f0_x%&Y6O#IfiKjc2~+ZxDDofW)+T?^9uBS1lNfwFE@sK0txrZflT8=nF| zP0Qf~bIaoyTi|W}YT2u^vjtQg_6reQ8mhbn#irwEFIfLgeMZs7DaoF>(GJ&nOEA`FY&S}pNpe><4v3z zYtM|4=+ymy8z~SEE(Y6Sf}2iBxo7b=ww^eg`YoS(kpuP?s;{`sD*O6C5j5-Cr`W8! z#`FD;TpP4ws@#3jE>~)KO5<#ZcxrmnJ4(In0IZ*@+Etoi#^9@sFZL*Tlq1KzkHVHl z8{Z6Bp%^*#j|89$6=@;6ZtZ9+U#wNj$u{^c<&s0qK^21ZN>t* zH)9-V0v078#VIAo=X#46WG7LyC^BorKZz=3nrZkQgN*Vz&GOkRzLRO;ir>}^^?H`u zmUwUp7(qjF5cdW(-zf%d+tR6}QQW^8J(*i)`<1fH>Rp4N2hNxiZ`%Y027WAoN8!?_F>N6?H&^2n(sCY#@UI2PJ;^@D zZ;#~Slnet3(B;Bqj<86dU0f|D(14c~H$N5ONqI&H!Q_6Dp7-Q&+k< zy)6}h-qm@90CjZfS2z$6{0I5fm-64mgUrnedBF8ahnSZyRj^B$*+G1+tEP8MRW^1~ zd}{QqXS77Uv0(P<7x$Q|+-S9rkyS(;9wO=YLg&uB%13KS%^@8f*LcON(N8w1*lHno znNLX{ADujT9W*YG-n%{~;QR6YIBa=BCYB>GK+? zVhb@S-4Gj`^02(#GF+4WS^)9A8!~7`zU9@&8j7(fU-g5oHiEnX+Sfc;agL+z|^j)3v*bPu&}vJ*~Z5&G`?x#gA}Z9ZNN zQpvZGsd^&Cm+p^u&=6-PcxqzV3_z1zU+778QZD&IhqR8_NwCMguL)8N{PXnfc%Pti zbH!Cf2)hAz^|%%XesxX9^|AAkhx#txdX@NM|8Z=ynhY{cFVtb7|B=*WUV}zHpr*IW*xz2M(RO(v zWNkg0Wh+isPe7l*<`6UN!sp3VCC#w=uvC~+Wx>7nK0v-(h~Gb4AX%&n6)p?-B-vrD zO($kXWWRNuOHIY4%mo()l!vu3E6SrEyV6Qa7N!z56Lfh96@&!+Q?SR71v1Kx~akwWCYa#(Obd zl1QG_`IaSvPsK}?b}lOadk)S z%tr6hNn^H6O|TiOdLFw{eu7XZJ2sb(A8o3ItqoJwoEZ{ z-Lo135fe4rAn77`mtlNY?&1ApaKwDYV2^+#=-?Mv&eq2*n)o;Bp6WLtVPEG)=yE!s zURsk+w9FAK!J7jsXN{#--Dye~4oNS%ug~lAWWDulc4r`E(Qc8%!86qjg(l@>X%$ zdl42%QnefZ-khf(xUYD@_d*35P**3L^*LS)=3(3qHm+Y|k#2LCZb_*x(+e8moUYXO zylppAF6i_WWN(DfcihMAN?Fhi2r|s*9Ml9Dq~io9WChWVrevNV$c`R0w)Bc7dIXI) z>KV`Q8!ds5KJi|3B3jx$8MEw<{_(=>NU)+&U~y;mjdm0 zCgw0-V%^ruC9b4Z;cx-oPqGdbWJ8<;ypCz9UpW!PX^sW%SHOk=B>pNP5!3+7eCVD4bgC{!UUsuS0}%HbpLP&`ThxJYVrS75rv^(#tJf1Uru2LFZ2F@R=R^ zyUDZPFWfk@_Q(IQ)l*wB5%DS);<`bk*dq;UH=Qy*qp2uj34~q|gr+P5B4Z6$aNiUj zPU=07`F61RvX&u$)@48wY$CU)X9G0oD)mO{&vjfy&5pJCaC@Abt_^E-0BCpt=_S%6 zrb>z0sNQ1Eg?J5CGv%$HBo4M;G!E2AeaJ+wG2E5 z25!~QUL>LCZ|Yrgnu4oN8Q z5@P}3P3kJRcU4~BCtH7cINq*Qn&3=aEd=NbgujJn^`tBo#B1DS;m-qCZMA}cQe*ok z_!1yl=gaV{CSNk2O**Q&_~HC3kCV17ZPJ0>(qmawZ1UXm7Zms78SZfkBjz`NU4Ebm%eIYA+~ z`O>`OMLx-mEf3lcp%pfVHmy|(Z2c0W#8Dl>(lJX@bs9B3K)yHG7z>wXQ2n1DvIC(_ zTAIPY3UT!d1a3y3?!+I(!eu^cqT>@gP%I#7b?eW0pvXUm&R@_dsmU-;9MRj>QJJdC z2jZ!e&`MAhFqXMGa9lsRVn__jMp3chfnGm8osC`sck5c{e$WOoLqt-KKJIpPv=lSmXLk%*n-+~%od%0=Ohox20{$+R z4?c>-)nD-Pzx^7lU$({H?(H0SJaC@el!E8eR8&+J{$Z2?KM$B_uSMCpbK-AB1o_|G z#{U=IB)FrJfnRH>H}i`T2!_co>-7K6srKvx*6UwW`mgzkvLJNcG<<_70++G@eb{-C z&t>I<;&s{_h$qXqy1NCb1;Y*T)YEeCTfhfu@OXCS-RV12GKMTnaos7}#nQhw1*yYJ z3*Z1^xID7Z@Td8}$g`u(5ed8tkrh6bVshQWr553jF-~!FIVf-}JK-WM&e2(vlKCPs^uosYDHq zIZ_LJz2U!~a#E=S8rt4Uy_=evZV?IG-+8H351%LMPMJmT$h9tX7CE3eAh=vF8$5}L zAx10cm!4nRml8OL-twU8y#-e!VuXjJ*MV$Y_Xrp}?vcNXYl|PpeqD3&Pip5lW?@*4 z5AeoKfB4UnH(5l;VYHG} z4K5i-4{p3A8W(6Htc$x3UgUCKs+F_5D66=C@4BgVM?^seFCYDO!PP30CxUBugh=rV zr624vi7>Rjq=#qC{&VSq!r;*0pi6JTy|}oz5#w8+Jm+uReWqLFoA-9-I-;t>BPD?VZ16iQ0);-^;!u726Hd9xsV5>)EktCohHs@Fc=1pFdj)NW}u z;=9NnxfP*b0i1og9N_-C0IlaSeDMrFd> zw?$NVe_P=@BJr?%4AbfQaFIdOf$E71~@NH0JOd8I{&HvRKP(+!$b(6qXv<=l}2AkPNGu+PAsg=9U6it?t~ z+mwr5+XVuJ;XKI0$atwn~-(7<_fb8i9zIQK=#Pdy&b-vsM__CHIJ zmTFRFQkr72#3C}-nC{DGH7}<>E(eBrodI5%CqA`){rWls#b|(n*1+RgxG7~4_<7^t zMsVKtw{3vDRy}7ZF9Qx)bk#z)7H5JHQ9hqK1>a)9P>TP^Hq!DUQ(#%&`r(2cu%&~Y zqzryOD7@QNr5G@#tg}=B>gMuQPjhq!GpHGK*D&iYpN-rHLa1LjX!6eVnDwdM*E+s` z|DLylXB;OV;OcrNbxhI2v*HI=OI-Y)0RekQ?%?&CDM8#fz*XXN>1a*~w{opgu|MbK zKFcEDBJxu_p5;2$S%Xake@=l3-oogI7J=Mblv2JavlDt7zLOz4-{zlImYq;>^Wse0^cbmDnKad`M{HFD& zav0GS&J%jNmdy`Fc9DGDgw>(ZAT^c$vE^!CgtZ|zmfx?E+7%gAr}h>(Wx_JKUzVX- z=5w+YCd_R#r;rE< zsaSu#Y@@pjzO!uFbEU4BMn(1IByy);6_;&-8k5J;A;9%+GkgJpKVOkX-PWjK6r{49ICf(R{w;;+BYo}K6G7I zv$XZPD^$}v!IIE1s5gb_%j{Bj95{#C{K;{`YpgRX9&~0cU7Z^xG|Qe3ZFmg&B>x!m zbJMbs*?_FJ-Fo{UjEshOhn7H+vGm?6?v1Yx7x_&&Bp$mLOT!2SK0{GDrJ=jRCFMs< z%0`lW*?m1Ci9rQzJl7cGtDLP7f=r`S(qtA>M{lNLF(WO-Tu~6AT zr^eUzLOxl@tjb$XF#sN0->w(EohO-ke*jGe@b{IwrT9QHDCKqPzkO1j|CE_Lfmc~v zsNl2nW!0>T;fgYoP!?|lmvw|Np~Wc;IqnB0{T>MmCO=oXWl$~_%Pd@ z_EJx-<6i1>O>w66T5!B-r9;P!?2>Dpsf&^y4c55(Ut`s(L06BJ4^&5Nc(G$p>n%cd zPDE~imE7mxB{C=ljJfPr7eKu= z{uEL$f_UmGlj^?Hp51fB!az6ckT6;#`*fOLO~gig03+AY3^qUj#<{%Vr7SCTU&M$s zVH799kUPJg$rwur=*EdUYOp78aoixE0Q}Si0ER4wO7%YoK3_<-3$isf8U?V^gzUJ*R3QI;+dqohyWnFj)dWmTS?0YkEOuv zZPTn?xkEWRsNNqT!HL=^mzj|!HX0@IX{Hd86s)xWt=eOx&Dl0SCFK!F>tfi)OO@(R ziNN9Yg}c!!DnKHTG-{C64`5GtdaJJ0YyNk_sn@8zzk69Ttj#R*?1m|TeD2iJd#jF% z-3)bP$r2_?_e1Q0<~m*9*Do#1z_s9M2z#5z#shs90Lan|nXgA$k!Q=I?~U;Rx1{MN zSQ40ZwY4QoCnGzFiF?P%%_-nmg}&Xxa*(JR9n9^En2Tf`Rjcf~gmP{I$qhOJ9j2V; ziMIq)=(yOm00~nXrDRMO*tY%?A%B`I0dG?fzAL(_NuAi|AhKG7(&>-o24|3VzR*$$ zwHjonKdLhWg43N?#FE<;g9ze8t5i7!m`Wh%G;bUA^CDX}HcM~=qLZ^IKgSk&#VtC< zU(golOg^S7C10EDU(j2m09onSXMIAOWslW&vBTxT4k>FZ~#q#(4w1g z_e>VEz#J~B{C{s7P*smTjgtoY&{G~bWx@f+K2W8&z@wX2ivF*?53Y*ZrCftVYoi2l zv9W`}UBaw492k{!?}Fat>z&D*Ue)i^F7wE#SDJQoQG-Z_z#yHuc(L)Y&3V-t%+JcT z?7&bvA$!B(jZvpylzPOcxz%1Sprx`cW?WGuMcfgW0WAK_L>@}V+?81m&X&)LV3uBv zCZ$jd?hRQrifncXu81H)x!v8@v#xx2YV(nB>d7V_a7Kjm697Jk$_eJ_i`x4lo~BU- z!&!HN85#J}vj`Ov_;)iR(hBHHzUUAUzGNif*-j(i!ug_5`I*o~eIOeYmB5h|+Wl%t zAHf`j+6l8`Rgr?b{DGrYAhKyfm(oS->pu_*malF9CX=!boDD@Wc-|fc7acKR{dv_Q zcWS7P^lkozQ_^sS=yZ}*riB9RmFPr=U|195o(2bP;28iZH^8YB2|;O?)ej{d*SASN zz2MJ~SQ?AYOu&CGgU%GH_NlB!KM_f37VAH9``h(*XQKL6KM-eQmS<9E{>Do`ACclI z2y~O7S!Xbcl{wRK;}YIhH}S~rr$Uy@_J3x}x~YgW*lTJvay$V8IFmQy;XZG&isCik zz0mK_7ede`f!7*nX>}I4^f-vfl4iwx6(V@ywmzt3ED%1A7Bc7pO@h&Rn{wvnL7hK> z2kiMGuaD|RriHr41iQAShc=}cGnVJ;j7vwEb3j2lVgyV(S}R&CKn&ydIygqra8e2b z{t5wLOk8ldhjhL|M>2K)zw+|=M~8B6rj?E*{}gI!u-5hZ0x&g3|Zx%@zFYm~LwFF@XLgnr}_LHoGtrIyQE9lgd@8o0) z3?FA~tH_Sq7Q^tSz}danE>TC0Xr}02BWit$@Y)cteQo=y-{iGjUV}!?x28wDKmh2j zKOP|Ls+T*@UAp$qlC=}$?lpU3V2i_F!Ijy5=E_$qVRnKQ-U$Aj44=oh!(RG$)x@() zL@9_NWmUyt1<0=?lf1B2<|sH^RXU?(c%tt24Linyy8`DxeJN$$eH{c$O4`uG>sDLd zjr==3NubfwI5E3;BWaZg&pW-{u9xA{&XdF1)pFEo(2@N?pnas#9U0;YL<(z;V#m|C zG4}6K0!wXJwNjiUUcAqFJIJ9%#<5XbirTl58Ehy@&eJu%@%S5uEiIy@_O8I!X zI&|bqlsqYPKDu>P!<{ppb!dV6cK-kse2yO)ynPR=bGsw{Y=?tki;Xt<&C zOSU=q;|CvPM*k-Hj>op2?9O$yC^eI)|1^Q~XKkOrE6;$ZbPj02`*B42x2rM@}5Ay zpahahrqm&^_!Lnc0Y|NNH;6<85D(83j^F<*yt4nxzovV4*4KJ~b;=w%57>4q*i;F? z7a9+UIQXyeL;;M!_U-oj*X7$;eI+l&n5zK{{;g~PM5S;1m+l2yWc$X!M^XRZzVNB6t-CPlFThef_~MP>A_jV(G9!ceFkkgc+|PxPTAtOR zIG!+eRI52p02M*i^U0GZ!!Uch^J^!s@sKbOCj?^$m)LnNV*+?-0oSQPv}YSY0$+h{ z3}JBGhn%1ov{A2QxjYMZg*rN+!tBbgb;tAGX(N68J65;8UaA2lgT4z3@MF9~1NF}s z%EwKK&_-TI35bjU+N_aJGUIOkqh4{hX8V5?70QE1h4hh1cr(&9j|I)0f~H^|m~Vs7 zkMuxY<$lUhkeT|sVZD~RutrHxJzeT;2}H@o+(&L2TNClqa^ke*x*xwY1&1pCAzF`W^Cl z4jK1AE=9G;xx{lHDP&eluqD>Q{%7Il_Tu%mFYm2`W(7Ct@BZd^bAM5H>BGqF>#)%* zD*M{>D(}Adl&dt-bf7`6AOGN+MBEV9{67)JJJ*>~gZ{jWS^9%V=G&t(fo!BzNBal$F z{_W~ZXgSJ?H$d{|H`w2V;C(-8Nop3Ynp(2xmObu;rGZ2Xs5;cosN==r6!A6h*tM`)pJwT!^eAY z_`Y03K{jlbo{@887hK*05}wgFnZLUYLa*e&@^?TQ{_8rHn-(YU?%m5&_eM01I+smR z7(Sc4c1A|VQ91dts87JEjn2sRNrd_ZL!EmG$h-T+84#KNRSy6X(om2FI+6Fe05xq6 zU(`hR-CAofIKm%V-g|FnwB$zV@=q4KXP008k*9YAns9NId(N4e9v+Ja7jrI~n+Xmt zeLPwI3egHs*Q&cscXR-2rv4&KEr{8jCuCWzc4h?t;Ca!X&(5C|ci0g>TTYa_hjOY5fZEVdW#^mSgi#ZYpg zFgX%whhjZLrw3+QRiJxX4CFXn-do^59$MRQ-`Z^OemCC%Y#xfU7s8mi)fH3qo@GC8 zYXV{FosP9G|K41sMX#e4W+%Sc`xh)PT*7}P-GyG(MbXI4=8{jWb!@<=cr&BYw(_t( zYoAYN7ujmnJ*PF7*61U{TK}-si%#x5OQ;w9z7xB6>V5&=JoL9OcjMIftP%ohh4sK=*@*HR+d>JJE? zeVTU7u!p_j2UFjUGQ`^4l6K9T1vIc>kYQh=@W$=xr>e#XhXA+?`l=TVLDa<6_lYvS zvvywbn%u{$Jl8<-1@ix%&n}|jSTjDyo@}|r)e#vFwVXxZ&j=y1Peb|Wq#3g2v zd)9+rn6)oWyv`}w3^X?7V-vS_1Ag;X9>pb2=x_KmZr824HxjhWlC%k+0ru9lvucT9 z$<}z1TL)>L@z%yndQnNn0aZI>oA~`Wfz|?eoEbM^k0b z>dlBZf3rQ4r}e#QymjfGO{7H&uIY#YbIqk6mxVO|GFc7*k#$|ZS;0){_4069=@&L% zL;EcKZ%LO7ULIUmZzQRg7r@wAYW#*d>DRN}%o)Sk^>zBV+n<6#-#XXCP=1SSjXu4k z)%oD+VWB|3rTQG^)BbNqc#GUhv2yq2ok z1y5oY22V9FH3s8RQj9UfMOB6YA`Ezd6}1(8A-1<)g;bsLXxZP;f0e_FA{K}`(?}048VYOx31%p|k@dJCF8X|8 z02(_`b9d)?zHv!w%zH;Rvt{#drKTN13RztM&38hD{ghQD(TYkc4puT4*SUtT1ePMp zTuYIjOI~_aUdSaz<=Px61>LLOUID}JN=Z{X9`wQ?^3f{?1K+0DAIouC{fK`!r8uF4 z>Itw6-DgaW1VQ}pT>MX|WBv=@zjD&aGHgAF&%W76PUtxrsmtwf-{FY>kxnUkfx1rD zWGY!BA}h>Yc0Msn+?@;?NG4xS+(X}?_eX`>s)xzi-kn?bPmefC9P=g(%Z47t8Q@6$ zxHmXRMxt{xhXre_Ud=E@bQ|`()TkYO{$u8=;pv~87|`ff`_hN)*-N8pNpsC zR+ME@qPII7^U?bm0$A+^_kaf94&n0{V71e(yho`!G%gDGm`-eY30<&RGJS@{OIgr! zNOy89Zr>qtXKo~~lh`TSc0?_+CsUeCf^6$%`8%o!56tMpfTOnTt6`2@6P6R^rLAor z(u&TS3gTmRWEctR0*_=90_M>e*=Q5pd94@)Jm({<97Sug)rU$43iVeCN`8_x963`W zKR5vbkt1fnJ6^oIt@Hkb8k&P{H5><8(;uHA-`=R)cQvFf`ds*{lUA@Rqg#)}5NU^$ z!eJ0%&D@OSMA3_$!V^C8O4cn)OH-dMsZ6FGEm9Q-HoFmeSrCKI{Eb>Jdd@`EVZlqC zf@x%!)k0fi9htOI^p2-Z+H`7!TA6LyD9N-aKk|-I_1iL$t}<+pw=%aB(6^pO{~mR4-DE!4H|bn|_=eQ)pJ)~M$Scsy(3Nu(kd?&Ej;sZ0RIvOR8PyW~6 z@uS51?_e6Sf{X<8q7IHG&0PSl>p4cklOxZy?b7>>Cpc|}h^SwI6<8^-h|Udqs_tvz z61BZGmExb}S`t{W`g@VQ@ZMLU5UB=ByZ$|x*V{f>Xbgt5xLJ=P%k~HIrfvdwy=X-F zD!)?QE%jsTTDNwgN>=%o<3wJ0S^{{@vCo*J9&AU?tQ_;T756w+UzZs0=5{~oRaHec z=MT-<%Wu4You8wo7gO^F&gn>RSy1!-#?`BT7N9m%8kUAxKr&Qcp|*3*R>gq2%~8AD^s>B zYa;SEPUUdhD7d+odRd0NMtjoyci12PgT|J;-$N=(Q?)){rq;#0I+jMXzXj6H(B!qY z?^b>ju{L~@U&TpvjLdCjE8tEqJ2yR(5*_KrERTca^gfIT741G#3IDpkrnIP(o3Tj> zP9K?f9|gt;PRY`FL|2N5cQyC1XaANsihUqvVXwDHvYJf)=OPAxPpOL8*ODITke~RI zMy4PJF91J=?|OQI9{-J0ui_V+LL|*R)wi1+J?O1gYK^Iml-dc(bL3H9HQq*tt|(#@ zyE?YtQq^RoJX{Trl2N{wy}8^M>LzipltV4cJ(PE-Qoh>C^)|T?f#41sRZ`+2MI~h{ zHpBc0o%|_vOh$?lbBsMOBRNGmUsFR{|2%5H2Ji^AjLT7Vr4Q(4;DOI=OMZYQ@cE^A zWgG6~y6nI$seH6&e1+5`I(fLqG11nA#9q?QgfAzTDs_j8Ood6YEo)F>7Nl2$joHQs z)~0Y9*79Hz4Ao_Dc0%*0Sy|RIipQ`)=-&a_5<2CLE9aRA0MEXN1lnVgxa6b{ISy@=5yHpl&nzjxnEps-`%bmcw~$y12QNQSzH zYVHAgM=loxB*PLAb9XXTt2YTPf@~M3&$tz42;qKwuao~W6DdAKG%>%(M4JDm^6^Y1l)4A4zo3Ftq!D2>l_>}TGt z&kuhQvc@#95dsW#o7AOAdsnTE6rW_@5c+jOzs%~5Z{?wsoK(JKC9$=o&;m&CEMmr@ zho+|^S0j(#30Ib3wbuAXBtxtC0xpImDeH+G+x+v(Obe6pm1*;t!4Wr$to<_yefgmc_Gla|nYcAn)nep~W0ds~_hjo0@MF!B-#KuCbq zdBz_z|1x6R5b8iM*j_hTA*?&@;y1$8Ap@zVKFCeB?#hC{a8&mRbR%W zs1HvCqVH|TyrsoIbi0hkcZ-n4g`|=O(*~ok+12GvUH6Aux{bM`B$0Xbh-*P46WO_P zm++$OU7xq(Zo&ak?L=2I^!an6SBX%`zh?rAbNsS~Ut+^CiW|q(^N1Lh5=%CR>$+2# zLu~z3Pbr>rDw`0S+%*TM&DI4pRB(&v)WmOZSEF6FS|mJw(`KI1WhFpsB5hPkVRr}H z;q##=&WzDWgxeG+o#rm2d_8^3azG2Et1UKlOcQ66BmWgWrWi+cUzdr2FrWTNmAUcB zSehy|^DY6MD}548DB9%zNT8nTb1Hah$6b&qeNr5c+H@r5#h0$nYEF`lXvxR=;L z;AMIzoKDn1mX|3;MlVBVGP~VfloEIv99@q*bz5huCqmzgL~66S5Y5Cnhv}+A_qEol zlvJO5;wxVqr~MOs1fFU+CY{HqE)Z=WA5gcq(sk+{*JLt-)+_#3x~9Sv#6xebar|Yd zVpUa~OilYD`dv=5=FodGtRmT9Ber9VY>eV6ZCbLy`Pru`6l4xVY`ev!+=q;7h`mzG zA!9JrDWNbjl(B@rE=noEA-z{k>vYXH=qQ|5`PKN`6r;=xJ#bf)=z0wh^7WlGvN7#`alS3CZ;jQ>)uwJs>$ z&QYMx@uRb!wnbQVxJ*hhhBG;~*5C{U($i;5{B%VG!kHdVhGJbE2K(zC&Y05GD;$6C zmAi6_gCSr=&_q`o*>=+@t(ESh92h=5VI4b6nxKhw))cV7O;z6E@M*4$i;HLE<2Qgd0wUoC+J7NcGIoGvTdvR@=WUOux645Jn}c=&rpYM z9}`4XNC4oejV4VjK?I-wLXLlwb^p;@s;K4yRXXBSm?K>{bRV$D5|g!fOlUF0hidq? zIPDw!{4wIxNI|0VCR|dn>x#X*zj}@EPP)T~Bj{yWRoRYfs>rQSv9+P-Rdr>uSPze5 z>MTpeiW}&VI*`2A*^s#>0D}i6C|+wy*WwbhHTI{m8%q2c`FWMng<=ZRnlr`enySuf zS76BnRzK(1w&FvH--W@1VU}FG@cLw|&S^%%Y-~SSRYbMbO1kss?q9lBj$AX-!6m-P zf135(-(>pOz}qk8ZHERvuPyJ7!M>%7OkitYK#ewcAQq#;4X?jF9sZ*Gm2GR(az1Sa z`DgvCxBNNlUt*B@@#f_h-)J7%_HxwH;TUMl&%-bwpjI55)756`ids5O5mfw8Ylr-~ zxZ*k4b2~@<>*VYUa zT(7qUE&E1n8eA|xolNedd-DVv8}%vtFpr_6q-CRnKEG1*`#i+PzgVYx`_kDh&XC+? zsi$7NM9IoKzjJDeZ=E^(TygHfi#I>0NXh{ZRv=@L?w2x`;@U00kdcKg7WskD5Oehp z7>8bq?RQIlBxAqUXfPOh-`pA??X9%|UX*y1v)S3@C$9`cIPFRqnn^JVdZ`thR3n|K zZzuAZqk6L0i`cKTPl9xn#-G2c=rfwTgJzs&mxjxc;{y-YKU-SYKi6w7gihIL>)6@5 zDi6cW?M2IeJo-RlH}-3*&0$dIK-JfwojKuEVnA5A@3YMp(6e%Rck*r2EAar*|23&& zUB=3_;)caR88fU3i*}s6OAjYg94)%JNO`-Zo}hY4t|Hd~pi>smi-{)H`vQ1^Qk; zpn3d3Qgf;9`2YbipGbN?iGUTA1wvQeh`F_x0?%cq0PV7;S*Zg^A^hCW z|J@^`-^4#v;(JwicBTGY8*(^^gGK>d%Ld&lpr>FBoH=BdA2@RA%B#*E7a*S8a{MO7 z;c&@=8HeHN^@c820N%)09}Xh=F~_IToy{eW=<#{P(V@JztTAG^bhlygP1mjYA&FHE zvhcgte`O|~Anm+mOTU^EH&V@|dnL*c1{VXE1Vmq?jk7dbqnposE}=sm0*&^_%&#+* zuM9#Crp?uGAS3uLbgO?BrpX&;FBXjeOrtP*uagn>IvTh#RPf~6qfvQW(DqlI?FIja zivt98xNoog`nF4nO5u`)Y>PqAu65s#W!nq8OCm^OH`VT@1#SN+Q`ynn1#pPUv}wej zg7@-xctYnBRg?KJ9j#jYR-2kA%S_U^fXJHu^fH(iuhbfz=PF?-*yf7jg?8CKm@hlZ(Sg&w5iJ__>#2kUCXyL0e$EY z0sXUR{CE<_$gc=Y$ZQnli}@4u@c}4**h;*rY_steMv~I{MNjWUu2MSiAAd+6VDLMF zq{i;?GG|Y)Y5?`dbf`4CzQ5;vuiY9j-PQ8p;YPF`kNgkdPbmEDl?q?G5#tnFGQZDvjKVsEpg9Nvrok#Fy+p?4 ztI7!bM&+!@n+pE5Zmw^&>u1;)EGFa-5kgWC${&?7xe03EdEb|@(LF8Tpssz>x?Jg5 z(PAH;H4Z8eKd$~K56?!|vswg6**LJy9C;olP--p711-0OC~0`z>~#1I%%MZ=Jt9Y8e!7o(Y!4b zQm5a48vm{bZl-E!V!$7LFg8phjjI3ZCz&N)MTsl0zZuKGe6{Nj=wi*Muc^opAFHfwGKHgTihO@#ky(|S1PE)S^ z#_7D)ur1}puSe^FpAs4?r2#iw{ExWp5Fq@nZVkLp9q=x9o_#89Du(La{RUnU6TzUq zRu|i_GFSJWdw_zBA>etodEdB%{rv@y+LX(o&l88)NOPZ*c8U*}4l%)59A>ZHQObcQ z>`5FZgf62B>oQ!1Two!VLvfjWD6-$Ud4N25~DY z0Bj4ndc8Mzc&2r+i!uoz)XIJ!K8nS4(5G8C+W_p~%Vr&r&qdmImA)k!QOs=YA}(~u zS?a4vkDaPbIVR;?OY{50J4OQL)Bf)5K@;U@F@}%n)FSvye>%lw)vky3+^eHr9bD)9 zCtt0g4}iV(Mo=itWF*ha$An}qSlqngt$ZB6ex~?-r~{~D{7y;a@ugafk5mJ0+Mq?r zN(hQldg}tljj~S<%q+b$-@CVo_yfLurCMtG{c(@RzG>~t#j{{F`Rhy-6zVRtOaa6} zLimAE?|ZeR)j1ftYdhRwuzeJrnc|hYygS`QL)CI>UPUrMozTO}6xEx3YR$@CP{3Fo zS@t4{0r&m4-ie3Vk)KE(1LVpsopvl-C=>SM@8eKds&qYIO-RE#_h&&!NgKhaG5|9ICWqyncm1de!;&4*omT(vkO#EOIeZ843-$QdS@9q6j|;vK z#QQwX&{WLJp<*`@ye%q2BXqU#f&Lx+41M_l&p?JfxAx~BJ|$4a$LD>>T+o+&a(aRo zm7;waTi521JuY5A>(F`p80NaVgw1(0ciJnMqpv7Q%9xO$u5~+#5s{xE>1wZ6A0q0S zJd+pXnL!6BSuu*cYL7R;E?RIAo3y_%BJOi&N2fK=aW+~P9k!`HP3fg0GNl z@(;tbXuX^V5T}?Fn<0!uM*vxl%XrR=znp@VylR9SPEM8@$>4Dxq9>mj< z?#=pQ>@>yM-U$ZY?BZt}I~juSP>r{f#YVmjYd_#VaU zDA@~(;scf2s2!O2WuQM>vet1*q2@u)kLG!uNZT>YBS&YbUZ&Xeh#_58EYrjtL#d%3 zQ3{CT>t(!BR!Gt^oXGeGs?8{b9aGgsriSNB(&nCx7V(U)=pQ>4SfG^ATJDwv+QC=6>vENF||rkFtub6Q5r zK6K6P^kI1J=;diZka1$=<|G5DZ$T4V=`^Nqe_cz3h|`>sm(xtS5LHaHPp-(N;3pla zCy&?~=4CzI2;wbQlaEaHx-9el3B4{qe6cUE@d8650seA8=Wu4JBs~Ng%hu-~P~jR-%d~E{vdhFf-BmjxVD4m8g7}(9y=G zQ5{cj`R8smp9q?JhHe+Ph(z64 zQBYcwo!umA?wu=Z=xM$>uT&**;^@l$F?E#DhTtGq@^O=8D!RT`8FP0|$g1C;N&PXY z7Ba;-(SQ$f4!68Po9qQzAwN!8&PEL^b7GD;G3LM)ONWGOO^21xWS$&bt#B`ut%kKf`vaS7F%6itb~S{soC)3Mk95@(cFo%sw&__MUFhV&YKGvJ=(Q$xyx7n76TV59d#o z9U~Fndm2x-s^op(c`+#M)9Vh!+pa=&(RCA+L3P~Ma&??hQQ6ycSMS~q*fS6~)_~GJ zgO7Qi8$vOkHlq@txGug}8NzE6c-QC_?#y&$dGuS?7ZV|69lwC|26r*6D*Nc-# zeae%BGs=<{;jf5qV|p#V_WHto>?ZHDh|*gxlW(FzPJAevpuY_>tXWwms&rYA(ui}H6a)<_sj5lfZcU5S~*CG~4hmj;SD!89>SfEv;xdEJCsQHDf=bCxj5N27mYeV=={%lAuuM<>iu7E_4?g;L;0vZmCgAMBkxD7d5Y*v*+T&Niec# zOY?0!6(my<#he@D9^@^E_$@CoV9o3Oqc4@VA!0wzr$=sMY;W-c2OozXD_N-b zURb8^kVoK1;t~7LiArvaF`P5Ky&gp}W=FbRV4lK~#+)1%?$BM83-TjUqIcETX6E8c zh$b(l@ZnfxC*~%T?cpDPK-|gR+Iss7neg#d^z3-iEdSmI6a1UD*>>ele35>PE&Z81 z?**?WyYRbw5jW%Ogqm`5X;lBH4A#ZTy$ydrmQ}am$<6n;K9AVql5D$T(U|EXv1Q?C zTtTQHwVEb+to^mRQG8W)8s9%V_h(oN#TNlig?%z6_)r%M+S|V!X#4N$Ocsi;YMmat z)c9)bQT*n(cyTM)m1i&&*F~e^jAJDt(;|qOS(f@{?6O&}Tlv$z${OdgTmOuNv**AXBP}jEUC-kcf}x>_JZzj?;xqJI@Z`EL zNbcE_HW?YvOHq*Jbhgy#s>SXpkKM)FfwA7~=S>UnIcnc{Gbt(C)#>MTrq8++sz*o_ zd`2s?G3<12AAHAe-b;#(8eG0&8}{>-tX5M6c~BHaPcwjC*~4ikdIH0H9Q|NiW$=3b z%nvtA2n_cR05O!i@Da^jH+$DU=D|QQCh*~%k{pK>rwiJ*TbCxM)t~X4UF{nxMVV8z^!_-@pzpgz z|L$1yz*UnT|64iUdzQtRYwaBc(fg^^*?Nvf%skoAMNZXjLf5|c-H6dwKY#VaEFbmN zlGcNV+PZ4=<%OPSRJ`{kY;LE-4(5q_>5yXmf@D$+()Ii|iU8IXO@#6Y%j6kA#yBo< zd|_AdCGsk-A)ae#=uqYcA?{9AKKWxT&M$IR&*=s#(W=WH)D?e7+#@6{C?YWi)5$F$gC}ZUyU=|_jROG*r?9n{6q{i^KT)rQg%hz4Fs0l zdeY^cpJlUPm~aX&((?EL3D@u{YAF}C@BWP0b2cYR-WjemJy%36@qG$|sa|vU=>5A` z?FdN(9;tf+Om z0CMSCCG?(Jh`@EQkN>Zuh}F2ixRya(w~vQVd*hYInP3F@%I3>)YHzP zQl_xvuD{f3H@-eMYuFqM_J~`+irv>Lf@InW_lZc;bus`o4b;*&}drh>a@0m9c`kWk~`qxl^kt4g?1 zIIj4uy@xU$*3R()1&c*I!3+cd))EzW58XSZ9W;1#acp@ej0Cau^TmGI29%6uwy-eV6N^=Jvv&%G9FCGZ(zH(8}DS;HF+I zN;mX|lp=3XIY`H$0#MW8R_;c%O`coofs zJo<}tryFtcA4Vx;(>yth-ErPN4)5=HA(HG7m}Xw~QtIFi?*RO#`ppzhOYF?srI_xF z5%-2qVH(#o;lcu>`WF$bpS8^n13%iNMrq`LL%|a09(^H&O-6$$ZShMAn9Hvte)mBj zRE}dFaEC0n>VIs)gb=n7C|$k@k|37zF($d#a7c4HmB5|!lQ-ABW#2Dx#q(tlqS^LQ z_OhxHm(+5-ABRP9Kv2R9ulBnIOW(ZeNpP9bLr;#8e~X^ske zauALetx*=ANWM^|9Kb1n4~KJ?when%smc2`(XYy^bEh!v#$SaRvQBc`G!l>4gSI-*%2J7|wnz`(dP34=1E;Q(7P^V8i-yqRhB0p4^^1p*^ z0mZu&lK2Q>`Fnwwsesx!9_Zh*GhgtP3k!0-7( zocoxaf`~`J=g76~gg2skI5V!Iz`C|ls49h*co}vJG_nN=TO-B)sai`p~K6~MKSyn zZ8t!V4%|m(Z(9pCDO1Yj$~H|ByTyZt zH-drtxvWLhn7a>=I4wRjtYX+uQ6=W9I4K*}D9Fk>lZJ-sv3|LVv2CwY@x$xdkZo@O z;hrvw9MfsoEZx-A08%%xJi6n)k;)PE{W6D?D*M)cW$Lj^hgsg5Um*R-L6&?&%b zunku{hnKw_PH;ES`|o=X?}@yIN36DENy6a2KEdxu4RhuNmanZ3;>uHaltThU|NQIf zf-2x=6sA#!gppA25dM9_#HPNKaaG<5%cR(L@Q_`cMa$iyf7`KrR_r6Zin{V2+4p4a?9-j@qO~pc;kShA=7*xiPgK{RzN z?qZEt;Y`IIJ}8NH$^5R~dN)tEJmtZ^Z3tS95J6yxkZzpp98j$NwYhE$7^cKVpDhI$ z9Y^y$tOU#+zGjdOyI?qYMK)P(n!Oer8JYQ9%B;ySJF$pWiTlw5L~Rqc{p7~iXI~8m zFUTeyaJVzr(iVrIh8tj95?#!h zHdi2eOy1WO{ofDZe=HH26dU?5upv)s9Eq!XwD_Z;;i^Z|Sz`<3e;zr~QT`kId4vI_ z0-1o%is+gZOHzuDO@rdEJnoWQ2PB zds+VD&0{;cp(5+SnnVQD^{|iJ1wt9&gVi04)G&$*+p#AEUJyiKN$OvU-vW>q9imf2 zbbSw~;`DFt%p56Jjo@0Kv^i1ktRi**Od+q-eWDoxF~y_Mg}k_}3M&6Xc+lYpzFmyP zx`^CUIUuAc>~l-sRk05I#bO3uhj9@bpiGe`ymtra{B9Lsx|3gHffCC{!i)?%%F^~E zz$6?ce+`Z^tMnDN1q|>vsUkqCd0C^-wh*|fMJP>_;xc^p8US(6<|A<`(_b>^ng@~i zp#9}``bo3A6S85-ab;h8>6*=^^Xr~IPZt3cRCwNZlw+3NG8}pswXN4P(5dT4-D4%F zQyM2QU%}Dv#V{0j!g_-5qZE%}2!sn1!=R311A5dMWOWQ^mztR<#6Al zzM~_UZD(KoKi^mGcTyiTLYp`yqZs;nNa=n9($~00)y{}(2)xxd>xSzfPjeJ<+6*G{ zeEW63{pM(G@tkbSzO0oA?n{N0PW}ZB+u7?`LWtVf9TEU0O;_z>?uThO z-axLxBc@0eDToYF*hDOSkgHV(jhtvmP`y5+y}?${+XTrtLZg8#5MuUSGAq_xgglNU z8DT`^LpqZm`D}vpQ#ho=_Wy7I46WQ!&iY%a!9Z)?jQ3J40qIHMBE*^cLhzCgsGt3f zl-4sedy(KOrajg3yO8BSt-L!gwd=k&r>h-~I4!}Bc(dFkHVTP~!>mAMwM|=u%1{sb z@u6p~^D2MLw|*C!bs7U*NIy+cL#UwPe zDrA&9Z>X>!?f?FmOC6{_Ms5rt`QY8k0WHvN)Wa(NP6&nX)2QKcQG=}y>Bkp*UO~3X z>R7MRX7(Jg=L+D(6e}dsspXOLE_x*A^Aw3-<1z(A;6HA`MFBjjvt{RN`TQZh(psu! zqjn1S&8Rw%O)r9)p;nL&q6L0KwzyMoyEWAE$`OcPdh(mUB61(}>my_fkW4TGb^`H{ zUa*5&0V_7zCEnt;s|+gmPZkl&%D*2+k0M{mQqFVsdWPm8RGNcuip@hLjY?s@qJ2Iz z{yx(_q$gHzoh;qK-sB_|d%g|c;VjcgSCy#TjIgmOMC*zKAw7qVM2IG0N^$z3!zlP? z=jh~qGSr6c2h|3xUsq^G2*4zEiMEB7!-K`TspRUJsm~=gEzNS=i%px>(DeV%C(9dL z%>@kj^^=(yD6I_YKVe`6m=a|pfIq1X^tau}3k#{l`#iS>j9IxhU)>z}2Go0RCc`2>_3bm@Bnm+h8)r!V06`-dN}O@hcjLCNpyB{QdjSw7`odE|jk zC>8=IMU={SHxDFJ7R*1jht)ZuX?&_T6?ogc&R=jbatwvBAal?#Teh!<-e4QM{N;E= zr@~UT@2ts49^00(DWBQ@wux5wgh79J6?eSPAV?mc^XrR_uJCz-sT#=3xbjE#^(3N} zg6}Fy(VPn3nH7E>tnJE=voJ{x3dAVx76dnhD@En%Y=iS+3PRvKn7XjmF=x|4`e*4u z91+ZEY`Cv*?GO05<8I}P)BKr%q^0X3yH2gU-q~-xEFq7RRdD7_tFG$88-Lr>wiJ!% zsXQ5v+?$1pL=y{qw{v}>zu=)x)%s{N^MJ58VIMt&T89jf6gd&kh^<`WdT0y( zy#Q@}j5HT2NH!O`HAY|47te*Fm9Bs^>hA&a4TsY*EtOdTk0m(m?{_eCE2g-wBZ(H8 zqx*BP@mL1aiOfLPRH5bP>*1nsc5TQ~F|VY-R z_t=t1n9PDUMEN7l%73ny2DYpk;;yE&XN!Dj8*6Dr>a@+OetaRubPB#hqMvK5_<|=V zc!6kST#k_BIfpw%x^B*tF#PAHD0`uodtt!Z)zw`am-l3ND_IYO&U`VQq{vSObh8d< z_WHYYBg;igjEd8&MQ8$`NmIuvB0nkl@X$c%NI|zknMQ&9ldqWtpZ5RmV8rpYZo`bq0??db(MXmjG$>d8@eD8!5al2= z;dpg8pGc<= Date: Tue, 26 Mar 2024 09:30:11 +0100 Subject: [PATCH 039/113] fix: remove gh token --- sample-config.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample-config.env b/sample-config.env index 3e619a25..a3a4ddd7 100755 --- a/sample-config.env +++ b/sample-config.env @@ -59,4 +59,4 @@ AWS_REGION=us-east-1 # Used by local scripts LIQUIDITY_PROVIDER_RSK_ADDR=0x9D93929A9099be4355fC2389FbF253982F9dF47c -GITHUB_TOKEN=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 \ No newline at end of file +GITHUB_TOKEN= \ No newline at end of file From 6cb2a59ea5b929a6a879c025af8185545bcdcc39 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 4 Apr 2024 11:41:59 +0200 Subject: [PATCH 040/113] feat: add session management for Management API --- Makefile | 22 +- coverage/cover.out | 841 ++++++++++-------- docker-compose/docker-compose.yml | 4 + docker-compose/local/docker-compose.lps.yml | 4 + docker-compose/mainnet/docker-compose.yml | 4 + docs/Environment.md | 4 + docs/environment.md | 51 -- go.mod | 5 +- go.sum | 8 + .../rest/handlers/management_login.go | 62 ++ .../rest/handlers/management_logout.go | 38 + .../entrypoints/rest/middlewares/cors.go | 2 +- .../entrypoints/rest/middlewares/session.go | 79 ++ .../entrypoints/rest/registry/registry.go | 1 + .../entrypoints/rest/routes/management.go | 86 ++ .../entrypoints/rest/routes/public.go | 76 ++ .../entrypoints/rest/routes/routes.go | 106 ++- .../rest/server/cookies/cookies.go | 78 ++ .../entrypoints/rest/server/cookies/store.go | 118 +++ .../configuration/environment/environment.go | 34 +- internal/configuration/registry/usecase.go | 6 + internal/entities/utils/encoding.go | 18 + internal/entities/utils/encoding_test.go | 67 ++ internal/entities/utils/random.go | 25 + internal/entities/utils/random_test.go | 45 + internal/usecases/common.go | 10 - internal/usecases/common_test.go | 14 - internal/usecases/liquidity_provider/login.go | 16 + internal/usecases/pegin/get_pegin_quote.go | 3 +- internal/usecases/pegout/get_pegout_quote.go | 3 +- sample-config.env | 8 +- 31 files changed, 1316 insertions(+), 522 deletions(-) delete mode 100644 docs/environment.md create mode 100644 internal/adapters/entrypoints/rest/handlers/management_login.go create mode 100644 internal/adapters/entrypoints/rest/handlers/management_logout.go create mode 100644 internal/adapters/entrypoints/rest/middlewares/session.go create mode 100644 internal/adapters/entrypoints/rest/routes/management.go create mode 100644 internal/adapters/entrypoints/rest/routes/public.go create mode 100644 internal/adapters/entrypoints/rest/server/cookies/cookies.go create mode 100644 internal/adapters/entrypoints/rest/server/cookies/store.go create mode 100644 internal/entities/utils/encoding.go create mode 100644 internal/entities/utils/encoding_test.go create mode 100644 internal/entities/utils/random.go create mode 100644 internal/entities/utils/random_test.go create mode 100644 internal/usecases/liquidity_provider/login.go diff --git a/Makefile b/Makefile index c9f1d5c8..4b0c2607 100644 --- a/Makefile +++ b/Makefile @@ -37,21 +37,21 @@ api: --generate-yaml true coverage: clean - mkdir coverage - go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... - go tool cover -func "coverage/cover.out" - go tool cover -html="coverage/cover.out" - rm coverage/cover.out + mkdir -p coverage + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out.temp ./pkg/... ./internal/... ./cmd/... + go tool cover -func "coverage/cover.out.temp" + go tool cover -html="coverage/cover.out.temp" + rm coverage/cover.out.temp coverage-report: clean - mkdir coverage + mkdir -p coverage go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... test: clean - mkdir coverage - go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... - go tool cover -func "coverage/cover.out" - rm coverage/cover.out + mkdir -p coverage + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out.temp ./pkg/... ./internal/... ./cmd/... + go tool cover -func "coverage/cover.out.temp" + rm coverage/cover.out.temp clean: - rm -rf build coverage + rm -rf build coverage/cover.out.temp diff --git a/coverage/cover.out b/coverage/cover.out index 33359c22..fde60379 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -112,6 +112,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -121,6 +126,12 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 @@ -192,77 +203,6 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 @@ -530,6 +470,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -539,33 +484,36 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 100 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 100 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 @@ -585,17 +533,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -613,85 +561,38 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 @@ -959,6 +860,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -968,6 +874,12 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -1059,6 +971,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 @@ -1068,6 +985,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 @@ -1077,6 +1005,141 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 110 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 110 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -1186,6 +1249,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -1195,33 +1263,36 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 @@ -1263,6 +1334,8 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.71 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.71,22.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:9.38,11.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:13.42,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 @@ -1461,6 +1534,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -1470,33 +1548,36 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 67 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 67 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 @@ -1608,46 +1689,46 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collat github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:19.67,21.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:21.16,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:30.20,39.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:55.16,63.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:70.109,79.87 8 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:79.87,81.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:83.2,84.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:84.16,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:88.2,88.63 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:88.63,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:92.2,92.75 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:92.75,94.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:96.2,96.76 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:96.76,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:100.2,108.138 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:108.138,110.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:112.2,112.125 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:112.125,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:116.2,116.78 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:116.78,118.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:119.2,119.87 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:119.87,121.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:122.2,122.69 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:125.152,128.85 3 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:128.85,131.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:132.2,132.56 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:132.56,135.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:136.2,136.64 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:136.64,139.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:140.2,140.77 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:140.77,142.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:143.2,143.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:153.29,157.54 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:157.54,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:161.2,184.59 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:184.59,186.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:187.2,187.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:190.121,195.91 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:195.91,197.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:198.2,198.160 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:198.160,200.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:201.2,201.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:31.20,40.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:56.16,64.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:71.109,80.87 8 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:80.87,82.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:84.2,85.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:85.16,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:89.2,89.63 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:89.63,91.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.2,93.75 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.75,95.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.2,97.76 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.76,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.2,109.138 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:109.138,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:113.2,113.125 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:113.125,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.2,117.78 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.78,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:120.2,120.87 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:120.87,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:123.2,123.69 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:126.152,129.85 3 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:129.85,132.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:133.2,133.56 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:133.56,136.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.2,137.64 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.64,140.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.2,141.77 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.77,143.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:144.2,144.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:154.29,158.51 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:158.51,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:162.2,185.59 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:185.59,187.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:188.2,188.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:191.121,196.91 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:196.91,198.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.2,199.160 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.160,201.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:202.2,202.26 1 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:28.25,36.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:38.109,45.65 6 14 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:45.65,47.3 1 1 @@ -1803,6 +1884,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 11 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -1812,33 +1898,36 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 39 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 29 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 39 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 29 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 @@ -1891,51 +1980,51 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_colla github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:32.20,42.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:56.16,63.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:70.110,80.82 9 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:80.82,82.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:84.2,85.72 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.72,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:87.8,87.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:87.23,89.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:91.2,91.75 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:91.75,93.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:95.2,95.63 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:95.63,97.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:99.2,106.96 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:106.96,108.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:110.2,110.127 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:110.127,112.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:114.2,114.68 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:114.68,116.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:118.2,118.72 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:121.153,124.67 3 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:124.67,127.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:128.2,128.85 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:128.85,131.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:132.2,132.56 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:132.56,135.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:136.2,136.77 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:136.77,138.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:139.2,139.17 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:147.30,152.54 4 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:152.54,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:156.2,156.67 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:156.67,158.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:160.2,186.60 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:186.60,188.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:189.2,189.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:192.121,196.91 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:196.91,198.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:199.2,199.160 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:199.160,201.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:202.2,202.26 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:205.114,208.80 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:208.80,210.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:212.2,212.89 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:212.89,214.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:215.2,215.18 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:33.20,43.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:57.16,64.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:71.110,81.82 9 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:81.82,83.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.2,86.72 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:86.72,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.8,88.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.23,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.2,92.75 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.75,94.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.2,96.63 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.63,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,107.96 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:107.96,109.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.2,111.127 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.127,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.2,115.68 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.68,117.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.72 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:122.153,125.67 3 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:125.67,128.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.2,129.85 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.85,132.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.2,133.56 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.56,136.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.77 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.77,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:140.2,140.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.30,153.51 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:153.51,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.2,157.67 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.67,159.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.2,187.60 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:187.60,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:190.2,190.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:193.121,197.91 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:197.91,199.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.2,200.160 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.160,202.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:203.2,203.26 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:206.114,209.80 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:209.80,211.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.2,213.89 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.89,215.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:216.2,216.18 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 @@ -2161,6 +2250,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quo github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -2170,33 +2264,36 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:73.31,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:77.44,79.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:81.39,82.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.55,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:84.8,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:89.59,91.2 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:93.79,94.20 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.20,96.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:96.8,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:106.176,110.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:110.27,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:117.2,120.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:123.2,126.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:129.108,134.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:134.70,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.2,137.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:137.35,141.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:142.2,142.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:145.36,147.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:147.16,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.2,150.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.31,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:163.2,165.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:168.2,173.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 4e6cfbdf..d3919042 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -112,6 +112,10 @@ services: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_REGION + - MANAGEMENT_AUTH_KEY + - MANAGEMENT_ENCRYPTION_KEY + - MANAGEMENT_TOKEN_AUTH_KEY + - MANAGEMENT_USE_HTTPS ports: - "8080:8080" volumes: diff --git a/docker-compose/local/docker-compose.lps.yml b/docker-compose/local/docker-compose.lps.yml index f98537a2..0a1621f5 100644 --- a/docker-compose/local/docker-compose.lps.yml +++ b/docker-compose/local/docker-compose.lps.yml @@ -67,6 +67,10 @@ services: - AWS_SECRET_ACCESS_KEY - AWS_REGION - AWS_LOCAL_ENDPOINT + - MANAGEMENT_AUTH_KEY + - MANAGEMENT_ENCRYPTION_KEY + - MANAGEMENT_TOKEN_AUTH_KEY + - MANAGEMENT_USE_HTTPS ports: - "8080:8080" volumes: diff --git a/docker-compose/mainnet/docker-compose.yml b/docker-compose/mainnet/docker-compose.yml index 468ad423..b15e6065 100644 --- a/docker-compose/mainnet/docker-compose.yml +++ b/docker-compose/mainnet/docker-compose.yml @@ -82,6 +82,10 @@ services: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_REGION + - MANAGEMENT_AUTH_KEY + - MANAGEMENT_ENCRYPTION_KEY + - MANAGEMENT_TOKEN_AUTH_KEY + - MANAGEMENT_USE_HTTPS ports: - "8080:8080" volumes: diff --git a/docs/Environment.md b/docs/Environment.md index b11decce..b6e0f479 100644 --- a/docs/Environment.md +++ b/docs/Environment.md @@ -43,6 +43,10 @@ These are the environment variables required by the liquidity provider server (L | `CAPTCHA_THRESHOLD` | Threshold from zero to one to consider request as valid when using recaptcha v3 (right now we're using v2). | 0.8 | No | | `DISABLE_CAPTCHA` | Whether to disable captcha validation or not. Its a boolean value. | true | No | | `CAPTCHA_URL` | Url to make the captcha verification. | `https://www.google.com/recaptcha/api/siteverify` | No | +| `MANAGEMENT_AUTH_KEY` | Authentication key for the Management API session. Is mandatory if the Management API is enabled. Must be a 32 bytes hex string. | a2fbac02d66202e8468d2a4f1deba4fa5c2491f592e0e22e32fe1e6acac25923 | No | +| `MANAGEMENT_ENCRYPTION_KEY` | Encryption key for the Management API session. Is mandatory if the Management API is enabled. Must be a 32 bytes hex string. | 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 | No | +| `MANAGEMENT_TOKEN_AUTH_KEY` | Authentication key for the CSRF cookies. Is mandatory if the Management API is enabled. Must be a 32 bytes hex string. | c5ff177a86e82441f93e3772da700d5f6838157fa1bfdc0bb689d7f7e55e7aba | No | +| `MANAGEMENT_USE_HTTPS` | Whether the session cookies generated by the Management API should use HTTPS or not | false | No | ## AWS variables You may notice that in [sample-config.env](../sample-config.env) there are some environment variables that are related to AWS. These variables are required to use AWS services, however, they are not listed in the table as the AWS SDK has the functionality to load them from multiple sources. For that reason, they are not accessed directly from the code and are not listed in the table above. diff --git a/docs/environment.md b/docs/environment.md deleted file mode 100644 index b11decce..00000000 --- a/docs/environment.md +++ /dev/null @@ -1,51 +0,0 @@ -# Environment variables -These are the environment variables required by the liquidity provider server (LPS). The following table lists the environment variables and their descriptions and whether it's mandatory or not. - -| **Name** | **Description** | **Example** | **Mandatory** | -|:-----------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------:| -| `LPS_STAGE` | The network where LPS will be running on. | One of the following: `regtest testnet mainnet` | Yes | -| `PORT` | The port number to run the http server of the LPS on. | `8080` | Yes | -| `LOG_LEVEL` | Level for the application logs. | One of the following: `panic fatal error warn info debug trace` | Yes | -| `LOG_FILE` | File to send the logs to. If not provided logs will be sent to standard output. | `/home/lps.log` | No | -| `ENABLE_MANAGEMENT_API` | Whether to enable the management API endpoints or not. To know more read the [Management API Documentation file](#TODO documentation file). If not provided default value will be **false**. | `true` or `false` | No | -| `AWS_LOCAL_ENDPOINT` | Endpoint for the AWS local instance (localstack). Only required if LPS is running in regtest mode. | `http://localhost:4444` | No | -| `MONGODB_USER` | User to connect to MongoDB. | `root` | Yes | -| `MONGODB_PASSWORD` | Password to connect to MongoDB. | `` | Yes | -| `MONGODB_HOST` | Host to connect to MongoDB. | `localhost` | Yes | -| `MONGODB_PORT` | Port to connect to MongoDB. | `27017` | Yes | -| `RSK_ENDPOINT` | URL to connect to the Rootstock node. Must be an http endpoint. | `http://rskj:4444` | Yes | -| `CHAIN_ID` | RSK chain id. | 33 | Yes | -| `LBC_ADDR` | Address of the Liquidity Bridge Contract (LBC). | `0x8901a2Bbf639bFD21A97004BA4D7aE2BD00B8DA8` | Yes | -| `RSK_BRIDGE_ADDR` | Address of the Rootstock bridge. | `0x0000000000000000000000000000000001000006` | Yes | -| `RSK_REQUIRED_BRIDGE_CONFIRMATIONS` | The number of confirmations that need to pass before being able to register a pegin, it changes depending on the network. | 100 | Yes | -| `IRIS_ACTIVATION_HEIGHT` | Block number where the iris updated is activated, depends on the network. | 1500000 | Yes | -| `ERP_KEYS` | Keys that are used as a secondary multisig that would be allowed to spend UTXOs after a year they were created. | 0216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3,
0275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f14,
034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f | Yes | -| `ACCOUNT_NUM` | The keystore account number to use. If not provided default value will be 0. | 2 0 | No | -| `DAO_FEE_COLLECTOR_ADDRESS` | Address of the DAO fee collector. | `0x86B6534687A176A476C16083a373fB9Fe4FAb449` | Yes | -| `KEY_SECRET` | Name of the secret of AWS secrets manager that contains the encrypted json of the liquidity provider RSK account. | `FlyoverTestEnv/LPS-KEY` | Yes | -| `PASSWORD_SECRET` | Name of the secret of AWS secrets manager that contains the password of the encrypted json of the liquidity provider RSK account. | `FlyoverTestEnv/LPS-PASSWORD` | Yes | -| `BTC_NETWORK` | Network to use when connecting to the Bitcoin node. | One of the following: `regtest testnet mainnet` | Yes | -| `BTC_USERNAME` | Username for the bitcoind rpc server. | `user` | Yes | -| `BTC_PASSWORD` | Password for the bitcoind rpc server. | `password` | Yes | -| `BTC_ENDPOINT` | Endpoint of the bitcoind rpc server. Must be an HTTP connection. | `localhost:5555` | Yes | -| `BTC_TX_FEE_RATE` | Bitcoin tx fee rate in BTC/kvB to use when creating transactions. | 0.00025 | Yes | -| `BTC_ENCRYPTED_WALLET` | Whether the wallet to use of the bitcoind node is encrypted or not. Its a boolean value. | true | Yes | -| `BTC_WALLET_PASSWORD` | Password to unlock the wallet of the bitcoind node when it is encrypted. | `password` | No | -| `ALERT_SENDER_EMAIL` | The email that will be used to send alerts. | no-reply@mail.flyover.rifcomputing.net | Yes | -| `ALERT_RECIPIENT_EMAIL` | The email that will receive the alerts. | test@iovlabs.org | Yes | -| `BTC_ADDR` | Bitcoin address of the liquidity provider. | `mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6` | Yes | -| `PROVIDER_NAME` | The liquidity provider name to be registered in the liquidity bridge contract. | `Default provider` | Yes | -| `BASE_URL` | URL of the LPS to register in the liquidity bridge contract. | `http://localhost:8080` | Yes | -| `PROVIDER_TYPE` | Whether the liquidity provider will provide for pegin, pegout or both operations. | One of the following: `pegin pegout both` | Yes | -| `PEGOUT_DEPOSIT_CACHE_START_BLOCK` | If provided, the LPS will upsert into the database all the pegout deposits that were done from this block to the current one. | 500 | No | -| `CAPTCHA_SECRET_KEY` | Captcha key used in the server to validate client requests. | `
` | No | -| `CAPTCHA_SITE_KEY` | Captcha key used by the client to perform the challenge. | `` | No | -| `CAPTCHA_THRESHOLD` | Threshold from zero to one to consider request as valid when using recaptcha v3 (right now we're using v2). | 0.8 | No | -| `DISABLE_CAPTCHA` | Whether to disable captcha validation or not. Its a boolean value. | true | No | -| `CAPTCHA_URL` | Url to make the captcha verification. | `https://www.google.com/recaptcha/api/siteverify` | No | - -## AWS variables -You may notice that in [sample-config.env](../sample-config.env) there are some environment variables that are related to AWS. These variables are required to use AWS services, however, they are not listed in the table as the AWS SDK has the functionality to load them from multiple sources. For that reason, they are not accessed directly from the code and are not listed in the table above. - -## Other variables -You may notice that in [sample-config.env](../sample-config.env) there are variables that aren't in the table and don't belong to AWS. Those variables are used to run scripts or to setup the local environment, they should not be present in a productive environment for this application. \ No newline at end of file diff --git a/go.mod b/go.mod index 9081c518..0322c6b1 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/rsksmart/liquidity-provider-server go 1.21.6 require ( + github.com/aws/aws-sdk-go-v2 v1.20.2 github.com/aws/aws-sdk-go-v2/config v1.18.25 github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.8 github.com/aws/aws-sdk-go-v2/service/ses v1.16.4 @@ -11,15 +12,17 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 github.com/ethereum/go-ethereum v1.11.6 github.com/go-playground/validator/v10 v10.17.0 + github.com/gorilla/csrf v1.7.2 github.com/gorilla/handlers v1.5.2 github.com/gorilla/mux v1.8.1 + github.com/gorilla/securecookie v1.1.2 + github.com/gorilla/sessions v1.2.2 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.8.4 go.mongodb.org/mongo-driver v1.13.1 ) require ( - github.com/aws/aws-sdk-go-v2 v1.20.2 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.39 // indirect diff --git a/go.sum b/go.sum index d25534fb..4de8ecc6 100644 --- a/go.sum +++ b/go.sum @@ -151,12 +151,20 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/csrf v1.7.2 h1:oTUjx0vyf2T+wkrx09Trsev1TE+/EbDAeHtSTbtC2eI= +github.com/gorilla/csrf v1.7.2/go.mod h1:F1Fj3KG23WYHE6gozCmBAezKookxbIvUJT+121wTuLk= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= +github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= diff --git a/internal/adapters/entrypoints/rest/handlers/management_login.go b/internal/adapters/entrypoints/rest/handlers/management_login.go new file mode 100644 index 00000000..91ff161b --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/management_login.go @@ -0,0 +1,62 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "net/http" +) + +// NewManagementLoginHandler +// @Title Management Login +// @Description Authenticate to start a Management API session +// @Success 200 +// @Route /management/login [post] +func NewManagementLoginHandler(env environment.ManagementEnv, useCase *liquidity_provider.LoginUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + const errorMsg = "error closing old session" + err := useCase.Run() + if errors.Is(err, liquidity_provider.BadLoginError) { + jsonErr := rest.NewErrorResponse(err.Error(), false) + rest.JsonErrorResponse(w, http.StatusUnauthorized, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unexpected login error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + cookieStore, err := cookies.GetSessionCookieStore(env) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + err = cookies.CloseManagementSession(&cookies.CloseSessionArgs{ + Store: cookieStore, + Request: req, + Writer: w, + }) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + err = cookies.CreateManagementSession(&cookies.CreateSessionArgs{ + Store: cookieStore, + Env: env, + Request: req, + Writer: w, + }) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("session creation error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + rest.JsonResponse(w, http.StatusOK) + } +} diff --git a/internal/adapters/entrypoints/rest/handlers/management_logout.go b/internal/adapters/entrypoints/rest/handlers/management_logout.go new file mode 100644 index 00000000..319f7dac --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/management_logout.go @@ -0,0 +1,38 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "net/http" +) + +// NewManagementLogoutHandler +// @Title Management Logout +// @Description Logout from the Management API session +// @Success 204 +// @Route /management/logout [post] +func NewManagementLogoutHandler(env environment.ManagementEnv) http.HandlerFunc { + // this handler doesn't use a use case because it doesn't involve any business logic + return func(w http.ResponseWriter, req *http.Request) { + const errorMsg = "logout error" + store, err := cookies.GetSessionCookieStore(env) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + err = cookies.CloseManagementSession(&cookies.CloseSessionArgs{ + Store: store, + Request: req, + Writer: w, + }) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + rest.JsonResponse(w, http.StatusNoContent) + } +} diff --git a/internal/adapters/entrypoints/rest/middlewares/cors.go b/internal/adapters/entrypoints/rest/middlewares/cors.go index 68fcfd25..c636c9da 100644 --- a/internal/adapters/entrypoints/rest/middlewares/cors.go +++ b/internal/adapters/entrypoints/rest/middlewares/cors.go @@ -10,7 +10,7 @@ func NewCorsMiddleware() func(next http.Handler) http.Handler { headers.Add("Vary", "Origin") headers.Add("Vary", "Access-Control-Request-Method") headers.Add("Vary", "Access-Control-Request-Headers") - headers.Add("Access-Control-Allow-Headers", "Content-Type, Origin, Accept, token, X-Captcha-Token") + headers.Add("Access-Control-Allow-Headers", "Content-Type, Origin, Accept, token, X-Captcha-Token, X-Csrf-Token") headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS") next.ServeHTTP(w, r) }) diff --git a/internal/adapters/entrypoints/rest/middlewares/session.go b/internal/adapters/entrypoints/rest/middlewares/session.go new file mode 100644 index 00000000..85323987 --- /dev/null +++ b/internal/adapters/entrypoints/rest/middlewares/session.go @@ -0,0 +1,79 @@ +package middlewares + +import ( + "github.com/gorilla/csrf" + "github.com/gorilla/sessions" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + log "github.com/sirupsen/logrus" + "net/http" +) + +type SessionMiddlewares struct { + Csrf func(next http.Handler) http.Handler + SessionValidator func(next http.Handler) http.Handler +} + +func NewSessionMiddlewares(env environment.ManagementEnv, store sessions.Store) SessionMiddlewares { + csrfStep := csrfMiddleware(env) + sessionStep := sessionMiddleware(store) + return SessionMiddlewares{ + Csrf: csrfStep, + SessionValidator: sessionStep, + } +} + +// TODO remove after injecting token inside login template +func NewDummyCsrfTokenHandler(env environment.ManagementEnv) http.Handler { + csrfStep := csrfMiddleware(env) + return csrfStep(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Header().Set("X-Csrf-Token", csrf.Token(req)) + w.WriteHeader(http.StatusOK) + })) +} + +func sessionMiddleware(store sessions.Store) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + session, err := store.Get(r, cookies.ManagementSessionCookieName) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("session validation error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } else if session.IsNew { + jsonErr := rest.NewErrorResponse("session not recognized", true) + rest.JsonErrorResponse(w, http.StatusForbidden, jsonErr) + return + } + + next.ServeHTTP(w, r) + + if err = session.Save(r, w); err != nil { + log.Error("Error saving session: ", err) + } + }) + } +} + +func csrfMiddleware(env environment.ManagementEnv) func(next http.Handler) http.Handler { + authKey, err := utils.DecodeKey(env.SessionTokenAuthKey, cookies.KeysBytesLength) + if err != nil { + log.Fatalf("error decoding session token auth key: %v", err) + } + return csrf.Protect( + authKey, + csrf.MaxAge(cookies.SessionMaxSeconds), + csrf.CookieName("lps-csrf-cookie"), + csrf.Path("/"), + csrf.Secure(env.UseHttps), + csrf.HttpOnly(true), + csrf.SameSite(csrf.SameSiteStrictMode), + csrf.ErrorHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + details := rest.DetailsFromError(csrf.FailureReason(r)) + jsonErr := rest.NewErrorResponseWithDetails("CRSF token validation error", details, true) + rest.JsonErrorResponse(w, http.StatusForbidden, jsonErr) + })), + ) +} diff --git a/internal/adapters/entrypoints/rest/registry/registry.go b/internal/adapters/entrypoints/rest/registry/registry.go index 6e8032e4..7e55325d 100644 --- a/internal/adapters/entrypoints/rest/registry/registry.go +++ b/internal/adapters/entrypoints/rest/registry/registry.go @@ -28,4 +28,5 @@ type UseCaseRegistry interface { SetPegoutConfigUseCase() *liquidity_provider.SetPegoutConfigUseCase SetGeneralConfigUseCase() *liquidity_provider.SetGeneralConfigUseCase GetConfigurationUseCase() *liquidity_provider.GetConfigUseCase + LoginUseCase() *liquidity_provider.LoginUseCase } diff --git a/internal/adapters/entrypoints/rest/routes/management.go b/internal/adapters/entrypoints/rest/routes/management.go new file mode 100644 index 00000000..f2d34972 --- /dev/null +++ b/internal/adapters/entrypoints/rest/routes/management.go @@ -0,0 +1,86 @@ +package routes + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "net/http" +) + +const LOGIN_PATH = "/management/login" + +// nolint:funlen +func getManagementEndpoints(env environment.Environment, useCaseRegistry registry.UseCaseRegistry) []Endpoint { + return []Endpoint{ + { + Path: "/pegin/collateral", + Method: http.MethodGet, + Handler: handlers.NewGetPeginCollateralHandler(useCaseRegistry.GetPeginCollateralUseCase()), + }, + { + Path: "/pegin/addCollateral", + Method: http.MethodPost, + Handler: handlers.NewAddPeginCollateralHandler(useCaseRegistry.AddPeginCollateralUseCase()), + }, + { + Path: "/pegin/withdrawCollateral", + Method: http.MethodPost, + Handler: handlers.NewWithdrawPeginCollateralHandler(useCaseRegistry.WithdrawPeginCollateralUseCase()), + }, + { + Path: "/pegout/collateral", + Method: http.MethodGet, + Handler: handlers.NewGetPegoutCollateralHandler(useCaseRegistry.GetPegoutCollateralUseCase()), + }, + { + Path: "/pegout/addCollateral", + Method: http.MethodPost, + Handler: handlers.NewAddPegoutCollateralHandler(useCaseRegistry.AddPegoutCollateralUseCase()), + }, + { + Path: "/pegout/withdrawCollateral", + Method: http.MethodPost, + Handler: handlers.NewWithdrawPegoutCollateralHandler(useCaseRegistry.WithdrawPegoutCollateralUseCase()), + }, + { + Path: "/providers/changeStatus", + Method: http.MethodPost, + Handler: handlers.NewChangeStatusHandler(useCaseRegistry.ChangeStatusUseCase()), + }, + { + Path: "/providers/resignation", + Method: http.MethodPost, + Handler: handlers.NewResignationHandler(useCaseRegistry.ResignationUseCase()), + }, + { + Path: "/configuration", + Method: http.MethodPost, + Handler: handlers.NewSetGeneralConfigHandler(useCaseRegistry.SetGeneralConfigUseCase()), + }, + { + Path: "/configuration", + Method: http.MethodGet, + Handler: handlers.NewGetConfigurationHandler(useCaseRegistry.GetConfigurationUseCase()), + }, + { + Path: "/pegin/configuration", + Method: http.MethodPost, + Handler: handlers.NewSetPeginConfigHandler(useCaseRegistry.SetPeginConfigUseCase()), + }, + { + Path: "/pegout/configuration", + Method: http.MethodPost, + Handler: handlers.NewSetPegoutConfigHandler(useCaseRegistry.SetPegoutConfigUseCase()), + }, + { + Path: LOGIN_PATH, + Method: http.MethodPost, + Handler: handlers.NewManagementLoginHandler(env.Management, useCaseRegistry.LoginUseCase()), + }, + { + Path: "/management/logout", + Method: http.MethodPost, + Handler: handlers.NewManagementLogoutHandler(env.Management), + }, + } +} diff --git a/internal/adapters/entrypoints/rest/routes/public.go b/internal/adapters/entrypoints/rest/routes/public.go new file mode 100644 index 00000000..8b2501d7 --- /dev/null +++ b/internal/adapters/entrypoints/rest/routes/public.go @@ -0,0 +1,76 @@ +package routes + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" + "net/http" +) + +type PublicEndpoint struct { + Endpoint + RequiresCaptcha bool +} + +// nolint:funlen +func getPublicEndpoints(useCaseRegistry registry.UseCaseRegistry) []PublicEndpoint { + return []PublicEndpoint{ + { + Endpoint: Endpoint{ + Path: "/health", + Method: http.MethodGet, + Handler: handlers.NewHealthCheckHandler(useCaseRegistry.HealthUseCase()), + }, + }, + { + Endpoint: Endpoint{ + Path: "/getProviders", + Method: http.MethodGet, + Handler: handlers.NewGetProvidersHandler(useCaseRegistry.GetProvidersUseCase()), + }, + }, + { + Endpoint: Endpoint{ + Path: "/pegin/getQuote", + Method: http.MethodPost, + Handler: handlers.NewGetPeginQuoteHandler(useCaseRegistry.GetPeginQuoteUseCase()), + }, + }, + { + Endpoint: Endpoint{ + Path: "/pegin/acceptQuote", + Method: http.MethodPost, + Handler: handlers.NewAcceptPeginQuoteHandler(useCaseRegistry.GetAcceptPeginQuoteUseCase()), + }, + RequiresCaptcha: true, + }, + { + Endpoint: Endpoint{ + Path: "/pegout/getQuotes", + Method: http.MethodPost, + Handler: handlers.NewGetPegoutQuoteHandler(useCaseRegistry.GetPegoutQuoteUseCase()), + }, + }, + { + Endpoint: Endpoint{ + Path: "/pegout/acceptQuote", + Method: http.MethodPost, + Handler: handlers.NewAcceptPegoutQuoteHandler(useCaseRegistry.GetAcceptPegoutQuoteUseCase()), + }, + RequiresCaptcha: true, + }, + { + Endpoint: Endpoint{ + Path: "/userQuotes", + Method: http.MethodGet, + Handler: handlers.NewGetUserQuotesHandler(useCaseRegistry.GetUserDepositsUseCase()), + }, + }, + { + Endpoint: Endpoint{ + Path: "/providers/details", + Method: http.MethodGet, + Handler: handlers.NewProviderDetailsHandler(useCaseRegistry.GetProviderDetailUseCase()), + }, + }, + } +} diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go index 31e1a8f8..350fb9c4 100644 --- a/internal/adapters/entrypoints/rest/routes/routes.go +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -5,63 +5,77 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/middlewares" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" log "github.com/sirupsen/logrus" "net/http" ) +type Endpoint struct { + Path string + Method string + Handler http.Handler +} + func ConfigureRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { router.Use(middlewares.NewCorsMiddleware()) + + // TODO this handler is temporary, it is only to provide the CSRF token to the client, in further tasks, this + // token should be provided inside the login template + // --- + router.Path("/csrf").Methods(http.MethodGet). + Handler( + middlewares.NewDummyCsrfTokenHandler(env.Management), + ) + // --- + + registerPublicRoutes(router, env, useCaseRegistry) + + if env.Management.EnableManagementApi { + registerManagementRoutes(router, env, useCaseRegistry) + } + + router.Methods(http.MethodOptions).HandlerFunc(handlers.NewOptionsHandler()) +} + +func registerPublicRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { captchaMiddleware := middlewares.NewCaptchaMiddleware(env.Captcha.Url, env.Captcha.Threshold, env.Captcha.Disabled, env.Captcha.SecretKey) + for _, endpoint := range getPublicEndpoints(useCaseRegistry) { + handler := endpoint.Handler + if endpoint.RequiresCaptcha { + handler = useMiddlewares(endpoint.Handler, captchaMiddleware) + } + router.Path(endpoint.Path).Methods(endpoint.Method).Handler(handler) + } +} - router.Path("/health").Methods(http.MethodGet).HandlerFunc(handlers.NewHealthCheckHandler(useCaseRegistry.HealthUseCase())) - router.Path("/getProviders").Methods(http.MethodGet).HandlerFunc(handlers.NewGetProvidersHandler(useCaseRegistry.GetProvidersUseCase())) - router.Path("/pegin/getQuote").Methods(http.MethodPost).HandlerFunc(handlers.NewGetPeginQuoteHandler(useCaseRegistry.GetPeginQuoteUseCase())) - router.Path("/pegin/acceptQuote").Methods(http.MethodPost).Handler( - captchaMiddleware( - handlers.NewAcceptPeginQuoteHandler(useCaseRegistry.GetAcceptPeginQuoteUseCase()), - ), +func registerManagementRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { + log.Warn( + "Server is running with the management API exposed. This interface " + + "includes endpoints that must remain private at all cost. Please shut down " + + "the server if you haven't configured the WAF properly as explained in documentation.", ) - router.Path("/pegout/getQuotes").Methods(http.MethodPost).HandlerFunc(handlers.NewGetPegoutQuoteHandler(useCaseRegistry.GetPegoutQuoteUseCase())) - router.Path("/pegout/acceptQuote").Methods(http.MethodPost).Handler( - captchaMiddleware( - handlers.NewAcceptPegoutQuoteHandler(useCaseRegistry.GetAcceptPegoutQuoteUseCase()), - ), - ) - router.Path("/userQuotes").Methods(http.MethodGet).HandlerFunc(handlers.NewGetUserQuotesHandler(useCaseRegistry.GetUserDepositsUseCase())) - router.Path("/providers/details").Methods(http.MethodGet).HandlerFunc(handlers.NewProviderDetailsHandler(useCaseRegistry.GetProviderDetailUseCase())) - if env.EnableManagementApi { - log.Warn( - "Server is running with the management API exposed. This interface " + - "includes endpoints that must remain private at all cost. Please shut down " + - "the server if you haven't configured the WAF properly as explained in documentation.", - ) - router.Path("/pegin/collateral").Methods(http.MethodGet). - HandlerFunc(handlers.NewGetPeginCollateralHandler(useCaseRegistry.GetPeginCollateralUseCase())) - router.Path("/pegin/addCollateral").Methods(http.MethodPost). - HandlerFunc(handlers.NewAddPeginCollateralHandler(useCaseRegistry.AddPeginCollateralUseCase())) - router.Path("/pegin/withdrawCollateral").Methods(http.MethodPost). - HandlerFunc(handlers.NewWithdrawPeginCollateralHandler(useCaseRegistry.WithdrawPeginCollateralUseCase())) - router.Path("/pegout/collateral").Methods(http.MethodGet). - HandlerFunc(handlers.NewGetPegoutCollateralHandler(useCaseRegistry.GetPegoutCollateralUseCase())) - router.Path("/pegout/addCollateral").Methods(http.MethodPost). - HandlerFunc(handlers.NewAddPegoutCollateralHandler(useCaseRegistry.AddPegoutCollateralUseCase())) - router.Path("/pegout/withdrawCollateral").Methods(http.MethodPost). - HandlerFunc(handlers.NewWithdrawPegoutCollateralHandler(useCaseRegistry.WithdrawPegoutCollateralUseCase())) - router.Path("/providers/changeStatus").Methods(http.MethodPost). - HandlerFunc(handlers.NewChangeStatusHandler(useCaseRegistry.ChangeStatusUseCase())) - router.Path("/providers/resignation").Methods(http.MethodPost). - HandlerFunc(handlers.NewResignationHandler(useCaseRegistry.ResignationUseCase())) - router.Path("/configuration").Methods(http.MethodPost). - HandlerFunc(handlers.NewSetGeneralConfigHandler(useCaseRegistry.SetGeneralConfigUseCase())) - router.Path("/configuration").Methods(http.MethodGet). - HandlerFunc(handlers.NewGetConfigurationHandler(useCaseRegistry.GetConfigurationUseCase())) - router.Path("/pegin/configuration").Methods(http.MethodPost). - HandlerFunc(handlers.NewSetPeginConfigHandler(useCaseRegistry.SetPeginConfigUseCase())) - router.Path("/pegout/configuration").Methods(http.MethodPost). - HandlerFunc(handlers.NewSetPegoutConfigHandler(useCaseRegistry.SetPegoutConfigUseCase())) + store, err := cookies.GetSessionCookieStore(env.Management) + if err != nil { + log.Fatal("Error registering management routes: ", err) } + sessionMiddlewares := middlewares.NewSessionMiddlewares(env.Management, store) + managementEndpoints := getManagementEndpoints(env, useCaseRegistry) + var handler http.Handler + for _, endpoint := range managementEndpoints { + if endpoint.Path == LOGIN_PATH { + handler = useMiddlewares(endpoint.Handler, sessionMiddlewares.Csrf) + } else { + handler = useMiddlewares(endpoint.Handler, sessionMiddlewares.SessionValidator, sessionMiddlewares.Csrf) + } + router.Path(endpoint.Path).Methods(endpoint.Method).Handler(handler) + } +} - router.Methods(http.MethodOptions).HandlerFunc(handlers.NewOptionsHandler()) +func useMiddlewares(handler http.Handler, middlewares ...func(http.Handler) http.Handler) http.Handler { + for _, middleware := range middlewares { + handler = middleware(handler) + } + return handler } diff --git a/internal/adapters/entrypoints/rest/server/cookies/cookies.go b/internal/adapters/entrypoints/rest/server/cookies/cookies.go new file mode 100644 index 00000000..74d1e368 --- /dev/null +++ b/internal/adapters/entrypoints/rest/server/cookies/cookies.go @@ -0,0 +1,78 @@ +package cookies + +import ( + "errors" + "fmt" + "github.com/gorilla/sessions" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "net/http" + "sync" +) + +const ( + ManagementSessionCookieName = "lp-session" + KeysBytesLength = 32 + SessionMaxSeconds = 60 * 30 +) + +var storeOnce sync.Once +var cookieStore sessions.Store + +func GetSessionCookieStore(env environment.ManagementEnv) (sessions.Store, error) { + var authKey, encryptionKey []byte + var err error + if cookieStore != nil { + return cookieStore, nil + } + + storeOnce.Do(func() { + authKey, err = utils.DecodeKey(env.SessionAuthKey, KeysBytesLength) + if err != nil { + err = fmt.Errorf("error decoding session auth key: %w", err) + return + } + encryptionKey, err = utils.DecodeKey(env.SessionEncryptionKey, KeysBytesLength) + if err != nil { + err = fmt.Errorf("error decoding session encryption key: %w", err) + return + } + cookieStore = NewUniqueSessionStore(ManagementSessionCookieName, authKey, encryptionKey) + }) + return cookieStore, err +} + +type CreateSessionArgs struct { + Store sessions.Store + Env environment.ManagementEnv + Request *http.Request + Writer http.ResponseWriter +} + +func CreateManagementSession(args *CreateSessionArgs) error { + session, err := args.Store.Get(args.Request, ManagementSessionCookieName) + if err != nil { + return err + } + session.Options.Domain = args.Request.URL.Host + session.Options.MaxAge = SessionMaxSeconds + session.Options.Path = "/" + session.Options.Secure = args.Env.UseHttps + session.Options.HttpOnly = true + session.Options.SameSite = http.SameSiteStrictMode + return session.Save(args.Request, args.Writer) +} + +type CloseSessionArgs struct { + Store sessions.Store + Request *http.Request + Writer http.ResponseWriter +} + +func CloseManagementSession(args *CloseSessionArgs) error { + store, ok := args.Store.(*UniqueSessionStore) + if !ok { + return errors.New("closing a unique session is only supported by UniqueSessionStore") + } + return store.CloseUniqueSession(args.Request, args.Writer) +} diff --git a/internal/adapters/entrypoints/rest/server/cookies/store.go b/internal/adapters/entrypoints/rest/server/cookies/store.go new file mode 100644 index 00000000..40eda7f4 --- /dev/null +++ b/internal/adapters/entrypoints/rest/server/cookies/store.go @@ -0,0 +1,118 @@ +package cookies + +import ( + "encoding/hex" + "errors" + "fmt" + "github.com/gorilla/securecookie" + "github.com/gorilla/sessions" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "net/http" + "sync" +) + +// UniqueSessionStore is a custom implementation of the sessions.Store interface. The rationale to implement this is that +// existing implementations don't provide any way to prevent concurrent logins and the LPS management session should be unique +type UniqueSessionStore struct { + sessions.CookieStore + session *sessions.Session + name string + sessionMutex *sync.Mutex +} + +func NewUniqueSessionStore(uniqueSessionName string, keyPairs ...[]byte) *UniqueSessionStore { + store := &UniqueSessionStore{ + CookieStore: *sessions.NewCookieStore(keyPairs...), + name: uniqueSessionName, + sessionMutex: &sync.Mutex{}, + } + return store +} + +func (s *UniqueSessionStore) Get(r *http.Request, name string) (*sessions.Session, error) { + return sessions.GetRegistry(r).Get(s, name) +} + +func (s *UniqueSessionStore) New(r *http.Request, name string) (*sessions.Session, error) { + if name != s.name { + return s.dummySession(name), fmt.Errorf("UniqueSessionStore is expecting %s session name and received %s", s.name, name) + } + + if s.session != nil { + return s.getExistingSession(r, name) + } + + session := sessions.NewSession(s, name) + opts := *s.Options + session.Options = &opts + session.IsNew = true + return session, nil +} + +func (s *UniqueSessionStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { + const idSize = 32 + s.sessionMutex.Lock() + defer s.sessionMutex.Unlock() + // Delete if max-age is <= 0 + if session.Options.MaxAge <= 0 { + s.session = nil + http.SetCookie(w, sessions.NewCookie(session.Name(), "", session.Options)) + return nil + } + + if session.ID == "" { + idBytes, err := utils.GetRandomBytes(idSize) + if err != nil { + return err + } + session.ID = hex.EncodeToString(idBytes) + } + + s.session = session + encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) + if err != nil { + return err + } + http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) + return nil +} + +func (s *UniqueSessionStore) CloseUniqueSession(r *http.Request, w http.ResponseWriter) error { + if s.session == nil { + return nil + } + s.session.Options.MaxAge = -1 + if err := s.session.Save(r, w); err != nil { + return err + } + return nil +} + +func (s *UniqueSessionStore) getExistingSession(r *http.Request, name string) (*sessions.Session, error) { + var err error + var cookie *http.Cookie + var sessionId string + + cookie, err = r.Cookie(name) + if err != nil { + return s.dummySession(name), err + } + + err = securecookie.DecodeMulti(name, cookie.Value, &sessionId, s.Codecs...) + if err != nil { + return s.dummySession(name), err + } + if sessionId == s.session.ID { + s.session.IsNew = false + return s.session, nil + } else { + return s.dummySession(name), errors.New("session not recognized") + } +} + +// dummySession some parts of the gorilla sessions library expect a session even if an error is returned from a function +// such is the case of New function of sessions.Store interface. In order to maintain compatibility with the API and avoid +// nil pointer errors, this function should be used only to return a dummy session together with an error +func (s *UniqueSessionStore) dummySession(name string) *sessions.Session { + return sessions.NewSession(s, name) +} diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index 84298ed2..d19b9a5b 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -7,19 +7,19 @@ import ( ) type Environment struct { - LpsStage string `env:"LPS_STAGE" validate:"required,oneof=regtest testnet mainnet"` - Port uint `env:"SERVER_PORT" validate:"required"` - LogLevel string `env:"LOG_LEVEL" validate:"required"` - LogFile string `env:"LOG_FILE"` - EnableManagementApi bool `env:"ENABLE_MANAGEMENT_API"` - AwsLocalEndpoint string `env:"AWS_LOCAL_ENDPOINT"` - Mongo MongoEnv - Rsk RskEnv - Btc BtcEnv - Provider ProviderEnv - Pegin PeginEnv - Pegout PegoutEnv - Captcha CaptchaEnv + LpsStage string `env:"LPS_STAGE" validate:"required,oneof=regtest testnet mainnet"` + Port uint `env:"SERVER_PORT" validate:"required"` + LogLevel string `env:"LOG_LEVEL" validate:"required"` + LogFile string `env:"LOG_FILE"` + AwsLocalEndpoint string `env:"AWS_LOCAL_ENDPOINT"` + Management ManagementEnv + Mongo MongoEnv + Rsk RskEnv + Btc BtcEnv + Provider ProviderEnv + Pegin PeginEnv + Pegout PegoutEnv + Captcha CaptchaEnv } type MongoEnv struct { @@ -77,6 +77,14 @@ type CaptchaEnv struct { Url string `env:"CAPTCHA_URL"` } +type ManagementEnv struct { + EnableManagementApi bool `env:"ENABLE_MANAGEMENT_API"` + SessionAuthKey string `env:"MANAGEMENT_AUTH_KEY"` + SessionEncryptionKey string `env:"MANAGEMENT_ENCRYPTION_KEY"` + SessionTokenAuthKey string `env:"MANAGEMENT_TOKEN_AUTH_KEY"` + UseHttps bool `env:"MANAGEMENT_USE_HTTPS"` +} + func LoadEnv() *Environment { validate := validator.New(validator.WithRequiredStructEnabled()) env := &Environment{} diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 1f341306..5dbd382b 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -47,6 +47,7 @@ type UseCaseRegistry struct { setPegoutConfigUseCase *liquidity_provider.SetPegoutConfigUseCase setGeneralConfigUseCase *liquidity_provider.SetGeneralConfigUseCase getConfigurationUseCase *liquidity_provider.GetConfigUseCase + loginUseCase *liquidity_provider.LoginUseCase } // NewUseCaseRegistry @@ -191,6 +192,7 @@ func NewUseCaseRegistry( crypto.Keccak256, ), getConfigurationUseCase: liquidity_provider.NewGetConfigUseCase(liquidityProvider, liquidityProvider, liquidityProvider), + loginUseCase: liquidity_provider.NewLoginUseCase(), } } @@ -277,3 +279,7 @@ func (registry *UseCaseRegistry) SetGeneralConfigUseCase() *liquidity_provider.S func (registry *UseCaseRegistry) GetConfigurationUseCase() *liquidity_provider.GetConfigUseCase { return registry.getConfigurationUseCase } + +func (registry *UseCaseRegistry) LoginUseCase() *liquidity_provider.LoginUseCase { + return registry.loginUseCase +} diff --git a/internal/entities/utils/encoding.go b/internal/entities/utils/encoding.go new file mode 100644 index 00000000..3a329677 --- /dev/null +++ b/internal/entities/utils/encoding.go @@ -0,0 +1,18 @@ +package utils + +import ( + "encoding/hex" + "fmt" +) + +func DecodeKey(key string, expectedBytes int) ([]byte, error) { + var err error + var bytes []byte + if bytes, err = hex.DecodeString(key); err != nil { + return nil, fmt.Errorf("error decoding key: %w", err) + } + if len(bytes) != expectedBytes { + return nil, fmt.Errorf("key length is not %d bytes, %s is %d bytes long", expectedBytes, key, len(bytes)) + } + return bytes, nil +} diff --git a/internal/entities/utils/encoding_test.go b/internal/entities/utils/encoding_test.go new file mode 100644 index 00000000..cebcd92f --- /dev/null +++ b/internal/entities/utils/encoding_test.go @@ -0,0 +1,67 @@ +package utils_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/require" + "testing" +) + +func TestDecodeKey(t *testing.T) { + type params struct { + key string + bytes int + } + cases := test.Table[params, []byte]{ + { + Value: params{key: "1234567890abcdef", bytes: 8}, + Result: []byte{18, 52, 86, 120, 144, 171, 205, 239}, + }, + { + Value: params{key: "a2fbac02d66202e8468d2a4f1deba4fa5c2491f592e0e22e32fe1e6acac25923", bytes: 32}, + Result: []byte{0xa2, 0xfb, 0xac, 0x2, 0xd6, 0x62, 0x2, 0xe8, 0x46, 0x8d, 0x2a, 0x4f, 0x1d, 0xeb, 0xa4, 0xfa, 0x5c, 0x24, 0x91, 0xf5, 0x92, 0xe0, 0xe2, 0x2e, 0x32, 0xfe, 0x1e, 0x6a, 0xca, 0xc2, 0x59, 0x23}, + }, + { + Value: params{key: "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", bytes: 32}, + Result: []byte{0x9f, 0x86, 0xd0, 0x81, 0x88, 0x4c, 0x7d, 0x65, 0x9a, 0x2f, 0xea, 0xa0, 0xc5, 0x5a, 0xd0, 0x15, 0xa3, 0xbf, 0x4f, 0x1b, 0x2b, 0xb, 0x82, 0x2c, 0xd1, 0x5d, 0x6c, 0x15, 0xb0, 0xf0, 0xa, 0x8}, + }, + { + Value: params{key: "c5ff177a86e82441f93e3772da700d5f6838157fa1bfdc0bb689d7f7e55e7aba", bytes: 32}, + Result: []byte{0xc5, 0xff, 0x17, 0x7a, 0x86, 0xe8, 0x24, 0x41, 0xf9, 0x3e, 0x37, 0x72, 0xda, 0x70, 0xd, 0x5f, 0x68, 0x38, 0x15, 0x7f, 0xa1, 0xbf, 0xdc, 0xb, 0xb6, 0x89, 0xd7, 0xf7, 0xe5, 0x5e, 0x7a, 0xba}, + }, + { + Value: params{key: "ab5c2d1f", bytes: 4}, + Result: []byte{0xab, 0x5c, 0x2d, 0x1f}, + }, + } + test.RunTable(t, cases, func(p params) []byte { + result, err := utils.DecodeKey(p.key, p.bytes) + require.NoError(t, err) + return result + }) +} + +func TestDecodeKey_SizeError(t *testing.T) { + sizes := []int{4, 8, 12, 24, 32} + key := "1122abcdff1122abcdff" + for _, size := range sizes { + result, err := utils.DecodeKey(key, size) + require.Error(t, err) + require.Nil(t, result) + require.Errorf(t, err, "key length is not %d bytes, %s is %d bytes long", size, key, 10) + } +} + +func TestDecodeKey_DecodingError(t *testing.T) { + cases := []string{ + "no hex", + "abcde", + "17", + "g8ab11", + } + for _, key := range cases { + result, err := utils.DecodeKey(key, 8) + require.Error(t, err) + require.Nil(t, result) + } +} diff --git a/internal/entities/utils/random.go b/internal/entities/utils/random.go new file mode 100644 index 00000000..8c121a6c --- /dev/null +++ b/internal/entities/utils/random.go @@ -0,0 +1,25 @@ +package utils + +import ( + "crypto/rand" + "math" + "math/big" +) + +func GetRandomInt() (int64, error) { + random, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt)) + if err != nil { + return 0, err + } + return random.Int64(), nil +} + +func GetRandomBytes(numberOfBytes int64) ([]byte, error) { + random := make([]byte, numberOfBytes) + + _, err := rand.Read(random) + if err != nil { + return nil, err + } + return random, nil +} diff --git a/internal/entities/utils/random_test.go b/internal/entities/utils/random_test.go new file mode 100644 index 00000000..2faec6c0 --- /dev/null +++ b/internal/entities/utils/random_test.go @@ -0,0 +1,45 @@ +package utils_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "slices" + "testing" +) + +func TestGetRandomInt(t *testing.T) { + var numbers []int64 + var number int64 + var err error + for i := 0; i < 100; i++ { + number, err = utils.GetRandomInt() + assert.Positive(t, number) + assert.False(t, slices.Contains(numbers, number)) + require.NoError(t, err) + numbers = append(numbers, number) + } +} + +func TestGetRandomBytes_Size(t *testing.T) { + sizes := []int64{1, 2, 4, 8, 16, 32, 64, 128, 256, 512} + for _, size := range sizes { + bytes, err := utils.GetRandomBytes(size) + require.NoError(t, err) + require.Len(t, bytes, int(size)) + } +} + +func TestGetRandomBytes_Random(t *testing.T) { + const size = 32 + var generatedBytes [][]byte + for i := 0; i < 100; i++ { + bytes, err := utils.GetRandomBytes(size) + require.NoError(t, err) + require.Len(t, bytes, size) + for _, generated := range generatedBytes { + assert.NotEqual(t, generated, bytes) + } + generatedBytes = append(generatedBytes, bytes) + } +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go index c5922e17..e2b73694 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -2,7 +2,6 @@ package usecases import ( "context" - "crypto/rand" "encoding/hex" "encoding/json" "errors" @@ -10,7 +9,6 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" - "math" "math/big" ) @@ -142,14 +140,6 @@ func ValidateMinLockValue(useCase UseCaseId, bridge blockchain.RootstockBridge, return nil } -func GetRandomInt() (int64, error) { - random, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt)) - if err != nil { - return 0, err - } - return random.Int64(), nil -} - func SignConfiguration[C liquidity_provider.ConfigurationType]( useCaseId UseCaseId, signer entities.Signer, diff --git a/internal/usecases/common_test.go b/internal/usecases/common_test.go index 6b1ca1f6..d661d2ef 100644 --- a/internal/usecases/common_test.go +++ b/internal/usecases/common_test.go @@ -13,7 +13,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "slices" "testing" ) @@ -96,19 +95,6 @@ func TestCalculateDaoAmounts_Fail(t *testing.T) { require.Error(t, err) } -func TestGetRandomInt(t *testing.T) { - var numbers []int64 - var number int64 - var err error - for i := 0; i < 100; i++ { - number, err = u.GetRandomInt() - assert.Positive(t, number) - assert.False(t, slices.Contains(numbers, number)) - require.NoError(t, err) - numbers = append(numbers, number) - } -} - func TestValidateMinLockValue(t *testing.T) { var oneBtcInSatoshi uint64 = 1 * bitcoin.BtcToSatoshi var useCase u.UseCaseId = "anyUseCase" diff --git a/internal/usecases/liquidity_provider/login.go b/internal/usecases/liquidity_provider/login.go new file mode 100644 index 00000000..5977c121 --- /dev/null +++ b/internal/usecases/liquidity_provider/login.go @@ -0,0 +1,16 @@ +package liquidity_provider + +import "errors" + +var BadLoginError = errors.New("incorrect username or credentials") + +type LoginUseCase struct{} + +func NewLoginUseCase() *LoginUseCase { + return &LoginUseCase{} +} + +func (useCase *LoginUseCase) Run() error { + // TODO add here the logic to login when implementing the login task + return nil +} diff --git a/internal/usecases/pegin/get_pegin_quote.go b/internal/usecases/pegin/get_pegin_quote.go index 8853d196..72ae38e1 100644 --- a/internal/usecases/pegin/get_pegin_quote.go +++ b/internal/usecases/pegin/get_pegin_quote.go @@ -7,6 +7,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "time" ) @@ -154,7 +155,7 @@ func (useCase *GetQuoteUseCase) buildPeginQuote( var err error var nonce int64 - if nonce, err = usecases.GetRandomInt(); err != nil { + if nonce, err = utils.GetRandomInt(); err != nil { return quote.PeginQuote{}, usecases.WrapUseCaseError(usecases.GetPeginQuoteId, err) } diff --git a/internal/usecases/pegout/get_pegout_quote.go b/internal/usecases/pegout/get_pegout_quote.go index e8aa2f34..33ac621a 100644 --- a/internal/usecases/pegout/get_pegout_quote.go +++ b/internal/usecases/pegout/get_pegout_quote.go @@ -6,6 +6,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "strings" "time" @@ -149,7 +150,7 @@ func (useCase *GetQuoteUseCase) buildPegoutQuote( var nonce int64 var blockNumber uint64 - if nonce, err = usecases.GetRandomInt(); err != nil { + if nonce, err = utils.GetRandomInt(); err != nil { return quote.PegoutQuote{}, usecases.WrapUseCaseError(usecases.GetPegoutQuoteId, err) } diff --git a/sample-config.env b/sample-config.env index a3a4ddd7..cc68dbad 100755 --- a/sample-config.env +++ b/sample-config.env @@ -3,7 +3,6 @@ LPS_STAGE=regtest SERVER_PORT=8080 LOG_LEVEL=debug LOG_FILE=/home/lps/logs/lps.log -ENABLE_MANAGEMENT_API=false AWS_LOCAL_ENDPOINT=http://localstack:4566 # MongoDB config @@ -52,6 +51,13 @@ CAPTCHA_THRESHOLD=0.8 DISABLE_CAPTCHA=true CAPTCHA_URL="https://www.google.com/recaptcha/api/siteverify" +# Management api env +ENABLE_MANAGEMENT_API=false +MANAGEMENT_AUTH_KEY=a2fbac02d66202e8468d2a4f1deba4fa5c2491f592e0e22e32fe1e6acac25923 +MANAGEMENT_ENCRYPTION_KEY=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 +MANAGEMENT_TOKEN_AUTH_KEY=c5ff177a86e82441f93e3772da700d5f6838157fa1bfdc0bb689d7f7e55e7aba +MANAGEMENT_USE_HTTPS=false + # Aws env AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test From 5c997e8f12e55fdfb3fdb27a3750c0bfe9b793c7 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 11 Apr 2024 10:56:22 +0200 Subject: [PATCH 041/113] feat: add credentials handling to management api --- .mockery.yaml | 8 +- Makefile | 26 +- OpenApi.yml | 21 + cmd/application/lps/application.go | 5 + coverage/cover.out | 3572 +++++++++++------ .../database/mongo/liquidity_provider.go | 56 +- internal/adapters/dataproviders/event.go | 4 +- .../entrypoints/rest/handlers/common.go | 30 + .../rest/handlers/management_login.go | 36 +- .../rest/handlers/management_logout.go | 20 +- .../rest/handlers/set_credentials.go | 52 + .../entrypoints/rest/registry/registry.go | 2 + .../entrypoints/rest/routes/management.go | 5 + internal/configuration/registry/usecase.go | 30 +- .../liquidity_provider/configuration.go | 9 +- .../liquidity_provider/liquidity_provider.go | 16 + internal/entities/utils/hashing.go | 44 + internal/entities/utils/hashing_test.go | 144 + internal/entities/utils/passwords.go | 89 + internal/entities/utils/passwords_test.go | 168 + internal/usecases/common.go | 3 + .../usecases/liquidity_provider/common.go | 103 + .../liquidity_provider/common_test.go | 208 + .../generate_default_credentials.go | 55 + .../generate_default_credentials_test.go | 92 + internal/usecases/liquidity_provider/login.go | 45 +- .../usecases/liquidity_provider/login_test.go | 108 + .../liquidity_provider/set_credentials.go | 86 + .../set_credentials_test.go | 234 ++ .../set_general_config_test.go | 10 +- .../set_pegin_config_test.go | 10 +- .../set_pegout_config_test.go | 10 +- pkg/liquidity_provider.go | 12 + test/mocks/default_password_provider_mock.go | 209 + test/mocks/event_bus_mock.go | 9 + .../liquidity_provider_repository_mock.go | 464 ++- test/mocks/rpc_client_mock.go | 2 +- test/mocks/ses_client_mock.go | 2 +- test/utils.go | 1 + 39 files changed, 4674 insertions(+), 1326 deletions(-) create mode 100644 internal/adapters/entrypoints/rest/handlers/common.go create mode 100644 internal/adapters/entrypoints/rest/handlers/set_credentials.go create mode 100644 internal/entities/utils/hashing.go create mode 100644 internal/entities/utils/hashing_test.go create mode 100644 internal/entities/utils/passwords.go create mode 100644 internal/entities/utils/passwords_test.go create mode 100644 internal/usecases/liquidity_provider/generate_default_credentials.go create mode 100644 internal/usecases/liquidity_provider/generate_default_credentials_test.go create mode 100644 internal/usecases/liquidity_provider/login_test.go create mode 100644 internal/usecases/liquidity_provider/set_credentials.go create mode 100644 internal/usecases/liquidity_provider/set_credentials_test.go create mode 100644 test/mocks/default_password_provider_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index 6b2b572c..b449b06f 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -9,4 +9,10 @@ packages: sesClient: github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin: interfaces: - rpcClient: \ No newline at end of file + rpcClient: + github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider: + interfaces: + DefaultPasswordProvider: + github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider: + interfaces: + LiquidityProviderRepository: \ No newline at end of file diff --git a/Makefile b/Makefile index 4b0c2607..3c5f2917 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,10 @@ .PHONY: test +COVER_FILE = coverage/cover.out +TEMPORAL_COVER_FILE =$(shell pwd)/coverage/cover.out.temp + +filter_coverage_file = grep -v "internal/adapters/dataproviders/rootstock/bindings" $(1) > coverage/temp.txt && mv coverage/temp.txt $(1) + tools: download go install github.com/parvez3019/go-swagger3@latest go install golang.org/x/vuln/cmd/govulncheck@latest @@ -38,20 +43,23 @@ api: coverage: clean mkdir -p coverage - go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out.temp ./pkg/... ./internal/... ./cmd/... - go tool cover -func "coverage/cover.out.temp" - go tool cover -html="coverage/cover.out.temp" - rm coverage/cover.out.temp + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=$(TEMPORAL_COVER_FILE) ./pkg/... ./internal/... ./cmd/... + $(call filter_coverage_file, $(TEMPORAL_COVER_FILE)) + go tool cover -func "$(TEMPORAL_COVER_FILE)" + go tool cover -html="$(TEMPORAL_COVER_FILE)" + rm $(TEMPORAL_COVER_FILE) coverage-report: clean mkdir -p coverage - go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out ./pkg/... ./internal/... ./cmd/... + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=$(COVER_FILE) ./pkg/... ./internal/... ./cmd/... + $(call filter_coverage_file, $(COVER_FILE)) test: clean mkdir -p coverage - go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=coverage/cover.out.temp ./pkg/... ./internal/... ./cmd/... - go tool cover -func "coverage/cover.out.temp" - rm coverage/cover.out.temp + go test -v -race -covermode=atomic -coverpkg=./pkg/...,./internal/...,./cmd/... -coverprofile=$(TEMPORAL_COVER_FILE) ./pkg/... ./internal/... ./cmd/... + $(call filter_coverage_file, $(TEMPORAL_COVER_FILE)) + go tool cover -func $(TEMPORAL_COVER_FILE) + rm $(TEMPORAL_COVER_FILE) clean: - rm -rf build coverage/cover.out.temp + rm -rf build $(TEMPORAL_COVER_FILE) diff --git a/OpenApi.yml b/OpenApi.yml index 7d9d268e..df8576b2 100644 --- a/OpenApi.yml +++ b/OpenApi.yml @@ -556,6 +556,27 @@ paths: $ref: '#/components/schemas/HealthResponse' description: "" summary: Health + /management/credentials: + post: + description: ' Set new credentials to log into the Management API' + responses: + "200": + description: "" + summary: Set Login Credentials + /management/login: + post: + description: ' Authenticate to start a Management API session' + responses: + "200": + description: "" + summary: Management Login + /management/logout: + post: + description: ' Logout from the Management API session' + responses: + "204": + description: "" + summary: Management Logout /pegin/acceptQuote: post: description: ' Accepts Quote' diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 2f1ec375..98feeb74 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -105,6 +105,11 @@ func (app *Application) Run(env environment.Environment, logLevel log.Level) { log.Info("Provider registered with ID ", id) } + err = app.useCaseRegistry.GenerateDefaultCredentialsUseCase().Run(context.Background(), os.TempDir()) + if err != nil { + log.Fatal("Error generating default password for management interface: ", err) + } + watchers, err := app.prepareWatchers() if err != nil { log.Fatal("Error initializing watchers: ", err) diff --git a/coverage/cover.out b/coverage/cover.out index fde60379..a6f86f2b 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -63,35 +63,35 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/roots github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 @@ -117,6 +117,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -126,87 +138,661 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 128 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 63 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 62 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 192 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 38 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 2060 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 8190 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 4134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 2474 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 29 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 90 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 46 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 29 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 90 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 @@ -421,35 +1007,35 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/roots github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 @@ -475,6 +1061,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -484,36 +1082,63 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 @@ -533,17 +1158,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -561,285 +1186,56 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 17 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 75 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 128 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 63 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 62 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 20 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 192 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 38 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 2060 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 8190 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 4134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 2474 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 23 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 74 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 71 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 46 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 @@ -865,6 +1261,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -874,13 +1282,40 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -888,20 +1323,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -919,325 +1354,65 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 110 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 110 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 128 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 321 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 112 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 @@ -1254,6 +1429,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -1263,321 +1450,63 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.132,16.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:18.63,23.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:23.16,25.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.78 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.78,29.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:30.2,30.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:37.26,45.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:47.70,49.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:49.16,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:53.2,54.47 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:54.47,60.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:60.17,62.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.8,63.23 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.23,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:67.2,68.47 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:68.47,74.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:74.17,76.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.8,77.23 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.23,79.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:81.2,81.12 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:14.19,18.53 3 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:18.53,20.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:22.2,25.65 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:25.65,27.4 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:29.2,29.12 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:29.12,31.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:32.2,32.33 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.85,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.71 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.71,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:9.38,11.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:13.42,16.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.2,28.31 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.31,30.109 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:30.109,32.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:34.2,34.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:25.21,33.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:41.90,62.54 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:62.54,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.8,64.68 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.68,66.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.8,66.69 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.69,68.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:70.2,70.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.132,18.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:36.102,43.54 6 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:43.54,45.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.2,47.63 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.63,49.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.2,50.65 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.65,52.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.2,54.61 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.61,56.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:58.2,60.54 3 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:60.54,62.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.8,62.23 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.23,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:66.2,68.54 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:68.54,70.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.8,70.23 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.23,72.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:74.2,75.53 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:78.149,82.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.87 3 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.87,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.107 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.107,93.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.114 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.114,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:97.2,101.8 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.116 3 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.116,109.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.118 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.118,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:115.2,118.8 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:121.139,125.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.85 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.85,132.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:132.8,134.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:137.104,139.55 2 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:139.55,141.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.8,141.35 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.35,143.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:144.2,144.12 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:151.17,153.130 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:153.130,155.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.138 3 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.138,160.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:160.8,162.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:169.17,171.133 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:171.133,173.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.145 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.145,178.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:178.8,180.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.120,16.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:18.43,22.16 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.62 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.62,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:29.2,29.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:29.2,30.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:30.16,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:20.26,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:24.116,26.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:29.2,30.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:30.16,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:20.27,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:24.118,26.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 67 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 67 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 @@ -1835,35 +1764,35 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/roots github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 19 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 19 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 @@ -1889,6 +1818,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -1898,36 +1839,63 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 39 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 29 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 39 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 29 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 @@ -2149,20 +2117,1013 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 21 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 65 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 31 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 34 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 31 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 33 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 47 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 31 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 106 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 68 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 38 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 115 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 115 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:22.43,23.30 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:23.30,27.31 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:27.31,30.4 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:32.2,32.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.80,40.38 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:40.38,43.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:44.2,46.21 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:49.62,50.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:50.35,51.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.38,53.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:55.2,56.34 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:59.57,63.9 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:63.9,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.2,66.37 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.37,68.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:37.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:49.55,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:53.55,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:57.79,61.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:65.2,68.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:71.2,72.48 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:75.114,79.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:82.2,86.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.2,89.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.39,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:92.2,94.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:94.52,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:96.8,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:104.113,109.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:112.2,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:116.2,119.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:119.16,121.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.2,122.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.39,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:125.2,127.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:127.52,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:129.8,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:138.117,139.135 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.135,141.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.2,142.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:145.2,145.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:148.115,149.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.133,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:155.2,155.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:158.113,159.131 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.131,161.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.2,162.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:165.2,165.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:172.32,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:174.16,177.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.2,178.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.26,181.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.2,182.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.70,185.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.2,186.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.70,189.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:190.2,190.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:36.30,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:48.50,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:52.62,54.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:54.41,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:59.77,61.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:61.51,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:64.2,64.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:68.2,68.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:71.135,76.71 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.71,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:79.2,80.57 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:80.57,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:83.2,83.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:87.2,87.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:87.31,88.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:88.93,90.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:91.8,92.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.95,94.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:97.2,98.104 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:98.104,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:101.2,104.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.66,109.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:111.87,118.52 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:118.52,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.2,126.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:126.37,127.49 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.49,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:130.3,130.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:130.17,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:133.3,133.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:136.2,136.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:136.57,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,139.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.16,141.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.53,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:146.2,146.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:150.2,150.65 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:150.65,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:153.2,153.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:157.2,165.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:168.99,178.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:33.56,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:37.45,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:41.54,45.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:47.63,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:52.2,52.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.70,62.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:62.39,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:65.2,66.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:69.57,72.39 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:72.39,74.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.17,76.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:77.3,77.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:79.2,79.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.125,88.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:88.16,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:91.2,92.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.15,94.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.20,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.9,98.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.2,100.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:13.103,18.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:18.65,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:20.8,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:24.2,24.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:27.129,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:37.2,37.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:40.130,42.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:46.2,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:47.16,49.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:49.17,51.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:53.3,54.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:54.17,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:58.2,58.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:61.101,65.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:68.2,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:68.17,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:72.2,73.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:77.2,78.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:81.101,84.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:84.41,86.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:86.17,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:89.3,89.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:92.2,93.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:96.110,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:102.2,103.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:106.2,106.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:106.68,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:110.2,110.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:113.113,115.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:115.16,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:119.2,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:123.2,127.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:137.2,140.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:140.16,142.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:143.2,150.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:153.87,157.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:161.2,161.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:161.17,163.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:170.2,171.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:174.101,179.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:179.41,181.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:181.17,183.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:184.3,184.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:187.2,188.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:191.84,199.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:202.37,203.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:204.9,205.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:206.9,207.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:208.9,209.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:210.9,211.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:222.10,223.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:224.10,225.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:226.10,227.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:228.10,229.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:239.63,240.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:241.35,242.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:243.36,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:245.10,246.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.94,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,20.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:20.51,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:23.2,23.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:23.16,25.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:26.2,26.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:39.38,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:48.61,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:52.101,57.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:57.16,59.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:61.2,61.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:61.51,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.2,64.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.104,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:79.2,79.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:79.51,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,82.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.16,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:85.2,85.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:88.114,95.50 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:95.50,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:98.2,98.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:102.2,105.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:105.37,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:109.2,109.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:109.96,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.2,116.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:116.38,119.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:119.30,121.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.3,129.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:131.2,131.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:134.64,139.57 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:139.57,140.74 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.74,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:145.2,145.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.8,147.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.50,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:150.2,150.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:153.92,161.57 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:161.57,162.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:162.85,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:167.2,167.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.8,169.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.50,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:172.2,172.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.94,179.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:179.61,181.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:182.2,182.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:182.55,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:185.2,185.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:185.16,187.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:188.2,188.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.100,195.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:195.61,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:198.2,198.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:198.55,200.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:201.2,201.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:201.16,203.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.2,204.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.87,210.55 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:210.55,212.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:213.2,213.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:213.16,215.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:216.2,216.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:219.83,226.57 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:226.57,227.81 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.81,229.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:232.2,232.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:232.16,234.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:234.8,234.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:234.50,236.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:237.2,237.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:240.89,247.57 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:247.57,248.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:248.87,250.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:253.2,253.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:253.16,255.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:255.8,255.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:255.50,257.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:258.2,258.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.68,267.57 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:267.57,268.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.86,270.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:273.2,273.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:273.16,275.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:275.8,275.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:275.50,277.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:278.2,278.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.74,287.57 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.57,288.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:288.92,290.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:293.2,293.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:293.16,295.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.8,295.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.50,297.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:298.2,298.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:301.91,305.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:305.61,307.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.52,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:311.2,311.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:311.16,313.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:314.2,314.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:317.137,326.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:326.16,328.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.57,331.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:331.79,333.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:336.2,336.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:336.16,338.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:338.8,338.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:338.50,340.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:341.2,341.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:344.110,349.66 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:349.66,351.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:352.2,361.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.59,365.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:365.8,365.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:365.23,367.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:369.2,375.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:375.89,378.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:380.2,380.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:380.16,382.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:382.8,382.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:382.50,384.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.2,385.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:388.147,396.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:396.88,399.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:401.2,401.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:401.59,404.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.23,406.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:406.8,406.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:406.50,408.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:409.2,409.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:412.90,417.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:417.61,419.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:421.2,421.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:421.39,423.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:426.91,431.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.61,433.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.39,437.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:440.145,449.15 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:449.15,450.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:450.22,451.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:451.63,453.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:456.2,456.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:456.35,458.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:460.2,460.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:460.22,470.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:471.2,471.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:471.29,473.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:475.2,475.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:478.168,487.15 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:487.15,488.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:488.22,489.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:489.63,491.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:494.2,494.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:494.35,496.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:498.2,498.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:498.22,505.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:506.2,506.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:506.29,508.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:509.2,509.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:512.158,520.57 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.57,521.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:521.76,523.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:526.2,526.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:526.16,528.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:528.8,528.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:528.76,530.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:532.2,533.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:533.16,535.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:536.2,536.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.86,545.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:545.59,547.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:549.2,549.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:549.110,551.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:551.8,553.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:554.2,554.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:554.126,556.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:557.2,557.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:557.133,559.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:561.2,561.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:561.84,563.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,564.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.103,566.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:567.2,567.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:567.96,569.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:570.2,570.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:570.94,572.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:574.2,574.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:574.92,576.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:578.2,590.25 13 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:594.90,598.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:598.60,600.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.85,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:605.2,605.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:605.89,607.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:608.2,608.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:608.97,610.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:612.2,612.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:612.127,614.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:615.2,615.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:615.119,617.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:618.2,618.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:618.124,620.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:622.2,637.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.72,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,36.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.51,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:40.2,40.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.8,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:47.133,53.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:53.59,55.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:57.2,57.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:57.70,59.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.8,59.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.23,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:63.2,68.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:68.49,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.2,71.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.8,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:78.80,79.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:79.51,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.2,82.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.16,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:84.8,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:89.74,90.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:90.41,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.122,99.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.2,103.58 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.58,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:106.2,106.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:110.2,110.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:110.57,113.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:114.2,114.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:118.2,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:126.2,135.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:138.99,145.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:145.46,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:148.2,148.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:148.16,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:152.2,152.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:152.51,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.2,155.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.16,157.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:159.2,159.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:159.47,161.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,162.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.94,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,98.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 128 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 2 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 321 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 112 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -2172,7 +3133,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -2180,9 +3141,9 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 @@ -2195,41 +3156,41 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 2 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:44.77,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:48.78,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:52.58,53.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:53.50,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.58,63.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:63.38,64.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:64.23,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.82,73.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:73.33,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:76.2,77.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:77.56,80.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.2,81.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:81.17,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.8,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:19.38,20.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:21.51,22.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.10,24.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:28.43,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.44,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.57,38.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:38.28,40.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.8,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 @@ -2239,22 +3200,34 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quot github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 43 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 41 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 41 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -2264,36 +3237,63 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 36 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 10 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:71.31,73.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:75.44,77.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:79.39,80.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:80.55,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.8,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:87.59,89.2 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:91.79,92.20 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:92.20,94.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.8,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:104.176,108.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:108.27,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:115.2,118.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.16,120.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.2,124.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:127.108,132.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:132.70,134.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.2,135.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.35,139.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:140.2,140.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:148.31,150.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:150.16,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.2,155.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:155.16,157.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.2,163.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 51 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 51 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 51 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 9 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 @@ -2302,55 +3302,191 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.132,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:18.63,23.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:23.16,25.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.78 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.78,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:30.2,30.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:37.26,45.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:47.70,49.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:49.16,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:53.2,54.47 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:54.47,60.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:60.17,62.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.8,63.23 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.23,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:67.2,68.47 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:68.47,74.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:74.17,76.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.8,77.23 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.23,79.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:81.2,81.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:26.19,30.53 3 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:30.53,32.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:34.2,37.65 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:37.65,39.4 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:41.2,41.12 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:41.12,43.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:44.2,44.33 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:60.9,62.16 2 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:62.16,64.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:65.2,65.30 1 25 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:65.30,67.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:69.2,70.16 2 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:70.16,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:73.2,74.16 2 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:74.16,76.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:77.2,78.16 2 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:78.16,80.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:81.2,81.12 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:84.75,85.37 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:85.37,87.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:88.2,88.9 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:89.54,91.10 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:91.10,93.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:94.3,95.40 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:96.10,97.52 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:104.9,107.69 3 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:107.69,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:110.2,110.88 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:110.88,112.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:112.8,114.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:120.9,122.16 2 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:122.16,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:125.2,126.16 2 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:126.16,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:129.2,131.36 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:131.36,133.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:133.8,135.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:26.38,28.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:30.100,32.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:32.16,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:35.2,35.24 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:35.24,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:38.2,39.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:42.2,45.16 4 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:45.16,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:48.2,54.12 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.85,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.71 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.71,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:19.17,22.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:24.105,25.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:25.71,27.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:28.2,28.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:31.107,33.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:35.80,37.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:39.66,41.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:43.55,45.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.2,28.31 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.31,30.109 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:30.109,32.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:34.2,34.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:25.21,33.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:41.90,62.54 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:62.54,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.8,64.68 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.68,66.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.8,66.69 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.69,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:70.2,70.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.132,18.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:36.102,43.54 6 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:43.54,45.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.2,47.63 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.63,49.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.2,50.65 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.65,52.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.2,54.61 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.61,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:58.2,60.54 3 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:60.54,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.8,62.23 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.23,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:66.2,68.54 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:68.54,70.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.8,70.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.23,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:74.2,75.53 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:78.149,82.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.87 3 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.87,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.107 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.107,93.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.114 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.114,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:97.2,101.8 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.116 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.116,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.118 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.118,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:115.2,118.8 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:121.139,125.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.85 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.85,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:132.8,134.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:137.104,139.55 2 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:139.55,141.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.8,141.35 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.35,143.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:144.2,144.12 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:151.17,153.130 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:153.130,155.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.138 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.138,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:160.8,162.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:169.17,171.133 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:171.133,173.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.145 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.145,178.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:178.8,180.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.120,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:18.43,22.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.62 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.62,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:29.2,29.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:27.26,35.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:37.133,38.74 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:38.74,40.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:42.2,43.89 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:43.89,45.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:47.2,48.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:48.16,50.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:51.2,52.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:52.16,54.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:56.2,63.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:63.16,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:66.2,66.86 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:66.86,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:69.2,69.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:72.116,74.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:76.89,78.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:80.75,82.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:84.64,86.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:20.26,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:24.116,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:20.27,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:24.118,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 diff --git a/internal/adapters/dataproviders/database/mongo/liquidity_provider.go b/internal/adapters/dataproviders/database/mongo/liquidity_provider.go index 1056d7fb..b1707c1c 100644 --- a/internal/adapters/dataproviders/database/mongo/liquidity_provider.go +++ b/internal/adapters/dataproviders/database/mongo/liquidity_provider.go @@ -19,6 +19,7 @@ const ( peginConfigId configurationName = "pegin" pegoutConfigId configurationName = "pegout" generalConfigId configurationName = "general" + credentialsId configurationName = "credentials" ) type lpMongoRepository struct { @@ -37,19 +38,19 @@ func NewLiquidityProviderRepository(conn *Connection) liquidity_provider.Liquidi func (repo *lpMongoRepository) GetPeginConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.PeginConfiguration], error) { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - return getConfiguration[liquidity_provider.PeginConfiguration](dbCtx, repo, peginConfigId) + return getConfigurationVerbose[liquidity_provider.PeginConfiguration](dbCtx, repo, peginConfigId) } func (repo *lpMongoRepository) GetPegoutConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.PegoutConfiguration], error) { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - return getConfiguration[liquidity_provider.PegoutConfiguration](dbCtx, repo, pegoutConfigId) + return getConfigurationVerbose[liquidity_provider.PegoutConfiguration](dbCtx, repo, pegoutConfigId) } func (repo *lpMongoRepository) GetGeneralConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.GeneralConfiguration], error) { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - return getConfiguration[liquidity_provider.GeneralConfiguration](dbCtx, repo, generalConfigId) + return getConfigurationVerbose[liquidity_provider.GeneralConfiguration](dbCtx, repo, generalConfigId) } func (repo *lpMongoRepository) UpsertPeginConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.PeginConfiguration]) error { @@ -59,7 +60,7 @@ func (repo *lpMongoRepository) UpsertPeginConfiguration(ctx context.Context, sig Signed: signedConfig, Name: peginConfigId, } - return upsertConfiguration(dbCtx, repo, configToStore) + return upsertConfigurationVerbose(dbCtx, repo, configToStore) } func (repo *lpMongoRepository) UpsertPegoutConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.PegoutConfiguration]) error { @@ -69,7 +70,7 @@ func (repo *lpMongoRepository) UpsertPegoutConfiguration(ctx context.Context, si Signed: signedConfig, Name: pegoutConfigId, } - return upsertConfiguration(dbCtx, repo, configToStore) + return upsertConfigurationVerbose(dbCtx, repo, configToStore) } func (repo *lpMongoRepository) UpsertGeneralConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.GeneralConfiguration]) error { @@ -79,13 +80,46 @@ func (repo *lpMongoRepository) UpsertGeneralConfiguration(ctx context.Context, s Signed: signedConfig, Name: generalConfigId, } - return upsertConfiguration(dbCtx, repo, configToStore) + return upsertConfigurationVerbose(dbCtx, repo, configToStore) +} + +func (repo *lpMongoRepository) GetCredentials(ctx context.Context) (*entities.Signed[liquidity_provider.HashedCredentials], error) { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + return getConfiguration[liquidity_provider.HashedCredentials](dbCtx, repo, credentialsId, false) +} + +func (repo *lpMongoRepository) UpsertCredentials(ctx context.Context, credentials entities.Signed[liquidity_provider.HashedCredentials]) error { + dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) + defer cancel() + configToStore := storedConfiguration[liquidity_provider.HashedCredentials]{ + Signed: credentials, + Name: credentialsId, + } + return upsertConfiguration(dbCtx, repo, configToStore, false) +} + +func upsertConfigurationVerbose[C liquidity_provider.ConfigurationType]( + ctx context.Context, + repo *lpMongoRepository, + config storedConfiguration[C], +) error { + return upsertConfiguration(ctx, repo, config, true) +} + +func getConfigurationVerbose[C liquidity_provider.ConfigurationType]( + ctx context.Context, + repo *lpMongoRepository, + name configurationName, +) (*entities.Signed[C], error) { + return getConfiguration[C](ctx, repo, name, true) } func upsertConfiguration[C liquidity_provider.ConfigurationType]( ctx context.Context, repo *lpMongoRepository, config storedConfiguration[C], + logInteraction bool, ) error { collection := repo.conn.Collection(liquidityProviderCollection) options := options.Replace().SetUpsert(true) @@ -93,16 +127,18 @@ func upsertConfiguration[C liquidity_provider.ConfigurationType]( _, err := collection.ReplaceOne(ctx, filter, config, options) if err != nil { return err - } else { + } + if logInteraction { logDbInteraction(insert, config) - return nil } + return nil } func getConfiguration[C liquidity_provider.ConfigurationType]( ctx context.Context, repo *lpMongoRepository, name configurationName, + logInteraction bool, ) (*entities.Signed[C], error) { config := &storedConfiguration[C]{} collection := repo.conn.Collection(liquidityProviderCollection) @@ -114,6 +150,8 @@ func getConfiguration[C liquidity_provider.ConfigurationType]( } else if err != nil { return nil, err } - logDbInteraction(read, config.Signed) + if logInteraction { + logDbInteraction(read, config.Signed) + } return &config.Signed, nil } diff --git a/internal/adapters/dataproviders/event.go b/internal/adapters/dataproviders/event.go index 15a11cd4..aa582862 100644 --- a/internal/adapters/dataproviders/event.go +++ b/internal/adapters/dataproviders/event.go @@ -11,6 +11,8 @@ var ( eventBusSingleton *localEventBus ) +const subscriptionBufferSize = 20 + type localEventBus struct { topics map[entities.EventId][]chan<- entities.Event subscribeMutex sync.Mutex @@ -39,7 +41,7 @@ func (bus *localEventBus) Subscribe(id entities.EventId) <-chan entities.Event { topics = make([]chan<- entities.Event, 0) bus.topics[id] = topics } - subscription := make(chan entities.Event) + subscription := make(chan entities.Event, subscriptionBufferSize) bus.topics[id] = append(topics, subscription) return subscription } diff --git a/internal/adapters/entrypoints/rest/handlers/common.go b/internal/adapters/entrypoints/rest/handlers/common.go new file mode 100644 index 00000000..96ba6212 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/common.go @@ -0,0 +1,30 @@ +package handlers + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "net/http" +) + +func closeManagementSession(req *http.Request, w http.ResponseWriter, env environment.ManagementEnv) error { + const errorMsg = "error closing session" + cookieStore, err := cookies.GetSessionCookieStore(env) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return err + } + + err = cookies.CloseManagementSession(&cookies.CloseSessionArgs{ + Store: cookieStore, + Request: req, + Writer: w, + }) + if err != nil { + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return err + } + return nil +} diff --git a/internal/adapters/entrypoints/rest/handlers/management_login.go b/internal/adapters/entrypoints/rest/handlers/management_login.go index 91ff161b..8239ee0a 100644 --- a/internal/adapters/entrypoints/rest/handlers/management_login.go +++ b/internal/adapters/entrypoints/rest/handlers/management_login.go @@ -5,47 +5,51 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" "net/http" ) // NewManagementLoginHandler // @Title Management Login // @Description Authenticate to start a Management API session -// @Success 200 +// @Success 200 object // @Route /management/login [post] func NewManagementLoginHandler(env environment.ManagementEnv, useCase *liquidity_provider.LoginUseCase) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { - const errorMsg = "error closing old session" - err := useCase.Run() + const errorMsg = "session creation error" + var err error + request := pkg.LoginRequest{} + if err = rest.DecodeRequest(w, req, &request); err != nil { + return + } else if err = rest.ValidateRequest(w, &request); err != nil { + return + } + + err = useCase.Run(req.Context(), lp.Credentials{ + Username: request.Username, + Password: request.Password, + }) if errors.Is(err, liquidity_provider.BadLoginError) { jsonErr := rest.NewErrorResponse(err.Error(), false) rest.JsonErrorResponse(w, http.StatusUnauthorized, jsonErr) return } else if err != nil { - jsonErr := rest.NewErrorResponseWithDetails("unexpected login error", rest.DetailsFromError(err), false) + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) return } - - cookieStore, err := cookies.GetSessionCookieStore(env) - if err != nil { - jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) - rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + if err = closeManagementSession(req, w, env); err != nil { return } - err = cookies.CloseManagementSession(&cookies.CloseSessionArgs{ - Store: cookieStore, - Request: req, - Writer: w, - }) + cookieStore, err := cookies.GetSessionCookieStore(env) if err != nil { jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) return } - err = cookies.CreateManagementSession(&cookies.CreateSessionArgs{ Store: cookieStore, Env: env, @@ -53,7 +57,7 @@ func NewManagementLoginHandler(env environment.ManagementEnv, useCase *liquidity Writer: w, }) if err != nil { - jsonErr := rest.NewErrorResponseWithDetails("session creation error", rest.DetailsFromError(err), false) + jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) return } diff --git a/internal/adapters/entrypoints/rest/handlers/management_logout.go b/internal/adapters/entrypoints/rest/handlers/management_logout.go index 319f7dac..d7cc2b48 100644 --- a/internal/adapters/entrypoints/rest/handlers/management_logout.go +++ b/internal/adapters/entrypoints/rest/handlers/management_logout.go @@ -2,7 +2,6 @@ package handlers import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" "net/http" ) @@ -10,27 +9,12 @@ import ( // NewManagementLogoutHandler // @Title Management Logout // @Description Logout from the Management API session -// @Success 204 +// @Success 204 object // @Route /management/logout [post] func NewManagementLogoutHandler(env environment.ManagementEnv) http.HandlerFunc { // this handler doesn't use a use case because it doesn't involve any business logic return func(w http.ResponseWriter, req *http.Request) { - const errorMsg = "logout error" - store, err := cookies.GetSessionCookieStore(env) - if err != nil { - jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) - rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) - return - } - - err = cookies.CloseManagementSession(&cookies.CloseSessionArgs{ - Store: store, - Request: req, - Writer: w, - }) - if err != nil { - jsonErr := rest.NewErrorResponseWithDetails(errorMsg, rest.DetailsFromError(err), false) - rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + if err := closeManagementSession(req, w, env); err != nil { return } rest.JsonResponse(w, http.StatusNoContent) diff --git a/internal/adapters/entrypoints/rest/handlers/set_credentials.go b/internal/adapters/entrypoints/rest/handlers/set_credentials.go new file mode 100644 index 00000000..d0e6e837 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/set_credentials.go @@ -0,0 +1,52 @@ +package handlers + +import ( + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/pkg" + "net/http" +) + +// NewSetCredentialsHandler +// @Title Set Login Credentials +// @Description Set new credentials to log into the Management API +// @Success 200 object +// @Route /management/credentials [post] +func NewSetCredentialsHandler(env environment.ManagementEnv, useCase *liquidity_provider.SetCredentialsUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var err error + request := pkg.CredentialsUpdateRequest{} + if err = rest.DecodeRequest(w, req, &request); err != nil { + return + } else if err = rest.ValidateRequest(w, &request); err != nil { + return + } + + oldCredentials := lp.Credentials{Username: request.OldUsername, Password: request.OldPassword} + newCredentials := lp.Credentials{Username: request.NewUsername, Password: request.NewPassword} + + err = useCase.Run(req.Context(), oldCredentials, newCredentials) + if errors.Is(err, liquidity_provider.BadLoginError) { + jsonErr := rest.NewErrorResponse(err.Error(), true) + rest.JsonErrorResponse(w, http.StatusUnauthorized, jsonErr) + return + } else if errors.Is(err, utils.PasswordComplexityError) { + jsonErr := rest.NewErrorResponse(err.Error(), true) + rest.JsonErrorResponse(w, http.StatusBadRequest, jsonErr) + return + } else if err != nil { + jsonErr := rest.NewErrorResponseWithDetails("unexpected login error", rest.DetailsFromError(err), false) + rest.JsonErrorResponse(w, http.StatusInternalServerError, jsonErr) + return + } + + if err = closeManagementSession(req, w, env); err != nil { + return + } + rest.JsonResponse(w, http.StatusOK) + } +} diff --git a/internal/adapters/entrypoints/rest/registry/registry.go b/internal/adapters/entrypoints/rest/registry/registry.go index 7e55325d..5855ed54 100644 --- a/internal/adapters/entrypoints/rest/registry/registry.go +++ b/internal/adapters/entrypoints/rest/registry/registry.go @@ -29,4 +29,6 @@ type UseCaseRegistry interface { SetGeneralConfigUseCase() *liquidity_provider.SetGeneralConfigUseCase GetConfigurationUseCase() *liquidity_provider.GetConfigUseCase LoginUseCase() *liquidity_provider.LoginUseCase + SetCredentialsUseCase() *liquidity_provider.SetCredentialsUseCase + GenerateDefaultCredentialsUseCase() *liquidity_provider.GenerateDefaultCredentialsUseCase } diff --git a/internal/adapters/entrypoints/rest/routes/management.go b/internal/adapters/entrypoints/rest/routes/management.go index f2d34972..d483fa6f 100644 --- a/internal/adapters/entrypoints/rest/routes/management.go +++ b/internal/adapters/entrypoints/rest/routes/management.go @@ -82,5 +82,10 @@ func getManagementEndpoints(env environment.Environment, useCaseRegistry registr Method: http.MethodPost, Handler: handlers.NewManagementLogoutHandler(env.Management), }, + { + Path: "/management/credentials", + Method: http.MethodPost, + Handler: handlers.NewSetCredentialsHandler(env.Management, useCaseRegistry.SetCredentialsUseCase()), + }, } } diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 5dbd382b..7d7744d1 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -12,6 +12,8 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" ) +var signingHashFunction = crypto.Keccak256 + type UseCaseRegistry struct { getPeginQuoteUseCase *pegin.GetQuoteUseCase registerProviderUseCase *liquidity_provider.RegistrationUseCase @@ -48,6 +50,8 @@ type UseCaseRegistry struct { setGeneralConfigUseCase *liquidity_provider.SetGeneralConfigUseCase getConfigurationUseCase *liquidity_provider.GetConfigUseCase loginUseCase *liquidity_provider.LoginUseCase + setCredentialsUseCase *liquidity_provider.SetCredentialsUseCase + defaultCredentialsUseCase *liquidity_provider.GenerateDefaultCredentialsUseCase } // NewUseCaseRegistry @@ -179,20 +183,30 @@ func NewUseCaseRegistry( setGeneralConfigUseCase: liquidity_provider.NewSetGeneralConfigUseCase( databaseRegistry.LiquidityProviderRepository, rskRegistry.Wallet, - crypto.Keccak256, + signingHashFunction, ), setPeginConfigUseCase: liquidity_provider.NewSetPeginConfigUseCase( databaseRegistry.LiquidityProviderRepository, rskRegistry.Wallet, - crypto.Keccak256, + signingHashFunction, ), setPegoutConfigUseCase: liquidity_provider.NewSetPegoutConfigUseCase( databaseRegistry.LiquidityProviderRepository, rskRegistry.Wallet, - crypto.Keccak256, + signingHashFunction, ), getConfigurationUseCase: liquidity_provider.NewGetConfigUseCase(liquidityProvider, liquidityProvider, liquidityProvider), - loginUseCase: liquidity_provider.NewLoginUseCase(), + loginUseCase: liquidity_provider.NewLoginUseCase(databaseRegistry.LiquidityProviderRepository, messaging.EventBus), + setCredentialsUseCase: liquidity_provider.NewSetCredentialsUseCase( + databaseRegistry.LiquidityProviderRepository, + rskRegistry.Wallet, + signingHashFunction, + messaging.EventBus, + ), + defaultCredentialsUseCase: liquidity_provider.NewGenerateDefaultCredentialsUseCase( + databaseRegistry.LiquidityProviderRepository, + messaging.EventBus, + ), } } @@ -283,3 +297,11 @@ func (registry *UseCaseRegistry) GetConfigurationUseCase() *liquidity_provider.G func (registry *UseCaseRegistry) LoginUseCase() *liquidity_provider.LoginUseCase { return registry.loginUseCase } + +func (registry *UseCaseRegistry) SetCredentialsUseCase() *liquidity_provider.SetCredentialsUseCase { + return registry.setCredentialsUseCase +} + +func (registry *UseCaseRegistry) GenerateDefaultCredentialsUseCase() *liquidity_provider.GenerateDefaultCredentialsUseCase { + return registry.defaultCredentialsUseCase +} diff --git a/internal/entities/liquidity_provider/configuration.go b/internal/entities/liquidity_provider/configuration.go index 0bf1b486..380b005d 100644 --- a/internal/entities/liquidity_provider/configuration.go +++ b/internal/entities/liquidity_provider/configuration.go @@ -37,8 +37,15 @@ type GeneralConfiguration struct { BtcConfirmations ConfirmationsPerAmount `json:"btcConfirmations" bson:"btc_confirmations" validate:"required"` } +type HashedCredentials struct { + HashedUsername string `bson:"hashed_username"` + HashedPassword string `bson:"hashed_password"` + UsernameSalt string `bson:"username_salt"` + PasswordSalt string `bson:"password_salt"` +} + type ConfigurationType interface { - PeginConfiguration | PegoutConfiguration | GeneralConfiguration + PeginConfiguration | PegoutConfiguration | GeneralConfiguration | HashedCredentials } func (config PeginConfiguration) ValidateAmount(amount *entities.Wei) error { diff --git a/internal/entities/liquidity_provider/liquidity_provider.go b/internal/entities/liquidity_provider/liquidity_provider.go index d26700e0..88817173 100644 --- a/internal/entities/liquidity_provider/liquidity_provider.go +++ b/internal/entities/liquidity_provider/liquidity_provider.go @@ -14,6 +14,10 @@ const ( FullProvider ProviderType = "both" ) +const ( + DefaultCredentialsSetEventId entities.EventId = "CredentialsSet" +) + var InvalidProviderTypeError = errors.New("invalid liquidity provider type") func (p ProviderType) IsValid() bool { @@ -66,6 +70,8 @@ type LiquidityProviderRepository interface { UpsertPegoutConfiguration(ctx context.Context, configuration entities.Signed[PegoutConfiguration]) error GetGeneralConfiguration(ctx context.Context) (*entities.Signed[GeneralConfiguration], error) UpsertGeneralConfiguration(ctx context.Context, configuration entities.Signed[GeneralConfiguration]) error + GetCredentials(ctx context.Context) (*entities.Signed[HashedCredentials], error) + UpsertCredentials(ctx context.Context, credentials entities.Signed[HashedCredentials]) error } type RegisteredLiquidityProvider struct { @@ -89,3 +95,13 @@ type PunishmentEvent struct { Penalty *entities.Wei QuoteHash string } + +type Credentials struct { + Username string + Password string +} + +type DefaultCredentialsSetEvent struct { + entities.Event + Password string +} diff --git a/internal/entities/utils/hashing.go b/internal/entities/utils/hashing.go new file mode 100644 index 00000000..3ed8cee8 --- /dev/null +++ b/internal/entities/utils/hashing.go @@ -0,0 +1,44 @@ +package utils + +import ( + "encoding/hex" + "fmt" + "golang.org/x/crypto/argon2" +) + +const ( + Argon2Time = 1 + Argon2Memory = 64 * 1024 + Argon2Threads = 4 + Argon2HashSize = 32 + argon2RecommendedSaltSize = 16 +) + +var Argon2SaltSizeError = fmt.Errorf("the recommended size for a salt in argon2 is at least %d bytes", argon2RecommendedSaltSize) + +func HashAndSaltArgon2(value string, saltSize int64) (hash []byte, salt string, err error) { + if saltSize < argon2RecommendedSaltSize { + return nil, "", Argon2SaltSizeError + } + saltBytes, err := GetRandomBytes(saltSize) + if err != nil { + return nil, "", err + } + saltValue := hex.EncodeToString(saltBytes) + result, err := HashArgon2(value, saltValue) + if err != nil { + return nil, "", err + } + return result, hex.EncodeToString(saltBytes), nil +} + +func HashArgon2(value, salt string) ([]byte, error) { + decodedSalt, err := hex.DecodeString(salt) + if err != nil { + return nil, err + } else if len(decodedSalt) < argon2RecommendedSaltSize { + return nil, Argon2SaltSizeError + } + hash := argon2.IDKey([]byte(value), decodedSalt, Argon2Time, Argon2Memory, Argon2Threads, Argon2HashSize) + return hash, nil +} diff --git a/internal/entities/utils/hashing_test.go b/internal/entities/utils/hashing_test.go new file mode 100644 index 00000000..03ea3cc5 --- /dev/null +++ b/internal/entities/utils/hashing_test.go @@ -0,0 +1,144 @@ +package utils_test + +import ( + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/argon2" + "testing" +) + +func TestHashAndSaltArgon2(t *testing.T) { + type caseType struct { + message string + saltSize int64 + } + cases := []caseType{ + { + message: "test", + saltSize: 16, + }, + { + message: "other test", + saltSize: 32, + }, + { + message: "bigger test", + saltSize: 64, + }, + { + message: "ae49dd4f1b44531367e2f1549262b4870f637d6a3590928037a1b1fbe859d412", + saltSize: 129, + }, + { + message: "'//12casagASFCADHD+++*", + saltSize: 128, + }, + } + + for _, testCase := range cases { + result, salt, err := utils.HashAndSaltArgon2(testCase.message, testCase.saltSize) + require.NoError(t, err) + assert.NotEmpty(t, salt) + saltBytes, err := hex.DecodeString(salt) + require.NoError(t, err) + realHash := argon2.IDKey( + []byte(testCase.message), + saltBytes, + utils.Argon2Time, + utils.Argon2Memory, + utils.Argon2Threads, + utils.Argon2HashSize, + ) + assert.Equal(t, realHash, result) + resultUsingSalt, err := utils.HashArgon2(testCase.message, salt) + require.NoError(t, err) + assert.Equal(t, realHash, resultUsingSalt) + } +} + +func TestHashAndSaltArgon2_ErrorHandling(t *testing.T) { + cases := []struct { + name string + value string + saltSize int64 + error string + }{ + { + name: "Illegal salt size", + value: test.AnyString, + saltSize: 15, + error: "the recommended size for a salt in argon2 is at least 16 bytes", + }, + } + for _, testCase := range cases { + t.Run(testCase.name, func(t *testing.T) { + result, salt, err := utils.HashAndSaltArgon2(testCase.value, testCase.saltSize) + assert.Empty(t, result) + assert.Empty(t, salt) + require.EqualError(t, err, testCase.error) + }) + } +} + +func TestHashArgon2(t *testing.T) { + type caseType struct { + message string + salt string + result []byte + } + cases := []caseType{ + { + message: "test", + salt: "8d9b0dcfebe4a9d87d18153b3adc899f", + result: []byte{0x69, 0xc6, 0xa, 0xf, 0xae, 0xf1, 0x33, 0x54, 0x5b, 0x19, 0xae, 0x59, 0x83, 0x1a, 0xc8, 0xa6, 0x10, 0xc5, 0x33, 0xba, 0x3b, 0xe, 0x27, 0x1d, 0xaa, 0x75, 0x7d, 0x26, 0x5, 0x31, 0xd, 0x4e}, + }, + { + message: "some Password!!+123", + salt: "df34e4cc5709b01bbee819608a4dca835d49fd72c3a04adb09e4b162385bcc2f", + result: []byte{0x2c, 0x2f, 0x1b, 0x90, 0xca, 0x6d, 0xe8, 0x66, 0xfc, 0x7c, 0xfd, 0x77, 0xa1, 0x74, 0x60, 0xb6, 0x78, 0x7d, 0xfb, 0x74, 0xbb, 0xf, 0x92, 0x6f, 0xcb, 0x90, 0x2b, 0x35, 0xaa, 0x1f, 0x70, 0x68}, + }, + { + message: "other 123 password !?¿-_", + salt: "75a02fe64cd2a89c6d237656e98dbcf2b262b7412136be9a92b9a2426fc2d250e7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068", + result: []byte{0x33, 0xc5, 0x53, 0x4a, 0xbc, 0xd4, 0x7, 0x2, 0x19, 0x57, 0x6d, 0xee, 0xf, 0xed, 0x7f, 0xbd, 0xe4, 0x11, 0xe1, 0x32, 0xb2, 0xa, 0x98, 0x64, 0xa0, 0x1e, 0xcd, 0xfd, 0xa4, 0x75, 0x94, 0xf3}, + }, + } + + for _, testCase := range cases { + result, err := utils.HashArgon2(testCase.message, testCase.salt) + require.NoError(t, err) + assert.Equal(t, testCase.result, result) + } +} + +func TestHashArgon2_ErrorHandling(t *testing.T) { + cases := []struct { + name string + value string + salt string + error string + }{ + { + name: "Illegal salt size", + value: test.AnyString, + salt: "801a1ce64d540ea8d3fcb5ab1e3068", + error: "the recommended size for a salt in argon2 is at least 16 bytes", + }, + { + name: "No hex salt", + value: test.AnyString, + salt: "no hex", + error: "encoding/hex: invalid byte: U+006E 'n'", + }, + } + for _, testCase := range cases { + t.Run(testCase.name, func(t *testing.T) { + result, err := utils.HashArgon2(testCase.value, testCase.salt) + assert.Empty(t, result) + require.EqualError(t, err, testCase.error) + }) + } +} diff --git a/internal/entities/utils/passwords.go b/internal/entities/utils/passwords.go new file mode 100644 index 00000000..d5228906 --- /dev/null +++ b/internal/entities/utils/passwords.go @@ -0,0 +1,89 @@ +package utils + +import ( + "errors" + "regexp" +) + +var ( + lowerCaseRegex = regexp.MustCompile(".*[a-z].*") + upperCaseRegex = regexp.MustCompile(".*[A-Z].*") + digitRegex = regexp.MustCompile(".*[0-9].*") + specialCharacterRegex = regexp.MustCompile(".*[" + regexp.QuoteMeta(" !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") + "].*") +) + +var PasswordComplexityError = errors.New("password does not meet the complexity requirements") + +type ValidationRule func(password string) error + +// CheckPasswordComplexity see https://owasp.deteact.com/cheat/cheatsheets/Authentication_Cheat_Sheet.html#password-complexity +func CheckPasswordComplexity(password string, rules ...ValidationRule) error { + for _, rule := range rules { + if err := rule(password); err != nil { + return errors.Join(PasswordComplexityError, err) + } + } + return nil +} + +func DefaultPasswordValidationRuleset() []ValidationRule { + const ( + minLength = 10 + maxLength = 128 + ) + return []ValidationRule{ + PasswordLengthRule(minLength, maxLength), + PasswordLowerCaseRule(), + PasswordUpperCaseRule(), + PasswordDigitRule(), + PasswordSpecialCharRule(), + } +} + +func PasswordLengthRule(min, max int) ValidationRule { + return func(password string) error { + if len(password) < min { + return errors.New("password is too short") + } + if len(password) > max { + return errors.New("password is too long") + } + return nil + } +} + +func PasswordLowerCaseRule() ValidationRule { + return func(password string) error { + if !lowerCaseRegex.MatchString(password) { + return errors.New("password must contain at least one lowercase character") + } + return nil + } +} + +func PasswordUpperCaseRule() ValidationRule { + return func(password string) error { + if !upperCaseRegex.MatchString(password) { + return errors.New("password must contain at least one uppercase character") + } + return nil + } +} + +func PasswordDigitRule() ValidationRule { + return func(password string) error { + if !digitRegex.MatchString(password) { + return errors.New("password must contain at least one digit") + } + return nil + } +} + +func PasswordSpecialCharRule() ValidationRule { + return func(password string) error { + if !specialCharacterRegex.MatchString(password) { + return errors.New("password must contain at least one special character") + } + return nil + } +} diff --git a/internal/entities/utils/passwords_test.go b/internal/entities/utils/passwords_test.go new file mode 100644 index 00000000..d233b6b5 --- /dev/null +++ b/internal/entities/utils/passwords_test.go @@ -0,0 +1,168 @@ +package utils_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/stretchr/testify/require" + "testing" +) + +var specialChars = []string{ + "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "=", "{", "}", + "[", "]", ":", ";", "<", ">", ",", ".", "?", "/", "|", "\\", " ", "\"", "'", "`", "~", +} +var uppercaseChars = []string{ + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", +} + +var lowercaseChars = []string{ + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", +} + +var numbers = []string{ + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", +} + +func TestPasswordLengthRule(t *testing.T) { + rule := utils.PasswordLengthRule(10, 128) + var validPasswords = []string{"1234567890", "12345678901", "f4bf9f7fcbedaba0392f108c59d8f4a38b3838efb64877380171b54475c2ade8f4bf9f7fcbedaba0392f108c59d8f4a38b3838efb64877380171b54475c2ade8"} + var invalidPasswords = []string{"", "123456789", "e7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068e7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e30681"} + + for _, password := range validPasswords { + err := rule(password) + require.NoError(t, err, "password %s should be valid", password) + } + + for _, password := range invalidPasswords { + err := rule(password) + require.Error(t, err, "password %s should be invalid", password) + } +} + +func TestPasswordSpecialCharRule(t *testing.T) { + var nonSpecialChars []string + nonSpecialChars = append(nonSpecialChars, uppercaseChars...) + nonSpecialChars = append(nonSpecialChars, lowercaseChars...) + nonSpecialChars = append(nonSpecialChars, numbers...) + nonSpecialChars = append(nonSpecialChars, "°") + var allowedStrings = []string{"y!es", ".no", "maybe?", "two strings"} + var notAllowedStrings = []string{"yes", "no", "maybe", "other°"} + + rule := utils.PasswordSpecialCharRule() + for _, char := range specialChars { + err := rule(char) + require.NoError(t, err, "special char %s should be valid", char) + } + for _, char := range nonSpecialChars { + err := rule(char) + require.Error(t, err, "non-special char %s should be invalid", char) + } + for _, str := range allowedStrings { + err := rule(str) + require.NoError(t, err, "string %s should be valid", str) + } + for _, str := range notAllowedStrings { + err := rule(str) + require.Error(t, err, "string %s should be invalid", str) + } +} + +func TestPasswordUpperCaseRule(t *testing.T) { + var allowedStrings = []string{"YES!", "N!O", "MA+YBE", "TWO STRINGS"} + var notAllowedStrings = []string{"y!es", "no*", "m/aybe", "other"} + + rule := utils.PasswordUpperCaseRule() + for _, char := range uppercaseChars { + err := rule(char) + require.NoError(t, err, "uppercase char %s should be valid", char) + } + for _, char := range lowercaseChars { + err := rule(char) + require.Error(t, err, "lowercase char %s should be invalid", char) + } + for _, str := range allowedStrings { + err := rule(str) + require.NoError(t, err, "string %s should be valid", str) + } + for _, str := range notAllowedStrings { + err := rule(str) + require.Error(t, err, "string %s should be invalid", str) + } +} + +func TestPasswordLowerCaseRule(t *testing.T) { + var allowedStrings = []string{"yes!", "n!o", "ma+ybe", "two strings"} + var notAllowedStrings = []string{"YES", "NO", "MA+YBE", "TWO STRINGS"} + + rule := utils.PasswordLowerCaseRule() + for _, char := range lowercaseChars { + err := rule(char) + require.NoError(t, err, "lowercase char %s should be valid", char) + } + for _, char := range uppercaseChars { + err := rule(char) + require.Error(t, err, "uppercase char %s should be invalid", char) + } + for _, str := range allowedStrings { + err := rule(str) + require.NoError(t, err, "string %s should be valid", str) + } + for _, str := range notAllowedStrings { + err := rule(str) + require.Error(t, err, "string %s should be invalid", str) + } +} + +func TestPasswordDigitRule(t *testing.T) { + var allowedStrings = []string{"yes1", "n2o", "ma3ybe", "two strings 4"} + var notAllowedStrings = []string{"yes", "no", "maybe", "other"} + + rule := utils.PasswordDigitRule() + for _, char := range numbers { + err := rule(char) + require.NoError(t, err, "number %s should be valid", char) + } + for _, char := range uppercaseChars { + err := rule(char) + require.Error(t, err, "uppercase char %s should be invalid", char) + } + for _, str := range allowedStrings { + err := rule(str) + require.NoError(t, err, "string %s should be valid", str) + } + for _, str := range notAllowedStrings { + err := rule(str) + require.Error(t, err, "string %s should be invalid", str) + } +} + +func TestCheckPasswordComplexity(t *testing.T) { + rules := utils.DefaultPasswordValidationRuleset() + + noDigitPassword := "NoDigitPassword!" + noSpecialCharPassword := "NoSpecialCharPassword1" + noUpperCasePassword := "nouppercasepassword1!" + noLowerCasePassword := "NOLOWERCASEPASSWORD1!" + tooShortPassword := "Short1!" + // this is not a credential of anything, they are two sha256 hashes concatenated + 1 extra char + // nolint:gosec + tooLongPassword := "E7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068e7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068!" + validPassword := "ValidPassword1!" + + err := utils.CheckPasswordComplexity(noDigitPassword, rules...) + require.ErrorContains(t, err, "password must contain at least one digit") + err = utils.CheckPasswordComplexity(noSpecialCharPassword, rules...) + require.ErrorContains(t, err, "password must contain at least one special character") + err = utils.CheckPasswordComplexity(noUpperCasePassword, rules...) + require.ErrorContains(t, err, "password must contain at least one uppercase character") + err = utils.CheckPasswordComplexity(noLowerCasePassword, rules...) + require.ErrorContains(t, err, "password must contain at least one lowercase character") + err = utils.CheckPasswordComplexity(tooShortPassword, rules...) + require.ErrorContains(t, err, "password is too short") + err = utils.CheckPasswordComplexity(tooLongPassword, rules...) + require.ErrorContains(t, err, "password is too long") + err = utils.CheckPasswordComplexity(validPassword, rules...) + require.NoError(t, err) + require.Len(t, rules, 5) +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go index e2b73694..bd5e135a 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -48,6 +48,9 @@ const ( SetPeginConfigId UseCaseId = "SetPeginConfigUseCase" SetPegoutConfigId UseCaseId = "SetPegoutConfigUseCase" SetGeneralConfigId UseCaseId = "SetGeneralConfigUseCase" + LoginId UseCaseId = "Login" + ChangeCredentialsId UseCaseId = "ChangeCredentials" + DefaultCredentialsId UseCaseId = "GenerateDefaultCredentials" ) var ( diff --git a/internal/usecases/liquidity_provider/common.go b/internal/usecases/liquidity_provider/common.go index ecdea8cf..f5328373 100644 --- a/internal/usecases/liquidity_provider/common.go +++ b/internal/usecases/liquidity_provider/common.go @@ -2,12 +2,24 @@ package liquidity_provider import ( "cmp" + "context" + "crypto/subtle" + "encoding/hex" + "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "slices" ) +const ( + defaultUsername = "admin" +) + +var BadLoginError = errors.New("incorrect username or credentials") + func ValidateConfiguredProvider( provider liquidity_provider.LiquidityProvider, lbc blockchain.LiquidityBridgeContract, @@ -31,3 +43,94 @@ func ValidateConfiguredProvider( } return providers[index].Id, nil } + +// DefaultPasswordProvider this is an interface to be implemented by those use case that require to use ValidateCredentials, +// since that function requires a way to access to the default password set by the application +type DefaultPasswordProvider interface { + LiquidityProviderRepository() liquidity_provider.LiquidityProviderRepository + GetDefaultPasswordChannel() <-chan entities.Event + SetDefaultPassword(password string) + DefaultPassword() string +} + +func ValidateCredentials( + ctx context.Context, + useCase DefaultPasswordProvider, + credentials liquidity_provider.Credentials, +) error { + storedCredentials, err := useCase.LiquidityProviderRepository().GetCredentials(ctx) + if err != nil { + return err + } + if storedCredentials == nil { + return validateDefaultCredentials(useCase, credentials) + } + + usernameHash, err := utils.HashArgon2(credentials.Username, storedCredentials.Value.UsernameSalt) + if err != nil { + return err + } + passwordHash, err := utils.HashArgon2(credentials.Password, storedCredentials.Value.PasswordSalt) + if err != nil { + return err + } + err = compareCredentials(usernameHash, passwordHash, storedCredentials.Value) + if err != nil { + return err + } + return nil +} + +func ReadDefaultPassword(useCase DefaultPasswordProvider) (string, error) { + if useCase.DefaultPassword() != "" { + return useCase.DefaultPassword(), nil + } + select { + case event := <-useCase.GetDefaultPasswordChannel(): + parsedEvent, ok := event.(liquidity_provider.DefaultCredentialsSetEvent) + if !ok { + return "", errors.New("wrong event error") + } + useCase.SetDefaultPassword(parsedEvent.Password) + return useCase.DefaultPassword(), nil + default: + return "", errors.New("default password not set") + } +} + +func validateDefaultCredentials( + useCase DefaultPasswordProvider, + credentials liquidity_provider.Credentials, +) error { + var defaultPassword string + var err error + if defaultPassword, err = ReadDefaultPassword(useCase); err != nil { + return err + } + if credentials.Username == defaultUsername && credentials.Password == defaultPassword { + return nil + } else { + return BadLoginError + } +} + +func compareCredentials( + usernameHash, passwordHash []byte, + credentials liquidity_provider.HashedCredentials, +) error { + usernameBytes, err := hex.DecodeString(credentials.HashedUsername) + if err != nil { + return err + } + passwordBytes, err := hex.DecodeString(credentials.HashedPassword) + if err != nil { + return err + } + usernameMatch := subtle.ConstantTimeCompare(usernameBytes, usernameHash) == 1 + passwordMatch := subtle.ConstantTimeCompare(passwordBytes, passwordHash) == 1 + if usernameMatch && passwordMatch { + return nil + } else { + return BadLoginError + } +} diff --git a/internal/usecases/liquidity_provider/common_test.go b/internal/usecases/liquidity_provider/common_test.go index 1c8c0441..e582fe5f 100644 --- a/internal/usecases/liquidity_provider/common_test.go +++ b/internal/usecases/liquidity_provider/common_test.go @@ -1,16 +1,24 @@ package liquidity_provider_test import ( + "context" "errors" + "github.com/rsksmart/liquidity-provider-server/internal/entities" lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) +// not a password, only a random hash +// nolint:gosec +const mockDefaultPassword = "2071bae7f92c6272f614e40d57272518480c48fb4c7a4c39525fdc14e6c97c1d" + func TestValidateConfiguredProvider(t *testing.T) { lbc := &mocks.LbcMock{} lbc.On("GetProviders").Return([]lpEntity.RegisteredLiquidityProvider{ @@ -72,3 +80,203 @@ func TestValidateConfiguredProvider_Fail(t *testing.T) { assert.Equal(t, uint64(0), id) require.ErrorIs(t, err, usecases.ProviderConfigurationError) } + +func TestReadDefaultPassword_AlreadyRead(t *testing.T) { + passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider.On("DefaultPassword").Return(test.AnyString) + password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) + assert.Equal(t, test.AnyString, password) + require.NoError(t, err) + passwordProvider.AssertExpectations(t) +} + +func TestReadDefaultPassword_NotRead(t *testing.T) { + passwordChannel := make(chan entities.Event, 1) + passwordChannel <- lpEntity.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Password: mockDefaultPassword, + } + passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider.On("DefaultPassword").Return("").Once() + passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + passwordProvider.On("SetDefaultPassword", mockDefaultPassword).Return().Once() + passwordProvider.On("DefaultPassword").Return(mockDefaultPassword).Once() + password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) + assert.Equal(t, mockDefaultPassword, password) + require.NoError(t, err) + passwordProvider.AssertExpectations(t) +} + +func TestReadDefaultPassword_ErroHandling(t *testing.T) { + t.Run("Default passsword not set", func(t *testing.T) { + passwordChannel := make(chan entities.Event, 1) + passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider.On("DefaultPassword").Return("").Once() + passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) + assert.Empty(t, password) + require.ErrorContains(t, err, "default password not set") + passwordProvider.AssertExpectations(t) + }) + t.Run("Wrong event", func(t *testing.T) { + passwordChannel := make(chan entities.Event, 1) + passwordChannel <- quote.AcceptedPeginQuoteEvent{ + Event: entities.NewBaseEvent(quote.AcceptedPeginQuoteEventId), + Quote: quote.PeginQuote{}, + RetainedQuote: quote.RetainedPeginQuote{}, + } + passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider.On("DefaultPassword").Return("").Once() + passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) + assert.Empty(t, password) + require.ErrorContains(t, err, "wrong event error") + passwordProvider.AssertExpectations(t) + }) +} + +func TestValidateCredentials_DefaultCredentials(t *testing.T) { + credentials := lpEntity.Credentials{ + Username: "admin", + Password: mockDefaultPassword, + } + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + useDefaultPasswordSetUp(lpRepository, passwordProvider) + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) + require.NoError(t, err) + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) +} + +func TestValidateCredentials_DefaultCredentials_StoredCredentials(t *testing.T) { + credentials := lpEntity.Credentials{ + Username: "fakeUser", + Password: "MyFakeCredential1!", + } + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + useStoredCredentialsSetUp(lpRepository, passwordProvider) + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) + require.NoError(t, err) + passwordProvider.AssertNotCalled(t, "DefaultPassword") + passwordProvider.AssertNotCalled(t, "SetDefaultPassword") + passwordProvider.AssertNotCalled(t, "DefaultPasswordChannel") + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) +} + +func TestValidateCredentials_Badlogin(t *testing.T) { + t.Run("Default password bad login", func(t *testing.T) { + credentials := lpEntity.Credentials{ + Username: "admin", + Password: "wrong password", + } + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + useDefaultPasswordSetUp(lpRepository, passwordProvider) + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) + require.ErrorIs(t, err, liquidity_provider.BadLoginError) + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) + }) + t.Run("Stored password bad login", func(t *testing.T) { + credentials := lpEntity.Credentials{ + Username: "any user", + Password: "other wrong password", + } + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + useStoredCredentialsSetUp(lpRepository, passwordProvider) + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) + require.ErrorIs(t, err, liquidity_provider.BadLoginError) + passwordProvider.AssertNotCalled(t, "DefaultPassword") + passwordProvider.AssertNotCalled(t, "SetDefaultPassword") + passwordProvider.AssertNotCalled(t, "DefaultPasswordChannel") + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) + }) +} + +func TestValidateCredentials_ErrorHandling(t *testing.T) { + const ( + noHexString = "no hex" + hexString = "adefaa4dfb9723b813f5137850140bf2f23b8289f75ed532c75fc2a2ae51c082" + ) + credentials := lpEntity.Credentials{Username: test.AnyString, Password: test.AnyString} + t.Run("GetCredentials error", func(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, assert.AnError).Once() + passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, lpEntity.Credentials{}) + require.Error(t, err) + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) + }) + t.Run("Default password not set error", func(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordChannel := make(chan entities.Event, 1) + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() + passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() + passwordProvider.On("DefaultPassword").Return("").Once() + passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, lpEntity.Credentials{}) + require.Error(t, err) + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) + }) + errorCredentials := []lpEntity.HashedCredentials{ + {HashedUsername: noHexString, HashedPassword: hexString, UsernameSalt: hexString, PasswordSalt: hexString}, + {HashedUsername: hexString, HashedPassword: noHexString, UsernameSalt: hexString, PasswordSalt: hexString}, + {HashedUsername: hexString, HashedPassword: hexString, UsernameSalt: noHexString, PasswordSalt: hexString}, + {HashedUsername: hexString, HashedPassword: hexString, UsernameSalt: hexString, PasswordSalt: noHexString}, + } + for _, errorCredential := range errorCredentials { + t.Run("HashArgon2 error", func(t *testing.T) { + storedCredentials := &entities.Signed[lpEntity.HashedCredentials]{Value: errorCredential} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + passwordProvider := &mocks.DefaultPasswordProviderMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Once() + passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) + require.Error(t, err) + passwordProvider.AssertExpectations(t) + lpRepository.AssertExpectations(t) + }) + } +} + +func useDefaultPasswordSetUp( + lpRepository *mocks.LiquidityProviderRepositoryMock, + passwordProvider *mocks.DefaultPasswordProviderMock, +) { + lpRepository.On("GetCredentials", context.Background()).Return(nil, nil).Once() + passwordChannel := make(chan entities.Event, 1) + passwordChannel <- lpEntity.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Password: mockDefaultPassword, + } + passwordProvider.On("DefaultPassword").Return("").Once() + passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + passwordProvider.On("SetDefaultPassword", mockDefaultPassword).Return().Once() + passwordProvider.On("DefaultPassword").Return(mockDefaultPassword).Once() + passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() +} + +func useStoredCredentialsSetUp( + lpRepository *mocks.LiquidityProviderRepositoryMock, + passwordProvider *mocks.DefaultPasswordProviderMock, +) { + storedCredentials := &entities.Signed[lpEntity.HashedCredentials]{ + Value: lpEntity.HashedCredentials{ + HashedUsername: "d5e7cb7636083de780d8d32a7267b1aca58d27105c28462352e75dbc9b4aa938", + HashedPassword: "b59ce56c879d1980ce8136c11c57b5a26a7d96cb30a3ba831805affdac142dcb", + UsernameSalt: "c009436ca9dbfc146dc3b5c47cb1937f95a28a5c55962721ca0851fff1dd7e17", + PasswordSalt: "b646012160b9b3dfdc35e2d0e65c741e49ca58d1f728f67923ecf6b5ecafbe08", + }, + } + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Once() + passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() +} diff --git a/internal/usecases/liquidity_provider/generate_default_credentials.go b/internal/usecases/liquidity_provider/generate_default_credentials.go new file mode 100644 index 00000000..9d427618 --- /dev/null +++ b/internal/usecases/liquidity_provider/generate_default_credentials.go @@ -0,0 +1,55 @@ +package liquidity_provider + +import ( + "context" + "encoding/base32" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + log "github.com/sirupsen/logrus" + "os" + "path" +) + +const defaultPasswordBytes = 64 + +type GenerateDefaultCredentialsUseCase struct { + lpRepository liquidity_provider.LiquidityProviderRepository + eventBus entities.EventBus +} + +func NewGenerateDefaultCredentialsUseCase( + lpRepository liquidity_provider.LiquidityProviderRepository, + eventBus entities.EventBus, +) *GenerateDefaultCredentialsUseCase { + return &GenerateDefaultCredentialsUseCase{lpRepository: lpRepository, eventBus: eventBus} +} + +func (useCase *GenerateDefaultCredentialsUseCase) Run(ctx context.Context, targetDir string) error { + credentials, err := useCase.lpRepository.GetCredentials(ctx) + if err != nil { + return usecases.WrapUseCaseError(usecases.DefaultCredentialsId, err) + } + if credentials != nil { + return nil + } + passwordBytes, err := utils.GetRandomBytes(defaultPasswordBytes) + if err != nil { + return usecases.WrapUseCaseError(usecases.DefaultCredentialsId, err) + } + stringPassword := base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(passwordBytes) + passwordFile := path.Join(targetDir, "management_password.txt") + err = os.WriteFile(passwordFile, []byte(stringPassword), 0600) + if err != nil { + return usecases.WrapUseCaseError(usecases.DefaultCredentialsId, fmt.Errorf("error writing password file: %w", err)) + } + useCase.eventBus.Publish(liquidity_provider.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(liquidity_provider.DefaultCredentialsSetEventId), + Password: stringPassword, + }) + log.Infof("There was no password detected in the database. A new password has been generated and saved in the file %s."+ + "Please keep this file safe. The first time you open the management interface, you will be asked to change this password.", passwordFile) + return nil +} diff --git a/internal/usecases/liquidity_provider/generate_default_credentials_test.go b/internal/usecases/liquidity_provider/generate_default_credentials_test.go new file mode 100644 index 00000000..47ef7cc2 --- /dev/null +++ b/internal/usecases/liquidity_provider/generate_default_credentials_test.go @@ -0,0 +1,92 @@ +package liquidity_provider_test + +import ( + "bytes" + "context" + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "os" + "path" + "testing" +) + +func TestGenerateDefaultCredentialsUseCase_Run(t *testing.T) { + var emittedEvent lpEntity.DefaultCredentialsSetEvent + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + lpRepository.On("GetCredentials", context.Background()).Return(nil, nil) + eventBus.On("Publish", mock.MatchedBy(func(input entities.Event) bool { + event, ok := input.(lpEntity.DefaultCredentialsSetEvent) + require.True(t, ok) + emittedEvent = event + return event.Id() == lpEntity.DefaultCredentialsSetEventId && event.Password != "" + })).Once() + useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) + dir := os.TempDir() + buff := new(bytes.Buffer) + log.SetOutput(buff) + err := useCase.Run(context.Background(), dir) + require.NoError(t, err) + passwordFile := path.Join(dir, "management_password.txt") + writtenPassword, err := os.ReadFile(passwordFile) + require.NoError(t, err) + assert.Equal(t, emittedEvent.Password, string(writtenPassword)) + expectedLog := fmt.Sprintf("There was no password detected in the database. A new password has "+ + "been generated and saved in the file %s.Please keep this file safe. The first time you open the "+ + "management interface, you will be asked to change this password.", passwordFile) + assert.Contains(t, buff.String(), expectedLog) + assert.Positive(t, len(writtenPassword)) + eventBus.AssertExpectations(t) + lpRepository.AssertExpectations(t) +} + +func TestGenerateDefaultCredentialsUseCase_Run_StoredCredentials(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + lpRepository.On("GetCredentials", context.Background()).Return(&entities.Signed[lpEntity.HashedCredentials]{ + Value: lpEntity.HashedCredentials{ + HashedUsername: test.AnyString, + HashedPassword: test.AnyString, + UsernameSalt: test.AnyString, + PasswordSalt: test.AnyString, + }, + }, nil) + useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) + dir := os.TempDir() + err := useCase.Run(context.Background(), dir) + require.NoError(t, err) + eventBus.AssertNotCalled(t, "Publish") + lpRepository.AssertExpectations(t) +} + +func TestGenerateDefaultCredentialsUseCase_Run_ErrorHandling(t *testing.T) { + t.Run("GetCredentials error", func(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + lpRepository.On("GetCredentials", context.Background()).Return(nil, assert.AnError) + useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) + dir := os.TempDir() + err := useCase.Run(context.Background(), dir) + require.Error(t, err) + eventBus.AssertNotCalled(t, "Publish") + lpRepository.AssertExpectations(t) + }) + t.Run("Write file error", func(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + lpRepository.On("GetCredentials", context.Background()).Return(nil, nil) + useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) + err := useCase.Run(context.Background(), "not a dir") + require.ErrorContains(t, err, "error writing password file") + eventBus.AssertNotCalled(t, "Publish") + lpRepository.AssertExpectations(t) + }) +} diff --git a/internal/usecases/liquidity_provider/login.go b/internal/usecases/liquidity_provider/login.go index 5977c121..83bcb5ee 100644 --- a/internal/usecases/liquidity_provider/login.go +++ b/internal/usecases/liquidity_provider/login.go @@ -1,16 +1,45 @@ package liquidity_provider -import "errors" +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) -var BadLoginError = errors.New("incorrect username or credentials") - -type LoginUseCase struct{} +type LoginUseCase struct { + lpRepository liquidity_provider.LiquidityProviderRepository + defaultPasswordChannel <-chan entities.Event + defaultPassword string +} -func NewLoginUseCase() *LoginUseCase { - return &LoginUseCase{} +func NewLoginUseCase( + lpRepository liquidity_provider.LiquidityProviderRepository, + eventBus entities.EventBus, +) *LoginUseCase { + evenChannel := eventBus.Subscribe(liquidity_provider.DefaultCredentialsSetEventId) + return &LoginUseCase{lpRepository: lpRepository, defaultPasswordChannel: evenChannel} } -func (useCase *LoginUseCase) Run() error { - // TODO add here the logic to login when implementing the login task +func (useCase *LoginUseCase) Run(ctx context.Context, credentials liquidity_provider.Credentials) error { + if err := ValidateCredentials(ctx, useCase, credentials); err != nil { + return usecases.WrapUseCaseError(usecases.LoginId, err) + } return nil } + +func (useCase *LoginUseCase) LiquidityProviderRepository() liquidity_provider.LiquidityProviderRepository { + return useCase.lpRepository +} + +func (useCase *LoginUseCase) GetDefaultPasswordChannel() <-chan entities.Event { + return useCase.defaultPasswordChannel +} + +func (useCase *LoginUseCase) SetDefaultPassword(password string) { + useCase.defaultPassword = password +} + +func (useCase *LoginUseCase) DefaultPassword() string { + return useCase.defaultPassword +} diff --git a/internal/usecases/liquidity_provider/login_test.go b/internal/usecases/liquidity_provider/login_test.go new file mode 100644 index 00000000..c30b15c6 --- /dev/null +++ b/internal/usecases/liquidity_provider/login_test.go @@ -0,0 +1,108 @@ +package liquidity_provider_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "sync" + "testing" +) + +func TestLoginUseCase_DefaultPassword(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + mockChannel := make(chan entities.Event) + eventBus.On("Subscribe", mock.Anything).Return((<-chan entities.Event)(mockChannel)).Once() + useCase := liquidity_provider.NewLoginUseCase(lpRepository, eventBus) + const password = test.AnyString + + assert.Empty(t, useCase.DefaultPassword()) + useCase.SetDefaultPassword(password) + assert.Equal(t, password, useCase.DefaultPassword()) +} + +func TestLoginUseCase_GetDefaultPasswordChannel(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := dataproviders.NewLocalEventBus() + useCase := liquidity_provider.NewLoginUseCase(lpRepository, eventBus) + eventBus.Publish(lpEntity.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Password: test.AnyString, + }) + assert.NotNil(t, useCase.GetDefaultPasswordChannel()) + select { + case content := <-useCase.GetDefaultPasswordChannel(): + assert.Equal(t, test.AnyString, content.(lpEntity.DefaultCredentialsSetEvent).Password) + default: + assert.Fail(t, "expected to receive an event") + } +} + +func TestLoginUseCase_Run_UseDefaultPassword(t *testing.T) { + const ( + username = "admin" + password = "login password" + ) + var waitGroup sync.WaitGroup + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Twice() + eventBus := dataproviders.NewLocalEventBus() + useCase := liquidity_provider.NewLoginUseCase(lpRepository, eventBus) + waitGroup.Add(1) + go func(wg *sync.WaitGroup, bus entities.EventBus) { + defer wg.Done() + bus.Publish(lpEntity.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Password: password, + }) + }(&waitGroup, eventBus) + waitGroup.Wait() + err := useCase.Run(context.Background(), lpEntity.Credentials{ + Username: username, + Password: password, + }) + require.NoError(t, err) + err = useCase.Run(context.Background(), lpEntity.Credentials{ + Username: username, + Password: "wrong password", + }) + require.ErrorIs(t, err, liquidity_provider.BadLoginError) + lpRepository.AssertExpectations(t) +} + +func TestLoginUseCase_Run_UseStoredPassword(t *testing.T) { + storedCredentials := &entities.Signed[lpEntity.HashedCredentials]{ + Value: lpEntity.HashedCredentials{ + HashedUsername: "d5e7cb7636083de780d8d32a7267b1aca58d27105c28462352e75dbc9b4aa938", + HashedPassword: "b59ce56c879d1980ce8136c11c57b5a26a7d96cb30a3ba831805affdac142dcb", + UsernameSalt: "c009436ca9dbfc146dc3b5c47cb1937f95a28a5c55962721ca0851fff1dd7e17", + PasswordSalt: "b646012160b9b3dfdc35e2d0e65c741e49ca58d1f728f67923ecf6b5ecafbe08", + }, + } + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Twice() + eventBus := &mocks.EventBusMock{} + eventBus.On("Subscribe", mock.Anything). + Return((<-chan entities.Event)(make(chan entities.Event))).Once() + useCase := liquidity_provider.NewLoginUseCase(lpRepository, eventBus) + + err := useCase.Run(context.Background(), lpEntity.Credentials{ + Username: "fakeUser", + Password: "MyFakeCredential1!", + }) + require.NoError(t, err) + err = useCase.Run(context.Background(), lpEntity.Credentials{ + Username: "otherFakeUser", + Password: "wrong password", + }) + require.ErrorIs(t, err, liquidity_provider.BadLoginError) + eventBus.AssertExpectations(t) + lpRepository.AssertExpectations(t) +} diff --git a/internal/usecases/liquidity_provider/set_credentials.go b/internal/usecases/liquidity_provider/set_credentials.go new file mode 100644 index 00000000..35ca84e0 --- /dev/null +++ b/internal/usecases/liquidity_provider/set_credentials.go @@ -0,0 +1,86 @@ +package liquidity_provider + +import ( + "context" + "encoding/hex" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +const credentialSaltSize = 32 + +type SetCredentialsUseCase struct { + lpRepository liquidity_provider.LiquidityProviderRepository + signer entities.Signer + hashFunc entities.HashFunction + defaultPassword string + defaultPasswordChannel <-chan entities.Event +} + +func NewSetCredentialsUseCase( + lpRepository liquidity_provider.LiquidityProviderRepository, + signer entities.Signer, + hashFunc entities.HashFunction, + eventBus entities.EventBus, +) *SetCredentialsUseCase { + defaultPasswordChannel := eventBus.Subscribe(liquidity_provider.DefaultCredentialsSetEventId) + return &SetCredentialsUseCase{ + lpRepository: lpRepository, + signer: signer, + hashFunc: hashFunc, + defaultPasswordChannel: defaultPasswordChannel, + } +} + +func (useCase *SetCredentialsUseCase) Run(ctx context.Context, oldCredentials, newCredentials liquidity_provider.Credentials) error { + if err := ValidateCredentials(ctx, useCase, oldCredentials); err != nil { + return usecases.WrapUseCaseError(usecases.ChangeCredentialsId, err) + } + + rules := utils.DefaultPasswordValidationRuleset() + if err := utils.CheckPasswordComplexity(newCredentials.Password, rules...); err != nil { + return usecases.WrapUseCaseError(usecases.ChangeCredentialsId, err) + } + + hashedUsername, usernameSalt, err := utils.HashAndSaltArgon2(newCredentials.Username, credentialSaltSize) + if err != nil { + return usecases.WrapUseCaseError(usecases.ChangeCredentialsId, err) + } + hashedPassword, passwordSalt, err := utils.HashAndSaltArgon2(newCredentials.Password, credentialSaltSize) + if err != nil { + return usecases.WrapUseCaseError(usecases.ChangeCredentialsId, err) + } + + hashedCredentials := liquidity_provider.HashedCredentials{ + HashedUsername: hex.EncodeToString(hashedUsername), + HashedPassword: hex.EncodeToString(hashedPassword), + UsernameSalt: usernameSalt, + PasswordSalt: passwordSalt, + } + signedCredentials, err := usecases.SignConfiguration(usecases.ChangeCredentialsId, useCase.signer, useCase.hashFunc, hashedCredentials) + if err != nil { + return usecases.WrapUseCaseError(usecases.ChangeCredentialsId, err) + } + if err = useCase.lpRepository.UpsertCredentials(ctx, signedCredentials); err != nil { + return usecases.WrapUseCaseError(usecases.ChangeCredentialsId, err) + } + return nil +} + +func (useCase *SetCredentialsUseCase) LiquidityProviderRepository() liquidity_provider.LiquidityProviderRepository { + return useCase.lpRepository +} + +func (useCase *SetCredentialsUseCase) GetDefaultPasswordChannel() <-chan entities.Event { + return useCase.defaultPasswordChannel +} + +func (useCase *SetCredentialsUseCase) SetDefaultPassword(password string) { + useCase.defaultPassword = password +} + +func (useCase *SetCredentialsUseCase) DefaultPassword() string { + return useCase.defaultPassword +} diff --git a/internal/usecases/liquidity_provider/set_credentials_test.go b/internal/usecases/liquidity_provider/set_credentials_test.go new file mode 100644 index 00000000..9a683bb3 --- /dev/null +++ b/internal/usecases/liquidity_provider/set_credentials_test.go @@ -0,0 +1,234 @@ +package liquidity_provider_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "sync" + "testing" +) + +var storedCredentials = &entities.Signed[lpEntity.HashedCredentials]{ + Value: lpEntity.HashedCredentials{ + HashedUsername: "12ff30a29822669a598d9ad86afa00d48c5c25917c8c75cff1c4302051d7e9a5", + HashedPassword: "100844abd86da73cd12ed3d7949267f24d3b6f81dd6f38f3bbb9d55d596d3e1e", + UsernameSalt: "f80a2b53ce41bc884f9d574f78ca58ab97d58f785b6a1d13356a64217afffb9b", + PasswordSalt: "eaa2bded32cc585d3f37c5319abe8890ad28a697ed66d5823f10536cc9c0fdb9", + }, +} + +var oldCredentials = lpEntity.Credentials{Username: "oldUsername", Password: "oldPassword1*"} + +func TestSetCredentialsUseCase_DefaultPassword(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + mockChannel := make(chan entities.Event) + eventBus.On("Subscribe", mock.Anything).Return((<-chan entities.Event)(mockChannel)).Once() + walletMock := &mocks.RskWalletMock{} + hashMock := &mocks.HashMock{} + useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) + const password = test.AnyString + assert.Empty(t, useCase.DefaultPassword()) + useCase.SetDefaultPassword(password) + assert.Equal(t, password, useCase.DefaultPassword()) +} + +func TestSetCredentialsUseCase_GetDefaultPasswordChannel(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := dataproviders.NewLocalEventBus() + walletMock := &mocks.RskWalletMock{} + hashMock := &mocks.HashMock{} + useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) + eventBus.Publish(lpEntity.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Password: test.AnyString, + }) + assert.NotNil(t, useCase.GetDefaultPasswordChannel()) + select { + case content := <-useCase.GetDefaultPasswordChannel(): + assert.Equal(t, test.AnyString, content.(lpEntity.DefaultCredentialsSetEvent).Password) + default: + assert.Fail(t, "expected to receive an event") + } +} + +func TestSetCredentialsUseCase_Run_StoredCredentials(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil) + lpRepository.On( + "UpsertCredentials", + test.AnyCtx, + mock.MatchedBy(func(credentials entities.Signed[lpEntity.HashedCredentials]) bool { + const expectedLength = 64 + // we cant assert the exact value because the salt is random + return len(credentials.Value.HashedUsername) == expectedLength && + len(credentials.Value.HashedPassword) == expectedLength && + len(credentials.Value.UsernameSalt) == expectedLength && + len(credentials.Value.PasswordSalt) == expectedLength && + credentials.Signature == "04030201" && + credentials.Hash == "01020304" + })). + Return(nil).Once() + eventBus := &mocks.EventBusMock{} + eventBus.On("Subscribe", mock.Anything).Return((<-chan entities.Event)(make(chan entities.Event))).Once() + walletMock := &mocks.RskWalletMock{} + walletMock.On("SignBytes", mock.Anything).Return([]byte{4, 3, 2, 1}, nil) + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{0x01, 0x02, 0x03, 0x04}).Once() + useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) + newCredentials := lpEntity.Credentials{Username: "newUsername", Password: "newPassword1*"} + + t.Run("Correct login", func(t *testing.T) { + err := useCase.Run(context.Background(), oldCredentials, newCredentials) + require.NoError(t, err) + lpRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) + }) + t.Run("Incorrect login", func(t *testing.T) { + lpRepository.Mock.Calls = []mock.Call{} + incorrectCredentials := lpEntity.Credentials{Username: "oldUsernameIncorrect", Password: "oldPassword123!+"} + err := useCase.Run(context.Background(), incorrectCredentials, newCredentials) + require.ErrorIs(t, err, liquidity_provider.BadLoginError) + lpRepository.AssertCalled(t, "GetCredentials", test.AnyCtx) + }) +} + +func TestSetCredentialsUseCase_Run_DefaultCredentials(t *testing.T) { + const defaultPassword = "defaultPassword1234*" + var waitGroup sync.WaitGroup + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() + lpRepository.On( + "UpsertCredentials", + test.AnyCtx, + mock.MatchedBy(func(credentials entities.Signed[lpEntity.HashedCredentials]) bool { + const expectedLength = 64 + // we cant assert the exact value because the salt is random + return len(credentials.Value.HashedUsername) == expectedLength && + len(credentials.Value.HashedPassword) == expectedLength && + len(credentials.Value.UsernameSalt) == expectedLength && + len(credentials.Value.PasswordSalt) == expectedLength && + credentials.Signature == "04030201" && + credentials.Hash == "01020304" + })). + Return(nil).Once() + eventBus := &mocks.EventBusMock{} + defaultPasswordChannel := make(chan entities.Event, 1) + eventBus.On("Subscribe", lpEntity.DefaultCredentialsSetEventId).Return((<-chan entities.Event)(defaultPasswordChannel)).Once() + walletMock := &mocks.RskWalletMock{} + walletMock.On("SignBytes", mock.Anything).Return([]byte{4, 3, 2, 1}, nil) + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{0x01, 0x02, 0x03, 0x04}).Once() + + useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) + newCredentials := lpEntity.Credentials{Username: "newUsername", Password: "newPassword1*"} + waitGroup.Add(1) + go func(wg *sync.WaitGroup, eventChannel chan entities.Event) { + defer wg.Done() + eventChannel <- lpEntity.DefaultCredentialsSetEvent{ + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Password: defaultPassword, + } + }(&waitGroup, defaultPasswordChannel) + waitGroup.Wait() + + t.Run("Correct login", func(t *testing.T) { + defaultCredentials := lpEntity.Credentials{Username: "admin", Password: defaultPassword} + err := useCase.Run(context.Background(), defaultCredentials, newCredentials) + require.NoError(t, err) + lpRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) + }) + + t.Run("Incorrect login", func(t *testing.T) { + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() + incorrectCredentials := lpEntity.Credentials{Username: "oldUsernameIncorrect", Password: defaultPassword + "wrong"} + err := useCase.Run(context.Background(), incorrectCredentials, newCredentials) + require.ErrorIs(t, err, liquidity_provider.BadLoginError) + lpRepository.AssertExpectations(t) + }) +} + +func TestSetCredentialsUseCase_Run_InvalidPassword(t *testing.T) { + passwords := []string{ + "short", + "nouppercase!123", + "NOLOWERCASE**456", + "NoDigit!!#%qdasv", + "NoSpecialChar123", + "longeaa2bded32cc585d3f37c5319abe8890ad28a697ed66d5823f10536cc9c0fdb9eaa2bded32cc585d3f37c5319abe8890ad28a697ed66d5823f10536cc9c0fdb9", + } + + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Times(len(passwords)) + eventBus := &mocks.EventBusMock{} + eventBus.On("Subscribe", mock.Anything).Return((<-chan entities.Event)(make(chan entities.Event))).Once() + walletMock := &mocks.RskWalletMock{} + hashMock := &mocks.HashMock{} + useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) + + for _, password := range passwords { + newCredentials := lpEntity.Credentials{Username: "newUsername", Password: password} + err := useCase.Run(context.Background(), oldCredentials, newCredentials) + require.ErrorIs(t, err, utils.PasswordComplexityError) + } + hashMock.AssertNotCalled(t, "Hash") + walletMock.AssertNotCalled(t, "SignBytes") + lpRepository.AssertExpectations(t) +} + +func TestSetCredentialsUseCase_Run_ErrorHandling(t *testing.T) { + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + eventBus := &mocks.EventBusMock{} + eventBus.On("Subscribe", mock.Anything).Return((<-chan entities.Event)(make(chan entities.Event))).Once() + walletMock := &mocks.RskWalletMock{} + hashMock := &mocks.HashMock{} + hashMock.On("Hash", mock.Anything).Return([]byte{0x01, 0x02, 0x03, 0x04}) + useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) + newCredentials := lpEntity.Credentials{Username: test.AnyString, Password: test.AnyString + "A1*"} + + t.Run("GetCredentials error", func(t *testing.T) { + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, assert.AnError).Once() + err := useCase.Run(context.Background(), oldCredentials, newCredentials) + require.Error(t, err) + lpRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + walletMock.AssertNotCalled(t, "SignBytes") + hashMock.AssertNotCalled(t, "Hash") + }) + + t.Run("UpsertCredentials error", func(t *testing.T) { + walletMock.On("SignBytes", mock.Anything).Return([]byte{4, 3, 2, 1}, nil).Once() + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Once() + lpRepository.On("UpsertCredentials", test.AnyCtx, mock.Anything).Return(assert.AnError).Once() + err := useCase.Run(context.Background(), oldCredentials, newCredentials) + require.Error(t, err) + lpRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) + }) + + t.Run("SignBytes error", func(t *testing.T) { + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Once() + walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError).Once() + err := useCase.Run(context.Background(), oldCredentials, newCredentials) + require.Error(t, err) + lpRepository.AssertExpectations(t) + eventBus.AssertExpectations(t) + walletMock.AssertExpectations(t) + hashMock.AssertExpectations(t) + }) +} diff --git a/internal/usecases/liquidity_provider/set_general_config_test.go b/internal/usecases/liquidity_provider/set_general_config_test.go index a6ebf1df..6043a5f9 100644 --- a/internal/usecases/liquidity_provider/set_general_config_test.go +++ b/internal/usecases/liquidity_provider/set_general_config_test.go @@ -23,7 +23,7 @@ func TestSetGeneralConfigUseCase_Run(t *testing.T) { Hash: "040506", } - lpRepository := &mocks.LpRepositoryMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} lpRepository.On("UpsertGeneralConfiguration", test.AnyCtx, config).Return(nil) walletMock := &mocks.RskWalletMock{} walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) @@ -52,18 +52,18 @@ func TestSetGeneralConfigUseCase_Run_ErrorHandling(t *testing.T) { hashMock := &mocks.HashMock{} hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) - errorSetups := []func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock){ - func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + errorSetups := []func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock){ + func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock) { walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError) }, - func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock) { walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) lpRepository.On("UpsertGeneralConfiguration", test.AnyCtx, config).Return(assert.AnError) }, } for _, errorSetup := range errorSetups { - lpRepository := &mocks.LpRepositoryMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} walletMock := &mocks.RskWalletMock{} errorSetup(lpRepository, walletMock) useCase := liquidity_provider.NewSetGeneralConfigUseCase(lpRepository, walletMock, hashMock.Hash) diff --git a/internal/usecases/liquidity_provider/set_pegin_config_test.go b/internal/usecases/liquidity_provider/set_pegin_config_test.go index 7f800148..a3045d11 100644 --- a/internal/usecases/liquidity_provider/set_pegin_config_test.go +++ b/internal/usecases/liquidity_provider/set_pegin_config_test.go @@ -27,7 +27,7 @@ var peginConfigMock = entities.Signed[lp.PeginConfiguration]{ } func TestSetPeginConfigUseCase_Run(t *testing.T) { - lpRepository := &mocks.LpRepositoryMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} lpRepository.On("UpsertPeginConfiguration", test.AnyCtx, peginConfigMock).Return(nil) walletMock := &mocks.RskWalletMock{} walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) @@ -47,18 +47,18 @@ func TestSetPeginConfigUseCase_Run_ErrorHandling(t *testing.T) { hashMock := &mocks.HashMock{} hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) - errorSetups := []func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock){ - func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + errorSetups := []func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock){ + func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock) { walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError) }, - func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock) { walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) lpRepository.On("UpsertPeginConfiguration", test.AnyCtx, peginConfigMock).Return(assert.AnError) }, } for _, errorSetup := range errorSetups { - lpRepository := &mocks.LpRepositoryMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} walletMock := &mocks.RskWalletMock{} errorSetup(lpRepository, walletMock) useCase := liquidity_provider.NewSetPeginConfigUseCase(lpRepository, walletMock, hashMock.Hash) diff --git a/internal/usecases/liquidity_provider/set_pegout_config_test.go b/internal/usecases/liquidity_provider/set_pegout_config_test.go index 654101f9..20c29c41 100644 --- a/internal/usecases/liquidity_provider/set_pegout_config_test.go +++ b/internal/usecases/liquidity_provider/set_pegout_config_test.go @@ -28,7 +28,7 @@ var pegoutConfigMock = entities.Signed[lp.PegoutConfiguration]{ } func TestSetPegoutConfigUseCase_Run(t *testing.T) { - lpRepository := &mocks.LpRepositoryMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} lpRepository.On("UpsertPegoutConfiguration", test.AnyCtx, pegoutConfigMock).Return(nil) walletMock := &mocks.RskWalletMock{} walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) @@ -48,18 +48,18 @@ func TestSetPegoutConfigUseCase_Run_ErrorHandling(t *testing.T) { hashMock := &mocks.HashMock{} hashMock.On("Hash", mock.Anything).Return([]byte{4, 5, 6}) - errorSetups := []func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock){ - func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + errorSetups := []func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock){ + func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock) { walletMock.On("SignBytes", mock.Anything).Return(nil, assert.AnError) }, - func(lpRepository *mocks.LpRepositoryMock, walletMock *mocks.RskWalletMock) { + func(lpRepository *mocks.LiquidityProviderRepositoryMock, walletMock *mocks.RskWalletMock) { walletMock.On("SignBytes", mock.Anything).Return([]byte{1, 2, 3}, nil) lpRepository.On("UpsertPegoutConfiguration", test.AnyCtx, pegoutConfigMock).Return(assert.AnError) }, } for _, errorSetup := range errorSetups { - lpRepository := &mocks.LpRepositoryMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} walletMock := &mocks.RskWalletMock{} errorSetup(lpRepository, walletMock) useCase := liquidity_provider.NewSetPegoutConfigUseCase(lpRepository, walletMock, hashMock.Hash) diff --git a/pkg/liquidity_provider.go b/pkg/liquidity_provider.go index 4e715756..c8d3902d 100644 --- a/pkg/liquidity_provider.go +++ b/pkg/liquidity_provider.go @@ -39,3 +39,15 @@ type PegoutConfigurationRequest struct { type GeneralConfigurationRequest struct { Configuration *liquidity_provider.GeneralConfiguration `json:"configuration" validate:"required"` } + +type LoginRequest struct { + Username string `json:"username" validate:"required"` + Password string `json:"password" validate:"required"` +} + +type CredentialsUpdateRequest struct { + OldUsername string `json:"oldUsername" validate:"required"` + OldPassword string `json:"oldPassword" validate:"required"` + NewUsername string `json:"newUsername" validate:"required"` + NewPassword string `json:"newPassword" validate:"required"` +} diff --git a/test/mocks/default_password_provider_mock.go b/test/mocks/default_password_provider_mock.go new file mode 100644 index 00000000..b227b53d --- /dev/null +++ b/test/mocks/default_password_provider_mock.go @@ -0,0 +1,209 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + entities "github.com/rsksmart/liquidity-provider-server/internal/entities" + entitiesliquidity_provider "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + + mock "github.com/stretchr/testify/mock" +) + +// DefaultPasswordProviderMock is an autogenerated mock type for the DefaultPasswordProvider type +type DefaultPasswordProviderMock struct { + mock.Mock +} + +type DefaultPasswordProviderMock_Expecter struct { + mock *mock.Mock +} + +func (_m *DefaultPasswordProviderMock) EXPECT() *DefaultPasswordProviderMock_Expecter { + return &DefaultPasswordProviderMock_Expecter{mock: &_m.Mock} +} + +// DefaultPassword provides a mock function with given fields: +func (_m *DefaultPasswordProviderMock) DefaultPassword() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for DefaultPassword") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// DefaultPasswordProviderMock_DefaultPassword_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DefaultPassword' +type DefaultPasswordProviderMock_DefaultPassword_Call struct { + *mock.Call +} + +// DefaultPassword is a helper method to define mock.On call +func (_e *DefaultPasswordProviderMock_Expecter) DefaultPassword() *DefaultPasswordProviderMock_DefaultPassword_Call { + return &DefaultPasswordProviderMock_DefaultPassword_Call{Call: _e.mock.On("DefaultPassword")} +} + +func (_c *DefaultPasswordProviderMock_DefaultPassword_Call) Run(run func()) *DefaultPasswordProviderMock_DefaultPassword_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DefaultPasswordProviderMock_DefaultPassword_Call) Return(_a0 string) *DefaultPasswordProviderMock_DefaultPassword_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DefaultPasswordProviderMock_DefaultPassword_Call) RunAndReturn(run func() string) *DefaultPasswordProviderMock_DefaultPassword_Call { + _c.Call.Return(run) + return _c +} + +// GetDefaultPasswordChannel provides a mock function with given fields: +func (_m *DefaultPasswordProviderMock) GetDefaultPasswordChannel() <-chan entities.Event { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetDefaultPasswordChannel") + } + + var r0 <-chan entities.Event + if rf, ok := ret.Get(0).(func() <-chan entities.Event); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan entities.Event) + } + } + + return r0 +} + +// DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDefaultPasswordChannel' +type DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call struct { + *mock.Call +} + +// GetDefaultPasswordChannel is a helper method to define mock.On call +func (_e *DefaultPasswordProviderMock_Expecter) GetDefaultPasswordChannel() *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { + return &DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call{Call: _e.mock.On("GetDefaultPasswordChannel")} +} + +func (_c *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call) Run(run func()) *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call) Return(_a0 <-chan entities.Event) *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call) RunAndReturn(run func() <-chan entities.Event) *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { + _c.Call.Return(run) + return _c +} + +// LiquidityProviderRepository provides a mock function with given fields: +func (_m *DefaultPasswordProviderMock) LiquidityProviderRepository() entitiesliquidity_provider.LiquidityProviderRepository { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for LiquidityProviderRepository") + } + + var r0 entitiesliquidity_provider.LiquidityProviderRepository + if rf, ok := ret.Get(0).(func() entitiesliquidity_provider.LiquidityProviderRepository); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(entitiesliquidity_provider.LiquidityProviderRepository) + } + } + + return r0 +} + +// DefaultPasswordProviderMock_LiquidityProviderRepository_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LiquidityProviderRepository' +type DefaultPasswordProviderMock_LiquidityProviderRepository_Call struct { + *mock.Call +} + +// LiquidityProviderRepository is a helper method to define mock.On call +func (_e *DefaultPasswordProviderMock_Expecter) LiquidityProviderRepository() *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { + return &DefaultPasswordProviderMock_LiquidityProviderRepository_Call{Call: _e.mock.On("LiquidityProviderRepository")} +} + +func (_c *DefaultPasswordProviderMock_LiquidityProviderRepository_Call) Run(run func()) *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DefaultPasswordProviderMock_LiquidityProviderRepository_Call) Return(_a0 entitiesliquidity_provider.LiquidityProviderRepository) *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DefaultPasswordProviderMock_LiquidityProviderRepository_Call) RunAndReturn(run func() entitiesliquidity_provider.LiquidityProviderRepository) *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { + _c.Call.Return(run) + return _c +} + +// SetDefaultPassword provides a mock function with given fields: password +func (_m *DefaultPasswordProviderMock) SetDefaultPassword(password string) { + _m.Called(password) +} + +// DefaultPasswordProviderMock_SetDefaultPassword_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDefaultPassword' +type DefaultPasswordProviderMock_SetDefaultPassword_Call struct { + *mock.Call +} + +// SetDefaultPassword is a helper method to define mock.On call +// - password string +func (_e *DefaultPasswordProviderMock_Expecter) SetDefaultPassword(password interface{}) *DefaultPasswordProviderMock_SetDefaultPassword_Call { + return &DefaultPasswordProviderMock_SetDefaultPassword_Call{Call: _e.mock.On("SetDefaultPassword", password)} +} + +func (_c *DefaultPasswordProviderMock_SetDefaultPassword_Call) Run(run func(password string)) *DefaultPasswordProviderMock_SetDefaultPassword_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *DefaultPasswordProviderMock_SetDefaultPassword_Call) Return() *DefaultPasswordProviderMock_SetDefaultPassword_Call { + _c.Call.Return() + return _c +} + +func (_c *DefaultPasswordProviderMock_SetDefaultPassword_Call) RunAndReturn(run func(string)) *DefaultPasswordProviderMock_SetDefaultPassword_Call { + _c.Call.Return(run) + return _c +} + +// NewDefaultPasswordProviderMock creates a new instance of DefaultPasswordProviderMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDefaultPasswordProviderMock(t interface { + mock.TestingT + Cleanup(func()) +}) *DefaultPasswordProviderMock { + mock := &DefaultPasswordProviderMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/event_bus_mock.go b/test/mocks/event_bus_mock.go index 31d8c36f..c14a4ce9 100644 --- a/test/mocks/event_bus_mock.go +++ b/test/mocks/event_bus_mock.go @@ -27,3 +27,12 @@ type EventBusMock struct { func (m *EventBusMock) Publish(event entities.Event) { m.Called(event) } + +func (m *EventBusMock) Subscribe(eventId entities.EventId) <-chan entities.Event { + args := m.Called(eventId) + return args.Get(0).(<-chan entities.Event) +} + +func (m *EventBusMock) Shutdown(shutdownChannel chan<- bool) { + m.Called(shutdownChannel) +} diff --git a/test/mocks/liquidity_provider_repository_mock.go b/test/mocks/liquidity_provider_repository_mock.go index c07a0f1b..f262afa2 100644 --- a/test/mocks/liquidity_provider_repository_mock.go +++ b/test/mocks/liquidity_provider_repository_mock.go @@ -1,43 +1,459 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + package mocks import ( - "context" - "github.com/rsksmart/liquidity-provider-server/internal/entities" - lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" - "github.com/stretchr/testify/mock" + context "context" + + entities "github.com/rsksmart/liquidity-provider-server/internal/entities" + liquidity_provider "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + + mock "github.com/stretchr/testify/mock" ) -type LpRepositoryMock struct { +// LiquidityProviderRepositoryMock is an autogenerated mock type for the LiquidityProviderRepository type +type LiquidityProviderRepositoryMock struct { mock.Mock - lp.LiquidityProviderRepository } -func (m *LpRepositoryMock) GeneralConfiguration(ctx context.Context) (*entities.Signed[lp.GeneralConfiguration], error) { - args := m.Called(ctx) - return args.Get(0).(*entities.Signed[lp.GeneralConfiguration]), args.Error(1) +type LiquidityProviderRepositoryMock_Expecter struct { + mock *mock.Mock +} + +func (_m *LiquidityProviderRepositoryMock) EXPECT() *LiquidityProviderRepositoryMock_Expecter { + return &LiquidityProviderRepositoryMock_Expecter{mock: &_m.Mock} +} + +// GetCredentials provides a mock function with given fields: ctx +func (_m *LiquidityProviderRepositoryMock) GetCredentials(ctx context.Context) (*entities.Signed[liquidity_provider.HashedCredentials], error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetCredentials") + } + + var r0 *entities.Signed[liquidity_provider.HashedCredentials] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*entities.Signed[liquidity_provider.HashedCredentials], error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *entities.Signed[liquidity_provider.HashedCredentials]); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Signed[liquidity_provider.HashedCredentials]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LiquidityProviderRepositoryMock_GetCredentials_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCredentials' +type LiquidityProviderRepositoryMock_GetCredentials_Call struct { + *mock.Call +} + +// GetCredentials is a helper method to define mock.On call +// - ctx context.Context +func (_e *LiquidityProviderRepositoryMock_Expecter) GetCredentials(ctx interface{}) *LiquidityProviderRepositoryMock_GetCredentials_Call { + return &LiquidityProviderRepositoryMock_GetCredentials_Call{Call: _e.mock.On("GetCredentials", ctx)} +} + +func (_c *LiquidityProviderRepositoryMock_GetCredentials_Call) Run(run func(ctx context.Context)) *LiquidityProviderRepositoryMock_GetCredentials_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_GetCredentials_Call) Return(_a0 *entities.Signed[liquidity_provider.HashedCredentials], _a1 error) *LiquidityProviderRepositoryMock_GetCredentials_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_GetCredentials_Call) RunAndReturn(run func(context.Context) (*entities.Signed[liquidity_provider.HashedCredentials], error)) *LiquidityProviderRepositoryMock_GetCredentials_Call { + _c.Call.Return(run) + return _c +} + +// GetGeneralConfiguration provides a mock function with given fields: ctx +func (_m *LiquidityProviderRepositoryMock) GetGeneralConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.GeneralConfiguration], error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetGeneralConfiguration") + } + + var r0 *entities.Signed[liquidity_provider.GeneralConfiguration] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*entities.Signed[liquidity_provider.GeneralConfiguration], error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *entities.Signed[liquidity_provider.GeneralConfiguration]); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Signed[liquidity_provider.GeneralConfiguration]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetGeneralConfiguration' +type LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call struct { + *mock.Call +} + +// GetGeneralConfiguration is a helper method to define mock.On call +// - ctx context.Context +func (_e *LiquidityProviderRepositoryMock_Expecter) GetGeneralConfiguration(ctx interface{}) *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call { + return &LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call{Call: _e.mock.On("GetGeneralConfiguration", ctx)} } -func (m *LpRepositoryMock) PeginConfiguration(ctx context.Context) (*entities.Signed[lp.PeginConfiguration], error) { - args := m.Called(ctx) - return args.Get(0).(*entities.Signed[lp.PeginConfiguration]), args.Error(1) +func (_c *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call) Run(run func(ctx context.Context)) *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c } -func (m *LpRepositoryMock) PegoutConfiguration(ctx context.Context) (*entities.Signed[lp.PegoutConfiguration], error) { - args := m.Called(ctx) - return args.Get(0).(*entities.Signed[lp.PegoutConfiguration]), args.Error(1) +func (_c *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call) Return(_a0 *entities.Signed[liquidity_provider.GeneralConfiguration], _a1 error) *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call { + _c.Call.Return(_a0, _a1) + return _c } -func (m *LpRepositoryMock) UpsertGeneralConfiguration(ctx context.Context, config entities.Signed[lp.GeneralConfiguration]) error { - args := m.Called(ctx, config) - return args.Error(0) +func (_c *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call) RunAndReturn(run func(context.Context) (*entities.Signed[liquidity_provider.GeneralConfiguration], error)) *LiquidityProviderRepositoryMock_GetGeneralConfiguration_Call { + _c.Call.Return(run) + return _c } -func (m *LpRepositoryMock) UpsertPeginConfiguration(ctx context.Context, config entities.Signed[lp.PeginConfiguration]) error { - args := m.Called(ctx, config) - return args.Error(0) +// GetPeginConfiguration provides a mock function with given fields: ctx +func (_m *LiquidityProviderRepositoryMock) GetPeginConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.PeginConfiguration], error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetPeginConfiguration") + } + + var r0 *entities.Signed[liquidity_provider.PeginConfiguration] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*entities.Signed[liquidity_provider.PeginConfiguration], error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *entities.Signed[liquidity_provider.PeginConfiguration]); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Signed[liquidity_provider.PeginConfiguration]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LiquidityProviderRepositoryMock_GetPeginConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPeginConfiguration' +type LiquidityProviderRepositoryMock_GetPeginConfiguration_Call struct { + *mock.Call +} + +// GetPeginConfiguration is a helper method to define mock.On call +// - ctx context.Context +func (_e *LiquidityProviderRepositoryMock_Expecter) GetPeginConfiguration(ctx interface{}) *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call { + return &LiquidityProviderRepositoryMock_GetPeginConfiguration_Call{Call: _e.mock.On("GetPeginConfiguration", ctx)} } -func (m *LpRepositoryMock) UpsertPegoutConfiguration(ctx context.Context, config entities.Signed[lp.PegoutConfiguration]) error { - args := m.Called(ctx, config) - return args.Error(0) +func (_c *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call) Run(run func(ctx context.Context)) *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call) Return(_a0 *entities.Signed[liquidity_provider.PeginConfiguration], _a1 error) *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call) RunAndReturn(run func(context.Context) (*entities.Signed[liquidity_provider.PeginConfiguration], error)) *LiquidityProviderRepositoryMock_GetPeginConfiguration_Call { + _c.Call.Return(run) + return _c +} + +// GetPegoutConfiguration provides a mock function with given fields: ctx +func (_m *LiquidityProviderRepositoryMock) GetPegoutConfiguration(ctx context.Context) (*entities.Signed[liquidity_provider.PegoutConfiguration], error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetPegoutConfiguration") + } + + var r0 *entities.Signed[liquidity_provider.PegoutConfiguration] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*entities.Signed[liquidity_provider.PegoutConfiguration], error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *entities.Signed[liquidity_provider.PegoutConfiguration]); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Signed[liquidity_provider.PegoutConfiguration]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPegoutConfiguration' +type LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call struct { + *mock.Call +} + +// GetPegoutConfiguration is a helper method to define mock.On call +// - ctx context.Context +func (_e *LiquidityProviderRepositoryMock_Expecter) GetPegoutConfiguration(ctx interface{}) *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call { + return &LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call{Call: _e.mock.On("GetPegoutConfiguration", ctx)} +} + +func (_c *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call) Run(run func(ctx context.Context)) *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call) Return(_a0 *entities.Signed[liquidity_provider.PegoutConfiguration], _a1 error) *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call) RunAndReturn(run func(context.Context) (*entities.Signed[liquidity_provider.PegoutConfiguration], error)) *LiquidityProviderRepositoryMock_GetPegoutConfiguration_Call { + _c.Call.Return(run) + return _c +} + +// UpsertCredentials provides a mock function with given fields: ctx, credentials +func (_m *LiquidityProviderRepositoryMock) UpsertCredentials(ctx context.Context, credentials entities.Signed[liquidity_provider.HashedCredentials]) error { + ret := _m.Called(ctx, credentials) + + if len(ret) == 0 { + panic("no return value specified for UpsertCredentials") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, entities.Signed[liquidity_provider.HashedCredentials]) error); ok { + r0 = rf(ctx, credentials) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// LiquidityProviderRepositoryMock_UpsertCredentials_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpsertCredentials' +type LiquidityProviderRepositoryMock_UpsertCredentials_Call struct { + *mock.Call +} + +// UpsertCredentials is a helper method to define mock.On call +// - ctx context.Context +// - credentials entities.Signed[liquidity_provider.HashedCredentials] +func (_e *LiquidityProviderRepositoryMock_Expecter) UpsertCredentials(ctx interface{}, credentials interface{}) *LiquidityProviderRepositoryMock_UpsertCredentials_Call { + return &LiquidityProviderRepositoryMock_UpsertCredentials_Call{Call: _e.mock.On("UpsertCredentials", ctx, credentials)} +} + +func (_c *LiquidityProviderRepositoryMock_UpsertCredentials_Call) Run(run func(ctx context.Context, credentials entities.Signed[liquidity_provider.HashedCredentials])) *LiquidityProviderRepositoryMock_UpsertCredentials_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(entities.Signed[liquidity_provider.HashedCredentials])) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertCredentials_Call) Return(_a0 error) *LiquidityProviderRepositoryMock_UpsertCredentials_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertCredentials_Call) RunAndReturn(run func(context.Context, entities.Signed[liquidity_provider.HashedCredentials]) error) *LiquidityProviderRepositoryMock_UpsertCredentials_Call { + _c.Call.Return(run) + return _c +} + +// UpsertGeneralConfiguration provides a mock function with given fields: ctx, configuration +func (_m *LiquidityProviderRepositoryMock) UpsertGeneralConfiguration(ctx context.Context, configuration entities.Signed[liquidity_provider.GeneralConfiguration]) error { + ret := _m.Called(ctx, configuration) + + if len(ret) == 0 { + panic("no return value specified for UpsertGeneralConfiguration") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, entities.Signed[liquidity_provider.GeneralConfiguration]) error); ok { + r0 = rf(ctx, configuration) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpsertGeneralConfiguration' +type LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call struct { + *mock.Call +} + +// UpsertGeneralConfiguration is a helper method to define mock.On call +// - ctx context.Context +// - configuration entities.Signed[liquidity_provider.GeneralConfiguration] +func (_e *LiquidityProviderRepositoryMock_Expecter) UpsertGeneralConfiguration(ctx interface{}, configuration interface{}) *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call { + return &LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call{Call: _e.mock.On("UpsertGeneralConfiguration", ctx, configuration)} +} + +func (_c *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call) Run(run func(ctx context.Context, configuration entities.Signed[liquidity_provider.GeneralConfiguration])) *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(entities.Signed[liquidity_provider.GeneralConfiguration])) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call) Return(_a0 error) *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call) RunAndReturn(run func(context.Context, entities.Signed[liquidity_provider.GeneralConfiguration]) error) *LiquidityProviderRepositoryMock_UpsertGeneralConfiguration_Call { + _c.Call.Return(run) + return _c +} + +// UpsertPeginConfiguration provides a mock function with given fields: ctx, configuration +func (_m *LiquidityProviderRepositoryMock) UpsertPeginConfiguration(ctx context.Context, configuration entities.Signed[liquidity_provider.PeginConfiguration]) error { + ret := _m.Called(ctx, configuration) + + if len(ret) == 0 { + panic("no return value specified for UpsertPeginConfiguration") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, entities.Signed[liquidity_provider.PeginConfiguration]) error); ok { + r0 = rf(ctx, configuration) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpsertPeginConfiguration' +type LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call struct { + *mock.Call +} + +// UpsertPeginConfiguration is a helper method to define mock.On call +// - ctx context.Context +// - configuration entities.Signed[liquidity_provider.PeginConfiguration] +func (_e *LiquidityProviderRepositoryMock_Expecter) UpsertPeginConfiguration(ctx interface{}, configuration interface{}) *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call { + return &LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call{Call: _e.mock.On("UpsertPeginConfiguration", ctx, configuration)} +} + +func (_c *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call) Run(run func(ctx context.Context, configuration entities.Signed[liquidity_provider.PeginConfiguration])) *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(entities.Signed[liquidity_provider.PeginConfiguration])) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call) Return(_a0 error) *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call) RunAndReturn(run func(context.Context, entities.Signed[liquidity_provider.PeginConfiguration]) error) *LiquidityProviderRepositoryMock_UpsertPeginConfiguration_Call { + _c.Call.Return(run) + return _c +} + +// UpsertPegoutConfiguration provides a mock function with given fields: ctx, configuration +func (_m *LiquidityProviderRepositoryMock) UpsertPegoutConfiguration(ctx context.Context, configuration entities.Signed[liquidity_provider.PegoutConfiguration]) error { + ret := _m.Called(ctx, configuration) + + if len(ret) == 0 { + panic("no return value specified for UpsertPegoutConfiguration") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, entities.Signed[liquidity_provider.PegoutConfiguration]) error); ok { + r0 = rf(ctx, configuration) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpsertPegoutConfiguration' +type LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call struct { + *mock.Call +} + +// UpsertPegoutConfiguration is a helper method to define mock.On call +// - ctx context.Context +// - configuration entities.Signed[liquidity_provider.PegoutConfiguration] +func (_e *LiquidityProviderRepositoryMock_Expecter) UpsertPegoutConfiguration(ctx interface{}, configuration interface{}) *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call { + return &LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call{Call: _e.mock.On("UpsertPegoutConfiguration", ctx, configuration)} +} + +func (_c *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call) Run(run func(ctx context.Context, configuration entities.Signed[liquidity_provider.PegoutConfiguration])) *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(entities.Signed[liquidity_provider.PegoutConfiguration])) + }) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call) Return(_a0 error) *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call) RunAndReturn(run func(context.Context, entities.Signed[liquidity_provider.PegoutConfiguration]) error) *LiquidityProviderRepositoryMock_UpsertPegoutConfiguration_Call { + _c.Call.Return(run) + return _c +} + +// NewLiquidityProviderRepositoryMock creates a new instance of LiquidityProviderRepositoryMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLiquidityProviderRepositoryMock(t interface { + mock.TestingT + Cleanup(func()) +}) *LiquidityProviderRepositoryMock { + mock := &LiquidityProviderRepositoryMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock } diff --git a/test/mocks/rpc_client_mock.go b/test/mocks/rpc_client_mock.go index 7c439598..0125d8bf 100644 --- a/test/mocks/rpc_client_mock.go +++ b/test/mocks/rpc_client_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.42.0. DO NOT EDIT. +// Code generated by mockery v2.42.1. DO NOT EDIT. package mocks diff --git a/test/mocks/ses_client_mock.go b/test/mocks/ses_client_mock.go index 1e7a93f2..a5c4c900 100644 --- a/test/mocks/ses_client_mock.go +++ b/test/mocks/ses_client_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.42.0. DO NOT EDIT. +// Code generated by mockery v2.42.1. DO NOT EDIT. package mocks diff --git a/test/utils.go b/test/utils.go index 788c8707..4e4ff144 100644 --- a/test/utils.go +++ b/test/utils.go @@ -10,6 +10,7 @@ var AnyCtx = mock.AnythingOfType("context.backgroundCtx") const ( AnyAddress = "any address" + AnyString = "any value" ) type Case[V, R any] struct { From 7e0caebcdfa065bfd847fda2b003c2c8e6736d56 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 11 Apr 2024 12:01:24 +0200 Subject: [PATCH 042/113] fix: rename fake pwd vars to pass sonar warning --- internal/entities/utils/passwords_test.go | 28 +++++++++---------- .../liquidity_provider/common_test.go | 18 ++++++------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/internal/entities/utils/passwords_test.go b/internal/entities/utils/passwords_test.go index d233b6b5..889caf11 100644 --- a/internal/entities/utils/passwords_test.go +++ b/internal/entities/utils/passwords_test.go @@ -140,29 +140,29 @@ func TestPasswordDigitRule(t *testing.T) { func TestCheckPasswordComplexity(t *testing.T) { rules := utils.DefaultPasswordValidationRuleset() - noDigitPassword := "NoDigitPassword!" - noSpecialCharPassword := "NoSpecialCharPassword1" - noUpperCasePassword := "nouppercasepassword1!" - noLowerCasePassword := "NOLOWERCASEPASSWORD1!" - tooShortPassword := "Short1!" + noDigitFakePassword := "NoDigitPassword!" + noSpecialCharFakePassword := "NoSpecialCharPassword1" + noUpperCaseFakePassword := "nouppercasepassword1!" + noLowerCaseFakePassword := "NOLOWERCASEPASSWORD1!" + tooShortFakePassword := "Short1!" // this is not a credential of anything, they are two sha256 hashes concatenated + 1 extra char // nolint:gosec - tooLongPassword := "E7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068e7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068!" - validPassword := "ValidPassword1!" + tooLongFakePassword := "E7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068e7930fa7a7891cfb9c9338f38de6086705801a1ce64d540ea8d3fcb5ab1e3068!" + validFakePassword := "ValidPassword1!" - err := utils.CheckPasswordComplexity(noDigitPassword, rules...) + err := utils.CheckPasswordComplexity(noDigitFakePassword, rules...) require.ErrorContains(t, err, "password must contain at least one digit") - err = utils.CheckPasswordComplexity(noSpecialCharPassword, rules...) + err = utils.CheckPasswordComplexity(noSpecialCharFakePassword, rules...) require.ErrorContains(t, err, "password must contain at least one special character") - err = utils.CheckPasswordComplexity(noUpperCasePassword, rules...) + err = utils.CheckPasswordComplexity(noUpperCaseFakePassword, rules...) require.ErrorContains(t, err, "password must contain at least one uppercase character") - err = utils.CheckPasswordComplexity(noLowerCasePassword, rules...) + err = utils.CheckPasswordComplexity(noLowerCaseFakePassword, rules...) require.ErrorContains(t, err, "password must contain at least one lowercase character") - err = utils.CheckPasswordComplexity(tooShortPassword, rules...) + err = utils.CheckPasswordComplexity(tooShortFakePassword, rules...) require.ErrorContains(t, err, "password is too short") - err = utils.CheckPasswordComplexity(tooLongPassword, rules...) + err = utils.CheckPasswordComplexity(tooLongFakePassword, rules...) require.ErrorContains(t, err, "password is too long") - err = utils.CheckPasswordComplexity(validPassword, rules...) + err = utils.CheckPasswordComplexity(validFakePassword, rules...) require.NoError(t, err) require.Len(t, rules, 5) } diff --git a/internal/usecases/liquidity_provider/common_test.go b/internal/usecases/liquidity_provider/common_test.go index e582fe5f..b8c369fd 100644 --- a/internal/usecases/liquidity_provider/common_test.go +++ b/internal/usecases/liquidity_provider/common_test.go @@ -17,7 +17,7 @@ import ( // not a password, only a random hash // nolint:gosec -const mockDefaultPassword = "2071bae7f92c6272f614e40d57272518480c48fb4c7a4c39525fdc14e6c97c1d" +const mockDefaultFakePassword = "2071bae7f92c6272f614e40d57272518480c48fb4c7a4c39525fdc14e6c97c1d" func TestValidateConfiguredProvider(t *testing.T) { lbc := &mocks.LbcMock{} @@ -94,15 +94,15 @@ func TestReadDefaultPassword_NotRead(t *testing.T) { passwordChannel := make(chan entities.Event, 1) passwordChannel <- lpEntity.DefaultCredentialsSetEvent{ Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: mockDefaultPassword, + Password: mockDefaultFakePassword, } passwordProvider := &mocks.DefaultPasswordProviderMock{} passwordProvider.On("DefaultPassword").Return("").Once() passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() - passwordProvider.On("SetDefaultPassword", mockDefaultPassword).Return().Once() - passwordProvider.On("DefaultPassword").Return(mockDefaultPassword).Once() + passwordProvider.On("SetDefaultPassword", mockDefaultFakePassword).Return().Once() + passwordProvider.On("DefaultPassword").Return(mockDefaultFakePassword).Once() password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) - assert.Equal(t, mockDefaultPassword, password) + assert.Equal(t, mockDefaultFakePassword, password) require.NoError(t, err) passwordProvider.AssertExpectations(t) } @@ -138,7 +138,7 @@ func TestReadDefaultPassword_ErroHandling(t *testing.T) { func TestValidateCredentials_DefaultCredentials(t *testing.T) { credentials := lpEntity.Credentials{ Username: "admin", - Password: mockDefaultPassword, + Password: mockDefaultFakePassword, } lpRepository := &mocks.LiquidityProviderRepositoryMock{} passwordProvider := &mocks.DefaultPasswordProviderMock{} @@ -256,12 +256,12 @@ func useDefaultPasswordSetUp( passwordChannel := make(chan entities.Event, 1) passwordChannel <- lpEntity.DefaultCredentialsSetEvent{ Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: mockDefaultPassword, + Password: mockDefaultFakePassword, } passwordProvider.On("DefaultPassword").Return("").Once() passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() - passwordProvider.On("SetDefaultPassword", mockDefaultPassword).Return().Once() - passwordProvider.On("DefaultPassword").Return(mockDefaultPassword).Once() + passwordProvider.On("SetDefaultPassword", mockDefaultFakePassword).Return().Once() + passwordProvider.On("DefaultPassword").Return(mockDefaultFakePassword).Once() passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() } From f23d60abf32a38c9812e45436bce840496ef55a9 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 11 Apr 2024 16:19:18 +0200 Subject: [PATCH 043/113] fix: also hash in-memory credentials --- .mockery.yaml | 2 +- coverage/cover.out | 573 +++++++++--------- .../liquidity_provider/liquidity_provider.go | 2 +- .../usecases/liquidity_provider/common.go | 62 +- .../liquidity_provider/common_test.go | 110 ++-- .../generate_default_credentials.go | 20 +- .../generate_default_credentials_test.go | 18 +- internal/usecases/liquidity_provider/login.go | 12 +- .../usecases/liquidity_provider/login_test.go | 40 +- .../liquidity_provider/set_credentials.go | 14 +- .../set_credentials_test.go | 33 +- .../default_credentials_provider_mock.go | 210 +++++++ test/mocks/default_password_provider_mock.go | 209 ------- 13 files changed, 667 insertions(+), 638 deletions(-) create mode 100644 test/mocks/default_credentials_provider_mock.go delete mode 100644 test/mocks/default_password_provider_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index b449b06f..d1a5344e 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -12,7 +12,7 @@ packages: rpcClient: github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider: interfaces: - DefaultPasswordProvider: + DefaultCredentialsProvider: github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider: interfaces: LiquidityProviderRepository: \ No newline at end of file diff --git a/coverage/cover.out b/coverage/cover.out index a6f86f2b..ac4c3bd7 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -579,17 +579,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -607,9 +607,98 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 20 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -639,26 +728,26 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 @@ -676,9 +765,9 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 @@ -729,17 +818,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -757,38 +846,117 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 @@ -1147,174 +1315,6 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -3216,18 +3216,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 10 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 10 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 10 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 43 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 59 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 41 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 57 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 41 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 57 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -3267,9 +3267,9 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 12 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 12 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 @@ -3329,46 +3329,47 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:41.2,41.12 1 7 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:41.12,43.3 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:44.2,44.33 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:60.9,62.16 2 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:62.16,64.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:65.2,65.30 1 25 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:65.30,67.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:69.2,70.16 2 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:70.16,72.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:73.2,74.16 2 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:74.16,76.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:77.2,78.16 2 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:78.16,80.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:81.2,81.12 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:84.75,85.37 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:85.37,87.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:88.2,88.9 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:89.54,91.10 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:91.10,93.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:94.3,95.40 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:96.10,97.52 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:104.9,107.69 3 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:107.69,109.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:110.2,110.88 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:110.88,112.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:112.8,114.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:120.9,122.16 2 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:122.16,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:125.2,126.16 2 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:126.16,128.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:129.2,131.36 3 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:131.36,133.3 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:133.8,135.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:26.38,28.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:30.100,32.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:32.16,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:35.2,35.24 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:35.24,37.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:38.2,39.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:39.16,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:42.2,45.16 4 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:45.16,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:48.2,54.12 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:60.9,65.16 4 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:65.16,67.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:68.2,68.30 1 25 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:68.30,69.78 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:69.78,71.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:72.8,74.3 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:76.2,77.16 2 24 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:77.16,79.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:80.2,81.16 2 23 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:81.16,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:84.2,85.16 2 22 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:85.16,87.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:88.2,88.12 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:91.111,92.41 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:92.41,94.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:95.2,95.9 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:96.57,98.10 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:98.10,100.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:101.3,102.44 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:103.10,104.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:111.9,113.16 2 22 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:113.16,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:116.2,117.16 2 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:117.16,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:120.2,122.36 3 20 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:122.36,124.3 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:124.8,126.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:27.38,29.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:31.100,33.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:33.16,35.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:36.2,36.24 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:36.24,38.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:39.2,40.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:43.2,46.16 4 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:46.16,48.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:50.2,51.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:54.2,55.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:55.16,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:59.2,70.12 3 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.85,15.2 1 2 @@ -3380,9 +3381,9 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:25.71,27.3 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:28.2,28.12 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:31.107,33.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:35.80,37.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:39.66,41.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:43.55,45.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:35.83,37.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:39.103,41.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:43.89,45.2 1 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 @@ -3469,9 +3470,9 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:66.86,68.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:69.2,69.12 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:72.116,74.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:76.89,78.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:80.75,82.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:84.64,86.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:76.92,78.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:80.112,82.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:84.98,86.2 1 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:26.16,28.3 1 1 diff --git a/internal/entities/liquidity_provider/liquidity_provider.go b/internal/entities/liquidity_provider/liquidity_provider.go index 88817173..bdee70ac 100644 --- a/internal/entities/liquidity_provider/liquidity_provider.go +++ b/internal/entities/liquidity_provider/liquidity_provider.go @@ -103,5 +103,5 @@ type Credentials struct { type DefaultCredentialsSetEvent struct { entities.Event - Password string + Credentials *HashedCredentials } diff --git a/internal/usecases/liquidity_provider/common.go b/internal/usecases/liquidity_provider/common.go index f5328373..9c8478fd 100644 --- a/internal/usecases/liquidity_provider/common.go +++ b/internal/usecases/liquidity_provider/common.go @@ -15,7 +15,8 @@ import ( ) const ( - defaultUsername = "admin" + defaultUsername = "admin" + credentialSaltSize = 32 ) var BadLoginError = errors.New("incorrect username or credentials") @@ -44,73 +45,64 @@ func ValidateConfiguredProvider( return providers[index].Id, nil } -// DefaultPasswordProvider this is an interface to be implemented by those use case that require to use ValidateCredentials, +// DefaultCredentialsProvider this is an interface to be implemented by those use case that require to use ValidateCredentials, // since that function requires a way to access to the default password set by the application -type DefaultPasswordProvider interface { +type DefaultCredentialsProvider interface { LiquidityProviderRepository() liquidity_provider.LiquidityProviderRepository - GetDefaultPasswordChannel() <-chan entities.Event - SetDefaultPassword(password string) - DefaultPassword() string + GetDefaultCredentialsChannel() <-chan entities.Event + SetDefaultCredentials(password *liquidity_provider.HashedCredentials) + DefaultCredentials() *liquidity_provider.HashedCredentials } func ValidateCredentials( ctx context.Context, - useCase DefaultPasswordProvider, + useCase DefaultCredentialsProvider, credentials liquidity_provider.Credentials, ) error { + var credentialsToCompare liquidity_provider.HashedCredentials + var err error + storedCredentials, err := useCase.LiquidityProviderRepository().GetCredentials(ctx) if err != nil { return err } if storedCredentials == nil { - return validateDefaultCredentials(useCase, credentials) + if credentialsToCompare, err = ReadDefaultCredentials(useCase); err != nil { + return err + } + } else { + credentialsToCompare = storedCredentials.Value } - usernameHash, err := utils.HashArgon2(credentials.Username, storedCredentials.Value.UsernameSalt) + usernameHash, err := utils.HashArgon2(credentials.Username, credentialsToCompare.UsernameSalt) if err != nil { return err } - passwordHash, err := utils.HashArgon2(credentials.Password, storedCredentials.Value.PasswordSalt) + passwordHash, err := utils.HashArgon2(credentials.Password, credentialsToCompare.PasswordSalt) if err != nil { return err } - err = compareCredentials(usernameHash, passwordHash, storedCredentials.Value) + err = compareCredentials(usernameHash, passwordHash, credentialsToCompare) if err != nil { return err } return nil } -func ReadDefaultPassword(useCase DefaultPasswordProvider) (string, error) { - if useCase.DefaultPassword() != "" { - return useCase.DefaultPassword(), nil +func ReadDefaultCredentials(useCase DefaultCredentialsProvider) (liquidity_provider.HashedCredentials, error) { + if useCase.DefaultCredentials() != nil { + return *useCase.DefaultCredentials(), nil } select { - case event := <-useCase.GetDefaultPasswordChannel(): + case event := <-useCase.GetDefaultCredentialsChannel(): parsedEvent, ok := event.(liquidity_provider.DefaultCredentialsSetEvent) if !ok { - return "", errors.New("wrong event error") + return liquidity_provider.HashedCredentials{}, errors.New("wrong event error") } - useCase.SetDefaultPassword(parsedEvent.Password) - return useCase.DefaultPassword(), nil + useCase.SetDefaultCredentials(parsedEvent.Credentials) + return *useCase.DefaultCredentials(), nil default: - return "", errors.New("default password not set") - } -} - -func validateDefaultCredentials( - useCase DefaultPasswordProvider, - credentials liquidity_provider.Credentials, -) error { - var defaultPassword string - var err error - if defaultPassword, err = ReadDefaultPassword(useCase); err != nil { - return err - } - if credentials.Username == defaultUsername && credentials.Password == defaultPassword { - return nil - } else { - return BadLoginError + return liquidity_provider.HashedCredentials{}, errors.New("default password not set") } } diff --git a/internal/usecases/liquidity_provider/common_test.go b/internal/usecases/liquidity_provider/common_test.go index b8c369fd..41ee94d4 100644 --- a/internal/usecases/liquidity_provider/common_test.go +++ b/internal/usecases/liquidity_provider/common_test.go @@ -15,9 +15,13 @@ import ( "testing" ) -// not a password, only a random hash -// nolint:gosec -const mockDefaultFakePassword = "2071bae7f92c6272f614e40d57272518480c48fb4c7a4c39525fdc14e6c97c1d" +var defaultCredentialsMock = lpEntity.Credentials{Username: "admin", Password: "a default password"} +var hashedDefaultCredentialsMock = &lpEntity.HashedCredentials{ + HashedUsername: "e58faef24d13f93d99cb3c68e381d05d1e131029f90cbb1469ff99aa8b2ca8c2", + HashedPassword: "20cdf83f3e87da259cb72609bdcaa220d9a4c69135ce9d8dd39eb9dd738ee503", + UsernameSalt: "4948388a01e926807fd86a5f1c2426dba97030717001f5f9d7106950e03724b2", + PasswordSalt: "9baf3a40312f39849f46dad1040f2f039f1cffa1238c41e9db675315cfad39b6", +} func TestValidateConfiguredProvider(t *testing.T) { lbc := &mocks.LbcMock{} @@ -82,38 +86,44 @@ func TestValidateConfiguredProvider_Fail(t *testing.T) { } func TestReadDefaultPassword_AlreadyRead(t *testing.T) { - passwordProvider := &mocks.DefaultPasswordProviderMock{} - passwordProvider.On("DefaultPassword").Return(test.AnyString) - password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) - assert.Equal(t, test.AnyString, password) + credentialsProvider := &mocks.DefaultCredentialsProviderMock{} + credentials := &lpEntity.HashedCredentials{ + HashedUsername: test.AnyString, + HashedPassword: test.AnyString, + UsernameSalt: test.AnyString, + PasswordSalt: test.AnyString, + } + credentialsProvider.On("DefaultCredentials").Return(credentials) + defaultCredentials, err := liquidity_provider.ReadDefaultCredentials(credentialsProvider) + assert.Equal(t, *credentials, defaultCredentials) require.NoError(t, err) - passwordProvider.AssertExpectations(t) + credentialsProvider.AssertExpectations(t) } func TestReadDefaultPassword_NotRead(t *testing.T) { passwordChannel := make(chan entities.Event, 1) passwordChannel <- lpEntity.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: mockDefaultFakePassword, + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Credentials: hashedDefaultCredentialsMock, } - passwordProvider := &mocks.DefaultPasswordProviderMock{} - passwordProvider.On("DefaultPassword").Return("").Once() - passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() - passwordProvider.On("SetDefaultPassword", mockDefaultFakePassword).Return().Once() - passwordProvider.On("DefaultPassword").Return(mockDefaultFakePassword).Once() - password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) - assert.Equal(t, mockDefaultFakePassword, password) + defaultCredentialsProvider := &mocks.DefaultCredentialsProviderMock{} + defaultCredentialsProvider.On("DefaultCredentials").Return(nil).Once() + defaultCredentialsProvider.On("GetDefaultCredentialsChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + defaultCredentialsProvider.On("SetDefaultCredentials", hashedDefaultCredentialsMock).Return().Once() + defaultCredentialsProvider.On("DefaultCredentials").Return(hashedDefaultCredentialsMock).Once() + defaultCredentials, err := liquidity_provider.ReadDefaultCredentials(defaultCredentialsProvider) + assert.Equal(t, *hashedDefaultCredentialsMock, defaultCredentials) require.NoError(t, err) - passwordProvider.AssertExpectations(t) + defaultCredentialsProvider.AssertExpectations(t) } func TestReadDefaultPassword_ErroHandling(t *testing.T) { t.Run("Default passsword not set", func(t *testing.T) { passwordChannel := make(chan entities.Event, 1) - passwordProvider := &mocks.DefaultPasswordProviderMock{} - passwordProvider.On("DefaultPassword").Return("").Once() - passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() - password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) + passwordProvider := &mocks.DefaultCredentialsProviderMock{} + passwordProvider.On("DefaultCredentials").Return(nil).Once() + passwordProvider.On("GetDefaultCredentialsChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + password, err := liquidity_provider.ReadDefaultCredentials(passwordProvider) assert.Empty(t, password) require.ErrorContains(t, err, "default password not set") passwordProvider.AssertExpectations(t) @@ -125,10 +135,10 @@ func TestReadDefaultPassword_ErroHandling(t *testing.T) { Quote: quote.PeginQuote{}, RetainedQuote: quote.RetainedPeginQuote{}, } - passwordProvider := &mocks.DefaultPasswordProviderMock{} - passwordProvider.On("DefaultPassword").Return("").Once() - passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() - password, err := liquidity_provider.ReadDefaultPassword(passwordProvider) + passwordProvider := &mocks.DefaultCredentialsProviderMock{} + passwordProvider.On("DefaultCredentials").Return(nil).Once() + passwordProvider.On("GetDefaultCredentialsChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + password, err := liquidity_provider.ReadDefaultCredentials(passwordProvider) assert.Empty(t, password) require.ErrorContains(t, err, "wrong event error") passwordProvider.AssertExpectations(t) @@ -136,14 +146,10 @@ func TestReadDefaultPassword_ErroHandling(t *testing.T) { } func TestValidateCredentials_DefaultCredentials(t *testing.T) { - credentials := lpEntity.Credentials{ - Username: "admin", - Password: mockDefaultFakePassword, - } lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} useDefaultPasswordSetUp(lpRepository, passwordProvider) - err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) + err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, defaultCredentialsMock) require.NoError(t, err) passwordProvider.AssertExpectations(t) lpRepository.AssertExpectations(t) @@ -155,12 +161,12 @@ func TestValidateCredentials_DefaultCredentials_StoredCredentials(t *testing.T) Password: "MyFakeCredential1!", } lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} useStoredCredentialsSetUp(lpRepository, passwordProvider) err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) require.NoError(t, err) - passwordProvider.AssertNotCalled(t, "DefaultPassword") - passwordProvider.AssertNotCalled(t, "SetDefaultPassword") + passwordProvider.AssertNotCalled(t, "DefaultCredentials") + passwordProvider.AssertNotCalled(t, "SetDefaultCredentials") passwordProvider.AssertNotCalled(t, "DefaultPasswordChannel") passwordProvider.AssertExpectations(t) lpRepository.AssertExpectations(t) @@ -173,7 +179,7 @@ func TestValidateCredentials_Badlogin(t *testing.T) { Password: "wrong password", } lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} useDefaultPasswordSetUp(lpRepository, passwordProvider) err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) require.ErrorIs(t, err, liquidity_provider.BadLoginError) @@ -186,12 +192,12 @@ func TestValidateCredentials_Badlogin(t *testing.T) { Password: "other wrong password", } lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} useStoredCredentialsSetUp(lpRepository, passwordProvider) err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) require.ErrorIs(t, err, liquidity_provider.BadLoginError) - passwordProvider.AssertNotCalled(t, "DefaultPassword") - passwordProvider.AssertNotCalled(t, "SetDefaultPassword") + passwordProvider.AssertNotCalled(t, "DefaultCredentials") + passwordProvider.AssertNotCalled(t, "SetDefaultCredentials") passwordProvider.AssertNotCalled(t, "DefaultPasswordChannel") passwordProvider.AssertExpectations(t) lpRepository.AssertExpectations(t) @@ -206,7 +212,7 @@ func TestValidateCredentials_ErrorHandling(t *testing.T) { credentials := lpEntity.Credentials{Username: test.AnyString, Password: test.AnyString} t.Run("GetCredentials error", func(t *testing.T) { lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, assert.AnError).Once() passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, lpEntity.Credentials{}) @@ -216,12 +222,12 @@ func TestValidateCredentials_ErrorHandling(t *testing.T) { }) t.Run("Default password not set error", func(t *testing.T) { lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} passwordChannel := make(chan entities.Event, 1) lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() - passwordProvider.On("DefaultPassword").Return("").Once() - passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + passwordProvider.On("DefaultCredentials").Return(nil).Once() + passwordProvider.On("GetDefaultCredentialsChannel").Return((<-chan entities.Event)(passwordChannel)).Once() err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, lpEntity.Credentials{}) require.Error(t, err) passwordProvider.AssertExpectations(t) @@ -237,7 +243,7 @@ func TestValidateCredentials_ErrorHandling(t *testing.T) { t.Run("HashArgon2 error", func(t *testing.T) { storedCredentials := &entities.Signed[lpEntity.HashedCredentials]{Value: errorCredential} lpRepository := &mocks.LiquidityProviderRepositoryMock{} - passwordProvider := &mocks.DefaultPasswordProviderMock{} + passwordProvider := &mocks.DefaultCredentialsProviderMock{} lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Once() passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() err := liquidity_provider.ValidateCredentials(context.Background(), passwordProvider, credentials) @@ -250,24 +256,24 @@ func TestValidateCredentials_ErrorHandling(t *testing.T) { func useDefaultPasswordSetUp( lpRepository *mocks.LiquidityProviderRepositoryMock, - passwordProvider *mocks.DefaultPasswordProviderMock, + passwordProvider *mocks.DefaultCredentialsProviderMock, ) { lpRepository.On("GetCredentials", context.Background()).Return(nil, nil).Once() passwordChannel := make(chan entities.Event, 1) passwordChannel <- lpEntity.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: mockDefaultFakePassword, + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Credentials: hashedDefaultCredentialsMock, } - passwordProvider.On("DefaultPassword").Return("").Once() - passwordProvider.On("GetDefaultPasswordChannel").Return((<-chan entities.Event)(passwordChannel)).Once() - passwordProvider.On("SetDefaultPassword", mockDefaultFakePassword).Return().Once() - passwordProvider.On("DefaultPassword").Return(mockDefaultFakePassword).Once() + passwordProvider.On("DefaultCredentials").Return(nil).Once() + passwordProvider.On("GetDefaultCredentialsChannel").Return((<-chan entities.Event)(passwordChannel)).Once() + passwordProvider.On("SetDefaultCredentials", hashedDefaultCredentialsMock).Return().Once() + passwordProvider.On("DefaultCredentials").Return(hashedDefaultCredentialsMock).Once() passwordProvider.On("LiquidityProviderRepository").Return(lpRepository).Once() } func useStoredCredentialsSetUp( lpRepository *mocks.LiquidityProviderRepositoryMock, - passwordProvider *mocks.DefaultPasswordProviderMock, + passwordProvider *mocks.DefaultCredentialsProviderMock, ) { storedCredentials := &entities.Signed[lpEntity.HashedCredentials]{ Value: lpEntity.HashedCredentials{ diff --git a/internal/usecases/liquidity_provider/generate_default_credentials.go b/internal/usecases/liquidity_provider/generate_default_credentials.go index 9d427618..fde7b46d 100644 --- a/internal/usecases/liquidity_provider/generate_default_credentials.go +++ b/internal/usecases/liquidity_provider/generate_default_credentials.go @@ -3,6 +3,7 @@ package liquidity_provider import ( "context" "encoding/base32" + "encoding/hex" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" @@ -45,9 +46,24 @@ func (useCase *GenerateDefaultCredentialsUseCase) Run(ctx context.Context, targe if err != nil { return usecases.WrapUseCaseError(usecases.DefaultCredentialsId, fmt.Errorf("error writing password file: %w", err)) } + + hashedUsername, usernameSalt, err := utils.HashAndSaltArgon2(defaultUsername, credentialSaltSize) + if err != nil { + return usecases.WrapUseCaseError(usecases.DefaultCredentialsId, err) + } + hashedPassword, passwordSalt, err := utils.HashAndSaltArgon2(stringPassword, credentialSaltSize) + if err != nil { + return usecases.WrapUseCaseError(usecases.DefaultCredentialsId, err) + } + useCase.eventBus.Publish(liquidity_provider.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(liquidity_provider.DefaultCredentialsSetEventId), - Password: stringPassword, + Event: entities.NewBaseEvent(liquidity_provider.DefaultCredentialsSetEventId), + Credentials: &liquidity_provider.HashedCredentials{ + HashedUsername: hex.EncodeToString(hashedUsername), + HashedPassword: hex.EncodeToString(hashedPassword), + UsernameSalt: usernameSalt, + PasswordSalt: passwordSalt, + }, }) log.Infof("There was no password detected in the database. A new password has been generated and saved in the file %s."+ "Please keep this file safe. The first time you open the management interface, you will be asked to change this password.", passwordFile) diff --git a/internal/usecases/liquidity_provider/generate_default_credentials_test.go b/internal/usecases/liquidity_provider/generate_default_credentials_test.go index 47ef7cc2..38d70271 100644 --- a/internal/usecases/liquidity_provider/generate_default_credentials_test.go +++ b/internal/usecases/liquidity_provider/generate_default_credentials_test.go @@ -3,9 +3,11 @@ package liquidity_provider_test import ( "bytes" "context" + "encoding/hex" "fmt" "github.com/rsksmart/liquidity-provider-server/internal/entities" lpEntity "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" @@ -27,7 +29,12 @@ func TestGenerateDefaultCredentialsUseCase_Run(t *testing.T) { event, ok := input.(lpEntity.DefaultCredentialsSetEvent) require.True(t, ok) emittedEvent = event - return event.Id() == lpEntity.DefaultCredentialsSetEventId && event.Password != "" + return event.Id() == lpEntity.DefaultCredentialsSetEventId && + assert.NotNil(t, event.Credentials) && + assert.NotEmpty(t, event.Credentials.HashedPassword) && + assert.NotEmpty(t, event.Credentials.HashedUsername) && + assert.NotEmpty(t, event.Credentials.PasswordSalt) && + assert.NotEmpty(t, event.Credentials.UsernameSalt) })).Once() useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) dir := os.TempDir() @@ -38,7 +45,14 @@ func TestGenerateDefaultCredentialsUseCase_Run(t *testing.T) { passwordFile := path.Join(dir, "management_password.txt") writtenPassword, err := os.ReadFile(passwordFile) require.NoError(t, err) - assert.Equal(t, emittedEvent.Password, string(writtenPassword)) + assert.True(t, func() bool { + passwordHash, hashError := utils.HashArgon2(string(writtenPassword), emittedEvent.Credentials.PasswordSalt) + require.NoError(t, hashError) + usernameHash, hashError := utils.HashArgon2("admin", emittedEvent.Credentials.UsernameSalt) + require.NoError(t, hashError) + return assert.Equal(t, emittedEvent.Credentials.HashedPassword, hex.EncodeToString(passwordHash)) && + assert.Equal(t, emittedEvent.Credentials.HashedUsername, hex.EncodeToString(usernameHash)) + }()) expectedLog := fmt.Sprintf("There was no password detected in the database. A new password has "+ "been generated and saved in the file %s.Please keep this file safe. The first time you open the "+ "management interface, you will be asked to change this password.", passwordFile) diff --git a/internal/usecases/liquidity_provider/login.go b/internal/usecases/liquidity_provider/login.go index 83bcb5ee..215b9f51 100644 --- a/internal/usecases/liquidity_provider/login.go +++ b/internal/usecases/liquidity_provider/login.go @@ -10,7 +10,7 @@ import ( type LoginUseCase struct { lpRepository liquidity_provider.LiquidityProviderRepository defaultPasswordChannel <-chan entities.Event - defaultPassword string + defaultCredentials *liquidity_provider.HashedCredentials } func NewLoginUseCase( @@ -32,14 +32,14 @@ func (useCase *LoginUseCase) LiquidityProviderRepository() liquidity_provider.Li return useCase.lpRepository } -func (useCase *LoginUseCase) GetDefaultPasswordChannel() <-chan entities.Event { +func (useCase *LoginUseCase) GetDefaultCredentialsChannel() <-chan entities.Event { return useCase.defaultPasswordChannel } -func (useCase *LoginUseCase) SetDefaultPassword(password string) { - useCase.defaultPassword = password +func (useCase *LoginUseCase) SetDefaultCredentials(credentials *liquidity_provider.HashedCredentials) { + useCase.defaultCredentials = credentials } -func (useCase *LoginUseCase) DefaultPassword() string { - return useCase.defaultPassword +func (useCase *LoginUseCase) DefaultCredentials() *liquidity_provider.HashedCredentials { + return useCase.defaultCredentials } diff --git a/internal/usecases/liquidity_provider/login_test.go b/internal/usecases/liquidity_provider/login_test.go index c30b15c6..b347bafe 100644 --- a/internal/usecases/liquidity_provider/login_test.go +++ b/internal/usecases/liquidity_provider/login_test.go @@ -21,11 +21,16 @@ func TestLoginUseCase_DefaultPassword(t *testing.T) { mockChannel := make(chan entities.Event) eventBus.On("Subscribe", mock.Anything).Return((<-chan entities.Event)(mockChannel)).Once() useCase := liquidity_provider.NewLoginUseCase(lpRepository, eventBus) - const password = test.AnyString + var credentials = &lpEntity.HashedCredentials{ + HashedUsername: test.AnyString, + HashedPassword: test.AnyString, + UsernameSalt: test.AnyString, + PasswordSalt: test.AnyString, + } - assert.Empty(t, useCase.DefaultPassword()) - useCase.SetDefaultPassword(password) - assert.Equal(t, password, useCase.DefaultPassword()) + assert.Nil(t, useCase.DefaultCredentials()) + useCase.SetDefaultCredentials(credentials) + assert.Equal(t, credentials, useCase.DefaultCredentials()) } func TestLoginUseCase_GetDefaultPasswordChannel(t *testing.T) { @@ -33,23 +38,19 @@ func TestLoginUseCase_GetDefaultPasswordChannel(t *testing.T) { eventBus := dataproviders.NewLocalEventBus() useCase := liquidity_provider.NewLoginUseCase(lpRepository, eventBus) eventBus.Publish(lpEntity.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: test.AnyString, + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Credentials: hashedDefaultCredentialsMock, }) - assert.NotNil(t, useCase.GetDefaultPasswordChannel()) + assert.NotNil(t, useCase.GetDefaultCredentialsChannel()) select { - case content := <-useCase.GetDefaultPasswordChannel(): - assert.Equal(t, test.AnyString, content.(lpEntity.DefaultCredentialsSetEvent).Password) + case content := <-useCase.GetDefaultCredentialsChannel(): + assert.Equal(t, hashedDefaultCredentialsMock, content.(lpEntity.DefaultCredentialsSetEvent).Credentials) default: assert.Fail(t, "expected to receive an event") } } func TestLoginUseCase_Run_UseDefaultPassword(t *testing.T) { - const ( - username = "admin" - password = "login password" - ) var waitGroup sync.WaitGroup lpRepository := &mocks.LiquidityProviderRepositoryMock{} lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Twice() @@ -59,19 +60,16 @@ func TestLoginUseCase_Run_UseDefaultPassword(t *testing.T) { go func(wg *sync.WaitGroup, bus entities.EventBus) { defer wg.Done() bus.Publish(lpEntity.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: password, + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Credentials: hashedDefaultCredentialsMock, }) }(&waitGroup, eventBus) waitGroup.Wait() - err := useCase.Run(context.Background(), lpEntity.Credentials{ - Username: username, - Password: password, - }) + err := useCase.Run(context.Background(), defaultCredentialsMock) require.NoError(t, err) err = useCase.Run(context.Background(), lpEntity.Credentials{ - Username: username, - Password: "wrong password", + Username: defaultCredentialsMock.Username, + Password: defaultCredentialsMock.Password + "1234", }) require.ErrorIs(t, err, liquidity_provider.BadLoginError) lpRepository.AssertExpectations(t) diff --git a/internal/usecases/liquidity_provider/set_credentials.go b/internal/usecases/liquidity_provider/set_credentials.go index 35ca84e0..ac95ffe0 100644 --- a/internal/usecases/liquidity_provider/set_credentials.go +++ b/internal/usecases/liquidity_provider/set_credentials.go @@ -9,13 +9,11 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/usecases" ) -const credentialSaltSize = 32 - type SetCredentialsUseCase struct { lpRepository liquidity_provider.LiquidityProviderRepository signer entities.Signer hashFunc entities.HashFunction - defaultPassword string + defaultCredentials *liquidity_provider.HashedCredentials defaultPasswordChannel <-chan entities.Event } @@ -73,14 +71,14 @@ func (useCase *SetCredentialsUseCase) LiquidityProviderRepository() liquidity_pr return useCase.lpRepository } -func (useCase *SetCredentialsUseCase) GetDefaultPasswordChannel() <-chan entities.Event { +func (useCase *SetCredentialsUseCase) GetDefaultCredentialsChannel() <-chan entities.Event { return useCase.defaultPasswordChannel } -func (useCase *SetCredentialsUseCase) SetDefaultPassword(password string) { - useCase.defaultPassword = password +func (useCase *SetCredentialsUseCase) SetDefaultCredentials(credentials *liquidity_provider.HashedCredentials) { + useCase.defaultCredentials = credentials } -func (useCase *SetCredentialsUseCase) DefaultPassword() string { - return useCase.defaultPassword +func (useCase *SetCredentialsUseCase) DefaultCredentials() *liquidity_provider.HashedCredentials { + return useCase.defaultCredentials } diff --git a/internal/usecases/liquidity_provider/set_credentials_test.go b/internal/usecases/liquidity_provider/set_credentials_test.go index 9a683bb3..e063e002 100644 --- a/internal/usecases/liquidity_provider/set_credentials_test.go +++ b/internal/usecases/liquidity_provider/set_credentials_test.go @@ -35,10 +35,15 @@ func TestSetCredentialsUseCase_DefaultPassword(t *testing.T) { walletMock := &mocks.RskWalletMock{} hashMock := &mocks.HashMock{} useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) - const password = test.AnyString - assert.Empty(t, useCase.DefaultPassword()) - useCase.SetDefaultPassword(password) - assert.Equal(t, password, useCase.DefaultPassword()) + credentials := &lpEntity.HashedCredentials{ + HashedUsername: test.AnyString, + HashedPassword: test.AnyString, + UsernameSalt: test.AnyString, + PasswordSalt: test.AnyString, + } + assert.Empty(t, useCase.DefaultCredentials()) + useCase.SetDefaultCredentials(credentials) + assert.Equal(t, credentials, useCase.DefaultCredentials()) } func TestSetCredentialsUseCase_GetDefaultPasswordChannel(t *testing.T) { @@ -48,13 +53,13 @@ func TestSetCredentialsUseCase_GetDefaultPasswordChannel(t *testing.T) { hashMock := &mocks.HashMock{} useCase := liquidity_provider.NewSetCredentialsUseCase(lpRepository, walletMock, hashMock.Hash, eventBus) eventBus.Publish(lpEntity.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: test.AnyString, + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Credentials: hashedDefaultCredentialsMock, }) - assert.NotNil(t, useCase.GetDefaultPasswordChannel()) + assert.NotNil(t, useCase.GetDefaultCredentialsChannel()) select { - case content := <-useCase.GetDefaultPasswordChannel(): - assert.Equal(t, test.AnyString, content.(lpEntity.DefaultCredentialsSetEvent).Password) + case content := <-useCase.GetDefaultCredentialsChannel(): + assert.Equal(t, hashedDefaultCredentialsMock, content.(lpEntity.DefaultCredentialsSetEvent).Credentials) default: assert.Fail(t, "expected to receive an event") } @@ -104,7 +109,6 @@ func TestSetCredentialsUseCase_Run_StoredCredentials(t *testing.T) { } func TestSetCredentialsUseCase_Run_DefaultCredentials(t *testing.T) { - const defaultPassword = "defaultPassword1234*" var waitGroup sync.WaitGroup lpRepository := &mocks.LiquidityProviderRepositoryMock{} lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() @@ -136,15 +140,14 @@ func TestSetCredentialsUseCase_Run_DefaultCredentials(t *testing.T) { go func(wg *sync.WaitGroup, eventChannel chan entities.Event) { defer wg.Done() eventChannel <- lpEntity.DefaultCredentialsSetEvent{ - Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), - Password: defaultPassword, + Event: entities.NewBaseEvent(lpEntity.DefaultCredentialsSetEventId), + Credentials: hashedDefaultCredentialsMock, } }(&waitGroup, defaultPasswordChannel) waitGroup.Wait() t.Run("Correct login", func(t *testing.T) { - defaultCredentials := lpEntity.Credentials{Username: "admin", Password: defaultPassword} - err := useCase.Run(context.Background(), defaultCredentials, newCredentials) + err := useCase.Run(context.Background(), defaultCredentialsMock, newCredentials) require.NoError(t, err) lpRepository.AssertExpectations(t) eventBus.AssertExpectations(t) @@ -154,7 +157,7 @@ func TestSetCredentialsUseCase_Run_DefaultCredentials(t *testing.T) { t.Run("Incorrect login", func(t *testing.T) { lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() - incorrectCredentials := lpEntity.Credentials{Username: "oldUsernameIncorrect", Password: defaultPassword + "wrong"} + incorrectCredentials := lpEntity.Credentials{Username: "oldUsernameIncorrect", Password: defaultCredentialsMock.Password + "wrong"} err := useCase.Run(context.Background(), incorrectCredentials, newCredentials) require.ErrorIs(t, err, liquidity_provider.BadLoginError) lpRepository.AssertExpectations(t) diff --git a/test/mocks/default_credentials_provider_mock.go b/test/mocks/default_credentials_provider_mock.go new file mode 100644 index 00000000..eb481fad --- /dev/null +++ b/test/mocks/default_credentials_provider_mock.go @@ -0,0 +1,210 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + entities "github.com/rsksmart/liquidity-provider-server/internal/entities" + liquidity_provider "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + mock "github.com/stretchr/testify/mock" +) + +// DefaultCredentialsProviderMock is an autogenerated mock type for the DefaultCredentialsProvider type +type DefaultCredentialsProviderMock struct { + mock.Mock +} + +type DefaultCredentialsProviderMock_Expecter struct { + mock *mock.Mock +} + +func (_m *DefaultCredentialsProviderMock) EXPECT() *DefaultCredentialsProviderMock_Expecter { + return &DefaultCredentialsProviderMock_Expecter{mock: &_m.Mock} +} + +// DefaultCredentials provides a mock function with given fields: +func (_m *DefaultCredentialsProviderMock) DefaultCredentials() *liquidity_provider.HashedCredentials { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for DefaultCredentials") + } + + var r0 *liquidity_provider.HashedCredentials + if rf, ok := ret.Get(0).(func() *liquidity_provider.HashedCredentials); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*liquidity_provider.HashedCredentials) + } + } + + return r0 +} + +// DefaultCredentialsProviderMock_DefaultCredentials_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DefaultCredentials' +type DefaultCredentialsProviderMock_DefaultCredentials_Call struct { + *mock.Call +} + +// DefaultCredentials is a helper method to define mock.On call +func (_e *DefaultCredentialsProviderMock_Expecter) DefaultCredentials() *DefaultCredentialsProviderMock_DefaultCredentials_Call { + return &DefaultCredentialsProviderMock_DefaultCredentials_Call{Call: _e.mock.On("DefaultCredentials")} +} + +func (_c *DefaultCredentialsProviderMock_DefaultCredentials_Call) Run(run func()) *DefaultCredentialsProviderMock_DefaultCredentials_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DefaultCredentialsProviderMock_DefaultCredentials_Call) Return(_a0 *liquidity_provider.HashedCredentials) *DefaultCredentialsProviderMock_DefaultCredentials_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DefaultCredentialsProviderMock_DefaultCredentials_Call) RunAndReturn(run func() *liquidity_provider.HashedCredentials) *DefaultCredentialsProviderMock_DefaultCredentials_Call { + _c.Call.Return(run) + return _c +} + +// GetDefaultCredentialsChannel provides a mock function with given fields: +func (_m *DefaultCredentialsProviderMock) GetDefaultCredentialsChannel() <-chan entities.Event { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetDefaultCredentialsChannel") + } + + var r0 <-chan entities.Event + if rf, ok := ret.Get(0).(func() <-chan entities.Event); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan entities.Event) + } + } + + return r0 +} + +// DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDefaultCredentialsChannel' +type DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call struct { + *mock.Call +} + +// GetDefaultCredentialsChannel is a helper method to define mock.On call +func (_e *DefaultCredentialsProviderMock_Expecter) GetDefaultCredentialsChannel() *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call { + return &DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call{Call: _e.mock.On("GetDefaultCredentialsChannel")} +} + +func (_c *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call) Run(run func()) *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call) Return(_a0 <-chan entities.Event) *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call) RunAndReturn(run func() <-chan entities.Event) *DefaultCredentialsProviderMock_GetDefaultCredentialsChannel_Call { + _c.Call.Return(run) + return _c +} + +// LiquidityProviderRepository provides a mock function with given fields: +func (_m *DefaultCredentialsProviderMock) LiquidityProviderRepository() liquidity_provider.LiquidityProviderRepository { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for LiquidityProviderRepository") + } + + var r0 liquidity_provider.LiquidityProviderRepository + if rf, ok := ret.Get(0).(func() liquidity_provider.LiquidityProviderRepository); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(liquidity_provider.LiquidityProviderRepository) + } + } + + return r0 +} + +// DefaultCredentialsProviderMock_LiquidityProviderRepository_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LiquidityProviderRepository' +type DefaultCredentialsProviderMock_LiquidityProviderRepository_Call struct { + *mock.Call +} + +// LiquidityProviderRepository is a helper method to define mock.On call +func (_e *DefaultCredentialsProviderMock_Expecter) LiquidityProviderRepository() *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call { + return &DefaultCredentialsProviderMock_LiquidityProviderRepository_Call{Call: _e.mock.On("LiquidityProviderRepository")} +} + +func (_c *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call) Run(run func()) *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call) Return(_a0 liquidity_provider.LiquidityProviderRepository) *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call) RunAndReturn(run func() liquidity_provider.LiquidityProviderRepository) *DefaultCredentialsProviderMock_LiquidityProviderRepository_Call { + _c.Call.Return(run) + return _c +} + +// SetDefaultCredentials provides a mock function with given fields: password +func (_m *DefaultCredentialsProviderMock) SetDefaultCredentials(password *liquidity_provider.HashedCredentials) { + _m.Called(password) +} + +// DefaultCredentialsProviderMock_SetDefaultCredentials_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDefaultCredentials' +type DefaultCredentialsProviderMock_SetDefaultCredentials_Call struct { + *mock.Call +} + +// SetDefaultCredentials is a helper method to define mock.On call +// - password *liquidity_provider.HashedCredentials +func (_e *DefaultCredentialsProviderMock_Expecter) SetDefaultCredentials(password interface{}) *DefaultCredentialsProviderMock_SetDefaultCredentials_Call { + return &DefaultCredentialsProviderMock_SetDefaultCredentials_Call{Call: _e.mock.On("SetDefaultCredentials", password)} +} + +func (_c *DefaultCredentialsProviderMock_SetDefaultCredentials_Call) Run(run func(password *liquidity_provider.HashedCredentials)) *DefaultCredentialsProviderMock_SetDefaultCredentials_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*liquidity_provider.HashedCredentials)) + }) + return _c +} + +func (_c *DefaultCredentialsProviderMock_SetDefaultCredentials_Call) Return() *DefaultCredentialsProviderMock_SetDefaultCredentials_Call { + _c.Call.Return() + return _c +} + +func (_c *DefaultCredentialsProviderMock_SetDefaultCredentials_Call) RunAndReturn(run func(*liquidity_provider.HashedCredentials)) *DefaultCredentialsProviderMock_SetDefaultCredentials_Call { + _c.Call.Return(run) + return _c +} + +// NewDefaultCredentialsProviderMock creates a new instance of DefaultCredentialsProviderMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDefaultCredentialsProviderMock(t interface { + mock.TestingT + Cleanup(func()) +}) *DefaultCredentialsProviderMock { + mock := &DefaultCredentialsProviderMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/default_password_provider_mock.go b/test/mocks/default_password_provider_mock.go deleted file mode 100644 index b227b53d..00000000 --- a/test/mocks/default_password_provider_mock.go +++ /dev/null @@ -1,209 +0,0 @@ -// Code generated by mockery v2.42.1. DO NOT EDIT. - -package mocks - -import ( - entities "github.com/rsksmart/liquidity-provider-server/internal/entities" - entitiesliquidity_provider "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" - - mock "github.com/stretchr/testify/mock" -) - -// DefaultPasswordProviderMock is an autogenerated mock type for the DefaultPasswordProvider type -type DefaultPasswordProviderMock struct { - mock.Mock -} - -type DefaultPasswordProviderMock_Expecter struct { - mock *mock.Mock -} - -func (_m *DefaultPasswordProviderMock) EXPECT() *DefaultPasswordProviderMock_Expecter { - return &DefaultPasswordProviderMock_Expecter{mock: &_m.Mock} -} - -// DefaultPassword provides a mock function with given fields: -func (_m *DefaultPasswordProviderMock) DefaultPassword() string { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for DefaultPassword") - } - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// DefaultPasswordProviderMock_DefaultPassword_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DefaultPassword' -type DefaultPasswordProviderMock_DefaultPassword_Call struct { - *mock.Call -} - -// DefaultPassword is a helper method to define mock.On call -func (_e *DefaultPasswordProviderMock_Expecter) DefaultPassword() *DefaultPasswordProviderMock_DefaultPassword_Call { - return &DefaultPasswordProviderMock_DefaultPassword_Call{Call: _e.mock.On("DefaultPassword")} -} - -func (_c *DefaultPasswordProviderMock_DefaultPassword_Call) Run(run func()) *DefaultPasswordProviderMock_DefaultPassword_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *DefaultPasswordProviderMock_DefaultPassword_Call) Return(_a0 string) *DefaultPasswordProviderMock_DefaultPassword_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *DefaultPasswordProviderMock_DefaultPassword_Call) RunAndReturn(run func() string) *DefaultPasswordProviderMock_DefaultPassword_Call { - _c.Call.Return(run) - return _c -} - -// GetDefaultPasswordChannel provides a mock function with given fields: -func (_m *DefaultPasswordProviderMock) GetDefaultPasswordChannel() <-chan entities.Event { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for GetDefaultPasswordChannel") - } - - var r0 <-chan entities.Event - if rf, ok := ret.Get(0).(func() <-chan entities.Event); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(<-chan entities.Event) - } - } - - return r0 -} - -// DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDefaultPasswordChannel' -type DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call struct { - *mock.Call -} - -// GetDefaultPasswordChannel is a helper method to define mock.On call -func (_e *DefaultPasswordProviderMock_Expecter) GetDefaultPasswordChannel() *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { - return &DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call{Call: _e.mock.On("GetDefaultPasswordChannel")} -} - -func (_c *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call) Run(run func()) *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call) Return(_a0 <-chan entities.Event) *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call) RunAndReturn(run func() <-chan entities.Event) *DefaultPasswordProviderMock_GetDefaultPasswordChannel_Call { - _c.Call.Return(run) - return _c -} - -// LiquidityProviderRepository provides a mock function with given fields: -func (_m *DefaultPasswordProviderMock) LiquidityProviderRepository() entitiesliquidity_provider.LiquidityProviderRepository { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for LiquidityProviderRepository") - } - - var r0 entitiesliquidity_provider.LiquidityProviderRepository - if rf, ok := ret.Get(0).(func() entitiesliquidity_provider.LiquidityProviderRepository); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(entitiesliquidity_provider.LiquidityProviderRepository) - } - } - - return r0 -} - -// DefaultPasswordProviderMock_LiquidityProviderRepository_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LiquidityProviderRepository' -type DefaultPasswordProviderMock_LiquidityProviderRepository_Call struct { - *mock.Call -} - -// LiquidityProviderRepository is a helper method to define mock.On call -func (_e *DefaultPasswordProviderMock_Expecter) LiquidityProviderRepository() *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { - return &DefaultPasswordProviderMock_LiquidityProviderRepository_Call{Call: _e.mock.On("LiquidityProviderRepository")} -} - -func (_c *DefaultPasswordProviderMock_LiquidityProviderRepository_Call) Run(run func()) *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *DefaultPasswordProviderMock_LiquidityProviderRepository_Call) Return(_a0 entitiesliquidity_provider.LiquidityProviderRepository) *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *DefaultPasswordProviderMock_LiquidityProviderRepository_Call) RunAndReturn(run func() entitiesliquidity_provider.LiquidityProviderRepository) *DefaultPasswordProviderMock_LiquidityProviderRepository_Call { - _c.Call.Return(run) - return _c -} - -// SetDefaultPassword provides a mock function with given fields: password -func (_m *DefaultPasswordProviderMock) SetDefaultPassword(password string) { - _m.Called(password) -} - -// DefaultPasswordProviderMock_SetDefaultPassword_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDefaultPassword' -type DefaultPasswordProviderMock_SetDefaultPassword_Call struct { - *mock.Call -} - -// SetDefaultPassword is a helper method to define mock.On call -// - password string -func (_e *DefaultPasswordProviderMock_Expecter) SetDefaultPassword(password interface{}) *DefaultPasswordProviderMock_SetDefaultPassword_Call { - return &DefaultPasswordProviderMock_SetDefaultPassword_Call{Call: _e.mock.On("SetDefaultPassword", password)} -} - -func (_c *DefaultPasswordProviderMock_SetDefaultPassword_Call) Run(run func(password string)) *DefaultPasswordProviderMock_SetDefaultPassword_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string)) - }) - return _c -} - -func (_c *DefaultPasswordProviderMock_SetDefaultPassword_Call) Return() *DefaultPasswordProviderMock_SetDefaultPassword_Call { - _c.Call.Return() - return _c -} - -func (_c *DefaultPasswordProviderMock_SetDefaultPassword_Call) RunAndReturn(run func(string)) *DefaultPasswordProviderMock_SetDefaultPassword_Call { - _c.Call.Return(run) - return _c -} - -// NewDefaultPasswordProviderMock creates a new instance of DefaultPasswordProviderMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewDefaultPasswordProviderMock(t interface { - mock.TestingT - Cleanup(func()) -}) *DefaultPasswordProviderMock { - mock := &DefaultPasswordProviderMock{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From a2478368e9b610a6b1c1914ef56d88e539d64291 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 12 Apr 2024 09:37:00 +0200 Subject: [PATCH 044/113] refactor: move federation.go to a diff package --- .../adapters/dataproviders/rootstock/bridge.go | 7 ++++--- .../rootstock/{ => federation}/federation.go | 14 +++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) rename internal/adapters/dataproviders/rootstock/{ => federation}/federation.go (93%) diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go index 199b97d5..e5c3a080 100644 --- a/internal/adapters/dataproviders/rootstock/bridge.go +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "math/big" @@ -85,16 +86,16 @@ func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.Flyover } if len(fedRedeemScript) == 0 { - if fedRedeemScript, err = getFedRedeemScript(args.FedInfo, *bridge.btcParams); err != nil { + if fedRedeemScript, err = federation.GetFedRedeemScript(args.FedInfo, *bridge.btcParams); err != nil { return blockchain.FlyoverDerivation{}, fmt.Errorf("error generating fed redeem script: %w", err) } } else { - if err = validateRedeemScript(args.FedInfo, *bridge.btcParams, fedRedeemScript); err != nil { + if err = federation.ValidateRedeemScript(args.FedInfo, *bridge.btcParams, fedRedeemScript); err != nil { return blockchain.FlyoverDerivation{}, fmt.Errorf("error validating fed redeem script: %w", err) } } - flyoverScript = getFlyoverRedeemScript(derivationValue, fedRedeemScript) + flyoverScript = federation.GetFlyoverRedeemScript(derivationValue, fedRedeemScript) if addressScriptHash, err = btcutil.NewAddressScriptHash(flyoverScript, bridge.btcParams); err != nil { return blockchain.FlyoverDerivation{}, err } diff --git a/internal/adapters/dataproviders/rootstock/federation.go b/internal/adapters/dataproviders/rootstock/federation/federation.go similarity index 93% rename from internal/adapters/dataproviders/rootstock/federation.go rename to internal/adapters/dataproviders/rootstock/federation/federation.go index 8cefd03a..f7715e36 100644 --- a/internal/adapters/dataproviders/rootstock/federation.go +++ b/internal/adapters/dataproviders/rootstock/federation/federation.go @@ -1,4 +1,4 @@ -package rootstock +package federation import ( "bytes" @@ -10,7 +10,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" ) -func getFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) ([]byte, error) { +func GetFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) ([]byte, error) { var buf *bytes.Buffer var err error @@ -30,7 +30,7 @@ func getFedRedeemScriptAfterIrisActivation(fedInfo blockchain.FederationInfo, bt return nil, err } - err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + err = ValidateRedeemScript(fedInfo, btcParams, buf.Bytes()) if err != nil { return nil, err } @@ -43,14 +43,14 @@ func getFedRedeemScriptBeforeIrisActivation(fedInfo blockchain.FederationInfo, b return nil, err } - err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + err = ValidateRedeemScript(fedInfo, btcParams, buf.Bytes()) if err != nil { // ok, it could be that ERP is not yet activated, falling back to redeem Script buf, err = getRedeemScriptBuf(fedInfo, true) if err != nil { return nil, err } - err = validateRedeemScript(fedInfo, btcParams, buf.Bytes()) + err = ValidateRedeemScript(fedInfo, btcParams, buf.Bytes()) if err != nil { return nil, err } @@ -93,7 +93,7 @@ func addStdNToMScriptPart(fedInfo blockchain.FederationInfo, builder *txscript.S return nil } -func validateRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params, script []byte) error { +func ValidateRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params, script []byte) error { addr, err := btcutil.NewAddressScriptHash(script, &btcParams) if err != nil { return err @@ -188,7 +188,7 @@ func addErpNToMScriptPart(fedInfo blockchain.FederationInfo, builder *txscript.S return nil } -func getFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) []byte { +func GetFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) []byte { var buf bytes.Buffer hashPrefix, _ := hex.DecodeString("20") buf.Write(hashPrefix) From 04436cbb602f81555ccb66f2deebded716975205 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 12 Apr 2024 16:14:29 +0200 Subject: [PATCH 045/113] test: add legacy federation tests from old LPS --- .../dataproviders/rootstock/bridge.go | 42 +- .../rootstock/federation/federation.go | 75 ++- .../rootstock/federation/federation_test.go | 459 ++++++++++++++++++ 3 files changed, 522 insertions(+), 54 deletions(-) create mode 100644 internal/adapters/dataproviders/rootstock/federation/federation_test.go diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go index e5c3a080..295ca030 100644 --- a/internal/adapters/dataproviders/rootstock/bridge.go +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -1,13 +1,10 @@ package rootstock import ( - "bytes" "encoding/hex" "fmt" - "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation" @@ -71,12 +68,8 @@ func (bridge *rskBridgeImpl) GetMinimumLockTxValue() (*entities.Wei, error) { func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.FlyoverDerivationArgs) (blockchain.FlyoverDerivation, error) { var err error - var fedRedeemScript, derivationValue, flyoverScript []byte - var addressScriptHash *btcutil.AddressScriptHash - - if derivationValue = bridge.getDerivationValueHash(args); err != nil { - return blockchain.FlyoverDerivation{}, fmt.Errorf("error computing derivation value: %w", err) - } + var fedRedeemScript, derivationValue []byte + derivationValue = federation.GetDerivationValueHash(args) opts := &bind.CallOpts{} fedRedeemScript, err = rskRetry(func() ([]byte, error) { return bridge.contract.GetActivePowpegRedeemScript(opts) @@ -85,24 +78,7 @@ func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.Flyover return blockchain.FlyoverDerivation{}, fmt.Errorf("error retreiving fed redeem script from bridge: %w", err) } - if len(fedRedeemScript) == 0 { - if fedRedeemScript, err = federation.GetFedRedeemScript(args.FedInfo, *bridge.btcParams); err != nil { - return blockchain.FlyoverDerivation{}, fmt.Errorf("error generating fed redeem script: %w", err) - } - } else { - if err = federation.ValidateRedeemScript(args.FedInfo, *bridge.btcParams, fedRedeemScript); err != nil { - return blockchain.FlyoverDerivation{}, fmt.Errorf("error validating fed redeem script: %w", err) - } - } - - flyoverScript = federation.GetFlyoverRedeemScript(derivationValue, fedRedeemScript) - if addressScriptHash, err = btcutil.NewAddressScriptHash(flyoverScript, bridge.btcParams); err != nil { - return blockchain.FlyoverDerivation{}, err - } - return blockchain.FlyoverDerivation{ - Address: addressScriptHash.EncodeAddress(), - RedeemScript: hex.EncodeToString(flyoverScript), - }, nil + return federation.CalculateFlyoverDerivationAddress(args.FedInfo, *bridge.btcParams, fedRedeemScript, derivationValue) } func (bridge *rskBridgeImpl) GetRequiredTxConfirmations() uint64 { @@ -165,15 +141,3 @@ func (bridge *rskBridgeImpl) FetchFederationInfo() (blockchain.FederationInfo, e ErpKeys: bridge.erpKeys, }, nil } - -func (bridge *rskBridgeImpl) getDerivationValueHash(args blockchain.FlyoverDerivationArgs) []byte { - var buf bytes.Buffer - buf.Write(args.QuoteHash) - buf.Write(args.UserBtcRefundAddress) - buf.Write(args.LbcAdress) - buf.Write(args.LpBtcAddress) - - derivationValueHash := crypto.Keccak256(buf.Bytes()) - - return derivationValueHash -} diff --git a/internal/adapters/dataproviders/rootstock/federation/federation.go b/internal/adapters/dataproviders/rootstock/federation/federation.go index f7715e36..c39b134a 100644 --- a/internal/adapters/dataproviders/rootstock/federation/federation.go +++ b/internal/adapters/dataproviders/rootstock/federation/federation.go @@ -4,12 +4,16 @@ import ( "bytes" "encoding/hex" "errors" + "fmt" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/txscript" + "github.com/ethereum/go-ethereum/crypto" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" ) +const flyoverPrefix byte = 0x20 + func GetFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) ([]byte, error) { var buf *bytes.Buffer var err error @@ -21,11 +25,14 @@ func GetFedRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg.Pa buf, err = getFedRedeemScriptBeforeIrisActivation(fedInfo, btcParams) } - return buf.Bytes(), err + if err != nil { + return nil, err + } + return buf.Bytes(), nil } func getFedRedeemScriptAfterIrisActivation(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { - buf, err := getRedeemScriptBuf(fedInfo, true) + buf, err := GetRedeemScriptBuf(fedInfo, true) if err != nil { return nil, err } @@ -38,14 +45,14 @@ func getFedRedeemScriptAfterIrisActivation(fedInfo blockchain.FederationInfo, bt } func getFedRedeemScriptBeforeIrisActivation(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { - buf, err := getErpRedeemScriptBuf(fedInfo, btcParams) + buf, err := GetErpRedeemScriptBuf(fedInfo, btcParams) if err != nil { return nil, err } err = ValidateRedeemScript(fedInfo, btcParams, buf.Bytes()) if err != nil { // ok, it could be that ERP is not yet activated, falling back to redeem Script - buf, err = getRedeemScriptBuf(fedInfo, true) + buf, err = GetRedeemScriptBuf(fedInfo, true) if err != nil { return nil, err } @@ -58,7 +65,7 @@ func getFedRedeemScriptBeforeIrisActivation(fedInfo blockchain.FederationInfo, b return buf, nil } -func getRedeemScriptBuf(fedInfo blockchain.FederationInfo, addMultiSig bool) (*bytes.Buffer, error) { +func GetRedeemScriptBuf(fedInfo blockchain.FederationInfo, addMultiSig bool) (*bytes.Buffer, error) { var buf bytes.Buffer sb := txscript.NewScriptBuilder() err := addStdNToMScriptPart(fedInfo, sb) @@ -110,13 +117,13 @@ func ValidateRedeemScript(fedInfo blockchain.FederationInfo, btcParams chaincfg. return nil } -func getErpRedeemScriptBuf(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { +func GetErpRedeemScriptBuf(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params) (*bytes.Buffer, error) { erpRedeemScriptBuf, err := p2ms(fedInfo, false) if err != nil { return nil, err } - redeemScriptBuf, err := getRedeemScriptBuf(fedInfo, false) + redeemScriptBuf, err := GetRedeemScriptBuf(fedInfo, false) if err != nil { return nil, err } @@ -130,11 +137,7 @@ func getErpRedeemScriptBuf(fedInfo blockchain.FederationInfo, btcParams chaincfg erpRedeemScriptBuffer.Write(scrA) erpRedeemScriptBuffer.Write(redeemScriptBuf.Bytes()) erpRedeemScriptBuffer.WriteByte(txscript.OP_ELSE) - byteArr, err := hex.DecodeString("02") - if err != nil { - return nil, err - } - erpRedeemScriptBuffer.Write(byteArr) + erpRedeemScriptBuffer.WriteByte(0x02) csv, err := hex.DecodeString(getCsvValueFromNetwork(btcParams)) if err != nil { @@ -188,12 +191,17 @@ func addErpNToMScriptPart(fedInfo blockchain.FederationInfo, builder *txscript.S return nil } -func GetFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) []byte { +func getFlyoverPrefix(derivationValue []byte) []byte { var buf bytes.Buffer - hashPrefix, _ := hex.DecodeString("20") - buf.Write(hashPrefix) + buf.WriteByte(flyoverPrefix) buf.Write(derivationValue) buf.WriteByte(txscript.OP_DROP) + return buf.Bytes() +} + +func GetFlyoverRedeemScript(derivationValue []byte, fedRedeemScript []byte) []byte { + var buf bytes.Buffer + buf.Write(getFlyoverPrefix(derivationValue)) buf.Write(fedRedeemScript) return buf.Bytes() } @@ -246,3 +254,40 @@ func getCsvValueFromNetwork(btcParams chaincfg.Params) string { return "01F4" } } + +func GetDerivationValueHash(args blockchain.FlyoverDerivationArgs) []byte { + var buf bytes.Buffer + buf.Write(args.QuoteHash) + buf.Write(args.UserBtcRefundAddress) + buf.Write(args.LbcAdress) + buf.Write(args.LpBtcAddress) + + derivationValueHash := crypto.Keccak256(buf.Bytes()) + + return derivationValueHash +} + +func CalculateFlyoverDerivationAddress(fedInfo blockchain.FederationInfo, btcParams chaincfg.Params, fedRedeemScript, derivationValue []byte) (blockchain.FlyoverDerivation, error) { + var err error + var addressScriptHash *btcutil.AddressScriptHash + + if len(fedRedeemScript) == 0 { + if fedRedeemScript, err = GetFedRedeemScript(fedInfo, btcParams); err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error generating fed redeem script: %w", err) + } + } else { + if err = ValidateRedeemScript(fedInfo, btcParams, fedRedeemScript); err != nil { + return blockchain.FlyoverDerivation{}, fmt.Errorf("error validating fed redeem script: %w", err) + } + } + + flyoverScript := GetFlyoverRedeemScript(derivationValue, fedRedeemScript) + if addressScriptHash, err = btcutil.NewAddressScriptHash(flyoverScript, &btcParams); err != nil { + return blockchain.FlyoverDerivation{}, err + } + + return blockchain.FlyoverDerivation{ + Address: addressScriptHash.EncodeAddress(), + RedeemScript: hex.EncodeToString(flyoverScript), + }, nil +} diff --git a/internal/adapters/dataproviders/rootstock/federation/federation_test.go b/internal/adapters/dataproviders/rootstock/federation/federation_test.go new file mode 100644 index 00000000..9cb556d6 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/federation/federation_test.go @@ -0,0 +1,459 @@ +package federation_test + +import ( + "encoding/hex" + "fmt" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/txscript" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "sort" + "strings" + "testing" +) + +type testQuote struct { + BtcRefundAddress string + LbcAddress string + LpBtcAddress string + QuoteHash string + ExpectedDerivationValueHash string + ExpectedAddressHash string + NetworkParams *chaincfg.Params + FedInfo blockchain.FederationInfo +} + +const ( + federationMainnetAddress = "3EDhHutH7XnsotnZaTfRr9CwnnGsNNrhCL" + federationTestnetAddress = "2N5muMepJizJE1gR7FbHJU6CD18V3BpNF9p" + invalidKey = "invalidKey" +) + +const ( + powPegScriptString = "522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53ae" + erpScriptString = "64522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db536702cd50b27553210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b32102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec805468ae" + flyoverScriptString = "20ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c975522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53ae" + flyoverErpScriptString = "20ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c97564522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db536702cd50b27553210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b32102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec805468ae" + flyoverDerivationHash = "ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c9" +) + +var testQuotes = []testQuote{ + { + LpBtcAddress: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", + BtcRefundAddress: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", + LbcAddress: "2ff74F841b95E000625b3A77fed03714874C4fEa", + QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", + ExpectedAddressHash: "2Mx7jaPHtsgJTbqGnjU5UqBpkekHgfigXay", + ExpectedDerivationValueHash: "ff883edd54f8cb22464a8181ed62652fcdb0028e0ada18f9828afd76e0df2c72", + NetworkParams: &chaincfg.TestNet3Params, + FedInfo: getFakeFedInfo(), + }, + { + LpBtcAddress: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", + BtcRefundAddress: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", + LbcAddress: "2ff74F841b95E000625b3A77fed03714874C4fEa", + QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", + ExpectedAddressHash: "2N6LxcNDYkKzeyXh7xjZUNZnS9G4Sq3mysi", + ExpectedDerivationValueHash: "4cd8a9037f5342217092a9ccc027ab0af1be60bf015e4228afc87214f86f2e51", + NetworkParams: &chaincfg.TestNet3Params, + FedInfo: getFakeFedInfo(), + }, + { + LpBtcAddress: "17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem", + BtcRefundAddress: "17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem", + LbcAddress: "2ff74F841b95E000625b3A77fed03714874C4fEa", + QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", + ExpectedAddressHash: "38r8PQdgw5vdebE9h12Eum6saVnWEXxbve", + ExpectedDerivationValueHash: "f07f644aa9123cd339f232be7f02ec536d40247f6f0c89a93d625ee57918c544", + NetworkParams: &chaincfg.MainNetParams, + FedInfo: getFakeFedInfo(), + }, + { + LpBtcAddress: "3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX", + BtcRefundAddress: "3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX", + LbcAddress: "2ff74F841b95E000625b3A77fed03714874C4fEa", + QuoteHash: "4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0", + ExpectedAddressHash: "33P85aACtqezxcGjhrferYkpg6djBtvstk", + ExpectedDerivationValueHash: "edb9cfe28705fa1619fe1c1bc70e55d5eee4965aea0de631bcf56434a7c454cc", + NetworkParams: &chaincfg.MainNetParams, + FedInfo: getFakeFedInfo(), + }, +} + +func getFakeFedInfo() blockchain.FederationInfo { + var keys []string + keys = append(keys, "02cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1") + keys = append(keys, "0362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a124") + keys = append(keys, "03c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db") + + var erpPubKeys []string + erpPubKeys = append(erpPubKeys, "0257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d4") + erpPubKeys = append(erpPubKeys, "03c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f9") + erpPubKeys = append(erpPubKeys, "03cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b3") + erpPubKeys = append(erpPubKeys, "02370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80") + + return blockchain.FederationInfo{ + ActiveFedBlockHeight: 0, + ErpKeys: erpPubKeys, + FedSize: int64(len(keys)), + FedThreshold: int64(len(keys)/2 + 1), + PubKeys: keys, + IrisActivationHeight: 0, + } +} + +func TestDerivationComplete(t *testing.T) { + for _, test := range testQuotes { + test.FedInfo.IrisActivationHeight = -1 + + quoteHash, err := hex.DecodeString(test.QuoteHash) + require.NoError(t, err) + userBtcAddress, err := bitcoin.DecodeAddressBase58(test.BtcRefundAddress, true) + require.NoError(t, err) + lbcAddress, err := hex.DecodeString(test.LbcAddress) + require.NoError(t, err) + lpBtcAddress, err := bitcoin.DecodeAddressBase58(test.LpBtcAddress, true) + require.NoError(t, err) + + args := blockchain.FlyoverDerivationArgs{ + QuoteHash: quoteHash, + UserBtcRefundAddress: userBtcAddress, + LbcAdress: lbcAddress, + LpBtcAddress: lpBtcAddress, + } + derivationHash := federation.GetDerivationValueHash(args) + + fedInfo := getFakeFedInfo() + if test.NetworkParams.Name == chaincfg.TestNet3Params.Name { + fedInfo.FedAddress = federationTestnetAddress + } else { + fedInfo.FedAddress = federationMainnetAddress + } + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, *test.NetworkParams) + require.NoError(t, err) + + flyoverRedeemScript := federation.GetFlyoverRedeemScript(derivationHash, fedRedeemScript) + address, err := btcutil.NewAddressScriptHash(flyoverRedeemScript, test.NetworkParams) + require.NoError(t, err) + + err = federation.ValidateRedeemScript(fedInfo, *test.NetworkParams, fedRedeemScript) + require.NoError(t, err) + require.EqualValues(t, test.ExpectedAddressHash, address.EncodeAddress()) + } +} + +func TestGetDerivationValueHash(t *testing.T) { + for _, test := range testQuotes { + quoteHash, err := hex.DecodeString(test.QuoteHash) + require.NoError(t, err) + userBtcAddress, err := bitcoin.DecodeAddressBase58(test.BtcRefundAddress, true) + require.NoError(t, err) + lbcAddress, err := hex.DecodeString(test.LbcAddress) + require.NoError(t, err) + lpBtcAddress, err := bitcoin.DecodeAddressBase58(test.LpBtcAddress, true) + require.NoError(t, err) + args := blockchain.FlyoverDerivationArgs{ + QuoteHash: quoteHash, + UserBtcRefundAddress: userBtcAddress, + LbcAdress: lbcAddress, + LpBtcAddress: lpBtcAddress, + } + hash := hex.EncodeToString(federation.GetDerivationValueHash(args)) + assert.Equal(t, test.ExpectedDerivationValueHash, hash) + } +} + +func TestBuildPowPegRedeemScript(t *testing.T) { + fedInfo := getFakeFedInfo() + fedRedeemScript, err := federation.GetRedeemScriptBuf(fedInfo, true) + require.NoError(t, err) + + scriptString := hex.EncodeToString(fedRedeemScript.Bytes()) + assert.True(t, checkSubstrings(scriptString, fedInfo.PubKeys...)) + + op2 := fmt.Sprintf("%02x", txscript.OP_2) + assert.EqualValues(t, scriptString[0:2], op2) + + op3 := fmt.Sprintf("%02x", txscript.OP_3) + assert.EqualValues(t, scriptString[len(scriptString)-4:len(scriptString)-2], op3) + + sort.Slice(fedInfo.PubKeys, func(i, j int) bool { + return fedInfo.PubKeys[i] < fedInfo.PubKeys[j] + }) + + buf2, err := federation.GetRedeemScriptBuf(fedInfo, true) + require.NoError(t, err) + str2 := hex.EncodeToString(buf2.Bytes()) + + assert.EqualValues(t, str2, scriptString) +} + +func TestBuildErpRedeemScript(t *testing.T) { + networkParams := chaincfg.MainNetParams + fedInfo := getFakeFedInfo() + fedRedeemScript, err := federation.GetErpRedeemScriptBuf(fedInfo, networkParams) + require.NoError(t, err) + + scriptString := hex.EncodeToString(fedRedeemScript.Bytes()) + assert.True(t, checkSubstrings(scriptString, fedInfo.ErpKeys...)) + assert.EqualValues(t, erpScriptString, scriptString) +} + +func TestBuildFlyoverRedeemScript(t *testing.T) { + params := chaincfg.MainNetParams + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = federationMainnetAddress + fedInfo.IrisActivationHeight = -1 + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, params) + require.NoError(t, err) + + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + flyoverScript := federation.GetFlyoverRedeemScript(derivationBytes, fedRedeemScript) + + scriptString := hex.EncodeToString(flyoverScript) + assert.True(t, checkSubstrings(scriptString, fedInfo.PubKeys...)) + assert.EqualValues(t, flyoverScriptString, scriptString) +} + +func TestBuildFlyoverErpRedeemScript(t *testing.T) { + params := chaincfg.MainNetParams + + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = "3C8e41MpbE2MB8XDqaYnQ2FbtRwPYLJtto" + fedInfo.IrisActivationHeight = 1 + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, params) + require.NoError(t, err) + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + + flyoverScript := federation.GetFlyoverRedeemScript(derivationBytes, fedRedeemScript) + + str := hex.EncodeToString(flyoverScript) + fmt.Println(str) + assert.True(t, checkSubstrings(str, fedInfo.ErpKeys...)) + assert.EqualValues(t, flyoverErpScriptString, str) +} + +func TestBuildFlyoverErpRedeemScriptFallback(t *testing.T) { + params := chaincfg.MainNetParams + + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = federationMainnetAddress + fedInfo.IrisActivationHeight = 1 + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, params) + require.NoError(t, err) + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + + flyoverScript := federation.GetFlyoverRedeemScript(derivationBytes, fedRedeemScript) + + str := hex.EncodeToString(flyoverScript) + assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) + assert.EqualValues(t, flyoverScriptString, str) +} + +func TestBuildPowPegAddressHash(t *testing.T) { + fedInfo := getFakeFedInfo() + fedInfo.IrisActivationHeight = -1 + + buf, err := federation.GetRedeemScriptBuf(fedInfo, true) + require.NoError(t, err) + + str := hex.EncodeToString(buf.Bytes()) + assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) + assert.EqualValues(t, str, powPegScriptString) + + address, err := btcutil.NewAddressScriptHash(buf.Bytes(), &chaincfg.MainNetParams) + require.NoError(t, err) + + assert.EqualValues(t, federationMainnetAddress, address.EncodeAddress()) +} + +func TestBuildFlyoverPowPegAddressHash(t *testing.T) { + params := chaincfg.MainNetParams + + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = federationMainnetAddress + fedInfo.IrisActivationHeight = -1 + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, params) + require.NoError(t, err) + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + + flyoverScript := federation.GetFlyoverRedeemScript(derivationBytes, fedRedeemScript) + + str := hex.EncodeToString(flyoverScript) + assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) + assert.EqualValues(t, flyoverScriptString, str) + + address, err := btcutil.NewAddressScriptHash(flyoverScript, &chaincfg.MainNetParams) + require.NoError(t, err) + expectedAddr := "34TNebhLLHsE6FHQVMmeHAhTFpaAWhfweR" + assert.EqualValues(t, expectedAddr, address.EncodeAddress()) +} + +func TestBuildFlyoverErpAddressHash(t *testing.T) { + params := chaincfg.MainNetParams + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = "3C8e41MpbE2MB8XDqaYnQ2FbtRwPYLJtto" + fedInfo.IrisActivationHeight = 1 + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, params) + require.NoError(t, err) + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + + flyoverScript := federation.GetFlyoverRedeemScript(derivationBytes, fedRedeemScript) + + str := hex.EncodeToString(flyoverScript) + assert.True(t, checkSubstrings(str, fedInfo.ErpKeys...)) + assert.EqualValues(t, flyoverErpScriptString, str) + + address, err := btcutil.NewAddressScriptHash(flyoverScript, &chaincfg.MainNetParams) + require.NoError(t, err) + expectedAddr := "3PS2FEphLJMbJURMdYYFNAZR6zLasX51RC" + + assert.EqualValues(t, expectedAddr, address.EncodeAddress()) +} + +func TestBuildFlyoverErpAddressHashFallback(t *testing.T) { + params := chaincfg.MainNetParams + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = federationMainnetAddress + fedInfo.IrisActivationHeight = 1 + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, params) + require.NoError(t, err) + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + + flyoverScript := federation.GetFlyoverRedeemScript(derivationBytes, fedRedeemScript) + + str := hex.EncodeToString(flyoverScript) + assert.True(t, checkSubstrings(str, fedInfo.PubKeys...)) + assert.EqualValues(t, flyoverScriptString, str) + + address, err := btcutil.NewAddressScriptHash(flyoverScript, &chaincfg.MainNetParams) + require.NoError(t, err) + expectedAddr := "34TNebhLLHsE6FHQVMmeHAhTFpaAWhfweR" + + assert.EqualValues(t, expectedAddr, address.EncodeAddress()) +} + +func TestGetDerivedBitcoinAddress(t *testing.T) { + for _, test := range testQuotes { + params := test.NetworkParams + fedInfo := getFakeFedInfo() + fedInfo.IrisActivationHeight = -1 + + if params.Name == chaincfg.TestNet3Params.Name { + fedInfo.FedAddress = "2N5muMepJizJE1gR7FbHJU6CD18V3BpNF9p" + } else { + fedInfo.FedAddress = federationMainnetAddress + } + + quoteHash, err := hex.DecodeString(test.QuoteHash) + require.NoError(t, err) + userBtcAddress, err := bitcoin.DecodeAddressBase58(test.BtcRefundAddress, true) + require.NoError(t, err) + lbcAddress, err := hex.DecodeString(test.LbcAddress) + require.NoError(t, err) + lpBtcAddress, err := bitcoin.DecodeAddressBase58(test.LpBtcAddress, true) + require.NoError(t, err) + derivationArgs := blockchain.FlyoverDerivationArgs{ + QuoteHash: quoteHash, + UserBtcRefundAddress: userBtcAddress, + LbcAdress: lbcAddress, + LpBtcAddress: lpBtcAddress, + } + + fedRedeemScript, err := federation.GetFedRedeemScript(fedInfo, *test.NetworkParams) + require.NoError(t, err) + derivationValue := federation.GetDerivationValueHash(derivationArgs) + derivation, err := federation.CalculateFlyoverDerivationAddress(fedInfo, *params, fedRedeemScript, derivationValue) + require.NoError(t, err) + assert.EqualValues(t, test.ExpectedAddressHash, derivation.Address) + } +} + +func TestCalculateFlyoverDerivationAddress_ErrorHandling(t *testing.T) { + t.Run("malformed redeem script", func(t *testing.T) { + derivation, err := federation.CalculateFlyoverDerivationAddress(getFakeFedInfo(), chaincfg.TestNet3Params, []byte{1}, []byte{1}) + assert.Equal(t, blockchain.FlyoverDerivation{}, derivation) + require.Error(t, err) + }) + t.Run("empty redeem script", func(t *testing.T) { + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = federationMainnetAddress + fedInfo.IrisActivationHeight = -1 + derivation, err := federation.CalculateFlyoverDerivationAddress(fedInfo, chaincfg.MainNetParams, []byte{}, derivationBytes) + assert.EqualValues(t, flyoverScriptString, derivation.RedeemScript) + require.NoError(t, err) + }) + + t.Run("invalid address", func(t *testing.T) { + derivationBytes, err := hex.DecodeString(flyoverDerivationHash) + require.NoError(t, err) + fedInfo := getFakeFedInfo() + fedInfo.FedAddress = "invalid" + derivation, err := federation.CalculateFlyoverDerivationAddress(fedInfo, chaincfg.MainNetParams, []byte{}, derivationBytes) + assert.Equal(t, blockchain.FlyoverDerivation{}, derivation) + require.ErrorContains(t, err, "error generating fed redeem script") + }) +} + +func TestValidateRedeemScript_ErrorHandling(t *testing.T) { + t.Run("fail on invalid fed info", func(t *testing.T) { + require.Error(t, federation.ValidateRedeemScript(getFakeFedInfo(), chaincfg.MainNetParams, []byte{1})) + }) + t.Run("fail on invalid script", func(t *testing.T) { + require.Error(t, federation.ValidateRedeemScript(getFakeFedInfo(), chaincfg.MainNetParams, nil)) + }) +} + +func TestGetFedRedeemScript_ErrorHandling(t *testing.T) { + t.Run("fail on invalid fed info", func(t *testing.T) { + script, err := federation.GetFedRedeemScript(blockchain.FederationInfo{}, chaincfg.MainNetParams) + assert.Nil(t, script) + require.Error(t, err) + }) +} + +func TestGetErpRedeemScriptBuf_ErrorHandling(t *testing.T) { + t.Run("fail on invalid fed info", func(t *testing.T) { + script, err := federation.GetErpRedeemScriptBuf(blockchain.FederationInfo{ + ErpKeys: []string{invalidKey}, + }, chaincfg.MainNetParams) + assert.Nil(t, script) + require.Error(t, err) + }) +} + +func TestGetRedeemScriptBuf_ErrorHandling(t *testing.T) { + t.Run("fail on invalid fed info", func(t *testing.T) { + script, err := federation.GetRedeemScriptBuf(blockchain.FederationInfo{PubKeys: []string{invalidKey}}, true) + assert.Nil(t, script) + require.Error(t, err) + }) +} + +func checkSubstrings(str string, subs ...string) bool { + for _, sub := range subs { + if !strings.Contains(str, sub) { + return false + } + } + return true +} From c0af492392d6c5fb2cfefa14d9e98c175aa852af Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 19 Apr 2024 16:43:48 +0200 Subject: [PATCH 046/113] test: unit tests for federation scripts & rsk rpc --- .mockery.yaml | 9 + .../dataproviders/rootstock/account_test.go | 85 + .../dataproviders/rootstock/bindings.go | 119 ++ .../dataproviders/rootstock/bridge.go | 67 +- .../dataproviders/rootstock/bridge_test.go | 184 ++ .../dataproviders/rootstock/common.go | 31 +- .../dataproviders/rootstock/common_test.go | 110 ++ .../rootstock/federation/federation_test.go | 63 +- .../dataproviders/rootstock/fee_collector.go | 15 +- .../rootstock/fee_collector_test.go | 29 + .../adapters/dataproviders/rootstock/lbc.go | 229 ++- .../dataproviders/rootstock/lbc_test.go | 1264 +++++++++++++ .../adapters/dataproviders/rootstock/rpc.go | 77 +- .../dataproviders/rootstock/rpc_test.go | 264 +++ .../dataproviders/rootstock/wallet.go | 9 +- .../dataproviders/rootstock/wallet_test.go | 224 +++ internal/configuration/registry/messaging.go | 2 +- internal/configuration/registry/rootstock.go | 22 +- .../generate_default_credentials_test.go | 6 +- test/mocks/common.go | 25 + test/mocks/event_iterator_adapter_mock.go | 214 +++ test/mocks/lbc_adapter_mock.go | 1602 +++++++++++++++++ test/mocks/lbc_binding_mock.go | 1457 +++++++++++++++ test/mocks/lbc_caller_binding_mock.go | 94 + test/mocks/rpc_client_binding_mock.go | 711 ++++++++ test/mocks/rsk_bridge_binding_mock.go | 443 +++++ test/mocks/transaction_signer_mock.go | 248 +++ 27 files changed, 7374 insertions(+), 229 deletions(-) create mode 100644 internal/adapters/dataproviders/rootstock/account_test.go create mode 100644 internal/adapters/dataproviders/rootstock/bindings.go create mode 100644 internal/adapters/dataproviders/rootstock/bridge_test.go create mode 100644 internal/adapters/dataproviders/rootstock/common_test.go create mode 100644 internal/adapters/dataproviders/rootstock/fee_collector_test.go create mode 100644 internal/adapters/dataproviders/rootstock/lbc_test.go create mode 100644 internal/adapters/dataproviders/rootstock/rpc_test.go create mode 100644 internal/adapters/dataproviders/rootstock/wallet_test.go create mode 100644 test/mocks/common.go create mode 100644 test/mocks/event_iterator_adapter_mock.go create mode 100644 test/mocks/lbc_adapter_mock.go create mode 100644 test/mocks/lbc_binding_mock.go create mode 100644 test/mocks/lbc_caller_binding_mock.go create mode 100644 test/mocks/rpc_client_binding_mock.go create mode 100644 test/mocks/rsk_bridge_binding_mock.go create mode 100644 test/mocks/transaction_signer_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index d1a5344e..82c8fdce 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -7,6 +7,15 @@ packages: github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting: interfaces: sesClient: + github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock: + interfaces: + LbcBinding: + RskBridgeBinding: + TransactionSigner: + RpcClientBinding: + LbcCallerBinding: + LbcAdapter: + EventIteratorAdapter: github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin: interfaces: rpcClient: diff --git a/internal/adapters/dataproviders/rootstock/account_test.go b/internal/adapters/dataproviders/rootstock/account_test.go new file mode 100644 index 00000000..4cfa3b8d --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/account_test.go @@ -0,0 +1,85 @@ +package rootstock_test + +import ( + "fmt" + "github.com/ethereum/go-ethereum/common" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "io" + "os" + "path/filepath" + "testing" + "time" +) + +const ( + keyPassword = "test" + keyAddress = "0x9d93929a9099be4355fc2389fbf253982f9df47c" + keyPath = "../../../../docker-compose/localstack/local-key.json" +) + +func TestGetAccount(t *testing.T) { + testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-account-%d", time.Now().UnixNano())) + keyFile, err := os.Open(keyPath) + require.NoError(t, err) + + defer func(file *os.File) { + closingErr := file.Close() + require.NoError(t, closingErr) + }(keyFile) + + keyBytes, err := io.ReadAll(keyFile) + require.NoError(t, err) + t.Run("Create new account", func(t *testing.T) { + account, testError := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + _, noExistError := os.Stat(testDir) + assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") + require.NoError(t, testError) + assert.Equal(t, common.HexToAddress(keyAddress), account.Account.Address) + assert.NotNil(t, 1, len(account.Keystore.Accounts())) + }) + t.Run("Retrieve created account new account", func(t *testing.T) { + otherAccount, otherError := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + require.NoError(t, otherError) + assert.Equal(t, common.HexToAddress(keyAddress), otherAccount.Account.Address) + assert.NotNil(t, 1, len(otherAccount.Keystore.Accounts())) + }) +} + +func TestGetAccount_ErrorHandling(t *testing.T) { + testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-%d", time.Now().UnixNano())) + keyFile, setupErr := os.Open(keyPath) + require.NoError(t, setupErr) + + defer func(file *os.File) { + closingErr := file.Close() + require.NoError(t, closingErr) + }(keyFile) + + keyBytes, setupErr := io.ReadAll(keyFile) + require.NoError(t, setupErr) + t.Run("Invalid dir", func(t *testing.T) { + account, err := rootstock.GetAccount("/test", 0, string(keyBytes), keyPassword) + assert.Nil(t, account) + require.Error(t, err) + }) + t.Run("Invalid key", func(t *testing.T) { + account, err := rootstock.GetAccount(testDir, 0, "any key", keyPassword) + assert.Nil(t, account) + require.Error(t, err) + }) + t.Run("Invalid password", func(t *testing.T) { + account, err := rootstock.GetAccount(testDir, 0, string(keyBytes), "incorrect") + assert.Nil(t, account) + require.Error(t, err) + }) + t.Run("Invalid account number", func(t *testing.T) { + // we create a keystore first so in the second call we can try to get an account that doesn't exist + _, err := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + require.NoError(t, err) + account, err := rootstock.GetAccount(testDir, 1, string(keyBytes), keyPassword) + assert.Nil(t, account) + require.Error(t, err) + }) +} diff --git a/internal/adapters/dataproviders/rootstock/bindings.go b/internal/adapters/dataproviders/rootstock/bindings.go new file mode 100644 index 00000000..70e59417 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/bindings.go @@ -0,0 +1,119 @@ +package rootstock + +import ( + "context" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "math/big" +) + +type RpcClientBinding interface { + Close() + ChainID(ctx context.Context) (*big.Int, error) + TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) + CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) + PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) + SendTransaction(ctx context.Context, tx *types.Transaction) error + BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) + NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) + EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) + SuggestGasPrice(ctx context.Context) (*big.Int, error) + TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) + BlockNumber(ctx context.Context) (uint64, error) +} + +type RskBridgeBinding interface { + GetFederationAddress(opts *bind.CallOpts) (string, error) + GetMinimumLockTxValue(opts *bind.CallOpts) (*big.Int, error) + GetActivePowpegRedeemScript(opts *bind.CallOpts) ([]byte, error) + GetFederationSize(opts *bind.CallOpts) (*big.Int, error) + GetFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) + GetFederationThreshold(opts *bind.CallOpts) (*big.Int, error) + GetActiveFederationCreationBlockHeight(opts *bind.CallOpts) (*big.Int, error) +} + +type LbcBinding interface { + HashQuote(opts *bind.CallOpts, quote bindings.QuotesPeginQuote) ([32]byte, error) + HashPegoutQuote(opts *bind.CallOpts, quote bindings.QuotesPegOutQuote) ([32]byte, error) + GetProviderIds(opts *bind.CallOpts) (*big.Int, error) + GetProviders(opts *bind.CallOpts, providerIds []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error) + Resign(opts *bind.TransactOpts) (*types.Transaction, error) + SetProviderStatus(opts *bind.TransactOpts, _providerId *big.Int, status bool) (*types.Transaction, error) + GetCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) + GetPegoutCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) + GetMinCollateral(opts *bind.CallOpts) (*big.Int, error) + AddCollateral(opts *bind.TransactOpts) (*types.Transaction, error) + AddPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) + WithdrawCollateral(opts *bind.TransactOpts) (*types.Transaction, error) + WithdrawPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) + GetBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) + CallForUser(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote) (*types.Transaction, error) + RegisterPegIn(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) + RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) + IsOperational(opts *bind.CallOpts, addr common.Address) (bool, error) + IsOperationalForPegout(opts *bind.CallOpts, addr common.Address) (bool, error) + Register(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) + FilterPegOutDeposit(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error) + FilterPenalized(opts *bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error) + ParseRegister(log types.Log) (*bindings.LiquidityBridgeContractRegister, error) + ProductFeePercentage(opts *bind.CallOpts) (*big.Int, error) +} + +type LbcAdapter interface { + LbcBinding + Caller() LbcCallerBinding + DepositEventIteratorAdapter(rawIterator *bindings.LiquidityBridgeContractPegOutDepositIterator) EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit] + PenalizedEventIteratorAdapter(rawIterator *bindings.LiquidityBridgeContractPenalizedIterator) EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized] +} + +type EventIteratorAdapter[T any] interface { + Next() bool + Close() error + Event() *T + Error() error +} + +type LbcCallerBinding interface { + Call(opts *bind.CallOpts, result *[]any, method string, params ...any) error +} + +type depositEventIteratorAdapter struct { + *bindings.LiquidityBridgeContractPegOutDepositIterator +} + +func (i *depositEventIteratorAdapter) Event() *bindings.LiquidityBridgeContractPegOutDeposit { + return i.LiquidityBridgeContractPegOutDepositIterator.Event +} + +type penalizedEventIteratorAdapter struct { + *bindings.LiquidityBridgeContractPenalizedIterator +} + +func (i *penalizedEventIteratorAdapter) Event() *bindings.LiquidityBridgeContractPenalized { + return i.LiquidityBridgeContractPenalizedIterator.Event +} + +type lbcAdapter struct { + *bindings.LiquidityBridgeContract +} + +func NewLbcAdapter(liquidityBridgeContract *bindings.LiquidityBridgeContract) LbcAdapter { + return &lbcAdapter{LiquidityBridgeContract: liquidityBridgeContract} +} + +func (lbc *lbcAdapter) Caller() LbcCallerBinding { + return &bindings.LiquidityBridgeContractCallerRaw{ + Contract: &lbc.LiquidityBridgeContract.LiquidityBridgeContractCaller, + } +} + +func (lbc *lbcAdapter) DepositEventIteratorAdapter(rawIterator *bindings.LiquidityBridgeContractPegOutDepositIterator) EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit] { + return &depositEventIteratorAdapter{LiquidityBridgeContractPegOutDepositIterator: rawIterator} +} + +func (lbc *lbcAdapter) PenalizedEventIteratorAdapter(rawIterator *bindings.LiquidityBridgeContractPenalizedIterator) EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized] { + return &penalizedEventIteratorAdapter{LiquidityBridgeContractPenalizedIterator: rawIterator} +} diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go index 295ca030..1f67bd9b 100644 --- a/internal/adapters/dataproviders/rootstock/bridge.go +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -5,8 +5,6 @@ import ( "fmt" "github.com/btcsuite/btcd/chaincfg" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" @@ -18,9 +16,10 @@ type rskBridgeImpl struct { requiredConfirmations uint64 irisActivationHeight int64 erpKeys []string - contract *bindings.RskBridge - client *ethclient.Client + contract RskBridgeBinding + client RpcClientBinding btcParams *chaincfg.Params + retryParams RetryParams } func NewRskBridgeImpl( @@ -28,9 +27,10 @@ func NewRskBridgeImpl( requiredConfirmations uint64, irisActivationHeight int64, erpKeys []string, - contract *bindings.RskBridge, + contract RskBridgeBinding, client *RskClient, btcParams *chaincfg.Params, + retryParams RetryParams, ) blockchain.RootstockBridge { return &rskBridgeImpl{ address: address, @@ -40,6 +40,7 @@ func NewRskBridgeImpl( contract: contract, client: client.client, btcParams: btcParams, + retryParams: retryParams, } } @@ -49,16 +50,18 @@ func (bridge *rskBridgeImpl) GetAddress() string { func (bridge *rskBridgeImpl) GetFedAddress() (string, error) { opts := &bind.CallOpts{} - return rskRetry(func() (string, error) { - return bridge.contract.GetFederationAddress(opts) - }) + return rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() (string, error) { + return bridge.contract.GetFederationAddress(opts) + }) } func (bridge *rskBridgeImpl) GetMinimumLockTxValue() (*entities.Wei, error) { opts := &bind.CallOpts{} - result, err := rskRetry(func() (*big.Int, error) { - return bridge.contract.GetMinimumLockTxValue(opts) - }) + result, err := rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() (*big.Int, error) { + return bridge.contract.GetMinimumLockTxValue(opts) + }) if err != nil { return nil, err } @@ -71,9 +74,10 @@ func (bridge *rskBridgeImpl) GetFlyoverDerivationAddress(args blockchain.Flyover var fedRedeemScript, derivationValue []byte derivationValue = federation.GetDerivationValueHash(args) opts := &bind.CallOpts{} - fedRedeemScript, err = rskRetry(func() ([]byte, error) { - return bridge.contract.GetActivePowpegRedeemScript(opts) - }) + fedRedeemScript, err = rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() ([]byte, error) { + return bridge.contract.GetActivePowpegRedeemScript(opts) + }) if err != nil { return blockchain.FlyoverDerivation{}, fmt.Errorf("error retreiving fed redeem script from bridge: %w", err) } @@ -92,41 +96,46 @@ func (bridge *rskBridgeImpl) FetchFederationInfo() (blockchain.FederationInfo, e var i, federationSize int64 opts := &bind.CallOpts{} - fedSize, err := rskRetry(func() (*big.Int, error) { - return bridge.contract.GetFederationSize(opts) - }) + fedSize, err := rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() (*big.Int, error) { + return bridge.contract.GetFederationSize(opts) + }) if err != nil { return blockchain.FederationInfo{}, err } federationSize = fedSize.Int64() for i = 0; i < federationSize; i++ { - pubKey, err = rskRetry(func() ([]byte, error) { - return bridge.contract.GetFederatorPublicKeyOfType(opts, big.NewInt(i), "btc") - }) + pubKey, err = rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() ([]byte, error) { + return bridge.contract.GetFederatorPublicKeyOfType(opts, big.NewInt(i), "btc") + }) if err != nil { return blockchain.FederationInfo{}, fmt.Errorf("error fetching fed public key: %w", err) } pubKeys = append(pubKeys, hex.EncodeToString(pubKey)) } - fedThreshold, err := rskRetry(func() (*big.Int, error) { - return bridge.contract.GetFederationThreshold(opts) - }) + fedThreshold, err := rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() (*big.Int, error) { + return bridge.contract.GetFederationThreshold(opts) + }) if err != nil { return blockchain.FederationInfo{}, fmt.Errorf("error fetching federation size: %w", err) } - fedAddress, err := rskRetry(func() (string, error) { - return bridge.contract.GetFederationAddress(opts) - }) + fedAddress, err := rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() (string, error) { + return bridge.contract.GetFederationAddress(opts) + }) if err != nil { return blockchain.FederationInfo{}, fmt.Errorf("error fetching federation address: %w", err) } - activeFedBlockHeight, err := rskRetry(func() (*big.Int, error) { - return bridge.contract.GetActiveFederationCreationBlockHeight(opts) - }) + activeFedBlockHeight, err := rskRetry(bridge.retryParams.Retries, bridge.retryParams.Sleep, + func() (*big.Int, error) { + return bridge.contract.GetActiveFederationCreationBlockHeight(opts) + }) if err != nil { return blockchain.FederationInfo{}, fmt.Errorf("error fetching federation height: %w", err) } diff --git a/internal/adapters/dataproviders/rootstock/bridge_test.go b/internal/adapters/dataproviders/rootstock/bridge_test.go new file mode 100644 index 00000000..be547811 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/bridge_test.go @@ -0,0 +1,184 @@ +package rootstock_test + +import ( + "encoding/hex" + "github.com/btcsuite/btcd/chaincfg" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +var dummyClient = rootstock.NewRskClient(nil) + +func TestRskBridgeImpl_GetAddress(t *testing.T) { + bridge := rootstock.NewRskBridgeImpl(test.AnyAddress, 0, 0, nil, nil, dummyClient, nil, rootstock.RetryParams{}) + assert.Equal(t, test.AnyAddress, bridge.GetAddress()) +} + +func TestRskBridgeImpl_GetRequiredTxConfirmations(t *testing.T) { + bridge := rootstock.NewRskBridgeImpl("", 10, 0, nil, nil, dummyClient, nil, rootstock.RetryParams{}) + assert.Equal(t, uint64(10), bridge.GetRequiredTxConfirmations()) +} + +func TestRskBridgeImpl_GetFedAddress(t *testing.T) { + t.Run("Success", func(t *testing.T) { + bridgeMock := &mocks.RskBridgeBindingMock{} + bridgeMock.On("GetFederationAddress", mock.Anything).Return(test.AnyAddress, nil) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + result, err := bridge.GetFedAddress() + assert.Equal(t, test.AnyAddress, result) + require.NoError(t, err) + bridgeMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + bridgeMock := &mocks.RskBridgeBindingMock{} + bridgeMock.On("GetFederationAddress", mock.Anything).Return("", assert.AnError) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + result, err := bridge.GetFedAddress() + assert.Empty(t, result) + require.Error(t, err) + }) +} + +func TestRskBridgeImpl_GetMinimumLockTxValue(t *testing.T) { + t.Run("Success", func(t *testing.T) { + bridgeMock := &mocks.RskBridgeBindingMock{} + bridgeMock.On("GetMinimumLockTxValue", mock.Anything).Return(big.NewInt(5), nil) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + result, err := bridge.GetMinimumLockTxValue() + assert.IsType(t, &entities.Wei{}, result) + assert.Equal(t, entities.NewWei(50000000000), result) + require.NoError(t, err) + bridgeMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + bridgeMock := &mocks.RskBridgeBindingMock{} + bridgeMock.On("GetMinimumLockTxValue", mock.Anything).Return(nil, assert.AnError) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + result, err := bridge.GetMinimumLockTxValue() + assert.Nil(t, result) + require.Error(t, err) + }) +} + +func TestRskBridgeImpl_GetFlyoverDerivationAddress(t *testing.T) { + const redeemScriptString = "522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53ae" + lbcAddress, err := hex.DecodeString("2ff74F841b95E000625b3A77fed03714874C4fEa") + require.NoError(t, err) + quoteHash, err := hex.DecodeString("4a3eca107f22707e5dbc79964f3e6c21ec5e354e0903391245d9fdbe6bd2b2f0") + require.NoError(t, err) + userBtcAddress, err := bitcoin.DecodeAddressBase58("mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", true) + require.NoError(t, err) + lpBtcAddress, err := bitcoin.DecodeAddressBase58("mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", true) + require.NoError(t, err) + args := blockchain.FlyoverDerivationArgs{ + FedInfo: mocks.GetFakeFedInfo(), + LbcAdress: lbcAddress, + UserBtcRefundAddress: userBtcAddress, + LpBtcAddress: lpBtcAddress, + QuoteHash: quoteHash, + } + args.FedInfo.FedAddress = "2N5muMepJizJE1gR7FbHJU6CD18V3BpNF9p" + t.Run("Success", func(t *testing.T) { + var testError error + var redeemScriptBytes []byte + var result blockchain.FlyoverDerivation + bridgeMock := &mocks.RskBridgeBindingMock{} + redeemScriptBytes, testError = hex.DecodeString(redeemScriptString) + require.NoError(t, testError) + bridgeMock.On("GetActivePowpegRedeemScript", mock.Anything).Return(redeemScriptBytes, nil) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + result, testError = bridge.GetFlyoverDerivationAddress(args) + assert.Equal(t, blockchain.FlyoverDerivation{ + Address: "2Mx7jaPHtsgJTbqGnjU5UqBpkekHgfigXay", + RedeemScript: "20ff883edd54f8cb22464a8181ed62652fcdb0028e0ada18f9828afd76e0df2c7275522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53ae", + }, result) + require.NoError(t, testError) + bridgeMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + var testError error + var result blockchain.FlyoverDerivation + bridgeMock := &mocks.RskBridgeBindingMock{} + bridgeMock.On("GetActivePowpegRedeemScript", mock.Anything).Return(nil, assert.AnError) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + result, testError = bridge.GetFlyoverDerivationAddress(args) + assert.Empty(t, result) + require.ErrorContains(t, testError, "error retreiving fed redeem script from bridge") + }) +} + +func TestRskBridgeImpl_FetchFederationInfo(t *testing.T) { + t.Run("Success", func(t *testing.T) { + bridgeMock := &mocks.RskBridgeBindingMock{} + bridgeMock.On("GetFederationSize", mock.Anything).Return(big.NewInt(2), nil).Once() + bridgeMock.On("GetFederatorPublicKeyOfType", mock.Anything, big.NewInt(0), "btc").Return([]byte{0x01, 0x02, 0x03}, nil).Once() + bridgeMock.On("GetFederatorPublicKeyOfType", mock.Anything, big.NewInt(1), "btc").Return([]byte{0x0a, 0x0b, 0x0c}, nil).Once() + bridgeMock.On("GetFederationThreshold", mock.Anything).Return(big.NewInt(5), nil).Once() + bridgeMock.On("GetFederationAddress", mock.Anything).Return(test.AnyAddress, nil).Once() + bridgeMock.On("GetActiveFederationCreationBlockHeight", mock.Anything).Return(big.NewInt(500), nil).Once() + bridge := rootstock.NewRskBridgeImpl("", 0, 100, []string{"key1", "key2", "key3"}, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + fedInfo, err := bridge.FetchFederationInfo() + require.NoError(t, err) + assert.Equal(t, blockchain.FederationInfo{ + FedSize: 2, + FedThreshold: 5, + FedAddress: test.AnyAddress, + PubKeys: []string{"010203", "0a0b0c"}, + ActiveFedBlockHeight: 500, + IrisActivationHeight: 100, + ErpKeys: []string{"key1", "key2", "key3"}, + }, fedInfo) + bridgeMock.AssertExpectations(t) + }) + + t.Run("Error handling", func(t *testing.T) { + for _, setUp := range fetchFedInfoErrorSetUps() { + bridgeMock := &mocks.RskBridgeBindingMock{} + setUp(bridgeMock) + bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + result, err := bridge.FetchFederationInfo() + require.Error(t, err) + assert.Empty(t, result) + bridgeMock.AssertExpectations(t) + } + }) +} + +func fetchFedInfoErrorSetUps() []func(bridgeMock *mocks.RskBridgeBindingMock) { + return []func(bridgeMock *mocks.RskBridgeBindingMock){ + func(bridgeMock *mocks.RskBridgeBindingMock) { + bridgeMock.On("GetFederationSize", mock.Anything).Return(nil, assert.AnError).Once() + }, + func(bridgeMock *mocks.RskBridgeBindingMock) { + bridgeMock.On("GetFederationSize", mock.Anything).Return(big.NewInt(1), nil).Once() + bridgeMock.On("GetFederatorPublicKeyOfType", mock.Anything, big.NewInt(0), "btc").Return(nil, assert.AnError).Once() + }, + func(bridgeMock *mocks.RskBridgeBindingMock) { + bridgeMock.On("GetFederationSize", mock.Anything).Return(big.NewInt(1), nil).Once() + bridgeMock.On("GetFederatorPublicKeyOfType", mock.Anything, big.NewInt(0), "btc").Return([]byte{0x01, 0x02, 0x03}, nil).Once() + bridgeMock.On("GetFederationThreshold", mock.Anything).Return(nil, assert.AnError).Once() + }, + func(bridgeMock *mocks.RskBridgeBindingMock) { + bridgeMock.On("GetFederationSize", mock.Anything).Return(big.NewInt(1), nil).Once() + bridgeMock.On("GetFederatorPublicKeyOfType", mock.Anything, big.NewInt(0), "btc").Return([]byte{0x01, 0x02, 0x03}, nil).Once() + bridgeMock.On("GetFederationThreshold", mock.Anything).Return(big.NewInt(5), nil).Once() + bridgeMock.On("GetFederationAddress", mock.Anything).Return("", assert.AnError).Once() + }, + func(bridgeMock *mocks.RskBridgeBindingMock) { + bridgeMock.On("GetFederationSize", mock.Anything).Return(big.NewInt(1), nil).Once() + bridgeMock.On("GetFederatorPublicKeyOfType", mock.Anything, big.NewInt(0), "btc").Return([]byte{0x01, 0x02, 0x03}, nil).Once() + bridgeMock.On("GetFederationThreshold", mock.Anything).Return(big.NewInt(5), nil).Once() + bridgeMock.On("GetFederationAddress", mock.Anything).Return(test.AnyAddress, nil).Once() + bridgeMock.On("GetActiveFederationCreationBlockHeight", mock.Anything).Return(nil, assert.AnError).Once() + }, + } +} diff --git a/internal/adapters/dataproviders/rootstock/common.go b/internal/adapters/dataproviders/rootstock/common.go index 1653e084..e1776d61 100644 --- a/internal/adapters/dataproviders/rootstock/common.go +++ b/internal/adapters/dataproviders/rootstock/common.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" geth "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" log "github.com/sirupsen/logrus" @@ -21,20 +20,30 @@ const ( txMiningWaitTimeout = 2 * time.Minute ) +var DefaultRetryParams = RetryParams{ + Retries: rpcCallRetryMax, + Sleep: rpcCallRetrySleep, +} + type RskAccount struct { Account *accounts.Account Keystore *keystore.KeyStore } type RskClient struct { - client *ethclient.Client + client RpcClientBinding +} + +type RetryParams struct { + Retries uint + Sleep time.Duration } -func NewRskClient(client *ethclient.Client) *RskClient { +func NewRskClient(client RpcClientBinding) *RskClient { return &RskClient{client: client} } -func (c *RskClient) Rpc() *ethclient.Client { +func (c *RskClient) Rpc() RpcClientBinding { return c.client } @@ -66,20 +75,26 @@ func ParseAddress(address *common.Address, textAddress string) error { return nil } -func rskRetry[R any](call func() (R, error)) (R, error) { +func rskRetry[R any](retries uint, retrySleep time.Duration, call func() (R, error)) (R, error) { var result R var err error - for i := 0; i < rpcCallRetryMax; i++ { + var i uint + + if retries == 0 { + return call() + } + + for i = 0; i < retries; i++ { result, err = call() if err == nil { return result, nil } - time.Sleep(rpcCallRetrySleep) + time.Sleep(retrySleep) } return result, err } -func awaitTx(client *ethclient.Client, logName string, txCall func() (*geth.Transaction, error)) (r *geth.Receipt, e error) { +func awaitTx(client RpcClientBinding, logName string, txCall func() (*geth.Transaction, error)) (r *geth.Receipt, e error) { var tx *geth.Transaction var err error diff --git a/internal/adapters/dataproviders/rootstock/common_test.go b/internal/adapters/dataproviders/rootstock/common_test.go new file mode 100644 index 00000000..b5dc2145 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/common_test.go @@ -0,0 +1,110 @@ +package rootstock_test + +import ( + "context" + "github.com/ethereum/go-ethereum/common" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "testing" + "time" +) + +func TestParseAddress(t *testing.T) { + t.Run("Success", func(t *testing.T) { + addresses := []string{ + "0x79568c2989232dCa1840087D73d403602364c0D4", + "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", + "0x892813507Bf3aBF2890759d2135Ec34f4909Fea5", + } + var address common.Address + for _, addr := range addresses { + err := rootstock.ParseAddress(&address, addr) + require.NoError(t, err) + assert.Equal(t, addr, address.Hex()) + } + }) + t.Run("Error", func(t *testing.T) { + addresses := []string{ + "0x79568c2989232dCa1840087D73d403602364c0D", + "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa", + "0x892813507Bf3aBF2890759d2135Ec34f4909Fea", + "no hex", + "0x892813507Bf3aBF2890759d2135Ec34f4909Fea51", + "0x892813507Bf3aBF2890759d2135Ec34f4909Fea", + } + var address common.Address + for _, addr := range addresses { + err := rootstock.ParseAddress(&address, addr) + require.ErrorIs(t, err, blockchain.InvalidAddressError) + } + }) +} + +func TestRskClient_CheckConnection(t *testing.T) { + clientBindingMock := &mocks.RpcClientBindingMock{} + t.Run("Success", func(t *testing.T) { + clientBindingMock.On("ChainID", test.AnyCtx).Return(big.NewInt(31), nil).Once() + client := rootstock.NewRskClient(clientBindingMock) + ok := client.CheckConnection(context.Background()) + require.True(t, ok) + }) + t.Run("Error", func(t *testing.T) { + clientBindingMock.On("ChainID", test.AnyCtx).Return(nil, assert.AnError).Once() + client := rootstock.NewRskClient(clientBindingMock) + ok := client.CheckConnection(context.Background()) + require.False(t, ok) + }) +} + +func TestRskClient_Rpc(t *testing.T) { + clientBindingMock := &mocks.RpcClientBindingMock{} + client := rootstock.NewRskClient(clientBindingMock) + assert.Equal(t, clientBindingMock, client.Rpc()) +} + +func TestRskClient_Shutdown(t *testing.T) { + clientBindingMock := &mocks.RpcClientBindingMock{} + clientBindingMock.On("Close").Once() + endChannel := make(chan bool, 1) + client := rootstock.NewRskClient(clientBindingMock) + client.Shutdown(endChannel) + assert.True(t, <-endChannel) + clientBindingMock.AssertCalled(t, "Close") +} + +// Since the function is private, it will be tested through HashPeginQuote +func TestRskRetry(t *testing.T) { + const retries = 3 + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + dummyClient, + test.AnyAddress, + lbcMock, + nil, + rootstock.RetryParams{Retries: retries, Sleep: 1 * time.Second}, + ) + t.Run("Error on every attempt", func(t *testing.T) { + lbcMock.On("HashQuote", mock.Anything, mock.Anything).Return(nil, assert.AnError).Times(retries) + start := time.Now() + result, err := lbc.HashPeginQuote(peginQuote) + end := time.Now() + assert.WithinRange(t, end, start, start.Add(3*time.Second).Add(100*time.Millisecond)) + require.Error(t, err) + assert.Empty(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error first attempt", func(t *testing.T) { + lbcMock.On("HashQuote", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + lbcMock.On("HashQuote", mock.Anything, mock.Anything).Return([32]byte{1, 2, 3}, nil).Once() + result, err := lbc.HashPeginQuote(peginQuote) + require.NoError(t, err) + assert.NotEmpty(t, result) + lbcMock.AssertExpectations(t) + }) +} diff --git a/internal/adapters/dataproviders/rootstock/federation/federation_test.go b/internal/adapters/dataproviders/rootstock/federation/federation_test.go index 9cb556d6..b018c104 100644 --- a/internal/adapters/dataproviders/rootstock/federation/federation_test.go +++ b/internal/adapters/dataproviders/rootstock/federation/federation_test.go @@ -9,6 +9,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "sort" @@ -50,7 +51,7 @@ var testQuotes = []testQuote{ ExpectedAddressHash: "2Mx7jaPHtsgJTbqGnjU5UqBpkekHgfigXay", ExpectedDerivationValueHash: "ff883edd54f8cb22464a8181ed62652fcdb0028e0ada18f9828afd76e0df2c72", NetworkParams: &chaincfg.TestNet3Params, - FedInfo: getFakeFedInfo(), + FedInfo: mocks.GetFakeFedInfo(), }, { LpBtcAddress: "2NDjJznHgtH1rzq63eeFG3SiDi5wxE25FSz", @@ -60,7 +61,7 @@ var testQuotes = []testQuote{ ExpectedAddressHash: "2N6LxcNDYkKzeyXh7xjZUNZnS9G4Sq3mysi", ExpectedDerivationValueHash: "4cd8a9037f5342217092a9ccc027ab0af1be60bf015e4228afc87214f86f2e51", NetworkParams: &chaincfg.TestNet3Params, - FedInfo: getFakeFedInfo(), + FedInfo: mocks.GetFakeFedInfo(), }, { LpBtcAddress: "17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem", @@ -70,7 +71,7 @@ var testQuotes = []testQuote{ ExpectedAddressHash: "38r8PQdgw5vdebE9h12Eum6saVnWEXxbve", ExpectedDerivationValueHash: "f07f644aa9123cd339f232be7f02ec536d40247f6f0c89a93d625ee57918c544", NetworkParams: &chaincfg.MainNetParams, - FedInfo: getFakeFedInfo(), + FedInfo: mocks.GetFakeFedInfo(), }, { LpBtcAddress: "3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX", @@ -80,32 +81,10 @@ var testQuotes = []testQuote{ ExpectedAddressHash: "33P85aACtqezxcGjhrferYkpg6djBtvstk", ExpectedDerivationValueHash: "edb9cfe28705fa1619fe1c1bc70e55d5eee4965aea0de631bcf56434a7c454cc", NetworkParams: &chaincfg.MainNetParams, - FedInfo: getFakeFedInfo(), + FedInfo: mocks.GetFakeFedInfo(), }, } -func getFakeFedInfo() blockchain.FederationInfo { - var keys []string - keys = append(keys, "02cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1") - keys = append(keys, "0362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a124") - keys = append(keys, "03c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db") - - var erpPubKeys []string - erpPubKeys = append(erpPubKeys, "0257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d4") - erpPubKeys = append(erpPubKeys, "03c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f9") - erpPubKeys = append(erpPubKeys, "03cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b3") - erpPubKeys = append(erpPubKeys, "02370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80") - - return blockchain.FederationInfo{ - ActiveFedBlockHeight: 0, - ErpKeys: erpPubKeys, - FedSize: int64(len(keys)), - FedThreshold: int64(len(keys)/2 + 1), - PubKeys: keys, - IrisActivationHeight: 0, - } -} - func TestDerivationComplete(t *testing.T) { for _, test := range testQuotes { test.FedInfo.IrisActivationHeight = -1 @@ -127,7 +106,7 @@ func TestDerivationComplete(t *testing.T) { } derivationHash := federation.GetDerivationValueHash(args) - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() if test.NetworkParams.Name == chaincfg.TestNet3Params.Name { fedInfo.FedAddress = federationTestnetAddress } else { @@ -169,7 +148,7 @@ func TestGetDerivationValueHash(t *testing.T) { } func TestBuildPowPegRedeemScript(t *testing.T) { - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedRedeemScript, err := federation.GetRedeemScriptBuf(fedInfo, true) require.NoError(t, err) @@ -195,7 +174,7 @@ func TestBuildPowPegRedeemScript(t *testing.T) { func TestBuildErpRedeemScript(t *testing.T) { networkParams := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedRedeemScript, err := federation.GetErpRedeemScriptBuf(fedInfo, networkParams) require.NoError(t, err) @@ -206,7 +185,7 @@ func TestBuildErpRedeemScript(t *testing.T) { func TestBuildFlyoverRedeemScript(t *testing.T) { params := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = federationMainnetAddress fedInfo.IrisActivationHeight = -1 @@ -225,7 +204,7 @@ func TestBuildFlyoverRedeemScript(t *testing.T) { func TestBuildFlyoverErpRedeemScript(t *testing.T) { params := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = "3C8e41MpbE2MB8XDqaYnQ2FbtRwPYLJtto" fedInfo.IrisActivationHeight = 1 @@ -245,7 +224,7 @@ func TestBuildFlyoverErpRedeemScript(t *testing.T) { func TestBuildFlyoverErpRedeemScriptFallback(t *testing.T) { params := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = federationMainnetAddress fedInfo.IrisActivationHeight = 1 @@ -262,7 +241,7 @@ func TestBuildFlyoverErpRedeemScriptFallback(t *testing.T) { } func TestBuildPowPegAddressHash(t *testing.T) { - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.IrisActivationHeight = -1 buf, err := federation.GetRedeemScriptBuf(fedInfo, true) @@ -281,7 +260,7 @@ func TestBuildPowPegAddressHash(t *testing.T) { func TestBuildFlyoverPowPegAddressHash(t *testing.T) { params := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = federationMainnetAddress fedInfo.IrisActivationHeight = -1 @@ -304,7 +283,7 @@ func TestBuildFlyoverPowPegAddressHash(t *testing.T) { func TestBuildFlyoverErpAddressHash(t *testing.T) { params := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = "3C8e41MpbE2MB8XDqaYnQ2FbtRwPYLJtto" fedInfo.IrisActivationHeight = 1 @@ -328,7 +307,7 @@ func TestBuildFlyoverErpAddressHash(t *testing.T) { func TestBuildFlyoverErpAddressHashFallback(t *testing.T) { params := chaincfg.MainNetParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = federationMainnetAddress fedInfo.IrisActivationHeight = 1 @@ -353,7 +332,7 @@ func TestBuildFlyoverErpAddressHashFallback(t *testing.T) { func TestGetDerivedBitcoinAddress(t *testing.T) { for _, test := range testQuotes { params := test.NetworkParams - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.IrisActivationHeight = -1 if params.Name == chaincfg.TestNet3Params.Name { @@ -388,14 +367,14 @@ func TestGetDerivedBitcoinAddress(t *testing.T) { func TestCalculateFlyoverDerivationAddress_ErrorHandling(t *testing.T) { t.Run("malformed redeem script", func(t *testing.T) { - derivation, err := federation.CalculateFlyoverDerivationAddress(getFakeFedInfo(), chaincfg.TestNet3Params, []byte{1}, []byte{1}) + derivation, err := federation.CalculateFlyoverDerivationAddress(mocks.GetFakeFedInfo(), chaincfg.TestNet3Params, []byte{1}, []byte{1}) assert.Equal(t, blockchain.FlyoverDerivation{}, derivation) require.Error(t, err) }) t.Run("empty redeem script", func(t *testing.T) { derivationBytes, err := hex.DecodeString(flyoverDerivationHash) require.NoError(t, err) - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = federationMainnetAddress fedInfo.IrisActivationHeight = -1 derivation, err := federation.CalculateFlyoverDerivationAddress(fedInfo, chaincfg.MainNetParams, []byte{}, derivationBytes) @@ -406,7 +385,7 @@ func TestCalculateFlyoverDerivationAddress_ErrorHandling(t *testing.T) { t.Run("invalid address", func(t *testing.T) { derivationBytes, err := hex.DecodeString(flyoverDerivationHash) require.NoError(t, err) - fedInfo := getFakeFedInfo() + fedInfo := mocks.GetFakeFedInfo() fedInfo.FedAddress = "invalid" derivation, err := federation.CalculateFlyoverDerivationAddress(fedInfo, chaincfg.MainNetParams, []byte{}, derivationBytes) assert.Equal(t, blockchain.FlyoverDerivation{}, derivation) @@ -416,10 +395,10 @@ func TestCalculateFlyoverDerivationAddress_ErrorHandling(t *testing.T) { func TestValidateRedeemScript_ErrorHandling(t *testing.T) { t.Run("fail on invalid fed info", func(t *testing.T) { - require.Error(t, federation.ValidateRedeemScript(getFakeFedInfo(), chaincfg.MainNetParams, []byte{1})) + require.Error(t, federation.ValidateRedeemScript(mocks.GetFakeFedInfo(), chaincfg.MainNetParams, []byte{1})) }) t.Run("fail on invalid script", func(t *testing.T) { - require.Error(t, federation.ValidateRedeemScript(getFakeFedInfo(), chaincfg.MainNetParams, nil)) + require.Error(t, federation.ValidateRedeemScript(mocks.GetFakeFedInfo(), chaincfg.MainNetParams, nil)) }) } diff --git a/internal/adapters/dataproviders/rootstock/fee_collector.go b/internal/adapters/dataproviders/rootstock/fee_collector.go index 9c4094c7..e4d6edf8 100644 --- a/internal/adapters/dataproviders/rootstock/fee_collector.go +++ b/internal/adapters/dataproviders/rootstock/fee_collector.go @@ -2,24 +2,25 @@ package rootstock import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "math/big" ) type feeCollectorImpl struct { - contract *bindings.LiquidityBridgeContract + retryParams RetryParams + contract LbcBinding } -func NewFeeCollectorImpl(contract *bindings.LiquidityBridgeContract) blockchain.FeeCollector { - return &feeCollectorImpl{contract: contract} +func NewFeeCollectorImpl(contract LbcBinding, retryParams RetryParams) blockchain.FeeCollector { + return &feeCollectorImpl{contract: contract, retryParams: retryParams} } func (fc *feeCollectorImpl) DaoFeePercentage() (uint64, error) { opts := bind.CallOpts{} - amount, err := rskRetry(func() (*big.Int, error) { - return fc.contract.ProductFeePercentage(&opts) - }) + amount, err := rskRetry(fc.retryParams.Retries, fc.retryParams.Sleep, + func() (*big.Int, error) { + return fc.contract.ProductFeePercentage(&opts) + }) if err != nil { return 0, err } diff --git a/internal/adapters/dataproviders/rootstock/fee_collector_test.go b/internal/adapters/dataproviders/rootstock/fee_collector_test.go new file mode 100644 index 00000000..a115d6fe --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/fee_collector_test.go @@ -0,0 +1,29 @@ +package rootstock_test + +import ( + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +func TestFeeCollectorImpl_DaoFeePercentage(t *testing.T) { + lbcMock := &mocks.LbcBindingMock{} + t.Run("Success", func(t *testing.T) { + lbcMock.On("ProductFeePercentage", mock.Anything).Return(big.NewInt(1), nil).Once() + feeCollector := rootstock.NewFeeCollectorImpl(lbcMock, rootstock.RetryParams{Retries: 0, Sleep: 0}) + percentage, err := feeCollector.DaoFeePercentage() + require.NoError(t, err) + require.Equal(t, uint64(1), percentage) + }) + t.Run("Error handling", func(t *testing.T) { + lbcMock.On("ProductFeePercentage", mock.Anything).Return(nil, assert.AnError).Once() + feeCollector := rootstock.NewFeeCollectorImpl(lbcMock, rootstock.RetryParams{Retries: 0, Sleep: 0}) + percentage, err := feeCollector.DaoFeePercentage() + require.Error(t, err) + require.Zero(t, percentage) + }) +} diff --git a/internal/adapters/dataproviders/rootstock/lbc.go b/internal/adapters/dataproviders/rootstock/lbc.go index 7977f470..33d27239 100644 --- a/internal/adapters/dataproviders/rootstock/lbc.go +++ b/internal/adapters/dataproviders/rootstock/lbc.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" geth "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" "github.com/rsksmart/liquidity-provider-server/internal/entities" @@ -25,23 +24,26 @@ import ( const registerPeginGasLimit = 2500000 type liquidityBridgeContractImpl struct { - client *ethclient.Client - address string - contract *bindings.LiquidityBridgeContract - signer TransactionSigner + client RpcClientBinding + address string + contract LbcAdapter + signer TransactionSigner + retryParams RetryParams } func NewLiquidityBridgeContractImpl( client *RskClient, address string, - contract *bindings.LiquidityBridgeContract, + contract LbcAdapter, signer TransactionSigner, + retryParams RetryParams, ) blockchain.LiquidityBridgeContract { return &liquidityBridgeContractImpl{ - client: client.client, - address: address, - contract: contract, - signer: signer, + client: client.client, + address: address, + contract: contract, + signer: signer, + retryParams: retryParams, } } @@ -58,9 +60,10 @@ func (lbc *liquidityBridgeContractImpl) HashPeginQuote(peginQuote quote.PeginQuo return "", err } - results, err = rskRetry(func() ([32]byte, error) { - return lbc.contract.HashQuote(&opts, parsedQuote) - }) + results, err = rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() ([32]byte, error) { + return lbc.contract.HashQuote(&opts, parsedQuote) + }) if err != nil { return "", err } @@ -76,9 +79,10 @@ func (lbc *liquidityBridgeContractImpl) HashPegoutQuote(pegoutQuote quote.Pegout return "", err } - results, err = rskRetry(func() ([32]byte, error) { - return lbc.contract.HashPegoutQuote(&opts, parsedQuote) - }) + results, err = rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() ([32]byte, error) { + return lbc.contract.HashPegoutQuote(&opts, parsedQuote) + }) if err != nil { return "", err } @@ -92,9 +96,10 @@ func (lbc *liquidityBridgeContractImpl) GetProviders() ([]liquidity_provider.Reg var provider bindings.LiquidityBridgeContractLiquidityProvider opts := &bind.CallOpts{} - maxId, err := rskRetry(func() (*big.Int, error) { - return lbc.contract.GetProviderIds(opts) - }) + maxId, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*big.Int, error) { + return lbc.contract.GetProviderIds(opts) + }) if err != nil { return nil, err } @@ -106,14 +111,15 @@ func (lbc *liquidityBridgeContractImpl) GetProviders() ([]liquidity_provider.Reg providerIds = append(providerIds, big.NewInt(i)) } - providers, err = rskRetry(func() ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { - return lbc.contract.GetProviders(opts, providerIds) - }) + providers, err = rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { + return lbc.contract.GetProviders(opts, providerIds) + }) if err != nil { return nil, err } parsedProviders := make([]liquidity_provider.RegisteredLiquidityProvider, 0) - for i = 0; i < maxProviderId+1; i++ { + for i = 0; i < maxProviderId; i++ { provider = providers[i] providerType = liquidity_provider.ProviderType(provider.ProviderType) if !providerType.IsValid() { @@ -136,11 +142,12 @@ func (lbc *liquidityBridgeContractImpl) ProviderResign() error { From: lbc.signer.Address(), Signer: lbc.signer.Sign, } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "Resign", func() (*geth.Transaction, error) { - return lbc.contract.Resign(opts) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "Resign", func() (*geth.Transaction, error) { + return lbc.contract.Resign(opts) + }) }) - }) if err != nil { return err @@ -151,23 +158,24 @@ func (lbc *liquidityBridgeContractImpl) ProviderResign() error { } func (lbc *liquidityBridgeContractImpl) SetProviderStatus(id uint64, newStatus bool) error { - var parsedId *big.Int + parsedId := new(big.Int) parsedId.SetUint64(id) opts := &bind.TransactOpts{ From: lbc.signer.Address(), Signer: lbc.signer.Sign, } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "SetProviderStatus", func() (*geth.Transaction, error) { - return lbc.contract.SetProviderStatus(opts, parsedId, newStatus) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "SetProviderStatus", func() (*geth.Transaction, error) { + return lbc.contract.SetProviderStatus(opts, parsedId, newStatus) + }) }) - }) if err != nil { return err } else if receipt == nil || receipt.Status == 0 { - return errors.New("resign transaction failed") + return errors.New("setProviderStatus transaction failed") } return nil } @@ -179,9 +187,10 @@ func (lbc *liquidityBridgeContractImpl) GetCollateral(address string) (*entities if err = ParseAddress(&parsedAddress, address); err != nil { return nil, err } - collateral, err := rskRetry(func() (*big.Int, error) { - return lbc.contract.GetCollateral(opts, parsedAddress) - }) + collateral, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*big.Int, error) { + return lbc.contract.GetCollateral(opts, parsedAddress) + }) if err != nil { return nil, err } @@ -195,9 +204,10 @@ func (lbc *liquidityBridgeContractImpl) GetPegoutCollateral(address string) (*en if err = ParseAddress(&parsedAddress, address); err != nil { return nil, err } - collateral, err := rskRetry(func() (*big.Int, error) { - return lbc.contract.GetPegoutCollateral(opts, parsedAddress) - }) + collateral, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*big.Int, error) { + return lbc.contract.GetPegoutCollateral(opts, parsedAddress) + }) if err != nil { return nil, err } @@ -207,9 +217,10 @@ func (lbc *liquidityBridgeContractImpl) GetPegoutCollateral(address string) (*en func (lbc *liquidityBridgeContractImpl) GetMinimumCollateral() (*entities.Wei, error) { var err error opts := &bind.CallOpts{} - collateral, err := rskRetry(func() (*big.Int, error) { - return lbc.contract.GetMinCollateral(opts) - }) + collateral, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*big.Int, error) { + return lbc.contract.GetMinCollateral(opts) + }) if err != nil { return nil, err } @@ -223,11 +234,12 @@ func (lbc *liquidityBridgeContractImpl) AddCollateral(amount *entities.Wei) erro Value: amount.AsBigInt(), } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "AddCollateral", func() (*geth.Transaction, error) { - return lbc.contract.AddCollateral(opts) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "AddCollateral", func() (*geth.Transaction, error) { + return lbc.contract.AddCollateral(opts) + }) }) - }) if err != nil { return fmt.Errorf("error adding collateral: %w", err) @@ -244,11 +256,12 @@ func (lbc *liquidityBridgeContractImpl) AddPegoutCollateral(amount *entities.Wei Value: amount.AsBigInt(), } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "AddPegoutCollateral", func() (*geth.Transaction, error) { - return lbc.contract.AddPegoutCollateral(opts) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "AddPegoutCollateral", func() (*geth.Transaction, error) { + return lbc.contract.AddPegoutCollateral(opts) + }) }) - }) if err != nil { return fmt.Errorf("error adding collateral: %w", err) @@ -264,11 +277,12 @@ func (lbc *liquidityBridgeContractImpl) WithdrawCollateral() error { Signer: lbc.signer.Sign, } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "WithdrawCollateral", func() (*geth.Transaction, error) { - return lbc.contract.WithdrawCollateral(opts) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "WithdrawCollateral", func() (*geth.Transaction, error) { + return lbc.contract.WithdrawCollateral(opts) + }) }) - }) if err != nil { return fmt.Errorf("withdraw pegin collateral error: %w", err) @@ -284,11 +298,12 @@ func (lbc *liquidityBridgeContractImpl) WithdrawPegoutCollateral() error { Signer: lbc.signer.Sign, } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "WithdrawPegoutCollateral", func() (*geth.Transaction, error) { - return lbc.contract.WithdrawPegoutCollateral(opts) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "WithdrawPegoutCollateral", func() (*geth.Transaction, error) { + return lbc.contract.WithdrawPegoutCollateral(opts) + }) }) - }) if err != nil { return fmt.Errorf("withdraw pegout collateral error: %w", err) @@ -305,9 +320,10 @@ func (lbc *liquidityBridgeContractImpl) GetBalance(address string) (*entities.We if err = ParseAddress(&parsedAddress, address); err != nil { return nil, err } - balance, err := rskRetry(func() (*big.Int, error) { - return lbc.contract.GetBalance(opts, parsedAddress) - }) + balance, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*big.Int, error) { + return lbc.contract.GetBalance(opts, parsedAddress) + }) if err != nil { return nil, err } @@ -315,6 +331,11 @@ func (lbc *liquidityBridgeContractImpl) GetBalance(address string) (*entities.We } func (lbc *liquidityBridgeContractImpl) CallForUser(txConfig blockchain.TransactionConfig, peginQuote quote.PeginQuote) (string, error) { + parsedQuote, err := parsePeginQuote(peginQuote) + if err != nil { + return "", err + } + opts := &bind.TransactOpts{ GasLimit: *txConfig.GasLimit, Value: txConfig.Value.AsBigInt(), @@ -322,21 +343,20 @@ func (lbc *liquidityBridgeContractImpl) CallForUser(txConfig blockchain.Transact Signer: lbc.signer.Sign, } - parsedQuote, err := parsePeginQuote(peginQuote) - if err != nil { - return "", err - } - - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "CallForUser", func() (*geth.Transaction, error) { - return lbc.contract.CallForUser(opts, parsedQuote) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "CallForUser", func() (*geth.Transaction, error) { + return lbc.contract.CallForUser(opts, parsedQuote) + }) }) - }) if err != nil { return "", fmt.Errorf("call for user error: %w", err) - } else if receipt == nil || receipt.Status == 0 { - return "", errors.New("callfor user error: incomplete receipt") + } else if receipt == nil { + return "", errors.New("call for user error: incomplete receipt") + } else if receipt.Status == 0 { + txHash := receipt.TxHash.String() + return txHash, fmt.Errorf("call for user error: transaction reverted (%s)", txHash) } return receipt.TxHash.String(), nil } @@ -345,10 +365,10 @@ func (lbc *liquidityBridgeContractImpl) RegisterPegin(params blockchain.Register var res []any var err error var parsedQuote bindings.QuotesPeginQuote - lbcCaller := &bindings.LiquidityBridgeContractCallerRaw{Contract: &lbc.contract.LiquidityBridgeContractCaller} if parsedQuote, err = parsePeginQuote(params.Quote); err != nil { return "", err } + lbcCaller := lbc.contract.Caller() log.Infof("Executing RegisterPegIn with params: %s\n", params.String()) err = lbcCaller.Call( &bind.CallOpts{}, &res, "registerPegIn", @@ -379,8 +399,11 @@ func (lbc *liquidityBridgeContractImpl) RegisterPegin(params blockchain.Register if err != nil { return "", fmt.Errorf("register pegin error: %w", err) - } else if receipt == nil || receipt.Status == 0 { + } else if receipt == nil { return "", errors.New("register pegin error: incomplete receipt") + } else if receipt.Status == 0 { + txHash := receipt.TxHash.String() + return txHash, fmt.Errorf("register pegin error: transaction reverted (%s)", txHash) } return receipt.TxHash.String(), nil } @@ -403,8 +426,11 @@ func (lbc *liquidityBridgeContractImpl) RefundPegout(txConfig blockchain.Transac return "", blockchain.WaitingForBridgeError } else if err != nil { return "", fmt.Errorf("refund pegout error: %w", err) - } else if receipt == nil || receipt.Status == 0 { + } else if receipt == nil { return "", errors.New("refund pegout error: incomplete receipt") + } else if receipt.Status == 0 { + txHash := receipt.TxHash.String() + return txHash, fmt.Errorf("refund pegout error: transaction reverted (%s)", txHash) } return receipt.TxHash.String(), nil } @@ -418,9 +444,10 @@ func (lbc *liquidityBridgeContractImpl) IsOperationalPegin(address string) (bool return false, err } - return rskRetry(func() (bool, error) { - return lbc.contract.IsOperational(opts, parsedAddress) - }) + return rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (bool, error) { + return lbc.contract.IsOperational(opts, parsedAddress) + }) } func (lbc *liquidityBridgeContractImpl) IsOperationalPegout(address string) (bool, error) { @@ -432,33 +459,36 @@ func (lbc *liquidityBridgeContractImpl) IsOperationalPegout(address string) (boo return false, err } - return rskRetry(func() (bool, error) { - return lbc.contract.IsOperationalForPegout(opts, parsedAddress) - }) + return rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (bool, error) { + return lbc.contract.IsOperationalForPegout(opts, parsedAddress) + }) } func (lbc *liquidityBridgeContractImpl) GetDepositEvents(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]quote.PegoutDeposit, error) { var lbcEvent *bindings.LiquidityBridgeContractPegOutDeposit result := make([]quote.PegoutDeposit, 0) - iterator, err := lbc.contract.FilterPegOutDeposit(&bind.FilterOpts{ + rawIterator, err := lbc.contract.FilterPegOutDeposit(&bind.FilterOpts{ Start: fromBlock, End: toBlock, Context: ctx, }, nil, nil) + // The adapter is to be able to mock the iterator in tests + iterator := lbc.contract.DepositEventIteratorAdapter(rawIterator) defer func() { - if iterator != nil { + if rawIterator != nil { if iteratorError := iterator.Close(); iteratorError != nil { log.Error("Error closing PegOutDeposit event iterator: ", err) } } }() - if err != nil || iterator == nil { - return result, err + if err != nil || rawIterator == nil { + return nil, err } for iterator.Next() { - lbcEvent = iterator.Event + lbcEvent = iterator.Event() result = append(result, quote.PegoutDeposit{ TxHash: lbcEvent.Raw.TxHash.String(), QuoteHash: hex.EncodeToString(lbcEvent.QuoteHash[:]), @@ -468,7 +498,7 @@ func (lbc *liquidityBridgeContractImpl) GetDepositEvents(ctx context.Context, fr From: lbcEvent.Sender.String(), }) } - if iterator.Error() != nil { + if err = iterator.Error(); err != nil { return nil, err } @@ -479,31 +509,32 @@ func (lbc *liquidityBridgeContractImpl) GetPeginPunishmentEvents(ctx context.Con var lbcEvent *bindings.LiquidityBridgeContractPenalized result := make([]liquidity_provider.PunishmentEvent, 0) - iterator, err := lbc.contract.FilterPenalized(&bind.FilterOpts{ + rawIterator, err := lbc.contract.FilterPenalized(&bind.FilterOpts{ Start: fromBlock, End: toBlock, Context: ctx, }) + iterator := lbc.contract.PenalizedEventIteratorAdapter(rawIterator) defer func() { - if iterator != nil { + if rawIterator != nil { if iteratorError := iterator.Close(); iteratorError != nil { log.Error("Error closing Penalized event iterator: ", err) } } }() - if err != nil || iterator == nil { - return result, err + if err != nil || rawIterator == nil { + return nil, err } for iterator.Next() { - lbcEvent = iterator.Event + lbcEvent = iterator.Event() result = append(result, liquidity_provider.PunishmentEvent{ LiquidityProvider: lbcEvent.LiquidityProvider.String(), Penalty: entities.NewBigWei(lbcEvent.Penalty), QuoteHash: hex.EncodeToString(lbcEvent.QuoteHash[:]), }) } - if iterator.Error() != nil { + if err = iterator.Error(); err != nil { return nil, err } return result, nil @@ -517,11 +548,12 @@ func (lbc *liquidityBridgeContractImpl) RegisterProvider(txConfig blockchain.Tra From: lbc.signer.Address(), Signer: lbc.signer.Sign, } - receipt, err := rskRetry(func() (*geth.Receipt, error) { - return awaitTx(lbc.client, "Register", func() (*geth.Transaction, error) { - return lbc.contract.Register(opts, params.Name, params.ApiBaseUrl, params.Status, string(params.Type)) + receipt, err := rskRetry(lbc.retryParams.Retries, lbc.retryParams.Sleep, + func() (*geth.Receipt, error) { + return awaitTx(lbc.client, "Register", func() (*geth.Transaction, error) { + return lbc.contract.Register(opts, params.Name, params.ApiBaseUrl, params.Status, string(params.Type)) + }) }) - }) if err != nil { return 0, fmt.Errorf("error registering provider: %w", err) @@ -531,7 +563,7 @@ func (lbc *liquidityBridgeContractImpl) RegisterProvider(txConfig blockchain.Tra registerEvent, err := lbc.contract.ParseRegister(*receipt.Logs[0]) if err != nil { - return 0, fmt.Errorf("error registering provider: %w", err) + return 0, fmt.Errorf("error parsing register event: %w", err) } return registerEvent.Id.Int64(), nil } @@ -587,6 +619,7 @@ func parsePeginQuote(peginQuote quote.PeginQuote) (bindings.QuotesPeginQuote, er parsedQuote.ProductFeeAmount = new(big.Int) parsedQuote.ProductFeeAmount.SetUint64(peginQuote.ProductFeeAmount) parsedQuote.GasFee = peginQuote.GasFee.AsBigInt() + parsedQuote.CallOnRegister = peginQuote.CallOnRegister return parsedQuote, nil } diff --git a/internal/adapters/dataproviders/rootstock/lbc_test.go b/internal/adapters/dataproviders/rootstock/lbc_test.go new file mode 100644 index 00000000..2f03c086 --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/lbc_test.go @@ -0,0 +1,1264 @@ +package rootstock_test + +import ( + "bytes" + "context" + "encoding/hex" + "errors" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + geth "github.com/ethereum/go-ethereum/core/types" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "testing" + "time" +) + +var peginQuote = quote.PeginQuote{ + FedBtcAddress: "2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc", + LbcAddress: "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", + LpRskAddress: "0x892813507Bf3aBF2890759d2135Ec34f4909Fea5", + BtcRefundAddress: "mmExR8uifX9SdfZ7V9st7pSdUhf1rmaPGk", + RskRefundAddress: "0x5dE07e2BE63595854C396E2da291e0d1EdE15112", + LpBtcAddress: "mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn", + CallFee: entities.NewWei(150), + PenaltyFee: entities.NewWei(99), + ContractAddress: "0x0D8Fb5d32704DB2931e05DB91F64BcA6f76Ce573", + Data: "0x12a1", + GasLimit: 8000, + Nonce: 11223344, + Value: entities.NewWei(1234), + AgreementTimestamp: 20, + TimeForDeposit: 30, + LpCallTime: 40, + Confirmations: 50, + CallOnRegister: true, + GasFee: entities.NewWei(100), + ProductFeeAmount: 500, +} + +var parsedPeginQuote = bindings.QuotesPeginQuote{ + FedBtcAddress: [20]byte{78, 159, 57, 202, 70, 136, 255, 16, 33, 40, 234, 76, 205, 163, 65, 5, 50, 67, 5, 176}, + LbcAddress: common.Address{0xd5, 0xf0, 0x0A, 0xBf, 0xbE, 0xA7, 0xA0, 0xB1, 0x93, 0x83, 0x6C, 0xAc, 0x68, 0x33, 0xc2, 0xAd, 0x9D, 0x06, 0xcE, 0xa8}, + LiquidityProviderRskAddress: common.Address{0x89, 0x28, 0x13, 0x50, 0x7B, 0xf3, 0xaB, 0xF2, 0x89, 0x07, 0x59, 0xd2, 0x13, 0x5E, 0xc3, 0x4f, 0x49, 0x09, 0xFe, 0xa5}, + BtcRefundAddress: []byte{111, 62, 202, 51, 133, 156, 181, 52, 157, 247, 31, 35, 0, 74, 185, 49, 162, 115, 243, 129, 220}, + RskRefundAddress: common.Address{0x5d, 0xE0, 0x7e, 0x2B, 0xE6, 0x35, 0x95, 0x85, 0x4C, 0x39, 0x6E, 0x2d, 0xa2, 0x91, 0xe0, 0xd1, 0xEd, 0xE1, 0x51, 0x12}, + LiquidityProviderBtcAddress: []byte{111, 36, 63, 19, 148, 244, 69, 84, 244, 206, 63, 214, 134, 73, 193, 154, 220, 72, 60, 233, 36}, + CallFee: big.NewInt(150), + PenaltyFee: big.NewInt(99), + ContractAddress: common.Address{0x0D, 0x8F, 0xb5, 0xd3, 0x27, 0x04, 0xDB, 0x29, 0x31, 0xe0, 0x5D, 0xB9, 0x1F, 0x64, 0xBc, 0xA6, 0xf7, 0x6C, 0xe5, 0x73}, + Data: []byte{18, 161}, + GasLimit: 8000, + Nonce: 11223344, + Value: big.NewInt(1234), + AgreementTimestamp: 20, + TimeForDeposit: 30, + CallTime: 40, + DepositConfirmations: 50, + CallOnRegister: true, + ProductFeeAmount: big.NewInt(500), + GasFee: big.NewInt(100), +} + +var pegoutQuote = quote.PegoutQuote{ + LbcAddress: "0x7C4890A0f1D4bBf2C669Ac2d1efFa185c505359b", + LpRskAddress: "0x9D93929A9099be4355fC2389FbF253982F9dF47c", + BtcRefundAddress: "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5", + RskRefundAddress: "0x0d8A0F1ef26B4b9650d98E1c22c560327cF387FE", + LpBtcAddress: "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6", + CallFee: entities.NewWei(1), + PenaltyFee: 2, + Nonce: 3, + DepositAddress: "mzpvGLbwqFK7zvtFanb3r83WpwDxNQUYcz", + Value: entities.NewWei(11), + AgreementTimestamp: 10, + DepositDateLimit: 5, + DepositConfirmations: 50, + TransferConfirmations: 40, + TransferTime: 800, + ExpireDate: 700, + ExpireBlock: 600, + GasFee: entities.NewWei(888), + ProductFeeAmount: 789, +} + +var parsedPegoutQuote = bindings.QuotesPegOutQuote{ + LbcAddress: common.Address{0x7C, 0x48, 0x90, 0xA0, 0xf1, 0xD4, 0xbB, 0xf2, 0xC6, 0x69, 0xAc, 0x2d, 0x1e, 0xfF, 0xa1, 0x85, 0xc5, 0x05, 0x35, 0x9b}, + LpRskAddress: common.Address{0x9D, 0x93, 0x92, 0x9A, 0x90, 0x99, 0xbe, 0x43, 0x55, 0xfC, 0x23, 0x89, 0xFb, 0xF2, 0x53, 0x98, 0x2F, 0x9d, 0xF4, 0x7c}, + BtcRefundAddress: []byte{111, 44, 129, 71, 129, 50, 181, 221, 166, 79, 252, 72, 74, 13, 34, 80, 150, 196, 178, 42, 213}, + RskRefundAddress: common.Address{0x0d, 0x8A, 0x0F, 0x1e, 0xf2, 0x6B, 0x4b, 0x96, 0x50, 0xd9, 0x8E, 0x1c, 0x22, 0xc5, 0x60, 0x32, 0x7c, 0xF3, 0x87, 0xFE}, + LpBtcAddress: []byte{111, 77, 25, 29, 213, 89, 98, 105, 251, 153, 254, 72, 87, 69, 181, 236, 217, 126, 72, 185, 152}, + CallFee: big.NewInt(1), + PenaltyFee: big.NewInt(2), + Nonce: 3, + DeposityAddress: []byte{111, 211, 208, 46, 217, 53, 0, 241, 222, 67, 83, 58, 58, 11, 192, 246, 63, 2, 142, 48, 246}, + Value: big.NewInt(11), + AgreementTimestamp: 10, + DepositDateLimit: 5, + DepositConfirmations: 50, + TransferConfirmations: 40, + TransferTime: 800, + ExpireDate: 700, + ExpireBlock: 600, + ProductFeeAmount: big.NewInt(789), + GasFee: big.NewInt(888), +} + +var contractProviders = []bindings.LiquidityBridgeContractLiquidityProvider{ + { + Id: big.NewInt(1), + Name: "test", + ApiBaseUrl: "http://test.com", + Status: true, + Provider: common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678"), + ProviderType: "pegin", + }, + { + Id: big.NewInt(2), + Name: "test2", + ApiBaseUrl: "http://test2.com", + Status: true, + Provider: common.HexToAddress("0x1233557799abcdef1234567890abcdef12345678"), + ProviderType: "pegout", + }, +} +var parsedProviders = []liquidity_provider.RegisteredLiquidityProvider{ + { + Id: 1, + Address: "0x1234567890AbcdEF1234567890aBcdef12345678", + Name: "test", + ApiBaseUrl: "http://test.com", + Status: true, + ProviderType: "pegin", + }, + { + Id: 2, + Address: "0x1233557799ABcDEf1234567890abCdef12345678", + Name: "test2", + ApiBaseUrl: "http://test2.com", + Status: true, + ProviderType: "pegout", + }, +} + +var penalizations = []*bindings.LiquidityBridgeContractPenalized{ + {QuoteHash: [32]byte{1, 2, 3}, LiquidityProvider: common.Address{1}, Penalty: big.NewInt(555)}, + {QuoteHash: [32]byte{4, 5, 6}, LiquidityProvider: common.Address{2}, Penalty: big.NewInt(666)}, + {QuoteHash: [32]byte{7, 8, 9}, LiquidityProvider: common.Address{3}, Penalty: big.NewInt(777)}, +} + +var parsedPenalizations = []liquidity_provider.PunishmentEvent{ + { + QuoteHash: "0102030000000000000000000000000000000000000000000000000000000000", + Penalty: entities.NewWei(555), + LiquidityProvider: "0x0100000000000000000000000000000000000000", + }, + { + QuoteHash: "0405060000000000000000000000000000000000000000000000000000000000", + Penalty: entities.NewWei(666), + LiquidityProvider: "0x0200000000000000000000000000000000000000", + }, + { + QuoteHash: "0708090000000000000000000000000000000000000000000000000000000000", + Penalty: entities.NewWei(777), + LiquidityProvider: "0x0300000000000000000000000000000000000000", + }, +} + +var deposits = []*bindings.LiquidityBridgeContractPegOutDeposit{ + {Raw: geth.Log{TxHash: common.Hash{7}, BlockNumber: 10}, QuoteHash: [32]byte{1, 2, 3}, Sender: common.Address{1}, Amount: big.NewInt(555), Timestamp: big.NewInt(123456789)}, + {Raw: geth.Log{TxHash: common.Hash{8}, BlockNumber: 11}, QuoteHash: [32]byte{4, 5, 6}, Sender: common.Address{2}, Amount: big.NewInt(666), Timestamp: big.NewInt(987654321)}, + {Raw: geth.Log{TxHash: common.Hash{9}, BlockNumber: 12}, QuoteHash: [32]byte{7, 8, 9}, Sender: common.Address{3}, Amount: big.NewInt(777), Timestamp: big.NewInt(111222333)}, +} + +var parsedDeposits = []quote.PegoutDeposit{ + { + TxHash: "0x0700000000000000000000000000000000000000000000000000000000000000", + QuoteHash: "0102030000000000000000000000000000000000000000000000000000000000", + Amount: entities.NewWei(555), + Timestamp: time.Unix(123456789, 0), + BlockNumber: 10, + From: "0x0100000000000000000000000000000000000000", + }, + { + TxHash: "0x0800000000000000000000000000000000000000000000000000000000000000", + QuoteHash: "0405060000000000000000000000000000000000000000000000000000000000", + Amount: entities.NewWei(666), + Timestamp: time.Unix(987654321, 0), + BlockNumber: 11, + From: "0x0200000000000000000000000000000000000000", + }, + { + TxHash: "0x0900000000000000000000000000000000000000000000000000000000000000", + QuoteHash: "0708090000000000000000000000000000000000000000000000000000000000", + Amount: entities.NewWei(777), + Timestamp: time.Unix(111222333, 0), + BlockNumber: 12, + From: "0x0300000000000000000000000000000000000000", + }, +} + +var parsedAddress = common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678") + +func TestLiquidityBridgeContractImpl_GetAddress(t *testing.T) { + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, nil, nil, rootstock.RetryParams{}) + assert.Equal(t, test.AnyAddress, lbc.GetAddress()) +} + +func TestLiquidityBridgeContractImpl_HashPeginQuote(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + hash := [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32} + lbc := rootstock.NewLiquidityBridgeContractImpl( + dummyClient, + test.AnyAddress, + lbcMock, + nil, rootstock.RetryParams{}, + ) + t.Run("Success", func(t *testing.T) { + lbcMock.On("HashQuote", mock.Anything, parsedPeginQuote).Return(hash, nil).Once() + result, err := lbc.HashPeginQuote(peginQuote) + require.NoError(t, err) + assert.Equal(t, hex.EncodeToString(hash[:]), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + lbcMock.On("HashQuote", mock.Anything, parsedPeginQuote).Return(nil, assert.AnError).Once() + result, err := lbc.HashPeginQuote(peginQuote) + require.Error(t, err) + assert.Empty(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_HashPeginQuote_ParsingErrors(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + validationFunction := func(peginQuote quote.PeginQuote) { + result, err := lbc.HashPeginQuote(peginQuote) + require.Error(t, err) + assert.Empty(t, result) + } + t.Run("Incomplete quote", func(t *testing.T) { + testQuote := peginQuote + testQuote.LbcAddress = "" + validationFunction(testQuote) + }) + t.Run("Invalid federation address", func(t *testing.T) { + testQuote := peginQuote + testQuote.FedBtcAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid lp btc address", func(t *testing.T) { + testQuote := peginQuote + testQuote.LpBtcAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid btc refund address", func(t *testing.T) { + testQuote := peginQuote + testQuote.BtcRefundAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid lbc address", func(t *testing.T) { + testQuote := peginQuote + testQuote.LbcAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid rsk refund address", func(t *testing.T) { + testQuote := peginQuote + testQuote.RskRefundAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid lp rsk address", func(t *testing.T) { + testQuote := peginQuote + testQuote.LpRskAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid destination address", func(t *testing.T) { + testQuote := peginQuote + testQuote.ContractAddress = test.AnyString + validationFunction(testQuote) + }) + t.Run("Invalid data", func(t *testing.T) { + testQuote := peginQuote + testQuote.Data = test.AnyString + validationFunction(testQuote) + }) +} + +func TestLiquidityBridgeContractImpl_HashPegoutQuote(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + hash := [32]byte{32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1} + lbc := rootstock.NewLiquidityBridgeContractImpl( + dummyClient, + test.AnyAddress, + lbcMock, + nil, rootstock.RetryParams{}, + ) + t.Run("Success", func(t *testing.T) { + lbcMock.On("HashPegoutQuote", mock.Anything, parsedPegoutQuote).Return(hash, nil).Once() + result, err := lbc.HashPegoutQuote(pegoutQuote) + require.NoError(t, err) + assert.Equal(t, hex.EncodeToString(hash[:]), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + lbcMock.On("HashPegoutQuote", mock.Anything, parsedPegoutQuote).Return(nil, assert.AnError).Once() + result, err := lbc.HashPegoutQuote(pegoutQuote) + require.Error(t, err) + assert.Empty(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_HashPegoutQuote_ParsingErrors(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Incomplete quote", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.LbcAddress = "" + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Invalid lbc address", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.LbcAddress = test.AnyString + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Invalid lp rsk address", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.LpRskAddress = test.AnyString + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Invalid rsk refund address", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.RskRefundAddress = test.AnyString + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Invalid btc refund address", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.BtcRefundAddress = test.AnyString + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Invalid lp btc address", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.LpBtcAddress = test.AnyString + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Invalid destination address", func(t *testing.T) { + testQuote := pegoutQuote + testQuote.DepositAddress = test.AnyString + result, err := lbc.HashPegoutQuote(testQuote) + require.Error(t, err) + assert.Empty(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_GetProviders(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("GetProviderIds", mock.Anything).Return(big.NewInt(2), nil).Once() + lbcMock.On("GetProviders", mock.Anything, []*big.Int{big.NewInt(1), big.NewInt(2)}).Return(contractProviders, nil).Once() + result, err := lbc.GetProviders() + require.NoError(t, err) + assert.Equal(t, parsedProviders, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling on invalid provider type", func(t *testing.T) { + invalidProviders := contractProviders + invalidProviders[0].ProviderType = "invalid type" + lbcMock.On("GetProviderIds", mock.Anything).Return(big.NewInt(2), nil).Once() + lbcMock.On("GetProviders", mock.Anything, []*big.Int{big.NewInt(1), big.NewInt(2)}).Return(invalidProviders, nil).Once() + result, err := lbc.GetProviders() + require.ErrorIs(t, err, liquidity_provider.InvalidProviderTypeError) + assert.Nil(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling GetProviderIds", func(t *testing.T) { + lbcMock.On("GetProviderIds", mock.Anything).Return(nil, assert.AnError).Once() + result, err := lbc.GetProviders() + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error handling GetProviders", func(t *testing.T) { + lbcMock.On("GetProviderIds", mock.Anything).Return(big.NewInt(2), nil).Once() + lbcMock.On("GetProviders", mock.Anything, []*big.Int{big.NewInt(1), big.NewInt(2)}).Return(nil, assert.AnError).Once() + result, err := lbc.GetProviders() + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_ProviderResign(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("Resign", mock.Anything).Return(tx, nil).Once() + err := lbc.ProviderResign() + require.NoError(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("Resign", mock.Anything).Return(nil, assert.AnError).Once() + err := lbc.ProviderResign() + require.Error(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("Resign", mock.Anything).Return(tx, nil).Once() + err := lbc.ProviderResign() + require.ErrorContains(t, err, "resign transaction failed") + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_SetProviderStatus(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("SetProviderStatus", mock.Anything, big.NewInt(2), true).Return(tx, nil).Once() + err := lbc.SetProviderStatus(2, true) + require.NoError(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("SetProviderStatus", mock.Anything, big.NewInt(1), true).Return(nil, assert.AnError).Once() + err := lbc.SetProviderStatus(1, true) + require.Error(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("SetProviderStatus", mock.Anything, big.NewInt(1), false).Return(tx, nil).Once() + err := lbc.SetProviderStatus(1, false) + require.ErrorContains(t, err, "setProviderStatus transaction failed") + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_GetCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("GetCollateral", mock.Anything, parsedAddress).Return(big.NewInt(500), nil).Once() + result, err := lbc.GetCollateral(parsedAddress.String()) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(500), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling on call error", func(t *testing.T) { + lbcMock.On("GetCollateral", mock.Anything, parsedAddress).Return(nil, assert.AnError).Once() + result, err := lbc.GetCollateral(parsedAddress.String()) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error handling on invalid address", func(t *testing.T) { + result, err := lbc.GetCollateral(test.AnyString) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_GetPegoutCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("GetPegoutCollateral", mock.Anything, parsedAddress).Return(big.NewInt(500), nil).Once() + result, err := lbc.GetPegoutCollateral(parsedAddress.String()) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(500), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling on call error", func(t *testing.T) { + lbcMock.On("GetPegoutCollateral", mock.Anything, parsedAddress).Return(nil, assert.AnError).Once() + result, err := lbc.GetPegoutCollateral(parsedAddress.String()) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error handling on invalid address", func(t *testing.T) { + result, err := lbc.GetPegoutCollateral(test.AnyString) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_GetMinimumCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("GetMinCollateral", mock.Anything).Return(big.NewInt(500), nil).Once() + result, err := lbc.GetMinimumCollateral() + require.NoError(t, err) + assert.Equal(t, entities.NewWei(500), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + lbcMock.On("GetMinCollateral", mock.Anything).Return(nil, assert.AnError).Once() + result, err := lbc.GetMinimumCollateral() + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_AddCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + txMatchFunction := mock.MatchedBy(func(opts *bind.TransactOpts) bool { + return opts.Value.Cmp(big.NewInt(500)) == 0 && bytes.Equal(opts.From.Bytes(), parsedAddress.Bytes()) + }) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true, valueModifier(big.NewInt(500))) + lbcMock.On("AddCollateral", txMatchFunction).Return(tx, nil).Once() + err := lbc.AddCollateral(entities.NewWei(500)) + require.NoError(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("AddCollateral", txMatchFunction).Return(nil, assert.AnError).Once() + err := lbc.AddCollateral(entities.NewWei(500)) + require.Error(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false, valueModifier(big.NewInt(500))) + lbcMock.On("AddCollateral", txMatchFunction).Return(tx, nil).Once() + err := lbc.AddCollateral(entities.NewWei(500)) + require.ErrorContains(t, err, "error adding pegin collateral") + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_AddPegoutCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + txMatchFunction := mock.MatchedBy(func(opts *bind.TransactOpts) bool { + return opts.Value.Cmp(big.NewInt(777)) == 0 && bytes.Equal(opts.From.Bytes(), parsedAddress.Bytes()) + }) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true, valueModifier(big.NewInt(777))) + lbcMock.On("AddPegoutCollateral", txMatchFunction).Return(tx, nil).Once() + err := lbc.AddPegoutCollateral(entities.NewWei(777)) + require.NoError(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("AddPegoutCollateral", txMatchFunction).Return(nil, assert.AnError).Once() + err := lbc.AddPegoutCollateral(entities.NewWei(777)) + require.Error(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false, valueModifier(big.NewInt(777))) + lbcMock.On("AddPegoutCollateral", txMatchFunction).Return(tx, nil).Once() + err := lbc.AddPegoutCollateral(entities.NewWei(777)) + require.ErrorContains(t, err, "error adding pegout collateral") + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_WithdrawCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("WithdrawCollateral", mock.Anything).Return(tx, nil).Once() + err := lbc.WithdrawCollateral() + require.NoError(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("WithdrawCollateral", mock.Anything).Return(nil, assert.AnError).Once() + err := lbc.WithdrawCollateral() + require.Error(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("WithdrawCollateral", mock.Anything).Return(tx, nil).Once() + err := lbc.WithdrawCollateral() + require.ErrorContains(t, err, "withdraw pegin collateral error") + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_WithdrawPegoutCollateral(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("WithdrawPegoutCollateral", mock.Anything).Return(tx, nil).Once() + err := lbc.WithdrawPegoutCollateral() + require.NoError(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("WithdrawPegoutCollateral", mock.Anything).Return(nil, assert.AnError).Once() + err := lbc.WithdrawPegoutCollateral() + require.Error(t, err) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("WithdrawPegoutCollateral", mock.Anything).Return(tx, nil).Once() + err := lbc.WithdrawPegoutCollateral() + require.ErrorContains(t, err, "withdraw pegout collateral error") + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_GetBalance(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("GetBalance", mock.Anything, parsedAddress).Return(big.NewInt(600), nil).Once() + result, err := lbc.GetBalance(parsedAddress.String()) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(600), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling on call error", func(t *testing.T) { + lbcMock.On("GetBalance", mock.Anything, parsedAddress).Return(nil, assert.AnError).Once() + result, err := lbc.GetBalance(parsedAddress.String()) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error handling on invalid address", func(t *testing.T) { + result, err := lbc.GetBalance(test.AnyString) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_CallForUser(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + modifiers := []txModifier{valueModifier(big.NewInt(1234)), gasLimitModifier(8000)} + var gasLimit uint64 = 8000 + txConfig := blockchain.TransactionConfig{Value: entities.NewWei(1234), GasLimit: &gasLimit} + optsMatchFunction := mock.MatchedBy(func(opts *bind.TransactOpts) bool { + return opts.Value.Cmp(txConfig.Value.AsBigInt()) == 0 && opts.GasLimit == *txConfig.GasLimit + }) + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true, modifiers...) + lbcMock.On("CallForUser", optsMatchFunction, parsedPeginQuote).Return(tx, nil).Once() + result, err := lbc.CallForUser(txConfig, peginQuote) + require.NoError(t, err) + assert.Equal(t, tx.Hash().String(), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (sending tx)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("CallForUser", optsMatchFunction, parsedPeginQuote).Return(nil, assert.AnError).Once() + result, err := lbc.CallForUser(txConfig, peginQuote) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Error handling (tx reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false, modifiers...) + lbcMock.On("CallForUser", mock.Anything, parsedPeginQuote).Return(tx, nil).Once() + result, err := lbc.CallForUser(txConfig, peginQuote) + require.ErrorContains(t, err, "call for user error: transaction reverted") + assert.Equal(t, tx.Hash().String(), result) + }) + t.Run("Error handling (invalid quote)", func(t *testing.T) { + invalid := peginQuote + invalid.LbcAddress = "" + result, err := lbc.CallForUser(txConfig, invalid) + require.Error(t, err, "call for user error: transaction reverted") + assert.Empty(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_RegisterPegin(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + registerParams := blockchain.RegisterPeginParams{ + QuoteSignature: []byte{7, 8, 9}, + BitcoinRawTransaction: []byte{4, 5, 6}, + PartialMerkleTree: []byte{1, 2, 3}, + BlockHeight: big.NewInt(5), + Quote: peginQuote, + } + callerMock := &mocks.LbcCallerBindingMock{} + matchOptsFunc := func(opts *bind.TransactOpts) bool { + return opts.From.String() == parsedAddress.String() && opts.GasLimit == 2500000 + } + t.Run("Success", func(t *testing.T) { + lbcMock.On("Caller").Return(callerMock).Once() + callerMock.On("Call", mock.Anything, mock.Anything, "registerPegIn", parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(nil).Once() + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("RegisterPegIn", mock.MatchedBy(matchOptsFunc), parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(tx, nil).Once() + result, err := lbc.RegisterPegin(registerParams) + require.NoError(t, err) + assert.Equal(t, tx.Hash().String(), result) + lbcMock.AssertExpectations(t) + callerMock.AssertExpectations(t) + }) +} + +// nolint:funlen +func TestLiquidityBridgeContractImpl_RegisterPegin_ErrorHandling(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + callerMock := &mocks.LbcCallerBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(rootstock.NewRskClient(mockClient), test.AnyAddress, lbcMock, signerMock, rootstock.RetryParams{}) + registerParams := blockchain.RegisterPeginParams{QuoteSignature: []byte{7, 8, 9}, BitcoinRawTransaction: []byte{4, 5, 6}, PartialMerkleTree: []byte{1, 2, 3}, BlockHeight: big.NewInt(5), Quote: peginQuote} + matchOptsFunc := func(opts *bind.TransactOpts) bool { + return opts.From.String() == parsedAddress.String() && opts.GasLimit == 2500000 + } + t.Run("Error handling (waiting for bridge)", func(t *testing.T) { + lbcMock.On("Caller").Return(callerMock).Once() + callerMock.On("Call", mock.Anything, mock.Anything, "registerPegIn", parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(errors.New("LBC031")).Once() + result, err := lbc.RegisterPegin(registerParams) + require.ErrorIs(t, err, blockchain.WaitingForBridgeError) + assert.Empty(t, "", result) + lbcMock.AssertExpectations(t) + lbcMock.AssertNotCalled(t, "RegisterPegIn") + callerMock.AssertExpectations(t) + }) + t.Run("Error handling (Call error)", func(t *testing.T) { + lbcMock.On("Caller").Return(callerMock).Once() + callerMock.On("Call", mock.Anything, mock.Anything, "registerPegIn", parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(assert.AnError).Once() + result, err := lbc.RegisterPegin(registerParams) + require.Error(t, err) + require.NotErrorIs(t, err, blockchain.WaitingForBridgeError) + assert.Empty(t, "", result) + lbcMock.AssertExpectations(t) + lbcMock.AssertNotCalled(t, "RegisterPegIn") + callerMock.AssertExpectations(t) + }) + t.Run("Error handling (Transaction send error)", func(t *testing.T) { + lbcMock.On("Caller").Return(callerMock).Once() + callerMock.On("Call", mock.Anything, mock.Anything, "registerPegIn", parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(nil).Once() + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("RegisterPegIn", mock.MatchedBy(matchOptsFunc), parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(nil, assert.AnError).Once() + result, err := lbc.RegisterPegin(registerParams) + require.ErrorContains(t, err, "register pegin error") + assert.Empty(t, result) + lbcMock.AssertExpectations(t) + callerMock.AssertExpectations(t) + }) + t.Run("Error handling (Transaction reverted)", func(t *testing.T) { + lbcMock.On("Caller").Return(callerMock).Once() + callerMock.On("Call", mock.Anything, mock.Anything, "registerPegIn", parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(nil).Once() + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("RegisterPegIn", mock.MatchedBy(matchOptsFunc), parsedPeginQuote, + registerParams.QuoteSignature, registerParams.BitcoinRawTransaction, + registerParams.PartialMerkleTree, registerParams.BlockHeight, + ).Return(tx, nil).Once() + result, err := lbc.RegisterPegin(registerParams) + require.ErrorContains(t, err, "register pegin error: transaction reverted") + assert.Equal(t, tx.Hash().String(), result) + lbcMock.AssertExpectations(t) + callerMock.AssertExpectations(t) + }) + t.Run("Error handling (invalid quote)", func(t *testing.T) { + invalid := registerParams + invalid.Quote.LbcAddress = "" + result, err := lbc.RegisterPegin(invalid) + require.Error(t, err) + assert.Empty(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_RefundPegout(t *testing.T) { + var gasLimit uint64 = 500 + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(rootstock.NewRskClient(mockClient), test.AnyAddress, lbcMock, signerMock, rootstock.RetryParams{}) + refundParams := blockchain.RefundPegoutParams{ + QuoteHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + BtcRawTx: []byte{1, 2, 3}, + BtcBlockHeaderHash: [32]byte{32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + MerkleBranchPath: big.NewInt(5), + MerkleBranchHashes: [][32]byte{{3, 2, 1}, {6, 5, 4}, {9, 8, 7}}, + } + txConfig := blockchain.TransactionConfig{Value: entities.NewWei(1234), GasLimit: &gasLimit} + matchOptsFunc := func(opts *bind.TransactOpts) bool { + return opts.From.String() == parsedAddress.String() && opts.GasLimit == gasLimit + } + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("RefundPegOut", mock.MatchedBy(matchOptsFunc), + refundParams.QuoteHash, refundParams.BtcRawTx, refundParams.BtcBlockHeaderHash, + refundParams.MerkleBranchPath, refundParams.MerkleBranchHashes, + ).Return(tx, nil).Once() + result, err := lbc.RefundPegout(txConfig, refundParams) + require.NoError(t, err) + assert.Equal(t, tx.Hash().String(), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (waiting for bridge)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("RefundPegOut", mock.MatchedBy(matchOptsFunc), + refundParams.QuoteHash, refundParams.BtcRawTx, refundParams.BtcBlockHeaderHash, + refundParams.MerkleBranchPath, refundParams.MerkleBranchHashes, + ).Return(tx, errors.New("LBC049")).Once() + result, err := lbc.RefundPegout(txConfig, refundParams) + require.ErrorIs(t, err, blockchain.WaitingForBridgeError) + assert.Empty(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (Transaction send error)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("RefundPegOut", mock.MatchedBy(matchOptsFunc), + refundParams.QuoteHash, refundParams.BtcRawTx, refundParams.BtcBlockHeaderHash, + refundParams.MerkleBranchPath, refundParams.MerkleBranchHashes, + ).Return(nil, assert.AnError).Once() + result, err := lbc.RefundPegout(txConfig, refundParams) + require.ErrorContains(t, err, "refund pegout error") + assert.Empty(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (Transaction reverted)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("RefundPegOut", mock.MatchedBy(matchOptsFunc), + refundParams.QuoteHash, refundParams.BtcRawTx, refundParams.BtcBlockHeaderHash, + refundParams.MerkleBranchPath, refundParams.MerkleBranchHashes, + ).Return(tx, nil).Once() + result, err := lbc.RefundPegout(txConfig, refundParams) + require.ErrorContains(t, err, "refund pegout error: transaction reverted") + assert.Equal(t, tx.Hash().String(), result) + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_IsOperationalPegin(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("IsOperational", mock.Anything, parsedAddress).Return(true, nil).Once() + result, err := lbc.IsOperationalPegin(parsedAddress.String()) + require.NoError(t, err) + assert.True(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + lbcMock.On("IsOperational", mock.Anything, parsedAddress).Return(true, assert.AnError).Once() + _, err := lbc.IsOperationalPegin(parsedAddress.String()) + require.Error(t, err) + }) + t.Run("Invalid address", func(t *testing.T) { + result, err := lbc.IsOperationalPegin(test.AnyString) + require.ErrorIs(t, err, blockchain.InvalidAddressError) + assert.False(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_IsOperationalPegout(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + lbcMock.On("IsOperationalForPegout", mock.Anything, parsedAddress).Return(true, nil).Once() + result, err := lbc.IsOperationalPegout(parsedAddress.String()) + require.NoError(t, err) + assert.True(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { + lbcMock.On("IsOperationalForPegout", mock.Anything, parsedAddress).Return(true, assert.AnError).Once() + _, err := lbc.IsOperationalPegout(parsedAddress.String()) + require.Error(t, err) + }) + t.Run("Invalid address", func(t *testing.T) { + result, err := lbc.IsOperationalPegout(test.AnyString) + require.ErrorIs(t, err, blockchain.InvalidAddressError) + assert.False(t, result) + }) +} + +func TestLiquidityBridgeContractImpl_RegisterProvider(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + txConfig := blockchain.TransactionConfig{Value: entities.NewWei(800)} + params := blockchain.ProviderRegistrationParams{ + Name: "mock provider", + ApiBaseUrl: "url.com", + Status: true, + Type: "both", + } + t.Run("Success", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + receipt, _ := mockClient.TransactionReceipt(context.Background(), tx.Hash()) + data, _ := hex.DecodeString("0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000d529ae9e860000") + receipt.Logs = append(receipt.Logs, &geth.Log{ + Address: common.HexToAddress("0xAa9caf1e3967600578727f975F283446a3dA6612"), + Topics: []common.Hash{ + common.HexToHash("0xa9d44d6e13bb3fee938c3f66d1103e91f8dc6b12d4405a55eea558e8f275aa6e"), + common.HexToHash("0x0000000000000000000000004202bac9919c3412fc7c8be4e678e26279386603"), + }, + Data: data, + BlockNumber: 5778711, + TxHash: common.HexToHash("0x37e52bd50866063727188751052e35510b8bc7d5de72541b84168cb2cb8b9c6c"), + TxIndex: 0, + BlockHash: common.HexToHash("0xdc48007bd41ed3d8027aaac9c67fe1142107453b80b1fead090490fa8cbd751a"), + Index: 0, + Removed: false, + }) + lbcMock.On("ParseRegister", *receipt.Logs[0]).Return(&bindings.LiquidityBridgeContractRegister{ + Id: big.NewInt(1), + From: parsedAddress, + Amount: txConfig.Value.AsBigInt(), + Raw: *receipt.Logs[0], + }, nil) + mockClient.On("TransactionReceipt", mock.Anything, mock.Anything).Return(receipt, nil).Once() + lbcMock.On("Register", mock.Anything, + params.Name, params.ApiBaseUrl, params.Status, string(params.Type)). + Return(tx, nil).Once() + result, err := lbc.RegisterProvider(txConfig, params) + require.NoError(t, err) + assert.Equal(t, int64(1), result) + lbcMock.AssertExpectations(t) + }) + +} + +func TestLiquidityBridgeContractImpl_RegisterProvider_ErrorHandling(t *testing.T) { + const incompleteReceipt = "incomplete receipt" + lbcMock := &mocks.LbcAdapterMock{} + signerMock := &mocks.TransactionSignerMock{} + mockClient := &mocks.RpcClientBindingMock{} + lbc := rootstock.NewLiquidityBridgeContractImpl( + rootstock.NewRskClient(mockClient), + test.AnyAddress, + lbcMock, + signerMock, + rootstock.RetryParams{}, + ) + txConfig := blockchain.TransactionConfig{Value: entities.NewWei(800)} + params := blockchain.ProviderRegistrationParams{Name: "mock provider", ApiBaseUrl: "url.com", Status: true, Type: "both"} + t.Run("Error handling (send transaction error)", func(t *testing.T) { + _ = prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("Register", mock.Anything, + params.Name, params.ApiBaseUrl, params.Status, string(params.Type)). + Return(nil, assert.AnError).Once() + result, err := lbc.RegisterProvider(txConfig, params) + require.Error(t, err) + assert.Equal(t, int64(0), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (receipt without event)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + lbcMock.On("Register", mock.Anything, + params.Name, params.ApiBaseUrl, params.Status, string(params.Type)). + Return(tx, nil).Once() + result, err := lbc.RegisterProvider(txConfig, params) + require.ErrorContains(t, err, incompleteReceipt) + assert.Equal(t, int64(0), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (transaction revert)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, false) + lbcMock.On("Register", mock.Anything, + params.Name, params.ApiBaseUrl, params.Status, string(params.Type)). + Return(tx, nil).Once() + result, err := lbc.RegisterProvider(txConfig, params) + require.ErrorContains(t, err, incompleteReceipt) + assert.Equal(t, int64(0), result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling (parsing error)", func(t *testing.T) { + tx := prepareTxMocks(mockClient, signerMock, true) + receipt, _ := mockClient.TransactionReceipt(context.Background(), tx.Hash()) + receipt.Logs = append(receipt.Logs, &geth.Log{}) + lbcMock.On("ParseRegister", *receipt.Logs[0]).Return(nil, assert.AnError) + mockClient.On("TransactionReceipt", mock.Anything, mock.Anything).Return(receipt, nil).Once() + lbcMock.On("Register", mock.Anything, + params.Name, params.ApiBaseUrl, params.Status, string(params.Type)). + Return(tx, nil).Once() + result, err := lbc.RegisterProvider(txConfig, params) + require.ErrorContains(t, err, "error parsing register event") + assert.Equal(t, int64(0), result) + lbcMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_GetDepositEvents(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + iteratorMock := &mocks.EventIteratorAdapterMock[bindings.LiquidityBridgeContractPegOutDeposit]{} + filterMatchFunc := func(from uint64, to uint64) func(opts *bind.FilterOpts) bool { + return func(opts *bind.FilterOpts) bool { + return from == opts.Start && to == *opts.End && opts.Context != nil + } + } + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + var from uint64 = 500 + var to uint64 = 1000 + lbcMock.On("FilterPegOutDeposit", mock.MatchedBy(filterMatchFunc(from, to)), [][32]uint8(nil), []common.Address(nil)). + Return(&bindings.LiquidityBridgeContractPegOutDepositIterator{}, nil).Once() + lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPegOutDepositIterator")). + Return(iteratorMock) + iteratorMock.On("Next").Return(true).Times(len(deposits)) + iteratorMock.On("Next").Return(false).Once() + for _, deposit := range deposits { + iteratorMock.On("Event").Return(deposit).Once() + } + iteratorMock.On("Error").Return(nil).Once() + iteratorMock.On("Close").Return(nil).Once() + result, err := lbc.GetDepositEvents(context.Background(), from, &to) + require.NoError(t, err) + assert.Equal(t, parsedDeposits, result) + lbcMock.AssertExpectations(t) + iteratorMock.AssertExpectations(t) + }) + t.Run("Error handling when failed to get iterator", func(t *testing.T) { + var from uint64 = 600 + var to uint64 = 1100 + lbcMock.On("FilterPegOutDeposit", mock.MatchedBy(filterMatchFunc(from, to)), [][32]uint8(nil), []common.Address(nil)). + Return(nil, assert.AnError).Once() + lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPegOutDepositIterator")). + Return(nil) + result, err := lbc.GetDepositEvents(context.Background(), from, &to) + require.Error(t, err) + assert.Nil(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling on iterator error", func(t *testing.T) { + var from uint64 = 700 + var to uint64 = 1200 + lbcMock.On("FilterPegOutDeposit", mock.MatchedBy(filterMatchFunc(from, to)), [][32]uint8(nil), []common.Address(nil)). + Return(&bindings.LiquidityBridgeContractPegOutDepositIterator{}, nil).Once() + lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPegOutDepositIterator")). + Return(iteratorMock) + iteratorMock.On("Next").Return(false).Once() + iteratorMock.On("Error").Return(assert.AnError).Once() + iteratorMock.On("Close").Return(nil).Once() + result, err := lbc.GetDepositEvents(context.Background(), from, &to) + require.Error(t, err) + assert.Nil(t, result) + lbcMock.AssertExpectations(t) + iteratorMock.AssertExpectations(t) + }) +} + +func TestLiquidityBridgeContractImpl_GetPeginPunishmentEvents(t *testing.T) { + lbcMock := &mocks.LbcAdapterMock{} + iteratorMock := &mocks.EventIteratorAdapterMock[bindings.LiquidityBridgeContractPenalized]{} + filterMatchFunc := func(from uint64, to uint64) func(opts *bind.FilterOpts) bool { + return func(opts *bind.FilterOpts) bool { + return from == opts.Start && to == *opts.End && opts.Context != nil + } + } + lbc := rootstock.NewLiquidityBridgeContractImpl(dummyClient, test.AnyAddress, lbcMock, nil, rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + var from uint64 = 500 + var to uint64 = 1000 + lbcMock.On("FilterPenalized", mock.MatchedBy(filterMatchFunc(from, to))). + Return(&bindings.LiquidityBridgeContractPenalizedIterator{}, nil).Once() + lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPenalizedIterator")). + Return(iteratorMock) + iteratorMock.On("Next").Return(true).Times(len(penalizations)) + iteratorMock.On("Next").Return(false).Once() + for _, deposit := range penalizations { + iteratorMock.On("Event").Return(deposit).Once() + } + iteratorMock.On("Error").Return(nil).Once() + iteratorMock.On("Close").Return(nil).Once() + result, err := lbc.GetPeginPunishmentEvents(context.Background(), from, &to) + require.NoError(t, err) + assert.Equal(t, parsedPenalizations, result) + lbcMock.AssertExpectations(t) + iteratorMock.AssertExpectations(t) + }) + t.Run("Error handling when failed to get iterator", func(t *testing.T) { + var from uint64 = 600 + var to uint64 = 1100 + lbcMock.On("FilterPenalized", mock.MatchedBy(filterMatchFunc(from, to))). + Return(nil, assert.AnError).Once() + lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPenalizedIterator")). + Return(nil) + result, err := lbc.GetPeginPunishmentEvents(context.Background(), from, &to) + require.Error(t, err) + assert.Nil(t, result) + lbcMock.AssertExpectations(t) + }) + t.Run("Error handling on iterator error", func(t *testing.T) { + var from uint64 = 700 + var to uint64 = 1200 + lbcMock.On("FilterPenalized", mock.MatchedBy(filterMatchFunc(from, to))). + Return(&bindings.LiquidityBridgeContractPenalizedIterator{}, nil).Once() + lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPenalizedIterator")). + Return(iteratorMock) + iteratorMock.On("Next").Return(false).Once() + iteratorMock.On("Error").Return(assert.AnError).Once() + iteratorMock.On("Close").Return(nil).Once() + result, err := lbc.GetPeginPunishmentEvents(context.Background(), from, &to) + require.Error(t, err) + assert.Nil(t, result) + lbcMock.AssertExpectations(t) + iteratorMock.AssertExpectations(t) + }) +} + +type txModifier func(tx *geth.LegacyTx) + +func valueModifier(value *big.Int) txModifier { + return func(tx *geth.LegacyTx) { + tx.Value = value + } +} +func gasLimitModifier(value uint64) txModifier { + return func(tx *geth.LegacyTx) { + tx.Gas = value + } +} + +func prepareTxMocks( + mockClient *mocks.RpcClientBindingMock, + signerMock *mocks.TransactionSignerMock, + success bool, + txModifiers ...txModifier, +) *geth.Transaction { + legacyTx := &geth.LegacyTx{ + Nonce: 1, + To: &parsedAddress, + Gas: 1, + GasPrice: big.NewInt(1), + Data: nil, + } + + mockClient.Calls = []mock.Call{} + mockClient.ExpectedCalls = []*mock.Call{} + signerMock.Calls = []mock.Call{} + signerMock.ExpectedCalls = []*mock.Call{} + + for _, modifier := range txModifiers { + modifier(legacyTx) + } + + tx := geth.NewTx(legacyTx) + + receipt := &geth.Receipt{} + receipt.TxHash = tx.Hash() + if success == true { + receipt.Status = 1 + } + mockClient.On("TransactionReceipt", mock.Anything, mock.Anything).Return(receipt, nil).Once() + signerMock.On("Sign", mock.Anything, mock.Anything).Return(tx, nil).Once() + signerMock.On("Address").Return(parsedAddress).Once() + return tx +} diff --git a/internal/adapters/dataproviders/rootstock/rpc.go b/internal/adapters/dataproviders/rootstock/rpc.go index 09324858..86a36d89 100644 --- a/internal/adapters/dataproviders/rootstock/rpc.go +++ b/internal/adapters/dataproviders/rootstock/rpc.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "math/big" @@ -18,11 +17,12 @@ import ( const newAccountGasCost = 25000 type rskjRpcServer struct { - client *ethclient.Client + client RpcClientBinding + retryParams RetryParams } -func NewRskjRpcServer(client *RskClient) blockchain.RootstockRpcServer { - return &rskjRpcServer{client: client.client} +func NewRskjRpcServer(client *RskClient, retryParams RetryParams) blockchain.RootstockRpcServer { + return &rskjRpcServer{client: client.client, retryParams: retryParams} } func (rpc *rskjRpcServer) GetBalance(ctx context.Context, address string) (*entities.Wei, error) { @@ -33,9 +33,10 @@ func (rpc *rskjRpcServer) GetBalance(ctx context.Context, address string) (*enti return nil, err } - result, err := rskRetry(func() (*big.Int, error) { - return rpc.client.BalanceAt(ctx, destination, nil) - }) + result, err := rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (*big.Int, error) { + return rpc.client.BalanceAt(ctx, destination, nil) + }) if err != nil { return nil, err @@ -65,9 +66,10 @@ func (rpc *rskjRpcServer) EstimateGas(ctx context.Context, address string, value Data: data, Value: value.AsBigInt(), } - result, err := rskRetry(func() (uint64, error) { - return rpc.client.EstimateGas(ctx, tx) - }) + result, err := rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (uint64, error) { + return rpc.client.EstimateGas(ctx, tx) + }) if err != nil { return nil, err } else { @@ -76,9 +78,10 @@ func (rpc *rskjRpcServer) EstimateGas(ctx context.Context, address string, value } func (rpc *rskjRpcServer) GasPrice(ctx context.Context) (*entities.Wei, error) { - result, err := rskRetry(func() (*big.Int, error) { - return rpc.client.SuggestGasPrice(ctx) - }) + result, err := rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (*big.Int, error) { + return rpc.client.SuggestGasPrice(ctx) + }) if err != nil { return nil, err } else { @@ -87,9 +90,10 @@ func (rpc *rskjRpcServer) GasPrice(ctx context.Context) (*entities.Wei, error) { } func (rpc *rskjRpcServer) GetHeight(ctx context.Context) (uint64, error) { - return rskRetry(func() (uint64, error) { - return rpc.client.BlockNumber(ctx) - }) + return rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (uint64, error) { + return rpc.client.BlockNumber(ctx) + }) } func (rpc *rskjRpcServer) GetTransactionReceipt(ctx context.Context, hash string) (blockchain.TransactionReceipt, error) { @@ -100,17 +104,19 @@ func (rpc *rskjRpcServer) GetTransactionReceipt(ctx context.Context, hash string return blockchain.TransactionReceipt{}, errors.New("invalid transaction hash") } - receipt, err := rskRetry(func() (*types.Receipt, error) { - return rpc.client.TransactionReceipt(ctx, common.HexToHash(hash)) - }) + receipt, err := rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (*types.Receipt, error) { + return rpc.client.TransactionReceipt(ctx, common.HexToHash(hash)) + }) if err != nil { return blockchain.TransactionReceipt{}, err } - tx, err := rskRetry(func() (*types.Transaction, error) { - transaction, _, rpcError := rpc.client.TransactionByHash(ctx, common.HexToHash(hash)) - return transaction, rpcError - }) + tx, err := rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (*types.Transaction, error) { + transaction, _, rpcError := rpc.client.TransactionByHash(ctx, common.HexToHash(hash)) + return transaction, rpcError + }) if err != nil { return blockchain.TransactionReceipt{}, err } @@ -121,7 +127,9 @@ func (rpc *rskjRpcServer) GetTransactionReceipt(ctx context.Context, hash string cumulativeGasUsed.SetUint64(receipt.CumulativeGasUsed) from, err = types.Sender(types.NewEIP155Signer(tx.ChainId()), tx) if err != nil { - from, _ = types.Sender(types.HomesteadSigner{}, tx) + if from, err = types.Sender(types.HomesteadSigner{}, tx); err != nil { + return blockchain.TransactionReceipt{}, err + } } return blockchain.TransactionReceipt{ TransactionHash: receipt.TxHash.String(), @@ -142,23 +150,26 @@ func (rpc *rskjRpcServer) isNewAccount(ctx context.Context, address common.Addre balance *big.Int nonce uint64 ) - code, err = rskRetry(func() ([]byte, error) { - return rpc.client.CodeAt(ctx, address, nil) - }) + code, err = rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() ([]byte, error) { + return rpc.client.CodeAt(ctx, address, nil) + }) if err != nil { return false, err } - balance, err = rskRetry(func() (*big.Int, error) { - return rpc.client.BalanceAt(ctx, address, nil) - }) + balance, err = rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (*big.Int, error) { + return rpc.client.BalanceAt(ctx, address, nil) + }) if err != nil { return false, err } - nonce, err = rskRetry(func() (uint64, error) { - return rpc.client.NonceAt(ctx, address, nil) - }) + nonce, err = rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (uint64, error) { + return rpc.client.NonceAt(ctx, address, nil) + }) if err != nil { return false, err } diff --git a/internal/adapters/dataproviders/rootstock/rpc_test.go b/internal/adapters/dataproviders/rootstock/rpc_test.go new file mode 100644 index 00000000..a68d4aab --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/rpc_test.go @@ -0,0 +1,264 @@ +package rootstock_test + +import ( + "context" + "encoding/hex" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +const ( + estimationAddress = "0x462d7082F3671a3be160638Be3F8c23cA354f48a" + estimationBaseGas uint64 = 57000 + estimationNewAccountGas uint64 = 25000 + txHash = "0x0e5a74de4d3f7eceff661d953f75270041c82ba0b0b787ec8daf7d566a53baa5" +) + +var ( + estimationData, _ = hex.DecodeString("5a68669900000000000000000000000000000000000000000000000002dda2a7ea1e40000000000000000000000000000000000000000000000000000000000066223d930000000000000000000000009d4b2c05818a0086e641437fcb64ab6098c7bbec") + estimationValue = entities.NewWei(300) +) + +func TestRskjRpcServer_EstimateGas_NewAccount(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + + toAddress := common.HexToAddress(estimationAddress) + client.On("NonceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(uint64(0), nil).Once() + client.On("CodeAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(nil, nil).Once() + client.On("BalanceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(big.NewInt(0), nil).Once() + client.On("EstimateGas", test.AnyCtx, ethereum.CallMsg{ + To: &toAddress, + Data: estimationData, + Value: estimationValue.AsBigInt(), + }).Return(estimationBaseGas, nil).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.NoError(t, err) + assert.Equal(t, entities.NewUWei(estimationBaseGas+estimationNewAccountGas), result) + client.AssertExpectations(t) +} + +func TestRskjRpcServer_EstimateGas_ExistingAccount(t *testing.T) { + toAddress := common.HexToAddress(estimationAddress) + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + client.On("EstimateGas", test.AnyCtx, ethereum.CallMsg{ + To: &toAddress, + Data: estimationData, + Value: estimationValue.AsBigInt(), + }).Return(estimationBaseGas, nil).Times(3) + t.Run("Existing nonce", func(t *testing.T) { + client.On("NonceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(uint64(1), nil).Once() + client.On("CodeAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(nil, nil).Once() + client.On("BalanceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(big.NewInt(0), nil).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.NoError(t, err) + assert.Equal(t, entities.NewUWei(estimationBaseGas), result) + }) + t.Run("Existing code", func(t *testing.T) { + client.On("NonceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(uint64(0), nil).Once() + client.On("CodeAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return([]byte{1, 2, 3}, nil).Once() + client.On("BalanceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(big.NewInt(0), nil).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.NoError(t, err) + assert.Equal(t, entities.NewUWei(estimationBaseGas), result) + }) + t.Run("Existing balance", func(t *testing.T) { + client.On("NonceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(uint64(0), nil).Once() + client.On("CodeAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(nil, nil).Once() + client.On("BalanceAt", test.AnyCtx, toAddress, (*big.Int)(nil)).Return(big.NewInt(1), nil).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.NoError(t, err) + assert.Equal(t, entities.NewUWei(estimationBaseGas), result) + }) + client.AssertExpectations(t) +} + +func TestRskjRpcServer_EstimateGas_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Invalid address", func(t *testing.T) { + result, err := rpc.EstimateGas(context.Background(), test.AnyString, estimationValue, estimationData) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error calling CodeAt", func(t *testing.T) { + client.On("CodeAt", test.AnyCtx, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error calling BalanceAt", func(t *testing.T) { + client.On("CodeAt", test.AnyCtx, mock.Anything, mock.Anything).Return(nil, nil).Once() + client.On("BalanceAt", test.AnyCtx, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error calling NonceAt", func(t *testing.T) { + client.On("CodeAt", test.AnyCtx, mock.Anything, mock.Anything).Return(nil, nil).Once() + client.On("BalanceAt", test.AnyCtx, mock.Anything, mock.Anything).Return(big.NewInt(0), nil).Once() + client.On("NonceAt", test.AnyCtx, mock.Anything, mock.Anything).Return(uint64(0), assert.AnError).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Error calling EstimateGas", func(t *testing.T) { + client.On("CodeAt", test.AnyCtx, mock.Anything, mock.Anything).Return(nil, nil).Once() + client.On("BalanceAt", test.AnyCtx, mock.Anything, mock.Anything).Return(big.NewInt(0), nil).Once() + client.On("NonceAt", test.AnyCtx, mock.Anything, mock.Anything).Return(uint64(0), nil).Once() + client.On("EstimateGas", test.AnyCtx, mock.Anything).Return(uint64(0), assert.AnError).Once() + result, err := rpc.EstimateGas(context.Background(), estimationAddress, estimationValue, estimationData) + require.Error(t, err) + assert.Nil(t, result) + client.AssertExpectations(t) + }) +} + +func TestRskjRpcServer_GasPrice(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + client.On("SuggestGasPrice", test.AnyCtx).Return(big.NewInt(200), nil).Once() + gasPrice, err := rpc.GasPrice(context.Background()) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(200), gasPrice) + }) + t.Run("Error calling rpc", func(t *testing.T) { + client.On("SuggestGasPrice", test.AnyCtx).Return(nil, assert.AnError).Once() + gasPrice, err := rpc.GasPrice(context.Background()) + require.Error(t, err) + assert.Nil(t, gasPrice) + }) +} + +func TestRskjRpcServer_GetBalance(t *testing.T) { + var blockNumber *big.Int = nil + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + client.On("BalanceAt", test.AnyCtx, parsedAddress, blockNumber).Return(big.NewInt(100), nil).Once() + balance, err := rpc.GetBalance(context.Background(), parsedAddress.String()) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(100), balance) + }) + t.Run("Error calling rpc", func(t *testing.T) { + client.On("BalanceAt", test.AnyCtx, parsedAddress, blockNumber).Return(nil, assert.AnError).Once() + balance, err := rpc.GetBalance(context.Background(), parsedAddress.String()) + require.Error(t, err) + assert.Nil(t, balance) + }) + t.Run("Invalid address", func(t *testing.T) { + balance, err := rpc.GetBalance(context.Background(), test.AnyString) + require.ErrorIs(t, err, blockchain.InvalidAddressError) + assert.Nil(t, balance) + }) +} + +func TestRskjRpcServer_GetHeight(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + client.On("BlockNumber", test.AnyCtx).Return(uint64(50), nil).Once() + blockNumber, err := rpc.GetHeight(context.Background()) + require.NoError(t, err) + assert.Equal(t, uint64(50), blockNumber) + }) + t.Run("Error calling rpc", func(t *testing.T) { + client.On("BlockNumber", test.AnyCtx).Return(uint64(0), assert.AnError).Once() + blockNumber, err := rpc.GetHeight(context.Background()) + require.Error(t, err) + assert.Zero(t, blockNumber) + }) +} + +func TestRskjRpcServer_GetTransactionReceipt(t *testing.T) { + const ( + v int64 = 0x62 + r = "73e409ecab98206d4f2afbf6953739ed30002bda88760e2a211e23334766b467" + s = "3a020211dfe07777d3d6373771fc848e0a777b2647ee8c4df5c1e44b22e13b39" + ) + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Success", func(t *testing.T) { + client.On("TransactionReceipt", test.AnyCtx, common.HexToHash(txHash)).Return(&types.Receipt{ + GasUsed: 456, + CumulativeGasUsed: 123, + TxHash: common.HexToHash(txHash), + BlockHash: common.HexToHash("0x010203"), + BlockNumber: big.NewInt(500), + }, nil).Once() + parsedToAddress := common.HexToAddress("0x462d7082F3671a3be160638Be3F8c23cA354f48a") + rAsBigInt := new(big.Int) + rAsBigInt.SetString(r, 16) + sAsBigInt := new(big.Int) + sAsBigInt.SetString(s, 16) + data, _ := hex.DecodeString("5a68669900000000000000000000000000000000000000000000000002dda2a7ea1e40000000000000000000000000000000000000000000000000000000000066223d930000000000000000000000009d4b2c05818a0086e641437fcb64ab6098c7bbec") + client.On("TransactionByHash", test.AnyCtx, common.HexToHash(txHash)). + Return(types.NewTx(&types.LegacyTx{ + Nonce: 741514, + GasPrice: big.NewInt(65826581), + Gas: 200000, + To: &parsedToAddress, + Value: big.NewInt(0), + Data: data, + V: big.NewInt(v), + R: rAsBigInt, + S: sAsBigInt, + }), false, nil).Once() + receipt, err := rpc.GetTransactionReceipt(context.Background(), txHash) + require.NoError(t, err) + assert.Equal(t, blockchain.TransactionReceipt{ + TransactionHash: txHash, + BlockHash: "0x0000000000000000000000000000000000000000000000000000000000010203", + BlockNumber: 500, + From: "0xC67D9EE30d2119A384E02de568BE80fe785074Ba", + To: parsedToAddress.String(), + CumulativeGasUsed: big.NewInt(123), + GasUsed: big.NewInt(456), + Value: entities.NewWei(0), + }, receipt) + }) +} + +func TestRskjRpcServer_GetTransactionReceipt_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Error error getting receipt", func(t *testing.T) { + client.On("TransactionReceipt", test.AnyCtx, common.HexToHash(txHash)). + Return(nil, assert.AnError).Once() + receipt, err := rpc.GetTransactionReceipt(context.Background(), txHash) + require.Error(t, err) + assert.Empty(t, receipt) + }) + t.Run("Error error getting transaction", func(t *testing.T) { + client.On("TransactionReceipt", test.AnyCtx, common.HexToHash(txHash)).Return(&types.Receipt{ + GasUsed: 456, + CumulativeGasUsed: 123, + TxHash: common.HexToHash(txHash), + BlockHash: common.HexToHash("0x010203"), + BlockNumber: big.NewInt(500), + }, nil).Once() + client.On("TransactionByHash", test.AnyCtx, common.HexToHash(txHash)). + Return(nil, false, assert.AnError).Once() + receipt, err := rpc.GetTransactionReceipt(context.Background(), txHash) + require.Error(t, err) + assert.Empty(t, receipt) + }) + t.Run("Invalid tx hash", func(t *testing.T) { + receipt, err := rpc.GetTransactionReceipt(context.Background(), test.AnyString) + require.Error(t, err) + assert.Empty(t, receipt) + }) +} diff --git a/internal/adapters/dataproviders/rootstock/wallet.go b/internal/adapters/dataproviders/rootstock/wallet.go index 2cbe3b0e..2c4c3184 100644 --- a/internal/adapters/dataproviders/rootstock/wallet.go +++ b/internal/adapters/dataproviders/rootstock/wallet.go @@ -9,14 +9,13 @@ import ( "github.com/ethereum/go-ethereum/common" geth "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" log "github.com/sirupsen/logrus" "math/big" ) type RskWalletImpl struct { - client *ethclient.Client + client RpcClientBinding account *RskAccount chainId uint64 } @@ -94,6 +93,8 @@ func (wallet *RskWalletImpl) SendRbtc(ctx context.Context, config blockchain.Tra if signedTx, err = wallet.Sign(wallet.Address(), tx); err != nil { return "", err } - err = wallet.client.SendTransaction(newCtx, signedTx) - return tx.Hash().String(), err + if err = wallet.client.SendTransaction(newCtx, signedTx); err != nil { + return "", err + } + return signedTx.Hash().String(), nil } diff --git a/internal/adapters/dataproviders/rootstock/wallet_test.go b/internal/adapters/dataproviders/rootstock/wallet_test.go new file mode 100644 index 00000000..edeb063e --- /dev/null +++ b/internal/adapters/dataproviders/rootstock/wallet_test.go @@ -0,0 +1,224 @@ +package rootstock_test + +import ( + "context" + "encoding/hex" + "fmt" + "github.com/ethereum/go-ethereum/common" + geth "github.com/ethereum/go-ethereum/core/types" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "io" + "math/big" + "os" + "path/filepath" + "testing" + "time" +) + +const chainId = 31 + +var ( + walletAddress = common.HexToAddress("0x9D93929A9099be4355fC2389FbF253982F9dF47c") + signedBytes = []byte{ + 0x9f, 0x53, 0xc9, 0x15, 0x4, 0xf1, 0xbe, 0x5, 0x86, 0x9d, 0xd5, 0xaa, 0x8c, 0xd3, + 0x41, 0xde, 0x8e, 0x5e, 0x88, 0xaf, 0x8, 0xbe, 0xfe, 0x59, 0x37, 0x52, 0x8d, 0xba, + 0x95, 0xef, 0xd8, 0x8f, 0x60, 0x7c, 0xe1, 0x6c, 0xa3, 0x48, 0x65, 0x70, 0x38, 0x2a, + 0xc1, 0x8, 0xb8, 0x8d, 0x8d, 0xee, 0xff, 0x26, 0xb0, 0x14, 0xbd, 0x22, 0x27, 0xab, + 0x1e, 0x41, 0x75, 0xd7, 0x28, 0x5c, 0x86, 0x9d, 0x1, + } + bytesToSign = []byte{ + 0xee, 0x08, 0x74, 0x17, 0x0b, 0x7f, 0x6f, 0x32, 0xb8, 0xc2, 0xac, 0x95, 0x73, 0xc4, 0x28, 0xd3, + 0x5b, 0x57, 0x52, 0x70, 0xa6, 0x6b, 0x75, 0x7c, 0x2c, 0x01, 0x85, 0xd2, 0xbd, 0x09, 0x71, 0x8d, + } +) + +// TestRskWalletImpl we use this function to run all the test related to the wallet to open the account only once +func TestRskWalletImpl(t *testing.T) { + testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-wallet-%d", time.Now().UnixNano())) + keyFile, err := os.Open(keyPath) + require.NoError(t, err) + + defer func(file *os.File) { + closingErr := file.Close() + require.NoError(t, closingErr) + }(keyFile) + + keyBytes, err := io.ReadAll(keyFile) + require.NoError(t, err) + account, err := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + require.NoError(t, err) + + t.Run("Address", createAddressTest(account)) + t.Run("Sign", creteSignTest(account)) + t.Run("SignBytes", createSignBytesTest(account)) + t.Run("Validate", createValidateTest(account)) + t.Run("SendRbtc", createSendRbtcTest(account)) + t.Run("SendRbtc error handling", createSendRbtcErrorHandlingTest(account)) +} + +func createSendRbtcTest(account *rootstock.RskAccount) func(t *testing.T) { + return func(t *testing.T) { + const toAddress = "0x79568C2989232dcA1840087d73d403602364c0D4" + var gasLimit uint64 = 21000 + t.Run("Success", func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + clientMock.On("SendTransaction", mock.Anything, mock.MatchedBy(func(tx *geth.Transaction) bool { + v, r, s := tx.RawSignatureValues() + return assert.NotNil(t, v) && assert.NotNil(t, r) && assert.NotNil(t, s) + })).Return(nil) + clientMock.On("PendingNonceAt", mock.AnythingOfType("*context.timerCtx"), walletAddress).Return(uint64(54), nil) + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ + Value: entities.NewWei(89607151182921727), + GasLimit: &gasLimit, + GasPrice: entities.NewWei(65164000), + }, toAddress) + require.NoError(t, err) + require.Equal(t, "0xa685c956bd47a5c6c9d66997a469f483447fb1366709f7374764ee597aeac266", tx) + }) + } +} + +func createSendRbtcErrorHandlingTest(account *rootstock.RskAccount) func(t *testing.T) { + return func(t *testing.T) { + const toAddress = "0x79568C2989232dcA1840087d73d403602364c0D4" + var gasLimit uint64 = 21000 + t.Run("Handle error on invalid address", func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{}, test.AnyString) + require.ErrorIs(t, err, blockchain.InvalidAddressError) + require.Empty(t, tx) + }) + t.Run("Handle error on incomplete config", func(t *testing.T) { + const incompleteConfig = "incomplete transaction arguments" + clientMock := &mocks.RpcClientBindingMock{} + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + t.Run("Missing gasPrice", func(t *testing.T) { + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ + Value: entities.NewWei(1), GasLimit: &gasLimit}, toAddress) + require.ErrorContains(t, err, incompleteConfig) + require.Empty(t, tx) + }) + t.Run("Missing value", func(t *testing.T) { + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ + GasPrice: entities.NewWei(1), GasLimit: &gasLimit}, toAddress) + require.ErrorContains(t, err, incompleteConfig) + require.Empty(t, tx) + }) + t.Run("Missing gasLimit", func(t *testing.T) { + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ + Value: entities.NewWei(1), GasPrice: entities.NewWei(1)}, toAddress) + require.ErrorContains(t, err, incompleteConfig) + require.Empty(t, tx) + }) + }) + t.Run("Handle error on failure when getting nonce", func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + clientMock.On("PendingNonceAt", mock.AnythingOfType("*context.timerCtx"), walletAddress).Return(uint64(0), assert.AnError) + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ + Value: entities.NewWei(1), + GasLimit: &gasLimit, + GasPrice: entities.NewWei(5), + }, toAddress) + require.Error(t, err) + require.Empty(t, tx) + }) + t.Run("Handle error on failure when broadcasting tx", func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + clientMock.On("SendTransaction", mock.Anything, mock.Anything).Return(assert.AnError) + clientMock.On("PendingNonceAt", mock.AnythingOfType("*context.timerCtx"), walletAddress).Return(uint64(54), nil) + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ + Value: entities.NewWei(1), + GasLimit: &gasLimit, + GasPrice: entities.NewWei(5), + }, toAddress) + require.Error(t, err) + require.Empty(t, tx) + }) + } +} + +func createAddressTest(account *rootstock.RskAccount) func(t *testing.T) { + return func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + address := wallet.Address() + assert.Equal(t, walletAddress, address) + } +} + +func creteSignTest(account *rootstock.RskAccount) func(t *testing.T) { + return func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + toAddress := common.HexToAddress("0x8dccd82443B80DDdE3690af86746bfd9d766F8D2") + tx := geth.NewTx(&geth.LegacyTx{ + To: &toAddress, + Nonce: 123, + GasPrice: big.NewInt(700), + Gas: 500, + Value: big.NewInt(800), + }) + t.Run("Success", func(t *testing.T) { + result, err := wallet.Sign(walletAddress, tx) + require.NoError(t, err) + v, r, s := result.RawSignatureValues() + assert.NotNil(t, v) + assert.NotNil(t, r) + assert.NotNil(t, s) + }) + t.Run("Error when signing with wrong account", func(t *testing.T) { + result, err := wallet.Sign(toAddress, tx) + require.Error(t, err) + assert.Nil(t, result) + }) + } +} + +func createSignBytesTest(account *rootstock.RskAccount) func(t *testing.T) { + return func(t *testing.T) { + clientMock := &mocks.RpcClientBindingMock{} + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + signedHash, err := wallet.SignBytes(bytesToSign) + require.NoError(t, err) + assert.Equal(t, signedBytes, signedHash) + } +} + +func createValidateTest(account *rootstock.RskAccount) func(t *testing.T) { + return func(t *testing.T) { + const noHex = "no hex" + clientMock := &mocks.RpcClientBindingMock{} + wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) + t.Run("Success", func(t *testing.T) { + isValid := wallet.Validate(hex.EncodeToString(signedBytes), hex.EncodeToString(bytesToSign)) + assert.True(t, isValid) + }) + t.Run("Invalid signature", func(t *testing.T) { + isValid := wallet.Validate(noHex, hex.EncodeToString(bytesToSign)) + assert.False(t, isValid) + }) + t.Run("Invalid hash", func(t *testing.T) { + isValid := wallet.Validate(hex.EncodeToString(signedBytes), noHex) + assert.False(t, isValid) + }) + t.Run("Signature mismatch", func(t *testing.T) { + tamperedSignature := signedBytes + tamperedSignature[0] = 0x12 + tamperedHash := bytesToSign + tamperedHash[0] = 0x12 + assert.False(t, wallet.Validate(hex.EncodeToString(tamperedSignature), hex.EncodeToString(bytesToSign))) + assert.False(t, wallet.Validate(hex.EncodeToString(signedBytes), hex.EncodeToString(tamperedHash))) + }) + } +} diff --git a/internal/configuration/registry/messaging.go b/internal/configuration/registry/messaging.go index 75e77870..fe105277 100644 --- a/internal/configuration/registry/messaging.go +++ b/internal/configuration/registry/messaging.go @@ -24,7 +24,7 @@ func NewMessagingRegistry( return &Messaging{ Rpc: blockchain.Rpc{ Btc: bitcoin.NewBitcoindRpc(btcConn), - Rsk: rootstock.NewRskjRpcServer(rskClient), + Rsk: rootstock.NewRskjRpcServer(rskClient, rootstock.DefaultRetryParams), }, EventBus: NewEventBus(), AlertSender: NewAlertSender(ctx, env), diff --git a/internal/configuration/registry/rootstock.go b/internal/configuration/registry/rootstock.go index f2008ef3..4f7d5ffd 100644 --- a/internal/configuration/registry/rootstock.go +++ b/internal/configuration/registry/rootstock.go @@ -1,7 +1,9 @@ package registry import ( + "errors" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" @@ -25,12 +27,17 @@ func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, a return nil, err } - bridge, err := bindings.NewRskBridge(bridgeAddress, client.Rpc()) + ethClient, ok := client.Rpc().(*ethclient.Client) + if !ok { + return nil, errors.New("invalid RSK client type, expected *ethclient.Client to build the registry") + } + + bridge, err := bindings.NewRskBridge(bridgeAddress, ethClient) if err != nil { return nil, err } - lbc, err := bindings.NewLiquidityBridgeContract(lbcAddress, client.Rpc()) + lbc, err := bindings.NewLiquidityBridgeContract(lbcAddress, ethClient) if err != nil { return nil, err } @@ -46,9 +53,16 @@ func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, a bridge, client, bitcoinConn.NetworkParams, + rootstock.DefaultRetryParams, + ), + Lbc: rootstock.NewLiquidityBridgeContractImpl( + client, + env.LbcAddress, + rootstock.NewLbcAdapter(lbc), + wallet, + rootstock.DefaultRetryParams, ), - Lbc: rootstock.NewLiquidityBridgeContractImpl(client, env.LbcAddress, lbc, wallet), - FeeCollector: rootstock.NewFeeCollectorImpl(lbc), + FeeCollector: rootstock.NewFeeCollectorImpl(rootstock.NewLbcAdapter(lbc), rootstock.DefaultRetryParams), }, Wallet: wallet, Client: client, diff --git a/internal/usecases/liquidity_provider/generate_default_credentials_test.go b/internal/usecases/liquidity_provider/generate_default_credentials_test.go index 38d70271..4f649526 100644 --- a/internal/usecases/liquidity_provider/generate_default_credentials_test.go +++ b/internal/usecases/liquidity_provider/generate_default_credentials_test.go @@ -37,7 +37,7 @@ func TestGenerateDefaultCredentialsUseCase_Run(t *testing.T) { assert.NotEmpty(t, event.Credentials.UsernameSalt) })).Once() useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) - dir := os.TempDir() + dir := t.TempDir() buff := new(bytes.Buffer) log.SetOutput(buff) err := useCase.Run(context.Background(), dir) @@ -74,7 +74,7 @@ func TestGenerateDefaultCredentialsUseCase_Run_StoredCredentials(t *testing.T) { }, }, nil) useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) - dir := os.TempDir() + dir := t.TempDir() err := useCase.Run(context.Background(), dir) require.NoError(t, err) eventBus.AssertNotCalled(t, "Publish") @@ -87,7 +87,7 @@ func TestGenerateDefaultCredentialsUseCase_Run_ErrorHandling(t *testing.T) { eventBus := &mocks.EventBusMock{} lpRepository.On("GetCredentials", context.Background()).Return(nil, assert.AnError) useCase := liquidity_provider.NewGenerateDefaultCredentialsUseCase(lpRepository, eventBus) - dir := os.TempDir() + dir := t.TempDir() err := useCase.Run(context.Background(), dir) require.Error(t, err) eventBus.AssertNotCalled(t, "Publish") diff --git a/test/mocks/common.go b/test/mocks/common.go new file mode 100644 index 00000000..3ba4365c --- /dev/null +++ b/test/mocks/common.go @@ -0,0 +1,25 @@ +package mocks + +import "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + +func GetFakeFedInfo() blockchain.FederationInfo { + var keys []string + keys = append(keys, "02cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1") + keys = append(keys, "0362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a124") + keys = append(keys, "03c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db") + + var erpPubKeys []string + erpPubKeys = append(erpPubKeys, "0257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d4") + erpPubKeys = append(erpPubKeys, "03c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f9") + erpPubKeys = append(erpPubKeys, "03cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b3") + erpPubKeys = append(erpPubKeys, "02370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80") + + return blockchain.FederationInfo{ + ActiveFedBlockHeight: 0, + ErpKeys: erpPubKeys, + FedSize: int64(len(keys)), + FedThreshold: int64(len(keys)/2 + 1), + PubKeys: keys, + IrisActivationHeight: 0, + } +} diff --git a/test/mocks/event_iterator_adapter_mock.go b/test/mocks/event_iterator_adapter_mock.go new file mode 100644 index 00000000..4a6f15b0 --- /dev/null +++ b/test/mocks/event_iterator_adapter_mock.go @@ -0,0 +1,214 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// EventIteratorAdapterMock is an autogenerated mock type for the EventIteratorAdapter type +type EventIteratorAdapterMock[T interface{}] struct { + mock.Mock +} + +type EventIteratorAdapterMock_Expecter[T interface{}] struct { + mock *mock.Mock +} + +func (_m *EventIteratorAdapterMock[T]) EXPECT() *EventIteratorAdapterMock_Expecter[T] { + return &EventIteratorAdapterMock_Expecter[T]{mock: &_m.Mock} +} + +// Close provides a mock function with given fields: +func (_m *EventIteratorAdapterMock[T]) Close() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Close") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EventIteratorAdapterMock_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' +type EventIteratorAdapterMock_Close_Call[T interface{}] struct { + *mock.Call +} + +// Close is a helper method to define mock.On call +func (_e *EventIteratorAdapterMock_Expecter[T]) Close() *EventIteratorAdapterMock_Close_Call[T] { + return &EventIteratorAdapterMock_Close_Call[T]{Call: _e.mock.On("Close")} +} + +func (_c *EventIteratorAdapterMock_Close_Call[T]) Run(run func()) *EventIteratorAdapterMock_Close_Call[T] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EventIteratorAdapterMock_Close_Call[T]) Return(_a0 error) *EventIteratorAdapterMock_Close_Call[T] { + _c.Call.Return(_a0) + return _c +} + +func (_c *EventIteratorAdapterMock_Close_Call[T]) RunAndReturn(run func() error) *EventIteratorAdapterMock_Close_Call[T] { + _c.Call.Return(run) + return _c +} + +// Error provides a mock function with given fields: +func (_m *EventIteratorAdapterMock[T]) Error() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Error") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EventIteratorAdapterMock_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' +type EventIteratorAdapterMock_Error_Call[T interface{}] struct { + *mock.Call +} + +// Error is a helper method to define mock.On call +func (_e *EventIteratorAdapterMock_Expecter[T]) Error() *EventIteratorAdapterMock_Error_Call[T] { + return &EventIteratorAdapterMock_Error_Call[T]{Call: _e.mock.On("Error")} +} + +func (_c *EventIteratorAdapterMock_Error_Call[T]) Run(run func()) *EventIteratorAdapterMock_Error_Call[T] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EventIteratorAdapterMock_Error_Call[T]) Return(_a0 error) *EventIteratorAdapterMock_Error_Call[T] { + _c.Call.Return(_a0) + return _c +} + +func (_c *EventIteratorAdapterMock_Error_Call[T]) RunAndReturn(run func() error) *EventIteratorAdapterMock_Error_Call[T] { + _c.Call.Return(run) + return _c +} + +// Event provides a mock function with given fields: +func (_m *EventIteratorAdapterMock[T]) Event() *T { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Event") + } + + var r0 *T + if rf, ok := ret.Get(0).(func() *T); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + return r0 +} + +// EventIteratorAdapterMock_Event_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Event' +type EventIteratorAdapterMock_Event_Call[T interface{}] struct { + *mock.Call +} + +// Event is a helper method to define mock.On call +func (_e *EventIteratorAdapterMock_Expecter[T]) Event() *EventIteratorAdapterMock_Event_Call[T] { + return &EventIteratorAdapterMock_Event_Call[T]{Call: _e.mock.On("Event")} +} + +func (_c *EventIteratorAdapterMock_Event_Call[T]) Run(run func()) *EventIteratorAdapterMock_Event_Call[T] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EventIteratorAdapterMock_Event_Call[T]) Return(_a0 *T) *EventIteratorAdapterMock_Event_Call[T] { + _c.Call.Return(_a0) + return _c +} + +func (_c *EventIteratorAdapterMock_Event_Call[T]) RunAndReturn(run func() *T) *EventIteratorAdapterMock_Event_Call[T] { + _c.Call.Return(run) + return _c +} + +// Next provides a mock function with given fields: +func (_m *EventIteratorAdapterMock[T]) Next() bool { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Next") + } + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// EventIteratorAdapterMock_Next_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Next' +type EventIteratorAdapterMock_Next_Call[T interface{}] struct { + *mock.Call +} + +// Next is a helper method to define mock.On call +func (_e *EventIteratorAdapterMock_Expecter[T]) Next() *EventIteratorAdapterMock_Next_Call[T] { + return &EventIteratorAdapterMock_Next_Call[T]{Call: _e.mock.On("Next")} +} + +func (_c *EventIteratorAdapterMock_Next_Call[T]) Run(run func()) *EventIteratorAdapterMock_Next_Call[T] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EventIteratorAdapterMock_Next_Call[T]) Return(_a0 bool) *EventIteratorAdapterMock_Next_Call[T] { + _c.Call.Return(_a0) + return _c +} + +func (_c *EventIteratorAdapterMock_Next_Call[T]) RunAndReturn(run func() bool) *EventIteratorAdapterMock_Next_Call[T] { + _c.Call.Return(run) + return _c +} + +// NewEventIteratorAdapterMock creates a new instance of EventIteratorAdapterMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEventIteratorAdapterMock[T interface{}](t interface { + mock.TestingT + Cleanup(func()) +}) *EventIteratorAdapterMock[T] { + mock := &EventIteratorAdapterMock[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/lbc_adapter_mock.go b/test/mocks/lbc_adapter_mock.go new file mode 100644 index 00000000..beb9f97f --- /dev/null +++ b/test/mocks/lbc_adapter_mock.go @@ -0,0 +1,1602 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + bindings "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + + mock "github.com/stretchr/testify/mock" + + rootstock "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// LbcAdapterMock is an autogenerated mock type for the LbcAdapter type +type LbcAdapterMock struct { + mock.Mock +} + +type LbcAdapterMock_Expecter struct { + mock *mock.Mock +} + +func (_m *LbcAdapterMock) EXPECT() *LbcAdapterMock_Expecter { + return &LbcAdapterMock_Expecter{mock: &_m.Mock} +} + +// AddCollateral provides a mock function with given fields: opts +func (_m *LbcAdapterMock) AddCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for AddCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_AddCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddCollateral' +type LbcAdapterMock_AddCollateral_Call struct { + *mock.Call +} + +// AddCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcAdapterMock_Expecter) AddCollateral(opts interface{}) *LbcAdapterMock_AddCollateral_Call { + return &LbcAdapterMock_AddCollateral_Call{Call: _e.mock.On("AddCollateral", opts)} +} + +func (_c *LbcAdapterMock_AddCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcAdapterMock_AddCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_AddCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_AddCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_AddCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcAdapterMock_AddCollateral_Call { + _c.Call.Return(run) + return _c +} + +// AddPegoutCollateral provides a mock function with given fields: opts +func (_m *LbcAdapterMock) AddPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for AddPegoutCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_AddPegoutCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPegoutCollateral' +type LbcAdapterMock_AddPegoutCollateral_Call struct { + *mock.Call +} + +// AddPegoutCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcAdapterMock_Expecter) AddPegoutCollateral(opts interface{}) *LbcAdapterMock_AddPegoutCollateral_Call { + return &LbcAdapterMock_AddPegoutCollateral_Call{Call: _e.mock.On("AddPegoutCollateral", opts)} +} + +func (_c *LbcAdapterMock_AddPegoutCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcAdapterMock_AddPegoutCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_AddPegoutCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_AddPegoutCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_AddPegoutCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcAdapterMock_AddPegoutCollateral_Call { + _c.Call.Return(run) + return _c +} + +// CallForUser provides a mock function with given fields: opts, quote +func (_m *LbcAdapterMock) CallForUser(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote) (*types.Transaction, error) { + ret := _m.Called(opts, quote) + + if len(ret) == 0 { + panic("no return value specified for CallForUser") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote) (*types.Transaction, error)); ok { + return rf(opts, quote) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote) *types.Transaction); ok { + r0 = rf(opts, quote) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, bindings.QuotesPeginQuote) error); ok { + r1 = rf(opts, quote) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_CallForUser_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CallForUser' +type LbcAdapterMock_CallForUser_Call struct { + *mock.Call +} + +// CallForUser is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - quote bindings.QuotesPeginQuote +func (_e *LbcAdapterMock_Expecter) CallForUser(opts interface{}, quote interface{}) *LbcAdapterMock_CallForUser_Call { + return &LbcAdapterMock_CallForUser_Call{Call: _e.mock.On("CallForUser", opts, quote)} +} + +func (_c *LbcAdapterMock_CallForUser_Call) Run(run func(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote)) *LbcAdapterMock_CallForUser_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(bindings.QuotesPeginQuote)) + }) + return _c +} + +func (_c *LbcAdapterMock_CallForUser_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_CallForUser_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_CallForUser_Call) RunAndReturn(run func(*bind.TransactOpts, bindings.QuotesPeginQuote) (*types.Transaction, error)) *LbcAdapterMock_CallForUser_Call { + _c.Call.Return(run) + return _c +} + +// Caller provides a mock function with given fields: +func (_m *LbcAdapterMock) Caller() rootstock.LbcCallerBinding { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Caller") + } + + var r0 rootstock.LbcCallerBinding + if rf, ok := ret.Get(0).(func() rootstock.LbcCallerBinding); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rootstock.LbcCallerBinding) + } + } + + return r0 +} + +// LbcAdapterMock_Caller_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Caller' +type LbcAdapterMock_Caller_Call struct { + *mock.Call +} + +// Caller is a helper method to define mock.On call +func (_e *LbcAdapterMock_Expecter) Caller() *LbcAdapterMock_Caller_Call { + return &LbcAdapterMock_Caller_Call{Call: _e.mock.On("Caller")} +} + +func (_c *LbcAdapterMock_Caller_Call) Run(run func()) *LbcAdapterMock_Caller_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *LbcAdapterMock_Caller_Call) Return(_a0 rootstock.LbcCallerBinding) *LbcAdapterMock_Caller_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LbcAdapterMock_Caller_Call) RunAndReturn(run func() rootstock.LbcCallerBinding) *LbcAdapterMock_Caller_Call { + _c.Call.Return(run) + return _c +} + +// DepositEventIteratorAdapter provides a mock function with given fields: rawIterator +func (_m *LbcAdapterMock) DepositEventIteratorAdapter(rawIterator *bindings.LiquidityBridgeContractPegOutDepositIterator) rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit] { + ret := _m.Called(rawIterator) + + if len(ret) == 0 { + panic("no return value specified for DepositEventIteratorAdapter") + } + + var r0 rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit] + if rf, ok := ret.Get(0).(func(*bindings.LiquidityBridgeContractPegOutDepositIterator) rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit]); ok { + r0 = rf(rawIterator) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit]) + } + } + + return r0 +} + +// LbcAdapterMock_DepositEventIteratorAdapter_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DepositEventIteratorAdapter' +type LbcAdapterMock_DepositEventIteratorAdapter_Call struct { + *mock.Call +} + +// DepositEventIteratorAdapter is a helper method to define mock.On call +// - rawIterator *bindings.LiquidityBridgeContractPegOutDepositIterator +func (_e *LbcAdapterMock_Expecter) DepositEventIteratorAdapter(rawIterator interface{}) *LbcAdapterMock_DepositEventIteratorAdapter_Call { + return &LbcAdapterMock_DepositEventIteratorAdapter_Call{Call: _e.mock.On("DepositEventIteratorAdapter", rawIterator)} +} + +func (_c *LbcAdapterMock_DepositEventIteratorAdapter_Call) Run(run func(rawIterator *bindings.LiquidityBridgeContractPegOutDepositIterator)) *LbcAdapterMock_DepositEventIteratorAdapter_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bindings.LiquidityBridgeContractPegOutDepositIterator)) + }) + return _c +} + +func (_c *LbcAdapterMock_DepositEventIteratorAdapter_Call) Return(_a0 rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit]) *LbcAdapterMock_DepositEventIteratorAdapter_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LbcAdapterMock_DepositEventIteratorAdapter_Call) RunAndReturn(run func(*bindings.LiquidityBridgeContractPegOutDepositIterator) rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPegOutDeposit]) *LbcAdapterMock_DepositEventIteratorAdapter_Call { + _c.Call.Return(run) + return _c +} + +// FilterPegOutDeposit provides a mock function with given fields: opts, quoteHash, sender +func (_m *LbcAdapterMock) FilterPegOutDeposit(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error) { + ret := _m.Called(opts, quoteHash, sender) + + if len(ret) == 0 { + panic("no return value specified for FilterPegOutDeposit") + } + + var r0 *bindings.LiquidityBridgeContractPegOutDepositIterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error)); ok { + return rf(opts, quoteHash, sender) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address) *bindings.LiquidityBridgeContractPegOutDepositIterator); ok { + r0 = rf(opts, quoteHash, sender) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bindings.LiquidityBridgeContractPegOutDepositIterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address) error); ok { + r1 = rf(opts, quoteHash, sender) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_FilterPegOutDeposit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPegOutDeposit' +type LbcAdapterMock_FilterPegOutDeposit_Call struct { + *mock.Call +} + +// FilterPegOutDeposit is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - quoteHash [][32]byte +// - sender []common.Address +func (_e *LbcAdapterMock_Expecter) FilterPegOutDeposit(opts interface{}, quoteHash interface{}, sender interface{}) *LbcAdapterMock_FilterPegOutDeposit_Call { + return &LbcAdapterMock_FilterPegOutDeposit_Call{Call: _e.mock.On("FilterPegOutDeposit", opts, quoteHash, sender)} +} + +func (_c *LbcAdapterMock_FilterPegOutDeposit_Call) Run(run func(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address)) *LbcAdapterMock_FilterPegOutDeposit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address)) + }) + return _c +} + +func (_c *LbcAdapterMock_FilterPegOutDeposit_Call) Return(_a0 *bindings.LiquidityBridgeContractPegOutDepositIterator, _a1 error) *LbcAdapterMock_FilterPegOutDeposit_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_FilterPegOutDeposit_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error)) *LbcAdapterMock_FilterPegOutDeposit_Call { + _c.Call.Return(run) + return _c +} + +// FilterPenalized provides a mock function with given fields: opts +func (_m *LbcAdapterMock) FilterPenalized(opts *bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FilterPenalized") + } + + var r0 *bindings.LiquidityBridgeContractPenalizedIterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *bindings.LiquidityBridgeContractPenalizedIterator); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bindings.LiquidityBridgeContractPenalizedIterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_FilterPenalized_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPenalized' +type LbcAdapterMock_FilterPenalized_Call struct { + *mock.Call +} + +// FilterPenalized is a helper method to define mock.On call +// - opts *bind.FilterOpts +func (_e *LbcAdapterMock_Expecter) FilterPenalized(opts interface{}) *LbcAdapterMock_FilterPenalized_Call { + return &LbcAdapterMock_FilterPenalized_Call{Call: _e.mock.On("FilterPenalized", opts)} +} + +func (_c *LbcAdapterMock_FilterPenalized_Call) Run(run func(opts *bind.FilterOpts)) *LbcAdapterMock_FilterPenalized_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_FilterPenalized_Call) Return(_a0 *bindings.LiquidityBridgeContractPenalizedIterator, _a1 error) *LbcAdapterMock_FilterPenalized_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_FilterPenalized_Call) RunAndReturn(run func(*bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error)) *LbcAdapterMock_FilterPenalized_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: opts, addr +func (_m *LbcAdapterMock) GetBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for GetBalance") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { + r0 = rf(opts, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type LbcAdapterMock_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcAdapterMock_Expecter) GetBalance(opts interface{}, addr interface{}) *LbcAdapterMock_GetBalance_Call { + return &LbcAdapterMock_GetBalance_Call{Call: _e.mock.On("GetBalance", opts, addr)} +} + +func (_c *LbcAdapterMock_GetBalance_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcAdapterMock_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcAdapterMock_GetBalance_Call) Return(_a0 *big.Int, _a1 error) *LbcAdapterMock_GetBalance_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_GetBalance_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *LbcAdapterMock_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetCollateral provides a mock function with given fields: opts, addr +func (_m *LbcAdapterMock) GetCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for GetCollateral") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { + r0 = rf(opts, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_GetCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCollateral' +type LbcAdapterMock_GetCollateral_Call struct { + *mock.Call +} + +// GetCollateral is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcAdapterMock_Expecter) GetCollateral(opts interface{}, addr interface{}) *LbcAdapterMock_GetCollateral_Call { + return &LbcAdapterMock_GetCollateral_Call{Call: _e.mock.On("GetCollateral", opts, addr)} +} + +func (_c *LbcAdapterMock_GetCollateral_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcAdapterMock_GetCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcAdapterMock_GetCollateral_Call) Return(_a0 *big.Int, _a1 error) *LbcAdapterMock_GetCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_GetCollateral_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *LbcAdapterMock_GetCollateral_Call { + _c.Call.Return(run) + return _c +} + +// GetMinCollateral provides a mock function with given fields: opts +func (_m *LbcAdapterMock) GetMinCollateral(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetMinCollateral") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_GetMinCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMinCollateral' +type LbcAdapterMock_GetMinCollateral_Call struct { + *mock.Call +} + +// GetMinCollateral is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *LbcAdapterMock_Expecter) GetMinCollateral(opts interface{}) *LbcAdapterMock_GetMinCollateral_Call { + return &LbcAdapterMock_GetMinCollateral_Call{Call: _e.mock.On("GetMinCollateral", opts)} +} + +func (_c *LbcAdapterMock_GetMinCollateral_Call) Run(run func(opts *bind.CallOpts)) *LbcAdapterMock_GetMinCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_GetMinCollateral_Call) Return(_a0 *big.Int, _a1 error) *LbcAdapterMock_GetMinCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_GetMinCollateral_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *LbcAdapterMock_GetMinCollateral_Call { + _c.Call.Return(run) + return _c +} + +// GetPegoutCollateral provides a mock function with given fields: opts, addr +func (_m *LbcAdapterMock) GetPegoutCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for GetPegoutCollateral") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { + r0 = rf(opts, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_GetPegoutCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPegoutCollateral' +type LbcAdapterMock_GetPegoutCollateral_Call struct { + *mock.Call +} + +// GetPegoutCollateral is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcAdapterMock_Expecter) GetPegoutCollateral(opts interface{}, addr interface{}) *LbcAdapterMock_GetPegoutCollateral_Call { + return &LbcAdapterMock_GetPegoutCollateral_Call{Call: _e.mock.On("GetPegoutCollateral", opts, addr)} +} + +func (_c *LbcAdapterMock_GetPegoutCollateral_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcAdapterMock_GetPegoutCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcAdapterMock_GetPegoutCollateral_Call) Return(_a0 *big.Int, _a1 error) *LbcAdapterMock_GetPegoutCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_GetPegoutCollateral_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *LbcAdapterMock_GetPegoutCollateral_Call { + _c.Call.Return(run) + return _c +} + +// GetProviderIds provides a mock function with given fields: opts +func (_m *LbcAdapterMock) GetProviderIds(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetProviderIds") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_GetProviderIds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProviderIds' +type LbcAdapterMock_GetProviderIds_Call struct { + *mock.Call +} + +// GetProviderIds is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *LbcAdapterMock_Expecter) GetProviderIds(opts interface{}) *LbcAdapterMock_GetProviderIds_Call { + return &LbcAdapterMock_GetProviderIds_Call{Call: _e.mock.On("GetProviderIds", opts)} +} + +func (_c *LbcAdapterMock_GetProviderIds_Call) Run(run func(opts *bind.CallOpts)) *LbcAdapterMock_GetProviderIds_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_GetProviderIds_Call) Return(_a0 *big.Int, _a1 error) *LbcAdapterMock_GetProviderIds_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_GetProviderIds_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *LbcAdapterMock_GetProviderIds_Call { + _c.Call.Return(run) + return _c +} + +// GetProviders provides a mock function with given fields: opts, providerIds +func (_m *LbcAdapterMock) GetProviders(opts *bind.CallOpts, providerIds []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { + ret := _m.Called(opts, providerIds) + + if len(ret) == 0 { + panic("no return value specified for GetProviders") + } + + var r0 []bindings.LiquidityBridgeContractLiquidityProvider + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error)); ok { + return rf(opts, providerIds) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, []*big.Int) []bindings.LiquidityBridgeContractLiquidityProvider); ok { + r0 = rf(opts, providerIds) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]bindings.LiquidityBridgeContractLiquidityProvider) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, []*big.Int) error); ok { + r1 = rf(opts, providerIds) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_GetProviders_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProviders' +type LbcAdapterMock_GetProviders_Call struct { + *mock.Call +} + +// GetProviders is a helper method to define mock.On call +// - opts *bind.CallOpts +// - providerIds []*big.Int +func (_e *LbcAdapterMock_Expecter) GetProviders(opts interface{}, providerIds interface{}) *LbcAdapterMock_GetProviders_Call { + return &LbcAdapterMock_GetProviders_Call{Call: _e.mock.On("GetProviders", opts, providerIds)} +} + +func (_c *LbcAdapterMock_GetProviders_Call) Run(run func(opts *bind.CallOpts, providerIds []*big.Int)) *LbcAdapterMock_GetProviders_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].([]*big.Int)) + }) + return _c +} + +func (_c *LbcAdapterMock_GetProviders_Call) Return(_a0 []bindings.LiquidityBridgeContractLiquidityProvider, _a1 error) *LbcAdapterMock_GetProviders_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_GetProviders_Call) RunAndReturn(run func(*bind.CallOpts, []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error)) *LbcAdapterMock_GetProviders_Call { + _c.Call.Return(run) + return _c +} + +// HashPegoutQuote provides a mock function with given fields: opts, quote +func (_m *LbcAdapterMock) HashPegoutQuote(opts *bind.CallOpts, quote bindings.QuotesPegOutQuote) ([32]byte, error) { + ret := _m.Called(opts, quote) + + if len(ret) == 0 { + panic("no return value specified for HashPegoutQuote") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPegOutQuote) ([32]byte, error)); ok { + return rf(opts, quote) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPegOutQuote) [32]byte); ok { + r0 = rf(opts, quote) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, bindings.QuotesPegOutQuote) error); ok { + r1 = rf(opts, quote) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_HashPegoutQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HashPegoutQuote' +type LbcAdapterMock_HashPegoutQuote_Call struct { + *mock.Call +} + +// HashPegoutQuote is a helper method to define mock.On call +// - opts *bind.CallOpts +// - quote bindings.QuotesPegOutQuote +func (_e *LbcAdapterMock_Expecter) HashPegoutQuote(opts interface{}, quote interface{}) *LbcAdapterMock_HashPegoutQuote_Call { + return &LbcAdapterMock_HashPegoutQuote_Call{Call: _e.mock.On("HashPegoutQuote", opts, quote)} +} + +func (_c *LbcAdapterMock_HashPegoutQuote_Call) Run(run func(opts *bind.CallOpts, quote bindings.QuotesPegOutQuote)) *LbcAdapterMock_HashPegoutQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(bindings.QuotesPegOutQuote)) + }) + return _c +} + +func (_c *LbcAdapterMock_HashPegoutQuote_Call) Return(_a0 [32]byte, _a1 error) *LbcAdapterMock_HashPegoutQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_HashPegoutQuote_Call) RunAndReturn(run func(*bind.CallOpts, bindings.QuotesPegOutQuote) ([32]byte, error)) *LbcAdapterMock_HashPegoutQuote_Call { + _c.Call.Return(run) + return _c +} + +// HashQuote provides a mock function with given fields: opts, quote +func (_m *LbcAdapterMock) HashQuote(opts *bind.CallOpts, quote bindings.QuotesPeginQuote) ([32]byte, error) { + ret := _m.Called(opts, quote) + + if len(ret) == 0 { + panic("no return value specified for HashQuote") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPeginQuote) ([32]byte, error)); ok { + return rf(opts, quote) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPeginQuote) [32]byte); ok { + r0 = rf(opts, quote) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, bindings.QuotesPeginQuote) error); ok { + r1 = rf(opts, quote) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_HashQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HashQuote' +type LbcAdapterMock_HashQuote_Call struct { + *mock.Call +} + +// HashQuote is a helper method to define mock.On call +// - opts *bind.CallOpts +// - quote bindings.QuotesPeginQuote +func (_e *LbcAdapterMock_Expecter) HashQuote(opts interface{}, quote interface{}) *LbcAdapterMock_HashQuote_Call { + return &LbcAdapterMock_HashQuote_Call{Call: _e.mock.On("HashQuote", opts, quote)} +} + +func (_c *LbcAdapterMock_HashQuote_Call) Run(run func(opts *bind.CallOpts, quote bindings.QuotesPeginQuote)) *LbcAdapterMock_HashQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(bindings.QuotesPeginQuote)) + }) + return _c +} + +func (_c *LbcAdapterMock_HashQuote_Call) Return(_a0 [32]byte, _a1 error) *LbcAdapterMock_HashQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_HashQuote_Call) RunAndReturn(run func(*bind.CallOpts, bindings.QuotesPeginQuote) ([32]byte, error)) *LbcAdapterMock_HashQuote_Call { + _c.Call.Return(run) + return _c +} + +// IsOperational provides a mock function with given fields: opts, addr +func (_m *LbcAdapterMock) IsOperational(opts *bind.CallOpts, addr common.Address) (bool, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for IsOperational") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (bool, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) bool); ok { + r0 = rf(opts, addr) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_IsOperational_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsOperational' +type LbcAdapterMock_IsOperational_Call struct { + *mock.Call +} + +// IsOperational is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcAdapterMock_Expecter) IsOperational(opts interface{}, addr interface{}) *LbcAdapterMock_IsOperational_Call { + return &LbcAdapterMock_IsOperational_Call{Call: _e.mock.On("IsOperational", opts, addr)} +} + +func (_c *LbcAdapterMock_IsOperational_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcAdapterMock_IsOperational_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcAdapterMock_IsOperational_Call) Return(_a0 bool, _a1 error) *LbcAdapterMock_IsOperational_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_IsOperational_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (bool, error)) *LbcAdapterMock_IsOperational_Call { + _c.Call.Return(run) + return _c +} + +// IsOperationalForPegout provides a mock function with given fields: opts, addr +func (_m *LbcAdapterMock) IsOperationalForPegout(opts *bind.CallOpts, addr common.Address) (bool, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for IsOperationalForPegout") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (bool, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) bool); ok { + r0 = rf(opts, addr) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_IsOperationalForPegout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsOperationalForPegout' +type LbcAdapterMock_IsOperationalForPegout_Call struct { + *mock.Call +} + +// IsOperationalForPegout is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcAdapterMock_Expecter) IsOperationalForPegout(opts interface{}, addr interface{}) *LbcAdapterMock_IsOperationalForPegout_Call { + return &LbcAdapterMock_IsOperationalForPegout_Call{Call: _e.mock.On("IsOperationalForPegout", opts, addr)} +} + +func (_c *LbcAdapterMock_IsOperationalForPegout_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcAdapterMock_IsOperationalForPegout_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcAdapterMock_IsOperationalForPegout_Call) Return(_a0 bool, _a1 error) *LbcAdapterMock_IsOperationalForPegout_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_IsOperationalForPegout_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (bool, error)) *LbcAdapterMock_IsOperationalForPegout_Call { + _c.Call.Return(run) + return _c +} + +// ParseRegister provides a mock function with given fields: log +func (_m *LbcAdapterMock) ParseRegister(log types.Log) (*bindings.LiquidityBridgeContractRegister, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseRegister") + } + + var r0 *bindings.LiquidityBridgeContractRegister + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*bindings.LiquidityBridgeContractRegister, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *bindings.LiquidityBridgeContractRegister); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bindings.LiquidityBridgeContractRegister) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_ParseRegister_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseRegister' +type LbcAdapterMock_ParseRegister_Call struct { + *mock.Call +} + +// ParseRegister is a helper method to define mock.On call +// - log types.Log +func (_e *LbcAdapterMock_Expecter) ParseRegister(log interface{}) *LbcAdapterMock_ParseRegister_Call { + return &LbcAdapterMock_ParseRegister_Call{Call: _e.mock.On("ParseRegister", log)} +} + +func (_c *LbcAdapterMock_ParseRegister_Call) Run(run func(log types.Log)) *LbcAdapterMock_ParseRegister_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *LbcAdapterMock_ParseRegister_Call) Return(_a0 *bindings.LiquidityBridgeContractRegister, _a1 error) *LbcAdapterMock_ParseRegister_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_ParseRegister_Call) RunAndReturn(run func(types.Log) (*bindings.LiquidityBridgeContractRegister, error)) *LbcAdapterMock_ParseRegister_Call { + _c.Call.Return(run) + return _c +} + +// PenalizedEventIteratorAdapter provides a mock function with given fields: rawIterator +func (_m *LbcAdapterMock) PenalizedEventIteratorAdapter(rawIterator *bindings.LiquidityBridgeContractPenalizedIterator) rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized] { + ret := _m.Called(rawIterator) + + if len(ret) == 0 { + panic("no return value specified for PenalizedEventIteratorAdapter") + } + + var r0 rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized] + if rf, ok := ret.Get(0).(func(*bindings.LiquidityBridgeContractPenalizedIterator) rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized]); ok { + r0 = rf(rawIterator) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized]) + } + } + + return r0 +} + +// LbcAdapterMock_PenalizedEventIteratorAdapter_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PenalizedEventIteratorAdapter' +type LbcAdapterMock_PenalizedEventIteratorAdapter_Call struct { + *mock.Call +} + +// PenalizedEventIteratorAdapter is a helper method to define mock.On call +// - rawIterator *bindings.LiquidityBridgeContractPenalizedIterator +func (_e *LbcAdapterMock_Expecter) PenalizedEventIteratorAdapter(rawIterator interface{}) *LbcAdapterMock_PenalizedEventIteratorAdapter_Call { + return &LbcAdapterMock_PenalizedEventIteratorAdapter_Call{Call: _e.mock.On("PenalizedEventIteratorAdapter", rawIterator)} +} + +func (_c *LbcAdapterMock_PenalizedEventIteratorAdapter_Call) Run(run func(rawIterator *bindings.LiquidityBridgeContractPenalizedIterator)) *LbcAdapterMock_PenalizedEventIteratorAdapter_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bindings.LiquidityBridgeContractPenalizedIterator)) + }) + return _c +} + +func (_c *LbcAdapterMock_PenalizedEventIteratorAdapter_Call) Return(_a0 rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized]) *LbcAdapterMock_PenalizedEventIteratorAdapter_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LbcAdapterMock_PenalizedEventIteratorAdapter_Call) RunAndReturn(run func(*bindings.LiquidityBridgeContractPenalizedIterator) rootstock.EventIteratorAdapter[bindings.LiquidityBridgeContractPenalized]) *LbcAdapterMock_PenalizedEventIteratorAdapter_Call { + _c.Call.Return(run) + return _c +} + +// ProductFeePercentage provides a mock function with given fields: opts +func (_m *LbcAdapterMock) ProductFeePercentage(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for ProductFeePercentage") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_ProductFeePercentage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProductFeePercentage' +type LbcAdapterMock_ProductFeePercentage_Call struct { + *mock.Call +} + +// ProductFeePercentage is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *LbcAdapterMock_Expecter) ProductFeePercentage(opts interface{}) *LbcAdapterMock_ProductFeePercentage_Call { + return &LbcAdapterMock_ProductFeePercentage_Call{Call: _e.mock.On("ProductFeePercentage", opts)} +} + +func (_c *LbcAdapterMock_ProductFeePercentage_Call) Run(run func(opts *bind.CallOpts)) *LbcAdapterMock_ProductFeePercentage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_ProductFeePercentage_Call) Return(_a0 *big.Int, _a1 error) *LbcAdapterMock_ProductFeePercentage_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_ProductFeePercentage_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *LbcAdapterMock_ProductFeePercentage_Call { + _c.Call.Return(run) + return _c +} + +// RefundPegOut provides a mock function with given fields: opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes +func (_m *LbcAdapterMock) RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { + ret := _m.Called(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + + if len(ret) == 0 { + panic("no return value specified for RefundPegOut") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) (*types.Transaction, error)); ok { + return rf(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) *types.Transaction); ok { + r0 = rf(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) error); ok { + r1 = rf(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_RefundPegOut_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RefundPegOut' +type LbcAdapterMock_RefundPegOut_Call struct { + *mock.Call +} + +// RefundPegOut is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - quoteHash [32]byte +// - btcTx []byte +// - btcBlockHeaderHash [32]byte +// - partialMerkleTree *big.Int +// - merkleBranchHashes [][32]byte +func (_e *LbcAdapterMock_Expecter) RefundPegOut(opts interface{}, quoteHash interface{}, btcTx interface{}, btcBlockHeaderHash interface{}, partialMerkleTree interface{}, merkleBranchHashes interface{}) *LbcAdapterMock_RefundPegOut_Call { + return &LbcAdapterMock_RefundPegOut_Call{Call: _e.mock.On("RefundPegOut", opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes)} +} + +func (_c *LbcAdapterMock_RefundPegOut_Call) Run(run func(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte)) *LbcAdapterMock_RefundPegOut_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([32]byte), args[2].([]byte), args[3].([32]byte), args[4].(*big.Int), args[5].([][32]byte)) + }) + return _c +} + +func (_c *LbcAdapterMock_RefundPegOut_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_RefundPegOut_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_RefundPegOut_Call) RunAndReturn(run func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) (*types.Transaction, error)) *LbcAdapterMock_RefundPegOut_Call { + _c.Call.Return(run) + return _c +} + +// Register provides a mock function with given fields: opts, _name, _apiBaseUrl, _status, _providerType +func (_m *LbcAdapterMock) Register(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { + ret := _m.Called(opts, _name, _apiBaseUrl, _status, _providerType) + + if len(ret) == 0 { + panic("no return value specified for Register") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string, string, bool, string) (*types.Transaction, error)); ok { + return rf(opts, _name, _apiBaseUrl, _status, _providerType) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string, string, bool, string) *types.Transaction); ok { + r0 = rf(opts, _name, _apiBaseUrl, _status, _providerType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, string, string, bool, string) error); ok { + r1 = rf(opts, _name, _apiBaseUrl, _status, _providerType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_Register_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Register' +type LbcAdapterMock_Register_Call struct { + *mock.Call +} + +// Register is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - _name string +// - _apiBaseUrl string +// - _status bool +// - _providerType string +func (_e *LbcAdapterMock_Expecter) Register(opts interface{}, _name interface{}, _apiBaseUrl interface{}, _status interface{}, _providerType interface{}) *LbcAdapterMock_Register_Call { + return &LbcAdapterMock_Register_Call{Call: _e.mock.On("Register", opts, _name, _apiBaseUrl, _status, _providerType)} +} + +func (_c *LbcAdapterMock_Register_Call) Run(run func(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string)) *LbcAdapterMock_Register_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(string), args[2].(string), args[3].(bool), args[4].(string)) + }) + return _c +} + +func (_c *LbcAdapterMock_Register_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_Register_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_Register_Call) RunAndReturn(run func(*bind.TransactOpts, string, string, bool, string) (*types.Transaction, error)) *LbcAdapterMock_Register_Call { + _c.Call.Return(run) + return _c +} + +// RegisterPegIn provides a mock function with given fields: opts, quote, signature, btcRawTransaction, partialMerkleTree, height +func (_m *LbcAdapterMock) RegisterPegIn(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { + ret := _m.Called(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + + if len(ret) == 0 { + panic("no return value specified for RegisterPegIn") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) (*types.Transaction, error)); ok { + return rf(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) *types.Transaction); ok { + r0 = rf(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) error); ok { + r1 = rf(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_RegisterPegIn_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegisterPegIn' +type LbcAdapterMock_RegisterPegIn_Call struct { + *mock.Call +} + +// RegisterPegIn is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - quote bindings.QuotesPeginQuote +// - signature []byte +// - btcRawTransaction []byte +// - partialMerkleTree []byte +// - height *big.Int +func (_e *LbcAdapterMock_Expecter) RegisterPegIn(opts interface{}, quote interface{}, signature interface{}, btcRawTransaction interface{}, partialMerkleTree interface{}, height interface{}) *LbcAdapterMock_RegisterPegIn_Call { + return &LbcAdapterMock_RegisterPegIn_Call{Call: _e.mock.On("RegisterPegIn", opts, quote, signature, btcRawTransaction, partialMerkleTree, height)} +} + +func (_c *LbcAdapterMock_RegisterPegIn_Call) Run(run func(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int)) *LbcAdapterMock_RegisterPegIn_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(bindings.QuotesPeginQuote), args[2].([]byte), args[3].([]byte), args[4].([]byte), args[5].(*big.Int)) + }) + return _c +} + +func (_c *LbcAdapterMock_RegisterPegIn_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_RegisterPegIn_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_RegisterPegIn_Call) RunAndReturn(run func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) (*types.Transaction, error)) *LbcAdapterMock_RegisterPegIn_Call { + _c.Call.Return(run) + return _c +} + +// Resign provides a mock function with given fields: opts +func (_m *LbcAdapterMock) Resign(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for Resign") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_Resign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Resign' +type LbcAdapterMock_Resign_Call struct { + *mock.Call +} + +// Resign is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcAdapterMock_Expecter) Resign(opts interface{}) *LbcAdapterMock_Resign_Call { + return &LbcAdapterMock_Resign_Call{Call: _e.mock.On("Resign", opts)} +} + +func (_c *LbcAdapterMock_Resign_Call) Run(run func(opts *bind.TransactOpts)) *LbcAdapterMock_Resign_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_Resign_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_Resign_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_Resign_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcAdapterMock_Resign_Call { + _c.Call.Return(run) + return _c +} + +// SetProviderStatus provides a mock function with given fields: opts, _providerId, status +func (_m *LbcAdapterMock) SetProviderStatus(opts *bind.TransactOpts, _providerId *big.Int, status bool) (*types.Transaction, error) { + ret := _m.Called(opts, _providerId, status) + + if len(ret) == 0 { + panic("no return value specified for SetProviderStatus") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, *big.Int, bool) (*types.Transaction, error)); ok { + return rf(opts, _providerId, status) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, *big.Int, bool) *types.Transaction); ok { + r0 = rf(opts, _providerId, status) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, *big.Int, bool) error); ok { + r1 = rf(opts, _providerId, status) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_SetProviderStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetProviderStatus' +type LbcAdapterMock_SetProviderStatus_Call struct { + *mock.Call +} + +// SetProviderStatus is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - _providerId *big.Int +// - status bool +func (_e *LbcAdapterMock_Expecter) SetProviderStatus(opts interface{}, _providerId interface{}, status interface{}) *LbcAdapterMock_SetProviderStatus_Call { + return &LbcAdapterMock_SetProviderStatus_Call{Call: _e.mock.On("SetProviderStatus", opts, _providerId, status)} +} + +func (_c *LbcAdapterMock_SetProviderStatus_Call) Run(run func(opts *bind.TransactOpts, _providerId *big.Int, status bool)) *LbcAdapterMock_SetProviderStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(*big.Int), args[2].(bool)) + }) + return _c +} + +func (_c *LbcAdapterMock_SetProviderStatus_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_SetProviderStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_SetProviderStatus_Call) RunAndReturn(run func(*bind.TransactOpts, *big.Int, bool) (*types.Transaction, error)) *LbcAdapterMock_SetProviderStatus_Call { + _c.Call.Return(run) + return _c +} + +// WithdrawCollateral provides a mock function with given fields: opts +func (_m *LbcAdapterMock) WithdrawCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for WithdrawCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_WithdrawCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WithdrawCollateral' +type LbcAdapterMock_WithdrawCollateral_Call struct { + *mock.Call +} + +// WithdrawCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcAdapterMock_Expecter) WithdrawCollateral(opts interface{}) *LbcAdapterMock_WithdrawCollateral_Call { + return &LbcAdapterMock_WithdrawCollateral_Call{Call: _e.mock.On("WithdrawCollateral", opts)} +} + +func (_c *LbcAdapterMock_WithdrawCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcAdapterMock_WithdrawCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_WithdrawCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_WithdrawCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_WithdrawCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcAdapterMock_WithdrawCollateral_Call { + _c.Call.Return(run) + return _c +} + +// WithdrawPegoutCollateral provides a mock function with given fields: opts +func (_m *LbcAdapterMock) WithdrawPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for WithdrawPegoutCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcAdapterMock_WithdrawPegoutCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WithdrawPegoutCollateral' +type LbcAdapterMock_WithdrawPegoutCollateral_Call struct { + *mock.Call +} + +// WithdrawPegoutCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcAdapterMock_Expecter) WithdrawPegoutCollateral(opts interface{}) *LbcAdapterMock_WithdrawPegoutCollateral_Call { + return &LbcAdapterMock_WithdrawPegoutCollateral_Call{Call: _e.mock.On("WithdrawPegoutCollateral", opts)} +} + +func (_c *LbcAdapterMock_WithdrawPegoutCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcAdapterMock_WithdrawPegoutCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcAdapterMock_WithdrawPegoutCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcAdapterMock_WithdrawPegoutCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcAdapterMock_WithdrawPegoutCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcAdapterMock_WithdrawPegoutCollateral_Call { + _c.Call.Return(run) + return _c +} + +// NewLbcAdapterMock creates a new instance of LbcAdapterMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLbcAdapterMock(t interface { + mock.TestingT + Cleanup(func()) +}) *LbcAdapterMock { + mock := &LbcAdapterMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/lbc_binding_mock.go b/test/mocks/lbc_binding_mock.go new file mode 100644 index 00000000..48b5f398 --- /dev/null +++ b/test/mocks/lbc_binding_mock.go @@ -0,0 +1,1457 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + bindings "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// LbcBindingMock is an autogenerated mock type for the LbcBinding type +type LbcBindingMock struct { + mock.Mock +} + +type LbcBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *LbcBindingMock) EXPECT() *LbcBindingMock_Expecter { + return &LbcBindingMock_Expecter{mock: &_m.Mock} +} + +// AddCollateral provides a mock function with given fields: opts +func (_m *LbcBindingMock) AddCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for AddCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_AddCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddCollateral' +type LbcBindingMock_AddCollateral_Call struct { + *mock.Call +} + +// AddCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcBindingMock_Expecter) AddCollateral(opts interface{}) *LbcBindingMock_AddCollateral_Call { + return &LbcBindingMock_AddCollateral_Call{Call: _e.mock.On("AddCollateral", opts)} +} + +func (_c *LbcBindingMock_AddCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcBindingMock_AddCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_AddCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_AddCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_AddCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcBindingMock_AddCollateral_Call { + _c.Call.Return(run) + return _c +} + +// AddPegoutCollateral provides a mock function with given fields: opts +func (_m *LbcBindingMock) AddPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for AddPegoutCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_AddPegoutCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPegoutCollateral' +type LbcBindingMock_AddPegoutCollateral_Call struct { + *mock.Call +} + +// AddPegoutCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcBindingMock_Expecter) AddPegoutCollateral(opts interface{}) *LbcBindingMock_AddPegoutCollateral_Call { + return &LbcBindingMock_AddPegoutCollateral_Call{Call: _e.mock.On("AddPegoutCollateral", opts)} +} + +func (_c *LbcBindingMock_AddPegoutCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcBindingMock_AddPegoutCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_AddPegoutCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_AddPegoutCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_AddPegoutCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcBindingMock_AddPegoutCollateral_Call { + _c.Call.Return(run) + return _c +} + +// CallForUser provides a mock function with given fields: opts, quote +func (_m *LbcBindingMock) CallForUser(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote) (*types.Transaction, error) { + ret := _m.Called(opts, quote) + + if len(ret) == 0 { + panic("no return value specified for CallForUser") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote) (*types.Transaction, error)); ok { + return rf(opts, quote) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote) *types.Transaction); ok { + r0 = rf(opts, quote) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, bindings.QuotesPeginQuote) error); ok { + r1 = rf(opts, quote) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_CallForUser_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CallForUser' +type LbcBindingMock_CallForUser_Call struct { + *mock.Call +} + +// CallForUser is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - quote bindings.QuotesPeginQuote +func (_e *LbcBindingMock_Expecter) CallForUser(opts interface{}, quote interface{}) *LbcBindingMock_CallForUser_Call { + return &LbcBindingMock_CallForUser_Call{Call: _e.mock.On("CallForUser", opts, quote)} +} + +func (_c *LbcBindingMock_CallForUser_Call) Run(run func(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote)) *LbcBindingMock_CallForUser_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(bindings.QuotesPeginQuote)) + }) + return _c +} + +func (_c *LbcBindingMock_CallForUser_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_CallForUser_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_CallForUser_Call) RunAndReturn(run func(*bind.TransactOpts, bindings.QuotesPeginQuote) (*types.Transaction, error)) *LbcBindingMock_CallForUser_Call { + _c.Call.Return(run) + return _c +} + +// FilterPegOutDeposit provides a mock function with given fields: opts, quoteHash, sender +func (_m *LbcBindingMock) FilterPegOutDeposit(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error) { + ret := _m.Called(opts, quoteHash, sender) + + if len(ret) == 0 { + panic("no return value specified for FilterPegOutDeposit") + } + + var r0 *bindings.LiquidityBridgeContractPegOutDepositIterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error)); ok { + return rf(opts, quoteHash, sender) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address) *bindings.LiquidityBridgeContractPegOutDepositIterator); ok { + r0 = rf(opts, quoteHash, sender) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bindings.LiquidityBridgeContractPegOutDepositIterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address) error); ok { + r1 = rf(opts, quoteHash, sender) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_FilterPegOutDeposit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPegOutDeposit' +type LbcBindingMock_FilterPegOutDeposit_Call struct { + *mock.Call +} + +// FilterPegOutDeposit is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - quoteHash [][32]byte +// - sender []common.Address +func (_e *LbcBindingMock_Expecter) FilterPegOutDeposit(opts interface{}, quoteHash interface{}, sender interface{}) *LbcBindingMock_FilterPegOutDeposit_Call { + return &LbcBindingMock_FilterPegOutDeposit_Call{Call: _e.mock.On("FilterPegOutDeposit", opts, quoteHash, sender)} +} + +func (_c *LbcBindingMock_FilterPegOutDeposit_Call) Run(run func(opts *bind.FilterOpts, quoteHash [][32]byte, sender []common.Address)) *LbcBindingMock_FilterPegOutDeposit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address)) + }) + return _c +} + +func (_c *LbcBindingMock_FilterPegOutDeposit_Call) Return(_a0 *bindings.LiquidityBridgeContractPegOutDepositIterator, _a1 error) *LbcBindingMock_FilterPegOutDeposit_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_FilterPegOutDeposit_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address) (*bindings.LiquidityBridgeContractPegOutDepositIterator, error)) *LbcBindingMock_FilterPegOutDeposit_Call { + _c.Call.Return(run) + return _c +} + +// FilterPenalized provides a mock function with given fields: opts +func (_m *LbcBindingMock) FilterPenalized(opts *bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FilterPenalized") + } + + var r0 *bindings.LiquidityBridgeContractPenalizedIterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *bindings.LiquidityBridgeContractPenalizedIterator); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bindings.LiquidityBridgeContractPenalizedIterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_FilterPenalized_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPenalized' +type LbcBindingMock_FilterPenalized_Call struct { + *mock.Call +} + +// FilterPenalized is a helper method to define mock.On call +// - opts *bind.FilterOpts +func (_e *LbcBindingMock_Expecter) FilterPenalized(opts interface{}) *LbcBindingMock_FilterPenalized_Call { + return &LbcBindingMock_FilterPenalized_Call{Call: _e.mock.On("FilterPenalized", opts)} +} + +func (_c *LbcBindingMock_FilterPenalized_Call) Run(run func(opts *bind.FilterOpts)) *LbcBindingMock_FilterPenalized_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_FilterPenalized_Call) Return(_a0 *bindings.LiquidityBridgeContractPenalizedIterator, _a1 error) *LbcBindingMock_FilterPenalized_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_FilterPenalized_Call) RunAndReturn(run func(*bind.FilterOpts) (*bindings.LiquidityBridgeContractPenalizedIterator, error)) *LbcBindingMock_FilterPenalized_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: opts, addr +func (_m *LbcBindingMock) GetBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for GetBalance") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { + r0 = rf(opts, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type LbcBindingMock_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcBindingMock_Expecter) GetBalance(opts interface{}, addr interface{}) *LbcBindingMock_GetBalance_Call { + return &LbcBindingMock_GetBalance_Call{Call: _e.mock.On("GetBalance", opts, addr)} +} + +func (_c *LbcBindingMock_GetBalance_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcBindingMock_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcBindingMock_GetBalance_Call) Return(_a0 *big.Int, _a1 error) *LbcBindingMock_GetBalance_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_GetBalance_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *LbcBindingMock_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetCollateral provides a mock function with given fields: opts, addr +func (_m *LbcBindingMock) GetCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for GetCollateral") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { + r0 = rf(opts, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_GetCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCollateral' +type LbcBindingMock_GetCollateral_Call struct { + *mock.Call +} + +// GetCollateral is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcBindingMock_Expecter) GetCollateral(opts interface{}, addr interface{}) *LbcBindingMock_GetCollateral_Call { + return &LbcBindingMock_GetCollateral_Call{Call: _e.mock.On("GetCollateral", opts, addr)} +} + +func (_c *LbcBindingMock_GetCollateral_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcBindingMock_GetCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcBindingMock_GetCollateral_Call) Return(_a0 *big.Int, _a1 error) *LbcBindingMock_GetCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_GetCollateral_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *LbcBindingMock_GetCollateral_Call { + _c.Call.Return(run) + return _c +} + +// GetMinCollateral provides a mock function with given fields: opts +func (_m *LbcBindingMock) GetMinCollateral(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetMinCollateral") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_GetMinCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMinCollateral' +type LbcBindingMock_GetMinCollateral_Call struct { + *mock.Call +} + +// GetMinCollateral is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *LbcBindingMock_Expecter) GetMinCollateral(opts interface{}) *LbcBindingMock_GetMinCollateral_Call { + return &LbcBindingMock_GetMinCollateral_Call{Call: _e.mock.On("GetMinCollateral", opts)} +} + +func (_c *LbcBindingMock_GetMinCollateral_Call) Run(run func(opts *bind.CallOpts)) *LbcBindingMock_GetMinCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_GetMinCollateral_Call) Return(_a0 *big.Int, _a1 error) *LbcBindingMock_GetMinCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_GetMinCollateral_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *LbcBindingMock_GetMinCollateral_Call { + _c.Call.Return(run) + return _c +} + +// GetPegoutCollateral provides a mock function with given fields: opts, addr +func (_m *LbcBindingMock) GetPegoutCollateral(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for GetPegoutCollateral") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { + r0 = rf(opts, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_GetPegoutCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPegoutCollateral' +type LbcBindingMock_GetPegoutCollateral_Call struct { + *mock.Call +} + +// GetPegoutCollateral is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcBindingMock_Expecter) GetPegoutCollateral(opts interface{}, addr interface{}) *LbcBindingMock_GetPegoutCollateral_Call { + return &LbcBindingMock_GetPegoutCollateral_Call{Call: _e.mock.On("GetPegoutCollateral", opts, addr)} +} + +func (_c *LbcBindingMock_GetPegoutCollateral_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcBindingMock_GetPegoutCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcBindingMock_GetPegoutCollateral_Call) Return(_a0 *big.Int, _a1 error) *LbcBindingMock_GetPegoutCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_GetPegoutCollateral_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *LbcBindingMock_GetPegoutCollateral_Call { + _c.Call.Return(run) + return _c +} + +// GetProviderIds provides a mock function with given fields: opts +func (_m *LbcBindingMock) GetProviderIds(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetProviderIds") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_GetProviderIds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProviderIds' +type LbcBindingMock_GetProviderIds_Call struct { + *mock.Call +} + +// GetProviderIds is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *LbcBindingMock_Expecter) GetProviderIds(opts interface{}) *LbcBindingMock_GetProviderIds_Call { + return &LbcBindingMock_GetProviderIds_Call{Call: _e.mock.On("GetProviderIds", opts)} +} + +func (_c *LbcBindingMock_GetProviderIds_Call) Run(run func(opts *bind.CallOpts)) *LbcBindingMock_GetProviderIds_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_GetProviderIds_Call) Return(_a0 *big.Int, _a1 error) *LbcBindingMock_GetProviderIds_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_GetProviderIds_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *LbcBindingMock_GetProviderIds_Call { + _c.Call.Return(run) + return _c +} + +// GetProviders provides a mock function with given fields: opts, providerIds +func (_m *LbcBindingMock) GetProviders(opts *bind.CallOpts, providerIds []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error) { + ret := _m.Called(opts, providerIds) + + if len(ret) == 0 { + panic("no return value specified for GetProviders") + } + + var r0 []bindings.LiquidityBridgeContractLiquidityProvider + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error)); ok { + return rf(opts, providerIds) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, []*big.Int) []bindings.LiquidityBridgeContractLiquidityProvider); ok { + r0 = rf(opts, providerIds) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]bindings.LiquidityBridgeContractLiquidityProvider) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, []*big.Int) error); ok { + r1 = rf(opts, providerIds) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_GetProviders_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProviders' +type LbcBindingMock_GetProviders_Call struct { + *mock.Call +} + +// GetProviders is a helper method to define mock.On call +// - opts *bind.CallOpts +// - providerIds []*big.Int +func (_e *LbcBindingMock_Expecter) GetProviders(opts interface{}, providerIds interface{}) *LbcBindingMock_GetProviders_Call { + return &LbcBindingMock_GetProviders_Call{Call: _e.mock.On("GetProviders", opts, providerIds)} +} + +func (_c *LbcBindingMock_GetProviders_Call) Run(run func(opts *bind.CallOpts, providerIds []*big.Int)) *LbcBindingMock_GetProviders_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].([]*big.Int)) + }) + return _c +} + +func (_c *LbcBindingMock_GetProviders_Call) Return(_a0 []bindings.LiquidityBridgeContractLiquidityProvider, _a1 error) *LbcBindingMock_GetProviders_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_GetProviders_Call) RunAndReturn(run func(*bind.CallOpts, []*big.Int) ([]bindings.LiquidityBridgeContractLiquidityProvider, error)) *LbcBindingMock_GetProviders_Call { + _c.Call.Return(run) + return _c +} + +// HashPegoutQuote provides a mock function with given fields: opts, quote +func (_m *LbcBindingMock) HashPegoutQuote(opts *bind.CallOpts, quote bindings.QuotesPegOutQuote) ([32]byte, error) { + ret := _m.Called(opts, quote) + + if len(ret) == 0 { + panic("no return value specified for HashPegoutQuote") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPegOutQuote) ([32]byte, error)); ok { + return rf(opts, quote) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPegOutQuote) [32]byte); ok { + r0 = rf(opts, quote) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, bindings.QuotesPegOutQuote) error); ok { + r1 = rf(opts, quote) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_HashPegoutQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HashPegoutQuote' +type LbcBindingMock_HashPegoutQuote_Call struct { + *mock.Call +} + +// HashPegoutQuote is a helper method to define mock.On call +// - opts *bind.CallOpts +// - quote bindings.QuotesPegOutQuote +func (_e *LbcBindingMock_Expecter) HashPegoutQuote(opts interface{}, quote interface{}) *LbcBindingMock_HashPegoutQuote_Call { + return &LbcBindingMock_HashPegoutQuote_Call{Call: _e.mock.On("HashPegoutQuote", opts, quote)} +} + +func (_c *LbcBindingMock_HashPegoutQuote_Call) Run(run func(opts *bind.CallOpts, quote bindings.QuotesPegOutQuote)) *LbcBindingMock_HashPegoutQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(bindings.QuotesPegOutQuote)) + }) + return _c +} + +func (_c *LbcBindingMock_HashPegoutQuote_Call) Return(_a0 [32]byte, _a1 error) *LbcBindingMock_HashPegoutQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_HashPegoutQuote_Call) RunAndReturn(run func(*bind.CallOpts, bindings.QuotesPegOutQuote) ([32]byte, error)) *LbcBindingMock_HashPegoutQuote_Call { + _c.Call.Return(run) + return _c +} + +// HashQuote provides a mock function with given fields: opts, quote +func (_m *LbcBindingMock) HashQuote(opts *bind.CallOpts, quote bindings.QuotesPeginQuote) ([32]byte, error) { + ret := _m.Called(opts, quote) + + if len(ret) == 0 { + panic("no return value specified for HashQuote") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPeginQuote) ([32]byte, error)); ok { + return rf(opts, quote) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, bindings.QuotesPeginQuote) [32]byte); ok { + r0 = rf(opts, quote) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, bindings.QuotesPeginQuote) error); ok { + r1 = rf(opts, quote) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_HashQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HashQuote' +type LbcBindingMock_HashQuote_Call struct { + *mock.Call +} + +// HashQuote is a helper method to define mock.On call +// - opts *bind.CallOpts +// - quote bindings.QuotesPeginQuote +func (_e *LbcBindingMock_Expecter) HashQuote(opts interface{}, quote interface{}) *LbcBindingMock_HashQuote_Call { + return &LbcBindingMock_HashQuote_Call{Call: _e.mock.On("HashQuote", opts, quote)} +} + +func (_c *LbcBindingMock_HashQuote_Call) Run(run func(opts *bind.CallOpts, quote bindings.QuotesPeginQuote)) *LbcBindingMock_HashQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(bindings.QuotesPeginQuote)) + }) + return _c +} + +func (_c *LbcBindingMock_HashQuote_Call) Return(_a0 [32]byte, _a1 error) *LbcBindingMock_HashQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_HashQuote_Call) RunAndReturn(run func(*bind.CallOpts, bindings.QuotesPeginQuote) ([32]byte, error)) *LbcBindingMock_HashQuote_Call { + _c.Call.Return(run) + return _c +} + +// IsOperational provides a mock function with given fields: opts, addr +func (_m *LbcBindingMock) IsOperational(opts *bind.CallOpts, addr common.Address) (bool, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for IsOperational") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (bool, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) bool); ok { + r0 = rf(opts, addr) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_IsOperational_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsOperational' +type LbcBindingMock_IsOperational_Call struct { + *mock.Call +} + +// IsOperational is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcBindingMock_Expecter) IsOperational(opts interface{}, addr interface{}) *LbcBindingMock_IsOperational_Call { + return &LbcBindingMock_IsOperational_Call{Call: _e.mock.On("IsOperational", opts, addr)} +} + +func (_c *LbcBindingMock_IsOperational_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcBindingMock_IsOperational_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcBindingMock_IsOperational_Call) Return(_a0 bool, _a1 error) *LbcBindingMock_IsOperational_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_IsOperational_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (bool, error)) *LbcBindingMock_IsOperational_Call { + _c.Call.Return(run) + return _c +} + +// IsOperationalForPegout provides a mock function with given fields: opts, addr +func (_m *LbcBindingMock) IsOperationalForPegout(opts *bind.CallOpts, addr common.Address) (bool, error) { + ret := _m.Called(opts, addr) + + if len(ret) == 0 { + panic("no return value specified for IsOperationalForPegout") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (bool, error)); ok { + return rf(opts, addr) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) bool); ok { + r0 = rf(opts, addr) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { + r1 = rf(opts, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_IsOperationalForPegout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsOperationalForPegout' +type LbcBindingMock_IsOperationalForPegout_Call struct { + *mock.Call +} + +// IsOperationalForPegout is a helper method to define mock.On call +// - opts *bind.CallOpts +// - addr common.Address +func (_e *LbcBindingMock_Expecter) IsOperationalForPegout(opts interface{}, addr interface{}) *LbcBindingMock_IsOperationalForPegout_Call { + return &LbcBindingMock_IsOperationalForPegout_Call{Call: _e.mock.On("IsOperationalForPegout", opts, addr)} +} + +func (_c *LbcBindingMock_IsOperationalForPegout_Call) Run(run func(opts *bind.CallOpts, addr common.Address)) *LbcBindingMock_IsOperationalForPegout_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *LbcBindingMock_IsOperationalForPegout_Call) Return(_a0 bool, _a1 error) *LbcBindingMock_IsOperationalForPegout_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_IsOperationalForPegout_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (bool, error)) *LbcBindingMock_IsOperationalForPegout_Call { + _c.Call.Return(run) + return _c +} + +// ParseRegister provides a mock function with given fields: log +func (_m *LbcBindingMock) ParseRegister(log types.Log) (*bindings.LiquidityBridgeContractRegister, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseRegister") + } + + var r0 *bindings.LiquidityBridgeContractRegister + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*bindings.LiquidityBridgeContractRegister, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *bindings.LiquidityBridgeContractRegister); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bindings.LiquidityBridgeContractRegister) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_ParseRegister_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseRegister' +type LbcBindingMock_ParseRegister_Call struct { + *mock.Call +} + +// ParseRegister is a helper method to define mock.On call +// - log types.Log +func (_e *LbcBindingMock_Expecter) ParseRegister(log interface{}) *LbcBindingMock_ParseRegister_Call { + return &LbcBindingMock_ParseRegister_Call{Call: _e.mock.On("ParseRegister", log)} +} + +func (_c *LbcBindingMock_ParseRegister_Call) Run(run func(log types.Log)) *LbcBindingMock_ParseRegister_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *LbcBindingMock_ParseRegister_Call) Return(_a0 *bindings.LiquidityBridgeContractRegister, _a1 error) *LbcBindingMock_ParseRegister_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_ParseRegister_Call) RunAndReturn(run func(types.Log) (*bindings.LiquidityBridgeContractRegister, error)) *LbcBindingMock_ParseRegister_Call { + _c.Call.Return(run) + return _c +} + +// ProductFeePercentage provides a mock function with given fields: opts +func (_m *LbcBindingMock) ProductFeePercentage(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for ProductFeePercentage") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_ProductFeePercentage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProductFeePercentage' +type LbcBindingMock_ProductFeePercentage_Call struct { + *mock.Call +} + +// ProductFeePercentage is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *LbcBindingMock_Expecter) ProductFeePercentage(opts interface{}) *LbcBindingMock_ProductFeePercentage_Call { + return &LbcBindingMock_ProductFeePercentage_Call{Call: _e.mock.On("ProductFeePercentage", opts)} +} + +func (_c *LbcBindingMock_ProductFeePercentage_Call) Run(run func(opts *bind.CallOpts)) *LbcBindingMock_ProductFeePercentage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_ProductFeePercentage_Call) Return(_a0 *big.Int, _a1 error) *LbcBindingMock_ProductFeePercentage_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_ProductFeePercentage_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *LbcBindingMock_ProductFeePercentage_Call { + _c.Call.Return(run) + return _c +} + +// RefundPegOut provides a mock function with given fields: opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes +func (_m *LbcBindingMock) RefundPegOut(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte) (*types.Transaction, error) { + ret := _m.Called(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + + if len(ret) == 0 { + panic("no return value specified for RefundPegOut") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) (*types.Transaction, error)); ok { + return rf(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) *types.Transaction); ok { + r0 = rf(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) error); ok { + r1 = rf(opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_RefundPegOut_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RefundPegOut' +type LbcBindingMock_RefundPegOut_Call struct { + *mock.Call +} + +// RefundPegOut is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - quoteHash [32]byte +// - btcTx []byte +// - btcBlockHeaderHash [32]byte +// - partialMerkleTree *big.Int +// - merkleBranchHashes [][32]byte +func (_e *LbcBindingMock_Expecter) RefundPegOut(opts interface{}, quoteHash interface{}, btcTx interface{}, btcBlockHeaderHash interface{}, partialMerkleTree interface{}, merkleBranchHashes interface{}) *LbcBindingMock_RefundPegOut_Call { + return &LbcBindingMock_RefundPegOut_Call{Call: _e.mock.On("RefundPegOut", opts, quoteHash, btcTx, btcBlockHeaderHash, partialMerkleTree, merkleBranchHashes)} +} + +func (_c *LbcBindingMock_RefundPegOut_Call) Run(run func(opts *bind.TransactOpts, quoteHash [32]byte, btcTx []byte, btcBlockHeaderHash [32]byte, partialMerkleTree *big.Int, merkleBranchHashes [][32]byte)) *LbcBindingMock_RefundPegOut_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([32]byte), args[2].([]byte), args[3].([32]byte), args[4].(*big.Int), args[5].([][32]byte)) + }) + return _c +} + +func (_c *LbcBindingMock_RefundPegOut_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_RefundPegOut_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_RefundPegOut_Call) RunAndReturn(run func(*bind.TransactOpts, [32]byte, []byte, [32]byte, *big.Int, [][32]byte) (*types.Transaction, error)) *LbcBindingMock_RefundPegOut_Call { + _c.Call.Return(run) + return _c +} + +// Register provides a mock function with given fields: opts, _name, _apiBaseUrl, _status, _providerType +func (_m *LbcBindingMock) Register(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string) (*types.Transaction, error) { + ret := _m.Called(opts, _name, _apiBaseUrl, _status, _providerType) + + if len(ret) == 0 { + panic("no return value specified for Register") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string, string, bool, string) (*types.Transaction, error)); ok { + return rf(opts, _name, _apiBaseUrl, _status, _providerType) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string, string, bool, string) *types.Transaction); ok { + r0 = rf(opts, _name, _apiBaseUrl, _status, _providerType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, string, string, bool, string) error); ok { + r1 = rf(opts, _name, _apiBaseUrl, _status, _providerType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_Register_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Register' +type LbcBindingMock_Register_Call struct { + *mock.Call +} + +// Register is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - _name string +// - _apiBaseUrl string +// - _status bool +// - _providerType string +func (_e *LbcBindingMock_Expecter) Register(opts interface{}, _name interface{}, _apiBaseUrl interface{}, _status interface{}, _providerType interface{}) *LbcBindingMock_Register_Call { + return &LbcBindingMock_Register_Call{Call: _e.mock.On("Register", opts, _name, _apiBaseUrl, _status, _providerType)} +} + +func (_c *LbcBindingMock_Register_Call) Run(run func(opts *bind.TransactOpts, _name string, _apiBaseUrl string, _status bool, _providerType string)) *LbcBindingMock_Register_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(string), args[2].(string), args[3].(bool), args[4].(string)) + }) + return _c +} + +func (_c *LbcBindingMock_Register_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_Register_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_Register_Call) RunAndReturn(run func(*bind.TransactOpts, string, string, bool, string) (*types.Transaction, error)) *LbcBindingMock_Register_Call { + _c.Call.Return(run) + return _c +} + +// RegisterPegIn provides a mock function with given fields: opts, quote, signature, btcRawTransaction, partialMerkleTree, height +func (_m *LbcBindingMock) RegisterPegIn(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int) (*types.Transaction, error) { + ret := _m.Called(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + + if len(ret) == 0 { + panic("no return value specified for RegisterPegIn") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) (*types.Transaction, error)); ok { + return rf(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) *types.Transaction); ok { + r0 = rf(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) error); ok { + r1 = rf(opts, quote, signature, btcRawTransaction, partialMerkleTree, height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_RegisterPegIn_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegisterPegIn' +type LbcBindingMock_RegisterPegIn_Call struct { + *mock.Call +} + +// RegisterPegIn is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - quote bindings.QuotesPeginQuote +// - signature []byte +// - btcRawTransaction []byte +// - partialMerkleTree []byte +// - height *big.Int +func (_e *LbcBindingMock_Expecter) RegisterPegIn(opts interface{}, quote interface{}, signature interface{}, btcRawTransaction interface{}, partialMerkleTree interface{}, height interface{}) *LbcBindingMock_RegisterPegIn_Call { + return &LbcBindingMock_RegisterPegIn_Call{Call: _e.mock.On("RegisterPegIn", opts, quote, signature, btcRawTransaction, partialMerkleTree, height)} +} + +func (_c *LbcBindingMock_RegisterPegIn_Call) Run(run func(opts *bind.TransactOpts, quote bindings.QuotesPeginQuote, signature []byte, btcRawTransaction []byte, partialMerkleTree []byte, height *big.Int)) *LbcBindingMock_RegisterPegIn_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(bindings.QuotesPeginQuote), args[2].([]byte), args[3].([]byte), args[4].([]byte), args[5].(*big.Int)) + }) + return _c +} + +func (_c *LbcBindingMock_RegisterPegIn_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_RegisterPegIn_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_RegisterPegIn_Call) RunAndReturn(run func(*bind.TransactOpts, bindings.QuotesPeginQuote, []byte, []byte, []byte, *big.Int) (*types.Transaction, error)) *LbcBindingMock_RegisterPegIn_Call { + _c.Call.Return(run) + return _c +} + +// Resign provides a mock function with given fields: opts +func (_m *LbcBindingMock) Resign(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for Resign") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_Resign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Resign' +type LbcBindingMock_Resign_Call struct { + *mock.Call +} + +// Resign is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcBindingMock_Expecter) Resign(opts interface{}) *LbcBindingMock_Resign_Call { + return &LbcBindingMock_Resign_Call{Call: _e.mock.On("Resign", opts)} +} + +func (_c *LbcBindingMock_Resign_Call) Run(run func(opts *bind.TransactOpts)) *LbcBindingMock_Resign_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_Resign_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_Resign_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_Resign_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcBindingMock_Resign_Call { + _c.Call.Return(run) + return _c +} + +// SetProviderStatus provides a mock function with given fields: opts, _providerId, status +func (_m *LbcBindingMock) SetProviderStatus(opts *bind.TransactOpts, _providerId *big.Int, status bool) (*types.Transaction, error) { + ret := _m.Called(opts, _providerId, status) + + if len(ret) == 0 { + panic("no return value specified for SetProviderStatus") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, *big.Int, bool) (*types.Transaction, error)); ok { + return rf(opts, _providerId, status) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, *big.Int, bool) *types.Transaction); ok { + r0 = rf(opts, _providerId, status) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, *big.Int, bool) error); ok { + r1 = rf(opts, _providerId, status) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_SetProviderStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetProviderStatus' +type LbcBindingMock_SetProviderStatus_Call struct { + *mock.Call +} + +// SetProviderStatus is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - _providerId *big.Int +// - status bool +func (_e *LbcBindingMock_Expecter) SetProviderStatus(opts interface{}, _providerId interface{}, status interface{}) *LbcBindingMock_SetProviderStatus_Call { + return &LbcBindingMock_SetProviderStatus_Call{Call: _e.mock.On("SetProviderStatus", opts, _providerId, status)} +} + +func (_c *LbcBindingMock_SetProviderStatus_Call) Run(run func(opts *bind.TransactOpts, _providerId *big.Int, status bool)) *LbcBindingMock_SetProviderStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(*big.Int), args[2].(bool)) + }) + return _c +} + +func (_c *LbcBindingMock_SetProviderStatus_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_SetProviderStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_SetProviderStatus_Call) RunAndReturn(run func(*bind.TransactOpts, *big.Int, bool) (*types.Transaction, error)) *LbcBindingMock_SetProviderStatus_Call { + _c.Call.Return(run) + return _c +} + +// WithdrawCollateral provides a mock function with given fields: opts +func (_m *LbcBindingMock) WithdrawCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for WithdrawCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_WithdrawCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WithdrawCollateral' +type LbcBindingMock_WithdrawCollateral_Call struct { + *mock.Call +} + +// WithdrawCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcBindingMock_Expecter) WithdrawCollateral(opts interface{}) *LbcBindingMock_WithdrawCollateral_Call { + return &LbcBindingMock_WithdrawCollateral_Call{Call: _e.mock.On("WithdrawCollateral", opts)} +} + +func (_c *LbcBindingMock_WithdrawCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcBindingMock_WithdrawCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_WithdrawCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_WithdrawCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_WithdrawCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcBindingMock_WithdrawCollateral_Call { + _c.Call.Return(run) + return _c +} + +// WithdrawPegoutCollateral provides a mock function with given fields: opts +func (_m *LbcBindingMock) WithdrawPegoutCollateral(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for WithdrawPegoutCollateral") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LbcBindingMock_WithdrawPegoutCollateral_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WithdrawPegoutCollateral' +type LbcBindingMock_WithdrawPegoutCollateral_Call struct { + *mock.Call +} + +// WithdrawPegoutCollateral is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *LbcBindingMock_Expecter) WithdrawPegoutCollateral(opts interface{}) *LbcBindingMock_WithdrawPegoutCollateral_Call { + return &LbcBindingMock_WithdrawPegoutCollateral_Call{Call: _e.mock.On("WithdrawPegoutCollateral", opts)} +} + +func (_c *LbcBindingMock_WithdrawPegoutCollateral_Call) Run(run func(opts *bind.TransactOpts)) *LbcBindingMock_WithdrawPegoutCollateral_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *LbcBindingMock_WithdrawPegoutCollateral_Call) Return(_a0 *types.Transaction, _a1 error) *LbcBindingMock_WithdrawPegoutCollateral_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LbcBindingMock_WithdrawPegoutCollateral_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *LbcBindingMock_WithdrawPegoutCollateral_Call { + _c.Call.Return(run) + return _c +} + +// NewLbcBindingMock creates a new instance of LbcBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLbcBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *LbcBindingMock { + mock := &LbcBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/lbc_caller_binding_mock.go b/test/mocks/lbc_caller_binding_mock.go new file mode 100644 index 00000000..0b4cfdf5 --- /dev/null +++ b/test/mocks/lbc_caller_binding_mock.go @@ -0,0 +1,94 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + mock "github.com/stretchr/testify/mock" +) + +// LbcCallerBindingMock is an autogenerated mock type for the LbcCallerBinding type +type LbcCallerBindingMock struct { + mock.Mock +} + +type LbcCallerBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *LbcCallerBindingMock) EXPECT() *LbcCallerBindingMock_Expecter { + return &LbcCallerBindingMock_Expecter{mock: &_m.Mock} +} + +// Call provides a mock function with given fields: opts, result, method, params +func (_m *LbcCallerBindingMock) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + var _ca []interface{} + _ca = append(_ca, opts, result, method) + _ca = append(_ca, params...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Call") + } + + var r0 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, *[]interface{}, string, ...interface{}) error); ok { + r0 = rf(opts, result, method, params...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// LbcCallerBindingMock_Call_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Call' +type LbcCallerBindingMock_Call_Call struct { + *mock.Call +} + +// Call is a helper method to define mock.On call +// - opts *bind.CallOpts +// - result *[]interface{} +// - method string +// - params ...interface{} +func (_e *LbcCallerBindingMock_Expecter) Call(opts interface{}, result interface{}, method interface{}, params ...interface{}) *LbcCallerBindingMock_Call_Call { + return &LbcCallerBindingMock_Call_Call{Call: _e.mock.On("Call", + append([]interface{}{opts, result, method}, params...)...)} +} + +func (_c *LbcCallerBindingMock_Call_Call) Run(run func(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{})) *LbcCallerBindingMock_Call_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-3) + for i, a := range args[3:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(*bind.CallOpts), args[1].(*[]interface{}), args[2].(string), variadicArgs...) + }) + return _c +} + +func (_c *LbcCallerBindingMock_Call_Call) Return(_a0 error) *LbcCallerBindingMock_Call_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *LbcCallerBindingMock_Call_Call) RunAndReturn(run func(*bind.CallOpts, *[]interface{}, string, ...interface{}) error) *LbcCallerBindingMock_Call_Call { + _c.Call.Return(run) + return _c +} + +// NewLbcCallerBindingMock creates a new instance of LbcCallerBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLbcCallerBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *LbcCallerBindingMock { + mock := &LbcCallerBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/rpc_client_binding_mock.go b/test/mocks/rpc_client_binding_mock.go new file mode 100644 index 00000000..ac657cc9 --- /dev/null +++ b/test/mocks/rpc_client_binding_mock.go @@ -0,0 +1,711 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethereum "github.com/ethereum/go-ethereum" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// RpcClientBindingMock is an autogenerated mock type for the RpcClientBinding type +type RpcClientBindingMock struct { + mock.Mock +} + +type RpcClientBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *RpcClientBindingMock) EXPECT() *RpcClientBindingMock_Expecter { + return &RpcClientBindingMock_Expecter{mock: &_m.Mock} +} + +// BalanceAt provides a mock function with given fields: ctx, account, blockNumber +func (_m *RpcClientBindingMock) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { + ret := _m.Called(ctx, account, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for BalanceAt") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) (*big.Int, error)); ok { + return rf(ctx, account, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) *big.Int); ok { + r0 = rf(ctx, account, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, account, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_BalanceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BalanceAt' +type RpcClientBindingMock_BalanceAt_Call struct { + *mock.Call +} + +// BalanceAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +// - blockNumber *big.Int +func (_e *RpcClientBindingMock_Expecter) BalanceAt(ctx interface{}, account interface{}, blockNumber interface{}) *RpcClientBindingMock_BalanceAt_Call { + return &RpcClientBindingMock_BalanceAt_Call{Call: _e.mock.On("BalanceAt", ctx, account, blockNumber)} +} + +func (_c *RpcClientBindingMock_BalanceAt_Call) Run(run func(ctx context.Context, account common.Address, blockNumber *big.Int)) *RpcClientBindingMock_BalanceAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) + }) + return _c +} + +func (_c *RpcClientBindingMock_BalanceAt_Call) Return(_a0 *big.Int, _a1 error) *RpcClientBindingMock_BalanceAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_BalanceAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) (*big.Int, error)) *RpcClientBindingMock_BalanceAt_Call { + _c.Call.Return(run) + return _c +} + +// BlockNumber provides a mock function with given fields: ctx +func (_m *RpcClientBindingMock) BlockNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BlockNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_BlockNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockNumber' +type RpcClientBindingMock_BlockNumber_Call struct { + *mock.Call +} + +// BlockNumber is a helper method to define mock.On call +// - ctx context.Context +func (_e *RpcClientBindingMock_Expecter) BlockNumber(ctx interface{}) *RpcClientBindingMock_BlockNumber_Call { + return &RpcClientBindingMock_BlockNumber_Call{Call: _e.mock.On("BlockNumber", ctx)} +} + +func (_c *RpcClientBindingMock_BlockNumber_Call) Run(run func(ctx context.Context)) *RpcClientBindingMock_BlockNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RpcClientBindingMock_BlockNumber_Call) Return(_a0 uint64, _a1 error) *RpcClientBindingMock_BlockNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_BlockNumber_Call) RunAndReturn(run func(context.Context) (uint64, error)) *RpcClientBindingMock_BlockNumber_Call { + _c.Call.Return(run) + return _c +} + +// ChainID provides a mock function with given fields: ctx +func (_m *RpcClientBindingMock) ChainID(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for ChainID") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_ChainID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChainID' +type RpcClientBindingMock_ChainID_Call struct { + *mock.Call +} + +// ChainID is a helper method to define mock.On call +// - ctx context.Context +func (_e *RpcClientBindingMock_Expecter) ChainID(ctx interface{}) *RpcClientBindingMock_ChainID_Call { + return &RpcClientBindingMock_ChainID_Call{Call: _e.mock.On("ChainID", ctx)} +} + +func (_c *RpcClientBindingMock_ChainID_Call) Run(run func(ctx context.Context)) *RpcClientBindingMock_ChainID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RpcClientBindingMock_ChainID_Call) Return(_a0 *big.Int, _a1 error) *RpcClientBindingMock_ChainID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_ChainID_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *RpcClientBindingMock_ChainID_Call { + _c.Call.Return(run) + return _c +} + +// Close provides a mock function with given fields: +func (_m *RpcClientBindingMock) Close() { + _m.Called() +} + +// RpcClientBindingMock_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' +type RpcClientBindingMock_Close_Call struct { + *mock.Call +} + +// Close is a helper method to define mock.On call +func (_e *RpcClientBindingMock_Expecter) Close() *RpcClientBindingMock_Close_Call { + return &RpcClientBindingMock_Close_Call{Call: _e.mock.On("Close")} +} + +func (_c *RpcClientBindingMock_Close_Call) Run(run func()) *RpcClientBindingMock_Close_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientBindingMock_Close_Call) Return() *RpcClientBindingMock_Close_Call { + _c.Call.Return() + return _c +} + +func (_c *RpcClientBindingMock_Close_Call) RunAndReturn(run func()) *RpcClientBindingMock_Close_Call { + _c.Call.Return(run) + return _c +} + +// CodeAt provides a mock function with given fields: ctx, account, blockNumber +func (_m *RpcClientBindingMock) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, account, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) ([]byte, error)); ok { + return rf(ctx, account, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) []byte); ok { + r0 = rf(ctx, account, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, account, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_CodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CodeAt' +type RpcClientBindingMock_CodeAt_Call struct { + *mock.Call +} + +// CodeAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +// - blockNumber *big.Int +func (_e *RpcClientBindingMock_Expecter) CodeAt(ctx interface{}, account interface{}, blockNumber interface{}) *RpcClientBindingMock_CodeAt_Call { + return &RpcClientBindingMock_CodeAt_Call{Call: _e.mock.On("CodeAt", ctx, account, blockNumber)} +} + +func (_c *RpcClientBindingMock_CodeAt_Call) Run(run func(ctx context.Context, account common.Address, blockNumber *big.Int)) *RpcClientBindingMock_CodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) + }) + return _c +} + +func (_c *RpcClientBindingMock_CodeAt_Call) Return(_a0 []byte, _a1 error) *RpcClientBindingMock_CodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_CodeAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) ([]byte, error)) *RpcClientBindingMock_CodeAt_Call { + _c.Call.Return(run) + return _c +} + +// EstimateGas provides a mock function with given fields: ctx, msg +func (_m *RpcClientBindingMock) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) { + ret := _m.Called(ctx, msg) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) (uint64, error)); ok { + return rf(ctx, msg) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) uint64); ok { + r0 = rf(ctx, msg) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok { + r1 = rf(ctx, msg) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_EstimateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGas' +type RpcClientBindingMock_EstimateGas_Call struct { + *mock.Call +} + +// EstimateGas is a helper method to define mock.On call +// - ctx context.Context +// - msg ethereum.CallMsg +func (_e *RpcClientBindingMock_Expecter) EstimateGas(ctx interface{}, msg interface{}) *RpcClientBindingMock_EstimateGas_Call { + return &RpcClientBindingMock_EstimateGas_Call{Call: _e.mock.On("EstimateGas", ctx, msg)} +} + +func (_c *RpcClientBindingMock_EstimateGas_Call) Run(run func(ctx context.Context, msg ethereum.CallMsg)) *RpcClientBindingMock_EstimateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg)) + }) + return _c +} + +func (_c *RpcClientBindingMock_EstimateGas_Call) Return(_a0 uint64, _a1 error) *RpcClientBindingMock_EstimateGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_EstimateGas_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg) (uint64, error)) *RpcClientBindingMock_EstimateGas_Call { + _c.Call.Return(run) + return _c +} + +// NonceAt provides a mock function with given fields: ctx, account, blockNumber +func (_m *RpcClientBindingMock) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { + ret := _m.Called(ctx, account, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for NonceAt") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) (uint64, error)); ok { + return rf(ctx, account, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) uint64); ok { + r0 = rf(ctx, account, blockNumber) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, account, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_NonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NonceAt' +type RpcClientBindingMock_NonceAt_Call struct { + *mock.Call +} + +// NonceAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +// - blockNumber *big.Int +func (_e *RpcClientBindingMock_Expecter) NonceAt(ctx interface{}, account interface{}, blockNumber interface{}) *RpcClientBindingMock_NonceAt_Call { + return &RpcClientBindingMock_NonceAt_Call{Call: _e.mock.On("NonceAt", ctx, account, blockNumber)} +} + +func (_c *RpcClientBindingMock_NonceAt_Call) Run(run func(ctx context.Context, account common.Address, blockNumber *big.Int)) *RpcClientBindingMock_NonceAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) + }) + return _c +} + +func (_c *RpcClientBindingMock_NonceAt_Call) Return(_a0 uint64, _a1 error) *RpcClientBindingMock_NonceAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_NonceAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) (uint64, error)) *RpcClientBindingMock_NonceAt_Call { + _c.Call.Return(run) + return _c +} + +// PendingNonceAt provides a mock function with given fields: ctx, account +func (_m *RpcClientBindingMock) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingNonceAt") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) (uint64, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) uint64); ok { + r0 = rf(ctx, account) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_PendingNonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingNonceAt' +type RpcClientBindingMock_PendingNonceAt_Call struct { + *mock.Call +} + +// PendingNonceAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *RpcClientBindingMock_Expecter) PendingNonceAt(ctx interface{}, account interface{}) *RpcClientBindingMock_PendingNonceAt_Call { + return &RpcClientBindingMock_PendingNonceAt_Call{Call: _e.mock.On("PendingNonceAt", ctx, account)} +} + +func (_c *RpcClientBindingMock_PendingNonceAt_Call) Run(run func(ctx context.Context, account common.Address)) *RpcClientBindingMock_PendingNonceAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *RpcClientBindingMock_PendingNonceAt_Call) Return(_a0 uint64, _a1 error) *RpcClientBindingMock_PendingNonceAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_PendingNonceAt_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *RpcClientBindingMock_PendingNonceAt_Call { + _c.Call.Return(run) + return _c +} + +// SendTransaction provides a mock function with given fields: ctx, tx +func (_m *RpcClientBindingMock) SendTransaction(ctx context.Context, tx *types.Transaction) error { + ret := _m.Called(ctx, tx) + + if len(ret) == 0 { + panic("no return value specified for SendTransaction") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction) error); ok { + r0 = rf(ctx, tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RpcClientBindingMock_SendTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTransaction' +type RpcClientBindingMock_SendTransaction_Call struct { + *mock.Call +} + +// SendTransaction is a helper method to define mock.On call +// - ctx context.Context +// - tx *types.Transaction +func (_e *RpcClientBindingMock_Expecter) SendTransaction(ctx interface{}, tx interface{}) *RpcClientBindingMock_SendTransaction_Call { + return &RpcClientBindingMock_SendTransaction_Call{Call: _e.mock.On("SendTransaction", ctx, tx)} +} + +func (_c *RpcClientBindingMock_SendTransaction_Call) Run(run func(ctx context.Context, tx *types.Transaction)) *RpcClientBindingMock_SendTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*types.Transaction)) + }) + return _c +} + +func (_c *RpcClientBindingMock_SendTransaction_Call) Return(_a0 error) *RpcClientBindingMock_SendTransaction_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientBindingMock_SendTransaction_Call) RunAndReturn(run func(context.Context, *types.Transaction) error) *RpcClientBindingMock_SendTransaction_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasPrice provides a mock function with given fields: ctx +func (_m *RpcClientBindingMock) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasPrice") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_SuggestGasPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasPrice' +type RpcClientBindingMock_SuggestGasPrice_Call struct { + *mock.Call +} + +// SuggestGasPrice is a helper method to define mock.On call +// - ctx context.Context +func (_e *RpcClientBindingMock_Expecter) SuggestGasPrice(ctx interface{}) *RpcClientBindingMock_SuggestGasPrice_Call { + return &RpcClientBindingMock_SuggestGasPrice_Call{Call: _e.mock.On("SuggestGasPrice", ctx)} +} + +func (_c *RpcClientBindingMock_SuggestGasPrice_Call) Run(run func(ctx context.Context)) *RpcClientBindingMock_SuggestGasPrice_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RpcClientBindingMock_SuggestGasPrice_Call) Return(_a0 *big.Int, _a1 error) *RpcClientBindingMock_SuggestGasPrice_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_SuggestGasPrice_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *RpcClientBindingMock_SuggestGasPrice_Call { + _c.Call.Return(run) + return _c +} + +// TransactionByHash provides a mock function with given fields: ctx, hash +func (_m *RpcClientBindingMock) TransactionByHash(ctx context.Context, hash common.Hash) (*types.Transaction, bool, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for TransactionByHash") + } + + var r0 *types.Transaction + var r1 bool + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Transaction, bool, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Transaction); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) bool); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Get(1).(bool) + } + + if rf, ok := ret.Get(2).(func(context.Context, common.Hash) error); ok { + r2 = rf(ctx, hash) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// RpcClientBindingMock_TransactionByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionByHash' +type RpcClientBindingMock_TransactionByHash_Call struct { + *mock.Call +} + +// TransactionByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *RpcClientBindingMock_Expecter) TransactionByHash(ctx interface{}, hash interface{}) *RpcClientBindingMock_TransactionByHash_Call { + return &RpcClientBindingMock_TransactionByHash_Call{Call: _e.mock.On("TransactionByHash", ctx, hash)} +} + +func (_c *RpcClientBindingMock_TransactionByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *RpcClientBindingMock_TransactionByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *RpcClientBindingMock_TransactionByHash_Call) Return(tx *types.Transaction, isPending bool, err error) *RpcClientBindingMock_TransactionByHash_Call { + _c.Call.Return(tx, isPending, err) + return _c +} + +func (_c *RpcClientBindingMock_TransactionByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Transaction, bool, error)) *RpcClientBindingMock_TransactionByHash_Call { + _c.Call.Return(run) + return _c +} + +// TransactionReceipt provides a mock function with given fields: ctx, txHash +func (_m *RpcClientBindingMock) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + ret := _m.Called(ctx, txHash) + + if len(ret) == 0 { + panic("no return value specified for TransactionReceipt") + } + + var r0 *types.Receipt + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Receipt, error)); ok { + return rf(ctx, txHash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Receipt); ok { + r0 = rf(ctx, txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Receipt) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_TransactionReceipt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionReceipt' +type RpcClientBindingMock_TransactionReceipt_Call struct { + *mock.Call +} + +// TransactionReceipt is a helper method to define mock.On call +// - ctx context.Context +// - txHash common.Hash +func (_e *RpcClientBindingMock_Expecter) TransactionReceipt(ctx interface{}, txHash interface{}) *RpcClientBindingMock_TransactionReceipt_Call { + return &RpcClientBindingMock_TransactionReceipt_Call{Call: _e.mock.On("TransactionReceipt", ctx, txHash)} +} + +func (_c *RpcClientBindingMock_TransactionReceipt_Call) Run(run func(ctx context.Context, txHash common.Hash)) *RpcClientBindingMock_TransactionReceipt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *RpcClientBindingMock_TransactionReceipt_Call) Return(_a0 *types.Receipt, _a1 error) *RpcClientBindingMock_TransactionReceipt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_TransactionReceipt_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Receipt, error)) *RpcClientBindingMock_TransactionReceipt_Call { + _c.Call.Return(run) + return _c +} + +// NewRpcClientBindingMock creates a new instance of RpcClientBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRpcClientBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *RpcClientBindingMock { + mock := &RpcClientBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/rsk_bridge_binding_mock.go b/test/mocks/rsk_bridge_binding_mock.go new file mode 100644 index 00000000..4c947176 --- /dev/null +++ b/test/mocks/rsk_bridge_binding_mock.go @@ -0,0 +1,443 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + mock "github.com/stretchr/testify/mock" +) + +// RskBridgeBindingMock is an autogenerated mock type for the RskBridgeBinding type +type RskBridgeBindingMock struct { + mock.Mock +} + +type RskBridgeBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *RskBridgeBindingMock) EXPECT() *RskBridgeBindingMock_Expecter { + return &RskBridgeBindingMock_Expecter{mock: &_m.Mock} +} + +// GetActiveFederationCreationBlockHeight provides a mock function with given fields: opts +func (_m *RskBridgeBindingMock) GetActiveFederationCreationBlockHeight(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetActiveFederationCreationBlockHeight") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetActiveFederationCreationBlockHeight' +type RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call struct { + *mock.Call +} + +// GetActiveFederationCreationBlockHeight is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RskBridgeBindingMock_Expecter) GetActiveFederationCreationBlockHeight(opts interface{}) *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call { + return &RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call{Call: _e.mock.On("GetActiveFederationCreationBlockHeight", opts)} +} + +func (_c *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call) Run(run func(opts *bind.CallOpts)) *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call) Return(_a0 *big.Int, _a1 error) *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *RskBridgeBindingMock_GetActiveFederationCreationBlockHeight_Call { + _c.Call.Return(run) + return _c +} + +// GetActivePowpegRedeemScript provides a mock function with given fields: opts +func (_m *RskBridgeBindingMock) GetActivePowpegRedeemScript(opts *bind.CallOpts) ([]byte, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetActivePowpegRedeemScript") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([]byte, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) []byte); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetActivePowpegRedeemScript_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetActivePowpegRedeemScript' +type RskBridgeBindingMock_GetActivePowpegRedeemScript_Call struct { + *mock.Call +} + +// GetActivePowpegRedeemScript is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RskBridgeBindingMock_Expecter) GetActivePowpegRedeemScript(opts interface{}) *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call { + return &RskBridgeBindingMock_GetActivePowpegRedeemScript_Call{Call: _e.mock.On("GetActivePowpegRedeemScript", opts)} +} + +func (_c *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call) Run(run func(opts *bind.CallOpts)) *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call) Return(_a0 []byte, _a1 error) *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call) RunAndReturn(run func(*bind.CallOpts) ([]byte, error)) *RskBridgeBindingMock_GetActivePowpegRedeemScript_Call { + _c.Call.Return(run) + return _c +} + +// GetFederationAddress provides a mock function with given fields: opts +func (_m *RskBridgeBindingMock) GetFederationAddress(opts *bind.CallOpts) (string, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetFederationAddress") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (string, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) string); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetFederationAddress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFederationAddress' +type RskBridgeBindingMock_GetFederationAddress_Call struct { + *mock.Call +} + +// GetFederationAddress is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RskBridgeBindingMock_Expecter) GetFederationAddress(opts interface{}) *RskBridgeBindingMock_GetFederationAddress_Call { + return &RskBridgeBindingMock_GetFederationAddress_Call{Call: _e.mock.On("GetFederationAddress", opts)} +} + +func (_c *RskBridgeBindingMock_GetFederationAddress_Call) Run(run func(opts *bind.CallOpts)) *RskBridgeBindingMock_GetFederationAddress_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederationAddress_Call) Return(_a0 string, _a1 error) *RskBridgeBindingMock_GetFederationAddress_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederationAddress_Call) RunAndReturn(run func(*bind.CallOpts) (string, error)) *RskBridgeBindingMock_GetFederationAddress_Call { + _c.Call.Return(run) + return _c +} + +// GetFederationSize provides a mock function with given fields: opts +func (_m *RskBridgeBindingMock) GetFederationSize(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetFederationSize") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetFederationSize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFederationSize' +type RskBridgeBindingMock_GetFederationSize_Call struct { + *mock.Call +} + +// GetFederationSize is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RskBridgeBindingMock_Expecter) GetFederationSize(opts interface{}) *RskBridgeBindingMock_GetFederationSize_Call { + return &RskBridgeBindingMock_GetFederationSize_Call{Call: _e.mock.On("GetFederationSize", opts)} +} + +func (_c *RskBridgeBindingMock_GetFederationSize_Call) Run(run func(opts *bind.CallOpts)) *RskBridgeBindingMock_GetFederationSize_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederationSize_Call) Return(_a0 *big.Int, _a1 error) *RskBridgeBindingMock_GetFederationSize_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederationSize_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *RskBridgeBindingMock_GetFederationSize_Call { + _c.Call.Return(run) + return _c +} + +// GetFederationThreshold provides a mock function with given fields: opts +func (_m *RskBridgeBindingMock) GetFederationThreshold(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetFederationThreshold") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetFederationThreshold_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFederationThreshold' +type RskBridgeBindingMock_GetFederationThreshold_Call struct { + *mock.Call +} + +// GetFederationThreshold is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RskBridgeBindingMock_Expecter) GetFederationThreshold(opts interface{}) *RskBridgeBindingMock_GetFederationThreshold_Call { + return &RskBridgeBindingMock_GetFederationThreshold_Call{Call: _e.mock.On("GetFederationThreshold", opts)} +} + +func (_c *RskBridgeBindingMock_GetFederationThreshold_Call) Run(run func(opts *bind.CallOpts)) *RskBridgeBindingMock_GetFederationThreshold_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederationThreshold_Call) Return(_a0 *big.Int, _a1 error) *RskBridgeBindingMock_GetFederationThreshold_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederationThreshold_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *RskBridgeBindingMock_GetFederationThreshold_Call { + _c.Call.Return(run) + return _c +} + +// GetFederatorPublicKeyOfType provides a mock function with given fields: opts, index, atype +func (_m *RskBridgeBindingMock) GetFederatorPublicKeyOfType(opts *bind.CallOpts, index *big.Int, atype string) ([]byte, error) { + ret := _m.Called(opts, index, atype) + + if len(ret) == 0 { + panic("no return value specified for GetFederatorPublicKeyOfType") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, *big.Int, string) ([]byte, error)); ok { + return rf(opts, index, atype) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, *big.Int, string) []byte); ok { + r0 = rf(opts, index, atype) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, *big.Int, string) error); ok { + r1 = rf(opts, index, atype) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFederatorPublicKeyOfType' +type RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call struct { + *mock.Call +} + +// GetFederatorPublicKeyOfType is a helper method to define mock.On call +// - opts *bind.CallOpts +// - index *big.Int +// - atype string +func (_e *RskBridgeBindingMock_Expecter) GetFederatorPublicKeyOfType(opts interface{}, index interface{}, atype interface{}) *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call { + return &RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call{Call: _e.mock.On("GetFederatorPublicKeyOfType", opts, index, atype)} +} + +func (_c *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call) Run(run func(opts *bind.CallOpts, index *big.Int, atype string)) *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(*big.Int), args[2].(string)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call) Return(_a0 []byte, _a1 error) *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call) RunAndReturn(run func(*bind.CallOpts, *big.Int, string) ([]byte, error)) *RskBridgeBindingMock_GetFederatorPublicKeyOfType_Call { + _c.Call.Return(run) + return _c +} + +// GetMinimumLockTxValue provides a mock function with given fields: opts +func (_m *RskBridgeBindingMock) GetMinimumLockTxValue(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetMinimumLockTxValue") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RskBridgeBindingMock_GetMinimumLockTxValue_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMinimumLockTxValue' +type RskBridgeBindingMock_GetMinimumLockTxValue_Call struct { + *mock.Call +} + +// GetMinimumLockTxValue is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RskBridgeBindingMock_Expecter) GetMinimumLockTxValue(opts interface{}) *RskBridgeBindingMock_GetMinimumLockTxValue_Call { + return &RskBridgeBindingMock_GetMinimumLockTxValue_Call{Call: _e.mock.On("GetMinimumLockTxValue", opts)} +} + +func (_c *RskBridgeBindingMock_GetMinimumLockTxValue_Call) Run(run func(opts *bind.CallOpts)) *RskBridgeBindingMock_GetMinimumLockTxValue_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RskBridgeBindingMock_GetMinimumLockTxValue_Call) Return(_a0 *big.Int, _a1 error) *RskBridgeBindingMock_GetMinimumLockTxValue_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RskBridgeBindingMock_GetMinimumLockTxValue_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *RskBridgeBindingMock_GetMinimumLockTxValue_Call { + _c.Call.Return(run) + return _c +} + +// NewRskBridgeBindingMock creates a new instance of RskBridgeBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRskBridgeBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *RskBridgeBindingMock { + mock := &RskBridgeBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/transaction_signer_mock.go b/test/mocks/transaction_signer_mock.go new file mode 100644 index 00000000..7db7224c --- /dev/null +++ b/test/mocks/transaction_signer_mock.go @@ -0,0 +1,248 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// TransactionSignerMock is an autogenerated mock type for the TransactionSigner type +type TransactionSignerMock struct { + mock.Mock +} + +type TransactionSignerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *TransactionSignerMock) EXPECT() *TransactionSignerMock_Expecter { + return &TransactionSignerMock_Expecter{mock: &_m.Mock} +} + +// Address provides a mock function with given fields: +func (_m *TransactionSignerMock) Address() common.Address { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Address") + } + + var r0 common.Address + if rf, ok := ret.Get(0).(func() common.Address); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Address) + } + } + + return r0 +} + +// TransactionSignerMock_Address_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Address' +type TransactionSignerMock_Address_Call struct { + *mock.Call +} + +// Address is a helper method to define mock.On call +func (_e *TransactionSignerMock_Expecter) Address() *TransactionSignerMock_Address_Call { + return &TransactionSignerMock_Address_Call{Call: _e.mock.On("Address")} +} + +func (_c *TransactionSignerMock_Address_Call) Run(run func()) *TransactionSignerMock_Address_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TransactionSignerMock_Address_Call) Return(_a0 common.Address) *TransactionSignerMock_Address_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TransactionSignerMock_Address_Call) RunAndReturn(run func() common.Address) *TransactionSignerMock_Address_Call { + _c.Call.Return(run) + return _c +} + +// Sign provides a mock function with given fields: _a0, _a1 +func (_m *TransactionSignerMock) Sign(_a0 common.Address, _a1 *types.Transaction) (*types.Transaction, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for Sign") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(common.Address, *types.Transaction) (*types.Transaction, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(common.Address, *types.Transaction) *types.Transaction); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(common.Address, *types.Transaction) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionSignerMock_Sign_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Sign' +type TransactionSignerMock_Sign_Call struct { + *mock.Call +} + +// Sign is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *types.Transaction +func (_e *TransactionSignerMock_Expecter) Sign(_a0 interface{}, _a1 interface{}) *TransactionSignerMock_Sign_Call { + return &TransactionSignerMock_Sign_Call{Call: _e.mock.On("Sign", _a0, _a1)} +} + +func (_c *TransactionSignerMock_Sign_Call) Run(run func(_a0 common.Address, _a1 *types.Transaction)) *TransactionSignerMock_Sign_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*types.Transaction)) + }) + return _c +} + +func (_c *TransactionSignerMock_Sign_Call) Return(_a0 *types.Transaction, _a1 error) *TransactionSignerMock_Sign_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TransactionSignerMock_Sign_Call) RunAndReturn(run func(common.Address, *types.Transaction) (*types.Transaction, error)) *TransactionSignerMock_Sign_Call { + _c.Call.Return(run) + return _c +} + +// SignBytes provides a mock function with given fields: msg +func (_m *TransactionSignerMock) SignBytes(msg []byte) ([]byte, error) { + ret := _m.Called(msg) + + if len(ret) == 0 { + panic("no return value specified for SignBytes") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func([]byte) ([]byte, error)); ok { + return rf(msg) + } + if rf, ok := ret.Get(0).(func([]byte) []byte); ok { + r0 = rf(msg) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func([]byte) error); ok { + r1 = rf(msg) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionSignerMock_SignBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SignBytes' +type TransactionSignerMock_SignBytes_Call struct { + *mock.Call +} + +// SignBytes is a helper method to define mock.On call +// - msg []byte +func (_e *TransactionSignerMock_Expecter) SignBytes(msg interface{}) *TransactionSignerMock_SignBytes_Call { + return &TransactionSignerMock_SignBytes_Call{Call: _e.mock.On("SignBytes", msg)} +} + +func (_c *TransactionSignerMock_SignBytes_Call) Run(run func(msg []byte)) *TransactionSignerMock_SignBytes_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]byte)) + }) + return _c +} + +func (_c *TransactionSignerMock_SignBytes_Call) Return(_a0 []byte, _a1 error) *TransactionSignerMock_SignBytes_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TransactionSignerMock_SignBytes_Call) RunAndReturn(run func([]byte) ([]byte, error)) *TransactionSignerMock_SignBytes_Call { + _c.Call.Return(run) + return _c +} + +// Validate provides a mock function with given fields: signature, hash +func (_m *TransactionSignerMock) Validate(signature string, hash string) bool { + ret := _m.Called(signature, hash) + + if len(ret) == 0 { + panic("no return value specified for Validate") + } + + var r0 bool + if rf, ok := ret.Get(0).(func(string, string) bool); ok { + r0 = rf(signature, hash) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// TransactionSignerMock_Validate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Validate' +type TransactionSignerMock_Validate_Call struct { + *mock.Call +} + +// Validate is a helper method to define mock.On call +// - signature string +// - hash string +func (_e *TransactionSignerMock_Expecter) Validate(signature interface{}, hash interface{}) *TransactionSignerMock_Validate_Call { + return &TransactionSignerMock_Validate_Call{Call: _e.mock.On("Validate", signature, hash)} +} + +func (_c *TransactionSignerMock_Validate_Call) Run(run func(signature string, hash string)) *TransactionSignerMock_Validate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(string)) + }) + return _c +} + +func (_c *TransactionSignerMock_Validate_Call) Return(_a0 bool) *TransactionSignerMock_Validate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TransactionSignerMock_Validate_Call) RunAndReturn(run func(string, string) bool) *TransactionSignerMock_Validate_Call { + _c.Call.Return(run) + return _c +} + +// NewTransactionSignerMock creates a new instance of TransactionSignerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTransactionSignerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *TransactionSignerMock { + mock := &TransactionSignerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From 1ee7964141e5587ee73ef0caed020805e6dd6c48 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 19 Apr 2024 17:09:01 +0200 Subject: [PATCH 047/113] fix: fix sonar warnings --- .../dataproviders/rootstock/bridge_test.go | 6 +- .../rootstock/federation/federation_test.go | 10 +-- .../rootstock/fee_collector_test.go | 2 +- .../dataproviders/rootstock/lbc_test.go | 67 ++++++++++--------- .../dataproviders/rootstock/rpc_test.go | 6 +- .../dataproviders/rootstock/wallet_test.go | 11 +-- 6 files changed, 56 insertions(+), 46 deletions(-) diff --git a/internal/adapters/dataproviders/rootstock/bridge_test.go b/internal/adapters/dataproviders/rootstock/bridge_test.go index be547811..75b796b1 100644 --- a/internal/adapters/dataproviders/rootstock/bridge_test.go +++ b/internal/adapters/dataproviders/rootstock/bridge_test.go @@ -38,7 +38,7 @@ func TestRskBridgeImpl_GetFedAddress(t *testing.T) { require.NoError(t, err) bridgeMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on GetFederationAddress call fail", func(t *testing.T) { bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetFederationAddress", mock.Anything).Return("", assert.AnError) bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) @@ -59,7 +59,7 @@ func TestRskBridgeImpl_GetMinimumLockTxValue(t *testing.T) { require.NoError(t, err) bridgeMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on GetMinimumLockTxValue call fail", func(t *testing.T) { bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetMinimumLockTxValue", mock.Anything).Return(nil, assert.AnError) bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) @@ -104,7 +104,7 @@ func TestRskBridgeImpl_GetFlyoverDerivationAddress(t *testing.T) { require.NoError(t, testError) bridgeMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on GetActivePowpegRedeemScript call fail", func(t *testing.T) { var testError error var result blockchain.FlyoverDerivation bridgeMock := &mocks.RskBridgeBindingMock{} diff --git a/internal/adapters/dataproviders/rootstock/federation/federation_test.go b/internal/adapters/dataproviders/rootstock/federation/federation_test.go index b018c104..ed7ac1a8 100644 --- a/internal/adapters/dataproviders/rootstock/federation/federation_test.go +++ b/internal/adapters/dataproviders/rootstock/federation/federation_test.go @@ -42,6 +42,8 @@ const ( flyoverDerivationHash = "ffe4766f7b5f2fdf374f8ae02270d713c4dcb4b1c5d42bffda61b7f4c1c4c6c9" ) +const invalidFailInfoTestName = "fail on invalid fed info" + var testQuotes = []testQuote{ { LpBtcAddress: "mnxKdPFrYqLSUy2oP1eno8n5X8AwkcnPjk", @@ -394,7 +396,7 @@ func TestCalculateFlyoverDerivationAddress_ErrorHandling(t *testing.T) { } func TestValidateRedeemScript_ErrorHandling(t *testing.T) { - t.Run("fail on invalid fed info", func(t *testing.T) { + t.Run(invalidFailInfoTestName, func(t *testing.T) { require.Error(t, federation.ValidateRedeemScript(mocks.GetFakeFedInfo(), chaincfg.MainNetParams, []byte{1})) }) t.Run("fail on invalid script", func(t *testing.T) { @@ -403,7 +405,7 @@ func TestValidateRedeemScript_ErrorHandling(t *testing.T) { } func TestGetFedRedeemScript_ErrorHandling(t *testing.T) { - t.Run("fail on invalid fed info", func(t *testing.T) { + t.Run(invalidFailInfoTestName, func(t *testing.T) { script, err := federation.GetFedRedeemScript(blockchain.FederationInfo{}, chaincfg.MainNetParams) assert.Nil(t, script) require.Error(t, err) @@ -411,7 +413,7 @@ func TestGetFedRedeemScript_ErrorHandling(t *testing.T) { } func TestGetErpRedeemScriptBuf_ErrorHandling(t *testing.T) { - t.Run("fail on invalid fed info", func(t *testing.T) { + t.Run(invalidFailInfoTestName, func(t *testing.T) { script, err := federation.GetErpRedeemScriptBuf(blockchain.FederationInfo{ ErpKeys: []string{invalidKey}, }, chaincfg.MainNetParams) @@ -421,7 +423,7 @@ func TestGetErpRedeemScriptBuf_ErrorHandling(t *testing.T) { } func TestGetRedeemScriptBuf_ErrorHandling(t *testing.T) { - t.Run("fail on invalid fed info", func(t *testing.T) { + t.Run(invalidFailInfoTestName, func(t *testing.T) { script, err := federation.GetRedeemScriptBuf(blockchain.FederationInfo{PubKeys: []string{invalidKey}}, true) assert.Nil(t, script) require.Error(t, err) diff --git a/internal/adapters/dataproviders/rootstock/fee_collector_test.go b/internal/adapters/dataproviders/rootstock/fee_collector_test.go index a115d6fe..2418e48f 100644 --- a/internal/adapters/dataproviders/rootstock/fee_collector_test.go +++ b/internal/adapters/dataproviders/rootstock/fee_collector_test.go @@ -19,7 +19,7 @@ func TestFeeCollectorImpl_DaoFeePercentage(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(1), percentage) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on ProductFeePercentage call fail", func(t *testing.T) { lbcMock.On("ProductFeePercentage", mock.Anything).Return(nil, assert.AnError).Once() feeCollector := rootstock.NewFeeCollectorImpl(lbcMock, rootstock.RetryParams{Retries: 0, Sleep: 0}) percentage, err := feeCollector.DaoFeePercentage() diff --git a/internal/adapters/dataproviders/rootstock/lbc_test.go b/internal/adapters/dataproviders/rootstock/lbc_test.go index 2f03c086..a18bfd48 100644 --- a/internal/adapters/dataproviders/rootstock/lbc_test.go +++ b/internal/adapters/dataproviders/rootstock/lbc_test.go @@ -24,6 +24,11 @@ import ( "time" ) +const ( + penalizedIteratorString = "*bindings.LiquidityBridgeContractPenalizedIterator" + depositIteratorString = "*bindings.LiquidityBridgeContractPegOutDepositIterator" +) + var peginQuote = quote.PeginQuote{ FedBtcAddress: "2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc", LbcAddress: "0xd5f00ABfbEA7A0B193836CAc6833c2Ad9D06cEa8", @@ -231,7 +236,7 @@ func TestLiquidityBridgeContractImpl_HashPeginQuote(t *testing.T) { assert.Equal(t, hex.EncodeToString(hash[:]), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on HashQuote call fail", func(t *testing.T) { lbcMock.On("HashQuote", mock.Anything, parsedPeginQuote).Return(nil, assert.AnError).Once() result, err := lbc.HashPeginQuote(peginQuote) require.Error(t, err) @@ -310,7 +315,7 @@ func TestLiquidityBridgeContractImpl_HashPegoutQuote(t *testing.T) { assert.Equal(t, hex.EncodeToString(hash[:]), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on HashPegoutQuote fail", func(t *testing.T) { lbcMock.On("HashPegoutQuote", mock.Anything, parsedPegoutQuote).Return(nil, assert.AnError).Once() result, err := lbc.HashPegoutQuote(pegoutQuote) require.Error(t, err) @@ -426,14 +431,14 @@ func TestLiquidityBridgeContractImpl_ProviderResign(t *testing.T) { require.NoError(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending resign tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("Resign", mock.Anything).Return(nil, assert.AnError).Once() err := lbc.ProviderResign() require.Error(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (resign tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false) lbcMock.On("Resign", mock.Anything).Return(tx, nil).Once() err := lbc.ProviderResign() @@ -460,14 +465,14 @@ func TestLiquidityBridgeContractImpl_SetProviderStatus(t *testing.T) { require.NoError(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending setProviderStatus tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("SetProviderStatus", mock.Anything, big.NewInt(1), true).Return(nil, assert.AnError).Once() err := lbc.SetProviderStatus(1, true) require.Error(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (setProviderStatus tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false) lbcMock.On("SetProviderStatus", mock.Anything, big.NewInt(1), false).Return(tx, nil).Once() err := lbc.SetProviderStatus(1, false) @@ -486,13 +491,13 @@ func TestLiquidityBridgeContractImpl_GetCollateral(t *testing.T) { assert.Equal(t, entities.NewWei(500), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling on call error", func(t *testing.T) { + t.Run("Error handling on GetCollateral call error", func(t *testing.T) { lbcMock.On("GetCollateral", mock.Anything, parsedAddress).Return(nil, assert.AnError).Once() result, err := lbc.GetCollateral(parsedAddress.String()) require.Error(t, err) assert.Nil(t, result) }) - t.Run("Error handling on invalid address", func(t *testing.T) { + t.Run("Error handling on invalid address for getting collateral", func(t *testing.T) { result, err := lbc.GetCollateral(test.AnyString) require.Error(t, err) assert.Nil(t, result) @@ -509,13 +514,13 @@ func TestLiquidityBridgeContractImpl_GetPegoutCollateral(t *testing.T) { assert.Equal(t, entities.NewWei(500), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling on call error", func(t *testing.T) { + t.Run("Error handling on GetPegoutCollateral call error", func(t *testing.T) { lbcMock.On("GetPegoutCollateral", mock.Anything, parsedAddress).Return(nil, assert.AnError).Once() result, err := lbc.GetPegoutCollateral(parsedAddress.String()) require.Error(t, err) assert.Nil(t, result) }) - t.Run("Error handling on invalid address", func(t *testing.T) { + t.Run("Error handling on invalid address for getting pegout collateral", func(t *testing.T) { result, err := lbc.GetPegoutCollateral(test.AnyString) require.Error(t, err) assert.Nil(t, result) @@ -532,7 +537,7 @@ func TestLiquidityBridgeContractImpl_GetMinimumCollateral(t *testing.T) { assert.Equal(t, entities.NewWei(500), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on GetMinCollateral call fail", func(t *testing.T) { lbcMock.On("GetMinCollateral", mock.Anything).Return(nil, assert.AnError).Once() result, err := lbc.GetMinimumCollateral() require.Error(t, err) @@ -561,14 +566,14 @@ func TestLiquidityBridgeContractImpl_AddCollateral(t *testing.T) { require.NoError(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending addCollateral tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("AddCollateral", txMatchFunction).Return(nil, assert.AnError).Once() err := lbc.AddCollateral(entities.NewWei(500)) require.Error(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (addCollateral tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false, valueModifier(big.NewInt(500))) lbcMock.On("AddCollateral", txMatchFunction).Return(tx, nil).Once() err := lbc.AddCollateral(entities.NewWei(500)) @@ -598,14 +603,14 @@ func TestLiquidityBridgeContractImpl_AddPegoutCollateral(t *testing.T) { require.NoError(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending addPegoutCollateral tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("AddPegoutCollateral", txMatchFunction).Return(nil, assert.AnError).Once() err := lbc.AddPegoutCollateral(entities.NewWei(777)) require.Error(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (addPegoutCollateral tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false, valueModifier(big.NewInt(777))) lbcMock.On("AddPegoutCollateral", txMatchFunction).Return(tx, nil).Once() err := lbc.AddPegoutCollateral(entities.NewWei(777)) @@ -632,14 +637,14 @@ func TestLiquidityBridgeContractImpl_WithdrawCollateral(t *testing.T) { require.NoError(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending withdrawCollateral tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("WithdrawCollateral", mock.Anything).Return(nil, assert.AnError).Once() err := lbc.WithdrawCollateral() require.Error(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (withdrawCollateral tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false) lbcMock.On("WithdrawCollateral", mock.Anything).Return(tx, nil).Once() err := lbc.WithdrawCollateral() @@ -666,14 +671,14 @@ func TestLiquidityBridgeContractImpl_WithdrawPegoutCollateral(t *testing.T) { require.NoError(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending withdrawPegoutCollateral tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("WithdrawPegoutCollateral", mock.Anything).Return(nil, assert.AnError).Once() err := lbc.WithdrawPegoutCollateral() require.Error(t, err) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (withdrawPegoutCollateral tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false) lbcMock.On("WithdrawPegoutCollateral", mock.Anything).Return(tx, nil).Once() err := lbc.WithdrawPegoutCollateral() @@ -692,13 +697,13 @@ func TestLiquidityBridgeContractImpl_GetBalance(t *testing.T) { assert.Equal(t, entities.NewWei(600), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling on call error", func(t *testing.T) { + t.Run("Error handling on GetBalance call error", func(t *testing.T) { lbcMock.On("GetBalance", mock.Anything, parsedAddress).Return(nil, assert.AnError).Once() result, err := lbc.GetBalance(parsedAddress.String()) require.Error(t, err) assert.Nil(t, result) }) - t.Run("Error handling on invalid address", func(t *testing.T) { + t.Run("Error handling on invalid address for getting balance", func(t *testing.T) { result, err := lbc.GetBalance(test.AnyString) require.Error(t, err) assert.Nil(t, result) @@ -730,14 +735,14 @@ func TestLiquidityBridgeContractImpl_CallForUser(t *testing.T) { assert.Equal(t, tx.Hash().String(), result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling (sending tx)", func(t *testing.T) { + t.Run("Error handling when sending callForUser tx", func(t *testing.T) { _ = prepareTxMocks(mockClient, signerMock, true) lbcMock.On("CallForUser", optsMatchFunction, parsedPeginQuote).Return(nil, assert.AnError).Once() result, err := lbc.CallForUser(txConfig, peginQuote) require.Error(t, err) assert.Empty(t, result) }) - t.Run("Error handling (tx reverted)", func(t *testing.T) { + t.Run("Error handling (callForUser tx reverted)", func(t *testing.T) { tx := prepareTxMocks(mockClient, signerMock, false, modifiers...) lbcMock.On("CallForUser", mock.Anything, parsedPeginQuote).Return(tx, nil).Once() result, err := lbc.CallForUser(txConfig, peginQuote) @@ -948,7 +953,7 @@ func TestLiquidityBridgeContractImpl_IsOperationalPegin(t *testing.T) { assert.True(t, result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on IsOperational call fail", func(t *testing.T) { lbcMock.On("IsOperational", mock.Anything, parsedAddress).Return(true, assert.AnError).Once() _, err := lbc.IsOperationalPegin(parsedAddress.String()) require.Error(t, err) @@ -970,7 +975,7 @@ func TestLiquidityBridgeContractImpl_IsOperationalPegout(t *testing.T) { assert.True(t, result) lbcMock.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on IsOperationalForPegout call fail", func(t *testing.T) { lbcMock.On("IsOperationalForPegout", mock.Anything, parsedAddress).Return(true, assert.AnError).Once() _, err := lbc.IsOperationalPegout(parsedAddress.String()) require.Error(t, err) @@ -1110,7 +1115,7 @@ func TestLiquidityBridgeContractImpl_GetDepositEvents(t *testing.T) { var to uint64 = 1000 lbcMock.On("FilterPegOutDeposit", mock.MatchedBy(filterMatchFunc(from, to)), [][32]uint8(nil), []common.Address(nil)). Return(&bindings.LiquidityBridgeContractPegOutDepositIterator{}, nil).Once() - lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPegOutDepositIterator")). + lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType(depositIteratorString)). Return(iteratorMock) iteratorMock.On("Next").Return(true).Times(len(deposits)) iteratorMock.On("Next").Return(false).Once() @@ -1130,7 +1135,7 @@ func TestLiquidityBridgeContractImpl_GetDepositEvents(t *testing.T) { var to uint64 = 1100 lbcMock.On("FilterPegOutDeposit", mock.MatchedBy(filterMatchFunc(from, to)), [][32]uint8(nil), []common.Address(nil)). Return(nil, assert.AnError).Once() - lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPegOutDepositIterator")). + lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType(depositIteratorString)). Return(nil) result, err := lbc.GetDepositEvents(context.Background(), from, &to) require.Error(t, err) @@ -1142,7 +1147,7 @@ func TestLiquidityBridgeContractImpl_GetDepositEvents(t *testing.T) { var to uint64 = 1200 lbcMock.On("FilterPegOutDeposit", mock.MatchedBy(filterMatchFunc(from, to)), [][32]uint8(nil), []common.Address(nil)). Return(&bindings.LiquidityBridgeContractPegOutDepositIterator{}, nil).Once() - lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPegOutDepositIterator")). + lbcMock.On("DepositEventIteratorAdapter", mock.AnythingOfType(depositIteratorString)). Return(iteratorMock) iteratorMock.On("Next").Return(false).Once() iteratorMock.On("Error").Return(assert.AnError).Once() @@ -1169,7 +1174,7 @@ func TestLiquidityBridgeContractImpl_GetPeginPunishmentEvents(t *testing.T) { var to uint64 = 1000 lbcMock.On("FilterPenalized", mock.MatchedBy(filterMatchFunc(from, to))). Return(&bindings.LiquidityBridgeContractPenalizedIterator{}, nil).Once() - lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPenalizedIterator")). + lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType(penalizedIteratorString)). Return(iteratorMock) iteratorMock.On("Next").Return(true).Times(len(penalizations)) iteratorMock.On("Next").Return(false).Once() @@ -1189,7 +1194,7 @@ func TestLiquidityBridgeContractImpl_GetPeginPunishmentEvents(t *testing.T) { var to uint64 = 1100 lbcMock.On("FilterPenalized", mock.MatchedBy(filterMatchFunc(from, to))). Return(nil, assert.AnError).Once() - lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPenalizedIterator")). + lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType(penalizedIteratorString)). Return(nil) result, err := lbc.GetPeginPunishmentEvents(context.Background(), from, &to) require.Error(t, err) @@ -1201,7 +1206,7 @@ func TestLiquidityBridgeContractImpl_GetPeginPunishmentEvents(t *testing.T) { var to uint64 = 1200 lbcMock.On("FilterPenalized", mock.MatchedBy(filterMatchFunc(from, to))). Return(&bindings.LiquidityBridgeContractPenalizedIterator{}, nil).Once() - lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType("*bindings.LiquidityBridgeContractPenalizedIterator")). + lbcMock.On("PenalizedEventIteratorAdapter", mock.AnythingOfType(penalizedIteratorString)). Return(iteratorMock) iteratorMock.On("Next").Return(false).Once() iteratorMock.On("Error").Return(assert.AnError).Once() diff --git a/internal/adapters/dataproviders/rootstock/rpc_test.go b/internal/adapters/dataproviders/rootstock/rpc_test.go index a68d4aab..999392bc 100644 --- a/internal/adapters/dataproviders/rootstock/rpc_test.go +++ b/internal/adapters/dataproviders/rootstock/rpc_test.go @@ -135,7 +135,7 @@ func TestRskjRpcServer_GasPrice(t *testing.T) { require.NoError(t, err) assert.Equal(t, entities.NewWei(200), gasPrice) }) - t.Run("Error calling rpc", func(t *testing.T) { + t.Run("Error calling SuggestGasPrice", func(t *testing.T) { client.On("SuggestGasPrice", test.AnyCtx).Return(nil, assert.AnError).Once() gasPrice, err := rpc.GasPrice(context.Background()) require.Error(t, err) @@ -153,7 +153,7 @@ func TestRskjRpcServer_GetBalance(t *testing.T) { require.NoError(t, err) assert.Equal(t, entities.NewWei(100), balance) }) - t.Run("Error calling rpc", func(t *testing.T) { + t.Run("Error calling BalanceAt", func(t *testing.T) { client.On("BalanceAt", test.AnyCtx, parsedAddress, blockNumber).Return(nil, assert.AnError).Once() balance, err := rpc.GetBalance(context.Background(), parsedAddress.String()) require.Error(t, err) @@ -175,7 +175,7 @@ func TestRskjRpcServer_GetHeight(t *testing.T) { require.NoError(t, err) assert.Equal(t, uint64(50), blockNumber) }) - t.Run("Error calling rpc", func(t *testing.T) { + t.Run("Error calling BlockNumber", func(t *testing.T) { client.On("BlockNumber", test.AnyCtx).Return(uint64(0), assert.AnError).Once() blockNumber, err := rpc.GetHeight(context.Background()) require.Error(t, err) diff --git a/internal/adapters/dataproviders/rootstock/wallet_test.go b/internal/adapters/dataproviders/rootstock/wallet_test.go index edeb063e..11820016 100644 --- a/internal/adapters/dataproviders/rootstock/wallet_test.go +++ b/internal/adapters/dataproviders/rootstock/wallet_test.go @@ -22,7 +22,10 @@ import ( "time" ) -const chainId = 31 +const ( + chainId = 31 + timerContextString = "*context.timerCtx" +) var ( walletAddress = common.HexToAddress("0x9D93929A9099be4355fC2389FbF253982F9dF47c") @@ -73,7 +76,7 @@ func createSendRbtcTest(account *rootstock.RskAccount) func(t *testing.T) { v, r, s := tx.RawSignatureValues() return assert.NotNil(t, v) && assert.NotNil(t, r) && assert.NotNil(t, s) })).Return(nil) - clientMock.On("PendingNonceAt", mock.AnythingOfType("*context.timerCtx"), walletAddress).Return(uint64(54), nil) + clientMock.On("PendingNonceAt", mock.AnythingOfType(timerContextString), walletAddress).Return(uint64(54), nil) wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ Value: entities.NewWei(89607151182921727), @@ -122,7 +125,7 @@ func createSendRbtcErrorHandlingTest(account *rootstock.RskAccount) func(t *test }) t.Run("Handle error on failure when getting nonce", func(t *testing.T) { clientMock := &mocks.RpcClientBindingMock{} - clientMock.On("PendingNonceAt", mock.AnythingOfType("*context.timerCtx"), walletAddress).Return(uint64(0), assert.AnError) + clientMock.On("PendingNonceAt", mock.AnythingOfType(timerContextString), walletAddress).Return(uint64(0), assert.AnError) wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ Value: entities.NewWei(1), @@ -135,7 +138,7 @@ func createSendRbtcErrorHandlingTest(account *rootstock.RskAccount) func(t *test t.Run("Handle error on failure when broadcasting tx", func(t *testing.T) { clientMock := &mocks.RpcClientBindingMock{} clientMock.On("SendTransaction", mock.Anything, mock.Anything).Return(assert.AnError) - clientMock.On("PendingNonceAt", mock.AnythingOfType("*context.timerCtx"), walletAddress).Return(uint64(54), nil) + clientMock.On("PendingNonceAt", mock.AnythingOfType(timerContextString), walletAddress).Return(uint64(54), nil) wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) tx, err := wallet.SendRbtc(context.Background(), blockchain.TransactionConfig{ Value: entities.NewWei(1), From 6c9fc1f3fb8549b5c0a7cc140358eea219124772 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Sun, 21 Apr 2024 12:34:06 +0200 Subject: [PATCH 048/113] fix: use structure to receive rsk bridge config --- coverage/cover.out | 8583 +++++++++++++---- .../dataproviders/rootstock/bridge.go | 20 +- .../dataproviders/rootstock/bridge_test.go | 22 +- internal/configuration/registry/rootstock.go | 10 +- 4 files changed, 6841 insertions(+), 1794 deletions(-) diff --git a/coverage/cover.out b/coverage/cover.out index ac4c3bd7..82274b92 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -3,6 +3,632 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go: github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:24.110,38.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:38.16,40.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:41.2,43.12 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -171,164 +797,632 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 128 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 63 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 62 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 20 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 192 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 38 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 2060 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 8190 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 4134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 2474 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 23 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 18 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 82 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 81 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 41 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 40 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 82 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 37 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -340,16 +1434,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 @@ -368,16 +1462,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 71 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 46 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 @@ -568,6 +1662,632 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 128 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 63 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 62 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 192 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 38 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 2060 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 8190 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 4134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 2474 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -579,17 +2299,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 23 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 16 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 74 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -607,98 +2327,27 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 20 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 46 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -957,164 +2606,6 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -1126,17 +2617,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -1146,7 +2637,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -1155,167 +2646,38 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -1323,20 +2685,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -1354,42 +2716,42 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -1404,15 +2766,15 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 @@ -1477,24 +2839,1644 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 67 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 67 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 @@ -1704,6 +4686,632 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_c github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -2109,6 +5717,632 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -2117,391 +6351,1406 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 21 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 65 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 31 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 34 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 31 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 33 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 47 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 31 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 106 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 68 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 38 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 115 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 115 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:22.43,23.30 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:23.30,27.31 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:27.31,30.4 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:32.2,32.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.80,40.38 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:40.38,43.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:44.2,46.21 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:49.62,50.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:50.35,51.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.38,53.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:55.2,56.34 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:59.57,63.9 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:63.9,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.2,66.37 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.37,68.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:37.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:49.55,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:53.55,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:57.79,61.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:65.2,68.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:71.2,72.48 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:75.114,79.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:82.2,86.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.2,89.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.39,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:92.2,94.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:94.52,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:96.8,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:104.113,109.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:112.2,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:116.2,119.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:119.16,121.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.2,122.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.39,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:125.2,127.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:127.52,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:129.8,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:138.117,139.135 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.135,141.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.2,142.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:145.2,145.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:148.115,149.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.133,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:155.2,155.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:158.113,159.131 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.131,161.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.2,162.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:165.2,165.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:172.32,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:174.16,177.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.2,178.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.26,181.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.2,182.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.70,185.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.2,186.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.70,189.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:190.2,190.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 128 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 2 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 321 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 112 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 10 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 10 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 21 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 59 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 57 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 57 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 36 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 65 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 31 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 34 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 64 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 31 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 33 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 47 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 31 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 106 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 68 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 38 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 115 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 115 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:22.43,23.30 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:23.30,27.31 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:27.31,30.4 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:32.2,32.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.80,40.38 5 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:40.38,43.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:44.2,46.21 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:49.62,50.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:50.35,51.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.38,53.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:55.2,56.34 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:59.57,63.9 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:63.9,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.2,66.37 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.37,68.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:37.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:49.55,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:53.55,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:57.79,61.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:65.2,68.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:71.2,72.48 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:75.114,79.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:79.16,81.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:82.2,86.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.2,89.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.39,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:92.2,94.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:94.52,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:96.8,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:104.113,109.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:112.2,113.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.16,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:116.2,119.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:119.16,121.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.2,122.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.39,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:125.2,127.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:127.52,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:129.8,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:138.117,139.135 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.135,141.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.2,142.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.16,144.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:145.2,145.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:148.115,149.133 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.133,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.2,152.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.16,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:155.2,155.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:158.113,159.131 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.131,161.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.2,162.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:165.2,165.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:172.32,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:174.16,177.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.2,178.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.26,181.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.2,182.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.70,185.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.2,186.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.70,189.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:190.2,190.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 51 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 51 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 51 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.132,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:18.63,23.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:23.16,25.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.78 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.78,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:30.2,30.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:37.26,45.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:47.70,49.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:49.16,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:53.2,54.47 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:54.47,60.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:60.17,62.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.8,63.23 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.23,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:67.2,68.47 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:68.47,74.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:74.17,76.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.8,77.23 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.23,79.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:81.2,81.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:27.19,31.53 3 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:31.53,33.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:35.2,38.65 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:38.65,40.4 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:42.2,42.12 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:42.12,44.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:45.2,45.33 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:61.9,66.16 4 27 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:66.16,68.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:69.2,69.30 1 25 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:69.30,70.78 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:70.78,72.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:73.8,75.3 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:77.2,78.16 2 24 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:78.16,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:81.2,82.16 2 23 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:82.16,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:85.2,86.16 2 22 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:86.16,88.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:89.2,89.12 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:92.111,93.41 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:93.41,95.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:96.2,96.9 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:97.57,99.10 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:99.10,101.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:102.3,103.44 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:104.10,105.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:112.9,114.16 2 22 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:114.16,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:117.2,118.16 2 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:118.16,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:121.2,123.36 3 20 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:123.36,125.3 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:125.8,127.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:27.38,29.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:31.100,33.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:33.16,35.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:36.2,36.24 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:36.24,38.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:39.2,40.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:43.2,46.16 4 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:46.16,48.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:50.2,51.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:54.2,55.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:55.16,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:59.2,70.12 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.85,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.71 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.71,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:19.17,22.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:24.105,25.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:25.71,27.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:28.2,28.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:31.107,33.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:35.83,37.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:39.103,41.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:43.89,45.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.2,28.31 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.31,30.109 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:30.109,32.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:34.2,34.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:25.21,33.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:41.90,62.54 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:62.54,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.8,64.68 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.68,66.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.8,66.69 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.69,68.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:70.2,70.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.132,18.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:36.102,43.54 6 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:43.54,45.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.2,47.63 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.63,49.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.2,50.65 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.65,52.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.2,54.61 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.61,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:58.2,60.54 3 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:60.54,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.8,62.23 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.23,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:66.2,68.54 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:68.54,70.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.8,70.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.23,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:74.2,75.53 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:78.149,82.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.87 3 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.87,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.107 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.107,93.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.114 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.114,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:97.2,101.8 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.116 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.116,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.118 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.118,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:115.2,118.8 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:121.139,125.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.85 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.85,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:132.8,134.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:137.104,139.55 2 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:139.55,141.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.8,141.35 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.35,143.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:144.2,144.12 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:151.17,153.130 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:153.130,155.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.138 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.138,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:160.8,162.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:169.17,171.133 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:171.133,173.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.145 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.145,178.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:178.8,180.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.120,16.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:18.43,22.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.62 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.62,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:29.2,29.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:25.26,33.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:35.133,36.74 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:36.74,38.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:40.2,41.89 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:41.89,43.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:45.2,46.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:49.2,50.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:54.2,61.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:61.16,63.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:64.2,64.86 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:64.86,66.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:67.2,67.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:70.116,72.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:74.92,76.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:78.112,80.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:82.98,84.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:20.26,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:24.116,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:20.27,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:24.118,26.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 66 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 65 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 65 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 46 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 65 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 49 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 44 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 @@ -2645,464 +7894,475 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:36.30,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:48.50,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:52.62,54.41 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:54.41,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:59.77,61.51 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:61.51,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:64.2,64.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:68.2,68.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:71.135,76.71 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.71,78.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:79.2,80.57 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:80.57,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:83.2,83.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:83.16,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:87.2,87.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:87.31,88.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:88.93,90.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:91.8,92.95 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.95,94.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:97.2,98.104 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:98.104,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:101.2,104.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.66,109.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:111.87,118.52 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:118.52,120.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:121.2,121.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.2,126.37 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:126.37,127.49 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.49,129.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:130.3,130.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:130.17,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:133.3,133.56 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:136.2,136.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:136.57,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,139.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.16,141.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.53,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:146.2,146.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:146.16,148.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:150.2,150.65 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:150.65,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:153.2,153.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:157.2,165.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:168.99,178.2 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:33.56,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:37.45,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:41.54,45.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:47.63,49.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:52.2,52.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.70,62.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:62.39,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:65.2,66.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:69.57,72.39 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:72.39,74.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.17,76.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:77.3,77.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:79.2,79.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.125,88.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:88.16,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:91.2,92.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.15,94.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.20,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.9,98.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.2,100.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:13.103,18.65 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:18.65,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:20.8,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:24.2,24.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:27.129,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:37.2,37.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:40.130,42.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:42.16,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:46.2,47.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:47.16,49.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:49.17,51.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:53.3,54.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:54.17,56.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:58.2,58.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:61.101,65.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:65.16,67.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:68.2,68.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:68.17,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:72.2,73.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:77.2,78.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:81.101,84.41 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:84.41,86.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:86.17,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:89.3,89.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:92.2,93.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:96.110,98.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:102.2,103.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:106.2,106.68 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:106.68,108.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:110.2,110.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:113.113,115.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:115.16,117.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:119.2,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:123.2,127.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:130.2,134.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:134.16,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:137.2,140.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:140.16,142.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:143.2,150.36 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:153.87,157.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:161.2,161.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:161.17,163.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:170.2,171.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:174.101,179.41 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:179.41,181.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:181.17,183.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:184.3,184.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:187.2,188.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:191.84,199.2 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:202.37,203.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:204.9,205.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:206.9,207.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:208.9,209.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:210.9,211.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:212.9,213.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:214.9,215.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:216.9,217.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:218.9,219.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:220.9,221.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:222.10,223.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:224.10,225.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:226.10,227.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:228.10,229.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:230.10,231.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:232.10,233.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:234.10,235.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:239.63,240.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:241.35,242.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:243.36,244.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation.go:245.10,246.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.94,16.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,20.51 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:20.51,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:23.2,23.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:23.16,25.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:26.2,26.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:39.38,46.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:48.61,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:52.101,57.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:57.16,59.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:61.2,61.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:61.51,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.2,64.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.104,75.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:75.16,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:79.2,79.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:79.51,81.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,82.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.16,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:85.2,85.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:88.114,95.50 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:95.50,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:98.2,98.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:102.2,105.37 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:105.37,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:109.2,109.96 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:109.96,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:112.2,112.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.2,116.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:116.38,119.30 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:119.30,121.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.3,129.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:131.2,131.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:134.64,139.57 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:139.57,140.74 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.74,142.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:145.2,145.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.8,147.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.50,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:150.2,150.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:153.92,161.57 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:161.57,162.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:162.85,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:167.2,167.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:167.16,169.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.8,169.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.50,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:172.2,172.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.94,179.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:179.61,181.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:182.2,182.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:182.55,184.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:185.2,185.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:185.16,187.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:188.2,188.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.100,195.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:195.61,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:198.2,198.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:198.55,200.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:201.2,201.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:201.16,203.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.2,204.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.87,210.55 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:210.55,212.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:213.2,213.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:213.16,215.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:216.2,216.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:219.83,226.57 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:226.57,227.81 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.81,229.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:232.2,232.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:232.16,234.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:234.8,234.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:234.50,236.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:237.2,237.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:240.89,247.57 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:247.57,248.87 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:248.87,250.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:253.2,253.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:253.16,255.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:255.8,255.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:255.50,257.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:258.2,258.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.68,267.57 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:267.57,268.86 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.86,270.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:273.2,273.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:273.16,275.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:275.8,275.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:275.50,277.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:278.2,278.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.74,287.57 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.57,288.92 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:288.92,290.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:293.2,293.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:293.16,295.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.8,295.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.50,297.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:298.2,298.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:301.91,305.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:305.61,307.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.52,310.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:311.2,311.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:311.16,313.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:314.2,314.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:317.137,326.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:326.16,328.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.57,331.79 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:331.79,333.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:336.2,336.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:336.16,338.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:338.8,338.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:338.50,340.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:341.2,341.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:344.110,349.66 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:349.66,351.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:352.2,361.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.59,365.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:365.8,365.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:365.23,367.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:369.2,375.89 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:375.89,378.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:380.2,380.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:380.16,382.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:382.8,382.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:382.50,384.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.2,385.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:388.147,396.88 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:396.88,399.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:401.2,401.59 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:401.59,404.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.23,406.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:406.8,406.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:406.50,408.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:409.2,409.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:412.90,417.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:417.61,419.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:421.2,421.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:421.39,423.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:426.91,431.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.61,433.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.39,437.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:440.145,449.15 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:449.15,450.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:450.22,451.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:451.63,453.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:456.2,456.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:456.35,458.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:460.2,460.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:460.22,470.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:471.2,471.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:471.29,473.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:475.2,475.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:478.168,487.15 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:487.15,488.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:488.22,489.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:489.63,491.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:494.2,494.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:494.35,496.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:498.2,498.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:498.22,505.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:506.2,506.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:506.29,508.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:509.2,509.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:512.158,520.57 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.57,521.76 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:521.76,523.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:526.2,526.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:526.16,528.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:528.8,528.76 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:528.76,530.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:532.2,533.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:533.16,535.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:536.2,536.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.86,545.59 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:545.59,547.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:549.2,549.110 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:549.110,551.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:551.8,553.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:554.2,554.126 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:554.126,556.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:557.2,557.133 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:557.133,559.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:561.2,561.84 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:561.84,563.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,564.103 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.103,566.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:567.2,567.96 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:567.96,569.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:570.2,570.94 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:570.94,572.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:574.2,574.92 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:574.92,576.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:578.2,590.25 13 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:594.90,598.60 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:598.60,600.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.85,604.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:605.2,605.89 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:605.89,607.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:608.2,608.97 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:608.97,610.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:612.2,612.127 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:612.127,614.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:615.2,615.119 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:615.119,617.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:618.2,618.124 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:618.124,620.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:622.2,637.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.72,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,36.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.51,38.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:40.2,40.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.8,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:47.133,53.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:53.59,55.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:57.2,57.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:57.70,59.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.8,59.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.23,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:63.2,68.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:68.49,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.2,71.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.16,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.8,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:78.80,79.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:79.51,81.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.2,82.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.16,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:84.8,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:89.74,90.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:90.41,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.122,99.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.2,103.58 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.58,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:106.2,106.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:106.16,108.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:110.2,110.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:110.57,113.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:114.2,114.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:114.16,116.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:118.2,123.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:123.16,125.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:126.2,135.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:138.99,145.46 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:145.46,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:148.2,148.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:148.16,150.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:152.2,152.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:152.51,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.2,155.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.16,157.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:159.2,159.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:159.47,161.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,162.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.94,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,98.32 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 34 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 105 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 117 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 115 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 33 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 19 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 18 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 16 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 32 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -3110,20 +8370,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 128 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 42 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 1 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 321 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 188 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 112 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 20 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -3133,7 +8393,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -3141,12 +8401,12 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 @@ -3154,40 +8414,40 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 @@ -3216,18 +8476,18 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.g github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 59 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 57 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 57 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 @@ -3237,257 +8497,36 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 36 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 51 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 51 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 51 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:14.132,16.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:18.63,23.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:23.16,25.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.2,27.78 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:27.78,29.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/change_status.go:30.2,30.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:37.26,45.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:47.70,49.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:49.16,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:53.2,54.47 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:54.47,60.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:60.17,62.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.8,63.23 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:63.23,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:67.2,68.47 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:68.47,74.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:74.17,76.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.8,77.23 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:77.23,79.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/check_liquidity.go:81.2,81.12 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:26.19,30.53 3 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:30.53,32.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:34.2,37.65 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:37.65,39.4 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:41.2,41.12 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:41.12,43.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:44.2,44.33 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:60.9,65.16 4 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:65.16,67.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:68.2,68.30 1 25 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:68.30,69.78 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:69.78,71.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:72.8,74.3 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:76.2,77.16 2 24 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:77.16,79.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:80.2,81.16 2 23 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:81.16,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:84.2,85.16 2 22 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:85.16,87.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:88.2,88.12 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:91.111,92.41 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:92.41,94.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:95.2,95.9 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:96.57,98.10 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:98.10,100.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:101.3,102.44 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:103.10,104.88 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:111.9,113.16 2 22 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:113.16,115.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:116.2,117.16 2 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:117.16,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:120.2,122.36 3 20 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:122.36,124.3 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/common.go:124.8,126.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:27.38,29.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:31.100,33.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:33.16,35.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:36.2,36.24 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:36.24,38.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:39.2,40.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:43.2,46.16 4 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:46.16,48.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:50.2,51.16 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:54.2,55.16 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:55.16,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/generate_default_credentials.go:59.2,70.12 3 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:18.21,20.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_configuration.go:28.77,38.2 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:13.85,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:17.101,20.71 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:20.71,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/get_providers.go:23.2,23.23 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:19.17,22.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:24.105,25.71 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:25.71,27.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:28.2,28.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:31.107,33.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:35.83,37.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:39.103,41.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/login.go:43.89,45.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:18.142,20.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:22.100,25.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:25.16,27.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.2,28.31 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:28.31,30.109 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:30.109,32.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/penalization_alert.go:34.2,34.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:25.21,33.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:41.90,62.54 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:62.54,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.8,64.68 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:64.68,66.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.8,66.69 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:66.69,68.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/provider_detail.go:70.2,70.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:16.132,18.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:36.102,43.54 6 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:43.54,45.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.2,47.63 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:47.63,49.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.2,50.65 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:50.65,52.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.2,54.61 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:54.61,56.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:58.2,60.54 3 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:60.54,62.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.8,62.23 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:62.23,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:66.2,68.54 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:68.54,70.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.8,70.23 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:70.23,72.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:74.2,75.53 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:78.149,82.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:84.81,88.87 3 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:88.87,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.2,91.107 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:91.107,93.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.2,94.114 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:94.114,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:97.2,101.8 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:104.83,107.116 3 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:107.116,109.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.2,111.118 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:111.118,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:115.2,118.8 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:121.139,125.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:127.142,130.85 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:130.85,132.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:132.8,134.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:137.104,139.55 2 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:139.55,141.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.8,141.35 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:141.35,143.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:144.2,144.12 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:151.17,153.130 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:153.130,155.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:156.2,158.138 3 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:158.138,160.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:160.8,162.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:169.17,171.133 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:171.133,173.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:174.2,176.145 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:176.145,178.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/registration.go:178.8,180.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:14.120,16.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:18.43,22.16 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.2,26.62 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:26.62,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/resign.go:29.2,29.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:27.26,35.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:37.133,38.74 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:38.74,40.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:42.2,43.89 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:43.89,45.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:47.2,48.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:48.16,50.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:51.2,52.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:52.16,54.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:56.2,63.16 3 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:63.16,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:66.2,66.86 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:66.86,68.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:69.2,69.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:72.116,74.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:76.92,78.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:80.112,82.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_credentials.go:84.98,86.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:20.28,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:24.120,26.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:29.2,30.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:30.16,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_general_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:20.26,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:24.116,26.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:29.2,30.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:30.16,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegin_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:20.27,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:24.118,26.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 diff --git a/internal/adapters/dataproviders/rootstock/bridge.go b/internal/adapters/dataproviders/rootstock/bridge.go index 1f67bd9b..e7daa547 100644 --- a/internal/adapters/dataproviders/rootstock/bridge.go +++ b/internal/adapters/dataproviders/rootstock/bridge.go @@ -22,21 +22,25 @@ type rskBridgeImpl struct { retryParams RetryParams } +type RskBridgeConfig struct { + Address string + RequiredConfirmations uint64 + IrisActivationHeight int64 + ErpKeys []string +} + func NewRskBridgeImpl( - address string, - requiredConfirmations uint64, - irisActivationHeight int64, - erpKeys []string, + config RskBridgeConfig, contract RskBridgeBinding, client *RskClient, btcParams *chaincfg.Params, retryParams RetryParams, ) blockchain.RootstockBridge { return &rskBridgeImpl{ - address: address, - requiredConfirmations: requiredConfirmations, - irisActivationHeight: irisActivationHeight, - erpKeys: erpKeys, + address: config.Address, + requiredConfirmations: config.RequiredConfirmations, + irisActivationHeight: config.IrisActivationHeight, + erpKeys: config.ErpKeys, contract: contract, client: client.client, btcParams: btcParams, diff --git a/internal/adapters/dataproviders/rootstock/bridge_test.go b/internal/adapters/dataproviders/rootstock/bridge_test.go index 75b796b1..a82ccf52 100644 --- a/internal/adapters/dataproviders/rootstock/bridge_test.go +++ b/internal/adapters/dataproviders/rootstock/bridge_test.go @@ -19,12 +19,12 @@ import ( var dummyClient = rootstock.NewRskClient(nil) func TestRskBridgeImpl_GetAddress(t *testing.T) { - bridge := rootstock.NewRskBridgeImpl(test.AnyAddress, 0, 0, nil, nil, dummyClient, nil, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{Address: test.AnyAddress}, nil, dummyClient, nil, rootstock.RetryParams{}) assert.Equal(t, test.AnyAddress, bridge.GetAddress()) } func TestRskBridgeImpl_GetRequiredTxConfirmations(t *testing.T) { - bridge := rootstock.NewRskBridgeImpl("", 10, 0, nil, nil, dummyClient, nil, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{RequiredConfirmations: 10}, nil, dummyClient, nil, rootstock.RetryParams{}) assert.Equal(t, uint64(10), bridge.GetRequiredTxConfirmations()) } @@ -32,7 +32,7 @@ func TestRskBridgeImpl_GetFedAddress(t *testing.T) { t.Run("Success", func(t *testing.T) { bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetFederationAddress", mock.Anything).Return(test.AnyAddress, nil) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) result, err := bridge.GetFedAddress() assert.Equal(t, test.AnyAddress, result) require.NoError(t, err) @@ -41,7 +41,7 @@ func TestRskBridgeImpl_GetFedAddress(t *testing.T) { t.Run("Error handling on GetFederationAddress call fail", func(t *testing.T) { bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetFederationAddress", mock.Anything).Return("", assert.AnError) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) result, err := bridge.GetFedAddress() assert.Empty(t, result) require.Error(t, err) @@ -52,7 +52,7 @@ func TestRskBridgeImpl_GetMinimumLockTxValue(t *testing.T) { t.Run("Success", func(t *testing.T) { bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetMinimumLockTxValue", mock.Anything).Return(big.NewInt(5), nil) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) result, err := bridge.GetMinimumLockTxValue() assert.IsType(t, &entities.Wei{}, result) assert.Equal(t, entities.NewWei(50000000000), result) @@ -62,7 +62,7 @@ func TestRskBridgeImpl_GetMinimumLockTxValue(t *testing.T) { t.Run("Error handling on GetMinimumLockTxValue call fail", func(t *testing.T) { bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetMinimumLockTxValue", mock.Anything).Return(nil, assert.AnError) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, nil, rootstock.RetryParams{}) result, err := bridge.GetMinimumLockTxValue() assert.Nil(t, result) require.Error(t, err) @@ -95,7 +95,7 @@ func TestRskBridgeImpl_GetFlyoverDerivationAddress(t *testing.T) { redeemScriptBytes, testError = hex.DecodeString(redeemScriptString) require.NoError(t, testError) bridgeMock.On("GetActivePowpegRedeemScript", mock.Anything).Return(redeemScriptBytes, nil) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) result, testError = bridge.GetFlyoverDerivationAddress(args) assert.Equal(t, blockchain.FlyoverDerivation{ Address: "2Mx7jaPHtsgJTbqGnjU5UqBpkekHgfigXay", @@ -109,7 +109,7 @@ func TestRskBridgeImpl_GetFlyoverDerivationAddress(t *testing.T) { var result blockchain.FlyoverDerivation bridgeMock := &mocks.RskBridgeBindingMock{} bridgeMock.On("GetActivePowpegRedeemScript", mock.Anything).Return(nil, assert.AnError) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) result, testError = bridge.GetFlyoverDerivationAddress(args) assert.Empty(t, result) require.ErrorContains(t, testError, "error retreiving fed redeem script from bridge") @@ -125,7 +125,9 @@ func TestRskBridgeImpl_FetchFederationInfo(t *testing.T) { bridgeMock.On("GetFederationThreshold", mock.Anything).Return(big.NewInt(5), nil).Once() bridgeMock.On("GetFederationAddress", mock.Anything).Return(test.AnyAddress, nil).Once() bridgeMock.On("GetActiveFederationCreationBlockHeight", mock.Anything).Return(big.NewInt(500), nil).Once() - bridge := rootstock.NewRskBridgeImpl("", 0, 100, []string{"key1", "key2", "key3"}, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100, ErpKeys: []string{"key1", "key2", "key3"}}, + bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) fedInfo, err := bridge.FetchFederationInfo() require.NoError(t, err) assert.Equal(t, blockchain.FederationInfo{ @@ -144,7 +146,7 @@ func TestRskBridgeImpl_FetchFederationInfo(t *testing.T) { for _, setUp := range fetchFedInfoErrorSetUps() { bridgeMock := &mocks.RskBridgeBindingMock{} setUp(bridgeMock) - bridge := rootstock.NewRskBridgeImpl("", 0, 100, nil, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) + bridge := rootstock.NewRskBridgeImpl(rootstock.RskBridgeConfig{IrisActivationHeight: 100}, bridgeMock, dummyClient, &chaincfg.TestNet3Params, rootstock.RetryParams{}) result, err := bridge.FetchFederationInfo() require.Error(t, err) assert.Empty(t, result) diff --git a/internal/configuration/registry/rootstock.go b/internal/configuration/registry/rootstock.go index 4f7d5ffd..3c339677 100644 --- a/internal/configuration/registry/rootstock.go +++ b/internal/configuration/registry/rootstock.go @@ -46,10 +46,12 @@ func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, a return &Rootstock{ Contracts: blockchain.RskContracts{ Bridge: rootstock.NewRskBridgeImpl( - env.BridgeAddress, - env.BridgeRequiredConfirmations, - env.IrisActivationHeight, - env.ErpKeys, + rootstock.RskBridgeConfig{ + Address: env.BridgeAddress, + RequiredConfirmations: env.BridgeRequiredConfirmations, + IrisActivationHeight: env.IrisActivationHeight, + ErpKeys: env.ErpKeys, + }, bridge, client, bitcoinConn.NetworkParams, From db0de8f986261c6bb1379c72fc8dbd1070c6db54 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 23 Apr 2024 12:53:03 +0200 Subject: [PATCH 049/113] test: add event bus & local provider tests --- .mockery.yaml | 9 +- internal/adapters/dataproviders/event.go | 45 +- internal/adapters/dataproviders/event_test.go | 156 +++++ .../dataproviders/liquidity_provider.go | 3 +- .../dataproviders/liquidity_provider_test.go | 461 ++++++++++++++ .../dataproviders/rootstock/account_test.go | 18 +- .../dataproviders/rootstock/wallet_test.go | 20 +- internal/entities/blockchain/lbc_test.go | 7 +- .../usecases/watcher/clean_exipred_test.go | 11 +- .../watcher/get_watched_pegin_quote_test.go | 11 +- .../watcher/get_watched_pegout_quote_test.go | 19 +- test/mocks/bitcoin_wallet_mock.go | 405 ++++++++++++ test/mocks/pegin_quote_repository_mock.go | 433 ++++++++++++- test/mocks/pegout_quote_repository_mock.go | 590 ++++++++++++++++-- test/utils.go | 32 +- 15 files changed, 2073 insertions(+), 147 deletions(-) create mode 100644 internal/adapters/dataproviders/event_test.go create mode 100644 internal/adapters/dataproviders/liquidity_provider_test.go create mode 100644 test/mocks/bitcoin_wallet_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index 82c8fdce..b918f607 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -24,4 +24,11 @@ packages: DefaultCredentialsProvider: github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider: interfaces: - LiquidityProviderRepository: \ No newline at end of file + LiquidityProviderRepository: + github.com/rsksmart/liquidity-provider-server/internal/entities/quote: + interfaces: + PeginQuoteRepository: + PegoutQuoteRepository: + github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain: + interfaces: + BitcoinWallet: \ No newline at end of file diff --git a/internal/adapters/dataproviders/event.go b/internal/adapters/dataproviders/event.go index aa582862..68161315 100644 --- a/internal/adapters/dataproviders/event.go +++ b/internal/adapters/dataproviders/event.go @@ -8,13 +8,16 @@ import ( var ( singletonLock = &sync.Mutex{} - eventBusSingleton *localEventBus + eventBusSingleton *LocalEventBus ) -const subscriptionBufferSize = 20 +const ( + subscriptionBufferSize = 20 + closedBusMessage = "Trying to interact with closed bus" +) -type localEventBus struct { - topics map[entities.EventId][]chan<- entities.Event +type LocalEventBus struct { + Topics map[entities.EventId][]chan<- entities.Event subscribeMutex sync.Mutex publishMutex sync.Mutex } @@ -26,40 +29,56 @@ func NewLocalEventBus() entities.EventBus { // we need to check if it still not created after the getting into the critical section if eventBusSingleton == nil { topics := make(map[entities.EventId][]chan<- entities.Event) - eventBusSingleton = &localEventBus{topics: topics} + eventBusSingleton = &LocalEventBus{Topics: topics} } } return eventBusSingleton } -func (bus *localEventBus) Subscribe(id entities.EventId) <-chan entities.Event { +func (bus *LocalEventBus) Subscribe(id entities.EventId) <-chan entities.Event { + if eventBusSingleton == nil { + log.Error(closedBusMessage) + return nil + } var topics []chan<- entities.Event var ok bool bus.subscribeMutex.Lock() defer bus.subscribeMutex.Unlock() - if topics, ok = bus.topics[id]; !ok { + if topics, ok = bus.Topics[id]; !ok { topics = make([]chan<- entities.Event, 0) - bus.topics[id] = topics + bus.Topics[id] = topics } subscription := make(chan entities.Event, subscriptionBufferSize) - bus.topics[id] = append(topics, subscription) + bus.Topics[id] = append(topics, subscription) return subscription } -func (bus *localEventBus) Shutdown(closeChannel chan<- bool) { - for _, topic := range bus.topics { +func (bus *LocalEventBus) Shutdown(closeChannel chan<- bool) { + if eventBusSingleton == nil { + log.Error(closedBusMessage) + return + } + for key, topic := range bus.Topics { for _, subscription := range topic { close(subscription) } + delete(bus.Topics, key) } + singletonLock.Lock() + defer singletonLock.Unlock() + eventBusSingleton = nil closeChannel <- true log.Debug("Event bus shut down") } -func (bus *localEventBus) Publish(event entities.Event) { +func (bus *LocalEventBus) Publish(event entities.Event) { + if eventBusSingleton == nil { + log.Error(closedBusMessage) + return + } bus.publishMutex.Lock() defer bus.publishMutex.Unlock() - topic, ok := bus.topics[event.Id()] + topic, ok := bus.Topics[event.Id()] if !ok { return } diff --git a/internal/adapters/dataproviders/event_test.go b/internal/adapters/dataproviders/event_test.go new file mode 100644 index 00000000..703bac29 --- /dev/null +++ b/internal/adapters/dataproviders/event_test.go @@ -0,0 +1,156 @@ +package dataproviders_test + +import ( + "bytes" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "sync" + "testing" + "time" +) + +const testEventId entities.EventId = "test_event" + +type testEvent struct { + entities.Event +} + +func TestNewLocalEventBus(t *testing.T) { + bus1 := dataproviders.NewLocalEventBus() + bus2 := dataproviders.NewLocalEventBus() + t.Run("Should always return the same bus", func(t *testing.T) { + assert.NotNil(t, bus1) + assert.Same(t, bus1, bus2) + }) + t.Run("Should initialize topics", func(t *testing.T) { + assert.NotNil(t, bus1.(*dataproviders.LocalEventBus).Topics) + }) +} + +func TestLocalEventBus_Shutdown(t *testing.T) { + t.Run("Should send signal to close channel after closing", func(t *testing.T) { + bus1 := dataproviders.NewLocalEventBus() + closeChannel := make(chan bool, 1) + bus1.Shutdown(closeChannel) + select { + case result := <-closeChannel: + assert.True(t, result) + default: + assert.Fail(t, "Channel was not closed") + } + }) + + t.Run("Should clear topic map", func(t *testing.T) { + bus := dataproviders.NewLocalEventBus() + _ = bus.Subscribe(testEventId) + assert.Len(t, bus.(*dataproviders.LocalEventBus).Topics, 1) + closeChannel := make(chan bool, 1) + bus.Shutdown(closeChannel) + select { + case <-closeChannel: + assert.Empty(t, bus.(*dataproviders.LocalEventBus).Topics) + default: + assert.Fail(t, "Channel was not closed") + } + }) + + t.Run("Should not allow to interact after closed", func(t *testing.T) { + const expectedBuff = "Trying to interact with closed bus" + message := make([]byte, 100) + buff := new(bytes.Buffer) + log.SetOutput(buff) + bus := dataproviders.NewLocalEventBus() + closeChannel := make(chan bool, 1) + bus.Shutdown(closeChannel) + select { + case <-closeChannel: + assert.Empty(t, bus.(*dataproviders.LocalEventBus).Topics) + default: + assert.Fail(t, "Channel was not closed") + } + require.NotPanics(t, func() { + result := bus.Subscribe(testEventId) + assert.Nil(t, result) + _, err := buff.Read(message) + require.NoError(t, err) + assert.Contains(t, string(message), expectedBuff) + }) + require.NotPanics(t, func() { + bus.Publish(testEvent{}) + _, err := buff.Read(message) + require.NoError(t, err) + assert.Contains(t, string(message), expectedBuff) + }) + require.NotPanics(t, func() { + bus.Shutdown(make(chan bool)) + _, err := buff.Read(message) + require.NoError(t, err) + assert.Contains(t, string(message), expectedBuff) + }) + }) +} + +func TestLocalEventBus_Subscribe(t *testing.T) { + bus := dataproviders.NewLocalEventBus() + firstSub := bus.Subscribe(testEventId) + secondSub := bus.Subscribe(testEventId) + t.Run("Should create one channel per subscription", func(t *testing.T) { + assert.NotEqual(t, firstSub, secondSub) + assert.Len(t, bus.(*dataproviders.LocalEventBus).Topics[testEventId], 2) + }) +} + +func TestLocalEventBus_Publish(t *testing.T) { + t.Run("Should send message to every subscription", func(t *testing.T) { + assert.Eventually(t, func() bool { + var wg sync.WaitGroup + wg.Add(2) + bus := dataproviders.NewLocalEventBus() + sub1 := bus.Subscribe(testEventId) + sub2 := bus.Subscribe(testEventId) + event := testEvent{entities.NewBaseEvent(testEventId)} + bus.Publish(event) + go func() { + assert.Equal(t, event, <-sub1) + wg.Done() + }() + go func() { + assert.Equal(t, event, <-sub2) + wg.Done() + }() + wg.Wait() + return true + }, time.Second*1, time.Millisecond*10) + }) + t.Run("Should not send message to other subscriptions", func(t *testing.T) { + bus := dataproviders.NewLocalEventBus() + sub1 := bus.Subscribe(testEventId) + sub2 := bus.Subscribe(testEventId + "-copy") + event := testEvent{entities.NewBaseEvent(testEventId)} + bus.Publish(event) + assert.Equal(t, event, <-sub1) + select { + case <-sub2: + assert.Fail(t, "Should not receive message") + default: + } + }) + t.Run("Should not send message on non existing event", func(t *testing.T) { + const errorMessage = "Should not receive message" + bus := dataproviders.NewLocalEventBus() + sub1 := bus.Subscribe(testEventId) + sub2 := bus.Subscribe(testEventId) + event := testEvent{entities.NewBaseEvent(testEventId + "-other")} + bus.Publish(event) + select { + case <-sub2: + assert.Fail(t, errorMessage) + case <-sub1: + assert.Fail(t, errorMessage) + default: + } + }) +} diff --git a/internal/adapters/dataproviders/liquidity_provider.go b/internal/adapters/dataproviders/liquidity_provider.go index 646e87df..cfd2cf15 100644 --- a/internal/adapters/dataproviders/liquidity_provider.go +++ b/internal/adapters/dataproviders/liquidity_provider.go @@ -14,6 +14,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases" log "github.com/sirupsen/logrus" + "strings" ) type LocalLiquidityProvider struct { @@ -47,7 +48,7 @@ func NewLocalLiquidityProvider( } func (lp *LocalLiquidityProvider) RskAddress() string { - return lp.signer.Address().String() + return strings.ToLower(lp.signer.Address().String()) } func (lp *LocalLiquidityProvider) BtcAddress() string { diff --git a/internal/adapters/dataproviders/liquidity_provider_test.go b/internal/adapters/dataproviders/liquidity_provider_test.go new file mode 100644 index 00000000..6a1f773c --- /dev/null +++ b/internal/adapters/dataproviders/liquidity_provider_test.go @@ -0,0 +1,461 @@ +package dataproviders_test + +import ( + "bytes" + "context" + "encoding/hex" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "io" + "math/big" + "strings" + "testing" +) + +const ( + rskTestAddress = "0x7c292eb881fd15605f7a85c24f4909381d36c3b9" + quoteHash = "5f677ed167ea3af1205ee45c64bf9883338ba9ae51f2d4e1ada949ebbff7d179" +) + +func TestLocalLiquidityProvider_BtcAddress(t *testing.T) { + btcWallet := new(mocks.BitcoinWalletMock) + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{}, nil, btcWallet, blockchain.RskContracts{}) + btcWallet.On("Address").Return(test.AnyAddress) + assert.Equal(t, test.AnyAddress, lp.BtcAddress()) +} + +func TestLocalLiquidityProvider_RskAddress(t *testing.T) { + signer := new(mocks.TransactionSignerMock) + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{}, signer, nil, blockchain.RskContracts{}) + signer.On("Address").Return(common.HexToAddress(rskTestAddress)) + assert.Equal(t, strings.ToLower(rskTestAddress), lp.RskAddress()) +} + +func TestLocalLiquidityProvider_SignQuote(t *testing.T) { + const ( + signatureBeforeSum = "ce55f807c9f533bdf58b0bfd072dadfdd443cb521aef104f4d4014dcf4da7db418d142dfa0a26edbd169930189ed1a23b9bd8e09c7b01f3832e26fc7855f89a900" + signatureAfterSum = "ce55f807c9f533bdf58b0bfd072dadfdd443cb521aef104f4d4014dcf4da7db418d142dfa0a26edbd169930189ed1a23b9bd8e09c7b01f3832e26fc7855f89a91b" + ) + var buffer bytes.Buffer + hashBytes, err := hex.DecodeString(quoteHash) + require.NoError(t, err) + buffer.WriteString("\x19Ethereum Signed Message:\n32") + buffer.Write(hashBytes) + signer := new(mocks.TransactionSignerMock) + signatureBytes, err := hex.DecodeString(signatureBeforeSum) + require.NoError(t, err) + signer.On("SignBytes", mock.MatchedBy(func(content []byte) bool { + return bytes.Equal(content, crypto.Keccak256(buffer.Bytes())) + })).Return(signatureBytes, nil) + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{}, signer, nil, blockchain.RskContracts{}) + result, err := lp.SignQuote(quoteHash) + signer.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, signatureAfterSum, result) +} + +func TestLocalLiquidityProvider_SignQuote_ErrorHandling(t *testing.T) { + t.Run("Invalid hash", func(t *testing.T) { + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + result, err := lp.SignQuote(test.AnyString) + require.Error(t, err) + assert.Empty(t, result) + }) + t.Run("Signing error", func(t *testing.T) { + signer := new(mocks.TransactionSignerMock) + signer.On("SignBytes", mock.Anything).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{}, signer, nil, blockchain.RskContracts{}) + result, err := lp.SignQuote(quoteHash) + require.Error(t, err) + assert.Empty(t, result) + }) +} + +func TestLocalLiquidityProvider_HasPegoutLiquidity(t *testing.T) { + pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) + pegoutRepository.On("GetRetainedQuoteByState", test.AnyCtx, + quote.PegoutStateWaitingForDeposit, + quote.PegoutStateWaitingForDepositConfirmations, + quote.PegoutStateSendPegoutFailed, + ).Return([]quote.RetainedPegoutQuote{ + {RequiredLiquidity: entities.NewWei(100)}, + {RequiredLiquidity: entities.NewWei(200)}, + {RequiredLiquidity: entities.NewWei(150)}, + }, nil).Times(3) + btcWallet := new(mocks.BitcoinWalletMock) + btcWallet.On("GetBalance").Return(entities.NewWei(500), nil).Times(3) + lp := dataproviders.NewLocalLiquidityProvider(nil, pegoutRepository, nil, blockchain.Rpc{}, nil, btcWallet, blockchain.RskContracts{}) + testCases := []struct { + amount *entities.Wei + expectedError string + }{ + {amount: entities.NewWei(50), expectedError: ""}, + {amount: entities.NewWei(150), expectedError: "not enough liquidity"}, + {amount: entities.NewWei(20), expectedError: ""}, + } + for _, tc := range testCases { + err := lp.HasPegoutLiquidity(context.Background(), tc.amount) + if tc.expectedError == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + assert.Contains(t, err.Error(), tc.expectedError) + } + } + btcWallet.AssertExpectations(t) + pegoutRepository.AssertExpectations(t) +} + +func TestLocalLiquidityProvider_HasPegoutLiquidity_ErrorHandling(t *testing.T) { + t.Run("Error getting btc wallet balance", func(t *testing.T) { + btcWallet := new(mocks.BitcoinWalletMock) + btcWallet.On("GetBalance").Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{}, nil, btcWallet, blockchain.RskContracts{}) + err := lp.HasPegoutLiquidity(context.Background(), entities.NewWei(1)) + require.Error(t, err) + }) + t.Run("Error getting pegout quotes from db", func(t *testing.T) { + pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) + pegoutRepository.On("GetRetainedQuoteByState", test.AnyCtx, + quote.PegoutStateWaitingForDeposit, + quote.PegoutStateWaitingForDepositConfirmations, + quote.PegoutStateSendPegoutFailed, + ).Return(nil, assert.AnError).Times(3) + btcWallet := new(mocks.BitcoinWalletMock) + btcWallet.On("GetBalance").Return(entities.NewWei(500), nil).Times(3) + lp := dataproviders.NewLocalLiquidityProvider(nil, pegoutRepository, nil, blockchain.Rpc{}, nil, btcWallet, blockchain.RskContracts{}) + err := lp.HasPegoutLiquidity(context.Background(), entities.NewWei(1)) + require.Error(t, err) + }) +} + +func TestLocalLiquidityProvider_HasPeginLiquidity(t *testing.T) { + signer := new(mocks.TransactionSignerMock) + signer.On("Address").Return(common.HexToAddress(rskTestAddress)).Times(6) + peginRepository := new(mocks.PeginQuoteRepositoryMock) + peginRepository.On("GetRetainedQuoteByState", test.AnyCtx, + quote.PeginStateWaitingForDeposit, + quote.PeginStateCallForUserFailed, + ).Return([]quote.RetainedPeginQuote{ + {RequiredLiquidity: entities.NewWei(100)}, + {RequiredLiquidity: entities.NewWei(200)}, + {RequiredLiquidity: entities.NewWei(150)}, + }, nil).Times(3) + lbcMock := new(mocks.LbcMock) + lbcMock.On("GetBalance", rskTestAddress).Return(entities.NewWei(200), nil).Times(3) + rpcMock := new(mocks.RskRpcMock) + rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(entities.NewWei(300), nil).Times(3) + lp := dataproviders.NewLocalLiquidityProvider(peginRepository, nil, nil, blockchain.Rpc{Rsk: rpcMock}, signer, nil, blockchain.RskContracts{Lbc: lbcMock}) + testCases := []struct { + amount *entities.Wei + expectedError string + }{ + {amount: entities.NewWei(50), expectedError: ""}, + {amount: entities.NewWei(150), expectedError: "not enough liquidity"}, + {amount: entities.NewWei(20), expectedError: ""}, + } + for _, tc := range testCases { + err := lp.HasPeginLiquidity(context.Background(), tc.amount) + if tc.expectedError == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + assert.Contains(t, err.Error(), tc.expectedError) + } + } + lbcMock.AssertExpectations(t) + rpcMock.AssertExpectations(t) + peginRepository.AssertExpectations(t) + signer.AssertExpectations(t) +} + +func TestLocalLiquidityProvider_HasPeginLiquidity_ErrorHandling(t *testing.T) { + signer := new(mocks.TransactionSignerMock) + signer.On("Address").Return(common.HexToAddress(rskTestAddress)) + t.Run("Error getting balance from RSK RPC server", func(t *testing.T) { + rpcMock := new(mocks.RskRpcMock) + rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{Rsk: rpcMock}, signer, nil, blockchain.RskContracts{}) + err := lp.HasPeginLiquidity(context.Background(), entities.NewWei(1)) + require.Error(t, err) + }) + t.Run("Error getting balance from LBC", func(t *testing.T) { + rpcMock := new(mocks.RskRpcMock) + rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(entities.NewWei(100), nil).Once() + lbcMock := new(mocks.LbcMock) + lbcMock.On("GetBalance", rskTestAddress).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{Rsk: rpcMock}, signer, nil, blockchain.RskContracts{Lbc: lbcMock}) + err := lp.HasPeginLiquidity(context.Background(), entities.NewWei(1)) + require.Error(t, err) + }) + t.Run("Error pegin quotes from db", func(t *testing.T) { + rpcMock := new(mocks.RskRpcMock) + rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(entities.NewWei(100), nil).Once() + lbcMock := new(mocks.LbcMock) + lbcMock.On("GetBalance", rskTestAddress).Return(entities.NewWei(200), nil).Once() + peginRepository := new(mocks.PeginQuoteRepositoryMock) + peginRepository.On("GetRetainedQuoteByState", test.AnyCtx, + quote.PeginStateWaitingForDeposit, + quote.PeginStateCallForUserFailed, + ).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(peginRepository, nil, nil, blockchain.Rpc{Rsk: rpcMock}, signer, nil, blockchain.RskContracts{Lbc: lbcMock}) + err := lp.HasPeginLiquidity(context.Background(), entities.NewWei(1)) + require.Error(t, err) + }) +} + +func TestLocalLiquidityProvider_GeneralConfiguration(t *testing.T) { + message := make([]byte, 1024) + account := test.OpenWalletForTest(t, "general-configuration") + wallet := rootstock.NewRskWalletImpl(&rootstock.RskClient{}, account, 31) + lpRepository := new(mocks.LiquidityProviderRepositoryMock) + buff := new(bytes.Buffer) + log.SetOutput(buff) + t.Run("Return signed general configuration from db", func(t *testing.T) { + lpRepository.On("GetGeneralConfiguration", test.AnyCtx).Return(getGeneralConfigurationMock(), nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.GeneralConfiguration(context.Background()) + assert.Equal(t, getGeneralConfigurationMock().Value, result) + _, err := buff.Read(message) + require.ErrorIs(t, err, io.EOF) + assert.NotEqual(t, liquidity_provider.DefaultGeneralConfiguration(), result) + }) + t.Run("Return default general configuration on db read error", func(t *testing.T) { + lpRepository.On("GetGeneralConfiguration", test.AnyCtx).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + config := lp.GeneralConfiguration(context.Background()) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Error getting general configuration") + assert.Equal(t, liquidity_provider.DefaultGeneralConfiguration(), config) + }) + t.Run("Return default general configuration when db doesn't have configuration", func(t *testing.T) { + lpRepository.On("GetGeneralConfiguration", test.AnyCtx).Return(nil, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + config := lp.GeneralConfiguration(context.Background()) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Custom general configuration not found") + assert.Equal(t, liquidity_provider.DefaultGeneralConfiguration(), config) + }) + t.Run("Return default general configuration when db configuration is tampered", func(t *testing.T) { + tamperedConfig := getGeneralConfigurationMock() + tamperedConfig.Value.RskConfirmations[2000000000000000000] = 40 + lpRepository.On("GetGeneralConfiguration", test.AnyCtx).Return(tamperedConfig, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.GeneralConfiguration(context.Background()) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Tampered general configuration") + assert.Equal(t, liquidity_provider.DefaultGeneralConfiguration(), result) + }) + t.Run("Return default general configuration when db configuration doesn't have valid signature", func(t *testing.T) { + invalidSignatureConfig := getGeneralConfigurationMock() + invalidSignatureConfig.Signature = "94530cf2d078ce7e44b4ce1d63a0cf7a225f07d4414f4dcf132f097fd027c08c7252b012ffff6855400fbc96939662904b22ce0b7a010bcb0b7a2c7db9dc26b702" + lpRepository.On("GetGeneralConfiguration", test.AnyCtx).Return(invalidSignatureConfig, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.GeneralConfiguration(context.Background()) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Invalid general configuration signature") + assert.Equal(t, liquidity_provider.DefaultGeneralConfiguration(), result) + }) +} + +func TestLocalLiquidityProvider_PeginConfiguration(t *testing.T) { + message := make([]byte, 1024) + account := test.OpenWalletForTest(t, "pegin-configuration") + wallet := rootstock.NewRskWalletImpl(&rootstock.RskClient{}, account, 31) + lpRepository := new(mocks.LiquidityProviderRepositoryMock) + buff := new(bytes.Buffer) + log.SetOutput(buff) + t.Run("Return signed pegin configuration from db", func(t *testing.T) { + lpRepository.On("GetPeginConfiguration", test.AnyCtx).Return(getPeginConfigurationMock(), nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.PeginConfiguration(context.Background()) + assert.Equal(t, getPeginConfigurationMock().Value, result) + _, err := buff.Read(message) + require.ErrorIs(t, err, io.EOF) + assert.NotEqual(t, liquidity_provider.DefaultPeginConfiguration(), result) + }) + t.Run("Return default pegin configuration on db read error", func(t *testing.T) { + lpRepository.On("GetPeginConfiguration", test.AnyCtx).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + config := lp.PeginConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPeginConfiguration(), config) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Error getting pegin configuration") + }) + t.Run("Return default pegin configuration when db doesn't have configuration", func(t *testing.T) { + lpRepository.On("GetPeginConfiguration", test.AnyCtx).Return(nil, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + config := lp.PeginConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPeginConfiguration(), config) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Custom pegin configuration not found") + }) + t.Run("Return default pegin configuration when db configuration is tampered", func(t *testing.T) { + tamperedConfig := getPeginConfigurationMock() + tamperedConfig.Value.MinValue = entities.NewWei(1) + lpRepository.On("GetPeginConfiguration", test.AnyCtx).Return(tamperedConfig, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.PeginConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPeginConfiguration(), result) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Tampered pegin configuration") + }) + t.Run("Return default pegin configuration when db configuration doesn't have valid signature", func(t *testing.T) { + invalidSignatureConfig := getPeginConfigurationMock() + invalidSignatureConfig.Signature = "93530cf2d078ce7e44c4ce1d63a0cf7a225f07d4414f4dcf132f097fd027c08c7252b012f1ff6855400fbc96939662904b22ce0b7a010bcb0b7a2c7db9dc26b702" + lpRepository.On("GetPeginConfiguration", test.AnyCtx).Return(invalidSignatureConfig, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.PeginConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPeginConfiguration(), result) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Invalid pegin configuration signature") + }) +} + +func TestLocalLiquidityProvider_PegoutConfiguration(t *testing.T) { + message := make([]byte, 1024) + account := test.OpenWalletForTest(t, "pegout-configuration") + lpRepository := new(mocks.LiquidityProviderRepositoryMock) + wallet := rootstock.NewRskWalletImpl(&rootstock.RskClient{}, account, 31) + buff := new(bytes.Buffer) + log.SetOutput(buff) + t.Run("Return signed pegout configuration from db", func(t *testing.T) { + lpRepository.On("GetPegoutConfiguration", test.AnyCtx).Return(getPegoutConfigurationMock(), nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.PegoutConfiguration(context.Background()) + assert.Equal(t, getPegoutConfigurationMock().Value, result) + _, err := buff.Read(message) + require.ErrorIs(t, err, io.EOF) + assert.NotEqual(t, liquidity_provider.DefaultPegoutConfiguration(), result) + }) + t.Run("Return default pegout configuration on db read error", func(t *testing.T) { + lpRepository.On("GetPegoutConfiguration", test.AnyCtx).Return(nil, assert.AnError).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + config := lp.PegoutConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPegoutConfiguration(), config) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Error getting pegout configuration") + }) + t.Run("Return default pegout configuration when db doesn't have configuration", func(t *testing.T) { + lpRepository.On("GetPegoutConfiguration", test.AnyCtx).Return(nil, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, nil, nil, blockchain.RskContracts{}) + config := lp.PegoutConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPegoutConfiguration(), config) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Custom pegout configuration not found") + }) + t.Run("Return default pegout configuration when db configuration is tampered", func(t *testing.T) { + tamperedConfig := getPegoutConfigurationMock() + tamperedConfig.Value.MaxValue = entities.NewWei(1) + lpRepository.On("GetPegoutConfiguration", test.AnyCtx).Return(tamperedConfig, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.PegoutConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPegoutConfiguration(), result) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Tampered pegout configuration") + }) + t.Run("Return default pegout configuration when db configuration doesn't have valid signature", func(t *testing.T) { + invalidSignatureConfig := getPegoutConfigurationMock() + invalidSignatureConfig.Signature = "93530cf2d078ce7e44c4ce1d63a0cf7a225f07d4414f4dcf133f097fd027d08c7252b012f1ff6855400fbc96939662904b22ce0b7a010bcb0b7a2c7db9dc26b702" + lpRepository.On("GetPegoutConfiguration", test.AnyCtx).Return(invalidSignatureConfig, nil).Once() + lp := dataproviders.NewLocalLiquidityProvider(nil, nil, lpRepository, blockchain.Rpc{}, wallet, nil, blockchain.RskContracts{}) + result := lp.PegoutConfiguration(context.Background()) + assert.Equal(t, liquidity_provider.DefaultPegoutConfiguration(), result) + _, err := buff.Read(message) + buff.Reset() + require.NoError(t, err) + assert.Contains(t, string(message), "Invalid pegout configuration signature") + }) +} + +func getGeneralConfigurationMock() *entities.Signed[liquidity_provider.GeneralConfiguration] { + return &entities.Signed[liquidity_provider.GeneralConfiguration]{ + Value: liquidity_provider.GeneralConfiguration{ + RskConfirmations: liquidity_provider.ConfirmationsPerAmount{ + 2000000000000000000: 15, + 400000000000000000: 10, + 4000000000000000000: 20, + 8000000000000000000: 25, + 9000000000000000000: 30, + 100000000000000000: 5, + }, + BtcConfirmations: liquidity_provider.ConfirmationsPerAmount{ + 100000000000000000: 2, + 2000000000000000000: 10, + 400000000000000000: 6, + 4000000000000000000: 20, + 8000000000000000000: 40, + 9000000000000000001: 45, + }, + }, + Signature: "93530cf2d078ce7e44b4ce1d63a0cf7a224f07d4414f4dcf132f097fd027c08c7252b012ffff6855400fbc96939662904b22ce0b7a010bcb0b7a2c7db9dc26b701", + Hash: "cfeccc9a21a9e76d70430630d17bfc4bb8175396179716ad1b258519b4c00131", + } +} +func getPeginConfigurationMock() *entities.Signed[liquidity_provider.PeginConfiguration] { + maxBigInt := new(big.Int) + maxBigInt.SetString("10000000000000000000", 10) + return &entities.Signed[liquidity_provider.PeginConfiguration]{ + Value: liquidity_provider.PeginConfiguration{ + TimeForDeposit: 3600, + CallTime: 7212, + PenaltyFee: entities.NewWei(1000000000000000), + CallFee: entities.NewWei(10000000000000000), + MaxValue: entities.NewBigWei(maxBigInt), + MinValue: entities.NewWei(600000000000000000), + }, + Signature: "671242c9fe5e1183d68e7c45face4ab1be9f304ac661aa778b81fceca000d19360eadf8a9e8ddd1528f485e64cd27d18de989f3d61c55e7ca074df2312623f2f01", + Hash: "609a64fa0aa6a60dd2eee3bf704d4afdc00b69768e271bec72d0c576ff56baf2", + } +} +func getPegoutConfigurationMock() *entities.Signed[liquidity_provider.PegoutConfiguration] { + maxBigInt := new(big.Int) + maxBigInt.SetString("10000000000000000000", 10) + return &entities.Signed[liquidity_provider.PegoutConfiguration]{ + Value: liquidity_provider.PegoutConfiguration{ + TimeForDeposit: 3655, + CallTime: 7200, + PenaltyFee: entities.NewWei(1000000000000000), + CallFee: entities.NewWei(10000000000000000), + MaxValue: entities.NewBigWei(maxBigInt), + MinValue: entities.NewWei(600000000000000000), + ExpireBlocks: 500, + }, + Signature: "db7443b405af8eaa37623e60fed1b0d39f63a04d1c207d2a178abf53463dda101fd59f5bec92ebd09b4158fe6a567fc545682ad43ceca69583104929b40d929f01", + Hash: "3a79c7a1d2f981ef13fa29b385ed0a1b63dc9ffdb251fb9e183314a2bf999305", + } +} diff --git a/internal/adapters/dataproviders/rootstock/account_test.go b/internal/adapters/dataproviders/rootstock/account_test.go index 4cfa3b8d..282ed3f3 100644 --- a/internal/adapters/dataproviders/rootstock/account_test.go +++ b/internal/adapters/dataproviders/rootstock/account_test.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "io" @@ -14,9 +15,8 @@ import ( ) const ( - keyPassword = "test" - keyAddress = "0x9d93929a9099be4355fc2389fbf253982f9df47c" - keyPath = "../../../../docker-compose/localstack/local-key.json" + keyAddress = "0x9d93929a9099be4355fc2389fbf253982f9df47c" + keyPath = "../../../../docker-compose/localstack/local-key.json" ) func TestGetAccount(t *testing.T) { @@ -32,7 +32,7 @@ func TestGetAccount(t *testing.T) { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) t.Run("Create new account", func(t *testing.T) { - account, testError := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + account, testError := rootstock.GetAccount(testDir, 0, string(keyBytes), test.KeyPassword) _, noExistError := os.Stat(testDir) assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") require.NoError(t, testError) @@ -40,7 +40,7 @@ func TestGetAccount(t *testing.T) { assert.NotNil(t, 1, len(account.Keystore.Accounts())) }) t.Run("Retrieve created account new account", func(t *testing.T) { - otherAccount, otherError := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + otherAccount, otherError := rootstock.GetAccount(testDir, 0, string(keyBytes), test.KeyPassword) require.NoError(t, otherError) assert.Equal(t, common.HexToAddress(keyAddress), otherAccount.Account.Address) assert.NotNil(t, 1, len(otherAccount.Keystore.Accounts())) @@ -60,12 +60,12 @@ func TestGetAccount_ErrorHandling(t *testing.T) { keyBytes, setupErr := io.ReadAll(keyFile) require.NoError(t, setupErr) t.Run("Invalid dir", func(t *testing.T) { - account, err := rootstock.GetAccount("/test", 0, string(keyBytes), keyPassword) + account, err := rootstock.GetAccount("/test", 0, string(keyBytes), test.KeyPassword) assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid key", func(t *testing.T) { - account, err := rootstock.GetAccount(testDir, 0, "any key", keyPassword) + account, err := rootstock.GetAccount(testDir, 0, "any key", test.KeyPassword) assert.Nil(t, account) require.Error(t, err) }) @@ -76,9 +76,9 @@ func TestGetAccount_ErrorHandling(t *testing.T) { }) t.Run("Invalid account number", func(t *testing.T) { // we create a keystore first so in the second call we can try to get an account that doesn't exist - _, err := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) + _, err := rootstock.GetAccount(testDir, 0, string(keyBytes), test.KeyPassword) require.NoError(t, err) - account, err := rootstock.GetAccount(testDir, 1, string(keyBytes), keyPassword) + account, err := rootstock.GetAccount(testDir, 1, string(keyBytes), test.KeyPassword) assert.Nil(t, account) require.Error(t, err) }) diff --git a/internal/adapters/dataproviders/rootstock/wallet_test.go b/internal/adapters/dataproviders/rootstock/wallet_test.go index 11820016..6204f767 100644 --- a/internal/adapters/dataproviders/rootstock/wallet_test.go +++ b/internal/adapters/dataproviders/rootstock/wallet_test.go @@ -3,7 +3,6 @@ package rootstock_test import ( "context" "encoding/hex" - "fmt" "github.com/ethereum/go-ethereum/common" geth "github.com/ethereum/go-ethereum/core/types" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" @@ -14,12 +13,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "io" "math/big" - "os" - "path/filepath" "testing" - "time" ) const ( @@ -44,20 +39,7 @@ var ( // TestRskWalletImpl we use this function to run all the test related to the wallet to open the account only once func TestRskWalletImpl(t *testing.T) { - testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-wallet-%d", time.Now().UnixNano())) - keyFile, err := os.Open(keyPath) - require.NoError(t, err) - - defer func(file *os.File) { - closingErr := file.Close() - require.NoError(t, closingErr) - }(keyFile) - - keyBytes, err := io.ReadAll(keyFile) - require.NoError(t, err) - account, err := rootstock.GetAccount(testDir, 0, string(keyBytes), keyPassword) - require.NoError(t, err) - + account := test.OpenWalletForTest(t, "wallet") t.Run("Address", createAddressTest(account)) t.Run("Sign", creteSignTest(account)) t.Run("SignBytes", createSignBytesTest(account)) diff --git a/internal/entities/blockchain/lbc_test.go b/internal/entities/blockchain/lbc_test.go index 37a7e60d..90523684 100644 --- a/internal/entities/blockchain/lbc_test.go +++ b/internal/entities/blockchain/lbc_test.go @@ -1,7 +1,8 @@ -package blockchain +package blockchain_test import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" @@ -10,7 +11,7 @@ import ( ) func TestRefundPegoutParams_String(t *testing.T) { - params := RefundPegoutParams{ + params := blockchain.RefundPegoutParams{ QuoteHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, BtcRawTx: []byte{0x01, 0x02, 0x03}, BtcBlockHeaderHash: [32]byte{32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, @@ -32,7 +33,7 @@ func TestRefundPegoutParams_String(t *testing.T) { } func TestRegisterPeginParams_String(t *testing.T) { - params := RegisterPeginParams{ + params := blockchain.RegisterPeginParams{ QuoteSignature: []byte{0x01, 0x02, 0x03}, BitcoinRawTransaction: []byte{0x04, 0x05, 0x06}, PartialMerkleTree: []byte{0x07, 0x08, 0x09}, diff --git a/internal/usecases/watcher/clean_exipred_test.go b/internal/usecases/watcher/clean_exipred_test.go index d2fce8ff..7f455a10 100644 --- a/internal/usecases/watcher/clean_exipred_test.go +++ b/internal/usecases/watcher/clean_exipred_test.go @@ -4,6 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -33,20 +34,20 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { peginRepository := new(mocks.PeginQuoteRepositoryMock) peginRepository.On( "GetRetainedQuoteByState", - mock.AnythingOfType("context.backgroundCtx"), - []quote.PeginState{quote.PeginStateTimeForDepositElapsed}, + test.AnyCtx, + quote.PeginStateTimeForDepositElapsed, ).Return([]quote.RetainedPeginQuote{peginExpiredQuotes[0], peginExpiredQuotes[1], peginExpiredQuotes[3]}, nil) peginRepository.On( "DeleteQuotes", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, []string{"peginHash1", "peginHash2", "peginHash4"}, ).Return(uint(3), nil) pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) pegoutRepository.On( "GetRetainedQuoteByState", - mock.AnythingOfType("context.backgroundCtx"), - []quote.PegoutState{quote.PegoutStateTimeForDepositElapsed}, + test.AnyCtx, + quote.PegoutStateTimeForDepositElapsed, ).Return([]quote.RetainedPegoutQuote{pegoutExpiredQuotes[2], pegoutExpiredQuotes[4], pegoutExpiredQuotes[5]}, nil) pegoutRepository.On( "DeleteQuotes", diff --git a/internal/usecases/watcher/get_watched_pegin_quote_test.go b/internal/usecases/watcher/get_watched_pegin_quote_test.go index 47e76bd2..621aff23 100644 --- a/internal/usecases/watcher/get_watched_pegin_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegin_quote_test.go @@ -4,6 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -29,10 +30,10 @@ var peginQuotes = []quote.PeginQuote{ func TestGetWatchedPeginQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PeginState{quote.PeginStateWaitingForDeposit}). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, quote.PeginStateWaitingForDeposit). Return([]quote.RetainedPeginQuote{retainedQuotes[0], retainedQuotes[2]}, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[0].QuoteHash).Return(&peginQuotes[0], nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[2].QuoteHash).Return(&peginQuotes[2], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuotes[0].QuoteHash).Return(&peginQuotes[0], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuotes[2].QuoteHash).Return(&peginQuotes[2], nil) useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PeginStateWaitingForDeposit) quoteRepository.AssertExpectations(t) @@ -49,9 +50,9 @@ func TestGetWatchedPeginQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { func TestGetWatchedPeginQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PeginState{quote.PeginStateCallForUserSucceeded}). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, quote.PeginStateCallForUserSucceeded). Return([]quote.RetainedPeginQuote{retainedQuotes[1]}, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuotes[1].QuoteHash).Return(&peginQuotes[3], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuotes[1].QuoteHash).Return(&peginQuotes[3], nil) useCase := watcher.NewGetWatchedPeginQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PeginStateCallForUserSucceeded) quoteRepository.AssertExpectations(t) diff --git a/internal/usecases/watcher/get_watched_pegout_quote_test.go b/internal/usecases/watcher/get_watched_pegout_quote_test.go index 338b34e7..e3369358 100644 --- a/internal/usecases/watcher/get_watched_pegout_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegout_quote_test.go @@ -4,6 +4,7 @@ import ( "context" "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" "github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -33,17 +34,17 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On( "GetRetainedQuoteByState", - mock.AnythingOfType("context.backgroundCtx"), - []quote.PegoutState{quote.PegoutStateWaitingForDeposit}, + test.AnyCtx, + quote.PegoutStateWaitingForDeposit, ).Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[0], retainedPegoutQuotes[2]}, nil) quoteRepository.On( "GetRetainedQuoteByState", - mock.AnythingOfType("context.backgroundCtx"), - []quote.PegoutState{quote.PegoutStateWaitingForDepositConfirmations}, + test.AnyCtx, + quote.PegoutStateWaitingForDepositConfirmations, ).Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[4]}, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[0].QuoteHash).Return(&pegoutQuotes[0], nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[2].QuoteHash).Return(&pegoutQuotes[2], nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[4].QuoteHash).Return(&pegoutQuotes[5], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedPegoutQuotes[0].QuoteHash).Return(&pegoutQuotes[0], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedPegoutQuotes[2].QuoteHash).Return(&pegoutQuotes[2], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedPegoutQuotes[4].QuoteHash).Return(&pegoutQuotes[5], nil) useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PegoutStateWaitingForDeposit, quote.PegoutStateWaitingForDepositConfirmations) quoteRepository.AssertExpectations(t) @@ -60,9 +61,9 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WaitingForDeposit(t *testing.T) { func TestGetWatchedPegoutQuoteUseCase_Run_CallForUserSucceed(t *testing.T) { quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), []quote.PegoutState{quote.PegoutStateSendPegoutSucceeded}). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, quote.PegoutStateSendPegoutSucceeded). Return([]quote.RetainedPegoutQuote{retainedPegoutQuotes[1]}, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPegoutQuotes[1].QuoteHash).Return(&pegoutQuotes[3], nil) + quoteRepository.On("GetQuote", test.AnyCtx, retainedPegoutQuotes[1].QuoteHash).Return(&pegoutQuotes[3], nil) useCase := watcher.NewGetWatchedPegoutQuoteUseCase(quoteRepository) watchedQuotes, err := useCase.Run(context.Background(), quote.PegoutStateSendPegoutSucceeded) quoteRepository.AssertExpectations(t) diff --git a/test/mocks/bitcoin_wallet_mock.go b/test/mocks/bitcoin_wallet_mock.go new file mode 100644 index 00000000..1215ab79 --- /dev/null +++ b/test/mocks/bitcoin_wallet_mock.go @@ -0,0 +1,405 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + entities "github.com/rsksmart/liquidity-provider-server/internal/entities" + blockchain "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + + mock "github.com/stretchr/testify/mock" +) + +// BitcoinWalletMock is an autogenerated mock type for the BitcoinWallet type +type BitcoinWalletMock struct { + mock.Mock +} + +type BitcoinWalletMock_Expecter struct { + mock *mock.Mock +} + +func (_m *BitcoinWalletMock) EXPECT() *BitcoinWalletMock_Expecter { + return &BitcoinWalletMock_Expecter{mock: &_m.Mock} +} + +// Address provides a mock function with given fields: +func (_m *BitcoinWalletMock) Address() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Address") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// BitcoinWalletMock_Address_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Address' +type BitcoinWalletMock_Address_Call struct { + *mock.Call +} + +// Address is a helper method to define mock.On call +func (_e *BitcoinWalletMock_Expecter) Address() *BitcoinWalletMock_Address_Call { + return &BitcoinWalletMock_Address_Call{Call: _e.mock.On("Address")} +} + +func (_c *BitcoinWalletMock_Address_Call) Run(run func()) *BitcoinWalletMock_Address_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *BitcoinWalletMock_Address_Call) Return(_a0 string) *BitcoinWalletMock_Address_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *BitcoinWalletMock_Address_Call) RunAndReturn(run func() string) *BitcoinWalletMock_Address_Call { + _c.Call.Return(run) + return _c +} + +// EstimateTxFees provides a mock function with given fields: toAddress, value +func (_m *BitcoinWalletMock) EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) { + ret := _m.Called(toAddress, value) + + if len(ret) == 0 { + panic("no return value specified for EstimateTxFees") + } + + var r0 *entities.Wei + var r1 error + if rf, ok := ret.Get(0).(func(string, *entities.Wei) (*entities.Wei, error)); ok { + return rf(toAddress, value) + } + if rf, ok := ret.Get(0).(func(string, *entities.Wei) *entities.Wei); ok { + r0 = rf(toAddress, value) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Wei) + } + } + + if rf, ok := ret.Get(1).(func(string, *entities.Wei) error); ok { + r1 = rf(toAddress, value) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BitcoinWalletMock_EstimateTxFees_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateTxFees' +type BitcoinWalletMock_EstimateTxFees_Call struct { + *mock.Call +} + +// EstimateTxFees is a helper method to define mock.On call +// - toAddress string +// - value *entities.Wei +func (_e *BitcoinWalletMock_Expecter) EstimateTxFees(toAddress interface{}, value interface{}) *BitcoinWalletMock_EstimateTxFees_Call { + return &BitcoinWalletMock_EstimateTxFees_Call{Call: _e.mock.On("EstimateTxFees", toAddress, value)} +} + +func (_c *BitcoinWalletMock_EstimateTxFees_Call) Run(run func(toAddress string, value *entities.Wei)) *BitcoinWalletMock_EstimateTxFees_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(*entities.Wei)) + }) + return _c +} + +func (_c *BitcoinWalletMock_EstimateTxFees_Call) Return(_a0 *entities.Wei, _a1 error) *BitcoinWalletMock_EstimateTxFees_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BitcoinWalletMock_EstimateTxFees_Call) RunAndReturn(run func(string, *entities.Wei) (*entities.Wei, error)) *BitcoinWalletMock_EstimateTxFees_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: +func (_m *BitcoinWalletMock) GetBalance() (*entities.Wei, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetBalance") + } + + var r0 *entities.Wei + var r1 error + if rf, ok := ret.Get(0).(func() (*entities.Wei, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *entities.Wei); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Wei) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BitcoinWalletMock_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type BitcoinWalletMock_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +func (_e *BitcoinWalletMock_Expecter) GetBalance() *BitcoinWalletMock_GetBalance_Call { + return &BitcoinWalletMock_GetBalance_Call{Call: _e.mock.On("GetBalance")} +} + +func (_c *BitcoinWalletMock_GetBalance_Call) Run(run func()) *BitcoinWalletMock_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *BitcoinWalletMock_GetBalance_Call) Return(_a0 *entities.Wei, _a1 error) *BitcoinWalletMock_GetBalance_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BitcoinWalletMock_GetBalance_Call) RunAndReturn(run func() (*entities.Wei, error)) *BitcoinWalletMock_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetTransactions provides a mock function with given fields: address +func (_m *BitcoinWalletMock) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for GetTransactions") + } + + var r0 []blockchain.BitcoinTransactionInformation + var r1 error + if rf, ok := ret.Get(0).(func(string) ([]blockchain.BitcoinTransactionInformation, error)); ok { + return rf(address) + } + if rf, ok := ret.Get(0).(func(string) []blockchain.BitcoinTransactionInformation); ok { + r0 = rf(address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]blockchain.BitcoinTransactionInformation) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BitcoinWalletMock_GetTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransactions' +type BitcoinWalletMock_GetTransactions_Call struct { + *mock.Call +} + +// GetTransactions is a helper method to define mock.On call +// - address string +func (_e *BitcoinWalletMock_Expecter) GetTransactions(address interface{}) *BitcoinWalletMock_GetTransactions_Call { + return &BitcoinWalletMock_GetTransactions_Call{Call: _e.mock.On("GetTransactions", address)} +} + +func (_c *BitcoinWalletMock_GetTransactions_Call) Run(run func(address string)) *BitcoinWalletMock_GetTransactions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *BitcoinWalletMock_GetTransactions_Call) Return(_a0 []blockchain.BitcoinTransactionInformation, _a1 error) *BitcoinWalletMock_GetTransactions_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BitcoinWalletMock_GetTransactions_Call) RunAndReturn(run func(string) ([]blockchain.BitcoinTransactionInformation, error)) *BitcoinWalletMock_GetTransactions_Call { + _c.Call.Return(run) + return _c +} + +// ImportAddress provides a mock function with given fields: address +func (_m *BitcoinWalletMock) ImportAddress(address string) error { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for ImportAddress") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(address) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// BitcoinWalletMock_ImportAddress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportAddress' +type BitcoinWalletMock_ImportAddress_Call struct { + *mock.Call +} + +// ImportAddress is a helper method to define mock.On call +// - address string +func (_e *BitcoinWalletMock_Expecter) ImportAddress(address interface{}) *BitcoinWalletMock_ImportAddress_Call { + return &BitcoinWalletMock_ImportAddress_Call{Call: _e.mock.On("ImportAddress", address)} +} + +func (_c *BitcoinWalletMock_ImportAddress_Call) Run(run func(address string)) *BitcoinWalletMock_ImportAddress_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *BitcoinWalletMock_ImportAddress_Call) Return(_a0 error) *BitcoinWalletMock_ImportAddress_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *BitcoinWalletMock_ImportAddress_Call) RunAndReturn(run func(string) error) *BitcoinWalletMock_ImportAddress_Call { + _c.Call.Return(run) + return _c +} + +// SendWithOpReturn provides a mock function with given fields: address, value, opReturnContent +func (_m *BitcoinWalletMock) SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (string, error) { + ret := _m.Called(address, value, opReturnContent) + + if len(ret) == 0 { + panic("no return value specified for SendWithOpReturn") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(string, *entities.Wei, []byte) (string, error)); ok { + return rf(address, value, opReturnContent) + } + if rf, ok := ret.Get(0).(func(string, *entities.Wei, []byte) string); ok { + r0 = rf(address, value, opReturnContent) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(string, *entities.Wei, []byte) error); ok { + r1 = rf(address, value, opReturnContent) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BitcoinWalletMock_SendWithOpReturn_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendWithOpReturn' +type BitcoinWalletMock_SendWithOpReturn_Call struct { + *mock.Call +} + +// SendWithOpReturn is a helper method to define mock.On call +// - address string +// - value *entities.Wei +// - opReturnContent []byte +func (_e *BitcoinWalletMock_Expecter) SendWithOpReturn(address interface{}, value interface{}, opReturnContent interface{}) *BitcoinWalletMock_SendWithOpReturn_Call { + return &BitcoinWalletMock_SendWithOpReturn_Call{Call: _e.mock.On("SendWithOpReturn", address, value, opReturnContent)} +} + +func (_c *BitcoinWalletMock_SendWithOpReturn_Call) Run(run func(address string, value *entities.Wei, opReturnContent []byte)) *BitcoinWalletMock_SendWithOpReturn_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(*entities.Wei), args[2].([]byte)) + }) + return _c +} + +func (_c *BitcoinWalletMock_SendWithOpReturn_Call) Return(_a0 string, _a1 error) *BitcoinWalletMock_SendWithOpReturn_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BitcoinWalletMock_SendWithOpReturn_Call) RunAndReturn(run func(string, *entities.Wei, []byte) (string, error)) *BitcoinWalletMock_SendWithOpReturn_Call { + _c.Call.Return(run) + return _c +} + +// Unlock provides a mock function with given fields: +func (_m *BitcoinWalletMock) Unlock() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Unlock") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// BitcoinWalletMock_Unlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unlock' +type BitcoinWalletMock_Unlock_Call struct { + *mock.Call +} + +// Unlock is a helper method to define mock.On call +func (_e *BitcoinWalletMock_Expecter) Unlock() *BitcoinWalletMock_Unlock_Call { + return &BitcoinWalletMock_Unlock_Call{Call: _e.mock.On("Unlock")} +} + +func (_c *BitcoinWalletMock_Unlock_Call) Run(run func()) *BitcoinWalletMock_Unlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *BitcoinWalletMock_Unlock_Call) Return(_a0 error) *BitcoinWalletMock_Unlock_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *BitcoinWalletMock_Unlock_Call) RunAndReturn(run func() error) *BitcoinWalletMock_Unlock_Call { + _c.Call.Return(run) + return _c +} + +// NewBitcoinWalletMock creates a new instance of BitcoinWalletMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBitcoinWalletMock(t interface { + mock.TestingT + Cleanup(func()) +}) *BitcoinWalletMock { + mock := &BitcoinWalletMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/pegin_quote_repository_mock.go b/test/mocks/pegin_quote_repository_mock.go index e80e057a..f8591deb 100644 --- a/test/mocks/pegin_quote_repository_mock.go +++ b/test/mocks/pegin_quote_repository_mock.go @@ -1,62 +1,427 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + package mocks import ( - "context" - "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" - "github.com/stretchr/testify/mock" + context "context" + + quote "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + mock "github.com/stretchr/testify/mock" ) +// PeginQuoteRepositoryMock is an autogenerated mock type for the PeginQuoteRepository type type PeginQuoteRepositoryMock struct { - quote.PeginQuoteRepository mock.Mock } -func (m *PeginQuoteRepositoryMock) InsertQuote(ctx context.Context, hash string, quote quote.PeginQuote) error { - args := m.Called(ctx, hash, quote) - return args.Error(0) +type PeginQuoteRepositoryMock_Expecter struct { + mock *mock.Mock } -func (m *PeginQuoteRepositoryMock) InsertRetainedQuote(ctx context.Context, q quote.RetainedPeginQuote) error { - args := m.Called(ctx, q) - return args.Error(0) +func (_m *PeginQuoteRepositoryMock) EXPECT() *PeginQuoteRepositoryMock_Expecter { + return &PeginQuoteRepositoryMock_Expecter{mock: &_m.Mock} } -func (m *PeginQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PeginQuote, error) { - args := m.Called(ctx, hash) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +// DeleteQuotes provides a mock function with given fields: ctx, quotes +func (_m *PeginQuoteRepositoryMock) DeleteQuotes(ctx context.Context, quotes []string) (uint, error) { + ret := _m.Called(ctx, quotes) + + if len(ret) == 0 { + panic("no return value specified for DeleteQuotes") + } + + var r0 uint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) (uint, error)); ok { + return rf(ctx, quotes) + } + if rf, ok := ret.Get(0).(func(context.Context, []string) uint); ok { + r0 = rf(ctx, quotes) + } else { + r0 = ret.Get(0).(uint) + } + + if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { + r1 = rf(ctx, quotes) } else { - return arg.(*quote.PeginQuote), args.Error(1) + r1 = ret.Error(1) } + + return r0, r1 +} + +// PeginQuoteRepositoryMock_DeleteQuotes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteQuotes' +type PeginQuoteRepositoryMock_DeleteQuotes_Call struct { + *mock.Call +} + +// DeleteQuotes is a helper method to define mock.On call +// - ctx context.Context +// - quotes []string +func (_e *PeginQuoteRepositoryMock_Expecter) DeleteQuotes(ctx interface{}, quotes interface{}) *PeginQuoteRepositoryMock_DeleteQuotes_Call { + return &PeginQuoteRepositoryMock_DeleteQuotes_Call{Call: _e.mock.On("DeleteQuotes", ctx, quotes)} +} + +func (_c *PeginQuoteRepositoryMock_DeleteQuotes_Call) Run(run func(ctx context.Context, quotes []string)) *PeginQuoteRepositoryMock_DeleteQuotes_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]string)) + }) + return _c +} + +func (_c *PeginQuoteRepositoryMock_DeleteQuotes_Call) Return(_a0 uint, _a1 error) *PeginQuoteRepositoryMock_DeleteQuotes_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PeginQuoteRepositoryMock_DeleteQuotes_Call) RunAndReturn(run func(context.Context, []string) (uint, error)) *PeginQuoteRepositoryMock_DeleteQuotes_Call { + _c.Call.Return(run) + return _c } -func (m *PeginQuoteRepositoryMock) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPeginQuote, error) { - args := m.Called(ctx, hash) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +// GetQuote provides a mock function with given fields: ctx, hash +func (_m *PeginQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PeginQuote, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetQuote") + } + + var r0 *quote.PeginQuote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*quote.PeginQuote, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *quote.PeginQuote); ok { + r0 = rf(ctx, hash) } else { - return arg.(*quote.RetainedPeginQuote), args.Error(1) + if ret.Get(0) != nil { + r0 = ret.Get(0).(*quote.PeginQuote) + } } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PeginQuoteRepositoryMock_GetQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetQuote' +type PeginQuoteRepositoryMock_GetQuote_Call struct { + *mock.Call +} + +// GetQuote is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *PeginQuoteRepositoryMock_Expecter) GetQuote(ctx interface{}, hash interface{}) *PeginQuoteRepositoryMock_GetQuote_Call { + return &PeginQuoteRepositoryMock_GetQuote_Call{Call: _e.mock.On("GetQuote", ctx, hash)} +} + +func (_c *PeginQuoteRepositoryMock_GetQuote_Call) Run(run func(ctx context.Context, hash string)) *PeginQuoteRepositoryMock_GetQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c } -func (m *PeginQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PeginState) ([]quote.RetainedPeginQuote, error) { - args := m.Called(ctx, states) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +func (_c *PeginQuoteRepositoryMock_GetQuote_Call) Return(_a0 *quote.PeginQuote, _a1 error) *PeginQuoteRepositoryMock_GetQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PeginQuoteRepositoryMock_GetQuote_Call) RunAndReturn(run func(context.Context, string) (*quote.PeginQuote, error)) *PeginQuoteRepositoryMock_GetQuote_Call { + _c.Call.Return(run) + return _c +} + +// GetRetainedQuote provides a mock function with given fields: ctx, hash +func (_m *PeginQuoteRepositoryMock) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPeginQuote, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetRetainedQuote") + } + + var r0 *quote.RetainedPeginQuote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*quote.RetainedPeginQuote, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *quote.RetainedPeginQuote); ok { + r0 = rf(ctx, hash) } else { - return arg.([]quote.RetainedPeginQuote), args.Error(1) + if ret.Get(0) != nil { + r0 = ret.Get(0).(*quote.RetainedPeginQuote) + } } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PeginQuoteRepositoryMock_GetRetainedQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRetainedQuote' +type PeginQuoteRepositoryMock_GetRetainedQuote_Call struct { + *mock.Call +} + +// GetRetainedQuote is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *PeginQuoteRepositoryMock_Expecter) GetRetainedQuote(ctx interface{}, hash interface{}) *PeginQuoteRepositoryMock_GetRetainedQuote_Call { + return &PeginQuoteRepositoryMock_GetRetainedQuote_Call{Call: _e.mock.On("GetRetainedQuote", ctx, hash)} } -func (m *PeginQuoteRepositoryMock) DeleteQuotes(ctx context.Context, hashes []string) (uint, error) { - args := m.Called(ctx, hashes) - return args.Get(0).(uint), args.Error(1) +func (_c *PeginQuoteRepositoryMock_GetRetainedQuote_Call) Run(run func(ctx context.Context, hash string)) *PeginQuoteRepositoryMock_GetRetainedQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *PeginQuoteRepositoryMock_GetRetainedQuote_Call) Return(_a0 *quote.RetainedPeginQuote, _a1 error) *PeginQuoteRepositoryMock_GetRetainedQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PeginQuoteRepositoryMock_GetRetainedQuote_Call) RunAndReturn(run func(context.Context, string) (*quote.RetainedPeginQuote, error)) *PeginQuoteRepositoryMock_GetRetainedQuote_Call { + _c.Call.Return(run) + return _c +} + +// GetRetainedQuoteByState provides a mock function with given fields: ctx, states +func (_m *PeginQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PeginState) ([]quote.RetainedPeginQuote, error) { + _va := make([]interface{}, len(states)) + for _i := range states { + _va[_i] = states[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for GetRetainedQuoteByState") + } + + var r0 []quote.RetainedPeginQuote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ...quote.PeginState) ([]quote.RetainedPeginQuote, error)); ok { + return rf(ctx, states...) + } + if rf, ok := ret.Get(0).(func(context.Context, ...quote.PeginState) []quote.RetainedPeginQuote); ok { + r0 = rf(ctx, states...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]quote.RetainedPeginQuote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ...quote.PeginState) error); ok { + r1 = rf(ctx, states...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } -func (m *PeginQuoteRepositoryMock) UpdateRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { - args := m.Called(ctx, retainedQuote) - return args.Error(0) +// PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRetainedQuoteByState' +type PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call struct { + *mock.Call +} + +// GetRetainedQuoteByState is a helper method to define mock.On call +// - ctx context.Context +// - states ...quote.PeginState +func (_e *PeginQuoteRepositoryMock_Expecter) GetRetainedQuoteByState(ctx interface{}, states ...interface{}) *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call { + return &PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call{Call: _e.mock.On("GetRetainedQuoteByState", + append([]interface{}{ctx}, states...)...)} +} + +func (_c *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call) Run(run func(ctx context.Context, states ...quote.PeginState)) *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]quote.PeginState, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(quote.PeginState) + } + } + run(args[0].(context.Context), variadicArgs...) + }) + return _c +} + +func (_c *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call) Return(_a0 []quote.RetainedPeginQuote, _a1 error) *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call) RunAndReturn(run func(context.Context, ...quote.PeginState) ([]quote.RetainedPeginQuote, error)) *PeginQuoteRepositoryMock_GetRetainedQuoteByState_Call { + _c.Call.Return(run) + return _c +} + +// InsertQuote provides a mock function with given fields: ctx, hash, _a2 +func (_m *PeginQuoteRepositoryMock) InsertQuote(ctx context.Context, hash string, _a2 quote.PeginQuote) error { + ret := _m.Called(ctx, hash, _a2) + + if len(ret) == 0 { + panic("no return value specified for InsertQuote") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, quote.PeginQuote) error); ok { + r0 = rf(ctx, hash, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PeginQuoteRepositoryMock_InsertQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InsertQuote' +type PeginQuoteRepositoryMock_InsertQuote_Call struct { + *mock.Call +} + +// InsertQuote is a helper method to define mock.On call +// - ctx context.Context +// - hash string +// - _a2 quote.PeginQuote +func (_e *PeginQuoteRepositoryMock_Expecter) InsertQuote(ctx interface{}, hash interface{}, _a2 interface{}) *PeginQuoteRepositoryMock_InsertQuote_Call { + return &PeginQuoteRepositoryMock_InsertQuote_Call{Call: _e.mock.On("InsertQuote", ctx, hash, _a2)} +} + +func (_c *PeginQuoteRepositoryMock_InsertQuote_Call) Run(run func(ctx context.Context, hash string, _a2 quote.PeginQuote)) *PeginQuoteRepositoryMock_InsertQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(quote.PeginQuote)) + }) + return _c +} + +func (_c *PeginQuoteRepositoryMock_InsertQuote_Call) Return(_a0 error) *PeginQuoteRepositoryMock_InsertQuote_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PeginQuoteRepositoryMock_InsertQuote_Call) RunAndReturn(run func(context.Context, string, quote.PeginQuote) error) *PeginQuoteRepositoryMock_InsertQuote_Call { + _c.Call.Return(run) + return _c +} + +// InsertRetainedQuote provides a mock function with given fields: ctx, _a1 +func (_m *PeginQuoteRepositoryMock) InsertRetainedQuote(ctx context.Context, _a1 quote.RetainedPeginQuote) error { + ret := _m.Called(ctx, _a1) + + if len(ret) == 0 { + panic("no return value specified for InsertRetainedQuote") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, quote.RetainedPeginQuote) error); ok { + r0 = rf(ctx, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PeginQuoteRepositoryMock_InsertRetainedQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InsertRetainedQuote' +type PeginQuoteRepositoryMock_InsertRetainedQuote_Call struct { + *mock.Call +} + +// InsertRetainedQuote is a helper method to define mock.On call +// - ctx context.Context +// - _a1 quote.RetainedPeginQuote +func (_e *PeginQuoteRepositoryMock_Expecter) InsertRetainedQuote(ctx interface{}, _a1 interface{}) *PeginQuoteRepositoryMock_InsertRetainedQuote_Call { + return &PeginQuoteRepositoryMock_InsertRetainedQuote_Call{Call: _e.mock.On("InsertRetainedQuote", ctx, _a1)} +} + +func (_c *PeginQuoteRepositoryMock_InsertRetainedQuote_Call) Run(run func(ctx context.Context, _a1 quote.RetainedPeginQuote)) *PeginQuoteRepositoryMock_InsertRetainedQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(quote.RetainedPeginQuote)) + }) + return _c +} + +func (_c *PeginQuoteRepositoryMock_InsertRetainedQuote_Call) Return(_a0 error) *PeginQuoteRepositoryMock_InsertRetainedQuote_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PeginQuoteRepositoryMock_InsertRetainedQuote_Call) RunAndReturn(run func(context.Context, quote.RetainedPeginQuote) error) *PeginQuoteRepositoryMock_InsertRetainedQuote_Call { + _c.Call.Return(run) + return _c +} + +// UpdateRetainedQuote provides a mock function with given fields: ctx, _a1 +func (_m *PeginQuoteRepositoryMock) UpdateRetainedQuote(ctx context.Context, _a1 quote.RetainedPeginQuote) error { + ret := _m.Called(ctx, _a1) + + if len(ret) == 0 { + panic("no return value specified for UpdateRetainedQuote") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, quote.RetainedPeginQuote) error); ok { + r0 = rf(ctx, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PeginQuoteRepositoryMock_UpdateRetainedQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateRetainedQuote' +type PeginQuoteRepositoryMock_UpdateRetainedQuote_Call struct { + *mock.Call +} + +// UpdateRetainedQuote is a helper method to define mock.On call +// - ctx context.Context +// - _a1 quote.RetainedPeginQuote +func (_e *PeginQuoteRepositoryMock_Expecter) UpdateRetainedQuote(ctx interface{}, _a1 interface{}) *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call { + return &PeginQuoteRepositoryMock_UpdateRetainedQuote_Call{Call: _e.mock.On("UpdateRetainedQuote", ctx, _a1)} +} + +func (_c *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call) Run(run func(ctx context.Context, _a1 quote.RetainedPeginQuote)) *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(quote.RetainedPeginQuote)) + }) + return _c +} + +func (_c *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call) Return(_a0 error) *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call) RunAndReturn(run func(context.Context, quote.RetainedPeginQuote) error) *PeginQuoteRepositoryMock_UpdateRetainedQuote_Call { + _c.Call.Return(run) + return _c +} + +// NewPeginQuoteRepositoryMock creates a new instance of PeginQuoteRepositoryMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewPeginQuoteRepositoryMock(t interface { + mock.TestingT + Cleanup(func()) +}) *PeginQuoteRepositoryMock { + mock := &PeginQuoteRepositoryMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock } diff --git a/test/mocks/pegout_quote_repository_mock.go b/test/mocks/pegout_quote_repository_mock.go index 666d3365..472c0688 100644 --- a/test/mocks/pegout_quote_repository_mock.go +++ b/test/mocks/pegout_quote_repository_mock.go @@ -1,82 +1,580 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + package mocks import ( - "context" - "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" - "github.com/stretchr/testify/mock" + context "context" + + quote "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + mock "github.com/stretchr/testify/mock" ) +// PegoutQuoteRepositoryMock is an autogenerated mock type for the PegoutQuoteRepository type type PegoutQuoteRepositoryMock struct { - quote.PegoutQuoteRepository mock.Mock } -func (m *PegoutQuoteRepositoryMock) InsertQuote(ctx context.Context, hash string, quote quote.PegoutQuote) error { - args := m.Called(ctx, hash, quote) - return args.Error(0) +type PegoutQuoteRepositoryMock_Expecter struct { + mock *mock.Mock +} + +func (_m *PegoutQuoteRepositoryMock) EXPECT() *PegoutQuoteRepositoryMock_Expecter { + return &PegoutQuoteRepositoryMock_Expecter{mock: &_m.Mock} +} + +// DeleteQuotes provides a mock function with given fields: ctx, quotes +func (_m *PegoutQuoteRepositoryMock) DeleteQuotes(ctx context.Context, quotes []string) (uint, error) { + ret := _m.Called(ctx, quotes) + + if len(ret) == 0 { + panic("no return value specified for DeleteQuotes") + } + + var r0 uint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) (uint, error)); ok { + return rf(ctx, quotes) + } + if rf, ok := ret.Get(0).(func(context.Context, []string) uint); ok { + r0 = rf(ctx, quotes) + } else { + r0 = ret.Get(0).(uint) + } + + if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { + r1 = rf(ctx, quotes) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PegoutQuoteRepositoryMock_DeleteQuotes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteQuotes' +type PegoutQuoteRepositoryMock_DeleteQuotes_Call struct { + *mock.Call +} + +// DeleteQuotes is a helper method to define mock.On call +// - ctx context.Context +// - quotes []string +func (_e *PegoutQuoteRepositoryMock_Expecter) DeleteQuotes(ctx interface{}, quotes interface{}) *PegoutQuoteRepositoryMock_DeleteQuotes_Call { + return &PegoutQuoteRepositoryMock_DeleteQuotes_Call{Call: _e.mock.On("DeleteQuotes", ctx, quotes)} +} + +func (_c *PegoutQuoteRepositoryMock_DeleteQuotes_Call) Run(run func(ctx context.Context, quotes []string)) *PegoutQuoteRepositoryMock_DeleteQuotes_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]string)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_DeleteQuotes_Call) Return(_a0 uint, _a1 error) *PegoutQuoteRepositoryMock_DeleteQuotes_Call { + _c.Call.Return(_a0, _a1) + return _c } -func (m *PegoutQuoteRepositoryMock) InsertRetainedQuote(ctx context.Context, quote quote.RetainedPegoutQuote) error { - args := m.Called(ctx, quote) - return args.Error(0) +func (_c *PegoutQuoteRepositoryMock_DeleteQuotes_Call) RunAndReturn(run func(context.Context, []string) (uint, error)) *PegoutQuoteRepositoryMock_DeleteQuotes_Call { + _c.Call.Return(run) + return _c } -func (m *PegoutQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PegoutQuote, error) { - args := m.Called(ctx, hash) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +// GetQuote provides a mock function with given fields: ctx, hash +func (_m *PegoutQuoteRepositoryMock) GetQuote(ctx context.Context, hash string) (*quote.PegoutQuote, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetQuote") + } + + var r0 *quote.PegoutQuote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*quote.PegoutQuote, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *quote.PegoutQuote); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*quote.PegoutQuote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) } else { - return arg.(*quote.PegoutQuote), args.Error(1) + r1 = ret.Error(1) } + + return r0, r1 } -func (m *PegoutQuoteRepositoryMock) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPegoutQuote, error) { - args := m.Called(ctx, hash) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +// PegoutQuoteRepositoryMock_GetQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetQuote' +type PegoutQuoteRepositoryMock_GetQuote_Call struct { + *mock.Call +} + +// GetQuote is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *PegoutQuoteRepositoryMock_Expecter) GetQuote(ctx interface{}, hash interface{}) *PegoutQuoteRepositoryMock_GetQuote_Call { + return &PegoutQuoteRepositoryMock_GetQuote_Call{Call: _e.mock.On("GetQuote", ctx, hash)} +} + +func (_c *PegoutQuoteRepositoryMock_GetQuote_Call) Run(run func(ctx context.Context, hash string)) *PegoutQuoteRepositoryMock_GetQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_GetQuote_Call) Return(_a0 *quote.PegoutQuote, _a1 error) *PegoutQuoteRepositoryMock_GetQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_GetQuote_Call) RunAndReturn(run func(context.Context, string) (*quote.PegoutQuote, error)) *PegoutQuoteRepositoryMock_GetQuote_Call { + _c.Call.Return(run) + return _c +} + +// GetRetainedQuote provides a mock function with given fields: ctx, hash +func (_m *PegoutQuoteRepositoryMock) GetRetainedQuote(ctx context.Context, hash string) (*quote.RetainedPegoutQuote, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetRetainedQuote") + } + + var r0 *quote.RetainedPegoutQuote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*quote.RetainedPegoutQuote, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *quote.RetainedPegoutQuote); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*quote.RetainedPegoutQuote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) } else { - return arg.(*quote.RetainedPegoutQuote), args.Error(1) + r1 = ret.Error(1) } + + return r0, r1 +} + +// PegoutQuoteRepositoryMock_GetRetainedQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRetainedQuote' +type PegoutQuoteRepositoryMock_GetRetainedQuote_Call struct { + *mock.Call } -func (m *PegoutQuoteRepositoryMock) UpsertPegoutDeposits(ctx context.Context, deposits []quote.PegoutDeposit) error { - args := m.Called(ctx, deposits) - return args.Error(0) +// GetRetainedQuote is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *PegoutQuoteRepositoryMock_Expecter) GetRetainedQuote(ctx interface{}, hash interface{}) *PegoutQuoteRepositoryMock_GetRetainedQuote_Call { + return &PegoutQuoteRepositoryMock_GetRetainedQuote_Call{Call: _e.mock.On("GetRetainedQuote", ctx, hash)} } -func (m *PegoutQuoteRepositoryMock) UpdateRetainedQuote(ctx context.Context, quote quote.RetainedPegoutQuote) error { - args := m.Called(ctx, quote) - return args.Error(0) +func (_c *PegoutQuoteRepositoryMock_GetRetainedQuote_Call) Run(run func(ctx context.Context, hash string)) *PegoutQuoteRepositoryMock_GetRetainedQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c } -func (m *PegoutQuoteRepositoryMock) ListPegoutDepositsByAddress(ctx context.Context, address string) ([]quote.PegoutDeposit, error) { - args := m.Called(ctx, address) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +func (_c *PegoutQuoteRepositoryMock_GetRetainedQuote_Call) Return(_a0 *quote.RetainedPegoutQuote, _a1 error) *PegoutQuoteRepositoryMock_GetRetainedQuote_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_GetRetainedQuote_Call) RunAndReturn(run func(context.Context, string) (*quote.RetainedPegoutQuote, error)) *PegoutQuoteRepositoryMock_GetRetainedQuote_Call { + _c.Call.Return(run) + return _c +} + +// GetRetainedQuoteByState provides a mock function with given fields: ctx, states +func (_m *PegoutQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PegoutState) ([]quote.RetainedPegoutQuote, error) { + _va := make([]interface{}, len(states)) + for _i := range states { + _va[_i] = states[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for GetRetainedQuoteByState") + } + + var r0 []quote.RetainedPegoutQuote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ...quote.PegoutState) ([]quote.RetainedPegoutQuote, error)); ok { + return rf(ctx, states...) + } + if rf, ok := ret.Get(0).(func(context.Context, ...quote.PegoutState) []quote.RetainedPegoutQuote); ok { + r0 = rf(ctx, states...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]quote.RetainedPegoutQuote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ...quote.PegoutState) error); ok { + r1 = rf(ctx, states...) } else { - return arg.([]quote.PegoutDeposit), args.Error(1) + r1 = ret.Error(1) } + + return r0, r1 +} + +// PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRetainedQuoteByState' +type PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call struct { + *mock.Call +} + +// GetRetainedQuoteByState is a helper method to define mock.On call +// - ctx context.Context +// - states ...quote.PegoutState +func (_e *PegoutQuoteRepositoryMock_Expecter) GetRetainedQuoteByState(ctx interface{}, states ...interface{}) *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call { + return &PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call{Call: _e.mock.On("GetRetainedQuoteByState", + append([]interface{}{ctx}, states...)...)} } -func (m *PegoutQuoteRepositoryMock) GetRetainedQuoteByState(ctx context.Context, states ...quote.PegoutState) ([]quote.RetainedPegoutQuote, error) { - args := m.Called(ctx, states) - arg := args.Get(0) - if arg == nil { - return nil, args.Error(1) +func (_c *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call) Run(run func(ctx context.Context, states ...quote.PegoutState)) *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]quote.PegoutState, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(quote.PegoutState) + } + } + run(args[0].(context.Context), variadicArgs...) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call) Return(_a0 []quote.RetainedPegoutQuote, _a1 error) *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call) RunAndReturn(run func(context.Context, ...quote.PegoutState) ([]quote.RetainedPegoutQuote, error)) *PegoutQuoteRepositoryMock_GetRetainedQuoteByState_Call { + _c.Call.Return(run) + return _c +} + +// InsertQuote provides a mock function with given fields: ctx, hash, _a2 +func (_m *PegoutQuoteRepositoryMock) InsertQuote(ctx context.Context, hash string, _a2 quote.PegoutQuote) error { + ret := _m.Called(ctx, hash, _a2) + + if len(ret) == 0 { + panic("no return value specified for InsertQuote") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, quote.PegoutQuote) error); ok { + r0 = rf(ctx, hash, _a2) } else { - return arg.([]quote.RetainedPegoutQuote), args.Error(1) + r0 = ret.Error(0) } + + return r0 +} + +// PegoutQuoteRepositoryMock_InsertQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InsertQuote' +type PegoutQuoteRepositoryMock_InsertQuote_Call struct { + *mock.Call } -func (m *PegoutQuoteRepositoryMock) DeleteQuotes(ctx context.Context, hashes []string) (uint, error) { - args := m.Called(ctx, hashes) - return args.Get(0).(uint), args.Error(1) +// InsertQuote is a helper method to define mock.On call +// - ctx context.Context +// - hash string +// - _a2 quote.PegoutQuote +func (_e *PegoutQuoteRepositoryMock_Expecter) InsertQuote(ctx interface{}, hash interface{}, _a2 interface{}) *PegoutQuoteRepositoryMock_InsertQuote_Call { + return &PegoutQuoteRepositoryMock_InsertQuote_Call{Call: _e.mock.On("InsertQuote", ctx, hash, _a2)} } -func (m *PegoutQuoteRepositoryMock) UpsertPegoutDeposit(ctx context.Context, deposit quote.PegoutDeposit) error { - args := m.Called(ctx, deposit) - return args.Error(0) +func (_c *PegoutQuoteRepositoryMock_InsertQuote_Call) Run(run func(ctx context.Context, hash string, _a2 quote.PegoutQuote)) *PegoutQuoteRepositoryMock_InsertQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(quote.PegoutQuote)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_InsertQuote_Call) Return(_a0 error) *PegoutQuoteRepositoryMock_InsertQuote_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_InsertQuote_Call) RunAndReturn(run func(context.Context, string, quote.PegoutQuote) error) *PegoutQuoteRepositoryMock_InsertQuote_Call { + _c.Call.Return(run) + return _c +} + +// InsertRetainedQuote provides a mock function with given fields: ctx, _a1 +func (_m *PegoutQuoteRepositoryMock) InsertRetainedQuote(ctx context.Context, _a1 quote.RetainedPegoutQuote) error { + ret := _m.Called(ctx, _a1) + + if len(ret) == 0 { + panic("no return value specified for InsertRetainedQuote") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, quote.RetainedPegoutQuote) error); ok { + r0 = rf(ctx, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PegoutQuoteRepositoryMock_InsertRetainedQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InsertRetainedQuote' +type PegoutQuoteRepositoryMock_InsertRetainedQuote_Call struct { + *mock.Call +} + +// InsertRetainedQuote is a helper method to define mock.On call +// - ctx context.Context +// - _a1 quote.RetainedPegoutQuote +func (_e *PegoutQuoteRepositoryMock_Expecter) InsertRetainedQuote(ctx interface{}, _a1 interface{}) *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call { + return &PegoutQuoteRepositoryMock_InsertRetainedQuote_Call{Call: _e.mock.On("InsertRetainedQuote", ctx, _a1)} +} + +func (_c *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call) Run(run func(ctx context.Context, _a1 quote.RetainedPegoutQuote)) *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(quote.RetainedPegoutQuote)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call) Return(_a0 error) *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call) RunAndReturn(run func(context.Context, quote.RetainedPegoutQuote) error) *PegoutQuoteRepositoryMock_InsertRetainedQuote_Call { + _c.Call.Return(run) + return _c +} + +// ListPegoutDepositsByAddress provides a mock function with given fields: ctx, address +func (_m *PegoutQuoteRepositoryMock) ListPegoutDepositsByAddress(ctx context.Context, address string) ([]quote.PegoutDeposit, error) { + ret := _m.Called(ctx, address) + + if len(ret) == 0 { + panic("no return value specified for ListPegoutDepositsByAddress") + } + + var r0 []quote.PegoutDeposit + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]quote.PegoutDeposit, error)); ok { + return rf(ctx, address) + } + if rf, ok := ret.Get(0).(func(context.Context, string) []quote.PegoutDeposit); ok { + r0 = rf(ctx, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]quote.PegoutDeposit) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListPegoutDepositsByAddress' +type PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call struct { + *mock.Call +} + +// ListPegoutDepositsByAddress is a helper method to define mock.On call +// - ctx context.Context +// - address string +func (_e *PegoutQuoteRepositoryMock_Expecter) ListPegoutDepositsByAddress(ctx interface{}, address interface{}) *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call { + return &PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call{Call: _e.mock.On("ListPegoutDepositsByAddress", ctx, address)} +} + +func (_c *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call) Run(run func(ctx context.Context, address string)) *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call) Return(_a0 []quote.PegoutDeposit, _a1 error) *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call) RunAndReturn(run func(context.Context, string) ([]quote.PegoutDeposit, error)) *PegoutQuoteRepositoryMock_ListPegoutDepositsByAddress_Call { + _c.Call.Return(run) + return _c +} + +// UpdateRetainedQuote provides a mock function with given fields: ctx, _a1 +func (_m *PegoutQuoteRepositoryMock) UpdateRetainedQuote(ctx context.Context, _a1 quote.RetainedPegoutQuote) error { + ret := _m.Called(ctx, _a1) + + if len(ret) == 0 { + panic("no return value specified for UpdateRetainedQuote") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, quote.RetainedPegoutQuote) error); ok { + r0 = rf(ctx, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateRetainedQuote' +type PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call struct { + *mock.Call +} + +// UpdateRetainedQuote is a helper method to define mock.On call +// - ctx context.Context +// - _a1 quote.RetainedPegoutQuote +func (_e *PegoutQuoteRepositoryMock_Expecter) UpdateRetainedQuote(ctx interface{}, _a1 interface{}) *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call { + return &PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call{Call: _e.mock.On("UpdateRetainedQuote", ctx, _a1)} +} + +func (_c *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call) Run(run func(ctx context.Context, _a1 quote.RetainedPegoutQuote)) *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(quote.RetainedPegoutQuote)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call) Return(_a0 error) *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call) RunAndReturn(run func(context.Context, quote.RetainedPegoutQuote) error) *PegoutQuoteRepositoryMock_UpdateRetainedQuote_Call { + _c.Call.Return(run) + return _c +} + +// UpsertPegoutDeposit provides a mock function with given fields: ctx, deposit +func (_m *PegoutQuoteRepositoryMock) UpsertPegoutDeposit(ctx context.Context, deposit quote.PegoutDeposit) error { + ret := _m.Called(ctx, deposit) + + if len(ret) == 0 { + panic("no return value specified for UpsertPegoutDeposit") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, quote.PegoutDeposit) error); ok { + r0 = rf(ctx, deposit) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpsertPegoutDeposit' +type PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call struct { + *mock.Call +} + +// UpsertPegoutDeposit is a helper method to define mock.On call +// - ctx context.Context +// - deposit quote.PegoutDeposit +func (_e *PegoutQuoteRepositoryMock_Expecter) UpsertPegoutDeposit(ctx interface{}, deposit interface{}) *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call { + return &PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call{Call: _e.mock.On("UpsertPegoutDeposit", ctx, deposit)} +} + +func (_c *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call) Run(run func(ctx context.Context, deposit quote.PegoutDeposit)) *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(quote.PegoutDeposit)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call) Return(_a0 error) *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call) RunAndReturn(run func(context.Context, quote.PegoutDeposit) error) *PegoutQuoteRepositoryMock_UpsertPegoutDeposit_Call { + _c.Call.Return(run) + return _c +} + +// UpsertPegoutDeposits provides a mock function with given fields: ctx, deposits +func (_m *PegoutQuoteRepositoryMock) UpsertPegoutDeposits(ctx context.Context, deposits []quote.PegoutDeposit) error { + ret := _m.Called(ctx, deposits) + + if len(ret) == 0 { + panic("no return value specified for UpsertPegoutDeposits") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, []quote.PegoutDeposit) error); ok { + r0 = rf(ctx, deposits) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpsertPegoutDeposits' +type PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call struct { + *mock.Call +} + +// UpsertPegoutDeposits is a helper method to define mock.On call +// - ctx context.Context +// - deposits []quote.PegoutDeposit +func (_e *PegoutQuoteRepositoryMock_Expecter) UpsertPegoutDeposits(ctx interface{}, deposits interface{}) *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call { + return &PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call{Call: _e.mock.On("UpsertPegoutDeposits", ctx, deposits)} +} + +func (_c *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call) Run(run func(ctx context.Context, deposits []quote.PegoutDeposit)) *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]quote.PegoutDeposit)) + }) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call) Return(_a0 error) *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call) RunAndReturn(run func(context.Context, []quote.PegoutDeposit) error) *PegoutQuoteRepositoryMock_UpsertPegoutDeposits_Call { + _c.Call.Return(run) + return _c +} + +// NewPegoutQuoteRepositoryMock creates a new instance of PegoutQuoteRepositoryMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewPegoutQuoteRepositoryMock(t interface { + mock.TestingT + Cleanup(func()) +}) *PegoutQuoteRepositoryMock { + mock := &PegoutQuoteRepositoryMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock } diff --git a/test/utils.go b/test/utils.go index 4e4ff144..972dc98b 100644 --- a/test/utils.go +++ b/test/utils.go @@ -1,16 +1,26 @@ package test import ( + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "io" + "os" + "path/filepath" + "runtime" "testing" + "time" ) var AnyCtx = mock.AnythingOfType("context.backgroundCtx") const ( - AnyAddress = "any address" - AnyString = "any value" + AnyAddress = "any address" + AnyString = "any value" + keyPath = "../../docker-compose/localstack/local-key.json" + KeyPassword = "test" ) type Case[V, R any] struct { @@ -27,3 +37,21 @@ func RunTable[V, R any](t *testing.T, table Table[V, R], validationFunction func assert.Equal(t, testCase.Result, result) } } + +func OpenWalletForTest(t *testing.T, testRef string) *rootstock.RskAccount { + _, currentPackageDir, _, _ := runtime.Caller(0) + testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-%s-%d", testRef, time.Now().UnixNano())) + keyFile, err := os.Open(filepath.Join(currentPackageDir, keyPath)) + require.NoError(t, err) + + defer func(file *os.File) { + closingErr := file.Close() + require.NoError(t, closingErr) + }(keyFile) + + keyBytes, err := io.ReadAll(keyFile) + require.NoError(t, err) + account, err := rootstock.GetAccount(testDir, 0, string(keyBytes), KeyPassword) + require.NoError(t, err) + return account +} From ef0adb33b5f3c82e1841e3fcc61adc06051d92b4 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 23 Apr 2024 13:30:00 +0200 Subject: [PATCH 050/113] fix: move error message to constant --- internal/adapters/dataproviders/event_test.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/internal/adapters/dataproviders/event_test.go b/internal/adapters/dataproviders/event_test.go index 703bac29..a15382e4 100644 --- a/internal/adapters/dataproviders/event_test.go +++ b/internal/adapters/dataproviders/event_test.go @@ -12,7 +12,10 @@ import ( "time" ) -const testEventId entities.EventId = "test_event" +const ( + testEventId entities.EventId = "test_event" + channelNotClosedMsg string = "Channel was not closed" +) type testEvent struct { entities.Event @@ -39,7 +42,7 @@ func TestLocalEventBus_Shutdown(t *testing.T) { case result := <-closeChannel: assert.True(t, result) default: - assert.Fail(t, "Channel was not closed") + assert.Fail(t, channelNotClosedMsg) } }) @@ -53,7 +56,7 @@ func TestLocalEventBus_Shutdown(t *testing.T) { case <-closeChannel: assert.Empty(t, bus.(*dataproviders.LocalEventBus).Topics) default: - assert.Fail(t, "Channel was not closed") + assert.Fail(t, channelNotClosedMsg) } }) @@ -69,7 +72,7 @@ func TestLocalEventBus_Shutdown(t *testing.T) { case <-closeChannel: assert.Empty(t, bus.(*dataproviders.LocalEventBus).Topics) default: - assert.Fail(t, "Channel was not closed") + assert.Fail(t, channelNotClosedMsg) } require.NotPanics(t, func() { result := bus.Subscribe(testEventId) From 2371a7464836196bf62be92006c3927a1d55a221 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 23 Apr 2024 15:40:07 +0200 Subject: [PATCH 051/113] chore: rename wallet implementation files --- .../dataproviders/bitcoin/{wallet.go => bitcoind_wallet.go} | 0 .../bitcoin/{wallet_test.go => bitcoind_wallet_test.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename internal/adapters/dataproviders/bitcoin/{wallet.go => bitcoind_wallet.go} (100%) rename internal/adapters/dataproviders/bitcoin/{wallet_test.go => bitcoind_wallet_test.go} (100%) diff --git a/internal/adapters/dataproviders/bitcoin/wallet.go b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go similarity index 100% rename from internal/adapters/dataproviders/bitcoin/wallet.go rename to internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go diff --git a/internal/adapters/dataproviders/bitcoin/wallet_test.go b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go similarity index 100% rename from internal/adapters/dataproviders/bitcoin/wallet_test.go rename to internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go From 542652098aee750934a917e9228591b14a116cae Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 24 Apr 2024 10:39:54 +0200 Subject: [PATCH 052/113] chore: change rsk account files location --- .../rootstock/{ => account}/account.go | 7 ++++--- .../rootstock/{ => account}/account_test.go | 20 +++++++++---------- internal/configuration/bootstrap/rootstock.go | 3 ++- test/utils.go | 3 ++- 4 files changed, 18 insertions(+), 15 deletions(-) rename internal/adapters/dataproviders/rootstock/{ => account}/account.go (83%) rename internal/adapters/dataproviders/rootstock/{ => account}/account_test.go (75%) diff --git a/internal/adapters/dataproviders/rootstock/account.go b/internal/adapters/dataproviders/rootstock/account/account.go similarity index 83% rename from internal/adapters/dataproviders/rootstock/account.go rename to internal/adapters/dataproviders/rootstock/account/account.go index d0be4001..e36a86d5 100644 --- a/internal/adapters/dataproviders/rootstock/account.go +++ b/internal/adapters/dataproviders/rootstock/account/account.go @@ -1,14 +1,15 @@ -package rootstock +package account import ( "fmt" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" log "github.com/sirupsen/logrus" "os" ) -func GetAccount(keyDir string, accountNum int, encryptedJson, password string) (*RskAccount, error) { +func GetRskAccount(keyDir string, accountNum int, encryptedJson, password string) (*rootstock.RskAccount, error) { if err := os.MkdirAll(keyDir, 0700); err != nil { return nil, err } @@ -17,7 +18,7 @@ func GetAccount(keyDir string, accountNum int, encryptedJson, password string) ( if account, err := retrieveOrCreateAccount(ks, accountNum, encryptedJson, password); err != nil { return nil, err } else { - return &RskAccount{ + return &rootstock.RskAccount{ Account: account, Keystore: ks, }, nil diff --git a/internal/adapters/dataproviders/rootstock/account_test.go b/internal/adapters/dataproviders/rootstock/account/account_test.go similarity index 75% rename from internal/adapters/dataproviders/rootstock/account_test.go rename to internal/adapters/dataproviders/rootstock/account/account_test.go index 282ed3f3..f732f59b 100644 --- a/internal/adapters/dataproviders/rootstock/account_test.go +++ b/internal/adapters/dataproviders/rootstock/account/account_test.go @@ -1,9 +1,9 @@ -package rootstock_test +package account_test import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/rsksmart/liquidity-provider-server/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -16,7 +16,7 @@ import ( const ( keyAddress = "0x9d93929a9099be4355fc2389fbf253982f9df47c" - keyPath = "../../../../docker-compose/localstack/local-key.json" + keyPath = "../../../../../docker-compose/localstack/local-key.json" ) func TestGetAccount(t *testing.T) { @@ -32,7 +32,7 @@ func TestGetAccount(t *testing.T) { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) t.Run("Create new account", func(t *testing.T) { - account, testError := rootstock.GetAccount(testDir, 0, string(keyBytes), test.KeyPassword) + account, testError := account.GetRskAccount(testDir, 0, string(keyBytes), test.KeyPassword) _, noExistError := os.Stat(testDir) assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") require.NoError(t, testError) @@ -40,7 +40,7 @@ func TestGetAccount(t *testing.T) { assert.NotNil(t, 1, len(account.Keystore.Accounts())) }) t.Run("Retrieve created account new account", func(t *testing.T) { - otherAccount, otherError := rootstock.GetAccount(testDir, 0, string(keyBytes), test.KeyPassword) + otherAccount, otherError := account.GetRskAccount(testDir, 0, string(keyBytes), test.KeyPassword) require.NoError(t, otherError) assert.Equal(t, common.HexToAddress(keyAddress), otherAccount.Account.Address) assert.NotNil(t, 1, len(otherAccount.Keystore.Accounts())) @@ -60,25 +60,25 @@ func TestGetAccount_ErrorHandling(t *testing.T) { keyBytes, setupErr := io.ReadAll(keyFile) require.NoError(t, setupErr) t.Run("Invalid dir", func(t *testing.T) { - account, err := rootstock.GetAccount("/test", 0, string(keyBytes), test.KeyPassword) + account, err := account.GetRskAccount("/test", 0, string(keyBytes), test.KeyPassword) assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid key", func(t *testing.T) { - account, err := rootstock.GetAccount(testDir, 0, "any key", test.KeyPassword) + account, err := account.GetRskAccount(testDir, 0, "any key", test.KeyPassword) assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid password", func(t *testing.T) { - account, err := rootstock.GetAccount(testDir, 0, string(keyBytes), "incorrect") + account, err := account.GetRskAccount(testDir, 0, string(keyBytes), "incorrect") assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid account number", func(t *testing.T) { // we create a keystore first so in the second call we can try to get an account that doesn't exist - _, err := rootstock.GetAccount(testDir, 0, string(keyBytes), test.KeyPassword) + _, err := account.GetRskAccount(testDir, 0, string(keyBytes), test.KeyPassword) require.NoError(t, err) - account, err := rootstock.GetAccount(testDir, 1, string(keyBytes), test.KeyPassword) + account, err := account.GetRskAccount(testDir, 1, string(keyBytes), test.KeyPassword) assert.Nil(t, account) require.Error(t, err) }) diff --git a/internal/configuration/bootstrap/rootstock.go b/internal/configuration/bootstrap/rootstock.go index 7705a07c..ea5671f0 100644 --- a/internal/configuration/bootstrap/rootstock.go +++ b/internal/configuration/bootstrap/rootstock.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/rpc" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" environment2 "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" log "github.com/sirupsen/logrus" "net/http" @@ -54,7 +55,7 @@ func Rootstock(ctx context.Context, env environment2.RskEnv) (*rootstock.RskClie } func RootstockAccount(env environment2.RskEnv, secrets environment2.ApplicationSecrets) (*rootstock.RskAccount, error) { - return rootstock.GetAccount( + return account.GetRskAccount( "geth_keystore", env.AccountNumber, secrets.EncryptedJson, diff --git a/test/utils.go b/test/utils.go index 972dc98b..45c2ac92 100644 --- a/test/utils.go +++ b/test/utils.go @@ -3,6 +3,7 @@ package test import ( "fmt" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -51,7 +52,7 @@ func OpenWalletForTest(t *testing.T, testRef string) *rootstock.RskAccount { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) - account, err := rootstock.GetAccount(testDir, 0, string(keyBytes), KeyPassword) + account, err := account.GetRskAccount(testDir, 0, string(keyBytes), KeyPassword) require.NoError(t, err) return account } From 09ed0c270c8ca2809a587f51f15f7821cf8b8dbf Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 25 Apr 2024 14:47:56 +0200 Subject: [PATCH 053/113] refactor: change rpc function to get tx info --- go.mod | 13 +- go.sum | 13 ++ .../adapters/dataproviders/bitcoin/client.go | 3 +- .../adapters/dataproviders/bitcoin/rpc.go | 26 ++-- .../dataproviders/bitcoin/rpc_test.go | 116 +++++------------- .../dataproviders/rootstock/common.go | 7 -- .../dataproviders/rootstock/wallet.go | 5 +- .../dataproviders/rootstock/wallet_test.go | 13 +- internal/configuration/bootstrap/rootstock.go | 2 +- internal/configuration/registry/rootstock.go | 3 +- .../getRawTransactionVerboseReceived.json | 58 +++++++++ test/mocks/getRawTransactionVerboseSent.json | 59 +++++++++ test/mocks/rpc_client_mock.go | 58 +++++++++ test/utils.go | 3 +- 14 files changed, 259 insertions(+), 120 deletions(-) create mode 100644 test/mocks/getRawTransactionVerboseReceived.json create mode 100644 test/mocks/getRawTransactionVerboseSent.json diff --git a/go.mod b/go.mod index 0322c6b1..50f196e9 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.18.25 github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.8 github.com/aws/aws-sdk-go-v2/service/ses v1.16.4 - github.com/btcsuite/btcd v0.23.4 - github.com/btcsuite/btcd/btcutil v1.1.3 - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 + github.com/btcsuite/btcd v0.24.0 + github.com/btcsuite/btcd/btcutil v1.1.5 + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/ethereum/go-ethereum v1.11.6 github.com/go-playground/validator/v10 v10.17.0 github.com/gorilla/csrf v1.7.2 @@ -23,6 +23,7 @@ require ( ) require ( + github.com/aead/siphash v1.0.1 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.39 // indirect @@ -37,10 +38,12 @@ require ( github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect + github.com/btcsuite/winsvc v1.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/lru v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect @@ -54,7 +57,10 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.2 // indirect + github.com/jessevdk/go-flags v1.4.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jrick/logrotate v1.0.0 // indirect + github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect github.com/klauspost/compress v1.16.5 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-isatty v0.0.18 // indirect @@ -62,6 +68,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/stretchr/objx v0.5.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect diff --git a/go.sum b/go.sum index 4de8ecc6..c89aeec3 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,7 @@ github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.2 h1:0Aok9u/HVTk7RtY6M1KDcthbaMKGhhS0eLPxIdSIzRI= @@ -42,6 +43,9 @@ github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tj github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= +github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= @@ -50,10 +54,14 @@ github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9Ur github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -65,6 +73,7 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -92,6 +101,7 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPc github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= @@ -179,12 +189,15 @@ github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixH github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= diff --git a/internal/adapters/dataproviders/bitcoin/client.go b/internal/adapters/dataproviders/bitcoin/client.go index 783a665a..050fe7e7 100644 --- a/internal/adapters/dataproviders/bitcoin/client.go +++ b/internal/adapters/dataproviders/bitcoin/client.go @@ -18,13 +18,14 @@ type rpcWallet interface { WalletPassphrase(passphrase string, timeoutSecs int64) error ImportAddressRescan(address string, account string, rescan bool) error ListUnspentMinMaxAddresses(minConf int, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) + GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) } type rpcClient interface { rpcWallet Ping() error Disconnect() - GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) + GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRawResult, error) GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) diff --git a/internal/adapters/dataproviders/bitcoin/rpc.go b/internal/adapters/dataproviders/bitcoin/rpc.go index 6ce91192..1adcac7f 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc.go +++ b/internal/adapters/dataproviders/bitcoin/rpc.go @@ -54,7 +54,10 @@ func (rpc *bitcoindRpc) DecodeAddress(address string, keepVersion bool) ([]byte, } func (rpc *bitcoindRpc) GetTransactionInfo(hash string) (blockchain.BitcoinTransactionInformation, error) { + // nolint:prealloc + // false positive var amounts []*entities.Wei + var btcAmount btcutil.Amount var ok bool parsedHash, err := chainhash.NewHashFromStr(hash) @@ -62,27 +65,26 @@ func (rpc *bitcoindRpc) GetTransactionInfo(hash string) (blockchain.BitcoinTrans return blockchain.BitcoinTransactionInformation{}, err } - tx, err := rpc.conn.client.GetTransaction(parsedHash) + tx, err := rpc.conn.client.GetRawTransactionVerbose(parsedHash) if err != nil { return blockchain.BitcoinTransactionInformation{}, err } outputs := make(map[string][]*entities.Wei) - for _, output := range tx.Details { - amounts, ok = outputs[output.Address] + for _, output := range tx.Vout { + amounts, ok = outputs[output.ScriptPubKey.Address] if !ok { amounts = make([]*entities.Wei, 0) } - if output.Category == "send" { // send category has a negative value - amounts = append(amounts, entities.SatoshiToWei(uint64(output.Amount*BtcToSatoshi*-1))) - } else { - amounts = append(amounts, entities.SatoshiToWei(uint64(output.Amount*BtcToSatoshi))) + if btcAmount, err = btcutil.NewAmount(output.Value); err != nil { + return blockchain.BitcoinTransactionInformation{}, err } - outputs[output.Address] = amounts + amounts = append(amounts, entities.SatoshiToWei(uint64(btcAmount.ToUnit(btcutil.AmountSatoshi)))) + outputs[output.ScriptPubKey.Address] = amounts } return blockchain.BitcoinTransactionInformation{ - Hash: tx.TxID, - Confirmations: uint64(tx.Confirmations), + Hash: tx.Hash, + Confirmations: tx.Confirmations, Outputs: outputs, }, nil } @@ -160,7 +162,7 @@ func (rpc *bitcoindRpc) GetTransactionBlockInfo(transactionHash string) (blockch if err != nil { return blockchain.BitcoinBlockInformation{}, err } - tx, err := rpc.conn.client.GetTransaction(parsedTxHash) + tx, err := rpc.conn.client.GetRawTransactionVerbose(parsedTxHash) if err != nil { return blockchain.BitcoinBlockInformation{}, err } @@ -187,7 +189,7 @@ func (rpc *bitcoindRpc) getTxBlock(txHash string) (*wire.MsgBlock, *chainhash.Ha if err != nil { return nil, nil, err } - tx, err := rpc.conn.client.GetTransaction(parsedTxHash) + tx, err := rpc.conn.client.GetRawTransactionVerbose(parsedTxHash) if err != nil { return nil, nil, err } diff --git a/internal/adapters/dataproviders/bitcoin/rpc_test.go b/internal/adapters/dataproviders/bitcoin/rpc_test.go index 47c0c2e2..58ee50b5 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc_test.go +++ b/internal/adapters/dataproviders/bitcoin/rpc_test.go @@ -158,7 +158,7 @@ func TestBitcoindRpc_GetRawTransaction_ErrorHandling(t *testing.T) { func TestBitcoindRpc_GetTransactionBlockInfo(t *testing.T) { client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlockVerbose", mock.Anything).Return(&btcjson.GetBlockVerboseResult{Height: 123}, nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err := rpc.GetTransactionBlockInfo(testnetTestTxHash) @@ -175,14 +175,14 @@ func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { require.Error(t, err) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(nil, assert.AnError).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) require.Error(t, err) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlockVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) @@ -190,7 +190,7 @@ func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { require.Error(t, err) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: "blk"}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: "blk"}, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) @@ -201,7 +201,7 @@ func TestBitcoindRpc_BuildMerkleBranch(t *testing.T) { block := getTestBlock(t, testnetBlockFile) client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err := rpc.BuildMerkleBranch(testnetTestTxHash) @@ -231,14 +231,14 @@ func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { require.Equal(t, blockchain.MerkleBranch{}, branch) client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(nil, assert.AnError).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) require.Error(t, err) require.Equal(t, blockchain.MerkleBranch{}, branch) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(&wire.MsgBlock{}, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) @@ -246,7 +246,7 @@ func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { require.Equal(t, blockchain.MerkleBranch{}, branch) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: "blkhash"}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: "blkhash"}, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) require.Error(t, err) @@ -257,7 +257,7 @@ func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { block := getTestBlock(t, testnetBlockFile) client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err := rpc.BuildMerkleBranch("9dd8911176857dff8244f75f7c95782b3495048ad75632f0a58c8e942cefb223") @@ -269,7 +269,7 @@ func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { func TestBitcoindRpc_GetPartialMerkleTree(t *testing.T) { block := getTestBlock(t, testnetBlockFile) client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) pmt, err := rpc.GetPartialMerkleTree(testnetTestTxHash) @@ -341,7 +341,7 @@ func TestBitcoindRpc_BuildMerkleBranch_MainnetBlock(t *testing.T) { mainnetBlock := getTestBlock(t, mainnetBlockFile) for _, c := range cases { client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(mainnetBlock.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) serializedPMT, err := rpc.GetPartialMerkleTree(c.tx) @@ -361,7 +361,7 @@ func TestBitcoindRpc_GetPartialMerkleTree_ErrorHandling(t *testing.T) { block := getTestBlock(t, testnetBlockFile) msgBlock := block.MsgBlock() msgBlock.Transactions = append(msgBlock.Transactions, msgBlock.Transactions...) - client.On("GetTransaction", mock.Anything).Return(&btcjson.GetTransactionResult{BlockHash: testnetTestBlockHash}, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(msgBlock, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err := rpc.GetPartialMerkleTree(testnetTestTxHash) @@ -370,101 +370,47 @@ func TestBitcoindRpc_GetPartialMerkleTree_ErrorHandling(t *testing.T) { assert.Nil(t, result) } -var rpcServerReceiveTx = ` - { - "amount": 0.00500000, - "confirmations": 163, - "blockhash": "00000000001e94d85c3e736aa4071d36d26547713820a27af9edbe97489c696f", - "blockheight": 2582756, - "blockindex": 406, - "blocktime": 1710931198, - "txid": "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29", - "wtxid": "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29", - "walletconflicts": [], - "time": 1710930012, - "timereceived": 1710930012, - "bip125-replaceable": "no", - "details": [ - { - "address": "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5", - "parent_descs": [], - "category": "receive", - "amount": 0.00500000, - "label": "dev", - "vout": 1 - } - ], - "hex": "0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700" - } - ` - -var rpcServerSendTx = ` - { - "amount": -0.00500000, - "fee": -0.00006700, - "confirmations": 1649, - "blockhash": "0000000000002d82f47f76d9b877af8f264504d6e0f89b82e89d2d84f64f269a", - "blockheight": 2581763, - "blockindex": 9, - "blocktime": 1710330877, - "txid": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", - "wtxid": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", - "walletconflicts": [], - "time": 1710330592, - "timereceived": 1710330592, - "bip125-replaceable": "no", - "details": [ - { - "address": "mqbKtarYKnoEdPheFFDGRjksvEpb2vJGNh", - "category": "send", - "amount": -0.00500000, - "vout": 0, - "fee": -0.00006700, - "abandoned": false - }, - { - "category": "send", - "amount": 0.00000000, - "vout": 1, - "fee": -0.00006700, - "abandoned": false - } - ], - "hex": "020000000187bc0ecbe7c384a5c9ed76ed212395718f2e305e805151067a27fc056f27a242020000006a47304402204992bb143d814f6b560198300ae0e4b0b1223c57a525cedd1a8d71238d8efd7802202f928d3a53f8a263528e7131c0cd5cb25715aad87769d5e47e99ee4876ee181a0121029e17dc44ad33f0f6f54d404d87441ef108873b451d4f236833ea9bb03ea2b04cfdffffff0320a10700000000001976a9146e84f2d601c6742a94bf9ba32bea7e3f3e377fbb88ac0000000000000000226a20ef4f66bcf4f55bc72c2c8e01894fe944a5fa3be3a8b2a2a474f0447838ddc1c2f8da1d00000000001976a9145c6dbcd0321aadc2b51b564825aa444c886030b988ac00000000" - } - ` - func TestBitcoindRpc_GetTransactionInfo(t *testing.T) { - txReceiveDetails := btcjson.GetTransactionResult{} - err := json.Unmarshal([]byte(rpcServerReceiveTx), &txReceiveDetails) + receivedTxPath, err := filepath.Abs("../../../../test/mocks/getRawTransactionVerboseReceived.json") + require.NoError(t, err) + receivedTxResponse, err := os.ReadFile(receivedTxPath) + require.NoError(t, err) + txReceiveDetails := btcjson.TxRawResult{} + err = json.Unmarshal(receivedTxResponse, &txReceiveDetails) require.NoError(t, err) client := &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&txReceiveDetails, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&txReceiveDetails, nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) result, err := rpc.GetTransactionInfo(testnetTestTxHash) require.NoError(t, err) assert.Equal(t, blockchain.BitcoinTransactionInformation{ Hash: testnetTestTxHash, - Confirmations: uint64(163), + Confirmations: uint64(105277), Outputs: map[string][]*entities.Wei{ + "mr5FSft4PQvoWbf9Sf5iQXbw1u445iNksp": {entities.NewWei(0.004886 * 1e18)}, "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5": {entities.NewWei(0.005 * 1e18)}, }, }, result) + sentTxPath, err := filepath.Abs("../../../../test/mocks/getRawTransactionVerboseSent.json") + require.NoError(t, err) + sentTxResponse, err := os.ReadFile(sentTxPath) + require.NoError(t, err) const sendTxHash = "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21" - txSendDetails := btcjson.GetTransactionResult{} - err = json.Unmarshal([]byte(rpcServerSendTx), &txSendDetails) + txSendDetails := btcjson.TxRawResult{} + err = json.Unmarshal(sentTxResponse, &txSendDetails) require.NoError(t, err) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(&txSendDetails, nil).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(&txSendDetails, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) result, err = rpc.GetTransactionInfo(sendTxHash) require.NoError(t, err) assert.Equal(t, blockchain.BitcoinTransactionInformation{ Hash: sendTxHash, - Confirmations: uint64(1649), + Confirmations: uint64(106306), Outputs: map[string][]*entities.Wei{ "mqbKtarYKnoEdPheFFDGRjksvEpb2vJGNh": {entities.NewWei(0.005 * 1e18)}, + "mowfvQDraTDvRgZowL4tx5EatL1u78w65v": {entities.NewWei(0.01956600 * 1e18)}, "": {entities.NewWei(0)}, // Null data script output }, }, result) @@ -478,7 +424,7 @@ func TestBitcoindRpc_GetTransactionInfo_ErrorHandling(t *testing.T) { require.Error(t, err) client = &mocks.RpcClientMock{} - client.On("GetTransaction", mock.Anything).Return(nil, assert.AnError).Once() + client.On("GetRawTransactionVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionInfo(testnetTestTxHash) assert.Equal(t, blockchain.BitcoinTransactionInformation{}, result) diff --git a/internal/adapters/dataproviders/rootstock/common.go b/internal/adapters/dataproviders/rootstock/common.go index e1776d61..a5b70540 100644 --- a/internal/adapters/dataproviders/rootstock/common.go +++ b/internal/adapters/dataproviders/rootstock/common.go @@ -2,9 +2,7 @@ package rootstock import ( "context" - "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" geth "github.com/ethereum/go-ethereum/core/types" @@ -25,11 +23,6 @@ var DefaultRetryParams = RetryParams{ Sleep: rpcCallRetrySleep, } -type RskAccount struct { - Account *accounts.Account - Keystore *keystore.KeyStore -} - type RskClient struct { client RpcClientBinding } diff --git a/internal/adapters/dataproviders/rootstock/wallet.go b/internal/adapters/dataproviders/rootstock/wallet.go index 2c4c3184..e22764f0 100644 --- a/internal/adapters/dataproviders/rootstock/wallet.go +++ b/internal/adapters/dataproviders/rootstock/wallet.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" geth "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" log "github.com/sirupsen/logrus" "math/big" @@ -16,11 +17,11 @@ import ( type RskWalletImpl struct { client RpcClientBinding - account *RskAccount + account *account.RskAccount chainId uint64 } -func NewRskWalletImpl(client *RskClient, account *RskAccount, chainId uint64) *RskWalletImpl { +func NewRskWalletImpl(client *RskClient, account *account.RskAccount, chainId uint64) *RskWalletImpl { return &RskWalletImpl{client: client.client, account: account, chainId: chainId} } diff --git a/internal/adapters/dataproviders/rootstock/wallet_test.go b/internal/adapters/dataproviders/rootstock/wallet_test.go index 6204f767..d3ce7964 100644 --- a/internal/adapters/dataproviders/rootstock/wallet_test.go +++ b/internal/adapters/dataproviders/rootstock/wallet_test.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" geth "github.com/ethereum/go-ethereum/core/types" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "github.com/rsksmart/liquidity-provider-server/test" @@ -48,7 +49,7 @@ func TestRskWalletImpl(t *testing.T) { t.Run("SendRbtc error handling", createSendRbtcErrorHandlingTest(account)) } -func createSendRbtcTest(account *rootstock.RskAccount) func(t *testing.T) { +func createSendRbtcTest(account *account.RskAccount) func(t *testing.T) { return func(t *testing.T) { const toAddress = "0x79568C2989232dcA1840087d73d403602364c0D4" var gasLimit uint64 = 21000 @@ -71,7 +72,7 @@ func createSendRbtcTest(account *rootstock.RskAccount) func(t *testing.T) { } } -func createSendRbtcErrorHandlingTest(account *rootstock.RskAccount) func(t *testing.T) { +func createSendRbtcErrorHandlingTest(account *account.RskAccount) func(t *testing.T) { return func(t *testing.T) { const toAddress = "0x79568C2989232dcA1840087d73d403602364c0D4" var gasLimit uint64 = 21000 @@ -133,7 +134,7 @@ func createSendRbtcErrorHandlingTest(account *rootstock.RskAccount) func(t *test } } -func createAddressTest(account *rootstock.RskAccount) func(t *testing.T) { +func createAddressTest(account *account.RskAccount) func(t *testing.T) { return func(t *testing.T) { clientMock := &mocks.RpcClientBindingMock{} wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) @@ -142,7 +143,7 @@ func createAddressTest(account *rootstock.RskAccount) func(t *testing.T) { } } -func creteSignTest(account *rootstock.RskAccount) func(t *testing.T) { +func creteSignTest(account *account.RskAccount) func(t *testing.T) { return func(t *testing.T) { clientMock := &mocks.RpcClientBindingMock{} wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) @@ -170,7 +171,7 @@ func creteSignTest(account *rootstock.RskAccount) func(t *testing.T) { } } -func createSignBytesTest(account *rootstock.RskAccount) func(t *testing.T) { +func createSignBytesTest(account *account.RskAccount) func(t *testing.T) { return func(t *testing.T) { clientMock := &mocks.RpcClientBindingMock{} wallet := rootstock.NewRskWalletImpl(rootstock.NewRskClient(clientMock), account, chainId) @@ -180,7 +181,7 @@ func createSignBytesTest(account *rootstock.RskAccount) func(t *testing.T) { } } -func createValidateTest(account *rootstock.RskAccount) func(t *testing.T) { +func createValidateTest(account *account.RskAccount) func(t *testing.T) { return func(t *testing.T) { const noHex = "no hex" clientMock := &mocks.RpcClientBindingMock{} diff --git a/internal/configuration/bootstrap/rootstock.go b/internal/configuration/bootstrap/rootstock.go index ea5671f0..66f58325 100644 --- a/internal/configuration/bootstrap/rootstock.go +++ b/internal/configuration/bootstrap/rootstock.go @@ -54,7 +54,7 @@ func Rootstock(ctx context.Context, env environment2.RskEnv) (*rootstock.RskClie return rootstock.NewRskClient(client), nil } -func RootstockAccount(env environment2.RskEnv, secrets environment2.ApplicationSecrets) (*rootstock.RskAccount, error) { +func RootstockAccount(env environment2.RskEnv, secrets environment2.ApplicationSecrets) (*account.RskAccount, error) { return account.GetRskAccount( "geth_keystore", env.AccountNumber, diff --git a/internal/configuration/registry/rootstock.go b/internal/configuration/registry/rootstock.go index 3c339677..60c7bdb0 100644 --- a/internal/configuration/registry/rootstock.go +++ b/internal/configuration/registry/rootstock.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bindings" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" @@ -17,7 +18,7 @@ type Rootstock struct { Client *rootstock.RskClient } -func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, account *rootstock.RskAccount, bitcoinConn *bitcoin.Connection) (*Rootstock, error) { +func NewRootstockRegistry(env environment.RskEnv, client *rootstock.RskClient, account *account.RskAccount, bitcoinConn *bitcoin.Connection) (*Rootstock, error) { var bridgeAddress, lbcAddress common.Address var err error diff --git a/test/mocks/getRawTransactionVerboseReceived.json b/test/mocks/getRawTransactionVerboseReceived.json new file mode 100644 index 00000000..49f076a9 --- /dev/null +++ b/test/mocks/getRawTransactionVerboseReceived.json @@ -0,0 +1,58 @@ +{ + "txid": "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29", + "hash": "9f0706c2717fc77bf0f225a4223933a7decb8d36902ddbb0accab8ea894f8b29", + "version": 2, + "size": 372, + "vsize": 372, + "weight": 1488, + "locktime": 2582723, + "vin": [ + { + "txid": "2e4428f122341d770a9074b3f62040f2d48b78a253ad0c46eabaf3732ac2f7eb", + "vout": 0, + "scriptSig": { + "asm": "3044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d[ALL] 038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91e", + "hex": "473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91e" + }, + "sequence": 4294967293 + }, + { + "txid": "f548a9fff50f98aae908594b5f0cd1a8ef57abf7a744a64b0f855b21389ff0b5", + "vout": 0, + "scriptSig": { + "asm": "304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8[ALL] 02498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9", + "hex": "47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9" + }, + "sequence": 4294967293 + } + ], + "vout": [ + { + "value": 0.00488600, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 73cce22e78ec61cd54a6438ca1210b88561ebcdd OP_EQUALVERIFY OP_CHECKSIG", + "desc": "addr(mr5FSft4PQvoWbf9Sf5iQXbw1u445iNksp)#x6h0knfc", + "hex": "76a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac", + "address": "mr5FSft4PQvoWbf9Sf5iQXbw1u445iNksp", + "type": "pubkeyhash" + } + }, + { + "value": 0.00500000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 2c81478132b5dda64ffc484a0d225096c4b22ad5 OP_EQUALVERIFY OP_CHECKSIG", + "desc": "addr(mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5)#8s3w56rv", + "hex": "76a9142c81478132b5dda64ffc484a0d225096c4b22ad588ac", + "address": "mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5", + "type": "pubkeyhash" + } + } + ], + "hex": "0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700", + "blockhash": "00000000001e94d85c3e736aa4071d36d26547713820a27af9edbe97489c696f", + "confirmations": 105277, + "time": 1710931198, + "blocktime": 1710931198 +} \ No newline at end of file diff --git a/test/mocks/getRawTransactionVerboseSent.json b/test/mocks/getRawTransactionVerboseSent.json new file mode 100644 index 00000000..09361ade --- /dev/null +++ b/test/mocks/getRawTransactionVerboseSent.json @@ -0,0 +1,59 @@ +{ + "txid": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", + "hash": "9b0c48b79fe40c67f7a2837e6e59a138a16671caf7685dcd831bd3c51b9f6d21", + "version": 2, + "size": 268, + "vsize": 268, + "weight": 1072, + "locktime": 0, + "vin": [ + { + "txid": "42a2276f05fc277a065151805e302e8f71952321ed76edc9a584c3e7cb0ebc87", + "vout": 2, + "scriptSig": { + "asm": "304402204992bb143d814f6b560198300ae0e4b0b1223c57a525cedd1a8d71238d8efd7802202f928d3a53f8a263528e7131c0cd5cb25715aad87769d5e47e99ee4876ee181a[ALL] 029e17dc44ad33f0f6f54d404d87441ef108873b451d4f236833ea9bb03ea2b04c", + "hex": "47304402204992bb143d814f6b560198300ae0e4b0b1223c57a525cedd1a8d71238d8efd7802202f928d3a53f8a263528e7131c0cd5cb25715aad87769d5e47e99ee4876ee181a0121029e17dc44ad33f0f6f54d404d87441ef108873b451d4f236833ea9bb03ea2b04c" + }, + "sequence": 4294967293 + } + ], + "vout": [ + { + "value": 0.00500000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 6e84f2d601c6742a94bf9ba32bea7e3f3e377fbb OP_EQUALVERIFY OP_CHECKSIG", + "desc": "addr(mqbKtarYKnoEdPheFFDGRjksvEpb2vJGNh)#g4ymaeqj", + "hex": "76a9146e84f2d601c6742a94bf9ba32bea7e3f3e377fbb88ac", + "address": "mqbKtarYKnoEdPheFFDGRjksvEpb2vJGNh", + "type": "pubkeyhash" + } + }, + { + "value": 0.00000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_RETURN ef4f66bcf4f55bc72c2c8e01894fe944a5fa3be3a8b2a2a474f0447838ddc1c2", + "desc": "raw(6a20ef4f66bcf4f55bc72c2c8e01894fe944a5fa3be3a8b2a2a474f0447838ddc1c2)#txzwp9hw", + "hex": "6a20ef4f66bcf4f55bc72c2c8e01894fe944a5fa3be3a8b2a2a474f0447838ddc1c2", + "type": "nulldata" + } + }, + { + "value": 0.01956600, + "n": 2, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 5c6dbcd0321aadc2b51b564825aa444c886030b9 OP_EQUALVERIFY OP_CHECKSIG", + "desc": "addr(mowfvQDraTDvRgZowL4tx5EatL1u78w65v)#5tl49d3n", + "hex": "76a9145c6dbcd0321aadc2b51b564825aa444c886030b988ac", + "address": "mowfvQDraTDvRgZowL4tx5EatL1u78w65v", + "type": "pubkeyhash" + } + } + ], + "hex": "020000000187bc0ecbe7c384a5c9ed76ed212395718f2e305e805151067a27fc056f27a242020000006a47304402204992bb143d814f6b560198300ae0e4b0b1223c57a525cedd1a8d71238d8efd7802202f928d3a53f8a263528e7131c0cd5cb25715aad87769d5e47e99ee4876ee181a0121029e17dc44ad33f0f6f54d404d87441ef108873b451d4f236833ea9bb03ea2b04cfdffffff0320a10700000000001976a9146e84f2d601c6742a94bf9ba32bea7e3f3e377fbb88ac0000000000000000226a20ef4f66bcf4f55bc72c2c8e01894fe944a5fa3be3a8b2a2a474f0447838ddc1c2f8da1d00000000001976a9145c6dbcd0321aadc2b51b564825aa444c886030b988ac00000000", + "blockhash": "0000000000002d82f47f76d9b877af8f264504d6e0f89b82e89d2d84f64f269a", + "confirmations": 106306, + "time": 1710330877, + "blocktime": 1710330877 +} \ No newline at end of file diff --git a/test/mocks/rpc_client_mock.go b/test/mocks/rpc_client_mock.go index 0125d8bf..b7290784 100644 --- a/test/mocks/rpc_client_mock.go +++ b/test/mocks/rpc_client_mock.go @@ -409,6 +409,64 @@ func (_c *RpcClientMock_GetRawTransaction_Call) RunAndReturn(run func(*chainhash return _c } +// GetRawTransactionVerbose provides a mock function with given fields: txHash +func (_m *RpcClientMock) GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRawResult, error) { + ret := _m.Called(txHash) + + if len(ret) == 0 { + panic("no return value specified for GetRawTransactionVerbose") + } + + var r0 *btcjson.TxRawResult + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcjson.TxRawResult, error)); ok { + return rf(txHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcjson.TxRawResult); ok { + r0 = rf(txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.TxRawResult) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetRawTransactionVerbose_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRawTransactionVerbose' +type RpcClientMock_GetRawTransactionVerbose_Call struct { + *mock.Call +} + +// GetRawTransactionVerbose is a helper method to define mock.On call +// - txHash *chainhash.Hash +func (_e *RpcClientMock_Expecter) GetRawTransactionVerbose(txHash interface{}) *RpcClientMock_GetRawTransactionVerbose_Call { + return &RpcClientMock_GetRawTransactionVerbose_Call{Call: _e.mock.On("GetRawTransactionVerbose", txHash)} +} + +func (_c *RpcClientMock_GetRawTransactionVerbose_Call) Run(run func(txHash *chainhash.Hash)) *RpcClientMock_GetRawTransactionVerbose_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *RpcClientMock_GetRawTransactionVerbose_Call) Return(_a0 *btcjson.TxRawResult, _a1 error) *RpcClientMock_GetRawTransactionVerbose_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetRawTransactionVerbose_Call) RunAndReturn(run func(*chainhash.Hash) (*btcjson.TxRawResult, error)) *RpcClientMock_GetRawTransactionVerbose_Call { + _c.Call.Return(run) + return _c +} + // GetTransaction provides a mock function with given fields: txHash func (_m *RpcClientMock) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) { ret := _m.Called(txHash) diff --git a/test/utils.go b/test/utils.go index 45c2ac92..02acf439 100644 --- a/test/utils.go +++ b/test/utils.go @@ -2,7 +2,6 @@ package test import ( "fmt" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -39,7 +38,7 @@ func RunTable[V, R any](t *testing.T, table Table[V, R], validationFunction func } } -func OpenWalletForTest(t *testing.T, testRef string) *rootstock.RskAccount { +func OpenWalletForTest(t *testing.T, testRef string) *account.RskAccount { _, currentPackageDir, _, _ := runtime.Caller(0) testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-%s-%d", testRef, time.Now().UnixNano())) keyFile, err := os.Open(filepath.Join(currentPackageDir, keyPath)) From cf354887e576904d6251c9c59bfd3e917c1e1701 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 30 Apr 2024 10:21:56 +0200 Subject: [PATCH 054/113] feat: add derivative wallet --- cmd/application/lps/application.go | 34 +- cmd/application/main.go | 2 + go.mod | 15 +- go.sum | 26 +- .../dataproviders/bitcoin/bitcoind_wallet.go | 41 +- .../bitcoin/btcclient/adapter.go | 99 +++++ .../{client.go => btcclient/binding.go} | 33 +- .../bitcoin/btcclient/create_wallet.go | 9 + .../bitcoin/btcclient/sign_with_key.go | 51 +++ .../adapters/dataproviders/bitcoin/common.go | 73 ++-- .../dataproviders/bitcoin/connection.go | 36 ++ .../bitcoin/derivative_wallet.go | 280 ++++++++++++++ .../rootstock/account/account.go | 108 +++++- .../dataproviders/rootstock/bindings.go | 1 + .../adapters/dataproviders/rootstock/rpc.go | 21 + .../adapters/dataproviders/utils/utils.go | 12 + .../entrypoints/watcher/pegout_btc_watcher.go | 2 +- .../entrypoints/watcher/pegout_rsk_watcher.go | 1 - internal/configuration/bootstrap/bitcoin.go | 57 ++- internal/configuration/bootstrap/rootstock.go | 28 +- .../configuration/environment/environment.go | 15 + internal/configuration/registry/bitcoin.go | 36 +- .../registry/liquidity_provider.go | 2 +- internal/configuration/registry/usecase.go | 6 +- internal/configuration/registry/watcher.go | 2 +- internal/entities/blockchain/rootstock.go | 9 + internal/usecases/pegout/send_pegout.go | 9 +- test/mocks/rpc_client_mock.go | 364 ++++++++++++++++++ test/mocks/rsk_rpc_mock.go | 46 --- test/utils.go | 7 +- 30 files changed, 1220 insertions(+), 205 deletions(-) create mode 100644 internal/adapters/dataproviders/bitcoin/btcclient/adapter.go rename internal/adapters/dataproviders/bitcoin/{client.go => btcclient/binding.go} (59%) create mode 100644 internal/adapters/dataproviders/bitcoin/btcclient/create_wallet.go create mode 100644 internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go create mode 100644 internal/adapters/dataproviders/bitcoin/connection.go create mode 100644 internal/adapters/dataproviders/bitcoin/derivative_wallet.go create mode 100644 internal/adapters/dataproviders/utils/utils.go delete mode 100644 test/mocks/rsk_rpc_mock.go diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 98feeb74..30273f99 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -4,6 +4,7 @@ import ( "context" "errors" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/watcher" "github.com/rsksmart/liquidity-provider-server/internal/configuration/bootstrap" @@ -36,12 +37,25 @@ type Application struct { } func NewApplication(initCtx context.Context, env environment.Environment, secrets environment.ApplicationSecrets) *Application { - btcConnection, err := bootstrap.Bitcoin(env.Btc) + account, err := bootstrap.RootstockAccount(env.Rsk, env.Btc, secrets) if err != nil { - log.Fatal("Error connecting to BTC node:", err) + log.Fatal("Error connecting to RSK account:", err) } - log.Debug("Connected to BTC node") - btcRegistry, err := registry.NewBitcoinRegistry(env.Btc, secrets, btcConnection) + log.Debug("Connected to RSK account") + + monitoringConnection, err := bootstrap.BitcoinWallet(env.Btc, "main") + if err != nil { + log.Fatal("Error creating BTC monitoring connection:", err) + } + log.Debug("Connected to BTC node for monitoring") + + paymentConnection, err := bootstrap.BitcoinWallet(env.Btc, bitcoin.DerivativeWalletId) + if err != nil { + log.Fatal("Error creating BTC payment connection:", err) + } + log.Debug("Connected to BTC node for payments") + + btcRegistry, err := registry.NewBitcoinRegistry(env.Btc, secrets, monitoringConnection, paymentConnection, account) if err != nil { log.Fatal("Error creating BTC registry:", err) } @@ -53,22 +67,17 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret dbRegistry := registry.NewDatabaseRegistry(connection) log.Debug("Connected to MongoDB") - account, err := bootstrap.RootstockAccount(env.Rsk, secrets) - if err != nil { - log.Fatal("Error connecting to RSK account:", err) - } - log.Debug("Connected to RSK account") rskClient, err := bootstrap.Rootstock(initCtx, env.Rsk) if err != nil { log.Fatal("Error connecting to RSK node:", err) } - rootstockRegistry, err := registry.NewRootstockRegistry(env.Rsk, rskClient, account, btcConnection) + rootstockRegistry, err := registry.NewRootstockRegistry(env.Rsk, rskClient, account, monitoringConnection) if err != nil { log.Fatal("Error creating Rootstock registry:", err) } log.Debug("Connected to RSK node") - messagingRegistry := registry.NewMessagingRegistry(initCtx, env, rskClient, btcConnection) + messagingRegistry := registry.NewMessagingRegistry(initCtx, env, rskClient, monitoringConnection) liquidityProvider := registry.NewLiquidityProvider(dbRegistry, rootstockRegistry, btcRegistry, messagingRegistry) mutexes := environment.NewApplicationMutexes() @@ -92,7 +101,8 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret func (app *Application) Run(env environment.Environment, logLevel log.Level) { app.addRunningService(app.dbRegistry.Connection) app.addRunningService(app.rskRegistry.Client) - app.addRunningService(app.btcRegistry.Connection) + app.addRunningService(app.btcRegistry.MonitoringWalletConnection) + app.addRunningService(app.btcRegistry.PaymentWalletConnection) app.addRunningService(app.messagingRegistry.EventBus) registerParams := blockchain.NewProviderRegistrationParams(app.env.Provider.Name, app.env.Provider.ApiBaseUrl, true, app.env.Provider.ProviderType) diff --git a/cmd/application/main.go b/cmd/application/main.go index 6ec28d09..4e7e5bad 100644 --- a/cmd/application/main.go +++ b/cmd/application/main.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "github.com/awnumar/memguard" "github.com/rsksmart/liquidity-provider-server/cmd/application/lps" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" log "github.com/sirupsen/logrus" @@ -21,6 +22,7 @@ var ( ) func main() { + memguard.CatchInterrupt() initCtx, cancel := context.WithTimeout(context.Background(), lps.BootstrapTimeout) env := environment.LoadEnv() diff --git a/go.mod b/go.mod index 50f196e9..7cd11b53 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,13 @@ module github.com/rsksmart/liquidity-provider-server go 1.21.6 require ( + github.com/awnumar/memguard v0.22.5 github.com/aws/aws-sdk-go-v2 v1.20.2 github.com/aws/aws-sdk-go-v2/config v1.18.25 github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.8 github.com/aws/aws-sdk-go-v2/service/ses v1.16.4 github.com/btcsuite/btcd v0.24.0 + github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/ethereum/go-ethereum v1.11.6 @@ -20,10 +22,11 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.8.4 go.mongodb.org/mongo-driver v1.13.1 + golang.org/x/crypto v0.16.0 ) require ( - github.com/aead/siphash v1.0.1 // indirect + github.com/awnumar/memcall v0.2.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.39 // indirect @@ -34,16 +37,13 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 // indirect github.com/aws/smithy-go v1.14.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect - github.com/btcsuite/winsvc v1.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/decred/dcrd/lru v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect @@ -57,10 +57,7 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.2 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/jrick/logrotate v1.0.0 // indirect - github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect github.com/klauspost/compress v1.16.5 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-isatty v0.0.18 // indirect @@ -68,7 +65,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/stretchr/objx v0.5.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -76,11 +72,10 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.9.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.2.0 // indirect golang.org/x/sys v0.16.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.1.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/go.sum b/go.sum index c89aeec3..cf6463f6 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,11 @@ github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/awnumar/memcall v0.2.0 h1:sRaogqExTOOkkNwO9pzJsL8jrOV29UuUW7teRMfbqtI= +github.com/awnumar/memcall v0.2.0/go.mod h1:S911igBPR9CThzd/hYQQmTc9SWNu3ZHIlCGaWsWsoJo= +github.com/awnumar/memguard v0.22.5 h1:PH7sbUVERS5DdXh3+mLo8FDcl1eIeVjJVYMnyuYpvuI= +github.com/awnumar/memguard v0.22.5/go.mod h1:+APmZGThMBWjnMlKiSM1X7MVpbIVewen2MTkqWkA/zE= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.2 h1:0Aok9u/HVTk7RtY6M1KDcthbaMKGhhS0eLPxIdSIzRI= github.com/aws/aws-sdk-go-v2 v1.20.2/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= @@ -40,9 +43,6 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= @@ -52,14 +52,10 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= @@ -73,7 +69,6 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -101,7 +96,6 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPc github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= @@ -189,15 +183,12 @@ github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixH github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= @@ -302,8 +293,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -328,6 +319,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -353,8 +345,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go index 6b862eaf..0de6f8b5 100644 --- a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go +++ b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go @@ -161,46 +161,7 @@ func (wallet *bitcoindWallet) ImportAddress(address string) error { } func (wallet *bitcoindWallet) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { - var ok bool - var tx blockchain.BitcoinTransactionInformation - var btcAmount btcutil.Amount - const maxConfirmationsForUtxos = 9999999 - result := make([]blockchain.BitcoinTransactionInformation, 0) - parsedAddress, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) - if err != nil { - return nil, err - } - utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses(0, maxConfirmationsForUtxos, []btcutil.Address{parsedAddress}) - if err != nil { - return nil, err - } - - txs := make(map[string]blockchain.BitcoinTransactionInformation) - for _, utxo := range utxos { - tx, ok = txs[utxo.TxID] - if !ok { - tx = blockchain.BitcoinTransactionInformation{ - Hash: utxo.TxID, - Confirmations: uint64(utxo.Confirmations), - Outputs: make(map[string][]*entities.Wei), - } - txs[utxo.TxID] = tx - } - if _, ok = tx.Outputs[utxo.Address]; !ok { - tx.Outputs[utxo.Address] = make([]*entities.Wei, 0) - } - btcAmount, err = btcutil.NewAmount(utxo.Amount) - if err != nil { - return nil, err - } - tx.Outputs[utxo.Address] = append(tx.Outputs[utxo.Address], entities.SatoshiToWei(uint64(btcAmount.ToUnit(btcutil.AmountSatoshi)))) - } - - for key, value := range txs { - result = append(result, value) - delete(txs, key) - } - return result, nil + return getTransactionsToAddress(address, wallet.conn.NetworkParams, wallet.conn.client) } func (wallet *bitcoindWallet) Unlock() error { diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go b/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go new file mode 100644 index 00000000..1c015d11 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go @@ -0,0 +1,99 @@ +package btcclient + +import ( + "bytes" + "context" + "encoding/hex" + "encoding/json" + "fmt" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/wire" + log "github.com/sirupsen/logrus" + "net/http" + "time" +) + +type BtcSuiteClientAdapter struct { + *rpcclient.Client + config rpcclient.ConnConfig +} + +func NewBtcSuiteClientAdapter(config rpcclient.ConnConfig, client *rpcclient.Client) *BtcSuiteClientAdapter { + return &BtcSuiteClientAdapter{config: config, Client: client} +} + +func (c *BtcSuiteClientAdapter) signRawTransactionWithKeyAsync(tx *wire.MsgTx, privateKeysWIFs []string) FutureSignRawTransactionWithKeyResult { + cmd := &SignRawTransactionWithKeyCmd{RawTx: "", WifKeys: privateKeysWIFs} + if tx == nil { + return c.SendCmd(cmd) + } + + buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) + if err := tx.Serialize(buf); err != nil { + if err = tx.SerializeNoWitness(buf); err != nil { + log.Errorf("Error serializing transaction to sign: %v", err) + responseChan := make(chan *rpcclient.Response, 1) + responseChan <- &rpcclient.Response{} + return responseChan + } + } + cmd.RawTx = hex.EncodeToString(buf.Bytes()) + return c.SendCmd(cmd) +} + +func (c *BtcSuiteClientAdapter) SignRawTransactionWithKey(tx *wire.MsgTx, privateKeysWIFs []string) (*wire.MsgTx, bool, error) { + return c.signRawTransactionWithKeyAsync(tx, privateKeysWIFs).Receive() +} + +func (c *BtcSuiteClientAdapter) CreateReadonlyWallet(bodyParams ReadonlyWalletRequest) error { + var err error + var bodyBytes []byte + var response btcjson.Response + body := RpcRequestParamsObject[ReadonlyWalletRequest]{ + Jsonrpc: btcjson.RpcVersion1, + Method: "createwallet", + Params: bodyParams, + ID: c.Client.NextID(), + } + + bodyBytes, err = json.Marshal(body) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.getUrl(), bytes.NewReader(bodyBytes)) + if err != nil { + return err + } + req.SetBasicAuth(c.config.User, c.config.Pass) + + res, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + + defer func() { + if err = res.Body.Close(); err != nil { + log.Error("Error closing response body: ", err) + } + }() + + err = json.NewDecoder(res.Body).Decode(&response) + if err != nil { + return err + } else if response.Error != nil { + return fmt.Errorf("error creating wallet: %w", response.Error) + } + return nil +} + +func (c *BtcSuiteClientAdapter) getUrl() string { + if c.config.DisableTLS { + return fmt.Sprintf("http://%s", c.config.Host) + } else { + return fmt.Sprintf("https://%s", c.config.Host) + } +} diff --git a/internal/adapters/dataproviders/bitcoin/client.go b/internal/adapters/dataproviders/bitcoin/btcclient/binding.go similarity index 59% rename from internal/adapters/dataproviders/bitcoin/client.go rename to internal/adapters/dataproviders/bitcoin/btcclient/binding.go index 050fe7e7..35c5e9ef 100644 --- a/internal/adapters/dataproviders/bitcoin/client.go +++ b/internal/adapters/dataproviders/bitcoin/btcclient/binding.go @@ -1,13 +1,25 @@ -package bitcoin +package btcclient import ( "github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" ) -type rpcWallet interface { +func init() { + btcjson.MustRegisterCmd("signrawtransactionwithkey", (*SignRawTransactionWithKeyCmd)(nil), btcjson.UsageFlag(0)) +} + +type RpcRequestParamsObject[T any] struct { + Jsonrpc btcjson.RPCVersion `json:"jsonrpc"` + Method string `json:"method"` + Params T `json:"params"` + ID interface{} `json:"id"` +} + +type RpcWallet interface { WalletCreateFundedPsbt(inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool) (*btcjson.WalletCreateFundedPsbtResult, error) ListUnspent() ([]btcjson.ListUnspentResult, error) CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) @@ -19,10 +31,13 @@ type rpcWallet interface { ImportAddressRescan(address string, account string, rescan bool) error ListUnspentMinMaxAddresses(minConf int, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) + GetAddressInfo(address string) (*btcjson.GetAddressInfoResult, error) + ImportPubKeyRescan(pubKey string, rescan bool) error + ImportPubKey(pubKey string) error } -type rpcClient interface { - rpcWallet +type RpcClient interface { + RpcWallet Ping() error Disconnect() GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRawResult, error) @@ -30,4 +45,14 @@ type rpcClient interface { GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) + CreateWallet(name string, opts ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error) + LoadWallet(walletName string) (*btcjson.LoadWalletResult, error) + EstimateSmartFee(confTarget int64, mode *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error) +} + +type ClientAdapter interface { + RpcClient + RpcWallet + SignRawTransactionWithKey(tx *wire.MsgTx, privateKeysWIFs []string) (*wire.MsgTx, bool, error) + CreateReadonlyWallet(bodyParams ReadonlyWalletRequest) error } diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/create_wallet.go b/internal/adapters/dataproviders/bitcoin/btcclient/create_wallet.go new file mode 100644 index 00000000..3522b372 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/btcclient/create_wallet.go @@ -0,0 +1,9 @@ +package btcclient + +type ReadonlyWalletRequest struct { + WalletName string `json:"wallet_name"` + DisablePrivateKeys bool `json:"disable_private_keys"` + Blank bool `json:"blank"` + AvoidReuse bool `json:"avoid_reuse"` + Descriptors bool `json:"descriptors"` +} diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go b/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go new file mode 100644 index 00000000..06ae1e93 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go @@ -0,0 +1,51 @@ +package btcclient + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/wire" +) + +type SignRawTransactionWithKeyCmd struct { + RawTx string + WifKeys []string +} + +type SignRawTransactionWithKeysRequest struct { + Transaction string `json:"hexstring"` + PrivKeysWIFs []string `json:"privkeys"` +} + +type FutureSignRawTransactionWithKeyResult chan *rpcclient.Response + +func (r FutureSignRawTransactionWithKeyResult) Receive() (*wire.MsgTx, bool, error) { + res, err := rpcclient.ReceiveFuture(r) + if err != nil { + return nil, false, err + } + + // Unmarshal as a signtransactionwithwallet since it has the same response as signrawtransactionwithkey + // and this struct is already in the library + var signRawTxWithWalletResult btcjson.SignRawTransactionWithWalletResult + err = json.Unmarshal(res, &signRawTxWithWalletResult) + if err != nil { + return nil, false, err + } + + serializedTx, err := hex.DecodeString(signRawTxWithWalletResult.Hex) + if err != nil { + return nil, false, err + } + + var msgTx wire.MsgTx + if witnessErr := msgTx.Deserialize(bytes.NewReader(serializedTx)); witnessErr != nil { + if legacyErr := msgTx.DeserializeNoWitness(bytes.NewReader(serializedTx)); legacyErr != nil { + return nil, false, legacyErr + } + } + + return &msgTx, signRawTxWithWalletResult.Complete, nil +} diff --git a/internal/adapters/dataproviders/bitcoin/common.go b/internal/adapters/dataproviders/bitcoin/common.go index 1c1282c6..21cb1e9c 100644 --- a/internal/adapters/dataproviders/bitcoin/common.go +++ b/internal/adapters/dataproviders/bitcoin/common.go @@ -2,7 +2,6 @@ package bitcoin import ( "bytes" - "context" "encoding/binary" "fmt" "github.com/btcsuite/btcd/btcutil" @@ -11,38 +10,18 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" - log "github.com/sirupsen/logrus" "math/big" ) const ( - BtcToSatoshi = 100000000 + BtcToSatoshi = 100000000 + maxConfirmationsForUtxos = 9999999 + minConfirmationsForUtxos = 1 ) -type Connection struct { - NetworkParams *chaincfg.Params - client rpcClient -} - -func NewConnection(networkParams *chaincfg.Params, client rpcClient) *Connection { - return &Connection{NetworkParams: networkParams, client: client} -} - -func (c *Connection) Shutdown(endChannel chan<- bool) { - c.client.Disconnect() - endChannel <- true - log.Debug("Disconnected from BTC node") -} - -func (c *Connection) CheckConnection(ctx context.Context) bool { - err := c.client.Ping() - if err != nil { - log.Error("Error checking BTC node connection: ", err) - } - return err == nil -} - func DecodeAddressBase58(address string, keepVersion bool) ([]byte, error) { var buff bytes.Buffer addressBytes, version, err := base58.CheckDecode(address) @@ -134,3 +113,45 @@ func serializePartialMerkleTree(txHash *chainhash.Hash, block *btcutil.Block) ([ buf.Write(msg.Flags) return buf.Bytes(), nil } + +func getTransactionsToAddress(address string, params *chaincfg.Params, client btcclient.RpcClient) ([]blockchain.BitcoinTransactionInformation, error) { + var ok bool + var tx blockchain.BitcoinTransactionInformation + var btcAmount btcutil.Amount + result := make([]blockchain.BitcoinTransactionInformation, 0) + parsedAddress, err := btcutil.DecodeAddress(address, params) + if err != nil { + return nil, err + } + utxos, err := client.ListUnspentMinMaxAddresses(0, maxConfirmationsForUtxos, []btcutil.Address{parsedAddress}) + if err != nil { + return nil, err + } + + txs := make(map[string]blockchain.BitcoinTransactionInformation) + for _, utxo := range utxos { + tx, ok = txs[utxo.TxID] + if !ok { + tx = blockchain.BitcoinTransactionInformation{ + Hash: utxo.TxID, + Confirmations: uint64(utxo.Confirmations), + Outputs: make(map[string][]*entities.Wei), + } + txs[utxo.TxID] = tx + } + if _, ok = tx.Outputs[utxo.Address]; !ok { + tx.Outputs[utxo.Address] = make([]*entities.Wei, 0) + } + btcAmount, err = btcutil.NewAmount(utxo.Amount) + if err != nil { + return nil, err + } + tx.Outputs[utxo.Address] = append(tx.Outputs[utxo.Address], entities.SatoshiToWei(uint64(btcAmount.ToUnit(btcutil.AmountSatoshi)))) + } + + for key, value := range txs { + result = append(result, value) + delete(txs, key) + } + return result, nil +} diff --git a/internal/adapters/dataproviders/bitcoin/connection.go b/internal/adapters/dataproviders/bitcoin/connection.go new file mode 100644 index 00000000..663fffa1 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/connection.go @@ -0,0 +1,36 @@ +package bitcoin + +import ( + "context" + "github.com/btcsuite/btcd/chaincfg" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + log "github.com/sirupsen/logrus" +) + +type Connection struct { + NetworkParams *chaincfg.Params + client btcclient.ClientAdapter + WalletId string +} + +func NewWalletConnection(networkParams *chaincfg.Params, client btcclient.ClientAdapter, walletId string) *Connection { + return &Connection{NetworkParams: networkParams, client: client, WalletId: walletId} +} + +func NewConnection(networkParams *chaincfg.Params, client btcclient.ClientAdapter) *Connection { + return &Connection{NetworkParams: networkParams, client: client} +} + +func (c *Connection) Shutdown(endChannel chan<- bool) { + c.client.Disconnect() + endChannel <- true + log.Debug("Disconnected from BTC node") +} + +func (c *Connection) CheckConnection(ctx context.Context) bool { + err := c.client.Ping() + if err != nil { + log.Error("Error checking BTC node connection: ", err) + } + return err == nil +} diff --git a/internal/adapters/dataproviders/bitcoin/derivative_wallet.go b/internal/adapters/dataproviders/bitcoin/derivative_wallet.go new file mode 100644 index 00000000..29fc2c68 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/derivative_wallet.go @@ -0,0 +1,280 @@ +package bitcoin + +import ( + "encoding/hex" + "errors" + "fmt" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" +) + +const ( + changePosition = 2 + DerivativeWalletId = "rsk-wallet" +) + +type DerivativeWallet struct { + conn *Connection + rskAccount *account.RskAccount +} + +func NewDerivativeWallet( + conn *Connection, + rskAccount *account.RskAccount, +) (blockchain.BitcoinWallet, error) { + if conn.WalletId != DerivativeWalletId { + return nil, errors.New("derivative wallet can only be created with wallet id " + DerivativeWalletId) + } + if _, err := rskAccount.BtcAddress(); err != nil { + return nil, errors.New("derivative wallet can only be used if RSK account has derivation enabled") + } + wallet := &DerivativeWallet{conn: conn, rskAccount: rskAccount} + err := wallet.initWallet() + if err != nil { + return nil, err + } + return wallet, nil +} + +func (wallet *DerivativeWallet) initWallet() error { + const addressVerificationErrorTemplate = "error while verifying wallet has address: %w" + var err error + var info *btcjson.GetWalletInfoResult + var btcAddress btcutil.Address + var addressInfo *btcjson.GetAddressInfoResult + + if info, err = wallet.conn.client.GetWalletInfo(); err != nil || info.WalletName != wallet.conn.WalletId { + if info, err = wallet.createWallet(); err != nil { + return err + } + } + _, ok := any(info.Scanning).(btcjson.ScanProgress) + if ok { + return errors.New("wallet is still scanning, please wait for the scan to finish before initializing the server again") + } + + if btcAddress, err = wallet.rskAccount.BtcAddress(); err != nil { + return fmt.Errorf(addressVerificationErrorTemplate, err) + } + + if addressInfo, err = wallet.conn.client.GetAddressInfo(btcAddress.EncodeAddress()); err != nil { + return fmt.Errorf(addressVerificationErrorTemplate, err) + } else if !addressInfo.Solvable || !addressInfo.IsWatchOnly { + return wallet.importPublicKey() + } + + return nil +} + +func (wallet *DerivativeWallet) createWallet() (*btcjson.GetWalletInfoResult, error) { + if _, err := wallet.conn.client.LoadWallet(wallet.conn.WalletId); err == nil { + return wallet.conn.client.GetWalletInfo() + } + log.Infof("Wallet not found to be loaded, creating wallet %s...", wallet.conn.WalletId) + err := wallet.conn.client.CreateReadonlyWallet(btcclient.ReadonlyWalletRequest{ + WalletName: wallet.conn.WalletId, + DisablePrivateKeys: true, + Blank: true, + AvoidReuse: false, + Descriptors: false, + }) + + if err != nil { + return nil, fmt.Errorf("error while creating %s wallet: %w", wallet.conn.WalletId, err) + } + return wallet.conn.client.GetWalletInfo() +} + +func (wallet *DerivativeWallet) importPublicKey() error { + const errorTemplate = "error while importing public key: %w" + pubKey, err := wallet.rskAccount.BtcPubKey() + if err != nil { + return fmt.Errorf(errorTemplate, err) + } + err = wallet.conn.client.ImportPubKey(pubKey) + if err != nil { + return fmt.Errorf(errorTemplate, err) + } + err = wallet.conn.client.ImportAddressRescan(wallet.Address(), "", true) + if err != nil { + return fmt.Errorf(errorTemplate, err) + } + return errors.New("public key imported, rescan started, please wait for the rescan process to finish before initializing the server again") +} + +func (wallet *DerivativeWallet) EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) { + const quoteHashLength = 32 + + if _, err := btcutil.DecodeAddress(toAddress, wallet.conn.NetworkParams); err != nil { + return nil, err + } + + amountInSatoshi, _ := value.ToSatoshi().Int64() + output := []btcjson.PsbtOutput{ + {toAddress: btcutil.Amount(amountInSatoshi).ToUnit(btcutil.AmountBTC)}, + {"data": hex.EncodeToString(make([]byte, quoteHashLength))}, // quote hash output + } + + feeRate, err := wallet.estimateFeeRate() + if err != nil { + return nil, err + } + changeAddress, err := wallet.rskAccount.BtcAddress() + if err != nil { + return nil, err + } + + opts := btcjson.WalletCreateFundedPsbtOpts{ + ChangeAddress: btcjson.String(changeAddress.EncodeAddress()), + ChangePosition: btcjson.Int64(changePosition), + IncludeWatching: btcjson.Bool(true), + FeeRate: feeRate, + } + + simulatedTx, err := wallet.conn.client.WalletCreateFundedPsbt(nil, output, nil, &opts, nil) + if err != nil { + return nil, err + } + btcFee, err := btcutil.NewAmount(simulatedTx.Fee) + if err != nil { + return nil, err + } + satoshiFee := btcFee.ToUnit(btcutil.AmountSatoshi) + return entities.SatoshiToWei(uint64(satoshiFee)), nil +} + +func (wallet *DerivativeWallet) GetBalance() (*entities.Wei, error) { + var amount btcutil.Amount + balance := new(entities.Wei) + + btcAddress, err := wallet.rskAccount.BtcAddress() + if err != nil { + return nil, err + } + + utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses( + minConfirmationsForUtxos, + maxConfirmationsForUtxos, + []btcutil.Address{btcAddress}, + ) + if err != nil { + return nil, err + } + + for _, utxo := range utxos { + if amount, err = btcutil.NewAmount(utxo.Amount); err != nil { + return nil, err + } + balance.Add(balance, entities.SatoshiToWei(uint64(amount.ToUnit(btcutil.AmountSatoshi)))) + } + return balance, nil +} + +func (wallet *DerivativeWallet) SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (transactionHash string, err error) { + decodedAddress, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) + if err != nil { + return "", err + } + + satoshis, _ := value.ToSatoshi().Float64() + output := map[btcutil.Address]btcutil.Amount{decodedAddress: btcutil.Amount(satoshis)} + rawTx, err := wallet.conn.client.CreateRawTransaction(nil, output, nil) + if err != nil { + return "", err + } + + opReturnScript, err := txscript.NullDataScript(opReturnContent) + if err != nil { + return "", err + } + rawTx.AddTxOut(wire.NewTxOut(0, opReturnScript)) + + opts, err := wallet.buildFundRawTransactionOpts() + if err != nil { + return "", err + } + fundedTx, err := wallet.conn.client.FundRawTransaction(rawTx, opts, nil) + if err != nil { + return "", err + } + + var signedTx *wire.MsgTx + var complete bool + err = wallet.rskAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { + signedTx, complete, err = wallet.conn.client.SignRawTransactionWithKey(fundedTx.Transaction, []string{wif.String()}) + if err != nil { + return err + } else if !complete { + return errors.New("trying to send a transaction without a complete set of signatures") + } + return nil + }) + if err != nil { + return "", err + } + + log.Infof("Sending %v BTC to %s\n", value.ToRbtc(), address) + txHash, err := wallet.conn.client.SendRawTransaction(signedTx, false) + if err != nil { + return "", err + } + return txHash.String(), nil +} + +func (wallet *DerivativeWallet) ImportAddress(address string) error { + return errors.New("address importing is not supported in this type of wallet") +} + +func (wallet *DerivativeWallet) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { + return getTransactionsToAddress(address, wallet.conn.NetworkParams, wallet.conn.client) +} + +func (wallet *DerivativeWallet) Address() string { + address, err := wallet.rskAccount.BtcAddress() + if err != nil { + log.Errorf("error while getting address from rsk account %v", err) + return "" + } + return address.EncodeAddress() +} + +func (wallet *DerivativeWallet) Unlock() error { + return errors.New("derivative wallet does not support unlocking as it is a watch-only wallet") +} + +func (wallet *DerivativeWallet) estimateFeeRate() (*float64, error) { + const confirmationTargetForEstimation = 1 + estimationResult, err := wallet.conn.client.EstimateSmartFee(confirmationTargetForEstimation, &btcjson.EstimateModeConservative) + if err != nil { + return nil, err + } else if len(estimationResult.Errors) != 0 { + return nil, errors.New(estimationResult.Errors[0]) + } + return estimationResult.FeeRate, nil +} + +func (wallet *DerivativeWallet) buildFundRawTransactionOpts() (btcjson.FundRawTransactionOpts, error) { + feeRate, err := wallet.estimateFeeRate() + if err != nil { + return btcjson.FundRawTransactionOpts{}, err + } + changeAddress, err := wallet.rskAccount.BtcAddress() + if err != nil { + return btcjson.FundRawTransactionOpts{}, err + } + return btcjson.FundRawTransactionOpts{ + ChangeAddress: btcjson.String(changeAddress.EncodeAddress()), + ChangePosition: btcjson.Int(changePosition), + IncludeWatching: btcjson.Bool(true), + LockUnspents: btcjson.Bool(true), + FeeRate: feeRate, + Replaceable: btcjson.Bool(true), + }, nil +} diff --git a/internal/adapters/dataproviders/rootstock/account/account.go b/internal/adapters/dataproviders/rootstock/account/account.go index e36a86d5..6f37ddc8 100644 --- a/internal/adapters/dataproviders/rootstock/account/account.go +++ b/internal/adapters/dataproviders/rootstock/account/account.go @@ -1,30 +1,126 @@ package account import ( + "encoding/hex" "fmt" + "github.com/awnumar/memguard" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils" log "github.com/sirupsen/logrus" "os" + "unsafe" ) -func GetRskAccount(keyDir string, accountNum int, encryptedJson, password string) (*rootstock.RskAccount, error) { - if err := os.MkdirAll(keyDir, 0700); err != nil { +var NoDerivationError = fmt.Errorf("btc derivation wasn't enabled for this account") + +type RskAccount struct { + Account *accounts.Account + Keystore *keystore.KeyStore + btc *btcDerivationInfo +} + +type btcDerivationInfo struct { + pubKey *btcec.PublicKey + address btcutil.Address + protectedWif *memguard.Enclave +} + +type CreationArgs struct { + KeyDir string + AccountNum int + EncryptedJson string + Password string +} + +type CreationWithDerivationArgs struct { + CreationArgs + BtcParams *chaincfg.Params +} + +func GetRskAccount(args CreationArgs) (*RskAccount, error) { + if err := os.MkdirAll(args.KeyDir, 0700); err != nil { return nil, err } - ks := keystore.NewKeyStore(keyDir, keystore.StandardScryptN, keystore.StandardScryptP) - if account, err := retrieveOrCreateAccount(ks, accountNum, encryptedJson, password); err != nil { + ks := keystore.NewKeyStore(args.KeyDir, keystore.StandardScryptN, keystore.StandardScryptP) + if account, err := retrieveOrCreateAccount(ks, args.AccountNum, args.EncryptedJson, args.Password); err != nil { return nil, err } else { - return &rootstock.RskAccount{ + return &RskAccount{ Account: account, Keystore: ks, }, nil } } +// GetRskAccountWithDerivation returns an RSK account with the corresponding BTC derivative information +func GetRskAccountWithDerivation(args CreationWithDerivationArgs) (*RskAccount, error) { + account, err := GetRskAccount(args.CreationArgs) + if err != nil { + return nil, err + } + + key, err := keystore.DecryptKey([]byte(args.EncryptedJson), args.Password) + if err != nil { + return nil, err + } + + privateKey, pubKey := btcec.PrivKeyFromBytes(key.PrivateKey.D.Bytes()) + address, err := btcutil.NewAddressPubKey(pubKey.SerializeCompressed(), args.BtcParams) + if err != nil { + return nil, err + } + + protectedWifBuffer, protectedWif := utils.GetSecurePointer[btcutil.WIF]() + unprotectedWif, err := btcutil.NewWIF(privateKey, args.BtcParams, true) + if err != nil { + return nil, err + } + + // this line is to write the content of the unprotectedWif to the protected memory address inside the locked buffer, the protectedWif + // variable is just to allow us to write inside buffer's memory address, then we set unprotectedWif to its zero value + *protectedWif = *unprotectedWif + *unprotectedWif = btcutil.WIF{} + account.btc = &btcDerivationInfo{pubKey: pubKey, address: address, protectedWif: protectedWifBuffer.Seal()} + return account, nil +} + +func (account *RskAccount) BtcPubKey() (string, error) { + if account.btc.pubKey == nil { + return "", NoDerivationError + } + pubKeyBytes := account.btc.pubKey.SerializeCompressed() + return hex.EncodeToString(pubKeyBytes), nil +} + +func (account *RskAccount) BtcAddress() (btcutil.Address, error) { + if account.btc == nil { + return nil, NoDerivationError + } + return account.btc.address, nil +} + +func (account *RskAccount) UsePrivateKeyWif(usageFunc func(wif *btcutil.WIF) error) error { + if account.btc == nil { + return NoDerivationError + } + buffer, err := account.btc.protectedWif.Open() + defer func(b *memguard.LockedBuffer) { + if b != nil { + b.Destroy() + } + }(buffer) + if err != nil { + return err + } + wif := (*btcutil.WIF)(unsafe.Pointer(&buffer.Bytes()[0])) + return usageFunc(wif) +} + func createAccount(ks *keystore.KeyStore, encryptedJson, password string) (*accounts.Account, error) { account, err := ks.Import([]byte(encryptedJson), password, password) if err != nil { diff --git a/internal/adapters/dataproviders/rootstock/bindings.go b/internal/adapters/dataproviders/rootstock/bindings.go index 70e59417..a8c1b965 100644 --- a/internal/adapters/dataproviders/rootstock/bindings.go +++ b/internal/adapters/dataproviders/rootstock/bindings.go @@ -23,6 +23,7 @@ type RpcClientBinding interface { SuggestGasPrice(ctx context.Context) (*big.Int, error) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) BlockNumber(ctx context.Context) (uint64, error) + BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) } type RskBridgeBinding interface { diff --git a/internal/adapters/dataproviders/rootstock/rpc.go b/internal/adapters/dataproviders/rootstock/rpc.go index 86a36d89..ce60a2c6 100644 --- a/internal/adapters/dataproviders/rootstock/rpc.go +++ b/internal/adapters/dataproviders/rootstock/rpc.go @@ -11,6 +11,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" "math/big" "strings" + "time" ) // newAccountGasCost fixed gas amount to add to the estimation if the destination address is a new account @@ -176,3 +177,23 @@ func (rpc *rskjRpcServer) isNewAccount(ctx context.Context, address common.Addre return len(code) == 0 && balance.Cmp(common.Big0) == 0 && nonce == 0, nil } + +func (rpc *rskjRpcServer) GetBlockByHash(ctx context.Context, hash string) (blockchain.BlockInfo, error) { + if _, err := hex.DecodeString(strings.TrimPrefix(hash, "0x")); err != nil { + return blockchain.BlockInfo{}, errors.New("invalid block hash") + } + result, err := rskRetry(rpc.retryParams.Retries, rpc.retryParams.Sleep, + func() (*types.Block, error) { + return rpc.client.BlockByHash(ctx, common.HexToHash(hash)) + }) + if err != nil { + return blockchain.BlockInfo{}, err + } + + return blockchain.BlockInfo{ + Hash: result.Hash().String(), + Number: result.NumberU64(), + Timestamp: time.Unix(int64(result.Time()), 0), + Nonce: result.Nonce(), + }, nil +} diff --git a/internal/adapters/dataproviders/utils/utils.go b/internal/adapters/dataproviders/utils/utils.go new file mode 100644 index 00000000..feae5cba --- /dev/null +++ b/internal/adapters/dataproviders/utils/utils.go @@ -0,0 +1,12 @@ +package utils + +import ( + "github.com/awnumar/memguard" + "unsafe" +) + +func GetSecurePointer[T any]() (buffer *memguard.LockedBuffer, typePointer *T) { + requiredTypePointer := new(T) + lockedBuffer := memguard.NewBuffer(int(unsafe.Sizeof(*requiredTypePointer))) + return lockedBuffer, (*T)(unsafe.Pointer(&lockedBuffer.Bytes()[0])) +} diff --git a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go index 3b602bac..36ee09ee 100644 --- a/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_btc_watcher.go @@ -128,7 +128,7 @@ func (watcher *PegoutBtcTransferWatcher) handleBtcSentToUserCompleted(event enti return } if parsedEvent.RetainedQuote.State != quote.PegoutStateSendPegoutSucceeded || parsedEvent.RetainedQuote.LpBtcTxHash == "" { - log.Info(pegoutBtcWatcherLog("Quote %s doesn't have btc tx hash to watch", quoteHash)) + log.Warn(pegoutBtcWatcherLog("Quote %s doesn't have btc tx hash to watch", quoteHash)) return } watcher.quotes[quoteHash] = w.NewWatchedPegoutQuote(parsedEvent.PegoutQuote, parsedEvent.RetainedQuote) diff --git a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go index 4808dac7..c43f3737 100644 --- a/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegout_rsk_watcher.go @@ -235,7 +235,6 @@ func (watcher *PegoutRskDepositWatcher) sendPegout(ctx context.Context, watchedQ func validateDepositedPegoutQuote(watchedQuote w.WatchedPegoutQuote, receipt blockchain.TransactionReceipt, height uint64) bool { return receipt.BlockNumber+uint64(watchedQuote.PegoutQuote.DepositConfirmations) < height && watchedQuote.RetainedQuote.State == quote.PegoutStateWaitingForDepositConfirmations && - !watchedQuote.PegoutQuote.IsExpired() && receipt.Value.Cmp(watchedQuote.PegoutQuote.Total()) >= 0 } diff --git a/internal/configuration/bootstrap/bitcoin.go b/internal/configuration/bootstrap/bitcoin.go index a44ab94a..36d754fc 100644 --- a/internal/configuration/bootstrap/bitcoin.go +++ b/internal/configuration/bootstrap/bitcoin.go @@ -7,6 +7,7 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/rpcclient" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" log "github.com/sirupsen/logrus" ) @@ -15,23 +16,44 @@ const ( unknownBtcdVersion = -1 ) +type CreatedClient struct { + Client btcclient.ClientAdapter + Params *chaincfg.Params + Config rpcclient.ConnConfig +} + +func BitcoinWallet(env environment.BtcEnv, walletId string) (*bitcoin.Connection, error) { + if walletId == "" { + return nil, errors.New("walletId cannot be empty") + } + endpoint := fmt.Sprintf("%s/wallet/%s", env.Endpoint, walletId) + createdClient, err := createBitcoinClient(env, endpoint) + if err != nil { + return nil, err + } + return bitcoin.NewWalletConnection(createdClient.Params, createdClient.Client, walletId), nil +} + func Bitcoin(env environment.BtcEnv) (*bitcoin.Connection, error) { - var params chaincfg.Params - log.Info("Connecting to BTC node") + createdClient, err := createBitcoinClient(env, env.Endpoint) + if err != nil { + return nil, err + } + conn := bitcoin.NewConnection(createdClient.Params, createdClient.Client) + return conn, nil +} - switch env.Network { - case "mainnet": - params = chaincfg.MainNetParams - case "testnet": - params = chaincfg.TestNet3Params - case "regtest": - params = chaincfg.RegressionNetParams - default: - return nil, fmt.Errorf("invalid network name: %v", env.Network) +func createBitcoinClient(env environment.BtcEnv, host string) (CreatedClient, error) { + var params *chaincfg.Params + log.Info("Connecting to BTC node at ", host, "...") + + params, err := env.GetNetworkParams() + if err != nil { + return CreatedClient{}, err } config := rpcclient.ConnConfig{ - Host: env.Endpoint, + Host: host, User: env.Username, Pass: env.Password, Params: params.Name, @@ -41,12 +63,12 @@ func Bitcoin(env environment.BtcEnv) (*bitcoin.Connection, error) { client, err := rpcclient.New(&config, nil) if err != nil { - return nil, fmt.Errorf("RPC client error: %w", err) + return CreatedClient{}, fmt.Errorf("RPC client error: %w", err) } version, err := checkBtcdVersion(client) if err != nil { - return nil, err + return CreatedClient{}, err } if version == unknownBtcdVersion { @@ -54,8 +76,11 @@ func Bitcoin(env environment.BtcEnv) (*bitcoin.Connection, error) { } else { log.Debugf("detected btcd version: %v\n", version) } - conn := bitcoin.NewConnection(¶ms, client) - return conn, nil + return CreatedClient{ + Client: btcclient.NewBtcSuiteClientAdapter(config, client), + Params: params, + Config: config, + }, nil } func checkBtcdVersion(c *rpcclient.Client) (int32, error) { diff --git a/internal/configuration/bootstrap/rootstock.go b/internal/configuration/bootstrap/rootstock.go index 66f58325..b02af4ec 100644 --- a/internal/configuration/bootstrap/rootstock.go +++ b/internal/configuration/bootstrap/rootstock.go @@ -8,13 +8,13 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" - environment2 "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" log "github.com/sirupsen/logrus" "net/http" "net/url" ) -func Rootstock(ctx context.Context, env environment2.RskEnv) (*rootstock.RskClient, error) { +func Rootstock(ctx context.Context, env environment.RskEnv) (*rootstock.RskClient, error) { var err error var parsedUrl *url.URL var client *ethclient.Client @@ -54,11 +54,21 @@ func Rootstock(ctx context.Context, env environment2.RskEnv) (*rootstock.RskClie return rootstock.NewRskClient(client), nil } -func RootstockAccount(env environment2.RskEnv, secrets environment2.ApplicationSecrets) (*account.RskAccount, error) { - return account.GetRskAccount( - "geth_keystore", - env.AccountNumber, - secrets.EncryptedJson, - secrets.EncryptedJsonPassword, - ) +func RootstockAccount( + rskEnv environment.RskEnv, + btcEnv environment.BtcEnv, + secrets environment.ApplicationSecrets) (*account.RskAccount, error) { + networkParams, err := btcEnv.GetNetworkParams() + if err != nil { + return nil, err + } + return account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: "geth_keystore", + AccountNum: rskEnv.AccountNumber, + EncryptedJson: secrets.EncryptedJson, + Password: secrets.EncryptedJsonPassword, + }, + BtcParams: networkParams, + }) } diff --git a/internal/configuration/environment/environment.go b/internal/configuration/environment/environment.go index d19b9a5b..4c5b2099 100644 --- a/internal/configuration/environment/environment.go +++ b/internal/configuration/environment/environment.go @@ -1,6 +1,8 @@ package environment import ( + "fmt" + "github.com/btcsuite/btcd/chaincfg" "github.com/go-playground/validator/v10" "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" log "github.com/sirupsen/logrus" @@ -54,6 +56,19 @@ type BtcEnv struct { BtcAddress string `env:"BTC_ADDR" validate:"required"` } +func (env BtcEnv) GetNetworkParams() (*chaincfg.Params, error) { + switch env.Network { + case "mainnet": + return &chaincfg.MainNetParams, nil + case "testnet": + return &chaincfg.TestNet3Params, nil + case "regtest": + return &chaincfg.RegressionNetParams, nil + default: + return nil, fmt.Errorf("invalid network name: %v", env.Network) + } +} + type ProviderEnv struct { AlertSenderEmail string `env:"ALERT_SENDER_EMAIL" validate:"required"` AlertRecipientEmail string `env:"ALERT_RECIPIENT_EMAIL" validate:"required"` diff --git a/internal/configuration/registry/bitcoin.go b/internal/configuration/registry/bitcoin.go index 250d66c1..92147609 100644 --- a/internal/configuration/registry/bitcoin.go +++ b/internal/configuration/registry/bitcoin.go @@ -1,23 +1,45 @@ package registry import ( + "errors" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" ) type Bitcoin struct { - Wallet blockchain.BitcoinWallet - Connection *bitcoin.Connection + MonitoringWallet blockchain.BitcoinWallet + PaymentWallet blockchain.BitcoinWallet + MonitoringWalletConnection *bitcoin.Connection + PaymentWalletConnection *bitcoin.Connection } -func NewBitcoinRegistry(env environment.BtcEnv, secrets environment.ApplicationSecrets, connection *bitcoin.Connection) (*Bitcoin, error) { - wallet := bitcoin.NewBitcoindWallet(connection, env.BtcAddress, env.FixedTxFeeRate, env.WalletEncrypted, secrets.BtcWalletPassword) - if err := wallet.Unlock(); err != nil { +func NewBitcoinRegistry( + env environment.BtcEnv, + secrets environment.ApplicationSecrets, + monitoringWalletConnection *bitcoin.Connection, + paymentWalletConnection *bitcoin.Connection, + rskAccount *account.RskAccount, +) (*Bitcoin, error) { + if monitoringWalletConnection.WalletId == "" { + return nil, errors.New("monitoringWalletConnection must be a wallet connection to the RPC server") + } + if paymentWalletConnection.WalletId == "" { + return nil, errors.New("paymentWalletConnection must be a wallet connection to the RPC server") + } + bitcoind := bitcoin.NewBitcoindWallet(monitoringWalletConnection, env.BtcAddress, env.FixedTxFeeRate, env.WalletEncrypted, secrets.BtcWalletPassword) + if err := bitcoind.Unlock(); err != nil { + return nil, err + } + derivative, err := bitcoin.NewDerivativeWallet(paymentWalletConnection, rskAccount) + if err != nil { return nil, err } return &Bitcoin{ - Wallet: wallet, - Connection: connection, + MonitoringWallet: bitcoind, + PaymentWallet: derivative, + MonitoringWalletConnection: monitoringWalletConnection, + PaymentWalletConnection: paymentWalletConnection, }, nil } diff --git a/internal/configuration/registry/liquidity_provider.go b/internal/configuration/registry/liquidity_provider.go index 4733c5e1..926fdd1c 100644 --- a/internal/configuration/registry/liquidity_provider.go +++ b/internal/configuration/registry/liquidity_provider.go @@ -14,7 +14,7 @@ func NewLiquidityProvider( databaseRegistry.LiquidityProviderRepository, messaging.Rpc, rskRegistry.Wallet, - btcRegistry.Wallet, + btcRegistry.PaymentWallet, rskRegistry.Contracts, ) } diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 7d7744d1..a915ac82 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -139,7 +139,7 @@ func NewUseCaseRegistry( databaseRegistry.PegoutRepository, liquidityProvider, liquidityProvider, - btcRegistry.Wallet, + btcRegistry.MonitoringWallet, env.Rsk.FeeCollectorAddress, ), acceptPegoutQuoteUseCase: pegout.NewAcceptQuoteUseCase( @@ -151,7 +151,7 @@ func NewUseCaseRegistry( mutexes.PegoutLiquidityMutex(), ), sendPegoutUseCase: pegout.NewSendPegoutUseCase( - btcRegistry.Wallet, + btcRegistry.PaymentWallet, databaseRegistry.PegoutRepository, messaging.Rpc, messaging.EventBus, @@ -179,7 +179,7 @@ func NewUseCaseRegistry( getPegoutCollateralUseCase: pegout.NewGetCollateralUseCase(rskRegistry.Contracts, liquidityProvider), withdrawPeginCollateralUseCase: pegin.NewWithdrawCollateralUseCase(rskRegistry.Contracts), withdrawPegoutCollateralUseCase: pegout.NewWithdrawCollateralUseCase(rskRegistry.Contracts), - healthUseCase: usecases.NewHealthUseCase(rskRegistry.Client, btcRegistry.Connection, databaseRegistry.Connection), + healthUseCase: usecases.NewHealthUseCase(rskRegistry.Client, btcRegistry.MonitoringWalletConnection, databaseRegistry.Connection), setGeneralConfigUseCase: liquidity_provider.NewSetGeneralConfigUseCase( databaseRegistry.LiquidityProviderRepository, rskRegistry.Wallet, diff --git a/internal/configuration/registry/watcher.go b/internal/configuration/registry/watcher.go index 20b1abc8..50d52bbf 100644 --- a/internal/configuration/registry/watcher.go +++ b/internal/configuration/registry/watcher.go @@ -29,7 +29,7 @@ func NewWatcherRegistry( useCaseRegistry.callForUserUseCase, useCaseRegistry.getWatchedPeginQuoteUseCase, useCaseRegistry.expiredPeginQuoteUseCase, - btcRegistry.Wallet, + btcRegistry.MonitoringWallet, messaging.Rpc, messaging.EventBus, ), diff --git a/internal/entities/blockchain/rootstock.go b/internal/entities/blockchain/rootstock.go index 328fb4b1..acd57063 100644 --- a/internal/entities/blockchain/rootstock.go +++ b/internal/entities/blockchain/rootstock.go @@ -8,6 +8,7 @@ import ( "math/big" "regexp" "strings" + "time" ) const ( @@ -50,6 +51,13 @@ type TransactionReceipt struct { Value *entities.Wei } +type BlockInfo struct { + Hash string + Number uint64 + Timestamp time.Time + Nonce uint64 +} + func NewTransactionConfig(value *entities.Wei, gasLimit uint64, gasPrice *entities.Wei) TransactionConfig { var gas *uint64 if gasLimit != 0 { @@ -64,6 +72,7 @@ type RootstockRpcServer interface { GetHeight(ctx context.Context) (uint64, error) GetTransactionReceipt(ctx context.Context, hash string) (TransactionReceipt, error) GetBalance(ctx context.Context, address string) (*entities.Wei, error) + GetBlockByHash(ctx context.Context, hash string) (BlockInfo, error) } type RootstockWallet interface { diff --git a/internal/usecases/pegout/send_pegout.go b/internal/usecases/pegout/send_pegout.go index 0aa5c208..5aa8be22 100644 --- a/internal/usecases/pegout/send_pegout.go +++ b/internal/usecases/pegout/send_pegout.go @@ -108,10 +108,7 @@ func (useCase *SendPegoutUseCase) validateQuote( var err error var chainHeight uint64 var receipt blockchain.TransactionReceipt - - if pegoutQuote.IsExpired() { - return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) - } + var block blockchain.BlockInfo if chainHeight, err = useCase.rpc.Rsk.GetHeight(ctx); err != nil { return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) @@ -124,6 +121,10 @@ func (useCase *SendPegoutUseCase) validateQuote( } else if receipt.Value.Cmp(pegoutQuote.Total()) < 0 { retainedQuote.UserRskTxHash = receipt.TransactionHash return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.InsufficientAmountError, false) + } else if block, err = useCase.rpc.Rsk.GetBlockByHash(ctx, receipt.BlockHash); err != nil { + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, err, true) + } else if pegoutQuote.ExpireTime().Before(block.Timestamp) { + return blockchain.TransactionReceipt{}, useCase.publishErrorEvent(ctx, retainedQuote, *pegoutQuote, usecases.ExpiredQuoteError, false) } return receipt, nil } diff --git a/test/mocks/rpc_client_mock.go b/test/mocks/rpc_client_mock.go index b7290784..6aba3195 100644 --- a/test/mocks/rpc_client_mock.go +++ b/test/mocks/rpc_client_mock.go @@ -10,6 +10,8 @@ import ( mock "github.com/stretchr/testify/mock" + rpcclient "github.com/btcsuite/btcd/rpcclient" + wire "github.com/btcsuite/btcd/wire" ) @@ -86,6 +88,79 @@ func (_c *RpcClientMock_CreateRawTransaction_Call) RunAndReturn(run func([]btcjs return _c } +// CreateWallet provides a mock function with given fields: name, opts +func (_m *RpcClientMock) CreateWallet(name string, opts ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, name) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CreateWallet") + } + + var r0 *btcjson.CreateWalletResult + var r1 error + if rf, ok := ret.Get(0).(func(string, ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error)); ok { + return rf(name, opts...) + } + if rf, ok := ret.Get(0).(func(string, ...rpcclient.CreateWalletOpt) *btcjson.CreateWalletResult); ok { + r0 = rf(name, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.CreateWalletResult) + } + } + + if rf, ok := ret.Get(1).(func(string, ...rpcclient.CreateWalletOpt) error); ok { + r1 = rf(name, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_CreateWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateWallet' +type RpcClientMock_CreateWallet_Call struct { + *mock.Call +} + +// CreateWallet is a helper method to define mock.On call +// - name string +// - opts ...rpcclient.CreateWalletOpt +func (_e *RpcClientMock_Expecter) CreateWallet(name interface{}, opts ...interface{}) *RpcClientMock_CreateWallet_Call { + return &RpcClientMock_CreateWallet_Call{Call: _e.mock.On("CreateWallet", + append([]interface{}{name}, opts...)...)} +} + +func (_c *RpcClientMock_CreateWallet_Call) Run(run func(name string, opts ...rpcclient.CreateWalletOpt)) *RpcClientMock_CreateWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]rpcclient.CreateWalletOpt, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(rpcclient.CreateWalletOpt) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *RpcClientMock_CreateWallet_Call) Return(_a0 *btcjson.CreateWalletResult, _a1 error) *RpcClientMock_CreateWallet_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_CreateWallet_Call) RunAndReturn(run func(string, ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error)) *RpcClientMock_CreateWallet_Call { + _c.Call.Return(run) + return _c +} + // Disconnect provides a mock function with given fields: func (_m *RpcClientMock) Disconnect() { _m.Called() @@ -118,6 +193,65 @@ func (_c *RpcClientMock_Disconnect_Call) RunAndReturn(run func()) *RpcClientMock return _c } +// EstimateSmartFee provides a mock function with given fields: confTarget, mode +func (_m *RpcClientMock) EstimateSmartFee(confTarget int64, mode *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error) { + ret := _m.Called(confTarget, mode) + + if len(ret) == 0 { + panic("no return value specified for EstimateSmartFee") + } + + var r0 *btcjson.EstimateSmartFeeResult + var r1 error + if rf, ok := ret.Get(0).(func(int64, *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error)); ok { + return rf(confTarget, mode) + } + if rf, ok := ret.Get(0).(func(int64, *btcjson.EstimateSmartFeeMode) *btcjson.EstimateSmartFeeResult); ok { + r0 = rf(confTarget, mode) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.EstimateSmartFeeResult) + } + } + + if rf, ok := ret.Get(1).(func(int64, *btcjson.EstimateSmartFeeMode) error); ok { + r1 = rf(confTarget, mode) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_EstimateSmartFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateSmartFee' +type RpcClientMock_EstimateSmartFee_Call struct { + *mock.Call +} + +// EstimateSmartFee is a helper method to define mock.On call +// - confTarget int64 +// - mode *btcjson.EstimateSmartFeeMode +func (_e *RpcClientMock_Expecter) EstimateSmartFee(confTarget interface{}, mode interface{}) *RpcClientMock_EstimateSmartFee_Call { + return &RpcClientMock_EstimateSmartFee_Call{Call: _e.mock.On("EstimateSmartFee", confTarget, mode)} +} + +func (_c *RpcClientMock_EstimateSmartFee_Call) Run(run func(confTarget int64, mode *btcjson.EstimateSmartFeeMode)) *RpcClientMock_EstimateSmartFee_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int64), args[1].(*btcjson.EstimateSmartFeeMode)) + }) + return _c +} + +func (_c *RpcClientMock_EstimateSmartFee_Call) Return(_a0 *btcjson.EstimateSmartFeeResult, _a1 error) *RpcClientMock_EstimateSmartFee_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_EstimateSmartFee_Call) RunAndReturn(run func(int64, *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error)) *RpcClientMock_EstimateSmartFee_Call { + _c.Call.Return(run) + return _c +} + // FundRawTransaction provides a mock function with given fields: tx, opts, isWitness func (_m *RpcClientMock) FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) { ret := _m.Called(tx, opts, isWitness) @@ -178,6 +312,64 @@ func (_c *RpcClientMock_FundRawTransaction_Call) RunAndReturn(run func(*wire.Msg return _c } +// GetAddressInfo provides a mock function with given fields: address +func (_m *RpcClientMock) GetAddressInfo(address string) (*btcjson.GetAddressInfoResult, error) { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for GetAddressInfo") + } + + var r0 *btcjson.GetAddressInfoResult + var r1 error + if rf, ok := ret.Get(0).(func(string) (*btcjson.GetAddressInfoResult, error)); ok { + return rf(address) + } + if rf, ok := ret.Get(0).(func(string) *btcjson.GetAddressInfoResult); ok { + r0 = rf(address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetAddressInfoResult) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_GetAddressInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAddressInfo' +type RpcClientMock_GetAddressInfo_Call struct { + *mock.Call +} + +// GetAddressInfo is a helper method to define mock.On call +// - address string +func (_e *RpcClientMock_Expecter) GetAddressInfo(address interface{}) *RpcClientMock_GetAddressInfo_Call { + return &RpcClientMock_GetAddressInfo_Call{Call: _e.mock.On("GetAddressInfo", address)} +} + +func (_c *RpcClientMock_GetAddressInfo_Call) Run(run func(address string)) *RpcClientMock_GetAddressInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *RpcClientMock_GetAddressInfo_Call) Return(_a0 *btcjson.GetAddressInfoResult, _a1 error) *RpcClientMock_GetAddressInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_GetAddressInfo_Call) RunAndReturn(run func(string) (*btcjson.GetAddressInfoResult, error)) *RpcClientMock_GetAddressInfo_Call { + _c.Call.Return(run) + return _c +} + // GetBlock provides a mock function with given fields: blockHash func (_m *RpcClientMock) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) { ret := _m.Called(blockHash) @@ -630,6 +822,53 @@ func (_c *RpcClientMock_ImportAddressRescan_Call) RunAndReturn(run func(string, return _c } +// ImportPubKeyRescan provides a mock function with given fields: pubKey, rescan +func (_m *RpcClientMock) ImportPubKeyRescan(pubKey string, rescan bool) error { + ret := _m.Called(pubKey, rescan) + + if len(ret) == 0 { + panic("no return value specified for ImportPubKeyRescan") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, bool) error); ok { + r0 = rf(pubKey, rescan) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RpcClientMock_ImportPubKeyRescan_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportPubKeyRescan' +type RpcClientMock_ImportPubKeyRescan_Call struct { + *mock.Call +} + +// ImportPubKeyRescan is a helper method to define mock.On call +// - pubKey string +// - rescan bool +func (_e *RpcClientMock_Expecter) ImportPubKeyRescan(pubKey interface{}, rescan interface{}) *RpcClientMock_ImportPubKeyRescan_Call { + return &RpcClientMock_ImportPubKeyRescan_Call{Call: _e.mock.On("ImportPubKeyRescan", pubKey, rescan)} +} + +func (_c *RpcClientMock_ImportPubKeyRescan_Call) Run(run func(pubKey string, rescan bool)) *RpcClientMock_ImportPubKeyRescan_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(bool)) + }) + return _c +} + +func (_c *RpcClientMock_ImportPubKeyRescan_Call) Return(_a0 error) *RpcClientMock_ImportPubKeyRescan_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_ImportPubKeyRescan_Call) RunAndReturn(run func(string, bool) error) *RpcClientMock_ImportPubKeyRescan_Call { + _c.Call.Return(run) + return _c +} + // ListUnspent provides a mock function with given fields: func (_m *RpcClientMock) ListUnspent() ([]btcjson.ListUnspentResult, error) { ret := _m.Called() @@ -747,6 +986,64 @@ func (_c *RpcClientMock_ListUnspentMinMaxAddresses_Call) RunAndReturn(run func(i return _c } +// LoadWallet provides a mock function with given fields: walletName +func (_m *RpcClientMock) LoadWallet(walletName string) (*btcjson.LoadWalletResult, error) { + ret := _m.Called(walletName) + + if len(ret) == 0 { + panic("no return value specified for LoadWallet") + } + + var r0 *btcjson.LoadWalletResult + var r1 error + if rf, ok := ret.Get(0).(func(string) (*btcjson.LoadWalletResult, error)); ok { + return rf(walletName) + } + if rf, ok := ret.Get(0).(func(string) *btcjson.LoadWalletResult); ok { + r0 = rf(walletName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.LoadWalletResult) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(walletName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientMock_LoadWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LoadWallet' +type RpcClientMock_LoadWallet_Call struct { + *mock.Call +} + +// LoadWallet is a helper method to define mock.On call +// - walletName string +func (_e *RpcClientMock_Expecter) LoadWallet(walletName interface{}) *RpcClientMock_LoadWallet_Call { + return &RpcClientMock_LoadWallet_Call{Call: _e.mock.On("LoadWallet", walletName)} +} + +func (_c *RpcClientMock_LoadWallet_Call) Run(run func(walletName string)) *RpcClientMock_LoadWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *RpcClientMock_LoadWallet_Call) Return(_a0 *btcjson.LoadWalletResult, _a1 error) *RpcClientMock_LoadWallet_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientMock_LoadWallet_Call) RunAndReturn(run func(string) (*btcjson.LoadWalletResult, error)) *RpcClientMock_LoadWallet_Call { + _c.Call.Return(run) + return _c +} + // Ping provides a mock function with given fields: func (_m *RpcClientMock) Ping() error { ret := _m.Called() @@ -851,6 +1148,73 @@ func (_c *RpcClientMock_SendRawTransaction_Call) RunAndReturn(run func(*wire.Msg return _c } +// SignRawTransaction3 provides a mock function with given fields: tx, inputs, privKeysWIF +func (_m *RpcClientMock) SignRawTransaction3(tx *wire.MsgTx, inputs []btcjson.RawTxInput, privKeysWIF []string) (*wire.MsgTx, bool, error) { + ret := _m.Called(tx, inputs, privKeysWIF) + + if len(ret) == 0 { + panic("no return value specified for SignRawTransaction3") + } + + var r0 *wire.MsgTx + var r1 bool + var r2 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) (*wire.MsgTx, bool, error)); ok { + return rf(tx, inputs, privKeysWIF) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) *wire.MsgTx); ok { + r0 = rf(tx, inputs, privKeysWIF) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgTx) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) bool); ok { + r1 = rf(tx, inputs, privKeysWIF) + } else { + r1 = ret.Get(1).(bool) + } + + if rf, ok := ret.Get(2).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) error); ok { + r2 = rf(tx, inputs, privKeysWIF) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// RpcClientMock_SignRawTransaction3_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SignRawTransaction3' +type RpcClientMock_SignRawTransaction3_Call struct { + *mock.Call +} + +// SignRawTransaction3 is a helper method to define mock.On call +// - tx *wire.MsgTx +// - inputs []btcjson.RawTxInput +// - privKeysWIF []string +func (_e *RpcClientMock_Expecter) SignRawTransaction3(tx interface{}, inputs interface{}, privKeysWIF interface{}) *RpcClientMock_SignRawTransaction3_Call { + return &RpcClientMock_SignRawTransaction3_Call{Call: _e.mock.On("SignRawTransaction3", tx, inputs, privKeysWIF)} +} + +func (_c *RpcClientMock_SignRawTransaction3_Call) Run(run func(tx *wire.MsgTx, inputs []btcjson.RawTxInput, privKeysWIF []string)) *RpcClientMock_SignRawTransaction3_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx), args[1].([]btcjson.RawTxInput), args[2].([]string)) + }) + return _c +} + +func (_c *RpcClientMock_SignRawTransaction3_Call) Return(_a0 *wire.MsgTx, _a1 bool, _a2 error) *RpcClientMock_SignRawTransaction3_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *RpcClientMock_SignRawTransaction3_Call) RunAndReturn(run func(*wire.MsgTx, []btcjson.RawTxInput, []string) (*wire.MsgTx, bool, error)) *RpcClientMock_SignRawTransaction3_Call { + _c.Call.Return(run) + return _c +} + // SignRawTransactionWithWallet provides a mock function with given fields: tx func (_m *RpcClientMock) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) { ret := _m.Called(tx) diff --git a/test/mocks/rsk_rpc_mock.go b/test/mocks/rsk_rpc_mock.go deleted file mode 100644 index 687c374b..00000000 --- a/test/mocks/rsk_rpc_mock.go +++ /dev/null @@ -1,46 +0,0 @@ -package mocks - -import ( - "context" - "github.com/rsksmart/liquidity-provider-server/internal/entities" - "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" - "github.com/stretchr/testify/mock" -) - -type RskRpcMock struct { - mock.Mock - blockchain.RootstockRpcServer -} - -func (m *RskRpcMock) GetTransactionReceipt(ctx context.Context, hash string) (blockchain.TransactionReceipt, error) { - args := m.Called(ctx, hash) - return args.Get(0).(blockchain.TransactionReceipt), args.Error(1) -} - -func (m *RskRpcMock) GasPrice(ctx context.Context) (*entities.Wei, error) { - args := m.Called(ctx) - if args.Get(0) == nil { - return nil, args.Error(1) - } - return args.Get(0).(*entities.Wei), args.Error(1) -} - -func (m *RskRpcMock) GetBalance(ctx context.Context, address string) (*entities.Wei, error) { - args := m.Called(ctx, address) - if args.Get(0) == nil { - return nil, args.Error(1) - } - return args.Get(0).(*entities.Wei), args.Error(1) -} - -func (m *RskRpcMock) GetHeight(ctx context.Context) (uint64, error) { - args := m.Called(ctx) - return args.Get(0).(uint64), args.Error(1) -} -func (m *RskRpcMock) EstimateGas(ctx context.Context, addr string, value *entities.Wei, data []byte) (*entities.Wei, error) { - args := m.Called(ctx, addr, value, data) - if args.Get(0) == nil { - return nil, args.Error(1) - } - return args.Get(0).(*entities.Wei), args.Error(1) -} diff --git a/test/utils.go b/test/utils.go index 02acf439..18a75f52 100644 --- a/test/utils.go +++ b/test/utils.go @@ -51,7 +51,12 @@ func OpenWalletForTest(t *testing.T, testRef string) *account.RskAccount { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) - account, err := account.GetRskAccount(testDir, 0, string(keyBytes), KeyPassword) + account, err := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: KeyPassword, + }) require.NoError(t, err) return account } From 8123402d8e18493a6eca6ad9cefe6ab347777bcc Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 30 Apr 2024 10:39:33 +0200 Subject: [PATCH 055/113] test: update test for derivative wallet changes --- .mockery.yaml | 8 +- .../bitcoin/bitcoind_wallet_test.go | 46 +- .../dataproviders/bitcoin/common_test.go | 4 +- .../dataproviders/bitcoin/rpc_test.go | 54 +- .../dataproviders/liquidity_provider_test.go | 8 +- .../rootstock/account/account_test.go | 49 +- .../usecases/pegin/accept_pegin_quote_test.go | 42 +- internal/usecases/pegin/call_for_user_test.go | 32 +- .../usecases/pegin/get_pegin_quote_test.go | 28 +- .../usecases/pegout/get_pegout_quote_test.go | 30 +- .../pegout/init_deposits_cache_test.go | 12 +- internal/usecases/pegout/send_pegout_test.go | 163 +- test/mocks/client_adapter_mock.go | 1497 +++++++++++++++++ test/mocks/rootstock_rpc_server_mock.go | 388 +++++ test/mocks/rpc_client_binding_mock.go | 59 + test/mocks/rpc_client_mock.go | 115 +- 16 files changed, 2278 insertions(+), 257 deletions(-) create mode 100644 test/mocks/client_adapter_mock.go create mode 100644 test/mocks/rootstock_rpc_server_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index b918f607..4cd5db99 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -16,9 +16,10 @@ packages: LbcCallerBinding: LbcAdapter: EventIteratorAdapter: - github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin: + github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient: interfaces: - rpcClient: + RpcClient: + ClientAdapter: github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider: interfaces: DefaultCredentialsProvider: @@ -31,4 +32,5 @@ packages: PegoutQuoteRepository: github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain: interfaces: - BitcoinWallet: \ No newline at end of file + BitcoinWallet: + RootstockRpcServer: \ No newline at end of file diff --git a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go index f2b2e9d6..b9850d2c 100644 --- a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go +++ b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go @@ -37,7 +37,7 @@ const ( func TestBitcoindWallet_Unlock(t *testing.T) { expiredLockUntil := expiredTime nonExpiredLockUntil := unexpiredTime - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ UnlockedUntil: &expiredLockUntil, }, nil).Once() @@ -54,7 +54,7 @@ func TestBitcoindWallet_Unlock(t *testing.T) { } func TestBitcoindWallet_Unlock_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetWalletInfo").Return(nil, assert.AnError).Once() rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(nil, client), mockAddress, mockFeeRate, true, mockPassword) err := rpc.Unlock() @@ -62,14 +62,14 @@ func TestBitcoindWallet_Unlock_ErrorHandling(t *testing.T) { } func TestBitcoindWallet_ImportAddress(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("ImportAddressRescan", testnetAddress, "", false).Return(nil).Once() rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockAddress, mockFeeRate, true, mockPassword) err := rpc.ImportAddress(testnetAddress) require.NoError(t, err) client.AssertExpectations(t) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("ImportAddressRescan", mainnetAddress, "", false).Return(nil).Once() rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.MainNetParams, client), mockAddress, mockFeeRate, true, mockPassword) err = rpc.ImportAddress(mainnetAddress) @@ -78,7 +78,7 @@ func TestBitcoindWallet_ImportAddress(t *testing.T) { } func TestBitcoindWallet_ImportAddress_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.MainNetParams, client), mockAddress, mockFeeRate, true, mockPassword) err := rpc.ImportAddress(testnetAddress) require.Error(t, err) @@ -89,7 +89,7 @@ func TestBitcoindWallet_ImportAddress_ErrorHandling(t *testing.T) { } func TestBitcoindWallet_EstimateTxFees(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} amount := entities.NewWei(5000000000000000) var changePosition int64 = 2 var input []btcjson.PsbtInput @@ -120,7 +120,7 @@ func TestBitcoindWallet_EstimateTxFees(t *testing.T) { } func TestBitcoindWallet_EstimateTxFees_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockAddress, mockFeeRate, true, mockPassword) fee, err := rpc.EstimateTxFees(mainnetAddress, entities.NewWei(1)) require.Error(t, err) @@ -159,7 +159,7 @@ func TestBitcoindWallet_GetBalance(t *testing.T) { var result []btcjson.ListUnspentResult err = json.Unmarshal(rpcResponse, &result) require.NoError(t, err) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("ListUnspent").Return(result, nil).Once() rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockAddress, mockFeeRate, true, mockPassword) balance, err := rpc.GetBalance() @@ -169,7 +169,7 @@ func TestBitcoindWallet_GetBalance(t *testing.T) { } func TestBitcoindWallet_GetBalance_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("ListUnspent").Return(nil, assert.AnError).Once() rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockAddress, mockFeeRate, true, mockPassword) balance, err := rpc.GetBalance() @@ -183,7 +183,7 @@ func TestBitcoindWallet_GetBalance_ErrorHandling(t *testing.T) { assert.Nil(t, balance) } -func setupSendWithOpReturnTest(t *testing.T, client *mocks.RpcClientMock, encrypted bool) { +func setupSendWithOpReturnTest(t *testing.T, client *mocks.ClientAdapterMock, encrypted bool) { var input []btcjson.TransactionInput var lockTime *int64 satoshis := 50000000 @@ -239,7 +239,7 @@ func TestBitcoindWallet_SendWithOpReturn(t *testing.T) { data := []byte{2, 1, 0, 7, 2, 0, 0, 0} params := &chaincfg.TestNet3Params - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} setupSendWithOpReturnTest(t, client, true) rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(params, client), mockAddress, mockFeeRate, true, mockPassword) txHash, err := rpc.SendWithOpReturn(testnetAddress, entities.NewWei(500000000000000000), data) @@ -248,7 +248,7 @@ func TestBitcoindWallet_SendWithOpReturn(t *testing.T) { assert.Equal(t, testnetTestTxHash, txHash) client.AssertExpectations(t) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} setupSendWithOpReturnTest(t, client, false) rpc = bitcoin.NewBitcoindWallet(bitcoin.NewConnection(params, client), mockAddress, mockFeeRate, false, mockPassword) txHash, err = rpc.SendWithOpReturn(testnetAddress, entities.NewWei(500000000000000000), data) @@ -261,7 +261,7 @@ func TestBitcoindWallet_SendWithOpReturn(t *testing.T) { func TestBitcoindWallet_SendWithOpReturn_ErrorHandling(t *testing.T) { setups := sendWithOpReturnErrorSetups() for _, setup := range setups { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} data := []byte{2, 1, 0, 7, 2, 0, 0, 0} setup(client, &data) rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockAddress, mockFeeRate, true, mockPassword) @@ -273,12 +273,12 @@ func TestBitcoindWallet_SendWithOpReturn_ErrorHandling(t *testing.T) { } // nolint:funlen -func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]byte) { - return []func(client *mocks.RpcClientMock, data *[]byte){ - func(client *mocks.RpcClientMock, data *[]byte) { +func sendWithOpReturnErrorSetups() []func(client *mocks.ClientAdapterMock, data *[]byte) { + return []func(client *mocks.ClientAdapterMock, data *[]byte){ + func(client *mocks.ClientAdapterMock, data *[]byte) { client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, - func(client *mocks.RpcClientMock, data *[]byte) { + func(client *mocks.ClientAdapterMock, data *[]byte) { client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, @@ -287,7 +287,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b }, nil).Once() client.On("GetWalletInfo").Return(nil, assert.AnError).Once() }, - func(client *mocks.RpcClientMock, data *[]byte) { + func(client *mocks.ClientAdapterMock, data *[]byte) { client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, @@ -298,7 +298,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b *data = append(*data, byte(i)) } }, - func(client *mocks.RpcClientMock, data *[]byte) { + func(client *mocks.ClientAdapterMock, data *[]byte) { client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, @@ -312,7 +312,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b var isWitness *bool client.On("FundRawTransaction", mock.Anything, mock.Anything, isWitness).Return(nil, assert.AnError).Once() }, - func(client *mocks.RpcClientMock, data *[]byte) { + func(client *mocks.ClientAdapterMock, data *[]byte) { client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, @@ -327,7 +327,7 @@ func sendWithOpReturnErrorSetups() []func(client *mocks.RpcClientMock, data *[]b client.On("FundRawTransaction", mock.Anything, mock.Anything, isWitness).Return(&btcjson.FundRawTransactionResult{}, nil).Once() client.On("SignRawTransactionWithWallet", mock.Anything).Return(nil, false, assert.AnError).Once() }, - func(client *mocks.RpcClientMock, data *[]byte) { + func(client *mocks.ClientAdapterMock, data *[]byte) { client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&wire.MsgTx{ Version: 0, TxIn: nil, @@ -354,7 +354,7 @@ func TestBitcoindWallet_GetTransactions(t *testing.T) { var result []btcjson.ListUnspentResult err = json.Unmarshal(rpcResponse, &result) require.NoError(t, err) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} parsedAddress, err := btcutil.DecodeAddress(testnetAddress, &chaincfg.TestNet3Params) require.NoError(t, err) client.On("ListUnspentMinMaxAddresses", 0, 9999999, []btcutil.Address{parsedAddress}).Return(result, nil).Once() @@ -398,7 +398,7 @@ func TestBitcoindWallet_GetTransactions(t *testing.T) { } func TestBitcoindWallet_GetTransactions_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), mockAddress, mockFeeRate, true, mockPassword) transactions, err := rpc.GetTransactions("invalidAddress") require.Error(t, err) diff --git a/internal/adapters/dataproviders/bitcoin/common_test.go b/internal/adapters/dataproviders/bitcoin/common_test.go index 1d2680d8..dff68fb8 100644 --- a/internal/adapters/dataproviders/bitcoin/common_test.go +++ b/internal/adapters/dataproviders/bitcoin/common_test.go @@ -12,7 +12,7 @@ import ( func TestConnection_CheckConnection(t *testing.T) { networkParams := &chaincfg.Params{} - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("Ping").Return(assert.AnError).Once() client.On("Ping").Return(nil).Once() conn := bitcoin.NewConnection(networkParams, client) @@ -23,7 +23,7 @@ func TestConnection_CheckConnection(t *testing.T) { func TestConnection_Shutdown(t *testing.T) { endChannel := make(chan bool) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("Disconnect").Once() conn := bitcoin.NewConnection(&chaincfg.Params{}, client) go conn.Shutdown(endChannel) diff --git a/internal/adapters/dataproviders/bitcoin/rpc_test.go b/internal/adapters/dataproviders/bitcoin/rpc_test.go index 58ee50b5..4db90a63 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc_test.go +++ b/internal/adapters/dataproviders/bitcoin/rpc_test.go @@ -28,7 +28,7 @@ const ( ) func TestBitcoindRpc_ValidateAddress(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} mainnet := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) testnet := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) regtest := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.RegressionNetParams, client)) @@ -72,7 +72,7 @@ func TestBitcoindRpc_ValidateAddress(t *testing.T) { } func TestBitcoindRpc_GetHeight(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) client.On("GetBlockChainInfo").Return(&btcjson.GetBlockChainInfoResult{Blocks: 123}, nil).Once() @@ -88,7 +88,7 @@ func TestBitcoindRpc_GetHeight(t *testing.T) { } func TestBitcoindRpc_DecodeAddress(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) cases := decodedAddresses for _, c := range cases { @@ -102,7 +102,7 @@ func TestBitcoindRpc_DecodeAddress(t *testing.T) { } func TestBitcoindRpc_GetRawTransaction(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} txBytes, _ := hex.DecodeString("0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700") client.On("GetRawTransaction", mock.Anything).Return(btcutil.NewTxFromBytes(txBytes)).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -115,7 +115,7 @@ func TestBitcoindRpc_GetRawTransaction_FromBlock(t *testing.T) { mainnetBlock := getTestBlock(t, mainnetBlockFile) tx, err := mainnetBlock.Tx(0) require.NoError(t, err) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransaction", mock.Anything).Return(tx, nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err := rpc.GetRawTransaction(tx.Hash().String()) @@ -135,7 +135,7 @@ func TestBitcoindRpc_GetRawTransaction_FromBlock(t *testing.T) { } func TestBitcoindRpc_GetRawTransaction_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} txBytes, _ := hex.DecodeString("0200000002ebf7c22a73f3baea460cad53a2788bd4f24020f6b374900a771d3422f128442e000000006a473044022062dae13ba281d0cf529b604bb59c1efcd7b83438af34d4a51acc6f31041be18c022044df281e688a52624f45f6c26662349d1f5efedd4d69530e65b7d7cec0d3792d0121038e509bc056004a5da7460b5acd5d4dcb2add41d53817180499e3814290ecc91efdffffffb5f09f38215b850f4ba644a7f7ab57efa8d10c5f4b5908e9aa980ff5ffa948f5000000006a47304402206538fc72b896e4c6e807a4daf56191f68dec307c3011d082e69eeb3d45d6d8c302205a329814ab87901ae56a82587e716fa2282ecc665ab203da14d93db71181ecd8012102498a833095175800f40b2c0ab23f108b47a319a94ccea826062bf66c827e91a9fdffffff0298740700000000001976a91473cce22e78ec61cd54a6438ca1210b88561ebcdd88ac20a10700000000001976a9142c81478132b5dda64ffc484a0d225096c4b22ad588acc3682700") client.On("GetRawTransaction", mock.Anything).Return(btcutil.NewTxFromBytes(txBytes)).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -143,13 +143,13 @@ func TestBitcoindRpc_GetRawTransaction_ErrorHandling(t *testing.T) { _, err := rpc.GetRawTransaction("invalidHash") require.Error(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransaction", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) _, err = rpc.GetRawTransaction(testnetTestTxHash) require.Error(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransaction", mock.Anything).Return(btcutil.NewTxFromBytes([]byte{01, 02, 03})).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) _, err = rpc.GetRawTransaction(testnetTestTxHash) @@ -157,7 +157,7 @@ func TestBitcoindRpc_GetRawTransaction_ErrorHandling(t *testing.T) { } func TestBitcoindRpc_GetTransactionBlockInfo(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlockVerbose", mock.Anything).Return(&btcjson.GetBlockVerboseResult{Height: 123}, nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -168,20 +168,20 @@ func TestBitcoindRpc_GetTransactionBlockInfo(t *testing.T) { } func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err := rpc.GetTransactionBlockInfo("txhash") assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) require.Error(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) require.Error(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlockVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -189,7 +189,7 @@ func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { assert.Equal(t, blockchain.BitcoinBlockInformation{}, result) require.Error(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: "blk"}, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionBlockInfo(testnetTestTxHash) @@ -200,7 +200,7 @@ func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { func TestBitcoindRpc_BuildMerkleBranch(t *testing.T) { block := getTestBlock(t, testnetBlockFile) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -225,19 +225,19 @@ func TestBitcoindRpc_BuildMerkleBranch(t *testing.T) { } func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { - rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, &mocks.RpcClientMock{})) + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, &mocks.ClientAdapterMock{})) branch, err := rpc.BuildMerkleBranch("txhash") require.Error(t, err) require.Equal(t, blockchain.MerkleBranch{}, branch) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) require.Error(t, err) require.Equal(t, blockchain.MerkleBranch{}, branch) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(&wire.MsgBlock{}, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -245,7 +245,7 @@ func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { require.Error(t, err) require.Equal(t, blockchain.MerkleBranch{}, branch) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: "blkhash"}, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) branch, err = rpc.BuildMerkleBranch(testnetTestTxHash) @@ -256,7 +256,7 @@ func TestBitcoindRpc_BuildMerkleBranch_ErrorHandling(t *testing.T) { func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { block := getTestBlock(t, testnetBlockFile) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -268,7 +268,7 @@ func TestBitcoindRpc_BuildMerkleBranch_TxNotFound(t *testing.T) { func TestBitcoindRpc_GetPartialMerkleTree(t *testing.T) { block := getTestBlock(t, testnetBlockFile) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(block.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -340,7 +340,7 @@ func TestBitcoindRpc_BuildMerkleBranch_MainnetBlock(t *testing.T) { } mainnetBlock := getTestBlock(t, mainnetBlockFile) for _, c := range cases { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() client.On("GetBlock", mock.Anything).Return(mainnetBlock.MsgBlock(), nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) @@ -352,12 +352,12 @@ func TestBitcoindRpc_BuildMerkleBranch_MainnetBlock(t *testing.T) { } func TestBitcoindRpc_GetPartialMerkleTree_ErrorHandling(t *testing.T) { - rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, &mocks.RpcClientMock{})) + rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, &mocks.ClientAdapterMock{})) pmt, err := rpc.GetPartialMerkleTree("txhash") require.Error(t, err) require.Nil(t, pmt) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} block := getTestBlock(t, testnetBlockFile) msgBlock := block.MsgBlock() msgBlock.Transactions = append(msgBlock.Transactions, msgBlock.Transactions...) @@ -378,7 +378,7 @@ func TestBitcoindRpc_GetTransactionInfo(t *testing.T) { txReceiveDetails := btcjson.TxRawResult{} err = json.Unmarshal(receivedTxResponse, &txReceiveDetails) require.NoError(t, err) - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&txReceiveDetails, nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) result, err := rpc.GetTransactionInfo(testnetTestTxHash) @@ -400,7 +400,7 @@ func TestBitcoindRpc_GetTransactionInfo(t *testing.T) { txSendDetails := btcjson.TxRawResult{} err = json.Unmarshal(sentTxResponse, &txSendDetails) require.NoError(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(&txSendDetails, nil).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.TestNet3Params, client)) result, err = rpc.GetTransactionInfo(sendTxHash) @@ -417,13 +417,13 @@ func TestBitcoindRpc_GetTransactionInfo(t *testing.T) { } func TestBitcoindRpc_GetTransactionInfo_ErrorHandling(t *testing.T) { - client := &mocks.RpcClientMock{} + client := &mocks.ClientAdapterMock{} rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err := rpc.GetTransactionInfo("txhash") assert.Equal(t, blockchain.BitcoinTransactionInformation{}, result) require.Error(t, err) - client = &mocks.RpcClientMock{} + client = &mocks.ClientAdapterMock{} client.On("GetRawTransactionVerbose", mock.Anything).Return(nil, assert.AnError).Once() rpc = bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err = rpc.GetTransactionInfo(testnetTestTxHash) diff --git a/internal/adapters/dataproviders/liquidity_provider_test.go b/internal/adapters/dataproviders/liquidity_provider_test.go index 6a1f773c..8011282c 100644 --- a/internal/adapters/dataproviders/liquidity_provider_test.go +++ b/internal/adapters/dataproviders/liquidity_provider_test.go @@ -155,7 +155,7 @@ func TestLocalLiquidityProvider_HasPeginLiquidity(t *testing.T) { }, nil).Times(3) lbcMock := new(mocks.LbcMock) lbcMock.On("GetBalance", rskTestAddress).Return(entities.NewWei(200), nil).Times(3) - rpcMock := new(mocks.RskRpcMock) + rpcMock := new(mocks.RootstockRpcServerMock) rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(entities.NewWei(300), nil).Times(3) lp := dataproviders.NewLocalLiquidityProvider(peginRepository, nil, nil, blockchain.Rpc{Rsk: rpcMock}, signer, nil, blockchain.RskContracts{Lbc: lbcMock}) testCases := []struct { @@ -185,14 +185,14 @@ func TestLocalLiquidityProvider_HasPeginLiquidity_ErrorHandling(t *testing.T) { signer := new(mocks.TransactionSignerMock) signer.On("Address").Return(common.HexToAddress(rskTestAddress)) t.Run("Error getting balance from RSK RPC server", func(t *testing.T) { - rpcMock := new(mocks.RskRpcMock) + rpcMock := new(mocks.RootstockRpcServerMock) rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(nil, assert.AnError).Once() lp := dataproviders.NewLocalLiquidityProvider(nil, nil, nil, blockchain.Rpc{Rsk: rpcMock}, signer, nil, blockchain.RskContracts{}) err := lp.HasPeginLiquidity(context.Background(), entities.NewWei(1)) require.Error(t, err) }) t.Run("Error getting balance from LBC", func(t *testing.T) { - rpcMock := new(mocks.RskRpcMock) + rpcMock := new(mocks.RootstockRpcServerMock) rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(entities.NewWei(100), nil).Once() lbcMock := new(mocks.LbcMock) lbcMock.On("GetBalance", rskTestAddress).Return(nil, assert.AnError).Once() @@ -201,7 +201,7 @@ func TestLocalLiquidityProvider_HasPeginLiquidity_ErrorHandling(t *testing.T) { require.Error(t, err) }) t.Run("Error pegin quotes from db", func(t *testing.T) { - rpcMock := new(mocks.RskRpcMock) + rpcMock := new(mocks.RootstockRpcServerMock) rpcMock.On("GetBalance", test.AnyCtx, rskTestAddress).Return(entities.NewWei(100), nil).Once() lbcMock := new(mocks.LbcMock) lbcMock.On("GetBalance", rskTestAddress).Return(entities.NewWei(200), nil).Once() diff --git a/internal/adapters/dataproviders/rootstock/account/account_test.go b/internal/adapters/dataproviders/rootstock/account/account_test.go index f732f59b..50aa50b5 100644 --- a/internal/adapters/dataproviders/rootstock/account/account_test.go +++ b/internal/adapters/dataproviders/rootstock/account/account_test.go @@ -32,7 +32,12 @@ func TestGetAccount(t *testing.T) { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) t.Run("Create new account", func(t *testing.T) { - account, testError := account.GetRskAccount(testDir, 0, string(keyBytes), test.KeyPassword) + account, testError := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }) _, noExistError := os.Stat(testDir) assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") require.NoError(t, testError) @@ -40,7 +45,12 @@ func TestGetAccount(t *testing.T) { assert.NotNil(t, 1, len(account.Keystore.Accounts())) }) t.Run("Retrieve created account new account", func(t *testing.T) { - otherAccount, otherError := account.GetRskAccount(testDir, 0, string(keyBytes), test.KeyPassword) + otherAccount, otherError := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }) require.NoError(t, otherError) assert.Equal(t, common.HexToAddress(keyAddress), otherAccount.Account.Address) assert.NotNil(t, 1, len(otherAccount.Keystore.Accounts())) @@ -60,25 +70,50 @@ func TestGetAccount_ErrorHandling(t *testing.T) { keyBytes, setupErr := io.ReadAll(keyFile) require.NoError(t, setupErr) t.Run("Invalid dir", func(t *testing.T) { - account, err := account.GetRskAccount("/test", 0, string(keyBytes), test.KeyPassword) + account, err := account.GetRskAccount(account.CreationArgs{ + KeyDir: "/test", + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }) assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid key", func(t *testing.T) { - account, err := account.GetRskAccount(testDir, 0, "any key", test.KeyPassword) + account, err := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: "any key", + Password: test.KeyPassword, + }) assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid password", func(t *testing.T) { - account, err := account.GetRskAccount(testDir, 0, string(keyBytes), "incorrect") + account, err := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: "incorrect", + }) assert.Nil(t, account) require.Error(t, err) }) t.Run("Invalid account number", func(t *testing.T) { // we create a keystore first so in the second call we can try to get an account that doesn't exist - _, err := account.GetRskAccount(testDir, 0, string(keyBytes), test.KeyPassword) + _, err := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }) require.NoError(t, err) - account, err := account.GetRskAccount(testDir, 1, string(keyBytes), test.KeyPassword) + account, err := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 1, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }) assert.Nil(t, account) require.Error(t, err) }) diff --git a/internal/usecases/pegin/accept_pegin_quote_test.go b/internal/usecases/pegin/accept_pegin_quote_test.go index 9027ffc0..17c32e53 100644 --- a/internal/usecases/pegin/accept_pegin_quote_test.go +++ b/internal/usecases/pegin/accept_pegin_quote_test.go @@ -93,7 +93,7 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) contracts := blockchain.RskContracts{Bridge: bridge} @@ -132,7 +132,7 @@ func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Bridge: bridge} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -164,7 +164,7 @@ func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Bridge: bridge} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -197,7 +197,7 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Bridge: bridge} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -238,7 +238,7 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) contracts := blockchain.RskContracts{Bridge: bridge} @@ -270,7 +270,7 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { bridge := new(mocks.BridgeMock) btc := new(mocks.BtcRpcMock) lp := new(mocks.ProviderMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) caseHash := acceptPeginQuoteHash setup(&caseHash, quoteRepository, bridge, btc, lp, rsk) contracts := blockchain.RskContracts{Bridge: bridge} @@ -290,44 +290,44 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, - bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { derivation := blockchain.FlyoverDerivation{Address: test.AnyAddress, RedeemScript: "any script"} return []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock){ + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock){ func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() *quoteHash = "malformed hash" }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { caseQuote := testPeginQuote caseQuote.LbcAddress = "malformed address" quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&caseQuote, nil).Once() @@ -336,7 +336,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -344,7 +344,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe bridge.On("FetchFederationInfo").Return(blockchain.FederationInfo{}, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -353,7 +353,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -363,7 +363,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -375,7 +375,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() @@ -388,7 +388,7 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe lp.On("SignQuote", mock.Anything).Return("", nil).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, - btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RskRpcMock) { + btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go index 666ffe86..e860044e 100644 --- a/internal/usecases/pegin/call_for_user_test.go +++ b/internal/usecases/pegin/call_for_user_test.go @@ -64,7 +64,7 @@ func TestCallForUserUseCase_Run(t *testing.T) { quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -125,7 +125,7 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GetBalance", test.AnyCtx, lpRskAddress).Return(entities.NewWei(80000), nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} @@ -159,7 +159,7 @@ func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { lbc := new(mocks.LbcMock) btc := new(mocks.BtcRpcMock) eventBus := new(mocks.EventBusMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() @@ -176,7 +176,7 @@ func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { } } -func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { +func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { now := uint32(time.Now().Unix()) peginQuote := quote.PeginQuote{ FedBtcAddress: "fed address", @@ -200,19 +200,19 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine GasFee: entities.NewWei(500), ProductFeeAmount: 100, } - return []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock){ - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { + return []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock){ + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { caseRetainedQuote.State = quote.PeginStateCallForUserSucceeded }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(nil, assert.AnError).Once() }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ @@ -222,7 +222,7 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine }, nil).Once() lbc.On("GetBalance", mock.Anything).Return(nil, assert.AnError).Once() }, - func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RskRpcMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(&peginQuote, nil).Once() btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ @@ -262,7 +262,7 @@ func TestCallForUserUseCase_Run_NoConfirmations(t *testing.T) { quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -314,7 +314,7 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -359,7 +359,7 @@ func TestCallForUserUseCase_Run_QuoteNotFound(t *testing.T) { assert.Equal(t, quote.CallForUserCompletedEventId, event.Event.Id()) })).Return().Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -415,7 +415,7 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote). Return(nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -470,7 +470,7 @@ func TestCallForUserUseCase_Run_NoLiquidity(t *testing.T) { quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GetBalance", test.AnyCtx, lpRskAddress).Return(entities.NewWei(20000), nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} @@ -534,7 +534,7 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GetBalance", test.AnyCtx, lpRskAddress).Return(entities.NewWei(80000), nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} diff --git a/internal/usecases/pegin/get_pegin_quote_test.go b/internal/usecases/pegin/get_pegin_quote_test.go index 0c91ade9..c39c8fac 100644 --- a/internal/usecases/pegin/get_pegin_quote_test.go +++ b/internal/usecases/pegin/get_pegin_quote_test.go @@ -41,7 +41,7 @@ func TestGetQuoteUseCase_Run(t *testing.T) { q.CallOnRegister == false && q.GasFee.Cmp(entities.NewWei(10000)) == 0 && q.ProductFeeAmount == 0 }) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("EstimateGas", mock.Anything, userRskAddress, quoteValue, quoteData).Return(gasLimit, nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(100), nil) feeCollector := new(mocks.FeeCollectorMock) @@ -79,7 +79,7 @@ func TestGetQuoteUseCase_Run(t *testing.T) { } func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) lp := new(mocks.ProviderMock) lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) @@ -154,7 +154,7 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { setups := getQuoteUseCaseUnexpectedErrorSetups() for _, setup := range setups { - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) feeCollector := new(mocks.FeeCollectorMock) bridge := new(mocks.BridgeMock) lbc := new(mocks.LbcMock) @@ -181,32 +181,32 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func getQuoteUseCaseUnexpectedErrorSetups() []func( - rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock, ) { return []func( - rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock, ){ - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(nil, assert.AnError) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), assert.AnError) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) @@ -214,7 +214,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetFedAddress").Return("", assert.AnError) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) @@ -227,7 +227,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) @@ -241,7 +241,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( lp.On("RskAddress").Return("0x4b5b6b") lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) @@ -256,7 +256,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil).Once() @@ -264,7 +264,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(10), nil) }, - func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, peginQuoteRepository *mocks.PeginQuoteRepositoryMock) { rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index 0fa73230..56aa9a12 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -17,7 +17,7 @@ import ( ) func TestGetQuoteUseCase_Run(t *testing.T) { - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) feeCollector := new(mocks.FeeCollectorMock) @@ -62,7 +62,7 @@ func TestGetQuoteUseCase_Run(t *testing.T) { } func TestGetQuoteUseCase_Run_ValidateRequest(t *testing.T) { - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) feeCollector := new(mocks.FeeCollectorMock) bridge := new(mocks.BridgeMock) lbc := new(mocks.LbcMock) @@ -155,7 +155,7 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { ) feeCollectorAddress := "feeCollectorAddress" for _, testCase := range cases { - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) lp := new(mocks.ProviderMock) feeCollector := new(mocks.FeeCollectorMock) bridge := new(mocks.BridgeMock) @@ -187,17 +187,17 @@ func TestGetQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( - rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock, ), error] { return test.Table[func( - rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock, ), error]{ { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(0), assert.AnError) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) @@ -205,21 +205,21 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(0), assert.AnError) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(0), errors.New("Insufficient funds")) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError) @@ -228,7 +228,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) @@ -237,7 +237,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) @@ -247,7 +247,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) @@ -260,7 +260,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) @@ -282,7 +282,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) @@ -304,7 +304,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( }, }, { - Value: func(rsk *mocks.RskRpcMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, + Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) diff --git a/internal/usecases/pegout/init_deposits_cache_test.go b/internal/usecases/pegout/init_deposits_cache_test.go index d0463e76..9ce90850 100644 --- a/internal/usecases/pegout/init_deposits_cache_test.go +++ b/internal/usecases/pegout/init_deposits_cache_test.go @@ -17,7 +17,7 @@ import ( func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { lbc := new(mocks.LbcMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) pegoutRepository := new(mocks.PegoutQuoteRepositoryMock) height := uint64(10) rsk.On("GetHeight", context.Background()).Return(height, nil) @@ -52,20 +52,20 @@ func TestInitPegoutDepositCacheUseCase_Run(t *testing.T) { } func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { - cases := test.Table[func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock), error]{ + cases := test.Table[func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RootstockRpcServerMock), error]{ { - Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock) { + Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RootstockRpcServerMock) { rpc.On("GetHeight", context.Background()).Return(uint64(0), assert.AnError) }, }, { - Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock) { + Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RootstockRpcServerMock) { rpc.On("GetHeight", context.Background()).Return(uint64(10), nil) lbc.On("GetDepositEvents", context.Background(), mock.Anything, mock.Anything).Return(nil, assert.AnError) }, }, { - Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RskRpcMock) { + Value: func(lbc *mocks.LbcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock, rpc *mocks.RootstockRpcServerMock) { rpc.On("GetHeight", context.Background()).Return(uint64(10), nil) lbc.On("GetDepositEvents", context.Background(), uint64(5), mock.Anything).Return([]quote.PegoutDeposit{}, nil) quoteRepository.On("UpsertPegoutDeposits", context.Background(), mock.Anything).Return(assert.AnError) @@ -76,7 +76,7 @@ func TestInitPegoutDepositCacheUseCase_Run_ErrorHandling(t *testing.T) { for _, c := range cases { lbc := new(mocks.LbcMock) quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) c.Value(lbc, quoteRepository, rsk) contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk} diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go index e9123eea..1625861d 100644 --- a/internal/usecases/pegout/send_pegout_test.go +++ b/internal/usecases/pegout/send_pegout_test.go @@ -19,6 +19,11 @@ import ( var now = uint32(time.Now().Unix()) +const ( + blockHash = "0x6e6f6a" + blockNumber uint64 = 440 +) + var retainedQuote = quote.RetainedPegoutQuote{ QuoteHash: "e64215867af36cad04e8c2e3e8336618b358f68923529f2a1e5dbc6dd4af4df1", DepositAddress: "0x654321", @@ -59,7 +64,7 @@ func TestSendPegoutUseCase_Run(t *testing.T) { btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil).Once() quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return(btcTxHash, nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote @@ -73,19 +78,25 @@ func TestSendPegoutUseCase_Run(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: "0x5b5c5d", - BlockHash: "0x6e6f6a", - BlockNumber: 440, + BlockHash: blockHash, + BlockNumber: blockNumber, From: "0x1234", To: "0x5678", CumulativeGasUsed: big.NewInt(500), GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() + rsk.On("GetBlockByHash", test.AnyCtx, blockHash).Return(blockchain.BlockInfo{ + Hash: blockHash, + Number: blockNumber, + Timestamp: time.Unix(int64(now+10), 0), + Nonce: 1, + }, nil).Once() quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.LpBtcTxHash = btcTxHash updatedQuote.State = quote.PegoutStateSendPegoutSucceeded @@ -103,7 +114,7 @@ func TestSendPegoutUseCase_Run(t *testing.T) { mutex.AssertExpectations(t) } -func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { +func TestSendPegoutUseCase_Run_ShouldNotPublishRecoverableError(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock") mutex.On("Unlock") @@ -111,62 +122,83 @@ func TestSendPegoutUseCase_Run_NotPublishRecoverableError(t *testing.T) { eventBus := new(mocks.EventBusMock) eventBus.On("Publish") - recoverableSetups := []func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock){ - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + recoverableSetups := getRecoverableSetups() + + for _, setup := range recoverableSetups { + quoteRepository := new(mocks.PegoutQuoteRepositoryMock) + btcWallet := new(mocks.BtcWalletMock) + rsk := new(mocks.RootstockRpcServerMock) + caseQuote := retainedQuote + setup(&caseQuote, btcWallet, rsk, quoteRepository) + rpc := blockchain.Rpc{Rsk: rsk} + useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) + err := useCase.Run(context.Background(), caseQuote) + btcWallet.AssertExpectations(t) + rsk.AssertExpectations(t) + quoteRepository.AssertExpectations(t) + eventBus.AssertNotCalled(t, "Publish", mock.Anything) + require.Error(t, err) + } +} + +func getRecoverableSetups() []func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + return []func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock){ + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { retainedQuote.State = quote.PegoutStateWaitingForDeposit }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { retainedQuote.UserRskTxHash = "" }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(blockchain.TransactionReceipt{}, assert.AnError).Once() }, - func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RskRpcMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { + quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: "0x5b5c5d", + BlockHash: "0x6e6f6a", + BlockNumber: blockNumber, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + rsk.On("GetBlockByHash", test.AnyCtx, mock.Anything).Return(blockchain.BlockInfo{}, assert.AnError).Once() + }, + func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: "0x5b5c5d", BlockHash: "0x6e6f6a", - BlockNumber: 440, + BlockNumber: blockNumber, From: "0x1234", To: "0x5678", CumulativeGasUsed: big.NewInt(500), GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() + rsk.On("GetBlockByHash", test.AnyCtx, mock.Anything). + Return(blockchain.BlockInfo{Timestamp: time.Unix(int64(now), 0)}, nil).Once() btcWallet.On("GetBalance").Return(entities.NewWei(0), assert.AnError).Once() }, } - - for _, setup := range recoverableSetups { - quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - btcWallet := new(mocks.BtcWalletMock) - rsk := new(mocks.RskRpcMock) - caseQuote := retainedQuote - setup(&caseQuote, btcWallet, rsk, quoteRepository) - rpc := blockchain.Rpc{Rsk: rsk} - useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) - err := useCase.Run(context.Background(), caseQuote) - btcWallet.AssertExpectations(t) - rsk.AssertExpectations(t) - quoteRepository.AssertExpectations(t) - eventBus.AssertNotCalled(t, "Publish", mock.Anything) - require.Error(t, err) - } } func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { btcWallet := new(mocks.BtcWalletMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote @@ -181,7 +213,7 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, BlockHash: "0x6e6f6a", - BlockNumber: 440, + BlockNumber: blockNumber, From: "0x1234", To: "0x5678", CumulativeGasUsed: big.NewInt(500), @@ -210,7 +242,7 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { btcWallet := new(mocks.BtcWalletMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() @@ -240,7 +272,7 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { btcWallet := new(mocks.BtcWalletMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) expiredQuote := pegoutQuote @@ -258,6 +290,23 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { assert.Equal(t, expected, event.RetainedQuote) && assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + TransactionHash: "0x5b5c5d", + BlockHash: blockHash, + BlockNumber: blockNumber, + From: "0x1234", + To: "0x5678", + CumulativeGasUsed: big.NewInt(500), + GasUsed: big.NewInt(500), + Value: entities.NewWei(8500), + }, nil).Once() + rsk.On("GetBlockByHash", test.AnyCtx, blockHash).Return(blockchain.BlockInfo{ + Hash: blockHash, + Number: blockNumber, + Timestamp: time.Unix(int64(now+800), 0), + Nonce: 1, + }, nil).Once() rpc := blockchain.Rpc{Rsk: rsk} useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) @@ -273,18 +322,24 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { btcWallet := new(mocks.BtcWalletMock) btcWallet.On("GetBalance").Return(entities.NewWei(100), nil).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, - BlockHash: "0x6e6f6a", - BlockNumber: 440, + BlockHash: blockHash, + BlockNumber: blockNumber, From: "0x1234", To: "0x5678", CumulativeGasUsed: big.NewInt(500), GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() + rsk.On("GetBlockByHash", test.AnyCtx, blockHash).Return(blockchain.BlockInfo{ + Hash: blockHash, + Number: blockNumber, + Timestamp: time.Unix(int64(now+10), 0), + Nonce: 1, + }, nil).Once() eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() @@ -306,7 +361,7 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { btcWallet := new(mocks.BtcWalletMock) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) quoteRepository := new(mocks.PegoutQuoteRepositoryMock) @@ -339,7 +394,7 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil).Once() quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return("", assert.AnError).Once() - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote @@ -353,14 +408,20 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: "0x5b5c5d", - BlockHash: "0x6e6f6a", - BlockNumber: 440, + BlockHash: blockHash, + BlockNumber: blockNumber, From: "0x1234", To: "0x5678", CumulativeGasUsed: big.NewInt(500), GasUsed: big.NewInt(500), Value: entities.NewWei(8500), }, nil).Once() + rsk.On("GetBlockByHash", test.AnyCtx, blockHash).Return(blockchain.BlockInfo{ + Hash: blockHash, + Number: blockNumber, + Timestamp: time.Unix(int64(now+10), 0), + Nonce: 1, + }, nil).Once() quoteRepository := new(mocks.PegoutQuoteRepositoryMock) quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote @@ -385,20 +446,20 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { btcWallet.On("GetBalance").Return(entities.NewWei(10000), nil) quoteHash, _ := hex.DecodeString(retainedQuote.QuoteHash) btcWallet.On("SendWithOpReturn", retainedQuote.DepositAddress, pegoutQuote.Value, quoteHash).Return(btcTxHash, nil) - rsk := new(mocks.RskRpcMock) + rsk := new(mocks.RootstockRpcServerMock) mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil) rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ - TransactionHash: retainedQuote.UserRskTxHash, - BlockHash: "0x6e6f6a", - BlockNumber: 440, - From: "0x1234", - To: "0x5678", - CumulativeGasUsed: big.NewInt(500), - GasUsed: big.NewInt(500), - Value: entities.NewWei(8500), + TransactionHash: retainedQuote.UserRskTxHash, Value: entities.NewWei(8500), + BlockHash: blockHash, BlockNumber: blockNumber, + From: "0x1234", To: "0x5678", + CumulativeGasUsed: big.NewInt(500), GasUsed: big.NewInt(500), + }, nil) + rsk.On("GetBlockByHash", test.AnyCtx, blockHash).Return(blockchain.BlockInfo{ + Hash: blockHash, Number: blockNumber, + Timestamp: time.Unix(int64(now+10), 0), Nonce: 1, }, nil) setups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock){ diff --git a/test/mocks/client_adapter_mock.go b/test/mocks/client_adapter_mock.go new file mode 100644 index 00000000..783bb266 --- /dev/null +++ b/test/mocks/client_adapter_mock.go @@ -0,0 +1,1497 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + btcjson "github.com/btcsuite/btcd/btcjson" + btcclient "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + + btcutil "github.com/btcsuite/btcd/btcutil" + + chainhash "github.com/btcsuite/btcd/chaincfg/chainhash" + + mock "github.com/stretchr/testify/mock" + + rpcclient "github.com/btcsuite/btcd/rpcclient" + + wire "github.com/btcsuite/btcd/wire" +) + +// ClientAdapterMock is an autogenerated mock type for the ClientAdapter type +type ClientAdapterMock struct { + mock.Mock +} + +type ClientAdapterMock_Expecter struct { + mock *mock.Mock +} + +func (_m *ClientAdapterMock) EXPECT() *ClientAdapterMock_Expecter { + return &ClientAdapterMock_Expecter{mock: &_m.Mock} +} + +// CreateRawTransaction provides a mock function with given fields: inputs, amounts, lockTime +func (_m *ClientAdapterMock) CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) { + ret := _m.Called(inputs, amounts, lockTime) + + if len(ret) == 0 { + panic("no return value specified for CreateRawTransaction") + } + + var r0 *wire.MsgTx + var r1 error + if rf, ok := ret.Get(0).(func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) (*wire.MsgTx, error)); ok { + return rf(inputs, amounts, lockTime) + } + if rf, ok := ret.Get(0).(func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) *wire.MsgTx); ok { + r0 = rf(inputs, amounts, lockTime) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgTx) + } + } + + if rf, ok := ret.Get(1).(func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) error); ok { + r1 = rf(inputs, amounts, lockTime) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_CreateRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateRawTransaction' +type ClientAdapterMock_CreateRawTransaction_Call struct { + *mock.Call +} + +// CreateRawTransaction is a helper method to define mock.On call +// - inputs []btcjson.TransactionInput +// - amounts map[btcutil.Address]btcutil.Amount +// - lockTime *int64 +func (_e *ClientAdapterMock_Expecter) CreateRawTransaction(inputs interface{}, amounts interface{}, lockTime interface{}) *ClientAdapterMock_CreateRawTransaction_Call { + return &ClientAdapterMock_CreateRawTransaction_Call{Call: _e.mock.On("CreateRawTransaction", inputs, amounts, lockTime)} +} + +func (_c *ClientAdapterMock_CreateRawTransaction_Call) Run(run func(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64)) *ClientAdapterMock_CreateRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]btcjson.TransactionInput), args[1].(map[btcutil.Address]btcutil.Amount), args[2].(*int64)) + }) + return _c +} + +func (_c *ClientAdapterMock_CreateRawTransaction_Call) Return(_a0 *wire.MsgTx, _a1 error) *ClientAdapterMock_CreateRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_CreateRawTransaction_Call) RunAndReturn(run func([]btcjson.TransactionInput, map[btcutil.Address]btcutil.Amount, *int64) (*wire.MsgTx, error)) *ClientAdapterMock_CreateRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// CreateReadonlyWallet provides a mock function with given fields: bodyParams +func (_m *ClientAdapterMock) CreateReadonlyWallet(bodyParams btcclient.ReadonlyWalletRequest) error { + ret := _m.Called(bodyParams) + + if len(ret) == 0 { + panic("no return value specified for CreateReadonlyWallet") + } + + var r0 error + if rf, ok := ret.Get(0).(func(btcclient.ReadonlyWalletRequest) error); ok { + r0 = rf(bodyParams) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientAdapterMock_CreateReadonlyWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateReadonlyWallet' +type ClientAdapterMock_CreateReadonlyWallet_Call struct { + *mock.Call +} + +// CreateReadonlyWallet is a helper method to define mock.On call +// - bodyParams btcclient.ReadonlyWalletRequest +func (_e *ClientAdapterMock_Expecter) CreateReadonlyWallet(bodyParams interface{}) *ClientAdapterMock_CreateReadonlyWallet_Call { + return &ClientAdapterMock_CreateReadonlyWallet_Call{Call: _e.mock.On("CreateReadonlyWallet", bodyParams)} +} + +func (_c *ClientAdapterMock_CreateReadonlyWallet_Call) Run(run func(bodyParams btcclient.ReadonlyWalletRequest)) *ClientAdapterMock_CreateReadonlyWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(btcclient.ReadonlyWalletRequest)) + }) + return _c +} + +func (_c *ClientAdapterMock_CreateReadonlyWallet_Call) Return(_a0 error) *ClientAdapterMock_CreateReadonlyWallet_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_CreateReadonlyWallet_Call) RunAndReturn(run func(btcclient.ReadonlyWalletRequest) error) *ClientAdapterMock_CreateReadonlyWallet_Call { + _c.Call.Return(run) + return _c +} + +// CreateWallet provides a mock function with given fields: name, opts +func (_m *ClientAdapterMock) CreateWallet(name string, opts ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, name) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CreateWallet") + } + + var r0 *btcjson.CreateWalletResult + var r1 error + if rf, ok := ret.Get(0).(func(string, ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error)); ok { + return rf(name, opts...) + } + if rf, ok := ret.Get(0).(func(string, ...rpcclient.CreateWalletOpt) *btcjson.CreateWalletResult); ok { + r0 = rf(name, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.CreateWalletResult) + } + } + + if rf, ok := ret.Get(1).(func(string, ...rpcclient.CreateWalletOpt) error); ok { + r1 = rf(name, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_CreateWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateWallet' +type ClientAdapterMock_CreateWallet_Call struct { + *mock.Call +} + +// CreateWallet is a helper method to define mock.On call +// - name string +// - opts ...rpcclient.CreateWalletOpt +func (_e *ClientAdapterMock_Expecter) CreateWallet(name interface{}, opts ...interface{}) *ClientAdapterMock_CreateWallet_Call { + return &ClientAdapterMock_CreateWallet_Call{Call: _e.mock.On("CreateWallet", + append([]interface{}{name}, opts...)...)} +} + +func (_c *ClientAdapterMock_CreateWallet_Call) Run(run func(name string, opts ...rpcclient.CreateWalletOpt)) *ClientAdapterMock_CreateWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]rpcclient.CreateWalletOpt, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(rpcclient.CreateWalletOpt) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *ClientAdapterMock_CreateWallet_Call) Return(_a0 *btcjson.CreateWalletResult, _a1 error) *ClientAdapterMock_CreateWallet_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_CreateWallet_Call) RunAndReturn(run func(string, ...rpcclient.CreateWalletOpt) (*btcjson.CreateWalletResult, error)) *ClientAdapterMock_CreateWallet_Call { + _c.Call.Return(run) + return _c +} + +// Disconnect provides a mock function with given fields: +func (_m *ClientAdapterMock) Disconnect() { + _m.Called() +} + +// ClientAdapterMock_Disconnect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Disconnect' +type ClientAdapterMock_Disconnect_Call struct { + *mock.Call +} + +// Disconnect is a helper method to define mock.On call +func (_e *ClientAdapterMock_Expecter) Disconnect() *ClientAdapterMock_Disconnect_Call { + return &ClientAdapterMock_Disconnect_Call{Call: _e.mock.On("Disconnect")} +} + +func (_c *ClientAdapterMock_Disconnect_Call) Run(run func()) *ClientAdapterMock_Disconnect_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ClientAdapterMock_Disconnect_Call) Return() *ClientAdapterMock_Disconnect_Call { + _c.Call.Return() + return _c +} + +func (_c *ClientAdapterMock_Disconnect_Call) RunAndReturn(run func()) *ClientAdapterMock_Disconnect_Call { + _c.Call.Return(run) + return _c +} + +// EstimateSmartFee provides a mock function with given fields: confTarget, mode +func (_m *ClientAdapterMock) EstimateSmartFee(confTarget int64, mode *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error) { + ret := _m.Called(confTarget, mode) + + if len(ret) == 0 { + panic("no return value specified for EstimateSmartFee") + } + + var r0 *btcjson.EstimateSmartFeeResult + var r1 error + if rf, ok := ret.Get(0).(func(int64, *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error)); ok { + return rf(confTarget, mode) + } + if rf, ok := ret.Get(0).(func(int64, *btcjson.EstimateSmartFeeMode) *btcjson.EstimateSmartFeeResult); ok { + r0 = rf(confTarget, mode) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.EstimateSmartFeeResult) + } + } + + if rf, ok := ret.Get(1).(func(int64, *btcjson.EstimateSmartFeeMode) error); ok { + r1 = rf(confTarget, mode) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_EstimateSmartFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateSmartFee' +type ClientAdapterMock_EstimateSmartFee_Call struct { + *mock.Call +} + +// EstimateSmartFee is a helper method to define mock.On call +// - confTarget int64 +// - mode *btcjson.EstimateSmartFeeMode +func (_e *ClientAdapterMock_Expecter) EstimateSmartFee(confTarget interface{}, mode interface{}) *ClientAdapterMock_EstimateSmartFee_Call { + return &ClientAdapterMock_EstimateSmartFee_Call{Call: _e.mock.On("EstimateSmartFee", confTarget, mode)} +} + +func (_c *ClientAdapterMock_EstimateSmartFee_Call) Run(run func(confTarget int64, mode *btcjson.EstimateSmartFeeMode)) *ClientAdapterMock_EstimateSmartFee_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int64), args[1].(*btcjson.EstimateSmartFeeMode)) + }) + return _c +} + +func (_c *ClientAdapterMock_EstimateSmartFee_Call) Return(_a0 *btcjson.EstimateSmartFeeResult, _a1 error) *ClientAdapterMock_EstimateSmartFee_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_EstimateSmartFee_Call) RunAndReturn(run func(int64, *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error)) *ClientAdapterMock_EstimateSmartFee_Call { + _c.Call.Return(run) + return _c +} + +// FundRawTransaction provides a mock function with given fields: tx, opts, isWitness +func (_m *ClientAdapterMock) FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) { + ret := _m.Called(tx, opts, isWitness) + + if len(ret) == 0 { + panic("no return value specified for FundRawTransaction") + } + + var r0 *btcjson.FundRawTransactionResult + var r1 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) (*btcjson.FundRawTransactionResult, error)); ok { + return rf(tx, opts, isWitness) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) *btcjson.FundRawTransactionResult); ok { + r0 = rf(tx, opts, isWitness) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.FundRawTransactionResult) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) error); ok { + r1 = rf(tx, opts, isWitness) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_FundRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FundRawTransaction' +type ClientAdapterMock_FundRawTransaction_Call struct { + *mock.Call +} + +// FundRawTransaction is a helper method to define mock.On call +// - tx *wire.MsgTx +// - opts btcjson.FundRawTransactionOpts +// - isWitness *bool +func (_e *ClientAdapterMock_Expecter) FundRawTransaction(tx interface{}, opts interface{}, isWitness interface{}) *ClientAdapterMock_FundRawTransaction_Call { + return &ClientAdapterMock_FundRawTransaction_Call{Call: _e.mock.On("FundRawTransaction", tx, opts, isWitness)} +} + +func (_c *ClientAdapterMock_FundRawTransaction_Call) Run(run func(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool)) *ClientAdapterMock_FundRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx), args[1].(btcjson.FundRawTransactionOpts), args[2].(*bool)) + }) + return _c +} + +func (_c *ClientAdapterMock_FundRawTransaction_Call) Return(_a0 *btcjson.FundRawTransactionResult, _a1 error) *ClientAdapterMock_FundRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_FundRawTransaction_Call) RunAndReturn(run func(*wire.MsgTx, btcjson.FundRawTransactionOpts, *bool) (*btcjson.FundRawTransactionResult, error)) *ClientAdapterMock_FundRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// GetAddressInfo provides a mock function with given fields: address +func (_m *ClientAdapterMock) GetAddressInfo(address string) (*btcjson.GetAddressInfoResult, error) { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for GetAddressInfo") + } + + var r0 *btcjson.GetAddressInfoResult + var r1 error + if rf, ok := ret.Get(0).(func(string) (*btcjson.GetAddressInfoResult, error)); ok { + return rf(address) + } + if rf, ok := ret.Get(0).(func(string) *btcjson.GetAddressInfoResult); ok { + r0 = rf(address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetAddressInfoResult) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetAddressInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAddressInfo' +type ClientAdapterMock_GetAddressInfo_Call struct { + *mock.Call +} + +// GetAddressInfo is a helper method to define mock.On call +// - address string +func (_e *ClientAdapterMock_Expecter) GetAddressInfo(address interface{}) *ClientAdapterMock_GetAddressInfo_Call { + return &ClientAdapterMock_GetAddressInfo_Call{Call: _e.mock.On("GetAddressInfo", address)} +} + +func (_c *ClientAdapterMock_GetAddressInfo_Call) Run(run func(address string)) *ClientAdapterMock_GetAddressInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ClientAdapterMock_GetAddressInfo_Call) Return(_a0 *btcjson.GetAddressInfoResult, _a1 error) *ClientAdapterMock_GetAddressInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetAddressInfo_Call) RunAndReturn(run func(string) (*btcjson.GetAddressInfoResult, error)) *ClientAdapterMock_GetAddressInfo_Call { + _c.Call.Return(run) + return _c +} + +// GetBlock provides a mock function with given fields: blockHash +func (_m *ClientAdapterMock) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) { + ret := _m.Called(blockHash) + + if len(ret) == 0 { + panic("no return value specified for GetBlock") + } + + var r0 *wire.MsgBlock + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*wire.MsgBlock, error)); ok { + return rf(blockHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *wire.MsgBlock); ok { + r0 = rf(blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgBlock) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlock' +type ClientAdapterMock_GetBlock_Call struct { + *mock.Call +} + +// GetBlock is a helper method to define mock.On call +// - blockHash *chainhash.Hash +func (_e *ClientAdapterMock_Expecter) GetBlock(blockHash interface{}) *ClientAdapterMock_GetBlock_Call { + return &ClientAdapterMock_GetBlock_Call{Call: _e.mock.On("GetBlock", blockHash)} +} + +func (_c *ClientAdapterMock_GetBlock_Call) Run(run func(blockHash *chainhash.Hash)) *ClientAdapterMock_GetBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *ClientAdapterMock_GetBlock_Call) Return(_a0 *wire.MsgBlock, _a1 error) *ClientAdapterMock_GetBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetBlock_Call) RunAndReturn(run func(*chainhash.Hash) (*wire.MsgBlock, error)) *ClientAdapterMock_GetBlock_Call { + _c.Call.Return(run) + return _c +} + +// GetBlockChainInfo provides a mock function with given fields: +func (_m *ClientAdapterMock) GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetBlockChainInfo") + } + + var r0 *btcjson.GetBlockChainInfoResult + var r1 error + if rf, ok := ret.Get(0).(func() (*btcjson.GetBlockChainInfoResult, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *btcjson.GetBlockChainInfoResult); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetBlockChainInfoResult) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetBlockChainInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockChainInfo' +type ClientAdapterMock_GetBlockChainInfo_Call struct { + *mock.Call +} + +// GetBlockChainInfo is a helper method to define mock.On call +func (_e *ClientAdapterMock_Expecter) GetBlockChainInfo() *ClientAdapterMock_GetBlockChainInfo_Call { + return &ClientAdapterMock_GetBlockChainInfo_Call{Call: _e.mock.On("GetBlockChainInfo")} +} + +func (_c *ClientAdapterMock_GetBlockChainInfo_Call) Run(run func()) *ClientAdapterMock_GetBlockChainInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ClientAdapterMock_GetBlockChainInfo_Call) Return(_a0 *btcjson.GetBlockChainInfoResult, _a1 error) *ClientAdapterMock_GetBlockChainInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetBlockChainInfo_Call) RunAndReturn(run func() (*btcjson.GetBlockChainInfoResult, error)) *ClientAdapterMock_GetBlockChainInfo_Call { + _c.Call.Return(run) + return _c +} + +// GetBlockVerbose provides a mock function with given fields: blockHash +func (_m *ClientAdapterMock) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) { + ret := _m.Called(blockHash) + + if len(ret) == 0 { + panic("no return value specified for GetBlockVerbose") + } + + var r0 *btcjson.GetBlockVerboseResult + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcjson.GetBlockVerboseResult, error)); ok { + return rf(blockHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcjson.GetBlockVerboseResult); ok { + r0 = rf(blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetBlockVerboseResult) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetBlockVerbose_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockVerbose' +type ClientAdapterMock_GetBlockVerbose_Call struct { + *mock.Call +} + +// GetBlockVerbose is a helper method to define mock.On call +// - blockHash *chainhash.Hash +func (_e *ClientAdapterMock_Expecter) GetBlockVerbose(blockHash interface{}) *ClientAdapterMock_GetBlockVerbose_Call { + return &ClientAdapterMock_GetBlockVerbose_Call{Call: _e.mock.On("GetBlockVerbose", blockHash)} +} + +func (_c *ClientAdapterMock_GetBlockVerbose_Call) Run(run func(blockHash *chainhash.Hash)) *ClientAdapterMock_GetBlockVerbose_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *ClientAdapterMock_GetBlockVerbose_Call) Return(_a0 *btcjson.GetBlockVerboseResult, _a1 error) *ClientAdapterMock_GetBlockVerbose_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetBlockVerbose_Call) RunAndReturn(run func(*chainhash.Hash) (*btcjson.GetBlockVerboseResult, error)) *ClientAdapterMock_GetBlockVerbose_Call { + _c.Call.Return(run) + return _c +} + +// GetRawTransaction provides a mock function with given fields: txHash +func (_m *ClientAdapterMock) GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) { + ret := _m.Called(txHash) + + if len(ret) == 0 { + panic("no return value specified for GetRawTransaction") + } + + var r0 *btcutil.Tx + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcutil.Tx, error)); ok { + return rf(txHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcutil.Tx); ok { + r0 = rf(txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcutil.Tx) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRawTransaction' +type ClientAdapterMock_GetRawTransaction_Call struct { + *mock.Call +} + +// GetRawTransaction is a helper method to define mock.On call +// - txHash *chainhash.Hash +func (_e *ClientAdapterMock_Expecter) GetRawTransaction(txHash interface{}) *ClientAdapterMock_GetRawTransaction_Call { + return &ClientAdapterMock_GetRawTransaction_Call{Call: _e.mock.On("GetRawTransaction", txHash)} +} + +func (_c *ClientAdapterMock_GetRawTransaction_Call) Run(run func(txHash *chainhash.Hash)) *ClientAdapterMock_GetRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *ClientAdapterMock_GetRawTransaction_Call) Return(_a0 *btcutil.Tx, _a1 error) *ClientAdapterMock_GetRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetRawTransaction_Call) RunAndReturn(run func(*chainhash.Hash) (*btcutil.Tx, error)) *ClientAdapterMock_GetRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// GetRawTransactionVerbose provides a mock function with given fields: txHash +func (_m *ClientAdapterMock) GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRawResult, error) { + ret := _m.Called(txHash) + + if len(ret) == 0 { + panic("no return value specified for GetRawTransactionVerbose") + } + + var r0 *btcjson.TxRawResult + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcjson.TxRawResult, error)); ok { + return rf(txHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcjson.TxRawResult); ok { + r0 = rf(txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.TxRawResult) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetRawTransactionVerbose_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRawTransactionVerbose' +type ClientAdapterMock_GetRawTransactionVerbose_Call struct { + *mock.Call +} + +// GetRawTransactionVerbose is a helper method to define mock.On call +// - txHash *chainhash.Hash +func (_e *ClientAdapterMock_Expecter) GetRawTransactionVerbose(txHash interface{}) *ClientAdapterMock_GetRawTransactionVerbose_Call { + return &ClientAdapterMock_GetRawTransactionVerbose_Call{Call: _e.mock.On("GetRawTransactionVerbose", txHash)} +} + +func (_c *ClientAdapterMock_GetRawTransactionVerbose_Call) Run(run func(txHash *chainhash.Hash)) *ClientAdapterMock_GetRawTransactionVerbose_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *ClientAdapterMock_GetRawTransactionVerbose_Call) Return(_a0 *btcjson.TxRawResult, _a1 error) *ClientAdapterMock_GetRawTransactionVerbose_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetRawTransactionVerbose_Call) RunAndReturn(run func(*chainhash.Hash) (*btcjson.TxRawResult, error)) *ClientAdapterMock_GetRawTransactionVerbose_Call { + _c.Call.Return(run) + return _c +} + +// GetTransaction provides a mock function with given fields: txHash +func (_m *ClientAdapterMock) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) { + ret := _m.Called(txHash) + + if len(ret) == 0 { + panic("no return value specified for GetTransaction") + } + + var r0 *btcjson.GetTransactionResult + var r1 error + if rf, ok := ret.Get(0).(func(*chainhash.Hash) (*btcjson.GetTransactionResult, error)); ok { + return rf(txHash) + } + if rf, ok := ret.Get(0).(func(*chainhash.Hash) *btcjson.GetTransactionResult); ok { + r0 = rf(txHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetTransactionResult) + } + } + + if rf, ok := ret.Get(1).(func(*chainhash.Hash) error); ok { + r1 = rf(txHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransaction' +type ClientAdapterMock_GetTransaction_Call struct { + *mock.Call +} + +// GetTransaction is a helper method to define mock.On call +// - txHash *chainhash.Hash +func (_e *ClientAdapterMock_Expecter) GetTransaction(txHash interface{}) *ClientAdapterMock_GetTransaction_Call { + return &ClientAdapterMock_GetTransaction_Call{Call: _e.mock.On("GetTransaction", txHash)} +} + +func (_c *ClientAdapterMock_GetTransaction_Call) Run(run func(txHash *chainhash.Hash)) *ClientAdapterMock_GetTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*chainhash.Hash)) + }) + return _c +} + +func (_c *ClientAdapterMock_GetTransaction_Call) Return(_a0 *btcjson.GetTransactionResult, _a1 error) *ClientAdapterMock_GetTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetTransaction_Call) RunAndReturn(run func(*chainhash.Hash) (*btcjson.GetTransactionResult, error)) *ClientAdapterMock_GetTransaction_Call { + _c.Call.Return(run) + return _c +} + +// GetWalletInfo provides a mock function with given fields: +func (_m *ClientAdapterMock) GetWalletInfo() (*btcjson.GetWalletInfoResult, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetWalletInfo") + } + + var r0 *btcjson.GetWalletInfoResult + var r1 error + if rf, ok := ret.Get(0).(func() (*btcjson.GetWalletInfoResult, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *btcjson.GetWalletInfoResult); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.GetWalletInfoResult) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_GetWalletInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWalletInfo' +type ClientAdapterMock_GetWalletInfo_Call struct { + *mock.Call +} + +// GetWalletInfo is a helper method to define mock.On call +func (_e *ClientAdapterMock_Expecter) GetWalletInfo() *ClientAdapterMock_GetWalletInfo_Call { + return &ClientAdapterMock_GetWalletInfo_Call{Call: _e.mock.On("GetWalletInfo")} +} + +func (_c *ClientAdapterMock_GetWalletInfo_Call) Run(run func()) *ClientAdapterMock_GetWalletInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ClientAdapterMock_GetWalletInfo_Call) Return(_a0 *btcjson.GetWalletInfoResult, _a1 error) *ClientAdapterMock_GetWalletInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_GetWalletInfo_Call) RunAndReturn(run func() (*btcjson.GetWalletInfoResult, error)) *ClientAdapterMock_GetWalletInfo_Call { + _c.Call.Return(run) + return _c +} + +// ImportAddressRescan provides a mock function with given fields: address, account, rescan +func (_m *ClientAdapterMock) ImportAddressRescan(address string, account string, rescan bool) error { + ret := _m.Called(address, account, rescan) + + if len(ret) == 0 { + panic("no return value specified for ImportAddressRescan") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, bool) error); ok { + r0 = rf(address, account, rescan) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientAdapterMock_ImportAddressRescan_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportAddressRescan' +type ClientAdapterMock_ImportAddressRescan_Call struct { + *mock.Call +} + +// ImportAddressRescan is a helper method to define mock.On call +// - address string +// - account string +// - rescan bool +func (_e *ClientAdapterMock_Expecter) ImportAddressRescan(address interface{}, account interface{}, rescan interface{}) *ClientAdapterMock_ImportAddressRescan_Call { + return &ClientAdapterMock_ImportAddressRescan_Call{Call: _e.mock.On("ImportAddressRescan", address, account, rescan)} +} + +func (_c *ClientAdapterMock_ImportAddressRescan_Call) Run(run func(address string, account string, rescan bool)) *ClientAdapterMock_ImportAddressRescan_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(string), args[2].(bool)) + }) + return _c +} + +func (_c *ClientAdapterMock_ImportAddressRescan_Call) Return(_a0 error) *ClientAdapterMock_ImportAddressRescan_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_ImportAddressRescan_Call) RunAndReturn(run func(string, string, bool) error) *ClientAdapterMock_ImportAddressRescan_Call { + _c.Call.Return(run) + return _c +} + +// ImportPubKey provides a mock function with given fields: pubKey +func (_m *ClientAdapterMock) ImportPubKey(pubKey string) error { + ret := _m.Called(pubKey) + + if len(ret) == 0 { + panic("no return value specified for ImportPubKey") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(pubKey) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientAdapterMock_ImportPubKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportPubKey' +type ClientAdapterMock_ImportPubKey_Call struct { + *mock.Call +} + +// ImportPubKey is a helper method to define mock.On call +// - pubKey string +func (_e *ClientAdapterMock_Expecter) ImportPubKey(pubKey interface{}) *ClientAdapterMock_ImportPubKey_Call { + return &ClientAdapterMock_ImportPubKey_Call{Call: _e.mock.On("ImportPubKey", pubKey)} +} + +func (_c *ClientAdapterMock_ImportPubKey_Call) Run(run func(pubKey string)) *ClientAdapterMock_ImportPubKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ClientAdapterMock_ImportPubKey_Call) Return(_a0 error) *ClientAdapterMock_ImportPubKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_ImportPubKey_Call) RunAndReturn(run func(string) error) *ClientAdapterMock_ImportPubKey_Call { + _c.Call.Return(run) + return _c +} + +// ImportPubKeyRescan provides a mock function with given fields: pubKey, rescan +func (_m *ClientAdapterMock) ImportPubKeyRescan(pubKey string, rescan bool) error { + ret := _m.Called(pubKey, rescan) + + if len(ret) == 0 { + panic("no return value specified for ImportPubKeyRescan") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, bool) error); ok { + r0 = rf(pubKey, rescan) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientAdapterMock_ImportPubKeyRescan_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportPubKeyRescan' +type ClientAdapterMock_ImportPubKeyRescan_Call struct { + *mock.Call +} + +// ImportPubKeyRescan is a helper method to define mock.On call +// - pubKey string +// - rescan bool +func (_e *ClientAdapterMock_Expecter) ImportPubKeyRescan(pubKey interface{}, rescan interface{}) *ClientAdapterMock_ImportPubKeyRescan_Call { + return &ClientAdapterMock_ImportPubKeyRescan_Call{Call: _e.mock.On("ImportPubKeyRescan", pubKey, rescan)} +} + +func (_c *ClientAdapterMock_ImportPubKeyRescan_Call) Run(run func(pubKey string, rescan bool)) *ClientAdapterMock_ImportPubKeyRescan_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(bool)) + }) + return _c +} + +func (_c *ClientAdapterMock_ImportPubKeyRescan_Call) Return(_a0 error) *ClientAdapterMock_ImportPubKeyRescan_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_ImportPubKeyRescan_Call) RunAndReturn(run func(string, bool) error) *ClientAdapterMock_ImportPubKeyRescan_Call { + _c.Call.Return(run) + return _c +} + +// ListUnspent provides a mock function with given fields: +func (_m *ClientAdapterMock) ListUnspent() ([]btcjson.ListUnspentResult, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ListUnspent") + } + + var r0 []btcjson.ListUnspentResult + var r1 error + if rf, ok := ret.Get(0).(func() ([]btcjson.ListUnspentResult, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() []btcjson.ListUnspentResult); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]btcjson.ListUnspentResult) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_ListUnspent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListUnspent' +type ClientAdapterMock_ListUnspent_Call struct { + *mock.Call +} + +// ListUnspent is a helper method to define mock.On call +func (_e *ClientAdapterMock_Expecter) ListUnspent() *ClientAdapterMock_ListUnspent_Call { + return &ClientAdapterMock_ListUnspent_Call{Call: _e.mock.On("ListUnspent")} +} + +func (_c *ClientAdapterMock_ListUnspent_Call) Run(run func()) *ClientAdapterMock_ListUnspent_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ClientAdapterMock_ListUnspent_Call) Return(_a0 []btcjson.ListUnspentResult, _a1 error) *ClientAdapterMock_ListUnspent_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_ListUnspent_Call) RunAndReturn(run func() ([]btcjson.ListUnspentResult, error)) *ClientAdapterMock_ListUnspent_Call { + _c.Call.Return(run) + return _c +} + +// ListUnspentMinMaxAddresses provides a mock function with given fields: minConf, maxConf, addrs +func (_m *ClientAdapterMock) ListUnspentMinMaxAddresses(minConf int, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) { + ret := _m.Called(minConf, maxConf, addrs) + + if len(ret) == 0 { + panic("no return value specified for ListUnspentMinMaxAddresses") + } + + var r0 []btcjson.ListUnspentResult + var r1 error + if rf, ok := ret.Get(0).(func(int, int, []btcutil.Address) ([]btcjson.ListUnspentResult, error)); ok { + return rf(minConf, maxConf, addrs) + } + if rf, ok := ret.Get(0).(func(int, int, []btcutil.Address) []btcjson.ListUnspentResult); ok { + r0 = rf(minConf, maxConf, addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]btcjson.ListUnspentResult) + } + } + + if rf, ok := ret.Get(1).(func(int, int, []btcutil.Address) error); ok { + r1 = rf(minConf, maxConf, addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_ListUnspentMinMaxAddresses_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListUnspentMinMaxAddresses' +type ClientAdapterMock_ListUnspentMinMaxAddresses_Call struct { + *mock.Call +} + +// ListUnspentMinMaxAddresses is a helper method to define mock.On call +// - minConf int +// - maxConf int +// - addrs []btcutil.Address +func (_e *ClientAdapterMock_Expecter) ListUnspentMinMaxAddresses(minConf interface{}, maxConf interface{}, addrs interface{}) *ClientAdapterMock_ListUnspentMinMaxAddresses_Call { + return &ClientAdapterMock_ListUnspentMinMaxAddresses_Call{Call: _e.mock.On("ListUnspentMinMaxAddresses", minConf, maxConf, addrs)} +} + +func (_c *ClientAdapterMock_ListUnspentMinMaxAddresses_Call) Run(run func(minConf int, maxConf int, addrs []btcutil.Address)) *ClientAdapterMock_ListUnspentMinMaxAddresses_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int), args[1].(int), args[2].([]btcutil.Address)) + }) + return _c +} + +func (_c *ClientAdapterMock_ListUnspentMinMaxAddresses_Call) Return(_a0 []btcjson.ListUnspentResult, _a1 error) *ClientAdapterMock_ListUnspentMinMaxAddresses_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_ListUnspentMinMaxAddresses_Call) RunAndReturn(run func(int, int, []btcutil.Address) ([]btcjson.ListUnspentResult, error)) *ClientAdapterMock_ListUnspentMinMaxAddresses_Call { + _c.Call.Return(run) + return _c +} + +// LoadWallet provides a mock function with given fields: walletName +func (_m *ClientAdapterMock) LoadWallet(walletName string) (*btcjson.LoadWalletResult, error) { + ret := _m.Called(walletName) + + if len(ret) == 0 { + panic("no return value specified for LoadWallet") + } + + var r0 *btcjson.LoadWalletResult + var r1 error + if rf, ok := ret.Get(0).(func(string) (*btcjson.LoadWalletResult, error)); ok { + return rf(walletName) + } + if rf, ok := ret.Get(0).(func(string) *btcjson.LoadWalletResult); ok { + r0 = rf(walletName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.LoadWalletResult) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(walletName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_LoadWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LoadWallet' +type ClientAdapterMock_LoadWallet_Call struct { + *mock.Call +} + +// LoadWallet is a helper method to define mock.On call +// - walletName string +func (_e *ClientAdapterMock_Expecter) LoadWallet(walletName interface{}) *ClientAdapterMock_LoadWallet_Call { + return &ClientAdapterMock_LoadWallet_Call{Call: _e.mock.On("LoadWallet", walletName)} +} + +func (_c *ClientAdapterMock_LoadWallet_Call) Run(run func(walletName string)) *ClientAdapterMock_LoadWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ClientAdapterMock_LoadWallet_Call) Return(_a0 *btcjson.LoadWalletResult, _a1 error) *ClientAdapterMock_LoadWallet_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_LoadWallet_Call) RunAndReturn(run func(string) (*btcjson.LoadWalletResult, error)) *ClientAdapterMock_LoadWallet_Call { + _c.Call.Return(run) + return _c +} + +// Ping provides a mock function with given fields: +func (_m *ClientAdapterMock) Ping() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Ping") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientAdapterMock_Ping_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ping' +type ClientAdapterMock_Ping_Call struct { + *mock.Call +} + +// Ping is a helper method to define mock.On call +func (_e *ClientAdapterMock_Expecter) Ping() *ClientAdapterMock_Ping_Call { + return &ClientAdapterMock_Ping_Call{Call: _e.mock.On("Ping")} +} + +func (_c *ClientAdapterMock_Ping_Call) Run(run func()) *ClientAdapterMock_Ping_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ClientAdapterMock_Ping_Call) Return(_a0 error) *ClientAdapterMock_Ping_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_Ping_Call) RunAndReturn(run func() error) *ClientAdapterMock_Ping_Call { + _c.Call.Return(run) + return _c +} + +// SendRawTransaction provides a mock function with given fields: tx, allowHighFees +func (_m *ClientAdapterMock) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) { + ret := _m.Called(tx, allowHighFees) + + if len(ret) == 0 { + panic("no return value specified for SendRawTransaction") + } + + var r0 *chainhash.Hash + var r1 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx, bool) (*chainhash.Hash, error)); ok { + return rf(tx, allowHighFees) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx, bool) *chainhash.Hash); ok { + r0 = rf(tx, allowHighFees) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*chainhash.Hash) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx, bool) error); ok { + r1 = rf(tx, allowHighFees) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_SendRawTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendRawTransaction' +type ClientAdapterMock_SendRawTransaction_Call struct { + *mock.Call +} + +// SendRawTransaction is a helper method to define mock.On call +// - tx *wire.MsgTx +// - allowHighFees bool +func (_e *ClientAdapterMock_Expecter) SendRawTransaction(tx interface{}, allowHighFees interface{}) *ClientAdapterMock_SendRawTransaction_Call { + return &ClientAdapterMock_SendRawTransaction_Call{Call: _e.mock.On("SendRawTransaction", tx, allowHighFees)} +} + +func (_c *ClientAdapterMock_SendRawTransaction_Call) Run(run func(tx *wire.MsgTx, allowHighFees bool)) *ClientAdapterMock_SendRawTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx), args[1].(bool)) + }) + return _c +} + +func (_c *ClientAdapterMock_SendRawTransaction_Call) Return(_a0 *chainhash.Hash, _a1 error) *ClientAdapterMock_SendRawTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_SendRawTransaction_Call) RunAndReturn(run func(*wire.MsgTx, bool) (*chainhash.Hash, error)) *ClientAdapterMock_SendRawTransaction_Call { + _c.Call.Return(run) + return _c +} + +// SignRawTransactionWithKey provides a mock function with given fields: tx, privateKeysWIFs +func (_m *ClientAdapterMock) SignRawTransactionWithKey(tx *wire.MsgTx, privateKeysWIFs []string) (*wire.MsgTx, bool, error) { + ret := _m.Called(tx, privateKeysWIFs) + + if len(ret) == 0 { + panic("no return value specified for SignRawTransactionWithKey") + } + + var r0 *wire.MsgTx + var r1 bool + var r2 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx, []string) (*wire.MsgTx, bool, error)); ok { + return rf(tx, privateKeysWIFs) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx, []string) *wire.MsgTx); ok { + r0 = rf(tx, privateKeysWIFs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgTx) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx, []string) bool); ok { + r1 = rf(tx, privateKeysWIFs) + } else { + r1 = ret.Get(1).(bool) + } + + if rf, ok := ret.Get(2).(func(*wire.MsgTx, []string) error); ok { + r2 = rf(tx, privateKeysWIFs) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// ClientAdapterMock_SignRawTransactionWithKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SignRawTransactionWithKey' +type ClientAdapterMock_SignRawTransactionWithKey_Call struct { + *mock.Call +} + +// SignRawTransactionWithKey is a helper method to define mock.On call +// - tx *wire.MsgTx +// - privateKeysWIFs []string +func (_e *ClientAdapterMock_Expecter) SignRawTransactionWithKey(tx interface{}, privateKeysWIFs interface{}) *ClientAdapterMock_SignRawTransactionWithKey_Call { + return &ClientAdapterMock_SignRawTransactionWithKey_Call{Call: _e.mock.On("SignRawTransactionWithKey", tx, privateKeysWIFs)} +} + +func (_c *ClientAdapterMock_SignRawTransactionWithKey_Call) Run(run func(tx *wire.MsgTx, privateKeysWIFs []string)) *ClientAdapterMock_SignRawTransactionWithKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx), args[1].([]string)) + }) + return _c +} + +func (_c *ClientAdapterMock_SignRawTransactionWithKey_Call) Return(_a0 *wire.MsgTx, _a1 bool, _a2 error) *ClientAdapterMock_SignRawTransactionWithKey_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *ClientAdapterMock_SignRawTransactionWithKey_Call) RunAndReturn(run func(*wire.MsgTx, []string) (*wire.MsgTx, bool, error)) *ClientAdapterMock_SignRawTransactionWithKey_Call { + _c.Call.Return(run) + return _c +} + +// SignRawTransactionWithWallet provides a mock function with given fields: tx +func (_m *ClientAdapterMock) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) { + ret := _m.Called(tx) + + if len(ret) == 0 { + panic("no return value specified for SignRawTransactionWithWallet") + } + + var r0 *wire.MsgTx + var r1 bool + var r2 error + if rf, ok := ret.Get(0).(func(*wire.MsgTx) (*wire.MsgTx, bool, error)); ok { + return rf(tx) + } + if rf, ok := ret.Get(0).(func(*wire.MsgTx) *wire.MsgTx); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*wire.MsgTx) + } + } + + if rf, ok := ret.Get(1).(func(*wire.MsgTx) bool); ok { + r1 = rf(tx) + } else { + r1 = ret.Get(1).(bool) + } + + if rf, ok := ret.Get(2).(func(*wire.MsgTx) error); ok { + r2 = rf(tx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// ClientAdapterMock_SignRawTransactionWithWallet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SignRawTransactionWithWallet' +type ClientAdapterMock_SignRawTransactionWithWallet_Call struct { + *mock.Call +} + +// SignRawTransactionWithWallet is a helper method to define mock.On call +// - tx *wire.MsgTx +func (_e *ClientAdapterMock_Expecter) SignRawTransactionWithWallet(tx interface{}) *ClientAdapterMock_SignRawTransactionWithWallet_Call { + return &ClientAdapterMock_SignRawTransactionWithWallet_Call{Call: _e.mock.On("SignRawTransactionWithWallet", tx)} +} + +func (_c *ClientAdapterMock_SignRawTransactionWithWallet_Call) Run(run func(tx *wire.MsgTx)) *ClientAdapterMock_SignRawTransactionWithWallet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*wire.MsgTx)) + }) + return _c +} + +func (_c *ClientAdapterMock_SignRawTransactionWithWallet_Call) Return(_a0 *wire.MsgTx, _a1 bool, _a2 error) *ClientAdapterMock_SignRawTransactionWithWallet_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *ClientAdapterMock_SignRawTransactionWithWallet_Call) RunAndReturn(run func(*wire.MsgTx) (*wire.MsgTx, bool, error)) *ClientAdapterMock_SignRawTransactionWithWallet_Call { + _c.Call.Return(run) + return _c +} + +// WalletCreateFundedPsbt provides a mock function with given fields: inputs, outputs, locktime, options, bip32Derivs +func (_m *ClientAdapterMock) WalletCreateFundedPsbt(inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool) (*btcjson.WalletCreateFundedPsbtResult, error) { + ret := _m.Called(inputs, outputs, locktime, options, bip32Derivs) + + if len(ret) == 0 { + panic("no return value specified for WalletCreateFundedPsbt") + } + + var r0 *btcjson.WalletCreateFundedPsbtResult + var r1 error + if rf, ok := ret.Get(0).(func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) (*btcjson.WalletCreateFundedPsbtResult, error)); ok { + return rf(inputs, outputs, locktime, options, bip32Derivs) + } + if rf, ok := ret.Get(0).(func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) *btcjson.WalletCreateFundedPsbtResult); ok { + r0 = rf(inputs, outputs, locktime, options, bip32Derivs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*btcjson.WalletCreateFundedPsbtResult) + } + } + + if rf, ok := ret.Get(1).(func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) error); ok { + r1 = rf(inputs, outputs, locktime, options, bip32Derivs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientAdapterMock_WalletCreateFundedPsbt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletCreateFundedPsbt' +type ClientAdapterMock_WalletCreateFundedPsbt_Call struct { + *mock.Call +} + +// WalletCreateFundedPsbt is a helper method to define mock.On call +// - inputs []btcjson.PsbtInput +// - outputs []btcjson.PsbtOutput +// - locktime *uint32 +// - options *btcjson.WalletCreateFundedPsbtOpts +// - bip32Derivs *bool +func (_e *ClientAdapterMock_Expecter) WalletCreateFundedPsbt(inputs interface{}, outputs interface{}, locktime interface{}, options interface{}, bip32Derivs interface{}) *ClientAdapterMock_WalletCreateFundedPsbt_Call { + return &ClientAdapterMock_WalletCreateFundedPsbt_Call{Call: _e.mock.On("WalletCreateFundedPsbt", inputs, outputs, locktime, options, bip32Derivs)} +} + +func (_c *ClientAdapterMock_WalletCreateFundedPsbt_Call) Run(run func(inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool)) *ClientAdapterMock_WalletCreateFundedPsbt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]btcjson.PsbtInput), args[1].([]btcjson.PsbtOutput), args[2].(*uint32), args[3].(*btcjson.WalletCreateFundedPsbtOpts), args[4].(*bool)) + }) + return _c +} + +func (_c *ClientAdapterMock_WalletCreateFundedPsbt_Call) Return(_a0 *btcjson.WalletCreateFundedPsbtResult, _a1 error) *ClientAdapterMock_WalletCreateFundedPsbt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientAdapterMock_WalletCreateFundedPsbt_Call) RunAndReturn(run func([]btcjson.PsbtInput, []btcjson.PsbtOutput, *uint32, *btcjson.WalletCreateFundedPsbtOpts, *bool) (*btcjson.WalletCreateFundedPsbtResult, error)) *ClientAdapterMock_WalletCreateFundedPsbt_Call { + _c.Call.Return(run) + return _c +} + +// WalletPassphrase provides a mock function with given fields: passphrase, timeoutSecs +func (_m *ClientAdapterMock) WalletPassphrase(passphrase string, timeoutSecs int64) error { + ret := _m.Called(passphrase, timeoutSecs) + + if len(ret) == 0 { + panic("no return value specified for WalletPassphrase") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, int64) error); ok { + r0 = rf(passphrase, timeoutSecs) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientAdapterMock_WalletPassphrase_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WalletPassphrase' +type ClientAdapterMock_WalletPassphrase_Call struct { + *mock.Call +} + +// WalletPassphrase is a helper method to define mock.On call +// - passphrase string +// - timeoutSecs int64 +func (_e *ClientAdapterMock_Expecter) WalletPassphrase(passphrase interface{}, timeoutSecs interface{}) *ClientAdapterMock_WalletPassphrase_Call { + return &ClientAdapterMock_WalletPassphrase_Call{Call: _e.mock.On("WalletPassphrase", passphrase, timeoutSecs)} +} + +func (_c *ClientAdapterMock_WalletPassphrase_Call) Run(run func(passphrase string, timeoutSecs int64)) *ClientAdapterMock_WalletPassphrase_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(int64)) + }) + return _c +} + +func (_c *ClientAdapterMock_WalletPassphrase_Call) Return(_a0 error) *ClientAdapterMock_WalletPassphrase_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_WalletPassphrase_Call) RunAndReturn(run func(string, int64) error) *ClientAdapterMock_WalletPassphrase_Call { + _c.Call.Return(run) + return _c +} + +// NewClientAdapterMock creates a new instance of ClientAdapterMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewClientAdapterMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ClientAdapterMock { + mock := &ClientAdapterMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/rootstock_rpc_server_mock.go b/test/mocks/rootstock_rpc_server_mock.go new file mode 100644 index 00000000..d1b0dd78 --- /dev/null +++ b/test/mocks/rootstock_rpc_server_mock.go @@ -0,0 +1,388 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + blockchain "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + + entities "github.com/rsksmart/liquidity-provider-server/internal/entities" + + mock "github.com/stretchr/testify/mock" +) + +// RootstockRpcServerMock is an autogenerated mock type for the RootstockRpcServer type +type RootstockRpcServerMock struct { + mock.Mock +} + +type RootstockRpcServerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *RootstockRpcServerMock) EXPECT() *RootstockRpcServerMock_Expecter { + return &RootstockRpcServerMock_Expecter{mock: &_m.Mock} +} + +// EstimateGas provides a mock function with given fields: ctx, addr, value, data +func (_m *RootstockRpcServerMock) EstimateGas(ctx context.Context, addr string, value *entities.Wei, data []byte) (*entities.Wei, error) { + ret := _m.Called(ctx, addr, value, data) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 *entities.Wei + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *entities.Wei, []byte) (*entities.Wei, error)); ok { + return rf(ctx, addr, value, data) + } + if rf, ok := ret.Get(0).(func(context.Context, string, *entities.Wei, []byte) *entities.Wei); ok { + r0 = rf(ctx, addr, value, data) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Wei) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, *entities.Wei, []byte) error); ok { + r1 = rf(ctx, addr, value, data) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RootstockRpcServerMock_EstimateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGas' +type RootstockRpcServerMock_EstimateGas_Call struct { + *mock.Call +} + +// EstimateGas is a helper method to define mock.On call +// - ctx context.Context +// - addr string +// - value *entities.Wei +// - data []byte +func (_e *RootstockRpcServerMock_Expecter) EstimateGas(ctx interface{}, addr interface{}, value interface{}, data interface{}) *RootstockRpcServerMock_EstimateGas_Call { + return &RootstockRpcServerMock_EstimateGas_Call{Call: _e.mock.On("EstimateGas", ctx, addr, value, data)} +} + +func (_c *RootstockRpcServerMock_EstimateGas_Call) Run(run func(ctx context.Context, addr string, value *entities.Wei, data []byte)) *RootstockRpcServerMock_EstimateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(*entities.Wei), args[3].([]byte)) + }) + return _c +} + +func (_c *RootstockRpcServerMock_EstimateGas_Call) Return(_a0 *entities.Wei, _a1 error) *RootstockRpcServerMock_EstimateGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RootstockRpcServerMock_EstimateGas_Call) RunAndReturn(run func(context.Context, string, *entities.Wei, []byte) (*entities.Wei, error)) *RootstockRpcServerMock_EstimateGas_Call { + _c.Call.Return(run) + return _c +} + +// GasPrice provides a mock function with given fields: ctx +func (_m *RootstockRpcServerMock) GasPrice(ctx context.Context) (*entities.Wei, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GasPrice") + } + + var r0 *entities.Wei + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*entities.Wei, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *entities.Wei); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Wei) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RootstockRpcServerMock_GasPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GasPrice' +type RootstockRpcServerMock_GasPrice_Call struct { + *mock.Call +} + +// GasPrice is a helper method to define mock.On call +// - ctx context.Context +func (_e *RootstockRpcServerMock_Expecter) GasPrice(ctx interface{}) *RootstockRpcServerMock_GasPrice_Call { + return &RootstockRpcServerMock_GasPrice_Call{Call: _e.mock.On("GasPrice", ctx)} +} + +func (_c *RootstockRpcServerMock_GasPrice_Call) Run(run func(ctx context.Context)) *RootstockRpcServerMock_GasPrice_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RootstockRpcServerMock_GasPrice_Call) Return(_a0 *entities.Wei, _a1 error) *RootstockRpcServerMock_GasPrice_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RootstockRpcServerMock_GasPrice_Call) RunAndReturn(run func(context.Context) (*entities.Wei, error)) *RootstockRpcServerMock_GasPrice_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: ctx, address +func (_m *RootstockRpcServerMock) GetBalance(ctx context.Context, address string) (*entities.Wei, error) { + ret := _m.Called(ctx, address) + + if len(ret) == 0 { + panic("no return value specified for GetBalance") + } + + var r0 *entities.Wei + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*entities.Wei, error)); ok { + return rf(ctx, address) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *entities.Wei); ok { + r0 = rf(ctx, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*entities.Wei) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RootstockRpcServerMock_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type RootstockRpcServerMock_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - ctx context.Context +// - address string +func (_e *RootstockRpcServerMock_Expecter) GetBalance(ctx interface{}, address interface{}) *RootstockRpcServerMock_GetBalance_Call { + return &RootstockRpcServerMock_GetBalance_Call{Call: _e.mock.On("GetBalance", ctx, address)} +} + +func (_c *RootstockRpcServerMock_GetBalance_Call) Run(run func(ctx context.Context, address string)) *RootstockRpcServerMock_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *RootstockRpcServerMock_GetBalance_Call) Return(_a0 *entities.Wei, _a1 error) *RootstockRpcServerMock_GetBalance_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RootstockRpcServerMock_GetBalance_Call) RunAndReturn(run func(context.Context, string) (*entities.Wei, error)) *RootstockRpcServerMock_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetBlockByHash provides a mock function with given fields: ctx, hash +func (_m *RootstockRpcServerMock) GetBlockByHash(ctx context.Context, hash string) (blockchain.BlockInfo, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetBlockByHash") + } + + var r0 blockchain.BlockInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (blockchain.BlockInfo, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) blockchain.BlockInfo); ok { + r0 = rf(ctx, hash) + } else { + r0 = ret.Get(0).(blockchain.BlockInfo) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RootstockRpcServerMock_GetBlockByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockByHash' +type RootstockRpcServerMock_GetBlockByHash_Call struct { + *mock.Call +} + +// GetBlockByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *RootstockRpcServerMock_Expecter) GetBlockByHash(ctx interface{}, hash interface{}) *RootstockRpcServerMock_GetBlockByHash_Call { + return &RootstockRpcServerMock_GetBlockByHash_Call{Call: _e.mock.On("GetBlockByHash", ctx, hash)} +} + +func (_c *RootstockRpcServerMock_GetBlockByHash_Call) Run(run func(ctx context.Context, hash string)) *RootstockRpcServerMock_GetBlockByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *RootstockRpcServerMock_GetBlockByHash_Call) Return(_a0 blockchain.BlockInfo, _a1 error) *RootstockRpcServerMock_GetBlockByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RootstockRpcServerMock_GetBlockByHash_Call) RunAndReturn(run func(context.Context, string) (blockchain.BlockInfo, error)) *RootstockRpcServerMock_GetBlockByHash_Call { + _c.Call.Return(run) + return _c +} + +// GetHeight provides a mock function with given fields: ctx +func (_m *RootstockRpcServerMock) GetHeight(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetHeight") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RootstockRpcServerMock_GetHeight_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetHeight' +type RootstockRpcServerMock_GetHeight_Call struct { + *mock.Call +} + +// GetHeight is a helper method to define mock.On call +// - ctx context.Context +func (_e *RootstockRpcServerMock_Expecter) GetHeight(ctx interface{}) *RootstockRpcServerMock_GetHeight_Call { + return &RootstockRpcServerMock_GetHeight_Call{Call: _e.mock.On("GetHeight", ctx)} +} + +func (_c *RootstockRpcServerMock_GetHeight_Call) Run(run func(ctx context.Context)) *RootstockRpcServerMock_GetHeight_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RootstockRpcServerMock_GetHeight_Call) Return(_a0 uint64, _a1 error) *RootstockRpcServerMock_GetHeight_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RootstockRpcServerMock_GetHeight_Call) RunAndReturn(run func(context.Context) (uint64, error)) *RootstockRpcServerMock_GetHeight_Call { + _c.Call.Return(run) + return _c +} + +// GetTransactionReceipt provides a mock function with given fields: ctx, hash +func (_m *RootstockRpcServerMock) GetTransactionReceipt(ctx context.Context, hash string) (blockchain.TransactionReceipt, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetTransactionReceipt") + } + + var r0 blockchain.TransactionReceipt + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (blockchain.TransactionReceipt, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) blockchain.TransactionReceipt); ok { + r0 = rf(ctx, hash) + } else { + r0 = ret.Get(0).(blockchain.TransactionReceipt) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RootstockRpcServerMock_GetTransactionReceipt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransactionReceipt' +type RootstockRpcServerMock_GetTransactionReceipt_Call struct { + *mock.Call +} + +// GetTransactionReceipt is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *RootstockRpcServerMock_Expecter) GetTransactionReceipt(ctx interface{}, hash interface{}) *RootstockRpcServerMock_GetTransactionReceipt_Call { + return &RootstockRpcServerMock_GetTransactionReceipt_Call{Call: _e.mock.On("GetTransactionReceipt", ctx, hash)} +} + +func (_c *RootstockRpcServerMock_GetTransactionReceipt_Call) Run(run func(ctx context.Context, hash string)) *RootstockRpcServerMock_GetTransactionReceipt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *RootstockRpcServerMock_GetTransactionReceipt_Call) Return(_a0 blockchain.TransactionReceipt, _a1 error) *RootstockRpcServerMock_GetTransactionReceipt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RootstockRpcServerMock_GetTransactionReceipt_Call) RunAndReturn(run func(context.Context, string) (blockchain.TransactionReceipt, error)) *RootstockRpcServerMock_GetTransactionReceipt_Call { + _c.Call.Return(run) + return _c +} + +// NewRootstockRpcServerMock creates a new instance of RootstockRpcServerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRootstockRpcServerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *RootstockRpcServerMock { + mock := &RootstockRpcServerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/rpc_client_binding_mock.go b/test/mocks/rpc_client_binding_mock.go index ac657cc9..f9005f82 100644 --- a/test/mocks/rpc_client_binding_mock.go +++ b/test/mocks/rpc_client_binding_mock.go @@ -88,6 +88,65 @@ func (_c *RpcClientBindingMock_BalanceAt_Call) RunAndReturn(run func(context.Con return _c } +// BlockByHash provides a mock function with given fields: ctx, hash +func (_m *RpcClientBindingMock) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for BlockByHash") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Block, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Block); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RpcClientBindingMock_BlockByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByHash' +type RpcClientBindingMock_BlockByHash_Call struct { + *mock.Call +} + +// BlockByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *RpcClientBindingMock_Expecter) BlockByHash(ctx interface{}, hash interface{}) *RpcClientBindingMock_BlockByHash_Call { + return &RpcClientBindingMock_BlockByHash_Call{Call: _e.mock.On("BlockByHash", ctx, hash)} +} + +func (_c *RpcClientBindingMock_BlockByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *RpcClientBindingMock_BlockByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *RpcClientBindingMock_BlockByHash_Call) Return(_a0 *types.Block, _a1 error) *RpcClientBindingMock_BlockByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RpcClientBindingMock_BlockByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Block, error)) *RpcClientBindingMock_BlockByHash_Call { + _c.Call.Return(run) + return _c +} + // BlockNumber provides a mock function with given fields: ctx func (_m *RpcClientBindingMock) BlockNumber(ctx context.Context) (uint64, error) { ret := _m.Called(ctx) diff --git a/test/mocks/rpc_client_mock.go b/test/mocks/rpc_client_mock.go index 6aba3195..21bab7c7 100644 --- a/test/mocks/rpc_client_mock.go +++ b/test/mocks/rpc_client_mock.go @@ -15,7 +15,7 @@ import ( wire "github.com/btcsuite/btcd/wire" ) -// RpcClientMock is an autogenerated mock type for the rpcClient type +// RpcClientMock is an autogenerated mock type for the RpcClient type type RpcClientMock struct { mock.Mock } @@ -822,6 +822,52 @@ func (_c *RpcClientMock_ImportAddressRescan_Call) RunAndReturn(run func(string, return _c } +// ImportPubKey provides a mock function with given fields: pubKey +func (_m *RpcClientMock) ImportPubKey(pubKey string) error { + ret := _m.Called(pubKey) + + if len(ret) == 0 { + panic("no return value specified for ImportPubKey") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(pubKey) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RpcClientMock_ImportPubKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportPubKey' +type RpcClientMock_ImportPubKey_Call struct { + *mock.Call +} + +// ImportPubKey is a helper method to define mock.On call +// - pubKey string +func (_e *RpcClientMock_Expecter) ImportPubKey(pubKey interface{}) *RpcClientMock_ImportPubKey_Call { + return &RpcClientMock_ImportPubKey_Call{Call: _e.mock.On("ImportPubKey", pubKey)} +} + +func (_c *RpcClientMock_ImportPubKey_Call) Run(run func(pubKey string)) *RpcClientMock_ImportPubKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *RpcClientMock_ImportPubKey_Call) Return(_a0 error) *RpcClientMock_ImportPubKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_ImportPubKey_Call) RunAndReturn(run func(string) error) *RpcClientMock_ImportPubKey_Call { + _c.Call.Return(run) + return _c +} + // ImportPubKeyRescan provides a mock function with given fields: pubKey, rescan func (_m *RpcClientMock) ImportPubKeyRescan(pubKey string, rescan bool) error { ret := _m.Called(pubKey, rescan) @@ -1148,73 +1194,6 @@ func (_c *RpcClientMock_SendRawTransaction_Call) RunAndReturn(run func(*wire.Msg return _c } -// SignRawTransaction3 provides a mock function with given fields: tx, inputs, privKeysWIF -func (_m *RpcClientMock) SignRawTransaction3(tx *wire.MsgTx, inputs []btcjson.RawTxInput, privKeysWIF []string) (*wire.MsgTx, bool, error) { - ret := _m.Called(tx, inputs, privKeysWIF) - - if len(ret) == 0 { - panic("no return value specified for SignRawTransaction3") - } - - var r0 *wire.MsgTx - var r1 bool - var r2 error - if rf, ok := ret.Get(0).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) (*wire.MsgTx, bool, error)); ok { - return rf(tx, inputs, privKeysWIF) - } - if rf, ok := ret.Get(0).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) *wire.MsgTx); ok { - r0 = rf(tx, inputs, privKeysWIF) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*wire.MsgTx) - } - } - - if rf, ok := ret.Get(1).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) bool); ok { - r1 = rf(tx, inputs, privKeysWIF) - } else { - r1 = ret.Get(1).(bool) - } - - if rf, ok := ret.Get(2).(func(*wire.MsgTx, []btcjson.RawTxInput, []string) error); ok { - r2 = rf(tx, inputs, privKeysWIF) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// RpcClientMock_SignRawTransaction3_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SignRawTransaction3' -type RpcClientMock_SignRawTransaction3_Call struct { - *mock.Call -} - -// SignRawTransaction3 is a helper method to define mock.On call -// - tx *wire.MsgTx -// - inputs []btcjson.RawTxInput -// - privKeysWIF []string -func (_e *RpcClientMock_Expecter) SignRawTransaction3(tx interface{}, inputs interface{}, privKeysWIF interface{}) *RpcClientMock_SignRawTransaction3_Call { - return &RpcClientMock_SignRawTransaction3_Call{Call: _e.mock.On("SignRawTransaction3", tx, inputs, privKeysWIF)} -} - -func (_c *RpcClientMock_SignRawTransaction3_Call) Run(run func(tx *wire.MsgTx, inputs []btcjson.RawTxInput, privKeysWIF []string)) *RpcClientMock_SignRawTransaction3_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*wire.MsgTx), args[1].([]btcjson.RawTxInput), args[2].([]string)) - }) - return _c -} - -func (_c *RpcClientMock_SignRawTransaction3_Call) Return(_a0 *wire.MsgTx, _a1 bool, _a2 error) *RpcClientMock_SignRawTransaction3_Call { - _c.Call.Return(_a0, _a1, _a2) - return _c -} - -func (_c *RpcClientMock_SignRawTransaction3_Call) RunAndReturn(run func(*wire.MsgTx, []btcjson.RawTxInput, []string) (*wire.MsgTx, bool, error)) *RpcClientMock_SignRawTransaction3_Call { - _c.Call.Return(run) - return _c -} - // SignRawTransactionWithWallet provides a mock function with given fields: tx func (_m *RpcClientMock) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) { ret := _m.Called(tx) From f29402795e6d79cc6a71338ab09ff9eb54fb9c35 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 1 May 2024 12:49:41 +0200 Subject: [PATCH 056/113] test: add new test for derivative wallet changes --- .golangci.yml | 2 + .mockery.yaml | 5 +- coverage/cover.out | 11289 +++++++++++----- .../bitcoin/bitcoind_wallet_test.go | 13 + .../bitcoin/btcclient/adapter.go | 35 +- .../bitcoin/btcclient/adapter_test.go | 138 + .../bitcoin/btcclient/binding.go | 2 + .../bitcoin/btcclient/sign_with_key_test.go | 39 + .../adapters/dataproviders/bitcoin/common.go | 6 +- .../dataproviders/bitcoin/common_test.go | 24 - .../dataproviders/bitcoin/connection_test.go | 47 + .../bitcoin/derivative_wallet.go | 19 +- .../bitcoin/derivative_wallet_test.go | 650 + .../rootstock/account/account.go | 4 +- .../rootstock/account/account_test.go | 187 + .../dataproviders/rootstock/rpc_test.go | 43 +- .../adapters/dataproviders/utils/utils.go | 15 + .../dataproviders/utils/utils_test.go | 40 + test/mocks/client_adapter_mock.go | 93 + test/mocks/http_client_mock.go | 94 + test/mocks/rpc_client_mock.go | 93 + test/utils.go | 24 + 22 files changed, 9079 insertions(+), 3783 deletions(-) create mode 100644 internal/adapters/dataproviders/bitcoin/btcclient/adapter_test.go create mode 100644 internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key_test.go create mode 100644 internal/adapters/dataproviders/bitcoin/connection_test.go create mode 100644 internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go create mode 100644 internal/adapters/dataproviders/utils/utils_test.go create mode 100644 test/mocks/http_client_mock.go diff --git a/.golangci.yml b/.golangci.yml index f401c654..dbb0ccdf 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,4 +1,6 @@ run: + allow-parallel-runners: true + timeout: 3m tests: true skip-dirs: - internal/adapters/dataproviders/rootstock/bindings diff --git a/.mockery.yaml b/.mockery.yaml index 4cd5db99..20bf66b8 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -33,4 +33,7 @@ packages: github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain: interfaces: BitcoinWallet: - RootstockRpcServer: \ No newline at end of file + RootstockRpcServer: + github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils: + interfaces: + HttpClient: \ No newline at end of file diff --git a/coverage/cover.out b/coverage/cover.out index 82274b92..761eec81 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -3,39 +3,189 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go: github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:24.110,38.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:38.16,40.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:41.2,43.12 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -51,131 +201,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -214,29 +329,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -461,83 +576,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -629,6 +789,11 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -684,11 +849,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -797,39 +962,263 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:25.43,26.30 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:26.30,30.31 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:30.31,33.4 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.2,35.26 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:38.80,39.30 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:39.30,42.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:43.2,47.38 5 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:47.38,50.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.2,53.21 3 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:56.62,57.30 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:57.30,60.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.2,61.37 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.37,62.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:62.38,64.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:65.3,65.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:67.2,71.34 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:74.57,75.30 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:75.30,78.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:79.2,82.9 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:82.9,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.2,85.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.37,87.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:38.27,48.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:50.55,52.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:54.55,56.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:58.79,62.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:62.16,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:66.2,69.16 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:69.16,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:72.2,73.48 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:76.114,80.16 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:80.16,82.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:83.2,87.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:87.16,89.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.2,90.39 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.39,92.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:93.2,95.52 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:95.52,97.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:97.8,102.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:105.113,110.16 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:110.16,112.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.2,114.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:114.16,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:117.2,120.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.2,123.39 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.39,125.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:126.2,128.52 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:128.52,130.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:130.8,136.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.117,140.135 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:140.135,142.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.2,143.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.16,145.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:146.2,146.28 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.115,150.133 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:150.133,152.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.2,153.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.16,155.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:156.2,156.28 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.113,160.131 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:160.131,162.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.2,163.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.16,165.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:166.2,166.28 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:173.32,175.16 2 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:175.16,178.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.2,179.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.26,182.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.2,183.70 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.70,186.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.2,187.70 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.70,190.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:191.2,191.27 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -845,131 +1234,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -1008,29 +1362,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -1255,149 +1609,194 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 17 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 17 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 30 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 18 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 30 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 82 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 81 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 36 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 23 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 41 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 40 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 82 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 27 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 37 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 @@ -1409,42 +1808,47 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 3 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 122 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 8 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 272 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 8 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -1454,7 +1858,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -1462,8 +1866,8 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 22 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 8 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 @@ -1478,11 +1882,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -1499,11 +1903,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 @@ -1591,262 +1995,338 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 29 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 90 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 56 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 128 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 63 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 62 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 20 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 192 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 38 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 2060 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 8190 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 4134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 2474 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 23 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 128 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 63 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 62 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 192 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 38 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 32 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 60 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 32 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 28 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 28 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 2060 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 8190 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 4134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 2474 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 @@ -1873,29 +2353,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -2120,83 +2600,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 72 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 71 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -2288,6 +2813,11 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 2 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -2299,16 +2829,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 50 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 29 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 142 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 26 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 @@ -2327,7 +2857,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 @@ -2343,11 +2873,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -2456,428 +2986,189 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 17 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -2893,131 +3184,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -3056,29 +3312,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -3303,83 +3559,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -3471,6 +3772,11 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -3482,17 +3788,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -3502,7 +3808,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -3511,8 +3817,8 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 @@ -3526,11 +3832,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -3549,7 +3855,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 @@ -3639,71 +3945,189 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -3719,131 +4143,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -3882,29 +4271,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -4129,149 +4518,194 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 7 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 7 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 10 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 8 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 18 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 29 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 82 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 81 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 36 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 41 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 40 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 82 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 37 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 10 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 @@ -4283,21 +4717,26 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 5 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -4305,20 +4744,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -4336,42 +4775,42 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -4386,15 +4825,15 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 @@ -4459,266 +4898,1861 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 67 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:32.23,42.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:44.108,50.84 5 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:50.84,52.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:52.8,52.30 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:52.30,55.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:57.2,57.28 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:57.28,60.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:62.2,65.95 3 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:65.95,67.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:67.8,67.33 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:67.33,72.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:74.2,74.93 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:74.93,76.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:78.2,78.62 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:78.62,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.2,81.88 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.88,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:85.2,94.8 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:97.153,103.104 5 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:103.104,106.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.8,106.105 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.105,109.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.8,109.99 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.99,112.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:114.2,114.79 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:114.79,116.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.2,123.4 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:126.136,135.63 5 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:135.63,137.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:138.2,141.81 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:141.81,144.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:145.2,145.31 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:148.159,155.67 6 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:155.67,157.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.2,158.99 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.99,160.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.2,161.95 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.95,163.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.2,164.71 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.71,166.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:168.2,174.8 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:15.128,17.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:19.87,22.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:25.2,26.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:29.2,31.35 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:31.35,33.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:34.2,35.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:35.16,37.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:38.2,38.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:32.23,41.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:43.125,48.62 4 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:48.62,50.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.2,52.98 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.98,54.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.8,54.30 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.30,56.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.2,58.28 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.28,60.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.2,62.92 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.92,64.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:66.2,69.98 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.98,71.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:73.2,75.104 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:75.104,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.2,78.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.16,81.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:82.2,82.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:91.9,93.18 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:93.18,95.88 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:95.88,97.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:98.3,103.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:106.2,106.21 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:113.26,117.109 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:117.109,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:121.2,122.47 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:122.47,124.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.8,126.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.2,128.107 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.107,130.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.8,130.48 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.48,132.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.2,133.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:141.37,147.93 5 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:147.93,149.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:149.8,151.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:153.2,162.27 5 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:170.9,175.77 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:175.77,177.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:178.2,179.74 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:179.74,181.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:183.2,184.44 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:184.44,193.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:194.2,194.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:13.104,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:17.110,20.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:20.16,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:23.2,23.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:15.139,17.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:19.67,21.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:21.16,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:31.20,40.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:56.16,64.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:71.109,80.87 8 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:80.87,82.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:84.2,85.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:85.16,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:89.2,89.63 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:89.63,91.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.2,93.75 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.75,95.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.2,97.76 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.76,99.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.2,109.138 4 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:109.138,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:113.2,113.125 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:113.125,115.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.2,117.78 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.78,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:120.2,120.87 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:120.87,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:123.2,123.69 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:126.152,129.85 3 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:129.85,132.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:133.2,133.56 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:133.56,136.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.2,137.64 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.64,140.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.2,141.77 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.77,143.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:144.2,144.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:154.29,158.51 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:158.51,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:162.2,185.59 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:185.59,187.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:188.2,188.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:191.121,196.91 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:196.91,198.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.2,199.160 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.160,201.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:202.2,202.26 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:28.25,36.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:38.109,45.65 6 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:45.65,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:49.2,49.98 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:49.98,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:51.8,51.30 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:51.30,53.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:55.2,55.71 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:55.71,57.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:59.2,59.92 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:59.92,61.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:63.2,65.126 3 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:65.126,67.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:67.8,67.23 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:67.23,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:69.8,71.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:73.2,81.104 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:81.104,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.2,84.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.16,87.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:88.2,88.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:91.152,96.18 5 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:96.18,98.88 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:98.88,100.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:101.3,105.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:107.2,107.21 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:110.172,115.81 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:115.81,117.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:119.2,119.96 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:119.96,121.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:123.2,123.94 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:123.94,125.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:127.2,127.99 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:127.99,129.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:131.2,137.8 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:140.125,143.95 3 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:143.95,145.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:145.8,145.89 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:145.89,147.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.2,148.12 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:13.97,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:17.55,19.104 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:19.104,21.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 29 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 90 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 100 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 69 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 254 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 15 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 59 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 223 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 77 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -4734,131 +6768,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -4897,29 +6896,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -5144,83 +7143,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -5312,6 +7356,11 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -5320,20 +7369,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 230 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 30 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 52 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 926 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 300 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 338 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -5351,42 +7400,42 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 76 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 10 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -5401,25 +7450,25 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 20 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 @@ -5474,23 +7523,23 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 5 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 39 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 35 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 67 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 27 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 29 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 35 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 @@ -5512,244 +7561,1421 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:29.23,38.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:40.108,48.85 7 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:48.85,50.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.8,50.31 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.31,53.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.2,55.29 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.29,58.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:60.2,63.95 3 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:63.95,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.8,65.33 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.33,70.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.2,72.96 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.96,74.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.2,76.71 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.71,78.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:80.2,88.77 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:88.77,90.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:92.2,95.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:98.138,104.83 5 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:104.83,107.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:108.2,108.31 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:115.9,117.62 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:117.62,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.2,120.88 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.88,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:124.2,129.12 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.128,17.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:19.87,22.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:25.2,26.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:29.2,31.35 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:31.35,33.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:34.2,35.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:35.16,37.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:38.2,38.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:13.108,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:17.113,20.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:20.16,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:23.2,23.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.140,17.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:33.20,43.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:57.16,64.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:71.110,81.82 9 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:81.82,83.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.2,86.72 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:86.72,88.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.8,88.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.23,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.2,92.75 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.75,94.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.2,96.63 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.63,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,107.96 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:107.96,109.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.2,111.127 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.127,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.2,115.68 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.68,117.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.72 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:122.153,125.67 3 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:125.67,128.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.2,129.85 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.85,132.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.2,133.56 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.56,136.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.77 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.77,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:140.2,140.17 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.30,153.51 4 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:153.51,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.2,157.67 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.67,159.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.2,187.60 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:187.60,189.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:190.2,190.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:193.121,197.91 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:197.91,199.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.2,200.160 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.160,202.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:203.2,203.26 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:206.114,209.80 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:209.80,211.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.2,213.89 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.89,215.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:216.2,216.18 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:23.2,23.22 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.171,18.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.62 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.62,26.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.103 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.103,30.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.2,32.84 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.84,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:35.2,35.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:40.24,49.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:51.109,56.65 4 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:56.65,58.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.2,60.99 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.99,62.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.8,62.31 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.31,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.2,66.88 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.88,68.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.2,70.83 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.83,72.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,78.104 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:78.104,80.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.2,82.97 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.97,84.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.12 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.152,90.18 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:90.18,92.88 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:92.88,94.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.3,99.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:101.2,101.21 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.162,111.98 6 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:111.98,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.2,115.97 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.97,117.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.2,119.91 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.91,121.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.2,123.81 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.81,125.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,134.8 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:137.182,146.16 8 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:146.16,148.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:150.2,151.103 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:151.103,153.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.2,154.27 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:162.38,167.134 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:167.134,169.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.8,169.23 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.23,171.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:171.8,173.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:175.2,183.103 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:183.103,185.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.2,186.27 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:193.9,196.93 3 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.93,198.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.8,198.77 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.77,200.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.2,201.12 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:28.22,36.2 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:38.107,43.73 4 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:43.73,45.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.2,47.99 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.99,49.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.8,49.31 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.31,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.2,53.87 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.87,55.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:57.2,60.80 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:60.80,62.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:64.2,67.76 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:67.76,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.2,71.104 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.104,73.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.2,74.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.16,76.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:77.2,77.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:86.9,88.18 2 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:88.18,90.88 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:90.88,92.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:93.3,98.5 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:100.2,100.21 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:107.42,112.29 4 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:112.29,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.2,116.67 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:116.67,118.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.2,120.104 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:120.104,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:122.8,122.87 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:122.87,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.8,124.55 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.55,127.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:128.2,128.21 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:136.38,142.16 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:142.16,145.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:147.2,147.129 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:147.129,149.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:149.8,151.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:153.2,161.27 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:168.9,173.63 4 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:173.63,175.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:176.2,178.38 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:178.38,180.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:181.2,181.12 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:184.125,185.76 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:185.76,187.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:187.8,187.46 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:187.46,189.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:190.2,190.12 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.97,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:17.55,19.104 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:19.104,21.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:32.23,42.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:44.108,50.84 5 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:50.84,52.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:52.8,52.30 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:52.30,55.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:57.2,57.28 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:57.28,60.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:62.2,65.95 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:65.95,67.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:67.8,67.33 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:67.33,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:74.2,74.93 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:74.93,76.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:78.2,78.62 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:78.62,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.2,81.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:81.88,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:85.2,94.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:97.153,103.104 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:103.104,106.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.8,106.105 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:106.105,109.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.8,109.99 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:109.99,112.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:114.2,114.79 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:114.79,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:117.2,123.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:126.136,135.63 5 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:135.63,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:138.2,141.81 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:141.81,144.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:145.2,145.31 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:148.159,155.67 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:155.67,157.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.2,158.99 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:158.99,160.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.2,161.95 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:161.95,163.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.2,164.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:164.71,166.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/accept_pegin_quote.go:168.2,174.8 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:15.128,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:19.87,22.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:25.2,26.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:29.2,31.35 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:31.35,33.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:34.2,35.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:35.16,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:38.2,38.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:32.23,41.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:43.125,48.62 4 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:48.62,50.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.2,52.98 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.98,54.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.8,54.30 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.30,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.2,58.28 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.28,60.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.2,62.92 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.92,64.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:66.2,69.98 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.98,71.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:73.2,75.104 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:75.104,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.2,78.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.16,81.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:82.2,82.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:91.9,93.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:93.18,95.88 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:95.88,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:98.3,103.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:106.2,106.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:113.26,117.109 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:117.109,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:121.2,122.47 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:122.47,124.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.8,126.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.2,128.107 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.107,130.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.8,130.48 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.48,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.2,133.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:141.37,147.93 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:147.93,149.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:149.8,151.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:153.2,162.27 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:170.9,175.77 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:175.77,177.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:178.2,179.74 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:179.74,181.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:183.2,184.44 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:184.44,193.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:194.2,194.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:13.104,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:17.110,20.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:20.16,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:23.2,23.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:15.139,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:19.67,21.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:21.16,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_collateral.go:24.2,24.24 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:31.20,40.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:56.16,64.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:71.109,80.87 8 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:80.87,82.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:84.2,85.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:85.16,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:89.2,89.63 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:89.63,91.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.2,93.75 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:93.75,95.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.2,97.76 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:97.76,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:101.2,109.138 4 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:109.138,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:113.2,113.125 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:113.125,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.2,117.78 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:117.78,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:120.2,120.87 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:120.87,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:123.2,123.69 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:126.152,129.85 3 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:129.85,132.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:133.2,133.56 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:133.56,136.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.2,137.64 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:137.64,140.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.2,141.77 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:141.77,143.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:144.2,144.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:154.29,158.51 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:158.51,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:162.2,185.59 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:185.59,187.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:188.2,188.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:191.121,196.91 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:196.91,198.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.2,199.160 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:199.160,201.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/get_pegin_quote.go:202.2,202.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:28.25,36.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:38.109,45.65 6 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:45.65,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:49.2,49.98 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:49.98,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:51.8,51.30 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:51.30,53.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:55.2,55.71 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:55.71,57.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:59.2,59.92 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:59.92,61.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:63.2,65.126 3 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:65.126,67.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:67.8,67.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:67.23,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:69.8,71.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:73.2,81.104 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:81.104,83.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.2,84.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:84.16,87.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:88.2,88.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:91.152,96.18 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:96.18,98.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:98.88,100.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:101.3,105.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:107.2,107.21 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:110.172,115.81 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:115.81,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:119.2,119.96 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:119.96,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:123.2,123.94 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:123.94,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:127.2,127.99 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:127.99,129.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:131.2,137.8 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:140.125,143.95 3 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:143.95,145.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:145.8,145.89 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:145.89,147.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/register_pegin.go:148.2,148.12 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:13.97,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:17.55,19.104 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:19.104,21.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -5765,131 +8991,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -5928,29 +9119,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -6175,83 +9366,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -6343,7 +9579,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -6351,20 +9592,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 26 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 232 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 32 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 54 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 958 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 300 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -6382,9 +9623,9 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 84 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 7 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 @@ -6396,28 +9637,28 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 19 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 10 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -6441,17 +9682,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quot github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 @@ -6505,31 +9746,31 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 39 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 65 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 29 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 @@ -6543,58 +9784,256 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:29.23,38.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:40.108,48.85 7 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:48.85,50.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.8,50.31 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.31,53.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.2,55.29 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.29,58.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:60.2,63.95 3 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:63.95,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.8,65.33 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.33,70.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.2,72.96 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.96,74.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.2,76.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.71,78.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:80.2,88.77 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:88.77,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:92.2,95.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:98.138,104.83 5 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:104.83,107.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:108.2,108.31 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:115.9,117.62 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:117.62,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.2,120.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.88,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:124.2,129.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.128,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:19.87,22.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:25.2,26.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:29.2,31.35 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:31.35,33.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:34.2,35.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:35.16,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:38.2,38.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:13.108,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:17.113,20.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:20.16,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:23.2,23.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.140,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:33.20,43.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:57.16,64.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:71.110,81.82 9 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:81.82,83.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.2,86.72 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:86.72,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.8,88.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.23,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.2,92.75 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.75,94.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.2,96.63 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.63,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,107.96 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:107.96,109.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.2,111.127 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.127,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.2,115.68 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.68,117.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.72 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:122.153,125.67 3 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:125.67,128.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.2,129.85 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.85,132.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.2,133.56 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.56,136.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.77 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.77,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:140.2,140.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.30,153.51 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:153.51,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.2,157.67 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.67,159.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.2,187.60 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:187.60,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:190.2,190.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:193.121,197.91 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:197.91,199.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.2,200.160 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.160,202.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:203.2,203.26 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:206.114,209.80 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:209.80,211.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.2,213.89 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.89,215.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:216.2,216.18 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:23.2,23.22 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.171,18.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.62 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.62,26.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.103 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.103,30.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.2,32.84 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.84,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:35.2,35.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:40.24,49.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:51.109,56.65 4 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:56.65,58.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.2,60.99 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.99,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.8,62.31 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.31,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.2,66.88 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.88,68.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.2,70.83 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.83,72.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,78.104 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:78.104,80.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.2,82.97 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.97,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.152,90.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:90.18,92.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:92.88,94.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.3,99.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:101.2,101.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.162,111.98 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:111.98,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.2,115.97 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.97,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.2,119.91 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.91,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.2,123.81 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.81,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,134.8 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:137.182,146.16 8 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:146.16,148.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:150.2,151.103 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:151.103,153.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.2,154.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:162.38,167.134 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:167.134,169.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.8,169.23 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.23,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:171.8,173.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:175.2,183.103 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:183.103,185.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.2,186.27 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:193.9,196.93 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.93,198.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.8,198.77 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.77,200.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.2,201.12 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:28.22,36.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:38.107,43.73 4 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:43.73,45.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.2,47.99 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.99,49.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.8,49.31 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.31,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.2,53.87 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.87,55.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:57.2,60.80 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:60.80,62.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:64.2,67.76 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:67.76,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.2,71.104 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.104,73.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.2,74.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.16,76.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:77.2,77.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:86.9,88.18 2 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:88.18,90.88 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:90.88,92.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:93.3,98.5 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:100.2,100.21 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:107.42,113.67 5 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:113.67,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:117.2,117.104 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:117.104,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:119.8,119.87 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:119.87,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:121.8,121.55 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:121.55,124.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.8,124.92 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.92,126.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:126.8,126.61 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:126.61,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:129.2,129.21 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:137.38,143.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:143.16,146.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:148.2,148.129 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:148.129,150.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:150.8,152.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:154.2,162.27 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:169.9,174.63 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:174.63,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:177.2,179.38 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:179.38,181.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:182.2,182.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:185.125,186.76 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:186.76,188.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:188.8,188.46 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:188.46,190.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:191.2,191.12 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.97,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:17.55,19.104 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:19.104,21.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 @@ -6654,106 +10093,263 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 115 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 115 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:22.43,23.30 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:23.30,27.31 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:27.31,30.4 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:32.2,32.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.80,40.38 5 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:40.38,43.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:44.2,46.21 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:49.62,50.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:50.35,51.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.38,53.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:55.2,56.34 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:59.57,63.9 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:63.9,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.2,66.37 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:66.37,68.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:37.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:49.55,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:53.55,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:57.79,61.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:65.2,68.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:71.2,72.48 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:75.114,79.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:79.16,81.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:82.2,86.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.2,89.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:89.39,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:92.2,94.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:94.52,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:96.8,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:104.113,109.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:112.2,113.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.16,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:116.2,119.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:119.16,121.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.2,122.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:122.39,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:125.2,127.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:127.52,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:129.8,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:138.117,139.135 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.135,141.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.2,142.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:142.16,144.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:145.2,145.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:148.115,149.133 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.133,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.2,152.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:152.16,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:155.2,155.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:158.113,159.131 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.131,161.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.2,162.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:165.2,165.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:172.32,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:174.16,177.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.2,178.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:178.26,181.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.2,182.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:182.70,185.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.2,186.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:186.70,189.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:190.2,190.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:25.43,26.30 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:26.30,30.31 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:30.31,33.4 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.2,35.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:38.80,39.30 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:39.30,42.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:43.2,47.38 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:47.38,50.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.2,53.21 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:56.62,57.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:57.30,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.2,61.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.37,62.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:62.38,64.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:65.3,65.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:67.2,71.34 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:74.57,75.30 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:75.30,78.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:79.2,82.9 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:82.9,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.2,85.37 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.37,87.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:38.27,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:50.55,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:54.55,56.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:58.79,62.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:66.2,69.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:72.2,73.48 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:76.114,80.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:83.2,87.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.2,90.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.39,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:93.2,95.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:95.52,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:97.8,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:105.113,110.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:117.2,120.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:120.16,122.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.2,123.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.39,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:126.2,128.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:128.52,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:130.8,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.117,140.135 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:140.135,142.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:146.2,146.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.115,150.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:150.133,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.2,153.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.113,160.131 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:160.131,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.2,163.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:166.2,166.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:173.32,175.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:175.16,178.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.2,179.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.26,182.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.2,183.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.70,186.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.2,187.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.70,190.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:191.2,191.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -6769,131 +10365,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -6932,29 +10493,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 @@ -7179,83 +10740,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -7347,6 +10953,11 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 25 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -7402,11 +11013,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 2 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -7736,39 +11347,189 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.82,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:32.55,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:38.64,40.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:43.2,43.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:46.76,49.16 3 66 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.16,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.8,51.36 1 65 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:51.36,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.2,54.17 1 65 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:54.17,56.3 1 46 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:57.2,58.26 2 65 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:61.86,62.48 1 49 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.48,64.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:65.2,65.50 1 44 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:68.54,70.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:70.44,72.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:73.2,73.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:76.110,83.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:83.75,85.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.31,88.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:88.9,92.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:93.3,97.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:100.2,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:106.95,112.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:112.22,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:116.2,122.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,126.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.31,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.2,135.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 66 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 65 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 65 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 46 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 65 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 49 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 44 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 @@ -7784,131 +11545,96 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,61.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:61.16,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.2,66.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:66.16,68.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.2,71.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:71.36,73.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.10,75.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.3,76.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.32,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:78.9,80.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:81.3,81.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.2,87.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:90.72,92.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.16,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:96.2,97.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:97.16,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:101.2,102.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:102.62,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.2,105.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.75,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:114.2,115.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:118.55,120.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.16,122.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.2,123.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.91,128.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.16,130.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:132.2,134.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.50,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:138.2,141.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.29,142.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:142.18,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.2,147.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:147.69,149.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.17,152.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:154.2,155.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:158.117,160.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.2,164.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:164.16,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:178.2,182.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:185.92,187.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.16,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:190.2,191.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:163.115,170.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:170.16,172.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:173.2,174.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:178.2,179.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:179.29,181.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:181.10,188.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.3,189.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:189.44,191.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:192.3,193.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:193.17,195.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:196.3,196.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.2,199.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:199.30,202.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:203.2,203.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:206.46,208.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/wallet.go:210.48,212.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:11.101,12.50 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:12.50,14.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:16.2,17.98 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:17.98,19.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:19.8,24.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:27.102,29.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:29.16,31.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:33.2,34.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:37.2,37.22 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:40.128,41.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:41.29,45.3 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:45.8,46.39 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:46.39,48.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account.go:49.3,51.19 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 2 @@ -7947,29 +11673,29 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:42.55,44.2 1 34 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:46.44,48.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:50.54,54.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:56.63,58.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:58.16,60.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:61.2,61.19 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:70.70,71.39 1 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.39,73.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:74.2,75.12 2 105 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:78.97,83.18 4 117 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:83.18,85.3 1 115 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.30 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.30,89.17 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:89.17,91.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:92.3,92.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:94.2,94.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:97.124,103.16 5 33 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:103.16,105.3 1 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:106.2,107.15 2 22 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:107.15,109.20 2 22 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:109.20,111.4 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:111.9,113.4 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:115.2,115.40 1 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 105 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 119 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 117 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 33 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 22 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 2 @@ -8194,83 +11920,128 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:24.97,26.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:28.98,32.59 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:32.59,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:36.2,37.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.28,39.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.2,41.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:41.16,43.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:43.8,45.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:48.133,54.59 5 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:54.59,56.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.2,58.70 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:58.70,60.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.8,60.23 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:60.23,62.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:64.2,70.26 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:70.26,72.4 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.2,73.16 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:73.16,75.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:75.8,77.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:80.80,82.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:82.28,84.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.2,85.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:85.16,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:87.8,89.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:92.74,94.26 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:94.26,96.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:99.122,103.16 3 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:103.16,105.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:107.2,108.34 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.34,110.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.2,111.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:111.16,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:115.2,116.38 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.38,119.4 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.2,120.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:124.2,129.16 6 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:129.16,130.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.72,132.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:134.2,143.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:146.99,154.26 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:154.26,156.4 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.2,157.16 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:157.16,159.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:161.2,162.28 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.28,164.4 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.2,165.16 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:165.16,167.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:169.2,170.26 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.26,172.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.2,173.16 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:173.16,175.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:177.2,177.75 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:23.94,25.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:27.55,29.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:31.117,33.65 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:33.65,35.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:36.2,37.87 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:40.68,42.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:44.68,46.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:46.16,49.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:50.2,51.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.16,54.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:55.2,56.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.16,59.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:60.2,61.77 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:64.131,70.52 5 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:70.52,72.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:74.2,77.77 3 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:77.77,79.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.2,81.85 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:81.85,83.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:85.2,93.67 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:93.67,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.2,96.71 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:96.71,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:99.2,99.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -8362,6 +12133,11 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 32 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -8417,11 +12193,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitco github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 5 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:29.63,31.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:32.40,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:53.107,55.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:55.19,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:58.2,58.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 @@ -8530,3 +12306,46 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 5 diff --git a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go index b9850d2c..51154ad6 100644 --- a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go +++ b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet_test.go @@ -12,6 +12,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/entities" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -258,6 +259,18 @@ func TestBitcoindWallet_SendWithOpReturn(t *testing.T) { client.AssertExpectations(t) } +func TestBitcoindWallet_SendWithOpReturn_InvalidAddress(t *testing.T) { + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, &mocks.ClientAdapterMock{}), mockAddress, mockFeeRate, true, mockPassword) + txHash, err := rpc.SendWithOpReturn(test.AnyString, entities.NewWei(500000000000000000), []byte{}) + require.Error(t, err) + assert.Empty(t, txHash) +} + +func TestBitcoindWallet_Address(t *testing.T) { + rpc := bitcoin.NewBitcoindWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, &mocks.ClientAdapterMock{}), mockAddress, mockFeeRate, true, mockPassword) + assert.Equal(t, mockAddress, rpc.Address()) +} + func TestBitcoindWallet_SendWithOpReturn_ErrorHandling(t *testing.T) { setups := sendWithOpReturnErrorSetups() for _, setup := range setups { diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go b/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go index 1c015d11..6e97cdfd 100644 --- a/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go +++ b/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go @@ -9,18 +9,25 @@ import ( "github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils" log "github.com/sirupsen/logrus" "net/http" "time" ) type BtcSuiteClientAdapter struct { - *rpcclient.Client - config rpcclient.ConnConfig + RpcClient + config rpcclient.ConnConfig + httpClient utils.HttpClient } -func NewBtcSuiteClientAdapter(config rpcclient.ConnConfig, client *rpcclient.Client) *BtcSuiteClientAdapter { - return &BtcSuiteClientAdapter{config: config, Client: client} +func NewBtcSuiteClientAdapter(config rpcclient.ConnConfig, client RpcClient) *BtcSuiteClientAdapter { + return &BtcSuiteClientAdapter{config: config, RpcClient: client} +} + +// SetClient sets the http client to be used by the adapter, only for testing purposes +func (c *BtcSuiteClientAdapter) SetClient(httpClient utils.HttpClient) { + c.httpClient = httpClient } func (c *BtcSuiteClientAdapter) signRawTransactionWithKeyAsync(tx *wire.MsgTx, privateKeysWIFs []string) FutureSignRawTransactionWithKeyResult { @@ -54,7 +61,7 @@ func (c *BtcSuiteClientAdapter) CreateReadonlyWallet(bodyParams ReadonlyWalletRe Jsonrpc: btcjson.RpcVersion1, Method: "createwallet", Params: bodyParams, - ID: c.Client.NextID(), + ID: c.NextID(), } bodyBytes, err = json.Marshal(body) @@ -70,16 +77,22 @@ func (c *BtcSuiteClientAdapter) CreateReadonlyWallet(bodyParams ReadonlyWalletRe } req.SetBasicAuth(c.config.User, c.config.Pass) - res, err := http.DefaultClient.Do(req) + if c.httpClient == nil { + c.httpClient = http.DefaultClient + } + + // we're alreay closing the body in utils.CloseBodyIfExists + // nolint:bodyclose + res, err := c.httpClient.Do(req) if err != nil { return err } - defer func() { - if err = res.Body.Close(); err != nil { - log.Error("Error closing response body: ", err) - } - }() + defer utils.CloseBodyIfExists(res) + + if res == nil || res.Body == nil { + return fmt.Errorf("received emtpy response from RPC server on createwallet") + } err = json.NewDecoder(res.Body).Decode(&response) if err != nil { diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/adapter_test.go b/internal/adapters/dataproviders/bitcoin/btcclient/adapter_test.go new file mode 100644 index 00000000..ec3a2541 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/btcclient/adapter_test.go @@ -0,0 +1,138 @@ +package btcclient_test + +import ( + "bytes" + "context" + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "io" + "net/http" + "testing" +) + +const testString = "test" + +var createWalletError = []byte("{\n \"result\": null,\n \"error\": {\n \"code\": -4,\n \"message\": \"Wallet file verification failed. Failed to create database path '/home/bitcoin/.bitcoin/regtest/wallets/postman5'. Database already exists.\"\n },\n \"id\": \"curltest\"\n}") +var createWalletResponse = []byte("{\n \"result\": {\n \"name\": \"postman\",\n \"warning\": \"Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.\"\n },\n \"error\": null,\n \"id\": \"curltest\"\n}") +var createWalletParams = btcclient.ReadonlyWalletRequest{ + WalletName: test.AnyString, + DisablePrivateKeys: true, + Blank: true, + AvoidReuse: true, + Descriptors: true, +} + +func TestBtcSuiteClientAdapter_CreateReadonlyWallet(t *testing.T) { + client := &mocks.RpcClientMock{} + httpClient := &mocks.HttpClientMock{} + adapter := btcclient.NewBtcSuiteClientAdapter( + rpcclient.ConnConfig{DisableTLS: true, Host: testString + ":1234", User: testString, Pass: testString}, + client, + ) + adapter.SetClient(httpClient) + client.On("NextID").Return(uint64(1)) + reqBody, err := json.Marshal(btcclient.RpcRequestParamsObject[btcclient.ReadonlyWalletRequest]{ + Jsonrpc: btcjson.RpcVersion1, + Method: "createwallet", + Params: createWalletParams, + ID: 1, + }) + require.NoError(t, err) + req, err := http.NewRequestWithContext( + context.Background(), + http.MethodPost, + "http://test:1234", + bytes.NewReader(reqBody), + ) + require.NoError(t, err) + req.SetBasicAuth(testString, testString) + httpClient.On("Do", mock.MatchedBy(func(r *http.Request) bool { + receivedBody, readErr := io.ReadAll(r.Body) + require.NoError(t, readErr) + expectedBody, readErr := io.ReadAll(req.Body) + require.NoError(t, readErr) + return req.URL.String() == r.URL.String() && bytes.Equal(receivedBody, expectedBody) && r.Method == req.Method + })).Return(&http.Response{ + Status: "OK", + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewReader(createWalletResponse)), + ContentLength: int64(len(createWalletResponse)), + }, nil) + err = adapter.CreateReadonlyWallet(createWalletParams) + require.NoError(t, err) + client.AssertExpectations(t) + httpClient.AssertExpectations(t) +} + +func TestBtcSuiteClientAdapter_CreateReadonlyWallet_ErrorHanlding(t *testing.T) { + t.Run("RPC server error", func(t *testing.T) { + client := &mocks.RpcClientMock{} + httpClient := &mocks.HttpClientMock{} + adapter := btcclient.NewBtcSuiteClientAdapter( + rpcclient.ConnConfig{DisableTLS: true, Host: testString + ":1234", User: testString, Pass: testString}, + client, + ) + adapter.SetClient(httpClient) + client.On("NextID").Return(uint64(1)) + + httpClient.On("Do", mock.Anything).Return(&http.Response{ + Status: "Internal server error", + StatusCode: http.StatusInternalServerError, + }, nil) + err := adapter.CreateReadonlyWallet(createWalletParams) + require.Error(t, err) + client.AssertExpectations(t) + httpClient.AssertExpectations(t) + }) + t.Run("RPC client error", func(t *testing.T) { + client := &mocks.RpcClientMock{} + httpClient := &mocks.HttpClientMock{} + adapter := btcclient.NewBtcSuiteClientAdapter( + rpcclient.ConnConfig{DisableTLS: false, Host: testString + ":1234", User: testString, Pass: testString}, + client, + ) + adapter.SetClient(httpClient) + client.On("NextID").Return(uint64(1)) + + httpClient.On("Do", mock.MatchedBy(func(r *http.Request) bool { + return r.URL.String() == "https://test:1234" + })).Return(&http.Response{ + Status: "Bad request", + StatusCode: http.StatusBadRequest, + Body: io.NopCloser(bytes.NewReader(createWalletError)), + ContentLength: int64(len(createWalletError)), + }, nil) + err := adapter.CreateReadonlyWallet(createWalletParams) + require.Error(t, err) + client.AssertExpectations(t) + httpClient.AssertExpectations(t) + }) +} + +func TestBtcSuiteClientAdapter_SignRawTransactionWithKey(t *testing.T) { + keys := []string{"key"} + client := &mocks.RpcClientMock{} + receiveChannel := make(chan *rpcclient.Response, 1) + client.On("SendCmd", &btcclient.SignRawTransactionWithKeyCmd{RawTx: rawTx, WifKeys: keys}). + Return(receiveChannel) + adapter := btcclient.NewBtcSuiteClientAdapter( + rpcclient.ConnConfig{DisableTLS: true, Host: testString + ":1234", User: testString, Pass: testString}, + client, + ) + tx := &wire.MsgTx{} + txBytes, err := hex.DecodeString(rawTx) + require.NoError(t, err) + err = tx.DeserializeNoWitness(bytes.NewReader(txBytes)) + require.NoError(t, err) + receiveChannel <- &rpcclient.Response{} + _, _, _ = adapter.SignRawTransactionWithKey(tx, keys) + client.AssertExpectations(t) +} diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/binding.go b/internal/adapters/dataproviders/bitcoin/btcclient/binding.go index 35c5e9ef..8d244263 100644 --- a/internal/adapters/dataproviders/bitcoin/btcclient/binding.go +++ b/internal/adapters/dataproviders/bitcoin/btcclient/binding.go @@ -38,6 +38,8 @@ type RpcWallet interface { type RpcClient interface { RpcWallet + SendCmd(cmd interface{}) chan *rpcclient.Response + NextID() uint64 Ping() error Disconnect() GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRawResult, error) diff --git a/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key_test.go b/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key_test.go new file mode 100644 index 00000000..095979d5 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key_test.go @@ -0,0 +1,39 @@ +package btcclient_test + +import ( + "fmt" + "github.com/btcsuite/btcd/rpcclient" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "reflect" + "testing" + "unsafe" +) + +var ( + rawTx = "0200000001fef3d290059610a55329af5c7ae7074b4ccc3d19ece35cb04a6bc2c86d9d838f000000006a4730440220340159e3afac48b843b123b744e1b04faea64c274338dfc5f0e056ea4b09290e0220091e5568b6b0180aff47d384bf74b62d646159999a6ea770f0639a0acc07ca5801210232858a5faa413101831afe7a880da9a8ac4de6bd5e25b4358d762ba450b03c22fdffffff0280969800000000001976a914ba99c16de3f21befa3f43c1b0d257121f57a8f3188aceecaf505000000001976a914ddb677f36498f7a4901a74e882df68fd00cf473588ac00000000" + signWithKeyResponse = []byte(fmt.Sprintf("{\n \"hex\": \"%s\",\n \"complete\": true\n}", rawTx)) +) + +func TestFutureSignRawTransactionWithKeyResult_Receive(t *testing.T) { + channel := make(btcclient.FutureSignRawTransactionWithKeyResult, 0) + responseBytes := signWithKeyResponse + res := &rpcclient.Response{} + + // setting value using reflection since is a private field (from the library) and there is no other way to test this + field := reflect.ValueOf(res).Elem().FieldByName("result") + reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())). + Elem(). + Set(reflect.ValueOf(responseBytes)) + + go func() { channel <- res }() + tx, complete, err := channel.Receive() + + require.NoError(t, err) + assert.True(t, complete) + assert.NotNil(t, tx) + assert.Equal(t, "011b335a6c020543b42e801fac566d44e089cfa74ee2df44956be075ddd29691", tx.TxHash().String()) + assert.Len(t, tx.TxOut, 2) + assert.Len(t, tx.TxIn, 1) +} diff --git a/internal/adapters/dataproviders/bitcoin/common.go b/internal/adapters/dataproviders/bitcoin/common.go index 21cb1e9c..f687c3f3 100644 --- a/internal/adapters/dataproviders/bitcoin/common.go +++ b/internal/adapters/dataproviders/bitcoin/common.go @@ -18,8 +18,8 @@ import ( const ( BtcToSatoshi = 100000000 - maxConfirmationsForUtxos = 9999999 - minConfirmationsForUtxos = 1 + MaxConfirmationsForUtxos = 9999999 + MinConfirmationsForUtxos = 1 ) func DecodeAddressBase58(address string, keepVersion bool) ([]byte, error) { @@ -123,7 +123,7 @@ func getTransactionsToAddress(address string, params *chaincfg.Params, client bt if err != nil { return nil, err } - utxos, err := client.ListUnspentMinMaxAddresses(0, maxConfirmationsForUtxos, []btcutil.Address{parsedAddress}) + utxos, err := client.ListUnspentMinMaxAddresses(0, MaxConfirmationsForUtxos, []btcutil.Address{parsedAddress}) if err != nil { return nil, err } diff --git a/internal/adapters/dataproviders/bitcoin/common_test.go b/internal/adapters/dataproviders/bitcoin/common_test.go index dff68fb8..e7b18027 100644 --- a/internal/adapters/dataproviders/bitcoin/common_test.go +++ b/internal/adapters/dataproviders/bitcoin/common_test.go @@ -1,36 +1,12 @@ package bitcoin_test import ( - "context" - "github.com/btcsuite/btcd/chaincfg" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" - "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) -func TestConnection_CheckConnection(t *testing.T) { - networkParams := &chaincfg.Params{} - client := &mocks.ClientAdapterMock{} - client.On("Ping").Return(assert.AnError).Once() - client.On("Ping").Return(nil).Once() - conn := bitcoin.NewConnection(networkParams, client) - conn.CheckConnection(context.Background()) - conn.CheckConnection(context.Background()) - client.AssertExpectations(t) -} - -func TestConnection_Shutdown(t *testing.T) { - endChannel := make(chan bool) - client := &mocks.ClientAdapterMock{} - client.On("Disconnect").Once() - conn := bitcoin.NewConnection(&chaincfg.Params{}, client) - go conn.Shutdown(endChannel) - <-endChannel - client.AssertExpectations(t) -} - var decodedAddresses = []struct { address string expected []byte diff --git a/internal/adapters/dataproviders/bitcoin/connection_test.go b/internal/adapters/dataproviders/bitcoin/connection_test.go new file mode 100644 index 00000000..3367e9ef --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/connection_test.go @@ -0,0 +1,47 @@ +package bitcoin_test + +import ( + "context" + "github.com/btcsuite/btcd/chaincfg" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestNewConnection(t *testing.T) { + networkParams := &chaincfg.Params{} + client := &mocks.ClientAdapterMock{} + + regularConnection := bitcoin.NewConnection(networkParams, client) + assert.NotNil(t, regularConnection) + assert.Equal(t, networkParams, regularConnection.NetworkParams) + assert.Empty(t, regularConnection.WalletId) + + walletConnection := bitcoin.NewWalletConnection(networkParams, client, test.AnyString) + assert.NotNil(t, walletConnection) + assert.Equal(t, networkParams, walletConnection.NetworkParams) + assert.Equal(t, test.AnyString, walletConnection.WalletId) +} + +func TestConnection_CheckConnection(t *testing.T) { + networkParams := &chaincfg.Params{} + client := &mocks.ClientAdapterMock{} + client.On("Ping").Return(assert.AnError).Once() + client.On("Ping").Return(nil).Once() + conn := bitcoin.NewConnection(networkParams, client) + conn.CheckConnection(context.Background()) + conn.CheckConnection(context.Background()) + client.AssertExpectations(t) +} + +func TestConnection_Shutdown(t *testing.T) { + endChannel := make(chan bool) + client := &mocks.ClientAdapterMock{} + client.On("Disconnect").Once() + conn := bitcoin.NewConnection(&chaincfg.Params{}, client) + go conn.Shutdown(endChannel) + <-endChannel + client.AssertExpectations(t) +} diff --git a/internal/adapters/dataproviders/bitcoin/derivative_wallet.go b/internal/adapters/dataproviders/bitcoin/derivative_wallet.go index 29fc2c68..fba0f50a 100644 --- a/internal/adapters/dataproviders/bitcoin/derivative_wallet.go +++ b/internal/adapters/dataproviders/bitcoin/derivative_wallet.go @@ -55,7 +55,7 @@ func (wallet *DerivativeWallet) initWallet() error { return err } } - _, ok := any(info.Scanning).(btcjson.ScanProgress) + _, ok := info.Scanning.Value.(btcjson.ScanProgress) if ok { return errors.New("wallet is still scanning, please wait for the scan to finish before initializing the server again") } @@ -160,8 +160,8 @@ func (wallet *DerivativeWallet) GetBalance() (*entities.Wei, error) { } utxos, err := wallet.conn.client.ListUnspentMinMaxAddresses( - minConfirmationsForUtxos, - maxConfirmationsForUtxos, + MinConfirmationsForUtxos, + MaxConfirmationsForUtxos, []btcutil.Address{btcAddress}, ) if err != nil { @@ -172,7 +172,9 @@ func (wallet *DerivativeWallet) GetBalance() (*entities.Wei, error) { if amount, err = btcutil.NewAmount(utxo.Amount); err != nil { return nil, err } - balance.Add(balance, entities.SatoshiToWei(uint64(amount.ToUnit(btcutil.AmountSatoshi)))) + if utxo.Confirmations > 0 { + balance.Add(balance, entities.SatoshiToWei(uint64(amount.ToUnit(btcutil.AmountSatoshi)))) + } } return balance, nil } @@ -250,13 +252,20 @@ func (wallet *DerivativeWallet) Unlock() error { } func (wallet *DerivativeWallet) estimateFeeRate() (*float64, error) { - const confirmationTargetForEstimation = 1 + const ( + confirmationTargetForEstimation = 1 + extraFeeMultiplier = 0.1 + ) estimationResult, err := wallet.conn.client.EstimateSmartFee(confirmationTargetForEstimation, &btcjson.EstimateModeConservative) if err != nil { return nil, err } else if len(estimationResult.Errors) != 0 { return nil, errors.New(estimationResult.Errors[0]) } + // add 10% to the fee rate if result still over the target for the estimation + if estimationResult.Blocks > confirmationTargetForEstimation { + return btcjson.Float64(*estimationResult.FeeRate + *estimationResult.FeeRate*extraFeeMultiplier), nil + } return estimationResult.FeeRate, nil } diff --git a/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go b/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go new file mode 100644 index 00000000..a96939cf --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go @@ -0,0 +1,650 @@ +package bitcoin_test + +import ( + "cmp" + "encoding/json" + "errors" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math/big" + "os" + "path/filepath" + "slices" + "testing" +) + +const ( + btcAddress = "n1jGDaxCW6jemLZyd9wmDHddseZwEMV9C6" + pubKey = "0232858a5faa413101831afe7a880da9a8ac4de6bd5e25b4358d762ba450b03c22" + changePosition = 2 + feeRate = 0.0001 +) + +var ( + walletNotFoundErr = errors.New("wallet not found") + rawExistingAddress = []byte("{\n \"address\": \"n1jGDaxCW6jemLZyd9wmDHddseZwEMV9C6\",\n \"scriptPubKey\": \"76a914ddb677f36498f7a4901a74e882df68fd00cf473588ac\",\n \"ismine\": false,\n \"solvable\": true,\n \"desc\": \"pkh([ddb677f3]0232858a5faa413101831afe7a880da9a8ac4de6bd5e25b4358d762ba450b03c22)#ts3jjdae\",\n \"iswatchonly\": true,\n \"isscript\": false,\n \"iswitness\": false,\n \"pubkey\": \"0232858a5faa413101831afe7a880da9a8ac4de6bd5e25b4358d762ba450b03c22\",\n \"iscompressed\": true,\n \"ischange\": false,\n \"timestamp\": 1,\n \"labels\": [\n \"\"\n ]\n}") + rawNonExistingAddress = []byte("{\n \"address\": \"mjaGtyj74LYn7gApr17prZxDPDnfuUnRa5\",\n \"scriptPubKey\": \"76a9142c81478132b5dda64ffc484a0d225096c4b22ad588ac\",\n \"ismine\": false,\n \"solvable\": false,\n \"iswatchonly\": false,\n \"isscript\": false,\n \"iswitness\": false,\n \"ischange\": false,\n \"labels\": [\n ]\n}") +) + +func TestNewDerivativeWallet(t *testing.T) { + existingAddressInfo := new(btcjson.GetAddressInfoResult) + nonExistingAddressInfo := new(btcjson.GetAddressInfoResult) + e := existingAddressInfo.UnmarshalJSON(rawExistingAddress) + require.NoError(t, e) + e = nonExistingAddressInfo.UnmarshalJSON(rawNonExistingAddress) + require.NoError(t, e) + + rskAccount := test.OpenDerivativeWalletForTest(t, "derivative-wallet-creation") + t.Run("Fail if doesn't have RSK wallet id", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewConnection(&chaincfg.TestNet3Params, client), &account.RskAccount{}) + require.ErrorContains(t, err, "derivative wallet can only be created with wallet id rsk-wallet") + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Fail if RSK account doesn't have derivation enabled", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), &account.RskAccount{}) + require.ErrorContains(t, err, "derivative wallet can only be used if RSK account has derivation enabled") + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Load wallet if not loaded", func(t *testing.T) { testLoadWallet(t, rskAccount, existingAddressInfo) }) + t.Run("Creates watch-only wallet if not exists", func(t *testing.T) { testCreateWatchOnlyWallet(t, rskAccount, existingAddressInfo) }) + t.Run("Imports pubkey if not imported and starts rescan", func(t *testing.T) { testImportPubKeyAndRescan(t, rskAccount, nonExistingAddressInfo) }) + t.Run("Returns error if wallet is scanning", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{ + WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: btcjson.ScanProgress{Duration: 5, Progress: 50}}, + }, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.ErrorContains(t, err, "wallet is still scanning") + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Starts normally if wallet is created and key is imported", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(existingAddressInfo, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + assert.NotNil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Error handling", func(t *testing.T) { derivativeWalleCreationtErrorHandlingTests(t, rskAccount, nonExistingAddressInfo) }) +} + +func derivativeWalleCreationtErrorHandlingTests(t *testing.T, rskAccount *account.RskAccount, nonExistingAddressInfo *btcjson.GetAddressInfoResult) { + t.Run("Error creating wallet", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, walletNotFoundErr).Once() + client.On("LoadWallet", bitcoin.DerivativeWalletId).Return(nil, walletNotFoundErr).Once() + client.On("CreateReadonlyWallet", mock.Anything).Return(assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.ErrorContains(t, err, "error while creating rsk-wallet wallet") + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Error getting address info", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.Error(t, err) + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Error importing pubkey", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, walletNotFoundErr).Once() + client.On("LoadWallet", bitcoin.DerivativeWalletId).Return(nil, walletNotFoundErr).Once() + client.On("CreateReadonlyWallet", mock.Anything).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(nonExistingAddressInfo, nil).Once() + client.On("ImportPubKey", pubKey).Return(assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.Error(t, err) + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("Error starting rescan", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, walletNotFoundErr).Once() + client.On("LoadWallet", bitcoin.DerivativeWalletId).Return(nil, walletNotFoundErr).Once() + client.On("CreateReadonlyWallet", mock.Anything).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(nonExistingAddressInfo, nil).Once() + client.On("ImportPubKey", pubKey).Return(nil).Once() + client.On("ImportAddressRescan", btcAddress, "", true).Return(assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.Error(t, err) + assert.Nil(t, wallet) + client.AssertExpectations(t) + }) +} + +func testLoadWallet(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, walletNotFoundErr).Once() + client.On("LoadWallet", bitcoin.DerivativeWalletId).Return(nil, nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + assert.NotNil(t, wallet) + client.AssertExpectations(t) +} + +func testCreateWatchOnlyWallet(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, walletNotFoundErr).Once() + client.On("LoadWallet", bitcoin.DerivativeWalletId).Return(nil, walletNotFoundErr).Once() + client.On("CreateReadonlyWallet", btcclient.ReadonlyWalletRequest{ + WalletName: bitcoin.DerivativeWalletId, DisablePrivateKeys: true, Blank: true, AvoidReuse: false, Descriptors: false, + }).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + assert.NotNil(t, wallet) + client.AssertExpectations(t) +} + +func testImportPubKeyAndRescan(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, walletNotFoundErr).Once() + client.On("LoadWallet", bitcoin.DerivativeWalletId).Return(nil, walletNotFoundErr).Once() + client.On("CreateReadonlyWallet", btcclient.ReadonlyWalletRequest{ + WalletName: bitcoin.DerivativeWalletId, DisablePrivateKeys: true, Blank: true, AvoidReuse: false, Descriptors: false, + }).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + client.On("ImportPubKey", pubKey).Return(nil).Once() + client.On("ImportAddressRescan", btcAddress, "", true).Return(nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.ErrorContains(t, err, "public key imported, rescan started") + assert.Nil(t, wallet) + client.AssertExpectations(t) +} + +func TestDerivativeWallet(t *testing.T) { + existingAddressInfo := new(btcjson.GetAddressInfoResult) + nonExistingAddressInfo := new(btcjson.GetAddressInfoResult) + e := existingAddressInfo.UnmarshalJSON(rawExistingAddress) + require.NoError(t, e) + e = nonExistingAddressInfo.UnmarshalJSON(rawNonExistingAddress) + require.NoError(t, e) + rskAccount := test.OpenDerivativeWalletForTest(t, "derivative-wallet") + + t.Run("Address", func(t *testing.T) { testAddress(t, rskAccount, existingAddressInfo) }) + t.Run("Unlock", func(t *testing.T) { testUnlock(t, rskAccount, existingAddressInfo) }) + t.Run("ImportAddress", func(t *testing.T) { testImportAddress(t, rskAccount, existingAddressInfo) }) + + t.Run("GetTransactions", func(t *testing.T) { + t.Run("Success", func(t *testing.T) { testGetTransactions(t, rskAccount, existingAddressInfo) }) + }) + + t.Run("GetBalance", func(t *testing.T) { + t.Run("Success", func(t *testing.T) { testGetBalance(t, rskAccount, existingAddressInfo) }) + }) + + t.Run("EstimateTxFees", func(t *testing.T) { + t.Run("Success", func(t *testing.T) { testEstimateFees(t, rskAccount, existingAddressInfo) }) + t.Run("Add extra value if estimation blocks is higher than the target", func(t *testing.T) { testEstimateFeesExtra(t, rskAccount, existingAddressInfo) }) + t.Run("Error handling", func(t *testing.T) { + cases := derivativeWalletEstimateTxFeesErrorSetups(rskAccount) + for _, testCase := range cases { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(existingAddressInfo, nil).Once() + t.Run(testCase.description, func(t *testing.T) { + testCase.setup(t, client) + }) + } + }) + }) + + t.Run("SendWithOpReturn", func(t *testing.T) { + t.Run("Success", func(t *testing.T) { testSendWithOpReturn(t, rskAccount, existingAddressInfo) }) + t.Run("Error handling", func(t *testing.T) { + cases := derivativeWalletSendWithOpReturnErrorSetups(rskAccount) + for _, testCase := range cases { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(existingAddressInfo, nil).Once() + t.Run(testCase.description, func(t *testing.T) { + testCase.setup(t, client) + }) + } + }) + }) +} + +func testUnlock(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + err = wallet.Unlock() + require.ErrorContains(t, err, "derivative wallet does not support unlocking as it is a watch-only wallet") +} + +func testImportAddress(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + err = wallet.ImportAddress("n12ja1bZfZhpkxy8KHkQvj6rZM74kbhUWs") + require.ErrorContains(t, err, "address importing is not supported in this type of wallet") +} + +func testAddress(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + assert.Equal(t, btcAddress, wallet.Address()) +} + +func testGetBalance(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + parsedAddress, err := btcutil.DecodeAddress(btcAddress, &chaincfg.TestNet3Params) + require.NoError(t, err) + client.On("ListUnspentMinMaxAddresses", bitcoin.MinConfirmationsForUtxos, bitcoin.MaxConfirmationsForUtxos, mock.MatchedBy(func(addresses []btcutil.Address) bool { + return len(addresses) == 1 && addresses[0].EncodeAddress() == parsedAddress.EncodeAddress() + })).Return([]btcjson.ListUnspentResult{ + {Amount: 50000000, Confirmations: 1}, + {Amount: 80000000, Confirmations: 3}, + {Amount: 50000000, Confirmations: 0}, + {Amount: 30000000, Confirmations: 2}, + }, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + balance, err := wallet.GetBalance() + require.NoError(t, err) + expected := new(big.Int) + expected.SetString("160000000000000000000000000", 10) + require.Equal(t, entities.NewBigWei(expected), balance) + client.AssertExpectations(t) +} + +func testGetTransactions(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + absolutePath, err := filepath.Abs("../../../../test/mocks/listUnspentByAddress.json") + require.NoError(t, err) + rpcResponse, err := os.ReadFile(absolutePath) + require.NoError(t, err) + var result []btcjson.ListUnspentResult + err = json.Unmarshal(rpcResponse, &result) + require.NoError(t, err) + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + parsedAddress, err := btcutil.DecodeAddress(testnetAddress, &chaincfg.TestNet3Params) + require.NoError(t, err) + client.On("ListUnspentMinMaxAddresses", 0, 9999999, []btcutil.Address{parsedAddress}).Return(result, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + transactions, err := wallet.GetTransactions(testnetAddress) + require.NoError(t, err) + slices.SortFunc(transactions, func(i, j blockchain.BitcoinTransactionInformation) int { + return cmp.Compare(i.Hash, j.Hash) + }) + assert.Equal(t, []blockchain.BitcoinTransactionInformation{ + { + Hash: "2ba6da53badd14349c5d6379e88c345e88193598aad714815d4b57c691a9fbdf", + Confirmations: 2439, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(2531000000000000)}, + }, + }, + { + Hash: "586c51dc94452aed9a373b0f52936c3e343c0db90f1155e985fd60e3c2e5c2b2", + Confirmations: 6, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(2000000000000000)}, + }, + }, + { + Hash: "da28401c76d618e8c3b1c3e15dfe1c10d4b24875f23768f30bcc26c99b9c82d4", + Confirmations: 2, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(200000000000000), entities.NewWei(1000000000000000), entities.NewWei(1000000000000000)}, + }, + }, + { + Hash: "fda421ccdff7324a382067d1746f6a387132435de6af336a0ebbf3f720eaae4d", + Confirmations: 6, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(20000000000000000)}, + }, + }, + }, transactions) + client.AssertExpectations(t) +} + +func testEstimateFees(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + amount := entities.NewWei(5000000000000000) + floatAmount, _ := amount.ToRbtc().Float64() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + client.On("EstimateSmartFee", int64(1), &btcjson.EstimateModeConservative).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("WalletCreateFundedPsbt", + ([]btcjson.PsbtInput)(nil), + []btcjson.PsbtOutput{ + {testnetAddress: floatAmount}, + {"data": "0000000000000000000000000000000000000000000000000000000000000000"}, + }, + (*uint32)(nil), + &btcjson.WalletCreateFundedPsbtOpts{ + ChangeAddress: btcjson.String(btcAddress), + ChangePosition: btcjson.Int64(changePosition), + IncludeWatching: btcjson.Bool(true), + FeeRate: btcjson.Float64(feeRate), + }, + (*bool)(nil), + ).Return(&btcjson.WalletCreateFundedPsbtResult{Fee: 0.0006}, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + fee, err := wallet.EstimateTxFees(testnetAddress, amount) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(600000000000000), fee) + client.AssertExpectations(t) +} + +func testEstimateFeesExtra(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + amount := entities.NewWei(5000000000000000) + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + client.On("EstimateSmartFee", int64(1), &btcjson.EstimateModeConservative).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 2}, nil).Once() + client.On("WalletCreateFundedPsbt", + mock.Anything, + mock.Anything, + mock.Anything, + &btcjson.WalletCreateFundedPsbtOpts{ + ChangeAddress: btcjson.String(btcAddress), + ChangePosition: btcjson.Int64(changePosition), + IncludeWatching: btcjson.Bool(true), + FeeRate: btcjson.Float64(0.00011), + }, + mock.Anything, + ).Return(&btcjson.WalletCreateFundedPsbtResult{Fee: 0.0006}, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + fee, err := wallet.EstimateTxFees(testnetAddress, amount) + require.NoError(t, err) + assert.Equal(t, entities.NewWei(600000000000000), fee) + client.AssertExpectations(t) +} + +func testSendWithOpReturn(t *testing.T, rskAccount *account.RskAccount, addressInfo *btcjson.GetAddressInfoResult) { + client := &mocks.ClientAdapterMock{} + value := entities.NewWei(600000000000000000) + satoshis, _ := value.ToSatoshi().Float64() + address, err := btcutil.DecodeAddress(testnetAddress, &chaincfg.TestNet3Params) + require.NoError(t, err) + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{WalletName: bitcoin.DerivativeWalletId, Scanning: btcjson.ScanningOrFalse{Value: false}}, nil).Once() + client.On("GetAddressInfo", btcAddress).Return(addressInfo, nil).Once() + client.On("CreateRawTransaction", + ([]btcjson.TransactionInput)(nil), + mock.MatchedBy(func(outputs map[btcutil.Address]btcutil.Amount) bool { + for k, v := range outputs { + require.Equal(t, address, k) + require.Equal(t, btcutil.Amount(satoshis), v) + } + return len(outputs) == 1 + }), + (*int64)(nil), + ).Return(&wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{{Value: int64(satoshis), PkScript: []byte(paymentScriptMock)}}, + LockTime: 0, + }, nil).Once() + tx := &wire.MsgTx{ + Version: 0, + TxIn: nil, + TxOut: []*wire.TxOut{ + {Value: int64(satoshis), PkScript: []byte(paymentScriptMock)}, + {Value: int64(0), PkScript: []byte{0x6a, 0x05, 0xf1, 0xf2, 0xf3, 0xf4, 0x00}}, + }, + LockTime: 0, + } + client.On("EstimateSmartFee", int64(1), &btcjson.EstimateModeConservative).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("FundRawTransaction", tx, btcjson.FundRawTransactionOpts{ + ChangeAddress: btcjson.String(btcAddress), + ChangePosition: btcjson.Int(changePosition), + IncludeWatching: btcjson.Bool(true), + LockUnspents: btcjson.Bool(true), + FeeRate: btcjson.Float64(feeRate), + Replaceable: btcjson.Bool(true), + }, (*bool)(nil)).Return(&btcjson.FundRawTransactionResult{Transaction: tx, Fee: 50, ChangePosition: 2}, nil).Once() + client.On("SendRawTransaction", tx, false).Return(chainhash.NewHashFromStr(testnetTestTxHash)).Once() + client.On("SignRawTransactionWithKey", tx, mock.MatchedBy(func(pks []string) bool { + return len(pks) == 1 && pks[0] != "" + })).Return(tx, true, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, value, []byte{0xf1, 0xf2, 0xf3, 0xf4, 0x00}) + require.NoError(t, err) + assert.NotEmpty(t, result) + client.AssertExpectations(t) +} + +// nolint:funlen +func derivativeWalletSendWithOpReturnErrorSetups(rskAccount *account.RskAccount) []struct { + description string + setup func(t *testing.T, client *mocks.ClientAdapterMock) +} { + rawTx := &wire.MsgTx{TxOut: []*wire.TxOut{{Value: int64(50000000), PkScript: []byte(paymentScriptMock)}}} + return []struct { + description string + setup func(t *testing.T, client *mocks.ClientAdapterMock) + }{ + { + description: "error parsing address", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(test.AnyString, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error creating raw tx", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error estimating fees", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error estimating fees (RPC error)", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{ + Errors: []string{assert.AnError.Error()}, + }, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error funding raw tx", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("FundRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error funding raw tx", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("FundRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error signing tx", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("FundRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&btcjson.FundRawTransactionResult{Transaction: rawTx, Fee: 50, ChangePosition: 2}, nil).Once() + client.On("SignRawTransactionWithKey", mock.Anything, mock.Anything).Return(nil, false, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error sending tx", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("FundRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&btcjson.FundRawTransactionResult{Transaction: rawTx, Fee: 50, ChangePosition: 2}, nil).Once() + client.On("SignRawTransactionWithKey", mock.Anything, mock.Anything).Return(rawTx, true, nil).Once() + client.On("SendRawTransaction", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error sending tx (incomplete signatures)", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("CreateRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(rawTx, nil).Once() + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(feeRate), Blocks: 1}, nil).Once() + client.On("FundRawTransaction", mock.Anything, mock.Anything, mock.Anything).Return(&btcjson.FundRawTransactionResult{Transaction: rawTx, Fee: 50, ChangePosition: 2}, nil).Once() + client.On("SignRawTransactionWithKey", mock.Anything, mock.Anything).Return(rawTx, false, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn(testnetAddress, entities.NewWei(1), []byte{0xf1}) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + } +} + +func derivativeWalletEstimateTxFeesErrorSetups(rskAccount *account.RskAccount) []struct { + description string + setup func(t *testing.T, client *mocks.ClientAdapterMock) +} { + return []struct { + description string + setup func(t *testing.T, client *mocks.ClientAdapterMock) + }{ + { + description: "estimate for invalid address", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.EstimateTxFees(test.AnyString, entities.NewWei(1)) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error when getting estimation", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.EstimateTxFees(testnetAddress, entities.NewWei(1)) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error when getting estimation (RPC error)", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{ + Errors: []string{assert.AnError.Error()}, + }, nil).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.EstimateTxFees(testnetAddress, entities.NewWei(1)) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + { + description: "error when funding psbt", + setup: func(t *testing.T, client *mocks.ClientAdapterMock) { + client.On("EstimateSmartFee", mock.Anything, mock.Anything).Return(&btcjson.EstimateSmartFeeResult{FeeRate: btcjson.Float64(0.001), Blocks: 1}, nil).Once() + client.On("WalletCreateFundedPsbt", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + wallet, err := bitcoin.NewDerivativeWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.DerivativeWalletId), rskAccount) + require.NoError(t, err) + result, err := wallet.EstimateTxFees(testnetAddress, entities.NewWei(1)) + require.Error(t, err) + assert.Empty(t, result) + client.AssertExpectations(t) + }, + }, + } +} diff --git a/internal/adapters/dataproviders/rootstock/account/account.go b/internal/adapters/dataproviders/rootstock/account/account.go index 6f37ddc8..8c99741f 100644 --- a/internal/adapters/dataproviders/rootstock/account/account.go +++ b/internal/adapters/dataproviders/rootstock/account/account.go @@ -90,7 +90,7 @@ func GetRskAccountWithDerivation(args CreationWithDerivationArgs) (*RskAccount, } func (account *RskAccount) BtcPubKey() (string, error) { - if account.btc.pubKey == nil { + if account.btc == nil || account.btc.pubKey == nil { return "", NoDerivationError } pubKeyBytes := account.btc.pubKey.SerializeCompressed() @@ -98,7 +98,7 @@ func (account *RskAccount) BtcPubKey() (string, error) { } func (account *RskAccount) BtcAddress() (btcutil.Address, error) { - if account.btc == nil { + if account.btc == nil || account.btc.address == nil { return nil, NoDerivationError } return account.btc.address, nil diff --git a/internal/adapters/dataproviders/rootstock/account/account_test.go b/internal/adapters/dataproviders/rootstock/account/account_test.go index 50aa50b5..4946e265 100644 --- a/internal/adapters/dataproviders/rootstock/account/account_test.go +++ b/internal/adapters/dataproviders/rootstock/account/account_test.go @@ -2,6 +2,8 @@ package account_test import ( "fmt" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" "github.com/ethereum/go-ethereum/common" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/rsksmart/liquidity-provider-server/test" @@ -10,6 +12,7 @@ import ( "io" "os" "path/filepath" + "runtime/debug" "testing" "time" ) @@ -19,6 +22,8 @@ const ( keyPath = "../../../../../docker-compose/localstack/local-key.json" ) +var derivationKeystore = fmt.Sprintf("test-account-derivation-%d", time.Now().UnixNano()) + func TestGetAccount(t *testing.T) { testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-account-%d", time.Now().UnixNano())) keyFile, err := os.Open(keyPath) @@ -55,6 +60,86 @@ func TestGetAccount(t *testing.T) { assert.Equal(t, common.HexToAddress(keyAddress), otherAccount.Account.Address) assert.NotNil(t, 1, len(otherAccount.Keystore.Accounts())) }) + t.Run("Hasn't access to derivation methods", func(t *testing.T) { + notDerivativeAccount, e := account.GetRskAccount(account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }) + require.NoError(t, e) + btcAddress, e := notDerivativeAccount.BtcAddress() + require.ErrorIs(t, e, account.NoDerivationError) + assert.Empty(t, btcAddress) + pubKey, e := notDerivativeAccount.BtcPubKey() + require.ErrorIs(t, e, account.NoDerivationError) + assert.Empty(t, pubKey) + e = notDerivativeAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { + return nil + }) + require.ErrorIs(t, e, account.NoDerivationError) + }) +} + +func TestGetRskAccountWithDerivation(t *testing.T) { + testDir := filepath.Join(t.TempDir(), derivationKeystore) + keyFile, err := os.Open(keyPath) + require.NoError(t, err) + + defer func(file *os.File) { closingErr := file.Close(); require.NoError(t, closingErr) }(keyFile) + + keyBytes, err := io.ReadAll(keyFile) + require.NoError(t, err) + t.Run("Create new account", func(t *testing.T) { + account, testError := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }, + BtcParams: &chaincfg.TestNet3Params, + }) + _, noExistError := os.Stat(testDir) + assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") + require.NoError(t, testError) + assert.Equal(t, common.HexToAddress(keyAddress), account.Account.Address) + assert.NotNil(t, 1, len(account.Keystore.Accounts())) + }) + t.Run("Retrieve created account", func(t *testing.T) { + otherAccount, otherError := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }, + BtcParams: &chaincfg.TestNet3Params, + }) + require.NoError(t, otherError) + assert.Equal(t, common.HexToAddress(keyAddress), otherAccount.Account.Address) + assert.NotNil(t, 1, len(otherAccount.Keystore.Accounts())) + }) + t.Run("Has access to derivation methods", func(t *testing.T) { + derivativeAccount, e := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }, + BtcParams: &chaincfg.TestNet3Params, + }) + require.NoError(t, e) + btcAddress, e := derivativeAccount.BtcAddress() + require.NoError(t, e) + assert.NotEmpty(t, btcAddress) + pubKey, e := derivativeAccount.BtcPubKey() + require.NoError(t, e) + assert.NotEmpty(t, pubKey) + e = derivativeAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { return nil }) + require.NoError(t, e) + }) } func TestGetAccount_ErrorHandling(t *testing.T) { @@ -118,3 +203,105 @@ func TestGetAccount_ErrorHandling(t *testing.T) { require.Error(t, err) }) } + +func TestRskAccount(t *testing.T) { + testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-derivation-methods-%d", time.Now().UnixNano())) + keyFile, setupErr := os.Open(keyPath) + require.NoError(t, setupErr) + + defer func(file *os.File) { + closingErr := file.Close() + require.NoError(t, closingErr) + }(keyFile) + + keyBytes, setupErr := io.ReadAll(keyFile) + require.NoError(t, setupErr) + testnetAccount, err := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }, + BtcParams: &chaincfg.TestNet3Params, + }) + require.NoError(t, err) + mainnetAccount, err := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: test.KeyPassword, + }, + BtcParams: &chaincfg.MainNetParams, + }) + require.NoError(t, err) + + t.Run("Test BtcPubKey", func(t *testing.T) { + pubTestnet, errTestnet := testnetAccount.BtcPubKey() + assert.Equal(t, "0232858a5faa413101831afe7a880da9a8ac4de6bd5e25b4358d762ba450b03c22", pubTestnet) + require.NoError(t, errTestnet) + pubMainnet, errMainnet := mainnetAccount.BtcPubKey() + assert.Equal(t, "0232858a5faa413101831afe7a880da9a8ac4de6bd5e25b4358d762ba450b03c22", pubMainnet) + require.NoError(t, errMainnet) + }) + + t.Run("Test BtcAddress", func(t *testing.T) { + testnetAddress, errTestnet := testnetAccount.BtcAddress() + assert.Equal(t, "n1jGDaxCW6jemLZyd9wmDHddseZwEMV9C6", testnetAddress.EncodeAddress()) + require.NoError(t, errTestnet) + mainnetAddress, errMainnet := mainnetAccount.BtcAddress() + assert.Equal(t, "1MDJvXsDh5JPzE6MuayPPNRK1eyEMmmMCW", mainnetAddress.EncodeAddress()) + require.NoError(t, errMainnet) + }) + + t.Run("Test UsePrivateKeyWif", func(t *testing.T) { + testUsePrivateKeyWif(t, testnetAccount, mainnetAccount) + }) +} + +func testUsePrivateKeyWif(t *testing.T, testnetAccount, mainnetAccount *account.RskAccount) { + t.Run("Should secure WIF pointer", func(t *testing.T) { + var testnetPointer, mainnetPointer *btcutil.WIF + + debug.SetPanicOnFault(true) + defer debug.SetPanicOnFault(false) + + err := testnetAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { + testnetPointer = wif + testnetPointer.SerializePubKey() + return nil + }) + require.NoError(t, err) + assert.Panics(t, func() { testnetPointer.SerializePubKey() }) + + err = mainnetAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { + mainnetPointer = wif + mainnetPointer.SerializePubKey() + return nil + }) + require.NoError(t, err) + assert.Panics(t, func() { mainnetPointer.SerializePubKey() }) + }) + t.Run("Should return errors", func(t *testing.T) { + testnetErr := testnetAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { return assert.AnError }) + require.Error(t, testnetErr) + mainnetErr := mainnetAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { return assert.AnError }) + require.Error(t, mainnetErr) + }) + t.Run("Should execute function", func(t *testing.T) { + var testnet, mainnet string + err := testnetAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { + testnet = test.AnyString + return nil + }) + require.NoError(t, err) + err = mainnetAccount.UsePrivateKeyWif(func(wif *btcutil.WIF) error { + mainnet = test.AnyAddress + return nil + }) + require.NoError(t, err) + assert.Equal(t, test.AnyString, testnet) + assert.Equal(t, test.AnyAddress, mainnet) + }) +} diff --git a/internal/adapters/dataproviders/rootstock/rpc_test.go b/internal/adapters/dataproviders/rootstock/rpc_test.go index 999392bc..fb97022f 100644 --- a/internal/adapters/dataproviders/rootstock/rpc_test.go +++ b/internal/adapters/dataproviders/rootstock/rpc_test.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/require" "math/big" "testing" + "time" ) const ( @@ -23,6 +24,7 @@ const ( estimationBaseGas uint64 = 57000 estimationNewAccountGas uint64 = 25000 txHash = "0x0e5a74de4d3f7eceff661d953f75270041c82ba0b0b787ec8daf7d566a53baa5" + blockHash = "0x010203" ) var ( @@ -196,7 +198,7 @@ func TestRskjRpcServer_GetTransactionReceipt(t *testing.T) { GasUsed: 456, CumulativeGasUsed: 123, TxHash: common.HexToHash(txHash), - BlockHash: common.HexToHash("0x010203"), + BlockHash: common.HexToHash(blockHash), BlockNumber: big.NewInt(500), }, nil).Once() parsedToAddress := common.HexToAddress("0x462d7082F3671a3be160638Be3F8c23cA354f48a") @@ -247,7 +249,7 @@ func TestRskjRpcServer_GetTransactionReceipt_ErrorHandling(t *testing.T) { GasUsed: 456, CumulativeGasUsed: 123, TxHash: common.HexToHash(txHash), - BlockHash: common.HexToHash("0x010203"), + BlockHash: common.HexToHash(blockHash), BlockNumber: big.NewInt(500), }, nil).Once() client.On("TransactionByHash", test.AnyCtx, common.HexToHash(txHash)). @@ -262,3 +264,40 @@ func TestRskjRpcServer_GetTransactionReceipt_ErrorHandling(t *testing.T) { assert.Empty(t, receipt) }) } + +func TestRskjRpcServer_GetBlockByHash(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + var now int64 = 1714471719922 + client.On("BlockByHash", test.AnyCtx, common.HexToHash(blockHash)).Return(types.NewBlock( + &types.Header{ + Number: big.NewInt(123), + Time: uint64(now), + Nonce: [8]byte{1, 2, 3, 4, 5, 6, 7, 8}, + }, nil, nil, nil, nil), nil).Once() + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + block, err := rpc.GetBlockByHash(context.Background(), blockHash) + require.NoError(t, err) + assert.Equal(t, blockchain.BlockInfo{ + Hash: "0xde378ac47c11cdc8182c05f10edd90899fced079aa2b141f4f548b354deac5d8", + Number: 123, + Timestamp: time.Unix(now, 0), + Nonce: 72623859790382856, + }, block) + client.AssertExpectations(t) +} + +func TestRskjRpcServer_GetBlockByHash_ErrorHandling(t *testing.T) { + client := &mocks.RpcClientBindingMock{} + rpc := rootstock.NewRskjRpcServer(rootstock.NewRskClient(client), rootstock.RetryParams{}) + t.Run("Error error getting block", func(t *testing.T) { + client.On("BlockByHash", test.AnyCtx, common.HexToHash(blockHash)).Return(nil, assert.AnError).Once() + block, err := rpc.GetBlockByHash(context.Background(), blockHash) + require.Error(t, err) + assert.Empty(t, block) + }) + t.Run("Invalid tx hash", func(t *testing.T) { + block, err := rpc.GetBlockByHash(context.Background(), test.AnyString) + require.Error(t, err) + assert.Empty(t, block) + }) +} diff --git a/internal/adapters/dataproviders/utils/utils.go b/internal/adapters/dataproviders/utils/utils.go index feae5cba..c2164c68 100644 --- a/internal/adapters/dataproviders/utils/utils.go +++ b/internal/adapters/dataproviders/utils/utils.go @@ -2,9 +2,24 @@ package utils import ( "github.com/awnumar/memguard" + log "github.com/sirupsen/logrus" + "net/http" "unsafe" ) +type HttpClient interface { + Do(req *http.Request) (*http.Response, error) +} + +func CloseBodyIfExists(res *http.Response) { + if res == nil || res.Body == nil { + return + } + if err := res.Body.Close(); err != nil { + log.Error("Error closing response body: ", err) + } +} + func GetSecurePointer[T any]() (buffer *memguard.LockedBuffer, typePointer *T) { requiredTypePointer := new(T) lockedBuffer := memguard.NewBuffer(int(unsafe.Sizeof(*requiredTypePointer))) diff --git a/internal/adapters/dataproviders/utils/utils_test.go b/internal/adapters/dataproviders/utils/utils_test.go new file mode 100644 index 00000000..0b1d49b6 --- /dev/null +++ b/internal/adapters/dataproviders/utils/utils_test.go @@ -0,0 +1,40 @@ +package utils_test + +import ( + "fmt" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/stretchr/testify/assert" + "runtime/debug" + "testing" + "unsafe" +) + +type testStruct struct { + AnyField string +} + +func TestGetSecurePointer(t *testing.T) { + debug.SetPanicOnFault(true) + defer debug.SetPanicOnFault(false) + var structToFill *testStruct + + buffer, pointer := utils.GetSecurePointer[testStruct]() + expectedPointer := new(testStruct) + expectedPointer.AnyField = test.AnyString + *pointer = *expectedPointer + structToFill = (*testStruct)(unsafe.Pointer(&buffer.Bytes()[0])) + + assert.IsType(t, expectedPointer, pointer) + assert.Equal(t, test.AnyString, pointer.AnyField) + assert.Equal(t, test.AnyString, structToFill.AnyField) + assert.Equal(t, unsafe.Sizeof(expectedPointer), unsafe.Sizeof(pointer)) + assert.Equal(t, int(unsafe.Sizeof(*expectedPointer)), buffer.Size()) + + _ = buffer.Seal() + assert.Nil(t, buffer.Data()) + assert.Nil(t, buffer.Bytes()) + assert.Panics(t, func() { fmt.Println(pointer.AnyField) }) + assert.Panics(t, func() { fmt.Println(structToFill.AnyField) }) + assert.NotPanics(t, func() { fmt.Println(expectedPointer.AnyField) }) +} diff --git a/test/mocks/client_adapter_mock.go b/test/mocks/client_adapter_mock.go index 783bb266..c41e890f 100644 --- a/test/mocks/client_adapter_mock.go +++ b/test/mocks/client_adapter_mock.go @@ -1138,6 +1138,51 @@ func (_c *ClientAdapterMock_LoadWallet_Call) RunAndReturn(run func(string) (*btc return _c } +// NextID provides a mock function with given fields: +func (_m *ClientAdapterMock) NextID() uint64 { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for NextID") + } + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// ClientAdapterMock_NextID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NextID' +type ClientAdapterMock_NextID_Call struct { + *mock.Call +} + +// NextID is a helper method to define mock.On call +func (_e *ClientAdapterMock_Expecter) NextID() *ClientAdapterMock_NextID_Call { + return &ClientAdapterMock_NextID_Call{Call: _e.mock.On("NextID")} +} + +func (_c *ClientAdapterMock_NextID_Call) Run(run func()) *ClientAdapterMock_NextID_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ClientAdapterMock_NextID_Call) Return(_a0 uint64) *ClientAdapterMock_NextID_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_NextID_Call) RunAndReturn(run func() uint64) *ClientAdapterMock_NextID_Call { + _c.Call.Return(run) + return _c +} + // Ping provides a mock function with given fields: func (_m *ClientAdapterMock) Ping() error { ret := _m.Called() @@ -1183,6 +1228,54 @@ func (_c *ClientAdapterMock_Ping_Call) RunAndReturn(run func() error) *ClientAda return _c } +// SendCmd provides a mock function with given fields: cmd +func (_m *ClientAdapterMock) SendCmd(cmd interface{}) chan *rpcclient.Response { + ret := _m.Called(cmd) + + if len(ret) == 0 { + panic("no return value specified for SendCmd") + } + + var r0 chan *rpcclient.Response + if rf, ok := ret.Get(0).(func(interface{}) chan *rpcclient.Response); ok { + r0 = rf(cmd) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(chan *rpcclient.Response) + } + } + + return r0 +} + +// ClientAdapterMock_SendCmd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendCmd' +type ClientAdapterMock_SendCmd_Call struct { + *mock.Call +} + +// SendCmd is a helper method to define mock.On call +// - cmd interface{} +func (_e *ClientAdapterMock_Expecter) SendCmd(cmd interface{}) *ClientAdapterMock_SendCmd_Call { + return &ClientAdapterMock_SendCmd_Call{Call: _e.mock.On("SendCmd", cmd)} +} + +func (_c *ClientAdapterMock_SendCmd_Call) Run(run func(cmd interface{})) *ClientAdapterMock_SendCmd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(interface{})) + }) + return _c +} + +func (_c *ClientAdapterMock_SendCmd_Call) Return(_a0 chan *rpcclient.Response) *ClientAdapterMock_SendCmd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientAdapterMock_SendCmd_Call) RunAndReturn(run func(interface{}) chan *rpcclient.Response) *ClientAdapterMock_SendCmd_Call { + _c.Call.Return(run) + return _c +} + // SendRawTransaction provides a mock function with given fields: tx, allowHighFees func (_m *ClientAdapterMock) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) { ret := _m.Called(tx, allowHighFees) diff --git a/test/mocks/http_client_mock.go b/test/mocks/http_client_mock.go new file mode 100644 index 00000000..6675d2ee --- /dev/null +++ b/test/mocks/http_client_mock.go @@ -0,0 +1,94 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + http "net/http" + + mock "github.com/stretchr/testify/mock" +) + +// HttpClientMock is an autogenerated mock type for the HttpClient type +type HttpClientMock struct { + mock.Mock +} + +type HttpClientMock_Expecter struct { + mock *mock.Mock +} + +func (_m *HttpClientMock) EXPECT() *HttpClientMock_Expecter { + return &HttpClientMock_Expecter{mock: &_m.Mock} +} + +// Do provides a mock function with given fields: req +func (_m *HttpClientMock) Do(req *http.Request) (*http.Response, error) { + ret := _m.Called(req) + + if len(ret) == 0 { + panic("no return value specified for Do") + } + + var r0 *http.Response + var r1 error + if rf, ok := ret.Get(0).(func(*http.Request) (*http.Response, error)); ok { + return rf(req) + } + if rf, ok := ret.Get(0).(func(*http.Request) *http.Response); ok { + r0 = rf(req) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*http.Response) + } + } + + if rf, ok := ret.Get(1).(func(*http.Request) error); ok { + r1 = rf(req) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HttpClientMock_Do_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Do' +type HttpClientMock_Do_Call struct { + *mock.Call +} + +// Do is a helper method to define mock.On call +// - req *http.Request +func (_e *HttpClientMock_Expecter) Do(req interface{}) *HttpClientMock_Do_Call { + return &HttpClientMock_Do_Call{Call: _e.mock.On("Do", req)} +} + +func (_c *HttpClientMock_Do_Call) Run(run func(req *http.Request)) *HttpClientMock_Do_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*http.Request)) + }) + return _c +} + +func (_c *HttpClientMock_Do_Call) Return(_a0 *http.Response, _a1 error) *HttpClientMock_Do_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *HttpClientMock_Do_Call) RunAndReturn(run func(*http.Request) (*http.Response, error)) *HttpClientMock_Do_Call { + _c.Call.Return(run) + return _c +} + +// NewHttpClientMock creates a new instance of HttpClientMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewHttpClientMock(t interface { + mock.TestingT + Cleanup(func()) +}) *HttpClientMock { + mock := &HttpClientMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/rpc_client_mock.go b/test/mocks/rpc_client_mock.go index 21bab7c7..19036465 100644 --- a/test/mocks/rpc_client_mock.go +++ b/test/mocks/rpc_client_mock.go @@ -1090,6 +1090,51 @@ func (_c *RpcClientMock_LoadWallet_Call) RunAndReturn(run func(string) (*btcjson return _c } +// NextID provides a mock function with given fields: +func (_m *RpcClientMock) NextID() uint64 { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for NextID") + } + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// RpcClientMock_NextID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NextID' +type RpcClientMock_NextID_Call struct { + *mock.Call +} + +// NextID is a helper method to define mock.On call +func (_e *RpcClientMock_Expecter) NextID() *RpcClientMock_NextID_Call { + return &RpcClientMock_NextID_Call{Call: _e.mock.On("NextID")} +} + +func (_c *RpcClientMock_NextID_Call) Run(run func()) *RpcClientMock_NextID_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RpcClientMock_NextID_Call) Return(_a0 uint64) *RpcClientMock_NextID_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_NextID_Call) RunAndReturn(run func() uint64) *RpcClientMock_NextID_Call { + _c.Call.Return(run) + return _c +} + // Ping provides a mock function with given fields: func (_m *RpcClientMock) Ping() error { ret := _m.Called() @@ -1135,6 +1180,54 @@ func (_c *RpcClientMock_Ping_Call) RunAndReturn(run func() error) *RpcClientMock return _c } +// SendCmd provides a mock function with given fields: cmd +func (_m *RpcClientMock) SendCmd(cmd interface{}) chan *rpcclient.Response { + ret := _m.Called(cmd) + + if len(ret) == 0 { + panic("no return value specified for SendCmd") + } + + var r0 chan *rpcclient.Response + if rf, ok := ret.Get(0).(func(interface{}) chan *rpcclient.Response); ok { + r0 = rf(cmd) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(chan *rpcclient.Response) + } + } + + return r0 +} + +// RpcClientMock_SendCmd_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendCmd' +type RpcClientMock_SendCmd_Call struct { + *mock.Call +} + +// SendCmd is a helper method to define mock.On call +// - cmd interface{} +func (_e *RpcClientMock_Expecter) SendCmd(cmd interface{}) *RpcClientMock_SendCmd_Call { + return &RpcClientMock_SendCmd_Call{Call: _e.mock.On("SendCmd", cmd)} +} + +func (_c *RpcClientMock_SendCmd_Call) Run(run func(cmd interface{})) *RpcClientMock_SendCmd_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(interface{})) + }) + return _c +} + +func (_c *RpcClientMock_SendCmd_Call) Return(_a0 chan *rpcclient.Response) *RpcClientMock_SendCmd_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *RpcClientMock_SendCmd_Call) RunAndReturn(run func(interface{}) chan *rpcclient.Response) *RpcClientMock_SendCmd_Call { + _c.Call.Return(run) + return _c +} + // SendRawTransaction provides a mock function with given fields: tx, allowHighFees func (_m *RpcClientMock) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) { ret := _m.Called(tx, allowHighFees) diff --git a/test/utils.go b/test/utils.go index 18a75f52..1975f745 100644 --- a/test/utils.go +++ b/test/utils.go @@ -2,6 +2,7 @@ package test import ( "fmt" + "github.com/btcsuite/btcd/chaincfg" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -38,6 +39,29 @@ func RunTable[V, R any](t *testing.T, table Table[V, R], validationFunction func } } +func OpenDerivativeWalletForTest(t *testing.T, testRef string) *account.RskAccount { + _, currentPackageDir, _, _ := runtime.Caller(0) + testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-derivative-%s-%d", testRef, time.Now().UnixNano())) + keyFile, err := os.Open(filepath.Join(currentPackageDir, keyPath)) + require.NoError(t, err) + + defer func(file *os.File) { closingErr := file.Close(); require.NoError(t, closingErr) }(keyFile) + + keyBytes, err := io.ReadAll(keyFile) + require.NoError(t, err) + account, err := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + CreationArgs: account.CreationArgs{ + KeyDir: testDir, + AccountNum: 0, + EncryptedJson: string(keyBytes), + Password: KeyPassword, + }, + BtcParams: &chaincfg.TestNet3Params, + }) + require.NoError(t, err) + return account +} + func OpenWalletForTest(t *testing.T, testRef string) *account.RskAccount { _, currentPackageDir, _, _ := runtime.Caller(0) testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-%s-%d", testRef, time.Now().UnixNano())) From c34edf6f655dc532e79c981c92c0d9c025af4f70 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 1 May 2024 17:52:14 +0200 Subject: [PATCH 057/113] feat: improve usage of memguard con securing pk --- .../rootstock/account/account.go | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/internal/adapters/dataproviders/rootstock/account/account.go b/internal/adapters/dataproviders/rootstock/account/account.go index 8c99741f..6764e302 100644 --- a/internal/adapters/dataproviders/rootstock/account/account.go +++ b/internal/adapters/dataproviders/rootstock/account/account.go @@ -9,10 +9,8 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils" log "github.com/sirupsen/logrus" "os" - "unsafe" ) var NoDerivationError = fmt.Errorf("btc derivation wasn't enabled for this account") @@ -24,9 +22,10 @@ type RskAccount struct { } type btcDerivationInfo struct { - pubKey *btcec.PublicKey - address btcutil.Address - protectedWif *memguard.Enclave + params *chaincfg.Params + pubKey *btcec.PublicKey + address btcutil.Address + protectedPrivKey *memguard.Enclave } type CreationArgs struct { @@ -65,27 +64,29 @@ func GetRskAccountWithDerivation(args CreationWithDerivationArgs) (*RskAccount, } key, err := keystore.DecryptKey([]byte(args.EncryptedJson), args.Password) + defer func() { + if key != nil { + *key = keystore.Key{} + } + }() if err != nil { return nil, err } privateKey, pubKey := btcec.PrivKeyFromBytes(key.PrivateKey.D.Bytes()) + defer func() { privateKey.Zero() }() address, err := btcutil.NewAddressPubKey(pubKey.SerializeCompressed(), args.BtcParams) if err != nil { return nil, err } - protectedWifBuffer, protectedWif := utils.GetSecurePointer[btcutil.WIF]() - unprotectedWif, err := btcutil.NewWIF(privateKey, args.BtcParams, true) - if err != nil { - return nil, err + protectedPrivKey := memguard.NewEnclave(privateKey.Serialize()) + account.btc = &btcDerivationInfo{ + pubKey: pubKey, + address: address, + protectedPrivKey: protectedPrivKey, + params: args.BtcParams, } - - // this line is to write the content of the unprotectedWif to the protected memory address inside the locked buffer, the protectedWif - // variable is just to allow us to write inside buffer's memory address, then we set unprotectedWif to its zero value - *protectedWif = *unprotectedWif - *unprotectedWif = btcutil.WIF{} - account.btc = &btcDerivationInfo{pubKey: pubKey, address: address, protectedWif: protectedWifBuffer.Seal()} return account, nil } @@ -108,7 +109,7 @@ func (account *RskAccount) UsePrivateKeyWif(usageFunc func(wif *btcutil.WIF) err if account.btc == nil { return NoDerivationError } - buffer, err := account.btc.protectedWif.Open() + buffer, err := account.btc.protectedPrivKey.Open() defer func(b *memguard.LockedBuffer) { if b != nil { b.Destroy() @@ -117,7 +118,18 @@ func (account *RskAccount) UsePrivateKeyWif(usageFunc func(wif *btcutil.WIF) err if err != nil { return err } - wif := (*btcutil.WIF)(unsafe.Pointer(&buffer.Bytes()[0])) + + privKey, _ := btcec.PrivKeyFromBytes(buffer.Bytes()) + wif, err := btcutil.NewWIF(privKey, account.btc.params, true) + defer func() { + privKey.Zero() + if wif != nil { + *wif = btcutil.WIF{} + } + }() + if err != nil { + return err + } return usageFunc(wif) } From a61e70f19885e1cfdc2882c4dae6813d4c4be2ef Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 2 May 2024 09:19:12 +0200 Subject: [PATCH 058/113] fix: fix sonar warnings --- .../bitcoin/derivative_wallet_test.go | 6 +- internal/usecases/pegout/send_pegout_test.go | 74 +++++++++---------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go b/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go index a96939cf..2dfa4d15 100644 --- a/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go +++ b/internal/adapters/dataproviders/bitcoin/derivative_wallet_test.go @@ -84,7 +84,7 @@ func TestNewDerivativeWallet(t *testing.T) { assert.NotNil(t, wallet) client.AssertExpectations(t) }) - t.Run("Error handling", func(t *testing.T) { derivativeWalleCreationtErrorHandlingTests(t, rskAccount, nonExistingAddressInfo) }) + t.Run("Error handling on derivative wallet creation", func(t *testing.T) { derivativeWalleCreationtErrorHandlingTests(t, rskAccount, nonExistingAddressInfo) }) } func derivativeWalleCreationtErrorHandlingTests(t *testing.T, rskAccount *account.RskAccount, nonExistingAddressInfo *btcjson.GetAddressInfoResult) { @@ -204,7 +204,7 @@ func TestDerivativeWallet(t *testing.T) { t.Run("EstimateTxFees", func(t *testing.T) { t.Run("Success", func(t *testing.T) { testEstimateFees(t, rskAccount, existingAddressInfo) }) t.Run("Add extra value if estimation blocks is higher than the target", func(t *testing.T) { testEstimateFeesExtra(t, rskAccount, existingAddressInfo) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling tx fees estimation", func(t *testing.T) { cases := derivativeWalletEstimateTxFeesErrorSetups(rskAccount) for _, testCase := range cases { client := &mocks.ClientAdapterMock{} @@ -219,7 +219,7 @@ func TestDerivativeWallet(t *testing.T) { t.Run("SendWithOpReturn", func(t *testing.T) { t.Run("Success", func(t *testing.T) { testSendWithOpReturn(t, rskAccount, existingAddressInfo) }) - t.Run("Error handling", func(t *testing.T) { + t.Run("Error handling on btc tx sending", func(t *testing.T) { cases := derivativeWalletSendWithOpReturnErrorSetups(rskAccount) for _, testCase := range cases { client := &mocks.ClientAdapterMock{} diff --git a/internal/usecases/pegout/send_pegout_test.go b/internal/usecases/pegout/send_pegout_test.go index 1625861d..558ecee4 100644 --- a/internal/usecases/pegout/send_pegout_test.go +++ b/internal/usecases/pegout/send_pegout_test.go @@ -100,7 +100,7 @@ func TestSendPegoutUseCase_Run(t *testing.T) { updatedQuote := retainedQuote updatedQuote.LpBtcTxHash = btcTxHash updatedQuote.State = quote.PegoutStateSendPegoutSucceeded - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() rpc := blockchain.Rpc{Rsk: rsk} useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) @@ -150,21 +150,21 @@ func getRecoverableSetups() []func(retainedQuote *quote.RetainedPegoutQuote, btc retainedQuote.UserRskTxHash = "" }, func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(nil, assert.AnError).Once() }, func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", test.AnyCtx).Return(uint64(0), assert.AnError).Once() }, func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(blockchain.TransactionReceipt{}, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, mock.Anything).Return(blockchain.TransactionReceipt{}, assert.AnError).Once() }, func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: "0x5b5c5d", BlockHash: "0x6e6f6a", BlockNumber: blockNumber, @@ -177,9 +177,9 @@ func getRecoverableSetups() []func(retainedQuote *quote.RetainedPegoutQuote, btc rsk.On("GetBlockByHash", test.AnyCtx, mock.Anything).Return(blockchain.BlockInfo{}, assert.AnError).Once() }, func(retainedQuote *quote.RetainedPegoutQuote, btcWallet *mocks.BtcWalletMock, rsk *mocks.RootstockRpcServerMock, quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: "0x5b5c5d", BlockHash: "0x6e6f6a", BlockNumber: blockNumber, @@ -209,8 +209,8 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { assert.Equal(t, quote.PegoutBtcSentEventId, event.Event.Id()) })).Return().Once() mutex := new(mocks.MutexMock) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, BlockHash: "0x6e6f6a", BlockNumber: blockNumber, @@ -221,10 +221,10 @@ func TestSendPegoutUseCase_Run_InsufficientAmount(t *testing.T) { Value: entities.NewWei(8000), }, nil).Once() quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() rpc := blockchain.Rpc{Rsk: rsk} useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) @@ -245,8 +245,8 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { rsk := new(mocks.RootstockRpcServerMock) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, BlockHash: "0x6e6f6a", BlockNumber: 445, @@ -257,7 +257,7 @@ func TestSendPegoutUseCase_Run_NoConfirmations(t *testing.T) { Value: entities.NewWei(8500), }, nil).Once() quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rpc := blockchain.Rpc{Rsk: rsk} useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) @@ -278,10 +278,10 @@ func TestSendPegoutUseCase_Run_ExpiredQuote(t *testing.T) { expiredQuote := pegoutQuote expiredQuote.ExpireDate = now - 60 quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&expiredQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&expiredQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed @@ -323,8 +323,8 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { btcWallet := new(mocks.BtcWalletMock) btcWallet.On("GetBalance").Return(entities.NewWei(100), nil).Once() rsk := new(mocks.RootstockRpcServerMock) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, BlockHash: blockHash, BlockNumber: blockNumber, @@ -345,7 +345,7 @@ func TestSendPegoutUseCase_Run_NoLiquidity(t *testing.T) { mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() rpc := blockchain.Rpc{Rsk: rsk} useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) @@ -365,10 +365,10 @@ func TestSendPegoutUseCase_Run_QuoteNotFound(t *testing.T) { eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(nil, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := retainedQuote expected.State = quote.PegoutStateSendPegoutFailed @@ -405,8 +405,8 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil).Once() - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil).Once() + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: "0x5b5c5d", BlockHash: blockHash, BlockNumber: blockNumber, @@ -423,10 +423,10 @@ func TestSendPegoutUseCase_Run_BtcTxFail(t *testing.T) { Nonce: 1, }, nil).Once() quoteRepository := new(mocks.PegoutQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() updatedQuote := retainedQuote updatedQuote.State = quote.PegoutStateSendPegoutFailed - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), updatedQuote).Return(nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, updatedQuote).Return(nil).Once() rpc := blockchain.Rpc{Rsk: rsk} useCase := NewSendPegoutUseCase(btcWallet, quoteRepository, rpc, eventBus, mutex) @@ -450,8 +450,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(450), nil) - rsk.On("GetTransactionReceipt", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ + rsk.On("GetHeight", test.AnyCtx).Return(uint64(450), nil) + rsk.On("GetTransactionReceipt", test.AnyCtx, retainedQuote.UserRskTxHash).Return(blockchain.TransactionReceipt{ TransactionHash: retainedQuote.UserRskTxHash, Value: entities.NewWei(8500), BlockHash: blockHash, BlockNumber: blockNumber, From: "0x1234", To: "0x5678", @@ -464,8 +464,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { setups := []func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock){ func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(assert.AnError).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := *retainedQuote expected.LpBtcTxHash = btcTxHash @@ -476,8 +476,8 @@ func TestSendPegoutUseCase_Run_UpdateError(t *testing.T) { }, func(retainedQuote *quote.RetainedPegoutQuote, quoteRepository *mocks.PegoutQuoteRepositoryMock, eventBus *mocks.EventBusMock) { retainedQuote.QuoteHash = "no hex" - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, retainedQuote.QuoteHash).Return(&pegoutQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(assert.AnError).Once() eventBus.On("Publish", mock.MatchedBy(func(event quote.PegoutBtcSentToUserEvent) bool { expected := *retainedQuote expected.State = quote.PegoutStateSendPegoutFailed From 86cf948d4e324a7c7f69eed0ebf98e3b259da3e6 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 3 May 2024 11:28:26 +0200 Subject: [PATCH 059/113] feat: add watchonly wallet implementation --- cmd/application/lps/application.go | 4 +- .../adapters/dataproviders/bitcoin/rpc.go | 2 + .../dataproviders/bitcoin/rpc_test.go | 5 +- .../dataproviders/bitcoin/watchonly_wallet.go | 87 +++++++++++++++++++ .../watcher/pegin_btc_deposit_watcher.go | 1 - internal/configuration/registry/bitcoin.go | 9 +- internal/configuration/registry/usecase.go | 2 +- internal/entities/blockchain/bitcoin.go | 2 + internal/usecases/pegin/call_for_user.go | 11 ++- internal/usecases/pegin/call_for_user_test.go | 51 +++++++++-- 10 files changed, 152 insertions(+), 22 deletions(-) create mode 100644 internal/adapters/dataproviders/bitcoin/watchonly_wallet.go diff --git a/cmd/application/lps/application.go b/cmd/application/lps/application.go index 30273f99..2bb36797 100644 --- a/cmd/application/lps/application.go +++ b/cmd/application/lps/application.go @@ -43,7 +43,7 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret } log.Debug("Connected to RSK account") - monitoringConnection, err := bootstrap.BitcoinWallet(env.Btc, "main") + monitoringConnection, err := bootstrap.BitcoinWallet(env.Btc, bitcoin.PeginWalletId) if err != nil { log.Fatal("Error creating BTC monitoring connection:", err) } @@ -55,7 +55,7 @@ func NewApplication(initCtx context.Context, env environment.Environment, secret } log.Debug("Connected to BTC node for payments") - btcRegistry, err := registry.NewBitcoinRegistry(env.Btc, secrets, monitoringConnection, paymentConnection, account) + btcRegistry, err := registry.NewBitcoinRegistry(monitoringConnection, paymentConnection, account) if err != nil { log.Fatal("Error creating BTC registry:", err) } diff --git a/internal/adapters/dataproviders/bitcoin/rpc.go b/internal/adapters/dataproviders/bitcoin/rpc.go index 1adcac7f..1d3b3d40 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc.go +++ b/internal/adapters/dataproviders/bitcoin/rpc.go @@ -5,6 +5,7 @@ import ( "fmt" merkle "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/btcutil" + "time" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" @@ -181,6 +182,7 @@ func (rpc *bitcoindRpc) GetTransactionBlockInfo(transactionHash string) (blockch return blockchain.BitcoinBlockInformation{ Hash: blockHashBytes, Height: big.NewInt(block.Height), + Time: time.Unix(block.Time, 0), }, nil } diff --git a/internal/adapters/dataproviders/bitcoin/rpc_test.go b/internal/adapters/dataproviders/bitcoin/rpc_test.go index 4db90a63..918e56a3 100644 --- a/internal/adapters/dataproviders/bitcoin/rpc_test.go +++ b/internal/adapters/dataproviders/bitcoin/rpc_test.go @@ -18,6 +18,7 @@ import ( "os" "path/filepath" "testing" + "time" ) const ( @@ -158,13 +159,15 @@ func TestBitcoindRpc_GetRawTransaction_ErrorHandling(t *testing.T) { func TestBitcoindRpc_GetTransactionBlockInfo(t *testing.T) { client := &mocks.ClientAdapterMock{} + now := time.Now() client.On("GetRawTransactionVerbose", mock.Anything).Return(&btcjson.TxRawResult{BlockHash: testnetTestBlockHash}, nil).Once() - client.On("GetBlockVerbose", mock.Anything).Return(&btcjson.GetBlockVerboseResult{Height: 123}, nil).Once() + client.On("GetBlockVerbose", mock.Anything).Return(&btcjson.GetBlockVerboseResult{Height: 123, Time: now.Unix()}, nil).Once() rpc := bitcoin.NewBitcoindRpc(bitcoin.NewConnection(&chaincfg.MainNetParams, client)) result, err := rpc.GetTransactionBlockInfo(testnetTestTxHash) require.NoError(t, err) assert.Equal(t, [32]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x94, 0xd8, 0x5c, 0x3e, 0x73, 0x6a, 0xa4, 0x7, 0x1d, 0x36, 0xd2, 0x65, 0x47, 0x71, 0x38, 0x20, 0xa2, 0x7a, 0xf9, 0xed, 0xbe, 0x97, 0x48, 0x9c, 0x69, 0x6f}, result.Hash) assert.Equal(t, big.NewInt(123), result.Height) + assert.WithinDuration(t, now, result.Time, 1*time.Second) } func TestBitcoindRpc_GetTransactionBlockInfo_ErrorHandling(t *testing.T) { diff --git a/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go b/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go new file mode 100644 index 00000000..e84ea876 --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go @@ -0,0 +1,87 @@ +package bitcoin + +import ( + "errors" + "fmt" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + log "github.com/sirupsen/logrus" +) + +const ( + PeginWalletId = "pegin-watchonly-wallet" +) + +type WatchOnlyWallet struct { + conn *Connection +} + +func NewWatchOnlyWallet(walletConnection *Connection) (blockchain.BitcoinWallet, error) { + wallet := &WatchOnlyWallet{conn: walletConnection} + + var info *btcjson.GetWalletInfoResult + var err error + if info, err = wallet.conn.client.GetWalletInfo(); err != nil { + if info, err = wallet.createWallet(); err != nil { + return nil, fmt.Errorf("error creating watch-only wallet: %w", err) + } + } + if info.PrivateKeysEnabled { + return nil, errors.New("wallet is not watch-only") + } + return wallet, nil +} + +func (wallet *WatchOnlyWallet) createWallet() (*btcjson.GetWalletInfoResult, error) { + _, err := wallet.conn.client.LoadWallet(wallet.conn.WalletId) + if err == nil { + return wallet.conn.client.GetWalletInfo() + } + err = wallet.conn.client.CreateReadonlyWallet(btcclient.ReadonlyWalletRequest{ + WalletName: wallet.conn.WalletId, + DisablePrivateKeys: true, + Blank: true, + AvoidReuse: true, + Descriptors: false, + }) + if err != nil { + return nil, err + } + return wallet.conn.client.GetWalletInfo() +} + +func (wallet *WatchOnlyWallet) EstimateTxFees(toAddress string, value *entities.Wei) (*entities.Wei, error) { + return nil, errors.New("cannot estimate from a watch-only wallet") +} + +func (wallet *WatchOnlyWallet) GetBalance() (*entities.Wei, error) { + return nil, errors.New("cannot get balance of a watch-only wallet since it may be tracking address from multiple wallets") +} + +func (wallet *WatchOnlyWallet) SendWithOpReturn(address string, value *entities.Wei, opReturnContent []byte) (string, error) { + return "", errors.New("cannot send from a watch-only wallet") +} + +func (wallet *WatchOnlyWallet) ImportAddress(address string) error { + _, err := btcutil.DecodeAddress(address, wallet.conn.NetworkParams) + if err != nil { + return err + } + return wallet.conn.client.ImportAddressRescan(address, "", false) +} + +func (wallet *WatchOnlyWallet) GetTransactions(address string) ([]blockchain.BitcoinTransactionInformation, error) { + return getTransactionsToAddress(address, wallet.conn.NetworkParams, wallet.conn.client) +} + +func (wallet *WatchOnlyWallet) Address() string { + log.Warn("Trying to get main address from a watch-only wallet") + return "" +} + +func (wallet *WatchOnlyWallet) Unlock() error { + return errors.New("watch-only wallet does not support unlocking as it only has monitoring purposes") +} diff --git a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go index c782ca32..f591cf5e 100644 --- a/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go +++ b/internal/adapters/entrypoints/watcher/pegin_btc_deposit_watcher.go @@ -168,7 +168,6 @@ func (watcher *PeginDepositAddressWatcher) callForUser(watchedQuote w.WatchedPeg func validatePeginQuote(watchedQuote w.WatchedPeginQuote, tx blockchain.BitcoinTransactionInformation) bool { return tx.Confirmations >= uint64(watchedQuote.PeginQuote.Confirmations) && watchedQuote.RetainedQuote.State == quote.PeginStateWaitingForDeposit && - !watchedQuote.PeginQuote.IsExpired() && tx.AmountToAddress(watchedQuote.RetainedQuote.DepositAddress).Cmp(watchedQuote.PeginQuote.Total()) >= 0 } diff --git a/internal/configuration/registry/bitcoin.go b/internal/configuration/registry/bitcoin.go index 92147609..8eef3d52 100644 --- a/internal/configuration/registry/bitcoin.go +++ b/internal/configuration/registry/bitcoin.go @@ -4,7 +4,6 @@ import ( "errors" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" - "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" ) @@ -16,8 +15,6 @@ type Bitcoin struct { } func NewBitcoinRegistry( - env environment.BtcEnv, - secrets environment.ApplicationSecrets, monitoringWalletConnection *bitcoin.Connection, paymentWalletConnection *bitcoin.Connection, rskAccount *account.RskAccount, @@ -28,8 +25,8 @@ func NewBitcoinRegistry( if paymentWalletConnection.WalletId == "" { return nil, errors.New("paymentWalletConnection must be a wallet connection to the RPC server") } - bitcoind := bitcoin.NewBitcoindWallet(monitoringWalletConnection, env.BtcAddress, env.FixedTxFeeRate, env.WalletEncrypted, secrets.BtcWalletPassword) - if err := bitcoind.Unlock(); err != nil { + peginWatchOnly, err := bitcoin.NewWatchOnlyWallet(monitoringWalletConnection) + if err != nil { return nil, err } derivative, err := bitcoin.NewDerivativeWallet(paymentWalletConnection, rskAccount) @@ -37,7 +34,7 @@ func NewBitcoinRegistry( return nil, err } return &Bitcoin{ - MonitoringWallet: bitcoind, + MonitoringWallet: peginWatchOnly, PaymentWallet: derivative, MonitoringWalletConnection: monitoringWalletConnection, PaymentWalletConnection: paymentWalletConnection, diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index a915ac82..038b9a94 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -139,7 +139,7 @@ func NewUseCaseRegistry( databaseRegistry.PegoutRepository, liquidityProvider, liquidityProvider, - btcRegistry.MonitoringWallet, + btcRegistry.PaymentWallet, env.Rsk.FeeCollectorAddress, ), acceptPegoutQuoteUseCase: pegout.NewAcceptQuoteUseCase( diff --git a/internal/entities/blockchain/bitcoin.go b/internal/entities/blockchain/bitcoin.go index 8c226c6b..d095da6c 100644 --- a/internal/entities/blockchain/bitcoin.go +++ b/internal/entities/blockchain/bitcoin.go @@ -5,6 +5,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities" "math/big" "regexp" + "time" ) var ( @@ -98,6 +99,7 @@ func (tx *BitcoinTransactionInformation) AmountToAddress(address string) *entiti type BitcoinBlockInformation struct { Hash [32]byte Height *big.Int + Time time.Time } type MerkleBranch struct { diff --git a/internal/usecases/pegin/call_for_user.go b/internal/usecases/pegin/call_for_user.go index 2c7cf876..a3cea3c4 100644 --- a/internal/usecases/pegin/call_for_user.go +++ b/internal/usecases/pegin/call_for_user.go @@ -55,10 +55,6 @@ func (useCase *CallForUserUseCase) Run(ctx context.Context, bitcoinTx string, re return useCase.publishErrorEvent(ctx, retainedQuote, quote.PeginQuote{}, usecases.QuoteNotFoundError, false) } - if peginQuote.IsExpired() { - return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.ExpiredQuoteError, false) - } - if err = useCase.validateBitcoinTx(ctx, bitcoinTx, peginQuote, retainedQuote); err != nil { return err } @@ -169,6 +165,7 @@ func (useCase *CallForUserUseCase) validateBitcoinTx( retainedQuote quote.RetainedPeginQuote, ) error { var txInfo blockchain.BitcoinTransactionInformation + var txBlock blockchain.BitcoinBlockInformation var txConfirmations big.Int var err error @@ -180,6 +177,12 @@ func (useCase *CallForUserUseCase) validateBitcoinTx( return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.NoEnoughConfirmationsError, true) } + if txBlock, err = useCase.rpc.Btc.GetTransactionBlockInfo(bitcoinTx); err != nil { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, err, true) + } else if peginQuote.ExpireTime().Before(txBlock.Time) { + return useCase.publishErrorEvent(ctx, retainedQuote, *peginQuote, usecases.ExpiredQuoteError, false) + } + sentAmount := txInfo.AmountToAddress(retainedQuote.DepositAddress) if sentAmount.Cmp(peginQuote.Total()) < 0 { retainedQuote.UserBtcTxHash = bitcoinTx diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go index e860044e..303bc8e1 100644 --- a/internal/usecases/pegin/call_for_user_test.go +++ b/internal/usecases/pegin/call_for_user_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "math/big" "testing" "time" ) @@ -27,7 +28,6 @@ func TestCallForUserUseCase_Run(t *testing.T) { RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, } - expectedRetainedQuote := retainedPeginQuote expectedRetainedQuote.State = quote.PeginStateCallForUserSucceeded expectedRetainedQuote.CallForUserTxHash = callForUser @@ -35,7 +35,6 @@ func TestCallForUserUseCase_Run(t *testing.T) { lp := new(mocks.ProviderMock) lp.On("RskAddress").Return(lpRskAddress).Once() - lbc := new(mocks.LbcMock) lbc.On("GetBalance", testPeginQuote.LpRskAddress).Return(entities.NewWei(50000), nil).Once() txConfig := blockchain.NewTransactionConfig(entities.NewWei(0), uint64(testPeginQuote.GasLimit+pegin.CallForUserExtraGas), nil) @@ -47,6 +46,7 @@ func TestCallForUserUseCase_Run(t *testing.T) { Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", btcTx).Return(blockchain.BitcoinBlockInformation{Hash: [32]byte{1, 2, 3}, Height: big.NewInt(5), Time: time.Now()}, nil).Once() eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { @@ -108,6 +108,7 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", btcTx).Return(blockchain.BitcoinBlockInformation{Hash: [32]byte{1, 2, 3}, Height: big.NewInt(5), Time: time.Now()}, nil).Once() eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { @@ -118,7 +119,6 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { @@ -176,6 +176,7 @@ func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { } } +// nolint:funlen func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { now := uint32(time.Now().Unix()) peginQuote := quote.PeginQuote{ @@ -220,6 +221,21 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine Confirmations: 10, Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{}, assert.AnError).Once() + }, + func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). + Return(&peginQuote, nil).Once() + btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ + Hash: "0x1d1e", + Confirmations: 10, + Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, + }, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{ + Hash: [32]byte{1, 2, 3}, + Height: big.NewInt(5), + Time: time.Now(), + }, nil).Once() lbc.On("GetBalance", mock.Anything).Return(nil, assert.AnError).Once() }, func(caseRetainedQuote *quote.RetainedPeginQuote, rsk *mocks.RootstockRpcServerMock, lbc *mocks.LbcMock, btc *mocks.BtcRpcMock, quoteRepository *mocks.PeginQuoteRepositoryMock) { @@ -230,6 +246,11 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine Confirmations: 10, Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{ + Hash: [32]byte{1, 2, 3}, + Height: big.NewInt(5), + Time: time.Now(), + }, nil).Once() lbc.On("GetBalance", mock.Anything).Return(entities.NewWei(500), nil).Once() rsk.On("GetBalance", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, @@ -299,6 +320,18 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { State: quote.PeginStateWaitingForDeposit, } + btcTx := test.AnyString + btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ + Hash: btcTx, + Confirmations: 10, + Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, + }, nil).Once() + btc.On("GetTransactionBlockInfo", btcTx).Return(blockchain.BitcoinBlockInformation{ + Hash: [32]byte{1, 2, 3}, + Height: big.NewInt(5), + Time: time.Now().Add(time.Hour * 10), + }, nil).Once() + expiredQuote := testPeginQuote expiredQuote.AgreementTimestamp -= 1000 quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&expiredQuote, nil).Once() @@ -319,7 +352,7 @@ func TestCallForUserUseCase_Run_ExpiredQuote(t *testing.T) { contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) - err := useCase.Run(context.Background(), "bitcoin tx", retainedPeginQuote) + err := useCase.Run(context.Background(), btcTx, retainedPeginQuote) require.ErrorIs(t, err, usecases.ExpiredQuoteError) quoteRepository.AssertExpectations(t) eventBus.AssertExpectations(t) @@ -388,13 +421,13 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { lp := new(mocks.ProviderMock) lbc := new(mocks.LbcMock) - btc := new(mocks.BtcRpcMock) btc.On("GetTransactionInfo", btcTx).Return(blockchain.BitcoinTransactionInformation{ Hash: btcTx, Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(900)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", btcTx).Return(blockchain.BitcoinBlockInformation{Hash: [32]byte{1, 2, 3}, Height: big.NewInt(5), Time: time.Now()}, nil).Once() updatedQuote := retainedPeginQuote updatedQuote.UserBtcTxHash = btcTx @@ -416,7 +449,6 @@ func TestCallForUserUseCase_Run_InsufficientAmount(t *testing.T) { Return(nil).Once() rsk := new(mocks.RootstockRpcServerMock) - contracts := blockchain.RskContracts{Lbc: lbc} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} useCase := pegin.NewCallForUserUseCase(contracts, quoteRepository, rpc, lp, eventBus, mutex) @@ -460,6 +492,11 @@ func TestCallForUserUseCase_Run_NoLiquidity(t *testing.T) { Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", btcTx).Return(blockchain.BitcoinBlockInformation{ + Hash: [32]byte{1, 2, 3}, + Height: big.NewInt(5), + Time: time.Now(), + }, nil).Once() eventBus := new(mocks.EventBusMock) @@ -517,6 +554,7 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { Confirmations: 10, Outputs: map[string][]*entities.Wei{retainedPeginQuote.DepositAddress: {entities.NewWei(30012)}}, }, nil).Once() + btc.On("GetTransactionBlockInfo", btcTx).Return(blockchain.BitcoinBlockInformation{Hash: [32]byte{1, 2, 3}, Height: big.NewInt(5), Time: time.Now()}, nil).Once() eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.CallForUserCompletedEvent) bool { @@ -527,7 +565,6 @@ func TestCallForUserUseCase_Run_CallForUserFail(t *testing.T) { mutex := new(mocks.MutexMock) mutex.On("Lock").Return().Once() mutex.On("Unlock").Return().Once() - quoteRepository := new(mocks.PeginQuoteRepositoryMock) quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { From 4cce6c7be3467695b3cadd8ec2581d78ec204f6b Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 3 May 2024 12:36:25 +0200 Subject: [PATCH 060/113] test: add tests for watchonly wallet --- .../bitcoin/watchonly_wallet_test.go | 247 ++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 internal/adapters/dataproviders/bitcoin/watchonly_wallet_test.go diff --git a/internal/adapters/dataproviders/bitcoin/watchonly_wallet_test.go b/internal/adapters/dataproviders/bitcoin/watchonly_wallet_test.go new file mode 100644 index 00000000..acc52e5a --- /dev/null +++ b/internal/adapters/dataproviders/bitcoin/watchonly_wallet_test.go @@ -0,0 +1,247 @@ +package bitcoin_test + +import ( + "cmp" + "encoding/json" + "errors" + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "math" + "os" + "path/filepath" + "slices" + "testing" +) + +var getTransactionsExpectedResult = []blockchain.BitcoinTransactionInformation{ + { + Hash: "2ba6da53badd14349c5d6379e88c345e88193598aad714815d4b57c691a9fbdf", + Confirmations: 2439, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(2531000000000000)}, + }, + }, + { + Hash: "586c51dc94452aed9a373b0f52936c3e343c0db90f1155e985fd60e3c2e5c2b2", + Confirmations: 6, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(2000000000000000)}, + }, + }, + { + Hash: "da28401c76d618e8c3b1c3e15dfe1c10d4b24875f23768f30bcc26c99b9c82d4", + Confirmations: 2, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(200000000000000), entities.NewWei(1000000000000000), entities.NewWei(1000000000000000)}, + }, + }, + { + Hash: "fda421ccdff7324a382067d1746f6a387132435de6af336a0ebbf3f720eaae4d", + Confirmations: 6, + Outputs: map[string][]*entities.Wei{ + "n3HJbF1Ps5c9ZE3UvLyjGFDvyAfjzDEBkS": {entities.NewWei(20000000000000000)}, + }, + }, +} + +func TestNewWatchOnlyWallet(t *testing.T) { + t.Run("wallet already created and loaded", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + require.NotNil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("load created wallet", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, assert.AnError).Once() + client.On("LoadWallet", bitcoin.PeginWalletId).Return(nil, nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + require.NotNil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("create new wallet", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, assert.AnError).Once() + client.On("LoadWallet", bitcoin.PeginWalletId).Return(nil, assert.AnError).Once() + params := btcclient.ReadonlyWalletRequest{WalletName: bitcoin.PeginWalletId, DisablePrivateKeys: true, Blank: true, AvoidReuse: true, Descriptors: false} + client.On("CreateReadonlyWallet", params).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + require.NotNil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("wallet is not watch only", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: true}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.ErrorContains(t, err, "wallet is not watch-only") + require.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("handle RPC errors", func(t *testing.T) { + t.Run("on wallet create", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, assert.AnError).Once() + client.On("LoadWallet", bitcoin.PeginWalletId).Return(nil, assert.AnError).Once() + client.On("CreateReadonlyWallet", mock.Anything).Return(errors.New("creation error")).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.ErrorContains(t, err, "error creating watch-only wallet: creation error") + require.Nil(t, wallet) + client.AssertExpectations(t) + }) + t.Run("on get wallet info", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(nil, assert.AnError).Once() + client.On("LoadWallet", bitcoin.PeginWalletId).Return(nil, nil).Once() + client.On("GetWalletInfo", mock.Anything).Return(nil, errors.New("info error")).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.ErrorContains(t, err, "error creating watch-only wallet: info error") + require.Nil(t, wallet) + client.AssertExpectations(t) + }) + }) +} + +func TestWatchOnlyWallet_GetBalance(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + result, err := wallet.GetBalance() + require.ErrorContains(t, err, "cannot get balance of a watch-only wallet") + require.Nil(t, result) +} + +func TestWatchOnlyWallet_Address(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + result := wallet.Address() + require.Empty(t, result) +} + +func TestWatchOnlyWallet_EstimateTxFees(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + result, err := wallet.EstimateTxFees("address", nil) + require.ErrorContains(t, err, "cannot estimate from a watch-only wallet") + require.Nil(t, result) +} + +// TestWatchOnlyWallet_GetTransactions This test are reused from the bitcoind wallet tests suite since they share behavior +func TestWatchOnlyWallet_GetTransactions(t *testing.T) { + t.Run("Success", func(t *testing.T) { + absolutePath, err := filepath.Abs("../../../../test/mocks/listUnspentByAddress.json") + require.NoError(t, err) + rpcResponse, err := os.ReadFile(absolutePath) + require.NoError(t, err) + var result []btcjson.ListUnspentResult + err = json.Unmarshal(rpcResponse, &result) + require.NoError(t, err) + client := &mocks.ClientAdapterMock{} + parsedAddress, err := btcutil.DecodeAddress(testnetAddress, &chaincfg.TestNet3Params) + require.NoError(t, err) + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + client.On("ListUnspentMinMaxAddresses", 0, 9999999, []btcutil.Address{parsedAddress}).Return(result, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + transactions, err := wallet.GetTransactions(testnetAddress) + require.NoError(t, err) + slices.SortFunc(transactions, func(i, j blockchain.BitcoinTransactionInformation) int { + return cmp.Compare(i.Hash, j.Hash) + }) + assert.Equal(t, getTransactionsExpectedResult, transactions) + client.AssertExpectations(t) + }) + t.Run("Error on RPC call", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + transactions, err := wallet.GetTransactions("invalidAddress") + require.Error(t, err) + assert.Nil(t, transactions) + + client.On("ListUnspentMinMaxAddresses", mock.Anything, mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + transactions, err = wallet.GetTransactions(testnetAddress) + require.Error(t, err) + assert.Nil(t, transactions) + + client.On("ListUnspentMinMaxAddresses", mock.Anything, mock.Anything, mock.Anything).Return([]btcjson.ListUnspentResult{{Amount: math.NaN()}}, nil).Once() + transactions, err = wallet.GetTransactions(testnetAddress) + require.Error(t, err) + assert.Nil(t, transactions) + }) +} + +// TestWatchOnlyWallet_ImportAddress This test are reused from the bitcoind wallet tests suite since they share behavior +func TestWatchOnlyWallet_ImportAddress(t *testing.T) { + t.Run("valid address", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("ImportAddressRescan", testnetAddress, "", false).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + err = wallet.ImportAddress(testnetAddress) + require.NoError(t, err) + client.AssertExpectations(t) + + client = &mocks.ClientAdapterMock{} + client.On("ImportAddressRescan", mainnetAddress, "", false).Return(nil).Once() + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err = bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.MainNetParams, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + err = wallet.ImportAddress(mainnetAddress) + require.NoError(t, err) + client.AssertExpectations(t) + }) + t.Run("invalid address", func(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Twice() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.MainNetParams, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + err = wallet.ImportAddress(testnetAddress) + require.Error(t, err) + + wallet, err = bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + err = wallet.ImportAddress(mainnetAddress) + require.Error(t, err) + }) +} + +func TestWatchOnlyWallet_Unlock(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + err = wallet.Unlock() + require.ErrorContains(t, err, "watch-only wallet does not support unlocking as it only has monitoring purposes") +} + +func TestWatchOnlyWallet_SendWithOpReturn(t *testing.T) { + client := &mocks.ClientAdapterMock{} + client.On("GetWalletInfo").Return(&btcjson.GetWalletInfoResult{PrivateKeysEnabled: false}, nil).Once() + wallet, err := bitcoin.NewWatchOnlyWallet(bitcoin.NewWalletConnection(&chaincfg.TestNet3Params, client, bitcoin.PeginWalletId)) + require.NoError(t, err) + result, err := wallet.SendWithOpReturn("address", nil, nil) + require.ErrorContains(t, err, "cannot send from a watch-only wallet") + require.Empty(t, result) +} From 59ad6775dac8ec59e844d0cad75006a0fc989d3e Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 3 May 2024 13:29:55 +0200 Subject: [PATCH 061/113] chore: document important structs --- coverage/cover.out | 9514 +++++++++-------- .../dataproviders/bitcoin/bitcoind_wallet.go | 5 + .../dataproviders/bitcoin/connection.go | 9 + 3 files changed, 4939 insertions(+), 4589 deletions(-) diff --git a/coverage/cover.out b/coverage/cover.out index 761eec81..f238b3fc 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -186,73 +186,93 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -660,44 +680,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -836,16 +864,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 @@ -962,80 +990,6 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:25.43,26.30 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:26.30,30.31 3 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:30.31,33.4 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.2,35.26 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:38.80,39.30 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:39.30,42.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:43.2,47.38 5 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:47.38,50.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.2,53.21 3 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:56.62,57.30 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:57.30,60.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.2,61.37 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.37,62.38 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:62.38,64.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:65.3,65.26 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:67.2,71.34 5 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:74.57,75.30 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:75.30,78.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:79.2,82.9 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:82.9,84.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.2,85.37 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.37,87.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:38.27,48.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:50.55,52.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:54.55,56.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:58.79,62.16 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:62.16,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:66.2,69.16 4 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:69.16,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:72.2,73.48 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:76.114,80.16 4 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:80.16,82.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:83.2,87.16 3 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:87.16,89.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.2,90.39 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.39,92.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:93.2,95.52 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:95.52,97.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:97.8,102.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:105.113,110.16 5 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:110.16,112.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.2,114.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:114.16,116.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:117.2,120.16 4 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:120.16,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.2,123.39 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.39,125.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:126.2,128.52 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:128.52,130.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:130.8,136.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.117,140.135 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:140.135,142.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.2,143.16 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.16,145.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:146.2,146.28 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.115,150.133 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:150.133,152.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.2,153.16 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.16,155.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:156.2,156.28 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.113,160.131 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:160.131,162.3 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.2,163.16 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.16,165.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:166.2,166.28 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:173.32,175.16 2 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:175.16,178.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.2,179.26 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.26,182.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.2,183.70 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.70,186.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.2,187.70 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.70,190.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:191.2,191.27 1 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 @@ -1219,111 +1173,131 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -1669,19 +1643,19 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 @@ -1693,44 +1667,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -1822,33 +1804,33 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 122 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 272 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 8 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -1858,7 +1840,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -1866,19 +1848,19 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 22 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 @@ -1903,11 +1885,11 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 @@ -1995,288 +1977,276 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 128 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 63 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 62 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 20 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 192 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 38 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 32 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 60 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 32 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 31 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 30 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 30 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 28 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 28 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 27 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 31 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 42 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 2060 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 8190 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 4134 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 2474 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -2684,110 +2654,118 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 72 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 71 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 7 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 7 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 10 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 8 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 18 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 29 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 82 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 81 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 36 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 11 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 41 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 40 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 82 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 37 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 10 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 @@ -2799,25 +2777,25 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 5 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 5 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -2829,16 +2807,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 50 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 29 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 142 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 @@ -2857,19 +2835,19 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 71 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 71 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 46 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 @@ -2986,2010 +2964,103 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 24 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 17 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 17 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 30 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 18 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 30 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 82 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 81 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 36 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 36 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 29 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 23 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 41 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 40 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 82 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 27 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 37 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 1 @@ -5061,49 +3132,52 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -5146,16 +3220,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 126 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 216 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 126 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 216 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 4 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 @@ -5272,49 +3346,52 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -5364,7 +3441,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 @@ -5386,49 +3463,52 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 10 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 @@ -5762,73 +3842,93 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -6236,44 +4336,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -6412,16 +4520,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 1 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 @@ -6753,73 +4861,93 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -7227,44 +5355,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -7372,13 +5508,13 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,5 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 177 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 179 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 25 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 64 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 951 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 953 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 @@ -7403,16 +5539,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 74 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 4 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 7 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 @@ -7450,8 +5586,8 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 23 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 15 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 12 @@ -7530,14 +5666,14 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 67 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 37 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 37 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 64 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 65 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 37 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 7 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 @@ -7612,50 +5748,52 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collat github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:34.2,35.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:35.16,37.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/add_collateral.go:38.2,38.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:32.23,41.2 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:43.125,48.62 4 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:32.23,41.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:43.125,48.62 4 14 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:48.62,50.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.2,52.98 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.2,52.98 1 13 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:52.98,54.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.8,54.30 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.8,54.30 1 12 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:54.30,56.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.2,58.28 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.28,60.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.2,62.92 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.92,64.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:66.2,69.98 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.98,71.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:73.2,75.104 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:75.104,77.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.2,78.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.16,81.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:82.2,82.12 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:91.9,93.18 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:93.18,95.88 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:95.88,97.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:98.3,103.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:106.2,106.21 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:113.26,117.109 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:117.109,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:121.2,122.47 2 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:122.47,124.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.8,126.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.2,128.107 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:128.107,130.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.8,130.48 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:130.48,132.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:133.2,133.25 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:141.37,147.93 5 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:147.93,149.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:149.8,151.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:153.2,162.27 5 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:170.9,175.77 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:175.77,177.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:178.2,179.74 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:179.74,181.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:183.2,184.44 2 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:184.44,193.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:194.2,194.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.2,58.92 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:58.92,60.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:62.2,65.98 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:65.98,67.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:69.2,71.104 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:71.104,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:74.2,74.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:74.16,77.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:78.2,78.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:87.9,89.18 2 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:89.18,91.88 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:91.88,93.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:94.3,99.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:102.2,102.21 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:109.26,113.109 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:113.109,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:117.2,118.47 2 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:118.47,120.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:120.8,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.2,124.107 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:124.107,126.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:126.8,126.48 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:126.48,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:129.2,129.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:137.37,143.93 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:143.93,145.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:145.8,147.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:149.2,158.27 5 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:166.9,172.77 5 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:172.77,174.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:175.2,176.74 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:176.74,178.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:180.2,180.83 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:180.83,182.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:182.8,182.57 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:182.57,184.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:186.2,187.44 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:187.44,196.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/call_for_user.go:197.2,197.12 1 6 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:13.104,15.2 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:17.110,20.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/expire_quote.go:20.16,22.3 1 1 @@ -7933,73 +6071,93 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -8407,44 +6565,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -8541,7 +6707,7 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ut github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -8549,20 +6715,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 26 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 232 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 32 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 54 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 958 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 300 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -8580,42 +6746,42 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 84 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 7 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 19 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 10 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -8639,17 +6805,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quot github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 9 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 13 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 @@ -8703,31 +6869,31 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 39 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 28 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 65 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 29 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 3 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 @@ -8741,58 +6907,213 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:29.23,38.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:40.108,48.85 7 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:48.85,50.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.8,50.31 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.31,53.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.2,55.29 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.29,58.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:60.2,63.95 3 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:63.95,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.8,65.33 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.33,70.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.2,72.96 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.96,74.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.2,76.71 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.71,78.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:80.2,88.77 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:88.77,90.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:92.2,95.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:98.138,104.83 5 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:104.83,107.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:108.2,108.31 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:115.9,117.62 2 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:117.62,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.2,120.88 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.88,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:124.2,129.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.128,17.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:19.87,22.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:22.16,24.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:25.2,26.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:26.16,28.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:29.2,31.35 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:31.35,33.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:34.2,35.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:35.16,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:38.2,38.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:13.108,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:17.113,20.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:20.16,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:23.2,23.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.140,17.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:33.20,43.2 1 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:57.16,64.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:71.110,81.82 9 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:81.82,83.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.2,86.72 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:86.72,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.8,88.23 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.23,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.2,92.75 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.75,94.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.2,96.63 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.63,98.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,107.96 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:107.96,109.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.2,111.127 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.127,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.2,115.68 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.68,117.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.72 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:122.153,125.67 3 18 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:125.67,128.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.2,129.85 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.85,132.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.2,133.56 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.56,136.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.77 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.77,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:140.2,140.17 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.30,153.51 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:153.51,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.2,157.67 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.67,159.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.2,187.60 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:187.60,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:190.2,190.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:193.121,197.91 4 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:197.91,199.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.2,200.160 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.160,202.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:203.2,203.26 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:206.114,209.80 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:209.80,211.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.2,213.89 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.89,215.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:216.2,216.18 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:23.2,23.22 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.171,18.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.62 4 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.62,26.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.103 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.103,30.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.2,32.84 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.84,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:35.2,35.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:40.24,49.2 1 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:51.109,56.65 4 17 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:56.65,58.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.2,60.99 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.99,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.8,62.31 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.31,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.2,66.88 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.88,68.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.2,70.83 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.83,72.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,78.104 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:78.104,80.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.2,82.97 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.97,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.12 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.152,90.18 2 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:90.18,92.88 2 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:92.88,94.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.3,99.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:101.2,101.21 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.162,111.98 6 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:111.98,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.2,115.97 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.97,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.2,119.91 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.91,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.2,123.81 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.81,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,134.8 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:137.182,146.16 8 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:146.16,148.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:150.2,151.103 2 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:151.103,153.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.2,154.27 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:162.38,167.134 4 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:167.134,169.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.8,169.23 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.23,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:171.8,173.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:175.2,183.103 4 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:183.103,185.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.2,186.27 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:193.9,196.93 3 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.93,198.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.8,198.77 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.77,200.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.2,201.12 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:28.22,36.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:38.107,43.73 4 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:43.73,45.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.2,47.99 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.99,49.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.8,49.31 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.31,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.2,53.87 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.87,55.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:57.2,60.80 3 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:60.80,62.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:64.2,67.76 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:67.76,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.2,71.104 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.104,73.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.2,74.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.16,76.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:77.2,77.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:86.9,88.18 2 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:88.18,90.88 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:90.88,92.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:93.3,98.5 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:100.2,100.21 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:107.42,113.67 5 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:113.67,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:117.2,117.104 1 11 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:117.104,119.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:119.8,119.87 1 10 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:119.87,121.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:121.8,121.55 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:121.55,124.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.8,124.92 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.92,126.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:126.8,126.61 1 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:126.61,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:129.2,129.21 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:137.38,143.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:143.16,146.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:148.2,148.129 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:148.129,150.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:150.8,152.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:154.2,162.27 4 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:169.9,174.63 4 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:174.63,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:177.2,179.38 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:179.38,181.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:182.2,182.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:185.125,186.76 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:186.76,188.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:188.8,188.46 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:188.46,190.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:191.2,191.12 1 14 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.97,15.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:17.55,19.104 2 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:19.104,21.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 @@ -8976,73 +7297,93 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -9450,44 +7791,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -9584,7 +7933,7 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ut github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 @@ -9592,20 +7941,20 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16, github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 232 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 32 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 54 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 958 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 11 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 202 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 300 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -9623,42 +7972,42 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 84 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 48 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 7 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 19 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 19 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 11 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 10 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 10 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 @@ -9682,17 +8031,17 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quot github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 12 github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 12 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 @@ -9746,31 +8095,31 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords. github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 39 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 26 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 36 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 28 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 65 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 29 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 36 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 @@ -9784,256 +8133,104 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:29.23,38.2 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:40.108,48.85 7 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:48.85,50.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.8,50.31 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:50.31,53.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.2,55.29 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:55.29,58.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:60.2,63.95 3 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:63.95,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.8,65.33 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:65.33,70.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.2,72.96 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:72.96,74.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.2,76.71 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:76.71,78.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:80.2,88.77 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:88.77,90.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:92.2,95.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:98.138,104.83 5 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:104.83,107.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:108.2,108.31 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:115.9,117.62 2 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:117.62,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.2,120.88 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:120.88,122.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/accept_pegout_quote.go:124.2,129.12 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:15.128,17.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:19.87,22.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:22.16,24.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:25.2,26.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:26.16,28.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:29.2,31.35 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:31.35,33.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:34.2,35.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:35.16,37.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/add_collateral.go:38.2,38.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:13.108,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:17.113,20.16 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:20.16,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/expire_quote.go:23.2,23.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:15.140,17.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:19.67,21.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:21.16,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_collateral.go:24.2,24.24 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:33.20,43.2 1 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:57.16,64.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:71.110,81.82 9 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:81.82,83.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:85.2,86.72 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:86.72,88.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.8,88.23 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:88.23,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.2,92.75 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:92.75,94.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.2,96.63 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:96.63,98.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:100.2,107.96 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:107.96,109.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.2,111.127 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:111.127,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.2,115.68 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:115.68,117.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:119.2,119.72 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:122.153,125.67 3 18 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:125.67,128.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.2,129.85 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:129.85,132.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.2,133.56 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:133.56,136.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.2,137.77 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:137.77,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:140.2,140.17 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:148.30,153.51 4 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:153.51,155.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.2,157.67 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:157.67,159.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:161.2,187.60 6 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:187.60,189.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:190.2,190.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:193.121,197.91 4 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:197.91,199.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.2,200.160 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:200.160,202.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:203.2,203.26 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:206.114,209.80 3 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:209.80,211.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.2,213.89 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:213.89,215.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_pegout_quote.go:216.2,216.18 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:13.101,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:17.112,20.99 3 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:20.99,22.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/get_user_deposits.go:23.2,23.22 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:16.171,18.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:20.102,24.62 4 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:24.62,26.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.2,28.103 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:28.103,30.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.2,32.84 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:32.84,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/init_deposit_cache.go:35.2,35.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:40.24,49.2 1 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:51.109,56.65 4 17 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:56.65,58.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.2,60.99 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:60.99,62.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.8,62.31 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:62.31,64.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.2,66.88 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:66.88,68.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.2,70.83 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:70.83,72.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:73.2,78.104 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:78.104,80.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.2,82.97 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:82.97,84.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:85.2,85.12 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:88.152,90.18 2 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:90.18,92.88 2 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:92.88,94.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:95.3,99.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:101.2,101.21 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:104.162,111.98 6 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:111.98,113.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.2,115.97 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:115.97,117.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.2,119.91 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:119.91,121.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.2,123.81 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:123.81,125.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:126.2,134.8 2 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:137.182,146.16 8 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:146.16,148.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:150.2,151.103 2 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:151.103,153.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:154.2,154.27 1 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:162.38,167.134 4 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:167.134,169.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.8,169.23 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:169.23,171.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:171.8,173.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:175.2,183.103 4 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:183.103,185.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:186.2,186.27 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:193.9,196.93 3 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:196.93,198.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.8,198.77 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:198.77,200.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/refund_pegout.go:201.2,201.12 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:28.22,36.2 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:38.107,43.73 4 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:43.73,45.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.2,47.99 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:47.99,49.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.8,49.31 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:49.31,51.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.2,53.87 1 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:53.87,55.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:57.2,60.80 3 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:60.80,62.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:64.2,67.76 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:67.76,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.2,71.104 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:71.104,73.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.2,74.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:74.16,76.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:77.2,77.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:86.9,88.18 2 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:88.18,90.88 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:90.88,92.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:93.3,98.5 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:100.2,100.21 1 13 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:107.42,113.67 5 12 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:113.67,115.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:117.2,117.104 1 11 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:117.104,119.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:119.8,119.87 1 10 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:119.87,121.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:121.8,121.55 1 9 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:121.55,124.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.8,124.92 1 8 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:124.92,126.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:126.8,126.61 1 7 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:126.61,128.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:129.2,129.21 1 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:137.38,143.16 5 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:143.16,146.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:148.2,148.129 1 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:148.129,150.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:150.8,152.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:154.2,162.27 4 3 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:169.9,174.63 4 6 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:174.63,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:177.2,179.38 3 5 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:179.38,181.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:182.2,182.12 1 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:185.125,186.76 1 16 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:186.76,188.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:188.8,188.46 1 15 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:188.46,190.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/send_pegout.go:191.2,191.12 1 14 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:13.97,15.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:17.55,19.104 2 4 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:19.104,21.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:13.152,15.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:17.86,25.128 6 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:25.128,27.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.2,28.41 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:28.41,30.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.2,32.131 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:32.131,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.2,35.43 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:35.43,37.3 1 13 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.2,39.81 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:39.81,41.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.2,42.83 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:42.83,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/clean_expired.go:46.2,47.25 2 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:15.114,17.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:23.110,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:27.123,28.15 1 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:29.79,30.46 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:31.10,32.81 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:36.136,41.99 5 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:41.99,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.2,45.47 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:45.47,46.99 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:46.99,48.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:49.3,52.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegin_quote.go:54.2,54.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:15.119,17.2 1 16 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:23.114,25.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:27.130,29.31 2 8 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:29.31,30.16 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:31.130,32.78 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:32.78,34.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:34.10,36.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:37.11,38.114 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:41.2,41.20 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:44.139,49.100 5 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:49.100,51.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.2,53.47 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:53.47,54.101 1 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:54.101,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:57.3,60.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/get_watched_pegout_quote.go:62.2,62.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:14.120,16.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:18.164,20.56 2 12 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:20.56,22.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.8,22.83 1 9 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:22.83,24.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:25.2,27.101 3 3 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:27.101,29.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.2,30.82 1 2 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:30.82,32.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/usecases/watcher/update_pegout_deposit.go:33.2,33.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 14 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 3 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 11 @@ -10350,73 +8547,93 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -10824,44 +9041,52 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -11000,16 +9225,16 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 7 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 18 @@ -11413,190 +9638,1197 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 36 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 21 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 105 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 119 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 117 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 33 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 22 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 23 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 19 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 19 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 18 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 16 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 32 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 42 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 188 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 49 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 5 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 2 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 128 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 63 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 126 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 62 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 192 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 38 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 18 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 49 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 60 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 32 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 30 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 29 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 28 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 28 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 4 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 8 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 6 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:21.65,23.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:25.63,26.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.53,28.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.2,29.48 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:29.48,31.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:32.2,32.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:35.63,36.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:37.20,38.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.47,40.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:41.3,41.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.35,43.47 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.47,45.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:46.3,46.13 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.10,48.75 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:52.89,54.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:56.107,64.16 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:64.16,66.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:68.2,69.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.16,71.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:73.2,74.33 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.33,76.10 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:76.10,78.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.3,79.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:79.67,81.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:82.3,83.49 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:85.2,89.8 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:92.72,94.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:94.16,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:98.2,99.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.16,101.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:103.2,104.62 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.62,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:107.2,107.25 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:110.75,112.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:112.16,114.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:116.2,117.56 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:120.55,122.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:122.16,124.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:125.2,125.44 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:128.91,130.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:130.16,132.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:134.2,136.50 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:136.50,138.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:140.2,143.29 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:143.29,144.18 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.18,146.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.2,149.69 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:149.69,151.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.2,152.17 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:152.17,154.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:156.2,157.20 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:160.117,162.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:162.16,164.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:165.2,166.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.16,168.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:170.2,171.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.16,173.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:175.2,176.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.16,178.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:180.2,184.8 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:187.92,189.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.16,191.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:192.2,193.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:193.16,195.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:196.2,197.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:197.16,199.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:200.2,201.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 31 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 24 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 42 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 2060 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 8190 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 4134 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 2474 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 17 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 14 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 @@ -11635,413 +10867,1482 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 14 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 36 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 126 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 21 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 105 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 119 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 117 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 33 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 11 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 22 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 22 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 22 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 27 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 72 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 71 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 56 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 35 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 154 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 26 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 71 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 46 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:25.43,26.30 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:26.30,30.31 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:30.31,33.4 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:35.2,35.26 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:38.80,39.30 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:39.30,42.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:43.2,47.38 5 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:47.38,50.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:51.2,53.21 3 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:56.62,57.30 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:57.30,60.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.2,61.37 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:61.37,62.38 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:62.38,64.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:65.3,65.26 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:67.2,71.34 5 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:74.57,75.30 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:75.30,78.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:79.2,82.9 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:82.9,84.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.2,85.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:85.37,87.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:38.27,48.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:50.55,52.2 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:54.55,56.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:58.79,62.16 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:62.16,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:66.2,69.16 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:69.16,71.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:72.2,73.48 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:76.114,80.16 4 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:80.16,82.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:83.2,87.16 3 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:87.16,89.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.2,90.39 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:90.39,92.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:93.2,95.52 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:95.52,97.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:97.8,102.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:105.113,110.16 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:110.16,112.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:113.2,114.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:114.16,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:117.2,120.16 4 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:120.16,122.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.2,123.39 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:123.39,125.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:126.2,128.52 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:128.52,130.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:130.8,136.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:139.117,140.135 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:140.135,142.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.2,143.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:143.16,145.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:146.2,146.28 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:149.115,150.133 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:150.133,152.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.2,153.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:153.16,155.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:156.2,156.28 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:159.113,160.131 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:160.131,162.3 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.2,163.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:163.16,165.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:166.2,166.28 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:173.32,175.16 2 15 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:175.16,178.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.2,179.26 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:179.26,182.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.2,183.70 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:183.70,186.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.2,187.70 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.70,190.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:191.2,191.27 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 23 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 20 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 19 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 19 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 18 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 17 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 16 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 15 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 14 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 10 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 @@ -12073,13 +12374,13 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 @@ -12101,8 +12402,8 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 @@ -12124,42 +12425,42 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/ro github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 32 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 9 github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 3 github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 42 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 12 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 13 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 122 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 188 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 272 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 8 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 8 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 @@ -12169,7 +12470,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86. github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 24 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 0 @@ -12177,23 +12478,23 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,11 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 4 -github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 22 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 8 github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:33.49,35.2 1 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:37.35,39.2 1 49 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:41.34,43.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:45.47,50.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:52.47,57.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:86.88,89.9 3 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:89.9,91.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.2,92.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:92.29,94.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:95.2,95.14 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 5 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 13 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 @@ -12214,14 +12515,14 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 3 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 2 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 1 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 @@ -12306,46 +12607,81 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.60,45.55 1 13 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:45.55,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.2,50.113 2 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:50.113,52.3 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:52.8,57.3 1 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:61.88,63.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.2,68.16 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.16,70.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,74.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:74.16,76.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,80.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:80.16,82.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:86.2,89.21 4 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:92.56,93.53 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.53,95.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:96.2,97.45 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:100.66,101.54 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.54,103.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:104.2,104.33 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:107.91,108.24 1 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.24,110.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:111.2,112.39 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.39,113.15 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.15,115.4 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.2,117.16 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:117.16,119.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:120.2,121.23 2 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.102,126.16 2 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.16,128.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,131.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:131.16,133.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:134.2,134.22 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:137.128,138.29 1 12 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.29,142.3 3 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.8,143.39 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.39,145.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.3,148.19 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 5 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 13 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 5 diff --git a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go index 0de6f8b5..8c9b99f0 100644 --- a/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go +++ b/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go @@ -16,6 +16,10 @@ const ( WalletUnlockSeconds = 10 ) +// Deprecated: this implementation of the BitcoinWallet is considered insecure as it uses the wallet +// that is inside the bitcoin node. This means that it expects the private keys to live inside a node +// that is supposed to be used for monitoring purposes only. Prefer using DerivativeWallet instead or +// any other implementation that stores the PK in a safer place. type bitcoindWallet struct { conn *Connection address string @@ -24,6 +28,7 @@ type bitcoindWallet struct { password string } +// Deprecated: this constructor is deprecated since the structure it creates is deprecated func NewBitcoindWallet( conn *Connection, address string, diff --git a/internal/adapters/dataproviders/bitcoin/connection.go b/internal/adapters/dataproviders/bitcoin/connection.go index 663fffa1..bf06ff5e 100644 --- a/internal/adapters/dataproviders/bitcoin/connection.go +++ b/internal/adapters/dataproviders/bitcoin/connection.go @@ -7,16 +7,25 @@ import ( log "github.com/sirupsen/logrus" ) +// Connection is a struct that holds the connection to a Bitcoin node type Connection struct { NetworkParams *chaincfg.Params client btcclient.ClientAdapter WalletId string } +// NewWalletConnection creates a new Connection with a walletId. This connection will use the walletId +// to make the requests to an endpoint referring to that specific wallet on the RPC server. +// E.g. http://127.0.0.1:8332/wallet/. Using this constructor has the same effect as using the +// -rpcwallet option in bitcoin-cli. Prefer this constructor if the Connection will be used by a +// blockchain.BitcoinWallet implementation func NewWalletConnection(networkParams *chaincfg.Params, client btcclient.ClientAdapter, walletId string) *Connection { return &Connection{NetworkParams: networkParams, client: client, WalletId: walletId} } +// NewConnection creates a new Connection with no walletId. This connection will make requests to the default +// endpoint of the RPC server. Prefer this constructor if the Connection will be used by a structure that only +// needs to use non-wallet related RPC methods func NewConnection(networkParams *chaincfg.Params, client btcclient.ClientAdapter) *Connection { return &Connection{NetworkParams: networkParams, client: client} } From d4cfb1328194778e41146d96eff53dd628a9bcfe Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Fri, 3 May 2024 13:43:17 +0200 Subject: [PATCH 062/113] fix: fix sonar warnings --- internal/usecases/pegin/call_for_user_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/usecases/pegin/call_for_user_test.go b/internal/usecases/pegin/call_for_user_test.go index 303bc8e1..8aae3eec 100644 --- a/internal/usecases/pegin/call_for_user_test.go +++ b/internal/usecases/pegin/call_for_user_test.go @@ -145,7 +145,7 @@ func TestCallForUserUseCase_Run_AddExtraAmountDuringCall(t *testing.T) { func TestCallForUserUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", - DepositAddress: "deposit address", + DepositAddress: test.AnyAddress, Signature: "signature", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateWaitingForDeposit, @@ -219,7 +219,7 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ Hash: "0x1d1e", Confirmations: 10, - Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, + Outputs: map[string][]*entities.Wei{test.AnyAddress: {entities.NewWei(1700)}}, }, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{}, assert.AnError).Once() }, @@ -229,7 +229,7 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ Hash: "0x1d1e", Confirmations: 10, - Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, + Outputs: map[string][]*entities.Wei{test.AnyAddress: {entities.NewWei(1700)}}, }, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{ Hash: [32]byte{1, 2, 3}, @@ -244,7 +244,7 @@ func callForUserRecoverableErrorSetups() []func(caseRetainedQuote *quote.Retaine btc.On("GetTransactionInfo", mock.Anything).Return(blockchain.BitcoinTransactionInformation{ Hash: "0x1d1e", Confirmations: 10, - Outputs: map[string][]*entities.Wei{"deposit address": {entities.NewWei(1700)}}, + Outputs: map[string][]*entities.Wei{test.AnyAddress: {entities.NewWei(1700)}}, }, nil).Once() btc.On("GetTransactionBlockInfo", mock.Anything).Return(blockchain.BitcoinBlockInformation{ Hash: [32]byte{1, 2, 3}, From 185545b8b0d79e6c60c877ed734a879dfbbe1d02 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Mon, 6 May 2024 19:55:31 +0200 Subject: [PATCH 063/113] test: add unit tests for mongodb interactions --- .mockery.yaml | 5 + coverage/cover.out | 3893 ++++++++++++++--- .../dataproviders/database/mongo/bindings.go | 61 + .../dataproviders/database/mongo/common.go | 35 +- .../database/mongo/common_test.go | 100 + .../database/mongo/liquidity_provider.go | 46 +- .../database/mongo/liquidity_provider_test.go | 311 ++ .../dataproviders/database/mongo/mongo.go | 4 +- .../dataproviders/database/mongo/pegin.go | 42 +- .../database/mongo/pegin_test.go | 319 ++ .../dataproviders/database/mongo/pegout.go | 61 +- .../database/mongo/pegout_test.go | 437 ++ .../rootstock/account/account_test.go | 28 +- .../dataproviders/rootstock/common_test.go | 2 +- .../dataproviders/rootstock/wallet_test.go | 14 +- internal/configuration/bootstrap/database.go | 2 +- test/mocks/collection_binding_mock.go | 773 ++++ test/mocks/db_binding_mock.go | 99 + test/mocks/db_client_binding_mock.go | 196 + test/utils.go | 43 +- 20 files changed, 5822 insertions(+), 649 deletions(-) create mode 100644 internal/adapters/dataproviders/database/mongo/bindings.go create mode 100644 internal/adapters/dataproviders/database/mongo/common_test.go create mode 100644 internal/adapters/dataproviders/database/mongo/liquidity_provider_test.go create mode 100644 internal/adapters/dataproviders/database/mongo/pegin_test.go create mode 100644 internal/adapters/dataproviders/database/mongo/pegout_test.go create mode 100644 test/mocks/collection_binding_mock.go create mode 100644 test/mocks/db_binding_mock.go create mode 100644 test/mocks/db_client_binding_mock.go diff --git a/.mockery.yaml b/.mockery.yaml index 20bf66b8..96611261 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -16,6 +16,11 @@ packages: LbcCallerBinding: LbcAdapter: EventIteratorAdapter: + github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo: + interfaces: + DbClientBinding: + DbBinding: + CollectionBinding: github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient: interfaces: RpcClient: diff --git a/coverage/cover.out b/coverage/cover.out index f238b3fc..0ef6162f 100644 --- a/coverage/cover.out +++ b/coverage/cover.out @@ -3,49 +3,49 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go: github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:24.110,38.16 3 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:38.16,40.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/alerting/ses.go:41.2,43.12 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -89,12 +89,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -311,6 +311,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -990,49 +1128,1238 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.36,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.2,33.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:33.17,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:36.2,37.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:40.86,41.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:41.48,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:44.2,44.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:47.54,49.44 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:49.44,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:52.2,52.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:55.110,62.75 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:62.75,64.31 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:64.31,67.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:67.9,71.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:72.3,76.14 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:79.2,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:85.95,91.22 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:91.22,93.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:95.2,101.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:101.16,103.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.2,105.31 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:105.31,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:109.16,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:113.2,114.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:117.152,123.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:131.2,132.29 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:132.29,134.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:134.10,141.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.3,142.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:142.44,144.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:145.3,146.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:146.17,148.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:149.3,149.134 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.51,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:38.2,40.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:43.2,43.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:46.52,53.107 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:53.107,54.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:54.52,56.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:58.2,59.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:59.8,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.2,63.66 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:63.66,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.2,67.98 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:67.98,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.8,69.62 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:69.62,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:73.2,73.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:76.86,77.79 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:77.79,79.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:80.2,89.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:89.16,91.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:92.2,92.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:95.57,98.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:101.2,102.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:102.16,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:105.2,106.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:106.16,108.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:109.2,109.141 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:112.110,115.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:115.87,117.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:119.2,126.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:129.2,130.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:134.2,142.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:149.2,150.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:153.69,158.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:162.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.2,171.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:171.29,172.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:172.63,174.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.3,175.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:175.29,177.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:179.2,179.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:182.147,184.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:184.16,186.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:188.2,191.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:195.2,196.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:196.16,198.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:199.2,202.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:202.16,204.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:205.2,206.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:206.16,208.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:210.2,212.72 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:212.72,214.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:214.17,216.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.9,216.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:216.23,218.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:219.3,219.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.2,221.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:221.16,223.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:225.2,227.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:227.16,229.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:230.2,230.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:233.69,235.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:237.117,239.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:241.50,243.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:243.16,246.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:247.2,247.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:250.48,252.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:254.69,260.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:260.16,262.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.8,262.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:262.46,264.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.2,266.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:266.63,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:269.2,269.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:272.103,274.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:274.16,276.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:277.2,278.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:278.16,280.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:281.2,288.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:22.65,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:26.63,27.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:27.53,29.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.2,30.48 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:30.48,32.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:33.2,33.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:36.63,37.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:38.20,39.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:39.47,41.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:42.3,42.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:43.35,44.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:44.47,46.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:47.3,47.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:48.10,49.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:53.89,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:57.107,65.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:65.16,67.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:69.2,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:74.2,75.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:75.33,77.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:77.10,79.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.3,80.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:80.67,82.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:83.3,84.49 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:86.2,90.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:93.72,95.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:95.16,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:99.2,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:104.2,105.62 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:105.62,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:108.2,108.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:111.75,113.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:113.16,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:117.2,118.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:121.55,123.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:123.16,125.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:126.2,126.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:129.91,131.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:131.16,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:135.2,137.50 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:137.50,139.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:141.2,144.29 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:144.29,145.18 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:145.18,147.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.2,150.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:150.69,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.2,153.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:153.17,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:157.2,158.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:161.117,163.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:171.2,172.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:172.16,174.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:176.2,177.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:177.16,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:181.2,186.8 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:189.92,191.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:191.16,193.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:194.2,195.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:195.16,197.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:198.2,199.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:199.16,201.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/rpc.go:202.2,203.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:22.89,27.64 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:27.64,28.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:28.52,30.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.2,32.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:32.29,34.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:35.2,35.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:38.85,40.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:40.16,42.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:43.2,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:53.2,53.43 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:56.109,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:60.68,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:64.126,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:68.68,70.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:70.16,72.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:73.2,73.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:76.116,78.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:80.49,83.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/watchonly_wallet.go:85.47,87.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:24.101,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:29.72,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:33.144,35.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:35.15,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:39.2,40.42 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:40.42,41.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:41.51,46.4 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:48.2,49.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:52.128,54.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:56.94,68.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:72.2,75.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:75.16,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:78.2,80.25 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:80.25,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:86.2,87.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:87.16,89.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:91.2,93.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:93.35,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:97.2,98.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:98.16,100.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.8,100.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:100.34,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:103.2,103.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:106.49,107.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:107.25,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/adapter.go:109.8,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/binding.go:11.13,13.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:24.85,26.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:26.16,28.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:32.2,34.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:34.16,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:38.2,39.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:39.16,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:43.2,44.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 25 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 11 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 10 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 73 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 74 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 12 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 20 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 27 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:58.26,60.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:63.77,66.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:66.28,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.2,69.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:69.16,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:73.2,73.52 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:76.135,82.26 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:82.26,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.2,85.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:85.16,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:89.2,89.120 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:92.66,94.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:96.87,104.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:104.28,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.2,107.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:110.2,112.37 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:112.37,114.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:114.27,116.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.3,117.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:117.17,119.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:120.3,120.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:123.2,124.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:124.28,126.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.2,127.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:131.2,132.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:132.26,134.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.2,135.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:135.16,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:139.2,140.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:140.28,142.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.2,143.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:147.2,155.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:35.55,37.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:39.44,41.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:43.54,47.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:49.63,51.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:54.2,54.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:63.70,64.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:64.39,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:67.2,68.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:71.97,76.18 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:76.18,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.2,80.30 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:80.30,82.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:82.17,84.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:85.3,85.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:87.2,87.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:90.124,96.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:96.16,98.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:99.2,100.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:100.15,102.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:102.20,104.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:104.9,106.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/common.go:108.2,108.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:14.96,16.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:18.64,21.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:21.28,23.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.2,24.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/fee_collector.go:27.2,27.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:40.38,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:50.61,52.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:54.101,59.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:59.16,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:63.2,64.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:64.28,66.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.2,67.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:67.16,69.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:70.2,70.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:73.104,78.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:78.16,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:82.2,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:89.2,89.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:92.114,100.28 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:100.28,102.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.2,103.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:103.16,105.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:107.2,110.37 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:110.37,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:114.2,115.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:115.71,117.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:121.2,122.36 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:122.36,125.30 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:125.30,127.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:128.3,135.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:137.2,137.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:140.64,146.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:146.33,147.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:147.75,149.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.2,152.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:152.16,154.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.8,154.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:154.50,156.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:157.2,157.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:160.92,169.33 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:169.33,170.86 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:170.86,172.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.2,175.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:175.16,177.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.8,177.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:177.50,179.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:180.2,180.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:183.94,187.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:187.61,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:190.2,191.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:191.28,193.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.2,194.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:194.16,196.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:197.2,197.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:200.100,204.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:204.61,206.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:207.2,208.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:208.28,210.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.2,211.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:211.16,213.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:214.2,214.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:217.87,221.28 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:221.28,223.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.2,224.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:224.16,226.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:227.2,227.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:230.83,238.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:238.33,239.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:239.82,241.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.2,244.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:244.16,246.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.8,246.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:246.50,248.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:249.2,249.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:252.89,260.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:260.33,261.88 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:261.88,263.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.2,266.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:266.16,268.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.8,268.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:268.50,270.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:271.2,271.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:274.68,281.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:281.33,282.87 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:282.87,284.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.2,287.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:287.16,289.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.8,289.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:289.50,291.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:292.2,292.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:295.74,302.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:302.33,303.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:303.93,305.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.2,308.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:308.16,310.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.8,310.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:310.50,312.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:313.2,313.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:316.91,320.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:320.61,322.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:323.2,324.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:324.28,326.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.2,327.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:327.16,329.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:330.2,330.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:333.137,335.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:335.16,337.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:339.2,347.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:347.33,348.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:348.80,350.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.2,353.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:353.16,355.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.8,355.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:355.27,357.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.8,357.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:357.32,360.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:361.2,361.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:364.110,368.66 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:368.66,370.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:371.2,381.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:381.59,385.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.8,385.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:385.23,387.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:389.2,395.89 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:395.89,398.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.2,400.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:400.16,402.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.8,402.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:402.27,404.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.8,404.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:404.32,407.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:408.2,408.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:411.147,419.88 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:419.88,422.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.2,424.59 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:424.59,427.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.8,427.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:427.23,429.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.8,429.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:429.27,431.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.8,431.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:431.32,434.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:435.2,435.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:438.90,443.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:443.61,445.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:447.2,448.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:448.24,450.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:453.91,458.61 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:458.61,460.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:462.2,463.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:463.24,465.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:468.145,479.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:479.15,480.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:480.25,481.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:481.63,483.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.2,486.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:486.38,488.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.2,490.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:490.22,500.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.2,501.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:501.40,503.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:505.2,505.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:508.168,518.15 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:518.15,519.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:519.25,520.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:520.63,522.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.2,525.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:525.38,527.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.2,529.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:529.22,536.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.2,537.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:537.40,539.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:540.2,540.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:543.158,552.33 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:552.33,553.77 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:553.77,555.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.2,558.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:558.16,560.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.8,560.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:560.76,562.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:564.2,565.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:565.16,567.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:568.2,568.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:572.86,577.59 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:577.59,579.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.2,581.110 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:581.110,583.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:583.8,585.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.2,586.126 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:586.126,588.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.2,589.133 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:589.133,591.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.2,593.84 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:593.84,595.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.2,596.103 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:596.103,598.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.2,599.96 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:599.96,601.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.2,602.94 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:602.94,604.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.2,606.92 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:606.92,608.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:610.2,623.25 14 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:627.90,631.60 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:631.60,633.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.2,635.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:635.85,637.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.2,638.89 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:638.89,640.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.2,641.97 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:641.97,643.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.2,645.127 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:645.127,647.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.2,648.119 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:648.119,650.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.2,651.124 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:651.124,653.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/lbc.go:655.2,670.25 16 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:25.97,27.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:29.98,33.59 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:33.59,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:37.2,38.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:38.28,40.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.2,42.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:42.16,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:49.133,55.59 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:55.59,57.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.2,59.70 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:59.70,61.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.8,61.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:61.23,63.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:65.2,71.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:71.26,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.2,74.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:74.16,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:76.8,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:81.80,83.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:83.28,85.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.2,86.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:86.16,88.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:88.8,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:93.74,95.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:95.26,97.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:100.122,104.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:104.16,106.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:108.2,109.34 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:109.34,111.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.2,112.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:112.16,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:116.2,117.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:117.38,120.4 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.2,121.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:125.2,130.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:130.16,131.72 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:131.72,133.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:135.2,144.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:147.99,155.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:155.26,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.2,158.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:162.2,163.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:163.28,165.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.2,166.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:166.16,168.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:170.2,171.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:171.26,173.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.2,174.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:174.16,176.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:178.2,178.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:181.106,182.76 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:182.76,184.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:185.2,186.32 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:186.32,188.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.2,189.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:189.16,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/rpc.go:193.2,198.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:24.102,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:28.55,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:32.117,34.65 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:34.65,36.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:37.2,38.87 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:41.68,43.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:45.68,47.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:47.16,50.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:51.2,52.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:52.16,55.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:56.2,57.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:57.16,60.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:61.2,62.77 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:65.131,71.52 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:71.52,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:75.2,78.77 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:78.77,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.2,82.85 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:82.85,84.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:86.2,94.67 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:94.67,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.2,97.71 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:97.71,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/wallet.go:100.2,100.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:49.113,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:51.8,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:60.88,62.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:66.2,67.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:67.15,68.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:68.17,70.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.2,72.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:76.2,77.15 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:77.15,77.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:78.2,79.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:79.16,81.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:83.2,90.21 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:93.56,94.53 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:94.53,96.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:97.2,98.45 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:101.66,102.54 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:102.54,104.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:105.2,105.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:108.91,109.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:109.24,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:112.2,113.39 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:113.39,114.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:114.15,116.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.2,118.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:118.16,120.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:122.2,124.15 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:124.15,126.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:126.17,128.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.2,130.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:130.16,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:133.2,133.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:136.102,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:142.2,143.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:146.2,146.22 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:149.128,150.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:150.29,154.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:154.8,155.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:155.39,157.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:158.3,160.19 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:17.103,22.65 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:22.65,24.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:24.8,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.2,28.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:28.16,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:31.2,31.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:34.129,36.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:36.16,38.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:40.2,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:44.2,44.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:47.130,49.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:49.16,51.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:53.2,54.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:54.16,56.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:56.17,58.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:60.3,61.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:61.17,63.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:65.2,65.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:68.101,72.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:75.17,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:79.2,80.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:80.16,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:84.2,85.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:88.101,91.41 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:91.41,93.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:93.17,95.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:96.3,96.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:99.2,100.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:103.110,105.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:105.16,107.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:109.2,110.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:110.16,112.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.2,113.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:113.68,115.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:117.2,117.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:120.113,122.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:122.16,124.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:126.2,127.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:127.16,129.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:130.2,134.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:137.2,143.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:143.16,145.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:146.2,153.36 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:156.87,160.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:160.16,162.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.2,164.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:164.17,166.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:168.2,169.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:169.16,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:173.2,174.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:177.101,182.41 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:182.41,184.17 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:184.17,186.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:187.3,187.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:190.2,191.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:194.54,200.2 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:202.84,207.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:210.37,211.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:212.9,213.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:214.9,215.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:216.9,217.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:218.9,219.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:220.9,221.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:222.9,223.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:224.9,225.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:226.9,227.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:228.9,229.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:230.10,231.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:232.10,233.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:234.10,235.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:236.10,237.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:238.10,239.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:240.10,241.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:242.10,243.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:247.63,248.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:249.35,250.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:251.36,252.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:253.10,254.16 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:258.75,268.2 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:270.181,274.31 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:274.31,275.80 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:275.80,277.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:278.8,279.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:279.82,281.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:284.2,285.98 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:285.98,287.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/federation/federation.go:289.2,292.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:14.44,15.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:15.35,17.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.2,18.41 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:18.41,20.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/utils/utils.go:23.80,27.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:19.34,21.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:44.78,46.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:46.16,48.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:49.2,51.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:51.16,53.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.2,54.36 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:54.36,56.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/common.go:57.2,57.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:20.41,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:24.33,26.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/event.go:28.50,30.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:20.27,24.2 3 25 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:26.29,30.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:32.33,36.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:38.34,43.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:45.27,47.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:49.31,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:53.36,55.2 1 183 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:57.31,59.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:61.35,63.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:65.38,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:69.31,71.2 1 88 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:73.45,74.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:74.14,76.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:77.2,77.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:80.43,81.27 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:82.14,84.10 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:84.10,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:88.11,89.47 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:90.10,91.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:95.45,97.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:99.49,101.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:103.65,105.2 1 48 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:107.78,108.64 1 22 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:108.64,110.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:111.2,112.69 2 22 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:112.69,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:115.2,116.12 2 22 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:119.35,122.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:124.35,127.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/wei.go:129.35,132.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:34.49,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:38.35,40.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:42.34,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:46.47,51.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:53.47,58.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:87.88,90.9 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:90.9,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.2,93.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:93.29,95.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/bitcoin.go:96.2,96.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:25.51,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:45.50,55.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/lbc.go:69.30,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:30.63,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:33.40,35.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:61.107,63.19 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:63.19,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain/rootstock.go:66.2,66.75 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:51.77,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:55.78,57.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:59.58,60.50 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:60.50,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:83.2,84.56 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:84.56,87.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.2,88.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:88.17,90.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:90.8,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:24.64,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:34.64,42.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:44.53,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:55.55,65.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/default.go:67.57,72.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:23.38,24.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:25.51,26.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:27.10,28.15 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:32.43,34.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:36.44,38.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:40.57,42.28 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:42.28,44.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/liquidity_provider.go:44.8,46.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:60.49,62.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:64.43,66.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:68.48,69.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:69.24,71.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.2,72.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:72.26,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.2,75.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:75.25,77.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegin_quote.go:78.2,83.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:65.50,67.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:69.44,71.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:73.108,75.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:77.49,78.24 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:78.24,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.2,81.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:81.26,83.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.2,84.25 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:84.25,86.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:87.2,92.14 6 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/quote/pegout_quote.go:122.71,127.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:8.63,11.52 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:11.52,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.2,14.33 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:14.33,16.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/encoding.go:17.2,17.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:19.92,20.42 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:20.42,22.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:23.2,24.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:24.16,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:27.2,29.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:29.16,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:32.2,32.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:35.53,37.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:37.16,39.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.8,39.57 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:39.57,41.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/hashing.go:42.2,43.18 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:10.34,11.11 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:11.11,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:14.2,14.14 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:17.43,19.11 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:19.11,21.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:21.8,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.2,24.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:24.37,26.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/math.go:27.2,27.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:20.78,21.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:21.29,22.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:22.40,24.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:26.2,26.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:29.58,41.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:43.54,44.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:44.37,45.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:45.26,47.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.3,48.26 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:48.26,50.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:51.3,51.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:55.45,56.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:56.37,57.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:57.44,59.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:60.3,60.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:64.45,65.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:65.37,66.44 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:66.44,68.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:69.3,69.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:73.41,74.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:74.37,75.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:75.40,77.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:78.3,78.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:82.47,83.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:83.37,84.51 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:84.51,86.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/passwords.go:87.3,87.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:9.36,11.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:11.16,13.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:14.2,14.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -1076,12 +2403,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -1298,6 +2625,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -1977,49 +3442,81 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 24 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 24 @@ -2063,12 +3560,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -2285,6 +3782,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -2964,6 +4599,38 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:43.60,44.55 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:44.55,46.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account/account.go:48.2,49.113 2 0 @@ -3441,7 +5108,7 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:62.8,64.3 1 8 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:67.58,70.38 2 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:70.38,71.23 1 23 -github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 14 +github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:71.23,73.4 1 10 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:75.2,75.17 1 6 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:78.82,80.33 2 15 github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider/configuration.go:80.33,82.3 1 75 @@ -3659,49 +5326,49 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -3745,12 +5412,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -3967,6 +5634,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -4678,49 +6483,49 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39, github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 4 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -4764,12 +6569,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -4986,6 +6791,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -5888,49 +7831,49 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_c github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.8,21.23 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:21.23,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegin/withdraw_collateral.go:24.2,24.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -5974,12 +7917,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -6196,6 +8139,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -7114,49 +9195,49 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_ github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.8,21.23 1 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:21.23,23.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/pegout/withdraw_collateral.go:24.2,24.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -7200,12 +9281,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -7422,6 +9503,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -8364,49 +10583,49 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/li github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.2,187.70 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.70,190.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:191.2,191.27 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -8450,12 +10669,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -8672,6 +10891,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -9572,49 +11929,49 @@ github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provid github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:29.2,30.16 2 2 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:30.16,32.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider/set_pegout_config.go:33.2,33.12 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 66 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 65 @@ -9658,12 +12015,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -9880,6 +12237,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 14 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 2 @@ -10559,49 +13054,81 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 25 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 7 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 9 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 25 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 9 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 8 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 8 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 6 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 5 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 4 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 7 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 8 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 6 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 5 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 4 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 3 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 134 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 6 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 128 @@ -10645,12 +13172,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 12 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 49 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 60 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 2 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 1 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 49 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 60 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 2 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 1 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 2 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 32 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 1 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 31 @@ -10867,6 +13394,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 @@ -11546,6 +14211,38 @@ github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go: github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:17.58,21.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:21.16,23.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/entities/utils/random.go:24.2,24.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:74.31,76.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:78.44,80.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:82.39,83.55 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:83.55,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:85.8,87.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:90.59,92.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:94.79,95.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:95.20,97.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:97.8,99.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:107.176,111.27 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:111.27,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:118.2,121.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:121.16,123.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:124.2,127.8 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:130.108,135.70 4 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:135.70,137.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.2,138.35 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:138.35,142.3 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:143.2,143.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:151.31,153.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:153.16,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:156.2,158.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:158.16,160.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/common.go:161.2,166.26 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:20.103,22.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:35.69,41.38 5 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:41.38,44.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.2,45.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:45.39,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.2,49.39 1 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:49.39,52.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/usecases/health.go:54.2,65.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:25.43,26.30 1 9 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:26.30,30.31 3 4 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/event.go:30.31,33.4 2 4 @@ -11620,49 +14317,49 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/li github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.2,187.70 1 6 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:187.70,190.3 2 3 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/liquidity_provider.go:191.2,191.27 1 3 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:33.28,41.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:43.108,45.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:45.16,47.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:49.2,63.16 7 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:63.16,65.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:66.2,67.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:67.16,69.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:70.2,71.55 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:74.67,78.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:78.16,80.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.2,82.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:82.29,83.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.21,84.64 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:84.64,86.5 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.4,87.93 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:90.2,90.21 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:93.125,95.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.16,97.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:99.2,104.16 4 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.16,106.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:108.2,109.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:38.28,46.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:48.108,50.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:50.16,52.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:54.2,68.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:68.16,70.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:71.2,72.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:72.16,74.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:75.2,76.55 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:79.67,83.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:83.16,85.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.2,87.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:87.29,88.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:88.21,89.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:89.64,91.5 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:92.4,92.93 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:95.2,95.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:98.125,100.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:100.16,102.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:104.2,109.16 4 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:109.16,111.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:112.2,121.24 5 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:121.24,122.40 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:122.40,124.4 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.2,129.16 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:129.16,131.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,133.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:133.16,135.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:136.2,137.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.16,139.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:140.2,140.29 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:143.46,145.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.16,147.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.2,148.91 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.91,151.3 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:152.2,152.82 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:155.67,157.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.16,159.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.2,160.67 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:163.115,165.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:167.46,169.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:171.48,173.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:113.2,114.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:114.16,116.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:117.2,126.24 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:126.24,127.40 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:127.40,129.4 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:132.2,134.16 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:134.16,136.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:137.2,138.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:138.16,140.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:141.2,142.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:145.2,145.29 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:148.46,150.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:150.16,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.2,153.91 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:153.91,156.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:157.2,157.82 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:160.67,162.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:162.16,164.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:165.2,165.67 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:168.115,170.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:172.46,174.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/bitcoind_wallet.go:176.48,178.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:25.76,28.16 3 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:28.16,30.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:30.8,30.36 1 0 @@ -11706,12 +14403,12 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.2,152.30 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:152.30,155.3 2 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/common.go:156.2,156.20 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:16.119,18.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:20.96,22.2 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:24.55,28.2 3 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:30.64,32.16 2 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:32.16,34.3 1 0 -github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:35.2,35.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:22.119,24.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:29.96,31.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:33.55,37.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:39.64,41.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/connection.go:44.2,44.19 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:31.37,32.41 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:32.41,34.3 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/derivative_wallet.go:35.2,35.51 1 0 @@ -11928,6 +14625,144 @@ github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bi github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:44.87,45.95 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:45.95,47.4 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/bitcoin/btcclient/sign_with_key.go:50.2,50.56 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:23.61,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:27.91,28.17 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:28.17,30.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:31.2,31.13 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:42.55,44.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/bindings.go:46.105,48.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:24.61,25.21 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:26.30,27.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:28.12,29.64 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:30.14,31.63 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:32.10,33.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:42.56,45.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:47.40,49.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:51.70,53.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:55.57,62.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:62.16,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:64.8,66.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:69.64,71.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:71.16,73.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/common.go:74.2,74.19 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:34.102,36.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:38.140,42.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:44.142,48.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:50.144,54.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:56.153,64.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:66.155,74.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:76.157,84.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:86.132,90.2 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:92.144,100.2 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:106.9,108.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:114.32,116.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:123.9,128.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.2,131.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:131.20,133.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:134.2,134.12 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:142.32,148.42 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:148.42,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.8,150.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:150.23,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.2,153.20 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:153.20,155.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/liquidity_provider.go:156.2,156.28 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:15.102,29.65 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:29.65,31.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:32.2,33.46 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:33.46,35.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:35.8,37.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/mongo.go:40.67,49.2 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:23.75,25.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:32.116,41.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:41.16,43.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:43.8,46.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:49.105,58.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:58.42,60.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.8,60.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:60.23,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:63.2,64.32 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:67.121,76.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:76.42,78.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.8,78.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:78.23,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:81.2,82.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:85.122,90.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:90.16,92.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:92.8,95.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:98.122,107.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.8,109.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:109.38,111.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.8,111.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:111.37,113.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:114.2,115.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:118.144,126.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:126.16,128.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.2,129.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:129.46,131.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:132.2,133.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:136.100,142.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:142.16,144.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:145.2,146.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:146.16,148.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.8,148.68 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:148.68,150.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegin.go:151.2,153.74 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:30.77,32.2 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:34.119,43.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:43.16,45.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:45.8,48.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:51.107,60.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:60.42,62.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.8,62.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:62.23,64.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:65.2,66.33 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:69.123,78.42 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:78.42,80.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.8,80.23 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:80.23,82.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:83.2,84.21 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:87.124,92.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:92.16,94.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:94.8,97.3 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:100.132,107.16 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:107.16,109.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:111.2,112.51 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:112.51,114.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:115.2,116.23 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:119.124,128.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:128.16,130.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.8,130.38 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:130.38,132.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.8,132.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:132.37,134.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:135.2,136.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:139.147,147.16 7 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:147.16,149.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.2,150.46 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:150.46,152.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:153.2,154.20 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:157.101,163.16 5 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:163.16,165.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:166.2,167.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:167.16,169.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.8,169.69 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:169.69,171.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:172.2,174.75 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:177.112,187.16 4 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:187.16,189.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.8,189.37 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:189.37,191.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:192.2,193.12 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:196.116,200.24 3 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:200.24,202.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:204.2,205.35 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:205.35,213.3 6 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:215.2,219.16 2 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:219.16,221.3 1 0 +github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo/pegout.go:222.2,222.12 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:38.30,49.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:51.50,53.2 1 0 github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/bridge.go:55.62,58.26 2 0 diff --git a/internal/adapters/dataproviders/database/mongo/bindings.go b/internal/adapters/dataproviders/database/mongo/bindings.go new file mode 100644 index 00000000..2cae2e44 --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/bindings.go @@ -0,0 +1,61 @@ +package mongo + +import ( + "context" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/mongo/readpref" +) + +// The wrapper structs defined in this class are meant to ease the mocking of the mongo driver structs + +type DbClientBinding interface { + Database(name string, opts ...*options.DatabaseOptions) DbBinding + Disconnect(ctx context.Context) error + Ping(ctx context.Context, rp *readpref.ReadPref) error +} + +type ClientWrapper struct { + *mongo.Client + db DbBinding +} + +func NewClientWrapper(client *mongo.Client) DbClientBinding { + return &ClientWrapper{Client: client} +} + +func (c *ClientWrapper) Database(name string, opts ...*options.DatabaseOptions) DbBinding { + if c.db == nil { + c.db = NewDatabaseWrapper(c.Client.Database(name, opts...)) + } + return c.db +} + +type DbBinding interface { + Collection(name string, opts ...*options.CollectionOptions) CollectionBinding +} + +type DatabaseWrapper struct { + *mongo.Database +} + +func NewDatabaseWrapper(db *mongo.Database) DbBinding { + return &DatabaseWrapper{Database: db} +} + +func (d *DatabaseWrapper) Collection(name string, opts ...*options.CollectionOptions) CollectionBinding { + return d.Database.Collection(name, opts...) +} + +type CollectionBinding interface { + InsertOne(ctx context.Context, document any, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) + InsertMany(ctx context.Context, documents []any, opts ...*options.InsertManyOptions) (*mongo.InsertManyResult, error) + FindOne(ctx context.Context, filter any, opts ...*options.FindOneOptions) *mongo.SingleResult + Find(ctx context.Context, filter any, opts ...*options.FindOptions) (*mongo.Cursor, error) + UpdateOne(ctx context.Context, filter any, update any, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) + UpdateMany(ctx context.Context, filter any, update any, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) + DeleteOne(ctx context.Context, filter any, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) + DeleteMany(ctx context.Context, filter any, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) + ReplaceOne(ctx context.Context, filter any, replacement any, opts ...*options.ReplaceOptions) (*mongo.UpdateResult, error) + BulkWrite(ctx context.Context, models []mongo.WriteModel, opts ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error) +} diff --git a/internal/adapters/dataproviders/database/mongo/common.go b/internal/adapters/dataproviders/database/mongo/common.go index 71d3aa79..3d549e9d 100644 --- a/internal/adapters/dataproviders/database/mongo/common.go +++ b/internal/adapters/dataproviders/database/mongo/common.go @@ -3,32 +3,31 @@ package mongo import ( "context" log "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/mongo" "time" ) const ( dbTimeout = 3 * time.Second - dbName = "flyover" + DbName = "flyover" ) -type dbInteraction string +type DbInteraction string const ( - read dbInteraction = "READ" - insert dbInteraction = "INSERT" - update dbInteraction = "UPDATE" - upsert dbInteraction = "UPSERT" - delete dbInteraction = "DELETE" + Read DbInteraction = "READ" + Insert DbInteraction = "INSERT" + Update DbInteraction = "UPDATE" + Upsert DbInteraction = "UPSERT" + Delete DbInteraction = "DELETE" ) -func logDbInteraction(interaction dbInteraction, value any) { +func logDbInteraction(interaction DbInteraction, value any) { switch interaction { - case insert, update, upsert: + case Insert, Update, Upsert: log.Infof("%s interaction with db: %#v", interaction, value) - case read: + case Read: log.Debugf("%s interaction with db: %#v", interaction, value) - case delete: + case Delete: log.Debugf("%s interaction with db: %v", interaction, value) default: log.Debug("Unknown DB interaction") @@ -36,20 +35,20 @@ func logDbInteraction(interaction dbInteraction, value any) { } type Connection struct { - client *mongo.Client - db *mongo.Database + client DbClientBinding + db DbBinding } -func NewConnection(client *mongo.Client) *Connection { - db := client.Database(dbName) +func NewConnection(client DbClientBinding) *Connection { + db := client.Database(DbName) return &Connection{client: client, db: db} } -func (c *Connection) GetDb() *mongo.Database { +func (c *Connection) GetDb() DbBinding { return c.db } -func (c *Connection) Collection(collection string) *mongo.Collection { +func (c *Connection) Collection(collection string) CollectionBinding { return c.db.Collection(collection) } diff --git a/internal/adapters/dataproviders/database/mongo/common_test.go b/internal/adapters/dataproviders/database/mongo/common_test.go new file mode 100644 index 00000000..f7b130d5 --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/common_test.go @@ -0,0 +1,100 @@ +package mongo_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "go.mongodb.org/mongo-driver/mongo/readpref" + "sync" + "testing" +) + +func TestConnection_GetDb(t *testing.T) { + client := &mocks.DbClientBindingMock{} + client.On("Database", mongo.DbName).Return(&mocks.DbBindingMock{}) + conn := mongo.NewConnection(client) + assert.NotNil(t, conn.GetDb()) +} + +func TestConnection_CheckConnection(t *testing.T) { + t.Run("Connection ok", func(t *testing.T) { + client := &mocks.DbClientBindingMock{} + client.On("Database", mongo.DbName).Return(&mocks.DbBindingMock{}) + client.On("Ping", test.AnyCtx, (*readpref.ReadPref)(nil)).Return(nil) + conn := mongo.NewConnection(client) + result := conn.CheckConnection(context.Background()) + assert.True(t, result) + client.AssertExpectations(t) + }) + t.Run("Connection error", func(t *testing.T) { + client := &mocks.DbClientBindingMock{} + client.On("Database", mongo.DbName).Return(&mocks.DbBindingMock{}) + client.On("Ping", test.AnyCtx, (*readpref.ReadPref)(nil)).Return(assert.AnError) + conn := mongo.NewConnection(client) + result := conn.CheckConnection(context.Background()) + assert.False(t, result) + client.AssertExpectations(t) + }) +} + +func TestConnection_Shutdown(t *testing.T) { + t.Run("Disconnect ok", func(t *testing.T) { + client := &mocks.DbClientBindingMock{} + client.On("Database", mongo.DbName).Return(&mocks.DbBindingMock{}) + client.On("Disconnect", mock.Anything).Return(nil) + conn := mongo.NewConnection(client) + closeChannel := make(chan bool) + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + <-closeChannel + }() + conn.Shutdown(closeChannel) + wg.Wait() + client.AssertExpectations(t) + }) + t.Run("Disconnect error", func(t *testing.T) { + client := &mocks.DbClientBindingMock{} + client.On("Database", mongo.DbName).Return(&mocks.DbBindingMock{}) + client.On("Disconnect", mock.Anything).Return(assert.AnError) + conn := mongo.NewConnection(client) + closeChannel := make(chan bool) + defer test.AssertLogContains(t, "Error disconnecting from MongoDB")() + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + <-closeChannel + }() + conn.Shutdown(closeChannel) + wg.Wait() + client.AssertExpectations(t) + }) +} + +func TestConnection_Collection(t *testing.T) { + collectionName := test.AnyString + client := &mocks.DbClientBindingMock{} + db := &mocks.DbBindingMock{} + client.On("Database", mongo.DbName).Return(db) + db.On("Collection", collectionName).Return(&mocks.CollectionBindingMock{}) + conn := mongo.NewConnection(client) + assert.NotNil(t, conn.Collection(collectionName)) +} + +func assertDbInteractionLog(t *testing.T, interaction mongo.DbInteraction) (assertFunc func()) { + return test.AssertLogContains(t, string(interaction)) +} + +func getClientAndCollectionMocks(collectionName string) (*mocks.DbClientBindingMock, *mocks.CollectionBindingMock) { + client := &mocks.DbClientBindingMock{} + db := &mocks.DbBindingMock{} + client.On("Database", mongo.DbName).Return(db) + collection := &mocks.CollectionBindingMock{} + db.On("Collection", collectionName).Return(collection) + return client, collection +} diff --git a/internal/adapters/dataproviders/database/mongo/liquidity_provider.go b/internal/adapters/dataproviders/database/mongo/liquidity_provider.go index b1707c1c..9d162bce 100644 --- a/internal/adapters/dataproviders/database/mongo/liquidity_provider.go +++ b/internal/adapters/dataproviders/database/mongo/liquidity_provider.go @@ -11,24 +11,24 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" ) -const liquidityProviderCollection = "liquidityProvider" +const LiquidityProviderCollection = "liquidityProvider" -type configurationName string +type ConfigurationName string const ( - peginConfigId configurationName = "pegin" - pegoutConfigId configurationName = "pegout" - generalConfigId configurationName = "general" - credentialsId configurationName = "credentials" + peginConfigId ConfigurationName = "pegin" + pegoutConfigId ConfigurationName = "pegout" + generalConfigId ConfigurationName = "general" + credentialsId ConfigurationName = "credentials" ) type lpMongoRepository struct { conn *Connection } -type storedConfiguration[C liquidity_provider.ConfigurationType] struct { +type StoredConfiguration[C liquidity_provider.ConfigurationType] struct { entities.Signed[C] `bson:",inline"` - Name configurationName `json:"name" bson:"name"` + Name ConfigurationName `json:"name" bson:"name"` } func NewLiquidityProviderRepository(conn *Connection) liquidity_provider.LiquidityProviderRepository { @@ -56,7 +56,7 @@ func (repo *lpMongoRepository) GetGeneralConfiguration(ctx context.Context) (*en func (repo *lpMongoRepository) UpsertPeginConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.PeginConfiguration]) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - configToStore := storedConfiguration[liquidity_provider.PeginConfiguration]{ + configToStore := StoredConfiguration[liquidity_provider.PeginConfiguration]{ Signed: signedConfig, Name: peginConfigId, } @@ -66,7 +66,7 @@ func (repo *lpMongoRepository) UpsertPeginConfiguration(ctx context.Context, sig func (repo *lpMongoRepository) UpsertPegoutConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.PegoutConfiguration]) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - configToStore := storedConfiguration[liquidity_provider.PegoutConfiguration]{ + configToStore := StoredConfiguration[liquidity_provider.PegoutConfiguration]{ Signed: signedConfig, Name: pegoutConfigId, } @@ -76,7 +76,7 @@ func (repo *lpMongoRepository) UpsertPegoutConfiguration(ctx context.Context, si func (repo *lpMongoRepository) UpsertGeneralConfiguration(ctx context.Context, signedConfig entities.Signed[liquidity_provider.GeneralConfiguration]) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - configToStore := storedConfiguration[liquidity_provider.GeneralConfiguration]{ + configToStore := StoredConfiguration[liquidity_provider.GeneralConfiguration]{ Signed: signedConfig, Name: generalConfigId, } @@ -92,7 +92,7 @@ func (repo *lpMongoRepository) GetCredentials(ctx context.Context) (*entities.Si func (repo *lpMongoRepository) UpsertCredentials(ctx context.Context, credentials entities.Signed[liquidity_provider.HashedCredentials]) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - configToStore := storedConfiguration[liquidity_provider.HashedCredentials]{ + configToStore := StoredConfiguration[liquidity_provider.HashedCredentials]{ Signed: credentials, Name: credentialsId, } @@ -102,7 +102,7 @@ func (repo *lpMongoRepository) UpsertCredentials(ctx context.Context, credential func upsertConfigurationVerbose[C liquidity_provider.ConfigurationType]( ctx context.Context, repo *lpMongoRepository, - config storedConfiguration[C], + config StoredConfiguration[C], ) error { return upsertConfiguration(ctx, repo, config, true) } @@ -110,7 +110,7 @@ func upsertConfigurationVerbose[C liquidity_provider.ConfigurationType]( func getConfigurationVerbose[C liquidity_provider.ConfigurationType]( ctx context.Context, repo *lpMongoRepository, - name configurationName, + name ConfigurationName, ) (*entities.Signed[C], error) { return getConfiguration[C](ctx, repo, name, true) } @@ -118,18 +118,18 @@ func getConfigurationVerbose[C liquidity_provider.ConfigurationType]( func upsertConfiguration[C liquidity_provider.ConfigurationType]( ctx context.Context, repo *lpMongoRepository, - config storedConfiguration[C], + config StoredConfiguration[C], logInteraction bool, ) error { - collection := repo.conn.Collection(liquidityProviderCollection) - options := options.Replace().SetUpsert(true) + collection := repo.conn.Collection(LiquidityProviderCollection) + opts := options.Replace().SetUpsert(true) filter := bson.D{primitive.E{Key: "name", Value: config.Name}} - _, err := collection.ReplaceOne(ctx, filter, config, options) + _, err := collection.ReplaceOne(ctx, filter, config, opts) if err != nil { return err } if logInteraction { - logDbInteraction(insert, config) + logDbInteraction(Insert, config) } return nil } @@ -137,11 +137,11 @@ func upsertConfiguration[C liquidity_provider.ConfigurationType]( func getConfiguration[C liquidity_provider.ConfigurationType]( ctx context.Context, repo *lpMongoRepository, - name configurationName, + name ConfigurationName, logInteraction bool, ) (*entities.Signed[C], error) { - config := &storedConfiguration[C]{} - collection := repo.conn.Collection(liquidityProviderCollection) + config := &StoredConfiguration[C]{} + collection := repo.conn.Collection(LiquidityProviderCollection) filter := bson.D{primitive.E{Key: "name", Value: name}} err := collection.FindOne(ctx, filter).Decode(config) @@ -151,7 +151,7 @@ func getConfiguration[C liquidity_provider.ConfigurationType]( return nil, err } if logInteraction { - logDbInteraction(read, config.Signed) + logDbInteraction(Read, config.Signed) } return &config.Signed, nil } diff --git a/internal/adapters/dataproviders/database/mongo/liquidity_provider_test.go b/internal/adapters/dataproviders/database/mongo/liquidity_provider_test.go new file mode 100644 index 00000000..0a42ef5b --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/liquidity_provider_test.go @@ -0,0 +1,311 @@ +package mongo_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + mongoDb "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "testing" +) + +var peginTestConfig = &entities.Signed[liquidity_provider.PeginConfiguration]{ + Value: liquidity_provider.PeginConfiguration{ + TimeForDeposit: 1, + CallTime: 2, + PenaltyFee: entities.NewWei(3), + CallFee: entities.NewWei(4), + MaxValue: entities.NewWei(5), + MinValue: entities.NewWei(6), + }, + Signature: "pegin signature", + Hash: "pegin hash", +} + +var pegoutTestConfig = &entities.Signed[liquidity_provider.PegoutConfiguration]{ + Value: liquidity_provider.PegoutConfiguration{ + TimeForDeposit: 1, + CallTime: 2, + PenaltyFee: entities.NewWei(3), + CallFee: entities.NewWei(4), + MaxValue: entities.NewWei(5), + MinValue: entities.NewWei(6), + ExpireBlocks: 7, + }, + Signature: "pegout signature", + Hash: "pegout hash", +} + +var generalTestConfig = &entities.Signed[liquidity_provider.GeneralConfiguration]{ + Value: liquidity_provider.GeneralConfiguration{ + RskConfirmations: liquidity_provider.ConfirmationsPerAmount{ + 1: 2, + 3: 4, + }, + BtcConfirmations: liquidity_provider.ConfirmationsPerAmount{ + 5: 6, + 7: 8, + }, + }, + Signature: "general signature", + Hash: "general hash", +} + +var testCredentials = &entities.Signed[liquidity_provider.HashedCredentials]{ + Value: liquidity_provider.HashedCredentials{ + HashedUsername: "username", + HashedPassword: "password", + UsernameSalt: "username salt", + PasswordSalt: "password salt", + }, + Signature: "credentials signature", + Hash: "credentials hash", +} + +func TestLpMongoRepository_GetPeginConfiguration(t *testing.T) { + filter := bson.D{primitive.E{Key: "name", Value: mongo.ConfigurationName("pegin")}} + log.SetLevel(log.DebugLevel) + t.Run("pegin configuration read successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return(mongoDb.NewSingleResultFromDocument(peginTestConfig, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetPeginConfiguration(context.Background()) + require.NoError(t, err) + assert.Equal(t, peginTestConfig, result) + }) + t.Run("pegin configuration not found", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return( + mongoDb.NewSingleResultFromDocument(entities.Signed[liquidity_provider.PeginConfiguration]{}, mongoDb.ErrNoDocuments, nil), + ).Once() + result, err := repo.GetPeginConfiguration(context.Background()) + require.NoError(t, err) + assert.Nil(t, result) + }) + t.Run("Db error reading pegin configuration", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter).Return(mongoDb.NewSingleResultFromDocument(nil, assert.AnError, nil)).Once() + result, err := repo.GetPeginConfiguration(context.Background()) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLpMongoRepository_GetPegoutConfiguration(t *testing.T) { + filter := bson.D{primitive.E{Key: "name", Value: mongo.ConfigurationName("pegout")}} + log.SetLevel(log.DebugLevel) + t.Run("pegout configuration read successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return(mongoDb.NewSingleResultFromDocument(pegoutTestConfig, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetPegoutConfiguration(context.Background()) + require.NoError(t, err) + assert.Equal(t, pegoutTestConfig, result) + }) + t.Run("pegout configuration not found", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return( + mongoDb.NewSingleResultFromDocument(entities.Signed[liquidity_provider.PegoutConfiguration]{}, mongoDb.ErrNoDocuments, nil), + ).Once() + result, err := repo.GetPegoutConfiguration(context.Background()) + require.NoError(t, err) + assert.Nil(t, result) + }) + t.Run("Db error reading pegout configuration", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter).Return(mongoDb.NewSingleResultFromDocument(nil, assert.AnError, nil)).Once() + result, err := repo.GetPegoutConfiguration(context.Background()) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLpMongoRepository_GetGeneralConfiguration(t *testing.T) { + filter := bson.D{primitive.E{Key: "name", Value: mongo.ConfigurationName("general")}} + log.SetLevel(log.DebugLevel) + t.Run("general configuration read successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return(mongoDb.NewSingleResultFromDocument(generalTestConfig, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetGeneralConfiguration(context.Background()) + require.NoError(t, err) + assert.Equal(t, generalTestConfig, result) + }) + t.Run("general configuration not found", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return( + mongoDb.NewSingleResultFromDocument(entities.Signed[liquidity_provider.GeneralConfiguration]{}, mongoDb.ErrNoDocuments, nil), + ).Once() + result, err := repo.GetGeneralConfiguration(context.Background()) + require.NoError(t, err) + assert.Nil(t, result) + }) + t.Run("Db error reading general configuration", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter).Return(mongoDb.NewSingleResultFromDocument(nil, assert.AnError, nil)).Once() + result, err := repo.GetGeneralConfiguration(context.Background()) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLpMongoRepository_GetCredentials(t *testing.T) { + filter := bson.D{primitive.E{Key: "name", Value: mongo.ConfigurationName("credentials")}} + log.SetLevel(log.DebugLevel) + t.Run("credentials read successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return(mongoDb.NewSingleResultFromDocument(testCredentials, nil, nil)).Once() + defer test.AssertNoLog(t)() + result, err := repo.GetCredentials(context.Background()) + require.NoError(t, err) + assert.Equal(t, testCredentials, result) + }) + t.Run("credentials not found", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter). + Return( + mongoDb.NewSingleResultFromDocument(entities.Signed[liquidity_provider.HashedCredentials]{}, mongoDb.ErrNoDocuments, nil), + ).Once() + result, err := repo.GetCredentials(context.Background()) + require.NoError(t, err) + assert.Nil(t, result) + }) + t.Run("Db error reading credentials", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, filter).Return(mongoDb.NewSingleResultFromDocument(nil, assert.AnError, nil)).Once() + result, err := repo.GetCredentials(context.Background()) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestLpMongoRepository_UpsertPeginConfiguration(t *testing.T) { + log.SetLevel(log.DebugLevel) + configName := mongo.ConfigurationName("pegin") + filter := bson.D{primitive.E{Key: "name", Value: configName}} + t.Run("pegin configuration upserted successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, filter, mongo.StoredConfiguration[liquidity_provider.PeginConfiguration]{ + Signed: *peginTestConfig, + Name: configName, + }, options.Replace().SetUpsert(true)). + Return(nil, nil).Once() + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.UpsertPeginConfiguration(context.Background(), *peginTestConfig) + require.NoError(t, err) + }) + t.Run("Db error upserting pegin configuration", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + err := repo.UpsertPeginConfiguration(context.Background(), *peginTestConfig) + require.Error(t, err) + }) +} + +func TestLpMongoRepository_UpsertPegoutConfiguration(t *testing.T) { + log.SetLevel(log.DebugLevel) + configName := mongo.ConfigurationName("pegout") + filter := bson.D{primitive.E{Key: "name", Value: configName}} + t.Run("pegout configuration upserted successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, filter, mongo.StoredConfiguration[liquidity_provider.PegoutConfiguration]{ + Signed: *pegoutTestConfig, + Name: configName, + }, options.Replace().SetUpsert(true)). + Return(nil, nil).Once() + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.UpsertPegoutConfiguration(context.Background(), *pegoutTestConfig) + require.NoError(t, err) + }) + t.Run("Db error upserting pegout configuration", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + err := repo.UpsertPegoutConfiguration(context.Background(), *pegoutTestConfig) + require.Error(t, err) + }) +} + +func TestLpMongoRepository_UpsertGeneralConfiguration(t *testing.T) { + log.SetLevel(log.DebugLevel) + configName := mongo.ConfigurationName("general") + filter := bson.D{primitive.E{Key: "name", Value: configName}} + t.Run("general configuration upserted successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, filter, mongo.StoredConfiguration[liquidity_provider.GeneralConfiguration]{ + Signed: *generalTestConfig, + Name: configName, + }, options.Replace().SetUpsert(true)). + Return(nil, nil).Once() + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.UpsertGeneralConfiguration(context.Background(), *generalTestConfig) + require.NoError(t, err) + }) + t.Run("Db error upserting general configuration", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + err := repo.UpsertGeneralConfiguration(context.Background(), *generalTestConfig) + require.Error(t, err) + }) +} + +func TestLpMongoRepository_UpsertCredentials(t *testing.T) { + log.SetLevel(log.DebugLevel) + configName := mongo.ConfigurationName("credentials") + filter := bson.D{primitive.E{Key: "name", Value: configName}} + t.Run("credentials upserted successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, filter, mongo.StoredConfiguration[liquidity_provider.HashedCredentials]{ + Signed: *testCredentials, + Name: configName, + }, options.Replace().SetUpsert(true)). + Return(nil, nil).Once() + defer test.AssertNoLog(t)() + err := repo.UpsertCredentials(context.Background(), *testCredentials) + require.NoError(t, err) + }) + t.Run("Db error upserting credentials", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.LiquidityProviderCollection) + repo := mongo.NewLiquidityProviderRepository(mongo.NewConnection(client)) + collection.On("ReplaceOne", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + err := repo.UpsertCredentials(context.Background(), *testCredentials) + require.Error(t, err) + }) +} diff --git a/internal/adapters/dataproviders/database/mongo/mongo.go b/internal/adapters/dataproviders/database/mongo/mongo.go index 02ac5d75..11fbf105 100644 --- a/internal/adapters/dataproviders/database/mongo/mongo.go +++ b/internal/adapters/dataproviders/database/mongo/mongo.go @@ -29,7 +29,7 @@ func Connect(ctx context.Context, username, password, host string, port uint) (* if client, err = mongo.Connect(ctx, clientOptions); err != nil { return nil, err } - db := client.Database(dbName) + db := client.Database(DbName) if err = createIndexes(ctx, db); err == nil { return client, nil } else { @@ -38,7 +38,7 @@ func Connect(ctx context.Context, username, password, host string, port uint) (* } func createIndexes(ctx context.Context, db *mongo.Database) error { - _, err := db.Collection(depositEventsCollection).Indexes().CreateOne( + _, err := db.Collection(DepositEventsCollection).Indexes().CreateOne( ctx, mongo.IndexModel{ Keys: bson.D{{Key: "tx_hash", Value: 1}}, diff --git a/internal/adapters/dataproviders/database/mongo/pegin.go b/internal/adapters/dataproviders/database/mongo/pegin.go index ce28791b..f1810f28 100644 --- a/internal/adapters/dataproviders/database/mongo/pegin.go +++ b/internal/adapters/dataproviders/database/mongo/pegin.go @@ -12,8 +12,8 @@ import ( ) const ( - peginQuoteCollection = "peginQuote" - retainedPeginQuoteCollection = "retainedPeginQuote" + PeginQuoteCollection = "peginQuote" + RetainedPeginQuoteCollection = "retainedPeginQuote" ) type peginMongoRepository struct { @@ -24,7 +24,7 @@ func NewPeginMongoRepository(conn *Connection) quote.PeginQuoteRepository { return &peginMongoRepository{conn: conn} } -type storedPeginQuote struct { +type StoredPeginQuote struct { quote.PeginQuote `bson:",inline"` Hash string `json:"hash" bson:"hash"` } @@ -32,8 +32,8 @@ type storedPeginQuote struct { func (repo *peginMongoRepository) InsertQuote(ctx context.Context, hash string, peginQuote quote.PeginQuote) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(peginQuoteCollection) - storedQuote := storedPeginQuote{ + collection := repo.conn.Collection(PeginQuoteCollection) + storedQuote := StoredPeginQuote{ PeginQuote: peginQuote, Hash: hash, } @@ -41,17 +41,17 @@ func (repo *peginMongoRepository) InsertQuote(ctx context.Context, hash string, if err != nil { return err } else { - logDbInteraction(insert, storedQuote) + logDbInteraction(Insert, storedQuote) return nil } } func (repo *peginMongoRepository) GetQuote(ctx context.Context, hash string) (*quote.PeginQuote, error) { - var result storedPeginQuote + var result StoredPeginQuote dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(peginQuoteCollection) + collection := repo.conn.Collection(PeginQuoteCollection) filter := bson.D{primitive.E{Key: "hash", Value: hash}} err := collection.FindOne(dbCtx, filter).Decode(&result) @@ -60,7 +60,7 @@ func (repo *peginMongoRepository) GetQuote(ctx context.Context, hash string) (*q } else if err != nil { return nil, err } - logDbInteraction(read, result.PeginQuote) + logDbInteraction(Read, result.PeginQuote) return &result.PeginQuote, nil } @@ -69,7 +69,7 @@ func (repo *peginMongoRepository) GetRetainedQuote(ctx context.Context, hash str dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPeginQuoteCollection) + collection := repo.conn.Collection(RetainedPeginQuoteCollection) filter := bson.D{primitive.E{Key: "quote_hash", Value: hash}} err := collection.FindOne(dbCtx, filter).Decode(&result) @@ -78,19 +78,19 @@ func (repo *peginMongoRepository) GetRetainedQuote(ctx context.Context, hash str } else if err != nil { return nil, err } - logDbInteraction(read, result) + logDbInteraction(Read, result) return &result, nil } func (repo *peginMongoRepository) InsertRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPeginQuote) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPeginQuoteCollection) + collection := repo.conn.Collection(RetainedPeginQuoteCollection) _, err := collection.InsertOne(dbCtx, retainedQuote) if err != nil { return err } else { - logDbInteraction(insert, retainedQuote) + logDbInteraction(Insert, retainedQuote) return nil } } @@ -99,7 +99,7 @@ func (repo *peginMongoRepository) UpdateRetainedQuote(ctx context.Context, retai dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPeginQuoteCollection) + collection := repo.conn.Collection(RetainedPeginQuoteCollection) filter := bson.D{primitive.E{Key: "quote_hash", Value: retainedQuote.QuoteHash}} updateStatement := bson.D{primitive.E{Key: "$set", Value: retainedQuote}} @@ -111,7 +111,7 @@ func (repo *peginMongoRepository) UpdateRetainedQuote(ctx context.Context, retai } else if result.ModifiedCount > 1 { return errors.New("multiple documents updated") } - logDbInteraction(update, retainedQuote) + logDbInteraction(Update, retainedQuote) return nil } @@ -120,7 +120,7 @@ func (repo *peginMongoRepository) GetRetainedQuoteByState(ctx context.Context, s dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPeginQuoteCollection) + collection := repo.conn.Collection(RetainedPeginQuoteCollection) query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: states}}}} rows, err := collection.Find(dbCtx, query) if err != nil { @@ -129,7 +129,7 @@ func (repo *peginMongoRepository) GetRetainedQuoteByState(ctx context.Context, s if err = rows.All(ctx, &result); err != nil { return nil, err } - logDbInteraction(read, result) + logDbInteraction(Read, result) return result, nil } @@ -138,17 +138,17 @@ func (repo *peginMongoRepository) DeleteQuotes(ctx context.Context, quotes []str defer cancel() filter := bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: quotes}}}} - peginResult, err := repo.conn.Collection(peginQuoteCollection).DeleteMany(dbCtx, filter) + peginResult, err := repo.conn.Collection(PeginQuoteCollection).DeleteMany(dbCtx, filter) if err != nil { return 0, err } - retainedResult, err := repo.conn.Collection(retainedPeginQuoteCollection).DeleteMany(dbCtx, filter) + retainedResult, err := repo.conn.Collection(RetainedPeginQuoteCollection).DeleteMany(dbCtx, filter) if err != nil { return 0, err } else if peginResult.DeletedCount != retainedResult.DeletedCount { return 0, errors.New("pegin quote collections didn't match") } - logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", peginResult.DeletedCount, pegoutQuoteCollection)) - logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", retainedResult.DeletedCount, retainedPegoutQuoteCollection)) + logDbInteraction(Delete, fmt.Sprintf("removed %d records from %s collection", peginResult.DeletedCount, PeginQuoteCollection)) + logDbInteraction(Delete, fmt.Sprintf("removed %d records from %s collection", retainedResult.DeletedCount, RetainedPeginQuoteCollection)) return uint(peginResult.DeletedCount + retainedResult.DeletedCount), nil } diff --git a/internal/adapters/dataproviders/database/mongo/pegin_test.go b/internal/adapters/dataproviders/database/mongo/pegin_test.go new file mode 100644 index 00000000..118afb5f --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/pegin_test.go @@ -0,0 +1,319 @@ +package mongo_test + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + mongoDb "go.mongodb.org/mongo-driver/mongo" + "reflect" + "testing" +) + +var testPeginQuote = quote.PeginQuote{ + FedBtcAddress: test.AnyAddress, + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, + CallFee: entities.NewWei(1), + PenaltyFee: entities.NewWei(2), + ContractAddress: test.AnyAddress, + Data: test.AnyString, + GasLimit: 1, + Nonce: 2, + Value: entities.NewWei(3), + AgreementTimestamp: 4, + TimeForDeposit: 5, + LpCallTime: 6, + Confirmations: 7, + CallOnRegister: true, + GasFee: entities.NewWei(4), + ProductFeeAmount: 8, +} + +var testRetainedPeginQuote = quote.RetainedPeginQuote{ + QuoteHash: test.AnyString, + DepositAddress: test.AnyAddress, + Signature: test.AnyString, + RequiredLiquidity: entities.NewWei(100), + State: quote.PeginStateCallForUserSucceeded, + UserBtcTxHash: test.AnyString, + CallForUserTxHash: test.AnyString, + RegisterPeginTxHash: test.AnyString, +} + +func TestPeginMongoRepository_InsertQuote(t *testing.T) { + t.Run("Insert pegin quote successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.MatchedBy(func(q mongo.StoredPeginQuote) bool { + return q.Hash == test.AnyString && reflect.TypeOf(quote.PeginQuote{}).NumField() == test.CountNonZeroValues(q.PeginQuote) + })).Return(nil, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.InsertQuote(context.Background(), test.AnyString, testPeginQuote) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when inserting pegin quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + err := repo.InsertQuote(context.Background(), test.AnyString, testPeginQuote) + collection.AssertExpectations(t) + require.Error(t, err) + }) +} + +func TestPeginMongoRepository_GetQuote(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + log.SetLevel(log.DebugLevel) + t.Run("Get pegin quote successfully", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, bson.D{primitive.E{Key: "hash", Value: test.AnyString}}). + Return(mongoDb.NewSingleResultFromDocument(mongo.StoredPeginQuote{ + PeginQuote: testPeginQuote, + Hash: test.AnyString, + }, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, testPeginQuote, *result) + }) + t.Run("Db error when getting pegin quote", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(mongo.StoredPeginQuote{}, assert.AnError, nil)).Once() + result, err := repo.GetQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Pegin quote not present in db", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(mongo.StoredPeginQuote{}, mongoDb.ErrNoDocuments, nil)).Once() + result, err := repo.GetQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Nil(t, result) + }) +} + +func TestPeginMongoRepository_GetRetainedQuote(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + log.SetLevel(log.DebugLevel) + t.Run("Get retained pegin quote successfully", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, bson.D{primitive.E{Key: "quote_hash", Value: test.AnyString}}). + Return(mongoDb.NewSingleResultFromDocument(testRetainedPeginQuote, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetRetainedQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, testRetainedPeginQuote, *result) + }) + t.Run("Db error when getting retained pegin quote", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(quote.RetainedPeginQuote{}, assert.AnError, nil)).Once() + result, err := repo.GetRetainedQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Retained pegin quote not present in db", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(quote.RetainedPeginQuote{}, mongoDb.ErrNoDocuments, nil)).Once() + result, err := repo.GetRetainedQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Nil(t, result) + }) +} + +func TestPeginMongoRepository_InsertRetainedQuote(t *testing.T) { + t.Run("Insert retained pegin quote successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + return q.QuoteHash == test.AnyString && reflect.TypeOf(quote.RetainedPeginQuote{}).NumField() == test.CountNonZeroValues(q) + })).Return(nil, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.InsertRetainedQuote(context.Background(), testRetainedPeginQuote) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when inserting retained pegin quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + err := repo.InsertRetainedQuote(context.Background(), testRetainedPeginQuote) + collection.AssertExpectations(t) + require.Error(t, err) + }) +} + +func TestPeginMongoRepository_UpdateRetainedQuote(t *testing.T) { + const updated = "updated value" + t.Run("Update retained pegin quote successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + updatedQuote := testRetainedPeginQuote + updatedQuote.State = quote.PeginStateCallForUserFailed + updatedQuote.Signature = updated + updatedQuote.RegisterPeginTxHash = updated + updatedQuote.CallForUserTxHash = updated + updatedQuote.DepositAddress = updated + updatedQuote.UserBtcTxHash = updated + updatedQuote.RequiredLiquidity = entities.NewWei(200) + collection.On("UpdateOne", mock.Anything, + bson.D{primitive.E{Key: "quote_hash", Value: testRetainedPeginQuote.QuoteHash}}, + bson.D{primitive.E{Key: "$set", Value: updatedQuote}}, + ).Return(&mongoDb.UpdateResult{ModifiedCount: 1}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Update)() + err := repo.UpdateRetainedQuote(context.Background(), updatedQuote) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when updating retained pegin quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + collection.On("UpdateOne", mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + err := repo.UpdateRetainedQuote(context.Background(), testRetainedPeginQuote) + collection.AssertExpectations(t) + require.Error(t, err) + }) + t.Run("Retained pegin quote to update not found", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + collection.On("UpdateOne", mock.Anything, mock.Anything, mock.Anything). + Return(&mongoDb.UpdateResult{ModifiedCount: 0}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + err := repo.UpdateRetainedQuote(context.Background(), testRetainedPeginQuote) + collection.AssertExpectations(t) + require.ErrorIs(t, err, usecases.QuoteNotFoundError) + }) + t.Run("Update more than one retained pegin quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + collection.On("UpdateOne", mock.Anything, mock.Anything, mock.Anything). + Return(&mongoDb.UpdateResult{ModifiedCount: 2}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + err := repo.UpdateRetainedQuote(context.Background(), testRetainedPeginQuote) + collection.AssertExpectations(t) + require.ErrorContains(t, err, "multiple documents updated") + }) +} + +func TestPeginMongoRepository_GetRetainedQuoteByState(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPeginQuoteCollection) + log.SetLevel(log.DebugLevel) + states := []quote.PeginState{quote.PeginStateCallForUserSucceeded, quote.PeginStateCallForUserFailed} + t.Run("Get retained pegin quotes by state successfully", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + secondQuote := testRetainedPeginQuote + secondQuote.QuoteHash = "second" + secondQuote.Signature = "123" + secondQuote.RequiredLiquidity = entities.NewWei(777) + collection.On("Find", mock.Anything, + bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: states}}}}, + ).Return(mongoDb.NewCursorFromDocuments([]any{testRetainedPeginQuote, secondQuote}, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetRetainedQuoteByState(context.Background(), states...) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, []quote.RetainedPeginQuote{testRetainedPeginQuote, secondQuote}, result) + }) + t.Run("Db error when getting retained pegin quotes by state", func(t *testing.T) { + repo := mongo.NewPeginMongoRepository(mongo.NewConnection(client)) + collection.On("Find", mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + result, err := repo.GetRetainedQuoteByState(context.Background(), states...) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestPeginMongoRepository_DeleteQuotes(t *testing.T) { + var hashes = []string{"pegin1", "pegin2", "pegin3"} + log.SetLevel(log.DebugLevel) + t.Run("Delete quotes successfully", func(t *testing.T) { + client, quoteCollection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + retainedCollection := &mocks.CollectionBindingMock{} + client.Database(mongo.DbName).(*mocks.DbBindingMock).On("Collection", mongo.RetainedPeginQuoteCollection). + Return(retainedCollection) + quoteCollection.On("DeleteMany", mock.Anything, + bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: hashes}}}}, + ).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + retainedCollection.On("DeleteMany", mock.Anything, + bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: hashes}}}}, + ).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Delete)() + count, err := repo.DeleteQuotes(context.Background(), hashes) + quoteCollection.AssertExpectations(t) + retainedCollection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, uint(6), count) + }) + t.Run("Db error when deleting pegin quotes", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + collection.On("DeleteMany", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + count, err := repo.DeleteQuotes(context.Background(), []string{test.AnyString}) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Zero(t, count) + }) + t.Run("Db error when deleting retained pegin quotes", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + retainedCollection := &mocks.CollectionBindingMock{} + client.Database(mongo.DbName).(*mocks.DbBindingMock).On("Collection", mongo.RetainedPeginQuoteCollection).Return(retainedCollection) + collection.On("DeleteMany", mock.Anything, mock.Anything).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + retainedCollection.On("DeleteMany", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + count, err := repo.DeleteQuotes(context.Background(), []string{test.AnyString}) + collection.AssertExpectations(t) + retainedCollection.AssertExpectations(t) + require.Error(t, err) + assert.Zero(t, count) + }) + t.Run("Error when deletion count missmatch", func(t *testing.T) { + client, quoteCollection := getClientAndCollectionMocks(mongo.PeginQuoteCollection) + retainedCollection := &mocks.CollectionBindingMock{} + client.Database(mongo.DbName).(*mocks.DbBindingMock).On("Collection", mongo.RetainedPeginQuoteCollection).Return(retainedCollection) + quoteCollection.On("DeleteMany", mock.Anything, mock.Anything).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + retainedCollection.On("DeleteMany", mock.Anything, mock.Anything).Return(&mongoDb.DeleteResult{DeletedCount: 4}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPeginMongoRepository(conn) + count, err := repo.DeleteQuotes(context.Background(), hashes) + quoteCollection.AssertExpectations(t) + retainedCollection.AssertExpectations(t) + require.ErrorContains(t, err, "pegin quote collections didn't match") + assert.Zero(t, count) + }) +} diff --git a/internal/adapters/dataproviders/database/mongo/pegout.go b/internal/adapters/dataproviders/database/mongo/pegout.go index 691e58ac..7a90644c 100644 --- a/internal/adapters/dataproviders/database/mongo/pegout.go +++ b/internal/adapters/dataproviders/database/mongo/pegout.go @@ -13,12 +13,12 @@ import ( ) const ( - pegoutQuoteCollection = "pegoutQuote" - retainedPegoutQuoteCollection = "retainedPegoutQuote" - depositEventsCollection = "depositEvents" + PegoutQuoteCollection = "pegoutQuote" + RetainedPegoutQuoteCollection = "retainedPegoutQuote" + DepositEventsCollection = "depositEvents" ) -type storedPegoutQuote struct { +type StoredPegoutQuote struct { quote.PegoutQuote `bson:",inline"` Hash string `json:"hash" bson:"hash"` } @@ -34,8 +34,8 @@ func NewPegoutMongoRepository(conn *Connection) quote.PegoutQuoteRepository { func (repo *pegoutMongoRepository) InsertQuote(ctx context.Context, hash string, pegoutQuote quote.PegoutQuote) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(pegoutQuoteCollection) - storedQuote := storedPegoutQuote{ + collection := repo.conn.Collection(PegoutQuoteCollection) + storedQuote := StoredPegoutQuote{ PegoutQuote: pegoutQuote, Hash: hash, } @@ -43,17 +43,17 @@ func (repo *pegoutMongoRepository) InsertQuote(ctx context.Context, hash string, if err != nil { return err } else { - logDbInteraction(insert, storedQuote) + logDbInteraction(Insert, storedQuote) return nil } } func (repo *pegoutMongoRepository) GetQuote(ctx context.Context, hash string) (*quote.PegoutQuote, error) { - var result storedPegoutQuote + var result StoredPegoutQuote dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(pegoutQuoteCollection) + collection := repo.conn.Collection(PegoutQuoteCollection) filter := bson.D{primitive.E{Key: "hash", Value: hash}} err := collection.FindOne(dbCtx, filter).Decode(&result) @@ -62,7 +62,7 @@ func (repo *pegoutMongoRepository) GetQuote(ctx context.Context, hash string) (* } else if err != nil { return nil, err } - logDbInteraction(read, result.PegoutQuote) + logDbInteraction(Read, result.PegoutQuote) return &result.PegoutQuote, nil } @@ -71,7 +71,7 @@ func (repo *pegoutMongoRepository) GetRetainedQuote(ctx context.Context, hash st dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPegoutQuoteCollection) + collection := repo.conn.Collection(RetainedPegoutQuoteCollection) filter := bson.D{primitive.E{Key: "quote_hash", Value: hash}} err := collection.FindOne(dbCtx, filter).Decode(&result) @@ -80,19 +80,19 @@ func (repo *pegoutMongoRepository) GetRetainedQuote(ctx context.Context, hash st } else if err != nil { return nil, err } - logDbInteraction(read, result) + logDbInteraction(Read, result) return &result, nil } func (repo *pegoutMongoRepository) InsertRetainedQuote(ctx context.Context, retainedQuote quote.RetainedPegoutQuote) error { dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPegoutQuoteCollection) + collection := repo.conn.Collection(RetainedPegoutQuoteCollection) _, err := collection.InsertOne(dbCtx, retainedQuote) if err != nil { return err } else { - logDbInteraction(insert, retainedQuote) + logDbInteraction(Insert, retainedQuote) return nil } } @@ -103,7 +103,7 @@ func (repo *pegoutMongoRepository) ListPegoutDepositsByAddress(ctx context.Conte filter := bson.M{"from": bson.M{"$regex": address, "$options": "i"}} sort := options.Find().SetSort(bson.M{"timestamp": -1}) - cursor, err := repo.conn.Collection(depositEventsCollection).Find(dbCtx, filter, sort) + cursor, err := repo.conn.Collection(DepositEventsCollection).Find(dbCtx, filter, sort) if err != nil { return make([]quote.PegoutDeposit, 0), err } @@ -112,7 +112,7 @@ func (repo *pegoutMongoRepository) ListPegoutDepositsByAddress(ctx context.Conte if err = cursor.All(ctx, &documents); err != nil { return make([]quote.PegoutDeposit, 0), err } - logDbInteraction(read, fmt.Sprintf("%d pegout deposits", len(documents))) + logDbInteraction(Read, fmt.Sprintf("%d pegout deposits", len(documents))) return documents, nil } @@ -120,7 +120,7 @@ func (repo *pegoutMongoRepository) UpdateRetainedQuote(ctx context.Context, reta dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPegoutQuoteCollection) + collection := repo.conn.Collection(RetainedPegoutQuoteCollection) filter := bson.D{primitive.E{Key: "quote_hash", Value: retainedQuote.QuoteHash}} updateStatement := bson.D{primitive.E{Key: "$set", Value: retainedQuote}} @@ -132,7 +132,7 @@ func (repo *pegoutMongoRepository) UpdateRetainedQuote(ctx context.Context, reta } else if result.ModifiedCount > 1 { return errors.New("multiple documents updated") } - logDbInteraction(update, retainedQuote) + logDbInteraction(Update, retainedQuote) return nil } @@ -141,7 +141,7 @@ func (repo *pegoutMongoRepository) GetRetainedQuoteByState(ctx context.Context, dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - collection := repo.conn.Collection(retainedPegoutQuoteCollection) + collection := repo.conn.Collection(RetainedPegoutQuoteCollection) query := bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: states}}}} rows, err := collection.Find(dbCtx, query) if err != nil { @@ -150,7 +150,7 @@ func (repo *pegoutMongoRepository) GetRetainedQuoteByState(ctx context.Context, if err = rows.All(ctx, &result); err != nil { return nil, err } - logDbInteraction(read, result) + logDbInteraction(Read, result) return result, nil } @@ -159,18 +159,18 @@ func (repo *pegoutMongoRepository) DeleteQuotes(ctx context.Context, quotes []st defer cancel() filter := bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: quotes}}}} - pegoutResult, err := repo.conn.Collection(pegoutQuoteCollection).DeleteMany(dbCtx, filter) + pegoutResult, err := repo.conn.Collection(PegoutQuoteCollection).DeleteMany(dbCtx, filter) if err != nil { return 0, err } - retainedResult, err := repo.conn.Collection(retainedPegoutQuoteCollection).DeleteMany(dbCtx, filter) + retainedResult, err := repo.conn.Collection(RetainedPegoutQuoteCollection).DeleteMany(dbCtx, filter) if err != nil { return 0, err } else if pegoutResult.DeletedCount != retainedResult.DeletedCount { return 0, errors.New("pegout quote collections didn't match") } - logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", pegoutResult.DeletedCount, pegoutQuoteCollection)) - logDbInteraction(delete, fmt.Sprintf("removed %d records from %s collection", retainedResult.DeletedCount, retainedPegoutQuoteCollection)) + logDbInteraction(Delete, fmt.Sprintf("removed %d records from %s collection", pegoutResult.DeletedCount, PegoutQuoteCollection)) + logDbInteraction(Delete, fmt.Sprintf("removed %d records from %s collection", retainedResult.DeletedCount, RetainedPegoutQuoteCollection)) return uint(pegoutResult.DeletedCount + retainedResult.DeletedCount), nil } @@ -178,15 +178,18 @@ func (repo *pegoutMongoRepository) UpsertPegoutDeposit(ctx context.Context, depo dbCtx, cancel := context.WithTimeout(ctx, dbTimeout) defer cancel() - _, err := repo.conn.Collection(depositEventsCollection).ReplaceOne( + result, err := repo.conn.Collection(DepositEventsCollection).ReplaceOne( dbCtx, bson.M{"tx_hash": deposit.TxHash}, deposit, options.Replace().SetUpsert(true), ) - if err == nil { - logDbInteraction(upsert, deposit) + if err != nil { + return err + } else if result.ModifiedCount > 1 { + return errors.New("multiple deposits updated") } + logDbInteraction(Upsert, deposit) return err } @@ -209,12 +212,12 @@ func (repo *pegoutMongoRepository) UpsertPegoutDeposits(ctx context.Context, dep documents = append(documents, replaceModel) } - _, err := repo.conn.Collection(depositEventsCollection).BulkWrite( + _, err := repo.conn.Collection(DepositEventsCollection).BulkWrite( dbCtx, documents, ) if err == nil { - logDbInteraction(upsert, deposits) + logDbInteraction(Upsert, deposits) } return err } diff --git a/internal/adapters/dataproviders/database/mongo/pegout_test.go b/internal/adapters/dataproviders/database/mongo/pegout_test.go new file mode 100644 index 00000000..720b326d --- /dev/null +++ b/internal/adapters/dataproviders/database/mongo/pegout_test.go @@ -0,0 +1,437 @@ +package mongo_test + +import ( + "context" + "github.com/btcsuite/btcd/btcjson" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + "github.com/rsksmart/liquidity-provider-server/internal/entities" + "github.com/rsksmart/liquidity-provider-server/internal/entities/quote" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + mongoDb "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "reflect" + "testing" + "time" +) + +var testPegoutQuote = quote.PegoutQuote{ + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, + CallFee: entities.NewWei(1), + PenaltyFee: 2, + Nonce: 3, + DepositAddress: test.AnyAddress, + Value: entities.NewWei(4), + AgreementTimestamp: 5, + DepositDateLimit: 6, + DepositConfirmations: 7, + TransferConfirmations: 8, + TransferTime: 9, + ExpireDate: 10, + ExpireBlock: 11, + GasFee: entities.NewWei(12), + ProductFeeAmount: 13, +} + +var testRetainedPegoutQuote = quote.RetainedPegoutQuote{ + QuoteHash: test.AnyString, + DepositAddress: test.AnyAddress, + Signature: test.AnyString, + RequiredLiquidity: entities.NewWei(55), + State: quote.PegoutStateWaitingForDepositConfirmations, + UserRskTxHash: test.AnyString, + LpBtcTxHash: test.AnyString, + RefundPegoutTxHash: test.AnyString, + BridgeRefundTxHash: test.AnyString, +} + +var testPegoutDeposit = quote.PegoutDeposit{ + TxHash: test.AnyString, + QuoteHash: test.AnyString, + Amount: entities.NewWei(999), + Timestamp: time.Unix(1715001146288, 0).UTC(), + BlockNumber: 789, + From: test.AnyAddress, +} + +func TestPegoutMongoRepository_InsertQuote(t *testing.T) { + t.Run("Insert pegout quote successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.MatchedBy(func(q mongo.StoredPegoutQuote) bool { + return q.Hash == test.AnyString && reflect.TypeOf(quote.PegoutQuote{}).NumField() == test.CountNonZeroValues(q.PegoutQuote) + })).Return(nil, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.InsertQuote(context.Background(), test.AnyString, testPegoutQuote) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when inserting pegout quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.InsertQuote(context.Background(), test.AnyString, testPegoutQuote) + collection.AssertExpectations(t) + require.Error(t, err) + }) +} + +func TestPegoutMongoRepository_GetQuote(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + log.SetLevel(log.DebugLevel) + t.Run("Get pegout quote successfully", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, bson.D{primitive.E{Key: "hash", Value: test.AnyString}}). + Return(mongoDb.NewSingleResultFromDocument(mongo.StoredPegoutQuote{ + PegoutQuote: testPegoutQuote, + Hash: test.AnyString, + }, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, testPegoutQuote, *result) + }) + t.Run("Db error when getting pegout quote", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(mongo.StoredPegoutQuote{}, assert.AnError, nil)).Once() + result, err := repo.GetQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Pegout quote not present in db", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(mongo.StoredPegoutQuote{}, mongoDb.ErrNoDocuments, nil)).Once() + result, err := repo.GetQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Nil(t, result) + }) +} + +func TestPegoutMongoRepository_GetRetainedQuote(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + log.SetLevel(log.DebugLevel) + t.Run("Get retained pegout quote successfully", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, bson.D{primitive.E{Key: "quote_hash", Value: test.AnyString}}). + Return(mongoDb.NewSingleResultFromDocument(testRetainedPegoutQuote, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetRetainedQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, testRetainedPegoutQuote, *result) + }) + t.Run("Db error when getting retained pegout quote", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(quote.RetainedPegoutQuote{}, assert.AnError, nil)).Once() + result, err := repo.GetRetainedQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) + }) + t.Run("Retained pegout quote not present in db", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("FindOne", mock.Anything, mock.Anything). + Return(mongoDb.NewSingleResultFromDocument(quote.RetainedPegoutQuote{}, mongoDb.ErrNoDocuments, nil)).Once() + result, err := repo.GetRetainedQuote(context.Background(), test.AnyString) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Nil(t, result) + }) +} + +func TestPegoutMongoRepository_InsertRetainedQuote(t *testing.T) { + t.Run("Insert retained pegout quote successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.MatchedBy(func(q quote.RetainedPegoutQuote) bool { + return q.QuoteHash == test.AnyString && reflect.TypeOf(quote.RetainedPegoutQuote{}).NumField() == test.CountNonZeroValues(q) + })).Return(nil, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Insert)() + err := repo.InsertRetainedQuote(context.Background(), testRetainedPegoutQuote) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when inserting retained pegout quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + collection.On("InsertOne", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.InsertRetainedQuote(context.Background(), testRetainedPegoutQuote) + collection.AssertExpectations(t) + require.Error(t, err) + }) +} + +func TestPegoutMongoRepository_UpdateRetainedQuote(t *testing.T) { + const updated = "updated value" + t.Run("Update retained pegout quote successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + updatedQuote := testRetainedPegoutQuote + updatedQuote.State = quote.PegoutStateSendPegoutFailed + updatedQuote.Signature = updated + updatedQuote.RefundPegoutTxHash = updated + updatedQuote.LpBtcTxHash = updated + updatedQuote.DepositAddress = updated + updatedQuote.UserRskTxHash = updated + updatedQuote.RequiredLiquidity = entities.NewWei(200) + collection.On("UpdateOne", mock.Anything, + bson.D{primitive.E{Key: "quote_hash", Value: testRetainedPegoutQuote.QuoteHash}}, + bson.D{primitive.E{Key: "$set", Value: updatedQuote}}, + ).Return(&mongoDb.UpdateResult{ModifiedCount: 1}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Update)() + err := repo.UpdateRetainedQuote(context.Background(), updatedQuote) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when updating retained pegout quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + collection.On("UpdateOne", mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.UpdateRetainedQuote(context.Background(), testRetainedPegoutQuote) + collection.AssertExpectations(t) + require.Error(t, err) + }) + t.Run("Retained pegout quote to update not found", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + collection.On("UpdateOne", mock.Anything, mock.Anything, mock.Anything). + Return(&mongoDb.UpdateResult{ModifiedCount: 0}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.UpdateRetainedQuote(context.Background(), testRetainedPegoutQuote) + collection.AssertExpectations(t) + require.ErrorIs(t, err, usecases.QuoteNotFoundError) + }) + t.Run("Update more than one retained pegout quote", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + collection.On("UpdateOne", mock.Anything, mock.Anything, mock.Anything). + Return(&mongoDb.UpdateResult{ModifiedCount: 2}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.UpdateRetainedQuote(context.Background(), testRetainedPegoutQuote) + collection.AssertExpectations(t) + require.ErrorContains(t, err, "multiple documents updated") + }) +} + +func TestPegoutMongoRepository_DeleteQuotes(t *testing.T) { + var hashes = []string{"pegout1", "pegout2", "pegout3"} + log.SetLevel(log.DebugLevel) + t.Run("Delete quotes successfully", func(t *testing.T) { + client, quoteCollection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + retainedCollection := &mocks.CollectionBindingMock{} + client.Database(mongo.DbName).(*mocks.DbBindingMock).On("Collection", mongo.RetainedPegoutQuoteCollection).Return(retainedCollection) + quoteCollection.On("DeleteMany", mock.Anything, + bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: hashes}}}}, + ).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + retainedCollection.On("DeleteMany", mock.Anything, + bson.D{primitive.E{Key: "quote_hash", Value: bson.D{primitive.E{Key: "$in", Value: hashes}}}}, + ).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Delete)() + count, err := repo.DeleteQuotes(context.Background(), hashes) + quoteCollection.AssertExpectations(t) + retainedCollection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, uint(6), count) + }) + t.Run("Db error when deleting pegout quotes", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + collection.On("DeleteMany", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + count, err := repo.DeleteQuotes(context.Background(), []string{test.AnyString}) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Zero(t, count) + }) + t.Run("Db error when deleting retained pegout quotes", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + retainedCollection := &mocks.CollectionBindingMock{} + client.Database(mongo.DbName).(*mocks.DbBindingMock).On("Collection", mongo.RetainedPegoutQuoteCollection).Return(retainedCollection) + collection.On("DeleteMany", mock.Anything, mock.Anything).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + retainedCollection.On("DeleteMany", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + count, err := repo.DeleteQuotes(context.Background(), []string{test.AnyString}) + collection.AssertExpectations(t) + retainedCollection.AssertExpectations(t) + require.Error(t, err) + assert.Zero(t, count) + }) + t.Run("Error when deletion count missmatch", func(t *testing.T) { + client, quoteCollection := getClientAndCollectionMocks(mongo.PegoutQuoteCollection) + retainedCollection := &mocks.CollectionBindingMock{} + client.Database(mongo.DbName).(*mocks.DbBindingMock).On("Collection", mongo.RetainedPegoutQuoteCollection).Return(retainedCollection) + quoteCollection.On("DeleteMany", mock.Anything, mock.Anything).Return(&mongoDb.DeleteResult{DeletedCount: 3}, nil).Once() + retainedCollection.On("DeleteMany", mock.Anything, mock.Anything).Return(&mongoDb.DeleteResult{DeletedCount: 4}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + count, err := repo.DeleteQuotes(context.Background(), hashes) + quoteCollection.AssertExpectations(t) + retainedCollection.AssertExpectations(t) + require.ErrorContains(t, err, "pegout quote collections didn't match") + assert.Zero(t, count) + }) +} + +func TestPegoutMongoRepository_GetRetainedQuoteByState(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.RetainedPegoutQuoteCollection) + log.SetLevel(log.DebugLevel) + states := []quote.PegoutState{quote.PegoutStateSendPegoutSucceeded, quote.PegoutStateSendPegoutFailed} + t.Run("Get retained pegout quotes by state successfully", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + secondQuote := testRetainedPegoutQuote + secondQuote.QuoteHash = "other hash" + secondQuote.Signature = "456" + secondQuote.RequiredLiquidity = entities.NewWei(777) + collection.On("Find", mock.Anything, + bson.D{primitive.E{Key: "state", Value: bson.D{primitive.E{Key: "$in", Value: states}}}}, + ).Return(mongoDb.NewCursorFromDocuments([]any{testRetainedPegoutQuote, secondQuote}, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.GetRetainedQuoteByState(context.Background(), states...) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, []quote.RetainedPegoutQuote{testRetainedPegoutQuote, secondQuote}, result) + }) + t.Run("Db error when getting retained pegout quotes by state", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("Find", mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + result, err := repo.GetRetainedQuoteByState(context.Background(), states...) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Nil(t, result) + }) +} + +func TestPegoutMongoRepository_ListPegoutDepositsByAddress(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.DepositEventsCollection) + log.SetLevel(log.DebugLevel) + t.Run("List pegout deposits by address successfully", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("Find", mock.Anything, + bson.M{"from": bson.M{"$regex": test.AnyAddress, "$options": "i"}}, + options.Find().SetSort(bson.M{"timestamp": -1}), + ).Return(mongoDb.NewCursorFromDocuments([]any{testPegoutDeposit}, nil, nil)).Once() + defer assertDbInteractionLog(t, mongo.Read)() + result, err := repo.ListPegoutDepositsByAddress(context.Background(), test.AnyAddress) + collection.AssertExpectations(t) + require.NoError(t, err) + assert.Equal(t, []quote.PegoutDeposit{testPegoutDeposit}[0], result[0]) + }) + t.Run("Db error when listing pegout deposits by address", func(t *testing.T) { + repo := mongo.NewPegoutMongoRepository(mongo.NewConnection(client)) + collection.On("Find", mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + result, err := repo.ListPegoutDepositsByAddress(context.Background(), test.AnyAddress) + collection.AssertExpectations(t) + require.Error(t, err) + assert.Empty(t, result) + }) +} + +func TestPegoutMongoRepository_UpsertPegoutDeposit(t *testing.T) { + t.Run("Upsert pegout deposit successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.DepositEventsCollection) + newDeposit := testPegoutDeposit + newDeposit.Amount = entities.NewWei(1000) + newDeposit.Timestamp = time.Now().UTC() + newDeposit.BlockNumber = 790 + collection.On("ReplaceOne", mock.Anything, + bson.M{"tx_hash": testPegoutDeposit.TxHash}, + newDeposit, + options.Replace().SetUpsert(true), + ).Return(&mongoDb.UpdateResult{ModifiedCount: 1}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Upsert)() + err := repo.UpsertPegoutDeposit(context.Background(), newDeposit) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when upserting pegout deposit", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.DepositEventsCollection) + collection.On("ReplaceOne", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.UpsertPegoutDeposit(context.Background(), testPegoutDeposit) + collection.AssertExpectations(t) + require.Error(t, err) + }) + t.Run("Error when upserting more than one pegout deposit", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.DepositEventsCollection) + collection.On("ReplaceOne", mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(&mongoDb.UpdateResult{ModifiedCount: 2}, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.UpsertPegoutDeposit(context.Background(), testPegoutDeposit) + collection.AssertExpectations(t) + require.ErrorContains(t, err, "multiple deposits updated") + }) +} + +func TestPegoutMongoRepository_UpsertPegoutDeposits(t *testing.T) { + t.Run("Upsert pegout deposits successfully", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.DepositEventsCollection) + deposits := []quote.PegoutDeposit{ + {TxHash: "tx1", QuoteHash: "quote1", Amount: entities.NewWei(1000), Timestamp: time.Now().UTC(), BlockNumber: 790, From: test.AnyAddress}, + {TxHash: "tx2", QuoteHash: "quote2", Amount: entities.NewWei(2000), Timestamp: time.Now().UTC(), BlockNumber: 791, From: test.AnyAddress}, + } + collection.On("BulkWrite", mock.Anything, + []mongoDb.WriteModel{ + &mongoDb.ReplaceOneModel{ + Upsert: btcjson.Bool(true), + Filter: bson.M{"tx_hash": deposits[0].TxHash}, + Replacement: deposits[0], + }, + &mongoDb.ReplaceOneModel{ + Upsert: btcjson.Bool(true), + Filter: bson.M{"tx_hash": deposits[1].TxHash}, + Replacement: deposits[1], + }, + }). + Return(nil, nil).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + defer assertDbInteractionLog(t, mongo.Upsert)() + err := repo.UpsertPegoutDeposits(context.Background(), deposits) + collection.AssertExpectations(t) + require.NoError(t, err) + }) + t.Run("Db error when upserting pegout deposits", func(t *testing.T) { + client, collection := getClientAndCollectionMocks(mongo.DepositEventsCollection) + collection.On("BulkWrite", mock.Anything, mock.Anything). + Return(nil, assert.AnError).Once() + conn := mongo.NewConnection(client) + repo := mongo.NewPegoutMongoRepository(conn) + err := repo.UpsertPegoutDeposits(context.Background(), []quote.PegoutDeposit{testPegoutDeposit}) + collection.AssertExpectations(t) + require.Error(t, err) + }) +} diff --git a/internal/adapters/dataproviders/rootstock/account/account_test.go b/internal/adapters/dataproviders/rootstock/account/account_test.go index 4946e265..c5521b8d 100644 --- a/internal/adapters/dataproviders/rootstock/account/account_test.go +++ b/internal/adapters/dataproviders/rootstock/account/account_test.go @@ -37,7 +37,7 @@ func TestGetAccount(t *testing.T) { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) t.Run("Create new account", func(t *testing.T) { - account, testError := account.GetRskAccount(account.CreationArgs{ + testAccount, testError := account.GetRskAccount(account.CreationArgs{ KeyDir: testDir, AccountNum: 0, EncryptedJson: string(keyBytes), @@ -46,8 +46,8 @@ func TestGetAccount(t *testing.T) { _, noExistError := os.Stat(testDir) assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") require.NoError(t, testError) - assert.Equal(t, common.HexToAddress(keyAddress), account.Account.Address) - assert.NotNil(t, 1, len(account.Keystore.Accounts())) + assert.Equal(t, common.HexToAddress(keyAddress), testAccount.Account.Address) + assert.NotNil(t, 1, len(testAccount.Keystore.Accounts())) }) t.Run("Retrieve created account new account", func(t *testing.T) { otherAccount, otherError := account.GetRskAccount(account.CreationArgs{ @@ -91,7 +91,7 @@ func TestGetRskAccountWithDerivation(t *testing.T) { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) t.Run("Create new account", func(t *testing.T) { - account, testError := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + testAccount, testError := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ CreationArgs: account.CreationArgs{ KeyDir: testDir, AccountNum: 0, @@ -103,8 +103,8 @@ func TestGetRskAccountWithDerivation(t *testing.T) { _, noExistError := os.Stat(testDir) assert.Falsef(t, os.IsNotExist(noExistError), "Key directory not created") require.NoError(t, testError) - assert.Equal(t, common.HexToAddress(keyAddress), account.Account.Address) - assert.NotNil(t, 1, len(account.Keystore.Accounts())) + assert.Equal(t, common.HexToAddress(keyAddress), testAccount.Account.Address) + assert.NotNil(t, 1, len(testAccount.Keystore.Accounts())) }) t.Run("Retrieve created account", func(t *testing.T) { otherAccount, otherError := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ @@ -155,33 +155,33 @@ func TestGetAccount_ErrorHandling(t *testing.T) { keyBytes, setupErr := io.ReadAll(keyFile) require.NoError(t, setupErr) t.Run("Invalid dir", func(t *testing.T) { - account, err := account.GetRskAccount(account.CreationArgs{ + testAccount, err := account.GetRskAccount(account.CreationArgs{ KeyDir: "/test", AccountNum: 0, EncryptedJson: string(keyBytes), Password: test.KeyPassword, }) - assert.Nil(t, account) + assert.Nil(t, testAccount) require.Error(t, err) }) t.Run("Invalid key", func(t *testing.T) { - account, err := account.GetRskAccount(account.CreationArgs{ + testAccount, err := account.GetRskAccount(account.CreationArgs{ KeyDir: testDir, AccountNum: 0, EncryptedJson: "any key", Password: test.KeyPassword, }) - assert.Nil(t, account) + assert.Nil(t, testAccount) require.Error(t, err) }) t.Run("Invalid password", func(t *testing.T) { - account, err := account.GetRskAccount(account.CreationArgs{ + testAccount, err := account.GetRskAccount(account.CreationArgs{ KeyDir: testDir, AccountNum: 0, EncryptedJson: string(keyBytes), Password: "incorrect", }) - assert.Nil(t, account) + assert.Nil(t, testAccount) require.Error(t, err) }) t.Run("Invalid account number", func(t *testing.T) { @@ -193,13 +193,13 @@ func TestGetAccount_ErrorHandling(t *testing.T) { Password: test.KeyPassword, }) require.NoError(t, err) - account, err := account.GetRskAccount(account.CreationArgs{ + testAccount, err := account.GetRskAccount(account.CreationArgs{ KeyDir: testDir, AccountNum: 1, EncryptedJson: string(keyBytes), Password: test.KeyPassword, }) - assert.Nil(t, account) + assert.Nil(t, testAccount) require.Error(t, err) }) } diff --git a/internal/adapters/dataproviders/rootstock/common_test.go b/internal/adapters/dataproviders/rootstock/common_test.go index b5dc2145..60ace210 100644 --- a/internal/adapters/dataproviders/rootstock/common_test.go +++ b/internal/adapters/dataproviders/rootstock/common_test.go @@ -94,7 +94,7 @@ func TestRskRetry(t *testing.T) { start := time.Now() result, err := lbc.HashPeginQuote(peginQuote) end := time.Now() - assert.WithinRange(t, end, start, start.Add(3*time.Second).Add(100*time.Millisecond)) + assert.WithinRange(t, end, start, start.Add(3*time.Second).Add(500*time.Millisecond)) require.Error(t, err) assert.Empty(t, result) lbcMock.AssertExpectations(t) diff --git a/internal/adapters/dataproviders/rootstock/wallet_test.go b/internal/adapters/dataproviders/rootstock/wallet_test.go index d3ce7964..5b57e958 100644 --- a/internal/adapters/dataproviders/rootstock/wallet_test.go +++ b/internal/adapters/dataproviders/rootstock/wallet_test.go @@ -40,13 +40,13 @@ var ( // TestRskWalletImpl we use this function to run all the test related to the wallet to open the account only once func TestRskWalletImpl(t *testing.T) { - account := test.OpenWalletForTest(t, "wallet") - t.Run("Address", createAddressTest(account)) - t.Run("Sign", creteSignTest(account)) - t.Run("SignBytes", createSignBytesTest(account)) - t.Run("Validate", createValidateTest(account)) - t.Run("SendRbtc", createSendRbtcTest(account)) - t.Run("SendRbtc error handling", createSendRbtcErrorHandlingTest(account)) + testAccount := test.OpenWalletForTest(t, "wallet") + t.Run("Address", createAddressTest(testAccount)) + t.Run("Sign", creteSignTest(testAccount)) + t.Run("SignBytes", createSignBytesTest(testAccount)) + t.Run("Validate", createValidateTest(testAccount)) + t.Run("SendRbtc", createSendRbtcTest(testAccount)) + t.Run("SendRbtc error handling", createSendRbtcErrorHandlingTest(testAccount)) } func createSendRbtcTest(account *account.RskAccount) func(t *testing.T) { diff --git a/internal/configuration/bootstrap/database.go b/internal/configuration/bootstrap/database.go index 3b3673b0..7a8a41bd 100644 --- a/internal/configuration/bootstrap/database.go +++ b/internal/configuration/bootstrap/database.go @@ -10,7 +10,7 @@ import ( func Mongo(ctx context.Context, env environment.MongoEnv) (*mongo.Connection, error) { client, err := mongo.Connect(ctx, env.Username, env.Password, env.Host, env.Port) if err == nil { - return mongo.NewConnection(client), nil + return mongo.NewConnection(mongo.NewClientWrapper(client)), nil } else { log.Error("Error connecting to MongoDB: ", err) return nil, err diff --git a/test/mocks/collection_binding_mock.go b/test/mocks/collection_binding_mock.go new file mode 100644 index 00000000..a0290bda --- /dev/null +++ b/test/mocks/collection_binding_mock.go @@ -0,0 +1,773 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + + mongo "go.mongodb.org/mongo-driver/mongo" + + options "go.mongodb.org/mongo-driver/mongo/options" +) + +// CollectionBindingMock is an autogenerated mock type for the CollectionBinding type +type CollectionBindingMock struct { + mock.Mock +} + +type CollectionBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *CollectionBindingMock) EXPECT() *CollectionBindingMock_Expecter { + return &CollectionBindingMock_Expecter{mock: &_m.Mock} +} + +// BulkWrite provides a mock function with given fields: ctx, models, opts +func (_m *CollectionBindingMock) BulkWrite(ctx context.Context, models []mongo.WriteModel, opts ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, models) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for BulkWrite") + } + + var r0 *mongo.BulkWriteResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []mongo.WriteModel, ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error)); ok { + return rf(ctx, models, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, []mongo.WriteModel, ...*options.BulkWriteOptions) *mongo.BulkWriteResult); ok { + r0 = rf(ctx, models, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.BulkWriteResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []mongo.WriteModel, ...*options.BulkWriteOptions) error); ok { + r1 = rf(ctx, models, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_BulkWrite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BulkWrite' +type CollectionBindingMock_BulkWrite_Call struct { + *mock.Call +} + +// BulkWrite is a helper method to define mock.On call +// - ctx context.Context +// - models []mongo.WriteModel +// - opts ...*options.BulkWriteOptions +func (_e *CollectionBindingMock_Expecter) BulkWrite(ctx interface{}, models interface{}, opts ...interface{}) *CollectionBindingMock_BulkWrite_Call { + return &CollectionBindingMock_BulkWrite_Call{Call: _e.mock.On("BulkWrite", + append([]interface{}{ctx, models}, opts...)...)} +} + +func (_c *CollectionBindingMock_BulkWrite_Call) Run(run func(ctx context.Context, models []mongo.WriteModel, opts ...*options.BulkWriteOptions)) *CollectionBindingMock_BulkWrite_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.BulkWriteOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.BulkWriteOptions) + } + } + run(args[0].(context.Context), args[1].([]mongo.WriteModel), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_BulkWrite_Call) Return(_a0 *mongo.BulkWriteResult, _a1 error) *CollectionBindingMock_BulkWrite_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_BulkWrite_Call) RunAndReturn(run func(context.Context, []mongo.WriteModel, ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error)) *CollectionBindingMock_BulkWrite_Call { + _c.Call.Return(run) + return _c +} + +// DeleteMany provides a mock function with given fields: ctx, filter, opts +func (_m *CollectionBindingMock) DeleteMany(ctx context.Context, filter interface{}, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for DeleteMany") + } + + var r0 *mongo.DeleteResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.DeleteOptions) (*mongo.DeleteResult, error)); ok { + return rf(ctx, filter, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.DeleteOptions) *mongo.DeleteResult); ok { + r0 = rf(ctx, filter, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.DeleteResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, ...*options.DeleteOptions) error); ok { + r1 = rf(ctx, filter, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_DeleteMany_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteMany' +type CollectionBindingMock_DeleteMany_Call struct { + *mock.Call +} + +// DeleteMany is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - opts ...*options.DeleteOptions +func (_e *CollectionBindingMock_Expecter) DeleteMany(ctx interface{}, filter interface{}, opts ...interface{}) *CollectionBindingMock_DeleteMany_Call { + return &CollectionBindingMock_DeleteMany_Call{Call: _e.mock.On("DeleteMany", + append([]interface{}{ctx, filter}, opts...)...)} +} + +func (_c *CollectionBindingMock_DeleteMany_Call) Run(run func(ctx context.Context, filter interface{}, opts ...*options.DeleteOptions)) *CollectionBindingMock_DeleteMany_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.DeleteOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.DeleteOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_DeleteMany_Call) Return(_a0 *mongo.DeleteResult, _a1 error) *CollectionBindingMock_DeleteMany_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_DeleteMany_Call) RunAndReturn(run func(context.Context, interface{}, ...*options.DeleteOptions) (*mongo.DeleteResult, error)) *CollectionBindingMock_DeleteMany_Call { + _c.Call.Return(run) + return _c +} + +// DeleteOne provides a mock function with given fields: ctx, filter, opts +func (_m *CollectionBindingMock) DeleteOne(ctx context.Context, filter interface{}, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for DeleteOne") + } + + var r0 *mongo.DeleteResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.DeleteOptions) (*mongo.DeleteResult, error)); ok { + return rf(ctx, filter, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.DeleteOptions) *mongo.DeleteResult); ok { + r0 = rf(ctx, filter, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.DeleteResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, ...*options.DeleteOptions) error); ok { + r1 = rf(ctx, filter, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_DeleteOne_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteOne' +type CollectionBindingMock_DeleteOne_Call struct { + *mock.Call +} + +// DeleteOne is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - opts ...*options.DeleteOptions +func (_e *CollectionBindingMock_Expecter) DeleteOne(ctx interface{}, filter interface{}, opts ...interface{}) *CollectionBindingMock_DeleteOne_Call { + return &CollectionBindingMock_DeleteOne_Call{Call: _e.mock.On("DeleteOne", + append([]interface{}{ctx, filter}, opts...)...)} +} + +func (_c *CollectionBindingMock_DeleteOne_Call) Run(run func(ctx context.Context, filter interface{}, opts ...*options.DeleteOptions)) *CollectionBindingMock_DeleteOne_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.DeleteOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.DeleteOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_DeleteOne_Call) Return(_a0 *mongo.DeleteResult, _a1 error) *CollectionBindingMock_DeleteOne_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_DeleteOne_Call) RunAndReturn(run func(context.Context, interface{}, ...*options.DeleteOptions) (*mongo.DeleteResult, error)) *CollectionBindingMock_DeleteOne_Call { + _c.Call.Return(run) + return _c +} + +// Find provides a mock function with given fields: ctx, filter, opts +func (_m *CollectionBindingMock) Find(ctx context.Context, filter interface{}, opts ...*options.FindOptions) (*mongo.Cursor, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Find") + } + + var r0 *mongo.Cursor + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.FindOptions) (*mongo.Cursor, error)); ok { + return rf(ctx, filter, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.FindOptions) *mongo.Cursor); ok { + r0 = rf(ctx, filter, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.Cursor) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, ...*options.FindOptions) error); ok { + r1 = rf(ctx, filter, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_Find_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Find' +type CollectionBindingMock_Find_Call struct { + *mock.Call +} + +// Find is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - opts ...*options.FindOptions +func (_e *CollectionBindingMock_Expecter) Find(ctx interface{}, filter interface{}, opts ...interface{}) *CollectionBindingMock_Find_Call { + return &CollectionBindingMock_Find_Call{Call: _e.mock.On("Find", + append([]interface{}{ctx, filter}, opts...)...)} +} + +func (_c *CollectionBindingMock_Find_Call) Run(run func(ctx context.Context, filter interface{}, opts ...*options.FindOptions)) *CollectionBindingMock_Find_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.FindOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.FindOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_Find_Call) Return(_a0 *mongo.Cursor, _a1 error) *CollectionBindingMock_Find_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_Find_Call) RunAndReturn(run func(context.Context, interface{}, ...*options.FindOptions) (*mongo.Cursor, error)) *CollectionBindingMock_Find_Call { + _c.Call.Return(run) + return _c +} + +// FindOne provides a mock function with given fields: ctx, filter, opts +func (_m *CollectionBindingMock) FindOne(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) *mongo.SingleResult { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for FindOne") + } + + var r0 *mongo.SingleResult + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.FindOneOptions) *mongo.SingleResult); ok { + r0 = rf(ctx, filter, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.SingleResult) + } + } + + return r0 +} + +// CollectionBindingMock_FindOne_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FindOne' +type CollectionBindingMock_FindOne_Call struct { + *mock.Call +} + +// FindOne is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - opts ...*options.FindOneOptions +func (_e *CollectionBindingMock_Expecter) FindOne(ctx interface{}, filter interface{}, opts ...interface{}) *CollectionBindingMock_FindOne_Call { + return &CollectionBindingMock_FindOne_Call{Call: _e.mock.On("FindOne", + append([]interface{}{ctx, filter}, opts...)...)} +} + +func (_c *CollectionBindingMock_FindOne_Call) Run(run func(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions)) *CollectionBindingMock_FindOne_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.FindOneOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.FindOneOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_FindOne_Call) Return(_a0 *mongo.SingleResult) *CollectionBindingMock_FindOne_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *CollectionBindingMock_FindOne_Call) RunAndReturn(run func(context.Context, interface{}, ...*options.FindOneOptions) *mongo.SingleResult) *CollectionBindingMock_FindOne_Call { + _c.Call.Return(run) + return _c +} + +// InsertMany provides a mock function with given fields: ctx, documents, opts +func (_m *CollectionBindingMock) InsertMany(ctx context.Context, documents []interface{}, opts ...*options.InsertManyOptions) (*mongo.InsertManyResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, documents) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for InsertMany") + } + + var r0 *mongo.InsertManyResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []interface{}, ...*options.InsertManyOptions) (*mongo.InsertManyResult, error)); ok { + return rf(ctx, documents, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, []interface{}, ...*options.InsertManyOptions) *mongo.InsertManyResult); ok { + r0 = rf(ctx, documents, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.InsertManyResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []interface{}, ...*options.InsertManyOptions) error); ok { + r1 = rf(ctx, documents, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_InsertMany_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InsertMany' +type CollectionBindingMock_InsertMany_Call struct { + *mock.Call +} + +// InsertMany is a helper method to define mock.On call +// - ctx context.Context +// - documents []interface{} +// - opts ...*options.InsertManyOptions +func (_e *CollectionBindingMock_Expecter) InsertMany(ctx interface{}, documents interface{}, opts ...interface{}) *CollectionBindingMock_InsertMany_Call { + return &CollectionBindingMock_InsertMany_Call{Call: _e.mock.On("InsertMany", + append([]interface{}{ctx, documents}, opts...)...)} +} + +func (_c *CollectionBindingMock_InsertMany_Call) Run(run func(ctx context.Context, documents []interface{}, opts ...*options.InsertManyOptions)) *CollectionBindingMock_InsertMany_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.InsertManyOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.InsertManyOptions) + } + } + run(args[0].(context.Context), args[1].([]interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_InsertMany_Call) Return(_a0 *mongo.InsertManyResult, _a1 error) *CollectionBindingMock_InsertMany_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_InsertMany_Call) RunAndReturn(run func(context.Context, []interface{}, ...*options.InsertManyOptions) (*mongo.InsertManyResult, error)) *CollectionBindingMock_InsertMany_Call { + _c.Call.Return(run) + return _c +} + +// InsertOne provides a mock function with given fields: ctx, document, opts +func (_m *CollectionBindingMock) InsertOne(ctx context.Context, document interface{}, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, document) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for InsertOne") + } + + var r0 *mongo.InsertOneResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.InsertOneOptions) (*mongo.InsertOneResult, error)); ok { + return rf(ctx, document, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, ...*options.InsertOneOptions) *mongo.InsertOneResult); ok { + r0 = rf(ctx, document, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.InsertOneResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, ...*options.InsertOneOptions) error); ok { + r1 = rf(ctx, document, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_InsertOne_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InsertOne' +type CollectionBindingMock_InsertOne_Call struct { + *mock.Call +} + +// InsertOne is a helper method to define mock.On call +// - ctx context.Context +// - document interface{} +// - opts ...*options.InsertOneOptions +func (_e *CollectionBindingMock_Expecter) InsertOne(ctx interface{}, document interface{}, opts ...interface{}) *CollectionBindingMock_InsertOne_Call { + return &CollectionBindingMock_InsertOne_Call{Call: _e.mock.On("InsertOne", + append([]interface{}{ctx, document}, opts...)...)} +} + +func (_c *CollectionBindingMock_InsertOne_Call) Run(run func(ctx context.Context, document interface{}, opts ...*options.InsertOneOptions)) *CollectionBindingMock_InsertOne_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.InsertOneOptions, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(*options.InsertOneOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_InsertOne_Call) Return(_a0 *mongo.InsertOneResult, _a1 error) *CollectionBindingMock_InsertOne_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_InsertOne_Call) RunAndReturn(run func(context.Context, interface{}, ...*options.InsertOneOptions) (*mongo.InsertOneResult, error)) *CollectionBindingMock_InsertOne_Call { + _c.Call.Return(run) + return _c +} + +// ReplaceOne provides a mock function with given fields: ctx, filter, replacement, opts +func (_m *CollectionBindingMock) ReplaceOne(ctx context.Context, filter interface{}, replacement interface{}, opts ...*options.ReplaceOptions) (*mongo.UpdateResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter, replacement) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ReplaceOne") + } + + var r0 *mongo.UpdateResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, interface{}, ...*options.ReplaceOptions) (*mongo.UpdateResult, error)); ok { + return rf(ctx, filter, replacement, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, interface{}, ...*options.ReplaceOptions) *mongo.UpdateResult); ok { + r0 = rf(ctx, filter, replacement, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.UpdateResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, interface{}, ...*options.ReplaceOptions) error); ok { + r1 = rf(ctx, filter, replacement, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_ReplaceOne_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ReplaceOne' +type CollectionBindingMock_ReplaceOne_Call struct { + *mock.Call +} + +// ReplaceOne is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - replacement interface{} +// - opts ...*options.ReplaceOptions +func (_e *CollectionBindingMock_Expecter) ReplaceOne(ctx interface{}, filter interface{}, replacement interface{}, opts ...interface{}) *CollectionBindingMock_ReplaceOne_Call { + return &CollectionBindingMock_ReplaceOne_Call{Call: _e.mock.On("ReplaceOne", + append([]interface{}{ctx, filter, replacement}, opts...)...)} +} + +func (_c *CollectionBindingMock_ReplaceOne_Call) Run(run func(ctx context.Context, filter interface{}, replacement interface{}, opts ...*options.ReplaceOptions)) *CollectionBindingMock_ReplaceOne_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.ReplaceOptions, len(args)-3) + for i, a := range args[3:] { + if a != nil { + variadicArgs[i] = a.(*options.ReplaceOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), args[2].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_ReplaceOne_Call) Return(_a0 *mongo.UpdateResult, _a1 error) *CollectionBindingMock_ReplaceOne_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_ReplaceOne_Call) RunAndReturn(run func(context.Context, interface{}, interface{}, ...*options.ReplaceOptions) (*mongo.UpdateResult, error)) *CollectionBindingMock_ReplaceOne_Call { + _c.Call.Return(run) + return _c +} + +// UpdateMany provides a mock function with given fields: ctx, filter, update, opts +func (_m *CollectionBindingMock) UpdateMany(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter, update) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for UpdateMany") + } + + var r0 *mongo.UpdateResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) (*mongo.UpdateResult, error)); ok { + return rf(ctx, filter, update, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) *mongo.UpdateResult); ok { + r0 = rf(ctx, filter, update, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.UpdateResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) error); ok { + r1 = rf(ctx, filter, update, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_UpdateMany_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateMany' +type CollectionBindingMock_UpdateMany_Call struct { + *mock.Call +} + +// UpdateMany is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - update interface{} +// - opts ...*options.UpdateOptions +func (_e *CollectionBindingMock_Expecter) UpdateMany(ctx interface{}, filter interface{}, update interface{}, opts ...interface{}) *CollectionBindingMock_UpdateMany_Call { + return &CollectionBindingMock_UpdateMany_Call{Call: _e.mock.On("UpdateMany", + append([]interface{}{ctx, filter, update}, opts...)...)} +} + +func (_c *CollectionBindingMock_UpdateMany_Call) Run(run func(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions)) *CollectionBindingMock_UpdateMany_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.UpdateOptions, len(args)-3) + for i, a := range args[3:] { + if a != nil { + variadicArgs[i] = a.(*options.UpdateOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), args[2].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_UpdateMany_Call) Return(_a0 *mongo.UpdateResult, _a1 error) *CollectionBindingMock_UpdateMany_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_UpdateMany_Call) RunAndReturn(run func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) (*mongo.UpdateResult, error)) *CollectionBindingMock_UpdateMany_Call { + _c.Call.Return(run) + return _c +} + +// UpdateOne provides a mock function with given fields: ctx, filter, update, opts +func (_m *CollectionBindingMock) UpdateOne(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, filter, update) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for UpdateOne") + } + + var r0 *mongo.UpdateResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) (*mongo.UpdateResult, error)); ok { + return rf(ctx, filter, update, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) *mongo.UpdateResult); ok { + r0 = rf(ctx, filter, update, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*mongo.UpdateResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) error); ok { + r1 = rf(ctx, filter, update, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CollectionBindingMock_UpdateOne_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateOne' +type CollectionBindingMock_UpdateOne_Call struct { + *mock.Call +} + +// UpdateOne is a helper method to define mock.On call +// - ctx context.Context +// - filter interface{} +// - update interface{} +// - opts ...*options.UpdateOptions +func (_e *CollectionBindingMock_Expecter) UpdateOne(ctx interface{}, filter interface{}, update interface{}, opts ...interface{}) *CollectionBindingMock_UpdateOne_Call { + return &CollectionBindingMock_UpdateOne_Call{Call: _e.mock.On("UpdateOne", + append([]interface{}{ctx, filter, update}, opts...)...)} +} + +func (_c *CollectionBindingMock_UpdateOne_Call) Run(run func(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions)) *CollectionBindingMock_UpdateOne_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.UpdateOptions, len(args)-3) + for i, a := range args[3:] { + if a != nil { + variadicArgs[i] = a.(*options.UpdateOptions) + } + } + run(args[0].(context.Context), args[1].(interface{}), args[2].(interface{}), variadicArgs...) + }) + return _c +} + +func (_c *CollectionBindingMock_UpdateOne_Call) Return(_a0 *mongo.UpdateResult, _a1 error) *CollectionBindingMock_UpdateOne_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CollectionBindingMock_UpdateOne_Call) RunAndReturn(run func(context.Context, interface{}, interface{}, ...*options.UpdateOptions) (*mongo.UpdateResult, error)) *CollectionBindingMock_UpdateOne_Call { + _c.Call.Return(run) + return _c +} + +// NewCollectionBindingMock creates a new instance of CollectionBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewCollectionBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *CollectionBindingMock { + mock := &CollectionBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/db_binding_mock.go b/test/mocks/db_binding_mock.go new file mode 100644 index 00000000..47aa532e --- /dev/null +++ b/test/mocks/db_binding_mock.go @@ -0,0 +1,99 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + mongo "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + mock "github.com/stretchr/testify/mock" + options "go.mongodb.org/mongo-driver/mongo/options" +) + +// DbBindingMock is an autogenerated mock type for the DbBinding type +type DbBindingMock struct { + mock.Mock +} + +type DbBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *DbBindingMock) EXPECT() *DbBindingMock_Expecter { + return &DbBindingMock_Expecter{mock: &_m.Mock} +} + +// Collection provides a mock function with given fields: name, opts +func (_m *DbBindingMock) Collection(name string, opts ...*options.CollectionOptions) mongo.CollectionBinding { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, name) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Collection") + } + + var r0 mongo.CollectionBinding + if rf, ok := ret.Get(0).(func(string, ...*options.CollectionOptions) mongo.CollectionBinding); ok { + r0 = rf(name, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(mongo.CollectionBinding) + } + } + + return r0 +} + +// DbBindingMock_Collection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Collection' +type DbBindingMock_Collection_Call struct { + *mock.Call +} + +// Collection is a helper method to define mock.On call +// - name string +// - opts ...*options.CollectionOptions +func (_e *DbBindingMock_Expecter) Collection(name interface{}, opts ...interface{}) *DbBindingMock_Collection_Call { + return &DbBindingMock_Collection_Call{Call: _e.mock.On("Collection", + append([]interface{}{name}, opts...)...)} +} + +func (_c *DbBindingMock_Collection_Call) Run(run func(name string, opts ...*options.CollectionOptions)) *DbBindingMock_Collection_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.CollectionOptions, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(*options.CollectionOptions) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *DbBindingMock_Collection_Call) Return(_a0 mongo.CollectionBinding) *DbBindingMock_Collection_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DbBindingMock_Collection_Call) RunAndReturn(run func(string, ...*options.CollectionOptions) mongo.CollectionBinding) *DbBindingMock_Collection_Call { + _c.Call.Return(run) + return _c +} + +// NewDbBindingMock creates a new instance of DbBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDbBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *DbBindingMock { + mock := &DbBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/mocks/db_client_binding_mock.go b/test/mocks/db_client_binding_mock.go new file mode 100644 index 00000000..c927a7b8 --- /dev/null +++ b/test/mocks/db_client_binding_mock.go @@ -0,0 +1,196 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + mongo "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/database/mongo" + mock "github.com/stretchr/testify/mock" + options "go.mongodb.org/mongo-driver/mongo/options" + + readpref "go.mongodb.org/mongo-driver/mongo/readpref" +) + +// DbClientBindingMock is an autogenerated mock type for the DbClientBinding type +type DbClientBindingMock struct { + mock.Mock +} + +type DbClientBindingMock_Expecter struct { + mock *mock.Mock +} + +func (_m *DbClientBindingMock) EXPECT() *DbClientBindingMock_Expecter { + return &DbClientBindingMock_Expecter{mock: &_m.Mock} +} + +// Database provides a mock function with given fields: name, opts +func (_m *DbClientBindingMock) Database(name string, opts ...*options.DatabaseOptions) mongo.DbBinding { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, name) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Database") + } + + var r0 mongo.DbBinding + if rf, ok := ret.Get(0).(func(string, ...*options.DatabaseOptions) mongo.DbBinding); ok { + r0 = rf(name, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(mongo.DbBinding) + } + } + + return r0 +} + +// DbClientBindingMock_Database_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Database' +type DbClientBindingMock_Database_Call struct { + *mock.Call +} + +// Database is a helper method to define mock.On call +// - name string +// - opts ...*options.DatabaseOptions +func (_e *DbClientBindingMock_Expecter) Database(name interface{}, opts ...interface{}) *DbClientBindingMock_Database_Call { + return &DbClientBindingMock_Database_Call{Call: _e.mock.On("Database", + append([]interface{}{name}, opts...)...)} +} + +func (_c *DbClientBindingMock_Database_Call) Run(run func(name string, opts ...*options.DatabaseOptions)) *DbClientBindingMock_Database_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]*options.DatabaseOptions, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(*options.DatabaseOptions) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *DbClientBindingMock_Database_Call) Return(_a0 mongo.DbBinding) *DbClientBindingMock_Database_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DbClientBindingMock_Database_Call) RunAndReturn(run func(string, ...*options.DatabaseOptions) mongo.DbBinding) *DbClientBindingMock_Database_Call { + _c.Call.Return(run) + return _c +} + +// Disconnect provides a mock function with given fields: ctx +func (_m *DbClientBindingMock) Disconnect(ctx context.Context) error { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for Disconnect") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(ctx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DbClientBindingMock_Disconnect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Disconnect' +type DbClientBindingMock_Disconnect_Call struct { + *mock.Call +} + +// Disconnect is a helper method to define mock.On call +// - ctx context.Context +func (_e *DbClientBindingMock_Expecter) Disconnect(ctx interface{}) *DbClientBindingMock_Disconnect_Call { + return &DbClientBindingMock_Disconnect_Call{Call: _e.mock.On("Disconnect", ctx)} +} + +func (_c *DbClientBindingMock_Disconnect_Call) Run(run func(ctx context.Context)) *DbClientBindingMock_Disconnect_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *DbClientBindingMock_Disconnect_Call) Return(_a0 error) *DbClientBindingMock_Disconnect_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DbClientBindingMock_Disconnect_Call) RunAndReturn(run func(context.Context) error) *DbClientBindingMock_Disconnect_Call { + _c.Call.Return(run) + return _c +} + +// Ping provides a mock function with given fields: ctx, rp +func (_m *DbClientBindingMock) Ping(ctx context.Context, rp *readpref.ReadPref) error { + ret := _m.Called(ctx, rp) + + if len(ret) == 0 { + panic("no return value specified for Ping") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *readpref.ReadPref) error); ok { + r0 = rf(ctx, rp) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DbClientBindingMock_Ping_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ping' +type DbClientBindingMock_Ping_Call struct { + *mock.Call +} + +// Ping is a helper method to define mock.On call +// - ctx context.Context +// - rp *readpref.ReadPref +func (_e *DbClientBindingMock_Expecter) Ping(ctx interface{}, rp interface{}) *DbClientBindingMock_Ping_Call { + return &DbClientBindingMock_Ping_Call{Call: _e.mock.On("Ping", ctx, rp)} +} + +func (_c *DbClientBindingMock_Ping_Call) Run(run func(ctx context.Context, rp *readpref.ReadPref)) *DbClientBindingMock_Ping_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*readpref.ReadPref)) + }) + return _c +} + +func (_c *DbClientBindingMock_Ping_Call) Return(_a0 error) *DbClientBindingMock_Ping_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DbClientBindingMock_Ping_Call) RunAndReturn(run func(context.Context, *readpref.ReadPref) error) *DbClientBindingMock_Ping_Call { + _c.Call.Return(run) + return _c +} + +// NewDbClientBindingMock creates a new instance of DbClientBindingMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDbClientBindingMock(t interface { + mock.TestingT + Cleanup(func()) +}) *DbClientBindingMock { + mock := &DbClientBindingMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/utils.go b/test/utils.go index 1975f745..0355a930 100644 --- a/test/utils.go +++ b/test/utils.go @@ -1,15 +1,18 @@ package test import ( + "bytes" "fmt" "github.com/btcsuite/btcd/chaincfg" "github.com/rsksmart/liquidity-provider-server/internal/adapters/dataproviders/rootstock/account" + log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "io" "os" "path/filepath" + "reflect" "runtime" "testing" "time" @@ -39,6 +42,38 @@ func RunTable[V, R any](t *testing.T, table Table[V, R], validationFunction func } } +// CountNonZeroValues counts the number of non-zero values in a struct, it panics if value of aStruct parameter +// is not a struct +func CountNonZeroValues(aStruct any) int { + value := reflect.ValueOf(aStruct) + count := 0 + for i := 0; i < value.NumField(); i++ { + if !value.Field(i).IsZero() { + count++ + } + } + return count +} + +func AssertNoLog(t *testing.T) (assertFunc func()) { + buff := new(bytes.Buffer) + log.SetOutput(buff) + return func() { + assert.Empty(t, buff.Bytes()) + } +} + +func AssertLogContains(t *testing.T, expected string) (assertFunc func()) { + message := make([]byte, 1024) + buff := new(bytes.Buffer) + log.SetOutput(buff) + return func() { + _, err := buff.Read(message) + require.NoError(t, err, "Error reading log message") + assert.Contains(t, string(message), expected, "Expected message not found") + } +} + func OpenDerivativeWalletForTest(t *testing.T, testRef string) *account.RskAccount { _, currentPackageDir, _, _ := runtime.Caller(0) testDir := filepath.Join(t.TempDir(), fmt.Sprintf("test-derivative-%s-%d", testRef, time.Now().UnixNano())) @@ -49,7 +84,7 @@ func OpenDerivativeWalletForTest(t *testing.T, testRef string) *account.RskAccou keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) - account, err := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ + testAccount, err := account.GetRskAccountWithDerivation(account.CreationWithDerivationArgs{ CreationArgs: account.CreationArgs{ KeyDir: testDir, AccountNum: 0, @@ -59,7 +94,7 @@ func OpenDerivativeWalletForTest(t *testing.T, testRef string) *account.RskAccou BtcParams: &chaincfg.TestNet3Params, }) require.NoError(t, err) - return account + return testAccount } func OpenWalletForTest(t *testing.T, testRef string) *account.RskAccount { @@ -75,12 +110,12 @@ func OpenWalletForTest(t *testing.T, testRef string) *account.RskAccount { keyBytes, err := io.ReadAll(keyFile) require.NoError(t, err) - account, err := account.GetRskAccount(account.CreationArgs{ + testAccount, err := account.GetRskAccount(account.CreationArgs{ KeyDir: testDir, AccountNum: 0, EncryptedJson: string(keyBytes), Password: KeyPassword, }) require.NoError(t, err) - return account + return testAccount } From 1b14fde830c8e28be17a31f104bd8465405b9618 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 7 May 2024 15:43:36 +0200 Subject: [PATCH 064/113] feat: serve management ui static files --- .../entrypoints/rest/assets/error.html | 10 ++ .../entrypoints/rest/assets/login.html | 85 +++++++++++++++++ .../entrypoints/rest/assets/management.html | 16 ++++ internal/adapters/entrypoints/rest/common.go | 2 +- .../entrypoints/rest/handlers/management.go | 43 +++++++++ .../entrypoints/rest/registry/registry.go | 1 + .../entrypoints/rest/routes/public.go | 14 ++- .../entrypoints/rest/routes/routes.go | 26 ++++-- internal/configuration/registry/usecase.go | 12 +++ internal/usecases/common.go | 1 + .../liquidity_provider/management_ui.go | 91 +++++++++++++++++++ .../liquidity_provider/management_ui_test.go | 74 +++++++++++++++ 12 files changed, 362 insertions(+), 13 deletions(-) create mode 100644 internal/adapters/entrypoints/rest/assets/error.html create mode 100644 internal/adapters/entrypoints/rest/assets/login.html create mode 100644 internal/adapters/entrypoints/rest/assets/management.html create mode 100644 internal/adapters/entrypoints/rest/handlers/management.go create mode 100644 internal/usecases/liquidity_provider/management_ui.go create mode 100644 internal/usecases/liquidity_provider/management_ui_test.go diff --git a/internal/adapters/entrypoints/rest/assets/error.html b/internal/adapters/entrypoints/rest/assets/error.html new file mode 100644 index 00000000..39dd9a55 --- /dev/null +++ b/internal/adapters/entrypoints/rest/assets/error.html @@ -0,0 +1,10 @@ + + + + + Management UI + + + Error opening management UI :( + + \ No newline at end of file diff --git a/internal/adapters/entrypoints/rest/assets/login.html b/internal/adapters/entrypoints/rest/assets/login.html new file mode 100644 index 00000000..f322aff8 --- /dev/null +++ b/internal/adapters/entrypoints/rest/assets/login.html @@ -0,0 +1,85 @@ + + + + + Management Login + + +

+ + + + {{if not .CredentialsSet}} + + + {{end}} + + + + + \ No newline at end of file diff --git a/internal/adapters/entrypoints/rest/assets/management.html b/internal/adapters/entrypoints/rest/assets/management.html new file mode 100644 index 00000000..f86928c3 --- /dev/null +++ b/internal/adapters/entrypoints/rest/assets/management.html @@ -0,0 +1,16 @@ + + + + + Management UI + + +

CSRF token: {{ .CsrfToken }}

+

Configuration: {{ .Configuration }}

+ + + \ No newline at end of file diff --git a/internal/adapters/entrypoints/rest/common.go b/internal/adapters/entrypoints/rest/common.go index cb84545c..79af9875 100644 --- a/internal/adapters/entrypoints/rest/common.go +++ b/internal/adapters/entrypoints/rest/common.go @@ -45,7 +45,7 @@ func JsonErrorResponse(w http.ResponseWriter, code int, response *ErrorResponse) func JsonResponseWithBody[T any](w http.ResponseWriter, statusCode int, body *T) { var err error - w.Header().Set("Content-Type", "lps/json") + w.Header().Set("Content-Type", "application/json") w.WriteHeader(statusCode) if body == nil { return diff --git a/internal/adapters/entrypoints/rest/handlers/management.go b/internal/adapters/entrypoints/rest/handlers/management.go new file mode 100644 index 00000000..e18e4f00 --- /dev/null +++ b/internal/adapters/entrypoints/rest/handlers/management.go @@ -0,0 +1,43 @@ +package handlers + +import ( + "github.com/gorilla/csrf" + "github.com/gorilla/sessions" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/server/cookies" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + log "github.com/sirupsen/logrus" + "html/template" + "net/http" +) + +const templatePath = "internal/adapters/entrypoints/rest/assets/" + +// NewManagementInterfaceHandler +// @Title Management Interface +// @Description Serves the static site for the Management UI +// @Success 200 object +// @Route /management [get] +func NewManagementInterfaceHandler(store sessions.Store, useCase *liquidity_provider.GetManagementUiDataUseCase) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + var templateName liquidity_provider.ManagementTemplateId + session, err := store.Get(req, cookies.ManagementSessionCookieName) + loggedIn := err == nil && !session.IsNew + result, err := useCase.Run(req.Context(), loggedIn) + if err != nil { + templateName = liquidity_provider.ManagementErrorTemplate + } else { + templateName = result.Name + } + tmpl := template.Must(template.ParseFiles(templatePath + string(templateName))) + err = tmpl.Execute(w, struct { + liquidity_provider.ManagementTemplateData + CsrfToken string + }{ + ManagementTemplateData: result.Data, + CsrfToken: csrf.Token(req), + }) + if err != nil { + log.Errorf("Error sending %s template to client, a partial version of the template might been sent: %s", templateName, err.Error()) + } + } +} diff --git a/internal/adapters/entrypoints/rest/registry/registry.go b/internal/adapters/entrypoints/rest/registry/registry.go index 5855ed54..6454a5ab 100644 --- a/internal/adapters/entrypoints/rest/registry/registry.go +++ b/internal/adapters/entrypoints/rest/registry/registry.go @@ -31,4 +31,5 @@ type UseCaseRegistry interface { LoginUseCase() *liquidity_provider.LoginUseCase SetCredentialsUseCase() *liquidity_provider.SetCredentialsUseCase GenerateDefaultCredentialsUseCase() *liquidity_provider.GenerateDefaultCredentialsUseCase + GetManagementUiDataUseCase() *liquidity_provider.GetManagementUiDataUseCase } diff --git a/internal/adapters/entrypoints/rest/routes/public.go b/internal/adapters/entrypoints/rest/routes/public.go index 8b2501d7..84a6d1dd 100644 --- a/internal/adapters/entrypoints/rest/routes/public.go +++ b/internal/adapters/entrypoints/rest/routes/public.go @@ -1,6 +1,7 @@ package routes import ( + "github.com/gorilla/sessions" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" "net/http" @@ -8,11 +9,12 @@ import ( type PublicEndpoint struct { Endpoint - RequiresCaptcha bool + RequiresCaptcha bool + RequiresCsrfProtection bool } // nolint:funlen -func getPublicEndpoints(useCaseRegistry registry.UseCaseRegistry) []PublicEndpoint { +func getPublicEndpoints(useCaseRegistry registry.UseCaseRegistry, store sessions.Store) []PublicEndpoint { return []PublicEndpoint{ { Endpoint: Endpoint{ @@ -72,5 +74,13 @@ func getPublicEndpoints(useCaseRegistry registry.UseCaseRegistry) []PublicEndpoi Handler: handlers.NewProviderDetailsHandler(useCaseRegistry.GetProviderDetailUseCase()), }, }, + { + Endpoint: Endpoint{ + Path: "/management", + Method: http.MethodGet, + Handler: handlers.NewManagementInterfaceHandler(store, useCaseRegistry.GetManagementUiDataUseCase()), + }, + RequiresCsrfProtection: true, + }, } } diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go index 350fb9c4..8690f6db 100644 --- a/internal/adapters/entrypoints/rest/routes/routes.go +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -2,6 +2,7 @@ package routes import ( "github.com/gorilla/mux" + "github.com/gorilla/sessions" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/middlewares" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" @@ -29,37 +30,42 @@ func ConfigureRoutes(router *mux.Router, env environment.Environment, useCaseReg ) // --- - registerPublicRoutes(router, env, useCaseRegistry) + store, err := cookies.GetSessionCookieStore(env.Management) + if err != nil { + log.Fatal("Error registering routes: ", err) + } + + registerPublicRoutes(router, env, useCaseRegistry, store) if env.Management.EnableManagementApi { - registerManagementRoutes(router, env, useCaseRegistry) + registerManagementRoutes(router, env, useCaseRegistry, store) } router.Methods(http.MethodOptions).HandlerFunc(handlers.NewOptionsHandler()) } -func registerPublicRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { +func registerPublicRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry, store sessions.Store) { captchaMiddleware := middlewares.NewCaptchaMiddleware(env.Captcha.Url, env.Captcha.Threshold, env.Captcha.Disabled, env.Captcha.SecretKey) - for _, endpoint := range getPublicEndpoints(useCaseRegistry) { + sessionMiddlewares := middlewares.NewSessionMiddlewares(env.Management, store) + for _, endpoint := range getPublicEndpoints(useCaseRegistry, store) { handler := endpoint.Handler if endpoint.RequiresCaptcha { - handler = useMiddlewares(endpoint.Handler, captchaMiddleware) + handler = useMiddlewares(handler, captchaMiddleware) + } + if endpoint.RequiresCsrfProtection { + handler = useMiddlewares(handler, sessionMiddlewares.Csrf) } router.Path(endpoint.Path).Methods(endpoint.Method).Handler(handler) } } -func registerManagementRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry) { +func registerManagementRoutes(router *mux.Router, env environment.Environment, useCaseRegistry registry.UseCaseRegistry, store sessions.Store) { log.Warn( "Server is running with the management API exposed. This interface " + "includes endpoints that must remain private at all cost. Please shut down " + "the server if you haven't configured the WAF properly as explained in documentation.", ) - store, err := cookies.GetSessionCookieStore(env.Management) - if err != nil { - log.Fatal("Error registering management routes: ", err) - } sessionMiddlewares := middlewares.NewSessionMiddlewares(env.Management, store) managementEndpoints := getManagementEndpoints(env, useCaseRegistry) var handler http.Handler diff --git a/internal/configuration/registry/usecase.go b/internal/configuration/registry/usecase.go index 038b9a94..7c3d1c33 100644 --- a/internal/configuration/registry/usecase.go +++ b/internal/configuration/registry/usecase.go @@ -52,6 +52,7 @@ type UseCaseRegistry struct { loginUseCase *liquidity_provider.LoginUseCase setCredentialsUseCase *liquidity_provider.SetCredentialsUseCase defaultCredentialsUseCase *liquidity_provider.GenerateDefaultCredentialsUseCase + getManagementUiDataUseCase *liquidity_provider.GetManagementUiDataUseCase } // NewUseCaseRegistry @@ -207,6 +208,13 @@ func NewUseCaseRegistry( databaseRegistry.LiquidityProviderRepository, messaging.EventBus, ), + getManagementUiDataUseCase: liquidity_provider.NewGetManagementUiDataUseCase( + databaseRegistry.LiquidityProviderRepository, + liquidityProvider, + liquidityProvider, + liquidityProvider, + env.Provider.ApiBaseUrl, + ), } } @@ -305,3 +313,7 @@ func (registry *UseCaseRegistry) SetCredentialsUseCase() *liquidity_provider.Set func (registry *UseCaseRegistry) GenerateDefaultCredentialsUseCase() *liquidity_provider.GenerateDefaultCredentialsUseCase { return registry.defaultCredentialsUseCase } + +func (registry *UseCaseRegistry) GetManagementUiDataUseCase() *liquidity_provider.GetManagementUiDataUseCase { + return registry.getManagementUiDataUseCase +} diff --git a/internal/usecases/common.go b/internal/usecases/common.go index bd5e135a..f9429509 100644 --- a/internal/usecases/common.go +++ b/internal/usecases/common.go @@ -51,6 +51,7 @@ const ( LoginId UseCaseId = "Login" ChangeCredentialsId UseCaseId = "ChangeCredentials" DefaultCredentialsId UseCaseId = "GenerateDefaultCredentials" + GetManagementUiId UseCaseId = "GetManagementUi" ) var ( diff --git a/internal/usecases/liquidity_provider/management_ui.go b/internal/usecases/liquidity_provider/management_ui.go new file mode 100644 index 00000000..db2b6137 --- /dev/null +++ b/internal/usecases/liquidity_provider/management_ui.go @@ -0,0 +1,91 @@ +package liquidity_provider + +import ( + "context" + "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases" +) + +type ManagementTemplateId string + +const ( + ManagementLoginTemplate ManagementTemplateId = "login.html" + ManagementUiTemplate ManagementTemplateId = "management.html" + ManagementErrorTemplate ManagementTemplateId = "error.html" +) + +type GetManagementUiDataUseCase struct { + liquidityProviderRepository liquidity_provider.LiquidityProviderRepository + lp liquidity_provider.LiquidityProvider + peginLp liquidity_provider.PeginLiquidityProvider + pegoutLp liquidity_provider.PegoutLiquidityProvider + baseUrl string +} + +func NewGetManagementUiDataUseCase( + liquidityProviderRepository liquidity_provider.LiquidityProviderRepository, + lp liquidity_provider.LiquidityProvider, + peginLp liquidity_provider.PeginLiquidityProvider, + pegoutLp liquidity_provider.PegoutLiquidityProvider, + baseUrl string, +) *GetManagementUiDataUseCase { + return &GetManagementUiDataUseCase{ + liquidityProviderRepository: liquidityProviderRepository, + lp: lp, + peginLp: peginLp, + pegoutLp: pegoutLp, + baseUrl: baseUrl, + } +} + +type ManagementTemplate struct { + Name ManagementTemplateId + Data ManagementTemplateData +} + +type ManagementTemplateData struct { + CredentialsSet bool + BaseUrl string + Configuration FullConfiguration +} + +func (useCase *GetManagementUiDataUseCase) Run(ctx context.Context, loggedIn bool) (*ManagementTemplate, error) { + if !loggedIn { + return useCase.getLoginTemplateData(ctx) + } + return useCase.getManagementTemplateData(ctx), nil +} + +func (useCase *GetManagementUiDataUseCase) getLoginTemplateData(ctx context.Context) (*ManagementTemplate, error) { + credentials, err := useCase.liquidityProviderRepository.GetCredentials(ctx) + if err != nil { + return nil, usecases.WrapUseCaseError(usecases.GetManagementUiId, err) + } + + return &ManagementTemplate{ + Name: ManagementLoginTemplate, + Data: ManagementTemplateData{ + CredentialsSet: credentials != nil, + BaseUrl: useCase.baseUrl, + }, + }, nil +} + +func (useCase *GetManagementUiDataUseCase) getManagementTemplateData(ctx context.Context) *ManagementTemplate { + generalConfiguration := useCase.lp.GeneralConfiguration(ctx) + peginConfiguration := useCase.peginLp.PeginConfiguration(ctx) + pegoutConfiguration := useCase.pegoutLp.PegoutConfiguration(ctx) + + return &ManagementTemplate{ + Name: ManagementUiTemplate, + Data: ManagementTemplateData{ + CredentialsSet: true, + BaseUrl: useCase.baseUrl, + Configuration: FullConfiguration{ + General: generalConfiguration, + Pegin: peginConfiguration, + Pegout: pegoutConfiguration, + }, + }, + } +} diff --git a/internal/usecases/liquidity_provider/management_ui_test.go b/internal/usecases/liquidity_provider/management_ui_test.go new file mode 100644 index 00000000..45dd348d --- /dev/null +++ b/internal/usecases/liquidity_provider/management_ui_test.go @@ -0,0 +1,74 @@ +package liquidity_provider_test + +import ( + "context" + lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" + "github.com/rsksmart/liquidity-provider-server/test/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestGetManagementUiDataUseCase_Run(t *testing.T) { + const testUrl = "http://localhost:8080" + t.Run("Return correct data when not logged in and credentials not set", func(t *testing.T) { + lpMock := &mocks.ProviderMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, nil).Once() + useCase := liquidity_provider.NewGetManagementUiDataUseCase(lpRepository, lpMock, lpMock, lpMock, testUrl) + result, err := useCase.Run(context.Background(), false) + require.NoError(t, err) + assert.Equal(t, liquidity_provider.ManagementLoginTemplate, result.Name) + assert.False(t, result.Data.CredentialsSet) + assert.Equal(t, testUrl, result.Data.BaseUrl) + assert.Empty(t, result.Data.Configuration) + lpRepository.AssertExpectations(t) + lpMock.AssertExpectations(t) + }) + t.Run("Return correct data when not logged in and credentials set", func(t *testing.T) { + lpMock := &mocks.ProviderMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(storedCredentials, nil).Once() + useCase := liquidity_provider.NewGetManagementUiDataUseCase(lpRepository, lpMock, lpMock, lpMock, testUrl) + result, err := useCase.Run(context.Background(), false) + require.NoError(t, err) + assert.Equal(t, liquidity_provider.ManagementLoginTemplate, result.Name) + assert.True(t, result.Data.CredentialsSet) + assert.Equal(t, testUrl, result.Data.BaseUrl) + assert.Empty(t, result.Data.Configuration) + lpRepository.AssertExpectations(t) + lpMock.AssertExpectations(t) + }) + t.Run("Return correct data when logged in", func(t *testing.T) { + lpMock := &mocks.ProviderMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + fullConfig := liquidity_provider.FullConfiguration{ + General: lp.DefaultGeneralConfiguration(), + Pegin: lp.DefaultPeginConfiguration(), + Pegout: lp.DefaultPegoutConfiguration(), + } + lpMock.On("GeneralConfiguration", test.AnyCtx).Return(fullConfig.General).Once() + lpMock.On("PeginConfiguration", test.AnyCtx).Return(fullConfig.Pegin).Once() + lpMock.On("PegoutConfiguration", test.AnyCtx).Return(fullConfig.Pegout).Once() + useCase := liquidity_provider.NewGetManagementUiDataUseCase(lpRepository, lpMock, lpMock, lpMock, testUrl) + result, err := useCase.Run(context.Background(), true) + require.NoError(t, err) + assert.Equal(t, liquidity_provider.ManagementUiTemplate, result.Name) + assert.True(t, result.Data.CredentialsSet) + assert.Equal(t, testUrl, result.Data.BaseUrl) + assert.Equal(t, fullConfig, result.Data.Configuration) + lpRepository.AssertExpectations(t) + lpMock.AssertExpectations(t) + }) + t.Run("Return error when repository fails", func(t *testing.T) { + lpMock := &mocks.ProviderMock{} + lpRepository := &mocks.LiquidityProviderRepositoryMock{} + lpRepository.On("GetCredentials", test.AnyCtx).Return(nil, assert.AnError).Once() + useCase := liquidity_provider.NewGetManagementUiDataUseCase(lpRepository, lpMock, lpMock, lpMock, testUrl) + result, err := useCase.Run(context.Background(), false) + require.Error(t, err) + assert.Empty(t, result) + }) +} From c46941216d214f1e5091f02b4e41decfdefed90f Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Tue, 7 May 2024 19:43:30 +0200 Subject: [PATCH 065/113] feat: add security headers to management ui --- .../entrypoints/rest/assets/login.html | 2 +- .../entrypoints/rest/assets/management.html | 2 +- .../entrypoints/rest/handlers/management.go | 49 ++++++++++++++++--- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/internal/adapters/entrypoints/rest/assets/login.html b/internal/adapters/entrypoints/rest/assets/login.html index f322aff8..211bc98c 100644 --- a/internal/adapters/entrypoints/rest/assets/login.html +++ b/internal/adapters/entrypoints/rest/assets/login.html @@ -17,7 +17,7 @@ - + \ No newline at end of file + function login({ baseUrl, username, password, csrfToken }) { + return fetch(`${baseUrl}/management/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-Token': csrfToken + }, + body: JSON.stringify({ username, password }) + }) + } + function setCredentials({ baseUrl, oldUsername, oldPassword, newUsername, newPassword, csrfToken }) { + return fetch(`${baseUrl}/management/credentials`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-Token': csrfToken + }, + body: JSON.stringify({ oldUsername, oldPassword, newUsername, newPassword }) + }) + } + + + diff --git a/internal/adapters/entrypoints/rest/assets/management copy.html b/internal/adapters/entrypoints/rest/assets/management copy.html new file mode 100644 index 00000000..ed37bfec --- /dev/null +++ b/internal/adapters/entrypoints/rest/assets/management copy.html @@ -0,0 +1,499 @@ + + + + + Management UI + + + + +
+
+
+

Management Dashboard


+
+
+
+
+
+
Provider
+
+
Provider Address
+

+
Operational Status
+

+
LBC Address
+

+
+
+
+
Collateral
+
+ +
+
+
Pegin Collateral
+

+
+
+ + +
+
+
+ +
+
+
+
Pegout Collateral
+

+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
Configuration
+
+
Current Configuration
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+ +
+ + + + + diff --git a/internal/adapters/entrypoints/rest/assets/management.html b/internal/adapters/entrypoints/rest/assets/management.html index bf173671..4367f709 100644 --- a/internal/adapters/entrypoints/rest/assets/management.html +++ b/internal/adapters/entrypoints/rest/assets/management.html @@ -3,14 +3,477 @@ Management UI + + -

CSRF token: {{ .CsrfToken }}

-

Configuration: {{ .Configuration }}

+
+
+
+

Management Dashboard


+
+
+
+
+
+
Provider
+
+
Provider Address
+

+
Operational Status
+

+
+
+
+
Collateral
+
+ +
+
+
Pegin Collateral
+

+
+
+ + +
+
+
+ +
+
+
+
Pegout Collateral
+

+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
Configuration
+
+
Current Configuration
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+ +
+ + + - - \ No newline at end of file + \ No newline at end of file diff --git a/internal/adapters/entrypoints/rest/assets/static/Bootstrap.css b/internal/adapters/entrypoints/rest/assets/static/Bootstrap.css new file mode 100644 index 00000000..7d437539 --- /dev/null +++ b/internal/adapters/entrypoints/rest/assets/static/Bootstrap.css @@ -0,0 +1,6 @@ +@charset "UTF-8";/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/internal/adapters/entrypoints/rest/assets/static/Bootstrap.js b/internal/adapters/entrypoints/rest/assets/static/Bootstrap.js new file mode 100644 index 00000000..04e9185b --- /dev/null +++ b/internal/adapters/entrypoints/rest/assets/static/Bootstrap.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function j(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function M(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${M(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${M(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=j(t.dataset[n])}return e},getDataAttribute:(t,e)=>j(t.getAttribute(`data-bs-${M(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>n(t))).join(","):null},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",jt="collapsing",Mt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(jt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(jt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(Mt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function je(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const Me={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:je(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:je(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==P(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],j=f?-T[$]/2:0,M=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-j-q-z-O.mainAxis:M-q-z-O.mainAxis,K=v?-E[$]/2+j+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,jn=`hide${xn}`,Mn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,jn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,Mn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,Mn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",js="Home",Ms="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,js,Ms].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([js,Ms].includes(t.key))i=e[t.key===js?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/internal/adapters/entrypoints/rest/handlers/management.go b/internal/adapters/entrypoints/rest/handlers/management.go index 901cbfd4..a9f8496a 100644 --- a/internal/adapters/entrypoints/rest/handlers/management.go +++ b/internal/adapters/entrypoints/rest/handlers/management.go @@ -3,6 +3,9 @@ package handlers import ( "encoding/hex" "fmt" + "html/template" + "net/http" + "github.com/gorilla/csrf" "github.com/gorilla/sessions" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/assets" @@ -10,8 +13,6 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/utils" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" log "github.com/sirupsen/logrus" - "html/template" - "net/http" ) const ( @@ -59,7 +60,7 @@ func NewManagementInterfaceHandler(store sessions.Store, useCase *liquidity_prov } func htmlTemplateSecurityHeaders(w http.ResponseWriter, nonce string) { - cspHeader := fmt.Sprintf("default-src 'self'; font-src 'self'; style-src 'self'; object-src 'none'; frame-src 'self';script-src 'self' 'nonce-%s'; img-src 'self' data:; connect-src 'self';", nonce) + cspHeader := fmt.Sprintf("default-src 'self'; font-src 'self' data:; style-src 'self' 'sha256-KoyuUqdEu+hxBz6L8yaiUAiFiD/fPDTxWrW817e498s='; object-src 'none'; frame-src 'self'; script-src 'self' 'nonce-%s'; img-src 'self' data:; connect-src 'self';", nonce) w.Header().Set("Content-Type", "text/html") w.Header().Set("Content-Security-Policy", cspHeader) w.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains; preload") diff --git a/internal/adapters/entrypoints/rest/server/server.go b/internal/adapters/entrypoints/rest/server/server.go index 058408f4..b9a21ceb 100644 --- a/internal/adapters/entrypoints/rest/server/server.go +++ b/internal/adapters/entrypoints/rest/server/server.go @@ -3,12 +3,6 @@ package server import ( "context" "errors" - "github.com/gorilla/handlers" - "github.com/gorilla/mux" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" - "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/routes" - "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" - log "github.com/sirupsen/logrus" "io" "net/http" "os" @@ -16,6 +10,13 @@ import ( "strconv" "syscall" "time" + + "github.com/gorilla/handlers" + "github.com/gorilla/mux" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/routes" + "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" + log "github.com/sirupsen/logrus" ) type Server struct { @@ -53,6 +54,7 @@ func (s *Server) start() error { WriteTimeout: 10 * time.Second, IdleTimeout: 10 * time.Second, } + s.router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./internal/adapters/entrypoints/rest/assets/static/")))) log.Info("Server started at localhost:", s.http.Addr) return s.http.ListenAndServe() } From 2eafa887962e1ceae4bf8ed4e607e5d07755ae81 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Wed, 29 May 2024 18:40:52 +0200 Subject: [PATCH 094/113] feat: add separated fs for assets --- .../entrypoints/rest/assets/favicon.ico | Bin 0 -> 1065 bytes .../adapters/entrypoints/rest/assets/fs.go | 7 +++++- .../entrypoints/rest/handlers/management.go | 4 +-- .../entrypoints/rest/routes/management.go | 23 +++++++++++++++--- .../entrypoints/rest/routes/routes.go | 3 ++- .../entrypoints/rest/server/server.go | 2 +- 6 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 internal/adapters/entrypoints/rest/assets/favicon.ico diff --git a/internal/adapters/entrypoints/rest/assets/favicon.ico b/internal/adapters/entrypoints/rest/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ed67ddcba3448953e9edd4d03a6e98eb76967b6d GIT binary patch literal 1065 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE zr>`sfGj4VvBj#RFO(&rIIZqeI5RcBLs~9nJ=diHq}0goG8O3u~oLN%X5cfw_d(<`Ta?p%a^`3vfC!+_}Q=dxvxv|MZu9`oD0))a{f9YpU91-W~NWPUFXg-ZQ!(Yo!cg)KI40}>B${Zx1$n{ zs;bADtzVRMFZKPd6xGIEYQc|RnM=KjHh#u!udRNdag(&36!-bnIU)6-?!Na|^R4)C zwEy45$J*_}(sCc$Dy{dtvCOSAPCEGi2>a`@5C4uGNZY&NLc|J=S%24;8AP_r27Fu{ z_&@2=qIVJxRVvPCPi#5*>x-T8!cN!gZyeh{^F9szxU=j{nQ6}FN%C)2>z>~s6#Tna z_eI&kO%4esD%TOx@J?>K zk`s}Sr|F!w4Bmff)vj`@jDUWTTQM>21&&;rwrspNBR?;;HA*?=;}XvKdYz#fE616c z)l=eTaQ3egTgvv!y(_lJka4^1O({n8Gp?u8W%EldXUmiZJ06^&?7Q?A|GI_MnSy^4 zbb*OowZt`|BqgyV)hf9t6-Y4{85kMq8XD>vn1>izSeY7F85nCD07-*a%o%r4H00)| zWTsW()-XHnLLyK@cvVP5Nl;?BLP1e}T4qkFLP=#oszPQ#NiqXN#hk~VcsL5fG&D~6 zpFZRHG>Cy&nOiTJTUc4xd$I_#u!2j2$>9`c<;@`qr*B+2apcSqnIr6{8$1?x=`p+# W7cBYYWI7dS1%s!npUXO@geCyYhQ9>> literal 0 HcmV?d00001 diff --git a/internal/adapters/entrypoints/rest/assets/fs.go b/internal/adapters/entrypoints/rest/assets/fs.go index 5bf78b11..fb05c5f7 100644 --- a/internal/adapters/entrypoints/rest/assets/fs.go +++ b/internal/adapters/entrypoints/rest/assets/fs.go @@ -2,7 +2,12 @@ package assets import "embed" -// FileSystem holds Management UI template files and its assets +// TemplateFileSystem holds Management UI template files // //go:embed *.html +var TemplateFileSystem embed.FS + +// FileSystem holds Management UI template assets (images, styles, scripts) +// +//go:embed static favicon.ico var FileSystem embed.FS diff --git a/internal/adapters/entrypoints/rest/handlers/management.go b/internal/adapters/entrypoints/rest/handlers/management.go index a9f8496a..ea150a6c 100644 --- a/internal/adapters/entrypoints/rest/handlers/management.go +++ b/internal/adapters/entrypoints/rest/handlers/management.go @@ -42,7 +42,7 @@ func NewManagementInterfaceHandler(store sessions.Store, useCase *liquidity_prov nonce := hex.EncodeToString(bytes) htmlTemplateSecurityHeaders(w, nonce) - tmpl := template.Must(template.ParseFS(assets.FileSystem, string(result.Name))) + tmpl := template.Must(template.ParseFS(assets.TemplateFileSystem, string(result.Name))) err = tmpl.Execute(w, struct { liquidity_provider.ManagementTemplateData @@ -69,7 +69,7 @@ func htmlTemplateSecurityHeaders(w http.ResponseWriter, nonce string) { } func sendErrorTemplate(w http.ResponseWriter) { - tmpl := template.Must(template.ParseFS(assets.FileSystem, string(liquidity_provider.ManagementErrorTemplate))) + tmpl := template.Must(template.ParseFS(assets.TemplateFileSystem, string(liquidity_provider.ManagementErrorTemplate))) err := tmpl.Execute(w, nil) if err != nil { log.Errorf("Error sending %s template to client, a partial version of the template might been sent: %s", liquidity_provider.ManagementErrorTemplate, err.Error()) diff --git a/internal/adapters/entrypoints/rest/routes/management.go b/internal/adapters/entrypoints/rest/routes/management.go index f0156dca..2b6cfa2a 100644 --- a/internal/adapters/entrypoints/rest/routes/management.go +++ b/internal/adapters/entrypoints/rest/routes/management.go @@ -2,6 +2,7 @@ package routes import ( "github.com/gorilla/sessions" + "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/assets" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/handlers" "github.com/rsksmart/liquidity-provider-server/internal/adapters/entrypoints/rest/registry" "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" @@ -9,10 +10,14 @@ import ( ) const ( - LOGIN_PATH = "/management/login" - UI_PATH = "/management" + LoginPath = "/management/login" + UiPath = "/management" + StaticPath = "/static/{file}" + IconPath = "/favicon.ico" ) +var AllowedPaths = [...]string{LoginPath, UiPath, StaticPath, IconPath} + // nolint:funlen func getManagementEndpoints(env environment.Environment, useCaseRegistry registry.UseCaseRegistry, store sessions.Store) []Endpoint { return []Endpoint{ @@ -72,7 +77,7 @@ func getManagementEndpoints(env environment.Environment, useCaseRegistry registr Handler: handlers.NewSetPegoutConfigHandler(useCaseRegistry.SetPegoutConfigUseCase()), }, { - Path: LOGIN_PATH, + Path: LoginPath, Method: http.MethodPost, Handler: handlers.NewManagementLoginHandler(env.Management, useCaseRegistry.LoginUseCase()), }, @@ -87,9 +92,19 @@ func getManagementEndpoints(env environment.Environment, useCaseRegistry registr Handler: handlers.NewSetCredentialsHandler(env.Management, useCaseRegistry.SetCredentialsUseCase()), }, { - Path: UI_PATH, + Path: UiPath, Method: http.MethodGet, Handler: handlers.NewManagementInterfaceHandler(store, useCaseRegistry.GetManagementUiDataUseCase()), }, + { + Path: StaticPath, + Method: http.MethodGet, + Handler: http.FileServer(http.FS(assets.FileSystem)), + }, + { + Path: IconPath, + Method: http.MethodGet, + Handler: http.FileServer(http.FS(assets.FileSystem)), + }, } } diff --git a/internal/adapters/entrypoints/rest/routes/routes.go b/internal/adapters/entrypoints/rest/routes/routes.go index 517548c2..93bff97a 100644 --- a/internal/adapters/entrypoints/rest/routes/routes.go +++ b/internal/adapters/entrypoints/rest/routes/routes.go @@ -10,6 +10,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/configuration/environment" log "github.com/sirupsen/logrus" "net/http" + "slices" ) type Endpoint struct { @@ -57,7 +58,7 @@ func registerManagementRoutes(router *mux.Router, env environment.Environment, u managementEndpoints := getManagementEndpoints(env, useCaseRegistry, store) var handler http.Handler for _, endpoint := range managementEndpoints { - if endpoint.Path == LOGIN_PATH || endpoint.Path == UI_PATH { + if slices.Contains(AllowedPaths[:], endpoint.Path) { handler = useMiddlewares(endpoint.Handler, sessionMiddlewares.Csrf) } else { handler = useMiddlewares(endpoint.Handler, sessionMiddlewares.SessionValidator, sessionMiddlewares.Csrf) diff --git a/internal/adapters/entrypoints/rest/server/server.go b/internal/adapters/entrypoints/rest/server/server.go index b9a21ceb..bc2854ae 100644 --- a/internal/adapters/entrypoints/rest/server/server.go +++ b/internal/adapters/entrypoints/rest/server/server.go @@ -54,7 +54,7 @@ func (s *Server) start() error { WriteTimeout: 10 * time.Second, IdleTimeout: 10 * time.Second, } - s.router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./internal/adapters/entrypoints/rest/assets/static/")))) + log.Info("Server started at localhost:", s.http.Addr) return s.http.ListenAndServe() } From 3d28f563708589e80a8fa0b2750761078a40e23e Mon Sep 17 00:00:00 2001 From: Dominik Z Date: Wed, 29 May 2024 19:44:44 +0300 Subject: [PATCH 095/113] Update management.html --- .../entrypoints/rest/assets/management.html | 129 ++++++++++-------- 1 file changed, 72 insertions(+), 57 deletions(-) diff --git a/internal/adapters/entrypoints/rest/assets/management.html b/internal/adapters/entrypoints/rest/assets/management.html index 4367f709..babef200 100644 --- a/internal/adapters/entrypoints/rest/assets/management.html +++ b/internal/adapters/entrypoints/rest/assets/management.html @@ -154,7 +154,6 @@
Current Configuration
- \ No newline at end of file + From 005521a0c71c4fd51df51d01dd509f1b1a7f49d6 Mon Sep 17 00:00:00 2001 From: Dominik Z Date: Wed, 29 May 2024 20:08:18 +0300 Subject: [PATCH 096/113] remove leftover dev code --- .../rest/assets/management copy.html | 499 ------------------ 1 file changed, 499 deletions(-) delete mode 100644 internal/adapters/entrypoints/rest/assets/management copy.html diff --git a/internal/adapters/entrypoints/rest/assets/management copy.html b/internal/adapters/entrypoints/rest/assets/management copy.html deleted file mode 100644 index ed37bfec..00000000 --- a/internal/adapters/entrypoints/rest/assets/management copy.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - Management UI - - - - -
-
-
-

Management Dashboard


-
-
-
-
-
-
Provider
-
-
Provider Address
-

-
Operational Status
-

-
LBC Address
-

-
-
-
-
Collateral
-
- -
-
-
Pegin Collateral
-

-
-
- - -
-
-
- -
-
-
-
Pegout Collateral
-

-
-
- - -
-
-
- -
-
-
-
-
-
-
-
-
Configuration
-
-
Current Configuration
- -
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
- -
- -
- - - - - From 6f53ae76644be411d6f10e14d73da70a26b51365 Mon Sep 17 00:00:00 2001 From: Dominik Z Date: Wed, 29 May 2024 20:14:03 +0300 Subject: [PATCH 097/113] remove unnecessary extension --- internal/adapters/entrypoints/rest/assets/management.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/adapters/entrypoints/rest/assets/management.html b/internal/adapters/entrypoints/rest/assets/management.html index babef200..148d6152 100644 --- a/internal/adapters/entrypoints/rest/assets/management.html +++ b/internal/adapters/entrypoints/rest/assets/management.html @@ -185,7 +185,7 @@
Current Configuration
const fetchProviderData = async () => { try { - const response = await fetch('http://localhost:8080/getProviders', { + const response = await fetch('/getProviders', { method: 'GET', headers: { 'Content-Type': 'application/json' From 27066bd7582387b3c4dff5f54056765b0eac03f9 Mon Sep 17 00:00:00 2001 From: Luisfc68 Date: Thu, 30 May 2024 12:07:17 +0200 Subject: [PATCH 098/113] test: fix sonar warnings --- .../liquidity_provider_test.go | 10 +- internal/entities/quote/pegin_quote_test.go | 28 +++--- internal/entities/quote/pegout_quote_test.go | 64 ++++++------ internal/entities/utils/passwords_test.go | 21 ++-- .../check_liquidity_test.go | 8 +- .../penalization_alert_test.go | 7 +- .../liquidity_provider/registration_test.go | 38 ++++---- .../usecases/pegin/accept_pegin_quote_test.go | 97 ++++++++++--------- .../usecases/pegin/get_pegin_quote_test.go | 21 ++-- .../usecases/pegin/register_pegin_test.go | 71 +++++++------- .../pegout/accept_pegout_quote_test.go | 54 +++++------ .../usecases/pegout/get_pegout_quote_test.go | 44 ++++----- .../usecases/watcher/clean_exipred_test.go | 22 ++--- .../watcher/get_watched_pegin_quote_test.go | 6 +- .../watcher/get_watched_pegout_quote_test.go | 6 +- .../watcher/update_pegout_deposit_test.go | 27 +++--- test/utils.go | 7 +- 17 files changed, 276 insertions(+), 255 deletions(-) diff --git a/internal/entities/liquidity_provider/liquidity_provider_test.go b/internal/entities/liquidity_provider/liquidity_provider_test.go index 3df99065..908d8349 100644 --- a/internal/entities/liquidity_provider/liquidity_provider_test.go +++ b/internal/entities/liquidity_provider/liquidity_provider_test.go @@ -12,7 +12,7 @@ func TestProviderType_IsValid(t *testing.T) { {Value: "pegout", Result: true}, {Value: "both", Result: true}, {Value: "", Result: false}, - {Value: "any value", Result: false}, + {Value: test.AnyString, Result: false}, } test.RunTable(t, cases, func(value liquidity_provider.ProviderType) bool { return value.IsValid() @@ -25,7 +25,7 @@ func TestProviderType_AcceptsPegin(t *testing.T) { {Value: "pegout", Result: false}, {Value: "both", Result: true}, {Value: "", Result: false}, - {Value: "any value", Result: false}, + {Value: test.AnyString, Result: false}, } test.RunTable(t, cases, func(value liquidity_provider.ProviderType) bool { return value.AcceptsPegin() @@ -38,7 +38,7 @@ func TestProviderType_AcceptsPegout(t *testing.T) { {Value: "pegout", Result: true}, {Value: "both", Result: true}, {Value: "", Result: false}, - {Value: "any value", Result: false}, + {Value: test.AnyString, Result: false}, } test.RunTable(t, cases, func(value liquidity_provider.ProviderType) bool { return value.AcceptsPegout() @@ -54,7 +54,7 @@ func TestToProviderType(t *testing.T) { {Value: "pegout", Result: nil}, {Value: "both", Result: nil}, {Value: "", Result: liquidity_provider.InvalidProviderTypeError}, - {Value: "any value", Result: liquidity_provider.InvalidProviderTypeError}, + {Value: test.AnyString, Result: liquidity_provider.InvalidProviderTypeError}, } valueCases := test.Table[string, liquidity_provider.ProviderType]{ @@ -62,7 +62,7 @@ func TestToProviderType(t *testing.T) { {Value: "pegout", Result: liquidity_provider.PegoutProvider}, {Value: "both", Result: liquidity_provider.FullProvider}, {Value: "", Result: ""}, - {Value: "any value", Result: ""}, + {Value: test.AnyString, Result: ""}, } test.RunTable(t, errorCases, func(value string) error { diff --git a/internal/entities/quote/pegin_quote_test.go b/internal/entities/quote/pegin_quote_test.go index 95621623..f6e0d5a0 100644 --- a/internal/entities/quote/pegin_quote_test.go +++ b/internal/entities/quote/pegin_quote_test.go @@ -64,15 +64,15 @@ func TestPeginQuote_IsExpired(t *testing.T) { quotes := test.Table[quote.PeginQuote, bool]{ { Value: quote.PeginQuote{ - FedBtcAddress: "any addrees", - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", + FedBtcAddress: test.AnyAddress, + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(0), PenaltyFee: entities.NewWei(1), - ContractAddress: "any addrees", + ContractAddress: test.AnyAddress, Data: "", GasLimit: 1, Nonce: 1, @@ -89,15 +89,15 @@ func TestPeginQuote_IsExpired(t *testing.T) { }, { Value: quote.PeginQuote{ - FedBtcAddress: "any addrees", - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", + FedBtcAddress: test.AnyAddress, + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(300000000000000000), PenaltyFee: entities.NewWei(1), - ContractAddress: "any addrees", + ContractAddress: test.AnyAddress, Data: "", GasLimit: 1, Nonce: 1, diff --git a/internal/entities/quote/pegout_quote_test.go b/internal/entities/quote/pegout_quote_test.go index a68c3df2..aa75ec1a 100644 --- a/internal/entities/quote/pegout_quote_test.go +++ b/internal/entities/quote/pegout_quote_test.go @@ -71,15 +71,15 @@ func TestPegoutQuote_IsExpired(t *testing.T) { quotes := test.Table[quote.PegoutQuote, bool]{ { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(300000000000000000), PenaltyFee: 1, Nonce: 1, - DepositAddress: "any addrees", + DepositAddress: test.AnyAddress, Value: entities.NewWei(0), AgreementTimestamp: uint32(now), DepositDateLimit: 1, @@ -95,15 +95,15 @@ func TestPegoutQuote_IsExpired(t *testing.T) { }, { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(300000000000000000), PenaltyFee: 1, Nonce: 1, - DepositAddress: "any addrees", + DepositAddress: test.AnyAddress, Value: entities.NewWei(0), AgreementTimestamp: uint32(now), DepositDateLimit: 1, @@ -130,15 +130,15 @@ func TestGetCreationBlock(t *testing.T) { quotes := test.Table[quote.PegoutQuote, uint64]{ { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(300000000000000000), PenaltyFee: 1, Nonce: 1, - DepositAddress: "any addrees", + DepositAddress: test.AnyAddress, Value: entities.NewWei(0), AgreementTimestamp: 1, DepositDateLimit: 1, @@ -154,15 +154,15 @@ func TestGetCreationBlock(t *testing.T) { }, { Value: quote.PegoutQuote{ - LbcAddress: "any addrees", - LpRskAddress: "any addrees", - BtcRefundAddress: "any addrees", - RskRefundAddress: "any addrees", - LpBtcAddress: "any addrees", + LbcAddress: test.AnyAddress, + LpRskAddress: test.AnyAddress, + BtcRefundAddress: test.AnyAddress, + RskRefundAddress: test.AnyAddress, + LpBtcAddress: test.AnyAddress, CallFee: entities.NewWei(300000000000000000), PenaltyFee: 1, Nonce: 1, - DepositAddress: "any addrees", + DepositAddress: test.AnyAddress, Value: entities.NewWei(0), AgreementTimestamp: 1, DepositDateLimit: 1, @@ -195,8 +195,8 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { cases := test.Table[quote.PegoutDeposit, bool]{ { Value: quote.PegoutDeposit{ - TxHash: "any hash", - QuoteHash: "any hash", + TxHash: test.AnyHash, + QuoteHash: test.AnyHash, Amount: entities.NewWei(490000000000000000), Timestamp: now, BlockNumber: 499, @@ -206,8 +206,8 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { }, { Value: quote.PegoutDeposit{ - TxHash: "any hash", - QuoteHash: "any hash", + TxHash: test.AnyHash, + QuoteHash: test.AnyHash, Amount: entities.NewWei(5100000000000000000), Timestamp: time.Unix(now.Unix()+61, 0), BlockNumber: 499, @@ -217,8 +217,8 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { }, { Value: quote.PegoutDeposit{ - TxHash: "any hash", - QuoteHash: "any hash", + TxHash: test.AnyHash, + QuoteHash: test.AnyHash, Amount: entities.NewWei(5100000000000000000), Timestamp: now, BlockNumber: 501, @@ -228,8 +228,8 @@ func TestPegoutDeposit_IsValidForQuote(t *testing.T) { }, { Value: quote.PegoutDeposit{ - TxHash: "any hash", - QuoteHash: "any hash", + TxHash: test.AnyHash, + QuoteHash: test.AnyHash, Amount: entities.NewWei(5100000000000000000), Timestamp: now, BlockNumber: 499, diff --git a/internal/entities/utils/passwords_test.go b/internal/entities/utils/passwords_test.go index 889caf11..14fcf5ff 100644 --- a/internal/entities/utils/passwords_test.go +++ b/internal/entities/utils/passwords_test.go @@ -6,6 +6,11 @@ import ( "testing" ) +const ( + stringShouldBeValidTemplate = "string %s should be valid" + stringShouldBeInvalidTemplate = "string %s should be invalid" +) + var specialChars = []string{ "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "=", "{", "}", "[", "]", ":", ";", "<", ">", ",", ".", "?", "/", "|", "\\", " ", "\"", "'", "`", "~", @@ -60,11 +65,11 @@ func TestPasswordSpecialCharRule(t *testing.T) { } for _, str := range allowedStrings { err := rule(str) - require.NoError(t, err, "string %s should be valid", str) + require.NoError(t, err, stringShouldBeValidTemplate, str) } for _, str := range notAllowedStrings { err := rule(str) - require.Error(t, err, "string %s should be invalid", str) + require.Error(t, err, stringShouldBeInvalidTemplate, str) } } @@ -83,11 +88,11 @@ func TestPasswordUpperCaseRule(t *testing.T) { } for _, str := range allowedStrings { err := rule(str) - require.NoError(t, err, "string %s should be valid", str) + require.NoError(t, err, stringShouldBeValidTemplate, str) } for _, str := range notAllowedStrings { err := rule(str) - require.Error(t, err, "string %s should be invalid", str) + require.Error(t, err, stringShouldBeInvalidTemplate, str) } } @@ -106,11 +111,11 @@ func TestPasswordLowerCaseRule(t *testing.T) { } for _, str := range allowedStrings { err := rule(str) - require.NoError(t, err, "string %s should be valid", str) + require.NoError(t, err, stringShouldBeValidTemplate, str) } for _, str := range notAllowedStrings { err := rule(str) - require.Error(t, err, "string %s should be invalid", str) + require.Error(t, err, stringShouldBeInvalidTemplate, str) } } @@ -129,11 +134,11 @@ func TestPasswordDigitRule(t *testing.T) { } for _, str := range allowedStrings { err := rule(str) - require.NoError(t, err, "string %s should be valid", str) + require.NoError(t, err, stringShouldBeValidTemplate, str) } for _, str := range notAllowedStrings { err := rule(str) - require.Error(t, err, "string %s should be invalid", str) + require.Error(t, err, stringShouldBeInvalidTemplate, str) } } diff --git a/internal/usecases/liquidity_provider/check_liquidity_test.go b/internal/usecases/liquidity_provider/check_liquidity_test.go index 3503076c..c8d95ebd 100644 --- a/internal/usecases/liquidity_provider/check_liquidity_test.go +++ b/internal/usecases/liquidity_provider/check_liquidity_test.go @@ -38,7 +38,7 @@ func TestCheckLiquidityUseCase_Run_NoPeginLiquidity(t *testing.T) { alertSender := &mocks.AlertSenderMock{} recipient := "recipient@test.com" alertSender.On("SendAlert", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, "PegIn: Out of liquidity", "You are out of liquidity to perform a PegIn. Please, do a deposit", []string{recipient}, @@ -61,7 +61,7 @@ func TestCheckLiquidityUseCase_Run_NoPegoutLiquidity(t *testing.T) { alertSender := &mocks.AlertSenderMock{} recipient := "recipient@test.com" alertSender.On("SendAlert", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, "PegOut: Out of liquidity", "You are out of liquidity to perform a PegOut. Please, do a deposit", []string{recipient}, @@ -124,7 +124,7 @@ func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(nil).Once() - sender.On("SendAlert", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError).Once() + sender.On("SendAlert", test.AnyCtx, mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError).Once() }, }, { @@ -132,7 +132,7 @@ func TestCheckLiquidityUseCase_Run_OnlyLogSendErrors(t *testing.T) { bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000), nil).Once() provider.On("HasPeginLiquidity", mock.Anything, mock.Anything).Return(nil).Once() provider.On("HasPegoutLiquidity", mock.Anything, mock.Anything).Return(usecases.NoLiquidityError).Once() - sender.On("SendAlert", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError).Once() + sender.On("SendAlert", test.AnyCtx, mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError).Once() }, }, } diff --git a/internal/usecases/liquidity_provider/penalization_alert_test.go b/internal/usecases/liquidity_provider/penalization_alert_test.go index 20316367..7566b6b4 100644 --- a/internal/usecases/liquidity_provider/penalization_alert_test.go +++ b/internal/usecases/liquidity_provider/penalization_alert_test.go @@ -7,6 +7,7 @@ import ( "github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain" lp "github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider" "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider" + "github.com/rsksmart/liquidity-provider-server/test" "github.com/rsksmart/liquidity-provider-server/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -36,7 +37,7 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { toBlock := uint64(10) lbc.On( "GetPeginPunishmentEvents", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, uint64(5), &toBlock, ).Return(events, nil).Once() @@ -47,7 +48,7 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { for i := 0; i < 3; i++ { sender.On( "SendAlert", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, "Pegin Punishment", fmt.Sprintf("You were punished in %v rBTC for the quoteHash %s", events[i].Penalty.ToRbtc(), events[i].QuoteHash), []string{recipient}, @@ -65,7 +66,7 @@ func TestPenalizationAlertUseCase_Run(t *testing.T) { func TestPenalizationAlertUseCase_Run_GetEvents(t *testing.T) { lbc := &mocks.LbcMock{} sender := &mocks.AlertSenderMock{} - lbc.On("GetPeginPunishmentEvents", mock.AnythingOfType("context.backgroundCtx"), uint64(5), mock.Anything). + lbc.On("GetPeginPunishmentEvents", test.AnyCtx, uint64(5), mock.Anything). Return([]lp.PunishmentEvent{}, assert.AnError).Once() contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewPenalizationAlertUseCase(contracts, sender, "recipient") diff --git a/internal/usecases/liquidity_provider/registration_test.go b/internal/usecases/liquidity_provider/registration_test.go index a9cb7349..e556bcb0 100644 --- a/internal/usecases/liquidity_provider/registration_test.go +++ b/internal/usecases/liquidity_provider/registration_test.go @@ -24,7 +24,7 @@ func TestRegistrationUseCase_Run_AlreadyRegistered(t *testing.T) { provider.On("RskAddress").Return("rskAddress") contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + params := blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) provider.AssertExpectations(t) @@ -34,11 +34,11 @@ func TestRegistrationUseCase_Run_AlreadyRegistered(t *testing.T) { func TestRegistrationUseCase_Run_ValidateParams(t *testing.T) { cases := []blockchain.ProviderRegistrationParams{ - blockchain.NewProviderRegistrationParams("", "url.com", true, "both"), + blockchain.NewProviderRegistrationParams("", test.AnyUrl, true, "both"), blockchain.NewProviderRegistrationParams("name", "", true, "both"), - blockchain.NewProviderRegistrationParams("name", "url.com", false, "both"), - blockchain.NewProviderRegistrationParams("name", "url.com", true, "anything"), - blockchain.NewProviderRegistrationParams("", "url.com", true, ""), + blockchain.NewProviderRegistrationParams("name", test.AnyUrl, false, "both"), + blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "anything"), + blockchain.NewProviderRegistrationParams("", test.AnyUrl, true, ""), } lbc := &mocks.LbcMock{} provider := &mocks.ProviderMock{} @@ -60,16 +60,16 @@ func TestRegistrationUseCase_Run_AddPeginCollateralIfNotOperational(t *testing.T lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) - lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + lbc.On("AddCollateral", test.AnyWei).Return(nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegin") + params := blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "pegin") id, err := useCase.Run(params) lbc.AssertExpectations(t) provider.AssertExpectations(t) - lbc.AssertNotCalled(t, "AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")) + lbc.AssertNotCalled(t, "AddPegoutCollateral", test.AnyWei) assert.Equal(t, int64(0), id) require.ErrorIs(t, err, usecases.AlreadyRegisteredError) } @@ -81,16 +81,16 @@ func TestRegistrationUseCase_Run_AddPegoutCollateralIfNotOperational(t *testing. lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(1000), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) - lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + lbc.On("AddPegoutCollateral", test.AnyWei).Return(nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "pegout") + params := blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "pegout") id, err := useCase.Run(params) lbc.AssertExpectations(t) provider.AssertExpectations(t) - lbc.AssertNotCalled(t, "AddCollateral", mock.AnythingOfType("*entities.Wei")) + lbc.AssertNotCalled(t, "AddCollateral", test.AnyWei) assert.Equal(t, int64(0), id) require.ErrorIs(t, err, usecases.AlreadyRegisteredError) } @@ -102,13 +102,13 @@ func TestRegistrationUseCase_Run_AddCollateralIfNotOperational(t *testing.T) { lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(999), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) - lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) - lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) + lbc.On("AddCollateral", test.AnyWei).Return(nil) + lbc.On("AddPegoutCollateral", test.AnyWei).Return(nil) provider := &mocks.ProviderMock{} provider.On("RskAddress").Return("rskAddress") contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + params := blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) provider.AssertExpectations(t) @@ -132,7 +132,7 @@ func TestRegistrationUseCase_Run(t *testing.T) { provider.On("RskAddress").Return("rskAddress") contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + params := blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) lbc.AssertNotCalled(t, "AddCollateral") @@ -152,7 +152,7 @@ func TestRegistrationUseCase_Run_ErrorHandling(t *testing.T) { provider.On("RskAddress").Return("rskAddress") contracts := blockchain.RskContracts{Lbc: lbc} useCase := liquidity_provider.NewRegistrationUseCase(contracts, provider) - params := blockchain.NewProviderRegistrationParams("name", "url.com", true, "both") + params := blockchain.NewProviderRegistrationParams("name", test.AnyUrl, true, "both") id, err := useCase.Run(params) lbc.AssertExpectations(t) assert.Equal(t, int64(0), id) @@ -219,7 +219,7 @@ func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *mocks.LbcM lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(10), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) - lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(assert.AnError) + lbc.On("AddCollateral", test.AnyWei).Return(assert.AnError) }, }, { @@ -229,8 +229,8 @@ func registrationUseCaseUnexpectedErrorSetups() test.Table[func(mock *mocks.LbcM lbc.On("GetPegoutCollateral", mock.Anything).Return(entities.NewWei(10), nil) lbc.On("IsOperationalPegin", mock.Anything).Return(false, nil) lbc.On("IsOperationalPegout", mock.Anything).Return(false, nil) - lbc.On("AddCollateral", mock.AnythingOfType("*entities.Wei")).Return(nil) - lbc.On("AddPegoutCollateral", mock.AnythingOfType("*entities.Wei")).Return(assert.AnError) + lbc.On("AddCollateral", test.AnyWei).Return(nil) + lbc.On("AddPegoutCollateral", test.AnyWei).Return(assert.AnError) }, }, } diff --git a/internal/usecases/pegin/accept_pegin_quote_test.go b/internal/usecases/pegin/accept_pegin_quote_test.go index 17c32e53..b87dddc1 100644 --- a/internal/usecases/pegin/accept_pegin_quote_test.go +++ b/internal/usecases/pegin/accept_pegin_quote_test.go @@ -18,6 +18,7 @@ import ( "time" ) +var anyScript = "any script" var acceptPeginSignature = "signature" var acceptPeginDerivationAddress = "derivation address" var acceptPeginQuoteHash = "1a1b1c" @@ -64,9 +65,9 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { State: quote.PeginStateWaitingForDeposit, } quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) - quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil) + quoteRepository.On("GetQuote", test.AnyCtx, acceptPeginQuoteHash).Return(&testPeginQuote, nil) + quoteRepository.On("GetRetainedQuote", test.AnyCtx, acceptPeginQuoteHash).Return(nil, nil) + quoteRepository.On("InsertRetainedQuote", test.AnyCtx, retainedQuote).Return(nil) bridge := new(mocks.BridgeMock) bridge.On("FetchFederationInfo").Return(federationInfo, nil) lbcParsedAddress, _ := hex.DecodeString(strings.TrimPrefix(testPeginQuote.LbcAddress, "0x")) @@ -79,12 +80,12 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { UserBtcRefundAddress: refundParsedAddress, LpBtcAddress: lpParsedAddress, QuoteHash: parsedHash, - }).Return(blockchain.FlyoverDerivation{Address: acceptPeginDerivationAddress, RedeemScript: "any script"}, nil) + }).Return(blockchain.FlyoverDerivation{Address: acceptPeginDerivationAddress, RedeemScript: anyScript}, nil) btc := new(mocks.BtcRpcMock) btc.On("DecodeAddress", testPeginQuote.BtcRefundAddress, true).Return(refundParsedAddress, nil) btc.On("DecodeAddress", testPeginQuote.LpBtcAddress, true).Return(lpParsedAddress, nil) lp := new(mocks.ProviderMock) - lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), requiredLiquidity).Return(nil) + lp.On("HasPeginLiquidity", test.AnyCtx, requiredLiquidity).Return(nil) lp.On("SignQuote", acceptPeginQuoteHash).Return(acceptPeginSignature, nil) eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPeginQuoteEvent) bool { @@ -94,7 +95,7 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { mutex.On("Lock").Return() mutex.On("Unlock").Return() rsk := new(mocks.RootstockRpcServerMock) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50), nil) contracts := blockchain.RskContracts{Bridge: bridge} useCase := pegin.NewAcceptQuoteUseCase(quoteRepository, contracts, blockchain.Rpc{Rsk: rsk, Btc: btc}, lp, lp, eventBus, mutex) @@ -122,8 +123,8 @@ func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { State: quote.PeginStateWaitingForDeposit, } quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&retainedQuote, nil) + quoteRepository.On("GetQuote", test.AnyCtx, acceptPeginQuoteHash).Return(&testPeginQuote, nil) + quoteRepository.On("GetRetainedQuote", test.AnyCtx, acceptPeginQuoteHash).Return(&retainedQuote, nil) bridge := new(mocks.BridgeMock) btc := new(mocks.BtcRpcMock) @@ -157,7 +158,7 @@ func TestAcceptQuoteUseCase_Run_AlreadyAccepted(t *testing.T) { func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) + quoteRepository.On("GetQuote", test.AnyCtx, acceptPeginQuoteHash).Return(nil, nil) bridge := new(mocks.BridgeMock) btc := new(mocks.BtcRpcMock) @@ -190,7 +191,7 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { expiredQuote.AgreementTimestamp = uint32(time.Now().Unix()) - 1000 expiredQuote.TimeForDeposit = 500 quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&expiredQuote, nil) + quoteRepository.On("GetQuote", test.AnyCtx, acceptPeginQuoteHash).Return(&expiredQuote, nil) bridge := new(mocks.BridgeMock) btc := new(mocks.BtcRpcMock) @@ -221,25 +222,25 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { requiredLiquidity := entities.NewWei(9280000) quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(&testPeginQuote, nil) - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), acceptPeginQuoteHash).Return(nil, nil) + quoteRepository.On("GetQuote", test.AnyCtx, acceptPeginQuoteHash).Return(&testPeginQuote, nil) + quoteRepository.On("GetRetainedQuote", test.AnyCtx, acceptPeginQuoteHash).Return(nil, nil) bridge := new(mocks.BridgeMock) bridge.On("FetchFederationInfo").Return(federationInfo, nil) bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{ Address: "derivation address", - RedeemScript: "any script", + RedeemScript: anyScript, }, nil) btc := new(mocks.BtcRpcMock) btc.On("DecodeAddress", testPeginQuote.BtcRefundAddress, true).Return([]byte{4, 5, 6}, nil) btc.On("DecodeAddress", testPeginQuote.LpBtcAddress, true).Return([]byte{7, 8, 9}, nil) lp := new(mocks.ProviderMock) - lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), requiredLiquidity).Return(assert.AnError) + lp.On("HasPeginLiquidity", test.AnyCtx, requiredLiquidity).Return(assert.AnError) eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) mutex.On("Lock").Return() mutex.On("Unlock").Return() rsk := new(mocks.RootstockRpcServerMock) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50), nil) contracts := blockchain.RskContracts{Bridge: bridge} rpc := blockchain.Rpc{Rsk: rsk, Btc: btc} @@ -291,38 +292,38 @@ func TestAcceptQuoteUseCase_Run_ErrorHandling(t *testing.T) { // nolint:funlen func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - derivation := blockchain.FlyoverDerivation{Address: test.AnyAddress, RedeemScript: "any script"} + derivation := blockchain.FlyoverDerivation{Address: test.AnyAddress, RedeemScript: anyScript} return []func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock){ func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() *quoteHash = "malformed hash" }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, @@ -330,23 +331,23 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { caseQuote := testPeginQuote caseQuote.LbcAddress = "malformed address" - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&caseQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&caseQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(blockchain.FederationInfo{}, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() @@ -354,51 +355,51 @@ func acceptQuoteUseCaseUnexpectedErrorSetups() []func(quoteHash *string, quoteRe }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(nil, assert.AnError).Once() + rsk.On("GasPrice", test.AnyCtx).Return(nil, assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() - lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(1), nil).Once() + lp.On("HasPeginLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() - lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(1), nil).Once() + lp.On("HasPeginLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() // set derivation and signature to empty to malform the retained quote bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(blockchain.FlyoverDerivation{}, nil).Once() lp.On("SignQuote", mock.Anything).Return("", nil).Once() }, func(quoteHash *string, quoteRepository *mocks.PeginQuoteRepositoryMock, bridge *mocks.BridgeMock, btc *mocks.BtcRpcMock, lp *mocks.ProviderMock, rsk *mocks.RootstockRpcServerMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(&testPeginQuote, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil, nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(&testPeginQuote, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything).Return(nil, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{1}, nil).Once() btc.On("DecodeAddress", mock.Anything, mock.Anything).Return([]byte{2}, nil).Once() bridge.On("FetchFederationInfo").Return(federationInfo, nil).Once() bridge.On("GetFlyoverDerivationAddress", mock.Anything).Return(derivation, nil).Once() - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(1), nil).Once() - lp.On("HasPeginLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(1), nil).Once() + lp.On("HasPeginLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return("signature", nil).Once() - quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + quoteRepository.On("InsertRetainedQuote", test.AnyCtx, mock.Anything).Return(assert.AnError).Once() }, } } diff --git a/internal/usecases/pegin/get_pegin_quote_test.go b/internal/usecases/pegin/get_pegin_quote_test.go index c39c8fac..baad3fdb 100644 --- a/internal/usecases/pegin/get_pegin_quote_test.go +++ b/internal/usecases/pegin/get_pegin_quote_test.go @@ -17,11 +17,14 @@ import ( "testing" ) +var ( + fedAddress = "fed address" + lbcAddress = "lbc address" +) + // nolint:funlen,cyclop func TestGetQuoteUseCase_Run(t *testing.T) { quoteHash := "0x9876543210" - fedAddress := "fed address" - lbcAddress := "lbc address" lpBtcAddress := "mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6" userRskAddress := "0x79568c2989232dCa1840087D73d403602364c0D4" quoteValue := entities.NewWei(5000) @@ -219,9 +222,9 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) - bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetFedAddress").Return(fedAddress, nil) bridge.On("GetMinimumLockTxValue").Return(nil, assert.AnError) - lbc.On("GetAddress").Return("lbc address") + lbc.On("GetAddress").Return(lbcAddress) lp.On("RskAddress").Return("0x4b5b6b") lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) @@ -232,10 +235,10 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) - bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetFedAddress").Return(fedAddress, nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) lbc.On("HashPeginQuote", mock.Anything).Return("", assert.AnError) - lbc.On("GetAddress").Return("lbc address") + lbc.On("GetAddress").Return(lbcAddress) lp.On("PeginConfiguration", test.AnyCtx).Return(getPeginConfiguration()) lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) lp.On("RskAddress").Return("0x4b5b6b") @@ -246,10 +249,10 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) - bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetFedAddress").Return(fedAddress, nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(200), nil) lbc.On("HashPeginQuote", mock.Anything).Return("any hash", nil) - lbc.On("GetAddress").Return("lbc address") + lbc.On("GetAddress").Return(lbcAddress) peginQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(assert.AnError) lp.On("RskAddress").Return("0x4b5b6b") lp.On("BtcAddress").Return("mnYcQxCZBbmLzNfE9BhV7E8E2u7amdz5y6") @@ -269,7 +272,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() []func( rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(entities.NewWei(100), nil) rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(10), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) - bridge.On("GetFedAddress").Return("fed address", nil) + bridge.On("GetFedAddress").Return(fedAddress, nil) lbc.On("GetAddress").Return("") peginConfig := getPeginConfiguration() generalConfig := getGeneralConfiguration() diff --git a/internal/usecases/pegin/register_pegin_test.go b/internal/usecases/pegin/register_pegin_test.go index 4336a5f9..d4873f7f 100644 --- a/internal/usecases/pegin/register_pegin_test.go +++ b/internal/usecases/pegin/register_pegin_test.go @@ -24,16 +24,21 @@ var btcBlockInfoMock = blockchain.BitcoinBlockInformation{ Height: big.NewInt(200), } +var ( + registerPeginTx = "register tx hash" + userBtcTx = "btc tx hash" + cfuTx = "cfu tx hash" +) + func TestRegisterPeginUseCase_Run(t *testing.T) { - registerPeginTx := "register tx hash" retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, - UserBtcTxHash: "btc tx hash", - CallForUserTxHash: "cfu tx hash", + UserBtcTxHash: userBtcTx, + CallForUserTxHash: cfuTx, } expectedRetainedQuote := retainedPeginQuote expectedRetainedQuote.State = quote.PeginStateRegisterPegInSucceeded @@ -48,8 +53,8 @@ func TestRegisterPeginUseCase_Run(t *testing.T) { Quote: testPeginQuote, }).Return(registerPeginTx, nil).Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() eventBus := new(mocks.EventBusMock) @@ -93,8 +98,8 @@ func TestRegisterPeginUseCase_Run_DontPublishRecoverableErrors(t *testing.T) { Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, - UserBtcTxHash: "btc tx hash", - CallForUserTxHash: "cfu tx hash", + UserBtcTxHash: userBtcTx, + CallForUserTxHash: cfuTx, } setups := registerPeginRecoverableErrorSetups() @@ -133,17 +138,17 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin caseQuote.State = quote.PeginStateWaitingForDeposit }, func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, caseQuote.QuoteHash). Return(nil, assert.AnError).Once() }, func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash). Return(blockchain.BitcoinTransactionInformation{}, assert.AnError).Once() }, func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: caseQuote.UserBtcTxHash, @@ -153,7 +158,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin caseQuote.Signature = "malformed signature" }, func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: caseQuote.UserBtcTxHash, @@ -163,7 +168,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin btc.On("GetRawTransaction", caseQuote.UserBtcTxHash).Return([]byte{}, assert.AnError).Once() }, func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: caseQuote.UserBtcTxHash, @@ -174,7 +179,7 @@ func registerPeginRecoverableErrorSetups() []func(caseQuote *quote.RetainedPegin btc.On("GetPartialMerkleTree", caseQuote.UserBtcTxHash).Return([]byte{}, assert.AnError).Once() }, func(caseQuote *quote.RetainedPeginQuote, lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), caseQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, caseQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", caseQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: caseQuote.UserBtcTxHash, @@ -195,13 +200,13 @@ func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, - UserBtcTxHash: "btc tx hash", - CallForUserTxHash: "cfu tx hash", + UserBtcTxHash: userBtcTx, + CallForUserTxHash: cfuTx, } quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(nil, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(nil, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { expected := retainedPeginQuote expected.State = quote.PeginStateRegisterPegInFailed return assert.Equal(t, expected, q) @@ -242,15 +247,14 @@ func TestRegisterPeginUseCase_Run_QuoteNotFound(t *testing.T) { } func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { - registerPeginTx := "register tx hash" retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, - UserBtcTxHash: "btc tx hash", - CallForUserTxHash: "cfu tx hash", + UserBtcTxHash: userBtcTx, + CallForUserTxHash: cfuTx, } expectedRetainedQuote := retainedPeginQuote expectedRetainedQuote.State = quote.PeginStateRegisterPegInFailed @@ -266,8 +270,8 @@ func TestRegisterPeginUseCase_Run_RegisterPeginFailed(t *testing.T) { }).Return(registerPeginTx, assert.AnError).Once() quoteRepository := new(mocks.PeginQuoteRepositoryMock) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash).Return(&testPeginQuote, nil).Once() + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { return assert.Equal(t, expectedRetainedQuote, q) })).Return(nil).Once() eventBus := new(mocks.EventBusMock) @@ -311,8 +315,8 @@ func TestRegisterPeginUseCase_Run_NotEnoughConfirmations(t *testing.T) { Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, - UserBtcTxHash: "btc tx hash", - CallForUserTxHash: "cfu tx hash", + UserBtcTxHash: userBtcTx, + CallForUserTxHash: cfuTx, } setups := registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote) @@ -357,7 +361,7 @@ func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.Retained { description: "Should fail when tx has less confirmations than required from bridge", setup: func(lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: retainedPeginQuote.UserBtcTxHash, @@ -370,7 +374,7 @@ func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.Retained { description: "Should fail when confirmations weren't processed from RSK bridge yet", setup: func(lbc *mocks.LbcMock, quoteRepository *mocks.PeginQuoteRepositoryMock, btc *mocks.BtcRpcMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() btc.On("GetTransactionInfo", retainedPeginQuote.UserBtcTxHash).Return(blockchain.BitcoinTransactionInformation{ Hash: retainedPeginQuote.UserBtcTxHash, @@ -386,7 +390,7 @@ func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.Retained PartialMerkleTree: pmtMock, BlockHeight: btcBlockInfoMock.Height, Quote: testPeginQuote, - }).Return("register tx hash", fmt.Errorf("some wrapper: %w", blockchain.WaitingForBridgeError)).Once() + }).Return(registerPeginTx, fmt.Errorf("some wrapper: %w", blockchain.WaitingForBridgeError)).Once() }, err: blockchain.WaitingForBridgeError, }, @@ -394,15 +398,14 @@ func registerPeginNotEnoughConfirmationsSetups(retainedPeginQuote quote.Retained } func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { - registerPeginTx := "register tx hash" retainedPeginQuote := quote.RetainedPeginQuote{ QuoteHash: "101b1c", DepositAddress: test.AnyAddress, Signature: "0102031f1b", RequiredLiquidity: entities.NewWei(1500), State: quote.PeginStateCallForUserSucceeded, - UserBtcTxHash: "btc tx hash", - CallForUserTxHash: "cfu tx hash", + UserBtcTxHash: userBtcTx, + CallForUserTxHash: cfuTx, } setups := registerPeginUpdateErrorSetups(t, registerPeginTx, retainedPeginQuote) @@ -452,9 +455,9 @@ func TestRegisterPeginUseCase_Run_UpdateError(t *testing.T) { func registerPeginUpdateErrorSetups(t *testing.T, registerPeginTx string, retainedPeginQuote quote.RetainedPeginQuote) []func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock) { return []func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock){ func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(nil, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { expected := retainedPeginQuote expected.State = quote.PeginStateRegisterPegInFailed return assert.Equal(t, expected, q) @@ -468,9 +471,9 @@ func registerPeginUpdateErrorSetups(t *testing.T, registerPeginTx string, retain })).Return().Once() }, func(quoteRepository *mocks.PeginQuoteRepositoryMock, eventBus *mocks.EventBusMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), retainedPeginQuote.QuoteHash). + quoteRepository.On("GetQuote", test.AnyCtx, retainedPeginQuote.QuoteHash). Return(&testPeginQuote, nil).Once() - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPeginQuote) bool { expected := retainedPeginQuote expected.State = quote.PeginStateRegisterPegInSucceeded expected.RegisterPeginTxHash = registerPeginTx diff --git a/internal/usecases/pegout/accept_pegout_quote_test.go b/internal/usecases/pegout/accept_pegout_quote_test.go index 433af67d..005c6d64 100644 --- a/internal/usecases/pegout/accept_pegout_quote_test.go +++ b/internal/usecases/pegout/accept_pegout_quote_test.go @@ -50,13 +50,13 @@ func TestAcceptQuoteUseCase_Run(t *testing.T) { State: quote.PegoutStateWaitingForDeposit, } quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) - quoteRepositoryMock.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), retainedQuote).Return(nil).Once() - quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() - quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + quoteRepositoryMock.On("InsertRetainedQuote", test.AnyCtx, retainedQuote).Return(nil).Once() + quoteRepositoryMock.On("GetQuote", test.AnyCtx, quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return("0xabcd01").Once() lp := new(mocks.ProviderMock) - lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("HasPegoutLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() eventBus := new(mocks.EventBusMock) eventBus.On("Publish", mock.MatchedBy(func(event quote.AcceptedPegoutQuoteEvent) bool { @@ -112,8 +112,8 @@ func TestAcceptQuoteUseCase_Run_AlreadyAcceptedQuote(t *testing.T) { State: quote.PegoutStateWaitingForDeposit, } quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) - quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() - quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(&retainedQuote, nil).Once() + quoteRepositoryMock.On("GetQuote", test.AnyCtx, quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(&retainedQuote, nil).Once() lbc := new(mocks.LbcMock) lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) @@ -160,7 +160,7 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { ProductFeeAmount: 1, } quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) - quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetQuote", test.AnyCtx, quoteHash).Return("eMock, nil).Once() lbc := new(mocks.LbcMock) lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) @@ -183,7 +183,7 @@ func TestAcceptQuoteUseCase_Run_ExpiredQuote(t *testing.T) { func TestAcceptQuoteUseCase_Run_QuoteNotFound(t *testing.T) { quoteHash := "0x654321" quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) - quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + quoteRepositoryMock.On("GetQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() lbc := new(mocks.LbcMock) lp := new(mocks.ProviderMock) eventBus := new(mocks.EventBusMock) @@ -228,11 +228,11 @@ func TestAcceptQuoteUseCase_Run_NoLiquidity(t *testing.T) { ProductFeeAmount: 8, } quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) - quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() - quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + quoteRepositoryMock.On("GetQuote", test.AnyCtx, quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() lbc := new(mocks.LbcMock) lp := new(mocks.ProviderMock) - lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), entities.NewWei(65)).Return(usecases.NoLiquidityError).Once() + lp.On("HasPegoutLiquidity", test.AnyCtx, entities.NewWei(65)).Return(usecases.NoLiquidityError).Once() eventBus := new(mocks.EventBusMock) mutex := new(mocks.MutexMock) mutex.On("Lock").Once() @@ -316,39 +316,39 @@ func acceptQuoteUseCaseUnexpectedErrorSetups(quoteMock *quote.PegoutQuote, quote return test.Table[func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock), error]{ { Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(nil, assert.AnError).Once() }, }, { Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(quoteMock, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything).Return(quoteMock, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, mock.Anything). Return(nil, assert.AnError).Once() }, }, { Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + quoteRepository.On("GetQuote", test.AnyCtx, quoteHash).Return(quoteMock, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() + lp.On("HasPegoutLiquidity", test.AnyCtx, mock.Anything).Return(assert.AnError).Once() }, }, { Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, quoteHash).Return(quoteMock, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() + lp.On("HasPegoutLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return("", assert.AnError).Once() }, }, { Value: func(quoteRepository *mocks.PegoutQuoteRepositoryMock, lp *mocks.ProviderMock) { - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(quoteMock, nil).Once() - quoteRepository.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() - lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + quoteRepository.On("GetQuote", test.AnyCtx, quoteHash).Return(quoteMock, nil).Once() + quoteRepository.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() + lp.On("HasPegoutLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() - quoteRepository.On("InsertRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError).Once() + quoteRepository.On("InsertRetainedQuote", test.AnyCtx, mock.Anything).Return(assert.AnError).Once() }, }, } @@ -383,7 +383,7 @@ func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) lbc := new(mocks.LbcMock) lbc.On("GetAddress").Return("") lp := new(mocks.ProviderMock) - lp.On("HasPegoutLiquidity", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil).Once() + lp.On("HasPegoutLiquidity", test.AnyCtx, mock.Anything).Return(nil).Once() lp.On("SignQuote", mock.Anything).Return(signature, nil).Once() eventBus := new(mocks.EventBusMock) eventBus.On("Publish").Once() @@ -391,8 +391,8 @@ func TestInitPegoutDepositCacheUseCase_Run_RetainedQuoteValidation(t *testing.T) mutex.On("Lock").Once() mutex.On("Unlock").Once() quoteRepositoryMock := new(mocks.PegoutQuoteRepositoryMock) - quoteRepositoryMock.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return("eMock, nil).Once() - quoteRepositoryMock.On("GetRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), quoteHash).Return(nil, nil).Once() + quoteRepositoryMock.On("GetQuote", test.AnyCtx, quoteHash).Return("eMock, nil).Once() + quoteRepositoryMock.On("GetRetainedQuote", test.AnyCtx, quoteHash).Return(nil, nil).Once() contracts := blockchain.RskContracts{Lbc: lbc} useCase := pegout.NewAcceptQuoteUseCase(quoteRepositoryMock, contracts, lp, lp, eventBus, mutex) result, err := useCase.Run(context.Background(), quoteHash) diff --git a/internal/usecases/pegout/get_pegout_quote_test.go b/internal/usecases/pegout/get_pegout_quote_test.go index 6d579777..540b90d1 100644 --- a/internal/usecases/pegout/get_pegout_quote_test.go +++ b/internal/usecases/pegout/get_pegout_quote_test.go @@ -18,8 +18,8 @@ import ( func TestGetQuoteUseCase_Run(t *testing.T) { rsk := new(mocks.RootstockRpcServerMock) - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) feeCollector := new(mocks.FeeCollectorMock) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge := new(mocks.BridgeMock) @@ -28,7 +28,7 @@ func TestGetQuoteUseCase_Run(t *testing.T) { lbc.On("GetAddress").Return("0x1234") lbc.On("HashPegoutQuote", mock.Anything).Return("0x9876543210", nil) pegoutQuoteRepository := new(mocks.PegoutQuoteRepositoryMock) - pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + pegoutQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(nil) lp := new(mocks.ProviderMock) lp.On("PegoutConfiguration", test.AnyCtx).Return(getPegoutConfiguration()) lp.On("GeneralConfiguration", test.AnyCtx).Return(getGeneralConfiguration()) @@ -199,7 +199,7 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(0), assert.AnError) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(0), assert.AnError) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) }, @@ -221,8 +221,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(0), assert.AnError) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(0), assert.AnError) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) }, @@ -230,8 +230,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), assert.AnError) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) }, @@ -239,8 +239,8 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(0), assert.AnError) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) @@ -249,26 +249,26 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) lbc.On("GetAddress").Return("0x1234") lbc.On("HashPegoutQuote", mock.Anything).Return("0x9876543210", nil) - pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(assert.AnError) + pegoutQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(assert.AnError) btcWallet.On("EstimateTxFees", mock.Anything, mock.Anything).Return(entities.NewWei(1000), nil) }, }, { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) lbc.On("GetAddress").Return("0x1234") lbc.On("HashPegoutQuote", mock.Anything).Return("", assert.AnError) - pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + pegoutQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(nil) lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) @@ -284,13 +284,13 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) feeCollector.On("DaoFeePercentage").Return(uint64(0), nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) lbc.On("GetAddress").Return("0x1234") lbc.On("HashPegoutQuote", mock.Anything).Return("0x2134", nil) - pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + pegoutQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(nil) lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(0)) lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(0)) @@ -306,15 +306,15 @@ func getQuoteUseCaseUnexpectedErrorSetups() test.Table[func( { Value: func(rsk *mocks.RootstockRpcServerMock, feeCollector *mocks.FeeCollectorMock, bridge *mocks.BridgeMock, lbc *mocks.LbcMock, lp *mocks.ProviderMock, btcWallet *mocks.BtcWalletMock, pegoutQuoteRepository *mocks.PegoutQuoteRepositoryMock) { - rsk.On("GasPrice", mock.AnythingOfType("context.backgroundCtx")).Return(entities.NewWei(50000000), nil) - rsk.On("GetHeight", mock.AnythingOfType("context.backgroundCtx")).Return(uint64(100), nil) + rsk.On("GasPrice", test.AnyCtx).Return(entities.NewWei(50000000), nil) + rsk.On("GetHeight", test.AnyCtx).Return(uint64(100), nil) rsk.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(entities.NewWei(0), assert.AnError) feeCollector.On("DaoFeePercentage").Return(uint64(12), nil) bridge.On("GetMinimumLockTxValue").Return(entities.NewWei(1000000), nil) lbc.On("GetAddress").Return("0x1234") lbc.On("HashPegoutQuote", mock.Anything).Return("0x4321", nil) - pegoutQuoteRepository.On("InsertQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything, mock.Anything).Return(nil) + pegoutQuoteRepository.On("InsertQuote", test.AnyCtx, mock.Anything, mock.Anything).Return(nil) lp.On("ValidateAmountForPegout", mock.Anything).Return(nil) lp.On("GetRootstockConfirmationsForValue", mock.Anything).Return(uint16(10)) lp.On("GetBitcoinConfirmationsForValue", mock.Anything, mock.Anything).Return(uint16(10)) diff --git a/internal/usecases/watcher/clean_exipred_test.go b/internal/usecases/watcher/clean_exipred_test.go index 7f455a10..ea91b5b4 100644 --- a/internal/usecases/watcher/clean_exipred_test.go +++ b/internal/usecases/watcher/clean_exipred_test.go @@ -51,7 +51,7 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { ).Return([]quote.RetainedPegoutQuote{pegoutExpiredQuotes[2], pegoutExpiredQuotes[4], pegoutExpiredQuotes[5]}, nil) pegoutRepository.On( "DeleteQuotes", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, []string{"pegoutHash3", "pegoutHash5", "pegoutHash6"}, ).Return(uint(3), nil) @@ -68,31 +68,31 @@ func TestCleanExpiredQuotesUseCase_Run(t *testing.T) { func TestCleanExpiredQuotesUseCase_Run_ErrorHandling(t *testing.T) { setups := []func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock){ func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { - peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + peginRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(nil, assert.AnError) }, func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { - peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + peginRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedQuotes, nil) - pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + pegoutRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(nil, assert.AnError) }, func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { - peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + peginRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedQuotes, nil) - pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + pegoutRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedPegoutQuotes, nil) - peginRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + peginRepository.On("DeleteQuotes", test.AnyCtx, mock.Anything). Return(uint(0), assert.AnError) }, func(peginRepository *mocks.PeginQuoteRepositoryMock, pegoutRepository *mocks.PegoutQuoteRepositoryMock) { - peginRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + peginRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedQuotes, nil) - pegoutRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + pegoutRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedPegoutQuotes, nil) - peginRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + peginRepository.On("DeleteQuotes", test.AnyCtx, mock.Anything). Return(uint(5), nil) - pegoutRepository.On("DeleteQuotes", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + pegoutRepository.On("DeleteQuotes", test.AnyCtx, mock.Anything). Return(uint(0), assert.AnError) }, } diff --git a/internal/usecases/watcher/get_watched_pegin_quote_test.go b/internal/usecases/watcher/get_watched_pegin_quote_test.go index 6e9dbe63..e3f54a1e 100644 --- a/internal/usecases/watcher/get_watched_pegin_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegin_quote_test.go @@ -131,13 +131,13 @@ func TestGetWatchedPeginQuoteUseCase_Run_WrongState(t *testing.T) { func TestGetWatchedPeginQuoteUseCase_Run_ErrorHandling(t *testing.T) { setups := []func(quoteRepository *mocks.PeginQuoteRepositoryMock){ func(quoteRepository *mocks.PeginQuoteRepositoryMock) { - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(nil, assert.AnError) }, func(quoteRepository *mocks.PeginQuoteRepositoryMock) { - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedQuotes, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(nil, assert.AnError) }, } diff --git a/internal/usecases/watcher/get_watched_pegout_quote_test.go b/internal/usecases/watcher/get_watched_pegout_quote_test.go index f9b5f138..ea37dc01 100644 --- a/internal/usecases/watcher/get_watched_pegout_quote_test.go +++ b/internal/usecases/watcher/get_watched_pegout_quote_test.go @@ -116,13 +116,13 @@ func TestGetWatchedPegoutQuoteUseCase_Run_WrongState(t *testing.T) { func TestGetWatchedPegoutQuoteUseCase_Run_ErrorHandling(t *testing.T) { setups := []func(quoteRepository *mocks.PegoutQuoteRepositoryMock){ func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(nil, assert.AnError) }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("GetRetainedQuoteByState", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetRetainedQuoteByState", test.AnyCtx, mock.Anything). Return(retainedPegoutQuotes, nil) - quoteRepository.On("GetQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything). + quoteRepository.On("GetQuote", test.AnyCtx, mock.Anything). Return(nil, assert.AnError) }, } diff --git a/internal/usecases/watcher/update_pegout_deposit_test.go b/internal/usecases/watcher/update_pegout_deposit_test.go index 00a23a64..afb7bdf4 100644 --- a/internal/usecases/watcher/update_pegout_deposit_test.go +++ b/internal/usecases/watcher/update_pegout_deposit_test.go @@ -16,7 +16,10 @@ import ( "time" ) -var now = uint32(time.Now().Unix()) +var ( + now = uint32(time.Now().Unix()) + userRskTx = "user rsk tx hash" +) var depositedRetainedQuote = quote.RetainedPegoutQuote{ QuoteHash: "02011d", @@ -50,7 +53,7 @@ var depositedPegoutQuote = quote.PegoutQuote{ func TestUpdatePegoutQuoteDepositUseCase_Run(t *testing.T) { deposit := quote.PegoutDeposit{ - TxHash: "user rsk tx hash", + TxHash: userRskTx, QuoteHash: depositedRetainedQuote.QuoteHash, Amount: entities.NewWei(6800), Timestamp: time.Now(), @@ -60,13 +63,13 @@ func TestUpdatePegoutQuoteDepositUseCase_Run(t *testing.T) { quoteReporitory := new(mocks.PegoutQuoteRepositoryMock) quoteReporitory.On( "UpdateRetainedQuote", - mock.AnythingOfType("context.backgroundCtx"), + test.AnyCtx, mock.MatchedBy(func(q quote.RetainedPegoutQuote) bool { return q.UserRskTxHash == deposit.TxHash && q.State == quote.PegoutStateWaitingForDepositConfirmations }), ).Return(nil) - quoteReporitory.On("UpsertPegoutDeposit", mock.AnythingOfType("context.backgroundCtx"), deposit).Return(nil) + quoteReporitory.On("UpsertPegoutDeposit", test.AnyCtx, deposit).Return(nil) useCase := watcher.NewUpdatePegoutQuoteDepositUseCase(quoteReporitory) watchedPegoutQuote, err := useCase.Run(context.Background(), quote.NewWatchedPegoutQuote(depositedPegoutQuote, depositedRetainedQuote), deposit) quoteReporitory.AssertExpectations(t) @@ -83,7 +86,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { { name: "Should fail by value", deposit: quote.PegoutDeposit{ - TxHash: "user rsk tx hash", + TxHash: userRskTx, QuoteHash: depositedRetainedQuote.QuoteHash, Amount: entities.NewWei(6000), Timestamp: time.Now(), @@ -94,7 +97,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { { name: "Should fail by time", deposit: quote.PegoutDeposit{ - TxHash: "user rsk tx hash", + TxHash: userRskTx, QuoteHash: depositedRetainedQuote.QuoteHash, Amount: entities.NewWei(6500), Timestamp: time.Unix(time.Now().Unix()+660, 0), @@ -105,7 +108,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { { name: "Should fail by confirmations", deposit: quote.PegoutDeposit{ - TxHash: "user rsk tx hash", + TxHash: userRskTx, QuoteHash: depositedRetainedQuote.QuoteHash, Amount: entities.NewWei(6500), Timestamp: time.Now(), @@ -131,7 +134,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_NotValid(t *testing.T) { func TestUpdatePegoutQuoteDepositUseCase_Run_IllegalState(t *testing.T) { deposit := quote.PegoutDeposit{ - TxHash: "user rsk tx hash", + TxHash: userRskTx, QuoteHash: "02011d", Amount: entities.NewWei(6800), Timestamp: time.Now(), @@ -160,7 +163,7 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_IllegalState(t *testing.T) { func TestUpdatePegoutQuoteDepositUseCase_Run_ErrorHandling(t *testing.T) { deposit := quote.PegoutDeposit{ - TxHash: "user rsk tx hash", + TxHash: userRskTx, QuoteHash: depositedRetainedQuote.QuoteHash, Amount: entities.NewWei(6800), Timestamp: time.Now(), @@ -170,11 +173,11 @@ func TestUpdatePegoutQuoteDepositUseCase_Run_ErrorHandling(t *testing.T) { setups := []func(quoteRepository *mocks.PegoutQuoteRepositoryMock){ func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(assert.AnError) }, func(quoteRepository *mocks.PegoutQuoteRepositoryMock) { - quoteRepository.On("UpdateRetainedQuote", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(nil) - quoteRepository.On("UpsertPegoutDeposit", mock.AnythingOfType("context.backgroundCtx"), mock.Anything).Return(assert.AnError) + quoteRepository.On("UpdateRetainedQuote", test.AnyCtx, mock.Anything).Return(nil) + quoteRepository.On("UpsertPegoutDeposit", test.AnyCtx, mock.Anything).Return(assert.AnError) }, } diff --git a/test/utils.go b/test/utils.go index 0355a930..56d800d7 100644 --- a/test/utils.go +++ b/test/utils.go @@ -18,11 +18,16 @@ import ( "time" ) -var AnyCtx = mock.AnythingOfType("context.backgroundCtx") +var ( + AnyCtx = mock.AnythingOfType("context.backgroundCtx") + AnyWei = mock.AnythingOfType("*entities.Wei") +) const ( AnyAddress = "any address" AnyString = "any value" + AnyHash = "any hash" + AnyUrl = "url.com" keyPath = "../../docker-compose/localstack/local-key.json" KeyPassword = "test" ) From 5841e47ffb65ea3c3b59c81bc2f2f0e9ed5cc5f6 Mon Sep 17 00:00:00 2001 From: Dominik Z Date: Fri, 31 May 2024 12:15:47 +0300 Subject: [PATCH 099/113] fix: GBI-1764 comments --- .../entrypoints/rest/assets/management.html | 51 +- .../entrypoints/rest/assets/static/decimal.js | 2014 +++++++++++++++++ .../rest/assets/static/questionIcon.svg | 4 + .../entrypoints/rest/handlers/management.go | 2 +- 4 files changed, 2057 insertions(+), 14 deletions(-) create mode 100644 internal/adapters/entrypoints/rest/assets/static/decimal.js create mode 100644 internal/adapters/entrypoints/rest/assets/static/questionIcon.svg diff --git a/internal/adapters/entrypoints/rest/assets/management.html b/internal/adapters/entrypoints/rest/assets/management.html index 148d6152..d02a6a02 100644 --- a/internal/adapters/entrypoints/rest/assets/management.html +++ b/internal/adapters/entrypoints/rest/assets/management.html @@ -42,6 +42,17 @@ border-width: 5px; border-style: solid; border-color: #333 transparent transparent transparent; } .nav{ margin-bottom: 1rem; } + .loading-bar { + display: none; + height: 2px; + background-color: #007bff; + animation: loading 1s infinite; + } + @keyframes loading { + 0% { width: 0%; } + 50% { width: 50%; } + 100% { width: 100%; } + } @@ -85,6 +96,7 @@
Pegin Collateral
+
@@ -98,6 +110,7 @@
Pegout Collateral
+
@@ -151,16 +164,20 @@
Current Configuration
+